File:  [local] / rpl / src / rplcore.c
Revision 1.5: download - view: text, annotated - select for diffs - revision graph
Thu Mar 4 10:17:55 2010 UTC (14 years, 2 months ago) by bertrand
Branches: MAIN
CVS tags: rpl-4_0_12, HEAD
En route pour la version 4.0.12 !

    1: /*
    2: ================================================================================
    3:   RPL/2 (R) version 4.0.12
    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, "// Process stack\n\n") < 0)
  158:     {
  159:         (*s_etat_processus).erreur_systeme = d_es_erreur_fichier;
  160:         return;
  161:     }
  162: 
  163:     l_element_courant = (struct_liste_chainee *)
  164:             (*s_etat_processus).l_base_pile_processus;
  165:     i = 0;
  166: 
  167:     if (pthread_mutex_trylock(&((*s_etat_processus).mutex)) == 0)
  168:     {
  169:         while(l_element_courant != NULL)
  170:         {
  171:             if ((*(*((struct_processus_fils *)
  172:                     (*(*l_element_courant).donnee).objet)).thread)
  173:                     .processus_detache == d_vrai)
  174:             {
  175:                 if (fprintf(fichier, "%ld: Process [%d]\n",
  176:                         i++, (int) (*(*((struct_processus_fils *)
  177:                         (*(*l_element_courant).donnee).objet)).thread).pid) < 0)
  178:                 {
  179:                     (*s_etat_processus).erreur_systeme = d_es_erreur_fichier;
  180:                     return;
  181:                 }
  182:             }
  183:             else
  184:             {
  185:                 if (fprintf(fichier, "%ld: Thread [%llu] from [%llu]\n",
  186:                         i++, (unsigned long long) (*(*((struct_processus_fils *)
  187:                         (*(*l_element_courant).donnee).objet)).thread)
  188:                         .tid, (unsigned long long)
  189:                         (*(*((struct_processus_fils *) (*(*l_element_courant)
  190:                         .donnee).objet)).thread).pid) < 0)
  191:                 {
  192:                     (*s_etat_processus).erreur_systeme = d_es_erreur_fichier;
  193:                     return;
  194:                 }
  195:             }
  196: 
  197:             l_element_courant = (*l_element_courant).suivant;
  198:         }
  199: 
  200:         if (fprintf(fichier, "%ld: Process [%d]\n\n", i,
  201:                 (int) getpid()) < 0)
  202:         {
  203:             (*s_etat_processus).erreur_systeme = d_es_erreur_fichier;
  204:             return;
  205:         }
  206: 
  207:         pthread_mutex_unlock(&((*s_etat_processus).mutex));
  208:     }
  209: 
  210:     if (test_cfsf(s_etat_processus, 31) == d_vrai)
  211:     {
  212:         // LAST valide
  213: 
  214:         if (fprintf(fichier, "// Arguments\n\n") < 0)
  215:         {
  216:             (*s_etat_processus).erreur_systeme = d_es_erreur_fichier;
  217:             return;
  218:         }
  219: 
  220:         l_base_pile = NULL;
  221: 
  222:         while((*s_etat_processus).l_base_pile_last != NULL)
  223:         {
  224:             if (depilement(s_etat_processus, &((*s_etat_processus)
  225:                     .l_base_pile_last), &s_objet_last) == d_erreur)
  226:             {
  227:                 return;
  228:             }
  229: 
  230:             if (empilement(s_etat_processus, &l_base_pile, s_objet_last)
  231:                     == d_erreur)
  232:             {
  233:                 return;
  234:             }
  235:         }
  236: 
  237:         if ((*s_etat_processus).l_base_pile != NULL)
  238:         {
  239:             registre = (*s_etat_processus).autorisation_conversion_chaine;
  240:             (*s_etat_processus).autorisation_conversion_chaine = 'N';
  241: 
  242:             ecriture_pile(s_etat_processus, fichier, l_base_pile, 1);
  243: 
  244:             (*s_etat_processus).autorisation_conversion_chaine = registre;
  245:         }
  246:         else
  247:         {
  248:             if (fprintf(fichier, "   No argument\n") < 0)
  249:             {
  250:                 (*s_etat_processus).erreur_systeme = d_es_erreur_fichier;
  251:                 return;
  252:             }
  253:         }
  254: 
  255:         while(l_base_pile != NULL)
  256:         {
  257:             if (depilement(s_etat_processus, &l_base_pile,
  258:                     &s_objet_last) == d_erreur)
  259:             {
  260:                 return;
  261:             }
  262: 
  263:             if (empilement(s_etat_processus, &((*s_etat_processus)
  264:                     .l_base_pile_last), s_objet_last) == d_erreur)
  265:             {
  266:                 return;
  267:             }
  268:         }
  269:     }
  270:     else
  271:     {
  272:         // LAST invalide
  273: 
  274:         if (fprintf(fichier, "// Current stack (LAST disabled)\n") < 0)
  275:         {
  276:             (*s_etat_processus).erreur_systeme = d_es_erreur_fichier;
  277:             return;
  278:         }
  279:     }
  280: 
  281:     if (fprintf(fichier, "\n// Stack\n\n") < 0)
  282:     {
  283:         (*s_etat_processus).erreur_systeme = d_es_erreur_fichier;
  284:         return;
  285:     }
  286: 
  287:     if ((*s_etat_processus).l_base_pile != NULL)
  288:     {
  289:         registre = (*s_etat_processus).autorisation_conversion_chaine;
  290:         (*s_etat_processus).autorisation_conversion_chaine = 'N';
  291: 
  292:         ecriture_pile(s_etat_processus, fichier,
  293:                 (*s_etat_processus).l_base_pile, 1);
  294: 
  295:         (*s_etat_processus).autorisation_conversion_chaine = registre;
  296:     }
  297:     else
  298:     {
  299:         if (fprintf(fichier, "   Empty stack\n") < 0)
  300:         {
  301:             (*s_etat_processus).erreur_systeme = d_es_erreur_fichier;
  302:             return;
  303:         }
  304:     }
  305: 
  306:     if ((*s_etat_processus).s_objet_errone != NULL)
  307:     {
  308:         if (fprintf(fichier, "\n// Current evaluation\n") < 0)
  309:         {
  310:             (*s_etat_processus).erreur_systeme = d_es_erreur_fichier;
  311:             return;
  312:         }
  313: 
  314:         // L'objet ne peut être qu'une expression algébrique ou RPN
  315: 
  316:         if (((*(*s_etat_processus).s_objet_errone).type == RPN) ||
  317:                 ((*(*s_etat_processus).s_objet_errone).type == ALG))
  318:         {
  319:             l_element_courant = (*(*s_etat_processus).s_objet_errone).objet;
  320: 
  321:             if (fprintf(fichier, "\n") < 0)
  322:             {
  323:                 (*s_etat_processus).erreur_systeme = d_es_erreur_fichier;
  324:                 return;
  325:             }
  326: 
  327:             while(l_element_courant != NULL)
  328:             {
  329:                 if ((*l_element_courant).donnee ==
  330:                         (*s_etat_processus).s_objet_erreur)
  331:                 {
  332:                     if ((expression = formateur(s_etat_processus, 4,
  333:                             (*l_element_courant).donnee)) == NULL)
  334:                     {
  335:                         return;
  336:                     }
  337: 
  338:                     if ((*(*l_element_courant).donnee).type == CHN)
  339:                     {
  340:                         if (fprintf(fichier, " -> \"%s\"\n", expression) < 0)
  341:                         {
  342:                             (*s_etat_processus).erreur_systeme =
  343:                                     d_es_erreur_fichier;
  344:                             return;
  345:                         }
  346:                     }
  347:                     else
  348:                     {
  349:                         if (fprintf(fichier, " -> %s\n", expression) < 0)
  350:                         {
  351:                             (*s_etat_processus).erreur_systeme =
  352:                                     d_es_erreur_fichier;
  353:                             return;
  354:                         }
  355:                     }
  356:                 }
  357:                 else
  358:                 {
  359:                     if ((expression = formateur(s_etat_processus, 4,
  360:                             (*l_element_courant).donnee)) == NULL)
  361:                     {
  362:                         return;
  363:                     }
  364: 
  365:                     if ((*(*l_element_courant).donnee).type == CHN)
  366:                     {
  367:                         if (fprintf(fichier, "    \"%s\"\n", expression) < 0)
  368:                         {
  369:                             (*s_etat_processus).erreur_systeme =
  370:                                     d_es_erreur_fichier;
  371:                             return;
  372:                         }
  373:                     }
  374:                     else
  375:                     {
  376:                         if (fprintf(fichier, "    %s\n", expression) < 0)
  377:                         {
  378:                             (*s_etat_processus).erreur_systeme =
  379:                                     d_es_erreur_fichier;
  380:                             return;
  381:                         }
  382:                     }
  383:                 }
  384: 
  385:                 free(expression);
  386:                 l_element_courant = (*l_element_courant).suivant;
  387:             }
  388:         }
  389:         else
  390:         {
  391:             if ((expression = formateur(s_etat_processus, 4,
  392:                     (*s_etat_processus).s_objet_errone)) == NULL)
  393:             {
  394:                 return;
  395:             }
  396: 
  397:             if (fprintf(fichier, "\n%s\n", expression) < 0)
  398:             {
  399:                 (*s_etat_processus).erreur_systeme = d_es_erreur_fichier;
  400:                 return;
  401:             }
  402: 
  403:             free(expression);
  404:         }
  405:     }
  406: 
  407:     if ((*s_etat_processus).longueur_definitions_chainees != 0)
  408:     {
  409:         if (fprintf(fichier, "\n// Definitions\n") < 0)
  410:         {
  411:             (*s_etat_processus).erreur_systeme = d_es_erreur_fichier;
  412:             return;
  413:         }
  414: 
  415:         ptr = (*s_etat_processus).definitions_chainees;
  416:         i = 0;
  417:         erreur = d_faux;
  418: 
  419:         while(((*ptr) != d_code_fin_chaine) || (erreur == d_vrai))
  420:         {
  421:             if ((i % longueur_lignes) == 0)
  422:             {
  423:                 if (fprintf(fichier, "\n") < 0)
  424:                 {
  425:                     (*s_etat_processus).erreur_systeme = d_es_erreur_fichier;
  426:                     return;
  427:                 }
  428: 
  429:                 if (erreur == d_vrai)
  430:                 {
  431:                     if (fprintf(fichier, "PC     :") < 0)
  432:                     {
  433:                         (*s_etat_processus).erreur_systeme =
  434:                                 d_es_erreur_fichier;
  435:                         return;
  436:                     }
  437: 
  438:                     if ((j = i - longueur_lignes) < 0)
  439:                     {
  440:                         j = 0;
  441:                         ptr_bis = (*s_etat_processus).definitions_chainees;
  442:                     }
  443:                     else
  444:                     {
  445:                         ptr_bis = ptr - longueur_lignes;
  446:                     }
  447: 
  448:                     fin_boucle = d_faux;
  449: 
  450:                     while(((*ptr_bis) != d_code_fin_chaine) &&
  451:                             (fin_boucle == d_faux))
  452:                     {
  453:                         if (j == (long) (*s_etat_processus).position_courante)
  454:                         {
  455:                             if (fprintf(fichier, ">|<") < 0)
  456:                             {
  457:                                 (*s_etat_processus).erreur_systeme =
  458:                                         d_es_erreur_fichier;
  459:                                 return;
  460:                             }
  461: 
  462:                             fin_boucle = d_vrai;
  463:                         }
  464:                         else
  465:                         {
  466:                             if (fprintf(fichier, " ") < 0)
  467:                             {
  468:                                 (*s_etat_processus).erreur_systeme =
  469:                                         d_es_erreur_fichier;
  470:                                 return;
  471:                             }
  472:                         }
  473: 
  474:                         j++;
  475:                         ptr_bis++;
  476:                     }
  477: 
  478:                     if (fprintf(fichier, "\n") < 0)
  479:                     {
  480:                         (*s_etat_processus).erreur_systeme =
  481:                                 d_es_erreur_fichier;
  482:                         return;
  483:                     }
  484:                 }
  485: 
  486:                 if ((*ptr) != d_code_fin_chaine)
  487:                 {
  488:                     if (erreur == d_vrai)
  489:                     {
  490:                         if (fprintf(fichier, "\n") < 0)
  491:                         {
  492:                             (*s_etat_processus).erreur_systeme =
  493:                                     d_es_erreur_fichier;
  494:                             return;
  495:                         }
  496:                     }
  497: 
  498:                     if ((i <= (long) (*s_etat_processus).position_courante) &&
  499:                             ((i + longueur_lignes) > (long) (*s_etat_processus)
  500:                             .position_courante))
  501:                     {
  502:                         if (fprintf(fichier, "\nError  : ") < 0)
  503:                         {
  504:                             (*s_etat_processus).erreur_systeme =
  505:                                     d_es_erreur_fichier;
  506:                             return;
  507:                         }
  508: 
  509:                         erreur = d_vrai;
  510:                     }
  511:                     else
  512:                     {
  513:                         if (fprintf(fichier, "         ") < 0)
  514:                         {
  515:                             (*s_etat_processus).erreur_systeme =
  516:                                     d_es_erreur_fichier;
  517:                             return;
  518:                         }
  519: 
  520:                         erreur = d_faux;
  521:                     }
  522:                 }
  523:                 else
  524:                 {
  525:                     erreur = d_faux;
  526:                 }
  527:             }
  528: 
  529:             if ((*ptr) != d_code_fin_chaine)
  530:             {
  531:                 if (ufprintf(fichier, "%c", *ptr) < 0)
  532:                 {
  533:                     (*s_etat_processus).erreur_systeme = d_es_erreur_fichier;
  534:                     return;
  535:                 }
  536: 
  537:                 ptr++;
  538:             }
  539: 
  540:             i++;
  541:         }
  542: 
  543:         if (fprintf(fichier, "\n// End of definitions\n") < 0)
  544:         {
  545:             (*s_etat_processus).erreur_systeme = d_es_erreur_fichier;
  546:             return;
  547:         }
  548:     }
  549: 
  550:     if (fprintf(fichier, "\n// Externals\n\n") < 0)
  551:     {
  552:         (*s_etat_processus).erreur_systeme = d_es_erreur_fichier;
  553:         return;
  554:     }
  555: 
  556:     instruction_externals(s_etat_processus);
  557: 
  558:     if (fprintf(fichier, "%s\n", pile =
  559:             formateur(s_etat_processus, 0, (*(*s_etat_processus).l_base_pile)
  560:             .donnee)) < 0)
  561:     {
  562:         (*s_etat_processus).erreur_systeme = d_es_erreur_fichier;
  563:         return;
  564:     }
  565: 
  566:     free(pile);
  567: 
  568:     if (fprintf(fichier, "\n// Variables\n\n") < 0)
  569:     {
  570:         (*s_etat_processus).erreur_systeme = d_es_erreur_fichier;
  571:         return;
  572:     }
  573: 
  574:     instruction_vars(s_etat_processus);
  575: 
  576:     if (fprintf(fichier, "%s\n", pile =
  577:             formateur(s_etat_processus, 0, (*(*s_etat_processus).l_base_pile)
  578:             .donnee)) < 0)
  579:     {
  580:         (*s_etat_processus).erreur_systeme = d_es_erreur_fichier;
  581:         return;
  582:     }
  583: 
  584:     free(pile);
  585: 
  586:     instruction_drop2(s_etat_processus);
  587: 
  588:     if (fclose(fichier) != 0)
  589:     {
  590:         (*s_etat_processus).erreur_systeme = d_es_erreur_fichier;
  591:         return;
  592:     }
  593: 
  594:     free((*s_etat_processus).instruction_derniere_erreur);
  595:     (*s_etat_processus).instruction_derniere_erreur = NULL;
  596: 
  597:     return;
  598: }
  599: 
  600: // vim: ts=4

CVSweb interface <joel.bertrand@systella.fr>