Annotation of rpl/src/formateur_flux.c, revision 1.14
1.1 bertrand 1: /*
2: ================================================================================
1.13 bertrand 3: RPL/2 (R) version 4.1.4
1.1 bertrand 4: Copyright (C) 1989-2011 Dr. BERTRAND Joël
5:
6: This file is part of RPL/2.
7:
8: RPL/2 is free software; you can redistribute it and/or modify it
9: under the terms of the CeCILL V2 License as published by the french
10: CEA, CNRS and INRIA.
11:
12: RPL/2 is distributed in the hope that it will be useful, but WITHOUT
13: ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
14: FITNESS FOR A PARTICULAR PURPOSE. See the CeCILL V2 License
15: for more details.
16:
17: You should have received a copy of the CeCILL License
18: along with RPL/2. If not, write to info@cecill.info.
19: ================================================================================
20: */
21:
22:
23: #include "rpl-conv.h"
24:
25:
26: /*
27: ================================================================================
28: Routine de formation des données pour l'envoi de flux binaires
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_flux(struct_processus *s_etat_processus, unsigned char *donnees,
40: long *longueur)
41: {
42: unsigned char *chaine;
43:
44: unsigned char *ptr_ecriture;
45: unsigned char *ptr_lecture;
46:
47: if ((chaine = malloc((strlen(donnees) + 1) * sizeof(unsigned char)))
48: == NULL)
49: {
50: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
51: return(NULL);
52: }
53:
54: ptr_lecture = donnees;
55: ptr_ecriture = chaine;
56:
57: while((*ptr_lecture) != d_code_fin_chaine)
58: {
59: (*ptr_ecriture) = (*ptr_lecture);
60:
61: // Début de la séquence d'échappement
62:
63: if ((*ptr_lecture) == '\\')
64: {
65: if ((*(ptr_lecture + 1)) == '"')
66: {
67: ptr_lecture++;
68: (*ptr_ecriture) = '\"';
69: }
70: else if ((*(ptr_lecture + 1)) == 'b')
71: {
72: ptr_lecture++;
73: (*ptr_ecriture) = '\b';
74: }
75: else if ((*(ptr_lecture + 1)) == 'n')
76: {
77: ptr_lecture++;
78: (*ptr_ecriture) = '\n';
79: }
80: else if ((*(ptr_lecture + 1)) == 't')
81: {
82: ptr_lecture++;
83: (*ptr_ecriture) = '\t';
84: }
85: else if ((*(ptr_lecture + 1)) == 'x')
86: {
87: ptr_lecture += 2;
88:
89: if ((*ptr_lecture) != d_code_fin_chaine)
90: {
91: if ((*(ptr_lecture + 1)) != d_code_fin_chaine)
92: {
93: logical1 erreur;
94: unsigned char ec;
95:
96: erreur = d_faux;
97:
98: switch(*ptr_lecture)
99: {
100: case '0':
101: case '1':
102: case '2':
103: case '3':
104: case '4':
105: case '5':
106: case '6':
107: case '7':
108: case '8':
109: case '9':
110: ec = (*ptr_lecture) - '0';
111: break;
112:
113: case 'A':
114: case 'B':
115: case 'C':
116: case 'D':
117: case 'E':
118: case 'F':
119: ec = ((*ptr_lecture) - 'A') + 10;
120: break;
121:
122: default:
123: ec = 0;
124: erreur = d_vrai;
125: break;
126: }
127:
128: ec *= 0x10;
129: ptr_lecture++;
130:
131: switch(*ptr_lecture)
132: {
133: case '0':
134: case '1':
135: case '2':
136: case '3':
137: case '4':
138: case '5':
139: case '6':
140: case '7':
141: case '8':
142: case '9':
143: ec += (*ptr_lecture) - '0';
144: break;
145:
146: case 'A':
147: case 'B':
148: case 'C':
149: case 'D':
150: case 'E':
151: case 'F':
152: ec += ((*ptr_lecture) - 'A') + 10;
153: break;
154:
155: default:
156: erreur = d_vrai;
157: break;
158: }
159:
160: (*ptr_ecriture) = ec;
161:
162: if (erreur == d_vrai)
163: {
164: if ((*s_etat_processus).langue == 'F')
165: {
166: printf("+++Information : "
167: "Séquence d'échappement "
168: "inconnue [%d]\n",
169: (int) getpid());
170: }
171: else
172: {
173: printf("+++Warning : Unknown "
174: "escape code "
175: "[%d]\n", (int) getpid());
176: }
177: }
178: }
179: else
180: {
181: if ((*s_etat_processus).langue == 'F')
182: {
183: printf("+++Information : "
184: "Séquence d'échappement "
185: "inconnue [%d]\n", (int) getpid());
186: }
187: else
188: {
189: printf("+++Warning : Unknown escape code "
190: "[%d]\n", (int) getpid());
191: }
192: }
193: }
194: else
195: {
196: if ((*s_etat_processus).langue == 'F')
197: {
198: printf("+++Information : "
199: "Séquence d'échappement "
200: "inconnue [%d]\n", (int) getpid());
201: }
202: else
203: {
204: printf("+++Warning : Unknown escape code "
205: "[%d]\n", (int) getpid());
206: }
207: }
208: }
209: else if ((*(ptr_lecture + 1)) == '\\')
210: {
211: ptr_lecture++;
212: }
213: else
214: {
215: if ((*s_etat_processus).langue == 'F')
216: {
217: printf("+++Information : Séquence d'échappement "
218: "inconnue [%d]\n", (int) getpid());
219: }
220: else
221: {
222: printf("+++Warning : Unknown escape code "
223: "[%d]\n", (int) getpid());
224: }
225: }
226: }
227:
228: ptr_ecriture++;
229: ptr_lecture++;
230: }
231:
232: (*ptr_ecriture) = d_code_fin_chaine;
233:
234: if ((chaine = realloc(chaine, ((((*longueur) = ptr_ecriture - chaine)) + 1)
235: * sizeof(unsigned char))) == NULL)
236: {
237: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
238: return(NULL);
239: }
240:
241: return(chaine);
242: }
243:
1.14 ! bertrand 244:
! 245: /*
! 246: ================================================================================
! 247: Routine permettant de trouver le caractère suivant dans une chaîne
! 248: ================================================================================
! 249: Entrées : structure sur l'état du processus et chaîne courante
! 250: --------------------------------------------------------------------------------
! 251: Sorties : pointeur sur le caractère suivant
! 252: --------------------------------------------------------------------------------
! 253: Effets de bord : néant
! 254: ================================================================================
! 255: */
! 256:
! 257: static inline unsigned char *
! 258: prochain_caractere(struct_processus *s_etat_processus, unsigned char *chaine)
! 259: {
! 260: unsigned char *suivant;
! 261:
! 262: if ((*chaine) == '\\')
! 263: {
! 264: if ((*(chaine + 1)) == '"')
! 265: {
! 266: suivant = chaine + 2;
! 267: }
! 268: else if ((*(chaine + 1)) == 'b')
! 269: {
! 270: suivant = chaine + 2;
! 271: }
! 272: else if ((*(chaine + 1)) == 'n')
! 273: {
! 274: suivant = chaine + 2;
! 275: }
! 276: else if ((*(chaine + 1)) == 't')
! 277: {
! 278: suivant = chaine + 2;
! 279: }
! 280: else if ((*(chaine + 1)) == 'x')
! 281: {
! 282: if ((*(chaine + 2)) != d_code_fin_chaine)
! 283: {
! 284: if ((*(chaine + 3)) != d_code_fin_chaine)
! 285: {
! 286: logical1 erreur;
! 287:
! 288: erreur = d_faux;
! 289:
! 290: switch(*(chaine + 2))
! 291: {
! 292: case '0':
! 293: case '1':
! 294: case '2':
! 295: case '3':
! 296: case '4':
! 297: case '5':
! 298: case '6':
! 299: case '7':
! 300: case '8':
! 301: case '9':
! 302: case 'A':
! 303: case 'B':
! 304: case 'C':
! 305: case 'D':
! 306: case 'E':
! 307: case 'F':
! 308: break;
! 309:
! 310: default:
! 311: erreur = d_vrai;
! 312: break;
! 313: }
! 314:
! 315: switch(*(chaine + 3))
! 316: {
! 317: case '0':
! 318: case '1':
! 319: case '2':
! 320: case '3':
! 321: case '4':
! 322: case '5':
! 323: case '6':
! 324: case '7':
! 325: case '8':
! 326: case '9':
! 327: case 'A':
! 328: case 'B':
! 329: case 'C':
! 330: case 'D':
! 331: case 'E':
! 332: case 'F':
! 333: break;
! 334:
! 335: default:
! 336: erreur = d_vrai;
! 337: break;
! 338: }
! 339:
! 340: if (erreur == d_vrai)
! 341: {
! 342: if ((*s_etat_processus).langue == 'F')
! 343: {
! 344: printf("+++Information : "
! 345: "Séquence d'échappement "
! 346: "inconnue [%d]\n",
! 347: (int) getpid());
! 348: }
! 349: else
! 350: {
! 351: printf("+++Warning : Unknown "
! 352: "escape code "
! 353: "[%d]\n", (int) getpid());
! 354: }
! 355:
! 356: return(NULL);
! 357: }
! 358:
! 359: suivant = chaine + 4;
! 360: }
! 361: else
! 362: {
! 363: if ((*s_etat_processus).langue == 'F')
! 364: {
! 365: printf("+++Information : "
! 366: "Séquence d'échappement "
! 367: "inconnue [%d]\n", (int) getpid());
! 368: }
! 369: else
! 370: {
! 371: printf("+++Warning : Unknown escape code "
! 372: "[%d]\n", (int) getpid());
! 373: }
! 374:
! 375: return(NULL);
! 376: }
! 377: }
! 378: else
! 379: {
! 380: if ((*s_etat_processus).langue == 'F')
! 381: {
! 382: printf("+++Information : "
! 383: "Séquence d'échappement "
! 384: "inconnue [%d]\n", (int) getpid());
! 385: }
! 386: else
! 387: {
! 388: printf("+++Warning : Unknown escape code "
! 389: "[%d]\n", (int) getpid());
! 390: }
! 391:
! 392: return(NULL);
! 393: }
! 394: }
! 395: else if ((*(chaine + 1)) == '\\')
! 396: {
! 397: suivant = chaine + 1;
! 398: }
! 399: else
! 400: {
! 401: if ((*s_etat_processus).langue == 'F')
! 402: {
! 403: printf("+++Information : Séquence d'échappement "
! 404: "inconnue [%d]\n", (int) getpid());
! 405: }
! 406: else
! 407: {
! 408: printf("+++Warning : Unknown escape code "
! 409: "[%d]\n", (int) getpid());
! 410: }
! 411:
! 412: return(NULL);
! 413: }
! 414: }
! 415: else
! 416: {
! 417: suivant = chaine + 1;
! 418: }
! 419:
! 420: return(suivant);
! 421: }
! 422:
! 423:
! 424: /*
! 425: ================================================================================
! 426: Routine donnant la longueur d'une chaîne de caractères
! 427: ================================================================================
! 428: Entrées : structure sur l'état du processus et chaîne
! 429: --------------------------------------------------------------------------------
! 430: Sorties : longueur de la chaîne
! 431: --------------------------------------------------------------------------------
! 432: Effets de bord : néant
! 433: ================================================================================
! 434: */
! 435:
! 436: integer8
! 437: longueur_chaine(struct_processus *s_etat_processus, unsigned char *chaine)
! 438: {
! 439: integer8 nombre_caracteres;
! 440:
! 441: unsigned char *pointeur;
! 442:
! 443: pointeur = chaine;
! 444: nombre_caracteres = 0;
! 445:
! 446: if ((*pointeur) == '\0')
! 447: {
! 448: return(0);
! 449: }
! 450:
! 451: do
! 452: {
! 453: if ((pointeur = prochain_caractere(s_etat_processus, pointeur)) == NULL)
! 454: {
! 455: return(0);
! 456: }
! 457:
! 458: nombre_caracteres++;
! 459: } while((*pointeur) != 0);
! 460:
! 461: return(nombre_caracteres);
! 462: }
! 463:
1.1 bertrand 464: // vim: ts=4
CVSweb interface <joel.bertrand@systella.fr>