--- rpl/src/rplexternals.h 2013/04/01 15:29:39 1.49 +++ rpl/src/rplexternals.h 2013/12/03 09:36:16 1.55 @@ -1,6 +1,6 @@ /* ================================================================================ - RPL/2 (R) version 4.1.14 + RPL/2 (R) version 4.1.17 Copyright (C) 1989-2013 Dr. BERTRAND Joël This file is part of RPL/2. @@ -39,6 +39,9 @@ ================================================================================ */ +#define __RPL__ struct_rpl_arguments *rpl_arguments; \ + rpl_arguments = &__static_rpl_arguments; + #define __CATCH_SYSTEM_ERROR__ \ do { if (((*rpl_arguments).erreur != 0) && \ ((*rpl_arguments).type_erreur == 'S')) \ @@ -49,6 +52,20 @@ (*rpl_arguments).s_etat_processus, a, b) #define liberation(a) librpl_liberation((*rpl_arguments).s_etat_processus, a) +#ifdef __RPLC_MAIN + struct_rpl_arguments __static_rpl_arguments; +# define global +# define initialize(a, b) a = b +# define declarePersistantObject(object) declareObject(object) +#else + extern struct_rpl_arguments __static_rpl_arguments; +# define global extern +# define initialize(a, b) a; +# define declarePersistantObject(object) extern struct_objet *object; +#endif + +#define empty int + /* -------------------------------------------------------------------------------- Types @@ -228,16 +245,34 @@ -------------------------------------------------------------------------------- */ -#define declareInternalFunction(type, name, ...) \ - type __internal_##name(struct_rpl_arguments *rpl_arguments, __VA_ARGS__) { \ +#define CONCAT(a, b) __CONCAT(a, b) +#define __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__) +#define REST_HELPER(qty, ...) REST_HELPER2(qty, __VA_ARGS__) +#define REST_HELPER2(qty, ...) REST_HELPER_##qty(__VA_ARGS__) +#define REST_HELPER_ONE(first) +#define REST_HELPER_TWOORMORE(first, ...) , __VA_ARGS__ +#define NUM(...) \ + SELECT_10TH(__VA_ARGS__, TWOORMORE, TWOORMORE, TWOORMORE, TWOORMORE,\ + TWOORMORE, TWOORMORE, TWOORMORE, TWOORMORE, ONE, throwaway) +#define SELECT_10TH(a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, ...) a10 + +#define declareInternalFunction(type, ...) \ + type CONCAT(__internal_, FIRST(__VA_ARGS__)) \ + (struct_rpl_arguments *rpl_arguments REST(__VA_ARGS__)) { \ + type __internal_return; __internal_return = 0; int __type; \ + DISABLE_SET_BUT_NOT_USED_WARNING(__type); + +#define endInternalFunction return(__internal_return); } + +#define useInternalFunction(type, ...) \ + type CONCAT(__internal_, FIRST(__VA_ARGS__)) \ + (struct_rpl_arguments *rpl_arguments REST(__VA_ARGS__)) -#define endInternalFunction leave; } - -#define useInternalFunction(type, name, ...) \ - type __internal_##name(struct_rpl_arguments *rpl_arguments, __VA_ARGS__) - -#define callInternalFunction(name, ...) \ - __internal_##name(rpl_arguments, __VA_ARGS__) +#define callInternalFunction(...) \ + CONCAT(__internal_, FIRST(__VA_ARGS__))(rpl_arguments REST(__VA_ARGS__)) /* -------------------------------------------------------------------------------- @@ -246,8 +281,10 @@ */ #define declareCFunction(type, name, ...) \ - type name(__VA_ARGS__) { __RPL__ -#define endCFunction leave; } + type name(__VA_ARGS__) { __RPL__ type __c_return; +#define endCFunction return(__c_return); } + +#define useCFunction(type, name, ...) type name(__VA_ARGS__) /* -------------------------------------------------------------------------------- @@ -1074,18 +1111,32 @@ #define removeObjectFromList(list, object) do { \ ifIsList(list) \ { \ - if ((*object).objet == NULL) \ + if ((*list).objet != NULL) \ { \ - struct_objet *__tmp_object; \ - if ((__tmp_object = copie_objet(list, 'N')) == NULL) \ - systemError("Memory allocation error"); \ - liberation(object); \ - object = __tmp_object; \ - \ - \ - \ - \ - } \ + struct_liste_chainee *__current; \ + struct_liste_chainee *__previous; \ + __current = (*list).objet; \ + __previous = NULL; \ + if ((*__current).donnee == object) \ + { \ + (*list).objet = (*__current).suivant; \ + } \ + else \ + { \ + while(__current != NULL) \ + { \ + if ((*__current).donnee == object) \ + { \ + (*__previous).suivant = (*__current).suivant; \ + break; \ + } \ + __previous = __current; \ + __current = (*__current).suivant; \ + } \ + } \ + liberation((*__current).donnee); \ + free(__current); \ + } \ } \ else executionError("Type mistmatch error"); } while(0) @@ -1151,8 +1202,4 @@ #endif -static struct_rpl_arguments __static_rpl_arguments; -#define __RPL__ struct_rpl_arguments *rpl_arguments; \ - rpl_arguments = &__static_rpl_arguments; - // vim: ts=4