summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorLennart Poettering <lennart@poettering.net>2008-07-19 21:20:07 +0200
committerLennart Poettering <lennart@poettering.net>2008-07-19 21:20:07 +0200
commit329654aa3bc0134a01e1f509ffb336b4fed287dc (patch)
treef1f1de995b2c32bd925169e3296755d0426ac0ba
parent1b28e03da2224a2fbba677bcb732030e59be3ad7 (diff)
make strpool error output a bit more useful
-rw-r--r--strpool.c29
1 files changed, 19 insertions, 10 deletions
diff --git a/strpool.c b/strpool.c
index 5bf468d..63d5e2a 100644
--- a/strpool.c
+++ b/strpool.c
@@ -266,7 +266,7 @@ static int parse_oct(const char *t, char *r) {
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 {
@@ -282,8 +282,13 @@ static int parse(FILE *in, struct item **rfirst, char **remain, size_t *remain_s
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;
@@ -297,6 +302,8 @@ static int parse(FILE *in, struct item **rfirst, char **remain, size_t *remain_s
goto fail;
}
+ nline++;
+
c = t;
do {
@@ -343,6 +350,7 @@ static int parse(FILE *in, struct item **rfirst, char **remain, size_t *remain_s
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;
@@ -361,6 +369,7 @@ static int parse(FILE *in, struct item **rfirst, char **remain, size_t *remain_s
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;
@@ -450,7 +459,7 @@ static int parse(FILE *in, struct item **rfirst, char **remain, size_t *remain_s
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;
@@ -466,14 +475,14 @@ static int parse(FILE *in, struct item **rfirst, char **remain, size_t *remain_s
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;
}
@@ -484,7 +493,7 @@ static int parse(FILE *in, struct item **rfirst, char **remain, size_t *remain_s
} 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);
@@ -495,12 +504,12 @@ static int parse(FILE *in, struct item **rfirst, char **remain, size_t *remain_s
}
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;
}
@@ -522,13 +531,13 @@ 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)
@@ -579,7 +588,7 @@ int main(int argc, char *argv[]) {
} else
out = stdout;
- if (process(in, out) < 0)
+ if (process(in, out, argc > 1 ? argv[1] : NULL) < 0)
goto finish;
ret = 0;