Some general reworking, error handling
This commit is contained in:
8
lib.c
8
lib.c
@@ -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
13
main.c
@@ -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;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
20
parser.c
20
parser.c
@@ -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;
|
||||||
|
|||||||
Reference in New Issue
Block a user