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