1: /*
2: ================================================================================
3: RPL/2 (R) version 4.1.8
4: Copyright (C) 1989-2012 Dr. BERTRAND Joël
5:
6: This file is part of RPL/2.
7:
8: RPL/2 is free software; you can redistribute it and/or modify it
9: under the terms of the CeCILL V2 License as published by the french
10: CEA, CNRS and INRIA.
11:
12: RPL/2 is distributed in the hope that it will be useful, but WITHOUT
13: ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
14: FITNESS FOR A PARTICULAR PURPOSE. See the CeCILL V2 License
15: for more details.
16:
17: You should have received a copy of the CeCILL License
18: along with RPL/2. If not, write to info@cecill.info.
19: ================================================================================
20: */
21:
22:
23: #include "rpl-conv.h"
24:
25:
26: /*
27: ================================================================================
28: Fonction 'sub'
29: ================================================================================
30: Entrées :
31: --------------------------------------------------------------------------------
32: Sorties :
33: --------------------------------------------------------------------------------
34: Effets de bord : néant
35: ================================================================================
36: */
37:
38: void
39: instruction_sub(struct_processus *s_etat_processus)
40: {
41: struct_liste_chainee *l_element_courant;
42: struct_liste_chainee *l_element_precedent;
43:
44: struct_objet *s_copie_argument_3;
45: struct_objet *s_objet_argument_1;
46: struct_objet *s_objet_argument_2;
47: struct_objet *s_objet_argument_3;
48: struct_objet *s_objet_resultat;
49:
50: unsigned char *ptr1;
51: unsigned char *ptr2;
52:
53: unsigned long i;
54:
55: (*s_etat_processus).erreur_execution = d_ex;
56:
57: if ((*s_etat_processus).affichage_arguments == 'Y')
58: {
59: printf("\n SUB ");
60:
61: if ((*s_etat_processus).langue == 'F')
62: {
63: printf("(extraction)\n\n");
64: }
65: else
66: {
67: printf("(suboject extraction)\n\n");
68: }
69:
70: printf(" 3: %s, %s\n", d_CHN, d_LST);
71: printf(" 2: %s\n", d_INT);
72: printf(" 1: %s\n", d_INT);
73: printf("-> 1: %s, %s\n", d_CHN, d_LST);
74:
75: return;
76: }
77: else if ((*s_etat_processus).test_instruction == 'Y')
78: {
79: (*s_etat_processus).nombre_arguments = -1;
80: return;
81: }
82:
83: if (test_cfsf(s_etat_processus, 31) == d_vrai)
84: {
85: if (empilement_pile_last(s_etat_processus, 3) == d_erreur)
86: {
87: return;
88: }
89: }
90:
91: if (depilement(s_etat_processus, &((*s_etat_processus).l_base_pile),
92: &s_objet_argument_1) == d_erreur)
93: {
94: (*s_etat_processus).erreur_execution = d_ex_manque_argument;
95: return;
96: }
97:
98: if (depilement(s_etat_processus, &((*s_etat_processus).l_base_pile),
99: &s_objet_argument_2) == d_erreur)
100: {
101: liberation(s_etat_processus, s_objet_argument_1);
102:
103: (*s_etat_processus).erreur_execution = d_ex_manque_argument;
104: return;
105: }
106:
107: if (depilement(s_etat_processus, &((*s_etat_processus).l_base_pile),
108: &s_objet_argument_3) == d_erreur)
109: {
110: liberation(s_etat_processus, s_objet_argument_1);
111: liberation(s_etat_processus, s_objet_argument_2);
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: {
120: liberation(s_etat_processus, s_objet_argument_1);
121: liberation(s_etat_processus, s_objet_argument_2);
122: liberation(s_etat_processus, s_objet_argument_3);
123:
124: (*s_etat_processus).erreur_execution = d_ex_erreur_type_argument;
125: return;
126: }
127:
128: if (((*((integer8 *) (*s_objet_argument_1).objet)) < 1) ||
129: ((*((integer8 *) (*s_objet_argument_2).objet)) < 1) ||
130: ((*((integer8 *) (*s_objet_argument_1).objet)) <
131: (*((integer8 *) (*s_objet_argument_2).objet))))
132: {
133: liberation(s_etat_processus, s_objet_argument_1);
134: liberation(s_etat_processus, s_objet_argument_2);
135: liberation(s_etat_processus, s_objet_argument_3);
136:
137: (*s_etat_processus).erreur_execution = d_ex_argument_invalide;
138: return;
139: }
140:
141: /*
142: --------------------------------------------------------------------------------
143: Traitement des chaînes de caractères
144: --------------------------------------------------------------------------------
145: */
146:
147: if ((*s_objet_argument_3).type == CHN)
148: {
149: if ((*((integer8 *) (*s_objet_argument_1).objet)) > (integer8)
150: longueur_chaine(s_etat_processus,
151: (unsigned char *) (*s_objet_argument_3).objet))
152: {
153: liberation(s_etat_processus, s_objet_argument_1);
154: liberation(s_etat_processus, s_objet_argument_2);
155: liberation(s_etat_processus, s_objet_argument_3);
156:
157: (*s_etat_processus).erreur_execution = d_ex_argument_invalide;
158: return;
159: }
160:
161: if ((s_objet_resultat = allocation(s_etat_processus, CHN)) == NULL)
162: {
163: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
164: return;
165: }
166:
167: if ((ptr1 = pointeur_ieme_caractere(s_etat_processus, (unsigned char *)
168: (*s_objet_argument_3).objet, (*((integer8 *)
169: (*s_objet_argument_2).objet)) - 1)) == NULL)
170: {
171: liberation(s_etat_processus, s_objet_argument_1);
172: liberation(s_etat_processus, s_objet_argument_2);
173: liberation(s_etat_processus, s_objet_argument_3);
174:
175: (*s_etat_processus).erreur_execution = d_ex_argument_invalide;
176: return;
177: }
178:
179: if ((ptr2 = pointeur_ieme_caractere(s_etat_processus, ptr1,
180: (*((integer8 *) (*s_objet_argument_1).objet))
181: - ((*((integer8 *) (*s_objet_argument_2).objet)) - 1))) == NULL)
182: {
183: liberation(s_etat_processus, s_objet_argument_1);
184: liberation(s_etat_processus, s_objet_argument_2);
185: liberation(s_etat_processus, s_objet_argument_3);
186:
187: (*s_etat_processus).erreur_execution = d_ex_argument_invalide;
188: return;
189: }
190:
191: if (((*s_objet_resultat).objet = malloc(((ptr2 - ptr1) + 1) *
192: sizeof(unsigned char))) == NULL)
193: {
194: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
195: return;
196: }
197:
198: strncpy((unsigned char *) (*s_objet_resultat).objet, ptr1,
199: ptr2 - ptr1)[ptr2 - ptr1] = d_code_fin_chaine;
200: }
201:
202: /*
203: --------------------------------------------------------------------------------
204: Traitement des listes
205: --------------------------------------------------------------------------------
206: */
207:
208: else if ((*s_objet_argument_3).type == LST)
209: {
210: if ((s_copie_argument_3 = copie_objet(s_etat_processus,
211: s_objet_argument_3, 'N')) == NULL)
212: {
213: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
214: return;
215: }
216:
217: liberation(s_etat_processus, s_objet_argument_3);
218: s_objet_argument_3 = s_copie_argument_3;
219:
220: l_element_courant = (struct_liste_chainee *) (*s_objet_argument_3)
221: .objet;
222: i = 1;
223:
224: while(i < (unsigned long) (*((integer8 *) (*s_objet_argument_2).objet)))
225: {
226: if (l_element_courant == NULL)
227: {
228: liberation(s_etat_processus, s_objet_argument_1);
229: liberation(s_etat_processus, s_objet_argument_2);
230: liberation(s_etat_processus, s_objet_argument_3);
231:
232: (*s_etat_processus).erreur_execution = d_ex_element_inexistant;
233: return;
234: }
235:
236: l_element_precedent = l_element_courant;
237: l_element_courant = (*l_element_courant).suivant;
238:
239: liberation(s_etat_processus, (*l_element_precedent).donnee);
240: free(l_element_precedent);
241:
242: i++;
243: }
244:
245: (*s_objet_argument_3).objet = l_element_courant;
246:
247: while(i < (unsigned long) (*((integer8 *) (*s_objet_argument_1).objet)))
248: {
249: if (l_element_courant == NULL)
250: {
251: liberation(s_etat_processus, s_objet_argument_1);
252: liberation(s_etat_processus, s_objet_argument_2);
253: liberation(s_etat_processus, s_objet_argument_3);
254:
255: (*s_etat_processus).erreur_execution = d_ex_element_inexistant;
256: return;
257: }
258:
259: l_element_courant = (*l_element_courant).suivant;
260: i++;
261: }
262:
263: l_element_precedent = l_element_courant;
264:
265: if (l_element_courant == NULL)
266: {
267: liberation(s_etat_processus, s_objet_argument_1);
268: liberation(s_etat_processus, s_objet_argument_2);
269: liberation(s_etat_processus, s_objet_argument_3);
270:
271: (*s_etat_processus).erreur_execution = d_ex_element_inexistant;
272: return;
273: }
274:
275: l_element_courant = (*l_element_courant).suivant;
276: (*l_element_precedent).suivant = NULL;
277:
278: while(l_element_courant != NULL)
279: {
280: l_element_precedent = l_element_courant;
281: l_element_courant = (*l_element_courant).suivant;
282:
283: liberation(s_etat_processus, (*l_element_precedent).donnee);
284: free(l_element_precedent);
285: }
286:
287: s_objet_resultat = s_objet_argument_3;
288: s_objet_argument_3 = NULL;
289: }
290:
291: /*
292: --------------------------------------------------------------------------------
293: Arguments invalides
294: --------------------------------------------------------------------------------
295: */
296:
297: else
298: {
299: liberation(s_etat_processus, s_objet_argument_1);
300: liberation(s_etat_processus, s_objet_argument_2);
301: liberation(s_etat_processus, s_objet_argument_3);
302:
303: (*s_etat_processus).erreur_execution = d_ex_erreur_type_argument;
304: return;
305: }
306:
307: liberation(s_etat_processus, s_objet_argument_1);
308: liberation(s_etat_processus, s_objet_argument_2);
309: liberation(s_etat_processus, s_objet_argument_3);
310:
311: if (empilement(s_etat_processus, &((*s_etat_processus).l_base_pile),
312: s_objet_resultat) == d_erreur)
313: {
314: return;
315: }
316:
317: return;
318: }
319:
320:
321: /*
322: ================================================================================
323: Fonction 'sto+'
324: ================================================================================
325: Entrées :
326: --------------------------------------------------------------------------------
327: Sorties :
328: --------------------------------------------------------------------------------
329: Effets de bord : néant
330: ================================================================================
331: */
332:
333: void
334: instruction_sto_plus(struct_processus *s_etat_processus)
335: {
336: logical1 variable_partagee;
337:
338: struct_liste_chainee *registre_pile_last;
339:
340: struct_objet *s_objet_1;
341: struct_objet *s_objet_2;
342: struct_objet *s_objet_3;
343:
344: (*s_etat_processus).erreur_execution = d_ex;
345:
346: if ((*s_etat_processus).affichage_arguments == 'Y')
347: {
348: printf("\n STO+ ");
349:
350: if ((*s_etat_processus).langue == 'F')
351: {
352: printf("(modification d'une variable par addition)\n\n");
353: }
354: else
355: {
356: printf("(add to the content of a variable)\n\n");
357: }
358:
359: printf(" 2: %s, %s, %s, %s, %s, %s,\n"
360: " %s, %s, %s\n",
361: d_INT, d_REL, d_CPL, d_VIN, d_VRL, d_VCX, d_MIN, d_MRL, d_MCX);
362: printf(" 1: %s\n\n", d_NOM);
363:
364: printf(" 2: %s\n", d_NOM);
365: printf(" 1: %s, %s, %s, %s, %s, %s,\n"
366: " %s, %s, %s\n",
367: d_INT, d_REL, d_CPL, d_VIN, d_VRL, d_VCX, d_MIN, d_MRL, d_MCX);
368:
369: return;
370: }
371: else if ((*s_etat_processus).test_instruction == 'Y')
372: {
373: (*s_etat_processus).nombre_arguments = -1;
374: return;
375: }
376:
377: registre_pile_last = NULL;
378:
379: if (test_cfsf(s_etat_processus, 31) == d_vrai)
380: {
381: if (empilement_pile_last(s_etat_processus, 2) == d_erreur)
382: {
383: return;
384: }
385:
386: registre_pile_last = (*s_etat_processus).l_base_pile_last;
387: (*s_etat_processus).l_base_pile_last = NULL;
388: }
389:
390: if (depilement(s_etat_processus, &((*s_etat_processus).l_base_pile),
391: &s_objet_1) == d_erreur)
392: {
393: (*s_etat_processus).erreur_execution = d_ex_manque_argument;
394:
395: if (test_cfsf(s_etat_processus, 31) == d_vrai)
396: {
397: if (empilement_pile_last(s_etat_processus, 0) == d_erreur)
398: {
399: return;
400: }
401:
402: (*s_etat_processus).l_base_pile_last = registre_pile_last;
403: }
404:
405: return;
406: }
407:
408: if (depilement(s_etat_processus, &((*s_etat_processus).l_base_pile),
409: &s_objet_2) == d_erreur)
410: {
411: liberation(s_etat_processus, s_objet_1);
412:
413: if (test_cfsf(s_etat_processus, 31) == d_vrai)
414: {
415: if (empilement_pile_last(s_etat_processus, 0) == d_erreur)
416: {
417: return;
418: }
419:
420: (*s_etat_processus).l_base_pile_last = registre_pile_last;
421: }
422:
423: (*s_etat_processus).erreur_execution = d_ex_manque_argument;
424: return;
425: }
426:
427: /*
428: --------------------------------------------------------------------------------
429: Une valeur et un nom
430: --------------------------------------------------------------------------------
431: */
432:
433: variable_partagee = d_faux;
434:
435: if (((*s_objet_1).type == NOM) &&
436: (((*s_objet_2).type == INT) ||
437: ((*s_objet_2).type == REL) ||
438: ((*s_objet_2).type == CPL) ||
439: ((*s_objet_2).type == VIN) ||
440: ((*s_objet_2).type == VRL) ||
441: ((*s_objet_2).type == VCX) ||
442: ((*s_objet_2).type == MIN) ||
443: ((*s_objet_2).type == MRL) ||
444: ((*s_objet_2).type == MCX)))
445: {
446: if (recherche_variable(s_etat_processus, (*((struct_nom *)
447: (*s_objet_1).objet)).nom) == d_faux)
448: {
449: (*s_etat_processus).erreur_systeme = d_es;
450: (*s_etat_processus).erreur_execution = d_ex_variable_non_definie;
451:
452: liberation(s_etat_processus, s_objet_1);
453: liberation(s_etat_processus, s_objet_2);
454:
455: if (test_cfsf(s_etat_processus, 31) == d_vrai)
456: {
457: if (empilement_pile_last(s_etat_processus, 0) == d_erreur)
458: {
459: return;
460: }
461:
462: (*s_etat_processus).l_base_pile_last = registre_pile_last;
463: }
464:
465: return;
466: }
467:
468: if ((*(*s_etat_processus).pointeur_variable_courante)
469: .variable_verrouillee == d_vrai)
470: {
471: liberation(s_etat_processus, s_objet_1);
472: liberation(s_etat_processus, s_objet_2);
473:
474: if (test_cfsf(s_etat_processus, 31) == d_vrai)
475: {
476: if (empilement_pile_last(s_etat_processus, 0) == d_erreur)
477: {
478: return;
479: }
480:
481: (*s_etat_processus).l_base_pile_last = registre_pile_last;
482: }
483:
484: (*s_etat_processus).erreur_execution = d_ex_variable_verrouillee;
485: return;
486: }
487:
488: if ((*(*s_etat_processus).pointeur_variable_courante).objet == NULL)
489: {
490: if (pthread_mutex_lock(&((*(*s_etat_processus)
491: .s_liste_variables_partagees).mutex)) != 0)
492: {
493: (*s_etat_processus).erreur_systeme = d_es_processus;
494: return;
495: }
496:
497: if (recherche_variable_partagee(s_etat_processus,
498: (*(*s_etat_processus).pointeur_variable_courante).nom,
499: (*(*s_etat_processus).pointeur_variable_courante)
500: .variable_partagee, (*(*s_etat_processus)
501: .pointeur_variable_courante).origine) == d_faux)
502: {
503: if (pthread_mutex_unlock(&((*(*s_etat_processus)
504: .s_liste_variables_partagees).mutex)) != 0)
505: {
506: (*s_etat_processus).erreur_systeme = d_es_processus;
507: return;
508: }
509:
510: (*s_etat_processus).erreur_systeme = d_es;
511: (*s_etat_processus).erreur_execution =
512: d_ex_variable_non_definie;
513:
514: liberation(s_etat_processus, s_objet_1);
515: liberation(s_etat_processus, s_objet_2);
516:
517: if (test_cfsf(s_etat_processus, 31) == d_vrai)
518: {
519: if (empilement_pile_last(s_etat_processus, 0) == d_erreur)
520: {
521: return;
522: }
523:
524: (*s_etat_processus).l_base_pile_last = registre_pile_last;
525: }
526:
527: return;
528: }
529:
530: variable_partagee = d_vrai;
531:
532: if ((s_objet_3 = copie_objet(s_etat_processus, (*(*s_etat_processus)
533: .s_liste_variables_partagees).table
534: [(*(*s_etat_processus).s_liste_variables_partagees)
535: .position_variable].objet, 'P')) == NULL)
536: {
537: if (pthread_mutex_unlock(&((*(*s_etat_processus)
538: .s_liste_variables_partagees).mutex)) != 0)
539: {
540: (*s_etat_processus).erreur_systeme = d_es_processus;
541: return;
542: }
543:
544: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
545:
546: liberation(s_etat_processus, s_objet_1);
547: liberation(s_etat_processus, s_objet_2);
548:
549: if (test_cfsf(s_etat_processus, 31) == d_vrai)
550: {
551: if (empilement_pile_last(s_etat_processus, 0) == d_erreur)
552: {
553: return;
554: }
555:
556: (*s_etat_processus).l_base_pile_last = registre_pile_last;
557: }
558:
559: return;
560: }
561: }
562: else
563: {
564: if ((s_objet_3 = copie_objet(s_etat_processus,
565: (*(*s_etat_processus).pointeur_variable_courante).objet,
566: 'P')) == NULL)
567: {
568: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
569:
570: liberation(s_etat_processus, s_objet_1);
571: liberation(s_etat_processus, s_objet_2);
572:
573: if (test_cfsf(s_etat_processus, 31) == d_vrai)
574: {
575: if (empilement_pile_last(s_etat_processus, 0) == d_erreur)
576: {
577: return;
578: }
579:
580: (*s_etat_processus).l_base_pile_last = registre_pile_last;
581: }
582:
583: return;
584: }
585: }
586:
587: if (empilement(s_etat_processus, &((*s_etat_processus).l_base_pile),
588: s_objet_2) == d_erreur)
589: {
590: if (variable_partagee == d_vrai)
591: {
592: if (pthread_mutex_unlock(&((*(*s_etat_processus)
593: .s_liste_variables_partagees).mutex)) != 0)
594: {
595: (*s_etat_processus).erreur_systeme = d_es_processus;
596: return;
597: }
598: }
599:
600: return;
601: }
602:
603: if (empilement(s_etat_processus, &((*s_etat_processus).l_base_pile),
604: s_objet_3) == d_erreur)
605: {
606: if (variable_partagee == d_vrai)
607: {
608: if (pthread_mutex_unlock(&((*(*s_etat_processus)
609: .s_liste_variables_partagees).mutex)) != 0)
610: {
611: (*s_etat_processus).erreur_systeme = d_es_processus;
612: return;
613: }
614: }
615:
616: return;
617: }
618:
619: instruction_plus(s_etat_processus);
620: s_objet_2 = NULL;
621: /* s_objet_2 et s_objet_3 sont libérés par cet appel... */
622:
623: if (((*s_etat_processus).erreur_systeme != d_es) ||
624: ((*s_etat_processus).erreur_execution != d_ex) ||
625: ((*s_etat_processus).exception != d_ep))
626: {
627: if (variable_partagee == d_vrai)
628: {
629: if (pthread_mutex_unlock(&((*(*s_etat_processus)
630: .s_liste_variables_partagees).mutex)) != 0)
631: {
632: (*s_etat_processus).erreur_systeme = d_es_processus;
633: return;
634: }
635: }
636:
637: liberation(s_etat_processus, s_objet_1);
638: liberation(s_etat_processus, s_objet_2);
639:
640: if (test_cfsf(s_etat_processus, 31) == d_vrai)
641: {
642: if (empilement_pile_last(s_etat_processus, 0) == d_erreur)
643: {
644: return;
645: }
646:
647: (*s_etat_processus).l_base_pile_last = registre_pile_last;
648: }
649:
650: return;
651: }
652:
653: if (variable_partagee == d_vrai)
654: {
655: liberation(s_etat_processus,
656: (*(*s_etat_processus).s_liste_variables_partagees)
657: .table[(*(*s_etat_processus).s_liste_variables_partagees)
658: .position_variable].objet);
659:
660: if (depilement(s_etat_processus, &((*s_etat_processus).l_base_pile),
661: (struct_objet **) &((*(*s_etat_processus)
662: .s_liste_variables_partagees).table[(*(*s_etat_processus)
663: .s_liste_variables_partagees).position_variable].objet))
664: == d_erreur)
665: {
666: if (pthread_mutex_unlock(&((*(*s_etat_processus)
667: .s_liste_variables_partagees).mutex)) != 0)
668: {
669: (*s_etat_processus).erreur_systeme = d_es_processus;
670: return;
671: }
672:
673: liberation(s_etat_processus, s_objet_1);
674:
675: if (test_cfsf(s_etat_processus, 31) == d_vrai)
676: {
677: if (empilement_pile_last(s_etat_processus, 0) == d_erreur)
678: {
679: return;
680: }
681:
682: (*s_etat_processus).l_base_pile_last = registre_pile_last;
683: }
684:
685: (*s_etat_processus).erreur_execution = d_ex_manque_argument;
686: return;
687: }
688:
689: if (pthread_mutex_unlock(&((*(*s_etat_processus)
690: .s_liste_variables_partagees).mutex)) != 0)
691: {
692: (*s_etat_processus).erreur_systeme = d_es_processus;
693: return;
694: }
695: }
696: else
697: {
698: liberation(s_etat_processus,
699: (*(*s_etat_processus).pointeur_variable_courante).objet);
700:
701: if (depilement(s_etat_processus, &((*s_etat_processus).l_base_pile),
702: &((*(*s_etat_processus).pointeur_variable_courante).objet))
703: == d_erreur)
704: {
705: liberation(s_etat_processus, s_objet_1);
706:
707: if (test_cfsf(s_etat_processus, 31) == d_vrai)
708: {
709: if (empilement_pile_last(s_etat_processus, 0) == d_erreur)
710: {
711: return;
712: }
713:
714: (*s_etat_processus).l_base_pile_last = registre_pile_last;
715: }
716:
717: (*s_etat_processus).erreur_execution = d_ex_manque_argument;
718: return;
719: }
720: }
721: }
722: else if (((*s_objet_2).type == NOM) &&
723: (((*s_objet_1).type == INT) ||
724: ((*s_objet_1).type == REL) ||
725: ((*s_objet_1).type == CPL) ||
726: ((*s_objet_1).type == VIN) ||
727: ((*s_objet_1).type == VRL) ||
728: ((*s_objet_1).type == VCX) ||
729: ((*s_objet_1).type == MIN) ||
730: ((*s_objet_1).type == MRL) ||
731: ((*s_objet_1).type == MCX)))
732: {
733: if (recherche_variable(s_etat_processus, (*((struct_nom *)
734: (*s_objet_2).objet)).nom) == d_faux)
735: {
736: (*s_etat_processus).erreur_systeme = d_es;
737: (*s_etat_processus).erreur_execution = d_ex_variable_non_definie;
738:
739: liberation(s_etat_processus, s_objet_1);
740: liberation(s_etat_processus, s_objet_2);
741:
742: if (test_cfsf(s_etat_processus, 31) == d_vrai)
743: {
744: if (empilement_pile_last(s_etat_processus, 0) == d_erreur)
745: {
746: return;
747: }
748:
749: (*s_etat_processus).l_base_pile_last = registre_pile_last;
750: }
751:
752: return;
753: }
754:
755: if ((*(*s_etat_processus).pointeur_variable_courante)
756: .variable_verrouillee == d_vrai)
757: {
758: liberation(s_etat_processus, s_objet_1);
759: liberation(s_etat_processus, s_objet_2);
760:
761: if (test_cfsf(s_etat_processus, 31) == d_vrai)
762: {
763: if (empilement_pile_last(s_etat_processus, 0) == d_erreur)
764: {
765: return;
766: }
767:
768: (*s_etat_processus).l_base_pile_last = registre_pile_last;
769: }
770:
771: (*s_etat_processus).erreur_execution = d_ex_variable_verrouillee;
772: return;
773: }
774:
775: if ((*(*s_etat_processus).pointeur_variable_courante).objet == NULL)
776: {
777: if (pthread_mutex_lock(&((*(*s_etat_processus)
778: .s_liste_variables_partagees).mutex)) != 0)
779: {
780: (*s_etat_processus).erreur_systeme = d_es_processus;
781: return;
782: }
783:
784: if (recherche_variable_partagee(s_etat_processus,
785: (*(*s_etat_processus).pointeur_variable_courante).nom,
786: (*(*s_etat_processus).pointeur_variable_courante)
787: .variable_partagee, (*(*s_etat_processus)
788: .pointeur_variable_courante).origine) == d_faux)
789: {
790: if (pthread_mutex_unlock(&((*(*s_etat_processus)
791: .s_liste_variables_partagees).mutex)) != 0)
792: {
793: (*s_etat_processus).erreur_systeme = d_es_processus;
794: return;
795: }
796:
797: (*s_etat_processus).erreur_systeme = d_es;
798: (*s_etat_processus).erreur_execution =
799: d_ex_variable_non_definie;
800:
801: liberation(s_etat_processus, s_objet_1);
802: liberation(s_etat_processus, s_objet_2);
803:
804: if (test_cfsf(s_etat_processus, 31) == d_vrai)
805: {
806: if (empilement_pile_last(s_etat_processus, 0) == d_erreur)
807: {
808: return;
809: }
810:
811: (*s_etat_processus).l_base_pile_last = registre_pile_last;
812: }
813:
814: return;
815: }
816:
817: variable_partagee = d_vrai;
818:
819: if ((s_objet_3 = copie_objet(s_etat_processus, (*(*s_etat_processus)
820: .s_liste_variables_partagees).table
821: [(*(*s_etat_processus).s_liste_variables_partagees)
822: .position_variable].objet, 'P')) == NULL)
823: {
824: if (pthread_mutex_unlock(&((*(*s_etat_processus)
825: .s_liste_variables_partagees).mutex)) != 0)
826: {
827: (*s_etat_processus).erreur_systeme = d_es_processus;
828: return;
829: }
830:
831: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
832:
833: liberation(s_etat_processus, s_objet_1);
834: liberation(s_etat_processus, s_objet_2);
835:
836: if (test_cfsf(s_etat_processus, 31) == d_vrai)
837: {
838: if (empilement_pile_last(s_etat_processus, 0) == d_erreur)
839: {
840: return;
841: }
842:
843: (*s_etat_processus).l_base_pile_last = registre_pile_last;
844: }
845:
846: return;
847: }
848: }
849: else
850: {
851: if ((s_objet_3 = copie_objet(s_etat_processus,
852: (*(*s_etat_processus).pointeur_variable_courante).objet,
853: 'P')) == NULL)
854: {
855: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
856:
857: liberation(s_etat_processus, s_objet_1);
858: liberation(s_etat_processus, s_objet_2);
859:
860: if (test_cfsf(s_etat_processus, 31) == d_vrai)
861: {
862: if (empilement_pile_last(s_etat_processus, 0) == d_erreur)
863: {
864: return;
865: }
866:
867: (*s_etat_processus).l_base_pile_last = registre_pile_last;
868: }
869:
870: return;
871: }
872: }
873:
874: if (empilement(s_etat_processus, &((*s_etat_processus).l_base_pile),
875: s_objet_3) == d_erreur)
876: {
877: if (variable_partagee == d_vrai)
878: {
879: if (pthread_mutex_unlock(&((*(*s_etat_processus)
880: .s_liste_variables_partagees).mutex)) != 0)
881: {
882: (*s_etat_processus).erreur_systeme = d_es_processus;
883: return;
884: }
885: }
886:
887: return;
888: }
889:
890: if (empilement(s_etat_processus, &((*s_etat_processus).l_base_pile),
891: s_objet_1) == d_erreur)
892: {
893: if (variable_partagee == d_vrai)
894: {
895: if (pthread_mutex_unlock(&((*(*s_etat_processus)
896: .s_liste_variables_partagees).mutex)) != 0)
897: {
898: (*s_etat_processus).erreur_systeme = d_es_processus;
899: return;
900: }
901: }
902:
903: return;
904: }
905:
906: instruction_plus(s_etat_processus);
907: s_objet_1 = NULL;
908: /* s_objet_1 et s_objet_3 sont libérés par cet appel... */
909:
910: if (((*s_etat_processus).erreur_systeme != d_es) ||
911: ((*s_etat_processus).erreur_execution != d_ex) ||
912: ((*s_etat_processus).exception != d_ep))
913: {
914: if (variable_partagee == d_vrai)
915: {
916: if (pthread_mutex_unlock(&((*(*s_etat_processus)
917: .s_liste_variables_partagees).mutex)) != 0)
918: {
919: (*s_etat_processus).erreur_systeme = d_es_processus;
920: return;
921: }
922: }
923:
924: liberation(s_etat_processus, s_objet_1);
925: liberation(s_etat_processus, s_objet_2);
926:
927: if (test_cfsf(s_etat_processus, 31) == d_vrai)
928: {
929: if (empilement_pile_last(s_etat_processus, 0) == d_erreur)
930: {
931: return;
932: }
933:
934: (*s_etat_processus).l_base_pile_last = registre_pile_last;
935: }
936:
937: return;
938: }
939:
940: if (variable_partagee == d_vrai)
941: {
942: liberation(s_etat_processus,
943: (*(*s_etat_processus).s_liste_variables_partagees)
944: .table[(*(*s_etat_processus).s_liste_variables_partagees)
945: .position_variable].objet);
946:
947: if (depilement(s_etat_processus, &((*s_etat_processus).l_base_pile),
948: (struct_objet **) &((*(*s_etat_processus)
949: .s_liste_variables_partagees).table[(*(*s_etat_processus)
950: .s_liste_variables_partagees).position_variable].objet))
951: == d_erreur)
952: {
953: if (pthread_mutex_unlock(&((*(*s_etat_processus)
954: .s_liste_variables_partagees).mutex)) != 0)
955: {
956: (*s_etat_processus).erreur_systeme = d_es_processus;
957: return;
958: }
959:
960: liberation(s_etat_processus, s_objet_1);
961:
962: if (test_cfsf(s_etat_processus, 31) == d_vrai)
963: {
964: if (empilement_pile_last(s_etat_processus, 0) == d_erreur)
965: {
966: return;
967: }
968:
969: (*s_etat_processus).l_base_pile_last = registre_pile_last;
970: }
971:
972: (*s_etat_processus).erreur_execution = d_ex_manque_argument;
973: return;
974: }
975:
976: if (pthread_mutex_unlock(&((*(*s_etat_processus)
977: .s_liste_variables_partagees).mutex)) != 0)
978: {
979: (*s_etat_processus).erreur_systeme = d_es_processus;
980: return;
981: }
982: }
983: else
984: {
985: liberation(s_etat_processus,
986: (*(*s_etat_processus).pointeur_variable_courante).objet);
987:
988: if (depilement(s_etat_processus, &((*s_etat_processus).l_base_pile),
989: &((*(*s_etat_processus).pointeur_variable_courante).objet))
990: == d_erreur)
991: {
992: liberation(s_etat_processus, s_objet_1);
993:
994: if (test_cfsf(s_etat_processus, 31) == d_vrai)
995: {
996: if (empilement_pile_last(s_etat_processus, 0) == d_erreur)
997: {
998: return;
999: }
1000:
1001: (*s_etat_processus).l_base_pile_last = registre_pile_last;
1002: }
1003:
1004: (*s_etat_processus).erreur_execution = d_ex_manque_argument;
1005: return;
1006: }
1007: }
1008: }
1009:
1010: /*
1011: --------------------------------------------------------------------------------
1012: Arguments incompatibles avec la fonction STO+
1013: --------------------------------------------------------------------------------
1014: */
1015:
1016: else
1017: {
1018: liberation(s_etat_processus, s_objet_1);
1019: liberation(s_etat_processus, s_objet_2);
1020:
1021: if (test_cfsf(s_etat_processus, 31) == d_vrai)
1022: {
1023: if (empilement_pile_last(s_etat_processus, 0) == d_erreur)
1024: {
1025: return;
1026: }
1027:
1028: (*s_etat_processus).l_base_pile_last = registre_pile_last;
1029: }
1030:
1031: (*s_etat_processus).erreur_execution = d_ex_erreur_type_argument;
1032: return;
1033: }
1034:
1035: if (test_cfsf(s_etat_processus, 31) == d_vrai)
1036: {
1037: if (empilement_pile_last(s_etat_processus, 0) == d_erreur)
1038: {
1039: return;
1040: }
1041:
1042: (*s_etat_processus).l_base_pile_last = registre_pile_last;
1043: }
1044:
1045: liberation(s_etat_processus, s_objet_1);
1046: liberation(s_etat_processus, s_objet_2);
1047:
1048: return;
1049: }
1050:
1051:
1052: /*
1053: ================================================================================
1054: Fonction 'sto-'
1055: ================================================================================
1056: Entrées :
1057: --------------------------------------------------------------------------------
1058: Sorties :
1059: --------------------------------------------------------------------------------
1060: Effets de bord : néant
1061: ================================================================================
1062: */
1063:
1064: void
1065: instruction_sto_moins(struct_processus *s_etat_processus)
1066: {
1067: logical1 variable_partagee;
1068:
1069: struct_liste_chainee *registre_pile_last;
1070:
1071: struct_objet *s_objet_1;
1072: struct_objet *s_objet_2;
1073: struct_objet *s_objet_3;
1074:
1075: (*s_etat_processus).erreur_execution = d_ex;
1076:
1077: if ((*s_etat_processus).affichage_arguments == 'Y')
1078: {
1079: printf("\n STO- ");
1080:
1081: if ((*s_etat_processus).langue == 'F')
1082: {
1083: printf("(modification d'une variable par soustraction)\n\n");
1084: }
1085: else
1086: {
1087: printf("(substract from the content of a variable)\n\n");
1088: }
1089:
1090: printf(" 2: %s, %s, %s, %s, %s, %s,\n"
1091: " %s, %s, %s\n",
1092: d_INT, d_REL, d_CPL, d_VIN, d_VRL, d_VCX, d_MIN, d_MRL, d_MCX);
1093: printf(" 1: %s\n\n", d_NOM);
1094:
1095: printf(" 2: %s\n", d_NOM);
1096: printf(" 1: %s, %s, %s, %s, %s, %s,\n"
1097: " %s, %s, %s\n",
1098: d_INT, d_REL, d_CPL, d_VIN, d_VRL, d_VCX, d_MIN, d_MRL, d_MCX);
1099:
1100: return;
1101: }
1102: else if ((*s_etat_processus).test_instruction == 'Y')
1103: {
1104: (*s_etat_processus).nombre_arguments = -1;
1105: return;
1106: }
1107:
1108: registre_pile_last = NULL;
1109:
1110: if (test_cfsf(s_etat_processus, 31) == d_vrai)
1111: {
1112: if (empilement_pile_last(s_etat_processus, 2) == d_erreur)
1113: {
1114: return;
1115: }
1116:
1117: registre_pile_last = (*s_etat_processus).l_base_pile_last;
1118: (*s_etat_processus).l_base_pile_last = NULL;
1119: }
1120:
1121: if (depilement(s_etat_processus, &((*s_etat_processus).l_base_pile),
1122: &s_objet_1) == d_erreur)
1123: {
1124: (*s_etat_processus).erreur_execution = d_ex_manque_argument;
1125:
1126: if (test_cfsf(s_etat_processus, 31) == d_vrai)
1127: {
1128: if (empilement_pile_last(s_etat_processus, 0) == d_erreur)
1129: {
1130: return;
1131: }
1132:
1133: (*s_etat_processus).l_base_pile_last = registre_pile_last;
1134: }
1135:
1136: return;
1137: }
1138:
1139: if (depilement(s_etat_processus, &((*s_etat_processus).l_base_pile),
1140: &s_objet_2) == d_erreur)
1141: {
1142: liberation(s_etat_processus, s_objet_1);
1143:
1144: if (test_cfsf(s_etat_processus, 31) == d_vrai)
1145: {
1146: if (empilement_pile_last(s_etat_processus, 0) == d_erreur)
1147: {
1148: return;
1149: }
1150:
1151: (*s_etat_processus).l_base_pile_last = registre_pile_last;
1152: }
1153:
1154: (*s_etat_processus).erreur_execution = d_ex_manque_argument;
1155: return;
1156: }
1157:
1158: variable_partagee = d_faux;
1159:
1160: /*
1161: --------------------------------------------------------------------------------
1162: Une valeur et un nom
1163: --------------------------------------------------------------------------------
1164: */
1165:
1166: if (((*s_objet_1).type == NOM) &&
1167: (((*s_objet_2).type == INT) ||
1168: ((*s_objet_2).type == REL) ||
1169: ((*s_objet_2).type == CPL) ||
1170: ((*s_objet_2).type == VIN) ||
1171: ((*s_objet_2).type == VRL) ||
1172: ((*s_objet_2).type == VCX) ||
1173: ((*s_objet_2).type == MIN) ||
1174: ((*s_objet_2).type == MRL) ||
1175: ((*s_objet_2).type == MCX)))
1176: {
1177: if (recherche_variable(s_etat_processus, (*((struct_nom *)
1178: (*s_objet_1).objet)).nom) == d_faux)
1179: {
1180: (*s_etat_processus).erreur_systeme = d_es;
1181: (*s_etat_processus).erreur_execution = d_ex_variable_non_definie;
1182:
1183: liberation(s_etat_processus, s_objet_1);
1184: liberation(s_etat_processus, s_objet_2);
1185:
1186: if (test_cfsf(s_etat_processus, 31) == d_vrai)
1187: {
1188: if (empilement_pile_last(s_etat_processus, 0) == d_erreur)
1189: {
1190: return;
1191: }
1192:
1193: (*s_etat_processus).l_base_pile_last = registre_pile_last;
1194: }
1195:
1196: return;
1197: }
1198:
1199: if ((*(*s_etat_processus).pointeur_variable_courante)
1200: .variable_verrouillee == d_vrai)
1201: {
1202: liberation(s_etat_processus, s_objet_1);
1203: liberation(s_etat_processus, s_objet_2);
1204:
1205: if (test_cfsf(s_etat_processus, 31) == d_vrai)
1206: {
1207: if (empilement_pile_last(s_etat_processus, 0) == d_erreur)
1208: {
1209: return;
1210: }
1211:
1212: (*s_etat_processus).l_base_pile_last = registre_pile_last;
1213: }
1214:
1215: (*s_etat_processus).erreur_execution = d_ex_variable_verrouillee;
1216: return;
1217: }
1218:
1219: if ((*(*s_etat_processus).pointeur_variable_courante).objet == NULL)
1220: {
1221: if (pthread_mutex_lock(&((*(*s_etat_processus)
1222: .s_liste_variables_partagees).mutex)) != 0)
1223: {
1224: (*s_etat_processus).erreur_systeme = d_es_processus;
1225: return;
1226: }
1227:
1228: if (recherche_variable_partagee(s_etat_processus,
1229: (*(*s_etat_processus).pointeur_variable_courante).nom,
1230: (*(*s_etat_processus).pointeur_variable_courante)
1231: .variable_partagee, (*(*s_etat_processus)
1232: .pointeur_variable_courante).origine) == d_faux)
1233: {
1234: if (pthread_mutex_unlock(&((*(*s_etat_processus)
1235: .s_liste_variables_partagees).mutex)) != 0)
1236: {
1237: (*s_etat_processus).erreur_systeme = d_es_processus;
1238: return;
1239: }
1240:
1241: (*s_etat_processus).erreur_systeme = d_es;
1242: (*s_etat_processus).erreur_execution =
1243: d_ex_variable_non_definie;
1244:
1245: liberation(s_etat_processus, s_objet_1);
1246: liberation(s_etat_processus, s_objet_2);
1247:
1248: if (test_cfsf(s_etat_processus, 31) == d_vrai)
1249: {
1250: if (empilement_pile_last(s_etat_processus, 0) == d_erreur)
1251: {
1252: return;
1253: }
1254:
1255: (*s_etat_processus).l_base_pile_last = registre_pile_last;
1256: }
1257:
1258: return;
1259: }
1260:
1261: variable_partagee = d_vrai;
1262:
1263: if ((s_objet_3 = copie_objet(s_etat_processus, (*(*s_etat_processus)
1264: .s_liste_variables_partagees).table
1265: [(*(*s_etat_processus).s_liste_variables_partagees)
1266: .position_variable].objet, 'P')) == NULL)
1267: {
1268: if (pthread_mutex_unlock(&((*(*s_etat_processus)
1269: .s_liste_variables_partagees).mutex)) != 0)
1270: {
1271: (*s_etat_processus).erreur_systeme = d_es_processus;
1272: return;
1273: }
1274:
1275: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
1276:
1277: liberation(s_etat_processus, s_objet_1);
1278: liberation(s_etat_processus, s_objet_2);
1279:
1280: if (test_cfsf(s_etat_processus, 31) == d_vrai)
1281: {
1282: if (empilement_pile_last(s_etat_processus, 0) == d_erreur)
1283: {
1284: return;
1285: }
1286:
1287: (*s_etat_processus).l_base_pile_last = registre_pile_last;
1288: }
1289:
1290: return;
1291: }
1292: }
1293: else
1294: {
1295: if ((s_objet_3 = copie_objet(s_etat_processus,
1296: (*(*s_etat_processus).pointeur_variable_courante).objet,
1297: 'P')) == NULL)
1298: {
1299: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
1300:
1301: liberation(s_etat_processus, s_objet_1);
1302: liberation(s_etat_processus, s_objet_2);
1303:
1304: if (test_cfsf(s_etat_processus, 31) == d_vrai)
1305: {
1306: if (empilement_pile_last(s_etat_processus, 0) == d_erreur)
1307: {
1308: return;
1309: }
1310:
1311: (*s_etat_processus).l_base_pile_last = registre_pile_last;
1312: }
1313:
1314: return;
1315: }
1316: }
1317:
1318: if (empilement(s_etat_processus, &((*s_etat_processus).l_base_pile),
1319: s_objet_2) == d_erreur)
1320: {
1321: if (variable_partagee == d_vrai)
1322: {
1323: if (pthread_mutex_unlock(&((*(*s_etat_processus)
1324: .s_liste_variables_partagees).mutex)) != 0)
1325: {
1326: (*s_etat_processus).erreur_systeme = d_es_processus;
1327: return;
1328: }
1329: }
1330:
1331: return;
1332: }
1333:
1334: if (empilement(s_etat_processus, &((*s_etat_processus).l_base_pile),
1335: s_objet_3) == d_erreur)
1336: {
1337: if (variable_partagee == d_vrai)
1338: {
1339: if (pthread_mutex_unlock(&((*(*s_etat_processus)
1340: .s_liste_variables_partagees).mutex)) != 0)
1341: {
1342: (*s_etat_processus).erreur_systeme = d_es_processus;
1343: return;
1344: }
1345: }
1346:
1347: return;
1348: }
1349:
1350: instruction_moins(s_etat_processus);
1351: s_objet_2 = NULL;
1352: /* s_objet_2 et s_objet_3 sont libérés par cet appel... */
1353:
1354: if (((*s_etat_processus).erreur_systeme != d_es) ||
1355: ((*s_etat_processus).erreur_execution != d_ex) ||
1356: ((*s_etat_processus).exception != d_ep))
1357: {
1358: if (variable_partagee == d_vrai)
1359: {
1360: if (pthread_mutex_unlock(&((*(*s_etat_processus)
1361: .s_liste_variables_partagees).mutex)) != 0)
1362: {
1363: (*s_etat_processus).erreur_systeme = d_es_processus;
1364: return;
1365: }
1366: }
1367:
1368: liberation(s_etat_processus, s_objet_1);
1369: liberation(s_etat_processus, s_objet_2);
1370:
1371: if (test_cfsf(s_etat_processus, 31) == d_vrai)
1372: {
1373: if (empilement_pile_last(s_etat_processus, 0) == d_erreur)
1374: {
1375: return;
1376: }
1377:
1378: (*s_etat_processus).l_base_pile_last = registre_pile_last;
1379: }
1380:
1381: return;
1382: }
1383:
1384: if (variable_partagee == d_vrai)
1385: {
1386: liberation(s_etat_processus,
1387: (*(*s_etat_processus).s_liste_variables_partagees)
1388: .table[(*(*s_etat_processus).s_liste_variables_partagees)
1389: .position_variable].objet);
1390:
1391: if (depilement(s_etat_processus, &((*s_etat_processus).l_base_pile),
1392: (struct_objet **) &((*(*s_etat_processus)
1393: .s_liste_variables_partagees).table[(*(*s_etat_processus)
1394: .s_liste_variables_partagees).position_variable].objet))
1395: == d_erreur)
1396: {
1397: if (pthread_mutex_unlock(&((*(*s_etat_processus)
1398: .s_liste_variables_partagees).mutex)) != 0)
1399: {
1400: (*s_etat_processus).erreur_systeme = d_es_processus;
1401: return;
1402: }
1403:
1404: liberation(s_etat_processus, s_objet_1);
1405:
1406: if (test_cfsf(s_etat_processus, 31) == d_vrai)
1407: {
1408: if (empilement_pile_last(s_etat_processus, 0) == d_erreur)
1409: {
1410: return;
1411: }
1412:
1413: (*s_etat_processus).l_base_pile_last = registre_pile_last;
1414: }
1415:
1416: (*s_etat_processus).erreur_execution = d_ex_manque_argument;
1417: return;
1418: }
1419:
1420: if (pthread_mutex_unlock(&((*(*s_etat_processus)
1421: .s_liste_variables_partagees).mutex)) != 0)
1422: {
1423: (*s_etat_processus).erreur_systeme = d_es_processus;
1424: return;
1425: }
1426: }
1427: else
1428: {
1429: liberation(s_etat_processus,
1430: (*(*s_etat_processus).pointeur_variable_courante).objet);
1431:
1432: if (depilement(s_etat_processus, &((*s_etat_processus).l_base_pile),
1433: &((*(*s_etat_processus).pointeur_variable_courante)
1434: .objet)) == d_erreur)
1435: {
1436: liberation(s_etat_processus, s_objet_1);
1437:
1438: if (test_cfsf(s_etat_processus, 31) == d_vrai)
1439: {
1440: if (empilement_pile_last(s_etat_processus, 0) == d_erreur)
1441: {
1442: return;
1443: }
1444:
1445: (*s_etat_processus).l_base_pile_last = registre_pile_last;
1446: }
1447:
1448: (*s_etat_processus).erreur_execution = d_ex_manque_argument;
1449: return;
1450: }
1451: }
1452: }
1453: else if (((*s_objet_2).type == NOM) &&
1454: (((*s_objet_1).type == INT) ||
1455: ((*s_objet_1).type == REL) ||
1456: ((*s_objet_1).type == CPL) ||
1457: ((*s_objet_1).type == VIN) ||
1458: ((*s_objet_1).type == VRL) ||
1459: ((*s_objet_1).type == VCX) ||
1460: ((*s_objet_1).type == MIN) ||
1461: ((*s_objet_1).type == MRL) ||
1462: ((*s_objet_1).type == MCX)))
1463: {
1464: if (recherche_variable(s_etat_processus, (*((struct_nom *)
1465: (*s_objet_2).objet)).nom) == d_faux)
1466: {
1467: (*s_etat_processus).erreur_systeme = d_es;
1468: (*s_etat_processus).erreur_execution = d_ex_variable_non_definie;
1469:
1470: liberation(s_etat_processus, s_objet_1);
1471: liberation(s_etat_processus, s_objet_2);
1472:
1473: if (test_cfsf(s_etat_processus, 31) == d_vrai)
1474: {
1475: if (empilement_pile_last(s_etat_processus, 0) == d_erreur)
1476: {
1477: return;
1478: }
1479:
1480: (*s_etat_processus).l_base_pile_last = registre_pile_last;
1481: }
1482:
1483: return;
1484: }
1485:
1486: if ((*(*s_etat_processus).pointeur_variable_courante)
1487: .variable_verrouillee == d_vrai)
1488: {
1489: liberation(s_etat_processus, s_objet_1);
1490: liberation(s_etat_processus, s_objet_2);
1491:
1492: if (test_cfsf(s_etat_processus, 31) == d_vrai)
1493: {
1494: if (empilement_pile_last(s_etat_processus, 0) == d_erreur)
1495: {
1496: return;
1497: }
1498:
1499: (*s_etat_processus).l_base_pile_last = registre_pile_last;
1500: }
1501:
1502: (*s_etat_processus).erreur_execution = d_ex_variable_verrouillee;
1503: return;
1504: }
1505:
1506: if ((*(*s_etat_processus).pointeur_variable_courante).objet == NULL)
1507: {
1508: if (pthread_mutex_lock(&((*(*s_etat_processus)
1509: .s_liste_variables_partagees).mutex)) != 0)
1510: {
1511: (*s_etat_processus).erreur_systeme = d_es_processus;
1512: return;
1513: }
1514:
1515: if (recherche_variable_partagee(s_etat_processus,
1516: (*(*s_etat_processus).pointeur_variable_courante).nom,
1517: (*(*s_etat_processus).pointeur_variable_courante)
1518: .variable_partagee, (*(*s_etat_processus)
1519: .pointeur_variable_courante).origine) == d_faux)
1520: {
1521: if (pthread_mutex_unlock(&((*(*s_etat_processus)
1522: .s_liste_variables_partagees).mutex)) != 0)
1523: {
1524: (*s_etat_processus).erreur_systeme = d_es_processus;
1525: return;
1526: }
1527:
1528: (*s_etat_processus).erreur_systeme = d_es;
1529: (*s_etat_processus).erreur_execution =
1530: d_ex_variable_non_definie;
1531:
1532: liberation(s_etat_processus, s_objet_1);
1533: liberation(s_etat_processus, s_objet_2);
1534:
1535: if (test_cfsf(s_etat_processus, 31) == d_vrai)
1536: {
1537: if (empilement_pile_last(s_etat_processus, 0) == d_erreur)
1538: {
1539: return;
1540: }
1541:
1542: (*s_etat_processus).l_base_pile_last = registre_pile_last;
1543: }
1544:
1545: return;
1546: }
1547:
1548: variable_partagee = d_vrai;
1549:
1550: if ((s_objet_3 = copie_objet(s_etat_processus, (*(*s_etat_processus)
1551: .s_liste_variables_partagees).table
1552: [(*(*s_etat_processus).s_liste_variables_partagees)
1553: .position_variable].objet, 'P')) == NULL)
1554: {
1555: if (pthread_mutex_unlock(&((*(*s_etat_processus)
1556: .s_liste_variables_partagees).mutex)) != 0)
1557: {
1558: (*s_etat_processus).erreur_systeme = d_es_processus;
1559: return;
1560: }
1561:
1562: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
1563:
1564: liberation(s_etat_processus, s_objet_1);
1565: liberation(s_etat_processus, s_objet_2);
1566:
1567: if (test_cfsf(s_etat_processus, 31) == d_vrai)
1568: {
1569: if (empilement_pile_last(s_etat_processus, 0) == d_erreur)
1570: {
1571: return;
1572: }
1573:
1574: (*s_etat_processus).l_base_pile_last = registre_pile_last;
1575: }
1576:
1577: return;
1578: }
1579: }
1580: else
1581: {
1582: if ((s_objet_3 = copie_objet(s_etat_processus,
1583: (*(*s_etat_processus).pointeur_variable_courante).objet,
1584: 'P')) == NULL)
1585: {
1586: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
1587:
1588: liberation(s_etat_processus, s_objet_1);
1589: liberation(s_etat_processus, s_objet_2);
1590:
1591: if (test_cfsf(s_etat_processus, 31) == d_vrai)
1592: {
1593: if (empilement_pile_last(s_etat_processus, 0) == d_erreur)
1594: {
1595: return;
1596: }
1597:
1598: (*s_etat_processus).l_base_pile_last = registre_pile_last;
1599: }
1600:
1601: return;
1602: }
1603: }
1604:
1605: if (empilement(s_etat_processus, &((*s_etat_processus).l_base_pile),
1606: s_objet_3) == d_erreur)
1607: {
1608: if (variable_partagee == d_vrai)
1609: {
1610: if (pthread_mutex_unlock(&((*(*s_etat_processus)
1611: .s_liste_variables_partagees).mutex)) != 0)
1612: {
1613: (*s_etat_processus).erreur_systeme = d_es_processus;
1614: return;
1615: }
1616: }
1617:
1618: return;
1619: }
1620:
1621: if (empilement(s_etat_processus, &((*s_etat_processus).l_base_pile),
1622: s_objet_1) == d_erreur)
1623: {
1624: if (variable_partagee == d_vrai)
1625: {
1626: if (pthread_mutex_unlock(&((*(*s_etat_processus)
1627: .s_liste_variables_partagees).mutex)) != 0)
1628: {
1629: (*s_etat_processus).erreur_systeme = d_es_processus;
1630: return;
1631: }
1632: }
1633:
1634: return;
1635: }
1636:
1637: instruction_moins(s_etat_processus);
1638: s_objet_1 = NULL;
1639: /* s_objet_1 et s_objet_3 sont libérés par cet appel... */
1640:
1641: if (((*s_etat_processus).erreur_systeme != d_es) ||
1642: ((*s_etat_processus).erreur_execution != d_ex) ||
1643: ((*s_etat_processus).exception != d_ep))
1644: {
1645: if (variable_partagee == d_vrai)
1646: {
1647: if (pthread_mutex_unlock(&((*(*s_etat_processus)
1648: .s_liste_variables_partagees).mutex)) != 0)
1649: {
1650: (*s_etat_processus).erreur_systeme = d_es_processus;
1651: return;
1652: }
1653: }
1654:
1655: liberation(s_etat_processus, s_objet_1);
1656: liberation(s_etat_processus, s_objet_2);
1657:
1658: if (test_cfsf(s_etat_processus, 31) == d_vrai)
1659: {
1660: if (empilement_pile_last(s_etat_processus, 0) == d_erreur)
1661: {
1662: return;
1663: }
1664:
1665: (*s_etat_processus).l_base_pile_last = registre_pile_last;
1666: }
1667:
1668: return;
1669: }
1670:
1671: if (variable_partagee == d_vrai)
1672: {
1673: liberation(s_etat_processus,
1674: (*(*s_etat_processus).s_liste_variables_partagees)
1675: .table[(*(*s_etat_processus).s_liste_variables_partagees)
1676: .position_variable].objet);
1677:
1678: if (depilement(s_etat_processus, &((*s_etat_processus).l_base_pile),
1679: (struct_objet **) &((*(*s_etat_processus)
1680: .s_liste_variables_partagees).table[(*(*s_etat_processus)
1681: .s_liste_variables_partagees).position_variable].objet))
1682: == d_erreur)
1683: {
1684: if (pthread_mutex_unlock(&((*(*s_etat_processus)
1685: .s_liste_variables_partagees).mutex)) != 0)
1686: {
1687: (*s_etat_processus).erreur_systeme = d_es_processus;
1688: return;
1689: }
1690:
1691: liberation(s_etat_processus, s_objet_1);
1692:
1693: if (test_cfsf(s_etat_processus, 31) == d_vrai)
1694: {
1695: if (empilement_pile_last(s_etat_processus, 0) == d_erreur)
1696: {
1697: return;
1698: }
1699:
1700: (*s_etat_processus).l_base_pile_last = registre_pile_last;
1701: }
1702:
1703: (*s_etat_processus).erreur_execution = d_ex_manque_argument;
1704: return;
1705: }
1706:
1707: if (pthread_mutex_unlock(&((*(*s_etat_processus)
1708: .s_liste_variables_partagees).mutex)) != 0)
1709: {
1710: (*s_etat_processus).erreur_systeme = d_es_processus;
1711: return;
1712: }
1713: }
1714: else
1715: {
1716: liberation(s_etat_processus,
1717: (*(*s_etat_processus).pointeur_variable_courante).objet);
1718:
1719: if (depilement(s_etat_processus, &((*s_etat_processus).l_base_pile),
1720: &((*(*s_etat_processus).pointeur_variable_courante)
1721: .objet)) == d_erreur)
1722: {
1723: liberation(s_etat_processus, s_objet_1);
1724:
1725: if (test_cfsf(s_etat_processus, 31) == d_vrai)
1726: {
1727: if (empilement_pile_last(s_etat_processus, 0) == d_erreur)
1728: {
1729: return;
1730: }
1731:
1732: (*s_etat_processus).l_base_pile_last = registre_pile_last;
1733: }
1734:
1735: (*s_etat_processus).erreur_execution = d_ex_manque_argument;
1736: return;
1737: }
1738: }
1739: }
1740:
1741: /*
1742: --------------------------------------------------------------------------------
1743: Arguments incompatibles avec la fonction STO-
1744: --------------------------------------------------------------------------------
1745: */
1746:
1747: else
1748: {
1749: liberation(s_etat_processus, s_objet_1);
1750: liberation(s_etat_processus, s_objet_2);
1751:
1752: if (test_cfsf(s_etat_processus, 31) == d_vrai)
1753: {
1754: if (empilement_pile_last(s_etat_processus, 0) == d_erreur)
1755: {
1756: return;
1757: }
1758:
1759: (*s_etat_processus).l_base_pile_last = registre_pile_last;
1760: }
1761:
1762: (*s_etat_processus).erreur_execution = d_ex_erreur_type_argument;
1763: return;
1764: }
1765:
1766: if (test_cfsf(s_etat_processus, 31) == d_vrai)
1767: {
1768: if (empilement_pile_last(s_etat_processus, 0) == d_erreur)
1769: {
1770: return;
1771: }
1772:
1773: (*s_etat_processus).l_base_pile_last = registre_pile_last;
1774: }
1775:
1776: liberation(s_etat_processus, s_objet_1);
1777: liberation(s_etat_processus, s_objet_2);
1778:
1779: return;
1780: }
1781:
1782:
1783: /*
1784: ================================================================================
1785: Fonction 'sto*'
1786: ================================================================================
1787: Entrées :
1788: --------------------------------------------------------------------------------
1789: Sorties :
1790: --------------------------------------------------------------------------------
1791: Effets de bord : néant
1792: ================================================================================
1793: */
1794:
1795: void
1796: instruction_sto_fois(struct_processus *s_etat_processus)
1797: {
1798: logical1 variable_partagee;
1799:
1800: struct_liste_chainee *registre_pile_last;
1801:
1802: struct_objet *s_objet_1;
1803: struct_objet *s_objet_2;
1804: struct_objet *s_objet_3;
1805:
1806: (*s_etat_processus).erreur_execution = d_ex;
1807:
1808: if ((*s_etat_processus).affichage_arguments == 'Y')
1809: {
1810: printf("\n STO* ");
1811:
1812: if ((*s_etat_processus).langue == 'F')
1813: {
1814: printf("(modification d'une variable par multiplication)\n\n");
1815: }
1816: else
1817: {
1818: printf("(multiply the content of a variable)\n\n");
1819: }
1820:
1821: printf(" 2: %s, %s, %s, %s, %s, %s,\n"
1822: " %s, %s, %s\n",
1823: d_INT, d_REL, d_CPL, d_VIN, d_VRL, d_VCX, d_MIN, d_MRL, d_MCX);
1824: printf(" 1: %s\n\n", d_NOM);
1825:
1826: printf(" 2: %s\n", d_NOM);
1827: printf(" 1: %s, %s, %s, %s, %s, %s,\n"
1828: " %s, %s, %s\n",
1829: d_INT, d_REL, d_CPL, d_VIN, d_VRL, d_VCX, d_MIN, d_MRL, d_MCX);
1830:
1831: return;
1832: }
1833: else if ((*s_etat_processus).test_instruction == 'Y')
1834: {
1835: (*s_etat_processus).nombre_arguments = -1;
1836: return;
1837: }
1838:
1839: registre_pile_last = NULL;
1840:
1841: if (test_cfsf(s_etat_processus, 31) == d_vrai)
1842: {
1843: if (empilement_pile_last(s_etat_processus, 2) == d_erreur)
1844: {
1845: return;
1846: }
1847:
1848: registre_pile_last = (*s_etat_processus).l_base_pile_last;
1849: (*s_etat_processus).l_base_pile_last = NULL;
1850: }
1851:
1852: if (depilement(s_etat_processus, &((*s_etat_processus).l_base_pile),
1853: &s_objet_1) == d_erreur)
1854: {
1855: (*s_etat_processus).erreur_execution = d_ex_manque_argument;
1856:
1857: if (test_cfsf(s_etat_processus, 31) == d_vrai)
1858: {
1859: if (empilement_pile_last(s_etat_processus, 0) == d_erreur)
1860: {
1861: return;
1862: }
1863:
1864: (*s_etat_processus).l_base_pile_last = registre_pile_last;
1865: }
1866:
1867: return;
1868: }
1869:
1870: if (depilement(s_etat_processus, &((*s_etat_processus).l_base_pile),
1871: &s_objet_2) == d_erreur)
1872: {
1873: liberation(s_etat_processus, s_objet_1);
1874:
1875: if (test_cfsf(s_etat_processus, 31) == d_vrai)
1876: {
1877: if (empilement_pile_last(s_etat_processus, 0) == d_erreur)
1878: {
1879: return;
1880: }
1881:
1882: (*s_etat_processus).l_base_pile_last = registre_pile_last;
1883: }
1884:
1885: (*s_etat_processus).erreur_execution = d_ex_manque_argument;
1886: return;
1887: }
1888:
1889: /*
1890: --------------------------------------------------------------------------------
1891: Une valeur et un nom
1892: --------------------------------------------------------------------------------
1893: */
1894:
1895: variable_partagee = d_faux;
1896:
1897: if (((*s_objet_1).type == NOM) &&
1898: (((*s_objet_2).type == INT) ||
1899: ((*s_objet_2).type == REL) ||
1900: ((*s_objet_2).type == CPL) ||
1901: ((*s_objet_2).type == VIN) ||
1902: ((*s_objet_2).type == VRL) ||
1903: ((*s_objet_2).type == VCX) ||
1904: ((*s_objet_2).type == MIN) ||
1905: ((*s_objet_2).type == MRL) ||
1906: ((*s_objet_2).type == MCX)))
1907: {
1908: if (recherche_variable(s_etat_processus, (*((struct_nom *)
1909: (*s_objet_1).objet)).nom) == d_faux)
1910: {
1911: (*s_etat_processus).erreur_systeme = d_es;
1912: (*s_etat_processus).erreur_execution = d_ex_variable_non_definie;
1913:
1914: liberation(s_etat_processus, s_objet_1);
1915: liberation(s_etat_processus, s_objet_2);
1916:
1917: if (test_cfsf(s_etat_processus, 31) == d_vrai)
1918: {
1919: if (empilement_pile_last(s_etat_processus, 0) == d_erreur)
1920: {
1921: return;
1922: }
1923:
1924: (*s_etat_processus).l_base_pile_last = registre_pile_last;
1925: }
1926:
1927: return;
1928: }
1929:
1930: if ((*(*s_etat_processus).pointeur_variable_courante)
1931: .variable_verrouillee == d_vrai)
1932: {
1933: liberation(s_etat_processus, s_objet_1);
1934: liberation(s_etat_processus, s_objet_2);
1935:
1936: if (test_cfsf(s_etat_processus, 31) == d_vrai)
1937: {
1938: if (empilement_pile_last(s_etat_processus, 0) == d_erreur)
1939: {
1940: return;
1941: }
1942:
1943: (*s_etat_processus).l_base_pile_last = registre_pile_last;
1944: }
1945:
1946: (*s_etat_processus).erreur_execution = d_ex_variable_verrouillee;
1947: return;
1948: }
1949:
1950: if ((*(*s_etat_processus).pointeur_variable_courante).objet == NULL)
1951: {
1952: if (pthread_mutex_lock(&((*(*s_etat_processus)
1953: .s_liste_variables_partagees).mutex)) != 0)
1954: {
1955: (*s_etat_processus).erreur_systeme = d_es_processus;
1956: return;
1957: }
1958:
1959: if (recherche_variable_partagee(s_etat_processus,
1960: (*(*s_etat_processus).pointeur_variable_courante).nom,
1961: (*(*s_etat_processus).pointeur_variable_courante)
1962: .variable_partagee, (*(*s_etat_processus)
1963: .pointeur_variable_courante).origine) == d_faux)
1964: {
1965: if (pthread_mutex_unlock(&((*(*s_etat_processus)
1966: .s_liste_variables_partagees).mutex)) != 0)
1967: {
1968: (*s_etat_processus).erreur_systeme = d_es_processus;
1969: return;
1970: }
1971:
1972: (*s_etat_processus).erreur_systeme = d_es;
1973: (*s_etat_processus).erreur_execution =
1974: d_ex_variable_non_definie;
1975:
1976: liberation(s_etat_processus, s_objet_1);
1977: liberation(s_etat_processus, s_objet_2);
1978:
1979: if (test_cfsf(s_etat_processus, 31) == d_vrai)
1980: {
1981: if (empilement_pile_last(s_etat_processus, 0) == d_erreur)
1982: {
1983: return;
1984: }
1985:
1986: (*s_etat_processus).l_base_pile_last = registre_pile_last;
1987: }
1988:
1989: return;
1990: }
1991:
1992: variable_partagee = d_vrai;
1993:
1994: if ((s_objet_3 = copie_objet(s_etat_processus, (*(*s_etat_processus)
1995: .s_liste_variables_partagees).table
1996: [(*(*s_etat_processus).s_liste_variables_partagees)
1997: .position_variable].objet, 'P')) == NULL)
1998: {
1999: if (pthread_mutex_unlock(&((*(*s_etat_processus)
2000: .s_liste_variables_partagees).mutex)) != 0)
2001: {
2002: (*s_etat_processus).erreur_systeme = d_es_processus;
2003: return;
2004: }
2005:
2006: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
2007:
2008: liberation(s_etat_processus, s_objet_1);
2009: liberation(s_etat_processus, s_objet_2);
2010:
2011: if (test_cfsf(s_etat_processus, 31) == d_vrai)
2012: {
2013: if (empilement_pile_last(s_etat_processus, 0) == d_erreur)
2014: {
2015: return;
2016: }
2017:
2018: (*s_etat_processus).l_base_pile_last = registre_pile_last;
2019: }
2020:
2021: return;
2022: }
2023: }
2024: else
2025: {
2026: if ((s_objet_3 = copie_objet(s_etat_processus,
2027: (*(*s_etat_processus).pointeur_variable_courante).objet,
2028: 'P')) == NULL)
2029: {
2030: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
2031:
2032: liberation(s_etat_processus, s_objet_1);
2033: liberation(s_etat_processus, s_objet_2);
2034:
2035: if (test_cfsf(s_etat_processus, 31) == d_vrai)
2036: {
2037: if (empilement_pile_last(s_etat_processus, 0) == d_erreur)
2038: {
2039: return;
2040: }
2041:
2042: (*s_etat_processus).l_base_pile_last = registre_pile_last;
2043: }
2044:
2045: return;
2046: }
2047: }
2048:
2049: if (empilement(s_etat_processus, &((*s_etat_processus).l_base_pile),
2050: s_objet_2) == d_erreur)
2051: {
2052: if (variable_partagee == d_vrai)
2053: {
2054: if (pthread_mutex_unlock(&((*(*s_etat_processus)
2055: .s_liste_variables_partagees).mutex)) != 0)
2056: {
2057: (*s_etat_processus).erreur_systeme = d_es_processus;
2058: return;
2059: }
2060: }
2061:
2062: return;
2063: }
2064:
2065: if (empilement(s_etat_processus, &((*s_etat_processus).l_base_pile),
2066: s_objet_3) == d_erreur)
2067: {
2068: if (variable_partagee == d_vrai)
2069: {
2070: if (pthread_mutex_unlock(&((*(*s_etat_processus)
2071: .s_liste_variables_partagees).mutex)) != 0)
2072: {
2073: (*s_etat_processus).erreur_systeme = d_es_processus;
2074: return;
2075: }
2076: }
2077:
2078: return;
2079: }
2080:
2081: instruction_multiplication(s_etat_processus);
2082: s_objet_2 = NULL;
2083: /* s_objet_2 et s_objet_3 sont libérés par cet appel... */
2084:
2085: if (((*s_etat_processus).erreur_systeme != d_es) ||
2086: ((*s_etat_processus).erreur_execution != d_ex) ||
2087: ((*s_etat_processus).exception != d_ep))
2088: {
2089: if (variable_partagee == d_vrai)
2090: {
2091: if (pthread_mutex_unlock(&((*(*s_etat_processus)
2092: .s_liste_variables_partagees).mutex)) != 0)
2093: {
2094: (*s_etat_processus).erreur_systeme = d_es_processus;
2095: return;
2096: }
2097: }
2098:
2099: liberation(s_etat_processus, s_objet_1);
2100: liberation(s_etat_processus, s_objet_2);
2101:
2102: if (test_cfsf(s_etat_processus, 31) == d_vrai)
2103: {
2104: if (empilement_pile_last(s_etat_processus, 0) == d_erreur)
2105: {
2106: return;
2107: }
2108:
2109: (*s_etat_processus).l_base_pile_last = registre_pile_last;
2110: }
2111:
2112: return;
2113: }
2114:
2115: if (variable_partagee == d_vrai)
2116: {
2117: liberation(s_etat_processus,
2118: (*(*s_etat_processus).s_liste_variables_partagees)
2119: .table[(*(*s_etat_processus).s_liste_variables_partagees)
2120: .position_variable].objet);
2121:
2122: if (depilement(s_etat_processus, &((*s_etat_processus).l_base_pile),
2123: (struct_objet **) &((*(*s_etat_processus)
2124: .s_liste_variables_partagees).table[(*(*s_etat_processus)
2125: .s_liste_variables_partagees).position_variable].objet))
2126: == d_erreur)
2127: {
2128: if (pthread_mutex_unlock(&((*(*s_etat_processus)
2129: .s_liste_variables_partagees).mutex)) != 0)
2130: {
2131: (*s_etat_processus).erreur_systeme = d_es_processus;
2132: return;
2133: }
2134:
2135: liberation(s_etat_processus, s_objet_1);
2136:
2137: if (test_cfsf(s_etat_processus, 31) == d_vrai)
2138: {
2139: if (empilement_pile_last(s_etat_processus, 0) == d_erreur)
2140: {
2141: return;
2142: }
2143:
2144: (*s_etat_processus).l_base_pile_last = registre_pile_last;
2145: }
2146:
2147: (*s_etat_processus).erreur_execution = d_ex_manque_argument;
2148: return;
2149: }
2150:
2151: if (pthread_mutex_unlock(&((*(*s_etat_processus)
2152: .s_liste_variables_partagees).mutex)) != 0)
2153: {
2154: (*s_etat_processus).erreur_systeme = d_es_processus;
2155: return;
2156: }
2157: }
2158: else
2159: {
2160: liberation(s_etat_processus,
2161: (*(*s_etat_processus).pointeur_variable_courante).objet);
2162:
2163: if (depilement(s_etat_processus, &((*s_etat_processus).l_base_pile),
2164: &((*(*s_etat_processus).pointeur_variable_courante).objet))
2165: == d_erreur)
2166: {
2167: liberation(s_etat_processus, s_objet_1);
2168:
2169: if (test_cfsf(s_etat_processus, 31) == d_vrai)
2170: {
2171: if (empilement_pile_last(s_etat_processus, 0) == d_erreur)
2172: {
2173: return;
2174: }
2175:
2176: (*s_etat_processus).l_base_pile_last = registre_pile_last;
2177: }
2178:
2179: (*s_etat_processus).erreur_execution = d_ex_manque_argument;
2180: return;
2181: }
2182: }
2183: }
2184: else if (((*s_objet_2).type == NOM) &&
2185: (((*s_objet_1).type == INT) ||
2186: ((*s_objet_1).type == REL) ||
2187: ((*s_objet_1).type == CPL) ||
2188: ((*s_objet_1).type == VIN) ||
2189: ((*s_objet_1).type == VRL) ||
2190: ((*s_objet_1).type == VCX) ||
2191: ((*s_objet_1).type == MIN) ||
2192: ((*s_objet_1).type == MRL) ||
2193: ((*s_objet_1).type == MCX)))
2194: {
2195: if (recherche_variable(s_etat_processus, (*((struct_nom *)
2196: (*s_objet_2).objet)).nom) == d_faux)
2197: {
2198: (*s_etat_processus).erreur_systeme = d_es;
2199: (*s_etat_processus).erreur_execution = d_ex_variable_non_definie;
2200:
2201: liberation(s_etat_processus, s_objet_1);
2202: liberation(s_etat_processus, s_objet_2);
2203:
2204: if (test_cfsf(s_etat_processus, 31) == d_vrai)
2205: {
2206: if (empilement_pile_last(s_etat_processus, 0) == d_erreur)
2207: {
2208: return;
2209: }
2210:
2211: (*s_etat_processus).l_base_pile_last = registre_pile_last;
2212: }
2213:
2214: return;
2215: }
2216:
2217: if ((*(*s_etat_processus).pointeur_variable_courante)
2218: .variable_verrouillee == d_vrai)
2219: {
2220: liberation(s_etat_processus, s_objet_1);
2221: liberation(s_etat_processus, s_objet_2);
2222:
2223: if (test_cfsf(s_etat_processus, 31) == d_vrai)
2224: {
2225: if (empilement_pile_last(s_etat_processus, 0) == d_erreur)
2226: {
2227: return;
2228: }
2229:
2230: (*s_etat_processus).l_base_pile_last = registre_pile_last;
2231: }
2232:
2233: (*s_etat_processus).erreur_execution = d_ex_variable_verrouillee;
2234: return;
2235: }
2236:
2237: if ((*(*s_etat_processus).pointeur_variable_courante).objet == NULL)
2238: {
2239: if (pthread_mutex_lock(&((*(*s_etat_processus)
2240: .s_liste_variables_partagees).mutex)) != 0)
2241: {
2242: (*s_etat_processus).erreur_systeme = d_es_processus;
2243: return;
2244: }
2245:
2246: if (recherche_variable_partagee(s_etat_processus,
2247: (*(*s_etat_processus).pointeur_variable_courante).nom,
2248: (*(*s_etat_processus).pointeur_variable_courante)
2249: .variable_partagee, (*(*s_etat_processus)
2250: .pointeur_variable_courante).origine) == d_faux)
2251: {
2252: if (pthread_mutex_unlock(&((*(*s_etat_processus)
2253: .s_liste_variables_partagees).mutex)) != 0)
2254: {
2255: (*s_etat_processus).erreur_systeme = d_es_processus;
2256: return;
2257: }
2258:
2259: (*s_etat_processus).erreur_systeme = d_es;
2260: (*s_etat_processus).erreur_execution =
2261: d_ex_variable_non_definie;
2262:
2263: liberation(s_etat_processus, s_objet_1);
2264: liberation(s_etat_processus, s_objet_2);
2265:
2266: if (test_cfsf(s_etat_processus, 31) == d_vrai)
2267: {
2268: if (empilement_pile_last(s_etat_processus, 0) == d_erreur)
2269: {
2270: return;
2271: }
2272:
2273: (*s_etat_processus).l_base_pile_last = registre_pile_last;
2274: }
2275:
2276: return;
2277: }
2278:
2279: variable_partagee = d_vrai;
2280:
2281: if ((s_objet_3 = copie_objet(s_etat_processus, (*(*s_etat_processus)
2282: .s_liste_variables_partagees).table
2283: [(*(*s_etat_processus).s_liste_variables_partagees)
2284: .position_variable].objet, 'P')) == NULL)
2285: {
2286: if (pthread_mutex_unlock(&((*(*s_etat_processus)
2287: .s_liste_variables_partagees).mutex)) != 0)
2288: {
2289: (*s_etat_processus).erreur_systeme = d_es_processus;
2290: return;
2291: }
2292:
2293: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
2294:
2295: liberation(s_etat_processus, s_objet_1);
2296: liberation(s_etat_processus, s_objet_2);
2297:
2298: if (test_cfsf(s_etat_processus, 31) == d_vrai)
2299: {
2300: if (empilement_pile_last(s_etat_processus, 0) == d_erreur)
2301: {
2302: return;
2303: }
2304:
2305: (*s_etat_processus).l_base_pile_last = registre_pile_last;
2306: }
2307:
2308: return;
2309: }
2310: }
2311: else
2312: {
2313: if ((s_objet_3 = copie_objet(s_etat_processus,
2314: (*(*s_etat_processus).pointeur_variable_courante).objet,
2315: 'P')) == NULL)
2316: {
2317: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
2318:
2319: liberation(s_etat_processus, s_objet_1);
2320: liberation(s_etat_processus, s_objet_2);
2321:
2322: if (test_cfsf(s_etat_processus, 31) == d_vrai)
2323: {
2324: if (empilement_pile_last(s_etat_processus, 0) == d_erreur)
2325: {
2326: return;
2327: }
2328:
2329: (*s_etat_processus).l_base_pile_last = registre_pile_last;
2330: }
2331:
2332: return;
2333: }
2334: }
2335:
2336: if (empilement(s_etat_processus, &((*s_etat_processus).l_base_pile),
2337: s_objet_3) == d_erreur)
2338: {
2339: if (variable_partagee == d_vrai)
2340: {
2341: if (pthread_mutex_unlock(&((*(*s_etat_processus)
2342: .s_liste_variables_partagees).mutex)) != 0)
2343: {
2344: (*s_etat_processus).erreur_systeme = d_es_processus;
2345: return;
2346: }
2347: }
2348:
2349: return;
2350: }
2351:
2352: if (empilement(s_etat_processus, &((*s_etat_processus).l_base_pile),
2353: s_objet_1) == d_erreur)
2354: {
2355: if (variable_partagee == d_vrai)
2356: {
2357: if (pthread_mutex_unlock(&((*(*s_etat_processus)
2358: .s_liste_variables_partagees).mutex)) != 0)
2359: {
2360: (*s_etat_processus).erreur_systeme = d_es_processus;
2361: return;
2362: }
2363: }
2364:
2365: return;
2366: }
2367:
2368: instruction_multiplication(s_etat_processus);
2369: s_objet_1 = NULL;
2370: /* s_objet_1 et s_objet_3 sont libérés par cet appel... */
2371:
2372: if (((*s_etat_processus).erreur_systeme != d_es) ||
2373: ((*s_etat_processus).erreur_execution != d_ex) ||
2374: ((*s_etat_processus).exception != d_ep))
2375: {
2376: if (variable_partagee == d_vrai)
2377: {
2378: if (pthread_mutex_unlock(&((*(*s_etat_processus)
2379: .s_liste_variables_partagees).mutex)) != 0)
2380: {
2381: (*s_etat_processus).erreur_systeme = d_es_processus;
2382: return;
2383: }
2384: }
2385:
2386: liberation(s_etat_processus, s_objet_1);
2387: liberation(s_etat_processus, s_objet_2);
2388:
2389: if (test_cfsf(s_etat_processus, 31) == d_vrai)
2390: {
2391: if (empilement_pile_last(s_etat_processus, 0) == d_erreur)
2392: {
2393: return;
2394: }
2395:
2396: (*s_etat_processus).l_base_pile_last = registre_pile_last;
2397: }
2398:
2399: return;
2400: }
2401:
2402: if (variable_partagee == d_vrai)
2403: {
2404: liberation(s_etat_processus,
2405: (*(*s_etat_processus).s_liste_variables_partagees)
2406: .table[(*(*s_etat_processus).s_liste_variables_partagees)
2407: .position_variable].objet);
2408:
2409: if (depilement(s_etat_processus, &((*s_etat_processus).l_base_pile),
2410: (struct_objet **) &((*(*s_etat_processus)
2411: .s_liste_variables_partagees).table[(*(*s_etat_processus)
2412: .s_liste_variables_partagees).position_variable].objet))
2413: == d_erreur)
2414: {
2415: if (pthread_mutex_unlock(&((*(*s_etat_processus)
2416: .s_liste_variables_partagees).mutex)) != 0)
2417: {
2418: (*s_etat_processus).erreur_systeme = d_es_processus;
2419: return;
2420: }
2421:
2422: liberation(s_etat_processus, s_objet_1);
2423:
2424: if (test_cfsf(s_etat_processus, 31) == d_vrai)
2425: {
2426: if (empilement_pile_last(s_etat_processus, 0) == d_erreur)
2427: {
2428: return;
2429: }
2430:
2431: (*s_etat_processus).l_base_pile_last = registre_pile_last;
2432: }
2433:
2434: (*s_etat_processus).erreur_execution = d_ex_manque_argument;
2435: return;
2436: }
2437:
2438: if (pthread_mutex_unlock(&((*(*s_etat_processus)
2439: .s_liste_variables_partagees).mutex)) != 0)
2440: {
2441: (*s_etat_processus).erreur_systeme = d_es_processus;
2442: return;
2443: }
2444: }
2445: else
2446: {
2447: liberation(s_etat_processus,
2448: (*(*s_etat_processus).pointeur_variable_courante).objet);
2449:
2450: if (depilement(s_etat_processus, &((*s_etat_processus).l_base_pile),
2451: &((*(*s_etat_processus).pointeur_variable_courante).objet))
2452: == d_erreur)
2453: {
2454: liberation(s_etat_processus, s_objet_1);
2455:
2456: if (test_cfsf(s_etat_processus, 31) == d_vrai)
2457: {
2458: if (empilement_pile_last(s_etat_processus, 0) == d_erreur)
2459: {
2460: return;
2461: }
2462:
2463: (*s_etat_processus).l_base_pile_last = registre_pile_last;
2464: }
2465:
2466: (*s_etat_processus).erreur_execution = d_ex_manque_argument;
2467: return;
2468: }
2469: }
2470: }
2471:
2472: /*
2473: --------------------------------------------------------------------------------
2474: Arguments incompatibles avec la fonction STO*
2475: --------------------------------------------------------------------------------
2476: */
2477:
2478: else
2479: {
2480: liberation(s_etat_processus, s_objet_1);
2481: liberation(s_etat_processus, s_objet_2);
2482:
2483: if (test_cfsf(s_etat_processus, 31) == d_vrai)
2484: {
2485: if (empilement_pile_last(s_etat_processus, 0) == d_erreur)
2486: {
2487: return;
2488: }
2489:
2490: (*s_etat_processus).l_base_pile_last = registre_pile_last;
2491: }
2492:
2493: (*s_etat_processus).erreur_execution = d_ex_erreur_type_argument;
2494: return;
2495: }
2496:
2497: if (test_cfsf(s_etat_processus, 31) == d_vrai)
2498: {
2499: if (empilement_pile_last(s_etat_processus, 0) == d_erreur)
2500: {
2501: return;
2502: }
2503:
2504: (*s_etat_processus).l_base_pile_last = registre_pile_last;
2505: }
2506:
2507: liberation(s_etat_processus, s_objet_1);
2508: liberation(s_etat_processus, s_objet_2);
2509:
2510: return;
2511: }
2512:
2513:
2514: /*
2515: ================================================================================
2516: Fonction 'sto/'
2517: ================================================================================
2518: Entrées :
2519: --------------------------------------------------------------------------------
2520: Sorties :
2521: --------------------------------------------------------------------------------
2522: Effets de bord : néant
2523: ================================================================================
2524: */
2525:
2526: void
2527: instruction_sto_division(struct_processus *s_etat_processus)
2528: {
2529: logical1 variable_partagee;
2530:
2531: struct_liste_chainee *registre_pile_last;
2532:
2533: struct_objet *s_objet_1;
2534: struct_objet *s_objet_2;
2535: struct_objet *s_objet_3;
2536:
2537: (*s_etat_processus).erreur_execution = d_ex;
2538:
2539: if ((*s_etat_processus).affichage_arguments == 'Y')
2540: {
2541: printf("\n STO/ ");
2542:
2543: if ((*s_etat_processus).langue == 'F')
2544: {
2545: printf("(modification d'une variable par division)\n\n");
2546: }
2547: else
2548: {
2549: printf("(divide the content of a variable)\n\n");
2550: }
2551:
2552: printf(" 2: %s, %s, %s, %s, %s, %s,\n"
2553: " %s, %s, %s\n",
2554: d_INT, d_REL, d_CPL, d_VIN, d_VRL, d_VCX, d_MIN, d_MRL, d_MCX);
2555: printf(" 1: %s\n\n", d_NOM);
2556:
2557: printf(" 2: %s\n", d_NOM);
2558: printf(" 1: %s, %s, %s, %s, %s, %s,\n"
2559: " %s, %s, %s\n",
2560: d_INT, d_REL, d_CPL, d_VIN, d_VRL, d_VCX, d_MIN, d_MRL, d_MCX);
2561:
2562: return;
2563: }
2564: else if ((*s_etat_processus).test_instruction == 'Y')
2565: {
2566: (*s_etat_processus).nombre_arguments = -1;
2567: return;
2568: }
2569:
2570: registre_pile_last = NULL;
2571:
2572: if (test_cfsf(s_etat_processus, 31) == d_vrai)
2573: {
2574: if (empilement_pile_last(s_etat_processus, 2) == d_erreur)
2575: {
2576: return;
2577: }
2578:
2579: registre_pile_last = (*s_etat_processus).l_base_pile_last;
2580: (*s_etat_processus).l_base_pile_last = NULL;
2581: }
2582:
2583: if (depilement(s_etat_processus, &((*s_etat_processus).l_base_pile),
2584: &s_objet_1) == d_erreur)
2585: {
2586: (*s_etat_processus).erreur_execution = d_ex_manque_argument;
2587:
2588: if (test_cfsf(s_etat_processus, 31) == d_vrai)
2589: {
2590: if (empilement_pile_last(s_etat_processus, 0) == d_erreur)
2591: {
2592: return;
2593: }
2594:
2595: (*s_etat_processus).l_base_pile_last = registre_pile_last;
2596: }
2597:
2598: return;
2599: }
2600:
2601: if (depilement(s_etat_processus, &((*s_etat_processus).l_base_pile),
2602: &s_objet_2) == d_erreur)
2603: {
2604: liberation(s_etat_processus, s_objet_1);
2605:
2606: if (test_cfsf(s_etat_processus, 31) == d_vrai)
2607: {
2608: if (empilement_pile_last(s_etat_processus, 0) == d_erreur)
2609: {
2610: return;
2611: }
2612:
2613: (*s_etat_processus).l_base_pile_last = registre_pile_last;
2614: }
2615:
2616: (*s_etat_processus).erreur_execution = d_ex_manque_argument;
2617: return;
2618: }
2619:
2620: /*
2621: --------------------------------------------------------------------------------
2622: Une valeur et un nom
2623: --------------------------------------------------------------------------------
2624: */
2625:
2626: variable_partagee = d_faux;
2627:
2628: if (((*s_objet_1).type == NOM) &&
2629: (((*s_objet_2).type == INT) ||
2630: ((*s_objet_2).type == REL) ||
2631: ((*s_objet_2).type == CPL) ||
2632: ((*s_objet_2).type == VIN) ||
2633: ((*s_objet_2).type == VRL) ||
2634: ((*s_objet_2).type == VCX) ||
2635: ((*s_objet_2).type == MIN) ||
2636: ((*s_objet_2).type == MRL) ||
2637: ((*s_objet_2).type == MCX)))
2638: {
2639: if (recherche_variable(s_etat_processus, (*((struct_nom *)
2640: (*s_objet_1).objet)).nom) == d_faux)
2641: {
2642: (*s_etat_processus).erreur_systeme = d_es;
2643: (*s_etat_processus).erreur_execution = d_ex_variable_non_definie;
2644:
2645: liberation(s_etat_processus, s_objet_1);
2646: liberation(s_etat_processus, s_objet_2);
2647:
2648: if (test_cfsf(s_etat_processus, 31) == d_vrai)
2649: {
2650: if (empilement_pile_last(s_etat_processus, 0) == d_erreur)
2651: {
2652: return;
2653: }
2654:
2655: (*s_etat_processus).l_base_pile_last = registre_pile_last;
2656: }
2657:
2658: return;
2659: }
2660:
2661: if ((*(*s_etat_processus).pointeur_variable_courante)
2662: .variable_verrouillee == d_vrai)
2663: {
2664: liberation(s_etat_processus, s_objet_1);
2665: liberation(s_etat_processus, s_objet_2);
2666:
2667: if (test_cfsf(s_etat_processus, 31) == d_vrai)
2668: {
2669: if (empilement_pile_last(s_etat_processus, 0) == d_erreur)
2670: {
2671: return;
2672: }
2673:
2674: (*s_etat_processus).l_base_pile_last = registre_pile_last;
2675: }
2676:
2677: (*s_etat_processus).erreur_execution = d_ex_variable_verrouillee;
2678: return;
2679: }
2680:
2681: if ((*(*s_etat_processus).pointeur_variable_courante).objet == NULL)
2682: {
2683: if (pthread_mutex_lock(&((*(*s_etat_processus)
2684: .s_liste_variables_partagees).mutex)) != 0)
2685: {
2686: (*s_etat_processus).erreur_systeme = d_es_processus;
2687: return;
2688: }
2689:
2690: if (recherche_variable_partagee(s_etat_processus,
2691: (*(*s_etat_processus).pointeur_variable_courante).nom,
2692: (*(*s_etat_processus).pointeur_variable_courante)
2693: .variable_partagee, (*(*s_etat_processus)
2694: .pointeur_variable_courante).origine) == d_faux)
2695: {
2696: if (pthread_mutex_unlock(&((*(*s_etat_processus)
2697: .s_liste_variables_partagees).mutex)) != 0)
2698: {
2699: (*s_etat_processus).erreur_systeme = d_es_processus;
2700: return;
2701: }
2702:
2703: (*s_etat_processus).erreur_systeme = d_es;
2704: (*s_etat_processus).erreur_execution =
2705: d_ex_variable_non_definie;
2706:
2707: liberation(s_etat_processus, s_objet_1);
2708: liberation(s_etat_processus, s_objet_2);
2709:
2710: if (test_cfsf(s_etat_processus, 31) == d_vrai)
2711: {
2712: if (empilement_pile_last(s_etat_processus, 0) == d_erreur)
2713: {
2714: return;
2715: }
2716:
2717: (*s_etat_processus).l_base_pile_last = registre_pile_last;
2718: }
2719:
2720: return;
2721: }
2722:
2723: variable_partagee = d_vrai;
2724:
2725: if ((s_objet_3 = copie_objet(s_etat_processus, (*(*s_etat_processus)
2726: .s_liste_variables_partagees).table
2727: [(*(*s_etat_processus).s_liste_variables_partagees)
2728: .position_variable].objet, 'P')) == NULL)
2729: {
2730: if (pthread_mutex_unlock(&((*(*s_etat_processus)
2731: .s_liste_variables_partagees).mutex)) != 0)
2732: {
2733: (*s_etat_processus).erreur_systeme = d_es_processus;
2734: return;
2735: }
2736:
2737: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
2738:
2739: liberation(s_etat_processus, s_objet_1);
2740: liberation(s_etat_processus, s_objet_2);
2741:
2742: if (test_cfsf(s_etat_processus, 31) == d_vrai)
2743: {
2744: if (empilement_pile_last(s_etat_processus, 0) == d_erreur)
2745: {
2746: return;
2747: }
2748:
2749: (*s_etat_processus).l_base_pile_last = registre_pile_last;
2750: }
2751:
2752: return;
2753: }
2754: }
2755: else
2756: {
2757: if ((s_objet_3 = copie_objet(s_etat_processus,
2758: (*(*s_etat_processus).pointeur_variable_courante).objet,
2759: 'P')) == NULL)
2760: {
2761: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
2762:
2763: liberation(s_etat_processus, s_objet_1);
2764: liberation(s_etat_processus, s_objet_2);
2765:
2766: if (test_cfsf(s_etat_processus, 31) == d_vrai)
2767: {
2768: if (empilement_pile_last(s_etat_processus, 0) == d_erreur)
2769: {
2770: return;
2771: }
2772:
2773: (*s_etat_processus).l_base_pile_last = registre_pile_last;
2774: }
2775:
2776: return;
2777: }
2778: }
2779:
2780: if (empilement(s_etat_processus, &((*s_etat_processus).l_base_pile),
2781: s_objet_2) == d_erreur)
2782: {
2783: if (variable_partagee == d_vrai)
2784: {
2785: if (pthread_mutex_unlock(&((*(*s_etat_processus)
2786: .s_liste_variables_partagees).mutex)) != 0)
2787: {
2788: (*s_etat_processus).erreur_systeme = d_es_processus;
2789: return;
2790: }
2791: }
2792:
2793: return;
2794: }
2795:
2796: if (empilement(s_etat_processus, &((*s_etat_processus).l_base_pile),
2797: s_objet_3) == d_erreur)
2798: {
2799: if (variable_partagee == d_vrai)
2800: {
2801: if (pthread_mutex_unlock(&((*(*s_etat_processus)
2802: .s_liste_variables_partagees).mutex)) != 0)
2803: {
2804: (*s_etat_processus).erreur_systeme = d_es_processus;
2805: return;
2806: }
2807: }
2808:
2809: return;
2810: }
2811:
2812: instruction_division(s_etat_processus);
2813: s_objet_2 = NULL;
2814: /* s_objet_2 et s_objet_3 sont libérés par cet appel... */
2815:
2816: if (((*s_etat_processus).erreur_systeme != d_es) ||
2817: ((*s_etat_processus).erreur_execution != d_ex) ||
2818: ((*s_etat_processus).exception != d_ep))
2819: {
2820: if (variable_partagee == d_vrai)
2821: {
2822: if (pthread_mutex_unlock(&((*(*s_etat_processus)
2823: .s_liste_variables_partagees).mutex)) != 0)
2824: {
2825: (*s_etat_processus).erreur_systeme = d_es_processus;
2826: return;
2827: }
2828: }
2829:
2830: liberation(s_etat_processus, s_objet_1);
2831: liberation(s_etat_processus, s_objet_2);
2832:
2833: if (test_cfsf(s_etat_processus, 31) == d_vrai)
2834: {
2835: if (empilement_pile_last(s_etat_processus, 0) == d_erreur)
2836: {
2837: return;
2838: }
2839:
2840: (*s_etat_processus).l_base_pile_last = registre_pile_last;
2841: }
2842:
2843: return;
2844: }
2845:
2846: if (variable_partagee == d_vrai)
2847: {
2848: liberation(s_etat_processus,
2849: (*(*s_etat_processus).s_liste_variables_partagees)
2850: .table[(*(*s_etat_processus).s_liste_variables_partagees)
2851: .position_variable].objet);
2852:
2853: if (depilement(s_etat_processus, &((*s_etat_processus).l_base_pile),
2854: (struct_objet **) &((*(*s_etat_processus)
2855: .s_liste_variables_partagees).table[(*(*s_etat_processus)
2856: .s_liste_variables_partagees).position_variable].objet))
2857: == d_erreur)
2858: {
2859: if (pthread_mutex_unlock(&((*(*s_etat_processus)
2860: .s_liste_variables_partagees).mutex)) != 0)
2861: {
2862: (*s_etat_processus).erreur_systeme = d_es_processus;
2863: return;
2864: }
2865:
2866: liberation(s_etat_processus, s_objet_1);
2867:
2868: if (test_cfsf(s_etat_processus, 31) == d_vrai)
2869: {
2870: if (empilement_pile_last(s_etat_processus, 0) == d_erreur)
2871: {
2872: return;
2873: }
2874:
2875: (*s_etat_processus).l_base_pile_last = registre_pile_last;
2876: }
2877:
2878: (*s_etat_processus).erreur_execution = d_ex_manque_argument;
2879: return;
2880: }
2881:
2882: if (pthread_mutex_unlock(&((*(*s_etat_processus)
2883: .s_liste_variables_partagees).mutex)) != 0)
2884: {
2885: (*s_etat_processus).erreur_systeme = d_es_processus;
2886: return;
2887: }
2888: }
2889: else
2890: {
2891: liberation(s_etat_processus,
2892: (*(*s_etat_processus).pointeur_variable_courante).objet);
2893:
2894: if (depilement(s_etat_processus, &((*s_etat_processus).l_base_pile),
2895: &((*(*s_etat_processus).pointeur_variable_courante).objet))
2896: == d_erreur)
2897: {
2898: liberation(s_etat_processus, s_objet_1);
2899:
2900: if (test_cfsf(s_etat_processus, 31) == d_vrai)
2901: {
2902: if (empilement_pile_last(s_etat_processus, 0) == d_erreur)
2903: {
2904: return;
2905: }
2906:
2907: (*s_etat_processus).l_base_pile_last = registre_pile_last;
2908: }
2909:
2910: (*s_etat_processus).erreur_execution = d_ex_manque_argument;
2911: return;
2912: }
2913: }
2914: }
2915: else if (((*s_objet_2).type == NOM) &&
2916: (((*s_objet_1).type == INT) ||
2917: ((*s_objet_1).type == REL) ||
2918: ((*s_objet_1).type == CPL) ||
2919: ((*s_objet_1).type == VIN) ||
2920: ((*s_objet_1).type == VRL) ||
2921: ((*s_objet_1).type == VCX) ||
2922: ((*s_objet_1).type == MIN) ||
2923: ((*s_objet_1).type == MRL) ||
2924: ((*s_objet_1).type == MCX)))
2925: {
2926: if (recherche_variable(s_etat_processus, (*((struct_nom *)
2927: (*s_objet_2).objet)).nom) == d_faux)
2928: {
2929: (*s_etat_processus).erreur_systeme = d_es;
2930: (*s_etat_processus).erreur_execution = d_ex_variable_non_definie;
2931:
2932: liberation(s_etat_processus, s_objet_1);
2933: liberation(s_etat_processus, s_objet_2);
2934:
2935: if (test_cfsf(s_etat_processus, 31) == d_vrai)
2936: {
2937: if (empilement_pile_last(s_etat_processus, 0) == d_erreur)
2938: {
2939: return;
2940: }
2941:
2942: (*s_etat_processus).l_base_pile_last = registre_pile_last;
2943: }
2944:
2945: return;
2946: }
2947:
2948: if ((*(*s_etat_processus).pointeur_variable_courante)
2949: .variable_verrouillee == d_vrai)
2950: {
2951: liberation(s_etat_processus, s_objet_1);
2952: liberation(s_etat_processus, s_objet_2);
2953:
2954: if (test_cfsf(s_etat_processus, 31) == d_vrai)
2955: {
2956: if (empilement_pile_last(s_etat_processus, 0) == d_erreur)
2957: {
2958: return;
2959: }
2960:
2961: (*s_etat_processus).l_base_pile_last = registre_pile_last;
2962: }
2963:
2964: (*s_etat_processus).erreur_execution = d_ex_variable_verrouillee;
2965: return;
2966: }
2967:
2968: if ((*(*s_etat_processus).pointeur_variable_courante).objet == NULL)
2969: {
2970: if (pthread_mutex_lock(&((*(*s_etat_processus)
2971: .s_liste_variables_partagees).mutex)) != 0)
2972: {
2973: (*s_etat_processus).erreur_systeme = d_es_processus;
2974: return;
2975: }
2976:
2977: if (recherche_variable_partagee(s_etat_processus,
2978: (*(*s_etat_processus).pointeur_variable_courante).nom,
2979: (*(*s_etat_processus).pointeur_variable_courante)
2980: .variable_partagee, (*(*s_etat_processus)
2981: .pointeur_variable_courante).origine) == d_faux)
2982: {
2983: if (pthread_mutex_unlock(&((*(*s_etat_processus)
2984: .s_liste_variables_partagees).mutex)) != 0)
2985: {
2986: (*s_etat_processus).erreur_systeme = d_es_processus;
2987: return;
2988: }
2989:
2990: (*s_etat_processus).erreur_systeme = d_es;
2991: (*s_etat_processus).erreur_execution =
2992: d_ex_variable_non_definie;
2993:
2994: liberation(s_etat_processus, s_objet_1);
2995: liberation(s_etat_processus, s_objet_2);
2996:
2997: if (test_cfsf(s_etat_processus, 31) == d_vrai)
2998: {
2999: if (empilement_pile_last(s_etat_processus, 0) == d_erreur)
3000: {
3001: return;
3002: }
3003:
3004: (*s_etat_processus).l_base_pile_last = registre_pile_last;
3005: }
3006:
3007: return;
3008: }
3009:
3010: variable_partagee = d_vrai;
3011:
3012: if ((s_objet_3 = copie_objet(s_etat_processus, (*(*s_etat_processus)
3013: .s_liste_variables_partagees).table
3014: [(*(*s_etat_processus).s_liste_variables_partagees)
3015: .position_variable].objet, 'P')) == NULL)
3016: {
3017: if (pthread_mutex_unlock(&((*(*s_etat_processus)
3018: .s_liste_variables_partagees).mutex)) != 0)
3019: {
3020: (*s_etat_processus).erreur_systeme = d_es_processus;
3021: return;
3022: }
3023:
3024: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
3025:
3026: liberation(s_etat_processus, s_objet_1);
3027: liberation(s_etat_processus, s_objet_2);
3028:
3029: if (test_cfsf(s_etat_processus, 31) == d_vrai)
3030: {
3031: if (empilement_pile_last(s_etat_processus, 0) == d_erreur)
3032: {
3033: return;
3034: }
3035:
3036: (*s_etat_processus).l_base_pile_last = registre_pile_last;
3037: }
3038:
3039: return;
3040: }
3041: }
3042: else
3043: {
3044: if ((s_objet_3 = copie_objet(s_etat_processus,
3045: (*(*s_etat_processus).pointeur_variable_courante).objet,
3046: 'P')) == NULL)
3047: {
3048: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
3049:
3050: liberation(s_etat_processus, s_objet_1);
3051: liberation(s_etat_processus, s_objet_2);
3052:
3053: if (test_cfsf(s_etat_processus, 31) == d_vrai)
3054: {
3055: if (empilement_pile_last(s_etat_processus, 0) == d_erreur)
3056: {
3057: return;
3058: }
3059:
3060: (*s_etat_processus).l_base_pile_last = registre_pile_last;
3061: }
3062:
3063: return;
3064: }
3065: }
3066:
3067: if (empilement(s_etat_processus, &((*s_etat_processus).l_base_pile),
3068: s_objet_3) == d_erreur)
3069: {
3070: if (variable_partagee == d_vrai)
3071: {
3072: if (pthread_mutex_unlock(&((*(*s_etat_processus)
3073: .s_liste_variables_partagees).mutex)) != 0)
3074: {
3075: (*s_etat_processus).erreur_systeme = d_es_processus;
3076: return;
3077: }
3078: }
3079:
3080: return;
3081: }
3082:
3083: if (empilement(s_etat_processus, &((*s_etat_processus).l_base_pile),
3084: s_objet_1) == d_erreur)
3085: {
3086: if (variable_partagee == d_vrai)
3087: {
3088: if (pthread_mutex_unlock(&((*(*s_etat_processus)
3089: .s_liste_variables_partagees).mutex)) != 0)
3090: {
3091: (*s_etat_processus).erreur_systeme = d_es_processus;
3092: return;
3093: }
3094: }
3095:
3096: return;
3097: }
3098:
3099: instruction_division(s_etat_processus);
3100: s_objet_1 = NULL;
3101: /* s_objet_1 et s_objet_3 sont libérés par cet appel... */
3102:
3103: if (((*s_etat_processus).erreur_systeme != d_es) ||
3104: ((*s_etat_processus).erreur_execution != d_ex) ||
3105: ((*s_etat_processus).exception != d_ep))
3106: {
3107: if (variable_partagee == d_vrai)
3108: {
3109: if (pthread_mutex_unlock(&((*(*s_etat_processus)
3110: .s_liste_variables_partagees).mutex)) != 0)
3111: {
3112: (*s_etat_processus).erreur_systeme = d_es_processus;
3113: return;
3114: }
3115: }
3116:
3117: liberation(s_etat_processus, s_objet_1);
3118: liberation(s_etat_processus, s_objet_2);
3119:
3120: if (test_cfsf(s_etat_processus, 31) == d_vrai)
3121: {
3122: if (empilement_pile_last(s_etat_processus, 0) == d_erreur)
3123: {
3124: return;
3125: }
3126:
3127: (*s_etat_processus).l_base_pile_last = registre_pile_last;
3128: }
3129:
3130: return;
3131: }
3132:
3133: if (variable_partagee == d_vrai)
3134: {
3135: liberation(s_etat_processus,
3136: (*(*s_etat_processus).s_liste_variables_partagees)
3137: .table[(*(*s_etat_processus).s_liste_variables_partagees)
3138: .position_variable].objet);
3139:
3140: if (depilement(s_etat_processus, &((*s_etat_processus).l_base_pile),
3141: (struct_objet **) &((*(*s_etat_processus)
3142: .s_liste_variables_partagees).table[(*(*s_etat_processus)
3143: .s_liste_variables_partagees).position_variable].objet))
3144: == d_erreur)
3145: {
3146: if (pthread_mutex_unlock(&((*(*s_etat_processus)
3147: .s_liste_variables_partagees).mutex)) != 0)
3148: {
3149: (*s_etat_processus).erreur_systeme = d_es_processus;
3150: return;
3151: }
3152:
3153: liberation(s_etat_processus, s_objet_1);
3154:
3155: if (test_cfsf(s_etat_processus, 31) == d_vrai)
3156: {
3157: if (empilement_pile_last(s_etat_processus, 0) == d_erreur)
3158: {
3159: return;
3160: }
3161:
3162: (*s_etat_processus).l_base_pile_last = registre_pile_last;
3163: }
3164:
3165: (*s_etat_processus).erreur_execution = d_ex_manque_argument;
3166: return;
3167: }
3168:
3169: if (pthread_mutex_unlock(&((*(*s_etat_processus)
3170: .s_liste_variables_partagees).mutex)) != 0)
3171: {
3172: (*s_etat_processus).erreur_systeme = d_es_processus;
3173: return;
3174: }
3175: }
3176: else
3177: {
3178: liberation(s_etat_processus,
3179: (*(*s_etat_processus).pointeur_variable_courante).objet);
3180:
3181: if (depilement(s_etat_processus, &((*s_etat_processus).l_base_pile),
3182: &((*(*s_etat_processus).pointeur_variable_courante).objet))
3183: == d_erreur)
3184: {
3185: liberation(s_etat_processus, s_objet_1);
3186:
3187: if (test_cfsf(s_etat_processus, 31) == d_vrai)
3188: {
3189: if (empilement_pile_last(s_etat_processus, 0) == d_erreur)
3190: {
3191: return;
3192: }
3193:
3194: (*s_etat_processus).l_base_pile_last = registre_pile_last;
3195: }
3196:
3197: (*s_etat_processus).erreur_execution = d_ex_manque_argument;
3198: return;
3199: }
3200: }
3201: }
3202:
3203: /*
3204: --------------------------------------------------------------------------------
3205: Arguments incompatibles avec la fonction STO/
3206: --------------------------------------------------------------------------------
3207: */
3208:
3209: else
3210: {
3211: liberation(s_etat_processus, s_objet_1);
3212: liberation(s_etat_processus, s_objet_2);
3213:
3214: if (test_cfsf(s_etat_processus, 31) == d_vrai)
3215: {
3216: if (empilement_pile_last(s_etat_processus, 0) == d_erreur)
3217: {
3218: return;
3219: }
3220:
3221: (*s_etat_processus).l_base_pile_last = registre_pile_last;
3222: }
3223:
3224: (*s_etat_processus).erreur_execution = d_ex_erreur_type_argument;
3225: return;
3226: }
3227:
3228: if (test_cfsf(s_etat_processus, 31) == d_vrai)
3229: {
3230: if (empilement_pile_last(s_etat_processus, 0) == d_erreur)
3231: {
3232: return;
3233: }
3234:
3235: (*s_etat_processus).l_base_pile_last = registre_pile_last;
3236: }
3237:
3238: liberation(s_etat_processus, s_objet_1);
3239: liberation(s_etat_processus, s_objet_2);
3240:
3241: return;
3242: }
3243:
3244:
3245: /*
3246: ================================================================================
3247: Fonction 'sneg'
3248: ================================================================================
3249: Entrées :
3250: --------------------------------------------------------------------------------
3251: Sorties :
3252: --------------------------------------------------------------------------------
3253: Effets de bord : néant
3254: ================================================================================
3255: */
3256:
3257: void
3258: instruction_sneg(struct_processus *s_etat_processus)
3259: {
3260: logical1 variable_partagee;
3261:
3262: struct_liste_chainee *registre_pile_last;
3263:
3264: struct_objet *s_objet_1;
3265: struct_objet *s_objet_2;
3266:
3267: (*s_etat_processus).erreur_execution = d_ex;
3268:
3269: if ((*s_etat_processus).affichage_arguments == 'Y')
3270: {
3271: printf("\n SNEG ");
3272:
3273: if ((*s_etat_processus).langue == 'F')
3274: {
3275: printf("(modification d'une variable par opposition)\n\n");
3276: }
3277: else
3278: {
3279: printf("(store the opposite of the content in a variable)\n\n");
3280: }
3281:
3282: printf(" 1: %s\n", d_NOM);
3283:
3284: return;
3285: }
3286: else if ((*s_etat_processus).test_instruction == 'Y')
3287: {
3288: (*s_etat_processus).nombre_arguments = -1;
3289: return;
3290: }
3291:
3292: registre_pile_last = NULL;
3293:
3294: if (test_cfsf(s_etat_processus, 31) == d_vrai)
3295: {
3296: if (empilement_pile_last(s_etat_processus, 1) == d_erreur)
3297: {
3298: return;
3299: }
3300:
3301: registre_pile_last = (*s_etat_processus).l_base_pile_last;
3302: (*s_etat_processus).l_base_pile_last = NULL;
3303: }
3304:
3305: if (depilement(s_etat_processus, &((*s_etat_processus).l_base_pile),
3306: &s_objet_1) == d_erreur)
3307: {
3308: (*s_etat_processus).erreur_execution = d_ex_manque_argument;
3309:
3310: if (test_cfsf(s_etat_processus, 31) == d_vrai)
3311: {
3312: if (empilement_pile_last(s_etat_processus, 0) == d_erreur)
3313: {
3314: return;
3315: }
3316:
3317: (*s_etat_processus).l_base_pile_last = registre_pile_last;
3318: }
3319:
3320: return;
3321: }
3322:
3323: /*
3324: --------------------------------------------------------------------------------
3325: Un nom
3326: --------------------------------------------------------------------------------
3327: */
3328:
3329: if ((*s_objet_1).type == NOM)
3330: {
3331: variable_partagee = d_faux;
3332:
3333: if (recherche_variable(s_etat_processus, (*((struct_nom *)
3334: (*s_objet_1).objet)).nom) == d_faux)
3335: {
3336: (*s_etat_processus).erreur_systeme = d_es;
3337: (*s_etat_processus).erreur_execution = d_ex_variable_non_definie;
3338:
3339: liberation(s_etat_processus, s_objet_1);
3340:
3341: if (test_cfsf(s_etat_processus, 31) == d_vrai)
3342: {
3343: if (empilement_pile_last(s_etat_processus, 0) == d_erreur)
3344: {
3345: return;
3346: }
3347:
3348: (*s_etat_processus).l_base_pile_last = registre_pile_last;
3349: }
3350:
3351: return;
3352: }
3353:
3354: if ((*(*s_etat_processus).pointeur_variable_courante)
3355: .variable_verrouillee == d_vrai)
3356: {
3357: liberation(s_etat_processus, s_objet_1);
3358:
3359: if (test_cfsf(s_etat_processus, 31) == d_vrai)
3360: {
3361: if (empilement_pile_last(s_etat_processus, 0) == d_erreur)
3362: {
3363: return;
3364: }
3365:
3366: (*s_etat_processus).l_base_pile_last = registre_pile_last;
3367: }
3368:
3369: (*s_etat_processus).erreur_execution = d_ex_variable_verrouillee;
3370: return;
3371: }
3372:
3373: if ((*(*s_etat_processus).pointeur_variable_courante).objet == NULL)
3374: {
3375: if (pthread_mutex_lock(&((*(*s_etat_processus)
3376: .s_liste_variables_partagees).mutex)) != 0)
3377: {
3378: (*s_etat_processus).erreur_systeme = d_es_processus;
3379: return;
3380: }
3381:
3382: if (recherche_variable_partagee(s_etat_processus,
3383: (*(*s_etat_processus).pointeur_variable_courante).nom,
3384: (*(*s_etat_processus).pointeur_variable_courante)
3385: .variable_partagee, (*(*s_etat_processus)
3386: .pointeur_variable_courante).origine) == d_faux)
3387: {
3388: if (pthread_mutex_unlock(&((*(*s_etat_processus)
3389: .s_liste_variables_partagees).mutex)) != 0)
3390: {
3391: (*s_etat_processus).erreur_systeme = d_es_processus;
3392: return;
3393: }
3394:
3395: (*s_etat_processus).erreur_systeme = d_es;
3396: (*s_etat_processus).erreur_execution =
3397: d_ex_variable_non_definie;
3398:
3399: liberation(s_etat_processus, s_objet_1);
3400:
3401: if (test_cfsf(s_etat_processus, 31) == d_vrai)
3402: {
3403: if (empilement_pile_last(s_etat_processus, 0) == d_erreur)
3404: {
3405: return;
3406: }
3407:
3408: (*s_etat_processus).l_base_pile_last = registre_pile_last;
3409: }
3410:
3411: return;
3412: }
3413:
3414: variable_partagee = d_vrai;
3415:
3416: if ((s_objet_2 = copie_objet(s_etat_processus, (*(*s_etat_processus)
3417: .s_liste_variables_partagees).table
3418: [(*(*s_etat_processus).s_liste_variables_partagees)
3419: .position_variable].objet, 'P')) == NULL)
3420: {
3421: if (pthread_mutex_unlock(&((*(*s_etat_processus)
3422: .s_liste_variables_partagees).mutex)) != 0)
3423: {
3424: (*s_etat_processus).erreur_systeme = d_es_processus;
3425: return;
3426: }
3427:
3428: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
3429:
3430: liberation(s_etat_processus, s_objet_1);
3431:
3432: if (test_cfsf(s_etat_processus, 31) == d_vrai)
3433: {
3434: if (empilement_pile_last(s_etat_processus, 0) == d_erreur)
3435: {
3436: return;
3437: }
3438:
3439: (*s_etat_processus).l_base_pile_last = registre_pile_last;
3440: }
3441:
3442: return;
3443: }
3444: }
3445: else
3446: {
3447: if ((s_objet_2 = copie_objet(s_etat_processus,
3448: (*(*s_etat_processus).pointeur_variable_courante).objet,
3449: 'P')) == NULL)
3450: {
3451: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
3452:
3453: liberation(s_etat_processus, s_objet_1);
3454:
3455: if (test_cfsf(s_etat_processus, 31) == d_vrai)
3456: {
3457: if (empilement_pile_last(s_etat_processus, 0) == d_erreur)
3458: {
3459: return;
3460: }
3461:
3462: (*s_etat_processus).l_base_pile_last = registre_pile_last;
3463: }
3464:
3465: return;
3466: }
3467: }
3468:
3469: if (empilement(s_etat_processus, &((*s_etat_processus).l_base_pile),
3470: s_objet_2) == d_erreur)
3471: {
3472: if (variable_partagee == d_vrai)
3473: {
3474: if (pthread_mutex_unlock(&((*(*s_etat_processus)
3475: .s_liste_variables_partagees).mutex)) != 0)
3476: {
3477: (*s_etat_processus).erreur_systeme = d_es_processus;
3478: return;
3479: }
3480: }
3481:
3482: return;
3483: }
3484:
3485: instruction_neg(s_etat_processus);
3486: /* s_objet_2 est libéré par cet appel... */
3487:
3488: if (((*s_etat_processus).erreur_systeme != d_es) ||
3489: ((*s_etat_processus).erreur_execution != d_ex) ||
3490: ((*s_etat_processus).exception != d_ep))
3491: {
3492: if (variable_partagee == d_vrai)
3493: {
3494: if (pthread_mutex_unlock(&((*(*s_etat_processus)
3495: .s_liste_variables_partagees).mutex)) != 0)
3496: {
3497: (*s_etat_processus).erreur_systeme = d_es_processus;
3498: return;
3499: }
3500: }
3501:
3502: liberation(s_etat_processus, s_objet_1);
3503: liberation(s_etat_processus, s_objet_2);
3504:
3505: if (test_cfsf(s_etat_processus, 31) == d_vrai)
3506: {
3507: if (empilement_pile_last(s_etat_processus, 0) == d_erreur)
3508: {
3509: return;
3510: }
3511:
3512: (*s_etat_processus).l_base_pile_last = registre_pile_last;
3513: }
3514:
3515: return;
3516: }
3517:
3518: if (variable_partagee == d_vrai)
3519: {
3520: liberation(s_etat_processus,
3521: (*(*s_etat_processus).s_liste_variables_partagees)
3522: .table[(*(*s_etat_processus).s_liste_variables_partagees)
3523: .position_variable].objet);
3524:
3525: if (depilement(s_etat_processus, &((*s_etat_processus).l_base_pile),
3526: (struct_objet **) &((*(*s_etat_processus)
3527: .s_liste_variables_partagees).table[(*(*s_etat_processus)
3528: .s_liste_variables_partagees).position_variable].objet))
3529: == d_erreur)
3530: {
3531: if (pthread_mutex_unlock(&((*(*s_etat_processus)
3532: .s_liste_variables_partagees).mutex)) != 0)
3533: {
3534: (*s_etat_processus).erreur_systeme = d_es_processus;
3535: return;
3536: }
3537:
3538: liberation(s_etat_processus, s_objet_1);
3539:
3540: if (test_cfsf(s_etat_processus, 31) == d_vrai)
3541: {
3542: if (empilement_pile_last(s_etat_processus, 0) == d_erreur)
3543: {
3544: return;
3545: }
3546:
3547: (*s_etat_processus).l_base_pile_last = registre_pile_last;
3548: }
3549:
3550: (*s_etat_processus).erreur_execution = d_ex_manque_argument;
3551: return;
3552: }
3553:
3554: if (pthread_mutex_unlock(&((*(*s_etat_processus)
3555: .s_liste_variables_partagees).mutex)) != 0)
3556: {
3557: (*s_etat_processus).erreur_systeme = d_es_processus;
3558: return;
3559: }
3560: }
3561: else
3562: {
3563: liberation(s_etat_processus,
3564: (*(*s_etat_processus).pointeur_variable_courante).objet);
3565:
3566: if (depilement(s_etat_processus, &((*s_etat_processus).l_base_pile),
3567: &((*(*s_etat_processus).pointeur_variable_courante).objet))
3568: == d_erreur)
3569: {
3570: liberation(s_etat_processus, s_objet_1);
3571:
3572: if (test_cfsf(s_etat_processus, 31) == d_vrai)
3573: {
3574: if (empilement_pile_last(s_etat_processus, 0) == d_erreur)
3575: {
3576: return;
3577: }
3578:
3579: (*s_etat_processus).l_base_pile_last = registre_pile_last;
3580: }
3581:
3582: (*s_etat_processus).erreur_execution = d_ex_manque_argument;
3583: return;
3584: }
3585: }
3586: }
3587:
3588: /*
3589: --------------------------------------------------------------------------------
3590: Arguments incompatibles avec la fonction SNEG
3591: --------------------------------------------------------------------------------
3592: */
3593:
3594: else
3595: {
3596: liberation(s_etat_processus, s_objet_1);
3597:
3598: if (test_cfsf(s_etat_processus, 31) == d_vrai)
3599: {
3600: if (empilement_pile_last(s_etat_processus, 0) == d_erreur)
3601: {
3602: return;
3603: }
3604:
3605: (*s_etat_processus).l_base_pile_last = registre_pile_last;
3606: }
3607:
3608: (*s_etat_processus).erreur_execution = d_ex_erreur_type_argument;
3609: return;
3610: }
3611:
3612: if (test_cfsf(s_etat_processus, 31) == d_vrai)
3613: {
3614: if (empilement_pile_last(s_etat_processus, 0) == d_erreur)
3615: {
3616: return;
3617: }
3618:
3619: (*s_etat_processus).l_base_pile_last = registre_pile_last;
3620: }
3621:
3622: liberation(s_etat_processus, s_objet_1);
3623:
3624: return;
3625: }
3626:
3627:
3628: /*
3629: ================================================================================
3630: Fonction 'sinv'
3631: ================================================================================
3632: Entrées :
3633: --------------------------------------------------------------------------------
3634: Sorties :
3635: --------------------------------------------------------------------------------
3636: Effets de bord : néant
3637: ================================================================================
3638: */
3639:
3640: void
3641: instruction_sinv(struct_processus *s_etat_processus)
3642: {
3643: logical1 variable_partagee;
3644:
3645: struct_liste_chainee *registre_pile_last;
3646:
3647: struct_objet *s_objet_1;
3648: struct_objet *s_objet_2;
3649:
3650: (*s_etat_processus).erreur_execution = d_ex;
3651:
3652: if ((*s_etat_processus).affichage_arguments == 'Y')
3653: {
3654: printf("\n SINV ");
3655:
3656: if ((*s_etat_processus).langue == 'F')
3657: {
3658: printf("(modification d'une variable par inversion)\n\n");
3659: }
3660: else
3661: {
3662: printf("(store the inverse of the content in a variable)\n\n");
3663: }
3664:
3665: printf(" 1: %s\n", d_NOM);
3666:
3667: return;
3668: }
3669: else if ((*s_etat_processus).test_instruction == 'Y')
3670: {
3671: (*s_etat_processus).nombre_arguments = -1;
3672: return;
3673: }
3674:
3675: registre_pile_last = NULL;
3676:
3677: if (test_cfsf(s_etat_processus, 31) == d_vrai)
3678: {
3679: if (empilement_pile_last(s_etat_processus, 1) == d_erreur)
3680: {
3681: return;
3682: }
3683:
3684: registre_pile_last = (*s_etat_processus).l_base_pile_last;
3685: (*s_etat_processus).l_base_pile_last = NULL;
3686: }
3687:
3688: if (depilement(s_etat_processus, &((*s_etat_processus).l_base_pile),
3689: &s_objet_1) == d_erreur)
3690: {
3691: (*s_etat_processus).erreur_execution = d_ex_manque_argument;
3692:
3693: if (test_cfsf(s_etat_processus, 31) == d_vrai)
3694: {
3695: if (empilement_pile_last(s_etat_processus, 0) == d_erreur)
3696: {
3697: return;
3698: }
3699:
3700: (*s_etat_processus).l_base_pile_last = registre_pile_last;
3701: }
3702:
3703: return;
3704: }
3705:
3706: /*
3707: --------------------------------------------------------------------------------
3708: Un nom
3709: --------------------------------------------------------------------------------
3710: */
3711:
3712: if ((*s_objet_1).type == NOM)
3713: {
3714: variable_partagee = d_faux;
3715:
3716: if (recherche_variable(s_etat_processus, (*((struct_nom *)
3717: (*s_objet_1).objet)).nom) == d_faux)
3718: {
3719: (*s_etat_processus).erreur_systeme = d_es;
3720: (*s_etat_processus).erreur_execution = d_ex_variable_non_definie;
3721:
3722: liberation(s_etat_processus, s_objet_1);
3723:
3724: if (test_cfsf(s_etat_processus, 31) == d_vrai)
3725: {
3726: if (empilement_pile_last(s_etat_processus, 0) == d_erreur)
3727: {
3728: return;
3729: }
3730:
3731: (*s_etat_processus).l_base_pile_last = registre_pile_last;
3732: }
3733:
3734: return;
3735: }
3736:
3737: if ((*(*s_etat_processus).pointeur_variable_courante)
3738: .variable_verrouillee == d_vrai)
3739: {
3740: liberation(s_etat_processus, s_objet_1);
3741:
3742: if (test_cfsf(s_etat_processus, 31) == d_vrai)
3743: {
3744: if (empilement_pile_last(s_etat_processus, 0) == d_erreur)
3745: {
3746: return;
3747: }
3748:
3749: (*s_etat_processus).l_base_pile_last = registre_pile_last;
3750: }
3751:
3752: (*s_etat_processus).erreur_execution = d_ex_variable_verrouillee;
3753: return;
3754: }
3755:
3756: if ((*(*s_etat_processus).pointeur_variable_courante).objet == NULL)
3757: {
3758: if (pthread_mutex_lock(&((*(*s_etat_processus)
3759: .s_liste_variables_partagees).mutex)) != 0)
3760: {
3761: (*s_etat_processus).erreur_systeme = d_es_processus;
3762: return;
3763: }
3764:
3765: if (recherche_variable_partagee(s_etat_processus,
3766: (*(*s_etat_processus).pointeur_variable_courante).nom,
3767: (*(*s_etat_processus).pointeur_variable_courante)
3768: .variable_partagee, (*(*s_etat_processus)
3769: .pointeur_variable_courante).origine) == d_faux)
3770: {
3771: if (pthread_mutex_unlock(&((*(*s_etat_processus)
3772: .s_liste_variables_partagees).mutex)) != 0)
3773: {
3774: (*s_etat_processus).erreur_systeme = d_es_processus;
3775: return;
3776: }
3777:
3778: (*s_etat_processus).erreur_systeme = d_es;
3779: (*s_etat_processus).erreur_execution =
3780: d_ex_variable_non_definie;
3781:
3782: liberation(s_etat_processus, s_objet_1);
3783:
3784: if (test_cfsf(s_etat_processus, 31) == d_vrai)
3785: {
3786: if (empilement_pile_last(s_etat_processus, 0) == d_erreur)
3787: {
3788: return;
3789: }
3790:
3791: (*s_etat_processus).l_base_pile_last = registre_pile_last;
3792: }
3793:
3794: return;
3795: }
3796:
3797: variable_partagee = d_vrai;
3798:
3799: if ((s_objet_2 = copie_objet(s_etat_processus, (*(*s_etat_processus)
3800: .s_liste_variables_partagees).table
3801: [(*(*s_etat_processus).s_liste_variables_partagees)
3802: .position_variable].objet, 'P')) == NULL)
3803: {
3804: if (pthread_mutex_unlock(&((*(*s_etat_processus)
3805: .s_liste_variables_partagees).mutex)) != 0)
3806: {
3807: (*s_etat_processus).erreur_systeme = d_es_processus;
3808: return;
3809: }
3810:
3811: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
3812:
3813: liberation(s_etat_processus, s_objet_1);
3814:
3815: if (test_cfsf(s_etat_processus, 31) == d_vrai)
3816: {
3817: if (empilement_pile_last(s_etat_processus, 0) == d_erreur)
3818: {
3819: return;
3820: }
3821:
3822: (*s_etat_processus).l_base_pile_last = registre_pile_last;
3823: }
3824:
3825: return;
3826: }
3827: }
3828: else
3829: {
3830: if ((s_objet_2 = copie_objet(s_etat_processus,
3831: (*(*s_etat_processus).pointeur_variable_courante).objet,
3832: 'P')) == NULL)
3833: {
3834: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
3835:
3836: liberation(s_etat_processus, s_objet_1);
3837:
3838: if (test_cfsf(s_etat_processus, 31) == d_vrai)
3839: {
3840: if (empilement_pile_last(s_etat_processus, 0) == d_erreur)
3841: {
3842: return;
3843: }
3844:
3845: (*s_etat_processus).l_base_pile_last = registre_pile_last;
3846: }
3847:
3848: return;
3849: }
3850: }
3851:
3852: if (empilement(s_etat_processus, &((*s_etat_processus).l_base_pile),
3853: s_objet_2) == d_erreur)
3854: {
3855: if (variable_partagee == d_vrai)
3856: {
3857: if (pthread_mutex_unlock(&((*(*s_etat_processus)
3858: .s_liste_variables_partagees).mutex)) != 0)
3859: {
3860: (*s_etat_processus).erreur_systeme = d_es_processus;
3861: return;
3862: }
3863: }
3864:
3865: return;
3866: }
3867:
3868: instruction_inv(s_etat_processus);
3869: /* s_objet_2 est libéré par cet appel... */
3870:
3871: if (((*s_etat_processus).erreur_systeme != d_es) ||
3872: ((*s_etat_processus).erreur_execution != d_ex) ||
3873: ((*s_etat_processus).exception != d_ep))
3874: {
3875: if (variable_partagee == d_vrai)
3876: {
3877: if (pthread_mutex_unlock(&((*(*s_etat_processus)
3878: .s_liste_variables_partagees).mutex)) != 0)
3879: {
3880: (*s_etat_processus).erreur_systeme = d_es_processus;
3881: return;
3882: }
3883: }
3884:
3885: liberation(s_etat_processus, s_objet_1);
3886: liberation(s_etat_processus, s_objet_2);
3887:
3888: if (test_cfsf(s_etat_processus, 31) == d_vrai)
3889: {
3890: if (empilement_pile_last(s_etat_processus, 0) == d_erreur)
3891: {
3892: return;
3893: }
3894:
3895: (*s_etat_processus).l_base_pile_last = registre_pile_last;
3896: }
3897:
3898: return;
3899: }
3900:
3901: if (variable_partagee == d_vrai)
3902: {
3903: liberation(s_etat_processus,
3904: (*(*s_etat_processus).s_liste_variables_partagees)
3905: .table[(*(*s_etat_processus).s_liste_variables_partagees)
3906: .position_variable].objet);
3907:
3908: if (depilement(s_etat_processus, &((*s_etat_processus).l_base_pile),
3909: (struct_objet **) &((*(*s_etat_processus)
3910: .s_liste_variables_partagees).table[(*(*s_etat_processus)
3911: .s_liste_variables_partagees).position_variable].objet))
3912: == d_erreur)
3913: {
3914: if (pthread_mutex_unlock(&((*(*s_etat_processus)
3915: .s_liste_variables_partagees).mutex)) != 0)
3916: {
3917: (*s_etat_processus).erreur_systeme = d_es_processus;
3918: return;
3919: }
3920:
3921: liberation(s_etat_processus, s_objet_1);
3922:
3923: if (test_cfsf(s_etat_processus, 31) == d_vrai)
3924: {
3925: if (empilement_pile_last(s_etat_processus, 0) == d_erreur)
3926: {
3927: return;
3928: }
3929:
3930: (*s_etat_processus).l_base_pile_last = registre_pile_last;
3931: }
3932:
3933: (*s_etat_processus).erreur_execution = d_ex_manque_argument;
3934: return;
3935: }
3936:
3937: if (pthread_mutex_unlock(&((*(*s_etat_processus)
3938: .s_liste_variables_partagees).mutex)) != 0)
3939: {
3940: (*s_etat_processus).erreur_systeme = d_es_processus;
3941: return;
3942: }
3943: }
3944: else
3945: {
3946: liberation(s_etat_processus,
3947: (*(*s_etat_processus).pointeur_variable_courante).objet);
3948:
3949: if (depilement(s_etat_processus, &((*s_etat_processus).l_base_pile),
3950: &((*(*s_etat_processus).pointeur_variable_courante).objet))
3951: == d_erreur)
3952: {
3953: liberation(s_etat_processus, s_objet_1);
3954:
3955: if (test_cfsf(s_etat_processus, 31) == d_vrai)
3956: {
3957: if (empilement_pile_last(s_etat_processus, 0) == d_erreur)
3958: {
3959: return;
3960: }
3961:
3962: (*s_etat_processus).l_base_pile_last = registre_pile_last;
3963: }
3964:
3965: (*s_etat_processus).erreur_execution = d_ex_manque_argument;
3966: return;
3967: }
3968: }
3969: }
3970:
3971: /*
3972: --------------------------------------------------------------------------------
3973: Arguments incompatibles avec la fonction SINV
3974: --------------------------------------------------------------------------------
3975: */
3976:
3977: else
3978: {
3979: liberation(s_etat_processus, s_objet_1);
3980:
3981: if (test_cfsf(s_etat_processus, 31) == d_vrai)
3982: {
3983: if (empilement_pile_last(s_etat_processus, 0) == d_erreur)
3984: {
3985: return;
3986: }
3987:
3988: (*s_etat_processus).l_base_pile_last = registre_pile_last;
3989: }
3990:
3991: (*s_etat_processus).erreur_execution = d_ex_erreur_type_argument;
3992: return;
3993: }
3994:
3995: if (test_cfsf(s_etat_processus, 31) == d_vrai)
3996: {
3997: if (empilement_pile_last(s_etat_processus, 0) == d_erreur)
3998: {
3999: return;
4000: }
4001:
4002: (*s_etat_processus).l_base_pile_last = registre_pile_last;
4003: }
4004:
4005: liberation(s_etat_processus, s_objet_1);
4006:
4007: return;
4008: }
4009:
4010:
4011: /*
4012: ================================================================================
4013: Fonction 'sconj'
4014: ================================================================================
4015: Entrées :
4016: --------------------------------------------------------------------------------
4017: Sorties :
4018: --------------------------------------------------------------------------------
4019: Effets de bord : néant
4020: ================================================================================
4021: */
4022:
4023: void
4024: instruction_sconj(struct_processus *s_etat_processus)
4025: {
4026: logical1 variable_partagee;
4027:
4028: struct_liste_chainee *registre_pile_last;
4029:
4030: struct_objet *s_objet_1;
4031: struct_objet *s_objet_2;
4032:
4033: (*s_etat_processus).erreur_execution = d_ex;
4034:
4035: if ((*s_etat_processus).affichage_arguments == 'Y')
4036: {
4037: printf("\n SCONJ ");
4038:
4039: if ((*s_etat_processus).langue == 'F')
4040: {
4041: printf("(modification d'une variable par conjugaison)\n\n");
4042: }
4043: else
4044: {
4045: printf("(store the conjugate of the content in a variable)\n\n");
4046: }
4047:
4048: printf(" 1: %s\n", d_NOM);
4049:
4050: return;
4051: }
4052: else if ((*s_etat_processus).test_instruction == 'Y')
4053: {
4054: (*s_etat_processus).nombre_arguments = -1;
4055: return;
4056: }
4057:
4058: registre_pile_last = NULL;
4059:
4060: if (test_cfsf(s_etat_processus, 31) == d_vrai)
4061: {
4062: if (empilement_pile_last(s_etat_processus, 1) == d_erreur)
4063: {
4064: return;
4065: }
4066:
4067: registre_pile_last = (*s_etat_processus).l_base_pile_last;
4068: (*s_etat_processus).l_base_pile_last = NULL;
4069: }
4070:
4071: if (depilement(s_etat_processus, &((*s_etat_processus).l_base_pile),
4072: &s_objet_1) == d_erreur)
4073: {
4074: (*s_etat_processus).erreur_execution = d_ex_manque_argument;
4075:
4076: if (test_cfsf(s_etat_processus, 31) == d_vrai)
4077: {
4078: if (empilement_pile_last(s_etat_processus, 0) == d_erreur)
4079: {
4080: return;
4081: }
4082:
4083: (*s_etat_processus).l_base_pile_last = registre_pile_last;
4084: }
4085:
4086: return;
4087: }
4088:
4089: /*
4090: --------------------------------------------------------------------------------
4091: Un nom
4092: --------------------------------------------------------------------------------
4093: */
4094:
4095: if ((*s_objet_1).type == NOM)
4096: {
4097: variable_partagee = d_faux;
4098:
4099: if (recherche_variable(s_etat_processus, (*((struct_nom *)
4100: (*s_objet_1).objet)).nom) == d_faux)
4101: {
4102: (*s_etat_processus).erreur_systeme = d_es;
4103: (*s_etat_processus).erreur_execution = d_ex_variable_non_definie;
4104:
4105: liberation(s_etat_processus, s_objet_1);
4106:
4107: if (test_cfsf(s_etat_processus, 31) == d_vrai)
4108: {
4109: if (empilement_pile_last(s_etat_processus, 0) == d_erreur)
4110: {
4111: return;
4112: }
4113:
4114: (*s_etat_processus).l_base_pile_last = registre_pile_last;
4115: }
4116:
4117: return;
4118: }
4119:
4120: if ((*(*s_etat_processus).pointeur_variable_courante)
4121: .variable_verrouillee == d_vrai)
4122: {
4123: liberation(s_etat_processus, s_objet_1);
4124:
4125: if (test_cfsf(s_etat_processus, 31) == d_vrai)
4126: {
4127: if (empilement_pile_last(s_etat_processus, 0) == d_erreur)
4128: {
4129: return;
4130: }
4131:
4132: (*s_etat_processus).l_base_pile_last = registre_pile_last;
4133: }
4134:
4135: (*s_etat_processus).erreur_execution = d_ex_variable_verrouillee;
4136: return;
4137: }
4138:
4139: if ((*(*s_etat_processus).pointeur_variable_courante).objet == NULL)
4140: {
4141: if (pthread_mutex_lock(&((*(*s_etat_processus)
4142: .s_liste_variables_partagees).mutex)) != 0)
4143: {
4144: (*s_etat_processus).erreur_systeme = d_es_processus;
4145: return;
4146: }
4147:
4148: if (recherche_variable_partagee(s_etat_processus,
4149: (*(*s_etat_processus).pointeur_variable_courante).nom,
4150: (*(*s_etat_processus).pointeur_variable_courante)
4151: .variable_partagee, (*(*s_etat_processus)
4152: .pointeur_variable_courante).origine) == d_faux)
4153: {
4154: if (pthread_mutex_unlock(&((*(*s_etat_processus)
4155: .s_liste_variables_partagees).mutex)) != 0)
4156: {
4157: (*s_etat_processus).erreur_systeme = d_es_processus;
4158: return;
4159: }
4160:
4161: (*s_etat_processus).erreur_systeme = d_es;
4162: (*s_etat_processus).erreur_execution =
4163: d_ex_variable_non_definie;
4164:
4165: liberation(s_etat_processus, s_objet_1);
4166:
4167: if (test_cfsf(s_etat_processus, 31) == d_vrai)
4168: {
4169: if (empilement_pile_last(s_etat_processus, 0) == d_erreur)
4170: {
4171: return;
4172: }
4173:
4174: (*s_etat_processus).l_base_pile_last = registre_pile_last;
4175: }
4176:
4177: return;
4178: }
4179:
4180: variable_partagee = d_vrai;
4181:
4182: if ((s_objet_2 = copie_objet(s_etat_processus, (*(*s_etat_processus)
4183: .s_liste_variables_partagees).table
4184: [(*(*s_etat_processus).s_liste_variables_partagees)
4185: .position_variable].objet, 'P')) == NULL)
4186: {
4187: if (pthread_mutex_unlock(&((*(*s_etat_processus)
4188: .s_liste_variables_partagees).mutex)) != 0)
4189: {
4190: (*s_etat_processus).erreur_systeme = d_es_processus;
4191: return;
4192: }
4193:
4194: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
4195:
4196: liberation(s_etat_processus, s_objet_1);
4197:
4198: if (test_cfsf(s_etat_processus, 31) == d_vrai)
4199: {
4200: if (empilement_pile_last(s_etat_processus, 0) == d_erreur)
4201: {
4202: return;
4203: }
4204:
4205: (*s_etat_processus).l_base_pile_last = registre_pile_last;
4206: }
4207:
4208: return;
4209: }
4210: }
4211: else
4212: {
4213: if ((s_objet_2 = copie_objet(s_etat_processus,
4214: (*(*s_etat_processus).pointeur_variable_courante).objet,
4215: 'P')) == NULL)
4216: {
4217: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
4218:
4219: liberation(s_etat_processus, s_objet_1);
4220:
4221: if (test_cfsf(s_etat_processus, 31) == d_vrai)
4222: {
4223: if (empilement_pile_last(s_etat_processus, 0) == d_erreur)
4224: {
4225: return;
4226: }
4227:
4228: (*s_etat_processus).l_base_pile_last = registre_pile_last;
4229: }
4230:
4231: return;
4232: }
4233: }
4234:
4235: if (empilement(s_etat_processus, &((*s_etat_processus).l_base_pile),
4236: s_objet_2) == d_erreur)
4237: {
4238: if (variable_partagee == d_vrai)
4239: {
4240: if (pthread_mutex_unlock(&((*(*s_etat_processus)
4241: .s_liste_variables_partagees).mutex)) != 0)
4242: {
4243: (*s_etat_processus).erreur_systeme = d_es_processus;
4244: return;
4245: }
4246: }
4247:
4248: return;
4249: }
4250:
4251: instruction_conj(s_etat_processus);
4252: /* s_objet_2 est libéré par cet appel... */
4253:
4254: if (((*s_etat_processus).erreur_systeme != d_es) ||
4255: ((*s_etat_processus).erreur_execution != d_ex) ||
4256: ((*s_etat_processus).exception != d_ep))
4257: {
4258: if (variable_partagee == d_vrai)
4259: {
4260: if (pthread_mutex_unlock(&((*(*s_etat_processus)
4261: .s_liste_variables_partagees).mutex)) != 0)
4262: {
4263: (*s_etat_processus).erreur_systeme = d_es_processus;
4264: return;
4265: }
4266: }
4267:
4268: liberation(s_etat_processus, s_objet_1);
4269: liberation(s_etat_processus, s_objet_2);
4270:
4271: if (test_cfsf(s_etat_processus, 31) == d_vrai)
4272: {
4273: if (empilement_pile_last(s_etat_processus, 0) == d_erreur)
4274: {
4275: return;
4276: }
4277:
4278: (*s_etat_processus).l_base_pile_last = registre_pile_last;
4279: }
4280:
4281: return;
4282: }
4283:
4284: if (variable_partagee == d_vrai)
4285: {
4286: liberation(s_etat_processus,
4287: (*(*s_etat_processus).s_liste_variables_partagees)
4288: .table[(*(*s_etat_processus).s_liste_variables_partagees)
4289: .position_variable].objet);
4290:
4291: if (depilement(s_etat_processus, &((*s_etat_processus).l_base_pile),
4292: (struct_objet **) &((*(*s_etat_processus)
4293: .s_liste_variables_partagees).table[(*(*s_etat_processus)
4294: .s_liste_variables_partagees).position_variable].objet))
4295: == d_erreur)
4296: {
4297: if (pthread_mutex_unlock(&((*(*s_etat_processus)
4298: .s_liste_variables_partagees).mutex)) != 0)
4299: {
4300: (*s_etat_processus).erreur_systeme = d_es_processus;
4301: return;
4302: }
4303:
4304: liberation(s_etat_processus, s_objet_1);
4305:
4306: if (test_cfsf(s_etat_processus, 31) == d_vrai)
4307: {
4308: if (empilement_pile_last(s_etat_processus, 0) == d_erreur)
4309: {
4310: return;
4311: }
4312:
4313: (*s_etat_processus).l_base_pile_last = registre_pile_last;
4314: }
4315:
4316: (*s_etat_processus).erreur_execution = d_ex_manque_argument;
4317: return;
4318: }
4319:
4320: if (pthread_mutex_unlock(&((*(*s_etat_processus)
4321: .s_liste_variables_partagees).mutex)) != 0)
4322: {
4323: (*s_etat_processus).erreur_systeme = d_es_processus;
4324: return;
4325: }
4326: }
4327: else
4328: {
4329: liberation(s_etat_processus,
4330: (*(*s_etat_processus).pointeur_variable_courante).objet);
4331:
4332: if (depilement(s_etat_processus, &((*s_etat_processus).l_base_pile),
4333: &((*(*s_etat_processus).pointeur_variable_courante).objet))
4334: == d_erreur)
4335: {
4336: liberation(s_etat_processus, s_objet_1);
4337:
4338: if (test_cfsf(s_etat_processus, 31) == d_vrai)
4339: {
4340: if (empilement_pile_last(s_etat_processus, 0) == d_erreur)
4341: {
4342: return;
4343: }
4344:
4345: (*s_etat_processus).l_base_pile_last = registre_pile_last;
4346: }
4347:
4348: (*s_etat_processus).erreur_execution = d_ex_manque_argument;
4349: return;
4350: }
4351: }
4352: }
4353:
4354: /*
4355: --------------------------------------------------------------------------------
4356: Arguments incompatibles avec la fonction SCONJ
4357: --------------------------------------------------------------------------------
4358: */
4359:
4360: else
4361: {
4362: liberation(s_etat_processus, s_objet_1);
4363:
4364: if (test_cfsf(s_etat_processus, 31) == d_vrai)
4365: {
4366: if (empilement_pile_last(s_etat_processus, 0) == d_erreur)
4367: {
4368: return;
4369: }
4370:
4371: (*s_etat_processus).l_base_pile_last = registre_pile_last;
4372: }
4373:
4374: (*s_etat_processus).erreur_execution = d_ex_erreur_type_argument;
4375: return;
4376: }
4377:
4378: if (test_cfsf(s_etat_processus, 31) == d_vrai)
4379: {
4380: if (empilement_pile_last(s_etat_processus, 0) == d_erreur)
4381: {
4382: return;
4383: }
4384:
4385: (*s_etat_processus).l_base_pile_last = registre_pile_last;
4386: }
4387:
4388: liberation(s_etat_processus, s_objet_1);
4389:
4390: return;
4391: }
4392:
4393: // vim: ts=4
CVSweb interface <joel.bertrand@systella.fr>