t/helper/test-hashmap.c: avoid using strtok()

Avoid using the non-reentrant `strtok()` to separate the parts of each
incoming command. Instead of replacing it with `strtok_r()`, let's
instead use the more friendly pair of `string_list_split_in_place()` and
`string_list_remove_empty_items()`.

Signed-off-by: Taylor Blau <me@ttaylorr.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
This commit is contained in:
Taylor Blau 2023-04-24 18:20:17 -04:00 committed by Junio C Hamano
parent 492ba81346
commit 826f0e33ab

View File

@ -2,6 +2,7 @@
#include "git-compat-util.h" #include "git-compat-util.h"
#include "hashmap.h" #include "hashmap.h"
#include "strbuf.h" #include "strbuf.h"
#include "string-list.h"
struct test_entry struct test_entry
{ {
@ -150,6 +151,7 @@ static void perf_hashmap(unsigned int method, unsigned int rounds)
*/ */
int cmd__hashmap(int argc, const char **argv) int cmd__hashmap(int argc, const char **argv)
{ {
struct string_list parts = STRING_LIST_INIT_NODUP;
struct strbuf line = STRBUF_INIT; struct strbuf line = STRBUF_INIT;
int icase; int icase;
struct hashmap map = HASHMAP_INIT(test_entry_cmp, &icase); struct hashmap map = HASHMAP_INIT(test_entry_cmp, &icase);
@ -159,21 +161,26 @@ int cmd__hashmap(int argc, const char **argv)
/* process commands from stdin */ /* process commands from stdin */
while (strbuf_getline(&line, stdin) != EOF) { while (strbuf_getline(&line, stdin) != EOF) {
char *cmd, *p1 = NULL, *p2 = NULL; char *cmd, *p1, *p2;
unsigned int hash = 0; unsigned int hash = 0;
struct test_entry *entry; struct test_entry *entry;
/* break line into command and up to two parameters */ /* break line into command and up to two parameters */
cmd = strtok(line.buf, DELIM); string_list_setlen(&parts, 0);
string_list_split_in_place(&parts, line.buf, DELIM, 2);
string_list_remove_empty_items(&parts, 0);
/* ignore empty lines */ /* ignore empty lines */
if (!cmd || *cmd == '#') if (!parts.nr)
continue;
if (!*parts.items[0].string || *parts.items[0].string == '#')
continue; continue;
p1 = strtok(NULL, DELIM); cmd = parts.items[0].string;
if (p1) { p1 = parts.nr >= 1 ? parts.items[1].string : NULL;
p2 = parts.nr >= 2 ? parts.items[2].string : NULL;
if (p1)
hash = icase ? strihash(p1) : strhash(p1); hash = icase ? strihash(p1) : strhash(p1);
p2 = strtok(NULL, DELIM);
}
if (!strcmp("add", cmd) && p1 && p2) { if (!strcmp("add", cmd) && p1 && p2) {
@ -260,6 +267,7 @@ int cmd__hashmap(int argc, const char **argv)
} }
} }
string_list_clear(&parts, 0);
strbuf_release(&line); strbuf_release(&line);
hashmap_clear_and_free(&map, struct test_entry, ent); hashmap_clear_and_free(&map, struct test_entry, ent);
return 0; return 0;