File:  [local] / rpl / src / rplcore.c
Revision 1.10: download - view: text, annotated - select for diffs - revision graph
Thu Jun 24 09:21:43 2010 UTC (13 years, 10 months ago) by bertrand
Branches: MAIN
CVS tags: rpl-4_0_16, HEAD
Correction d'un problème dans la routine evaluation(). Ce patch permet
de rendre cohérents les résultats d'un programme entre une exécution
interprétée et une exécution compilée.

    1: /*
    2: ================================================================================
    3:   RPL/2 (R) version 4.0.16
    4:   Copyright (C) 1989-2010 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:   Fonction 'rplcore' générant un fichier de débogage
   29: ================================================================================
   30:   Entrées : pointeur sur une structure struct_processus
   31: --------------------------------------------------------------------------------
   32:   Sorties :
   33: --------------------------------------------------------------------------------
   34:   Effets de bord : néant
   35: ================================================================================
   36: */
   37: 
   38: void
   39: rplcore(struct_processus *s_etat_processus)
   40: {
   41:     file                        *fichier;
   42: 
   43:     logical1                    erreur;
   44:     logical1                    fin_boucle;
   45: 
   46:     long                        i;
   47:     long                        j;
   48:     long                        longueur_lignes = 65;
   49: 
   50:     struct_liste_chainee        *l_base_pile;
   51:     struct_liste_chainee        *l_element_courant;
   52: 
   53:     struct_objet                *s_objet_last;
   54: 
   55:     unsigned char               *expression;
   56:     unsigned char               *nom;
   57:     unsigned char               *message_erreur;
   58:     unsigned char               *pile;
   59:     unsigned char               *ptr;
   60:     unsigned char               *ptr_bis;
   61:     unsigned char               registre;
   62:     unsigned char               registre_langue;
   63: 
   64:     (*s_etat_processus).core = d_faux;
   65: 
   66:     sf(s_etat_processus, 37);
   67:     sf(s_etat_processus, 38);
   68:     sf(s_etat_processus, 39);
   69:     sf(s_etat_processus, 40);
   70:     sf(s_etat_processus, 41);
   71:     sf(s_etat_processus, 42);
   72: 
   73:     cf(s_etat_processus, 43);
   74:     cf(s_etat_processus, 44);
   75: 
   76:     sf(s_etat_processus, 45);
   77: 
   78:     cf(s_etat_processus, 48);
   79: 
   80:     cf(s_etat_processus, 49);
   81:     cf(s_etat_processus, 50);
   82: 
   83:     cf(s_etat_processus, 53);
   84:     cf(s_etat_processus, 54);
   85:     cf(s_etat_processus, 55);
   86:     cf(s_etat_processus, 56);
   87: 
   88:     sf(s_etat_processus, 60);
   89: 
   90:     registre_langue = (*s_etat_processus).langue;
   91:     (*s_etat_processus).langue = 'E';
   92: 
   93:     message_erreur = messages(s_etat_processus);
   94: 
   95:     (*s_etat_processus).langue = registre_langue;
   96: 
   97:     if ((nom = malloc((strlen(ds_rplcore) + 64 + 1) * sizeof(unsigned char)))
   98:             == NULL)
   99:     {
  100:         free(message_erreur);
  101:         return;
  102:     }
  103: 
  104:     snprintf(nom, strlen(ds_rplcore) + 64 + 1,
  105:             "%s-%lu-%lu", ds_rplcore, (unsigned long) getpid(),
  106:             (unsigned long) pthread_self());
  107: 
  108:     if ((fichier = fopen(nom, "w+")) == NULL)
  109:     {
  110:         (*s_etat_processus).erreur_systeme = d_es_erreur_fichier;
  111:         free(message_erreur);
  112:         free(nom);
  113: 
  114:         return;
  115:     }
  116: 
  117:     free(nom);
  118: 
  119:     if (fprintf(fichier, "// RPL/2 version %s process image\n",
  120:             d_version_rpl) < 0)
  121:     {
  122:         free(message_erreur);
  123: 
  124:         (*s_etat_processus).erreur_systeme = d_es_erreur_fichier;
  125:         return;
  126:     }
  127: 
  128:     if (fprintf(fichier, "// Process %d\n", (int) getpid()) < 0)
  129:     {
  130:         free(message_erreur);
  131: 
  132:         (*s_etat_processus).erreur_systeme = d_es_erreur_fichier;
  133:         return;
  134:     }
  135: 
  136:     if (fprintf(fichier, "// Source file : %s\n\n",
  137:             (*s_etat_processus).nom_fichier_source) < 0)
  138:     {
  139:         free(message_erreur);
  140: 
  141:         (*s_etat_processus).erreur_systeme = d_es_erreur_fichier;
  142:         return;
  143:     }
  144: 
  145:     if (fprintf(fichier, "// Error :\n%s [%s at level %lu]\n\n",
  146:             message_erreur, (*s_etat_processus).instruction_derniere_erreur,
  147:             (*s_etat_processus).niveau_derniere_erreur) < 0)
  148:     {
  149:         free(message_erreur);
  150: 
  151:         (*s_etat_processus).erreur_systeme = d_es_erreur_fichier;
  152:         return;
  153:     }
  154: 
  155:     free(message_erreur);
  156: 
  157:     if (fprintf(fichier, "// System stack\n\n") < 0)
  158:     {
  159:         (*s_etat_processus).erreur_systeme = d_es_erreur_fichier;
  160:         return;
  161:     }
  162: 
  163:     trace(s_etat_processus, fichier);
  164: 
  165:     if (fprintf(fichier, "// Process stack\n\n") < 0)
  166:     {
  167:         (*s_etat_processus).erreur_systeme = d_es_erreur_fichier;
  168:         return;
  169:     }
  170: 
  171:     l_element_courant = (struct_liste_chainee *)
  172:             (*s_etat_processus).l_base_pile_processus;
  173:     i = 0;
  174: 
  175:     if (pthread_mutex_trylock(&((*s_etat_processus).mutex)) == 0)
  176:     {
  177:         while(l_element_courant != NULL)
  178:         {
  179:             if ((*(*((struct_processus_fils *)
  180:                     (*(*l_element_courant).donnee).objet)).thread)
  181:                     .processus_detache == d_vrai)
  182:             {
  183:                 if (fprintf(fichier, "%ld: Process [%d]\n",
  184:                         i++, (int) (*(*((struct_processus_fils *)
  185:                         (*(*l_element_courant).donnee).objet)).thread).pid) < 0)
  186:                 {
  187:                     (*s_etat_processus).erreur_systeme = d_es_erreur_fichier;
  188:                     return;
  189:                 }
  190:             }
  191:             else
  192:             {
  193:                 if (fprintf(fichier, "%ld: Thread [%llu] from [%llu]\n",
  194:                         i++, (unsigned long long) (*(*((struct_processus_fils *)
  195:                         (*(*l_element_courant).donnee).objet)).thread)
  196:                         .tid, (unsigned long long)
  197:                         (*(*((struct_processus_fils *) (*(*l_element_courant)
  198:                         .donnee).objet)).thread).pid) < 0)
  199:                 {
  200:                     (*s_etat_processus).erreur_systeme = d_es_erreur_fichier;
  201:                     return;
  202:                 }
  203:             }
  204: 
  205:             l_element_courant = (*l_element_courant).suivant;
  206:         }
  207: 
  208:         if (fprintf(fichier, "%ld: Process [%d]\n\n", i,
  209:                 (int) getpid()) < 0)
  210:         {
  211:             (*s_etat_processus).erreur_systeme = d_es_erreur_fichier;
  212:             return;
  213:         }
  214: 
  215:         pthread_mutex_unlock(&((*s_etat_processus).mutex));
  216:     }
  217: 
  218:     if (test_cfsf(s_etat_processus, 31) == d_vrai)
  219:     {
  220:         // LAST valide
  221: 
  222:         if (fprintf(fichier, "// Arguments\n\n") < 0)
  223:         {
  224:             (*s_etat_processus).erreur_systeme = d_es_erreur_fichier;
  225:             return;
  226:         }
  227: 
  228:         l_base_pile = NULL;
  229: 
  230:         while((*s_etat_processus).l_base_pile_last != NULL)
  231:         {
  232:             if (depilement(s_etat_processus, &((*s_etat_processus)
  233:                     .l_base_pile_last), &s_objet_last) == d_erreur)
  234:             {
  235:                 return;
  236:             }
  237: 
  238:             if (empilement(s_etat_processus, &l_base_pile, s_objet_last)
  239:                     == d_erreur)
  240:             {
  241:                 return;
  242:             }
  243:         }
  244: 
  245:         if ((*s_etat_processus).l_base_pile != NULL)
  246:         {
  247:             registre = (*s_etat_processus).autorisation_conversion_chaine;
  248:             (*s_etat_processus).autorisation_conversion_chaine = 'N';
  249: 
  250:             ecriture_pile(s_etat_processus, fichier, l_base_pile, 1);
  251: 
  252:             (*s_etat_processus).autorisation_conversion_chaine = registre;
  253:         }
  254:         else
  255:         {
  256:             if (fprintf(fichier, "   No argument\n") < 0)
  257:             {
  258:                 (*s_etat_processus).erreur_systeme = d_es_erreur_fichier;
  259:                 return;
  260:             }
  261:         }
  262: 
  263:         while(l_base_pile != NULL)
  264:         {
  265:             if (depilement(s_etat_processus, &l_base_pile,
  266:                     &s_objet_last) == d_erreur)
  267:             {
  268:                 return;
  269:             }
  270: 
  271:             if (empilement(s_etat_processus, &((*s_etat_processus)
  272:                     .l_base_pile_last), s_objet_last) == d_erreur)
  273:             {
  274:                 return;
  275:             }
  276:         }
  277:     }
  278:     else
  279:     {
  280:         // LAST invalide
  281: 
  282:         if (fprintf(fichier, "// Current stack (LAST disabled)\n") < 0)
  283:         {
  284:             (*s_etat_processus).erreur_systeme = d_es_erreur_fichier;
  285:             return;
  286:         }
  287:     }
  288: 
  289:     if (fprintf(fichier, "\n// Stack\n\n") < 0)
  290:     {
  291:         (*s_etat_processus).erreur_systeme = d_es_erreur_fichier;
  292:         return;
  293:     }
  294: 
  295:     if ((*s_etat_processus).l_base_pile != NULL)
  296:     {
  297:         registre = (*s_etat_processus).autorisation_conversion_chaine;
  298:         (*s_etat_processus).autorisation_conversion_chaine = 'N';
  299: 
  300:         ecriture_pile(s_etat_processus, fichier,
  301:                 (*s_etat_processus).l_base_pile, 1);
  302: 
  303:         (*s_etat_processus).autorisation_conversion_chaine = registre;
  304:     }
  305:     else
  306:     {
  307:         if (fprintf(fichier, "   Empty stack\n") < 0)
  308:         {
  309:             (*s_etat_processus).erreur_systeme = d_es_erreur_fichier;
  310:             return;
  311:         }
  312:     }
  313: 
  314:     if ((*s_etat_processus).s_objet_errone != NULL)
  315:     {
  316:         if (fprintf(fichier, "\n// Current evaluation\n") < 0)
  317:         {
  318:             (*s_etat_processus).erreur_systeme = d_es_erreur_fichier;
  319:             return;
  320:         }
  321: 
  322:         // L'objet ne peut être qu'une expression algébrique ou RPN
  323: 
  324:         if (((*(*s_etat_processus).s_objet_errone).type == RPN) ||
  325:                 ((*(*s_etat_processus).s_objet_errone).type == ALG))
  326:         {
  327:             l_element_courant = (*(*s_etat_processus).s_objet_errone).objet;
  328: 
  329:             if (fprintf(fichier, "\n") < 0)
  330:             {
  331:                 (*s_etat_processus).erreur_systeme = d_es_erreur_fichier;
  332:                 return;
  333:             }
  334: 
  335:             while(l_element_courant != NULL)
  336:             {
  337:                 if ((*l_element_courant).donnee ==
  338:                         (*s_etat_processus).s_objet_erreur)
  339:                 {
  340:                     if ((expression = formateur(s_etat_processus, 4,
  341:                             (*l_element_courant).donnee)) == NULL)
  342:                     {
  343:                         return;
  344:                     }
  345: 
  346:                     if ((*(*l_element_courant).donnee).type == CHN)
  347:                     {
  348:                         if (fprintf(fichier, " -> \"%s\"\n", expression) < 0)
  349:                         {
  350:                             (*s_etat_processus).erreur_systeme =
  351:                                     d_es_erreur_fichier;
  352:                             return;
  353:                         }
  354:                     }
  355:                     else
  356:                     {
  357:                         if (fprintf(fichier, " -> %s\n", expression) < 0)
  358:                         {
  359:                             (*s_etat_processus).erreur_systeme =
  360:                                     d_es_erreur_fichier;
  361:                             return;
  362:                         }
  363:                     }
  364:                 }
  365:                 else
  366:                 {
  367:                     if ((expression = formateur(s_etat_processus, 4,
  368:                             (*l_element_courant).donnee)) == NULL)
  369:                     {
  370:                         return;
  371:                     }
  372: 
  373:                     if ((*(*l_element_courant).donnee).type == CHN)
  374:                     {
  375:                         if (fprintf(fichier, "    \"%s\"\n", expression) < 0)
  376:                         {
  377:                             (*s_etat_processus).erreur_systeme =
  378:                                     d_es_erreur_fichier;
  379:                             return;
  380:                         }
  381:                     }
  382:                     else
  383:                     {
  384:                         if (fprintf(fichier, "    %s\n", expression) < 0)
  385:                         {
  386:                             (*s_etat_processus).erreur_systeme =
  387:                                     d_es_erreur_fichier;
  388:                             return;
  389:                         }
  390:                     }
  391:                 }
  392: 
  393:                 free(expression);
  394:                 l_element_courant = (*l_element_courant).suivant;
  395:             }
  396:         }
  397:         else
  398:         {
  399:             if ((expression = formateur(s_etat_processus, 4,
  400:                     (*s_etat_processus).s_objet_errone)) == NULL)
  401:             {
  402:                 return;
  403:             }
  404: 
  405:             if (fprintf(fichier, "\n%s\n", expression) < 0)
  406:             {
  407:                 (*s_etat_processus).erreur_systeme = d_es_erreur_fichier;
  408:                 return;
  409:             }
  410: 
  411:             free(expression);
  412:         }
  413:     }
  414: 
  415:     if ((*s_etat_processus).longueur_definitions_chainees != 0)
  416:     {
  417:         if (fprintf(fichier, "\n// Definitions\n") < 0)
  418:         {
  419:             (*s_etat_processus).erreur_systeme = d_es_erreur_fichier;
  420:             return;
  421:         }
  422: 
  423:         ptr = (*s_etat_processus).definitions_chainees;
  424:         i = 0;
  425:         erreur = d_faux;
  426: 
  427:         while(((*ptr) != d_code_fin_chaine) || (erreur == d_vrai))
  428:         {
  429:             if ((i % longueur_lignes) == 0)
  430:             {
  431:                 if (fprintf(fichier, "\n") < 0)
  432:                 {
  433:                     (*s_etat_processus).erreur_systeme = d_es_erreur_fichier;
  434:                     return;
  435:                 }
  436: 
  437:                 if (erreur == d_vrai)
  438:                 {
  439:                     if (fprintf(fichier, "PC     :") < 0)
  440:                     {
  441:                         (*s_etat_processus).erreur_systeme =
  442:                                 d_es_erreur_fichier;
  443:                         return;
  444:                     }
  445: 
  446:                     if ((j = i - longueur_lignes) < 0)
  447:                     {
  448:                         j = 0;
  449:                         ptr_bis = (*s_etat_processus).definitions_chainees;
  450:                     }
  451:                     else
  452:                     {
  453:                         ptr_bis = ptr - longueur_lignes;
  454:                     }
  455: 
  456:                     fin_boucle = d_faux;
  457: 
  458:                     while(((*ptr_bis) != d_code_fin_chaine) &&
  459:                             (fin_boucle == d_faux))
  460:                     {
  461:                         if (j == (long) (*s_etat_processus).position_courante)
  462:                         {
  463:                             if (fprintf(fichier, ">|<") < 0)
  464:                             {
  465:                                 (*s_etat_processus).erreur_systeme =
  466:                                         d_es_erreur_fichier;
  467:                                 return;
  468:                             }
  469: 
  470:                             fin_boucle = d_vrai;
  471:                         }
  472:                         else
  473:                         {
  474:                             if (fprintf(fichier, " ") < 0)
  475:                             {
  476:                                 (*s_etat_processus).erreur_systeme =
  477:                                         d_es_erreur_fichier;
  478:                                 return;
  479:                             }
  480:                         }
  481: 
  482:                         j++;
  483:                         ptr_bis++;
  484:                     }
  485: 
  486:                     if (fprintf(fichier, "\n") < 0)
  487:                     {
  488:                         (*s_etat_processus).erreur_systeme =
  489:                                 d_es_erreur_fichier;
  490:                         return;
  491:                     }
  492:                 }
  493: 
  494:                 if ((*ptr) != d_code_fin_chaine)
  495:                 {
  496:                     if (erreur == d_vrai)
  497:                     {
  498:                         if (fprintf(fichier, "\n") < 0)
  499:                         {
  500:                             (*s_etat_processus).erreur_systeme =
  501:                                     d_es_erreur_fichier;
  502:                             return;
  503:                         }
  504:                     }
  505: 
  506:                     if ((i <= (long) (*s_etat_processus).position_courante) &&
  507:                             ((i + longueur_lignes) > (long) (*s_etat_processus)
  508:                             .position_courante))
  509:                     {
  510:                         if (fprintf(fichier, "\nError  : ") < 0)
  511:                         {
  512:                             (*s_etat_processus).erreur_systeme =
  513:                                     d_es_erreur_fichier;
  514:                             return;
  515:                         }
  516: 
  517:                         erreur = d_vrai;
  518:                     }
  519:                     else
  520:                     {
  521:                         if (fprintf(fichier, "         ") < 0)
  522:                         {
  523:                             (*s_etat_processus).erreur_systeme =
  524:                                     d_es_erreur_fichier;
  525:                             return;
  526:                         }
  527: 
  528:                         erreur = d_faux;
  529:                     }
  530:                 }
  531:                 else
  532:                 {
  533:                     erreur = d_faux;
  534:                 }
  535:             }
  536: 
  537:             if ((*ptr) != d_code_fin_chaine)
  538:             {
  539:                 if (ufprintf(fichier, "%c", *ptr) < 0)
  540:                 {
  541:                     (*s_etat_processus).erreur_systeme = d_es_erreur_fichier;
  542:                     return;
  543:                 }
  544: 
  545:                 ptr++;
  546:             }
  547: 
  548:             i++;
  549:         }
  550: 
  551:         if (fprintf(fichier, "\n// End of definitions\n") < 0)
  552:         {
  553:             (*s_etat_processus).erreur_systeme = d_es_erreur_fichier;
  554:             return;
  555:         }
  556:     }
  557: 
  558:     if (fprintf(fichier, "\n// Externals\n\n") < 0)
  559:     {
  560:         (*s_etat_processus).erreur_systeme = d_es_erreur_fichier;
  561:         return;
  562:     }
  563: 
  564:     instruction_externals(s_etat_processus);
  565: 
  566:     if (fprintf(fichier, "%s\n", pile =
  567:             formateur(s_etat_processus, 0, (*(*s_etat_processus).l_base_pile)
  568:             .donnee)) < 0)
  569:     {
  570:         (*s_etat_processus).erreur_systeme = d_es_erreur_fichier;
  571:         return;
  572:     }
  573: 
  574:     free(pile);
  575: 
  576:     if (fprintf(fichier, "\n// Variables\n\n") < 0)
  577:     {
  578:         (*s_etat_processus).erreur_systeme = d_es_erreur_fichier;
  579:         return;
  580:     }
  581: 
  582:     instruction_vars(s_etat_processus);
  583: 
  584:     if (fprintf(fichier, "%s\n", pile =
  585:             formateur(s_etat_processus, 0, (*(*s_etat_processus).l_base_pile)
  586:             .donnee)) < 0)
  587:     {
  588:         (*s_etat_processus).erreur_systeme = d_es_erreur_fichier;
  589:         return;
  590:     }
  591: 
  592:     free(pile);
  593: 
  594:     instruction_drop2(s_etat_processus);
  595: 
  596:     if (fclose(fichier) != 0)
  597:     {
  598:         (*s_etat_processus).erreur_systeme = d_es_erreur_fichier;
  599:         return;
  600:     }
  601: 
  602:     free((*s_etat_processus).instruction_derniere_erreur);
  603:     (*s_etat_processus).instruction_derniere_erreur = NULL;
  604: 
  605:     return;
  606: }
  607: 
  608: // vim: ts=4

CVSweb interface <joel.bertrand@systella.fr>