X-Git-Url: https://git.harvie.cz/?a=blobdiff_plain;f=cll1.h;h=a12fdfffae86f8a30fdcda710d6e6d7e812ac957;hb=b3674906486c6b6fd944b4c7ffd280589cf8a165;hp=c32debdf41c899e43b4aa8a2301090549fd4a979;hpb=f57259369784a5df46b75488d50e431ed1741235;p=svn%2FCll1h%2F.git diff --git a/cll1.h b/cll1.h index c32debd..a12fdff 100644 --- a/cll1.h +++ b/cll1.h @@ -1,6 +1,6 @@ -/* ,----------------------------------------------------------------------- - / C<<1 header file - C language style sheet - GNU C/ANSI C99 compliant - / Cumbersome Extraction and Report Language - http://cll1h.arachne.cz/ / +/* .----------------------------------------------------------------------. + / C<<1 header file - C language style sheet - GNU C/ANSI C99 compliant + / Cumbersome Extraction and Report Language - http://cll1h.arachne.cz/ '---------------------------------------------------------------------- */ /* Copyright (c) 2004-2008 Michael xChaos Polak - x(at)n.cz @@ -24,7 +24,7 @@ #ifndef _CLL1_H #define _CLL1_H #define CLL1H_VERSION "0.7.1" -/* ,----------------------------------------------------------------------- +/* .----------------------------------------------------------------------. / 0. Library definitions not parsed by @CC, updated 2008-01-26 xCh. '---------------------------------------------------------------------- */ /* @@ -33,7 +33,7 @@ @define USE_PREPROCESSOR cake *.html *.xml > _include.c @define USE_POSTPROCESSOR strip @ */ -/* ,----------------------------------------------------------------------- +/* .----------------------------------------------------------------------. / 1. C<<1 header auto include, updated 2008-01-26 xCh. '---------------------------------------------------------------------- */ #include @@ -50,17 +50,17 @@ #else #include #endif -/* ,----------------------------------------------------------------------- +/* .----------------------------------------------------------------------. / 2. C<<1 then buddhist section, updated 2008-01-26 xCh. '----------------------------------------------------------------------- */ #ifndef DISABLE_MODULE_THEN_BUDDHISM #define then #define MAYBE (int)((RANDOM_SEED?random():(RANDOM_SEED=time(NULL),srandom(RANDOM_SEED),random()))%2) #define WHOKNOWS (int)(srandom(time(NULL)),random()%2) -#define Create_var(ID,TYPE,INIT) TYPE ID=INIT -#define Define_var(ID,TYPE) TYPE ID +#define create_var(ID,TYPE,INIT) TYPE ID=INIT +#define define_var(ID,TYPE) TYPE ID #endif -/* ,----------------------------------------------------------------------- +/* .----------------------------------------------------------------------. / 3. C<<1 constants and optional keywords, updated 2008-01-26 xCh. '----------------------------------------------------------------------- */ #define not ! @@ -72,26 +72,26 @@ #define FALSE 0 #define coalesce(VAR,NOTNULL) (VAR?VAR:(NOTNULL)) #define mem struct -#define construct struct #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 Define_var(ID,TYPE) TYPE ID +#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);char *__key +#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__,)),NULL) +#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) @@ -102,25 +102,34 @@ #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!=HEAD)?((NODE->__next=HEAD),(HEAD=NODE)):(HEAD=NODE)) -#define pop(NODE,HEAD) (HEAD?((NODE=HEAD->__next),free(HEAD),(HEAD=NODE)):(NODE=NULL)) -#define append(NODE,HEAD) if(HEAD) { void *N=NODE; /**/ NODE->__next=NULL; for_search(NODE,HEAD,!NODE->__next) {NODE->__next=N; break;} else push(NODE,HEAD); } +#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 +//to do: seek +//to do: store #define order_by(K1,K2) (K1>K2) #define desc_order_by(K1,K2) (K10) #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)->__next=NULL; } +#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. '----------------------------------------------------------------------- */ #define loop while(TRUE) @@ -138,10 +147,19 @@ #define this_arg argv[_I] #define next_arg ((_I+1METHOD=FUNCTION +#define construct_interface(MTYPE,...) _construct_##_##MTYPE##_##_ARG1(__VA_ARGS__)((void *)__get_##_##MTYPE##_##__VA_ARGS__) +#define get_object(TYPE,...) (struct TYPE *)_cll1_allocate_object(sizeof(struct TYPE), __VA_ARGS__) +#define construct_object(TYPE,...) +//#define _(OBJECT,...) (_ASSERT(OBJECT),/**/(*(OBJECT->interface->_ARG1(__VA_ARGS__,)))/**/(OBJECT,OBJECT->interface->__VA_ARGS__)/**/) +/* .----------------------------------------------------------------------. + / 9. implementation of C<<1 library functions, updated 2008-01-26 xCh. '----------------------------------------------------------------------- */ -#define _ARG1(ARG1,...) ARG1 #define _MALLOC void *_cll1_malloc(size_t size,...) { /*temporary solution*/ return malloc(size); } #define _CLL1_FPRINT(IOSTREAM,LASTARG) { int p2=0;char *ofs=coalesce(OFS,"\0");va_list ap; /**/ for(va_start(ap,s);s!=LASTARG;s=va_arg(ap,char *)) { if(p2 && *ofs) fputs(ofs,IOSTREAM); else p2=1; fputs(coalesce(s,NIL),IOSTREAM); } va_end(ap); if(EOL && *EOL) fputs(EOL,IOSTREAM); } #define _PRINT void _cll1_print(char *s,...) _CLL1_FPRINT(stdout,(void *)&_cll1_print) @@ -151,49 +169,53 @@ #define _FECHO void _cll1_fecho(FILE *f,char *s,...) _CLL1_FECHO(f,(void *)&_cll1_fecho) #define _IT_INTS int _cll1_it_ints(int i, int n, ...) { int j=0;va_list ap; /**/ va_start(ap,n); while(n>=0 && j++