...
This commit is contained in:
@@ -22,6 +22,19 @@ public class Generator
|
||||
#include <stdint.h>
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
#include <stdio.h>
|
||||
|
||||
static inline void *nub_alloc(size_t size)
|
||||
{
|
||||
void *mem = malloc(size);
|
||||
if (mem == NULL)
|
||||
{
|
||||
puts("Out of memory");
|
||||
exit(1);
|
||||
}
|
||||
|
||||
return mem;
|
||||
}
|
||||
|
||||
typedef struct
|
||||
{
|
||||
@@ -70,8 +83,8 @@ public class Generator
|
||||
{
|
||||
size_t new_length = left->length + right->length;
|
||||
|
||||
string_ptr result = (string_ptr)malloc(sizeof(string));
|
||||
result->data = (char*)malloc(new_length + 1);
|
||||
string_ptr result = (string_ptr)nub_alloc(sizeof(string));
|
||||
result->data = (char*)nub_alloc(new_length + 1);
|
||||
|
||||
memcpy(result->data, left->data, left->length);
|
||||
memcpy(result->data + left->length, right->data, right->length);
|
||||
@@ -88,8 +101,8 @@ public class Generator
|
||||
{
|
||||
size_t len = strlen(cstr);
|
||||
|
||||
string_ptr result = (string_ptr)malloc(sizeof(string));
|
||||
result->data = (char*)malloc(len + 1);
|
||||
string_ptr result = (string_ptr)nub_alloc(sizeof(string));
|
||||
result->data = (char*)nub_alloc(len + 1);
|
||||
|
||||
memcpy(result->data, cstr, len + 1);
|
||||
|
||||
@@ -105,13 +118,9 @@ public class Generator
|
||||
{ \
|
||||
if ((xs)->count >= (xs)->capacity) \
|
||||
{ \
|
||||
if ((xs)->capacity == 0) \
|
||||
(xs)->capacity = 256; \
|
||||
else \
|
||||
(xs)->capacity *= 2; \
|
||||
(xs)->capacity *= 2; \
|
||||
(xs)->items = realloc((xs)->items, (xs)->capacity * sizeof(*(xs)->items)); \
|
||||
} \
|
||||
\
|
||||
(xs)->items[(xs)->count++] = (x); \
|
||||
} while (0)
|
||||
|
||||
@@ -405,6 +414,7 @@ public class Generator
|
||||
}
|
||||
writer.WriteLine("}");
|
||||
writer.WriteLine();
|
||||
writer.WriteLine("free(array->items);");
|
||||
writer.WriteLine("free(array);");
|
||||
}
|
||||
writer.WriteLine("}");
|
||||
@@ -416,11 +426,11 @@ public class Generator
|
||||
writer.WriteLine("{");
|
||||
using (writer.Indent())
|
||||
{
|
||||
writer.WriteLine($"{name} array = ({name})malloc(sizeof({backingName}));");
|
||||
writer.WriteLine($"{name} array = ({name})nub_alloc(sizeof({backingName}));");
|
||||
writer.WriteLine("array->ref = 1;");
|
||||
writer.WriteLine("array->count = 0;");
|
||||
writer.WriteLine("array->capacity = 0;");
|
||||
writer.WriteLine("array->items = NULL;");
|
||||
writer.WriteLine("array->capacity = 10;");
|
||||
writer.WriteLine($"array->items = ({TypeName(arrayType.ElementType)}*)nub_alloc(sizeof({TypeName(arrayType.ElementType)}) * array->capacity);");
|
||||
writer.WriteLine("return array;");
|
||||
}
|
||||
writer.WriteLine("}");
|
||||
@@ -856,6 +866,7 @@ public class Generator
|
||||
NubTypeUInt t => $"uint{t.Width}_t",
|
||||
NubTypePointer => Tmp(),
|
||||
NubTypeString => "string_ptr",
|
||||
NubTypeChar => "char",
|
||||
NubTypeFunc => Tmp(),
|
||||
NubTypeArray => Tmp(),
|
||||
_ => throw new NotImplementedException(),
|
||||
|
||||
Reference in New Issue
Block a user