| 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 |