\r
\r
/***********************************************************************\r
- <<< [Globals_init] >>> \r
+ <<< [Globals_initialize] >>> \r
************************************************************************/\r
-int Globals_init()\r
+int Globals_initialize()\r
{\r
int e;\r
\r
\r
\r
/***********************************************************************\r
- <<< [Globals_finish] >>> \r
+ <<< [Globals_finalize] >>> \r
************************************************************************/\r
-int Globals_finish( int e )\r
+int Globals_finalize( int e )\r
{\r
\r
return e;\r
************************************************************************/\r
int GetCommandLineUnnamed( int Index1, TCHAR* out_AParam, size_t AParamSize )\r
{\r
- TCHAR* line = GetCommandLine();\r
- int index;\r
- TCHAR* p;\r
- TCHAR* p2;\r
- TCHAR c;\r
-\r
- #if UNDER_CE\r
- Index1 --;\r
- #endif\r
- IF( Index1 < 0 ) goto err_nf;\r
- index = Index1;\r
-\r
- p = line;\r
-\r
- for (;;) {\r
- while ( *p == _T(' ') ) p++;\r
-\r
- c = *p;\r
-\r
- if ( c == _T('\0') ) goto err_nf; // Here is not decided to error or not\r
-\r
-\r
- //=== Skip named option\r
- else if ( c == _T('/') ) {\r
- p++;\r
- for (;;) {\r
- c = *p;\r
- if ( c == _T('"') || c == _T(' ') || c == _T('\0') ) break;\r
- p++;\r
- }\r
-\r
- if ( c == _T('"') ) {\r
- p++;\r
- while ( *p != _T('"') && *p != _T('\0') ) p++;\r
- if ( *p == _T('"') ) p++;\r
- }\r
- }\r
-\r
- //=== Skip or Get unnamed parameter\r
- else {\r
- while ( *p == _T(' ') ) p++;\r
-\r
- c = *p;\r
- p2 = p + 1;\r
-\r
- if ( c == _T('"') ) {\r
- p ++;\r
- while ( *p2 != _T('"') && *p2 != _T('\0') ) p2++;\r
- }\r
- else {\r
- while ( *p2 != _T(' ') && *p2 != _T('\0') ) p2++;\r
- }\r
-\r
- if ( index == 0 ) {\r
- int e;\r
-\r
- e= stcpy_part_r( out_AParam, AParamSize, out_AParam, NULL, p, p2 );\r
- ASSERT_D( !e, __noop() );\r
- return e;\r
- }\r
- else {\r
- p = ( *p2 == _T('"') ) ? p2+1 : p2;\r
- index --;\r
- }\r
- }\r
- }\r
+ TCHAR* line = GetCommandLine();\r
+ int index;\r
+ TCHAR* p;\r
+ TCHAR* p2;\r
+ TCHAR c;\r
+\r
+ #if UNDER_CE\r
+ Index1 --;\r
+ #endif\r
+ IF( Index1 < 0 ) goto err_nf;\r
+ index = Index1;\r
+\r
+ p = line;\r
+\r
+ for (;;) {\r
+ while ( *p == _T(' ') ) p++;\r
+\r
+ c = *p;\r
+\r
+ if ( c == _T('\0') ) goto err_nf; // Here is not decided to error or not\r
+\r
+\r
+ //=== Skip named option\r
+ else if ( c == _T('/') ) {\r
+ p++;\r
+ for (;;) {\r
+ c = *p;\r
+ if ( c == _T('"') || c == _T(' ') || c == _T('\0') ) break;\r
+ p++;\r
+ }\r
+\r
+ if ( c == _T('"') ) {\r
+ p++;\r
+ while ( *p != _T('"') && *p != _T('\0') ) p++;\r
+ if ( *p == _T('"') ) p++;\r
+ }\r
+ }\r
+\r
+ //=== Skip or Get unnamed parameter\r
+ else {\r
+ while ( *p == _T(' ') ) p++;\r
+\r
+ c = *p;\r
+ p2 = p + 1;\r
+\r
+ if ( c == _T('"') ) {\r
+ p ++;\r
+ while ( *p2 != _T('"') && *p2 != _T('\0') ) p2++;\r
+ }\r
+ else {\r
+ while ( *p2 != _T(' ') && *p2 != _T('\0') ) p2++;\r
+ }\r
+\r
+ if ( index == 0 ) {\r
+ int e;\r
+\r
+ e= stcpy_part_r( out_AParam, AParamSize, out_AParam, NULL, p, p2 );\r
+ ASSERT_D( !e, __noop() );\r
+ return e;\r
+ }\r
+ else {\r
+ p = ( *p2 == _T('"') ) ? p2+1 : p2;\r
+ index --;\r
+ }\r
+ }\r
+ }\r
\r
err_nf:\r
- if ( AParamSize >= sizeof(TCHAR) ) *out_AParam = _T('\0');\r
- IF ( Index1 >= 2 ) return E_NOT_FOUND_SYMBOL;\r
- return 0;\r
+ if ( AParamSize >= sizeof(TCHAR) ) *out_AParam = _T('\0');\r
+ IF ( Index1 >= 2 ) return E_NOT_FOUND_SYMBOL;\r
+ return 0;\r
}\r
\r
\r
\r
int GetCommandLineNamed( const TCHAR* Name, bool bCase, TCHAR* out_Value, size_t ValueSize )\r
{\r
- bool is_exist;\r
- return GetCommandLineNamed_sub( Name, bCase, &is_exist, out_Value, ValueSize );\r
+ bool is_exist;\r
+ return GetCommandLineNamed_sub( Name, bCase, &is_exist, out_Value, ValueSize );\r
}\r
\r
\r
int GetCommandLineNamed_sub( const TCHAR* Name, bool bCase, bool* out_IsExist, TCHAR* out_Value, size_t ValueSize )\r
{\r
- TCHAR* line = GetCommandLine();\r
- TCHAR* p;\r
- TCHAR* p2;\r
- TCHAR c;\r
- const size_t name_len = _tcslen( Name );\r
- bool bMatch;\r
-\r
- *out_IsExist = true;\r
-\r
- p = line;\r
- for (;;) {\r
- c = *p;\r
-\r
- //=== Compare option name\r
- if ( c == _T('/') ) {\r
- p++;\r
- p2 = p;\r
- for (;;) {\r
- c = *p2;\r
- if ( c == _T(':') || c == _T(' ') || c == _T('\0') ) break;\r
- p2++;\r
- }\r
- if ( bCase )\r
- bMatch = ( p2-p == (int)name_len && _tcsncmp( p, Name, p2-p ) == 0 );\r
- else\r
- bMatch = ( p2-p == (int)name_len && _tcsnicmp( p, Name, p2-p ) == 0 );\r
-\r
-\r
- //=== Get the value\r
- if ( c == _T(':') ) {\r
- p = p2 + 1;\r
- if ( *p == _T('"') ) {\r
- p++;\r
- p2 = p;\r
- while ( *p2 != _T('"') && *p2 != _T('\0') ) p2++;\r
- if ( bMatch )\r
- return stcpy_part_r( out_Value, ValueSize, out_Value, NULL, p, p2 );\r
- else\r
- p = p2+1;\r
- }\r
- else {\r
- p2 = p;\r
- while ( *p2 != _T(' ') && *p2 != _T('\0') ) p2++;\r
- if ( bMatch )\r
- return stcpy_part_r( out_Value, ValueSize, out_Value, NULL, p, p2 );\r
- else\r
- p = p2;\r
- }\r
- }\r
- else {\r
- IF( bMatch ) return E_NOT_FOUND_SYMBOL; // no value error\r
- }\r
- }\r
-\r
- else if ( c == _T('\0') ) break;\r
-\r
- //=== Skip\r
- else if ( c == _T('"') ) {\r
- p++;\r
- while ( *p != _T('"') && *p != _T('\0') ) p++;\r
- while ( *p != _T(' ') && *p != _T('\0') ) p++;\r
- }\r
- else {\r
- while ( *p != _T(' ') && *p != _T('\0') ) p++;\r
- }\r
- while ( *p == _T(' ') ) p++;\r
- }\r
-\r
- *out_IsExist = false;\r
- return E_NOT_FOUND_SYMBOL;\r
+ TCHAR* line = GetCommandLine();\r
+ TCHAR* p;\r
+ TCHAR* p2;\r
+ TCHAR c;\r
+ const size_t name_len = _tcslen( Name );\r
+ bool bMatch;\r
+\r
+ *out_IsExist = true;\r
+\r
+ p = line;\r
+ for (;;) {\r
+ c = *p;\r
+\r
+ //=== Compare option name\r
+ if ( c == _T('/') ) {\r
+ p++;\r
+ p2 = p;\r
+ for (;;) {\r
+ c = *p2;\r
+ if ( c == _T(':') || c == _T(' ') || c == _T('\0') ) break;\r
+ p2++;\r
+ }\r
+ if ( bCase )\r
+ bMatch = ( p2-p == (int)name_len && _tcsncmp( p, Name, p2-p ) == 0 );\r
+ else\r
+ bMatch = ( p2-p == (int)name_len && _tcsnicmp( p, Name, p2-p ) == 0 );\r
+\r
+\r
+ //=== Get the value\r
+ if ( c == _T(':') ) {\r
+ p = p2 + 1;\r
+ if ( *p == _T('"') ) {\r
+ p++;\r
+ p2 = p;\r
+ while ( *p2 != _T('"') && *p2 != _T('\0') ) p2++;\r
+ if ( bMatch )\r
+ return stcpy_part_r( out_Value, ValueSize, out_Value, NULL, p, p2 );\r
+ else\r
+ p = p2+1;\r
+ }\r
+ else {\r
+ p2 = p;\r
+ while ( *p2 != _T(' ') && *p2 != _T('\0') ) p2++;\r
+ if ( bMatch )\r
+ return stcpy_part_r( out_Value, ValueSize, out_Value, NULL, p, p2 );\r
+ else\r
+ p = p2;\r
+ }\r
+ }\r
+ else {\r
+ IF( bMatch ) return E_NOT_FOUND_SYMBOL; // no value error\r
+ }\r
+ }\r
+\r
+ else if ( c == _T('\0') ) break;\r
+\r
+ //=== Skip\r
+ else if ( c == _T('"') ) {\r
+ p++;\r
+ while ( *p != _T('"') && *p != _T('\0') ) p++;\r
+ while ( *p != _T(' ') && *p != _T('\0') ) p++;\r
+ }\r
+ else {\r
+ while ( *p != _T(' ') && *p != _T('\0') ) p++;\r
+ }\r
+ while ( *p == _T(' ') ) p++;\r
+ }\r
+\r
+ *out_IsExist = false;\r
+ return E_NOT_FOUND_SYMBOL;\r
}\r
\r
\r
************************************************************************/\r
int GetCommandLineNamedI( const TCHAR* Name, bool bCase, int* out_Value )\r
{\r
- int e;\r
- bool is_exist;\r
- TCHAR s[20];\r
-\r
- e= GetCommandLineNamed_sub( Name, bCase, &is_exist, s, sizeof(s) ); IF(e)goto fin; //[out] s\r
- if ( s[0] == _T('0') && s[1] == _T('x') )\r
- *out_Value = _tcstoul( s, NULL, 16 );\r
- else\r
- *out_Value = _ttoi( s );\r
- //e=0;\r
+ int e;\r
+ bool is_exist;\r
+ TCHAR s[20];\r
+\r
+ e= GetCommandLineNamed_sub( Name, bCase, &is_exist, s, sizeof(s) ); IF(e)goto fin; //[out] s\r
+ if ( s[0] == _T('0') && s[1] == _T('x') )\r
+ *out_Value = _tcstoul( s, NULL, 16 );\r
+ else\r
+ *out_Value = _ttoi( s );\r
+ //e=0;\r
fin:\r
- return e;\r
+ return e;\r
}\r
\r
\r
#if _UNICODE\r
int GetCommandLineNamedC8( const TCHAR* Name, bool bCase, char* out_Value, size_t ValueSize )\r
{\r
- int e;\r
- bool is_exist;\r
- TCHAR* s = NULL;\r
+ int e;\r
+ bool is_exist;\r
+ TCHAR* s = NULL;\r
\r
- s = (TCHAR*) malloc( ValueSize * sizeof(TCHAR) );\r
- e= GetCommandLineNamed_sub( Name, bCase, &is_exist, (TCHAR*) s, ValueSize * sizeof(TCHAR) ); IF(e)goto fin;\r
+ s = (TCHAR*) malloc( ValueSize * sizeof(TCHAR) );\r
+ e= GetCommandLineNamed_sub( Name, bCase, &is_exist, (TCHAR*) s, ValueSize * sizeof(TCHAR) ); IF(e)goto fin;\r
\r
- sprintf_s( out_Value, ValueSize, "%S", s );\r
+ sprintf_s( out_Value, ValueSize, "%S", s );\r
fin:\r
- if ( s != NULL ) free( s );\r
- return e;\r
+ if ( s != NULL ) free( s );\r
+ return e;\r
}\r
#endif\r
\r
************************************************************************/\r
bool GetCommandLineExist( const TCHAR* Name, bool bCase )\r
{\r
- int e;\r
- bool is_exist;\r
- TCHAR v[1];\r
+ int e;\r
+ bool is_exist;\r
+ TCHAR v[1];\r
\r
- e = GetCommandLineNamed_sub( Name, bCase, &is_exist, v, sizeof(v) );\r
- if ( e == E_NOT_FOUND_SYMBOL ) ClearError();\r
- return is_exist;\r
+ e = GetCommandLineNamed_sub( Name, bCase, &is_exist, v, sizeof(v) );\r
+ if ( e == E_NOT_FOUND_SYMBOL ) ClearError();\r
+ return is_exist;\r
}\r
\r
\r
************************************************************************/\r
int Locale_init()\r
{\r
- g_LocaleSymbol = ".OCP";\r
- setlocale( LC_ALL, ".OCP" );\r
- return 0;\r
+ g_LocaleSymbol = ".OCP";\r
+ setlocale( LC_ALL, ".OCP" );\r
+ return 0;\r
}\r
\r
+\r
\r
/***********************************************************************\r
<<< [Locale_isInited] >>> \r
************************************************************************/\r
int Locale_isInited()\r
{\r
- return ( g_LocaleSymbol[0] != '\0' );\r
- // \82±\82±\82ª false \82ð\95Ô\82·\82Æ\82«\82Ì\91Î\8f\88\96@\82Í\81ALocale_isInited \82Ì\83w\83\8b\83v\82ð\8eQ\8fÆ\82µ\82Ä\82\82¾\82³\82¢\81B\r
+ return ( g_LocaleSymbol[0] != '\0' );\r
+ // \82±\82±\82ª false \82ð\95Ô\82·\82Æ\82«\82Ì\91Î\8f\88\96@\82Í\81ALocale_isInited \82Ì\83w\83\8b\83v\82ð\8eQ\8fÆ\82µ\82Ä\82\82¾\82³\82¢\81B\r
}\r
\r
+\r
\r
/*=================================================================*/\r
/* <<< [FileT/FileT.c] >>> */ \r
\r
e=0;\r
fin:\r
- e= FileT_close( f1, e );\r
- e= FileT_close( f2, e );\r
+ e= FileT_closeAndNULL( &f1, e );\r
+ e= FileT_closeAndNULL( &f2, e );\r
return e;\r
\r
err: e = E_OTHERS; goto fin;\r
BOOL b;\r
bool is_same = false;\r
\r
- UNREFERENCED_VARIABLES(( Flags ));\r
+ UNREFERENCED_VARIABLE( Flags );\r
\r
\r
// file_a, file_b : open PathA, PathB\r
typedef struct {\r
/*--- inherit from FileT_CallByNestFindData */\r
void* CallerArgument;\r
- TCHAR* AbsPath; // abstruct path\r
+ TCHAR* FullPath; // abstruct path\r
TCHAR* StepPath;\r
TCHAR* FileName;\r
DWORD FileAttributes;\r
/*---*/\r
BitField Flags;\r
FuncType CallbackFromNestFind;\r
- TCHAR AbsPathMem[4096];\r
+ TCHAR FullPathMem[4096];\r
} FileT_CallByNestFindDataIn;\r
\r
int FileT_callByNestFind_sub( FileT_CallByNestFindDataIn* m );\r
{\r
TCHAR* p;\r
\r
- e= StrT_cpy( data.AbsPathMem, sizeof(data.AbsPathMem), Path ); IF(e)goto fin;\r
+ e= StrT_cpy( data.FullPathMem, sizeof(data.FullPathMem), Path ); IF(e)goto fin;\r
\r
\r
- /* AbsPathMem \82Ì\8dÅ\8cã\82É \ \82ª\96³\82¢\82È\82ç\92Ç\89Á\82·\82é */\r
- p = _tcschr( data.AbsPathMem, _T('\0') );\r
+ /* FullPathMem \82Ì\8dÅ\8cã\82É \ \82ª\96³\82¢\82È\82ç\92Ç\89Á\82·\82é */\r
+ p = _tcschr( data.FullPathMem, _T('\0') );\r
p--;\r
if ( *p != _T('\\') ) {\r
p++;\r
- IF( p >= data.AbsPathMem + (sizeof(data.AbsPathMem) / sizeof(TCHAR)) - 1 )goto err_fa;\r
+ IF( p >= data.FullPathMem + (sizeof(data.FullPathMem) / sizeof(TCHAR)) - 1 )goto err_fa;\r
*p = _T('\\');\r
}\r
\r
\r
/* data \82ð\8f\89\8aú\89»\82·\82é */\r
data.CallerArgument = Argument;\r
- data.AbsPath = data.AbsPathMem;\r
+ data.FullPath = data.FullPathMem;\r
data.StepPath = p + 1;\r
data.FileName = p + 1;\r
data.Flags = Flags;\r
\r
/* Path \82É\8ew\92è\82µ\82½\83t\83H\83\8b\83_\82É\91Î\82µ\82Ä\83R\81[\83\8b\83o\83b\83N\82·\82é */\r
if ( m->Flags & FileT_FolderBeforeFiles ) {\r
- *( m->FileName - 1 ) = _T('\0'); // m->AbsPath \82Ì\8dÅ\8cã\82Ì \ \82ð\88ê\8e\9e\93I\82É\83J\83b\83g\r
+ *( m->FileName - 1 ) = _T('\0'); // m->FullPath \82Ì\8dÅ\8cã\82Ì \ \82ð\88ê\8e\9e\93I\82É\83J\83b\83g\r
*( m->FileName ) = _T('\0'); // m->FileName, m->StepPath \82ð "" \82É\82·\82é\r
m->FileAttributes = FILE_ATTRIBUTE_DIRECTORY;\r
\r
TCHAR* fname = m->FileName;\r
\r
m->StepPath = _T(".");\r
- m->FileName = StrT_refFName( m->AbsPath );\r
+ m->FileName = StrT_refFName( m->FullPath );\r
e= m->CallbackFromNestFind( m ); IF(e)goto fin;\r
m->StepPath = step_path;\r
m->FileName = fname;\r
else if ( m->FileName[0] == _T('\0') ) {\r
TCHAR* fname = m->FileName;\r
\r
- m->FileName = StrT_refFName( m->AbsPath );\r
+ m->FileName = StrT_refFName( m->FullPath );\r
e= m->CallbackFromNestFind( m ); IF(e)goto fin;\r
m->FileName = fname;\r
}\r
\r
/* * \82ð\92Ç\89Á */\r
p = m->FileName;\r
- IF( p >= m->AbsPathMem + (sizeof(m->AbsPathMem) / sizeof(TCHAR)) - 2 )goto err_fa;\r
+ IF( p >= m->FullPathMem + (sizeof(m->FullPathMem) / sizeof(TCHAR)) - 2 )goto err_fa;\r
*p = _T('*'); *(p+1) = _T('\0');\r
\r
\r
/* \83t\83@\83C\83\8b\82©\83t\83H\83\8b\83_\82ð\97ñ\8b\93\82µ\82Ü\82· */\r
- find = FindFirstFileEx( m->AbsPathMem, FindExInfoStandard, &data,\r
+ find = FindFirstFileEx( m->FullPathMem, FindExInfoStandard, &data,\r
FindExSearchNameMatch, NULL, 0 );\r
done = ( find == INVALID_HANDLE_VALUE );\r
\r
}\r
\r
StrT_cpy( m->FileName,\r
- sizeof(m->AbsPathMem) - ( (char*)m->FileName - (char*)m->AbsPathMem ),\r
+ sizeof(m->FullPathMem) - ( (char*)m->FileName - (char*)m->FullPathMem ),\r
data.cFileName );\r
m->FileAttributes = data.dwFileAttributes;\r
\r
\r
p = _tcschr( m->FileName, _T('\0') );\r
\r
- IF( p >= m->AbsPathMem + (sizeof(m->AbsPathMem) / sizeof(TCHAR)) - 2 )goto err_fa;\r
+ IF( p >= m->FullPathMem + (sizeof(m->FullPathMem) / sizeof(TCHAR)) - 2 )goto err_fa;\r
*p = _T('\\'); *(p+1) = _T('\0');\r
m->FileName = p + 1;\r
\r
\r
*( m->FileName - 1 ) = _T('\0');\r
m->FileAttributes = FILE_ATTRIBUTE_DIRECTORY;\r
- if ( ( *( m->StepPath - 1 ) == _T('\0') ) && ( m->StepPath > m->AbsPath ) ) {\r
+ if ( ( *( m->StepPath - 1 ) == _T('\0') ) && ( m->StepPath > m->FullPath ) ) {\r
m->StepPath = _T(".");\r
}\r
- m->FileName = StrT_refFName( m->AbsPath );\r
+ m->FileName = StrT_refFName( m->FullPath );\r
\r
e= m->CallbackFromNestFind( m ); IF(e)goto fin;\r
\r
\r
en = _tfopen_s( out_pFile, Path, _T("r")_T(fopen_ccs) );\r
if ( en == ENOENT ) {\r
- _tprintf( _T("not found \"%s\"\n"), Path );\r
-\r
#ifndef UNDER_CE\r
{\r
TCHAR cwd[512];\r
\r
- if ( _tgetcwd( cwd, _countof(cwd) ) != NULL )\r
- _tprintf( _T("current = \"%s\"\n"), cwd );\r
+ if ( _tgetcwd( cwd, _countof(cwd) ) == NULL ) {\r
+ cwd[0] = _T('\0');\r
+ }\r
+ Error4_printf( _T("<ERROR msg=\"Not found\" path=\"%s\" current=\"%s\"/>"),\r
+ Path, cwd );\r
}\r
+ #else\r
+ Error4_printf( _T("<ERROR msg=\"Not found\" path=\"%s\"/>"), Path );\r
#endif\r
\r
- return E_NOT_FOUND_SYMBOL;\r
+ return E_PATH_NOT_FOUND;\r
}\r
if ( en == EACCES ) {\r
- _tprintf( _T("access denied \"%s\"\n"), Path );\r
+ Error4_printf( _T("access denied \"%s\"\n"), Path );\r
return E_ACCESS_DENIED;\r
}\r
IF(en)return E_OTHERS;\r
\r
\r
\r
-/*=================================================================*/\r
-/* <<< [StrT/StrT.c] >>> */ \r
-/*=================================================================*/\r
- \r
/***********************************************************************\r
- <<< [StrT_cpy] >>> \r
-- _tcscpy is raising exception, if E_FEW_ARRAY\r
+ <<< [FileT_closeAndNULL] >>> \r
************************************************************************/\r
-errnum_t StrT_cpy( TCHAR* Dst, size_t DstSize, const TCHAR* Src )\r
+errnum_t FileT_closeAndNULL( FILE** in_out_File, errnum_t e )\r
{\r
- size_t size;\r
+ FILE* file = *in_out_File;\r
\r
- size = ( _tcslen( Src ) + 1 ) * sizeof(TCHAR);\r
- if ( size <= DstSize ) {\r
- memcpy( Dst, Src, size );\r
- return 0;\r
- }\r
- else {\r
- memcpy( Dst, Src, DstSize - sizeof(TCHAR) );\r
- *(TCHAR*)( (char*) Dst + DstSize ) = _T('\0');\r
- return E_FEW_ARRAY;\r
+ if ( file != NULL ) {\r
+ int r = fclose( file );\r
+ IF ( r && e == 0 ) { e = E_ERRNO; }\r
+ *in_out_File = NULL;\r
}\r
+\r
+ return e;\r
}\r
\r
+\r
+\r
+ \r
+/*=================================================================*/\r
+/* <<< [Error4/Error4.c] >>> */ \r
+/*=================================================================*/\r
\r
/***********************************************************************\r
- <<< [MallocAndCopyString] >>> \r
+ <<< [Get_Error4_Variables] >>> \r
************************************************************************/\r
-errnum_t MallocAndCopyString( TCHAR** out_NewString, const TCHAR* SourceString )\r
-{\r
- TCHAR* str;\r
- size_t size = ( _tcslen( SourceString ) + 1 ) * sizeof(TCHAR);\r
-\r
- ASSERT_D( *out_NewString == NULL, __noop() );\r
-\r
- str = (TCHAR*) malloc( size );\r
- if ( str == NULL ) { return E_FEW_MEMORY; }\r
-\r
- memcpy( str, SourceString, size );\r
+static Error4_VariablesClass gs;\r
+#ifdef _DEBUG\r
+ extern Error4_VariablesClass* g_Error4_Variables = &gs;\r
+#endif\r
\r
- *out_NewString = str;\r
- return 0;\r
+Error4_VariablesClass* Get_Error4_Variables()\r
+{\r
+ return &gs;\r
}\r
\r
\r
\r
/***********************************************************************\r
- <<< [MallocAndCopyString_char] >>> \r
+ <<< (SetBreakErrorID) >>> \r
************************************************************************/\r
-#ifdef _UNICODE\r
-errnum_t MallocAndCopyString_char( TCHAR** out_NewString, const char* SourceString )\r
+\r
+/*[DebugBreakR]*/\r
+void DebugBreakR()\r
{\r
- TCHAR* str;\r
- size_t size = ( strlen( SourceString ) + 1 ) * sizeof(TCHAR);\r
- int r;\r
+ printf( "\83u\83\8c\81[\83N\82µ\82Ü\82·\81B\82à\82µ\83f\83o\83b\83K\81[\82ª\90Ú\91±\82³\82ê\82Ä\82¢\82È\82¯\82ê\82Î\8b\90§\8fI\97¹\82µ\82Ü\82·\81B\n" );\r
+ DebugBreak();\r
+ // Visual Studio 2008 \82Å\82Í\81A\82±\82±\82Å [ \83f\83o\83b\83O > \83X\83e\83b\83v \83A\83E\83g ] \82µ\82È\82¢\82Æ\r
+ // \8cÄ\82Ñ\8fo\82µ\97\9a\97ð\82â\83E\83H\83b\83`\82Ì\93à\97e\82ª\90³\82µ\82\82È\82è\82Ü\82¹\82ñ\81B\r
+}\r
\r
- str = (TCHAR*) malloc( size );\r
- if ( str == NULL ) { return E_FEW_MEMORY; }\r
\r
- r = MultiByteToWideChar( CP_OEMCP, MB_PRECOMPOSED, SourceString, -1, str, size / sizeof(TCHAR) );\r
- IF ( r == 0 ) {\r
- free( str );\r
- return E_GET_LAST_ERROR;\r
- }\r
- *out_NewString = str;\r
- return 0;\r
-}\r
+#if ENABLE_ERROR_BREAK_IN_ERROR_CLASS\r
+\r
+\r
+#if ! IS_MULTI_THREAD_ERROR_CLASS\r
+ dll_global_g_DebugBreakCount ErrorClass g_Error; /* \8f\89\8aú\92l\82Í\82·\82×\82Ä\83[\83\8d */\r
+#else\r
+ dll_global_g_DebugBreakCount GlobalErrorClass g_GlobalError;\r
+\r
+ static errnum_t ErrorClass_initializeIfNot_Sub( ErrorClass** out_Error );\r
+ static errnum_t ErrorClass_initializeIfNot_Sub2(void);\r
#endif\r
\r
\r
- \r
-/***********************************************************************\r
- <<< [MallocAndCopyStringByLength] >>> \r
-************************************************************************/\r
-errnum_t MallocAndCopyStringByLength( TCHAR** out_NewString, const TCHAR* SourceString,\r
- unsigned CountOfCharacter )\r
+#define IF_ if /* Error check for in "IF" macro */\r
+\r
+\r
+/*[SetBreakErrorID]*/\r
+void SetBreakErrorID( int ErrorID )\r
{\r
- TCHAR* str;\r
- size_t size = ( CountOfCharacter + 1 ) * sizeof(TCHAR);\r
+#if ! IS_MULTI_THREAD_ERROR_CLASS\r
\r
- ASSERT_D( *out_NewString == NULL, __noop() );\r
+ ErrorClass* err = &g_Error;\r
+ bool is_print;\r
\r
- str = (TCHAR*) malloc( size );\r
- if ( str == NULL ) { return E_FEW_MEMORY; }\r
+ is_print = ( err->BreakErrorID != ErrorID );\r
\r
- memcpy( str, SourceString, size - sizeof(TCHAR) );\r
- str[ CountOfCharacter ] = _T('\0');\r
+ err->BreakErrorID = ErrorID;\r
+ /* printf \82Ì\92\86\82Å\94\90¶\82·\82é\83G\83\89\81[\82Å\8e~\82ß\82é\82½\82ß */\r
\r
- *out_NewString = str;\r
- return 0;\r
+ if ( is_print )\r
+ { printf( ">SetBreakErrorID( %d );\n", ErrorID ); }\r
+\r
+#else\r
+\r
+ GlobalErrorClass* err_global = &g_GlobalError;\r
+\r
+ if ( err_global->BreakGlobalErrorID != ErrorID )\r
+ { printf( ">SetBreakErrorID( %d );\n", ErrorID ); }\r
+ err_global->BreakGlobalErrorID = ErrorID;\r
+\r
+#endif\r
}\r
\r
\r
- \r
-/***********************************************************************\r
- <<< [StrT_chrs] >>> \r
-************************************************************************/\r
-TCHAR* StrT_chrs( const TCHAR* s, const TCHAR* keys )\r
+\r
+bool OnRaisingError_Sub( const char* FilePath, int LineNum )\r
+ // \96{\8aÖ\90\94\82Í\81AIF \83}\83N\83\8d\82Ì\92\86\82©\82ç\8cÄ\82Î\82ê\82Ü\82·\r
+ // \95Ô\82è\92l\82Í\81A\83u\83\8c\81[\83N\82·\82é\82©\82Ç\82¤\82©\r
{\r
- if ( *keys == _T('\0') ) return NULL;\r
+#if ! IS_MULTI_THREAD_ERROR_CLASS\r
\r
- for ( ; *s != _T('\0'); s++ ) {\r
- if ( _tcschr( keys, *s ) != NULL )\r
- return (TCHAR*) s;\r
+ ErrorClass* err = &g_Error;\r
+ bool is_break;\r
+\r
+ /* \83G\83\89\81[\8e\9e\82Ì\92\86\92f\8f\88\97\9d\81i\83W\83\83\83\93\83v\81j\82ð\82µ\82Ä\82¢\82é\82Æ\82«\81i\8d\82\91¬\83\8a\83^\81[\83\93\81j */\r
+ if ( err->IsError ) {\r
+ return false;\r
}\r
- return NULL;\r
-}\r
\r
+ /* \83G\83\89\81[\82ª\94\90¶\82µ\82½\92¼\8cã\82Ì\82Æ\82« */\r
+ err->ErrorID += 1;\r
+ err->IsError = true;\r
+ err->FilePath = FilePath;\r
+ err->LineNum = LineNum;\r
\r
- \r
-/***********************************************************************\r
- <<< [StrT_skip] >>> \r
-************************************************************************/\r
-TCHAR* StrT_skip( const TCHAR* s, const TCHAR* keys )\r
-{\r
- if ( *keys == _T('\0') ) return (TCHAR*) s;\r
+ #if ERR2_ENABLE_ERROR_LOG\r
+ printf( "<ERROR_LOG msg=\"raised\" ErrorID=\"%d\" ErrorObject=\"0x%08X\"/>\n",\r
+ err->ErrorID, (int) err );\r
+ #endif\r
\r
- for ( ; *s != _T('\0'); s++ ) {\r
- if ( _tcschr( keys, *s ) == NULL )\r
- break;\r
+ is_break = ( err->ErrorID == err->BreakErrorID );\r
+\r
+ if ( is_break ) {\r
+ printf( "Break in (%d) %s\n", LineNum, FilePath );\r
}\r
- return (TCHAR*) s;\r
-}\r
+ return ( err->ErrorID == err->BreakErrorID );\r
\r
+#else /* IS_MULTI_THREAD_ERROR_CLASS */\r
\r
- \r
-/***********************************************************************\r
- <<< [StrT_refFName] >>> \r
-************************************************************************/\r
-TCHAR* StrT_refFName( const TCHAR* s )\r
-{\r
- const TCHAR* p;\r
- TCHAR c;\r
+ errnum_t e;\r
+ bool is_break = false;\r
+ ErrorClass* err;\r
\r
- p = _tcschr( s, _T('\0') );\r
+ e= ErrorClass_initializeIfNot_Sub( &err ); IF_(e){goto fin;}\r
\r
- if ( p == s ) return (TCHAR*) s;\r
\r
- for ( p--; p>s; p-- ) {\r
- c = *p;\r
- if ( c == _T('\\') || c == _T('/') ) return (TCHAR*) p+1;\r
+ /* \83G\83\89\81[\8e\9e\82Ì\92\86\92f\8f\88\97\9d\81i\83W\83\83\83\93\83v\81j\82ð\82µ\82Ä\82¢\82é\82Æ\82«\81i\8d\82\91¬\83\8a\83^\81[\83\93\81j */\r
+ if ( err->IsError ) {\r
+ return false;\r
}\r
- if ( *p == _T('\\') || *p == _T('/') ) return (TCHAR*) p+1;\r
\r
- return (TCHAR*) s;\r
-}\r
- \r
-/***********************************************************************\r
- <<< [StrT_refExt] >>> \r
-************************************************************************/\r
-TCHAR* StrT_refExt( const TCHAR* s )\r
-{\r
- const TCHAR* p;\r
+ /* \83G\83\89\81[\82ª\94\90¶\82µ\82½\92¼\8cã\82Ì\82Æ\82« */\r
+ else {\r
+ GlobalErrorClass* err_global = &g_GlobalError;\r
\r
- p = _tcschr( s, _T('\0') );\r
+ EnterCriticalSection( &err_global->CriticalSection );\r
\r
- if ( p == s ) return (TCHAR*) s;\r
\r
- for ( p--; p>s; p-- ) {\r
- if ( *p == _T('.') ) return (TCHAR*) p+1;\r
- if ( *p == _T('/') || *p == _T('\\') ) return (TCHAR*) _tcschr( p, _T('\0') );\r
- }\r
- if ( *p == _T('.') ) return (TCHAR*) p+1;\r
+ err_global->ErrorThreadCount += 1;\r
+ err_global->RaisedGlobalErrorID += 1;\r
+ err->GlobalErrorID = err_global->RaisedGlobalErrorID;\r
\r
- return (TCHAR*) _tcschr( s, _T('\0') );\r
-}\r
+ err->ErrorID += 1;\r
+ err->IsError = true;\r
+ err->FilePath = FilePath;\r
+ err->LineNum = LineNum;\r
\r
+ is_break = ( err->ErrorID == err->BreakErrorID ) ||\r
+ ( err->GlobalErrorID == err_global->BreakGlobalErrorID );\r
\r
- \r
-/***********************************************************************\r
- <<< [StrT_replace1] >>> \r
-************************************************************************/\r
-errnum_t StrT_replace1( TCHAR* in_out_String, TCHAR FromCharacter, TCHAR ToCharacter,\r
- unsigned Opt )\r
-{\r
- TCHAR* p;\r
\r
- UNREFERENCED_VARIABLE( Opt );\r
+ /* \82±\82±\82æ\82è\88È\8d~\82Í\81AIF \83}\83N\83\8d\82È\82Ç\82ð\8cÄ\82Ñ\8fo\82µ\89Â\94\\81i\83\8a\83G\83\93\83g\83\89\83\93\83g\89Â\94\\81j */\r
+ /* \8fã\8bL\82Ì if ( err->IsError ) \82Å\81A\82·\82®\96ß\82é\82½\82ß */\r
\r
- IF ( FromCharacter == _T('\0') ) { return E_OTHERS; }\r
\r
- p = in_out_String;\r
- for (;;) {\r
- p = _tcschr( p, FromCharacter );\r
- if ( p == NULL ) { break; }\r
- *p = ToCharacter;\r
- p += 1;\r
+ #if ERR2_ENABLE_ERROR_LOG\r
+ printf( "<ERROR_LOG msg=\"raised\" ErrorID=\"%d\" ErrorObject=\"0x%08X\"/>\n",\r
+ err->GlobalErrorID, (int) err );\r
+ #endif\r
+\r
+\r
+ if ( err->ErrorID == 1 ) {\r
+ FinalizerClass_initConst( &err->Finalizer, err, ErrorClass_finalize );\r
+ e= AddThreadLocalFinalizer( &err->Finalizer );\r
+ }\r
+ else {\r
+ e = 0;\r
+ }\r
+ LeaveCriticalSection( &err_global->CriticalSection );\r
+ IF(e){goto fin;}\r
}\r
\r
- return 0;\r
+ e=0;\r
+fin:\r
+ if ( is_break ) {\r
+ printf( "Break in (%d) %s\n", LineNum, FilePath );\r
+ }\r
+ return is_break;\r
+\r
+#endif /* IS_MULTI_THREAD_ERROR_CLASS */\r
}\r
\r
\r
- \r
-/***********************************************************************\r
- <<< [StrT_trim] >>> \r
-************************************************************************/\r
-errnum_t StrT_trim( TCHAR* out_Str, size_t out_Str_Size, const TCHAR* in_Str )\r
+//[ClearError]\r
+void ClearError()\r
+{\r
+#if ! IS_MULTI_THREAD_ERROR_CLASS\r
+\r
+ ErrorClass* err = &g_Error;\r
+\r
+ #if ERR2_ENABLE_ERROR_LOG\r
+ if ( err->IsError ) {\r
+ printf( "<ERROR_LOG msg=\"cleared\" ErrorID=\"%d\" ErrorObject=\"0x%08X\"/>\n",\r
+ err->ErrorID, (int) err );\r
+ }\r
+ #endif\r
+\r
+ err->IsError = false;\r
+\r
+#else /* IS_MULTI_THREAD_ERROR_CLASS */\r
+\r
+ errnum_t e;\r
+ ErrorClass* err;\r
+\r
+ e= ErrorClass_initializeIfNot_Sub( &err );\r
+ if ( e == 0 ) {\r
+ #if ERR2_ENABLE_ERROR_LOG\r
+ if ( err->IsError )\r
+ printf( "<ERROR_LOG msg=\"cleared\" ErrorID=\"%d\" ErrorObject=\"0x%08X\"/>\n",\r
+ err->GlobalErrorID, (int) err );\r
+ #endif\r
+\r
+ if ( err->IsError ) {\r
+ GlobalErrorClass* err_global = &g_GlobalError;\r
+\r
+ EnterCriticalSection( &err_global->CriticalSection );\r
+ err_global->ErrorThreadCount -= 1;\r
+ LeaveCriticalSection( &err_global->CriticalSection );\r
+\r
+ err->IsError = false;\r
+ }\r
+ }\r
+ else {\r
+ #if ERR2_ENABLE_ERROR_LOG\r
+ printf( "<ERROR_LOG msg=\"clear_miss\"/>\n" );\r
+ #endif\r
+ }\r
+\r
+#endif /* IS_MULTI_THREAD_ERROR_CLASS */\r
+}\r
+\r
+\r
+//[IfErrThenBreak]\r
+void IfErrThenBreak()\r
+{\r
+#if ! IS_MULTI_THREAD_ERROR_CLASS\r
+\r
+ ErrorClass* err = &g_Error;\r
+\r
+ if ( err->IsError &&\r
+ ( err->ErrorID != err->BreakErrorID || err->BreakErrorID == 0 )\r
+ ) {\r
+ printf( "in IfErrThenBreak\n" );\r
+ DebugBreakR();\r
+\r
+ // \83E\83H\83b\83`\82Å\81Aerr->ErrorID \82Ì\92l(N\82Æ\82·\82é)\82ð\8am\94F\82µ\82Ä\81A\r
+ // \83\81\83C\83\93\8aÖ\90\94\82Å SetBreakErrorID( N ); \82ð\8cÄ\82Ñ\8fo\82µ\82Ä\82\82¾\82³\82¢\81B\r
+ // \83G\83\89\81[\82ª\94\90¶\82µ\82½\8fê\8f\8a\82Í\81Aerr->FilePath, err->LineNum \82Å\82·\81B\r
+ // \90³\8fí\8fI\97¹\82µ\82Ä\82¢\82é\82Â\82à\82è\82È\82Ì\82É\82±\82±\82Å\83u\83\8c\81[\83N\82·\82é\82Æ\82«\82Í\81A\r
+ // ClearError() \82ð\96Y\82ê\82Ä\82¢\82é\89Â\94\\90«\82ª\82 \82è\82Ü\82·\81B\r
+ #if ERR2_ENABLE_ERROR_LOG\r
+ printf( "<ERROR_LOG msg=\"IfErrThenBreak\" ErrorID=\"%d\" BreakErrorID=\"%d\"/>\n",\r
+ err->ErrorID, err->BreakErrorID );\r
+ #endif\r
+\r
+ {\r
+ char str[512];\r
+ sprintf_s( str, _countof(str), "<ERROR file=\"%s(%d)\"/>\n",\r
+ err->FilePath, err->LineNum );\r
+ OutputDebugStringA( str );\r
+ }\r
+ }\r
+ ClearError();\r
+\r
+#else /* IS_MULTI_THREAD_ERROR_CLASS */\r
+\r
+ errnum_t e;\r
+ GlobalErrorClass* err_global = &g_GlobalError;\r
+ ErrorClass* err;\r
+\r
+ e= ErrorClass_initializeIfNot_Sub( &err );\r
+ if ( e ) { DebugBreakR(); ClearError(); return; } /* \93à\95\94\83G\83\89\81[ */\r
+\r
+ if ( err_global->ErrorThreadCount != 0 &&\r
+ ( err->GlobalErrorID != err_global->BreakGlobalErrorID || err_global->BreakGlobalErrorID == 0 )\r
+ ) {\r
+ printf( "in IfErrThenBreak\n" );\r
+ DebugBreakR();\r
+\r
+ // \83E\83H\83b\83`\82Å\81Aerr->GlobalErrorID \82Ì\92l(N\82Æ\82·\82é)\82ð\8am\94F\82µ\82Ä\81A\r
+ // \83\81\83C\83\93\8aÖ\90\94\82Å SetBreakErrorID( N ); \82ð\8cÄ\82Ñ\8fo\82µ\82Ä\82\82¾\82³\82¢\81B\r
+ // \83G\83\89\81[\82ª\94\90¶\82µ\82½\8fê\8f\8a\82Í\81Aerr->FilePath, err->LineNum \82Å\82·\81B\r
+ // \90³\8fí\8fI\97¹\82µ\82Ä\82¢\82é\82Â\82à\82è\82È\82Ì\82É\82±\82±\82Å\83u\83\8c\81[\83N\82·\82é\82Æ\82«\82Í\81A\r
+ // ClearError() \82ð\96Y\82ê\82Ä\82¢\82é\89Â\94\\90«\82ª\82 \82è\82Ü\82·\81B\r
+ #if ERR2_ENABLE_ERROR_LOG\r
+ printf( "<ERROR_LOG msg=\"IfErrThenBreak\" ErrorID=\"%d\" BreakErrorID=\"%d\"/>\n",\r
+ err->ErrorID, err->BreakErrorID );\r
+ #endif\r
+\r
+ {\r
+ char str[512];\r
+ sprintf_s( str, _countof(str), "<ERROR file=\"%s(%d)\"/>\n",\r
+ err->FilePath, err->LineNum );\r
+ OutputDebugStringA( str );\r
+ }\r
+ }\r
+ ClearError();\r
+\r
+#endif /* IS_MULTI_THREAD_ERROR_CLASS */\r
+}\r
+\r
+\r
+//[MergeError]\r
+errnum_t MergeError( errnum_t e, errnum_t ee )\r
+{\r
+ if ( e == 0 ) { return ee; }\r
+ else { /* ErrorLog_add( ee ); */ return e; }\r
+}\r
+\r
+\r
+//[PushErr]\r
+void PushErr( ErrStackAreaClass* ErrStackArea )\r
+{\r
+#if ! IS_MULTI_THREAD_ERROR_CLASS\r
+\r
+ ErrorClass* err = &g_Error;\r
+\r
+ ErrStackArea->ErrorID = err->ErrorID;\r
+ ErrStackArea->IsError = err->IsError;\r
+ err->IsError = false;\r
+\r
+#else /* IS_MULTI_THREAD_ERROR_CLASS */\r
+\r
+ errnum_t e;\r
+ ErrorClass* err;\r
+\r
+ e= ErrorClass_initializeIfNot_Sub( &err );\r
+ if ( e == 0 ) {\r
+ ErrStackArea->ErrorID = err->ErrorID;\r
+ ErrStackArea->IsError = err->IsError;\r
+ err->IsError = false;\r
+ }\r
+\r
+#endif /* IS_MULTI_THREAD_ERROR_CLASS */\r
+}\r
+\r
+//[PopErr]\r
+void PopErr( ErrStackAreaClass* ErrStackArea )\r
+{\r
+#if ! IS_MULTI_THREAD_ERROR_CLASS\r
+\r
+ ErrorClass* err = &g_Error;\r
+\r
+ if ( ErrStackArea->IsError )\r
+ { err->IsError = true; }\r
+\r
+#else /* IS_MULTI_THREAD_ERROR_CLASS */\r
+\r
+ errnum_t e;\r
+ ErrorClass* err;\r
+\r
+ e= ErrorClass_initializeIfNot_Sub( &err );\r
+ if ( e == 0 ) {\r
+ if ( ErrStackArea->IsError )\r
+ { err->IsError = true; }\r
+ }\r
+\r
+#endif /* IS_MULTI_THREAD_ERROR_CLASS */\r
+}\r
+\r
+\r
+ \r
+/*[SetBreakErrorID:2]*/\r
+#undef IF_\r
+\r
+\r
+#endif // ENABLE_ERROR_BREAK_IN_ERROR_CLASS\r
+\r
+ \r
+/***********************************************************************\r
+ <<< [g_Error4_String] >>> \r
+************************************************************************/\r
+TCHAR g_Error4_String[4096];\r
+\r
+\r
+ \r
+/***********************************************************************\r
+ <<< [Error4_printf] >>> \r
+************************************************************************/\r
+void Error4_printf( const TCHAR* format, ... )\r
+{\r
+ va_list va;\r
+ va_start( va, format );\r
+ vstprintf_r( g_Error4_String, sizeof(g_Error4_String), format, va );\r
+ va_end( va );\r
+}\r
+\r
+\r
+ \r
+/***********************************************************************\r
+ <<< [Error4_getErrStr] >>> \r
+************************************************************************/\r
+void Error4_getErrStr( int ErrNum, TCHAR* out_ErrStr, size_t ErrStrSize )\r
+{\r
+ switch ( ErrNum ) {\r
+\r
+ case 0:\r
+ stprintf_r( out_ErrStr, ErrStrSize, _T("no error") );\r
+ break;\r
+\r
+ case E_FEW_ARRAY:\r
+ stprintf_r( out_ErrStr, ErrStrSize,\r
+ _T("<ERROR msg=\"\83v\83\8d\83O\83\89\83\80\93à\95\94\82Ì\94z\97ñ\83\81\83\82\83\8a\81[\82ª\95s\91«\82µ\82Ü\82µ\82½\81B\"/>") );\r
+ break;\r
+\r
+ case E_FEW_MEMORY:\r
+ stprintf_r( out_ErrStr, ErrStrSize,\r
+ _T("<ERROR msg=\"\83q\81[\83v\81E\83\81\83\82\83\8a\81[\82ª\95s\91«\82µ\82Ü\82µ\82½\81B\"/>") );\r
+ break;\r
+\r
+ #ifndef __linux__\r
+ case E_GET_LAST_ERROR: {\r
+ DWORD err_win;\r
+ TCHAR* str_pointer;\r
+\r
+ err_win = gs.WindowsLastError;\r
+ if ( err_win == 0 ) { err_win = GetLastError(); }\r
+\r
+ stprintf_part_r( out_ErrStr, ErrStrSize, out_ErrStr, &str_pointer,\r
+ _T("<ERROR GetLastError=\"0x%08X\" GetLastErrorStr=\""), err_win );\r
+ FormatMessage( FORMAT_MESSAGE_IGNORE_INSERTS | FORMAT_MESSAGE_FROM_SYSTEM,\r
+ NULL, err_win, LANG_USER_DEFAULT,\r
+ str_pointer, (TCHAR*)( (char*)out_ErrStr + ErrStrSize ) - str_pointer, NULL );\r
+ str_pointer = _tcschr( str_pointer, _T('\0') );\r
+ if ( *( str_pointer - 2 ) == _T('\r') && *( str_pointer - 1 ) == _T('\n') )\r
+ str_pointer -= 2;\r
+ stcpy_part_r( out_ErrStr, ErrStrSize, str_pointer, NULL, _T("\"/>"), NULL );\r
+ break;\r
+ }\r
+ #endif\r
+\r
+ default:\r
+ if ( g_Error4_String[0] != '\0' )\r
+ stprintf_r( out_ErrStr, ErrStrSize, _T("%s"), g_Error4_String );\r
+ else\r
+ stprintf_r( out_ErrStr, ErrStrSize, _T("<ERROR errnum=\"%d\"/>"), ErrNum );\r
+ break;\r
+ }\r
+}\r
+\r
+\r
+ \r
+/***********************************************************************\r
+ <<< [SaveWindowsLastError] >>> \r
+************************************************************************/\r
+errnum_t SaveWindowsLastError()\r
+{\r
+ gs.WindowsLastError = GetLastError();\r
+ return E_GET_LAST_ERROR;\r
+}\r
+\r
+\r
+ \r
+/***********************************************************************\r
+ <<< [Error4_showToStdErr] >>> \r
+************************************************************************/\r
+void Error4_showToStdErr( int err_num )\r
+{\r
+ TCHAR msg[1024];\r
+ #if _UNICODE\r
+ char msg2[1024];\r
+ #endif\r
+\r
+ if ( err_num != 0 ) {\r
+ Error4_getErrStr( err_num, msg, sizeof(msg) );\r
+ #if _UNICODE\r
+ setlocale( LC_ALL, ".OCP" );\r
+ sprintf_s( msg2, sizeof(msg2), "%S", msg );\r
+ fprintf( stderr, "%s\n", msg2 ); // _ftprintf_s \82Å\82Í\93ú\96{\8cê\82ª\8fo\82Ü\82¹\82ñ\r
+ #else\r
+ fprintf( stderr, "%s\n", msg );\r
+ #endif\r
+\r
+ #if ERR2_ENABLE_ERROR_BREAK\r
+ fprintf( stderr, "\81i\8aJ\94\8eÒ\82Ö\81j\83\81\83C\83\93\8aÖ\90\94\82Å SetBreakErrorID( %d ); \82ð\8cÄ\82Ñ\8fo\82µ\82Ä\82\82¾\82³\82¢\81B\n",\r
+ g_Err2.ErrID );\r
+ #else\r
+#if 0\r
+ if ( err_num == E_FEW_MEMORY || gs.WindowsLastError == ERROR_NOT_ENOUGH_MEMORY ) {\r
+ /* Not show the message for developper */\r
+ }\r
+ else {\r
+ fprintf( stderr, "\81i\8aJ\94\8eÒ\82Ö\81jERR2_ENABLE_ERROR_BREAK \82ð\92è\8b`\82µ\82Ä\8dÄ\83R\83\93\83p\83C\83\8b\82µ\82Ä\82\82¾\82³\82¢\81B\n" );\r
+ }\r
+#endif\r
+ #endif\r
+ }\r
+ IfErrThenBreak();\r
+}\r
+\r
+\r
+ \r
+/***********************************************************************\r
+ <<< [Error4_raiseErrno] >>> \r
+************************************************************************/\r
+#include <errno.h>\r
+\r
+int Error4_raiseErrno()\r
+{\r
+ int e, e2;\r
+ TCHAR msg[256];\r
+\r
+ e2 = _get_errno( &e );\r
+ if ( e2 != 0 ) { Error4_printf( _T("ERROR in _get_errno") ); return E_UNKNOWN; }\r
+ e2 = _tcserror_s( msg, sizeof(msg)/sizeof(TCHAR), e );\r
+ if ( e2 != 0 ) { Error4_printf( _T("ERROR in strerror_s") ); return E_UNKNOWN; }\r
+\r
+ Error4_printf( _T("ERROR (%d) %s\n"), e, msg );\r
+ return E_ERRNO;\r
+}\r
+\r
+\r
+ \r
+/*=================================================================*/\r
+/* <<< [StrT/StrT.c] >>> */ \r
+/*=================================================================*/\r
+ \r
+/***********************************************************************\r
+ <<< [StrT_cpy] >>> \r
+- _tcscpy is raising exception, if E_FEW_ARRAY\r
+************************************************************************/\r
+errnum_t StrT_cpy( TCHAR* Dst, size_t DstSize, const TCHAR* Src )\r
+{\r
+ size_t size;\r
+\r
+ size = ( _tcslen( Src ) + 1 ) * sizeof(TCHAR);\r
+ if ( size <= DstSize ) {\r
+ memcpy( Dst, Src, size );\r
+ return 0;\r
+ }\r
+ else {\r
+ memcpy( Dst, Src, DstSize - sizeof(TCHAR) );\r
+ *(TCHAR*)( (char*) Dst + DstSize ) = _T('\0');\r
+ return E_FEW_ARRAY;\r
+ }\r
+}\r
+\r
+ \r
+/***********************************************************************\r
+ <<< [MallocAndCopyString] >>> \r
+************************************************************************/\r
+errnum_t MallocAndCopyString( const TCHAR** out_NewString, const TCHAR* SourceString )\r
+{\r
+ TCHAR* str;\r
+ size_t size = ( _tcslen( SourceString ) + 1 ) * sizeof(TCHAR);\r
+\r
+ ASSERT_D( *out_NewString == NULL, __noop() );\r
+\r
+ str = (TCHAR*) malloc( size );\r
+ if ( str == NULL ) { return E_FEW_MEMORY; }\r
+\r
+ memcpy( str, SourceString, size );\r
+\r
+ *out_NewString = str;\r
+ return 0;\r
+}\r
+\r
+\r
+ \r
+/***********************************************************************\r
+ <<< [MallocAndCopyString_char] >>> \r
+************************************************************************/\r
+#ifdef _UNICODE\r
+errnum_t MallocAndCopyString_char( const TCHAR** out_NewString, const char* SourceString )\r
+{\r
+ TCHAR* str;\r
+ size_t size = ( strlen( SourceString ) + 1 ) * sizeof(TCHAR);\r
+ int r;\r
+\r
+ str = (TCHAR*) malloc( size );\r
+ if ( str == NULL ) { return E_FEW_MEMORY; }\r
+\r
+ r = MultiByteToWideChar( CP_OEMCP, MB_PRECOMPOSED, SourceString, -1, str, size / sizeof(TCHAR) );\r
+ IF ( r == 0 ) {\r
+ free( str );\r
+ return E_GET_LAST_ERROR;\r
+ }\r
+ *out_NewString = str;\r
+ return 0;\r
+}\r
+#endif\r
+\r
+\r
+ \r
+/***********************************************************************\r
+ <<< [MallocAndCopyStringByLength] >>> \r
+************************************************************************/\r
+errnum_t MallocAndCopyStringByLength( const TCHAR** out_NewString, const TCHAR* SourceString,\r
+ unsigned CountOfCharacter )\r
+{\r
+ TCHAR* str;\r
+ size_t size = ( CountOfCharacter + 1 ) * sizeof(TCHAR);\r
+\r
+ ASSERT_D( *out_NewString == NULL, __noop() );\r
+\r
+ str = (TCHAR*) malloc( size );\r
+ if ( str == NULL ) { return E_FEW_MEMORY; }\r
+\r
+ memcpy( str, SourceString, size - sizeof(TCHAR) );\r
+ str[ CountOfCharacter ] = _T('\0');\r
+\r
+ *out_NewString = str;\r
+ return 0;\r
+}\r
+\r
+\r
+ \r
+/***********************************************************************\r
+ <<< [StrT_chrs] >>> \r
+************************************************************************/\r
+TCHAR* StrT_chrs( const TCHAR* s, const TCHAR* keys )\r
+{\r
+ if ( *keys == _T('\0') ) return NULL;\r
+\r
+ for ( ; *s != _T('\0'); s++ ) {\r
+ if ( _tcschr( keys, *s ) != NULL )\r
+ return (TCHAR*) s;\r
+ }\r
+ return NULL;\r
+}\r
+\r
+\r
+ \r
+/***********************************************************************\r
+ <<< [StrT_rstr] >>> \r
+************************************************************************/\r
+TCHAR* StrT_rstr( const TCHAR* String, const TCHAR* SearchStart, const TCHAR* Keyword,\r
+ void* NullConfig )\r
+{\r
+ const TCHAR* p;\r
+ int keyword_length = _tcslen( Keyword );\r
+ TCHAR keyword_first = Keyword[0];\r
+\r
+ UNREFERENCED_VARIABLE( NullConfig );\r
+\r
+ p = SearchStart;\r
+ while ( p >= String ) {\r
+ if ( *p == keyword_first ) {\r
+ if ( _tcsncmp( p, Keyword, keyword_length ) == 0 ) {\r
+ return (TCHAR*) p;\r
+ }\r
+ }\r
+ p -= 1;\r
+ }\r
+\r
+ return NULL;\r
+}\r
+\r
+\r
+ \r
+/***********************************************************************\r
+ <<< [StrT_skip] >>> \r
+************************************************************************/\r
+TCHAR* StrT_skip( const TCHAR* s, const TCHAR* keys )\r
+{\r
+ if ( *keys == _T('\0') ) return (TCHAR*) s;\r
+\r
+ for ( ; *s != _T('\0'); s++ ) {\r
+ if ( _tcschr( keys, *s ) == NULL )\r
+ break;\r
+ }\r
+ return (TCHAR*) s;\r
+}\r
+\r
+\r
+ \r
+/***********************************************************************\r
+ <<< [StrT_isCIdentifier] >>> \r
+************************************************************************/\r
+bool StrT_isCIdentifier( TCHAR Character )\r
+{\r
+ const TCHAR c = Character;\r
+\r
+ return (\r
+ ( c >= _T('A') && c <= _T('Z') ) ||\r
+ ( c >= _T('a') && c <= _T('z') ) ||\r
+ ( c >= _T('0') && c <= _T('9') ) ||\r
+ c == _T('_') );\r
+}\r
+\r
+\r
+ \r
+/***********************************************************************\r
+ <<< [StrT_searchOverOfCIdentifier] >>> \r
+************************************************************************/\r
+TCHAR* StrT_searchOverOfCIdentifier( const TCHAR* Text )\r
+{\r
+ const TCHAR* p;\r
+ TCHAR c;\r
+\r
+ p = Text;\r
+ c = *p;\r
+ for (;;) {\r
+ if ( StrT_isCIdentifier( c ) ) {\r
+ p += 1;\r
+ c = *p;\r
+ }\r
+ else {\r
+ return (TCHAR*) p;\r
+ }\r
+ }\r
+}\r
+\r
+\r
+ \r
+/***********************************************************************\r
+ <<< [StrT_cmp_part] >>> \r
+************************************************************************/\r
+int StrT_cmp_part( const TCHAR* StringA_Start, const TCHAR* StringA_Over,\r
+ const TCHAR* StringB )\r
+{\r
+ const TCHAR* a;\r
+ const TCHAR* b;\r
+ TCHAR aa;\r
+ TCHAR bb;\r
+\r
+ a = StringA_Start;\r
+ b = StringB;\r
+\r
+ for (;;) {\r
+ if ( a >= StringA_Over ) {\r
+ bb = *b;\r
+ if ( bb == _T('\0') )\r
+ { return 0; }\r
+ else\r
+ { return -bb; }\r
+ }\r
+\r
+ aa = *a;\r
+ bb = *b;\r
+\r
+ if ( bb == _T('\0') )\r
+ { return aa; }\r
+\r
+ if ( aa != bb )\r
+ { return aa - bb; }\r
+\r
+ a += 1;\r
+ b += 1;\r
+ }\r
+}\r
+\r
+\r
+ \r
+/***********************************************************************\r
+ <<< [StrT_cmp_part2] >>> \r
+************************************************************************/\r
+int StrT_cmp_part2( const TCHAR* StringA_Start, const TCHAR* StringA_Over,\r
+ const TCHAR* StringB_Start, const TCHAR* StringB_Over )\r
+{\r
+ int length_A = StringA_Over - StringA_Start;\r
+ int length_B = StringB_Over - StringB_Start;\r
+\r
+ if ( length_A != length_B ) {\r
+ return length_A - length_B;\r
+ }\r
+ else {\r
+ return _tcsncmp( StringA_Start, StringB_Start, length_A );\r
+ }\r
+}\r
+\r
+\r
+ \r
+/***********************************************************************\r
+ <<< [StrT_refFName] >>> \r
+************************************************************************/\r
+TCHAR* StrT_refFName( const TCHAR* s )\r
+{\r
+ const TCHAR* p;\r
+ TCHAR c;\r
+\r
+ p = _tcschr( s, _T('\0') );\r
+\r
+ if ( p == s ) return (TCHAR*) s;\r
+\r
+ for ( p--; p>s; p-- ) {\r
+ c = *p;\r
+ if ( c == _T('\\') || c == _T('/') ) return (TCHAR*) p+1;\r
+ }\r
+ if ( *p == _T('\\') || *p == _T('/') ) return (TCHAR*) p+1;\r
+\r
+ return (TCHAR*) s;\r
+}\r
+ \r
+/***********************************************************************\r
+ <<< [StrT_refExt] >>> \r
+************************************************************************/\r
+TCHAR* StrT_refExt( const TCHAR* s )\r
+{\r
+ const TCHAR* p;\r
+\r
+ p = _tcschr( s, _T('\0') );\r
+\r
+ if ( p == s ) return (TCHAR*) s;\r
+\r
+ for ( p--; p>s; p-- ) {\r
+ if ( *p == _T('.') ) return (TCHAR*) p+1;\r
+ if ( *p == _T('/') || *p == _T('\\') ) return (TCHAR*) _tcschr( p, _T('\0') );\r
+ }\r
+ if ( *p == _T('.') ) return (TCHAR*) p+1;\r
+\r
+ return (TCHAR*) _tcschr( s, _T('\0') );\r
+}\r
+\r
+\r
+ \r
+/***********************************************************************\r
+ <<< [StrT_replace1] >>> \r
+************************************************************************/\r
+errnum_t StrT_replace1( TCHAR* in_out_String, TCHAR FromCharacter, TCHAR ToCharacter,\r
+ unsigned Opt )\r
+{\r
+ TCHAR* p;\r
+\r
+ UNREFERENCED_VARIABLE( Opt );\r
+\r
+ IF ( FromCharacter == _T('\0') ) { return E_OTHERS; }\r
+\r
+ p = in_out_String;\r
+ for (;;) {\r
+ p = _tcschr( p, FromCharacter );\r
+ if ( p == NULL ) { break; }\r
+ *p = ToCharacter;\r
+ p += 1;\r
+ }\r
+\r
+ return 0;\r
+}\r
+\r
+\r
+ \r
+/***********************************************************************\r
+ <<< [StrT_trim] >>> \r
+************************************************************************/\r
+errnum_t StrT_trim( TCHAR* out_Str, size_t out_Str_Size, const TCHAR* in_Str )\r
{\r
const TCHAR* p1;\r
const TCHAR* p2;\r
\r
\r
/***********************************************************************\r
+ <<< [StrT_parseCSV_f] >>> \r
+************************************************************************/\r
+errnum_t StrT_parseCSV_f( const TCHAR* StringOfCSV, bit_flags32_t* out_ReadFlags, const TCHAR* Types, ... )\r
+{\r
+ errnum_t e;\r
+ TCHAR type;\r
+ int types_index;\r
+ va_list va;\r
+ bool is_next_omittable;\r
+ bool is_next_omit;\r
+ const TCHAR* column_pointer;\r
+ TCHAR a_char;\r
+ TCHAR column[ 32 ];\r
+ bit_flags32_t read_flags;\r
+ bit_flags32_t next_read_flag;\r
+ TCHAR* out_str;\r
+ size_t str_size;\r
+\r
+\r
+ va_start( va, Types );\r
+ types_index = 0;\r
+ is_next_omittable = false;\r
+ column_pointer = StringOfCSV;\r
+ read_flags = 0;\r
+ next_read_flag = 1;\r
+ while ( column_pointer != NULL ) {\r
+ out_str = NULL;\r
+\r
+ type = Types[ types_index ];\r
+ switch ( type ) {\r
+ case _T('\0'):\r
+ goto exit_for;\r
+\r
+ case _T('+'):\r
+ is_next_omittable = true;\r
+ break;\r
+\r
+ case _T('s'):\r
+ out_str = va_arg( va, TCHAR* );\r
+ str_size = va_arg( va, size_t );\r
+ ASSERT_D( str_size >= 1, e=E_OTHERS; goto fin );\r
+ break;\r
+\r
+ default:\r
+ out_str = column;\r
+ str_size = sizeof( column );\r
+ break;\r
+ }\r
+\r
+ if ( out_str != NULL ) {\r
+\r
+ // Set "out_str" : Column string in CSV\r
+ column_pointer = StrT_skip( column_pointer, _T(" \t") );\r
+ a_char = *column_pointer;\r
+ if ( is_next_omittable && ( a_char == _T('\0') || a_char == _T(',') ) ) {\r
+ column_pointer = StrT_chrs( column_pointer, _T(",") );\r
+ if ( column_pointer != NULL ) { column_pointer += 1; }\r
+ is_next_omit = true;\r
+ } else {\r
+ e= StrT_meltCSV( out_str, str_size, &column_pointer ); IF(e){goto fin;}\r
+\r
+ is_next_omit = false;\r
+ read_flags |= next_read_flag;\r
+ }\r
+\r
+ switch ( type ) {\r
+ case _T('s'):\r
+ /* "va_arg" was already called */\r
+ break;\r
+\r
+ case _T('i'): {\r
+ int* pointer_of_int = va_arg( va, int* );\r
+\r
+ if ( ! is_next_omit ) {\r
+ *pointer_of_int = ttoi_ex( column, 0 );\r
+ }\r
+ break;\r
+ }\r
+ case _T('f'): {\r
+ double* pointer_of_double = va_arg( va, double* );\r
+\r
+ if ( ! is_next_omit ) {\r
+ *pointer_of_double = _tstof( column );\r
+ }\r
+ break;\r
+ }\r
+ case _T('b'): {\r
+ bool* pointer_of_bool = va_arg( va, bool* );\r
+ int strings_index;\r
+ static const TCHAR* strings[] = {\r
+ _T("1"), _T("true"), _T("yes"),\r
+ };\r
+\r
+ if ( ! is_next_omit ) {\r
+ *pointer_of_bool = false;\r
+ for ( strings_index = 0;\r
+ strings_index < _countof( strings );\r
+ strings_index += 1 )\r
+ {\r
+ if ( _tcsicmp( column, strings[ strings_index ] ) == 0 ) {\r
+ *pointer_of_bool = true;\r
+ break;\r
+ }\r
+ }\r
+ }\r
+ break;\r
+ }\r
+ case _T('t'): {\r
+ SYSTEMTIME* pointer_of_time = va_arg( va, SYSTEMTIME* );\r
+ int* pointer_of_bias = va_arg( va, int* );\r
+\r
+ if ( ! is_next_omit ) {\r
+ e= W3CDTF_toSYSTEMTIME( column, pointer_of_time, pointer_of_bias );\r
+ IF(e){goto fin;}\r
+ }\r
+ break;\r
+ }\r
+\r
+ default:\r
+ ASSERT_R( false, e=E_OTHERS; goto fin );\r
+ }\r
+\r
+ is_next_omittable = false;\r
+ next_read_flag <<= 1;\r
+ }\r
+\r
+ types_index += 1;\r
+ }\r
+exit_for:\r
+ if ( out_ReadFlags != NULL ) {\r
+ *out_ReadFlags = read_flags;\r
+ }\r
+\r
+ e=0;\r
+fin:\r
+ va_end( va );\r
+ return e;\r
+}\r
+\r
+\r
+ \r
+/***********************************************************************\r
<<< [StrT_getExistSymbols] >>> \r
************************************************************************/\r
errnum_t StrT_getExistSymbols( unsigned* out, bool bCase, const TCHAR* Str, const TCHAR* Symbols, ... )\r
int n_sym = 0;\r
const TCHAR* p;\r
\r
- UNREFERENCED_VARIABLES(( bCase ));\r
+ UNREFERENCED_VARIABLE( bCase );\r
\r
sym = (TCHAR*) malloc( sym_size ); IF(sym==NULL)goto err_fm;\r
\r
\r
\r
/***********************************************************************\r
- <<< [StrT_isAbsPath] >>> \r
+ <<< [W3CDTF_fromSYSTEMTIME] >>> \r
+************************************************************************/\r
+errnum_t W3CDTF_fromSYSTEMTIME( TCHAR* out_W3CDTF, size_t W3CDTF_ByteSize,\r
+ const SYSTEMTIME* Time, int TimeZoneMinute )\r
+{\r
+ errnum_t e;\r
+ TCHAR* char_pointer = out_W3CDTF;\r
+\r
+ e= stprintf_part_r( out_W3CDTF, W3CDTF_ByteSize, char_pointer, &char_pointer,\r
+ _T("%04d-%02d-%02dT%02d:%02d:%02d.%03d"),\r
+ Time->wYear, Time->wMonth, Time->wDay,\r
+ Time->wHour, Time->wMinute, Time->wSecond, Time->wMilliseconds );\r
+ IF(e){goto fin;}\r
+\r
+ e= W3CDTF_getTimeZoneDesignator( char_pointer,\r
+ GetStringSizeFromPointer( out_W3CDTF, W3CDTF_ByteSize, char_pointer ),\r
+ TimeZoneMinute ); IF(e){goto fin;}\r
+\r
+ e=0;\r
+fin:\r
+ return e;\r
+}\r
+\r
+\r
+ \r
+/***********************************************************************\r
+ <<< [W3CDTF_toSYSTEMTIME] >>> \r
+************************************************************************/\r
+errnum_t W3CDTF_toSYSTEMTIME( const TCHAR* String, SYSTEMTIME* out_Time, int* out_BiasMinute )\r
+{\r
+ errnum_t e;\r
+ size_t string_length = _tcslen( String );\r
+\r
+ /* 01234567890123456789012345678 */\r
+ /*"yyyy-mm-ddThh:mm:ss.sss+00:00"*/\r
+ /*"0000-00-00T00:00+00:00"*/\r
+\r
+ IF_D( out_BiasMinute == NULL ) { e=E_OTHERS; goto fin; }\r
+\r
+ /* With time */\r
+ if ( string_length >= 11 ) {\r
+ TCHAR a_char;\r
+ const TCHAR* time_zone;\r
+ int number;\r
+\r
+ IF ( String[10] != _T('T') ) { e=E_NOT_FOUND_SYMBOL; goto fin; }\r
+ IF ( String[4] != _T('-') || String[7] != _T('-') )\r
+ { e=E_NOT_FOUND_SYMBOL; goto fin; }\r
+\r
+ IF ( string_length < 16 ) { e=E_NOT_FOUND_SYMBOL; goto fin; }\r
+ IF ( String[13] != _T(':') ) { e=E_NOT_FOUND_SYMBOL; goto fin; }\r
+\r
+ out_Time->wYear = (WORD) _ttoi( &String[0] );\r
+ out_Time->wMonth = (WORD) _ttoi( &String[5] );\r
+ out_Time->wDayOfWeek = 0;\r
+ out_Time->wDay = (WORD) _ttoi( &String[8] );\r
+ out_Time->wHour = (WORD) _ttoi( &String[11] );\r
+ out_Time->wMinute = (WORD) _ttoi( &String[14] );\r
+\r
+ a_char = String[16];\r
+ if ( a_char == _T('+') || a_char == _T('-') || a_char == _T('Z') ) {\r
+ time_zone = &String[16];\r
+ out_Time->wSecond = 0;\r
+ out_Time->wMilliseconds = 0;\r
+ } else {\r
+ /* Second */\r
+ IF ( string_length < 19 ) { e=E_NOT_FOUND_SYMBOL; goto fin; }\r
+ IF ( a_char != _T(':') ) { e=E_NOT_FOUND_SYMBOL; goto fin; }\r
+ out_Time->wSecond = (WORD) _ttoi( &String[17] );\r
+\r
+\r
+ /* \8f¬\90\94\93_ */\r
+ a_char = String[19];\r
+ if ( a_char == _T('+') || a_char == _T('-') || a_char == _T('Z') ) {\r
+ time_zone = &String[19];\r
+ out_Time->wMilliseconds = 0;\r
+ }\r
+ else {\r
+ IF ( a_char != _T('.') ) { e=E_NOT_FOUND_SYMBOL; goto fin; }\r
+\r
+ out_Time->wMilliseconds = 0;\r
+\r
+ number = String[20] - _T('0');\r
+ if ( number < 0 || number > 9 ) {\r
+ time_zone = &String[20];\r
+ } else {\r
+ out_Time->wMilliseconds += (WORD)( number * 100 );\r
+\r
+ number = String[21] - _T('0');\r
+ if ( number < 0 || number > 9 ) {\r
+ time_zone = &String[21];\r
+ } else {\r
+ out_Time->wMilliseconds += (WORD)( number * 10 );\r
+\r
+ number = String[22] - _T('0');\r
+ if ( number < 0 || number > 9 ) {\r
+ time_zone = &String[22];\r
+ } else {\r
+ const TCHAR* pointer = &String[23];\r
+\r
+ out_Time->wMilliseconds += (WORD)( number * 1 );\r
+\r
+ for (;;) {\r
+ number = *pointer - _T('0');\r
+ if ( number < 0 || number > 9 )\r
+ { break; }\r
+\r
+ pointer += 1;\r
+ }\r
+ time_zone = pointer;\r
+ }\r
+ }\r
+ }\r
+\r
+ a_char = *time_zone;\r
+ IF ( ! ( a_char == _T('+') || a_char == _T('-') || a_char == _T('Z') ) )\r
+ { e=E_NOT_FOUND_SYMBOL; goto fin; }\r
+ }\r
+ }\r
+\r
+ /* Time zone */\r
+ if ( a_char == _T('Z') ) {\r
+ *out_BiasMinute = 0;\r
+ }\r
+ else {\r
+ size_t time_zone_length = string_length - ( time_zone - String );\r
+ int bias_minute;\r
+\r
+ IF ( time_zone_length < 6 ) { e=E_NOT_FOUND_SYMBOL; goto fin; }\r
+ IF ( time_zone[3] != _T(':') ) { e=E_NOT_FOUND_SYMBOL; goto fin; }\r
+\r
+ bias_minute = _ttoi( &time_zone[1] ) * 60 + _ttoi( &time_zone[4] );\r
+ if ( a_char == _T('-') ) { bias_minute = -bias_minute; }\r
+ *out_BiasMinute = bias_minute;\r
+ }\r
+ }\r
+\r
+ /* Without time */\r
+ else {\r
+ out_Time->wDayOfWeek = 0;\r
+ out_Time->wHour = 0;\r
+ out_Time->wMinute = 0;\r
+ out_Time->wSecond = 0;\r
+ out_Time->wMilliseconds = 0;\r
+ *out_BiasMinute = 0;\r
+\r
+ IF ( string_length < 4 ) { e=E_NOT_FOUND_SYMBOL; goto fin; }\r
+\r
+ /* Year */\r
+ out_Time->wYear = (WORD) _ttoi( &String[0] );\r
+\r
+ /* Month */\r
+ if ( string_length > 4 ) {\r
+ IF ( string_length < 7 ) { e=E_NOT_FOUND_SYMBOL; goto fin; }\r
+ IF ( String[4] != _T('-') ) { e=E_NOT_FOUND_SYMBOL; goto fin; }\r
+ out_Time->wMonth = (WORD) _ttoi( &String[5] );\r
+ } else {\r
+ out_Time->wMonth = 1;\r
+ }\r
+\r
+ /* Day */\r
+ if ( string_length > 7 ) {\r
+ IF ( string_length < 10 ) { e=E_NOT_FOUND_SYMBOL; goto fin; }\r
+ IF ( String[7] != _T('-') ) { e=E_NOT_FOUND_SYMBOL; goto fin; }\r
+ out_Time->wDay = (WORD) _ttoi( &String[8] );\r
+ } else {\r
+ out_Time->wDay = 1;\r
+ }\r
+ }\r
+\r
+ e=0;\r
+fin:\r
+ return e;\r
+}\r
+\r
+\r
+ \r
+/***********************************************************************\r
+ <<< [W3CDTF_getTimeZoneDesignator] >>> \r
+************************************************************************/\r
+errnum_t W3CDTF_getTimeZoneDesignator( TCHAR* out_TZD, size_t TZD_ByteSize,\r
+ int BiasMinute )\r
+{\r
+ errnum_t e;\r
+ TCHAR sign;\r
+ TIME_ZONE_INFORMATION time_zone;\r
+\r
+\r
+ /* Set "BiasMinute" */\r
+ if ( BiasMinute == W3CDTF_CURRENT_TIME_ZONE ) {\r
+ GetTimeZoneInformation( &time_zone );\r
+ BiasMinute = -time_zone.Bias;\r
+ }\r
+ else {\r
+ enum { minute_1day = 1440 };\r
+\r
+ IF_D ( BiasMinute < -minute_1day || BiasMinute > minute_1day )\r
+ { e=E_OTHERS; goto fin; }\r
+ }\r
+\r
+\r
+ /* Set "sign" */\r
+ if ( BiasMinute >= 0 ) {\r
+ sign = _T('+');\r
+ } else {\r
+ sign = _T('-');\r
+ BiasMinute = -BiasMinute;\r
+ }\r
+\r
+\r
+ /* Set "out_TZD" */\r
+ _stprintf_s( out_TZD, TZD_ByteSize / sizeof(TCHAR), _T("%c%02d:%02d"),\r
+ sign, BiasMinute / 60, BiasMinute % 60 );\r
+\r
+ e=0;\r
+fin:\r
+ return e;\r
+}\r
+\r
+\r
+ \r
+/***********************************************************************\r
+ <<< [StrT_isFullPath] >>> \r
************************************************************************/\r
-bool StrT_isAbsPath( const TCHAR* s )\r
+bool StrT_isFullPath( const TCHAR* path )\r
{\r
- const TCHAR* bs = _tcschr( s, _T('\\') );\r
- const TCHAR* sl = _tcschr( s, _T('/') );\r
- const TCHAR* co = _tcschr( s, _T(':') );\r
+ bool ret;\r
+\r
+ if ( path[0] == _T('\\') && path[1] == _T('\\') ) {\r
+ ret = true;\r
+ } else {\r
+ const TCHAR* back_slash = _tcschr( path, _T('\\') );\r
+ const TCHAR* slash = _tcschr( path, _T('/') );\r
+ const TCHAR* colon = _tcschr( path, _T(':') );\r
\r
- return ( co != NULL && ( bs == co+1 || sl == co+1 ) );\r
+ ret = ( colon != NULL ) &&\r
+ ( back_slash == colon + 1 || slash == colon + 1 );\r
+ }\r
+\r
+ return ret;\r
}\r
\r
\r
/**************************************************************************\r
- <<< [StrT_getAbsPath_part] >>> \r
+ <<< [StrT_getFullPath_part] >>> \r
*************************************************************************/\r
-errnum_t StrT_getAbsPath_part( TCHAR* out_AbsPath, size_t AbsPathSize, TCHAR* OutStart,\r
+errnum_t StrT_getFullPath_part( TCHAR* out_FullPath, size_t FullPathSize, TCHAR* OutStart,\r
TCHAR** out_OutLast, const TCHAR* StepPath, const TCHAR* BasePath )\r
{\r
errnum_t e;\r
TCHAR separator = (TCHAR) DUMMY_INITIAL_VALUE_TCHAR;\r
const TCHAR* separator_path;\r
- TCHAR* out_abs_path_over = (TCHAR*)( (uint8_t*) out_AbsPath + AbsPathSize );\r
+ TCHAR* out_full_path_over = (TCHAR*)( (uint8_t*) out_FullPath + FullPathSize );\r
TCHAR* null_position = NULL;\r
\r
\r
#if CHECK_ARG\r
- /* "BasePath" must be out of "out_AbsPath" */\r
- ASSERT_R( BasePath < out_AbsPath ||\r
- (uint8_t*) BasePath >= (uint8_t*) out_AbsPath + AbsPathSize,\r
+ /* "BasePath" must be out of "out_FullPath" */\r
+ ASSERT_R( BasePath < out_FullPath ||\r
+ (uint8_t*) BasePath >= (uint8_t*) out_FullPath + FullPathSize,\r
goto err );\r
#endif\r
\r
\r
- /* If "StepPath" == "", out_AbsPath = "" */\r
+ /* If "StepPath" == "", out_FullPath = "" */\r
if ( StepPath[0] == _T('\0') ) {\r
- ASSERT_R( AbsPathSize >= sizeof(TCHAR), goto err_fm );\r
- out_AbsPath[0] = _T('\0');\r
+ ASSERT_R( FullPathSize >= sizeof(TCHAR), goto err_fm );\r
+ out_FullPath[0] = _T('\0');\r
e=0; goto fin;\r
}\r
\r
\r
/* Set "OutStart" */\r
if ( OutStart == NULL )\r
- { OutStart = out_AbsPath; }\r
+ { OutStart = out_FullPath; }\r
\r
\r
/* Set "separator" : \ or / from "BasePath" */\r
- if ( StrT_isAbsPath( StepPath ) ) {\r
+ if ( StrT_isFullPath( StepPath ) ) {\r
separator_path = StepPath;\r
}\r
else if ( BasePath == NULL ) {\r
\r
\r
/* Set "OutStart" : "BasePath" + / + "StepPath" */\r
- if ( StrT_isAbsPath( StepPath ) ) {\r
+ if ( StrT_isFullPath( StepPath ) ) {\r
size_t step_path_length = _tcslen( StepPath );\r
\r
- IF( OutStart + step_path_length >= out_abs_path_over ) goto err_fa;\r
+ IF( OutStart + step_path_length >= out_full_path_over ) goto err_fa;\r
memmove( OutStart, StepPath, ( step_path_length + 1 ) * sizeof(TCHAR) );\r
\r
/* Set "null_position" */\r
}\r
\r
p = OutStart + base_path_length + 1;\r
- IF( p + step_path_length >= out_abs_path_over ) goto err_fa;\r
+ IF( p + step_path_length >= out_full_path_over ) goto err_fa;\r
memmove( p, StepPath, ( step_path_length + 1 ) * sizeof(TCHAR) );\r
- /* memmove is for "out_AbsPath" == "StepPath" */\r
+ /* memmove is for "out_FullPath" == "StepPath" */\r
\r
if ( BasePath == NULL ) {\r
GetCurrentDirectory( base_path_length + 1, OutStart );\r
/* Add root / */\r
if ( null_position - 1 >= OutStart ) {\r
if ( *( null_position - 1 ) == _T(':') ) {\r
- IF( null_position + 1 >= out_abs_path_over ) goto err_fa;\r
+ IF( null_position + 1 >= out_full_path_over ) goto err_fa;\r
\r
*( null_position + 0 ) = separator;\r
*( null_position + 1 ) = _T('\0');\r
\r
\r
/***********************************************************************\r
- <<< [StrT_getParentAbsPath_part] >>> \r
+ <<< [StrT_allocateFullPath] >>> \r
+************************************************************************/\r
+errnum_t StrT_allocateFullPath( TCHAR** out_FullPath, const TCHAR* StepPath, TCHAR* BasePath )\r
+{\r
+ errnum_t e;\r
+ int step_path_length = _tcslen( StepPath );\r
+ int base_path_length;\r
+ int full_path_size;\r
+\r
+ if ( BasePath == NULL ) {\r
+ base_path_length = GetCurrentDirectory( 0, NULL ) - 1;\r
+ } else {\r
+ base_path_length = _tcslen( BasePath );\r
+ }\r
+\r
+ full_path_size = ( step_path_length + 1 + base_path_length + 1 ) * sizeof(TCHAR);\r
+\r
+ e= HeapMemory_allocateBytes( out_FullPath, full_path_size ); IF(e){goto fin;}\r
+ e= StrT_getFullPath( *out_FullPath, full_path_size, StepPath, BasePath ); IF(e){goto fin;}\r
+\r
+ e=0;\r
+fin:\r
+ return e;\r
+}\r
+\r
+\r
+ \r
+/***********************************************************************\r
+ <<< [StrT_getParentFullPath_part] >>> \r
************************************************************************/\r
-errnum_t StrT_getParentAbsPath_part( TCHAR* Str, size_t StrSize, TCHAR* StrStart,\r
+errnum_t StrT_getParentFullPath_part( TCHAR* Str, size_t StrSize, TCHAR* StrStart,\r
TCHAR** out_StrLast, const TCHAR* StepPath, const TCHAR* BasePath )\r
{\r
errnum_t e;\r
}\r
\r
/* \90â\91Î\83p\83X\82É\82·\82é */\r
- e= StrT_getAbsPath( StrStart,\r
+ e= StrT_getFullPath( StrStart,\r
StrSize - ( (char*)StrStart - (char*)Str ),\r
StepPath, BasePath ); IF(e)goto fin;\r
\r
<<< [StrT_getStepPath] >>> \r
************************************************************************/\r
errnum_t StrT_getStepPath( TCHAR* out_StepPath, size_t StepPathSize,\r
- const TCHAR* AbsPath, const TCHAR* BasePath )\r
+ const TCHAR* FullPath, const TCHAR* BasePath )\r
{\r
errnum_t e;\r
const TCHAR* abs_pointer;\r
TCHAR base_path_2[ MAX_PATH ];\r
\r
\r
- ASSERT_D( out_StepPath != AbsPath, goto err );\r
+ ASSERT_D( out_StepPath != FullPath, goto err );\r
\r
- abs_pointer = AbsPath;\r
+ abs_pointer = FullPath;\r
\r
\r
/* Set "base_pointer" */\r
\r
if ( abs_char == _T('\0') ) {\r
\r
- /* out_StepPath = ".", if AbsPath == BasePath */\r
+ /* out_StepPath = ".", if FullPath == BasePath */\r
if ( base_char == _T('\0') ) {\r
e= StrT_cpy( out_StepPath, StepPathSize, _T(".") ); IF(e)goto fin;\r
e=0; goto fin;\r
}\r
\r
\r
- /* AbsPath \82Æ BasePath \82Ì\8aÖ\8cW\82ª\81A\95Ð\95û\82Ì\88ê\95\94\82ª\82à\82¤\95Ð\95û\82Ì\91S\91Ì\82Å\82 \82é\82Æ\82« */\r
+ /* FullPath \82Æ BasePath \82Ì\8aÖ\8cW\82ª\81A\95Ð\95û\82Ì\88ê\95\94\82ª\82à\82¤\95Ð\95û\82Ì\91S\91Ì\82Å\82 \82é\82Æ\82« */\r
if ( abs_char == _T('/') || abs_char == _T('\\') ||\r
base_char == _T('/') || base_char == _T('\\') ) {\r
/* other character is '\0' */\r
}\r
\r
\r
- /* out_StepPath = AbsPath, if there is not same folder */\r
+ /* out_StepPath = FullPath, if there is not same folder */\r
if ( separator == 0 ) {\r
- e= StrT_cpy( out_StepPath, StepPathSize, AbsPath ); IF(e)goto fin;\r
+ e= StrT_cpy( out_StepPath, StepPathSize, FullPath ); IF(e)goto fin;\r
e=0; goto fin;\r
}\r
\r
}\r
\r
\r
- /* Copy a part of "AbsPath" to "out_StepPath" */\r
+ /* Copy a part of "FullPath" to "out_StepPath" */\r
if ( StrT_isOverOfFileName( abs_separator_pointer ) ) {\r
ASSERT_D( step_pointer > out_StepPath, goto err );\r
*( step_pointer - 1 ) = _T('\0');\r
const TCHAR* period_pos_in_add = _tcsrchr( AddName, _T('.') ); // > term_pos_in_add\r
\r
\r
- MEMSET_TO_NOT_INIT( out_Path, PathSize );\r
+ DISCARD_BYTES( out_Path, PathSize );\r
\r
\r
//=== term_pos_in_base\r
/*[StrArr_finish]*/\r
errnum_t StrArr_finish( StrArr* self, errnum_t e )\r
{\r
- if ( ! Set2_isInited( &self->Array ) ) return 0;\r
+ if ( ! Set2_isInited( &self->Array ) ) return e;\r
\r
e= Set2_finish( &self->Array, e );\r
e= Strs_finish( &self->Chars, e );\r
\r
\r
/*=================================================================*/\r
+/* <<< [DebugTools/DebugTools.c] >>> */ \r
+/*=================================================================*/\r
+ \r
+/***********************************************************************\r
+ <<< [TestableDebugBreak] >>> \r
+************************************************************************/\r
+typedef struct _TestableDebugBreakClass TestableDebugBreakClass;\r
+struct _TestableDebugBreakClass {\r
+ bool IsDisableTestableDebugBreak;\r
+ volatile int DebugBreakCount;\r
+ CRITICAL_SECTION Critical;\r
+ SingletonInitializerClass Initializer;\r
+};\r
+static TestableDebugBreakClass gs_TestableDebugBreak = { false, 0 };\r
+\r
+\r
+/*[SetTestableDebugBreak]*/\r
+void SetTestableDebugBreak( bool IsEnableBreak )\r
+{\r
+ TestableDebugBreakClass* self = &gs_TestableDebugBreak;\r
+ self->IsDisableTestableDebugBreak = ! IsEnableBreak;\r
+}\r
+\r
+/*[TestableDebugBreak_Sub]*/\r
+int TestableDebugBreak_Sub()\r
+{\r
+ TestableDebugBreakClass* self = &gs_TestableDebugBreak;\r
+\r
+ if ( ! SingletonInitializerClass_isInitialized( &self->Initializer ) ) {\r
+ if ( SingletonInitializerClass_isFirst( &self->Initializer ) ) {\r
+\r
+ InitializeCriticalSection( &self->Critical );\r
+\r
+ SingletonInitializerClass_onFinishedInitialize( &self->Initializer, 0 );\r
+ }\r
+ }\r
+\r
+ EnterCriticalSection( &self->Critical );\r
+ self->DebugBreakCount += 1;\r
+ LeaveCriticalSection( &self->Critical );\r
+\r
+ return ! self->IsDisableTestableDebugBreak;\r
+}\r
+\r
+/*[GetDebugBreakCount]*/\r
+int GetDebugBreakCount()\r
+{\r
+ TestableDebugBreakClass* self = &gs_TestableDebugBreak;\r
+ return self->DebugBreakCount;\r
+}\r
+\r
+\r
+ \r
+/*=================================================================*/\r
/* <<< [SetX/SetX.c] >>> */ \r
/*=================================================================*/\r
\r
}\r
\r
/***********************************************************************\r
- <<< [Set2_finish] >>> \r
+ <<< [Set2_finish] >>> \r
+************************************************************************/\r
+int Set2_finish( Set2* m, int e )\r
+{\r
+ if ( m->First != NULL ) { free( m->First ); m->First = NULL; }\r
+ return e;\r
+}\r
+\r
+ \r
+/***********************************************************************\r
+ <<< [Set2_ref_imp] >>> \r
+************************************************************************/\r
+int Set2_ref_imp( Set2* m, int iElem, void* out_pElem, size_t ElemSize )\r
+{\r
+ int e;\r
+ char* p;\r
+\r
+ IF( iElem < 0 ) goto err_ns;\r
+ p = (char*) m->First + ( (unsigned)iElem * ElemSize );\r
+ IF( p >= (char*)m->Next ) goto err_ns;\r
+ *(char**)out_pElem = p;\r
+\r
+ e=0;\r
+fin:\r
+ return e;\r
+\r
+err_ns: e = E_NOT_FOUND_SYMBOL; goto fin;\r
+}\r
+\r
+\r
+ \r
+/***********************************************************************\r
+ <<< [Set2_getIterator] >>> \r
+************************************************************************/\r
+errnum_t Set2_getIterator( Set2* self, Set2_IteratorClass* out_Iterator, int ElementSize )\r
+{\r
+ out_Iterator->Parent = self;\r
+ out_Iterator->ElementSize = ElementSize;\r
+ out_Iterator->Current = (uint8_t*) self->First - ElementSize;\r
+ return 0;\r
+}\r
+\r
+\r
+ \r
+/***********************************************************************\r
+ <<< [Set2_getDescendingIterator] >>> \r
+************************************************************************/\r
+errnum_t Set2_getDescendingIterator( Set2* self, Set2_IteratorClass* out_Iterator, int ElementSize )\r
+{\r
+ out_Iterator->Parent = self;\r
+ out_Iterator->ElementSize = ElementSize;\r
+ out_Iterator->Current = (uint8_t*) self->Next;\r
+ return 0;\r
+}\r
+\r
+\r
+ \r
+/***********************************************************************\r
+ <<< [Set2_IteratorClass_getNext] >>> \r
************************************************************************/\r
-int Set2_finish( Set2* m, int e )\r
+void* Set2_IteratorClass_getNext( Set2_IteratorClass* self )\r
{\r
- if ( m->First != NULL ) { free( m->First ); m->First = NULL; }\r
- return e;\r
+ uint8_t* next = self->Current + self->ElementSize;\r
+\r
+ if ( next >= (uint8_t*) self->Parent->Next ) {\r
+ return NULL;\r
+ } else {\r
+ self->Current = next;\r
+ return next;\r
+ }\r
}\r
\r
+\r
\r
/***********************************************************************\r
- <<< [Set2_ref_imp] >>> \r
+ <<< [Set2_IteratorClass_getPrevious] >>> \r
************************************************************************/\r
-int Set2_ref_imp( Set2* m, int iElem, void* out_pElem, size_t ElemSize )\r
+void* Set2_IteratorClass_getPrevious( Set2_IteratorClass* self )\r
{\r
- int e;\r
- char* p;\r
-\r
- IF( iElem < 0 ) goto err_ns;\r
- p = (char*) m->First + ( (unsigned)iElem * ElemSize );\r
- IF( p >= (char*)m->Next ) goto err_ns;\r
- *(char**)out_pElem = p;\r
-\r
- e=0;\r
-fin:\r
- return e;\r
+ uint8_t* previous = self->Current - self->ElementSize;\r
\r
-err_ns: e = E_NOT_FOUND_SYMBOL; goto fin;\r
+ if ( previous < (uint8_t*) self->Parent->First ) {\r
+ return NULL;\r
+ } else {\r
+ self->Current = previous;\r
+ return previous;\r
+ }\r
}\r
\r
\r
*(void**)pp = m->Next;\r
m->Next = (char*) m->Next + size;\r
\r
- MEMSET_TO_NOT_INIT( *(void**)pp, size );\r
+ DISCARD_BYTES( *(void**)pp, size );\r
\r
e=0;\r
fin:\r
/***********************************************************************\r
<<< [Set2_expandIfOverByAddr_imp] >>> \r
************************************************************************/\r
-int Set2_expandIfOverByAddr_imp( Set2* m, void* OverAddrBasedOnNowFirst )\r
+errnum_t Set2_expandIfOverByAddr_imp( Set2* m, void* OverAddrBasedOnNowFirst )\r
{\r
+ errnum_t e;\r
void* new_first;\r
unsigned offset_of_over;\r
unsigned offset_of_next;\r
\r
- if ( OverAddrBasedOnNowFirst <= m->Over ) return E_OTHERS;\r
+ if ( OverAddrBasedOnNowFirst <= m->Over ) { e=E_OTHERS; goto fin; }\r
\r
offset_of_next = (unsigned)( (char*)OverAddrBasedOnNowFirst - (char*)m->First );\r
offset_of_over = (unsigned)( ( (char*)m->Over - (char*)m->First ) ) * 2;\r
- IF_D( offset_of_next >= 0x80000000 ) goto err;\r
- while ( offset_of_over < offset_of_next ) offset_of_over *= 2;\r
- IF( offset_of_over >= 0x10000000 ) goto err;\r
+ IF_D( offset_of_next >= 0x80000000 ) { e=E_OTHERS; goto fin; }\r
+ IF_D( offset_of_over == 0 ) { e=E_OTHERS; goto fin; }\r
+ while ( offset_of_over < offset_of_next ) { offset_of_over *= 2; }\r
+ IF( offset_of_over >= 0x10000000 ) { e=E_OTHERS; goto fin; }\r
\r
new_first = realloc( m->First, offset_of_over * 2 );\r
- IF( new_first == NULL ) goto err_fm;\r
+ IF( new_first == NULL ) { e=E_FEW_MEMORY; goto fin; }\r
\r
m->Next = (char*) new_first + ( (char*)m->Next - (char*)m->First );\r
m->Over = (char*) new_first + offset_of_over * 2;\r
{ *m->PointerOfDebugArray = m->First; }\r
#endif\r
\r
- return 0;\r
-\r
-err: return E_OTHERS;\r
-err_fm: return E_FEW_MEMORY;\r
+ e=0;\r
+fin:\r
+ return e;\r
}\r
\r
+\r
\r
/***********************************************************************\r
<<< [Set2_separate] >>> \r
void* p = m->First;\r
\r
if ( NextSize == 0 ) {\r
- MEMSET_TO_NOT_INIT( m, sizeof(*m) );\r
m->First = NULL;\r
}\r
else {\r
\r
\r
/***********************************************************************\r
+ <<< [Set2_pop_imp] >>> \r
+************************************************************************/\r
+int Set2_pop_imp( Set2* m, void* pp, size_t size )\r
+{\r
+ int e;\r
+ void* p;\r
+\r
+ p = (char*) m->Next - size;\r
+\r
+ IF ( p < m->First ) { e=E_OTHERS; goto fin; }\r
+\r
+ m->Next = p;\r
+ *(void**)pp = p;\r
+\r
+ e=0;\r
+fin:\r
+ return e;\r
+}\r
+\r
+\r
+ \r
+/***********************************************************************\r
<<< [Set2_setDebug] >>> \r
************************************************************************/\r
#ifdef _DEBUG\r
-void Set2_setDebug( Set2* m, void** PointerOfDebugArray )\r
+void Set2_setDebug( Set2* m, void* PointerOfDebugArray )\r
{\r
m->PointerOfDebugArray = PointerOfDebugArray;\r
*m->PointerOfDebugArray = m->First;\r
return e;\r
}\r
\r
+\r
\r
/*=================================================================*/\r
-/* <<< [Error4/Error4.c] >>> */ \r
+/* <<< [Lock_1/Lock_1.c] >>> */ \r
/*=================================================================*/\r
\r
-/***********************************************************************\r
- <<< [Get_Error4_Variables] >>> \r
-************************************************************************/\r
-static Error4_VariablesClass gs;\r
-#ifdef _DEBUG\r
- extern Error4_VariablesClass* g_Error4_Variables = &gs;\r
-#endif\r
-\r
-Error4_VariablesClass* Get_Error4_Variables()\r
-{\r
- return &gs;\r
-}\r
-\r
-\r
- \r
-/***********************************************************************\r
- <<< [SetBreakErrorID] >>> \r
-************************************************************************/\r
-#if ERR2_ENABLE_ERROR_BREAK\r
-\r
-dll_global_g_DebugBreakCount Err2 g_Err2; /* \8f\89\8aú\92l\82Í\82·\82×\82Ä\83[\83\8d */\r
-\r
-void SetBreakErrorID( int ID )\r
-{\r
- Err2* m = &g_Err2;\r
-\r
- m->BreakErrID = ID;\r
-}\r
-\r
-\r
-int TryOnIfTrue_imp( const char* FilePath, int LineNum )\r
- // \95Ô\82è\92l\82Í\81A\83u\83\8c\81[\83N\82·\82é\82©\82Ç\82¤\82©\r
-{\r
- //=== \83G\83\89\81[\8e\9e\82Ì\92\86\92f\8f\88\97\9d\81i\83W\83\83\83\93\83v\81j\82ð\82µ\82Ä\82¢\82é\82Æ\82«\r
- if ( g_Err2.IsErr ) return 0;\r
-\r
-\r
- //=== \83G\83\89\81[\82ª\8f\89\82ß\82Ä\8bN\82«\82½\82Æ\82«\r
- else {\r
- Err2* m = &g_Err2;\r
-\r
- m->IsErr = 1;\r
- m->ErrID ++;\r
- m->FilePath = FilePath;\r
- m->LineNum = LineNum;\r
-\r
- #if ERR2_ENABLE_ERROR_LOG\r
- printf( "<ERRORLOG msg=\"raised\" err_id=\"%d\" g_err2=\"0x%08X\"/>\n", m->ErrID, (int) m );\r
- #endif\r
-\r
- return ( m->ErrID == m->BreakErrID );\r
- }\r
-}\r
-\r
-\r
-//[ClearError]\r
-void ClearError()\r
-{\r
- Err2* m = &g_Err2;\r
-\r
- #if ERR2_ENABLE_ERROR_LOG\r
- if ( m->IsErr != 0 )\r
- printf( "<ERRORLOG msg=\"cleared\" err_id=\"%d\" g_err2=\"0x%08X\"/>\n", m->ErrID, (int) m );\r
- #endif\r
-\r
- m->IsErr = 0;\r
-}\r
+/*-------------------------------------------------------------------------*/\r
+/* <<<< ### (SingletonInitializerClass) implement >>>> */ \r
+/*-------------------------------------------------------------------------*/\r
\r
\r
-//[IsErrorMode]\r
-bool IsErrorMode()\r
-{\r
- return ( g_Err2.IsErr != 0 );\r
-}\r
+volatile int g_SingletonInitializerClass_FailSleepTime = SingletonInitializerClass_FailSleepTime;\r
\r
\r
-//[IfErrThenBreak]\r
-void IfErrThenBreak()\r
+/*[SingletonInitializerClass_isFirst]*/\r
+bool SingletonInitializerClass_isFirst( SingletonInitializerClass* self )\r
{\r
- if ( g_Err2.IsErr && ( g_Err2.ErrID != g_Err2.BreakErrID || g_Err2.BreakErrID == 0 ) ) { TestableDebugBreak();\r
- // \83E\83H\83b\83`\82Å\81Ag_Err2.ErrID \82Ì\92l(N\82Æ\82·\82é)\82ð\8am\94F\82µ\82Ä\81A\r
- // \83\81\83C\83\93\8aÖ\90\94\82Å SetBreakErrorID( N ); \82ð\8cÄ\82Ñ\8fo\82µ\82Ä\82\82¾\82³\82¢\81B\r
- // \83G\83\89\81[\82ª\94\90¶\82µ\82½\8fê\8f\8a\82Í\81Ag_Err2.FilePath, g_Err2.LineNum \82Å\82·\81B\r
- // \90³\8fí\8fI\97¹\82µ\82Ä\82¢\82é\82Â\82à\82è\82È\82Ì\82É\82±\82±\82Å\83u\83\8c\81[\83N\82·\82é\82Æ\82«\82Í\81A\r
- // ClearError() \82ð\96Y\82ê\82Ä\82¢\82é\89Â\94\\90«\82ª\82 \82è\82Ü\82·\81B\r
- #if ERR2_ENABLE_ERROR_LOG\r
- printf( "<ERRORLOG msg=\"IfErrThenBreak\" ErrID=\"%d\" BreakErrID=\"%d\"/>\n", g_Err2.ErrID, g_Err2.BreakErrID );\r
- #endif\r
-\r
- {\r
- char str[512];\r
- sprintf_s( str, _countof(str), "<ERROR file=\"%s(%d)\"/>\n", g_Err2.FilePath, g_Err2.LineNum );\r
- OutputDebugStringA( str );\r
+ for (;;) {\r
+ if ( InterlockedCompareExchange( &self->InitializeStep, 1, 0 ) == 0 ) {\r
+ return true;\r
}\r
- }\r
- ClearError();\r
-}\r
-\r
-//[PushErr]\r
-void PushErr( ErrStackAreaClass* ErrStackArea )\r
-{\r
- ErrStackArea->ErrID = g_Err2.ErrID;\r
- ErrStackArea->IsErr = g_Err2.IsErr;\r
- g_Err2.IsErr = 0;\r
-}\r
-\r
-//[PopErr]\r
-void PopErr( ErrStackAreaClass* ErrStackArea )\r
-{\r
- if ( ErrStackArea->IsErr )\r
- g_Err2.IsErr = 1;\r
-}\r
-\r
-\r
-#endif // ERR2_ENABLE_ERROR_BREAK\r
-\r
- \r
-/***********************************************************************\r
- <<< [g_Error4_String] >>> \r
-************************************************************************/\r
-TCHAR g_Error4_String[4096];\r
-\r
-\r
- \r
-/***********************************************************************\r
- <<< [Error4_printf] >>> \r
-************************************************************************/\r
-void Error4_printf( const TCHAR* format, ... )\r
-{\r
- va_list va;\r
- va_start( va, format );\r
- vstprintf_r( g_Error4_String, sizeof(g_Error4_String), format, va );\r
- va_end( va );\r
-}\r
-\r
-\r
- \r
-/***********************************************************************\r
- <<< [Error4_getErrStr] >>> \r
-************************************************************************/\r
-void Error4_getErrStr( int ErrNum, TCHAR* out_ErrStr, size_t ErrStrSize )\r
-{\r
- switch ( ErrNum ) {\r
-\r
- case 0:\r
- stprintf_r( out_ErrStr, ErrStrSize, _T("no error") );\r
- break;\r
-\r
- #ifndef __linux__\r
- case E_GET_LAST_ERROR: {\r
- DWORD err_win;\r
- TCHAR* str_pointer;\r
+ else {\r
+ while ( self->InitializeStep == 1 ) {\r
+ Sleep( 0 ); /* Wait for initialized by other thread. */\r
+ }\r
\r
- err_win = gs.WindowsLastError;\r
- if ( err_win == 0 ) { err_win = GetLastError(); }\r
+ if ( self->InitializeStep == 2 ) {\r
+ return false;\r
+ }\r
\r
- stprintf_part_r( out_ErrStr, ErrStrSize, out_ErrStr, &str_pointer,\r
- _T("<ERROR GetLastError=\"0x%08X\" GetLastErrorStr=\""), err_win );\r
- FormatMessage( FORMAT_MESSAGE_IGNORE_INSERTS | FORMAT_MESSAGE_FROM_SYSTEM,\r
- NULL, err_win, LANG_USER_DEFAULT,\r
- str_pointer, (TCHAR*)( (char*)out_ErrStr + ErrStrSize ) - str_pointer, NULL );\r
- str_pointer = _tcschr( str_pointer, _T('\0') );\r
- if ( *( str_pointer - 2 ) == _T('\r') && *( str_pointer - 1 ) == _T('\n') )\r
- str_pointer -= 2;\r
- stcpy_part_r( out_ErrStr, ErrStrSize, str_pointer, NULL, _T("\"/>"), NULL );\r
- break;\r
+ Sleep( g_SingletonInitializerClass_FailSleepTime );\r
+ g_SingletonInitializerClass_FailSleepTime = 0;\r
}\r
- #endif\r
-\r
- default:\r
- if ( g_Error4_String[0] != '\0' )\r
- stprintf_r( out_ErrStr, ErrStrSize, _T("%s"), g_Error4_String );\r
- else\r
- stprintf_r( out_ErrStr, ErrStrSize, _T("<ERROR errnum=\"%d\"/>"), ErrNum );\r
- break;\r
}\r
}\r
\r
\r
- \r
-/***********************************************************************\r
- <<< [SaveWindowsLastError] >>> \r
-************************************************************************/\r
-errnum_t SaveWindowsLastError()\r
+/*[SingletonInitializerClass_onFinishedInitialize]*/\r
+void SingletonInitializerClass_onFinishedInitialize( SingletonInitializerClass* self, errnum_t e )\r
{\r
- gs.WindowsLastError = GetLastError();\r
- return E_GET_LAST_ERROR;\r
+ if ( e == 0 )\r
+ { self->InitializeStep = 2; }\r
+ else\r
+ { self->InitializeStep = 0; }\r
}\r
\r
\r
- \r
-/***********************************************************************\r
- <<< [Error4_showToStdErr] >>> \r
-************************************************************************/\r
-void Error4_showToStdErr( int err_num )\r
+/*[SingletonInitializerClass_isInitialized]*/\r
+bool SingletonInitializerClass_isInitialized( SingletonInitializerClass* self )\r
{\r
- TCHAR msg[1024];\r
- #if _UNICODE\r
- char msg2[1024];\r
- #endif\r
-\r
- if ( err_num != 0 ) {\r
- Error4_getErrStr( err_num, msg, sizeof(msg) );\r
- #if _UNICODE\r
- setlocale( LC_ALL, ".OCP" );\r
- sprintf_s( msg2, sizeof(msg2), "%S", msg );\r
- fprintf( stderr, "%s\n", msg2 ); // _ftprintf_s \82Å\82Í\93ú\96{\8cê\82ª\8fo\82Ü\82¹\82ñ\r
- #else\r
- fprintf( stderr, "%s\n", msg );\r
- #endif\r
-\r
- #if ERR2_ENABLE_ERROR_BREAK\r
- fprintf( stderr, "\81i\8aJ\94\8eÒ\82Ö\81j\83\81\83C\83\93\8aÖ\90\94\82Å SetBreakErrorID( %d ); \82ð\8cÄ\82Ñ\8fo\82µ\82Ä\82\82¾\82³\82¢\81B\n",\r
- g_Err2.ErrID );\r
- #else\r
-#if 0\r
- if ( err_num == E_FEW_MEMORY || gs.WindowsLastError == ERROR_NOT_ENOUGH_MEMORY ) {\r
- /* Not show the message for developper */\r
- }\r
- else {\r
- fprintf( stderr, "\81i\8aJ\94\8eÒ\82Ö\81jERR2_ENABLE_ERROR_BREAK \82ð\92è\8b`\82µ\82Ä\8dÄ\83R\83\93\83p\83C\83\8b\82µ\82Ä\82\82¾\82³\82¢\81B\n" );\r
- }\r
-#endif\r
- #endif\r
- }\r
- IfErrThenBreak();\r
+ return ( self->InitializeStep == 2 );\r
}\r
\r
\r
- \r
-/***********************************************************************\r
- <<< [Error4_raiseErrno] >>> \r
-************************************************************************/\r
-#include <errno.h>\r
-\r
-int Error4_raiseErrno()\r
-{\r
- int e, e2;\r
- TCHAR msg[256];\r
-\r
- e2 = _get_errno( &e );\r
- if ( e2 != 0 ) { Error4_printf( _T("ERROR in _get_errno") ); return E_UNKNOWN; }\r
- e2 = _tcserror_s( msg, sizeof(msg)/sizeof(TCHAR), e );\r
- if ( e2 != 0 ) { Error4_printf( _T("ERROR in strerror_s") ); return E_UNKNOWN; }\r
-\r
- Error4_printf( _T("ERROR (%d) %s\n"), e, msg );\r
- return E_ERRNO;\r
-}\r
+/*-------------------------------------------------------------------------*/\r
+/* <<< End of Class implement >>> */ \r
+/*-------------------------------------------------------------------------*/\r
\r
\r
\r
/*=================================================================*/\r
-/* <<< [DebugTools/DebugTools.c] >>> */ \r
+/* <<< [CRT_plus_1/CRT_plus_1.c] >>> */ \r
/*=================================================================*/\r
\r
/***********************************************************************\r
- <<< [TestableDebugBreak] >>> \r
+ <<< [ttoi_ex] >>> \r
************************************************************************/\r
-dll_global_g_DebugBreakCount int g_bTestableDebugBreak_Disable;\r
-dll_global_g_DebugBreakCount int g_DebugBreakCount;\r
+int ttoi_ex( const TCHAR* string, bit_flags_fast32_t options )\r
+{\r
+ int return_value;\r
\r
+ UNREFERENCED_VARIABLE( options);\r
\r
- \r
-/***********************************************************************\r
- <<< [TestableDebugBreak_isEnabled] >>> \r
-************************************************************************/\r
-int TestableDebugBreak_isEnabled()\r
-{\r
- return g_bTestableDebugBreak_Disable == 0;\r
+ if ( string[0] == _T('0') &&\r
+ ( string[1] == _T('x') || string[1] == _T('X') ) )\r
+ {\r
+ return_value = (int) _tcstoul( &string[2], NULL, 16 );\r
+ }\r
+ else {\r
+ return_value = _ttoi( string );\r
+ }\r
+\r
+ return return_value;\r
}\r
\r
\r