source@mandoc.bsd.lv
 help / color / mirror / Atom feed
* mdocml: Make apropos results-gathering able to error out and clean up
@ 2011-10-09 10:46 kristaps
  0 siblings, 0 replies; only message in thread
From: kristaps @ 2011-10-09 10:46 UTC (permalink / raw)
  To: source

Log Message:
-----------
Make apropos results-gathering able to error out and clean up before
making the utility exit non-zero.

Modified Files:
--------------
    mdocml:
        apropos.c

Revision Data
-------------
Index: apropos.c
===================================================================
RCS file: /usr/vhosts/mdocml.bsd.lv/cvs/mdocml/apropos.c,v
retrieving revision 1.6
retrieving revision 1.7
diff -Lapropos.c -Lapropos.c -u -p -r1.6 -r1.7
--- apropos.c
+++ apropos.c
@@ -152,7 +152,7 @@ static	int	 sort_title(const void *, con
 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 stru
 	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 stru
 
 		if (0 != regcomp(&reg, q, ch)) {
 			fprintf(stderr, "%s: Bad pattern\n", q);
-			return;
+			return(0);
 		}
 
 		regp = ®
@@ -358,8 +358,8 @@ state_search(struct state *p, const stru
 		 */
 
 		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 stru
 		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 stru
 		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);
 }
 
 /*
--
 To unsubscribe send an email to source+unsubscribe@mdocml.bsd.lv

^ permalink raw reply	[flat|nested] only message in thread

only message in thread, other threads:[~2011-10-09 10:46 UTC | newest]

Thread overview: (only message) (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2011-10-09 10:46 mdocml: Make apropos results-gathering able to error out and clean up kristaps

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).