(⚠ outdated copy from original tarball) INSTALLATION 1) Change makefile settings to reflect ATT vs. BSD software termio vs. termcap MGR vs. no MGR (MGR is a BELLCORE produced window manager that is also available free to the public.) 2) Then, just say "make". If you want to "make install", you should first change definition of INSDIR in the makefile 3) to test the software say spiff Sample.1 Sample.2 spiff should find 4 differences and you should see the words "added", "deleted", "changed", and "altered" as well as four number in stand-out mode. spiff Sample.1 Sample.2 | cat should produce the same output, only the differences should be underlined However, on many terminals the underlining does not appear. So try the command spiff Sample.1 Sample.2 | cat -v or whatever the equivalent to cat -v is on your system. A more complicated test set is found in Sample.3 and Sample.4 These files show how to use embedded commands to do things like change the commenting convention and tolerances on the fly. Be sure to run the command with the -s option to spiff: spiff -s 'command spiffword' Sample.3 Sample.4 These files by no means provide an exhaustive test of spiff's features. But they should give you some idea if things are working right. This code (or it's closely related cousins) has been run on Vaxen running 4.3BSD, a CCI Power 6, some XENIX machines, and some other machines running System V derivatives as well as (thanks to eugene@ames.arpa) Cray, Amdahl and Convex machines. 4) Share and enjoy. AUTHOR'S ADDRESS Please send complaints, comments, praise, bug reports, etc to Dan Nachbar Bell Communications Research (also known as BELLCORE) 445 South St. Room 2B-389 Morristown, NJ 07960 nachbar@bellcore.com or bellcore!nachbar or (201) 829-4392 (praise only, please) OVERVIEW OF OPERATION Each of two input files is read and stored in core. Then it is parsed into a series of tokens (literal strings and floating point numbers, white space is ignored). The token sequences are stored in core as well. After both files have been parsed, a differencing algorithm is applied to the token sequences. The differencing algorithm produces an edit script, which is then passed to an output routine. SIZE LIMITS AND OTHER DEFAULTS file implementing limit name default value maximum number of lines lines.h _L_MAXLINES 10000 per file maximum number of tokens token.h K_MAXTOKENS 50000 per file maximum line length misc.h Z_LINELEN 1024 maximum word length misc.h Z_WORDLEN 20 (length of misc buffers for things like literal delimiters. NOT length of tokens which can be virtually any length) default absolute tolerance tol.h _T_ADEF "1e-10" default relative tolerance tol.h _T_RDEF "1e-10" maximum number of commands command.h _C_CMDMAX 100 in effect at one time maximum number of commenting comment.h W_COMMAX 20 conventions that can be in effect at one time (not including commenting conventions that are restricted to beginning of line) maximum number of commenting comment.h W_BOLMAX 20 conventions that are restricted to beginning of line that are in effect at one time maximum number of literal comment.h W_LITMAX 20 string conventions that can be in effect at one time maximum number of tolerances tol.h _T_TOLMAX 10 that can be in effect at one time DIFFERENCES BETWEEN THE CURRENT VERSION AND THE ENCLOSED PAPER The files paper.ms and paper.out contain the nroff -ms input and output respectively of a paper on spiff that was given the Summer '88 USENIX conference in San Francisco. Since that time many changes have been made to the code. Many flags have changed and some have had their meanings reversed, see the enclosed man page for the current usage. Also, there is no longer control over the granularity of object used when applying the differencing algorithm. The current version of spiff always applies the differencing in terms of individual tokens. The -t flag controls how the edit script is printed. This arrangement more closely reflects the original intent of having multiple differencing granularities. PERFORMANCE Spiff is big and slow. It is big because all the storage is in core. It is a straightforward but boring task to move the temporary storage into a file. Someone who cares is invited to take on the job. Spiff is slow because whenever a choice had to be made between speed of operation and ease of coding, speed of operation almost always lost. As the program matures it will almost certainly get smaller and faster. Obvious performance enhancements have been avoided in order to make the program available as soon as possible. COPYRIGHT Our lawyers advise the following: Copyright (c) 1988 Bellcore All Rights Reserved Permission is granted to copy or use this program, EXCEPT that it may not be sold for profit, the copyright notice must be reproduced on copies, and credit should be given to Bellcore where it is due. BELLCORE MAKES NO WARRANTY AND ACCEPTS NO LIABILITY FOR THIS PROGRAM. Given that all of the above seems to be very reasonable, there should be no reason for anyone to not play by the rules. NAMING CONVENTIONS USED IN THE CODE All symbols (functions, data declarations, macros) are named as follows: L_foo -- for names exported to other modules and possibly used inside the module as well. _L_foo -- for names used by more than one routine within a module foo -- for names used inside a single routine. Each module uses a different value for "L" -- module files letter used implements spiff.c Y top level routines misc.[ch] Z various routines used throughout strings.[ch] S routines for handling strings edit.h E list of changes found and printed tol.[ch] T tolerances for real numbers token.[ch] K storage for objects float.[ch] F manipulation of floats floatrep.[ch] R representation of floats line.[ch] L storage for input lines parse.[ch] P parse for input files command.[ch] C storage and recognition of commands comment.[ch] W comment list maintenance compare.[ch] X comparisons of a single token exact.[ch] Q exact match differencing algorithm miller.[ch] G miller/myers differencing algorithm output.[ch] O print listing of differences flagdefs.h U define flag bits that are used in several of the other modules. These #defines could have been included in misc.c, but were separated out because of their explicit communication function. visual.[ch] V screen oriented display for MGR window manager, also contains dummy routines for people who don't have MGR I haven't cleaned up visual.c yet. It probably doesn't even compile in this version anyway. But since most people don't have mgr, this isn't urgent. NON-OBVIOUS DATA STRUCTURES The Floating Point Representation Floating point numbers are stored in a struct R_flstr The fractional part is often called the mantissa. The structure consists of a flag for the sign of the factional part the exponent in binary a character string containing the fractional part The structure could be converted to a float via atof(strcat(".",mantissa)) * (10^exponent) To be properly formed, the mantissa string must: start with a digit between 1 and 9 (i.e. no leading zeros) except for the zero, in which case the mantissa is exactly "0" for the special case of zero, the exponent is always 0, and the sign is always positive. (i.e. no negative 0) In other words, (except for the value 0) the mantissa is a fractional number ranging between 0.1 (inclusive) and 1.0 (exclusive). The exponent is interpreted as a power of 10. Lines there are three sets of lines: implemented in line.c and line.h real_lines -- the lines as they come from the file content_lines -- a subset of reallines that excluding embedded commands implemented in token.c and token.h token_lines -- a subset of content_lines consisting of those lines that have tokens that begin on them (literals can go on for more than one line) i.e. content_lines excluding comments and blank lines. THE STATE OF THE CODE Things that should be added visual mode should handle tabs and wrapped lines handling huge files in chunks when in using the ordinal match algorithm. right now you have to parse and then diff the whole thing before you get any output. often, you run out of memory. Things that would be nice to add output should optionally be expressed in real line numbers (i.e. including command lines) at present, all storage is in core. there should be a compile time decision to allow temporary storage in files rather than core. that way the user could decide how to handle the speed/space tradeoff a front end that looked like diff should be added so that one could drop spiff into existing shell scripts the parser converts floats into their internal form even when it isn't necessary. in the miller/myer code, the code should check for matching end sequences. it currently looks matching beginning sequences. Minor programming improvements (programming botches) some of the #defines should really be enumerated types all the routines in strings.c that alter the data at the end of a pointer but return void should just return the correct data. the current arrangement is a historical artifact of the days when these routines returned a status code. but then the code was never examined, so i made them void . . . comments should be added to the miller/myer code in visual mode, ask for font by name rather than number