Phasor 2.2.0
Stack VM based Programming Language
Loading...
Searching...
No Matches
io.cpp
Go to the documentation of this file.
1#include "StdLib.hpp"
2
3namespace Phasor
4{
5
6Value StdLib::registerIOFunctions(const std::vector<Value> &args, VM *vm)
7{
8 checkArgCount(args, 0, "include_stdio");
17 return true;
18}
19
20Value StdLib::io_c_format(const std::vector<Value> &args, VM *) {
21 if (args.empty()) {
22 return Value(""); // Return empty string if no arguments
23 }
24
25 const std::string &fmt = args[0].asString();
26 std::string out;
27 size_t argIndex = 1; // Start from 1 because args[0] is the format string
28
29 for (size_t i = 0; i < fmt.size(); ++i) {
30 if (fmt[i] == '%' && i + 1 < fmt.size()) {
31 char spec = fmt[++i]; // Move to the format specifier
32 if (argIndex < args.size()) {
33 const Value &v = args[argIndex++];
34 switch (spec) {
35 case 's':
36 out += v.asString();
37 break;
38 case 'd':
39 out += std::to_string(v.asInt());
40 break;
41 case 'f':
42 out += std::to_string(v.asFloat());
43 break;
44 case '%':
45 out += '%';
46 break;
47 default:
48 // Unknown specifier, include it literally
49 out += '%';
50 out += spec;
51 break;
52 }
53 continue;
54 }
55 }
56 out += fmt[i];
57 }
58 return Value(out);
59}
60
61Value StdLib::io_prints(const std::vector<Value> &args, VM *vm)
62{
63 checkArgCount(args, 1, "prints");
64 vm->setRegister(VM::Register::r1, args[0]); // Load string into r1
65 vm->operation(OpCode::PRINT_R, VM::Register::r1); // Print register r1
66 return Value("");
67}
68
69Value StdLib::io_printf(const std::vector<Value> &args, VM *vm)
70{
71 checkArgCount(args, 1, "printf", true);
72 std::vector<Value> formatArgs(args.begin(), args.end());
73 vm->setRegister(VM::Register::r1, io_c_format(formatArgs, vm));
75 return Value("");
76}
77
78Value StdLib::io_puts(const std::vector<Value> &args, VM *vm)
79{
80 checkArgCount(args, 1, "puts", true);
81 std::string input = args[0].toString();
82 vm->setRegister(VM::Register::r1, input + "\n"); // Load string into r1
83 vm->operation(OpCode::PRINT_R, VM::Register::r1); // Print register r1
84 return Value("");
85}
86
87Value StdLib::io_putf(const std::vector<Value> &args, VM *vm)
88{
89 checkArgCount(args, 1, "putf", true);
90 std::vector<Value> formatArgs(args.begin(), args.end());
91 std::string input = io_c_format(formatArgs, vm).toString();
92 vm->setRegister(VM::Register::r1, input + "\n"); // Load string into r1
93 vm->operation(OpCode::PRINT_R, VM::Register::r1); // Print register r1
94 return Value("");
95}
96
97Value StdLib::io_gets(const std::vector<Value> &args, VM *vm)
98{
99 checkArgCount(args, 0, "gets");
101 std::string ret = vm->getRegister(VM::Register::r1).toString();
102 return ret;
103}
104
105Value StdLib::io_puts_error(const std::vector<Value> &args, VM *vm)
106{
107 checkArgCount(args, 1, "puts_error", true);
108 std::string input = args[0].toString();
109 vm->setRegister(VM::Register::r1, input + "\n"); // Load string into r1
110 return vm->operation(OpCode::PRINTERROR_R, VM::Register::r1); // Print register r1
111}
112
113Value StdLib::io_putf_error(const std::vector<Value> &args, VM *vm)
114{
115 checkArgCount(args, 1, "putf_error", true);
116 std::vector<Value> formatArgs(args.begin(), args.end());
117 std::string input = io_c_format(formatArgs, vm).toString();
118 vm->setRegister(VM::Register::r1, input + "\n");
120}
121} // namespace Phasor
static Value registerIOFunctions(const std::vector< Value > &args, VM *vm)
Definition io.cpp:6
static Value io_printf(const std::vector< Value > &args, VM *vm)
Print formatted string.
Definition io.cpp:69
static Value io_puts_error(const std::vector< Value > &args, VM *vm)
Print string with newline to error output.
Definition io.cpp:105
static Value io_puts(const std::vector< Value > &args, VM *vm)
Print string with newline.
Definition io.cpp:78
static Value io_putf(const std::vector< Value > &args, VM *vm)
Print formatted string with newline.
Definition io.cpp:87
static Value io_prints(const std::vector< Value > &args, VM *vm)
Print string without newline.
Definition io.cpp:61
static void checkArgCount(const std::vector< Value > &args, size_t minimumArguments, const std::string &name, bool allowMoreArguments=false)
Definition StdLib.cpp:50
static Value io_c_format(const std::vector< Value > &args, VM *vm)
Format string.
Definition io.cpp:20
static Value io_putf_error(const std::vector< Value > &args, VM *vm)
Print formatted string with newline to error output.
Definition io.cpp:113
static Value io_gets(const std::vector< Value > &args, VM *vm)
Get string.
Definition io.cpp:97
Virtual Machine.
Definition VM.hpp:18
void registerNativeFunction(const std::string &name, NativeFunction fn)
Register a native function.
Definition VM.cpp:869
Value getRegister(uint8_t index)
Get a register value.
Definition VM.cpp:970
void setRegister(uint8_t index, const Value &value)
Set a register value.
Definition VM.cpp:960
Value operation(const OpCode &op, const int &operand1=0, const int &operand2=0, const int &operand3=0, const int &operand4=0, const int &operand5=0)
Execute a single operation.
Definition VM.cpp:26
A value in the Phasor VM.
Definition Value.hpp:33
std::string toString() const
Convert to string for printing.
Definition Value.hpp:362
double asFloat() const
Get the value as a double.
Definition Value.hpp:157
std::string asString() const
Get the value as a string.
Definition Value.hpp:166
int64_t asInt() const
Get the value as an integer.
Definition Value.hpp:148
The Phasor Programming Language and Runtime.
Definition AST.hpp:8
@ PRINTERROR_R
Print register to stderr: printerror(R[rA]).
Definition CodeGen.hpp:159
@ READLINE_R
Read line into register: readline(R[rA]).
Definition CodeGen.hpp:160
@ PRINT_R
Print register: print(R[rA]).
Definition CodeGen.hpp:158