#include "defines.h"
#include "acdata.h"

int atoi3(unchar *str,int *num,int mode)
{
	return(atoi3s(&str,num,mode));
}

int atoi3s(unchar *(*str0),int *num,int mode)
/* ２／８／１０／１６進数文字列を数値に直す
   1234:10進数 , $ABCD:16進数 , %0101:2進数 , @137:8進数 , #〜/'〜':文字コード
   mode
   	BIT0 : 0=通常 , 1="〜"／,〜付きモード
        BIT14: 0=8進数あり , 1=なし
        BIT15: 0=#〜  , 1='〜'
   return
   	 0=正常
   	-1=数値がない
   	-2=数値の途中におかしな文字がある
   	-3='〜'が閉じていない
*/
{
int ret,minus=0;
unint base=10;
unchar *str=*str0;
	ret=*str; /* １文字目 */
	if (ret=='-') { /* 符号がある時 */
		minus=1;
		ret=*(++str); /* 次の文字が数値１文字目になる */
	}
	switch (ret) {
		case '\'': /* 文字コード */
			if (!(mode&BIT15)) break;
			mode&=(~BIT15);
		case '#': /* 文字コード */
			if (mode&BIT15) break;
			*num=*(++str);
			if (check_kanji1(*num)) { /* ２バイト文字 */
				if (*(++str)==0) {ret=-1; break;} /* ２バイト目がない */
				*num=((*num)<<8)|*str;
			}
			if (ret=='\'') { /* 'で始まる時は'で括る必要がある */
				if (*(++str)!='\'') {ret=-3; break;} /* 括られていない */
			}
			ret=0;
			break;
		case '$': /* １６進数 */
			base=16;
			goto A1;
		case '%': /* ２進数 */
			base=2;
			goto A1;
		case '@': /* ８進数 */
			if (mode&BIT14) break;
			base=8;
		    A1:	str++; /* 進数指定文字を飛ばす */
			if (*str==0) { /* 指定文字だけあって本体がない */
		case 0: /* 数値がないとき */
				*num=0; /* 数値としては仮に０を返す */
				ret=-1; /* エラー */
				break;
			}
		default:  /* １０進数 */
			/* int=longを想定している */
			ret=atoi3b(str,num,base,mode&BIT0,&str);
	}
	if (ret>=0 && minus) *num=-(*num); /* 正常時のみ符号処理をする */
	*str0=str;
	return(ret);
}
