File:
[local] /
rpl /
src /
instructions_r5.c
Revision
1.8:
download - view:
text,
annotated -
select for diffs -
revision graph
Fri Apr 30 15:01:14 2010 UTC (15 years ago) by
bertrand
Branches:
MAIN
CVS tags:
HEAD
Correction de ROW+ (la nouvelle ligne de la matrice était toujours ajoutée en
dernière position). Sortie de tout ce qui peut être sorti de sections entre
sémaphores de interrutions.c à fins de déverminage. Je suspecte un bug de timing
aboutissant à une corruption du tas.
1: /*
2: ================================================================================
3: RPL/2 (R) version 4.0.15
4: Copyright (C) 1989-2010 Dr. BERTRAND Joël
5:
6: This file is part of RPL/2.
7:
8: RPL/2 is free software; you can redistribute it and/or modify it
9: under the terms of the CeCILL V2 License as published by the french
10: CEA, CNRS and INRIA.
11:
12: RPL/2 is distributed in the hope that it will be useful, but WITHOUT
13: ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
14: FITNESS FOR A PARTICULAR PURPOSE. See the CeCILL V2 License
15: for more details.
16:
17: You should have received a copy of the CeCILL License
18: along with RPL/2. If not, write to info@cecill.info.
19: ================================================================================
20: */
21:
22:
23: #include "rpl.conv.h"
24:
25:
26: /*
27: ================================================================================
28: Fonction 'rswp'
29: ================================================================================
30: Entrées : pointeur sur une structure struct_processus
31: --------------------------------------------------------------------------------
32: Sorties :
33: --------------------------------------------------------------------------------
34: Effets de bord : néant
35: ================================================================================
36: */
37:
38: void
39: instruction_rswp(struct_processus *s_etat_processus)
40: {
41: struct_objet *s_copie_argument_3;
42: struct_objet *s_objet_argument_1;
43: struct_objet *s_objet_argument_2;
44: struct_objet *s_objet_argument_3;
45:
46: signed long ligne_1;
47: signed long ligne_2;
48:
49: void *tampon;
50:
51: (*s_etat_processus).erreur_execution = d_ex;
52:
53: if ((*s_etat_processus).affichage_arguments == 'Y')
54: {
55: printf("\n RSWP ");
56:
57: if ((*s_etat_processus).langue == 'F')
58: {
59: printf("(échange de deux lignes d'une matrice)\n\n");
60: }
61: else
62: {
63: printf("(swap two rows of a matrix)\n\n");
64: }
65:
66: printf(" 3: %s, %s, %s\n", d_MIN, d_MRL, d_MCX);
67: printf(" 2: %s\n", d_INT);
68: printf(" 1: %s\n", d_INT);
69: printf("-> 1: %s, %s, %s\n", d_MIN, d_MRL, d_MCX);
70:
71: return;
72: }
73: else if ((*s_etat_processus).test_instruction == 'Y')
74: {
75: (*s_etat_processus).nombre_arguments = -1;
76: return;
77: }
78:
79: if (test_cfsf(s_etat_processus, 31) == d_vrai)
80: {
81: if (empilement_pile_last(s_etat_processus, 3) == d_erreur)
82: {
83: return;
84: }
85: }
86:
87: if (depilement(s_etat_processus, &((*s_etat_processus).l_base_pile),
88: &s_objet_argument_1) == d_erreur)
89: {
90: (*s_etat_processus).erreur_execution = d_ex_manque_argument;
91: return;
92: }
93:
94: if (depilement(s_etat_processus, &((*s_etat_processus).l_base_pile),
95: &s_objet_argument_2) == d_erreur)
96: {
97: liberation(s_etat_processus, s_objet_argument_1);
98:
99: (*s_etat_processus).erreur_execution = d_ex_manque_argument;
100: return;
101: }
102:
103: if (depilement(s_etat_processus, &((*s_etat_processus).l_base_pile),
104: &s_objet_argument_3) == d_erreur)
105: {
106: liberation(s_etat_processus, s_objet_argument_1);
107: liberation(s_etat_processus, s_objet_argument_2);
108:
109: (*s_etat_processus).erreur_execution = d_ex_manque_argument;
110: return;
111: }
112:
113: if (((*s_objet_argument_1).type == INT) &&
114: ((*s_objet_argument_2).type == INT))
115: {
116: if (((*s_objet_argument_3).type == MIN) ||
117: ((*s_objet_argument_3).type == MRL) ||
118: ((*s_objet_argument_3).type == MCX))
119: {
120: ligne_1 = (*((integer8 *) (*s_objet_argument_1).objet)) - 1;
121: ligne_2 = (*((integer8 *) (*s_objet_argument_2).objet)) - 1;
122:
123: if ((ligne_1 < 0) || (ligne_1 >= (long) (*((struct_matrice *)
124: (*s_objet_argument_3).objet)).nombre_lignes) ||
125: (ligne_2 < 0) || (ligne_2 >= (long) (*((struct_matrice *)
126: (*s_objet_argument_3).objet)).nombre_lignes))
127: {
128: liberation(s_etat_processus, s_objet_argument_1);
129: liberation(s_etat_processus, s_objet_argument_2);
130: liberation(s_etat_processus, s_objet_argument_3);
131:
132: (*s_etat_processus).erreur_execution =
133: d_ex_dimensions_invalides;
134: return;
135: }
136:
137: if ((s_copie_argument_3 = copie_objet(s_etat_processus,
138: s_objet_argument_3, 'Q')) == NULL)
139: {
140: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
141: return;
142: }
143:
144: liberation(s_etat_processus, s_objet_argument_3);
145: s_objet_argument_3 = s_copie_argument_3;
146:
147: tampon = (*((struct_matrice *) (*s_objet_argument_3).objet))
148: .tableau[ligne_1];
149: (*((struct_matrice *) (*s_objet_argument_3).objet)).tableau[ligne_1]
150: = (*((struct_matrice *) (*s_objet_argument_3).objet))
151: .tableau[ligne_2];
152: (*((struct_matrice *) (*s_objet_argument_3).objet)).tableau[ligne_2]
153: = tampon;
154: }
155: else
156: {
157: liberation(s_etat_processus, s_objet_argument_1);
158: liberation(s_etat_processus, s_objet_argument_2);
159: liberation(s_etat_processus, s_objet_argument_3);
160:
161: (*s_etat_processus).erreur_execution = d_ex_erreur_type_argument;
162: return;
163: }
164: }
165: else
166: {
167: liberation(s_etat_processus, s_objet_argument_1);
168: liberation(s_etat_processus, s_objet_argument_2);
169: liberation(s_etat_processus, s_objet_argument_3);
170:
171: (*s_etat_processus).erreur_execution = d_ex_erreur_type_argument;
172: return;
173: }
174:
175: liberation(s_etat_processus, s_objet_argument_1);
176: liberation(s_etat_processus, s_objet_argument_2);
177:
178: if (empilement(s_etat_processus, &((*s_etat_processus).l_base_pile),
179: s_objet_argument_3) == d_erreur)
180: {
181: return;
182: }
183:
184: return;
185: }
186:
187:
188: /*
189: ================================================================================
190: Fonction 'row+'
191: ================================================================================
192: Entrées :
193: --------------------------------------------------------------------------------
194: Sorties :
195: --------------------------------------------------------------------------------
196: Effets de bord : néant
197: ================================================================================
198: */
199:
200: void
201: instruction_row_plus(struct_processus *s_etat_processus)
202: {
203: integer8 position;
204:
205: logical1 matrice_vide;
206: logical1 presence_nom;
207: logical1 variable_partagee;
208:
209: struct_objet *s_copie_argument_1;
210: struct_objet *s_copie_argument_3;
211: struct_objet *s_objet_argument_1;
212: struct_objet *s_objet_argument_2;
213: struct_objet *s_objet_argument_3;
214:
215: unsigned long i;
216: unsigned long j;
217:
218: void **tableau;
219: void *tampon;
220:
221: (*s_etat_processus).erreur_execution = d_ex;
222:
223: if ((*s_etat_processus).affichage_arguments == 'Y')
224: {
225: printf("\n ROW+ ");
226:
227: if ((*s_etat_processus).langue == 'F')
228: {
229: printf("(ajout d'une ligne dans une matrice)\n\n");
230: }
231: else
232: {
233: printf("(add a row in a matrix)\n\n");
234: }
235:
236: printf(" 3: %s, %s, %s\n", d_MIN, d_MRL, d_MCX);
237: printf(" 2: %s\n", d_INT);
238: printf(" 1: %s, %s, %s\n\n", d_MIN, d_MRL, d_MCX);
239: printf("-> 1: %s, %s, %s\n\n", d_MIN, d_MRL, d_MCX);
240:
241: printf(" 3: %s\n", d_NOM);
242: printf(" 2: %s\n", d_INT);
243: printf(" 1: %s, %s, %s\n", d_MIN, d_MRL, d_MCX);
244:
245: return;
246: }
247: else if ((*s_etat_processus).test_instruction == 'Y')
248: {
249: (*s_etat_processus).nombre_arguments = -1;
250: return;
251: }
252:
253: if (test_cfsf(s_etat_processus, 31) == d_vrai)
254: {
255: if (empilement_pile_last(s_etat_processus, 3) == d_erreur)
256: {
257: return;
258: }
259: }
260:
261: if (depilement(s_etat_processus, &((*s_etat_processus).l_base_pile),
262: &s_objet_argument_1) == d_erreur)
263: {
264: (*s_etat_processus).erreur_execution = d_ex_manque_argument;
265: return;
266: }
267:
268: if ((s_copie_argument_1 = copie_objet(s_etat_processus, s_objet_argument_1,
269: 'O')) == NULL)
270: {
271: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
272: return;
273: }
274:
275: liberation(s_etat_processus, s_objet_argument_1);
276: s_objet_argument_1 = s_copie_argument_1;
277:
278: if (depilement(s_etat_processus, &((*s_etat_processus).l_base_pile),
279: &s_objet_argument_2) == d_erreur)
280: {
281: liberation(s_etat_processus, s_objet_argument_1);
282:
283: (*s_etat_processus).erreur_execution = d_ex_manque_argument;
284: return;
285: }
286:
287: if (depilement(s_etat_processus, &((*s_etat_processus).l_base_pile),
288: &s_objet_argument_3) == d_erreur)
289: {
290: liberation(s_etat_processus, s_objet_argument_1);
291: liberation(s_etat_processus, s_objet_argument_2);
292:
293: (*s_etat_processus).erreur_execution = d_ex_manque_argument;
294: return;
295: }
296:
297: if (((*s_objet_argument_1).type != MIN) &&
298: ((*s_objet_argument_1).type != MRL) &&
299: ((*s_objet_argument_1).type != MCX))
300: {
301: liberation(s_etat_processus, s_objet_argument_1);
302: liberation(s_etat_processus, s_objet_argument_2);
303: liberation(s_etat_processus, s_objet_argument_3);
304:
305: (*s_etat_processus).erreur_execution = d_ex_erreur_type_argument;
306: return;
307: }
308:
309: if ((*((struct_matrice *) (*s_objet_argument_1).objet)).nombre_lignes
310: != 1)
311: {
312: liberation(s_etat_processus, s_objet_argument_1);
313: liberation(s_etat_processus, s_objet_argument_2);
314: liberation(s_etat_processus, s_objet_argument_3);
315:
316: (*s_etat_processus).erreur_execution = d_ex_dimensions_invalides;
317: return;
318: }
319:
320: if ((*s_objet_argument_2).type != INT)
321: {
322: liberation(s_etat_processus, s_objet_argument_1);
323: liberation(s_etat_processus, s_objet_argument_2);
324: liberation(s_etat_processus, s_objet_argument_3);
325:
326: (*s_etat_processus).erreur_execution = d_ex_erreur_type_argument;
327: return;
328: }
329:
330: variable_partagee = d_faux;
331:
332: if ((*s_objet_argument_3).type == NOM)
333: {
334: presence_nom = d_vrai;
335:
336: if (recherche_variable(s_etat_processus, (*((struct_nom *)
337: (*s_objet_argument_3).objet)).nom) == d_faux)
338: {
339: (*s_etat_processus).erreur_systeme = d_es;
340: (*s_etat_processus).erreur_execution = d_ex_variable_non_definie;
341:
342: liberation(s_etat_processus, s_objet_argument_1);
343: liberation(s_etat_processus, s_objet_argument_2);
344: liberation(s_etat_processus, s_objet_argument_3);
345:
346: return;
347: }
348:
349: liberation(s_etat_processus, s_objet_argument_3);
350:
351: if ((*s_etat_processus).s_liste_variables[(*s_etat_processus)
352: .position_variable_courante].variable_verrouillee == d_vrai)
353: {
354: (*s_etat_processus).erreur_execution = d_ex_variable_verrouillee;
355:
356: liberation(s_etat_processus, s_objet_argument_1);
357: liberation(s_etat_processus, s_objet_argument_2);
358:
359: return;
360: }
361:
362: s_objet_argument_3 = (*s_etat_processus).s_liste_variables
363: [(*s_etat_processus).position_variable_courante].objet;
364:
365: if (s_objet_argument_3 == NULL)
366: {
367: if (pthread_mutex_lock(&((*(*s_etat_processus)
368: .s_liste_variables_partagees).mutex)) != 0)
369: {
370: (*s_etat_processus).erreur_systeme = d_es_processus;
371: return;
372: }
373:
374: if (recherche_variable_partagee(s_etat_processus,
375: (*s_etat_processus).s_liste_variables
376: [(*s_etat_processus).position_variable_courante].nom,
377: (*s_etat_processus).s_liste_variables
378: [(*s_etat_processus).position_variable_courante]
379: .variable_partagee, (*s_etat_processus).s_liste_variables
380: [(*s_etat_processus).position_variable_courante].origine)
381: == d_faux)
382: {
383: if (pthread_mutex_unlock(&((*(*s_etat_processus)
384: .s_liste_variables_partagees).mutex)) != 0)
385: {
386: (*s_etat_processus).erreur_systeme = d_es_processus;
387: return;
388: }
389:
390: (*s_etat_processus).erreur_systeme = d_es;
391: (*s_etat_processus).erreur_execution =
392: d_ex_variable_non_definie;
393:
394: liberation(s_etat_processus, s_objet_argument_1);
395: liberation(s_etat_processus, s_objet_argument_2);
396:
397: return;
398: }
399:
400: s_objet_argument_3 = (*(*s_etat_processus)
401: .s_liste_variables_partagees).table
402: [(*(*s_etat_processus).s_liste_variables_partagees)
403: .position_variable].objet;
404: variable_partagee = d_vrai;
405: }
406:
407: if ((s_copie_argument_3 = copie_objet(s_etat_processus,
408: s_objet_argument_3, 'Q')) == NULL)
409: {
410: if (variable_partagee == d_vrai)
411: {
412: if (pthread_mutex_unlock(&((*(*s_etat_processus)
413: .s_liste_variables_partagees).mutex)) != 0)
414: {
415: (*s_etat_processus).erreur_systeme = d_es_processus;
416: return;
417: }
418: }
419:
420: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
421: return;
422: }
423:
424: liberation(s_etat_processus, s_objet_argument_3);
425: s_objet_argument_3 = s_copie_argument_3;
426:
427: (*s_etat_processus).s_liste_variables[(*s_etat_processus)
428: .position_variable_courante].objet = s_objet_argument_3;
429: }
430: else
431: {
432: presence_nom = d_faux;
433:
434: if ((s_copie_argument_3 = copie_objet(s_etat_processus,
435: s_objet_argument_3, 'Q')) == NULL)
436: {
437: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
438: return;
439: }
440:
441: liberation(s_etat_processus, s_objet_argument_3);
442: s_objet_argument_3 = s_copie_argument_3;
443: }
444:
445: if (((*((struct_matrice *) (*s_objet_argument_3).objet)).nombre_colonnes
446: == 0) && ((*((struct_matrice *) (*s_objet_argument_3).objet))
447: .nombre_lignes == 1))
448: {
449: matrice_vide = d_vrai;
450: }
451: else
452: {
453: matrice_vide = d_faux;
454:
455: if ((*((struct_matrice *) (*s_objet_argument_1).objet)).nombre_colonnes
456: != (*((struct_matrice *) (*s_objet_argument_3).objet))
457: .nombre_colonnes)
458: {
459: if (variable_partagee == d_vrai)
460: {
461: if (pthread_mutex_unlock(&((*(*s_etat_processus)
462: .s_liste_variables_partagees).mutex)) != 0)
463: {
464: (*s_etat_processus).erreur_systeme = d_es_processus;
465: return;
466: }
467: }
468:
469: liberation(s_etat_processus, s_objet_argument_1);
470: liberation(s_etat_processus, s_objet_argument_2);
471:
472: if (presence_nom == d_faux)
473: {
474: liberation(s_etat_processus, s_objet_argument_3);
475: }
476:
477: (*s_etat_processus).erreur_execution = d_ex_dimensions_invalides;
478: return;
479: }
480: }
481:
482: if ((*s_objet_argument_1).type == MRL)
483: {
484: if ((*s_objet_argument_3).type == MIN)
485: {
486: // Conversion de la matrice entière en matrice réelle
487:
488: for(i = 0; i < (*((struct_matrice *) (*s_objet_argument_3).objet))
489: .nombre_lignes; i++)
490: {
491: tampon = (*((struct_matrice *) (*s_objet_argument_3).objet))
492: .tableau[i];
493:
494: if (((*((struct_matrice *) (*s_objet_argument_3).objet))
495: .tableau[i] = malloc((*((struct_matrice *)
496: (*s_objet_argument_3).objet)).nombre_colonnes *
497: sizeof(real8))) == NULL)
498: {
499: if (variable_partagee == d_vrai)
500: {
501: if (pthread_mutex_unlock(&((*(*s_etat_processus)
502: .s_liste_variables_partagees).mutex)) != 0)
503: {
504: (*s_etat_processus).erreur_systeme = d_es_processus;
505: return;
506: }
507: }
508:
509: (*s_etat_processus).erreur_systeme =
510: d_es_allocation_memoire;
511: return;
512: }
513:
514: for(j = 0; j < (*((struct_matrice *) (*s_objet_argument_3)
515: .objet)).nombre_colonnes; j++)
516: {
517: ((real8 **) (*((struct_matrice *) (*s_objet_argument_3)
518: .objet)).tableau)[i][j] = (real8) (((integer8 *)
519: tampon)[j]);
520: }
521:
522: free(tampon);
523: }
524:
525: (*((struct_matrice *) (*s_objet_argument_3).objet)).type = 'R';
526: (*s_objet_argument_3).type = MRL;
527: }
528: }
529: else if ((*s_objet_argument_1).type == MCX)
530: {
531: if ((*s_objet_argument_3).type == MIN)
532: {
533: // Conversion de la matrice entière en matrice complexe
534:
535: for(i = 0; i < (*((struct_matrice *) (*s_objet_argument_3).objet))
536: .nombre_lignes; i++)
537: {
538: tampon = (*((struct_matrice *) (*s_objet_argument_3).objet))
539: .tableau[i];
540:
541: if (((*((struct_matrice *) (*s_objet_argument_3).objet))
542: .tableau[i] = malloc((*((struct_matrice *)
543: (*s_objet_argument_3).objet)).nombre_colonnes *
544: sizeof(complex16))) == NULL)
545: {
546: if (variable_partagee == d_vrai)
547: {
548: if (pthread_mutex_unlock(&((*(*s_etat_processus)
549: .s_liste_variables_partagees).mutex)) != 0)
550: {
551: (*s_etat_processus).erreur_systeme = d_es_processus;
552: return;
553: }
554: }
555:
556: (*s_etat_processus).erreur_systeme =
557: d_es_allocation_memoire;
558: return;
559: }
560:
561: for(j = 0; j < (*((struct_matrice *) (*s_objet_argument_3)
562: .objet)).nombre_colonnes; j++)
563: {
564: ((complex16 **) (*((struct_matrice *) (*s_objet_argument_3)
565: .objet)).tableau)[i][j].partie_reelle =
566: (real8) (((integer8 *) tampon)[j]);
567: ((complex16 **) (*((struct_matrice *) (*s_objet_argument_3)
568: .objet)).tableau)[i][j].partie_imaginaire = 0;
569: }
570:
571: free(tampon);
572: }
573:
574: (*((struct_matrice *) (*s_objet_argument_3).objet)).type = 'C';
575: (*s_objet_argument_3).type = MCX;
576: }
577: else if ((*s_objet_argument_3).type == MRL)
578: {
579: // Conversion de la matrice réelle en matrice complexe
580:
581: for(i = 0; i < (*((struct_matrice *) (*s_objet_argument_3).objet))
582: .nombre_lignes; i++)
583: {
584: tampon = (*((struct_matrice *) (*s_objet_argument_3).objet))
585: .tableau[i];
586:
587: if (((*((struct_matrice *) (*s_objet_argument_3).objet))
588: .tableau[i] = malloc((*((struct_matrice *)
589: (*s_objet_argument_3).objet)).nombre_colonnes *
590: sizeof(complex16))) == NULL)
591: {
592: if (variable_partagee == d_vrai)
593: {
594: if (pthread_mutex_unlock(&((*(*s_etat_processus)
595: .s_liste_variables_partagees).mutex)) != 0)
596: {
597: (*s_etat_processus).erreur_systeme = d_es_processus;
598: return;
599: }
600: }
601:
602: (*s_etat_processus).erreur_systeme =
603: d_es_allocation_memoire;
604: return;
605: }
606:
607: for(j = 0; j < (*((struct_matrice *) (*s_objet_argument_3)
608: .objet)).nombre_colonnes; j++)
609: {
610: ((complex16 **) (*((struct_matrice *) (*s_objet_argument_3)
611: .objet)).tableau)[i][j].partie_reelle =
612: ((real8 *) tampon)[j];
613: ((complex16 **) (*((struct_matrice *) (*s_objet_argument_3)
614: .objet)).tableau)[i][j].partie_imaginaire = 0;
615: }
616:
617: free(tampon);
618: }
619:
620: (*((struct_matrice *) (*s_objet_argument_3).objet)).type = 'C';
621: (*s_objet_argument_3).type = MCX;
622: }
623: }
624:
625: if ((*s_objet_argument_3).type == MRL)
626: {
627: if ((*s_objet_argument_1).type == MIN)
628: {
629: // Conversion de la matrice entière en matrice réelle
630:
631: for(i = 0; i < (*((struct_matrice *) (*s_objet_argument_1).objet))
632: .nombre_lignes; i++)
633: {
634: tampon = (*((struct_matrice *) (*s_objet_argument_1).objet))
635: .tableau[i];
636:
637: if (((*((struct_matrice *) (*s_objet_argument_1).objet))
638: .tableau[i] = malloc((*((struct_matrice *)
639: (*s_objet_argument_1).objet)).nombre_colonnes *
640: sizeof(real8))) == NULL)
641: {
642: if (variable_partagee == d_vrai)
643: {
644: if (pthread_mutex_unlock(&((*(*s_etat_processus)
645: .s_liste_variables_partagees).mutex)) != 0)
646: {
647: (*s_etat_processus).erreur_systeme = d_es_processus;
648: return;
649: }
650: }
651:
652: (*s_etat_processus).erreur_systeme =
653: d_es_allocation_memoire;
654: return;
655: }
656:
657: for(j = 0; j < (*((struct_matrice *) (*s_objet_argument_1)
658: .objet)).nombre_colonnes; j++)
659: {
660: ((real8 **) (*((struct_matrice *) (*s_objet_argument_1)
661: .objet)).tableau)[i][j] = (real8) (((integer8 *)
662: tampon)[j]);
663: }
664:
665: free(tampon);
666: }
667:
668: (*((struct_matrice *) (*s_objet_argument_1).objet)).type = 'R';
669: (*s_objet_argument_1).type = MRL;
670: }
671: }
672: else if ((*s_objet_argument_3).type == MCX)
673: {
674: if ((*s_objet_argument_1).type == MIN)
675: {
676: // Conversion de la matrice entière en matrice complexe
677:
678: for(i = 0; i < (*((struct_matrice *) (*s_objet_argument_1).objet))
679: .nombre_lignes; i++)
680: {
681: tampon = (*((struct_matrice *) (*s_objet_argument_1).objet))
682: .tableau[i];
683:
684: if (((*((struct_matrice *) (*s_objet_argument_1).objet))
685: .tableau[i] = malloc((*((struct_matrice *)
686: (*s_objet_argument_1).objet)).nombre_colonnes *
687: sizeof(complex16))) == NULL)
688: {
689: if (variable_partagee == d_vrai)
690: {
691: if (pthread_mutex_unlock(&((*(*s_etat_processus)
692: .s_liste_variables_partagees).mutex)) != 0)
693: {
694: (*s_etat_processus).erreur_systeme = d_es_processus;
695: return;
696: }
697: }
698:
699: (*s_etat_processus).erreur_systeme =
700: d_es_allocation_memoire;
701: return;
702: }
703:
704: for(j = 0; j < (*((struct_matrice *) (*s_objet_argument_1)
705: .objet)).nombre_colonnes; j++)
706: {
707: ((complex16 **) (*((struct_matrice *) (*s_objet_argument_1)
708: .objet)).tableau)[i][j].partie_reelle =
709: (real8) (((integer8 *) tampon)[j]);
710: ((complex16 **) (*((struct_matrice *) (*s_objet_argument_1)
711: .objet)).tableau)[i][j].partie_imaginaire = 0;
712: }
713:
714: free(tampon);
715: }
716:
717: (*((struct_matrice *) (*s_objet_argument_1).objet)).type = 'C';
718: (*s_objet_argument_1).type = MCX;
719: }
720: else if ((*s_objet_argument_1).type == MRL)
721: {
722: // Conversion de la matrice réelle en matrice complexe
723:
724: for(i = 0; i < (*((struct_matrice *) (*s_objet_argument_1).objet))
725: .nombre_lignes; i++)
726: {
727: tampon = (*((struct_matrice *) (*s_objet_argument_1).objet))
728: .tableau[i];
729:
730: if (((*((struct_matrice *) (*s_objet_argument_1).objet))
731: .tableau[i] = malloc((*((struct_matrice *)
732: (*s_objet_argument_1).objet)).nombre_colonnes *
733: sizeof(complex16))) == NULL)
734: {
735: if (variable_partagee == d_vrai)
736: {
737: if (pthread_mutex_unlock(&((*(*s_etat_processus)
738: .s_liste_variables_partagees).mutex)) != 0)
739: {
740: (*s_etat_processus).erreur_systeme = d_es_processus;
741: return;
742: }
743: }
744:
745: (*s_etat_processus).erreur_systeme =
746: d_es_allocation_memoire;
747: return;
748: }
749:
750: for(j = 0; j < (*((struct_matrice *) (*s_objet_argument_1)
751: .objet)).nombre_colonnes; j++)
752: {
753: ((complex16 **) (*((struct_matrice *) (*s_objet_argument_1)
754: .objet)).tableau)[i][j].partie_reelle =
755: ((real8 *) tampon)[j];
756: ((complex16 **) (*((struct_matrice *) (*s_objet_argument_1)
757: .objet)).tableau)[i][j].partie_imaginaire = 0;
758: }
759:
760: free(tampon);
761: }
762:
763: (*((struct_matrice *) (*s_objet_argument_1).objet)).type = 'C';
764: (*s_objet_argument_1).type = MCX;
765: }
766: }
767:
768: position = (*((integer8 *) (*s_objet_argument_2).objet));
769:
770: if (((position < 1) || (position > (integer8) ((*((struct_matrice *)
771: (*s_objet_argument_3).objet)).nombre_lignes + 1))) ||
772: ((position != 1) && (matrice_vide == d_vrai)))
773: {
774: if (variable_partagee == d_vrai)
775: {
776: if (pthread_mutex_unlock(&((*(*s_etat_processus)
777: .s_liste_variables_partagees).mutex)) != 0)
778: {
779: (*s_etat_processus).erreur_systeme = d_es_processus;
780: return;
781: }
782: }
783:
784: liberation(s_etat_processus, s_objet_argument_1);
785: liberation(s_etat_processus, s_objet_argument_2);
786:
787: if (presence_nom == d_faux)
788: {
789: liberation(s_etat_processus, s_objet_argument_3);
790: }
791:
792: (*s_etat_processus).erreur_execution =
793: d_ex_argument_invalide;
794: return;
795: }
796:
797: tableau = (*((struct_matrice *) (*s_objet_argument_3).objet)).tableau;
798:
799: if (matrice_vide == d_faux)
800: {
801: if (((*((struct_matrice *) (*s_objet_argument_3).objet)).tableau
802: = malloc(((*((struct_matrice *) (*s_objet_argument_3).objet))
803: .nombre_lignes + 1) * sizeof(void *))) == NULL)
804: {
805: if (variable_partagee == d_vrai)
806: {
807: if (pthread_mutex_unlock(&((*(*s_etat_processus)
808: .s_liste_variables_partagees).mutex)) != 0)
809: {
810: (*s_etat_processus).erreur_systeme = d_es_processus;
811: return;
812: }
813: }
814:
815: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
816: return;
817: }
818:
819: if (position != ((integer8) (*((struct_matrice *)
820: (*s_objet_argument_3).objet)).nombre_lignes + 1))
821: {
822: for(j = i = 0; i < (*((struct_matrice *)
823: (*s_objet_argument_3).objet)).nombre_lignes; i++)
824: {
825: if (i == (unsigned long) (position - 1))
826: {
827: (*((struct_matrice *) (*s_objet_argument_3).objet))
828: .tableau[i] = (*((struct_matrice *)
829: (*s_objet_argument_1).objet)).tableau[0];
830: j = 1;
831: }
832:
833: (*((struct_matrice *) (*s_objet_argument_3).objet))
834: .tableau[i + j] = tableau[i];
835: }
836: }
837: else
838: {
839: for(i = 0; i < (*((struct_matrice *) (*s_objet_argument_3).objet))
840: .nombre_lignes; i++)
841: {
842: (*((struct_matrice *) (*s_objet_argument_3).objet)).tableau[i]
843: = tableau[i];
844: }
845:
846: (*((struct_matrice *) (*s_objet_argument_3).objet)).tableau
847: [(*((struct_matrice *) (*s_objet_argument_3).objet))
848: .nombre_lignes] = (*((struct_matrice *)
849: (*s_objet_argument_1).objet)).tableau[0];
850: }
851:
852: (*((struct_matrice *) (*s_objet_argument_3).objet)).nombre_lignes++;
853: }
854: else
855: {
856: if (((*((struct_matrice *) (*s_objet_argument_3).objet)).tableau
857: = malloc(sizeof(void *))) == NULL)
858: {
859: if (variable_partagee == d_vrai)
860: {
861: if (pthread_mutex_unlock(&((*(*s_etat_processus)
862: .s_liste_variables_partagees).mutex)) != 0)
863: {
864: (*s_etat_processus).erreur_systeme = d_es_processus;
865: return;
866: }
867: }
868:
869: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
870: return;
871: }
872:
873: (*((struct_matrice *) (*s_objet_argument_3).objet)).tableau[0] =
874: (*((struct_matrice *) (*s_objet_argument_1).objet)).tableau[0];
875: (*((struct_matrice *) (*s_objet_argument_3).objet)).nombre_lignes =
876: (*((struct_matrice *) (*s_objet_argument_1).objet))
877: .nombre_lignes;
878: (*((struct_matrice *) (*s_objet_argument_3).objet)).nombre_colonnes =
879: (*((struct_matrice *) (*s_objet_argument_1).objet))
880: .nombre_colonnes;
881: }
882:
883: free(tableau);
884:
885: if (presence_nom == d_faux)
886: {
887: if (empilement(s_etat_processus, &((*s_etat_processus).l_base_pile),
888: s_objet_argument_3) == d_erreur)
889: {
890: return;
891: }
892: }
893: else
894: {
895: if (variable_partagee == d_vrai)
896: {
897: (*(*s_etat_processus).s_liste_variables_partagees).table
898: [(*(*s_etat_processus).s_liste_variables_partagees)
899: .position_variable].objet = s_objet_argument_3;
900:
901: if (pthread_mutex_unlock(&((*(*s_etat_processus)
902: .s_liste_variables_partagees).mutex)) != 0)
903: {
904: (*s_etat_processus).erreur_systeme = d_es_processus;
905: return;
906: }
907: }
908: }
909:
910: free((*((struct_matrice *) (*s_objet_argument_1).objet)).tableau);
911: free((*s_objet_argument_1).objet);
912: free(s_objet_argument_1);
913:
914: liberation(s_etat_processus, s_objet_argument_2);
915:
916: return;
917: }
918:
919:
920: /*
921: ================================================================================
922: Fonction 'row-'
923: ================================================================================
924: Entrées : pointeur sur une structure struct_processus
925: --------------------------------------------------------------------------------
926: Sorties :
927: --------------------------------------------------------------------------------
928: Effets de bord : néant
929: ================================================================================
930: */
931:
932: void
933: instruction_row_moins(struct_processus *s_etat_processus)
934: {
935: integer8 position;
936:
937: logical1 presence_variable;
938: logical1 variable_partagee;
939:
940: struct_objet *s_copie_argument_2;
941: struct_objet *s_objet_argument_1;
942: struct_objet *s_objet_argument_2;
943: struct_objet *s_objet_resultat;
944:
945: unsigned long i;
946: unsigned long j;
947: unsigned long colonne;
948:
949: void **tableau;
950:
951: (*s_etat_processus).erreur_execution = d_ex;
952:
953: if ((*s_etat_processus).affichage_arguments == 'Y')
954: {
955: printf("\n ROW- ");
956:
957: if ((*s_etat_processus).langue == 'F')
958: {
959: printf("(retrait d'une ligne dans une matrice)\n\n");
960: }
961: else
962: {
963: printf("(remove a row from a matrix)\n\n");
964: }
965:
966: printf(" 2: %s, %s, %s\n", d_MIN, d_MRL, d_MCX);
967: printf(" 1: %s\n", d_INT);
968: printf("-> 2: %s, %s, %s\n\n", d_MIN, d_MRL, d_MCX);
969: printf(" 1: %s, %s, %s\n\n", d_MIN, d_MRL, d_MCX);
970:
971: printf(" 2: %s\n", d_NOM);
972: printf(" 1: %s\n", d_INT);
973: printf("-> 1: %s, %s, %s\n", d_MIN, d_MRL, d_MCX);
974:
975: return;
976: }
977: else if ((*s_etat_processus).test_instruction == 'Y')
978: {
979: (*s_etat_processus).nombre_arguments = -1;
980: return;
981: }
982:
983: if (test_cfsf(s_etat_processus, 31) == d_vrai)
984: {
985: if (empilement_pile_last(s_etat_processus, 2) == d_erreur)
986: {
987: return;
988: }
989: }
990:
991: if (depilement(s_etat_processus, &((*s_etat_processus).l_base_pile),
992: &s_objet_argument_1) == d_erreur)
993: {
994: (*s_etat_processus).erreur_execution = d_ex_manque_argument;
995: return;
996: }
997:
998: if (depilement(s_etat_processus, &((*s_etat_processus).l_base_pile),
999: &s_objet_argument_2) == d_erreur)
1000: {
1001: liberation(s_etat_processus, s_objet_argument_1);
1002:
1003: (*s_etat_processus).erreur_execution = d_ex_manque_argument;
1004: return;
1005: }
1006:
1007: variable_partagee = d_faux;
1008:
1009: if ((*s_objet_argument_2).type == NOM)
1010: {
1011: presence_variable = d_vrai;
1012:
1013: if (recherche_variable(s_etat_processus, (*((struct_nom *)
1014: (*s_objet_argument_2).objet)).nom) == d_faux)
1015: {
1016: liberation(s_etat_processus, s_objet_argument_1);
1017: liberation(s_etat_processus, s_objet_argument_2);
1018:
1019: (*s_etat_processus).erreur_systeme = d_es;
1020: (*s_etat_processus).erreur_execution = d_ex_variable_non_definie;
1021:
1022: return;
1023: }
1024:
1025: liberation(s_etat_processus, s_objet_argument_2);
1026:
1027: if ((*s_etat_processus).s_liste_variables[(*s_etat_processus)
1028: .position_variable_courante].variable_verrouillee == d_vrai)
1029: {
1030: liberation(s_etat_processus, s_objet_argument_1);
1031:
1032: (*s_etat_processus).erreur_execution = d_ex_variable_verrouillee;
1033: return;
1034: }
1035:
1036: s_objet_argument_2 = (*s_etat_processus).s_liste_variables
1037: [(*s_etat_processus).position_variable_courante].objet;
1038:
1039: if (s_objet_argument_2 == NULL)
1040: {
1041: if (pthread_mutex_lock(&((*(*s_etat_processus)
1042: .s_liste_variables_partagees).mutex)) != 0)
1043: {
1044: (*s_etat_processus).erreur_systeme = d_es_processus;
1045: return;
1046: }
1047:
1048: if (recherche_variable_partagee(s_etat_processus,
1049: (*s_etat_processus).s_liste_variables
1050: [(*s_etat_processus).position_variable_courante].nom,
1051: (*s_etat_processus).s_liste_variables
1052: [(*s_etat_processus).position_variable_courante]
1053: .variable_partagee, (*s_etat_processus).s_liste_variables
1054: [(*s_etat_processus).position_variable_courante].origine)
1055: == d_faux)
1056: {
1057: if (pthread_mutex_unlock(&((*(*s_etat_processus)
1058: .s_liste_variables_partagees).mutex)) != 0)
1059: {
1060: (*s_etat_processus).erreur_systeme = d_es_processus;
1061: return;
1062: }
1063:
1064: (*s_etat_processus).erreur_systeme = d_es;
1065: (*s_etat_processus).erreur_execution =
1066: d_ex_variable_non_definie;
1067:
1068: liberation(s_etat_processus, s_objet_argument_1);
1069:
1070: return;
1071: }
1072:
1073: s_objet_argument_2 = (*(*s_etat_processus)
1074: .s_liste_variables_partagees).table
1075: [(*(*s_etat_processus).s_liste_variables_partagees)
1076: .position_variable].objet;
1077: variable_partagee = d_vrai;
1078: }
1079:
1080: if ((s_copie_argument_2 = copie_objet(s_etat_processus,
1081: s_objet_argument_2, 'Q')) == NULL)
1082: {
1083: if (variable_partagee == d_vrai)
1084: {
1085: if (pthread_mutex_unlock(&((*(*s_etat_processus)
1086: .s_liste_variables_partagees).mutex)) != 0)
1087: {
1088: (*s_etat_processus).erreur_systeme = d_es_processus;
1089: return;
1090: }
1091: }
1092:
1093: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
1094: return;
1095: }
1096:
1097: liberation(s_etat_processus, s_objet_argument_2);
1098: s_objet_argument_2 = s_copie_argument_2;
1099:
1100: (*s_etat_processus).s_liste_variables[(*s_etat_processus)
1101: .position_variable_courante].objet = s_objet_argument_2;
1102: }
1103: else
1104: {
1105: presence_variable = d_faux;
1106:
1107: if ((s_copie_argument_2 = copie_objet(s_etat_processus,
1108: s_objet_argument_2, 'Q')) == NULL)
1109: {
1110: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
1111: return;
1112: }
1113:
1114: liberation(s_etat_processus, s_objet_argument_2);
1115: s_objet_argument_2 = s_copie_argument_2;
1116: }
1117:
1118: if (((*s_objet_argument_2).type == MIN) ||
1119: ((*s_objet_argument_2).type == MRL) ||
1120: ((*s_objet_argument_2).type == MCX))
1121: {
1122: if ((*s_objet_argument_1).type == INT)
1123: {
1124: position = (*((integer8 *) (*s_objet_argument_1).objet));
1125:
1126: if ((position <= 0) || (position > (integer8) (*((struct_matrice *)
1127: (*s_objet_argument_2).objet)).nombre_lignes))
1128: {
1129: if (variable_partagee == d_vrai)
1130: {
1131: if (pthread_mutex_unlock(&((*(*s_etat_processus)
1132: .s_liste_variables_partagees).mutex)) != 0)
1133: {
1134: (*s_etat_processus).erreur_systeme = d_es_processus;
1135: return;
1136: }
1137: }
1138:
1139: liberation(s_etat_processus, s_objet_argument_1);
1140:
1141: if (presence_variable == d_faux)
1142: {
1143: liberation(s_etat_processus, s_objet_argument_2);
1144: }
1145:
1146: (*s_etat_processus).erreur_execution =
1147: d_ex_argument_invalide;
1148: return;
1149: }
1150:
1151: if ((s_objet_resultat = allocation(s_etat_processus,
1152: (*s_objet_argument_2).type)) == NULL)
1153: {
1154: if (variable_partagee == d_vrai)
1155: {
1156: if (pthread_mutex_unlock(&((*(*s_etat_processus)
1157: .s_liste_variables_partagees).mutex)) != 0)
1158: {
1159: (*s_etat_processus).erreur_systeme = d_es_processus;
1160: return;
1161: }
1162: }
1163:
1164: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
1165: return;
1166: }
1167:
1168: (*((struct_matrice *) (*s_objet_resultat).objet)).nombre_lignes =
1169: 1;
1170: (*((struct_matrice *) (*s_objet_resultat).objet)).nombre_colonnes =
1171: (*((struct_matrice *) (*s_objet_argument_2).objet))
1172: .nombre_colonnes;
1173:
1174: if (((*((struct_matrice *) (*s_objet_resultat).objet)).tableau =
1175: malloc(sizeof(void *))) == NULL)
1176: {
1177: if (variable_partagee == d_vrai)
1178: {
1179: if (pthread_mutex_unlock(&((*(*s_etat_processus)
1180: .s_liste_variables_partagees).mutex)) != 0)
1181: {
1182: (*s_etat_processus).erreur_systeme = d_es_processus;
1183: return;
1184: }
1185: }
1186:
1187: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
1188: return;
1189: }
1190:
1191: (*((struct_matrice *) (*s_objet_resultat).objet)).tableau[0] =
1192: (*((struct_matrice *) (*s_objet_argument_2).objet)).tableau
1193: [colonne = position - 1];
1194:
1195: if ((*((struct_matrice *) (*s_objet_argument_2).objet))
1196: .nombre_lignes > 1)
1197: {
1198: tableau = (*((struct_matrice *) (*s_objet_argument_2).objet))
1199: .tableau;
1200:
1201: if (((*((struct_matrice *) (*s_objet_argument_2).objet)).tableau
1202: = malloc(((*((struct_matrice *) (*s_objet_argument_2)
1203: .objet)).nombre_lignes - 1) * sizeof(void *))) == NULL)
1204: {
1205: if (variable_partagee == d_vrai)
1206: {
1207: if (pthread_mutex_unlock(&((*(*s_etat_processus)
1208: .s_liste_variables_partagees).mutex)) != 0)
1209: {
1210: (*s_etat_processus).erreur_systeme = d_es_processus;
1211: return;
1212: }
1213: }
1214:
1215: (*s_etat_processus).erreur_systeme =
1216: d_es_allocation_memoire;
1217: return;
1218: }
1219:
1220: (*((struct_matrice *) (*s_objet_argument_2).objet))
1221: .nombre_lignes--;
1222:
1223: for(i = j = 0; i < (*((struct_matrice *) (*s_objet_argument_2)
1224: .objet)).nombre_lignes; i++)
1225: {
1226: if (i == colonne)
1227: {
1228: j = 1;
1229: }
1230:
1231: (*((struct_matrice *) (*s_objet_argument_2).objet))
1232: .tableau[i] = tableau[i + j];
1233: }
1234:
1235: free(tableau);
1236: }
1237: else
1238: {
1239: if (((*((struct_matrice *) (*s_objet_argument_2).objet))
1240: .tableau[0] = malloc(0)) == NULL)
1241: {
1242: if (variable_partagee == d_vrai)
1243: {
1244: if (pthread_mutex_unlock(&((*(*s_etat_processus)
1245: .s_liste_variables_partagees).mutex)) != 0)
1246: {
1247: (*s_etat_processus).erreur_systeme = d_es_processus;
1248: return;
1249: }
1250: }
1251:
1252: (*s_etat_processus).erreur_systeme =
1253: d_es_allocation_memoire;
1254: return;
1255: }
1256:
1257: (*((struct_matrice *) (*s_objet_argument_2).objet))
1258: .nombre_colonnes = 0;
1259: }
1260: }
1261: else
1262: {
1263: if (variable_partagee == d_vrai)
1264: {
1265: if (pthread_mutex_unlock(&((*(*s_etat_processus)
1266: .s_liste_variables_partagees).mutex)) != 0)
1267: {
1268: (*s_etat_processus).erreur_systeme = d_es_processus;
1269: return;
1270: }
1271: }
1272:
1273: liberation(s_etat_processus, s_objet_argument_1);
1274:
1275: if (presence_variable == d_faux)
1276: {
1277: liberation(s_etat_processus, s_objet_argument_2);
1278: }
1279:
1280: (*s_etat_processus).erreur_execution = d_ex_erreur_type_argument;
1281: return;
1282: }
1283: }
1284: else
1285: {
1286: if (variable_partagee == d_vrai)
1287: {
1288: if (pthread_mutex_unlock(&((*(*s_etat_processus)
1289: .s_liste_variables_partagees).mutex)) != 0)
1290: {
1291: (*s_etat_processus).erreur_systeme = d_es_processus;
1292: return;
1293: }
1294: }
1295:
1296: liberation(s_etat_processus, s_objet_argument_1);
1297:
1298: if (presence_variable == d_faux)
1299: {
1300: liberation(s_etat_processus, s_objet_argument_2);
1301: }
1302:
1303: (*s_etat_processus).erreur_execution = d_ex_erreur_type_argument;
1304: return;
1305: }
1306:
1307: liberation(s_etat_processus, s_objet_argument_1);
1308:
1309: if (presence_variable == d_faux)
1310: {
1311: if (empilement(s_etat_processus, &((*s_etat_processus).l_base_pile),
1312: s_objet_argument_2) == d_erreur)
1313: {
1314: return;
1315: }
1316: }
1317: else if (variable_partagee == d_vrai)
1318: {
1319: (*(*s_etat_processus).s_liste_variables_partagees).table
1320: [(*(*s_etat_processus).s_liste_variables_partagees)
1321: .position_variable].objet = s_objet_argument_2;
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: if (empilement(s_etat_processus, &((*s_etat_processus).l_base_pile),
1332: s_objet_resultat) == d_erreur)
1333: {
1334: return;
1335: }
1336:
1337: return;
1338: }
1339:
1340:
1341: /*
1342: ================================================================================
1343: Fonction 'rci'
1344: ================================================================================
1345: Entrées : pointeur sur une structure struct_processus
1346: --------------------------------------------------------------------------------
1347: Sorties :
1348: --------------------------------------------------------------------------------
1349: Effets de bord : néant
1350: ================================================================================
1351: */
1352:
1353: void
1354: instruction_rci(struct_processus *s_etat_processus)
1355: {
1356: logical1 last_valide;
1357:
1358: struct_objet *s_objet_argument_1;
1359: struct_objet *s_objet_argument_2;
1360: struct_objet *s_objet_argument_3;
1361: struct_objet *tampon;
1362:
1363: (*s_etat_processus).erreur_execution = d_ex;
1364:
1365: if ((*s_etat_processus).affichage_arguments == 'Y')
1366: {
1367: printf("\n RCI ");
1368:
1369: if ((*s_etat_processus).langue == 'F')
1370: {
1371: printf("(multiplication d'une ligne d'une matrice)\n\n");
1372: }
1373: else
1374: {
1375: printf("(multiply a row in a matrix)\n\n");
1376: }
1377:
1378: printf(" 3: %s, %s, %s\n", d_MIN, d_MRL, d_MCX);
1379: printf(" 2: %s, %s, %s\n", d_INT, d_REL, d_CPL);
1380: printf(" 1: %s\n", d_INT);
1381: printf("-> 1: %s, %s, %s\n", d_MIN, d_MRL, d_MCX);
1382:
1383: return;
1384: }
1385: else if ((*s_etat_processus).test_instruction == 'Y')
1386: {
1387: (*s_etat_processus).nombre_arguments = -1;
1388: return;
1389: }
1390:
1391: if ((last_valide = test_cfsf(s_etat_processus, 31)) == d_vrai)
1392: {
1393: if (empilement_pile_last(s_etat_processus, 3) == d_erreur)
1394: {
1395: return;
1396: }
1397:
1398: cf(s_etat_processus, 31);
1399: }
1400:
1401: if (depilement(s_etat_processus, &((*s_etat_processus).l_base_pile),
1402: &s_objet_argument_1) == d_erreur)
1403: {
1404: if (last_valide == d_vrai)
1405: {
1406: sf(s_etat_processus, 31);
1407: }
1408:
1409: (*s_etat_processus).erreur_execution = d_ex_manque_argument;
1410: return;
1411: }
1412:
1413: if (depilement(s_etat_processus, &((*s_etat_processus).l_base_pile),
1414: &s_objet_argument_2) == d_erreur)
1415: {
1416: if (last_valide == d_vrai)
1417: {
1418: sf(s_etat_processus, 31);
1419: }
1420:
1421: liberation(s_etat_processus, s_objet_argument_1);
1422:
1423: (*s_etat_processus).erreur_execution = d_ex_manque_argument;
1424: return;
1425: }
1426:
1427: if (depilement(s_etat_processus, &((*s_etat_processus).l_base_pile),
1428: &s_objet_argument_3) == d_erreur)
1429: {
1430: if (last_valide == d_vrai)
1431: {
1432: sf(s_etat_processus, 31);
1433: }
1434:
1435: liberation(s_etat_processus, s_objet_argument_1);
1436: liberation(s_etat_processus, s_objet_argument_2);
1437:
1438: (*s_etat_processus).erreur_execution = d_ex_manque_argument;
1439: return;
1440: }
1441:
1442: if ((((*s_objet_argument_3).type == MIN) ||
1443: ((*s_objet_argument_3).type == MRL) ||
1444: ((*s_objet_argument_3).type == MCX)) &&
1445: (((*s_objet_argument_2).type == INT) ||
1446: ((*s_objet_argument_2).type == REL) ||
1447: ((*s_objet_argument_2).type == CPL)) &&
1448: ((*s_objet_argument_1).type == INT))
1449: {
1450: if (empilement(s_etat_processus, &((*s_etat_processus).l_base_pile),
1451: s_objet_argument_3) == d_erreur)
1452: {
1453: if (last_valide == d_vrai)
1454: {
1455: sf(s_etat_processus, 31);
1456: }
1457:
1458: return;
1459: }
1460:
1461: tampon = s_objet_argument_1;
1462:
1463: if ((s_objet_argument_1 = allocation(s_etat_processus, LST)) == NULL)
1464: {
1465: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
1466: return;
1467: }
1468:
1469: if (((*s_objet_argument_1).objet =
1470: allocation_maillon(s_etat_processus)) == NULL)
1471: {
1472: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
1473: return;
1474: }
1475:
1476: (*((struct_liste_chainee *) (*s_objet_argument_1).objet)).donnee =
1477: tampon;
1478: (*((struct_liste_chainee *) (*s_objet_argument_1).objet)).suivant =
1479: NULL;
1480:
1481: if (empilement(s_etat_processus, &((*s_etat_processus).l_base_pile),
1482: s_objet_argument_1) == d_erreur)
1483: {
1484: if (last_valide == d_vrai)
1485: {
1486: sf(s_etat_processus, 31);
1487: }
1488:
1489: return;
1490: }
1491:
1492: instruction_dup2(s_etat_processus);
1493:
1494: if (((*s_etat_processus).erreur_systeme != d_es) ||
1495: ((*s_etat_processus).erreur_execution != d_ex) ||
1496: ((*s_etat_processus).exception != d_ep))
1497: {
1498: liberation(s_etat_processus, s_objet_argument_1);
1499: liberation(s_etat_processus, s_objet_argument_2);
1500: liberation(s_etat_processus, s_objet_argument_3);
1501:
1502: if (last_valide == d_vrai)
1503: {
1504: sf(s_etat_processus, 31);
1505: }
1506:
1507: return;
1508: }
1509:
1510: instruction_getr(s_etat_processus);
1511:
1512: if (((*s_etat_processus).erreur_systeme != d_es) ||
1513: ((*s_etat_processus).erreur_execution != d_ex) ||
1514: ((*s_etat_processus).exception != d_ep))
1515: {
1516: liberation(s_etat_processus, s_objet_argument_1);
1517: liberation(s_etat_processus, s_objet_argument_2);
1518: liberation(s_etat_processus, s_objet_argument_3);
1519:
1520: if (last_valide == d_vrai)
1521: {
1522: sf(s_etat_processus, 31);
1523: }
1524:
1525: return;
1526: }
1527:
1528: if (empilement(s_etat_processus, &((*s_etat_processus).l_base_pile),
1529: s_objet_argument_2) == d_erreur)
1530: {
1531: return;
1532: }
1533:
1534: instruction_multiplication(s_etat_processus);
1535:
1536: if (((*s_etat_processus).erreur_systeme != d_es) ||
1537: ((*s_etat_processus).erreur_execution != d_ex) ||
1538: ((*s_etat_processus).exception != d_ep))
1539: {
1540: liberation(s_etat_processus, s_objet_argument_1);
1541: liberation(s_etat_processus, s_objet_argument_2);
1542: liberation(s_etat_processus, s_objet_argument_3);
1543:
1544: if (last_valide == d_vrai)
1545: {
1546: sf(s_etat_processus, 31);
1547: }
1548:
1549: return;
1550: }
1551:
1552: instruction_putr(s_etat_processus);
1553:
1554: if (((*s_etat_processus).erreur_systeme != d_es) ||
1555: ((*s_etat_processus).erreur_execution != d_ex) ||
1556: ((*s_etat_processus).exception != d_ep))
1557: {
1558: liberation(s_etat_processus, s_objet_argument_1);
1559: liberation(s_etat_processus, s_objet_argument_2);
1560: liberation(s_etat_processus, s_objet_argument_3);
1561:
1562: if (last_valide == d_vrai)
1563: {
1564: sf(s_etat_processus, 31);
1565: }
1566:
1567: return;
1568: }
1569: }
1570: else
1571: {
1572: liberation(s_etat_processus, s_objet_argument_1);
1573: liberation(s_etat_processus, s_objet_argument_2);
1574: liberation(s_etat_processus, s_objet_argument_3);
1575:
1576: if (last_valide == d_vrai)
1577: {
1578: sf(s_etat_processus, 31);
1579: }
1580:
1581: (*s_etat_processus).erreur_execution = d_ex_erreur_type_argument;
1582: return;
1583: }
1584:
1585: if (last_valide == d_vrai)
1586: {
1587: sf(s_etat_processus, 31);
1588: }
1589:
1590: return;
1591: }
1592:
1593:
1594: /*
1595: ================================================================================
1596: Fonction 'rcij'
1597: ================================================================================
1598: Entrées : pointeur sur une structure struct_processus
1599: --------------------------------------------------------------------------------
1600: Sorties :
1601: --------------------------------------------------------------------------------
1602: Effets de bord : néant
1603: ================================================================================
1604: */
1605:
1606: void
1607: instruction_rcij(struct_processus *s_etat_processus)
1608: {
1609: logical1 last_valide;
1610:
1611: struct_objet *s_objet_argument_1;
1612: struct_objet *s_objet_argument_2;
1613: struct_objet *s_objet_argument_3;
1614: struct_objet *s_objet_argument_4;
1615: struct_objet *tampon;
1616:
1617: (*s_etat_processus).erreur_execution = d_ex;
1618:
1619: if ((*s_etat_processus).affichage_arguments == 'Y')
1620: {
1621: printf("\n RCIJ ");
1622:
1623: if ((*s_etat_processus).langue == 'F')
1624: {
1625: printf("(multiplication puis ajout d'une ligne d'une matrice)\n\n");
1626: }
1627: else
1628: {
1629: printf("(multiply and add a row in a matrix)\n\n");
1630: }
1631:
1632: printf(" 4: %s, %s, %s\n", d_MIN, d_MRL, d_MCX);
1633: printf(" 3: %s, %s, %s\n", d_INT, d_REL, d_CPL);
1634: printf(" 2: %s\n", d_INT);
1635: printf(" 1: %s\n", d_INT);
1636: printf("-> 1: %s, %s, %s\n", d_MIN, d_MRL, d_MCX);
1637:
1638: return;
1639: }
1640: else if ((*s_etat_processus).test_instruction == 'Y')
1641: {
1642: (*s_etat_processus).nombre_arguments = -1;
1643: return;
1644: }
1645:
1646: if ((last_valide = test_cfsf(s_etat_processus, 31)) == d_vrai)
1647: {
1648: if (empilement_pile_last(s_etat_processus, 4) == d_erreur)
1649: {
1650: return;
1651: }
1652:
1653: cf(s_etat_processus, 31);
1654: }
1655:
1656: if (depilement(s_etat_processus, &((*s_etat_processus).l_base_pile),
1657: &s_objet_argument_1) == d_erreur)
1658: {
1659: (*s_etat_processus).erreur_execution = d_ex_manque_argument;
1660: return;
1661: }
1662:
1663: if (depilement(s_etat_processus, &((*s_etat_processus).l_base_pile),
1664: &s_objet_argument_2) == d_erreur)
1665: {
1666: liberation(s_etat_processus, s_objet_argument_1);
1667:
1668: (*s_etat_processus).erreur_execution = d_ex_manque_argument;
1669: return;
1670: }
1671:
1672: if (depilement(s_etat_processus, &((*s_etat_processus).l_base_pile),
1673: &s_objet_argument_3) == d_erreur)
1674: {
1675: liberation(s_etat_processus, s_objet_argument_1);
1676: liberation(s_etat_processus, s_objet_argument_2);
1677:
1678: (*s_etat_processus).erreur_execution = d_ex_manque_argument;
1679: return;
1680: }
1681:
1682: if (depilement(s_etat_processus, &((*s_etat_processus).l_base_pile),
1683: &s_objet_argument_4) == d_erreur)
1684: {
1685: liberation(s_etat_processus, s_objet_argument_1);
1686: liberation(s_etat_processus, s_objet_argument_2);
1687: liberation(s_etat_processus, s_objet_argument_3);
1688:
1689: (*s_etat_processus).erreur_execution = d_ex_manque_argument;
1690: return;
1691: }
1692:
1693: if ((((*s_objet_argument_4).type == MIN) ||
1694: ((*s_objet_argument_4).type == MRL) ||
1695: ((*s_objet_argument_4).type == MCX)) &&
1696: (((*s_objet_argument_3).type == INT) ||
1697: ((*s_objet_argument_3).type == REL) ||
1698: ((*s_objet_argument_3).type == CPL)) &&
1699: ((*s_objet_argument_2).type == INT) &&
1700: ((*s_objet_argument_1).type == INT))
1701: {
1702: if (empilement(s_etat_processus, &((*s_etat_processus).l_base_pile),
1703: s_objet_argument_4) == d_erreur)
1704: {
1705: return;
1706: }
1707:
1708: tampon = s_objet_argument_1;
1709:
1710: if ((s_objet_argument_1 = allocation(s_etat_processus, LST)) == NULL)
1711: {
1712: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
1713: return;
1714: }
1715:
1716: if (((*s_objet_argument_1).objet =
1717: allocation_maillon(s_etat_processus)) == NULL)
1718: {
1719: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
1720: return;
1721: }
1722:
1723: (*((struct_liste_chainee *) (*s_objet_argument_1).objet)).donnee =
1724: tampon;
1725: (*((struct_liste_chainee *) (*s_objet_argument_1).objet)).suivant =
1726: NULL;
1727:
1728: tampon = s_objet_argument_2;
1729:
1730: if ((s_objet_argument_2 = allocation(s_etat_processus, LST)) == NULL)
1731: {
1732: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
1733: return;
1734: }
1735:
1736: if (((*s_objet_argument_2).objet =
1737: allocation_maillon(s_etat_processus)) == NULL)
1738: {
1739: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
1740: return;
1741: }
1742:
1743: (*((struct_liste_chainee *) (*s_objet_argument_2).objet)).donnee =
1744: tampon;
1745: (*((struct_liste_chainee *) (*s_objet_argument_2).objet)).suivant =
1746: NULL;
1747:
1748: instruction_dup(s_etat_processus);
1749:
1750: if (((*s_etat_processus).erreur_systeme != d_es) ||
1751: ((*s_etat_processus).erreur_execution != d_ex) ||
1752: ((*s_etat_processus).exception != d_ep))
1753: {
1754: liberation(s_etat_processus, s_objet_argument_1);
1755: liberation(s_etat_processus, s_objet_argument_2);
1756: liberation(s_etat_processus, s_objet_argument_3);
1757: liberation(s_etat_processus, s_objet_argument_4);
1758:
1759: if (last_valide == d_vrai)
1760: {
1761: sf(s_etat_processus, 31);
1762: }
1763:
1764: return;
1765: }
1766:
1767: if (empilement(s_etat_processus, &((*s_etat_processus).l_base_pile),
1768: s_objet_argument_2) == d_erreur)
1769: {
1770: return;
1771: }
1772:
1773: instruction_getr(s_etat_processus);
1774:
1775: if (((*s_etat_processus).erreur_systeme != d_es) ||
1776: ((*s_etat_processus).erreur_execution != d_ex) ||
1777: ((*s_etat_processus).exception != d_ep))
1778: {
1779: liberation(s_etat_processus, s_objet_argument_1);
1780: liberation(s_etat_processus, s_objet_argument_2);
1781: liberation(s_etat_processus, s_objet_argument_3);
1782: liberation(s_etat_processus, s_objet_argument_4);
1783:
1784: if (last_valide == d_vrai)
1785: {
1786: sf(s_etat_processus, 31);
1787: }
1788:
1789: return;
1790: }
1791:
1792: if (empilement(s_etat_processus, &((*s_etat_processus).l_base_pile),
1793: s_objet_argument_3) == d_erreur)
1794: {
1795: return;
1796: }
1797:
1798: instruction_multiplication(s_etat_processus);
1799:
1800: if (((*s_etat_processus).erreur_systeme != d_es) ||
1801: ((*s_etat_processus).erreur_execution != d_ex) ||
1802: ((*s_etat_processus).exception != d_ep))
1803: {
1804: liberation(s_etat_processus, s_objet_argument_1);
1805: liberation(s_etat_processus, s_objet_argument_2);
1806: liberation(s_etat_processus, s_objet_argument_3);
1807: liberation(s_etat_processus, s_objet_argument_4);
1808:
1809: if (last_valide == d_vrai)
1810: {
1811: sf(s_etat_processus, 31);
1812: }
1813:
1814: return;
1815: }
1816:
1817: instruction_over(s_etat_processus);
1818:
1819: if (((*s_etat_processus).erreur_systeme != d_es) ||
1820: ((*s_etat_processus).erreur_execution != d_ex) ||
1821: ((*s_etat_processus).exception != d_ep))
1822: {
1823: liberation(s_etat_processus, s_objet_argument_1);
1824: liberation(s_etat_processus, s_objet_argument_2);
1825: liberation(s_etat_processus, s_objet_argument_3);
1826: liberation(s_etat_processus, s_objet_argument_4);
1827:
1828: if (last_valide == d_vrai)
1829: {
1830: sf(s_etat_processus, 31);
1831: }
1832:
1833: return;
1834: }
1835:
1836: if (empilement(s_etat_processus, &((*s_etat_processus).l_base_pile),
1837: s_objet_argument_1) == d_erreur)
1838: {
1839: return;
1840: }
1841:
1842: instruction_swap(s_etat_processus);
1843:
1844: if (((*s_etat_processus).erreur_systeme != d_es) ||
1845: ((*s_etat_processus).erreur_execution != d_ex) ||
1846: ((*s_etat_processus).exception != d_ep))
1847: {
1848: liberation(s_etat_processus, s_objet_argument_1);
1849: liberation(s_etat_processus, s_objet_argument_2);
1850: liberation(s_etat_processus, s_objet_argument_3);
1851: liberation(s_etat_processus, s_objet_argument_4);
1852:
1853: if (last_valide == d_vrai)
1854: {
1855: sf(s_etat_processus, 31);
1856: }
1857:
1858: return;
1859: }
1860:
1861: if (((*s_etat_processus).erreur_systeme != d_es) ||
1862: ((*s_etat_processus).erreur_execution != d_ex) ||
1863: ((*s_etat_processus).exception != d_ep))
1864: {
1865: liberation(s_etat_processus, s_objet_argument_1);
1866: liberation(s_etat_processus, s_objet_argument_2);
1867: liberation(s_etat_processus, s_objet_argument_3);
1868: liberation(s_etat_processus, s_objet_argument_4);
1869:
1870: if (last_valide == d_vrai)
1871: {
1872: sf(s_etat_processus, 31);
1873: }
1874:
1875: return;
1876: }
1877:
1878: instruction_over(s_etat_processus);
1879:
1880: if (((*s_etat_processus).erreur_systeme != d_es) ||
1881: ((*s_etat_processus).erreur_execution != d_ex) ||
1882: ((*s_etat_processus).exception != d_ep))
1883: {
1884: liberation(s_etat_processus, s_objet_argument_1);
1885: liberation(s_etat_processus, s_objet_argument_2);
1886: liberation(s_etat_processus, s_objet_argument_3);
1887: liberation(s_etat_processus, s_objet_argument_4);
1888:
1889: if (last_valide == d_vrai)
1890: {
1891: sf(s_etat_processus, 31);
1892: }
1893:
1894: return;
1895: }
1896:
1897: if (((*s_etat_processus).erreur_systeme != d_es) ||
1898: ((*s_etat_processus).erreur_execution != d_ex) ||
1899: ((*s_etat_processus).exception != d_ep))
1900: {
1901: liberation(s_etat_processus, s_objet_argument_1);
1902: liberation(s_etat_processus, s_objet_argument_2);
1903: liberation(s_etat_processus, s_objet_argument_3);
1904: liberation(s_etat_processus, s_objet_argument_4);
1905:
1906: if (last_valide == d_vrai)
1907: {
1908: sf(s_etat_processus, 31);
1909: }
1910:
1911: return;
1912: }
1913:
1914: instruction_getr(s_etat_processus);
1915:
1916: if (((*s_etat_processus).erreur_systeme != d_es) ||
1917: ((*s_etat_processus).erreur_execution != d_ex) ||
1918: ((*s_etat_processus).exception != d_ep))
1919: {
1920: liberation(s_etat_processus, s_objet_argument_1);
1921: liberation(s_etat_processus, s_objet_argument_2);
1922: liberation(s_etat_processus, s_objet_argument_3);
1923: liberation(s_etat_processus, s_objet_argument_4);
1924:
1925: if (last_valide == d_vrai)
1926: {
1927: sf(s_etat_processus, 31);
1928: }
1929:
1930: return;
1931: }
1932:
1933: if (((*s_etat_processus).erreur_systeme != d_es) ||
1934: ((*s_etat_processus).erreur_execution != d_ex) ||
1935: ((*s_etat_processus).exception != d_ep))
1936: {
1937: liberation(s_etat_processus, s_objet_argument_1);
1938: liberation(s_etat_processus, s_objet_argument_2);
1939: liberation(s_etat_processus, s_objet_argument_3);
1940: liberation(s_etat_processus, s_objet_argument_4);
1941:
1942: if (last_valide == d_vrai)
1943: {
1944: sf(s_etat_processus, 31);
1945: }
1946:
1947: return;
1948: }
1949:
1950: instruction_rot(s_etat_processus);
1951:
1952: if (((*s_etat_processus).erreur_systeme != d_es) ||
1953: ((*s_etat_processus).erreur_execution != d_ex) ||
1954: ((*s_etat_processus).exception != d_ep))
1955: {
1956: liberation(s_etat_processus, s_objet_argument_1);
1957: liberation(s_etat_processus, s_objet_argument_2);
1958: liberation(s_etat_processus, s_objet_argument_3);
1959: liberation(s_etat_processus, s_objet_argument_4);
1960:
1961: if (last_valide == d_vrai)
1962: {
1963: sf(s_etat_processus, 31);
1964: }
1965:
1966: return;
1967: }
1968:
1969: if (((*s_etat_processus).erreur_systeme != d_es) ||
1970: ((*s_etat_processus).erreur_execution != d_ex) ||
1971: ((*s_etat_processus).exception != d_ep))
1972: {
1973: liberation(s_etat_processus, s_objet_argument_1);
1974: liberation(s_etat_processus, s_objet_argument_2);
1975: liberation(s_etat_processus, s_objet_argument_3);
1976: liberation(s_etat_processus, s_objet_argument_4);
1977:
1978: if (last_valide == d_vrai)
1979: {
1980: sf(s_etat_processus, 31);
1981: }
1982:
1983: return;
1984: }
1985:
1986: instruction_plus(s_etat_processus);
1987:
1988: if (((*s_etat_processus).erreur_systeme != d_es) ||
1989: ((*s_etat_processus).erreur_execution != d_ex) ||
1990: ((*s_etat_processus).exception != d_ep))
1991: {
1992: liberation(s_etat_processus, s_objet_argument_1);
1993: liberation(s_etat_processus, s_objet_argument_2);
1994: liberation(s_etat_processus, s_objet_argument_3);
1995: liberation(s_etat_processus, s_objet_argument_4);
1996:
1997: if (last_valide == d_vrai)
1998: {
1999: sf(s_etat_processus, 31);
2000: }
2001:
2002: return;
2003: }
2004:
2005: instruction_putr(s_etat_processus);
2006:
2007: if (((*s_etat_processus).erreur_systeme != d_es) ||
2008: ((*s_etat_processus).erreur_execution != d_ex) ||
2009: ((*s_etat_processus).exception != d_ep))
2010: {
2011: liberation(s_etat_processus, s_objet_argument_1);
2012: liberation(s_etat_processus, s_objet_argument_2);
2013: liberation(s_etat_processus, s_objet_argument_3);
2014: liberation(s_etat_processus, s_objet_argument_4);
2015:
2016: if (last_valide == d_vrai)
2017: {
2018: sf(s_etat_processus, 31);
2019: }
2020:
2021: return;
2022: }
2023: }
2024: else
2025: {
2026: liberation(s_etat_processus, s_objet_argument_1);
2027: liberation(s_etat_processus, s_objet_argument_2);
2028: liberation(s_etat_processus, s_objet_argument_3);
2029: liberation(s_etat_processus, s_objet_argument_4);
2030:
2031: if (last_valide == d_vrai)
2032: {
2033: sf(s_etat_processus, 31);
2034: }
2035:
2036: (*s_etat_processus).erreur_execution = d_ex_erreur_type_argument;
2037: return;
2038: }
2039:
2040: if (last_valide == d_vrai)
2041: {
2042: sf(s_etat_processus, 31);
2043: }
2044:
2045: return;
2046: }
2047:
2048: // vim: ts=4
CVSweb interface <joel.bertrand@systella.fr>