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