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