#include <stdio.h>
#include <memory.h>
#define BEGIN_HEX 0 /*Предполагаем, что встретили начало записи 16-ричного числа*/
#define HEX 1 /*Подтвердили это*/
#define NUMBER 2 /*В значащей части записи 16-ричного числа*/
#define STRING 3 /*Если аргумент оказался произвольной строкой*/
#define START_PARSING 4
int htoi(char s[]);
int main(void){
int i;
i = htoi("0x9");
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;
else
state == STRING;
else if(s[i] == 'x')
if(state == BEGIN_HEX)
state == HEX;
else
state = STRING;
else if(state == HEX){ /*Разбор 16-ричного числа*/
if((s[i] >= '0' && s[i] <= '9' ) || (s[i] >= 'A' && s[i] <= 'F'))
res = res*16 + (s[i] - '0');
else
state = STRING;
}
i++;
}
}
I2luY2x1ZGUgPHN0ZGlvLmg+CiNpbmNsdWRlIDxtZW1vcnkuaD4KCiNkZWZpbmUgQkVHSU5fSEVYIDAJLyrQn9GA0LXQtNC/0L7Qu9Cw0LPQsNC10LwsINGH0YLQviDQstGB0YLRgNC10YLQuNC70Lgg0L3QsNGH0LDQu9C+INC30LDQv9C40YHQuCAxNi3RgNC40YfQvdC+0LPQviDRh9C40YHQu9CwKi8KI2RlZmluZSBIRVggMQkJLyrQn9C+0LTRgtCy0LXRgNC00LjQu9C4INGN0YLQviovCiNkZWZpbmUgTlVNQkVSIDIJLyrQkiDQt9C90LDRh9Cw0YnQtdC5INGH0LDRgdGC0Lgg0LfQsNC/0LjRgdC4IDE2LdGA0LjRh9C90L7Qs9C+INGH0LjRgdC70LAqLwojZGVmaW5lIFNUUklORyAzCS8q0JXRgdC70Lgg0LDRgNCz0YPQvNC10L3RgiDQvtC60LDQt9Cw0LvRgdGPINC/0YDQvtC40LfQstC+0LvRjNC90L7QuSDRgdGC0YDQvtC60L7QuSovCiNkZWZpbmUgU1RBUlRfUEFSU0lORyA0CgppbnQgaHRvaShjaGFyIHNbXSk7CgppbnQgbWFpbih2b2lkKXsKCWludCBpOwoJCglpID0gaHRvaSgiMHg5Iik7CglwcmludGYoIiVkXG4iLCBpKTsKCXJldHVybiAwOwp9CgppbnQgaHRvaShjaGFyIHNbXSl7CglpbnQgcmVzOwoJaW50IGk7CglpbnQgc3RhdGU7CgkKCWkgPSByZXMgPSAwOwoJc3RhdGUgPSBTVEFSVF9QQVJTSU5HOwoJd2hpbGUoc1tpXSAhPSAnXDAnKXsKCQlpZihzW2ldID09ICcwJykKCQkJaWYoc3RhdGUgPT0gU1RBUlRfUEFSU0lORykKCQkJCXN0YXRlID09IEJFR0lOX0hFWDsKCQkJZWxzZQoJCQkJc3RhdGUgPT0gU1RSSU5HOwoJCWVsc2UgaWYoc1tpXSA9PSAneCcpCgkJCWlmKHN0YXRlID09IEJFR0lOX0hFWCkKCQkJCXN0YXRlID09IEhFWDsKCQkJZWxzZQoJCQkJc3RhdGUgPSBTVFJJTkc7CgkJZWxzZSBpZihzdGF0ZSA9PSBIRVgpewkvKtCg0LDQt9Cx0L7RgCAxNi3RgNC40YfQvdC+0LPQviDRh9C40YHQu9CwKi8KCQkJaWYoKHNbaV0gPj0gJzAnICYmIHNbaV0gPD0gJzknICkgfHwgKHNbaV0gPj0gJ0EnICYmIHNbaV0gPD0gJ0YnKSkKCQkJCXJlcyA9IHJlcyoxNiArIChzW2ldIC0gJzAnKTsKCQkJZWxzZQoJCQkJc3RhdGUgPSBTVFJJTkc7CgkJfQoJCWkrKzsJCgl9Cn0=