Phasor 3.3.0
Stack VM based Programming Language
Loading...
Searching...
No Matches
string.cpp
Go to the documentation of this file.
1#include "StdLib.hpp"
2#include <string>
3
4namespace Phasor
5{
6
25
26// StringBuilder Pool
27static std::vector<std::string> sbPool;
28static std::vector<size_t> sbFreeIndices;
29
30int64_t StdLib::str_find(const std::vector<Value> &args, VM *)
31{
32 checkArgCount(args, 2, "find", true);
33 std::string s = args[0].asString();
34 std::string sub = args[1].asString();
35 size_t pos;
36 if (args.size() == 3)
37 {
38 int64_t start = args[2].asInt();
39 pos = s.find(sub, start);
40 if (pos != std::string::npos)
41 {
42 return static_cast<int64_t>(pos);
43 }
44 return -1;
45 }
46 else if (args.size() == 4)
47 {
48 int64_t start = args[2].asInt();
49 int64_t end = args[3].asInt();
50 pos = s.find(sub, start);
51 if (pos != std::string::npos && pos < static_cast<size_t>(end))
52 {
53 return static_cast<int64_t>(pos);
54 }
55 return -1;
56 }
57 else
58 {
59 pos = s.find(sub);
60 }
61 return pos != std::string::npos ? static_cast<int64_t>(pos) : false;
62}
63
64int64_t StdLib::sb_new(const std::vector<Value> &args, VM *)
65{
66 StdLib::checkArgCount(args, 0, "sb_new");
67 size_t idx;
68 if (!sbFreeIndices.empty())
69 {
70 idx = sbFreeIndices.back();
71 sbFreeIndices.pop_back();
72 sbPool[idx] = "";
73 }
74 else
75 {
76 idx = sbPool.size();
77 sbPool.push_back("");
78 }
79 return static_cast<int64_t>(idx);
80}
81
82Value StdLib::sb_append(const std::vector<Value> &args, VM *)
83{
84 StdLib::checkArgCount(args, 2, "sb_append");
85 int64_t idx = args[0].asInt();
86 if (idx < 0 || idx >= static_cast<int64_t>(sbPool.size()))
87 throw std::runtime_error("Invalid StringBuilder handle");
88
89 sbPool[idx] += args[1].toString();
90 return args[0]; // Return handle for chaining
91}
92
93std::string StdLib::sb_to_string(const std::vector<Value> &args, VM *)
94{
95 StdLib::checkArgCount(args, 1, "sb_to_string");
96 int64_t idx = args[0].asInt();
97 if (idx < 0 || idx >= static_cast<int64_t>(sbPool.size()))
98 throw std::runtime_error("Invalid StringBuilder handle");
99
100 return sbPool[idx];
101}
102
103std::string StdLib::sb_free(const std::vector<Value> &args, VM *)
104{
105 StdLib::checkArgCount(args, 1, "sb_free");
106 size_t idx = args[0].asInt();
107 std::string value = sbPool[idx];
108 sbFreeIndices.push_back(idx);
109 return value;
110}
111
112Value StdLib::sb_clear(const std::vector<Value> &args, VM *)
113{
114 StdLib::checkArgCount(args, 1, "sb_clear");
115 size_t idx = args[0].asInt();
116 if (idx >= sbPool.size())
117 throw std::runtime_error("Invalid StringBuilder handle");
118 sbPool[idx].clear();
119 return args[0]; // Return handle for chaining
120}
121
122Value StdLib::str_char_at(const std::vector<Value> &args, VM *)
123{
124 checkArgCount(args, 2, "char_at");
125 if (args[0].isString())
126 {
127 const std::string &s = args[0].asString();
128 int64_t idx = args[1].asInt();
129 if (idx < 0 || idx >= static_cast<int64_t>(s.length()))
130 return Value("");
131 return Value(std::string(1, s[idx]));
132 }
133 throw std::runtime_error("char_at() expects a string");
134}
135
136Value StdLib::str_substr(const std::vector<Value> &args, VM *)
137{
138 checkArgCount(args, 2, "substr", true);
139 if (args.size() < 2 || args.size() > 3)
140 {
141 throw std::runtime_error("substr() expects 2 or 3 arguments");
142 }
143 std::string s = args[0].asString();
144 int64_t start = args[1].asInt();
145 int64_t len = (int64_t)args.size() == 3 ? args[2].asInt() : (int64_t)s.length() - start;
146
147 if (start < 0 || start >= static_cast<int64_t>(s.length()))
148 {
149 return Value("");
150 }
151
152 return Value(s.substr(start, len));
153}
154
155std::string StdLib::str_concat(const std::vector<Value> &args, VM *)
156{
157 checkArgCount(args, 2, "concat");
158 std::string result = "";
159 for (const auto &arg : args)
160 {
161 result += arg.toString();
162 }
163 return result;
164}
165
166int64_t StdLib::str_len(const std::vector<Value> &args, VM *)
167{
168 checkArgCount(args, 1, "len");
169 std::string s = args[0].toString();
170 return static_cast<int64_t>(s.length());
171}
172
173std::string StdLib::str_upper(const std::vector<Value> &args, VM *)
174{
175 checkArgCount(args, 1, "to_upper");
176 std::string s = args[0].asString();
177 std::transform(s.begin(), s.end(), s.begin(), ::toupper);
178 return s;
179}
180
181std::string StdLib::str_lower(const std::vector<Value> &args, VM *)
182{
183 checkArgCount(args, 1, "to_lower");
184 std::string s = args[0].asString();
185 std::transform(s.begin(), s.end(), s.begin(), ::tolower);
186 return s;
187}
188
189Value StdLib::str_starts_with(const std::vector<Value> &args, VM *)
190{
191 checkArgCount(args, 2, "starts_with");
192 std::string s = args[0].asString();
193 std::string prefix = args[1].asString();
194 if (s.length() >= prefix.length())
195 {
196 return Value(s.compare(0, prefix.length(), prefix) == 0);
197 }
198 return Value(false);
199}
200
201Value StdLib::str_ends_with(const std::vector<Value> &args, VM *)
202{
203 checkArgCount(args, 2, "ends_with");
204 std::string s = args[0].asString();
205 std::string suffix = args[1].asString();
206 if (s.length() >= suffix.length())
207 {
208 return Value(s.compare(s.length() - suffix.length(), suffix.length(), suffix) == 0);
209 }
210 return Value(false);
211}
212} // namespace Phasor
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 int64_t str_len(const std::vector< Value > &args, VM *vm)
Get string length.
Definition string.cpp:166
static std::string sb_free(const std::vector< Value > &args, VM *vm)
Free string builder.
Definition string.cpp:103
static int64_t str_find(const std::vector< Value > &args, VM *vm)
Find string in string.
Definition string.cpp:30
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 std::string str_upper(const std::vector< Value > &args, VM *vm)
Convert to uppercase.
Definition string.cpp:173
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 sb_append(const std::vector< Value > &args, VM *vm)
Append to string builder.
Definition string.cpp:82
static Value str_ends_with(const std::vector< Value > &args, VM *vm)
Check if string ends with.
Definition string.cpp:201
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
Virtual Machine.
Definition VM.hpp:33
void registerNativeFunction(const std::string &name, NativeFunction fn)
Register a native function.
Definition Native.cpp:5
A value in the Phasor VM.
Definition Value.hpp:58
static uint64_t s[2]
Definition random.cpp:6
The Phasor Programming Language and Runtime.
Definition AST.hpp:12
static std::vector< std::string > sbPool
Definition string.cpp:27
static std::vector< size_t > sbFreeIndices
Definition string.cpp:28