File:  [local] / rpl / src / instructions_c7.c
Revision 1.71: download - view: text, annotated - select for diffs - revision graph
Fri Jan 10 11:15:44 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:   Fonction 'crmtx'
   29: ================================================================================
   30:   Entrées :
   31: --------------------------------------------------------------------------------
   32:   Sorties :
   33: --------------------------------------------------------------------------------
   34:   Effets de bord : néant
   35: ================================================================================
   36: */
   37: 
   38: void
   39: instruction_crmtx(struct_processus *s_etat_processus)
   40: {
   41:     pthread_mutexattr_t             attributs_mutex;
   42: 
   43:     struct_liste_chainee            *s_mutex;
   44: 
   45:     struct_objet                    *s_objet;
   46: 
   47:     (*s_etat_processus).erreur_execution = d_ex;
   48: 
   49:     if ((*s_etat_processus).affichage_arguments == 'Y')
   50:     {
   51:         printf("\n  CRMTX ");
   52: 
   53:         if ((*s_etat_processus).langue == 'F')
   54:         {
   55:             printf("(création d'un mutex)\n\n");
   56:             printf("  Aucun argument\n");
   57:         }
   58:         else
   59:         {
   60:             printf("(create mutex)\n\n");
   61:             printf("  No argument\n");
   62:         }
   63: 
   64:         return;
   65:     }
   66:     else if ((*s_etat_processus).test_instruction == 'Y')
   67:     {
   68:         (*s_etat_processus).nombre_arguments = -1;
   69:         return;
   70:     }
   71: 
   72:     if (test_cfsf(s_etat_processus, 31) == d_vrai)
   73:     {
   74:         if (empilement_pile_last(s_etat_processus, 0) == d_erreur)
   75:         {
   76:             return;
   77:         }
   78:     }
   79: 
   80:     if ((s_mutex = allocation_maillon(s_etat_processus)) == NULL)
   81:     {
   82:         (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
   83:         return;
   84:     }
   85: 
   86:     if ((s_objet = allocation(s_etat_processus, MTX)) == NULL)
   87:     {
   88:         (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
   89:         return;
   90:     }
   91: 
   92:     pthread_mutexattr_init(&attributs_mutex);
   93:     pthread_mutexattr_settype(&attributs_mutex, PTHREAD_MUTEX_RECURSIVE);
   94:     pthread_mutex_init(&((*((struct_mutex *) (*s_objet).objet)).mutex),
   95:             &attributs_mutex);
   96:     pthread_mutexattr_destroy(&attributs_mutex);
   97: 
   98:     if (((*s_mutex).donnee = copie_objet(s_etat_processus, s_objet, 'P'))
   99:             == NULL)
  100:     {
  101:         (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
  102:         return;
  103:     }
  104: 
  105:     if (empilement(s_etat_processus, &((*s_etat_processus).l_base_pile),
  106:             s_objet) == d_erreur)
  107:     {
  108:         (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
  109:         return;
  110:     }
  111: 
  112:     if (pthread_mutex_lock(&((*s_etat_processus).protection_liste_mutexes))
  113:             != 0)
  114:     {
  115:         (*s_etat_processus).erreur_systeme = d_es_processus;
  116:         return;
  117:     }
  118: 
  119:     (*s_mutex).suivant = (*s_etat_processus).liste_mutexes;
  120:     (*s_etat_processus).liste_mutexes = s_mutex;
  121: 
  122:     if (pthread_mutex_unlock(&((*s_etat_processus).protection_liste_mutexes))
  123:             != 0)
  124:     {
  125:         (*s_etat_processus).erreur_systeme = d_es_processus;
  126:         return;
  127:     }
  128: 
  129:     return;
  130: }
  131: 
  132: 
  133: /*
  134: ================================================================================
  135:   Fonction 'clrmtx'
  136: ================================================================================
  137:   Entrées :
  138: --------------------------------------------------------------------------------
  139:   Sorties :
  140: --------------------------------------------------------------------------------
  141:   Effets de bord : néant
  142: ================================================================================
  143: */
  144: 
  145: void
  146: instruction_clrmtx(struct_processus *s_etat_processus)
  147: {
  148:     struct_liste_chainee        *l_element_courant;
  149:     struct_liste_chainee        *l_element_precedent;
  150: 
  151:     struct_objet                *s_objet;
  152: 
  153:     (*s_etat_processus).erreur_execution = d_ex;
  154: 
  155:     if ((*s_etat_processus).affichage_arguments == 'Y')
  156:     {
  157:         printf("\n  CLRMTX ");
  158: 
  159:         if ((*s_etat_processus).langue == 'F')
  160:         {
  161:             printf("(destruction d'un mutex)\n\n");
  162:         }
  163:         else
  164:         {
  165:             printf("(clear mutex)\n\n");
  166:         }
  167: 
  168:         printf("    1: %s\n", d_MTX);
  169: 
  170:         return;
  171:     }
  172:     else if ((*s_etat_processus).test_instruction == 'Y')
  173:     {
  174:         (*s_etat_processus).nombre_arguments = -1;
  175:         return;
  176:     }
  177: 
  178:     if (test_cfsf(s_etat_processus, 31) == d_vrai)
  179:     {
  180:         if (empilement_pile_last(s_etat_processus, 1) == d_erreur)
  181:         {
  182:             return;
  183:         }
  184:     }
  185: 
  186:     if (depilement(s_etat_processus, &((*s_etat_processus).l_base_pile),
  187:             &s_objet) == d_erreur)
  188:     {
  189:         (*s_etat_processus).erreur_execution = d_ex_manque_argument;
  190:         return;
  191:     }
  192: 
  193:     if ((*s_objet).type == MTX)
  194:     {
  195:         l_element_precedent = NULL;
  196:         l_element_courant = (*s_etat_processus).liste_mutexes;
  197: 
  198:         while(l_element_courant != NULL)
  199:         {
  200:             if (&((*((struct_mutex *) (*s_objet).objet)).mutex) ==
  201:                     &((*((struct_mutex *) (*(*l_element_courant).donnee).objet))
  202:                     .mutex))
  203:             {
  204:                 if (l_element_precedent == NULL)
  205:                 {
  206:                     (*s_etat_processus).liste_mutexes =
  207:                             (*l_element_courant).suivant;
  208:                 }
  209:                 else if ((*l_element_courant).suivant == NULL)
  210:                 {
  211:                     (*l_element_precedent).suivant = NULL;
  212:                 }
  213:                 else
  214:                 {
  215:                     (*l_element_precedent).suivant =
  216:                             (*l_element_courant).suivant;
  217:                 }
  218: 
  219:                 liberation(s_etat_processus, (*l_element_courant).donnee);
  220:                 free(l_element_courant);
  221: 
  222:                 break;
  223:             }
  224: 
  225:             l_element_precedent = l_element_courant;
  226:             l_element_courant = (*l_element_courant).suivant;
  227:         }
  228: 
  229:         if (l_element_courant == NULL)
  230:         {
  231:             liberation(s_etat_processus, s_objet);
  232: 
  233:             (*s_etat_processus).erreur_execution = d_ex_mutex;
  234:             return;
  235:         }
  236:     }
  237:     else
  238:     {
  239:         liberation(s_etat_processus, s_objet);
  240: 
  241:         (*s_etat_processus).erreur_execution = d_ex_erreur_type_argument;
  242:         return;
  243:     }
  244: 
  245:     liberation(s_etat_processus, s_objet);
  246: 
  247:     return;
  248: }
  249: 
  250: 
  251: /*
  252: ================================================================================
  253:   Fonction 'copy'
  254: ================================================================================
  255:   Entrées : structure processus
  256: --------------------------------------------------------------------------------
  257:   Sorties :
  258: --------------------------------------------------------------------------------
  259:   Effets de bord : néant
  260: ================================================================================
  261: */
  262: 
  263: void
  264: instruction_copy(struct_processus *s_etat_processus)
  265: {
  266:     struct_objet                    *s_objet_argument;
  267:     struct_objet                    *s_objet_resultat;
  268: 
  269:     (*s_etat_processus).erreur_execution = d_ex;
  270: 
  271:     if ((*s_etat_processus).affichage_arguments == 'Y')
  272:     {
  273:         printf("\n  COPY ");
  274: 
  275:         if ((*s_etat_processus).langue == 'F')
  276:         {
  277:             printf("(création d'une nouvelle instance d'un objet)\n\n");
  278:         }
  279:         else
  280:         {
  281:             printf("(create new object instance)\n\n");
  282:         }
  283: 
  284:         printf("    1: %s, %s, %s, %s, %s, %s,\n"
  285:                 "       %s, %s, %s, %s, %s,\n"
  286:                 "       %s, %s, %s, %s, %s,\n"
  287:                 "       %s, %s, %s, %s,\n"
  288:                 "       %s, %s, %s\n",
  289:                 d_INT, d_REL, d_CPL, d_VIN, d_VRL, d_VCX, d_MIN, d_MRL, d_MCX,
  290:                 d_TAB, d_BIN, d_NOM, d_CHN, d_LST, d_ALG, d_RPN, d_FCH, d_SCK,
  291:                 d_SQL, d_SLB, d_PRC, d_MTX, d_REC);
  292:         printf("->  1: %s, %s, %s, %s, %s, %s,\n"
  293:                 "       %s, %s, %s, %s, %s,\n"
  294:                 "       %s, %s, %s, %s, %s,\n"
  295:                 "       %s, %s, %s, %s,\n"
  296:                 "       %s, %s, %s\n",
  297:                 d_INT, d_REL, d_CPL, d_VIN, d_VRL, d_VCX, d_MIN, d_MRL, d_MCX,
  298:                 d_TAB, d_BIN, d_NOM, d_CHN, d_LST, d_ALG, d_RPN, d_FCH, d_SCK,
  299:                 d_SQL, d_SLB, d_PRC, d_MTX, d_REC);
  300: 
  301:         return;
  302:     }
  303:     else if ((*s_etat_processus).test_instruction == 'Y')
  304:     {
  305:         (*s_etat_processus).nombre_arguments = -1;
  306:         return;
  307:     }
  308: 
  309:     if (test_cfsf(s_etat_processus, 31) == d_vrai)
  310:     {
  311:         if (empilement_pile_last(s_etat_processus, 1) == d_erreur)
  312:         {
  313:             return;
  314:         }
  315:     }
  316: 
  317:     if (depilement(s_etat_processus, &((*s_etat_processus).l_base_pile),
  318:             &s_objet_argument) == d_erreur)
  319:     {
  320:         (*s_etat_processus).erreur_execution = d_ex_manque_argument;
  321:         return;
  322:     }
  323: 
  324:     s_objet_resultat = copie_objet(s_etat_processus, s_objet_argument, 'O');
  325:     liberation(s_etat_processus, s_objet_argument);
  326: 
  327:     if (s_objet_resultat == NULL)
  328:     {
  329:         (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
  330:         return;
  331:     }
  332: 
  333:     if (empilement(s_etat_processus, &((*s_etat_processus).l_base_pile),
  334:             s_objet_resultat) == d_erreur)
  335:     {
  336:         (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
  337:         return;
  338:     }
  339: 
  340:     return;
  341: }
  342: 
  343: 
  344: /*
  345: ================================================================================
  346:   Fonction 'crsmphr'
  347: ================================================================================
  348:   Entrées :
  349: --------------------------------------------------------------------------------
  350:   Sorties :
  351: --------------------------------------------------------------------------------
  352:   Effets de bord : néant
  353: ================================================================================
  354: */
  355: 
  356: void
  357: instruction_crsmphr(struct_processus *s_etat_processus)
  358: {
  359:     sem_t                           *semaphore;
  360: 
  361:     struct_objet                    *s_objet_argument_1;
  362:     struct_objet                    *s_objet_argument_2;
  363: 
  364:     (*s_etat_processus).erreur_execution = d_ex;
  365: 
  366:     if ((*s_etat_processus).affichage_arguments == 'Y')
  367:     {
  368:         printf("\n  CRSMPHR ");
  369: 
  370:         if ((*s_etat_processus).langue == 'F')
  371:         {
  372:             printf("(création d'un sémaphore nommé)\n\n");
  373:         }
  374:         else
  375:         {
  376:             printf("(create named semaphore)\n\n");
  377:         }
  378: 
  379:         printf("    2: %s\n", d_INT);
  380:         printf("    1: %s\n", d_CHN);
  381:         return;
  382:     }
  383:     else if ((*s_etat_processus).test_instruction == 'Y')
  384:     {
  385:         (*s_etat_processus).nombre_arguments = -1;
  386:         return;
  387:     }
  388: 
  389:     if (test_cfsf(s_etat_processus, 31) == d_vrai)
  390:     {
  391:         if (empilement_pile_last(s_etat_processus, 2) == d_erreur)
  392:         {
  393:             return;
  394:         }
  395:     }
  396: 
  397:     if (depilement(s_etat_processus, &((*s_etat_processus).l_base_pile),
  398:             &s_objet_argument_1) == d_erreur)
  399:     {
  400:         (*s_etat_processus).erreur_execution = d_ex_manque_argument;
  401:         return;
  402:     }
  403: 
  404:     if (depilement(s_etat_processus, &((*s_etat_processus).l_base_pile),
  405:             &s_objet_argument_2) == d_erreur)
  406:     {
  407:         liberation(s_etat_processus, s_objet_argument_1);
  408: 
  409:         (*s_etat_processus).erreur_execution = d_ex_manque_argument;
  410:         return;
  411:     }
  412: 
  413:     if (((*s_objet_argument_1).type == CHN) &&
  414:             ((*s_objet_argument_2).type == INT))
  415:     {
  416:         if ((semaphore = sem_open((unsigned char *) (*s_objet_argument_1).objet,
  417:                 O_CREAT | O_EXCL, S_IRUSR | S_IWUSR,
  418:                 (int) (*((integer8 *) (*s_objet_argument_2).objet)))) ==
  419:                 SEM_FAILED)
  420:         {
  421:             (*s_etat_processus).erreur_execution = d_ex_semaphore;
  422: 
  423:             liberation(s_etat_processus, s_objet_argument_1);
  424:             liberation(s_etat_processus, s_objet_argument_2);
  425: 
  426:             return;
  427:         }
  428: 
  429:         if (sem_close(semaphore) != 0)
  430:         {
  431:             (*s_etat_processus).erreur_execution = d_ex_semaphore;
  432: 
  433:             liberation(s_etat_processus, s_objet_argument_1);
  434:             liberation(s_etat_processus, s_objet_argument_2);
  435: 
  436:             return;
  437:         }
  438:     }
  439:     else
  440:     {
  441:         liberation(s_etat_processus, s_objet_argument_1);
  442:         liberation(s_etat_processus, s_objet_argument_2);
  443: 
  444:         (*s_etat_processus).erreur_execution = d_ex_erreur_type_argument;
  445:         return;
  446:     }
  447: 
  448:     liberation(s_etat_processus, s_objet_argument_1);
  449:     liberation(s_etat_processus, s_objet_argument_2);
  450: 
  451:     return;
  452: }
  453: 
  454: 
  455: /*
  456: ================================================================================
  457:   Fonction 'clrsmphr'
  458: ================================================================================
  459:   Entrées :
  460: --------------------------------------------------------------------------------
  461:   Sorties :
  462: --------------------------------------------------------------------------------
  463:   Effets de bord : néant
  464: ================================================================================
  465: */
  466: 
  467: void
  468: instruction_clrsmphr(struct_processus *s_etat_processus)
  469: {
  470:     struct_objet                    *s_objet_argument;
  471: 
  472:     (*s_etat_processus).erreur_execution = d_ex;
  473: 
  474:     if ((*s_etat_processus).affichage_arguments == 'Y')
  475:     {
  476:         printf("\n  CLRSMPHR ");
  477: 
  478:         if ((*s_etat_processus).langue == 'F')
  479:         {
  480:             printf("(destruction d'un sémaphore nommé)\n\n");
  481:         }
  482:         else
  483:         {
  484:             printf("(delete named semaphore)\n\n");
  485:         }
  486: 
  487:         printf("    1: %s\n", d_CHN);
  488:         return;
  489:     }
  490:     else if ((*s_etat_processus).test_instruction == 'Y')
  491:     {
  492:         (*s_etat_processus).nombre_arguments = -1;
  493:         return;
  494:     }
  495: 
  496:     if (test_cfsf(s_etat_processus, 31) == d_vrai)
  497:     {
  498:         if (empilement_pile_last(s_etat_processus, 1) == d_erreur)
  499:         {
  500:             return;
  501:         }
  502:     }
  503: 
  504:     if (depilement(s_etat_processus, &((*s_etat_processus).l_base_pile),
  505:             &s_objet_argument) == d_erreur)
  506:     {
  507:         (*s_etat_processus).erreur_execution = d_ex_manque_argument;
  508:         return;
  509:     }
  510: 
  511:     if ((*s_objet_argument).type == CHN)
  512:     {
  513:         if (sem_unlink((unsigned char *) (*s_objet_argument).objet) != 0)
  514:         {
  515:             (*s_etat_processus).erreur_execution = d_ex_semaphore;
  516: 
  517:             liberation(s_etat_processus, s_objet_argument);
  518:             return;
  519:         }
  520:     }
  521:     else
  522:     {
  523:         liberation(s_etat_processus, s_objet_argument);
  524: 
  525:         (*s_etat_processus).erreur_execution = d_ex_erreur_type_argument;
  526:         return;
  527:     }
  528: 
  529:     liberation(s_etat_processus, s_objet_argument);
  530: 
  531:     return;
  532: }
  533: 
  534: 
  535: /*
  536: ================================================================================
  537:   Fonction 'cond'
  538: ================================================================================
  539:   Entrées :
  540: --------------------------------------------------------------------------------
  541:   Sorties :
  542: --------------------------------------------------------------------------------
  543:   Effets de bord : néant
  544: ================================================================================
  545: */
  546: 
  547: void
  548: instruction_cond(struct_processus *s_etat_processus)
  549: {
  550:     struct_objet                    *s_objet_argument;
  551:     struct_objet                    *s_objet_resultat;
  552: 
  553:     (*s_etat_processus).erreur_execution = d_ex;
  554: 
  555:     if ((*s_etat_processus).affichage_arguments == 'Y')
  556:     {
  557:         printf("\n  COND ");
  558: 
  559:         if ((*s_etat_processus).langue == 'F')
  560:         {
  561:             printf("(nombre de condition d'une matrice)\n\n");
  562:         }
  563:         else
  564:         {
  565:             printf("(matrix condition number)\n\n");
  566:         }
  567: 
  568:         printf("    1: %s, %s, %s\n", d_MIN, d_MRL, d_MCX);
  569:         printf("->  1: %s\n", d_REL);
  570:         return;
  571:     }
  572:     else if ((*s_etat_processus).test_instruction == 'Y')
  573:     {
  574:         (*s_etat_processus).nombre_arguments = -1;
  575:         return;
  576:     }
  577: 
  578:     if (test_cfsf(s_etat_processus, 31) == d_vrai)
  579:     {
  580:         if (empilement_pile_last(s_etat_processus, 1) == d_erreur)
  581:         {
  582:             return;
  583:         }
  584:     }
  585: 
  586:     if (depilement(s_etat_processus, &((*s_etat_processus).l_base_pile),
  587:             &s_objet_argument) == d_erreur)
  588:     {
  589:         (*s_etat_processus).erreur_execution = d_ex_manque_argument;
  590:         return;
  591:     }
  592: 
  593:     if (((*s_objet_argument).type == MIN) ||
  594:             ((*s_objet_argument).type == MRL) ||
  595:             ((*s_objet_argument).type == MCX))
  596:     {
  597:         if ((s_objet_resultat = allocation(s_etat_processus, REL)) == NULL)
  598:         {
  599:             (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
  600:             return;
  601:         }
  602: 
  603:         cond(s_etat_processus, (*s_objet_argument).objet,
  604:                 (*s_objet_resultat).objet);
  605: 
  606:         if ((*s_etat_processus).erreur_systeme != d_es)
  607:         {
  608:             return;
  609:         }
  610: 
  611:         if (((*s_etat_processus).erreur_execution != d_ex) ||
  612:                 ((*s_etat_processus).exception != d_ep))
  613:         {
  614:             liberation(s_etat_processus, s_objet_argument);
  615:             liberation(s_etat_processus, s_objet_resultat);
  616:             return;
  617:         }
  618:     }
  619:     else
  620:     {
  621:         liberation(s_etat_processus, s_objet_argument);
  622: 
  623:         (*s_etat_processus).erreur_execution = d_ex_erreur_type_argument;
  624:         return;
  625:     }
  626: 
  627:     liberation(s_etat_processus, s_objet_argument);
  628: 
  629:     if (empilement(s_etat_processus, &((*s_etat_processus).l_base_pile),
  630:             s_objet_resultat) == d_erreur)
  631:     {
  632:         return;
  633:     }
  634: 
  635:     return;
  636: }
  637: 
  638: 
  639: /*
  640: ================================================================================
  641:   Fonction 'clrerr'
  642: ================================================================================
  643:   Entrées :
  644: --------------------------------------------------------------------------------
  645:   Sorties :
  646: --------------------------------------------------------------------------------
  647:   Effets de bord : néant
  648: ================================================================================
  649: */
  650: 
  651: void
  652: instruction_clrerr(struct_processus *s_etat_processus)
  653: {
  654:     (*s_etat_processus).erreur_execution = d_ex;
  655: 
  656:     if ((*s_etat_processus).affichage_arguments == 'Y')
  657:     {
  658:         printf("\n  CLRERR ");
  659: 
  660:         if ((*s_etat_processus).langue == 'F')
  661:         {
  662:             printf("(réinitialisation des erreurs)\n\n");
  663:             printf("  Aucun argument\n");
  664:         }
  665:         else
  666:         {
  667:             printf("(error reinitialization)\n\n");
  668:             printf("  No argument\n");
  669:         }
  670: 
  671:         return;
  672:     }
  673:     else if ((*s_etat_processus).test_instruction == 'Y')
  674:     {
  675:         (*s_etat_processus).nombre_arguments = -1;
  676:         return;
  677:     }
  678: 
  679:     if (test_cfsf(s_etat_processus, 31) == d_vrai)
  680:     {
  681:         if (empilement_pile_last(s_etat_processus, 0) == d_erreur)
  682:         {
  683:             return;
  684:         }
  685:     }
  686: 
  687:     (*s_etat_processus).derniere_exception = d_ep;
  688:     (*s_etat_processus).derniere_erreur_execution = d_ex;
  689:     (*s_etat_processus).derniere_erreur_systeme = d_es;
  690: 
  691:     return;
  692: }
  693: 
  694: 
  695: /*
  696: ================================================================================
  697:   Fonction 'currenc'
  698: ================================================================================
  699:   Entrées :
  700: --------------------------------------------------------------------------------
  701:   Sorties :
  702: --------------------------------------------------------------------------------
  703:   Effets de bord : néant
  704: ================================================================================
  705: */
  706: 
  707: void
  708: instruction_currenc(struct_processus *s_etat_processus)
  709: {
  710:     struct_objet                    *s_objet_resultat;
  711: 
  712:     (*s_etat_processus).erreur_execution = d_ex;
  713: 
  714:     if ((*s_etat_processus).affichage_arguments == 'Y')
  715:     {
  716:         printf("\n  CURRENC ");
  717: 
  718:         if ((*s_etat_processus).langue == 'F')
  719:         {
  720:             printf("(encodage interne des chaînes de caractères)\n\n");
  721:         }
  722:         else
  723:         {
  724:             printf("(internal strings encodage)\n\n");
  725:         }
  726: 
  727:         printf("->  1: %s\n", d_CHN);
  728:         return;
  729:     }
  730:     else if ((*s_etat_processus).test_instruction == 'Y')
  731:     {
  732:         (*s_etat_processus).nombre_arguments = -1;
  733:         return;
  734:     }
  735: 
  736:     if (test_cfsf(s_etat_processus, 31) == d_vrai)
  737:     {
  738:         if (empilement_pile_last(s_etat_processus, 0) == d_erreur)
  739:         {
  740:             return;
  741:         }
  742:     }
  743: 
  744:     if ((s_objet_resultat = allocation(s_etat_processus, CHN)) == NULL)
  745:     {
  746:         (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
  747:         return;
  748:     }
  749: 
  750:     if (((*s_objet_resultat).objet = malloc((strlen(d_locale) + 1) *
  751:             sizeof(unsigned char))) == NULL)
  752:     {
  753:         (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
  754:         return;
  755:     }
  756: 
  757:     strcpy((unsigned char *) (*s_objet_resultat).objet, d_locale);
  758: 
  759:     if (empilement(s_etat_processus, &((*s_etat_processus).l_base_pile),
  760:             s_objet_resultat) == d_erreur)
  761:     {
  762:         return;
  763:     }
  764: 
  765:     return;
  766: }
  767: 
  768: 
  769: /*
  770: ================================================================================
  771:   Fonction 'clratexit'
  772: ================================================================================
  773:   Entrées : pointeur sur une structure struct_processus
  774: --------------------------------------------------------------------------------
  775:   Sorties :
  776: --------------------------------------------------------------------------------
  777:   Effets de bord : néant
  778: ================================================================================
  779: */
  780: 
  781: void
  782: instruction_clratexit(struct_processus *s_etat_processus)
  783: {
  784:     (*s_etat_processus).erreur_execution = d_ex;
  785: 
  786:     if ((*s_etat_processus).affichage_arguments == 'Y')
  787:     {
  788:         printf("\n  CLRATEXIT ");
  789: 
  790:         if ((*s_etat_processus).langue == 'F')
  791:         {
  792:             printf("(suppression de la fonction de terminaison)\n\n");
  793:             printf("  Aucun argument\n");
  794:         }
  795:         else
  796:         {
  797:             printf("(delete task terminaison function)\n\n");
  798:             printf("  No argument\n");
  799:         }
  800: 
  801:         return;
  802:     }
  803:     else if ((*s_etat_processus).test_instruction == 'Y')
  804:     {
  805:         (*s_etat_processus).nombre_arguments = -1;
  806:         return;
  807:     }
  808: 
  809:     if (test_cfsf(s_etat_processus, 31) == d_vrai)
  810:     {
  811:         if (empilement_pile_last(s_etat_processus, 0) == d_erreur)
  812:         {
  813:             return;
  814:         }
  815:     }
  816: 
  817:     liberation(s_etat_processus, (*s_etat_processus).at_exit);
  818:     (*s_etat_processus).at_exit = NULL;
  819: 
  820:     return;
  821: }
  822: 
  823: 
  824: /*
  825: ================================================================================
  826:   Fonction 'clratpoke'
  827: ================================================================================
  828:   Entrées : pointeur sur une structure struct_processus
  829: --------------------------------------------------------------------------------
  830:   Sorties :
  831: --------------------------------------------------------------------------------
  832:   Effets de bord : néant
  833: ================================================================================
  834: */
  835: 
  836: void
  837: instruction_clratpoke(struct_processus *s_etat_processus)
  838: {
  839:     (*s_etat_processus).erreur_execution = d_ex;
  840: 
  841:     if ((*s_etat_processus).affichage_arguments == 'Y')
  842:     {
  843:         printf("\n  CLRATPOKE ");
  844: 
  845:         if ((*s_etat_processus).langue == 'F')
  846:         {
  847:             printf("(suppression de la fonction de contrôle d'injection)\n\n");
  848:             printf("  Aucun argument\n");
  849:         }
  850:         else
  851:         {
  852:             printf("(delete injection controle function)\n\n");
  853:             printf("  No argument\n");
  854:         }
  855: 
  856:         return;
  857:     }
  858:     else if ((*s_etat_processus).test_instruction == 'Y')
  859:     {
  860:         (*s_etat_processus).nombre_arguments = -1;
  861:         return;
  862:     }
  863: 
  864:     if (test_cfsf(s_etat_processus, 31) == d_vrai)
  865:     {
  866:         if (empilement_pile_last(s_etat_processus, 0) == d_erreur)
  867:         {
  868:             return;
  869:         }
  870:     }
  871: 
  872:     liberation(s_etat_processus, (*s_etat_processus).at_poke);
  873:     (*s_etat_processus).at_poke = NULL;
  874: 
  875:     return;
  876: }
  877: 
  878: 
  879: /*
  880: ================================================================================
  881:   Fonction 'critical'
  882: ================================================================================
  883:   Entrées :
  884: --------------------------------------------------------------------------------
  885:   Sorties :
  886: --------------------------------------------------------------------------------
  887:   Effets de bord : néant
  888: ================================================================================
  889: */
  890: 
  891: void
  892: instruction_critical(struct_processus *s_etat_processus)
  893: {
  894:     (*s_etat_processus).erreur_execution = d_ex;
  895: 
  896:     if ((*s_etat_processus).affichage_arguments == 'Y')
  897:     {
  898:         printf("\n  CRITICAL ");
  899: 
  900:         if ((*s_etat_processus).langue == 'F')
  901:         {
  902:             printf("(initialisation d'une section critique)\n\n");
  903:             printf("  Aucun argument\n");
  904:         }
  905:         else
  906:         {
  907:             printf("(critical section initialization)\n\n");
  908:             printf("  No argument\n");
  909:         }
  910: 
  911:         return;
  912:     }
  913:     else if ((*s_etat_processus).test_instruction == 'Y')
  914:     {
  915:         (*s_etat_processus).nombre_arguments = -1;
  916:         return;
  917:     }
  918: 
  919:     if (test_cfsf(s_etat_processus, 31) == d_vrai)
  920:     {
  921:         if (empilement_pile_last(s_etat_processus, 0) == d_erreur)
  922:         {
  923:             return;
  924:         }
  925:     }
  926: 
  927:     empilement_pile_systeme(s_etat_processus);
  928: 
  929:     if ((*s_etat_processus).erreur_systeme != d_es)
  930:     {
  931:         return;
  932:     }
  933: 
  934:     (*(*s_etat_processus).l_base_pile_systeme).type_cloture = 'Q';
  935: 
  936:     if (pthread_mutex_lock(&mutex_sections_critiques) != 0)
  937:     {
  938:         (*s_etat_processus).erreur_systeme = d_es_processus;
  939:         return;
  940:     }
  941: 
  942:     (*s_etat_processus).sections_critiques++;
  943:     return;
  944: }
  945: 
  946: // vim: ts=4

CVSweb interface <joel.bertrand@systella.fr>