minor refactoring

This commit is contained in:
CPunch 2023-09-06 20:23:18 -05:00 committed by cpunch
parent 3ea653b26d
commit 1678194941
1 changed files with 21 additions and 11 deletions

View File

@ -250,6 +250,8 @@ int fileB_read(CState *state, int nargs, CValue *args)
FILE *file = cosmoO_getUserP(fileObj); FILE *file = cosmoO_getUserP(fileObj);
if (IS_NUMBER(args[1])) { if (IS_NUMBER(args[1])) {
CValue temp;
char *buffer;
cosmo_Number length = cosmoV_readNumber(args[1]); cosmo_Number length = cosmoV_readNumber(args[1]);
// make sure the length is within the bounds of the file // make sure the length is within the bounds of the file
@ -258,31 +260,35 @@ int fileB_read(CState *state, int nargs, CValue *args)
} }
// allocate a buffer for the read data // allocate a buffer for the read data
char *buffer = cosmoM_xmalloc(state, length + 1); buffer = cosmoM_xmalloc(state, length + 1);
// read the data // read the data
fread(buffer, sizeof(char), length, file); fread(buffer, sizeof(char), length, file);
buffer[(int)length] = '\0'; // write the NULL terminator buffer[(int)length] = '\0'; // write the NULL terminator
// push the read data // push the read data
CValue temp = cosmoV_newRef(cosmoO_takeString(state, buffer, length)); temp = cosmoV_newRef(cosmoO_takeString(state, buffer, length));
cosmoV_pushValue(state, temp); cosmoV_pushValue(state, temp);
} else if (IS_STRING(args[1])) { } else if (IS_STRING(args[1])) {
if (strcmp(cosmoV_readCString(args[1]), "a") == 0) { if (strcmp(cosmoV_readCString(args[1]), "a") == 0) {
CValue temp;
char *buffer;
long length;
// get the length of the file // get the length of the file
fseek(file, 0, SEEK_END); fseek(file, 0, SEEK_END);
long length = ftell(file); length = ftell(file);
fseek(file, 0, SEEK_SET); fseek(file, 0, SEEK_SET);
// allocate a buffer for the read data // allocate a buffer for the read data
char *buffer = cosmoM_xmalloc(state, length + 1); buffer = cosmoM_xmalloc(state, length + 1);
// read the data // read the data
fread(buffer, sizeof(char), length, file); fread(buffer, sizeof(char), length, file);
buffer[length] = '\0'; // write the NULL terminator buffer[length] = '\0'; // write the NULL terminator
// push the read data // push the read data
CValue temp = cosmoV_newRef(cosmoO_takeString(state, buffer, length)); temp = cosmoV_newRef(cosmoO_takeString(state, buffer, length));
cosmoV_pushValue(state, temp); cosmoV_pushValue(state, temp);
} else { } else {
cosmoV_error(state, "file:read() expected \"a\" or <number>, got %s!", cosmoV_error(state, "file:read() expected \"a\" or <number>, got %s!",
@ -297,6 +303,10 @@ int fileB_read(CState *state, int nargs, CValue *args)
} }
int fileB_write(CState *state, int nargs, CValue *args) { int fileB_write(CState *state, int nargs, CValue *args) {
CObjObject *fileObj;
CObjString *str;
FILE *file;
if (nargs != 2) { if (nargs != 2) {
cosmoV_error(state, "file:write() expected 2 arguments, got %d!", nargs); cosmoV_error(state, "file:write() expected 2 arguments, got %d!", nargs);
} }
@ -311,10 +321,10 @@ int fileB_write(CState *state, int nargs, CValue *args) {
cosmoV_typeStr(args[0]), cosmoV_typeStr(args[1])); cosmoV_typeStr(args[0]), cosmoV_typeStr(args[1]));
} }
CObjObject *fileObj = cosmoV_readObject(args[0]); fileObj = cosmoV_readObject(args[0]);
FILE *file = cosmoO_getUserP(fileObj); str = cosmoV_readString(args[1]);
CObjString *str = cosmoV_readString(args[1]); file = (FILE *)cosmoO_getUserP(fileObj);
fwrite(str->str, sizeof(char), str->length, file); fwrite(str->str, sizeof(char), str->length, file);
return 0; return 0;
@ -356,7 +366,7 @@ CObjObject *pushFileObj(CState *state, FILE *file)
int cosmoB_osOpen(CState *state, int nargs, CValue *args) int cosmoB_osOpen(CState *state, int nargs, CValue *args)
{ {
const char *mode = "rb"; const char *filePath, *mode = "rb";
FILE *file; FILE *file;
if (nargs >= 1) { if (nargs >= 1) {
@ -370,14 +380,14 @@ int cosmoB_osOpen(CState *state, int nargs, CValue *args)
} }
mode = cosmoV_readCString(args[1]); mode = cosmoV_readCString(args[1]);
} else if (nargs > 2) { } else if (nargs != 1) {
cosmoV_error(state, "os.open() expected 1 or 2 arguments, got %d!", nargs); cosmoV_error(state, "os.open() expected 1 or 2 arguments, got %d!", nargs);
} }
} else { } else {
cosmoV_error(state, "os.open() expected 1 or 2 arguments, got %d!", nargs); cosmoV_error(state, "os.open() expected 1 or 2 arguments, got %d!", nargs);
} }
const char *filePath = cosmoV_readCString(args[0]); filePath = cosmoV_readCString(args[0]);
file = fopen(filePath, mode); file = fopen(filePath, mode);
if (file == NULL) { if (file == NULL) {
cosmoV_pushBoolean(state, true); cosmoV_pushBoolean(state, true);