alecAbstraction Layer for Escape Codes |
git clone git://git.dimitrijedobrota.com/alec.git |
Log | Files | Refs | README | LICENSE | HACKING | CONTRIBUTING | CODE_OF_CONDUCT | BUILDING | |
commit | 424633da3f889e83f581ae158cc4841d29d9bc4c |
parent | 9aecfcedea481a45b5bef86c2c41d64733d9bcd5 |
author | Dimitrije Dobrota <mail@dimitrijedobrota.com> |
date | Fri, 1 Mar 2024 23:32:33 +0000 |
Small memory handling improvement
Diffstat:M | CMakeLists.txt | | | +- |
M | src/generator.h | | | +- |
M | src/parser.y | | | ++++++++++++++++++-------------------------- |
3 files changed, 20 insertions(+), 28 deletions(-)
diff --git a/CMakeLists.txt b/CMakeLists.txt
@@ -3,7 +3,7 @@ set(CMAKE_EXPORT_COMPILE_COMMANDS ON)
project(
Alec
VERSION 1.0.2
VERSION 1.0.3
DESCRIPTION "Abstraction Layer for Escape Codes"
HOMEPAGE_URL https://git.dimitrijedobrota.com/alec.git
LANGUAGES C CXX
diff --git a/src/generator.h b/src/generator.h
@@ -44,7 +44,7 @@ int list_find(list_t *l, void *data, cmp_f cmp);
struct record *record_new(char *name, list_t *args, list_t *rules, list_t *recipe);
void record_free(void *rp);
list_t *record_dupes(list_t *l);
void record_dupes(list_t *d, list_t *l);
void record_print_template(const struct record *r, int dup);
void record_print_function(const struct record *r);
diff --git a/src/parser.y b/src/parser.y
@@ -2,6 +2,11 @@
#include "generator.h"
#include <stdarg.h>
#define MALLOC(x) do { \
x = malloc(sizeof(*x)); \
if(!x) yyerror("out of space"), exit(1); \
} while(0);
int yylex(void);
int yyparse(void);
void yyrestart(FILE *);
@@ -90,13 +95,14 @@ int main(const int argc, char *argv[]) {
printf("%s", p->data);
}
list_t *dupes = record_dupes(&records);
list_t dupes = { 0 };
record_dupes(&dupes, &records);
printf("\n/* Template compile-time variables */\n\n");
record_print_dupes(dupes);
record_print_dupes(&dupes);
for(node_t *p = records.head; p; p = p->next) {
const struct record * r = (const struct record *)p->data;
record_print_template(r, list_find(dupes, r->name, scmp));
record_print_template(r, list_find(&dupes, r->name, scmp));
}
printf("\n/* Run-time functions */\n\n");
@@ -110,8 +116,7 @@ int main(const int argc, char *argv[]) {
printf("%s", p->data);
}
list_free(dupes, 0);
free(dupes);
list_free(&dupes, 0);
list_free(&before, free);
list_free(&records, record_free);
@@ -121,13 +126,9 @@ int main(const int argc, char *argv[]) {
}
node_t *node_new(char *data) {
node_t *n = malloc(sizeof(node_t));
if(!n) {
yyerror("out of space");
exit(1);
}
node_t *n;
MALLOC(n);
*n = (node_t) {
.data = data,
.next = NULL,
@@ -137,13 +138,10 @@ node_t *node_new(char *data) {
}
list_t *list_new(char *data) {
list_t *l = calloc(1, sizeof(list_t));
if(!l) {
yyerror("out of space");
exit(1);
}
list_t *l;
MALLOC(l);
*l = (list_t) { 0 };
if(data) list_append(l, node_new(data));
return l;
@@ -167,13 +165,9 @@ void list_append(list_t *l, node_t *n) {
}
struct record *record_new(char *name, list_t *args, list_t *rules, list_t *recipe){
struct record* rec = malloc(sizeof(struct record));
if(!rec) {
yyerror("out of space");
exit(1);
}
struct record* rec;
MALLOC(rec);
*rec = (struct record) {
.name = name,
.args = args,
@@ -314,8 +308,7 @@ int scmp(const void *a, const void *b) {
return strcmp((const char *)a, (const char *)b);
}
list_t *record_dupes(list_t *l) {
list_t *d = list_new(NULL);
void record_dupes(list_t *d, list_t *l) {
list_t s = { 0 };
for(node_t *p = records.head; p; p = p->next) {
@@ -325,7 +318,6 @@ list_t *record_dupes(list_t *l) {
}
list_free(&s, NULL);
return d;
}
void yyerror(char *s, ...) {