Static template generator for C
git clone git://soophie.de/ductape
4
#include <stdio.h>5
#include <stdlib.h>7
typedef struct ctl_t ctl_t;9
struct ctl_t {10
void *out;11
};13
typedef int (*ctl_render_fn_t)(ctl_t *, void *, const char *);7
typedef int (*ctl_render_fn_t)(void *, void *, const char *);9
typedef struct {10
ctl_render_fn_t fn;
17
$params \18
} $name##_t; \19
\26
typedef void (*$name##_fn_t)(ctl_t *, $name##_t *); \20
typedef void (*$name##_fn_t)(void *, $name##_t *); \21
\28
int $name##_render(ctl_t *ctl, void *ctx, const char *dl_path) { \22
int $name##_render(void *out, void *ctx, const char *dl_path) { \23
void *handle = dlopen(dl_path, RTLD_NOW); \24
if (!handle) { \25
fprintf(stderr, "%s\n", dlerror()); \
32
dlclose(handle); \33
return 1; \34
} \41
fn(ctl, ($name##_t *) ctx); \35
fn(out, ($name##_t *) ctx); \36
dlclose(handle); \37
return 0; \38
}
40
#define __TEMPLDEF_HEADER($name, $params) \41
__TEMPLDEF_MACRO($name, $params) \42
\49
void ctl_##$name(ctl_t *ctl, $name##_t *ctx);43
void ctl_##$name(void *out, $name##_t *ctx);45
#define TEMPLDEF($name, $params) \46
__TEMPLDEF_MACRO($name, $params) \47
\54
void ctl_##$name(ctl_t *ctl, $name##_t *ctx) {48
void ctl_##$name(void *out, $name##_t *ctx) {50
#define ENDTEMPL }
59
#define INCLUDE($name) ctx->$name.fn(ctl, ctx->$name.data, ctx->$name.dl_path);67
ctl_t *ctl_init(void *out);68
void ctl_cleanup(ctl_t *self);70
#ifdef SO_CTL_IMPL72
ctl_t *ctl_init(void *out) {73
ctl_t *self = (ctl_t *) malloc(sizeof(ctl_t));74
*self = (ctl_t) {75
.out = out,76
};77
return self;78
}80
void ctl_cleanup(ctl_t *self) {81
if (!self) return;82
free(self);83
}85
#endif // SO_CTL_IMPL61
#endif // _SO_CTL_H