File:  [local] / rpl / src / analyse.c
Revision 1.116: download - view: text, annotated - select for diffs - revision graph
Fri Jan 10 11:15:39 2020 UTC (4 years, 3 months ago) by bertrand
Branches: MAIN
CVS tags: rpl-4_1_32, HEAD
Modification du copyright.

    1: /*
    2: ================================================================================
    3:   RPL/2 (R) version 4.1.32
    4:   Copyright (C) 1989-2020 Dr. BERTRAND Joël
    5: 
    6:   This file is part of RPL/2.
    7: 
    8:   RPL/2 is free software; you can redistribute it and/or modify it
    9:   under the terms of the CeCILL V2 License as published by the french
   10:   CEA, CNRS and INRIA.
   11:  
   12:   RPL/2 is distributed in the hope that it will be useful, but WITHOUT
   13:   ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
   14:   FITNESS FOR A PARTICULAR PURPOSE.  See the CeCILL V2 License
   15:   for more details.
   16:  
   17:   You should have received a copy of the CeCILL License
   18:   along with RPL/2. If not, write to info@cecill.info.
   19: ================================================================================
   20: */
   21: 
   22: 
   23: #include "rpl-conv.h"
   24: 
   25: 
   26: /*
   27: ================================================================================
   28:   Analyseur syntaxique de l'interprète RPL/2
   29: ================================================================================
   30:   Entrées :
   31: --------------------------------------------------------------------------------
   32:   Sorties :
   33: --------------------------------------------------------------------------------
   34:   Effets de bord : néant
   35: ================================================================================
   36: */
   37: 
   38: static void
   39: creation_instruction(struct_processus *s_etat_processus,
   40:         unsigned char *instruction, void (*routine)())
   41: {
   42:     int                     i;
   43: 
   44:     struct_instruction      *l_instruction_courante;
   45: 
   46:     unsigned char           *ptr;
   47: 
   48:     BUG(strlen(instruction) >= d_longueur_maximale_instruction,
   49:             printf("%s -> %d >= %d\n", instruction, (int) strlen(instruction),
   50:             d_longueur_maximale_instruction));
   51: 
   52:     if ((*s_etat_processus).arbre_instructions == NULL)
   53:     {
   54:         if (((*s_etat_processus).arbre_instructions =
   55:                 malloc(sizeof(struct_instruction))) == NULL)
   56:         {
   57:             (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
   58:             return;
   59:         }
   60: 
   61:         (*(*s_etat_processus).arbre_instructions).feuille = NULL;
   62: 
   63:         if (((*(*s_etat_processus).arbre_instructions).noeuds =
   64:                 malloc(((size_t) (*s_etat_processus).nombre_caracteres)
   65:                 * sizeof(struct_instruction))) == NULL)
   66:         {
   67:             (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
   68:             return;
   69:         }
   70: 
   71:         for(i = 0; i < (*s_etat_processus).nombre_caracteres; i++)
   72:         {
   73:             (*(*s_etat_processus).arbre_instructions).noeuds[i] = NULL;
   74:         }
   75:     }
   76: 
   77:     l_instruction_courante = (*s_etat_processus).arbre_instructions;
   78:     ptr = instruction;
   79: 
   80:     while((*ptr) != d_code_fin_chaine)
   81:     {
   82:         BUG((*s_etat_processus).pointeurs_caracteres[*ptr] < 0,
   83:                 printf("Instruction=\"%s\", (*ptr)='%c'\n",
   84:                 instruction, *ptr));
   85: 
   86:         if ((*l_instruction_courante).noeuds[(*s_etat_processus)
   87:                 .pointeurs_caracteres[*ptr]] == NULL)
   88:         {
   89:             // Le noeud suivant n'existe pas, on le crée.
   90: 
   91:             if (((*l_instruction_courante).noeuds[(*s_etat_processus)
   92:                     .pointeurs_caracteres[*ptr]] =
   93:                     malloc(sizeof(struct_instruction))) == NULL)
   94:             {
   95:                 (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
   96:                 return;
   97:             }
   98: 
   99:             (*(*l_instruction_courante).noeuds[(*s_etat_processus)
  100:                     .pointeurs_caracteres[*ptr]]).feuille = NULL;
  101: 
  102:             if (((*(*l_instruction_courante).noeuds[(*s_etat_processus)
  103:                     .pointeurs_caracteres[*ptr]]).noeuds =
  104:                     malloc(((size_t) (*s_etat_processus).nombre_caracteres)
  105:                     * sizeof(struct_instruction))) == NULL)
  106:             {
  107:                 (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
  108:                 return;
  109:             }
  110: 
  111:             for(i = 0; i < (*s_etat_processus).nombre_caracteres; i++)
  112:             {
  113:                 (*(*l_instruction_courante).noeuds[(*s_etat_processus)
  114:                         .pointeurs_caracteres[*ptr]]).noeuds[i] = NULL;
  115:             }
  116:         }
  117: 
  118:         l_instruction_courante = (*l_instruction_courante).noeuds
  119:                 [(*s_etat_processus).pointeurs_caracteres[*ptr]];
  120:         ptr++;
  121:     }
  122: 
  123:     BUG((*l_instruction_courante).feuille != NULL,
  124:             printf("Instruction=\"%s\"\n", instruction));
  125: 
  126:     (*l_instruction_courante).feuille = routine;
  127: 
  128:     return;
  129: }
  130: 
  131: 
  132: void
  133: liberation_arbre_instructions(struct_processus *s_etat_processus,
  134:         struct_instruction *arbre)
  135: {
  136:     int                 i;
  137: 
  138:     for(i = 0; i < (*s_etat_processus).nombre_caracteres; i++)
  139:     {
  140:         if ((*arbre).noeuds[i] != NULL)
  141:         {
  142:             liberation_arbre_instructions(s_etat_processus, (*arbre).noeuds[i]);
  143:         }
  144:     }
  145: 
  146:     free((*arbre).noeuds);
  147:     free(arbre);
  148: 
  149:     return;
  150: }
  151: 
  152: 
  153: /*
  154:  * Caractères autorisés dans les instructions
  155:  *
  156:  * A B C D E F G H I J K L M N O P Q R S T U V W X Y Z
  157:  * e i (mais traités comme des majuscules grâce à 'instruction_*_sensible()'
  158:  * + - * / % ^ < > = ? 1 2
  159:  */
  160: 
  161: void
  162: initialisation_instructions(struct_processus *s_etat_processus)
  163: {
  164:     int             decalage;
  165:     int             i;
  166:     int             longueur_tableau;
  167: 
  168:     unsigned char   caractere;
  169: 
  170:     // Récupération de la longueur d'un unsigned char
  171: 
  172:     longueur_tableau = 1;
  173:     decalage = 0;
  174:     caractere = 1;
  175: 
  176:     while((1L << decalage) == (long) ((unsigned char) (caractere << decalage)))
  177:     {
  178:         decalage++;
  179:         longueur_tableau *= 2;
  180:     }
  181: 
  182:     if (((*s_etat_processus).pointeurs_caracteres =
  183:             malloc(((size_t) longueur_tableau * sizeof(int)))) == NULL)
  184:     {
  185:         (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
  186:         return;
  187:     }
  188: 
  189:     for(i = 0; i < longueur_tableau; i++)
  190:     {
  191:         (*s_etat_processus).pointeurs_caracteres[i] = -1;
  192:     }
  193: 
  194:     (*s_etat_processus).nombre_caracteres = 0;
  195: 
  196: #define DECLARATION_CARACTERE(c) \
  197:         do { (*s_etat_processus).pointeurs_caracteres[c] = \
  198:         (*s_etat_processus).nombre_caracteres++; } while(0)
  199: 
  200:     DECLARATION_CARACTERE('A');
  201:     DECLARATION_CARACTERE('B');
  202:     DECLARATION_CARACTERE('C');
  203:     DECLARATION_CARACTERE('D');
  204:     DECLARATION_CARACTERE('E');
  205:     DECLARATION_CARACTERE('F');
  206:     DECLARATION_CARACTERE('G');
  207:     DECLARATION_CARACTERE('H');
  208:     DECLARATION_CARACTERE('I');
  209:     DECLARATION_CARACTERE('J');
  210:     DECLARATION_CARACTERE('K');
  211:     DECLARATION_CARACTERE('L');
  212:     DECLARATION_CARACTERE('M');
  213:     DECLARATION_CARACTERE('N');
  214:     DECLARATION_CARACTERE('O');
  215:     DECLARATION_CARACTERE('P');
  216:     DECLARATION_CARACTERE('Q');
  217:     DECLARATION_CARACTERE('R');
  218:     DECLARATION_CARACTERE('S');
  219:     DECLARATION_CARACTERE('T');
  220:     DECLARATION_CARACTERE('U');
  221:     DECLARATION_CARACTERE('V');
  222:     DECLARATION_CARACTERE('W');
  223:     DECLARATION_CARACTERE('X');
  224:     DECLARATION_CARACTERE('Y');
  225:     DECLARATION_CARACTERE('Z');
  226:     DECLARATION_CARACTERE('+');
  227:     DECLARATION_CARACTERE('-');
  228:     DECLARATION_CARACTERE('/');
  229:     DECLARATION_CARACTERE('*');
  230:     DECLARATION_CARACTERE('%');
  231:     DECLARATION_CARACTERE('^');
  232:     DECLARATION_CARACTERE('<');
  233:     DECLARATION_CARACTERE('>');
  234:     DECLARATION_CARACTERE('=');
  235:     DECLARATION_CARACTERE('?');
  236:     DECLARATION_CARACTERE('1');
  237:     DECLARATION_CARACTERE('2');
  238: 
  239: #undef DECLARATION_CARACTERE
  240: 
  241: #define INSTRUCTION(chaine, fonction) \
  242:         creation_instruction(s_etat_processus, chaine, fonction)
  243: 
  244:     INSTRUCTION("E", instruction_sensible_e);
  245:     INSTRUCTION("I", instruction_sensible_i);
  246:     INSTRUCTION("+", instruction_plus);
  247:     INSTRUCTION("-", instruction_moins);
  248:     INSTRUCTION("*", instruction_multiplication);
  249:     INSTRUCTION("/", instruction_division);
  250:     INSTRUCTION("%", instruction_pourcent);
  251:     INSTRUCTION("^", instruction_puissance);
  252:     INSTRUCTION("<", instruction_lt);
  253:     INSTRUCTION("=", instruction_egalite);
  254:     INSTRUCTION(">", instruction_gt);
  255: 
  256:     INSTRUCTION("CF", instruction_cf);
  257:     INSTRUCTION("CR", instruction_cr);
  258:     INSTRUCTION("DO", instruction_do);
  259:     INSTRUCTION("FP", instruction_fp);
  260:     INSTRUCTION("IF", instruction_if);
  261:     INSTRUCTION("IM", instruction_im);
  262:     INSTRUCTION("IN", instruction_in);
  263:     INSTRUCTION("IP", instruction_ip);
  264:     INSTRUCTION("LN", instruction_ln);
  265:     INSTRUCTION("LQ", instruction_lq);
  266:     INSTRUCTION("LU", instruction_lu);
  267:     INSTRUCTION("NS", instruction_ns);
  268:     INSTRUCTION("OR", instruction_or);
  269:     INSTRUCTION("PI", instruction_pi);
  270:     INSTRUCTION("QR", instruction_qr);
  271:     INSTRUCTION("RE", instruction_re);
  272:     INSTRUCTION("RL", instruction_rl);
  273:     INSTRUCTION("RR", instruction_rr);
  274:     INSTRUCTION("SF", instruction_sf);
  275:     INSTRUCTION("SL", instruction_sl);
  276:     INSTRUCTION("SQ", instruction_sq);
  277:     INSTRUCTION("SR", instruction_sr);
  278:     INSTRUCTION("SX", instruction_sx);
  279:     INSTRUCTION("SY", instruction_sy);
  280:     INSTRUCTION("S+", instruction_s_plus);
  281:     INSTRUCTION("S-", instruction_s_moins);
  282:     INSTRUCTION("->", instruction_fleche);
  283:     INSTRUCTION("*D", instruction_star_d);
  284:     INSTRUCTION("*H", instruction_star_h);
  285:     INSTRUCTION("*S", instruction_star_s);
  286:     INSTRUCTION("*W", instruction_star_w);
  287:     INSTRUCTION("**", instruction_puissance);
  288:     INSTRUCTION("%T", instruction_pourcent_t);
  289:     INSTRUCTION("<=", instruction_le);
  290:     INSTRUCTION("<<", instruction_vers_niveau_superieur);
  291:     INSTRUCTION("<>", instruction_ne);
  292:     INSTRUCTION("==", instruction_same);
  293:     INSTRUCTION("=>", instruction_ge);
  294:     INSTRUCTION("=<", instruction_le);
  295:     INSTRUCTION(">=", instruction_ge);
  296:     INSTRUCTION(">>", instruction_vers_niveau_inferieur);
  297: 
  298:     INSTRUCTION("ABS", instruction_abs);
  299:     INSTRUCTION("AND", instruction_and);
  300:     //INSTRUCTION("ARC")
  301:     //(centre, rayon, theta1, theta2 dans le sens trigonométrique)
  302:     INSTRUCTION("ARG", instruction_arg);
  303:     INSTRUCTION("ASL", instruction_asl);
  304:     INSTRUCTION("ASR", instruction_asr);
  305:     //INSTRUCTION("BAR")
  306:     //Instruction HP48 (sélectionne le type de graphique à barres)
  307:     //Chaque point est représenté par une barre verticale.
  308:     INSTRUCTION("BIN", instruction_bin);
  309:     //INSTRUCTION("BOX")
  310:     //(point 1, point 2)
  311:     INSTRUCTION("CHR", instruction_chr);
  312:     INSTRUCTION("CLS", instruction_cls);
  313:     INSTRUCTION("CON", instruction_con);
  314:     INSTRUCTION("COS", instruction_cos);
  315:     INSTRUCTION("COV", instruction_cov);
  316:     INSTRUCTION("DEC", instruction_dec);
  317:     INSTRUCTION("DEG", instruction_deg);
  318:     INSTRUCTION("DER", instruction_der);
  319:     INSTRUCTION("DET", instruction_det);
  320:     INSTRUCTION("DFT", instruction_dft);
  321:     INSTRUCTION("DOT", instruction_dot);
  322:     INSTRUCTION("DUP", instruction_dup);
  323:     INSTRUCTION("EGV", instruction_egv);
  324:     INSTRUCTION("END", instruction_end);
  325:     INSTRUCTION("ENG", instruction_eng);
  326:     INSTRUCTION("EQV", instruction_eqv);
  327:     INSTRUCTION("EXP", instruction_exp);
  328:     INSTRUCTION("FC?", instruction_fc_test);
  329:     INSTRUCTION("FFT", instruction_fft);
  330:     //INSTRUCTION("FIT")
  331:     //Extension RPL/2 (choix de la méthode de régression, par défaut, 'LINEAR'.
  332:     //Les types sont
  333:     //'LINEAR' => y = b + mx
  334:     //'LOGARITHMIC' => y = b + m ln(x)
  335:     //'EXPONENTIAL' => y = be^(mx) ou ln(y) = ln(b) + mx
  336:     //'POWER' => y = bx^m ou ln(y) = ln(b) + m ln(x)
  337:     INSTRUCTION("FIX", instruction_fix);
  338:     INSTRUCTION("FOR", instruction_for);
  339:     INSTRUCTION("FS?", instruction_fs_test);
  340:     INSTRUCTION("GET", instruction_get);
  341:     INSTRUCTION("HEX", instruction_hex);
  342:     INSTRUCTION("IDN", instruction_idn);
  343:     INSTRUCTION("IFT", instruction_ift);
  344:     INSTRUCTION("INT", instruction_int);
  345:     INSTRUCTION("INV", instruction_inv);
  346:     INSTRUCTION("KEY", instruction_key);
  347:     INSTRUCTION("LOG", instruction_log);
  348:     INSTRUCTION("LSQ", instruction_lsq);
  349:     INSTRUCTION("MAX", instruction_max);
  350:     INSTRUCTION("MEM", instruction_mem);
  351:     INSTRUCTION("MIN", instruction_min);
  352:     INSTRUCTION("MOD", instruction_mod);
  353:     INSTRUCTION("NEG", instruction_neg);
  354:     INSTRUCTION("NOT", instruction_not);
  355:     INSTRUCTION("NUM", instruction_num);
  356:     INSTRUCTION("OCT", instruction_oct);
  357:     INSTRUCTION("POS", instruction_pos);
  358:     INSTRUCTION("PR1", instruction_pr1);
  359:     INSTRUCTION("PUT", instruction_put);
  360:     INSTRUCTION("RAD", instruction_rad);
  361:     INSTRUCTION("RCI", instruction_rci);
  362:     INSTRUCTION("RCL", instruction_rcl);
  363:     INSTRUCTION("RDM", instruction_rdm);
  364:     INSTRUCTION("RDZ", instruction_rdz);
  365:     INSTRUCTION("RES", instruction_res);
  366:     INSTRUCTION("RLB", instruction_rlb);
  367:     INSTRUCTION("RND", instruction_rnd);
  368:     INSTRUCTION("ROT", instruction_rot);
  369:     INSTRUCTION("RRB", instruction_rrb);
  370:     INSTRUCTION("RSD", instruction_rsd);
  371:     INSTRUCTION("SCI", instruction_sci);
  372:     INSTRUCTION("SIN", instruction_sin);
  373:     INSTRUCTION("SLB", instruction_slb);
  374:     INSTRUCTION("SRB", instruction_srb);
  375:     INSTRUCTION("SST", instruction_sst);
  376:     INSTRUCTION("STD", instruction_std);
  377:     INSTRUCTION("STO", instruction_sto);
  378:     INSTRUCTION("SVD", instruction_svd);
  379:     INSTRUCTION("SVL", instruction_svl);
  380:     INSTRUCTION("SUB", instruction_sub);
  381:     INSTRUCTION("SWI", instruction_swi);
  382:     INSTRUCTION("SX2", instruction_sx2);
  383:     INSTRUCTION("SXY", instruction_sxy);
  384:     INSTRUCTION("SY2", instruction_sy2);
  385:     INSTRUCTION("TAN", instruction_tan);
  386:     INSTRUCTION("TOT", instruction_tot);
  387:     INSTRUCTION("TRN", instruction_trn);
  388:     INSTRUCTION("USE", instruction_use);
  389:     INSTRUCTION("VAR", instruction_var);
  390:     //INSTRUCTION("V->")
  391:     //Instruction HP48 (éclate un vecteur [ x y ] => x y quel que soit le
  392:     //système de
  393:     //coordonnées)
  394:     INSTRUCTION("XOR", instruction_xor);
  395:     INSTRUCTION("->Q", instruction_fleche_q);
  396:     INSTRUCTION("%CH", instruction_pourcent_ch);
  397: 
  398:     INSTRUCTION("ACOS", instruction_acos);
  399:     INSTRUCTION("ALOG", instruction_alog);
  400:     INSTRUCTION("ASIN", instruction_asin);
  401:     INSTRUCTION("ATAN", instruction_atan);
  402:     INSTRUCTION("AXES", instruction_axes);
  403:     INSTRUCTION("BEEP", instruction_beep);
  404:     INSTRUCTION("B->R", instruction_b_vers_r);
  405:     INSTRUCTION("CASE", instruction_case);
  406:     INSTRUCTION("CEIL", instruction_ceil);
  407:     INSTRUCTION("CLMF", instruction_clmf);
  408:     INSTRUCTION("CNRM", instruction_cnrm);
  409:     INSTRUCTION("COLS", instruction_cols);
  410:     INSTRUCTION("COL+", instruction_col_plus);
  411:     INSTRUCTION("COL-", instruction_col_moins);
  412:     INSTRUCTION("COMB", instruction_comb);
  413:     INSTRUCTION("COND", instruction_cond);
  414:     INSTRUCTION("CONJ", instruction_conj);
  415:     INSTRUCTION("CONT", instruction_cont);
  416:     INSTRUCTION("COPY", instruction_copy);
  417:     INSTRUCTION("CORR", instruction_corr);
  418:     INSTRUCTION("COSH", instruction_cosh);
  419:     INSTRUCTION("CSWP", instruction_cswp);
  420:     INSTRUCTION("C->R", instruction_c_vers_r);
  421:     INSTRUCTION("DATE", instruction_date);
  422:     INSTRUCTION("DECR", instruction_decr);
  423:     INSTRUCTION("DISP", instruction_disp);
  424:     INSTRUCTION("DRAW", instruction_draw);
  425:     INSTRUCTION("DRAX", instruction_drax);
  426:     INSTRUCTION("DROP", instruction_drop);
  427:     INSTRUCTION("DRWS", instruction_drws);
  428:     INSTRUCTION("DUP2", instruction_dup2);
  429:     INSTRUCTION("DUPN", instruction_dupn);
  430:     INSTRUCTION("D->R", instruction_d_vers_r);
  431:     INSTRUCTION("EDIT", instruction_edit);
  432:     INSTRUCTION("EGVL", instruction_egvl);
  433:     INSTRUCTION("ELSE", instruction_else);
  434:     INSTRUCTION("ERRM", instruction_errm);
  435:     INSTRUCTION("ERRN", instruction_errn);
  436:     INSTRUCTION("EVAL", instruction_eval);
  437:     INSTRUCTION("EXIT", instruction_exit);
  438:     INSTRUCTION("EXPM", instruction_expm);
  439:     INSTRUCTION("FACT", instruction_fact);
  440:     INSTRUCTION("FC?C", instruction_fc_test_c);
  441:     INSTRUCTION("FC?S", instruction_fc_test_s);
  442:     //INSTRUCTION("FORM")
  443:     INSTRUCTION("FS?C", instruction_fs_test_c);
  444:     INSTRUCTION("FS?S", instruction_fs_test_s);
  445:     INSTRUCTION("FUSE", instruction_fuse);
  446:     INSTRUCTION("GEGV", instruction_gegv);
  447:     INSTRUCTION("GETC", instruction_getc);
  448:     INSTRUCTION("GETI", instruction_geti);
  449:     INSTRUCTION("GETR", instruction_getr);
  450:     INSTRUCTION("HALT", instruction_halt);
  451:     INSTRUCTION("HEAD", instruction_head);
  452:     INSTRUCTION("HELP", instruction_help);
  453:     INSTRUCTION("HMS+", instruction_hms_plus);
  454:     INSTRUCTION("HMS-", instruction_hms_moins);
  455:     //INSTRUCTION("HOME");
  456:     INSTRUCTION("IDFT", instruction_idft);
  457:     INSTRUCTION("IFFT", instruction_ifft);
  458:     INSTRUCTION("IFTE", instruction_ifte);
  459:     INSTRUCTION("INCR", instruction_incr);
  460:     //INSTRUCTION("ISOL");
  461:     INSTRUCTION("ISWI", instruction_iswi);
  462:     INSTRUCTION("KILL", instruction_kill);
  463:     INSTRUCTION("KIND", instruction_kind);
  464:     INSTRUCTION("LAST", instruction_last);
  465:     INSTRUCTION("LEGV", instruction_legv);
  466:     INSTRUCTION("LINE", instruction_line);
  467:     INSTRUCTION("LNP1", instruction_lnp1);
  468:     INSTRUCTION("LOCK", instruction_lock);
  469:     INSTRUCTION("L->T", instruction_l_vers_t);
  470:     INSTRUCTION("MANT", instruction_mant);
  471:     INSTRUCTION("MARK", instruction_mark);
  472:     //INSTRUCTION("MAXR")
  473:     INSTRUCTION("MAXS", instruction_maxs);
  474:     INSTRUCTION("MEAN", instruction_mean);
  475:     //INSTRUCTION("MINR");
  476:     INSTRUCTION("MINS", instruction_mins); // MAXDOUBLE/MINDOUBLE
  477:     INSTRUCTION("NEXT", instruction_next);
  478:     //INSTRUCTION("NUMX");
  479:     //INSTRUCTION("NUMY");
  480:     INSTRUCTION("OPEN", instruction_open);
  481:     INSTRUCTION("OVER", instruction_over);
  482:     //INSTRUCTION("PATH");
  483:     INSTRUCTION("PCOV", instruction_pcov);
  484:     INSTRUCTION("PEEK", instruction_peek);
  485:     INSTRUCTION("PERM", instruction_perm);
  486:     INSTRUCTION("PICK", instruction_pick);
  487:     INSTRUCTION("PLOT", instruction_plot);
  488:     INSTRUCTION("PMAX", instruction_pmax);
  489:     INSTRUCTION("PMIN", instruction_pmin);
  490:     INSTRUCTION("POKE", instruction_poke);
  491:     INSTRUCTION("POLL", instruction_poll);
  492:     INSTRUCTION("PPAR", instruction_ppar);
  493:     INSTRUCTION("PRMD", instruction_prmd);
  494:     INSTRUCTION("PRST", instruction_prst);
  495:     INSTRUCTION("PUTC", instruction_putc);
  496:     INSTRUCTION("PUTI", instruction_puti);
  497:     INSTRUCTION("PUTR", instruction_putr);
  498:     INSTRUCTION("PVAR", instruction_pvar);
  499:     INSTRUCTION("P->R", instruction_p_vers_r);
  500:     //INSTRUCTION("QUAD");
  501:     INSTRUCTION("RAND", instruction_rand);
  502:     INSTRUCTION("RANK", instruction_rank);
  503:     //INSTRUCTION("RANM")
  504:     //Instruction HP48 (crée une matrice aléatoire
  505:     //{ nb_lignes nb_colonnes } ou tableau quelconque dont les éléments seront
  506:     //modifiés pour prendre des valeurs aléatoires entre -9 et 9)
  507:     INSTRUCTION("RCEQ", instruction_rceq);
  508:     INSTRUCTION("RCIJ", instruction_rcij);
  509:     INSTRUCTION("RCLF", instruction_rclf);
  510:     INSTRUCTION("RCLS", instruction_rcls);
  511:     INSTRUCTION("RCWS", instruction_rcws);
  512:     INSTRUCTION("RDGN", instruction_rdgn);
  513:     INSTRUCTION("READ", instruction_read);
  514:     INSTRUCTION("RECV", instruction_recv);
  515:     INSTRUCTION("REGV", instruction_regv);
  516:     INSTRUCTION("REPL", instruction_repl);
  517:     INSTRUCTION("RGDL", instruction_rgdl);
  518:     INSTRUCTION("RGDR", instruction_rgdr);
  519:     INSTRUCTION("RNRM", instruction_rnrm);
  520:     INSTRUCTION("ROLL", instruction_roll);
  521:     //INSTRUCTION("ROOT")
  522:     INSTRUCTION("ROW-", instruction_row_moins);
  523:     INSTRUCTION("ROW+", instruction_row_plus);
  524:     //INSTRUCTION("RREF")
  525:     //Instruction HP48 (transforme [A B] en [I C] par combinaisons linéaires
  526:     //de lignes)
  527:     INSTRUCTION("RSWP", instruction_rswp);
  528:     INSTRUCTION("R->B", instruction_r_vers_b);
  529:     INSTRUCTION("R->C", instruction_r_vers_c);
  530:     INSTRUCTION("R->D", instruction_r_vers_d);
  531:     INSTRUCTION("R->P", instruction_r_vers_p);
  532:     INSTRUCTION("SAME", instruction_same);
  533:     INSTRUCTION("SAVE", instruction_save);
  534:     INSTRUCTION("SCLS", instruction_scls);
  535:     INSTRUCTION("SDEV", instruction_sdev);
  536:     INSTRUCTION("SEND", instruction_send);
  537:     //INSTRUCTION("SHOW");
  538:     INSTRUCTION("SIGN", instruction_sign);
  539:     INSTRUCTION("SINH", instruction_sinh);
  540:     INSTRUCTION("SINV", instruction_sinv);
  541:     INSTRUCTION("SIZE", instruction_size);
  542:     INSTRUCTION("SNEG", instruction_sneg);
  543:     INSTRUCTION("SORT", instruction_sort);
  544:     INSTRUCTION("SPAR", instruction_spar);
  545:     INSTRUCTION("SQRT", instruction_sqrt);
  546:     //INSTRUCTION("SRAD");
  547:     INSTRUCTION("SREV", instruction_srev);
  548:     //INSTRUCTION("SRNM")
  549:     //Instruction HP48 (renvoie la norme spectrale d'un tableau. Pour une
  550:     //matrice,
  551:     //la norme spectrale est égale à sa plus grande valeur singulière. Pour un
  552:     //vecteur, la fonction est équivalente à ABS.
  553:     INSTRUCTION("STEP", instruction_step);
  554:     INSTRUCTION("STEQ", instruction_steq);
  555:     INSTRUCTION("STO*", instruction_sto_fois);
  556:     INSTRUCTION("STO+", instruction_sto_plus);
  557:     INSTRUCTION("STO-", instruction_sto_moins);
  558:     INSTRUCTION("STO/", instruction_sto_division);
  559:     INSTRUCTION("STOF", instruction_stof);
  560:     INSTRUCTION("STOP", instruction_stop);
  561:     INSTRUCTION("STOS", instruction_stos);
  562:     INSTRUCTION("STWS", instruction_stws);
  563:     INSTRUCTION("SWAP", instruction_swap);
  564:     INSTRUCTION("SYNC", instruction_sync);
  565:     INSTRUCTION("TAIL", instruction_tail);
  566:     INSTRUCTION("TANH", instruction_tanh);
  567:     INSTRUCTION("THEN", instruction_then);
  568:     INSTRUCTION("TIME", instruction_time);
  569:     INSTRUCTION("TRIM", instruction_trim);
  570:     INSTRUCTION("TRNC", instruction_trnc);
  571:     INSTRUCTION("TRUE", instruction_true);
  572:     INSTRUCTION("TYPE", instruction_type);
  573:     INSTRUCTION("T->L", instruction_t_vers_l);
  574:     INSTRUCTION("UTPC", instruction_utpc);
  575:     INSTRUCTION("UTPF", instruction_utpf);
  576:     INSTRUCTION("UTPN", instruction_utpn);
  577:     INSTRUCTION("UTPT", instruction_utpt);
  578:     INSTRUCTION("VARS", instruction_vars);
  579:     INSTRUCTION("WAIT", instruction_wait);
  580:     INSTRUCTION("XCOL", instruction_xcol);
  581:     INSTRUCTION("XPON", instruction_xpon);
  582:     //INSTRUCTION("XRNG")
  583:     //INSTRUCTION("XVOL")
  584:     INSTRUCTION("YCOL", instruction_ycol);
  585:     //INSTRUCTION("YRNG")
  586:     //INSTRUCTION("YVOL")
  587:     //INSTRUCTION("ZVOL")
  588:     //INSTRUCTION("->V2")
  589:     //Instruction HP48 (combine deux réels x et y en un vecteur 2D en fonction
  590:     //du mode de coordonnées en cours => [ x y ] et ce quel que soit le système
  591:     //de coordonnées courant)
  592:     //INSTRUCTION("->V3")
  593: 
  594:     INSTRUCTION("ABORT", instruction_abort);
  595:     INSTRUCTION("ACOSH", instruction_acosh);
  596:     INSTRUCTION("ALARM", instruction_alarm);
  597:     INSTRUCTION("ASINH", instruction_asinh);
  598:     INSTRUCTION("ATANH", instruction_atanh);
  599:     //INSTRUCTION("BYTES");
  600:     INSTRUCTION("CENTR", instruction_centr);
  601:     //INSTRUCTION("CIRCL");
  602:     INSTRUCTION("CLEAR", instruction_clear);
  603:     INSTRUCTION("CLLCD", instruction_cllcd);
  604:     INSTRUCTION("CLOSE", instruction_close);
  605:     INSTRUCTION("CLUSR", instruction_clusr);
  606:     //INSTRUCTION("CLVAR");
  607:     //INSTRUCTION("COLCT")
  608:     INSTRUCTION("COL->", instruction_col_fleche);
  609:     //INSTRUCTION("CONIC")
  610:     //Instruction HP48 (sélectionne le type de tracé CONIC)
  611:     //Permet de tracer des coniques en fonction d'équations
  612:     //de type f(x, y) = 0.
  613:     //INSTRUCTION("CRDIR")
  614:     INSTRUCTION("CRMTX", instruction_crmtx);
  615:     INSTRUCTION("CROSS", instruction_cross);
  616:     INSTRUCTION("CRTAB", instruction_crtab);
  617:     INSTRUCTION("CSTOP", instruction_cstop);
  618:     INSTRUCTION("CYCLE", instruction_cycle);
  619:     //INSTRUCTION("CYLIN")
  620:     //Instruction HP48 (sélectionne le type de tracé CYLINDRIC)
  621:     INSTRUCTION("DEPND", instruction_depnd);
  622:     INSTRUCTION("DEPTH", instruction_depth);
  623:     //INSTRUCTION("DOSUB")
  624:     //Instruction HP48 (application séquentielle d'une fonction à une liste)
  625:     //liste nombre_elements_traites_a_chaque_iteration fonction DOSUB
  626:     //{ 1 2 3 4 5 }
  627:     //2
  628:     //<< + 2 / >>
  629:     //DOSUB
  630:     //=> { 1.5 2.5 3.5 4.5 }
  631:     INSTRUCTION("DGTIZ", instruction_dgtiz);
  632:     INSTRUCTION("DROP2", instruction_drop2);
  633:     INSTRUCTION("DROPN", instruction_dropn);
  634:     INSTRUCTION("ERASE", instruction_erase);
  635:     INSTRUCTION("EXGET", instruction_exget);
  636:     //INSTRUCTION("EXPAN");
  637:     INSTRUCTION("EXSUB", instruction_exsub);
  638:     INSTRUCTION("EYEPT", instruction_eyept);
  639:     INSTRUCTION("FALSE", instruction_false);
  640:     INSTRUCTION("FLOOR", instruction_floor);
  641:     INSTRUCTION("GAMMA", instruction_gamma);
  642:     INSTRUCTION("GEGVL", instruction_gegvl);
  643:     INSTRUCTION("GLEGV", instruction_glegv);
  644:     INSTRUCTION("GREGV", instruction_gregv);
  645:     INSTRUCTION("HMS->", instruction_hms_fleche);
  646:     INSTRUCTION("IFERR", instruction_iferr);
  647:     INSTRUCTION("INDEP", instruction_indep);
  648:     INSTRUCTION("INPUT", instruction_input);
  649:     INSTRUCTION("JDATE", instruction_jdate);
  650:     INSTRUCTION("LABEL", instruction_label);
  651:     INSTRUCTION("LCASE", instruction_lcase);
  652:     INSTRUCTION("LCHOL", instruction_lchol);
  653:     INSTRUCTION("LCD->", instruction_lcd_fleche);
  654:     INSTRUCTION("LIMIT", instruction_limit);
  655:     //INSTRUCTION("NDIST")
  656:     //Instruction HP48 (distribution normale, prend la moyenne au niveau 3,
  657:     //la variance au niveau 2, un réel x au niveau 1 et renvoie la probabilité
  658:     //qu'une variable aléatoire normale soit égale à x dans une distribution
  659:     //normale).
  660:     INSTRUCTION("NRAND", instruction_nrand);
  661:     INSTRUCTION("OBGET", instruction_obget);
  662:     INSTRUCTION("OBSUB", instruction_obsub);
  663:     INSTRUCTION("PAPER", instruction_paper);
  664:     //INSTRUCTION("PCOEFF")
  665:     //INSTRUCTION("PEVAL")
  666:     //INSTRUCTION("PGDIR")
  667:     //INSTRUCTION("PIXEL")
  668:     //INSTRUCTION("PLIST")
  669:     //Instruction HP48 (produit des termes d'une liste)
  670:     INSTRUCTION("POLAR", instruction_polar);
  671:     INSTRUCTION("PRINT", instruction_print);
  672:     //INSTRUCTION("PREDV");
  673:     INSTRUCTION("PRLCD", instruction_prlcd);
  674:     //INSTRUCTION("PROOT")
  675:     //Instruction HP48 (calcule les racines d'un polynôme en fonction du tableau
  676:     //de coefficients)
  677:     INSTRUCTION("PRSTC", instruction_prstc);
  678:     INSTRUCTION("PRUSR", instruction_prusr);
  679:     INSTRUCTION("PRVAR", instruction_prvar);
  680:     INSTRUCTION("PSDEV", instruction_psdev);
  681:     INSTRUCTION("PURGE", instruction_purge);
  682:     INSTRUCTION("RDATE", instruction_rdate);
  683:     INSTRUCTION("REGEX", instruction_regex);
  684:     INSTRUCTION("RELAX", instruction_relax);
  685:     INSTRUCTION("RFUSE", instruction_rfuse);
  686:     INSTRUCTION("RSTOP", instruction_rstop);
  687:     INSTRUCTION("ROLLD", instruction_rolld);
  688:     INSTRUCTION("ROW->", instruction_row_fleche);
  689:     INSTRUCTION("SCALE", instruction_scale);
  690:     INSTRUCTION("SCHED", instruction_sched);
  691:     INSTRUCTION("SCHUR", instruction_schur);
  692:     INSTRUCTION("SCONJ", instruction_sconj);
  693:     INSTRUCTION("SLICE", instruction_slice);
  694:     //INSTRUCTION("SLIST")
  695:     //Instruction HP48 (somme des termes d'une liste)
  696:     INSTRUCTION("SPAWN", instruction_spawn);
  697:     INSTRUCTION("START", instruction_start);
  698:     INSTRUCTION("STORE", instruction_store);
  699:     INSTRUCTION("STR->", instruction_str_fleche);
  700:     INSTRUCTION("TAYLR", instruction_taylr);
  701:     INSTRUCTION("TITLE", instruction_title);
  702:     //INSTRUCTION("TRACE")
  703:     //INSTRUCTION("TRUTH")
  704:     INSTRUCTION("UCASE", instruction_ucase);
  705:     INSTRUCTION("UCHOL", instruction_uchol);
  706:     INSTRUCTION("UNTIL", instruction_until);
  707:     //INSTRUCTION("UPDIR")
  708:     INSTRUCTION("VISIT", instruction_visit);
  709:     INSTRUCTION("WFACK", instruction_wfack);
  710:     INSTRUCTION("WFSWI", instruction_wfswi);
  711:     INSTRUCTION("WHILE", instruction_while);
  712:     //INSTRUCTION("WIDTH")
  713:     INSTRUCTION("WRITE", instruction_write);
  714:     INSTRUCTION("XROOT", instruction_xroot);
  715:     INSTRUCTION("YIELD", instruction_yield);
  716:     INSTRUCTION("->COL", instruction_fleche_col);
  717:     INSTRUCTION("->HMS", instruction_fleche_hms);
  718:     INSTRUCTION("->LCD", instruction_fleche_lcd);
  719:     INSTRUCTION("->NUM", instruction_fleche_num);
  720:     INSTRUCTION("->ROW", instruction_fleche_row);
  721:     INSTRUCTION("->STR", instruction_fleche_str);
  722: 
  723:     INSTRUCTION("APPEND", instruction_append);
  724:     INSTRUCTION("ARRY->", instruction_array_fleche);
  725:     INSTRUCTION("ATEXIT", instruction_atexit);
  726:     INSTRUCTION("ATPOKE", instruction_atpoke);
  727:     INSTRUCTION("BESSEL", instruction_bessel);
  728:     INSTRUCTION("CIPHER", instruction_cipher);
  729:     INSTRUCTION("CLRERR", instruction_clrerr);
  730:     INSTRUCTION("CLRMTX", instruction_clrmtx);
  731:     INSTRUCTION("CLRSWI", instruction_clrswi);
  732:     INSTRUCTION("CREATE", instruction_create);
  733:     INSTRUCTION("DELETE", instruction_delete);
  734: #   ifdef SHARED_MEMORY
  735:         INSTRUCTION("DETACH", instruction_detach);
  736: #   else
  737:         if ((*s_etat_processus).langue == 'F')
  738:         {
  739:             printf("+++Attention : DETACH est émulé par SPAWN car le système"
  740:                     " hôte ne supporte\n"
  741:                     "               pas de mémoire partagée !\n");
  742:         }
  743:         else
  744:         {
  745:             printf("+++Warning : DETACH is replaced by SPAWN as host system"
  746:                     " does not support\n"
  747:                     "             shared memory !\n");
  748:         }
  749: 
  750:         INSTRUCTION("DETACH", instruction_spawn);
  751: #   endif
  752:     INSTRUCTION("DIAG->", instruction_diag_fleche);
  753:     INSTRUCTION("DIGEST", instruction_digest);
  754:     //INSTRUCTION("DOLIST")
  755:     //Instruction HP48 (application d'une fonction à une liste)
  756:     //liste(s) nombre_de_listes_a_traiter fonction DOLIST
  757:     //{ 1 2 3 }
  758:     //{ 4 5 6 }
  759:     //{ 7 8 9 }
  760:     //3
  761:     //<<  * + >>
  762:     //DOLIST
  763:     //=> { 29 42 57 }
  764:     INSTRUCTION("ELSEIF", instruction_elseif);
  765:     INSTRUCTION("FORALL", instruction_forall);
  766:     INSTRUCTION("FORMAT", instruction_format);
  767:     //INSTRUCTION("HEIGHT")
  768:     INSTRUCTION("ITRACE", instruction_itrace);
  769:     INSTRUCTION("LIST->", instruction_list_fleche);
  770:     INSTRUCTION("LOGGER", instruction_logger);
  771:     INSTRUCTION("MCLRIN", instruction_mclrin);
  772:     INSTRUCTION("NRPROC", instruction_nrproc);
  773:     INSTRUCTION("PROCID", instruction_procid);
  774:     INSTRUCTION("PROMPT", instruction_prompt);
  775:     INSTRUCTION("RCLSWI", instruction_rclswi);
  776:     INSTRUCTION("RECALL", instruction_recall);
  777:     INSTRUCTION("RECODE", instruction_recode);
  778:     INSTRUCTION("RECORD", instruction_record);
  779:     INSTRUCTION("REDRAW", instruction_redraw);
  780:     INSTRUCTION("REMOVE", instruction_remove);
  781:     INSTRUCTION("REPEAT", instruction_repeat);
  782:     INSTRUCTION("RETURN", instruction_return);
  783:     INSTRUCTION("REWIND", instruction_rewind);
  784:     //INSTRUCTION("SCREEN")
  785:     INSTRUCTION("SELECT", instruction_select);
  786:     //INSTRUCTION("SPHERE")
  787:     INSTRUCTION("SHARED", instruction_shared);
  788:     INSTRUCTION("SPLASH", instruction_splash);
  789:     INSTRUCTION("STATIC", instruction_static);
  790:     INSTRUCTION("STOSWI", instruction_stoswi);
  791:     //INSTRUCTION("STREAM", instruction_stream);
  792:     //{ 1 2 3 4 5 } << * >> STREAM => 120
  793:     INSTRUCTION("TARGET", instruction_target);
  794:     INSTRUCTION("UNLOCK", instruction_unlock);
  795:     INSTRUCTION("VERIFY", instruction_verify);
  796:     INSTRUCTION("WFDATA", instruction_wfdata);
  797:     INSTRUCTION("WFLOCK", instruction_wflock);
  798:     INSTRUCTION("WFPOKE", instruction_wfpoke);
  799:     INSTRUCTION("WFPROC", instruction_wfproc);
  800:     INSTRUCTION("WFSOCK", instruction_wfsock);
  801:     INSTRUCTION("->ARRY", instruction_fleche_array);
  802:     INSTRUCTION("->DIAG", instruction_fleche_diag);
  803:     INSTRUCTION("->LIST", instruction_fleche_list);
  804: 
  805:     INSTRUCTION("ARRAY->", instruction_array_fleche);
  806:     //INSTRUCTION("BARPLOT")
  807:     //INSTRUCTION("BESTFIT")
  808:     //Instruction HP48 (choisit le meilleur modèle de régression)
  809:     INSTRUCTION("CLRFUSE", instruction_clrfuse);
  810:     INSTRUCTION("CONVERT", instruction_convert);
  811:     INSTRUCTION("CRSMPHR", instruction_crsmphr);
  812:     INSTRUCTION("CURRENC", instruction_currenc);
  813:     INSTRUCTION("DEFAULT", instruction_default);
  814:     INSTRUCTION("EPSILON", instruction_epsilon);
  815:     //INSTRUCTION("GRIDMAP")
  816:     //Instruction HP48 (sélectionne le mode de tracé GRIDMAP)
  817:     //Le tracé GRIDMAP transforme la grille d'échantillonnage rectiligne
  818:     //en appliquant la fonction en cours à valeurs complexes.
  819:     //Les coordonnées de chaque point de la grille (un nombre complexe)
  820:     //constituent
  821:     //les données d'entrée de la fonction qui les projette ensuite dans le
  822:     //grille
  823:     //de sortie.
  824:     //f(x,y)=fnct complexe évaluée sur la grille (x,y) et affichée comme une
  825:     //fonction paramétrique.
  826:     INSTRUCTION("INQUIRE", instruction_inquire);
  827:     INSTRUCTION("MEMLOCK", instruction_memlock);
  828:     INSTRUCTION("MTXLOCK", instruction_mtxlock);
  829:     INSTRUCTION("NBRCPUS", instruction_nbrcpus);
  830:     INSTRUCTION("PERSIST", instruction_persist);
  831:     INSTRUCTION("PLOTTER", instruction_plotter);
  832:     INSTRUCTION("PRIVATE", instruction_private);
  833:     INSTRUCTION("PROTECT", instruction_protect);
  834:     INSTRUCTION("PSHPRFL", instruction_pshprfl);
  835:     INSTRUCTION("PULPRFL", instruction_pulprfl);
  836:     INSTRUCTION("RESTART", instruction_restart);
  837:     INSTRUCTION("REVLIST", instruction_revlist);
  838:     INSTRUCTION("SCATTER", instruction_scatter);
  839:     INSTRUCTION("SUSPEND", instruction_suspend);
  840:     INSTRUCTION("SWILOCK", instruction_swilock);
  841:     INSTRUCTION("SYSEVAL", instruction_syseval);
  842:     INSTRUCTION("TABLE->", instruction_table_fleche);
  843:     INSTRUCTION("VERSION", instruction_version);
  844:     INSTRUCTION("WORKDIR", instruction_workdir);
  845:     INSTRUCTION("->ARRAY", instruction_fleche_array);
  846:     INSTRUCTION("->TABLE", instruction_fleche_table);
  847: 
  848:     INSTRUCTION("CLRCNTXT", instruction_clrcntxt);
  849:     INSTRUCTION("CLRSMPHR", instruction_clrsmphr);
  850:     INSTRUCTION("COMPRESS", instruction_compress);
  851:     INSTRUCTION("CONTINUE", instruction_continue);
  852:     INSTRUCTION("CRITICAL", instruction_critical);
  853:     INSTRUCTION("DUPCNTXT", instruction_dupcntxt);
  854:     INSTRUCTION("FUNCTION", instruction_function);
  855:     INSTRUCTION("IMPLICIT", instruction_implicit);
  856:     INSTRUCTION("INFINITY", instruction_sensible_infinity);
  857:     INSTRUCTION("KEYLABEL", instruction_keylabel);
  858:     INSTRUCTION("KEYTITLE", instruction_keytitle);
  859:     INSTRUCTION("LOGSCALE", instruction_logscale);
  860:     INSTRUCTION("NEWPLANE", instruction_newplane);
  861:     INSTRUCTION("PSHCNTXT", instruction_pshcntxt);
  862:     INSTRUCTION("PULCNTXT", instruction_pulcntxt);
  863:     INSTRUCTION("SQLQUERY", instruction_sqlquery);
  864:     INSTRUCTION("SWIQUEUE", instruction_swiqueue);
  865:     INSTRUCTION("TOKENIZE", instruction_tokenize);
  866:     INSTRUCTION("VARIABLE", instruction_variable);
  867:     INSTRUCTION("VOLATILE", instruction_volatile);
  868:     INSTRUCTION("WARRANTY", instruction_warranty);
  869: 
  870:     INSTRUCTION("AUTOSCALE", instruction_autoscale);
  871:     INSTRUCTION("BACKSPACE", instruction_backspace);
  872:     INSTRUCTION("BACKTRACE", instruction_backtrace);
  873:     INSTRUCTION("CLRATEXIT", instruction_clratexit);
  874:     INSTRUCTION("CLRATPOKE", instruction_clratpoke);
  875:     INSTRUCTION("COPYRIGHT", instruction_copyright);
  876:     //INSTRUCTION("CYLINDRIC");
  877:     INSTRUCTION("DAEMONIZE", instruction_daemonize);
  878:     INSTRUCTION("DROPCNTXT", instruction_dropcntxt);
  879:     INSTRUCTION("EXTERNALS", instruction_externals);
  880:     INSTRUCTION("HISTOGRAM", instruction_histogram);
  881:     INSTRUCTION("MEMUNLOCK", instruction_memunlock);
  882:     INSTRUCTION("MTXSTATUS", instruction_mtxstatus);
  883:     INSTRUCTION("MTXUNLOCK", instruction_mtxunlock);
  884:     INSTRUCTION("PARAMETER", instruction_parameter);
  885:     //INSTRUCTION("PSCONTOUR")
  886:     //INSTRUCTION("SCATRPLOT")
  887:     //(trace un nuage de points de SDAT et la courbe de régression)
  888:     INSTRUCTION("SMPHRDECR", instruction_smphrdecr);
  889:     INSTRUCTION("SMPHRGETV", instruction_smphrgetv);
  890:     INSTRUCTION("SMPHRINCR", instruction_smphrincr);
  891:     INSTRUCTION("SWAPCNTXT", instruction_swapcntxt);
  892:     INSTRUCTION("SWISTATUS", instruction_swistatus);
  893:     INSTRUCTION("SWIUNLOCK", instruction_swiunlock);
  894:     INSTRUCTION("UNPROTECT", instruction_unprotect);
  895:     INSTRUCTION("WIREFRAME", instruction_wireframe);
  896: 
  897:     INSTRUCTION("MTXTRYLOCK", instruction_mtxtrylock);
  898:     INSTRUCTION("PARAMETRIC", instruction_parametric);
  899:     //INSTRUCTION("PARSURFACE")
  900:     //Instruction HP48 (tracé PARSURFACE) Equation sous forme de liste
  901:     INSTRUCTION("SLICESCALE", instruction_slicescale);
  902:     INSTRUCTION("SQLCONNECT", instruction_sqlconnect);
  903:     //INSTRUCTION("SLOPEFIELD")
  904:     //Instruction HP48 (type de tracé)
  905:     //Tracé 3D en courbes de niveaux.
  906:     //Le type de tracé 'SLOPEFIELD' dessine un réseau de segments dont les
  907:     //pentes
  908:     //représentent la valeur de la fonction (x,y) en leur milieu.
  909:     //=> utile pour y'=F(x,y)
  910:     INSTRUCTION("UNCOMPRESS", instruction_uncompress);
  911: 
  912:     INSTRUCTION("LOCALIZATION", instruction_localization);
  913:     INSTRUCTION("SMPHRTRYDECR", instruction_smphrtrydecr);
  914: 
  915:     INSTRUCTION("SQLDISCONNECT", instruction_sqldisconnect);
  916: #undef INSTRUCTION
  917: 
  918:     return;
  919: }
  920: 
  921: 
  922: void *
  923: analyse_instruction(struct_processus *s_etat_processus, unsigned char *ptr)
  924: {
  925:     int                             pointeur;
  926: 
  927:     struct_instruction              *l_instruction_courante;
  928: 
  929:     l_instruction_courante = (*s_etat_processus).arbre_instructions;
  930: 
  931:     while((*ptr) != d_code_fin_chaine)
  932:     {
  933:         pointeur = (*s_etat_processus).pointeurs_caracteres[*ptr];
  934: 
  935:         if (pointeur < 0)
  936:         {
  937:             // Caractère hors de l'alphabet des instructions
  938: 
  939:             return(NULL);
  940:         }
  941: 
  942:         if ((*l_instruction_courante).noeuds[pointeur] == NULL)
  943:         {
  944:             // Le chemin de l'instruction candidate n'existe pas.
  945: 
  946:             return(NULL);
  947:         }
  948: 
  949:         l_instruction_courante = (*l_instruction_courante).noeuds[pointeur];
  950:         ptr++;
  951: 
  952:         if ((l_instruction_courante == NULL) && ((*ptr) != d_code_fin_chaine))
  953:         {
  954:             // Le chemin de l'instruction candidate est incomplet.
  955: 
  956:             return(NULL);
  957:         }
  958:     }
  959: 
  960:     if ((*l_instruction_courante).feuille != NULL)
  961:     {
  962:         return((*l_instruction_courante).feuille);
  963:     }
  964: 
  965:     return(NULL);
  966: }
  967: 
  968: 
  969: void
  970: analyse(struct_processus *s_etat_processus, void (*fonction)())
  971: {
  972:     real8                           attente;
  973:     real8                           pourcentage;
  974:     real8                           temps_cpu;
  975:     real8                           temps_reel;
  976: 
  977:     static struct timeval           horodatage_initial;
  978:     struct timeval                  horodatage_final;
  979: 
  980: #   ifndef OS2
  981:     static struct rusage            usage_initial;
  982:     struct rusage                   usage_final;
  983: #   else
  984:     static clock_t                  usage_initial;
  985:     clock_t                         usage_final;
  986: #   endif
  987: 
  988:     struct timespec                 temporisation;
  989: 
  990:     unsigned char                   *position;
  991:     unsigned char                   *bibliotheque_candidate;
  992:     unsigned char                   instruction_majuscule
  993:                                             [d_longueur_maximale_instruction];
  994:     unsigned char                   registre_instruction_valide;
  995: 
  996:     void                            (*instruction)();
  997: 
  998:     errno = 0;
  999:     (*s_etat_processus).var_volatile_exception_gsl = 0;
 1000: 
 1001:     (*s_etat_processus).instruction_valide = 'Y';
 1002:     (*s_etat_processus).constante_symbolique = 'N';
 1003:     (*s_etat_processus).nombre_arguments = -2;
 1004:     (*s_etat_processus).instruction_intrinseque = 'I';
 1005: 
 1006:     /*
 1007:      * On autorise l'exécution d'un fork() dans un thread concurrent.
 1008:      */
 1009: 
 1010: #   ifndef SEMAPHORES_NOMMES
 1011:         if (sem_post(&((*s_etat_processus).semaphore_fork)) != 0)
 1012: #   else
 1013:         if (sem_post((*s_etat_processus).semaphore_fork) != 0)
 1014: #   endif
 1015:     {
 1016:         (*s_etat_processus).erreur_systeme = d_es_processus;
 1017:         return;
 1018:     }
 1019: 
 1020: #   ifndef SEMAPHORES_NOMMES
 1021:         while(sem_wait(&((*s_etat_processus).semaphore_fork)) != 0)
 1022: #   else
 1023:         while(sem_wait((*s_etat_processus).semaphore_fork) != 0)
 1024: #   endif
 1025:     {
 1026:         if (errno != EINTR)
 1027:         {
 1028:             (*s_etat_processus).erreur_systeme = d_es_processus;
 1029:             return;
 1030:         }
 1031:     }
 1032: 
 1033:     /*
 1034:      * Verrou pour les sections_critiques
 1035:      */
 1036: 
 1037:     if (pthread_mutex_lock(&mutex_sections_critiques) != 0)
 1038:     {
 1039:         (*s_etat_processus).erreur_systeme = d_es_processus;
 1040:         return;
 1041:     }
 1042: 
 1043:     if (pthread_mutex_unlock(&mutex_sections_critiques) != 0)
 1044:     {
 1045:         (*s_etat_processus).erreur_systeme = d_es_processus;
 1046:         return;
 1047:     }
 1048: 
 1049:     scrutation_injection(s_etat_processus);
 1050: 
 1051:     if (fonction == NULL)
 1052:     {
 1053:         conversion_majuscule_limitee((*s_etat_processus).instruction_courante,
 1054:                 instruction_majuscule, d_longueur_maximale_instruction);
 1055:         instruction = analyse_instruction(s_etat_processus,
 1056:                 instruction_majuscule);
 1057: 
 1058:         if (instruction == NULL)
 1059:         {
 1060:             // L'instruction n'existe pas.
 1061: 
 1062:             (*s_etat_processus).instruction_valide = 'N';
 1063:         }
 1064:         else
 1065:         {
 1066:             // Exécution de l'instruction associée. Le drapeau
 1067:             // (*s_etat_processus).instruction_valide peut passer à 'N'
 1068:             // dans le cas d'instructions sensibles à la casse.
 1069: 
 1070:             if ((*s_etat_processus).niveau_profilage >= 2)
 1071:             {
 1072:                 profilage(s_etat_processus, instruction_majuscule);
 1073:             }
 1074: 
 1075:             (*s_etat_processus).instruction_valide = 'Y';
 1076:             instruction(s_etat_processus);
 1077: 
 1078:             if ((*s_etat_processus).niveau_profilage >= 2)
 1079:             {
 1080:                 profilage(s_etat_processus, NULL);
 1081:             }
 1082:         }
 1083:     }
 1084:     else
 1085:     {
 1086:         if ((*s_etat_processus).niveau_profilage >= 2)
 1087:         {
 1088:             profilage(s_etat_processus,
 1089:                     (*s_etat_processus).instruction_courante);
 1090:         }
 1091: 
 1092:         (*s_etat_processus).instruction_valide = 'Y';
 1093:         fonction(s_etat_processus);
 1094: 
 1095:         if ((*s_etat_processus).niveau_profilage >= 2)
 1096:         {
 1097:             profilage(s_etat_processus, NULL);
 1098:         }
 1099:     }
 1100: 
 1101:     if ((*s_etat_processus).instruction_valide == 'Y')
 1102:     {
 1103:         (*s_etat_processus).instruction_intrinseque = 'Y';
 1104:     }
 1105: 
 1106:     if ((*s_etat_processus).instruction_valide == 'N')
 1107:     {
 1108:         if ((position = index((*s_etat_processus).instruction_courante, '$'))
 1109:                 != NULL)
 1110:         {
 1111:             if ((bibliotheque_candidate = malloc(((size_t) (position + 1
 1112:                     - (*s_etat_processus).instruction_courante))
 1113:                     * sizeof(unsigned char))) == NULL)
 1114:             {
 1115:                 (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
 1116:                 return;
 1117:             }
 1118: 
 1119:             (*bibliotheque_candidate) = d_code_fin_chaine;
 1120:             strncat(bibliotheque_candidate,
 1121:                     (*s_etat_processus).instruction_courante, ((size_t)
 1122:                     (position - (*s_etat_processus).instruction_courante)));
 1123: 
 1124:             position++;
 1125: 
 1126:             if (execution_fonction_de_bibliotheque(s_etat_processus, position,
 1127:                     bibliotheque_candidate) == d_vrai)
 1128:             {
 1129:                 (*s_etat_processus).instruction_valide = 'Y';
 1130:                 (*s_etat_processus).instruction_intrinseque = 'N';
 1131:             }
 1132:             else
 1133:             {
 1134:                 (*s_etat_processus).instruction_valide = 'N';
 1135:             }
 1136: 
 1137:             free(bibliotheque_candidate);
 1138:         }
 1139:         else
 1140:         {
 1141:             if (execution_fonction_de_bibliotheque(s_etat_processus,
 1142:                     (*s_etat_processus).instruction_courante, NULL)
 1143:                     == d_vrai)
 1144:             {
 1145:                 (*s_etat_processus).instruction_valide = 'Y';
 1146:                 (*s_etat_processus).instruction_intrinseque = 'N';
 1147:             }
 1148:             else
 1149:             {
 1150:                 (*s_etat_processus).instruction_valide = 'N';
 1151:             }
 1152:         }
 1153:     }
 1154: 
 1155: /*
 1156: --------------------------------------------------------------------------------
 1157:   Gestion des interruptions logicielles
 1158: --------------------------------------------------------------------------------
 1159: */
 1160: 
 1161:     if (((*s_etat_processus).erreur_systeme == d_es) &&
 1162:             ((*s_etat_processus).erreur_execution == d_ex) &&
 1163:             ((*s_etat_processus).exception == d_ep))
 1164:     {
 1165:         if ((*s_etat_processus).test_instruction == 'N')
 1166:         {
 1167:             if (pthread_mutex_lock(&(*s_etat_processus).mutex_interruptions)
 1168:                     != 0)
 1169:             {
 1170:                 (*s_etat_processus).erreur_systeme = d_es_processus;
 1171:             }
 1172:             else
 1173:             {
 1174:                 if ((*s_etat_processus).nombre_interruptions_non_affectees != 0)
 1175:                 {
 1176:                     affectation_interruptions_logicielles(s_etat_processus);
 1177:                 }
 1178: 
 1179:                 if (pthread_mutex_unlock(&(*s_etat_processus)
 1180:                         .mutex_interruptions) != 0)
 1181:                 {
 1182:                     (*s_etat_processus).erreur_systeme = d_es_processus;
 1183:                 }
 1184:             }
 1185: 
 1186:             if (((*s_etat_processus).nombre_interruptions_en_queue != 0) &&
 1187:                     ((*s_etat_processus).erreur_systeme == d_es) &&
 1188:                     ((*s_etat_processus).erreur_execution == d_ex))
 1189:             {
 1190: 
 1191:                 registre_instruction_valide =
 1192:                         (*s_etat_processus).instruction_valide;
 1193:                 traitement_interruptions_logicielles(s_etat_processus);
 1194:                 (*s_etat_processus).instruction_valide =
 1195:                         registre_instruction_valide;
 1196:             }
 1197:         }
 1198:     }
 1199: 
 1200: /*
 1201: --------------------------------------------------------------------------------
 1202:   Limitation du pourcetage de temps CPU
 1203: --------------------------------------------------------------------------------
 1204: */
 1205: 
 1206:     if ((*s_etat_processus).pourcentage_maximal_cpu < 100)
 1207:     {
 1208: #       ifndef OS2
 1209:         getrusage(RUSAGE_SELF, &usage_final);
 1210: #       else
 1211:         usage_final = clock();
 1212: #       endif
 1213: 
 1214:         gettimeofday(&horodatage_final, NULL);
 1215: 
 1216:         if ((*s_etat_processus).initialisation_scheduler == d_vrai)
 1217:         {
 1218:             temps_reel = ((real8) (horodatage_final.tv_sec -
 1219:                     horodatage_initial.tv_sec)) +
 1220:                     (((real8) (horodatage_final.tv_usec -
 1221:                     horodatage_initial.tv_usec)) / ((real8) 1E6));
 1222: 
 1223:             // Le temps depuis la dernière limitation est de plus de un
 1224:             // dixième de seconde.
 1225: 
 1226:             if (temps_reel >= 0.1)
 1227:             {
 1228: #               ifndef OS2
 1229:                 temps_cpu = ((real8) ((usage_final.ru_utime.tv_sec +
 1230:                         usage_final.ru_stime.tv_sec) -
 1231:                         (usage_initial.ru_utime.tv_sec +
 1232:                         usage_initial.ru_stime.tv_sec))) +
 1233:                         (((real8) ((usage_final.ru_utime.tv_usec +
 1234:                         usage_final.ru_stime.tv_usec) -
 1235:                         (usage_initial.ru_utime.tv_usec +
 1236:                         usage_initial.ru_stime.tv_usec))) / ((real8) 1E6));
 1237: #               else
 1238:                 temps_cpu = (usage_final - usage_initial) / CLOCKS_PER_SEC;
 1239: #               endif
 1240: 
 1241:                 pourcentage = 100 * temps_cpu / temps_reel;
 1242: 
 1243:                 if (pourcentage > 100)
 1244:                 {
 1245:                     pourcentage = 100;
 1246:                 }
 1247: 
 1248:                 if (pourcentage > (*s_etat_processus).pourcentage_maximal_cpu)
 1249:                 {
 1250:                     attente = ((pourcentage * temps_cpu) /
 1251:                             (*s_etat_processus).pourcentage_maximal_cpu)
 1252:                             - (pourcentage * temps_cpu / 100);
 1253: 
 1254:                     temporisation.tv_sec = (time_t) floor(attente);
 1255:                     temporisation.tv_nsec = (suseconds_t) ((attente
 1256:                             - ((real8) temporisation.tv_sec)) * 1E9);
 1257: 
 1258:                     while(nanosleep(&temporisation, &temporisation) == -1)
 1259:                     {
 1260:                         if (errno != EINTR)
 1261:                         {
 1262:                             break;
 1263:                         }
 1264:                     }
 1265:                 }
 1266: 
 1267:                 horodatage_initial = horodatage_final;
 1268:                 usage_initial = usage_final;
 1269:             }
 1270:         }
 1271:         else
 1272:         {
 1273:             (*s_etat_processus).initialisation_scheduler = d_vrai;
 1274: 
 1275:             horodatage_initial = horodatage_final;
 1276:             usage_initial = usage_final;
 1277:         }
 1278:     }
 1279:     else
 1280:     {
 1281:         (*s_etat_processus).initialisation_scheduler = d_faux;
 1282:     }
 1283: 
 1284: /*
 1285: --------------------------------------------------------------------------------
 1286:   Introduction des erreurs générées
 1287: --------------------------------------------------------------------------------
 1288: */
 1289: 
 1290:     if (((*s_etat_processus).test_instruction == 'N') &&
 1291:             ((*s_etat_processus).instruction_valide == 'Y'))
 1292:     {
 1293:         traitement_asynchrone_exceptions_gsl(s_etat_processus);
 1294: 
 1295:         if ((*s_etat_processus).erreur_processus_fils == d_vrai)
 1296:         {
 1297:             (*s_etat_processus).erreur_processus_fils = d_faux;
 1298: 
 1299:             (*s_etat_processus).erreur_systeme =
 1300:                     (*s_etat_processus).erreur_systeme_processus_fils;
 1301:             (*s_etat_processus).erreur_execution =
 1302:                     (*s_etat_processus).erreur_execution_processus_fils;
 1303:             (*s_etat_processus).arret_si_exception = d_vrai;
 1304: 
 1305:             if ((*s_etat_processus).pid_erreur_processus_fils == getpid())
 1306:             {
 1307:                 (*s_etat_processus).invalidation_message_erreur = d_faux;
 1308:             }
 1309:             else
 1310:             {
 1311:                 (*s_etat_processus).invalidation_message_erreur = d_vrai;
 1312:             }
 1313:         }
 1314: 
 1315:         if (((*s_etat_processus).erreur_execution != d_ex) ||
 1316:                 ((*s_etat_processus).erreur_systeme != d_es) ||
 1317:                 ((*s_etat_processus).exception != d_ep))
 1318:         {
 1319:             (*s_etat_processus).niveau_derniere_erreur =
 1320:                     (*s_etat_processus).niveau_courant;
 1321: 
 1322:             if ((*s_etat_processus).mode_execution_programme == 'Y')
 1323:             {
 1324:                 if ((*s_etat_processus).instruction_derniere_erreur != NULL)
 1325:                 {
 1326:                     free((*s_etat_processus).instruction_derniere_erreur);
 1327:                     (*s_etat_processus).instruction_derniere_erreur = NULL;
 1328:                 }
 1329: 
 1330:                 if ((*s_etat_processus).instruction_courante == NULL)
 1331:                 {
 1332:                     if (((*s_etat_processus).instruction_derniere_erreur =
 1333:                             malloc(16 * sizeof(unsigned char))) == NULL)
 1334:                     {
 1335:                         (*s_etat_processus).erreur_systeme =
 1336:                                 d_es_allocation_memoire;
 1337:                         return;
 1338:                     }
 1339: 
 1340:                     strcpy((*s_etat_processus).instruction_derniere_erreur,
 1341:                             "<not available>");
 1342:                 }
 1343:                 else
 1344:                 {
 1345:                     if (((*s_etat_processus).instruction_derniere_erreur =
 1346:                             malloc((strlen((*s_etat_processus)
 1347:                             .instruction_courante) + 1) *
 1348:                             sizeof(unsigned char))) == NULL)
 1349:                     {
 1350:                         (*s_etat_processus).erreur_systeme =
 1351:                                 d_es_allocation_memoire;
 1352:                         return;
 1353:                     }
 1354: 
 1355:                     strcpy((*s_etat_processus).instruction_derniere_erreur,
 1356:                             (*s_etat_processus).instruction_courante);
 1357:                 }
 1358:             }
 1359:             else
 1360:             {
 1361:                 if ((*s_etat_processus).objet_courant != NULL)
 1362:                 {
 1363:                     if ((*s_etat_processus).instruction_derniere_erreur != NULL)
 1364:                     {
 1365:                         free((*s_etat_processus).instruction_derniere_erreur);
 1366:                         (*s_etat_processus).instruction_derniere_erreur = NULL;
 1367:                     }
 1368: 
 1369:                     if (((*s_etat_processus).instruction_derniere_erreur =
 1370:                             formateur(s_etat_processus, 0,
 1371:                             (*s_etat_processus).objet_courant)) == NULL)
 1372:                     {
 1373:                         return;
 1374:                     }
 1375: 
 1376:                     (*s_etat_processus).objet_courant = NULL;
 1377:                 }
 1378:             }
 1379:         }
 1380:     }
 1381: 
 1382:     return;
 1383: }
 1384: 
 1385: 
 1386: /*
 1387: ================================================================================
 1388:   Traitement asynchrone des erreurs de la bibliothèque GSL
 1389: ================================================================================
 1390:   Entrées :
 1391: --------------------------------------------------------------------------------
 1392:   Sorties :
 1393: --------------------------------------------------------------------------------
 1394:   Effets de bord : néant
 1395: ================================================================================
 1396: */
 1397: 
 1398: void
 1399: traitement_asynchrone_exceptions_gsl(struct_processus *s_etat_processus)
 1400: {
 1401:     if ((*s_etat_processus).var_volatile_exception_gsl != 0)
 1402:     {
 1403:         switch((*s_etat_processus).var_volatile_exception_gsl)
 1404:         {
 1405:             case GSL_EINVAL :
 1406:             {
 1407:                 (*s_etat_processus).erreur_execution = d_ex_argument_invalide;
 1408:                 break;
 1409:             }
 1410: 
 1411:             case GSL_EDOM :
 1412:             {
 1413:                 (*s_etat_processus).exception = d_ep_domaine_definition;
 1414:                 break;
 1415:             }
 1416: 
 1417:             case GSL_ERANGE :
 1418:             {
 1419:                 (*s_etat_processus).exception = d_ep_resultat_indefini;
 1420:                 break;
 1421:             }
 1422: 
 1423:             case GSL_EZERODIV :
 1424:             {
 1425:                 (*s_etat_processus).exception = d_ep_division_par_zero;
 1426:                 break;
 1427:             }
 1428: 
 1429:             case GSL_EUNDRFLW :
 1430:             {
 1431:                 (*s_etat_processus).exception = d_ep_underflow;
 1432:                 break;
 1433:             }
 1434: 
 1435:             case GSL_EOVRFLW :
 1436:             {
 1437:                 (*s_etat_processus).exception = d_ep_overflow;
 1438:                 break;
 1439:             }
 1440: 
 1441:             case GSL_ENOMEM :
 1442:             {
 1443:                 (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
 1444:                 break;
 1445:             }
 1446: 
 1447:             case GSL_ELOSS :
 1448:             {
 1449:                 (*s_etat_processus).exception = d_ep_perte_precision;
 1450:                 break;
 1451:             }
 1452: 
 1453:             default :
 1454:             {
 1455:                 (*s_etat_processus).erreur_execution =
 1456:                         d_ex_routines_mathematiques;
 1457:                 break;
 1458:             }
 1459:         }
 1460: 
 1461:         (*s_etat_processus).var_volatile_exception_gsl = 0;
 1462:     }
 1463: 
 1464:     return;
 1465: }
 1466: 
 1467: // vim: ts=4

CVSweb interface <joel.bertrand@systella.fr>