New module for functions I no longer need to work on
lib.(h|c) basically has structures and functions I no longer want to stare at in main.c
This commit is contained in:
2
Makefile
2
Makefile
@@ -1,7 +1,7 @@
|
|||||||
CC=gcc
|
CC=gcc
|
||||||
CFLAGS=-Wall -Wextra -Wpedantic -ggdb -fsanitize=address -std=c11
|
CFLAGS=-Wall -Wextra -Wpedantic -ggdb -fsanitize=address -std=c11
|
||||||
LIBS=
|
LIBS=
|
||||||
OBJECTS=main.o
|
OBJECTS=lib.o main.o
|
||||||
OUT=obf.out
|
OUT=obf.out
|
||||||
ARGS=
|
ARGS=
|
||||||
|
|
||||||
|
|||||||
57
lib.c
Normal file
57
lib.c
Normal file
@@ -0,0 +1,57 @@
|
|||||||
|
/* lib.c
|
||||||
|
* Created: 2023-09-02
|
||||||
|
* Author: Aryadev Chavali
|
||||||
|
* Description: General functions used throughout
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <string.h>
|
||||||
|
|
||||||
|
#include "./lib.h"
|
||||||
|
|
||||||
|
buffer_t *buffer_init_str(const char *name, const char *str, size_t str_size)
|
||||||
|
{
|
||||||
|
buffer_t *buf = malloc(sizeof(*buf) + str_size + 1);
|
||||||
|
buf->name = name;
|
||||||
|
buf->size = str_size;
|
||||||
|
memcpy(buf->data, str, str_size);
|
||||||
|
buf->data[str_size] = '\0';
|
||||||
|
return buf;
|
||||||
|
}
|
||||||
|
|
||||||
|
void print_error(const char *handle, size_t row, size_t column,
|
||||||
|
const char *reason)
|
||||||
|
{
|
||||||
|
fprintf(stderr, "%s:%lu:%lu:%s\n", handle, row, column, reason);
|
||||||
|
}
|
||||||
|
|
||||||
|
char *fread_all(FILE *fp)
|
||||||
|
{
|
||||||
|
const size_t CHUNK_SIZE = 1024, MULT = 2;
|
||||||
|
struct
|
||||||
|
{
|
||||||
|
char *data;
|
||||||
|
size_t used, available;
|
||||||
|
} buffer = {calloc(CHUNK_SIZE, sizeof(*buffer.data)), 0, CHUNK_SIZE};
|
||||||
|
|
||||||
|
size_t acc = 0, bytes_read = 0;
|
||||||
|
while ((bytes_read = fread(buffer.data + acc, sizeof(*buffer.data),
|
||||||
|
CHUNK_SIZE, fp)) != 0)
|
||||||
|
{
|
||||||
|
buffer.used += bytes_read;
|
||||||
|
acc += bytes_read;
|
||||||
|
if (buffer.used + CHUNK_SIZE >= buffer.available)
|
||||||
|
{
|
||||||
|
buffer.available = MAX(buffer.available * MULT, buffer.used + CHUNK_SIZE);
|
||||||
|
buffer.data = realloc(buffer.data, buffer.available);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
buffer.data = realloc(buffer.data, buffer.used + 1);
|
||||||
|
buffer.data[buffer.used] = '\0';
|
||||||
|
return buffer.data;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool usable_character(char c)
|
||||||
|
{
|
||||||
|
return c == '>' || c == '<' || c == '+' || c == '-' || c == '-' || c == '.' ||
|
||||||
|
c == ',' || c == '[' || c == ']';
|
||||||
|
}
|
||||||
23
lib.h
Normal file
23
lib.h
Normal file
@@ -0,0 +1,23 @@
|
|||||||
|
#ifndef LIB_H
|
||||||
|
#define LIB_H
|
||||||
|
|
||||||
|
#include <stdbool.h>
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <stdlib.h>
|
||||||
|
|
||||||
|
#define MAX(a, b) (a > b ? a : b)
|
||||||
|
|
||||||
|
bool usable_character(char c);
|
||||||
|
char *fread_all(FILE *fp);
|
||||||
|
void print_error(const char *handle, size_t row, size_t column,
|
||||||
|
const char *reason);
|
||||||
|
|
||||||
|
typedef struct Buffer
|
||||||
|
{
|
||||||
|
const char *name;
|
||||||
|
size_t size;
|
||||||
|
char data[];
|
||||||
|
} buffer_t;
|
||||||
|
|
||||||
|
buffer_t *buffer_init_str(const char *name, const char *str, size_t str_size);
|
||||||
|
#endif
|
||||||
131
main.c
131
main.c
@@ -10,6 +10,8 @@
|
|||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
|
|
||||||
|
#include "./lib.h"
|
||||||
|
|
||||||
#define MEMORY_DEFAULT 30000
|
#define MEMORY_DEFAULT 30000
|
||||||
|
|
||||||
typedef struct
|
typedef struct
|
||||||
@@ -18,12 +20,6 @@ typedef struct
|
|||||||
uint8_t memory[MEMORY_DEFAULT];
|
uint8_t memory[MEMORY_DEFAULT];
|
||||||
} machine_t;
|
} machine_t;
|
||||||
|
|
||||||
bool usable_character(char c)
|
|
||||||
{
|
|
||||||
return c == '>' || c == '<' || c == '+' || c == '-' || c == '-' || c == '.' ||
|
|
||||||
c == ',' || c == '[' || c == ']';
|
|
||||||
}
|
|
||||||
|
|
||||||
typedef struct AST
|
typedef struct AST
|
||||||
{
|
{
|
||||||
size_t col, row;
|
size_t col, row;
|
||||||
@@ -41,34 +37,48 @@ typedef struct AST
|
|||||||
int loop_ref;
|
int loop_ref;
|
||||||
} node_t;
|
} node_t;
|
||||||
|
|
||||||
typedef struct Buffer
|
char *ast_to_str(node_t *ast, size_t size)
|
||||||
{
|
{
|
||||||
const char *name;
|
char *out = calloc(size + 1, 1);
|
||||||
size_t size;
|
for (size_t i = 0; i < size; ++i)
|
||||||
char data[];
|
{
|
||||||
} buffer_t;
|
switch (ast[i].type)
|
||||||
|
{
|
||||||
buffer_t *buffer_init_str(const char *name, const char *str, size_t str_size)
|
case NEXT:
|
||||||
{
|
out[i] = '>';
|
||||||
buffer_t *buf = malloc(sizeof(*buf) + str_size + 1);
|
break;
|
||||||
buf->name = name;
|
case PREV:
|
||||||
buf->size = str_size;
|
out[i] = '<';
|
||||||
memcpy(buf->data, str, str_size);
|
break;
|
||||||
buf->data[str_size] = '\0';
|
case INC:
|
||||||
return buf;
|
out[i] = '+';
|
||||||
}
|
break;
|
||||||
|
case DEC:
|
||||||
void print_error(const char *handle, size_t row, size_t column,
|
out[i] = '-';
|
||||||
const char *reason)
|
break;
|
||||||
{
|
case OUT:
|
||||||
fprintf(stderr, "%s:%lu:%lu:%s\n", handle, row, column, reason);
|
out[i] = '.';
|
||||||
|
break;
|
||||||
|
case READ:
|
||||||
|
out[i] = ',';
|
||||||
|
break;
|
||||||
|
case LIN:
|
||||||
|
out[i] = '[';
|
||||||
|
break;
|
||||||
|
case LOUT:
|
||||||
|
out[i] = ']';
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
out[size] = '\0';
|
||||||
|
return out;
|
||||||
}
|
}
|
||||||
|
|
||||||
struct PResult
|
struct PResult
|
||||||
{
|
{
|
||||||
node_t *nodes;
|
node_t *nodes;
|
||||||
size_t size;
|
size_t size;
|
||||||
} parse_input(buffer_t *buffer)
|
} 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;
|
||||||
@@ -166,71 +176,6 @@ error:
|
|||||||
return (struct PResult){0};
|
return (struct PResult){0};
|
||||||
}
|
}
|
||||||
|
|
||||||
char *ast_to_str(node_t *ast, size_t size)
|
|
||||||
{
|
|
||||||
char *out = calloc(size + 1, 1);
|
|
||||||
for (size_t i = 0; i < size; ++i)
|
|
||||||
{
|
|
||||||
switch (ast[i].type)
|
|
||||||
{
|
|
||||||
case NEXT:
|
|
||||||
out[i] = '>';
|
|
||||||
break;
|
|
||||||
case PREV:
|
|
||||||
out[i] = '<';
|
|
||||||
break;
|
|
||||||
case INC:
|
|
||||||
out[i] = '+';
|
|
||||||
break;
|
|
||||||
case DEC:
|
|
||||||
out[i] = '-';
|
|
||||||
break;
|
|
||||||
case OUT:
|
|
||||||
out[i] = '.';
|
|
||||||
break;
|
|
||||||
case READ:
|
|
||||||
out[i] = ',';
|
|
||||||
break;
|
|
||||||
case LIN:
|
|
||||||
out[i] = '[';
|
|
||||||
break;
|
|
||||||
case LOUT:
|
|
||||||
out[i] = ']';
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
out[size] = '\0';
|
|
||||||
return out;
|
|
||||||
}
|
|
||||||
|
|
||||||
#define MAX(a, b) (a > b ? a : b)
|
|
||||||
|
|
||||||
char *fread_all(FILE *fp)
|
|
||||||
{
|
|
||||||
const size_t CHUNK_SIZE = 1024, MULT = 2;
|
|
||||||
struct
|
|
||||||
{
|
|
||||||
char *data;
|
|
||||||
size_t used, available;
|
|
||||||
} buffer = {calloc(CHUNK_SIZE, sizeof(*buffer.data)), 0, CHUNK_SIZE};
|
|
||||||
|
|
||||||
size_t acc = 0, bytes_read = 0;
|
|
||||||
while ((bytes_read = fread(buffer.data + acc, sizeof(*buffer.data),
|
|
||||||
CHUNK_SIZE, fp)) != 0)
|
|
||||||
{
|
|
||||||
buffer.used += bytes_read;
|
|
||||||
acc += bytes_read;
|
|
||||||
if (buffer.used + CHUNK_SIZE >= buffer.available)
|
|
||||||
{
|
|
||||||
buffer.available = MAX(buffer.available * MULT, buffer.used + CHUNK_SIZE);
|
|
||||||
buffer.data = realloc(buffer.data, buffer.available);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
buffer.data = realloc(buffer.data, buffer.used + 1);
|
|
||||||
buffer.data[buffer.used] = '\0';
|
|
||||||
return buffer.data;
|
|
||||||
}
|
|
||||||
|
|
||||||
int main(int argc, char *argv[])
|
int main(int argc, char *argv[])
|
||||||
{
|
{
|
||||||
if (argc == 1)
|
if (argc == 1)
|
||||||
@@ -260,7 +205,7 @@ int main(int argc, char *argv[])
|
|||||||
fclose(handle);
|
fclose(handle);
|
||||||
|
|
||||||
buffer = buffer_init_str(filepath, file_data, strlen(file_data));
|
buffer = buffer_init_str(filepath, file_data, strlen(file_data));
|
||||||
res = parse_input(buffer);
|
res = parse_buffer(buffer);
|
||||||
if (res.nodes == NULL)
|
if (res.nodes == NULL)
|
||||||
{
|
{
|
||||||
fputs("Exiting early...\n", stderr);
|
fputs("Exiting early...\n", stderr);
|
||||||
|
|||||||
Reference in New Issue
Block a user