--- rpl/src/analyse.c 2010/01/27 22:22:09 1.2 +++ rpl/src/analyse.c 2010/05/13 19:09:18 1.17 @@ -1,6 +1,6 @@ /* ================================================================================ - RPL/2 (R) version 4.0.10 + RPL/2 (R) version 4.0.15 Copyright (C) 1989-2010 Dr. BERTRAND Joël This file is part of RPL/2. @@ -25,7 +25,7 @@ /* ================================================================================ - Analyseur syntaxique de l'interpréteur RPL/2 + Analyseur syntaxique de l'interprète RPL/2 ================================================================================ Entrées : -------------------------------------------------------------------------------- @@ -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 = @@ -710,6 +714,7 @@ initialisation_instructions(struct_proce INSTRUCTION("APPEND", instruction_append); INSTRUCTION("ARRY->", instruction_array_fleche); + INSTRUCTION("ATEXIT", instruction_atexit); INSTRUCTION("BESSEL", instruction_bessel); INSTRUCTION("CLRERR", instruction_clrerr); INSTRUCTION("CLRMTX", instruction_clrmtx); @@ -736,6 +741,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); @@ -788,6 +794,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); @@ -811,6 +818,7 @@ initialisation_instructions(struct_proce INSTRUCTION("CONTINUE", instruction_continue); INSTRUCTION("DUPCNTXT", instruction_dupcntxt); INSTRUCTION("FUNCTION", instruction_function); + INSTRUCTION("IMPLICIT", instruction_implicit); INSTRUCTION("KEYLABEL", instruction_keylabel); INSTRUCTION("KEYTITLE", instruction_keytitle); INSTRUCTION("LOGSCALE", instruction_logscale); @@ -826,12 +834,14 @@ initialisation_instructions(struct_proce INSTRUCTION("AUTOSCALE", instruction_autoscale); INSTRUCTION("BACKSPACE", instruction_backspace); + INSTRUCTION("CLRATEXIT", instruction_clratexit); 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); @@ -871,7 +881,7 @@ initialisation_instructions(struct_proce } -inline void * +extern inline void * analyse_instruction(struct_processus *s_etat_processus, unsigned char *ptr) { int pointeur; @@ -938,7 +948,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)(); @@ -955,6 +966,7 @@ analyse(struct_processus *s_etat_process * On autorise l'exécution d'un fork() dans un thread concurrent. */ +# ifndef SEMAPHORES_NOMMES if (sem_post(&((*s_etat_processus).semaphore_fork)) != 0) { (*s_etat_processus).erreur_systeme = d_es_processus; @@ -969,18 +981,29 @@ analyse(struct_processus *s_etat_process return; } } +# else + if (sem_post((*s_etat_processus).semaphore_fork) != 0) + { + (*s_etat_processus).erreur_systeme = d_es_processus; + return; + } - scrutation_injection(s_etat_processus); - - if (fonction == NULL) + while(sem_wait((*s_etat_processus).semaphore_fork) == -1) { - if ((instruction_majuscule = conversion_majuscule( - (*s_etat_processus).instruction_courante)) == NULL) + if (errno != EINTR) { - (*s_etat_processus).erreur_systeme = d_es_allocation_memoire; + (*s_etat_processus).erreur_systeme = d_es_processus; return; } + } +# endif + + scrutation_injection(s_etat_processus); + if (fonction == NULL) + { + conversion_majuscule_limitee((*s_etat_processus).instruction_courante, + instruction_majuscule, d_longueur_maximale_instruction); instruction = analyse_instruction(s_etat_processus, instruction_majuscule); @@ -1009,8 +1032,6 @@ analyse(struct_processus *s_etat_process profilage(s_etat_processus, NULL); } } - - free(instruction_majuscule); } else {