88 lines
2.2 KiB
C
88 lines
2.2 KiB
C
#ifdef STANDALONE
|
|
#include "pc.h"
|
|
|
|
#include <unistd.h>
|
|
#include <string.h>
|
|
|
|
Object print(Object* params, int length, unused struct Environment* env)
|
|
{
|
|
for (int i = 0; i < length; i++) {
|
|
_printObj(¶ms[i], 0);
|
|
}
|
|
return numberObject(0);
|
|
}
|
|
|
|
Object numToChar(Object* params, unused int length, unused struct Environment* env)
|
|
{
|
|
checkTypes(numToChar)
|
|
Object c = params[0];
|
|
|
|
if (c.number > 255 || c.number < 0) {
|
|
throw(BAD_NUMBER, "Char values should be between 0 and 255 (inclusive), but received %ld", c.number);
|
|
}
|
|
char ch[1] = { c.number };
|
|
return stringFromSlice(ch, 1);
|
|
}
|
|
|
|
Object takeInput(Object* params, int length, unused struct Environment* env)
|
|
{
|
|
Object prompt = params[0];
|
|
if (length > 0 && prompt.type == TYPE_STRING) {
|
|
printf("%s", prompt.string);
|
|
}
|
|
char input[256] = "";
|
|
if (fgets(input, 256, stdin)) {
|
|
return stringFromSlice(input, strlen(input) - 1);
|
|
}
|
|
return errorWithContext(NULL_PARSE, "fgets() error");
|
|
}
|
|
|
|
Object cd(Object* params, unused int length, unused struct Environment* env)
|
|
{
|
|
checkTypes(cd)
|
|
|
|
return numberObject(chdir(params[0].string));
|
|
}
|
|
|
|
Object cwd(unused Object* params, unused int length, unused struct Environment* env)
|
|
{
|
|
char c[128];
|
|
return nullTerminated(getcwd(c, sizeof(c)));
|
|
}
|
|
|
|
Object systemCall(Object* params, unused int length, unused struct Environment* env)
|
|
{
|
|
checkTypes(systemCall)
|
|
Object process = params[0];
|
|
|
|
if (isStringy(process)) {
|
|
return numberObject(system(process.string));
|
|
}
|
|
return numberObject(255);
|
|
}
|
|
|
|
Object readFileToObject(Object* params, unused int length, unused struct Environment* env)
|
|
{
|
|
checkTypes(readFileToObject)
|
|
Object filename = params[0];
|
|
|
|
FILE* file = fopen(filename.string, "r");
|
|
if (!file) {
|
|
throw(NULL_PARSE, "Error opening file at %s", filename.string);
|
|
}
|
|
|
|
Object string = newObject(TYPE_STRING);
|
|
string.string = readFileToString(file);
|
|
return string;
|
|
}
|
|
|
|
Object getEnvVar(Object* params, unused int length, unused struct Environment* env)
|
|
{
|
|
checkTypes(getEnvVar)
|
|
const char* envVar = getenv(params[0].string);
|
|
if (envVar) {
|
|
return nullTerminated(envVar);
|
|
}
|
|
return stringFromSlice("", 0);
|
|
}
|
|
#endif // STANDALONE
|