/** * commande exit qui ne necessite pas d'analyse syntaxique * @param inter l'interpreteur qui demande l'analyse * @return 0 en case de succes, un nombre positif sinon h */ int exitcmd(interpreteur inter, mem memory, registre* reg, Liste dico, Liste_int l) { //DEBUG_MSG(""); del_inter(inter); del_mem(memory);INFO_MSG("Liberation memoire"); del_reg(reg);INFO_MSG("Liberation des registres"); del_dico(dico);INFO_MSG("Liberation du dictionnaire d'instructions"); supp_Liste_int(l); return cmd_exit; }
/** * Programme principal */ int main ( int argc, char *argv[] ) { /* exemples d'utilisation des macros du fichier notify.h */ INFO_MSG("Debut du programme %s", argv[0]); /* macro INFO_MSG */ interpreteur inter=init_inter(); /* structure gardant les infos et états de l'interpreteur*/ FILE *fp = NULL; /* le flux dans lequel les commande seront lues : stdin (mode shell) ou un fichier */ registre r=NULL; r = registre_new(35); mem memory = NULL; setRegisterValue(r,31,0xff7ff000); if ( argc > 2 ) { usage_ERROR_MSG( argv[0] ); exit( EXIT_FAILURE ); } if(argc == 2 && strcmp(argv[1], "-h") == 0) { usage_ERROR_MSG( argv[0] ); exit( EXIT_SUCCESS ); } /*par defaut : mode shell interactif */ fp = stdin; inter->mode = INTERACTIF; if(argc == 2) { /* mode fichier de commandes */ fp = fopen( argv[1], "r" ); if ( fp == NULL ) { perror( "fopen" ); exit( EXIT_FAILURE ); } inter->mode = SCRIPT; } bp bpi=NULL; /* boucle infinie : lit puis execute une cmd en boucle */ while ( 1 ) { if (acquire_line( fp, inter) == 0 ) { /* Une nouvelle ligne a ete acquise dans le flux fp*/ int res = execute_cmd(inter,r,&memory,&bpi); /* execution de la commande */ // traitement des erreurs switch(res) { case CMD_OK_RETURN_VALUE: break; case CMD_EXIT_RETURN_VALUE: /* sortie propre du programme */ if ( fp != stdin ) { fclose( fp ); } del_inter(inter); registre_del(r); del_mem(memory); exit(EXIT_SUCCESS); break; default: /* erreur durant l'execution de la commande */ /* En mode "fichier" toute erreur implique la fin du programme ! */ if (inter->mode == SCRIPT) { fclose( fp ); del_inter(inter); registre_del(r); del_mem(memory); /*macro ERROR_MSG : message d'erreur puis fin de programme ! */ ERROR_MSG("ERREUR DETECTEE. Aborts"); } break; } } if( inter->mode == SCRIPT && feof(fp) ) { /* mode fichier, fin de fichier => sortie propre du programme */ DEBUG_MSG("FIN DE FICHIER"); fclose( fp ); del_inter(inter); registre_del(r); del_mem(memory); exit(EXIT_SUCCESS); } } /* tous les cas de sortie du programme sont gérés plus haut*/ ERROR_MSG("SHOULD NEVER BE HERE\n"); }