File:  [local] / rpl / src / instructions_c6.c
Revision 1.3: download - view: text, annotated - select for diffs - revision graph
Wed Feb 10 10:14:21 2010 UTC (14 years, 2 months ago) by bertrand
Branches: MAIN
CVS tags: rpl-4_0_11, HEAD
Branchement vers 4.0.11

    1: /*
    2: ================================================================================
    3:   RPL/2 (R) version 4.0.11
    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 'clusr'
   29: ================================================================================
   30:   Entrées :
   31: --------------------------------------------------------------------------------
   32:   Sorties :
   33: --------------------------------------------------------------------------------
   34:   Effets de bord : néant
   35: ================================================================================
   36: */
   37: 
   38: void
   39: instruction_clusr(struct_processus *s_etat_processus)
   40: {
   41:     unsigned long                   i;
   42: 
   43:     (*s_etat_processus).erreur_execution = d_ex;
   44: 
   45:     if ((*s_etat_processus).affichage_arguments == 'Y')
   46:     {
   47:         printf("\n  CLUSR ");
   48: 
   49:         if ((*s_etat_processus).langue == 'F')
   50:         {
   51:             printf("(effacement des variables)\n\n");
   52:             printf("  Aucun argument\n");
   53:         }
   54:         else
   55:         {
   56:             printf("(clear variables)\n\n");
   57:             printf("  No argument\n");
   58:         }
   59: 
   60:         return;
   61:     }
   62:     else if ((*s_etat_processus).test_instruction == 'Y')
   63:     {
   64:         (*s_etat_processus).nombre_arguments = -1;
   65:         return;
   66:     }
   67: 
   68:     if (test_cfsf(s_etat_processus, 31) == d_vrai)
   69:     {
   70:         if (empilement_pile_last(s_etat_processus, 0) == d_erreur)
   71:         {
   72:             return;
   73:         }
   74:     }
   75: 
   76:     for(i = 0; i < (*s_etat_processus).nombre_variables; i++)
   77:     {
   78:         if (((*s_etat_processus).s_liste_variables[i]).niveau == 1)
   79:         {
   80:             if (retrait_variable(s_etat_processus,
   81:                     ((*s_etat_processus).s_liste_variables[i]).nom, 'G')
   82:                     == d_erreur)
   83:             {
   84:                 return;
   85:             }
   86:         }
   87:     }
   88: 
   89:     return;
   90: }
   91: 
   92: 
   93: /*
   94: ================================================================================
   95:   Fonction 'col->'
   96: ================================================================================
   97:   Entrées :
   98: --------------------------------------------------------------------------------
   99:   Sorties :
  100: --------------------------------------------------------------------------------
  101:   Effets de bord : néant
  102: ================================================================================
  103: */
  104: 
  105: void
  106: instruction_col_fleche(struct_processus *s_etat_processus)
  107: {
  108:     struct_objet                *s_objet;
  109:     struct_objet                *s_objet_elementaire;
  110: 
  111:     unsigned long               i;
  112:     unsigned long               j;
  113: 
  114:     (*s_etat_processus).erreur_execution = d_ex;
  115: 
  116:     if ((*s_etat_processus).affichage_arguments == 'Y')
  117:     {
  118:         printf("\n  COL-> ");
  119: 
  120:         if ((*s_etat_processus).langue == 'F')
  121:         {
  122:             printf("(extraction des colonnes d'une matrice)\n\n");
  123:         }
  124:         else
  125:         {
  126:             printf("(extract matrix columns)\n\n");
  127:         }
  128: 
  129:         printf("    1: %s, %s, %s\n", d_MIN, d_MRL, d_MCX);
  130:         printf("->  n: %s, %s, %s\n", d_MIN, d_MRL, d_MCX);
  131:         printf("    ...\n");
  132:         printf("    2: %s, %s, %s\n", d_MIN, d_MRL, d_MCX);
  133:         printf("    1: %s\n", d_INT);
  134: 
  135:         return;
  136:     }
  137:     else if ((*s_etat_processus).test_instruction == 'Y')
  138:     {
  139:         (*s_etat_processus).nombre_arguments = -1;
  140:         return;
  141:     }
  142: 
  143:     if (test_cfsf(s_etat_processus, 31) == d_vrai)
  144:     {
  145:         if (empilement_pile_last(s_etat_processus, 1) == d_erreur)
  146:         {
  147:             return;
  148:         }
  149:     }
  150: 
  151:     if (depilement(s_etat_processus, &((*s_etat_processus).l_base_pile),
  152:             &s_objet) == d_erreur)
  153:     {
  154:         (*s_etat_processus).erreur_execution = d_ex_manque_argument;
  155:         return;
  156:     }
  157: 
  158:     if ((*s_objet).type == MIN)
  159:     {
  160:         for(i = 0; i < (*((struct_matrice *)
  161:                 (*s_objet).objet)).nombre_colonnes; i++)
  162:         {
  163:             if ((s_objet_elementaire = allocation(s_etat_processus, MIN))
  164:                     == NULL)
  165:             {
  166:                 (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
  167:                 return;
  168:             }
  169: 
  170:             (*((struct_matrice *) (*s_objet_elementaire).objet))
  171:                     .nombre_colonnes = 1;
  172:             (*((struct_matrice *) (*s_objet_elementaire).objet))
  173:                     .nombre_lignes = (*((struct_matrice *) (*s_objet).objet))
  174:                     .nombre_lignes;
  175: 
  176:             if (((*((struct_matrice *) (*s_objet_elementaire).objet)).tableau =
  177:                     malloc((*((struct_matrice *) (*s_objet).objet))
  178:                     .nombre_lignes * sizeof(integer8 *))) == NULL)
  179:             {
  180:                 (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
  181:                 return;
  182:             }
  183: 
  184:             for(j = 0; j < (*((struct_matrice *) (*s_objet).objet))
  185:                     .nombre_lignes; j++)
  186:             {
  187:                 if ((((integer8 **) (*((struct_matrice *) (*s_objet_elementaire)
  188:                         .objet)).tableau)[j] = malloc(sizeof(integer8)))
  189:                         == NULL)
  190:                 {
  191:                     (*s_etat_processus).erreur_systeme =
  192:                             d_es_allocation_memoire;
  193:                     return;
  194:                 }
  195: 
  196:                 ((integer8 **) (*((struct_matrice *) (*s_objet_elementaire)
  197:                         .objet)).tableau)[j][0] = ((integer8 **)
  198:                         (*((struct_matrice *) (*s_objet).objet)).tableau)[j][i];
  199:             }
  200: 
  201:             if (empilement(s_etat_processus, &((*s_etat_processus).l_base_pile),
  202:                     s_objet_elementaire) == d_erreur)
  203:             {
  204:                 (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
  205:                 return;
  206:             }
  207:         }
  208:     }
  209:     else if ((*s_objet).type == MRL)
  210:     {
  211:         for(i = 0; i < (*((struct_matrice *)
  212:                 (*s_objet).objet)).nombre_colonnes; i++)
  213:         {
  214:             if ((s_objet_elementaire = allocation(s_etat_processus, MRL))
  215:                     == NULL)
  216:             {
  217:                 (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
  218:                 return;
  219:             }
  220: 
  221:             (*((struct_matrice *) (*s_objet_elementaire).objet))
  222:                     .nombre_colonnes = 1;
  223:             (*((struct_matrice *) (*s_objet_elementaire).objet))
  224:                     .nombre_lignes = (*((struct_matrice *) (*s_objet).objet))
  225:                     .nombre_lignes;
  226: 
  227:             if (((*((struct_matrice *) (*s_objet_elementaire).objet)).tableau =
  228:                     malloc((*((struct_matrice *) (*s_objet).objet))
  229:                     .nombre_lignes * sizeof(real8 *))) == NULL)
  230:             {
  231:                 (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
  232:                 return;
  233:             }
  234: 
  235:             for(j = 0; j < (*((struct_matrice *) (*s_objet).objet))
  236:                     .nombre_lignes; j++)
  237:             {
  238:                 if ((((real8 **) (*((struct_matrice *) (*s_objet_elementaire)
  239:                         .objet)).tableau)[j] = malloc(sizeof(real8)))
  240:                         == NULL)
  241:                 {
  242:                     (*s_etat_processus).erreur_systeme =
  243:                             d_es_allocation_memoire;
  244:                     return;
  245:                 }
  246: 
  247:                 ((real8 **) (*((struct_matrice *) (*s_objet_elementaire)
  248:                         .objet)).tableau)[j][0] = ((real8 **)
  249:                         (*((struct_matrice *) (*s_objet).objet)).tableau)[j][i];
  250:             }
  251: 
  252:             if (empilement(s_etat_processus, &((*s_etat_processus).l_base_pile),
  253:                     s_objet_elementaire) == d_erreur)
  254:             {
  255:                 (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
  256:                 return;
  257:             }
  258:         }
  259:     }
  260:     else if ((*s_objet).type == MCX)
  261:     {
  262:         for(i = 0; i < (*((struct_matrice *)
  263:                 (*s_objet).objet)).nombre_colonnes; i++)
  264:         {
  265:             if ((s_objet_elementaire = allocation(s_etat_processus, MCX))
  266:                     == NULL)
  267:             {
  268:                 (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
  269:                 return;
  270:             }
  271: 
  272:             (*((struct_matrice *) (*s_objet_elementaire).objet))
  273:                     .nombre_colonnes = 1;
  274:             (*((struct_matrice *) (*s_objet_elementaire).objet))
  275:                     .nombre_lignes = (*((struct_matrice *) (*s_objet).objet))
  276:                     .nombre_lignes;
  277: 
  278:             if (((*((struct_matrice *) (*s_objet_elementaire).objet)).tableau =
  279:                     malloc((*((struct_matrice *) (*s_objet).objet))
  280:                     .nombre_lignes * sizeof(complex16 *))) == NULL)
  281:             {
  282:                 (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
  283:                 return;
  284:             }
  285: 
  286:             for(j = 0; j < (*((struct_matrice *) (*s_objet).objet))
  287:                     .nombre_lignes; j++)
  288:             {
  289:                 if ((((complex16 **) (*((struct_matrice *)
  290:                         (*s_objet_elementaire).objet)).tableau)[j] =
  291:                         malloc(sizeof(complex16))) == NULL)
  292:                 {
  293:                     (*s_etat_processus).erreur_systeme =
  294:                             d_es_allocation_memoire;
  295:                     return;
  296:                 }
  297: 
  298:                 (((complex16 **) (*((struct_matrice *) (*s_objet_elementaire)
  299:                         .objet)).tableau)[j][0]).partie_reelle =
  300:                         (((complex16 **) (*((struct_matrice *) (*s_objet)
  301:                         .objet)).tableau)[j][i]).partie_reelle;
  302:                 (((complex16 **) (*((struct_matrice *) (*s_objet_elementaire)
  303:                         .objet)).tableau)[j][0]).partie_imaginaire =
  304:                         (((complex16 **) (*((struct_matrice *) (*s_objet)
  305:                         .objet)).tableau)[j][i]).partie_imaginaire;
  306:             }
  307: 
  308:             if (empilement(s_etat_processus, &((*s_etat_processus).l_base_pile),
  309:                     s_objet_elementaire) == d_erreur)
  310:             {
  311:                 (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
  312:                 return;
  313:             }
  314:         }
  315:     }
  316:     else
  317:     {
  318:         liberation(s_etat_processus, s_objet);
  319: 
  320:         (*s_etat_processus).erreur_execution = d_ex_erreur_type_argument;
  321:         return;
  322:     }
  323: 
  324:     if ((s_objet_elementaire = allocation(s_etat_processus, INT)) == NULL)
  325:     {
  326:         (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
  327:         return;
  328:     }
  329: 
  330:     (*((integer8 *) (*s_objet_elementaire).objet)) =
  331:             (*((struct_matrice *) (*s_objet).objet)).nombre_colonnes;
  332: 
  333:     if (empilement(s_etat_processus, &((*s_etat_processus).l_base_pile),
  334:             s_objet_elementaire) == d_erreur)
  335:     {
  336:         (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
  337:         return;
  338:     }
  339: 
  340:     liberation(s_etat_processus, s_objet);
  341: 
  342:     return;
  343: }
  344: 
  345: 
  346: /*
  347: ================================================================================
  348:   Fonction 'clrswi'
  349: ================================================================================
  350:   Entrées : pointeur sur une structure struct_processus
  351: --------------------------------------------------------------------------------
  352:   Sorties :
  353: --------------------------------------------------------------------------------
  354:   Effets de bord : néant
  355: ================================================================================
  356: */
  357: 
  358: void
  359: instruction_clrswi(struct_processus *s_etat_processus)
  360: {
  361:     integer8                        interruption;
  362: 
  363:     struct_objet                    *s_objet_argument;
  364: 
  365:     (*s_etat_processus).erreur_execution = d_ex;
  366: 
  367:     if ((*s_etat_processus).affichage_arguments == 'Y')
  368:     {
  369:         printf("\n  CLRSWI ");
  370: 
  371:         if ((*s_etat_processus).langue == 'F')
  372:         {
  373:             printf("(suppression d'une interruption logicielle)\n\n");
  374:         }
  375:         else
  376:         {
  377:             printf("(software interrupt deletion)\n\n");
  378:         }
  379: 
  380:         printf("    1: %s\n", d_INT);
  381: 
  382:         return;
  383:     }
  384:     else if ((*s_etat_processus).test_instruction == 'Y')
  385:     {
  386:         (*s_etat_processus).nombre_arguments = -1;
  387:         return;
  388:     }
  389: 
  390:     if (test_cfsf(s_etat_processus, 31) == d_vrai)
  391:     {
  392:         if (empilement_pile_last(s_etat_processus, 1) == d_erreur)
  393:         {
  394:             return;
  395:         }
  396:     }
  397: 
  398:     if (depilement(s_etat_processus, &((*s_etat_processus).l_base_pile),
  399:             &s_objet_argument) == d_erreur)
  400:     {
  401:         (*s_etat_processus).erreur_execution = d_ex_manque_argument;
  402:         return;
  403:     }
  404: 
  405:     if ((*s_objet_argument).type == INT)
  406:     {
  407:         interruption = (*((integer8 *) (*s_objet_argument).objet));
  408: 
  409:         if ((interruption < 1) || (interruption > d_NOMBRE_INTERRUPTIONS))
  410:         {
  411:             liberation(s_etat_processus, s_objet_argument);
  412: 
  413:             (*s_etat_processus).erreur_execution = d_ex_interruption_invalide;
  414:             return;
  415:         }
  416: 
  417:         liberation(s_etat_processus, (*s_etat_processus)
  418:                 .corps_interruptions[interruption - 1]);
  419:         (*s_etat_processus).corps_interruptions[interruption - 1] = NULL;
  420:     }
  421:     else
  422:     {
  423:         liberation(s_etat_processus, s_objet_argument);
  424: 
  425:         (*s_etat_processus).erreur_execution = d_ex_erreur_type_argument;
  426:         return;
  427:     }
  428: 
  429:     return;
  430: }
  431: 
  432: 
  433: /*
  434: ================================================================================
  435:   Fonction 'clrcntxt'
  436: ================================================================================
  437:   Entrées :
  438: --------------------------------------------------------------------------------
  439:   Sorties :
  440: --------------------------------------------------------------------------------
  441:   Effets de bord : néant
  442: ================================================================================
  443: */
  444: 
  445: void
  446: instruction_clrcntxt(struct_processus *s_etat_processus)
  447: {
  448:     struct_liste_chainee                *l_element_courant;
  449:     struct_liste_chainee                *l_element_suivant;
  450: 
  451:     (*s_etat_processus).erreur_execution = d_ex;
  452: 
  453:     if ((*s_etat_processus).affichage_arguments == 'Y')
  454:     {
  455:         printf("\n  CLCNTXT ");
  456: 
  457:         if ((*s_etat_processus).langue == 'F')
  458:         {
  459:             printf("(effacement des contextes)\n\n");
  460:             printf("  Aucun argument\n");
  461:         }
  462:         else
  463:         {
  464:             printf("(clear contexts)\n\n");
  465:             printf("  No argument\n");
  466:         }
  467: 
  468:         return;
  469:     }
  470:     else if ((*s_etat_processus).test_instruction == 'Y')
  471:     {
  472:         (*s_etat_processus).nombre_arguments = -1;
  473:         return;
  474:     }
  475: 
  476:     if (test_cfsf(s_etat_processus, 31) == d_vrai)
  477:     {
  478:         if (empilement_pile_last(s_etat_processus, 0) == d_erreur)
  479:         {
  480:             return;
  481:         }
  482:     }
  483: 
  484:     l_element_courant = (*s_etat_processus).l_base_pile_contextes;
  485: 
  486:     while(l_element_courant != NULL)
  487:     {
  488:         l_element_suivant = (*l_element_courant).suivant;
  489:         liberation(s_etat_processus, (*l_element_courant).donnee);
  490:         free(l_element_courant);
  491:         l_element_courant = l_element_suivant;
  492:     }
  493: 
  494:     (*s_etat_processus).l_base_pile_contextes = NULL;
  495: 
  496:     return;
  497: }
  498: 
  499: 
  500: /*
  501: ================================================================================
  502:   Fonction 'continue'
  503: ================================================================================
  504:   Entrées :
  505: --------------------------------------------------------------------------------
  506:   Sorties :
  507: --------------------------------------------------------------------------------
  508:   Effets de bord : néant
  509: ================================================================================
  510: */
  511: 
  512: void
  513: instruction_continue(struct_processus *s_etat_processus)
  514: {
  515:     struct_liste_chainee        *l_element_courant;
  516: 
  517:     struct_objet                *s_objet;
  518: 
  519:     (*s_etat_processus).erreur_execution = d_ex;
  520: 
  521:     if ((*s_etat_processus).affichage_arguments == 'Y')
  522:     {
  523:         printf("\n  CONTINUE ");
  524: 
  525:         if ((*s_etat_processus).langue == 'F')
  526:         {
  527:             printf("(relance d'un processus suspendu)\n\n");
  528:         }
  529:         else
  530:         {
  531:             printf("(continue a pending process)\n\n");
  532:         }
  533: 
  534:         printf("    1: %s\n", d_PRC);
  535: 
  536:         return;
  537:     }
  538:     else if ((*s_etat_processus).test_instruction == 'Y')
  539:     {
  540:         (*s_etat_processus).nombre_arguments = -1;
  541:         return;
  542:     }
  543:     
  544:     if (test_cfsf(s_etat_processus, 31) == d_vrai)
  545:     {
  546:         if (empilement_pile_last(s_etat_processus, 1) == d_erreur)
  547:         {
  548:             return;
  549:         }
  550:     }
  551: 
  552:     if (depilement(s_etat_processus, &((*s_etat_processus).l_base_pile),
  553:             &s_objet) == d_erreur)
  554:     {
  555:         (*s_etat_processus).erreur_execution = d_ex_manque_argument;
  556:         return;
  557:     }
  558: 
  559:     if ((*s_objet).type == PRC)
  560:     {
  561:         if (pthread_mutex_lock(&((*s_etat_processus).mutex)) != 0)
  562:         {
  563:             (*s_etat_processus).erreur_systeme = d_es_processus;
  564:         }
  565:         else
  566:         {
  567:             l_element_courant = (struct_liste_chainee *)
  568:                     (*s_etat_processus).l_base_pile_processus;
  569: 
  570:             while(l_element_courant != NULL)
  571:             {
  572:                 if ((*(*((struct_processus_fils *) (*s_objet).objet)).thread)
  573:                         .processus_detache == d_vrai)
  574:                 {
  575:                     if ((*(*((struct_processus_fils *) (*s_objet).objet))
  576:                             .thread).pid == (*(*((struct_processus_fils *)
  577:                             (*(*l_element_courant).donnee).objet)).thread).pid)
  578:                     {
  579:                         if (kill((*(*((struct_processus_fils *)
  580:                                 (*s_objet).objet)).thread).pid, SIGCONT) != 0)
  581:                         {
  582:                             // Le processus est peut-être dans l'état zombie.
  583:                         }
  584: 
  585:                         break;
  586:                     }
  587:                 }
  588:                 else
  589:                 {
  590:                     if (pthread_mutex_lock(&((*(*((struct_processus_fils *)
  591:                             (*s_objet).objet)).thread).mutex)) != 0)
  592:                     {
  593:                         (*s_etat_processus).erreur_systeme = d_es_processus;
  594:                         return;
  595:                     }
  596: 
  597:                     if ((*(*((struct_processus_fils *)
  598:                             (*s_objet).objet)).thread).thread_actif == d_vrai)
  599:                     {
  600:                         if (((pthread_equal((*(*((struct_processus_fils *)
  601:                                 (*s_objet).objet)).thread).tid,
  602:                                 (*(*((struct_processus_fils *)
  603:                                 (*(*l_element_courant).donnee).objet)).thread)
  604:                                 .tid) != 0)) && ((*(*((struct_processus_fils *)
  605:                                 (*s_objet).objet)).thread).pid ==
  606:                                 (*(*((struct_processus_fils *)
  607:                                 (*(*l_element_courant).donnee).objet)).thread)
  608:                                 .pid))
  609:                         {
  610:                             if (pthread_kill((*(*((struct_processus_fils *)
  611:                                     (*s_objet).objet)).thread).tid, SIGCONT)
  612:                                     != 0)
  613:                             {
  614:                                 // Le thread est peut-être dans l'état zombie.
  615:                             }
  616: 
  617:                             if (pthread_mutex_unlock(
  618:                                     &((*(*((struct_processus_fils *)
  619:                                     (*s_objet).objet)).thread).mutex)) != 0)
  620:                             {
  621:                                 (*s_etat_processus).erreur_systeme =
  622:                                         d_es_processus;
  623:                                 return;
  624:                             }
  625: 
  626:                             break;
  627:                         }
  628:                     }
  629: 
  630:                     if (pthread_mutex_unlock(&((*(*((struct_processus_fils *)
  631:                             (*s_objet).objet)).thread).mutex)) != 0)
  632:                     {
  633:                         (*s_etat_processus).erreur_systeme = d_es_processus;
  634:                         return;
  635:                     }
  636:                 }
  637: 
  638:                 l_element_courant = (*l_element_courant).suivant;
  639:             }
  640: 
  641:             if (pthread_mutex_unlock(&((*s_etat_processus).mutex)) != 0)
  642:             {
  643:                 (*s_etat_processus).erreur_systeme = d_es_processus;
  644:             }
  645:         }
  646:     }
  647:     else
  648:     {
  649:         liberation(s_etat_processus, s_objet);
  650: 
  651:         (*s_etat_processus).erreur_execution = d_ex_erreur_type_argument;
  652:         return;
  653:     }
  654: 
  655:     liberation(s_etat_processus, s_objet);
  656: 
  657:     return;
  658: }
  659: 
  660: 
  661: /*
  662: ================================================================================
  663:   Fonction 'cstop'
  664: ================================================================================
  665:   Entrées :
  666: --------------------------------------------------------------------------------
  667:   Sorties :
  668: --------------------------------------------------------------------------------
  669:   Effets de bord : néant
  670: ================================================================================
  671: */
  672: 
  673: void
  674: instruction_cstop(struct_processus *s_etat_processus)
  675: {
  676:     (*s_etat_processus).erreur_execution = d_ex;
  677: 
  678:     if ((*s_etat_processus).affichage_arguments == 'Y')
  679:     {
  680:         printf("\n  CSTOP ");
  681: 
  682:         if ((*s_etat_processus).langue == 'F')
  683:         {
  684:             printf("(capture du signal stop)\n\n");
  685:             printf("  Aucun argument\n");
  686:         }
  687:         else
  688:         {
  689:             printf("(catch stop signal)\n\n");
  690:             printf("  No argument\n");
  691:         }
  692: 
  693:         return;
  694:     }
  695:     else if ((*s_etat_processus).test_instruction == 'Y')
  696:     {
  697:         (*s_etat_processus).nombre_arguments = -1;
  698:         return;
  699:     }
  700:     
  701:     if (test_cfsf(s_etat_processus, 31) == d_vrai)
  702:     {
  703:         if (empilement_pile_last(s_etat_processus, 0) == d_erreur)
  704:         {
  705:             return;
  706:         }
  707:     }
  708: 
  709:     if ((*s_etat_processus).var_volatile_traitement_retarde_stop == 0)
  710:     {
  711:         (*s_etat_processus).var_volatile_traitement_retarde_stop = 1;
  712:     }
  713:     else
  714:     {
  715:         (*s_etat_processus).erreur_execution = d_ex_stop;
  716:     }
  717: 
  718:     return;
  719: }
  720: 
  721: 
  722: /*
  723: ================================================================================
  724:   Fonction 'clrfuse'
  725: ================================================================================
  726:   Entrées :
  727: --------------------------------------------------------------------------------
  728:   Sorties :
  729: --------------------------------------------------------------------------------
  730:   Effets de bord : néant
  731: ================================================================================
  732: */
  733: 
  734: void
  735: instruction_clrfuse(struct_processus *s_etat_processus)
  736: {
  737:     (*s_etat_processus).erreur_execution = d_ex;
  738: 
  739:     if ((*s_etat_processus).affichage_arguments == 'Y')
  740:     {
  741:         printf("\n  CLRFUSE ");
  742: 
  743:         if ((*s_etat_processus).langue == 'F')
  744:         {
  745:             printf("(libère un fusible)\n\n");
  746:             printf("  Aucun argument\n");
  747:         }
  748:         else
  749:         {
  750:             printf("(release fuse signal)\n\n");
  751:             printf("  No argument\n");
  752:         }
  753: 
  754:         return;
  755:     }
  756:     else if ((*s_etat_processus).test_instruction == 'Y')
  757:     {
  758:         (*s_etat_processus).nombre_arguments = -1;
  759:         return;
  760:     }
  761:     
  762:     if (test_cfsf(s_etat_processus, 31) == d_vrai)
  763:     {
  764:         if (empilement_pile_last(s_etat_processus, 0) == d_erreur)
  765:         {
  766:             return;
  767:         }
  768:     }
  769: 
  770:     if ((*s_etat_processus).presence_fusible == d_faux)
  771:     {
  772:         (*s_etat_processus).erreur_execution = d_ex_fusible;
  773:         return;
  774:     }
  775: 
  776:     if (pthread_cancel((*s_etat_processus).thread_fusible) != 0)
  777:     {
  778:         if ((*s_etat_processus).var_volatile_requete_arret == 0)
  779:         {
  780:             (*s_etat_processus).erreur_systeme = d_es_processus;
  781:             return;
  782:         }
  783:     }
  784: 
  785:     (*s_etat_processus).thread_fusible = 0;
  786:     (*s_etat_processus).presence_fusible = d_faux;
  787: 
  788:     return;
  789: }
  790: 
  791: 
  792: /*
  793: ================================================================================
  794:   Fonction 'crtab'
  795: ================================================================================
  796:   Entrées :
  797: --------------------------------------------------------------------------------
  798:   Sorties :
  799: --------------------------------------------------------------------------------
  800:   Effets de bord : néant
  801: ================================================================================
  802: */
  803: 
  804: void
  805: instruction_crtab(struct_processus *s_etat_processus)
  806: {
  807:     struct_liste_chainee    *l_element_courant;
  808: 
  809:     struct_objet            *s_objet_argument;
  810:     struct_objet            *s_objet_resultat;
  811: 
  812:     struct_objet *
  813:     creation_table(struct_liste_chainee *dimensions)
  814:     {
  815:         struct_objet        *s_table;
  816: 
  817:         unsigned long       i;
  818: 
  819:         if ((s_table = allocation(s_etat_processus, TBL)) == NULL)
  820:         {
  821:             return(NULL);
  822:         }
  823: 
  824:         (*((struct_tableau *) (*s_table).objet)).nombre_elements =
  825:                 (unsigned long) (*((integer8 *) (*(*dimensions).donnee).objet));
  826: 
  827:         dimensions = (*dimensions).suivant;
  828: 
  829:         if (((*((struct_tableau *) (*s_table).objet)).elements =
  830:                 malloc((*((struct_tableau *) (*s_table).objet))
  831:                 .nombre_elements * sizeof(struct_objet *))) == NULL)
  832:         {
  833:             return(NULL);
  834:         }
  835: 
  836:         if (dimensions == NULL)
  837:         {
  838:             for(i = 0; i < (*((struct_tableau *) (*s_table).objet))
  839:                     .nombre_elements; i++)
  840:             {
  841:                 if (((*((struct_tableau *) (*s_table).objet)).elements[i] =
  842:                         allocation(s_etat_processus, LST)) == NULL)
  843:                 {
  844:                     return(NULL);
  845:                 }
  846:             }
  847:         }
  848:         else
  849:         {
  850:             for(i = 0; i < (*((struct_tableau *) (*s_table).objet))
  851:                     .nombre_elements; i++)
  852:             {
  853:                 if (((*((struct_tableau *) (*s_table).objet)).elements[i] =
  854:                         creation_table(dimensions)) == NULL)
  855:                 {
  856:                     return(NULL);
  857:                 }
  858:             }
  859:         }
  860: 
  861:         return(s_table);
  862:     }
  863: 
  864:     (*s_etat_processus).erreur_execution = d_ex;
  865: 
  866:     if ((*s_etat_processus).affichage_arguments == 'Y')
  867:     {
  868:         printf("\n  CRTAB ");
  869: 
  870:         if ((*s_etat_processus).langue == 'F')
  871:         {
  872:             printf("(création d'une table régulière)\n\n");
  873:         }
  874:         else
  875:         {
  876:             printf("(create a regular table)\n\n");
  877:         }
  878: 
  879:         printf("    1: %s\n", d_LST);
  880:         printf("->  1: %s\n", d_TAB);
  881: 
  882:         return;
  883:     }
  884:     else if ((*s_etat_processus).test_instruction == 'Y')
  885:     {
  886:         (*s_etat_processus).nombre_arguments = -1;
  887:         return;
  888:     }
  889: 
  890:     if (test_cfsf(s_etat_processus, 31) == d_vrai)
  891:     {
  892:         if (empilement_pile_last(s_etat_processus, 1) == d_erreur)
  893:         {
  894:             return;
  895:         }
  896:     }
  897: 
  898:     if (depilement(s_etat_processus, &((*s_etat_processus).l_base_pile),
  899:             &s_objet_argument) == d_erreur)
  900:     {
  901:         (*s_etat_processus).erreur_execution = d_ex_manque_argument;
  902:         return;
  903:     }
  904: 
  905:     if ((*s_objet_argument).type == LST)
  906:     {
  907:         l_element_courant = (*s_objet_argument).objet;
  908: 
  909:         if (l_element_courant == NULL)
  910:         {
  911:             liberation(s_etat_processus, s_objet_argument);
  912: 
  913:             (*s_etat_processus).erreur_execution =
  914:                     d_ex_argument_invalide;
  915:             return;
  916:         }
  917: 
  918:         while(l_element_courant != NULL)
  919:         {
  920:             if ((*(*l_element_courant).donnee).type != INT)
  921:             {
  922:                 liberation(s_etat_processus, s_objet_argument);
  923: 
  924:                 (*s_etat_processus).erreur_execution =
  925:                         d_ex_erreur_type_argument;
  926:                 return;
  927:             }
  928: 
  929:             l_element_courant = (*l_element_courant).suivant;
  930:         }
  931: 
  932:         if ((s_objet_resultat =
  933:                 creation_table((*s_objet_argument).objet)) == NULL)
  934:         {
  935:             (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
  936:             return;
  937:         }
  938:     }
  939:     else
  940:     {
  941:         liberation(s_etat_processus, s_objet_argument);
  942: 
  943:         (*s_etat_processus).erreur_execution = d_ex_erreur_type_argument;
  944:         return;
  945:     }
  946: 
  947:     if (empilement(s_etat_processus, &((*s_etat_processus).l_base_pile),
  948:             s_objet_resultat) == d_erreur)
  949:     {
  950:         (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
  951:         return;
  952:     }
  953: 
  954:     liberation(s_etat_processus, s_objet_argument);
  955: 
  956:     return;
  957: }
  958: 
  959: // vim: ts=4

CVSweb interface <joel.bertrand@systella.fr>