#include <stdio.h>
#include <memory.h>

#define BEGIN_HEX 0	/*Íà÷àëî çàïèñè 16-ðè÷íîãî ÷èñëà*/
#define HEX 1		/*Òî÷íî èçâåñòíî, ÷òî ýòî 16-ðè÷íîå ÷èñëî*/
#define NUMBER 2	/*Â çíà÷àùåé ÷àñòè 16-ðè÷íîãî ÷èñëà*/
#define STRING 3	/*Åñëè ïåðåäàíî íå ÷èñëî, à ëþáàÿ ñòðîêà*/
#define START_PARSING 4

int htoi(char s[]);

int main(void){
	int i;
	
	/*0x1F = 31*/
	i = htoi("0x1f");
	printf("%d\n", i);
	return 0;
}

int htoi(char s[]){
	int res;
	int i;
	int state;
	
	i = res = 0;
	state = START_PARSING;
	while(s[i] != '\0'){
		if(s[i] == '0')
			if(state == START_PARSING)
				{state = BEGIN_HEX; printf("state = BEGIN_HEX\n");}
			else
				{state == STRING; printf("state = STRING1\n"); }
		else if(s[i] == 'x')
			if(state == BEGIN_HEX)
				{state = HEX; printf("state = HEX\n");}
			else
				{state = STRING; printf("state = STRING2\n");}
		else if(state == HEX){	/*Íà÷èíàåì ðàçáîð 16-ðè÷íîãî ÷èñëà*/
			if((s[i] >= '0' && s[i] <= '9' ) || (s[i] >= 'a' && s[i] <= 'f')){
				res = res*16 + (s[i] - '0');
				printf("s[i] = %d\n", s[i]);
				printf("s[i] - 0 = %d\n", s[i] - '0');
			}else{
				state = STRING;
				printf("state = STRING");
			}
		}
		i++;	
	}
	
	return res;
}