Static template generator for C
git clone git://soophie.de/ductape
blob: 03e9c50c92e0f670bb01b3e9273710b68398613c (1410 bytes)[doc][blame][raw]
1
#ifndef _SO_CTL_H2
#define _SO_CTL_H4
#include <stdio.h>5
#include <stdlib.h>7
typedef int (*ctl_render_fn_t)(void *, void *, const char *);9
typedef struct {10
ctl_render_fn_t fn;11
void *data;12
const char *dl_path;13
} ctl_templref_t;15
#define __TEMPLDEF_MACRO($name, $params) \16
typedef struct { \17
$params \18
} $name##_t; \19
\20
typedef void (*$name##_fn_t)(void *, $name##_t *); \21
\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()); \26
return 1; \27
} \28
$name##_fn_t fn = ($name##_fn_t) dlsym(handle, "ctl_" #$name); \29
char *err = dlerror(); \30
if (err) { \31
fprintf(stderr, "%s\n", err); \32
dlclose(handle); \33
return 1; \34
} \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
\43
void ctl_##$name(void *out, $name##_t *ctx);45
#define TEMPLDEF($name, $params) \46
__TEMPLDEF_MACRO($name, $params) \47
\48
void ctl_##$name(void *out, $name##_t *ctx) {50
#define ENDTEMPL }52
#define TEMPLBIND($name, $data, $dl_path) \53
(ctl_templref_t) { \54
.fn = $name##_render, \55
.data = $data, \56
.dl_path = $dl_path, \57
},59
#define INCLUDE($name) ctx->$name.fn(ctl, ctx->$name.data, ctx->$name.dl_path);61
#endif // _SO_CTL_H