int ibuf1[259]; int ibuf2[259]; int eflg; int lflg 1; int oflg; int wflg; int line[2] {0, 1}; int chr[2] { -1, -1}; main(argc, argv) char **argv; { register c1, c2; int oc1, oc2, prevdiff; char *arg, *loc; if(argc < 3) goto narg; arg = argv[1]; while (arg[0] == '-') { if (arg[1] == 's') lflg--; if (arg[1] == 'l') lflg++; if (arg[1] == 'o') oflg++; if (arg[1] == 'w') wflg++; argv++; argc--; arg = argv[1]; } if(argc < 3) goto narg; if( arg[0]=='-' && arg[1]==0 ) ibuf1[0] = dup(0); else if(fopen(arg, ibuf1) < 0) goto barg; arg = argv[2]; if(fopen(arg, ibuf2) < 0) goto barg; loop: if (++chr[1]==0) chr[0]++; if ((chr[1] & 1) == 1) { oc1 = c1; oc2 = c2; } else prevdiff = 0; /* Note: cleared on 0th byte */ c1 = getc(ibuf1); c2 = getc(ibuf2); if ((c1 == c2) && (prevdiff == 0)) { if (c1 == '\n') if (++line[1]==0) line[0]++; if(c1 == -1) { if(eflg) exit(1); exit(0); } goto loop; } if(lflg == 0) exit(1); if(c1 == -1) { arg = argv[1]; goto earg; } if(c2 == -1) goto earg; if(lflg == 1) { printf("%s %s differ: char %s, line ", argv[1], arg, locv(chr[0], chr[1])); printf("%s\n", locv(line[0], line[1])); exit(1); } eflg = 1; if (oflg) loc = loocv(chr[0], (chr[1] - (wflg ? 1 : 0))); else loc = locv(chr[0], (chr[1] - (wflg ? 1 : 0))); if (wflg == 0) { printf("%10s %3o %3o\n", loc, c1, c2); goto loop; } if ((chr[1] & 1) == 0) { prevdiff++; goto loop; } printf("%10s %6o %6o\n", loc, ((c1 << 8) | oc1), ((c2 << 8) | oc2)); goto loop; narg: printf("cmp [-s] [-l] [-o] [-w] {file1} {file2}\n"); exit(2); barg: printf("cannot open %s\n", arg); exit(2); earg: printf("EOF on %s\n", arg); exit(1); } putchar(c) { write(1, &c, 1); }