FreeCalypso > hg > freecalypso-tools
diff rvinterf/ctracedec/readtab.c @ 0:e7502631a0f9
initial import from freecalypso-sw rev 1033:5ab737ac3ad7
author | Mychaela Falconia <falcon@freecalypso.org> |
---|---|
date | Sat, 11 Jun 2016 00:13:35 +0000 |
parents | |
children |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/rvinterf/ctracedec/readtab.c Sat Jun 11 00:13:35 2016 +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); +}