#include "numbers.h"

/* Cette fonction lit un nombre. Elle va chercher absolument � traduire la cha�ne pass�e en argument en un nombre. Si
ce nombre n'est pas valide, alors l'int valid est mis � faux. Cette fonction reconnais les nombres en d�cimaux, les nombres
en octal pr�fix�s avec 0 et les nombres en hexad�cimal pr�fix�s avec 0x. */

int char_to_number(char *st, int *valid)
{
	int whattype = 0, result = 0;

	*valid = 0;

	if (*st == '0') {
		st++;
		if (*st == 'x') {
			whattype = 1;
			st++;
		} else if (*st) {
			whattype = 2;
		} else {
			*valid = 1;
			return 0;
		}
	}

	while (*st) {
		switch (whattype) {
		case 0:
			if ((*st < '0') || (*st > '9')) {
				return 0;
			}
			result *= 10;
			result += *st - '0';
			break;
		case 1:
			if (((*st < '0') || (*st > '9')) && ((*st < 'A') || (*st > 'F'))
			    && ((*st < 'a') || (*st > 'f'))) {
				return 0;
			}
			result *= 16;
			if ((*st >= '0') && (*st <= '9')) {
				result += *st - '0';
			} else if ((*st >= 'A') && (*st <= 'F')) {
				result += *st - 'A' + 10;
			} else {
				result += *st - 'a' + 10;
			}
			break;
		case 2:
			if ((*st < '0') || (*st > '7')) {
				return 0;
			}
			result *= 8;
			result += *st - '0';
			break;
		}
		st++;
	}

	*valid = 1;
	return result;
}