File:  [local] / rpl / src / instructions_i3.c
Revision 1.1: download - view: text, annotated - select for diffs - revision graph
Tue Jan 26 15:22:45 2010 UTC (14 years, 3 months ago) by bertrand
Branches: MAIN
CVS tags: HEAD
Initial revision

    1: /*
    2: ================================================================================
    3:   RPL/2 (R) version 4.0.9
    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 'inquire'
   29: ================================================================================
   30:   Entrées :
   31: --------------------------------------------------------------------------------
   32:   Sorties :
   33: --------------------------------------------------------------------------------
   34:   Effets de bord : néant
   35: ================================================================================
   36: */
   37: 
   38: void
   39: instruction_inquire(struct_processus *s_etat_processus)
   40: {
   41:     file                        *fichier;
   42: 
   43:     logical1                    erreur;
   44:     logical1                    existence;
   45:     logical1                    ouverture;
   46: 
   47:     logical1                    fin_fichier;
   48: 
   49:     long                        position_courante;
   50: 
   51:     struct flock                lock;
   52: 
   53:     struct_objet                *s_objet_argument_1;
   54:     struct_objet                *s_objet_argument_2;
   55:     struct_objet                *s_objet_resultat;
   56: 
   57:     unsigned char               caractere;
   58:     unsigned char               *requete;
   59:     unsigned char               verrou;
   60: 
   61:     unsigned long               unite;
   62: 
   63:     (*s_etat_processus).erreur_execution = d_ex;
   64: 
   65:     if ((*s_etat_processus).affichage_arguments == 'Y')
   66:     {
   67:         printf("\n  INQUIRE ");
   68: 
   69:         if ((*s_etat_processus).langue == 'F')
   70:         {
   71:             printf("(caractéristiques d'un fichier)\n\n");
   72:         }
   73:         else
   74:         {
   75:             printf("(file properties)\n\n");
   76:         }
   77: 
   78:         printf("    2: %s, %s\n", d_FCH, d_CHN);
   79:         printf("    1: %s\n", d_CHN);
   80:         printf("->  1: %s, %s, %s\n\n", d_INT, d_CHN, d_LST);
   81: 
   82:         if ((*s_etat_processus).langue == 'F')
   83:         {
   84:             printf("  Requêtes par descripteur :\n\n");
   85:         }
   86:         else
   87:         {
   88:             printf("  Queries by descriptor:\n\n");
   89:         }
   90: 
   91:         printf("    END OF FILE    : %s (true/false)\n", d_INT);
   92:         printf("    ACCESS         : %s (SEQUENTIAL/DIRECT/KEYED)\n", d_CHN);
   93:         printf("    NAME           : %s\n", d_CHN);
   94:         printf("    FORMATTED      : %s (true/false)\n", d_INT);
   95:         printf("    KEY FIELD      : %s\n", d_INT);
   96:         printf("    PROTECTION     : %s (WRITEONLY/READONLY/READWRITE)\n\n",
   97:                 d_CHN);
   98: 
   99:         if ((*s_etat_processus).langue == 'F')
  100:         {
  101:             printf("  Requêtes par nom :\n\n");
  102:         }
  103:         else
  104:         {
  105:             printf("  Queries by name:\n\n");
  106:         }
  107: 
  108:         printf("    FORMAT         : %s\n", d_LST);
  109:         printf("    EXISTENCE      : %s (true/false)\n", d_INT);
  110:         printf("    LOCK           : %s (NONE/READ/WRITE)\n", d_CHN);
  111: 
  112:         return;
  113:     }
  114:     else if ((*s_etat_processus).test_instruction == 'Y')
  115:     {
  116:         (*s_etat_processus).nombre_arguments = -1;
  117:         return;
  118:     }
  119: 
  120:     if (test_cfsf(s_etat_processus, 31) == d_vrai)
  121:     {
  122:         if (empilement_pile_last(s_etat_processus, 2) == d_erreur)
  123:         {
  124:             return;
  125:         }
  126:     }
  127: 
  128:     if (depilement(s_etat_processus, &((*s_etat_processus).l_base_pile),
  129:             &s_objet_argument_1) == d_erreur)
  130:     {
  131:         (*s_etat_processus).erreur_execution = d_ex_manque_argument;
  132:         return;
  133:     }
  134: 
  135:     if (depilement(s_etat_processus, &((*s_etat_processus).l_base_pile),
  136:             &s_objet_argument_2) == d_erreur)
  137:     {
  138:         liberation(s_etat_processus, s_objet_argument_1);
  139: 
  140:         (*s_etat_processus).erreur_execution = d_ex_manque_argument;
  141:         return;
  142:     }
  143: 
  144:     if ((*s_objet_argument_1).type != CHN)
  145:     {
  146:         liberation(s_etat_processus, s_objet_argument_1);
  147:         liberation(s_etat_processus, s_objet_argument_2);
  148: 
  149:         (*s_etat_processus).erreur_execution = d_ex_erreur_type_argument;
  150:         return;
  151:     }
  152: 
  153:     if ((requete = conversion_majuscule((unsigned char *)
  154:             (*s_objet_argument_1).objet)) == NULL)
  155:     {
  156:         (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
  157:         return;
  158:     }
  159: 
  160:     if ((*s_objet_argument_2).type == FCH)
  161:     {
  162:         /*
  163:          * La question porte sur un fichier ouvert.
  164:          */
  165: 
  166:         if (strcmp(requete, "END OF FILE") == 0)
  167:         {
  168:             if ((*((struct_fichier *) (*s_objet_argument_2).objet)).acces
  169:                     != 'S')
  170:             {
  171:                 liberation(s_etat_processus, s_objet_argument_1);
  172:                 liberation(s_etat_processus, s_objet_argument_2);
  173: 
  174:                 free(requete);
  175: 
  176:                 (*s_etat_processus).erreur_execution =
  177:                         d_ex_erreur_requete_fichier;
  178:                 return;
  179:             }
  180: 
  181:             if ((s_objet_resultat = allocation(s_etat_processus, INT))
  182:                     == NULL)
  183:             {
  184:                 (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
  185:                 return;
  186:             }
  187: 
  188:             /*
  189:              * La fin du fichier renvoyée ne correspond pas à la fin physique
  190:              * du fichier mais à un défaut d'enregistrement.
  191:              */
  192: 
  193:             if ((fichier = descripteur_fichier(s_etat_processus,
  194:                     (struct_fichier *) (*s_objet_argument_2).objet)) == NULL)
  195:             {
  196:                 return;
  197:             }
  198: 
  199:             if ((position_courante = ftell(fichier)) == -1)
  200:             {
  201:                 (*s_etat_processus).erreur_systeme = d_es_erreur_fichier;
  202:                 return;
  203:             }
  204: 
  205:             fin_fichier = d_vrai;
  206: 
  207:             while(feof(fichier) == 0)
  208:             {
  209:                 if (fread(&caractere, sizeof(unsigned char), (size_t) 1,
  210:                         fichier) > 0)
  211:                 {
  212:                     if (caractere == '{')
  213:                     {
  214:                         fin_fichier = d_faux;
  215:                         break;
  216:                     }
  217:                 }
  218:             }
  219: 
  220:             if (fseek(fichier, position_courante, SEEK_SET) != 0)
  221:             {
  222:                 (*s_etat_processus).erreur_systeme = d_es_erreur_fichier;
  223:                 return;
  224:             }
  225: 
  226:             if (fin_fichier == d_faux)
  227:             {
  228:                 /*
  229:                  * Fichier à suivre
  230:                  */
  231: 
  232:                 (*((integer8 *) (*s_objet_resultat).objet)) = 0;
  233:             }
  234:             else
  235:             {
  236:                 /*
  237:                  * Fin de fichier
  238:                  */
  239: 
  240:                 (*((integer8 *) (*s_objet_resultat).objet)) = -1;
  241:             }
  242:         }
  243:         else if (strcmp(requete, "ACCESS") == 0)
  244:         {
  245:             if ((s_objet_resultat = allocation(s_etat_processus, CHN))
  246:                     == NULL)
  247:             {
  248:                 (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
  249:                 return;
  250:             }
  251: 
  252:             if ((*((struct_fichier *) (*s_objet_argument_2).objet)).acces
  253:                     == 'S')
  254:             {
  255:                 if (((*s_objet_resultat).objet = malloc(11 *
  256:                         sizeof(unsigned char))) == NULL)
  257:                 {
  258:                     (*s_etat_processus).erreur_systeme =
  259:                             d_es_allocation_memoire;
  260:                     return;
  261:                 }
  262: 
  263:                 strcpy((unsigned char *) (*s_objet_resultat).objet,
  264:                         "SEQUENTIAL");
  265:             }
  266:             else if ((*((struct_fichier *) (*s_objet_argument_2).objet)).acces
  267:                     == 'D')
  268:             {
  269:                 if (((*s_objet_resultat).objet = malloc(7 *
  270:                         sizeof(unsigned char))) == NULL)
  271:                 {
  272:                     (*s_etat_processus).erreur_systeme =
  273:                             d_es_allocation_memoire;
  274:                     return;
  275:                 }
  276: 
  277:                 strcpy((unsigned char *) (*s_objet_resultat).objet,
  278:                         "DIRECT");
  279:             }
  280:             else
  281:             {
  282:                 if (((*s_objet_resultat).objet = malloc(6 *
  283:                         sizeof(unsigned char))) == NULL)
  284:                 {
  285:                     (*s_etat_processus).erreur_systeme =
  286:                             d_es_allocation_memoire;
  287:                     return;
  288:                 }
  289: 
  290:                 strcpy((unsigned char *) (*s_objet_resultat).objet,
  291:                         "KEYED");
  292:             }
  293:         }
  294:         else if (strcmp(requete, "NAME") == 0)
  295:         {
  296:             if ((s_objet_resultat = allocation(s_etat_processus, CHN))
  297:                     == NULL)
  298:             {
  299:                 (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
  300:                 return;
  301:             }
  302: 
  303:             if (((*s_objet_resultat).objet = malloc(
  304:                     (strlen((*((struct_fichier *) (*s_objet_argument_2).objet))
  305:                     .nom) + 1) *
  306:                     sizeof(unsigned char))) == NULL)
  307:             {
  308:                 (*s_etat_processus).erreur_systeme =
  309:                         d_es_allocation_memoire;
  310:                 return;
  311:             }
  312: 
  313:             strcpy((unsigned char *) (*s_objet_resultat).objet,
  314:                     (*((struct_fichier *) (*s_objet_argument_2).objet)).nom);
  315:         }
  316:         else if (strcmp(requete, "FORMATTED") == 0)
  317:         {
  318:             if ((s_objet_resultat = allocation(s_etat_processus, INT))
  319:                     == NULL)
  320:             {
  321:                 (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
  322:                 return;
  323:             }
  324: 
  325:             (*((integer8 *) (*s_objet_resultat).objet)) =
  326:                     ((*((struct_fichier *) (*s_objet_argument_2).objet)).binaire
  327:                     == 'N') ? -1 : 0;
  328:         }
  329:         else if (strcmp(requete, "KEY FIELD") == 0)
  330:         {
  331:             if ((*((struct_fichier *) (*s_objet_argument_2).objet))
  332:                     .acces == 'S')
  333:             {
  334:                 free(requete);
  335: 
  336:                 liberation(s_etat_processus, s_objet_argument_1);
  337:                 liberation(s_etat_processus, s_objet_argument_2);
  338: 
  339:                 (*s_etat_processus).erreur_execution =
  340:                         d_ex_erreur_requete_fichier;
  341:                 return;
  342:             }
  343: 
  344:             if ((s_objet_resultat = allocation(s_etat_processus, INT))
  345:                     == NULL)
  346:             {
  347:                 (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
  348:                 return;
  349:             }
  350: 
  351:             (*((integer8 *) (*s_objet_resultat).objet)) =
  352:                     (*((struct_fichier *) (*s_objet_argument_2).objet))
  353:                     .position_clef;
  354:         }
  355:         else if (strcmp(requete, "PROTECTION") == 0)
  356:         {
  357:             if ((s_objet_resultat = allocation(s_etat_processus, CHN))
  358:                     == NULL)
  359:             {
  360:                 (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
  361:                 return;
  362:             }
  363: 
  364:             if ((*((struct_fichier *) (*s_objet_argument_2).objet)).protection
  365:                     == 'W')
  366:             {
  367:                 if (((*s_objet_resultat).objet = malloc(10 *
  368:                         sizeof(unsigned char))) == NULL)
  369:                 {
  370:                     (*s_etat_processus).erreur_systeme =
  371:                             d_es_allocation_memoire;
  372:                     return;
  373:                 }
  374: 
  375:                 strcpy((unsigned char *) (*s_objet_argument_2).objet,
  376:                         "WRITEONLY");
  377:             }
  378:             else if ((*((struct_fichier *) (*s_objet_argument_2).objet)).acces
  379:                     == 'R')
  380:             {
  381:                 if (((*s_objet_resultat).objet = malloc(9 *
  382:                         sizeof(unsigned char))) == NULL)
  383:                 {
  384:                     (*s_etat_processus).erreur_systeme =
  385:                             d_es_allocation_memoire;
  386:                     return;
  387:                 }
  388: 
  389:                 strcpy((unsigned char *) (*s_objet_argument_2).objet,
  390:                         "READONLY");
  391:             }
  392:             else
  393:             {
  394:                 if (((*s_objet_resultat).objet = malloc(10 *
  395:                         sizeof(unsigned char))) == NULL)
  396:                 {
  397:                     (*s_etat_processus).erreur_systeme =
  398:                             d_es_allocation_memoire;
  399:                     return;
  400:                 }
  401: 
  402:                 strcpy((unsigned char *) (*s_objet_resultat).objet,
  403:                         "READWRITE");
  404:             }
  405:         }
  406:         else if (strcmp(requete, "FORMAT") == 0)
  407:         {
  408:             if ((s_objet_resultat = copie_objet(s_etat_processus,
  409:                     (*((struct_fichier *) (*s_objet_argument_2).objet)).format,
  410:                     'O')) == NULL)
  411:             {
  412:                 (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
  413:                 return;
  414:             }
  415:         }
  416:         else
  417:         {
  418:             free(requete);
  419: 
  420:             liberation(s_etat_processus, s_objet_argument_1);
  421:             liberation(s_etat_processus, s_objet_argument_2);
  422: 
  423:             (*s_etat_processus).erreur_execution = d_ex_erreur_requete_fichier;
  424:             return;
  425:         }
  426:     }
  427:     else if ((*s_objet_argument_2).type == CHN)
  428:     {
  429:         /*
  430:          * La question porte sur un fichier fermé.
  431:          */
  432: 
  433:         if (strcmp(requete, "EXISTENCE") == 0)
  434:         {
  435:             erreur = caracteristiques_fichier(s_etat_processus,
  436:                     (unsigned char *) (*s_objet_argument_2).objet,
  437:                     &existence, &ouverture, &unite);
  438: 
  439:             if (erreur != d_absence_erreur)
  440:             {
  441:                 free(requete);
  442: 
  443:                 liberation(s_etat_processus, s_objet_argument_1);
  444:                 liberation(s_etat_processus, s_objet_argument_2);
  445: 
  446:                 (*s_etat_processus).erreur_execution =
  447:                         d_ex_erreur_acces_fichier;
  448:                 return;
  449:             }
  450: 
  451:             if ((s_objet_resultat = allocation(s_etat_processus, INT))
  452:                     == NULL)
  453:             {
  454:                 (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
  455:                 return;
  456:             }
  457: 
  458:             if (existence == d_faux)
  459:             {
  460:                 /*
  461:                  * Fichier inexistant
  462:                  */
  463: 
  464:                 (*((integer8 *) (*s_objet_resultat).objet)) = 0;
  465:             }
  466:             else
  467:             {
  468:                 /*
  469:                  * Fichier existant
  470:                  */
  471: 
  472:                 (*((integer8 *) (*s_objet_resultat).objet)) = -1;
  473:             }
  474:         }
  475:         else if (strcmp(requete, "LOCK") == 0)
  476:         {
  477:             erreur = caracteristiques_fichier(s_etat_processus,
  478:                     (unsigned char *) (*s_objet_argument_2).objet,
  479:                     &existence, &ouverture, &unite);
  480: 
  481:             if (erreur != d_absence_erreur)
  482:             {
  483:                 free(requete);
  484: 
  485:                 liberation(s_etat_processus, s_objet_argument_1);
  486:                 liberation(s_etat_processus, s_objet_argument_2);
  487: 
  488:                 (*s_etat_processus).erreur_execution =
  489:                         d_ex_erreur_acces_fichier;
  490:                 return;
  491:             }
  492: 
  493:             if ((s_objet_resultat = allocation(s_etat_processus, CHN))
  494:                     == NULL)
  495:             {
  496:                 (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
  497:                 return;
  498:             }
  499: 
  500:             if (existence == d_faux)
  501:             {
  502:                 /*
  503:                  * Fichier inexistant
  504:                  */
  505: 
  506:                 free(requete);
  507: 
  508:                 liberation(s_etat_processus, s_objet_argument_1);
  509:                 liberation(s_etat_processus, s_objet_argument_2);
  510:                 liberation(s_etat_processus, s_objet_resultat);
  511: 
  512:                 (*s_etat_processus).erreur_execution =
  513:                         d_ex_erreur_acces_fichier;
  514:                 return;
  515:             }
  516:             else
  517:             {
  518:                 /*
  519:                  * Fichier existant
  520:                  */
  521: 
  522:                 if ((fichier = fopen((unsigned char *)
  523:                         (*s_objet_argument_2).objet, "r+")) == NULL)
  524:                 {
  525:                     free(requete);
  526: 
  527:                     liberation(s_etat_processus, s_objet_argument_1);
  528:                     liberation(s_etat_processus, s_objet_argument_2);
  529:                     liberation(s_etat_processus, s_objet_resultat);
  530: 
  531:                     (*s_etat_processus).erreur_execution =
  532:                             d_ex_erreur_acces_fichier;
  533:                     return;
  534:                 }
  535: 
  536:                 lock.l_whence = SEEK_SET;
  537:                 lock.l_start = 0;
  538:                 lock.l_len = 0;
  539:                 lock.l_pid = getpid();
  540:                 lock.l_type = F_RDLCK;
  541: 
  542:                 if (fcntl(fileno(fichier), F_GETLK, &lock) == -1)
  543:                 {
  544:                     if (fclose(fichier) != 0)
  545:                     {
  546:                         free(requete);
  547: 
  548:                         liberation(s_etat_processus, s_objet_argument_1);
  549:                         liberation(s_etat_processus, s_objet_argument_2);
  550:                         liberation(s_etat_processus, s_objet_resultat);
  551: 
  552:                         (*s_etat_processus).erreur_systeme =
  553:                                 d_es_erreur_fichier;
  554:                         return;
  555:                     }
  556: 
  557:                     free(requete);
  558: 
  559:                     liberation(s_etat_processus, s_objet_argument_1);
  560:                     liberation(s_etat_processus, s_objet_argument_2);
  561:                     liberation(s_etat_processus, s_objet_resultat);
  562: 
  563:                     (*s_etat_processus).erreur_systeme =
  564:                             d_es_erreur_fichier;
  565:                     return;
  566:                 }
  567: 
  568:                 if (lock.l_type == F_UNLCK)
  569:                 {
  570:                     verrou = 'N';
  571:                 }
  572:                 else
  573:                 {
  574:                     verrou = 'R';
  575:                 }
  576: 
  577:                 if (verrou == 'N')
  578:                 {
  579:                     lock.l_type = F_WRLCK;
  580: 
  581:                     if (fcntl(fileno(fichier), F_GETLK, &lock) == -1)
  582:                     {
  583:                         if (fclose(fichier) != 0)
  584:                         {
  585:                             free(requete);
  586: 
  587:                             liberation(s_etat_processus, s_objet_argument_1);
  588:                             liberation(s_etat_processus, s_objet_argument_2);
  589:                             liberation(s_etat_processus, s_objet_resultat);
  590: 
  591:                             (*s_etat_processus).erreur_systeme =
  592:                                     d_es_erreur_fichier;
  593:                             return;
  594:                         }
  595: 
  596:                         free(requete);
  597: 
  598:                         liberation(s_etat_processus, s_objet_argument_1);
  599:                         liberation(s_etat_processus, s_objet_argument_2);
  600:                         liberation(s_etat_processus, s_objet_resultat);
  601: 
  602:                         (*s_etat_processus).erreur_systeme =
  603:                                 d_es_erreur_fichier;
  604:                         return;
  605:                     }
  606: 
  607:                     if (lock.l_type == F_UNLCK)
  608:                     {
  609:                         verrou = 'N';
  610:                     }
  611:                     else
  612:                     {
  613:                         verrou = 'W';
  614:                     }
  615:                 }
  616: 
  617:                 switch(verrou)
  618:                 {
  619:                     case 'N' :
  620:                     {
  621:                         if (((*s_objet_resultat).objet =
  622:                                 malloc(5 * sizeof(unsigned char))) == NULL)
  623:                         {
  624:                             (*s_etat_processus).erreur_systeme =
  625:                                     d_es_allocation_memoire;
  626:                             return;
  627:                         }
  628: 
  629:                         strcpy((unsigned char *) (*s_objet_resultat).objet,
  630:                                 "NONE");
  631: 
  632:                         break;
  633:                     }
  634: 
  635:                     case 'R' :
  636:                     {
  637:                         if (((*s_objet_resultat).objet =
  638:                                 malloc(5 * sizeof(unsigned char))) == NULL)
  639:                         {
  640:                             (*s_etat_processus).erreur_systeme =
  641:                                     d_es_allocation_memoire;
  642:                             return;
  643:                         }
  644: 
  645:                         strcpy((unsigned char *) (*s_objet_resultat).objet,
  646:                                 "READ");
  647: 
  648:                         break;
  649:                     }
  650: 
  651:                     case 'W' :
  652:                     {
  653:                         if (((*s_objet_resultat).objet =
  654:                                 malloc(6 * sizeof(unsigned char))) == NULL)
  655:                         {
  656:                             (*s_etat_processus).erreur_systeme =
  657:                                     d_es_allocation_memoire;
  658:                             return;
  659:                         }
  660: 
  661:                         strcpy((unsigned char *) (*s_objet_resultat).objet,
  662:                                 "WRITE");
  663: 
  664:                         break;
  665:                     }
  666:                 }
  667: 
  668:                 if (fclose(fichier) != 0)
  669:                 {
  670:                     free(requete);
  671: 
  672:                     liberation(s_etat_processus, s_objet_argument_1);
  673:                     liberation(s_etat_processus, s_objet_argument_2);
  674:                     liberation(s_etat_processus, s_objet_resultat);
  675: 
  676:                     (*s_etat_processus).erreur_systeme = d_es_erreur_fichier;
  677:                     return;
  678:                 }
  679:             }
  680:         }
  681:         else
  682:         {
  683:             free(requete);
  684: 
  685:             liberation(s_etat_processus, s_objet_argument_1);
  686:             liberation(s_etat_processus, s_objet_argument_2);
  687: 
  688:             (*s_etat_processus).erreur_execution = d_ex_erreur_requete_fichier;
  689:             return;
  690:         }
  691:     }
  692:     else
  693:     {
  694:         free(requete);
  695: 
  696:         liberation(s_etat_processus, s_objet_argument_1);
  697:         liberation(s_etat_processus, s_objet_argument_2);
  698: 
  699:         (*s_etat_processus).erreur_execution = d_ex_erreur_type_argument;
  700:         return;
  701:     }
  702: 
  703:     free(requete);
  704: 
  705:     liberation(s_etat_processus, s_objet_argument_1);
  706:     liberation(s_etat_processus, s_objet_argument_2);
  707: 
  708:     if (empilement(s_etat_processus, &((*s_etat_processus).l_base_pile),
  709:             s_objet_resultat) == d_erreur)
  710:     {
  711:         return;
  712:     }
  713: 
  714:     return;
  715: }
  716: 
  717: 
  718: /*
  719: ================================================================================
  720:   Fonction 'IDFT'
  721: ================================================================================
  722:   Entrées : structure processus
  723: --------------------------------------------------------------------------------
  724:   Sorties :
  725: --------------------------------------------------------------------------------
  726:   Effets de bord : néant
  727: ================================================================================
  728: */
  729: 
  730: void
  731: instruction_idft(struct_processus *s_etat_processus)
  732: {
  733:     integer4                    erreur;
  734:     integer4                    inverse;
  735:     integer4                    nombre_colonnes;
  736:     integer4                    nombre_lignes;
  737: 
  738:     logical1                    presence_longueur_dft;
  739: 
  740:     long                        longueur_dft_signee;
  741: 
  742:     struct_complexe16           *matrice_f77;
  743: 
  744:     struct_objet                *s_objet_argument;
  745:     struct_objet                *s_objet_longueur_dft;
  746:     struct_objet                *s_objet_resultat;
  747: 
  748:     unsigned long               i;
  749:     unsigned long               j;
  750:     unsigned long               k;
  751:     unsigned long               longueur_dft;
  752: 
  753:     (*s_etat_processus).erreur_execution = d_ex;
  754: 
  755:     if ((*s_etat_processus).affichage_arguments == 'Y')
  756:     {
  757:         printf("\n  IDFT ");
  758: 
  759:         if ((*s_etat_processus).langue == 'F')
  760:         {
  761:             printf("(transformée de Fourier inverse discrète)\n\n");
  762:         }
  763:         else
  764:         {
  765:             printf("(inverse of discrete Fourier transform)\n\n");
  766:         }
  767: 
  768:         printf("    1: %s, %s, %s\n", d_VIN, d_VRL, d_VCX);
  769:         printf("->  1: %s\n\n", d_VCX);
  770: 
  771:         printf("    2: %s, %s, %s\n", d_VIN, d_VRL, d_VCX);
  772:         printf("    1: %s\n", d_INT);
  773:         printf("->  1: %s\n\n", d_VCX);
  774: 
  775:         printf("    1: %s, %s, %s\n", d_MIN, d_MRL, d_MCX);
  776:         printf("->  1: %s\n\n", d_VCX);
  777: 
  778:         printf("    2: %s, %s, %s\n", d_MIN, d_MRL, d_MCX);
  779:         printf("    1: %s\n", d_INT);
  780:         printf("->  1: %s\n", d_MCX);
  781: 
  782:         return;
  783:     }
  784:     else if ((*s_etat_processus).test_instruction == 'Y')
  785:     {
  786:         (*s_etat_processus).nombre_arguments = -1;
  787:         return;
  788:     }
  789: 
  790:     /*
  791:      * Il est possible d'imposer une longueur de DFT au premier niveau
  792:      * de la pile.
  793:      */
  794: 
  795:     if ((*s_etat_processus).l_base_pile == NULL)
  796:     {
  797:         (*s_etat_processus).erreur_execution = d_ex_manque_argument;
  798:         return;
  799:     }
  800: 
  801:     if ((*(*(*s_etat_processus).l_base_pile).donnee).type == INT)
  802:     {
  803:         presence_longueur_dft = d_vrai;
  804: 
  805:         if (test_cfsf(s_etat_processus, 31) == d_vrai)
  806:         {
  807:             if (empilement_pile_last(s_etat_processus, 2) == d_erreur)
  808:             {
  809:                 return;
  810:             }
  811:         }
  812: 
  813:         if (depilement(s_etat_processus, &((*s_etat_processus).l_base_pile),
  814:                 &s_objet_longueur_dft) == d_erreur)
  815:         {
  816:             (*s_etat_processus).erreur_execution = d_ex_manque_argument;
  817:             return;
  818:         }
  819: 
  820:         longueur_dft_signee = (*((integer8 *) (*s_objet_longueur_dft).objet));
  821: 
  822:         liberation(s_etat_processus, s_objet_longueur_dft);
  823: 
  824:         if (longueur_dft_signee <= 0)
  825:         {
  826:             (*s_etat_processus).erreur_execution = d_ex_longueur_dft;
  827:             return;
  828:         }
  829: 
  830:         longueur_dft = longueur_dft_signee;
  831:     }
  832:     else
  833:     {
  834:         presence_longueur_dft = d_faux;
  835:         longueur_dft = 0;
  836: 
  837:         if (test_cfsf(s_etat_processus, 31) == d_vrai)
  838:         {
  839:             if (empilement_pile_last(s_etat_processus, 1) == d_erreur)
  840:             {
  841:                 return;
  842:             }
  843:         }
  844:     }
  845: 
  846:     if (depilement(s_etat_processus, &((*s_etat_processus).l_base_pile),
  847:             &s_objet_argument) == d_erreur)
  848:     {
  849:         (*s_etat_processus).erreur_execution = d_ex_manque_argument;
  850:         return;
  851:     }
  852: 
  853: /*
  854: --------------------------------------------------------------------------------
  855:   Vecteur
  856: --------------------------------------------------------------------------------
  857: */
  858: 
  859:     if (((*s_objet_argument).type == VIN) ||
  860:             ((*s_objet_argument).type == VRL) ||
  861:             ((*s_objet_argument).type == VCX))
  862:     {
  863:         if (presence_longueur_dft == d_faux)
  864:         {
  865:             longueur_dft = (*((struct_vecteur *)
  866:                     (*s_objet_argument).objet)).taille;
  867:         }
  868: 
  869:         if ((matrice_f77 = malloc(longueur_dft *
  870:                 sizeof(struct_complexe16))) == NULL)
  871:         {
  872:             (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
  873:             return;
  874:         }
  875: 
  876:         if ((*s_objet_argument).type == VIN)
  877:         {
  878:             for(i = 0; i < (*((struct_vecteur *) (*s_objet_argument).objet))
  879:                     .taille; i++)
  880:             {
  881:                 matrice_f77[i].partie_reelle = (real8) ((integer8 *)
  882:                         (*((struct_vecteur *) (*s_objet_argument).objet))
  883:                         .tableau)[i];
  884:                 matrice_f77[i].partie_imaginaire = (real8) 0;
  885:             }
  886:         }
  887:         else if ((*s_objet_argument).type == VRL)
  888:         {
  889:             for(i = 0; i < (*((struct_vecteur *) (*s_objet_argument).objet))
  890:                     .taille; i++)
  891:             {
  892:                 matrice_f77[i].partie_reelle = ((real8 *)
  893:                         (*((struct_vecteur *) (*s_objet_argument).objet))
  894:                         .tableau)[i];
  895:                 matrice_f77[i].partie_imaginaire = (real8) 0;
  896:             }
  897:         }
  898:         else
  899:         {
  900:             for(i = 0; i < (*((struct_vecteur *) (*s_objet_argument).objet))
  901:                     .taille; i++)
  902:             {
  903:                 matrice_f77[i].partie_reelle = ((struct_complexe16 *)
  904:                         (*((struct_vecteur *) (*s_objet_argument).objet))
  905:                         .tableau)[i].partie_reelle;
  906:                 matrice_f77[i].partie_imaginaire = ((struct_complexe16 *)
  907:                         (*((struct_vecteur *) (*s_objet_argument).objet))
  908:                         .tableau)[i].partie_imaginaire;
  909:             }
  910:         }
  911: 
  912:         for(; i < longueur_dft; i++)
  913:         {
  914:                 matrice_f77[i].partie_reelle = (real8) 0;
  915:                 matrice_f77[i].partie_imaginaire = (real8) 0;
  916:         }
  917: 
  918:         nombre_lignes = 1;
  919:         nombre_colonnes = longueur_dft;
  920:         inverse = -1;
  921: 
  922:         dft(matrice_f77, &nombre_lignes, &nombre_colonnes, &inverse, &erreur);
  923: 
  924:         if (erreur != 0)
  925:         {
  926:             liberation(s_etat_processus, s_objet_argument);
  927:             free(matrice_f77);
  928: 
  929:             (*s_etat_processus).erreur_execution = d_ex_longueur_dft;
  930:             return;
  931:         }
  932: 
  933:         if ((s_objet_resultat = allocation(s_etat_processus, VCX)) == NULL)
  934:         {
  935:             (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
  936:             return;
  937:         }
  938: 
  939:         (*((struct_vecteur *) (*s_objet_resultat).objet)).taille = longueur_dft;
  940:         (*((struct_vecteur *) (*s_objet_resultat).objet)).tableau = matrice_f77;
  941:     }
  942: 
  943: /*
  944: --------------------------------------------------------------------------------
  945:   Matrice
  946: --------------------------------------------------------------------------------
  947: */
  948: 
  949:     else if (((*s_objet_argument).type == MIN) ||
  950:             ((*s_objet_argument).type == MRL) ||
  951:             ((*s_objet_argument).type == MCX))
  952:     {
  953:         if (presence_longueur_dft == d_faux)
  954:         {
  955:             longueur_dft = (*((struct_matrice *)
  956:                     (*s_objet_argument).objet)).nombre_colonnes;
  957:         }
  958: 
  959:         if ((matrice_f77 = malloc(longueur_dft *
  960:                 (*((struct_matrice *) (*s_objet_argument).objet))
  961:                 .nombre_lignes * sizeof(struct_complexe16))) == NULL)
  962:         {
  963:             (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
  964:             return;
  965:         }
  966: 
  967:         if ((*s_objet_argument).type == MIN)
  968:         {
  969:             for(k = 0, j = 0; j < (*((struct_matrice *) (*s_objet_argument)
  970:                     .objet)).nombre_lignes; j++)
  971:             {
  972:                 for(i = 0; i < (*((struct_matrice *) (*s_objet_argument)
  973:                         .objet)).nombre_colonnes; i++)
  974:                 {
  975:                     matrice_f77[k].partie_reelle = (real8) ((integer8 **)
  976:                             (*((struct_matrice *) (*s_objet_argument).objet))
  977:                             .tableau)[j][i];
  978:                     matrice_f77[k++].partie_imaginaire = (real8) 0;
  979:                 }
  980:             }
  981: 
  982:             for(; k < longueur_dft * (*((struct_matrice *) (*s_objet_argument)
  983:                     .objet)).nombre_lignes; k++)
  984:             {
  985:                 matrice_f77[k].partie_reelle = (real8) 0;
  986:                 matrice_f77[k].partie_imaginaire = (real8) 0;
  987:             }
  988:         }
  989:         else if ((*s_objet_argument).type == MRL)
  990:         {
  991:             for(k = 0, j = 0; j < (*((struct_matrice *) (*s_objet_argument)
  992:                     .objet)).nombre_lignes; j++)
  993:             {
  994:                 for(i = 0; i < (*((struct_matrice *) (*s_objet_argument)
  995:                         .objet)).nombre_colonnes; i++)
  996:                 {
  997:                     matrice_f77[k].partie_reelle = ((real8 **)
  998:                             (*((struct_matrice *) (*s_objet_argument).objet))
  999:                             .tableau)[j][i];
 1000:                     matrice_f77[k++].partie_imaginaire = (real8) 0;
 1001:                 }
 1002:             }
 1003: 
 1004:             for(; k < longueur_dft * (*((struct_matrice *) (*s_objet_argument)
 1005:                     .objet)).nombre_lignes; k++)
 1006:             {
 1007:                 matrice_f77[k].partie_reelle = (real8) 0;
 1008:                 matrice_f77[k].partie_imaginaire = (real8) 0;
 1009:             }
 1010:         }
 1011:         else
 1012:         {
 1013:             for(k = 0, j = 0; j < (*((struct_matrice *) (*s_objet_argument)
 1014:                     .objet)).nombre_lignes; j++)
 1015:             {
 1016:                 for(i = 0; i < (*((struct_matrice *) (*s_objet_argument)
 1017:                         .objet)).nombre_colonnes; i++)
 1018:                 {
 1019:                     matrice_f77[k].partie_reelle = ((struct_complexe16 **)
 1020:                             (*((struct_matrice *) (*s_objet_argument).objet))
 1021:                             .tableau)[j][i].partie_reelle;
 1022:                     matrice_f77[k++].partie_imaginaire =
 1023:                             ((struct_complexe16 **) (*((struct_matrice *)
 1024:                             (*s_objet_argument).objet)).tableau)[j][i]
 1025:                             .partie_imaginaire;
 1026:                 }
 1027:             }
 1028: 
 1029:             for(; k < longueur_dft * (*((struct_matrice *) (*s_objet_argument)
 1030:                     .objet)).nombre_lignes; k++)
 1031:             {
 1032:                 matrice_f77[k].partie_reelle = (real8) 0;
 1033:                 matrice_f77[k].partie_imaginaire = (real8) 0;
 1034:             }
 1035:         }
 1036: 
 1037:         nombre_lignes = (*((struct_matrice *) (*s_objet_argument).objet))
 1038:                 .nombre_lignes;
 1039:         nombre_colonnes = longueur_dft;
 1040:         inverse = -1;
 1041: 
 1042:         dft(matrice_f77, &nombre_lignes, &nombre_colonnes, &inverse, &erreur);
 1043: 
 1044:         if (erreur != 0)
 1045:         {
 1046:             liberation(s_etat_processus, s_objet_argument);
 1047:             free(matrice_f77);
 1048: 
 1049:             (*s_etat_processus).erreur_execution = d_ex_longueur_dft;
 1050:             return;
 1051:         }
 1052: 
 1053:         if ((s_objet_resultat = allocation(s_etat_processus, MCX)) == NULL)
 1054:         {
 1055:             (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
 1056:             return;
 1057:         }
 1058: 
 1059:         (*((struct_matrice *) (*s_objet_resultat).objet)).nombre_lignes =
 1060:                 (*((struct_matrice *) (*s_objet_argument).objet))
 1061:                 .nombre_lignes;
 1062:         (*((struct_matrice *) (*s_objet_resultat).objet)).nombre_colonnes =
 1063:                 longueur_dft;
 1064: 
 1065:         if (((*((struct_matrice *) (*s_objet_resultat).objet)).tableau =
 1066:                 malloc((*((struct_matrice *) (*s_objet_resultat).objet))
 1067:                 .nombre_lignes * sizeof(struct_complexe16 *))) == NULL)
 1068:         {
 1069:             (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
 1070:             return;
 1071:         }
 1072: 
 1073:         for(i = 0; i < (*((struct_matrice *) (*s_objet_resultat).objet))
 1074:                 .nombre_lignes; i++)
 1075:         {
 1076:             if ((((struct_complexe16 **) (*((struct_matrice *)
 1077:                     (*s_objet_resultat).objet)).tableau)[i] =
 1078:                     malloc((*((struct_matrice *)
 1079:                     (*s_objet_resultat).objet)).nombre_colonnes *
 1080:                     sizeof(struct_complexe16))) == NULL)
 1081:             {
 1082:                 (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
 1083:                 return;
 1084:             }
 1085:         }
 1086: 
 1087:         for(k = 0, j = 0; j < (*((struct_matrice *) (*s_objet_resultat).objet))
 1088:                 .nombre_lignes; j++)
 1089:         {
 1090:             for(i = 0; i < (*((struct_matrice *) (*s_objet_resultat).objet))
 1091:                     .nombre_colonnes; i++)
 1092:             {
 1093:                 ((struct_complexe16 **) (*((struct_matrice *)
 1094:                         (*s_objet_resultat).objet)).tableau)[j][i]
 1095:                         .partie_reelle = matrice_f77[k].partie_reelle;
 1096:                 ((struct_complexe16 **) (*((struct_matrice *)
 1097:                         (*s_objet_resultat).objet)).tableau)[j][i]
 1098:                         .partie_imaginaire = matrice_f77[k++].partie_imaginaire;
 1099:             }
 1100:         }
 1101: 
 1102:         free(matrice_f77);
 1103:     }
 1104: 
 1105: /*
 1106: --------------------------------------------------------------------------------
 1107:   Calcul de DFT impossible
 1108: --------------------------------------------------------------------------------
 1109: */
 1110: 
 1111:     else
 1112:     {
 1113:         liberation(s_etat_processus, s_objet_argument);
 1114: 
 1115:         (*s_etat_processus).erreur_execution = d_ex_erreur_type_argument;
 1116:         return;
 1117:     }
 1118: 
 1119:     liberation(s_etat_processus, s_objet_argument);
 1120: 
 1121:     if (empilement(s_etat_processus, &((*s_etat_processus).l_base_pile),
 1122:             s_objet_resultat) == d_erreur)
 1123:     {
 1124:         return;
 1125:     }
 1126: 
 1127:     return;
 1128: }
 1129: 
 1130: 
 1131: /*
 1132: ================================================================================
 1133:   Fonction 'ISWI'
 1134: ================================================================================
 1135:   Entrées : structure processus
 1136: --------------------------------------------------------------------------------
 1137:   Sorties :
 1138: --------------------------------------------------------------------------------
 1139:   Effets de bord : néant
 1140: ================================================================================
 1141: */
 1142: 
 1143: void
 1144: instruction_iswi(struct_processus *s_etat_processus)
 1145: {
 1146:     (*s_etat_processus).erreur_execution = d_ex;
 1147: 
 1148:     if ((*s_etat_processus).affichage_arguments == 'Y')
 1149:     {
 1150:         printf("\n  ISWI ");
 1151: 
 1152:         if ((*s_etat_processus).langue == 'F')
 1153:         {
 1154:             printf("(autorise le traitement interruptif des interruptions)"
 1155:                     "\n\n");
 1156:             printf("  Aucun argument\n");
 1157:         }
 1158:         else
 1159:         {
 1160:             printf("(authorize interrupts called from interrupts)\n\n");
 1161:             printf("  No argument\n");
 1162:         }
 1163: 
 1164:         return;
 1165:     }
 1166:     else if ((*s_etat_processus).test_instruction == 'Y')
 1167:     {
 1168:         (*s_etat_processus).nombre_arguments = -1;
 1169:         return;
 1170:     }
 1171: 
 1172:     if (test_cfsf(s_etat_processus, 31) == d_vrai)
 1173:     {
 1174:         if (empilement_pile_last(s_etat_processus, 0) == d_erreur)
 1175:         {
 1176:             return;
 1177:         }
 1178:     }
 1179: 
 1180:     if ((*s_etat_processus).traitement_interruption == 'Y')
 1181:     {
 1182:         (*s_etat_processus).traitement_interruption = 'N';
 1183:     }
 1184:     else
 1185:     {
 1186:         (*s_etat_processus).erreur_execution = d_ex_iswi_hors_interruption;
 1187:     }
 1188: 
 1189:     return;
 1190: }
 1191: 
 1192: 
 1193: /*
 1194: ================================================================================
 1195:   Fonction 'ITRACE'
 1196: ================================================================================
 1197:   Entrées : structure processus
 1198: --------------------------------------------------------------------------------
 1199:   Sorties :
 1200: --------------------------------------------------------------------------------
 1201:   Effets de bord : néant
 1202: ================================================================================
 1203: */
 1204: 
 1205: void
 1206: instruction_itrace(struct_processus *s_etat_processus)
 1207: {
 1208:     struct_objet                *s_objet_argument;
 1209: 
 1210:     (*s_etat_processus).erreur_execution = d_ex;
 1211: 
 1212:     if ((*s_etat_processus).affichage_arguments == 'Y')
 1213:     {
 1214:         printf("\n  ITRACE ");
 1215: 
 1216:         if ((*s_etat_processus).langue == 'F')
 1217:         {
 1218:             printf("(trace interne)"
 1219:                     "\n\n");
 1220:         }
 1221:         else
 1222:         {
 1223:             printf("(internal trace)\n\n");
 1224:         }
 1225: 
 1226:         printf("    1: %s\n\n", d_BIN);
 1227: 
 1228:         if ((*s_etat_processus).langue == 'F')
 1229:         {
 1230:             printf("  Drapeaux :\n\n");
 1231:         }
 1232:         else
 1233:         {
 1234:             printf("  Flags:\n\n");
 1235:         }
 1236: 
 1237:         printf("    0000    : none\n");
 1238:         printf("    0001    : user stack\n");
 1239:         printf("    0002    : system stack\n");
 1240:         printf("    0004    : function calls\n");
 1241:         printf("    0008    : process management\n");
 1242:         printf("    0010    : analyze\n");
 1243:         printf("    0020    : fuse management\n");
 1244:         printf("    0040    : variables management\n");
 1245:         printf("    0080    : intrinsic functions\n");
 1246:         printf("    0100    : execution levels\n");
 1247:         printf("    0200    : algebraic to RPN conversion\n");
 1248:         printf("    0400    : interruptions supervision\n");
 1249:         printf("    0800    : signals\n");
 1250: 
 1251:         return;
 1252:     }
 1253:     else if ((*s_etat_processus).test_instruction == 'Y')
 1254:     {
 1255:         (*s_etat_processus).nombre_arguments = -1;
 1256:         return;
 1257:     }
 1258: 
 1259:     if (test_cfsf(s_etat_processus, 31) == d_vrai)
 1260:     {
 1261:         if (empilement_pile_last(s_etat_processus, 1) == d_erreur)
 1262:         {
 1263:             return;
 1264:         }
 1265:     }
 1266: 
 1267:     if (depilement(s_etat_processus, &((*s_etat_processus).l_base_pile),
 1268:             &s_objet_argument) == d_erreur)
 1269:     {
 1270:         (*s_etat_processus).erreur_execution = d_ex_manque_argument;
 1271:         return;
 1272:     }
 1273: 
 1274:     if ((*s_objet_argument).type == BIN)
 1275:     {
 1276:         if ((*((logical8 *) (*s_objet_argument).objet)) == 0)
 1277:         {
 1278:             (*s_etat_processus).debug = d_faux;
 1279:             (*s_etat_processus).type_debug = 0;
 1280:         }
 1281:         else
 1282:         {
 1283:             (*s_etat_processus).debug = d_vrai;
 1284:             (*s_etat_processus).type_debug = (*((logical8 *)
 1285:                     (*s_objet_argument).objet));
 1286:         }
 1287:     }
 1288:     else
 1289:     {
 1290:         (*s_etat_processus).erreur_execution = d_ex_erreur_type_argument;
 1291:         liberation(s_etat_processus, s_objet_argument);
 1292:     }
 1293: 
 1294:     return;
 1295: }
 1296: 
 1297: 
 1298: // vim: ts=4

CVSweb interface <joel.bertrand@systella.fr>