#include <string.h>

#include "common.h"

unsigned long int masklist[ALPHABET_SIZE];
unsigned char *pattern;
size_t pattern_len;


void shiftand_exato_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++){
		masklist[i] = 0;
	}
	for (i = 0; i < pattern_len; i++){
		masklist[pattern[i]] |= 1<< (pattern_len -1 - i);
	}

}

int shiftand_exato_find(const unsigned char* text, unsigned int blah)
{
	int text_len = 0;
	int i = 0;		/* Posição do cursor  em texto */
	unsigned long int R = 0;/* O registrador... */
	unsigned long int initial_state = 0;	/* Guarda a mascara para o estado inicial */
	
        text_len = strlen(text);
        if (pattern_len > text_len){
		return ERROR;
	}

	initial_state = 1 << (pattern_len -1);
	
	while (i < text_len){
		R=((R>>1)|initial_state) & masklist[text[i]];
		if (R&1){
			return i - (pattern_len - 1);
		}
		i++; 
	}
	return NOT_FOUND;
}
