return k;
}
-static int parse(FILE *in, struct item **rfirst, char **remain, size_t *remain_size) {
+static int parse(FILE *in, const char *fname, struct item **rfirst, char **remain, size_t *remain_size) {
int enabled = 0;
enum {
char *cnt = NULL;
size_t cntl = 0;
struct item *first = NULL, *last = NULL;
+ unsigned nline = 0;
+ unsigned pool_started_line = 0;
*rfirst = NULL;
+ if (!fname)
+ fname = "<stdin>";
+
for (;;) {
char t[1024], *c;
int done = 0;
goto fail;
}
+ nline++;
+
c = t;
do {
r = append(r, &rl, &c, 2);
} else if (!strncmp(c, "%STRINGPOOLSTART%", 17)) {
enabled = 1;
+ pool_started_line = nline;
r = append(r, &rl, &c, 17);
} else if (!strncmp(c, "%STRINGPOOLSTOP%", 16)) {
enabled = 0;
r = append(r, &rl, &c, 1);
} else if (!strncmp(c, "%STRINGPOOLSTART%", 17)) {
enabled = 1;
+ pool_started_line = nline;
r = append(r, &rl, &c, 17);
} else if (!strncmp(c, "%STRINGPOOLSTOP%", 16)) {
enabled = 0;
case 'x': {
int k;
if ((k = parse_hex(c+2, &d)) < 0) {
- fprintf(stderr, "Parse failure: invalid hexadecimal escape sequence.\n");
+ fprintf(stderr, "%s:%u: Parse failure: invalid hexadecimal escape sequence.\n", fname, nline);
goto fail;
}
l = 2 + k;
case '7': {
int k;
if ((k = parse_oct(c+1, &d)) < 0) {
- fprintf(stderr, "Parse failure: invalid octal escape sequence.\n");
+ fprintf(stderr, "%s:%u: Parse failure: invalid octal escape sequence.\n", fname, nline);
goto fail;
}
l = 1 + k;
break;
}
default:
- fprintf(stderr, "Parse failure: invalid escape sequence.\n");
+ fprintf(stderr, "%s:%u: Parse failure: invalid escape sequence.\n", fname, nline);
goto fail;
}
} else
r = append(r, &rl, &c, l);
} else if (*c == 0) {
- fprintf(stderr, "Parse failure: multiline strings suck.\n");
+ fprintf(stderr, "%s:%u: Parse failure: multiline strings suck.\n", fname, nline);
goto fail;
} else
r = append(r, &rl, &c, 1);
}
if (enabled) {
- fprintf(stderr, "Parse failure: missing %%STRINGPOOLSTOP%%\n");
+ fprintf(stderr, "%s:%u: Parse failure: missing %%STRINGPOOLSTOP%%\n", fname, pool_started_line);
goto fail;
}
if (state != STATE_TEXT) {
- fprintf(stderr, "Parse failure: unexpected EOF.\n");
+ fprintf(stderr, "%s:%u: Parse failure: unexpected EOF.\n", fname, nline);
goto fail;
}
return -1;
}
-static int process(FILE *in, FILE *out) {
+static int process(FILE *in, FILE *out, const char*ifname) {
struct item *first = NULL;
char *remain = NULL;
size_t remain_size = 0;
- if (parse(in, &first, &remain, &remain_size) < 0)
+ if (parse(in, ifname, &first, &remain, &remain_size) < 0)
return -1;
if (!first)
} else
out = stdout;
- if (process(in, out) < 0)
+ if (process(in, out, argc > 1 ? argv[1] : NULL) < 0)
goto finish;
ret = 0;