--- rpl/modules/sets/types.rplc 2017/06/29 12:32:57 1.1 +++ rpl/modules/sets/types.rplc 2017/06/29 14:54:42 1.2 @@ -5,6 +5,9 @@ // Les objets de type ensemble sont délimités par ([ ]) et ne contiennent // que des entiers. +// Attention : ces fonctions sont à écrire directement en C et non +// en RPL/C car elles interviennent dans le noyau RPL/2. + declareTypeExtension(parse) if ((*rptr) == '(') { @@ -60,12 +63,62 @@ declareTypeExtension(parse) endTypeExtension declareTypeExtension(new) -endTypeExtension + // Si le premier caractère de la chaîne est '(' et que le dernier est ')', + // on les retire. -declareTypeExtension(dup) + char *tmp; + +printf("<1>\n"); + if (((*iptr) == '(') && ((*(iptr + strlen(iptr) - 1)) == ')')) + { + if ((tmp = malloc((strlen(iptr) + 1) * sizeof(unsigned char))) + == NULL) + { +printf("<2>\n"); + typeError; + } +printf("<3>\n"); + + // Sauvegarde de l'instruction courante. + strcpy(tmp, iptr); + + // Création d'une nouvelle instruction courante amputée de ses premier + // et dernier caractères. + memmove(iptr, iptr + 1, strlen(iptr) - 2); + *(iptr + strlen(iptr) - 2) = 0; + +printf("<4>\n"); + searchType; +printf("<5>\n"); + + // Restauration de l'instruction courante + free(iptr); +printf("<6>\n"); + iptr = tmp; + +printf("<7>\n"); + if (((*arg) = malloc(sizeof(integer8))) == NULL) + { + typeError; + } + + (*((integer8 *) arg)) = 10; +printf("<8>\n"); + instruction_drop(s_etat_processus); +printf("<9>\n"); + typeFound(ISET); + } + +printf("<10>\n"); + typeError; endTypeExtension declareTypeExtension(disp) + (*arg) = malloc(10); + strcpy((*arg), "ici"); +endTypeExtension + +declareTypeExtension(dup) endTypeExtension declareTypeExtension(drop)