/*=================================================================*/\r
\r
/***********************************************************************\r
- <<< [Globals_init_const] >>> \r
+ <<< [Globals_initConst] >>> \r
************************************************************************/\r
\r
-void Globals_init_const()\r
+void Globals_initConst()\r
{\r
AppKey_initGlobal_const(); \r
}\r
\r
err_nf:\r
if ( AParamSize >= sizeof(TCHAR) ) *out_AParam = _T('\0');\r
- IF ( Index1 >= 2 ) return E_NotFoundSymbol;\r
+ IF ( Index1 >= 2 ) return E_NOT_FOUND_SYMBOL;\r
return 0;\r
}\r
\r
}\r
}\r
else {\r
- IF( bMatch ) return E_NotFoundSymbol; // no value error\r
+ IF( bMatch ) return E_NOT_FOUND_SYMBOL; // no value error\r
}\r
}\r
\r
}\r
\r
*out_IsExist = false;\r
- return E_NotFoundSymbol;\r
+ return E_NOT_FOUND_SYMBOL;\r
}\r
\r
\r
TCHAR v[1];\r
\r
e = GetCommandLineNamed_sub( Name, bCase, &is_exist, v, sizeof(v) );\r
- if ( e == E_NotFoundSymbol ) Err2_clear();\r
+ if ( e == E_NOT_FOUND_SYMBOL ) ClearError();\r
return is_exist;\r
}\r
\r
IF_D( StrStart < Str || StrStart >= o_last ) goto err;\r
\r
c = *p;\r
- IF_D( StrSize <= 2 ) return E_FewArray;\r
+ IF_D( StrSize <= 2 ) return E_FEW_ARRAY;\r
\r
while ( c != _T('\0') ) {\r
if ( c == _T('%') ) {\r
if ( out_StrLast != NULL ) *out_StrLast = o;\r
return e;\r
\r
-err_fa: e = E_FewArray; goto fin;\r
-err_ns: e = E_NotFoundSymbol; goto fin;\r
-err: e = E_Others; goto fin;\r
+err_fa: e = E_FEW_ARRAY; goto fin;\r
+err_ns: e = E_NOT_FOUND_SYMBOL; goto fin;\r
+err: e = E_OTHERS; goto fin;\r
}\r
\r
\r
fin:\r
return e;\r
\r
-err_fm: e = E_FewMemory; goto fin;\r
+err_fm: e = E_FEW_MEMORY; goto fin;\r
}\r
\r
\r
{\r
#if ! FileT_isExistWildcard\r
\r
- DWORD r;\r
+ DWORD r;\r
\r
- if ( path[0] == _T('\0') ) return false;\r
- r = GetFileAttributes( path );\r
- return r != (DWORD)-1;\r
+ if ( path[0] == _T('\0') ) return false;\r
+ r = GetFileAttributes( path );\r
+ return r != (DWORD)-1;\r
\r
#else\r
\r
- HANDLE find;\r
- WIN32_FIND_DATA data;\r
+ HANDLE find;\r
+ WIN32_FIND_DATA data;\r
\r
- find = FindFirstFileEx( path, FindExInfoStandard, &data,\r
- FindExSearchNameMatch, NULL, 0 );\r
+ find = FindFirstFileEx( path, FindExInfoStandard, &data,\r
+ FindExSearchNameMatch, NULL, 0 );\r
\r
- if ( find == INVALID_HANDLE_VALUE ) {\r
- return false;\r
- }\r
- else {\r
- FindClose( find );\r
- return true;\r
- }\r
+ if ( find == INVALID_HANDLE_VALUE ) {\r
+ return false;\r
+ }\r
+ else {\r
+ FindClose( find );\r
+ return true;\r
+ }\r
\r
#endif\r
}\r
************************************************************************/\r
bool FileT_isFile( const TCHAR* path )\r
{\r
- DWORD r = GetFileAttributes( path );\r
- return ( r & (FILE_ATTRIBUTE_DIRECTORY | 0x80000000) ) == 0;\r
- // 0x80000000 \82Í\81A\83t\83@\83C\83\8b\82â\83t\83H\83\8b\83_\82ª\91¶\8dÝ\82µ\82È\82¢\82±\82Æ\82ð\94»\92è\82·\82é\82½\82ß\r
+ DWORD r = GetFileAttributes( path );\r
+ return ( r & (FILE_ATTRIBUTE_DIRECTORY | 0x80000000) ) == 0;\r
+ // 0x80000000 \82Í\81A\83t\83@\83C\83\8b\82â\83t\83H\83\8b\83_\82ª\91¶\8dÝ\82µ\82È\82¢\82±\82Æ\82ð\94»\92è\82·\82é\82½\82ß\r
}\r
\r
\r
************************************************************************/\r
bool FileT_isDir( const TCHAR* path )\r
{\r
- DWORD r = GetFileAttributes( path );\r
- return ( r & (FILE_ATTRIBUTE_DIRECTORY | 0x80000000) ) == FILE_ATTRIBUTE_DIRECTORY;\r
- // 0x80000000 \82Í\81A\83t\83@\83C\83\8b\82â\83t\83H\83\8b\83_\82ª\91¶\8dÝ\82µ\82È\82¢\82±\82Æ\82ð\94»\92è\82·\82é\82½\82ß\r
+ DWORD r = GetFileAttributes( path );\r
+ return ( r & (FILE_ATTRIBUTE_DIRECTORY | 0x80000000) ) == FILE_ATTRIBUTE_DIRECTORY;\r
+ // 0x80000000 \82Í\81A\83t\83@\83C\83\8b\82â\83t\83H\83\8b\83_\82ª\91¶\8dÝ\82µ\82È\82¢\82±\82Æ\82ð\94»\92è\82·\82é\82½\82ß\r
}\r
\r
\r
<<< [FileT_callByNestFind] \83T\83u\83t\83H\83\8b\83_\82à\8aÜ\82ß\82Ä\8ae\83t\83@\83C\83\8b\82Ì\83p\83X\82ð\93n\82· >>> \r
************************************************************************/\r
typedef struct {\r
- /*--- inherit from FileT_CallByNestFindData */\r
- void* CallerArgument;\r
- TCHAR* AbsPath; // abstruct path\r
- TCHAR* StepPath;\r
- TCHAR* FileName;\r
- DWORD FileAttributes;\r
-\r
- /*---*/\r
- BitField Flags;\r
- FuncType CallbackFromNestFind;\r
- TCHAR AbsPathMem[4096];\r
+ /*--- inherit from FileT_CallByNestFindData */\r
+ void* CallerArgument;\r
+ TCHAR* AbsPath; // abstruct path\r
+ TCHAR* StepPath;\r
+ TCHAR* FileName;\r
+ DWORD FileAttributes;\r
+\r
+ /*---*/\r
+ BitField Flags;\r
+ FuncType CallbackFromNestFind;\r
+ TCHAR AbsPathMem[4096];\r
} FileT_CallByNestFindDataIn;\r
\r
int FileT_callByNestFind_sub( FileT_CallByNestFindDataIn* m );\r
\r
int FileT_callByNestFind( const TCHAR* Path, BitField Flags, void* Argument, FuncType Callback )\r
{\r
- int e;\r
- FileT_CallByNestFindDataIn data;\r
+ int e;\r
+ FileT_CallByNestFindDataIn data;\r
\r
- {\r
- TCHAR* p;\r
+ {\r
+ TCHAR* p;\r
\r
- e= StrT_cpy( data.AbsPathMem, sizeof(data.AbsPathMem), Path ); IF(e)goto fin;\r
+ e= StrT_cpy( data.AbsPathMem, sizeof(data.AbsPathMem), 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
- p--;\r
- if ( *p != _T('\\') ) {\r
- p++;\r
- IF( p >= data.AbsPathMem + (sizeof(data.AbsPathMem) / sizeof(TCHAR)) - 1 )goto err_fa;\r
- *p = _T('\\');\r
- }\r
+ /* AbsPathMem \82Ì\8dÅ\8cã\82É \ \82ª\96³\82¢\82È\82ç\92Ç\89Á\82·\82é */\r
+ p = _tcschr( data.AbsPathMem, _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
+ *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.StepPath = p + 1;\r
- data.FileName = p + 1;\r
- data.Flags = Flags;\r
- data.CallbackFromNestFind = Callback;\r
- }\r
+ /* data \82ð\8f\89\8aú\89»\82·\82é */\r
+ data.CallerArgument = Argument;\r
+ data.AbsPath = data.AbsPathMem;\r
+ data.StepPath = p + 1;\r
+ data.FileName = p + 1;\r
+ data.Flags = Flags;\r
+ data.CallbackFromNestFind = Callback;\r
+ }\r
\r
- /* \8dÄ\8bN\8cÄ\82Ñ\8fo\82µ\8aÖ\90\94\82Ö */\r
- e= FileT_callByNestFind_sub( &data ); IF(e)goto fin;\r
+ /* \8dÄ\8bN\8cÄ\82Ñ\8fo\82µ\8aÖ\90\94\82Ö */\r
+ e= FileT_callByNestFind_sub( &data ); IF(e)goto fin;\r
\r
- e=0;\r
+ e=0;\r
fin:\r
- return e;\r
-err_fa: e= E_FewArray; goto fin;\r
+ return e;\r
+err_fa: e= E_FEW_ARRAY; goto fin;\r
}\r
\r
\r
int FileT_callByNestFind_sub( FileT_CallByNestFindDataIn* m )\r
{\r
- int e;\r
- HANDLE find;\r
- WIN32_FIND_DATA data;\r
- TCHAR* p;\r
- int done;\r
+ int e;\r
+ HANDLE find;\r
+ WIN32_FIND_DATA data;\r
+ TCHAR* p;\r
+ int done;\r
\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 ) = _T('\0'); // m->FileName, m->StepPath \82ð "" \82É\82·\82é\r
- m->FileAttributes = FILE_ATTRIBUTE_DIRECTORY;\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 ) = _T('\0'); // m->FileName, m->StepPath \82ð "" \82É\82·\82é\r
+ m->FileAttributes = FILE_ATTRIBUTE_DIRECTORY;\r
\r
- if ( m->StepPath[0] == _T('\0') ) {\r
- TCHAR* step_path = m->StepPath;\r
- TCHAR* fname = m->FileName;\r
+ if ( m->StepPath[0] == _T('\0') ) {\r
+ TCHAR* step_path = m->StepPath;\r
+ TCHAR* fname = m->FileName;\r
\r
- m->StepPath = _T(".");\r
- m->FileName = StrT_refFName( m->AbsPath );\r
- e= m->CallbackFromNestFind( m ); IF(e)goto fin;\r
- m->StepPath = step_path;\r
- m->FileName = fname;\r
- }\r
- else if ( m->FileName[0] == _T('\0') ) {\r
- TCHAR* fname = m->FileName;\r
+ m->StepPath = _T(".");\r
+ m->FileName = StrT_refFName( m->AbsPath );\r
+ e= m->CallbackFromNestFind( m ); IF(e)goto fin;\r
+ m->StepPath = step_path;\r
+ m->FileName = fname;\r
+ }\r
+ else if ( m->FileName[0] == _T('\0') ) {\r
+ TCHAR* fname = m->FileName;\r
\r
- m->FileName = StrT_refFName( m->AbsPath );\r
- e= m->CallbackFromNestFind( m ); IF(e)goto fin;\r
- m->FileName = fname;\r
- }\r
- else {\r
- e= m->CallbackFromNestFind( m ); IF(e)goto fin;\r
- }\r
- *( m->FileName - 1 ) = _T('\\');\r
- }\r
+ m->FileName = StrT_refFName( m->AbsPath );\r
+ e= m->CallbackFromNestFind( m ); IF(e)goto fin;\r
+ m->FileName = fname;\r
+ }\r
+ else {\r
+ e= m->CallbackFromNestFind( m ); IF(e)goto fin;\r
+ }\r
+ *( m->FileName - 1 ) = _T('\\');\r
+ }\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
- *p = _T('*'); *(p+1) = _T('\0');\r
+ /* * \82ð\92Ç\89Á */\r
+ p = m->FileName;\r
+ IF( p >= m->AbsPathMem + (sizeof(m->AbsPathMem) / 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
- FindExSearchNameMatch, NULL, 0 );\r
- done = ( find == INVALID_HANDLE_VALUE );\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
+ FindExSearchNameMatch, NULL, 0 );\r
+ done = ( find == INVALID_HANDLE_VALUE );\r
\r
- while (!done)\r
- {\r
- if ( _tcscmp( data.cFileName, _T(".") ) == 0 ||\r
- _tcscmp( data.cFileName, _T("..") ) == 0 ) {\r
- done = ! FindNextFile( find, &data );\r
- continue;\r
- }\r
+ while (!done)\r
+ {\r
+ if ( _tcscmp( data.cFileName, _T(".") ) == 0 ||\r
+ _tcscmp( data.cFileName, _T("..") ) == 0 ) {\r
+ done = ! FindNextFile( find, &data );\r
+ continue;\r
+ }\r
\r
- StrT_cpy( m->FileName,\r
- sizeof(m->AbsPathMem) - ( (char*)m->FileName - (char*)m->AbsPathMem ),\r
- data.cFileName );\r
- m->FileAttributes = data.dwFileAttributes;\r
+ StrT_cpy( m->FileName,\r
+ sizeof(m->AbsPathMem) - ( (char*)m->FileName - (char*)m->AbsPathMem ),\r
+ data.cFileName );\r
+ m->FileAttributes = data.dwFileAttributes;\r
\r
- if ( data.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY ) {\r
- TCHAR* prev_fname = m->FileName;\r
+ if ( data.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY ) {\r
+ TCHAR* prev_fname = m->FileName;\r
\r
- p = _tcschr( m->FileName, _T('\0') );\r
+ p = _tcschr( m->FileName, _T('\0') );\r
\r
- IF( p >= m->AbsPathMem + (sizeof(m->AbsPathMem) / sizeof(TCHAR)) - 2 )goto err_fa;\r
- *p = _T('\\'); *(p+1) = _T('\0');\r
- m->FileName = p + 1;\r
+ IF( p >= m->AbsPathMem + (sizeof(m->AbsPathMem) / sizeof(TCHAR)) - 2 )goto err_fa;\r
+ *p = _T('\\'); *(p+1) = _T('\0');\r
+ m->FileName = p + 1;\r
\r
- e= FileT_callByNestFind_sub( m ); IF(e)goto fin; /* \8dÄ\8bN\8cÄ\82Ñ\8fo\82µ */\r
+ e= FileT_callByNestFind_sub( m ); IF(e)goto fin; /* \8dÄ\8bN\8cÄ\82Ñ\8fo\82µ */\r
\r
- m->FileName = prev_fname;\r
- }\r
- else {\r
- e= m->CallbackFromNestFind( m ); IF(e)goto fin;\r
- }\r
+ m->FileName = prev_fname;\r
+ }\r
+ else {\r
+ e= m->CallbackFromNestFind( m ); IF(e)goto fin;\r
+ }\r
\r
- done = ! FindNextFile( find, &data );\r
- }\r
- FindClose( find );\r
+ done = ! FindNextFile( find, &data );\r
+ }\r
+ FindClose( find );\r
\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_FolderAfterFiles ) {\r
- TCHAR* step_path = m->StepPath;\r
- TCHAR* fname = m->FileName;\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_FolderAfterFiles ) {\r
+ TCHAR* step_path = m->StepPath;\r
+ TCHAR* fname = m->FileName;\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
- m->StepPath = _T(".");\r
- }\r
- m->FileName = StrT_refFName( m->AbsPath );\r
+ *( m->FileName - 1 ) = _T('\0');\r
+ m->FileAttributes = FILE_ATTRIBUTE_DIRECTORY;\r
+ if ( ( *( m->StepPath - 1 ) == _T('\0') ) && ( m->StepPath > m->AbsPath ) ) {\r
+ m->StepPath = _T(".");\r
+ }\r
+ m->FileName = StrT_refFName( m->AbsPath );\r
\r
- e= m->CallbackFromNestFind( m ); IF(e)goto fin;\r
+ e= m->CallbackFromNestFind( m ); IF(e)goto fin;\r
\r
- m->StepPath = step_path;\r
- m->FileName = fname;\r
- }\r
+ m->StepPath = step_path;\r
+ m->FileName = fname;\r
+ }\r
\r
- e=0;\r
+ e=0;\r
fin:\r
- return e;\r
-err_fa: e= E_FewArray; goto fin;\r
+ return e;\r
+err_fa: e= E_FEW_ARRAY; goto fin;\r
}\r
\r
\r
************************************************************************/\r
int FileT_openForRead( FILE** out_pFile, const TCHAR* Path )\r
{\r
- errno_t en;\r
+ errno_t en;\r
\r
- assert( Locale_isInited() );\r
+ assert( Locale_isInited() );\r
\r
- #if DEBUGTOOLS_USES\r
- { int e= Debug_onOpen( Path ); if(e) return e; }\r
- #endif\r
+ #if DEBUGTOOLS_USES\r
+ { int e= Debug_onOpen( Path ); if(e) return e; }\r
+ #endif\r
\r
- en = _tfopen_s( out_pFile, Path, _T("r")_T(fopen_ccs) );\r
- if ( en == 2 ) {\r
- _tprintf( _T("not found \"%s\"\n"), Path );\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
+ #ifndef UNDER_CE\r
+ {\r
+ TCHAR cwd[512];\r
\r
- if ( _tgetcwd( cwd, _countof(cwd) ) != NULL )\r
- _tprintf( _T("current = \"%s\"\n"), cwd );\r
- }\r
- #endif\r
+ if ( _tgetcwd( cwd, _countof(cwd) ) != NULL )\r
+ _tprintf( _T("current = \"%s\"\n"), cwd );\r
+ }\r
+ #endif\r
\r
- return E_NotFoundSymbol;\r
- }\r
- IF(en)return E_Others;\r
+ return E_NOT_FOUND_SYMBOL;\r
+ }\r
+ if ( en == EACCES ) {\r
+ _tprintf( _T("access denied \"%s\"\n"), Path );\r
+ return E_ACCESS_DENIED;\r
+ }\r
+ IF(en)return E_OTHERS;\r
\r
- return 0;\r
+ return 0;\r
}\r
\r
\r
BOOL b;\r
int retry_count;\r
\r
- IF_D( ! Locale_isInited() ) return E_NotInitGlobal;\r
+ IF_D( ! Locale_isInited() ) return E_NOT_INIT_GLOBAL;\r
\r
#if Uses_AppKey\r
e= AppKey_addNewWritableFolder( Path ); IF(e)goto fin;\r
}\r
#endif\r
\r
- e = E_NotFoundSymbol;\r
+ e = E_NOT_FOUND_SYMBOL;\r
goto fin;\r
}\r
}\r
fin:\r
return e;\r
\r
-err: e = E_Others; goto fin;\r
-err_gt: e = E_GetLastError; goto fin;\r
+err: e = E_OTHERS; goto fin;\r
+err_gt: e = SaveWindowsLastError(); goto fin;\r
}\r
\r
\r
************************************************************************/\r
int FileT_close( FILE* File, int e )\r
{\r
- if ( File != NULL ) {\r
- int r = fclose( File );\r
- IF(r&&!e)e=E_Errno;\r
- }\r
- return e;\r
+ if ( File != NULL ) {\r
+ int r = fclose( File );\r
+ IF(r&&!e)e=E_ERRNO;\r
+ }\r
+ return e;\r
}\r
\r
\r
\r
\r
/***********************************************************************\r
+ <<< [FileT_writePart] >>> \r
+************************************************************************/\r
+errnum_t FileT_writePart( FILE* File, TCHAR* Start, TCHAR* Over )\r
+{\r
+ errnum_t e;\r
+ TCHAR back_char;\r
+ int r;\r
+\r
+ back_char = *Over;\r
+ *Over = _T('\0');\r
+\r
+ r= _ftprintf_s( File, _T("%s"), Start ); IF(r<0){ e=E_ERRNO; goto fin; }\r
+\r
+ e=0;\r
+fin:\r
+ *Over = back_char;\r
+ return e;\r
+}\r
+\r
+\r
+ \r
+/***********************************************************************\r
<<< [FileT_mkdir] >>> \r
************************************************************************/\r
int FileT_mkdir( const TCHAR* Path )\r
{\r
- int e;\r
- DWORD r;\r
- TCHAR* p;\r
- BOOL b;\r
- int n_folder = 0;\r
- TCHAR path2[MAX_PATH];\r
+ int e;\r
+ DWORD r;\r
+ TCHAR* p = (TCHAR*) DUMMY_INITIAL_VALUE;\r
+ BOOL b;\r
+ int n_folder = 0;\r
+ TCHAR path2[MAX_PATH];\r
\r
\r
- e= StrT_getAbsPath( path2, sizeof(path2), Path, NULL ); IF(e)goto fin;\r
- #if Uses_AppKey\r
- e= AppKey_addNewWritableFolder( path2 ); IF(e)goto fin;\r
- #endif\r
+ e= StrT_getAbsPath( path2, sizeof(path2), Path, NULL ); IF(e)goto fin;\r
+ #if Uses_AppKey\r
+ e= AppKey_addNewWritableFolder( path2 ); IF(e)goto fin;\r
+ #endif\r
\r
\r
- //=== \91¶\8dÝ\82·\82é\83t\83H\83\8b\83_\82ð\92T\82·\r
- for (;;) {\r
- r = GetFileAttributes( path2 );\r
- if ( r != (DWORD)-1 ) break; // "C:" \82à\83t\83H\83\8b\83_\82Æ\94»\92è\82³\82ê\82é\r
+ //=== \91¶\8dÝ\82·\82é\83t\83H\83\8b\83_\82ð\92T\82·\r
+ for (;;) {\r
+ r = GetFileAttributes( path2 );\r
+ if ( r != (DWORD)-1 ) break; // "C:" \82à\83t\83H\83\8b\83_\82Æ\94»\92è\82³\82ê\82é\r
\r
- p = StrT_refFName( path2 ) - 1; // \90â\91Î\83p\83X\82È\82Ì\82Å\95K\82¸ *p=='\\'\r
- *p = _T('\0');\r
- n_folder ++;\r
- }\r
- IF ( ! (r & FILE_ATTRIBUTE_DIRECTORY) ) goto err; // \83t\83@\83C\83\8b\82È\82ç\83G\83\89\81[\r
+ p = StrT_refFName( path2 ) - 1; // \90â\91Î\83p\83X\82È\82Ì\82Å\95K\82¸ *p=='\\'\r
+ *p = _T('\0');\r
+ n_folder ++;\r
+ }\r
+ IF ( ! (r & FILE_ATTRIBUTE_DIRECTORY) ) goto err; // \83t\83@\83C\83\8b\82È\82ç\83G\83\89\81[\r
\r
\r
- //=== \83t\83H\83\8b\83_\82ð\8dì\90¬\82·\82é\r
- for ( ; n_folder > 0; n_folder -- ) {\r
- *p = _T('\\');\r
- b= CreateDirectory( path2, NULL ); IF(!b)goto err;\r
- p = _tcschr( p, _T('\0') );\r
- }\r
+ //=== \83t\83H\83\8b\83_\82ð\8dì\90¬\82·\82é\r
+ for ( ; n_folder > 0; n_folder -- ) {\r
+ *p = _T('\\');\r
+ b= CreateDirectory( path2, NULL ); IF(!b)goto err;\r
+ p = _tcschr( p, _T('\0') );\r
+ }\r
\r
- e=0;\r
+ e=0;\r
fin:\r
- return e;\r
+ return e;\r
\r
-err: e = E_Others; goto fin;\r
+err: e = E_OTHERS; goto fin;\r
}\r
\r
\r
\r
int FileT_copy( const TCHAR* SrcPath, const TCHAR* DstPath )\r
{\r
- const TCHAR* p_last;\r
- int e;\r
- BOOL b;\r
- TCHAR path[MAX_PATH*4];\r
-\r
+ const TCHAR* p_last;\r
+ int e;\r
+ BOOL b;\r
+ TCHAR path[MAX_PATH*4];\r
\r
- #if Uses_AppKey\r
- e= AppKey_addNewWritableFolder( DstPath ); IF(e)goto fin;\r
- #endif\r
\r
- p_last = _tcschr( SrcPath, _T('\0') );\r
- IF_D( p_last <= SrcPath + 1 )goto err_ni;\r
+ #if Uses_AppKey\r
+ e= AppKey_addNewWritableFolder( DstPath ); IF(e)goto fin;\r
+ #endif\r
\r
+ p_last = _tcschr( SrcPath, _T('\0') );\r
+ IF_D( p_last <= SrcPath + 1 )goto err_ni;\r
\r
- //=== \83t\83H\83\8b\83_\82ð\83R\83s\81[\82·\82é\r
- if ( *(p_last - 1) == _T('*') ) {\r
- IF_D( *(p_last - 2) != _T('\\') ) goto err_ni;\r
\r
- e= StrT_getParentAbsPath( path, sizeof(path), SrcPath, NULL ); IF(e)goto fin;\r
- IF_D( ! FileT_isDir( path ) )goto err_nf;\r
+ //=== \83t\83H\83\8b\83_\82ð\83R\83s\81[\82·\82é\r
+ if ( *(p_last - 1) == _T('*') ) {\r
+ IF_D( *(p_last - 2) != _T('\\') ) goto err_ni;\r
\r
- e= FileT_callByNestFind( path, FileT_FolderBeforeFiles, (void*) DstPath, (FuncType) FileT_copy_sub );\r
- IF(e)goto fin;\r
- }\r
+ e= StrT_getParentAbsPath( path, sizeof(path), SrcPath, NULL ); IF(e)goto fin;\r
+ IF_D( ! FileT_isDir( path ) )goto err_nf;\r
\r
+ e= FileT_callByNestFind( path, FileT_FolderBeforeFiles, (void*) DstPath, (FuncType) FileT_copy_sub );\r
+ IF(e)goto fin;\r
+ }\r
\r
- //=== \83t\83@\83C\83\8b\82ð\83R\83s\81[\82·\82é\r
- else {\r
- IF_D( _tcschr( SrcPath, _T('*') ) != NULL )goto err_ni;\r
- IF_D( ! FileT_isFile( SrcPath ) ) goto err_nf;\r
\r
- b= CopyFile( SrcPath, DstPath, FALSE );\r
- if (!b) {\r
- if ( FileT_isDir( DstPath ) ) {\r
- e= stprintf_r( path, sizeof(path), _T("%s\\%s"), DstPath, StrT_refFName( SrcPath ) ); IF(e)goto fin;\r
- b= CopyFile( SrcPath, path, FALSE ); IF(!b)goto err_gt;\r
- }\r
- else {\r
- int ee;\r
-\r
- p_last = _tcschr( DstPath, _T('\0') ) - 1;\r
- IF_D( p_last < DstPath )goto err;\r
- if ( *p_last == _T('\\') ) {\r
- ee= FileT_mkdir( DstPath ); IF(ee)goto fin;\r
- e= stprintf_r( path, sizeof(path), _T("%s%s"), DstPath, StrT_refFName( SrcPath ) ); IF(e)goto fin;\r
- b= CopyFile( SrcPath, path, FALSE ); IF(!b)goto err_gt;\r
- }\r
- else {\r
- e = E_AccessDenied;\r
- ee= StrT_getParentAbsPath( path, sizeof(path), DstPath, NULL ); IF(ee)goto fin;\r
- ee= FileT_mkdir( path ); IF(ee)goto fin;\r
- b= CopyFile( SrcPath, DstPath, FALSE ); IF(!b)goto err_gt;\r
- }\r
- }\r
- }\r
- }\r
+ //=== \83t\83@\83C\83\8b\82ð\83R\83s\81[\82·\82é\r
+ else {\r
+ IF_D( _tcschr( SrcPath, _T('*') ) != NULL )goto err_ni;\r
+ IF_D( ! FileT_isFile( SrcPath ) ) goto err_nf;\r
+\r
+ b= CopyFile( SrcPath, DstPath, FALSE );\r
+ if (!b) {\r
+ if ( FileT_isDir( DstPath ) ) {\r
+ e= stprintf_r( path, sizeof(path), _T("%s\\%s"), DstPath, StrT_refFName( SrcPath ) ); IF(e)goto fin;\r
+ b= CopyFile( SrcPath, path, FALSE ); IF(!b)goto err_gt;\r
+ }\r
+ else {\r
+ int ee;\r
+\r
+ p_last = _tcschr( DstPath, _T('\0') ) - 1;\r
+ IF_D( p_last < DstPath )goto err;\r
+ if ( *p_last == _T('\\') ) {\r
+ ee= FileT_mkdir( DstPath ); IF(ee)goto fin;\r
+ e= stprintf_r( path, sizeof(path), _T("%s%s"), DstPath, StrT_refFName( SrcPath ) ); IF(e)goto fin;\r
+ b= CopyFile( SrcPath, path, FALSE ); IF(!b)goto err_gt;\r
+ }\r
+ else {\r
+ e = E_ACCESS_DENIED;\r
+ ee= StrT_getParentAbsPath( path, sizeof(path), DstPath, NULL ); IF(ee)goto fin;\r
+ ee= FileT_mkdir( path ); IF(ee)goto fin;\r
+ b= CopyFile( SrcPath, DstPath, FALSE ); IF(!b)goto err_gt;\r
+ }\r
+ }\r
+ }\r
+ }\r
\r
- e=0;\r
+ e=0;\r
fin:\r
- return e;\r
+ return e;\r
\r
-err_ni: e = E_NotImplementYet; goto fin;\r
-err_nf: e = E_PathNotFound; goto fin;\r
-err_gt: e = E_GetLastError; goto fin;\r
-err: e = E_Others; goto fin;\r
+err_ni: e = E_NOT_IMPLEMENT_YET; goto fin;\r
+err_nf: e = E_PATH_NOT_FOUND; goto fin;\r
+err_gt: e = SaveWindowsLastError(); goto fin;\r
+err: e = E_OTHERS; goto fin;\r
}\r
\r
\r
int FileT_copy_sub( FileT_CallByNestFindData* m )\r
{\r
- const TCHAR* DstPath = (const TCHAR*) m->CallerArgument;\r
- int e;\r
- BOOL b;\r
- TCHAR path[MAX_PATH*4];\r
+ const TCHAR* DstPath = (const TCHAR*) m->CallerArgument;\r
+ int e;\r
+ BOOL b;\r
+ TCHAR path[MAX_PATH*4];\r
\r
- e= stprintf_r( path, sizeof(path), _T("%s\\%s"), DstPath, m->StepPath ); IF(e)goto fin;\r
+ e= stprintf_r( path, sizeof(path), _T("%s\\%s"), DstPath, m->StepPath ); IF(e)goto fin;\r
\r
- if ( m->FileAttributes & FILE_ATTRIBUTE_DIRECTORY ) {\r
- if ( ! FileT_isDir( path ) )\r
- { b= CreateDirectory( path, NULL ); IF(!b)goto err_gt; }\r
- }\r
- else {\r
- b= CopyFile( m->AbsPath, path, FALSE ); IF(!b)goto err_gt;\r
- }\r
+ if ( m->FileAttributes & FILE_ATTRIBUTE_DIRECTORY ) {\r
+ if ( ! FileT_isDir( path ) )\r
+ { b= CreateDirectory( path, NULL ); IF(!b)goto err_gt; }\r
+ }\r
+ else {\r
+ b= CopyFile( m->AbsPath, path, FALSE ); IF(!b)goto err_gt;\r
+ }\r
\r
- e=0;\r
+ e=0;\r
fin:\r
- return e;\r
+ return e;\r
\r
-err_gt: e = E_GetLastError; goto fin;\r
+err_gt: e = SaveWindowsLastError(); goto fin;\r
}\r
\r
\r
\r
int FileT_del( const TCHAR* Path )\r
{\r
- int e;\r
- DWORD r;\r
- TCHAR abs_path[MAX_PATH];\r
+ int e;\r
+ DWORD r;\r
+ TCHAR abs_path[MAX_PATH];\r
\r
- e= StrT_getAbsPath( abs_path, sizeof(abs_path), Path, NULL ); IF(e)goto fin;\r
- #if Uses_AppKey\r
- e= AppKey_addNewWritableFolder( abs_path ); IF(e)goto fin;\r
- #endif\r
+ e= StrT_getAbsPath( abs_path, sizeof(abs_path), Path, NULL ); IF(e)goto fin;\r
+ #if Uses_AppKey\r
+ e= AppKey_addNewWritableFolder( abs_path ); IF(e)goto fin;\r
+ #endif\r
\r
- r= GetFileAttributes( Path );\r
- if ( r != (DWORD)-1 ) {\r
- if ( r & FILE_ATTRIBUTE_DIRECTORY ) {\r
- e= FileT_callByNestFind( Path, FileT_FolderAfterFiles, NULL, (FuncType) FileT_del_sub );\r
- }\r
- else {\r
- BOOL b= DeleteFile( Path ); IF(!b)goto err_gt;\r
- }\r
- }\r
- IF_D( FileT_isExist( Path ) )goto err_ad;\r
+ r= GetFileAttributes( Path );\r
+ if ( r != (DWORD)-1 ) {\r
+ if ( r & FILE_ATTRIBUTE_DIRECTORY ) {\r
+ e= FileT_callByNestFind( Path, FileT_FolderAfterFiles, NULL, (FuncType) FileT_del_sub );\r
+ }\r
+ else {\r
+ BOOL b= DeleteFile( Path ); IF(!b)goto err_gt;\r
+ }\r
+ }\r
+ IF_D( FileT_isExist( Path ) )goto err_ad;\r
\r
- e=0;\r
+ e=0;\r
fin:\r
- return e;\r
+ return e;\r
\r
-err_gt: e = E_GetLastError; goto fin;\r
-err_ad: e = E_AccessDenied; goto fin;\r
+err_gt: e = SaveWindowsLastError(); goto fin;\r
+err_ad: e = E_ACCESS_DENIED; goto fin;\r
}\r
\r
\r
int FileT_del_sub( FileT_CallByNestFindData* m )\r
{\r
- int e;\r
- BOOL b;\r
+ int e;\r
+ BOOL b;\r
\r
- if ( m->FileAttributes & FILE_ATTRIBUTE_DIRECTORY ) {\r
- b= RemoveDirectory( m->AbsPath ); IF(!b)goto err_gt;\r
- }\r
- else {\r
- b= DeleteFile( m->AbsPath ); IF(!b)goto err_gt;\r
- }\r
+ if ( m->FileAttributes & FILE_ATTRIBUTE_DIRECTORY ) {\r
+ b= RemoveDirectory( m->AbsPath ); IF(!b)goto err_gt;\r
+ }\r
+ else {\r
+ b= DeleteFile( m->AbsPath ); IF(!b)goto err_gt;\r
+ }\r
\r
- e=0;\r
+ e=0;\r
fin:\r
- return e;\r
+ return e;\r
\r
-err_gt: e = E_GetLastError; goto fin;\r
+err_gt: e = SaveWindowsLastError(); goto fin;\r
}\r
\r
/***********************************************************************\r
<<< [AppKey] >>> \r
************************************************************************/\r
-int AppKey_create( AppKey** out_m );\r
-bool AppKey_isSame( AppKey* m );\r
-void Writables_init_const( Writables* m );\r
-int Writables_init( Writables* m, AppKey* Key );\r
-int Writables_finish( Writables* m, int e );\r
-int Writables_isInited( Writables* m );\r
-int Writables_clearPaths( Writables* m );\r
-int Writables_create( Writables** out_m, AppKey* Key );\r
-int Writables_copyToConst( Writables* To, Writables* From );\r
+static errnum_t AppKey_create( AppKey** out_m );\r
+static bool AppKey_isSame( AppKey* m );\r
+static void Writables_initConst( Writables* m );\r
+static errnum_t Writables_init( Writables* m, AppKey* Key );\r
+static errnum_t Writables_finish( Writables* m, int e );\r
+static bool Writables_isInited( Writables* m );\r
+static errnum_t Writables_clearPaths( Writables* m );\r
+static errnum_t Writables_create( Writables** out_m, AppKey* Key );\r
+static errnum_t Writables_copyToConst( Writables* To, Writables* From );\r
\r
\r
typedef struct _CurrentWritables CurrentWritables;\r
struct _CurrentWritables {\r
- Writables m_CurrentWritables;\r
- TCHAR* m_ProgramFiles; size_t m_ProgramFiles_Len;\r
- TCHAR* m_windir; size_t m_windir_Len;\r
- TCHAR* m_APPDATA; size_t m_APPDATA_Len;\r
- TCHAR* m_LOCALAPPDATA; size_t m_LOCALAPPDATA_Len;\r
+ Writables m_CurrentWritables;\r
+ TCHAR* m_ProgramFiles; size_t m_ProgramFiles_Len;\r
+ TCHAR* m_windir; size_t m_windir_Len;\r
+ TCHAR* m_APPDATA; size_t m_APPDATA_Len;\r
+ TCHAR* m_LOCALAPPDATA; size_t m_LOCALAPPDATA_Len;\r
};\r
-void CurrentWritables_init_const( CurrentWritables* m );\r
-int CurrentWritables_init( CurrentWritables* m );\r
-int CurrentWritables_finish( CurrentWritables* m, int e );\r
-int CurrentWritables_askFileAccess( CurrentWritables* m, const TCHAR* AbsPath );\r
+static void CurrentWritables_initConst( CurrentWritables* m );\r
+static errnum_t CurrentWritables_init( CurrentWritables* m );\r
+static errnum_t CurrentWritables_finish( CurrentWritables* m, int e );\r
+static errnum_t CurrentWritables_askFileAccess( CurrentWritables* m, const TCHAR* AbsPath );\r
\r
\r
//////////////////////////////\r
\r
-\r
static AppKey g_AppKey;\r
static AppKey* g_AppKeyPrivate;\r
\r
// under g_AppKey\r
- Writables g_DefaultWritables;\r
- Writables g_CurrentWritables; // public\r
- static CurrentWritables g_CurrentWritablesPrivate;\r
+Writables g_DefaultWritables;\r
+Writables g_CurrentWritables; // public\r
+static CurrentWritables g_CurrentWritablesPrivate;\r
\r
\r
-static int AppKey_create( AppKey** out_m )\r
+static errnum_t AppKey_create( AppKey** out_m )\r
{\r
- int e;\r
+ errnum_t e;\r
\r
- IF( g_AppKeyPrivate != NULL ) { e=1; goto fin; }\r
- // AppKey_newWritable \82Ì in_out_m = NULL \82Ì\82Æ\82«\82Í\81A2\89ñ\8cÄ\82Ñ\8fo\82·\82±\82Æ\82Í\82Å\82«\82Ü\82¹\82ñ\81B\r
+ IF( g_AppKeyPrivate != NULL ) { e=1; goto fin; }\r
+ // AppKey_newWritable \82Ì in_out_m = NULL \82Ì\82Æ\82«\82Í\81A2\89ñ\8cÄ\82Ñ\8fo\82·\82±\82Æ\82Í\82Å\82«\82Ü\82¹\82ñ\81B\r
\r
- Writables_init_const( &g_DefaultWritables );\r
- CurrentWritables_init_const( &g_CurrentWritablesPrivate );\r
+ Writables_initConst( &g_DefaultWritables );\r
+ CurrentWritables_initConst( &g_CurrentWritablesPrivate );\r
\r
- e= CurrentWritables_init( &g_CurrentWritablesPrivate ); IF(e)goto fin;\r
- e= Writables_copyToConst( &g_CurrentWritables, NULL ); IF(e)goto fin;\r
+ e= CurrentWritables_init( &g_CurrentWritablesPrivate ); IF(e)goto fin;\r
+ e= Writables_copyToConst( &g_CurrentWritables, NULL ); IF(e)goto fin;\r
\r
- *out_m = &g_AppKey;\r
- g_AppKeyPrivate = &g_AppKey;\r
+ *out_m = &g_AppKey;\r
+ g_AppKeyPrivate = &g_AppKey;\r
\r
- e=0;\r
+ e=0;\r
fin:\r
- return e;\r
+ return e;\r
}\r
\r
\r
static bool AppKey_isSame( AppKey* m )\r
{\r
- return ( m == g_AppKeyPrivate );\r
+ return ( m == g_AppKeyPrivate );\r
}\r
\r
\r
void AppKey_initGlobal_const()\r
{\r
- Writables_init_const( &g_DefaultWritables );\r
+ Writables_initConst( &g_DefaultWritables );\r
}\r
\r
\r
-int AppKey_finishGlobal( int e )\r
+errnum_t AppKey_finishGlobal( errnum_t e )\r
{\r
- int ee;\r
+ errnum_t ee;\r
\r
- e= Writables_finish( &g_DefaultWritables, e );\r
- e= CurrentWritables_finish( &g_CurrentWritablesPrivate, e );\r
- ee= Writables_copyToConst( &g_CurrentWritables, NULL ); IF(ee&&!e)e=ee;\r
+ e= Writables_finish( &g_DefaultWritables, e );\r
+ e= CurrentWritables_finish( &g_CurrentWritablesPrivate, e );\r
+ ee= Writables_copyToConst( &g_CurrentWritables, NULL ); IF(ee&&!e)e=ee;\r
\r
- return e;\r
+ return e;\r
}\r
\r
\r
/***********************************************************************\r
<<< [AppKey_newWritable] >>> \r
************************************************************************/\r
-int AppKey_newWritable( AppKey** in_out_m, Writables** out_Writable, ... )\r
+errnum_t AppKey_newWritable( AppKey** in_out_m, Writables** out_Writable, ... )\r
{\r
- int e;\r
- AppKey* m = NULL;\r
- Writables* wr = NULL;\r
+ errnum_t e;\r
+ AppKey* m = NULL;\r
+ Writables* wr = NULL;\r
#if Uses_OutMallocIDTool\r
- bool is_prev_out_malloc;\r
+ bool is_prev_out_malloc;\r
\r
- is_prev_out_malloc = OutMallocID_setEnable( false );\r
+ is_prev_out_malloc = OutMallocID_setEnable( false );\r
#endif\r
\r
\r
- //=== AppKey* m \82ð\97L\8cø\82É\82·\82é\r
- if ( in_out_m == NULL ) { // \8d¡\89ñ\82Ì\8aÖ\90\94\82Ì\92\86\82¾\82¯\82Å\8eQ\8fÆ\82·\82é\r
- e= AppKey_create( &m ); IF(e)goto resume;\r
- }\r
- else if ( *in_out_m == NULL ) { // \82P\89ñ\96Ú\82É\96{\8aÖ\90\94\82ð\8cÄ\82Ñ\8fo\82µ\82½\83\82\83W\83\85\81[\83\8b\82É\93n\82·\r
- e= AppKey_create( &m ); IF(e)goto resume;\r
- *in_out_m = m;\r
- }\r
- else { // \96{\8aÖ\90\94\82ð\8cÄ\82Ñ\8fo\82µ\82½\83\82\83W\83\85\81[\83\8b\82©\82ç\93n\82Á\82½\82à\82Ì\82ð\8eg\82¤\r
- m = *in_out_m;\r
- }\r
+ //=== AppKey* m \82ð\97L\8cø\82É\82·\82é\r
+ if ( in_out_m == NULL ) { // \8d¡\89ñ\82Ì\8aÖ\90\94\82Ì\92\86\82¾\82¯\82Å\8eQ\8fÆ\82·\82é\r
+ e= AppKey_create( &m ); IF(e)goto resume;\r
+ }\r
+ else if ( *in_out_m == NULL ) { // \82P\89ñ\96Ú\82É\96{\8aÖ\90\94\82ð\8cÄ\82Ñ\8fo\82µ\82½\83\82\83W\83\85\81[\83\8b\82É\93n\82·\r
+ e= AppKey_create( &m ); IF(e)goto resume;\r
+ *in_out_m = m;\r
+ }\r
+ else { // \96{\8aÖ\90\94\82ð\8cÄ\82Ñ\8fo\82µ\82½\83\82\83W\83\85\81[\83\8b\82©\82ç\93n\82Á\82½\82à\82Ì\82ð\8eg\82¤\r
+ m = *in_out_m;\r
+ }\r
\r
\r
- //=== \90³\8bK\82Ì AppKey \82©\83`\83F\83b\83N\82·\82é\r
- IF( ! AppKey_isSame( m ) )goto err;\r
+ //=== \90³\8bK\82Ì AppKey \82©\83`\83F\83b\83N\82·\82é\r
+ IF( ! AppKey_isSame( m ) )goto err;\r
\r
\r
- //=== Writable \82ð\90¶\90¬\82·\82é\r
- if ( out_Writable == NULL ) {\r
- wr = &g_DefaultWritables;\r
- e= Writables_finish( wr, 0 ); IF(e)goto resume;\r
- e= Writables_init( wr, m ); IF(e)goto resume;\r
- }\r
- else {\r
- e= Writables_create( &wr, m ); IF(e)goto resume;\r
- *out_Writable = wr;\r
- }\r
+ //=== Writable \82ð\90¶\90¬\82·\82é\r
+ if ( out_Writable == NULL ) {\r
+ wr = &g_DefaultWritables;\r
+ e= Writables_finish( wr, 0 ); IF(e)goto resume;\r
+ e= Writables_init( wr, m ); IF(e)goto resume;\r
+ }\r
+ else {\r
+ e= Writables_create( &wr, m ); IF(e)goto resume;\r
+ *out_Writable = wr;\r
+ }\r
\r
\r
- //=== Writable \82É\83p\83X\82ð\93o\98^\82·\82é\r
- {\r
- va_list va;\r
- TCHAR* path;\r
- int i;\r
+ //=== Writable \82É\83p\83X\82ð\93o\98^\82·\82é\r
+ {\r
+ va_list va;\r
+ TCHAR* path;\r
+ int i;\r
\r
- va_start( va, out_Writable );\r
- for ( i=0; ; i++ ) {\r
- path = va_arg( va, TCHAR* );\r
- if ( path == NULL ) break;\r
- IF( i == 5 ) goto err; // \8dÅ\8cã\82Ì NULL \96Y\82ê\91Î\8dô\r
+ va_start( va, out_Writable );\r
+ for ( i=0; ; i++ ) {\r
+ path = va_arg( va, TCHAR* );\r
+ if ( path == NULL ) break;\r
+ IF( i == 5 ) goto err; // \8dÅ\8cã\82Ì NULL \96Y\82ê\91Î\8dô\r
\r
- e= Writables_add( wr, m, path ); IF(e)goto resume;\r
- }\r
- va_end( va );\r
- }\r
- #if defined(TempFile_get)\r
- {\r
- TempFile* temp;\r
+ e= Writables_add( wr, m, path ); IF(e)goto resume;\r
+ }\r
+ va_end( va );\r
+ }\r
+ #if defined(TempFile_get)\r
+ {\r
+ TempFile* temp;\r
\r
- e= TempFile_get( &temp ); IF(e)goto resume;\r
- e= Writables_add( wr, m, temp->TempPath ); IF(e)goto resume;\r
- }\r
- #endif\r
+ e= TempFile_get( &temp ); IF(e)goto resume;\r
+ e= Writables_add( wr, m, temp->TempPath ); IF(e)goto resume;\r
+ }\r
+ #endif\r
\r
\r
- //=== \82·\82®\82É Writable \82ð\97L\8cø\82É\82·\82é\r
- if ( out_Writable == NULL ) {\r
- e= Writables_enable( wr ); IF(e)goto resume;\r
- }\r
+ //=== \82·\82®\82É Writable \82ð\97L\8cø\82É\82·\82é\r
+ if ( out_Writable == NULL ) {\r
+ e= Writables_enable( wr ); IF(e)goto resume;\r
+ }\r
\r
- e=0;\r
+ e=0;\r
fin:\r
- #if Uses_OutMallocIDTool\r
- OutMallocID_setEnable( is_prev_out_malloc );\r
- #endif\r
- return e;\r
+ #if Uses_OutMallocIDTool\r
+ OutMallocID_setEnable( is_prev_out_malloc );\r
+ #endif\r
+ return e;\r
\r
-err: e = E_Others; goto resume;\r
+err: e = E_OTHERS; goto resume;\r
resume:\r
- if ( wr != NULL ) {\r
- if ( out_Writable == NULL )\r
- e= Writables_finish( wr, e ); // g_DefaultWritables\r
- else\r
- e= Writables_delete( wr, e );\r
- }\r
- goto fin;\r
+ if ( wr != NULL ) {\r
+ if ( out_Writable == NULL )\r
+ e= Writables_finish( wr, e ); // g_DefaultWritables\r
+ else\r
+ e= Writables_delete( wr, e );\r
+ }\r
+ goto fin;\r
}\r
\r
\r
<<< [AppKey_addNewWritableFolder] \83`\83F\83b\83N\82·\82é\81A\82Ü\82½\82Í\92Ç\89Á\82·\82é >>> \r
\81i\92Ç\89Á\82Í\96¢\91Î\89\9e\81j\r
************************************************************************/\r
-int AppKey_addNewWritableFolder( const TCHAR* Path )\r
+errnum_t AppKey_addNewWritableFolder( const TCHAR* Path )\r
{\r
- int e;\r
- TCHAR** pp;\r
- TCHAR** pp_over;\r
- Writables* wr = &g_CurrentWritablesPrivate.m_CurrentWritables;\r
- size_t path_len;\r
- TCHAR abs_path[MAX_PATH];\r
-\r
- if ( g_AppKeyPrivate == NULL ) {\r
- e= AppKey_newWritable( NULL, NULL, ".", NULL ); IF(e)goto fin;\r
- }\r
+ errnum_t e;\r
+ TCHAR** pp;\r
+ TCHAR** pp_over;\r
+ Writables* wr = &g_CurrentWritablesPrivate.m_CurrentWritables;\r
+ size_t path_len;\r
+ TCHAR abs_path[MAX_PATH];\r
\r
- e= StrT_getAbsPath( abs_path, sizeof(abs_path), Path, NULL ); IF(e)goto fin;\r
+ if ( g_AppKeyPrivate == NULL ) {\r
+ e= AppKey_newWritable( NULL, NULL, ".", NULL ); IF(e){goto fin;}\r
+ }\r
\r
- pp_over = wr->m_Paths + wr->m_nPath;\r
- for ( pp = wr->m_Paths; ; pp++ ) {\r
- IF ( pp >= pp_over )goto err_wr;\r
- // Path (abs_path) \82Í\81AAppKey_newWritable \82Å\8b\96\89Â\82³\82ê\82Ä\82¢\82Ü\82¹\82ñ\81B\r
- // \83E\83H\83b\83`\81E\83E\83B\83\93\83h\83E\82É g_CurrentWritables.m_Paths,3 \82È\82Ç\82ð\93ü\97Í\82µ\82Ä\r
- // \8b\96\89Â\82³\82ê\82Ä\82¢\82é\83p\83X\82ð\8am\94F\82µ\82Ä\82\82¾\82³\82¢\81B\r
+ e= StrT_getAbsPath( abs_path, sizeof(abs_path), Path, NULL ); IF(e){goto fin;}\r
\r
- path_len = _tcslen( *pp );\r
- if ( _tcsnicmp( *pp, abs_path, path_len ) == 0 &&\r
- ( abs_path[ path_len ] == _T('\\') || abs_path[ path_len ] == _T('\0') ) ) break;\r
- }\r
+ pp_over = wr->m_Paths + wr->m_nPath;\r
+ for ( pp = wr->m_Paths; ; pp++ ) {\r
+ IF ( pp >= pp_over ) { e=E_OUT_OF_WRITABLE; goto fin; }\r
+ // Path (abs_path) \82Í\81AAppKey_newWritable \82Å\8b\96\89Â\82³\82ê\82Ä\82¢\82Ü\82¹\82ñ\81B\r
+ // \83E\83H\83b\83`\81E\83E\83B\83\93\83h\83E\82É g_CurrentWritables.m_Paths,3 \82È\82Ç\82ð\93ü\97Í\82µ\82Ä\r
+ // \8b\96\89Â\82³\82ê\82Ä\82¢\82é\83p\83X\82ð\8am\94F\82µ\82Ä\82\82¾\82³\82¢\81B\r
\r
- e=0;\r
-fin:\r
- return e;\r
+ path_len = _tcslen( *pp );\r
+ if ( _tcsnicmp( *pp, abs_path, path_len ) == 0 &&\r
+ ( abs_path[ path_len ] == _T('\\') || abs_path[ path_len ] == _T('\0') ) ) break;\r
+ }\r
\r
-err_wr: e = E_OutOfWritable; goto fin;\r
+ e=0;\r
+fin:\r
+ return e;\r
}\r
\r
\r
+ \r
+/***********************************************************************\r
+ <<< [AppKey_checkWritable] >>> \r
+************************************************************************/\r
+errnum_t AppKey_checkWritable( const TCHAR* Path )\r
+{\r
+ return AppKey_addNewWritableFolder( Path );\r
+}\r
+\r
\r
\r
/***********************************************************************\r
<<< [Writables_init] >>> \r
************************************************************************/\r
-static void Writables_init_const( Writables* m )\r
+static void Writables_initConst( Writables* m )\r
{\r
- m->m_Paths = NULL;\r
- m->m_nPath = -1;\r
+ m->m_Paths = NULL;\r
+ m->m_nPath = -1;\r
}\r
\r
\r
-static int Writables_init( Writables* m, AppKey* Key )\r
+static errnum_t Writables_init( Writables* m, AppKey* Key )\r
{\r
- IF( ! AppKey_isSame( Key ) ) return E_Others;\r
+ IF( ! AppKey_isSame( Key ) ) return E_OTHERS;\r
\r
- m->m_Paths = NULL;\r
- m->m_nPath = 0;\r
- return 0;\r
+ m->m_Paths = NULL;\r
+ m->m_nPath = 0;\r
+ return 0;\r
}\r
\r
\r
-static int Writables_finish( Writables* m, int e )\r
+static errnum_t Writables_finish( Writables* m, int e )\r
{\r
- int ee;\r
+ errnum_t ee;\r
\r
- ee= Writables_clearPaths( m ); IF(ee&&!e) e=ee;\r
- m->m_nPath = -1;\r
- return e;\r
+ ee= Writables_clearPaths( m ); IF(ee&&!e) e=ee;\r
+ m->m_nPath = -1;\r
+ return e;\r
}\r
\r
\r
-static int Writables_isInited( Writables* m )\r
+static bool Writables_isInited( Writables* m )\r
{\r
- return ( m->m_nPath != -1 );\r
+ return ( m->m_nPath != -1 );\r
}\r
\r
\r
-static int Writables_clearPaths( Writables* m )\r
+static errnum_t Writables_clearPaths( Writables* m )\r
{\r
- TCHAR** p;\r
- TCHAR** p_over;\r
+ TCHAR** p;\r
+ TCHAR** p_over;\r
\r
- if ( m->m_Paths != NULL ) {\r
- p_over = m->m_Paths + m->m_nPath;\r
- for ( p = m->m_Paths; p < p_over; p++ ) {\r
- free( *p );\r
- }\r
- free( m->m_Paths ); m->m_Paths = NULL;\r
- }\r
- m->m_nPath = 0;\r
- return 0;\r
+ if ( m->m_Paths != NULL ) {\r
+ p_over = m->m_Paths + m->m_nPath;\r
+ for ( p = m->m_Paths; p < p_over; p++ ) {\r
+ free( *p );\r
+ }\r
+ free( m->m_Paths ); m->m_Paths = NULL;\r
+ }\r
+ m->m_nPath = 0;\r
+ return 0;\r
}\r
\r
\r
-static int Writables_create( Writables** out_m, AppKey* Key )\r
+static errnum_t Writables_create( Writables** out_m, AppKey* Key )\r
{\r
- Writables* m; int e;\r
+ errnum_t e;\r
+ Writables* m;\r
\r
- m = (Writables*) malloc( sizeof(*m) ); IF(m==NULL)return E_FewMemory;\r
- Writables_init_const( m );\r
- e= Writables_init( m, Key ); IF(e)goto resume;\r
- *out_m = m;\r
- return 0;\r
+ m = (Writables*) malloc( sizeof(*m) ); IF(m==NULL)return E_FEW_MEMORY;\r
+ Writables_initConst( m );\r
+ e= Writables_init( m, Key ); IF(e)goto resume;\r
+ *out_m = m;\r
+ return 0;\r
resume: Writables_delete( m, 0 ); free(m); return e;\r
}\r
\r
\r
-int Writables_delete( Writables* m, int e )\r
+errnum_t Writables_delete( Writables* m, errnum_t e )\r
{\r
- if ( m == NULL ) goto fin;\r
- e= Writables_finish( m, e );\r
- free( m );\r
+ if ( m == NULL ) goto fin;\r
+ e= Writables_finish( m, e );\r
+ free( m );\r
fin:\r
- return e;\r
+ return e;\r
}\r
\r
\r
************************************************************************/\r
int Writables_add( Writables* m, AppKey* Key, TCHAR* Path )\r
{\r
- int e;\r
- TCHAR** pp;\r
- TCHAR* p = NULL;\r
- size_t path_size;\r
- TCHAR abs_path[MAX_PATH];\r
+ int e;\r
+ TCHAR** pp;\r
+ TCHAR* p = NULL;\r
+ size_t path_size;\r
+ TCHAR abs_path[MAX_PATH];\r
\r
- IF( ! AppKey_isSame( Key ) )goto err;\r
- if ( Path[0] == _T('\0') ) return 0;\r
+ IF( ! AppKey_isSame( Key ) )goto err;\r
+ if ( Path[0] == _T('\0') ) return 0;\r
\r
- e= StrT_getAbsPath( abs_path, sizeof(abs_path), Path, NULL ); IF(e)goto resume;\r
+ e= StrT_getAbsPath( abs_path, sizeof(abs_path), Path, NULL ); IF(e)goto resume;\r
\r
- e= CurrentWritables_askFileAccess( &g_CurrentWritablesPrivate, abs_path ); IF(e)goto resume;\r
+ e= CurrentWritables_askFileAccess( &g_CurrentWritablesPrivate, abs_path ); IF(e)goto resume;\r
\r
- pp = (TCHAR**) realloc( m->m_Paths, (m->m_nPath + 1) * sizeof(TCHAR*) );\r
- IF( pp == NULL ) goto err;\r
- m->m_Paths = pp;\r
+ pp = (TCHAR**) realloc( m->m_Paths, (m->m_nPath + 1) * sizeof(TCHAR*) );\r
+ IF( pp == NULL ) goto err;\r
+ m->m_Paths = pp;\r
\r
- path_size = (_tcslen( abs_path ) + 1) * sizeof(TCHAR);\r
- p = (TCHAR*) malloc( path_size );\r
- m->m_Paths[ m->m_nPath ] = p;\r
- IF( p == NULL )goto err;\r
+ path_size = (_tcslen( abs_path ) + 1) * sizeof(TCHAR);\r
+ p = (TCHAR*) malloc( path_size );\r
+ m->m_Paths[ m->m_nPath ] = p;\r
+ IF( p == NULL )goto err;\r
\r
- memcpy( p, abs_path, path_size );\r
- if ( p[ path_size/sizeof(TCHAR) - 2 ] == _T('\\') )\r
- p[ path_size/sizeof(TCHAR) - 2 ] = _T('\0');\r
- m->m_nPath ++;\r
+ memcpy( p, abs_path, path_size );\r
+ if ( p[ path_size/sizeof(TCHAR) - 2 ] == _T('\\') )\r
+ p[ path_size/sizeof(TCHAR) - 2 ] = _T('\0');\r
+ m->m_nPath ++;\r
\r
- e=0;\r
+ e=0;\r
fin:\r
- return e;\r
+ return e;\r
\r
-err: e = E_Others; goto resume;\r
+err: e = E_OTHERS; goto resume;\r
resume:\r
- if ( p != NULL ) free( p );\r
- goto fin;\r
+ if ( p != NULL ) free( p );\r
+ goto fin;\r
}\r
\r
\r
int Writables_remove( Writables* m, TCHAR* Path )\r
{\r
- TCHAR** pp;\r
- TCHAR** pp_over;\r
+ TCHAR** pp;\r
+ TCHAR** pp_over;\r
\r
- pp_over = m->m_Paths + m->m_nPath;\r
- for ( pp = m->m_Paths; ; pp++ ) {\r
- if ( pp >= pp_over ) return 0;\r
- if ( _tcscmp( *pp, Path ) == 0 ) break;\r
- }\r
- free( *pp );\r
- memmove( pp, pp+1, (char*)pp - (char*)pp_over - sizeof(TCHAR) );\r
- m->m_nPath --;\r
+ pp_over = m->m_Paths + m->m_nPath;\r
+ for ( pp = m->m_Paths; ; pp++ ) {\r
+ if ( pp >= pp_over ) return 0;\r
+ if ( _tcscmp( *pp, Path ) == 0 ) break;\r
+ }\r
+ free( *pp );\r
+ memmove( pp, pp+1, (char*)pp - (char*)pp_over - sizeof(TCHAR) );\r
+ m->m_nPath --;\r
\r
- #if _DEBUG\r
- *( pp_over - 1 ) = NULL;\r
- #endif\r
+ #if _DEBUG\r
+ *( pp_over - 1 ) = NULL;\r
+ #endif\r
\r
- return 0;\r
+ return 0;\r
}\r
\r
\r
************************************************************************/\r
int Writables_enable( Writables* m )\r
{\r
- int e;\r
+ int e;\r
\r
- e= Writables_copyToConst( &g_CurrentWritablesPrivate.m_CurrentWritables, m ); IF(e)goto fin;\r
- e= Writables_copyToConst( &g_CurrentWritables, &g_CurrentWritablesPrivate.m_CurrentWritables ); IF(e)goto fin;\r
+ e= Writables_copyToConst( &g_CurrentWritablesPrivate.m_CurrentWritables, m ); IF(e)goto fin;\r
+ e= Writables_copyToConst( &g_CurrentWritables, &g_CurrentWritablesPrivate.m_CurrentWritables ); IF(e)goto fin;\r
\r
- e=0;\r
+ e=0;\r
fin:\r
- return e;\r
+ return e;\r
}\r
\r
\r
int Writables_disable( Writables* m, int e )\r
{\r
- int ee;\r
+ int ee;\r
\r
- ee= Writables_copyToConst( &g_CurrentWritablesPrivate.m_CurrentWritables, NULL ); IF(ee&&!e)goto fin;\r
- ee= Writables_copyToConst( &g_CurrentWritables, NULL ); IF(ee&&!e)goto fin;\r
+ UNREFERENCED_VARIABLES( m );\r
\r
- e=0;\r
+ ee= Writables_copyToConst( &g_CurrentWritablesPrivate.m_CurrentWritables, NULL ); IF(ee&&!e)goto fin;\r
+ ee= Writables_copyToConst( &g_CurrentWritables, NULL ); IF(ee&&!e)goto fin;\r
+\r
+ e=0;\r
fin:\r
- return e;\r
+ return e;\r
}\r
\r
\r
static int Writables_copyToConst( Writables* To, Writables* From )\r
{\r
- int e;\r
- TCHAR** pp;\r
- TCHAR** pp_over;\r
- TCHAR* p2;\r
- TCHAR** pp2;\r
- size_t path_size;\r
-\r
- if ( To->m_Paths != NULL ) {\r
- free( To->m_Paths );\r
- To->m_Paths = NULL;\r
- To->m_nPath = 0;\r
- }\r
+ int e;\r
+ TCHAR** pp;\r
+ TCHAR** pp_over;\r
+ TCHAR* p2;\r
+ TCHAR** pp2;\r
+ size_t path_size;\r
+\r
+ if ( To->m_Paths != NULL ) {\r
+ free( To->m_Paths );\r
+ To->m_Paths = NULL;\r
+ To->m_nPath = 0;\r
+ }\r
\r
- if ( From != NULL && From->m_nPath > 0 ) {\r
+ if ( From != NULL && From->m_nPath > 0 ) {\r
\r
- path_size = 0;\r
- pp_over = From->m_Paths + From->m_nPath;\r
- for ( pp = From->m_Paths; pp < pp_over; pp++ ) {\r
- path_size += _tcslen( *pp ) + 1;\r
- }\r
+ path_size = 0;\r
+ pp_over = From->m_Paths + From->m_nPath;\r
+ for ( pp = From->m_Paths; pp < pp_over; pp++ ) {\r
+ path_size += _tcslen( *pp ) + 1;\r
+ }\r
\r
- path_size = From->m_nPath * sizeof(TCHAR*) + path_size * sizeof(TCHAR);\r
- To->m_Paths = (TCHAR**) malloc( path_size );\r
- IF( To->m_Paths == NULL ) goto err;\r
-\r
- p2 = (TCHAR*)( (char*)To->m_Paths + From->m_nPath * sizeof(TCHAR*) );\r
- pp2 = To->m_Paths;\r
- for ( pp = From->m_Paths; pp < pp_over; pp++ ) {\r
- *pp2 = p2;\r
- path_size = (_tcslen( *pp ) + 1) * sizeof(TCHAR);\r
- memcpy( p2, *pp, path_size );\r
- p2 = (TCHAR*)( (char*)p2 + path_size );\r
- pp2 ++;\r
- }\r
- To->m_nPath = From->m_nPath;\r
- }\r
+ path_size = From->m_nPath * sizeof(TCHAR*) + path_size * sizeof(TCHAR);\r
+ To->m_Paths = (TCHAR**) malloc( path_size );\r
+ IF( To->m_Paths == NULL ) goto err;\r
+\r
+ p2 = (TCHAR*)( (char*)To->m_Paths + From->m_nPath * sizeof(TCHAR*) );\r
+ pp2 = To->m_Paths;\r
+ for ( pp = From->m_Paths; pp < pp_over; pp++ ) {\r
+ *pp2 = p2;\r
+ path_size = (_tcslen( *pp ) + 1) * sizeof(TCHAR);\r
+ memcpy( p2, *pp, path_size );\r
+ p2 = (TCHAR*)( (char*)p2 + path_size );\r
+ pp2 ++;\r
+ }\r
+ To->m_nPath = From->m_nPath;\r
+ }\r
\r
- e=0;\r
+ e=0;\r
fin:\r
- return e;\r
+ return e;\r
\r
-err: e = E_Others; goto fin;\r
+err: e = E_OTHERS; goto fin;\r
}\r
\r
\r
/***********************************************************************\r
<<< [CurrentWritables] >>> \r
************************************************************************/\r
-static void CurrentWritables_init_const( CurrentWritables* m )\r
+static void CurrentWritables_initConst( CurrentWritables* m )\r
{\r
- Writables_init_const( &m->m_CurrentWritables );\r
- m->m_ProgramFiles = NULL;\r
- m->m_windir = NULL;\r
- m->m_APPDATA = NULL;\r
- m->m_LOCALAPPDATA = NULL;\r
+ Writables_initConst( &m->m_CurrentWritables );\r
+ m->m_ProgramFiles = NULL;\r
+ m->m_windir = NULL;\r
+ m->m_APPDATA = NULL;\r
+ m->m_LOCALAPPDATA = NULL;\r
}\r
\r
\r
static int CurrentWritables_init( CurrentWritables* m )\r
{\r
- int e;\r
+ int e;\r
#if Uses_OutMallocIDTool\r
- bool is_prev_out_malloc;\r
+ bool is_prev_out_malloc;\r
\r
- is_prev_out_malloc = OutMallocID_setEnable( false );\r
+ is_prev_out_malloc = OutMallocID_setEnable( false );\r
#endif\r
\r
- e= Writables_copyToConst( &m->m_CurrentWritables, NULL ); IF(e)goto fin;\r
+ e= Writables_copyToConst( &m->m_CurrentWritables, NULL ); IF(e)goto fin;\r
\r
- e= env_malloc( &m->m_ProgramFiles, &m->m_ProgramFiles_Len, _T("ProgramFiles") ); IF(e)goto fin;\r
- e= env_malloc( &m->m_windir, &m->m_windir_Len, _T("windir") ); IF(e)goto fin;\r
- e= env_malloc( &m->m_APPDATA, &m->m_APPDATA_Len, _T("APPDATA") ); IF(e)goto fin;\r
- // e= env_malloc( &m->m_LOCALAPPDATA, &m->m_LOCALAPPDATA_Len, _T("LOCALAPPDATA") ); IF(e)goto fin;\r
+ e= env_malloc( &m->m_ProgramFiles, &m->m_ProgramFiles_Len, _T("ProgramFiles") ); IF(e)goto fin;\r
+ e= env_malloc( &m->m_windir, &m->m_windir_Len, _T("windir") ); IF(e)goto fin;\r
+ e= env_malloc( &m->m_APPDATA, &m->m_APPDATA_Len, _T("APPDATA") ); IF(e)goto fin;\r
+ // e= env_malloc( &m->m_LOCALAPPDATA, &m->m_LOCALAPPDATA_Len, _T("LOCALAPPDATA") ); IF(e)goto fin;\r
\r
- e=0;\r
+ e=0;\r
fin:\r
#if Uses_OutMallocIDTool\r
- OutMallocID_setEnable( is_prev_out_malloc );\r
+ OutMallocID_setEnable( is_prev_out_malloc );\r
#endif\r
- return e;\r
+ return e;\r
}\r
\r
\r
static int CurrentWritables_finish( CurrentWritables* m, int e )\r
{\r
- int ee;\r
+ int ee;\r
\r
- ee= Writables_copyToConst( &m->m_CurrentWritables, NULL ); IF(ee&&!e)e=ee;\r
+ ee= Writables_copyToConst( &m->m_CurrentWritables, NULL ); IF(ee&&!e)e=ee;\r
\r
- if ( m->m_ProgramFiles != NULL ) free( m->m_ProgramFiles );\r
- if ( m->m_windir != NULL ) free( m->m_windir );\r
- if ( m->m_APPDATA != NULL ) free( m->m_APPDATA );\r
- if ( m->m_LOCALAPPDATA != NULL ) free( m->m_LOCALAPPDATA );\r
+ if ( m->m_ProgramFiles != NULL ) free( m->m_ProgramFiles );\r
+ if ( m->m_windir != NULL ) free( m->m_windir );\r
+ if ( m->m_APPDATA != NULL ) free( m->m_APPDATA );\r
+ if ( m->m_LOCALAPPDATA != NULL ) free( m->m_LOCALAPPDATA );\r
\r
- m->m_ProgramFiles = NULL;\r
- m->m_windir = NULL;\r
- m->m_APPDATA = NULL;\r
- m->m_LOCALAPPDATA = NULL;\r
+ m->m_ProgramFiles = NULL;\r
+ m->m_windir = NULL;\r
+ m->m_APPDATA = NULL;\r
+ m->m_LOCALAPPDATA = NULL;\r
\r
- return e;\r
+ return e;\r
}\r
\r
\r
-int CurrentWritables_askFileAccess_sub(\r
- const TCHAR* SystemPath, size_t SystemPath_Len, const TCHAR* AbsPath, size_t AbsPath_Len );\r
+static int CurrentWritables_askFileAccess_sub(\r
+ const TCHAR* SystemPath, size_t SystemPath_Len, const TCHAR* AbsPath, size_t AbsPath_Len );\r
\r
static int CurrentWritables_askFileAccess( CurrentWritables* m, const TCHAR* AbsPath )\r
{\r
- int e;\r
- size_t abs_len;\r
+ int e;\r
+ size_t abs_len;\r
\r
- abs_len = _tcslen( AbsPath );\r
- e= CurrentWritables_askFileAccess_sub( m->m_ProgramFiles, m->m_ProgramFiles_Len, AbsPath, abs_len ); IF(e)goto fin;\r
- e= CurrentWritables_askFileAccess_sub( m->m_windir, m->m_windir_Len, AbsPath, abs_len ); IF(e)goto fin;\r
- e= CurrentWritables_askFileAccess_sub( m->m_APPDATA, m->m_APPDATA_Len, AbsPath, abs_len ); IF(e)goto fin;\r
- e= CurrentWritables_askFileAccess_sub( m->m_LOCALAPPDATA, m->m_LOCALAPPDATA_Len, AbsPath, abs_len ); IF(e)goto fin;\r
+ abs_len = _tcslen( AbsPath );\r
+ e= CurrentWritables_askFileAccess_sub( m->m_ProgramFiles, m->m_ProgramFiles_Len, AbsPath, abs_len ); IF(e)goto fin;\r
+ e= CurrentWritables_askFileAccess_sub( m->m_windir, m->m_windir_Len, AbsPath, abs_len ); IF(e)goto fin;\r
+ e= CurrentWritables_askFileAccess_sub( m->m_APPDATA, m->m_APPDATA_Len, AbsPath, abs_len ); IF(e)goto fin;\r
+ e= CurrentWritables_askFileAccess_sub( m->m_LOCALAPPDATA, m->m_LOCALAPPDATA_Len, AbsPath, abs_len ); IF(e)goto fin;\r
\r
- e=0;\r
+ e=0;\r
fin:\r
- return e;\r
+ return e;\r
}\r
\r
\r
static int CurrentWritables_askFileAccess_sub(\r
- const TCHAR* SystemPath, size_t SystemPath_Len, const TCHAR* AbsPath, size_t AbsPath_Len )\r
+ const TCHAR* SystemPath, size_t SystemPath_Len, const TCHAR* AbsPath, size_t AbsPath_Len )\r
{\r
- if ( SystemPath == NULL ) return 0;\r
+ if ( SystemPath == NULL ) return 0;\r
\r
- IF ( _tcsncmp( SystemPath, AbsPath, SystemPath_Len ) == 0 )\r
- return E_OutOfWritable; // \83V\83X\83e\83\80\83t\83H\83\8b\83_\82Ì\92\86\82ð\8f\91\82«\8d\9e\82Ý\8b\96\89Â\82µ\82æ\82¤\82Æ\82µ\82Ä\82¢\82é\r
+ IF ( _tcsncmp( SystemPath, AbsPath, SystemPath_Len ) == 0 )\r
+ return E_OUT_OF_WRITABLE; // \83V\83X\83e\83\80\83t\83H\83\8b\83_\82Ì\92\86\82ð\8f\91\82«\8d\9e\82Ý\8b\96\89Â\82µ\82æ\82¤\82Æ\82µ\82Ä\82¢\82é\r
\r
- IF ( _tcsncmp( SystemPath, AbsPath, AbsPath_Len ) == 0 )\r
- return E_OutOfWritable; // \83V\83X\83e\83\80\83t\83H\83\8b\83_\82ð\8aÜ\82ß\82Ä\8b\96\89Â\8f\91\82«\8d\9e\82Ý\8b\96\89Â\82µ\82æ\82¤\82Æ\82µ\82Ä\82¢\82é\r
+ IF ( _tcsncmp( SystemPath, AbsPath, AbsPath_Len ) == 0 )\r
+ return E_OUT_OF_WRITABLE; // \83V\83X\83e\83\80\83t\83H\83\8b\83_\82ð\8aÜ\82ß\82Ä\8b\96\89Â\8f\91\82«\8d\9e\82Ý\8b\96\89Â\82µ\82æ\82¤\82Æ\82µ\82Ä\82¢\82é\r
\r
- return 0;\r
+ return 0;\r
}\r
\r
\r
\r
/***********************************************************************\r
<<< [StrT_cpy] >>> \r
-- _tcscpy is raising exception, if E_FewArray\r
+- _tcscpy is raising exception, if E_FEW_ARRAY\r
************************************************************************/\r
-int StrT_cpy( TCHAR* Dst, size_t DstSize, const TCHAR* Src )\r
+errnum_t StrT_cpy( TCHAR* Dst, size_t DstSize, const TCHAR* Src )\r
{\r
size_t size;\r
\r
else {\r
memcpy( Dst, Src, DstSize - sizeof(TCHAR) );\r
*(TCHAR*)( (char*) Dst + DstSize ) = _T('\0');\r
- return E_FewArray;\r
+ return E_FEW_ARRAY;\r
}\r
}\r
\r
\r
/***********************************************************************\r
- <<< [StrT_malloc_cpy] >>> \r
+ <<< [MallocAndCopyString] >>> \r
************************************************************************/\r
-TCHAR* StrT_malloc_cpy( const TCHAR* Src )\r
+errnum_t MallocAndCopyString( TCHAR** out_NewString, const TCHAR* SourceString )\r
{\r
- TCHAR* p;\r
- size_t size;\r
+ TCHAR* str;\r
+ size_t size = ( _tcslen( SourceString ) + 1 ) * sizeof(TCHAR);\r
\r
- size = ( _tcslen( Src ) + 1 ) * sizeof(TCHAR);\r
- p = (TCHAR*) malloc( size ); IF(p==NULL) return NULL;\r
- memcpy( p, Src, size );\r
- return p;\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
- <<< [StrT_malloc_cpy_from_char] >>> \r
+ <<< [MallocAndCopyString_char] >>> \r
************************************************************************/\r
-TCHAR* StrT_malloc_cpy_from_char( const char* Src )\r
+#ifdef _UNICODE\r
+errnum_t MallocAndCopyString_char( TCHAR** out_NewString, const char* SourceString )\r
{\r
- #if _UNICODE\r
- TCHAR* p = NULL;\r
- size_t size;\r
- int r;\r
+ TCHAR* str;\r
+ size_t size = ( strlen( SourceString ) + 1 ) * sizeof(TCHAR);\r
+ int r;\r
\r
- size = ( strlen( Src ) + 1 ) * sizeof(TCHAR);\r
- p = (TCHAR*) malloc( size ); IF(p==NULL) return NULL;\r
+ str = (TCHAR*) malloc( size );\r
+ if ( str == NULL ) { return E_FEW_MEMORY; }\r
\r
- r = MultiByteToWideChar( CP_OEMCP, MB_PRECOMPOSED, Src, -1, p, size / 2 );\r
- IF( r == 0 ) goto err;\r
- return p;\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
- err:\r
- free( p );\r
- return NULL;\r
\r
- #else\r
- TCHAR* p;\r
- size_t size;\r
+ \r
+/***********************************************************************\r
+ <<< [MallocAndCopyStringByLength] >>> \r
+************************************************************************/\r
+errnum_t MallocAndCopyStringByLength( TCHAR** out_NewString, const TCHAR* SourceString,\r
+ unsigned CountOfCharacter )\r
+{\r
+ TCHAR* str;\r
+ size_t size = ( CountOfCharacter + 1 ) * sizeof(TCHAR);\r
\r
- size = ( _tcslen( Src ) + 1 ) * sizeof(TCHAR);\r
- p = (TCHAR*) malloc( size ); IF(p==NULL) return NULL;\r
- memcpy( p, Src, size );\r
+ ASSERT_D( *out_NewString == NULL, __noop() );\r
\r
- return p;\r
- #endif\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
\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
+ TCHAR c;\r
+\r
+ p1 = in_Str; while ( *p1 == _T(' ') || *p1 == _T('\t') ) p1++;\r
+ for ( p2 = _tcschr( p1, _T('\0') ) - 1; p2 >= p1; p2-- ) {\r
+ c = *p2;\r
+ if ( c != _T(' ') && c != _T('\t') && c != _T('\n') && c != _T('\r') )\r
+ break;\r
+ }\r
+ return stcpy_part_r( out_Str, out_Str_Size, out_Str, NULL, p1, p2+1 );\r
+}\r
+\r
+\r
+ \r
+/***********************************************************************\r
+ <<< [StrT_cutLastOf] >>> \r
+************************************************************************/\r
+errnum_t StrT_cutLastOf( TCHAR* in_out_Str, TCHAR Charactor )\r
+{\r
+ TCHAR* last = _tcschr( in_out_Str, _T('\0') );\r
+\r
+ if ( last > in_out_Str ) {\r
+ if ( *( last - 1 ) == Charactor )\r
+ { *( last - 1 ) = _T('\0'); }\r
+ }\r
+ return 0;\r
+}\r
+\r
+\r
+ \r
+/***********************************************************************\r
+ <<< [StrT_cutLineComment] >>> \r
+************************************************************************/\r
+errnum_t StrT_cutLineComment( TCHAR* out_Str, size_t out_Str_Size, const TCHAR* in_Str, const TCHAR* CommentSign )\r
+{\r
+ const TCHAR* p1;\r
+ const TCHAR* p2;\r
+ TCHAR c;\r
+\r
+ p1 = in_Str; while ( *p1 == _T(' ') || *p1 == _T('\t') ) p1++;\r
+\r
+ p2 = _tcsstr( p1, CommentSign );\r
+ if ( p2 == NULL ) p2 = _tcschr( p1, _T('\0') );\r
+\r
+ for ( p2 = p2 - 1; p2 >= p1; p2-- ) {\r
+ c = *p2;\r
+ if ( c != _T(' ') && c != _T('\t') && c != _T('\n') && c != _T('\r') )\r
+ break;\r
+ }\r
+ return stcpy_part_r( out_Str, out_Str_Size, out_Str, NULL, p1, p2+1 );\r
+}\r
+\r
+\r
+ \r
+/**************************************************************************\r
+ <<< [StrT_meltCSV] >>> \r
+*************************************************************************/\r
+errnum_t StrT_meltCSV( TCHAR* out_Str, size_t out_Str_Size, const TCHAR** pCSV )\r
+{\r
+ errnum_t e = 0;\r
+ TCHAR* t;\r
+ TCHAR* t_last = (TCHAR*)( (char*)out_Str + out_Str_Size - sizeof(TCHAR) );\r
+ const TCHAR* s;\r
+ TCHAR dummy[2];\r
+ TCHAR c;\r
+\r
+ t = out_Str;\r
+ s = *pCSV;\r
+ if ( out_Str_Size <= 1 ) { t = dummy; t_last = dummy; }\r
+\r
+ if ( s == NULL ) { *t = _T('\0'); return 0; }\r
+\r
+\r
+ /* \93ª\82Ì\8bó\94\92\82ð\8f\9c\82 */\r
+ while ( *s == _T(' ') || *s == _T('\t') ) s++;\r
+\r
+ switch ( *s ) {\r
+\r
+ /* "" \82Å\88Í\82Ü\82ê\82Ä\82¢\82é\8fê\8d\87 */\r
+ case _T('"'):\r
+ s++;\r
+ c = *s;\r
+ while ( c != _T('"') || *(s+1) == _T('"') ) { /* " \95¶\8e\9a\82Ü\82Å */\r
+ if ( t == t_last ) { e = E_FEW_ARRAY; t = dummy; t_last = dummy + 1; }\r
+ if ( c == *(s+1) && c == _T('"') ) s++; /* " \95¶\8e\9a\8e©\91Ì */\r
+ if ( c == _T('\0') ) break;\r
+ *t = c; t++; s++; c = *s;\r
+ }\r
+ *t = _T('\0');\r
+\r
+ s++;\r
+ for (;;) {\r
+ if ( *s == _T(',') ) { s = s+1; break; }\r
+ if ( *s == _T('\0') ) { s = NULL; break; }\r
+ s++;\r
+ }\r
+ *pCSV = s;\r
+ return e;\r
+\r
+ /* \8bó\82Ì\8d\80\96Ú\82Ì\8fê\8d\87 */\r
+ case ',':\r
+ *t = _T('\0');\r
+ *pCSV = s+1;\r
+ return 0;\r
+\r
+ case '\0':\r
+ *t = _T('\0');\r
+ *pCSV = NULL;\r
+ return 0;\r
+\r
+ /* "" \82Å\88Í\82Ü\82ê\82Ä\82¢\82È\82¢\8fê\8d\87 */\r
+ default: {\r
+ TCHAR* sp = NULL; /* \8dÅ\8cã\82Ì\98A\91±\82µ\82½\8bó\94\92\82Ì\90æ\93ª */\r
+\r
+ c = *s;\r
+ while ( c != _T(',') && c != _T('\0') && c != _T('\r') && c != _T('\n') ) { /* , \95¶\8e\9a\82Ü\82Å */\r
+\r
+ /* sp \82ð\90Ý\92è\82·\82é */\r
+ if ( c == ' ' ) {\r
+ if ( sp == NULL ) sp = t;\r
+ }\r
+ else sp = NULL;\r
+\r
+ if ( t == t_last ) { e = E_FEW_ARRAY; t = dummy; t_last = dummy + 1; }\r
+\r
+ /* \83R\83s\81[\82·\82é */\r
+ *t = c; t++; s++; c = *s;\r
+ }\r
+\r
+ /* \95Ô\82è\92l\82ð\8c\88\92è\82·\82é */\r
+ if ( c == _T(',') ) s = s + 1;\r
+ else s = NULL;\r
+\r
+ /* \96\96\94ö\82Ì\8bó\94\92\82ð\8eæ\82è\8f\9c\82 */\r
+ if ( sp != NULL ) *sp = '\0';\r
+ else *t = _T('\0');\r
+\r
+ *pCSV = s;\r
+ return e;\r
+ }\r
+ }\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
+{\r
+ errnum_t e;\r
+ int i;\r
+ TCHAR** syms = NULL;\r
+ bool* syms_exists = NULL;\r
+ bool b_nosym = false;\r
+ TCHAR* sym = NULL;\r
+ size_t sym_size = ( _tcslen( Symbols ) + 1 ) * sizeof(TCHAR);\r
+ int n_sym = 0;\r
+ const TCHAR* p;\r
+\r
+ UNREFERENCED_VARIABLES(( bCase ));\r
+\r
+ sym = (TCHAR*) malloc( sym_size ); IF(sym==NULL)goto err_fm;\r
+\r
+\r
+ //=== Get Symbols\r
+ p = Symbols;\r
+ do {\r
+ e= StrT_meltCSV( sym, sym_size, &p ); IF(e)goto fin;\r
+ if ( sym[0] != _T('\0') ) n_sym ++;\r
+ } while ( p != NULL );\r
+\r
+ syms = (TCHAR**) malloc( n_sym * sizeof(TCHAR*) ); IF(syms==NULL)goto err_fm;\r
+ memset( syms, 0, n_sym * sizeof(TCHAR*) );\r
+ syms_exists = (bool*) malloc( n_sym * sizeof(bool) ); IF(syms_exists==NULL)goto err_fm;\r
+ memset( syms_exists, 0, n_sym * sizeof(bool) );\r
+\r
+ p = Symbols; i = 0;\r
+ do {\r
+ e= StrT_meltCSV( sym, sym_size, &p ); IF(e)goto fin;\r
+ if ( sym[0] != _T('\0') ) {\r
+ e= MallocAndCopyString( &syms[i], sym ); IF(e)goto fin;\r
+ i++;\r
+ }\r
+ } while ( p != NULL );\r
+\r
+\r
+ //=== Check Str whether having Symbols\r
+ p = Str;\r
+ do {\r
+ e= StrT_meltCSV( sym, sym_size, &p ); IF(e)goto fin;\r
+ if ( sym[0] != _T('\0') ) {\r
+ for ( i = 0; i < n_sym; i++ ) {\r
+ if ( _tcscmp( sym, syms[i] ) == 0 ) { syms_exists[i] = true; break; }\r
+ }\r
+ if ( i == n_sym ) b_nosym = true;\r
+ }\r
+ } while ( p != NULL );\r
+\r
+\r
+ //=== Sum numbers\r
+ {\r
+ va_list va;\r
+ unsigned num;\r
+\r
+ va_start( va, Symbols );\r
+ *out = 0;\r
+ for ( i = 0; i < n_sym; i++ ) {\r
+ num = va_arg( va, unsigned );\r
+ if ( syms_exists[i] ) *out |= num;\r
+ }\r
+ va_end( va );\r
+ }\r
+\r
+ e = ( b_nosym ? E_NOT_FOUND_SYMBOL : 0 );\r
+fin:\r
+ if ( syms != NULL ) {\r
+ for ( i = 0; i < n_sym; i++ ) {\r
+ if ( syms[i] != NULL ) free( syms[i] );\r
+ }\r
+ free( syms );\r
+ }\r
+ if ( syms_exists != NULL ) free( syms_exists );\r
+ if ( sym != NULL ) free( sym );\r
+ return e;\r
+err_fm: e= E_FEW_MEMORY; goto fin;\r
+}\r
+\r
+ \r
+/**************************************************************************\r
+ <<< [StrT_meltCmdLine] >>> \r
+*************************************************************************/\r
+errnum_t StrT_meltCmdLine( TCHAR* out_Str, size_t out_Str_Size, const TCHAR** pLine )\r
+{\r
+ errnum_t e = 0;\r
+ TCHAR* t;\r
+ TCHAR* t_last = (TCHAR*)( (char*)out_Str + out_Str_Size - sizeof(TCHAR) );\r
+ const TCHAR* s;\r
+ TCHAR dummy;\r
+ TCHAR c;\r
+\r
+ t = out_Str;\r
+ s = *pLine;\r
+ if ( out_Str_Size <= 1 ) { t = &dummy; t_last = &dummy; }\r
+\r
+ if ( s == NULL ) { *t = _T('\0'); return 0; }\r
+\r
+\r
+ /* \93ª\82Ì\8bó\94\92\82ð\8f\9c\82 */\r
+ while ( *s == _T(' ') || *s == _T('\t') ) s++;\r
+\r
+ switch ( *s ) {\r
+\r
+ /* "" \82Å\88Í\82Ü\82ê\82Ä\82¢\82é\8fê\8d\87 */\r
+ case _T('"'):\r
+ s++;\r
+ c = *s;\r
+ while ( c != _T('"') || *(s+1) == _T('"') ) { /* " \95¶\8e\9a\82Ü\82Å */\r
+ if ( t == t_last ) { e = E_FEW_ARRAY; t = &dummy; t_last = &dummy + 1; }\r
+ if ( c == *(s+1) && c == _T('"') ) s++; /* " \95¶\8e\9a\8e©\91Ì */\r
+ if ( c == _T('\0') ) break;\r
+ *t = c; t++; s++; c = *s;\r
+ }\r
+ *t = _T('\0');\r
+\r
+ s++;\r
+ for (;;) {\r
+ if ( *s == _T(' ') ) { s = s+1; break; }\r
+ if ( *s == _T('\0') ) { s = NULL; break; }\r
+ s++;\r
+ }\r
+ *pLine = s;\r
+ return e;\r
+\r
+ case '\0':\r
+ *t = _T('\0');\r
+ *pLine = NULL;\r
+ return 0;\r
+\r
+ /* "" \82Å\88Í\82Ü\82ê\82Ä\82¢\82È\82¢\8fê\8d\87 */\r
+ default: {\r
+ c = *s;\r
+ while ( c != _T(' ') && c != _T('\0') && c != _T('\r') && c != _T('\n') ) { /* \8bó\94\92\95¶\8e\9a\82Ü\82Å */\r
+\r
+ if ( t == t_last ) { e = E_FEW_ARRAY; t = &dummy; t_last = &dummy + 1; }\r
+\r
+ /* \83R\83s\81[\82·\82é */\r
+ *t = c; t++; s++; c = *s;\r
+ }\r
+\r
+ /* *pLine\82ð\8c\88\92è\82·\82é */\r
+ while ( *s == _T(' ') ) s = s + 1;\r
+ if ( *s == _T('\0') ) s = NULL;\r
+\r
+ /* \96\96\94ö */\r
+ *t = _T('\0');\r
+\r
+ *pLine = s;\r
+ return e;\r
+ }\r
+ }\r
+}\r
+\r
+\r
+ \r
+/***********************************************************************\r
<<< [StrT_isAbsPath] >>> \r
************************************************************************/\r
bool StrT_isAbsPath( const TCHAR* s )\r
}\r
\r
\r
-/***********************************************************************\r
- <<< [StrT_getAbsPath_part]:shlwapi >>> \r
-************************************************************************/\r
-int StrT_getAbsPath_part( TCHAR* Out, size_t OutSize, TCHAR* OutStart,\r
+/**************************************************************************\r
+ <<< [StrT_getAbsPath_part] >>> \r
+*************************************************************************/\r
+errnum_t StrT_getAbsPath_part( TCHAR* out_AbsPath, size_t AbsPathSize, TCHAR* OutStart,\r
TCHAR** out_OutLast, const TCHAR* StepPath, const TCHAR* BasePath )\r
{\r
- int e;\r
- TCHAR* p;\r
- TCHAR base_path_x[512];\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* null_position = NULL;\r
\r
- IF_D( OutStart < Out || (char*) OutStart >= (char*)Out + OutSize )goto err;\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
+ goto err );\r
+ #endif\r
+\r
+\r
+ /* If "StepPath" == "", out_AbsPath = "" */\r
if ( StepPath[0] == _T('\0') ) {\r
- *OutStart = _T('\0');\r
- return 0;\r
+ ASSERT_R( AbsPathSize >= sizeof(TCHAR), goto err_fm );\r
+ out_AbsPath[0] = _T('\0');\r
+ e=0; goto fin;\r
}\r
+\r
+\r
+ /* Set "OutStart" */\r
+ if ( OutStart == NULL )\r
+ { OutStart = out_AbsPath; }\r
+\r
+\r
+ /* Set "separator" : \ or / from "BasePath" */\r
if ( StrT_isAbsPath( StepPath ) ) {\r
- if ( Out == StepPath )\r
- return 0;\r
+ separator_path = StepPath;\r
+ }\r
+ else if ( BasePath == NULL ) {\r
+ separator = _T('\\');\r
+ separator_path = NULL;\r
+ }\r
+ else {\r
+ separator_path = BasePath;\r
+ }\r
+ if ( separator_path != NULL ) {\r
+ const TCHAR* p;\r
+ const TCHAR* p2;\r
+\r
+ p = _tcschr( separator_path, _T('\\') );\r
+ p2 = _tcschr( separator_path, _T('/') );\r
+ if ( p == NULL ) {\r
+ if ( p2 == NULL )\r
+ { separator = _T('\\'); }\r
+ else\r
+ { separator = _T('/'); }\r
+ } else {\r
+ if ( p2 == NULL )\r
+ { separator = _T('\\'); }\r
+ else {\r
+ if ( p < p2 )\r
+ { separator = _T('\\'); }\r
+ else\r
+ { separator = _T('/'); }\r
+ }\r
+ }\r
+ }\r
+\r
+\r
+ /* Set "OutStart" : "BasePath" + / + "StepPath" */\r
+ if ( StrT_isAbsPath( StepPath ) ) {\r
+ size_t step_path_length = _tcslen( StepPath );\r
+\r
+ IF( OutStart + step_path_length >= out_abs_path_over ) goto err_fa;\r
+ memmove( OutStart, StepPath, ( step_path_length + 1 ) * sizeof(TCHAR) );\r
+\r
+ /* Set "null_position" */\r
+ null_position = OutStart + step_path_length;\r
+ }\r
+ else {\r
+ TCHAR c;\r
+ TCHAR* p;\r
+ size_t base_path_length;\r
+ size_t step_path_length = _tcslen( StepPath );\r
+\r
+ if ( BasePath == NULL ) {\r
+ base_path_length = GetCurrentDirectory( 0, NULL ) - 1;\r
+ }\r
+ else {\r
+ base_path_length = _tcslen( BasePath );\r
+ c = BasePath[ base_path_length - 1 ];\r
+ if ( c == _T('\\') || c == _T('/') )\r
+ { base_path_length -= 1; }\r
+ }\r
+\r
+ p = OutStart + base_path_length + 1;\r
+ IF( p + step_path_length >= out_abs_path_over ) goto err_fa;\r
+ memmove( p, StepPath, ( step_path_length + 1 ) * sizeof(TCHAR) );\r
+ /* memmove is for "out_AbsPath" == "StepPath" */\r
+\r
+ if ( BasePath == NULL ) {\r
+ GetCurrentDirectory( base_path_length + 1, OutStart );\r
+ if ( OutStart[ base_path_length - 1 ] == _T('\\') )\r
+ { base_path_length -= 1; }\r
+ } else {\r
+ memcpy( OutStart, BasePath, base_path_length * sizeof(TCHAR) );\r
+ }\r
+ OutStart[ base_path_length ] = separator;\r
+\r
+\r
+ /* Set "null_position" */\r
+ null_position = p + step_path_length;\r
+ }\r
+\r
+\r
+ /* Replace \ and / to "separator" in "OutStart" */\r
+ {\r
+ TCHAR other_separator;\r
+\r
+ if ( separator == _T('/') )\r
+ { other_separator = _T('\\'); }\r
else\r
- return stcpy_part_r( Out, OutSize, OutStart, out_OutLast, StepPath, NULL );\r
+ { other_separator = _T('/'); }\r
+\r
+ e= StrT_replace1( OutStart, other_separator, separator, 0 ); IF(e)goto fin;\r
}\r
\r
- if ( BasePath == NULL ) {\r
- p = _tgetcwd( base_path_x, _countof(base_path_x) ); IF( p == NULL )goto err;\r
- BasePath = base_path_x;\r
+\r
+ /* Replace \*\..\ to \ */\r
+ {\r
+ enum { length = 4 };\r
+ TCHAR parent[ length + 1 ]; /* \..\ or /../ */\r
+ TCHAR* parent_position;\r
+ TCHAR* p;\r
+\r
+ parent[0] = separator;\r
+ parent[1] = _T('.');\r
+ parent[2] = _T('.');\r
+ parent[3] = separator;\r
+ parent[4] = _T('\0');\r
+\r
+ for (;;) {\r
+ parent_position = _tcsstr( OutStart, parent );\r
+ if ( parent_position == NULL ) { break; }\r
+\r
+ p = parent_position - 1;\r
+ for (;;) {\r
+ IF( p < OutStart ) goto err; /* "../" are too many */\r
+ if ( *p == separator ) { break; }\r
+ p -= 1;\r
+ }\r
+\r
+ memmove( p + 1,\r
+ parent_position + length,\r
+ ( null_position - ( parent_position + length ) + 1 ) * sizeof(TCHAR) );\r
+\r
+ null_position -= ( parent_position + length ) - ( p + 1 );\r
+ }\r
+ }\r
+\r
+\r
+ /* Cut last \*\.. */\r
+ {\r
+ enum { length = 3 };\r
+ TCHAR* p;\r
+\r
+ while ( null_position - length >= OutStart ) {\r
+ if ( *( null_position - 3 ) != separator ||\r
+ *( null_position - 2 ) != _T('.') ||\r
+ *( null_position - 1 ) != _T('.') )\r
+ { break; }\r
+\r
+ p = null_position - 4;\r
+ for (;;) {\r
+ IF( p < OutStart ) goto err; /* "../" are too many */\r
+ if ( *p == separator ) { break; }\r
+ p -= 1;\r
+ }\r
+\r
+ *p = _T('\0');\r
+\r
+ null_position = p;\r
+ }\r
+ }\r
+\r
+\r
+ /* Replace \.\ to \ */\r
+ {\r
+ enum { length = 3 };\r
+ TCHAR current[ length + 1 ]; /* \.\ or /./ */\r
+ TCHAR* current_position;\r
+\r
+ current[0] = separator;\r
+ current[1] = _T('.');\r
+ current[2] = separator;\r
+ current[3] = _T('\0');\r
+\r
+ for (;;) {\r
+ current_position = _tcsstr( OutStart, current );\r
+ if ( current_position == NULL ) { break; }\r
+\r
+ memmove( current_position + 1,\r
+ current_position + length,\r
+ ( null_position - ( current_position + length ) + 1 ) * sizeof(TCHAR) );\r
+\r
+ null_position -= length - 1;\r
+ }\r
+ }\r
+\r
+\r
+ /* Cut last \. */\r
+ {\r
+ TCHAR* over = _tcschr( OutStart, _T('\0') );\r
+\r
+ while ( over - 2 >= OutStart &&\r
+ *( over - 1 ) == _T('.') && *( over - 2 ) == separator ) {\r
+ over -= 2;\r
+ *over = _T('\0');\r
+ }\r
+ }\r
+\r
+\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
+\r
+ *( null_position + 0 ) = separator;\r
+ *( null_position + 1 ) = _T('\0');\r
+ null_position += 1;\r
+ }\r
}\r
\r
\r
- //=== \90â\91Î\83p\83X\82É\82·\82é\81B ".." \82à\8f\88\97\9d\82·\82é\r
- IF( OutSize - ((char*)OutStart - (char*)Out) < MAX_PATH*sizeof(TCHAR) ) return E_FewArray;\r
- _tcscpy_s( OutStart, MAX_PATH, BasePath );\r
- PathAppend( OutStart, StepPath ); // PathAppend \82Ì\91æ1\88ø\90\94\82Ì\83T\83C\83Y\82Í MAX_PATH*sizeof(TCHAR) \88È\8fã\r
+ /* Set "*out_OutLast" */\r
+ if ( out_OutLast != NULL )\r
+ { *out_OutLast = null_position; }\r
+\r
+ e=0;\r
+fin:\r
+ return e;\r
+\r
+err: e = E_OTHERS; goto fin;\r
+err_fa: e = E_FEW_ARRAY; goto fin;\r
+err_fm: e = E_FEW_MEMORY; goto fin;\r
+}\r
\r
\r
- //=== \96\96\94ö\82Ì \ \82ð\83J\83b\83g\82·\82é\r
- p = _tcschr( OutStart, _T('\0') );\r
- if ( *(p-1) == _T('\\') && p > OutStart + 3 ) { p--; *p = _T('\0'); }\r
+ \r
+/***********************************************************************\r
+ <<< [StrT_getParentAbsPath_part] >>> \r
+************************************************************************/\r
+errnum_t StrT_getParentAbsPath_part( TCHAR* Str, size_t StrSize, TCHAR* StrStart,\r
+ TCHAR** out_StrLast, const TCHAR* StepPath, const TCHAR* BasePath )\r
+{\r
+ errnum_t e;\r
+ TCHAR* p;\r
+\r
+ IF_D( StrStart < Str || (char*) StrStart >= (char*)Str + StrSize )goto err;\r
+\r
+ if ( StepPath[0] == _T('\0') ) {\r
+ *StrStart = _T('\0');\r
+ return 0;\r
+ }\r
+\r
+ /* \90â\91Î\83p\83X\82É\82·\82é */\r
+ e= StrT_getAbsPath( StrStart,\r
+ StrSize - ( (char*)StrStart - (char*)Str ),\r
+ StepPath, BasePath ); IF(e)goto fin;\r
+\r
+\r
+ /* Cut last \ */\r
+ p = _tcschr( StrStart, _T('\0') );\r
+ if ( p > StrStart ) {\r
+ TCHAR c = *( p - 1 );\r
+ if ( c == _T('\\') || c == _T('/') )\r
+ { *( p - 1 ) = _T('\0'); }\r
+ }\r
+\r
+\r
+ /* \90e\82Ö */\r
+ p = StrT_refFName( StrStart );\r
+ if ( p > StrStart ) p--;\r
+ *p = _T('\0');\r
+\r
+\r
+ /* \83\8b\81[\83g\82È\82ç \ \82ð\95t\82¯\82é */\r
+ if ( p == StrStart + 2 ) {\r
+ *p = _T('\\'); p++; *p = _T('\0');\r
+ }\r
+\r
+ if ( out_StrLast != NULL ) *out_StrLast = p;\r
+\r
+ e=0;\r
+fin:\r
+ return e;\r
+\r
+err: e = E_OTHERS; goto fin;\r
+}\r
+\r
+\r
+ \r
+/***********************************************************************\r
+ <<< [StrT_isOverOfFileName] >>> \r
+- "" or "\" or "/"\r
+************************************************************************/\r
+inline bool StrT_isOverOfFileName( const TCHAR* PointerInPath )\r
+{\r
+ return PointerInPath == NULL ||\r
+ *PointerInPath == _T('\0') ||\r
+ ( ( *PointerInPath == _T('\\') || *PointerInPath == _T('/') ) &&\r
+ *(PointerInPath + 1) == _T('\0') );\r
+}\r
+\r
+\r
+ \r
+/***********************************************************************\r
+ <<< [StrT_getStepPath] >>> \r
+************************************************************************/\r
+errnum_t StrT_getStepPath( TCHAR* out_StepPath, size_t StepPathSize,\r
+ const TCHAR* AbsPath, const TCHAR* BasePath )\r
+{\r
+ errnum_t e;\r
+ const TCHAR* abs_pointer;\r
+ const TCHAR* base_pointer;\r
+ TCHAR abs_char;\r
+ TCHAR base_char;\r
+ TCHAR separator;\r
+ const TCHAR* abs_separator_pointer = (const TCHAR*) DUMMY_INITIAL_VALUE;\r
+ const TCHAR* base_separator_pointer = (const TCHAR*) DUMMY_INITIAL_VALUE;\r
+ TCHAR* step_pointer;\r
+ TCHAR parent_symbol[4] = { _T('.'), _T('.'), _T('\\'), _T('\0') };\r
+ TCHAR base_path_2[ MAX_PATH ];\r
+\r
+\r
+ ASSERT_D( out_StepPath != AbsPath, goto err );\r
+\r
+ abs_pointer = AbsPath;\r
+\r
+\r
+ /* Set "base_pointer" */\r
+ if ( BasePath == NULL ) {\r
+ base_pointer = _tgetcwd( base_path_2, _countof(base_path_2) );\r
+ IF( base_pointer == NULL ) goto err;\r
+ }\r
+ else {\r
+ base_pointer = BasePath;\r
+ }\r
+\r
+\r
+ /* Set "abs_separator_pointer", "base_separator_pointer" : after same parent folder path */\r
+ separator = 0;\r
+ for (;;) { /* while abs_char == base_char */\r
+ abs_char = *abs_pointer;\r
+ base_char = *base_pointer;\r
+\r
+ abs_char = (TCHAR) _totlower( abs_char );\r
+ base_char = (TCHAR) _totlower( base_char );\r
+\r
+ if ( abs_char == _T('\0') ) {\r
+\r
+ /* out_StepPath = ".", if AbsPath == 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
+ break;\r
+ }\r
+ if ( base_char == _T('\0') ) { break; }\r
+\r
+ if ( abs_char != base_char ) {\r
+ if ( ( abs_char == _T('/') || abs_char == _T('\\') ) &&\r
+ ( base_char == _T('/') || base_char == _T('\\') ) )\r
+ { /* Do nothing */ }\r
+ else\r
+ { break; }\r
+ }\r
+\r
+ /* Set "separator", "abs_separator_pointer", "base_separator_pointer" */\r
+ if ( base_char == _T('/') || base_char == _T('\\') ) {\r
+ if ( separator == 0 )\r
+ { separator = base_char; }\r
+\r
+ abs_separator_pointer = abs_pointer;\r
+ base_separator_pointer = base_pointer;\r
+ }\r
+\r
+ abs_pointer += 1;\r
+ base_pointer += 1;\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
+ if ( abs_char == _T('/') || abs_char == _T('\\') ||\r
+ base_char == _T('/') || base_char == _T('\\') ) {\r
+ /* other character is '\0' */\r
+\r
+ if ( separator == 0 )\r
+ { separator = abs_char; }\r
+\r
+ abs_separator_pointer = abs_pointer;\r
+ base_separator_pointer = base_pointer;\r
+ }\r
+\r
+\r
+ /* out_StepPath = AbsPath, if there is not same folder */\r
+ if ( separator == 0 ) {\r
+ e= StrT_cpy( out_StepPath, StepPathSize, AbsPath ); IF(e)goto fin;\r
+ e=0; goto fin;\r
+ }\r
+\r
+\r
+ /* Add "..\" to "out_StepPath" */\r
+ parent_symbol[2] = separator;\r
+ step_pointer = out_StepPath;\r
+ for (;;) {\r
+ const TCHAR* p1;\r
+ const TCHAR* p2;\r
+\r
+ if ( StrT_isOverOfFileName( base_separator_pointer ) )\r
+ { break; }\r
+\r
+\r
+ /* Set "base_separator_pointer" : next separator */\r
+ p1 = _tcschr( base_separator_pointer + 1, _T('/') );\r
+ p2 = _tcschr( base_separator_pointer + 1, _T('\\') );\r
+\r
+ if ( p1 == NULL ) {\r
+ if ( p2 == NULL )\r
+ { base_separator_pointer = NULL; }\r
+ else\r
+ { base_separator_pointer = p2; }\r
+ }\r
+ else {\r
+ if ( p2 == NULL ) {\r
+ base_separator_pointer = p1;\r
+ } else {\r
+ if ( p1 < p2 )\r
+ { base_separator_pointer = p1; }\r
+ else\r
+ { base_separator_pointer = p2; }\r
+ }\r
+ }\r
+\r
+\r
+ /* Add "..\" to "out_StepPath" */\r
+ e= stcpy_part_r( out_StepPath, StepPathSize, step_pointer, &step_pointer,\r
+ parent_symbol, NULL ); IF(e)goto fin;\r
+ }\r
+\r
+\r
+ /* Copy a part of "AbsPath" 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
+ }\r
+ else {\r
+ e= stcpy_part_r( out_StepPath, StepPathSize, step_pointer, NULL,\r
+ abs_separator_pointer + 1, NULL ); IF(e)goto fin;\r
+ }\r
+\r
+ e=0;\r
+fin:\r
+ return e;\r
+\r
+err: e = E_OTHERS; goto fin;\r
+}\r
+\r
+\r
+ \r
+/***********************************************************************\r
+ <<< [StrT_getBaseName_part] >>> \r
+************************************************************************/\r
+errnum_t StrT_getBaseName_part( TCHAR* Str, size_t StrSize, TCHAR* StrStart,\r
+ TCHAR** out_StrLast, const TCHAR* SrcPath )\r
+{\r
+ const TCHAR* p1;\r
+ const TCHAR* p2;\r
+ const TCHAR* p3;\r
+ const TCHAR* ps;\r
+\r
+ p1 = StrT_refFName( SrcPath );\r
+\r
+\r
+ //=== # \82ª\96³\82¢\82Æ\82«\81A\8dÅ\8cã\82Ì\83s\83\8a\83I\83h\82Ì\91O\82Ü\82Å\82ª\81ABaseName\r
+ ps = _tcschr( p1, _T('#') );\r
+ if ( ps == NULL ) {\r
+ p2 = _tcsrchr( p1, _T('.') );\r
+ if ( p2 == NULL ) p2 = _tcsrchr( p1, _T('\0') );\r
+ }\r
+\r
+ //=== # \82ª\82 \82é\82Æ\82«\81A# \82æ\82è\91O\82Å\81A\8dÅ\8cã\82Ì\83s\83\8a\83I\83h\82Ì\91O\82Ü\82Å\82ª\81ABaseName\r
+ else {\r
+ p2 = ps;\r
+\r
+ p3 = p1;\r
+ for (;;) {\r
+ p3 = _tcschr( p3, _T('.') );\r
+ if ( p3 == NULL || p3 > ps ) break;\r
+ p2 = p3;\r
+ p3 ++;\r
+ }\r
+ }\r
+\r
+ return stcpy_part_r( Str, StrSize, StrStart, out_StrLast, p1, p2 );\r
+}\r
+\r
+ \r
+/***********************************************************************\r
+ <<< [StrT_addLastOfFileName] >>> \r
+************************************************************************/\r
+errnum_t StrT_addLastOfFileName( TCHAR* out_Path, size_t PathSize,\r
+ const TCHAR* BasePath, const TCHAR* AddName )\r
+{\r
+ TCHAR c;\r
+ size_t copy_size;\r
+ size_t free_size;\r
+ char* out_pos;\r
+ const TCHAR* last_pos_in_base = _tcschr( BasePath, _T('\0') );\r
+ const TCHAR* term_pos_in_base;\r
+ const TCHAR* add_pos_in_base;\r
+ const TCHAR* period_pos_in_base = _tcsrchr( BasePath, _T('.') ); // > term_pos_in_base\r
+ const TCHAR* last_pos_in_add = _tcschr( AddName, _T('\0') );\r
+ const TCHAR* term_pos_in_add;\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
+\r
+\r
+ //=== term_pos_in_base\r
+ for ( term_pos_in_base = last_pos_in_base; term_pos_in_base >= BasePath; term_pos_in_base -- ) {\r
+ c = *term_pos_in_base;\r
+ if ( c == _T('/') || c == _T('\\') ) break;\r
+ }\r
+\r
+\r
+ //=== term_pos_in_add\r
+ for ( term_pos_in_add = last_pos_in_add; term_pos_in_add >= AddName; term_pos_in_add -- ) {\r
+ c = *term_pos_in_add;\r
+ if ( c == _T('/') || c == _T('\\') ) break;\r
+ }\r
+\r
+\r
+ //=== add_pos_in_base\r
+ if ( term_pos_in_base < period_pos_in_base ) {\r
+ add_pos_in_base = period_pos_in_base;\r
+ }\r
+ else {\r
+ if ( term_pos_in_base < BasePath )\r
+ add_pos_in_base = _tcschr( BasePath, _T('\0') );\r
+ else\r
+ add_pos_in_base = _tcschr( term_pos_in_base, _T('\0') );\r
+ }\r
+\r
+\r
+ //=== setup output parameters\r
+ out_pos = (char*) out_Path;\r
+ free_size = PathSize;\r
+\r
+\r
+ //=== copy BasePath .. add_pos_in_base\r
+ copy_size = (char*)add_pos_in_base - (char*)BasePath;\r
+ if ( copy_size > free_size ) goto err_fa;\r
+ memcpy( out_pos, BasePath, copy_size );\r
+ out_pos += copy_size;\r
+ free_size -= copy_size;\r
+\r
+\r
+ //=== copy AddName .. last_pos_in_add\r
+ copy_size = (char*)last_pos_in_add - (char*)AddName;\r
+ if ( copy_size > free_size ) goto err_fa;\r
+ memcpy( out_pos, AddName, copy_size );\r
+ out_pos += copy_size;\r
+ free_size -= copy_size;\r
+\r
+\r
+ //=== add name and not change extension\r
+ if ( period_pos_in_add == NULL ) {\r
+\r
+ //=== copy period_pos_in_base .. last_pos_in_base\r
+ if ( period_pos_in_base > term_pos_in_base ) {\r
+ copy_size = (char*)last_pos_in_base - (char*)period_pos_in_base + sizeof(TCHAR);\r
+ if ( copy_size > free_size ) goto err_fa;\r
+ memcpy( out_pos, period_pos_in_base, copy_size );\r
+ }\r
+ else {\r
+ *(TCHAR*)out_pos = _T('\0');\r
+ }\r
+ }\r
+\r
+\r
+ //=== add name and change extension\r
+ else {\r
+\r
+ if ( *(period_pos_in_add + 1) == _T('\0') )\r
+ *( (TCHAR*)out_pos - 1 ) = _T('\0');\r
+ else\r
+ *(TCHAR*)out_pos = _T('\0');\r
+ }\r
+\r
+ return 0;\r
+\r
+err_fa:\r
+ return E_FEW_ARRAY;\r
+}\r
+\r
+\r
+ \r
+/***********************************************************************\r
+ <<< [Strs_init] >>> \r
+************************************************************************/\r
+enum { Strs_FirstSize = 0x0F00 };\r
+\r
+errnum_t Strs_init( Strs* self )\r
+{\r
+ char* p;\r
+\r
+ self->MemoryAddress = NULL;\r
+\r
+ p = (char*) malloc( Strs_FirstSize );\r
+ IF( p == NULL ) return E_FEW_MEMORY;\r
+\r
+ self->MemoryAddress = p;\r
+ self->MemoryOver = p + Strs_FirstSize;\r
+ self->NextElem = p + sizeof(TCHAR*);\r
+ self->PointerToNextStrInPrevElem = (TCHAR**) p;\r
+ self->Prev_PointerToNextStrInPrevElem = NULL;\r
+ *(TCHAR**) p = NULL;\r
+\r
+ self->FirstOfStrs = self;\r
+ self->NextStrs = NULL;\r
+\r
+ return 0;\r
+}\r
+\r
+\r
+ \r
+/***********************************************************************\r
+ <<< [Strs_finish] >>> \r
+************************************************************************/\r
+errnum_t Strs_finish( Strs* self, errnum_t e )\r
+{\r
+ Strs* mp;\r
+ Strs* next_mp;\r
+\r
+ if ( self->MemoryAddress == NULL ) return 0;\r
+\r
+ mp = self->FirstOfStrs;\r
+ for (;;) {\r
+ free( mp->MemoryAddress );\r
+ if ( mp == self ) break;\r
+\r
+ next_mp = mp->NextStrs;\r
+ free( mp );\r
+ mp = next_mp;\r
+ }\r
+ self->MemoryAddress = NULL;\r
+\r
+ return e;\r
+}\r
+\r
+\r
+ \r
+/***********************************************************************\r
+ <<< [Strs_toEmpty] >>> \r
+************************************************************************/\r
+errnum_t Strs_toEmpty( Strs* self )\r
+{\r
+ Strs_finish( self, 0 );\r
+ return Strs_init( self );\r
+}\r
+\r
+\r
+ \r
+/***********************************************************************\r
+ <<< [Strs_add] >>> \r
+************************************************************************/\r
+errnum_t Strs_add( Strs* self, const TCHAR* Str, const TCHAR** out_AllocStr )\r
+{\r
+ return Strs_addBinary( self, Str, _tcschr( Str, _T('\0') ) + 1, out_AllocStr );\r
+}\r
+\r
+\r
+errnum_t Strs_addBinary( Strs* self, const TCHAR* Str, const TCHAR* StrOver, const TCHAR** out_AllocStr )\r
+{\r
+ errnum_t e;\r
+ size_t str_size;\r
+ size_t elem_size;\r
+\r
+ str_size = ( (char*) StrOver - (char*) Str );\r
+ elem_size = ( sizeof(TCHAR*) + str_size + sizeof(void*) - 1 ) & ~(sizeof(void*) - 1);\r
+\r
+ if ( self->NextElem + elem_size > self->MemoryOver )\r
+ { e= Strs_expandSize( self, str_size ); IF(e)goto fin; }\r
+\r
+\r
+ // [ NULL | ... ]\r
+ // [ FirstStr | NULL | TCHAR[] | ... ]\r
+ // [ FirstStr | NextStr | TCHAR[] | NULL | TCHAR[] | ... ]\r
+ // [ FirstStr | NextStr | TCHAR[] | NextStr | TCHAR[] ], [ NULL | TCHAR[] | ... ]\r
+\r
+ if ( out_AllocStr != NULL ) *out_AllocStr = (TCHAR*)( self->NextElem + sizeof(TCHAR*) );\r
+\r
+ //=== fill elem\r
+ *(TCHAR**) self->NextElem = NULL;\r
+ memcpy( self->NextElem + sizeof(TCHAR*), Str, str_size );\r
+\r
+ //=== link to elem from previous elem\r
+ *self->PointerToNextStrInPrevElem = (TCHAR*)( self->NextElem + sizeof(TCHAR*) );\r
+\r
+ //=== update self\r
+ self->Prev_PointerToNextStrInPrevElem = self->PointerToNextStrInPrevElem;\r
+ self->PointerToNextStrInPrevElem = (TCHAR**) self->NextElem;\r
+ self->NextElem = self->NextElem + elem_size;\r
+\r
+ e=0;\r
+fin:\r
+ return e;\r
+}\r
+\r
+\r
+ \r
+/***********************************************************************\r
+ <<< [Strs_freeLast] >>> \r
+************************************************************************/\r
+errnum_t Strs_freeLast( Strs* self, TCHAR* AllocStr )\r
+{\r
+ errnum_t e;\r
+ TCHAR* str;\r
+ TCHAR* last_str;\r
+ TCHAR* prev_of_last_str;\r
+ Strs* mp;\r
+ Strs* prev_of_last_mp;\r
+\r
+ if ( self->Prev_PointerToNextStrInPrevElem == NULL ) {\r
+ prev_of_last_str = NULL;\r
+ last_str = NULL;\r
+ for ( Strs_forEach( self, &str ) ) {\r
+ prev_of_last_str = last_str;\r
+ last_str = str;\r
+ }\r
+ }\r
+ else {\r
+ prev_of_last_str = (TCHAR*)( self->Prev_PointerToNextStrInPrevElem + 1 );\r
+ last_str = (TCHAR*)( self->PointerToNextStrInPrevElem + 1 );\r
+ }\r
+\r
+ // [ NULL | ... ]\r
+ IF( last_str != AllocStr ) goto err;\r
+\r
+ // [ FirstStr | NULL | TCHAR[] | ... ]\r
+ if ( prev_of_last_str == NULL ) {\r
+ self->NextElem = self->MemoryAddress + sizeof(TCHAR*);\r
+ self->PointerToNextStrInPrevElem = (TCHAR**) self->MemoryAddress;\r
+ }\r
+\r
+ // [ FirstStr | NextStr | TCHAR[] | NULL | TCHAR[] | ... ]\r
+ else if ( (char*) prev_of_last_str >= self->MemoryAddress &&\r
+ (char*) prev_of_last_str < self->MemoryOver ) {\r
+ self->NextElem = (char*)last_str - sizeof(TCHAR*);\r
+ self->PointerToNextStrInPrevElem = (TCHAR**)( (char*)prev_of_last_str - sizeof(TCHAR*) );\r
+ }\r
+\r
+ // [ FirstStr | NextStr | TCHAR[] | NextStr | TCHAR[] ], [ NULL | TCHAR[] | ... ]\r
+ else {\r
+ prev_of_last_mp = NULL;\r
+ for ( mp = self->FirstOfStrs; mp->NextStrs != self; mp = mp->NextStrs ) {\r
+ prev_of_last_mp = mp;\r
+ }\r
+\r
+ free( self->MemoryAddress );\r
+\r
+ *self = *mp;\r
+\r
+ if ( prev_of_last_mp == NULL ) {\r
+ self->FirstOfStrs = self;\r
+ self->NextStrs = NULL;\r
+ }\r
+ else {\r
+ prev_of_last_mp->NextStrs = self;\r
+ }\r
+\r
+ free( mp );\r
+ }\r
+ *self->PointerToNextStrInPrevElem = NULL;\r
+ self->Prev_PointerToNextStrInPrevElem = NULL;\r
+\r
+ e=0;\r
+fin:\r
+ return e;\r
+\r
+err: e = E_OTHERS; goto fin;\r
+}\r
+\r
+\r
+ \r
+/***********************************************************************\r
+ <<< [Strs_expandSize] >>> \r
+************************************************************************/\r
+errnum_t Strs_expandSize( Strs* self, size_t FreeSize )\r
+{\r
+ Strs* mp;\r
+ Strs* mp2;\r
+ size_t elem_size = ( sizeof(TCHAR*) + FreeSize + sizeof(void*) - 1 ) & ~(sizeof(void*) - 1);\r
+ size_t memory_size;\r
+ char* new_memory;\r
+\r
+ // [ NULL | ... ]\r
+ // [ FirstStr | NULL | TCHAR[] | ... ]\r
+ // [ FirstStr | NextStr | TCHAR[] | NULL | TCHAR[] | ... ]\r
+ // [ FirstStr | NextStr | TCHAR[] | NextStr | TCHAR[] ], [ NULL | TCHAR[] | ... ]\r
+\r
+ while ( self->NextElem + elem_size > self->MemoryOver ) {\r
+\r
+ //=== alloc\r
+ mp = (Strs*) malloc( sizeof(Strs) ); IF(mp==NULL) goto err_fm;\r
+ memory_size = ( self->MemoryOver - self->MemoryAddress ) * 2;\r
+ new_memory = (char*) malloc( memory_size );\r
+ IF( new_memory == NULL ) { free( mp ); goto err_fm; }\r
+\r
+ //=== move old memory\r
+ if ( self->FirstOfStrs == self ) {\r
+ self->FirstOfStrs = mp;\r
+ }\r
+ else {\r
+ for ( mp2 = self->FirstOfStrs; mp2->NextStrs != self; mp2 = mp2->NextStrs );\r
+ mp2->NextStrs = mp;\r
+ }\r
+ *mp = *self;\r
+ mp->NextStrs = self;\r
+\r
+ //=== setup new memory\r
+ self->MemoryAddress = new_memory;\r
+ self->MemoryOver = new_memory + memory_size;\r
+ self->NextElem = new_memory;\r
+ // self->PointerToNextStrInPrevElem is same value\r
+ // self->FirstOfStrs is same value\r
+ // self->NextStrs is always NULL\r
+ }\r
+ return 0;\r
+\r
+err_fm: return E_FEW_ARRAY;\r
+}\r
+\r
+\r
+/***********************************************************************\r
+ <<< [Strs_commit] >>>\r
+************************************************************************/\r
+errnum_t Strs_commit( Strs* self, TCHAR* StrOver )\r
+{\r
+ size_t elem_size;\r
+\r
+ if ( StrOver == NULL )\r
+ { StrOver = _tcschr( (TCHAR*)( self->NextElem + sizeof(TCHAR*) ), _T('\0') ) + 1; }\r
+ elem_size = ( ( (char*)StrOver - self->NextElem ) + sizeof(void*) - 1 ) & ~(sizeof(void*) - 1);\r
+\r
+ //=== fill elem\r
+ *(TCHAR**) self->NextElem = NULL;\r
+\r
+ //=== link to elem from previous elem\r
+ *self->PointerToNextStrInPrevElem = (TCHAR*)( self->NextElem + sizeof(TCHAR*) );\r
+\r
+ //=== update self\r
+ self->PointerToNextStrInPrevElem = (TCHAR**) self->NextElem;\r
+ self->NextElem = self->NextElem + elem_size;\r
+\r
+ return 0;\r
+}\r
+\r
+\r
+ \r
+/***********************************************************************\r
+ <<< [StrArr] >>> \r
+************************************************************************/\r
+\r
+/*[StrArr_init]*/\r
+errnum_t StrArr_init( StrArr* self )\r
+{\r
+ errnum_t e;\r
+\r
+ Set2_initConst( &self->Array );\r
+ Strs_initConst( &self->Chars );\r
+\r
+ e= Set2_init( &self->Array, 0x100 ); IF(e)goto cancel;\r
+ e= Strs_init( &self->Chars ); IF(e)goto cancel;\r
+ return 0;\r
+\r
+cancel: StrArr_finish( self, e ); return e;\r
+}\r
+\r
+\r
+/*[StrArr_finish]*/\r
+errnum_t StrArr_finish( StrArr* self, errnum_t e )\r
+{\r
+ if ( ! Set2_isInited( &self->Array ) ) return 0;\r
+\r
+ e= Set2_finish( &self->Array, e );\r
+ e= Strs_finish( &self->Chars, e );\r
+ return e;\r
+}\r
+\r
+\r
+/*[StrArr_add]*/\r
+errnum_t StrArr_add( StrArr* self, const TCHAR* Str, int* out_I )\r
+{\r
+ errnum_t e;\r
+\r
+ e= StrArr_expandCount( self, _tcslen( Str ) ); IF(e)goto fin;\r
+ _tcscpy_s( StrArr_getFreeAddr( self ), StrArr_getFreeCount( self ), Str );\r
+ e= StrArr_commit( self ); IF(e)goto fin;\r
+ if ( out_I != NULL ) *out_I = Set2_getCount( &self->Array, TCHAR* ) - 1;\r
+\r
+ e=0;\r
+fin:\r
+ return e;\r
+}\r
+\r
+\r
+/*[StrArr_commit]*/\r
+errnum_t StrArr_commit( StrArr* self )\r
+{\r
+ errnum_t e;\r
+ TCHAR* p;\r
+ TCHAR** pp = NULL;\r
+ Set2* arr = &self->Array;\r
+ Strs* ss = &self->Chars;\r
+\r
+ p = Strs_getFreeAddr( ss );\r
+ e= Set2_alloc( arr, &pp, TCHAR* ); IF(e)goto fin;\r
+ e= Strs_commit( ss, NULL ); IF(e)goto fin;\r
+ *pp = p;\r
+\r
+ e=0;\r
+fin:\r
+ if ( e && pp != NULL ) e= Set2_freeLast( arr, pp, TCHAR*, e );\r
+ return e;\r
+}\r
+\r
+\r
+/*[StrArr_fillTo]*/\r
+errnum_t StrArr_fillTo( StrArr* self, int n, const TCHAR* Str )\r
+{\r
+ errnum_t e;\r
+ const TCHAR* p;\r
+ const TCHAR** pp;\r
+ const TCHAR** pp_over;\r
+\r
+ n -= Set2_getCount( &self->Array, TCHAR* );\r
+ if ( n <= 0 ) return 0;\r
+\r
+ if ( Str == NULL ) {\r
+ p = NULL;\r
+ }\r
+ else {\r
+ e= Strs_add( &self->Chars, Str, &p ); IF(e)goto fin;\r
+ }\r
+\r
+ e= Set2_allocMulti( &self->Array, &pp, TCHAR*, n ); IF(e)goto fin;\r
+ pp_over = pp + n;\r
+ for ( ; pp < pp_over; pp++ )\r
+ *pp = p;\r
+\r
+ e=0;\r
+fin:\r
+ return e;\r
+}\r
+\r
+\r
+/*[StrArr_toEmpty]*/\r
+errnum_t StrArr_toEmpty( StrArr* self )\r
+{\r
+ errnum_t e, ee;\r
+\r
+ e=0;\r
+ ee= Set2_toEmpty( &self->Array ); IF(ee&&!e)e=ee;\r
+ ee= Strs_toEmpty( &self->Chars ); IF(ee&&!e)e=ee;\r
+ return e;\r
+}\r
+\r
+\r
+ \r
+/***********************************************************************\r
+ <<< [StrArr_parseCSV] >>> \r
+************************************************************************/\r
+errnum_t StrArr_parseCSV( StrArr* self, const TCHAR* CSVLine )\r
+{\r
+ errnum_t e;\r
+ const TCHAR* p = CSVLine;\r
+\r
+ e= StrArr_toEmpty( self ); IF(e)goto fin;\r
+\r
+ do {\r
+ e= StrT_meltCSV( StrArr_getFreeAddr( self ), StrArr_getFreeSize( self ), &p );\r
+ if ( e == E_FEW_ARRAY ) {\r
+ e= StrArr_expandSize( self, StrArr_getFreeSize( self ) * 2 ); IF(e)goto fin;\r
+ continue;\r
+ }\r
+ IF(e)goto fin;\r
+\r
+ e = StrArr_commit( self ); IF(e)goto fin;\r
+ } while ( p != NULL );\r
+\r
+ e=0;\r
+fin:\r
+ return e;\r
+}\r
+\r
+\r
+ \r
+/*=================================================================*/\r
+/* <<< [SetX/SetX.c] >>> */ \r
+/*=================================================================*/\r
+ \r
+/***********************************************************************\r
+ <<< [Set2_init] >>> \r
+************************************************************************/\r
+int Set2_init( Set2* m, int FirstSize )\r
+{\r
+ m->First = malloc( FirstSize );\r
+ if ( m->First == NULL ) return E_FEW_MEMORY;\r
+ m->Next = m->First;\r
+ m->Over = (char*)m->First + FirstSize;\r
+\r
+ #ifdef _DEBUG\r
+ m->PointerOfDebugArray = NULL;\r
+ #endif\r
+\r
+ return 0;\r
+}\r
+ \r
+/***********************************************************************\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 ( out_OutLast != NULL ) *out_OutLast = p;\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: e = E_Others; goto fin;\r
+err_ns: e = E_NOT_FOUND_SYMBOL; goto fin;\r
}\r
\r
\r
\r
/***********************************************************************\r
- <<< [StrT_getParentAbsPath_part] >>> \r
+ <<< [Set2_alloc_imp] >>> \r
************************************************************************/\r
-int StrT_getParentAbsPath_part( TCHAR* Str, size_t StrSize, TCHAR* StrStart,\r
- TCHAR** out_StrLast, const TCHAR* StepPath, const TCHAR* BasePath )\r
+int Set2_alloc_imp( Set2* m, void* pp, size_t size )\r
{\r
int e;\r
- TCHAR* p;\r
-\r
- IF_D( StrStart < Str || (char*) StrStart >= (char*)Str + StrSize )goto err;\r
-\r
- if ( StepPath[0] == _T('\0') ) {\r
- *StrStart = _T('\0');\r
- return 0;\r
- }\r
\r
- /* \90â\91Î\83p\83X\82É\82·\82é */\r
- e= StrT_getAbsPath( StrStart,\r
- StrSize - ( (char*)StrStart - (char*)Str ),\r
- StepPath, BasePath ); IF(e)goto fin;\r
+ e= Set2_expandIfOverByAddr( m, (char*) m->Next + size ); IF(e)goto fin;\r
+ *(void**)pp = m->Next;\r
+ m->Next = (char*) m->Next + size;\r
\r
+ MEMSET_TO_NOT_INIT( *(void**)pp, size );\r
\r
- /* \90e\82Ö */\r
- p = StrT_refFName( StrStart );\r
- if ( p > StrStart ) p--;\r
- *p = _T('\0');\r
+ e=0;\r
+fin:\r
+ return e;\r
+}\r
\r
\r
- /* \83\8b\81[\83g\82È\82ç \ \82ð\95t\82¯\82é */\r
- if ( p == StrStart + 2 ) {\r
- *p = _T('\\'); p++; *p = _T('\0');\r
- }\r
+int Set2_allocMulti_sub( Set2* m, void* out_pElem, size_t ElemsSize )\r
+{\r
+ int e;\r
+ char* p;\r
\r
- if ( out_StrLast != NULL ) *out_StrLast = p;\r
+ e= Set2_expandIfOverByAddr( m, (char*) m->Next + ElemsSize ); IF(e)goto fin;\r
+ p = (char*) m->Next;\r
+ m->Next = p + ElemsSize;\r
+ *(char**)out_pElem = p;\r
\r
e=0;\r
fin:\r
return e;\r
-\r
-err: e = E_Others; goto fin;\r
}\r
\r
\r
\r
/***********************************************************************\r
- <<< [StrT_getBaseName_part] >>> \r
+ <<< [Set2_expandIfOverByAddr_imp] >>> \r
************************************************************************/\r
-int StrT_getBaseName_part( TCHAR* Str, size_t StrSize, TCHAR* StrStart,\r
- TCHAR** out_StrLast, const TCHAR* SrcPath )\r
+int Set2_expandIfOverByAddr_imp( Set2* m, void* OverAddrBasedOnNowFirst )\r
{\r
- const TCHAR* p1;\r
- const TCHAR* p2;\r
- const TCHAR* p3;\r
- const TCHAR* ps;\r
+ void* new_first;\r
+ unsigned offset_of_over;\r
+ unsigned offset_of_next;\r
\r
- p1 = StrT_refFName( SrcPath );\r
+ if ( OverAddrBasedOnNowFirst <= m->Over ) return E_OTHERS;\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
\r
- //=== # \82ª\96³\82¢\82Æ\82«\81A\8dÅ\8cã\82Ì\83s\83\8a\83I\83h\82Ì\91O\82Ü\82Å\82ª\81ABaseName\r
- ps = _tcschr( p1, _T('#') );\r
- if ( ps == NULL ) {\r
- p2 = _tcsrchr( p1, _T('.') );\r
- if ( p2 == NULL ) p2 = _tcsrchr( p1, _T('\0') );\r
- }\r
+ new_first = realloc( m->First, offset_of_over * 2 );\r
+ IF( new_first == NULL ) goto err_fm;\r
\r
- //=== # \82ª\82 \82é\82Æ\82«\81A# \82æ\82è\91O\82Å\81A\8dÅ\8cã\82Ì\83s\83\8a\83I\83h\82Ì\91O\82Ü\82Å\82ª\81ABaseName\r
- else {\r
- p2 = ps;\r
+ m->Next = (char*) new_first + ( (char*)m->Next - (char*)m->First );\r
+ m->Over = (char*) new_first + offset_of_over * 2;\r
+ m->First = new_first;\r
\r
- p3 = p1;\r
- for (;;) {\r
- p3 = _tcschr( p3, _T('.') );\r
- if ( p3 == NULL || p3 > ps ) break;\r
- p2 = p3;\r
- p3 ++;\r
- }\r
- }\r
+ #ifdef _DEBUG\r
+ if ( m->PointerOfDebugArray != NULL )\r
+ { *m->PointerOfDebugArray = m->First; }\r
+ #endif\r
\r
- return stcpy_part_r( Str, StrSize, StrStart, out_StrLast, p1, p2 );\r
+ return 0;\r
+\r
+err: return E_OTHERS;\r
+err_fm: return E_FEW_MEMORY;\r
}\r
\r
\r
/***********************************************************************\r
- <<< [StrT_addLastOfFileName] >>> \r
+ <<< [Set2_separate] >>> \r
************************************************************************/\r
-int StrT_addLastOfFileName( TCHAR* out_Path, size_t PathSize,\r
- const TCHAR* BasePath, const TCHAR* AddName )\r
+int Set2_separate( Set2* m, int NextSize, void** allocate_Array )\r
{\r
- TCHAR c;\r
- size_t copy_size;\r
- size_t free_size;\r
- char* out_pos;\r
- const TCHAR* last_pos_in_base = _tcschr( BasePath, _T('\0') );\r
- const TCHAR* term_pos_in_base;\r
- const TCHAR* add_pos_in_base;\r
- const TCHAR* period_pos_in_base = _tcsrchr( BasePath, _T('.') ); // > term_pos_in_base\r
- const TCHAR* last_pos_in_add = _tcschr( AddName, _T('\0') );\r
- const TCHAR* term_pos_in_add;\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
-\r
-\r
- //=== term_pos_in_base\r
- for ( term_pos_in_base = last_pos_in_base; term_pos_in_base >= BasePath; term_pos_in_base -- ) {\r
- c = *term_pos_in_base;\r
- if ( c == _T('/') || c == _T('\\') ) break;\r
- }\r
-\r
-\r
- //=== term_pos_in_add\r
- for ( term_pos_in_add = last_pos_in_add; term_pos_in_add >= AddName; term_pos_in_add -- ) {\r
- c = *term_pos_in_add;\r
- if ( c == _T('/') || c == _T('\\') ) break;\r
- }\r
-\r
+ int e;\r
+ void* p = m->First;\r
\r
- //=== add_pos_in_base\r
- if ( term_pos_in_base < period_pos_in_base ) {\r
- add_pos_in_base = period_pos_in_base;\r
+ if ( NextSize == 0 ) {\r
+ MEMSET_TO_NOT_INIT( m, sizeof(*m) );\r
+ m->First = NULL;\r
}\r
else {\r
- if ( term_pos_in_base < BasePath )\r
- add_pos_in_base = _tcschr( BasePath, _T('\0') );\r
- else\r
- add_pos_in_base = _tcschr( term_pos_in_base, _T('\0') );\r
- }\r
-\r
-\r
- //=== setup output parameters\r
- out_pos = (char*) out_Path;\r
- free_size = PathSize;\r
-\r
-\r
- //=== copy BasePath .. add_pos_in_base\r
- copy_size = (char*)add_pos_in_base - (char*)BasePath;\r
- if ( copy_size > free_size ) goto err_fa;\r
- memcpy( out_pos, BasePath, copy_size );\r
- out_pos += copy_size;\r
- free_size -= copy_size;\r
-\r
-\r
- //=== copy AddName .. last_pos_in_add\r
- copy_size = (char*)last_pos_in_add - (char*)AddName;\r
- if ( copy_size > free_size ) goto err_fa;\r
- memcpy( out_pos, AddName, copy_size );\r
- out_pos += copy_size;\r
- free_size -= copy_size;\r
-\r
-\r
- //=== add name and not change extension\r
- if ( period_pos_in_add == NULL ) {\r
-\r
- //=== copy period_pos_in_base .. last_pos_in_base\r
- if ( period_pos_in_base > term_pos_in_base ) {\r
- copy_size = (char*)last_pos_in_base - (char*)period_pos_in_base + sizeof(TCHAR);\r
- if ( copy_size > free_size ) goto err_fa;\r
- memcpy( out_pos, period_pos_in_base, copy_size );\r
- }\r
- else {\r
- *(TCHAR*)out_pos = _T('\0');\r
- }\r
+ e= Set2_init( m, NextSize ); IF(e)goto fin;\r
}\r
+ *allocate_Array = p;\r
\r
+ e=0;\r
+fin:\r
+ return e;\r
+}\r
\r
- //=== add name and change extension\r
- else {\r
-\r
- if ( *(period_pos_in_add + 1) == _T('\0') )\r
- *( (TCHAR*)out_pos - 1 ) = _T('\0');\r
- else\r
- *(TCHAR*)out_pos = _T('\0');\r
- }\r
-\r
- return 0;\r
\r
-err_fa:\r
- return E_FewArray;\r
+ \r
+/***********************************************************************\r
+ <<< [Set2_setDebug] >>> \r
+************************************************************************/\r
+#ifdef _DEBUG\r
+void Set2_setDebug( Set2* m, void** PointerOfDebugArray )\r
+{\r
+ m->PointerOfDebugArray = PointerOfDebugArray;\r
+ *m->PointerOfDebugArray = m->First;\r
}\r
+#endif\r
\r
\r
\r
/***********************************************************************\r
<<< [vsprintf_r] >>> \r
************************************************************************/\r
-int vsprintf_r( char* s, size_t s_size, const char* format, va_list va )\r
+errnum_t vsprintf_r( char* s, size_t s_size, const char* format, va_list va )\r
{\r
#if _MSC_VER\r
#pragma warning(push)\r
#pragma warning(pop)\r
#endif\r
\r
- if ( r == (int) s_size || r == -1 ) { s[s_size-1] = '\0'; return E_FewArray; }\r
- else return 0;\r
+ IF( r == (int) s_size )\r
+ { s[s_size-1] = '\0'; return E_FEW_ARRAY; }\r
+ IF( r == -1 )\r
+ { return E_NOT_FOUND_SYMBOL; } /* Bad character code */\r
+\r
+ return 0;\r
}\r
+\r
+\r
\r
/***********************************************************************\r
<<< [vswprintf_r] >>> \r
************************************************************************/\r
#ifndef __linux__\r
-int vswprintf_r( wchar_t* s, size_t s_size, const wchar_t* format, va_list va )\r
+errnum_t vswprintf_r( wchar_t* s, size_t s_size, const wchar_t* format, va_list va )\r
{\r
size_t tsize = s_size / sizeof(wchar_t);\r
\r
int r = _vsnwprintf( s, tsize, format, va );\r
#pragma warning(pop)\r
\r
- if ( r == (int) tsize || r == -1 ) { s[tsize-1] = '\0'; return E_FewArray; }\r
+ if ( r == (int) tsize || r == -1 ) { s[tsize-1] = '\0'; return E_FEW_ARRAY; }\r
else return 0;\r
}\r
#endif\r
+\r
+\r
\r
/***********************************************************************\r
<<< [stprintf_r] >>> \r
************************************************************************/\r
-int stprintf_r( TCHAR* s, size_t s_size, const TCHAR* format, ... )\r
+errnum_t stprintf_r( TCHAR* s, size_t s_size, const TCHAR* format, ... )\r
{\r
- int e;\r
- va_list va;\r
+ errnum_t e;\r
+ va_list va;\r
\r
- va_start( va, format );\r
- e = vstprintf_r( s, s_size, format, va );\r
- va_end( va );\r
- return e;\r
+ va_start( va, format );\r
+ e = vstprintf_r( s, s_size, format, va );\r
+ va_end( va );\r
+ return e;\r
}\r
\r
\r
/***********************************************************************\r
<<< [stcpy_part_r] >>> \r
************************************************************************/\r
-int stcpy_part_r( TCHAR* s, size_t s_size, TCHAR* s_start, TCHAR** p_s_last,\r
+errnum_t stcpy_part_r( TCHAR* s, size_t s_size, TCHAR* s_start, TCHAR** p_s_last,\r
const TCHAR* src, const TCHAR* src_over )\r
{\r
- size_t s_space = (char*)s + s_size - (char*)s_start;\r
- size_t src_size;\r
+ size_t s_space = (char*)s + s_size - (char*)s_start;\r
+ size_t src_size;\r
\r
- IF_D( s_start < s || (char*)s_start >= (char*)s + s_size ) return 1;\r
+ IF_D( s_start < s || (char*)s_start >= (char*)s + s_size ) { return 1; }\r
\r
- if ( src_over == NULL ) src_over = _tcschr( src, _T('\0') );\r
- src_size = (char*)src_over - (char*)src;\r
- if ( src_size < s_space ) {\r
- memcpy( s_start, src, src_size + sizeof(TCHAR) );\r
- s_start = (TCHAR*)((char*)s_start + src_size); *s_start = _T('\0');\r
- if ( p_s_last != NULL ) *p_s_last = s_start;\r
- return 0;\r
- }\r
- else {\r
- s_space -= sizeof(TCHAR); memcpy( s, src, s_space );\r
- s_start = (TCHAR*)((char*)s_start + s_space ); *s_start = '\0';\r
- if ( p_s_last != NULL ) *p_s_last=s_start;\r
- return E_FewArray;\r
- }\r
+ if ( src_over == NULL ) { src_over = _tcschr( src, _T('\0') ); }\r
+ src_size = (char*)src_over - (char*)src;\r
+ IF ( src_size >= s_space ) {\r
+ s_space -= sizeof(TCHAR);\r
+ memcpy( s, src, s_space );\r
+\r
+ s_start = (TCHAR*)((char*)s_start + s_space );\r
+ *s_start = '\0';\r
+\r
+ if ( p_s_last != NULL ) { *p_s_last=s_start; }\r
+ return E_FEW_ARRAY;\r
+ }\r
+\r
+ memcpy( s_start, src, src_size + sizeof(TCHAR) );\r
+ s_start = (TCHAR*)((char*)s_start + src_size); *s_start = _T('\0');\r
+ if ( p_s_last != NULL ) { *p_s_last = s_start; }\r
+\r
+ return 0;\r
}\r
\r
\r
/***********************************************************************\r
<<< [stprintf_part_r] >>> \r
************************************************************************/\r
-int stprintf_part_r( TCHAR* s, size_t s_size, TCHAR* s_start, TCHAR** p_s_last,\r
+errnum_t stprintf_part_r( TCHAR* s, size_t s_size, TCHAR* s_start, TCHAR** p_s_last,\r
const TCHAR* format, ... )\r
{\r
- int e; va_list va; va_start( va, format );\r
+ errnum_t e;\r
+ va_list va;\r
+ va_start( va, format );\r
\r
- IF_D( s_start < s || (char*)s_start >= (char*)s + s_size ) return 1;\r
+ IF_D( s_start < s || (char*)s_start >= (char*)s + s_size ) {return E_OTHERS;}\r
\r
- e = vstprintf_r( s_start, s_size - ( (char*)s - (char*)s_start), format, va );\r
- va_end( va ); if ( p_s_last != NULL ) *p_s_last = _tcschr( s_start, '\0' );\r
- return e;\r
+ e = vstprintf_r( s_start, s_size - ( (char*)s_start - (char*)s), format, va );\r
+ va_end( va ); if ( p_s_last != NULL ) *p_s_last = _tcschr( s_start, '\0' );\r
+ return e;\r
}\r
\r
\r
/*=================================================================*/\r
-/* <<< [DebugTools/DebugTools.c] >>> */ \r
+/* <<< [Error4/Error4.c] >>> */ \r
/*=================================================================*/\r
\r
/***********************************************************************\r
- <<< [TestableDebugBreak] >>> \r
+ <<< [Get_Error4_Variables] >>> \r
************************************************************************/\r
-dll_global_g_DebugBreakCount int g_bTestableDebugBreak_Disable;\r
-dll_global_g_DebugBreakCount int g_DebugBreakCount;\r
-\r
+static Error4_VariablesClass gs;\r
+#ifdef _DEBUG\r
+ extern Error4_VariablesClass* g_Error4_Variables = &gs;\r
+#endif\r
\r
- \r
-/***********************************************************************\r
- <<< [TestableDebugBreak_isEnabled] >>> \r
-************************************************************************/\r
-int TestableDebugBreak_isEnabled()\r
+Error4_VariablesClass* Get_Error4_Variables()\r
{\r
- return g_bTestableDebugBreak_Disable == 0;\r
+ return &gs;\r
}\r
\r
\r
\r
-/*=================================================================*/\r
-/* <<< [Error4/Error4.c] >>> */ \r
-/*=================================================================*/\r
- \r
/***********************************************************************\r
- <<< [Err2_setBreakErrID] >>> \r
+ <<< [SetBreakErrorID] >>> \r
************************************************************************/\r
#if ERR2_ENABLE_ERROR_BREAK\r
\r
-Err2 g_Err2; /* \8f\89\8aú\92l\82Í\82·\82×\82Ä\83[\83\8d */\r
+dll_global_g_DebugBreakCount Err2 g_Err2; /* \8f\89\8aú\92l\82Í\82·\82×\82Ä\83[\83\8d */\r
\r
-void Err2_setBreakErrID( int ID )\r
+void SetBreakErrorID( int ID )\r
{\r
Err2* m = &g_Err2;\r
\r
}\r
\r
\r
-int TryOnIfTrue_imp()\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
\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
}\r
\r
\r
-//[Err2_clear]\r
-void Err2_clear()\r
+//[ClearError]\r
+void ClearError()\r
{\r
Err2* m = &g_Err2;\r
\r
}\r
\r
\r
+//[IsErrorMode]\r
+bool IsErrorMode()\r
+{\r
+ return ( g_Err2.IsErr != 0 );\r
+}\r
+\r
+\r
//[IfErrThenBreak]\r
void IfErrThenBreak()\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Å Err2_setBreakErrID( N ); \82ð\8cÄ\82Ñ\8fo\82µ\82Ä\82\82¾\82³\82¢\81B\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
- // Err2_clear() \82ð\96Y\82ê\82Ä\82¢\82é\89Â\94\\90«\82ª\82 \82è\82Ü\82·\81B\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
+ }\r
}\r
- Err2_clear();\r
+ ClearError();\r
}\r
\r
//[PushErr]\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
+\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
+/* <<< [DebugTools/DebugTools.c] >>> */ \r
+/*=================================================================*/\r
+ \r
+/***********************************************************************\r
+ <<< [TestableDebugBreak] >>> \r
+************************************************************************/\r
+dll_global_g_DebugBreakCount int g_bTestableDebugBreak_Disable;\r
+dll_global_g_DebugBreakCount int g_DebugBreakCount;\r
+\r
+\r
+ \r
+/***********************************************************************\r
+ <<< [TestableDebugBreak_isEnabled] >>> \r
+************************************************************************/\r
+int TestableDebugBreak_isEnabled()\r
+{\r
+ return g_bTestableDebugBreak_Disable == 0;\r
+}\r
+\r
+\r
+ \r