summaryrefslogtreecommitdiff
path: root/nasmlib
diff options
context:
space:
mode:
authorH. Peter Anvin (Intel) <hpa@zytor.com>2018-12-11 13:06:14 -0800
committerH. Peter Anvin (Intel) <hpa@zytor.com>2018-12-11 13:37:32 -0800
commit64471097ca7598e8238f9e5ed25b3afaa9b10f2c (patch)
treed31d4d84403d36500b30a372d03596ae9459c2d4 /nasmlib
parentebb05a0e5fa8dfae58e6a00e550005df4b0f58f8 (diff)
downloadnasm-64471097ca7598e8238f9e5ed25b3afaa9b10f2c.tar.gz
strlist: merge the strtbl and strlist interfaces
The currently-unused strtbl was basically a slightly different version of strlist, with the find and linearize capabilities. Merge these two together by augmenting strlist to have the same capabilities. Signed-off-by: H. Peter Anvin (Intel) <hpa@zytor.com>
Diffstat (limited to 'nasmlib')
-rw-r--r--nasmlib/strlist.c48
1 files changed, 42 insertions, 6 deletions
diff --git a/nasmlib/strlist.c b/nasmlib/strlist.c
index 6dfaa46e..1b6fb726 100644
--- a/nasmlib/strlist.c
+++ b/nasmlib/strlist.c
@@ -49,31 +49,35 @@ struct strlist *strlist_alloc(void)
/*
* Append a string to a string list if and only if it isn't
- * already there. Return true if it was added.
+ * already there. If it was added, return the entry pointer.
*/
-bool strlist_add(struct strlist *list, const char *str)
+const struct strlist_entry *strlist_add(struct strlist *list, const char *str)
{
struct strlist_entry *e;
struct hash_insert hi;
size_t size;
if (!list)
- return false;
+ return NULL;
size = strlen(str) + 1;
if (hash_findb(&list->hash, str, size, &hi))
- return false;
+ return NULL;
/* Structure already has char[1] as EOS */
- e = nasm_zalloc(sizeof(*e) - 1 + size);
+ e = nasm_malloc(sizeof(*e) - 1 + size);
e->size = size;
+ e->offset = list->size;
+ e->next = NULL;
memcpy(e->str, str, size);
*list->tailp = e;
list->tailp = &e->next;
+ list->nstr++;
+ list->size += size;
hash_add(&hi, e->str, (void *)e);
- return true;
+ return e;
}
/*
@@ -86,3 +90,35 @@ void strlist_free(struct strlist *list)
nasm_free(list);
}
}
+
+/*
+ * Search the string list for an entry. If found, return the entry pointer.
+ * (This is basically the opposite of strlist_add_string()!)
+ */
+const struct strlist_entry *
+strlist_find(const struct strlist *list, const char *str)
+{
+ void **hf;
+ hf = hash_find((struct hash_table *)&list->hash, str, NULL);
+ return hf ? *hf : NULL;
+}
+
+/*
+ * Produce a linearized buffer containing the whole list, in order;
+ * The character "sep" is the separator between strings; this is
+ * typically either 0 or '\n'. strlist_size() will give the size of
+ * the returned buffer.
+ */
+void *strlist_linearize(const struct strlist *list, char sep)
+{
+ const struct strlist_entry *sl;
+ char *buf = nasm_malloc(list->size);
+ char *p = buf;
+
+ strlist_for_each(sl, list) {
+ p = mempcpy(p, sl->str, sl->size);
+ p[-1] = sep;
+ }
+
+ return buf;
+}