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