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