Annotation of rpl/src/instructions_t3.c, revision 1.45
1.1 bertrand 1: /*
2: ================================================================================
1.44 bertrand 3: RPL/2 (R) version 4.1.13
1.43 bertrand 4: Copyright (C) 1989-2013 Dr. BERTRAND Joël
1.1 bertrand 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:
1.13 bertrand 23: #include "rpl-conv.h"
1.1 bertrand 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: {
1.45 ! bertrand 41: integer8 parametre;
1.1 bertrand 42:
1.45 ! bertrand 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))
1.1 bertrand 133: == NULL)
1.45 ! bertrand 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: recherche_type(s_etat_processus);
! 279:
! 280: free((*s_etat_processus).instruction_courante);
! 281: (*s_etat_processus).instruction_courante = instruction_courante;
! 282:
! 283: if ((*s_etat_processus).erreur_systeme != d_es)
! 284: {
! 285: return;
! 286: }
! 287:
! 288: if ((*s_etat_processus).erreur_execution != d_ex)
! 289: {
! 290: liberation(s_etat_processus, s_objet_argument_1);
! 291: liberation(s_etat_processus, s_objet_argument_2);
! 292: return;
! 293: }
! 294: }
! 295: else
! 296: {
! 297: liberation(s_etat_processus, s_objet_argument_1);
! 298: liberation(s_etat_processus, s_objet_argument_2);
! 299:
! 300: (*s_etat_processus).erreur_execution = d_ex_argument_invalide;
! 301: return;
! 302: }
! 303: }
1.1 bertrand 304:
305: /*
306: --------------------------------------------------------------------------------
307: Fonction troncature impossible à réaliser
308: --------------------------------------------------------------------------------
309: */
310:
1.45 ! bertrand 311: else
! 312: {
! 313: liberation(s_etat_processus, s_objet_argument_1);
! 314: liberation(s_etat_processus, s_objet_argument_2);
! 315:
! 316: (*s_etat_processus).erreur_execution = d_ex_erreur_type_argument;
! 317: return;
! 318: }
1.1 bertrand 319:
1.45 ! bertrand 320: liberation(s_etat_processus, s_objet_argument_1);
! 321: liberation(s_etat_processus, s_objet_argument_2);
1.1 bertrand 322:
1.45 ! bertrand 323: return;
1.1 bertrand 324: }
325:
326:
327: /*
328: ================================================================================
329: Fonction 'table->'
330: ================================================================================
331: Entrées : structure processus
332: --------------------------------------------------------------------------------
333: Sorties :
334: --------------------------------------------------------------------------------
335: Effets de bord : néant
336: ================================================================================
337: */
338:
339: void
340: instruction_table_fleche(struct_processus *s_etat_processus)
341: {
342: struct_objet *s_objet;
343: struct_objet *s_objet_resultat;
344:
1.45 ! bertrand 345: integer8 i;
1.1 bertrand 346:
347: (*s_etat_processus).erreur_execution = d_ex;
348:
349: if ((*s_etat_processus).affichage_arguments == 'Y')
350: {
351: printf("\n TABLE-> ");
352:
353: if ((*s_etat_processus).langue == 'F')
354: {
355: printf("(expansion d'une table)\n\n");
356: }
357: else
358: {
359: printf("(expand table)\n\n");
360: }
361:
362: printf(" 1: %s\n", d_TAB);
363: printf("-> n: %s, %s, %s, %s, %s, %s,\n"
1.45 ! bertrand 364: " %s, %s, %s, %s, %s,\n"
! 365: " %s, %s, %s, %s, %s,\n"
! 366: " %s, %s\n",
1.1 bertrand 367: d_INT, d_REL, d_CPL, d_VIN, d_VRL, d_VCX, d_MIN, d_MRL, d_MCX,
368: d_TAB, d_BIN, d_NOM, d_CHN, d_LST, d_ALG, d_RPN, d_FCH, d_SLB);
369: printf(" ...\n");
370: printf(" 2: %s, %s, %s, %s, %s, %s,\n"
1.45 ! bertrand 371: " %s, %s, %s, %s, %s,\n"
! 372: " %s, %s, %s, %s, %s,\n"
! 373: " %s, %s\n",
1.1 bertrand 374: d_INT, d_REL, d_CPL, d_VIN, d_VRL, d_VCX, d_MIN, d_MRL, d_MCX,
375: d_TAB, d_BIN, d_NOM, d_CHN, d_LST, d_ALG, d_RPN, d_FCH, d_SLB);
376: printf(" 1: %s\n", d_INT);
377:
378: return;
379: }
380: else if ((*s_etat_processus).test_instruction == 'Y')
381: {
382: (*s_etat_processus).nombre_arguments = -1;
383: return;
384: }
385:
386: if (test_cfsf(s_etat_processus, 31) == d_vrai)
387: {
388: if (empilement_pile_last(s_etat_processus, 1) == d_erreur)
389: {
390: return;
391: }
392: }
393:
394: if (depilement(s_etat_processus, &((*s_etat_processus).l_base_pile),
395: &s_objet) == d_erreur)
396: {
397: return;
398: }
399:
400: if ((*s_objet).type != TBL)
401: {
402: liberation(s_etat_processus, s_objet);
403:
404: (*s_etat_processus).erreur_execution = d_ex_erreur_type_argument;
405: return;
406: }
407:
408: for(i = 0; i < (*((struct_tableau *) (*s_objet).objet))
409: .nombre_elements; i++)
410: {
411: if (((*((struct_tableau *) (*s_objet).objet)).elements[i] =
412: copie_objet(s_etat_processus, (*((struct_tableau *)
413: (*s_objet).objet)).elements[i], 'P')) == NULL)
414: {
415: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
416: return;
417: }
418:
419: if (empilement(s_etat_processus, &((*s_etat_processus).l_base_pile),
420: (*((struct_tableau *) (*s_objet).objet)).elements[i])
421: == d_erreur)
422: {
423: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
424: return;
425: }
426: }
427:
428: if ((s_objet_resultat = allocation(s_etat_processus, INT)) == NULL)
429: {
430: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
431: return;
432: }
433:
434: (*((integer8 *) ((*s_objet_resultat).objet))) = (integer8)
435: (*((struct_tableau *) (*s_objet).objet)).nombre_elements;
436:
437: liberation(s_etat_processus, s_objet);
438:
439: if (empilement(s_etat_processus, &((*s_etat_processus).l_base_pile),
440: s_objet_resultat) == d_erreur)
441: {
442: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
443: return;
444: }
445:
446: return;
447: }
448:
449:
450: /*
451: ================================================================================
452: Fonction 'trim'
453: ================================================================================
454: Entrées : pointeur sur une structure struct_processus
455: --------------------------------------------------------------------------------
456: Sorties :
457: --------------------------------------------------------------------------------
458: Effets de bord : néant
459: ================================================================================
460: */
461:
462: void
463: instruction_trim(struct_processus *s_etat_processus)
464: {
1.45 ! bertrand 465: struct_objet *s_objet_argument;
! 466: struct_objet *s_objet_resultat;
1.1 bertrand 467:
468: unsigned char *debut;
469: unsigned char *fin;
470:
1.45 ! bertrand 471: (*s_etat_processus).erreur_execution = d_ex;
! 472:
! 473: if ((*s_etat_processus).affichage_arguments == 'Y')
! 474: {
! 475: printf("\n TRIM ");
1.1 bertrand 476:
1.45 ! bertrand 477: if ((*s_etat_processus).langue == 'F')
! 478: {
! 479: printf("(suppression des espaces initiaux et finaux d'une "
1.1 bertrand 480: "chaîne)\n\n");
1.45 ! bertrand 481: }
! 482: else
! 483: {
! 484: printf("(delete initial and final spaces from string)\n\n");
! 485: }
! 486:
! 487: printf(" 1: %s\n", d_CHN);
! 488: printf("-> 1: %s\n", d_CHN);
1.1 bertrand 489:
1.45 ! bertrand 490: return;
! 491: }
! 492: else if ((*s_etat_processus).test_instruction == 'Y')
! 493: {
! 494: (*s_etat_processus).nombre_arguments = -1;
! 495: return;
! 496: }
! 497:
! 498: if (test_cfsf(s_etat_processus, 31) == d_vrai)
! 499: {
! 500: if (empilement_pile_last(s_etat_processus, 1) == d_erreur)
! 501: {
! 502: return;
! 503: }
! 504: }
! 505:
! 506: if (depilement(s_etat_processus, &((*s_etat_processus).l_base_pile),
! 507: &s_objet_argument) == d_erreur)
! 508: {
! 509: (*s_etat_processus).erreur_execution = d_ex_manque_argument;
! 510: return;
! 511: }
! 512:
! 513: if ((*s_objet_argument).type == CHN)
! 514: {
1.1 bertrand 515: debut = (unsigned char *) (*s_objet_argument).objet;
516:
1.10 bertrand 517: while(((*debut) != d_code_fin_chaine) &&
518: (((*debut) == d_code_espace)
519: || ((*debut) == d_code_retour_chariot)
520: || ((*debut) == d_code_tabulation)))
1.1 bertrand 521: {
522: debut++;
523: }
524:
525: fin = &(((unsigned char *) (*s_objet_argument).objet)
526: [strlen((unsigned char *) (*s_objet_argument).objet) - 1]);
527:
1.10 bertrand 528: while((fin > debut) &&
529: (((*fin) == d_code_espace)
530: || ((*fin) == d_code_retour_chariot)
531: || ((*fin) == d_code_tabulation)))
1.1 bertrand 532: {
533: fin--;
534: }
535:
536: (*(++fin)) = d_code_fin_chaine;
537:
538: if ((s_objet_resultat = allocation(s_etat_processus, CHN)) == NULL)
539: {
540: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
541: return;
542: }
543:
1.45 ! bertrand 544: if (((*s_objet_resultat).objet = malloc(((size_t) (1 + fin - debut))
1.1 bertrand 545: * sizeof(unsigned char))) == NULL)
546: {
547: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
548: return;
549: }
550:
551: strcpy((unsigned char *) (*s_objet_resultat).objet, debut);
1.45 ! bertrand 552: }
1.1 bertrand 553:
554: /*
555: --------------------------------------------------------------------------------
556: Fonction TRIM impossible à réaliser
557: --------------------------------------------------------------------------------
558: */
559:
1.45 ! bertrand 560: else
! 561: {
! 562: liberation(s_etat_processus, s_objet_argument);
! 563:
! 564: (*s_etat_processus).erreur_execution = d_ex_erreur_type_argument;
! 565: return;
! 566: }
1.1 bertrand 567:
568: if (empilement(s_etat_processus, &((*s_etat_processus).l_base_pile),
569: s_objet_resultat) == d_erreur)
570: {
571: return;
572: }
573:
1.45 ! bertrand 574: liberation(s_etat_processus, s_objet_argument);
1.1 bertrand 575:
1.45 ! bertrand 576: return;
1.1 bertrand 577: }
578:
579:
580: /*
581: ================================================================================
582: Fonction 'tokenize'
583: ================================================================================
584: Entrées : pointeur sur une structure struct_processus
585: --------------------------------------------------------------------------------
586: Sorties :
587: --------------------------------------------------------------------------------
588: Effets de bord : néant
589: ================================================================================
590: */
591:
592: void
593: instruction_tokenize(struct_processus *s_etat_processus)
594: {
1.45 ! bertrand 595: struct_objet *s_objet_argument;
! 596: struct_objet *s_objet_resultat;
1.1 bertrand 597:
598: struct_liste_chainee *l_element_courant;
599:
1.10 bertrand 600: unsigned char *ptr;
1.12 bertrand 601: unsigned char *ptr2;
1.1 bertrand 602: unsigned char *registre_instruction_courante;
603: unsigned char *registre_definitions_chainees;
1.12 bertrand 604: unsigned char *tampon;
1.1 bertrand 605:
1.45 ! bertrand 606: integer8 nombre_caracteres_echappement;
! 607: integer8 registre_longueur_definitions_chainees;
! 608: integer8 registre_position_courante;
1.1 bertrand 609:
1.45 ! bertrand 610: (*s_etat_processus).erreur_execution = d_ex;
! 611:
! 612: if ((*s_etat_processus).affichage_arguments == 'Y')
! 613: {
! 614: printf("\n TOKENIZE ");
! 615:
! 616: if ((*s_etat_processus).langue == 'F')
! 617: {
! 618: printf("(extraction d'objets en sous-chaînes)\n\n");
! 619: }
! 620: else
! 621: {
! 622: printf("(extract objects in substrings)\n\n");
! 623: }
! 624:
! 625: printf(" 1: %s\n", d_CHN);
! 626: printf("-> 1: %s\n", d_LST);
! 627:
! 628: return;
! 629: }
! 630: else if ((*s_etat_processus).test_instruction == 'Y')
! 631: {
! 632: (*s_etat_processus).nombre_arguments = -1;
! 633: return;
! 634: }
! 635:
! 636: if (test_cfsf(s_etat_processus, 31) == d_vrai)
! 637: {
! 638: if (empilement_pile_last(s_etat_processus, 1) == d_erreur)
! 639: {
! 640: return;
! 641: }
! 642: }
! 643:
! 644: if (depilement(s_etat_processus, &((*s_etat_processus).l_base_pile),
! 645: &s_objet_argument) == d_erreur)
! 646: {
! 647: (*s_etat_processus).erreur_execution = d_ex_manque_argument;
! 648: return;
! 649: }
! 650:
! 651: if ((*s_objet_argument).type == CHN)
! 652: {
1.12 bertrand 653: // Conversion des caractères d'échappement
654:
655: ptr = (unsigned char *) (*s_objet_argument).objet;
656: ptr2 = ptr;
657:
658: while((*ptr) != d_code_fin_chaine)
659: {
660: (*ptr2) = (*ptr);
661:
662: // Début de la séquence d'échappement
663:
664: if ((*ptr) == '\\')
665: {
666: if ((*(ptr + 1)) == '"')
667: {
668: ptr++;
669: (*ptr2) = '\"';
670: }
671: else if ((*(ptr + 1)) == 'n')
672: {
673: ptr++;
674: (*ptr2) = '\n';
675: }
676: else if ((*(ptr + 1)) == 't')
677: {
678: ptr++;
679: (*ptr2) = '\t';
680: }
681: else if ((*(ptr + 1)) == '\\')
682: {
683: ptr++;
684: }
685: else
686: {
687: if ((*s_etat_processus).langue == 'F')
688: {
689: printf("+++Information : Séquence d'échappement "
690: "inconnue [%d]\n", (int) getpid());
691: }
692: else
693: {
694: printf("+++Warning : Unknown escape code "
695: "[%d]\n", (int) getpid());
696: }
697: }
698: }
699:
700: ptr++;
701: ptr2++;
702: }
703:
704: (*ptr2) = d_code_fin_chaine;
705:
1.10 bertrand 706: // Remplacement des éventuels retours à la ligne et tabulations par
707: // des espaces.
708:
709: ptr = (unsigned char *) (*s_objet_argument).objet;
710:
711: while((*ptr) != d_code_fin_chaine)
712: {
713: if (((*ptr) == d_code_retour_chariot) ||
714: ((*ptr) == d_code_tabulation))
715: {
716: (*ptr) = d_code_espace;
717: }
718:
719: ptr++;
720: }
721:
1.1 bertrand 722: if ((s_objet_resultat = allocation(s_etat_processus, LST)) == NULL)
723: {
724: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
725: return;
726: }
727:
728: registre_instruction_courante = (*s_etat_processus)
729: .instruction_courante;
730: registre_definitions_chainees = (*s_etat_processus)
731: .definitions_chainees;
732: registre_longueur_definitions_chainees = (*s_etat_processus)
733: .longueur_definitions_chainees;
734: registre_position_courante = (*s_etat_processus).position_courante;
735:
736: (*s_etat_processus).definitions_chainees = (unsigned char *)
737: (*s_objet_argument).objet;
738: (*s_etat_processus).longueur_definitions_chainees =
1.45 ! bertrand 739: (integer8) strlen((*s_etat_processus).definitions_chainees);
1.1 bertrand 740: (*s_etat_processus).position_courante = 0;
741:
742: l_element_courant = NULL;
743:
744: while((*s_etat_processus).position_courante
745: < (*s_etat_processus).longueur_definitions_chainees)
746: {
747: if (recherche_instruction_suivante(s_etat_processus) == d_erreur)
748: {
749: free((*s_etat_processus).instruction_courante);
750:
751: (*s_etat_processus).instruction_courante =
752: registre_instruction_courante;
753: (*s_etat_processus).definitions_chainees =
754: registre_definitions_chainees;
755: (*s_etat_processus).longueur_definitions_chainees =
756: registre_longueur_definitions_chainees;
757: (*s_etat_processus).position_courante =
758: registre_position_courante;
759:
760: liberation(s_etat_processus, s_objet_argument);
761: liberation(s_etat_processus, s_objet_resultat);
762:
763: return;
764: }
765:
766: if ((*s_etat_processus).instruction_courante[0] !=
767: d_code_fin_chaine)
768: {
769: if (l_element_courant == NULL)
770: {
771: if (((*s_objet_resultat).objet =
772: allocation_maillon(s_etat_processus)) == NULL)
773: {
774: (*s_etat_processus).erreur_systeme =
775: d_es_allocation_memoire;
776: return;
777: }
778:
779: l_element_courant = (*s_objet_resultat).objet;
780: }
781: else
782: {
783: if (((*l_element_courant).suivant =
784: allocation_maillon(s_etat_processus)) == NULL)
785: {
786: (*s_etat_processus).erreur_systeme =
787: d_es_allocation_memoire;
788: return;
789: }
790:
791: l_element_courant = (*l_element_courant).suivant;
792: }
793:
794: if (((*l_element_courant).donnee = allocation(s_etat_processus,
795: CHN)) == NULL)
796: {
797: (*s_etat_processus).erreur_systeme =
798: d_es_allocation_memoire;
799: return;
800: }
801:
802: (*(*l_element_courant).donnee).objet = (*s_etat_processus)
803: .instruction_courante;
804: (*l_element_courant).suivant = NULL;
1.12 bertrand 805:
806: /*
807: * Rajout du caractère d'échappement devant un guillemet
808: */
809:
810: nombre_caracteres_echappement = 0;
811: ptr = (unsigned char *) (*(*l_element_courant).donnee).objet;
812:
813: while((*ptr) != d_code_fin_chaine)
814: {
815: if ((*ptr) == '\"')
816: {
817: nombre_caracteres_echappement++;
818: }
819:
820: ptr++;
821: }
822:
823: if (nombre_caracteres_echappement != 0)
824: {
825: tampon = (unsigned char *) (*(*l_element_courant)
826: .donnee).objet;
827:
828: if (((*(*l_element_courant).donnee).objet = malloc(
1.45 ! bertrand 829: (strlen(tampon) + 1 +
! 830: ((size_t) nombre_caracteres_echappement))
1.12 bertrand 831: * sizeof(unsigned char))) == NULL)
832: {
833: (*s_etat_processus).erreur_systeme =
834: d_es_allocation_memoire;
835: return;
836: }
837:
838: ptr = tampon;
839: ptr2 = (*(*l_element_courant).donnee).objet;
840:
841: while((*ptr) != d_code_fin_chaine)
842: {
843: if ((*ptr) == '\"')
844: {
845: (*(ptr2++)) = '\\';
846:
847: }
848: else if ((*ptr) == '\\')
849: {
850: (*(ptr2++)) = '\\';
851: }
852:
853: (*(ptr2++)) = (*(ptr++));
854: }
855:
856: (*ptr2) = d_code_fin_chaine;
857: free(tampon);
858: }
1.1 bertrand 859: }
860: else
861: {
862: free((*s_etat_processus).instruction_courante);
863: }
864: }
865:
866: (*s_etat_processus).instruction_courante =
867: registre_instruction_courante;
868: (*s_etat_processus).definitions_chainees =
869: registre_definitions_chainees;
870: (*s_etat_processus).longueur_definitions_chainees =
871: registre_longueur_definitions_chainees;
872: (*s_etat_processus).position_courante = registre_position_courante;
1.45 ! bertrand 873: }
1.1 bertrand 874:
875: /*
876: --------------------------------------------------------------------------------
877: Fonction TOKENIZE impossible à réaliser
878: --------------------------------------------------------------------------------
879: */
880:
1.45 ! bertrand 881: else
! 882: {
! 883: liberation(s_etat_processus, s_objet_argument);
! 884:
! 885: (*s_etat_processus).erreur_execution = d_ex_erreur_type_argument;
! 886: return;
! 887: }
1.1 bertrand 888:
889: if (empilement(s_etat_processus, &((*s_etat_processus).l_base_pile),
890: s_objet_resultat) == d_erreur)
891: {
892: return;
893: }
894:
1.45 ! bertrand 895: liberation(s_etat_processus, s_objet_argument);
1.1 bertrand 896:
1.45 ! bertrand 897: return;
1.1 bertrand 898: }
899:
1.19 bertrand 900:
901: /*
902: ================================================================================
903: Fonction 't->l'
904: ================================================================================
905: Entrées : pointeur sur une structure struct_processus
906: --------------------------------------------------------------------------------
907: Sorties :
908: --------------------------------------------------------------------------------
909: Effets de bord : néant
910: ================================================================================
911: */
912:
913: void
914: instruction_t_vers_l(struct_processus *s_etat_processus)
915: {
1.20 bertrand 916: logical1 last;
1.19 bertrand 917:
918: (*s_etat_processus).erreur_execution = d_ex;
919:
920: if ((*s_etat_processus).affichage_arguments == 'Y')
921: {
922: printf("\n T->L ");
923:
924: if ((*s_etat_processus).langue == 'F')
925: {
926: printf("(converison d'une table en liste)\n\n");
927: }
928: else
929: {
930: printf("(convert table to list)\n\n");
931: }
932:
933: printf(" 1: %s\n", d_TAB);
934: printf("-> 1: %s\n", d_LST);
935: return;
936: }
937: else if ((*s_etat_processus).test_instruction == 'Y')
938: {
939: (*s_etat_processus).nombre_arguments = -1;
940: return;
941: }
942:
1.20 bertrand 943: if (test_cfsf(s_etat_processus, 31) == d_vrai)
944: {
945: last = d_vrai;
946: cf(s_etat_processus, 31);
947:
948: if (empilement_pile_last(s_etat_processus, 1) == d_erreur)
949: {
950: return;
951: }
952: }
953: else
954: {
955: last = d_faux;
956: }
957:
958: instruction_table_fleche(s_etat_processus);
959:
960: if (((*s_etat_processus).erreur_systeme == d_es) &&
961: ((*s_etat_processus).erreur_execution == d_ex))
962: {
963: instruction_fleche_list(s_etat_processus);
964: }
965:
966: if (last == d_vrai)
967: {
968: sf(s_etat_processus, 31);
969: }
970:
1.19 bertrand 971: return;
972: }
1.1 bertrand 973: // vim: ts=4
CVSweb interface <joel.bertrand@systella.fr>