#include <string.h>

#include <stdio.h>

#include "common.h"

/* Codigo traduzido a partir do original em python de
 * http://aspn.activestate.com/ASPN/Cookbook/Python/Recipe/117226 */


unsigned int skiplist[ALPHABET_SIZE];
unsigned char *pattern;
size_t pattern_len;


void bmh_preprocess_pattern(const unsigned char* pat)
{
	int i = 0;

	pattern = strcpy_alloc(&pattern,pat);
	
        pattern_len  = strlen(pattern);
	for (i = 0; i < ALPHABET_SIZE; i++){
		skiplist[i] = pattern_len;
	}
	for (i = 0; i < pattern_len -1 ; ++i){
		skiplist[pattern[i]] = pattern_len  -i -1;
	}
}

int bmh_find(const unsigned char* text, unsigned int blah)
{
	int text_len = 0;
	int i = 0;
	int j = 0;
	int k = 0;
	
        text_len = strlen(text);
        if (pattern_len > text_len){
		return ERROR;
	}
	
        i = pattern_len - 1;
	while (i < text_len){
		k = i;
		j = pattern_len - 1;
		while ((j >= 0) && (text[k] == pattern[j])){
			--j;
			--k;
		}
		if (j == -1){
			return k + 1; /* Posição do cursor em texto */
		}
		i += skiplist[text[i]];
	}
	return NOT_FOUND;
}
