1 /* The source file was composed by module mixer */
\r
3 #include "include_c.h"
\r
7 /*=================================================================*/
\r
8 /* <<< [Global0/Global0.c] >>> */
\r
9 /*=================================================================*/
\r
11 /***********************************************************************
\r
12 <<< [Globals_initConst] >>>
\r
13 ************************************************************************/
\r
15 void Globals_initConst()
\r
21 /***********************************************************************
\r
22 <<< [Globals_init] >>>
\r
23 ************************************************************************/
\r
28 e= Locale_init(); IF(e)goto fin;
\r
31 goto fin; // for avoid warning of no goto fin
\r
38 /***********************************************************************
\r
39 <<< [Globals_finish] >>>
\r
40 ************************************************************************/
\r
41 int Globals_finish( int e )
\r
49 /*=================================================================*/
\r
50 /* <<< [PlatformSDK_plus/PlatformSDK_plus.c] >>> */
\r
51 /*=================================================================*/
\r
53 /***********************************************************************
\r
54 <<< [GetCommandLineUnnamed] >>>
\r
55 ************************************************************************/
\r
56 int GetCommandLineUnnamed( int Index1, TCHAR* out_AParam, size_t AParamSize )
\r
58 TCHAR* line = GetCommandLine();
\r
67 IF( Index1 < 0 ) goto err_nf;
\r
73 while ( *p == _T(' ') ) p++;
\r
77 if ( c == _T('\0') ) goto err_nf; // Here is not decided to error or not
\r
80 //=== Skip named option
\r
81 else if ( c == _T('/') ) {
\r
85 if ( c == _T('"') || c == _T(' ') || c == _T('\0') ) break;
\r
89 if ( c == _T('"') ) {
\r
91 while ( *p != _T('"') && *p != _T('\0') ) p++;
\r
92 if ( *p == _T('"') ) p++;
\r
96 //=== Skip or Get unnamed parameter
\r
98 while ( *p == _T(' ') ) p++;
\r
103 if ( c == _T('"') ) {
\r
105 while ( *p2 != _T('"') && *p2 != _T('\0') ) p2++;
\r
108 while ( *p2 != _T(' ') && *p2 != _T('\0') ) p2++;
\r
111 if ( index == 0 ) {
\r
114 e= stcpy_part_r( out_AParam, AParamSize, out_AParam, NULL, p, p2 );
\r
115 ASSERT_D( !e, __noop() );
\r
119 p = ( *p2 == _T('"') ) ? p2+1 : p2;
\r
126 if ( AParamSize >= sizeof(TCHAR) ) *out_AParam = _T('\0');
\r
127 IF ( Index1 >= 2 ) return E_NOT_FOUND_SYMBOL;
\r
133 /***********************************************************************
\r
134 <<< [GetCommandLineNamed] >>>
\r
135 ************************************************************************/
\r
136 int GetCommandLineNamed_sub( const TCHAR* Name, bool bCase, bool* out_IsExist, TCHAR* out_Value, size_t ValueSize );
\r
138 int GetCommandLineNamed( const TCHAR* Name, bool bCase, TCHAR* out_Value, size_t ValueSize )
\r
141 return GetCommandLineNamed_sub( Name, bCase, &is_exist, out_Value, ValueSize );
\r
145 int GetCommandLineNamed_sub( const TCHAR* Name, bool bCase, bool* out_IsExist, TCHAR* out_Value, size_t ValueSize )
\r
147 TCHAR* line = GetCommandLine();
\r
151 const size_t name_len = _tcslen( Name );
\r
154 *out_IsExist = true;
\r
160 //=== Compare option name
\r
161 if ( c == _T('/') ) {
\r
166 if ( c == _T(':') || c == _T(' ') || c == _T('\0') ) break;
\r
170 bMatch = ( p2-p == (int)name_len && _tcsncmp( p, Name, p2-p ) == 0 );
\r
172 bMatch = ( p2-p == (int)name_len && _tcsnicmp( p, Name, p2-p ) == 0 );
\r
175 //=== Get the value
\r
176 if ( c == _T(':') ) {
\r
178 if ( *p == _T('"') ) {
\r
181 while ( *p2 != _T('"') && *p2 != _T('\0') ) p2++;
\r
183 return stcpy_part_r( out_Value, ValueSize, out_Value, NULL, p, p2 );
\r
189 while ( *p2 != _T(' ') && *p2 != _T('\0') ) p2++;
\r
191 return stcpy_part_r( out_Value, ValueSize, out_Value, NULL, p, p2 );
\r
197 IF( bMatch ) return E_NOT_FOUND_SYMBOL; // no value error
\r
201 else if ( c == _T('\0') ) break;
\r
204 else if ( c == _T('"') ) {
\r
206 while ( *p != _T('"') && *p != _T('\0') ) p++;
\r
207 while ( *p != _T(' ') && *p != _T('\0') ) p++;
\r
210 while ( *p != _T(' ') && *p != _T('\0') ) p++;
\r
212 while ( *p == _T(' ') ) p++;
\r
215 *out_IsExist = false;
\r
216 return E_NOT_FOUND_SYMBOL;
\r
221 /***********************************************************************
\r
222 <<< [GetCommandLineNamedI] >>>
\r
223 ************************************************************************/
\r
224 int GetCommandLineNamedI( const TCHAR* Name, bool bCase, int* out_Value )
\r
230 e= GetCommandLineNamed_sub( Name, bCase, &is_exist, s, sizeof(s) ); IF(e)goto fin; //[out] s
\r
231 if ( s[0] == _T('0') && s[1] == _T('x') )
\r
232 *out_Value = _tcstoul( s, NULL, 16 );
\r
234 *out_Value = _ttoi( s );
\r
242 /***********************************************************************
\r
243 <<< [GetCommandLineNamedC8] >>>
\r
244 ************************************************************************/
\r
246 int GetCommandLineNamedC8( const TCHAR* Name, bool bCase, char* out_Value, size_t ValueSize )
\r
252 s = (TCHAR*) malloc( ValueSize * sizeof(TCHAR) );
\r
253 e= GetCommandLineNamed_sub( Name, bCase, &is_exist, (TCHAR*) s, ValueSize * sizeof(TCHAR) ); IF(e)goto fin;
\r
255 sprintf_s( out_Value, ValueSize, "%S", s );
\r
257 if ( s != NULL ) free( s );
\r
264 /***********************************************************************
\r
265 <<< [GetCommandLineExist] >>>
\r
266 ************************************************************************/
\r
267 bool GetCommandLineExist( const TCHAR* Name, bool bCase )
\r
273 e = GetCommandLineNamed_sub( Name, bCase, &is_exist, v, sizeof(v) );
\r
274 if ( e == E_NOT_FOUND_SYMBOL ) ClearError();
\r
280 /*=================================================================*/
\r
281 /* <<< [Locale/Locale.c] >>> */
\r
282 /*=================================================================*/
\r
284 /***********************************************************************
\r
285 <<< [g_LocaleSymbol] >>>
\r
286 ************************************************************************/
\r
287 char* g_LocaleSymbol = "";
\r
291 /***********************************************************************
\r
292 <<< [Locale_init] >>>
\r
293 ************************************************************************/
\r
296 g_LocaleSymbol = ".OCP";
\r
297 setlocale( LC_ALL, ".OCP" );
\r
302 /***********************************************************************
\r
303 <<< [Locale_isInited] >>>
\r
304 ************************************************************************/
\r
305 int Locale_isInited()
\r
307 return ( g_LocaleSymbol[0] != '\0' );
\r
308 //
\82±
\82±
\82ª false
\82ð
\95Ô
\82·
\82Æ
\82«
\82Ì
\91Î
\8f\88\96@
\82Í
\81ALocale_isInited
\82Ì
\83w
\83\8b\83v
\82ð
\8eQ
\8fÆ
\82µ
\82Ä
\82
\82¾
\82³
\82¢
\81B
\r
312 /*=================================================================*/
\r
313 /* <<< [FileT/FileT.c] >>> */
\r
314 /*=================================================================*/
\r
316 /***********************************************************************
\r
317 <<< [FileT_isExist] >>>
\r
318 ************************************************************************/
\r
319 bool FileT_isExist( const TCHAR* path )
\r
321 #if ! FileT_isExistWildcard
\r
325 if ( path[0] == _T('\0') ) return false;
\r
326 r = GetFileAttributes( path );
\r
327 return r != (DWORD)-1;
\r
332 WIN32_FIND_DATA data;
\r
334 find = FindFirstFileEx( path, FindExInfoStandard, &data,
\r
335 FindExSearchNameMatch, NULL, 0 );
\r
337 if ( find == INVALID_HANDLE_VALUE ) {
\r
350 /***********************************************************************
\r
351 <<< [FileT_isFile] >>>
\r
352 ************************************************************************/
\r
353 bool FileT_isFile( const TCHAR* path )
\r
355 DWORD r = GetFileAttributes( path );
\r
356 return ( r & (FILE_ATTRIBUTE_DIRECTORY | 0x80000000) ) == 0;
\r
357 // 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
362 /***********************************************************************
\r
363 <<< [FileT_isDir] >>>
\r
364 ************************************************************************/
\r
365 bool FileT_isDir( const TCHAR* path )
\r
367 DWORD r = GetFileAttributes( path );
\r
368 return ( r & (FILE_ATTRIBUTE_DIRECTORY | 0x80000000) ) == FILE_ATTRIBUTE_DIRECTORY;
\r
369 // 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
374 /***********************************************************************
\r
375 <<< [FileT_isDiff] >>>
\r
376 ************************************************************************/
\r
377 int FileT_isDiff( const TCHAR* Path1, const TCHAR* Path2, bool* bDiff )
\r
389 en= _tfopen_s( &f1, Path1, _T("r") );
\r
390 if ( en == ENOENT ) { f1 = NULL; en = 0; }
\r
393 en= _tfopen_s( &f2, Path2, _T("r") );
\r
394 if ( en == ENOENT ) { f2 = NULL; en = 0; }
\r
398 //=== Whether exists or not
\r
399 if ( f1 == NULL ) {
\r
400 if ( f2 == NULL ) { *bDiff = false; e=0; goto fin; }
\r
401 else { *bDiff = true; e=0; goto fin; }
\r
404 if ( f2 == NULL ) { *bDiff = true; e=0; goto fin; }
\r
408 //=== Compare the contents in files
\r
410 enum { size = 0x100000 };
\r
411 size_t size1, size2;
\r
413 buf1 = (char*) malloc( size ); IF(buf1==NULL)goto err_fm;
\r
414 buf2 = (char*) malloc( size ); IF(buf2==NULL)goto err_fm;
\r
418 size1 = fread( buf1, 1, size, f1 );
\r
419 size2 = fread( buf2, 1, size, f2 );
\r
421 if ( size1 != size2 ) break;
\r
422 if ( memcmp( buf1, buf2, size1 ) != 0 ) break;
\r
423 if ( size1 != size ) { b = false; break; }
\r
430 if ( buf1 !=NULL)free(buf1);
\r
431 if ( buf2 !=NULL)free(buf2);
\r
432 if( f1 !=NULL){en=fclose(f1);IF(en)b=true;}
\r
433 if( f2 !=NULL){en=fclose(f2);IF(en)b=true;}
\r
435 err_no: e = E_ERRNO; goto fin;
\r
436 err_fm: e = E_FEW_MEMORY; goto fin;
\r
440 /***********************************************************************
\r
441 <<< [FileT_isSameText] >>>
\r
442 ************************************************************************/
\r
443 int FileT_isSameText( TCHAR* Path1, TCHAR* Path2, int Format1, int Format2, bool* out_bSame )
\r
451 ASSERT_R( Format1 == 0, goto err );
\r
452 ASSERT_R( Format2 == 0, goto err );
\r
454 e= FileT_openForRead( &f1, Path1 ); IF(e)goto fin;
\r
455 e= FileT_openForRead( &f2, Path2 ); IF(e)goto fin;
\r
457 line1[0] = _T('\0');
\r
458 line2[0] = _T('\0');
\r
459 _fgetts( line1, _countof(line1), f1 );
\r
460 _fgetts( line2, _countof(line2), f2 );
\r
461 if ( _tcscmp( line1, line2 ) != 0 ) {
\r
462 *out_bSame = false; e=0; goto fin;
\r
464 if ( feof( f1 ) ) {
\r
465 if ( feof( f2 ) ) break;
\r
467 *out_bSame = false; e=0; goto fin;
\r
475 e= FileT_close( f1, e );
\r
476 e= FileT_close( f2, e );
\r
479 err: e = E_OTHERS; goto fin;
\r
484 /***********************************************************************
\r
485 <<< [FileT_isSameBinaryFile] >>>
\r
486 ************************************************************************/
\r
487 int FileT_isSameBinaryFile( const TCHAR* PathA, const TCHAR* PathB, int Flags, bool* out_IsSame )
\r
490 HANDLE file_a = INVALID_HANDLE_VALUE;
\r
491 HANDLE file_b = INVALID_HANDLE_VALUE;
\r
492 HANDLE mem_a = INVALID_HANDLE_VALUE;
\r
493 HANDLE mem_b = INVALID_HANDLE_VALUE;
\r
494 void* ptr_a = NULL;
\r
495 void* ptr_b = NULL;
\r
499 bool is_same = false;
\r
501 UNREFERENCED_VARIABLES(( Flags ));
\r
504 // file_a, file_b : open PathA, PathB
\r
505 file_a = CreateFile( PathA, GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING,
\r
506 FILE_ATTRIBUTE_NORMAL, 0 );
\r
507 IF( file_a == INVALID_HANDLE_VALUE ) goto err_gt;
\r
509 file_b = CreateFile( PathB, GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING,
\r
510 FILE_ATTRIBUTE_NORMAL, 0 );
\r
511 IF( file_b == INVALID_HANDLE_VALUE ) goto err_gt;
\r
513 // size_a, size_b : size of file_a, file_b
\r
514 size_a = GetFileSize( file_a, NULL );
\r
515 size_b = GetFileSize( file_b, NULL );
\r
517 if ( size_a == size_b && size_a == 0 ) {
\r
520 else if ( size_a == size_b ) {
\r
522 // mem_a, mem_b : map to memory from file_a, file_b
\r
523 mem_a = CreateFileMapping( file_a, NULL, PAGE_READONLY, 0, size_a, NULL );
\r
524 IF( mem_a == INVALID_HANDLE_VALUE ) goto err_gt;
\r
525 mem_b = CreateFileMapping( file_b, NULL, PAGE_READONLY, 0, size_b, NULL );
\r
526 IF( mem_b == INVALID_HANDLE_VALUE ) goto err_gt;
\r
528 // ptr_a, ptr_b : pointer of contents in file_a, file_b
\r
529 ptr_a = MapViewOfFile( mem_a, FILE_MAP_READ, 0, 0, 0 ); IF(ptr_a==NULL)goto err_gt;
\r
530 ptr_b = MapViewOfFile( mem_b, FILE_MAP_READ, 0, 0, 0 ); IF(ptr_b==NULL)goto err_gt;
\r
532 // is_same : is same file_a and file_b
\r
533 if ( memcmp( ptr_a, ptr_b, size_a ) == 0 ) is_same = true;
\r
537 if ( ptr_a != NULL ) { b= UnmapViewOfFile( ptr_a ); IF(!b&&!e) e=SaveWindowsLastError(); }
\r
538 if ( mem_a != INVALID_HANDLE_VALUE ) { b= CloseHandle( mem_a ); IF(!b&&!e) e=SaveWindowsLastError(); }
\r
539 if ( file_a != INVALID_HANDLE_VALUE ) { b= CloseHandle( file_a ); IF(!b&&!e) e=SaveWindowsLastError(); }
\r
540 if ( ptr_b != NULL ) { b= UnmapViewOfFile( ptr_b ); IF(!b&&!e) e=SaveWindowsLastError(); }
\r
541 if ( mem_b != INVALID_HANDLE_VALUE ) { b= CloseHandle( mem_b ); IF(!b&&!e) e=SaveWindowsLastError(); }
\r
542 if ( file_b != INVALID_HANDLE_VALUE ) { b= CloseHandle( file_b ); IF(!b&&!e) e=SaveWindowsLastError(); }
\r
543 *out_IsSame = is_same;
\r
546 err_gt: e = SaveWindowsLastError(); goto fin;
\r
551 /***********************************************************************
\r
552 <<< [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
553 ************************************************************************/
\r
555 /*--- inherit from FileT_CallByNestFindData */
\r
556 void* CallerArgument;
\r
557 TCHAR* AbsPath; // abstruct path
\r
560 DWORD FileAttributes;
\r
564 FuncType CallbackFromNestFind;
\r
565 TCHAR AbsPathMem[4096];
\r
566 } FileT_CallByNestFindDataIn;
\r
568 int FileT_callByNestFind_sub( FileT_CallByNestFindDataIn* m );
\r
571 int FileT_callByNestFind( const TCHAR* Path, BitField Flags, void* Argument, FuncType Callback )
\r
574 FileT_CallByNestFindDataIn data;
\r
579 e= StrT_cpy( data.AbsPathMem, sizeof(data.AbsPathMem), Path ); IF(e)goto fin;
\r
582 /* AbsPathMem
\82Ì
\8dÅ
\8cã
\82É \
\82ª
\96³
\82¢
\82È
\82ç
\92Ç
\89Á
\82·
\82é */
\r
583 p = _tcschr( data.AbsPathMem, _T('\0') );
\r
585 if ( *p != _T('\\') ) {
\r
587 IF( p >= data.AbsPathMem + (sizeof(data.AbsPathMem) / sizeof(TCHAR)) - 1 )goto err_fa;
\r
592 /* data
\82ð
\8f\89\8aú
\89»
\82·
\82é */
\r
593 data.CallerArgument = Argument;
\r
594 data.AbsPath = data.AbsPathMem;
\r
595 data.StepPath = p + 1;
\r
596 data.FileName = p + 1;
\r
597 data.Flags = Flags;
\r
598 data.CallbackFromNestFind = Callback;
\r
601 /*
\8dÄ
\8bN
\8cÄ
\82Ñ
\8fo
\82µ
\8aÖ
\90\94\82Ö */
\r
602 e= FileT_callByNestFind_sub( &data ); IF(e)goto fin;
\r
607 err_fa: e= E_FEW_ARRAY; goto fin;
\r
611 int FileT_callByNestFind_sub( FileT_CallByNestFindDataIn* m )
\r
615 WIN32_FIND_DATA data;
\r
620 /* 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
621 if ( m->Flags & FileT_FolderBeforeFiles ) {
\r
622 *( m->FileName - 1 ) = _T('\0'); // m->AbsPath
\82Ì
\8dÅ
\8cã
\82Ì \
\82ð
\88ê
\8e\9e\93I
\82É
\83J
\83b
\83g
\r
623 *( m->FileName ) = _T('\0'); // m->FileName, m->StepPath
\82ð ""
\82É
\82·
\82é
\r
624 m->FileAttributes = FILE_ATTRIBUTE_DIRECTORY;
\r
626 if ( m->StepPath[0] == _T('\0') ) {
\r
627 TCHAR* step_path = m->StepPath;
\r
628 TCHAR* fname = m->FileName;
\r
630 m->StepPath = _T(".");
\r
631 m->FileName = StrT_refFName( m->AbsPath );
\r
632 e= m->CallbackFromNestFind( m ); IF(e)goto fin;
\r
633 m->StepPath = step_path;
\r
634 m->FileName = fname;
\r
636 else if ( m->FileName[0] == _T('\0') ) {
\r
637 TCHAR* fname = m->FileName;
\r
639 m->FileName = StrT_refFName( m->AbsPath );
\r
640 e= m->CallbackFromNestFind( m ); IF(e)goto fin;
\r
641 m->FileName = fname;
\r
644 e= m->CallbackFromNestFind( m ); IF(e)goto fin;
\r
646 *( m->FileName - 1 ) = _T('\\');
\r
650 /* *
\82ð
\92Ç
\89Á */
\r
652 IF( p >= m->AbsPathMem + (sizeof(m->AbsPathMem) / sizeof(TCHAR)) - 2 )goto err_fa;
\r
653 *p = _T('*'); *(p+1) = _T('\0');
\r
656 /*
\83t
\83@
\83C
\83\8b\82©
\83t
\83H
\83\8b\83_
\82ð
\97ñ
\8b\93\82µ
\82Ü
\82· */
\r
657 find = FindFirstFileEx( m->AbsPathMem, FindExInfoStandard, &data,
\r
658 FindExSearchNameMatch, NULL, 0 );
\r
659 done = ( find == INVALID_HANDLE_VALUE );
\r
663 if ( _tcscmp( data.cFileName, _T(".") ) == 0 ||
\r
664 _tcscmp( data.cFileName, _T("..") ) == 0 ) {
\r
665 done = ! FindNextFile( find, &data );
\r
669 StrT_cpy( m->FileName,
\r
670 sizeof(m->AbsPathMem) - ( (char*)m->FileName - (char*)m->AbsPathMem ),
\r
672 m->FileAttributes = data.dwFileAttributes;
\r
674 if ( data.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY ) {
\r
675 TCHAR* prev_fname = m->FileName;
\r
677 p = _tcschr( m->FileName, _T('\0') );
\r
679 IF( p >= m->AbsPathMem + (sizeof(m->AbsPathMem) / sizeof(TCHAR)) - 2 )goto err_fa;
\r
680 *p = _T('\\'); *(p+1) = _T('\0');
\r
681 m->FileName = p + 1;
\r
683 e= FileT_callByNestFind_sub( m ); IF(e)goto fin; /*
\8dÄ
\8bN
\8cÄ
\82Ñ
\8fo
\82µ */
\r
685 m->FileName = prev_fname;
\r
688 e= m->CallbackFromNestFind( m ); IF(e)goto fin;
\r
691 done = ! FindNextFile( find, &data );
\r
696 /* 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
697 if ( m->Flags & FileT_FolderAfterFiles ) {
\r
698 TCHAR* step_path = m->StepPath;
\r
699 TCHAR* fname = m->FileName;
\r
701 *( m->FileName - 1 ) = _T('\0');
\r
702 m->FileAttributes = FILE_ATTRIBUTE_DIRECTORY;
\r
703 if ( ( *( m->StepPath - 1 ) == _T('\0') ) && ( m->StepPath > m->AbsPath ) ) {
\r
704 m->StepPath = _T(".");
\r
706 m->FileName = StrT_refFName( m->AbsPath );
\r
708 e= m->CallbackFromNestFind( m ); IF(e)goto fin;
\r
710 m->StepPath = step_path;
\r
711 m->FileName = fname;
\r
717 err_fa: e= E_FEW_ARRAY; goto fin;
\r
722 /***********************************************************************
\r
723 <<< [FileT_openForRead] >>>
\r
724 ************************************************************************/
\r
725 int FileT_openForRead( FILE** out_pFile, const TCHAR* Path )
\r
729 assert( Locale_isInited() );
\r
731 #if DEBUGTOOLS_USES
\r
732 { int e= Debug_onOpen( Path ); if(e) return e; }
\r
735 en = _tfopen_s( out_pFile, Path, _T("r")_T(fopen_ccs) );
\r
736 if ( en == ENOENT ) {
\r
737 _tprintf( _T("not found \"%s\"\n"), Path );
\r
743 if ( _tgetcwd( cwd, _countof(cwd) ) != NULL )
\r
744 _tprintf( _T("current = \"%s\"\n"), cwd );
\r
748 return E_NOT_FOUND_SYMBOL;
\r
750 if ( en == EACCES ) {
\r
751 _tprintf( _T("access denied \"%s\"\n"), Path );
\r
752 return E_ACCESS_DENIED;
\r
754 IF(en)return E_OTHERS;
\r
761 /***********************************************************************
\r
762 <<< [FileT_close] >>>
\r
763 ************************************************************************/
\r
764 int FileT_close( FILE* File, int e )
\r
766 if ( File != NULL ) {
\r
767 int r = fclose( File );
\r
768 IF(r&&!e)e=E_ERRNO;
\r
776 /*=================================================================*/
\r
777 /* <<< [StrT/StrT.c] >>> */
\r
778 /*=================================================================*/
\r
780 /***********************************************************************
\r
781 <<< [StrT_cpy] >>>
\r
782 - _tcscpy is raising exception, if E_FEW_ARRAY
\r
783 ************************************************************************/
\r
784 errnum_t StrT_cpy( TCHAR* Dst, size_t DstSize, const TCHAR* Src )
\r
788 size = ( _tcslen( Src ) + 1 ) * sizeof(TCHAR);
\r
789 if ( size <= DstSize ) {
\r
790 memcpy( Dst, Src, size );
\r
794 memcpy( Dst, Src, DstSize - sizeof(TCHAR) );
\r
795 *(TCHAR*)( (char*) Dst + DstSize ) = _T('\0');
\r
796 return E_FEW_ARRAY;
\r
801 /***********************************************************************
\r
802 <<< [MallocAndCopyString] >>>
\r
803 ************************************************************************/
\r
804 errnum_t MallocAndCopyString( TCHAR** out_NewString, const TCHAR* SourceString )
\r
807 size_t size = ( _tcslen( SourceString ) + 1 ) * sizeof(TCHAR);
\r
809 ASSERT_D( *out_NewString == NULL, __noop() );
\r
811 str = (TCHAR*) malloc( size );
\r
812 if ( str == NULL ) { return E_FEW_MEMORY; }
\r
814 memcpy( str, SourceString, size );
\r
816 *out_NewString = str;
\r
822 /***********************************************************************
\r
823 <<< [MallocAndCopyString_char] >>>
\r
824 ************************************************************************/
\r
826 errnum_t MallocAndCopyString_char( TCHAR** out_NewString, const char* SourceString )
\r
829 size_t size = ( strlen( SourceString ) + 1 ) * sizeof(TCHAR);
\r
832 str = (TCHAR*) malloc( size );
\r
833 if ( str == NULL ) { return E_FEW_MEMORY; }
\r
835 r = MultiByteToWideChar( CP_OEMCP, MB_PRECOMPOSED, SourceString, -1, str, size / sizeof(TCHAR) );
\r
838 return E_GET_LAST_ERROR;
\r
840 *out_NewString = str;
\r
847 /***********************************************************************
\r
848 <<< [MallocAndCopyStringByLength] >>>
\r
849 ************************************************************************/
\r
850 errnum_t MallocAndCopyStringByLength( TCHAR** out_NewString, const TCHAR* SourceString,
\r
851 unsigned CountOfCharacter )
\r
854 size_t size = ( CountOfCharacter + 1 ) * sizeof(TCHAR);
\r
856 ASSERT_D( *out_NewString == NULL, __noop() );
\r
858 str = (TCHAR*) malloc( size );
\r
859 if ( str == NULL ) { return E_FEW_MEMORY; }
\r
861 memcpy( str, SourceString, size - sizeof(TCHAR) );
\r
862 str[ CountOfCharacter ] = _T('\0');
\r
864 *out_NewString = str;
\r
870 /***********************************************************************
\r
871 <<< [StrT_chrs] >>>
\r
872 ************************************************************************/
\r
873 TCHAR* StrT_chrs( const TCHAR* s, const TCHAR* keys )
\r
875 if ( *keys == _T('\0') ) return NULL;
\r
877 for ( ; *s != _T('\0'); s++ ) {
\r
878 if ( _tcschr( keys, *s ) != NULL )
\r
886 /***********************************************************************
\r
887 <<< [StrT_skip] >>>
\r
888 ************************************************************************/
\r
889 TCHAR* StrT_skip( const TCHAR* s, const TCHAR* keys )
\r
891 if ( *keys == _T('\0') ) return (TCHAR*) s;
\r
893 for ( ; *s != _T('\0'); s++ ) {
\r
894 if ( _tcschr( keys, *s ) == NULL )
\r
902 /***********************************************************************
\r
903 <<< [StrT_refFName] >>>
\r
904 ************************************************************************/
\r
905 TCHAR* StrT_refFName( const TCHAR* s )
\r
910 p = _tcschr( s, _T('\0') );
\r
912 if ( p == s ) return (TCHAR*) s;
\r
914 for ( p--; p>s; p-- ) {
\r
916 if ( c == _T('\\') || c == _T('/') ) return (TCHAR*) p+1;
\r
918 if ( *p == _T('\\') || *p == _T('/') ) return (TCHAR*) p+1;
\r
923 /***********************************************************************
\r
924 <<< [StrT_refExt] >>>
\r
925 ************************************************************************/
\r
926 TCHAR* StrT_refExt( const TCHAR* s )
\r
930 p = _tcschr( s, _T('\0') );
\r
932 if ( p == s ) return (TCHAR*) s;
\r
934 for ( p--; p>s; p-- ) {
\r
935 if ( *p == _T('.') ) return (TCHAR*) p+1;
\r
936 if ( *p == _T('/') || *p == _T('\\') ) return (TCHAR*) _tcschr( p, _T('\0') );
\r
938 if ( *p == _T('.') ) return (TCHAR*) p+1;
\r
940 return (TCHAR*) _tcschr( s, _T('\0') );
\r
945 /***********************************************************************
\r
946 <<< [StrT_replace1] >>>
\r
947 ************************************************************************/
\r
948 errnum_t StrT_replace1( TCHAR* in_out_String, TCHAR FromCharacter, TCHAR ToCharacter,
\r
953 UNREFERENCED_VARIABLE( Opt );
\r
955 IF ( FromCharacter == _T('\0') ) { return E_OTHERS; }
\r
959 p = _tcschr( p, FromCharacter );
\r
960 if ( p == NULL ) { break; }
\r
970 /***********************************************************************
\r
971 <<< [StrT_trim] >>>
\r
972 ************************************************************************/
\r
973 errnum_t StrT_trim( TCHAR* out_Str, size_t out_Str_Size, const TCHAR* in_Str )
\r
979 p1 = in_Str; while ( *p1 == _T(' ') || *p1 == _T('\t') ) p1++;
\r
980 for ( p2 = _tcschr( p1, _T('\0') ) - 1; p2 >= p1; p2-- ) {
\r
982 if ( c != _T(' ') && c != _T('\t') && c != _T('\n') && c != _T('\r') )
\r
985 return stcpy_part_r( out_Str, out_Str_Size, out_Str, NULL, p1, p2+1 );
\r
990 /***********************************************************************
\r
991 <<< [StrT_cutLastOf] >>>
\r
992 ************************************************************************/
\r
993 errnum_t StrT_cutLastOf( TCHAR* in_out_Str, TCHAR Charactor )
\r
995 TCHAR* last = _tcschr( in_out_Str, _T('\0') );
\r
997 if ( last > in_out_Str ) {
\r
998 if ( *( last - 1 ) == Charactor )
\r
999 { *( last - 1 ) = _T('\0'); }
\r
1006 /***********************************************************************
\r
1007 <<< [StrT_cutLineComment] >>>
\r
1008 ************************************************************************/
\r
1009 errnum_t StrT_cutLineComment( TCHAR* out_Str, size_t out_Str_Size, const TCHAR* in_Str, const TCHAR* CommentSign )
\r
1015 p1 = in_Str; while ( *p1 == _T(' ') || *p1 == _T('\t') ) p1++;
\r
1017 p2 = _tcsstr( p1, CommentSign );
\r
1018 if ( p2 == NULL ) p2 = _tcschr( p1, _T('\0') );
\r
1020 for ( p2 = p2 - 1; p2 >= p1; p2-- ) {
\r
1022 if ( c != _T(' ') && c != _T('\t') && c != _T('\n') && c != _T('\r') )
\r
1025 return stcpy_part_r( out_Str, out_Str_Size, out_Str, NULL, p1, p2+1 );
\r
1030 /**************************************************************************
\r
1031 <<< [StrT_meltCSV] >>>
\r
1032 *************************************************************************/
\r
1033 errnum_t StrT_meltCSV( TCHAR* out_Str, size_t out_Str_Size, const TCHAR** pCSV )
\r
1037 TCHAR* t_last = (TCHAR*)( (char*)out_Str + out_Str_Size - sizeof(TCHAR) );
\r
1044 if ( out_Str_Size <= 1 ) { t = dummy; t_last = dummy; }
\r
1046 if ( s == NULL ) { *t = _T('\0'); return 0; }
\r
1049 /*
\93ª
\82Ì
\8bó
\94\92\82ð
\8f\9c\82 */
\r
1050 while ( *s == _T(' ') || *s == _T('\t') ) s++;
\r
1054 /* ""
\82Å
\88Í
\82Ü
\82ê
\82Ä
\82¢
\82é
\8fê
\8d\87 */
\r
1058 while ( c != _T('"') || *(s+1) == _T('"') ) { /* "
\95¶
\8e\9a\82Ü
\82Å */
\r
1059 if ( t == t_last ) { e = E_FEW_ARRAY; t = dummy; t_last = dummy + 1; }
\r
1060 if ( c == *(s+1) && c == _T('"') ) s++; /* "
\95¶
\8e\9a\8e©
\91Ì */
\r
1061 if ( c == _T('\0') ) break;
\r
1062 *t = c; t++; s++; c = *s;
\r
1068 if ( *s == _T(',') ) { s = s+1; break; }
\r
1069 if ( *s == _T('\0') ) { s = NULL; break; }
\r
1075 /*
\8bó
\82Ì
\8d\80\96Ú
\82Ì
\8fê
\8d\87 */
\r
1086 /* ""
\82Å
\88Í
\82Ü
\82ê
\82Ä
\82¢
\82È
\82¢
\8fê
\8d\87 */
\r
1088 TCHAR* sp = NULL; /*
\8dÅ
\8cã
\82Ì
\98A
\91±
\82µ
\82½
\8bó
\94\92\82Ì
\90æ
\93ª */
\r
1091 while ( c != _T(',') && c != _T('\0') && c != _T('\r') && c != _T('\n') ) { /* ,
\95¶
\8e\9a\82Ü
\82Å */
\r
1093 /* sp
\82ð
\90Ý
\92è
\82·
\82é */
\r
1095 if ( sp == NULL ) sp = t;
\r
1099 if ( t == t_last ) { e = E_FEW_ARRAY; t = dummy; t_last = dummy + 1; }
\r
1101 /*
\83R
\83s
\81[
\82·
\82é */
\r
1102 *t = c; t++; s++; c = *s;
\r
1105 /*
\95Ô
\82è
\92l
\82ð
\8c\88\92è
\82·
\82é */
\r
1106 if ( c == _T(',') ) s = s + 1;
\r
1109 /*
\96\96\94ö
\82Ì
\8bó
\94\92\82ð
\8eæ
\82è
\8f\9c\82 */
\r
1110 if ( sp != NULL ) *sp = '\0';
\r
1111 else *t = _T('\0');
\r
1121 /***********************************************************************
\r
1122 <<< [StrT_getExistSymbols] >>>
\r
1123 ************************************************************************/
\r
1124 errnum_t StrT_getExistSymbols( unsigned* out, bool bCase, const TCHAR* Str, const TCHAR* Symbols, ... )
\r
1128 TCHAR** syms = NULL;
\r
1129 bool* syms_exists = NULL;
\r
1130 bool b_nosym = false;
\r
1131 TCHAR* sym = NULL;
\r
1132 size_t sym_size = ( _tcslen( Symbols ) + 1 ) * sizeof(TCHAR);
\r
1136 UNREFERENCED_VARIABLES(( bCase ));
\r
1138 sym = (TCHAR*) malloc( sym_size ); IF(sym==NULL)goto err_fm;
\r
1144 e= StrT_meltCSV( sym, sym_size, &p ); IF(e)goto fin;
\r
1145 if ( sym[0] != _T('\0') ) n_sym ++;
\r
1146 } while ( p != NULL );
\r
1148 syms = (TCHAR**) malloc( n_sym * sizeof(TCHAR*) ); IF(syms==NULL)goto err_fm;
\r
1149 memset( syms, 0, n_sym * sizeof(TCHAR*) );
\r
1150 syms_exists = (bool*) malloc( n_sym * sizeof(bool) ); IF(syms_exists==NULL)goto err_fm;
\r
1151 memset( syms_exists, 0, n_sym * sizeof(bool) );
\r
1153 p = Symbols; i = 0;
\r
1155 e= StrT_meltCSV( sym, sym_size, &p ); IF(e)goto fin;
\r
1156 if ( sym[0] != _T('\0') ) {
\r
1157 e= MallocAndCopyString( &syms[i], sym ); IF(e)goto fin;
\r
1160 } while ( p != NULL );
\r
1163 //=== Check Str whether having Symbols
\r
1166 e= StrT_meltCSV( sym, sym_size, &p ); IF(e)goto fin;
\r
1167 if ( sym[0] != _T('\0') ) {
\r
1168 for ( i = 0; i < n_sym; i++ ) {
\r
1169 if ( _tcscmp( sym, syms[i] ) == 0 ) { syms_exists[i] = true; break; }
\r
1171 if ( i == n_sym ) b_nosym = true;
\r
1173 } while ( p != NULL );
\r
1181 va_start( va, Symbols );
\r
1183 for ( i = 0; i < n_sym; i++ ) {
\r
1184 num = va_arg( va, unsigned );
\r
1185 if ( syms_exists[i] ) *out |= num;
\r
1190 e = ( b_nosym ? E_NOT_FOUND_SYMBOL : 0 );
\r
1192 if ( syms != NULL ) {
\r
1193 for ( i = 0; i < n_sym; i++ ) {
\r
1194 if ( syms[i] != NULL ) free( syms[i] );
\r
1198 if ( syms_exists != NULL ) free( syms_exists );
\r
1199 if ( sym != NULL ) free( sym );
\r
1201 err_fm: e= E_FEW_MEMORY; goto fin;
\r
1205 /**************************************************************************
\r
1206 <<< [StrT_meltCmdLine] >>>
\r
1207 *************************************************************************/
\r
1208 errnum_t StrT_meltCmdLine( TCHAR* out_Str, size_t out_Str_Size, const TCHAR** pLine )
\r
1212 TCHAR* t_last = (TCHAR*)( (char*)out_Str + out_Str_Size - sizeof(TCHAR) );
\r
1219 if ( out_Str_Size <= 1 ) { t = &dummy; t_last = &dummy; }
\r
1221 if ( s == NULL ) { *t = _T('\0'); return 0; }
\r
1224 /*
\93ª
\82Ì
\8bó
\94\92\82ð
\8f\9c\82 */
\r
1225 while ( *s == _T(' ') || *s == _T('\t') ) s++;
\r
1229 /* ""
\82Å
\88Í
\82Ü
\82ê
\82Ä
\82¢
\82é
\8fê
\8d\87 */
\r
1233 while ( c != _T('"') || *(s+1) == _T('"') ) { /* "
\95¶
\8e\9a\82Ü
\82Å */
\r
1234 if ( t == t_last ) { e = E_FEW_ARRAY; t = &dummy; t_last = &dummy + 1; }
\r
1235 if ( c == *(s+1) && c == _T('"') ) s++; /* "
\95¶
\8e\9a\8e©
\91Ì */
\r
1236 if ( c == _T('\0') ) break;
\r
1237 *t = c; t++; s++; c = *s;
\r
1243 if ( *s == _T(' ') ) { s = s+1; break; }
\r
1244 if ( *s == _T('\0') ) { s = NULL; break; }
\r
1255 /* ""
\82Å
\88Í
\82Ü
\82ê
\82Ä
\82¢
\82È
\82¢
\8fê
\8d\87 */
\r
1258 while ( c != _T(' ') && c != _T('\0') && c != _T('\r') && c != _T('\n') ) { /*
\8bó
\94\92\95¶
\8e\9a\82Ü
\82Å */
\r
1260 if ( t == t_last ) { e = E_FEW_ARRAY; t = &dummy; t_last = &dummy + 1; }
\r
1262 /*
\83R
\83s
\81[
\82·
\82é */
\r
1263 *t = c; t++; s++; c = *s;
\r
1266 /* *pLine
\82ð
\8c\88\92è
\82·
\82é */
\r
1267 while ( *s == _T(' ') ) s = s + 1;
\r
1268 if ( *s == _T('\0') ) s = NULL;
\r
1281 /***********************************************************************
\r
1282 <<< [StrT_isAbsPath] >>>
\r
1283 ************************************************************************/
\r
1284 bool StrT_isAbsPath( const TCHAR* s )
\r
1286 const TCHAR* bs = _tcschr( s, _T('\\') );
\r
1287 const TCHAR* sl = _tcschr( s, _T('/') );
\r
1288 const TCHAR* co = _tcschr( s, _T(':') );
\r
1290 return ( co != NULL && ( bs == co+1 || sl == co+1 ) );
\r
1294 /**************************************************************************
\r
1295 <<< [StrT_getAbsPath_part] >>>
\r
1296 *************************************************************************/
\r
1297 errnum_t StrT_getAbsPath_part( TCHAR* out_AbsPath, size_t AbsPathSize, TCHAR* OutStart,
\r
1298 TCHAR** out_OutLast, const TCHAR* StepPath, const TCHAR* BasePath )
\r
1301 TCHAR separator = (TCHAR) DUMMY_INITIAL_VALUE_TCHAR;
\r
1302 const TCHAR* separator_path;
\r
1303 TCHAR* out_abs_path_over = (TCHAR*)( (uint8_t*) out_AbsPath + AbsPathSize );
\r
1304 TCHAR* null_position = NULL;
\r
1308 /* "BasePath" must be out of "out_AbsPath" */
\r
1309 ASSERT_R( BasePath < out_AbsPath ||
\r
1310 (uint8_t*) BasePath >= (uint8_t*) out_AbsPath + AbsPathSize,
\r
1315 /* If "StepPath" == "", out_AbsPath = "" */
\r
1316 if ( StepPath[0] == _T('\0') ) {
\r
1317 ASSERT_R( AbsPathSize >= sizeof(TCHAR), goto err_fm );
\r
1318 out_AbsPath[0] = _T('\0');
\r
1323 /* Set "OutStart" */
\r
1324 if ( OutStart == NULL )
\r
1325 { OutStart = out_AbsPath; }
\r
1328 /* Set "separator" : \ or / from "BasePath" */
\r
1329 if ( StrT_isAbsPath( StepPath ) ) {
\r
1330 separator_path = StepPath;
\r
1332 else if ( BasePath == NULL ) {
\r
1333 separator = _T('\\');
\r
1334 separator_path = NULL;
\r
1337 separator_path = BasePath;
\r
1339 if ( separator_path != NULL ) {
\r
1343 p = _tcschr( separator_path, _T('\\') );
\r
1344 p2 = _tcschr( separator_path, _T('/') );
\r
1345 if ( p == NULL ) {
\r
1347 { separator = _T('\\'); }
\r
1349 { separator = _T('/'); }
\r
1352 { separator = _T('\\'); }
\r
1355 { separator = _T('\\'); }
\r
1357 { separator = _T('/'); }
\r
1363 /* Set "OutStart" : "BasePath" + / + "StepPath" */
\r
1364 if ( StrT_isAbsPath( StepPath ) ) {
\r
1365 size_t step_path_length = _tcslen( StepPath );
\r
1367 IF( OutStart + step_path_length >= out_abs_path_over ) goto err_fa;
\r
1368 memmove( OutStart, StepPath, ( step_path_length + 1 ) * sizeof(TCHAR) );
\r
1370 /* Set "null_position" */
\r
1371 null_position = OutStart + step_path_length;
\r
1376 size_t base_path_length;
\r
1377 size_t step_path_length = _tcslen( StepPath );
\r
1379 if ( BasePath == NULL ) {
\r
1380 base_path_length = GetCurrentDirectory( 0, NULL ) - 1;
\r
1383 base_path_length = _tcslen( BasePath );
\r
1384 c = BasePath[ base_path_length - 1 ];
\r
1385 if ( c == _T('\\') || c == _T('/') )
\r
1386 { base_path_length -= 1; }
\r
1389 p = OutStart + base_path_length + 1;
\r
1390 IF( p + step_path_length >= out_abs_path_over ) goto err_fa;
\r
1391 memmove( p, StepPath, ( step_path_length + 1 ) * sizeof(TCHAR) );
\r
1392 /* memmove is for "out_AbsPath" == "StepPath" */
\r
1394 if ( BasePath == NULL ) {
\r
1395 GetCurrentDirectory( base_path_length + 1, OutStart );
\r
1396 if ( OutStart[ base_path_length - 1 ] == _T('\\') )
\r
1397 { base_path_length -= 1; }
\r
1399 memcpy( OutStart, BasePath, base_path_length * sizeof(TCHAR) );
\r
1401 OutStart[ base_path_length ] = separator;
\r
1404 /* Set "null_position" */
\r
1405 null_position = p + step_path_length;
\r
1409 /* Replace \ and / to "separator" in "OutStart" */
\r
1411 TCHAR other_separator;
\r
1413 if ( separator == _T('/') )
\r
1414 { other_separator = _T('\\'); }
\r
1416 { other_separator = _T('/'); }
\r
1418 e= StrT_replace1( OutStart, other_separator, separator, 0 ); IF(e)goto fin;
\r
1422 /* Replace \*\..\ to \ */
\r
1424 enum { length = 4 };
\r
1425 TCHAR parent[ length + 1 ]; /* \..\ or /../ */
\r
1426 TCHAR* parent_position;
\r
1429 parent[0] = separator;
\r
1430 parent[1] = _T('.');
\r
1431 parent[2] = _T('.');
\r
1432 parent[3] = separator;
\r
1433 parent[4] = _T('\0');
\r
1436 parent_position = _tcsstr( OutStart, parent );
\r
1437 if ( parent_position == NULL ) { break; }
\r
1439 p = parent_position - 1;
\r
1441 IF( p < OutStart ) goto err; /* "../" are too many */
\r
1442 if ( *p == separator ) { break; }
\r
1447 parent_position + length,
\r
1448 ( null_position - ( parent_position + length ) + 1 ) * sizeof(TCHAR) );
\r
1450 null_position -= ( parent_position + length ) - ( p + 1 );
\r
1455 /* Cut last \*\.. */
\r
1457 enum { length = 3 };
\r
1460 while ( null_position - length >= OutStart ) {
\r
1461 if ( *( null_position - 3 ) != separator ||
\r
1462 *( null_position - 2 ) != _T('.') ||
\r
1463 *( null_position - 1 ) != _T('.') )
\r
1466 p = null_position - 4;
\r
1468 IF( p < OutStart ) goto err; /* "../" are too many */
\r
1469 if ( *p == separator ) { break; }
\r
1475 null_position = p;
\r
1480 /* Replace \.\ to \ */
\r
1482 enum { length = 3 };
\r
1483 TCHAR current[ length + 1 ]; /* \.\ or /./ */
\r
1484 TCHAR* current_position;
\r
1486 current[0] = separator;
\r
1487 current[1] = _T('.');
\r
1488 current[2] = separator;
\r
1489 current[3] = _T('\0');
\r
1492 current_position = _tcsstr( OutStart, current );
\r
1493 if ( current_position == NULL ) { break; }
\r
1495 memmove( current_position + 1,
\r
1496 current_position + length,
\r
1497 ( null_position - ( current_position + length ) + 1 ) * sizeof(TCHAR) );
\r
1499 null_position -= length - 1;
\r
1506 TCHAR* over = _tcschr( OutStart, _T('\0') );
\r
1508 while ( over - 2 >= OutStart &&
\r
1509 *( over - 1 ) == _T('.') && *( over - 2 ) == separator ) {
\r
1517 if ( null_position - 1 >= OutStart ) {
\r
1518 if ( *( null_position - 1 ) == _T(':') ) {
\r
1519 IF( null_position + 1 >= out_abs_path_over ) goto err_fa;
\r
1521 *( null_position + 0 ) = separator;
\r
1522 *( null_position + 1 ) = _T('\0');
\r
1523 null_position += 1;
\r
1528 /* Set "*out_OutLast" */
\r
1529 if ( out_OutLast != NULL )
\r
1530 { *out_OutLast = null_position; }
\r
1536 err: e = E_OTHERS; goto fin;
\r
1537 err_fa: e = E_FEW_ARRAY; goto fin;
\r
1538 err_fm: e = E_FEW_MEMORY; goto fin;
\r
1543 /***********************************************************************
\r
1544 <<< [StrT_getParentAbsPath_part] >>>
\r
1545 ************************************************************************/
\r
1546 errnum_t StrT_getParentAbsPath_part( TCHAR* Str, size_t StrSize, TCHAR* StrStart,
\r
1547 TCHAR** out_StrLast, const TCHAR* StepPath, const TCHAR* BasePath )
\r
1552 IF_D( StrStart < Str || (char*) StrStart >= (char*)Str + StrSize )goto err;
\r
1554 if ( StepPath[0] == _T('\0') ) {
\r
1555 *StrStart = _T('\0');
\r
1559 /*
\90â
\91Î
\83p
\83X
\82É
\82·
\82é */
\r
1560 e= StrT_getAbsPath( StrStart,
\r
1561 StrSize - ( (char*)StrStart - (char*)Str ),
\r
1562 StepPath, BasePath ); IF(e)goto fin;
\r
1566 p = _tcschr( StrStart, _T('\0') );
\r
1567 if ( p > StrStart ) {
\r
1568 TCHAR c = *( p - 1 );
\r
1569 if ( c == _T('\\') || c == _T('/') )
\r
1570 { *( p - 1 ) = _T('\0'); }
\r
1575 p = StrT_refFName( StrStart );
\r
1576 if ( p > StrStart ) p--;
\r
1580 /*
\83\8b\81[
\83g
\82È
\82ç \
\82ð
\95t
\82¯
\82é */
\r
1581 if ( p == StrStart + 2 ) {
\r
1582 *p = _T('\\'); p++; *p = _T('\0');
\r
1585 if ( out_StrLast != NULL ) *out_StrLast = p;
\r
1591 err: e = E_OTHERS; goto fin;
\r
1596 /***********************************************************************
\r
1597 <<< [StrT_isOverOfFileName] >>>
\r
1598 - "" or "\" or "/"
\r
1599 ************************************************************************/
\r
1600 inline bool StrT_isOverOfFileName( const TCHAR* PointerInPath )
\r
1602 return PointerInPath == NULL ||
\r
1603 *PointerInPath == _T('\0') ||
\r
1604 ( ( *PointerInPath == _T('\\') || *PointerInPath == _T('/') ) &&
\r
1605 *(PointerInPath + 1) == _T('\0') );
\r
1610 /***********************************************************************
\r
1611 <<< [StrT_getStepPath] >>>
\r
1612 ************************************************************************/
\r
1613 errnum_t StrT_getStepPath( TCHAR* out_StepPath, size_t StepPathSize,
\r
1614 const TCHAR* AbsPath, const TCHAR* BasePath )
\r
1617 const TCHAR* abs_pointer;
\r
1618 const TCHAR* base_pointer;
\r
1622 const TCHAR* abs_separator_pointer = (const TCHAR*) DUMMY_INITIAL_VALUE;
\r
1623 const TCHAR* base_separator_pointer = (const TCHAR*) DUMMY_INITIAL_VALUE;
\r
1624 TCHAR* step_pointer;
\r
1625 TCHAR parent_symbol[4] = { _T('.'), _T('.'), _T('\\'), _T('\0') };
\r
1626 TCHAR base_path_2[ MAX_PATH ];
\r
1629 ASSERT_D( out_StepPath != AbsPath, goto err );
\r
1631 abs_pointer = AbsPath;
\r
1634 /* Set "base_pointer" */
\r
1635 if ( BasePath == NULL ) {
\r
1636 base_pointer = _tgetcwd( base_path_2, _countof(base_path_2) );
\r
1637 IF( base_pointer == NULL ) goto err;
\r
1640 base_pointer = BasePath;
\r
1644 /* Set "abs_separator_pointer", "base_separator_pointer" : after same parent folder path */
\r
1646 for (;;) { /* while abs_char == base_char */
\r
1647 abs_char = *abs_pointer;
\r
1648 base_char = *base_pointer;
\r
1650 abs_char = (TCHAR) _totlower( abs_char );
\r
1651 base_char = (TCHAR) _totlower( base_char );
\r
1653 if ( abs_char == _T('\0') ) {
\r
1655 /* out_StepPath = ".", if AbsPath == BasePath */
\r
1656 if ( base_char == _T('\0') ) {
\r
1657 e= StrT_cpy( out_StepPath, StepPathSize, _T(".") ); IF(e)goto fin;
\r
1662 if ( base_char == _T('\0') ) { break; }
\r
1664 if ( abs_char != base_char ) {
\r
1665 if ( ( abs_char == _T('/') || abs_char == _T('\\') ) &&
\r
1666 ( base_char == _T('/') || base_char == _T('\\') ) )
\r
1667 { /* Do nothing */ }
\r
1672 /* Set "separator", "abs_separator_pointer", "base_separator_pointer" */
\r
1673 if ( base_char == _T('/') || base_char == _T('\\') ) {
\r
1674 if ( separator == 0 )
\r
1675 { separator = base_char; }
\r
1677 abs_separator_pointer = abs_pointer;
\r
1678 base_separator_pointer = base_pointer;
\r
1682 base_pointer += 1;
\r
1686 /* 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
1687 if ( abs_char == _T('/') || abs_char == _T('\\') ||
\r
1688 base_char == _T('/') || base_char == _T('\\') ) {
\r
1689 /* other character is '\0' */
\r
1691 if ( separator == 0 )
\r
1692 { separator = abs_char; }
\r
1694 abs_separator_pointer = abs_pointer;
\r
1695 base_separator_pointer = base_pointer;
\r
1699 /* out_StepPath = AbsPath, if there is not same folder */
\r
1700 if ( separator == 0 ) {
\r
1701 e= StrT_cpy( out_StepPath, StepPathSize, AbsPath ); IF(e)goto fin;
\r
1706 /* Add "..\" to "out_StepPath" */
\r
1707 parent_symbol[2] = separator;
\r
1708 step_pointer = out_StepPath;
\r
1713 if ( StrT_isOverOfFileName( base_separator_pointer ) )
\r
1717 /* Set "base_separator_pointer" : next separator */
\r
1718 p1 = _tcschr( base_separator_pointer + 1, _T('/') );
\r
1719 p2 = _tcschr( base_separator_pointer + 1, _T('\\') );
\r
1721 if ( p1 == NULL ) {
\r
1723 { base_separator_pointer = NULL; }
\r
1725 { base_separator_pointer = p2; }
\r
1728 if ( p2 == NULL ) {
\r
1729 base_separator_pointer = p1;
\r
1732 { base_separator_pointer = p1; }
\r
1734 { base_separator_pointer = p2; }
\r
1739 /* Add "..\" to "out_StepPath" */
\r
1740 e= stcpy_part_r( out_StepPath, StepPathSize, step_pointer, &step_pointer,
\r
1741 parent_symbol, NULL ); IF(e)goto fin;
\r
1745 /* Copy a part of "AbsPath" to "out_StepPath" */
\r
1746 if ( StrT_isOverOfFileName( abs_separator_pointer ) ) {
\r
1747 ASSERT_D( step_pointer > out_StepPath, goto err );
\r
1748 *( step_pointer - 1 ) = _T('\0');
\r
1751 e= stcpy_part_r( out_StepPath, StepPathSize, step_pointer, NULL,
\r
1752 abs_separator_pointer + 1, NULL ); IF(e)goto fin;
\r
1759 err: e = E_OTHERS; goto fin;
\r
1764 /***********************************************************************
\r
1765 <<< [StrT_getBaseName_part] >>>
\r
1766 ************************************************************************/
\r
1767 errnum_t StrT_getBaseName_part( TCHAR* Str, size_t StrSize, TCHAR* StrStart,
\r
1768 TCHAR** out_StrLast, const TCHAR* SrcPath )
\r
1775 p1 = StrT_refFName( SrcPath );
\r
1778 //=== #
\82ª
\96³
\82¢
\82Æ
\82«
\81A
\8dÅ
\8cã
\82Ì
\83s
\83\8a\83I
\83h
\82Ì
\91O
\82Ü
\82Å
\82ª
\81ABaseName
\r
1779 ps = _tcschr( p1, _T('#') );
\r
1780 if ( ps == NULL ) {
\r
1781 p2 = _tcsrchr( p1, _T('.') );
\r
1782 if ( p2 == NULL ) p2 = _tcsrchr( p1, _T('\0') );
\r
1785 //=== #
\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
1791 p3 = _tcschr( p3, _T('.') );
\r
1792 if ( p3 == NULL || p3 > ps ) break;
\r
1798 return stcpy_part_r( Str, StrSize, StrStart, out_StrLast, p1, p2 );
\r
1802 /***********************************************************************
\r
1803 <<< [StrT_addLastOfFileName] >>>
\r
1804 ************************************************************************/
\r
1805 errnum_t StrT_addLastOfFileName( TCHAR* out_Path, size_t PathSize,
\r
1806 const TCHAR* BasePath, const TCHAR* AddName )
\r
1812 const TCHAR* last_pos_in_base = _tcschr( BasePath, _T('\0') );
\r
1813 const TCHAR* term_pos_in_base;
\r
1814 const TCHAR* add_pos_in_base;
\r
1815 const TCHAR* period_pos_in_base = _tcsrchr( BasePath, _T('.') ); // > term_pos_in_base
\r
1816 const TCHAR* last_pos_in_add = _tcschr( AddName, _T('\0') );
\r
1817 const TCHAR* term_pos_in_add;
\r
1818 const TCHAR* period_pos_in_add = _tcsrchr( AddName, _T('.') ); // > term_pos_in_add
\r
1821 MEMSET_TO_NOT_INIT( out_Path, PathSize );
\r
1824 //=== term_pos_in_base
\r
1825 for ( term_pos_in_base = last_pos_in_base; term_pos_in_base >= BasePath; term_pos_in_base -- ) {
\r
1826 c = *term_pos_in_base;
\r
1827 if ( c == _T('/') || c == _T('\\') ) break;
\r
1831 //=== term_pos_in_add
\r
1832 for ( term_pos_in_add = last_pos_in_add; term_pos_in_add >= AddName; term_pos_in_add -- ) {
\r
1833 c = *term_pos_in_add;
\r
1834 if ( c == _T('/') || c == _T('\\') ) break;
\r
1838 //=== add_pos_in_base
\r
1839 if ( term_pos_in_base < period_pos_in_base ) {
\r
1840 add_pos_in_base = period_pos_in_base;
\r
1843 if ( term_pos_in_base < BasePath )
\r
1844 add_pos_in_base = _tcschr( BasePath, _T('\0') );
\r
1846 add_pos_in_base = _tcschr( term_pos_in_base, _T('\0') );
\r
1850 //=== setup output parameters
\r
1851 out_pos = (char*) out_Path;
\r
1852 free_size = PathSize;
\r
1855 //=== copy BasePath .. add_pos_in_base
\r
1856 copy_size = (char*)add_pos_in_base - (char*)BasePath;
\r
1857 if ( copy_size > free_size ) goto err_fa;
\r
1858 memcpy( out_pos, BasePath, copy_size );
\r
1859 out_pos += copy_size;
\r
1860 free_size -= copy_size;
\r
1863 //=== copy AddName .. last_pos_in_add
\r
1864 copy_size = (char*)last_pos_in_add - (char*)AddName;
\r
1865 if ( copy_size > free_size ) goto err_fa;
\r
1866 memcpy( out_pos, AddName, copy_size );
\r
1867 out_pos += copy_size;
\r
1868 free_size -= copy_size;
\r
1871 //=== add name and not change extension
\r
1872 if ( period_pos_in_add == NULL ) {
\r
1874 //=== copy period_pos_in_base .. last_pos_in_base
\r
1875 if ( period_pos_in_base > term_pos_in_base ) {
\r
1876 copy_size = (char*)last_pos_in_base - (char*)period_pos_in_base + sizeof(TCHAR);
\r
1877 if ( copy_size > free_size ) goto err_fa;
\r
1878 memcpy( out_pos, period_pos_in_base, copy_size );
\r
1881 *(TCHAR*)out_pos = _T('\0');
\r
1886 //=== add name and change extension
\r
1889 if ( *(period_pos_in_add + 1) == _T('\0') )
\r
1890 *( (TCHAR*)out_pos - 1 ) = _T('\0');
\r
1892 *(TCHAR*)out_pos = _T('\0');
\r
1898 return E_FEW_ARRAY;
\r
1903 /***********************************************************************
\r
1904 <<< [Strs_init] >>>
\r
1905 ************************************************************************/
\r
1906 enum { Strs_FirstSize = 0x0F00 };
\r
1908 errnum_t Strs_init( Strs* self )
\r
1912 self->MemoryAddress = NULL;
\r
1914 p = (char*) malloc( Strs_FirstSize );
\r
1915 IF( p == NULL ) return E_FEW_MEMORY;
\r
1917 self->MemoryAddress = p;
\r
1918 self->MemoryOver = p + Strs_FirstSize;
\r
1919 self->NextElem = p + sizeof(TCHAR*);
\r
1920 self->PointerToNextStrInPrevElem = (TCHAR**) p;
\r
1921 self->Prev_PointerToNextStrInPrevElem = NULL;
\r
1922 *(TCHAR**) p = NULL;
\r
1924 self->FirstOfStrs = self;
\r
1925 self->NextStrs = NULL;
\r
1932 /***********************************************************************
\r
1933 <<< [Strs_finish] >>>
\r
1934 ************************************************************************/
\r
1935 errnum_t Strs_finish( Strs* self, errnum_t e )
\r
1940 if ( self->MemoryAddress == NULL ) return 0;
\r
1942 mp = self->FirstOfStrs;
\r
1944 free( mp->MemoryAddress );
\r
1945 if ( mp == self ) break;
\r
1947 next_mp = mp->NextStrs;
\r
1951 self->MemoryAddress = NULL;
\r
1958 /***********************************************************************
\r
1959 <<< [Strs_toEmpty] >>>
\r
1960 ************************************************************************/
\r
1961 errnum_t Strs_toEmpty( Strs* self )
\r
1963 Strs_finish( self, 0 );
\r
1964 return Strs_init( self );
\r
1969 /***********************************************************************
\r
1970 <<< [Strs_add] >>>
\r
1971 ************************************************************************/
\r
1972 errnum_t Strs_add( Strs* self, const TCHAR* Str, const TCHAR** out_AllocStr )
\r
1974 return Strs_addBinary( self, Str, _tcschr( Str, _T('\0') ) + 1, out_AllocStr );
\r
1978 errnum_t Strs_addBinary( Strs* self, const TCHAR* Str, const TCHAR* StrOver, const TCHAR** out_AllocStr )
\r
1984 str_size = ( (char*) StrOver - (char*) Str );
\r
1985 elem_size = ( sizeof(TCHAR*) + str_size + sizeof(void*) - 1 ) & ~(sizeof(void*) - 1);
\r
1987 if ( self->NextElem + elem_size > self->MemoryOver )
\r
1988 { e= Strs_expandSize( self, str_size ); IF(e)goto fin; }
\r
1992 // [ FirstStr | NULL | TCHAR[] | ... ]
\r
1993 // [ FirstStr | NextStr | TCHAR[] | NULL | TCHAR[] | ... ]
\r
1994 // [ FirstStr | NextStr | TCHAR[] | NextStr | TCHAR[] ], [ NULL | TCHAR[] | ... ]
\r
1996 if ( out_AllocStr != NULL ) *out_AllocStr = (TCHAR*)( self->NextElem + sizeof(TCHAR*) );
\r
1999 *(TCHAR**) self->NextElem = NULL;
\r
2000 memcpy( self->NextElem + sizeof(TCHAR*), Str, str_size );
\r
2002 //=== link to elem from previous elem
\r
2003 *self->PointerToNextStrInPrevElem = (TCHAR*)( self->NextElem + sizeof(TCHAR*) );
\r
2006 self->Prev_PointerToNextStrInPrevElem = self->PointerToNextStrInPrevElem;
\r
2007 self->PointerToNextStrInPrevElem = (TCHAR**) self->NextElem;
\r
2008 self->NextElem = self->NextElem + elem_size;
\r
2017 /***********************************************************************
\r
2018 <<< [Strs_freeLast] >>>
\r
2019 ************************************************************************/
\r
2020 errnum_t Strs_freeLast( Strs* self, TCHAR* AllocStr )
\r
2025 TCHAR* prev_of_last_str;
\r
2027 Strs* prev_of_last_mp;
\r
2029 if ( self->Prev_PointerToNextStrInPrevElem == NULL ) {
\r
2030 prev_of_last_str = NULL;
\r
2032 for ( Strs_forEach( self, &str ) ) {
\r
2033 prev_of_last_str = last_str;
\r
2038 prev_of_last_str = (TCHAR*)( self->Prev_PointerToNextStrInPrevElem + 1 );
\r
2039 last_str = (TCHAR*)( self->PointerToNextStrInPrevElem + 1 );
\r
2043 IF( last_str != AllocStr ) goto err;
\r
2045 // [ FirstStr | NULL | TCHAR[] | ... ]
\r
2046 if ( prev_of_last_str == NULL ) {
\r
2047 self->NextElem = self->MemoryAddress + sizeof(TCHAR*);
\r
2048 self->PointerToNextStrInPrevElem = (TCHAR**) self->MemoryAddress;
\r
2051 // [ FirstStr | NextStr | TCHAR[] | NULL | TCHAR[] | ... ]
\r
2052 else if ( (char*) prev_of_last_str >= self->MemoryAddress &&
\r
2053 (char*) prev_of_last_str < self->MemoryOver ) {
\r
2054 self->NextElem = (char*)last_str - sizeof(TCHAR*);
\r
2055 self->PointerToNextStrInPrevElem = (TCHAR**)( (char*)prev_of_last_str - sizeof(TCHAR*) );
\r
2058 // [ FirstStr | NextStr | TCHAR[] | NextStr | TCHAR[] ], [ NULL | TCHAR[] | ... ]
\r
2060 prev_of_last_mp = NULL;
\r
2061 for ( mp = self->FirstOfStrs; mp->NextStrs != self; mp = mp->NextStrs ) {
\r
2062 prev_of_last_mp = mp;
\r
2065 free( self->MemoryAddress );
\r
2069 if ( prev_of_last_mp == NULL ) {
\r
2070 self->FirstOfStrs = self;
\r
2071 self->NextStrs = NULL;
\r
2074 prev_of_last_mp->NextStrs = self;
\r
2079 *self->PointerToNextStrInPrevElem = NULL;
\r
2080 self->Prev_PointerToNextStrInPrevElem = NULL;
\r
2086 err: e = E_OTHERS; goto fin;
\r
2091 /***********************************************************************
\r
2092 <<< [Strs_expandSize] >>>
\r
2093 ************************************************************************/
\r
2094 errnum_t Strs_expandSize( Strs* self, size_t FreeSize )
\r
2098 size_t elem_size = ( sizeof(TCHAR*) + FreeSize + sizeof(void*) - 1 ) & ~(sizeof(void*) - 1);
\r
2099 size_t memory_size;
\r
2103 // [ FirstStr | NULL | TCHAR[] | ... ]
\r
2104 // [ FirstStr | NextStr | TCHAR[] | NULL | TCHAR[] | ... ]
\r
2105 // [ FirstStr | NextStr | TCHAR[] | NextStr | TCHAR[] ], [ NULL | TCHAR[] | ... ]
\r
2107 while ( self->NextElem + elem_size > self->MemoryOver ) {
\r
2110 mp = (Strs*) malloc( sizeof(Strs) ); IF(mp==NULL) goto err_fm;
\r
2111 memory_size = ( self->MemoryOver - self->MemoryAddress ) * 2;
\r
2112 new_memory = (char*) malloc( memory_size );
\r
2113 IF( new_memory == NULL ) { free( mp ); goto err_fm; }
\r
2115 //=== move old memory
\r
2116 if ( self->FirstOfStrs == self ) {
\r
2117 self->FirstOfStrs = mp;
\r
2120 for ( mp2 = self->FirstOfStrs; mp2->NextStrs != self; mp2 = mp2->NextStrs );
\r
2121 mp2->NextStrs = mp;
\r
2124 mp->NextStrs = self;
\r
2126 //=== setup new memory
\r
2127 self->MemoryAddress = new_memory;
\r
2128 self->MemoryOver = new_memory + memory_size;
\r
2129 self->NextElem = new_memory;
\r
2130 // self->PointerToNextStrInPrevElem is same value
\r
2131 // self->FirstOfStrs is same value
\r
2132 // self->NextStrs is always NULL
\r
2136 err_fm: return E_FEW_ARRAY;
\r
2140 /***********************************************************************
\r
2141 <<< [Strs_commit] >>>
\r
2142 ************************************************************************/
\r
2143 errnum_t Strs_commit( Strs* self, TCHAR* StrOver )
\r
2147 if ( StrOver == NULL )
\r
2148 { StrOver = _tcschr( (TCHAR*)( self->NextElem + sizeof(TCHAR*) ), _T('\0') ) + 1; }
\r
2149 elem_size = ( ( (char*)StrOver - self->NextElem ) + sizeof(void*) - 1 ) & ~(sizeof(void*) - 1);
\r
2152 *(TCHAR**) self->NextElem = NULL;
\r
2154 //=== link to elem from previous elem
\r
2155 *self->PointerToNextStrInPrevElem = (TCHAR*)( self->NextElem + sizeof(TCHAR*) );
\r
2158 self->PointerToNextStrInPrevElem = (TCHAR**) self->NextElem;
\r
2159 self->NextElem = self->NextElem + elem_size;
\r
2166 /***********************************************************************
\r
2168 ************************************************************************/
\r
2171 errnum_t StrArr_init( StrArr* self )
\r
2175 Set2_initConst( &self->Array );
\r
2176 Strs_initConst( &self->Chars );
\r
2178 e= Set2_init( &self->Array, 0x100 ); IF(e)goto cancel;
\r
2179 e= Strs_init( &self->Chars ); IF(e)goto cancel;
\r
2182 cancel: StrArr_finish( self, e ); return e;
\r
2186 /*[StrArr_finish]*/
\r
2187 errnum_t StrArr_finish( StrArr* self, errnum_t e )
\r
2189 if ( ! Set2_isInited( &self->Array ) ) return 0;
\r
2191 e= Set2_finish( &self->Array, e );
\r
2192 e= Strs_finish( &self->Chars, e );
\r
2198 errnum_t StrArr_add( StrArr* self, const TCHAR* Str, int* out_I )
\r
2202 e= StrArr_expandCount( self, _tcslen( Str ) ); IF(e)goto fin;
\r
2203 _tcscpy_s( StrArr_getFreeAddr( self ), StrArr_getFreeCount( self ), Str );
\r
2204 e= StrArr_commit( self ); IF(e)goto fin;
\r
2205 if ( out_I != NULL ) *out_I = Set2_getCount( &self->Array, TCHAR* ) - 1;
\r
2213 /*[StrArr_commit]*/
\r
2214 errnum_t StrArr_commit( StrArr* self )
\r
2218 TCHAR** pp = NULL;
\r
2219 Set2* arr = &self->Array;
\r
2220 Strs* ss = &self->Chars;
\r
2222 p = Strs_getFreeAddr( ss );
\r
2223 e= Set2_alloc( arr, &pp, TCHAR* ); IF(e)goto fin;
\r
2224 e= Strs_commit( ss, NULL ); IF(e)goto fin;
\r
2229 if ( e && pp != NULL ) e= Set2_freeLast( arr, pp, TCHAR*, e );
\r
2234 /*[StrArr_fillTo]*/
\r
2235 errnum_t StrArr_fillTo( StrArr* self, int n, const TCHAR* Str )
\r
2240 const TCHAR** pp_over;
\r
2242 n -= Set2_getCount( &self->Array, TCHAR* );
\r
2243 if ( n <= 0 ) return 0;
\r
2245 if ( Str == NULL ) {
\r
2249 e= Strs_add( &self->Chars, Str, &p ); IF(e)goto fin;
\r
2252 e= Set2_allocMulti( &self->Array, &pp, TCHAR*, n ); IF(e)goto fin;
\r
2254 for ( ; pp < pp_over; pp++ )
\r
2263 /*[StrArr_toEmpty]*/
\r
2264 errnum_t StrArr_toEmpty( StrArr* self )
\r
2269 ee= Set2_toEmpty( &self->Array ); IF(ee&&!e)e=ee;
\r
2270 ee= Strs_toEmpty( &self->Chars ); IF(ee&&!e)e=ee;
\r
2276 /***********************************************************************
\r
2277 <<< [StrArr_parseCSV] >>>
\r
2278 ************************************************************************/
\r
2279 errnum_t StrArr_parseCSV( StrArr* self, const TCHAR* CSVLine )
\r
2282 const TCHAR* p = CSVLine;
\r
2284 e= StrArr_toEmpty( self ); IF(e)goto fin;
\r
2287 e= StrT_meltCSV( StrArr_getFreeAddr( self ), StrArr_getFreeSize( self ), &p );
\r
2288 if ( e == E_FEW_ARRAY ) {
\r
2289 e= StrArr_expandSize( self, StrArr_getFreeSize( self ) * 2 ); IF(e)goto fin;
\r
2294 e = StrArr_commit( self ); IF(e)goto fin;
\r
2295 } while ( p != NULL );
\r
2304 /*=================================================================*/
\r
2305 /* <<< [SetX/SetX.c] >>> */
\r
2306 /*=================================================================*/
\r
2308 /***********************************************************************
\r
2309 <<< [Set2_init] >>>
\r
2310 ************************************************************************/
\r
2311 int Set2_init( Set2* m, int FirstSize )
\r
2313 m->First = malloc( FirstSize );
\r
2314 if ( m->First == NULL ) return E_FEW_MEMORY;
\r
2315 m->Next = m->First;
\r
2316 m->Over = (char*)m->First + FirstSize;
\r
2319 m->PointerOfDebugArray = NULL;
\r
2325 /***********************************************************************
\r
2326 <<< [Set2_finish] >>>
\r
2327 ************************************************************************/
\r
2328 int Set2_finish( Set2* m, int e )
\r
2330 if ( m->First != NULL ) { free( m->First ); m->First = NULL; }
\r
2335 /***********************************************************************
\r
2336 <<< [Set2_ref_imp] >>>
\r
2337 ************************************************************************/
\r
2338 int Set2_ref_imp( Set2* m, int iElem, void* out_pElem, size_t ElemSize )
\r
2343 IF( iElem < 0 ) goto err_ns;
\r
2344 p = (char*) m->First + ( (unsigned)iElem * ElemSize );
\r
2345 IF( p >= (char*)m->Next ) goto err_ns;
\r
2346 *(char**)out_pElem = p;
\r
2352 err_ns: e = E_NOT_FOUND_SYMBOL; goto fin;
\r
2357 /***********************************************************************
\r
2358 <<< [Set2_alloc_imp] >>>
\r
2359 ************************************************************************/
\r
2360 int Set2_alloc_imp( Set2* m, void* pp, size_t size )
\r
2364 e= Set2_expandIfOverByAddr( m, (char*) m->Next + size ); IF(e)goto fin;
\r
2365 *(void**)pp = m->Next;
\r
2366 m->Next = (char*) m->Next + size;
\r
2368 MEMSET_TO_NOT_INIT( *(void**)pp, size );
\r
2376 int Set2_allocMulti_sub( Set2* m, void* out_pElem, size_t ElemsSize )
\r
2381 e= Set2_expandIfOverByAddr( m, (char*) m->Next + ElemsSize ); IF(e)goto fin;
\r
2382 p = (char*) m->Next;
\r
2383 m->Next = p + ElemsSize;
\r
2384 *(char**)out_pElem = p;
\r
2393 /***********************************************************************
\r
2394 <<< [Set2_expandIfOverByAddr_imp] >>>
\r
2395 ************************************************************************/
\r
2396 int Set2_expandIfOverByAddr_imp( Set2* m, void* OverAddrBasedOnNowFirst )
\r
2399 unsigned offset_of_over;
\r
2400 unsigned offset_of_next;
\r
2402 if ( OverAddrBasedOnNowFirst <= m->Over ) return E_OTHERS;
\r
2404 offset_of_next = (unsigned)( (char*)OverAddrBasedOnNowFirst - (char*)m->First );
\r
2405 offset_of_over = (unsigned)( ( (char*)m->Over - (char*)m->First ) ) * 2;
\r
2406 IF_D( offset_of_next >= 0x80000000 ) goto err;
\r
2407 while ( offset_of_over < offset_of_next ) offset_of_over *= 2;
\r
2408 IF( offset_of_over >= 0x10000000 ) goto err;
\r
2410 new_first = realloc( m->First, offset_of_over * 2 );
\r
2411 IF( new_first == NULL ) goto err_fm;
\r
2413 m->Next = (char*) new_first + ( (char*)m->Next - (char*)m->First );
\r
2414 m->Over = (char*) new_first + offset_of_over * 2;
\r
2415 m->First = new_first;
\r
2418 if ( m->PointerOfDebugArray != NULL )
\r
2419 { *m->PointerOfDebugArray = m->First; }
\r
2424 err: return E_OTHERS;
\r
2425 err_fm: return E_FEW_MEMORY;
\r
2429 /***********************************************************************
\r
2430 <<< [Set2_separate] >>>
\r
2431 ************************************************************************/
\r
2432 int Set2_separate( Set2* m, int NextSize, void** allocate_Array )
\r
2435 void* p = m->First;
\r
2437 if ( NextSize == 0 ) {
\r
2438 MEMSET_TO_NOT_INIT( m, sizeof(*m) );
\r
2442 e= Set2_init( m, NextSize ); IF(e)goto fin;
\r
2444 *allocate_Array = p;
\r
2453 /***********************************************************************
\r
2454 <<< [Set2_setDebug] >>>
\r
2455 ************************************************************************/
\r
2457 void Set2_setDebug( Set2* m, void** PointerOfDebugArray )
\r
2459 m->PointerOfDebugArray = PointerOfDebugArray;
\r
2460 *m->PointerOfDebugArray = m->First;
\r
2466 /*=================================================================*/
\r
2467 /* <<< [Print/Print2.c] >>> */
\r
2468 /*=================================================================*/
\r
2470 /***********************************************************************
\r
2471 <<< [vsprintf_r] >>>
\r
2472 ************************************************************************/
\r
2473 errnum_t vsprintf_r( char* s, size_t s_size, const char* format, va_list va )
\r
2476 #pragma warning(push)
\r
2477 #pragma warning(disable: 4996)
\r
2480 int r = _vsnprintf( s, s_size, format, va );
\r
2483 #pragma warning(pop)
\r
2486 IF( r == (int) s_size )
\r
2487 { s[s_size-1] = '\0'; return E_FEW_ARRAY; }
\r
2489 { return E_NOT_FOUND_SYMBOL; } /* Bad character code */
\r
2496 /***********************************************************************
\r
2497 <<< [vswprintf_r] >>>
\r
2498 ************************************************************************/
\r
2500 errnum_t vswprintf_r( wchar_t* s, size_t s_size, const wchar_t* format, va_list va )
\r
2502 size_t tsize = s_size / sizeof(wchar_t);
\r
2504 #pragma warning(push)
\r
2505 #pragma warning(disable: 4996)
\r
2506 int r = _vsnwprintf( s, tsize, format, va );
\r
2507 #pragma warning(pop)
\r
2509 if ( r == (int) tsize || r == -1 ) { s[tsize-1] = '\0'; return E_FEW_ARRAY; }
\r
2516 /***********************************************************************
\r
2517 <<< [stprintf_r] >>>
\r
2518 ************************************************************************/
\r
2519 errnum_t stprintf_r( TCHAR* s, size_t s_size, const TCHAR* format, ... )
\r
2524 va_start( va, format );
\r
2525 e = vstprintf_r( s, s_size, format, va );
\r
2532 /***********************************************************************
\r
2533 <<< [stcpy_part_r] >>>
\r
2534 ************************************************************************/
\r
2535 errnum_t stcpy_part_r( TCHAR* s, size_t s_size, TCHAR* s_start, TCHAR** p_s_last,
\r
2536 const TCHAR* src, const TCHAR* src_over )
\r
2538 size_t s_space = (char*)s + s_size - (char*)s_start;
\r
2541 IF_D( s_start < s || (char*)s_start >= (char*)s + s_size ) { return 1; }
\r
2543 if ( src_over == NULL ) { src_over = _tcschr( src, _T('\0') ); }
\r
2544 src_size = (char*)src_over - (char*)src;
\r
2545 IF ( src_size >= s_space ) {
\r
2546 s_space -= sizeof(TCHAR);
\r
2547 memcpy( s, src, s_space );
\r
2549 s_start = (TCHAR*)((char*)s_start + s_space );
\r
2552 if ( p_s_last != NULL ) { *p_s_last=s_start; }
\r
2553 return E_FEW_ARRAY;
\r
2556 memcpy( s_start, src, src_size + sizeof(TCHAR) );
\r
2557 s_start = (TCHAR*)((char*)s_start + src_size); *s_start = _T('\0');
\r
2558 if ( p_s_last != NULL ) { *p_s_last = s_start; }
\r
2565 /***********************************************************************
\r
2566 <<< [stprintf_part_r] >>>
\r
2567 ************************************************************************/
\r
2568 errnum_t stprintf_part_r( TCHAR* s, size_t s_size, TCHAR* s_start, TCHAR** p_s_last,
\r
2569 const TCHAR* format, ... )
\r
2573 va_start( va, format );
\r
2575 IF_D( s_start < s || (char*)s_start >= (char*)s + s_size ) {return E_OTHERS;}
\r
2577 e = vstprintf_r( s_start, s_size - ( (char*)s_start - (char*)s), format, va );
\r
2578 va_end( va ); if ( p_s_last != NULL ) *p_s_last = _tcschr( s_start, '\0' );
\r
2583 /*=================================================================*/
\r
2584 /* <<< [Error4/Error4.c] >>> */
\r
2585 /*=================================================================*/
\r
2587 /***********************************************************************
\r
2588 <<< [Get_Error4_Variables] >>>
\r
2589 ************************************************************************/
\r
2590 static Error4_VariablesClass gs;
\r
2592 extern Error4_VariablesClass* g_Error4_Variables = &gs;
\r
2595 Error4_VariablesClass* Get_Error4_Variables()
\r
2602 /***********************************************************************
\r
2603 <<< [SetBreakErrorID] >>>
\r
2604 ************************************************************************/
\r
2605 #if ERR2_ENABLE_ERROR_BREAK
\r
2607 dll_global_g_DebugBreakCount Err2 g_Err2; /*
\8f\89\8aú
\92l
\82Í
\82·
\82×
\82Ä
\83[
\83\8d */
\r
2609 void SetBreakErrorID( int ID )
\r
2611 Err2* m = &g_Err2;
\r
2613 m->BreakErrID = ID;
\r
2617 int TryOnIfTrue_imp( const char* FilePath, int LineNum )
\r
2618 //
\95Ô
\82è
\92l
\82Í
\81A
\83u
\83\8c\81[
\83N
\82·
\82é
\82©
\82Ç
\82¤
\82©
\r
2620 //===
\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
2621 if ( g_Err2.IsErr ) return 0;
\r
2624 //===
\83G
\83\89\81[
\82ª
\8f\89\82ß
\82Ä
\8bN
\82«
\82½
\82Æ
\82«
\r
2626 Err2* m = &g_Err2;
\r
2630 m->FilePath = FilePath;
\r
2631 m->LineNum = LineNum;
\r
2633 #if ERR2_ENABLE_ERROR_LOG
\r
2634 printf( "<ERRORLOG msg=\"raised\" err_id=\"%d\" g_err2=\"0x%08X\"/>\n", m->ErrID, (int) m );
\r
2637 return ( m->ErrID == m->BreakErrID );
\r
2645 Err2* m = &g_Err2;
\r
2647 #if ERR2_ENABLE_ERROR_LOG
\r
2648 if ( m->IsErr != 0 )
\r
2649 printf( "<ERRORLOG msg=\"cleared\" err_id=\"%d\" g_err2=\"0x%08X\"/>\n", m->ErrID, (int) m );
\r
2657 bool IsErrorMode()
\r
2659 return ( g_Err2.IsErr != 0 );
\r
2663 //[IfErrThenBreak]
\r
2664 void IfErrThenBreak()
\r
2666 if ( g_Err2.IsErr && ( g_Err2.ErrID != g_Err2.BreakErrID || g_Err2.BreakErrID == 0 ) ) { TestableDebugBreak();
\r
2667 //
\83E
\83H
\83b
\83`
\82Å
\81Ag_Err2.ErrID
\82Ì
\92l(N
\82Æ
\82·
\82é)
\82ð
\8am
\94F
\82µ
\82Ä
\81A
\r
2668 //
\83\81\83C
\83\93\8aÖ
\90\94\82Å SetBreakErrorID( N );
\82ð
\8cÄ
\82Ñ
\8fo
\82µ
\82Ä
\82
\82¾
\82³
\82¢
\81B
\r
2669 //
\83G
\83\89\81[
\82ª
\94
\90¶
\82µ
\82½
\8fê
\8f\8a\82Í
\81Ag_Err2.FilePath, g_Err2.LineNum
\82Å
\82·
\81B
\r
2670 //
\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
2671 // ClearError()
\82ð
\96Y
\82ê
\82Ä
\82¢
\82é
\89Â
\94\
\90«
\82ª
\82 \82è
\82Ü
\82·
\81B
\r
2672 #if ERR2_ENABLE_ERROR_LOG
\r
2673 printf( "<ERRORLOG msg=\"IfErrThenBreak\" ErrID=\"%d\" BreakErrID=\"%d\"/>\n", g_Err2.ErrID, g_Err2.BreakErrID );
\r
2678 sprintf_s( str, _countof(str), "<ERROR file=\"%s(%d)\"/>\n", g_Err2.FilePath, g_Err2.LineNum );
\r
2679 OutputDebugStringA( str );
\r
2686 void PushErr( ErrStackAreaClass* ErrStackArea )
\r
2688 ErrStackArea->ErrID = g_Err2.ErrID;
\r
2689 ErrStackArea->IsErr = g_Err2.IsErr;
\r
2694 void PopErr( ErrStackAreaClass* ErrStackArea )
\r
2696 if ( ErrStackArea->IsErr )
\r
2701 #endif // ERR2_ENABLE_ERROR_BREAK
\r
2704 /***********************************************************************
\r
2705 <<< [g_Error4_String] >>>
\r
2706 ************************************************************************/
\r
2707 TCHAR g_Error4_String[4096];
\r
2711 /***********************************************************************
\r
2712 <<< [Error4_printf] >>>
\r
2713 ************************************************************************/
\r
2714 void Error4_printf( const TCHAR* format, ... )
\r
2717 va_start( va, format );
\r
2718 vstprintf_r( g_Error4_String, sizeof(g_Error4_String), format, va );
\r
2724 /***********************************************************************
\r
2725 <<< [Error4_getErrStr] >>>
\r
2726 ************************************************************************/
\r
2727 void Error4_getErrStr( int ErrNum, TCHAR* out_ErrStr, size_t ErrStrSize )
\r
2729 switch ( ErrNum ) {
\r
2732 stprintf_r( out_ErrStr, ErrStrSize, _T("no error") );
\r
2736 case E_GET_LAST_ERROR: {
\r
2738 TCHAR* str_pointer;
\r
2740 err_win = gs.WindowsLastError;
\r
2741 if ( err_win == 0 ) { err_win = GetLastError(); }
\r
2743 stprintf_part_r( out_ErrStr, ErrStrSize, out_ErrStr, &str_pointer,
\r
2744 _T("<ERROR GetLastError=\"0x%08X\" GetLastErrorStr=\""), err_win );
\r
2745 FormatMessage( FORMAT_MESSAGE_IGNORE_INSERTS | FORMAT_MESSAGE_FROM_SYSTEM,
\r
2746 NULL, err_win, LANG_USER_DEFAULT,
\r
2747 str_pointer, (TCHAR*)( (char*)out_ErrStr + ErrStrSize ) - str_pointer, NULL );
\r
2748 str_pointer = _tcschr( str_pointer, _T('\0') );
\r
2749 if ( *( str_pointer - 2 ) == _T('\r') && *( str_pointer - 1 ) == _T('\n') )
\r
2751 stcpy_part_r( out_ErrStr, ErrStrSize, str_pointer, NULL, _T("\"/>"), NULL );
\r
2757 if ( g_Error4_String[0] != '\0' )
\r
2758 stprintf_r( out_ErrStr, ErrStrSize, _T("%s"), g_Error4_String );
\r
2760 stprintf_r( out_ErrStr, ErrStrSize, _T("<ERROR errnum=\"%d\"/>"), ErrNum );
\r
2767 /***********************************************************************
\r
2768 <<< [SaveWindowsLastError] >>>
\r
2769 ************************************************************************/
\r
2770 errnum_t SaveWindowsLastError()
\r
2772 gs.WindowsLastError = GetLastError();
\r
2773 return E_GET_LAST_ERROR;
\r
2778 /***********************************************************************
\r
2779 <<< [Error4_showToStdErr] >>>
\r
2780 ************************************************************************/
\r
2781 void Error4_showToStdErr( int err_num )
\r
2788 if ( err_num != 0 ) {
\r
2789 Error4_getErrStr( err_num, msg, sizeof(msg) );
\r
2791 setlocale( LC_ALL, ".OCP" );
\r
2792 sprintf_s( msg2, sizeof(msg2), "%S", msg );
\r
2793 fprintf( stderr, "%s\n", msg2 ); // _ftprintf_s
\82Å
\82Í
\93ú
\96{
\8cê
\82ª
\8fo
\82Ü
\82¹
\82ñ
\r
2795 fprintf( stderr, "%s\n", msg );
\r
2798 #if ERR2_ENABLE_ERROR_BREAK
\r
2799 fprintf( stderr, "
\81i
\8aJ
\94
\8eÒ
\82Ö
\81j
\83\81\83C
\83\93\8aÖ
\90\94\82Å SetBreakErrorID( %d );
\82ð
\8cÄ
\82Ñ
\8fo
\82µ
\82Ä
\82
\82¾
\82³
\82¢
\81B\n",
\r
2803 if ( err_num == E_FEW_MEMORY || gs.WindowsLastError == ERROR_NOT_ENOUGH_MEMORY ) {
\r
2804 /* Not show the message for developper */
\r
2807 fprintf( stderr, "
\81i
\8aJ
\94
\8eÒ
\82Ö
\81jERR2_ENABLE_ERROR_BREAK
\82ð
\92è
\8b`
\82µ
\82Ä
\8dÄ
\83R
\83\93\83p
\83C
\83\8b\82µ
\82Ä
\82
\82¾
\82³
\82¢
\81B\n" );
\r
2817 /***********************************************************************
\r
2818 <<< [Error4_raiseErrno] >>>
\r
2819 ************************************************************************/
\r
2820 #include <errno.h>
\r
2822 int Error4_raiseErrno()
\r
2827 e2 = _get_errno( &e );
\r
2828 if ( e2 != 0 ) { Error4_printf( _T("ERROR in _get_errno") ); return E_UNKNOWN; }
\r
2829 e2 = _tcserror_s( msg, sizeof(msg)/sizeof(TCHAR), e );
\r
2830 if ( e2 != 0 ) { Error4_printf( _T("ERROR in strerror_s") ); return E_UNKNOWN; }
\r
2832 Error4_printf( _T("ERROR (%d) %s\n"), e, msg );
\r
2838 /*=================================================================*/
\r
2839 /* <<< [DebugTools/DebugTools.c] >>> */
\r
2840 /*=================================================================*/
\r
2842 /***********************************************************************
\r
2843 <<< [TestableDebugBreak] >>>
\r
2844 ************************************************************************/
\r
2845 dll_global_g_DebugBreakCount int g_bTestableDebugBreak_Disable;
\r
2846 dll_global_g_DebugBreakCount int g_DebugBreakCount;
\r
2850 /***********************************************************************
\r
2851 <<< [TestableDebugBreak_isEnabled] >>>
\r
2852 ************************************************************************/
\r
2853 int TestableDebugBreak_isEnabled()
\r
2855 return g_bTestableDebugBreak_Disable == 0;
\r