OSDN Git Service

(LibGoblin)
[drdeamon64/drdeamon64.git] / libgoblin / drd64_libgoblin_debug_objinfo.c
1 /*DrDeAmOn64DrDeAmOn64DrDeAmOn64DrDeAmOn64DrDeAmOn64DrDeAmOn64DrDeAmOn64
2
3                          D r . D e a m o n  6 4
4                         for INTEL64(R), AMD64(R)
5         
6    Copyright(C) 2007-2009 Koine Yuusuke(koinec). All rights reserved.
7
8 Redistribution and use in source and binary forms, with or without
9 modification, are permitted provided that the following conditions are met:
10
11  1. Redistributions of source code must retain the above copyright notice,
12     this list of conditions and the following disclaimer.
13  2. Redistributions in binary form must reproduce the above copyright
14     notice, this list of conditions and the following disclaimer in the
15     documentation and/or other materials provided with the distribution.
16
17 THIS SOFTWARE IS PROVIDED BY Koine Yuusuke(koinec) ``AS IS'' AND ANY
18 EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
19 WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
20 DISCLAIMED. IN NO EVENT SHALL Koine Yuusuke(koinec) OR CONTRIBUTORS BE
21 LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
22 CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
23 SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
24 INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
25 CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
26 ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
27 OF THE POSSIBILITY OF SUCH DAMAGE.
28
29 DrDeAmOn64DrDeAmOn64DrDeAmOn64DrDeAmOn64DrDeAmOn64DrDeAmOn64DrDeAmOn64*/
30
31 /* File Info -----------------------------------------------------------
32 File: drd64_.c
33 Function: 
34 Comment: 
35 ----------------------------------------------------------------------*/
36
37 #define DRD64_SRC_LIBGOBLIN_DEBUG_OBJINFO
38 #include"drd64_libgoblin.h"
39
40 static char     gstr_type[256][9]       = {
41         "NULL",                 // 0x00
42         "MASTER",               // 0x01
43         "PROGRAM",              // 0x02
44         "PROGHDR",              // 0x03
45         "SECTION",              // 0x04
46         "OBJFILE",              // 0x05
47         "FUNCTION",             // 0x06
48         "OBJECT",               // 0x07
49
50         "COMMON",               // 0x08
51         "TLS",                  // 0x09
52         "REL",                  // 0x0a
53         "",                             // 0x0b
54         "",                             // 0x0c
55         "",                             // 0x0d
56         "TYPE(SIG)",    // 0x0e
57         "TYPE(MUL)",    // 0x0f
58         "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "",
59         "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "",
60         "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "",
61         "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "",
62         "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "",
63         "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "",
64         "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", 
65         "NONE",
66
67         "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "",
68         "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "",
69         "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "",
70         "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "",
71         "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "",
72         "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "",
73         "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "",
74         "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", ""
75 };
76
77 /*====================================================================*/
78 /*--------------------------------------------------------------------*/
79 void
80         Debug_ObjectInfo_Print_SymbolCommon(
81                         LibGoblin_ObjectInfo    *p_obj,
82                         char    *pstr_space,
83                         Byte    b_level )
84 {
85         char    str_type[64];
86         char    str_binding[32];
87         char    str_visibility[32];
88         LibGoblin_BinaryInfo    *p_binfo_origin;
89
90         printf(" %s\t\t[OBJINFO] Addr.Link(%3d <-> %3d)  File{ Offset=%8p, Size=%8ld, BinFileID=%d }\n",
91                                 pstr_space, 
92                                 p_obj->addrlink.i_prev_id, p_obj->addrlink.i_next_id,
93                                 p_obj->file.pv_offset, p_obj->file.qw_size, p_obj->file.i_binfile );
94
95         // Symbol type - ELFNN_ST_TYPE - st_info
96         switch( p_obj->info.symbol.b_type )     {
97                 case STT_NOTYPE:        // 0 - Unspecified type.
98                         strcpy( str_type, "NoType" );
99                         break;
100                 case STT_OBJECT:        // 1 - Data object.
101                         strcpy( str_type, "Data Object" );
102                         break;
103                 case STT_FUNC:          // 2 - Function.
104                         strcpy( str_type, "Function" );
105                         break;
106                 case STT_SECTION:       // 3 - Section.
107                         strcpy( str_type, "Section" );
108                         break;
109                 case STT_FILE:          // 4 - Source file.
110                         strcpy( str_type, "Source File" );
111                         break;
112                 case STT_COMMON:        // 5 - Uninitialized common block.
113                         strcpy( str_type, "UnInit. CommonBlock" );
114                         break;
115                 case STT_TLS:           // 6 - TLS object.
116                         strcpy( str_type, "TLS Object" );
117                         break;
118                 case STT_NUM:
119                         strcpy( str_type, "Num" );
120                         break;
121                 case STT_GNU_IFUNC:
122                         strcpy( str_type, "GNU IFunc" );
123                         break;
124                 default:
125                         snprintf( str_type, 31, "(%02xh)", p_obj->info.symbol.b_type );
126                         break;
127         }
128
129         // Symbol Binding - ELFNN_ST_BIND - st_info
130         switch( p_obj->info.symbol.b_binding )  {
131                 case STB_LOCAL:                 // 0 - Local symbol
132                         strcpy( str_binding, "Local" );
133                         break;
134                 case STB_GLOBAL:                // 1 - Global symbol
135                         strcpy( str_binding, "Global" );
136                         break;
137                 case STB_WEAK:                  // 2 - like global - lower precedence
138                         strcpy( str_binding, "WEAK" );
139                         break;
140                 case STB_GNU_UNIQUE:    // 10 - Unique symbol (GNU)
141                         strcpy( str_binding, "GNU Unique" );
142                         break;
143                 default:
144                         snprintf( str_binding, 31, "(%02xh)", p_obj->info.symbol.b_binding );
145                         break;
146         }
147
148
149         // Symbol visibility - ELFNN_ST_VISIBILITY - st_other
150         switch( p_obj->info.symbol.b_visibility )       {
151                 case STV_DEFAULT:       // 0x00 - Default visibility (see binding).
152                         strcpy( str_visibility, "Default" );
153                         break;
154                 case STV_INTERNAL:      // 0x01 - Special meaning in relocatable objects.
155                         strcpy( str_visibility, "INTERNAL" );
156                         break;
157                 case STV_HIDDEN:        // 0x02 - Not visible.
158                         strcpy( str_visibility, "HIDDEN" );
159                         break;
160                 case STV_PROTECTED:     // 0x03 - Visible but not preemptible.
161                         strcpy( str_visibility, "PROTECTED" );
162                         break;
163                 case STV_EXPORTED:
164                         strcpy( str_visibility, "EXPORTED" );
165                         break;
166                 case STV_SINGLETON:
167                         strcpy( str_visibility, "SINGLETON" );
168                         break;
169                 case STV_ELIMINATE:
170                         strcpy( str_visibility, "ELIMINATE" );
171                         break;
172                 default:
173                         snprintf( str_binding, 31, "(%02xh)", p_obj->info.symbol.b_binding );
174                         break;
175         }
176
177         printf(" %s\t\t[SYMBOL] Type: %s, Binding: %s, Visibility: %s\n",
178                                 pstr_space, str_type, str_binding, str_visibility );
179
180
181         if( OBJINFO_STATUS_DYNAMIC & p_obj->dw_status ) {
182                 p_binfo_origin  = BinaryInfo_GetBinInfo( p_obj->dynamic.i_binfo_origin );
183
184                 printf(" %s\t\t[DYNAMIC] Lib.Name: %s (binfo id= %d), .dynsym index= %d\n",
185                                 pstr_space,
186                                 ((NULL != p_binfo_origin) ? p_binfo_origin->str_filename : "--NULL--"),
187                                 p_obj->dynamic.i_binfo_origin, p_obj->dynamic.i_dynsym_index );
188         }
189
190
191         return;
192 }
193
194 /*--------------------------------------------------------------------*/
195 void
196         Debug_ObjectInfo_Print_Function(
197                         LibGoblin_ObjectInfo    *p_obj,
198                         char    *pstr_space,
199                         Byte    b_level )
200 {
201         Debug_ObjectInfo_Print_SymbolCommon( p_obj, pstr_space, b_level );
202         return;
203 }
204
205 /*--------------------------------------------------------------------*/
206 void
207         Debug_ObjectInfo_Print_Object(
208                         LibGoblin_ObjectInfo    *p_obj,
209                         char    *pstr_space,
210                         Byte    b_level )
211 {
212         Debug_ObjectInfo_Print_SymbolCommon( p_obj, pstr_space, b_level );
213         return;
214 }
215
216 /*--------------------------------------------------------------------*/
217 void
218         Debug_ObjectInfo_Print_Common(
219                         LibGoblin_ObjectInfo    *p_obj,
220                         char    *pstr_space,
221                         Byte    b_level )
222 {
223         Debug_ObjectInfo_Print_SymbolCommon( p_obj, pstr_space, b_level );
224         return;
225 }
226
227 /*--------------------------------------------------------------------*/
228 void
229         Debug_ObjectInfo_Print_TLS(
230                         LibGoblin_ObjectInfo    *p_obj,
231                         char    *pstr_space,
232                         Byte    b_level )
233 {
234         Debug_ObjectInfo_Print_SymbolCommon( p_obj, pstr_space, b_level );
235         return;
236 }
237
238 /*--------------------------------------------------------------------*/
239 void
240         Debug_ObjectInfo_Print_Rel(
241                         LibGoblin_ObjectInfo    *p_obj,
242                         char    *pstr_space,
243                         Byte    b_level )
244 {
245         //Debug_ObjectInfo_Print_SymbolCommon( p_obj, pstr_space, b_level );
246         return;
247 }
248
249 /*--------------------------------------------------------------------*/
250 void
251         Debug_ObjectInfo_Print_Section(
252                         LibGoblin_ObjectInfo    *p_obj,
253                         char    *pstr_space,
254                         Byte    b_level )
255 {
256         char    str_type[32];
257         char    str_flag[256];
258         DWord   qw_flag;
259
260         printf(" %s\t\t[OBJINFO] Addr.Link(%3d <-> %3d)  File{ Offset=%8p, Size=%8ld, BinFileID=%d }\n",
261                                 pstr_space, 
262                                 p_obj->addrlink.i_prev_id, p_obj->addrlink.i_next_id,
263                                 p_obj->file.pv_offset, p_obj->file.qw_size, p_obj->file.i_binfile );
264
265
266         switch( p_obj->info.section.dw_type )   {
267                 /* 0 - inactive */
268                 case SHT_NULL:
269                         strncpy( str_type, "NULL", 31 );
270                         break;
271                 /* 1 - program defined information */
272                 case SHT_PROGBITS:
273                         strncpy( str_type, "PROGBITS", 31 );
274                         break;
275                 /* 2 - symbol table section */
276                 case SHT_SYMTAB:
277                         strncpy( str_type, "SYMTAB", 31 );
278                         break;
279                 /* 3 - string table section */
280                 case SHT_STRTAB:
281                         strncpy( str_type, "STRTAB", 31 );
282                         break;
283                 /* 4 - relocation section with addends */
284                 case SHT_RELA:
285                         strncpy( str_type, "RELA", 31 );
286                         break;
287                 /* 5 - symbol hash table section */
288                 case SHT_HASH:
289                         strncpy( str_type, "HASH", 31 );
290                         break;
291                 /* 6 - dynamic section */
292                 case SHT_DYNAMIC:
293                         strncpy( str_type, "DYNAMIC", 31 );
294                         break;
295                 /* 7 - note section */
296                 case SHT_NOTE:
297                         strncpy( str_type, "NOTE", 31 );
298                         break;
299                 /* 8 - no space section */
300                 case SHT_NOBITS:
301                         strncpy( str_type, "NOBITS", 31 );
302                         break;
303                 /* 9 - relocation section - no addends */
304                 case SHT_REL:
305                         strncpy( str_type, "REL", 31 );
306                         break;
307                 /* 10 - reserved - purpose unknown */
308                 case SHT_SHLIB:
309                         strncpy( str_type, "SHLIB", 31 );
310                         break;
311                 /* 11 - dynamic symbol table section */
312                 case SHT_DYNSYM:
313                         strncpy( str_type, "DYNSYM", 31 );
314                         break;
315                 /* 14 - Initialization function pointers. */
316                 case  SHT_INIT_ARRAY:
317                         strncpy( str_type, "INIT_ARRAY", 31 );
318                         break;
319                 /* 15 - Termination function pointers. */
320                 case SHT_FINI_ARRAY:
321                         strncpy( str_type, "FINI_ARRAY", 31 );
322                         break;
323                 /* 16 - Pre-initialization function ptrs. */
324                 case SHT_PREINIT_ARRAY:
325                         strncpy( str_type, "PREINIT_ARRAY", 31 );
326                         break;
327                 /* 17 - Section group. */
328                 case SHT_GROUP:
329                         strncpy( str_type, "GROUP", 31 );
330                         break;
331                 /* 18 - Section indexes (see SHN_XINDEX). */
332                 case  SHT_SYMTAB_SHNDX:
333                         strncpy( str_type, "SYMTAB_SHNDX", 31 );
334                         break;
335
336                 default:
337                         snprintf( str_type, 31, "(%8x)", p_obj->info.section.dw_type );
338                         break;
339         }
340         
341         qw_flag = p_obj->info.section.qw_flag;
342         str_flag[0]     = '\0';
343         /* SHF_WRITE 0x1:       Section contains writable data. */
344         if( SHF_WRITE & qw_flag )       { strcat( str_flag, "Write " ); }
345         /* SHF_ALLOC 0x2: Section occupies memory. */
346         if( SHF_ALLOC & qw_flag )       { strcat( str_flag, "Alloc " ); }
347         /* SHF_EXECINSTR 0x4: Section contains instructions. */
348         if( SHF_EXECINSTR & qw_flag )   { strcat( str_flag, "Exec " ); }
349         /* SHF_MERGE 0x10: Section may be merged. */
350         if( SHF_MERGE & qw_flag )       { strcat( str_flag, "Merged " ); }
351         /* SHF_STRINGS 0x20: Section contains strings. */
352         if( SHF_STRINGS & qw_flag )     { strcat( str_flag, "Strings " ); }
353         /* SHF_INFO_LINK 0x40: sh_info holds section index. */
354         if( SHF_INFO_LINK & qw_flag )   { strcat( str_flag, "InfoLink " ); }
355         /* SHF_LINK_ORDER 0x80: Special ordering requirements. */
356         if( SHF_LINK_ORDER & qw_flag )  { strcat( str_flag, "LinkOrder " ); }
357         /* SHF_OS_NONCONFORMING 0x100: OS-specific processing required. */
358         if( SHF_OS_NONCONFORMING & qw_flag )    { strcat( str_flag, "OSspecific " ); }
359         /* SHF_GROUP 0x200: Member of section group. */
360         if( SHF_GROUP & qw_flag )       { strcat( str_flag, "Group " ); }
361         /* SHF_TLS 0x400: Section contains TLS data. */
362         if( SHF_TLS & qw_flag ) { strcat( str_flag, "TLS " ); }
363         /* SHF_COMPRESSED 0x800: Section contains compressed data. */
364         if( SHF_COMPRESSED & qw_flag )  { strcat( str_flag, "Compressed " ); }
365
366         printf(" %s\t\t[SECTION] Type: %s, Align= %ld, Flag[ %s]\n",
367                                 pstr_space, str_type, p_obj->info.section.qw_align, str_flag );
368         printf(" %s\t\t[SECTION] EntSize= %ld, Link(Related Section)= %d, Info(Depends Section Type)= %xh\n",
369                                 pstr_space, p_obj->info.section.qw_entsize,
370                                 p_obj->info.section.dw_link, p_obj->info.section.dw_info );
371
372         return;
373 }
374
375 /*--------------------------------------------------------------------*/
376 void
377         Debug_ObjectInfo_Print_ProgramHeader(
378                         LibGoblin_ObjectInfo    *p_obj,
379                         char    *pstr_space,
380                         Byte    b_level )
381 {
382         char    str_type[32];
383         char    str_flag[8];
384         DWord   dw_flag;
385
386         printf(" %s\t\t[OBJINFO] Addr.Link(%3d <-> %3d)  File{ Offset=%8p, Size=%8ld, BinFileID=%d }\n",
387                                 pstr_space, 
388                                 p_obj->addrlink.i_prev_id, p_obj->addrlink.i_next_id,
389                                 p_obj->file.pv_offset, p_obj->file.qw_size, p_obj->file.i_binfile );
390
391         switch( p_obj->info.proghdr.dw_type )   {
392                 case PT_NULL:
393                         strncpy( str_type, "NULL", 31 );
394                         break;
395                 case PT_LOAD:
396                         strncpy( str_type, "LOAD", 31 );
397                         break;
398                 case PT_DYNAMIC:
399                         strncpy( str_type, "DYNAMIC", 31 );
400                         break;
401                 case PT_INTERP:
402                         strncpy( str_type, "INTERP", 31 );
403                         break;
404                 case PT_NOTE:
405                         strncpy( str_type, "NOTE", 31 );
406                         break;
407                 case PT_SHLIB:
408                         strncpy( str_type, "SHLIB", 31 );
409                         break;
410                 case PT_PHDR:
411                         strncpy( str_type, "PHDR", 31 );
412                         break;
413                 case PT_TLS:
414                         strncpy( str_type, "TLS", 31 );
415                         break;
416                 default:
417                         snprintf( str_type, 31, "(%8x)", p_obj->info.proghdr.dw_type );
418                         break;
419         }
420         
421         dw_flag = p_obj->info.proghdr.dw_flags;
422         snprintf( str_flag, 7, "%c%c%c%c%c",
423                                         ((PF_R & dw_flag) ? 'R' : ' '),
424                                         ((PF_W & dw_flag) ? 'W' : ' '),
425                                         ((PF_X & dw_flag) ? 'X' : ' '),
426                                         ((PF_MASKOS & dw_flag) ? 'O': ' '),
427                                         ((PF_MASKPROC & dw_flag) ? 'P': ' ') );
428
429         printf(" %s\t\t[PROGHDR] Flag[%5s] Type: %s, align= %ld\n",
430                                 pstr_space, str_flag, str_type, p_obj->info.proghdr.qw_align );
431
432         return;
433 }
434
435 /*--------------------------------------------------------------------*/
436 void
437         Debug_ObjectInfo_Print_ProgramFile(
438                         LibGoblin_ObjectInfo    *p_obj,
439                         char    *pstr_space,
440                         Byte    b_level )
441 {
442         printf(" %s\t\t[OBJINFO] Addr.Link(%3d <-> %3d)\n",
443                                 pstr_space, p_obj->addrlink.i_prev_id, p_obj->addrlink.i_next_id );
444
445         printf(" %s\t\t[PROGRAM] BinaryInfo ID= %d\n",
446                                 pstr_space, p_obj->info.program.i_binfo_id );
447
448         return;
449 }
450
451 /*--------------------------------------------------------------------*/
452 void
453         Debug_ObjectInfo_Print_ObjectFile(
454                         LibGoblin_ObjectInfo    *p_obj,
455                         char    *pstr_space,
456                         Byte    b_level )
457 {
458         printf(" %s\t\t[OBJINFO] Addr.Link(%3d <-> %3d)\n",
459                                 pstr_space, p_obj->addrlink.i_prev_id, p_obj->addrlink.i_next_id );
460         printf(" %s\t\t[OBJFILE] Abbrev Nums=%3d (%8ph)  CU Header: size=%ld, ver=%d, pointer size=%d\n",
461                                 pstr_space, p_obj->info.objfile.i_abbrevs, p_obj->info.objfile.p_abbrev,
462                                 p_obj->info.objfile.t_cuheader.qw_unitsize,
463                                 p_obj->info.objfile.t_cuheader.w_version,
464                                 p_obj->info.objfile.t_cuheader.b_pointersize );
465
466         return;
467 }
468
469
470 /*====================================================================*/
471 /*--------------------------------------------------------------------*/
472 void
473         Debug_ObjectInfo_PrintInfo(
474                         LibGoblin_ObjectInfo    *p_obj,
475                         int             i_depth,
476                         char    *pstr_space,
477                         int             i_len,
478                         Byte    b_level )
479 {
480
481         // Set Space String ---
482         if( 0 < i_depth )       {
483                 *(pstr_space + i_len - 2)       = '+';
484                 *(pstr_space + i_len - 1)       = '-';
485         }
486         printf(" %sOBJINFO[%4d] (%-8s)\t%16lxh - %16lxh (Size: %16lxh) : %s\n",
487                                 pstr_space, p_obj->i_id,
488                                 gstr_type[ p_obj->b_type ],
489                                 p_obj->addr.ptr_addr.value,
490                                 (( 0 < p_obj->addr.qw_size )
491                                         ? (p_obj->addr.ptr_addr.value + p_obj->addr.qw_size - 1)
492                                         : p_obj->addr.ptr_addr.value),
493                                 p_obj->addr.qw_size,
494                                 p_obj->pstr_name );
495
496         if( 0 < i_depth )       {
497                 if( NO_OBJINFO != p_obj->grplink.i_next_id )
498                                 { *(pstr_space + i_len - 2)     = '|'; }
499                 else    { *(pstr_space + i_len - 2)     = ' '; }
500                 *(pstr_space + i_len - 1)       = ' ';
501         }
502
503         if( NO_OBJINFO != p_obj->grplink.i_child_topid )
504                         { strcat( pstr_space, " | " ); }
505         else    { strcat( pstr_space, "   " ); }
506
507         switch( p_obj->b_type ) {
508                 case OBJINFO_TYPE_PROGRAM:
509                         Debug_ObjectInfo_Print_ProgramFile( p_obj, pstr_space, b_level );
510                         break;
511
512                 case OBJINFO_TYPE_PROGHDR:
513                         Debug_ObjectInfo_Print_ProgramHeader( p_obj, pstr_space, b_level );
514                         break;
515
516                 case OBJINFO_TYPE_SECTION:
517                         Debug_ObjectInfo_Print_Section( p_obj, pstr_space, b_level );
518                         break;
519
520                 case OBJINFO_TYPE_OBJFILE:
521                         Debug_ObjectInfo_Print_ObjectFile( p_obj, pstr_space, b_level );
522                         break;
523
524                 case OBJINFO_TYPE_FUNCTION:
525                         Debug_ObjectInfo_Print_Function( p_obj, pstr_space, b_level );
526                         break;
527
528                 case OBJINFO_TYPE_OBJECT:
529                         Debug_ObjectInfo_Print_Object( p_obj, pstr_space, b_level );
530                         break;
531
532                 case OBJINFO_TYPE_COMMON:
533                         Debug_ObjectInfo_Print_Common( p_obj, pstr_space, b_level );
534                         break;
535
536                 case OBJINFO_TYPE_TLS:
537                         Debug_ObjectInfo_Print_TLS( p_obj, pstr_space, b_level );
538                         break;
539
540                 case OBJINFO_TYPE_REL:
541                         Debug_ObjectInfo_Print_Rel( p_obj, pstr_space, b_level );
542                         break;
543
544                 default:
545                         break;
546         }
547         printf(" %s\n", pstr_space );
548
549         *(pstr_space + i_len)   = '\0';
550
551         return;
552 }
553
554
555 /*====================================================================*/
556 /*--------------------------------------------------------------------*/
557 LIBGOBLIN_DEBUG_OBJINFO_EXTERN
558 int
559         Debug_ObjectInfo_Print_AllAddrLink(
560                         LibGoblin_ProgramInfo   *p_pginfo,
561                         Byte            b_level )
562 {
563         //LibGoblin_ObjectInfo  *p_objinfo;
564
565         if( 0x00 < b_level )
566                 { puts("[DEBUG] ObjectInfo - Addr.Link --------------------------------------"); }
567
568
569
570
571         if( 0x00 < b_level )    {
572                 puts("-----------------------------------------------------------------------");
573                 puts("");
574         }
575
576         return 0x00;
577 }
578
579 /*====================================================================*/
580 /*--------------------------------------------------------------------*/
581 void
582         Debug_ObjectInfo_Print_GroupLink(
583                         LibGoblin_ProgramInfo   *p_pginfo,
584                         LibGoblin_ObjectInfo    *p_objstart,
585                         int             i_depth,
586                         char    *pstr_space,
587                         Byte    b_level )
588 {
589         int     i_len;
590         LibGoblin_ObjectInfo    *p_objinfo;
591
592         i_len   = strnlen( pstr_space, 384 );
593         if( 0 < i_depth )       { strcat( pstr_space, " | " ); }
594
595         if( NULL == p_objstart )        { return; }
596         p_objinfo       = p_objstart;
597         do      {
598                 // Print ObjInfo ---
599                 Debug_ObjectInfo_PrintInfo( p_objinfo, i_depth, pstr_space,
600                                                 (i_len + ((0 < i_depth) ? 3 : 0)), b_level );
601
602                 // Child. ---
603                 if( NO_OBJINFO != p_objinfo->grplink.i_child_topid )    {
604                         Debug_ObjectInfo_Print_GroupLink(
605                                         p_pginfo,
606                                         OBJINFO( p_pginfo, p_objinfo->grplink.i_child_topid ),
607                                         (i_depth + 1), pstr_space, b_level );
608                 }
609
610                 // Set Next ObjectInfo ---
611                 p_objinfo       = ((NO_OBJINFO == p_objinfo->grplink.i_next_id)
612                                                         ? NULL : OBJINFO( p_pginfo, p_objinfo->grplink.i_next_id ));
613         } while( NULL != p_objinfo );
614
615         *(pstr_space + i_len)   = '\0';
616
617         return;
618 }
619
620
621 /*--------------------------------------------------------------------*/
622 LIBGOBLIN_DEBUG_OBJINFO_EXTERN
623 int
624         Debug_ObjectInfo_Print_AllGroupLink(
625                         LibGoblin_ProgramInfo   *p_pginfo,
626                         Byte            b_level )
627 {
628         char                                    str_space[384];
629         //LibGoblin_ObjectInfo  *p_objinfo;
630
631         str_space[0]    = '\0';
632
633         if( 0x00 < b_level )
634                 { puts("[DEBUG] ObjectInfo - GroupLink --------------------------------------"); }
635
636
637         Debug_ObjectInfo_Print_GroupLink( p_pginfo, p_pginfo->objinfo.p_objinfo, 0, str_space, b_level );
638
639         if( 0x00 < b_level )    {
640                 puts("-----------------------------------------------------------------------");
641                 puts("");
642         }
643
644         return 0x00;
645 }
646
647
648 /* EOF of drd64_.c ----------------------------------- */