(xundump): Add the ability to support the parsing of the human

readable form.

(xucolumnheader): New function.
This commit is contained in:
Ron Koenderink 2006-01-01 03:44:41 +00:00
parent 15e40c55cd
commit 4871a10a9b

View file

@ -53,6 +53,7 @@
static char *fname = ""; static char *fname = "";
static int lineno = 0; static int lineno = 0;
static int human;
/* /*
* TODO * TODO
@ -488,13 +489,16 @@ xuheader(FILE *fp, int expected_table, struct value values[])
return -1; return -1;
ungetc(ch, fp); ungetc(ch, fp);
human = ch == 'c';
res = -1; res = -1;
if (fscanf(fp, "XDUMP%*[ \t]%63[^ \t#\n]%*[ \t]%*[^ \t#\n]%n", if ((human
name, &res) != 1 ? fscanf(fp, "config%*[ \t]%63[^ \t#\n]%n", name, &res) != 1
|| res < 0) : fscanf(fp, "XDUMP%*[ \t]%63[^ \t#\n]%*[ \t]%*[^ \t#\n]%n",
return gripe("Expected XDUMP header"); name, &res) != 1) || res < 0)
return gripe("Expected xdump header");
if (skipfs(fp) != '\n') if (skipfs(fp) != '\n')
return gripe("Junk after XDUMP header"); return gripe("Junk after xdump header");
type = ef_byname(name); type = ef_byname(name);
if (type < 0) if (type < 0)
@ -509,14 +513,40 @@ xuheader(FILE *fp, int expected_table, struct value values[])
return type; return type;
} }
static int
xucolumnheader(FILE *fp, int type)
{
char ch;
if (!human)
return 0;
while ((ch = skipfs(fp)) == '\n');
ungetc(ch, fp);
/* FIXME parse column header */
if (fscanf(fp, "%*[^\n]\n") == -1)
return gripe("Invalid Column Header for table %s",
ef_nameof(type));
lineno++;
return 0;
}
static int static int
xutrailer(FILE *fp, int type, int row) xutrailer(FILE *fp, int type, int row)
{ {
int rows, ch; int rows, ch, res;
res = -1;
if (human) {
if (fscanf(fp, "config%n", &res) != 0) {
return gripe("Malformed table footer");
}
}
ch = skipfs(fp); ch = skipfs(fp);
if (!isdigit(ch)) { if (!isdigit(ch)) {
if (ch != '\n') if (ch != '\n' || !human)
return gripe("Malformed table footer"); return gripe("Malformed table footer");
} else { } else {
ungetc(ch, fp); ungetc(ch, fp);
@ -558,6 +588,9 @@ xundump(FILE *fp, char *file, int expected_table)
fixed_rows = has_const(ef_cadef(type)); fixed_rows = has_const(ef_cadef(type));
need_sentinel = !fixed_rows; /* FIXME only approximation */ need_sentinel = !fixed_rows; /* FIXME only approximation */
if (xucolumnheader(fp, type) == -1)
return -1;
row = 0; row = 0;
for (;;) { for (;;) {
lineno++; lineno++;