This commit is contained in:
Guillem George 2025-10-28 20:13:22 +01:00
parent afe78e4401
commit 8e227e4298

View file

@ -7,6 +7,7 @@
#include <stdio.h> #include <stdio.h>
#include <stdlib.h> #include <stdlib.h>
#include <string.h> #include <string.h>
#include <unistd.h>
#include "hash_maps/hash_maps.h" #include "hash_maps/hash_maps.h"
#include "lines/lines.h" #include "lines/lines.h"
@ -32,8 +33,32 @@ static void hashmap_deep_free(struct hash_map *hash_map)
while (entry != NULL) while (entry != NULL)
{ {
struct pair_list *next = entry->next; struct pair_list *next = entry->next;
// Ok c moche mais eh, ça fonctionne
if (hash_map == rules)
{
struct rule *r = entry->value;
free(r->name);
list_destroy(r->dependencies);
list_destroy(r->recipe);
free(r);
free(entry->key);
}
if (hash_map == variables)
{
struct variable *v = entry->value;
free(v->name);
free(v->value);
free(entry->key); free(entry->key);
free(entry->value); free(entry->value);
}
else
{
printf("DEBUG: attempting to free a generic hashmap");
free(entry->key);
free(entry->value);
}
free(entry); free(entry);
entry = next; entry = next;
} }
@ -54,6 +79,21 @@ static void free_all()
// hashmap_dump(rules); // hashmap_dump(rules);
// } // }
static void exit_on_error(int status, char *message)
{
char *full_msg;
int err = sprintf(full_msg, "%s: %s\n", program_name, message);
free(message);
if (err == -1)
exit(status);
write(STDERR_FILENO, full_msg, strlen(full_msg));
free(full_msg);
free_all();
exit(status);
}
// ==== Parsing ==== // ==== Parsing ====
// Registers a new rule in the hashmap // Registers a new rule in the hashmap
@ -70,8 +110,11 @@ static void register_rule(char *name, struct list *dependencies,
int err = hashmap_insert(variables, name, rule, NULL); int err = hashmap_insert(variables, name, rule, NULL);
if (!err) if (!err)
{ {
errx(1, "Internal Error: Couln't add entry for '%s' in the hashmap", char *err_msg;
sprintf(err_msg,
"Internal Error: Couln't add entry for '%s' in the hashmap",
name); name);
exit_on_error(GENERIC_ERR, err_msg);
} }
} }
@ -83,8 +126,11 @@ static void register_variable(char *name, char *value)
int err = hashmap_insert(variables, name, value, NULL); int err = hashmap_insert(variables, name, value, NULL);
if (!err) if (!err)
{ {
errx(2, "Internal Error: Couln't add entry for '%s' in the hashmap", char *err_msg;
sprintf(err_msg,
"Internal Error: Couln't add entry for '%s' in the hashmap",
name); name);
exit_on_error(GENERIC_ERR, err_msg);
} }
} }
@ -115,10 +161,12 @@ static struct list *read_deps(struct line *l, size_t offset)
if (!ischar(buf[i]) && !isblank(buf[i]) && buf[i] != '\0' if (!ischar(buf[i]) && !isblank(buf[i]) && buf[i] != '\0'
&& buf[i] != '\n') && buf[i] != '\n')
{ {
printf("DEBUG: line: %s", l->buffer); char *err_msg;
errx(2, sprintf(
err_msg,
"Unexpected character '%c' after rule declaration at %lu:%lu", "Unexpected character '%c' after rule declaration at %lu:%lu",
buf[i], l->number, i); buf[i], l->number, i);
exit_on_error(GENERIC_ERR, err_msg);
} }
} }
@ -153,8 +201,13 @@ static struct list *read_recipe(struct line *l)
{ {
char *command = strdup(buf + 1); char *command = strdup(buf + 1);
if (command == NULL) if (command == NULL)
errx(1, "Internal error: couldn't duplicate string (%lu:1)", {
char *err_msg;
sprintf(err_msg,
"Internal error: couldn't duplicate string (%lu:1)",
l->number); l->number);
exit_on_error(GENERIC_ERR, err_msg);
}
res = list_append(res, command); res = list_append(res, command);
} }
@ -179,7 +232,11 @@ static char *read_value(char *buf, size_t buf_size)
str_buf_size += STRING_BUFFER_SIZE; str_buf_size += STRING_BUFFER_SIZE;
str_buf = realloc(str_buf, str_buf_size); str_buf = realloc(str_buf, str_buf_size);
if (str_buf == NULL) if (str_buf == NULL)
errx(2, "Could not realloc"); {
char *err_msg;
sprintf(err_msg, "Could not realloc");
exit_on_error(GENERIC_ERR, err_msg);
}
} }
str_buf[i] = buf[i]; str_buf[i] = buf[i];
@ -217,6 +274,7 @@ static void parse_line(struct line *current_line)
struct list *dependencies; struct list *dependencies;
struct list *recipe; struct list *recipe;
char *value; char *value;
char *err_msg;
// Definition type // Definition type
switch (buf[i]) switch (buf[i])
@ -246,15 +304,21 @@ static void parse_line(struct line *current_line)
case '\0': case '\0':
case '#': case '#':
if (name != NULL) if (name != NULL)
errx(2, {
sprintf(
err_msg,
"Unexpected character '%c' after declaration '%s' at line %lu", "Unexpected character '%c' after declaration '%s' at line %lu",
buf[i], name, current_line->number); buf[i], name, current_line->number);
exit_on_error(GENERIC_ERR, err_msg);
}
else else
break; break;
default: default:
errx(2, "Unexpected character '%c' after declaration '%s' at line %lu", sprintf(err_msg,
"Unexpected character '%c' after declaration '%s' at line %lu",
buf[i], name, current_line->number); buf[i], name, current_line->number);
exit_on_error(GENERIC_ERR, err_msg);
} }
// free(name); // free(name);
@ -277,7 +341,11 @@ void make_parse(char *path)
size_t buf_size = BUFFER_SIZE; size_t buf_size = BUFFER_SIZE;
char *buf = malloc(sizeof(char) * buf_size); char *buf = malloc(sizeof(char) * buf_size);
if (buf == NULL) if (buf == NULL)
errx(2, "Could not allocate more memory"); {
char *err_msg;
sprintf(err_msg, "Could not allocate more memory");
exit_on_error(GENERIC_ERR, err_msg);
}
// Parse line by line // Parse line by line
ssize_t nread; ssize_t nread;
@ -287,7 +355,11 @@ void make_parse(char *path)
while ((nread = getline(&buf, &buf_size, stream)) != -1) while ((nread = getline(&buf, &buf_size, stream)) != -1)
{ {
if (nread == -1) if (nread == -1)
errx(1, "Could not get line %lu", current_line.number); {
char *err_msg;
sprintf(err_msg, "Could not get line %lu", current_line.number);
exit_on_error(GENERIC_ERR, err_msg);
}
current_line.buffer = buf; current_line.buffer = buf;
current_line.length = nread; current_line.length = nread;