#include "atoi3b.h"
#include <ctype.h>		// isdigit(),toupper()
#ifdef CORE_DEBUG2
#include <stdio.h>
#endif

// 16進文字を数字に直す
int hval(UByte code)
{
	if (isdigit(code)) return(code-'0');
	code=toupper(code);
	if (code>='A' && code<='F') return(code-'A'+10);
	return(-1); // 16進文字でない時は-1を返す
}

int hex2(UByte *str)
{
	int h=hval(*str++);
	if (h>=0) {
		int h1=h;
		h=hval(*str);
		if (h>=0) {
			h=h1*16+h;
		}
	}
	// h<0なら変換できなかった(変換できない文字があった)
	return (h);
}

// base進数の文字列を整数値に直す：base=2～10,16
// end = 不一致文字位置又はEOS位置を返す
SLong atoi3b(UByte *str,int base,UByte *(*end))
{
SLong num=0;
int c;
	printFunc();
	#ifdef CORE_DEBUG2
	DBG_printName(str,10);
	printf("進数=%d\n",base);
	UByte *bp=str;
	UByte cc=0; // 警告回避のため
	#endif
	while ((c=*str)!=EOS) {
		#ifdef CORE_DEBUG2
		cc=c;
		#endif
		c=toupper(c);
		if (base<=10) {
			c-='0';
		} else { // 16進
			if (isdigit(c)) c-='0';
			else
			if (c>='A' && c<='F') c-=('A'-10);
			else {
				c=-1; // breakさせるため
			}
		}
		if (c<0 || c>=base) { // 変換されなかった文字もここで引っかかる
			// 不一致文字
#ifdef CORE_DEBUG2
			printf("不一致文字:%c[$%02x]\n",(UByte)cc,(UByte)cc);
#endif
			break;
		}
		num=num*base+c;
		str++;
	}
	#ifdef CORE_DEBUG2
	if (c==EOS) {
		printf("EOSで終了\n");
	}
	printf("数値文字列:");
	while (bp<str) fputc(*bp++,stdout);
	fputc('\n',stdout);
	#endif
	
	if (end!=NULL) *end=str; // 不一致文字位置又はEOS位置を返す
	return(num);
}

