Phasor 2.2.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
7Value StdLib::registerStringFunctions(const std::vector<Value> &args, VM *vm)
8{
9 checkArgCount(args, 0, "include_stdstr");
18
19 // StringBuilder
25 return true;
26}
27
28// StringBuilder Pool
29static std::vector<std::string> sbPool;
30static std::vector<size_t> sbFreeIndices;
31
32Value StdLib::sb_new(const std::vector<Value> &args, VM *)
33{
34 StdLib::checkArgCount(args, 0, "sb_new");
35 size_t idx;
36 if (!sbFreeIndices.empty())
37 {
38 idx = sbFreeIndices.back();
39 sbFreeIndices.pop_back();
40 sbPool[idx] = "";
41 }
42 else
43 {
44 idx = sbPool.size();
45 sbPool.push_back("");
46 }
47 return static_cast<int64_t>(idx);
48}
49
50Value StdLib::sb_append(const std::vector<Value> &args, VM *)
51{
52 StdLib::checkArgCount(args, 2, "sb_append");
53 int64_t idx = args[0].asInt();
54 if (idx < 0 || idx >= static_cast<int64_t>(sbPool.size()))
55 throw std::runtime_error("Invalid StringBuilder handle");
56
57 sbPool[idx] += args[1].toString();
58 return args[0]; // Return handle for chaining
59}
60
61Value StdLib::sb_to_string(const std::vector<Value> &args, VM *)
62{
63 StdLib::checkArgCount(args, 1, "sb_to_string");
64 int64_t idx = args[0].asInt();
65 if (idx < 0 || idx >= static_cast<int64_t>(sbPool.size()))
66 throw std::runtime_error("Invalid StringBuilder handle");
67
68 return Value(sbPool[idx]);
69}
70
71Value StdLib::sb_free(const std::vector<Value> &args, VM *)
72{
73 StdLib::checkArgCount(args, 1, "sb_free");
74 size_t idx = args[0].asInt();
75 std::string value = sbPool[idx];
76 sbFreeIndices.push_back(idx);
77 return value;
78}
79
80Value StdLib::sb_clear(const std::vector<Value> &args, VM *)
81{
82 StdLib::checkArgCount(args, 1, "sb_clear");
83 size_t idx = args[0].asInt();
84 if (idx >= sbPool.size())
85 throw std::runtime_error("Invalid StringBuilder handle");
86 sbPool[idx].clear();
87 return args[0]; // Return handle for chaining
88}
89
90Value StdLib::str_char_at(const std::vector<Value> &args, VM *)
91{
92 checkArgCount(args, 2, "char_at");
93 if (args[0].isString())
94 {
95 const std::string &s = args[0].asString();
96 int64_t idx = args[1].asInt();
97 if (idx < 0 || idx >= static_cast<int64_t>(s.length()))
98 return Value("");
99 return Value(std::string(1, s[idx]));
100 }
101 throw std::runtime_error("char_at() expects a string");
102}
103
104Value StdLib::str_substr(const std::vector<Value> &args, VM *)
105{
106 checkArgCount(args, 2, "substr", true);
107 if (args.size() < 2 || args.size() > 3)
108 {
109 throw std::runtime_error("substr() expects 2 or 3 arguments");
110 }
111 std::string s = args[0].asString();
112 int64_t start = args[1].asInt();
113 int64_t len = args.size() == 3 ? args[2].asInt() : s.length() - start;
114
115 if (start < 0 || start >= static_cast<int64_t>(s.length()))
116 {
117 return Value("");
118 }
119
120 return Value(s.substr(start, len));
121}
122
123Value StdLib::str_concat(const std::vector<Value> &args, VM *)
124{
125 checkArgCount(args, 2, "concat");
126 std::string result = "";
127 for (const auto &arg : args)
128 {
129 result += arg.toString();
130 }
131 return Value(result);
132}
133
134Value StdLib::str_len(const std::vector<Value> &args, VM *)
135{
136 checkArgCount(args, 1, "len");
137 std::string s = args[0].toString();
138 return static_cast<int64_t>(s.length());
139}
140
141Value StdLib::str_upper(const std::vector<Value> &args, VM *)
142{
143 checkArgCount(args, 1, "to_upper");
144 std::string s = args[0].asString();
145 std::transform(s.begin(), s.end(), s.begin(), ::toupper);
146 return Value(s);
147}
148
149Value StdLib::str_lower(const std::vector<Value> &args, VM *)
150{
151 checkArgCount(args, 1, "to_lower");
152 std::string s = args[0].asString();
153 std::transform(s.begin(), s.end(), s.begin(), ::tolower);
154 return Value(s);
155}
156
157Value StdLib::str_starts_with(const std::vector<Value> &args, VM *)
158{
159 checkArgCount(args, 2, "starts_with");
160 std::string s = args[0].asString();
161 std::string prefix = args[1].asString();
162 if (s.length() >= prefix.length())
163 {
164 return Value(s.compare(0, prefix.length(), prefix) == 0);
165 }
166 return Value(false);
167}
168
169Value StdLib::str_ends_with(const std::vector<Value> &args, VM *)
170{
171 checkArgCount(args, 2, "ends_with");
172 std::string s = args[0].asString();
173 std::string suffix = args[1].asString();
174 if (s.length() >= suffix.length())
175 {
176 return Value(s.compare(s.length() - suffix.length(), suffix.length(), suffix) == 0);
177 }
178 return Value(false);
179}
180} // namespace Phasor
static Value sb_clear(const std::vector< Value > &args, VM *vm)
Clear string builder.
Definition string.cpp:80
static Value str_char_at(const std::vector< Value > &args, VM *vm)
Get character at index.
Definition string.cpp:90
static Value sb_free(const std::vector< Value > &args, VM *vm)
Free string builder.
Definition string.cpp:71
static Value str_concat(const std::vector< Value > &args, VM *vm)
Concatenate strings.
Definition string.cpp:123
static void checkArgCount(const std::vector< Value > &args, size_t minimumArguments, const std::string &name, bool allowMoreArguments=false)
Definition StdLib.cpp:50
static Value str_substr(const std::vector< Value > &args, VM *vm)
Get substring.
Definition string.cpp:104
static Value sb_new(const std::vector< Value > &args, VM *vm)
Create new string builder.
Definition string.cpp:32
static Value str_lower(const std::vector< Value > &args, VM *vm)
Convert to lowercase.
Definition string.cpp:149
static Value str_upper(const std::vector< Value > &args, VM *vm)
Convert to uppercase.
Definition string.cpp:141
static Value sb_to_string(const std::vector< Value > &args, VM *vm)
Convert string builder to string.
Definition string.cpp:61
static Value sb_append(const std::vector< Value > &args, VM *vm)
Append to string builder.
Definition string.cpp:50
static Value registerStringFunctions(const std::vector< Value > &args, VM *vm)
Definition string.cpp:7
static Value str_len(const std::vector< Value > &args, VM *vm)
Get string length.
Definition string.cpp:134
static Value str_ends_with(const std::vector< Value > &args, VM *vm)
Check if string ends with.
Definition string.cpp:169
static Value str_starts_with(const std::vector< Value > &args, VM *vm)
Check if string starts with.
Definition string.cpp:157
Virtual Machine.
Definition VM.hpp:18
void registerNativeFunction(const std::string &name, NativeFunction fn)
Register a native function.
Definition VM.cpp:869
A value in the Phasor VM.
Definition Value.hpp:33
The Phasor Programming Language and Runtime.
Definition AST.hpp:8
static std::vector< std::string > sbPool
Definition string.cpp:29
static std::vector< size_t > sbFreeIndices
Definition string.cpp:30