-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathprim.h
More file actions
103 lines (86 loc) · 3.18 KB
/
prim.h
File metadata and controls
103 lines (86 loc) · 3.18 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
/* prim.h -- definitions for es primitives ($Revision: 1.1.1.1 $) */
#define PRIMSMAX 500
#define MODULE1(Name) static Primitive CONCAT(primsdef_, Name)[] =
#define ENDMODULE1(Name, Onload, Onunload) \
; \
Module module_info = (Module){ \
.name = STRING(Name), \
.onload = Onload, \
.onunload = Onunload, \
.apiversion = DynLibApi, \
.primitives = CONCAT(primsdef_, Name), \
};
#define MODULE(Name, Onload, Onunload, Prims...) \
MODULE1(Name) {Prims PRIMSEND,} ENDMODULE1(Name, Onload, Onunload);
#define PRIM(name) static List *CONCAT(prim_,name)( List * list, Binding * binding, int evalflags)
#define DX(name) \
(Primitive) \
{ \
STRING(name), CONCAT(&prim_, name) \
}
#define PRIMSEND {0, 0}
enum {
DynLibApi = 6,
// loading errors
ErrorOkay = 0,
ErrorModuleNotLoaded = 1,
ErrorModuleMissingSymbol = 2,
// unloading errors
ErrorModuleInUse = 3, // if the module is in use
ErrorModuleBuiltin = 4, // if the module is compiled into es
// other errors
ErrorOther = -126,
ErrorModuleUnreachable = -127, // if the module can't be unloaded but es can't continue
};
typedef struct Primitive Primitive;
typedef struct DynamicLibrary DynamicLibrary;
typedef struct Module Module;
/* we need to mirror a bit of dlfcn.h here */
typedef void (*DynFunction)(void *);
struct Module {
char *name;
int (*onload)(void);
int (*onunload)(void);
int64_t apiversion;
Primitive *primitives;
};
struct DynamicLibrary {
char *fname;
char *name;
void *handle;
Module *module;
Primitive *prims;
size_t primslen;
int (*onload)(void);
int (*onunload)(void);
int builtin;
DynamicLibrary *next;
};
struct Primitive {
char *name;
List *(*symbol)(List *, Binding *, int);
};
extern Dict *initprims_controlflow(Dict *primdict); /* prim-ctl.c */
extern Dict *initprims_io(Dict *primdict); /* prim-io.c */
extern Dict *initprims_etc(Dict *primdict); /* prim-etc.c */
extern Dict *initprims_sys(Dict *primdict); /* prim-sys.c */
extern Dict *initprims_proc(Dict *primdict); /* proc.c */
extern Dict *initprims_access(Dict *primdict); /* access.c */
extern Dict *initprims_dict(Dict *primdict); /* prim-dict.c */
extern Dict *initprims_mv(Dict *primdict); /* prim-mv.c */
extern Dict *initprims_math(Dict *primdict); /* prim-math.c */
#ifdef DYNAMIC_LIBRARIES
extern Dict *initprims_dynlib(Dict *primdict); /* dynlib.c */
#endif
/* prim.c */
extern Dict *primitives(void);
extern void add_prim(char *name, List *(*primfn)(List *, Binding *, int));
extern void remove_prim(char *name);
#ifdef DYNAMIC_LIBRARIES
/* dynlib.c */
extern DynamicLibrary *open_library(char *fname, char *errstr, size_t errstrlen);
extern int close_library(DynamicLibrary *lib, char *errstr, size_t errstrlen);
extern DynamicLibrary *dynlib(char *name);
extern DynamicLibrary *dynlib_file(char *fname);
extern void *dynsymbol(DynamicLibrary *lib, char *symbol);
#endif