1: /*
2: ================================================================================
3: RPL/2 (R) version 4.1.0.prerelease.0
4: Copyright (C) 1989-2011 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: #include "convert-conv.h"
25:
26:
27: /*
28: ================================================================================
29: Fonction 'cov'
30: ================================================================================
31: Entrées :
32: --------------------------------------------------------------------------------
33: Sorties :
34: --------------------------------------------------------------------------------
35: Effets de bord : néant
36: ================================================================================
37: */
38:
39: void
40: instruction_cov(struct_processus *s_etat_processus)
41: {
42: integer8 nombre_colonnes;
43:
44: logical1 erreur;
45:
46: struct_objet *s_objet_statistique;
47: struct_objet *s_objet_resultat;
48:
49: (*s_etat_processus).erreur_execution = d_ex;
50:
51: if ((*s_etat_processus).affichage_arguments == 'Y')
52: {
53: printf("\n COV ");
54:
55: if ((*s_etat_processus).langue == 'F')
56: {
57: printf("(covariance)\n\n");
58: }
59: else
60: {
61: printf("(covariance)\n\n");
62: }
63:
64: printf("-> 1: %s\n", d_REL);
65:
66: return;
67: }
68: else if ((*s_etat_processus).test_instruction == 'Y')
69: {
70: (*s_etat_processus).nombre_arguments = -1;
71: return;
72: }
73:
74: if (test_cfsf(s_etat_processus, 31) == d_vrai)
75: {
76: if (empilement_pile_last(s_etat_processus, 0) == d_erreur)
77: {
78: return;
79: }
80: }
81:
82: /*
83: * Recherche d'une variable globale référencée par SIGMA
84: */
85:
86: if (recherche_variable_globale(s_etat_processus, ds_sdat) == d_faux)
87: {
88: /*
89: * Aucune variable SIGMA
90: */
91:
92: (*s_etat_processus).erreur_systeme = d_es;
93: (*s_etat_processus).erreur_execution = d_ex_absence_observations;
94: return;
95: }
96: else
97: {
98: if ((*(*s_etat_processus).pointeur_variable_courante).objet
99: == NULL)
100: {
101: (*s_etat_processus).erreur_execution = d_ex_variable_partagee;
102: return;
103: }
104:
105: if (((*(*(*s_etat_processus).pointeur_variable_courante).objet)
106: .type != MIN) && ((*(*(*s_etat_processus)
107: .pointeur_variable_courante).objet).type != MRL))
108: {
109: (*s_etat_processus).erreur_execution =
110: d_ex_matrice_statistique_invalide;
111: return;
112: }
113:
114: nombre_colonnes = (*((struct_matrice *) (*(*(*s_etat_processus)
115: .pointeur_variable_courante).objet).objet)).nombre_colonnes;
116: }
117:
118: s_objet_statistique = (*(*s_etat_processus).pointeur_variable_courante)
119: .objet;
120:
121: if (((*s_objet_statistique).type == MIN) ||
122: ((*s_objet_statistique).type == MRL))
123: {
124: if (((*s_etat_processus).colonne_statistique_1 < 1) ||
125: ((*s_etat_processus).colonne_statistique_2 < 1) ||
126: ((*s_etat_processus).colonne_statistique_1 > nombre_colonnes) ||
127: ((*s_etat_processus).colonne_statistique_2 > nombre_colonnes))
128: {
129: (*s_etat_processus).erreur_execution =
130: d_ex_observations_inexistantes;
131: return;
132: }
133:
134: if ((s_objet_resultat = allocation(s_etat_processus, REL))
135: == NULL)
136: {
137: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
138: return;
139: }
140:
141: (*((real8 *) (*s_objet_resultat).objet)) = covariance_statistique(
142: (struct_matrice *) (*s_objet_statistique).objet,
143: (*s_etat_processus).colonne_statistique_1,
144: (*s_etat_processus).colonne_statistique_2, 'E', &erreur);
145:
146: if (erreur == d_erreur)
147: {
148: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
149: return;
150: }
151: }
152: else
153: {
154: (*s_etat_processus).erreur_execution =
155: d_ex_matrice_statistique_invalide;
156: return;
157: }
158:
159: if (empilement(s_etat_processus, &((*s_etat_processus).l_base_pile),
160: s_objet_resultat) == d_erreur)
161: {
162: return;
163: }
164:
165: return;
166: }
167:
168:
169: /*
170: ================================================================================
171: Fonction 'corr'
172: ================================================================================
173: Entrées :
174: --------------------------------------------------------------------------------
175: Sorties :
176: --------------------------------------------------------------------------------
177: Effets de bord : néant
178: ================================================================================
179: */
180:
181: void
182: instruction_corr(struct_processus *s_etat_processus)
183: {
184: logical1 erreur;
185:
186: struct_objet *s_objet_statistique;
187: struct_objet *s_objet_resultat;
188:
189: unsigned long nombre_colonnes;
190:
191: (*s_etat_processus).erreur_execution = d_ex;
192:
193: if ((*s_etat_processus).affichage_arguments == 'Y')
194: {
195: printf("\n CORR ");
196:
197: if ((*s_etat_processus).langue == 'F')
198: {
199: printf("(corrélation)\n\n");
200: }
201: else
202: {
203: printf("(correlation)\n\n");
204: }
205:
206: printf("-> 1: %s\n", d_REL);
207:
208: return;
209: }
210: else if ((*s_etat_processus).test_instruction == 'Y')
211: {
212: (*s_etat_processus).nombre_arguments = -1;
213: return;
214: }
215:
216: if (test_cfsf(s_etat_processus, 31) == d_vrai)
217: {
218: if (empilement_pile_last(s_etat_processus, 0) == d_erreur)
219: {
220: return;
221: }
222: }
223:
224: /*
225: * Recherche d'une variable globale référencée par SIGMA
226: */
227:
228: if (recherche_variable_globale(s_etat_processus, ds_sdat) == d_faux)
229: {
230: /*
231: * Aucune variable SIGMA
232: */
233:
234: (*s_etat_processus).erreur_systeme = d_es;
235: (*s_etat_processus).erreur_execution = d_ex_absence_observations;
236: return;
237: }
238: else
239: {
240: if ((*(*s_etat_processus).pointeur_variable_courante).objet == NULL)
241: {
242: (*s_etat_processus).erreur_execution = d_ex_variable_partagee;
243: return;
244: }
245:
246: if (((*(*(*s_etat_processus).pointeur_variable_courante).objet)
247: .type != MIN) && ((*(*(*s_etat_processus)
248: .pointeur_variable_courante).objet).type != MRL))
249: {
250: (*s_etat_processus).erreur_execution =
251: d_ex_matrice_statistique_invalide;
252: return;
253: }
254:
255: nombre_colonnes = (*((struct_matrice *) (*(*(*s_etat_processus)
256: .pointeur_variable_courante).objet).objet))
257: .nombre_colonnes;
258: }
259:
260: s_objet_statistique = (*(*s_etat_processus).pointeur_variable_courante)
261: .objet;
262:
263: if (((*s_objet_statistique).type == MIN) ||
264: ((*s_objet_statistique).type == MRL))
265: {
266: if (((*s_etat_processus).colonne_statistique_1 < 1) ||
267: ((*s_etat_processus).colonne_statistique_2 < 1) ||
268: ((*s_etat_processus).colonne_statistique_1 > (long)
269: nombre_colonnes) || ((*s_etat_processus).colonne_statistique_2
270: > (long) nombre_colonnes))
271: {
272: (*s_etat_processus).erreur_execution =
273: d_ex_observations_inexistantes;
274: return;
275: }
276:
277: if ((s_objet_resultat = allocation(s_etat_processus, REL))
278: == NULL)
279: {
280: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
281: return;
282: }
283:
284: (*((real8 *) (*s_objet_resultat).objet)) = correlation_statistique(
285: (struct_matrice *) (*s_objet_statistique).objet,
286: (*s_etat_processus).colonne_statistique_1,
287: (*s_etat_processus).colonne_statistique_2, &erreur);
288:
289: if (erreur == d_erreur)
290: {
291: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
292: return;
293: }
294: }
295: else
296: {
297: (*s_etat_processus).erreur_execution =
298: d_ex_matrice_statistique_invalide;
299: return;
300: }
301:
302: if (empilement(s_etat_processus, &((*s_etat_processus).l_base_pile),
303: s_objet_resultat) == d_erreur)
304: {
305: return;
306: }
307:
308: return;
309: }
310:
311:
312: /*
313: ================================================================================
314: Fonction 'copyright'
315: ================================================================================
316: Entrées :
317: --------------------------------------------------------------------------------
318: Sorties :
319: --------------------------------------------------------------------------------
320: Effets de bord : néant
321: ================================================================================
322: */
323:
324: void
325: instruction_copyright(struct_processus *s_etat_processus)
326: {
327: # include "copyright-conv.h"
328:
329: (*s_etat_processus).erreur_execution = d_ex;
330:
331: if ((*s_etat_processus).affichage_arguments == 'Y')
332: {
333: printf("\n COPYRIGHT ");
334:
335: if ((*s_etat_processus).langue == 'F')
336: {
337: printf("(copyright)\n\n");
338: printf(" Aucun argument\n");
339: }
340: else
341: {
342: printf("(copyright)\n\n");
343: printf(" No argument\n");
344: }
345:
346: return;
347: }
348: else if ((*s_etat_processus).test_instruction == 'Y')
349: {
350: (*s_etat_processus).nombre_arguments = -1;
351: return;
352: }
353:
354: printf("\n RPL/2 (R) version %s\n", d_version_rpl);
355: printf("%s\n", ((*s_etat_processus).langue == 'F' )
356: ? copyright : copyright_anglais);
357:
358: if ((*s_etat_processus).hauteur_pile_operationnelle == 0)
359: {
360: printf("\n");
361: }
362:
363: return;
364: }
365:
366:
367: /*
368: ================================================================================
369: Fonction 'convert'
370: ================================================================================
371: Entrées :
372: --------------------------------------------------------------------------------
373: Sorties :
374: --------------------------------------------------------------------------------
375: Effets de bord : néant
376: ================================================================================
377: */
378:
379: void
380: instruction_convert(struct_processus *s_etat_processus)
381: {
382: file *pipe;
383:
384: int fin_fichier;
385:
386: logical1 last_valide;
387:
388: long longueur_chaine;
389:
390: logical1 presence_resultat;
391:
392: struct_objet *s_objet_argument_1;
393: struct_objet *s_objet_argument_2;
394: struct_objet *s_objet_argument_3;
395:
396: unsigned char *commande;
397: unsigned char *executable_candidat;
398: unsigned char ligne[1024 + 1];
399: unsigned char *tampon_instruction;
400:
401: (*s_etat_processus).erreur_execution = d_ex;
402:
403: if ((*s_etat_processus).affichage_arguments == 'Y')
404: {
405: printf("\n CONVERT ");
406:
407: if ((*s_etat_processus).langue == 'F')
408: {
409: printf("(conversion d'unités)\n\n");
410: }
411: else
412: {
413: printf("(units conversion)\n\n");
414: }
415:
416: printf(" 3: %s, %s\n", d_INT, d_REL);
417: printf(" 2: %s\n", d_CHN);
418: printf(" 1: %s\n", d_CHN);
419: printf("-> 2: %s, %s\n", d_INT, d_REL);
420: printf(" 1: %s\n", d_CHN);
421:
422: return;
423: }
424: else if ((*s_etat_processus).test_instruction == 'Y')
425: {
426: (*s_etat_processus).nombre_arguments = -1;
427: return;
428: }
429:
430: if ((last_valide = test_cfsf(s_etat_processus, 31)) == d_vrai)
431: {
432: if (empilement_pile_last(s_etat_processus, 3) == d_erreur)
433: {
434: return;
435: }
436: }
437:
438: if (depilement(s_etat_processus, &((*s_etat_processus).l_base_pile),
439: &s_objet_argument_1) == d_erreur)
440: {
441: (*s_etat_processus).erreur_execution = d_ex_manque_argument;
442: return;
443: }
444:
445: if (depilement(s_etat_processus, &((*s_etat_processus).l_base_pile),
446: &s_objet_argument_2) == d_erreur)
447: {
448: liberation(s_etat_processus, s_objet_argument_1);
449:
450: (*s_etat_processus).erreur_execution = d_ex_manque_argument;
451: return;
452: }
453:
454: if (depilement(s_etat_processus, &((*s_etat_processus).l_base_pile),
455: &s_objet_argument_3) == d_erreur)
456: {
457: liberation(s_etat_processus, s_objet_argument_1);
458: liberation(s_etat_processus, s_objet_argument_2);
459:
460: (*s_etat_processus).erreur_execution = d_ex_manque_argument;
461: return;
462: }
463:
464: if (((*s_objet_argument_1).type == CHN) &&
465: ((*s_objet_argument_2).type == CHN) &&
466: (((*s_objet_argument_3).type == INT) ||
467: ((*s_objet_argument_3).type == REL)))
468: {
469: if ((*s_etat_processus).rpl_home == NULL)
470: {
471: longueur_chaine = strlen(ds_rplconvert_commande) - 9
472: + strlen((unsigned char *) (*s_objet_argument_1).objet)
473: + strlen((unsigned char *) (*s_objet_argument_2).objet)
474: + (2 * strlen(d_exec_path));
475:
476: if ((commande = malloc((longueur_chaine + 1) *
477: sizeof(unsigned char))) == NULL)
478: {
479: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
480: return;
481: }
482:
483: sprintf(commande, ds_rplconvert_commande, d_exec_path, d_exec_path,
484: (unsigned char *) (*s_objet_argument_2).objet,
485: (unsigned char *) (*s_objet_argument_1).objet);
486:
487: if (alsprintf(&executable_candidat, "%s/bin/rplconvert",
488: d_exec_path) < 0)
489: {
490: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
491: return;
492: }
493:
494: if (controle(s_etat_processus, executable_candidat, "md5",
495: rplconvert_md5) != d_vrai)
496: {
497: (*s_etat_processus).erreur_systeme = d_es_somme_controle;
498: return;
499: }
500:
501: if (controle(s_etat_processus, executable_candidat, "sha1",
502: rplconvert_sha1) != d_vrai)
503: {
504: (*s_etat_processus).erreur_systeme = d_es_somme_controle;
505: return;
506: }
507:
508: free(executable_candidat);
509: }
510: else
511: {
512: longueur_chaine = strlen(ds_rplconvert_commande) - 9
513: + strlen((unsigned char *) (*s_objet_argument_1).objet)
514: + strlen((unsigned char *) (*s_objet_argument_2).objet)
515: + (2 * strlen((*s_etat_processus).rpl_home));
516:
517: if ((commande = malloc((longueur_chaine + 1) *
518: sizeof(unsigned char))) == NULL)
519: {
520: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
521: return;
522: }
523:
524: sprintf(commande, ds_rplconvert_commande,
525: (*s_etat_processus).rpl_home, (*s_etat_processus).rpl_home,
526: (unsigned char *) (*s_objet_argument_2).objet,
527: (unsigned char *) (*s_objet_argument_1).objet);
528:
529: if (alsprintf(&executable_candidat, "%s/bin/rplconvert",
530: (*s_etat_processus).rpl_home) < 0)
531: {
532: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
533: return;
534: }
535:
536: if (controle(s_etat_processus, executable_candidat, "md5",
537: rplconvert_md5) != d_vrai)
538: {
539: (*s_etat_processus).erreur_systeme = d_es_somme_controle;
540: return;
541: }
542:
543: if (controle(s_etat_processus, executable_candidat, "sha1",
544: rplconvert_sha1) != d_vrai)
545: {
546: (*s_etat_processus).erreur_systeme = d_es_somme_controle;
547: return;
548: }
549:
550: free(executable_candidat);
551: }
552:
553: if ((pipe = popen(commande, "r")) == NULL)
554: {
555: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
556: return;
557: }
558:
559: free(commande);
560:
561: presence_resultat = d_faux;
562:
563: do
564: {
565: fin_fichier = fscanf(pipe, "%1024s", ligne);
566:
567: if (strcmp(ligne, "*") == 0)
568: {
569: fin_fichier = fscanf(pipe, "%1024s", ligne);
570:
571: if (fin_fichier != EOF)
572: {
573: presence_resultat = d_vrai;
574:
575: tampon_instruction =
576: (*s_etat_processus).instruction_courante;
577: (*s_etat_processus).instruction_courante = ligne;
578:
579: recherche_type(s_etat_processus);
580:
581: (*s_etat_processus).instruction_courante =
582: tampon_instruction;
583:
584: if ((*s_etat_processus).erreur_execution != d_ex)
585: {
586: if (pclose(pipe) == -1)
587: {
588: (*s_etat_processus).erreur_systeme = d_es_processus;
589: return;
590: }
591:
592: liberation(s_etat_processus, s_objet_argument_1);
593: liberation(s_etat_processus, s_objet_argument_2);
594: liberation(s_etat_processus, s_objet_argument_3);
595:
596: return;
597: }
598: }
599: }
600: } while(fin_fichier != EOF);
601:
602: /*
603: * Récupération de la ligne renvoyée commencant par "*". Si une telle
604: * ligne n'existe par, rplconvert retourne une erreur de type
605: * « conformability error » ou « Unknown unit ».
606: */
607:
608: if (pclose(pipe) == -1)
609: {
610: (*s_etat_processus).erreur_systeme = d_es_processus;
611: return;
612: }
613:
614: if (presence_resultat == d_faux)
615: {
616: liberation(s_etat_processus, s_objet_argument_1);
617: liberation(s_etat_processus, s_objet_argument_2);
618: liberation(s_etat_processus, s_objet_argument_3);
619:
620: (*s_etat_processus).erreur_execution = d_ex_conversion_unite;
621: return;
622: }
623:
624: /*
625: * Retrait des espaces dans la chaîne unité renvoyée
626: */
627:
628: if (empilement(s_etat_processus, &((*s_etat_processus).l_base_pile),
629: s_objet_argument_3) == d_erreur)
630: {
631: return;
632: }
633:
634: if (last_valide == d_vrai)
635: {
636: cf(s_etat_processus, 31);
637: }
638:
639: instruction_multiplication(s_etat_processus);
640:
641: if (last_valide == d_vrai)
642: {
643: sf(s_etat_processus, 31);
644: }
645: }
646: else
647: {
648: liberation(s_etat_processus, s_objet_argument_1);
649: liberation(s_etat_processus, s_objet_argument_2);
650: liberation(s_etat_processus, s_objet_argument_3);
651:
652: (*s_etat_processus).erreur_execution = d_ex_erreur_type_argument;
653: return;
654: }
655:
656: liberation(s_etat_processus, s_objet_argument_1);
657: liberation(s_etat_processus, s_objet_argument_2);
658:
659: return;
660: }
661:
662:
663: /*
664: ================================================================================
665: Fonction 'close'
666: ================================================================================
667: Entrées :
668: --------------------------------------------------------------------------------
669: Sorties :
670: --------------------------------------------------------------------------------
671: Effets de bord : néant
672: ================================================================================
673: */
674:
675: void
676: instruction_close(struct_processus *s_etat_processus)
677: {
678: const char *queue;
679:
680: int socket;
681:
682: logical1 socket_connectee;
683:
684: sqlite3_stmt *ppStmt;
685:
686: struct_descripteur_fichier *descripteur;
687:
688: struct_liste_chainee *l_element_courant;
689: struct_liste_chainee *l_element_precedent;
690:
691: struct_objet *s_objet_argument;
692:
693: (*s_etat_processus).erreur_execution = d_ex;
694:
695: if ((*s_etat_processus).affichage_arguments == 'Y')
696: {
697: printf("\n CLOSE ");
698:
699: if ((*s_etat_processus).langue == 'F')
700: {
701: printf("(fermeture d'un fichier, d'une socket ou d'un sémaphore)"
702: "\n\n");
703: }
704: else
705: {
706: printf("(close file, socket or semaphore)\n\n");
707: }
708:
709: printf(" 1: %s\n\n", d_FCH);
710:
711: printf(" 1: %s\n\n", d_SCK);
712:
713: printf(" 1: %s\n", d_SPH);
714:
715: return;
716: }
717: else if ((*s_etat_processus).test_instruction == 'Y')
718: {
719: (*s_etat_processus).nombre_arguments = -1;
720: return;
721: }
722:
723: if (test_cfsf(s_etat_processus, 31) == d_vrai)
724: {
725: if (empilement_pile_last(s_etat_processus, 1) == d_erreur)
726: {
727: return;
728: }
729: }
730:
731: if (depilement(s_etat_processus, &((*s_etat_processus).l_base_pile),
732: &s_objet_argument) == d_erreur)
733: {
734: (*s_etat_processus).erreur_execution = d_ex_manque_argument;
735: return;
736: }
737:
738: if ((*s_objet_argument).type == FCH)
739: {
740: /*
741: * Retrait du descripteur de la pile de fichiers
742: */
743:
744: l_element_courant = (*s_etat_processus).s_fichiers;
745: l_element_precedent = NULL;
746:
747: descripteur = NULL;
748:
749: while(l_element_courant != NULL)
750: {
751: if (((*((struct_descripteur_fichier *) (*l_element_courant).donnee))
752: .identifiant == (*((struct_fichier *) (*s_objet_argument)
753: .objet)).descripteur) && ((*((struct_descripteur_fichier *)
754: (*l_element_courant).donnee)).pid == getpid()) &&
755: (pthread_equal((*((struct_descripteur_fichier *)
756: (*l_element_courant).donnee)).tid, pthread_self()) != 0))
757: {
758: if (((*((struct_fichier *) (*s_objet_argument).objet)).pid ==
759: (*((struct_descripteur_fichier *) (*l_element_courant)
760: .donnee)).pid) && (pthread_equal((*((struct_fichier *)
761: (*s_objet_argument).objet)).tid,
762: (*((struct_descripteur_fichier *) (*l_element_courant)
763: .donnee)).tid) != 0))
764: {
765: descripteur = (struct_descripteur_fichier *)
766: (*l_element_courant).donnee;
767:
768: if (l_element_precedent == NULL)
769: {
770: (*s_etat_processus).s_fichiers =
771: (*l_element_courant).suivant;
772: }
773: else if ((*l_element_courant).suivant == NULL)
774: {
775: (*l_element_precedent).suivant = NULL;
776: }
777: else
778: {
779: (*l_element_precedent).suivant =
780: (*l_element_courant).suivant;
781: }
782:
783: free((*((struct_descripteur_fichier *)
784: (*l_element_courant).donnee)).nom);
785: free(l_element_courant);
786:
787: break;
788: }
789: }
790:
791: l_element_precedent = l_element_courant;
792: l_element_courant = (*l_element_courant).suivant;
793: }
794:
795: if (descripteur == NULL)
796: {
797: liberation(s_etat_processus, s_objet_argument);
798:
799: (*s_etat_processus).erreur_execution = d_ex_erreur_acces_fichier;
800: return;
801: }
802:
803: /*
804: * Fermeture du fichier
805: */
806:
807: if (fclose((*descripteur).descripteur_c) != 0)
808: {
809: free(descripteur);
810: liberation(s_etat_processus, s_objet_argument);
811:
812: (*s_etat_processus).erreur_systeme = d_es_erreur_fichier;
813: return;
814: }
815:
816: if ((*descripteur).type != 'C')
817: {
818: if (sqlite3_prepare_v2((*descripteur).descripteur_sqlite,
819: "vacuum", 7, &ppStmt, &queue) != SQLITE_OK)
820: {
821: free(descripteur);
822: liberation(s_etat_processus, s_objet_argument);
823:
824: (*s_etat_processus).erreur_systeme = d_es_erreur_fichier;
825: return;
826: }
827:
828: if (sqlite3_step(ppStmt) != SQLITE_DONE)
829: {
830: free(descripteur);
831: liberation(s_etat_processus, s_objet_argument);
832:
833: (*s_etat_processus).erreur_systeme = d_es_erreur_fichier;
834: return;
835: }
836:
837: if (sqlite3_finalize(ppStmt) != SQLITE_OK)
838: {
839: free(descripteur);
840: liberation(s_etat_processus, s_objet_argument);
841:
842: (*s_etat_processus).erreur_systeme = d_es_erreur_fichier;
843: return;
844: }
845:
846: if (sqlite3_close((*descripteur).descripteur_sqlite) != SQLITE_OK)
847: {
848: free(descripteur);
849: liberation(s_etat_processus, s_objet_argument);
850:
851: (*s_etat_processus).erreur_systeme = d_es_erreur_fichier;
852: return;
853: }
854:
855: free(descripteur);
856: }
857:
858: if ((*((struct_fichier *) (*s_objet_argument).objet)).ouverture == 'S')
859: {
860: if (destruction_fichier((*((struct_fichier *)
861: (*s_objet_argument).objet)).nom) == d_erreur)
862: {
863: liberation(s_etat_processus, s_objet_argument);
864:
865: (*s_etat_processus).erreur_systeme = d_es_erreur_fichier;
866: return;
867: }
868: }
869: }
870: else if ((*s_objet_argument).type == SCK)
871: {
872: /*
873: * Retrait de la socket de la pile
874: */
875:
876: l_element_courant = (*s_etat_processus).s_sockets;
877: l_element_precedent = NULL;
878:
879: socket = -1;
880: socket_connectee = d_faux;
881:
882: while(l_element_courant != NULL)
883: {
884: if ((*((struct_socket *) (*(*l_element_courant).donnee).objet))
885: .socket == (*((struct_socket *) (*s_objet_argument)
886: .objet)).socket)
887: {
888: socket = (*((struct_socket *)
889: (*(*l_element_courant).donnee).objet)).socket;
890: socket_connectee = (*((struct_socket *)
891: (*(*l_element_courant).donnee).objet)).socket_connectee;
892:
893: if (l_element_precedent == NULL)
894: {
895: (*s_etat_processus).s_sockets =
896: (*l_element_courant).suivant;
897: }
898: else if ((*l_element_courant).suivant == NULL)
899: {
900: (*l_element_precedent).suivant = NULL;
901: }
902: else
903: {
904: (*l_element_precedent).suivant =
905: (*l_element_courant).suivant;
906: }
907:
908: liberation(s_etat_processus, (*l_element_courant).donnee);
909: free(l_element_courant);
910:
911: break;
912: }
913:
914: l_element_precedent = l_element_courant;
915: l_element_courant = (*l_element_courant).suivant;
916: }
917:
918: if (socket == -1)
919: {
920: liberation(s_etat_processus, s_objet_argument);
921:
922: (*s_etat_processus).erreur_execution = d_ex_erreur_acces_fichier;
923: return;
924: }
925:
926: /*
927: * Fermeture de la socket
928: */
929:
930: if (socket_connectee == d_vrai)
931: {
932: shutdown(socket, SHUT_RDWR);
933: }
934:
935: if (close(socket) != 0)
936: {
937: liberation(s_etat_processus, s_objet_argument);
938:
939: (*s_etat_processus).erreur_systeme = d_es_erreur_fichier;
940: return;
941: }
942:
943: if ((*((struct_socket *) (*s_objet_argument).objet)).effacement == 'Y')
944: {
945: unlink((*((struct_socket *) (*s_objet_argument).objet)).adresse);
946: }
947: }
948: else if ((*s_objet_argument).type == SPH)
949: {
950: if (sem_close((*((struct_semaphore *) (*s_objet_argument).objet))
951: .semaphore) != 0)
952: {
953: (*s_etat_processus).erreur_execution = d_ex_semaphore;
954: return;
955: }
956: }
957: else
958: {
959: liberation(s_etat_processus, s_objet_argument);
960:
961: (*s_etat_processus).erreur_execution = d_ex_erreur_type_argument;
962: return;
963: }
964:
965: liberation(s_etat_processus, s_objet_argument);
966:
967: return;
968: }
969:
970:
971: /*
972: ================================================================================
973: Fonction 'create'
974: ================================================================================
975: Entrées :
976: --------------------------------------------------------------------------------
977: Sorties :
978: --------------------------------------------------------------------------------
979: Effets de bord : néant
980: ================================================================================
981: */
982:
983: void
984: instruction_create(struct_processus *s_etat_processus)
985: {
986: file *fichier;
987:
988: logical1 erreur;
989: logical1 existence;
990: logical1 ouverture;
991:
992: struct_objet *s_objet_argument;
993:
994: unsigned char *nom;
995:
996: unsigned long unite;
997:
998: (*s_etat_processus).erreur_execution = d_ex;
999:
1000: if ((*s_etat_processus).affichage_arguments == 'Y')
1001: {
1002: printf("\n CREATE ");
1003:
1004: if ((*s_etat_processus).langue == 'F')
1005: {
1006: printf("(création d'un fichier)\n\n");
1007: }
1008: else
1009: {
1010: printf("(create file)\n\n");
1011: }
1012:
1013: printf(" 1: %s\n", d_CHN);
1014:
1015: return;
1016: }
1017: else if ((*s_etat_processus).test_instruction == 'Y')
1018: {
1019: (*s_etat_processus).nombre_arguments = -1;
1020: return;
1021: }
1022:
1023: if (test_cfsf(s_etat_processus, 31) == d_vrai)
1024: {
1025: if (empilement_pile_last(s_etat_processus, 1) == d_erreur)
1026: {
1027: return;
1028: }
1029: }
1030:
1031: if (depilement(s_etat_processus, &((*s_etat_processus).l_base_pile),
1032: &s_objet_argument) == d_erreur)
1033: {
1034: (*s_etat_processus).erreur_execution = d_ex_manque_argument;
1035: return;
1036: }
1037:
1038: if ((*s_objet_argument).type == CHN)
1039: {
1040: if ((nom = transliteration(s_etat_processus, (unsigned char *)
1041: (*s_objet_argument).objet, d_locale, "UTF-8")) == NULL)
1042: {
1043: liberation(s_etat_processus, s_objet_argument);
1044: return;
1045: }
1046:
1047: erreur = caracteristiques_fichier(s_etat_processus, nom,
1048: &existence, &ouverture, &unite);
1049:
1050: if ((erreur != d_absence_erreur) || (existence == d_vrai))
1051: {
1052: liberation(s_etat_processus, s_objet_argument);
1053: free(nom);
1054:
1055: (*s_etat_processus).erreur_execution =
1056: d_ex_erreur_acces_fichier;
1057: return;
1058: }
1059:
1060: if ((fichier = fopen(nom, "w")) == NULL)
1061: {
1062: liberation(s_etat_processus, s_objet_argument);
1063: free(nom);
1064:
1065: (*s_etat_processus).erreur_execution =
1066: d_ex_erreur_acces_fichier;
1067: return;
1068: }
1069:
1070: free(nom);
1071:
1072: if (fclose(fichier) != 0)
1073: {
1074: liberation(s_etat_processus, s_objet_argument);
1075:
1076: (*s_etat_processus).erreur_execution =
1077: d_ex_erreur_acces_fichier;
1078: return;
1079: }
1080: }
1081: else
1082: {
1083: liberation(s_etat_processus, s_objet_argument);
1084:
1085: (*s_etat_processus).erreur_execution = d_ex_erreur_type_argument;
1086: return;
1087: }
1088:
1089: liberation(s_etat_processus, s_objet_argument);
1090:
1091: return;
1092: }
1093:
1094:
1095: /*
1096: ================================================================================
1097: Fonction 'cswp'
1098: ================================================================================
1099: Entrées :
1100: --------------------------------------------------------------------------------
1101: Sorties :
1102: --------------------------------------------------------------------------------
1103: Effets de bord : néant
1104: ================================================================================
1105: */
1106:
1107: void
1108: instruction_cswp(struct_processus *s_etat_processus)
1109: {
1110: struct_objet *s_copie_argument_3;
1111: struct_objet *s_objet_argument_1;
1112: struct_objet *s_objet_argument_2;
1113: struct_objet *s_objet_argument_3;
1114:
1115: signed long colonne_1;
1116: signed long colonne_2;
1117:
1118: unsigned long i;
1119:
1120: (*s_etat_processus).erreur_execution = d_ex;
1121:
1122: if ((*s_etat_processus).affichage_arguments == 'Y')
1123: {
1124: printf("\n CSWP ");
1125:
1126: if ((*s_etat_processus).langue == 'F')
1127: {
1128: printf("(échange de deux colonnes d'une matrice)\n\n");
1129: }
1130: else
1131: {
1132: printf("(swap two columns of a matrix)\n\n");
1133: }
1134:
1135: printf(" 3: %s, %s, %s\n", d_MIN, d_MRL, d_MCX);
1136: printf(" 2: %s\n", d_INT);
1137: printf(" 1: %s\n", d_INT);
1138: printf("-> 1: %s, %s, %s\n", d_MIN, d_MRL, d_MCX);
1139:
1140: return;
1141: }
1142: else if ((*s_etat_processus).test_instruction == 'Y')
1143: {
1144: (*s_etat_processus).nombre_arguments = -1;
1145: return;
1146: }
1147:
1148: if (test_cfsf(s_etat_processus, 31) == d_vrai)
1149: {
1150: if (empilement_pile_last(s_etat_processus, 3) == d_erreur)
1151: {
1152: return;
1153: }
1154: }
1155:
1156: if (depilement(s_etat_processus, &((*s_etat_processus).l_base_pile),
1157: &s_objet_argument_1) == d_erreur)
1158: {
1159: (*s_etat_processus).erreur_execution = d_ex_manque_argument;
1160: return;
1161: }
1162:
1163: if (depilement(s_etat_processus, &((*s_etat_processus).l_base_pile),
1164: &s_objet_argument_2) == d_erreur)
1165: {
1166: liberation(s_etat_processus, s_objet_argument_1);
1167:
1168: (*s_etat_processus).erreur_execution = d_ex_manque_argument;
1169: return;
1170: }
1171:
1172: if (depilement(s_etat_processus, &((*s_etat_processus).l_base_pile),
1173: &s_objet_argument_3) == d_erreur)
1174: {
1175: liberation(s_etat_processus, s_objet_argument_1);
1176: liberation(s_etat_processus, s_objet_argument_2);
1177:
1178: (*s_etat_processus).erreur_execution = d_ex_manque_argument;
1179: return;
1180: }
1181:
1182: if (((*s_objet_argument_1).type == INT) &&
1183: ((*s_objet_argument_2).type == INT))
1184: {
1185: colonne_1 = (*((integer8 *) (*s_objet_argument_1).objet)) - 1;
1186: colonne_2 = (*((integer8 *) (*s_objet_argument_2).objet)) - 1;
1187:
1188: if ((*s_objet_argument_3).type == MIN)
1189: {
1190: if ((colonne_1 < 0) || (colonne_1 > ((signed long)
1191: (*((struct_matrice *) (*s_objet_argument_3).objet))
1192: .nombre_colonnes) - 1) || (colonne_2 < 0) || (colonne_2 >
1193: ((signed long) (*((struct_matrice *)
1194: (*s_objet_argument_3).objet)).nombre_colonnes) - 1))
1195: {
1196: liberation(s_etat_processus, s_objet_argument_1);
1197: liberation(s_etat_processus, s_objet_argument_2);
1198: liberation(s_etat_processus, s_objet_argument_3);
1199:
1200: (*s_etat_processus).erreur_execution =
1201: d_ex_dimensions_invalides;
1202: return;
1203: }
1204:
1205: if ((s_copie_argument_3 = copie_objet(s_etat_processus,
1206: s_objet_argument_3, 'Q')) == NULL)
1207: {
1208: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
1209: return;
1210: }
1211:
1212: for(i = 0; i < (*((struct_matrice *) (*s_objet_argument_3).objet))
1213: .nombre_lignes; i++)
1214: {
1215: ((integer8 **) (*((struct_matrice *)
1216: (*s_copie_argument_3).objet)).tableau)
1217: [i][colonne_1] = ((integer8 **) (*((struct_matrice *)
1218: (*s_objet_argument_3).objet)).tableau)[i][colonne_2];
1219: ((integer8 **) (*((struct_matrice *)
1220: (*s_copie_argument_3).objet)).tableau)
1221: [i][colonne_2] = ((integer8 **) (*((struct_matrice *)
1222: (*s_objet_argument_3).objet)).tableau)[i][colonne_1];
1223: }
1224: }
1225: else if ((*s_objet_argument_3).type == MRL)
1226: {
1227: if ((colonne_1 < 0) || (colonne_1 > ((signed long)
1228: (*((struct_matrice *) (*s_objet_argument_3).objet))
1229: .nombre_colonnes) - 1) || (colonne_2 < 0) || (colonne_2 >
1230: ((signed long) (*((struct_matrice *)
1231: (*s_objet_argument_3).objet)).nombre_colonnes) - 1))
1232: {
1233: liberation(s_etat_processus, s_objet_argument_1);
1234: liberation(s_etat_processus, s_objet_argument_2);
1235: liberation(s_etat_processus, s_objet_argument_3);
1236:
1237: (*s_etat_processus).erreur_execution =
1238: d_ex_dimensions_invalides;
1239: return;
1240: }
1241:
1242: if ((s_copie_argument_3 = copie_objet(s_etat_processus,
1243: s_objet_argument_3, 'O')) == NULL)
1244: {
1245: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
1246: return;
1247: }
1248:
1249: for(i = 0; i < (*((struct_matrice *) (*s_objet_argument_3).objet))
1250: .nombre_lignes; i++)
1251: {
1252: ((real8 **) (*((struct_matrice *)
1253: (*s_copie_argument_3).objet)).tableau)
1254: [i][colonne_1] = ((real8 **) (*((struct_matrice *)
1255: (*s_objet_argument_3).objet)).tableau)[i][colonne_2];
1256: ((real8 **) (*((struct_matrice *)
1257: (*s_copie_argument_3).objet)).tableau)
1258: [i][colonne_2] = ((real8 **) (*((struct_matrice *)
1259: (*s_objet_argument_3).objet)).tableau)[i][colonne_1];
1260: }
1261: }
1262: else if ((*s_objet_argument_3).type == MCX)
1263: {
1264: if ((colonne_1 < 0) || (colonne_1 > ((signed long)
1265: (*((struct_matrice *) (*s_objet_argument_3).objet))
1266: .nombre_colonnes) - 1) || (colonne_2 < 0) || (colonne_2 >
1267: ((signed long) (*((struct_matrice *)
1268: (*s_objet_argument_3).objet)).nombre_colonnes) - 1))
1269: {
1270: liberation(s_etat_processus, s_objet_argument_1);
1271: liberation(s_etat_processus, s_objet_argument_2);
1272: liberation(s_etat_processus, s_objet_argument_3);
1273:
1274: (*s_etat_processus).erreur_execution =
1275: d_ex_dimensions_invalides;
1276: return;
1277: }
1278:
1279: if ((s_copie_argument_3 = copie_objet(s_etat_processus,
1280: s_objet_argument_3, 'O')) == NULL)
1281: {
1282: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
1283: return;
1284: }
1285:
1286: for(i = 0; i < (*((struct_matrice *) (*s_objet_argument_3).objet))
1287: .nombre_lignes; i++)
1288: {
1289: ((complex16 **) (*((struct_matrice *)
1290: (*s_copie_argument_3).objet)).tableau)
1291: [i][colonne_1].partie_reelle =
1292: ((complex16 **) (*((struct_matrice *)
1293: (*s_objet_argument_3).objet)).tableau)[i][colonne_2]
1294: .partie_reelle;
1295: ((complex16 **) (*((struct_matrice *)
1296: (*s_copie_argument_3).objet)).tableau)
1297: [i][colonne_1].partie_imaginaire =
1298: ((complex16 **) (*((struct_matrice *)
1299: (*s_objet_argument_3).objet)).tableau)[i][colonne_2]
1300: .partie_imaginaire;
1301: ((complex16 **) (*((struct_matrice *)
1302: (*s_copie_argument_3).objet)).tableau)
1303: [i][colonne_2].partie_reelle =
1304: ((complex16 **) (*((struct_matrice *)
1305: (*s_objet_argument_3).objet)).tableau)[i][colonne_1]
1306: .partie_reelle;
1307: ((complex16 **) (*((struct_matrice *)
1308: (*s_copie_argument_3).objet)).tableau)
1309: [i][colonne_2].partie_imaginaire =
1310: ((complex16 **) (*((struct_matrice *)
1311: (*s_objet_argument_3).objet)).tableau)[i][colonne_1]
1312: .partie_imaginaire;
1313: }
1314: }
1315: else
1316: {
1317: liberation(s_etat_processus, s_objet_argument_1);
1318: liberation(s_etat_processus, s_objet_argument_2);
1319: liberation(s_etat_processus, s_objet_argument_3);
1320:
1321: (*s_etat_processus).erreur_execution = d_ex_erreur_type_argument;
1322: return;
1323: }
1324: }
1325: else
1326: {
1327: liberation(s_etat_processus, s_objet_argument_1);
1328: liberation(s_etat_processus, s_objet_argument_2);
1329: liberation(s_etat_processus, s_objet_argument_3);
1330:
1331: (*s_etat_processus).erreur_execution = d_ex_erreur_type_argument;
1332: return;
1333: }
1334:
1335: liberation(s_etat_processus, s_objet_argument_1);
1336: liberation(s_etat_processus, s_objet_argument_2);
1337: liberation(s_etat_processus, s_objet_argument_3);
1338:
1339: if (empilement(s_etat_processus, &((*s_etat_processus).l_base_pile),
1340: s_copie_argument_3) == d_erreur)
1341: {
1342: return;
1343: }
1344:
1345: return;
1346: }
1347:
1348: // vim: ts=4
CVSweb interface <joel.bertrand@systella.fr>