/** * * @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; }
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; }