diff options
author | H. Peter Anvin (Intel) <hpa@zytor.com> | 2018-12-11 13:06:14 -0800 |
---|---|---|
committer | H. Peter Anvin (Intel) <hpa@zytor.com> | 2018-12-11 13:37:32 -0800 |
commit | 64471097ca7598e8238f9e5ed25b3afaa9b10f2c (patch) | |
tree | d31d4d84403d36500b30a372d03596ae9459c2d4 /nasmlib | |
parent | ebb05a0e5fa8dfae58e6a00e550005df4b0f58f8 (diff) | |
download | nasm-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.c | 48 |
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; +} |