make compile as a janet module
s-ol
3 years ago
0 | all: src/janet.o src/shell.o src/main.o | |
1 | g++ -o main $^ lib/lib2geom.a -ldl -ldouble-conversion -lgsl -lgslcblas -lm | |
2 | ||
3 | src/janet.o: src/janet.c | |
4 | gcc -c -o $@ -Iinclude $< | |
5 | ||
6 | src/shell.o: src/shell.c | |
7 | gcc -c -o $@ -Iinclude $< | |
8 | ||
9 | src/main.o: src/main.cpp | |
10 | g++ -c -o $@ -Iinclude $< |
0 | (declare-project :name "geom") | |
1 | ||
2 | (os/shell (string/join [ | |
3 | "mkdir" "-p" "lib2geom/build" "&&" | |
4 | "cd" "lib2geom/build" "&&" | |
5 | "cmake" ".." "-D2GEOM_BUILD_SHARED:BOOL=ON" "&&" | |
6 | "make" "2geom"] " ")) | |
7 | (declare-native :name "geom" :source @["src/point.cpp" "src/main.cpp"] | |
8 | :compiler "g++" | |
9 | :linker "g++" | |
10 | :cflags ["-Wall" "-Wextra" "-Ilib2geom/src" "-Llib2geom/build/src/2geom"] | |
11 | :lflags ["-l2geom" "-ldl" "-ldouble-conversion" "-lgsl" "-lgslcblas" "-lm"]) |
0 | #include <iostream> | |
1 | #include <sstream> | |
2 | #include <2geom/point.h> | |
3 | #include <janet.h> | |
0 | #include "point.h" | |
4 | 1 | |
5 | #define JDOC(x) x | |
2 | extern "C" { | |
6 | 3 | |
7 | ||
8 | ||
9 | /* | |
10 | static void 2geom_point_marshal(void *p, JanetMarshalContext *ctx) { | |
11 | janet_marshal_int64(ctx, *((int64_t *)p)); | |
4 | JANET_MODULE_ENTRY(JanetTable *env) { | |
5 | janet_lib_geom_point(env); | |
12 | 6 | } |
13 | 7 | |
14 | static void 2geom_point_unmarshal(void *p, JanetMarshalContext *ctx) { | |
15 | *((int64_t *)p) = janet_unmarshal_int64(ctx); | |
16 | 8 | } |
17 | */ | |
18 | ||
19 | extern "C" Janet geom_point_get(void *p, Janet key); | |
20 | ||
21 | extern "C" void geom_point_tostring(void *p, JanetBuffer *buffer) { | |
22 | std::stringstream stream; | |
23 | stream << "<2geom/point " << *static_cast<Geom::Point *>(p) << ">"; | |
24 | janet_buffer_push_cstring(buffer, stream.str().c_str()); | |
25 | } | |
26 | ||
27 | ||
28 | static const JanetAbstractType geom_point_type = { | |
29 | "2geom/point", | |
30 | NULL, | |
31 | NULL, | |
32 | geom_point_get, | |
33 | NULL, // geom_point_set, | |
34 | NULL, // geom_point_marshal, | |
35 | NULL, // geom_point_unmarshal, | |
36 | geom_point_tostring | |
37 | }; | |
38 | ||
39 | ||
40 | Janet janet_wrap_point(Geom::Point const &x) { | |
41 | Geom::Point *box = (Geom::Point *)janet_abstract(&geom_point_type, sizeof(Geom::Point)); | |
42 | *box = (Geom::Point)x; | |
43 | return janet_wrap_abstract(box); | |
44 | } | |
45 | ||
46 | ||
47 | Geom::Point janet_unwrap_point(Janet x) { | |
48 | if (janet_checktype(x, JANET_ABSTRACT)) { | |
49 | void *abst = janet_unwrap_abstract(x); | |
50 | if (janet_abstract_type(abst) == &geom_point_type) | |
51 | return *(Geom::Point *)abst; | |
52 | } | |
53 | ||
54 | janet_panic("not a point"); | |
55 | return Geom::Point(); | |
56 | } | |
57 | ||
58 | ||
59 | extern "C" Janet cfun_geom_point_new(int32_t argc, Janet *argv) { | |
60 | janet_fixarity(argc, 2); | |
61 | double x = janet_getnumber(argv, 0); | |
62 | double y = janet_getnumber(argv, 1); | |
63 | return janet_wrap_point(Geom::Point(x, y)); | |
64 | } | |
65 | ||
66 | const JanetReg it_cfuns[] = { | |
67 | { | |
68 | "geom/point", cfun_geom_point_new, | |
69 | JDOC("(geom/point x y)\n\n" | |
70 | "Create a boxed Point from x/y coordinate values.") | |
71 | }, | |
72 | {NULL, NULL, NULL} | |
73 | }; | |
74 | ||
75 | ||
76 | #define OPMETHOD(name, oper) \ | |
77 | static Janet cfun_geom_point_##name(int32_t argc, Janet *argv) { \ | |
78 | janet_arity(argc, 2, -1); \ | |
79 | Geom::Point *box = (Geom::Point *)janet_abstract(&geom_point_type, sizeof(Geom::Point)); \ | |
80 | *box = janet_unwrap_point(argv[0]); \ | |
81 | for (int i = 1; i < argc; i++) \ | |
82 | *box oper##= janet_unwrap_point(argv[i]); \ | |
83 | return janet_wrap_abstract(box); \ | |
84 | } \ | |
85 | \ | |
86 | static Janet cfun_geom_point_##name##_mut(int32_t argc, Janet *argv) { \ | |
87 | janet_arity(argc, 2, -1); \ | |
88 | Geom::Point *box = (Geom::Point *)janet_abstract(&geom_point_type, sizeof(Geom::Point)); \ | |
89 | for (int i = 1; i < argc; i++) \ | |
90 | *box oper##= janet_unwrap_point(argv[i]); \ | |
91 | return janet_wrap_abstract(box); \ | |
92 | } | |
93 | ||
94 | OPMETHOD(add, +) | |
95 | OPMETHOD(sub, -) | |
96 | ||
97 | static JanetMethod geom_point_methods[] = { | |
98 | {"+", cfun_geom_point_add}, | |
99 | {"-", cfun_geom_point_sub}, | |
100 | {NULL, NULL} | |
101 | }; | |
102 | ||
103 | ||
104 | extern "C" Janet geom_point_get(void *p, Janet key) { | |
105 | Geom::Point *box = (Geom::Point *)p; | |
106 | if (!janet_checktype(key, JANET_KEYWORD)) | |
107 | janet_panicf("expected keyword, got %v", key); | |
108 | ||
109 | uint8_t const *keystr = janet_unwrap_keyword(key); | |
110 | if (janet_string_equal(keystr, janet_cstring("x"))) { | |
111 | return janet_wrap_number(box->x()); | |
112 | } else if (janet_string_equal(keystr, janet_cstring("y"))) { | |
113 | return janet_wrap_number(box->y()); | |
114 | } else { | |
115 | return janet_getmethod(keystr, geom_point_methods); | |
116 | } | |
117 | } | |
118 | ||
119 | extern "C" void register_janet_stuff(JanetTable *env) { | |
120 | janet_cfuns(env, NULL, it_cfuns); | |
121 | janet_register_abstract_type(&geom_point_type); | |
122 | } |
0 | #include "point.h" | |
1 | ||
2 | #include <sstream> | |
3 | ||
4 | extern "C" Janet geom_point_get(void *p, Janet key); | |
5 | ||
6 | extern "C" void geom_point_tostring(void *p, JanetBuffer *buffer) { | |
7 | std::stringstream stream; | |
8 | stream << "<2geom/point " << *static_cast<Geom::Point *>(p) << ">"; | |
9 | janet_buffer_push_cstring(buffer, stream.str().c_str()); | |
10 | } | |
11 | ||
12 | ||
13 | const JanetAbstractType geom_point_type = { | |
14 | "2geom/point", | |
15 | NULL, | |
16 | NULL, | |
17 | geom_point_get, | |
18 | NULL, | |
19 | NULL, | |
20 | NULL, | |
21 | geom_point_tostring | |
22 | }; | |
23 | ||
24 | ||
25 | Janet janet_wrap_point(Geom::Point const &x) { | |
26 | Geom::Point *box = (Geom::Point *)janet_abstract(&geom_point_type, sizeof(Geom::Point)); | |
27 | *box = (Geom::Point)x; | |
28 | return janet_wrap_abstract(box); | |
29 | } | |
30 | ||
31 | ||
32 | Geom::Point janet_unwrap_point(Janet x) { | |
33 | if (janet_checktype(x, JANET_ABSTRACT)) { | |
34 | void *abst = janet_unwrap_abstract(x); | |
35 | if (janet_abstract_type(abst) == &geom_point_type) | |
36 | return *(Geom::Point *)abst; | |
37 | } | |
38 | ||
39 | janet_panic("not a point"); | |
40 | return Geom::Point(); | |
41 | } | |
42 | ||
43 | ||
44 | extern "C" Janet cfun_geom_point_new(int32_t argc, Janet *argv) { | |
45 | janet_fixarity(argc, 2); | |
46 | double x = janet_getnumber(argv, 0); | |
47 | double y = janet_getnumber(argv, 1); | |
48 | return janet_wrap_point(Geom::Point(x, y)); | |
49 | } | |
50 | ||
51 | const JanetReg it_cfuns[] = { | |
52 | { | |
53 | "point", cfun_geom_point_new, | |
54 | "(geom/point x y)\n\nCreate a Point from x/y coordinate values." | |
55 | }, | |
56 | {NULL, NULL, NULL} | |
57 | }; | |
58 | ||
59 | ||
60 | #define OPMETHOD(name, oper) \ | |
61 | static Janet cfun_geom_point_##name(int32_t argc, Janet *argv) { \ | |
62 | janet_arity(argc, 2, -1); \ | |
63 | Geom::Point *box = (Geom::Point *)janet_abstract(&geom_point_type, sizeof(Geom::Point)); \ | |
64 | *box = janet_unwrap_point(argv[0]); \ | |
65 | for (int i = 1; i < argc; i++) \ | |
66 | *box oper##= janet_unwrap_point(argv[i]); \ | |
67 | return janet_wrap_abstract(box); \ | |
68 | } \ | |
69 | \ | |
70 | static Janet cfun_geom_point_##name##_mut(int32_t argc, Janet *argv) { \ | |
71 | janet_arity(argc, 2, -1); \ | |
72 | Geom::Point *box = (Geom::Point *)janet_abstract(&geom_point_type, sizeof(Geom::Point)); \ | |
73 | for (int i = 1; i < argc; i++) \ | |
74 | *box oper##= janet_unwrap_point(argv[i]); \ | |
75 | return janet_wrap_abstract(box); \ | |
76 | } | |
77 | ||
78 | OPMETHOD(add, +) | |
79 | OPMETHOD(sub, -) | |
80 | ||
81 | static JanetMethod geom_point_methods[] = { | |
82 | {"+", cfun_geom_point_add}, | |
83 | {"-", cfun_geom_point_sub}, | |
84 | {NULL, NULL} | |
85 | }; | |
86 | ||
87 | extern "C" Janet geom_point_get(void *p, Janet key) { | |
88 | Geom::Point *box = (Geom::Point *)p; | |
89 | if (!janet_checktype(key, JANET_KEYWORD)) | |
90 | janet_panicf("expected keyword, got %v", key); | |
91 | ||
92 | uint8_t const *keystr = janet_unwrap_keyword(key); | |
93 | if (janet_string_equal(keystr, janet_cstring("x"))) { | |
94 | return janet_wrap_number(box->x()); | |
95 | } else if (janet_string_equal(keystr, janet_cstring("y"))) { | |
96 | return janet_wrap_number(box->y()); | |
97 | } else { | |
98 | return janet_getmethod(keystr, geom_point_methods); | |
99 | } | |
100 | } | |
101 | ||
102 | extern "C" void janet_lib_geom_point(JanetTable *env) { | |
103 | janet_cfuns(env, NULL, it_cfuns); | |
104 | janet_register_abstract_type(&geom_point_type); | |
105 | } |
0 | #ifndef JANET_2GEOM_POINT_INCLUDED | |
1 | #define JANET_2GEOM_POINT_INCLUDED | |
2 | ||
3 | #include <janet.h> | |
4 | ||
5 | #ifdef __cplusplus | |
6 | #include <2geom/point.h> | |
7 | Janet janet_wrap_point(Geom::Point const &x); | |
8 | Geom::Point janet_unwrap_point(Janet x); | |
9 | ||
10 | extern "C" { | |
11 | #endif | |
12 | ||
13 | extern const JanetAbstractType geom_point_type; | |
14 | ||
15 | void janet_lib_geom_point(JanetTable *env); | |
16 | ||
17 | #ifdef __cplusplus | |
18 | } | |
19 | #endif | |
20 | ||
21 | #endif // JANET_2GEOM_POINT_INCLUDED |