diff --git a/bin/cmp/Makefile b/bin/cmp/Makefile new file mode 100644 index 0000000..e171323 --- /dev/null +++ b/bin/cmp/Makefile @@ -0,0 +1,34 @@ +# +# This makefile is intended for use with dmake(1) on Apple IIGS +# +# Created by Dave Tribby, August 1997 +# Modified by Evan Day, September 1997 +# +# $Id: Makefile,v 1.1 1997/10/03 05:13:22 gdr Exp $ + +# Program name +PROG= cmp +# Source files +SRCS= cmp.c misc.c rcmp.c special.c + +# If optimization wasn't set on the command line use 79, since +# cmp has been tested to work at that level. +.IF $(OPTIMIZE) == $(NULL) + OPTIMIZE=79 +.END + +# Current implementation is using 960 bytes give or take +STACK = 1280 + +# Installation point +BINDIR = /bin + +.INCLUDE : /src/gno/prog.mk + +# +# Additional dependancies +# +cmp.o:: extern.h +misc.o:: extern.h +rcmp.o:: extern.h +special.o:: extern.h diff --git a/bin/cmp/cmp.1 b/bin/cmp/cmp.1 new file mode 100644 index 0000000..f33ab0a --- /dev/null +++ b/bin/cmp/cmp.1 @@ -0,0 +1,114 @@ +.\" Copyright (c) 1987, 1990, 1993 +.\" The Regents of the University of California. All rights reserved. +.\" +.\" This code is derived from software contributed to Berkeley by +.\" the Institute of Electrical and Electronics Engineers, Inc. +.\" +.\" Redistribution and use in source and binary forms, with or without +.\" modification, are permitted provided that the following conditions +.\" are met: +.\" 1. Redistributions of source code must retain the above copyright +.\" notice, this list of conditions and the following disclaimer. +.\" 2. Redistributions in binary form must reproduce the above copyright +.\" notice, this list of conditions and the following disclaimer in the +.\" documentation and/or other materials provided with the distribution. +.\" 3. All advertising materials mentioning features or use of this software +.\" must display the following acknowledgement: +.\" This product includes software developed by the University of +.\" California, Berkeley and its contributors. +.\" 4. Neither the name of the University nor the names of its contributors +.\" may be used to endorse or promote products derived from this software +.\" without specific prior written permission. +.\" +.\" THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND +.\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +.\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +.\" ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE +.\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS +.\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) +.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT +.\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY +.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF +.\" SUCH DAMAGE. +.\" +.\" @(#)cmp.1 8.1 (Berkeley) 6/6/93 +.\" $Id: cmp.1,v 1.1 1997/10/03 05:13:22 gdr Exp $ +.\" +.TH CMP 1 "28 September 1997" GNO "Commands and Applications" +.SH NAME +.BR cmp +\- compare two files +.SH SYNOPSIS +.BR cmp " [" -l " | " -s "] [" +.BR -r +] +.IR file1 +.IR file2 +[ +.IR skip1 +[ +.IR skip2 +] ] +.SH DESCRIPTION +The +.BR cmp +utility compares two files of any type and writes the results +to the standard output. +By default, +.BR cmp +is silent if the files are the same; if they differ, the byte +and line number at which the first difference occurred is reported. +Also by default, +.BR cmp +also considers the resource forks of the files, and will make note +if only one of the files has a resource fork. +.PP +Bytes and lines are numbered beginning with one. +.PP +The following options are available: +.IP \fB-l\fR +Print the byte number (decimal) and the differing +byte values (octal) for each difference. +.IP \fB-s\fR +Print nothing for differing files; return exit +status only. +.IP \fB-r\fR +Ignore resource forks when comparing. +.PP +The optional arguments +.IR skip1 +and +.IR skip2 +are the byte offsets from the beginning of +.IR file1 +and +.IR file2 , +respectively, where the comparison will begin. +The offset is decimal by default, but may be expressed as an hexadecimal +or octal value by preceding it with a leading ``0x'' or ``0''. +.PP +The +.BR cmp +utility exits with one of the following values: +.IP \fB0\fR +The files are identical. +.IP \fB1\fR +The files are different; this includes the case +where one file is identical to the first part of +the other. +In the latter case, if the +.IR -s +option has not been specified, +.BR cmp +writes to standard output that EOF was reached in the shorter +file (before any differences were found). +.IP \fB>1\fR +An error occurred. +.SH SEE ALSO +.BR diff(1), +.BR diff3(1) +.SH HISTORY +The +.BR cmp +command for GNO/ME v2.0.6 is based on FreeBSD source code. diff --git a/bin/cmp/cmp.c b/bin/cmp/cmp.c new file mode 100644 index 0000000..acc6c77 --- /dev/null +++ b/bin/cmp/cmp.c @@ -0,0 +1,243 @@ +/* + * Copyright (c) 1987, 1990, 1993, 1994 + * The Regents of the University of California. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. All advertising materials mentioning features or use of this software + * must display the following acknowledgement: + * This product includes software developed by the University of + * California, Berkeley and its contributors. + * 4. Neither the name of the University nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + */ + +/* + * cmp for GNO/ME v2.0.6 + * + * $Id: cmp.c,v 1.1 1997/10/03 05:13:22 gdr Exp $ + */ + +#ifndef __GNO__ +#ifndef lint +static char copyright[] = +"@(#) Copyright (c) 1987, 1990, 1993, 1994\n\ + The Regents of the University of California. All rights reserved.\n"; +#endif /* not lint */ +#endif + +#ifndef __GNO__ +#ifndef lint +static char sccsid[] = "@(#)cmp.c 8.3 (Berkeley) 4/2/94"; +#endif /* not lint */ +#endif + +#include +#include + +#include +#include +#include +#include +#include +#include + +#include "extern.h" + +int lflag, sflag; +#ifdef __GNO__ +int rflag; +#endif + +static void usage __P((void)); + +#ifdef __STACK_CHECK__ +#include + +static void cleanup(void) +{ + (void) fprintf(stderr, "%d\n", _endStackCheck()); +} +#endif + +int +#ifndef __STDC__ +main(argc, argv) + int argc; + char *argv[]; +#else +main(int argc, char *argv[]) +#endif +{ + struct stat sb1, sb2; + off_t skip1, skip2; + int ch, fd1, fd2, special; + char *file1, *file2; + +#ifdef __STACK_CHECK__ + atexit(cleanup); + _beginStackCheck(); +#endif + +#ifdef __GNO__ + while ((ch = getopt(argc, argv, "-lsr")) != -1) +#else + while ((ch = getopt(argc, argv, "-ls")) != -1) +#endif + switch (ch) { + case 'l': /* print all differences */ + lflag = 1; + break; + case 's': /* silent run */ + sflag = 1; + break; +#ifdef __GNO__ + case 'r': + rflag = 1; /* ignore resource fork */ + break; +#endif + case '-': /* stdin (must be after options) */ + --optind; + goto endargs; + case '?': + default: + usage(); + } +endargs: +#ifndef __ORCAC__ + argv += optind; +#else + argv = argv + optind; +#endif + argc -= optind; + + if (lflag && sflag) + errx(ERR_EXIT, "only one of -l and -s may be specified"); + + if (argc < 2 || argc > 4) + usage(); + + /* Backward compatibility -- handle "-" meaning stdin. */ + special = 0; + if (strcmp(file1 = argv[0], "-") == 0) { + special = 1; + fd1 = 0; + file1 = "stdin"; + } +#ifndef __GNO__ + else if ((fd1 = open(file1, O_RDONLY, 0)) < 0) { +#else + /* open() for GNO/ME requires 3rd arg iff creating file */ + else if ((fd1 = open(file1, O_RDONLY)) < 0) { +#endif + if (!sflag) + err(ERR_EXIT, "%s", file1); + else + exit(1); + } + if (strcmp(file2 = argv[1], "-") == 0) { + if (special) + errx(ERR_EXIT, + "standard input may only be specified once"); + special = 1; + fd2 = 0; + file2 = "stdin"; + } +#ifndef __GNO__ + else if ((fd2 = open(file2, O_RDONLY, 0)) < 0) { +#else + else if ((fd2 = open(file2, O_RDONLY)) < 0) { +#endif + if (!sflag) + err(ERR_EXIT, "%s", file2); + else + exit(1); + } + + skip1 = argc > 2 ? strtol(argv[2], NULL, 10) : 0; + skip2 = argc == 4 ? strtol(argv[3], NULL, 10) : 0; + +#ifndef __GNO__ + if (!special) { + if (fstat(fd1, &sb1)) { + if (!sflag) + err(ERR_EXIT, "%s", file1); + else + exit(1); + } + if (!S_ISREG(sb1.st_mode)) + special = 1; + else { + if (fstat(fd2, &sb2)) { + if (!sflag) + err(ERR_EXIT, "%s", file2); + else + exit(1); + } + if (!S_ISREG(sb2.st_mode)) + special = 1; + } + } +#else + special = 1; /* GNO doesn't have mmap.h, so treat every file as + a special file and process byte by byte */ +#endif + if (special) +#ifdef __GNO__ + { +#endif + c_special(fd1, file1, skip1, fd2, file2, skip2); +#ifdef __GNO__ + close(fd1); + close(fd2); + } + + if (rflag != 1) { + rflag = 2; + rcmp(&fd1, &fd2, file1, file2); + close(fd1); + close(fd2); + } +#else + else + c_regular(fd1, file1, skip1, sb1.st_size, + fd2, file2, skip2, sb2.st_size); +#endif +/* exit(0); */ +} + +static void +#ifndef __STDC__ +usage() +#else +usage(void) +#endif +{ + + (void)fprintf(stderr, +#ifndef __GNO__ + "usage: cmp [-l | -s] file1 file2 [skip1 [skip2]]\n"); +#else + "usage: cmp [-l | -s] [-r] file1 file2 [skip1 [skip2]]\n"); +#endif + exit(ERR_EXIT); +} diff --git a/bin/cmp/cmp.desc b/bin/cmp/cmp.desc new file mode 100644 index 0000000..d84fe86 --- /dev/null +++ b/bin/cmp/cmp.desc @@ -0,0 +1,10 @@ +Name: cmp +Version: 2.0 (4 Aug 97) +Shell: GNO/ME +Author: Evan Day (from FreeBSD source) +Contact: day@engr.orst.edu +Where: /bin +FTP: + + cmp compares and reports differences in the dataforks and resource forks + of two files. diff --git a/bin/cmp/cmp.rez b/bin/cmp/cmp.rez new file mode 100644 index 0000000..246fabc --- /dev/null +++ b/bin/cmp/cmp.rez @@ -0,0 +1,33 @@ +/* + * $Id: cmp.rez,v 1.1 1997/10/03 05:13:23 gdr Exp $ + */ +#include "Types.Rez" +#include "proginfo.rez" + +resource rVersion (0x1, purgeable3, nocrossbank) { + + { 2, 0, 0, /* version 1.0.0 */ + release, /* development|alpha|beta|final|release */ + 0 /* non-final release number */ + }, + verUS, /* country code -- only some are avail */ + "cmp", /* name */ + /* _Very_ brief descrition. Check "file info" */ + /* shown in the Finder to see if it's too long */ + /* Note that \n is used to separate lines here. */ + "Compares two files on disk.\n" + "Requires GNO/ME Shell.\n" + "Evan Day " +}; + +resource rProgramInfo (0x1, purgeable3, nocrossbank) { + { 6, 0, 1, + release, + 0 + }, + 30270, + 32768, + 1280, + progRequiresGNO+progAppleTalkOK+progAllowsCDAs, + piCompatible*ProgShellGSH+piSpecialFeatures*ProgShellGSH +}; diff --git a/bin/cmp/extern.h b/bin/cmp/extern.h new file mode 100644 index 0000000..899bb41 --- /dev/null +++ b/bin/cmp/extern.h @@ -0,0 +1,51 @@ +/*- + * Copyright (c) 1991, 1993, 1994 + * The Regents of the University of California. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. All advertising materials mentioning features or use of this software + * must display the following acknowledgement: + * This product includes software developed by the University of + * California, Berkeley and its contributors. + * 4. Neither the name of the University nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * @(#)extern.h 8.3 (Berkeley) 4/2/94 + */ + +#define OK_EXIT 0 +#define DIFF_EXIT 1 +#define ERR_EXIT 2 /* error exit code */ + +void c_regular __P((int, char *, off_t, off_t, int, char *, off_t, off_t)); +void c_special __P((int, char *, off_t, int, char *, off_t)); +void diffmsg __P((char *, char *, off_t, off_t)); +void eofmsg __P((char *)); +#ifdef __GNO__ +void rcmp __P((int *, int *, char *, char *)); +#endif + +extern int lflag, sflag; +#ifdef __GNO__ +extern int rflag; +#endif diff --git a/bin/cmp/misc.c b/bin/cmp/misc.c new file mode 100644 index 0000000..e34866d --- /dev/null +++ b/bin/cmp/misc.c @@ -0,0 +1,85 @@ +/*- + * Copyright (c) 1991, 1993, 1994 + * The Regents of the University of California. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. All advertising materials mentioning features or use of this software + * must display the following acknowledgement: + * This product includes software developed by the University of + * California, Berkeley and its contributors. + * 4. Neither the name of the University nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + */ + +/* + * part of cmp for GNO/ME v2.0.6 + * + * $Id: misc.c,v 1.1 1997/10/03 05:13:23 gdr Exp $ + */ + +#ifndef __GNO__ +#ifndef lint +static char sccsid[] = "@(#)misc.c 8.3 (Berkeley) 4/2/94"; +#endif /* not lint */ +#endif + +#include + +#include +#include +#include + +#include "extern.h" + +void +#ifndef __STDC__ +eofmsg(file) + char *file; +#else +eofmsg(char *file) +#endif +{ + if (!sflag) + warnx("EOF on %s", file); + exit(DIFF_EXIT); +} + +void +#ifndef __STDC__ +diffmsg(file1, file2, byte, line) + char *file1, *file2; + off_t byte, line; +#else +diffmsg(char *file1, char *file2, off_t byte, off_t line) +#endif +{ + if (!sflag) +#ifndef __ORCAC__ + (void)printf("%s %s differ: char %qd, line %qd\n", + file1, file2, byte, line); +#else + (void)printf("[%s] %s differ: %s char %ld, line %ld\n", + (rflag==2) ? "resfork" : "datafork", file1, file2, byte, line); +#endif + exit(DIFF_EXIT); +} diff --git a/bin/cmp/rcmp.c b/bin/cmp/rcmp.c new file mode 100644 index 0000000..36dbd4c --- /dev/null +++ b/bin/cmp/rcmp.c @@ -0,0 +1,52 @@ +/* + * rcmp.c + * + * Opens the resource forks of two files and sets the file descriptors to + * the open forks (if present). + * + * Catches files with no resource fork. + * + * Part of cmp for GNO/ME v2.0.6 + * + * $Id: rcmp.c,v 1.1 1997/10/03 05:13:23 gdr Exp $ + */ + +#include + +#include +#include +#include +#include "extern.h" + +static GSString255 path; + +void rcmp(int *fd1, int *fd2, char *file1, char *file2) +{ + OpenRecGS ropen = {4, 0, &path, readEnable, 1}; + + strcpy(path.text, file1); + path.length = strlen(file1); + OpenGS(&ropen); + *fd1 = ropen.refNum; + + strcpy(path.text, file2); + path.length = strlen(file2); + OpenGS(&ropen); + *fd2 = ropen.refNum; + + if(*fd1 == 0) + if(*fd2 == 0) + return; + else { + (void) printf("%s has a resource fork, %s does not.\n", + file2, file1); + return; + } + else if(*fd2 == 0) { + (void) printf("%s has a resource fork, %s does not.\n", file1, + file2); + return; + } + + c_special(*fd1, file1, 0, *fd2, file2, 0); +} diff --git a/bin/cmp/regular.c b/bin/cmp/regular.c new file mode 100644 index 0000000..1fca511 --- /dev/null +++ b/bin/cmp/regular.c @@ -0,0 +1,156 @@ +/*- + * Copyright (c) 1991, 1993, 1994 + * The Regents of the University of California. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. All advertising materials mentioning features or use of this software + * must display the following acknowledgement: + * This product includes software developed by the University of + * California, Berkeley and its contributors. + * 4. Neither the name of the University nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * $Id: regular.c,v 1.1 1997/10/03 05:13:23 gdr Exp $ + */ + +#ifndef lint +static char sccsid[] = "@(#)regular.c 8.3 (Berkeley) 4/2/94"; +#endif /* not lint */ + +#include +#ifndef __GNO__ +#include +#endif +#include + +#include +#include +#include +#include +#include +#include + +#include "extern.h" + +#define ROUNDPAGE(i) ((i) & ~pagemask) + +void +#ifndef __STDC__ +c_regular(fd1, file1, skip1, len1, fd2, file2, skip2, len2) + int fd1, fd2; + char *file1, *file2; + off_t skip1, len1, skip2, len2; +#else +c_regular(int fd1, char *file1, off_t skip1, off_t len1, int fd2, char *file2, + off_t skip2, off_t len2) +#endif +{ +#ifndef __GNO__ + u_char ch, *p1, *p2; +#else + u_char ch, p1, p2; +#endif + off_t byte, length, line; + int dfound; + off_t pagemask, off1, off2; + + if (sflag && len1 != len2) + exit(1); + + if (skip1 > len1) + eofmsg(file1); + len1 -= skip1; + if (skip2 > len2) + eofmsg(file2); + len2 -= skip2; + + pagemask = (off_t)getpagesize() - 1; + off1 = ROUNDPAGE(skip1); + off2 = ROUNDPAGE(skip2); + + length = MIN(len1, len2); +#ifndef __ORCAC__ + if (length > SIZE_T_MAX) + return (c_special(fd1, file1, skip1, fd2, file2, skip2)); +#else + if (length > SIZE_T_MAX) { + c_special(fd1, file1, skip1, fd2, file2, skip2); + return; + } +#endif + +#ifndef __GNO__ + if ((p1 = (u_char *)mmap(NULL, + (size_t)length, PROT_READ, MAP_SHARED, fd1, off1)) == (u_char *)MAP_FAILED) + err(ERR_EXIT, "%s", file1); + + madvise(p1, length, MADV_SEQUENTIAL); + if ((p2 = (u_char *)mmap(NULL, + (size_t)length, PROT_READ, MAP_SHARED, fd2, off2)) == (u_char *)MAP_FAILED) + err(ERR_EXIT, "%s", file2); + madvise(p2, length, MADV_SEQUENTIAL); + + dfound = 0; + p1 += skip1 - off1; + p2 += skip2 - off2; + for (byte = line = 1; length--; ++p1, ++p2, ++byte) { + if ((ch = *p1) != *p2) + if (lflag) { + dfound = 1; + (void)printf("%6qd %3o %3o\n", byte, ch, *p2); + } else + diffmsg(file1, file2, byte, line); + /* NOTREACHED */ + if (ch == '\n') + ++line; + } + + if (len1 != len2) + eofmsg (len1 > len2 ? file2 : file1); + if (dfound) + exit(DIFF_EXIT); +#else + dfound = 0; + lseek(fd1, skip1, SEEK_SET); + lseek(fd2, skip2, SEEK_SET); + for (byte = line = 1; length--; ++byte) { + read(fd1, (void *) &p1, 1); + read(fd2, (void *) &p2, 1); + if (p1 != p2) + if (lflag) { + dfound = 1; + (void)printf("%6qd %3o %3o\n", byte, ch, p2); + } else + diffmsg(file1, file2, byte, line); + /* NOTREACHED */ + if (p1 == '\n') + ++line; + } + + if (len1 != len2) + eofmsg (len1 > len2 ? file2 : file1); + if (dfound) + exit(DIFF_EXIT); +#endif + +} diff --git a/bin/cmp/special.c b/bin/cmp/special.c new file mode 100644 index 0000000..e5a91de --- /dev/null +++ b/bin/cmp/special.c @@ -0,0 +1,116 @@ +/*- + * Copyright (c) 1991, 1993, 1994 + * The Regents of the University of California. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. All advertising materials mentioning features or use of this software + * must display the following acknowledgement: + * This product includes software developed by the University of + * California, Berkeley and its contributors. + * 4. Neither the name of the University nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + */ + +/* + * Part of cmp for GNO/ME v2.0.6 + * + * $Id: special.c,v 1.1 1997/10/03 05:13:23 gdr Exp $ + */ + +#ifndef __GNO__ +#ifndef lint +static char sccsid[] = "@(#)special.c 8.3 (Berkeley) 4/2/94"; +#endif /* not lint */ +#endif + +#include + +#include +#include +#include +#include + +#include "extern.h" + +void +#ifndef __STDC__ +c_special(fd1, file1, skip1, fd2, file2, skip2) + int fd1, fd2; + char *file1, *file2; + off_t skip1, skip2; +#else +c_special(int fd1, char *file1, off_t skip1, int fd2, char *file2, off_t skip2) +#endif +{ + int ch1, ch2; + off_t byte, line; + FILE *fp1, *fp2; + int dfound; + + if ((fp1 = fdopen(fd1, "r")) == NULL) + err(ERR_EXIT, "%s", file1); + if ((fp2 = fdopen(fd2, "r")) == NULL) + err(ERR_EXIT, "%s", file2); + + dfound = 0; + while (skip1--) + if (getc(fp1) == EOF) + goto eof; + while (skip2--) + if (getc(fp2) == EOF) + goto eof; + + for (byte = line = 1;; ++byte) { + ch1 = getc(fp1); + ch2 = getc(fp2); + if (ch1 == EOF || ch2 == EOF) + break; + if (ch1 != ch2) { + if (lflag) { + dfound = 1; +#ifndef __GNO__ + (void)printf("%6qd %3o %3o\n", byte, ch1, ch2); +#else + (void)printf("%c%6ld %3o %3o\n", (rflag==2)? 'R' : 'D', byte, ch1, ch2); +#endif + } else + diffmsg(file1, file2, byte, line); + /* NOTREACHED */ + } + if (ch1 == '\n') + ++line; + } + +eof: if (ferror(fp1)) + err(ERR_EXIT, "%s", file1); + if (ferror(fp2)) + err(ERR_EXIT, "%s", file2); + if (feof(fp1)) { + if (!feof(fp2)) + eofmsg(file1); + } else + if (feof(fp2)) + eofmsg(file2); + if (dfound) + exit(DIFF_EXIT); +}