Phasor 3.3.0
Stack VM based Programming Language
Loading...
Searching...
No Matches
main.c
Go to the documentation of this file.
1#define PHASOR_FFI_BUILD_DLL
2#include <PhasorFFI.h>
3#include <fcntl.h>
4#include <unistd.h>
5#include <sys/stat.h>
6#include <dirent.h>
7#include <signal.h>
8#include <time.h>
9#include <sys/wait.h>
10#include <stdlib.h>
11#include <string.h>
12
13static PhasorValue phasor_open(PhasorVM *, int argc, const PhasorValue *argv)
14{
15 if (argc < 2 || !phasor_is_string(argv[0]) || !phasor_is_int(argv[1]))
16 return phasor_make_int(-1);
17 const char *path = phasor_to_string(argv[0]);
18 int flags = (int)phasor_to_int(argv[1]);
19 int fd = open(path, flags, 0666);
20 return phasor_make_int(fd);
21}
22
23static PhasorValue phasor_close(PhasorVM *, int argc, const PhasorValue *argv)
24{
25 if (argc < 1 || !phasor_is_int(argv[0]))
26 return phasor_make_int(-1);
27 int fd = (int)phasor_to_int(argv[0]);
28 return phasor_make_int(close(fd));
29}
30
31static PhasorValue phasor_read(PhasorVM *, int argc, const PhasorValue *argv)
32{
33 if (argc < 2 || !phasor_is_int(argv[0]) || !phasor_is_int(argv[1]))
34 return phasor_make_string("");
35 int fd = (int)phasor_to_int(argv[0]);
36 size_t count = (size_t)phasor_to_int(argv[1]);
37 char *buf = (char *)malloc(count + 1);
38 if (!buf)
39 return phasor_make_string("");
40 ssize_t r = read(fd, buf, count);
41 if (r >= 0)
42 buf[r] = '\0';
43 else
44 buf[0] = '\0';
46 free(buf);
47 return val;
48}
49
50static PhasorValue phasor_write(PhasorVM *, int argc, const PhasorValue *argv)
51{
52 if (argc < 2 || !phasor_is_int(argv[0]) || !phasor_is_string(argv[1]))
53 return phasor_make_int(-1);
54 int fd = (int)phasor_to_int(argv[0]);
55 const char *s = phasor_to_string(argv[1]);
56 ssize_t r = write(fd, s, strlen(s));
57 return phasor_make_int(r);
58}
59
60static PhasorValue phasor_unlink(PhasorVM *, int argc, const PhasorValue *argv)
61{
62 if (argc < 1 || !phasor_is_string(argv[0]))
63 return phasor_make_int(-1);
64 return phasor_make_int(unlink(phasor_to_string(argv[0])));
65}
66
67static PhasorValue phasor_mkdir(PhasorVM *, int argc, const PhasorValue *argv)
68{
69 if (argc < 1 || !phasor_is_string(argv[0]))
70 return phasor_make_int(-1);
71 const char *path = phasor_to_string(argv[0]);
72 return phasor_make_int(mkdir(path, 0777));
73}
74
75static PhasorValue phasor_rmdir(PhasorVM *, int argc, const PhasorValue *argv)
76{
77 if (argc < 1 || !phasor_is_string(argv[0]))
78 return phasor_make_int(-1);
79 return phasor_make_int(rmdir(phasor_to_string(argv[0])));
80}
81
83{
84 pid_t pid = fork();
85 return phasor_make_int((int64_t)pid);
86}
87
88static PhasorValue phasor_execve(PhasorVM *, int argc, const PhasorValue *argv)
89{
90 if (argc < 3 || !phasor_is_string(argv[0]) || !phasor_is_array(argv[1]) || !phasor_is_array(argv[2]))
91 {
92 return phasor_make_int(-1);
93 }
94 const char *path = phasor_to_string(argv[0]);
95 const PhasorValue *argarr = argv[1].as.a.elements;
96 size_t argcnt = argv[1].as.a.count;
97 const PhasorValue *envarr = argv[2].as.a.elements;
98 size_t envcnt = argv[2].as.a.count;
99
100 char **args = (char **)malloc((argcnt + 1) * sizeof(char *));
101 char **envs = (char **)malloc((envcnt + 1) * sizeof(char *));
102 for (size_t i = 0; i < argcnt; i++)
103 args[i] = (char *)phasor_to_string(argarr[i]);
104 args[argcnt] = NULL;
105 for (size_t i = 0; i < envcnt; i++)
106 envs[i] = (char *)phasor_to_string(envarr[i]);
107 envs[envcnt] = NULL;
108
109 int r = execve(path, args, envs);
110 free(args);
111 free(envs);
112 return phasor_make_int(r); // will only return on error
113}
114
115static PhasorValue phasor_waitpid(PhasorVM *, int argc, const PhasorValue *argv)
116{
117 if (argc < 2 || !phasor_is_int(argv[0]) || !phasor_is_int(argv[1]))
118 return phasor_make_int(-1);
119 pid_t pid = (pid_t)phasor_to_int(argv[0]);
120 int options = (int)phasor_to_int(argv[1]);
121 int status = 0;
122 pid_t r = waitpid(pid, &status, options);
124}
125
126static PhasorValue phasor_kill(PhasorVM *, int argc, const PhasorValue *argv)
127{
128 if (argc < 2 || !phasor_is_int(argv[0]) || !phasor_is_int(argv[1]))
129 return phasor_make_int(-1);
130 pid_t pid = (pid_t)phasor_to_int(argv[0]);
131 int sig = (int)phasor_to_int(argv[1]);
132 return phasor_make_int(kill(pid, sig));
133}
134
135static PhasorValue phasor_sleep(PhasorVM *, int argc, const PhasorValue *argv)
136{
137 if (argc < 1 || !phasor_is_int(argv[0]))
138 return phasor_make_int(-1);
139 unsigned int sec = (unsigned int)phasor_to_int(argv[0]);
140 unsigned int r = sleep(sec);
141 return phasor_make_int(r);
142}
143
144static PhasorValue phasor_nanosleep(PhasorVM *, int argc, const PhasorValue *argv)
145{
146 if (argc < 2 || !phasor_is_int(argv[0]) || !phasor_is_int(argv[1]))
147 return phasor_make_int(-1);
148 struct timespec req = {(time_t)phasor_to_int(argv[0]), (long)phasor_to_int(argv[1])};
149 struct timespec rem;
150 int r = nanosleep(&req, &rem);
151 return phasor_make_int(r);
152}
153
154static PhasorValue phasor_clock_gettime(PhasorVM *, int argc, const PhasorValue *argv)
155{
156 if (argc < 1 || !phasor_is_int(argv[0]))
157 return phasor_make_int(-1);
158 struct timespec ts;
159 clock_gettime((clockid_t)phasor_to_int(argv[0]), &ts);
160 PhasorValue vals[2] = {phasor_make_int(ts.tv_sec), phasor_make_int(ts.tv_nsec)};
161 return phasor_make_array(vals, 2);
162}
163
165{
166 api->register_function(vm, "posix_open", phasor_open);
167 api->register_function(vm, "posix_close", phasor_close);
168 api->register_function(vm, "posix_read", phasor_read);
169 api->register_function(vm, "posix_write", phasor_write);
170 api->register_function(vm, "posix_unlink", phasor_unlink);
171
172 api->register_function(vm, "posix_mkdir", phasor_mkdir);
173 api->register_function(vm, "posix_rmdir", phasor_rmdir);
174
175 api->register_function(vm, "posix_fork", phasor_fork);
176 api->register_function(vm, "posix_execve", phasor_execve);
177 api->register_function(vm, "posix_waitpid", phasor_waitpid);
178
179 api->register_function(vm, "posix_kill", phasor_kill);
180
181 api->register_function(vm, "posix_sleep", phasor_sleep);
182 api->register_function(vm, "posix_nanosleep", phasor_nanosleep);
183 api->register_function(vm, "posix_clock_gettime", phasor_clock_gettime);
184}
static bool phasor_is_string(PhasorValue val)
Definition PhasorFFI.h:165
static const char * phasor_to_string(PhasorValue val)
Definition PhasorFFI.h:194
static int64_t phasor_to_int(PhasorValue val)
Definition PhasorFFI.h:184
static PhasorValue phasor_make_array(const PhasorValue *elements, size_t count)
Definition PhasorFFI.h:139
static PhasorValue phasor_make_string(const char *s)
Definition PhasorFFI.h:131
static bool phasor_is_int(PhasorValue val)
Definition PhasorFFI.h:157
static bool phasor_is_array(PhasorValue val)
Definition PhasorFFI.h:169
static PhasorValue phasor_make_int(int64_t i)
Definition PhasorFFI.h:115
struct PhasorVM PhasorVM
Phasor Virtual Machine pointer.
Definition PhasorFFI.h:59
#define PHASOR_FFI_EXPORT
Definition PhasorFFI.h:50
static uint64_t s[2]
Definition random.cpp:6
PHASOR_FFI_EXPORT void phasor_plugin_entry(const PhasorAPI *api, PhasorVM *vm)
The one and only entry point for a Phasor plugin.
Definition main.c:40
static PhasorValue phasor_execve(PhasorVM *, int argc, const PhasorValue *argv)
Definition main.c:88
static PhasorValue phasor_close(PhasorVM *, int argc, const PhasorValue *argv)
Definition main.c:23
static PhasorValue phasor_waitpid(PhasorVM *, int argc, const PhasorValue *argv)
Definition main.c:115
static PhasorValue phasor_sleep(PhasorVM *, int argc, const PhasorValue *argv)
Definition main.c:135
static PhasorValue phasor_clock_gettime(PhasorVM *, int argc, const PhasorValue *argv)
Definition main.c:154
static PhasorValue phasor_kill(PhasorVM *, int argc, const PhasorValue *argv)
Definition main.c:126
static PhasorValue phasor_fork(PhasorVM *, int, const PhasorValue *)
Definition main.c:82
static PhasorValue phasor_nanosleep(PhasorVM *, int argc, const PhasorValue *argv)
Definition main.c:144
static PhasorValue phasor_rmdir(PhasorVM *, int argc, const PhasorValue *argv)
Definition main.c:75
static PhasorValue phasor_open(PhasorVM *, int argc, const PhasorValue *argv)
Definition main.c:13
static PhasorValue phasor_read(PhasorVM *, int argc, const PhasorValue *argv)
Definition main.c:31
static PhasorValue phasor_unlink(PhasorVM *, int argc, const PhasorValue *argv)
Definition main.c:60
static PhasorValue phasor_mkdir(PhasorVM *, int argc, const PhasorValue *argv)
Definition main.c:67
static PhasorValue phasor_write(PhasorVM *, int argc, const PhasorValue *argv)
Definition main.c:50
The collection of API functions that the Phasor host provides to the plugin.
Definition PhasorFFI.h:211
PhasorRegisterFunction register_function
Registers a native C function with the given name.
Definition PhasorFFI.h:213
Represents a value in the Phasor VM.
Definition PhasorFFI.h:79
struct PhasorValue::@257106260015165034006071221344325333366100147341::@324103060207145140324203224012174236216253240107 a
const PhasorValue * elements
Definition PhasorFFI.h:89
union PhasorValue::@257106260015165034006071221344325333366100147341 as
size_t count
Definition PhasorFFI.h:90