--- rpl/src/rplexternals.h 2017/06/28 09:20:38 1.73 +++ rpl/src/rplexternals.h 2017/06/29 12:33:34 1.74 @@ -29,8 +29,13 @@ ================================================================================ */ -# define RPLARGS -# define struct_processus void +// Si TYPE_DECLARATION est défini, toutes les structures internes du RPL/2 +// sont exposés pour travailler sur des nouveaux types de données. +# ifndef TYPE_DECLARATION +# define RPLARGS +# define struct_processus void +# endif + # include "rpl.h" /* @@ -47,10 +52,10 @@ ((*rpl_arguments).type_erreur == 'S')) \ return 0; } while(0) #define leave do { return(0); } while(0) -#define allocation(a) librpl_allocation((*rpl_arguments).s_etat_processus, a) -#define copie_objet(a, b) librpl_copie_objet( \ +#define _allocation(a) librpl_allocation((*rpl_arguments).s_etat_processus, a) +#define _copie_objet(a, b) librpl_copie_objet( \ (*rpl_arguments).s_etat_processus, a, b) -#define liberation(a) librpl_liberation((*rpl_arguments).s_etat_processus, a) +#define _liberation(a) librpl_liberation((*rpl_arguments).s_etat_processus, a) #ifdef __RPLC_MAIN struct_rpl_arguments __static_rpl_arguments; @@ -68,6 +73,25 @@ /* -------------------------------------------------------------------------------- + Gestion des objets +-------------------------------------------------------------------------------- +*/ + +// new, dup, drop, disp, parse +// __type_new(struct_rpl_arguments *rpl_arguments) +#define declareTypeExtension(fct) \ + int __type_##fct(struct_processus *s_etat_processus) { \ + unsigned char *rptr, *ptr; \ + rptr = (*s_etat_processus).definitions_chainees + \ + (*s_etat_processus).position_courante; \ + ptr = rptr; \ + if (ptr != rptr) goto __parse_error; +#define parseError { goto __parse_error; } while(0) +#define endTypeExtension __parse_error: return(0); } +#define sizeOfParse (rptr - ptr) + +/* +-------------------------------------------------------------------------------- Types -------------------------------------------------------------------------------- */ @@ -224,7 +248,7 @@ do { \ if (rpl_object == NULL) \ systemError("Nullified object"); \ - liberation(rpl_object); \ + _liberation(rpl_object); \ rpl_object = NULL; \ } while(0) @@ -236,7 +260,7 @@ #define dupObject(rpl_object) \ __CATCH_SYSTEM_ERROR__; \ - do { if (copie_objet(rpl_object, 'P') != rpl_object) \ + do { if (_copie_objet(rpl_object, 'P') != rpl_object) \ systemError("Memory allocation error"); } while(0) /* @@ -245,8 +269,8 @@ -------------------------------------------------------------------------------- */ -#define CONCAT(a, b) __CONCAT(a, b) -#define __CONCAT(a, b) a##b +#define CONCAT(a, b) __RPL_CONCAT(a, b) +#define __RPL_CONCAT(a, b) a##b #define FIRST(...) FIRST_HELPER(__VA_ARGS__, throwaway) #define FIRST_HELPER(first, ...) first #define REST(...) REST_HELPER(NUM(__VA_ARGS__), __VA_ARGS__) @@ -648,9 +672,9 @@ if ((*rpl_object).nombre_occurrences > 1) \ { \ struct_objet *__tmp_rpl_object; \ - if ((__tmp_rpl_object = copie_objet(rpl_object, 'O')) == NULL) \ + if ((__tmp_rpl_object = _copie_objet(rpl_object, 'O')) == NULL) \ systemError("Memory allocation error"); \ - liberation(rpl_object); \ + _liberation(rpl_object); \ rpl_object = __tmp_rpl_object; \ } \ (*((integer8 *) (*rpl_object).objet)) = (integer8) value; \ @@ -671,7 +695,7 @@ #define createIntegerObject(rpl_object) do { \ if (rpl_object != NULL) \ systemError("Reallocated object"); \ - if ((rpl_object = allocation(INT)) == NULL) \ + if ((rpl_object = _allocation(INT)) == NULL) \ systemError("Memory allocation error"); \ setInteger(rpl_object, 0); } while(0) @@ -683,9 +707,9 @@ if ((*rpl_object).nombre_occurrences > 1) \ { \ struct_objet *__tmp_rpl_object; \ - if ((__tmp_rpl_object = copie_objet(rpl_object, 'O')) == NULL) \ + if ((__tmp_rpl_object = _copie_objet(rpl_object, 'O')) == NULL) \ systemError("Memory allocation error"); \ - liberation(rpl_object); \ + _liberation(rpl_object); \ rpl_object = __tmp_rpl_object; \ } \ (*((real8 *) (*rpl_object).objet)) = (real8) value; \ @@ -706,7 +730,7 @@ #define createRealObject(rpl_object) do { \ if (rpl_object != NULL) \ systemError("Reallocated object"); \ - if ((rpl_object = allocation(REL)) == NULL) \ + if ((rpl_object = _allocation(REL)) == NULL) \ systemError("Memory allocation error"); \ setReal(rpl_object, 0); } while(0) @@ -720,9 +744,9 @@ if ((*rpl_object).nombre_occurrences > 1) \ { \ struct_objet *__tmp_rpl_object; \ - if ((__tmp_rpl_object = copie_objet(rpl_object, 'O')) == NULL) \ + if ((__tmp_rpl_object = _copie_objet(rpl_object, 'O')) == NULL) \ systemError("Memory allocation error"); \ - liberation(rpl_object); \ + _liberation(rpl_object); \ rpl_object = __tmp_rpl_object; \ } \ setRealPartOfComplex(rpl_object, __rp); \ @@ -734,9 +758,9 @@ if ((*rpl_object).nombre_occurrences > 1) \ { \ struct_objet *__tmp_rpl_object; \ - if ((__tmp_rpl_object = copie_objet(rpl_object, 'O')) == NULL) \ + if ((__tmp_rpl_object = _copie_objet(rpl_object, 'O')) == NULL) \ systemError("Memory allocation error"); \ - liberation(rpl_object); \ + _liberation(rpl_object); \ rpl_object = __tmp_rpl_object; \ } \ ifIsComplex(rpl_object) (*((complex16 *) (*rpl_object).objet)) \ @@ -747,9 +771,9 @@ if ((*rpl_object).nombre_occurrences > 1) \ { \ struct_objet *__tmp_rpl_object; \ - if ((__tmp_rpl_object = copie_objet(rpl_object, 'O')) == NULL) \ + if ((__tmp_rpl_object = _copie_objet(rpl_object, 'O')) == NULL) \ systemError("Memory allocation error"); \ - liberation(rpl_object); \ + _liberation(rpl_object); \ rpl_object = __tmp_rpl_object; \ } \ (*((complex16 *) (*rpl_object).objet)).partie_imaginaire = value; \ @@ -776,7 +800,7 @@ #define createComplexObject(rpl_object) do { \ if (rpl_object != NULL) \ systemError("Reallocated object"); \ - if ((rpl_object = allocation(CPL)) == NULL) \ + if ((rpl_object = _allocation(CPL)) == NULL) \ systemError("Memory allocation error"); \ setComplex(rpl_object, 0, 0); } while(0) @@ -788,7 +812,7 @@ s_etat_processus = (*rpl_arguments).s_etat_processus; \ if (rpl_object != NULL) \ systemError("Reallocated object"); \ - if ((rpl_object = allocation(cat)) == NULL) \ + if ((rpl_object = _allocation(cat)) == NULL) \ systemError("Memory allocation error"); \ (*((structure *) (*rpl_object).objet)).taille = size; \ if (((*((structure *) (*rpl_object).objet)).tableau = \ @@ -824,9 +848,9 @@ if ((*rpl_object).nombre_occurrences > 1) \ { \ struct_objet *__tmp_rpl_object; \ - if ((__tmp_rpl_object = copie_objet(rpl_object, 'O')) == NULL) \ + if ((__tmp_rpl_object = _copie_objet(rpl_object, 'O')) == NULL) \ systemError("Memory allocation error"); \ - liberation(rpl_object); \ + _liberation(rpl_object); \ rpl_object = __tmp_rpl_object; \ } \ __position--; \ @@ -872,9 +896,9 @@ if ((*rpl_object).nombre_occurrences > 1) \ { \ struct_objet *__tmp_rpl_object; \ - if ((__tmp_rpl_object = copie_objet(rpl_object, 'O')) == NULL) \ + if ((__tmp_rpl_object = _copie_objet(rpl_object, 'O')) == NULL) \ systemError("Memory allocation error"); \ - liberation(rpl_object); \ + _liberation(rpl_object); \ rpl_object = __tmp_rpl_object; \ } \ __position--; \ @@ -928,9 +952,9 @@ if ((*rpl_object).nombre_occurrences > 1) \ { \ struct_objet *__tmp_rpl_object; \ - if ((__tmp_rpl_object = copie_objet(rpl_object, 'O')) == NULL) \ + if ((__tmp_rpl_object = _copie_objet(rpl_object, 'O')) == NULL) \ systemError("Memory allocation error"); \ - liberation(rpl_object); \ + _liberation(rpl_object); \ rpl_object = __tmp_rpl_object; \ } \ (*((integer8 *) (*rpl_object).objet)) = (integer8) value; \ @@ -952,7 +976,7 @@ #define createBinaryIntegerObject(rpl_object) do { \ if (rpl_object != NULL) \ systemError("Reallocated object"); \ - if ((rpl_object = allocation(BIN)) == NULL) \ + if ((rpl_object = _allocation(BIN)) == NULL) \ systemError("Memory allocation error"); \ setBinaryInteger(rpl_object, 0); } while(0) @@ -972,9 +996,9 @@ if ((*rpl_object).nombre_occurrences > 1) \ { \ struct_objet *__tmp_rpl_object; \ - if ((__tmp_rpl_object = copie_objet(rpl_object, 'O')) == NULL) \ + if ((__tmp_rpl_object = _copie_objet(rpl_object, 'O')) == NULL) \ systemError("Memory allocation error"); \ - liberation(rpl_object); \ + _liberation(rpl_object); \ rpl_object = __tmp_rpl_object; \ } \ free((*((struct_nom *) (*rpl_object).objet)).nom); \ @@ -996,7 +1020,7 @@ s_etat_processus = (*rpl_arguments).s_etat_processus; \ if (rpl_object != NULL) \ systemError("Reallocated object"); \ - if ((rpl_object = allocation(NOM)) == NULL) \ + if ((rpl_object = _allocation(NOM)) == NULL) \ systemError("Memory allocation error"); \ (*((struct_nom *) (*rpl_object).objet)).symbole = d_faux; \ if (((*((struct_nom *) (*rpl_object).objet)).nom = malloc( \ @@ -1022,9 +1046,10 @@ if ((*rpl_object).nombre_occurrences > 1) \ { \ struct_objet *__tmp_rpl_object; \ - if ((__tmp_rpl_object = copie_objet(rpl_object, 'O')) == NULL) \ + if ((__tmp_rpl_object = _copie_objet(rpl_object, 'O')) \ + == NULL) \ systemError("Memory allocation error"); \ - liberation(rpl_object); \ + _liberation(rpl_object); \ rpl_object = __tmp_rpl_object; \ } \ free((unsigned char *) (*rpl_object).objet); \ @@ -1046,7 +1071,7 @@ s_etat_processus = (*rpl_arguments).s_etat_processus; \ if (rpl_object != NULL) \ systemError("Reallocated object"); \ - if ((rpl_object = allocation(CHN)) == NULL) \ + if ((rpl_object = _allocation(CHN)) == NULL) \ systemError("Memory allocation error"); \ if (((*rpl_object).objet = malloc(sizeof(unsigned char))) == NULL) \ systemError("Memory allocation error"); \ @@ -1063,7 +1088,7 @@ #define createListObject(rpl_object) do { \ if (rpl_object != NULL) \ systemError("Reallocated object"); \ - if ((rpl_object = allocation(LST)) == NULL) \ + if ((rpl_object = _allocation(LST)) == NULL) \ systemError("Memory allocation error"); \ (*rpl_object).objet = NULL; } while(0) @@ -1073,9 +1098,9 @@ ifIsList(list) \ { \ struct_objet *__tmp_rpl_object; \ - if ((__tmp_rpl_object = copie_objet(list, 'N')) == NULL) \ + if ((__tmp_rpl_object = _copie_objet(list, 'N')) == NULL) \ systemError("Memory allocation error"); \ - liberation(list); \ + _liberation(list); \ list = __tmp_rpl_object; \ if ((*list).objet == NULL) \ { \ @@ -1108,9 +1133,9 @@ ifIsList(list) \ { \ struct_objet *__tmp_rpl_object; \ - if ((__tmp_rpl_object = copie_objet(list, 'N')) == NULL) \ + if ((__tmp_rpl_object = _copie_objet(list, 'N')) == NULL) \ systemError("Memory allocation error"); \ - liberation(list); \ + _liberation(list); \ list = __tmp_rpl_object; \ if ((*list).objet == NULL) \ { \ @@ -1162,7 +1187,7 @@ __current = (*__current).suivant; \ } \ } \ - liberation((*__current).donnee); \ + _liberation((*__current).donnee); \ free(__current); \ } \ } \