X-Git-Url: https://git.harvie.cz/?a=blobdiff_plain;f=cll1.h;h=78642ffbb627fe54a8afeedd91d470e9ed194746;hb=6a60bc82e8b8e6cccd0d4c2214a1f291662215f0;hp=a3a6a317773105dca4fd3e15b3163ac757104fd4;hpb=eac5d6c70c3babc9056f059edd88a2c1a82bc7e9;p=svn%2FCll1h%2F.git diff --git a/cll1.h b/cll1.h index a3a6a31..78642ff 100644 --- a/cll1.h +++ b/cll1.h @@ -43,6 +43,7 @@ #include #include #include +#include #include #ifdef USE_LIBRARY_FASTCGI #include @@ -54,15 +55,23 @@ #include #endif /* .----------------------------------------------------------------------. - / 0. C<<1 typedefs and public gloabl variables, updated 2008-02-03 xCh. + / 0. C<<1 typedefs and public global variables, updated 2008-02-03 xCh. '----------------------------------------------------------------------- */ -typedef char * str; /* #ifdef USE_MODULE_UNICODE...typedef wchar_t * str; */ +typedef void * any; typedef unsigned char * buf; /* this will be always 8-bit usigned char * */ typedef FILE * file; typedef int bool; -extern str NIL,EOL,OFS,IFS; +#ifdef USE_WCHAR_T +typedef wchar_t * str; +#else +typedef char * str; /* Warning: full wchar_t support not yet implemented! */ +#endif +extern str NIL, EOL, OFS, IFS, LANG, errstr; /* used for: perror(errstr) */ extern unsigned RANDOM_SEED; -#define _EXPORT_GLOBALS str NIL="(null)", EOL="\n", OFS=" ", IFS=" \t\n", LANG=NULL; unsigned RANDOM_SEED=0; +#define _EXPORT_GLOBALS \ +str NIL="(null)", EOL="\n", OFS=" ", IFS=" \t\n", LANG=NULL; \ +str errstr="C<<1 0xdead"; \ +unsigned RANDOM_SEED=0; /* .----------------------------------------------------------------------. / 1. C<<1 then buddhist section, updated 2008-02-04 xCh. '----------------------------------------------------------------------- */ @@ -141,8 +150,8 @@ extern unsigned RANDOM_SEED; //to do: seek //to do: store #define count(NODE,HEAD,VAR) { _NEW(I,0) for(NODE=HEAD; NODE || ((VAR=_I),0) ; (NODE=NODE->__next)?(_I++):0 ); } -#define order_by_int(K1,K2) (K1>K2) -#define order_by_int_desc(K1,K2) (K1K2) +#define order_by_num_desc(K1,K2) (K10) #define order_by_str_desc(K1,K2) (str_order(K1,K2)<0) #define order_by_ascii(K1,K2) (str_ascii(K1,K2)>0) @@ -192,7 +201,6 @@ extern unsigned RANDOM_SEED; //#define __(METHOD,...) ( _ASSERT(ARG1(__VA_ARGS__,)), (*( __cll1_seekmethod(ARG1(__VA_ARGS__,),METHOD) )) ( __VA_ARGS__ ) ) #define call(OBJTYPE,METHOD,...) { int _N=0; OBJTYPE _OBJ; /* <-' */ while( (_OBJ=(OBJTYPE)_cll1_for_ptrs(_N++,__VA_ARGS__,NIL))!=(OBJTYPE)NIL ) _(_OBJ,METHOD); } #define def_community(TYPE,INTERFACE) def_obj(TYPE) { INTERFACE __interface; }; -#define anonymous void * /* ---- variable declarators -------------------------------------------- */ #define Get_obj(ID,MEM,...) MEM ID=get_obj(MEM,__VA_ARGS__) #define Get_obj_as(ID,COMMUNITY,MEM,...) MEM ID=get_obj_as(COMMUNITY,MEM,INTERFACE,__VA_ARGS__) @@ -205,6 +213,7 @@ extern unsigned RANDOM_SEED; #define LOCAL_FAILURE 13 #define LIBRARY_FAILURE 23 #define EVIL_FAILURE 666 +#define die(MSG) longjmp(_EENV,(errstr=MSG,LOCAL_FAILURE)) #define try _NEW(E,0) if(!(_E=setjmp(_EENV))) #define fail(E) longjmp(_EENV,((E)>0?(E):FAILED_TO_FAIL)) #define pass_failure (_Eatom->__next?longjmp((pop(_Eatom,_Estack),_EENV),_E):_SYSFAIL(FAILED_TO_FAIL)) @@ -252,21 +261,22 @@ extern _DECLARE_STRSTR; #define _CTX (_CTXatom->CTX) #define _E (_Eatom->E) #define _EENV (_Eatom->ENV) +#define _ERRNO (_Eatom->ERRNO) #define _ARG1(ARG1,...) ARG1 //#define _ASSERT(EXPR) (expr?expr:fail(CONSISTENCY_FAILURE)) -#define _SYSFAIL(E) longjmp(_EENV,(E)) +#define _SYSFAIL(E) longjmp(_EENV,(_ERRNO=errno,(E))) #define _GET_MEM(TYPE) ((TYPE)malloc(sizeof(struct _##TYPE##_struct))) /* later... ((TYPE)_cll1_malloc(sizeof(struct _##TYPE##_struct))) */ #define _ANYATOM(NAME,DECL) def_mem(_##NAME##Atom ) { DECL; int c; list( _##NAME##Atom ); } //#define _FOR_COLUMNS(A,B,C) _NEW(I,0) for( prefix(A,B,C) ; A ; ((A!=B)&&prefix(A,B,C)||(A=NULL) ),_I++ ) //#define _FOR_VALID_COLUMNS(A,B,C) _NEW(I,0) for( prefix(A,B,C) ; A ; ((A!=B)&&prefix(A,B,C))||(A=NULL) ) if(*A&&++_I) #define _NEW(NAME,VALUE) for(_##NAME##atom=get_mem(_##NAME##Atom),_##NAME##atom->NAME=(VALUE),_##NAME##atom->c=1,push(_##NAME##atom,_##NAME##stack);_##NAME##atom->c||(pop(_##NAME##atom,_##NAME##stack),0);_##NAME##atom->c--) -#define _ANYSTACK(NAME) _##NAME##Atom _##NAME##atom,_##NAME##stack=NULL; +#define _ANYSTACK(NAME) extern _##NAME##Atom _##NAME##atom, _##NAME##stack; _##NAME##Atom _##NAME##atom,_##NAME##stack=NULL; #define _EXPORT_STACKS _ANYSTACK(I) _ANYSTACK(S) _ANYSTACK(F) _ANYSTACK(CTX) _ANYSTACK(E) _ANYATOM(I, int I;int J); _ANYATOM(S, str S); _ANYATOM(F, file F); _ANYATOM(CTX, void *CTX); -_ANYATOM(E, int E;jmp_buf ENV); +_ANYATOM(E, int E;jmp_buf ENV;int ERRNO); /* .----------------------------------------------------------------------. / 11. C<<1 memory contexts - alternative to garbage collection '----------------------------------------------------------------------- */ @@ -371,7 +381,6 @@ obsolete //#define _CLL1_THROW(ERR) //#define _CLL1_TRY _NEW_E for(bind_exception(0,NULL);;) if () {.... if(_Eatom->SYS) { if(_Eatom->RET) return; else break;} else { } - /* .----------------------------------------------------------------------. / 98. We have have done our homework - now let's have some fun: '----------------------------------------------------------------------- */ @@ -380,23 +389,35 @@ obsolete #define _IMPL_INTERFACE //_SQL_IFC _CAKE_IFC _STD_IFC _X_IFC #define _IMPLEMENT_CLL1_LIBRARY _INIT_VARIABLES _IMPL_FUNCTIONS _IMPL_INTERFACE //this will be probably accomplished some other way... -//#ifndef DISABLE_CLL1_LIBRARY_IMPLEMENTATION +#ifndef DISABLE_LIBRARY_CLL1 _IMPLEMENT_CLL1_LIBRARY -//#endif -#define _PROGRAM _cll1_program +#endif +#ifdef USE_LC_ALL +#define _UNSET_LC_NUMERIC setlocale(LC_NUMERIC, "C"); /* LC_COLLATE, LC_CTYPE, LC_MESSAGES, LC_MONETARY, LC_NUMERIC, LC_TIME */ +#else +#define _UNSET_LC_NUMERIC +#endif #define _DECLARE_PROGRAM void _PROGRAM(int argc, char **argv) +#define _PROGRAM _cll1_program #define program \ _DECLARE_PROGRAM; \ int main(int argc, char **argv) \ { \ LANG=setlocale(LC_ALL, ""); \ + _UNSET_LC_NUMERIC \ try \ { \ _PROGRAM(argc,argv); \ return 0; \ } \ - else \ - return -1; \ + else_switch_failures \ + { \ + case SYSTEM_FAILURE: \ + errno=_ERRNO; \ + perror(errstr); /* and return -1 */ \ + default: \ + return -1; \ + } \ } \ _DECLARE_PROGRAM #ifdef USE_PREPROCESSOR