bindings-DSL 1.0.12 → 1.0.14
raw patch · 2 files changed
+50/−41 lines, 2 filesPVP ok
version bump matches the API change (PVP)
API changes (from Hackage documentation)
Files
- bindings-DSL.cabal +1/−1
- bindings.dsl.h +49/−40
bindings-DSL.cabal view
@@ -17,7 +17,7 @@ . This package contains no Haskell code, only C header files designed for hsc2hs.-version: 1.0.12+version: 1.0.14 license: BSD3 license-file: LICENSE maintainer: Maurício C. Antunes <mauricio.antunes@gmail.com>
bindings.dsl.h view
@@ -69,12 +69,6 @@ #define bc_dynamic(name) {printf("mK'");bc_word(name);}; \ -#define bc_fieldname(type,field) {printf("c'");bc_glue(type,field);}; \--#define bc_unionupdate(type,field) {printf("u'");bc_glue(type,field);}; \--#define bc_famaccess(type,field) {printf("p'");bc_glue(type,field);}; \- #define bc_decimal(name) (name) > 0 \ ? printf("%"PRIuMAX,(uintmax_t)(name)) \ : printf("%"PRIdMAX,(intmax_t)(name)) \@@ -177,63 +171,83 @@ char fname[500][1000], ftype[500][1000]; } bc_fielddata; +#define bc_fieldname(type,field) {printf("c'");bc_glue(type,field);}; \++#define bc_unionupdate(type,field) {printf("u'");bc_glue(type,field);}; \++#define bc_fieldoffset(type,field) {printf("p'");bc_glue(type,field);}; \+ #define hsc_starttype(name) \ { \ name *refpointer = 0; \ bc_fielddata.n = 0; \- printf("data ");bc_conid(# name);printf(" = "); \- bc_conid(# name);printf("{"); \ char typename[] = # name; \ size_t typesize = sizeof(name); \ int index; \ -#define hsc_field(name,type) \+#define bc_basicfield(name,type,a,u,f) \ index = bc_fielddata.n++; \- if (index > 0) printf(","); \- printf("\n "); \- bc_fieldname(typename,# name); \- printf(" :: ");bc_typemarkup(# type); \ bc_fielddata.offset[index] = (uintmax_t) \ ((char*)&refpointer->name - (char*)refpointer); \- bc_fielddata.is_array[index] = 0; \- bc_fielddata.is_union[index] = 0; \- bc_fielddata.is_fam[index] = 0; \+ bc_fielddata.is_array[index] = a; \+ bc_fielddata.is_union[index] = u; \+ bc_fielddata.is_fam[index] = f; \ strcpy(bc_fielddata.fname[index],# name); \- strcpy(bc_fielddata.ftype[index],# type); \+ strcpy(bc_fielddata.ftype[index],type); \ +#define hsc_field(name,type) \+ bc_basicfield(name,# type,0,0,0); \++#define hsc_union_field(name,type) \+ bc_basicfield(name,# type,0,1,0); \++#define hsc_flexible_array_member(name,type) \+ bc_basicfield(name,# type,1,0,1); \+ #define hsc_array_field(name,type) \- hsc_field(name,[type]); \+ bc_basicfield(name,# type,1,0,0); \ bc_fielddata.howmany[index] = sizeof(refpointer->name) \ / sizeof(refpointer->name[0]); \- bc_fielddata.is_array[index] = 1; \ -#define hsc_union_field(name,type) \- hsc_field(name,type); \- bc_fielddata.is_union[index] = 1; \- #define hsc_union_array_field(name,type) \- hsc_array_field(name,type); \- bc_fielddata.is_union[index] = 1; \--#define hsc_flexible_array_member(name,type) \- hsc_field(name,[type]); \- bc_fielddata.is_fam[index] = 1; \- strcpy(bc_fielddata.ftype[index],# type); \+ bc_basicfield(name,# type,1,1,0); \+ bc_fielddata.howmany[index] = sizeof(refpointer->name) \+ / sizeof(refpointer->name[0]); \ #define hsc_stoptype(dummy) \- printf("\n } deriving (Eq,Show)\n"); \+ printf("data ");bc_conid(typename);printf(" = "); \+ bc_conid(typename);printf("{\n"); \ int i; \- for (i=0; i < bc_fielddata.n; i++) if (bc_fielddata.is_fam[i]) \+ for (i=0; i < bc_fielddata.n; i++) \ { \- bc_famaccess(typename,bc_fielddata.fname[i]); \+ printf(" "); \+ bc_fieldname(typename,bc_fielddata.fname[i]); \+ printf(" :: "); \+ if (bc_fielddata.is_array[i]) printf("["); \+ bc_typemarkup(bc_fielddata.ftype[i]); \+ if (bc_fielddata.is_array[i]) printf("]"); \+ if (i+1 < bc_fielddata.n) printf(","); \+ printf("\n"); \+ } \+ printf("} deriving (Eq,Show)\n"); \+ for (i=0; i < bc_fielddata.n; i++) \+ { \+ bc_fieldoffset(typename,bc_fielddata.fname[i]); \ printf(" p = plusPtr p %"PRIuMAX"\n",bc_fielddata.offset[i]); \- bc_famaccess(typename,bc_fielddata.fname[i]); \+ bc_fieldoffset(typename,bc_fielddata.fname[i]); \ printf(" :: Ptr (");bc_conid(typename);printf(") -> "); \ printf("Ptr (");bc_typemarkup(bc_fielddata.ftype[i]);printf(")\n"); \ } \ for (i=0; i < bc_fielddata.n; i++) if (bc_fielddata.is_union[i]) \ { \ bc_unionupdate(typename,bc_fielddata.fname[i]); \+ printf(" :: ");bc_conid(typename);printf(" -> "); \+ if (bc_fielddata.is_array[i]) printf("["); \+ bc_typemarkup(bc_fielddata.ftype[i]); \+ if (bc_fielddata.is_array[i]) printf("]"); \+ printf(" -> IO ");bc_conid(typename); \+ printf("\n"); \+ bc_unionupdate(typename,bc_fielddata.fname[i]); \ printf(" v vf = alloca $ \\p -> do\n"); \ printf(" poke p v\n"); \ if (bc_fielddata.is_array[i]) \@@ -248,7 +262,7 @@ bc_fielddata.offset[i]); \ printf("\n"); \ printf(" vu <- peek p\n"); \- printf(" return $ v \n"); \+ printf(" return $ v\n"); \ int j; \ for (j=0; j < bc_fielddata.n; j++) if (bc_fielddata.is_union[j]) \ { \@@ -256,11 +270,6 @@ printf(" = "); bc_fieldname(typename,bc_fielddata.fname[j]); \ printf(" vu}\n"); \ } \- bc_unionupdate(typename,bc_fielddata.fname[i]); \- printf(" :: ");bc_conid(typename); \- printf(" -> ");bc_typemarkup(bc_fielddata.ftype[i]) \- printf(" -> IO ");bc_conid(typename); \- printf("\n"); \ } \ printf("instance Storable "); \ bc_conid(typename);printf(" where\n"); \