+-+-+-+ Beginning of part 6 +-+-+-+ X Match[] (0 .. lines in fileA): X X 0 1 3 0 5 0 6 X X Output is as follows: X X 1a2 X > line 1.5 inserted X 3c4 X < line 3 X --- X > line 3 changed X 5d5 X < line 5 gets deleted X X******************************************************************** X X/* X * `009 s t r e q . c X */ X X XString Equality Test XString equality test X XSynopsis: X streq(a, b); X char `009*a; X char `009*b; X XDescription: X X Return TRUE if the strings are equal. X XBugs X X*************************************************************** X X/* X * `009 e r r o r . c X */ X X XFatal Error Exit X X`009Synopsis: X X `009_error() X X `009error(format, args) X X X X X X X XJan 13 13:00 1988 CDIFF.MEM Page 6 X X X `009char `009*format; X X`009Documentation: X X `009Fatal error exits. _error() halts, error() prints something X `009on stderr and then halts. X X`009Bugs: X X `009THIS DOES NOT WORK ON MANY SYSTEMS DUE TO EXTREMLY NON-PORTABLE CODE. X `009Why oh why can't people learn to use varargs properly? This code will X `009blow up on OSK. Fortunatly, it isn't used often... X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X $ GOSUB UNPACK_FILE $ FILE_IS = "MAKEFILE." $ CHECKSUM_IS = 522592102 $ COPY SYS$INPUT VMS_SHARE_DUMMY.DUMMY X# X# Makefile for Public Domain Diff X# X# the two 'include' directive are for these USG 5.3 machines (or 3B1) which X# have shared libraries. Comment them out if you do not have shared X# libraries on your system. X X# VMS won't run this if optimizer is turned on. X*.obj : *.c X cc/noopt $* X X#include $(MAKEINC)/Makepre.h X X# V# You may want to use one or more of the following definitions when compiling X, V# depending on what your target environment is, and whether you want debuggin Xg X# turned on or off. X# X# TURBO - compile for TURBO C target (See TC-READ.ME for details) X# AMIGA - compile for AMIGA target X# OSK - compile for OSK X# DEBUG - turn on debugging (implies TIMING) X# TIMING - turn on timing code X# MSC - Microsoft C 4.0 (small model support) X# X# additional support for vax, or pdp11 are invoked by defining 'vax' X# or 'pdp11'. These should be defined by your preprocessor if you are X# on one of these machines. X# X# CFLAGS = -O -DTURBOC X# CFLAGS = X#LDFLAGS = -s X X# The first line ('cc ...') is for standard C compilers, the second line X# ('$(LD) ...') is for shared library machines. Use whichever line is X# appropriate for your system and comment the other one out. X Xdiff: diff.obj X link diff,user$com:options_file/opt X# cc $(LDFLAGS) diff.o -o diff X# $(LD) $(SHAREDLIB) $(LDFLAGS) diff.o -o diff X Xclean: X del *.obj;*,diff.exe;* X X#include $(MAKEINC)/Makepost.h $ GOSUB UNPACK_FILE $ FILE_IS = "MAKEFILE.UNIX" $ CHECKSUM_IS = 506535843 $ COPY SYS$INPUT VMS_SHARE_DUMMY.DUMMY X# X# Makefile for Public Domain Diff X# X# the two 'include' directive are for these USG 5.3 machines (or 3B1) which X# have shared libraries. Comment them out if you do not have shared X# libraries on your system. X Xinclude $(MAKEINC)/Makepre.h X X# V# You may want to use one or more of the following definitions when compiling X, V# depending on what your target environment is, and whether you want debuggin Xg X# turned on or off. X# X#`009TURBO - compile for TURBO C target (See TC-READ.ME for details) X#`009AMIGA - compile for AMIGA target X#`009OSK - compile for OSK X#`009DEBUG - turn on debugging (implies TIMING) X#`009TIMING - turn on timing code X#`009MSC - Microsoft C 4.0 (small model support) X# X# additional support for vax, or pdp11 are invoked by defining 'vax' X# or 'pdp11'. These should be defined by your preprocessor if you are X# on one of these machines. X# X# CFLAGS = -O -DTURBOC XCFLAGS = -O XLDFLAGS = -s X X# The first line ('cc ...') is for standard C compilers, the second line X# ('$(LD) ...') is for shared library machines. Use whichever line is X# appropriate for your system and comment the other one out. X Xdiff: diff.o X#`009cc $(LDFLAGS) diff.o -o diff X`009$(LD) $(SHAREDLIB) $(LDFLAGS) diff.o -o diff X Xclean: X`009rm -f *.o a.out core diff X Xinclude $(MAKEINC)/Makepost.h $ GOSUB UNPACK_FILE $ FILE_IS = "NAU.DIFFS" $ CHECKSUM_IS = 1733650005 $ COPY SYS$INPUT VMS_SHARE_DUMMY.DUMMY X*** diff.c_orig X--- diff.c X************** X*** 17,22 X #endif /* TURBO */ X X #ifdef vms X #include `009 X #include `009 X #define IO_SUCCESS (SS `124 STS) X--- 17,24 ----- X #endif /* TURBO */ X X #ifdef vms V+ /* Strange, this code doesn't seem to work on VMS unless /NOOPTIMIZE is use Xd*/ X+ #include "user$utils:redexp.vms" /* NAU extension */ X #include X #include X #define IO_SUCCESS 1 /* (SS `124 STS) */ X************** X*** 19,26 X #ifdef vms X #include `009 X #include `009 X! #define IO_SUCCESS (SS `124 STS) X! #define IO_ERROR SS X #endif /* vms */ X X /* X--- 21,28 ----- X #include "user$utils:redexp.vms" /* NAU extension */ X #include X #include X! #define IO_SUCCESS 1 /* (SS `124 STS) */ X! #define IO_ERROR 1 /* SS */ X #endif /* vms */ X X /* X************** X*** 88,93 X #ifdef TURBO X extern void *malloc(); X #else /* !TURBO */ X extern char *malloc(); X #endif /* TURBO */ X X--- 90,99 ----- X #ifdef TURBO X extern void *malloc(); X #else /* !TURBO */ X+ #ifdef VMS X+ extern void *malloc(); X+ extern void *realloc(); X+ #else /* !VMS */ X extern char *malloc(); X #endif /*VMS*/ X #endif /* TURBO */ X************** X*** 89,94 X extern void *malloc(); X #else /* !TURBO */ X extern char *malloc(); X #endif /* TURBO */ X X char *fgetss(); X--- 95,101 ----- X extern void *realloc(); X #else /* !VMS */ X extern char *malloc(); X+ #endif /*VMS*/ X #endif /* TURBO */ X X char *fgetss(); X************** X*** 150,155 X long sectiontime; X char *mstart; X #endif /* TIMING */ X void`009`009`009free(); X void`009`009`009exit(); X #ifndef OSK X--- 157,163 ----- X long sectiontime; X char *mstart; X #endif /* TIMING */ X+ #ifndef VMS X void free(); X #endif X void exit(); X************** X*** 151,156 X char *mstart; X #endif /* TIMING */ X void`009`009`009free(); X void`009`009`009exit(); X #ifndef OSK X void`009`009`009perror(); X--- 159,165 ----- X #endif /* TIMING */ X #ifndef VMS X void free(); X+ #endif X void exit(); X #ifndef OSK X void perror(); X************** X*** 162,168 X X main(argc, argv) X `009int argc; X! `009char **argv; X `123 X `009register int i; X `009register char *ap; X--- 171,177 ----- X X main(argc, argv) X int argc; X! char *argv[]; X `123 X register int i; X register char *ap; X************** X*** 175,181 X `009sectiontime = time(&totaltime); X #endif /* TIMING */ X #ifdef vms X! `009argc = getredirection(argc, argv); X #endif /* vms */ X `009while (argc > 1 && *(ap = argv[1]) == '-' && *++ap != EOS) `123 X `009`009while (*ap != EOS) `123 X--- 184,190 ----- X sectiontime = time(&totaltime); X #endif /* TIMING */ X #ifdef vms X! /* argc = getredirection(argc, argv); NAU, not done this way. */ X #endif /* vms */ X while (argc > 1 && *(ap = argv[1]) == '-' && *++ap != EOS) `123 X while (*ap != EOS) `123 X************** X*** 224,229 X `009`009`009if ((tempfd = fopen(TEMPFILE, "w")) == NULL) X `009`009`009`009cant(TEMPFILE, "work", 1); X `009`009`125 else `123 X `009`009`009infd[i] = fopen(argv[i], "r"); X `009`009`009if (!infd[i]) X `009`009`009`009cant(argv[i], "input", 2);`009`009/* Fatal error */ X--- 233,239 ----- X if ((tempfd = fopen(TEMPFILE, "w")) == NULL) X cant(TEMPFILE, "work", 1); X `125 else `123 X+ /* On VMS, the following line will crash unless compiled with /NOOPT! */ X infd[i] = fopen(argv[i], "r"); X if (!infd[i]) V cant(argv[i], "input", 2); /* X Fatal error */ X************** X*** 352,357 X #endif /* OSK */ X #endif /* unxi */ X `009`125 X `009return(0); X `125 X X--- 362,370 ----- X #endif /* OSK */ X #endif /* unxi */ X `125 X+ #ifdef VMS X+ return(1); X+ #else X return(0); X #endif X `125 X************** X*** 353,358 X #endif /* unxi */ X `009`125 X `009return(0); X `125 X X X--- 366,372 ----- X return(1); X #else X return(0); X+ #endif X `125 X X X************** X*** 796,801 X * next one (as in DECUS C or, effectively, other C's). Hence, the values X * are "off by one" in the array. OFFSET compensates for this. X */ X X #ifdef vms X #define OFFSET (-1) X--- 810,819 ----- X * next one (as in DECUS C or, effectively, other C's). Hence, the values X * are "off by one" in the array. OFFSET compensates for this. X */ V+ /* This is not the "right" solution. VMS ftell is broken such that STREAM- XLF V+ works, even if others do not. What we'll do is use the standard workaround X. X+ (ungetc(getc(fid),fid); X+ */ X X #ifdef vms X #define OFFSET 0 X************** X*** 798,805 X */ X X #ifdef vms X- #define OFFSET (-1) X- #else /* !vms */ X #define OFFSET 0 X #endif /* vms */ X X--- 816,821 ----- X */ X X #ifdef vms X #define OFFSET 0 X #else /* !vms */ X #define OFFSET 0 X************** X*** 801,806 X #define OFFSET (-1) X #else /* !vms */ X #define OFFSET 0 X #endif /* vms */ X X `009b = 1; X--- 817,824 ----- X X #ifdef vms X #define OFFSET 0 X+ #else /* !vms */ X+ #define OFFSET 0 X #endif /* vms */ X X b = 1; X************** X*** 806,814 X `009b = 1; X `009rewind(infd[0]); X `009rewind(infd[1]); X- /* X- * See above; these would be over-written on VMS anyway. X- */ X X #ifndef vms X `009oldseek[0] = ftell(infd[0]); X--- 824,829 ----- X b = 1; X rewind(infd[0]); X rewind(infd[1]); X X #ifdef VMS X ungetc(getc(infd[0]),infd[0]); X************** X*** 810,816 X * See above; these would be over-written on VMS anyway. X */ X X! #ifndef vms X `009oldseek[0] = ftell(infd[0]); X `009newseek[0] = ftell(infd[1]); X #endif /* vms */ X--- 825,833 ----- X rewind(infd[0]); X rewind(infd[1]); X X! #ifdef VMS X! ungetc(getc(infd[0]),infd[0]); X! #endif VMS X oldseek[0] = ftell(infd[0]); X #ifdef VMS X ungetc(getc(infd[1]),infd[1]); X************** X*** 812,817 X X #ifndef vms X `009oldseek[0] = ftell(infd[0]); X `009newseek[0] = ftell(infd[1]); X #endif /* vms */ X X--- 829,837 ----- X ungetc(getc(infd[0]),infd[0]); X #endif VMS X oldseek[0] = ftell(infd[0]); X+ #ifdef VMS X+ ungetc(getc(infd[1]),infd[1]); X+ #endif VMS X newseek[0] = ftell(infd[1]); X X jackpot = 0; X************** X*** 813,819 X #ifndef vms X `009oldseek[0] = ftell(infd[0]); X `009newseek[0] = ftell(infd[1]); X- #endif /* vms */ X X `009jackpot = 0; X #ifdef DEBUG X--- 833,838 ----- X ungetc(getc(infd[1]),infd[1]); X #endif VMS X newseek[0] = ftell(infd[1]); X X jackpot = 0; X #ifdef DEBUG X************** X*** 824,829 X `009for (a = 1; a <= lenA; a++) `123 X `009`009if (match[a] == 0) `123 X `009`009`009/* Unique line in A */ X `009`009`009oldseek[a + OFFSET] = ftell(infd[0]); X `009`009`009getline(infd[0], text); X `009`009`009continue; X--- 843,851 ----- X for (a = 1; a <= lenA; a++) `123 X if (match[a] == 0) `123 X /* Unique line in A */ X+ #ifdef VMS X+ ungetc(getc(infd[0]),infd[0]); X+ #endif /*vms */ X oldseek[a + OFFSET] = ftell(infd[0]); X getline(infd[0], text); X continue; X************** X*** 830,835 X `009`009`125 X `009`009while (b < match[a]) `123 X `009`009`009/* Skip over unique lines in B */ X `009`009`009newseek[b + OFFSET] = ftell(infd[1]); X `009`009`009getline(infd[1], textb); X `009`009`009b++; X--- 852,860 ----- X `125 X while (b < match[a]) `123 X /* Skip over unique lines in B */ X+ #ifdef VMS X+ ungetc(getc(infd[1]),infd[1]); X+ #endif /*vms */ X newseek[b + OFFSET] = ftell(infd[1]); X getline(infd[1], textb); X b++; X************** X*** 842,847 X `009`009 * jackpot occurs. X `009`009 */ X `009`009if (cflag) `123 X `009`009`009oldseek[a + OFFSET] = ftell(infd[0]); X `009`009`009newseek[b + OFFSET] = ftell(infd[1]); X `009`009`125 X--- 867,875 ----- X * jackpot occurs. X */ X if (cflag) `123 X+ #ifdef VMS X+ ungetc(getc(infd[0]),infd[0]); X+ #endif /*vms */ X oldseek[a + OFFSET] = ftell(infd[0]); X #ifdef VMS X ungetc(getc(infd[1]),infd[1]); X************** X*** 843,848 X `009`009 */ X `009`009if (cflag) `123 X `009`009`009oldseek[a + OFFSET] = ftell(infd[0]); X `009`009`009newseek[b + OFFSET] = ftell(infd[1]); X `009`009`125 X `009`009getline(infd[0], text); X--- 871,879 ----- X ungetc(getc(infd[0]),infd[0]); X #endif /*vms */ X oldseek[a + OFFSET] = ftell(infd[0]); X+ #ifdef VMS X+ ungetc(getc(infd[1]),infd[1]); X+ #endif /*vms */ X newseek[b + OFFSET] = ftell(infd[1]); X `125 X getline(infd[0], text); X************** X*** 859,864 X `009`009b++; X `009`125 X `009for (; b <= lenB; b++) `123 X `009`009newseek[b + OFFSET] = ftell(infd[1]); X `009`009getline(infd[1], textb); X `009`125 X--- 890,898 ----- X b++; X `125 X for (; b <= lenB; b++) `123 X+ #ifdef VMS X+ ungetc(getc(infd[1]),infd[1]); X+ #endif /*vms */ X newseek[b + OFFSET] = ftell(infd[1]); X getline(infd[1], textb); X `125 X************** X*** 868,874 X * we need one at EOF... X */ X X! #ifdef vms X `009oldseek[lenA] = ftell(infd[0]); X `009getline(infd[0], text);`009`009/* Will hit EOF... */ X `009newseek[lenB] = ftell(infd[1]); X--- 902,908 ----- -+-+-+-+-+ End of part 6 +-+-+-+-+-