📄 etc_uty.cpp
字号:
/*
* 数値なら長さを返す。
* 10進数の整数または小数。16進数(正数)。
* 文字列 数値(色分け)
* ---------------------
* 123 123
* 0123 0123
* 0xfedc 0xfedc
* -123 -123
* &H9a &H9a (ただしソース中の#ifを有効にしたとき)
* -0x89a 0x89a
* 0.5 0.5
* 0.56.1 0.56 , 1 (ただしソース中の#ifを有効にしたら"0.56.1"になる)
* .5 5 (ただしソース中の#ifを有効にしたら".5"になる)
* -.5 5 (ただしソース中の#ifを有効にしたら"-.5"になる)
* 123. 123
* 0x567.8 0x567 , 8
*/
/*
* 半角数値
* 1, 1.2, 1.2.3, .1, 0xabc, 1L, 1F, 1.2f, 0x1L, 0x2F, -.1, -1, 1e2, 1.2e+3, 1.2e-3, -1e0
* 10進数, 16進数, LF接尾語, 浮動小数点数, 負符号
* IPアドレスのドット連結(本当は数値じゃないんだよね)
*/
int IsNumber(const char *buf, int offset, int length)
{
register const char *p, *q;
register int i = 0;
register int d = 0;
register int f = 0;
p = &buf[offset];
q = &buf[length];
if( *p == '0' ) /* 10進数,Cの16進数 */
{
p++; i++;
if( ( p < q ) && ( *p == 'x' ) ) /* Cの16進数 */
{
p++; i++;
while( p < q )
{
if( ( *p >= '0' && *p <= '9' )
|| ( *p >= 'A' && *p <= 'F' )
|| ( *p >= 'a' && *p <= 'f' ) )
{
p++; i++;
}
else
{
break;
}
}
/* "0x" なら "0" だけが数値 */
if( i == 2 ) return 1;
/* 接尾語 */
if( p < q )
{
if( *p == 'L' || *p == 'l' || *p == 'F' || *p == 'f' )
{
p++; i++;
}
}
return i;
}
else if( *p >= '0' && *p <= '9' )
{
p++; i++;
while( p < q )
{
if( *p < '0' || *p > '9' )
{
if( *p == '.' )
{
if( f == 1 ) break; /* 指数部に入っている */
d++;
if( d > 1 )
{
if( *(p - 1) == '.' ) break; /* "." が連続なら中断 */
}
}
else if( *p == 'E' || *p == 'e' )
{
if( f == 1 ) break; /* 指数部に入っている */
if( p + 2 < q )
{
if( ( *(p + 1) == '+' || *(p + 1) == '-' )
&& ( *(p + 2) >= '0' && *(p + 2) <= '9' ) )
{
p++; i++;
p++; i++;
f = 1;
}
else if( *(p + 1) >= '0' && *(p + 1) <= '9' )
{
p++; i++;
f = 1;
}
else
{
break;
}
}
else if( p + 1 < q )
{
if( *(p + 1) >= '0' && *(p + 1) <= '9' )
{
p++; i++;
f = 1;
}
else
{
break;
}
}
else
{
break;
}
}
else
{
break;
}
}
p++; i++;
}
if( *(p - 1) == '.' ) return i - 1; /* 最後が "." なら含めない */
/* 接尾語 */
if( p < q )
{
if( (( d == 0 ) && ( *p == 'L' || *p == 'l' ))
|| *p == 'F' || *p == 'f' )
{
p++; i++;
}
}
return i;
}
else if( *p == '.' )
{
while( p < q )
{
if( *p < '0' || *p > '9' )
{
if( *p == '.' )
{
if( f == 1 ) break; /* 指数部に入っている */
d++;
if( d > 1 )
{
if( *(p - 1) == '.' ) break; /* "." が連続なら中断 */
}
}
else if( *p == 'E' || *p == 'e' )
{
if( f == 1 ) break; /* 指数部に入っている */
if( p + 2 < q )
{
if( ( *(p + 1) == '+' || *(p + 1) == '-' )
&& ( *(p + 2) >= '0' && *(p + 2) <= '9' ) )
{
p++; i++;
p++; i++;
f = 1;
}
else if( *(p + 1) >= '0' && *(p + 1) <= '9' )
{
p++; i++;
f = 1;
}
else
{
break;
}
}
else if( p + 1 < q )
{
if( *(p + 1) >= '0' && *(p + 1) <= '9' )
{
p++; i++;
f = 1;
}
else
{
break;
}
}
else
{
break;
}
}
else
{
break;
}
}
p++; i++;
}
if( *(p - 1) == '.' ) return i - 1; /* 最後が "." なら含めない */
/* 接尾語 */
if( p < q )
{
if( *p == 'F' || *p == 'f' )
{
p++; i++;
}
}
return i;
}
else if( *p == 'E' || *p == 'e' )
{
p++; i++;
while( p < q )
{
if( *p < '0' || *p > '9' )
{
if( ( *p == '+' || *p == '-' ) && ( *(p - 1) == 'E' || *(p - 1) == 'e' ) )
{
if( p + 1 < q )
{
if( *(p + 1) < '0' || *(p + 1) > '9' )
{
/* "0E+", "0E-" */
break;
}
}
else
{
/* "0E-", "0E+" */
break;
}
}
else
{
break;
}
}
p++; i++;
}
if( i == 2 ) return 1; /* "0E", 0e" なら "0" が数値 */
/* 接尾語 */
if( p < q )
{
if( (( d == 0 ) && ( *p == 'L' || *p == 'l' ))
|| *p == 'F' || *p == 'f' )
{
p++; i++;
}
}
return i;
}
else
{
/* "0" だけが数値 */
/*if( *p == '.' ) return i - 1;*/ /* 最後が "." なら含めない */
if( p < q )
{
if( (( d == 0 ) && ( *p == 'L' || *p == 'l' ))
|| *p == 'F' || *p == 'f' )
{
p++; i++;
}
}
return i;
}
}
else if( *p >= '1' && *p <= '9' ) /* 10進数 */
{
p++; i++;
while( p < q )
{
if( *p < '0' || *p > '9' )
{
if( *p == '.' )
{
if( f == 1 ) break; /* 指数部に入っている */
d++;
if( d > 1 )
{
if( *(p - 1) == '.' ) break; /* "." が連続なら中断 */
}
}
else if( *p == 'E' || *p == 'e' )
{
if( f == 1 ) break; /* 指数部に入っている */
if( p + 2 < q )
{
if( ( *(p + 1) == '+' || *(p + 1) == '-' )
&& ( *(p + 2) >= '0' && *(p + 2) <= '9' ) )
{
p++; i++;
p++; i++;
f = 1;
}
else if( *(p + 1) >= '0' && *(p + 1) <= '9' )
{
p++; i++;
f = 1;
}
else
{
break;
}
}
else if( p + 1 < q )
{
if( *(p + 1) >= '0' && *(p + 1) <= '9' )
{
p++; i++;
f = 1;
}
else
{
break;
}
}
else
{
break;
}
}
else
{
break;
}
}
p++; i++;
}
if( *(p - 1) == '.' ) return i - 1; /* 最後が "." なら含めない */
/* 接尾語 */
if( p < q )
{
if( (( d == 0 ) && ( *p == 'L' || *p == 'l' ))
|| *p == 'F' || *p == 'f' )
{
p++; i++;
}
}
return i;
}
else if( *p == '-' ) /* マイナス */
{
p++; i++;
while( p < q )
{
if( *p < '0' || *p > '9' )
{
if( *p == '.' )
{
if( f == 1 ) break; /* 指数部に入っている */
d++;
if( d > 1 )
{
if( *(p - 1) == '.' ) break; /* "." が連続なら中断 */
}
}
else if( *p == 'E' || *p == 'e' )
{
if( f == 1 ) break; /* 指数部に入っている */
if( p + 2 < q )
{
if( ( *(p + 1) == '+' || *(p + 1) == '-' )
&& ( *(p + 2) >= '0' && *(p + 2) <= '9' ) )
{
p++; i++;
p++; i++;
f = 1;
}
else if( *(p + 1) >= '0' && *(p + 1) <= '9' )
{
p++; i++;
f = 1;
}
else
{
break;
}
}
else if( p + 1 < q )
{
if( *(p + 1) >= '0' && *(p + 1) <= '9' )
{
p++; i++;
f = 1;
}
else
{
break;
}
}
else
{
break;
}
}
else
{
break;
}
}
p++; i++;
}
/* "-", "-." だけなら数値でない */
//@@@ 2001.11.09 start MIK
//if( i <= 2 ) return 0;
//if( *(p - 1) == '.' ) return i - 1; /* 最後が "." なら含めない */
if( i == 1 ) return 0;
if( *(p - 1) == '.' )
{
i--;
if( i == 1 ) return 0;
return i;
} //@@@ 2001.11.09 end MIK
/* 接尾語 */
if( p < q )
{
if( (( d == 0 ) && ( *p == 'L' || *p == 'l' ))
|| *p == 'F' || *p == 'f' )
{
p++; i++;
}
}
return i;
}
else if( *p == '.' ) /* 小数点 */
{
d++;
p++; i++;
while( p < q )
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -