aboutsummaryrefslogtreecommitdiff
path: root/scripts/write_config/symlist.c
diff options
context:
space:
mode:
Diffstat (limited to 'scripts/write_config/symlist.c')
-rw-r--r--scripts/write_config/symlist.c46
1 files changed, 46 insertions, 0 deletions
diff --git a/scripts/write_config/symlist.c b/scripts/write_config/symlist.c
new file mode 100644
index 0000000..71d9470
--- /dev/null
+++ b/scripts/write_config/symlist.c
@@ -0,0 +1,46 @@
+#include "symlist.h"
+
+struct symlist *symlist_read(FILE * f) {
+ struct symlist *ret;
+ ret = malloc(sizeof(struct symlist));
+ ret->size = 1;
+ ret->array = malloc(ret->size * sizeof(struct symlist_el));
+
+ unsigned int id;
+ char *w;
+ size_t w_pos = 0, w_size = 2;
+ w = malloc((w_size + 1) * sizeof(char));
+
+ int c;
+ do {
+ c = fgetc(f);
+ if (c == EOF || c == '\n') {
+ w[w_pos] = '\0';
+ if ((size_t) id > ret->size) {
+ ret->size *= 2;
+ ret->array =
+ realloc(ret->array,
+ ret->size * sizeof(struct symlist_el));
+ }
+ ret->array[(size_t) id - 1].id = id;
+ ret->array[(size_t) id - 1].sym = sym_lookup(w, 0);
+ w_pos = 0;
+ } else if (c == ':') {
+ w[w_pos] = '\0';
+ id = atoi(w);
+ w_pos = 0;
+ } else {
+ if (w_pos >= w_size) {
+ w_size *= 2;
+ w = realloc(w, (w_size + 1) * sizeof(char));
+ }
+ w[w_pos++] = (char) c;
+ }
+ } while (c != EOF);
+
+ return ret;
+}
+
+struct symbol *symlist_get(struct symlist *sl, unsigned int id) {
+ return sl->array[id].sym;
+}