#ifndef _ll_ffirst #define _ll_ffirst _cat(first_,_ll_rec) #endif #ifndef _ll_flast #define _ll_flast _cat(last_,_ll_rec) #endif #ifndef _ll_fnext #define _ll_fnext _cat(next_,_ll_rec) #endif #define _LL_fn(act) _cat(_cat(_ll_ns,_),_cat(_cat(act,_), _ll_rec)) #ifndef _ll_dropfn #define _ll_dropfn _LL_fn(drop) #endif #ifndef _ll_pushfn #define _ll_pushfn _LL_fn(push) #endif #ifndef _ll_newfn #define _ll_newfn _LL_fn(new) #endif #ifndef _ll_delete #define _ll_delete free # ifdef _ll_impl # include # endif #endif #ifdef _ll_impl # define _LL_impl(...) __VA_ARGS__ # include "def.h" #else # define _LL_impl(...) ; #endif void _ll_pushfn (_ll_box* box, _ll_obj* obj) _LL_impl({ if (box -> _ll_flast) box -> _ll_flast -> _ll_fnext = obj; else box -> _ll_ffirst = obj; box -> _ll_flast = obj; }) _ll_obj* _ll_newfn (_ll_box* box) _LL_impl({ _ll_obj* o = calloc(1, sizeof(_ll_obj)); _ll_pushfn(box, o); return o; }) void _ll_dropfn (_ll_box* box, _ll_obj* obj) _LL_impl({ if(box -> _ll_ffirst == obj) { if(box -> _ll_flast == obj) { box -> _ll_ffirst = box -> _ll_flast = null; } else { box -> _ll_ffirst = obj -> _ll_fnext; } } else { _ll_obj* a; if(box -> _ll_flast == obj) { _ll_iter (box, a) { if(a->_ll_fnext == obj) { box -> _ll_flast = a; a -> _ll_fnext = null; goto found1; } } _fatal("BUG in last elt deletion routine"); found1 :; } else /* in the middle */ { _ll_iter (box, a) { if(a->_ll_fnext == obj) { a->_ll_fnext = obj -> _ll_fnext; goto found2; } } _fatal("BUG in elt deletion routine"); found2 :; } } _ll_delete (obj); }) #undef _LL_fn #undef _LL_impl #undef _ll_pushfn #undef _ll_newfn #undef _ll_dropfn #undef _ll_ffirst #undef _ll_flast #undef _ll_ns #undef _ll_box #undef _ll_obj #undef _ll_rec #undef _ll_iter #undef _ll_delete