LC_NUMERIC locale will be set to "C" by default
[svn/Cll1h/.git] / cll1.h
diff --git a/cll1.h b/cll1.h
index a3a6a317773105dca4fd3e15b3163ac757104fd4..78642ffbb627fe54a8afeedd91d470e9ed194746 100644 (file)
--- a/cll1.h
+++ b/cll1.h
@@ -43,6 +43,7 @@
 #include <stdarg.h>
 #include <unistd.h>
 #include <setjmp.h>
+#include <errno.h>
 #include <locale.h>
 #ifdef USE_LIBRARY_FASTCGI
 #include <fcgi_stdio.h>
 #include <mysql/mysql.h>
 #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) (K1<K2)
+#define order_by_num(K1,K2) (K1>K2)
+#define order_by_num_desc(K1,K2) (K1<K2)
 #define order_by_str(K1,K2) (str_order(K1,K2)>0)
 #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
This page took 0.193659 seconds and 4 git commands to generate.