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