#define DESTROYFUNC(STRUCTTYPE) destroy_ ## STRUCTTYPE ## _record
#define GETXREFFUNC(STRUCTTYPE) gom_get_ ## STRUCTTYPE ## _by_xref
#define CLEANFUNC(STRUCTTYPE) STRUCTTYPE ## _cleanup
-#define ADDFUNC(STRUCTTYPE) gom_add_ ## STRUCTTYPE
-#define SUB_ADDFUNC(STRUCTTYPE) gom_add_ ## STRUCTTYPE
+#define ADDFUNC(STRUCTTYPE) gom_new_ ## STRUCTTYPE
+#define SUB_SETFUNC(STRUCTTYPE) gom_set_new_ ## STRUCTTYPE
#define UNREFALLFUNC(STRUCTTYPE) STRUCTTYPE ## _unref_all
#define DELETEFUNC(STRUCTTYPE) gom_delete_ ## STRUCTTYPE
#define SUB_DELETEFUNC(STRUCTTYPE) gom_delete_ ## STRUCTTYPE
(FIRSTVAL)->previous = VAL->previous; \
}
+#define MOVE_CHAIN_ELT(STRUCTTYPE, DIR, FIRSTVAL, VAL) \
+ { \
+ struct STRUCTTYPE *first, *second; \
+ if (DIR == MOVE_UP) { \
+ first = VAL->previous; \
+ second = VAL; \
+ } \
+ else { \
+ first = VAL; \
+ second = VAL->next; \
+ } \
+ if (second && (second != FIRSTVAL)) { \
+ if (first != FIRSTVAL) \
+ first->previous->next = second; \
+ else \
+ FIRSTVAL = second; \
+ \
+ if (second->next) \
+ second->next->previous = first; \
+ else \
+ (FIRSTVAL)->previous = first; \
+ \
+ first->next = second->next; \
+ second->next = first; \
+ \
+ second->previous = first->previous; \
+ first->previous = second; \
+ } \
+ else { \
+ gom_move_error(#STRUCTTYPE); \
+ } \
+ }
+
#define MAKE_CHAIN_ELT(STRUCTTYPE, FIRSTVAL, VAL) \
{ \
VAL = (struct STRUCTTYPE*) malloc(sizeof(struct STRUCTTYPE)); \
return obj; \
}
-#define DEFINE_SUB_ADDFUNC(STRUCTTYPE) \
- struct STRUCTTYPE *SUB_ADDFUNC(STRUCTTYPE)(struct STRUCTTYPE** addto) \
+#define DEFINE_SUB_SETFUNC(STRUCTTYPE) \
+ struct STRUCTTYPE *SUB_SETFUNC(STRUCTTYPE)(struct STRUCTTYPE** addto) \
{ \
struct STRUCTTYPE *obj = NULL; \
if (addto && ! *addto) { \