Module Name: src
Committed By: rillig
Date: Sat Aug 26 15:18:27 UTC 2023
Modified Files:
src/usr.bin/error: error.h input.c pi.c subr.c
Log Message:
error: clean up comparison of word vectors
The function wordvcmp returned -1 when either of the word vectors was
short; this made the function asymmetric. Since the function is only
used to compare two word vectors for equality, restrict it to this
particular use case.
To generate a diff of this commit:
cvs rdiff -u -r1.20 -r1.21 src/usr.bin/error/error.h \
src/usr.bin/error/input.c
cvs rdiff -u -r1.23 -r1.24 src/usr.bin/error/pi.c
cvs rdiff -u -r1.25 -r1.26 src/usr.bin/error/subr.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/error/error.h
diff -u src/usr.bin/error/error.h:1.20 src/usr.bin/error/error.h:1.21
--- src/usr.bin/error/error.h:1.20 Sat Aug 26 14:50:53 2023
+++ src/usr.bin/error/error.h Sat Aug 26 15:18:27 2023
@@ -1,4 +1,4 @@
-/* $NetBSD: error.h,v 1.20 2023/08/26 14:50:53 rillig Exp $ */
+/* $NetBSD: error.h,v 1.21 2023/08/26 15:18:27 rillig Exp $ */
/*
* Copyright (c) 1980, 1993
@@ -281,6 +281,6 @@ char *substitute(char *, char, char);
bool touchfiles(int, Eptr **, int *, char ***);
const char *verbform(int);
void wordvbuild(char *, int*, char ***);
-int wordvcmp(char **, int, char **);
+bool wordv_eq(char **, int, char **);
void wordvprint(FILE *, int, char **);
char **wordvsplice(int, int, char **);
Index: src/usr.bin/error/input.c
diff -u src/usr.bin/error/input.c:1.20 src/usr.bin/error/input.c:1.21
--- src/usr.bin/error/input.c:1.20 Sat Aug 26 14:50:53 2023
+++ src/usr.bin/error/input.c Sat Aug 26 15:18:27 2023
@@ -1,4 +1,4 @@
-/* $NetBSD: input.c,v 1.20 2023/08/26 14:50:53 rillig Exp $ */
+/* $NetBSD: input.c,v 1.21 2023/08/26 15:18:27 rillig Exp $ */
/*
* Copyright (c) 1980, 1993
@@ -34,7 +34,7 @@
#if 0
static char sccsid[] = "@(#)input.c 8.1 (Berkeley) 6/6/93";
#endif
-__RCSID("$NetBSD: input.c,v 1.20 2023/08/26 14:50:53 rillig Exp $");
+__RCSID("$NetBSD: input.c,v 1.21 2023/08/26 15:18:27 rillig Exp $");
#endif /* not lint */
#include <stdio.h>
@@ -488,8 +488,8 @@ lint3(void)
{
if (cur_wordc < 3)
return C_UNKNOWN;
- if (wordvcmp(cur_wordv+2, 4, Lint31) == 0
- || wordvcmp(cur_wordv+2, 6, Lint32) == 0) {
+ if (wordv_eq(cur_wordv+2, 4, Lint31)
+ || wordv_eq(cur_wordv+2, 6, Lint32)) {
language = INLINT;
return C_NONSPEC;
}
@@ -526,7 +526,7 @@ f77(void)
* Warning on line %d of %s: %s
* Error. No assembly.
*/
- if (cur_wordc == 3 && wordvcmp(cur_wordv+1, 3, F77_no_ass) == 0) {
+ if (cur_wordc == 3 && wordv_eq(cur_wordv+1, 3, F77_no_ass)) {
cur_wordc = 0;
return C_SYNC;
}
@@ -534,9 +534,9 @@ f77(void)
return C_UNKNOWN;
if (lastchar(cur_wordv[6]) == ':'
&& (
- wordvcmp(cur_wordv+1, 3, F77_fatal) == 0
- || wordvcmp(cur_wordv+1, 3, F77_error) == 0
- || wordvcmp(cur_wordv+1, 3, F77_warning) == 0
+ wordv_eq(cur_wordv+1, 3, F77_fatal)
+ || wordv_eq(cur_wordv+1, 3, F77_error)
+ || wordv_eq(cur_wordv+1, 3, F77_warning)
)
) {
language = INF77;
@@ -563,11 +563,11 @@ DECL_STRINGS_5(static, Make_NotRemade,
static Errorclass
make(void)
{
- if (wordvcmp(cur_wordv+1, 3, Make_Croak) == 0) {
+ if (wordv_eq(cur_wordv+1, 3, Make_Croak)) {
language = INMAKE;
return C_SYNC;
}
- if (wordvcmp(cur_wordv+2, 5, Make_NotRemade) == 0) {
+ if (wordv_eq(cur_wordv+2, 5, Make_NotRemade)) {
language = INMAKE;
return C_SYNC;
}
Index: src/usr.bin/error/pi.c
diff -u src/usr.bin/error/pi.c:1.23 src/usr.bin/error/pi.c:1.24
--- src/usr.bin/error/pi.c:1.23 Sat Aug 26 14:59:44 2023
+++ src/usr.bin/error/pi.c Sat Aug 26 15:18:27 2023
@@ -1,4 +1,4 @@
-/* $NetBSD: pi.c,v 1.23 2023/08/26 14:59:44 rillig Exp $ */
+/* $NetBSD: pi.c,v 1.24 2023/08/26 15:18:27 rillig Exp $ */
/*
* Copyright (c) 1980, 1993
@@ -34,7 +34,7 @@
#if 0
static char sccsid[] = "@(#)pi.c 8.1 (Berkeley) 6/6/93";
#endif
-__RCSID("$NetBSD: pi.c,v 1.23 2023/08/26 14:59:44 rillig Exp $");
+__RCSID("$NetBSD: pi.c,v 1.24 2023/08/26 15:18:27 rillig Exp $");
#endif /* not lint */
#include <stdio.h>
@@ -329,10 +329,10 @@ pi(void)
int wordindex;
language = INPI;
- if ((undefined = (wordvcmp(cur_wordv+2, 3, pi_und1) == 0))
- || (undefined = (wordvcmp(cur_wordv+2, 3, pi_und2) == 0))
- || wordvcmp(cur_wordv+2, 4, pi_imp1) == 0
- || wordvcmp(cur_wordv+2, 4, pi_imp2) == 0
+ if ((undefined = wordv_eq(cur_wordv+2, 3, pi_und1))
+ || (undefined = wordv_eq(cur_wordv+2, 3, pi_und2))
+ || wordv_eq(cur_wordv+2, 4, pi_imp1)
+ || wordv_eq(cur_wordv+2, 4, pi_imp2)
) {
for (wordindex = undefined ? 5 : 6;
wordindex <= cur_wordc;
@@ -419,10 +419,10 @@ pi(void)
structured = false;
multiple = false;
if (
- (cur_wordc == 6 && wordvcmp(cur_wordv+1, 2, pi_Endmatched) == 0)
- || (cur_wordc == 8 && wordvcmp(cur_wordv+1, 4, pi_Inserted) == 0)
- || (multiple = (cur_wordc == 9 && wordvcmp(cur_wordv+1,6, pi_multiple) == 0))
- || (structured = (cur_wordc == 10 && wordvcmp(cur_wordv+6,5, pi_structured) == 0))
+ (cur_wordc == 6 && wordv_eq(cur_wordv+1, 2, pi_Endmatched))
+ || (cur_wordc == 8 && wordv_eq(cur_wordv+1, 4, pi_Inserted))
+ || (multiple = (cur_wordc == 9 && wordv_eq(cur_wordv+1,6, pi_multiple)))
+ || (structured = (cur_wordc == 10 && wordv_eq(cur_wordv+6,5, pi_structured)))
) {
language = INPI;
nwordv = wordvsplice(2, cur_wordc, cur_wordv+1);
Index: src/usr.bin/error/subr.c
diff -u src/usr.bin/error/subr.c:1.25 src/usr.bin/error/subr.c:1.26
--- src/usr.bin/error/subr.c:1.25 Sat Aug 26 15:07:14 2023
+++ src/usr.bin/error/subr.c Sat Aug 26 15:18:27 2023
@@ -1,4 +1,4 @@
-/* $NetBSD: subr.c,v 1.25 2023/08/26 15:07:14 rillig Exp $ */
+/* $NetBSD: subr.c,v 1.26 2023/08/26 15:18:27 rillig Exp $ */
/*
* Copyright (c) 1980, 1993
@@ -34,7 +34,7 @@
#if 0
static char sccsid[] = "@(#)subr.c 8.1 (Berkeley) 6/6/93";
#endif
-__RCSID("$NetBSD: subr.c,v 1.25 2023/08/26 15:07:14 rillig Exp $");
+__RCSID("$NetBSD: subr.c,v 1.26 2023/08/26 15:18:27 rillig Exp $");
#endif /* not lint */
#include <ctype.h>
@@ -347,18 +347,14 @@ wordvbuild(char *string, int *r_wordc, c
/*
* Compare two 0 based wordvectors
*/
-int
-wordvcmp(char **wordv1, int wordc, char **wordv2)
+bool
+wordv_eq(char **wordv1, int wordc, char **wordv2)
{
- int back;
-
- for (int i = 0; i < wordc; i++) {
- if (wordv1[i] == NULL || wordv2[i] == NULL)
- return -1;
- if ((back = strcmp(wordv1[i], wordv2[i])) != 0)
- return back;
- }
- return 0; /* they are equal */
+ for (int i = 0; i < wordc; i++)
+ if (wordv1[i] == NULL || wordv2[i] == NULL
+ || strcmp(wordv1[i], wordv2[i]) != 0)
+ return false;
+ return true;
}
/*