diff fir/rdcommon.c @ 376:9b3e5be96bab

fir2freq: a tool for analyzing captured FIR coefficient sets
author Mychaela Falconia <falcon@freecalypso.org>
date Mon, 02 Aug 2021 04:59:46 +0000
parents
children
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/fir/rdcommon.c	Mon Aug 02 04:59:46 2021 +0000
@@ -0,0 +1,62 @@
+/*
+ * This C file is not a compilation unit in itself, but is the common piece
+ * (a set of static variables and functions) included in the librftab modules
+ * responsible for reading different kinds of ASCII tables.
+ */
+
+#define	MAX_FIELDS_PER_LINE	64
+
+static char *filename;
+static FILE *rdfile;
+static unsigned lineno;
+static char linebuf[256], *line_fields[MAX_FIELDS_PER_LINE];
+static unsigned line_nfields, line_field_ptr;
+
+static int
+read_line()
+{
+	char *cp;
+
+	if (!fgets(linebuf, sizeof linebuf, rdfile))
+		return(0);
+	lineno++;
+	cp = linebuf;
+	for (line_nfields = 0; ; ) {
+		while (isspace(*cp))
+			cp++;
+		if (*cp == '\0' || *cp == '#')
+			break;
+		if (line_nfields >= MAX_FIELDS_PER_LINE) {
+			fprintf(stderr,
+				"%s line %d: too many fields on one line\n",
+				filename, lineno);
+			return(-1);
+		}
+		line_fields[line_nfields++] = cp;
+		while (*cp && !isspace(*cp))
+			cp++;
+		if (*cp)
+			*cp++ = '\0';
+	}
+	return(1);
+}
+
+static
+get_field(retp)
+	char **retp;
+{
+	int rc;
+
+	if (line_field_ptr < line_nfields) {
+		*retp = line_fields[line_field_ptr++];
+		return(1);
+	}
+	do {
+		rc = read_line();
+		if (rc <= 0)
+			return(rc);
+	} while (!line_nfields);
+	*retp = line_fields[0];
+	line_field_ptr = 1;
+	return(1);
+}