home *** CD-ROM | disk | FTP | other *** search
- /* This is the most simple file difference program conceivable. Well,
- almost, anyway. It compares the two files specified on the command
- line, and returns an error code, based upon what it finds, to the
- operating system. If this program is embedded within a batch file,
- that file can examine this error code, and do something appropriate.
-
- Here is the calling sequence of the program:
-
- dif [d:][path]filename1 [d:][path]filename2
-
- The quantites enclosed in square brackets, [], are, of course,
- optional. For example, suppose the first file is named sooie.dat,
- and it resides on the a: drive, and the second file is named
- suekaren.dat, and it's in subdirectory \astro\data on the current
- drive. Then, the calling sequence would be:
-
- dif a:sooie.dat \astro\data\suekaren.dat
-
- The program returns one of five error codes, numbered 0 through 4,
- which have the following meanings.
-
- 4 Invalid command line syntax. Either too
- many or too few parameters were given.
-
- 3 At least one of the files specified does
- not exist.
-
- 2 The two files are not even of the same
- size. They are compared no further than
- this.
-
- 1 The files are of the same size, but there
- is a mismatch somewhere. This code is
- returned as soon as the first mismatch is
- discovered.
-
- 0 The files match perfectly; byte for byte.
- Absolutely no differences were found.
-
- It should be noted that files of *any* type may be compared with this
- program; text or binary, it matters not.
-
- The program was written for, and compiled and linked with,
-
- Aztec C86 Compiler
- Version 3.40b
-
-
- Charlie Ros5e
- P.O. Box 1636
- Boulder, Colorado, 80306
-
- 303-939-5448
-
- 88.02.08 Original release.
- */
-
- #include <stat.h>
- #include <stdio.h>
- #include <cerlib.h>
-
- #define Syntax 4 /* Error code definitions */
- #define NoExist 3 /* */
- #define SizeDiff 2 /* */
- #define Mismatch 1 /* */
- #define Match 0 /* */
-
-
- main(nargs, arg)
-
- char *arg[];
- int nargs;
- {
- char c1, c2; /* Bytes of comparison */
- int err_code = Match; /* The error code */
- long size1, size2, /* Sizes of the two files */
- k; /* Loop counter */
- FILE *fp1, *fp2; /* File pointers */
-
-
-
- /* Check for invalid command line syntax. */
-
- if( nargs != 3 )
- err_code = Syntax;
-
-
- /* Command line syntax is good. Continue with the other tests. */
-
- else
- {
-
- /* Compute the sizes of the two files. filesize() returns -1L if the
- specified file does not exist. The next two if()s test for file
- existence and size-match.
- */
-
- size1 = filesize( arg[1] );
- size2 = filesize( arg[2] );
-
- if( size1 == -1 || size2 == -1 )
- err_code = NoExist;
-
- else if( size1 != size2 )
- err_code = SizeDiff;
-
-
- /* Both files exist, and are of the same size. Now open them, and compare
- them byte-for-byte. If ever there is a mismatch, close the files imme-
- diately, set the error code, and break out of the for() loop.
- */
-
- else
- {
- fp1 = fopen(arg[1], "r");
- fp2 = fopen(arg[2], "r");
-
- for(k = 0L; k < size1; k++)
- {
- c1 = getc(fp1);
- c2 = getc(fp2);
-
- if( c1 != c2 )
- {
- err_code = Mismatch;
-
- fclose(fp1);
- fclose(fp2);
-
- break;
- }
- }
- }
- }
- exit(err_code);
- }
-
- /************************************************************************/
- /* */
- /* F i l e s i z e */
- /* */
- /************************************************************************/
-
- /* Purpose: To determine the size, in bytes, of a specified file.
-
- Calling Sequence: char *filename;
- long size, filesize();
-
- size = filesize(filename);
- */
-
- long filesize( filename )
-
- char *filename;
- {
- long size;
- struct stat buf;
-
- if(access(filename, 0))
- size = -1L;
-
- else
- {
- stat(filename, &buf);
- size = buf.st_size;
- }
-
- return(size);
- }