Static template generator for C
git clone git://soophie.de/ductape
blob: a0495809be3c3e6c8a23205384259f8e380a96c5 (1568 bytes)[doc][blame][raw]
1
#ifndef SO_CTL_H2
#define SO_CTL_H4
#include <stdio.h>6
typedef void (*ctl_write_fn_t)(const char *);8
typedef struct {9
ctl_write_fn_t write;10
} ctl_t;12
typedef int (*ctl_render_fn_t)(ctl_t *, void *, const char *);14
typedef struct {15
ctl_render_fn_t fn;16
void *data;17
const char *dl_path;18
} ctl_templref_t;20
#define __CTL_TEMPLDEF_MACRO($name, $params) \21
typedef struct { \22
$params \23
} $name##_t; \24
\25
typedef void (*$name##_fn_t)(ctl_t *, $name##_t *); \26
\27
int $name##_render(ctl_t *ctl, void *ctx, const char *dl_path) { \28
void *handle = dlopen(dl_path, RTLD_NOW); \29
if (!handle) { \30
fprintf(stderr, "%s\n", dlerror()); \31
return 1; \32
} \33
$name##_fn_t fn = ($name##_fn_t) dlsym(handle, "ctl_" #$name); \34
char *err = dlerror(); \35
if (err) { \36
fprintf(stderr, "%s\n", err); \37
dlclose(handle); \38
return 1; \39
} \40
fn(ctl, ($name##_t *) ctx); \41
dlclose(handle); \42
return 0; \43
}45
#define __CTL_TEMPLDEF_HEADER($name, $params) \46
__CTL_TEMPLDEF_MACRO($name, $params) \47
\48
void ctl_##$name(ctl_t *ctl, $name##_t *ctx);50
#define CTL_TEMPLDEF($name, $params) \51
__CTL_TEMPLDEF_MACRO($name, $params) \52
\53
void ctl_##$name(ctl_t *ctl, $name##_t *ctx) {55
#define CTL_ENDTEMPL }57
#define CTL_TEMPLBIND($name, $data, $dl_path) \58
(ctl_templref_t) { \59
.fn = $name##_render, \60
.data = $data, \61
.dl_path = $dl_path, \62
},64
#define CTL_WRITE($str) ctl->write($str);66
#define CTL_INCLUDE($name) ctx->$name.fn(ctl, ctx->$name.data, ctx->$name.dl_path);68
#endif /* SO_CTL_H */