/**
 *
 * @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;
}
Example #2
0
/**
*
* @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;
}
}