118 lines · 2.7 KB · Text
RawDownload
93a94> nflag : int;			# use /dev/null for absent files99c100< Usage : con  "usage: diff [ -efbwr ] file1 ... file2";---> Usage : con  "usage: diff [ -efbwrn ] file1 ... file2";158a160,161> 		'n' =>> 			nflag = 1;691a695,699> isdir(p: string): int> {> 	(ok, d) := sys->stat(p);> 	return ok == 0 && d.mode&Sys->DMDIR;> }692a701,763> # fd, td are directories; ff, tf are files in those directories.  one file may be nil (its directory will ignored).> # should we print something about one-way directories too?> ndiff(fd, ff, td, tf: string, level: int)> {> 	fb:=sys->sprint("%s/%s", fd, ff);> 	tb:=sys->sprint("%s/%s", td, tf);> > 	if (ff != nil && tf != nil) {> 		dir1 := isdir(fb);> 		dir2 := isdir(tb);> 		if (dir1 && dir2) {> 			diffdir(fb, tb, level);> 		} else if (dir1 || dir2) {> 			ndiff(fd, ff, td, nil, level);> 			ndiff(fd, nil, td, tf, level);> 		} else> 			diffreg(fb, tb);> 		return;> 	}> > 	if (!nflag) {> 		if (mode != 0)> 			return;> > 		if (ff == nil)> 			out.puts(sys->sprint("Only in %s: %s\n", td, tf));> 		else> 			out.puts(sys->sprint("Only in %s: %s\n", fd, ff));> 	}> > 	# one file doesn't exist.> 	# if the existing file is a directory, call ndiff for all its elements.> 	# if it is a file, diff against /dev/null> 	p: string;> 	if (ff != nil)> 		p = sys->sprint("%s/%s", fd, ff);> 	else> 		p = sys->sprint("%s/%s", td, tf);> > 	(ok, dir) := sys->stat(p);> 	if (ok != 0)> 		error(sys->sprint("cannot stat %q: %r", p));> > 	if (!(dir.mode&Sys->DMDIR)) {> 		if(ff == nil)> 			fb = "/dev/null";> 		else> 			tb = "/dev/null";> 		diffreg(fb, tb);> 		return;> 	}> > 	elems := scandir(p);> 	for (i := 0; i < len elems; i++) {> 		nff := ntf := "";> 		if (ff != nil)> 			nff = elems[i];> 		else> 			ntf = elems[i];> 		ndiff(fb, nff, tb, ntf, level);> 	}> }> 695,696c766,772< 	df, dt : array of string;< 	fb, tb : string;---> 	df := array[0] of string;> 	dt := array[0] of string;> 	if (f != nil)> 		df = scandir(f);> 	if (t != nil)> 		dt = scandir(t);> 699,700d774< 	df = scandir(f);< 	dt = scandir(t);703,706c777,784< 			if (mode == 0)< 				out.puts(sys->sprint("Only in %s: %s\n", f, df[i]));< 			i++;< 			continue;---> 			# only f/df[i] exists> 			ndiff(f, df[i++], t, nil, level+1);> 		} else if ((i==len df) || (j<len dt && df[i] > dt[j])) {> 			# only t/dt[j] exists> 			ndiff(f, nil, t, dt[j++], level+1);> 		} else {> 			# both exist> 			ndiff(f, df[i++], t, dt[j++], level+1);708,717d785< 		if ((i==len df) || (j<len dt && df[i] > dt[j])) {< 			if (mode == 0)< 				out.puts(sys->sprint("Only in %s: %s\n", t, dt[j]));< 			j++;< 			continue;< 		}< 		fb=sys->sprint("%s/%s", f, df[i]);< 		tb=sys->sprint("%s/%s", t, dt[j]);		< 		diff(fb, tb, level+1);< 		i++; j++;