void varspace_dump( VARSPACE * n, int indent ) { int i, t, to ; char buffer[128] ; for ( i = 0 ; i < n->count ; i++ ) { if ( i < n->count - 1 ) to = n->vars[i+1].offset - 1 ; else to = n->last_offset - 1 ; printf( "[%04d:%04d]\t", n->vars[i].offset, to ) ; for ( t = 0 ; t < indent ; t++ ) printf( " + " ) ; typedef_describe( buffer, n->vars[i].type ) ; printf( "%s %s", buffer, identifier_name( n->vars[i].code ) ) ; /* Describe arrays of structs */ if ( typedef_is_array( n->vars[i].type ) ) { TYPEDEF r = typedef_reduce( n->vars[i].type ); while ( typedef_is_array( r ) ) r = typedef_reduce( r ); if ( typedef_is_struct( r ) ) { printf( ":\n" ) ; varspace_dump( typedef_members( r ), indent + 1 ) ; } else printf( "\n" ); } /* Describe structs */ else if ( typedef_is_struct( n->vars[i].type ) ) { printf( ":\n" ) ; varspace_dump( typedef_members( n->vars[i].type ), indent + 1 ) ; } else printf( "\n" ) ; } }
void typedef_describe( char * buffer, TYPEDEF t ) { switch ( t.chunk[0].type ) { case TYPE_INT: sprintf( buffer, "INT" ) ; return ; case TYPE_DWORD: sprintf( buffer, "DWORD" ) ; return ; case TYPE_SHORT: sprintf( buffer, "SHORT" ) ; return ; case TYPE_WORD: sprintf( buffer, "WORD" ) ; return ; case TYPE_BYTE: sprintf( buffer, "BYTE" ) ; return ; case TYPE_CHAR: sprintf( buffer, "CHAR" ) ; return ; case TYPE_SBYTE: sprintf( buffer, "SIGNED BYTE" ) ; return ; case TYPE_STRING: sprintf( buffer, "STRING" ) ; return ; case TYPE_FLOAT: sprintf( buffer, "FLOAT" ) ; return ; case TYPE_STRUCT: if ( t.chunk[0].count > 1 ) sprintf( buffer, "STRUCT [%d]", t.chunk[0].count ) ; else sprintf( buffer, "STRUCT" ) ; return ; case TYPE_ARRAY: sprintf( buffer, "ARRAY [%d] OF ", t.chunk[0].count ) ; typedef_describe( buffer + strlen( buffer ), typedef_reduce( t ) ) ; return ; case TYPE_POINTER: sprintf( buffer, "POINTER TO " ) ; typedef_describe( buffer + strlen( buffer ), typedef_reduce( t ) ) ; return ; case TYPE_UNDEFINED: default: sprintf( buffer, "<UNDEFINED>" ) ; return ; } }