/**
 *
 * @brief extrait la prochaine ligne du flux fp.
 * Si fp ==stdin, utilise la librairie readline pour gestion d'historique de commande.
 *
 * @return 0 si succes.
 * @return un nombre non nul si aucune ligne lue
 */
int  acquire_line(FILE *fp, interpreteur inter) {
    char* chunk =NULL;

    memset(inter->input, '\0', MAX_STR );
    inter->first_token =0;
    if (inter->mode==SCRIPT) {
        // mode fichier
        // acquisition d'une ligne dans le fichier
        chunk =calloc(MAX_STR, sizeof(*chunk));
        char * ret = fgets(chunk, MAX_STR, fp );
        if(ret == NULL) {
            free(chunk);
            return 1;
        }
        // si windows remplace le \r du '\r\n' (fin de ligne windows) par \0
        if(strlen(ret) >1 && ret[strlen(ret) -2] == '\r') {
            ret[strlen(ret)-2] = '\0';
        }
        // si unix remplace le \n par \0
        else if(strlen(ret) >0 && ret[strlen(ret) -1] == '\n') {
            ret[strlen(ret)-1] = '\0';
        }

    }
    else {
        /* mode shell interactif */
        /* on utilise la librarie libreadline pour disposer d'un historique */
        chunk = readline( PROMPT_STRING );
        if (chunk == NULL || strlen(chunk) == 0) {
            /* commande vide... */
            if (chunk != NULL) free(chunk);
            return 1;
        }
        /* ajout de la commande a l'historique, librairie readline */
        add_history( chunk );

    }
    // standardisation de la ligne d'entrée (on met des espaces là ou il faut)
    string_standardise(chunk, inter->input);

    free( chunk ); // liberation de la mémoire allouée par la fonction readline() ou par calloc()

    DEBUG_MSG("Ligne acquise '%s'\n", inter->input); /* macro DEBUG_MSG : uniquement si compil en mode DEBUG_MSG */
    return 0;
}
Example #2
0
int readDico(char* dico_name) {
    FILE* dico_file=NULL;
    dico_file = fopen (dico_name, "r");
    if (dico_file == NULL)
    {
        WARNING_MSG("Can't open dictionnary file '%s'",dico_name);
        return 1;
    }
    char line[INPUT_SIZE];
    char normalized_line[INPUT_SIZE];
    int i,j,k;
    do {
        getFromScript(dico_file,line);
        string_standardise(line, normalized_line);
    } while (normalized_line[0]=='\0');
//on obtient le nombre d'entrée du dico
    sscanf(line, "%d",&nbinstr); //retour d'erreur ?
    dico_data=calloc(nbinstr,sizeof(dico_info));
    for ( i = 0; i < nbinstr; ++i)
    {

        k=0;
        do {
            if(feof(dico_file)) {
                WARNING_MSG("End of dictionnary file reached, incorrect number of entry");
                return -1;
            }
            getFromScript(dico_file,line);
            string_standardise(line, normalized_line);
        } while (normalized_line[0]=='\0');
        char* word;
        //printf("%s\n",normalized_line );
        if(nextword(&word, normalized_line,&k)) {
            strcpy(dico_data[i].name,word);
            //	printf("%s\n",dico_data[i].name );
        }
        else {
            ERROR_MSG("Error reading name in dictionnary for entry %d",i);
        }
        if((nextword(&word, normalized_line,&k))&& (isHexa(word))) {
            dico_data[i].mask=strtol(word,NULL,16);
        }                                      //Recuperation du masque
        else {
            ERROR_MSG("Error reading mask in dictionnary for entry %d",i);
        }
        if((nextword(&word, normalized_line,&k))&& (isHexa(word))) {
            dico_data[i].instr=strtol(word,NULL,16);
        }                                 //Recuperation de la signature
        else {
            ERROR_MSG("Error reading instr in dictionnary for entry %d",i);
        }
        if((nextword(&word, normalized_line,&k))) {                                       //Recuperation du type
            if(!strcmp(word,"r")||!strcmp(word,"R")) {
                dico_data[i].type=0;
            }
            else if (!strcmp(word,"i")||!strcmp(word,"I"))
            {
                dico_data[i].type=1;
            }
            else if (!strcmp(word,"j")||!strcmp(word,"J"))
            {
                dico_data[i].type=2;
            }
            else {
                ERROR_MSG("Error reading type in dictionnary for entry %d",i);
            }
        }
        else {
            ERROR_MSG("Error reading type in dictionnary for entry %d",i);
        }
        if((nextword(&word, normalized_line,&k))&& (isDecimal(word))) {
            dico_data[i].nb_arg=strtol(word,NULL,10);
        }                                //Recuperation du nombre d'arguments
        else {
            ERROR_MSG("Error reading number of arg in dictionnary for entry %d",i);
        }
        for (j = 0; j < dico_data[i].nb_arg; ++j)                                         //Boucle
        {
            if((nextword(&word, normalized_line,&k))) {
                //printf("%s,%d,%d\n",word,i,j);

                strcpy(dico_data[i].argname[j],word);                                      //Recuperation de leurs noms
            }
            else {
                ERROR_MSG("Error reading argument dictionnary for entry %d, argument %d",i,j);
            }
        }
        if((nextword(&word, normalized_line,&k))) {
            WARNING_MSG("Too much argument in dictionnary data for instruction %d",i);
        }

//Ajout des pointeurs de fonctions
        if(!strcmp(dico_data[i].name,"ADD")) {
            dico_data[i].exec=ADD;
        }
        if(!strcmp(dico_data[i].name,"ADDI")) {
            dico_data[i].exec=ADDI;
        }
        if(!strcmp(dico_data[i].name,"ADDIU")) {
            dico_data[i].exec=ADDIU;
        }
        if(!strcmp(dico_data[i].name,"ADDU")) {
            dico_data[i].exec=ADDU;
        }
        if(!strcmp(dico_data[i].name,"AND")) {
            dico_data[i].exec=AND;
        }
        if(!strcmp(dico_data[i].name,"ANDI")) {
            dico_data[i].exec=ANDI;
        }
        if(!strcmp(dico_data[i].name,"BEQ")) {
            dico_data[i].exec=BEQ;
        }
        if(!strcmp(dico_data[i].name,"BGEZ")) {
            dico_data[i].exec=BGEZ;
        }
        if(!strcmp(dico_data[i].name,"BGTZ")) {
            dico_data[i].exec=BGTZ;
        }
        if(!strcmp(dico_data[i].name,"BLEZ")) {
            dico_data[i].exec=BLEZ;
        }
        if(!strcmp(dico_data[i].name,"BLTZ")) {
            dico_data[i].exec=BLTZ;
        }
        if(!strcmp(dico_data[i].name,"BNE")) {
            dico_data[i].exec=BNE;
        }
        if(!strcmp(dico_data[i].name,"BREAK")) {
            dico_data[i].exec=BREAKprog;
        }
        if(!strcmp(dico_data[i].name,"DIV")) {
            dico_data[i].exec=DIV;
        }
        if(!strcmp(dico_data[i].name,"J")) {
            dico_data[i].exec=J;
        }
        if(!strcmp(dico_data[i].name,"JAL")) {
            dico_data[i].exec=JAL;
        }
        if(!strcmp(dico_data[i].name,"JALR")) {
            dico_data[i].exec=JALR;
        }
        if(!strcmp(dico_data[i].name,"JR")) {
            dico_data[i].exec=JR;
        }
        if(!strcmp(dico_data[i].name,"LB")) {
            dico_data[i].exec=LB;
        }
        if(!strcmp(dico_data[i].name,"LBU")) {
            dico_data[i].exec=LBU;
        }
        if(!strcmp(dico_data[i].name,"LUI")) {
            dico_data[i].exec=LUI;
        }
        if(!strcmp(dico_data[i].name,"LW")) {
            dico_data[i].exec=LW;
        }
        if(!strcmp(dico_data[i].name,"MFHI")) {
            dico_data[i].exec=MFHI;
        }
        if(!strcmp(dico_data[i].name,"MFLO")) {
            dico_data[i].exec=MFLO;
        }
        if(!strcmp(dico_data[i].name,"MULT")) {
            dico_data[i].exec=MULT;
        }
        if(!strcmp(dico_data[i].name,"NOP")) {
            dico_data[i].exec=NOP;
        }
        if(!strcmp(dico_data[i].name,"OR")) {
            dico_data[i].exec=OR;
        }
        if(!strcmp(dico_data[i].name,"ORI")) {
            dico_data[i].exec=ORI;
        }
        if(!strcmp(dico_data[i].name,"XOR")) {
            dico_data[i].exec=XOR;
        }
        if(!strcmp(dico_data[i].name,"SB")) {
            dico_data[i].exec=SB;
        }
        if(!strcmp(dico_data[i].name,"SW")) {
            dico_data[i].exec=SW;
        }
        if(!strcmp(dico_data[i].name,"SEB")) {
            dico_data[i].exec=SEB;
        }
        if(!strcmp(dico_data[i].name,"SLL")) {
            dico_data[i].exec=SLL;
        }
        if(!strcmp(dico_data[i].name,"SRA")) {
            dico_data[i].exec=SRA;
        }
        if(!strcmp(dico_data[i].name,"SRL")) {
            dico_data[i].exec=SRL;
        }
        if(!strcmp(dico_data[i].name,"SLT")) {
            dico_data[i].exec=SLT;
        }
        if(!strcmp(dico_data[i].name,"SLTI")) {
            dico_data[i].exec=SLTI;
        }
        if(!strcmp(dico_data[i].name,"SLTIU")) {
            dico_data[i].exec=SLTIU;
        }
        if(!strcmp(dico_data[i].name,"SLTU")) {
            dico_data[i].exec=SLTU;
        }
        if(!strcmp(dico_data[i].name,"SUB")) {
            dico_data[i].exec=SUB;
        }
        if(!strcmp(dico_data[i].name,"SUBU")) {
            dico_data[i].exec=SUBU;
        }
        if(!strcmp(dico_data[i].name,"SYSCALL")) {
            dico_data[i].exec=SYSCALL;
        }





    }
    //tri dico pour éviter les mauvaises combi mask/instr,
    // la flemme d'implémenter un tri fusion
    i=0;
    dico_info temp;
    while(i<nbinstr) {
        if (dico_data[i].mask<dico_data[i+1].mask)
        {
            memcpy(&temp,&dico_data[i+1],sizeof(dico_info));
            memcpy(&dico_data[i+1],&dico_data[i],sizeof(dico_info));
            memcpy(&dico_data[i],&temp,sizeof(dico_info));
            i=0;
        }
        else i++;
    }




    return 0;
}