Phasor 3.3.0
Stack VM based Programming Language
Loading...
Searching...
No Matches
StdLib.hpp
Go to the documentation of this file.
1#pragma once
2#include <functional>
3#include <map>
4#include <string>
5#include <vector>
6#include <algorithm>
7#include <cmath>
8#include <fstream>
9#include <sstream>
10#include <stdexcept>
11#include <stdlib.h>
12#include <string.h>
13#include <phsint.hpp>
14
15#include "../VM/VM.hpp"
16#ifndef CMAKE_PCH
17#include <Value.hpp>
18#endif
19
21namespace Phasor
22{
23
25using NativeFunction = std::function<Value(const std::vector<Value> &args, VM *vm)>;
26
33class StdLib
34{
35 public:
36 inline static void registerFunctions(VM &vm)
37 {
38#ifdef TRACING
39 vm.log(std::format("StdLib::{}(&VM@{:#x})\n", __func__, reinterpret_cast<std::uintptr_t>(&vm)));
40 vm.flush();
41#endif
43#ifndef SANDBOXED
45#endif
46 }
47
48 static char **argv;
49 static int argc;
50
51 static void checkArgCount(const std::vector<Value> &args, size_t minimumArguments, const std::string &name,
52 bool allowMoreArguments = false);
53
54 private:
55 static bool std_import(const std::vector<Value> &args, VM *vm);
56#ifndef SANDBOXED
57 static Value std_assert(const std::vector<Value> &args, VM *vm);
58#endif
59
60 enum class dupenv_ret {
64 };
65
66 static dupenv_ret dupenv(PhsString &out, const char *name);
67
68 static void registerMetaFunctions(VM *vm);
69 static void registerMemoryFunctions(VM *vm);
70 static void registerMathFunctions(VM *vm);
71 static void registerRandomFunctions(VM *vm);
72 static void registerStringFunctions(VM *vm);
73 static void registerTypeConvFunctions(VM *vm);
74#ifndef SANDBOXED
75 static void registerFileFunctions(VM *vm);
76#endif
77 static void registerSysFunctions(VM *vm);
78 static void registerIOFunctions(VM *vm);
79 static void registerArrayFunctions(VM *vm);
80
81#pragma region stdmeta
82#ifndef SANDBOXED
83 static i64 meta_operation(const std::vector<Value> &args, VM *vm);
84 static Value meta_stack_run(const std::vector<Value> &args, VM *vm);
85#endif
86 static PhsString meta_get_version(const std::vector<Value> &args, VM *vm);
87
88#pragma endregion stdmeta
89
90#pragma region stdmemory
91 static Value var_free(const std::vector<Value> &args, VM *vm);
92#pragma endregion
93
94#pragma region stdmath
95 static f64 math_sqrt(const std::vector<Value> &args, VM *vm);
96 static f64 math_pow(const std::vector<Value> &args, VM *vm);
97 static Value math_abs(const std::vector<Value> &args, VM *vm);
98 static f64 math_floor(const std::vector<Value> &args, VM *vm);
99 static f64 math_ceil(const std::vector<Value> &args, VM *vm);
100 static f64 math_round(const std::vector<Value> &args, VM *vm);
101 static Value math_min(const std::vector<Value> &args, VM *vm);
102 static Value math_max(const std::vector<Value> &args, VM *vm);
103 static f64 math_log(const std::vector<Value> &args, VM *vm);
104 static f64 math_exp(const std::vector<Value> &args, VM *vm);
105 static f64 math_sin(const std::vector<Value> &args, VM *vm);
106 static f64 math_cos(const std::vector<Value> &args, VM *vm);
107 static f64 math_tan(const std::vector<Value> &args, VM *vm);
108#pragma endregion
109
110#pragma region stdfile
111#ifndef SANDBOXED
112 static PhsString file_absolute(const std::vector<Value> &args, VM *vm);
113 static Value file_read(const std::vector<Value> &args, VM *vm);
114 static bool file_write(const std::vector<Value> &args, VM *vm);
115 static bool file_exists(const std::vector<Value> &args, VM *vm);
116 static PhsString file_read_line(const std::vector<Value> &args, VM *vm);
117 static bool file_write_line(const std::vector<Value> &args, VM *vm);
118 static bool file_append(const std::vector<Value> &args, VM *vm);
119 static bool file_delete(const std::vector<Value> &args, VM *vm);
120 static bool file_rename(const std::vector<Value> &args, VM *vm);
121 static Value file_current_directory(const std::vector<Value> &args, VM *vm);
122 static bool file_copy(const std::vector<Value> &args, VM *vm);
123 static bool file_move(const std::vector<Value> &args, VM *vm);
124 static bool file_property_edit(const std::vector<Value> &args, VM *vm);
125 static i64 file_property_get(const std::vector<Value> &args, VM *vm);
126 static bool file_create(const std::vector<Value> &args, VM *vm);
127 static Value file_read_directory(const std::vector<Value> &args, VM *vm);
128 static bool file_create_directory(const std::vector<Value> &args, VM *vm);
129 static bool file_remove_directory(const std::vector<Value> &args, VM *vm);
130 static PhsString file_join_path(const std::vector<Value> &args, VM *vm);
131 static PhsString file_stem(const std::vector<Value> &args, VM *vm);
132 static PhsString file_filename(const std::vector<Value> &args, VM *vm);
133 static PhsString file_extension(const std::vector<Value> &args, VM *vm);
134 static bool file_is_directory(const std::vector<Value> &args, VM *vm);
135 static PhsString file_parent(const std::vector<Value> &args, VM *vm);
136 static i64 file_get_size(const std::vector<Value> &args, VM *vm);
137#pragma endregion
138
139#pragma region stdsys
140 static i64 sys_get_free_memory(const std::vector<Value> &args, VM *vm);
141 static Value sys_wait_for_input(const std::vector<Value> &args, VM *vm);
142 static Value sys_shell(const std::vector<Value> &args, VM *vm);
143 static i64 sys_fork(const std::vector<Value> &args, VM *vm);
144 static i64 sys_fork_detached(const std::vector<Value> &args, VM *vm);
145 static Value sys_crash(const std::vector<Value> &args, VM *vm);
146 static Value sys_reset(const std::vector<Value> &args, VM *vm);
147 static i64 sys_pid(const std::vector<Value> &args, VM *vm);
148 static PhsString sys_os(const std::vector<Value> &args, VM *vm);
149 static Value sys_isatty(const std::vector<Value> &args, VM *vm);
150#endif
151 static Value sys_env(const std::vector<Value> &args, VM *vm);
152 static Value sys_argv(const std::vector<Value> &args, VM *vm);
153 static i64 sys_argc(const std::vector<Value> &args, VM *vm);
154 static Value sys_args(const std::vector<Value> &args, VM *vm);
155 static f64 sys_time(const std::vector<Value> &args, VM *vm);
156 static Value sys_time_formatted(const std::vector<Value> &args, VM *vm);
157 static Value sys_sleep(const std::vector<Value> &args, VM *vm);
158 static Value sys_shutdown(const std::vector<Value> &args, VM *vm);
159#pragma endregion
160
161#pragma region stdtype
162 static i64 to_int(const std::vector<Value> &args, VM *vm);
163 static f64 to_float(const std::vector<Value> &args, VM *vm);
164 static PhsString to_string(const std::vector<Value> &args, VM *vm);
165 static bool to_bool(const std::vector<Value> &args, VM *vm);
166#pragma endregion
167
168#pragma region stdarray
169 static i64 array_length(const std::vector<Value> &args, VM *vm);
170 static Value array_push(const std::vector<Value> &args, VM *vm);
171 static Value array_pop(const std::vector<Value> &args, VM *vm);
172 static Value array_insert(const std::vector<Value> &args, VM *vm);
173 static Value array_resize(const std::vector<Value> &args, VM *vm);
174
175#pragma region stdrand
176
177 static Value rand_seed(const std::vector<Value> &args, VM *vm);
178 static i64 rand_next_range(const std::vector<Value> &args, VM *vm);
179 static f64 rand_next_float(const std::vector<Value> &args,
180 VM *vm);
181
182#pragma endregion
183
184#pragma region stdstr
185 static i64 str_find(const std::vector<Value> &args, VM *vm);
186 static i64 str_len(const std::vector<Value> &args, VM *vm);
187 static Value str_char_at(const std::vector<Value> &args, VM *vm);
188 static Value str_substr(const std::vector<Value> &args, VM *vm);
189 static PhsString str_concat(const std::vector<Value> &args, VM *vm);
190 static PhsString str_upper(const std::vector<Value> &args, VM *vm);
191 static PhsString str_lower(const std::vector<Value> &args, VM *vm);
192 static Value str_starts_with(const std::vector<Value> &args, VM *vm);
193 static Value str_ends_with(const std::vector<Value> &args, VM *vm);
194 // StringBuilder functions
195 static i64 sb_new(const std::vector<Value> &args, VM *vm);
196 static Value sb_append(const std::vector<Value> &args, VM *vm);
197 static PhsString sb_to_string(const std::vector<Value> &args, VM *vm);
198 static Value sb_clear(const std::vector<Value> &args, VM *vm);
199 static PhsString sb_free(const std::vector<Value> &args, VM *vm);
200#pragma endregion
201
202#pragma region stdio
203 static PhsString io_c_format(const std::vector<Value> &args, VM *vm);
204#ifndef SANDBOXED
205 static Value io_clear(const std::vector<Value> &args, VM *vm);
206#endif
207 static PhsString io_prints(const std::vector<Value> &args, VM *vm);
208 static PhsString io_printf(const std::vector<Value> &args, VM *vm);
209 static PhsString io_puts(const std::vector<Value> &args, VM *vm);
210 static PhsString io_putf(const std::vector<Value> &args, VM *vm);
211#ifndef SANDBOXED
212 static Value io_gets(const std::vector<Value> &args, VM *vm);
213#endif
214 static PhsString io_putf_error(const std::vector<Value> &args,
215 VM *vm);
216 static PhsString io_puts_error(const std::vector<Value> &args,
217 VM *vm);
218#pragma endregion
219};
220
221} // namespace Phasor
Phasor Standard library.
Definition StdLib.hpp:34
static Value sb_clear(const std::vector< Value > &args, VM *vm)
Clear string builder.
Definition string.cpp:121
static f64 to_float(const std::vector< Value > &args, VM *vm)
Convert to float.
Definition typeconv.cpp:38
static Value str_char_at(const std::vector< Value > &args, VM *vm)
Get character at index.
Definition string.cpp:131
static i64 sb_new(const std::vector< Value > &args, VM *vm)
Create new string builder.
Definition string.cpp:73
static void registerStringFunctions(VM *vm)
Definition string.cpp:8
static PhsString sb_free(const std::vector< Value > &args, VM *vm)
Free string builder.
Definition string.cpp:112
static bool file_remove_directory(const std::vector< Value > &args, VM *vm)
Definition file.cpp:380
static Value sys_env(const std::vector< Value > &args, VM *vm)
Get the current environment variables.
Definition system.cpp:131
static Value array_insert(const std::vector< Value > &args, VM *vm)
Insert into array.
Definition array.cpp:70
static Value file_current_directory(const std::vector< Value > &args, VM *vm)
Get/set working directory.
Definition file.cpp:234
static Value math_max(const std::vector< Value > &args, VM *vm)
Maximum.
Definition math.cpp:88
static Value sys_reset(const std::vector< Value > &args, VM *vm)
Reset the VM.
Definition system.cpp:248
static i64 str_find(const std::vector< Value > &args, VM *vm)
Find string in string.
Definition string.cpp:39
static Value io_clear(const std::vector< Value > &args, VM *vm)
Clear the console.
Definition io.cpp:23
static f64 math_exp(const std::vector< Value > &args, VM *vm)
Exponential.
Definition math.cpp:114
static f64 math_cos(const std::vector< Value > &args, VM *vm)
Cosine.
Definition math.cpp:126
static PhsString sys_os(const std::vector< Value > &args, VM *vm)
Get the current OS.
Definition system.cpp:177
static void registerMemoryFunctions(VM *vm)
Definition memory.cpp:6
static bool file_rename(const std::vector< Value > &args, VM *vm)
Rename file.
Definition file.cpp:220
static PhsString file_filename(const std::vector< Value > &args, VM *vm)
Get the filename.
Definition file.cpp:52
static i64 sys_pid(const std::vector< Value > &args, VM *vm)
Get the current process ID.
Definition system.cpp:255
static char ** argv
Command line arguments.
Definition StdLib.hpp:48
static void registerFileFunctions(VM *vm)
Definition file.cpp:11
static PhsString io_prints(const std::vector< Value > &args, VM *vm)
Print string without newline.
Definition io.cpp:47
static PhsString file_stem(const std::vector< Value > &args, VM *vm)
Get the stem of a path.
Definition file.cpp:46
static PhsString file_join_path(const std::vector< Value > &args, VM *vm)
Definition file.cpp:76
static Value array_pop(const std::vector< Value > &args, VM *vm)
Pop from array.
Definition array.cpp:55
static f64 math_sin(const std::vector< Value > &args, VM *vm)
Sine.
Definition math.cpp:120
static bool file_move(const std::vector< Value > &args, VM *vm)
Move file.
Definition file.cpp:305
static i64 meta_operation(const std::vector< Value > &args, VM *vm)
Definition meta.cpp:18
static void registerIOFunctions(VM *vm)
Definition io.cpp:7
static PhsString file_read_line(const std::vector< Value > &args, VM *vm)
Read a line from file.
Definition file.cpp:104
static bool file_write(const std::vector< Value > &args, VM *vm)
Write to file.
Definition file.cpp:175
static i64 file_property_get(const std::vector< Value > &args, VM *vm)
Definition file.cpp:335
static Value sys_crash(const std::vector< Value > &args, VM *vm)
Crash the VM / Program.
Definition system.cpp:240
static void registerArrayFunctions(VM *vm)
Definition array.cpp:8
static bool file_append(const std::vector< Value > &args, VM *vm)
Append to file.
Definition file.cpp:195
static void registerFunctions(VM &vm)
Definition StdLib.hpp:36
static f64 math_log(const std::vector< Value > &args, VM *vm)
Natural logarithm.
Definition math.cpp:108
static i64 sys_fork_detached(const std::vector< Value > &args, VM *vm)
Run a native program detached.
Definition system.cpp:227
static void registerTypeConvFunctions(VM *vm)
Definition typeconv.cpp:7
static i64 rand_next_range(const std::vector< Value > &args, VM *vm)
Get a random number in range.
Definition random.cpp:29
static f64 math_sqrt(const std::vector< Value > &args, VM *vm)
Square root.
Definition math.cpp:24
static f64 math_pow(const std::vector< Value > &args, VM *vm)
Power.
Definition math.cpp:30
static bool file_is_directory(const std::vector< Value > &args, VM *vm)
Check if path is directory.
Definition file.cpp:70
static bool file_exists(const std::vector< Value > &args, VM *vm)
Check if file exists.
Definition file.cpp:189
static PhsString file_absolute(const std::vector< Value > &args, VM *vm)
Get full path to relative path.
Definition file.cpp:40
static void checkArgCount(const std::vector< Value > &args, size_t minimumArguments, const std::string &name, bool allowMoreArguments=false)
Definition StdLib.cpp:44
static Value str_substr(const std::vector< Value > &args, VM *vm)
Get substring.
Definition string.cpp:145
static void registerMathFunctions(VM *vm)
Definition math.cpp:7
static bool file_create(const std::vector< Value > &args, VM *vm)
Definition file.cpp:343
static Value sys_argv(const std::vector< Value > &args, VM *vm)
Get the current command line arguments – deprecated, use sys_args() instead.
Definition system.cpp:148
static int argc
Number of command line arguments.
Definition StdLib.hpp:49
static PhsString sb_to_string(const std::vector< Value > &args, VM *vm)
Convert string builder to string.
Definition string.cpp:102
static Value file_read_directory(const std::vector< Value > &args, VM *vm)
Definition file.cpp:357
static f64 rand_next_float(const std::vector< Value > &args, VM *vm)
Get a random float (technically a f64 at a low level).
Definition random.cpp:43
static bool file_write_line(const std::vector< Value > &args, VM *vm)
Write a line to file.
Definition file.cpp:123
static Value file_read(const std::vector< Value > &args, VM *vm)
Read file.
Definition file.cpp:90
static bool file_copy(const std::vector< Value > &args, VM *vm)
Copy file.
Definition file.cpp:252
static Value sys_wait_for_input(const std::vector< Value > &args, VM *vm)
Wait for input.
Definition system.cpp:201
static PhsString str_upper(const std::vector< Value > &args, VM *vm)
Convert to uppercase.
Definition string.cpp:182
static Value array_resize(const std::vector< Value > &args, VM *vm)
Resize array.
Definition array.cpp:17
static PhsString to_string(const std::vector< Value > &args, VM *vm)
Convert to string.
Definition typeconv.cpp:44
static bool to_bool(const std::vector< Value > &args, VM *vm)
Convert to boolean.
Definition typeconv.cpp:50
static bool file_property_edit(const std::vector< Value > &args, VM *vm)
Definition file.cpp:322
static PhsString io_printf(const std::vector< Value > &args, VM *vm)
Print formatted string.
Definition io.cpp:54
static i64 file_get_size(const std::vector< Value > &args, VM *vm)
Definition file.cpp:84
static void registerSysFunctions(VM *vm)
Definition system.cpp:34
static Value meta_stack_run(const std::vector< Value > &args, VM *vm)
Definition meta.cpp:34
static bool file_create_directory(const std::vector< Value > &args, VM *vm)
Definition file.cpp:370
static Value sys_shutdown(const std::vector< Value > &args, VM *vm)
Shutdown the VM.
Definition system.cpp:167
static void registerRandomFunctions(VM *vm)
Definition random.cpp:7
static f64 math_round(const std::vector< Value > &args, VM *vm)
Round.
Definition math.cpp:61
static Value sys_shell(const std::vector< Value > &args, VM *vm)
Run a shell command.
Definition system.cpp:208
static void registerMetaFunctions(VM *vm)
Definition meta.cpp:8
static PhsString str_lower(const std::vector< Value > &args, VM *vm)
Convert to lowercase.
Definition string.cpp:190
static Value sys_sleep(const std::vector< Value > &args, VM *vm)
Sleep for a specified amount of time.
Definition system.cpp:123
static Value sys_args(const std::vector< Value > &args, VM *vm)
Get args array.
Definition system.cpp:156
static i64 sys_argc(const std::vector< Value > &args, VM *vm)
Get the current number of command line arguments – deprecated, use len(sys_args()) instead.
Definition system.cpp:142
static PhsString io_putf_error(const std::vector< Value > &args, VM *vm)
Print formatted string with newline to error output.
Definition io.cpp:95
static Value var_free(const std::vector< Value > &args, VM *vm)
Free a variable.
Definition memory.cpp:11
static PhsString io_puts(const std::vector< Value > &args, VM *vm)
Print string with newline.
Definition io.cpp:62
static i64 sys_get_free_memory(const std::vector< Value > &args, VM *vm)
Get current free memory.
Definition system.cpp:195
static i64 to_int(const std::vector< Value > &args, VM *vm)
Convert to integer.
Definition typeconv.cpp:15
static Value std_assert(const std::vector< Value > &args, VM *vm)
Definition StdLib.cpp:109
static Value math_abs(const std::vector< Value > &args, VM *vm)
Absolute value.
Definition math.cpp:38
static Value sys_isatty(const std::vector< Value > &args, VM *vm)
Check if the current output is a terminal.
Definition system.cpp:265
static PhsString meta_get_version(const std::vector< Value > &args, VM *vm)
Definition meta.cpp:49
static bool file_delete(const std::vector< Value > &args, VM *vm)
Delete file.
Definition file.cpp:209
static i64 str_len(const std::vector< Value > &args, VM *vm)
Get string length.
Definition string.cpp:175
static Value sb_append(const std::vector< Value > &args, VM *vm)
Append to string builder.
Definition string.cpp:91
static Value sys_time_formatted(const std::vector< Value > &args, VM *vm)
Current time formatted.
Definition system.cpp:99
static f64 math_tan(const std::vector< Value > &args, VM *vm)
Tangent.
Definition math.cpp:132
static dupenv_ret dupenv(PhsString &out, const char *name)
Definition StdLib.cpp:15
static PhsString file_extension(const std::vector< Value > &args, VM *vm)
Get the extension of a path.
Definition file.cpp:58
static f64 sys_time(const std::vector< Value > &args, VM *vm)
Current time.
Definition system.cpp:90
static Value rand_seed(const std::vector< Value > &args, VM *vm)
Seed the random number generator.
Definition random.cpp:14
static i64 array_length(const std::vector< Value > &args, VM *vm)
Get array length.
Definition array.cpp:33
static PhsString io_putf(const std::vector< Value > &args, VM *vm)
Print formatted string with newline.
Definition io.cpp:70
static PhsString file_parent(const std::vector< Value > &args, VM *vm)
Get the parent of a path.
Definition file.cpp:64
static f64 math_ceil(const std::vector< Value > &args, VM *vm)
Ceiling.
Definition math.cpp:54
static Value array_push(const std::vector< Value > &args, VM *vm)
Push to array.
Definition array.cpp:43
static PhsString io_c_format(const std::vector< Value > &args, VM *vm)
Format string.
Definition io.cpp:31
static Value io_gets(const std::vector< Value > &args, VM *vm)
Get string.
Definition io.cpp:80
static Value str_ends_with(const std::vector< Value > &args, VM *vm)
Check if string ends with.
Definition string.cpp:210
static bool std_import(const std::vector< Value > &args, VM *vm)
Definition StdLib.cpp:59
static i64 sys_fork(const std::vector< Value > &args, VM *vm)
Run a native program.
Definition system.cpp:214
static f64 math_floor(const std::vector< Value > &args, VM *vm)
Floor.
Definition math.cpp:47
static Value math_min(const std::vector< Value > &args, VM *vm)
Minimum.
Definition math.cpp:68
static Value str_starts_with(const std::vector< Value > &args, VM *vm)
Check if string starts with.
Definition string.cpp:198
static PhsString io_puts_error(const std::vector< Value > &args, VM *vm)
Print string with newline to error output.
Definition io.cpp:87
static PhsString str_concat(const std::vector< Value > &args, VM *vm)
Concatenate strings.
Definition string.cpp:164
Virtual Machine.
Definition VM.hpp:36
void registerNativeFunction(const std::string &name, NativeFunction fn)
Register a native function.
Definition Native.cpp:5
void log(const Value &msg)
Log a Value to stdout.
Definition Utility.cpp:279
void flush()
Flush stdout.
Definition Utility.cpp:291
A value in the Phasor VM.
Definition Value.hpp:59
The Phasor Programming Language and Runtime.
Definition AST.hpp:13
int64_t i64
Definition phsint.hpp:16
std::function< Value(const std::vector< Value > &args, VM *vm)> NativeFunction
Native function signature.
Definition StdLib.hpp:25
double f64
Definition phsint.hpp:7