Module Name:    src
Committed By:   rillig
Date:           Sun Apr 18 21:12:51 UTC 2021

Modified Files:
        src/usr.bin/xlint/lint2: read.c

Log Message:
lint: reduce duplicate code for parsing .ln files


To generate a diff of this commit:
cvs rdiff -u -r1.43 -r1.44 src/usr.bin/xlint/lint2/read.c

Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.

Modified files:

Index: src/usr.bin/xlint/lint2/read.c
diff -u src/usr.bin/xlint/lint2/read.c:1.43 src/usr.bin/xlint/lint2/read.c:1.44
--- src/usr.bin/xlint/lint2/read.c:1.43	Sun Apr 18 20:40:51 2021
+++ src/usr.bin/xlint/lint2/read.c	Sun Apr 18 21:12:50 2021
@@ -1,4 +1,4 @@
-/* $NetBSD: read.c,v 1.43 2021/04/18 20:40:51 rillig Exp $ */
+/* $NetBSD: read.c,v 1.44 2021/04/18 21:12:50 rillig Exp $ */
 
 /*
  * Copyright (c) 1996 Christopher G. Demetriou.  All Rights Reserved.
@@ -38,7 +38,7 @@
 
 #include <sys/cdefs.h>
 #if defined(__RCSID) && !defined(lint)
-__RCSID("$NetBSD: read.c,v 1.43 2021/04/18 20:40:51 rillig Exp $");
+__RCSID("$NetBSD: read.c,v 1.44 2021/04/18 21:12:50 rillig Exp $");
 #endif
 
 #include <ctype.h>
@@ -108,13 +108,45 @@ static	char	*inpqstrg(const char *, cons
 static	const	char *inpname(const char *, const char **);
 static	int	getfnidx(const char *);
 
+static bool
+try_parse_int(const char **p, int *num)
+{
+	char *end;
+
+	*num = (int)strtol(*p, &end, 10);
+	if (end == *p)
+		return false;
+	*p = end;
+	return true;
+}
+
+static int
+parse_int(const char **p)
+{
+	char *end;
+	int n;
+
+	n = (int)strtol(*p, &end, 10);
+	if (end == *p)
+		inperr("not a number: %s", *p);
+	*p = end;
+	return n;
+}
+
+static short
+parse_short(const char **p)
+{
+
+	return (short)parse_int(p);
+}
+
 void
 readfile(const char *name)
 {
 	FILE	*inp;
 	size_t	len;
 	const	char *cp;
-	char	*line, *eptr, rt = '\0';
+	char	*line, rt = '\0';
 	int	cline, isrc, iline;
 	pos_t	pos;
 
@@ -145,12 +177,8 @@ readfile(const char *name)
 		cp = line;
 
 		/* line number in csrcfile */
-		cline = (int)strtol(cp, &eptr, 10);
-		if (cp == eptr) {
-		        cline = -1;
-		} else {
-			cp = eptr;
-		}
+		if (!try_parse_int(&cp, &cline))
+			cline = -1;
 
 		/* record type */
 		if (*cp == '\0')
@@ -170,19 +198,13 @@ readfile(const char *name)
 		 * different from csrcfile, it refers to an included
 		 * file.
 		 */
-		isrc = (int)strtol(cp, &eptr, 10);
-		if (cp == eptr)
-			inperr("not a number: %s", cp);
-		cp = eptr;
+		isrc = parse_int(&cp);
 		isrc = inpfns[isrc];
 
 		/* line number in isrc */
 		if (*cp++ != '.')
 			inperr("bad line number");
-		iline = (int)strtol(cp, &eptr, 10);
-		if (cp == eptr)
-			inperr("not a number: %s", cp);
-		cp = eptr;
+		iline = parse_int(&cp);
 
 		pos.p_src = (u_short)csrcfile;
 		pos.p_line = (u_short)cline;
@@ -274,7 +296,7 @@ static void
 funccall(pos_t *posp, const char *cp)
 {
 	arginf_t *ai, **lai;
-	char	c, *eptr;
+	char	c;
 	bool	rused, rdisc;
 	hte_t	*hte;
 	fcall_t	*fcall;
@@ -309,10 +331,7 @@ funccall(pos_t *posp, const char *cp)
 		case 'n':
 		case 's':
 			ai = xalloc(sizeof(*ai));
-			ai->a_num = (int)strtol(cp, &eptr, 10);
-			if (cp == eptr)
-				inperr("bad number: %s", cp);
-			cp = eptr;
+			ai->a_num = parse_int(&cp);
 			if (c == 'z') {
 				ai->a_pcon = ai->a_zero = true;
 			} else if (c == 'p') {
@@ -358,7 +377,7 @@ static void
 decldef(pos_t *posp, const char *cp)
 {
 	sym_t	*symp, sym;
-	char	c, *ep, *pos1, *tname;
+	char	c, *pos1, *tname;
 	bool	used, renamed;
 	hte_t	*hte, *renamehte = NULL;
 	const char *name, *newname;
@@ -416,28 +435,19 @@ decldef(pos_t *posp, const char *cp)
 			if (sym.s_va)
 				inperr("va");
 			sym.s_va = true;
-			sym.s_nva = (short)strtol(cp, &ep, 10);
-			if (cp == ep)
-				inperr("bad number: %s", cp);
-			cp = ep;
+			sym.s_nva = parse_short(&cp);
 			break;
 		case 'P':
 			if (sym.s_prfl)
 				inperr("prfl");
 			sym.s_prfl = true;
-			sym.s_nprfl = (short)strtol(cp, &ep, 10);
-			if (cp == ep)
-				inperr("bad number: %s", cp);
-			cp = ep;
+			sym.s_nprfl = parse_short(&cp);
 			break;
 		case 'S':
 			if (sym.s_scfl)
 				inperr("scfl");
 			sym.s_scfl = true;
-			sym.s_nscfl = (short)strtol(cp, &ep, 10);
-			if (cp == ep)
-				inperr("bad number: %s", cp);
-			cp = ep;
+			sym.s_nscfl = parse_short(&cp);
 			break;
 		}
 	}
@@ -552,7 +562,7 @@ usedsym(pos_t *posp, const char *cp)
 static u_short
 inptype(const char *cp, const char **epp)
 {
-	char	c, s, *eptr;
+	char	c, s;
 	const	char *ep;
 	type_t	*tp;
 	int	narg, i;
@@ -645,8 +655,7 @@ inptype(const char *cp, const char **epp
 
 	switch (tp->t_tspec) {
 	case ARRAY:
-		tp->t_dim = (int)strtol(cp, &eptr, 10);
-		cp = eptr;
+		tp->t_dim = parse_int(&cp);
 		sidx = inptype(cp, &cp); /* force seq. point! (ditto below) */
 		tp->t_subt = TP(sidx);
 		break;
@@ -659,8 +668,7 @@ inptype(const char *cp, const char **epp
 		if (ch_isdigit(c)) {
 			if (!osdef)
 				tp->t_proto = true;
-			narg = (int)strtol(cp, &eptr, 10);
-			cp = eptr;
+			narg = parse_int(&cp);
 			tp->t_args = xcalloc((size_t)(narg + 1),
 					     sizeof(*tp->t_args));
 			for (i = 0; i < narg; i++) {
@@ -693,16 +701,13 @@ inptype(const char *cp, const char **epp
 			break;
 		case '3':
 			tp->t_isuniqpos = true;
-			tp->t_uniqpos.p_line = strtol(cp, &eptr, 10);
-			cp = eptr;
+			tp->t_uniqpos.p_line = parse_int(&cp);
 			cp++;
 			/* xlate to 'global' file name. */
 			tp->t_uniqpos.p_file =
-			    addoutfile(inpfns[strtol(cp, &eptr, 10)]);
-			cp = eptr;
+			    addoutfile(inpfns[parse_int(&cp)]);
 			cp++;
-			tp->t_uniqpos.p_uniq = strtol(cp, &eptr, 10);
-			cp = eptr;
+			tp->t_uniqpos.p_uniq = parse_int(&cp);
 			break;
 		}
 		break;
@@ -747,7 +752,7 @@ static int
 gettlen(const char *cp, const char **epp)
 {
 	const	char *cp1;
-	char	c, s, *eptr;
+	char	c, s;
 	tspec_t	t;
 	int	narg, i;
 	bool	cm, vm;
@@ -882,10 +887,7 @@ gettlen(const char *cp, const char **epp
 
 	switch (t) {
 	case ARRAY:
-		(void)strtol(cp, &eptr, 10);
-		if (cp == eptr)
-			inperr("bad number: %s", cp);
-		cp = eptr;
+		(void)parse_int(&cp);
 		(void)gettlen(cp, &cp);
 		break;
 	case PTR:
@@ -894,8 +896,7 @@ gettlen(const char *cp, const char **epp
 	case FUNC:
 		c = *cp;
 		if (ch_isdigit(c)) {
-			narg = (int)strtol(cp, &eptr, 10);
-			cp = eptr;
+			narg = parse_int(&cp);
 			for (i = 0; i < narg; i++) {
 				if (i == narg - 1 && *cp == 'E') {
 					cp++;
@@ -918,22 +919,13 @@ gettlen(const char *cp, const char **epp
 			break;
 		case '3':
 			/* unique position: line.file.uniquifier */
-			(void)strtol(cp, &eptr, 10);
-			if (cp == eptr)
-				inperr("bad number: %s", cp);
-			cp = eptr;
+			(void)parse_int(&cp);
 			if (*cp++ != '.')
 				inperr("not dot: %c", cp[-1]);
-			(void)strtol(cp, &eptr, 10);
-			if (cp == eptr)
-				inperr("bad number: %s", cp);
-			cp = eptr;
+			(void)parse_int(&cp);
 			if (*cp++ != '.')
 				inperr("not dot: %c", cp[-1]);
-			(void)strtol(cp, &eptr, 10);
-			if (cp == eptr)
-				inperr("bad number: %s", cp);
-			cp = eptr;
+			(void)parse_int(&cp);
 			break;
 		default:
 			inperr("bad value: %c\n", cp[-1]);
@@ -1135,12 +1127,9 @@ inpname(const char *cp, const char **epp
 	static	char	*buf;
 	static	size_t	blen = 0;
 	size_t	len, i;
-	char	*eptr, c;
+	char	c;
 
-	len = (int)strtol(cp, &eptr, 10);
-	if (cp == eptr)
-		inperr("bad number: %s", cp);
-	cp = eptr;
+	len = parse_int(&cp);
 	if (len + 1 > blen)
 		buf = xrealloc(buf, blen = len + 1);
 	for (i = 0; i < len; i++) {

Reply via email to