Annotation of rpl/src/formateur.c, revision 1.71
1.1 bertrand 1: /*
2: ================================================================================
1.70 bertrand 3: RPL/2 (R) version 4.1.19
1.67 bertrand 4: Copyright (C) 1989-2014 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.16 bertrand 23: #include "rpl-conv.h"
1.1 bertrand 24:
25:
26: /*
27: ================================================================================
28: Routine de formation des données pour l'affichage
29: ================================================================================
30: Entrées : structure sur l'état du processus et objet à afficher
31: --------------------------------------------------------------------------------
32: Sorties : chaine de caractères
33: --------------------------------------------------------------------------------
34: Effets de bord : néant
35: ================================================================================
36: */
37:
38: unsigned char *
39: formateur(struct_processus *s_etat_processus, long offset_initial,
40: struct_objet *s_objet)
41: {
42: int parentheses_groupe_gauche;
43: int parentheses_groupe_droit;
44:
45: logical1 registre45;
46:
47: logical4 autorisation_parenthese;
48: logical4 presence_signe;
49:
1.58 bertrand 50: logical8 masque_binaire;
1.41 bertrand 51:
1.1 bertrand 52: struct_liste_chainee *l_atome;
53: struct_liste_chainee *l_element_courant;
54: struct_liste_chainee *l_liste1;
55: struct_liste_chainee *l_liste2;
56:
57: struct_objet *s_sous_objet;
58: struct_objet *s_sous_objet_1;
59: struct_objet *s_sous_objet_2;
60: struct_objet *s_sous_objet_3;
61:
62: unsigned char base[1 + 1];
63: unsigned char *chaine;
64: unsigned char *chaine_fonction;
65: unsigned char *chaine_formatee;
66: unsigned char *chaine_tampon;
67: unsigned char *chaine_sauvegarde;
68: unsigned char *format;
69: unsigned char *format_majuscule;
70: unsigned char *ptre;
71: unsigned char *ptrl;
72: unsigned char *registre;
73: unsigned char tampon[1024 + 1];
74:
1.58 bertrand 75: integer8 i;
76: integer8 j;
77: integer8 k;
78: integer8 longueur_chaine;
79: integer8 longueur_courante;
80: integer8 longueur_decimale_courante;
81: integer8 *longueurs_maximales;
82: integer8 nombre_arguments;
83: integer8 nombre_arguments_fonction;
84: integer8 nombre_colonnes;
85: integer8 nombre_elements;
86: integer8 nombre_lignes;
87: integer8 offset;
1.1 bertrand 88:
89: chaine = NULL;
90: chaine_formatee = NULL;
91: chaine_sauvegarde = NULL;
92:
93: strcpy(base, " ");
94:
95: masque_binaire = 0;
96:
97: if ((*s_objet).type == ADR)
98: {
99:
100: /*
101: --------------------------------------------------------------------------------
102: Adresse
103: --------------------------------------------------------------------------------
104: */
105:
1.63 bertrand 106: if (alsprintf(&chaine, "@ %016llX", (*((unsigned long long *)
1.3 bertrand 107: ((*s_objet).objet)))) < 0)
1.1 bertrand 108: {
109: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
110: return(NULL);
111: }
112: }
113: else if ((*s_objet).type == SLB)
114: {
115:
116: /*
117: --------------------------------------------------------------------------------
118: Bibliothèque partagée
119: --------------------------------------------------------------------------------
120: */
121:
1.69 bertrand 122: # pragma GCC diagnostic push
123: # pragma GCC diagnostic ignored "-Wpointer-to-int-cast"
124:
1.61 bertrand 125: if (alsprintf(&chaine, "Library $ %016llX [%s]",
1.63 bertrand 126: (unsigned long long) (*((struct_bibliotheque *)
1.3 bertrand 127: (*s_objet).objet)).descripteur, (*((struct_bibliotheque *)
128: (*s_objet).objet)).nom) < 0)
1.1 bertrand 129: {
130: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
131: return(NULL);
132: }
1.69 bertrand 133:
134: # pragma GCC diagnostic pop
135:
1.1 bertrand 136: }
137: else if ((*s_objet).type == SPH)
138: {
139:
140: /*
141: --------------------------------------------------------------------------------
142: Sémaphore
143: --------------------------------------------------------------------------------
144: */
145:
1.69 bertrand 146: # pragma GCC diagnostic push
147: # pragma GCC diagnostic ignored "-Wpointer-to-int-cast"
148:
1.63 bertrand 149: if (alsprintf(&chaine, "Semaphore $ %016llX '%s'", (unsigned long long)
1.3 bertrand 150: &((*((struct_semaphore *) (*s_objet).objet)).semaphore),
151: (*((struct_semaphore *) (*s_objet).objet)).nom) < 0)
1.1 bertrand 152: {
153: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
154: return(NULL);
155: }
1.69 bertrand 156:
157: # pragma GCC diagnostic pop
158:
1.1 bertrand 159: }
160: else if ((*s_objet).type == SQL)
161: {
162:
163: /*
164: --------------------------------------------------------------------------------
165: Connecteur SQL
166: --------------------------------------------------------------------------------
167: */
168:
169: if (strcmp((*((struct_connecteur_sql *) (*s_objet).objet)).type,
170: "MYSQL") == 0)
171: {
172: # ifdef MYSQL_SUPPORT
1.61 bertrand 173: if (alsprintf(&chaine, "Sql $ %016llX (%s)",
1.63 bertrand 174: (unsigned long long) (*((struct_connecteur_sql *)
1.1 bertrand 175: (*s_objet).objet)).descripteur.mysql,
1.3 bertrand 176: (*((struct_connecteur_sql *) (*s_objet).objet)).type) < 0)
177: {
178: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
179: return(NULL);
180: }
1.1 bertrand 181: # else
182: if ((*s_etat_processus).langue == 'F')
183: {
184: printf("+++Attention : Support de MySQL "
185: "non compilé !\n");
186: }
187: else
188: {
189: printf("+++Warning : MySQL support "
190: "not available !\n");
191: }
192:
193: fflush(stdout);
194: # endif
195: }
196: else if (strcmp((*((struct_connecteur_sql *) (*s_objet).objet)).type,
197: "POSTGRESQL") == 0)
198: {
199: # ifdef POSTGRESQL_SUPPORT
1.61 bertrand 200: if (alsprintf(&chaine, "Sql $ %016llX (%s)",
1.63 bertrand 201: (unsigned long long) (*((struct_connecteur_sql *)
1.9 bertrand 202: (*s_objet).objet)).descripteur.postgresql,
1.3 bertrand 203: (*((struct_connecteur_sql *) (*s_objet).objet)).type) < 0)
204: {
205: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
206: return(NULL);
207: }
1.1 bertrand 208: # else
209: if ((*s_etat_processus).langue == 'F')
210: {
211: printf("+++Attention : Support de PostgreSQL "
212: "non compilé !\n");
213: }
214: else
215: {
216: printf("+++Warning : PostgreSQL support "
217: "not available !\n");
218: }
219:
220: fflush(stdout);
221: # endif
222: }
223: else
224: {
225: BUG(1, printf("SQL type '%s' not allowed!",
226: (*((struct_connecteur_sql *) (*s_objet).objet))
227: .type));
228: }
229: }
230: else if ((*s_objet).type == PRC)
231: {
232:
233: /*
234: --------------------------------------------------------------------------------
235: Processus
236: --------------------------------------------------------------------------------
237: */
238:
239: if ((*(*((struct_processus_fils *) (*s_objet).objet)).thread)
240: .processus_detache == d_vrai)
241: {
1.63 bertrand 242: if (alsprintf(&chaine, "Process $ %016llX", (unsigned long long)
1.1 bertrand 243: (*(*((struct_processus_fils *) (*s_objet).objet)).thread)
1.3 bertrand 244: .pid) < 0)
1.1 bertrand 245: {
246: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
247: return(NULL);
248: }
249: }
250: else
251: {
1.61 bertrand 252: if (alsprintf(&chaine, "Light weight process $ %016llX/%016llX",
1.63 bertrand 253: (unsigned long long) (*(*((struct_processus_fils *)
1.1 bertrand 254: (*s_objet).objet)).thread).pid,
1.63 bertrand 255: (unsigned long long) (*(*((struct_processus_fils *)
1.3 bertrand 256: (*s_objet).objet)).thread).tid) < 0)
1.1 bertrand 257: {
258: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
259: return(NULL);
260: }
261: }
262: }
263: else if ((*s_objet).type == FCH)
264: {
265:
266: /*
267: --------------------------------------------------------------------------------
268: Fichier
269: --------------------------------------------------------------------------------
270: */
271:
1.63 bertrand 272: if (alsprintf(&chaine, "File $ %016llX", (unsigned long long)
1.3 bertrand 273: (*((struct_fichier *) ((*s_objet).objet))).descripteur) < 0)
1.1 bertrand 274: {
275: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
276: return(NULL);
277: }
278:
279: registre45 = test_cfsf(s_etat_processus, 45);
280: cf(s_etat_processus, 45);
281:
282: if ((format = formateur(s_etat_processus, 0, (*((struct_fichier *)
283: ((*s_objet).objet))).format)) == NULL)
284: {
285: return(NULL);
286: }
287:
288: if (registre45 == d_vrai)
289: {
290: sf(s_etat_processus, 45);
291: }
292: else
293: {
294: cf(s_etat_processus, 45);
295: }
296:
297: if ((format_majuscule = conversion_majuscule(format)) == NULL)
298: {
299: return(NULL);
300: }
301:
302: free(format);
303:
304: registre = chaine;
305:
306: if ((chaine = malloc((strlen(registre) + 1 +
307: strlen(format_majuscule) + 1) * sizeof(unsigned char)))
308: == NULL)
309: {
310: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
311: return(NULL);
312: }
313:
314: sprintf(chaine, "%s %s", registre, format_majuscule);
315: free(registre);
316:
317: tampon[0] = d_code_fin_chaine;
318:
319: if ((*((struct_fichier *) ((*s_objet).objet))).acces == 'S')
320: {
321: strcat(tampon, "SEQUENTIAL, ");
322: }
323: else if ((*((struct_fichier *) ((*s_objet).objet))).acces == 'D')
324: {
325: strcat(tampon, "DIRECT, ");
326: }
327: else
328: {
329: strcat(tampon, "KEYED, ");
330: }
331:
332: if ((*((struct_fichier *) ((*s_objet).objet))).binaire == 'N')
333: {
334: strcat(tampon, "FORMATTED, ");
335: }
336: else if ((*((struct_fichier *) ((*s_objet).objet))).binaire == 'Y')
337: {
338: strcat(tampon, "UNFORMATTED, ");
339: }
340: else
341: {
342: strcat(tampon, "FLOW, ");
343: }
344:
345: if ((*((struct_fichier *) ((*s_objet).objet))).ouverture == 'N')
346: {
347: strcat(tampon, "NEW, ");
348: }
349: else if ((*((struct_fichier *) ((*s_objet).objet))).ouverture == 'O')
350: {
351: strcat(tampon, "OLD, ");
352: }
353: else if ((*((struct_fichier *) ((*s_objet).objet))).ouverture == 'R')
354: {
355: strcat(tampon, "REPLACE, ");
356: }
357: else if ((*((struct_fichier *) ((*s_objet).objet))).ouverture == 'U')
358: {
359: strcat(tampon, "UNKNOWN, ");
360: }
361: else
362: {
363: strcat(tampon, "SCRATCH, ");
364: }
365:
366: if ((*((struct_fichier *) ((*s_objet).objet))).protection == 'R')
367: {
368: strcat(tampon, "READONLY");
369: }
370: else if ((*((struct_fichier *) ((*s_objet).objet))).protection == 'W')
371: {
372: strcat(tampon, "WRITEONLY");
373: }
374: else
375: {
376: strcat(tampon, "READWRITE");
377: }
378:
379: registre = chaine;
380:
381: if ((chaine = malloc((strlen(chaine) + 6 + strlen(tampon) +
382: strlen((*((struct_fichier *) ((*s_objet).objet))).nom) + 1) *
383: sizeof(unsigned char))) == NULL)
384: {
385: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
386: return(NULL);
387: }
388:
389: sprintf(chaine, "%s [%s <%s>]", registre, (*((struct_fichier *)
390: ((*s_objet).objet))).nom, tampon);
391: free(registre);
392:
393: free(format_majuscule);
394: }
395: else if ((*s_objet).type == SCK)
396: {
397:
398: /*
399: --------------------------------------------------------------------------------
400: Socket
401: --------------------------------------------------------------------------------
402: */
403:
1.63 bertrand 404: if (alsprintf(&chaine, "Socket $ %016llX", (unsigned long long)
1.59 bertrand 405: (*((struct_socket *) ((*s_objet).objet))).socket) < 0)
1.1 bertrand 406: {
407: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
408: return(NULL);
409: }
410:
411: registre45 = test_cfsf(s_etat_processus, 45);
412: cf(s_etat_processus, 45);
413:
414: if ((format = formateur(s_etat_processus, 0, (*((struct_socket *)
415: ((*s_objet).objet))).format)) == NULL)
416: {
417: return(NULL);
418: }
419:
420: if (registre45 == d_vrai)
421: {
422: sf(s_etat_processus, 45);
423: }
424: else
425: {
426: cf(s_etat_processus, 45);
427: }
428:
429: if ((format_majuscule = conversion_majuscule(format)) == NULL)
430: {
431: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
432: return(NULL);
433: }
434:
435: free(format);
436:
437: registre = chaine;
438:
439: if ((chaine = malloc((strlen(registre) + 1 +
440: strlen(format_majuscule) + 1) * sizeof(unsigned char)))
441: == NULL)
442: {
443: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
444: return(NULL);
445: }
446:
447: sprintf(chaine, "%s %s", registre, format_majuscule);
448: free(registre);
449:
450: tampon[0] = d_code_fin_chaine;
451:
452: strcat(tampon, (*((struct_socket *) ((*s_objet).objet))).type);
453: strcat(tampon, ", ");
454:
455: if ((*((struct_socket *) ((*s_objet).objet))).domaine == PF_UNIX)
456: {
457: strcat(tampon, "UNIX, ");
458: }
459: else if ((*((struct_socket *) ((*s_objet).objet))).domaine == PF_INET)
460: {
461: strcat(tampon, "IPV4, ");
462: }
463: else if ((*((struct_socket *) ((*s_objet).objet))).domaine == PF_INET6)
464: {
465: strcat(tampon, "IPV6, ");
466: }
467:
468: if ((*((struct_socket *) ((*s_objet).objet))).localisation == 'L')
469: {
470: strcat(tampon, "LOCAL, ");
471: }
472: else
473: {
474: strcat(tampon, "FOREIGN, ");
475: }
476:
477: if ((*((struct_socket *) ((*s_objet).objet))).binaire == 'N')
478: {
479: strcat(tampon, "FORMATTED, ");
480: }
481: else if ((*((struct_socket *) ((*s_objet).objet))).binaire == 'Y')
482: {
483: strcat(tampon, "UNFORMATTED, ");
484: }
485: else
486: {
487: strcat(tampon, "FLOW, ");
488: }
489:
490: if ((*((struct_socket *) ((*s_objet).objet))).protection == 'R')
491: {
492: strcat(tampon, "READONLY");
493: }
494: else if ((*((struct_fichier *) ((*s_objet).objet))).protection == 'W')
495: {
496: strcat(tampon, "WRITEONLY");
497: }
498: else
499: {
500: strcat(tampon, "READWRITE");
501: }
502:
503: registre = chaine;
504:
505: if ((*((struct_socket *) ((*s_objet).objet))).localisation == 'L')
506: { // Socket locale
507: if ((strcmp((*((struct_socket *) ((*s_objet).objet))).type,
508: "STREAM") == 0) || (strcmp((*((struct_socket *)
509: ((*s_objet).objet))).type, "SEQUENTIAL DATAGRAM") == 0))
510: {
511: if (strcmp((*((struct_socket *) ((*s_objet).objet)))
512: .adresse_distante, "") == 0)
513: { // Socket connectée en écoute
514: if ((chaine = malloc((strlen(registre) + 16 +
515: strlen(tampon) + strlen((*((struct_socket *)
516: ((*s_objet).objet))).adresse) +
517: + 1) * sizeof(unsigned char))) == NULL)
518: {
519: (*s_etat_processus).erreur_systeme =
520: d_es_allocation_memoire;
521: return(NULL);
522: }
523:
524: sprintf(chaine, "%s [%s LISTENING <%s>]", registre,
525: (*((struct_socket *) ((*s_objet).objet))).adresse,
526: tampon);
527: }
528: else
529: { // Socket connecté
530: if ((chaine = malloc((strlen(registre) + 12 +
531: strlen(tampon) + strlen((*((struct_socket *)
532: ((*s_objet).objet))).adresse) +
533: strlen((*((struct_socket *) ((*s_objet).objet)))
534: .adresse_distante)
535: + 1) * sizeof(unsigned char))) == NULL)
536: {
537: (*s_etat_processus).erreur_systeme =
538: d_es_allocation_memoire;
539: return(NULL);
540: }
541:
542: sprintf(chaine, "%s [%s FROM %s <%s>]", registre,
543: (*((struct_socket *) ((*s_objet).objet))).adresse,
544: (*((struct_socket *) ((*s_objet).objet)))
545: .adresse_distante, tampon);
546: }
547: }
548: else // Socket non connectée
549: {
550: if ((chaine = malloc((strlen(registre) + 6 +
551: strlen(tampon) + strlen((*((struct_socket *)
552: ((*s_objet).objet))).adresse) +
553: + 1) * sizeof(unsigned char))) == NULL)
554: {
555: (*s_etat_processus).erreur_systeme =
556: d_es_allocation_memoire;
557: return(NULL);
558: }
559:
560: sprintf(chaine, "%s [%s <%s>]", registre,
561: (*((struct_socket *) ((*s_objet).objet))).adresse,
562: tampon);
563: }
564: }
565: else
566: { // Socket distante
567: if ((strcmp((*((struct_socket *) ((*s_objet).objet))).type,
568: "STREAM") == 0) || (strcmp((*((struct_socket *)
569: ((*s_objet).objet))).type, "SEQUENTIAL DATAGRAM") == 0))
570: {
571: if ((chaine = malloc((strlen(registre) + 9 +
572: strlen((*((struct_socket *) ((*s_objet).objet)))
573: .adresse) + strlen(tampon)
574: + 1) * sizeof(unsigned char))) == NULL)
575: {
576: (*s_etat_processus).erreur_systeme =
577: d_es_allocation_memoire;
578: return(NULL);
579: }
580:
581: sprintf(chaine, "%s [TO %s <%s>]", registre,
582: (*((struct_socket *) ((*s_objet).objet)))
583: .adresse, tampon);
584: }
585: else
586: {
587: if (strcmp((*((struct_socket *) ((*s_objet).objet)))
588: .adresse_distante, "") == 0)
589: {
590: if ((chaine = malloc((strlen(registre) + 5 +
591: strlen(tampon) + 1) * sizeof(unsigned char)))
592: == NULL)
593: {
594: (*s_etat_processus).erreur_systeme =
595: d_es_allocation_memoire;
596: return(NULL);
597: }
598:
599: sprintf(chaine, "%s [<%s>]", registre, tampon);
600: }
601: else
602: {
603: if ((chaine = malloc((strlen(registre) + 9 +
604: strlen((*((struct_socket *) ((*s_objet).objet)))
605: .adresse_distante) + strlen(tampon)
606: + 1) * sizeof(unsigned char))) == NULL)
607: {
608: (*s_etat_processus).erreur_systeme =
609: d_es_allocation_memoire;
610: return(NULL);
611: }
612:
613: sprintf(chaine, "%s [TO %s <%s>]", registre,
614: (*((struct_socket *) ((*s_objet).objet)))
615: .adresse_distante, tampon);
616: }
617: }
618: }
619:
620: free(registre);
621: free(format_majuscule);
622: }
623: else if ((*s_objet).type == ALG)
624: {
625:
626: /*
627: --------------------------------------------------------------------------------
628: Expression algébrique
629: --------------------------------------------------------------------------------
630: */
631:
632: l_element_courant = (struct_liste_chainee *) (*s_objet).objet;
633:
634: while(l_element_courant != NULL)
635: {
636: if ((*(*l_element_courant).donnee).type == FCT)
637: {
638: if ((strcmp((*((struct_fonction *) (*(*l_element_courant)
639: .donnee).objet)).nom_fonction, "<<") != 0) &&
640: (strcmp((*((struct_fonction *) (*(*l_element_courant)
641: .donnee).objet)).nom_fonction, ">>") != 0))
642: {
643: if ((strcmp((*((struct_fonction *) (*(*l_element_courant)
644: .donnee).objet)).nom_fonction, "+") == 0) ||
645: (strcmp((*((struct_fonction *)
646: (*(*l_element_courant).donnee).objet))
647: .nom_fonction, "-") == 0) || (strcmp(
648: (*((struct_fonction *) (*(*l_element_courant)
649: .donnee).objet)).nom_fonction, "*") == 0) ||
650: (strcmp((*((struct_fonction *)
651: (*(*l_element_courant).donnee).objet)).nom_fonction,
652: "/") == 0) || (strcmp((*((struct_fonction *)
653: (*(*l_element_courant).donnee).objet)).nom_fonction,
654: "^") == 0) || (strcmp((*((struct_fonction *)
655: (*(*l_element_courant).donnee).objet)).nom_fonction,
656: "<") == 0) || (strcmp((*((struct_fonction *)
657: (*(*l_element_courant).donnee).objet)).nom_fonction,
658: ">") == 0) || (strcmp((*((struct_fonction *)
659: (*(*l_element_courant).donnee).objet)).nom_fonction,
660: "==") == 0) || (strcmp((*((struct_fonction *)
661: (*(*l_element_courant).donnee).objet)).nom_fonction,
662: "<>") == 0) || (strcmp((*((struct_fonction *)
663: (*(*l_element_courant).donnee).objet)).nom_fonction,
664: "<=") == 0) || (strcmp((*((struct_fonction *)
665: (*(*l_element_courant).donnee).objet)).nom_fonction,
666: "=<") == 0) || (strcmp((*((struct_fonction *)
667: (*(*l_element_courant).donnee).objet)).nom_fonction,
668: ">=") == 0) || (strcmp((*((struct_fonction *)
669: (*(*l_element_courant).donnee).objet)).nom_fonction,
670: "=>") == 0))
671: {
672: if (depilement(s_etat_processus, &((*s_etat_processus)
673: .l_base_pile), &s_sous_objet_2) == d_erreur)
674: {
675: return(NULL);
676: }
677:
678: chaine_sauvegarde = (*s_etat_processus)
679: .instruction_courante;
680:
681: if (((*s_etat_processus).instruction_courante =
682: (unsigned char *) malloc((strlen(
683: (unsigned char *) (*s_sous_objet_2).objet) + 2
684: + 1) * sizeof(unsigned char))) == NULL)
685: {
686: (*s_etat_processus).instruction_courante =
687: chaine_sauvegarde;
688: (*s_etat_processus).erreur_systeme =
689: d_es_allocation_memoire;
690: return(NULL);
691: }
692:
693: sprintf((*s_etat_processus).instruction_courante,
694: "'%s'", (unsigned char *)
695: (*s_sous_objet_2).objet);
696:
697: presence_signe = (((*s_etat_processus)
698: .instruction_courante[1] == '+')
699: || ((*s_etat_processus).instruction_courante[1]
700: == '-')) ? d_vrai : d_faux;
701:
1.71 ! bertrand 702: (*s_etat_processus).type_en_cours = NON;
1.1 bertrand 703: recherche_type(s_etat_processus);
704:
705: if ((*s_etat_processus).erreur_execution != d_ex)
706: {
707: // Aucune erreur d'exécution ne peut être
708: // retournée, car l'argument est cohérent.
709:
710: return(NULL);
711: }
712:
713: if (depilement(s_etat_processus, &((*s_etat_processus)
714: .l_base_pile), &s_sous_objet_3) == d_erreur)
715: {
716: return(NULL);
717: }
718:
719: free((*s_etat_processus).instruction_courante);
720:
721: (*s_etat_processus).instruction_courante =
722: chaine_sauvegarde;
723:
724: autorisation_parenthese = d_faux;
725:
726: if ((*s_sous_objet_3).type == ALG)
727: {
728: l_atome = (struct_liste_chainee *)
729: (*s_sous_objet_3).objet;
730: chaine_fonction = "";
731: nombre_arguments_fonction = 0;
732:
733: while(l_atome != NULL)
734: {
735: if ((*(*l_atome).donnee).type == FCT)
736: {
737: if (strcmp((*((struct_fonction *)
738: (*(*l_atome).donnee).objet))
739: .nom_fonction, ">>") != 0)
740: {
741: chaine_fonction = (*((struct_fonction *)
742: (*(*l_atome).donnee).objet))
743: .nom_fonction;
744: nombre_arguments_fonction =
745: (*((struct_fonction *)
746: (*(*l_atome).donnee).objet))
747: .nombre_arguments;
748: }
749: }
750:
751: l_atome = (*l_atome).suivant;
752: }
753:
754: if (strcmp((*((struct_fonction *)
755: (*(*l_element_courant).donnee).objet))
756: .nom_fonction, "+") == 0)
757: {
758: if ((strcmp(chaine_fonction, "AND") == 0) ||
759: (strcmp(chaine_fonction, "XOR") == 0) ||
760: (strcmp(chaine_fonction, "OR") == 0))
761: {
762: autorisation_parenthese = d_vrai;
763: }
764: }
765: else if (strcmp((*((struct_fonction *)
766: (*(*l_element_courant).donnee).objet))
767: .nom_fonction, "-") == 0)
768: {
769: if (nombre_arguments_fonction != 0)
770: {
771: autorisation_parenthese = d_faux;
772: }
773: else
774: {
775: autorisation_parenthese = d_vrai;
776: }
777: }
778: else if (strcmp((*((struct_fonction *)
779: (*(*l_element_courant).donnee).objet))
780: .nom_fonction, "*") == 0)
781: {
782: if ((strcmp(chaine_fonction, "+") == 0) ||
783: (strcmp(chaine_fonction, "-") == 0) ||
784: (strcmp(chaine_fonction, "AND") == 0) ||
785: (strcmp(chaine_fonction, "XOR") == 0) ||
786: (strcmp(chaine_fonction, "OR") == 0))
787: {
788: autorisation_parenthese = d_vrai;
789: }
790: }
791: else if (strcmp((*((struct_fonction *)
792: (*(*l_element_courant).donnee).objet))
793: .nom_fonction, "/") == 0)
794: {
795: if (nombre_arguments_fonction != 0)
796: {
797: autorisation_parenthese = d_faux;
798: }
799: else
800: {
801: autorisation_parenthese = d_vrai;
802: }
803: }
804: else if ((strcmp((*((struct_fonction *)
805: (*(*l_element_courant).donnee).objet))
806: .nom_fonction, "^") == 0))
807: {
808: if (nombre_arguments_fonction != 0)
809: {
810: autorisation_parenthese = d_faux;
811: }
812: else
813: {
814: autorisation_parenthese = d_vrai;
815: }
816: }
817: }
818:
819: if ((autorisation_parenthese == d_vrai) ||
820: (presence_signe == d_vrai))
821: {
822: chaine_sauvegarde = (unsigned char *)
823: (*s_sous_objet_2).objet;
824:
1.58 bertrand 825: if (((*s_sous_objet_2).objet =
1.1 bertrand 826: malloc((strlen(chaine_sauvegarde) + 2 + 1)
827: * sizeof(unsigned char))) == NULL)
828: {
829: (*s_etat_processus).erreur_systeme =
830: d_es_allocation_memoire;
831: return(NULL);
832: }
833:
834: sprintf((unsigned char *) (*s_sous_objet_2).objet,
835: "(%s)", chaine_sauvegarde);
836: free(chaine_sauvegarde);
837: }
838:
839: liberation(s_etat_processus, s_sous_objet_3);
840:
841: if (depilement(s_etat_processus, &((*s_etat_processus)
842: .l_base_pile), &s_sous_objet_1) == d_erreur)
843: {
844: return(NULL);
845: }
846:
847: chaine_sauvegarde = (*s_etat_processus)
848: .instruction_courante;
849:
850: if (((*s_etat_processus).instruction_courante =
851: (unsigned char *) malloc((strlen(
852: (unsigned char *) (*s_sous_objet_1).objet) + 2
853: + 1) * sizeof(unsigned char))) == NULL)
854: {
855: (*s_etat_processus).instruction_courante =
856: chaine_sauvegarde;
857: (*s_etat_processus).erreur_systeme =
858: d_es_allocation_memoire;
859: return(NULL);
860: }
861:
862: sprintf((*s_etat_processus).instruction_courante,
863: "'%s'", (unsigned char *)
864: (*s_sous_objet_1).objet);
865:
1.71 ! bertrand 866: (*s_etat_processus).type_en_cours = NON;
1.1 bertrand 867: recherche_type(s_etat_processus);
868:
869: if ((*s_etat_processus).erreur_execution != d_ex)
870: {
871: // Aucune erreur d'exécution ne peut être
872: // retournée, car l'argument est cohérent.
873:
874: return(NULL);
875: }
876:
877: if (depilement(s_etat_processus, &((*s_etat_processus)
878: .l_base_pile), &s_sous_objet_3) == d_erreur)
879: {
880: return(NULL);
881: }
882:
883: free((*s_etat_processus).instruction_courante);
884:
885: (*s_etat_processus).instruction_courante =
886: chaine_sauvegarde;
887:
888: autorisation_parenthese = d_faux;
889:
890: if ((*s_sous_objet_3).type == ALG)
891: {
892: l_atome = (struct_liste_chainee *)
893: (*s_sous_objet_3).objet;
894: chaine_fonction = "";
895:
896: while(l_atome != NULL)
897: {
898: if ((*(*l_atome).donnee).type == FCT)
899: {
900: if (strcmp((*((struct_fonction *)
901: (*(*l_atome).donnee).objet))
902: .nom_fonction, ">>") != 0)
903: {
904: chaine_fonction = (*((struct_fonction *)
905: (*(*l_atome).donnee).objet))
906: .nom_fonction;
907: }
908: }
909:
910: l_atome = (*l_atome).suivant;
911: }
912:
913: if ((strcmp((*((struct_fonction *)
914: (*(*l_element_courant).donnee).objet))
915: .nom_fonction, "+") == 0) ||
916: (strcmp((*((struct_fonction *)
917: (*(*l_element_courant).donnee).objet))
918: .nom_fonction, "-") == 0))
919: {
920: if ((strcmp(chaine_fonction, "AND") == 0) ||
921: (strcmp(chaine_fonction, "XOR") == 0) ||
922: (strcmp(chaine_fonction, "OR") == 0))
923: {
924: autorisation_parenthese = d_vrai;
925: }
926: }
927: else if ((strcmp((*((struct_fonction *)
928: (*(*l_element_courant).donnee).objet))
929: .nom_fonction, "*") == 0) ||
930: (strcmp((*((struct_fonction *)
931: (*(*l_element_courant).donnee).objet))
932: .nom_fonction, "/") == 0))
933: {
934: if ((strcmp(chaine_fonction, "+") == 0) ||
935: (strcmp(chaine_fonction, "-") == 0) ||
936: (strcmp(chaine_fonction, "AND") == 0) ||
937: (strcmp(chaine_fonction, "XOR") == 0) ||
938: (strcmp(chaine_fonction, "OR") == 0))
939: {
940: autorisation_parenthese = d_vrai;
941: }
942: }
943: else if ((strcmp((*((struct_fonction *)
944: (*(*l_element_courant).donnee).objet))
945: .nom_fonction, "^") == 0))
946: {
947: autorisation_parenthese = d_vrai;
948: }
949: }
950:
951: if (autorisation_parenthese == d_vrai)
952: {
953: chaine_sauvegarde = (unsigned char *)
954: (*s_sous_objet_1).objet;
955:
1.58 bertrand 956: if (((*s_sous_objet_1).objet =
1.1 bertrand 957: malloc((strlen(chaine_sauvegarde) + 2 + 1)
958: * sizeof(unsigned char))) == NULL)
959: {
960: (*s_etat_processus).erreur_systeme =
961: d_es_allocation_memoire;
962: return(NULL);
963: }
964:
965: sprintf((unsigned char *) (*s_sous_objet_1).objet,
966: "(%s)", chaine_sauvegarde);
967: free(chaine_sauvegarde);
968: }
969:
970: liberation(s_etat_processus, s_sous_objet_3);
971:
972: if ((s_sous_objet = allocation(s_etat_processus, CHN))
973: == NULL)
974: {
975: (*s_etat_processus).erreur_systeme =
976: d_es_allocation_memoire;
977: return(NULL);
978: }
979:
1.58 bertrand 980: if (((*s_sous_objet).objet = malloc((strlen(
1.1 bertrand 981: (unsigned char *) (*s_sous_objet_1).objet) +
982: strlen((*((struct_fonction *)
983: (*(*l_element_courant).donnee).objet))
984: .nom_fonction) + strlen((unsigned char *)
985: (*s_sous_objet_2).objet) + 1) *
986: sizeof(unsigned char))) == NULL)
987: {
988: (*s_etat_processus).erreur_systeme =
989: d_es_allocation_memoire;
990: return(NULL);
991: }
992:
993: sprintf((unsigned char *) (*s_sous_objet).objet,
994: "%s%s%s", (unsigned char *)
995: (*s_sous_objet_1)
996: .objet, (*((struct_fonction *)
997: (*(*l_element_courant).donnee).objet))
998: .nom_fonction, (unsigned char *)
999: (*s_sous_objet_2).objet);
1000:
1001: liberation(s_etat_processus, s_sous_objet_1);
1002: liberation(s_etat_processus, s_sous_objet_2);
1003:
1004: if (empilement(s_etat_processus, &((*s_etat_processus)
1005: .l_base_pile), s_sous_objet) == d_erreur)
1006: {
1007: return(NULL);
1008: }
1009: }
1010: else if (strcmp((*((struct_fonction *)
1011: (*(*l_element_courant).donnee).objet)).nom_fonction,
1012: "=") == 0)
1013: {
1014: if (depilement(s_etat_processus, &((*s_etat_processus)
1015: .l_base_pile), &s_sous_objet_2) == d_erreur)
1016: {
1017: return(NULL);
1018: }
1019:
1020: if (depilement(s_etat_processus, &((*s_etat_processus)
1021: .l_base_pile), &s_sous_objet_1) == d_erreur)
1022: {
1023: return(NULL);
1024: }
1025:
1026: if ((s_sous_objet = allocation(s_etat_processus, CHN))
1027: == NULL)
1028: {
1029: (*s_etat_processus).erreur_systeme =
1030: d_es_allocation_memoire;
1031: return(NULL);
1032: }
1033:
1034: autorisation_parenthese = d_vrai;
1035: l_atome = l_element_courant;
1036:
1037: if (l_atome != NULL)
1038: {
1039: if ((*l_atome).suivant != NULL)
1040: {
1041: l_atome = (*l_atome).suivant;
1042:
1043: if ((*(*l_atome).donnee).type == FCT)
1044: {
1045: if (strcmp((*((struct_fonction *)
1046: (*(*l_atome).donnee).objet))
1047: .nom_fonction, ">>") == 0)
1048: {
1049: if ((*l_atome).suivant == NULL)
1050: {
1051: autorisation_parenthese = d_faux;
1052: }
1053: }
1054: }
1055: }
1056: }
1057:
1058: if (autorisation_parenthese == d_vrai)
1059: {
1060: if (((*s_sous_objet).objet =
1.58 bertrand 1061: malloc((strlen(
1.1 bertrand 1062: (unsigned char *) (*s_sous_objet_1).objet) +
1063: strlen((*((struct_fonction *)
1064: (*(*l_element_courant).donnee).objet))
1065: .nom_fonction) + strlen((unsigned char *)
1066: (*s_sous_objet_2).objet) + 2 + 1) *
1067: sizeof(unsigned char))) == NULL)
1068: {
1069: (*s_etat_processus).erreur_systeme =
1070: d_es_allocation_memoire;
1071: return(NULL);
1072: }
1073:
1074: sprintf((unsigned char *) (*s_sous_objet).objet,
1075: "(%s%s%s)", (unsigned char *)
1076: (*s_sous_objet_1)
1077: .objet, (*((struct_fonction *)
1078: (*(*l_element_courant).donnee).objet))
1079: .nom_fonction, (unsigned char *)
1080: (*s_sous_objet_2).objet);
1081: }
1082: else
1083: {
1084: if (((*s_sous_objet).objet =
1.58 bertrand 1085: malloc((strlen(
1.1 bertrand 1086: (unsigned char *) (*s_sous_objet_1).objet) +
1087: strlen((*((struct_fonction *)
1088: (*(*l_element_courant).donnee).objet))
1089: .nom_fonction) + strlen((unsigned char *)
1090: (*s_sous_objet_2).objet) + 1) *
1091: sizeof(unsigned char))) == NULL)
1092: {
1093: (*s_etat_processus).erreur_systeme =
1094: d_es_allocation_memoire;
1095: return(NULL);
1096: }
1097:
1098: sprintf((unsigned char *) (*s_sous_objet).objet,
1099: "%s%s%s", (unsigned char *)
1100: (*s_sous_objet_1)
1101: .objet, (*((struct_fonction *)
1102: (*(*l_element_courant).donnee).objet))
1103: .nom_fonction, (unsigned char *)
1104: (*s_sous_objet_2).objet);
1105: }
1106:
1107: liberation(s_etat_processus, s_sous_objet_1);
1108: liberation(s_etat_processus, s_sous_objet_2);
1109:
1110: if (empilement(s_etat_processus, &((*s_etat_processus)
1111: .l_base_pile), s_sous_objet) == d_erreur)
1112: {
1113: return(NULL);
1114: }
1115: }
1116: else if (strcmp((*((struct_fonction *)
1117: (*(*l_element_courant).donnee).objet)).nom_fonction,
1118: "NOT") == 0)
1119: {
1120: if (depilement(s_etat_processus, &((*s_etat_processus)
1121: .l_base_pile), &s_sous_objet_1) == d_erreur)
1122: {
1123: return(NULL);
1124: }
1125:
1126: if ((s_sous_objet = allocation(s_etat_processus, CHN))
1127: == NULL)
1128: {
1129: (*s_etat_processus).erreur_systeme =
1130: d_es_allocation_memoire;
1131: return(NULL);
1132: }
1133:
1134: if (((*s_sous_objet).objet = (unsigned char *) malloc(
1135: (strlen((unsigned char *) (*s_sous_objet_1)
1136: .objet) + 5 + 1) * sizeof(unsigned char))) ==
1137: NULL)
1138: {
1139: (*s_etat_processus).erreur_systeme =
1140: d_es_allocation_memoire;
1141: return(NULL);
1142: }
1143:
1144: sprintf((unsigned char *) (*s_sous_objet).objet,
1145: "%s(%s)", (*((struct_fonction *)
1146: (*(*l_element_courant).donnee).objet))
1147: .nom_fonction, (unsigned char *)
1148: (*s_sous_objet_1).objet );
1149:
1150: liberation(s_etat_processus, s_sous_objet_1);
1151:
1152: if (empilement(s_etat_processus, &((*s_etat_processus)
1153: .l_base_pile), s_sous_objet) == d_erreur)
1154: {
1155: return(NULL);
1156: }
1157: }
1158: else if ((strcmp((*((struct_fonction *)
1159: (*(*l_element_courant).donnee).objet)).nom_fonction,
1160: "OR") == 0) || (strcmp((*((struct_fonction *)
1161: (*(*l_element_courant).donnee).objet)).nom_fonction,
1162: "XOR") == 0) || (strcmp((*((struct_fonction *)
1163: (*(*l_element_courant).donnee).objet)).nom_fonction,
1164: "AND") == 0))
1165: {
1166: if (depilement(s_etat_processus, &((*s_etat_processus)
1167: .l_base_pile), &s_sous_objet_2) == d_erreur)
1168: {
1169: return(NULL);
1170: }
1171:
1172: if (depilement(s_etat_processus, &((*s_etat_processus)
1173: .l_base_pile), &s_sous_objet_1) == d_erreur)
1174: {
1175: return(NULL);
1176: }
1177:
1178: if ((s_sous_objet = allocation(s_etat_processus, CHN))
1179: == NULL)
1180: {
1181: (*s_etat_processus).erreur_systeme =
1182: d_es_allocation_memoire;
1183: return(NULL);
1184: }
1185:
1186: parentheses_groupe_gauche = 0;
1187: parentheses_groupe_droit = 0;
1188:
1189: chaine_sauvegarde = (*s_etat_processus)
1190: .instruction_courante;
1191:
1192: if (((*s_etat_processus).instruction_courante =
1193: (unsigned char *) malloc((strlen(
1194: (unsigned char *) (*s_sous_objet_1).objet) + 2
1195: + 1) * sizeof(unsigned char))) == NULL)
1196: {
1197: (*s_etat_processus).instruction_courante =
1198: chaine_sauvegarde;
1199: (*s_etat_processus).erreur_systeme =
1200: d_es_allocation_memoire;
1201: return(NULL);
1202: }
1203:
1204: sprintf((*s_etat_processus).instruction_courante,
1205: "'%s'", (unsigned char *)
1206: (*s_sous_objet_1).objet);
1207:
1.71 ! bertrand 1208: (*s_etat_processus).type_en_cours = NON;
1.1 bertrand 1209: recherche_type(s_etat_processus);
1210:
1211: if ((*s_etat_processus).erreur_execution != d_ex)
1212: {
1213: // Aucune erreur d'exécution ne peut être
1214: // retournée, car l'argument est cohérent.
1215:
1216: return(NULL);
1217: }
1218:
1219: if (depilement(s_etat_processus, &((*s_etat_processus)
1220: .l_base_pile), &s_sous_objet_3) == d_erreur)
1221: {
1222: return(NULL);
1223: }
1224:
1225: free((*s_etat_processus).instruction_courante);
1226:
1227: (*s_etat_processus).instruction_courante =
1228: chaine_sauvegarde;
1229:
1230: if ((*s_sous_objet_3).type == ALG)
1231: {
1232: l_atome = (struct_liste_chainee *)
1233: (*s_sous_objet_3).objet;
1234: chaine_fonction = "";
1235:
1236: while(l_atome != NULL)
1237: {
1238: if ((*(*l_atome).donnee).type == FCT)
1239: {
1240: if (strcmp((*((struct_fonction *)
1241: (*(*l_atome).donnee).objet))
1242: .nom_fonction, ">>") != 0)
1243: {
1244: chaine_fonction = (*((struct_fonction *)
1245: (*(*l_atome).donnee).objet))
1246: .nom_fonction;
1247: }
1248: }
1249:
1250: l_atome = (*l_atome).suivant;
1251: }
1252:
1253: if (((strcmp(chaine_fonction, "OR") == 0) ||
1254: (strcmp(chaine_fonction, "XOR") == 0)) &&
1255: (strcmp((*((struct_fonction *)
1256: (*(*l_element_courant).donnee).objet))
1257: .nom_fonction, "AND") == 0))
1258: {
1259: parentheses_groupe_gauche = 2;
1260: }
1261: }
1262:
1263: liberation(s_etat_processus, s_sous_objet_3);
1264:
1265: chaine_sauvegarde = (*s_etat_processus)
1266: .instruction_courante;
1267:
1268: if (((*s_etat_processus).instruction_courante =
1269: (unsigned char *) malloc((strlen(
1270: (unsigned char *) (*s_sous_objet_2).objet) + 2
1271: + 1) * sizeof(unsigned char))) == NULL)
1272: {
1273: (*s_etat_processus).instruction_courante =
1274: chaine_sauvegarde;
1275: (*s_etat_processus).erreur_systeme =
1276: d_es_allocation_memoire;
1277: return(NULL);
1278: }
1279:
1280: sprintf((*s_etat_processus).instruction_courante,
1281: "'%s'", (unsigned char *)
1282: (*s_sous_objet_2).objet);
1283:
1.71 ! bertrand 1284: (*s_etat_processus).type_en_cours = NON;
1.1 bertrand 1285: recherche_type(s_etat_processus);
1286:
1287: if ((*s_etat_processus).erreur_execution != d_ex)
1288: {
1289: // Aucune erreur d'exécution ne peut être
1290: // retournée, car l'argument est cohérent.
1291:
1292: return(NULL);
1293: }
1294:
1295: if (depilement(s_etat_processus, &((*s_etat_processus)
1296: .l_base_pile), &s_sous_objet_3) == d_erreur)
1297: {
1298: return(NULL);
1299: }
1300:
1301: free((*s_etat_processus).instruction_courante);
1302:
1303: (*s_etat_processus).instruction_courante =
1304: chaine_sauvegarde;
1305:
1306: if ((*s_sous_objet_3).type == ALG)
1307: {
1308: l_atome = (struct_liste_chainee *)
1309: (*s_sous_objet_3).objet;
1310: chaine_fonction = "";
1311:
1312: while(l_atome != NULL)
1313: {
1314: if ((*(*l_atome).donnee).type == FCT)
1315: {
1316: if (strcmp((*((struct_fonction *)
1317: (*(*l_atome).donnee).objet))
1318: .nom_fonction, ">>") != 0)
1319: {
1320: chaine_fonction = (*((struct_fonction *)
1321: (*(*l_atome).donnee).objet))
1322: .nom_fonction;
1323: }
1324: }
1325:
1326: l_atome = (*l_atome).suivant;
1327: }
1328:
1329: if (((strcmp(chaine_fonction, "OR") == 0) ||
1330: (strcmp(chaine_fonction, "XOR") == 0)) &&
1331: (strcmp((*((struct_fonction *)
1332: (*(*l_element_courant).donnee).objet))
1333: .nom_fonction, "AND") == 0))
1334: {
1335: parentheses_groupe_droit = 2;
1336: }
1337: }
1338:
1339: liberation(s_etat_processus, s_sous_objet_3);
1340:
1.58 bertrand 1341: if (((*s_sous_objet).objet = malloc((strlen(
1.1 bertrand 1342: (unsigned char *) (*s_sous_objet_1).objet) +
1343: strlen((*((struct_fonction *)
1344: (*(*l_element_courant).donnee).objet))
1345: .nom_fonction) + strlen((unsigned char *)
1346: (*s_sous_objet_2).objet) + 2 + 1 +
1.58 bertrand 1347: ((size_t) parentheses_groupe_gauche) +
1348: ((size_t) parentheses_groupe_droit)) *
1.1 bertrand 1349: sizeof(unsigned char))) == NULL)
1350: {
1351: (*s_etat_processus).erreur_systeme =
1352: d_es_allocation_memoire;
1353: return(NULL);
1354: }
1355:
1356: sprintf((unsigned char *) (*s_sous_objet).objet,
1357: (parentheses_groupe_gauche == 0)
1358: ? ((parentheses_groupe_droit == 0)
1359: ? "%s %s %s"
1360: : "%s %s (%s)")
1361: : ((parentheses_groupe_droit == 0)
1362: ? "(%s) %s %s"
1363: : "(%s) %s (%s)"),
1364: (unsigned char *) (*s_sous_objet_1)
1365: .objet, (*((struct_fonction *)
1366: (*(*l_element_courant).donnee).objet))
1367: .nom_fonction, (unsigned char *)
1368: (*s_sous_objet_2).objet);
1369:
1370: liberation(s_etat_processus, s_sous_objet_1);
1371: liberation(s_etat_processus, s_sous_objet_2);
1372:
1373: if (empilement(s_etat_processus, &((*s_etat_processus)
1374: .l_base_pile), s_sous_objet) == d_erreur)
1375: {
1376: (*s_etat_processus).erreur_systeme =
1377: d_es_allocation_memoire;
1378: return(NULL);
1379: }
1380: }
1381: else
1382: {
1383: nombre_arguments = (*((struct_fonction *)
1384: (*(*l_element_courant).donnee).objet))
1385: .nombre_arguments;
1386:
1387: if ((chaine = (unsigned char *)
1388: malloc(sizeof(unsigned char))) == NULL)
1389: {
1390: (*s_etat_processus).erreur_systeme =
1391: d_es_allocation_memoire;
1392: return(NULL);
1393: }
1394:
1395: chaine[0] = d_code_fin_chaine;
1396:
1397: for(i = 0; i < nombre_arguments; i++)
1398: {
1399: if ((nombre_arguments - i) > 1)
1400: {
1401: l_liste1 = (*s_etat_processus).l_base_pile;
1402:
1403: for(j = 2; j < (nombre_arguments - i); j++)
1404: {
1405: l_liste1 = (*l_liste1).suivant;
1406: }
1407:
1408: l_liste2 = (*l_liste1).suivant;
1409: (*l_liste1).suivant = (*l_liste2).suivant;
1410: (*l_liste2).suivant = (*s_etat_processus)
1411: .l_base_pile;
1412: (*s_etat_processus).l_base_pile = l_liste2;
1413: }
1414:
1415: if (depilement(s_etat_processus,
1416: &((*s_etat_processus).l_base_pile),
1417: &s_sous_objet) == d_erreur)
1418: {
1419: return(NULL);
1420: }
1421:
1422: chaine_sauvegarde = chaine;
1423:
1424: if (strlen(chaine_sauvegarde) == 0)
1425: {
1426: if ((chaine = (unsigned char *) malloc((strlen(
1427: (unsigned char *) (*s_sous_objet).objet)
1428: + 1) * sizeof(unsigned char))) == NULL)
1429: {
1430: (*s_etat_processus).erreur_systeme =
1431: d_es_allocation_memoire;
1432: return(NULL);
1433: }
1434:
1435: sprintf(chaine, "%s", (unsigned char *)
1436: (*s_sous_objet).objet);
1437: }
1438: else
1439: {
1440: if ((chaine = (unsigned char *) malloc((strlen(
1441: chaine_sauvegarde) + 1 + strlen(
1442: (unsigned char *) (*s_sous_objet).objet)
1443: + 1) * sizeof(unsigned char))) == NULL)
1444: {
1445: (*s_etat_processus).erreur_systeme =
1446: d_es_allocation_memoire;
1447: return(NULL);
1448: }
1449:
1450: sprintf(chaine, "%s,%s", chaine_sauvegarde,
1451: (unsigned char *) (*s_sous_objet)
1452: .objet);
1453: }
1454:
1455: free(chaine_sauvegarde);
1456: liberation(s_etat_processus, s_sous_objet);
1457: }
1458:
1459: chaine_sauvegarde = chaine;
1460:
1461: if ((chaine = (unsigned char *) malloc((strlen(
1462: (*((struct_fonction *) (*(*l_element_courant)
1463: .donnee).objet)).nom_fonction) + 2 +
1464: strlen(chaine_sauvegarde) + 1) *
1465: sizeof(unsigned char))) == NULL)
1466: {
1467: (*s_etat_processus).erreur_systeme =
1468: d_es_allocation_memoire;
1469: return(NULL);
1470: }
1471:
1472: sprintf(chaine, "%s(%s)", (*((struct_fonction *)
1473: (*(*l_element_courant).donnee).objet))
1474: .nom_fonction, chaine_sauvegarde);
1475: free(chaine_sauvegarde);
1476:
1477: if ((s_sous_objet = allocation(s_etat_processus, CHN))
1478: == NULL)
1479: {
1480: (*s_etat_processus).erreur_systeme =
1481: d_es_allocation_memoire;
1482: return(NULL);
1483: }
1484:
1.58 bertrand 1485: (*s_sous_objet).objet = chaine;
1.1 bertrand 1486:
1487: if (empilement(s_etat_processus, &((*s_etat_processus)
1488: .l_base_pile), s_sous_objet) == d_erreur)
1489: {
1490: return(NULL);
1491: }
1492: }
1493: }
1494: }
1495: else
1496: {
1497: if ((s_sous_objet = allocation(s_etat_processus, CHN))
1498: == NULL)
1499: {
1500: (*s_etat_processus).erreur_systeme =
1501: d_es_allocation_memoire;
1502: return(NULL);
1503: }
1504:
1.58 bertrand 1505: if (((*s_sous_objet).objet = formateur(
1.1 bertrand 1506: s_etat_processus, 0, (*l_element_courant).donnee))
1507: == NULL)
1508: {
1509: (*s_etat_processus).erreur_systeme =
1510: d_es_allocation_memoire;
1511: return(NULL);
1512: }
1513:
1514: if (((*(*l_element_courant).donnee).type == ALG)
1515: || (((*(*l_element_courant).donnee).type == NOM)
1516: && ((*((struct_nom *) (*(*l_element_courant)
1517: .donnee).objet)).symbole == d_vrai)))
1518: {
1519: chaine_sauvegarde = (unsigned char *) (*s_sous_objet).objet;
1520:
1521: if (((*s_sous_objet).objet = malloc((strlen(
1522: chaine_sauvegarde) - 1) *
1523: sizeof(unsigned char))) == NULL)
1524: {
1525: (*s_etat_processus).erreur_systeme =
1526: d_es_allocation_memoire;
1527: return(NULL);
1528: }
1529:
1530: ptrl = chaine_sauvegarde;
1531: ptre = (unsigned char *) (*s_sous_objet).objet;
1532:
1.58 bertrand 1533: for(ptrl++, i = ((integer8) strlen(chaine_sauvegarde)) - 2;
1534: i > 0; i--, *ptre++ = *ptrl++);
1.1 bertrand 1535:
1536: (*ptre) = d_code_fin_chaine;
1537:
1538: free(chaine_sauvegarde);
1539: }
1540: else if ((*(*l_element_courant).donnee).type == CHN)
1541: {
1542: chaine_sauvegarde = (unsigned char *) (*s_sous_objet).objet;
1543:
1544: if (((*s_sous_objet).objet = malloc((strlen(
1545: chaine_sauvegarde) + 3) *
1546: sizeof(unsigned char))) == NULL)
1547: {
1548: (*s_etat_processus).erreur_systeme =
1549: d_es_allocation_memoire;
1550: return(NULL);
1551: }
1552:
1553: sprintf((unsigned char *) (*s_sous_objet).objet,
1554: "\"%s\"", chaine_sauvegarde);
1555:
1556: free(chaine_sauvegarde);
1557: }
1558:
1559: if (empilement(s_etat_processus, &((*s_etat_processus)
1560: .l_base_pile), s_sous_objet) == d_erreur)
1561: {
1562: return(NULL);
1563: }
1564: }
1565:
1566: l_element_courant = (*l_element_courant).suivant;
1567: }
1568:
1569: if (depilement(s_etat_processus, &((*s_etat_processus).l_base_pile),
1570: &s_sous_objet) == d_erreur)
1571: {
1572: return(NULL);
1573: }
1574:
1575: if ((chaine = (unsigned char *) malloc((strlen((unsigned char *)
1576: (*s_sous_objet).objet) + 2 + 1) * sizeof(unsigned char)))
1577: == NULL)
1578: {
1579: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
1580: return(NULL);
1581: }
1582:
1583: sprintf(chaine, "'%s'", (unsigned char *) (*s_sous_objet).objet);
1584: liberation(s_etat_processus, s_sous_objet);
1585: }
1586: else if ((*s_objet).type == BIN)
1587: {
1588:
1589: /*
1590: --------------------------------------------------------------------------------
1591: Entier binaire en base 2, 8, 10 ou 16
1592: --------------------------------------------------------------------------------
1593: */
1594:
1595: masque_binaire = masque_entiers_binaires(s_etat_processus);
1596:
1597: if ((test_cfsf(s_etat_processus, 43) == d_faux) &&
1598: (test_cfsf(s_etat_processus, 44) == d_faux))
1599: {
1600:
1601: /*
1602: -- Base décimale ---------------------------------------------------------------
1603: */
1604:
1.63 bertrand 1605: sprintf(tampon, "%llu", (*((unsigned long long *)
1.1 bertrand 1606: ((*s_objet).objet))) & masque_binaire);
1607: strcpy(base, "d");
1608: }
1609: else if ((test_cfsf(s_etat_processus, 43) == d_vrai) &&
1610: (test_cfsf(s_etat_processus, 44) == d_faux))
1611: {
1612:
1613: /*
1614: -- Base octale -----------------------------------------------------------------
1615: */
1616:
1.63 bertrand 1617: sprintf(tampon, "%llo", (*((unsigned long long *)
1.1 bertrand 1618: ((*s_objet).objet))) & masque_binaire);
1619: strcpy(base, "o");
1620: }
1621: else if (test_cfsf(s_etat_processus, 44) == d_vrai)
1622: {
1623:
1624: /*
1625: -- Bases hexadécimale et binaire -----------------------------------------------
1626: */
1627:
1.63 bertrand 1628: sprintf(tampon, "%llX", (*((unsigned long long *)
1.1 bertrand 1629: ((*s_objet).objet))) & masque_binaire);
1630:
1631: if (test_cfsf(s_etat_processus, 43) == d_vrai)
1632: {
1633: strcpy(base, "h");
1634: }
1635: else
1636: {
1637: chaine = (unsigned char *) malloc((strlen(tampon) + 1)
1638: * sizeof(unsigned char));
1639:
1640: if (chaine == NULL)
1641: {
1642: (*s_etat_processus).erreur_systeme =
1643: d_es_allocation_memoire;
1644: return(NULL);
1645: }
1646:
1647: strcpy(chaine, tampon);
1648: tampon[0] = 0;
1649:
1.58 bertrand 1650: for(i = 0; i < (integer8) strlen(chaine); i++)
1.1 bertrand 1651: {
1652: switch(chaine[i])
1653: {
1654: case '0' :
1655: {
1656: strcat(tampon, (i != 0) ? "0000" : "0");
1657: break;
1658: }
1659: case '1' :
1660: {
1661: strcat(tampon, (i != 0) ? "0001" : "1");
1662: break;
1663: }
1664: case '2' :
1665: {
1666: strcat(tampon, (i != 0) ? "0010" : "10");
1667: break;
1668: }
1669: case '3' :
1670: {
1671: strcat(tampon, (i != 0) ? "0011" : "11");
1672: break;
1673: }
1674: case '4' :
1675: {
1676: strcat(tampon, (i != 0) ? "0100" : "100");
1677: break;
1678: }
1679: case '5' :
1680: {
1681: strcat(tampon, (i != 0) ? "0101" : "101");
1682: break;
1683: }
1684: case '6' :
1685: {
1686: strcat(tampon, (i != 0) ? "0110" : "110");
1687: break;
1688: }
1689: case '7' :
1690: {
1691: strcat(tampon, (i != 0) ? "0111" : "111");
1692: break;
1693: }
1694: case '8' :
1695: {
1696: strcat(tampon, "1000");
1697: break;
1698: }
1699: case '9' :
1700: {
1701: strcat(tampon, "1001");
1702: break;
1703: }
1704: case 'A' :
1705: {
1706: strcat(tampon, "1010");
1707: break;
1708: }
1709: case 'B' :
1710: {
1711: strcat(tampon, "1011");
1712: break;
1713: }
1714: case 'C' :
1715: {
1716: strcat(tampon, "1100");
1717: break;
1718: }
1719: case 'D' :
1720: {
1721: strcat(tampon, "1101");
1722: break;
1723: }
1724: case 'E' :
1725: {
1726: strcat(tampon, "1110");
1727: break;
1728: }
1729: case 'F' :
1730: {
1731: strcat(tampon, "1111");
1732: break;
1733: }
1734: }
1735: }
1736:
1737: free(chaine);
1738: strcpy(base, "b");
1739: }
1740: }
1741:
1742: chaine = (unsigned char *) malloc((strlen(tampon) + 4)
1743: * sizeof(unsigned char));
1744:
1745: if (chaine == NULL)
1746: {
1747: (*s_etat_processus).erreur_systeme =
1748: d_es_allocation_memoire;
1749: return(NULL);
1750: }
1751:
1752: strcpy(chaine, "# ");
1753:
1754: strcat(chaine, tampon);
1755: strcat(chaine, base);
1756: }
1757: else if ((*s_objet).type == CHN)
1758: {
1759:
1760: /*
1761: --------------------------------------------------------------------------------
1762: Chaîne de caractères
1763: --------------------------------------------------------------------------------
1764: */
1765:
1.23 bertrand 1766: if (((*s_etat_processus).autorisation_conversion_chaine == 'Y') &&
1767: (test_cfsf(s_etat_processus, 34) == d_vrai))
1.5 bertrand 1768: {
1.41 bertrand 1769: if ((chaine = formateur_flux(s_etat_processus,
1770: (unsigned char *) (*s_objet).objet, &longueur_chaine))
1771: == NULL)
1.5 bertrand 1772: {
1.41 bertrand 1773: return(NULL);
1.5 bertrand 1774: }
1.41 bertrand 1775: }
1776: else
1777: {
1778: if ((chaine = malloc((strlen((unsigned char *)
1779: ((*s_objet).objet)) + 1) * sizeof(unsigned char))) == NULL)
1.5 bertrand 1780: {
1781: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
1782: return(NULL);
1783: }
1.41 bertrand 1784:
1.5 bertrand 1785: strcpy(chaine, (unsigned char *) ((*s_objet).objet));
1786: }
1.1 bertrand 1787: }
1788: else if ((*s_objet).type == CPL)
1789: {
1790:
1791: /*
1792: --------------------------------------------------------------------------------
1793: Complexe
1794: --------------------------------------------------------------------------------
1795: */
1796:
1.58 bertrand 1797: chaine_formatee = formateur_nombre(s_etat_processus,
1.1 bertrand 1798: ((struct_complexe16 *) ((*s_objet).objet)), 'C');
1799:
1800: if (chaine_formatee == NULL)
1801: {
1802: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
1803: return(NULL);
1804: }
1805:
1806: chaine = (unsigned char *) malloc((strlen(chaine_formatee)
1807: + 1) * sizeof(unsigned char));
1808:
1809: if (chaine == NULL)
1810: {
1811: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
1812: return(NULL);
1813: }
1814:
1815: strcpy(chaine, chaine_formatee);
1816: free(chaine_formatee);
1817: }
1818: else if ((*s_objet).type == RPN)
1819: {
1820:
1821: /*
1822: --------------------------------------------------------------------------------
1823: Définition
1824: --------------------------------------------------------------------------------
1825: */
1826:
1827: l_element_courant = (struct_liste_chainee *) ((*s_objet).objet);
1828: chaine_sauvegarde = chaine;
1829:
1830: while(l_element_courant != NULL)
1831: {
1.57 bertrand 1832: if ((chaine_formatee = formateur(s_etat_processus, offset_initial,
1.1 bertrand 1833: (*l_element_courant).donnee)) == NULL)
1834: {
1835: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
1836: return(NULL);
1837: }
1838:
1839: if ((*(*l_element_courant).donnee).type == CHN)
1840: {
1841: chaine_tampon = chaine_formatee;
1842:
1843: if ((chaine_formatee = (unsigned char *) malloc((strlen(
1844: chaine_tampon) + 3) * sizeof(unsigned char))) == NULL)
1845: {
1846: (*s_etat_processus).erreur_systeme =
1847: d_es_allocation_memoire;
1848: return(NULL);
1849: }
1850:
1851: sprintf(chaine_formatee, "\"%s\"", chaine_tampon);
1852: free(chaine_tampon);
1853: }
1854:
1855: l_element_courant = (*l_element_courant).suivant;
1856:
1857: if (chaine != NULL)
1858: {
1859: chaine_sauvegarde = chaine;
1860:
1861: if ((chaine = (unsigned char *) malloc((strlen(
1862: chaine_sauvegarde) + strlen(chaine_formatee) + 2) *
1863: sizeof(unsigned char))) == NULL)
1864: {
1865: (*s_etat_processus).erreur_systeme =
1866: d_es_allocation_memoire;
1867: return(NULL);
1868: }
1869:
1870: strcpy(chaine, chaine_sauvegarde);
1871: free(chaine_sauvegarde);
1872: strcat(chaine, " ");
1873: strcat(chaine, chaine_formatee);
1874: free(chaine_formatee);
1875: }
1876: else
1877: {
1878: chaine = chaine_formatee;
1879: }
1880: }
1881:
1882: chaine_sauvegarde = chaine;
1883: chaine = (unsigned char *) malloc((strlen(chaine_sauvegarde) + 1) *
1884: sizeof(unsigned char));
1885:
1886: if (chaine == NULL)
1887: {
1888: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
1889: return(NULL);
1890: }
1891:
1892: chaine_sauvegarde[strlen(chaine_sauvegarde)] = d_code_fin_chaine;
1893: strcpy(chaine, chaine_sauvegarde);
1894: free(chaine_sauvegarde);
1895: }
1896: else if ((*s_objet).type == INT)
1897: {
1898:
1899: /*
1900: --------------------------------------------------------------------------------
1901: Entier
1902: --------------------------------------------------------------------------------
1903: */
1904:
1.58 bertrand 1905: chaine_formatee = formateur_nombre(s_etat_processus,
1.1 bertrand 1906: ((integer8 *) ((*s_objet).objet)), 'I');
1907:
1908: if (chaine_formatee == NULL)
1909: {
1910: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
1911: return(NULL);
1912: }
1913:
1914: chaine = (unsigned char *) malloc((strlen(chaine_formatee) + 1)
1915: * sizeof(unsigned char));
1916:
1917: if (chaine == NULL)
1918: {
1919: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
1920: return(NULL);
1921: }
1922:
1923: strcpy(chaine, chaine_formatee);
1924: free(chaine_formatee);
1925: }
1926: else if ((*s_objet).type == FCT)
1927: {
1928:
1929: /*
1930: --------------------------------------------------------------------------------
1931: Fonction
1932: --------------------------------------------------------------------------------
1933: */
1934:
1935: chaine = (unsigned char *) malloc((strlen((*((struct_fonction *)
1936: ((*s_objet).objet))).nom_fonction) + 1) *
1937: sizeof(unsigned char));
1938:
1939: if (chaine == NULL)
1940: {
1941: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
1942: return(NULL);
1943: }
1944:
1945: strcpy(chaine, (unsigned char *) (*((struct_fonction *)
1946: ((*s_objet).objet))).nom_fonction);
1947: }
1948: else if ((*s_objet).type == TBL)
1949: {
1950:
1951: /*
1952: --------------------------------------------------------------------------------
1953: Tableau
1954: --------------------------------------------------------------------------------
1955: */
1956:
1957: chaine = (unsigned char *) malloc(4 * sizeof(unsigned char));
1958:
1959: if (chaine == NULL)
1960: {
1961: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
1962: return(NULL);
1963: }
1964:
1965: strcpy(chaine, "<[ ");
1.58 bertrand 1966: offset = ((integer8) strlen(chaine)) + offset_initial;
1.1 bertrand 1967:
1968: for(i = 0; i < (*((struct_tableau *) (*s_objet).objet))
1969: .nombre_elements; i++)
1970: {
1971: chaine_sauvegarde = chaine;
1.60 bertrand 1972: chaine_formatee = formateur(s_etat_processus, (long) offset,
1.1 bertrand 1973: (*((struct_tableau *) (*s_objet).objet)).elements[i]);
1974:
1975: if (chaine_formatee == NULL)
1976: {
1977: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
1978: return(NULL);
1979: }
1980:
1981: if ((*(*((struct_tableau *) (*s_objet).objet)).elements[i])
1982: .type == CHN)
1983: {
1984: chaine = (unsigned char *) malloc((strlen(chaine_formatee)
1985: + strlen(chaine_sauvegarde) + 3)
1986: * sizeof(unsigned char));
1987:
1988: if (chaine == NULL)
1989: {
1990: (*s_etat_processus).erreur_systeme =
1991: d_es_allocation_memoire;
1992: return(NULL);
1993: }
1994:
1995: strcpy(chaine, chaine_sauvegarde);
1996: free(chaine_sauvegarde);
1997: strcat(chaine, "\"");
1998: strcat(chaine, chaine_formatee);
1999: free(chaine_formatee);
2000: strcat(chaine, "\"");
2001: }
2002: else if ((*(*((struct_tableau *) (*s_objet).objet))
2003: .elements[i]).type == CHN)
2004: {
2005: chaine = (unsigned char *) malloc((strlen(chaine_formatee)
2006: + strlen(chaine_sauvegarde) + 1)
2007: * sizeof(unsigned char));
2008:
2009: if (chaine == NULL)
2010: {
2011: (*s_etat_processus).erreur_systeme =
2012: d_es_allocation_memoire;
2013: return(NULL);
2014: }
2015:
2016: sprintf(chaine, "%s%s", chaine_sauvegarde, chaine_formatee);
2017: free(chaine_sauvegarde);
2018: free(chaine_formatee);
2019: }
2020: else
2021: {
2022: chaine = (unsigned char *) malloc((strlen(chaine_formatee)
2023: + strlen(chaine_sauvegarde) + 1)
2024: * sizeof(unsigned char));
2025:
2026: if (chaine == NULL)
2027: {
2028: (*s_etat_processus).erreur_systeme =
2029: d_es_allocation_memoire;
2030: return(NULL);
2031: }
2032:
2033: sprintf(chaine, "%s%s", chaine_sauvegarde, chaine_formatee);
2034: free(chaine_sauvegarde);
2035: free(chaine_formatee);
2036: }
2037:
2038: if (test_cfsf(s_etat_processus, 45) == d_vrai)
2039: {
2040: chaine_sauvegarde = chaine;
2041:
2042: chaine = (unsigned char *) malloc(
2043: (strlen(chaine_sauvegarde) + 2)
2044: * sizeof(unsigned char));
2045:
2046: if (chaine == NULL)
2047: {
2048: (*s_etat_processus).erreur_systeme =
2049: d_es_allocation_memoire;
2050: return(NULL);
2051: }
2052:
2053: strcpy(chaine, chaine_sauvegarde);
2054: free(chaine_sauvegarde);
2055: strcat(chaine, "\n");
2056:
2057: if ((*((struct_tableau *) (*s_objet).objet))
2058: .nombre_elements != (i + 1))
2059: {
2060: chaine_sauvegarde = chaine;
2061:
2062: chaine = (unsigned char *) malloc(
1.58 bertrand 2063: (strlen(chaine_sauvegarde) + 1 + ((size_t) offset))
1.1 bertrand 2064: * sizeof(unsigned char));
2065:
2066: if (chaine == NULL)
2067: {
2068: (*s_etat_processus).erreur_systeme =
2069: d_es_allocation_memoire;
2070: return(NULL);
2071: }
2072:
2073: strcpy(chaine, chaine_sauvegarde);
2074: free(chaine_sauvegarde);
2075: ptre = &(chaine[strlen(chaine)]);
2076:
2077: for(k = 0; k < offset; k++, *(ptre++) = ' ');
2078:
2079: (*ptre) = d_code_fin_chaine;
2080: }
2081: }
2082: else
2083: {
2084: if ((*((struct_tableau *) (*s_objet).objet))
2085: .nombre_elements != (i + 1))
2086: {
2087: chaine_sauvegarde = chaine;
2088:
2089: chaine = (unsigned char *) malloc(
2090: (strlen(chaine_sauvegarde) + 2)
2091: * sizeof(unsigned char));
2092:
2093: if (chaine == NULL)
2094: {
2095: (*s_etat_processus).erreur_systeme =
2096: d_es_allocation_memoire;
2097: return(NULL);
2098: }
2099:
2100: strcpy(chaine, chaine_sauvegarde);
2101: free(chaine_sauvegarde);
2102: strcat(chaine, " ");
2103: }
2104: }
2105: }
2106:
2107: if (test_cfsf(s_etat_processus, 45) == d_vrai)
2108: {
2109: if (chaine[strlen(chaine) - 1] == '\n')
2110: {
2111: chaine[strlen(chaine) - 1] = d_code_fin_chaine;
2112: }
2113: }
2114:
2115: if ((*((struct_tableau *) (*s_objet).objet)).nombre_elements != 0)
2116: {
2117: chaine_sauvegarde = chaine;
2118: chaine = (unsigned char *) malloc((strlen(chaine_sauvegarde) + 4)
2119: * sizeof(unsigned char));
2120:
2121: if (chaine == NULL)
2122: {
2123: (*s_etat_processus).erreur_systeme =
2124: d_es_allocation_memoire;
2125: return(NULL);
2126: }
2127:
2128: strcpy(chaine, chaine_sauvegarde);
2129: free(chaine_sauvegarde);
2130: strcat(chaine, " ]>");
2131: }
2132: else
2133: {
2134: chaine_sauvegarde = chaine;
2135: chaine = (unsigned char *) malloc((strlen(chaine_sauvegarde) + 3)
2136: * sizeof(unsigned char));
2137:
2138: if (chaine == NULL)
2139: {
2140: (*s_etat_processus).erreur_systeme =
2141: d_es_allocation_memoire;
2142: return(NULL);
2143: }
2144:
2145: strcpy(chaine, chaine_sauvegarde);
2146: free(chaine_sauvegarde);
2147: strcat(chaine, "]>");
2148: }
2149: }
2150: else if ((*s_objet).type == LST)
2151: {
2152:
2153: /*
2154: --------------------------------------------------------------------------------
2155: Liste
2156: --------------------------------------------------------------------------------
2157: */
2158:
2159: chaine = (unsigned char *) malloc(3 * sizeof(unsigned char));
2160:
2161: if (chaine == NULL)
2162: {
2163: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
2164: return(NULL);
2165: }
2166:
2167: strcpy(chaine, "{ ");
2168:
2169: l_element_courant = (struct_liste_chainee *) ((*s_objet).objet);
2170: nombre_elements = 0;
1.58 bertrand 2171: offset = ((integer8) strlen(chaine)) + offset_initial;
1.1 bertrand 2172:
2173: while(l_element_courant != NULL)
2174: {
2175: chaine_sauvegarde = chaine;
1.60 bertrand 2176: chaine_formatee = formateur(s_etat_processus, (long) offset,
1.1 bertrand 2177: (*l_element_courant).donnee);
2178:
2179: if (chaine_formatee == NULL)
2180: {
2181: (*s_etat_processus).erreur_systeme =
2182: d_es_allocation_memoire;
2183: return(NULL);
2184: }
2185:
2186: if ((*(*l_element_courant).donnee).type == CHN)
2187: {
2188: chaine = (unsigned char *) malloc((strlen(chaine_formatee)
2189: + strlen(chaine_sauvegarde) + 3)
2190: * sizeof(unsigned char));
2191:
2192: if (chaine == NULL)
2193: {
2194: (*s_etat_processus).erreur_systeme =
2195: d_es_allocation_memoire;
2196: return(NULL);
2197: }
2198:
2199: strcpy(chaine, chaine_sauvegarde);
2200: free(chaine_sauvegarde);
2201: strcat(chaine, "\"");
2202: strcat(chaine, chaine_formatee);
2203: free(chaine_formatee);
2204: strcat(chaine, "\"");
2205: }
2206: else if ((*(*l_element_courant).donnee).type == NOM)
2207: {
2208: chaine = (unsigned char *) malloc((strlen(chaine_formatee)
2209: + strlen(chaine_sauvegarde) + 1)
2210: * sizeof(unsigned char));
2211:
2212: if (chaine == NULL)
2213: {
2214: (*s_etat_processus).erreur_systeme =
2215: d_es_allocation_memoire;
2216: return(NULL);
2217: }
2218:
2219: sprintf(chaine, "%s%s", chaine_sauvegarde, chaine_formatee);
2220: free(chaine_sauvegarde);
2221: free(chaine_formatee);
2222: }
2223: else
2224: {
2225: chaine = (unsigned char *) malloc((strlen(chaine_formatee)
2226: + strlen(chaine_sauvegarde) + 1)
2227: * sizeof(unsigned char));
2228:
2229: if (chaine == NULL)
2230: {
2231: (*s_etat_processus).erreur_systeme =
2232: d_es_allocation_memoire;
2233: return(NULL);
2234: }
2235:
2236: sprintf(chaine, "%s%s", chaine_sauvegarde, chaine_formatee);
2237: free(chaine_sauvegarde);
2238: free(chaine_formatee);
2239: }
2240:
2241: if (test_cfsf(s_etat_processus, 45) == d_vrai)
2242: {
2243: chaine_sauvegarde = chaine;
2244:
2245: chaine = (unsigned char *) malloc(
2246: (strlen(chaine_sauvegarde) + 2)
2247: * sizeof(unsigned char));
2248:
2249: if (chaine == NULL)
2250: {
2251: (*s_etat_processus).erreur_systeme =
2252: d_es_allocation_memoire;
2253: return(NULL);
2254: }
2255:
2256: strcpy(chaine, chaine_sauvegarde);
2257: free(chaine_sauvegarde);
2258: strcat(chaine, "\n");
2259:
2260: if ((*l_element_courant).suivant != NULL)
2261: {
2262: chaine_sauvegarde = chaine;
2263:
2264: chaine = (unsigned char *) malloc(
1.58 bertrand 2265: (strlen(chaine_sauvegarde) + 1 + ((size_t) offset))
1.1 bertrand 2266: * sizeof(unsigned char));
2267:
2268: if (chaine == NULL)
2269: {
2270: (*s_etat_processus).erreur_systeme =
2271: d_es_allocation_memoire;
2272: return(NULL);
2273: }
2274:
2275: strcpy(chaine, chaine_sauvegarde);
2276: free(chaine_sauvegarde);
2277: ptre = &(chaine[strlen(chaine)]);
2278:
2279: for(k = 0; k < offset; k++, *(ptre++) = ' ');
2280:
2281: (*ptre) = d_code_fin_chaine;
2282: }
2283: }
2284: else
2285: {
2286: if ((*l_element_courant).suivant != NULL)
2287: {
2288: chaine_sauvegarde = chaine;
2289:
2290: chaine = (unsigned char *) malloc(
2291: (strlen(chaine_sauvegarde) + 2)
2292: * sizeof(unsigned char));
2293:
2294: if (chaine == NULL)
2295: {
2296: (*s_etat_processus).erreur_systeme =
2297: d_es_allocation_memoire;
2298: return(NULL);
2299: }
2300:
2301: strcpy(chaine, chaine_sauvegarde);
2302: free(chaine_sauvegarde);
2303: strcat(chaine, " ");
2304: }
2305: }
2306:
2307: nombre_elements++;
2308: l_element_courant = (*l_element_courant).suivant;
2309: }
2310:
2311: if (test_cfsf(s_etat_processus, 45) == d_vrai)
2312: {
2313: if (chaine[strlen(chaine) - 1] == '\n')
2314: {
2315: chaine[strlen(chaine) - 1] = d_code_fin_chaine;
2316: }
2317: }
2318:
2319: if (nombre_elements != 0)
2320: {
2321: chaine_sauvegarde = chaine;
2322: chaine = (unsigned char *) malloc((strlen(chaine_sauvegarde) + 3)
2323: * sizeof(unsigned char));
2324:
2325: if (chaine == NULL)
2326: {
2327: (*s_etat_processus).erreur_systeme =
2328: d_es_allocation_memoire;
2329: return(NULL);
2330: }
2331:
2332: strcpy(chaine, chaine_sauvegarde);
2333: free(chaine_sauvegarde);
2334: strcat(chaine, " }");
2335: }
2336: else
2337: {
2338: chaine_sauvegarde = chaine;
2339: chaine = (unsigned char *) malloc((strlen(chaine_sauvegarde) + 2)
2340: * sizeof(unsigned char));
2341:
2342: if (chaine == NULL)
2343: {
2344: (*s_etat_processus).erreur_systeme =
2345: d_es_allocation_memoire;
2346: return(NULL);
2347: }
2348:
2349: strcpy(chaine, chaine_sauvegarde);
2350: free(chaine_sauvegarde);
2351: strcat(chaine, "}");
2352: }
2353: }
2354: else if ((*s_objet).type == MCX)
2355: {
2356:
2357: /*
2358: --------------------------------------------------------------------------------
2359: Matrice complexe
2360: --------------------------------------------------------------------------------
2361: */
2362:
2363: nombre_lignes = (*((struct_matrice *) ((*s_objet).objet)))
2364: .nombre_lignes;
2365: nombre_colonnes = (*((struct_matrice *) ((*s_objet).objet)))
2366: .nombre_colonnes;
2367:
2368: chaine = (unsigned char *) malloc(3 * sizeof(unsigned char));
2369:
2370: if (chaine != NULL)
2371: {
2372: strcpy(chaine, "[[");
1.58 bertrand 2373: offset = ((integer8) strlen(chaine)) + offset_initial - 1;
1.1 bertrand 2374:
1.59 bertrand 2375: if ((longueurs_maximales = malloc(sizeof(integer8) * 2 *
1.58 bertrand 2376: ((size_t) nombre_colonnes))) == NULL)
1.1 bertrand 2377: {
2378: (*s_etat_processus).erreur_systeme =
2379: d_es_allocation_memoire;
2380: return(NULL);
2381: }
2382:
2383: if (test_cfsf(s_etat_processus, 45) == d_vrai)
2384: {
2385: for(j = 0; j < (2 * nombre_colonnes); j++)
2386: {
2387: longueurs_maximales[j] = 0;
2388: }
2389:
2390: for(i = 0; i < nombre_lignes; i++)
2391: {
2392: for(j = 0; j < nombre_colonnes; j++)
2393: {
2394: chaine_formatee = formateur_nombre(s_etat_processus,
1.58 bertrand 2395: &(((struct_complexe16 **)
1.1 bertrand 2396: ((*((struct_matrice *)
2397: ((*s_objet).objet))).tableau))[i][j]), 'C');
2398:
2399: if (chaine_formatee == NULL)
2400: {
2401: (*s_etat_processus).erreur_systeme =
2402: d_es_allocation_memoire;
2403: return(NULL);
2404: }
2405:
1.58 bertrand 2406: longueur_courante = (integer8) strlen(chaine_formatee);
1.1 bertrand 2407: longueur_decimale_courante = 0;
2408:
2409: if ((ptrl = index(chaine_formatee,
2410: (test_cfsf(s_etat_processus, 48) == d_vrai)
2411: ? '.' : ',')) != NULL)
2412: {
2413: longueur_decimale_courante = longueur_courante
2414: - (ptrl - chaine_formatee);
2415: longueur_courante = ptrl - chaine_formatee;
2416: }
2417:
2418: free(chaine_formatee);
2419:
2420: if (longueurs_maximales[2 * j] < longueur_courante)
2421: {
2422: longueurs_maximales[2 * j] = longueur_courante;
2423: }
2424:
2425: if (longueurs_maximales[(2 * j) + 1] <
2426: longueur_decimale_courante)
2427: {
2428: longueurs_maximales[(2 * j) + 1] =
2429: longueur_decimale_courante;
2430: }
2431: }
2432: }
2433: }
2434:
2435: for(i = 0; i < nombre_lignes; i++)
2436: {
2437: for(j = 0; j < nombre_colonnes; j++)
2438: {
2439: chaine_formatee = formateur_nombre(s_etat_processus,
1.58 bertrand 2440: &(((struct_complexe16 **)
1.1 bertrand 2441: ((*((struct_matrice *)
2442: ((*s_objet).objet))).tableau))[i][j]), 'C');
2443:
2444: if (chaine_formatee == NULL)
2445: {
2446: (*s_etat_processus).erreur_systeme =
2447: d_es_allocation_memoire;
2448: return(NULL);
2449: }
2450:
1.58 bertrand 2451: longueur_courante = (integer8) strlen(chaine_formatee);
1.1 bertrand 2452: longueur_decimale_courante = 0;
2453:
2454: if ((ptrl = index(chaine_formatee,
2455: (test_cfsf(s_etat_processus, 48) == d_vrai)
2456: ? '.' : ',')) != NULL)
2457: {
2458: longueur_decimale_courante = longueur_courante
2459: - (ptrl - chaine_formatee);
2460: longueur_courante = ptrl - chaine_formatee;
2461: }
2462:
2463: chaine_sauvegarde = chaine;
2464:
2465: if (test_cfsf(s_etat_processus, 45) == d_vrai)
2466: {
2467:
2468: chaine = (unsigned char *) malloc(
2469: (strlen(chaine_sauvegarde) +
1.58 bertrand 2470: ((size_t) longueur_courante) +
2471: ((size_t) longueur_decimale_courante) +
2472: ((size_t) longueurs_maximales[2 * j]) +
2473: ((size_t) longueurs_maximales[(2 * j) + 1]) + 2)
1.1 bertrand 2474: * sizeof(unsigned char));
2475:
2476: if (chaine == NULL)
2477: {
2478: (*s_etat_processus).erreur_systeme =
2479: d_es_allocation_memoire;
2480: return(NULL);
2481: }
2482:
2483: strcpy(chaine, chaine_sauvegarde);
2484: free(chaine_sauvegarde);
2485: strcat(chaine, " ");
2486:
2487: ptre = &(chaine[strlen(chaine)]);
2488:
2489: for (k = 0; k < (longueurs_maximales[2 * j]
2490: - longueur_courante); k++, *(ptre++) = ' ');
2491:
2492: (*ptre) = d_code_fin_chaine;
2493: strcat(chaine, chaine_formatee);
2494: ptre = &(chaine[strlen(chaine)]);
2495:
2496: for(k = 0; k < (longueurs_maximales[(2 * j) + 1]
2497: - longueur_decimale_courante);
2498: k++, *(ptre++) = ' ');
2499:
2500: (*ptre) = d_code_fin_chaine;
2501: }
2502: else
2503: {
2504: chaine = (unsigned char *) malloc(
2505: (strlen(chaine_sauvegarde) +
1.58 bertrand 2506: ((size_t) longueur_courante) +
2507: ((size_t) longueur_decimale_courante)
1.1 bertrand 2508: + 2) * sizeof(unsigned char));
2509:
2510: if (chaine == NULL)
2511: {
2512: (*s_etat_processus).erreur_systeme =
2513: d_es_allocation_memoire;
2514: return(NULL);
2515: }
2516:
2517: strcpy(chaine, chaine_sauvegarde);
2518: free(chaine_sauvegarde);
2519: strcat(chaine, " ");
2520: strcat(chaine, chaine_formatee);
2521: }
2522:
2523: free(chaine_formatee);
2524: }
2525:
2526: chaine_sauvegarde = chaine;
2527:
2528: if (i != (nombre_lignes - 1))
2529: {
2530: if (test_cfsf(s_etat_processus, 45) == d_vrai)
2531: {
2532: chaine = (unsigned char *) malloc(
1.58 bertrand 2533: (strlen(chaine_sauvegarde) + 5 +
2534: ((size_t) offset)) * sizeof(unsigned char));
1.1 bertrand 2535:
2536: if (chaine == NULL)
2537: {
2538: (*s_etat_processus).erreur_systeme =
2539: d_es_allocation_memoire;
2540: return(NULL);
2541: }
2542:
2543: strcpy(chaine, chaine_sauvegarde);
2544: free(chaine_sauvegarde);
2545: strcat(chaine, " ]\n");
2546: ptre = &(chaine[strlen(chaine)]);
2547:
2548: for(k = 0; k < offset; k++, *(ptre++) = ' ');
2549:
2550: (*ptre) = d_code_fin_chaine;
2551: strcat(chaine, "[");
2552: }
2553: else
2554: {
2555: chaine = (unsigned char *) malloc(
2556: (strlen(chaine_sauvegarde) + 4)
2557: * sizeof(unsigned char));
2558:
2559: if (chaine == NULL)
2560: {
2561: (*s_etat_processus).erreur_systeme =
2562: d_es_allocation_memoire;
2563: return(NULL);
2564: }
2565:
2566: strcpy(chaine, chaine_sauvegarde);
2567: free(chaine_sauvegarde);
2568: strcat(chaine, " ][");
2569: }
2570: }
2571: }
2572:
2573: free(longueurs_maximales);
2574:
2575: chaine_sauvegarde = chaine;
2576: chaine = (unsigned char *) malloc((strlen(chaine_sauvegarde)
2577: + 4) * sizeof(unsigned char));
2578:
2579: if (chaine == NULL)
2580: {
2581: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
2582: return(NULL);
2583: }
2584:
2585: strcpy(chaine, chaine_sauvegarde);
2586: free(chaine_sauvegarde);
2587: strcat(chaine, " ]]");
2588: }
2589: }
2590: else if ((*s_objet).type == MIN)
2591: {
2592:
2593: /*
2594: --------------------------------------------------------------------------------
2595: Matrice entière
2596: --------------------------------------------------------------------------------
2597: */
2598:
2599: nombre_lignes = (*((struct_matrice *) ((*s_objet).objet)))
2600: .nombre_lignes;
2601: nombre_colonnes = (*((struct_matrice *) ((*s_objet).objet)))
2602: .nombre_colonnes;
2603:
2604: chaine = (unsigned char *) malloc(3 * sizeof(unsigned char));
2605:
2606: if (chaine != NULL)
2607: {
2608: strcpy(chaine, "[[");
1.58 bertrand 2609: offset = ((integer8) strlen(chaine)) + offset_initial - 1;
1.1 bertrand 2610:
1.59 bertrand 2611: if ((longueurs_maximales = malloc(sizeof(integer8) *
1.58 bertrand 2612: ((size_t) nombre_colonnes))) == NULL)
1.1 bertrand 2613: {
2614: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
2615: return(NULL);
2616: }
2617:
2618: if (test_cfsf(s_etat_processus, 45) == d_vrai)
2619: {
2620: for(j = 0; j < nombre_colonnes; j++)
2621: {
2622: longueurs_maximales[j] = 0;
2623: }
2624:
2625: for(i = 0; i < nombre_lignes; i++)
2626: {
2627: for(j = 0; j < nombre_colonnes; j++)
2628: {
2629: chaine_formatee = formateur_nombre(s_etat_processus,
1.58 bertrand 2630: &(((integer8 **) ((*((struct_matrice *)
1.1 bertrand 2631: ((*s_objet).objet))).tableau))[i][j]), 'I');
2632:
2633: if (chaine_formatee == NULL)
2634: {
2635: (*s_etat_processus).erreur_systeme =
2636: d_es_allocation_memoire;
2637: return(NULL);
2638: }
2639:
1.58 bertrand 2640: longueur_courante = (integer8) strlen(chaine_formatee);
1.1 bertrand 2641: free(chaine_formatee);
2642:
2643: if (longueurs_maximales[j] < longueur_courante)
2644: {
2645: longueurs_maximales[j] = longueur_courante;
2646: }
2647: }
2648: }
2649: }
2650:
2651: for(i = 0; i < nombre_lignes; i++)
2652: {
2653: for(j = 0; j < nombre_colonnes; j++)
2654: {
2655: chaine_formatee = formateur_nombre(s_etat_processus,
1.58 bertrand 2656: &(((integer8 **) ((*((struct_matrice *)
1.1 bertrand 2657: ((*s_objet).objet))).tableau))[i][j]), 'I');
2658:
2659: if (chaine_formatee == NULL)
2660: {
2661: (*s_etat_processus).erreur_systeme =
2662: d_es_allocation_memoire;
2663: return(NULL);
2664: }
2665:
1.58 bertrand 2666: longueur_courante = (integer8) strlen(chaine_formatee);
1.1 bertrand 2667: chaine_sauvegarde = chaine;
2668:
2669: if (test_cfsf(s_etat_processus, 45) == d_vrai)
2670: {
2671: chaine = (unsigned char *) malloc(
1.58 bertrand 2672: (strlen(chaine_sauvegarde) +
2673: ((size_t) longueur_courante)
2674: + ((size_t) longueurs_maximales[j]) + 2)
1.1 bertrand 2675: * sizeof(unsigned char));
2676:
2677: if (chaine == NULL)
2678: {
2679: (*s_etat_processus).erreur_systeme =
2680: d_es_allocation_memoire;
2681: return(NULL);
2682: }
2683:
2684: strcpy(chaine, chaine_sauvegarde);
2685: free(chaine_sauvegarde);
2686: strcat(chaine, " ");
2687:
2688: ptre = &(chaine[strlen(chaine)]);
2689:
2690: for(k = 0; k < (longueurs_maximales[j]
2691: - longueur_courante); k++, *(ptre++) = ' ');
2692:
2693: (*ptre) = d_code_fin_chaine;
2694: }
2695: else
2696: {
2697: chaine = (unsigned char *) malloc(
1.58 bertrand 2698: (strlen(chaine_sauvegarde) +
2699: ((size_t) longueur_courante)
1.1 bertrand 2700: + 2) * sizeof(unsigned char));
2701:
2702: if (chaine == NULL)
2703: {
2704: (*s_etat_processus).erreur_systeme =
2705: d_es_allocation_memoire;
2706: return(NULL);
2707: }
2708:
2709: strcpy(chaine, chaine_sauvegarde);
2710: free(chaine_sauvegarde);
2711: strcat(chaine, " ");
2712: }
2713:
2714: strcat(chaine, chaine_formatee);
2715: free(chaine_formatee);
2716: }
2717:
2718: chaine_sauvegarde = chaine;
2719:
2720: if (i != (nombre_lignes - 1))
2721: {
2722: if (test_cfsf(s_etat_processus, 45) == d_vrai)
2723: {
2724: chaine = (unsigned char *) malloc(
1.58 bertrand 2725: (strlen(chaine_sauvegarde) + 5 +
2726: ((size_t) offset)) * sizeof(unsigned char));
1.1 bertrand 2727:
2728: if (chaine == NULL)
2729: {
2730: (*s_etat_processus).erreur_systeme =
2731: d_es_allocation_memoire;
2732: return(NULL);
2733: }
2734:
2735: strcpy(chaine, chaine_sauvegarde);
2736: free(chaine_sauvegarde);
2737: strcat(chaine, " ]\n");
2738: ptre = &(chaine[strlen(chaine)]);
2739:
2740: for(k = 0; k < offset; k++, *(ptre++) = ' ');
2741:
2742: (*ptre) = d_code_fin_chaine;
2743: strcat(chaine, "[");
2744: }
2745: else
2746: {
2747: chaine = (unsigned char *) malloc(
2748: (strlen(chaine_sauvegarde) + 4)
2749: * sizeof(unsigned char));
2750:
2751: if (chaine == NULL)
2752: {
2753: (*s_etat_processus).erreur_systeme =
2754: d_es_allocation_memoire;
2755: return(NULL);
2756: }
2757:
2758: strcpy(chaine, chaine_sauvegarde);
2759: free(chaine_sauvegarde);
2760: strcat(chaine, " ][");
2761: }
2762: }
2763: }
2764:
2765: free(longueurs_maximales);
2766:
2767: chaine_sauvegarde = chaine;
2768: chaine = (unsigned char *) malloc((strlen(chaine_sauvegarde)
2769: + 4) * sizeof(unsigned char));
2770:
2771: if (chaine == NULL)
2772: {
2773: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
2774: return(NULL);
2775: }
2776:
2777: strcpy(chaine, chaine_sauvegarde);
2778: free(chaine_sauvegarde);
2779: strcat(chaine, " ]]");
2780: }
2781: }
2782: else if ((*s_objet).type == MRL)
2783: {
2784:
2785: /*
2786: --------------------------------------------------------------------------------
2787: Matrice réelle
2788: --------------------------------------------------------------------------------
2789: */
2790:
2791: nombre_lignes = (*((struct_matrice *) ((*s_objet).objet)))
2792: .nombre_lignes;
2793: nombre_colonnes = (*((struct_matrice *) ((*s_objet).objet)))
2794: .nombre_colonnes;
2795:
2796: chaine = (unsigned char *) malloc(3 * sizeof(unsigned char));
2797:
2798: if (chaine != NULL)
2799: {
2800: strcpy(chaine, "[[");
1.58 bertrand 2801: offset = ((integer8) strlen(chaine)) + offset_initial - 1;
1.1 bertrand 2802:
1.59 bertrand 2803: if ((longueurs_maximales = malloc(sizeof(integer8) * 2 *
1.58 bertrand 2804: ((size_t) nombre_colonnes))) == NULL)
1.1 bertrand 2805: {
2806: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
2807: return(NULL);
2808: }
2809:
2810: if (test_cfsf(s_etat_processus, 45) == d_vrai)
2811: {
2812: for(j = 0; j < (2 * nombre_colonnes); j++)
2813: {
2814: longueurs_maximales[j] = 0;
2815: }
2816:
2817: for(i = 0; i < nombre_lignes; i++)
2818: {
2819: for(j = 0; j < nombre_colonnes; j++)
2820: {
2821: chaine_formatee = formateur_nombre(s_etat_processus,
1.58 bertrand 2822: &(((real8 **) ((*((struct_matrice *)
1.1 bertrand 2823: ((*s_objet).objet))).tableau))[i][j]), 'R');
2824:
2825: if (chaine_formatee == NULL)
2826: {
2827: (*s_etat_processus).erreur_systeme =
2828: d_es_allocation_memoire;
2829: return(NULL);
2830: }
2831:
1.58 bertrand 2832: longueur_courante = (integer8) strlen(chaine_formatee);
1.1 bertrand 2833: longueur_decimale_courante = 0;
2834:
2835: if ((ptrl = index(chaine_formatee,
2836: (test_cfsf(s_etat_processus, 48) == d_vrai)
2837: ? ',' : '.')) != NULL)
2838: {
2839: longueur_decimale_courante = longueur_courante
2840: - (ptrl - chaine_formatee);
2841: longueur_courante = ptrl - chaine_formatee;
2842: }
2843:
2844: free(chaine_formatee);
2845:
2846: if (longueurs_maximales[2 * j] < longueur_courante)
2847: {
2848: longueurs_maximales[2 * j] = longueur_courante;
2849: }
2850:
2851: if (longueurs_maximales[(2 * j) + 1] <
2852: longueur_decimale_courante)
2853: {
2854: longueurs_maximales[(2 * j) + 1] =
2855: longueur_decimale_courante;
2856: }
2857: }
2858: }
2859: }
2860:
2861: for(i = 0; i < nombre_lignes; i++)
2862: {
2863: for(j = 0; j < nombre_colonnes; j++)
2864: {
2865: chaine_formatee = formateur_nombre(s_etat_processus,
1.58 bertrand 2866: &(((real8 **) ((*((struct_matrice *)
1.1 bertrand 2867: ((*s_objet).objet))).tableau))[i][j]), 'R');
2868:
2869: if (chaine_formatee == NULL)
2870: {
2871: (*s_etat_processus).erreur_systeme =
2872: d_es_allocation_memoire;
2873: return(NULL);
2874: }
2875:
1.58 bertrand 2876: longueur_courante = (integer8) strlen(chaine_formatee);
1.1 bertrand 2877: longueur_decimale_courante = 0;
2878:
2879: if ((ptrl = index(chaine_formatee,
2880: (test_cfsf(s_etat_processus, 48) == d_vrai)
2881: ? ',' : '.')) != NULL)
2882: {
2883: longueur_decimale_courante = longueur_courante
2884: - (ptrl - chaine_formatee);
2885: longueur_courante = ptrl - chaine_formatee;
2886: }
2887:
2888: chaine_sauvegarde = chaine;
2889:
2890: if (test_cfsf(s_etat_processus, 45) == d_vrai)
2891: {
2892: chaine = (unsigned char *) malloc(
2893: (strlen(chaine_sauvegarde) +
1.58 bertrand 2894: ((size_t) longueur_courante) +
2895: ((size_t) longueur_decimale_courante) +
2896: ((size_t) longueurs_maximales[2 * j]) +
2897: ((size_t) longueurs_maximales[(2 * j) + 1]) + 2)
1.1 bertrand 2898: * sizeof(unsigned char));
2899:
2900: if (chaine == NULL)
2901: {
2902: (*s_etat_processus).erreur_systeme =
2903: d_es_allocation_memoire;
2904: return(NULL);
2905: }
2906:
2907: strcpy(chaine, chaine_sauvegarde);
2908: free(chaine_sauvegarde);
2909: strcat(chaine, " ");
2910:
2911: ptre = &(chaine[strlen(chaine)]);
2912:
2913: for(k = 0; k < (longueurs_maximales[2 * j]
2914: - longueur_courante); k++, *(ptre++) = ' ');
2915:
2916: (*ptre) = d_code_fin_chaine;
2917: strcat(chaine, chaine_formatee);
2918: ptre = &(chaine[strlen(chaine)]);
2919:
2920: for(k = 0; k < (longueurs_maximales[(2 * j) + 1]
2921: - longueur_decimale_courante);
2922: k++, *(ptre++) = ' ');
2923:
2924: (*ptre) = d_code_fin_chaine;
2925: }
2926: else
2927: {
2928: chaine = (unsigned char *) malloc(
2929: (strlen(chaine_sauvegarde) +
1.58 bertrand 2930: ((size_t) longueur_courante) +
2931: ((size_t) longueur_decimale_courante)
1.1 bertrand 2932: + 2) * sizeof(unsigned char));
2933:
2934: if (chaine == NULL)
2935: {
2936: (*s_etat_processus).erreur_systeme =
2937: d_es_allocation_memoire;
2938: return(NULL);
2939: }
2940:
2941: strcpy(chaine, chaine_sauvegarde);
2942: free(chaine_sauvegarde);
2943: strcat(chaine, " ");
2944: strcat(chaine, chaine_formatee);
2945: }
2946:
2947: free(chaine_formatee);
2948: }
2949:
2950: chaine_sauvegarde = chaine;
2951:
2952: if (i != (nombre_lignes - 1))
2953: {
2954: if (test_cfsf(s_etat_processus, 45) == d_vrai)
2955: {
2956: chaine = (unsigned char *) malloc(
1.58 bertrand 2957: (strlen(chaine_sauvegarde) + 5 +
2958: ((size_t) offset)) * sizeof(unsigned char));
1.1 bertrand 2959:
2960: if (chaine == NULL)
2961: {
2962: (*s_etat_processus).erreur_systeme =
2963: d_es_allocation_memoire;
2964: return(NULL);
2965: }
2966:
2967: strcpy(chaine, chaine_sauvegarde);
2968: free(chaine_sauvegarde);
2969: strcat(chaine, " ]\n");
2970: ptre = &(chaine[strlen(chaine)]);
2971:
2972: for(k = 0; k < offset; k++, *(ptre++) = ' ');
2973:
2974: (*ptre) = d_code_fin_chaine;
2975: strcat(chaine, "[");
2976: }
2977: else
2978: {
2979: chaine = (unsigned char *) malloc(
2980: (strlen(chaine_sauvegarde) + 4)
2981: * sizeof(unsigned char));
2982:
2983: if (chaine == NULL)
2984: {
2985: (*s_etat_processus).erreur_systeme =
2986: d_es_allocation_memoire;
2987: return(NULL);
2988: }
2989:
2990: strcpy(chaine, chaine_sauvegarde);
2991: free(chaine_sauvegarde);
2992: strcat(chaine, " ][");
2993: }
2994: }
2995: }
2996:
2997: free(longueurs_maximales);
2998:
2999: chaine_sauvegarde = chaine;
3000: chaine = (unsigned char *) malloc((strlen(chaine_sauvegarde)
3001: + 4) * sizeof(unsigned char));
3002:
3003: if (chaine == NULL)
3004: {
3005: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
3006: return(NULL);
3007: }
3008:
3009: strcpy(chaine, chaine_sauvegarde);
3010: free(chaine_sauvegarde);
3011: strcat(chaine, " ]]");
3012: }
3013: }
3014: else if ((*s_objet).type == MTX)
3015: {
1.61 bertrand 3016: if (alsprintf(&chaine, "Mutex $ %016llX owned by $ %016llX",
1.60 bertrand 3017: &((*((struct_mutex *) (*s_objet).objet)).mutex),
1.59 bertrand 3018: (logical8) (*((struct_mutex *) (*s_objet).objet)).tid) < 0)
1.1 bertrand 3019: {
3020: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
3021: return(NULL);
3022: }
3023: }
3024: else if ((*s_objet).type == NOM)
3025: {
3026:
3027: /*
3028: --------------------------------------------------------------------------------
3029: Nom
3030: --------------------------------------------------------------------------------
3031: */
3032:
3033: if ((*((struct_nom *) (*s_objet).objet)).symbole == d_vrai)
3034: {
3035: chaine = (unsigned char *) malloc((strlen((*((struct_nom *)
3036: (*s_objet).objet)).nom) + 3) * sizeof(unsigned char));
3037:
3038: if (chaine == NULL)
3039: {
3040: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
3041: return(NULL);
3042: }
3043:
3044: sprintf(chaine, "'%s'", (*((struct_nom *) (*s_objet).objet)).nom);
3045: }
3046: else
3047: {
3048: chaine = (unsigned char *) malloc((strlen((*((struct_nom *)
3049: (*s_objet).objet)).nom) + 1) * sizeof(unsigned char));
3050:
3051: if (chaine == NULL)
3052: {
3053: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
3054: return(NULL);
3055: }
3056:
3057: sprintf(chaine, "%s", (*((struct_nom *) (*s_objet).objet)).nom);
3058: }
3059: }
3060: else if ((*s_objet).type == REL)
3061: {
3062:
3063: /*
3064: --------------------------------------------------------------------------------
3065: Réel
3066: --------------------------------------------------------------------------------
3067: */
3068:
1.58 bertrand 3069: chaine_formatee = formateur_nombre(s_etat_processus,
1.1 bertrand 3070: ((real8 *) ((*s_objet).objet)), 'R');
3071:
3072: if (chaine_formatee == NULL)
3073: {
3074: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
3075: return(NULL);
3076: }
3077:
3078: chaine = (unsigned char *) malloc((strlen(chaine_formatee) + 1)
3079: * sizeof(unsigned char));
3080:
3081: if (chaine == NULL)
3082: {
3083: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
3084: return(NULL);
3085: }
3086:
3087: strcpy(chaine, chaine_formatee);
3088: free(chaine_formatee);
3089: }
3090: else if ((*s_objet).type == VCX)
3091: {
3092:
3093: /*
3094: --------------------------------------------------------------------------------
3095: Vecteur complexe
3096: --------------------------------------------------------------------------------
3097: */
3098:
3099: nombre_colonnes = (*((struct_vecteur *) ((*s_objet).objet)))
3100: .taille;
3101:
3102: chaine = (unsigned char *) malloc(2 * sizeof(unsigned char));
3103:
3104: if (chaine != NULL)
3105: {
3106: strcpy(chaine, "[");
3107:
3108: for(i = 0; i < nombre_colonnes; i++)
3109: {
1.58 bertrand 3110: chaine_formatee = formateur_nombre(s_etat_processus,
1.1 bertrand 3111: &(((struct_complexe16 *) ((*((struct_vecteur *)
3112: ((*s_objet).objet))).tableau))[i]), 'C');
3113:
3114: if (chaine_formatee == NULL)
3115: {
3116: (*s_etat_processus).erreur_systeme =
3117: d_es_allocation_memoire;
3118: return(NULL);
3119: }
3120:
3121: chaine_sauvegarde = chaine;
3122: chaine = (unsigned char *) malloc(
3123: (strlen(chaine_sauvegarde) + strlen(chaine_formatee)
3124: + 2) * sizeof(unsigned char));
3125:
3126: if (chaine == NULL)
3127: {
3128: (*s_etat_processus).erreur_systeme =
3129: d_es_allocation_memoire;
3130: return(NULL);
3131: }
3132:
3133: strcpy(chaine, chaine_sauvegarde);
3134: free(chaine_sauvegarde);
3135: strcat(chaine, " ");
3136: strcat(chaine, chaine_formatee);
3137: free(chaine_formatee);
3138: }
3139:
3140: chaine_sauvegarde = chaine;
3141: chaine = (unsigned char *) malloc(
3142: (strlen(chaine_sauvegarde) + 3)
3143: * sizeof(unsigned char));
3144:
3145: if (chaine == NULL)
3146: {
3147: (*s_etat_processus).erreur_systeme =
3148: d_es_allocation_memoire;
3149: return(NULL);
3150: }
3151:
3152: strcpy(chaine, chaine_sauvegarde);
3153: free(chaine_sauvegarde);
3154: strcat(chaine, " ]");
3155: }
3156: }
3157: else if ((*s_objet).type == VIN)
3158: {
3159:
3160: /*
3161: --------------------------------------------------------------------------------
3162: Vecteur entier
3163: --------------------------------------------------------------------------------
3164: */
3165:
3166: nombre_colonnes = (*((struct_vecteur *) ((*s_objet).objet)))
3167: .taille;
3168:
3169: chaine = (unsigned char *) malloc(2 * sizeof(unsigned char));
3170:
3171: if (chaine != NULL)
3172: {
3173: strcpy(chaine, "[");
3174:
3175: for(i = 0; i < nombre_colonnes; i++)
3176: {
1.58 bertrand 3177: chaine_formatee = formateur_nombre(s_etat_processus,
1.1 bertrand 3178: &(((integer8 *) ((*((struct_vecteur *)
3179: ((*s_objet).objet))).tableau))[i]), 'I');
3180:
3181: if (chaine_formatee == NULL)
3182: {
3183: (*s_etat_processus).erreur_systeme =
3184: d_es_allocation_memoire;
3185: return(NULL);
3186: }
3187:
3188: chaine_sauvegarde = chaine;
3189: chaine = (unsigned char *) malloc(
3190: (strlen(chaine_sauvegarde) + strlen(chaine_formatee)
3191: + 2) * sizeof(unsigned char));
3192:
3193: if (chaine == NULL)
3194: {
3195: (*s_etat_processus).erreur_systeme =
3196: d_es_allocation_memoire;
3197: return(NULL);
3198: }
3199:
3200: strcpy(chaine, chaine_sauvegarde);
3201: free(chaine_sauvegarde);
3202: strcat(chaine, " ");
3203: strcat(chaine, chaine_formatee);
3204: free(chaine_formatee);
3205: }
3206:
3207: chaine_sauvegarde = chaine;
3208: chaine = (unsigned char *) malloc(
3209: (strlen(chaine_sauvegarde) + 3)
3210: * sizeof(unsigned char));
3211:
3212: if (chaine == NULL)
3213: {
3214: (*s_etat_processus).erreur_systeme =
3215: d_es_allocation_memoire;
3216: return(NULL);
3217: }
3218:
3219: strcpy(chaine, chaine_sauvegarde);
3220: free(chaine_sauvegarde);
3221: strcat(chaine, " ]");
3222: }
3223: }
3224: else if ((*s_objet).type == VRL)
3225: {
3226:
3227: /*
3228: --------------------------------------------------------------------------------
3229: Vecteur réel
3230: --------------------------------------------------------------------------------
3231: */
3232:
3233: nombre_colonnes = (*((struct_vecteur *) ((*s_objet).objet)))
3234: .taille;
3235:
3236: chaine = (unsigned char *) malloc(2 * sizeof(unsigned char));
3237:
3238: if (chaine != NULL)
3239: {
3240: strcpy(chaine, "[");
3241:
3242: for(i = 0; i < nombre_colonnes; i++)
3243: {
1.58 bertrand 3244: chaine_formatee = formateur_nombre(s_etat_processus,
1.1 bertrand 3245: &(((real8 *) ((*((struct_vecteur *)
3246: ((*s_objet).objet))).tableau))[i]), 'R');
3247:
3248: if (chaine_formatee == NULL)
3249: {
3250: (*s_etat_processus).erreur_systeme =
3251: d_es_allocation_memoire;
3252: return(NULL);
3253: }
3254:
3255: chaine_sauvegarde = chaine;
3256: chaine = (unsigned char *) malloc(
3257: (strlen(chaine_sauvegarde) + strlen(chaine_formatee)
3258: + 2) * sizeof(unsigned char));
3259:
3260: if (chaine == NULL)
3261: {
3262: (*s_etat_processus).erreur_systeme =
3263: d_es_allocation_memoire;
3264: return(NULL);
3265: }
3266:
3267: strcpy(chaine, chaine_sauvegarde);
3268: free(chaine_sauvegarde);
3269: strcat(chaine, " ");
3270: strcat(chaine, chaine_formatee);
3271: free(chaine_formatee);
3272: }
3273:
3274: chaine_sauvegarde = chaine;
3275: chaine = (unsigned char *) malloc(
3276: (strlen(chaine_sauvegarde) + 3)
3277: * sizeof(unsigned char));
3278:
3279: if (chaine == NULL)
3280: {
3281: (*s_etat_processus).erreur_systeme =
3282: d_es_allocation_memoire;
3283: return(NULL);
3284: }
3285:
3286: strcpy(chaine, chaine_sauvegarde);
3287: free(chaine_sauvegarde);
3288: strcat(chaine, " ]");
3289: }
3290: }
3291:
3292: return(chaine);
3293: }
3294:
3295:
3296: /*
3297: ================================================================================
3298: Routines qui transforment un nombre entier, réel ou complexe en chaîne de
3299: caractères suivant le format courant
3300: ================================================================================
3301: Entrées : pointeur générique sur la donnée numérique à convertir,
3302: type de l'entité (I, R ou C).
3303: --------------------------------------------------------------------------------
3304: Sorties : chaîne de caractères allouée dans la routine
3305: --------------------------------------------------------------------------------
3306: Effets de bord : néant
3307: ================================================================================
3308: */
3309:
3310: /*
3311: --------------------------------------------------------------------------------
3312: Formatage des complexes, réels et entiers
3313: --------------------------------------------------------------------------------
3314: */
3315:
3316: unsigned char *
3317: formateur_nombre(struct_processus *s_etat_processus,
3318: void *valeur_numerique, unsigned char type)
3319: {
3320: unsigned char *chaine;
3321: unsigned char *construction_chaine;
3322: unsigned char *sauvegarde;
3323: unsigned char *tampon;
3324:
3325: chaine = NULL;
3326:
3327: switch(type)
3328: {
3329: case 'C' :
3330: {
3331: construction_chaine = (unsigned char *) malloc(
3332: 2 * sizeof(unsigned char));
3333:
3334: if (construction_chaine == NULL)
3335: {
3336: (*s_etat_processus).erreur_systeme =
3337: d_es_allocation_memoire;
3338: return(NULL);
3339: }
3340:
3341: strcpy(construction_chaine, "(");
3342:
3343: tampon = formateur_reel(s_etat_processus,
1.58 bertrand 3344: &((*((struct_complexe16 *)
1.1 bertrand 3345: valeur_numerique)).partie_reelle), 'R');
3346:
3347: if (tampon == NULL)
3348: {
3349: (*s_etat_processus).erreur_systeme =
3350: d_es_allocation_memoire;
3351: return(NULL);
3352: }
3353:
3354: sauvegarde = construction_chaine;
3355:
3356: construction_chaine = (unsigned char *) malloc(
3357: (strlen(sauvegarde) + strlen(tampon) + 2)
3358: * sizeof(unsigned char));
3359:
3360: if (construction_chaine == NULL)
3361: {
3362: (*s_etat_processus).erreur_systeme =
3363: d_es_allocation_memoire;
3364: return(NULL);
3365: }
3366:
3367: strcpy(construction_chaine, sauvegarde);
3368: free(sauvegarde);
3369: strcat(construction_chaine, tampon);
3370: free(tampon);
3371:
3372: if (test_cfsf(s_etat_processus, 48) == d_faux)
3373: {
3374: strcat(construction_chaine, ",");
3375: }
3376: else
3377: {
3378: strcat(construction_chaine, ".");
3379: }
3380:
3381: tampon = formateur_reel(s_etat_processus,
1.58 bertrand 3382: &((*((struct_complexe16 *)
1.1 bertrand 3383: valeur_numerique)).partie_imaginaire), 'R');
3384:
3385: if (tampon == NULL)
3386: {
3387: (*s_etat_processus).erreur_systeme =
3388: d_es_allocation_memoire;
3389: return(NULL);
3390: }
3391:
3392: sauvegarde = construction_chaine;
3393:
3394: construction_chaine = (unsigned char *) malloc(
3395: (strlen(sauvegarde) + strlen(tampon) + 2)
3396: * sizeof(unsigned char));
3397:
3398: if (construction_chaine == NULL)
3399: {
3400: (*s_etat_processus).erreur_systeme =
3401: d_es_allocation_memoire;
3402: return(NULL);
3403: }
3404:
3405: strcpy(construction_chaine, sauvegarde);
3406: free(sauvegarde);
3407: strcat(construction_chaine, tampon);
3408: free(tampon);
3409: strcat(construction_chaine, ")");
3410:
3411: chaine = construction_chaine;
3412:
3413: break;
3414: }
3415:
3416: case 'R' :
3417: {
3418: chaine = formateur_reel(s_etat_processus, valeur_numerique, 'R');
3419:
3420: if (chaine == NULL)
3421: {
3422: (*s_etat_processus).erreur_systeme =
3423: d_es_allocation_memoire;
3424: return(NULL);
3425: }
3426:
3427: break;
3428: }
3429:
3430: default :
3431: case 'I' :
3432: {
3433: chaine = formateur_reel(s_etat_processus, valeur_numerique, 'I');
3434:
3435: if (chaine == NULL)
3436: {
3437: (*s_etat_processus).erreur_systeme =
3438: d_es_allocation_memoire;
3439: return(NULL);
3440: }
3441:
3442: break;
3443: }
3444: }
3445:
3446: return(chaine);
3447: }
3448:
3449:
3450: /*
3451: --------------------------------------------------------------------------------
3452: Formateur des réels et entiers
3453: --------------------------------------------------------------------------------
3454: */
3455:
3456: unsigned char *
3457: formateur_reel(struct_processus *s_etat_processus,
3458: void *valeur_numerique, unsigned char type)
3459: {
3460: real8 mantisse;
3461: real8 tampon_reel;
3462:
3463: integer8 tampon_entier;
3464:
3465: logical1 i49;
3466: logical1 i50;
3467:
3468: long correction;
1.4 bertrand 3469: long dernier_chiffre_significatif;
1.1 bertrand 3470: long exposant;
1.58 bertrand 3471: long i;
3472: long j;
1.1 bertrand 3473: long longueur_utile;
3474: long longueur_utile_limite;
3475:
3476: unsigned char *chaine;
1.3 bertrand 3477: unsigned char format[32 + 1];
1.1 bertrand 3478: unsigned char mode[3 + 1];
3479: unsigned char *ptr;
1.3 bertrand 3480: unsigned char tampon[32 + 1];
1.1 bertrand 3481:
3482: chaine = (unsigned char *) malloc((32 + 1) * sizeof(unsigned char));
3483:
3484: if (chaine == NULL)
3485: {
3486: (*s_etat_processus).erreur_systeme =
3487: d_es_allocation_memoire;
3488: return(NULL);
3489: }
3490:
3491: if (type == 'R')
3492: {
1.36 bertrand 3493: # ifdef FP_INFINITE
1.38 bertrand 3494: int signe;
3495:
3496: if ((signe = isinf((*((real8 *) valeur_numerique)))) != 0)
1.36 bertrand 3497: {
1.38 bertrand 3498: if (signe > 0)
3499: {
3500: strcpy(chaine, "infinity");
3501: }
3502: else
3503: {
3504: strcpy(chaine, "-infinity");
3505: }
3506:
1.36 bertrand 3507: return(chaine);
3508: }
3509: # endif
3510:
1.37 bertrand 3511: if (isnan((*((real8 *) valeur_numerique))))
3512: {
3513: strcpy(chaine, "undef");
3514: return(chaine);
3515: }
3516:
1.1 bertrand 3517: tampon_reel = *((real8 *) valeur_numerique);
3518:
3519: if (tampon_reel > ((real8) 0))
3520: {
3521: exposant = (long) floor(log10(tampon_reel));
3522: }
3523: else if (tampon_reel < ((real8) 0))
3524: {
3525: exposant = (long) floor(log10(-tampon_reel));
3526: }
3527: else
3528: {
3529: exposant = 0;
3530: }
3531:
1.58 bertrand 3532: mantisse = (*((real8 *) valeur_numerique)) / pow(10, (double) exposant);
1.1 bertrand 3533: }
3534: else
3535: {
3536: tampon_entier = *((integer8 *) valeur_numerique);
3537:
3538: if (tampon_entier > ((integer8) 0))
3539: {
1.58 bertrand 3540: exposant = (long) floor(log10((double) tampon_entier));
1.1 bertrand 3541: }
3542: else if (tampon_entier < ((integer8) 0))
3543: {
1.56 bertrand 3544: if (tampon_entier != INT64_MIN)
3545: {
1.58 bertrand 3546: exposant = (long) floor(log10((double) -tampon_entier));
1.56 bertrand 3547: }
3548: else
3549: {
3550: tampon_reel = (real8) tampon_entier;
3551: exposant = (long) floor(log10(-tampon_reel));
3552: }
1.1 bertrand 3553: }
3554: else
3555: {
3556: exposant = 0;
3557: }
3558:
1.58 bertrand 3559: mantisse = ((real8) (*((integer8 *) valeur_numerique))) /
3560: pow(10, (double) exposant);
1.1 bertrand 3561: }
3562:
3563: longueur_utile = 0;
3564: j = 1;
3565:
3566: for(i = 53; i <= 56; i++)
3567: {
3568: longueur_utile += (test_cfsf(s_etat_processus, (unsigned char) i)
3569: == d_vrai) ? j : 0;
3570: j *= 2;
3571: }
3572:
3573: longueur_utile_limite = 15;
3574:
3575: if (longueur_utile > longueur_utile_limite)
3576: {
3577: longueur_utile = longueur_utile_limite;
3578: }
3579:
3580: i49 = test_cfsf(s_etat_processus, 49);
3581: i50 = test_cfsf(s_etat_processus, 50);
3582:
3583: if (i49 == d_faux)
3584: {
3585: if (i50 == d_faux)
3586: {
3587:
3588: /*
3589: --------------------------------------------------------------------------------
3590: Mode standard
3591: --------------------------------------------------------------------------------
3592: */
3593:
3594: strcpy(mode, "STD");
3595: }
3596: else
3597: {
3598:
3599: /*
3600: --------------------------------------------------------------------------------
3601: Mode scientifique
3602: --------------------------------------------------------------------------------
3603: */
3604:
3605: strcpy(mode, "SCI");
3606: }
3607: }
3608: else
3609: {
3610: if (i50 == d_faux)
3611: {
3612:
3613: /*
3614: --------------------------------------------------------------------------------
3615: Mode fixe
3616: --------------------------------------------------------------------------------
3617: */
3618:
3619: strcpy(mode, "FIX");
3620: }
3621: else
3622: {
3623:
3624: /*
3625: --------------------------------------------------------------------------------
3626: Mode ingénieur
3627: --------------------------------------------------------------------------------
3628: */
3629:
3630: strcpy(mode, "ENG");
3631: }
3632: }
3633:
1.4 bertrand 3634: // Test portant sur le nombre de chiffres significatifs dans
3635: // le cas du format STD pour que 1.2E-15 apparaisse en notation
3636: // SCI car il y a une perte de précision dans l'affichage.
3637:
3638: if ((strcmp(mode, "STD") == 0) && (type == 'R'))
3639: {
3640: if (abs(*((real8 *) valeur_numerique)) < 1)
3641: {
3642: dernier_chiffre_significatif = -exposant;
3643: sprintf(tampon, ".%f", mantisse);
3644:
3645: ptr = &(tampon[strlen(tampon) - 1]);
3646:
3647: while((*ptr) != '.')
3648: {
3649: if ((*ptr) != '0')
3650: {
3651: dernier_chiffre_significatif++;
3652: }
3653:
3654: ptr--;
3655: }
3656: }
3657: else
3658: {
3659: dernier_chiffre_significatif = 0;
3660: }
3661: }
3662: else
3663: {
3664: dernier_chiffre_significatif = 0;
3665: }
3666:
1.1 bertrand 3667: if ((strcmp(mode, "SCI") == 0) ||
3668: ((strcmp(mode, "STD") == 0) && ((exposant >
1.4 bertrand 3669: longueur_utile_limite) || (dernier_chiffre_significatif > 15) ||
1.1 bertrand 3670: (exposant < -longueur_utile_limite))) ||
3671: ((strcmp(mode, "FIX") == 0) &&
3672: ((exposant >= longueur_utile_limite) ||
3673: (exposant < -longueur_utile))))
3674: {
3675: chaine[0] = d_code_fin_chaine;
3676: format[0] = d_code_fin_chaine;
3677:
3678: if (strcmp(mode, "STD") == 0)
3679: {
3680: longueur_utile = longueur_utile_limite - 1;
3681: }
3682:
3683: sprintf(format, "%%.%luf", longueur_utile);
3684: sprintf(tampon, format, mantisse);
3685: strcpy(chaine, tampon);
3686:
3687: if (strcmp(mode, "STD") == 0)
3688: {
3689: ptr = &(chaine[strlen(chaine) - 1]);
3690: while(((*ptr) == '0') || ((*ptr) == '.'))
3691: {
3692: (*ptr) = d_code_fin_chaine;
3693: ptr--;
3694: }
3695: }
3696:
3697: strcat(chaine, "E");
3698: sprintf(tampon, "%ld", exposant);
3699: strcat(chaine, tampon);
3700: }
3701: else if (strcmp(mode, "FIX") == 0)
3702: {
3703: chaine[0] = d_code_fin_chaine;
3704: format[0] = d_code_fin_chaine;
3705:
3706: if (longueur_utile + exposant >= longueur_utile_limite)
3707: {
3708: longueur_utile = longueur_utile_limite - (exposant + 1);
3709: }
3710:
3711: sprintf(format, "%%.%luf", longueur_utile);
3712:
1.58 bertrand 3713: sprintf(tampon, format, (mantisse * pow(10, (double) exposant)));
1.1 bertrand 3714: strcpy(chaine, tampon);
3715: }
3716: else if (strcmp(mode, "ENG") == 0)
3717: {
3718: chaine[0] = d_code_fin_chaine;
3719: format[0] = d_code_fin_chaine;
3720:
3721: correction = labs(exposant) % 3;
3722:
3723: if (exposant < 0)
3724: {
3725: if (correction == 0)
3726: {
3727: correction = 3;
3728: }
3729:
3730: correction = 3 - correction;
3731: }
3732:
3733: longueur_utile -= correction;
3734: sprintf(format, "%%.%luf", longueur_utile);
3735:
1.58 bertrand 3736: sprintf(tampon, format, (mantisse * pow(10, (double) correction)));
1.1 bertrand 3737: strcpy(chaine, tampon);
3738: strcat(chaine, "E");
3739: sprintf(tampon, "%ld", (exposant - correction));
3740: strcat(chaine, tampon);
3741: }
3742: else
3743: {
3744: if (type == 'I')
3745: {
3746: chaine[0] = d_code_fin_chaine;
3747: sprintf(tampon, "%lld", *((integer8 *) valeur_numerique));
3748: }
3749: else
3750: {
3751: chaine[0] = d_code_fin_chaine;
3752: format[0] = d_code_fin_chaine;
3753:
3754: if (exposant >= 0)
3755: {
1.27 bertrand 3756: if ((exposant + 1) < longueur_utile_limite)
3757: {
3758: sprintf(format, "%%.%luf", (longueur_utile_limite - exposant
3759: - 1));
3760: }
3761: else
3762: {
3763: strcpy(format, "%.0f.");
3764: }
1.1 bertrand 3765: }
3766: else
3767: {
3768: sprintf(format, "%%.%luf", longueur_utile_limite);
3769: }
3770:
3771: sprintf(tampon, format, *((real8 *) valeur_numerique));
3772:
1.58 bertrand 3773: i = ((long) strlen(tampon)) - 1;
1.1 bertrand 3774: while(tampon[i] == '0')
3775: {
3776: tampon[i] = d_code_fin_chaine;
3777: i--;
3778: }
3779:
3780: if (ds_imposition_separateur_decimal == d_faux)
3781: {
1.58 bertrand 3782: i = ((long) strlen(tampon)) - 1;
1.1 bertrand 3783: if (tampon[i] == '.')
3784: {
3785: tampon[i] = d_code_fin_chaine;
3786: }
3787: }
3788: }
1.4 bertrand 3789:
1.1 bertrand 3790: strcpy(chaine, tampon);
3791: }
3792:
3793: if (test_cfsf(s_etat_processus, 48) == d_vrai)
3794: {
1.58 bertrand 3795: for(i = 0; i < (long) strlen(chaine); i++)
1.1 bertrand 3796: {
3797: if (chaine[i] == '.')
3798: {
3799: chaine[i] = ',';
3800: }
3801: }
3802: }
3803:
3804: return(chaine);
3805: }
3806:
3807: // vim: ts=4
CVSweb interface <joel.bertrand@systella.fr>