[git commit master] diff: make code more portable

Denys Vlasenko vda.linux at googlemail.com
Wed Feb 3 23:10:30 UTC 2010


commit: http://git.busybox.net/busybox/commit/?id=f111b67100d17e0dab904160a0ab18430a70b9ba
branch: http://git.busybox.net/busybox/commit/?id=refs/heads/master

function                                             old     new   delta
create_J                                            1835    1849     +14
diffreg                                             1268    1255     -13

Signed-off-by: Dan Fandrich <dan at coneharvesters.com>
Signed-off-by: Denys Vlasenko <vda.linux at googlemail.com>
---
 editors/diff.c |   67 +++++++++++++++++++++++++++++++++----------------------
 1 files changed, 40 insertions(+), 27 deletions(-)

diff --git a/editors/diff.c b/editors/diff.c
index e4d74ab..a8ffcdd 100644
--- a/editors/diff.c
+++ b/editors/diff.c
@@ -227,10 +227,12 @@ struct cand {
 
 static int search(const int *c, int k, int y, const struct cand *list)
 {
+	int i, j;
+
 	if (list[c[k]].y < y)	/* quick look for typical case */
 		return k + 1;
 
-	for (int i = 0, j = k + 1;;) {
+	for (i = 0, j = k + 1;;) {
 		const int l = (i + j) >> 1;
 		if (l > i) {
 			const int t = list[c[l]].y;
@@ -265,11 +267,13 @@ static void stone(const int *a, int n, const int *b, int *J, int pref)
 	int clistlen = 100;
 	int k = 0;
 	struct cand *clist = xzalloc(clistlen * sizeof(clist[0]));
+	struct cand cand;
+	struct cand *q;
 	int *klist = xzalloc((n + 2) * sizeof(klist[0]));
 	/*clist[0] = (struct cand){0}; - xzalloc did it */
 	/*klist[0] = 0; */
 
-	for (struct cand cand = {1}; cand.x <= n; cand.x++) {
+	for (cand.x = 1; cand.x <= n; cand.x++) {
 		int j = a[cand.x], oldl = 0;
 		unsigned numtries = 0;
 		if (j == 0)
@@ -303,7 +307,7 @@ static void stone(const int *a, int n, const int *b, int *J, int pref)
 		} while ((cand.y = b[++j]) > 0 && numtries < bound);
 	}
 	/* Unravel */
-	for (struct cand *q = clist + klist[k]; q->y; q = clist + q->pred)
+	for (q = clist + klist[k]; q->y; q = clist + q->pred)
 		J[q->x + pref] = q->y + pref;
 	free(klist);
 	free(clist);
@@ -348,10 +352,11 @@ static void equiv(struct line *a, int n, struct line *b, int m, int *c)
 
 static void unsort(const struct line *f, int l, int *b)
 {
+	int i;
 	int *a = xmalloc((l + 1) * sizeof(a[0]));
-	for (int i = 1; i <= l; i++)
+	for (i = 1; i <= l; i++)
 		a[f[i].serial] = f[i].value;
-	for (int i = 1; i <= l; i++)
+	for (i = 1; i <= l; i++)
 		b[i] = a[i];
 	free(a);
 }
@@ -370,12 +375,13 @@ static int line_compar(const void *a, const void *b)
 
 static void fetch(FILE_and_pos_t *ft, const off_t *ix, int a, int b, int ch)
 {
-	for (int i = a; i <= b; i++) {
+	int i, j, col;
+	for (i = a; i <= b; i++) {
 		seek_ft(ft, ix[i - 1]);
 		putchar(ch);
 		if (option_mask32 & FLAG(T))
 			putchar('\t');
-		for (int j = 0, col = 0; j < ix[i] - ix[i - 1]; j++) {
+		for (j = 0, col = 0; j < ix[i] - ix[i - 1]; j++) {
 			int c = fgetc(ft->ft_fp);
 			if (c == EOF) {
 				printf("\n\\ No newline at end of file\n");
@@ -410,19 +416,20 @@ static NOINLINE int *create_J(FILE_and_pos_t ft[2], int nlen[2], off_t *ix[2])
 {
 	int *J, slen[2], *class, *member;
 	struct line *nfile[2], *sfile[2];
-	int pref = 0, suff = 0;
+	int pref = 0, suff = 0, i, j, delta;
 
 	/* Lines of both files are hashed, and in the process
 	 * their offsets are stored in the array ix[fileno]
 	 * where fileno == 0 points to the old file, and
 	 * fileno == 1 points to the new one.
 	 */
-	for (int i = 0; i < 2; i++) {
+	for (i = 0; i < 2; i++) {
 		unsigned hash;
 		token_t tok;
 		size_t sz = 100;
 		nfile[i] = xmalloc((sz + 3) * sizeof(nfile[i][0]));
 		/* ft gets here without the correct position, cant use seek_ft */
+		ft[i].ft_pos = 0;
 		fseeko(ft[i].ft_fp, 0, SEEK_SET);
 
 		nlen[i] = 0;
@@ -460,7 +467,7 @@ start:
 			nlen[i]--;
 		/* Now we copy the line offsets into ix */
 		ix[i] = xmalloc((nlen[i] + 2) * sizeof(ix[i][0]));
-		for (int j = 0; j < nlen[i] + 1; j++)
+		for (j = 0; j < nlen[i] + 1; j++)
 			ix[i][j] = nfile[i][j].offset;
 	}
 
@@ -475,10 +482,10 @@ start:
 	 * the result being sorted and stored in sfile[fileno],
 	 * and their sizes are stored in slen[fileno]
 	 */
-	for (int j = 0; j < 2; j++) {
+	for (j = 0; j < 2; j++) {
 		sfile[j] = nfile[j] + pref;
 		slen[j] = nlen[j] - pref - suff;
-		for (int i = 0; i <= slen[j]; i++)
+		for (i = 0; i <= slen[j]; i++)
 			sfile[j][i].serial = i;
 		qsort(sfile[j] + 1, slen[j], sizeof(*sfile[j]), line_compar);
 	}
@@ -512,7 +519,7 @@ start:
 	 * are initialized with 0 (no matches), so that function stone can
 	 * then assign them their right values
 	 */
-	for (int i = 0, delta = nlen[1] - nlen[0]; i <= nlen[0]; i++)
+	for (i = 0, delta = nlen[1] - nlen[0]; i <= nlen[0]; i++)
 		J[i] = i <= pref            ?  i :
 		       i > (nlen[0] - suff) ? (i + delta) : 0;
 	/* Here the magic is performed */
@@ -526,14 +533,14 @@ start:
 	 * which, due to limitations intrinsic to any hashing algorithm,
 	 * are different but ended up confounded as the same
 	 */
-	for (int i = 1; i <= nlen[0]; i++) {
+	for (i = 1; i <= nlen[0]; i++) {
 		if (!J[i])
 			continue;
 
 		seek_ft(&ft[0], ix[0][i - 1]);
 		seek_ft(&ft[1], ix[1][J[i] - 1]);
 
-		for (int j = J[i]; i <= nlen[0] && J[i] == j; i++, j++) {
+		for (j = J[i]; i <= nlen[0] && J[i] == j; i++, j++) {
 			token_t tok0 = 0, tok1 = 0;
 			do {
 				tok0 = read_token(&ft[0], tok0);
@@ -555,13 +562,18 @@ static bool diff(FILE* fp[2], char *file[2])
 {
 	int nlen[2];
 	off_t *ix[2];
-	FILE_and_pos_t ft[2] = { { fp[0] }, { fp[1] } };
-	int *J = create_J(ft, nlen, ix);
-
-	bool anychange = false;
+	FILE_and_pos_t ft[2];
 	typedef struct { int a, b; } vec_t[2];
 	vec_t *vec = NULL;
 	int i = 1, idx = -1;
+	bool anychange = false;
+	int *J;
+
+	ft[0].ft_fp = fp[0];
+	ft[1].ft_fp = fp[1];
+	/* note that ft[i].ft_pos is unintitalized, create_J()
+	 * must not assume otherwise */
+	J = create_J(ft, nlen, ix);
 
 	do {
 		bool nonempty = false;
@@ -660,9 +672,9 @@ static int diffreg(char *file[2])
 {
 	FILE *fp[2] = { stdin, stdin };
 	bool binary = false, differ = false;
-	int status = STATUS_SAME;
+	int status = STATUS_SAME, i;
 
-	for (int i = 0; i < 2; i++) {
+	for (i = 0; i < 2; i++) {
 		int fd = open_or_warn_stdin(file[i]);
 		if (fd == -1)
 			goto out;
@@ -688,7 +700,7 @@ static int diffreg(char *file[2])
 		const size_t sz = COMMON_BUFSIZE / 2;
 		char *const buf0 = bb_common_bufsiz1;
 		char *const buf1 = buf0 + sz;
-		int i, j;
+		int j, k;
 		i = fread(buf0, 1, sz, fp[0]);
 		j = fread(buf1, 1, sz, fp[1]);
 		if (i != j) {
@@ -697,7 +709,7 @@ static int diffreg(char *file[2])
 		}
 		if (i == 0)
 			break;
-		for (int k = 0; k < i; k++) {
+		for (k = 0; k < i; k++) {
 			if (!buf0[k] || !buf1[k])
 				binary = true;
 			if (buf0[k] != buf1[k])
@@ -771,9 +783,10 @@ static int FAST_FUNC skip_dir(const char *filename,
 static void diffdir(char *p[2], const char *s_start)
 {
 	struct dlist list[2];
+	int i;
 
 	memset(&list, 0, sizeof(list));
-	for (int i = 0; i < 2; i++) {
+	for (i = 0; i < 2; i++) {
 		/*list[i].s = list[i].e = 0; - memset did it */
 		/*list[i].dl = NULL; */
 
@@ -815,7 +828,7 @@ static void diffdir(char *p[2], const char *s_start)
 		else {
 			char *fullpath[2], *path[2]; /* if -N */
 
-			for (int i = 0; i < 2; i++) {
+			for (i = 0; i < 2; i++) {
 				if (pos == 0 || i == k) {
 					path[i] = fullpath[i] = concat_path_file(p[i], dp[i]);
 					stat(fullpath[i], &stb[i]);
@@ -883,7 +896,7 @@ static const char diff_longopts[] ALIGN1 =
 int diff_main(int argc, char **argv) MAIN_EXTERNALLY_VISIBLE;
 int diff_main(int argc UNUSED_PARAM, char **argv)
 {
-	int gotstdin = 0;
+	int gotstdin = 0, i;
 	char *file[2], *s_start = NULL;
 	llist_t *L_arg = NULL;
 
@@ -900,7 +913,7 @@ int diff_main(int argc UNUSED_PARAM, char **argv)
 	while (L_arg)
 		label[!!label[0]] = llist_pop(&L_arg);
 	xfunc_error_retval = 2;
-	for (int i = 0; i < 2; i++) {
+	for (i = 0; i < 2; i++) {
 		file[i] = argv[i];
 		/* Compat: "diff file name_which_doesnt_exist" exits with 2 */
 		if (LONE_DASH(file[i])) {
-- 
1.6.3.3



More information about the busybox-cvs mailing list