Annotation of rpl/modules/sets/types.rplc, revision 1.5
1.1 bertrand 1: #define TYPE_DECLARATION
2: #include "src/rplexternals.h"
3: #include "sets.h"
4:
5: // Les objets de type ensemble sont délimités par ([ ]) et ne contiennent
6: // que des entiers.
7:
1.2 bertrand 8: // Attention : ces fonctions sont à écrire directement en C et non
9: // en RPL/C car elles interviennent dans le noyau RPL/2.
10:
1.4 bertrand 11: /*
12: ================================================================================
13: Fonction permettant d'extraire un objet d'une suite de caractères
14:
15: Cette fonction est utilisée par la routine recherche_instruction_suivante()
16: du RPL/2.
17: ================================================================================
18: */
19:
1.1 bertrand 20: declareTypeExtension(parse)
21: if ((*rptr) == '(')
22: {
23: rptr++;
24:
25: if ((*rptr) == '[')
26: {
27: rptr++;
28: while((*rptr) != 0)
29: {
30: switch (*rptr)
31: {
32: case '0':
33: case '1':
34: case '2':
35: case '3':
36: case '4':
37: case '5':
38: case '6':
39: case '7':
40: case '8':
41: case '9':
42: case ' ':
43: {
44: break;
45: }
46:
47: case ']':
48: {
49: rptr++;
50:
51: if ((*rptr) == ')')
52: {
53: rptr++;
54: return(sizeOfParse);
55: }
56: else
57: {
58: parseError;
59: }
60: }
61:
62: default:
63: {
64: parseError;
65: }
66: }
67:
68: rptr++;
69: }
70: }
71: }
72: endTypeExtension
73:
1.4 bertrand 74:
75: /*
76: ================================================================================
77: La fonction declareTypeExtension(new) est utilisée par la fonction
78: recherche_type() du RPL/2. Elle se charge d'allouer et d'initialiser
79: le champ objet de la struct_objet allouée par recherche_type().
80: ================================================================================
81: */
82:
1.3 bertrand 83: static int
84: fonction_ordre(const void *a, const void *b)
85: {
86: if ((*((integer8 *) a)) < (*((integer8 *) b)))
87: {
88: return(-1);
89: }
90: if ((*((integer8 *) a)) > (*((integer8 *) b)))
91: {
92: return(1);
93: }
94:
95: return(0);
96: }
97:
1.1 bertrand 98: declareTypeExtension(new)
1.2 bertrand 99: // Si le premier caractère de la chaîne est '(' et que le dernier est ')',
100: // on les retire.
101:
1.3 bertrand 102: char *tmp;
103:
104: integer8 current_value;
105: integer8 i;
106: integer8 j;
107: integer8 nb_elements;
108: integer8 *vecteur;
1.2 bertrand 109:
110: if (((*iptr) == '(') && ((*(iptr + strlen(iptr) - 1)) == ')'))
111: {
112: if ((tmp = malloc((strlen(iptr) + 1) * sizeof(unsigned char)))
113: == NULL)
114: {
1.4 bertrand 115: typeSystemError;
1.2 bertrand 116: }
117:
118: // Sauvegarde de l'instruction courante.
119: strcpy(tmp, iptr);
120:
121: // Création d'une nouvelle instruction courante amputée de ses premier
122: // et dernier caractères.
123: memmove(iptr, iptr + 1, strlen(iptr) - 2);
124: *(iptr + strlen(iptr) - 2) = 0;
125:
1.4 bertrand 126: searchType(strcpy(iptr, tmp), free(tmp));
1.2 bertrand 127:
128: // Restauration de l'instruction courante
1.4 bertrand 129: strcpy(iptr, tmp);
130: free(tmp);
1.2 bertrand 131:
1.4 bertrand 132: // On doit avoir un vecteur d'entiers au niveau 1 de la pile.
1.3 bertrand 133: // Si ce n'est pas le cas, il y a une erreur.
134:
135: if ((*(*(*s_etat_processus).l_base_pile).donnee).type != VIN)
136: {
137: typeError;
138: }
139:
140: nb_elements = (*((struct_vecteur *) (*(*(*s_etat_processus)
141: .l_base_pile).donnee).objet)).taille;
142:
143: if (nb_elements > 0)
144: {
145: if ((vecteur = malloc(nb_elements * sizeof(integer8))) == NULL)
146: {
1.4 bertrand 147: typeSystemError;
1.3 bertrand 148: }
149:
150: for(i = 0; i < nb_elements; i++)
151: {
152: vecteur[i] = ((integer8 *) (*((struct_vecteur *)
153: (*(*(*s_etat_processus)
154: .l_base_pile).donnee).objet)).tableau)[i];
155: }
156:
157: qsort(vecteur, nb_elements, sizeof(integer8), fonction_ordre);
158:
159: // Élimination des doublons
160:
161: current_value = vecteur[0];
162:
163: for(i = 1, j = 1; i < nb_elements; i++)
164: {
165: if (vecteur[i] != current_value)
166: {
167: vecteur[j++] = vecteur[i];
168: current_value = vecteur[i];
169: }
170: }
171:
172: nb_elements = j;
173:
174: if ((vecteur = realloc(vecteur, nb_elements * sizeof(integer8)))
175: == NULL)
176: {
1.4 bertrand 177: typeSystemError;
1.3 bertrand 178: }
179: }
180: else
181: {
182: // cas de l'ensemble vide
183: if ((vecteur = malloc(0)) == NULL)
184: {
1.4 bertrand 185: typeSystemError;
1.3 bertrand 186: }
187: }
188:
189: if (((*arg) = malloc(sizeof(set_t))) == NULL)
1.2 bertrand 190: {
1.4 bertrand 191: typeSystemError;
1.2 bertrand 192: }
193:
1.3 bertrand 194: (**((set_t **) arg)).size = nb_elements;
195: (**((set_t **) arg)).values = vecteur;
196:
1.2 bertrand 197: instruction_drop(s_etat_processus);
198: typeFound(ISET);
199: }
200:
201: typeError;
1.1 bertrand 202: endTypeExtension
203:
1.4 bertrand 204:
205: /*
206: ================================================================================
207: Fonction de duplication d'un objet.
208:
209: Cet objet doit être alloué puis copié.
210: ================================================================================
211: */
212:
1.3 bertrand 213: declareTypeExtension(dup)
214: integer8 i;
215:
216: struct_objet *n_arg;
217:
218: if ((n_arg = allocation(s_etat_processus, EXT)) == NULL)
219: {
1.4 bertrand 220: typeSystemError;
1.3 bertrand 221: }
222:
223: if (((*n_arg).objet = malloc(sizeof(set_t))) == NULL)
224: {
1.4 bertrand 225: typeSystemError;
1.3 bertrand 226: }
227:
228: (*((set_t *) ((*n_arg).objet))).size = (*((set_t *) (**((struct_objet **)
229: arg)).objet)).size;
230: (*n_arg).descripteur_bibliotheque =
231: (**((struct_objet **) arg)).descripteur_bibliotheque;
232: (*n_arg).extension_type =
233: (**((struct_objet **) arg)).extension_type;
234:
1.5 ! bertrand 235: if (((*((set_t *) ((*n_arg).objet))).values = malloc((*((set_t *)
! 236: ((*n_arg).objet))).size * sizeof(integer8))) == NULL)
! 237: {
! 238: typeSystemError;
! 239: }
! 240:
1.3 bertrand 241: for(i = 0; i < (*((set_t *) (**((struct_objet **) arg)).objet)).size; i++)
242: {
243: (*((set_t *) ((*n_arg).objet))).values[i] =
244: (*((set_t *) (**((struct_objet **) arg)).objet)).values[i];
245: }
246:
1.5 ! bertrand 247: (*((struct_objet **) arg)) = n_arg;
1.3 bertrand 248: typeSuccess;
249: endTypeExtension
250:
1.4 bertrand 251:
252: /*
253: ================================================================================
254: Fonction de libération d'un objet. À l'instar de la fonction new qui n'alloue
255: pas la struct_objet, la fonction drop ne doit pas la libérer.
256: ================================================================================
257: */
258:
1.3 bertrand 259: declareTypeExtension(drop)
260: free((*((set_t *) (**((struct_objet **) arg)).objet)).values);
261: free((**((struct_objet **) arg)).objet);
262: typeSuccess;
263: endTypeExtension
264:
1.4 bertrand 265:
266: /*
267: ================================================================================
268: Fonction créant une chaîne de caractère depuis l'objet pour affichage
269: ================================================================================
270: */
271:
1.2 bertrand 272: declareTypeExtension(disp)
1.4 bertrand 273: int i;
274:
275: string e;
276: string s;
277: string t;
278:
279: if ((s = malloc(3 * sizeof(unsigned char))) == NULL)
280: {
281: typeSystemError;
282: }
283:
284: strcpy(s, "([");
285:
286: for(i = 0; i < (*((set_t *) (*((struct_objet *) (*arg))).objet)).size; i++)
287: {
288: if ((e = (string) integerFormat(&((*((set_t *)
289: (*((struct_objet *) (*arg))).objet)).values[i]))) == NULL)
290: {
291: typeSystemError;
292: }
293:
294: t = s;
295:
296: if ((s = malloc((strlen(t) + strlen(e) + 2) * sizeof(unsigned char)))
297: == NULL)
298: {
299: typeSystemError;
300: }
301:
302: strcpy(s, t);
303: free(t);
304: strcat(s, " ");
305: strcat(s, e);
306: free(e);
307: }
308:
309: t = s;
310:
311: if ((s = malloc((strlen(t) + 4) * sizeof(unsigned char))) == NULL)
312: {
313: typeSystemError;
314: }
315:
316: strcpy(s, t);
317: free(t);
318: strcat(s, " ])");
319:
320: (*arg) = s;
1.3 bertrand 321: typeSuccess;
1.1 bertrand 322: endTypeExtension
323:
1.4 bertrand 324: // vim: ts=4
CVSweb interface <joel.bertrand@systella.fr>