alec

Abstraction Layer for Escape Codes
git clone git://git.dimitrijedobrota.com/alec.git
Log | Files | Refs | README | LICENSE | HACKING | CONTRIBUTING | CODE_OF_CONDUCT | BUILDING |

commit9825acafd8ec361f16a67151cad1d2c90f71bfdd
parent386477550b0ec2d523464ba780be4693f1250a83
authorDimitrije Dobrota <mail@dimitrijedobrota.com>
dateMon, 4 Mar 2024 23:12:04 +0000

Use api.value.type union

Diffstat:
MCMakeLists.txt|+-
Msrc/generator.c|++++++++++++------------
Msrc/generator.h|+
Msrc/parser.y|++++++++-----------

4 files changed, 22 insertions(+), 24 deletions(-)


diff --git a/CMakeLists.txt b/CMakeLists.txt

@@ -3,7 +3,7 @@ set(CMAKE_EXPORT_COMPILE_COMMANDS ON)

project(
Alec
VERSION 1.0.3
VERSION 1.0.4
DESCRIPTION "Abstraction Layer for Escape Codes"
HOMEPAGE_URL https://git.dimitrijedobrota.com/alec.git
LANGUAGES C CXX

diff --git a/src/generator.c b/src/generator.c

@@ -11,9 +11,9 @@

int yydebug = 1;
#endif
list_t records = { 0 };
list_t after = { 0 };
list_t before = { 0 };
list_t records = {0};
list_t after = {0};
list_t before = {0};
int main(const int argc, char *argv[]) {
if (argc < 2) {

@@ -45,13 +45,13 @@ int main(const int argc, char *argv[]) {

printf("\n/* Template compile-time variables */\n\n");
record_print_dupes(&dupes);
for (node_t *p = records.head; p; p = p->next) {
const struct record *r = (const struct record *)p->data;
const record_t *r = (const record_t *)p->data;
record_print_template(r, list_find(&dupes, r->name, scmp));
}
printf("\n/* Run-time functions */\n\n");
for (node_t *p = records.head; p; p = p->next) {
const struct record *r = (const struct record *)p->data;
const record_t *r = (const record_t *)p->data;
record_print_function(r);
}

@@ -109,11 +109,11 @@ void list_append(list_t *l, node_t *n) {

l->tail = l->tail->next = n;
}
struct record *record_new(char *name, list_t *args, list_t *rules, list_t *recipe) {
struct record *rec;
record_t *record_new(char *name, list_t *args, list_t *rules, list_t *recipe) {
record_t *rec;
MALLOC(rec);
*rec = (struct record){
*rec = (record_t){
.name = name,
.args = args,
.rules = rules,

@@ -124,7 +124,7 @@ struct record *record_new(char *name, list_t *args, list_t *rules, list_t *recip

}
void record_free(void *rp) {
struct record *r = (struct record *)rp;
record_t *r = (record_t *)rp;
if (r->args) list_free(r->args, free), free(r->args);
if (r->rules) list_free(r->rules, free), free(r->rules);
if (r->recipe) list_free(r->recipe, free), free(r->recipe);

@@ -150,7 +150,7 @@ void record_print_dupes(const list_t *l) {

printf("\n");
}
void record_print_function(const struct record *r) {
void record_print_function(const record_t *r) {
list_t dummy = {0};
if (!r->recipe) { // comment

@@ -194,7 +194,7 @@ void record_print_function(const struct record *r) {

list_free(&dummy, NULL);
}
void record_print_template(const struct record *r, int dup) {
void record_print_template(const record_t *r, int dup) {
list_t dummy = {0};
if (!r->recipe) { // comment

@@ -255,7 +255,7 @@ void record_dupes(list_t *d, list_t *l) {

list_t s = {0};
for (node_t *p = records.head; p; p = p->next) {
const struct record *r = (const struct record *)p->data;
const record_t *r = (const record_t *)p->data;
if (!list_find(&s, r->name, scmp)) list_append(&s, node_new(r->name));
else if (!list_find(d, r->name, scmp))
list_append(d, node_new(r->name));

diff --git a/src/generator.h b/src/generator.h

@@ -10,6 +10,7 @@ void yyerror(char *s, ...);

typedef struct node node_t;
typedef struct list list_t;
typedef struct record record_t;
struct node {
char *data;

diff --git a/src/parser.y b/src/parser.y

@@ -3,11 +3,14 @@

#include <stdarg.h>
}
%union {
struct record *r;
list_t *l;
char *n;
}
%define api.value.type union
%token <char *> n LITERAL COMMENT BEFORE AFTER
%type <record_t *> record
%type <list_t *> list items
%type <char *> name
%token EOL COMMA SWITCH EMPTY
%code provides {
int yylex(void);

@@ -20,12 +23,6 @@

extern list_t before;
}
%token <n> LITERAL COMMENT BEFORE AFTER
%token EOL COMMA SWITCH EMPTY
%type <r> record
%type <l> list items
%type <n> name
%start document