X-Git-Url: https://pd.if.org/git/?a=blobdiff_plain;f=utils%2Fcmp%2Fcmp.c;fp=utils%2Fcmp%2Fcmp.c;h=0000000000000000000000000000000000000000;hb=4476699b7c7de3abf9f6da71ed409b2c032dc50f;hp=a1c05722bde5a378f8b4444dfefb72a860a64773;hpb=2e838897cc574a9147bcf0b1681aeeaa44001fce;p=pdutils diff --git a/utils/cmp/cmp.c b/utils/cmp/cmp.c deleted file mode 100644 index a1c0572..0000000 --- a/utils/cmp/cmp.c +++ /dev/null @@ -1,163 +0,0 @@ -/* - * cmp.c - compare two files - * - * Version: 2008-1.01 - * Build: c89 -o cmp cmp.c - * Source: - * Spec: - * - * This is free and unencumbered software released into the public domain, - * provided "as is", without warranty of any kind, express or implied. See the - * file UNLICENSE and the website for further details. - */ - - -#define _POSIX_SOURCE - -#include -#include -#include -#include -#include -#include -#include -#include - -#define USAGE "usage: cmp [-l|-s] file1 file2\n" -#define ELSMUTEXCL "Options -l and -s are mutually exclusive" -#define EBOTHSTDIN "Input files must be different" -#define BUFSIZE 4096 -#define SYSERR 1 -#define APPERR 0 - -static int cmpfiles(int fd1, char *fn1, int fd2, char *fn2); -static void fatal(int errtype, char *s); - -static int optl, opts; - - -int main(int argc, char **argv) -{ - extern int opterr, optind; - int c, exitstatus = 0; - int fd1, fd2; - char *fn1, *fn2; - - setlocale(LC_ALL, ""); - opterr = 0; - - while ((c = getopt(argc, argv, "ls")) != -1) - switch (c) - { - case 'l': - optl = 1; - break; - case 's': - opts = 1; - break; - default: - fprintf(stderr, USAGE); - exit(2); - } - - argc -= optind; - argv += optind; - - if (optl && opts) - fatal(APPERR, ELSMUTEXCL); - - if (argc != 2) - fatal(APPERR, USAGE); - - fn1 = argv[0]; - if (strcmp(fn1, "-") == 0) - fd1 = STDIN_FILENO; - else - if ((fd1 = open(fn1, O_RDONLY)) == -1) - fatal(SYSERR, fn1); - - fn2 = argv[1]; - if (strcmp(fn2, "-") == 0) - fd2 = STDIN_FILENO; - else - if ((fd2 = open(fn2, O_RDONLY)) == -1) - fatal(SYSERR, fn2); - - if (fd1 == STDIN_FILENO && fd2 == STDIN_FILENO) - fatal(APPERR, EBOTHSTDIN); - - exitstatus = cmpfiles(fd1, fn1, fd2, fn2); - - if (fd1 != STDIN_FILENO && (close(fd1) == -1)) - fatal(SYSERR, fn1); - - if (fd2 != STDIN_FILENO && (close(fd2) == -1)) - fatal(SYSERR, fn2); - - return(exitstatus); -} - - -int cmpfiles(int fd1, char *fn1, int fd2, char *fn2) -{ - unsigned char buf1[BUFSIZE], buf2[BUFSIZE]; - ssize_t n1, n2, byte = 1, line = 1; - int cnt, i, eof = 0, differ = 0, shorter = 0; - - while (! eof) - { - if ((n1 = read(fd1, buf1, BUFSIZE)) == -1) - fatal(SYSERR, fn1); - - if ((n2 = read(fd2, buf2, BUFSIZE)) == -1) - fatal(SYSERR, fn2); - - if (n1 != BUFSIZE || n2 != BUFSIZE) - { - eof = 1; - if (n1 != n2) - shorter = (n1 < n2) ? 1 : 2; - } - - cnt = (n1 < n2) ? n1 : n2; - for (i = 0; i < cnt; i++) - { - if (buf1[i] != buf2[i]) - { - if (! differ && ! optl && ! opts) - { - printf("%s %s differ: char %d, line %d\n", fn1, fn2, byte, line); - return(1); /* only need to report first mismatch */ - } - - differ = 1; - - if (optl) - printf("%d %o %o\n", byte, buf1[i], buf2[i]); - } - - byte++; - if (buf1[i] == '\n') - line++; - } - } - - if (shorter && (optl || (! opts && ! differ))) - { - differ = 1; - fprintf(stderr, "cmp: EOF on %s\n", (shorter == 1 ? fn1 : fn2)); - } - - return(differ || shorter); -} - - -void fatal(int errtype, char *s) -{ - if (errtype == SYSERR) - fprintf(stderr, "cmp: %s: %s\n", s, strerror(errno)); - else - fprintf(stderr, "cmp: %s\n", s); - - exit(2); -}