shithub: scc

Download patch

ref: 62b5f13a7e487d4cadb1c82ca7642e34dfcbb512
parent: b709b8fa6bd37944b2e0a53bef8df2fca5e9519e
author: Roberto E. Vargas Caballero <k0ga@shike2.com>
date: Mon Feb 11 01:37:10 EST 2019

[libmach] Make uniform the behaviour of for* functions

--- a/src/cmd/nm.c
+++ b/src/cmd/nm.c
@@ -198,12 +198,14 @@
 		return;
 	}
 
-	if ((t = objtype(fp, NULL)) != -1)
+	if ((t = objtype(fp, NULL)) != -1) {
 		newobject(fp, t);
-	else if (archive(fp))
-		formember(fp, newmember, NULL);
-	else
+	} else if (archive(fp)) {
+		if (formember(fp, newmember, NULL) < 0)
+			error("library corrupted");
+	} else {
 		error("bad format");
+	}
 
 	if (ferror(fp))
 		error(strerror(errno));
--- a/src/cmd/ranlib.c
+++ b/src/cmd/ranlib.c
@@ -180,7 +180,6 @@
 static int
 readsyms(FILE *fp)
 {
-	/* TODO: Change archive to returns -1 */
 	if (!archive(fp)) {
 		error("file format not recognized");
 		return 0;
@@ -187,7 +186,7 @@
 	}
 
 	if (formember(fp, newmember, NULL) < 0) {
-		error("while traversing archive");
+		error("library file corrupted");
 		return 0;
 	}
 
--- a/src/cmd/size.c
+++ b/src/cmd/size.c
@@ -124,12 +124,14 @@
 		return;
 	}
 
-	if ((t = objtype(fp, NULL)) != -1)
+	if ((t = objtype(fp, NULL)) != -1) {
 		newobject(fp, t);
-	else if (archive(fp))
-		formember(fp, newmember, NULL);
-	else
+	} else if (archive(fp)) {
+		if (formember(fp, newmember, NULL) < 0)
+			error("library corrupted");
+	} else {
 		error("bad format");
+	}
 
 	if (ferror(fp))
 		error(strerror(errno));
--- a/src/libmach/forsect.c
+++ b/src/libmach/forsect.c
@@ -7,11 +7,12 @@
 int
 forsect(Obj *obj, int (*fn)(Objsect *, void *), void *data)
 {
-	int i;
+	int i, r;
 
 	for (i = 0; i < obj->nsecs; i++) {
-		if ((*fn)(&obj->sections[i], data))
-			return 0;
+		r = (*fn)(&obj->sections[i], data);
+		if (r <= 0)
+			return r;
 	}
 
 	return 1;
--- a/src/libmach/forsym.c
+++ b/src/libmach/forsym.c
@@ -7,11 +7,13 @@
 int
 forsym(Obj *obj, int (*fn)(Objsym *, void *), void *data)
 {
+	int r;
 	Objsym *sym;
 
 	for (sym = obj->head; sym; sym = sym->next) {
-		 if (!(*fn)(sym, data))
-			return 0;
+		r = (*fn)(sym, data);
+		if (r <= 0)
+			return r;
 	}
 	return 1;
 }