void do_load() { FILE *f = openfile("rb", stdin); cmdmode(); char line[1024]; while (true) { line[0] = 0; fgets(line, 1024, f); if (line[0] == 0) { break; } if (line[0] != '#' && line[0] != '\n') { translate(line, '\n', '\r'); pwrite(line); pread(); if (strcmp(pline, "OK\r")) { fprintf(stderr, "Command failed: %s: %s\n", line, pline); exit(EXIT_FAILURE); } } } pwrite("ATWR\r"); pread(); exitcmd(); if (strcmp(pline, "OK\r")) { fprintf(stderr, "Could not write changes: %s\n", pline); exit(EXIT_FAILURE); } if (f != stdin) { fclose(f); } }
/** * * @brief parse la chaine courante de l'interpreteur à la recherche d'une commande, et execute cette commande. * @param inter l'interpreteur qui demande l'analyse * @return CMD_OK_RETURN_VALUE si la commande s'est exécutée avec succès (0) * @return CMD_EXIT_RETURN_VALUE si c'est la commande exit. Dans ce cas, le programme doit se terminer. (-1) * @return CMD_UNKOWN_RETURN_VALUE si la commande n'est pas reconnue. (-2) * @return tout autre nombre (eg tout nombre positif) si erreur d'execution de la commande */ int execute_cmd(interpreteur inter, memory memory) { DEBUG_MSG("input '%s'", inter->input); char cmdStr[MAX_STR]; memset( cmdStr, '\0', MAX_STR ); /* gestion des commandes vides, commentaires, etc*/ if(strlen(inter->input) == 0 || sscanf(inter->input, "%s", cmdStr) == 0 || strlen(cmdStr) == 0 || cmdStr[0] == '#') { /* ligne commence par # => commentaire*/ return CMD_OK_RETURN_VALUE; } /*on identifie la commande avec un premier appel à get_next_token*/ char * token = get_next_token(inter); if(strcmp(token, "exit") == 0) { return exitcmd(inter); } if(strcmp(token, "load") == 0) { return loadcmd(inter, memory); } else if(strcmp(token, "debug") == 0) { return debugcmd(inter); } else if(strcmp(token, "disp") == 0) { return dispcmd(inter, memory); } else if(strcmp(token, "assert") == 0) { return assertcmd(inter, memory); } else if(strcmp(token, "set") == 0) { return setcmd(inter, memory); } else if(strcmp(token, "resume") == 0) { return resumecmd(inter); } else if(strcmp(token, "disasm") == 0) { return disasmcmd(inter, memory); } else if(strcmp(token, "run") == 0) { return runcmd(inter, memory); } else if(strcmp(token, "step") == 0) { return stepcmd(inter, memory); } else if(strcmp(token, "break") == 0) { return breakcmd(inter, memory); } WARNING_MSG("Unknown Command : '%s'\n", cmdStr); return CMD_UNKOWN_RETURN_VALUE; }
void do_dump() { FILE *f = openfile("wb", stdout); cmdmode(); for (size_t i = 0; i != sizeof(cmds)/sizeof(cmds[0]); ++i) { pwrite(cmds[i]); pwrite("\r"); pread(); translate(pline, '\r', '\n'); fprintf(f, "%s%s", cmds[i], pline); } exitcmd(); fflush(f); if (f != stdout) { fclose(f); } }
/** * * @brief parse la chaine courante de l'interpreteur à la recherche d'une commande, et execute cette commande. * @param inter l'interpreteur qui demande l'analyse * @return CMD_OK_RETURN_VALUE si la commande s'est exécutée avec succès (0) * @return CMD_EXIT_RETURN_VALUE si c'est la commande exit. Dans ce cas, le programme doit se terminer. (-1) * @return CMD_UNKOWN_RETURN_VALUE si la commande n'est pas reconnue. (-2) * @return tout autre nombre (eg tout nombre positif) si erreur d'execution de la commande */ int execute_cmd(interpreteur inter, registre r,mem *memory,bp * bpa) { DEBUG_MSG("input '%s'", inter->input); char cmdStr[MAX_STR]; memset( cmdStr, '\0', MAX_STR ); int b=1; /* gestion des commandes vides, commentaires, etc*/ if(strlen(inter->input) == 0 || sscanf(inter->input, "%s", cmdStr) == 0 || strlen(cmdStr) == 0 || cmdStr[0] == '#') { /* ligne commence par # => commentaire*/ return CMD_OK_RETURN_VALUE; } /*on identifie la commande avec un premier appel à get_next_token*/ char * token = get_next_token(inter); if(strcmp(token, "exit") == 0) { return exitcmd(inter); } else if(strcmp(token, "test") == 0) { return testcmd(inter); } /*else if(strcmp(token, "test2") == 0) { //fonction pour essayer des test rapidement (fichiers tests marchent pas sur mac) int i=0; int n=(*memory)->nseg; for(i=0;i<n;i++){ printf("nom segment %s \n",(*memory)->seg[i].name ); } // int i=0; //vaddr32 c=0; char x[20]; strcpy( x, "$pc" ); printf("is_in_text %d %d %d\n",IsInText(*memory,0x2090),IsInText(*memory,0x3003), IsInText(*memory,0x5000) ); printf("%d\n",convert(x)); // printf("memory %p\n", *memory ); // printf("nombre de segments %u\n", (*memory)->nseg ); // for(i=0;i<(int)(*memory)->nseg;i++){ //printf("adresse segment 0x %"PRIu32" +%d \n",(*memory)->seg->start,t*i); // *memory)->seg->start est un unint32 // c=(int)(*memory)->seg->start._64; //printf("%08x\n",c ); //printf(" %"PRIu32"\n",c ); //printf("adresse segment 0x%.8s \n",itoa(c,16)); // } //int a=350; //setRegisterValue(r,31,a); //printf("%d\n", getRegisterValueByStr(r, "$31")); // printf("%s\n",itoa(a,16) ); // printf("%d\n",is_hexa("0x33AB") ); }*/ else if(strcmp(token, "disp") == 0) { return dispcmd(inter,r,*memory); } else if(strcmp(token, "set") == 0) { return setcmd(inter,r,*memory); } else if(strcmp(token, "load") == 0) { return loadcmd(inter,memory,r); } else if(strcmp(token, "assert") == 0) { return assertcmd(inter,r, *memory); } else if(strcmp(token, "debug") == 0) { debugcmd(inter); return CMD_OK_RETURN_VALUE; } else if(strcmp(token, "resume") == 0) { resumecmd(inter); return CMD_OK_RETURN_VALUE; } else if (strcmp(token,"disasm")==0) { return disasmcmd(inter,*memory); } else if (strcmp(token,"step")==0) { return stepinto(inter,r,*memory,&b,bpa,1); } /* else if (strcmp(token,"step")==0) { return True_step(inter,r,*memory, &b, bpa); }*/ else if (strcmp(token,"run")==0) { run(inter,r,*memory,*bpa); return CMD_OK_RETURN_VALUE; } else if (strcmp(token,"break")==0) { breakcmd(inter,*memory, bpa); // DEBUG_MSG("bpa apres break dans emulMips.c %p",*bpa); return CMD_OK_RETURN_VALUE; } else { WARNING_MSG("Unknown Command : '%s'\n", cmdStr); return CMD_UNKOWN_RETURN_VALUE; } }