Sym.c
[目次 | 関数]
1|/**************************************************************************
2|* 1. <<< 動的参照シンボル (Sym) >>>
3|***************************************************************************/
4|
5|#include "mixer_precomp.h" /* Auto precompiled header, Look at mixer-... folder */
6|
7|#ifdef USES_MXP_AUTOINC
8| #include "sym.ah" /* Auto include header, Look at mixer-... folder */
9|#endif
10|
11|
12|
13|/*-------------------------------------------------------------------------*/
14|/* 2. <<< ◆(Sym) 動的参照エンジン >>> */
15|/*-------------------------------------------------------------------------*/
16|
17|Sym sym;
18|void* Sym_chker;
19|
20|
21|/***********************************************************************
22|* 3. <<< [Sym_init] 初期化する >>>
23|*【補足】
24|*・m には、sym グローバル変数を使うようにしてください。
25|************************************************************************/
26|void Sym_init( Sym* m )
27|{
28| ERRORS_INITCHK( m, 0 );
29| ERRORS_SINGLETON_FOR_INIT( &Sym_chker, m );
30|
31| ListX_init( &m->vars );
32| ListX_init( &m->structs );
33| ListX_init( &m->funcs );
34| StrX_MemV2_init( &m->sym, 251, StrX_getHashI, false );
35|
36| ERRORS_FINISHCHK_FOR_INIT( Sym_finish );
37|}
38|
39|
40|
41|/***********************************************************************
42|* 4. <<< [Sym_finish] 後始末する >>>
43|************************************************************************/
44|void Sym_finish( Sym* m )
45|{
46| ERRORS_INITCHK( m, 1 );
47| ERRORS_SINGLETON_FOR_FINISH( &Sym_chker, m );
48| ERRORS_FINISHCHK_FOR_FINISH( Sym_finish );
49|
50| ListX_finish2( &m->vars, Sym_Var, NULL );
51| ListX_toEmptyFinish( &m->structs, Sym_Struct, Sym_Struct_finish );
52| ListX_toEmptyFinish( &m->funcs, Sym_Func, Sym_Func_finish );
53| StrX_MemV2_finish( &m->sym );
54|}
55|
56|
57|
58|/***********************************************************************
59|* 5. <<< [Sym_print] デバッグ表示する >>>
60|************************************************************************/
61|#ifndef ERRORS_CUT_DEBUG_TOOL
62|void Sym_print( Sym* m, const char* title )
63|{
64| Sym_Var* var;
65| Sym_Struct* st;
66| Sym_Func* func;
67|
68| ERRORS_INITCHK( m, 1 );
69|
70| for ( ListX_forEach( &m->vars, &var, Sym_Var ) ) {
71| Sym_Var_print( var, title );
72| }
73| for ( ListX_forEach( &m->structs, &st, Sym_Struct ) ) {
74| Sym_Struct_print( st, title );
75| }
76| for ( ListX_forEach( &m->funcs, &func, Sym_Func ) ) {
77| Sym_Func_print( func, title );
78| }
79|}
80|#endif
81|
82|
83|/***********************************************************************
84|* 6. <<< [Sym_registVar] 任意の型の変数を登録する >>>
85|*【引数】
86|* ・char* type; 変数の型名
87|* ・char* name; 変数名
88|* ・void* adr; 変数のアドレス
89|************************************************************************/
90|Sym_Var* Sym_registVar( Sym* m, const char* type, const char* name, void* adr )
91|{
92| Sym_Var* var;
93|
94| ERRORS_INITCHK( m, 1 );
95|
96| var = ListX_addLastMalloc( &m->vars, Sym_Var );
97|
98| Sym_Var_init( var, type, name, adr );
99|
100| return var;
101|}
102|
103|
104|/***********************************************************************
105|* 7. <<< [Sym_registBasicVar] 基本型の変数を登録する >>>
106|*【引数】
107|* ・Sym_Type type; 変数の型
108|* ・char* name; 変数名
109|* ・void* adr; 変数のアドレス
110|************************************************************************/
111|Sym_Var* Sym_registBasicVar( Sym* m, Sym_Type type, const char* name, void* adr )
112|{
113| Sym_Var* var;
114|
115| ERRORS_INITCHK( m, 1 );
116|
117| var = ListX_addLastMalloc( &m->vars, Sym_Var );
118|
119| Sym_Var_initBasic( var, type, name, adr );
120|
121| return var;
122|}
123|
124|
125|/***********************************************************************
126|* 8. <<< [Sym_registStructVar] 構造体変数を登録する >>>
127|*【引数】
128|* ・Sym_Struct* st; 変数の型
129|* ・char* name; 変数名
130|* ・void* adr; 変数のアドレス
131|************************************************************************/
132|Sym_Var* Sym_registStructVar( Sym* m, Sym_Struct* st, const char* name, void* adr )
133|{
134| Sym_Var* var;
135|
136| ERRORS_INITCHK( m, 1 );
137|
138| var = ListX_addLastMalloc( &m->vars, Sym_Var );
139|
140| Sym_Var_initStruct( var, st, name, adr );
141|
142| return var;
143|}
144|
145|
146|/***********************************************************************
147|* 9. <<< [Sym_unregistVar] 構造体変数の登録を解除する >>>
148|*【引数】
149|* ・char* name; 変数名
150|************************************************************************/
151|void Sym_unregistVar( Sym* m, const char* name )
152|{
153| Sym_Var* var;
154|
155| var = Sym_getVar( m, name );
156| ASSERT( var != NULL );
157| ListX_removeFree( &m->vars, var );
158|}
159|
160|
161|/***********************************************************************
162|* 10. <<< [Sym_getRef] 変数を参照するための情報を取得する >>>
163|*【引数】
164|* ・char* href; 参照名
165|* ・Sym_Ref* ref; 変数(出力)
166|*【補足】
167|*・href は、変数名や構造体変数名だけでなく、構造体のメンバ変数も
168|* ピリオド "." や"->"に続けて参照できます。"." と "->" は、
169|* どちらを指定してもかまいません。
170|* 例:"var.member.sub" ... var 構造体の member, sub メンバ
171|*・ref から Sym_Ref クラスの関数を使用して、値や型などを取得できます。
172|************************************************************************/
173|void Sym_getRef( Sym* m, const char* href, Sym_Ref* ref )
174|{
175| Sym_Var* var;
176| char* p;
177| char* p2;
178| int n;
179|
180| ERRORS_INITCHK( m, 1 );
181|
182| {
183| char name[256];
184|
185| /* name を格納する */
186| p = strchr( href, '.' );
187| p2 = strstr( href, "->" );
188| if ( p == NULL || ( p2 != NULL && p2 < p ) ) p = p2;
189| if ( p == NULL ) strcpy( name, href );
190| else {
191| n = p - href;
192| strncpy( name, href, n );
193| name[n] = '\0';
194| }
195|
196| /* 変数または構造体のトップを取得する */
197| var = Sym_getVar( m, name );
198| if ( var == NULL ) {
199| error2_2( Sym_Err_NotFindSymbol,
200| "%s のシンボル %s が見つかりません。", href, name );
201| }
202| }
203|
204| Sym_Ref_init( ref, var->adr, var->type, var->st, Sym_NoID, NULL, NULL );
205|
206| if ( p != NULL )
207| Sym_Ref_getRef( ref, ( *p == '.' ? p + 1 : p + 2 ), ref );
208|}
209|
210|
211|/***********************************************************************
212|* 11. <<< [Sym_getFunc] 関数を呼び出すための情報を取得する >>>
213|*【補足】
214|*・返り値から Sym_Func クラスの関数を使用して、関数呼び出しや、引数の型
215|* の取得などができます。
216|************************************************************************/
217|Sym_Func* Sym_getFunc( Sym* m, const char* name )
218|{
219| Sym_Func* func;
220| char* name2;
221|
222| ERRORS_INITCHK( m, 1 );
223|
224| name2 = StrX_MemV2_alloc( &m->sym, name );
225|
226| for ( ListX_forEach( &m->funcs, &func, Sym_Func ) ) {
227| if ( func->name == name2 )
228| return func;
229| }
230| return NULL;
231|}
232|
233|
234|/***********************************************************************
235|* 12. <<< [Sym_getVar] 直下の変数を返す >>>
236|************************************************************************/
237|Sym_Var* Sym_getVar( Sym* m, const char* name )
238|{
239| Sym_Var* var;
240| char* name2;
241|
242| ERRORS_INITCHK( m, 1 );
243|
244| name2 = StrX_MemV2_alloc( &m->sym, name );
245|
246| for ( ListX_forEach( &m->vars, &var, Sym_Var ) ) {
247| if ( var->name == name2 )
248| return var;
249| }
250| return NULL;
251|}
252|
253|
254|/***********************************************************************
255|* 13. <<< [Sym_getStruct] 構造体型を返す >>>
256|************************************************************************/
257|Sym_Struct* Sym_getStruct( Sym* m, const char* name )
258|{
259| Sym_Struct* st;
260| char* name2;
261|
262| ERRORS_INITCHK( m, 1 );
263|
264| name2 = StrX_MemV2_alloc( &m->sym, name );
265|
266| for ( ListX_forEach( &m->structs, &st, Sym_Struct ) ) {
267| if ( st->name == name2 )
268| return st;
269| }
270| return NULL;
271|}
272|
273|
274|/*-------------------------------------------------------------------------*/
275|/* 14. <<< ◆(Sym_Var) 動的参照変数 >>> */
276|/*-------------------------------------------------------------------------*/
277|
278|
279|
280|/***********************************************************************
281|* 15. <<< [Sym_Var_init] 変数を初期化する >>>
282|************************************************************************/
283|void Sym_Var_init( Sym_Var* m, const char* type,
284| const char* name, void* adr )
285|{
286| Sym_Type typeID = Sym_Type_getID2( type );
287|
288| if ( typeID != Sym_NoID ) {
289| Sym_Var_initBasic( m, typeID, name, adr );
290| }
291| else {
292| Sym_Struct* st = Sym_getStruct( &sym, type );
293| if ( st != NULL )
294| Sym_Var_initStruct( m, st, name, adr );
295| else
296| error2_1( Sym_Err_NotFindType, "%s 型は登録されていません", type );
297| }
298|}
299|
300|
301|/***********************************************************************
302|* 16. <<< [Sym_Var_initBasic] 基本型の変数を初期化する >>>
303|************************************************************************/
304|void Sym_Var_initBasic( Sym_Var* m, Sym_Type type,
305| const char* name, void* adr )
306|{
307| m->name = StrX_MemV2_alloc( &sym.sym, name );
308| m->adr = adr;
309| m->type = type;
310| m->st = NULL;
311|}
312|
313|
314|/***********************************************************************
315|* 17. <<< [Sym_Var_initStruct] 構造体の変数を初期化する >>>
316|************************************************************************/
317|void Sym_Var_initStruct( Sym_Var* m, Sym_Struct* st,
318| const char* name, void* adr )
319|{
320| m->name = StrX_MemV2_alloc( &sym.sym, name );
321| m->adr = adr;
322| m->type = Sym_StructType;
323| m->st = st;
324|}
325|
326|
327|/***********************************************************************
328|* 18. <<< [Sym_Var_print] デバッグ出力する >>>
329|************************************************************************/
330|#ifndef ERRORS_CUT_DEBUG_TOOL
331|void Sym_Var_print( Sym_Var* m, const char* title )
332|{
333| Errors_printf( "%sSym_Var[%p] name=\"%s\", adr = %p, type = %s, st = %s[%p]",
334| title, m, m->name, m->adr, Sym_Type_getStr( m->type ),
335| ( m->st == NULL ? "NULL" : m->st->name ), m->st );
336|}
337|#endif
338|
339|/*-------------------------------------------------------------------------*/
340|/* 19. <<< ◆(Sym_Ref) 変数リファレンス >>> */
341|/*-------------------------------------------------------------------------*/
342|
343|
344|
345|/***********************************************************************
346|* 20. <<< [Sym_Ref_copy] コピーする >>>
347|************************************************************************/
348|void Sym_Ref_copy( Sym_Ref* dst, Sym_Ref* src )
349|{
350| *dst = *src;
351| if ( src->adr == (void*)&src->localVar )
352| dst->adr = (void*)&dst->localVar;
353|}
354|
355|
356|/***********************************************************************
357|* 21. <<< [Sym_Ref_getRef] 構造体変数からネストした変数を参照する >>>
358|*【引数】
359|* ・char* href; 参照名
360|* ・Sym_Ref* ref; 変数(出力)
361|*【補足】
362|*・Sym_getRef( &sym, "st.memb1", &ref ) で取得した参照 ref から
363|* Sym_Ref_getRef( &ref, "memb2", &ref2 ) で取得した ref2 は、
364|* Sym_getRef( &sym, "st.memb1.memb2", &ref3 ) で取得した ref3 と同じです。
365|************************************************************************/
366|void Sym_Ref_getRef( Sym_Ref* m, const char* href, Sym_Ref* ref )
367|{
368| Sym_Member* memb;
369| char* href2;
370| char* p;
371| char* p2;
372| Sym_Ref obj;
373| int n;
374| char name[256];
375|
376| if ( href[0] == '\0' )
377| { Sym_Ref_copy( ref, m ); return; }
378| ASSERT( m->adr != NULL );
379| ASSERT( m->type == Sym_StructType || m->type == Sym_StructTypeP );
380| Sym_Ref_copy( &obj, m );
381|
382| #if ERRORS_DEBUG_FALSE
383| Errors_printf( "Sym_Ref_getRef( href=%s )", href );
384| Errors_printf( " first adr = %p", obj.adr );
385| #endif
386|
387| for ( href2 = (char*)href;
388| /* for の終わりで判定 */;
389| href2 = ( *p == '.' ? p + 1 : p + 2 ) ) {
390|
391| /* name を格納する */
392| p = strchr( href2, '.' );
393| p2 = strstr( href2, "->" );
394| if ( p == NULL || ( p2 != NULL && p2 < p ) ) p = p2;
395| if ( p == NULL ) strcpy( name, href2 );
396| else {
397| n = p - href2;
398| strncpy( name, href2, n );
399| name[n] = '\0';
400| }
401|
402| /* 構造体のメンバを取得する */
403| if ( obj.type == Sym_StructType || obj.type == Sym_StructTypeP ) {
404|
405| ref->type = Sym_NoID;
406| if ( obj.st->readMembFunc ) {
407| obj.st->readMembFunc( &obj, name, ref );
408| }
409|
410| if ( ref->type == Sym_NoID ) {
411| memb = Sym_Struct_getMember( obj.st, name );
412| if ( memb == NULL ) {
413| error2_2( Sym_Err_NotFindSymbol,
414| "%s のシンボル %s が見つかりません。", href, name );
415| }
416| if ( obj.type == Sym_StructTypeP ) {
417| if ( obj.adr == NULL )
418| error2_1( Sym_Err_NullAsign, "NULL 参照(.%s)", name );
419| obj.adr = *(char**)obj.adr;
420| #if ERRORS_DEBUG_FALSE
421| Errors_printf( " * adr = %p", obj.adr );
422| #endif
423| }
424| if ( memb->readFunc == NULL ) {
425| if ( obj.adr == NULL )
426| error2_1( Sym_Err_NullAsign, "NULL 参照(.%s)", name );
427| obj.adr = (char*)obj.adr + memb->offset;
428| }
429| else {
430| if ( obj.adr == NULL )
431| error2_1( Sym_Err_NullAsign, "NULL 参照(.%s)", name );
432| memb->readFunc( obj.adr, &obj.localVar );
433| obj.adr = (char*)&obj.localVar;
434| ASSERT( obj.adr != NULL );
435| }
436| obj.type = memb->type; obj.st = memb->st;
437| obj.elem_type = memb->elem_type; obj.elem_st = memb->elem_st;
438| }
439| else {
440| Sym_Ref_copy( &obj, ref );
441| }
442| }
443| else {
444| error2_2( Sym_Err_ManyNest,
445| "シンボル %s の %s が、基本型に対する構造体参照をしています。",
446| href, name );
447| }
448| #if ERRORS_DEBUG_FALSE
449| Errors_printf( " %s adr = %p", name, obj.adr );
450| #endif
451|
452| if ( p == NULL ) break;
453| }
454|
455| Sym_Ref_copy( ref, &obj );
456|}
457|
458|
459|/***********************************************************************
460|* 22. <<< [Sym_Ref_getString] 変数の値を文字列で取得する >>>
461|*【引数】
462|* ・char* s; 変数の値(出力)
463|* ・int s_szie; s のメモリサイズ
464|************************************************************************/
465|void Sym_Ref_getString( Sym_Ref* m, char* s, int s_size )
466|{
467| switch ( m->type ) {
468| case Sym_StructTypeP:
469| case Sym_VoidP: sprintf( s, "%p", Sym_Ref_getPtr( m ) ); break;
470| case Sym_CharP: StrX_cpy( s, Sym_Ref_getCharP( m ), s_size ); break;
471| case Sym_CharArr: StrX_cpy( s, Sym_Ref_getCharArr( m ), s_size ); break;
472| case Sym_Int: sprintf( s, "%d", Sym_Ref_getInt( m ) ); break;
473| case Sym_Long: sprintf( s, "%ld", Sym_Ref_getLong( m ) ); break;
474| case Sym_Short: sprintf( s, "%d", Sym_Ref_getShort( m ) ); break;
475| case Sym_Char: sprintf( s, "%d", Sym_Ref_getChar( m ) ); break;
476| case Sym_Float: sprintf( s, "%f", Sym_Ref_getFloat( m ) ); break;
477| case Sym_Double: sprintf( s, "%lf", Sym_Ref_getDouble( m ) ); break;
478| case Sym_UInt: sprintf( s, "%u", Sym_Ref_getUInt( m ) ); break;
479| case Sym_ULong: sprintf( s, "%lu", Sym_Ref_getULong( m ) ); break;
480| case Sym_UShort: sprintf( s, "%u", Sym_Ref_getUShort( m ) ); break;
481| case Sym_UChar: sprintf( s, "%u", Sym_Ref_getUChar( m ) ); break;
482| case Sym_StructType:
483| sprintf( s, "(LinkError: cannot make string : struct %s [%p])", m->st->name, m->adr ); break;
484| default:
485| sprintf( s, "(LinkError: unknown type (%d))", m->type ); break;
486| }
487| ASSERT( strlen( s ) < (unsigned)s_size );
488|}
489|
490|
491|/***********************************************************************
492|* 23. <<< [Sym_Ref_getStringSize] 変数の値を文字列にしたときの文字列長+1を返す >>>
493|************************************************************************/
494|int Sym_Ref_getStringSize( Sym_Ref* m )
495|{
496| int ret;
497| char s[256];
498|
499| s[0] = '\0';
500|
501| switch ( m->type ) {
502| case Sym_StructTypeP:
503| case Sym_VoidP: sprintf( s, "%p", Sym_Ref_getPtr( m ) ); break;
504| case Sym_CharP: ret = strlen( Sym_Ref_getCharP( m ) ); break;
505| case Sym_CharArr: ret = strlen( Sym_Ref_getCharArr( m ) ); break;
506| case Sym_Int: sprintf( s, "%d", Sym_Ref_getInt( m ) ); break;
507| case Sym_Long: sprintf( s, "%ld", Sym_Ref_getLong( m ) ); break;
508| case Sym_Short: sprintf( s, "%d", Sym_Ref_getShort( m ) ); break;
509| case Sym_Char: sprintf( s, "%d", Sym_Ref_getChar( m ) ); break;
510| case Sym_Float: sprintf( s, "%f", Sym_Ref_getFloat( m ) ); break;
511| case Sym_Double: sprintf( s, "%lf", Sym_Ref_getDouble( m ) ); break;
512| case Sym_UInt: sprintf( s, "%u", Sym_Ref_getUInt( m ) ); break;
513| case Sym_ULong: sprintf( s, "%lu", Sym_Ref_getULong( m ) ); break;
514| case Sym_UShort: sprintf( s, "%u", Sym_Ref_getUShort( m ) ); break;
515| case Sym_UChar: sprintf( s, "%u", Sym_Ref_getUChar( m ) ); break;
516| case Sym_StructType:
517| sprintf( s, "(LinkError: cannot make string : struct %s [%p])", m->st->name, m->adr ); break;
518| default:
519| sprintf( s, "(LinkError: unknown type (%d))", m->type ); break;
520| }
521| if ( s[0] != '\0' ) ret = strlen( s );
522|
523| return ret;
524|}
525|
526|
527|/***********************************************************************
528|* 24. <<< [Sym_Ref_writeString] 変数の値を文字列でファイルに出力する >>>
529|*【引数】
530|* ・FILE* out; 出力ファイル
531|************************************************************************/
532|void Sym_Ref_writeString( Sym_Ref* m, FILE* out )
533|{
534| switch ( m->type ) {
535| case Sym_StructTypeP:
536| case Sym_VoidP: fprintf( out, "%p", Sym_Ref_getPtr( m ) ); break;
537| case Sym_CharP: fputs( Sym_Ref_getCharP( m ), out ); break;
538| case Sym_CharArr: fputs( Sym_Ref_getCharArr( m ), out ); break;
539| case Sym_Int: fprintf( out, "%d", Sym_Ref_getInt( m ) ); break;
540| case Sym_Long: fprintf( out, "%ld", Sym_Ref_getLong( m ) ); break;
541| case Sym_Short: fprintf( out, "%d", Sym_Ref_getShort( m ) ); break;
542| case Sym_Char: fprintf( out, "%d", Sym_Ref_getChar( m ) ); break;
543| case Sym_Float: fprintf( out, "%f", Sym_Ref_getFloat( m ) ); break;
544| case Sym_Double: fprintf( out, "%lf", Sym_Ref_getDouble( m ) ); break;
545| case Sym_UInt: fprintf( out, "%u", Sym_Ref_getUInt( m ) ); break;
546| case Sym_ULong: fprintf( out, "%lu", Sym_Ref_getULong( m ) ); break;
547| case Sym_UShort: fprintf( out, "%u", Sym_Ref_getUShort( m ) ); break;
548| case Sym_UChar: fprintf( out, "%u", Sym_Ref_getUChar( m ) ); break;
549| case Sym_StructType:
550| fprintf( out, "(LinkError: cannot make string : struct %s [%p])", m->st->name, m->adr ); break;
551| default:
552| fprintf( out, "(LinkError: unknown type (%d))", m->type ); break;
553| }
554|}
555|
556|/*-------------------------------------------------------------------------*/
557|/* 25. <<< ◆(Sym_Struct) 動的参照構造体型 >>> */
558|/*-------------------------------------------------------------------------*/
559|
560|
561|
562|/***********************************************************************
563|* 26. <<< [Sym_Struct_init] 初期化する >>>
564|************************************************************************/
565|void Sym_Struct_init( Sym_Struct* m, const char* name )
566|{
567| m->name = StrX_MemV2_alloc( &sym.sym, name );
568| ListX_init( &m->members );
569| m->loopFunc = NULL;
570| m->readMembFunc = NULL;
571|
572| ERRORS_FINISHCHK_FOR_INIT( Sym_Struct_finish );
573|}
574|
575|
576|/***********************************************************************
577|* 27. <<< [Sym_Struct_finish] 後始末する >>>
578|************************************************************************/
579|void Sym_Struct_finish( Sym_Struct* m )
580|{
581| ERRORS_FINISHCHK_FOR_FINISH( Sym_Struct_finish );
582|
583| ListX_finish2( &m->members, Sym_Member, Sym_Member_finish );
584|}
585|
586|
587|/***********************************************************************
588|* 28. <<< [Sym_Struct_print] デバッグ出力する >>>
589|************************************************************************/
590|#ifndef ERRORS_CUT_DEBUG_TOOL
591|void Sym_Struct_print( Sym_Struct* m, const char* title )
592|{
593| Sym_Member* memb;
594|
595| Errors_printf( "" );
596| Errors_printf( "%sSym_Struct[%p] name=\"%s\" ---------------------",
597| title, m, m->name );
598| for ( ListX_forEach( &m->members, &memb, Sym_Member ) ) {
599| Sym_Member_print( memb, title );
600| }
601|}
602|#endif
603|
604|/***********************************************************************
605|* 29. <<< [Sym_Struct_getMember] メンバ変数の情報を返す >>>
606|************************************************************************/
607|Sym_Member* Sym_Struct_getMember( Sym_Struct* m, const char* name )
608|{
609| Sym_Member* memb;
610| char* name2 = StrX_MemV2_alloc( &sym.sym, name );
611|
612| for ( ListX_forEach( &m->members, &memb, Sym_Member ) ) {
613| if ( memb->name == name2 )
614| return memb;
615| }
616| return NULL;
617|}
618|
619|/*-------------------------------------------------------------------------*/
620|/* 30. <<< ◆(Sym_Member) 動的参照構造体のメンバ変数 >>> */
621|/*-------------------------------------------------------------------------*/
622|
623|
624|
625|/***********************************************************************
626|* 31. <<< [Sym_Member_init] 初期化する >>>
627|************************************************************************/
628|void Sym_Member_init( Sym_Member* m, const char* name, Offset offset,
629| Sym_Type type, Sym_Struct* st, Sym_ReadPropF readFunc,
630| Sym_WritePropF writeFunc )
631|{
632| m->name = StrX_MemV2_alloc( &sym.sym, name );
633| m->offset = offset;
634| m->type = type;
635| m->st = st;
636| m->readFunc = readFunc;
637| m->writeFunc = writeFunc;
638| m->elem_type = Sym_NoID;
639| m->elem_st = NULL;
640| m->elem_param = NULL;
641| m->elem_param_delete = NULL;
642|
643| ERRORS_FINISHCHK_FOR_INIT( Sym_Member_finish );
644|}
645|
646|
647|/***********************************************************************
648|* 32. <<< [Sym_Member_finish] 初期化する >>>
649|************************************************************************/
650|void Sym_Member_finish( Sym_Member* m )
651|{
652| ERRORS_FINISHCHK_FOR_FINISH( Sym_Member_finish );
653|
654| if ( m->elem_param_delete != NULL )
655| m->elem_param_delete( m->elem_param );
656|}
657|
658|
659|/***********************************************************************
660|* 33. <<< [Sym_Member_print] デバッグ出力する >>>
661|************************************************************************/
662|#ifndef ERRORS_CUT_DEBUG_TOOL
663|void Sym_Member_print( Sym_Member* m, const char* title )
664|{
665| Errors_printf( "%sSym_Member[%p] name=\"%s\", offset=%d, type=%s, st = %s[%p],"
666| " readFunc=[%p], writeFunc=[%p]",
667| title, m, m->name, m->offset, Sym_Type_getStr( m->type ),
668| ( m->st == NULL ? "NULL" : m->st->name ), m->st,
669| m->readFunc, m->writeFunc );
670|}
671|#endif
672|
673|/*-------------------------------------------------------------------------*/
674|/* 34. <<< ◆(Sym_Type) 変数の型 >>> */
675|/*-------------------------------------------------------------------------*/
676|
677|
678|
679|/***********************************************************************
680|* 35. <<< [Sym_Type_getStr] 文字列に変換する >>>
681|************************************************************************/
682|char* Sym_Type_getStr( Sym_Type m )
683|{
684| static char* str[] = {
685| "Sym_NoID",
686| "Sym_Void",
687| "Sym_Int", "Sym_UInt", "Sym_Float", "Sym_Double",
688| "Sym_Long", "Sym_ULong", "Sym_Short", "Sym_UShort", "Sym_Char", "Sym_UChar",
689| "Sym_VoidP",
690| "Sym_IntP", "Sym_UIntP", "Sym_FloatP", "Sym_DoubleP",
691| "Sym_LongP", "Sym_ULongP", "Sym_ShortP", "Sym_UShortP", "Sym_CharP", "Sym_UCharP",
692| "Sym_CharArr",
693| "Sym_StructType", "Sym_StructTypeP",
694| };
695| ASSERT( m >= 0 && m < Sym_Type_over );
696|
697| return str[m];
698|}
699|
700|
701|/***********************************************************************
702|* 36. <<< [Sym_Type_getStr2] 型名に変換する >>>
703|************************************************************************/
704|char* Sym_Type_getStr2( Sym_Type m )
705|{
706| static char* str[] = {
707| "Sym_NoID",
708| "void",
709| "int", "unsigned int", "float", "double",
710| "long", "unsigned long", "short", "unsigned short", "char", "unsigned char",
711| "void*",
712| "int*", "unsigned int*", "float*", "double*",
713| "long*", "unsigned long*", "short*", "unsigned short*", "char*", "unsigned char*",
714| "char[]",
715| "struct", "struct*",
716| };
717| ASSERT( m >= 0 && m < Sym_Type_over );
718|
719| return str[m];
720|}
721|
722|
723|/***********************************************************************
724|* 37. <<< [Sym_Type_getID2] 型名から番号に変換する >>>
725|************************************************************************/
726|Sym_Type Sym_Type_getID2( const char* str )
727|{
728| int i;
729|
730| for ( i = 0; i < Sym_Type_over; i++ ) {
731| if ( strcmp( Sym_Type_getStr2( i ), str ) == 0 )
732| return i;
733| }
734|
735| return Sym_NoID;
736|}
737|
738|
739|/*-------------------------------------------------------------------------*/
740|/* 38. <<< ◆(Sym_Func) 動的参照関数 >>> */
741|/*-------------------------------------------------------------------------*/
742|
743|/***********************************************************************
744|* 39. <<< [Sym_Func_init] 初期化する >>>
745|************************************************************************/
746|void Sym_Func_init( Sym_Func* m, const char* name, Sym_FuncF func, int nArg )
747|{
748| int i;
749|
750| m->name = StrX_MemV2_alloc( &sym.sym, name );
751| m->func = func;
752| m->nArg = nArg;
753| m->types = (Sym_Type*)malloc( sizeof(Sym_Type) * (nArg + 1) );
754| m->sts = (Sym_Struct**)malloc( sizeof(Sym_Struct*) * (nArg + 1) );
755|
756| for ( i = 0; i <= nArg; i++ ) {
757| m->types[i] = Sym_NoID;
758| m->sts[i] = NULL;
759| }
760|
761| ERRORS_FINISHCHK_FOR_INIT( Sym_Func_finish );
762|}
763|
764|/***********************************************************************
765|* 40. <<< [Sym_Func_finish] 後始末する >>>
766|************************************************************************/
767|void Sym_Func_finish( Sym_Func* m )
768|{
769| ERRORS_FINISHCHK_FOR_FINISH( Sym_Func_finish );
770|
771| free( m->types );
772| free( m->sts );
773|}
774|
775|
776|/***********************************************************************
777|* 41. <<< [Sym_Func_print] デバッグ出力する >>>
778|************************************************************************/
779|#ifndef ERRORS_CUT_DEBUG_TOOL
780|void Sym_Func_print( Sym_Func* m, const char* title )
781|{
782| int i;
783| Errors_printf( "%sSym_Func[%p] name=\"%s\", func = %p, nArg = %d",
784| title, m, m->name, m->func, m->nArg );
785| Errors_printf( "%s ret type = %s, st = %s[%p]", title,
786| Sym_Type_getStr( m->types[0] ),
787| ( m->sts[0] == NULL ? "NULL" : m->sts[0]->name ),
788| m->sts[0] );
789| for ( i = 1; i <= m->nArg; i++ ) {
790| Errors_printf( "%s arg%d type = %s, st = %s[%p]", title, i,
791| Sym_Type_getStr( m->types[i] ),
792| ( m->sts[i] == NULL ? "NULL" : m->sts[i]->name ),
793| m->sts[i] );
794| }
795|}
796|#endif
797|
798|/***********************************************************************
799|* 42. <<< [Sym_Func_call] 関数を呼び出す >>>
800|************************************************************************/
801|void Sym_Func_call( Sym_Func* m, void** arg_adrs, void* ret_adr )
802|{
803| m->func( arg_adrs, ret_adr );
804|}
805|
806|
807|