root/sbin/ipf/libipf/parsefields.c
#include "ipf.h"
#include <err.h>

extern int nohdrfields;

wordtab_t *parsefields(wordtab_t *table, char *arg)
{
        wordtab_t *f, *fields;
        char *s, *t;
        int num;

        fields = NULL;
        num = 0;

        for (s = strtok(arg, ","); s != NULL; s = strtok(NULL, ",")) {
                t = strchr(s, '=');
                if (t != NULL) {
                        *t++ = '\0';
                        if (*t == '\0')
                                nohdrfields = 1;
                }

                f = findword(table, s);
                if (f == NULL) {
                        fprintf(stderr, "Unknown field '%s'\n", s);
                        exit(1);
                }

                num++;
                if (fields == NULL) {
                        fields = malloc(2 * sizeof(*fields));
                } else {
                        fields = reallocarray(fields, num + 1, sizeof(*fields));
                        if (fields == NULL) {
                                warnx("memory allocation error at %d in %s in %s", __LINE__, __FUNCTION__, __FILE__);
                                abort();
                        }
                }

                if (t == NULL) {
                        fields[num - 1].w_word = f->w_word;
                } else {
                        fields[num - 1].w_word = t;
                }
                fields[num - 1].w_value = f->w_value;
                fields[num].w_word = NULL;
                fields[num].w_value = 0;
        }

        return (fields);
}