xref: /src/sbin/ipf/libipf/parsefields.c (revision 44bc30192139b0b3c95510ab3b35802bcc6d63e4)
105ddbb8dSCy Schubert #include "ipf.h"
2c6fd01fbSCy Schubert #include <err.h>
305ddbb8dSCy Schubert 
405ddbb8dSCy Schubert extern int nohdrfields;
505ddbb8dSCy Schubert 
parsefields(wordtab_t * table,char * arg)6efeb8bffSCy Schubert wordtab_t *parsefields(wordtab_t *table, char *arg)
705ddbb8dSCy Schubert {
805ddbb8dSCy Schubert 	wordtab_t *f, *fields;
905ddbb8dSCy Schubert 	char *s, *t;
1005ddbb8dSCy Schubert 	int num;
1105ddbb8dSCy Schubert 
1205ddbb8dSCy Schubert 	fields = NULL;
1305ddbb8dSCy Schubert 	num = 0;
1405ddbb8dSCy Schubert 
1505ddbb8dSCy Schubert 	for (s = strtok(arg, ","); s != NULL; s = strtok(NULL, ",")) {
1605ddbb8dSCy Schubert 		t = strchr(s, '=');
1705ddbb8dSCy Schubert 		if (t != NULL) {
1805ddbb8dSCy Schubert 			*t++ = '\0';
1905ddbb8dSCy Schubert 			if (*t == '\0')
2005ddbb8dSCy Schubert 				nohdrfields = 1;
2105ddbb8dSCy Schubert 		}
2205ddbb8dSCy Schubert 
2305ddbb8dSCy Schubert 		f = findword(table, s);
2405ddbb8dSCy Schubert 		if (f == NULL) {
2505ddbb8dSCy Schubert 			fprintf(stderr, "Unknown field '%s'\n", s);
2605ddbb8dSCy Schubert 			exit(1);
2705ddbb8dSCy Schubert 		}
2805ddbb8dSCy Schubert 
2905ddbb8dSCy Schubert 		num++;
3005ddbb8dSCy Schubert 		if (fields == NULL) {
3105ddbb8dSCy Schubert 			fields = malloc(2 * sizeof(*fields));
3205ddbb8dSCy Schubert 		} else {
333820c3aaSCy Schubert 			fields = reallocarray(fields, num + 1, sizeof(*fields));
34a07d9e9aSCy Schubert 			if (fields == NULL) {
35c6fd01fbSCy Schubert 				warnx("memory allocation error at %d in %s in %s", __LINE__, __FUNCTION__, __FILE__);
36a07d9e9aSCy Schubert 				abort();
37a07d9e9aSCy Schubert 			}
3805ddbb8dSCy Schubert 		}
3905ddbb8dSCy Schubert 
4005ddbb8dSCy Schubert 		if (t == NULL) {
4105ddbb8dSCy Schubert 			fields[num - 1].w_word = f->w_word;
4205ddbb8dSCy Schubert 		} else {
4305ddbb8dSCy Schubert 			fields[num - 1].w_word = t;
4405ddbb8dSCy Schubert 		}
4505ddbb8dSCy Schubert 		fields[num - 1].w_value = f->w_value;
4605ddbb8dSCy Schubert 		fields[num].w_word = NULL;
4705ddbb8dSCy Schubert 		fields[num].w_value = 0;
4805ddbb8dSCy Schubert 	}
4905ddbb8dSCy Schubert 
50*2582ae57SCy Schubert 	return (fields);
5105ddbb8dSCy Schubert }
52