so://phie

ductape

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

blob: a0495809be3c3e6c8a23205384259f8e380a96c5 (1568 bytes)[doc][blame][raw]

1#ifndef SO_CTL_H

2#define SO_CTL_H

3

4#include <stdio.h>

5

6typedef void (*ctl_write_fn_t)(const char *);

7

8typedef struct {

9 ctl_write_fn_t write;

10} ctl_t;

11

12typedef int (*ctl_render_fn_t)(ctl_t *, void *, const char *);

13

14typedef struct {

15 ctl_render_fn_t fn;

16 void *data;

17 const char *dl_path;

18} ctl_templref_t;

19

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 }

44

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

46 __CTL_TEMPLDEF_MACRO($name, $params) \

47 \

48 void ctl_##$name(ctl_t *ctl, $name##_t *ctx);

49

50#define CTL_TEMPLDEF($name, $params) \

51 __CTL_TEMPLDEF_MACRO($name, $params) \

52 \

53 void ctl_##$name(ctl_t *ctl, $name##_t *ctx) {

54

55#define CTL_ENDTEMPL }

56

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 },

63

64#define CTL_WRITE($str) ctl->write($str);

65

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

67

68#endif /* SO_CTL_H */