Annotation of rpl/modules/sets/types.rplc, revision 1.3
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.1 bertrand 11: declareTypeExtension(parse)
12: if ((*rptr) == '(')
13: {
14: rptr++;
15:
16: if ((*rptr) == '[')
17: {
18: rptr++;
19: while((*rptr) != 0)
20: {
21: switch (*rptr)
22: {
23: case '0':
24: case '1':
25: case '2':
26: case '3':
27: case '4':
28: case '5':
29: case '6':
30: case '7':
31: case '8':
32: case '9':
33: case ' ':
34: {
35: break;
36: }
37:
38: case ']':
39: {
40: rptr++;
41:
42: if ((*rptr) == ')')
43: {
44: rptr++;
45: return(sizeOfParse);
46: }
47: else
48: {
49: parseError;
50: }
51: }
52:
53: default:
54: {
55: parseError;
56: }
57: }
58:
59: rptr++;
60: }
61: }
62: }
63: endTypeExtension
64:
1.3 ! bertrand 65: static int
! 66: fonction_ordre(const void *a, const void *b)
! 67: {
! 68: if ((*((integer8 *) a)) < (*((integer8 *) b)))
! 69: {
! 70: return(-1);
! 71: }
! 72: if ((*((integer8 *) a)) > (*((integer8 *) b)))
! 73: {
! 74: return(1);
! 75: }
! 76:
! 77: return(0);
! 78: }
! 79:
1.1 bertrand 80: declareTypeExtension(new)
1.2 bertrand 81: // Si le premier caractère de la chaîne est '(' et que le dernier est ')',
82: // on les retire.
83:
1.3 ! bertrand 84: char *tmp;
! 85:
! 86: integer8 current_value;
! 87: integer8 i;
! 88: integer8 j;
! 89: integer8 nb_elements;
! 90: integer8 *vecteur;
1.2 bertrand 91:
92: if (((*iptr) == '(') && ((*(iptr + strlen(iptr) - 1)) == ')'))
93: {
94: if ((tmp = malloc((strlen(iptr) + 1) * sizeof(unsigned char)))
95: == NULL)
96: {
97: typeError;
98: }
99:
100: // Sauvegarde de l'instruction courante.
101: strcpy(tmp, iptr);
102:
103: // Création d'une nouvelle instruction courante amputée de ses premier
104: // et dernier caractères.
105: memmove(iptr, iptr + 1, strlen(iptr) - 2);
106: *(iptr + strlen(iptr) - 2) = 0;
107:
1.3 ! bertrand 108: searchType(free(iptr), iptr = tmp);
1.2 bertrand 109:
110: // Restauration de l'instruction courante
111: free(iptr);
112: iptr = tmp;
113:
1.3 ! bertrand 114: // On doit avoir un vecteur d'entier au niveau 1 de la pile.
! 115: // Si ce n'est pas le cas, il y a une erreur.
! 116:
! 117: if ((*(*(*s_etat_processus).l_base_pile).donnee).type != VIN)
! 118: {
! 119: typeError;
! 120: }
! 121:
! 122: nb_elements = (*((struct_vecteur *) (*(*(*s_etat_processus)
! 123: .l_base_pile).donnee).objet)).taille;
! 124:
! 125: if (nb_elements > 0)
! 126: {
! 127: if ((vecteur = malloc(nb_elements * sizeof(integer8))) == NULL)
! 128: {
! 129: typeError;
! 130: }
! 131:
! 132: for(i = 0; i < nb_elements; i++)
! 133: {
! 134: vecteur[i] = ((integer8 *) (*((struct_vecteur *)
! 135: (*(*(*s_etat_processus)
! 136: .l_base_pile).donnee).objet)).tableau)[i];
! 137: }
! 138:
! 139: qsort(vecteur, nb_elements, sizeof(integer8), fonction_ordre);
! 140:
! 141: // Élimination des doublons
! 142:
! 143: current_value = vecteur[0];
! 144:
! 145: for(i = 1, j = 1; i < nb_elements; i++)
! 146: {
! 147: if (vecteur[i] != current_value)
! 148: {
! 149: vecteur[j++] = vecteur[i];
! 150: current_value = vecteur[i];
! 151: }
! 152: }
! 153:
! 154: nb_elements = j;
! 155:
! 156: if ((vecteur = realloc(vecteur, nb_elements * sizeof(integer8)))
! 157: == NULL)
! 158: {
! 159: typeError;
! 160: }
! 161:
! 162: free(vecteur);
! 163: }
! 164: else
! 165: {
! 166: // cas de l'ensemble vide
! 167: if ((vecteur = malloc(0)) == NULL)
! 168: {
! 169: typeError;
! 170: }
! 171: }
! 172:
! 173: if (((*arg) = malloc(sizeof(set_t))) == NULL)
1.2 bertrand 174: {
175: typeError;
176: }
177:
1.3 ! bertrand 178: (**((set_t **) arg)).size = nb_elements;
! 179: (**((set_t **) arg)).values = vecteur;
! 180:
1.2 bertrand 181: instruction_drop(s_etat_processus);
182: typeFound(ISET);
183: }
184:
185: typeError;
1.1 bertrand 186: endTypeExtension
187:
1.3 ! bertrand 188: declareTypeExtension(dup)
! 189: integer8 i;
! 190:
! 191: struct_objet *n_arg;
! 192:
! 193: if ((n_arg = allocation(s_etat_processus, EXT)) == NULL)
! 194: {
! 195: typeError;
! 196: }
! 197:
! 198: if (((*n_arg).objet = malloc(sizeof(set_t))) == NULL)
! 199: {
! 200: typeError;
! 201: }
! 202:
! 203: (*((set_t *) ((*n_arg).objet))).size = (*((set_t *) (**((struct_objet **)
! 204: arg)).objet)).size;
! 205: (*n_arg).descripteur_bibliotheque =
! 206: (**((struct_objet **) arg)).descripteur_bibliotheque;
! 207: (*n_arg).extension_type =
! 208: (**((struct_objet **) arg)).extension_type;
! 209:
! 210: for(i = 0; i < (*((set_t *) (**((struct_objet **) arg)).objet)).size; i++)
! 211: {
! 212: (*((set_t *) ((*n_arg).objet))).values[i] =
! 213: (*((set_t *) (**((struct_objet **) arg)).objet)).values[i];
! 214: }
! 215:
! 216: arg = (void **) &n_arg;
! 217: typeSuccess;
! 218: endTypeExtension
! 219:
! 220: declareTypeExtension(drop)
! 221: // On ne libère surtout pas struct_objet
! 222: free((*((set_t *) (**((struct_objet **) arg)).objet)).values);
! 223: free((**((struct_objet **) arg)).objet);
! 224: typeSuccess;
! 225: endTypeExtension
! 226:
1.2 bertrand 227: declareTypeExtension(disp)
228: (*arg) = malloc(10);
229: strcpy((*arg), "ici");
1.3 ! bertrand 230: // formateur_nombre(s_etat_processus, void* valeur, 'I');
! 231: typeSuccess;
1.1 bertrand 232: endTypeExtension
233:
CVSweb interface <joel.bertrand@systella.fr>