#include <stdio.h>
#include <stdlib.h>

int is_digit(char ch)
{
	if ((ch >= '0' && ch <= '9') ||
		(ch >= 'A' && ch <= 'F') ||
		(ch >= 'a' && ch <= 'f'))
		return 1;
	else
		return 0;
}

unsigned char htoi_digit(char ch)
{
	if (ch >= '0' && ch <= '9')
		return ch - '0';
	else if (ch >= 'A' && ch <= 'F')
		return ch - ('A' - 0xA);
	else if (ch >= 'a' && ch <= 'f')
		return ch - ('a' - 0xA);
	else
		abort();
}

unsigned long htoi(char *str)
{
	unsigned long res = 0;
	unsigned long mul = 0x1;
	char *p;

	for (p = str; *p; p++);
	for (p--; is_digit(*p); p--) {
		res += htoi_digit(*p) * mul;
		mul *= 0x10;
	}
	return res;
}

int main(void)
{
	unsigned long i = htoi("0x9FA42D");
	printf("0x%.8lx\n", i);
	return 0;
}
