![]() ![]() | ![]() |
1.1 bertrand 1: /*
2: ================================================================================
1.41 ! bertrand 3: RPL/2 (R) version 4.1.11
1.35 bertrand 4: Copyright (C) 1989-2012 Dr. BERTRAND Joël
1.1 bertrand 5:
6: This file is part of RPL/2.
7:
8: RPL/2 is free software; you can redistribute it and/or modify it
9: under the terms of the CeCILL V2 License as published by the french
10: CEA, CNRS and INRIA.
11:
12: RPL/2 is distributed in the hope that it will be useful, but WITHOUT
13: ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
14: FITNESS FOR A PARTICULAR PURPOSE. See the CeCILL V2 License
15: for more details.
16:
17: You should have received a copy of the CeCILL License
18: along with RPL/2. If not, write to info@cecill.info.
19: ================================================================================
20: */
21:
22:
1.13 bertrand 23: #include "rpl-conv.h"
1.1 bertrand 24:
25:
26: /*
27: ================================================================================
28: Fonction 'delete'
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_delete(struct_processus *s_etat_processus)
40: {
1.6 bertrand 41: const char *queue;
42:
1.1 bertrand 43: file *fichier;
44:
1.6 bertrand 45: integer8 lecture_i64;
46:
1.1 bertrand 47: logical1 erreur;
48: logical1 existence;
49: logical1 ouverture;
50:
1.6 bertrand 51: sqlite3_stmt *ppStmt;
52:
53: struct_descripteur_fichier *descripteur;
54:
1.1 bertrand 55: struct_objet *s_objet_argument;
1.6 bertrand 56: struct_objet *s_objet_indice;
1.1 bertrand 57:
58: struct flock lock;
59:
60: struct stat requete;
61:
1.6 bertrand 62: unsigned char *commande;
1.5 bertrand 63: unsigned char *nom;
1.6 bertrand 64: unsigned char *utf8;
1.5 bertrand 65:
1.1 bertrand 66: unsigned long unite;
67:
68: (*s_etat_processus).erreur_execution = d_ex;
69:
70: if ((*s_etat_processus).affichage_arguments == 'Y')
71: {
72: printf("\n DELETE ");
73:
74: if ((*s_etat_processus).langue == 'F')
75: {
1.6 bertrand 76: printf("(effacement d'un fichier ou d'un enregistrement)\n\n");
1.1 bertrand 77: }
78: else
79: {
1.6 bertrand 80: printf("(delete file or record)\n\n");
1.1 bertrand 81: }
82:
1.6 bertrand 83: printf(" 1: %s\n\n", d_CHN);
1.1 bertrand 84:
1.6 bertrand 85: printf(" 2: %s, %s\n", d_CHN, d_INT);
86: printf(" 1: %s\n", d_FCH);
1.1 bertrand 87: return;
88: }
89: else if ((*s_etat_processus).test_instruction == 'Y')
90: {
91: (*s_etat_processus).nombre_arguments = -1;
92: return;
93: }
94:
95: if (test_cfsf(s_etat_processus, 31) == d_vrai)
96: {
1.6 bertrand 97: if ((*s_etat_processus).l_base_pile == NULL)
1.1 bertrand 98: {
1.6 bertrand 99: (*s_etat_processus).erreur_execution = d_ex_manque_argument;
1.1 bertrand 100: return;
101: }
1.6 bertrand 102:
103: if ((*(*(*s_etat_processus).l_base_pile).donnee).type == FCH)
104: {
105: if (empilement_pile_last(s_etat_processus, 2) == d_erreur)
106: {
107: return;
108: }
109: }
110: else
111: {
112: if (empilement_pile_last(s_etat_processus, 1) == d_erreur)
113: {
114: return;
115: }
116: }
1.1 bertrand 117: }
118:
119: if (depilement(s_etat_processus, &((*s_etat_processus).l_base_pile),
120: &s_objet_argument) == d_erreur)
121: {
122: (*s_etat_processus).erreur_execution = d_ex_manque_argument;
123: return;
124: }
125:
126: if ((*s_objet_argument).type == CHN)
127: {
1.5 bertrand 128: if ((nom = transliteration(s_etat_processus,
129: (unsigned char *) (*s_objet_argument).objet,
130: d_locale, "UTF-8")) == NULL)
131: {
132: liberation(s_etat_processus, s_objet_argument);
133: return;
134: }
135:
136: if (stat(nom, &requete) != 0)
1.1 bertrand 137: {
138: liberation(s_etat_processus, s_objet_argument);
1.5 bertrand 139: free(nom);
1.1 bertrand 140:
141: (*s_etat_processus).erreur_execution =
142: d_ex_erreur_acces_fichier;
143: return;
144: }
145:
146: if (S_ISREG(requete.st_mode)) // Fichier régulier
147: {
1.5 bertrand 148: if ((fichier = fopen(nom, "r+")) == NULL)
1.1 bertrand 149: {
150: liberation(s_etat_processus, s_objet_argument);
1.5 bertrand 151: free(nom);
1.1 bertrand 152:
153: (*s_etat_processus).erreur_execution =
154: d_ex_erreur_acces_fichier;
155: return;
156: }
157:
158: lock.l_type = F_WRLCK;
159: lock.l_whence = SEEK_SET;
160: lock.l_start = 0;
161: lock.l_len = 0;
162: lock.l_pid = getpid();
163:
164: if (fcntl(fileno(fichier), F_GETLK, &lock) == -1)
165: {
1.5 bertrand 166: free(nom);
167:
1.1 bertrand 168: if (fclose(fichier) != 0)
169: {
170: liberation(s_etat_processus, s_objet_argument);
171:
172: (*s_etat_processus).erreur_execution =
173: d_ex_erreur_acces_fichier;
174: return;
175: }
176:
177: liberation(s_etat_processus, s_objet_argument);
178:
179: (*s_etat_processus).erreur_execution =
180: d_ex_erreur_acces_fichier;
181: return;
182: }
183:
184: if (lock.l_type != F_UNLCK)
185: {
186: liberation(s_etat_processus, s_objet_argument);
1.5 bertrand 187: free(nom);
1.1 bertrand 188:
189: (*s_etat_processus).erreur_execution =
190: d_ex_erreur_acces_fichier;
191: return;
192: }
193:
1.5 bertrand 194: erreur = caracteristiques_fichier(s_etat_processus, nom,
1.1 bertrand 195: &existence, &ouverture, &unite);
196:
197: if ((erreur != d_absence_erreur) || (ouverture == d_vrai))
198: {
199: liberation(s_etat_processus, s_objet_argument);
1.5 bertrand 200: free(nom);
1.1 bertrand 201:
202: (*s_etat_processus).erreur_execution =
203: d_ex_erreur_acces_fichier;
204: return;
205: }
206:
1.5 bertrand 207: if (destruction_fichier(nom) == d_erreur)
1.1 bertrand 208: {
209: liberation(s_etat_processus, s_objet_argument);
1.5 bertrand 210: free(nom);
1.1 bertrand 211:
212: (*s_etat_processus).erreur_execution =
213: d_ex_erreur_acces_fichier;
214: return;
215: }
216: }
217: else // Socket
218: {
1.5 bertrand 219: if (unlink(nom) != 0)
1.1 bertrand 220: {
221: liberation(s_etat_processus, s_objet_argument);
1.5 bertrand 222: free(nom);
1.1 bertrand 223:
224: (*s_etat_processus).erreur_execution =
225: d_ex_erreur_acces_fichier;
226: return;
227: }
228: }
1.5 bertrand 229:
230: free(nom);
1.1 bertrand 231: }
1.6 bertrand 232: else if ((*s_objet_argument).type == FCH)
233: {
234: if ((descripteur = descripteur_fichier(s_etat_processus,
235: (struct_fichier *) (*s_objet_argument).objet)) == NULL)
236: {
237: return;
238: }
239:
240: /*
241: * Vérification des verrous
242: */
243:
244: lock.l_type = F_RDLCK;
245: lock.l_whence = SEEK_SET;
246: lock.l_start = 0;
247: lock.l_len = 0;
248: lock.l_pid = getpid();
249:
250: if (fcntl(fileno((*descripteur).descripteur_c), F_GETLK, &lock)
251: == -1)
252: {
253: liberation(s_etat_processus, s_objet_argument);
254:
255: (*s_etat_processus).erreur_systeme = d_es_erreur_fichier;
256: return;
257: }
258:
259: if (lock.l_type != F_UNLCK)
260: {
261: liberation(s_etat_processus, s_objet_argument);
262:
263: (*s_etat_processus).erreur_execution =
264: d_ex_fichier_verrouille;
265: return;
266: }
267:
268: if ((*((struct_fichier *) (*s_objet_argument).objet))
269: .protection == 'R')
270: {
271: liberation(s_etat_processus, s_objet_argument);
272:
273: (*s_etat_processus).erreur_execution = d_ex_erreur_acces_fichier;
274: return;
275: }
276:
277: if ((*((struct_fichier *) (*s_objet_argument).objet)).binaire == 'N')
278: {
279: if ((*((struct_fichier *) (*s_objet_argument).objet)).acces
280: == 'S')
281: {
282: liberation(s_etat_processus, s_objet_argument);
283:
284: (*s_etat_processus).erreur_execution = d_ex_erreur_type_fichier;
285: return;
286: }
287: else if ((*((struct_fichier *) (*s_objet_argument).objet)).acces
288: == 'D')
289: {
290: BUG(((*descripteur).type == 'C'), uprintf("Bad filtype !\n"));
291:
292: if (depilement(s_etat_processus, &((*s_etat_processus)
293: .l_base_pile), &s_objet_indice) == d_erreur)
294: {
295: (*s_etat_processus).erreur_execution = d_ex_manque_argument;
296: return;
297: }
298:
299: if ((*s_objet_indice).type != INT)
300: {
301: liberation(s_etat_processus, s_objet_argument);
302: liberation(s_etat_processus, s_objet_indice);
303:
304: (*s_etat_processus).erreur_execution =
305: d_ex_erreur_type_argument;
306: return;
307: }
308:
309: if (alsprintf(&commande, "select count(*) from data where "
310: "id = %lld", (*((integer8 *) (*s_objet_indice).objet)))
311: < 0)
312: {
313: (*s_etat_processus).erreur_systeme =
314: d_es_allocation_memoire;
315: return;
316: }
317:
318: if (sqlite3_prepare_v2((*descripteur).descripteur_sqlite,
319: commande, strlen(commande), &ppStmt, &queue)
320: != SQLITE_OK)
321: {
322: (*s_etat_processus).erreur_systeme = d_es_erreur_fichier;
323: return;
324: }
325:
326: if (sqlite3_step(ppStmt) != SQLITE_ROW)
327: {
328: (*s_etat_processus).erreur_systeme = d_es_erreur_fichier;
329: return;
330: }
331:
332: lecture_i64 = sqlite3_column_int64(ppStmt, 0);
333:
334: if (sqlite3_step(ppStmt) != SQLITE_DONE)
335: {
336: (*s_etat_processus).erreur_systeme = d_es_erreur_fichier;
337: return;
338: }
339:
340: if (sqlite3_finalize(ppStmt) != SQLITE_OK)
341: {
342: (*s_etat_processus).erreur_systeme = d_es_erreur_fichier;
343: return;
344: }
345:
346: free(commande);
347:
348: if (lecture_i64 == 0)
349: {
350: liberation(s_etat_processus, s_objet_argument);
351: liberation(s_etat_processus, s_objet_indice);
352:
353: (*s_etat_processus).erreur_execution =
354: d_ex_enregistrement_inexistant;
355: return;
356: }
357:
358: if (alsprintf(&commande, "delete from data where id = %lld",
359: (*((integer8 *) (*s_objet_indice).objet))) < 0)
360: {
361: (*s_etat_processus).erreur_systeme =
362: d_es_allocation_memoire;
363: return;
364: }
365:
366: if (sqlite3_prepare_v2((*descripteur).descripteur_sqlite,
367: commande, strlen(commande), &ppStmt, &queue)
368: != SQLITE_OK)
369: {
370: (*s_etat_processus).erreur_systeme = d_es_erreur_fichier;
371: return;
372: }
373:
374: if (sqlite3_step(ppStmt) != SQLITE_DONE)
375: {
376: (*s_etat_processus).erreur_systeme = d_es_erreur_fichier;
377: return;
378: }
379:
380: if (sqlite3_finalize(ppStmt) != SQLITE_OK)
381: {
382: (*s_etat_processus).erreur_systeme = d_es_erreur_fichier;
383: return;
384: }
385:
386: free(commande);
387: liberation(s_etat_processus, s_objet_indice);
388: }
389: else
390: {
391: BUG(((*descripteur).type == 'C'), uprintf("Bad filtype !\n"));
392:
393: if (depilement(s_etat_processus, &((*s_etat_processus)
394: .l_base_pile), &s_objet_indice) == d_erreur)
395: {
396: (*s_etat_processus).erreur_execution = d_ex_manque_argument;
397: return;
398: }
399:
400: if ((*s_objet_indice).type != CHN)
401: {
402: liberation(s_etat_processus, s_objet_argument);
403: liberation(s_etat_processus, s_objet_indice);
404:
405: (*s_etat_processus).erreur_execution =
406: d_ex_erreur_type_argument;
407: return;
408: }
409:
410: // Récupération de l'identifiant de la clef
411:
412: if ((utf8 = transliteration(s_etat_processus,
413: (unsigned char *) (*s_objet_indice).objet, d_locale,
414: "UTF-8")) == NULL)
415: {
416: liberation(s_etat_processus, s_objet_argument);
417: liberation(s_etat_processus, s_objet_indice);
418:
419: return;
420: }
421:
422: if (alsprintf(&commande, "select id from key where key = "
423: "'{ \"%s\" }'", utf8) < 0)
424: {
425: (*s_etat_processus).erreur_systeme =
426: d_es_allocation_memoire;
427: return;
428: }
429:
430: free(utf8);
431:
432: if (sqlite3_prepare_v2((*descripteur).descripteur_sqlite,
433: commande, strlen(commande), &ppStmt, &queue)
434: != SQLITE_OK)
435: {
436: (*s_etat_processus).erreur_systeme = d_es_erreur_fichier;
437: return;
438: }
439:
440: switch(sqlite3_step(ppStmt))
441: {
442: case SQLITE_ROW:
443: {
444: // Correspondance
445: break;
446: }
447:
448: case SQLITE_DONE:
449: {
450: // Aucune correspondance
451: if (sqlite3_finalize(ppStmt) != SQLITE_OK)
452: {
453: (*s_etat_processus).erreur_systeme =
454: d_es_erreur_fichier;
455: return;
456: }
457:
458: free(commande);
459:
460: liberation(s_etat_processus, s_objet_argument);
461: liberation(s_etat_processus, s_objet_indice);
462:
463: (*s_etat_processus).erreur_execution =
464: d_ex_enregistrement_inexistant;
465: return;
466: }
467:
468: default:
469: {
470: (*s_etat_processus).erreur_systeme =
471: d_es_erreur_fichier;
472: return;
473: }
474: }
475:
476: if (sqlite3_column_type(ppStmt, 0) != SQLITE_INTEGER)
477: {
478: (*s_etat_processus).erreur_systeme = d_es_erreur_fichier;
479: return;
480: }
481:
482: lecture_i64 = sqlite3_column_int64(ppStmt, 0);
483:
484: if (sqlite3_step(ppStmt) != SQLITE_DONE)
485: {
486: (*s_etat_processus).erreur_systeme = d_es_erreur_fichier;
487: return;
488: }
489:
490: if (sqlite3_finalize(ppStmt) != SQLITE_OK)
491: {
492: (*s_etat_processus).erreur_systeme =
493: d_es_erreur_fichier;
494: return;
495: }
496:
497: free(commande);
498:
499: if (alsprintf(&commande, "delete from data where key_id = %lld",
500: lecture_i64) < 0)
501: {
502: (*s_etat_processus).erreur_systeme =
503: d_es_allocation_memoire;
504: return;
505: }
506:
507: if (sqlite3_prepare_v2((*descripteur).descripteur_sqlite,
508: commande, strlen(commande), &ppStmt, &queue)
509: != SQLITE_OK)
510: {
511: (*s_etat_processus).erreur_systeme = d_es_erreur_fichier;
512: return;
513: }
514:
515: if (sqlite3_step(ppStmt) != SQLITE_DONE)
516: {
517: (*s_etat_processus).erreur_systeme = d_es_erreur_fichier;
518: return;
519: }
520:
521: if (sqlite3_finalize(ppStmt) != SQLITE_OK)
522: {
523: (*s_etat_processus).erreur_systeme =
524: d_es_erreur_fichier;
525: return;
526: }
527:
528: free(commande);
529:
530: if (alsprintf(&commande, "delete from key where id = %lld",
531: lecture_i64) < 0)
532: {
533: (*s_etat_processus).erreur_systeme =
534: d_es_allocation_memoire;
535: return;
536: }
537:
538: if (sqlite3_prepare_v2((*descripteur).descripteur_sqlite,
539: commande, strlen(commande), &ppStmt, &queue)
540: != SQLITE_OK)
541: {
542: (*s_etat_processus).erreur_systeme = d_es_erreur_fichier;
543: return;
544: }
545:
546: if (sqlite3_step(ppStmt) != SQLITE_DONE)
547: {
548: (*s_etat_processus).erreur_systeme = d_es_erreur_fichier;
549: return;
550: }
551:
552: if (sqlite3_finalize(ppStmt) != SQLITE_OK)
553: {
554: (*s_etat_processus).erreur_systeme =
555: d_es_erreur_fichier;
556: return;
557: }
558:
559: free(commande);
560: liberation(s_etat_processus, s_objet_indice);
561: }
562: }
563: else // Fichiers non formatés
564: {
565: }
566: }
1.1 bertrand 567: else
568: {
569: liberation(s_etat_processus, s_objet_argument);
570:
571: (*s_etat_processus).erreur_execution = d_ex_erreur_type_argument;
572: return;
573: }
574:
575: liberation(s_etat_processus, s_objet_argument);
576:
577: return;
578: }
579:
580:
581: /*
582: ================================================================================
583: Fonction 'date'
584: ================================================================================
585: Entrées : pointeur sur une structure struct_processus
586: --------------------------------------------------------------------------------
587: Sorties :
588: --------------------------------------------------------------------------------
589: Effets de bord : néant
590: ================================================================================
591: */
592:
593: void
594: instruction_date(struct_processus *s_etat_processus)
595: {
596: struct_objet *s_objet;
597:
598: struct timeval horodatage;
599:
600: (*s_etat_processus).erreur_execution = d_ex;
601:
602: if ((*s_etat_processus).affichage_arguments == 'Y')
603: {
604: printf("\n DATE ");
605:
606: if ((*s_etat_processus).langue == 'F')
607: {
608: printf("(information sur la date et l'heure)\n\n");
609: }
610: else
611: {
612: printf("(date and time)\n\n");
613: }
614:
615: printf("-> 1: %s\n", d_LST);
616:
617: return;
618: }
619: else if ((*s_etat_processus).test_instruction == 'Y')
620: {
621: (*s_etat_processus).nombre_arguments = -1;
622: return;
623: }
624:
625: if (test_cfsf(s_etat_processus, 31) == d_vrai)
626: {
627: if (empilement_pile_last(s_etat_processus, 0) == d_erreur)
628: {
629: return;
630: }
631: }
632:
633: gettimeofday(&horodatage, NULL);
634:
635: if ((s_objet = formateur_date(s_etat_processus, &horodatage)) == NULL)
636: {
637: return;
638: }
639:
640: if (empilement(s_etat_processus, &((*s_etat_processus).l_base_pile),
641: s_objet) == d_erreur)
642: {
643: return;
644: }
645:
646: return;
647: }
648:
649:
650: /*
651: ================================================================================
652: Fonction 'drws'
653: ================================================================================
654: Entrées : pointeur sur une structure struct_processus
655: --------------------------------------------------------------------------------
656: Sorties :
657: --------------------------------------------------------------------------------
658: Effets de bord : néant
659: ================================================================================
660: */
661:
662: void
663: instruction_drws(struct_processus *s_etat_processus)
664: {
665: file *fichier;
666:
667: int dimensions;
668:
669: logical1 matrice_entiere;
670:
671: struct_objet *s_objet_statistique;
672:
673: unsigned char *nom_fichier;
674:
675: unsigned long j;
676:
677: struct_fichier_graphique *l_fichier_courant;
678: struct_fichier_graphique *l_fichier_precedent;
679:
680: (*s_etat_processus).erreur_execution = d_ex;
681:
682: if ((*s_etat_processus).affichage_arguments == 'Y')
683: {
684: printf("\n DRWS ");
685:
686: if ((*s_etat_processus).langue == 'F')
687: {
688: printf("(affiche une série statistique)\n\n");
689: printf(" Aucun argument\n");
690: }
691: else
692: {
693: printf("(draw statistical data)\n\n");
694: printf(" No argument\n");
695: }
696:
697: return;
698: }
699: else if ((*s_etat_processus).test_instruction == 'Y')
700: {
701: (*s_etat_processus).nombre_arguments = -1;
702: return;
703: }
704:
705: if (test_cfsf(s_etat_processus, 31) == d_vrai)
706: {
707: if (empilement_pile_last(s_etat_processus, 0) == d_erreur)
708: {
709: return;
710: }
711: }
712:
713: /*
714: * Vérification de la présence de la matrice statistique
715: */
716:
1.21 bertrand 717: if (recherche_variable_globale(s_etat_processus, ds_sdat) == d_faux)
1.1 bertrand 718: {
719: /*
720: * Aucune variable ds_sdat n'existe.
721: */
722:
1.22 bertrand 723: if ((*s_etat_processus).erreur_execution == d_ex)
724: {
725: (*s_etat_processus).erreur_execution = d_ex_absence_observations;
726: }
727:
1.1 bertrand 728: (*s_etat_processus).erreur_systeme = d_es;
729:
730: return;
731: }
732:
1.33 bertrand 733: s_objet_statistique = (*(*s_etat_processus).pointeur_variable_courante)
734: .objet;
735:
1.1 bertrand 736: if ((*s_objet_statistique).type == MIN)
737: {
738: matrice_entiere = d_vrai;
739: }
740: else if ((*s_objet_statistique).type == MRL)
741: {
742: matrice_entiere = d_faux;
743: }
744: else
745: {
746: (*s_etat_processus).erreur_execution = d_ex_erreur_type_argument;
747: return;
748: }
749:
750: /*
751: * Création du fichier graphique temporaire
752: */
753:
754: if ((nom_fichier = creation_nom_fichier(s_etat_processus,
755: (*s_etat_processus).chemin_fichiers_temporaires)) == NULL)
756: {
757: (*s_etat_processus).erreur_systeme = d_es_erreur_fichier;
758: return;
759: }
760:
761: if ((fichier = fopen(nom_fichier, "w+")) == NULL)
762: {
763: (*s_etat_processus).erreur_systeme = d_es_erreur_fichier;
764: return;
765: }
766:
767: switch((*((struct_matrice *) (*s_objet_statistique).objet)).nombre_colonnes)
768: {
769:
770: /*
771: * Une seule colonne
772: */
773:
774: case 1 :
775: {
776: dimensions = 2;
777:
778: for(j = 0; j < (*((struct_matrice *) (*s_objet_statistique).objet))
779: .nombre_lignes; j++)
780: {
781: if (matrice_entiere == d_vrai)
782: {
783: if (fprintf(fichier, "%f %f\n", (double) j, (double)
784: ((integer8 **) (*((struct_matrice *)
785: (*s_objet_statistique).objet)).tableau)[j][0]) < 0)
786: {
787: (*s_etat_processus).erreur_systeme =
788: d_es_erreur_fichier;
789: return;
790: }
791: }
792: else
793: {
794: if (fprintf(fichier, "%f %f\n", (double) j, (double)
795: ((real8 **) (*((struct_matrice *)
796: (*s_objet_statistique).objet)).tableau)[j][0]) < 0)
797: {
798: (*s_etat_processus).erreur_systeme =
799: d_es_erreur_fichier;
800: return;
801: }
802: }
803: }
804:
805: break;
806: }
807:
808: /*
809: * Deux colonnes ou plus
810: */
811:
812: default :
813: {
814: dimensions = 2;
815:
816: if (((*s_etat_processus).colonne_statistique_1 < 1) ||
817: ((*s_etat_processus).colonne_statistique_2 < 1) ||
818: ((*s_etat_processus).colonne_statistique_1 > (signed long)
819: (*((struct_matrice *) (*s_objet_statistique).objet))
820: .nombre_colonnes) ||
821: ((*s_etat_processus).colonne_statistique_2 > (signed long)
822: (*((struct_matrice *) (*s_objet_statistique).objet))
823: .nombre_colonnes))
824: {
825: if (fclose(fichier) != 0)
826: {
827: (*s_etat_processus).erreur_systeme = d_es_erreur_fichier;
828: return;
829: }
830:
831: if (destruction_fichier(nom_fichier) == d_erreur)
832: {
833: (*s_etat_processus).erreur_systeme = d_es_erreur_fichier;
834: return;
835: }
836:
837: free(nom_fichier);
838:
839: (*s_etat_processus).erreur_execution =
840: d_ex_observations_inexistantes;
841: return;
842: }
843:
844: for(j = 0; j < (*((struct_matrice *) (*s_objet_statistique).objet))
845: .nombre_lignes; j++)
846: {
847: if (matrice_entiere == d_vrai)
848: {
849: if (fprintf(fichier, "%f %f\n", (double) ((integer8 **)
850: (*((struct_matrice *) (*s_objet_statistique).objet))
851: .tableau)[j][(*s_etat_processus)
852: .colonne_statistique_1 - 1], (double) ((integer8 **)
853: (*((struct_matrice *) (*s_objet_statistique).objet))
854: .tableau)[j][(*s_etat_processus)
855: .colonne_statistique_2 - 1]) < 0)
856: {
857: (*s_etat_processus).erreur_systeme =
858: d_es_erreur_fichier;
859: return;
860: }
861: }
862: else
863: {
864: if (fprintf(fichier, "%f %f\n", (double) ((real8 **)
865: (*((struct_matrice *) (*s_objet_statistique).objet))
866: .tableau)[j][(*s_etat_processus)
867: .colonne_statistique_1 - 1], (double) ((real8 **)
868: (*((struct_matrice *) (*s_objet_statistique).objet))
869: .tableau)[j][(*s_etat_processus)
870: .colonne_statistique_2 - 1]) < 0)
871: {
872: (*s_etat_processus).erreur_systeme =
873: d_es_erreur_fichier;
874: return;
875: }
876: }
877: }
878:
879: break;
880: }
881: }
882:
883: /*
884: * Fermeture du fichier graphique
885: */
886:
887: if (fclose(fichier) != 0)
888: {
889: (*s_etat_processus).erreur_systeme = d_es_erreur_fichier;
890: return;
891: }
892:
893: /*
894: * Chaînage du fichier temporaire à la liste des fichiers graphiques
895: */
896:
897: l_fichier_courant = (*s_etat_processus).fichiers_graphiques;
898:
899: if (l_fichier_courant == NULL)
900: {
901: if (((*s_etat_processus).fichiers_graphiques = malloc(
902: sizeof(struct_fichier_graphique))) == NULL)
903: {
904: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
905: return;
906: }
907:
908: (*(*s_etat_processus).fichiers_graphiques).suivant = NULL;
909: (*(*s_etat_processus).fichiers_graphiques).nom = nom_fichier;
910: (*(*s_etat_processus).fichiers_graphiques).legende = NULL;
911: (*(*s_etat_processus).fichiers_graphiques).dimensions = dimensions;
912: (*(*s_etat_processus).fichiers_graphiques).presence_axes = d_faux;
913: (*(*s_etat_processus).fichiers_graphiques).systeme_axes =
914: (*s_etat_processus).systeme_axes;
915: strcpy((*(*s_etat_processus).fichiers_graphiques).type,
916: (*s_etat_processus).type_trace_sigma);
917: }
918: else
919: {
920: while(l_fichier_courant != NULL)
921: {
922: if ((*l_fichier_courant).dimensions != dimensions)
923: {
924: (*s_etat_processus).erreur_execution =
925: d_ex_dimensions_differentes;
926: return;
927: }
928:
929: l_fichier_precedent = l_fichier_courant;
930: l_fichier_courant = (*l_fichier_courant).suivant;
931: }
932:
933: l_fichier_courant = l_fichier_precedent;
934:
935: if (((*l_fichier_courant).suivant = malloc(
936: sizeof(struct_fichier_graphique))) == NULL)
937: {
938: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
939: return;
940: }
941:
942: l_fichier_courant = (*l_fichier_courant).suivant;
943:
944: (*l_fichier_courant).suivant = NULL;
945: (*l_fichier_courant).nom = nom_fichier;
946: (*l_fichier_courant).legende = NULL;
947: (*l_fichier_courant).dimensions = dimensions;
948: (*l_fichier_courant).presence_axes = d_faux;
949: (*l_fichier_courant).systeme_axes = (*s_etat_processus).systeme_axes;
950: strcpy((*l_fichier_courant).type, (*s_etat_processus).type_trace_sigma);
951: }
952:
953: /*
954: * Affichage du graphique
955: */
956:
957: appel_gnuplot(s_etat_processus, 'N');
958: (*s_etat_processus).erreur_execution = d_ex;
959: (*s_etat_processus).exception = d_ep;
960:
961: return;
962: }
963:
964:
965: /*
966: ================================================================================
967: Fonction 'decr'
968: ================================================================================
969: Entrées :
970: --------------------------------------------------------------------------------
971: Sorties :
972: --------------------------------------------------------------------------------
973: Effets de bord : néant
974: ================================================================================
975: */
976:
977: void
978: instruction_decr(struct_processus *s_etat_processus)
979: {
980: logical1 variable_partagee;
981:
982: struct_objet *s_copie_argument;
983: struct_objet *s_objet_argument;
984:
985: (*s_etat_processus).erreur_execution = d_ex;
986:
987: if ((*s_etat_processus).affichage_arguments == 'Y')
988: {
989: printf("\n DECR ");
990:
991: if ((*s_etat_processus).langue == 'F')
992: {
993: printf("(décrémentation)\n\n");
994: }
995: else
996: {
997: printf("(decrementation)\n\n");
998: }
999:
1000: printf(" 1: %s\n", d_INT);
1001: printf("-> 1: %s\n\n", d_INT);
1002:
1003: printf(" 1: %s\n", d_NOM);
1004:
1005: return;
1006: }
1007: else if ((*s_etat_processus).test_instruction == 'Y')
1008: {
1009: (*s_etat_processus).nombre_arguments = -1;
1010: return;
1011: }
1012:
1013: if (test_cfsf(s_etat_processus, 31) == d_vrai)
1014: {
1015: if (empilement_pile_last(s_etat_processus, 1) == d_erreur)
1016: {
1017: return;
1018: }
1019: }
1020:
1021: if (depilement(s_etat_processus, &((*s_etat_processus).l_base_pile),
1022: &s_objet_argument) == d_erreur)
1023: {
1024: (*s_etat_processus).erreur_execution = d_ex_manque_argument;
1025: return;
1026: }
1027:
1028: if ((*s_objet_argument).type == INT)
1029: {
1030: if ((s_copie_argument = copie_objet(s_etat_processus,
1031: s_objet_argument, 'O')) == NULL)
1032: {
1033: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
1034: return;
1035: }
1036:
1037: liberation(s_etat_processus, s_objet_argument);
1038: s_objet_argument = s_copie_argument;
1039:
1040: (*((integer8 *) (*s_objet_argument).objet))--;
1041:
1042: if (empilement(s_etat_processus, &((*s_etat_processus).l_base_pile),
1043: s_objet_argument) == d_erreur)
1044: {
1045: return;
1046: }
1047: }
1048: else if ((*s_objet_argument).type == NOM)
1049: {
1050: if (recherche_variable(s_etat_processus, (*((struct_nom *)
1051: (*s_objet_argument).objet)).nom) == d_faux)
1052: {
1053: (*s_etat_processus).erreur_systeme = d_es;
1054: (*s_etat_processus).erreur_execution = d_ex_variable_non_definie;
1055:
1056: return;
1057: }
1058:
1059: liberation(s_etat_processus, s_objet_argument);
1060:
1.21 bertrand 1061: if ((*(*s_etat_processus).pointeur_variable_courante)
1.1 bertrand 1062: .variable_verrouillee == d_vrai)
1063: {
1064: (*s_etat_processus).erreur_execution =
1065: d_ex_variable_verrouillee;
1066: return;
1067: }
1068:
1.21 bertrand 1069: if ((*(*s_etat_processus).pointeur_variable_courante).objet
1.1 bertrand 1070: == NULL)
1071: {
1072: if (pthread_mutex_lock(&((*(*s_etat_processus)
1073: .s_liste_variables_partagees).mutex)) != 0)
1074: {
1075: (*s_etat_processus).erreur_systeme = d_es_processus;
1076: return;
1077: }
1078:
1079: if (recherche_variable_partagee(s_etat_processus,
1.21 bertrand 1080: (*(*s_etat_processus).pointeur_variable_courante).nom,
1081: (*(*s_etat_processus).pointeur_variable_courante)
1082: .variable_partagee, (*(*s_etat_processus)
1083: .pointeur_variable_courante).origine) == d_faux)
1.1 bertrand 1084: {
1085: (*s_etat_processus).erreur_systeme = d_es;
1086: (*s_etat_processus).erreur_execution =
1087: d_ex_variable_non_definie;
1088:
1089: return;
1090: }
1091:
1092: s_objet_argument = (*(*s_etat_processus)
1093: .s_liste_variables_partagees).table
1094: [(*(*s_etat_processus).s_liste_variables_partagees)
1095: .position_variable].objet;
1096: variable_partagee = d_vrai;
1097: }
1098: else
1099: {
1.21 bertrand 1100: s_objet_argument = (*(*s_etat_processus).pointeur_variable_courante)
1101: .objet;
1.1 bertrand 1102: variable_partagee = d_faux;
1103: }
1104:
1105: if ((s_copie_argument = copie_objet(s_etat_processus,
1106: s_objet_argument, 'O')) == NULL)
1107: {
1108: if (variable_partagee == d_vrai)
1109: {
1110: if (pthread_mutex_unlock(&((*(*s_etat_processus)
1111: .s_liste_variables_partagees).mutex)) != 0)
1112: {
1113: (*s_etat_processus).erreur_systeme = d_es_processus;
1114: return;
1115: }
1116: }
1117:
1118: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
1119: return;
1120: }
1121:
1122: liberation(s_etat_processus, s_objet_argument);
1123:
1124: if (variable_partagee == d_vrai)
1125: {
1.21 bertrand 1126: (*(*s_etat_processus).pointeur_variable_courante).objet = NULL;
1.1 bertrand 1127: (*(*s_etat_processus)
1128: .s_liste_variables_partagees).table
1129: [(*(*s_etat_processus).s_liste_variables_partagees)
1130: .position_variable].objet = s_copie_argument;
1131: }
1132: else
1133: {
1.21 bertrand 1134: (*(*s_etat_processus).pointeur_variable_courante).objet =
1135: s_copie_argument;
1.1 bertrand 1136: }
1137:
1138: if ((*s_copie_argument).type == INT)
1139: {
1140: (*((integer8 *) (*s_copie_argument).objet))--;
1141:
1142: if (variable_partagee == d_vrai)
1143: {
1144: if (pthread_mutex_unlock(&((*(*s_etat_processus)
1145: .s_liste_variables_partagees).mutex)) != 0)
1146: {
1147: (*s_etat_processus).erreur_systeme = d_es_processus;
1148: return;
1149: }
1150: }
1151: }
1152: else
1153: {
1154: if (variable_partagee == d_vrai)
1155: {
1156: if (pthread_mutex_unlock(&((*(*s_etat_processus)
1157: .s_liste_variables_partagees).mutex)) != 0)
1158: {
1159: (*s_etat_processus).erreur_systeme = d_es_processus;
1160: return;
1161: }
1162: }
1163:
1164: (*s_etat_processus).erreur_execution = d_ex_erreur_type_argument;
1165: return;
1166: }
1167: }
1168: else
1169: {
1170: (*s_etat_processus).erreur_execution = d_ex_erreur_type_argument;
1171:
1172: liberation(s_etat_processus, s_objet_argument);
1173: return;
1174: }
1175:
1176: return;
1177: }
1178:
1179: // vim: ts=4