*******************************************************************************
* SourceUpdate V1.13 - (c) 1991 by Michael Otto. A Utility Factory Production *
*******************************************************************************

SourceUpdate is a utility to protocol changes in text-files. SourceUpdate was
especially written to reduce transmission time of source codes via modem.

An example: User A writes a program and sends the lastest version of the source
code via modem to user B. User B has already got an older version of the source
code. It would be a waste to send always the WHOLE source code, as many parts
of the code are still similar.

As I already mentioned, SourceUpdate is used to detect similarities in the
newer and the older source code and write them to a file. This file and the
older files is used by user B to create the newest version of the source code.
This method implies, though, that user A has ALWAYS got the older AND the newer
version of the source. Keep that in mind, please!

SourceUpdate does not use an algorithm that does a byte-to-byte comparison, of
course, because that would lead up to poor "crunching" results. The method is
an algorithm I invented, so few things will be told about it.

SourceUpdate is able to handle source codes that consist of more than only one
file. The changes in all files are written to only ONE file (archive), like it
is done by real crunchers, like LHArc.

SourceUpdate can usually "crunch" files to about 40-70%, but this ratio depends
-amongst other things- on the similarity of the newer and older files. You may
now think "Oh, 40-70%, that's not much - LHArc does much better in crunching my
files". That's true, but... the archive created by SourceUpdate can and should
be re-crunched by LHArc afterwards (and will definitively bring good results!).
Normally, data transmission length and phone bill can be reduced by 80%.

The syntax for updating files is:

   SourceUpdate a[a] <archive> <files/patterns> <older version-dir>
                ^ ^
                | |
                +-+- (a=add files)
                  |
                  +- (a=update all files [see below])

An example: You (user A) have got the files "main.c" "rarely.c" and "often.c"
in the actual directory. In the directory "Old_Version" there are older
versions of these files - those, which user B has already got.

The file "rarely.c" has not been changed in comparison to the "older" version.
The other files have been changed. When you now enter

   SourceUpdate a ram:MyUpdate.UPD main.c rarely.c often.c Old_Version

then the entered files will be compared to their equivalents in the directory
'Old_Version' and the changes will be written to "MyUpdate.UPD" (where .UPD
can be left out). Since "rarely.c" has not been changed, it will not be
included in the archive. If the update of the file got longer than the
original file, it would also be left out. You can force SourceUpdate to include
ALL files by entering 'aa' instead of 'a' as the first parameter.

The files to be updated can also be specified by wildcards (e.g. SourceUpdate a
ram:MyUpdate.UPD *.c Old_Version). But - ALL FILES TO BE UPDATED HAVE (yet) TO
BE IN THE ACTUAL DIRECTORY! So don't try something like "SourceUpdate a
ram:MyUpdate.UPD /ufc32.lib df1:my_program Old_Version".

Do not mix up the 'a' option of SourceUpdate with LHArc's 'a' option, because
SourceUpdate will always create a new UPD-archive file and will not add new
files to an existing archive.

Now you should crunch MyUpdate.UPD with LHArc and add those files to the LHArc
archive, which were not included in the SourceUpdate archive because they got
too long. Then transmit the LHArc archive to user B. Afterwards copy all
updated files to your 'Old_Version'-directory (important!).

Now user B has to unpack the LHArc archive and copy all files except for the
SourceUpdate archive e.g. to the ram: disk. Now user B is to enter (generally)

   SourceUpdate x <archive> <older version-dir> <destination-dir>

or more concretely:

   SourceUpdate x MyUpdate.UPD <source-dir [old version]> ram:

Now all updated files are unpacked and copied to ram. The ram: disk should now
be copied to the user's actual source directory, which then holds the latest
version of the source code of user A. User B HAS TO make a copy of this
directory, because ««« NO "old version" FILES MUST BE CHANGED »»», since
SourceUpdate needs the same old files for packing as for unpacking!

If you keep all these things in mind, then source code transmission will
become much faster and cheaper!

The algorithm used by SourceUpdate works best with text files, though
executables may be updated either - but with worse results. Sorry, but that is
caused by their relocability.

Of course there's no need to update only source codes. You may update
documentation files, etc. etc. or use SourceUpdate for updating parts of
harddisk-backups.

*******************************************************************************

Use this program at your own risk. I will especially not take any
responsibility for mutilated source codes. No trust?

SourceUpdate is FREEWARE, i.e. the copyright is reserved. But you may copy
SourceUpdate to anyone you like. SourceUpdate must not be distributed in PD
series without my permission. This permission will not be given to persons or
firms who take more than DM 4 (US $3) for any of their PD disks.

Send bug reports, hints, grown up sisters, creditcards, blue boxes, teddybears,
hispeed modems, mitropa duschhauben/kaffeemaschinen or any other tokens to

   Michael Otto, Holländische Twiete 6a, 2054 Geesthacht, Germoney
   or to MICHAEL_OTTO@ANM.ZER

*********************************** HISTORY ***********************************

V1.03: - crunching algorithm optimized
       - does better crunching of executables now
       - files that got just some bytes longer than the original are now
         included in the archive, because LHArc also needs some extra bytes
         for every archive entry

V1.1:  - crunching speed increased by factor upto 4
         (executables slower, though)
       - further improved crunching algorithm
         does better with files that changed only little

V1.12: - crunching algorithm bug fixed
       - crunching algorithm improved:
         does now generally better and crunches files to about 1/3 of V1.00

V1.13: - crunching algorithm bug fixed
         (sourceupdates history seems to be a history of endless bux fixes
          and algorithm improvements...)

************************************* END *************************************

Post Scriptum: Special thanks to Daniel Hanisch for being "user B".

********************************** REAL END ***********************************

