--- rpl/src/analyse.c 2010/04/28 06:41:06 1.12 +++ rpl/src/analyse.c 2010/08/13 21:01:10 1.28 @@ -1,6 +1,6 @@ /* ================================================================================ - RPL/2 (R) version 4.0.15 + RPL/2 (R) version 4.0.18 Copyright (C) 1989-2010 Dr. BERTRAND Joël This file is part of RPL/2. @@ -20,7 +20,7 @@ */ -#include "rpl.conv.h" +#include "rpl-conv.h" /* @@ -46,6 +46,10 @@ creation_instruction(struct_processus *s unsigned char *ptr; + BUG(strlen(instruction) >= d_longueur_maximale_instruction, + printf("%s -> %d >= %d\n", instruction, (int) strlen(instruction), + d_longueur_maximale_instruction)); + if ((*s_etat_processus).arbre_instructions == NULL) { if (((*s_etat_processus).arbre_instructions = @@ -711,6 +715,7 @@ initialisation_instructions(struct_proce INSTRUCTION("APPEND", instruction_append); INSTRUCTION("ARRY->", instruction_array_fleche); INSTRUCTION("ATEXIT", instruction_atexit); + INSTRUCTION("ATPOKE", instruction_atpoke); INSTRUCTION("BESSEL", instruction_bessel); INSTRUCTION("CLRERR", instruction_clrerr); INSTRUCTION("CLRMTX", instruction_clrmtx); @@ -737,6 +742,7 @@ initialisation_instructions(struct_proce INSTRUCTION("LOGGER", instruction_logger); INSTRUCTION("MCLRIN", instruction_mclrin); INSTRUCTION("NRPROC", instruction_nrproc); + INSTRUCTION("PROCID", instruction_procid); INSTRUCTION("PROMPT", instruction_prompt); INSTRUCTION("RCLSWI", instruction_rclswi); INSTRUCTION("RECALL", instruction_recall); @@ -789,6 +795,7 @@ initialisation_instructions(struct_proce //f(x,y)=fnct complexe évaluée sur la grille (x,y) et affichée comme une //fonction paramétrique. INSTRUCTION("INQUIRE", instruction_inquire); + INSTRUCTION("MEMLOCK", instruction_memlock); INSTRUCTION("MTXLOCK", instruction_mtxlock); INSTRUCTION("PERSIST", instruction_persist); INSTRUCTION("PLOTTER", instruction_plotter); @@ -828,12 +835,16 @@ initialisation_instructions(struct_proce INSTRUCTION("AUTOSCALE", instruction_autoscale); INSTRUCTION("BACKSPACE", instruction_backspace); + INSTRUCTION("BACKTRACE", instruction_backtrace); + INSTRUCTION("CLRATEXIT", instruction_clratexit); + INSTRUCTION("CLRATPOKE", instruction_clratpoke); INSTRUCTION("COPYRIGHT", instruction_copyright); //INSTRUCTION("CYLINDRIC"); INSTRUCTION("DAEMONIZE", instruction_daemonize); INSTRUCTION("DROPCNTXT", instruction_dropcntxt); INSTRUCTION("EXTERNALS", instruction_externals); INSTRUCTION("HISTOGRAM", instruction_histogram); + INSTRUCTION("MEMUNLOCK", instruction_memunlock); INSTRUCTION("MTXSTATUS", instruction_mtxstatus); INSTRUCTION("MTXUNLOCK", instruction_mtxunlock); INSTRUCTION("PARAMETER", instruction_parameter); @@ -873,7 +884,10 @@ initialisation_instructions(struct_proce } -inline void * +#ifndef OS2 +extern inline +#endif +void * analyse_instruction(struct_processus *s_etat_processus, unsigned char *ptr) { int pointeur; @@ -940,7 +954,8 @@ analyse(struct_processus *s_etat_process unsigned char *position; unsigned char *bibliotheque_candidate; - unsigned char *instruction_majuscule; + unsigned char instruction_majuscule + [d_longueur_maximale_instruction]; unsigned char registre_instruction_valide; void (*instruction)(); @@ -993,13 +1008,8 @@ analyse(struct_processus *s_etat_process if (fonction == NULL) { - if ((instruction_majuscule = conversion_majuscule( - (*s_etat_processus).instruction_courante)) == NULL) - { - (*s_etat_processus).erreur_systeme = d_es_allocation_memoire; - return; - } - + conversion_majuscule_limitee((*s_etat_processus).instruction_courante, + instruction_majuscule, d_longueur_maximale_instruction); instruction = analyse_instruction(s_etat_processus, instruction_majuscule); @@ -1028,8 +1038,6 @@ analyse(struct_processus *s_etat_process profilage(s_etat_processus, NULL); } } - - free(instruction_majuscule); } else { @@ -1139,6 +1147,7 @@ analyse(struct_processus *s_etat_process -------------------------------------------------------------------------------- */ +# ifndef OS2 if ((*s_etat_processus).pourcentage_maximal_cpu < 100) { getrusage(RUSAGE_SELF, &usage_final); @@ -1194,6 +1203,7 @@ analyse(struct_processus *s_etat_process usage_initial = usage_final; } } +# endif /* -------------------------------------------------------------------------------- @@ -1230,17 +1240,17 @@ analyse(struct_processus *s_etat_process ((*s_etat_processus).erreur_systeme != d_es) || ((*s_etat_processus).exception != d_ep)) { - if ((*s_etat_processus).instruction_derniere_erreur != NULL) - { - free((*s_etat_processus).instruction_derniere_erreur); - (*s_etat_processus).instruction_derniere_erreur = NULL; - } - (*s_etat_processus).niveau_derniere_erreur = (*s_etat_processus).niveau_courant; if ((*s_etat_processus).mode_execution_programme == 'Y') { + if ((*s_etat_processus).instruction_derniere_erreur != NULL) + { + free((*s_etat_processus).instruction_derniere_erreur); + (*s_etat_processus).instruction_derniere_erreur = NULL; + } + if ((*s_etat_processus).instruction_courante == NULL) { if (((*s_etat_processus).instruction_derniere_erreur = @@ -1272,11 +1282,22 @@ analyse(struct_processus *s_etat_process } else { - if (((*s_etat_processus).instruction_derniere_erreur = - formateur(s_etat_processus, 0, - (*s_etat_processus).objet_courant)) == NULL) + if ((*s_etat_processus).objet_courant != NULL) { - return; + if ((*s_etat_processus).instruction_derniere_erreur != NULL) + { + free((*s_etat_processus).instruction_derniere_erreur); + (*s_etat_processus).instruction_derniere_erreur = NULL; + } + + if (((*s_etat_processus).instruction_derniere_erreur = + formateur(s_etat_processus, 0, + (*s_etat_processus).objet_courant)) == NULL) + { + return; + } + + (*s_etat_processus).objet_courant = NULL; } } }