X-Git-Url: https://git.harvie.cz/?a=blobdiff_plain;ds=sidebyside;f=cll1.h;h=c49fa3c2a98997bb8a92bc28c0435d36310a0c6f;hb=eeff2724ab61172d037fbba78785a25d691b6ad1;hp=d38f2cd5c11f4cadd323522a94340707dbf0bd5b;hpb=24cfa6bd1046afbbe6049d9b463cf76c97d5e7d4;p=svn%2FCll1h%2F.git diff --git a/cll1.h b/cll1.h index d38f2cd..c49fa3c 100644 --- a/cll1.h +++ b/cll1.h @@ -85,9 +85,11 @@ extern unsigned RANDOM_SEED; #define or || #define TRUE 1 #define FALSE 0 +#define PI 3.141592654 #define WEIRDINT (1<<(sizeof(int)*8-1)) #define btoa(EXPR) ((EXPR)?"TRUE":"FALSE") -#define coalesce(VAR,EXPR) (VAR?VAR:(EXPR)) +#define coalesce(VAR,EXPR) (VAR?VAR:(VAR=0,(EXPR))) +#define coalesce_str(VAR,EXPR) (VAR && *VAR?VAR:((VAR=NULL),(EXPR))) /* .----------------------------------------------------------------------. / 4. C<<1 data declaration and allocation, updated 2008-01-31 xCh. '----------------------------------------------------------------------- */ @@ -184,7 +186,7 @@ extern unsigned RANDOM_SEED; #define construct(TYPE,INTERFACE) TYPE _init_##TYPE(TYPE o,INTERFACE i) { o->__interface=i; return o; } TYPE __init__##TYPE #define get_obj(TYPE,INTERFACE,...) __init__##TYPE(_init_##TYPE(get_mem(TYPE),INTERFACE),__VA_ARGS__) #define get_obj_as(COMMUNITY,MEM,INTERFACE,...) (COMMUNITY)get_obj(MEM,INTERFACE,__VA_ARGS__) -#define _(METHOD,...) (((_ARG1(__VA_ARGS__,)) && (_ARG1(__VA_ARGS__,))->__interface->METHOD)?(*( (_ARG1(__VA_ARGS__,))->__interface->METHOD )) ((void *)__VA_ARGS__):0 ) +#define _(METHOD,...) ((((_ARG1(__VA_ARGS__,)) || /* will not compile if object is not lvalue: */(_ARG1(__VA_ARGS__,)=NULL)) && (_ARG1(__VA_ARGS__,))->__interface->METHOD)?(*( (_ARG1(__VA_ARGS__,))->__interface->METHOD )) ((void *)__VA_ARGS__):0) #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; }; @@ -192,7 +194,7 @@ extern unsigned RANDOM_SEED; /* 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__) -#define I_am(MEM) MEM self=(MEM)community +#define I_am(SELF,MEM) MEM SELF=(MEM)community /* .----------------------------------------------------------------------. / 9. implementation of C<<1 library functions, updated 2008-01-26 xCh. '----------------------------------------------------------------------- */