Static template generator for C
git clone git://soophie.de/ductape
blob: 8a58fd154e0eeb1e39ebaed263b4821ce6d926b0 (1785 bytes)[doc][blame][raw]
1
#ifndef _SO_CTL_H2
#define _SO_CTL_H4
#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 *);15
typedef struct {16
ctl_render_fn_t fn;17
void *data;18
const char *dl_path;19
} ctl_templref_t;21
#define __TEMPLDEF_MACRO($name, $params) \22
typedef struct { \23
$params \24
} $name##_t; \25
\26
typedef void (*$name##_fn_t)(ctl_t *, $name##_t *); \27
\28
int $name##_render(ctl_t *ctl, void *ctx, const char *dl_path) { \29
void *handle = dlopen(dl_path, RTLD_NOW); \30
if (!handle) { \31
fprintf(stderr, "%s\n", dlerror()); \32
return 1; \33
} \34
$name##_fn_t fn = ($name##_fn_t) dlsym(handle, "ctl_" #$name); \35
char *err = dlerror(); \36
if (err) { \37
fprintf(stderr, "%s\n", err); \38
dlclose(handle); \39
return 1; \40
} \41
fn(ctl, ($name##_t *) ctx); \42
dlclose(handle); \43
return 0; \44
}46
#define __TEMPLDEF_HEADER($name, $params) \47
__TEMPLDEF_MACRO($name, $params) \48
\49
void ctl_##$name(ctl_t *ctl, $name##_t *ctx);51
#define TEMPLDEF($name, $params) \52
__TEMPLDEF_MACRO($name, $params) \53
\54
void ctl_##$name(ctl_t *ctl, $name##_t *ctx) {56
#define ENDTEMPL }58
#define TEMPLBIND($name, $data, $dl_path) \59
(ctl_templref_t) { \60
.fn = $name##_render, \61
.data = $data, \62
.dl_path = $dl_path, \63
},65
#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_IMPL86
#endif // _SO_CTL_H