mirror of
https://github.com/krgamestudios/Toy.git
synced 2026-04-15 14:54:07 +10:00
memory leak and several bugs fixed
This commit is contained in:
@@ -196,18 +196,18 @@ static int nativeRead(Toy_Interpreter* interpreter, Toy_LiteralArray* arguments)
|
|||||||
|
|
||||||
switch (valueLiteral.as.type.typeOf)
|
switch (valueLiteral.as.type.typeOf)
|
||||||
{
|
{
|
||||||
case TOY_LITERAL_BOOLEAN:
|
// case TOY_LITERAL_BOOLEAN:
|
||||||
{
|
// {
|
||||||
char value[TOY_MAX_STRING_LENGTH] = {0};
|
// char value[TOY_MAX_STRING_LENGTH] = {0};
|
||||||
fgets(value, sizeof(value) - 1, file->fp);
|
// fgets(value, sizeof(value) - 1, file->fp);
|
||||||
value[TOY_MAX_STRING_LENGTH] = '\0';
|
// value[TOY_MAX_STRING_LENGTH] = '\0';
|
||||||
|
|
||||||
Toy_Literal stringLiteral = TOY_TO_STRING_LITERAL(Toy_createRefString(value));
|
// Toy_Literal stringLiteral = TOY_TO_STRING_LITERAL(Toy_createRefString(value));
|
||||||
resultLiteral = TOY_TO_BOOLEAN_LITERAL(TOY_IS_TRUTHY(stringLiteral));
|
// resultLiteral = TOY_TO_BOOLEAN_LITERAL(TOY_IS_TRUTHY(stringLiteral));
|
||||||
Toy_freeLiteral(stringLiteral);
|
// Toy_freeLiteral(stringLiteral);
|
||||||
|
|
||||||
break;
|
// break;
|
||||||
}
|
// }
|
||||||
|
|
||||||
case TOY_LITERAL_INTEGER:
|
case TOY_LITERAL_INTEGER:
|
||||||
{
|
{
|
||||||
@@ -232,7 +232,7 @@ static int nativeRead(Toy_Interpreter* interpreter, Toy_LiteralArray* arguments)
|
|||||||
case TOY_LITERAL_STRING:
|
case TOY_LITERAL_STRING:
|
||||||
{
|
{
|
||||||
char value[TOY_MAX_STRING_LENGTH] = {0};
|
char value[TOY_MAX_STRING_LENGTH] = {0};
|
||||||
fgets(value, sizeof(value) - 1, file->fp);
|
fread(value, sizeof(char), sizeof(value) - 1, file->fp);
|
||||||
value[TOY_MAX_STRING_LENGTH] = '\0';
|
value[TOY_MAX_STRING_LENGTH] = '\0';
|
||||||
|
|
||||||
resultLiteral = TOY_TO_STRING_LITERAL(Toy_createRefString(value));
|
resultLiteral = TOY_TO_STRING_LITERAL(Toy_createRefString(value));
|
||||||
@@ -372,8 +372,10 @@ static int nativeRename(Toy_Interpreter* interpreter, Toy_LiteralArray* argument
|
|||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Toy_Literal filePathLiteral = Toy_getDrivePathLiteral(interpreter, &valueLiteral);
|
||||||
|
|
||||||
Toy_File* file = (Toy_File*)TOY_AS_OPAQUE(selfLiteral);
|
Toy_File* file = (Toy_File*)TOY_AS_OPAQUE(selfLiteral);
|
||||||
const char* newName = Toy_toCString(TOY_AS_STRING(valueLiteral));
|
const char* newName = Toy_toCString(TOY_AS_STRING(filePathLiteral));
|
||||||
|
|
||||||
// close the file
|
// close the file
|
||||||
if (file->fp != NULL) {
|
if (file->fp != NULL) {
|
||||||
@@ -384,18 +386,20 @@ static int nativeRename(Toy_Interpreter* interpreter, Toy_LiteralArray* argument
|
|||||||
// rename the file
|
// rename the file
|
||||||
int result = rename(Toy_toCString(file->name), newName);
|
int result = rename(Toy_toCString(file->name), newName);
|
||||||
|
|
||||||
// attempt to open file
|
// open file again
|
||||||
file->fp = fopen(newName, Toy_toCString(file->mode));
|
file->fp = fopen(newName, Toy_toCString(file->mode));
|
||||||
|
|
||||||
|
// update the file object's name
|
||||||
Toy_deleteRefString(file->name);
|
Toy_deleteRefString(file->name);
|
||||||
file->name = Toy_createRefString(newName);
|
file->name = Toy_createRefString(newName);
|
||||||
|
|
||||||
// return result
|
// return result
|
||||||
Toy_Literal resultLiteral = TOY_TO_BOOLEAN_LITERAL(result != 0);
|
Toy_Literal resultLiteral = TOY_TO_BOOLEAN_LITERAL(result == 0);
|
||||||
Toy_pushLiteralArray(&interpreter->stack, resultLiteral);
|
Toy_pushLiteralArray(&interpreter->stack, resultLiteral);
|
||||||
|
|
||||||
// cleanup
|
// cleanup
|
||||||
Toy_freeLiteral(resultLiteral);
|
Toy_freeLiteral(resultLiteral);
|
||||||
|
Toy_freeLiteral(filePathLiteral);
|
||||||
Toy_freeLiteral(valueLiteral);
|
Toy_freeLiteral(valueLiteral);
|
||||||
Toy_freeLiteral(selfLiteral);
|
Toy_freeLiteral(selfLiteral);
|
||||||
|
|
||||||
@@ -462,11 +466,10 @@ static int nativeSeek(Toy_Interpreter* interpreter, Toy_LiteralArray* arguments)
|
|||||||
|
|
||||||
Toy_File* file = (Toy_File*)TOY_AS_OPAQUE(selfLiteral);
|
Toy_File* file = (Toy_File*)TOY_AS_OPAQUE(selfLiteral);
|
||||||
int offset = TOY_AS_INTEGER(offsetLiteral);
|
int offset = TOY_AS_INTEGER(offsetLiteral);
|
||||||
Toy_RefString* orginString = TOY_AS_STRING(originLiteral);
|
Toy_RefString* orginString = Toy_copyRefString(TOY_AS_STRING(originLiteral));
|
||||||
|
|
||||||
int origin = 0;
|
int origin = 0;
|
||||||
|
if (Toy_equalsRefStringCString(orginString, "bgn")) {
|
||||||
if (Toy_equalsRefStringCString(orginString, "set")) {
|
|
||||||
origin = SEEK_SET;
|
origin = SEEK_SET;
|
||||||
}
|
}
|
||||||
else if (Toy_equalsRefStringCString(orginString, "cur")) {
|
else if (Toy_equalsRefStringCString(orginString, "cur")) {
|
||||||
@@ -476,13 +479,13 @@ static int nativeSeek(Toy_Interpreter* interpreter, Toy_LiteralArray* arguments)
|
|||||||
origin = SEEK_END;
|
origin = SEEK_END;
|
||||||
}
|
}
|
||||||
|
|
||||||
int result = fseek(file->fp, offset, origin);
|
int result = origin >= SEEK_SET && origin <= SEEK_END?
|
||||||
|
fseek(file->fp, offset, origin) : -1;
|
||||||
|
|
||||||
Toy_Literal resultLiteral = TOY_TO_BOOLEAN_LITERAL(result == 0);
|
Toy_Literal resultLiteral = TOY_TO_BOOLEAN_LITERAL(result == 0);
|
||||||
Toy_pushLiteralArray(&interpreter->stack, resultLiteral);
|
Toy_pushLiteralArray(&interpreter->stack, resultLiteral);
|
||||||
|
|
||||||
// cleanup
|
// cleanup
|
||||||
Toy_deleteRefString(orginString);
|
|
||||||
Toy_freeLiteral(resultLiteral);
|
Toy_freeLiteral(resultLiteral);
|
||||||
Toy_freeLiteral(offsetLiteral);
|
Toy_freeLiteral(offsetLiteral);
|
||||||
Toy_freeLiteral(selfLiteral);
|
Toy_freeLiteral(selfLiteral);
|
||||||
@@ -674,7 +677,7 @@ static int nativeMode(Toy_Interpreter* interpreter, Toy_LiteralArray* arguments)
|
|||||||
Toy_File* file = (Toy_File*)TOY_AS_OPAQUE(selfLiteral);
|
Toy_File* file = (Toy_File*)TOY_AS_OPAQUE(selfLiteral);
|
||||||
|
|
||||||
// return the result
|
// return the result
|
||||||
Toy_Literal resultLiteral = TOY_TO_STRING_LITERAL(file->mode);
|
Toy_Literal resultLiteral = TOY_TO_STRING_LITERAL(Toy_copyRefString(file->mode));
|
||||||
Toy_pushLiteralArray(&interpreter->stack, resultLiteral);
|
Toy_pushLiteralArray(&interpreter->stack, resultLiteral);
|
||||||
|
|
||||||
// cleanup
|
// cleanup
|
||||||
|
|||||||
@@ -2,6 +2,14 @@ import fileio;
|
|||||||
|
|
||||||
var PATH: string const = "scripts:/lib/file/fileio.txt";
|
var PATH: string const = "scripts:/lib/file/fileio.txt";
|
||||||
|
|
||||||
|
// reset file to orginal state
|
||||||
|
fn reset() {
|
||||||
|
var writer = open(PATH, "w");
|
||||||
|
writer.write("Hello, World!\n");
|
||||||
|
|
||||||
|
writer.close();
|
||||||
|
}
|
||||||
|
|
||||||
// test global constants
|
// test global constants
|
||||||
{
|
{
|
||||||
assert MAX_FILENAME_SIZE > 0, "MAX_FILENAME_SIZE failed";
|
assert MAX_FILENAME_SIZE > 0, "MAX_FILENAME_SIZE failed";
|
||||||
@@ -9,28 +17,89 @@ var PATH: string const = "scripts:/lib/file/fileio.txt";
|
|||||||
assert END_OF_FILE == -1, "END_OF_FILE failed";
|
assert END_OF_FILE == -1, "END_OF_FILE failed";
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// test read
|
||||||
|
{
|
||||||
|
// // enter test
|
||||||
|
// assert input.read(string) == "test\n", "read string failed";
|
||||||
|
|
||||||
|
// // enter 8
|
||||||
|
// assert input.read(int) == 8, "read int failed";
|
||||||
|
|
||||||
|
// // enter 12.5
|
||||||
|
// assert input.read(float) == 12.5, "read float failed";
|
||||||
|
|
||||||
|
// // invaild types
|
||||||
|
// assert input.read(type) == null, "read type failed";
|
||||||
|
// assert input.read(any) == null, "read any failed";
|
||||||
|
}
|
||||||
|
|
||||||
|
// test write
|
||||||
|
{
|
||||||
|
assert output.write(8) == true, "write int failed";
|
||||||
|
assert output.write("\n") == true, "write string failed";
|
||||||
|
assert output.write(12.5) == true, "write float failed";
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
// test open and close
|
// test open and close
|
||||||
{
|
{
|
||||||
var reader = open(PATH, "r");
|
var reader = open(PATH, "r");
|
||||||
assert reader != null, "open failed on existing file";
|
assert reader != null, "open failed in reading mode";
|
||||||
|
|
||||||
|
assert reader.close() == true, "close failed";
|
||||||
|
|
||||||
var file = open("scripts:/doesNotExist", "r");
|
var file = open("scripts:/doesNotExist", "r");
|
||||||
assert file == null, "open failed on nonexisting file";
|
assert file == null, "open failed on nonexisting file";
|
||||||
|
}
|
||||||
|
|
||||||
assert reader.close() == true, "close failed";
|
// test write
|
||||||
|
{
|
||||||
|
var writer = open(PATH, "w");
|
||||||
|
assert writer != null, "open failed in writing mode";
|
||||||
|
|
||||||
|
assert writer.read(string) != null, "read in writing mode failed";
|
||||||
|
assert writer.write("writen text") == true, "write in writing mode failed";
|
||||||
|
|
||||||
|
writer.close();
|
||||||
|
reset();
|
||||||
}
|
}
|
||||||
|
|
||||||
// test append
|
// test append
|
||||||
{
|
{
|
||||||
var appender = open(PATH, "a");
|
var appender = open(PATH, "a");
|
||||||
|
assert appender != null, "open failed on appending file";
|
||||||
|
|
||||||
assert appender.write("appended text") == true, "append failed";
|
assert appender.write("appended text") == true, "append failed";
|
||||||
|
|
||||||
appender.close();
|
appender.close();
|
||||||
|
reset();
|
||||||
|
}
|
||||||
|
|
||||||
var writer = open(PATH, "w");
|
// test read extended
|
||||||
writer.write("Hello, World!\n");
|
{
|
||||||
|
var reader = open(PATH, "r+");
|
||||||
|
assert reader != null, "open failed on read extended mode";
|
||||||
|
|
||||||
|
assert reader.write("writen text") == true, "write in read extended failed";
|
||||||
|
assert reader.read(string) == "d!\n", "read in read extended failed";
|
||||||
|
|
||||||
|
reader.close();
|
||||||
|
reset();
|
||||||
|
}
|
||||||
|
|
||||||
|
// test write extended
|
||||||
|
{
|
||||||
|
var writer = open(PATH, "w+");
|
||||||
|
assert writer != null, "open failed on write extended mode";
|
||||||
|
|
||||||
|
assert writer.write("writen text") == true, "write in write extended failed";
|
||||||
|
|
||||||
|
writer.seek("bgn", 0);
|
||||||
|
|
||||||
|
assert writer.read(string) == "writen text", "read in write extended failed";
|
||||||
|
|
||||||
writer.close();
|
writer.close();
|
||||||
|
reset();
|
||||||
}
|
}
|
||||||
|
|
||||||
// test rename
|
// test rename
|
||||||
@@ -38,16 +107,17 @@ var PATH: string const = "scripts:/lib/file/fileio.txt";
|
|||||||
var reader = open(PATH, "r");
|
var reader = open(PATH, "r");
|
||||||
assert reader.rename("scripts:/lib/file/newName.txt") == true, "rename failed";
|
assert reader.rename("scripts:/lib/file/newName.txt") == true, "rename failed";
|
||||||
|
|
||||||
|
reader.rename(PATH);
|
||||||
reader.close();
|
reader.close();
|
||||||
}
|
}
|
||||||
|
|
||||||
// test seek
|
// test seek
|
||||||
{
|
{
|
||||||
var reader = open(PATH, "r");
|
var reader = open(PATH, "r");
|
||||||
assert reader.seek("set", 6) == true, "seek failed";
|
assert reader.seek("bgn", 6) == true, "seek operation failed";
|
||||||
|
|
||||||
var contents = reader.read(string);
|
var contents = reader.read(string);
|
||||||
assert contents == " World!\n", "seek failed to move";
|
assert contents == " World!\n", "seek failed to move file position";
|
||||||
|
|
||||||
reader.close();
|
reader.close();
|
||||||
}
|
}
|
||||||
@@ -64,36 +134,13 @@ var PATH: string const = "scripts:/lib/file/fileio.txt";
|
|||||||
|
|
||||||
reader.read(string);
|
reader.read(string);
|
||||||
|
|
||||||
// assert reader.error() == false, "error failed";
|
assert reader.error() == false, "error failed";
|
||||||
// assert reader.completed() == true, "completed failed"; // Leaks for some reason?
|
assert reader.completed() == true, "completed after read failed";
|
||||||
// assert reader.position() == 14, "position failed";
|
assert reader.position() == 14, "position failed";
|
||||||
// assert reader.size() == 13, "size failed";
|
assert reader.size() == 14, "size failed";
|
||||||
// assert reader.mode() == "r", "mode failed";
|
assert reader.mode() == "r", "mode failed";
|
||||||
|
|
||||||
reader.close();
|
reader.close();
|
||||||
}
|
}
|
||||||
|
|
||||||
// test write
|
print "All good";
|
||||||
{
|
|
||||||
assert output.write(8), "write int failed";
|
|
||||||
assert output.write("\n"), "write string failed";
|
|
||||||
assert output.write(12.5), "write float failed";
|
|
||||||
}
|
|
||||||
|
|
||||||
// test read
|
|
||||||
{
|
|
||||||
output.write("\n");
|
|
||||||
|
|
||||||
// enter 8
|
|
||||||
assert input.read(int) == 8, "read int failed";
|
|
||||||
|
|
||||||
// enter 12.5
|
|
||||||
assert input.read(float) == 12.5, "read float failed";
|
|
||||||
|
|
||||||
// enter test
|
|
||||||
assert input.read(string) == "test\n", "read string failed";
|
|
||||||
|
|
||||||
// invaild types
|
|
||||||
assert input.read(type) == null, "type failed";
|
|
||||||
assert input.read(any) == null, "any failed";
|
|
||||||
}
|
|
||||||
Reference in New Issue
Block a user