Exemple #1
0
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;
}
Exemple #2
0
/*--------------------------------------------------------------------------------------------------------------------*/
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;
}
Exemple #3
0
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();
	}
}