![]() ![]() | ![]() |
1.1 bertrand 1: /*
2: ================================================================================
1.36 ! bertrand 3: RPL/2 (R) version 4.1.5
1.21 bertrand 4: Copyright (C) 1989-2011 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 'trn'
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_trn(struct_processus *s_etat_processus)
40: {
41: struct_objet *s_objet_argument;
42: struct_objet *s_objet_resultat;
43:
44: logical1 argument_nom;
45: logical1 variable_partagee;
46:
47: unsigned long i;
48: unsigned long j;
49:
50: (*s_etat_processus).erreur_execution = d_ex;
51:
52: if ((*s_etat_processus).affichage_arguments == 'Y')
53: {
54: printf("\n TRN ");
55:
56: if ((*s_etat_processus).langue == 'F')
57: {
58: printf("(transposition)\n\n");
59: }
60: else
61: {
62: printf("(transposition)\n\n");
63: }
64:
65: printf(" 1: %s, %s, %s\n", d_MIN, d_MRL, d_MCX);
66: printf("-> 1: %s, %s, %s\n\n", d_MIN, d_MRL, d_MCX);
67:
68: printf(" 1: %s\n", d_NOM);
69:
70: return;
71: }
72: else if ((*s_etat_processus).test_instruction == 'Y')
73: {
74: (*s_etat_processus).nombre_arguments = -1;
75: return;
76: }
77:
78: if (test_cfsf(s_etat_processus, 31) == d_vrai)
79: {
80: if (empilement_pile_last(s_etat_processus, 1) == d_erreur)
81: {
82: return;
83: }
84: }
85:
86: if (depilement(s_etat_processus, &((*s_etat_processus).l_base_pile),
87: &s_objet_argument) == d_erreur)
88: {
89: (*s_etat_processus).erreur_execution = d_ex_manque_argument;
90: return;
91: }
92:
93: variable_partagee = d_faux;
94:
95: if ((*s_objet_argument).type == NOM)
96: {
97: argument_nom = d_vrai;
98:
99: if (recherche_variable(s_etat_processus, (*((struct_nom *)
100: (*s_objet_argument).objet)).nom) == d_faux)
101: {
102: (*s_etat_processus).erreur_systeme = d_es;
103: (*s_etat_processus).erreur_execution = d_ex_variable_non_definie;
104:
105: liberation(s_etat_processus, s_objet_argument);
106:
107: return;
108: }
109:
110: liberation(s_etat_processus, s_objet_argument);
111:
1.25 bertrand 112: if ((*(*s_etat_processus).pointeur_variable_courante)
113: .variable_verrouillee == d_vrai)
1.1 bertrand 114: {
115: (*s_etat_processus).erreur_execution = d_ex_variable_verrouillee;
116: return;
117: }
118:
1.25 bertrand 119: if ((*(*s_etat_processus).pointeur_variable_courante).objet != NULL)
1.1 bertrand 120: {
1.25 bertrand 121: s_objet_argument = (*(*s_etat_processus).pointeur_variable_courante)
122: .objet;
1.1 bertrand 123: }
124: else
125: {
126: if (pthread_mutex_lock(&((*(*s_etat_processus)
127: .s_liste_variables_partagees).mutex)) != 0)
128: {
129: (*s_etat_processus).erreur_systeme = d_es_processus;
130: return;
131: }
132:
133: if (recherche_variable_partagee(s_etat_processus,
1.25 bertrand 134: (*(*s_etat_processus).pointeur_variable_courante).nom,
135: (*(*s_etat_processus).pointeur_variable_courante)
136: .variable_partagee, (*(*s_etat_processus)
137: .pointeur_variable_courante).origine) == d_faux)
1.1 bertrand 138: {
139: if (pthread_mutex_unlock(&((*(*s_etat_processus)
140: .s_liste_variables_partagees).mutex)) != 0)
141: {
142: (*s_etat_processus).erreur_systeme = d_es_processus;
143: return;
144: }
145:
146: (*s_etat_processus).erreur_systeme = d_es;
147: (*s_etat_processus).erreur_execution =
148: d_ex_variable_non_definie;
149:
150: liberation(s_etat_processus, s_objet_argument);
151:
152: return;
153: }
154:
155: variable_partagee = d_vrai;
156: }
157: }
158: else
159: {
160: argument_nom = d_faux;
161: }
162:
163: /*
164: --------------------------------------------------------------------------------
165: Matrice transposée d'une matrice entière
166: --------------------------------------------------------------------------------
167: */
168:
169: if ((*s_objet_argument).type == MIN)
170: {
171: if ((s_objet_resultat = allocation(s_etat_processus, MIN)) == NULL)
172: {
173: if (variable_partagee == d_vrai)
174: {
175: if (pthread_mutex_unlock(&((*(*s_etat_processus)
176: .s_liste_variables_partagees).mutex)) != 0)
177: {
178: (*s_etat_processus).erreur_systeme = d_es_processus;
179: return;
180: }
181: }
182:
183: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
184: return;
185: }
186:
187: (*((struct_matrice *) (*s_objet_resultat).objet)).nombre_lignes =
188: (*((struct_matrice *) (*s_objet_argument).objet))
189: .nombre_colonnes;
190: (*((struct_matrice *) (*s_objet_resultat).objet)).nombre_colonnes =
191: (*((struct_matrice *) (*s_objet_argument).objet))
192: .nombre_lignes;
193:
194: if (((*((struct_matrice *) (*s_objet_resultat).objet)).tableau =
195: malloc((*((struct_matrice *) (*s_objet_resultat).objet))
196: .nombre_lignes * sizeof(integer8 *))) == NULL)
197: {
198: if (variable_partagee == d_vrai)
199: {
200: if (pthread_mutex_unlock(&((*(*s_etat_processus)
201: .s_liste_variables_partagees).mutex)) != 0)
202: {
203: (*s_etat_processus).erreur_systeme = d_es_processus;
204: return;
205: }
206: }
207:
208: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
209: return;
210: }
211:
212: for(i = 0; i < (*((struct_matrice *) (*s_objet_resultat).objet))
213: .nombre_lignes; i++)
214: {
215: if ((((integer8 **) (*((struct_matrice *) (*s_objet_resultat)
216: .objet)).tableau)[i] =
217: malloc((*((struct_matrice *) (*s_objet_resultat).objet))
218: .nombre_colonnes * sizeof(integer8))) == NULL)
219: {
220: if (variable_partagee == d_vrai)
221: {
222: if (pthread_mutex_unlock(&((*(*s_etat_processus)
223: .s_liste_variables_partagees).mutex)) != 0)
224: {
225: (*s_etat_processus).erreur_systeme = d_es_processus;
226: return;
227: }
228: }
229:
230: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
231: return;
232: }
233:
234: for(j = 0; j < (*((struct_matrice *) (*s_objet_resultat).objet))
235: .nombre_colonnes; j++)
236: {
237: ((integer8 **) (*((struct_matrice *) (*s_objet_resultat)
238: .objet)).tableau)[i][j] =
239: ((integer8 **) (*((struct_matrice *)
240: (*s_objet_argument).objet)).tableau)[j][i];
241: }
242: }
243: }
244:
245: /*
246: --------------------------------------------------------------------------------
247: Matrice tranposée d'une matrice réelle
248: --------------------------------------------------------------------------------
249: */
250:
251: else if ((*s_objet_argument).type == MRL)
252: {
253: if ((s_objet_resultat = allocation(s_etat_processus, MRL)) == NULL)
254: {
255: if (variable_partagee == d_vrai)
256: {
257: if (pthread_mutex_unlock(&((*(*s_etat_processus)
258: .s_liste_variables_partagees).mutex)) != 0)
259: {
260: (*s_etat_processus).erreur_systeme = d_es_processus;
261: return;
262: }
263: }
264:
265: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
266: return;
267: }
268:
269: (*((struct_matrice *) (*s_objet_resultat).objet)).nombre_lignes =
270: (*((struct_matrice *) (*s_objet_argument).objet))
271: .nombre_colonnes;
272: (*((struct_matrice *) (*s_objet_resultat).objet)).nombre_colonnes =
273: (*((struct_matrice *) (*s_objet_argument).objet))
274: .nombre_lignes;
275:
276: if (((*((struct_matrice *) (*s_objet_resultat).objet)).tableau =
277: malloc((*((struct_matrice *) (*s_objet_resultat).objet))
278: .nombre_lignes * sizeof(real8 *))) == NULL)
279: {
280: if (variable_partagee == d_vrai)
281: {
282: if (pthread_mutex_unlock(&((*(*s_etat_processus)
283: .s_liste_variables_partagees).mutex)) != 0)
284: {
285: (*s_etat_processus).erreur_systeme = d_es_processus;
286: return;
287: }
288: }
289:
290: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
291: return;
292: }
293:
294: for(i = 0; i < (*((struct_matrice *) (*s_objet_resultat).objet))
295: .nombre_lignes; i++)
296: {
297: if ((((real8 **) (*((struct_matrice *) (*s_objet_resultat)
298: .objet)).tableau)[i] =
299: malloc((*((struct_matrice *) (*s_objet_resultat).objet))
300: .nombre_colonnes * sizeof(real8))) == NULL)
301: {
302: if (variable_partagee == d_vrai)
303: {
304: if (pthread_mutex_unlock(&((*(*s_etat_processus)
305: .s_liste_variables_partagees).mutex)) != 0)
306: {
307: (*s_etat_processus).erreur_systeme = d_es_processus;
308: return;
309: }
310: }
311:
312: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
313: return;
314: }
315:
316: for(j = 0; j < (*((struct_matrice *) (*s_objet_resultat).objet))
317: .nombre_colonnes; j++)
318: {
319: ((real8 **) (*((struct_matrice *) (*s_objet_resultat)
320: .objet)).tableau)[i][j] =
321: ((real8 **) (*((struct_matrice *)
322: (*s_objet_argument).objet)).tableau)[j][i];
323: }
324: }
325: }
326:
327: /*
328: --------------------------------------------------------------------------------
329: Matrice transposée (et conjuguée) d'une matrice complexe
330: --------------------------------------------------------------------------------
331: */
332:
333: else if ((*s_objet_argument).type == MCX)
334: {
335: if ((s_objet_resultat = allocation(s_etat_processus, MCX)) == NULL)
336: {
337: if (variable_partagee == d_vrai)
338: {
339: if (pthread_mutex_unlock(&((*(*s_etat_processus)
340: .s_liste_variables_partagees).mutex)) != 0)
341: {
342: (*s_etat_processus).erreur_systeme = d_es_processus;
343: return;
344: }
345: }
346:
347: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
348: return;
349: }
350:
351: (*((struct_matrice *) (*s_objet_resultat).objet)).nombre_lignes =
352: (*((struct_matrice *) (*s_objet_argument).objet))
353: .nombre_colonnes;
354: (*((struct_matrice *) (*s_objet_resultat).objet)).nombre_colonnes =
355: (*((struct_matrice *) (*s_objet_argument).objet))
356: .nombre_lignes;
357:
358: if (((*((struct_matrice *) (*s_objet_resultat).objet)).tableau =
359: malloc((*((struct_matrice *) (*s_objet_resultat).objet))
360: .nombre_lignes * sizeof(struct_complexe16 *))) == NULL)
361: {
362: if (variable_partagee == d_vrai)
363: {
364: if (pthread_mutex_unlock(&((*(*s_etat_processus)
365: .s_liste_variables_partagees).mutex)) != 0)
366: {
367: (*s_etat_processus).erreur_systeme = d_es_processus;
368: return;
369: }
370: }
371:
372: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
373: return;
374: }
375:
376: for(i = 0; i < (*((struct_matrice *) (*s_objet_resultat).objet))
377: .nombre_lignes; i++)
378: {
379: if ((((struct_complexe16 **) (*((struct_matrice *)
380: (*s_objet_resultat).objet)).tableau)[i] =
381: malloc((*((struct_matrice *)
382: (*s_objet_resultat).objet)).nombre_colonnes *
383: sizeof(struct_complexe16))) == NULL)
384: {
385: if (variable_partagee == d_vrai)
386: {
387: if (pthread_mutex_unlock(&((*(*s_etat_processus)
388: .s_liste_variables_partagees).mutex)) != 0)
389: {
390: (*s_etat_processus).erreur_systeme = d_es_processus;
391: return;
392: }
393: }
394:
395: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
396: return;
397: }
398:
399: for(j = 0; j < (*((struct_matrice *) (*s_objet_resultat).objet))
400: .nombre_colonnes; j++)
401: {
402: ((struct_complexe16 **) (*((struct_matrice *)
403: (*s_objet_resultat).objet)).tableau)[i][j]
404: .partie_reelle =
405: ((struct_complexe16 **) (*((struct_matrice *)
406: (*s_objet_argument).objet)).tableau)[j][i]
407: .partie_reelle;
408: ((struct_complexe16 **) (*((struct_matrice *)
409: (*s_objet_resultat).objet)).tableau)[i][j]
410: .partie_imaginaire =
411: -((struct_complexe16 **) (*((struct_matrice *)
412: (*s_objet_argument).objet)).tableau)[j][i]
413: .partie_imaginaire;
414: }
415: }
416: }
417:
418: /*
419: --------------------------------------------------------------------------------
420: Fonction transposée impossible à réaliser
421: --------------------------------------------------------------------------------
422: */
423:
424: else
425: {
426: if (argument_nom == d_faux)
427: {
428: liberation(s_etat_processus, s_objet_argument);
429: }
430:
431: if (variable_partagee == d_vrai)
432: {
433: if (pthread_mutex_unlock(&((*(*s_etat_processus)
434: .s_liste_variables_partagees).mutex)) != 0)
435: {
436: (*s_etat_processus).erreur_systeme = d_es_processus;
437: return;
438: }
439: }
440:
441: (*s_etat_processus).erreur_execution = d_ex_erreur_type_argument;
442: return;
443: }
444:
445: liberation(s_etat_processus, s_objet_argument);
446:
447: if (argument_nom == d_faux)
448: {
449: if (empilement(s_etat_processus, &((*s_etat_processus).l_base_pile),
450: s_objet_resultat) == d_erreur)
451: {
452: return;
453: }
454: }
455: else
456: {
457: if (variable_partagee == d_vrai)
458: {
459: (*(*s_etat_processus).s_liste_variables_partagees).table
460: [(*(*s_etat_processus).s_liste_variables_partagees)
461: .position_variable].objet = s_objet_resultat;
462:
463: if (pthread_mutex_unlock(&((*(*s_etat_processus)
464: .s_liste_variables_partagees).mutex)) != 0)
465: {
466: (*s_etat_processus).erreur_systeme = d_es_processus;
467: return;
468: }
469: }
470: else
471: {
1.25 bertrand 472: (*(*s_etat_processus).pointeur_variable_courante).objet =
1.1 bertrand 473: s_objet_resultat;
474: }
475: }
476:
477: return;
478: }
479:
480:
481: /*
482: ================================================================================
483: Fonction 'tot'
484: ================================================================================
485: Entrées : pointeur sur une structure struct_processus
486: --------------------------------------------------------------------------------
487: Sorties :
488: --------------------------------------------------------------------------------
489: Effets de bord : néant
490: ================================================================================
491: */
492:
493: void
494: instruction_tot(struct_processus *s_etat_processus)
495: {
496: struct_objet *s_objet_statistique;
497: struct_objet *s_objet_resultat;
498: struct_objet *s_objet_temporaire;
499:
500: unsigned long nombre_colonnes;
501:
502: (*s_etat_processus).erreur_execution = d_ex;
503:
504: if ((*s_etat_processus).affichage_arguments == 'Y')
505: {
506: printf("\n TOT ");
507:
508: if ((*s_etat_processus).langue == 'F')
509: {
510: printf("(somme des colonnes statistiques)\n\n");
511: }
512: else
513: {
514: printf("(sum of statistical columns)\n\n");
515: }
516:
517: printf("-> 1: %s, %s, %s, %s\n", d_INT, d_REL, d_VIN, d_REL);
518:
519: return;
520: }
521: else if ((*s_etat_processus).test_instruction == 'Y')
522: {
523: (*s_etat_processus).nombre_arguments = -1;
524: return;
525: }
526:
527: if (test_cfsf(s_etat_processus, 31) == d_vrai)
528: {
529: if (empilement_pile_last(s_etat_processus, 0) == d_erreur)
530: {
531: return;
532: }
533: }
534:
535: /*
536: * Recherche d'une variable globale référencée par SIGMA
537: */
538:
1.25 bertrand 539: if (recherche_variable_globale(s_etat_processus, ds_sdat) == d_faux)
1.1 bertrand 540: {
541: /*
542: * Aucune variable SIGMA
543: */
544:
545: (*s_etat_processus).erreur_systeme = d_es;
1.25 bertrand 546:
547: if ((*s_etat_processus).erreur_execution == d_ex)
548: {
549: (*s_etat_processus).erreur_execution = d_ex_absence_observations;
550: }
551:
1.1 bertrand 552: return;
553: }
554: else
555: {
1.25 bertrand 556: if (((*(*(*s_etat_processus).pointeur_variable_courante).objet)
557: .type != MIN) && ((*(*(*s_etat_processus)
558: .pointeur_variable_courante).objet).type != MRL))
1.1 bertrand 559: {
1.25 bertrand 560: (*s_etat_processus).erreur_execution =
561: d_ex_matrice_statistique_invalide;
1.1 bertrand 562: return;
563: }
564:
1.25 bertrand 565: nombre_colonnes = (*((struct_matrice *) (*(*(*s_etat_processus)
566: .pointeur_variable_courante).objet).objet)).nombre_colonnes;
1.1 bertrand 567: }
568:
569: if (nombre_colonnes == 0)
570: {
571: (*s_etat_processus).erreur_execution =
572: d_ex_matrice_statistique_invalide;
573: return;
574: }
575:
1.25 bertrand 576: s_objet_statistique = (*(*s_etat_processus).pointeur_variable_courante)
577: .objet;
1.1 bertrand 578:
579: if (((*s_objet_statistique).type == MIN) ||
580: ((*s_objet_statistique).type == MRL))
581: {
582: if ((s_objet_resultat = allocation(s_etat_processus, NON)) == NULL)
583: {
584: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
585: return;
586: }
587:
588: if (((*s_objet_resultat).objet = sommation_statistique(
589: (struct_matrice *) (*s_objet_statistique).objet)) == NULL)
590: {
591: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
592: return;
593: }
594:
595: if (nombre_colonnes == 1)
596: {
597: if ((*((struct_vecteur *) (*s_objet_resultat).objet)).type == 'I')
598: {
599: (*s_objet_resultat).type = VIN;
600: s_objet_temporaire = s_objet_resultat;
601:
602: if ((s_objet_resultat = allocation(s_etat_processus, INT))
603: == NULL)
604: {
605: (*s_etat_processus).erreur_systeme =
606: d_es_allocation_memoire;
607: return;
608: }
609:
610: (*((integer8 *) (*s_objet_resultat).objet)) =
611: ((integer8 *) (*((struct_vecteur *)
612: (*s_objet_temporaire).objet)).tableau)[0];
613:
614: liberation(s_etat_processus, s_objet_temporaire);
615: }
616: else
617: {
618: (*s_objet_resultat).type = VRL;
619: s_objet_temporaire = s_objet_resultat;
620:
621: if ((s_objet_resultat = allocation(s_etat_processus, REL))
622: == NULL)
623: {
624: (*s_etat_processus).erreur_systeme =
625: d_es_allocation_memoire;
626: return;
627: }
628:
629: (*((real8 *) (*s_objet_resultat).objet)) =
630: ((real8 *) (*((struct_vecteur *)
631: (*s_objet_temporaire).objet)).tableau)[0];
632:
633: liberation(s_etat_processus, s_objet_temporaire);
634: }
635: }
636: else
637: {
638: if ((*((struct_vecteur *) (*s_objet_resultat).objet)).type == 'I')
639: {
640: (*s_objet_resultat).type = VIN;
641: }
642: else
643: {
644: (*s_objet_resultat).type = VRL;
645: }
646: }
647:
648: if (empilement(s_etat_processus, &((*s_etat_processus).l_base_pile),
649: s_objet_resultat) == d_erreur)
650: {
651: return;
652: }
653: }
654: else
655: {
656: (*s_etat_processus).erreur_execution =
657: d_ex_matrice_statistique_invalide;
658: return;
659: }
660:
661: return;
662: }
663:
664:
665: /*
666: ================================================================================
667: Fonction 'title'
668: ================================================================================
669: Entrées :
670: --------------------------------------------------------------------------------
671: Sorties :
672: --------------------------------------------------------------------------------
673: Effets de bord : néant
674: ================================================================================
675: */
676:
677: void
678: instruction_title(struct_processus *s_etat_processus)
679: {
680: struct_objet *s_objet;
681:
682: (*s_etat_processus).erreur_execution = d_ex;
683:
684: if ((*s_etat_processus).affichage_arguments == 'Y')
685: {
686: printf("\n TITLE ");
687:
688: if ((*s_etat_processus).langue == 'F')
689: {
690: printf("(titre d'un graphique)\n\n");
691: }
692: else
693: {
694: printf("(title of graphic)\n\n");
695: }
696:
697: printf(" 1: %s\n", d_CHN);
698:
699: return;
700: }
701: else if ((*s_etat_processus).test_instruction == 'Y')
702: {
703: (*s_etat_processus).nombre_arguments = -1;
704: return;
705: }
706:
707: if (test_cfsf(s_etat_processus, 31) == d_vrai)
708: {
709: if (empilement_pile_last(s_etat_processus, 1) == d_erreur)
710: {
711: return;
712: }
713: }
714:
715: if (depilement(s_etat_processus, &((*s_etat_processus).l_base_pile),
716: &s_objet) == d_erreur)
717: {
718: (*s_etat_processus).erreur_execution = d_ex_manque_argument;
719: return;
720: }
721:
722: if ((*s_objet).type == CHN)
723: {
724: free((*s_etat_processus).titre);
725:
726: if (((*s_etat_processus).titre = malloc((strlen((unsigned char *)
727: (*s_objet).objet) + 1) * sizeof(unsigned char))) == NULL)
728: {
729: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
730: return;
731: }
732:
733: strcpy((*s_etat_processus).titre, (unsigned char *) (*s_objet).objet);
734: liberation(s_etat_processus, s_objet);
735: }
736: else
737: {
738: liberation(s_etat_processus, s_objet);
739:
740: (*s_etat_processus).erreur_execution = d_ex_erreur_type_argument;
741: return;
742: }
743:
744: if (test_cfsf(s_etat_processus, 52) == d_faux)
745: {
746: if ((*s_etat_processus).fichiers_graphiques != NULL)
747: {
748: appel_gnuplot(s_etat_processus, 'N');
749: }
750: }
751:
752: return;
753: }
754:
755:
756: /*
757: ================================================================================
758: Fonction 'time'
759: ================================================================================
760: Entrées :
761: --------------------------------------------------------------------------------
762: Sorties :
763: --------------------------------------------------------------------------------
764: Effets de bord : néant
765: ================================================================================
766: */
767:
768: void
769: instruction_time(struct_processus *s_etat_processus)
770: {
771: struct rusage s_usage_processus_fils;
772: struct rusage s_usage_processus_pere;
773:
774: struct_liste_chainee *l_element_courant;
775:
776: struct_objet *s_objet;
777:
778: (*s_etat_processus).erreur_execution = d_ex;
779:
780: if ((*s_etat_processus).affichage_arguments == 'Y')
781: {
782: printf("\n TIME ");
783:
784: if ((*s_etat_processus).langue == 'F')
785: {
786: printf("(temps CPU)\n\n");
787: }
788: else
789: {
790: printf("(CPU time)\n\n");
791: }
792:
793: printf("-> 1: %s\n", d_LST);
794:
795: return;
796: }
797: else if ((*s_etat_processus).test_instruction == 'Y')
798: {
799: (*s_etat_processus).nombre_arguments = -1;
800: return;
801: }
802:
803: if (test_cfsf(s_etat_processus, 31) == d_vrai)
804: {
805: if (empilement_pile_last(s_etat_processus, 0) == d_erreur)
806: {
807: return;
808: }
809: }
810:
811: /*
812: * Lecture des différents temps
813: */
814:
1.15 bertrand 815: # ifndef OS2
1.1 bertrand 816: if ((getrusage(RUSAGE_SELF, &s_usage_processus_pere)) != 0)
817: {
818: (*s_etat_processus).erreur_systeme = d_es_processus;
819: return;
820: }
821:
822: if ((getrusage(RUSAGE_CHILDREN, &s_usage_processus_fils)) != 0)
823: {
824: (*s_etat_processus).erreur_systeme = d_es_processus;
825: return;
826: }
1.15 bertrand 827: # else
828: s_usage_processus_pere.ru_utime.tv_sec = 0;
829: s_usage_processus_pere.ru_utime.tv_usec = 0;
830: s_usage_processus_pere.ru_stime.tv_sec = 0;
831: s_usage_processus_pere.ru_stime.tv_usec = 0;
832: s_usage_processus_fils.ru_utime.tv_sec = 0;
833: s_usage_processus_fils.ru_utime.tv_usec = 0;
834: s_usage_processus_fils.ru_stime.tv_sec = 0;
835: s_usage_processus_fils.ru_stime.tv_usec = 0;
836: # endif
1.1 bertrand 837:
838: /*
839: * Initialisation de la liste
840: */
841:
842: if ((s_objet = allocation(s_etat_processus, LST)) == NULL)
843: {
844: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
845: return;
846: }
847:
848: /*
849: * User time du processus père (séquenceur)
850: */
851:
852: if ((l_element_courant = allocation_maillon(s_etat_processus)) == NULL)
853: {
854: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
855: return;
856: }
857:
858: (*s_objet).objet = l_element_courant;
859:
860: if (((*l_element_courant).donnee = allocation(s_etat_processus, REL))
861: == NULL)
862: {
863: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
864: return;
865: }
866:
867: (*((real8 *) (*(*l_element_courant).donnee).objet)) =
868: s_usage_processus_pere.ru_utime.tv_sec +
869: (((real8) s_usage_processus_pere.ru_utime.tv_usec) /
870: ((real8) 1E6));
871:
872: /*
873: * System time du processus père
874: */
875:
876: if (((*l_element_courant).suivant =
877: allocation_maillon(s_etat_processus)) == NULL)
878: {
879: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
880: return;
881: }
882:
883: l_element_courant = (*l_element_courant).suivant;
884:
885: if (((*l_element_courant).donnee = allocation(s_etat_processus, REL))
886: == NULL)
887: {
888: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
889: return;
890: }
891:
892: (*((real8 *) (*(*l_element_courant).donnee).objet)) =
893: s_usage_processus_pere.ru_stime.tv_sec +
894: (((real8) s_usage_processus_pere.ru_stime.tv_usec) /
895: ((real8) 1E6));
896:
897: /*
898: * User time des processus fils achevés
899: */
900:
901: if (((*l_element_courant).suivant =
902: allocation_maillon(s_etat_processus)) == NULL)
903: {
904: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
905: return;
906: }
907:
908: l_element_courant = (*l_element_courant).suivant;
909:
910: if (((*l_element_courant).donnee = allocation(s_etat_processus, REL))
911: == NULL)
912: {
913: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
914: return;
915: }
916:
917: (*((real8 *) (*(*l_element_courant).donnee).objet)) =
918: s_usage_processus_fils.ru_utime.tv_sec +
919: (((real8) s_usage_processus_fils.ru_utime.tv_usec) /
920: ((real8) 1E6));
921:
922: /*
923: * System time des processus fils achevés
924: */
925:
926: if (((*l_element_courant).suivant =
927: allocation_maillon(s_etat_processus)) == NULL)
928: {
929: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
930: return;
931: }
932:
933: l_element_courant = (*l_element_courant).suivant;
934:
935: if (((*l_element_courant).donnee = allocation(s_etat_processus, REL))
936: == NULL)
937: {
938: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
939: return;
940: }
941:
942: (*((real8 *) (*(*l_element_courant).donnee).objet)) =
943: s_usage_processus_fils.ru_stime.tv_sec +
944: (((real8) s_usage_processus_fils.ru_stime.tv_usec) /
945: ((real8) 1E6));
946:
947: /*
948: * Fermeture de la liste
949: */
950:
951: (*l_element_courant).suivant = NULL;
952:
953: /*
954: * Empilement du résultat
955: */
956:
957: if (empilement(s_etat_processus, &((*s_etat_processus).l_base_pile),
958: s_objet) == d_erreur)
959: {
960: return;
961: }
962:
963: return;
964: }
965:
966:
967: /*
968: ================================================================================
969: Fonction 'taylr'
970: ================================================================================
971: Entrées :
972: --------------------------------------------------------------------------------
973: Sorties :
974: --------------------------------------------------------------------------------
975: Effets de bord : néant
976: ================================================================================
977: */
978:
979: void
980: instruction_taylr(struct_processus *s_etat_processus)
981: {
982: integer8 i;
983:
984: logical1 last_valide;
985: logical1 zero;
986:
987: struct_liste_chainee *l_element_courant;
988:
989: struct_objet *s_objet_argument;
990: struct_objet *s_objet_argument_1;
991: struct_objet *s_objet_argument_2;
992: struct_objet *s_objet_argument_3;
993: struct_objet *s_objet_argument_4;
994: struct_objet *s_objet_resultat;
995: struct_objet *s_objet_variable_derivation;
996:
997: struct_variable s_variable;
998:
999: (*s_etat_processus).erreur_execution = d_ex;
1000:
1001: if ((*s_etat_processus).affichage_arguments == 'Y')
1002: {
1003: printf("\n TAYLR ");
1004:
1005: if ((*s_etat_processus).langue == 'F')
1006: {
1007: printf("(série de Taylor)\n\n");
1008: }
1009: else
1010: {
1011: printf("(Taylor serie)\n\n");
1012: }
1013:
1014: printf(" 4: %s\n", d_ALG);
1015: printf(" 3: %s\n", d_NOM);
1016: printf(" 2: %s, %s\n", d_INT, d_REL);
1017: printf(" 1: %s\n", d_INT);
1018: printf("-> 1: %s\n\n", d_ALG);
1019:
1020: return;
1021: }
1022: else if ((*s_etat_processus).test_instruction == 'Y')
1023: {
1024: (*s_etat_processus).nombre_arguments = -1;
1025: return;
1026: }
1027:
1028: if ((last_valide = test_cfsf(s_etat_processus, 31)) == d_vrai)
1029: {
1030: if (empilement_pile_last(s_etat_processus, 4) == d_erreur)
1031: {
1032: return;
1033: }
1034: }
1035:
1036: if (depilement(s_etat_processus, &((*s_etat_processus).l_base_pile),
1037: &s_objet_argument_1) == d_erreur)
1038: {
1039: (*s_etat_processus).erreur_execution = d_ex_manque_argument;
1040: return;
1041: }
1042:
1043: if (depilement(s_etat_processus, &((*s_etat_processus).l_base_pile),
1044: &s_objet_argument_2) == d_erreur)
1045: {
1046: liberation(s_etat_processus, s_objet_argument_1);
1047:
1048: (*s_etat_processus).erreur_execution = d_ex_manque_argument;
1049: return;
1050: }
1051:
1052: if (depilement(s_etat_processus, &((*s_etat_processus).l_base_pile),
1053: &s_objet_argument_3) == d_erreur)
1054: {
1055: liberation(s_etat_processus, s_objet_argument_1);
1056: liberation(s_etat_processus, s_objet_argument_2);
1057:
1058: (*s_etat_processus).erreur_execution = d_ex_manque_argument;
1059: return;
1060: }
1061:
1062: if (depilement(s_etat_processus, &((*s_etat_processus).l_base_pile),
1063: &s_objet_argument_4) == d_erreur)
1064: {
1065: liberation(s_etat_processus, s_objet_argument_1);
1066: liberation(s_etat_processus, s_objet_argument_2);
1067: liberation(s_etat_processus, s_objet_argument_3);
1068: liberation(s_etat_processus, s_objet_argument_4);
1069:
1070: (*s_etat_processus).erreur_execution = d_ex_manque_argument;
1071: return;
1072: }
1073:
1074: if (((*s_objet_argument_4).type == ALG) &&
1075: ((*s_objet_argument_3).type == NOM) &&
1076: (((*s_objet_argument_2).type == INT) ||
1077: ((*s_objet_argument_2).type == REL)) &&
1078: ((*s_objet_argument_1).type == INT))
1079: {
1080: if ((*((integer8 *) (*s_objet_argument_1).objet)) <= 0)
1081: {
1082: liberation(s_etat_processus, s_objet_argument_1);
1083: liberation(s_etat_processus, s_objet_argument_2);
1084: liberation(s_etat_processus, s_objet_argument_3);
1085: liberation(s_etat_processus, s_objet_argument_4);
1086:
1087: (*s_etat_processus).erreur_execution = d_ex_argument_invalide;
1088: return;
1089: }
1090:
1091: if ((*s_objet_argument_2).type == REL)
1092: {
1093: if ((*((real8 *) (*s_objet_argument_2).objet)) == 0)
1094: {
1095: zero = d_vrai;
1096: }
1097: else
1098: {
1099: zero = d_faux;
1100: }
1101: }
1102: else
1103: {
1104: if ((*((integer8 *) (*s_objet_argument_2).objet)) == 0)
1105: {
1106: zero = d_vrai;
1107: }
1108: else
1109: {
1110: zero = d_faux;
1111: }
1112: }
1113:
1114: /*
1115: * Conversion du drapeau symbole des variables symboliques
1116: */
1117:
1118: l_element_courant = (*s_objet_argument_4).objet;
1119:
1120: while(l_element_courant != NULL)
1121: {
1122: if ((*(*l_element_courant).donnee).type == NOM)
1123: {
1124: if (strcmp((*((struct_nom *) (*(*l_element_courant).donnee)
1125: .objet)).nom, (*((struct_nom *) (*s_objet_argument_3)
1126: .objet)).nom) == 0)
1127: {
1128: (*((struct_nom *) (*(*l_element_courant).donnee).objet))
1129: .symbole = d_faux;
1130: }
1131: }
1132:
1133: l_element_courant = (*l_element_courant).suivant;
1134: }
1135:
1136: /*
1137: * Création de la variable locale et initialisation
1138: */
1139:
1140: (*s_etat_processus).niveau_courant++;
1141:
1142: if ((s_variable.nom = malloc((strlen((*((struct_nom *)
1143: (*s_objet_argument_3).objet)).nom) + 1) *
1144: sizeof(unsigned char))) == NULL)
1145: {
1146: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
1147: return;
1148: }
1149:
1150: s_variable.niveau = (*s_etat_processus).niveau_courant;
1151: strcpy(s_variable.nom, (*((struct_nom *) (*s_objet_argument_3)
1152: .objet)).nom);
1153:
1154: if ((s_variable.objet = copie_objet(s_etat_processus,
1155: s_objet_argument_2, 'O')) == NULL)
1156: {
1157: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
1158: return;
1159: }
1160:
1161: if (creation_variable(s_etat_processus, &s_variable, 'V', 'P')
1162: == d_erreur)
1163: {
1164: return;
1165: }
1166:
1167: /*
1168: * Création de la série
1169: */
1170:
1171: if ((s_objet_resultat = allocation(s_etat_processus, ALG)) == NULL)
1172: {
1173: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
1174: return;
1175: }
1176:
1177: if (((*s_objet_resultat).objet =
1178: allocation_maillon(s_etat_processus)) == NULL)
1179: {
1180: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
1181: return;
1182: }
1183:
1184: l_element_courant = (*s_objet_resultat).objet;
1185:
1186: if (((*l_element_courant).donnee = allocation(s_etat_processus, FCT))
1187: == NULL)
1188: {
1189: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
1190: return;
1191: }
1192:
1193: (*((struct_fonction *) (*(*l_element_courant).donnee).objet))
1194: .nombre_arguments = 0;
1195: (*((struct_fonction *) (*(*l_element_courant).donnee).objet))
1196: .fonction = instruction_vers_niveau_superieur;
1197:
1198: if (((*((struct_fonction *) (*(*l_element_courant).donnee).objet))
1199: .nom_fonction = malloc(3 * sizeof(unsigned char))) == NULL)
1200: {
1201: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
1202: return;
1203: }
1204:
1205: strcpy((*((struct_fonction *) (*(*l_element_courant).donnee).objet))
1206: .nom_fonction, "<<");
1207:
1208: if (last_valide == d_vrai)
1209: {
1210: cf(s_etat_processus, 31);
1211: }
1212:
1213: /*
1214: * Calcul de la série de Taylor
1215: *
1216: * s(x) = \sum_{i=0}{n} (1/i!)*((d^i f(x=a))/d(x^i)*(x-a)^i)
1217: */
1218:
1219: for(i = 0; (i <= (*((integer8 *) (*s_objet_argument_1).objet))) &&
1220: ((*s_etat_processus).var_volatile_requete_arret == 0); i++)
1221: {
1222: /*
1223: * Calcul de ((d^i f(x=a))/d(x^i)*(x-a)^i)/i!
1224: */
1225:
1226: if (i != 0)
1227: {
1228: // Calcul de la valeur de la dérivée n-ième
1229: // Expression empilée puis dérivée et sauvegardée dans
1230: // s_argument_4.
1231:
1232: if (empilement(s_etat_processus, &((*s_etat_processus)
1233: .l_base_pile), s_objet_argument_4) == d_erreur)
1234: {
1235: if (last_valide == d_vrai)
1236: {
1237: sf(s_etat_processus, 31);
1238: }
1239:
1240: return;
1241: }
1242:
1243: if ((s_objet_variable_derivation =
1244: copie_objet(s_etat_processus, s_objet_argument_3, 'O'))
1245: == NULL)
1246: {
1247: (*s_etat_processus).erreur_systeme =
1248: d_es_allocation_memoire;
1249: return;
1250: }
1251:
1252: if (empilement(s_etat_processus, &((*s_etat_processus)
1253: .l_base_pile), s_objet_variable_derivation) == d_erreur)
1254: {
1255: if (last_valide == d_vrai)
1256: {
1257: sf(s_etat_processus, 31);
1258: }
1259:
1260: return;
1261: }
1262:
1263: instruction_der(s_etat_processus);
1264:
1265: if ((*s_etat_processus).erreur_execution != d_ex)
1266: {
1267: liberation(s_etat_processus, s_objet_argument_1);
1268: liberation(s_etat_processus, s_objet_argument_2);
1269: liberation(s_etat_processus, s_objet_argument_3);
1270:
1271: (*l_element_courant).suivant = NULL;
1272:
1273: liberation(s_etat_processus, s_objet_resultat);
1274:
1275: if (last_valide == d_vrai)
1276: {
1277: sf(s_etat_processus, 31);
1278: }
1279:
1280: return;
1281: }
1282: else if ((*s_etat_processus).erreur_systeme != d_es)
1283: {
1284: return;
1285: }
1286:
1287: if ((*s_etat_processus).var_volatile_requete_arret != 0)
1288: {
1289: /*
1290: * instruction_der() n'a rien renvoyé dans la pile. On
1291: * injecte une valeur nulle dans s_objet_argument_4.
1292: */
1293:
1294: if ((s_objet_argument_4 = allocation(s_etat_processus,
1295: INT)) == NULL)
1296: {
1297: (*s_etat_processus).erreur_systeme =
1298: d_es_allocation_memoire;
1299: return;
1300: }
1301: }
1302: else if (depilement(s_etat_processus, &((*s_etat_processus)
1303: .l_base_pile), &s_objet_argument_4) == d_erreur)
1304: {
1305: liberation(s_etat_processus, s_objet_argument_1);
1306: liberation(s_etat_processus, s_objet_argument_2);
1307: liberation(s_etat_processus, s_objet_argument_3);
1308:
1309: (*l_element_courant).suivant = NULL;
1310:
1311: liberation(s_etat_processus, s_objet_resultat);
1312:
1313: if (last_valide == d_vrai)
1314: {
1315: sf(s_etat_processus, 31);
1316: }
1317:
1318: (*s_etat_processus).erreur_execution = d_ex_manque_argument;
1319: return;
1320: }
1321: }
1322:
1323: if (evaluation(s_etat_processus, s_objet_argument_4, 'E')
1324: == d_erreur)
1325: {
1326: liberation(s_etat_processus, s_objet_argument_1);
1327: liberation(s_etat_processus, s_objet_argument_2);
1328: liberation(s_etat_processus, s_objet_argument_3);
1329: liberation(s_etat_processus, s_objet_argument_4);
1330:
1331: (*l_element_courant).suivant = NULL;
1332:
1333: liberation(s_etat_processus, s_objet_resultat);
1334:
1335: if (last_valide == d_vrai)
1336: {
1337: sf(s_etat_processus, 31);
1338: }
1339:
1340: return;
1341: }
1342:
1343: // Division par i!
1344:
1345: if (i > 1)
1346: {
1347:
1348: if ((s_objet_argument = allocation(s_etat_processus, INT))
1349: == NULL)
1350: {
1351: (*s_etat_processus).erreur_systeme =
1352: d_es_allocation_memoire;
1353: return;
1354: }
1355:
1356: (*((integer8 *) (*s_objet_argument).objet)) = i;
1357:
1358: if (empilement(s_etat_processus, &((*s_etat_processus)
1359: .l_base_pile), s_objet_argument) == d_erreur)
1360: {
1361: liberation(s_etat_processus, s_objet_argument_1);
1362: liberation(s_etat_processus, s_objet_argument_2);
1363: liberation(s_etat_processus, s_objet_argument_3);
1364: liberation(s_etat_processus, s_objet_argument_4);
1365:
1366: (*l_element_courant).suivant = NULL;
1367:
1368: liberation(s_etat_processus, s_objet_resultat);
1369: liberation(s_etat_processus, s_objet_argument);
1370:
1371: if (last_valide == d_vrai)
1372: {
1373: sf(s_etat_processus, 31);
1374: }
1375:
1376: return;
1377: }
1378:
1379: if (i > 2)
1380: {
1381: instruction_fact(s_etat_processus);
1382:
1383: if ((*s_etat_processus).erreur_execution != d_ex)
1384: {
1385: liberation(s_etat_processus, s_objet_argument_1);
1386: liberation(s_etat_processus, s_objet_argument_2);
1387: liberation(s_etat_processus, s_objet_argument_3);
1388: liberation(s_etat_processus, s_objet_argument_4);
1389:
1390: (*l_element_courant).suivant = NULL;
1391:
1392: liberation(s_etat_processus, s_objet_resultat);
1393:
1394: if (last_valide == d_vrai)
1395: {
1396: sf(s_etat_processus, 31);
1397: }
1398:
1399: return;
1400: }
1401: else if ((*s_etat_processus).erreur_systeme != d_es)
1402: {
1403: return;
1404: }
1405: }
1406:
1407: instruction_division(s_etat_processus);
1408:
1409: if ((*s_etat_processus).erreur_execution != d_ex)
1410: {
1411: liberation(s_etat_processus, s_objet_argument_1);
1412: liberation(s_etat_processus, s_objet_argument_2);
1413: liberation(s_etat_processus, s_objet_argument_3);
1414: liberation(s_etat_processus, s_objet_argument_4);
1415:
1416: (*l_element_courant).suivant = NULL;
1417:
1418: liberation(s_etat_processus, s_objet_resultat);
1419:
1420: if (last_valide == d_vrai)
1421: {
1422: sf(s_etat_processus, 31);
1423: }
1424:
1425: return;
1426: }
1427: else if ((*s_etat_processus).erreur_systeme != d_es)
1428: {
1429: return;
1430: }
1431: }
1432:
1433: if (((*l_element_courant).suivant =
1434: allocation_maillon(s_etat_processus)) == NULL)
1435: {
1436: (*s_etat_processus).erreur_systeme =
1437: d_es_allocation_memoire;
1438: return;
1439: }
1440:
1441: l_element_courant = (*l_element_courant).suivant;
1442:
1443: if (depilement(s_etat_processus, &((*s_etat_processus)
1444: .l_base_pile), &((*l_element_courant).donnee))
1445: == d_erreur)
1446: {
1447: liberation(s_etat_processus, s_objet_argument_1);
1448: liberation(s_etat_processus, s_objet_argument_2);
1449: liberation(s_etat_processus, s_objet_argument_3);
1450: liberation(s_etat_processus, s_objet_argument_4);
1451:
1452: (*l_element_courant).donnee = NULL;
1453: (*l_element_courant).suivant = NULL;
1454:
1455: liberation(s_etat_processus, s_objet_resultat);
1456:
1457: if (last_valide == d_vrai)
1458: {
1459: sf(s_etat_processus, 31);
1460: }
1461:
1462: (*s_etat_processus).erreur_execution = d_ex_manque_argument;
1463: return;
1464: }
1465:
1466: /*
1467: * Multiplication par le terme (x-a)**i
1468: */
1469:
1470: if (i != 0)
1471: {
1472: if (((*l_element_courant).suivant =
1473: allocation_maillon(s_etat_processus)) == NULL)
1474: {
1475: (*s_etat_processus).erreur_systeme =
1476: d_es_allocation_memoire;
1477: return;
1478: }
1479:
1480: l_element_courant = (*l_element_courant).suivant;
1481:
1482: if (((*l_element_courant).donnee =
1483: copie_objet(s_etat_processus, s_objet_argument_3, 'O'))
1484: == NULL)
1485: {
1486: (*s_etat_processus).erreur_systeme =
1487: d_es_allocation_memoire;
1488: return;
1489: }
1490:
1491: if (zero == d_faux)
1492: {
1493: if (((*l_element_courant).suivant =
1494: allocation_maillon(s_etat_processus)) == NULL)
1495: {
1496: (*s_etat_processus).erreur_systeme =
1497: d_es_allocation_memoire;
1498: return;
1499: }
1500:
1501: l_element_courant = (*l_element_courant).suivant;
1502:
1503: if (((*l_element_courant).donnee =
1504: copie_objet(s_etat_processus, s_objet_argument_2,
1505: 'O')) == NULL)
1506: {
1507: (*s_etat_processus).erreur_systeme =
1508: d_es_allocation_memoire;
1509: return;
1510: }
1511:
1512: if (((*l_element_courant).suivant =
1513: allocation_maillon(s_etat_processus)) == NULL)
1514: {
1515: (*s_etat_processus).erreur_systeme =
1516: d_es_allocation_memoire;
1517: return;
1518: }
1519:
1520: l_element_courant = (*l_element_courant).suivant;
1521:
1522: if (((*l_element_courant).donnee =
1523: allocation(s_etat_processus, FCT)) == NULL)
1524: {
1525: (*s_etat_processus).erreur_systeme =
1526: d_es_allocation_memoire;
1527: return;
1528: }
1529:
1530: (*((struct_fonction *) (*(*l_element_courant).donnee)
1531: .objet)).nombre_arguments = 0;
1532: (*((struct_fonction *) (*(*l_element_courant).donnee)
1533: .objet)).fonction = instruction_moins;
1534:
1535: if (((*((struct_fonction *) (*(*l_element_courant).donnee)
1536: .objet)).nom_fonction = malloc(2 *
1537: sizeof(unsigned char))) == NULL)
1538: {
1539: (*s_etat_processus).erreur_systeme =
1540: d_es_allocation_memoire;
1541: return;
1542: }
1543:
1544: strcpy((*((struct_fonction *) (*(*l_element_courant).donnee)
1545: .objet)).nom_fonction, "-");
1546: }
1547:
1548: if (i > 1)
1549: {
1550: if (((*l_element_courant).suivant =
1551: allocation_maillon(s_etat_processus)) == NULL)
1552: {
1553: (*s_etat_processus).erreur_systeme =
1554: d_es_allocation_memoire;
1555: return;
1556: }
1557:
1558: l_element_courant = (*l_element_courant).suivant;
1559:
1560: if (((*l_element_courant).donnee =
1561: allocation(s_etat_processus, INT)) == NULL)
1562: {
1563: (*s_etat_processus).erreur_systeme =
1564: d_es_allocation_memoire;
1565: return;
1566: }
1567:
1568: (*((integer8 *) (*(*l_element_courant).donnee).objet)) = i;
1569:
1570: if (((*l_element_courant).suivant =
1571: allocation_maillon(s_etat_processus)) == NULL)
1572: {
1573: (*s_etat_processus).erreur_systeme =
1574: d_es_allocation_memoire;
1575: return;
1576: }
1577:
1578: l_element_courant = (*l_element_courant).suivant;
1579:
1580: if (((*l_element_courant).donnee =
1581: allocation(s_etat_processus, FCT)) == NULL)
1582: {
1583: (*s_etat_processus).erreur_systeme =
1584: d_es_allocation_memoire;
1585: return;
1586: }
1587:
1588: (*((struct_fonction *) (*(*l_element_courant).donnee)
1589: .objet)).nombre_arguments = 0;
1590: (*((struct_fonction *) (*(*l_element_courant).donnee)
1591: .objet)).fonction = instruction_puissance;
1592:
1593: if (((*((struct_fonction *) (*(*l_element_courant).donnee)
1594: .objet)).nom_fonction = malloc(2 *
1595: sizeof(unsigned char))) == NULL)
1596: {
1597: (*s_etat_processus).erreur_systeme =
1598: d_es_allocation_memoire;
1599: return;
1600: }
1601:
1602: strcpy((*((struct_fonction *) (*(*l_element_courant).donnee)
1603: .objet)).nom_fonction, "^");
1604: }
1605:
1606: if (((*l_element_courant).suivant =
1607: allocation_maillon(s_etat_processus)) == NULL)
1608: {
1609: (*s_etat_processus).erreur_systeme =
1610: d_es_allocation_memoire;
1611: return;
1612: }
1613:
1614: l_element_courant = (*l_element_courant).suivant;
1615:
1616: if (((*l_element_courant).donnee = allocation(s_etat_processus,
1617: FCT)) == NULL)
1618: {
1619: (*s_etat_processus).erreur_systeme =
1620: d_es_allocation_memoire;
1621: return;
1622: }
1623:
1624: (*((struct_fonction *) (*(*l_element_courant).donnee).objet))
1625: .nombre_arguments = 0;
1626: (*((struct_fonction *) (*(*l_element_courant).donnee).objet))
1627: .fonction = instruction_multiplication;
1628:
1629: if (((*((struct_fonction *) (*(*l_element_courant).donnee)
1630: .objet)).nom_fonction = malloc(2 *
1631: sizeof(unsigned char))) == NULL)
1632: {
1633: (*s_etat_processus).erreur_systeme =
1634: d_es_allocation_memoire;
1635: return;
1636: }
1637:
1638: strcpy((*((struct_fonction *) (*(*l_element_courant).donnee)
1639: .objet)).nom_fonction, "*");
1640:
1641: if (((*l_element_courant).suivant =
1642: allocation_maillon(s_etat_processus)) == NULL)
1643: {
1644: (*s_etat_processus).erreur_systeme =
1645: d_es_allocation_memoire;
1646: return;
1647: }
1648:
1649: l_element_courant = (*l_element_courant).suivant;
1650:
1651: if (((*l_element_courant).donnee = allocation(s_etat_processus,
1652: FCT)) == NULL)
1653: {
1654: (*s_etat_processus).erreur_systeme =
1655: d_es_allocation_memoire;
1656: return;
1657: }
1658:
1659: (*((struct_fonction *) (*(*l_element_courant).donnee).objet))
1660: .nombre_arguments = 0;
1661: (*((struct_fonction *) (*(*l_element_courant).donnee).objet))
1662: .fonction = instruction_plus;
1663:
1664: if (((*((struct_fonction *) (*(*l_element_courant).donnee)
1665: .objet)).nom_fonction = malloc(2 *
1666: sizeof(unsigned char))) == NULL)
1667: {
1668: (*s_etat_processus).erreur_systeme =
1669: d_es_allocation_memoire;
1670: return;
1671: }
1672:
1673: strcpy((*((struct_fonction *) (*(*l_element_courant).donnee)
1674: .objet)).nom_fonction, "+");
1675: }
1676: }
1677:
1678: /*
1679: * Fermeture de l'expression
1680: */
1681:
1682: if (last_valide == d_vrai)
1683: {
1684: sf(s_etat_processus, 31);
1685: }
1686:
1687: if (((*l_element_courant).suivant =
1688: allocation_maillon(s_etat_processus)) == NULL)
1689: {
1690: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
1691: return;
1692: }
1693:
1694: l_element_courant = (*l_element_courant).suivant;
1695:
1696: if (((*l_element_courant).donnee = allocation(s_etat_processus, FCT))
1697: == NULL)
1698: {
1699: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
1700: return;
1701: }
1702:
1703: (*((struct_fonction *) (*(*l_element_courant).donnee).objet))
1704: .nombre_arguments = 0;
1705: (*((struct_fonction *) (*(*l_element_courant).donnee).objet))
1706: .fonction = instruction_vers_niveau_inferieur;
1707:
1708: if (((*((struct_fonction *) (*(*l_element_courant).donnee).objet))
1709: .nom_fonction = malloc(3 * sizeof(unsigned char))) == NULL)
1710: {
1711: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
1712: return;
1713: }
1714:
1715: strcpy((*((struct_fonction *) (*(*l_element_courant).donnee).objet))
1716: .nom_fonction, ">>");
1717:
1718: (*l_element_courant).suivant = NULL;
1719:
1720: /*
1721: * Destruction de la variable locale
1722: */
1723:
1724: (*s_etat_processus).niveau_courant--;
1725:
1726: if (retrait_variable(s_etat_processus, (*((struct_nom *)
1727: (*s_objet_argument_3).objet)).nom, 'L') == d_erreur)
1728: {
1729: liberation(s_etat_processus, s_objet_argument_1);
1730: liberation(s_etat_processus, s_objet_argument_2);
1731: liberation(s_etat_processus, s_objet_argument_3);
1732: liberation(s_etat_processus, s_objet_argument_4);
1733: liberation(s_etat_processus, s_objet_resultat);
1734:
1735: (*s_etat_processus).erreur_execution = d_ex_variable_non_definie;
1736: return;
1737: }
1738: }
1739: else
1740: {
1741: liberation(s_etat_processus, s_objet_argument_1);
1742: liberation(s_etat_processus, s_objet_argument_2);
1743: liberation(s_etat_processus, s_objet_argument_3);
1744: liberation(s_etat_processus, s_objet_argument_4);
1745:
1746: (*s_etat_processus).erreur_execution = d_ex_erreur_type_argument;
1747: return;
1748: }
1749:
1750: liberation(s_etat_processus, s_objet_argument_1);
1751: liberation(s_etat_processus, s_objet_argument_2);
1752: liberation(s_etat_processus, s_objet_argument_3);
1753: liberation(s_etat_processus, s_objet_argument_4);
1754:
1755: if (empilement(s_etat_processus, &((*s_etat_processus).l_base_pile),
1756: s_objet_resultat) == d_erreur)
1757: {
1758: return;
1759: }
1760:
1761: return;
1762: }
1763:
1764:
1765: /*
1766: ================================================================================
1767: Fonction 'target'
1768: ================================================================================
1769: Entrées :
1770: --------------------------------------------------------------------------------
1771: Sorties :
1772: --------------------------------------------------------------------------------
1773: Effets de bord : néant
1774: ================================================================================
1775: */
1776:
1777: void
1778: instruction_target(struct_processus *s_etat_processus)
1779: {
1780: struct_liste_chainee *l_element_courant;
1781:
1782: struct addrinfo *resolution;
1783: struct addrinfo *resolution_courante;
1784:
1785: struct_objet *s_objet_argument_1;
1786: struct_objet *s_objet_argument_2;
1787:
1788: unsigned long i;
1789: unsigned long nombre_elements;
1790:
1791: (*s_etat_processus).erreur_execution = d_ex;
1792:
1793: if ((*s_etat_processus).affichage_arguments == 'Y')
1794: {
1795: printf("\n TARGET ");
1796:
1797: if ((*s_etat_processus).langue == 'F')
1798: {
1799: printf("(cible d'une socket non connectée)\n\n");
1800: }
1801: else
1802: {
1803: printf("(target of unconnected socket)\n\n");
1804: }
1805:
1806: printf(" 2: %s, %s\n", d_CHN, d_LST);
1807: printf(" 1: %s\n", d_SCK);
1808: printf("-> 1: %s\n", d_SCK);
1809:
1810: return;
1811: }
1812: else if ((*s_etat_processus).test_instruction == 'Y')
1813: {
1814: (*s_etat_processus).nombre_arguments = -1;
1815: return;
1816: }
1817:
1818: if (test_cfsf(s_etat_processus, 31) == d_vrai)
1819: {
1820: if (empilement_pile_last(s_etat_processus, 2) == d_erreur)
1821: {
1822: return;
1823: }
1824: }
1825:
1826: if (depilement(s_etat_processus, &((*s_etat_processus).l_base_pile),
1827: &s_objet_argument_1) == d_erreur)
1828: {
1829: (*s_etat_processus).erreur_execution = d_ex_manque_argument;
1830: return;
1831: }
1832:
1833: if (depilement(s_etat_processus, &((*s_etat_processus).l_base_pile),
1834: &s_objet_argument_2) == d_erreur)
1835: {
1836: liberation(s_etat_processus, s_objet_argument_1);
1837:
1838: (*s_etat_processus).erreur_execution = d_ex_manque_argument;
1839: return;
1840: }
1841:
1842: if ((*s_objet_argument_1).type == SCK)
1843: {
1844:
1845: /*
1846: * Vérification du type de socket
1847: */
1848:
1849: if ((strcmp((*((struct_socket *) (*s_objet_argument_1).objet)).type,
1850: "STREAM") == 0) || (strcmp((*((struct_socket *)
1851: (*s_objet_argument_1).objet)).type, "SEQUENTIAL DATAGRAM")
1852: == 0))
1853: {
1854: liberation(s_etat_processus, s_objet_argument_1);
1855: liberation(s_etat_processus, s_objet_argument_2);
1856:
1857: (*s_etat_processus).erreur_execution =
1858: d_ex_erreur_parametre_fichier;
1859: return;
1860: }
1861:
1862: if ((*s_objet_argument_2).type == CHN)
1863: {
1864: /*
1865: * La socket ne peut être que du domaine UNIX
1866: */
1867:
1868: if ((*((struct_socket *) (*s_objet_argument_1).objet)).domaine
1869: != PF_UNIX)
1870: {
1871: liberation(s_etat_processus, s_objet_argument_1);
1872: liberation(s_etat_processus, s_objet_argument_2);
1873:
1874: (*s_etat_processus).erreur_execution =
1875: d_ex_erreur_parametre_fichier;
1876: return;
1877: }
1878:
1879: free((*((struct_socket *) (*s_objet_argument_1).objet))
1880: .adresse_distante);
1881:
1882: if (((*((struct_socket *) (*s_objet_argument_1).objet))
1.5 bertrand 1883: .adresse_distante = transliteration(s_etat_processus,
1884: (unsigned char *) (*s_objet_argument_2).objet,
1885: d_locale, "UTF-8")) == NULL)
1.1 bertrand 1886: {
1.5 bertrand 1887: liberation(s_etat_processus, s_objet_argument_1);
1888: liberation(s_etat_processus, s_objet_argument_2);
1889:
1.1 bertrand 1890: return;
1891: }
1892: }
1893: else if ((*s_objet_argument_2).type == LST)
1894: {
1895: l_element_courant = (struct_liste_chainee *)
1896: (*s_objet_argument_2).objet;
1897: nombre_elements = 0;
1898:
1899: while(l_element_courant != NULL)
1900: {
1901: nombre_elements++;
1902: l_element_courant = (*l_element_courant).suivant;
1903: }
1904:
1905: if (nombre_elements != 2)
1906: {
1907: liberation(s_etat_processus, s_objet_argument_1);
1908: liberation(s_etat_processus, s_objet_argument_2);
1909:
1910: (*s_etat_processus).erreur_execution =
1911: d_ex_erreur_parametre_fichier;
1912: return;
1913: }
1914:
1915: l_element_courant = (struct_liste_chainee *)
1916: (*s_objet_argument_2).objet;
1917:
1918: if ((*(*l_element_courant).donnee).type == VIN)
1919: {
1920: if ((*((struct_vecteur *) (*(*l_element_courant).donnee).objet))
1921: .taille == 4)
1922: {
1923: if ((*((struct_socket *) (*s_objet_argument_1).objet))
1924: .domaine != PF_INET)
1925: {
1926: liberation(s_etat_processus, s_objet_argument_1);
1927: liberation(s_etat_processus, s_objet_argument_2);
1928:
1929: (*s_etat_processus).erreur_execution =
1930: d_ex_erreur_parametre_fichier;
1931: return;
1932: }
1933:
1934: free((*((struct_socket *) (*s_objet_argument_1).objet))
1935: .adresse_distante);
1936:
1937: if (((*((struct_socket *) (*s_objet_argument_1)
1938: .objet)).adresse_distante = malloc(22 *
1939: sizeof(unsigned char))) == NULL)
1940: {
1941: (*s_etat_processus).erreur_systeme =
1942: d_es_allocation_memoire;
1943: return;
1944: }
1945:
1946: (*((struct_socket *) (*s_objet_argument_1).objet))
1947: .adresse_distante[0] = d_code_fin_chaine;
1948:
1949: for(i = 0; i < 4; i++)
1950: {
1951: if ((((integer8 *) (*((struct_vecteur *)
1952: (*(*l_element_courant).donnee).objet)).tableau)
1953: [i] >= 0) && (((integer8 *)
1954: (*((struct_vecteur *) (*(*l_element_courant)
1955: .donnee).objet)).tableau)[i] <= 255))
1956: {
1957: sprintf((*((struct_socket *) (*s_objet_argument_1)
1958: .objet)).adresse_distante,
1959: (i == 0) ? "%s%d" : "%s.%d",
1960: (*((struct_socket *) (*s_objet_argument_1)
1961: .objet)).adresse_distante, (int)
1962: ((integer8 *) (*((struct_vecteur *)
1963: (*(*l_element_courant).donnee).objet))
1964: .tableau)[i]);
1965: }
1966: else
1967: {
1968: liberation(s_etat_processus, s_objet_argument_1);
1969: liberation(s_etat_processus, s_objet_argument_2);
1970:
1971: (*s_etat_processus).erreur_execution =
1972: d_ex_erreur_parametre_fichier;
1973: return;
1974: }
1975: }
1976: }
1977: else if ((*((struct_vecteur *) (*(*l_element_courant).donnee)
1978: .objet)).taille == 16)
1979: {
1980: if ((*((struct_socket *) (*s_objet_argument_1).objet))
1981: .domaine != PF_INET6)
1982: {
1983: liberation(s_etat_processus, s_objet_argument_1);
1984: liberation(s_etat_processus, s_objet_argument_2);
1985:
1986: (*s_etat_processus).erreur_execution =
1987: d_ex_erreur_parametre_fichier;
1988: return;
1989: }
1990:
1991: free((*((struct_socket *) (*s_objet_argument_1).objet))
1992: .adresse_distante);
1993:
1994: if (((*((struct_socket *) (*s_objet_argument_1)
1995: .objet)).adresse_distante = malloc(55 *
1996: sizeof(unsigned char))) == NULL)
1997: {
1998: (*s_etat_processus).erreur_systeme =
1999: d_es_allocation_memoire;
2000: return;
2001: }
2002:
2003: (*((struct_socket *) (*s_objet_argument_1).objet))
2004: .adresse_distante[0] = d_code_fin_chaine;
2005:
2006: for(i = 0; i < 16; i++)
2007: {
2008: if ((((integer8 *) (*((struct_vecteur *)
2009: (*(*l_element_courant).donnee).objet)).tableau)
2010: [i] >= 0) && (((integer8 *)
2011: (*((struct_vecteur *) (*(*l_element_courant)
2012: .donnee).objet)).tableau)[i] <= 255))
2013: {
2014: sprintf((*((struct_socket *) (*s_objet_argument_1)
2015: .objet)).adresse_distante,
2016: (i == 0) ? "%s%d" : "%s:%X",
2017: (*((struct_socket *) (*s_objet_argument_1)
2018: .objet)).adresse_distante, (int)
2019: ((integer8 *) (*((struct_vecteur *)
2020: (*(*l_element_courant).donnee).objet))
2021: .tableau)[i]);
2022: }
2023: else
2024: {
2025: liberation(s_etat_processus, s_objet_argument_1);
2026: liberation(s_etat_processus, s_objet_argument_2);
2027:
2028: (*s_etat_processus).erreur_execution =
2029: d_ex_erreur_parametre_fichier;
2030: return;
2031: }
2032: }
2033: }
2034: else
2035: {
2036: liberation(s_etat_processus, s_objet_argument_1);
2037: liberation(s_etat_processus, s_objet_argument_2);
2038:
2039: (*s_etat_processus).erreur_execution =
2040: d_ex_erreur_parametre_fichier;
2041: return;
2042: }
2043: }
2044: else if ((*(*l_element_courant).donnee).type == CHN)
2045: {
2046: resolution = NULL;
2047:
2048: if (getaddrinfo((unsigned char *) (*(*l_element_courant)
2049: .donnee).objet, NULL, NULL, &resolution) != 0)
2050: {
2051: liberation(s_etat_processus, s_objet_argument_1);
2052: liberation(s_etat_processus, s_objet_argument_2);
2053:
2054: if (resolution != NULL)
2055: {
2056: freeaddrinfo(resolution);
2057: }
2058:
2059: (*s_etat_processus).erreur_execution =
2060: d_ex_erreur_acces_fichier;
2061: return;
2062: }
2063:
2064: if ((*((struct_socket *) (*s_objet_argument_1).objet))
2065: .domaine == PF_INET)
2066: { // Résolution du nom en IPv4
2067: resolution_courante = resolution;
2068:
2069: while(resolution_courante != NULL)
2070: {
2071: if ((*resolution_courante).ai_family == AF_INET)
2072: {
2073: break;
2074: }
2075:
2076: resolution_courante = (*resolution_courante).ai_next;
2077: }
2078:
2079: if (resolution_courante == NULL)
2080: {
2081: liberation(s_etat_processus, s_objet_argument_1);
2082: liberation(s_etat_processus, s_objet_argument_2);
2083:
2084: freeaddrinfo(resolution);
2085:
2086: (*s_etat_processus).erreur_execution =
2087: d_ex_erreur_acces_fichier;
2088: return;
2089: }
2090:
2091: free((*((struct_socket *) (*s_objet_argument_1).objet))
2092: .adresse_distante);
2093:
2094: if (((*((struct_socket *) (*s_objet_argument_1)
2095: .objet)).adresse_distante = malloc(22 *
2096: sizeof(unsigned char))) == NULL)
2097: {
2098: (*s_etat_processus).erreur_systeme =
2099: d_es_allocation_memoire;
2100: return;
2101: }
2102:
2103: sprintf((*((struct_socket *) (*s_objet_argument_1).objet))
2104: .adresse_distante, "%d.%d.%d.%d",
2105: (ntohl((*((struct sockaddr_in *)
2106: (*resolution_courante).ai_addr)).sin_addr.s_addr)
2107: >> 24) & 0xFF,
2108: (ntohl((*((struct sockaddr_in *)
2109: (*resolution_courante).ai_addr)).sin_addr.s_addr)
2110: >> 16) & 0xFF,
2111: (ntohl((*((struct sockaddr_in *)
2112: (*resolution_courante).ai_addr)).sin_addr.s_addr)
2113: >> 8) & 0xFF,
2114: ntohl((*((struct sockaddr_in *)
2115: (*resolution_courante).ai_addr)).sin_addr.s_addr)
2116: & 0xFF);
2117: }
2118: else if ((*((struct_socket *) (*s_objet_argument_1).objet))
2119: .domaine == PF_INET6)
2120: { // Résolution du nom en IPv6
1.13 bertrand 2121: # ifdef IPV6
1.1 bertrand 2122: resolution_courante = resolution;
2123:
2124: while(resolution_courante != NULL)
2125: {
2126: if ((*resolution_courante).ai_family == AF_INET6)
2127: {
2128: break;
2129: }
2130:
2131: resolution_courante = (*resolution_courante).ai_next;
2132: }
2133:
2134: if (resolution_courante == NULL)
2135: {
2136: liberation(s_etat_processus, s_objet_argument_1);
2137: liberation(s_etat_processus, s_objet_argument_2);
2138:
2139: freeaddrinfo(resolution);
2140:
2141: (*s_etat_processus).erreur_execution =
2142: d_ex_erreur_acces_fichier;
2143: return;
2144: }
2145:
2146: if (((*((struct_socket *) (*s_objet_argument_1)
2147: .objet)).adresse_distante = malloc(55 *
2148: sizeof(unsigned char))) == NULL)
2149: {
2150: (*s_etat_processus).erreur_systeme =
2151: d_es_allocation_memoire;
2152: return;
2153: }
2154:
2155: (*((struct_socket *) (*s_objet_argument_1).objet))
2156: .adresse_distante[0] = d_code_fin_chaine;
2157:
2158: for(i = 0; i < 16; i++)
2159: {
2160: sprintf((*((struct_socket *) (*s_objet_argument_1)
2161: .objet)).adresse_distante,
2162: (i == 0) ? "%s%X" : "%s:%X",
2163: (*((struct_socket *) (*s_objet_argument_1)
2164: .objet)).adresse_distante,
2165: (*((struct sockaddr_in6 *)
2166: (*resolution_courante).ai_addr)).sin6_addr
2167: .s6_addr[i]);
2168: }
1.13 bertrand 2169: # else
1.15 bertrand 2170: if ((*s_etat_processus).langue == 'F')
2171: {
2172: printf("+++Attention : Support du protocole"
1.16 bertrand 2173: " IPv6 indisponible\n");
1.15 bertrand 2174: }
2175: else
2176: {
1.17 bertrand 2177: printf("+++Warning : IPv6 support "
1.15 bertrand 2178: "unavailable\n");
2179: }
1.13 bertrand 2180: # endif
1.1 bertrand 2181: }
2182: else
2183: {
2184: liberation(s_etat_processus, s_objet_argument_1);
2185: liberation(s_etat_processus, s_objet_argument_2);
2186:
2187: freeaddrinfo(resolution);
2188:
2189: (*s_etat_processus).erreur_execution =
2190: d_ex_erreur_parametre_fichier;
2191: return;
2192: }
2193:
2194: freeaddrinfo(resolution);
2195: }
2196: else
2197: {
2198: liberation(s_etat_processus, s_objet_argument_1);
2199: liberation(s_etat_processus, s_objet_argument_2);
2200:
2201: (*s_etat_processus).erreur_execution =
2202: d_ex_erreur_parametre_fichier;
2203: return;
2204: }
2205:
2206: l_element_courant = (*l_element_courant).suivant;
2207:
2208: if ((*(*l_element_courant).donnee).type == INT)
2209: {
2210: if (((*((integer8 *) (*(*l_element_courant).donnee).objet))
2211: >= 0) && ((*((integer8 *) (*(*l_element_courant)
2212: .donnee).objet)) <= 65535))
2213: {
2214: sprintf((*((struct_socket *) (*s_objet_argument_1)
2215: .objet)).adresse_distante, "%s(%u)",
2216: (*((struct_socket *) (*s_objet_argument_1)
2217: .objet)).adresse_distante, (unsigned int)
2218: (*((integer8 *) (*(*l_element_courant).donnee)
2219: .objet)));
2220: }
2221: else
2222: {
2223: liberation(s_etat_processus, s_objet_argument_1);
2224: liberation(s_etat_processus, s_objet_argument_2);
2225:
2226: (*s_etat_processus).erreur_execution =
2227: d_ex_erreur_parametre_fichier;
2228: return;
2229: }
2230: }
2231: else
2232: {
2233: liberation(s_etat_processus, s_objet_argument_1);
2234: liberation(s_etat_processus, s_objet_argument_2);
2235:
2236: (*s_etat_processus).erreur_execution =
2237: d_ex_erreur_parametre_fichier;
2238: return;
2239: }
2240: }
2241: else
2242: {
2243: liberation(s_etat_processus, s_objet_argument_1);
2244: liberation(s_etat_processus, s_objet_argument_2);
2245:
2246: (*s_etat_processus).erreur_execution = d_ex_erreur_type_argument;
2247: return;
2248: }
2249: }
2250: else
2251: {
2252: liberation(s_etat_processus, s_objet_argument_1);
2253: liberation(s_etat_processus, s_objet_argument_2);
2254:
2255: (*s_etat_processus).erreur_execution = d_ex_erreur_type_argument;
2256: return;
2257: }
2258:
2259: liberation(s_etat_processus, s_objet_argument_2);
2260:
2261: if (empilement(s_etat_processus, &((*s_etat_processus).l_base_pile),
2262: s_objet_argument_1) == d_erreur)
2263: {
2264: return;
2265: }
2266:
2267: return;
2268: }
2269:
2270:
2271: /*
2272: ================================================================================
2273: Fonction 'tail'
2274: ================================================================================
2275: Entrées :
2276: --------------------------------------------------------------------------------
2277: Sorties :
2278: --------------------------------------------------------------------------------
2279: Effets de bord : néant
2280: ================================================================================
2281: */
2282:
2283: void
2284: instruction_tail(struct_processus *s_etat_processus)
2285: {
2286: integer8 longueur;
2287:
2288: struct_liste_chainee *l_element_courant;
2289:
2290: struct_objet *s_objet_argument;
2291: struct_objet *s_objet_resultat;
2292:
2293: (*s_etat_processus).erreur_execution = d_ex;
2294:
2295: if ((*s_etat_processus).affichage_arguments == 'Y')
2296: {
2297: printf("\n TAIL ");
2298:
2299: if ((*s_etat_processus).langue == 'F')
2300: {
2301: printf("(remplace une liste par tous ses éléments hormis "
2302: "son premier)\n\n");
2303: }
2304: else
2305: {
2306: printf("(replace a list by all but its first element)\n\n");
2307: }
2308:
2309: printf(" 1: %s\n", d_LST);
2310: printf("-> 1: %s\n", d_LST);
2311:
2312: return;
2313: }
2314: else if ((*s_etat_processus).test_instruction == 'Y')
2315: {
2316: (*s_etat_processus).nombre_arguments = -1;
2317: return;
2318: }
2319:
2320: if (test_cfsf(s_etat_processus, 31) == d_vrai)
2321: {
2322: if (empilement_pile_last(s_etat_processus, 1) == d_erreur)
2323: {
2324: return;
2325: }
2326: }
2327:
2328: if (depilement(s_etat_processus, &((*s_etat_processus).l_base_pile),
2329: &s_objet_argument) == d_erreur)
2330: {
2331: (*s_etat_processus).erreur_execution = d_ex_manque_argument;
2332: return;
2333: }
2334:
2335: if ((*s_objet_argument).type == LST)
2336: {
2337: l_element_courant = (*s_objet_argument).objet;
2338: longueur = 0;
2339:
2340: while(l_element_courant != NULL)
2341: {
2342: longueur++;
2343: l_element_courant = (*l_element_courant).suivant;
2344: }
2345:
2346: if (longueur == 0)
2347: {
2348: if ((s_objet_resultat = allocation(s_etat_processus, LST))
2349: == NULL)
2350: {
2351: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
2352: return;
2353: }
2354:
2355: (*s_objet_resultat).objet = NULL;
2356: }
2357: else
2358: {
2359: if ((s_objet_resultat = copie_objet(s_etat_processus,
2360: s_objet_argument, 'N')) == NULL)
2361: {
2362: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
2363: return;
2364: }
2365:
2366: l_element_courant = (*s_objet_resultat).objet;
2367:
2368: (*s_objet_resultat).objet = (*((struct_liste_chainee *)
2369: (*s_objet_resultat).objet)).suivant;
2370:
2371: liberation(s_etat_processus, (*l_element_courant).donnee);
2372: free(l_element_courant);
2373: }
2374: }
2375: else
2376: {
2377: liberation(s_etat_processus, s_objet_argument);
2378:
2379: (*s_etat_processus).erreur_execution = d_ex_erreur_type_argument;
2380: return;
2381: }
2382:
2383: if (empilement(s_etat_processus, &((*s_etat_processus).l_base_pile),
2384: s_objet_resultat) == d_erreur)
2385: {
2386: return;
2387: }
2388:
2389: liberation(s_etat_processus, s_objet_argument);
2390:
2391: return;
2392: }
2393:
2394: // vim: ts=4