Some general reworking, error handling

This commit is contained in:
2024-12-03 00:04:40 +00:00
parent 623b3acc1f
commit 9bbfa7d2cd
4 changed files with 36 additions and 7 deletions

8
lib.c
View File

@@ -33,6 +33,14 @@ char *fread_all(FILE *fp)
size_t used, available; size_t used, available;
} buffer = {calloc(CHUNK_SIZE, sizeof(*buffer.data)), 0, CHUNK_SIZE}; } buffer = {calloc(CHUNK_SIZE, sizeof(*buffer.data)), 0, CHUNK_SIZE};
if (!buffer.data)
{
print_error(
"[internal]", 0, 0,
"ERROR: Out of Memory (could not allocate buffer in fread_all)");
return NULL;
}
size_t acc = 0, bytes_read = 0; size_t acc = 0, bytes_read = 0;
while ((bytes_read = fread(buffer.data + acc, sizeof(*buffer.data), while ((bytes_read = fread(buffer.data + acc, sizeof(*buffer.data),
CHUNK_SIZE, fp)) != 0) CHUNK_SIZE, fp)) != 0)

13
main.c
View File

@@ -74,14 +74,19 @@ void interpret(machine_t *cpu, node_t *ast, size_t num)
#endif #endif
} }
void usage(const char *name, FILE *fp)
{
fprintf(fp,
"Usage: %s [FILE]...\n\tExecutes FILES sequentially on the "
"same machine\n",
name);
}
int main(int argc, char *argv[]) int main(int argc, char *argv[])
{ {
if (argc == 1) if (argc == 1)
{ {
fprintf( usage(argv[0], stderr);
stderr,
"Usage: %s [FILE]...\nReads FILES sequentially on the same machine\n",
argv[0]);
return 1; return 1;
} }

View File

@@ -11,6 +11,13 @@
char *ast_to_str(node_t *ast, size_t size) char *ast_to_str(node_t *ast, size_t size)
{ {
char *out = calloc(size + 1, 1); char *out = calloc(size + 1, 1);
if (!out)
{
print_error(
"[internal]", 0, 0,
"ERROR: Out of Memory (could not allocate buffer in ast_to_str)");
return NULL;
}
for (size_t i = 0; i < size; ++i) for (size_t i = 0; i < size; ++i)
{ {
switch (ast[i].type) switch (ast[i].type)
@@ -49,6 +56,8 @@ struct PResult parse_buffer(buffer_t *buffer)
{ {
node_t *nodes = NULL; node_t *nodes = NULL;
size_t usable = 0, loops = 0; size_t usable = 0, loops = 0;
// First pass: Compute |nodes|
for (size_t i = 0; i < buffer->size; ++i) for (size_t i = 0; i < buffer->size; ++i)
if (usable_character(buffer->data[i])) if (usable_character(buffer->data[i]))
{ {
@@ -57,8 +66,15 @@ struct PResult parse_buffer(buffer_t *buffer)
++loops; ++loops;
} }
nodes = calloc(usable, sizeof(*nodes)); nodes = calloc(usable, sizeof(*nodes));
if (!nodes)
{
print_error(
"[internal]", 0, 0,
"ERROR: Out of Memory (could not allocate buffer in parse_buffer)");
return (struct PResult){0};
}
// First pass: Get my info // Second pass: parse nodes
for (size_t i = 0, col = 0, row = 1, nptr = 0; i < buffer->size; ++i) for (size_t i = 0, col = 0, row = 1, nptr = 0; i < buffer->size; ++i)
{ {
++col; ++col;
@@ -104,7 +120,7 @@ struct PResult parse_buffer(buffer_t *buffer)
} }
} }
// Second pass: setup any loop references // Third pass: setup loop references
node_t *stack[loops]; node_t *stack[loops];
memset(stack, 0, loops); memset(stack, 0, loops);
size_t stackptr = 0; size_t stackptr = 0;

View File

@@ -3,7 +3,7 @@
#include "./lib.h" #include "./lib.h"
typedef struct AST typedef struct
{ {
size_t col, row; size_t col, row;
enum enum