static void print_full_state(void) { print_reg_state(); DIVIDERd; { const char *file; size_t ret; #if defined (HAVE_ROM) && defined (PRINT_ROM_ENABLE) file = get_dump_name('o'); FILE* romfp = fopen(file, "w"); if (romfp) { ret = dump_ROM(romfp); printf("Wrote %8zu bytes to %-29s "\ "(Use 'hexdump -C' to view)\n", ret*ROMSIZE, file); fclose(romfp); } else { perror("No ROM dump"); } #endif // rom --> ram file = get_dump_name('a'); #if defined (HAVE_RAM) FILE* ramfp = fopen(file, "w"); if (ramfp) { ret = dump_RAM(ramfp); printf("Wrote %8zu bytes to %-29s "\ "(Use 'hexdump -C' to view)\n", ret*RAMSIZE, file); fclose(ramfp); } else { perror("No RAM dump"); } #endif } DIVIDERe; }
/*--------------------------------------------------------------------------------------------------------------------*/ int main (int argc, char **argv) { params_t *par = 0; osr_err_code err = OSR_OK; osr_expert *expert = 0; int parse_result = 0; par = params_create(); parse_result = parse_command_line (argc, argv, par); if (parse_result) { params_destroy(par); if (LEARN_USAGE_ERR_CODE == parse_result) { print_usage(get_program_name(argv[0])); return 0; } printf ("Error: can't parse command line.\n"); return 1; } if (par->print_usage) printf ("libosr version %s\n", osr_version_text() ); if (par->print_ver) printf ("libosr version %s\n", osr_version_text() ); if (par->separate_html) { err = osr_separate_html (par->separate_html, par->html_separate_step); params_destroy(par); if (OSR_OK == err) return 0; else return 1; } if ( OSR_OK == err ) { expert = osr_expert_create(); if (0 == expert) { if (!par->no_print_err) printf ("Error: OSR initializing error, %s.\n", osr_get_error_text(err)); err = OSR_INVALID_DATA; } if (par->ignore_filter) { osr_filter unlim; osr_get_default_filter(&unlim); unlim.min_symbols_in_word=1, unlim.max_symbols_in_word=1000, unlim.min_words_in_line=1, unlim.min_lines_in_text=1, unlim.min_text_percentage=1; osr_set_filter(expert, &unlim); } } if ( OSR_OK == err ) { unsigned int last_frame_index = 0; err = osr_process_file(expert, par->file_name, par->frame_index, &last_frame_index); if ( OSR_OK != err ) if (!par->no_print_err) { if ( OSR_WRONG_FRAME_INDEX == err ) printf ("Error: OSR can't get frame %d of animated image." " It must be [0;%d]. File %s.", par->frame_index, last_frame_index, par->file_name); else printf ("Error: OSR can't process image (file %s), %s.\n", par->file_name, osr_get_error_text(err)); } } if ( OSR_OK == err ) { if (par->print_verdict) { char verdict = 0; err = osr_get_verdict(expert, &verdict); if (OSR_OK == err) printf ("VERDICT: %s\n", verdict ? "text" : "not text"); else if (!par->no_print_err) printf ("Error: OSR can't get verdict (file %s), %s.\n", par->file_name, osr_get_error_text(err)); } } if ( OSR_OK == err ) { if (par->print_info) { size_t symbols_count = 0, words_count = 0, lines_count = 0, words_pixels_percentage = 0; if (OSR_OK == err) err = osr_get_symbols_count(expert, &symbols_count); if (OSR_OK == err) err = osr_get_words_count (expert, &words_count); if (OSR_OK == err) err = osr_get_lines_count (expert, &lines_count); if (OSR_OK == err) err = osr_get_words_pixels_percentage (expert, &words_pixels_percentage); if (OSR_OK == err) { printf ("TEXT INFO:\n"); if (par->frame_index > 0) printf ( "frame index = %d\n", par->frame_index); printf ("good symbols count = %d\n" "good words count = %d\n" "good lines count = %d\n" "good pixels percentage = %d%%\n", symbols_count, words_count, lines_count, words_pixels_percentage); } else if (!par->no_print_err) printf ("Error: OSR can't get text properties (file %s), %s.\n", par->file_name, osr_get_error_text(err)); } } if ( OSR_OK == err ) { if (par->print_signature) { char gsg7[33]; err = osr_get_GSG7_signature(expert, gsg7); if (OSR_OK == err) { if ( 0 != gsg7[0] ) printf ("GSG7 %.*s\n", 32, gsg7); } else if (!par->no_print_err) printf ("Error: OSR can't get GSG7 (file %s), %s.\n", par->file_name, osr_get_error_text(err)); } } if ( OSR_OK == err ) { if (par->dump_image || par->dump_lines || par->dump_symbols || par->dump_words) { char dump_name [500]; get_dump_name (dump_name, 500, par->file_name); err = osr_get_dump (expert, dump_name, par->dump_image, par->dump_symbols, par->dump_lines, par->dump_words); if (OSR_OK != err) if (!par->no_print_err) printf ("Error: OSR can't get dump of file %s, %s.\n", par->file_name, osr_get_error_text(err)); } } if (par->html_report) { char dump_name [500]; get_dump_name (dump_name, 500, par->file_name); err = osr_get_html_report(expert, par->file_name, dump_name, par->html_report, err, par->frame_index); if (OSR_OK != err) if (!par->no_print_err) printf ("Error: OSR can't get html-report (image file %s), %s.\n", par->file_name, osr_get_error_text(err)); } if (OSR_OK == err ) if (par->win_group) { char gsg7[33]; err = osr_get_GSG7_signature(expert, gsg7); if (OSR_OK == err) { if (0 == gsg7[0]) strncpy (gsg7, "_not_text", 32); printf ("@ if not exist %s mkdir %s\n" "@ move \"%s\" %s\n", gsg7, gsg7, par->file_name, gsg7); } else if (!par->no_print_err) printf ("Error: OSR can't get GSG7 (file %s), %s.\n", par->file_name, osr_get_error_text(err)); } if (par) params_destroy(par); if (expert) osr_expert_destroy(expert); if (OSR_OK == err) return 0; return 1; }
static void _shell(void) { static char buf[100]; // protect <EOF> replay buf[0] = '\0'; printf("> "); if (buf != fgets(buf, 100, stdin)) { buf[0] = 'h'; buf[1] = '\0'; } switch (buf[0]) { case 'p': sscanf(buf, "%*s %x", &dumpatpc); return; #ifdef HAVE_REPLAY case 'b': sprintf(buf, "s %d", cycle - 1); // fall thru case 's': { int ret; int target; ret = sscanf(buf, "%*s %d", &target); if (-1 == ret) { target = cycle + 1; } else if (1 != ret) { WARN("Error parsing input (ret %d?)\n", ret); return _shell(); } if (target < 0) { WARN("Ignoring seek to negative cycle\n"); } else if (target == cycle) { WARN("Ignoring seek to current cycle\n"); } else { simulator_state_seek(target); print_full_state(); } return _shell(); } #endif case 'q': case 't': sim_terminate(true); case 'r': { const char *file; #if defined (HAVE_ROM) && defined (PRINT_ROM_ENABLE) if (buf[1] == 'o') { file = get_dump_name('o'); } else #endif if (buf[1] == 'a') { file = get_dump_name('a'); } else { file = NULL; buf[1] = '\0'; // now fall through 'c' to help } if (file) { char *cmd; if (-1 == asprintf(&cmd, "hexdump -C %s", file)) ERR(E_UNKNOWN, "Failure allocating cmd string\n"); FILE *out = popen(cmd, "r"); char hex_buf[100]; while ( fgets(hex_buf, 99, out) ) { printf("%s", hex_buf); } pclose(out); return _shell(); } } case '\n': sprintf(buf, "cycle %d\n", cycle+1); case 'c': if (buf[1] == 'y') { int requested_cycle; sscanf(buf, "%*s %d", &requested_cycle); if (requested_cycle < cycle) { WARN("Request to execute into the past ignored\n"); WARN("Did you mean 'seek %d'?\n", requested_cycle); return _shell(); } else if (requested_cycle == cycle) { WARN("Request to execute to current cycle ignored\n"); return _shell(); } else { dumpatcycle = requested_cycle; return; } } else if (buf[1] == 'o') { dumpatcycle = 0; dumpatpc = 0; return; } // not 'cy' or 'co', fall thru case 'h': default: printf(">> The following commands are recognized:\n"); printf(" <none> Advance 1 cycle\n"); printf(" pc HEX_ADDR Stop at pc\n"); printf(" cycle INTEGER Stop at cycle\n"); #ifdef HAVE_REPLAY printf(" seek [INTEGER] Seek to cycle\n"); #endif #if defined (HAVE_ROM) && defined (PRINT_ROM_ENABLE) printf(" rom Print ROM contents\n"); #endif #if defined (HAVE_RAM) printf(" ram Print RAM contents\n"); #endif printf(" continue Continue\n"); printf(" terminate Terminate Simulation\n"); return _shell(); } }