93a94 > nflag : int; # use /dev/null for absent files 99c100 < 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 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 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++;