void profile_fail(char *reason) { if (!profiling_active) return; fatal_error_2("Profiler: unable to handle operation", reason); }
void profile_fail(char *reason) { fatal_error_2("Profiler: unable to handle operation", reason); }
void profile_quit() { int bucknum; function_t *func; char linebuf[512]; strid_t profstr; if (!profiling_active) return; while (current_frame) { profile_out(0); } if (profiling_stream) { profstr = profiling_stream; } else if (profiling_filename) { frefid_t profref = glk_fileref_create_by_name(fileusage_BinaryMode|fileusage_Data, profiling_filename, 0); if (!profref) fatal_error_2("Profiler: unable to create profile output fileref", profiling_filename); profstr = glk_stream_open_file(profref, filemode_Write, 0); } else { fatal_error("Profiler: no profile output handle!"); } glk_put_string_stream(profstr, "<profile>\n"); for (bucknum=0; bucknum<FUNC_HASH_SIZE; bucknum++) { char total_buf[20], self_buf[20]; callcount_t *cc; for (func = functions[bucknum]; func; func=func->hash_next) { /* ### sprintf(linebuf, "function %lx called %ld times, total ops %ld, total time %s, self ops %ld, self time %s\n", func->addr, func->call_count, func->total_ops, timeprint(&func->total_time, total_buf), func->self_ops, timeprint(&func->self_time, self_buf)); ### */ sprintf(linebuf, " <function addr=\"%lx\" call_count=\"%ld\" accel_count=\"%ld\" total_ops=\"%ld\" total_time=\"%s\" self_ops=\"%ld\" self_time=\"%s\" max_depth=\"%ld\" max_stack_use=\"%ld\" />\n", (unsigned long)func->addr, (long)func->call_count, (long)func->accel_count, (long)func->total_ops, timeprint(&func->total_time, total_buf), (long)func->self_ops, timeprint(&func->self_time, self_buf), (long)func->max_depth, (long)func->max_stack_use); glk_put_string_stream(profstr, linebuf); for (cc = func->outcalls; cc; cc = cc->next) { sprintf(linebuf, " <calls fromaddr=\"%lx\" toaddr=\"%lx\" count=\"%ld\" />\n", (unsigned long)func->addr, (unsigned long)cc->toaddr, (long)cc->count); glk_put_string_stream(profstr, linebuf); } } } glk_put_string_stream(profstr, "</profile>\n"); glk_stream_close(profstr, NULL); /* ### Ought to free the function structures, not just the hash array. */ glulx_free(functions); functions = NULL; }
void ofm_organize(void) { unsigned char_ptr,copies,i,j; ofm_on = false; ofm_level = OFM_NOLEVEL; lf = 0; lh = 0; nco = 0; ncw = 0; npc = 0; bc = 0; ec = 0; nw = 0; nh = 0; nd = 0; ni = 0; nl = 0; nk = 0; ne = 0; np = 0; nki = 0; nwi = 0; nkf = 0; nwf = 0; nkm = 0; nwm = 0; nkr = 0; nwr = 0; nkg = 0; nwg = 0; nkp = 0; nwp = 0; font_dir = 0; if (length_ofm < 8) fatal_error_0("File too short"); lf = ofm[0]*256 + ofm[1]; if (lf==0) { /* This is not a TFM file, it is an OFM-file */ ofm_on = TRUE; ofm_level = ofm[2]*0x100 + ofm[3] + 1; if (ofm[4]>127) fatal_error_0("File length is negative"); lf = ofm[4]*0x1000000 + ofm[5]*0x10000 + ofm[6]*0x100 + ofm[7]; } else { ofm_on = FALSE; ofm_level = OFM_TFM; } if ((lf*4)!=length_ofm) fatal_error_2("Stated (%d) and actual (%d) file length do not match", lf*4, length_ofm); switch(ofm_level) { case OFM_TFM: { start_pos = 2; check_sum_pos = 24; break; } case OFM_LEVEL0: { start_pos = 8; check_sum_pos = 56; break; } case OFM_LEVEL1: { start_pos = 8; check_sum_pos = 116; break; } default: { fatal_error_1("OFMLEVEL %d not supported", ofm_level-1); break; } } design_size_pos = check_sum_pos+4; scheme_pos = design_size_pos+4; family_pos = scheme_pos+40; random_word_pos = family_pos+20; ofm_ptr = start_pos; if (ofm_on==FALSE) { eval_two_bytes(&lh); eval_two_bytes(&bc); eval_two_bytes(&ec); eval_two_bytes(&nw); eval_two_bytes(&nh); eval_two_bytes(&nd); eval_two_bytes(&ni); eval_two_bytes(&nl); eval_two_bytes(&nk); eval_two_bytes(&ne); eval_two_bytes(&np); ncw = (ec-bc+1); ncl = nl; nce = ne; header_length = 6; top_char = 255; top_width = 255; top_height = 15; top_depth = 15; top_italic = 63; } else { eval_four_bytes(&lh); eval_four_bytes(&bc); eval_four_bytes(&ec); eval_four_bytes(&nw); eval_four_bytes(&nh); eval_four_bytes(&nd); eval_four_bytes(&ni); eval_four_bytes(&nl); eval_four_bytes(&nk); eval_four_bytes(&ne); eval_four_bytes(&np); eval_four_bytes(&font_dir); top_char = 65535; top_width = 65535; top_height = 255; top_depth = 255; top_italic = 255; ncl = nl*2; nce = ne*2; if (ofm_level==OFM_LEVEL0) { header_length = 14; ncw = 2*(ec-bc+1); } else { header_length = 29; eval_four_bytes(&nco); eval_four_bytes(&ncw); eval_four_bytes(&npc); eval_four_bytes(&nki); /* Kinds of font ivalues */ eval_four_bytes(&nwi); /* Words of font ivalues */ eval_four_bytes(&nkf); /* Kinds of font fvalues */ eval_four_bytes(&nwf); /* Words of font fvalues */ eval_four_bytes(&nkm); /* Kinds of font mvalues */ eval_four_bytes(&nwm); /* Words of font mvalues */ eval_four_bytes(&nkr); /* Kinds of font rules */ eval_four_bytes(&nwr); /* Words of font rules */ eval_four_bytes(&nkg); /* Kinds of font glues */ eval_four_bytes(&nwg); /* Words of font glues */ eval_four_bytes(&nkp); /* Kinds of font penalties */ eval_four_bytes(&nwp); /* Words of font penalties */ } } if (lf != (header_length+lh+ncw+nw+nh+nd+ni+ncl+nk+nce+np+ nki+nwi+nkf+nwf+nkm+nwm+nkr+nwr+nkg+nwg+nkp+nwp)) fatal_error_0("Subfile sizes do not add up to the stated total"); if (lh < 2) fatal_error_1("The header length is only %d", lh); if ((bc > (ec+1)) || (ec > top_char)) fatal_error_2("The character code range %d .. %d is illegal", bc, ec); if ((nw==0) || (nh==0) || (nd==0) || (ni==0)) fatal_error_0("Incomplete subfiles for character dimensions"); ivalues_start = header_length+lh; fvalues_start = ivalues_start+nki; mvalues_start = fvalues_start+nkf; rules_start = mvalues_start+nkm; glues_start = rules_start+nkr; penalties_start = glues_start+nkg; ivalues_base = penalties_start+nkp; fvalues_base = ivalues_base+nwi; mvalues_base = fvalues_base+nwf; rules_base = mvalues_base+nwm; glues_base = rules_base+nwr; penalties_base = glues_base+nwg; char_base = penalties_base+nwp; bytes_per_entry = (12 + 2*npc) / 4 * 4; init_planes(); no_labels = 0; switch (ofm_level) { case OFM_TFM: { for(i=bc; i<=ec; i++) { init_character(i,NULL); char_start = 4*char_base+4*(i-bc); current_character->index_indices[C_WD] = ofm[char_start] & 0xff; current_character->index_indices[C_HT] = (ofm[char_start+1] & 0xf0) >> 4; current_character->index_indices[C_DP] = ofm[char_start+1] & 0xf; current_character->index_indices[C_IC] = (ofm[char_start+2] & 0xfc) >> 2; current_character->tag = ofm[char_start+2] & 0x3; if (current_character->tag == TAG_LIG) no_labels++; current_character->remainder = ofm[char_start+3] & 0xff; } break; } case OFM_LEVEL0: { for(i=bc; i<=ec; i++) { init_character(i,NULL); char_start = 4*char_base+8*(i-bc); current_character->index_indices[C_WD] = ((ofm[char_start] & 0xff) << 8) | (ofm[char_start+1] & 0xff); current_character->index_indices[C_HT] = ofm[char_start+2] & 0xff; current_character->index_indices[C_DP] = ofm[char_start+3] & 0xff; current_character->index_indices[C_IC] = ofm[char_start+4] & 0xff; current_character->tag = ofm[char_start+5] & 0x3; if (current_character->tag == TAG_LIG) no_labels++; current_character->remainder = ((ofm[char_start+6] & 0xff) << 8) | (ofm[char_start+7] & 0xff); } break; } case OFM_LEVEL1: { char_ptr = 4*char_base; i = bc; while (i<=ec) { init_character(i,NULL); copies = 1+256*ofm[char_ptr+8]+ofm[char_ptr+9]; for (j=1; j<=copies; j++) { char_start = char_ptr; i++; } char_ptr = char_ptr + bytes_per_entry; } if (char_ptr != (4*(char_base+ncw))) fatal_error_0("Length of char info table does not " "correspond to specification"); break; } default: { fatal_error_1("Inappropriate font level (%d)", ofm_level-1); } } width_base = char_base+ncw; height_base = width_base+nw; depth_base = height_base+nh; italic_base = depth_base+nd; lig_kern_base = italic_base+ni; if (ofm_level==OFM_TFM) { kern_base = lig_kern_base+nl; } else { kern_base = lig_kern_base+2*nl; } exten_base = kern_base+nk; if (ofm_level==OFM_TFM) { param_base = exten_base+ne-1; } else { param_base = exten_base+2*ne-1; } }