diff options
author | Kristaps Dzonsons <kristaps@bsd.lv> | 2011-10-09 10:46:38 +0000 |
---|---|---|
committer | Kristaps Dzonsons <kristaps@bsd.lv> | 2011-10-09 10:46:38 +0000 |
commit | 05e2b080363506087b0a56987108ad2093b351c0 (patch) | |
tree | bc1df5fc9e1a1af4c9e90bde42b48b749c39efd0 | |
parent | c8ae2f01aa1ea45e9d1862c0167e8e79d555f5cf (diff) | |
download | mandoc-05e2b080363506087b0a56987108ad2093b351c0.tar.gz |
Make apropos results-gathering able to error out and clean up before
making the utility exit non-zero.
-rw-r--r-- | apropos.c | 30 |
1 files changed, 16 insertions, 14 deletions
@@ -152,7 +152,7 @@ static int sort_title(const void *, const void *); static int state_getrecord(struct state *, recno_t, struct rec *); static void state_output(const struct res *, int); -static void state_search(struct state *, +static int state_search(struct state *, const struct opts *, char *); static void usage(void); @@ -275,9 +275,8 @@ main(int argc, char *argv[]) /* Main search function. */ - state_search(&state, &opts, q); - - rc = EXIT_SUCCESS; + rc = state_search(&state, &opts, q) ? + EXIT_SUCCESS : EXIT_FAILURE; out: if (state.db) (*state.db->close)(state.db); @@ -287,10 +286,10 @@ out: return(rc); } -static void +static int state_search(struct state *p, const struct opts *opts, char *q) { - int leaf, root, len, ch, dflag; + int leaf, root, len, ch, dflag, rc; struct mchars *mc; char *buf; size_t bufsz; @@ -303,6 +302,7 @@ state_search(struct state *p, const struct opts *opts, char *q) char filebuf[10]; struct rec record; + rc = 0; root = leaf = -1; res = NULL; len = 0; @@ -322,7 +322,7 @@ state_search(struct state *p, const struct opts *opts, char *q) if (0 != regcomp(®, q, ch)) { fprintf(stderr, "%s: Bad pattern\n", q); - return; + return(0); } regp = ® @@ -358,8 +358,8 @@ state_search(struct state *p, const struct opts *opts, char *q) */ if (key.size < 2 || 8 != val.size) { - fprintf(stderr, "%s: Corrupt database\n", p->dbf); - exit(EXIT_FAILURE); + fprintf(stderr, "%s: Bad database\n", p->dbf); + goto out; } buf_redup(mc, &buf, &bufsz, (char *)key.data); @@ -396,7 +396,7 @@ state_search(struct state *p, const struct opts *opts, char *q) memcpy(&rec, val.data + 4, sizeof(recno_t)); if ( ! state_getrecord(p, rec, &record)) - exit(EXIT_FAILURE); + goto out; /* If we're in a different section, skip... */ @@ -456,12 +456,11 @@ state_search(struct state *p, const struct opts *opts, char *q) len++; } -send: if (ch < 0) { perror(p->dbf); - exit(EXIT_FAILURE); + goto out; } - +send: /* Sort our results. */ if (SORT_CAT == opts->sort) @@ -470,7 +469,8 @@ send: qsort(res, len, sizeof(struct res), sort_title); state_output(res, len); - + rc = 1; +out: for (len-- ; len >= 0; len--) { free(res[len].keyword); free(res[len].title); @@ -486,6 +486,8 @@ send: if (regp) regfree(regp); + + return(rc); } /* |