-#define construct struct
-/* ------------------------------------------------------------------- */
-/* 2. C<<1 basic data types - updated 2008-01-07 by xCh. */
-/* ------------------------------------------------------------------- */
-#define Create_str(ID,INIT) char *ID=INIT
-#define Define_str(ID) char *ID=NULL
-#define Create_mem(ID,TYPE) struct TYPE *ID=get_mem(TYPE)
-#define Create_mem_in_context(ID,TYPE,CONTEXT) struct TYPE *ID=get_mem_in_context(TYPE,CONTEXT)
-#define Define_mem(ID,TYPE) struct TYPE *ID=NULL
-#define Define_mems(ID1,I2,TYPE) Define_mem(ID1,TYPE);Define_mem(ID2,TYPE)
-
-/* .... well.. ehm.. not very useful... :-) */
-#define Create_var(ID,TYPE,INIT) TYPE ID=INIT
-#define Define_var(ID,TYPE) TYPE ID
-/* ------------------------------------------------------------------- */
-#define list(T) struct T *_next
-#define tree(T) struct T *_next;struct T *_seek
-#define create(A,T) (A=(struct T *)malloc(sizeof(struct T)),A->_next=NULL,A)
-#define push(A,B) ((A && A!=B)?A->_next=B:0,B=A)
-#define pop(A,B) (B?((A?free(A):0),A=B=B->_next):(A=NULL))
-#define append(A,B) if(B) { void *N=A; A->_next=NULL; for_search(A,B,!A->_next) {A->_next=N; break;}} else push(A,B);
-#define remove(A,B,C) { void **_D=NULL; for_search(A,B,C) { if(_D)*_D=A->_next; else B=A->_next; free(A); } else _D=(void *)&(A->_next); }
-#define drop(A,B) for( A=B; A || (B=NULL); B=A, A=A->_next, free(B) )
-/* ------------------------------------------------------------------- */
-/* 3. C<<1 general iterators - updated 2008-01-07 by xCh. */
-/* ------------------------------------------------------------------- */
+#define _GLOBALS time_t RANDOM_SEED=0; char *EOL="\n", *OFS=" ", *IFS=" \t\n", *NIL="NULL";
+/* .----------------------------------------------------------------------.
+ / 4. C<<1 data declaration and allocation, updated 2008-01-07 xCh.
+ '----------------------------------------------------------------------- */
+#define create_str(ID,INIT) char *ID=INIT
+#define define_str(ID) char *ID=NULL
+#define create_mem(ID,...) struct _ARG1(__VA_ARGS__,) *ID=get_mem(__VA_ARGS__)
+#define define_mem(ID,TYPE) struct TYPE *ID=NULL
+#define define_mems(ID1,ID2,TYPE) define_mem(ID1,TYPE); define_mem(ID2,TYPE)
+#define create_list(ID1,I2,TYPE) create_mem(ID1,TYPE); struct TYPE *ID2=((ID1->__next=NULL),ID1)
+#define create_context(ID) create_mem(ID,_MAtom)
+#define define_context(ID) define_mem(ID,_MAtom)
+#define list(TYPE) struct TYPE *__next
+#define tree(TYPE) struct TYPE *__next; struct TYPE *__seek
+#define dictionary(TYPE) tree(TYPE); char *__key
+#define array(TYPE) tree(TYPE); int __key
+#define interface(TYPE) struct TYPE *__interface
+#define get_mem(...) (struct _ARG1(__VA_ARGS__,)*)_cll1_malloc(sizeof(struct _ARG1(__VA_ARGS__,)), _ARG2(__VA_ARGS__,,) - 0 )
+#define get_str(...) (char *)_cll1_get_str(__VA_ARGS__,(void *)&_cll1_get_str)
+/* .----------------------------------------------------------------------.
+ / 5. C<<1 string manipulation, updated 2008-01-26 xCh.
+ '----------------------------------------------------------------------- */
+#define eq(A,B) !strcmp(A,B)
+#define eqi(A,B) !strcasecmp(A,B)
+#define print(...) _cll1_print(__VA_ARGS__,(void *)&_cll1_print)
+#define fprint(...) _cll1_fprint(__VA_ARGS__,(void *)&_cll1_fprint)
+#define file_print(...) _cll1_fprint(_F,__VA_ARGS__,(void *)&_cll1_fprint)
+#define echo(...) _cll1_echo(__VA_ARGS__,(void *)&_cll1_echo)
+#define fecho(...) _cll1_fecho(__VA_ARGS__,(void *)&_cll1_fecho)
+#define file_echo(...) _cll1_fecho(_F,__VA_ARGS__,(void *)&_cll1_fecho)
+#define suffix(A,B,C) (((A=strrchr(B,C))&&!(*(A++)=0))||(A=B))
+#define prefix(A,B,C) ((A=B),((B=strchr(B,C))&&!(*(B++)=0)||(B=A)))
+#define for_split_str(A,B,C) for(prefix(A,B,C);A;(A!=B)&&prefix(A,B,C)||(A=NULL))
+#define for_valid_split(A,B,C) for_split_str(A,B,C) if(*A)
+#define switch_for_columns(A,B,C) _FOR_COLUMNS(A,B,C) switch(__I)
+#define switch_for_valid_columns(A,B,C) _FOR_VALID_COLUMNS(A,B,C) switch (_I)
+#define if_column_number(A,B,C,V) _FOR_COLUMNS(A,B,C) if(_I==V)
+#define if_valid_column_number(A,B,C,V) _FOR_VALID_COLUMNS(A,B,C) if(_I==V)
+#define tr(STR,B,C) {char *_S=STR; /***/ while(S && *_S) {if(*_S==B)*_S=C; _S++;} }
+/* .----------------------------------------------------------------------.
+ / 6. C<<1 data container manipulation, updated 2008-01-26 xCh.
+ '----------------------------------------------------------------------- */
+#define push(NODE,HEAD) ( NODE ? ((NODE->__next=HEAD),(HEAD=NODE)) : NULL )
+#define pop(NODE,HEAD) ( HEAD ? ((NODE=HEAD->__next),free(HEAD),(HEAD=NODE)) : (NODE=NULL) )
+#define append(NODE,HEAD) { void *N=NODE; /**/ NODE->__next=NULL; for_search(NODE,HEAD,!NODE->__next) { NODE->__next=N; break; } }
+#define remove(NODE,HEAD,EXPR) { void **_D=NULL; /**/ for_search(NODE,HEAD,EXPR) { if(_D)*_D=NODE->__next; else HEAD=NODE->__next; free(NODE); } else _D=(void *)&(NODE->__next); }
+#define drop(NODE,HEAD) for( NODE=HEAD; NODE || (HEAD=NULL); HEAD=NODE, NODE=NODE->__next, free(HEAD) )
+//to do: seek
+//to do: store
+#define order_by(K1,K2) (K1>K2)
+#define desc_order_by(K1,K2) (K1<K2)
+#define sort_by(K1,K2) (strcasecmp(K1, K2)>0)
+#define desc_sort_by(K1,K2) (strcasecmp(K1, K2)<0)
+#define ascii_by(K1,K2) (strcmp(K1, K2)>0)
+#define desc_ascii_by(K1,K2) (strcmp(K1, K2)<0)
+#define insert(NODE,HEAD,EXP,K) { if(HEAD) { void **_L=NULL, *H=HEAD; /**/ for_search(HEAD,H,EXP(HEAD->K,NODE->K)) { if(_L) {*_L=NODE; NODE->__next=HEAD; } else push(NODE,H); break; } else _L=(void *)&(HEAD->__next); if(!HEAD)*_L=NODE; HEAD=H; } else if (NODE) { push(NODE,HEAD); HEAD->__next=NULL; } }
+#define sort(NODE,HEAD,EXP,K) { void *_NEXT; /**/ NODE=HEAD; HEAD=NULL; do { _NEXT=NODE->__next; NODE->__next=NULL; insert(NODE,HEAD,EXP,K); NODE=_NEXT; } while(_NEXT); }
+/* .----------------------------------------------------------------------.
+ / 7. C<<1 builtin iterators and conditionals, updated 2008-01-26 xCh.
+ '----------------------------------------------------------------------- */