static void debug_print_local(int number){ if (number == 0xff) { dump_locals(); } else { if (number < 1 || number > 15) { glk_put_string("ERROR: local out of range\n"); return; } glk_printf("L%02x : %04x\n", number, variable_get(number)); } }
/* * dump_module_info - dump module info */ static void dump_module_info( section_dbg_header *sdh ) /*****************************************************/ { unsigned_32 bytes_read; mod_info *mi; unsigned_32 total_bytes; long cpos; char name[256]; unsigned_16 index; mod_info *tmi; total_bytes = sdh->gbl_offset - sdh->mod_offset; print_info_title( "Module" ); bytes_read = 0; mi = (mod_info *) Wbuff; tmi = alloca( sizeof( mod_info ) + 255 ); if( tmi == NULL ) { Wdputslc( "Error! Not enough stack.\n" ); longjmp( Se_env, 1 ); } cpos = Curr_sectoff + sdh->mod_offset; index = 0; while( bytes_read < total_bytes ) { Wlseek( cpos ); Wread( Wbuff, sizeof( mod_info ) + 255 ); bytes_read += sizeof( mod_info ) + mi->name[0]; cpos += sizeof( mod_info ) + mi->name[0]; get_len_prefix_string( name, mi->name ); Putdecl( index, 3 ); Wdputs( ") Name: "); Wdputs( name ); Wdputslc( "\n" ); Wdputs( " Language is " ); Wdputs( &Lang_lst[ mi->language ] ); Wdputslc( "\n" ); Wdputs( " Locals: num = " ); Putdec( mi->di[DMND_LOCALS].u.entries ); Wdputs( ", offset = " ); Puthex( mi->di[DMND_LOCALS].info_off, 8 ); Wdputslc( "H\n" ); Wdputs( " Types: num = " ); Putdec( mi->di[DMND_TYPES].u.entries ); Wdputs( ", offset = " ); Puthex( mi->di[DMND_TYPES].info_off, 8 ); Wdputslc( "H\n" ); Wdputs( " Lines: num = " ); Putdec( mi->di[DMND_LINES].u.entries ); Wdputs( ", offset = " ); Puthex( mi->di[DMND_LINES].info_off, 8 ); Wdputslc( "H\n" ); memcpy( tmi, mi, sizeof( mod_info ) + mi->name[0] ); if( Debug_options & LOCALS ) { dump_locals( tmi ); } if( Debug_options & LINE_NUMS ) { dump_line_numbers( tmi ); } if( Debug_options & TYPES ) { dump_types( tmi ); } Wdputslc( "\n" ); index++; } } /* dump_module_info */