so://phie

ductape

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

blob: 8a58fd154e0eeb1e39ebaed263b4821ce6d926b0 (1785 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 struct ctl_t ctl_t;

8

9struct ctl_t {

10 void *out;

11};

12

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

14

15typedef struct {

16 ctl_render_fn_t fn;

17 void *data;

18 const char *dl_path;

19} ctl_templref_t;

20

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 }

45

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

47 __TEMPLDEF_MACRO($name, $params) \

48 \

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

50

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

52 __TEMPLDEF_MACRO($name, $params) \

53 \

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

55

56#define ENDTEMPL }

57

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

59 (ctl_templref_t) { \

60 .fn = $name##_render, \

61 .data = $data, \

62 .dl_path = $dl_path, \

63 },

64

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

66

67ctl_t *ctl_init(void *out);

68void ctl_cleanup(ctl_t *self);

69

70#ifdef SO_CTL_IMPL

71

72ctl_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}

79

80void ctl_cleanup(ctl_t *self) {

81 if (!self) return;

82 free(self);

83}

84

85#endif // SO_CTL_IMPL

86#endif // _SO_CTL_H