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
17 AppKey_initGlobal_const();
\r
22 /***********************************************************************
\r
23 <<< [Globals_initialize] >>>
\r
24 ************************************************************************/
\r
25 int Globals_initialize()
\r
29 e= Locale_init(); IF(e)goto fin;
\r
32 goto fin; // for avoid warning of no goto fin
\r
39 /***********************************************************************
\r
40 <<< [Globals_finalize] >>>
\r
41 ************************************************************************/
\r
42 int Globals_finalize( int e )
\r
44 e= AppKey_finishGlobal( e );
\r
51 /*=================================================================*/
\r
52 /* <<< [PlatformSDK_plus/PlatformSDK_plus.c] >>> */
\r
53 /*=================================================================*/
\r
55 /***********************************************************************
\r
56 <<< [GetCommandLineUnnamed] >>>
\r
57 ************************************************************************/
\r
58 int GetCommandLineUnnamed( int Index1, TCHAR* out_AParam, size_t AParamSize )
\r
60 TCHAR* line = GetCommandLine();
\r
69 IF( Index1 < 0 ) goto err_nf;
\r
75 while ( *p == _T(' ') ) p++;
\r
79 if ( c == _T('\0') ) goto err_nf; // Here is not decided to error or not
\r
82 //=== Skip named option
\r
83 else if ( c == _T('/') ) {
\r
87 if ( c == _T('"') || c == _T(' ') || c == _T('\0') ) break;
\r
91 if ( c == _T('"') ) {
\r
93 while ( *p != _T('"') && *p != _T('\0') ) p++;
\r
94 if ( *p == _T('"') ) p++;
\r
98 //=== Skip or Get unnamed parameter
\r
100 while ( *p == _T(' ') ) p++;
\r
105 if ( c == _T('"') ) {
\r
107 while ( *p2 != _T('"') && *p2 != _T('\0') ) p2++;
\r
110 while ( *p2 != _T(' ') && *p2 != _T('\0') ) p2++;
\r
113 if ( index == 0 ) {
\r
116 e= stcpy_part_r( out_AParam, AParamSize, out_AParam, NULL, p, p2 );
\r
117 ASSERT_D( !e, __noop() );
\r
121 p = ( *p2 == _T('"') ) ? p2+1 : p2;
\r
128 if ( AParamSize >= sizeof(TCHAR) ) *out_AParam = _T('\0');
\r
129 IF ( Index1 >= 2 ) return E_NOT_FOUND_SYMBOL;
\r
135 /***********************************************************************
\r
136 <<< [GetCommandLineNamed] >>>
\r
137 ************************************************************************/
\r
138 int GetCommandLineNamed_sub( const TCHAR* Name, bool bCase, bool* out_IsExist, TCHAR* out_Value, size_t ValueSize );
\r
140 int GetCommandLineNamed( const TCHAR* Name, bool bCase, TCHAR* out_Value, size_t ValueSize )
\r
143 return GetCommandLineNamed_sub( Name, bCase, &is_exist, out_Value, ValueSize );
\r
147 int GetCommandLineNamed_sub( const TCHAR* Name, bool bCase, bool* out_IsExist, TCHAR* out_Value, size_t ValueSize )
\r
149 TCHAR* line = GetCommandLine();
\r
153 const size_t name_len = _tcslen( Name );
\r
156 *out_IsExist = true;
\r
162 //=== Compare option name
\r
163 if ( c == _T('/') ) {
\r
168 if ( c == _T(':') || c == _T(' ') || c == _T('\0') ) break;
\r
172 bMatch = ( p2-p == (int)name_len && _tcsncmp( p, Name, p2-p ) == 0 );
\r
174 bMatch = ( p2-p == (int)name_len && _tcsnicmp( p, Name, p2-p ) == 0 );
\r
177 //=== Get the value
\r
178 if ( c == _T(':') ) {
\r
180 if ( *p == _T('"') ) {
\r
183 while ( *p2 != _T('"') && *p2 != _T('\0') ) p2++;
\r
185 return stcpy_part_r( out_Value, ValueSize, out_Value, NULL, p, p2 );
\r
191 while ( *p2 != _T(' ') && *p2 != _T('\0') ) p2++;
\r
193 return stcpy_part_r( out_Value, ValueSize, out_Value, NULL, p, p2 );
\r
199 IF( bMatch ) return E_NOT_FOUND_SYMBOL; // no value error
\r
203 else if ( c == _T('\0') ) break;
\r
206 else if ( c == _T('"') ) {
\r
208 while ( *p != _T('"') && *p != _T('\0') ) p++;
\r
209 while ( *p != _T(' ') && *p != _T('\0') ) p++;
\r
212 while ( *p != _T(' ') && *p != _T('\0') ) p++;
\r
214 while ( *p == _T(' ') ) p++;
\r
217 *out_IsExist = false;
\r
218 return E_NOT_FOUND_SYMBOL;
\r
223 /***********************************************************************
\r
224 <<< [GetCommandLineNamedI] >>>
\r
225 ************************************************************************/
\r
226 int GetCommandLineNamedI( const TCHAR* Name, bool bCase, int* out_Value )
\r
232 e= GetCommandLineNamed_sub( Name, bCase, &is_exist, s, sizeof(s) ); IF(e)goto fin; //[out] s
\r
233 if ( s[0] == _T('0') && s[1] == _T('x') )
\r
234 *out_Value = _tcstoul( s, NULL, 16 );
\r
236 *out_Value = _ttoi( s );
\r
244 /***********************************************************************
\r
245 <<< [GetCommandLineNamedC8] >>>
\r
246 ************************************************************************/
\r
248 int GetCommandLineNamedC8( const TCHAR* Name, bool bCase, char* out_Value, size_t ValueSize )
\r
254 s = (TCHAR*) malloc( ValueSize * sizeof(TCHAR) );
\r
255 e= GetCommandLineNamed_sub( Name, bCase, &is_exist, (TCHAR*) s, ValueSize * sizeof(TCHAR) ); IF(e)goto fin;
\r
257 sprintf_s( out_Value, ValueSize, "%S", s );
\r
259 if ( s != NULL ) free( s );
\r
266 /***********************************************************************
\r
267 <<< [GetCommandLineExist] >>>
\r
268 ************************************************************************/
\r
269 bool GetCommandLineExist( const TCHAR* Name, bool bCase )
\r
275 e = GetCommandLineNamed_sub( Name, bCase, &is_exist, v, sizeof(v) );
\r
276 if ( e == E_NOT_FOUND_SYMBOL ) ClearError();
\r
282 /***********************************************************************
\r
283 <<< [env_part] >>>
\r
284 ************************************************************************/
\r
285 int env_part( TCHAR* Str, unsigned StrSize, TCHAR* StrStart, TCHAR** out_StrLast,
\r
286 const TCHAR* Input )
\r
298 p = Input; o = StrStart; o_last = (TCHAR*)( (char*)Str + StrSize - sizeof(TCHAR) );
\r
299 IF_D( StrStart < Str || StrStart >= o_last ) goto err;
\r
302 IF_D( StrSize <= 2 ) return E_FEW_ARRAY;
\r
304 while ( c != _T('\0') ) {
\r
305 if ( c == _T('%') ) {
\r
307 if ( *p == _T('%') ) {
\r
309 //=== %
\95¶
\8e\9a\82ð
\83R
\83s
\81[
\82·
\82é
\r
310 IF( o == o_last )goto err_fa;
\r
316 //===
\8aÂ
\8b«
\95Ï
\90\94\96¼
\82ð name
\82É
\8eæ
\93¾
\82·
\82é
\r
317 p2 = _tcschr( p, _T('%') ); IF( p2 == NULL )goto err_ns;
\r
318 e= StrT_cpy( name, sizeof(name), _T("abc") ); IF(e)goto fin;
\r
319 e= stcpy_part_r( name, sizeof(name), name, NULL, p, p2 ); IF(e)goto fin;
\r
321 //===
\8aÂ
\8b«
\95Ï
\90\94\82Ì
\92l
\82ð o
\82É
\8eæ
\93¾
\82·
\82é
\r
322 count = ( o_last + sizeof(TCHAR) - o ) / sizeof(TCHAR);
\r
323 r= GetEnvironmentVariable( name, o, count );
\r
324 IF( r==0 ) goto err_ns; //
\8aÂ
\8b«
\95Ï
\90\94\82ª
\8c©
\82Â
\82©
\82ç
\82È
\82¢
\r
325 IF( r > count ) goto err_fa;
\r
327 //=== p, o
\82ð
\8dX
\90V
\82·
\82é
\r
329 o = _tcschr( o, _T('\0') );
\r
334 //===
\8aÂ
\8b«
\95Ï
\90\94\82Å
\82Í
\82È
\82¢
\95\94\95ª
\82ð
\83R
\83s
\81[
\82·
\82é
\r
335 IF( o == o_last )goto err_fa;
\r
345 if ( out_StrLast != NULL ) *out_StrLast = o;
\r
348 err_fa: e = E_FEW_ARRAY; goto fin;
\r
349 err_ns: e = E_NOT_FOUND_SYMBOL; goto fin;
\r
350 err: e = E_OTHERS; goto fin;
\r
355 /***********************************************************************
\r
356 <<< [env_malloc] >>>
\r
357 ************************************************************************/
\r
358 int env_malloc( TCHAR** out_Value, size_t* out_ValueLen, const TCHAR* Name )
\r
362 TCHAR* value = NULL;
\r
364 r= GetEnvironmentVariable( Name, NULL, 0 );
\r
367 return 0; //
\8aÂ
\8b«
\95Ï
\90\94\82ª
\92è
\8b`
\82³
\82ê
\82Ä
\82¢
\82È
\82¢
\82Æ
\82«
\82Å
\82à
\81A
\83G
\83\89\81[
\82É
\82µ
\82È
\82¢
\r
370 value = (TCHAR*) malloc( r * sizeof(TCHAR) );
\r
371 IF( value == NULL ) goto err_fm;
\r
372 GetEnvironmentVariable( Name, value, r );
\r
374 *out_Value = value;
\r
375 if ( out_ValueLen != NULL ) *out_ValueLen = r - 1;
\r
381 err_fm: e = E_FEW_MEMORY; goto fin;
\r
386 /*=================================================================*/
\r
387 /* <<< [Parse2/Parse2.c] >>> */
\r
388 /*=================================================================*/
\r
390 /***********************************************************************
\r
391 <<< [Parse_PP_Directive] >>>
\r
392 ************************************************************************/
\r
394 errnum_t Parse_PP_Directive_Step1( const TCHAR* Text, Set2* DirectivePointerArray );
\r
395 errnum_t Parse_PP_Directive_ConnectIf( Set2* DirectivePointerArray );
\r
396 errnum_t Parse_PP_Directive_Parameter( Set2* DirectivePointerArray );
\r
399 errnum_t Parse_PP_Directive( const TCHAR* Text,
\r
400 Set2* /*<PP_DirectiveClass*>*/ DirectivePointerArray )
\r
404 e= Parse_PP_Directive_Step1( Text, DirectivePointerArray ); IF(e){goto fin;}
\r
405 e= Parse_PP_Directive_ConnectIf( DirectivePointerArray ); IF(e){goto fin;}
\r
406 e= Parse_PP_Directive_Parameter( DirectivePointerArray ); IF(e){goto fin;}
\r
414 /*[Parse_PP_Directive_Step1]*/
\r
415 errnum_t Parse_PP_Directive_Step1( const TCHAR* Text, Set2* DirectivePointerArray )
\r
420 PP_DirectiveClass* directive = NULL;
\r
421 PP_DirectiveClass directive_0;
\r
422 PP_DirectiveClass** directive_pp;
\r
423 ClassID_Class* class_ID;
\r
426 PP_DirectiveClass_initConst( &directive_0 );
\r
430 /* Set "DirectiveName_Start" */
\r
431 p = _tcschr( pos, _T('#') );
\r
434 p = StrT_skip( p + 1, _T(" \t") );
\r
435 ASSERT_R( *p != _T('\0'), e=E_OTHERS; goto fin );
\r
436 directive_0.DirectiveName_Start = p;
\r
439 /* Set "DirectiveName_Over" */
\r
440 directive_0.DirectiveName_Over =
\r
441 StrT_searchOverOfCIdentifier( directive_0.DirectiveName_Start );
\r
445 p = StrT_rstr( Text, directive_0.DirectiveName_Start, _T("\n"), NULL );
\r
446 if ( p == NULL ) { p = Text; }
\r
448 directive_0.Start = p;
\r
452 p = directive_0.DirectiveName_Over;
\r
454 const TCHAR* p2 = _tcschr( p, _T('\n') );
\r
455 if ( p2 == NULL ) {
\r
456 p = _tcschr( p, _T('\0') );
\r
458 } else if ( *( p2 - 1 ) == _T('\\') ) {
\r
466 directive_0.Over = p;
\r
469 /* Set "directive" */
\r
471 static NameOnlyClass table[] = {
\r
472 { _T("define"), (void*) &g_PP_SharpDefineClass_ID },
\r
473 { _T("include"),(void*) &g_PP_SharpIncludeClass_ID },
\r
474 { _T("if"), (void*) &g_PP_SharpIfClass_ID },
\r
475 { _T("else"), (void*) &g_PP_SharpElseClass_ID },
\r
476 { _T("endif"), (void*) &g_PP_SharpEndifClass_ID },
\r
477 { _T("ifdef"), (void*) &g_PP_SharpIfdefClass_ID },
\r
478 { _T("ifndef"), (void*) &g_PP_SharpIfndefClass_ID },
\r
481 class_ID = StrT_convPartStrToPointer(
\r
482 directive_0.DirectiveName_Start,
\r
483 directive_0.DirectiveName_Over,
\r
484 table, sizeof(table), (void*) &g_PP_DirectiveClass_ID );
\r
487 e= ClassID_Class_createObject( class_ID, &directive, NULL ); IF(e){goto fin;}
\r
489 directive->DirectiveName_Start = directive_0.DirectiveName_Start;
\r
490 directive->DirectiveName_Over = directive_0.DirectiveName_Over;
\r
491 directive->Start = directive_0.Start;
\r
492 directive->Over = directive_0.Over;
\r
495 /* Add to "DirectivePointerArray" (1) */
\r
496 e= Set2_alloc( DirectivePointerArray, &directive_pp, PP_DirectiveClass* );
\r
500 /* Add to "DirectivePointerArray" (2) */
\r
501 *directive_pp = directive;
\r
506 pos = directive_0.Over;
\r
507 PP_DirectiveClass_initConst( &directive_0 );
\r
512 if ( directive != NULL ) { e= HeapMemory_free( &directive, e ); }
\r
517 /*[Parse_PP_Directive_ConnectIf]*/
\r
518 errnum_t Parse_PP_Directive_ConnectIf( Set2* DirectivePointerArray )
\r
521 PP_DirectiveClass** pp;
\r
522 PP_DirectiveClass** pp_over;
\r
523 PP_DirectiveClass* directive;
\r
524 PP_SharpIfClass** pp_sh_if; /* pp is pointer of pointer, sh = sharp */
\r
525 PP_SharpElseClass** pp_sh_else;
\r
528 PP_SharpIfClass* sh_if; /* sh = sharp */
\r
529 PP_SharpElseClass* sh_else; /* sh = sharp */
\r
530 PP_SharpEndifClass* sh_endif; /* sh = sharp */
\r
531 PP_DirectiveClass* sh_if_or_else; /* sh = sharp */
\r
534 Set2_initConst( &if_stack );
\r
535 Set2_initConst( &else_stack );
\r
536 e= Set2_init( &if_stack, 0x10 ); IF(e){goto fin;}
\r
537 e= Set2_init( &else_stack, 0x10 ); IF(e){goto fin;}
\r
541 sh_if_or_else = NULL;
\r
543 for ( Set2_forEach( DirectivePointerArray, &pp, &pp_over, PP_DirectiveClass* ) ) {
\r
546 if ( ClassID_Class_isSuperClass( directive->ClassID, &g_PP_SharpIfClass_ID ) ) {
\r
548 /* Start of nest */
\r
549 if ( sh_if_or_else != NULL ) {
\r
550 e= Set2_alloc( &if_stack, &pp_sh_if, PP_SharpIfClass* );
\r
554 e= Set2_alloc( &else_stack, &pp_sh_else, PP_SharpElseClass* );
\r
556 *pp_sh_else = sh_else;
\r
560 sh_if = (PP_SharpIfClass*) directive;
\r
561 sh_if_or_else = directive;
\r
563 else if ( directive->ClassID == &g_PP_SharpElseClass_ID ) {
\r
564 sh_else = (PP_SharpElseClass*) directive;
\r
566 IF ( sh_if == NULL ) {
\r
567 Error4_printf( _T("<ERROR msg=\"Not found #if\"/>") );
\r
568 e= E_ORIGINAL; goto fin;
\r
571 /* Link #if and #else */
\r
572 sh_if->NextDirective = directive;
\r
573 sh_else->StartDirective = sh_if;
\r
574 sh_if_or_else = directive;
\r
576 else if ( directive->ClassID == &g_PP_SharpEndifClass_ID ) {
\r
577 sh_endif = (PP_SharpEndifClass*) directive;
\r
579 IF ( sh_if_or_else == NULL ) {
\r
580 Error4_printf( _T("<ERROR msg=\"Not found #if\"/>") );
\r
581 e= E_ORIGINAL; goto fin;
\r
584 /* Link ( #if or #else ) and #endif */
\r
585 sh_if->EndDirective = sh_endif;
\r
586 if ( sh_else == NULL )
\r
587 { sh_if->NextDirective = directive; }
\r
589 { sh_else->EndDirective = sh_endif; }
\r
590 sh_endif->StartDirective = sh_if;
\r
591 sh_endif->PreviousDirective = sh_if_or_else;
\r
596 sh_if_or_else = NULL;
\r
599 if ( if_stack.Next > if_stack.First ) {
\r
600 e= Set2_pop( &if_stack, &pp_sh_if, PP_SharpIfClass* );
\r
604 e= Set2_pop( &else_stack, &pp_sh_else, PP_SharpElseClass* );
\r
606 sh_else = *pp_sh_else;
\r
608 if ( sh_else == NULL ) {
\r
609 sh_if_or_else = (PP_DirectiveClass*) sh_if;
\r
611 sh_if_or_else = (PP_DirectiveClass*) sh_else;
\r
619 e= Set2_finish( &if_stack, e );
\r
620 e= Set2_finish( &else_stack, e );
\r
625 /*[Parse_PP_Directive_Parameter]*/
\r
626 errnum_t Parse_PP_Directive_Parameter( Set2* DirectivePointerArray )
\r
630 PP_DirectiveClass** pp;
\r
631 PP_DirectiveClass** pp_over;
\r
632 PP_DirectiveClass* directive;
\r
634 for ( Set2_forEach( DirectivePointerArray, &pp, &pp_over, PP_DirectiveClass* ) ) {
\r
637 if ( ClassID_Class_isSuperClass( directive->ClassID, &g_PP_SharpDefineClass_ID ) ) {
\r
638 PP_SharpDefineClass* sh_define = (PP_SharpDefineClass*) directive;
\r
640 p = StrT_skip( sh_define->DirectiveName_Over, _T(" \t") );
\r
641 IF ( p >= sh_define->Over ) { e=E_OTHERS; goto fin; }
\r
642 sh_define->Symbol_Start = p;
\r
644 p = StrT_searchOverOfCIdentifier( p );
\r
645 sh_define->Symbol_Over = p;
\r
648 if ( ClassID_Class_isSuperClass( directive->ClassID, &g_PP_SharpIncludeClass_ID ) ) {
\r
651 PP_SharpIncludeClass* sh_include = (PP_SharpIncludeClass*) directive;
\r
653 p = StrT_skip( sh_include->DirectiveName_Over, _T(" \t") );
\r
654 IF ( p >= sh_include->Over ) { e=E_OTHERS; goto fin; }
\r
657 sh_include->PathBracket = _T('<');
\r
662 sh_include->PathBracket = _T('"');
\r
663 closers = _T("\"");
\r
667 sh_include->PathBracket = _T('\0');
\r
668 closers = _T(" \t\n");
\r
672 sh_include->Path_Start = p + 1;
\r
674 p = StrT_chrs( p + 1, closers );
\r
675 IF ( p == NULL ) { e=E_OTHERS; goto fin; }
\r
676 sh_include->Path_Over = p;
\r
679 if ( ClassID_Class_isSuperClass( directive->ClassID, &g_PP_SharpIfdefClass_ID ) ) {
\r
681 PP_SharpIfdefClass* sh_ifdef; /* sh = sharp */
\r
683 sh_ifdef = (PP_SharpIfdefClass*) directive;
\r
685 p = StrT_skip( sh_ifdef->DirectiveName_Over, _T(" \t") );
\r
686 IF ( p >= sh_ifdef->Over ) { e=E_OTHERS; goto fin; }
\r
687 sh_ifdef->Symbol_Start = p;
\r
689 p = StrT_searchOverOfCIdentifier( p );
\r
690 sh_ifdef->Symbol_Over = p;
\r
701 /***********************************************************************
\r
702 <<< [Delete_PP_Directive] >>>
\r
703 ************************************************************************/
\r
704 errnum_t Delete_PP_Directive( Set2* DirectivePointerArray, errnum_t e )
\r
706 PP_DirectiveClass** pp;
\r
707 PP_DirectiveClass** pp_over;
\r
708 PP_DirectiveClass* directive;
\r
709 FinalizerVTableClass* finalizer;
\r
711 if ( Set2_isInited( DirectivePointerArray ) ) {
\r
712 for ( Set2_forEach( DirectivePointerArray, &pp, &pp_over, PP_DirectiveClass* ) ) {
\r
714 finalizer = ClassID_Class_getVTable( directive->ClassID,
\r
715 &g_FinalizerInterface_ID );
\r
716 e= finalizer->Finalize( directive, e );
\r
717 e= HeapMemory_free( &directive, e );
\r
720 e= Set2_finish( DirectivePointerArray, e );
\r
727 /***********************************************************************
\r
728 <<< (PP_DirectiveClass) >>>
\r
729 ************************************************************************/
\r
731 /*[PP_DirectiveClass_initConst]*/
\r
732 void PP_DirectiveClass_initConst( PP_DirectiveClass* self )
\r
734 self->ClassID = &g_PP_DirectiveClass_ID;
\r
735 self->Start = NULL;
\r
737 self->DirectiveName_Start = NULL;
\r
738 self->DirectiveName_Over = NULL;
\r
741 /*[g_PP_DirectiveClass_ID]*/
\r
742 static const ClassID_Class* gs_PP_DirectiveClass_SuperClassIDs[] = {
\r
743 &g_ClassID_SuperClass_ID, &g_Variant_SuperClass_ID, &g_ParsedRangeClass_ID
\r
745 static const FinalizerVTableClass gs_PP_DirectiveClass_FinalizerVTable = {
\r
746 offsetof( PP_DirectiveClass, FinalizerVTable ),
\r
747 DefaultFunction_Finalize
\r
749 static const InterfaceToVTableClass gs_PP_DirectiveClass_InterfaceToVTables[] = {
\r
750 { &g_FinalizerInterface_ID, &gs_PP_DirectiveClass_FinalizerVTable }
\r
752 const ClassID_Class g_PP_DirectiveClass_ID = {
\r
753 "PP_DirectiveClass",
\r
754 gs_PP_DirectiveClass_SuperClassIDs,
\r
755 _countof( gs_PP_DirectiveClass_SuperClassIDs ),
\r
756 sizeof( PP_DirectiveClass ),
\r
758 gs_PP_DirectiveClass_InterfaceToVTables,
\r
759 _countof( gs_PP_DirectiveClass_InterfaceToVTables )
\r
763 /*[g_PP_SharpDefineClass_ID]*/
\r
764 static const ClassID_Class* gs_PP_SharpDefineClass_SuperClassIDs[] = {
\r
765 &g_ClassID_SuperClass_ID, &g_Variant_SuperClass_ID, &g_ParsedRangeClass_ID,
\r
766 &g_PP_DirectiveClass_ID
\r
768 static const FinalizerVTableClass gs_PP_SharpDefineClass_FinalizerVTable = {
\r
769 offsetof( PP_SharpDefineClass, FinalizerVTable ),
\r
770 DefaultFunction_Finalize
\r
772 static const InterfaceToVTableClass gs_PP_SharpDefineClass_InterfaceToVTables[] = {
\r
773 { &g_FinalizerInterface_ID, &gs_PP_SharpDefineClass_FinalizerVTable }
\r
775 const ClassID_Class g_PP_SharpDefineClass_ID = {
\r
776 "PP_SharpDefineClass",
\r
777 gs_PP_SharpDefineClass_SuperClassIDs,
\r
778 _countof( gs_PP_SharpDefineClass_SuperClassIDs ),
\r
779 sizeof( PP_SharpDefineClass ),
\r
781 gs_PP_SharpDefineClass_InterfaceToVTables,
\r
782 _countof( gs_PP_SharpDefineClass_InterfaceToVTables )
\r
786 /*[g_PP_SharpIncludeClass_ID]*/
\r
787 static const ClassID_Class* gs_PP_SharpIncludeClass_SuperClassIDs[] = {
\r
788 &g_ClassID_SuperClass_ID, &g_Variant_SuperClass_ID, &g_ParsedRangeClass_ID,
\r
789 &g_PP_DirectiveClass_ID
\r
791 static const FinalizerVTableClass gs_PP_SharpIncludeClass_FinalizerVTable = {
\r
792 offsetof( PP_SharpIncludeClass, FinalizerVTable ),
\r
793 DefaultFunction_Finalize
\r
795 static const InterfaceToVTableClass gs_PP_SharpIncludeClass_InterfaceToVTables[] = {
\r
796 { &g_FinalizerInterface_ID, &gs_PP_SharpIncludeClass_FinalizerVTable }
\r
798 const ClassID_Class g_PP_SharpIncludeClass_ID = {
\r
799 "PP_SharpIncludeClass",
\r
800 gs_PP_SharpIncludeClass_SuperClassIDs,
\r
801 _countof( gs_PP_SharpIncludeClass_SuperClassIDs ),
\r
802 sizeof( PP_SharpIncludeClass ),
\r
804 gs_PP_SharpIncludeClass_InterfaceToVTables,
\r
805 _countof( gs_PP_SharpIncludeClass_InterfaceToVTables )
\r
809 /*[g_PP_SharpIfClass_ID]*/
\r
810 static const ClassID_Class* gs_PP_SharpIfClass_SuperClassIDs[] = {
\r
811 &g_ClassID_SuperClass_ID, &g_Variant_SuperClass_ID, &g_ParsedRangeClass_ID,
\r
812 &g_PP_DirectiveClass_ID
\r
814 static const FinalizerVTableClass gs_PP_SharpIfClass_FinalizerVTable = {
\r
815 offsetof( PP_SharpIfClass, FinalizerVTable ),
\r
816 DefaultFunction_Finalize
\r
818 static const InterfaceToVTableClass gs_PP_SharpIfClass_InterfaceToVTables[] = {
\r
819 { &g_FinalizerInterface_ID, &gs_PP_SharpIfClass_FinalizerVTable }
\r
821 const ClassID_Class g_PP_SharpIfClass_ID = {
\r
823 gs_PP_SharpIfClass_SuperClassIDs,
\r
824 _countof( gs_PP_SharpIfClass_SuperClassIDs ),
\r
825 sizeof( PP_SharpIfClass ),
\r
827 gs_PP_SharpIfClass_InterfaceToVTables,
\r
828 _countof( gs_PP_SharpIfClass_InterfaceToVTables )
\r
832 /*[g_PP_SharpElseClass_ID]*/
\r
833 static const ClassID_Class* gs_PP_SharpElseClass_SuperClassIDs[] = {
\r
834 &g_ClassID_SuperClass_ID, &g_Variant_SuperClass_ID, &g_ParsedRangeClass_ID,
\r
835 &g_PP_DirectiveClass_ID
\r
837 static const FinalizerVTableClass gs_PP_SharpElseClass_FinalizerVTable = {
\r
838 offsetof( PP_SharpElseClass, FinalizerVTable ),
\r
839 DefaultFunction_Finalize
\r
841 static const InterfaceToVTableClass gs_PP_SharpElseClass_InterfaceToVTables[] = {
\r
842 { &g_FinalizerInterface_ID, &gs_PP_SharpElseClass_FinalizerVTable }
\r
844 const ClassID_Class g_PP_SharpElseClass_ID = {
\r
845 "PP_SharpElseClass",
\r
846 gs_PP_SharpElseClass_SuperClassIDs,
\r
847 _countof( gs_PP_SharpElseClass_SuperClassIDs ),
\r
848 sizeof( PP_SharpElseClass ),
\r
850 gs_PP_SharpElseClass_InterfaceToVTables,
\r
851 _countof( gs_PP_SharpElseClass_InterfaceToVTables )
\r
855 /*[g_PP_SharpEndifClass_ID]*/
\r
856 static const ClassID_Class* gs_PP_SharpEndifClass_SuperClassIDs[] = {
\r
857 &g_ClassID_SuperClass_ID, &g_Variant_SuperClass_ID, &g_ParsedRangeClass_ID,
\r
858 &g_PP_DirectiveClass_ID
\r
860 static const FinalizerVTableClass gs_PP_SharpEndifClass_FinalizerVTable = {
\r
861 offsetof( PP_SharpEndifClass, FinalizerVTable ),
\r
862 DefaultFunction_Finalize
\r
864 static const InterfaceToVTableClass gs_PP_SharpEndifClass_InterfaceToVTables[] = {
\r
865 { &g_FinalizerInterface_ID, &gs_PP_SharpEndifClass_FinalizerVTable }
\r
867 const ClassID_Class g_PP_SharpEndifClass_ID = {
\r
868 "PP_SharpEndifClass",
\r
869 gs_PP_SharpEndifClass_SuperClassIDs,
\r
870 _countof( gs_PP_SharpEndifClass_SuperClassIDs ),
\r
871 sizeof( PP_SharpEndifClass ),
\r
873 gs_PP_SharpEndifClass_InterfaceToVTables,
\r
874 _countof( gs_PP_SharpEndifClass_InterfaceToVTables )
\r
878 /*[g_PP_SharpIfdefClass_ID]*/
\r
879 static const ClassID_Class* gs_PP_SharpIfdefClass_SuperClassIDs[] = {
\r
880 &g_ClassID_SuperClass_ID, &g_Variant_SuperClass_ID, &g_ParsedRangeClass_ID,
\r
881 &g_PP_DirectiveClass_ID, &g_PP_SharpIfClass_ID
\r
883 static const FinalizerVTableClass gs_PP_SharpIfdefClass_FinalizerVTable = {
\r
884 offsetof( PP_SharpIfdefClass, FinalizerVTable ),
\r
885 DefaultFunction_Finalize
\r
887 static const InterfaceToVTableClass gs_PP_SharpIfdefClass_InterfaceToVTables[] = {
\r
888 { &g_FinalizerInterface_ID, &gs_PP_SharpIfdefClass_FinalizerVTable }
\r
890 const ClassID_Class g_PP_SharpIfdefClass_ID = {
\r
891 "PP_SharpIfdefClass",
\r
892 gs_PP_SharpIfdefClass_SuperClassIDs,
\r
893 _countof( gs_PP_SharpIfdefClass_SuperClassIDs ),
\r
894 sizeof( PP_SharpIfdefClass ),
\r
896 gs_PP_SharpIfdefClass_InterfaceToVTables,
\r
897 _countof( gs_PP_SharpIfdefClass_InterfaceToVTables )
\r
901 /*[g_PP_SharpIfndefClass_ID]*/
\r
902 static const ClassID_Class* gs_PP_SharpIfndefClass_SuperClassIDs[] = {
\r
903 &g_ClassID_SuperClass_ID, &g_Variant_SuperClass_ID, &g_ParsedRangeClass_ID,
\r
904 &g_PP_DirectiveClass_ID, &g_PP_SharpIfClass_ID, &g_PP_SharpIfdefClass_ID
\r
906 static const FinalizerVTableClass gs_PP_SharpIfndefClass_FinalizerVTable = {
\r
907 offsetof( PP_SharpIfndefClass, FinalizerVTable ),
\r
908 DefaultFunction_Finalize
\r
910 static const InterfaceToVTableClass gs_PP_SharpIfndefClass_InterfaceToVTables[] = {
\r
911 { &g_FinalizerInterface_ID, &gs_PP_SharpIfndefClass_FinalizerVTable }
\r
914 const ClassID_Class g_PP_SharpIfndefClass_ID = {
\r
915 "PP_SharpIfndefClass",
\r
916 gs_PP_SharpIfndefClass_SuperClassIDs,
\r
917 _countof( gs_PP_SharpIfndefClass_SuperClassIDs ),
\r
918 sizeof( PP_SharpIfndefClass ),
\r
920 gs_PP_SharpIfndefClass_InterfaceToVTables,
\r
921 _countof( gs_PP_SharpIfndefClass_InterfaceToVTables )
\r
926 /***********************************************************************
\r
927 <<< (ParsedRangeClass) >>>
\r
928 ************************************************************************/
\r
930 /*[ParsedRangeClass_initConst]*/
\r
931 void ParsedRangeClass_initConst( ParsedRangeClass* self )
\r
933 self->ClassID = &g_ParsedRangeClass_ID;
\r
934 self->FinalizerVTable = NULL;
\r
935 self->StaticAddress = NULL;
\r
936 self->Start = NULL;
\r
941 /*[g_ParsedRangeClass_ID]*/
\r
942 static const ClassID_Class* gs_ParsedRangeClass_SuperClassIDs[] = {
\r
943 &g_ClassID_SuperClass_ID, &g_Variant_SuperClass_ID, &g_ParsedRangeClass_ID
\r
945 const ClassID_Class g_ParsedRangeClass_ID = {
\r
946 "ParsedRangeClass",
\r
947 gs_ParsedRangeClass_SuperClassIDs,
\r
948 _countof( gs_ParsedRangeClass_SuperClassIDs ),
\r
949 sizeof( ParsedRangeClass ),
\r
955 /***********************************************************************
\r
956 <<< [ParsedRanges_getCut_by_PP_Directive] >>>
\r
957 ************************************************************************/
\r
958 errnum_t ParsedRanges_getCut_by_PP_Directive(
\r
959 Set2* /*<ParsedRangeClass>*/ CutRanges,
\r
960 Set2* /*<PP_DirectiveClass*>*/ DirectivePointerArray,
\r
961 const TCHAR* Symbol, bool IsCutDefine )
\r
964 PP_DirectiveClass** p;
\r
965 PP_DirectiveClass** p_over;
\r
967 for ( Set2_forEach( DirectivePointerArray, &p, &p_over, PP_DirectiveClass* ) ) {
\r
968 PP_DirectiveClass* directive = *p;
\r
970 if ( ClassID_Class_isSuperClass( directive->ClassID, &g_PP_SharpIfdefClass_ID ) ) {
\r
971 PP_SharpIfdefClass* sh_ifdef = (PP_SharpIfdefClass*) directive; /* sh = sharp */
\r
972 PP_SharpElseClass* sh_else; /* sh = sharp */
\r
973 PP_SharpEndifClass* sh_endif; /* sh = sharp */
\r
975 if ( StrT_cmp_part( sh_ifdef->Symbol_Start, sh_ifdef->Symbol_Over, Symbol ) == 0 ) {
\r
976 ParsedRangeClass* cut;
\r
977 bool is_ifndef = ( sh_ifdef->ClassID == &g_PP_SharpIfndefClass_ID );
\r
980 /* Set "sh_else", "sh_endif" */
\r
981 if ( ClassID_Class_isSuperClass( sh_ifdef->NextDirective->ClassID,
\r
982 &g_PP_SharpElseClass_ID ) ) {
\r
983 sh_else = (PP_SharpElseClass*) sh_ifdef->NextDirective;
\r
984 sh_endif = sh_ifdef->EndDirective;
\r
987 sh_endif = (PP_SharpEndifClass*) sh_ifdef->NextDirective;
\r
991 /* Add to "CutRanges" */
\r
992 e= Set2_alloc( CutRanges, &cut, ParsedRangeClass ); IF(e){goto fin;}
\r
993 cut->Start = sh_ifdef->Start;
\r
994 if ( is_ifndef == ! IsCutDefine ) {
\r
995 if ( sh_else != NULL ) {
\r
996 cut->Over = sh_else->Over;
\r
998 e= Set2_alloc( CutRanges, &cut, ParsedRangeClass );
\r
1000 cut->Start = sh_endif->Start;
\r
1002 cut->Over = sh_endif->Over;
\r
1005 cut->Over = sh_ifdef->Over;
\r
1007 e= Set2_alloc( CutRanges, &cut, ParsedRangeClass );
\r
1009 if ( sh_else != NULL ) {
\r
1010 cut->Start = sh_else->Start;
\r
1012 cut->Start = sh_endif->Start;
\r
1014 cut->Over = sh_endif->Over;
\r
1027 /***********************************************************************
\r
1028 <<< [ParsedRangeClass_onInitializedForDebug] >>>
\r
1029 ************************************************************************/
\r
1030 #if ! defined( NDEBUG )
\r
1031 void ParsedRangeClass_onInitializedForDebug( ParsedRangeClass* self )
\r
1033 /* These code can be modified for Debug. */
\r
1034 #if 0 // IS_USED_DEBUG_CHECK_CLASS
\r
1036 ptrdiff_t break_diff = 0x1FA6A;
\r
1039 text = GET_D( 1, TCHAR* );
\r
1040 PointerType_plus( &text, break_diff );
\r
1041 if ( text == self->Start ) {
\r
1042 if ( self->ClassID == &g_ParsedRangeClass_ID ) {
\r
1048 UNREFERENCED_VARIABLE( self );
\r
1055 /***********************************************************************
\r
1056 <<< [ParsedRanges_compareByStart] >>>
\r
1057 ************************************************************************/
\r
1058 int ParsedRanges_compareByStart( const void* _a1, const void* _a2 )
\r
1060 ParsedRangeClass* a1 = (ParsedRangeClass*) _a1;
\r
1061 ParsedRangeClass* a2 = (ParsedRangeClass*) _a2;
\r
1063 return a1->Start - a2->Start;
\r
1068 /***********************************************************************
\r
1069 <<< [ParsedRanges_write_by_Cut] >>>
\r
1070 ************************************************************************/
\r
1071 errnum_t ParsedRanges_write_by_Cut(
\r
1072 Set2* /*<ParsedRangeClass>*/ CutRanges,
\r
1073 const TCHAR* Text, FILE* OutFile )
\r
1076 const TCHAR* position;
\r
1077 ParsedRangeClass* p;
\r
1078 ParsedRangeClass* p_over;
\r
1080 qsort( CutRanges->First, Set2_getCount( CutRanges, ParsedRangeClass ),
\r
1081 sizeof(ParsedRangeClass), ParsedRanges_compareByStart );
\r
1084 for ( Set2_forEach( CutRanges, &p, &p_over, ParsedRangeClass ) ) {
\r
1085 const TCHAR* cut_start_position;
\r
1086 const TCHAR* cut_over_position;
\r
1088 cut_start_position = p->Start;
\r
1089 if ( position < cut_start_position ) {
\r
1090 e= FileT_writePart( OutFile, (TCHAR*)position, (TCHAR*)cut_start_position );
\r
1094 cut_over_position = p->Over;
\r
1095 if ( position < cut_over_position ) {
\r
1096 position = cut_over_position;
\r
1099 _fputts( position, OutFile ); IF(ferror(OutFile)){e=E_ERRNO; goto fin;}
\r
1108 /*=================================================================*/
\r
1109 /* <<< [Locale/Locale.c] >>> */
\r
1110 /*=================================================================*/
\r
1112 /***********************************************************************
\r
1113 <<< [g_LocaleSymbol] >>>
\r
1114 ************************************************************************/
\r
1115 char* g_LocaleSymbol = "";
\r
1119 /***********************************************************************
\r
1120 <<< [Locale_init] >>>
\r
1121 ************************************************************************/
\r
1124 g_LocaleSymbol = ".OCP";
\r
1125 setlocale( LC_ALL, ".OCP" );
\r
1131 /***********************************************************************
\r
1132 <<< [Locale_isInited] >>>
\r
1133 ************************************************************************/
\r
1134 int Locale_isInited()
\r
1136 return ( g_LocaleSymbol[0] != '\0' );
\r
1137 //
\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
1142 /*=================================================================*/
\r
1143 /* <<< [FileT/FileT.c] >>> */
\r
1144 /*=================================================================*/
\r
1146 /***********************************************************************
\r
1147 <<< [FileT_isExist] >>>
\r
1148 ************************************************************************/
\r
1149 bool FileT_isExist( const TCHAR* path )
\r
1151 #if ! FileT_isExistWildcard
\r
1155 if ( path[0] == _T('\0') ) return false;
\r
1156 r = GetFileAttributes( path );
\r
1157 return r != (DWORD)-1;
\r
1162 WIN32_FIND_DATA data;
\r
1164 find = FindFirstFileEx( path, FindExInfoStandard, &data,
\r
1165 FindExSearchNameMatch, NULL, 0 );
\r
1167 if ( find == INVALID_HANDLE_VALUE ) {
\r
1171 FindClose( find );
\r
1180 /***********************************************************************
\r
1181 <<< [FileT_isFile] >>>
\r
1182 ************************************************************************/
\r
1183 bool FileT_isFile( const TCHAR* path )
\r
1185 DWORD r = GetFileAttributes( path );
\r
1186 return ( r & (FILE_ATTRIBUTE_DIRECTORY | 0x80000000) ) == 0;
\r
1187 // 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
1192 /***********************************************************************
\r
1193 <<< [FileT_isDir] >>>
\r
1194 ************************************************************************/
\r
1195 bool FileT_isDir( const TCHAR* path )
\r
1197 DWORD r = GetFileAttributes( path );
\r
1198 return ( r & (FILE_ATTRIBUTE_DIRECTORY | 0x80000000) ) == FILE_ATTRIBUTE_DIRECTORY;
\r
1199 // 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
1204 /***********************************************************************
\r
1205 <<< [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
1206 ************************************************************************/
\r
1208 /*--- inherit from FileT_CallByNestFindData */
\r
1209 void* CallerArgument;
\r
1210 TCHAR* FullPath; // abstruct path
\r
1213 DWORD FileAttributes;
\r
1217 FuncType CallbackFromNestFind;
\r
1218 TCHAR FullPathMem[4096];
\r
1219 } FileT_CallByNestFindDataIn;
\r
1221 int FileT_callByNestFind_sub( FileT_CallByNestFindDataIn* m );
\r
1224 int FileT_callByNestFind( const TCHAR* Path, BitField Flags, void* Argument, FuncType Callback )
\r
1227 FileT_CallByNestFindDataIn data;
\r
1232 e= StrT_cpy( data.FullPathMem, sizeof(data.FullPathMem), Path ); IF(e)goto fin;
\r
1235 /* FullPathMem
\82Ì
\8dÅ
\8cã
\82É \
\82ª
\96³
\82¢
\82È
\82ç
\92Ç
\89Á
\82·
\82é */
\r
1236 p = _tcschr( data.FullPathMem, _T('\0') );
\r
1238 if ( *p != _T('\\') ) {
\r
1240 IF( p >= data.FullPathMem + (sizeof(data.FullPathMem) / sizeof(TCHAR)) - 1 )goto err_fa;
\r
1245 /* data
\82ð
\8f\89\8aú
\89»
\82·
\82é */
\r
1246 data.CallerArgument = Argument;
\r
1247 data.FullPath = data.FullPathMem;
\r
1248 data.StepPath = p + 1;
\r
1249 data.FileName = p + 1;
\r
1250 data.Flags = Flags;
\r
1251 data.CallbackFromNestFind = Callback;
\r
1254 /*
\8dÄ
\8bN
\8cÄ
\82Ñ
\8fo
\82µ
\8aÖ
\90\94\82Ö */
\r
1255 e= FileT_callByNestFind_sub( &data ); IF(e)goto fin;
\r
1260 err_fa: e= E_FEW_ARRAY; goto fin;
\r
1264 int FileT_callByNestFind_sub( FileT_CallByNestFindDataIn* m )
\r
1268 WIN32_FIND_DATA data;
\r
1273 /* 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
1274 if ( m->Flags & FileT_FolderBeforeFiles ) {
\r
1275 *( m->FileName - 1 ) = _T('\0'); // m->FullPath
\82Ì
\8dÅ
\8cã
\82Ì \
\82ð
\88ê
\8e\9e\93I
\82É
\83J
\83b
\83g
\r
1276 *( m->FileName ) = _T('\0'); // m->FileName, m->StepPath
\82ð ""
\82É
\82·
\82é
\r
1277 m->FileAttributes = FILE_ATTRIBUTE_DIRECTORY;
\r
1279 if ( m->StepPath[0] == _T('\0') ) {
\r
1280 TCHAR* step_path = m->StepPath;
\r
1281 TCHAR* fname = m->FileName;
\r
1283 m->StepPath = _T(".");
\r
1284 m->FileName = StrT_refFName( m->FullPath );
\r
1285 e= m->CallbackFromNestFind( m ); IF(e)goto fin;
\r
1286 m->StepPath = step_path;
\r
1287 m->FileName = fname;
\r
1289 else if ( m->FileName[0] == _T('\0') ) {
\r
1290 TCHAR* fname = m->FileName;
\r
1292 m->FileName = StrT_refFName( m->FullPath );
\r
1293 e= m->CallbackFromNestFind( m ); IF(e)goto fin;
\r
1294 m->FileName = fname;
\r
1297 e= m->CallbackFromNestFind( m ); IF(e)goto fin;
\r
1299 *( m->FileName - 1 ) = _T('\\');
\r
1303 /* *
\82ð
\92Ç
\89Á */
\r
1305 IF( p >= m->FullPathMem + (sizeof(m->FullPathMem) / sizeof(TCHAR)) - 2 )goto err_fa;
\r
1306 *p = _T('*'); *(p+1) = _T('\0');
\r
1309 /*
\83t
\83@
\83C
\83\8b\82©
\83t
\83H
\83\8b\83_
\82ð
\97ñ
\8b\93\82µ
\82Ü
\82· */
\r
1310 find = FindFirstFileEx( m->FullPathMem, FindExInfoStandard, &data,
\r
1311 FindExSearchNameMatch, NULL, 0 );
\r
1312 done = ( find == INVALID_HANDLE_VALUE );
\r
1316 if ( _tcscmp( data.cFileName, _T(".") ) == 0 ||
\r
1317 _tcscmp( data.cFileName, _T("..") ) == 0 ) {
\r
1318 done = ! FindNextFile( find, &data );
\r
1322 StrT_cpy( m->FileName,
\r
1323 sizeof(m->FullPathMem) - ( (char*)m->FileName - (char*)m->FullPathMem ),
\r
1325 m->FileAttributes = data.dwFileAttributes;
\r
1327 if ( data.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY ) {
\r
1328 TCHAR* prev_fname = m->FileName;
\r
1330 p = _tcschr( m->FileName, _T('\0') );
\r
1332 IF( p >= m->FullPathMem + (sizeof(m->FullPathMem) / sizeof(TCHAR)) - 2 )goto err_fa;
\r
1333 *p = _T('\\'); *(p+1) = _T('\0');
\r
1334 m->FileName = p + 1;
\r
1336 e= FileT_callByNestFind_sub( m ); IF(e)goto fin; /*
\8dÄ
\8bN
\8cÄ
\82Ñ
\8fo
\82µ */
\r
1338 m->FileName = prev_fname;
\r
1341 e= m->CallbackFromNestFind( m ); IF(e)goto fin;
\r
1344 done = ! FindNextFile( find, &data );
\r
1346 FindClose( find );
\r
1349 /* 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
1350 if ( m->Flags & FileT_FolderAfterFiles ) {
\r
1351 TCHAR* step_path = m->StepPath;
\r
1352 TCHAR* fname = m->FileName;
\r
1354 *( m->FileName - 1 ) = _T('\0');
\r
1355 m->FileAttributes = FILE_ATTRIBUTE_DIRECTORY;
\r
1356 if ( ( *( m->StepPath - 1 ) == _T('\0') ) && ( m->StepPath > m->FullPath ) ) {
\r
1357 m->StepPath = _T(".");
\r
1359 m->FileName = StrT_refFName( m->FullPath );
\r
1361 e= m->CallbackFromNestFind( m ); IF(e)goto fin;
\r
1363 m->StepPath = step_path;
\r
1364 m->FileName = fname;
\r
1370 err_fa: e= E_FEW_ARRAY; goto fin;
\r
1375 /***********************************************************************
\r
1376 <<< [FileT_openForRead] >>>
\r
1377 ************************************************************************/
\r
1378 int FileT_openForRead( FILE** out_pFile, const TCHAR* Path )
\r
1382 assert( Locale_isInited() );
\r
1384 #if DEBUGTOOLS_USES
\r
1385 { int e= Debug_onOpen( Path ); if(e) return e; }
\r
1388 en = _tfopen_s( out_pFile, Path, _T("r")_T(fopen_ccs) );
\r
1389 if ( en == ENOENT ) {
\r
1394 if ( _tgetcwd( cwd, _countof(cwd) ) == NULL ) {
\r
1395 cwd[0] = _T('\0');
\r
1397 Error4_printf( _T("<ERROR msg=\"Not found\" path=\"%s\" current=\"%s\"/>"),
\r
1401 Error4_printf( _T("<ERROR msg=\"Not found\" path=\"%s\"/>"), Path );
\r
1404 return E_PATH_NOT_FOUND;
\r
1406 if ( en == EACCES ) {
\r
1407 Error4_printf( _T("access denied \"%s\"\n"), Path );
\r
1408 return E_ACCESS_DENIED;
\r
1410 IF(en)return E_OTHERS;
\r
1417 /***********************************************************************
\r
1418 <<< [FileT_openForWrite] >>>
\r
1419 ************************************************************************/
\r
1420 int FileT_openForWrite( FILE** out_pFile, const TCHAR* Path, int Flags )
\r
1428 IF_D( ! Locale_isInited() ) return E_NOT_INIT_GLOBAL;
\r
1431 e= AppKey_addNewWritableFolder( Path ); IF(e)goto fin;
\r
1434 if ( Flags & F_Append )
\r
1435 open_type = ( Flags & F_Unicode ? _T("a")_T(fopen_ccs) : _T("at") );
\r
1437 open_type = ( Flags & F_Unicode ? _T("w")_T(fopen_ccs) : _T("wt") );
\r
1439 #if DEBUGTOOLS_USES
\r
1440 { int e= Debug_onOpen( Path ); if(e) return e; }
\r
1443 for ( retry_count = 0; ; retry_count ++ ) {
\r
1444 en = _tfopen_s( out_pFile, Path, open_type );
\r
1445 if ( en != EACCES ) break;
\r
1448 if ( retry_count == 15 ) break;
\r
1451 if ( en == 2 ) { // ENOENT
\r
1452 e= FileT_mkdir( Path ); IF(e)goto fin;
\r
1453 b= RemoveDirectory( Path ); IF(!b)goto err_gt;
\r
1454 en = _tfopen_s( out_pFile, Path, open_type );
\r
1457 _tprintf( _T("cannot open \"%s\"\n"), Path );
\r
1463 if ( _tgetcwd( cwd, _countof(cwd) ) != NULL )
\r
1464 _tprintf( _T("current = \"%s\"\n"), cwd );
\r
1468 e = E_NOT_FOUND_SYMBOL;
\r
1478 err: e = E_OTHERS; goto fin;
\r
1479 err_gt: e = SaveWindowsLastError(); goto fin;
\r
1484 /***********************************************************************
\r
1485 <<< [FileT_close] >>>
\r
1486 ************************************************************************/
\r
1487 int FileT_close( FILE* File, int e )
\r
1489 if ( File != NULL ) {
\r
1490 int r = fclose( File );
\r
1491 IF(r&&!e)e=E_ERRNO;
\r
1499 /***********************************************************************
\r
1500 <<< [FileT_closeAndNULL] >>>
\r
1501 ************************************************************************/
\r
1502 errnum_t FileT_closeAndNULL( FILE** in_out_File, errnum_t e )
\r
1504 FILE* file = *in_out_File;
\r
1506 if ( file != NULL ) {
\r
1507 int r = fclose( file );
\r
1508 IF ( r && e == 0 ) { e = E_ERRNO; }
\r
1509 *in_out_File = NULL;
\r
1518 /***********************************************************************
\r
1519 <<< [FileT_readAll] >>>
\r
1520 ************************************************************************/
\r
1521 #ifdef IsTest_FileT_readAll
\r
1522 #define _CV(x) CoverageLogClass_output( x, _T("FileT_readAll") )
\r
1527 errnum_t FileT_readAll( FILE* File, TCHAR** out_Text, size_t* out_TextLength )
\r
1529 #ifdef IsTest_FileT_readAll
\r
1530 enum { text_max_size_first = 0x10 };
\r
1532 enum { text_max_size_first = 0xFF00 };
\r
1535 TCHAR* text = NULL;
\r
1536 TCHAR* text_over = (TCHAR*) DUMMY_INITIAL_VALUE;
\r
1537 size_t text_max_size = text_max_size_first;
\r
1538 TCHAR* text_max_over;
\r
1541 text = (TCHAR*) malloc( text_max_size ); IF( text == NULL ) { e=E_FEW_MEMORY; goto fin; }
\r
1543 text_max_over = (TCHAR*)( (uint8_t*) text + text_max_size );
\r
1545 text[0] = _T('\0'); /* for empty file */
\r
1548 _fgetts( text_over, text_max_over - text_over, File );
\r
1550 if ( *text_over == _T('\0') ) { /* End of file. If space line, *text_over == _T('\n'). */
\r
1552 ASSERT_R( feof( File ), e=E_OTHERS; goto fin );
\r
1555 text_over = _tcschr( text_over, _T('\0') );
\r
1556 if ( feof( File ) ) { break; }
\r
1558 if ( (uint8_t*) text_over - (uint8_t*) text == (int)( text_max_size - sizeof(TCHAR) ) ) {
\r
1559 /* if full in text */
\r
1561 size_t old_text_max_size = text_max_size;
\r
1563 #ifdef IsTest_FileT_readAll
\r
1564 EmptyHeapMemoryEmulation( _T("T_FileT_readAll_FewMemory"), 1 );
\r
1567 text_max_size *= 4;
\r
1568 new_text = (TCHAR*) realloc( text, text_max_size );
\r
1569 IF( new_text == NULL ) { e=E_FEW_MEMORY; _CV(2); goto fin; }
\r
1571 text_over = (TCHAR*)( (uint8_t*) new_text + old_text_max_size - sizeof(TCHAR) );
\r
1572 text_max_over = (TCHAR*)( (uint8_t*) text + text_max_size );
\r
1582 if ( text != NULL ) { _CV(4); free( text ); }
\r
1586 if ( out_TextLength != NULL ) { *out_TextLength = text_over - text; }
\r
1594 /***********************************************************************
\r
1595 <<< [FileT_writePart] >>>
\r
1596 ************************************************************************/
\r
1597 errnum_t FileT_writePart( FILE* File, const TCHAR* Start, TCHAR* Over )
\r
1603 back_char = *Over;
\r
1606 IF ( Start > Over ) { e=E_OTHERS; goto fin; }
\r
1608 r= _ftprintf_s( File, _T("%s"), Start ); IF(r<0){ e=E_ERRNO; goto fin; }
\r
1612 *Over = back_char;
\r
1618 /***********************************************************************
\r
1619 <<< [FileT_mkdir] >>>
\r
1620 ************************************************************************/
\r
1621 int FileT_mkdir( const TCHAR* Path )
\r
1625 TCHAR* p = (TCHAR*) DUMMY_INITIAL_VALUE;
\r
1628 TCHAR path2[MAX_PATH];
\r
1631 e= StrT_getFullPath( path2, sizeof(path2), Path, NULL ); IF(e)goto fin;
\r
1633 e= AppKey_addNewWritableFolder( path2 ); IF(e)goto fin;
\r
1637 //===
\91¶
\8dÝ
\82·
\82é
\83t
\83H
\83\8b\83_
\82ð
\92T
\82·
\r
1639 r = GetFileAttributes( path2 );
\r
1640 if ( r != (DWORD)-1 ) break; // "C:"
\82à
\83t
\83H
\83\8b\83_
\82Æ
\94»
\92è
\82³
\82ê
\82é
\r
1642 p = StrT_refFName( path2 ) - 1; //
\90â
\91Î
\83p
\83X
\82È
\82Ì
\82Å
\95K
\82¸ *p=='\\'
\r
1646 IF ( ! (r & FILE_ATTRIBUTE_DIRECTORY) ) goto err; //
\83t
\83@
\83C
\83\8b\82È
\82ç
\83G
\83\89\81[
\r
1649 //===
\83t
\83H
\83\8b\83_
\82ð
\8dì
\90¬
\82·
\82é
\r
1650 for ( ; n_folder > 0; n_folder -- ) {
\r
1652 b= CreateDirectory( path2, NULL ); IF(!b)goto err;
\r
1653 p = _tcschr( p, _T('\0') );
\r
1660 err: e = E_OTHERS; goto fin;
\r
1666 /***********************************************************************
\r
1667 <<< [FileT_copy] >>>
\r
1668 ************************************************************************/
\r
1669 int FileT_copy_sub( FileT_CallByNestFindData* m );
\r
1671 int FileT_copy( const TCHAR* SrcPath, const TCHAR* DstPath )
\r
1673 const TCHAR* p_last;
\r
1676 TCHAR path[MAX_PATH*4];
\r
1680 e= AppKey_addNewWritableFolder( DstPath ); IF(e)goto fin;
\r
1683 p_last = _tcschr( SrcPath, _T('\0') );
\r
1684 IF_D( p_last <= SrcPath + 1 )goto err_ni;
\r
1687 //===
\83t
\83H
\83\8b\83_
\82ð
\83R
\83s
\81[
\82·
\82é
\r
1688 if ( *(p_last - 1) == _T('*') ) {
\r
1689 IF_D( *(p_last - 2) != _T('\\') ) goto err_ni;
\r
1691 e= StrT_getParentFullPath( path, sizeof(path), SrcPath, NULL ); IF(e)goto fin;
\r
1692 IF_D( ! FileT_isDir( path ) )goto err_nf;
\r
1694 e= FileT_callByNestFind( path, FileT_FolderBeforeFiles, (void*) DstPath, (FuncType) FileT_copy_sub );
\r
1699 //===
\83t
\83@
\83C
\83\8b\82ð
\83R
\83s
\81[
\82·
\82é
\r
1701 IF_D( _tcschr( SrcPath, _T('*') ) != NULL )goto err_ni;
\r
1702 IF_D( ! FileT_isFile( SrcPath ) ) goto err_nf;
\r
1704 b= CopyFile( SrcPath, DstPath, FALSE );
\r
1706 if ( FileT_isDir( DstPath ) ) {
\r
1707 e= stprintf_r( path, sizeof(path), _T("%s\\%s"), DstPath, StrT_refFName( SrcPath ) ); IF(e)goto fin;
\r
1708 b= CopyFile( SrcPath, path, FALSE ); IF(!b)goto err_gt;
\r
1713 p_last = _tcschr( DstPath, _T('\0') ) - 1;
\r
1714 IF_D( p_last < DstPath )goto err;
\r
1715 if ( *p_last == _T('\\') ) {
\r
1716 ee= FileT_mkdir( DstPath ); IF(ee)goto fin;
\r
1717 e= stprintf_r( path, sizeof(path), _T("%s%s"), DstPath, StrT_refFName( SrcPath ) ); IF(e)goto fin;
\r
1718 b= CopyFile( SrcPath, path, FALSE ); IF(!b)goto err_gt;
\r
1721 e = E_ACCESS_DENIED;
\r
1722 ee= StrT_getParentFullPath( path, sizeof(path), DstPath, NULL ); IF(ee)goto fin;
\r
1723 ee= FileT_mkdir( path ); IF(ee)goto fin;
\r
1724 b= CopyFile( SrcPath, DstPath, FALSE ); IF(!b)goto err_gt;
\r
1734 err_ni: e = E_NOT_IMPLEMENT_YET; goto fin;
\r
1735 err_nf: e = E_PATH_NOT_FOUND; goto fin;
\r
1736 err_gt: e = SaveWindowsLastError(); goto fin;
\r
1737 err: e = E_OTHERS; goto fin;
\r
1741 int FileT_copy_sub( FileT_CallByNestFindData* m )
\r
1743 const TCHAR* DstPath = (const TCHAR*) m->CallerArgument;
\r
1746 TCHAR path[MAX_PATH*4];
\r
1748 e= stprintf_r( path, sizeof(path), _T("%s\\%s"), DstPath, m->StepPath ); IF(e)goto fin;
\r
1750 if ( m->FileAttributes & FILE_ATTRIBUTE_DIRECTORY ) {
\r
1751 if ( ! FileT_isDir( path ) )
\r
1752 { b= CreateDirectory( path, NULL ); IF(!b)goto err_gt; }
\r
1755 b= CopyFile( m->FullPath, path, FALSE ); IF(!b)goto err_gt;
\r
1762 err_gt: e = SaveWindowsLastError(); goto fin;
\r
1768 /***********************************************************************
\r
1769 <<< [FileT_del] >>>
\r
1770 ************************************************************************/
\r
1771 int FileT_del_sub( FileT_CallByNestFindData* m );
\r
1773 int FileT_del( const TCHAR* Path )
\r
1777 TCHAR abs_path[MAX_PATH];
\r
1779 e= StrT_getFullPath( abs_path, sizeof(abs_path), Path, NULL ); IF(e)goto fin;
\r
1781 e= AppKey_addNewWritableFolder( abs_path ); IF(e)goto fin;
\r
1784 r= GetFileAttributes( Path );
\r
1785 if ( r != (DWORD)-1 ) {
\r
1786 if ( r & FILE_ATTRIBUTE_DIRECTORY ) {
\r
1787 e= FileT_callByNestFind( Path, FileT_FolderAfterFiles, NULL, (FuncType) FileT_del_sub );
\r
1790 BOOL b= DeleteFile( Path ); IF(!b)goto err_gt;
\r
1793 IF_D( FileT_isExist( Path ) )goto err_ad;
\r
1799 err_gt: e = SaveWindowsLastError(); goto fin;
\r
1800 err_ad: e = E_ACCESS_DENIED; goto fin;
\r
1804 int FileT_del_sub( FileT_CallByNestFindData* m )
\r
1809 if ( m->FileAttributes & FILE_ATTRIBUTE_DIRECTORY ) {
\r
1810 b= RemoveDirectory( m->FullPath ); IF(!b)goto err_gt;
\r
1813 b= DeleteFile( m->FullPath ); IF(!b)goto err_gt;
\r
1820 err_gt: e = SaveWindowsLastError(); goto fin;
\r
1823 /***********************************************************************
\r
1825 ************************************************************************/
\r
1826 static errnum_t AppKey_create( AppKey** out_m );
\r
1827 static bool AppKey_isSame( AppKey* m );
\r
1828 static void Writables_initConst( Writables* m );
\r
1829 static errnum_t Writables_init( Writables* m, AppKey* Key );
\r
1830 static errnum_t Writables_finish( Writables* m, int e );
\r
1831 static bool Writables_isInited( Writables* m );
\r
1832 static errnum_t Writables_clearPaths( Writables* m );
\r
1833 static errnum_t Writables_create( Writables** out_m, AppKey* Key );
\r
1834 static errnum_t Writables_copyToConst( Writables* To, Writables* From );
\r
1837 typedef struct _CurrentWritables CurrentWritables;
\r
1838 struct _CurrentWritables {
\r
1839 Writables m_CurrentWritables;
\r
1840 TCHAR* m_ProgramFiles; size_t m_ProgramFiles_Len;
\r
1841 TCHAR* m_windir; size_t m_windir_Len;
\r
1842 TCHAR* m_APPDATA; size_t m_APPDATA_Len;
\r
1843 TCHAR* m_LOCALAPPDATA; size_t m_LOCALAPPDATA_Len;
\r
1845 static void CurrentWritables_initConst( CurrentWritables* m );
\r
1846 static errnum_t CurrentWritables_init( CurrentWritables* m );
\r
1847 static errnum_t CurrentWritables_finish( CurrentWritables* m, int e );
\r
1848 static errnum_t CurrentWritables_askFileAccess( CurrentWritables* m, const TCHAR* FullPath );
\r
1851 //////////////////////////////
\r
1853 static AppKey g_AppKey;
\r
1854 static AppKey* g_AppKeyPrivate;
\r
1857 Writables g_DefaultWritables;
\r
1858 Writables g_CurrentWritables; // public
\r
1859 static CurrentWritables g_CurrentWritablesPrivate;
\r
1862 static errnum_t AppKey_create( AppKey** out_m )
\r
1866 IF( g_AppKeyPrivate != NULL ) { e=1; goto fin; }
\r
1867 // 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
1869 Writables_initConst( &g_DefaultWritables );
\r
1870 CurrentWritables_initConst( &g_CurrentWritablesPrivate );
\r
1872 e= CurrentWritables_init( &g_CurrentWritablesPrivate ); IF(e)goto fin;
\r
1873 e= Writables_copyToConst( &g_CurrentWritables, NULL ); IF(e)goto fin;
\r
1875 *out_m = &g_AppKey;
\r
1876 g_AppKeyPrivate = &g_AppKey;
\r
1884 static bool AppKey_isSame( AppKey* m )
\r
1886 return ( m == g_AppKeyPrivate );
\r
1890 void AppKey_initGlobal_const()
\r
1892 Writables_initConst( &g_DefaultWritables );
\r
1896 errnum_t AppKey_finishGlobal( errnum_t e )
\r
1900 e= Writables_finish( &g_DefaultWritables, e );
\r
1901 e= CurrentWritables_finish( &g_CurrentWritablesPrivate, e );
\r
1902 ee= Writables_copyToConst( &g_CurrentWritables, NULL ); IF(ee&&!e)e=ee;
\r
1909 /***********************************************************************
\r
1910 <<< [AppKey_newWritable] >>>
\r
1911 ************************************************************************/
\r
1912 errnum_t AppKey_newWritable( AppKey** in_out_m, Writables** out_Writable, ... )
\r
1916 Writables* wr = NULL;
\r
1917 #if Uses_OutMallocIDTool
\r
1918 bool is_prev_out_malloc;
\r
1920 is_prev_out_malloc = OutMallocID_setEnable( false );
\r
1924 //=== AppKey* m
\82ð
\97L
\8cø
\82É
\82·
\82é
\r
1925 if ( in_out_m == NULL ) { //
\8d¡
\89ñ
\82Ì
\8aÖ
\90\94\82Ì
\92\86\82¾
\82¯
\82Å
\8eQ
\8fÆ
\82·
\82é
\r
1926 e= AppKey_create( &m ); IF(e)goto resume;
\r
1928 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
1929 e= AppKey_create( &m ); IF(e)goto resume;
\r
1932 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
1937 //===
\90³
\8bK
\82Ì AppKey
\82©
\83`
\83F
\83b
\83N
\82·
\82é
\r
1938 IF( ! AppKey_isSame( m ) )goto err;
\r
1941 //=== Writable
\82ð
\90¶
\90¬
\82·
\82é
\r
1942 if ( out_Writable == NULL ) {
\r
1943 wr = &g_DefaultWritables;
\r
1944 e= Writables_finish( wr, 0 ); IF(e)goto resume;
\r
1945 e= Writables_init( wr, m ); IF(e)goto resume;
\r
1948 e= Writables_create( &wr, m ); IF(e)goto resume;
\r
1949 *out_Writable = wr;
\r
1953 //=== Writable
\82É
\83p
\83X
\82ð
\93o
\98^
\82·
\82é
\r
1959 va_start( va, out_Writable );
\r
1960 for ( i=0; ; i++ ) {
\r
1961 path = va_arg( va, TCHAR* );
\r
1962 if ( path == NULL ) break;
\r
1963 IF( i == 5 ) goto err; //
\8dÅ
\8cã
\82Ì NULL
\96Y
\82ê
\91Î
\8dô
\r
1965 e= Writables_add( wr, m, path ); IF(e)goto resume;
\r
1969 #if defined(TempFile_get)
\r
1973 e= TempFile_get( &temp ); IF(e)goto resume;
\r
1974 e= Writables_add( wr, m, temp->TempPath ); IF(e)goto resume;
\r
1979 //===
\82·
\82®
\82É Writable
\82ð
\97L
\8cø
\82É
\82·
\82é
\r
1980 if ( out_Writable == NULL ) {
\r
1981 e= Writables_enable( wr ); IF(e)goto resume;
\r
1986 #if Uses_OutMallocIDTool
\r
1987 OutMallocID_setEnable( is_prev_out_malloc );
\r
1991 err: e = E_OTHERS; goto resume;
\r
1993 if ( wr != NULL ) {
\r
1994 if ( out_Writable == NULL )
\r
1995 e= Writables_finish( wr, e ); // g_DefaultWritables
\r
1997 e= Writables_delete( wr, e );
\r
2004 /***********************************************************************
\r
2005 <<< [AppKey_addNewWritableFolder]
\83`
\83F
\83b
\83N
\82·
\82é
\81A
\82Ü
\82½
\82Í
\92Ç
\89Á
\82·
\82é >>>
\r
2006 \81i
\92Ç
\89Á
\82Í
\96¢
\91Î
\89\9e\81j
\r
2007 ************************************************************************/
\r
2008 errnum_t AppKey_addNewWritableFolder( const TCHAR* Path )
\r
2013 Writables* wr = &g_CurrentWritablesPrivate.m_CurrentWritables;
\r
2015 TCHAR abs_path[MAX_PATH];
\r
2017 if ( g_AppKeyPrivate == NULL ) {
\r
2018 e= AppKey_newWritable( NULL, NULL, ".", NULL ); IF(e){goto fin;}
\r
2021 e= StrT_getFullPath( abs_path, sizeof(abs_path), Path, NULL ); IF(e){goto fin;}
\r
2023 pp_over = wr->m_Paths + wr->m_nPath;
\r
2024 for ( pp = wr->m_Paths; ; pp++ ) {
\r
2025 IF ( pp >= pp_over ) { e=E_OUT_OF_WRITABLE; goto fin; }
\r
2026 // Path (abs_path)
\82Í
\81AAppKey_newWritable
\82Å
\8b\96\89Â
\82³
\82ê
\82Ä
\82¢
\82Ü
\82¹
\82ñ
\81B
\r
2027 //
\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
2028 //
\8b\96\89Â
\82³
\82ê
\82Ä
\82¢
\82é
\83p
\83X
\82ð
\8am
\94F
\82µ
\82Ä
\82
\82¾
\82³
\82¢
\81B
\r
2030 path_len = _tcslen( *pp );
\r
2031 if ( _tcsnicmp( *pp, abs_path, path_len ) == 0 &&
\r
2032 ( abs_path[ path_len ] == _T('\\') || abs_path[ path_len ] == _T('\0') ) ) break;
\r
2042 /***********************************************************************
\r
2043 <<< [AppKey_checkWritable] >>>
\r
2044 ************************************************************************/
\r
2045 errnum_t AppKey_checkWritable( const TCHAR* Path )
\r
2047 return AppKey_addNewWritableFolder( Path );
\r
2052 /***********************************************************************
\r
2053 <<< [Writables_init] >>>
\r
2054 ************************************************************************/
\r
2055 static void Writables_initConst( Writables* m )
\r
2057 m->m_Paths = NULL;
\r
2062 static errnum_t Writables_init( Writables* m, AppKey* Key )
\r
2064 IF( ! AppKey_isSame( Key ) ) return E_OTHERS;
\r
2066 m->m_Paths = NULL;
\r
2072 static errnum_t Writables_finish( Writables* m, int e )
\r
2076 ee= Writables_clearPaths( m ); IF(ee&&!e) e=ee;
\r
2082 static bool Writables_isInited( Writables* m )
\r
2084 return ( m->m_nPath != -1 );
\r
2088 static errnum_t Writables_clearPaths( Writables* m )
\r
2093 if ( m->m_Paths != NULL ) {
\r
2094 p_over = m->m_Paths + m->m_nPath;
\r
2095 for ( p = m->m_Paths; p < p_over; p++ ) {
\r
2098 free( m->m_Paths ); m->m_Paths = NULL;
\r
2105 static errnum_t Writables_create( Writables** out_m, AppKey* Key )
\r
2110 m = (Writables*) malloc( sizeof(*m) ); IF(m==NULL)return E_FEW_MEMORY;
\r
2111 Writables_initConst( m );
\r
2112 e= Writables_init( m, Key ); IF(e)goto resume;
\r
2115 resume: Writables_delete( m, 0 ); free(m); return e;
\r
2119 errnum_t Writables_delete( Writables* m, errnum_t e )
\r
2121 if ( m == NULL ) goto fin;
\r
2122 e= Writables_finish( m, e );
\r
2130 /***********************************************************************
\r
2131 <<< [Writables_add] >>>
\r
2132 ************************************************************************/
\r
2133 int Writables_add( Writables* m, AppKey* Key, TCHAR* Path )
\r
2139 TCHAR abs_path[MAX_PATH];
\r
2141 IF( ! AppKey_isSame( Key ) )goto err;
\r
2142 if ( Path[0] == _T('\0') ) return 0;
\r
2144 e= StrT_getFullPath( abs_path, sizeof(abs_path), Path, NULL ); IF(e)goto resume;
\r
2146 e= CurrentWritables_askFileAccess( &g_CurrentWritablesPrivate, abs_path ); IF(e)goto resume;
\r
2148 pp = (TCHAR**) realloc( m->m_Paths, (m->m_nPath + 1) * sizeof(TCHAR*) );
\r
2149 IF( pp == NULL ) goto err;
\r
2152 path_size = (_tcslen( abs_path ) + 1) * sizeof(TCHAR);
\r
2153 p = (TCHAR*) malloc( path_size );
\r
2154 m->m_Paths[ m->m_nPath ] = p;
\r
2155 IF( p == NULL )goto err;
\r
2157 memcpy( p, abs_path, path_size );
\r
2158 if ( p[ path_size/sizeof(TCHAR) - 2 ] == _T('\\') )
\r
2159 p[ path_size/sizeof(TCHAR) - 2 ] = _T('\0');
\r
2166 err: e = E_OTHERS; goto resume;
\r
2168 if ( p != NULL ) free( p );
\r
2173 int Writables_remove( Writables* m, TCHAR* Path )
\r
2178 pp_over = m->m_Paths + m->m_nPath;
\r
2179 for ( pp = m->m_Paths; ; pp++ ) {
\r
2180 if ( pp >= pp_over ) return 0;
\r
2181 if ( _tcscmp( *pp, Path ) == 0 ) break;
\r
2184 memmove( pp, pp+1, (char*)pp - (char*)pp_over - sizeof(TCHAR) );
\r
2188 *( pp_over - 1 ) = NULL;
\r
2196 /***********************************************************************
\r
2197 <<< [Writables_enable] >>>
\r
2198 ************************************************************************/
\r
2199 int Writables_enable( Writables* m )
\r
2203 e= Writables_copyToConst( &g_CurrentWritablesPrivate.m_CurrentWritables, m ); IF(e)goto fin;
\r
2204 e= Writables_copyToConst( &g_CurrentWritables, &g_CurrentWritablesPrivate.m_CurrentWritables ); IF(e)goto fin;
\r
2212 int Writables_disable( Writables* m, int e )
\r
2216 UNREFERENCED_VARIABLE( m );
\r
2218 ee= Writables_copyToConst( &g_CurrentWritablesPrivate.m_CurrentWritables, NULL ); IF(ee&&!e)goto fin;
\r
2219 ee= Writables_copyToConst( &g_CurrentWritables, NULL ); IF(ee&&!e)goto fin;
\r
2227 static int Writables_copyToConst( Writables* To, Writables* From )
\r
2236 if ( To->m_Paths != NULL ) {
\r
2237 free( To->m_Paths );
\r
2238 To->m_Paths = NULL;
\r
2242 if ( From != NULL && From->m_nPath > 0 ) {
\r
2245 pp_over = From->m_Paths + From->m_nPath;
\r
2246 for ( pp = From->m_Paths; pp < pp_over; pp++ ) {
\r
2247 path_size += _tcslen( *pp ) + 1;
\r
2250 path_size = From->m_nPath * sizeof(TCHAR*) + path_size * sizeof(TCHAR);
\r
2251 To->m_Paths = (TCHAR**) malloc( path_size );
\r
2252 IF( To->m_Paths == NULL ) goto err;
\r
2254 p2 = (TCHAR*)( (char*)To->m_Paths + From->m_nPath * sizeof(TCHAR*) );
\r
2255 pp2 = To->m_Paths;
\r
2256 for ( pp = From->m_Paths; pp < pp_over; pp++ ) {
\r
2258 path_size = (_tcslen( *pp ) + 1) * sizeof(TCHAR);
\r
2259 memcpy( p2, *pp, path_size );
\r
2260 p2 = (TCHAR*)( (char*)p2 + path_size );
\r
2263 To->m_nPath = From->m_nPath;
\r
2270 err: e = E_OTHERS; goto fin;
\r
2274 /***********************************************************************
\r
2275 <<< [CurrentWritables] >>>
\r
2276 ************************************************************************/
\r
2277 static void CurrentWritables_initConst( CurrentWritables* m )
\r
2279 Writables_initConst( &m->m_CurrentWritables );
\r
2280 m->m_ProgramFiles = NULL;
\r
2281 m->m_windir = NULL;
\r
2282 m->m_APPDATA = NULL;
\r
2283 m->m_LOCALAPPDATA = NULL;
\r
2287 static int CurrentWritables_init( CurrentWritables* m )
\r
2290 #if Uses_OutMallocIDTool
\r
2291 bool is_prev_out_malloc;
\r
2293 is_prev_out_malloc = OutMallocID_setEnable( false );
\r
2296 e= Writables_copyToConst( &m->m_CurrentWritables, NULL ); IF(e)goto fin;
\r
2298 e= env_malloc( &m->m_ProgramFiles, &m->m_ProgramFiles_Len, _T("ProgramFiles") ); IF(e)goto fin;
\r
2299 e= env_malloc( &m->m_windir, &m->m_windir_Len, _T("windir") ); IF(e)goto fin;
\r
2300 e= env_malloc( &m->m_APPDATA, &m->m_APPDATA_Len, _T("APPDATA") ); IF(e)goto fin;
\r
2301 // e= env_malloc( &m->m_LOCALAPPDATA, &m->m_LOCALAPPDATA_Len, _T("LOCALAPPDATA") ); IF(e)goto fin;
\r
2305 #if Uses_OutMallocIDTool
\r
2306 OutMallocID_setEnable( is_prev_out_malloc );
\r
2312 static int CurrentWritables_finish( CurrentWritables* m, int e )
\r
2316 ee= Writables_copyToConst( &m->m_CurrentWritables, NULL ); IF(ee&&!e)e=ee;
\r
2318 if ( m->m_ProgramFiles != NULL ) free( m->m_ProgramFiles );
\r
2319 if ( m->m_windir != NULL ) free( m->m_windir );
\r
2320 if ( m->m_APPDATA != NULL ) free( m->m_APPDATA );
\r
2321 if ( m->m_LOCALAPPDATA != NULL ) free( m->m_LOCALAPPDATA );
\r
2323 m->m_ProgramFiles = NULL;
\r
2324 m->m_windir = NULL;
\r
2325 m->m_APPDATA = NULL;
\r
2326 m->m_LOCALAPPDATA = NULL;
\r
2332 static int CurrentWritables_askFileAccess_sub(
\r
2333 const TCHAR* SystemPath, size_t SystemPath_Len, const TCHAR* FullPath, size_t FullPath_Len );
\r
2335 static int CurrentWritables_askFileAccess( CurrentWritables* m, const TCHAR* FullPath )
\r
2340 abs_len = _tcslen( FullPath );
\r
2341 e= CurrentWritables_askFileAccess_sub( m->m_ProgramFiles, m->m_ProgramFiles_Len, FullPath, abs_len ); IF(e)goto fin;
\r
2342 e= CurrentWritables_askFileAccess_sub( m->m_windir, m->m_windir_Len, FullPath, abs_len ); IF(e)goto fin;
\r
2343 e= CurrentWritables_askFileAccess_sub( m->m_APPDATA, m->m_APPDATA_Len, FullPath, abs_len ); IF(e)goto fin;
\r
2344 e= CurrentWritables_askFileAccess_sub( m->m_LOCALAPPDATA, m->m_LOCALAPPDATA_Len, FullPath, abs_len ); IF(e)goto fin;
\r
2352 static int CurrentWritables_askFileAccess_sub(
\r
2353 const TCHAR* SystemPath, size_t SystemPath_Len, const TCHAR* FullPath, size_t FullPath_Len )
\r
2355 if ( SystemPath == NULL ) return 0;
\r
2357 IF ( _tcsncmp( SystemPath, FullPath, SystemPath_Len ) == 0 )
\r
2358 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
2360 IF ( _tcsncmp( SystemPath, FullPath, FullPath_Len ) == 0 )
\r
2361 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
2368 /*=================================================================*/
\r
2369 /* <<< [Error4/Error4.c] >>> */
\r
2370 /*=================================================================*/
\r
2372 /***********************************************************************
\r
2373 <<< [Get_Error4_Variables] >>>
\r
2374 ************************************************************************/
\r
2375 static Error4_VariablesClass gs;
\r
2377 extern Error4_VariablesClass* g_Error4_Variables = &gs;
\r
2380 Error4_VariablesClass* Get_Error4_Variables()
\r
2387 /***********************************************************************
\r
2388 <<< (SetBreakErrorID) >>>
\r
2389 ************************************************************************/
\r
2392 void DebugBreakR()
\r
2394 printf( "
\83u
\83\8c\81[
\83N
\82µ
\82Ü
\82·
\81B
\82à
\82µ
\83f
\83o
\83b
\83K
\81[
\82ª
\90Ú
\91±
\82³
\82ê
\82Ä
\82¢
\82È
\82¯
\82ê
\82Î
\8b
\90§
\8fI
\97¹
\82µ
\82Ü
\82·
\81B\n" );
\r
2396 // Visual Studio 2008
\82Å
\82Í
\81A
\82±
\82±
\82Å [
\83f
\83o
\83b
\83O >
\83X
\83e
\83b
\83v
\83A
\83E
\83g ]
\82µ
\82È
\82¢
\82Æ
\r
2397 //
\8cÄ
\82Ñ
\8fo
\82µ
\97\9a\97ð
\82â
\83E
\83H
\83b
\83`
\82Ì
\93à
\97e
\82ª
\90³
\82µ
\82
\82È
\82è
\82Ü
\82¹
\82ñ
\81B
\r
2401 #if ENABLE_ERROR_BREAK_IN_ERROR_CLASS
\r
2404 #if ! IS_MULTI_THREAD_ERROR_CLASS
\r
2405 dll_global_g_DebugBreakCount ErrorClass g_Error; /*
\8f\89\8aú
\92l
\82Í
\82·
\82×
\82Ä
\83[
\83\8d */
\r
2407 dll_global_g_DebugBreakCount GlobalErrorClass g_GlobalError;
\r
2409 static errnum_t ErrorClass_initializeIfNot_Sub( ErrorClass** out_Error );
\r
2410 static errnum_t ErrorClass_initializeIfNot_Sub2(void);
\r
2414 #define IF_ if /* Error check for in "IF" macro */
\r
2417 /*[SetBreakErrorID]*/
\r
2418 void SetBreakErrorID( int ErrorID )
\r
2420 #if ! IS_MULTI_THREAD_ERROR_CLASS
\r
2422 ErrorClass* err = &g_Error;
\r
2425 is_print = ( err->BreakErrorID != ErrorID );
\r
2427 err->BreakErrorID = ErrorID;
\r
2428 /* printf
\82Ì
\92\86\82Å
\94
\90¶
\82·
\82é
\83G
\83\89\81[
\82Å
\8e~
\82ß
\82é
\82½
\82ß */
\r
2431 { printf( ">SetBreakErrorID( %d );\n", ErrorID ); }
\r
2435 GlobalErrorClass* err_global = &g_GlobalError;
\r
2437 if ( err_global->BreakGlobalErrorID != ErrorID )
\r
2438 { printf( ">SetBreakErrorID( %d );\n", ErrorID ); }
\r
2439 err_global->BreakGlobalErrorID = ErrorID;
\r
2446 bool OnRaisingError_Sub( const char* FilePath, int LineNum )
\r
2447 //
\96{
\8aÖ
\90\94\82Í
\81AIF
\83}
\83N
\83\8d\82Ì
\92\86\82©
\82ç
\8cÄ
\82Î
\82ê
\82Ü
\82·
\r
2448 //
\95Ô
\82è
\92l
\82Í
\81A
\83u
\83\8c\81[
\83N
\82·
\82é
\82©
\82Ç
\82¤
\82©
\r
2450 #if ! IS_MULTI_THREAD_ERROR_CLASS
\r
2452 ErrorClass* err = &g_Error;
\r
2455 /*
\83G
\83\89\81[
\8e\9e\82Ì
\92\86\92f
\8f\88\97\9d\81i
\83W
\83\83\83\93\83v
\81j
\82ð
\82µ
\82Ä
\82¢
\82é
\82Æ
\82«
\81i
\8d\82\91¬
\83\8a\83^
\81[
\83\93\81j */
\r
2456 if ( err->IsError ) {
\r
2460 /*
\83G
\83\89\81[
\82ª
\94
\90¶
\82µ
\82½
\92¼
\8cã
\82Ì
\82Æ
\82« */
\r
2461 err->ErrorID += 1;
\r
2462 err->IsError = true;
\r
2463 err->FilePath = FilePath;
\r
2464 err->LineNum = LineNum;
\r
2466 #if ERR2_ENABLE_ERROR_LOG
\r
2467 printf( "<ERROR_LOG msg=\"raised\" ErrorID=\"%d\" ErrorObject=\"0x%08X\"/>\n",
\r
2468 err->ErrorID, (int) err );
\r
2471 is_break = ( err->ErrorID == err->BreakErrorID );
\r
2474 printf( "Break in (%d) %s\n", LineNum, FilePath );
\r
2476 return ( err->ErrorID == err->BreakErrorID );
\r
2478 #else /* IS_MULTI_THREAD_ERROR_CLASS */
\r
2481 bool is_break = false;
\r
2484 e= ErrorClass_initializeIfNot_Sub( &err ); IF_(e){goto fin;}
\r
2487 /*
\83G
\83\89\81[
\8e\9e\82Ì
\92\86\92f
\8f\88\97\9d\81i
\83W
\83\83\83\93\83v
\81j
\82ð
\82µ
\82Ä
\82¢
\82é
\82Æ
\82«
\81i
\8d\82\91¬
\83\8a\83^
\81[
\83\93\81j */
\r
2488 if ( err->IsError ) {
\r
2492 /*
\83G
\83\89\81[
\82ª
\94
\90¶
\82µ
\82½
\92¼
\8cã
\82Ì
\82Æ
\82« */
\r
2494 GlobalErrorClass* err_global = &g_GlobalError;
\r
2496 EnterCriticalSection( &err_global->CriticalSection );
\r
2499 err_global->ErrorThreadCount += 1;
\r
2500 err_global->RaisedGlobalErrorID += 1;
\r
2501 err->GlobalErrorID = err_global->RaisedGlobalErrorID;
\r
2503 err->ErrorID += 1;
\r
2504 err->IsError = true;
\r
2505 err->FilePath = FilePath;
\r
2506 err->LineNum = LineNum;
\r
2508 is_break = ( err->ErrorID == err->BreakErrorID ) ||
\r
2509 ( err->GlobalErrorID == err_global->BreakGlobalErrorID );
\r
2512 /*
\82±
\82±
\82æ
\82è
\88È
\8d~
\82Í
\81AIF
\83}
\83N
\83\8d\82È
\82Ç
\82ð
\8cÄ
\82Ñ
\8fo
\82µ
\89Â
\94\
\81i
\83\8a\83G
\83\93\83g
\83\89\83\93\83g
\89Â
\94\
\81j */
\r
2513 /*
\8fã
\8bL
\82Ì if ( err->IsError )
\82Å
\81A
\82·
\82®
\96ß
\82é
\82½
\82ß */
\r
2516 #if ERR2_ENABLE_ERROR_LOG
\r
2517 printf( "<ERROR_LOG msg=\"raised\" ErrorID=\"%d\" ErrorObject=\"0x%08X\"/>\n",
\r
2518 err->GlobalErrorID, (int) err );
\r
2522 if ( err->ErrorID == 1 ) {
\r
2523 FinalizerClass_initConst( &err->Finalizer, err, ErrorClass_finalize );
\r
2524 e= AddThreadLocalFinalizer( &err->Finalizer );
\r
2529 LeaveCriticalSection( &err_global->CriticalSection );
\r
2536 printf( "Break in (%d) %s\n", LineNum, FilePath );
\r
2540 #endif /* IS_MULTI_THREAD_ERROR_CLASS */
\r
2547 #if ! IS_MULTI_THREAD_ERROR_CLASS
\r
2549 ErrorClass* err = &g_Error;
\r
2551 #if ERR2_ENABLE_ERROR_LOG
\r
2552 if ( err->IsError ) {
\r
2553 printf( "<ERROR_LOG msg=\"cleared\" ErrorID=\"%d\" ErrorObject=\"0x%08X\"/>\n",
\r
2554 err->ErrorID, (int) err );
\r
2558 err->IsError = false;
\r
2560 #else /* IS_MULTI_THREAD_ERROR_CLASS */
\r
2565 e= ErrorClass_initializeIfNot_Sub( &err );
\r
2567 #if ERR2_ENABLE_ERROR_LOG
\r
2568 if ( err->IsError )
\r
2569 printf( "<ERROR_LOG msg=\"cleared\" ErrorID=\"%d\" ErrorObject=\"0x%08X\"/>\n",
\r
2570 err->GlobalErrorID, (int) err );
\r
2573 if ( err->IsError ) {
\r
2574 GlobalErrorClass* err_global = &g_GlobalError;
\r
2576 EnterCriticalSection( &err_global->CriticalSection );
\r
2577 err_global->ErrorThreadCount -= 1;
\r
2578 LeaveCriticalSection( &err_global->CriticalSection );
\r
2580 err->IsError = false;
\r
2584 #if ERR2_ENABLE_ERROR_LOG
\r
2585 printf( "<ERROR_LOG msg=\"clear_miss\"/>\n" );
\r
2589 #endif /* IS_MULTI_THREAD_ERROR_CLASS */
\r
2593 //[IfErrThenBreak]
\r
2594 void IfErrThenBreak()
\r
2596 #if ! IS_MULTI_THREAD_ERROR_CLASS
\r
2598 ErrorClass* err = &g_Error;
\r
2600 if ( err->IsError &&
\r
2601 ( err->ErrorID != err->BreakErrorID || err->BreakErrorID == 0 )
\r
2603 printf( "in IfErrThenBreak\n" );
\r
2606 //
\83E
\83H
\83b
\83`
\82Å
\81Aerr->ErrorID
\82Ì
\92l(N
\82Æ
\82·
\82é)
\82ð
\8am
\94F
\82µ
\82Ä
\81A
\r
2607 //
\83\81\83C
\83\93\8aÖ
\90\94\82Å SetBreakErrorID( N );
\82ð
\8cÄ
\82Ñ
\8fo
\82µ
\82Ä
\82
\82¾
\82³
\82¢
\81B
\r
2608 //
\83G
\83\89\81[
\82ª
\94
\90¶
\82µ
\82½
\8fê
\8f\8a\82Í
\81Aerr->FilePath, err->LineNum
\82Å
\82·
\81B
\r
2609 //
\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
2610 // ClearError()
\82ð
\96Y
\82ê
\82Ä
\82¢
\82é
\89Â
\94\
\90«
\82ª
\82 \82è
\82Ü
\82·
\81B
\r
2611 #if ERR2_ENABLE_ERROR_LOG
\r
2612 printf( "<ERROR_LOG msg=\"IfErrThenBreak\" ErrorID=\"%d\" BreakErrorID=\"%d\"/>\n",
\r
2613 err->ErrorID, err->BreakErrorID );
\r
2618 sprintf_s( str, _countof(str), "<ERROR file=\"%s(%d)\"/>\n",
\r
2619 err->FilePath, err->LineNum );
\r
2620 OutputDebugStringA( str );
\r
2625 #else /* IS_MULTI_THREAD_ERROR_CLASS */
\r
2628 GlobalErrorClass* err_global = &g_GlobalError;
\r
2631 e= ErrorClass_initializeIfNot_Sub( &err );
\r
2632 if ( e ) { DebugBreakR(); ClearError(); return; } /*
\93à
\95\94\83G
\83\89\81[ */
\r
2634 if ( err_global->ErrorThreadCount != 0 &&
\r
2635 ( err->GlobalErrorID != err_global->BreakGlobalErrorID || err_global->BreakGlobalErrorID == 0 )
\r
2637 printf( "in IfErrThenBreak\n" );
\r
2640 //
\83E
\83H
\83b
\83`
\82Å
\81Aerr->GlobalErrorID
\82Ì
\92l(N
\82Æ
\82·
\82é)
\82ð
\8am
\94F
\82µ
\82Ä
\81A
\r
2641 //
\83\81\83C
\83\93\8aÖ
\90\94\82Å SetBreakErrorID( N );
\82ð
\8cÄ
\82Ñ
\8fo
\82µ
\82Ä
\82
\82¾
\82³
\82¢
\81B
\r
2642 //
\83G
\83\89\81[
\82ª
\94
\90¶
\82µ
\82½
\8fê
\8f\8a\82Í
\81Aerr->FilePath, err->LineNum
\82Å
\82·
\81B
\r
2643 //
\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
2644 // ClearError()
\82ð
\96Y
\82ê
\82Ä
\82¢
\82é
\89Â
\94\
\90«
\82ª
\82 \82è
\82Ü
\82·
\81B
\r
2645 #if ERR2_ENABLE_ERROR_LOG
\r
2646 printf( "<ERROR_LOG msg=\"IfErrThenBreak\" ErrorID=\"%d\" BreakErrorID=\"%d\"/>\n",
\r
2647 err->ErrorID, err->BreakErrorID );
\r
2652 sprintf_s( str, _countof(str), "<ERROR file=\"%s(%d)\"/>\n",
\r
2653 err->FilePath, err->LineNum );
\r
2654 OutputDebugStringA( str );
\r
2659 #endif /* IS_MULTI_THREAD_ERROR_CLASS */
\r
2664 void PushErr( ErrStackAreaClass* ErrStackArea )
\r
2666 #if ! IS_MULTI_THREAD_ERROR_CLASS
\r
2668 ErrorClass* err = &g_Error;
\r
2670 ErrStackArea->ErrorID = err->ErrorID;
\r
2671 ErrStackArea->IsError = err->IsError;
\r
2672 err->IsError = false;
\r
2674 #else /* IS_MULTI_THREAD_ERROR_CLASS */
\r
2679 e= ErrorClass_initializeIfNot_Sub( &err );
\r
2681 ErrStackArea->ErrorID = err->ErrorID;
\r
2682 ErrStackArea->IsError = err->IsError;
\r
2683 err->IsError = false;
\r
2686 #endif /* IS_MULTI_THREAD_ERROR_CLASS */
\r
2690 void PopErr( ErrStackAreaClass* ErrStackArea )
\r
2692 #if ! IS_MULTI_THREAD_ERROR_CLASS
\r
2694 ErrorClass* err = &g_Error;
\r
2696 if ( ErrStackArea->IsError )
\r
2697 { err->IsError = true; }
\r
2699 #else /* IS_MULTI_THREAD_ERROR_CLASS */
\r
2704 e= ErrorClass_initializeIfNot_Sub( &err );
\r
2706 if ( ErrStackArea->IsError )
\r
2707 { err->IsError = true; }
\r
2710 #endif /* IS_MULTI_THREAD_ERROR_CLASS */
\r
2715 /*[SetBreakErrorID:2]*/
\r
2719 #endif // ENABLE_ERROR_BREAK_IN_ERROR_CLASS
\r
2723 errnum_t MergeError( errnum_t e, errnum_t ee )
\r
2725 if ( e == 0 ) { return ee; }
\r
2726 else { /* ErrorLog_add( ee ); */ return e; }
\r
2731 /***********************************************************************
\r
2732 <<< [g_Error4_String] >>>
\r
2733 ************************************************************************/
\r
2734 TCHAR g_Error4_String[4096];
\r
2738 /***********************************************************************
\r
2739 <<< [Error4_printf] >>>
\r
2740 ************************************************************************/
\r
2741 void Error4_printf( const TCHAR* format, ... )
\r
2744 va_start( va, format );
\r
2745 vstprintf_r( g_Error4_String, sizeof(g_Error4_String), format, va );
\r
2751 /***********************************************************************
\r
2752 <<< [Error4_getErrStr] >>>
\r
2753 ************************************************************************/
\r
2754 void Error4_getErrStr( int ErrNum, TCHAR* out_ErrStr, size_t ErrStrSize )
\r
2756 switch ( ErrNum ) {
\r
2759 stprintf_r( out_ErrStr, ErrStrSize, _T("no error") );
\r
2763 stprintf_r( out_ErrStr, ErrStrSize,
\r
2764 _T("<ERROR msg=\"
\83v
\83\8d\83O
\83\89\83\80\93à
\95\94\82Ì
\94z
\97ñ
\83\81\83\82\83\8a\81[
\82ª
\95s
\91«
\82µ
\82Ü
\82µ
\82½
\81B\"/>") );
\r
2767 case E_FEW_MEMORY:
\r
2768 stprintf_r( out_ErrStr, ErrStrSize,
\r
2769 _T("<ERROR msg=\"
\83q
\81[
\83v
\81E
\83\81\83\82\83\8a\81[
\82ª
\95s
\91«
\82µ
\82Ü
\82µ
\82½
\81B\"/>") );
\r
2773 case E_GET_LAST_ERROR: {
\r
2775 TCHAR* str_pointer;
\r
2777 err_win = gs.WindowsLastError;
\r
2778 if ( err_win == 0 ) { err_win = GetLastError(); }
\r
2780 stprintf_part_r( out_ErrStr, ErrStrSize, out_ErrStr, &str_pointer,
\r
2781 _T("<ERROR GetLastError=\"0x%08X\" GetLastErrorStr=\""), err_win );
\r
2782 FormatMessage( FORMAT_MESSAGE_IGNORE_INSERTS | FORMAT_MESSAGE_FROM_SYSTEM,
\r
2783 NULL, err_win, LANG_USER_DEFAULT,
\r
2784 str_pointer, (TCHAR*)( (char*)out_ErrStr + ErrStrSize ) - str_pointer, NULL );
\r
2785 str_pointer = _tcschr( str_pointer, _T('\0') );
\r
2786 if ( *( str_pointer - 2 ) == _T('\r') && *( str_pointer - 1 ) == _T('\n') )
\r
2788 stcpy_part_r( out_ErrStr, ErrStrSize, str_pointer, NULL, _T("\"/>"), NULL );
\r
2794 if ( g_Error4_String[0] != '\0' )
\r
2795 stprintf_r( out_ErrStr, ErrStrSize, _T("%s"), g_Error4_String );
\r
2797 stprintf_r( out_ErrStr, ErrStrSize, _T("<ERROR errnum=\"%d\"/>"), ErrNum );
\r
2804 /***********************************************************************
\r
2805 <<< [SaveWindowsLastError] >>>
\r
2806 ************************************************************************/
\r
2807 errnum_t SaveWindowsLastError()
\r
2809 gs.WindowsLastError = GetLastError();
\r
2810 return E_GET_LAST_ERROR;
\r
2815 /*=================================================================*/
\r
2816 /* <<< [CRT_plus_2/CRT_plus_2.c] >>> */
\r
2817 /*=================================================================*/
\r
2819 /**************************************************************************
\r
2820 <<< [Interface] >>>
\r
2821 ***************************************************************************/
\r
2823 /*[DefaultFunction]*/
\r
2824 errnum_t DefaultFunction( void* self )
\r
2826 UNREFERENCED_VARIABLE( self );
\r
2830 /*[DefaultFunction_NotImplementYet]*/
\r
2831 errnum_t DefaultFunction_NotImplementYet( void* self )
\r
2833 UNREFERENCED_VARIABLE( self );
\r
2834 return E_NOT_IMPLEMENT_YET;
\r
2837 /*[DefaultFunction_Finalize]*/
\r
2838 errnum_t DefaultFunction_Finalize( void* self, errnum_t e )
\r
2840 UNREFERENCED_VARIABLE( self );
\r
2844 /*[VTableDefine_overwrite]*/
\r
2845 errnum_t VTableDefine_overwrite( VTableDefine* aVTable, size_t aVTable_ByteSize, int iMethod, void* Func )
\r
2847 VTableDefine* p = aVTable;
\r
2848 VTableDefine* p_over = (VTableDefine*)( (char*)aVTable + aVTable_ByteSize );
\r
2850 for ( ; p < p_over; p++ ) {
\r
2851 if ( p->m_IMethod == iMethod ) {
\r
2852 p->m_method = Func;
\r
2856 return E_NOT_FOUND_SYMBOL;
\r
2861 /*=================================================================*/
\r
2862 /* <<< [StrT/StrT.c] >>> */
\r
2863 /*=================================================================*/
\r
2865 /***********************************************************************
\r
2866 <<< [StrT_cpy] >>>
\r
2867 - _tcscpy is raising exception, if E_FEW_ARRAY
\r
2868 ************************************************************************/
\r
2869 errnum_t StrT_cpy( TCHAR* Dst, size_t DstSize, const TCHAR* Src )
\r
2873 size = ( _tcslen( Src ) + 1 ) * sizeof(TCHAR);
\r
2874 if ( size <= DstSize ) {
\r
2875 memcpy( Dst, Src, size );
\r
2879 memcpy( Dst, Src, DstSize - sizeof(TCHAR) );
\r
2880 *(TCHAR*)( (char*) Dst + DstSize ) = _T('\0');
\r
2881 return E_FEW_ARRAY;
\r
2886 /***********************************************************************
\r
2887 <<< [MallocAndCopyString] >>>
\r
2888 ************************************************************************/
\r
2889 errnum_t MallocAndCopyString( const TCHAR** out_NewString, const TCHAR* SourceString )
\r
2892 size_t size = ( _tcslen( SourceString ) + 1 ) * sizeof(TCHAR);
\r
2894 ASSERT_D( *out_NewString == NULL, __noop() );
\r
2896 str = (TCHAR*) malloc( size );
\r
2897 if ( str == NULL ) { return E_FEW_MEMORY; }
\r
2899 memcpy( str, SourceString, size );
\r
2901 *out_NewString = str;
\r
2907 /***********************************************************************
\r
2908 <<< [MallocAndCopyString_char] >>>
\r
2909 ************************************************************************/
\r
2911 errnum_t MallocAndCopyString_char( const TCHAR** out_NewString, const char* SourceString )
\r
2914 size_t size = ( strlen( SourceString ) + 1 ) * sizeof(TCHAR);
\r
2917 str = (TCHAR*) malloc( size );
\r
2918 if ( str == NULL ) { return E_FEW_MEMORY; }
\r
2920 r = MultiByteToWideChar( CP_OEMCP, MB_PRECOMPOSED, SourceString, -1, str, size / sizeof(TCHAR) );
\r
2923 return E_GET_LAST_ERROR;
\r
2925 *out_NewString = str;
\r
2932 /***********************************************************************
\r
2933 <<< [MallocAndCopyStringByLength] >>>
\r
2934 ************************************************************************/
\r
2935 errnum_t MallocAndCopyStringByLength( const TCHAR** out_NewString, const TCHAR* SourceString,
\r
2936 unsigned CountOfCharacter )
\r
2939 size_t size = ( CountOfCharacter + 1 ) * sizeof(TCHAR);
\r
2941 ASSERT_D( *out_NewString == NULL, __noop() );
\r
2943 str = (TCHAR*) malloc( size );
\r
2944 if ( str == NULL ) { return E_FEW_MEMORY; }
\r
2946 memcpy( str, SourceString, size - sizeof(TCHAR) );
\r
2947 str[ CountOfCharacter ] = _T('\0');
\r
2949 *out_NewString = str;
\r
2955 /***********************************************************************
\r
2956 <<< [StrT_chrs] >>>
\r
2957 ************************************************************************/
\r
2958 TCHAR* StrT_chrs( const TCHAR* s, const TCHAR* keys )
\r
2960 if ( *keys == _T('\0') ) return NULL;
\r
2962 for ( ; *s != _T('\0'); s++ ) {
\r
2963 if ( _tcschr( keys, *s ) != NULL )
\r
2964 return (TCHAR*) s;
\r
2971 /***********************************************************************
\r
2972 <<< [StrT_rstr] >>>
\r
2973 ************************************************************************/
\r
2974 TCHAR* StrT_rstr( const TCHAR* String, const TCHAR* SearchStart, const TCHAR* Keyword,
\r
2975 void* NullConfig )
\r
2978 int keyword_length = _tcslen( Keyword );
\r
2979 TCHAR keyword_first = Keyword[0];
\r
2981 UNREFERENCED_VARIABLE( NullConfig );
\r
2984 while ( p >= String ) {
\r
2985 if ( *p == keyword_first ) {
\r
2986 if ( _tcsncmp( p, Keyword, keyword_length ) == 0 ) {
\r
2987 return (TCHAR*) p;
\r
2998 /***********************************************************************
\r
2999 <<< [StrT_skip] >>>
\r
3000 ************************************************************************/
\r
3001 TCHAR* StrT_skip( const TCHAR* String, const TCHAR* Keys )
\r
3003 if ( *Keys == _T('\0') ) { return (TCHAR*) String; }
\r
3005 for ( ; *String != _T('\0'); String += 1 ) {
\r
3006 if ( _tcschr( Keys, *String ) == NULL )
\r
3009 return (TCHAR*) String;
\r
3014 /***********************************************************************
\r
3015 <<< [StrT_rskip] >>>
\r
3016 ************************************************************************/
\r
3017 TCHAR* StrT_rskip( const TCHAR* String, const TCHAR* SearchStart, const TCHAR* Keys,
\r
3018 void* NullConfig )
\r
3020 const TCHAR* pointer;
\r
3022 UNREFERENCED_VARIABLE( NullConfig );
\r
3024 if ( *Keys == _T('\0') ) { return (TCHAR*) SearchStart; }
\r
3026 for ( pointer = SearchStart; pointer >= String; pointer -= 1 ) {
\r
3027 if ( _tcschr( Keys, *pointer ) == NULL )
\r
3028 { return (TCHAR*) pointer; }
\r
3035 /***********************************************************************
\r
3036 <<< [StrT_isCIdentifier] >>>
\r
3037 ************************************************************************/
\r
3038 bool StrT_isCIdentifier( TCHAR Character )
\r
3040 const TCHAR c = Character;
\r
3043 ( c >= _T('A') && c <= _T('Z') ) ||
\r
3044 ( c >= _T('a') && c <= _T('z') ) ||
\r
3045 ( c >= _T('0') && c <= _T('9') ) ||
\r
3051 /***********************************************************************
\r
3052 <<< [StrT_searchOverOfCIdentifier] >>>
\r
3053 ************************************************************************/
\r
3054 TCHAR* StrT_searchOverOfCIdentifier( const TCHAR* Text )
\r
3062 if ( StrT_isCIdentifier( c ) ) {
\r
3067 return (TCHAR*) p;
\r
3074 /***********************************************************************
\r
3075 <<< [StrT_convPartStrToPointer] >>>
\r
3076 ************************************************************************/
\r
3077 void* StrT_convPartStrToPointer( const TCHAR* StringStart, const TCHAR* StringOver,
\r
3078 const NameOnlyClass* Table, size_t TableSize, void* Default )
\r
3080 const NameOnlyClass* p = Table;
\r
3081 const NameOnlyClass* p_over = (const NameOnlyClass*)( (uint8_t*) Table + TableSize );
\r
3083 while ( p < p_over ) {
\r
3084 if ( StrT_cmp_part( StringStart, StringOver, p->Name ) == 0 ) {
\r
3085 return (void*) p->Delegate;
\r
3094 /***********************************************************************
\r
3095 <<< [StrT_convertNumToStr] >>>
\r
3096 ************************************************************************/
\r
3097 TCHAR* StrT_convertNumToStr( int Number, const NameAndNumClass* Table, int TableCount,
\r
3098 const TCHAR* DefaultStr )
\r
3100 const NameAndNumClass* p;
\r
3101 const NameAndNumClass* p_over = Table + TableCount;
\r
3103 for ( p = Table; p < p_over; p += 1 ) {
\r
3104 if ( p->Number == Number ) {
\r
3108 return (TCHAR*) DefaultStr;
\r
3113 /***********************************************************************
\r
3114 <<< [StrT_cmp_part] >>>
\r
3115 ************************************************************************/
\r
3116 int StrT_cmp_part( const TCHAR* StringA_Start, const TCHAR* StringA_Over,
\r
3117 const TCHAR* StringB )
\r
3124 a = StringA_Start;
\r
3128 if ( a >= StringA_Over ) {
\r
3130 if ( bb == _T('\0') )
\r
3139 if ( bb == _T('\0') )
\r
3143 { return aa - bb; }
\r
3152 /***********************************************************************
\r
3153 <<< [StrT_cmp_part2] >>>
\r
3154 ************************************************************************/
\r
3155 int StrT_cmp_part2( const TCHAR* StringA_Start, const TCHAR* StringA_Over,
\r
3156 const TCHAR* StringB_Start, const TCHAR* StringB_Over )
\r
3158 int length_A = StringA_Over - StringA_Start;
\r
3159 int length_B = StringB_Over - StringB_Start;
\r
3161 if ( length_A != length_B ) {
\r
3162 return length_A - length_B;
\r
3165 return _tcsncmp( StringA_Start, StringB_Start, length_A );
\r
3171 /***********************************************************************
\r
3172 <<< [StrT_refFName] >>>
\r
3173 ************************************************************************/
\r
3174 TCHAR* StrT_refFName( const TCHAR* s )
\r
3179 p = _tcschr( s, _T('\0') );
\r
3181 if ( p == s ) return (TCHAR*) s;
\r
3183 for ( p--; p>s; p-- ) {
\r
3185 if ( c == _T('\\') || c == _T('/') ) return (TCHAR*) p+1;
\r
3187 if ( *p == _T('\\') || *p == _T('/') ) return (TCHAR*) p+1;
\r
3189 return (TCHAR*) s;
\r
3192 /***********************************************************************
\r
3193 <<< [StrT_refExt] >>>
\r
3194 ************************************************************************/
\r
3195 TCHAR* StrT_refExt( const TCHAR* s )
\r
3199 p = _tcschr( s, _T('\0') );
\r
3201 if ( p == s ) return (TCHAR*) s;
\r
3203 for ( p--; p>s; p-- ) {
\r
3204 if ( *p == _T('.') ) return (TCHAR*) p+1;
\r
3205 if ( *p == _T('/') || *p == _T('\\') ) return (TCHAR*) _tcschr( p, _T('\0') );
\r
3207 if ( *p == _T('.') ) return (TCHAR*) p+1;
\r
3209 return (TCHAR*) _tcschr( s, _T('\0') );
\r
3214 /***********************************************************************
\r
3215 <<< [StrT_convStrToId] >>>
\r
3216 ************************************************************************/
\r
3217 errnum_t StrT_convStrToId( const TCHAR* str, const TCHAR** strs, const int* ids,
\r
3218 int n, int default_id )
\r
3221 const TCHAR** p_over = strs + n;
\r
3223 for ( p = strs; p < p_over; p++ ) {
\r
3224 if ( _tcsicmp( *p, str ) == 0 ) return ids[p - strs];
\r
3226 return default_id;
\r
3230 /***********************************************************************
\r
3231 <<< [StrT_convStrLeftToId] >>>
\r
3232 ************************************************************************/
\r
3233 errnum_t StrT_convStrLeftToId( const TCHAR* Str, const TCHAR** Strs, const size_t* Lens, const int* Ids,
\r
3234 int CountOfStrs, TCHAR* Separeters, int DefaultId, TCHAR** out_PosOfLastOfStr )
\r
3237 const TCHAR** pp_over = Strs + CountOfStrs;
\r
3238 const size_t* p_len;
\r
3240 const TCHAR* p_last_of_str;
\r
3245 for ( pp = Strs; pp < pp_over; pp += 1 ) {
\r
3247 ASSERT_D( _tcslen( *pp ) == *p_len, goto err );
\r
3249 if ( _tcsncmp( Str, *pp, *p_len ) == 0 ) {
\r
3250 p_last_of_str = Str + *p_len;
\r
3251 c = *p_last_of_str;
\r
3252 if ( c == _T('\0') || _tcschr( Separeters, c ) != NULL ) {
\r
3253 *out_PosOfLastOfStr = (TCHAR*) p_last_of_str;
\r
3263 err: return DefaultId;
\r
3268 /***********************************************************************
\r
3269 <<< [StrT_replace1] >>>
\r
3270 ************************************************************************/
\r
3271 errnum_t StrT_replace1( TCHAR* in_out_String, TCHAR FromCharacter, TCHAR ToCharacter,
\r
3276 UNREFERENCED_VARIABLE( Opt );
\r
3278 IF ( FromCharacter == _T('\0') ) { return E_OTHERS; }
\r
3280 p = in_out_String;
\r
3282 p = _tcschr( p, FromCharacter );
\r
3283 if ( p == NULL ) { break; }
\r
3293 /***********************************************************************
\r
3294 <<< [StrT_trim] >>>
\r
3295 ************************************************************************/
\r
3296 errnum_t StrT_trim( TCHAR* out_Str, size_t out_Str_Size, const TCHAR* in_Str )
\r
3302 p1 = in_Str; while ( *p1 == _T(' ') || *p1 == _T('\t') ) p1++;
\r
3303 for ( p2 = _tcschr( p1, _T('\0') ) - 1; p2 >= p1; p2-- ) {
\r
3305 if ( c != _T(' ') && c != _T('\t') && c != _T('\n') && c != _T('\r') )
\r
3308 return stcpy_part_r( out_Str, out_Str_Size, out_Str, NULL, p1, p2+1 );
\r
3313 /***********************************************************************
\r
3314 <<< [StrT_cutLastOf] >>>
\r
3315 ************************************************************************/
\r
3316 errnum_t StrT_cutLastOf( TCHAR* in_out_Str, TCHAR Charactor )
\r
3318 TCHAR* last = _tcschr( in_out_Str, _T('\0') );
\r
3320 if ( last > in_out_Str ) {
\r
3321 if ( *( last - 1 ) == Charactor )
\r
3322 { *( last - 1 ) = _T('\0'); }
\r
3329 /***********************************************************************
\r
3330 <<< [StrT_cutLineComment] >>>
\r
3331 ************************************************************************/
\r
3332 errnum_t StrT_cutLineComment( TCHAR* out_Str, size_t out_Str_Size, const TCHAR* in_Str, const TCHAR* CommentSign )
\r
3338 p1 = in_Str; while ( *p1 == _T(' ') || *p1 == _T('\t') ) p1++;
\r
3340 p2 = _tcsstr( p1, CommentSign );
\r
3341 if ( p2 == NULL ) p2 = _tcschr( p1, _T('\0') );
\r
3343 for ( p2 = p2 - 1; p2 >= p1; p2-- ) {
\r
3345 if ( c != _T(' ') && c != _T('\t') && c != _T('\n') && c != _T('\r') )
\r
3348 return stcpy_part_r( out_Str, out_Str_Size, out_Str, NULL, p1, p2+1 );
\r
3353 /**************************************************************************
\r
3354 <<< [StrT_meltCSV] >>>
\r
3355 *************************************************************************/
\r
3356 errnum_t StrT_meltCSV( TCHAR* out_Str, size_t out_Str_Size, const TCHAR** pCSV )
\r
3360 TCHAR* t_last = (TCHAR*)( (char*)out_Str + out_Str_Size - sizeof(TCHAR) );
\r
3367 if ( out_Str_Size <= 1 ) { t = dummy; t_last = dummy; }
\r
3369 if ( s == NULL ) { *t = _T('\0'); return 0; }
\r
3372 /*
\93ª
\82Ì
\8bó
\94\92\82ð
\8f\9c\82 */
\r
3373 while ( *s == _T(' ') || *s == _T('\t') ) s++;
\r
3377 /* ""
\82Å
\88Í
\82Ü
\82ê
\82Ä
\82¢
\82é
\8fê
\8d\87 */
\r
3381 while ( c != _T('"') || *(s+1) == _T('"') ) { /* "
\95¶
\8e\9a\82Ü
\82Å */
\r
3382 if ( t == t_last ) { e = E_FEW_ARRAY; t = dummy; t_last = dummy + 1; }
\r
3383 if ( c == *(s+1) && c == _T('"') ) s++; /* "
\95¶
\8e\9a\8e©
\91Ì */
\r
3384 if ( c == _T('\0') ) break;
\r
3385 *t = c; t++; s++; c = *s;
\r
3391 if ( *s == _T(',') ) { s = s+1; break; }
\r
3392 if ( *s == _T('\0') ) { s = NULL; break; }
\r
3398 /*
\8bó
\82Ì
\8d\80\96Ú
\82Ì
\8fê
\8d\87 */
\r
3409 /* ""
\82Å
\88Í
\82Ü
\82ê
\82Ä
\82¢
\82È
\82¢
\8fê
\8d\87 */
\r
3411 TCHAR* sp = NULL; /*
\8dÅ
\8cã
\82Ì
\98A
\91±
\82µ
\82½
\8bó
\94\92\82Ì
\90æ
\93ª */
\r
3414 while ( c != _T(',') && c != _T('\0') && c != _T('\r') && c != _T('\n') ) { /* ,
\95¶
\8e\9a\82Ü
\82Å */
\r
3416 /* sp
\82ð
\90Ý
\92è
\82·
\82é */
\r
3418 if ( sp == NULL ) sp = t;
\r
3422 if ( t == t_last ) { e = E_FEW_ARRAY; t = dummy; t_last = dummy + 1; }
\r
3424 /*
\83R
\83s
\81[
\82·
\82é */
\r
3425 *t = c; t++; s++; c = *s;
\r
3428 /*
\95Ô
\82è
\92l
\82ð
\8c\88\92è
\82·
\82é */
\r
3429 if ( c == _T(',') ) s = s + 1;
\r
3432 /*
\96\96\94ö
\82Ì
\8bó
\94\92\82ð
\8eæ
\82è
\8f\9c\82 */
\r
3433 if ( sp != NULL ) *sp = '\0';
\r
3434 else *t = _T('\0');
\r
3444 /***********************************************************************
\r
3445 <<< [StrT_parseCSV_f] >>>
\r
3446 ************************************************************************/
\r
3447 errnum_t StrT_parseCSV_f( const TCHAR* StringOfCSV, bit_flags32_t* out_ReadFlags, const TCHAR* Types, ... )
\r
3453 bool is_next_omittable;
\r
3454 bool is_next_omit;
\r
3455 const TCHAR* column_pointer;
\r
3457 TCHAR column[ 32 ];
\r
3458 bit_flags32_t read_flags;
\r
3459 bit_flags32_t next_read_flag;
\r
3464 va_start( va, Types );
\r
3466 is_next_omittable = false;
\r
3467 column_pointer = StringOfCSV;
\r
3469 next_read_flag = 1;
\r
3470 while ( column_pointer != NULL ) {
\r
3473 type = Types[ types_index ];
\r
3479 is_next_omittable = true;
\r
3483 out_str = va_arg( va, TCHAR* );
\r
3484 str_size = va_arg( va, size_t );
\r
3485 ASSERT_D( str_size >= 1, e=E_OTHERS; goto fin );
\r
3490 str_size = sizeof( column );
\r
3494 if ( out_str != NULL ) {
\r
3496 // Set "out_str" : Column string in CSV
\r
3497 column_pointer = StrT_skip( column_pointer, _T(" \t") );
\r
3498 a_char = *column_pointer;
\r
3499 if ( is_next_omittable && ( a_char == _T('\0') || a_char == _T(',') ) ) {
\r
3500 column_pointer = StrT_chrs( column_pointer, _T(",") );
\r
3501 if ( column_pointer != NULL ) { column_pointer += 1; }
\r
3502 is_next_omit = true;
\r
3504 e= StrT_meltCSV( out_str, str_size, &column_pointer ); IF(e){goto fin;}
\r
3506 is_next_omit = false;
\r
3507 read_flags |= next_read_flag;
\r
3512 /* "va_arg" was already called */
\r
3516 int* pointer_of_int = va_arg( va, int* );
\r
3518 if ( ! is_next_omit ) {
\r
3519 *pointer_of_int = ttoi_ex( column, 0 );
\r
3524 double* pointer_of_double = va_arg( va, double* );
\r
3526 if ( ! is_next_omit ) {
\r
3527 *pointer_of_double = _tstof( column );
\r
3532 bool* pointer_of_bool = va_arg( va, bool* );
\r
3533 int strings_index;
\r
3534 static const TCHAR* strings[] = {
\r
3535 _T("1"), _T("true"), _T("yes"),
\r
3538 if ( ! is_next_omit ) {
\r
3539 *pointer_of_bool = false;
\r
3540 for ( strings_index = 0;
\r
3541 strings_index < _countof( strings );
\r
3542 strings_index += 1 )
\r
3544 if ( _tcsicmp( column, strings[ strings_index ] ) == 0 ) {
\r
3545 *pointer_of_bool = true;
\r
3553 SYSTEMTIME* pointer_of_time = va_arg( va, SYSTEMTIME* );
\r
3554 int* pointer_of_bias = va_arg( va, int* );
\r
3556 if ( ! is_next_omit ) {
\r
3557 e= W3CDTF_toSYSTEMTIME( column, pointer_of_time, pointer_of_bias );
\r
3564 ASSERT_R( false, e=E_OTHERS; goto fin );
\r
3567 is_next_omittable = false;
\r
3568 next_read_flag <<= 1;
\r
3574 if ( out_ReadFlags != NULL ) {
\r
3575 *out_ReadFlags = read_flags;
\r
3586 /***********************************************************************
\r
3587 <<< [StrT_getExistSymbols] >>>
\r
3588 ************************************************************************/
\r
3589 errnum_t StrT_getExistSymbols( unsigned* out, bool bCase, const TCHAR* Str, const TCHAR* Symbols, ... )
\r
3593 bool* syms_exists = NULL;
\r
3594 bool b_nosym = false;
\r
3595 TCHAR* sym = NULL;
\r
3596 size_t sym_size = ( _tcslen( Symbols ) + 1 ) * sizeof(TCHAR);
\r
3598 const TCHAR** syms = NULL;
\r
3601 UNREFERENCED_VARIABLE( bCase );
\r
3603 sym = (TCHAR*) malloc( sym_size ); IF(sym==NULL)goto err_fm;
\r
3609 e= StrT_meltCSV( sym, sym_size, &p ); IF(e)goto fin;
\r
3610 if ( sym[0] != _T('\0') ) n_sym ++;
\r
3611 } while ( p != NULL );
\r
3613 syms = (const TCHAR**) malloc( n_sym * sizeof(TCHAR*) ); IF(syms==NULL)goto err_fm;
\r
3614 memset( (TCHAR**) syms, 0, n_sym * sizeof(TCHAR*) );
\r
3615 syms_exists = (bool*) malloc( n_sym * sizeof(bool) ); IF(syms_exists==NULL)goto err_fm;
\r
3616 memset( syms_exists, 0, n_sym * sizeof(bool) );
\r
3618 p = Symbols; i = 0;
\r
3620 e= StrT_meltCSV( sym, sym_size, &p ); IF(e)goto fin;
\r
3621 if ( sym[0] != _T('\0') ) {
\r
3622 e= MallocAndCopyString( &syms[i], sym ); IF(e)goto fin;
\r
3625 } while ( p != NULL );
\r
3628 //=== Check Str whether having Symbols
\r
3631 e= StrT_meltCSV( sym, sym_size, &p ); IF(e)goto fin;
\r
3632 if ( sym[0] != _T('\0') ) {
\r
3633 for ( i = 0; i < n_sym; i++ ) {
\r
3634 if ( _tcscmp( sym, syms[i] ) == 0 ) { syms_exists[i] = true; break; }
\r
3636 if ( i == n_sym ) b_nosym = true;
\r
3638 } while ( p != NULL );
\r
3646 va_start( va, Symbols );
\r
3648 for ( i = 0; i < n_sym; i++ ) {
\r
3649 num = va_arg( va, unsigned );
\r
3650 if ( syms_exists[i] ) *out |= num;
\r
3655 e = ( b_nosym ? E_NOT_FOUND_SYMBOL : 0 );
\r
3657 if ( syms != NULL ) {
\r
3658 for ( i = 0; i < n_sym; i++ ) {
\r
3659 e= HeapMemory_free( &syms[i], e );
\r
3661 free( (TCHAR**) syms );
\r
3663 e= HeapMemory_free( &syms_exists, e );
\r
3664 e= HeapMemory_free( &sym, e );
\r
3666 err_fm: e= E_FEW_MEMORY; goto fin;
\r
3670 /**************************************************************************
\r
3671 <<< [StrT_meltCmdLine] >>>
\r
3672 *************************************************************************/
\r
3673 errnum_t StrT_meltCmdLine( TCHAR* out_Str, size_t out_Str_Size, const TCHAR** pLine )
\r
3677 TCHAR* t_last = (TCHAR*)( (char*)out_Str + out_Str_Size - sizeof(TCHAR) );
\r
3684 if ( out_Str_Size <= 1 ) { t = &dummy; t_last = &dummy; }
\r
3686 if ( s == NULL ) { *t = _T('\0'); return 0; }
\r
3689 /*
\93ª
\82Ì
\8bó
\94\92\82ð
\8f\9c\82 */
\r
3690 while ( *s == _T(' ') || *s == _T('\t') ) s++;
\r
3694 /* ""
\82Å
\88Í
\82Ü
\82ê
\82Ä
\82¢
\82é
\8fê
\8d\87 */
\r
3698 while ( c != _T('"') || *(s+1) == _T('"') ) { /* "
\95¶
\8e\9a\82Ü
\82Å */
\r
3699 if ( t == t_last ) { e = E_FEW_ARRAY; t = &dummy; t_last = &dummy + 1; }
\r
3700 if ( c == *(s+1) && c == _T('"') ) s++; /* "
\95¶
\8e\9a\8e©
\91Ì */
\r
3701 if ( c == _T('\0') ) break;
\r
3702 *t = c; t++; s++; c = *s;
\r
3708 if ( *s == _T(' ') ) { s = s+1; break; }
\r
3709 if ( *s == _T('\0') ) { s = NULL; break; }
\r
3720 /* ""
\82Å
\88Í
\82Ü
\82ê
\82Ä
\82¢
\82È
\82¢
\8fê
\8d\87 */
\r
3723 while ( c != _T(' ') && c != _T('\0') && c != _T('\r') && c != _T('\n') ) { /*
\8bó
\94\92\95¶
\8e\9a\82Ü
\82Å */
\r
3725 if ( t == t_last ) { e = E_FEW_ARRAY; t = &dummy; t_last = &dummy + 1; }
\r
3727 /*
\83R
\83s
\81[
\82·
\82é */
\r
3728 *t = c; t++; s++; c = *s;
\r
3731 /* *pLine
\82ð
\8c\88\92è
\82·
\82é */
\r
3732 while ( *s == _T(' ') ) s = s + 1;
\r
3733 if ( *s == _T('\0') ) s = NULL;
\r
3746 /***********************************************************************
\r
3747 <<< [W3CDTF_fromSYSTEMTIME] >>>
\r
3748 ************************************************************************/
\r
3749 errnum_t W3CDTF_fromSYSTEMTIME( TCHAR* out_W3CDTF, size_t W3CDTF_ByteSize,
\r
3750 const SYSTEMTIME* Time, int TimeZoneMinute )
\r
3753 TCHAR* char_pointer = out_W3CDTF;
\r
3755 e= stprintf_part_r( out_W3CDTF, W3CDTF_ByteSize, char_pointer, &char_pointer,
\r
3756 _T("%04d-%02d-%02dT%02d:%02d:%02d.%03d"),
\r
3757 Time->wYear, Time->wMonth, Time->wDay,
\r
3758 Time->wHour, Time->wMinute, Time->wSecond, Time->wMilliseconds );
\r
3761 e= W3CDTF_getTimeZoneDesignator( char_pointer,
\r
3762 GetStringSizeFromPointer( out_W3CDTF, W3CDTF_ByteSize, char_pointer ),
\r
3763 TimeZoneMinute ); IF(e){goto fin;}
\r
3772 /***********************************************************************
\r
3773 <<< [W3CDTF_toSYSTEMTIME] >>>
\r
3774 ************************************************************************/
\r
3775 errnum_t W3CDTF_toSYSTEMTIME( const TCHAR* String, SYSTEMTIME* out_Time, int* out_BiasMinute )
\r
3778 size_t string_length = _tcslen( String );
\r
3780 /* 01234567890123456789012345678 */
\r
3781 /*"yyyy-mm-ddThh:mm:ss.sss+00:00"*/
\r
3782 /*"0000-00-00T00:00+00:00"*/
\r
3784 IF_D( out_BiasMinute == NULL ) { e=E_OTHERS; goto fin; }
\r
3787 if ( string_length >= 11 ) {
\r
3789 const TCHAR* time_zone;
\r
3792 IF ( String[10] != _T('T') ) { e=E_NOT_FOUND_SYMBOL; goto fin; }
\r
3793 IF ( String[4] != _T('-') || String[7] != _T('-') )
\r
3794 { e=E_NOT_FOUND_SYMBOL; goto fin; }
\r
3796 IF ( string_length < 16 ) { e=E_NOT_FOUND_SYMBOL; goto fin; }
\r
3797 IF ( String[13] != _T(':') ) { e=E_NOT_FOUND_SYMBOL; goto fin; }
\r
3799 out_Time->wYear = (WORD) _ttoi( &String[0] );
\r
3800 out_Time->wMonth = (WORD) _ttoi( &String[5] );
\r
3801 out_Time->wDayOfWeek = 0;
\r
3802 out_Time->wDay = (WORD) _ttoi( &String[8] );
\r
3803 out_Time->wHour = (WORD) _ttoi( &String[11] );
\r
3804 out_Time->wMinute = (WORD) _ttoi( &String[14] );
\r
3806 a_char = String[16];
\r
3807 if ( a_char == _T('+') || a_char == _T('-') || a_char == _T('Z') ) {
\r
3808 time_zone = &String[16];
\r
3809 out_Time->wSecond = 0;
\r
3810 out_Time->wMilliseconds = 0;
\r
3813 IF ( string_length < 19 ) { e=E_NOT_FOUND_SYMBOL; goto fin; }
\r
3814 IF ( a_char != _T(':') ) { e=E_NOT_FOUND_SYMBOL; goto fin; }
\r
3815 out_Time->wSecond = (WORD) _ttoi( &String[17] );
\r
3818 /*
\8f¬
\90\94\93_ */
\r
3819 a_char = String[19];
\r
3820 if ( a_char == _T('+') || a_char == _T('-') || a_char == _T('Z') ) {
\r
3821 time_zone = &String[19];
\r
3822 out_Time->wMilliseconds = 0;
\r
3825 IF ( a_char != _T('.') ) { e=E_NOT_FOUND_SYMBOL; goto fin; }
\r
3827 out_Time->wMilliseconds = 0;
\r
3829 number = String[20] - _T('0');
\r
3830 if ( number < 0 || number > 9 ) {
\r
3831 time_zone = &String[20];
\r
3833 out_Time->wMilliseconds += (WORD)( number * 100 );
\r
3835 number = String[21] - _T('0');
\r
3836 if ( number < 0 || number > 9 ) {
\r
3837 time_zone = &String[21];
\r
3839 out_Time->wMilliseconds += (WORD)( number * 10 );
\r
3841 number = String[22] - _T('0');
\r
3842 if ( number < 0 || number > 9 ) {
\r
3843 time_zone = &String[22];
\r
3845 const TCHAR* pointer = &String[23];
\r
3847 out_Time->wMilliseconds += (WORD)( number * 1 );
\r
3850 number = *pointer - _T('0');
\r
3851 if ( number < 0 || number > 9 )
\r
3856 time_zone = pointer;
\r
3861 a_char = *time_zone;
\r
3862 IF ( ! ( a_char == _T('+') || a_char == _T('-') || a_char == _T('Z') ) )
\r
3863 { e=E_NOT_FOUND_SYMBOL; goto fin; }
\r
3868 if ( a_char == _T('Z') ) {
\r
3869 *out_BiasMinute = 0;
\r
3872 size_t time_zone_length = string_length - ( time_zone - String );
\r
3875 IF ( time_zone_length < 6 ) { e=E_NOT_FOUND_SYMBOL; goto fin; }
\r
3876 IF ( time_zone[3] != _T(':') ) { e=E_NOT_FOUND_SYMBOL; goto fin; }
\r
3878 bias_minute = _ttoi( &time_zone[1] ) * 60 + _ttoi( &time_zone[4] );
\r
3879 if ( a_char == _T('-') ) { bias_minute = -bias_minute; }
\r
3880 *out_BiasMinute = bias_minute;
\r
3884 /* Without time */
\r
3886 out_Time->wDayOfWeek = 0;
\r
3887 out_Time->wHour = 0;
\r
3888 out_Time->wMinute = 0;
\r
3889 out_Time->wSecond = 0;
\r
3890 out_Time->wMilliseconds = 0;
\r
3891 *out_BiasMinute = 0;
\r
3893 IF ( string_length < 4 ) { e=E_NOT_FOUND_SYMBOL; goto fin; }
\r
3896 out_Time->wYear = (WORD) _ttoi( &String[0] );
\r
3899 if ( string_length > 4 ) {
\r
3900 IF ( string_length < 7 ) { e=E_NOT_FOUND_SYMBOL; goto fin; }
\r
3901 IF ( String[4] != _T('-') ) { e=E_NOT_FOUND_SYMBOL; goto fin; }
\r
3902 out_Time->wMonth = (WORD) _ttoi( &String[5] );
\r
3904 out_Time->wMonth = 1;
\r
3908 if ( string_length > 7 ) {
\r
3909 IF ( string_length < 10 ) { e=E_NOT_FOUND_SYMBOL; goto fin; }
\r
3910 IF ( String[7] != _T('-') ) { e=E_NOT_FOUND_SYMBOL; goto fin; }
\r
3911 out_Time->wDay = (WORD) _ttoi( &String[8] );
\r
3913 out_Time->wDay = 1;
\r
3924 /***********************************************************************
\r
3925 <<< [W3CDTF_getTimeZoneDesignator] >>>
\r
3926 ************************************************************************/
\r
3927 errnum_t W3CDTF_getTimeZoneDesignator( TCHAR* out_TZD, size_t TZD_ByteSize,
\r
3932 TIME_ZONE_INFORMATION time_zone;
\r
3935 /* Set "BiasMinute" */
\r
3936 if ( BiasMinute == W3CDTF_CURRENT_TIME_ZONE ) {
\r
3937 GetTimeZoneInformation( &time_zone );
\r
3938 BiasMinute = -time_zone.Bias;
\r
3941 enum { minute_1day = 1440 };
\r
3943 IF_D ( BiasMinute < -minute_1day || BiasMinute > minute_1day )
\r
3944 { e=E_OTHERS; goto fin; }
\r
3949 if ( BiasMinute >= 0 ) {
\r
3953 BiasMinute = -BiasMinute;
\r
3957 /* Set "out_TZD" */
\r
3958 _stprintf_s( out_TZD, TZD_ByteSize / sizeof(TCHAR), _T("%c%02d:%02d"),
\r
3959 sign, BiasMinute / 60, BiasMinute % 60 );
\r
3968 /***********************************************************************
\r
3969 <<< [StrT_isFullPath] >>>
\r
3970 ************************************************************************/
\r
3971 bool StrT_isFullPath( const TCHAR* path )
\r
3975 if ( path[0] == _T('\\') && path[1] == _T('\\') ) {
\r
3978 const TCHAR* back_slash = _tcschr( path, _T('\\') );
\r
3979 const TCHAR* slash = _tcschr( path, _T('/') );
\r
3980 const TCHAR* colon = _tcschr( path, _T(':') );
\r
3982 ret = ( colon != NULL ) &&
\r
3983 ( back_slash == colon + 1 || slash == colon + 1 );
\r
3990 /**************************************************************************
\r
3991 <<< [StrT_getFullPath_part] >>>
\r
3992 *************************************************************************/
\r
3993 errnum_t StrT_getFullPath_part( TCHAR* out_FullPath, size_t FullPathSize, TCHAR* OutStart,
\r
3994 TCHAR** out_OutLast, const TCHAR* StepPath, const TCHAR* BasePath )
\r
3997 TCHAR separator = (TCHAR) DUMMY_INITIAL_VALUE_TCHAR;
\r
3998 const TCHAR* separator_path;
\r
3999 TCHAR* out_full_path_over = (TCHAR*)( (uint8_t*) out_FullPath + FullPathSize );
\r
4000 TCHAR* null_position = NULL;
\r
4004 /* "BasePath" must be out of "out_FullPath" */
\r
4005 ASSERT_R( BasePath < out_FullPath ||
\r
4006 (uint8_t*) BasePath >= (uint8_t*) out_FullPath + FullPathSize,
\r
4011 /* If "StepPath" == "", out_FullPath = "" */
\r
4012 if ( StepPath[0] == _T('\0') ) {
\r
4013 ASSERT_R( FullPathSize >= sizeof(TCHAR), goto err_fm );
\r
4014 out_FullPath[0] = _T('\0');
\r
4019 /* Set "OutStart" */
\r
4020 if ( OutStart == NULL )
\r
4021 { OutStart = out_FullPath; }
\r
4024 /* Set "separator" : \ or / from "BasePath" */
\r
4025 if ( StrT_isFullPath( StepPath ) ) {
\r
4026 separator_path = StepPath;
\r
4028 else if ( BasePath == NULL ) {
\r
4029 separator = _T('\\');
\r
4030 separator_path = NULL;
\r
4033 separator_path = BasePath;
\r
4035 if ( separator_path != NULL ) {
\r
4039 p = _tcschr( separator_path, _T('\\') );
\r
4040 p2 = _tcschr( separator_path, _T('/') );
\r
4041 if ( p == NULL ) {
\r
4043 { separator = _T('\\'); }
\r
4045 { separator = _T('/'); }
\r
4048 { separator = _T('\\'); }
\r
4051 { separator = _T('\\'); }
\r
4053 { separator = _T('/'); }
\r
4059 /* Set "OutStart" : "BasePath" + / + "StepPath" */
\r
4060 if ( StrT_isFullPath( StepPath ) ) {
\r
4061 size_t step_path_length = _tcslen( StepPath );
\r
4063 IF( OutStart + step_path_length >= out_full_path_over ) goto err_fa;
\r
4064 memmove( OutStart, StepPath, ( step_path_length + 1 ) * sizeof(TCHAR) );
\r
4066 /* Set "null_position" */
\r
4067 null_position = OutStart + step_path_length;
\r
4072 size_t base_path_length;
\r
4073 size_t step_path_length = _tcslen( StepPath );
\r
4075 if ( BasePath == NULL ) {
\r
4076 base_path_length = GetCurrentDirectory( 0, NULL ) - 1;
\r
4079 base_path_length = _tcslen( BasePath );
\r
4080 c = BasePath[ base_path_length - 1 ];
\r
4081 if ( c == _T('\\') || c == _T('/') )
\r
4082 { base_path_length -= 1; }
\r
4085 p = OutStart + base_path_length + 1;
\r
4086 IF( p + step_path_length >= out_full_path_over ) goto err_fa;
\r
4087 memmove( p, StepPath, ( step_path_length + 1 ) * sizeof(TCHAR) );
\r
4088 /* memmove is for "out_FullPath" == "StepPath" */
\r
4090 if ( BasePath == NULL ) {
\r
4091 GetCurrentDirectory( base_path_length + 1, OutStart );
\r
4092 if ( OutStart[ base_path_length - 1 ] == _T('\\') )
\r
4093 { base_path_length -= 1; }
\r
4095 memcpy( OutStart, BasePath, base_path_length * sizeof(TCHAR) );
\r
4097 OutStart[ base_path_length ] = separator;
\r
4100 /* Set "null_position" */
\r
4101 null_position = p + step_path_length;
\r
4105 /* Replace \ and / to "separator" in "OutStart" */
\r
4107 TCHAR other_separator;
\r
4109 if ( separator == _T('/') )
\r
4110 { other_separator = _T('\\'); }
\r
4112 { other_separator = _T('/'); }
\r
4114 e= StrT_replace1( OutStart, other_separator, separator, 0 ); IF(e)goto fin;
\r
4118 /* Replace \*\..\ to \ */
\r
4120 enum { length = 4 };
\r
4121 TCHAR parent[ length + 1 ]; /* \..\ or /../ */
\r
4122 TCHAR* parent_position;
\r
4125 parent[0] = separator;
\r
4126 parent[1] = _T('.');
\r
4127 parent[2] = _T('.');
\r
4128 parent[3] = separator;
\r
4129 parent[4] = _T('\0');
\r
4132 parent_position = _tcsstr( OutStart, parent );
\r
4133 if ( parent_position == NULL ) { break; }
\r
4135 p = parent_position - 1;
\r
4137 IF( p < OutStart ) {goto err;} /* "../" are too many */
\r
4138 if ( *p == separator ) { break; }
\r
4143 parent_position + length,
\r
4144 ( null_position - ( parent_position + length ) + 1 ) * sizeof(TCHAR) );
\r
4146 null_position -= ( parent_position + length ) - ( p + 1 );
\r
4151 /* Cut last \*\.. */
\r
4153 enum { length = 3 };
\r
4156 while ( null_position - length >= OutStart ) {
\r
4157 if ( *( null_position - 3 ) != separator ||
\r
4158 *( null_position - 2 ) != _T('.') ||
\r
4159 *( null_position - 1 ) != _T('.') )
\r
4162 p = null_position - 4;
\r
4164 IF( p < OutStart ) {goto err;} /* "../" are too many */
\r
4165 if ( *p == separator ) { break; }
\r
4171 null_position = p;
\r
4176 /* Replace \.\ to \ */
\r
4178 enum { length = 3 };
\r
4179 TCHAR current[ length + 1 ]; /* \.\ or /./ */
\r
4180 TCHAR* current_position;
\r
4182 current[0] = separator;
\r
4183 current[1] = _T('.');
\r
4184 current[2] = separator;
\r
4185 current[3] = _T('\0');
\r
4188 current_position = _tcsstr( OutStart, current );
\r
4189 if ( current_position == NULL ) { break; }
\r
4191 memmove( current_position + 1,
\r
4192 current_position + length,
\r
4193 ( null_position - ( current_position + length ) + 1 ) * sizeof(TCHAR) );
\r
4195 null_position -= length - 1;
\r
4202 TCHAR* over = _tcschr( OutStart, _T('\0') );
\r
4204 while ( over - 2 >= OutStart &&
\r
4205 *( over - 1 ) == _T('.') && *( over - 2 ) == separator ) {
\r
4213 if ( null_position - 1 >= OutStart ) {
\r
4214 if ( *( null_position - 1 ) == _T(':') ) {
\r
4215 IF( null_position + 1 >= out_full_path_over ) goto err_fa;
\r
4217 *( null_position + 0 ) = separator;
\r
4218 *( null_position + 1 ) = _T('\0');
\r
4219 null_position += 1;
\r
4224 /* Set "*out_OutLast" */
\r
4225 if ( out_OutLast != NULL )
\r
4226 { *out_OutLast = null_position; }
\r
4232 err: e = E_OTHERS; goto fin;
\r
4233 err_fa: e = E_FEW_ARRAY; goto fin;
\r
4234 err_fm: e = E_FEW_MEMORY; goto fin;
\r
4239 /***********************************************************************
\r
4240 <<< [StrT_allocateFullPath] >>>
\r
4241 ************************************************************************/
\r
4242 errnum_t StrT_allocateFullPath( TCHAR** out_FullPath, const TCHAR* StepPath, TCHAR* BasePath )
\r
4245 int step_path_length = _tcslen( StepPath );
\r
4246 int base_path_length;
\r
4247 int full_path_size;
\r
4249 if ( BasePath == NULL ) {
\r
4250 base_path_length = GetCurrentDirectory( 0, NULL ) - 1;
\r
4252 base_path_length = _tcslen( BasePath );
\r
4255 full_path_size = ( step_path_length + 1 + base_path_length + 1 ) * sizeof(TCHAR);
\r
4257 e= HeapMemory_allocateBytes( out_FullPath, full_path_size ); IF(e){goto fin;}
\r
4258 e= StrT_getFullPath( *out_FullPath, full_path_size, StepPath, BasePath ); IF(e){goto fin;}
\r
4267 /***********************************************************************
\r
4268 <<< [StrT_getParentFullPath_part] >>>
\r
4269 ************************************************************************/
\r
4270 errnum_t StrT_getParentFullPath_part( TCHAR* Str, size_t StrSize, TCHAR* StrStart,
\r
4271 TCHAR** out_StrLast, const TCHAR* StepPath, const TCHAR* BasePath )
\r
4276 IF_D( StrStart < Str || (char*) StrStart >= (char*)Str + StrSize ){goto err;}
\r
4278 if ( StepPath[0] == _T('\0') ) {
\r
4279 *StrStart = _T('\0');
\r
4283 /*
\90â
\91Î
\83p
\83X
\82É
\82·
\82é */
\r
4284 e= StrT_getFullPath( StrStart,
\r
4285 StrSize - ( (char*)StrStart - (char*)Str ),
\r
4286 StepPath, BasePath ); IF(e)goto fin;
\r
4290 p = _tcschr( StrStart, _T('\0') );
\r
4291 if ( p > StrStart ) {
\r
4292 TCHAR c = *( p - 1 );
\r
4293 if ( c == _T('\\') || c == _T('/') )
\r
4294 { *( p - 1 ) = _T('\0'); }
\r
4299 p = StrT_refFName( StrStart );
\r
4300 if ( p > StrStart ) p--;
\r
4304 /*
\83\8b\81[
\83g
\82È
\82ç \
\82ð
\95t
\82¯
\82é */
\r
4305 if ( p == StrStart + 2 ) {
\r
4306 *p = _T('\\'); p++; *p = _T('\0');
\r
4309 if ( out_StrLast != NULL ) *out_StrLast = p;
\r
4315 err: e = E_OTHERS; goto fin;
\r
4320 /***********************************************************************
\r
4321 <<< [StrT_isOverOfFileName] >>>
\r
4322 - "" or "\" or "/"
\r
4323 ************************************************************************/
\r
4324 inline bool StrT_isOverOfFileName( const TCHAR* PointerInPath )
\r
4326 return PointerInPath == NULL ||
\r
4327 *PointerInPath == _T('\0') ||
\r
4328 ( ( *PointerInPath == _T('\\') || *PointerInPath == _T('/') ) &&
\r
4329 *(PointerInPath + 1) == _T('\0') );
\r
4334 /***********************************************************************
\r
4335 <<< [StrT_getStepPath] >>>
\r
4336 ************************************************************************/
\r
4337 errnum_t StrT_getStepPath( TCHAR* out_StepPath, size_t StepPathSize,
\r
4338 const TCHAR* FullPath, const TCHAR* BasePath )
\r
4341 const TCHAR* abs_pointer;
\r
4342 const TCHAR* base_pointer;
\r
4346 const TCHAR* abs_separator_pointer = (const TCHAR*) DUMMY_INITIAL_VALUE;
\r
4347 const TCHAR* base_separator_pointer = (const TCHAR*) DUMMY_INITIAL_VALUE;
\r
4348 TCHAR* step_pointer;
\r
4349 TCHAR parent_symbol[4] = { _T('.'), _T('.'), _T('\\'), _T('\0') };
\r
4350 TCHAR base_path_2[ MAX_PATH ];
\r
4353 ASSERT_D( out_StepPath != FullPath, goto err );
\r
4355 abs_pointer = FullPath;
\r
4358 /* Set "base_pointer" */
\r
4359 if ( BasePath == NULL ) {
\r
4360 base_pointer = _tgetcwd( base_path_2, _countof(base_path_2) );
\r
4361 IF( base_pointer == NULL ) {goto err;}
\r
4364 base_pointer = BasePath;
\r
4368 /* Set "abs_separator_pointer", "base_separator_pointer" : after same parent folder path */
\r
4370 for (;;) { /* while abs_char == base_char */
\r
4371 abs_char = *abs_pointer;
\r
4372 base_char = *base_pointer;
\r
4374 abs_char = (TCHAR) _totlower( abs_char );
\r
4375 base_char = (TCHAR) _totlower( base_char );
\r
4377 if ( abs_char == _T('\0') ) {
\r
4379 /* out_StepPath = ".", if FullPath == BasePath */
\r
4380 if ( base_char == _T('\0') ) {
\r
4381 e= StrT_cpy( out_StepPath, StepPathSize, _T(".") ); IF(e)goto fin;
\r
4386 if ( base_char == _T('\0') ) { break; }
\r
4388 if ( abs_char != base_char ) {
\r
4389 if ( ( abs_char == _T('/') || abs_char == _T('\\') ) &&
\r
4390 ( base_char == _T('/') || base_char == _T('\\') ) )
\r
4391 { /* Do nothing */ }
\r
4396 /* Set "separator", "abs_separator_pointer", "base_separator_pointer" */
\r
4397 if ( base_char == _T('/') || base_char == _T('\\') ) {
\r
4398 if ( separator == 0 )
\r
4399 { separator = base_char; }
\r
4401 abs_separator_pointer = abs_pointer;
\r
4402 base_separator_pointer = base_pointer;
\r
4406 base_pointer += 1;
\r
4410 /* FullPath
\82Æ BasePath
\82Ì
\8aÖ
\8cW
\82ª
\81A
\95Ð
\95û
\82Ì
\88ê
\95\94\82ª
\82à
\82¤
\95Ð
\95û
\82Ì
\91S
\91Ì
\82Å
\82 \82é
\82Æ
\82« */
\r
4411 if ( abs_char == _T('/') || abs_char == _T('\\') ||
\r
4412 base_char == _T('/') || base_char == _T('\\') ) {
\r
4413 /* other character is '\0' */
\r
4415 if ( separator == 0 )
\r
4416 { separator = abs_char; }
\r
4418 abs_separator_pointer = abs_pointer;
\r
4419 base_separator_pointer = base_pointer;
\r
4423 /* out_StepPath = FullPath, if there is not same folder */
\r
4424 if ( separator == 0 ) {
\r
4425 e= StrT_cpy( out_StepPath, StepPathSize, FullPath ); IF(e)goto fin;
\r
4430 /* Add "..\" to "out_StepPath" */
\r
4431 parent_symbol[2] = separator;
\r
4432 step_pointer = out_StepPath;
\r
4437 if ( StrT_isOverOfFileName( base_separator_pointer ) )
\r
4441 /* Set "base_separator_pointer" : next separator */
\r
4442 p1 = _tcschr( base_separator_pointer + 1, _T('/') );
\r
4443 p2 = _tcschr( base_separator_pointer + 1, _T('\\') );
\r
4445 if ( p1 == NULL ) {
\r
4447 { base_separator_pointer = NULL; }
\r
4449 { base_separator_pointer = p2; }
\r
4452 if ( p2 == NULL ) {
\r
4453 base_separator_pointer = p1;
\r
4456 { base_separator_pointer = p1; }
\r
4458 { base_separator_pointer = p2; }
\r
4463 /* Add "..\" to "out_StepPath" */
\r
4464 e= stcpy_part_r( out_StepPath, StepPathSize, step_pointer, &step_pointer,
\r
4465 parent_symbol, NULL ); IF(e)goto fin;
\r
4469 /* Copy a part of "FullPath" to "out_StepPath" */
\r
4470 if ( StrT_isOverOfFileName( abs_separator_pointer ) ) {
\r
4471 ASSERT_D( step_pointer > out_StepPath, goto err );
\r
4472 *( step_pointer - 1 ) = _T('\0');
\r
4475 e= stcpy_part_r( out_StepPath, StepPathSize, step_pointer, NULL,
\r
4476 abs_separator_pointer + 1, NULL ); IF(e)goto fin;
\r
4483 err: e = E_OTHERS; goto fin;
\r
4488 /***********************************************************************
\r
4489 <<< [StrT_getBaseName_part] >>>
\r
4490 ************************************************************************/
\r
4491 errnum_t StrT_getBaseName_part( TCHAR* Str, size_t StrSize, TCHAR* StrStart,
\r
4492 TCHAR** out_StrLast, const TCHAR* SrcPath )
\r
4499 p1 = StrT_refFName( SrcPath );
\r
4502 //=== #
\82ª
\96³
\82¢
\82Æ
\82«
\81A
\8dÅ
\8cã
\82Ì
\83s
\83\8a\83I
\83h
\82Ì
\91O
\82Ü
\82Å
\82ª
\81ABaseName
\r
4503 ps = _tcschr( p1, _T('#') );
\r
4504 if ( ps == NULL ) {
\r
4505 p2 = _tcsrchr( p1, _T('.') );
\r
4506 if ( p2 == NULL ) p2 = _tcsrchr( p1, _T('\0') );
\r
4509 //=== #
\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
4515 p3 = _tcschr( p3, _T('.') );
\r
4516 if ( p3 == NULL || p3 > ps ) break;
\r
4522 return stcpy_part_r( Str, StrSize, StrStart, out_StrLast, p1, p2 );
\r
4526 /***********************************************************************
\r
4527 <<< [StrT_addLastOfFileName] >>>
\r
4528 ************************************************************************/
\r
4529 errnum_t StrT_addLastOfFileName( TCHAR* out_Path, size_t PathSize,
\r
4530 const TCHAR* BasePath, const TCHAR* AddName )
\r
4536 const TCHAR* last_pos_in_base = _tcschr( BasePath, _T('\0') );
\r
4537 const TCHAR* term_pos_in_base;
\r
4538 const TCHAR* add_pos_in_base;
\r
4539 const TCHAR* period_pos_in_base = _tcsrchr( BasePath, _T('.') ); // > term_pos_in_base
\r
4540 const TCHAR* last_pos_in_add = _tcschr( AddName, _T('\0') );
\r
4541 const TCHAR* term_pos_in_add;
\r
4542 const TCHAR* period_pos_in_add = _tcsrchr( AddName, _T('.') ); // > term_pos_in_add
\r
4545 DISCARD_BYTES( out_Path, PathSize );
\r
4548 //=== term_pos_in_base
\r
4549 for ( term_pos_in_base = last_pos_in_base; term_pos_in_base >= BasePath; term_pos_in_base -- ) {
\r
4550 c = *term_pos_in_base;
\r
4551 if ( c == _T('/') || c == _T('\\') ) break;
\r
4555 //=== term_pos_in_add
\r
4556 for ( term_pos_in_add = last_pos_in_add; term_pos_in_add >= AddName; term_pos_in_add -- ) {
\r
4557 c = *term_pos_in_add;
\r
4558 if ( c == _T('/') || c == _T('\\') ) break;
\r
4562 //=== add_pos_in_base
\r
4563 if ( term_pos_in_base < period_pos_in_base ) {
\r
4564 add_pos_in_base = period_pos_in_base;
\r
4567 if ( term_pos_in_base < BasePath )
\r
4568 add_pos_in_base = _tcschr( BasePath, _T('\0') );
\r
4570 add_pos_in_base = _tcschr( term_pos_in_base, _T('\0') );
\r
4574 //=== setup output parameters
\r
4575 out_pos = (char*) out_Path;
\r
4576 free_size = PathSize;
\r
4579 //=== copy BasePath .. add_pos_in_base
\r
4580 copy_size = (char*)add_pos_in_base - (char*)BasePath;
\r
4581 if ( copy_size > free_size ) goto err_fa;
\r
4582 memcpy( out_pos, BasePath, copy_size );
\r
4583 out_pos += copy_size;
\r
4584 free_size -= copy_size;
\r
4587 //=== copy AddName .. last_pos_in_add
\r
4588 copy_size = (char*)last_pos_in_add - (char*)AddName;
\r
4589 if ( copy_size > free_size ) goto err_fa;
\r
4590 memcpy( out_pos, AddName, copy_size );
\r
4591 out_pos += copy_size;
\r
4592 free_size -= copy_size;
\r
4595 //=== add name and not change extension
\r
4596 if ( period_pos_in_add == NULL ) {
\r
4598 //=== copy period_pos_in_base .. last_pos_in_base
\r
4599 if ( period_pos_in_base > term_pos_in_base ) {
\r
4600 copy_size = (char*)last_pos_in_base - (char*)period_pos_in_base + sizeof(TCHAR);
\r
4601 if ( copy_size > free_size ) goto err_fa;
\r
4602 memcpy( out_pos, period_pos_in_base, copy_size );
\r
4605 *(TCHAR*)out_pos = _T('\0');
\r
4610 //=== add name and change extension
\r
4613 if ( *(period_pos_in_add + 1) == _T('\0') )
\r
4614 *( (TCHAR*)out_pos - 1 ) = _T('\0');
\r
4616 *(TCHAR*)out_pos = _T('\0');
\r
4622 return E_FEW_ARRAY;
\r
4627 /***********************************************************************
\r
4628 <<< [Strs_init] >>>
\r
4629 ************************************************************************/
\r
4630 enum { Strs_FirstSize = 0x0F00 };
\r
4632 errnum_t Strs_init( Strs* self )
\r
4636 self->MemoryAddress = NULL;
\r
4638 p = (char*) malloc( Strs_FirstSize );
\r
4639 IF( p == NULL ) return E_FEW_MEMORY;
\r
4641 self->MemoryAddress = p;
\r
4642 self->MemoryOver = p + Strs_FirstSize;
\r
4643 self->NextElem = p + sizeof(TCHAR*);
\r
4644 self->PointerToNextStrInPrevElem = (TCHAR**) p;
\r
4645 self->Prev_PointerToNextStrInPrevElem = NULL;
\r
4646 *(TCHAR**) p = NULL;
\r
4648 self->FirstOfStrs = self;
\r
4649 self->NextStrs = NULL;
\r
4656 /***********************************************************************
\r
4657 <<< [Strs_finish] >>>
\r
4658 ************************************************************************/
\r
4659 errnum_t Strs_finish( Strs* self, errnum_t e )
\r
4664 if ( self->MemoryAddress == NULL ) return 0;
\r
4666 mp = self->FirstOfStrs;
\r
4668 free( mp->MemoryAddress );
\r
4669 if ( mp == self ) break;
\r
4671 next_mp = mp->NextStrs;
\r
4675 self->MemoryAddress = NULL;
\r
4682 /***********************************************************************
\r
4683 <<< [Strs_toEmpty] >>>
\r
4684 ************************************************************************/
\r
4685 errnum_t Strs_toEmpty( Strs* self )
\r
4687 Strs_finish( self, 0 );
\r
4688 return Strs_init( self );
\r
4693 /***********************************************************************
\r
4694 <<< [Strs_add] >>>
\r
4695 ************************************************************************/
\r
4696 errnum_t Strs_add( Strs* self, const TCHAR* Str, const TCHAR** out_AllocStr )
\r
4698 return Strs_addBinary( self, Str, _tcschr( Str, _T('\0') ) + 1, out_AllocStr );
\r
4702 errnum_t Strs_addBinary( Strs* self, const TCHAR* Str, const TCHAR* StrOver, const TCHAR** out_AllocStr )
\r
4708 str_size = ( (char*) StrOver - (char*) Str );
\r
4709 elem_size = ( sizeof(TCHAR*) + str_size + sizeof(void*) - 1 ) & ~(sizeof(void*) - 1);
\r
4711 if ( self->NextElem + elem_size > self->MemoryOver )
\r
4712 { e= Strs_expandSize( self, str_size ); IF(e)goto fin; }
\r
4716 // [ FirstStr | NULL | TCHAR[] | ... ]
\r
4717 // [ FirstStr | NextStr | TCHAR[] | NULL | TCHAR[] | ... ]
\r
4718 // [ FirstStr | NextStr | TCHAR[] | NextStr | TCHAR[] ], [ NULL | TCHAR[] | ... ]
\r
4720 if ( out_AllocStr != NULL ) *out_AllocStr = (TCHAR*)( self->NextElem + sizeof(TCHAR*) );
\r
4723 *(TCHAR**) self->NextElem = NULL;
\r
4724 memcpy( self->NextElem + sizeof(TCHAR*), Str, str_size );
\r
4726 //=== link to elem from previous elem
\r
4727 *self->PointerToNextStrInPrevElem = (TCHAR*)( self->NextElem + sizeof(TCHAR*) );
\r
4730 self->Prev_PointerToNextStrInPrevElem = self->PointerToNextStrInPrevElem;
\r
4731 self->PointerToNextStrInPrevElem = (TCHAR**) self->NextElem;
\r
4732 self->NextElem = self->NextElem + elem_size;
\r
4741 /***********************************************************************
\r
4742 <<< [Strs_freeLast] >>>
\r
4743 ************************************************************************/
\r
4744 errnum_t Strs_freeLast( Strs* self, TCHAR* AllocStr )
\r
4749 TCHAR* prev_of_last_str;
\r
4751 Strs* prev_of_last_mp;
\r
4753 if ( self->Prev_PointerToNextStrInPrevElem == NULL ) {
\r
4754 prev_of_last_str = NULL;
\r
4756 for ( Strs_forEach( self, &str ) ) {
\r
4757 prev_of_last_str = last_str;
\r
4762 prev_of_last_str = (TCHAR*)( self->Prev_PointerToNextStrInPrevElem + 1 );
\r
4763 last_str = (TCHAR*)( self->PointerToNextStrInPrevElem + 1 );
\r
4767 IF( last_str != AllocStr ) {goto err;}
\r
4769 // [ FirstStr | NULL | TCHAR[] | ... ]
\r
4770 if ( prev_of_last_str == NULL ) {
\r
4771 self->NextElem = self->MemoryAddress + sizeof(TCHAR*);
\r
4772 self->PointerToNextStrInPrevElem = (TCHAR**) self->MemoryAddress;
\r
4775 // [ FirstStr | NextStr | TCHAR[] | NULL | TCHAR[] | ... ]
\r
4776 else if ( (char*) prev_of_last_str >= self->MemoryAddress &&
\r
4777 (char*) prev_of_last_str < self->MemoryOver ) {
\r
4778 self->NextElem = (char*)last_str - sizeof(TCHAR*);
\r
4779 self->PointerToNextStrInPrevElem = (TCHAR**)( (char*)prev_of_last_str - sizeof(TCHAR*) );
\r
4782 // [ FirstStr | NextStr | TCHAR[] | NextStr | TCHAR[] ], [ NULL | TCHAR[] | ... ]
\r
4784 prev_of_last_mp = NULL;
\r
4785 for ( mp = self->FirstOfStrs; mp->NextStrs != self; mp = mp->NextStrs ) {
\r
4786 prev_of_last_mp = mp;
\r
4789 free( self->MemoryAddress );
\r
4793 if ( prev_of_last_mp == NULL ) {
\r
4794 self->FirstOfStrs = self;
\r
4795 self->NextStrs = NULL;
\r
4798 prev_of_last_mp->NextStrs = self;
\r
4803 *self->PointerToNextStrInPrevElem = NULL;
\r
4804 self->Prev_PointerToNextStrInPrevElem = NULL;
\r
4810 err: e = E_OTHERS; goto fin;
\r
4815 /***********************************************************************
\r
4816 <<< [Strs_expandSize] >>>
\r
4817 ************************************************************************/
\r
4818 errnum_t Strs_expandSize( Strs* self, size_t FreeSize )
\r
4822 size_t elem_size = ( sizeof(TCHAR*) + FreeSize + sizeof(void*) - 1 ) & ~(sizeof(void*) - 1);
\r
4823 size_t memory_size;
\r
4827 // [ FirstStr | NULL | TCHAR[] | ... ]
\r
4828 // [ FirstStr | NextStr | TCHAR[] | NULL | TCHAR[] | ... ]
\r
4829 // [ FirstStr | NextStr | TCHAR[] | NextStr | TCHAR[] ], [ NULL | TCHAR[] | ... ]
\r
4831 while ( self->NextElem + elem_size > self->MemoryOver ) {
\r
4834 mp = (Strs*) malloc( sizeof(Strs) ); IF(mp==NULL) goto err_fm;
\r
4835 memory_size = ( self->MemoryOver - self->MemoryAddress ) * 2;
\r
4836 new_memory = (char*) malloc( memory_size );
\r
4837 IF( new_memory == NULL ) { free( mp ); goto err_fm; }
\r
4839 //=== move old memory
\r
4840 if ( self->FirstOfStrs == self ) {
\r
4841 self->FirstOfStrs = mp;
\r
4844 for ( mp2 = self->FirstOfStrs; mp2->NextStrs != self; mp2 = mp2->NextStrs );
\r
4845 mp2->NextStrs = mp;
\r
4848 mp->NextStrs = self;
\r
4850 //=== setup new memory
\r
4851 self->MemoryAddress = new_memory;
\r
4852 self->MemoryOver = new_memory + memory_size;
\r
4853 self->NextElem = new_memory;
\r
4854 // self->PointerToNextStrInPrevElem is same value
\r
4855 // self->FirstOfStrs is same value
\r
4856 // self->NextStrs is always NULL
\r
4860 err_fm: return E_FEW_ARRAY;
\r
4864 /***********************************************************************
\r
4865 <<< [Strs_commit] >>>
\r
4866 ************************************************************************/
\r
4867 errnum_t Strs_commit( Strs* self, TCHAR* StrOver )
\r
4871 if ( StrOver == NULL )
\r
4872 { StrOver = _tcschr( (TCHAR*)( self->NextElem + sizeof(TCHAR*) ), _T('\0') ) + 1; }
\r
4873 elem_size = ( ( (char*)StrOver - self->NextElem ) + sizeof(void*) - 1 ) & ~(sizeof(void*) - 1);
\r
4876 *(TCHAR**) self->NextElem = NULL;
\r
4878 //=== link to elem from previous elem
\r
4879 *self->PointerToNextStrInPrevElem = (TCHAR*)( self->NextElem + sizeof(TCHAR*) );
\r
4882 self->PointerToNextStrInPrevElem = (TCHAR**) self->NextElem;
\r
4883 self->NextElem = self->NextElem + elem_size;
\r
4890 /***********************************************************************
\r
4892 ************************************************************************/
\r
4895 errnum_t StrArr_init( StrArr* self )
\r
4899 Set2_initConst( &self->Array );
\r
4900 Strs_initConst( &self->Chars );
\r
4902 e= Set2_init( &self->Array, 0x100 ); IF(e)goto cancel;
\r
4903 e= Strs_init( &self->Chars ); IF(e)goto cancel;
\r
4906 cancel: StrArr_finish( self, e ); return e;
\r
4910 /*[StrArr_finish]*/
\r
4911 errnum_t StrArr_finish( StrArr* self, errnum_t e )
\r
4913 if ( ! Set2_isInited( &self->Array ) ) return e;
\r
4915 e= Set2_finish( &self->Array, e );
\r
4916 e= Strs_finish( &self->Chars, e );
\r
4922 errnum_t StrArr_add( StrArr* self, const TCHAR* Str, int* out_I )
\r
4926 e= StrArr_expandCount( self, _tcslen( Str ) ); IF(e)goto fin;
\r
4927 _tcscpy_s( StrArr_getFreeAddr( self ), StrArr_getFreeCount( self ), Str );
\r
4928 e= StrArr_commit( self ); IF(e)goto fin;
\r
4929 if ( out_I != NULL ) *out_I = Set2_getCount( &self->Array, TCHAR* ) - 1;
\r
4937 /*[StrArr_commit]*/
\r
4938 errnum_t StrArr_commit( StrArr* self )
\r
4942 TCHAR** pp = NULL;
\r
4943 Set2* arr = &self->Array;
\r
4944 Strs* ss = &self->Chars;
\r
4946 p = Strs_getFreeAddr( ss );
\r
4947 e= Set2_alloc( arr, &pp, TCHAR* ); IF(e)goto fin;
\r
4948 e= Strs_commit( ss, NULL ); IF(e)goto fin;
\r
4953 if ( e && pp != NULL ) e= Set2_freeLast( arr, pp, TCHAR*, e );
\r
4958 /*[StrArr_fillTo]*/
\r
4959 errnum_t StrArr_fillTo( StrArr* self, int n, const TCHAR* Str )
\r
4964 const TCHAR** pp_over;
\r
4966 n -= Set2_getCount( &self->Array, TCHAR* );
\r
4967 if ( n <= 0 ) return 0;
\r
4969 if ( Str == NULL ) {
\r
4973 e= Strs_add( &self->Chars, Str, &p ); IF(e)goto fin;
\r
4976 e= Set2_allocMulti( &self->Array, &pp, TCHAR*, n ); IF(e)goto fin;
\r
4978 for ( ; pp < pp_over; pp++ )
\r
4987 /*[StrArr_toEmpty]*/
\r
4988 errnum_t StrArr_toEmpty( StrArr* self )
\r
4993 ee= Set2_toEmpty( &self->Array ); IF(ee&&!e)e=ee;
\r
4994 ee= Strs_toEmpty( &self->Chars ); IF(ee&&!e)e=ee;
\r
5000 /***********************************************************************
\r
5001 <<< [StrArr_parseCSV] >>>
\r
5002 ************************************************************************/
\r
5003 errnum_t StrArr_parseCSV( StrArr* self, const TCHAR* CSVLine )
\r
5006 const TCHAR* p = CSVLine;
\r
5008 e= StrArr_toEmpty( self ); IF(e)goto fin;
\r
5011 e= StrT_meltCSV( StrArr_getFreeAddr( self ), StrArr_getFreeSize( self ), &p );
\r
5012 if ( e == E_FEW_ARRAY ) {
\r
5013 e= StrArr_expandSize( self, StrArr_getFreeSize( self ) * 2 ); IF(e)goto fin;
\r
5018 e = StrArr_commit( self ); IF(e)goto fin;
\r
5019 } while ( p != NULL );
\r
5028 /*=================================================================*/
\r
5029 /* <<< [DebugTools/DebugTools.c] >>> */
\r
5030 /*=================================================================*/
\r
5032 /***********************************************************************
\r
5033 <<< [TestableDebugBreak] >>>
\r
5034 ************************************************************************/
\r
5035 typedef struct _TestableDebugBreakClass TestableDebugBreakClass;
\r
5036 struct _TestableDebugBreakClass {
\r
5037 bool IsDisableTestableDebugBreak;
\r
5038 volatile int DebugBreakCount;
\r
5039 CRITICAL_SECTION Critical;
\r
5040 SingletonInitializerClass Initializer;
\r
5042 static TestableDebugBreakClass gs_TestableDebugBreak = { false, 0 };
\r
5045 /*[SetTestableDebugBreak]*/
\r
5046 void SetTestableDebugBreak( bool IsEnableBreak )
\r
5048 TestableDebugBreakClass* self = &gs_TestableDebugBreak;
\r
5049 self->IsDisableTestableDebugBreak = ! IsEnableBreak;
\r
5052 /*[TestableDebugBreak_Sub]*/
\r
5053 int TestableDebugBreak_Sub()
\r
5055 TestableDebugBreakClass* self = &gs_TestableDebugBreak;
\r
5057 if ( ! SingletonInitializerClass_isInitialized( &self->Initializer ) ) {
\r
5058 if ( SingletonInitializerClass_isFirst( &self->Initializer ) ) {
\r
5060 InitializeCriticalSection( &self->Critical );
\r
5062 SingletonInitializerClass_onFinishedInitialize( &self->Initializer, 0 );
\r
5066 EnterCriticalSection( &self->Critical );
\r
5067 self->DebugBreakCount += 1;
\r
5068 LeaveCriticalSection( &self->Critical );
\r
5070 return ! self->IsDisableTestableDebugBreak;
\r
5073 /*[GetDebugBreakCount]*/
\r
5074 int GetDebugBreakCount()
\r
5076 TestableDebugBreakClass* self = &gs_TestableDebugBreak;
\r
5077 return self->DebugBreakCount;
\r
5082 /*=================================================================*/
\r
5083 /* <<< [SetX/SetX.c] >>> */
\r
5084 /*=================================================================*/
\r
5086 /***********************************************************************
\r
5087 <<< [Set2_init] >>>
\r
5088 ************************************************************************/
\r
5089 int Set2_init( Set2* m, int FirstSize )
\r
5091 m->First = malloc( FirstSize );
\r
5092 if ( m->First == NULL ) return E_FEW_MEMORY;
\r
5093 m->Next = m->First;
\r
5094 m->Over = (char*)m->First + FirstSize;
\r
5097 m->PointerOfDebugArray = NULL;
\r
5103 /***********************************************************************
\r
5104 <<< [Set2_finish] >>>
\r
5105 ************************************************************************/
\r
5106 int Set2_finish( Set2* m, int e )
\r
5108 if ( m->First != NULL ) { free( m->First ); m->First = NULL; }
\r
5113 /***********************************************************************
\r
5114 <<< [Set2_ref_imp] >>>
\r
5115 ************************************************************************/
\r
5116 int Set2_ref_imp( Set2* m, int iElem, void* out_pElem, size_t ElemSize )
\r
5121 IF( iElem < 0 ) goto err_ns;
\r
5122 p = (char*) m->First + ( (unsigned)iElem * ElemSize );
\r
5123 IF( p >= (char*)m->Next ) goto err_ns;
\r
5124 *(char**)out_pElem = p;
\r
5130 err_ns: e = E_NOT_FOUND_SYMBOL; goto fin;
\r
5135 /***********************************************************************
\r
5136 <<< [Set2_getIterator] >>>
\r
5137 ************************************************************************/
\r
5138 errnum_t Set2_getIterator( Set2* self, Set2_IteratorClass* out_Iterator, int ElementSize )
\r
5140 out_Iterator->Parent = self;
\r
5141 out_Iterator->ElementSize = ElementSize;
\r
5142 out_Iterator->Current = (uint8_t*) self->First - ElementSize;
\r
5148 /***********************************************************************
\r
5149 <<< [Set2_getDescendingIterator] >>>
\r
5150 ************************************************************************/
\r
5151 errnum_t Set2_getDescendingIterator( Set2* self, Set2_IteratorClass* out_Iterator, int ElementSize )
\r
5153 out_Iterator->Parent = self;
\r
5154 out_Iterator->ElementSize = ElementSize;
\r
5155 out_Iterator->Current = (uint8_t*) self->Next;
\r
5161 /***********************************************************************
\r
5162 <<< [Set2_IteratorClass_getNext] >>>
\r
5163 ************************************************************************/
\r
5164 void* Set2_IteratorClass_getNext( Set2_IteratorClass* self )
\r
5166 uint8_t* next = self->Current + self->ElementSize;
\r
5168 if ( next >= (uint8_t*) self->Parent->Next ) {
\r
5171 self->Current = next;
\r
5178 /***********************************************************************
\r
5179 <<< [Set2_IteratorClass_getPrevious] >>>
\r
5180 ************************************************************************/
\r
5181 void* Set2_IteratorClass_getPrevious( Set2_IteratorClass* self )
\r
5183 uint8_t* previous = self->Current - self->ElementSize;
\r
5185 if ( previous < (uint8_t*) self->Parent->First ) {
\r
5188 self->Current = previous;
\r
5195 /***********************************************************************
\r
5196 <<< [Set2_alloc_imp] >>>
\r
5197 ************************************************************************/
\r
5198 int Set2_alloc_imp( Set2* m, void* pp, size_t size )
\r
5202 e= Set2_expandIfOverByAddr( m, (char*) m->Next + size ); IF(e)goto fin;
\r
5203 *(void**)pp = m->Next;
\r
5204 m->Next = (char*) m->Next + size;
\r
5206 DISCARD_BYTES( *(void**)pp, size );
\r
5214 int Set2_allocMulti_sub( Set2* m, void* out_pElem, size_t ElemsSize )
\r
5219 e= Set2_expandIfOverByAddr( m, (char*) m->Next + ElemsSize ); IF(e)goto fin;
\r
5220 p = (char*) m->Next;
\r
5221 m->Next = p + ElemsSize;
\r
5222 *(char**)out_pElem = p;
\r
5231 /***********************************************************************
\r
5232 <<< [Set2_expandIfOverByAddr_imp] >>>
\r
5233 ************************************************************************/
\r
5234 errnum_t Set2_expandIfOverByAddr_imp( Set2* m, void* OverAddrBasedOnNowFirst )
\r
5238 unsigned offset_of_over;
\r
5239 unsigned offset_of_next;
\r
5241 if ( OverAddrBasedOnNowFirst <= m->Over ) { e=E_OTHERS; goto fin; }
\r
5243 offset_of_next = (unsigned)( (char*)OverAddrBasedOnNowFirst - (char*)m->First );
\r
5244 offset_of_over = (unsigned)( ( (char*)m->Over - (char*)m->First ) ) * 2;
\r
5245 IF_D( offset_of_next >= 0x80000000 ) { e=E_OTHERS; goto fin; }
\r
5246 IF_D( offset_of_over == 0 ) { e=E_OTHERS; goto fin; }
\r
5247 while ( offset_of_over < offset_of_next ) { offset_of_over *= 2; }
\r
5248 IF( offset_of_over >= 0x10000000 ) { e=E_OTHERS; goto fin; }
\r
5250 new_first = realloc( m->First, offset_of_over * 2 );
\r
5251 IF( new_first == NULL ) { e=E_FEW_MEMORY; goto fin; }
\r
5253 m->Next = (char*) new_first + ( (char*)m->Next - (char*)m->First );
\r
5254 m->Over = (char*) new_first + offset_of_over * 2;
\r
5255 m->First = new_first;
\r
5258 if ( m->PointerOfDebugArray != NULL )
\r
5259 { *m->PointerOfDebugArray = m->First; }
\r
5269 /***********************************************************************
\r
5270 <<< [Set2_separate] >>>
\r
5271 ************************************************************************/
\r
5272 int Set2_separate( Set2* m, int NextSize, void** allocate_Array )
\r
5275 void* p = m->First;
\r
5277 if ( NextSize == 0 ) {
\r
5281 e= Set2_init( m, NextSize ); IF(e)goto fin;
\r
5283 *allocate_Array = p;
\r
5292 /***********************************************************************
\r
5293 <<< [Set2_pop_imp] >>>
\r
5294 ************************************************************************/
\r
5295 int Set2_pop_imp( Set2* m, void* pp, size_t size )
\r
5300 p = (char*) m->Next - size;
\r
5302 IF ( p < m->First ) { e=E_OTHERS; goto fin; }
\r
5314 /***********************************************************************
\r
5315 <<< [Set2_setDebug] >>>
\r
5316 ************************************************************************/
\r
5318 void Set2_setDebug( Set2* m, void* PointerOfDebugArray )
\r
5320 m->PointerOfDebugArray = (void**) PointerOfDebugArray;
\r
5321 *m->PointerOfDebugArray = m->First;
\r
5327 /***********************************************************************
\r
5328 <<< (Variant_SuperClass) >>>
\r
5329 ************************************************************************/
\r
5330 static const ClassID_Class* gs_Variant_SuperClass_SuperClassIDs[] = {
\r
5331 &g_ClassID_SuperClass_ID, &g_Variant_SuperClass_ID,
\r
5334 /*[g_Variant_SuperClass_ID]*/
\r
5335 const ClassID_Class g_Variant_SuperClass_ID = {
\r
5336 "Variant_SuperClass",
\r
5337 gs_Variant_SuperClass_SuperClassIDs,
\r
5338 _countof( gs_Variant_SuperClass_SuperClassIDs ),
\r
5339 sizeof( Variant_SuperClass ),
\r
5340 Variant_SuperClass_initialize,
\r
5346 /*[Variant_SuperClass_initialize]*/
\r
5347 errnum_t Variant_SuperClass_initialize( Variant_SuperClass* self, void* Parameter )
\r
5349 self->ClassID = &g_Variant_SuperClass_ID;
\r
5350 self->FinalizerVTable = NULL;
\r
5351 self->StaticAddress = NULL;
\r
5352 UNREFERENCED_VARIABLE( Parameter );
\r
5358 /*=================================================================*/
\r
5359 /* <<< [Print/Print2.c] >>> */
\r
5360 /*=================================================================*/
\r
5362 /***********************************************************************
\r
5363 <<< [PrintfCounterClass] >>>
\r
5364 ************************************************************************/
\r
5365 #if USE_PRINTF_COUNTER
\r
5366 PrintfCounterClass g_PrintfCounter;
\r
5371 /***********************************************************************
\r
5372 <<< [printf_to_debugger] >>>
\r
5373 ************************************************************************/
\r
5375 void printf_to_debugger( const char* format, ... )
\r
5380 va_start( va, format );
\r
5381 vsprintf_r( s, sizeof(s), format, va );
\r
5384 OutputDebugStringA( s );
\r
5390 /***********************************************************************
\r
5391 <<< [wprintf_to_debugger] >>>
\r
5392 ************************************************************************/
\r
5394 void wprintf_to_debugger( const wchar_t* format, ... )
\r
5399 va_start( va, format );
\r
5400 vswprintf_r( s, sizeof(s), format, va );
\r
5403 OutputDebugStringW( s );
\r
5409 /***********************************************************************
\r
5410 <<< [vsprintf_r] >>>
\r
5411 ************************************************************************/
\r
5412 errnum_t vsprintf_r( char* s, size_t s_size, const char* format, va_list va )
\r
5415 #pragma warning(push)
\r
5416 #pragma warning(disable: 4996)
\r
5419 int r = _vsnprintf( s, s_size, format, va );
\r
5422 #pragma warning(pop)
\r
5425 IF( r == (int) s_size )
\r
5426 { s[s_size-1] = '\0'; return E_FEW_ARRAY; }
\r
5428 { return E_NOT_FOUND_SYMBOL; } /* Bad character code */
\r
5435 /***********************************************************************
\r
5436 <<< [vswprintf_r] >>>
\r
5437 ************************************************************************/
\r
5439 errnum_t vswprintf_r( wchar_t* s, size_t s_size, const wchar_t* format, va_list va )
\r
5441 size_t tsize = s_size / sizeof(wchar_t);
\r
5443 #pragma warning(push)
\r
5444 #pragma warning(disable: 4996)
\r
5445 int r = _vsnwprintf( s, tsize, format, va );
\r
5446 #pragma warning(pop)
\r
5448 if ( r == (int) tsize || r == -1 ) { s[tsize-1] = '\0'; return E_FEW_ARRAY; }
\r
5455 /***********************************************************************
\r
5456 <<< [stprintf_r] >>>
\r
5457 ************************************************************************/
\r
5458 errnum_t stprintf_r( TCHAR* s, size_t s_size, const TCHAR* format, ... )
\r
5463 va_start( va, format );
\r
5464 e = vstprintf_r( s, s_size, format, va );
\r
5471 /***********************************************************************
\r
5472 <<< [stcpy_part_r] >>>
\r
5473 ************************************************************************/
\r
5474 errnum_t stcpy_part_r( TCHAR* s, size_t s_size, TCHAR* s_start, TCHAR** p_s_last,
\r
5475 const TCHAR* src, const TCHAR* src_over )
\r
5477 size_t s_space = (char*)s + s_size - (char*)s_start;
\r
5480 IF_D( s_start < s || (char*)s_start >= (char*)s + s_size ) { return 1; }
\r
5482 if ( src_over == NULL ) { src_over = _tcschr( src, _T('\0') ); }
\r
5483 src_size = (char*)src_over - (char*)src;
\r
5484 IF ( src_size >= s_space ) {
\r
5485 s_space -= sizeof(TCHAR);
\r
5486 memcpy( s, src, s_space );
\r
5488 s_start = (TCHAR*)((char*)s_start + s_space );
\r
5491 if ( p_s_last != NULL ) { *p_s_last=s_start; }
\r
5492 return E_FEW_ARRAY;
\r
5495 memcpy( s_start, src, src_size + sizeof(TCHAR) );
\r
5496 s_start = (TCHAR*)((char*)s_start + src_size); *s_start = _T('\0');
\r
5497 if ( p_s_last != NULL ) { *p_s_last = s_start; }
\r
5504 /***********************************************************************
\r
5505 <<< [stprintf_part_r] >>>
\r
5506 ************************************************************************/
\r
5507 errnum_t stprintf_part_r( TCHAR* s, size_t s_size, TCHAR* s_start, TCHAR** p_s_last,
\r
5508 const TCHAR* format, ... )
\r
5512 va_start( va, format );
\r
5514 IF_D( s_start < s || (char*)s_start >= (char*)s + s_size ) {return E_OTHERS;}
\r
5516 e = vstprintf_r( s_start, s_size - ( (char*)s_start - (char*)s), format, va );
\r
5517 va_end( va ); if ( p_s_last != NULL ) *p_s_last = _tcschr( s_start, '\0' );
\r
5523 /*=================================================================*/
\r
5524 /* <<< [Lock_1/Lock_1.c] >>> */
\r
5525 /*=================================================================*/
\r
5527 /*-------------------------------------------------------------------------*/
\r
5528 /* <<<< ### (SingletonInitializerClass) implement >>>> */
\r
5529 /*-------------------------------------------------------------------------*/
\r
5532 volatile int g_SingletonInitializerClass_FailSleepTime = SingletonInitializerClass_FailSleepTime;
\r
5535 /*[SingletonInitializerClass_isFirst]*/
\r
5536 bool SingletonInitializerClass_isFirst( SingletonInitializerClass* self )
\r
5539 if ( InterlockedCompareExchange( &self->InitializeStep, 1, 0 ) == 0 ) {
\r
5543 while ( self->InitializeStep == 1 ) {
\r
5544 Sleep( 0 ); /* Wait for initialized by other thread. */
\r
5547 if ( self->InitializeStep == 2 ) {
\r
5551 Sleep( g_SingletonInitializerClass_FailSleepTime );
\r
5552 g_SingletonInitializerClass_FailSleepTime = 0;
\r
5558 /*[SingletonInitializerClass_onFinishedInitialize]*/
\r
5559 void SingletonInitializerClass_onFinishedInitialize( SingletonInitializerClass* self, errnum_t e )
\r
5562 { self->InitializeStep = 2; }
\r
5564 { self->InitializeStep = 0; }
\r
5568 /*[SingletonInitializerClass_isInitialized]*/
\r
5569 bool SingletonInitializerClass_isInitialized( SingletonInitializerClass* self )
\r
5571 return ( self->InitializeStep == 2 );
\r
5575 /*-------------------------------------------------------------------------*/
\r
5576 /* <<< End of Class implement >>> */
\r
5577 /*-------------------------------------------------------------------------*/
\r
5581 /*=================================================================*/
\r
5582 /* <<< [CRT_plus_1/CRT_plus_1.c] >>> */
\r
5583 /*=================================================================*/
\r
5585 /***********************************************************************
\r
5586 <<< [ttoi_ex] >>>
\r
5587 ************************************************************************/
\r
5588 int ttoi_ex( const TCHAR* string, bit_flags_fast32_t options )
\r
5592 UNREFERENCED_VARIABLE( options);
\r
5594 if ( string[0] == _T('0') &&
\r
5595 ( string[1] == _T('x') || string[1] == _T('X') ) )
\r
5597 return_value = (int) _tcstoul( &string[2], NULL, 16 );
\r
5600 return_value = _ttoi( string );
\r
5603 return return_value;
\r
5608 /***********************************************************************
\r
5609 <<< (ClassID_Class) >>>
\r
5610 ************************************************************************/
\r
5612 /*[ClassID_Class_isSuperClass]*/
\r
5613 bool ClassID_Class_isSuperClass( const ClassID_Class* ClassID, const ClassID_Class* SuperClassID )
\r
5615 if ( ClassID == SuperClassID ) {
\r
5621 for ( i = ClassID->SuperClassID_Array_Count - 1; i >= 0; i -= 1 ) {
\r
5622 if ( ClassID->SuperClassID_Array[ i ] == SuperClassID ) {
\r
5631 /*[ClassID_Class_createObject]*/
\r
5632 errnum_t ClassID_Class_createObject( const ClassID_Class* ClassID, void* out_Object, void* Parameter )
\r
5635 ClassID_SuperClass* object = NULL;
\r
5637 e= HeapMemory_allocateBytes( &object, ClassID->Size ); IF(e){goto fin;}
\r
5638 if ( ClassID->InitializeFunction != NULL ) {
\r
5639 e= ClassID->InitializeFunction( object, Parameter ); IF(e){goto fin;}
\r
5642 memset( object, 0, ClassID->Size );
\r
5643 object->ClassID = ClassID;
\r
5645 *(void**) out_Object = object;
\r
5650 if ( object != NULL ) { e= HeapMemory_free( &object, e ); }
\r
5655 /*[ClassID_Class_getVTable]*/
\r
5656 void* ClassID_Class_getVTable( const ClassID_Class* ClassID, const InterfaceID_Class* InterfaceID )
\r
5660 for ( i = ClassID->InterfaceToVTable_Array_Conut - 1; i >= 0; i -= 1 ) {
\r
5661 if ( ClassID->InterfaceToVTable_Array[ i ].InterfaceID == InterfaceID ) {
\r
5662 return (void*) ClassID->InterfaceToVTable_Array[ i ].VTable;
\r
5670 /***********************************************************************
\r
5671 <<< (ClassID_SuperClass) >>>
\r
5672 ************************************************************************/
\r
5674 /*[g_ClassID_SuperClass_ID]*/
\r
5675 const ClassID_Class g_ClassID_SuperClass_ID = {
\r
5676 "ClassID_SuperClass", /* /ClassName */
\r
5677 NULL, /* .SuperClassID_Array */
\r
5678 0, /* .SuperClassID_Array_Count */
\r
5679 sizeof( ClassID_SuperClass ), /* .Size */
\r
5680 NULL, /* .InitializeFunction */
\r
5681 NULL, /* .InterfaceToVTable_Array */
\r
5682 0 /* .InterfaceToVTable_Array_Conut */
\r
5687 /***********************************************************************
\r
5688 <<< (g_FinalizerInterface_ID) >>>
\r
5689 ************************************************************************/
\r
5691 const InterfaceID_Class g_FinalizerInterface_ID = { "FinalizerInterface" };
\r
5696 /***********************************************************************
\r
5697 <<< (g_PrintXML_Interface_ID) >>>
\r
5698 ************************************************************************/
\r
5700 const InterfaceID_Class g_PrintXML_Interface_ID = { "PrintXML_Interface" };
\r