File:  [local] / rpl / src / rplcore.c
Revision 1.2: download - view: text, annotated - select for diffs - revision graph
Wed Jan 27 22:22:17 2010 UTC (14 years, 3 months ago) by bertrand
Branches: MAIN
CVS tags: HEAD


Changement de version pour la 4.0.10.
Correction d'un dysfonctionnement dans le retour des erreurs des fonctions
RPL/C lorsque le programme est compilé (routine evaluation()).

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

CVSweb interface <joel.bertrand@systella.fr>