so://phie

ductape

Static template generator for C
git clone git://soophie.de/ductape

blob: 03e9c50c92e0f670bb01b3e9273710b68398613c (1410 bytes)[doc][blame][raw]

1#ifndef _SO_CTL_H

2#define _SO_CTL_H

3

4#include <stdio.h>

5#include <stdlib.h>

6

7typedef int (*ctl_render_fn_t)(void *, void *, const char *);

8

9typedef struct {

10 ctl_render_fn_t fn;

11 void *data;

12 const char *dl_path;

13} ctl_templref_t;

14

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 }

39

40#define __TEMPLDEF_HEADER($name, $params) \

41 __TEMPLDEF_MACRO($name, $params) \

42 \

43 void ctl_##$name(void *out, $name##_t *ctx);

44

45#define TEMPLDEF($name, $params) \

46 __TEMPLDEF_MACRO($name, $params) \

47 \

48 void ctl_##$name(void *out, $name##_t *ctx) {

49

50#define ENDTEMPL }

51

52#define TEMPLBIND($name, $data, $dl_path) \

53 (ctl_templref_t) { \

54 .fn = $name##_render, \

55 .data = $data, \

56 .dl_path = $dl_path, \

57 },

58

59#define INCLUDE($name) ctx->$name.fn(ctl, ctx->$name.data, ctx->$name.dl_path);

60

61#endif // _SO_CTL_H