1254219Scy#include "ipf.h"
2317314Scy#include <err.h>
3254219Scy
4254219Scyextern int nohdrfields;
5254219Scy
6254219Scywordtab_t *parsefields(table, arg)
7254219Scy	wordtab_t *table;
8254219Scy	char *arg;
9254219Scy{
10254219Scy	wordtab_t *f, *fields;
11254219Scy	char *s, *t;
12254219Scy	int num;
13254219Scy
14254219Scy	fields = NULL;
15254219Scy	num = 0;
16254219Scy
17254219Scy	for (s = strtok(arg, ","); s != NULL; s = strtok(NULL, ",")) {
18254219Scy		t = strchr(s, '=');
19254219Scy		if (t != NULL) {
20254219Scy			*t++ = '\0';
21254219Scy			if (*t == '\0')
22254219Scy				nohdrfields = 1;
23254219Scy		}
24254219Scy
25254219Scy		f = findword(table, s);
26254219Scy		if (f == NULL) {
27254219Scy			fprintf(stderr, "Unknown field '%s'\n", s);
28254219Scy			exit(1);
29254219Scy		}
30254219Scy
31254219Scy		num++;
32254219Scy		if (fields == NULL) {
33254219Scy			fields = malloc(2 * sizeof(*fields));
34254219Scy		} else {
35319175Scy			fields = reallocarray(fields, num + 1, sizeof(*fields));
36317314Scy			if (fields == NULL) {
37317314Scy				warnx("memory allocation error at %d in %s in %s", __LINE__, __FUNCTION__, __FILE__);
38317314Scy				abort();
39317314Scy			}
40254219Scy		}
41254219Scy
42254219Scy		if (t == NULL) {
43254219Scy			fields[num - 1].w_word = f->w_word;
44254219Scy		} else {
45254219Scy			fields[num - 1].w_word = t;
46254219Scy		}
47254219Scy		fields[num - 1].w_value = f->w_value;
48254219Scy		fields[num].w_word = NULL;
49254219Scy		fields[num].w_value = 0;
50254219Scy	}
51254219Scy
52254219Scy	return fields;
53254219Scy}
54