diff rvinterf/ctracedec/readtab.c @ 858:4c6e7ada647b

compressed trace decoder almost fully implemented
author Space Falcon <falcon@ivan.Harhan.ORG>
date Sat, 02 May 2015 08:08:26 +0000
parents
children
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/rvinterf/ctracedec/readtab.c	Sat May 02 08:08:26 2015 +0000
@@ -0,0 +1,145 @@
+/*
+ * This module handles the reading and parsing of str2ind.tab
+ */
+
+#include <stdio.h>
+#include <ctype.h>
+#include <string.h>
+#include <strings.h>
+#include <stdlib.h>
+
+extern char *str2ind_tab_filename;
+
+int str2ind_array_size;
+char **str2ind_orig_strings;
+char **str2ind_param_strings;
+
+static FILE *readF;
+static char linebuf[256];
+static int lineno;
+
+static void
+read_line()
+{
+	char *cp;
+
+	if (!fgets(linebuf, sizeof linebuf, readF)) {
+		fprintf(stderr, "error: premature EOF reading from %s\n",
+			str2ind_tab_filename);
+		exit(1);
+	}
+	lineno++;
+	cp = index(linebuf, '\n');
+	if (!cp) {
+		fprintf(stderr,
+			"error: %s line %d is too long or unterminated\n",
+			str2ind_tab_filename, lineno);
+		exit(1);
+	}
+	*cp = '\0';
+	if (cp > linebuf && cp[-1] == '\r')
+		cp[-1] = '\0';
+}
+
+static void
+line_pure_num()
+{
+	char *cp;
+
+	for (cp = linebuf; isspace(*cp); cp++)
+		;
+	if (!isdigit(*cp)) {
+inv:		fprintf(stderr, "%s line %d: pure number expected\n",
+			str2ind_tab_filename, lineno);
+		exit(1);
+	}
+	while (isdigit(*cp))
+		cp++;
+	if (*cp)
+		goto inv;
+}
+
+static char *
+copystr(str)
+	char *str;
+{
+	static char null = '\0';
+	char *buf;
+
+	if (str[0]) {
+		buf = malloc(strlen(str) + 1);
+		if (!buf) {
+			perror("malloc");
+			exit(1);
+		}
+		strcpy(buf, str);
+		return(buf);
+	} else
+		return(&null);
+}
+
+static void
+process_record_line(idx)
+{
+	char *cp, *cp2;
+	int i;
+
+	for (cp = linebuf; isspace(*cp); cp++)
+		;
+	if (!isdigit(*cp)) {
+syntaxerr:	fprintf(stderr, "%s line %d: unexpected syntax\n",
+			str2ind_tab_filename, lineno);
+		exit(1);
+	}
+	while (isdigit(*cp))
+		cp++;
+	if (*cp++ != ',')
+		goto syntaxerr;
+	i = atoi(linebuf);
+	if (i != idx) {
+		fprintf(stderr, "%s line %d lists wrong index (expected %d)\n",
+			str2ind_tab_filename, lineno, idx);
+		exit(1);
+	}
+	cp2 = index(cp, ',');
+	if (!cp2)
+		goto syntaxerr;
+	*cp2++ = '\0';
+	str2ind_param_strings[idx] = copystr(cp);
+	str2ind_orig_strings[idx] = copystr(cp2);
+}
+
+read_str2ind_tab()
+{
+	int idx;
+
+	readF = fopen(str2ind_tab_filename, "r");
+	if (!readF) {
+		perror(str2ind_tab_filename);
+		exit(1);
+	}
+	/* skip the timestamp line: the user is responsible for matching */
+	read_line();
+	line_pure_num();
+	/* read the line with the array size */
+	read_line();
+	line_pure_num();
+	str2ind_array_size = atoi(linebuf);
+	if (str2ind_array_size < 1) {
+		fprintf(stderr, "error: %s gives index array size < 1\n",
+			str2ind_tab_filename);
+		exit(1);
+	}
+	str2ind_orig_strings = malloc(sizeof(char *) * str2ind_array_size);
+	str2ind_param_strings = malloc(sizeof(char *) * str2ind_array_size);
+	if (!str2ind_orig_strings || !str2ind_param_strings) {
+		perror("malloc");
+		exit(1);
+	}
+	for (idx = 0; idx < str2ind_array_size; idx++) {
+		read_line();
+		process_record_line(idx);
+	}
+	fclose(readF);
+	return(0);
+}