File:  [local] / rpl / src / instructions_t3.c
Revision 1.54: download - view: text, annotated - select for diffs - revision graph
Thu Jul 24 14:38:44 2014 UTC (9 years, 9 months ago) by bertrand
Branches: MAIN
CVS tags: HEAD
Première série de patches pour corriger les incohérences de recherche_type().

    1: /*
    2: ================================================================================
    3:   RPL/2 (R) version 4.1.19
    4:   Copyright (C) 1989-2014 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 'trnc'
   29: ================================================================================
   30:   Entrées : pointeur sur une structure struct_processus
   31: --------------------------------------------------------------------------------
   32:   Sorties :
   33: --------------------------------------------------------------------------------
   34:   Effets de bord : néant
   35: ================================================================================
   36: */
   37: 
   38: void
   39: instruction_trnc(struct_processus *s_etat_processus)
   40: {
   41:     integer8                            parametre;
   42: 
   43:     logical1                            i43;
   44:     logical1                            i44;
   45:     logical1                            i49;
   46:     logical1                            i50;
   47:     logical1                            i53;
   48:     logical1                            i54;
   49:     logical1                            i55;
   50:     logical1                            i56;
   51: 
   52:     struct_objet                        *s_objet_argument_1;
   53:     struct_objet                        *s_objet_argument_2;
   54:     struct_objet                        *s_objet_parametre;
   55: 
   56:     unsigned char                      *instruction_courante;
   57:     unsigned char                      *valeur_binaire;
   58: 
   59:     unsigned long                      i;
   60:     unsigned long                      j;
   61: 
   62:     (*s_etat_processus).erreur_execution = d_ex;
   63: 
   64:     if ((*s_etat_processus).affichage_arguments == 'Y')
   65:     {
   66:         printf("\n  TRNC ");
   67: 
   68:         if ((*s_etat_processus).langue == 'F')
   69:         {
   70:             printf("(troncature)\n\n");
   71:         }
   72:         else
   73:         {
   74:             printf("(truncation)\n\n");
   75:         }
   76: 
   77:         printf("    2: %s, %s, %s, %s, %s, %s,\n"
   78:                 "      %s, %s, %s\n",
   79:                 d_INT, d_REL, d_CPL, d_VIN, d_VRL, d_VCX, d_MIN, d_MRL, d_MCX);
   80:         printf("    1: %s\n", d_INT);
   81:         printf("->  1: %s, %s, %s, %s, %s, %s,\n"
   82:                 "      %s, %s, %s\n",
   83:                 d_INT, d_REL, d_CPL, d_VIN, d_VRL, d_VCX, d_MIN, d_MRL, d_MCX);
   84: 
   85:         return;
   86:     }
   87:     else if ((*s_etat_processus).test_instruction == 'Y')
   88:     {
   89:         (*s_etat_processus).nombre_arguments = -1;
   90:         return;
   91:     }
   92: 
   93:     if (test_cfsf(s_etat_processus, 31) == d_vrai)
   94:     {
   95:         if (empilement_pile_last(s_etat_processus, 2) == d_erreur)
   96:         {
   97:             return;
   98:         }
   99:     }
  100: 
  101:     if (depilement(s_etat_processus, &((*s_etat_processus).l_base_pile),
  102:             &s_objet_argument_1) == d_erreur)
  103:     {
  104:         (*s_etat_processus).erreur_execution = d_ex_manque_argument;
  105:         return;
  106:     }
  107: 
  108:     if (depilement(s_etat_processus, &((*s_etat_processus).l_base_pile),
  109:             &s_objet_argument_2) == d_erreur)
  110:     {
  111:         liberation(s_etat_processus, s_objet_argument_1);
  112: 
  113:         (*s_etat_processus).erreur_execution = d_ex_manque_argument;
  114:         return;
  115:     }
  116: 
  117:     if (((*s_objet_argument_1).type == INT) &&
  118:             (((*s_objet_argument_2).type == INT) ||
  119:             ((*s_objet_argument_2).type == REL) ||
  120:             ((*s_objet_argument_2).type == CPL) ||
  121:             ((*s_objet_argument_2).type == VIN) ||
  122:             ((*s_objet_argument_2).type == VRL) ||
  123:             ((*s_objet_argument_2).type == VCX) ||
  124:             ((*s_objet_argument_2).type == MIN) ||
  125:             ((*s_objet_argument_2).type == MRL) ||
  126:             ((*s_objet_argument_2).type == MCX)))
  127:     {
  128:         parametre = (*((integer8 *) (*s_objet_argument_1).objet));
  129: 
  130:         if ((parametre >= -15) && (parametre <= 15))
  131:         {
  132:             if ((s_objet_parametre = allocation(s_etat_processus, BIN))
  133:                     == NULL)
  134:             {
  135:                 (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
  136:                 return;
  137:             }
  138: 
  139:             (*((integer8 *) (*s_objet_parametre).objet)) =
  140:                     abs((*((integer8 *) (*s_objet_argument_1).objet)));
  141: 
  142:             i43 = test_cfsf(s_etat_processus, 43);
  143:             i44 = test_cfsf(s_etat_processus, 44);
  144: 
  145:             sf(s_etat_processus, 44);
  146:             cf(s_etat_processus, 43);
  147: 
  148:             if ((valeur_binaire = formateur(s_etat_processus, 0,
  149:                     s_objet_parametre)) == NULL)
  150:             {
  151:                 liberation(s_etat_processus, s_objet_parametre);
  152: 
  153:                 (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
  154:                 return;
  155:             }
  156: 
  157:             liberation(s_etat_processus, s_objet_parametre);
  158: 
  159:             if (i43 == d_vrai)
  160:             {
  161:                 sf(s_etat_processus, 43);
  162:             }
  163:             else
  164:             {
  165:                 cf(s_etat_processus, 43);
  166:             }
  167: 
  168:             if (i44 == d_vrai)
  169:             {
  170:                 sf(s_etat_processus, 44);
  171:             }
  172:             else
  173:             {
  174:                 cf(s_etat_processus, 44);
  175:             }
  176: 
  177:             i53 = test_cfsf(s_etat_processus, 53);
  178:             i54 = test_cfsf(s_etat_processus, 54);
  179:             i55 = test_cfsf(s_etat_processus, 55);
  180:             i56 = test_cfsf(s_etat_processus, 56);
  181: 
  182:             for(j = 53, i = strlen(valeur_binaire) - 2; i >= 2; i--)
  183:             {
  184:                 if (valeur_binaire[i] == '0')
  185:                 {
  186:                     cf(s_etat_processus, (unsigned char) j++);
  187:                 }
  188:                 else
  189:                 {
  190:                     sf(s_etat_processus, (unsigned char) j++);
  191:                 }
  192:             }
  193: 
  194:             for(; j <= 56; cf(s_etat_processus, (unsigned char) j++));
  195: 
  196:             free(valeur_binaire);
  197: 
  198:             i49 = test_cfsf(s_etat_processus, 49);
  199:             i50 = test_cfsf(s_etat_processus, 50);
  200: 
  201:             if (parametre >= 0)
  202:             {
  203:                 // Troncature FIX
  204:                 sf(s_etat_processus, 49);
  205:                 cf(s_etat_processus, 50);
  206:             }
  207:             else
  208:             {
  209:                 // Troncature SCI
  210:                 cf(s_etat_processus, 49);
  211:                 sf(s_etat_processus, 50);
  212:             }
  213: 
  214:             instruction_courante = (*s_etat_processus).instruction_courante;
  215: 
  216:             if (((*s_etat_processus).instruction_courante =
  217:                     formateur(s_etat_processus, 0, s_objet_argument_2)) == NULL)
  218:             {
  219:                 (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
  220:                 (*s_etat_processus).instruction_courante = instruction_courante;
  221:                 return;
  222:             }
  223: 
  224:             if (i49 == d_vrai)
  225:             {
  226:                 sf(s_etat_processus, 49);
  227:             }
  228:             else
  229:             {
  230:                 cf(s_etat_processus, 49);
  231:             }
  232: 
  233:             if (i50 == d_vrai)
  234:             {
  235:                 sf(s_etat_processus, 50);
  236:             }
  237:             else
  238:             {
  239:                 cf(s_etat_processus, 50);
  240:             }
  241: 
  242:             if (i53 == d_vrai)
  243:             {
  244:                 sf(s_etat_processus, 53);
  245:             }
  246:             else
  247:             {
  248:                 cf(s_etat_processus, 53);
  249:             }
  250: 
  251:             if (i54 == d_vrai)
  252:             {
  253:                 sf(s_etat_processus, 54);
  254:             }
  255:             else
  256:             {
  257:                 cf(s_etat_processus, 54);
  258:             }
  259: 
  260:             if (i55 == d_vrai)
  261:             {
  262:                 sf(s_etat_processus, 55);
  263:             }
  264:             else
  265:             {
  266:                 cf(s_etat_processus, 55);
  267:             }
  268: 
  269:             if (i56 == d_vrai)
  270:             {
  271:                 sf(s_etat_processus, 56);
  272:             }
  273:             else
  274:             {
  275:                 cf(s_etat_processus, 56);
  276:             }
  277: 
  278:             (*s_etat_processus).type_en_cours = NON;
  279:             recherche_type(s_etat_processus);
  280: 
  281:             free((*s_etat_processus).instruction_courante);
  282:             (*s_etat_processus).instruction_courante = instruction_courante;
  283: 
  284:             if ((*s_etat_processus).erreur_systeme != d_es)
  285:             {
  286:                 return;
  287:             }
  288: 
  289:             if ((*s_etat_processus).erreur_execution != d_ex)
  290:             {
  291:                 liberation(s_etat_processus, s_objet_argument_1);
  292:                 liberation(s_etat_processus, s_objet_argument_2);
  293:                 return;
  294:             }
  295:         }
  296:         else
  297:         {
  298:             liberation(s_etat_processus, s_objet_argument_1);
  299:             liberation(s_etat_processus, s_objet_argument_2);
  300: 
  301:             (*s_etat_processus).erreur_execution = d_ex_argument_invalide;
  302:             return;
  303:         }
  304:     }
  305: 
  306: /*
  307: --------------------------------------------------------------------------------
  308:   Fonction troncature impossible à réaliser
  309: --------------------------------------------------------------------------------
  310: */
  311: 
  312:     else
  313:     {
  314:         liberation(s_etat_processus, s_objet_argument_1);
  315:         liberation(s_etat_processus, s_objet_argument_2);
  316: 
  317:         (*s_etat_processus).erreur_execution = d_ex_erreur_type_argument;
  318:         return;
  319:     }
  320: 
  321:     liberation(s_etat_processus, s_objet_argument_1);
  322:     liberation(s_etat_processus, s_objet_argument_2);
  323: 
  324:     return;
  325: }
  326: 
  327: 
  328: /*
  329: ================================================================================
  330:   Fonction 'table->'
  331: ================================================================================
  332:   Entrées : structure processus
  333: --------------------------------------------------------------------------------
  334:   Sorties :
  335: --------------------------------------------------------------------------------
  336:   Effets de bord : néant
  337: ================================================================================
  338: */
  339: 
  340: void
  341: instruction_table_fleche(struct_processus *s_etat_processus)
  342: {
  343:     struct_objet                    *s_objet;
  344:     struct_objet                    *s_objet_resultat;
  345: 
  346:     integer8                        i;
  347: 
  348:     (*s_etat_processus).erreur_execution = d_ex;
  349: 
  350:     if ((*s_etat_processus).affichage_arguments == 'Y')
  351:     {
  352:         printf("\n  TABLE-> ");
  353: 
  354:         if ((*s_etat_processus).langue == 'F')
  355:         {
  356:             printf("(expansion d'une table)\n\n");
  357:         }
  358:         else
  359:         {
  360:             printf("(expand table)\n\n");
  361:         }
  362: 
  363:         printf("    1: %s\n", d_TAB);
  364:         printf("->  n: %s, %s, %s, %s, %s, %s,\n"
  365:                 "      %s, %s, %s, %s, %s,\n"
  366:                 "      %s, %s, %s, %s, %s,\n"
  367:                 "      %s, %s\n",
  368:                 d_INT, d_REL, d_CPL, d_VIN, d_VRL, d_VCX, d_MIN, d_MRL, d_MCX,
  369:                 d_TAB, d_BIN, d_NOM, d_CHN, d_LST, d_ALG, d_RPN, d_FCH, d_SLB);
  370:         printf("    ...\n");
  371:         printf("    2: %s, %s, %s, %s, %s, %s,\n"
  372:                 "      %s, %s, %s, %s, %s,\n"
  373:                 "      %s, %s, %s, %s, %s,\n"
  374:                 "      %s, %s\n",
  375:                 d_INT, d_REL, d_CPL, d_VIN, d_VRL, d_VCX, d_MIN, d_MRL, d_MCX,
  376:                 d_TAB, d_BIN, d_NOM, d_CHN, d_LST, d_ALG, d_RPN, d_FCH, d_SLB);
  377:         printf("    1: %s\n", d_INT);
  378: 
  379:         return;
  380:     }
  381:     else if ((*s_etat_processus).test_instruction == 'Y')
  382:     {
  383:         (*s_etat_processus).nombre_arguments = -1;
  384:         return;
  385:     }
  386: 
  387:     if (test_cfsf(s_etat_processus, 31) == d_vrai)
  388:     {
  389:         if (empilement_pile_last(s_etat_processus, 1) == d_erreur)
  390:         {
  391:             return;
  392:         }
  393:     }
  394: 
  395:     if (depilement(s_etat_processus, &((*s_etat_processus).l_base_pile),
  396:             &s_objet) == d_erreur)
  397:     {
  398:         return;
  399:     }
  400: 
  401:     if ((*s_objet).type != TBL)
  402:     {
  403:         liberation(s_etat_processus, s_objet);
  404: 
  405:         (*s_etat_processus).erreur_execution = d_ex_erreur_type_argument;
  406:         return;
  407:     }
  408: 
  409:     for(i = 0; i < (*((struct_tableau *) (*s_objet).objet))
  410:             .nombre_elements; i++)
  411:     {
  412:         if (((*((struct_tableau *) (*s_objet).objet)).elements[i] =
  413:                 copie_objet(s_etat_processus, (*((struct_tableau *)
  414:                 (*s_objet).objet)).elements[i], 'P')) == NULL)
  415:         {
  416:             (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
  417:             return;
  418:         }
  419: 
  420:         if (empilement(s_etat_processus, &((*s_etat_processus).l_base_pile),
  421:                 (*((struct_tableau *) (*s_objet).objet)).elements[i])
  422:                 == d_erreur)
  423:         {
  424:             (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
  425:             return;
  426:         }
  427:     }
  428: 
  429:     if ((s_objet_resultat = allocation(s_etat_processus, INT)) == NULL)
  430:     {
  431:         (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
  432:         return;
  433:     }
  434: 
  435:     (*((integer8 *) ((*s_objet_resultat).objet))) = (integer8)
  436:             (*((struct_tableau *) (*s_objet).objet)).nombre_elements;
  437: 
  438:     liberation(s_etat_processus, s_objet);
  439: 
  440:     if (empilement(s_etat_processus, &((*s_etat_processus).l_base_pile),
  441:             s_objet_resultat) == d_erreur)
  442:     {
  443:         (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
  444:         return;
  445:     }
  446: 
  447:     return;
  448: }
  449: 
  450: 
  451: /*
  452: ================================================================================
  453:   Fonction 'trim'
  454: ================================================================================
  455:   Entrées : pointeur sur une structure struct_processus
  456: --------------------------------------------------------------------------------
  457:   Sorties :
  458: --------------------------------------------------------------------------------
  459:   Effets de bord : néant
  460: ================================================================================
  461: */
  462: 
  463: void
  464: instruction_trim(struct_processus *s_etat_processus)
  465: {
  466:     struct_objet                        *s_objet_argument;
  467:     struct_objet                        *s_objet_resultat;
  468: 
  469:     unsigned char                       *debut;
  470:     unsigned char                       *fin;
  471: 
  472:     (*s_etat_processus).erreur_execution = d_ex;
  473: 
  474:     if ((*s_etat_processus).affichage_arguments == 'Y')
  475:     {
  476:         printf("\n  TRIM ");
  477: 
  478:         if ((*s_etat_processus).langue == 'F')
  479:         {
  480:             printf("(suppression des espaces initiaux et finaux d'une "
  481:                     "chaîne)\n\n");
  482:         }
  483:         else
  484:         {
  485:             printf("(delete initial and final spaces from string)\n\n");
  486:         }
  487: 
  488:         printf("    1: %s\n", d_CHN);
  489:         printf("->  1: %s\n", d_CHN);
  490: 
  491:         return;
  492:     }
  493:     else if ((*s_etat_processus).test_instruction == 'Y')
  494:     {
  495:         (*s_etat_processus).nombre_arguments = -1;
  496:         return;
  497:     }
  498: 
  499:     if (test_cfsf(s_etat_processus, 31) == d_vrai)
  500:     {
  501:         if (empilement_pile_last(s_etat_processus, 1) == d_erreur)
  502:         {
  503:             return;
  504:         }
  505:     }
  506: 
  507:     if (depilement(s_etat_processus, &((*s_etat_processus).l_base_pile),
  508:             &s_objet_argument) == d_erreur)
  509:     {
  510:         (*s_etat_processus).erreur_execution = d_ex_manque_argument;
  511:         return;
  512:     }
  513: 
  514:     if ((*s_objet_argument).type == CHN)
  515:     {
  516:         debut = (unsigned char *) (*s_objet_argument).objet;
  517: 
  518:         while(((*debut) != d_code_fin_chaine) &&
  519:                 (((*debut) == d_code_espace)
  520:                 || ((*debut) == d_code_retour_chariot)
  521:                 || ((*debut) == d_code_tabulation)))
  522:         {
  523:             debut++;
  524:         }
  525: 
  526:         fin = &(((unsigned char *) (*s_objet_argument).objet)
  527:                 [strlen((unsigned char *) (*s_objet_argument).objet) - 1]);
  528: 
  529:         while((fin > debut) &&
  530:                 (((*fin) == d_code_espace)
  531:                 || ((*fin) == d_code_retour_chariot)
  532:                 || ((*fin) == d_code_tabulation)))
  533:         {
  534:             fin--;
  535:         }
  536: 
  537:         (*(++fin)) = d_code_fin_chaine;
  538: 
  539:         if ((s_objet_resultat = allocation(s_etat_processus, CHN)) == NULL)
  540:         {
  541:             (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
  542:             return;
  543:         }
  544: 
  545:         if (((*s_objet_resultat).objet = malloc(((size_t) (1 + fin - debut))
  546:                 * sizeof(unsigned char))) == NULL)
  547:         {
  548:             (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
  549:             return;
  550:         }
  551: 
  552:         strcpy((unsigned char *) (*s_objet_resultat).objet, debut);
  553:     }
  554: 
  555: /*
  556: --------------------------------------------------------------------------------
  557:   Fonction TRIM impossible à réaliser
  558: --------------------------------------------------------------------------------
  559: */
  560: 
  561:     else
  562:     {
  563:         liberation(s_etat_processus, s_objet_argument);
  564: 
  565:         (*s_etat_processus).erreur_execution = d_ex_erreur_type_argument;
  566:         return;
  567:     }
  568: 
  569:     if (empilement(s_etat_processus, &((*s_etat_processus).l_base_pile),
  570:             s_objet_resultat) == d_erreur)
  571:     {
  572:         return;
  573:     }
  574: 
  575:     liberation(s_etat_processus, s_objet_argument);
  576: 
  577:     return;
  578: }
  579: 
  580: 
  581: /*
  582: ================================================================================
  583:   Fonction 'tokenize'
  584: ================================================================================
  585:   Entrées : pointeur sur une structure struct_processus
  586: --------------------------------------------------------------------------------
  587:   Sorties :
  588: --------------------------------------------------------------------------------
  589:   Effets de bord : néant
  590: ================================================================================
  591: */
  592: 
  593: void
  594: instruction_tokenize(struct_processus *s_etat_processus)
  595: {
  596:     struct_objet                        *s_objet_argument;
  597:     struct_objet                        *s_objet_resultat;
  598: 
  599:     struct_liste_chainee                *l_element_courant;
  600: 
  601:     unsigned char                       *ptr;
  602:     unsigned char                       *ptr2;
  603:     unsigned char                       *registre_instruction_courante;
  604:     unsigned char                       *registre_definitions_chainees;
  605:     unsigned char                       *tampon;
  606:     unsigned char                       *tampon2;
  607: 
  608:     integer8                            nombre_caracteres_echappement;
  609:     integer8                            registre_longueur_definitions_chainees;
  610:     integer8                            registre_position_courante;
  611: 
  612:     (*s_etat_processus).erreur_execution = d_ex;
  613: 
  614:     if ((*s_etat_processus).affichage_arguments == 'Y')
  615:     {
  616:         printf("\n  TOKENIZE ");
  617: 
  618:         if ((*s_etat_processus).langue == 'F')
  619:         {
  620:             printf("(extraction d'objets en sous-chaînes)\n\n");
  621:         }
  622:         else
  623:         {
  624:             printf("(extract objects in substrings)\n\n");
  625:         }
  626: 
  627:         printf("    1: %s\n", d_CHN);
  628:         printf("->  1: %s\n", d_LST);
  629: 
  630:         return;
  631:     }
  632:     else if ((*s_etat_processus).test_instruction == 'Y')
  633:     {
  634:         (*s_etat_processus).nombre_arguments = -1;
  635:         return;
  636:     }
  637: 
  638:     if (test_cfsf(s_etat_processus, 31) == d_vrai)
  639:     {
  640:         if (empilement_pile_last(s_etat_processus, 1) == d_erreur)
  641:         {
  642:             return;
  643:         }
  644:     }
  645: 
  646:     if (depilement(s_etat_processus, &((*s_etat_processus).l_base_pile),
  647:             &s_objet_argument) == d_erreur)
  648:     {
  649:         (*s_etat_processus).erreur_execution = d_ex_manque_argument;
  650:         return;
  651:     }
  652: 
  653:     if ((*s_objet_argument).type == CHN)
  654:     {
  655:         // Conversion des caractères d'échappement
  656: 
  657:         if ((tampon2 = malloc((strlen((*s_objet_argument).objet) + 1) *
  658:                 sizeof(unsigned char))) == NULL)
  659:         {
  660:             (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
  661:             return;
  662:         }
  663: 
  664:         strcpy(tampon2, (*s_objet_argument).objet);
  665:         ptr = tampon2;
  666:         ptr2 = ptr;
  667: 
  668:         while((*ptr) != d_code_fin_chaine)
  669:         {
  670:             (*ptr2) = (*ptr);
  671: 
  672:             // Début de la séquence d'échappement
  673: 
  674:             if ((*ptr) == '\\')
  675:             {
  676:                 if ((*(ptr + 1)) == '"')
  677:                 {
  678:                     ptr++;
  679:                     (*ptr2) = '\"';
  680:                 }
  681:                 else if ((*(ptr + 1)) == 'n')
  682:                 {
  683:                     ptr++;
  684:                     (*ptr2) = '\n';
  685:                 }
  686:                 else if ((*(ptr + 1)) == 't')
  687:                 {
  688:                     ptr++;
  689:                     (*ptr2) = '\t';
  690:                 }
  691:                 else if ((*(ptr + 1)) == '\\')
  692:                 {
  693:                         ptr++;
  694:                 }
  695:                 else
  696:                 {
  697:                     if ((*s_etat_processus).langue == 'F')
  698:                     {
  699:                         printf("+++Information : Séquence d'échappement "
  700:                                 "inconnue [%d]\n", (int) getpid());
  701:                     }
  702:                     else
  703:                     {
  704:                         printf("+++Warning : Unknown escape code "
  705:                                 "[%d]\n", (int) getpid());
  706:                     }
  707:                 }
  708:             }
  709: 
  710:                 ptr++;
  711:                 ptr2++;
  712:         }
  713: 
  714:         (*ptr2) = d_code_fin_chaine;
  715: 
  716:         // Remplacement des éventuels retours à la ligne et tabulations par
  717:         // des espaces.
  718: 
  719:         ptr = tampon2;
  720: 
  721:         while((*ptr) != d_code_fin_chaine)
  722:         {
  723:             if (((*ptr) == d_code_retour_chariot) ||
  724:                     ((*ptr) == d_code_tabulation))
  725:             {
  726:                 (*ptr) = d_code_espace;
  727:             }
  728: 
  729:             ptr++;
  730:         }
  731: 
  732:         if ((s_objet_resultat = allocation(s_etat_processus, LST)) == NULL)
  733:         {
  734:             (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
  735:             return;
  736:         }
  737: 
  738:         registre_instruction_courante = (*s_etat_processus)
  739:                 .instruction_courante;
  740:         registre_definitions_chainees = (*s_etat_processus)
  741:                 .definitions_chainees;
  742:         registre_longueur_definitions_chainees = (*s_etat_processus)
  743:                 .longueur_definitions_chainees;
  744:         registre_position_courante = (*s_etat_processus).position_courante;
  745: 
  746:         (*s_etat_processus).definitions_chainees = tampon2;
  747:         (*s_etat_processus).longueur_definitions_chainees =
  748:                 (integer8) strlen((*s_etat_processus).definitions_chainees);
  749:         (*s_etat_processus).position_courante = 0;
  750: 
  751:         l_element_courant = NULL;
  752: 
  753:         while((*s_etat_processus).position_courante
  754:                 < (*s_etat_processus).longueur_definitions_chainees)
  755:         {
  756:             if (recherche_instruction_suivante(s_etat_processus) == d_erreur)
  757:             {
  758:                 free((*s_etat_processus).instruction_courante);
  759: 
  760:                 (*s_etat_processus).instruction_courante =
  761:                         registre_instruction_courante;
  762:                 (*s_etat_processus).definitions_chainees =
  763:                         registre_definitions_chainees;
  764:                 (*s_etat_processus).longueur_definitions_chainees =
  765:                         registre_longueur_definitions_chainees;
  766:                 (*s_etat_processus).position_courante =
  767:                         registre_position_courante;
  768: 
  769:                 free(tampon2);
  770: 
  771:                 liberation(s_etat_processus, s_objet_argument);
  772:                 liberation(s_etat_processus, s_objet_resultat);
  773: 
  774:                 return;
  775:             }
  776: 
  777:             if ((*s_etat_processus).instruction_courante[0] !=
  778:                     d_code_fin_chaine)
  779:             {
  780:                 if (l_element_courant == NULL)
  781:                 {
  782:                     if (((*s_objet_resultat).objet =
  783:                             allocation_maillon(s_etat_processus)) == NULL)
  784:                     {
  785:                         (*s_etat_processus).erreur_systeme =
  786:                                 d_es_allocation_memoire;
  787:                         return;
  788:                     }
  789: 
  790:                     l_element_courant = (*s_objet_resultat).objet;
  791:                 }
  792:                 else
  793:                 {
  794:                     if (((*l_element_courant).suivant =
  795:                             allocation_maillon(s_etat_processus)) == NULL)
  796:                     {
  797:                         (*s_etat_processus).erreur_systeme =
  798:                                 d_es_allocation_memoire;
  799:                         return;
  800:                     }
  801: 
  802:                     l_element_courant = (*l_element_courant).suivant;
  803:                 }
  804: 
  805:                 if (((*l_element_courant).donnee = allocation(s_etat_processus,
  806:                         CHN)) == NULL)
  807:                 {
  808:                     (*s_etat_processus).erreur_systeme =
  809:                             d_es_allocation_memoire;
  810:                     return;
  811:                 }
  812: 
  813:                 (*(*l_element_courant).donnee).objet = (*s_etat_processus)
  814:                         .instruction_courante;
  815:                 (*l_element_courant).suivant = NULL;
  816: 
  817:                 /*
  818:                  * Rajout du caractère d'échappement devant un guillemet
  819:                  */
  820: 
  821:                 nombre_caracteres_echappement = 0;
  822:                 ptr = (unsigned char *) (*(*l_element_courant).donnee).objet;
  823: 
  824:                 while((*ptr) != d_code_fin_chaine)
  825:                 {
  826:                     if ((*ptr) == '\"')
  827:                     {
  828:                         nombre_caracteres_echappement++;
  829:                     }
  830: 
  831:                     ptr++;
  832:                 }
  833: 
  834:                 if (nombre_caracteres_echappement != 0)
  835:                 {
  836:                     tampon = (unsigned char *) (*(*l_element_courant)
  837:                             .donnee).objet;
  838: 
  839:                     if (((*(*l_element_courant).donnee).objet = malloc(
  840:                             (strlen(tampon) + 1 +
  841:                             ((size_t) nombre_caracteres_echappement))
  842:                             * sizeof(unsigned char))) == NULL)
  843:                     {
  844:                         (*s_etat_processus).erreur_systeme =
  845:                                 d_es_allocation_memoire;
  846:                         return;
  847:                     }
  848: 
  849:                     ptr = tampon;
  850:                     ptr2 = (*(*l_element_courant).donnee).objet;
  851: 
  852:                     while((*ptr) != d_code_fin_chaine)
  853:                     {
  854:                         if ((*ptr) == '\"')
  855:                         {
  856:                             (*(ptr2++)) = '\\';
  857: 
  858:                         }
  859:                         else if ((*ptr) == '\\')
  860:                         {
  861:                             (*(ptr2++)) = '\\';
  862:                         }
  863: 
  864:                         (*(ptr2++)) = (*(ptr++));
  865:                     }
  866: 
  867:                     (*ptr2) = d_code_fin_chaine;
  868:                     free(tampon);
  869:                 }
  870:             }
  871:             else
  872:             {
  873:                 free((*s_etat_processus).instruction_courante);
  874:             }
  875:         }
  876: 
  877:         (*s_etat_processus).instruction_courante =
  878:                 registre_instruction_courante;
  879:         (*s_etat_processus).definitions_chainees =
  880:                 registre_definitions_chainees;
  881:         (*s_etat_processus).longueur_definitions_chainees =
  882:                 registre_longueur_definitions_chainees;
  883:         (*s_etat_processus).position_courante = registre_position_courante;
  884: 
  885:         free(tampon2);
  886:     }
  887: 
  888: /*
  889: --------------------------------------------------------------------------------
  890:   Fonction TOKENIZE impossible à réaliser
  891: --------------------------------------------------------------------------------
  892: */
  893: 
  894:     else
  895:     {
  896:         liberation(s_etat_processus, s_objet_argument);
  897: 
  898:         (*s_etat_processus).erreur_execution = d_ex_erreur_type_argument;
  899:         return;
  900:     }
  901: 
  902:     if (empilement(s_etat_processus, &((*s_etat_processus).l_base_pile),
  903:             s_objet_resultat) == d_erreur)
  904:     {
  905:         return;
  906:     }
  907: 
  908:     liberation(s_etat_processus, s_objet_argument);
  909:     return;
  910: }
  911: 
  912: 
  913: /*
  914: ================================================================================
  915:   Fonction 't->l'
  916: ================================================================================
  917:   Entrées : pointeur sur une structure struct_processus
  918: --------------------------------------------------------------------------------
  919:   Sorties :
  920: --------------------------------------------------------------------------------
  921:   Effets de bord : néant
  922: ================================================================================
  923: */
  924: 
  925: void
  926: instruction_t_vers_l(struct_processus *s_etat_processus)
  927: {
  928:     logical1                    last;
  929: 
  930:     (*s_etat_processus).erreur_execution = d_ex;
  931: 
  932:     if ((*s_etat_processus).affichage_arguments == 'Y')
  933:     {
  934:         printf("\n  T->L ");
  935:         
  936:         if ((*s_etat_processus).langue == 'F')
  937:         {
  938:             printf("(converison d'une table en liste)\n\n");
  939:         }
  940:         else
  941:         {
  942:             printf("(convert table to list)\n\n");
  943:         }
  944: 
  945:         printf("    1: %s\n", d_TAB);
  946:         printf("->  1: %s\n", d_LST);
  947:         return;
  948:     }
  949:     else if ((*s_etat_processus).test_instruction == 'Y')
  950:     {
  951:         (*s_etat_processus).nombre_arguments = -1;
  952:         return;
  953:     }
  954: 
  955:     if (test_cfsf(s_etat_processus, 31) == d_vrai)
  956:     {
  957:         last = d_vrai;
  958:         cf(s_etat_processus, 31);
  959: 
  960:         if (empilement_pile_last(s_etat_processus, 1) == d_erreur)
  961:         {
  962:             return;
  963:         }
  964:     }
  965:     else
  966:     {
  967:         last = d_faux;
  968:     }
  969: 
  970:     instruction_table_fleche(s_etat_processus);
  971: 
  972:     if (((*s_etat_processus).erreur_systeme == d_es) &&
  973:             ((*s_etat_processus).erreur_execution == d_ex))
  974:     {
  975:         instruction_fleche_list(s_etat_processus);
  976:     }
  977: 
  978:     if (last == d_vrai)
  979:     {
  980:         sf(s_etat_processus, 31);
  981:     }
  982: 
  983:     return;
  984: }
  985: // vim: ts=4

CVSweb interface <joel.bertrand@systella.fr>