Files
Noja/src/lib/builtins/buffer.c
T

99 lines
2.7 KiB
C

#include "buffer.h"
#include "utils.h"
#include "../utils/defs.h"
#include "../utils/utf8.h"
#include "../runtime.h"
static int bin_new(Runtime *runtime, Object **argv, unsigned int argc, Object *rets[static MAX_RETS], Error *error)
{
UNUSED(argc);
ASSERT(argc == 1);
if(!Object_IsInt(argv[0]))
{
Error_Report(error, ErrorType_RUNTIME, "Argument is not an int");
return -1;
}
long long int size = Object_GetInt(argv[0]);
Object *temp = Object_NewBuffer(size, Runtime_GetHeap(runtime), error);
if(temp == NULL)
return -1;
rets[0] = temp;
return 1;
}
static int bin_sliceUp(Runtime *runtime, Object **argv, unsigned int argc, Object *rets[static MAX_RETS], Error *error)
{
UNUSED(argc);
ASSERT(argc == 3);
ParsedArgument pargs[3];
if (!parseArgs(error, argv, argc, pargs, "Bii"))
return -1;
long long int offset = pargs[1].as_int;
long long int length = pargs[2].as_int;
Object *temp = Object_SliceBuffer(argv[0], offset, length, Runtime_GetHeap(runtime), error);
if(temp == NULL)
return -1;
rets[0] = temp;
return 1;
}
static int bin_fromString(Runtime *runtime, Object **argv, unsigned int argc, Object *rets[static MAX_RETS], Error *error)
{
ASSERT(argc == 1);
ParsedArgument pargs[1];
if (!parseArgs(error, argv, argc, pargs, "s"))
return -1;
const char *str = pargs[0].as_string.data;
size_t len = pargs[0].as_string.size;
Object *buffer = Object_NewBufferFromString(str, len, Runtime_GetHeap(runtime), error);
if (buffer == NULL)
return -1;
rets[0] = buffer;
return 1;
}
static int bin_toString(Runtime *runtime, Object **argv, unsigned int argc, Object *rets[static MAX_RETS], Error *error)
{
UNUSED(argc);
ASSERT(argc == 1);
if(!Object_IsBuffer(argv[0]))
{
Error_Report(error, ErrorType_RUNTIME, "Argument is not a buffer");
return -1;
}
void *buffaddr;
size_t buffsize;
buffaddr = Object_GetBuffer(argv[0], &buffsize);
ASSERT(buffaddr != NULL);
if(utf8_strlen(buffaddr, buffsize) < 0)
return returnValues2(error, runtime, rets, "ns", "Buffer doesn't contain valid UTF-8");
Object *temp = Object_FromString(buffaddr, buffsize, Runtime_GetHeap(runtime), error);
if(temp == NULL)
return -1;
rets[0] = temp;
return 1;
}
StaticMapSlot bins_buffer[] = {
{ "new", SM_FUNCT, .as_funct = bin_new, .argc = 1 },
{ "sliceUp", SM_FUNCT, .as_funct = bin_sliceUp, .argc = 3 },
{ "toString", SM_FUNCT, .as_funct = bin_toString, .argc = 1 },
{ "fromString", SM_FUNCT, .as_funct = bin_fromString, .argc = 1 },
};