📄 etc_uty.cpp
字号:
{
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( i == 1 ) return 0;
if( *(p - 1) == '.' ) return i - 1; /* 最後が "." なら含めない */
/* 接尾語 */
if( p < q )
{
if( *p == 'F' || *p == 'f' )
{
p++; i++;
}
}
return i;
}
#if 0
else if( *p == '&' ) /* VBの16進数 */
{
p++; i++;
if( ( p < q ) && ( *p == 'H' ) )
{
p++; i++;
while( p < q )
{
if( ( *p >= '0' && *p <= '9' )
|| ( *p >= 'A' && *p <= 'F' )
|| ( *p >= 'a' && *p <= 'f' ) )
{
p++; i++;
}
else
{
break;
}
}
/* "&H" だけなら数値でない */
if( i == 2 ) i = 0;
return i;
}
/* "&" だけなら数値でない */
return 0;
}
#endif
/* 数値ではない */
return 0;
}
//@@@ 2001.11.07 End by MIK
/** ファイルの存在チェック
指定されたパスのファイルが存在するかどうかを確認する。
@param path [in] 調べるパス名
@param bFileOnly [in] true: ファイルのみ対象 / false: ディレクトリも対象
@retval true ファイルは存在する
@retval false ファイルは存在しない
@author genta
@date 2002.01.04 新規作成
*/
bool IsFileExists(const char* path, bool bFileOnly)
{
WIN32_FIND_DATA fd;
::ZeroMemory( &fd, sizeof(fd));
HANDLE hFind = ::FindFirstFile( path, &fd );
if( hFind != INVALID_HANDLE_VALUE ){
::FindClose( hFind );
if( bFileOnly == false ||
( fd.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY ) == 0 )
return true;
}
return false;
}
/** ファイル名の切り出し
指定文字列からファイル名と認識される文字列を取り出し、
先頭Offset及び長さを返す。
@param pLine [in] 探査対象文字列
@param pnBgn [out] 先頭offset。pLine + *pnBgnがファイル名先頭へのポインタ。
@param pnPathLen [out] ファイル名の長さ
@param bFileOnly [in] true: ファイルのみ対象 / false: ディレクトリも対象
@retval true ファイル名発見
@retval false ファイル名は見つからなかった
@date 2002.01.04 genta ディレクトリを検査対象外にする機能を追加
@date 2003.01.15 matsumo gccのエラーメッセージ(:区切り)でもファイルを検出可能に
@date 2004.05.29 genta C:\からファイルCが切り出されるのを防止
@date 2004.11.13 genta/Moca ファイル名先頭の*?を考慮
@date 2005.01.10 genta 変数名変更 j -> cur_pos
@date 2005.01.23 genta 警告抑制のため,gotoをreturnに変更
*/
bool IsFilePath( const char* pLine, int* pnBgn, int* pnPathLen, bool bFileOnly )
{
int i;
int nLineLen;
char szJumpToFile[1024];
memset( szJumpToFile, 0, sizeof( szJumpToFile ) );
nLineLen = strlen( pLine );
//先頭の空白を読み飛ばす
for( i = 0; i < nLineLen; ++i ){
if( ' ' != pLine[i] &&
'\t' != pLine[i] &&
'\"' != pLine[i]
){
break;
}
}
// #include <ファイル名>の考慮
// #で始まるときは"または<まで読み飛ばす
if( i < nLineLen &&
'#' == pLine[i]
){
for( ; i < nLineLen; ++i ){
if( '<' == pLine[i] ||
'\"' == pLine[i]
){
++i;
break;
}
}
}
// この時点で既に行末に達していたらファイル名は見つからない
if( i >= nLineLen ){
return false;
}
*pnBgn = i;
int cur_pos = 0;
for( ; i <= nLineLen && cur_pos + 1 < sizeof(szJumpToFile); ++i ){
if( ( i == nLineLen ||
pLine[i] == ' ' ||
pLine[i] == '\t' || //@@@ 2002.01.08 YAZAKI タブ文字も。
pLine[i] == '(' ||
pLine[i] == '\r' ||
pLine[i] == '\n' ||
pLine[i] == '\0' ||
pLine[i] == '>' ||
// May 29, 2004 genta C:\の:はファイル区切りと見なして欲しくない
( cur_pos > 1 && pLine[i] == ':' ) || //@@@ 2003/1/15/ matsumo (for gcc)
pLine[i] == '"'
) &&
0 < strlen( szJumpToFile )
){
// Jan. 04, 2002 genta
// ファイル存在確認方法変更
//if( -1 != _access( (const char *)szJumpToFile, 0 ) )
if( IsFileExists(szJumpToFile, bFileOnly))
{
i--;
break;
}
}
if( pLine[i] == '\r' ||
pLine[i] == '\n' ){
break;
}
// From Here Sept. 27, 2000 JEPRO タグジャンプできないのは以下の文字が1バイトコードで現れるときのみとした。
// (SJIS2バイトコードの2バイト目に現れる場合はパス名使用禁止文字とは認識しないで無視するように変更)
// if( /*pLine[i] == '/' ||*/
// pLine[i] == '<' ||
// pLine[i] == '>' ||
// pLine[i] == '?' ||
// pLine[i] == '"' ||
// pLine[i] == '|' ||
// pLine[i] == '*'
// ){
// return false;
// }
//
// szJumpToFile[cur_pos] = pLine[i];
// cur_pos++;
// }
// To Here comment out
// From Here Sept. 27, 2000 JEPRO added
// Oct. 3, 2000 JEPRO corrected
if( ( /*pLine[i] == '/' ||*/
pLine[i] == '<' || // 0x3C
pLine[i] == '>' || // 0x3E
pLine[i] == '?' || // 0x3F
pLine[i] == '"' || // 0x22
pLine[i] == '|' || // 0x7C
pLine[i] == '*' // 0x2A
) &&
/* 上の文字がSJIS2バイトコードの2バイト目でないことを、1つ前の文字がSJIS2バイトコードの1バイト目でないことで判断する */
// Oct. 5, 2002 genta
// 2004.11.13 Moca/genta 先頭に上の文字がある場合の考慮を追加
( i == 0 || ( i > 0 && ! _IS_SJIS_1( (unsigned char)pLine[i - 1] ))) ){
return false;
}else{
szJumpToFile[cur_pos] = pLine[i];
cur_pos++;
}
}
// To Here Sept. 27, 2000
// if( i >= nLineLen ){
// return FALSE;
// }
// Jan. 04, 2002 genta
// ファイル存在確認方法変更
if( 0 < strlen( szJumpToFile ) &&
IsFileExists(szJumpToFile, bFileOnly))
// -1 != _access( (const char *)szJumpToFile, 0 ) )
{
// Jan. 04, 2002 genta
// あまりに変なコーディングなので移動
*pnPathLen = strlen( szJumpToFile );
return true;
}else{
//#ifdef _DEBUG
// m_cShareData.TraceOut( "ファイルが存在しない。szJumpToFile=[%s]\n", szJumpToFile );
//#endif
}
return false;
}
void GetLineColm( const char* pLine, int* pnJumpToLine, int* pnJumpToColm )
{
int i;
int j;
int nLineLen;
char szNumber[32];
nLineLen = strlen( pLine );
i = 0;
for( ; i < nLineLen; ++i ){
if( pLine[i] >= '0' &&
pLine[i] <= '9' ){
break;
}
}
memset( szNumber, 0, sizeof( szNumber ) );
if( i >= nLineLen ){
}else{
/* 行位置 改行単位行番号(1起点)の抽出 */
j = 0;
for( ; i < nLineLen && j + 1 < sizeof( szNumber ); ){
szNumber[j] = pLine[i];
j++;
++i;
if( pLine[i] >= '0' &&
pLine[i] <= '9' ){
continue;
}
break;
}
*pnJumpToLine = atoi( szNumber );
/* 桁位置 改行単位行先頭からのバイト数(1起点)の抽出 */
if( i < nLineLen && pLine[i] == ',' ){
memset( szNumber, 0, sizeof( szNumber ) );
j = 0;
++i;
for( ; i < nLineLen && j + 1 < sizeof( szNumber ); ){
szNumber[j] = pLine[i];
j++;
++i;
if( pLine[i] >= '0' &&
pLine[i] <= '9' ){
continue;
}
break;
}
*pnJumpToColm = atoi( szNumber );
}
}
return;
}
// /* CRLFで区切られる「行」を返す。CRLFは行長に加えない */
// /* bLFisOK→LFだけでも改行とみなす */
// const char* GetNextLine( const char* pText, int nTextLen, int* pnLineLen, int* pnBgn, BOOL* pbEOL, BOOL bLFisOK )
// {
// int i;
// int nBgn;
// nBgn = *pnBgn;
// if( nBgn >= nTextLen ){
// return NULL;
// }
// if( NULL != pbEOL ){
// *pbEOL = TRUE;
// }
// for( i = *pnBgn; i < nTextLen; ++i ){
// if( bLFisOK &&
// '\n' == pText[i]
// ){
// *pnBgn = i + 1;
// break;
// }
// if( '\r' == pText[i]
// && i + 1 < nTextLen
// && '\n' == pText[i + 1]
// ){
// *pnBgn = i + 2;
// break;
// }
// }
// if( i >= nTextLen ){
// *pnBgn = i;
// if( NULL != pbEOL ){
// *pbEOL = FALSE;
// }
// }
// *pnLineLen = i - nBgn;
// return &pText[nBgn];
// }
//
/* CR0LF0,CRLF,LFCR,LF,CRで区切られる「行」を返す。改行コードは行長に加えない */
const char* GetNextLine(
const char* pData,
int nDataLen,
int* pnLineLen,
int* pnBgn,
CEOL* pcEol
)
{
int i;
int nBgn;
nBgn = *pnBgn;
// May 15, 2000 genta
pcEol->SetType( EOL_NONE );
if( *pnBgn >= nDataLen ){
return NULL;
}
for( i = *pnBgn; i < nDataLen; ++i ){
/* 改行コードがあった */
if( pData[i] == '\n' || pData[i] == '\r' ){
/* 行終端子の種類を調べる */
pcEol->GetTypeFromString( &pData[i], nDataLen - i );
break;
}
}
*pnBgn = i + pcEol->GetLen();
*pnLineLen = i - nBgn;
return &pData[nBgn];
}
/*! 指定長以下のテキストに切り分ける
@param pText [in] 切り分け対象となる文字列へのポインタ
@param nTextLen [in] 切り分け対象となる文字列全体の長さ
@param nLimitLen [in] 切り分ける長さ
@param pnLineLen [out] 実際に取り出された文字列の長さ
@param pnBgn [i/o] 入力: 切り分け開始位置, 出力: 取り出された文字列の次の位置
@note 2003.05.25 未使用のようだ
*/
const char* GetNextLimitedLengthText( const char* pText, int nTextLen, int nLimitLen, int* pnLineLen, int* pnBgn )
{
int i;
int nBgn;
int nCharChars;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -