From 4fb6090b1e29454245f35ff0be5b46d229dea8c0 Mon Sep 17 00:00:00 2001 From: "Ryan C. Gordon" Date: Mon, 5 Jan 2004 18:54:18 +0000 Subject: [PATCH] Initial revision --- .DS_Store | Bin 0 -> 6148 bytes .gdb_history | 256 + Makefile | 72 + MojoPatch.app/Contents/Info.plist | 30 + MojoPatch.app/Contents/MacOS/mojopatch | Bin 0 -> 48204 bytes MojoPatch.app/Contents/MacOS/xdelta | Bin 0 -> 180689 bytes MojoPatch.app/Contents/PkgInfo | 1 + .../Resources/English.lproj/InfoPlist.strings | 6 + .../Contents/Resources/mojopatch.icns | Bin 0 -> 52625 bytes .../Resources/mojopatch.nib/classes.nib | 4 + .../Contents/Resources/mojopatch.nib/info.nib | 26 + .../Resources/mojopatch.nib/objects.xib | 86 + TODO | 6 + md5.c | 394 ++ md5.h | 115 + mojopatch.c | 2010 ++++++++ platform.h | 70 + platform_unix.c | 527 ++ platform_win32.c | 275 ++ test | Bin 0 -> 16100 bytes test.c | 69 + tmp.txt | 2 + ui.h | 27 + ui_carbon.c | 130 + ui_stdio.c | 67 + x.txt | 2777 +++++++++++ xdelta-1.1.3/.libs/libxdelta.lai | 28 + xdelta-1.1.3/AUTHORS | 3 + xdelta-1.1.3/COPYING | 339 ++ xdelta-1.1.3/ChangeLog | 0 xdelta-1.1.3/INSTALL | 217 + xdelta-1.1.3/Makefile | 629 +++ xdelta-1.1.3/Makefile.am | 50 + xdelta-1.1.3/Makefile.in | 629 +++ xdelta-1.1.3/NEWS | 208 + xdelta-1.1.3/README | 180 + xdelta-1.1.3/aclocal.m4 | 766 +++ xdelta-1.1.3/autogen.sh | 59 + xdelta-1.1.3/config.cache | 35 + xdelta-1.1.3/config.guess | 1121 +++++ xdelta-1.1.3/config.h | 11 + xdelta-1.1.3/config.h.in | 10 + xdelta-1.1.3/config.log | 76 + xdelta-1.1.3/config.status | 277 ++ xdelta-1.1.3/config.sub | 1232 +++++ xdelta-1.1.3/configure | 2774 +++++++++++ xdelta-1.1.3/configure.in | 91 + xdelta-1.1.3/djgpp/Makefile | 185 + xdelta-1.1.3/djgpp/Makefile.am | 2 + xdelta-1.1.3/djgpp/Makefile.in | 185 + xdelta-1.1.3/djgpp/announce.djg | 98 + xdelta-1.1.3/djgpp/readme.djg | 152 + xdelta-1.1.3/doc/Makefile | 231 + xdelta-1.1.3/doc/Makefile.am | 3 + xdelta-1.1.3/doc/Makefile.in | 231 + xdelta-1.1.3/doc/xdelta.1 | 195 + xdelta-1.1.3/doc/xdelta.cat | 138 + xdelta-1.1.3/getopt.c | 749 +++ xdelta-1.1.3/getopt.h | 129 + xdelta-1.1.3/getopt1.c | 180 + xdelta-1.1.3/install-sh | 251 + xdelta-1.1.3/libedsio/.libs/libedsio.lai | 28 + xdelta-1.1.3/libedsio/Makefile | 411 ++ xdelta-1.1.3/libedsio/Makefile.am | 52 + xdelta-1.1.3/libedsio/Makefile.in | 411 ++ xdelta-1.1.3/libedsio/base64.c | 525 ++ xdelta-1.1.3/libedsio/base64.lo | 1 + xdelta-1.1.3/libedsio/default.c | 378 ++ xdelta-1.1.3/libedsio/default.lo | 1 + xdelta-1.1.3/libedsio/edsio-comp | 46 + xdelta-1.1.3/libedsio/edsio-comp.in | 46 + xdelta-1.1.3/libedsio/edsio.c | 1610 +++++++ xdelta-1.1.3/libedsio/edsio.el | 1865 ++++++++ xdelta-1.1.3/libedsio/edsio.h | 530 +++ xdelta-1.1.3/libedsio/edsio.lo | 1 + xdelta-1.1.3/libedsio/edsio.prj | 40 + xdelta-1.1.3/libedsio/edsio.ser | 129 + xdelta-1.1.3/libedsio/edsio_edsio.c | 873 ++++ xdelta-1.1.3/libedsio/edsio_edsio.h | 379 ++ xdelta-1.1.3/libedsio/edsio_edsio.lo | 1 + xdelta-1.1.3/libedsio/edsiotest | Bin 0 -> 230175 bytes xdelta-1.1.3/libedsio/edsiotest.c | 213 + xdelta-1.1.3/libedsio/fh.c | 164 + xdelta-1.1.3/libedsio/fh.lo | 1 + xdelta-1.1.3/libedsio/generic.c | 263 + xdelta-1.1.3/libedsio/generic.lo | 1 + xdelta-1.1.3/libedsio/libedsio.la | 28 + xdelta-1.1.3/libedsio/library.c | 121 + xdelta-1.1.3/libedsio/library.lo | 1 + xdelta-1.1.3/libedsio/maketime.c | 391 ++ xdelta-1.1.3/libedsio/maketime.h | 39 + xdelta-1.1.3/libedsio/maketime.lo | 1 + xdelta-1.1.3/libedsio/md5c.c | 298 ++ xdelta-1.1.3/libedsio/md5c.lo | 1 + xdelta-1.1.3/libedsio/partime.c | 742 +++ xdelta-1.1.3/libedsio/partime.h | 67 + xdelta-1.1.3/libedsio/partime.lo | 1 + xdelta-1.1.3/libedsio/sha.c | 239 + xdelta-1.1.3/libedsio/sha.lo | 1 + xdelta-1.1.3/libedsio/simple.c | 179 + xdelta-1.1.3/libedsio/simple.lo | 1 + xdelta-1.1.3/libedsio/stamp-ser1 | 0 xdelta-1.1.3/libtool | 4235 +++++++++++++++++ xdelta-1.1.3/libxdelta.la | 28 + xdelta-1.1.3/ltconfig | 3017 ++++++++++++ xdelta-1.1.3/ltmain.sh | 3975 ++++++++++++++++ xdelta-1.1.3/missing | 190 + xdelta-1.1.3/mkinstalldirs | 40 + xdelta-1.1.3/stamp-h | 1 + xdelta-1.1.3/stamp-h.in | 1 + xdelta-1.1.3/stamp-ser | 0 xdelta-1.1.3/test/Makefile | 307 ++ xdelta-1.1.3/test/Makefile.am | 13 + xdelta-1.1.3/test/Makefile.in | 307 ++ xdelta-1.1.3/test/README.test | 9 + xdelta-1.1.3/test/xdeltatest | Bin 0 -> 126336 bytes xdelta-1.1.3/test/xdeltatest.c | 681 +++ xdelta-1.1.3/xd.ser | 138 + xdelta-1.1.3/xd_edsio.c | 1559 ++++++ xdelta-1.1.3/xd_edsio.h | 401 ++ xdelta-1.1.3/xd_edsio.lo | 1 + xdelta-1.1.3/xdapply.c | 91 + xdelta-1.1.3/xdapply.lo | 1 + xdelta-1.1.3/xdelta | Bin 0 -> 180689 bytes xdelta-1.1.3/xdelta-config | 115 + xdelta-1.1.3/xdelta-config.in | 115 + xdelta-1.1.3/xdelta.c | 1519 ++++++ xdelta-1.1.3/xdelta.dsp | 121 + xdelta-1.1.3/xdelta.dsw | 29 + xdelta-1.1.3/xdelta.h | 195 + xdelta-1.1.3/xdelta.lo | 1 + xdelta-1.1.3/xdelta.m4 | 183 + xdelta-1.1.3/xdelta.magic | 9 + xdelta-1.1.3/xdelta.prj | 96 + xdelta-1.1.3/xdeltapriv.h | 131 + xdelta-1.1.3/xdmain.c | 1924 ++++++++ xdelta-1.1.3/xdrsync.c | 443 ++ 137 files changed, 48369 insertions(+) create mode 100644 .DS_Store create mode 100644 .gdb_history create mode 100644 Makefile create mode 100755 MojoPatch.app/Contents/Info.plist create mode 100755 MojoPatch.app/Contents/MacOS/mojopatch create mode 100755 MojoPatch.app/Contents/MacOS/xdelta create mode 100755 MojoPatch.app/Contents/PkgInfo create mode 100755 MojoPatch.app/Contents/Resources/English.lproj/InfoPlist.strings create mode 100755 MojoPatch.app/Contents/Resources/mojopatch.icns create mode 100644 MojoPatch.app/Contents/Resources/mojopatch.nib/classes.nib create mode 100644 MojoPatch.app/Contents/Resources/mojopatch.nib/info.nib create mode 100644 MojoPatch.app/Contents/Resources/mojopatch.nib/objects.xib create mode 100644 TODO create mode 100644 md5.c create mode 100644 md5.h create mode 100644 mojopatch.c create mode 100644 platform.h create mode 100644 platform_unix.c create mode 100644 platform_win32.c create mode 100755 test create mode 100644 test.c create mode 100644 tmp.txt create mode 100644 ui.h create mode 100644 ui_carbon.c create mode 100644 ui_stdio.c create mode 100644 x.txt create mode 100644 xdelta-1.1.3/.libs/libxdelta.lai create mode 100644 xdelta-1.1.3/AUTHORS create mode 100644 xdelta-1.1.3/COPYING create mode 100644 xdelta-1.1.3/ChangeLog create mode 100644 xdelta-1.1.3/INSTALL create mode 100644 xdelta-1.1.3/Makefile create mode 100644 xdelta-1.1.3/Makefile.am create mode 100644 xdelta-1.1.3/Makefile.in create mode 100644 xdelta-1.1.3/NEWS create mode 100644 xdelta-1.1.3/README create mode 100644 xdelta-1.1.3/aclocal.m4 create mode 100755 xdelta-1.1.3/autogen.sh create mode 100644 xdelta-1.1.3/config.cache create mode 100755 xdelta-1.1.3/config.guess create mode 100644 xdelta-1.1.3/config.h create mode 100644 xdelta-1.1.3/config.h.in create mode 100644 xdelta-1.1.3/config.log create mode 100755 xdelta-1.1.3/config.status create mode 100755 xdelta-1.1.3/config.sub create mode 100755 xdelta-1.1.3/configure create mode 100644 xdelta-1.1.3/configure.in create mode 100644 xdelta-1.1.3/djgpp/Makefile create mode 100644 xdelta-1.1.3/djgpp/Makefile.am create mode 100644 xdelta-1.1.3/djgpp/Makefile.in create mode 100644 xdelta-1.1.3/djgpp/announce.djg create mode 100644 xdelta-1.1.3/djgpp/readme.djg create mode 100644 xdelta-1.1.3/doc/Makefile create mode 100644 xdelta-1.1.3/doc/Makefile.am create mode 100644 xdelta-1.1.3/doc/Makefile.in create mode 100644 xdelta-1.1.3/doc/xdelta.1 create mode 100644 xdelta-1.1.3/doc/xdelta.cat create mode 100644 xdelta-1.1.3/getopt.c create mode 100644 xdelta-1.1.3/getopt.h create mode 100644 xdelta-1.1.3/getopt1.c create mode 100755 xdelta-1.1.3/install-sh create mode 100644 xdelta-1.1.3/libedsio/.libs/libedsio.lai create mode 100644 xdelta-1.1.3/libedsio/Makefile create mode 100644 xdelta-1.1.3/libedsio/Makefile.am create mode 100644 xdelta-1.1.3/libedsio/Makefile.in create mode 100644 xdelta-1.1.3/libedsio/base64.c create mode 100644 xdelta-1.1.3/libedsio/base64.lo create mode 100644 xdelta-1.1.3/libedsio/default.c create mode 100644 xdelta-1.1.3/libedsio/default.lo create mode 100755 xdelta-1.1.3/libedsio/edsio-comp create mode 100644 xdelta-1.1.3/libedsio/edsio-comp.in create mode 100644 xdelta-1.1.3/libedsio/edsio.c create mode 100644 xdelta-1.1.3/libedsio/edsio.el create mode 100644 xdelta-1.1.3/libedsio/edsio.h create mode 100644 xdelta-1.1.3/libedsio/edsio.lo create mode 100644 xdelta-1.1.3/libedsio/edsio.prj create mode 100644 xdelta-1.1.3/libedsio/edsio.ser create mode 100644 xdelta-1.1.3/libedsio/edsio_edsio.c create mode 100644 xdelta-1.1.3/libedsio/edsio_edsio.h create mode 100644 xdelta-1.1.3/libedsio/edsio_edsio.lo create mode 100755 xdelta-1.1.3/libedsio/edsiotest create mode 100644 xdelta-1.1.3/libedsio/edsiotest.c create mode 100644 xdelta-1.1.3/libedsio/fh.c create mode 100644 xdelta-1.1.3/libedsio/fh.lo create mode 100644 xdelta-1.1.3/libedsio/generic.c create mode 100644 xdelta-1.1.3/libedsio/generic.lo create mode 100644 xdelta-1.1.3/libedsio/libedsio.la create mode 100644 xdelta-1.1.3/libedsio/library.c create mode 100644 xdelta-1.1.3/libedsio/library.lo create mode 100644 xdelta-1.1.3/libedsio/maketime.c create mode 100644 xdelta-1.1.3/libedsio/maketime.h create mode 100644 xdelta-1.1.3/libedsio/maketime.lo create mode 100644 xdelta-1.1.3/libedsio/md5c.c create mode 100644 xdelta-1.1.3/libedsio/md5c.lo create mode 100644 xdelta-1.1.3/libedsio/partime.c create mode 100644 xdelta-1.1.3/libedsio/partime.h create mode 100644 xdelta-1.1.3/libedsio/partime.lo create mode 100644 xdelta-1.1.3/libedsio/sha.c create mode 100644 xdelta-1.1.3/libedsio/sha.lo create mode 100644 xdelta-1.1.3/libedsio/simple.c create mode 100644 xdelta-1.1.3/libedsio/simple.lo create mode 100644 xdelta-1.1.3/libedsio/stamp-ser1 create mode 100755 xdelta-1.1.3/libtool create mode 100644 xdelta-1.1.3/libxdelta.la create mode 100755 xdelta-1.1.3/ltconfig create mode 100644 xdelta-1.1.3/ltmain.sh create mode 100755 xdelta-1.1.3/missing create mode 100755 xdelta-1.1.3/mkinstalldirs create mode 100644 xdelta-1.1.3/stamp-h create mode 100644 xdelta-1.1.3/stamp-h.in create mode 100644 xdelta-1.1.3/stamp-ser create mode 100644 xdelta-1.1.3/test/Makefile create mode 100644 xdelta-1.1.3/test/Makefile.am create mode 100644 xdelta-1.1.3/test/Makefile.in create mode 100644 xdelta-1.1.3/test/README.test create mode 100755 xdelta-1.1.3/test/xdeltatest create mode 100644 xdelta-1.1.3/test/xdeltatest.c create mode 100644 xdelta-1.1.3/xd.ser create mode 100644 xdelta-1.1.3/xd_edsio.c create mode 100644 xdelta-1.1.3/xd_edsio.h create mode 100644 xdelta-1.1.3/xd_edsio.lo create mode 100644 xdelta-1.1.3/xdapply.c create mode 100644 xdelta-1.1.3/xdapply.lo create mode 100755 xdelta-1.1.3/xdelta create mode 100755 xdelta-1.1.3/xdelta-config create mode 100644 xdelta-1.1.3/xdelta-config.in create mode 100644 xdelta-1.1.3/xdelta.c create mode 100644 xdelta-1.1.3/xdelta.dsp create mode 100644 xdelta-1.1.3/xdelta.dsw create mode 100644 xdelta-1.1.3/xdelta.h create mode 100644 xdelta-1.1.3/xdelta.lo create mode 100644 xdelta-1.1.3/xdelta.m4 create mode 100644 xdelta-1.1.3/xdelta.magic create mode 100644 xdelta-1.1.3/xdelta.prj create mode 100644 xdelta-1.1.3/xdeltapriv.h create mode 100644 xdelta-1.1.3/xdmain.c create mode 100644 xdelta-1.1.3/xdrsync.c diff --git a/.DS_Store b/.DS_Store new file mode 100644 index 0000000000000000000000000000000000000000..3728e5524b64c7f6ff40382ed8a51d946b2092e8 GIT binary patch literal 6148 zcmeHKOHRWu5S?i&5yYlTmN`P<1Xfi}zy)ZFppmMkC8FK1Fk-{8dGi4!O4uRL-x?iq)X`CO?cJ!9Xw&3j4CETISnf`R|efSeB{nqYFwhI(|M z(>>`x5#8#h}x?8*JJp@kFc%E;p@e?DH=FYH{Z zJ8?3MJ{SlFx(tkMI+gl=gTGSyZQAvWSuhX`{8a{cvbbH$u{*D=y?sipEz$1KM8q%4 p0D`fWVxX2{OynH7RHNBT8N;3&v!P@Wy@mthBA|ps7YzIW10Nk + + + + CFBundleDevelopmentRegion + English + CFBundleExecutable + mojopatch + CFBundleIdentifier + org.icculus.mojopatch + CFBundleIconFile + mojopatch.icns + CFBundleInfoDictionaryVersion + 6.0 + CFBundlePackageType + APPL + CFBundleSignature + ???? + CFBundleVersion + 0.0.1 + CSResourcesFileMapped + + NSMainNibFile + mojopatch + NSPrincipalClass + NSApplication + CFBundleName + MojoPatch + + diff --git a/MojoPatch.app/Contents/MacOS/mojopatch b/MojoPatch.app/Contents/MacOS/mojopatch new file mode 100755 index 0000000000000000000000000000000000000000..129c55442ca18b9fa1f879aa88ebdf14fe42e9db GIT binary patch literal 48204 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 MFVhdDNmlIRH|8&o4gdfE literal 0 HcmV?d00001 diff --git a/MojoPatch.app/Contents/PkgInfo b/MojoPatch.app/Contents/PkgInfo new file mode 100755 index 0000000..6f749b0 --- /dev/null +++ b/MojoPatch.app/Contents/PkgInfo @@ -0,0 +1 @@ +APPL???? diff --git a/MojoPatch.app/Contents/Resources/English.lproj/InfoPlist.strings b/MojoPatch.app/Contents/Resources/English.lproj/InfoPlist.strings new file mode 100755 index 0000000..bc4f381 --- /dev/null +++ b/MojoPatch.app/Contents/Resources/English.lproj/InfoPlist.strings @@ -0,0 +1,6 @@ +/* Localized versions of Info.plist keys */ + +CFBundleName = "MojoPatch"; +CFBundleShortVersionString = "mojopatch"; +CFBundleGetInfoString = "MojoPatch"; + diff --git a/MojoPatch.app/Contents/Resources/mojopatch.icns b/MojoPatch.app/Contents/Resources/mojopatch.icns new file mode 100755 index 0000000000000000000000000000000000000000..e03a52bc19b261989edbaf0acdc0127bc55ef5cd GIT binary patch literal 52625 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

AQZWFxCIji4ZhB{y*Qf<>~vy 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 Z1b#1p-%H^468OCYelLOFOJJ%5{vVWa4WIx3 literal 0 HcmV?d00001 diff --git a/MojoPatch.app/Contents/Resources/mojopatch.nib/classes.nib b/MojoPatch.app/Contents/Resources/mojopatch.nib/classes.nib new file mode 100644 index 0000000..ea58db1 --- /dev/null +++ b/MojoPatch.app/Contents/Resources/mojopatch.nib/classes.nib @@ -0,0 +1,4 @@ +{ +IBClasses = (); +IBVersion = 1; +} diff --git a/MojoPatch.app/Contents/Resources/mojopatch.nib/info.nib b/MojoPatch.app/Contents/Resources/mojopatch.nib/info.nib new file mode 100644 index 0000000..b3b9075 --- /dev/null +++ b/MojoPatch.app/Contents/Resources/mojopatch.nib/info.nib @@ -0,0 +1,26 @@ + + + + + IBDocumentLocation + 19 92 356 240 0 0 1024 746 + IBEditorPositions + + 29 + 69 323 97 44 0 0 1024 746 + + IBFramework Version + 349.0 + IBOldestOS + 2 + IBOpenObjects + + 29 + 166 + + IBSystem Version + 7B85 + targetFramework + IBCarbonFramework + + diff --git a/MojoPatch.app/Contents/Resources/mojopatch.nib/objects.xib b/MojoPatch.app/Contents/Resources/mojopatch.nib/objects.xib new file mode 100644 index 0000000..7bc4ef5 --- /dev/null +++ b/MojoPatch.app/Contents/Resources/mojopatch.nib/objects.xib @@ -0,0 +1,86 @@ + + + IBCarbonFramework + + NSApplication + + + + mojopatch + + + MojoPatch + + NewApplication + + + TRUE + About MojoPatch + 0 + abou + + + _NSAppleMenu + + + + _NSMainMenu + + + 357 253 450 671 + MojoPatch + + 0 0 93 418 + 0 0 418 93 + + + 42 19 61 399 + 19 42 380 19 + mjpt + 1 + + + 14 20 30 398 + 20 14 378 16 + mjpt + Patching in progress... + + + + FALSE + FALSE + FALSE + FALSE + FALSE + TRUE + TRUE + TRUE + 1 + + + + + + + + + + + + + + + + + + + + Files Owner + + MainWindow + + MenuBar + + + 195 + diff --git a/TODO b/TODO new file mode 100644 index 0000000..341c57e --- /dev/null +++ b/TODO @@ -0,0 +1,6 @@ + +- md5sum of patchfile itself? +- Move confirm() to UI abstraction. +- Integrate xdelta into single binary? +- Lots of tests for dir/notdir or file/notfile...no symlinks support, etc. + diff --git a/md5.c b/md5.c new file mode 100644 index 0000000..de42955 --- /dev/null +++ b/md5.c @@ -0,0 +1,394 @@ +/* + Copyright (C) 1999 Aladdin Enterprises. All rights reserved. + + This software is provided 'as-is', without any express or implied + warranty. In no event will the authors be held liable for any damages + arising from the use of this software. + + Permission is granted to anyone to use this software for any purpose, + including commercial applications, and to alter it and redistribute it + freely, subject to the following restrictions: + + 1. The origin of this software must not be misrepresented; you must not + claim that you wrote the original software. If you use this software + in a product, an acknowledgment in the product documentation would be + appreciated but is not required. + 2. Altered source versions must be plainly marked as such, and must not be + misrepresented as being the original software. + 3. This notice may not be removed or altered from any source distribution. + + L. Peter Deutsch + ghost@@aladdin.com + + */ +/*$Id: md5.c,v 1.1 2004/01/05 18:54:19 icculus Exp $ */ +/* + Independent implementation of MD5 (RFC 1321). + + This code implements the MD5 Algorithm defined in RFC 1321. + It is derived directly from the text of the RFC and not from the + reference implementation. + + The original and principal author of md5.c is L. Peter Deutsch + . Other authors are noted in the change history + that follows (in reverse chronological order): + + 1999-11-04 lpd Edited comments slightly for automatic TOC extraction. + 1999-10-18 lpd Fixed typo in header comment (ansi2knr rather than md5). + 1999-05-03 lpd Original version. + */ + +#include "md5.h" +#include + +#ifdef TEST +/* + * Compile with -DTEST to create a self-contained executable test program. + * The test program should print out the same values as given in section + * A.5 of RFC 1321, reproduced below. + */ +#include +main() +{ + static const char *const test[7] = { + "", /*d41d8cd98f00b204e9800998ecf8427e*/ + "a", /*0cc175b9c0f1b6a831c399e269772661*/ + "abc", /*900150983cd24fb0d6963f7d28e17f72*/ + "message digest", /*f96b697d7cb7938d525a2f31aaf161d0*/ + "abcdefghijklmnopqrstuvwxyz", /*c3fcd3d76192e4007dfb496cca67e13b*/ + "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789", + /*d174ab98d277d9f5a5611c2c9f419d9f*/ + "12345678901234567890123456789012345678901234567890123456789012345678901234567890" /*57edf4a22be3c955ac49da2e2107b67a*/ + }; + int i; + + for (i = 0; i < 7; ++i) { + md5_state_t state; + md5_byte_t digest[16]; + int di; + + md5_init(&state); + md5_append(&state, (const md5_byte_t *)test[i], strlen(test[i])); + md5_finish(&state, digest); + printf("MD5 (\"%s\") = ", test[i]); + for (di = 0; di < 16; ++di) + printf("%02x", digest[di]); + printf("\n"); + } + return 0; +} +#endif /* TEST */ + + +/* + * For reference, here is the program that computed the T values. + */ +#if 0 +#include +main() +{ + int i; + for (i = 1; i <= 64; ++i) { + unsigned long v = (unsigned long)(4294967296.0 * fabs(sin((double)i))); + printf("#define T%d 0x%08lx\n", i, v); + } + return 0; +} +#endif +/* + * End of T computation program. + */ +#define T1 0xd76aa478 +#define T2 0xe8c7b756 +#define T3 0x242070db +#define T4 0xc1bdceee +#define T5 0xf57c0faf +#define T6 0x4787c62a +#define T7 0xa8304613 +#define T8 0xfd469501 +#define T9 0x698098d8 +#define T10 0x8b44f7af +#define T11 0xffff5bb1 +#define T12 0x895cd7be +#define T13 0x6b901122 +#define T14 0xfd987193 +#define T15 0xa679438e +#define T16 0x49b40821 +#define T17 0xf61e2562 +#define T18 0xc040b340 +#define T19 0x265e5a51 +#define T20 0xe9b6c7aa +#define T21 0xd62f105d +#define T22 0x02441453 +#define T23 0xd8a1e681 +#define T24 0xe7d3fbc8 +#define T25 0x21e1cde6 +#define T26 0xc33707d6 +#define T27 0xf4d50d87 +#define T28 0x455a14ed +#define T29 0xa9e3e905 +#define T30 0xfcefa3f8 +#define T31 0x676f02d9 +#define T32 0x8d2a4c8a +#define T33 0xfffa3942 +#define T34 0x8771f681 +#define T35 0x6d9d6122 +#define T36 0xfde5380c +#define T37 0xa4beea44 +#define T38 0x4bdecfa9 +#define T39 0xf6bb4b60 +#define T40 0xbebfbc70 +#define T41 0x289b7ec6 +#define T42 0xeaa127fa +#define T43 0xd4ef3085 +#define T44 0x04881d05 +#define T45 0xd9d4d039 +#define T46 0xe6db99e5 +#define T47 0x1fa27cf8 +#define T48 0xc4ac5665 +#define T49 0xf4292244 +#define T50 0x432aff97 +#define T51 0xab9423a7 +#define T52 0xfc93a039 +#define T53 0x655b59c3 +#define T54 0x8f0ccc92 +#define T55 0xffeff47d +#define T56 0x85845dd1 +#define T57 0x6fa87e4f +#define T58 0xfe2ce6e0 +#define T59 0xa3014314 +#define T60 0x4e0811a1 +#define T61 0xf7537e82 +#define T62 0xbd3af235 +#define T63 0x2ad7d2bb +#define T64 0xeb86d391 + +static void +md5_process(md5_state_t *pms, const md5_byte_t *data /*[64]*/) +{ + md5_word_t + a = pms->abcd[0], b = pms->abcd[1], + c = pms->abcd[2], d = pms->abcd[3]; + md5_word_t t; + +#ifndef ARCH_IS_BIG_ENDIAN +# define ARCH_IS_BIG_ENDIAN 1 /* slower, default implementation */ +#endif +#if ARCH_IS_BIG_ENDIAN + + /* + * On big-endian machines, we must arrange the bytes in the right + * order. (This also works on machines of unknown byte order.) + */ + md5_word_t X[16]; + const md5_byte_t *xp = data; + int i; + + for (i = 0; i < 16; ++i, xp += 4) + X[i] = xp[0] + (xp[1] << 8) + (xp[2] << 16) + (xp[3] << 24); + +#else /* !ARCH_IS_BIG_ENDIAN */ + + /* + * On little-endian machines, we can process properly aligned data + * without copying it. + */ + md5_word_t xbuf[16]; + const md5_word_t *X; + + if (!((data - (const md5_byte_t *)0) & 3)) { + /* data are properly aligned */ + X = (const md5_word_t *)data; + } else { + /* not aligned */ + memcpy(xbuf, data, 64); + X = xbuf; + } +#endif + +#define ROTATE_LEFT(x, n) (((x) << (n)) | ((x) >> (32 - (n)))) + + /* Round 1. */ + /* Let [abcd k s i] denote the operation + a = b + ((a + F(b,c,d) + X[k] + T[i]) <<< s). */ +#define F(x, y, z) (((x) & (y)) | (~(x) & (z))) +#define SET(a, b, c, d, k, s, Ti)\ + t = a + F(b,c,d) + X[k] + Ti;\ + a = ROTATE_LEFT(t, s) + b + /* Do the following 16 operations. */ + SET(a, b, c, d, 0, 7, T1); + SET(d, a, b, c, 1, 12, T2); + SET(c, d, a, b, 2, 17, T3); + SET(b, c, d, a, 3, 22, T4); + SET(a, b, c, d, 4, 7, T5); + SET(d, a, b, c, 5, 12, T6); + SET(c, d, a, b, 6, 17, T7); + SET(b, c, d, a, 7, 22, T8); + SET(a, b, c, d, 8, 7, T9); + SET(d, a, b, c, 9, 12, T10); + SET(c, d, a, b, 10, 17, T11); + SET(b, c, d, a, 11, 22, T12); + SET(a, b, c, d, 12, 7, T13); + SET(d, a, b, c, 13, 12, T14); + SET(c, d, a, b, 14, 17, T15); + SET(b, c, d, a, 15, 22, T16); +#undef SET + + /* Round 2. */ + /* Let [abcd k s i] denote the operation + a = b + ((a + G(b,c,d) + X[k] + T[i]) <<< s). */ +#define G(x, y, z) (((x) & (z)) | ((y) & ~(z))) +#define SET(a, b, c, d, k, s, Ti)\ + t = a + G(b,c,d) + X[k] + Ti;\ + a = ROTATE_LEFT(t, s) + b + /* Do the following 16 operations. */ + SET(a, b, c, d, 1, 5, T17); + SET(d, a, b, c, 6, 9, T18); + SET(c, d, a, b, 11, 14, T19); + SET(b, c, d, a, 0, 20, T20); + SET(a, b, c, d, 5, 5, T21); + SET(d, a, b, c, 10, 9, T22); + SET(c, d, a, b, 15, 14, T23); + SET(b, c, d, a, 4, 20, T24); + SET(a, b, c, d, 9, 5, T25); + SET(d, a, b, c, 14, 9, T26); + SET(c, d, a, b, 3, 14, T27); + SET(b, c, d, a, 8, 20, T28); + SET(a, b, c, d, 13, 5, T29); + SET(d, a, b, c, 2, 9, T30); + SET(c, d, a, b, 7, 14, T31); + SET(b, c, d, a, 12, 20, T32); +#undef SET + + /* Round 3. */ + /* Let [abcd k s t] denote the operation + a = b + ((a + H(b,c,d) + X[k] + T[i]) <<< s). */ +#define H(x, y, z) ((x) ^ (y) ^ (z)) +#define SET(a, b, c, d, k, s, Ti)\ + t = a + H(b,c,d) + X[k] + Ti;\ + a = ROTATE_LEFT(t, s) + b + /* Do the following 16 operations. */ + SET(a, b, c, d, 5, 4, T33); + SET(d, a, b, c, 8, 11, T34); + SET(c, d, a, b, 11, 16, T35); + SET(b, c, d, a, 14, 23, T36); + SET(a, b, c, d, 1, 4, T37); + SET(d, a, b, c, 4, 11, T38); + SET(c, d, a, b, 7, 16, T39); + SET(b, c, d, a, 10, 23, T40); + SET(a, b, c, d, 13, 4, T41); + SET(d, a, b, c, 0, 11, T42); + SET(c, d, a, b, 3, 16, T43); + SET(b, c, d, a, 6, 23, T44); + SET(a, b, c, d, 9, 4, T45); + SET(d, a, b, c, 12, 11, T46); + SET(c, d, a, b, 15, 16, T47); + SET(b, c, d, a, 2, 23, T48); +#undef SET + + /* Round 4. */ + /* Let [abcd k s t] denote the operation + a = b + ((a + I(b,c,d) + X[k] + T[i]) <<< s). */ +#define I(x, y, z) ((y) ^ ((x) | ~(z))) +#define SET(a, b, c, d, k, s, Ti)\ + t = a + I(b,c,d) + X[k] + Ti;\ + a = ROTATE_LEFT(t, s) + b + /* Do the following 16 operations. */ + SET(a, b, c, d, 0, 6, T49); + SET(d, a, b, c, 7, 10, T50); + SET(c, d, a, b, 14, 15, T51); + SET(b, c, d, a, 5, 21, T52); + SET(a, b, c, d, 12, 6, T53); + SET(d, a, b, c, 3, 10, T54); + SET(c, d, a, b, 10, 15, T55); + SET(b, c, d, a, 1, 21, T56); + SET(a, b, c, d, 8, 6, T57); + SET(d, a, b, c, 15, 10, T58); + SET(c, d, a, b, 6, 15, T59); + SET(b, c, d, a, 13, 21, T60); + SET(a, b, c, d, 4, 6, T61); + SET(d, a, b, c, 11, 10, T62); + SET(c, d, a, b, 2, 15, T63); + SET(b, c, d, a, 9, 21, T64); +#undef SET + + /* Then perform the following additions. (That is increment each + of the four registers by the value it had before this block + was started.) */ + pms->abcd[0] += a; + pms->abcd[1] += b; + pms->abcd[2] += c; + pms->abcd[3] += d; +} + +void +md5_init(md5_state_t *pms) +{ + pms->count[0] = pms->count[1] = 0; + pms->abcd[0] = 0x67452301; + pms->abcd[1] = 0xefcdab89; + pms->abcd[2] = 0x98badcfe; + pms->abcd[3] = 0x10325476; +} + +void +md5_append(md5_state_t *pms, const md5_byte_t *data, int nbytes) +{ + const md5_byte_t *p = data; + int left = nbytes; + int offset = (pms->count[0] >> 3) & 63; + md5_word_t nbits = (md5_word_t)(nbytes << 3); + + if (nbytes <= 0) + return; + + /* Update the message length. */ + pms->count[1] += nbytes >> 29; + pms->count[0] += nbits; + if (pms->count[0] < nbits) + pms->count[1]++; + + /* Process an initial partial block. */ + if (offset) { + int copy = (offset + nbytes > 64 ? 64 - offset : nbytes); + + memcpy(pms->buf + offset, p, copy); + if (offset + copy < 64) + return; + p += copy; + left -= copy; + md5_process(pms, pms->buf); + } + + /* Process full blocks. */ + for (; left >= 64; p += 64, left -= 64) + md5_process(pms, p); + + /* Process a final partial block. */ + if (left) + memcpy(pms->buf, p, left); +} + +void +md5_finish(md5_state_t *pms, md5_byte_t digest[16]) +{ + static const md5_byte_t pad[64] = { + 0x80, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 + }; + md5_byte_t data[8]; + int i; + + /* Save the length before padding. */ + for (i = 0; i < 8; ++i) + data[i] = (md5_byte_t)(pms->count[i >> 2] >> ((i & 3) << 3)); + /* Pad to 56 bytes mod 64. */ + md5_append(pms, pad, ((55 - (pms->count[0] >> 3)) & 63) + 1); + /* Append the length. */ + md5_append(pms, data, 8); + for (i = 0; i < 16; ++i) + digest[i] = (md5_byte_t)(pms->abcd[i >> 2] >> ((i & 3) << 3)); +} + diff --git a/md5.h b/md5.h new file mode 100644 index 0000000..ea3022f --- /dev/null +++ b/md5.h @@ -0,0 +1,115 @@ +/* + Copyright (C) 1999 Aladdin Enterprises. All rights reserved. + + This software is provided 'as-is', without any express or implied + warranty. In no event will the authors be held liable for any damages + arising from the use of this software. + + Permission is granted to anyone to use this software for any purpose, + including commercial applications, and to alter it and redistribute it + freely, subject to the following restrictions: + + 1. The origin of this software must not be misrepresented; you must not + claim that you wrote the original software. If you use this software + in a product, an acknowledgment in the product documentation would be + appreciated but is not required. + 2. Altered source versions must be plainly marked as such, and must not be + misrepresented as being the original software. + 3. This notice may not be removed or altered from any source distribution. + + L. Peter Deutsch + ghost@@aladdin.com + + */ +/*$Id: md5.h,v 1.1 2004/01/05 18:54:19 icculus Exp $ */ +/* + Independent implementation of MD5 (RFC 1321). + + This code implements the MD5 Algorithm defined in RFC 1321. + It is derived directly from the text of the RFC and not from the + reference implementation. + + The original and principal author of md5.h is L. Peter Deutsch + . Other authors are noted in the change history + that follows (in reverse chronological order): + + 1999-11-04 lpd Edited comments slightly for automatic TOC extraction. + 1999-10-18 lpd Fixed typo in header comment (ansi2knr rather than md5); + added conditionalization for C++ compilation from Martin + Purschke . + 1999-05-03 lpd Original version. + */ + +#ifndef md5_INCLUDED +# define md5_INCLUDED + +#if ((PLATFORM_WIN32) || (defined WIN32)) +#define ARCH_IS_BIG_ENDIAN 0 + +#elif (defined PLATFORM_UNIX) + +/* thanks to SDL headers for this. */ +#if defined(__i386__) || defined(__ia64__) || defined(WIN32) || \ + (defined(__alpha__) || defined(__alpha)) || \ + defined(__arm__) || \ + (defined(__mips__) && defined(__MIPSEL__)) || \ + defined(__LITTLE_ENDIAN__) + #define ARCH_IS_BIG_ENDIAN 0 +#else + #define ARCH_IS_BIG_ENDIAN 1 +#endif + +#else +#error Please add your platform. +#endif + +/* + * This code has some adaptations for the Ghostscript environment, but it + * will compile and run correctly in any environment with 8-bit chars and + * 32-bit ints. Specifically, it assumes that if the following are + * defined, they have the same meaning as in Ghostscript: P1, P2, P3, + * ARCH_IS_BIG_ENDIAN. + */ + +typedef unsigned char md5_byte_t; /* 8-bit byte */ +typedef unsigned int md5_word_t; /* 32-bit word */ + +/* Define the state of the MD5 Algorithm. */ +typedef struct md5_state_s { + md5_word_t count[2]; /* message length in bits, lsw first */ + md5_word_t abcd[4]; /* digest buffer */ + md5_byte_t buf[64]; /* accumulate block */ +} md5_state_t; + +#ifdef __cplusplus +extern "C" +{ +#endif + +/* Initialize the algorithm. */ +#ifdef P1 +void md5_init(P1(md5_state_t *pms)); +#else +void md5_init(md5_state_t *pms); +#endif + +/* Append a string to the message. */ +#ifdef P3 +void md5_append(P3(md5_state_t *pms, const md5_byte_t *data, int nbytes)); +#else +void md5_append(md5_state_t *pms, const md5_byte_t *data, int nbytes); +#endif + +/* Finish the message and return the digest. */ +#ifdef P2 +void md5_finish(P2(md5_state_t *pms, md5_byte_t digest[16])); +#else +void md5_finish(md5_state_t *pms, md5_byte_t digest[16]); +#endif + +#ifdef __cplusplus +} /* end extern "C" */ +#endif + +#endif /* md5_INCLUDED */ + diff --git a/mojopatch.c b/mojopatch.c new file mode 100644 index 0000000..e80c56f --- /dev/null +++ b/mojopatch.c @@ -0,0 +1,2010 @@ +/* + *---------------------------------------------------------------------------- + * + * mojopatch + * Copyright (C) 2003 Ryan C. Gordon. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + * + *---------------------------------------------------------------------------- + * + * (Insert documentation here.) + * + *---------------------------------------------------------------------------- + * + * This software was written quickly, is not well-engineered, and may have + * catastrophic bugs. Its method is brute-force, at best. Use at your + * own risk. Don't eat yellow snow. + * + * Send patches, improvements, suggestions, etc to Ryan: + * icculus@clutteredmind.org. + * + *---------------------------------------------------------------------------- + */ + +#include +#include +#include +#include +#include +#include +#include +#include + +#include "platform.h" +#include "ui.h" +#include "md5.h" + +#define VERSION "0.0.3" + +#define DEFAULT_PATCHFILENAME "default.mojopatch" + +#define PATCHERROR 0 +#define PATCHSUCCESS 1 +#define MOJOPATCHSIG "mojopatch " VERSION " (icculus@clutteredmind.org)\r\n" + +#define OPERATION_DELETE 27 +#define OPERATION_DELETEDIRECTORY 28 +#define OPERATION_ADD 29 +#define OPERATION_ADDDIRECTORY 30 +#define OPERATION_PATCH 31 +#define OPERATION_REPLACE 32 + +typedef enum +{ + COMMAND_NONE = 0, + COMMAND_CREATE, + COMMAND_INFO, + COMMAND_DOPATCHING, + + COMMAND_TOTAL +} PatchCommands; + +static int debug = 0; +static int interactive = 0; +static int replace = 0; +static PatchCommands command = COMMAND_NONE; + +static const char *patchfile = NULL; +static const char *dir1 = NULL; +static const char *dir2 = NULL; + +static char *patchtmpfile = NULL; +static char *patchtmpfile2 = NULL; + +static char product[128] = {0}; +static char identifier[128] = {0}; +static char version[128] = {0}; +static char newversion[128] = {0}; +static char readme[128] = {0}; +static char renamedir[128] = {0}; + +static char **ignorelist = NULL; +static int ignorecount = 0; + +static unsigned int maxxdeltamem = 128; /* in megabytes. */ + +static unsigned char iobuf[512 * 1024]; + +/* printf-style: makes string for UI to put in the log. */ +void _fatal(const char *fmt, ...) +{ + char buf[512]; + va_list ap; + va_start(ap, fmt); + vsnprintf(buf, sizeof (buf), fmt, ap); + va_end(ap); + buf[sizeof(buf)-1] = '\0'; + ui_fatal(buf); + ui_pump(); +} /* _fatal */ + +/* printf-style: makes string for UI to put in the log. */ +void _log(const char *fmt, ...) +{ + char buf[512]; + va_list ap; + va_start(ap, fmt); + vsnprintf(buf, sizeof (buf), fmt, ap); + va_end(ap); + buf[sizeof(buf)-1] = '\0'; + ui_add_to_log(buf, 0); + ui_pump(); +} /* _log */ + + +/* printf-style: makes string for UI to put in the log if debugging enabled. */ +void _dlog(const char *fmt, ...) +{ + if (debug) + { + char buf[512]; + va_list ap; + va_start(ap, fmt); + vsnprintf(buf, sizeof (buf), fmt, ap); + va_end(ap); + buf[sizeof(buf)-1] = '\0'; + ui_add_to_log(buf, 1); + ui_pump(); + } /* if */ +} /* _dlog */ + +static void _current_operation(const char *fmt, ...) +{ + char buf[512]; + va_list ap; + va_start(ap, fmt); + vsnprintf(buf, sizeof (buf), fmt, ap); + va_end(ap); + buf[sizeof(buf)-1] = '\0'; + ui_status(buf); + ui_pump(); +} /* _current_operation */ + + +static int _do_xdelta(const char *fmt, ...) +{ + char buf[512]; + va_list ap; + va_start(ap, fmt); + vsnprintf(buf, sizeof (buf), fmt, ap); + va_end(ap); + buf[sizeof(buf)-1] = '\0'; + _dlog("(xdelta call: [%s].)", buf); + return(spawn_xdelta(buf)); +} /* _do_xdelta */ + + +static int in_ignore_list(const char *fname) +{ + int i; + for (i = 0; i < ignorecount; i++) + { + if (strcmp(fname, ignorelist[i]) == 0) + { + _log("Ignoring %s on user's instructions.", fname); + return(1); + } /* if */ + } /* for */ + + return(0); +} /* in_ignore_list */ + + +static inline int info_only(void) +{ + return(command == COMMAND_INFO); +} /* info_only */ + + +static void free_filelist(file_list *list) +{ + file_list *next; + while (list != NULL) + { + next = list->next; + free(list->fname); + free(list); + list = next; + } /* while */ +} /* free_filelist */ + + +static int write_between_files(FILE *in, FILE *out, long fsize) +{ + while (fsize > 0) + { + int max = sizeof (iobuf); + if (max > fsize) + max = fsize; + + int br = fread(iobuf, 1, max, in); + if (br <= 0) + { + _fatal("read error: %s.", strerror(errno)); + return(PATCHERROR); + } /* if */ + ui_pump(); + + if (fwrite(iobuf, br, 1, out) != 1) + { + _fatal("write error: %s.", strerror(errno)); + return(PATCHERROR); + } /* if */ + ui_pump(); + + fsize -= br; + } /* while */ + + return(PATCHSUCCESS); +} /* write_between_files */ + + +static int do_rename(const char *from, const char *to) +{ + FILE *in; + FILE *out; + long fsize; + int rc; + + unlink(to); /* just in case. */ + if (rename(from, to) != -1) + return(PATCHSUCCESS); + + /* rename() might fail if from and to are on seperate filesystems. */ + + rc = get_file_size(from, &fsize); + in = fopen(from, "rb"); + out = fopen(to, "wb"); + if ((!rc) || (!in) || (!out)) + { + if (in) + fclose(in); + if (out) + fclose(out); + unlink(to); + _fatal("File copy failed."); + return(PATCHERROR); + } /* if */ + + rc = write_between_files(in, out, fsize); + + fclose(in); + if ((fclose(out) == -1) && (rc != PATCHERROR)) + { + _fatal("File copy failed."); + return(PATCHERROR); + } /* if */ + + unlink(from); + + return(rc); +} /* do_rename */ + + +static int md5sum(FILE *in, md5_byte_t *digest, int output) +{ + md5_state_t md5state; + long br; + + _dlog("md5summing..."); + + memset(digest, '\0', 16); + md5_init(&md5state); + + if (fseek(in, 0, SEEK_SET) == -1) + { + _fatal("Couldn't seek in file: %s.", strerror(errno)); + return(PATCHERROR); + } /* if */ + + while (1) + { + ui_pump(); + + br = fread(iobuf, 1, sizeof (iobuf), in); + if (br == 0) + { + int err = errno; + if (feof(in)) + break; + else + { + _fatal("Read error: %s.", strerror(err)); + return(PATCHERROR); + } /* else */ + } /* if */ + md5_append(&md5state, (const md5_byte_t *) iobuf, br); + } /* while */ + + md5_finish(&md5state, digest); + + if ((output) || (debug)) + { + /* ugly, but want to print it all on one line... */ + _log(" (md5sum: %02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x)", + digest[0], digest[1], digest[2], digest[3], + digest[4], digest[5], digest[6], digest[7], + digest[8], digest[9], digest[10], digest[11], + digest[12], digest[13], digest[14], digest[15]); + } /* if */ + + if (fseek(in, 0, SEEK_SET) == -1) + { + _fatal("Couldn't seek in file: %s.", strerror(errno)); + return(PATCHERROR); + } /* if */ + + return(PATCHSUCCESS); +} /* md5sum */ + + +static int verify_md5sum(md5_byte_t *md5, md5_byte_t *result, FILE *in, int isfatal) +{ + md5_byte_t thismd5[16]; + + if (md5sum(in, thismd5, 0) == PATCHERROR) + return(PATCHERROR); + + if (result != NULL) + memcpy(result, thismd5, sizeof (thismd5)); + + if (memcmp(thismd5, md5, sizeof (thismd5)) != 0) + { + if (isfatal) + _fatal("md5sum doesn't match original!"); + return(PATCHERROR); + } /* if */ + + return(PATCHSUCCESS); +} /* verify_md5sum */ + + +static int read_asciz_string(char *buffer, FILE *in) +{ + size_t i = 0; + int ch; + + do + { + if (i >= MAX_PATH) + { + _fatal("String overflow error."); + return(PATCHERROR); + } /* if */ + + ch = fgetc(in); + if (ch == EOF) + { + if (feof(in)) + _fatal("Unexpected EOF during read."); + else + _fatal("Error during read: %s.", strerror(errno)); + return(PATCHERROR); + } /* if */ + + buffer[i] = (char) ch; + } while (buffer[i++] != '\0'); + + return(PATCHSUCCESS); +} /* read_asciz_string */ + + +static int confirm(void) +{ + char buf[256]; + char *ptr; + + if (!interactive) + return(1); + + while (1) + { + printf("Confirm [Y/n] : "); + fgets(buf, sizeof (buf) - 1, stdin); + if ( (ptr = strchr(buf, '\r')) != NULL ) + *ptr = '\0'; + if ( (ptr = strchr(buf, '\n')) != NULL ) + *ptr = '\0'; + + if (strlen(buf) <= 1) + { + int ch = tolower((int) buf[0]); + if ((ch == '\0') || (ch == 'y')) + { + printf("Answered YES\n"); + return(1); + } /* if */ + else if (ch == 'n') + { + printf("Answered NO\n"); + return(0); + } /* else if */ + } /* if */ + } /* while */ +} /* confirm */ + + +static const char *final_path_element(const char *fname) +{ + const char *ptr = (const char *) strrchr(fname, PATH_SEP[0]); + assert( (sizeof (PATH_SEP)) == (sizeof (char) * 2) ); + return(ptr ? ptr + 1 : fname); +} /* final_path_element */ + + +/* put a DELETE operation in the mojopatch file... */ +static int put_delete(const char *fname, FILE *out) +{ + unsigned char operation = OPERATION_DELETE; + + _current_operation("DELETE %s", final_path_element(fname)); + _log("DELETE %s", fname); + + if (in_ignore_list(fname)) + return(PATCHSUCCESS); + + if (!confirm()) + return(PATCHSUCCESS); + + if (fwrite(&operation, sizeof (operation), 1, out) != 1) + { + _fatal("write failure: %s.", strerror(errno)); + return(PATCHERROR); + } /* if */ + + if (fwrite(fname, strlen(fname) + 1, 1, out) != 1) + { + _fatal("write failure: %s.", strerror(errno)); + return(PATCHERROR); + } /* if */ + + return(PATCHSUCCESS); +} /* put_delete */ + + +/* get a DELETE operation from the mojopatch file... */ +static int get_delete(FILE *in) +{ + char fname[MAX_PATH]; + + if (read_asciz_string(fname, in) == PATCHERROR) + return(PATCHERROR); + + _current_operation("DELETE %s", final_path_element(fname)); + _log("DELETE %s", fname); + + if ( (info_only()) || (!confirm()) ) + return(PATCHSUCCESS); + + if (in_ignore_list(fname)) + return(PATCHSUCCESS); + + if (!file_exists(fname)) + { + _log("file seems to be gone already."); + return(PATCHSUCCESS); + } /* if */ + + if (file_is_directory(fname)) + { + _fatal("Expected file, found directory!"); + return(PATCHERROR); + } /* if */ + + if (remove(fname) == -1) + { + _fatal("Error removing [%s]: %s.", fname, strerror(errno)); + return(PATCHERROR); + } /* if */ + + _log("done DELETE."); + return(PATCHSUCCESS); +} /* get_delete */ + + +/* put a DELETEDIRECTORY operation in the mojopatch file... */ +static int put_delete_dir(const char *fname1, const char *fname2, FILE *out) +{ + unsigned char operation = OPERATION_DELETEDIRECTORY; + + _current_operation("DELETEDIRECTORY %s", final_path_element(fname2)); + _log("DELETEDIRECTORY %s", fname2); + + if (!confirm()) + return(PATCHSUCCESS); + + if (in_ignore_list(fname2)) + return(PATCHSUCCESS); + + if (fwrite(&operation, sizeof (operation), 1, out) != 1) + { + _fatal("write failure: %s.", strerror(errno)); + return(PATCHERROR); + } /* if */ + + if (fwrite(fname2, strlen(fname2) + 1, 1, out) != 1) + { + _fatal("write failure: %s.", strerror(errno)); + return(PATCHERROR); + } /* if */ + + return(PATCHSUCCESS); +} /* put_delete_dir */ + + +static int delete_dir_tree(const char *fname) +{ + char filebuf[MAX_PATH]; + file_list *files = make_filelist(fname); + file_list *i; + int rc = 0; + + _log("Deleting directory tree %s", fname); + + for (i = files; i != NULL; i = i->next) + { + snprintf(filebuf, sizeof (filebuf), "%s%s%s", fname, PATH_SEP, i->fname); + if (file_is_directory(filebuf)) + rc = delete_dir_tree(filebuf); + else + { + _log("Deleting file %s from dir tree", filebuf); + rc = (remove(filebuf) == -1) ? PATCHERROR : PATCHSUCCESS; + if (rc == PATCHERROR) + _fatal("failed to delete %s: %s.", filebuf, strerror(errno)); + } /* else */ + + if (rc == PATCHERROR) + { + free_filelist(files); + return(PATCHERROR); + } /* if */ + } /* for */ + + free_filelist(files); + + if (rmdir(fname) == -1) + { + _fatal("Error removing directory [%s]: %s.", fname, strerror(errno)); + return(PATCHERROR); + } /* if */ + + return(PATCHSUCCESS); +} /* delete_dir_tree */ + + +/* get a DELETEDIRECTORY operation from the mojopatch file... */ +static int get_delete_dir(FILE *in) +{ + char fname[MAX_PATH]; + + if (read_asciz_string(fname, in) == PATCHERROR) + return(PATCHERROR); + + _current_operation("DELETEDIRECTORY %s", final_path_element(fname)); + _log("DELETEDIRECTORY %s", fname); + + if ( (info_only()) || (!confirm()) ) + return(PATCHSUCCESS); + + if (in_ignore_list(fname)) + return(PATCHSUCCESS); + + if (!file_exists(fname)) + { + _log("directory seems to be gone already."); + return(PATCHSUCCESS); + } /* if */ + + if (!file_is_directory(fname)) + { + _fatal("Expected directory, found file!"); + return(PATCHERROR); + } /* if */ + + if (!delete_dir_tree(fname)) + return(PATCHERROR); + + _log("done DELETEDIRECTORY."); + return(PATCHSUCCESS); +} /* get_delete_dir */ + + +/* put an ADD operation in the mojopatch file... */ +/* !!! FIXME: This really needs compression... */ +static int put_add(const char *fname, FILE *out) +{ + md5_byte_t md5[16]; + unsigned char operation = (replace) ? OPERATION_REPLACE : OPERATION_ADD; + long fsize; + FILE *in; + int rc; + struct stat statbuf; + mode_t mode; + + _current_operation("%s %s", (replace) ? "ADDORREPLACE" : "ADD", + final_path_element(fname)); + _log("%s %s", (replace) ? "ADDORREPLACE" : "ADD", fname); + + if (!confirm()) + return(PATCHSUCCESS); + + if (in_ignore_list(fname)) + return(PATCHSUCCESS); + + if (fwrite(&operation, sizeof (operation), 1, out) != 1) + { + _fatal("write failure: %s.", strerror(errno)); + return(PATCHERROR); + } /* if */ + + if (fwrite(fname, strlen(fname) + 1, 1, out) != 1) + { + _fatal("write failure: %s.", strerror(errno)); + return(PATCHERROR); + } /* if */ + + if (!get_file_size(fname, &fsize)) + return(PATCHERROR); + + if (fwrite(&fsize, sizeof (fsize), 1, out) != 1) + { + _fatal("write failure: %s.", strerror(errno)); + return(PATCHERROR); + } /* if */ + + if (stat(fname, &statbuf) == -1) + { + _fatal("Couldn't stat %s: %s.", fname, strerror(errno)); + return(PATCHERROR); + } /* if */ + mode = (mode_t) statbuf.st_mode; + + in = fopen(fname, "rb"); + if (in == NULL) + { + _fatal("failed to open [%s]: %s.", fname, strerror(errno)); + return(PATCHERROR); + } /* if */ + + if (md5sum(in, md5, debug) == PATCHERROR) + { + fclose(in); + return(PATCHERROR); + } /* if */ + + if (fwrite(md5, sizeof (md5), 1, out) != 1) + { + _fatal("write failure: %s.", strerror(errno)); + return(PATCHERROR); + } /* if */ + + if (fwrite(&mode, sizeof (mode), 1, out) != 1) + { + _fatal("write failure: %s.", strerror(errno)); + return(PATCHERROR); + } /* if */ + + rc = write_between_files(in, out, fsize); + assert(fgetc(in) == EOF); + fclose(in); + _dlog(" (%ld bytes in file.)", fsize); + return(rc); +} /* put_add */ + + +/* get an ADD or REPLACE operation from the mojopatch file... */ +/* !!! FIXME: This really needs compression... */ +static int get_add(FILE *in, int replace_ok) +{ + md5_byte_t md5[16]; + int retval = PATCHERROR; + FILE *io = NULL; + char fname[MAX_PATH]; + long fsize; + int rc; + mode_t mode; + + if (read_asciz_string(fname, in) == PATCHERROR) + goto get_add_done; + + if (fread(&fsize, sizeof (fsize), 1, in) != 1) + { + _fatal("Read error: %s.", strerror(errno)); + return(PATCHERROR); + } /* if */ + + if (fread(md5, sizeof (md5), 1, in) != 1) + { + _fatal("Read error: %s.", strerror(errno)); + goto get_add_done; + } /* if */ + + if (fread(&mode, sizeof (mode), 1, in) != 1) + { + _fatal("Read error: %s.", strerror(errno)); + return(PATCHERROR); + } /* if */ + + _current_operation("%s %s", (replace_ok) ? "ADDORREPLACE" : "ADD", + final_path_element(fname)); + _log("%s %s", (replace_ok) ? "ADDORREPLACE" : "ADD", fname); + + if ( (info_only()) || (!confirm()) || (in_ignore_list(fname)) ) + { + if (fseek(in, fsize, SEEK_CUR) < 0) + { + _fatal("Seek error: %s.", strerror(errno)); + return(PATCHERROR); + } /* if */ + return(PATCHSUCCESS); + } /* if */ + + if (file_exists(fname)) + { + if (replace_ok) + unlink(fname); + else + { + if (file_is_directory(fname)) + { + _fatal("Error: [%s] already exists, but it's a directory!", fname); + return(PATCHERROR); + } /* if */ + + _log("[%s] already exists...looking at md5sum...", fname); + _current_operation("VERIFY %s", final_path_element(fname)); + io = fopen(fname, "rb"); + if (io == NULL) + { + _fatal("Failed to open added file for read: %s.", strerror(errno)); + goto get_add_done; + } /* if */ + + if (verify_md5sum(md5, NULL, io, 1) == PATCHERROR) + goto get_add_done; + + _log("Okay; file matches what we expected."); + fclose(io); + + if (fseek(in, fsize, SEEK_CUR) < 0) + { + _fatal("Seek error: %s.", strerror(errno)); + return(PATCHERROR); + } /* if */ + + return(PATCHSUCCESS); + } /* else */ + } /* if */ + + io = fopen(fname, "wb"); + if (io == NULL) + { + _fatal("Error creating [%s]: %s.", fname, strerror(errno)); + goto get_add_done; + } /* if */ + + rc = write_between_files(in, io, fsize); + if (rc == PATCHERROR) + goto get_add_done; + + if (fclose(io) == EOF) + { + _fatal("Error: Couldn't flush output: %s.", strerror(errno)); + goto get_add_done; + } /* if */ + + chmod(fname, mode); /* !!! FIXME: Should this be an error condition? */ + + _current_operation("VERIFY %s", final_path_element(fname)); + io = fopen(fname, "rb"); + if (io == NULL) + { + _fatal("Failed to open added file for read: %s.", strerror(errno)); + goto get_add_done; + } /* if */ + + if (verify_md5sum(md5, NULL, io, 1) == PATCHERROR) + goto get_add_done; + + retval = PATCHSUCCESS; + _log("done %s.", (replace_ok) ? "ADDORREPLACE" : "ADD"); + +get_add_done: + if (io != NULL) + fclose(io); + + return(retval); +} /* get_add */ + + +static int put_add_for_wholedir(const char *base, FILE *out); + + +/* put an ADDDIRECTORY operation in the mojopatch file... */ +static int put_add_dir(const char *fname, FILE *out) +{ + unsigned char operation = OPERATION_ADDDIRECTORY; + struct stat statbuf; + mode_t mode; + + _current_operation("ADDDIRECTORY %s", final_path_element(fname)); + _log("ADDDIRECTORY %s", fname); + + if (!confirm()) + return(PATCHSUCCESS); + + if (in_ignore_list(fname)) + return(PATCHSUCCESS); + + if (stat(fname, &statbuf) == -1) + { + _fatal("Couldn't stat %s: %s.", fname, strerror(errno)); + return(PATCHERROR); + } /* if */ + mode = (mode_t) statbuf.st_mode; + + if (fwrite(&operation, sizeof (operation), 1, out) != 1) + { + _fatal("write failure: %s.", strerror(errno)); + return(PATCHERROR); + } /* if */ + + if (fwrite(fname, strlen(fname) + 1, 1, out) != 1) + { + _fatal("write failure: %s.", strerror(errno)); + return(PATCHERROR); + } /* if */ + + if (fwrite(&mode, sizeof (mode), 1, out) != 1) + { + _fatal("write failure: %s.", strerror(errno)); + return(PATCHERROR); + } /* if */ + + /* must add contents of dir after dir itself... */ + if (put_add_for_wholedir(fname, out) == PATCHERROR) + return(PATCHERROR); + + return(PATCHSUCCESS); +} /* put_add_dir */ + + +/* get an ADDDIRECTORY operation from the mojopatch file... */ +static int get_add_dir(FILE *in) +{ + char fname[MAX_PATH]; + mode_t mode; + + if (read_asciz_string(fname, in) == PATCHERROR) + return(PATCHERROR); + + if (fread(&mode, sizeof (mode), 1, in) != 1) + { + _fatal("Read error: %s.", strerror(errno)); + return(PATCHERROR); + } /* if */ + + _current_operation("ADDDIRECTORY %s", final_path_element(fname)); + _log("ADDDIRECTORY %s", fname); + + if ( (info_only()) || (!confirm()) || (in_ignore_list(fname)) ) + return(PATCHSUCCESS); + + if (file_exists(fname)) + { + if (file_is_directory(fname)) + { + _log("[%s] already exists.", fname); + return(PATCHSUCCESS); + } /* if */ + else + { + _fatal("[%s] already exists, but it's a file!", fname); + return(PATCHERROR); + } /* else */ + } /* if */ + + if (mkdir(fname, S_IRWXU) == -1) + { + _fatal("Error making directory [%s]: %s.", fname, strerror(errno)); + return(PATCHERROR); + } /* if */ + chmod(fname, mode); /* !!! FIXME: Should this be an error condition? */ + + _log("done ADDDIRECTORY."); + return(PATCHSUCCESS); +} /* get_add_dir */ + + +/* put add operations for each file in (base). Recurses into subdirs. */ +static int put_add_for_wholedir(const char *base, FILE *out) +{ + char filebuf[MAX_PATH]; + file_list *files = make_filelist(base); + file_list *i; + int rc = 0; + + for (i = files; i != NULL; i = i->next) + { + snprintf(filebuf, sizeof (filebuf), "%s%s%s", base, PATH_SEP, i->fname); + + /* put_add_dir recurses back into this function. */ + if (file_is_directory(filebuf)) + rc = put_add_dir(filebuf, out); + else + rc = put_add(filebuf, out); + + if (rc == PATCHERROR) + { + free_filelist(files); + return(PATCHERROR); + } /* if */ + } /* for */ + + free_filelist(files); + return(PATCHSUCCESS); +} /* put_add_for_wholedir */ + + +static int md5sums_match(const char *fname1, const char *fname2, + md5_byte_t *md5_1, md5_byte_t *md5_2) +{ + FILE *in; + + in = fopen(fname1, "rb"); + if (in == NULL) + return(0); + + if (md5sum(in, md5_1, 0) == PATCHERROR) + return(0); + + fclose(in); + + in = fopen(fname2, "rb"); + if (in == NULL) + return(0); + + if (md5sum(in, md5_2, 0) == PATCHERROR) + return(0); + + fclose(in); + + return(memcmp(md5_1, md5_2, 16) == 0); +} /* md5sums_match */ + + +/* put a PATCH operation in the mojopatch file... */ +static int put_patch(const char *fname1, const char *fname2, FILE *out) +{ + md5_byte_t md5_1[16]; + md5_byte_t md5_2[16]; + unsigned char operation = OPERATION_PATCH; + long fsize; + FILE *deltaio = NULL; + int rc; + struct stat statbuf; + mode_t mode; + + _current_operation("VERIFY %s", final_path_element(fname2)); + if (md5sums_match(fname1, fname2, md5_1, md5_2)) + return(PATCHSUCCESS); + + _current_operation("PATCH %s", final_path_element(fname2)); + _log("PATCH %s", fname2); + + if (!confirm()) + return(PATCHSUCCESS); + + if (in_ignore_list(fname2)) + return(PATCHSUCCESS); + + if (fwrite(&operation, sizeof (operation), 1, out) != 1) + { + _fatal("write failure: %s.", strerror(errno)); + return(PATCHERROR); + } /* if */ + + if (fwrite(fname2, strlen(fname2) + 1, 1, out) != 1) + { + _fatal("write failure: %s.", strerror(errno)); + return(PATCHERROR); + } /* if */ + + if (fwrite(&md5_1, sizeof (md5_1), 1, out) != 1) + { + _fatal("write failure: %s.", strerror(errno)); + return(PATCHERROR); + } /* if */ + + if (fwrite(&md5_2, sizeof (md5_2), 1, out) != 1) + { + _fatal("write failure: %s.", strerror(errno)); + return(PATCHERROR); + } /* if */ + + if (!get_file_size(fname2, &fsize)) + return(PATCHERROR); + + if (fwrite(&fsize, sizeof (fsize), 1, out) != 1) + { + _fatal("write failure: %s.", strerror(errno)); + return(PATCHERROR); + } /* if */ + + if ( (!_do_xdelta("delta -n --maxmem=%dM \"%s\" \"%s\" \"%s\"", maxxdeltamem, fname1, fname2, patchtmpfile)) || + (!get_file_size(patchtmpfile, &fsize)) ) + { + /* !!! FIXME: Not necessarily true. */ + _fatal("there was a problem running xdelta."); + return(PATCHERROR); + } /* if */ + + if (fwrite(&fsize, sizeof (fsize), 1, out) != 1) + { + _fatal("write failure: %s.", strerror(errno)); + return(PATCHERROR); + } /* if */ + + if (stat(fname2, &statbuf) == -1) + { + _fatal("Couldn't stat %s: %s.", fname2, strerror(errno)); + return(PATCHERROR); + } /* if */ + mode = (mode_t) statbuf.st_mode; + + if (fwrite(&mode, sizeof (mode), 1, out) != 1) + { + _fatal("write failure: %s.", strerror(errno)); + return(PATCHERROR); + } /* if */ + + deltaio = fopen(patchtmpfile, "rb"); + if (deltaio == NULL) + { + _fatal("couldn't read %s: %s.", patchtmpfile, strerror(errno)); + return(PATCHERROR); + } /* if */ + + rc = write_between_files(deltaio, out, fsize); + assert(fgetc(deltaio) == EOF); + fclose(deltaio); + unlink(patchtmpfile); + _dlog(" (%ld bytes in patch.)", fsize); + return(rc); +} /* put_patch */ + + +/* get a PATCH operation from the mojopatch file... */ +static int get_patch(FILE *in) +{ + md5_byte_t md5_1[16]; + md5_byte_t md5_2[16]; + md5_byte_t md5result[16]; + long fsize; + long deltasize; + char fname[MAX_PATH]; + FILE *f = NULL; + FILE *deltaio = NULL; + int rc; + mode_t mode; + + if (read_asciz_string(fname, in) == PATCHERROR) + return(PATCHERROR); + + if (fread(md5_1, sizeof (md5_1), 1, in) != 1) + { + _fatal("Read error: %s.", strerror(errno)); + return(PATCHERROR); + } /* if */ + + if (fread(md5_2, sizeof (md5_2), 1, in) != 1) + { + _fatal("Read error: %s.", strerror(errno)); + return(PATCHERROR); + } /* if */ + + if (fread(&fsize, sizeof (fsize), 1, in) != 1) + { + _fatal("Read error: %s.", strerror(errno)); + return(PATCHERROR); + } /* if */ + + if (fread(&deltasize, sizeof (deltasize), 1, in) != 1) + { + _fatal("Read error: %s.", strerror(errno)); + return(PATCHERROR); + } /* if */ + + if (fread(&mode, sizeof (mode), 1, in) != 1) + { + _fatal("Read error: %s.", strerror(errno)); + return(PATCHERROR); + } /* if */ + + _log("PATCH %s", fname); + + if ( (info_only()) || (!confirm()) || (in_ignore_list(fname)) ) + { + if (fseek(in, deltasize, SEEK_CUR) < 0) + { + _fatal("Seek error: %s.", strerror(errno)); + return(PATCHERROR); + } /* if */ + return(PATCHSUCCESS); + } /* if */ + + f = fopen(fname, "rb"); + if (f == NULL) + { + _fatal("Failed to open [%s] for read: %s.", fname, strerror(errno)); + return(PATCHERROR); + } /* if */ + + _current_operation("VERIFY %s", final_path_element(fname)); + rc = verify_md5sum(md5_1, md5result, f, 0); + fclose(f); + if (rc == PATCHERROR) + { + if (memcmp(md5_2, md5result, sizeof (md5_2)) == 0) + { + _log("Okay; file matches patched md5sum. It's already patched."); + if (fseek(in, deltasize, SEEK_CUR) < 0) + { + _fatal("Seek error: %s.", strerror(errno)); + return(PATCHERROR); + } /* if */ + return(PATCHSUCCESS); + } /* if */ + return(PATCHERROR); + } /* if */ + + unlink(patchtmpfile2); /* just in case... */ + + _current_operation("PATCH %s", final_path_element(fname)); + deltaio = fopen(patchtmpfile2, "wb"); + if (deltaio == NULL) + { + _fatal("Failed to open [%s] for write: %s.", patchtmpfile2, strerror(errno)); + return(PATCHERROR); + } /* if */ + + rc = write_between_files(in, deltaio, deltasize); + fclose(deltaio); + if (rc == PATCHERROR) + { + unlink(patchtmpfile2); + return(PATCHERROR); + } /* if */ + + if (!_do_xdelta("patch --maxmem=%dM \"%s\" \"%s\" \"%s\"", maxxdeltamem, patchtmpfile2, fname, patchtmpfile)) + { + _fatal("xdelta failed."); + return(PATCHERROR); + } /* if */ + + unlink(patchtmpfile2); /* ditch temp delta file... */ + + f = fopen(patchtmpfile, "rb"); + if (f == NULL) + { + _fatal("Failed to open [%s] for read: %s.", patchtmpfile, strerror(errno)); + return(PATCHERROR); + } /* if */ + + _current_operation("VERIFY %s", final_path_element(fname)); + rc = verify_md5sum(md5_2, NULL, f, 1); + fclose(f); + if (rc == PATCHERROR) + return(PATCHERROR); + + if (do_rename(patchtmpfile, fname) == -1) + { + _fatal("Error replacing [%s] with tempfile: %s.", fname, strerror(errno)); + return(PATCHERROR); + } /* if */ + + chmod(fname, mode); /* !!! FIXME: fatal error? */ + + _log("done PATCH."); + return(PATCHSUCCESS); +} /* get_patch */ + + +static int compare_directories(const char *base1, const char *base2, FILE *out) +{ + int retval = PATCHERROR; + char filebuf1[MAX_PATH]; + char filebuf2[MAX_PATH]; /* can you feel the stack screaming? */ + const char *base2checked = *base2 ? base2 : "."; + file_list *files1 = make_filelist(base1); + file_list *files2 = NULL; + file_list *i; + + /* may be recursive compare on deleted dir. */ + if (file_exists(base2checked)) + files2 = make_filelist(base2checked); + + assert(*base1); + + _current_operation("Examining %s", final_path_element(base2checked)); + _dlog("Examining %s and %s", base1, base2checked); + + _dlog("(looking for files that need deletion...)"); + + /* check for files removed in newer version... */ + for (i = files1; i != NULL; i = i->next) + { + _dlog("([%s]...)", i->fname); + + snprintf(filebuf2, sizeof (filebuf2), "%s%s%s", base2, + *base2 ? PATH_SEP : "", i->fname); + + if (!file_exists(filebuf2)) + { + int rc = 0; + + snprintf(filebuf1, sizeof (filebuf1), "%s%s%s", base1, PATH_SEP, i->fname); + if (!file_is_directory(filebuf1)) + rc = put_delete(filebuf2, out); + else + { + rc = compare_directories(filebuf1, filebuf2, out); + if (rc != PATCHERROR) + rc = put_delete_dir(filebuf1, filebuf2, out); + } /* else */ + + if (rc == PATCHERROR) + goto dircompare_done; + } /* if */ + } /* for */ + + _dlog("(looking for files that need addition...)"); + + /* check for files added in newer version... */ + for (i = files2; i != NULL; i = i->next) + { + _dlog("([%s]...)", i->fname); + + snprintf(filebuf1, sizeof (filebuf1), "%s%s%s", base1, PATH_SEP, i->fname); + snprintf(filebuf2, sizeof (filebuf2), "%s%s%s", base2, + *base2 ? PATH_SEP : "", i->fname); + + if (file_exists(filebuf1)) /* exists in both dirs; do compare. */ + { + if (file_is_directory(filebuf2)) + { + /* probably a bad sign ... */ + if (!file_is_directory(filebuf1)) + { + _log("%s is a directory, but %s is not!", filebuf2, filebuf1); + if (put_delete(filebuf2, out) == PATCHERROR) + goto dircompare_done; + + if (put_add_dir(filebuf2, out) == PATCHERROR) + goto dircompare_done; + } /* if */ + + if (compare_directories(filebuf1, filebuf2, out) == PATCHERROR) + goto dircompare_done; + } /* if */ + + else /* new item is not a directory. */ + { + /* probably a bad sign ... */ + if (file_is_directory(filebuf1)) + { + _log("Warning: %s is a directory, but %s is not!", filebuf1, filebuf2); + if (put_delete_dir(filebuf1, filebuf2, out) == PATCHERROR) + goto dircompare_done; + + if (put_add(filebuf2, out) == PATCHERROR) + goto dircompare_done; + } /* if */ + + else + { + /* may not put anything if files match... */ + if (put_patch(filebuf1, filebuf2, out) == PATCHERROR) + goto dircompare_done; + } /* else */ + } /* else */ + } /* if */ + + else /* doesn't exist in second dir; do add. */ + { + if (file_is_directory(filebuf2)) + { + if (put_add_dir(filebuf2, out) == PATCHERROR) + goto dircompare_done; + } /* if */ + + else + { + if (put_add(filebuf2, out) == PATCHERROR) + goto dircompare_done; + } /* else */ + } /* else */ + } /* for */ + + retval = PATCHSUCCESS; + +dircompare_done: + free_filelist(files1); + free_filelist(files2); + return(retval); +} /* compare_directories */ + + +static char *read_whole_file(const char *fname) +{ + int i; + int rc; + FILE *io = NULL; + long fsize = 0; + char *retval = NULL; + + if (!get_file_size(fname, &fsize)) + { + _fatal("Can't get filesize for [%s]...file missing?", fname); + return(NULL); + } /* if */ + + if ( (retval = (char *) malloc(fsize + 1)) == NULL ) + { + _fatal("Out of memory."); + return(NULL); + } /* if */ + + if ( (io = fopen(fname, "r")) == NULL ) + { + _fatal("Can't open [%s].", fname); + free(retval); + return(NULL); + } /* if */ + + rc = fread(retval, fsize, 1, io); + fclose(io); + + if (rc != 1) + { + _fatal("Read on [%s] failed: %s", fname, strerror(errno)); + free(retval); + return(NULL); + } /* if */ + + /* This considers it an error condition to have a null char in the file. */ + for (i = 0; i < fsize; i++) + { + if (retval[i] == '\0') + { + _fatal("null char in read_whole_file."); + free(retval); + return(NULL); + } /* if */ + } /* for */ + retval[fsize] = '\0'; + + return(retval); +} /* read_whole_file */ + + +static int create_patchfile(void) +{ + int retval = PATCHSUCCESS; + char *real1 = NULL; + char *real2 = NULL; + char *real3 = NULL; + long fsize; + FILE *out; + char *readmedata = ""; + char *readmedataptr = NULL; + const char *readmefname = final_path_element(readme); + + if (strcmp(identifier, "") == 0) /* specified on the commandline. */ + { + ui_fatal("Can't create a patchfile without an identifier."); + return(PATCHERROR); + } /* if */ + + // !!! FIXME: platform should determine this by examining compared dirs. + if (strcmp(version, "") == 0) /* specified on the commandline. */ + { + ui_fatal("Can't create a patchfile without --version."); + return(PATCHERROR); + } /* if */ + + // !!! FIXME: platform should determine this by examining compared dirs. + if (strcmp(newversion, "") == 0) /* specified on the commandline. */ + { + ui_fatal("Can't create a patchfile without --newversion."); + return(PATCHERROR); + } /* if */ + + real1 = get_realpath(dir1); + if (real1 == NULL) + { + _fatal("Couldn't get realpath of [%s].", dir1); + return(PATCHERROR); + } /* if */ + + real2 = get_realpath(dir2); + if (real2 == NULL) + { + _fatal("Couldn't get realpath of [%s].", dir2); + return(PATCHERROR); + } /* if */ + + real3 = get_realpath(patchfile); + if (real3 == NULL) + { + _fatal("Couldn't get realpath of [%s].", patchfile); + return(PATCHERROR); + } /* if */ + + unlink(patchfile); /* just in case. */ + out = fopen(patchfile, "wb"); + if (out == NULL) + { + free(real1); + free(real2); + free(real3); + _fatal("Couldn't open [%s]: %s.", patchfile, strerror(errno)); + return(PATCHERROR); + } /* if */ + + if (chdir(real2) != 0) + { + fclose(out); + free(real1); + free(real2); + free(real3); + _fatal("Couldn't chdir to [%s]: %s.", real2, strerror(errno)); + return(PATCHERROR); + } /* if */ + free(real2); + + if (*readme) + { + readmedata = readmedataptr = read_whole_file(readme); + if (!readmedata) + { + fclose(out); + free(real1); + free(real3); + return(PATCHERROR); + } /* if */ + } /* if */ + + if ( (fwrite(MOJOPATCHSIG, strlen(MOJOPATCHSIG) + 1, 1, out) != 1) || + (fwrite(product, strlen(product) + 1, 1, out) != 1) || + (fwrite(identifier, strlen(identifier) + 1, 1, out) != 1) || + (fwrite(version, strlen(version) + 1, 1, out) != 1) || + (fwrite(newversion, strlen(newversion) + 1, 1, out) != 1) || + (fwrite(readmefname, strlen(readmefname) + 1, 1, out) != 1) || + (fwrite(readmedata, strlen(readmedata) + 1, 1, out) != 1) || + (fwrite(renamedir, strlen(renamedir) + 1, 1, out) != 1) ) + { + _fatal("Couldn't write header [%s]: %s.", patchfile, strerror(errno)); + fclose(out); + free(real1); + free(real3); + free(readmedataptr); + return(PATCHERROR); + } /* if */ + + free(readmedataptr); + + retval = compare_directories(real1, "", out); + + free(real1); + + if (fclose(out) == EOF) + { + free(real3); + _fatal("Couldn't close [%s]: %s.", patchfile, strerror(errno)); + retval = PATCHERROR; + } /* if */ + + if (!get_file_size(real3, &fsize)) + { + _fatal("Couldn't get size of [%s]: %s.", patchfile, strerror(errno)); + retval = PATCHERROR; + } /* if */ + free(real3); + + if (retval == PATCHERROR) + _fatal("THE FILE [%s] IS LIKELY INCOMPLETE. DO NOT USE!", patchfile); + else + { + ui_success("Patchfile successfully created."); + _log("%ld bytes in the file [%s].", fsize, patchfile); + } /* else */ + + return(retval); +} /* create_patchfile */ + + +static int do_patch_operations(FILE *in, int do_progress, long patchfile_size) +{ + if (info_only()) + _log("These are the operations we would perform if patching..."); + + while (1) + { + ui_pump(); + + if (do_progress) + { + long pos = ftell(in); + if (pos != -1) + { + float progress = ((float) pos) / ((float) patchfile_size); + ui_total_progress((int) (progress * 100.0f)); + } /* if */ + else + { + do_progress = 0; + ui_total_progress(-1); + } /* else */ + } /* if */ + + int ch = fgetc(in); + if (ch == EOF) + { + if (feof(in)) + { + return(PATCHSUCCESS); + } /* if */ + else if (ferror(in)) + { + _fatal("Read error: %s.", strerror(errno)); + return(PATCHERROR); + } /* else if */ + + assert(0); /* wtf?! */ + _fatal("Odd read error."); + return(PATCHERROR); /* normal EOF. */ + } /* if */ + + switch ((char) ch) + { + case OPERATION_DELETE: + if (get_delete(in) == PATCHERROR) + return(PATCHERROR); + break; + + case OPERATION_DELETEDIRECTORY: + if (get_delete_dir(in) == PATCHERROR) + return(PATCHERROR); + break; + + case OPERATION_ADD: + if (get_add(in, 0) == PATCHERROR) + return(PATCHERROR); + break; + + case OPERATION_REPLACE: + if (get_add(in, 1) == PATCHERROR) + return(PATCHERROR); + break; + + case OPERATION_ADDDIRECTORY: + if (get_add_dir(in) == PATCHERROR) + return(PATCHERROR); + break; + + case OPERATION_PATCH: + if (get_patch(in) == PATCHERROR) + return(PATCHERROR); + break; + + default: + _fatal("Error: Unknown operation (%d).", ch); + return(PATCHERROR); + } /* switch */ + } /* while */ + + assert(0); /* shouldn't hit this. */ + return(PATCHERROR); +} /* do_patch_operations */ + + +static int extract_readme(const char *fname, FILE *in) +{ + int retval = PATCHSUCCESS; + char *buf = NULL; + size_t buflen = 0; + size_t br = 0; + int ch = 0; + + do + { + ch = fgetc(in); + if (ch == EOF) + { + _fatal("Unexpected EOF in patchfile."); + free(buf); + return(PATCHERROR); + } /* if */ + + if (buflen <= br) + { + char *ptr; + buflen += 1024; + ptr = realloc(buf, buflen); + if (!ptr) + { + free(buf); + _fatal("Out of memory."); + return(PATCHERROR); + } /* if */ + buf = ptr; + } /* if */ + + buf[br++] = (char) ch; + } while (ch != '\0'); + + if ( (*buf) && (!info_only()) ) + retval = show_and_install_readme(fname, buf); + + free(buf); + return(retval); +} /* extract_readme */ + + +static int check_patch_header(FILE *in) +{ + char buffer[MAX_PATH]; + + if (read_asciz_string(buffer, in) == PATCHERROR) + return(PATCHERROR); + + if (strcmp(buffer, MOJOPATCHSIG) != 0) + { + _fatal("[%s] is not a compatible mojopatch file.", patchfile); + _log("signature is: %s.", buffer); + _log(" expected: %s.", MOJOPATCHSIG); + return(PATCHERROR); + } /* if */ + + if (read_asciz_string(buffer, in) == PATCHERROR) + return(PATCHERROR); + if (strcmp(product, "") == 0) + { + if (strcmp(buffer, "") == 0) + snprintf(product, sizeof (product) - 1, "MojoPatch %s", VERSION); + else + strncpy(product, buffer, sizeof (product) - 1); + } /* if */ + product[sizeof (product) - 1] = '\0'; /* just in case. */ + ui_title(product); + + if (read_asciz_string(buffer, in) == PATCHERROR) + return(PATCHERROR); + if (strcmp(identifier, "") == 0) + strncpy(identifier, buffer, sizeof (identifier) - 1); + identifier[sizeof (identifier) - 1] = '\0'; /* just in case. */ + + if (read_asciz_string(buffer, in) == PATCHERROR) + return(PATCHERROR); + if (strcmp(version, "") == 0) + strncpy(version, buffer, sizeof (version) - 1); + version[sizeof (version) - 1] = '\0'; /* just in case. */ + + if (!info_only()) + { + if (!chdir_by_identifier(identifier, version)) + return(PATCHERROR); + } /* if */ + + if (read_asciz_string(buffer, in) == PATCHERROR) + return(PATCHERROR); + if (strcmp(newversion, "") == 0) + strncpy(newversion, buffer, sizeof (newversion) - 1); + newversion[sizeof (newversion) - 1] = '\0'; /* just in case. */ + + if (read_asciz_string(buffer, in) == PATCHERROR) + return(PATCHERROR); + if (strcmp(readme, "") == 0) + strncpy(readme, buffer, sizeof (readme) - 1); + readme[sizeof (readme) - 1] = '\0'; /* just in case. */ + + if (extract_readme(readme, in) == PATCHERROR) + return(PATCHERROR); + + if (read_asciz_string(buffer, in) == PATCHERROR) + return(PATCHERROR); + if (strcmp(renamedir, "") == 0) + strncpy(renamedir, buffer, sizeof (renamedir) - 1); + renamedir[sizeof (renamedir) - 1] = '\0'; /* just in case. */ + + _log("Product to patch: \"%s\".", product); + _log("Product identifier: \"%s\".", identifier); + _log("Patch from version: \"%s\".", version); + _log("Patch to version: \"%s\".", newversion); + _log("Readme: \"%s\".", *readme ? readme : "(none)"); + _log("Renamedir: \"%s\".", *renamedir ? renamedir : "(none)"); + + return(PATCHSUCCESS); +} /* check_patch_header */ + + +static int do_patching(void) +{ + int report_error = 0; + int retval = PATCHERROR; + FILE *in = NULL; + long patchfile_size = 0; + int do_progress = 0; + + if (strcmp(patchfile, "-") == 0) /* read from stdin? */ + in = stdin; + else + { + do_progress = get_file_size(patchfile, &patchfile_size); + if (patchfile_size == 0) + do_progress = 0; /* prevent a division by zero. */ + + in = fopen(patchfile, "rb"); + } /* else */ + + ui_total_progress(do_progress ? 0 : -1); + ui_pump(); + + if (in == NULL) + { + _fatal("Couldn't open [%s]: %s.", patchfile, strerror(errno)); + return(PATCHERROR); + } /* if */ + + if (check_patch_header(in) == PATCHERROR) + goto do_patching_done; + + report_error = 1; + if (do_patch_operations(in, do_progress, patchfile_size) == PATCHERROR) + goto do_patching_done; + + if (!info_only()) + { + _current_operation("Updating product version..."); + ui_total_progress(-1); + if ( (strcmp(newversion, "") != 0) && (!update_version(newversion)) ) + goto do_patching_done; + + if (*renamedir) + { + char cwdbuf[MAX_PATH]; + _log("Renaming product's root directory to [%s].", renamedir); + if (getcwd(cwdbuf, sizeof (cwdbuf)) != NULL) + { + chdir(".."); + rename(cwdbuf, renamedir); + chdir(renamedir); /* just in case */ + } /* if */ + } /* if */ + } /* if */ + + retval = PATCHSUCCESS; + ui_total_progress(100); + if (!info_only()) + ui_success("Patching successful!"); + +do_patching_done: + if ((in != stdin) && (in != NULL)) + fclose(in); + + if ((retval == PATCHERROR) && (report_error)) + { + ui_total_progress(-1); + _fatal("There were problems, so I'm aborting."); + if (!info_only()) + _fatal("The product is possibly damaged and requires a fresh installation."); + } /* if */ + + return(retval); +} /* do_patching */ + + +static int do_usage(const char *argv0) +{ + _log(""); + _log("USAGE: %s --create ", argv0); + _log(" or: %s --info ", argv0); + _log(" or: %s ", argv0); + _log(""); + _log(" You may also specify:"); + _log(" --product (Product name for titlebar)"); + _log(" --identifier (Product identifier for locating installation)"); + _log(" --version (Product version to patch against)"); + _log(" --newversion (Product version to patch up to)"); + _log(" --replace (AT CREATE TIME, specify ADDs can overwrite)"); + _log(" --readme (README filename to display/install)"); + _log(" --renamedir (What patched dir should be called)"); + _log(" --ignore (Ignore specific files/dirs)"); + _log(" --confirm (Make process confirm each step)"); + _log(" --debug (spew debugging output)"); + _log(""); + return(0); +} /* do_usage */ + + +static int set_command_or_abort(PatchCommands cmd) +{ + if (command != COMMAND_NONE) + { + _fatal("You've specified more than one command!"); + return(0); + } /* if */ + + command = cmd; + return(1); +} /* set_command_or_abort */ + + +static int parse_cmdline(int argc, char **argv) +{ + int i; + int nonoptcount = 0; + char **nonoptions = (char **) alloca(sizeof (char *) * argc); + + if (nonoptions == NULL) + { + _fatal("Out of memory!"); + return(0); + } /* if */ + + if (argc <= 1) + { + if (file_exists(DEFAULT_PATCHFILENAME)) + nonoptions[nonoptcount++] = DEFAULT_PATCHFILENAME; + else + return(do_usage(argv[0])); + } /* if */ + + product[0] = '\0'; /* just in case. */ + identifier[0] = '\0'; /* just in case. */ + + for (i = 1; i < argc; i++) + { + int okay = 1; + + if (strncmp(argv[i], "--", 2) != 0) + { + nonoptions[nonoptcount++] = argv[i]; + continue; + } /* if */ + + if (strcmp(argv[i], "--create") == 0) + okay = set_command_or_abort(COMMAND_CREATE); + else if (strcmp(argv[i], "--info") == 0) + okay = set_command_or_abort(COMMAND_INFO); + else if (strcmp(argv[i], "--confirm") == 0) + interactive = 1; + else if (strcmp(argv[i], "--debug") == 0) + debug = 1; + else if (strcmp(argv[i], "--replace") == 0) + replace = 1; + else if (strcmp(argv[i], "--product") == 0) + strncpy(product, argv[++i], sizeof (product) - 1); + else if (strcmp(argv[i], "--identifier") == 0) + strncpy(identifier, argv[++i], sizeof (identifier) - 1); + else if (strcmp(argv[i], "--version") == 0) + strncpy(version, argv[++i], sizeof (version) - 1); + else if (strcmp(argv[i], "--newversion") == 0) + strncpy(newversion, argv[++i], sizeof (newversion) - 1); + else if (strcmp(argv[i], "--readme") == 0) + strncpy(readme, argv[++i], sizeof (readme) - 1); + else if (strcmp(argv[i], "--renamedir") == 0) + strncpy(renamedir, argv[++i], sizeof (renamedir) - 1); + else if (strcmp(argv[i], "--ignore") == 0) + { + ignorecount++; + ignorelist = (char **) realloc(ignorelist, sizeof (char *) * ignorecount); + // !!! FIXME: Check retval. + ignorelist[ignorecount-1] = argv[++i]; + } /* else if */ + else + { + _fatal("Error: Unknown option [%s].", argv[i]); + return(do_usage(argv[0])); + } /* else */ + + if (!okay) + return(0); + } /* for */ + + product[sizeof (product) - 1] = '\0'; /* just in case. */ + identifier[sizeof (identifier) - 1] = '\0'; /* just in case. */ + + if (command == COMMAND_NONE) + command = COMMAND_DOPATCHING; + + switch (command) + { + case COMMAND_INFO: + case COMMAND_DOPATCHING: + if (nonoptcount != 1) + { + _fatal("Error: Wrong arguments."); + return(do_usage(argv[0])); + } /* if */ + patchfile = nonoptions[0]; + break; + + case COMMAND_CREATE: + if (nonoptcount != 3) + { + _fatal("Error: Wrong arguments."); + return(do_usage(argv[0])); + } /* if */ + + patchfile = nonoptions[0]; + dir1 = nonoptions[1]; + dir2 = nonoptions[2]; + break; + + default: + assert(0); + break; + } /* switch */ + + if (debug) + { + _dlog("debugging enabled."); + _dlog("Interactive mode %senabled.", (interactive) ? "" : "NOT "); + _dlog("ADDs are %spermitted to REPLACE.", (replace) ? "" : "NOT "); + _dlog("command == (%d).", (int) command); + _dlog("(%d) nonoptions:", nonoptcount); + for (i = 0; i < nonoptcount; i++) + _dlog(" [%s]", nonoptions[i]); + _dlog("patchfile == [%s].", (patchfile) ? patchfile : "(null)"); + _dlog("dir1 == [%s].", (dir1) ? dir1 : "(null)"); + _dlog("dir2 == [%s].", (dir2) ? dir2 : "(null)"); + for (i = 0; i < ignorecount; i++) + _dlog("ignoring [%s].", ignorelist[i]); + } /* if */ + + return(1); +} /* parse_cmdline */ + + +/* !!! FIXME: signal_cleanup */ + + +int mojopatch_main(int argc, char **argv) +{ + time_t starttime = time(NULL); + int retval = PATCHSUCCESS; + + if (!ui_init()) + { + _fatal("MojoPatch: ui_init() failed!"); /* oh well. */ + return(PATCHERROR); + } /* if */ + + _log("MojoPatch %s starting up.", VERSION); + + if (!parse_cmdline(argc, argv)) + { + ui_deinit(); + return(PATCHERROR); + } /* if */ + + if (!calc_tmp_filenames(&patchtmpfile, &patchtmpfile2)) + { + _fatal("Internal error: Couldn't find scratch filenames."); + ui_deinit(); + return(PATCHERROR); + } /* if */ + _dlog("Temp filenames are [%s] and [%s].", patchtmpfile, patchtmpfile2); + + if (command == COMMAND_CREATE) + retval = create_patchfile(); + else + retval = do_patching(); + + unlink(patchtmpfile); /* just in case. */ + unlink(patchtmpfile2); /* just in case. */ + + _dlog("(Total running time: %ld seconds.)", time(NULL) - starttime); + + ui_deinit(); + return(retval); +} /* mojopatch_main */ + +/* end of mojopatch.c ... */ + diff --git a/platform.h b/platform.h new file mode 100644 index 0000000..4ad1ea0 --- /dev/null +++ b/platform.h @@ -0,0 +1,70 @@ + +#ifndef _INCL_PLATFORM_H_ +#define _INCL_PLATFORM_H_ + +#ifdef __cplusplus +extern "C" { +#endif + +#if PLATFORM_WIN32 +# include +# define PATH_SEP "\\" +# if (defined _MSC_VER) +# define inline __inline +# define snprintf _snprintf +# define mkdir(x, y) _mkdir(x) +# define chdir(x) _chdir(x) +# endif +# define MAX_PATH 1024 +#elif PLATFORM_UNIX +# include +# include +# include +# include +# include +# define PATH_SEP "/" +# define MAX_PATH MAXPATHLEN +#else +# #error please define your platform. +#endif + +typedef struct MOJOPATCH_FILELIST +{ + char *fname; + struct MOJOPATCH_FILELIST *next; +} file_list; + +/* Your mainline calls this. */ +int mojopatch_main(int argc, char **argv); + +/* You call this for fatal error messages. */ +void _fatal(const char *fmt, ...); + +/* Call this for logging (not debug info). */ +void _log(const char *fmt, ...); + +/* Call this for logging (debug info). */ +void _dlog(const char *fmt, ...); + +/* platform-specific stuff you implement. */ +int file_exists(const char *fname); +int file_is_directory(const char *fname); +int file_is_symlink(const char *fname); +file_list *make_filelist(const char *base); /* must use malloc(). */ +int get_file_size(const char *fname, long *fsize); +char *get_current_dir(void); +char *get_realpath(const char *path); +int spawn_xdelta(const char *cmdline); +int chdir_by_identifier(const char *id, const char *version); +int update_version(const char *ver); +int calc_tmp_filenames(char **tmp1, char **tmp2); +int show_and_install_readme(const char *fname, const char *text); + +#ifdef __cplusplus +} +#endif + +#endif /* include-once blocker. */ + +/* end of platform.h ... */ + diff --git a/platform_unix.c b/platform_unix.c new file mode 100644 index 0000000..61cea14 --- /dev/null +++ b/platform_unix.c @@ -0,0 +1,527 @@ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include "platform.h" +#include "ui.h" + +int file_exists(const char *fname) +{ + struct stat statbuf; + return(stat(fname, &statbuf) == 0); +} /* file_exists */ + +int file_is_directory(const char *fname) +{ + struct stat statbuf; + int retval = 0; + + if (stat(fname, &statbuf) == 0) + { + if (S_ISDIR(statbuf.st_mode)) + retval = 1; + } /* if */ + + return(retval); +} /* file_is_directory */ + + +int file_is_symlink(const char *fname) +{ + struct stat statbuf; + int retval = 0; + + if (lstat(fname, &statbuf) == 0) + { + if (S_ISLNK(statbuf.st_mode)) + retval = 1; + } /* if */ + + return(retval); +} /* file_is_symlink */ + + +/* enumerate contents of (base) directory. */ +file_list *make_filelist(const char *base) +{ + file_list *retval = NULL; + file_list *l = NULL; + file_list *prev = NULL; + DIR *dir; + struct dirent *ent; + + errno = 0; + dir = opendir(base); + if (dir == NULL) + { + _fatal("Error: could not read dir %s: %s.", base, strerror(errno)); + return(NULL); + } /* if */ + + while (1) + { + ent = readdir(dir); + if (ent == NULL) /* we're done. */ + break; + + if (strcmp(ent->d_name, ".") == 0) + continue; + + if (strcmp(ent->d_name, "..") == 0) + continue; + + /* + * !!! FIXME: This is a workaround until symlinks are really + * !!! FIXME: supported...just pretend they don't exist for now. :( + */ + { + char buf[MAXPATHLEN]; + snprintf(buf, sizeof (buf), "%s/%s", base, ent->d_name); + if (file_is_symlink(buf)) + continue; + } + + l = (file_list *) malloc(sizeof (file_list)); + if (l == NULL) + { + _fatal("Error: out of memory."); + break; + } /* if */ + + l->fname = (char *) malloc(strlen(ent->d_name) + 1); + if (l->fname == NULL) + { + free(l); + _fatal("Error: out of memory."); + break; + } /* if */ + + strcpy(l->fname, ent->d_name); + + if (retval == NULL) + retval = l; + else + prev->next = l; + + prev = l; + l->next = NULL; + } /* while */ + + closedir(dir); + return(retval); +} /* make_filelist */ + + +int get_file_size(const char *fname, long *fsize) +{ + struct stat statbuf; + + assert(fsize != NULL); + + if (stat(fname, &statbuf) == -1) + { + _fatal("Error: failed to get filesize of [%s]: %s.", + fname, strerror(errno)); + return(0); + } /* if */ + + *fsize = statbuf.st_size; + return(1); +} /* get_file_size */ + + +char *get_realpath(const char *path) +{ + char resolved_path[MAXPATHLEN]; + char *retval = NULL; + + errno = 0; + if (!realpath(path, resolved_path)) + { + _fatal("Can't determine full path of [%s]: %s.", + path, strerror(errno)); + return(NULL); + } /* if */ + + retval = malloc(strlen(resolved_path) + 1); + if (retval == NULL) + { + _fatal("Error: out of memory."); + return(NULL); + } /* if */ + + strcpy(retval, resolved_path); + return(retval); +} /* get_realpath */ + + +#ifdef PLATFORM_MACOSX +#include + +static char *parse_xml(char *ptr, char **tag, char **val) +{ + char *ptr2; + while ( (ptr = strchr(ptr, '<')) != NULL ) + { + ptr++; + if (*ptr == '/') continue; // prior endtag. + if (*ptr == '!') continue; // initial crap. + if (*ptr == '?') continue; // initial crap. + + *tag = ptr; + *(ptr-1) = '/'; + ptr2 = strchr(ptr, ' '); + if ( (ptr = strchr(ptr, '>')) == NULL ) return(NULL); + if ((ptr2) && (ptr2 < ptr)) *ptr2 = '\0'; + *ptr = '\0'; + *val = ++ptr; + while ( (ptr = strstr(ptr, (*tag)-1)) != NULL ) + { + if (*(ptr-1) != '<') { ptr++; continue; } + *(ptr-1) = '\0'; + break; + } /* while */ + + return((ptr == NULL) ? NULL : ptr + 1); + } /* while */ + + return(NULL); +} /* parse_xml */ + + +static char *find_info_plist_version(char *ptr) +{ + int have_key = 0; + char *tag; + char *val; + + while ( (ptr = parse_xml(ptr, &tag, &val)) != NULL ) + { + if (have_key) + { + have_key = 0; + if (strcasecmp(tag, "string") == 0) + return(val); + } /* if */ + + if ((strcasecmp(tag, "plist") == 0) || (strcasecmp(tag, "dict") == 0)) + { + ptr = val; + continue; + } /* if */ + + if ((strcasecmp(tag,"key")==0)&&(strcasecmp(val,"CFBundleVersion")==0)) + have_key = 1; + } /* while */ + + return(NULL); +} /* find_info_plist_version */ + + +static int parse_info_dot_plist(const char *version) +{ + const char *fname = "Contents/Info.plist"; // already chdir'd for this. + char *mem = NULL; + char *ptr; + long fsize; + int retval = 0; + FILE *io = NULL; + + if ( !get_file_size(fname, &fsize) ) goto parse_info_plist_bailed; + if ( (mem = malloc(fsize + 1)) == NULL ) goto parse_info_plist_bailed; + if ( (io = fopen(fname, "r")) == NULL ) goto parse_info_plist_bailed; + if ( (fread(mem, fsize, 1, io)) != 1 ) goto parse_info_plist_bailed; + fclose(io); + io = NULL; + mem[fsize] = '\0'; + + ptr = find_info_plist_version(mem); + if (ptr != NULL) + { + if (strcmp(version, ptr) == 0) + retval = 1; + else + { + _fatal("This patch applies to version '%s', but you have '%s'.", + version, ptr); + free(mem); + return(0); + } /* else */ + } /* if */ + +parse_info_plist_bailed: + free(mem); + if (io != NULL) + fclose(io); + + if (!retval) _fatal("Can't determine product's installed version."); + return(retval); +} /* parse_info_dot_plist */ + + +int update_version(const char *ver) +{ + const char *fname = "Contents/Info.plist"; // already chdir'd for this. + char *mem = NULL; + char *ptr; + long fsize; + int retval = 0; + long writestart; + long writeend; + FILE *io = NULL; + + if ( !get_file_size(fname, &fsize) ) goto update_version_bailed; + if ( (mem = malloc(fsize + 1)) == NULL ) goto update_version_bailed; + if ( (io = fopen(fname, "r+")) == NULL ) goto update_version_bailed; + if ( (fread(mem, fsize, 1, io)) != 1 ) goto update_version_bailed; + mem[fsize] = '\0'; + + ptr = find_info_plist_version(mem); + if (ptr == NULL) goto update_version_bailed; + writestart = (long) (ptr - mem); + writeend = writestart + strlen(ptr); + ptr = mem + writeend; + if ( (fseek(io, 0, SEEK_SET) == -1) ) goto update_version_bailed; + if ( (fread(mem, fsize, 1, io)) != 1 ) goto update_version_bailed; + if ( (fseek(io, writestart, SEEK_SET) == -1) ) goto update_version_bailed; + if ( (fwrite(ver, strlen(ver), 1, io)) != 1 ) goto update_version_bailed; + if ( (fwrite(ptr, strlen(ptr), 1, io)) != 1 ) goto update_version_bailed; + for (fsize = (writeend - writestart); fsize > 0; fsize--) + if (fwrite(" ", 1, 1, io) != 1) goto update_version_bailed; + + retval = 1; + +update_version_bailed: + free(mem); + if (io != NULL) + fclose(io); + + if (!retval) _fatal("Can't update product's installed version."); + return(retval); +} /* update_version */ + + +int chdir_by_identifier(const char *str, const char *version) +{ + char buf[MAXPATHLEN]; + Boolean b; + OSStatus rc; + CFURLRef url = NULL; + CFStringRef id = CFStringCreateWithBytes(NULL, str, strlen(str), + kCFStringEncodingISOLatin1, 0); + + rc = LSFindApplicationForInfo(kLSUnknownCreator, id, NULL, NULL, &url); + CFRelease(id); + if (rc != noErr) + { + _fatal("Couldn't find product. Perhaps it isn't installed?"); + return(0); + } /* if */ + + b = CFURLGetFileSystemRepresentation(url, TRUE, buf, sizeof (buf)); + CFRelease(url); + if (!b) + { + _fatal("Internal error."); + return(0); + } /* if */ + + _log("I think the product is installed at [%s].", buf); + + if (chdir(buf) != 0) + { + _fatal("Failed to change to product's installation directory."); + return(0); + } /* if */ + + if (strcmp(version, "") != 0) + return(parse_info_dot_plist(version)); + + return(1); +} /* chdir_by_identifier */ + + +int show_and_install_readme(const char *fname, const char *text) +{ + FILE *io; + char *cmd; + const char *envr = getenv("HOME"); + if (!envr) + { + _fatal("HOME environment var not set?"); + return(0); + } /* if */ + + cmd = alloca(strlen(fname) + strlen(envr) + 30); + strcpy(cmd, "open "); + strcat(cmd, envr); + if (cmd[strlen(cmd)-1] != '/') + strcat(cmd, "/"); + strcat(cmd, "Desktop/"); + strcat(cmd, fname); + + io = fopen(cmd + 5, "w"); + if (!io) + { + _fatal("Failed to open [%s] for writing.", cmd+5); + return(0); + } /* if */ + + /* !!! FIXME: error checking! */ + fputs(text, io); + fclose(io); + system(cmd); + return(1); +} /* show_and_install_readme */ +#endif + + +int calc_tmp_filenames(char **tmp1, char **tmp2) +{ + static char _tmp1[MAXPATHLEN]; + static char _tmp2[MAXPATHLEN]; + pid_t pid = getpid(); + snprintf(_tmp1, sizeof (_tmp1), "/tmp/mojopatch.tmp1.%d", (int) pid); + snprintf(_tmp2, sizeof (_tmp2), "/tmp/mojopatch.tmp2.%d", (int) pid); + *tmp1 = _tmp1; + *tmp2 = _tmp2; + return(1); +} /* calc_tmp_filenames */ + + +static char *basedir = NULL; +static volatile int thread_alive = 0; + +static void *spawn_thread(void *arg) +{ + static int rc; + rc = system((char *) arg); + thread_alive = 0; + return(&rc); +} /* spawn_thread */ + + +int spawn_xdelta(const char *cmdline) +{ + pthread_t thr; + void *rc; + const char *binname = "xdelta"; + char *cmd = alloca(strlen(cmdline) + strlen(basedir) + strlen(binname) + 2); + if (!cmd) + return(0); + + sprintf(cmd, "\"%s%s\" %s", basedir, binname, cmdline); + thread_alive = 1; + if (pthread_create(&thr, NULL, spawn_thread, cmd) != 0) + return(0); + + while (thread_alive) + { + ui_pump(); + usleep(10000); + } /* while */ + + pthread_join(thr, &rc); + return(1); /* !!! FIXME *((int *) rc) == 0 ); */ +} /* spawn_xdelta */ + + +static void find_basedir(int *argc, char **argv) +{ + const char *argv0 = argv[0]; + char buf[MAXPATHLEN]; + char realbuf[MAXPATHLEN]; + + if ((argv0 != NULL) && (strchr(argv0, '/') != NULL)) /* path specifed? */ + strncpy(buf, argv0, sizeof (buf)); + else + { + char *ptr; + char *envr = getenv("PATH"); + if (!envr) + return; + + while (*envr) + { + ptr = strchr(envr, ':'); + if (!ptr) + strcpy(buf, envr); + else + { + memcpy(buf, envr, (size_t) (ptr - envr)); + buf[(size_t) (ptr - envr)] = '\0'; + } /* else */ + + envr = ptr + 1; + + if (*buf == '\0') + continue; + + strcat(buf, "/"); + strcat(buf, argv0); + + if (access(buf, X_OK) == 0) + break; + + if (!ptr) + { + strcpy(buf, "."); /* oh well. */ + break; + } /* if */ + } /* while */ + } /* else */ + + buf[sizeof (buf) - 1] = '\0'; /* null terminate, just in case. */ + if (realpath(buf, realbuf) == NULL) + return; + + char *ptr = strrchr(realbuf, '/'); /* chop off binary name. */ + if (ptr != NULL) + *ptr = '\0'; + + if (realbuf[strlen(realbuf)-1] != '/') + strcat(realbuf, "/"); + + basedir = malloc(strlen(realbuf + 1)); + strcpy(basedir, realbuf); + +#if PLATFORM_MACOSX + /* Chop off process serial number arg that the Finder adds... */ + if ( (*argc >= 2) && (strncmp(argv[1], "-psn_", 5) == 0) ) + { + *argc = *argc - 1; + argv[1] = NULL; + + /* Now that we know where xdelta will be, chdir out of AppBundle... */ + ptr = strstr(realbuf, "/Contents/MacOS"); + if (ptr != NULL) + { + *ptr = '\0'; + chdir(realbuf); + } /* if */ + } /* if */ +#endif +} /* find_basedir */ + + +int main(int argc, char **argv) +{ + int retval; + find_basedir(&argc, argv); + retval = mojopatch_main(argc, argv); + free(basedir); + return(retval); +} /* unixmain */ + +/* end of platform_unix.c ... */ + diff --git a/platform_win32.c b/platform_win32.c new file mode 100644 index 0000000..4c5135c --- /dev/null +++ b/platform_win32.c @@ -0,0 +1,275 @@ + +#include +#include +#include + +#include "platform.h" + +int file_exists(const char *fname) +{ + return(GetFileAttributes(fname) != 0xffffffff); +} /* file_exists */ + + +int file_is_directory(const char *fname) +{ + return((GetFileAttributes(fname) & FILE_ATTRIBUTE_DIRECTORY) != 0); +} /* file_is_directory */ + + +int file_is_symlink(const char *fname) +{ + return(0); +} /* file_is_symlink */ + + +static const char *win32strerror(void) +{ + static TCHAR msgbuf[255]; + + FormatMessage( + FORMAT_MESSAGE_FROM_SYSTEM | + FORMAT_MESSAGE_IGNORE_INSERTS, + NULL, + GetLastError(), + MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), /* Default language */ + msgbuf, + sizeof (msgbuf) / sizeof (TCHAR), + NULL + ); + + return((const char *) msgbuf); +} /* win32strerror */ + + +/* enumerate contents of (base) directory. */ +file_list *make_filelist(const char *base) +{ + file_list *retval = NULL; + file_list *l = NULL; + file_list *prev = NULL; + HANDLE dir; + WIN32_FIND_DATA ent; + char wildcard[MAX_PATH]; + snprintf(wildcard, sizeof (wildcard), "%s\\*", base); + + dir = FindFirstFile(wildcard, &ent); + if (dir == INVALID_HANDLE_VALUE) + { + fprintf(stderr, "Error: Can't list files in %s: %s.\n", base, win32strerror()); + return(NULL); + } /* if */ + + while (FindNextFile(dir, &ent) != 0) + { + if (strcmp(ent.cFileName, ".") == 0) + continue; + + if (strcmp(ent.cFileName, "..") == 0) + continue; + + l = (file_list *) malloc(sizeof (file_list)); + if (l == NULL) + { + fprintf(stderr, "Error: out of memory.\n"); + break; + } /* if */ + + l->fname = (char *) malloc(strlen(ent.cFileName) + 1); + if (l->fname == NULL) + { + fprintf(stderr, "Error: out of memory.\n"); + free(l); + break; + } /* if */ + + strcpy(l->fname, ent.cFileName); + + if (retval == NULL) + retval = l; + else + prev->next = l; + + prev = l; + l->next = NULL; + } /* while */ + + FindClose(dir); + return(retval); +} /* make_filelist */ + + +int get_file_size(const char *fname, long *fsize) +{ + DWORD FileSz; + DWORD FileSzHigh; + HANDLE hFil; + + assert(fsize != NULL); + + hFil = CreateFile(fname, GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, 0, NULL); + if (hFil == INVALID_HANDLE_VALUE) + { + fprintf(stderr, "Error: Couldn't get size of [%s]: %s.\n", fname, win32strerror()); + return(0); + } /* if */ + + FileSz = GetFileSize(hFil, &FileSzHigh); + assert(FileSzHigh == 0); + CloseHandle(hFil); + *fsize = FileSz; + return(1); +} /* get_file_size */ + + +char *get_current_dir(void) +{ + LPTSTR retval; + DWORD buflen = 0; + + buflen = GetCurrentDirectory(buflen, NULL); + retval = (LPTSTR) malloc(sizeof (TCHAR) * (buflen + 2)); + if (retval == NULL) + { + fprintf(stderr, "Error: out of memory.\n"); + return(NULL); + } /* if */ + + GetCurrentDirectory(buflen, retval); + + if (retval[buflen - 2] != '\\') + strcat(retval, "\\"); + + return((char *) retval); +} /* get_current_dir */ + + +char *get_realpath(const char *path) +{ + char *retval = NULL; + char *p = NULL; + + retval = (char *) malloc(MAX_PATH); + if (retval == NULL) + { + fprintf(stderr, "Error: out of memory.\n"); + return(NULL); + } /* if */ + + /* + * If in \\server\path format, it's already an absolute path. + * We'll need to check for "." and ".." dirs, though, just in case. + */ + if ((path[0] == '\\') && (path[1] == '\\')) + strcpy(retval, path); + + else + { + char *currentDir = get_current_dir(); + if (currentDir == NULL) + { + free(retval); + fprintf(stderr, "Error: out of memory.\n"); + return(NULL); + } /* if */ + + if (path[1] == ':') /* drive letter specified? */ + { + /* + * Apparently, "D:mypath" is the same as "D:\\mypath" if + * D: is not the current drive. However, if D: is the + * current drive, then "D:mypath" is a relative path. Ugh. + */ + if (path[2] == '\\') /* maybe an absolute path? */ + strcpy(retval, path); + else /* definitely an absolute path. */ + { + if (path[0] == currentDir[0]) /* current drive; relative. */ + { + strcpy(retval, currentDir); + strcat(retval, path + 2); + } /* if */ + + else /* not current drive; absolute. */ + { + retval[0] = path[0]; + retval[1] = ':'; + retval[2] = '\\'; + strcpy(retval + 3, path + 2); + } /* else */ + } /* else */ + } /* if */ + + else /* no drive letter specified. */ + { + if (path[0] == '\\') /* absolute path. */ + { + retval[0] = currentDir[0]; + retval[1] = ':'; + strcpy(retval + 2, path); + } /* if */ + else + { + strcpy(retval, currentDir); + strcat(retval, path); + } /* else */ + } /* else */ + + free(currentDir); + } /* else */ + + /* (whew.) Ok, now take out "." and ".." path entries... */ + + p = retval; + while ( (p = strstr(p, "\\.")) != NULL) + { + /* it's a "." entry that doesn't end the string. */ + if (p[2] == '\\') + memmove(p + 1, p + 3, strlen(p + 3) + 1); + + /* it's a "." entry that ends the string. */ + else if (p[2] == '\0') + p[0] = '\0'; + + /* it's a ".." entry. */ + else if (p[2] == '.') + { + char *prevEntry = p - 1; + while ((prevEntry != retval) && (*prevEntry != '\\')) + prevEntry--; + + if (prevEntry == retval) /* make it look like a "." entry. */ + memmove(p + 1, p + 2, strlen(p + 2) + 1); + else + { + if (p[3] != '\0') /* doesn't end string. */ + *prevEntry = '\0'; + else /* ends string. */ + memmove(prevEntry + 1, p + 4, strlen(p + 4) + 1); + + p = prevEntry; + } /* else */ + } /* else if */ + + else + { + p++; /* look past current char. */ + } /* else */ + } /* while */ + + /* shrink the retval's memory block if possible... */ + p = (char *) realloc(retval, strlen(retval) + 1); + if (p != NULL) + retval = p; + + return(retval); +} /* get_realpath */ + + +int main(int argc, char **argv) /* !!! FIXME: WinMain, in the future? */ +{ + return(mojopatch_main(argc, argv)); +} /* main */ + +/* end of platform_win32.c ... */ + diff --git a/test b/test new file mode 100755 index 0000000000000000000000000000000000000000..498a9042c7dc3f9d3fa329f35a658cad7e50e0d9 GIT binary patch literal 16100 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 literal 0 HcmV?d00001 diff --git a/test.c b/test.c new file mode 100644 index 0000000..b974a74 --- /dev/null +++ b/test.c @@ -0,0 +1,69 @@ +#include +#include +#include + +int chdir_by_identifier(const char *str) +{ + char buf[MAXPATHLEN]; + Boolean b; + OSStatus rc; + CFIndex len; + CFURLRef url = NULL; + CFStringRef id = CFStringCreateWithBytes(NULL, str, strlen(str), + kCFStringEncodingISOLatin1, 0); + + rc = LSFindApplicationForInfo(kLSUnknownCreator, id, NULL, NULL, &url); + CFRelease(id); + if (rc != noErr) + return(0); + + b = CFURLGetFileSystemRepresentation(url, TRUE, buf, sizeof (buf)); + CFRelease(url); + if (!b) + return(0); + +printf("chdir to %s\n", buf); + return(chdir(buf) == 0); +} /* chdir_by_identifier */ + + +int file_is_symlink(const char *fname) +{ + struct stat statbuf; + int retval = 0; + + if (lstat(fname, &statbuf) == 0) + { + if (S_ISLNK(statbuf.st_mode)) + retval = 1; + } /* if */ + + return(retval); +} /* file_is_symlink */ + + +int main(int argc, char **argv) +{ + int i; + unsigned char m[16] = { 0x60, 0x5B, 0x8B, 0x7D, 0x5D, 0xC3, 0x27, 0xA9, + 0xF3, 0x01, 0x50, 0xB0, 0x4B, 0x12, 0xA7, 0x49 }; + + FILE *io = fopen("x.mojopatch", "ab"); + fseek(io, 287276354, SEEK_SET); + fwrite(m, sizeof (m), 1, io); + fclose(io); + return(0); + + + for (i = 1; i < argc; i++) + { + if (!chdir_by_identifier(argv[i])) + printf("%s not found.\n", argv[i]); + printf("%s is%s a symlink.\n", argv[i], file_is_symlink(argv[i]) ? "" : " NOT"); + } + + + return(0); +} + + diff --git a/tmp.txt b/tmp.txt new file mode 100644 index 0000000..77589d4 --- /dev/null +++ b/tmp.txt @@ -0,0 +1,2 @@ +[Distribution] +Partner=20000022 diff --git a/ui.h b/ui.h new file mode 100644 index 0000000..5a4d9a3 --- /dev/null +++ b/ui.h @@ -0,0 +1,27 @@ + +#ifndef _INCL_UI_H_ +#define _INCL_UI_H_ + +#ifdef __cplusplus +extern "C" { +#endif + +/* user interface stuff you implement. */ +int ui_init(void); +void ui_deinit(void); +void ui_pump(void); +void ui_add_to_log(const char *str, int debugging); +void ui_fatal(const char *str); +void ui_success(const char *str); +void ui_total_progress(int percent); +void ui_status(const char *str); +void ui_title(const char *str); + +#ifdef __cplusplus +} +#endif + +#endif /* include-once blocker. */ + +/* end of ui.h ... */ + diff --git a/ui_carbon.c b/ui_carbon.c new file mode 100644 index 0000000..2bfd05b --- /dev/null +++ b/ui_carbon.c @@ -0,0 +1,130 @@ +#include + +#include "platform.h" +#include "ui.h" + +#define MOJOPATCH_SIG 'mjpt' +#define MOJOPATCH_STATUS_ID 0 +#define MOJOPATCH_PROGRESS_ID 1 + +static WindowPtr window; +static ControlRef progress; +static ControlRef status; + +/* user interface stuff you implement. */ +int ui_init(void) +{ + ControlID statusID = { MOJOPATCH_SIG, MOJOPATCH_STATUS_ID }; + ControlID progressID = { MOJOPATCH_SIG, MOJOPATCH_PROGRESS_ID }; + IBNibRef nibRef; + OSStatus err; + Boolean b = TRUE; + + CreateNibReference( CFSTR("mojopatch"), &nibRef ); + err = SetMenuBarFromNib(nibRef, CFSTR("MenuBar")); + CreateWindowFromNib( nibRef, CFSTR("MainWindow"), &window ); + DisposeNibReference( nibRef ); + GetControlByID(window, &statusID, &status); + GetControlByID(window, &progressID, &progress); + ShowWindow( window ); + ActivateWindow(window, TRUE); + SetControlData(progress, kControlEntireControl, + kControlProgressBarAnimatingTag, + sizeof (b), &b); + return(1); +} /* ui_init */ + + +void ui_title(const char *str) +{ + CFStringRef cfstr = CFStringCreateWithBytes(NULL, str, strlen(str), + kCFStringEncodingISOLatin1, 0); + SetWindowTitleWithCFString(window, cfstr); +} /* ui_title */ + + +void ui_deinit(void) +{ + /* !!! FIXME */ +} /* ui_deinit */ + + +void ui_pump(void) +{ + EventRef theEvent; + EventTargetRef theTarget = GetEventDispatcherTarget(); + if (ReceiveNextEvent(0, NULL, 0, true, &theEvent) == noErr) + { + SendEventToEventTarget(theEvent, theTarget); + ReleaseEvent(theEvent); + } /* if */ +} /* ui_pump */ + + +void ui_add_to_log(const char *str, int debugging) +{ + // !!! FIXME + printf("MojoPatch%s: %s\n", debugging ? " [debug]" : "", str); +} /* ui_add_to_log */ + + +static void do_msgbox(const char *str, AlertType alert_type) +{ + const char *_title = "MojoPatch"; + CFStringRef title = CFStringCreateWithBytes(NULL, _title, strlen(_title), + kCFStringEncodingISOLatin1, 0); + CFStringRef msg = CFStringCreateWithBytes(NULL, str, strlen(str), + kCFStringEncodingISOLatin1, 0); + if ((msg != NULL) && (title != NULL)) + { + DialogItemIndex val = 0; + DialogRef dlg = NULL; + + if (CreateStandardAlert(alert_type, title, msg, NULL, &dlg) == noErr) + RunStandardAlert(dlg, NULL, &val); + } /* if */ + + if (msg != NULL) + CFRelease(msg); + + if (title != NULL) + CFRelease(title); +} /* do_msgbox */ + + +void ui_fatal(const char *str) +{ + do_msgbox(str, kAlertStopAlert); +} /* ui_fatal */ + + +void ui_success(const char *str) +{ + do_msgbox(str, kAlertNoteAlert); +} /* ui_success */ + + +void ui_total_progress(int percent) +{ + static int lastpercent = -1; + if (percent != lastpercent) + { + Boolean indeterminate = (percent < 0) ? TRUE : FALSE; + SetControlData(progress, kControlEntireControl, + kControlProgressBarIndeterminateTag, + sizeof (indeterminate), &indeterminate); + SetControl32BitValue(progress, percent); + lastpercent = percent; + } /* if */ +} /* ui_total_progress */ + + +void ui_status(const char *str) +{ + SetControlData(status, kControlEditTextPart, kControlStaticTextTextTag, + strlen(str), str); + Draw1Control(status); +} /* ui_status */ + +/* end of ui_carbon.c ... */ + diff --git a/ui_stdio.c b/ui_stdio.c new file mode 100644 index 0000000..26fa3b8 --- /dev/null +++ b/ui_stdio.c @@ -0,0 +1,67 @@ + +#include + +#include "platform.h" +#include "ui.h" + +int ui_init(void) +{ + return(1); /* always succeeds. */ +} /* ui_init */ + + +void ui_title(const char *str) +{ +} /* ui_title */ + + +void ui_deinit(void) +{ + printf("\n\nHit enter to quit.\n\n"); + getchar(); +} /* ui_deinit */ + + +void ui_pump(void) +{ + /* no-op. */ +} /* ui_pump */ + + +void ui_add_to_log(const char *str, int debugging) +{ + printf("%s%s\n", debugging ? "debug: " : "", str); +} /* ui_add_to_log */ + + +void ui_fatal(const char *str) +{ + fprintf(stderr, "\n%s\n\n", str); +} /* ui_fatal */ + + +void ui_success(const char *str) +{ + fprintf(stderr, "\n%s\n\n", str); +} /* ui_success */ + + +void ui_total_progress(int percent) +{ + static int lastpercent = -1; + if (percent != lastpercent) + { + lastpercent = percent; + printf("."); + if (percent == 100) + printf("\n"); + } /* if */ +} /* ui_total_progress */ + + +void ui_status(const char *str) +{ +} /* ui_status */ + +/* end of ui_stdio.h ... */ + diff --git a/x.txt b/x.txt new file mode 100644 index 0000000..344c256 --- /dev/null +++ b/x.txt @@ -0,0 +1,2777 @@ +MojoPatch: MojoPatch 0.0.3 starting up. +MojoPatch [debug]: debugging enabled. +MojoPatch [debug]: Interactive mode NOT enabled. +MojoPatch [debug]: ADDs are permitted to REPLACE. +MojoPatch [debug]: command == (1). +MojoPatch [debug]: (3) nonoptions: +MojoPatch [debug]: [/Users/icculus/Desktop/default.mojopatch] +MojoPatch [debug]: [/Users/icculus/Desktop/aops200.app] +MojoPatch [debug]: [/Users/icculus/Desktop/aops200a.app] +MojoPatch [debug]: patchfile == [/Users/icculus/Desktop/default.mojopatch]. +MojoPatch [debug]: dir1 == [/Users/icculus/Desktop/aops200.app]. +MojoPatch [debug]: dir2 == [/Users/icculus/Desktop/aops200a.app]. +MojoPatch [debug]: Temp filenames are [/tmp/mojopatch.tmp1.2224] and [/tmp/mojopatch.tmp2.2224]. +MojoPatch [debug]: Examining /Users/icculus/Desktop/aops200.app and . +MojoPatch [debug]: (looking for files that need deletion...) +MojoPatch [debug]: ([Animations]...) +MojoPatch [debug]: ([Briefings]...) +MojoPatch [debug]: ([Contents]...) +MojoPatch [debug]: ([Help]...) +MojoPatch [debug]: ([Maps]...) +MojoPatch [debug]: ([Movies]...) +MojoPatch [debug]: ([Music]...) +MojoPatch [debug]: ([Screenshots]...) +MojoPatch [debug]: ([Sounds]...) +MojoPatch [debug]: ([StaticMeshes]...) +MojoPatch [debug]: ([System]...) +MojoPatch [debug]: ([Textures]...) +MojoPatch [debug]: (looking for files that need addition...) +MojoPatch [debug]: ([Animations]...) +MojoPatch [debug]: Examining /Users/icculus/Desktop/aops200.app/Animations and Animations +MojoPatch [debug]: (looking for files that need deletion...) +MojoPatch [debug]: ([A-charactersCiv.ukx]...) +MojoPatch [debug]: ([A-charactersMil.ukx]...) +MojoPatch [debug]: ([A-Objects.ukx]...) +MojoPatch [debug]: ([A-OPFORMods.ukx]...) +MojoPatch [debug]: ([A-USMods.ukx]...) +MojoPatch [debug]: ([A-Weapons3P.ukx]...) +MojoPatch [debug]: ([A-WeaponsOPFOR.ukx]...) +MojoPatch [debug]: ([A-WeaponsUS.ukx]...) +MojoPatch [debug]: (looking for files that need addition...) +MojoPatch [debug]: ([A-charactersCiv.ukx]...) +MojoPatch [debug]: md5summing... +MojoPatch: (md5sum: e34e93288bfca02c98f051515300659d) +MojoPatch [debug]: md5summing... +MojoPatch: (md5sum: e34e93288bfca02c98f051515300659d) +MojoPatch [debug]: ([A-charactersMil.ukx]...) +MojoPatch [debug]: md5summing... +MojoPatch: (md5sum: c52ebfde5797e3f6ee3abfeb7b35b777) +MojoPatch [debug]: md5summing... +MojoPatch: (md5sum: c52ebfde5797e3f6ee3abfeb7b35b777) +MojoPatch [debug]: ([A-Objects.ukx]...) +MojoPatch [debug]: md5summing... +MojoPatch: (md5sum: 3093d23c4c67a8ca9c95c8da6775971a) +MojoPatch [debug]: md5summing... +MojoPatch: (md5sum: 3093d23c4c67a8ca9c95c8da6775971a) +MojoPatch [debug]: ([A-OPFORMods.ukx]...) +MojoPatch [debug]: md5summing... +MojoPatch: (md5sum: 8e249ee6bc53006b5bf2263a4ed8362b) +MojoPatch [debug]: md5summing... +MojoPatch: (md5sum: 8e249ee6bc53006b5bf2263a4ed8362b) +MojoPatch [debug]: ([A-USMods.ukx]...) +MojoPatch [debug]: md5summing... +MojoPatch: (md5sum: b93cb41889a105d5983daa34f0907d59) +MojoPatch [debug]: md5summing... +MojoPatch: (md5sum: b93cb41889a105d5983daa34f0907d59) +MojoPatch [debug]: ([A-Weapons3P.ukx]...) +MojoPatch [debug]: md5summing... +MojoPatch: (md5sum: caa19a5a109f08e8f3a86ae9923895f2) +MojoPatch [debug]: md5summing... +MojoPatch: (md5sum: caa19a5a109f08e8f3a86ae9923895f2) +MojoPatch [debug]: ([A-WeaponsOPFOR.ukx]...) +MojoPatch [debug]: md5summing... +MojoPatch: (md5sum: a62a7d25f8ff19b08eacff3cb9c1917b) +MojoPatch [debug]: md5summing... +MojoPatch: (md5sum: a62a7d25f8ff19b08eacff3cb9c1917b) +MojoPatch [debug]: ([A-WeaponsUS.ukx]...) +MojoPatch [debug]: md5summing... +MojoPatch: (md5sum: 64ff9986f4149d0a4b33b832c99ff10c) +MojoPatch [debug]: md5summing... +MojoPatch: (md5sum: 64ff9986f4149d0a4b33b832c99ff10c) +MojoPatch [debug]: ([Briefings]...) +MojoPatch [debug]: Examining /Users/icculus/Desktop/aops200.app/Briefings and Briefings +MojoPatch [debug]: (looking for files that need deletion...) +MojoPatch [debug]: ([10_history.txt]...) +MojoPatch [debug]: ([172_history.txt]...) +MojoPatch [debug]: ([75_history.txt]...) +MojoPatch [debug]: ([82_history.txt]...) +MojoPatch [debug]: ([airborne_history.txt]...) +MojoPatch [debug]: ([airborne_tour.txt]...) +MojoPatch [debug]: ([bct_history.txt]...) +MojoPatch [debug]: ([bct_tour.txt]...) +MojoPatch [debug]: ([bridge.txt]...) +MojoPatch [debug]: ([bridge_se.txt]...) +MojoPatch [debug]: ([bridge_se_team0.txt]...) +MojoPatch [debug]: ([bridge_se_team1.txt]...) +MojoPatch [debug]: ([bridge_team0.txt]...) +MojoPatch [debug]: ([bridge_team1.txt]...) +MojoPatch [debug]: ([camp_mackall.txt]...) +MojoPatch [debug]: ([eande.txt]...) +MojoPatch [debug]: ([entry.txt]...) +MojoPatch [debug]: ([entry_team0.txt]...) +MojoPatch [debug]: ([entry_team1.txt]...) +MojoPatch [debug]: ([fls.txt]...) +MojoPatch [debug]: ([fls_team0.txt]...) +MojoPatch [debug]: ([fls_team1.txt]...) +MojoPatch [debug]: ([GettingStarted.txt]...) +MojoPatch [debug]: ([hq_raid.txt]...) +MojoPatch [debug]: ([hq_raid_team0.txt]...) +MojoPatch [debug]: ([hq_raid_team1.txt]...) +MojoPatch [debug]: ([infantry_history.txt]...) +MojoPatch [debug]: ([infantry_tour.txt]...) +MojoPatch [debug]: ([insurgent_camp.txt]...) +MojoPatch [debug]: ([insurgent_camp_team0.txt]...) +MojoPatch [debug]: ([insurgent_camp_team1.txt]...) +MojoPatch [debug]: ([jrtc_farm.txt]...) +MojoPatch [debug]: ([jrtc_farm_team0.txt]...) +MojoPatch [debug]: ([jrtc_farm_team1.txt]...) +MojoPatch [debug]: ([jump_tower.txt]...) +MojoPatch [debug]: ([live_jump.txt]...) +MojoPatch [debug]: ([M24_range.txt]...) +MojoPatch [debug]: ([M82_range.txt]...) +MojoPatch [debug]: ([marksman_history.txt]...) +MojoPatch [debug]: ([marksman_tour.txt]...) +MojoPatch [debug]: ([medic_field.txt]...) +MojoPatch [debug]: ([medic_history.txt]...) +MojoPatch [debug]: ([medic_tour.txt]...) +MojoPatch [debug]: ([medic_training1.txt]...) +MojoPatch [debug]: ([medic_training2.txt]...) +MojoPatch [debug]: ([medic_training3.txt]...) +MojoPatch [debug]: ([mission_tour.txt]...) +MojoPatch [debug]: ([mountain_ambush.txt]...) +MojoPatch [debug]: ([mountain_ambush_team0.txt]...) +MojoPatch [debug]: ([mountain_ambush_team1.txt]...) +MojoPatch [debug]: ([mountain_pass.txt]...) +MojoPatch [debug]: ([mountain_pass_se.txt]...) +MojoPatch [debug]: ([mountain_pass_se_team0.txt]...) +MojoPatch [debug]: ([mountain_pass_se_team1.txt]...) +MojoPatch [debug]: ([mountain_pass_team0.txt]...) +MojoPatch [debug]: ([mountain_pass_team1.txt]...) +MojoPatch [debug]: ([mout_mckenna.txt]...) +MojoPatch [debug]: ([mout_mckenna_team0.txt]...) +MojoPatch [debug]: ([mout_mckenna_team1.txt]...) +MojoPatch [debug]: ([obstacle.txt]...) +MojoPatch [debug]: ([pipeline.txt]...) +MojoPatch [debug]: ([pipeline_sf.txt]...) +MojoPatch [debug]: ([pipeline_sf_team0.txt]...) +MojoPatch [debug]: ([pipeline_sf_team1.txt]...) +MojoPatch [debug]: ([pipeline_team0.txt]...) +MojoPatch [debug]: ([pipeline_team1.txt]...) +MojoPatch [debug]: ([radio_tower.txt]...) +MojoPatch [debug]: ([radio_tower_team0.txt]...) +MojoPatch [debug]: ([radio_tower_team1.txt]...) +MojoPatch [debug]: ([ranger_history.txt]...) +MojoPatch [debug]: ([rifle_range.txt]...) +MojoPatch [debug]: ([river_basin.txt]...) +MojoPatch [debug]: ([river_basin_team0.txt]...) +MojoPatch [debug]: ([river_basin_team1.txt]...) +MojoPatch [debug]: ([sf_history.txt]...) +MojoPatch [debug]: ([sf_tour.txt]...) +MojoPatch [debug]: ([sfcsar.txt]...) +MojoPatch [debug]: ([sfcsar_team0.txt]...) +MojoPatch [debug]: ([sfcsar_team1.txt]...) +MojoPatch [debug]: ([sfhospital.txt]...) +MojoPatch [debug]: ([sfhospital_team0.txt]...) +MojoPatch [debug]: ([sfhospital_team1.txt]...) +MojoPatch [debug]: ([sfrecon.txt]...) +MojoPatch [debug]: ([sfrecon_team0.txt]...) +MojoPatch [debug]: ([sfrecon_team1.txt]...) +MojoPatch [debug]: ([swamp_raid.txt]...) +MojoPatch [debug]: ([swamp_raid_team0.txt]...) +MojoPatch [debug]: ([swamp_raid_team1.txt]...) +MojoPatch [debug]: ([tactical_training.txt]...) +MojoPatch [debug]: ([tunnel.txt]...) +MojoPatch [debug]: ([tunnel_team0.txt]...) +MojoPatch [debug]: ([tunnel_team1.txt]...) +MojoPatch [debug]: ([us_weapons.txt]...) +MojoPatch [debug]: ([weapons_cache.txt]...) +MojoPatch [debug]: ([weapons_cache_se.txt]...) +MojoPatch [debug]: ([weapons_cache_se_team0.txt]...) +MojoPatch [debug]: ([weapons_cache_se_team1.txt]...) +MojoPatch [debug]: ([weapons_cache_team0.txt]...) +MojoPatch [debug]: ([weapons_cache_team1.txt]...) +MojoPatch [debug]: (looking for files that need addition...) +MojoPatch [debug]: ([10_history.txt]...) +MojoPatch [debug]: md5summing... +MojoPatch: (md5sum: 9bd729f83bb4f2145ddf8a240c782804) +MojoPatch [debug]: md5summing... +MojoPatch: (md5sum: 9bd729f83bb4f2145ddf8a240c782804) +MojoPatch [debug]: ([172_history.txt]...) +MojoPatch [debug]: md5summing... +MojoPatch: (md5sum: 0ed84591663bcd25c7c54f23696ce4fc) +MojoPatch [debug]: md5summing... +MojoPatch: (md5sum: 0ed84591663bcd25c7c54f23696ce4fc) +MojoPatch [debug]: ([75_history.txt]...) +MojoPatch [debug]: md5summing... +MojoPatch: (md5sum: 00be993093c9f25e8956e6a3e67479ee) +MojoPatch [debug]: md5summing... +MojoPatch: (md5sum: 00be993093c9f25e8956e6a3e67479ee) +MojoPatch [debug]: ([82_history.txt]...) +MojoPatch [debug]: md5summing... +MojoPatch: (md5sum: 9da7647c3fe6bfe416738490832816c0) +MojoPatch [debug]: md5summing... +MojoPatch: (md5sum: 9da7647c3fe6bfe416738490832816c0) +MojoPatch [debug]: ([airborne_history.txt]...) +MojoPatch [debug]: md5summing... +MojoPatch: (md5sum: e208b1e3f671dcfd5225bcb22d3bb331) +MojoPatch [debug]: md5summing... +MojoPatch: (md5sum: e208b1e3f671dcfd5225bcb22d3bb331) +MojoPatch [debug]: ([airborne_tour.txt]...) +MojoPatch [debug]: md5summing... +MojoPatch: (md5sum: 2de0f6a60b618fa5118a8dca6c85cabc) +MojoPatch [debug]: md5summing... +MojoPatch: (md5sum: 2de0f6a60b618fa5118a8dca6c85cabc) +MojoPatch [debug]: ([bct_history.txt]...) +MojoPatch [debug]: md5summing... +MojoPatch: (md5sum: 6418e0b2c473d8782a504c7761f66132) +MojoPatch [debug]: md5summing... +MojoPatch: (md5sum: 6418e0b2c473d8782a504c7761f66132) +MojoPatch [debug]: ([bct_tour.txt]...) +MojoPatch [debug]: md5summing... +MojoPatch: (md5sum: fe6974e2e5a5c114058d6e50dccc2425) +MojoPatch [debug]: md5summing... +MojoPatch: (md5sum: fe6974e2e5a5c114058d6e50dccc2425) +MojoPatch [debug]: ([bridge.txt]...) +MojoPatch [debug]: md5summing... +MojoPatch: (md5sum: b0027ac1b911b5f815d08cbb09624be7) +MojoPatch [debug]: md5summing... +MojoPatch: (md5sum: b0027ac1b911b5f815d08cbb09624be7) +MojoPatch [debug]: ([bridge_se.txt]...) +MojoPatch [debug]: md5summing... +MojoPatch: (md5sum: d0926764c16fd6750dbf0f07606d2554) +MojoPatch [debug]: md5summing... +MojoPatch: (md5sum: d0926764c16fd6750dbf0f07606d2554) +MojoPatch [debug]: ([bridge_se_team0.txt]...) +MojoPatch [debug]: md5summing... +MojoPatch: (md5sum: 2737ea0e0eb8501525043b8527803ab2) +MojoPatch [debug]: md5summing... +MojoPatch: (md5sum: 2737ea0e0eb8501525043b8527803ab2) +MojoPatch [debug]: ([bridge_se_team1.txt]...) +MojoPatch [debug]: md5summing... +MojoPatch: (md5sum: 2755473b1111cd0e935f5390989e3832) +MojoPatch [debug]: md5summing... +MojoPatch: (md5sum: 2755473b1111cd0e935f5390989e3832) +MojoPatch [debug]: ([bridge_team0.txt]...) +MojoPatch [debug]: md5summing... +MojoPatch: (md5sum: e829a7e27922a51d7d3def5a44c4c662) +MojoPatch [debug]: md5summing... +MojoPatch: (md5sum: e829a7e27922a51d7d3def5a44c4c662) +MojoPatch [debug]: ([bridge_team1.txt]...) +MojoPatch [debug]: md5summing... +MojoPatch: (md5sum: 636579cb36ffa3f6636ea56c573cdda6) +MojoPatch [debug]: md5summing... +MojoPatch: (md5sum: 636579cb36ffa3f6636ea56c573cdda6) +MojoPatch [debug]: ([camp_mackall.txt]...) +MojoPatch [debug]: md5summing... +MojoPatch: (md5sum: daf6ae6b44d5641224ab1506fdda6758) +MojoPatch [debug]: md5summing... +MojoPatch: (md5sum: daf6ae6b44d5641224ab1506fdda6758) +MojoPatch [debug]: ([eande.txt]...) +MojoPatch [debug]: md5summing... +MojoPatch: (md5sum: 2985fd698ae6cb72d7cb8abda180de0b) +MojoPatch [debug]: md5summing... +MojoPatch: (md5sum: 2985fd698ae6cb72d7cb8abda180de0b) +MojoPatch [debug]: ([entry.txt]...) +MojoPatch [debug]: md5summing... +MojoPatch: (md5sum: bd3941cd5c9abb6473a6e276293a3e47) +MojoPatch [debug]: md5summing... +MojoPatch: (md5sum: bd3941cd5c9abb6473a6e276293a3e47) +MojoPatch [debug]: ([entry_team0.txt]...) +MojoPatch [debug]: md5summing... +MojoPatch: (md5sum: bd3941cd5c9abb6473a6e276293a3e47) +MojoPatch [debug]: md5summing... +MojoPatch: (md5sum: bd3941cd5c9abb6473a6e276293a3e47) +MojoPatch [debug]: ([entry_team1.txt]...) +MojoPatch [debug]: md5summing... +MojoPatch: (md5sum: bd3941cd5c9abb6473a6e276293a3e47) +MojoPatch [debug]: md5summing... +MojoPatch: (md5sum: bd3941cd5c9abb6473a6e276293a3e47) +MojoPatch [debug]: ([fls.txt]...) +MojoPatch [debug]: md5summing... +MojoPatch: (md5sum: bb347f19bfb2a86d06b7ebf8eb84e2b5) +MojoPatch [debug]: md5summing... +MojoPatch: (md5sum: bb347f19bfb2a86d06b7ebf8eb84e2b5) +MojoPatch [debug]: ([fls_team0.txt]...) +MojoPatch [debug]: md5summing... +MojoPatch: (md5sum: e32f10fabe2139a084a46ec2d6f64709) +MojoPatch [debug]: md5summing... +MojoPatch: (md5sum: e32f10fabe2139a084a46ec2d6f64709) +MojoPatch [debug]: ([fls_team1.txt]...) +MojoPatch [debug]: md5summing... +MojoPatch: (md5sum: 4b8b01318eb66a75490cc10a5a1fbff2) +MojoPatch [debug]: md5summing... +MojoPatch: (md5sum: 4b8b01318eb66a75490cc10a5a1fbff2) +MojoPatch [debug]: ([GettingStarted.txt]...) +MojoPatch [debug]: md5summing... +MojoPatch: (md5sum: 4390d51dcb804197f99f960d2b1ba731) +MojoPatch [debug]: md5summing... +MojoPatch: (md5sum: 4390d51dcb804197f99f960d2b1ba731) +MojoPatch [debug]: ([hq_raid.txt]...) +MojoPatch [debug]: md5summing... +MojoPatch: (md5sum: fbd02a664575e2c74d970ec994b188d8) +MojoPatch [debug]: md5summing... +MojoPatch: (md5sum: fbd02a664575e2c74d970ec994b188d8) +MojoPatch [debug]: ([hq_raid_team0.txt]...) +MojoPatch [debug]: md5summing... +MojoPatch: (md5sum: b1b34d269d9f7c83296bfa82ac63c54c) +MojoPatch [debug]: md5summing... +MojoPatch: (md5sum: b1b34d269d9f7c83296bfa82ac63c54c) +MojoPatch [debug]: ([hq_raid_team1.txt]...) +MojoPatch [debug]: md5summing... +MojoPatch: (md5sum: 9e318541e221665b46e8e4de99a04030) +MojoPatch [debug]: md5summing... +MojoPatch: (md5sum: 9e318541e221665b46e8e4de99a04030) +MojoPatch [debug]: ([infantry_history.txt]...) +MojoPatch [debug]: md5summing... +MojoPatch: (md5sum: 762fe5de41192446934eab94b80db6f6) +MojoPatch [debug]: md5summing... +MojoPatch: (md5sum: 762fe5de41192446934eab94b80db6f6) +MojoPatch [debug]: ([infantry_tour.txt]...) +MojoPatch [debug]: md5summing... +MojoPatch: (md5sum: 75494256a0af6df40263c8bfdf1c902e) +MojoPatch [debug]: md5summing... +MojoPatch: (md5sum: 75494256a0af6df40263c8bfdf1c902e) +MojoPatch [debug]: ([insurgent_camp.txt]...) +MojoPatch [debug]: md5summing... +MojoPatch: (md5sum: 1bcad28e8d62e4aede761615220fe6c8) +MojoPatch [debug]: md5summing... +MojoPatch: (md5sum: 1bcad28e8d62e4aede761615220fe6c8) +MojoPatch [debug]: ([insurgent_camp_team0.txt]...) +MojoPatch [debug]: md5summing... +MojoPatch: (md5sum: 95c1f4a1af1f86a16b6fc3c16a28675f) +MojoPatch [debug]: md5summing... +MojoPatch: (md5sum: 95c1f4a1af1f86a16b6fc3c16a28675f) +MojoPatch [debug]: ([insurgent_camp_team1.txt]...) +MojoPatch [debug]: md5summing... +MojoPatch: (md5sum: a79eaa0187fff00733c8ae08939ff32b) +MojoPatch [debug]: md5summing... +MojoPatch: (md5sum: a79eaa0187fff00733c8ae08939ff32b) +MojoPatch [debug]: ([jrtc_farm.txt]...) +MojoPatch [debug]: md5summing... +MojoPatch: (md5sum: 86b0909fa82d9295ba06e40bbe02b255) +MojoPatch [debug]: md5summing... +MojoPatch: (md5sum: 86b0909fa82d9295ba06e40bbe02b255) +MojoPatch [debug]: ([jrtc_farm_team0.txt]...) +MojoPatch [debug]: md5summing... +MojoPatch: (md5sum: 9b8a3f9f4bdade6c1892f5047479097a) +MojoPatch [debug]: md5summing... +MojoPatch: (md5sum: 9b8a3f9f4bdade6c1892f5047479097a) +MojoPatch [debug]: ([jrtc_farm_team1.txt]...) +MojoPatch [debug]: md5summing... +MojoPatch: (md5sum: 2bb336b91ba1e55fb90cd68551adf829) +MojoPatch [debug]: md5summing... +MojoPatch: (md5sum: 2bb336b91ba1e55fb90cd68551adf829) +MojoPatch [debug]: ([jump_tower.txt]...) +MojoPatch [debug]: md5summing... +MojoPatch: (md5sum: 61150fb22e6bbb442a4493c7f3e26595) +MojoPatch [debug]: md5summing... +MojoPatch: (md5sum: 61150fb22e6bbb442a4493c7f3e26595) +MojoPatch [debug]: ([live_jump.txt]...) +MojoPatch [debug]: md5summing... +MojoPatch: (md5sum: 34b1447bd938ec11e1878bb668264d04) +MojoPatch [debug]: md5summing... +MojoPatch: (md5sum: 34b1447bd938ec11e1878bb668264d04) +MojoPatch [debug]: ([M24_range.txt]...) +MojoPatch [debug]: md5summing... +MojoPatch: (md5sum: 58860b37c8019e1dc3440c861fe98320) +MojoPatch [debug]: md5summing... +MojoPatch: (md5sum: 58860b37c8019e1dc3440c861fe98320) +MojoPatch [debug]: ([M82_range.txt]...) +MojoPatch [debug]: md5summing... +MojoPatch: (md5sum: 3d84b0da7d5cbab868aca01697ab5656) +MojoPatch [debug]: md5summing... +MojoPatch: (md5sum: 3d84b0da7d5cbab868aca01697ab5656) +MojoPatch [debug]: ([marksman_history.txt]...) +MojoPatch [debug]: md5summing... +MojoPatch: (md5sum: 739295245c854f155b2cecd39ae14609) +MojoPatch [debug]: md5summing... +MojoPatch: (md5sum: 739295245c854f155b2cecd39ae14609) +MojoPatch [debug]: ([marksman_tour.txt]...) +MojoPatch [debug]: md5summing... +MojoPatch: (md5sum: 4c066eea76780304695847bd542ff6ad) +MojoPatch [debug]: md5summing... +MojoPatch: (md5sum: 4c066eea76780304695847bd542ff6ad) +MojoPatch [debug]: ([medic_field.txt]...) +MojoPatch [debug]: md5summing... +MojoPatch: (md5sum: 61f715cde03d26c68286004cf90d5145) +MojoPatch [debug]: md5summing... +MojoPatch: (md5sum: 61f715cde03d26c68286004cf90d5145) +MojoPatch [debug]: ([medic_history.txt]...) +MojoPatch [debug]: md5summing... +MojoPatch: (md5sum: 0f9320fd94c1ba10c1e6111b8bb7e2c4) +MojoPatch [debug]: md5summing... +MojoPatch: (md5sum: 0f9320fd94c1ba10c1e6111b8bb7e2c4) +MojoPatch [debug]: ([medic_tour.txt]...) +MojoPatch [debug]: md5summing... +MojoPatch: (md5sum: a9392fca659c59f9b50a334644b76c40) +MojoPatch [debug]: md5summing... +MojoPatch: (md5sum: a9392fca659c59f9b50a334644b76c40) +MojoPatch [debug]: ([medic_training1.txt]...) +MojoPatch [debug]: md5summing... +MojoPatch: (md5sum: ca328de2f4764817679601d9e9736fd8) +MojoPatch [debug]: md5summing... +MojoPatch: (md5sum: ca328de2f4764817679601d9e9736fd8) +MojoPatch [debug]: ([medic_training2.txt]...) +MojoPatch [debug]: md5summing... +MojoPatch: (md5sum: af16276a3616941fa03d1698b39a21e1) +MojoPatch [debug]: md5summing... +MojoPatch: (md5sum: af16276a3616941fa03d1698b39a21e1) +MojoPatch [debug]: ([medic_training3.txt]...) +MojoPatch [debug]: md5summing... +MojoPatch: (md5sum: ca05dfc16c7c83da0379d0216be133a6) +MojoPatch [debug]: md5summing... +MojoPatch: (md5sum: ca05dfc16c7c83da0379d0216be133a6) +MojoPatch [debug]: ([mission_tour.txt]...) +MojoPatch [debug]: md5summing... +MojoPatch: (md5sum: 4fef981a02e53bb58fa5de7f50451c7f) +MojoPatch [debug]: md5summing... +MojoPatch: (md5sum: 4fef981a02e53bb58fa5de7f50451c7f) +MojoPatch [debug]: ([mountain_ambush.txt]...) +MojoPatch [debug]: md5summing... +MojoPatch: (md5sum: 5caef9fb896dc0ca7ef75f38ddd0c960) +MojoPatch [debug]: md5summing... +MojoPatch: (md5sum: 5caef9fb896dc0ca7ef75f38ddd0c960) +MojoPatch [debug]: ([mountain_ambush_team0.txt]...) +MojoPatch [debug]: md5summing... +MojoPatch: (md5sum: 7df9854b7069e36b1fb19269d0dd13db) +MojoPatch [debug]: md5summing... +MojoPatch: (md5sum: 7df9854b7069e36b1fb19269d0dd13db) +MojoPatch [debug]: ([mountain_ambush_team1.txt]...) +MojoPatch [debug]: md5summing... +MojoPatch: (md5sum: 5bc2799102576a1fe2ce47e92d122653) +MojoPatch [debug]: md5summing... +MojoPatch: (md5sum: 5bc2799102576a1fe2ce47e92d122653) +MojoPatch [debug]: ([mountain_pass.txt]...) +MojoPatch [debug]: md5summing... +MojoPatch: (md5sum: 4f05a413ab366dc7fa6e628eb5927a21) +MojoPatch [debug]: md5summing... +MojoPatch: (md5sum: 4f05a413ab366dc7fa6e628eb5927a21) +MojoPatch [debug]: ([mountain_pass_se.txt]...) +MojoPatch [debug]: md5summing... +MojoPatch: (md5sum: 8dcd255b96fe43776a955e5b73de63ba) +MojoPatch [debug]: md5summing... +MojoPatch: (md5sum: 8dcd255b96fe43776a955e5b73de63ba) +MojoPatch [debug]: ([mountain_pass_se_team0.txt]...) +MojoPatch [debug]: md5summing... +MojoPatch: (md5sum: e38b7fb30e38a3700623947c696fccb6) +MojoPatch [debug]: md5summing... +MojoPatch: (md5sum: e38b7fb30e38a3700623947c696fccb6) +MojoPatch [debug]: ([mountain_pass_se_team1.txt]...) +MojoPatch [debug]: md5summing... +MojoPatch: (md5sum: 9278fa7d78bb877a502ef9dd5518123b) +MojoPatch [debug]: md5summing... +MojoPatch: (md5sum: 9278fa7d78bb877a502ef9dd5518123b) +MojoPatch [debug]: ([mountain_pass_team0.txt]...) +MojoPatch [debug]: md5summing... +MojoPatch: (md5sum: d6b620e5ff1e6d996226108f49313ef2) +MojoPatch [debug]: md5summing... +MojoPatch: (md5sum: d6b620e5ff1e6d996226108f49313ef2) +MojoPatch [debug]: ([mountain_pass_team1.txt]...) +MojoPatch [debug]: md5summing... +MojoPatch: (md5sum: a16de5f286f18370d78a2934200e3df9) +MojoPatch [debug]: md5summing... +MojoPatch: (md5sum: a16de5f286f18370d78a2934200e3df9) +MojoPatch [debug]: ([mout_mckenna.txt]...) +MojoPatch [debug]: md5summing... +MojoPatch: (md5sum: 041593a5ec7cfee6b8b104fe998826e2) +MojoPatch [debug]: md5summing... +MojoPatch: (md5sum: 041593a5ec7cfee6b8b104fe998826e2) +MojoPatch [debug]: ([mout_mckenna_team0.txt]...) +MojoPatch [debug]: md5summing... +MojoPatch: (md5sum: 8a8958c62b3b0cb85837b8beca9be7e8) +MojoPatch [debug]: md5summing... +MojoPatch: (md5sum: 8a8958c62b3b0cb85837b8beca9be7e8) +MojoPatch [debug]: ([mout_mckenna_team1.txt]...) +MojoPatch [debug]: md5summing... +MojoPatch: (md5sum: 719cc5bbd075e98fd9224be9cabe0ca0) +MojoPatch [debug]: md5summing... +MojoPatch: (md5sum: 719cc5bbd075e98fd9224be9cabe0ca0) +MojoPatch [debug]: ([obstacle.txt]...) +MojoPatch [debug]: md5summing... +MojoPatch: (md5sum: a4d16e7531367971b4e7eb28322132a2) +MojoPatch [debug]: md5summing... +MojoPatch: (md5sum: a4d16e7531367971b4e7eb28322132a2) +MojoPatch [debug]: ([pipeline.txt]...) +MojoPatch [debug]: md5summing... +MojoPatch: (md5sum: ec797da1ab61da1b1ad0b078248c9f3b) +MojoPatch [debug]: md5summing... +MojoPatch: (md5sum: ec797da1ab61da1b1ad0b078248c9f3b) +MojoPatch [debug]: ([pipeline_sf.txt]...) +MojoPatch [debug]: md5summing... +MojoPatch: (md5sum: 58bf9ce3b7588e151fbfd92a6f54c4b4) +MojoPatch [debug]: md5summing... +MojoPatch: (md5sum: 58bf9ce3b7588e151fbfd92a6f54c4b4) +MojoPatch [debug]: ([pipeline_sf_team0.txt]...) +MojoPatch [debug]: md5summing... +MojoPatch: (md5sum: d0faf86d9b8dbefd0d971dde42e386a3) +MojoPatch [debug]: md5summing... +MojoPatch: (md5sum: d0faf86d9b8dbefd0d971dde42e386a3) +MojoPatch [debug]: ([pipeline_sf_team1.txt]...) +MojoPatch [debug]: md5summing... +MojoPatch: (md5sum: 6361e9e849ee596fdf11a58047f67a84) +MojoPatch [debug]: md5summing... +MojoPatch: (md5sum: 6361e9e849ee596fdf11a58047f67a84) +MojoPatch [debug]: ([pipeline_team0.txt]...) +MojoPatch [debug]: md5summing... +MojoPatch: (md5sum: 5c08db5f9c5ed767bb28d79f87d4ba13) +MojoPatch [debug]: md5summing... +MojoPatch: (md5sum: 5c08db5f9c5ed767bb28d79f87d4ba13) +MojoPatch [debug]: ([pipeline_team1.txt]...) +MojoPatch [debug]: md5summing... +MojoPatch: (md5sum: a4d31784c62868953952edc116ea81e8) +MojoPatch [debug]: md5summing... +MojoPatch: (md5sum: a4d31784c62868953952edc116ea81e8) +MojoPatch [debug]: ([radio_tower.txt]...) +MojoPatch [debug]: md5summing... +MojoPatch: (md5sum: 6ae58bafb75ed3dee6c8414d1b1f2eb0) +MojoPatch [debug]: md5summing... +MojoPatch: (md5sum: 6ae58bafb75ed3dee6c8414d1b1f2eb0) +MojoPatch [debug]: ([radio_tower_team0.txt]...) +MojoPatch [debug]: md5summing... +MojoPatch: (md5sum: 03c5d5b22050968237d86558b8ebf97a) +MojoPatch [debug]: md5summing... +MojoPatch: (md5sum: 03c5d5b22050968237d86558b8ebf97a) +MojoPatch [debug]: ([radio_tower_team1.txt]...) +MojoPatch [debug]: md5summing... +MojoPatch: (md5sum: b114e57e5db82cd5ce8c09e8af91793b) +MojoPatch [debug]: md5summing... +MojoPatch: (md5sum: b114e57e5db82cd5ce8c09e8af91793b) +MojoPatch [debug]: ([ranger_history.txt]...) +MojoPatch [debug]: md5summing... +MojoPatch: (md5sum: 3fbfd1ec5bfc11c18c368c08c143b1a1) +MojoPatch [debug]: md5summing... +MojoPatch: (md5sum: 3fbfd1ec5bfc11c18c368c08c143b1a1) +MojoPatch [debug]: ([rifle_range.txt]...) +MojoPatch [debug]: md5summing... +MojoPatch: (md5sum: a13d3be8d67cc174ef6c08b62f363798) +MojoPatch [debug]: md5summing... +MojoPatch: (md5sum: a13d3be8d67cc174ef6c08b62f363798) +MojoPatch [debug]: ([river_basin.txt]...) +MojoPatch [debug]: md5summing... +MojoPatch: (md5sum: e96a0fd8e550887312bcd40040cb55ce) +MojoPatch [debug]: md5summing... +MojoPatch: (md5sum: e96a0fd8e550887312bcd40040cb55ce) +MojoPatch [debug]: ([river_basin_team0.txt]...) +MojoPatch [debug]: md5summing... +MojoPatch: (md5sum: 11c07b3eb4a231f1e78cf9321144dc31) +MojoPatch [debug]: md5summing... +MojoPatch: (md5sum: 11c07b3eb4a231f1e78cf9321144dc31) +MojoPatch [debug]: ([river_basin_team1.txt]...) +MojoPatch [debug]: md5summing... +MojoPatch: (md5sum: ffc90c2bdc3877887cf101939ca7edd5) +MojoPatch [debug]: md5summing... +MojoPatch: (md5sum: ffc90c2bdc3877887cf101939ca7edd5) +MojoPatch [debug]: ([sf_history.txt]...) +MojoPatch [debug]: md5summing... +MojoPatch: (md5sum: 3940e8281a4e9fef679e499422ed632c) +MojoPatch [debug]: md5summing... +MojoPatch: (md5sum: 3940e8281a4e9fef679e499422ed632c) +MojoPatch [debug]: ([sf_tour.txt]...) +MojoPatch [debug]: md5summing... +MojoPatch: (md5sum: fbb0142088d27c6b77023e1509ab02ee) +MojoPatch [debug]: md5summing... +MojoPatch: (md5sum: fbb0142088d27c6b77023e1509ab02ee) +MojoPatch [debug]: ([sfcsar.txt]...) +MojoPatch [debug]: md5summing... +MojoPatch: (md5sum: cc49979a2393c858bbe77fa6b105c696) +MojoPatch [debug]: md5summing... +MojoPatch: (md5sum: cc49979a2393c858bbe77fa6b105c696) +MojoPatch [debug]: ([sfcsar_team0.txt]...) +MojoPatch [debug]: md5summing... +MojoPatch: (md5sum: 73ba8b0746448b66ee049389683d3a53) +MojoPatch [debug]: md5summing... +MojoPatch: (md5sum: 73ba8b0746448b66ee049389683d3a53) +MojoPatch [debug]: ([sfcsar_team1.txt]...) +MojoPatch [debug]: md5summing... +MojoPatch: (md5sum: d948887f1d32510d95a46ebb008a4461) +MojoPatch [debug]: md5summing... +MojoPatch: (md5sum: d948887f1d32510d95a46ebb008a4461) +MojoPatch [debug]: ([sfhospital.txt]...) +MojoPatch [debug]: md5summing... +MojoPatch: (md5sum: bce95cbc135071bc137b50edcd7e026d) +MojoPatch [debug]: md5summing... +MojoPatch: (md5sum: bce95cbc135071bc137b50edcd7e026d) +MojoPatch [debug]: ([sfhospital_team0.txt]...) +MojoPatch [debug]: md5summing... +MojoPatch: (md5sum: ed32baa88277beb7f7cc1ffb282d5868) +MojoPatch [debug]: md5summing... +MojoPatch: (md5sum: ed32baa88277beb7f7cc1ffb282d5868) +MojoPatch [debug]: ([sfhospital_team1.txt]...) +MojoPatch [debug]: md5summing... +MojoPatch: (md5sum: a4f4cb5810631e4b42eeac749f7f1549) +MojoPatch [debug]: md5summing... +MojoPatch: (md5sum: a4f4cb5810631e4b42eeac749f7f1549) +MojoPatch [debug]: ([sfrecon.txt]...) +MojoPatch [debug]: md5summing... +MojoPatch: (md5sum: 73c73384d7e34a4e111bfdac879486a9) +MojoPatch [debug]: md5summing... +MojoPatch: (md5sum: 73c73384d7e34a4e111bfdac879486a9) +MojoPatch [debug]: ([sfrecon_team0.txt]...) +MojoPatch [debug]: md5summing... +MojoPatch: (md5sum: 4f09f090eea61ae134700cf404743cd5) +MojoPatch [debug]: md5summing... +MojoPatch: (md5sum: 4f09f090eea61ae134700cf404743cd5) +MojoPatch [debug]: ([sfrecon_team1.txt]...) +MojoPatch [debug]: md5summing... +MojoPatch: (md5sum: 9ba9de4c9f1b7e5a0c1e0b1cfac9e8a6) +MojoPatch [debug]: md5summing... +MojoPatch: (md5sum: 9ba9de4c9f1b7e5a0c1e0b1cfac9e8a6) +MojoPatch [debug]: ([sfsandstorm.txt]...) +MojoPatch: ADDORREPLACE Briefings/sfsandstorm.txt +MojoPatch [debug]: md5summing... +MojoPatch: (md5sum: b6b7004fcf7d408643e05eebc05eb1be) +MojoPatch [debug]: (2256 bytes in file.) +MojoPatch [debug]: ([sfsandstorm_team0.txt]...) +MojoPatch: ADDORREPLACE Briefings/sfsandstorm_team0.txt +MojoPatch [debug]: md5summing... +MojoPatch: (md5sum: b91bafd59145687e5fcc294701e2513e) +MojoPatch [debug]: (1090 bytes in file.) +MojoPatch [debug]: ([sfsandstorm_team1.txt]...) +MojoPatch: ADDORREPLACE Briefings/sfsandstorm_team1.txt +MojoPatch [debug]: md5summing... +MojoPatch: (md5sum: 63614f2427db9d68394b527b4ca83708) +MojoPatch [debug]: (1098 bytes in file.) +MojoPatch [debug]: ([swamp_raid.txt]...) +MojoPatch [debug]: md5summing... +MojoPatch: (md5sum: fbe441c76da084028d39954d04a7ab4b) +MojoPatch [debug]: md5summing... +MojoPatch: (md5sum: fbe441c76da084028d39954d04a7ab4b) +MojoPatch [debug]: ([swamp_raid_team0.txt]...) +MojoPatch [debug]: md5summing... +MojoPatch: (md5sum: f8268cddda406ae0be65613c3e036d04) +MojoPatch [debug]: md5summing... +MojoPatch: (md5sum: f8268cddda406ae0be65613c3e036d04) +MojoPatch [debug]: ([swamp_raid_team1.txt]...) +MojoPatch [debug]: md5summing... +MojoPatch: (md5sum: bab893b2aaf26990a7a8c69ebf76a441) +MojoPatch [debug]: md5summing... +MojoPatch: (md5sum: bab893b2aaf26990a7a8c69ebf76a441) +MojoPatch [debug]: ([tactical_training.txt]...) +MojoPatch [debug]: md5summing... +MojoPatch: (md5sum: 7ce228b3b7d1583021e3d16176fa39d0) +MojoPatch [debug]: md5summing... +MojoPatch: (md5sum: 7ce228b3b7d1583021e3d16176fa39d0) +MojoPatch [debug]: ([tunnel.txt]...) +MojoPatch [debug]: md5summing... +MojoPatch: (md5sum: 94c14cf92ededaffae6efecfab526b2a) +MojoPatch [debug]: md5summing... +MojoPatch: (md5sum: 94c14cf92ededaffae6efecfab526b2a) +MojoPatch [debug]: ([tunnel_team0.txt]...) +MojoPatch [debug]: md5summing... +MojoPatch: (md5sum: 678083dd6edfab3a659aef0fbea8e3b6) +MojoPatch [debug]: md5summing... +MojoPatch: (md5sum: 678083dd6edfab3a659aef0fbea8e3b6) +MojoPatch [debug]: ([tunnel_team1.txt]...) +MojoPatch [debug]: md5summing... +MojoPatch: (md5sum: 7c81865b3af5cc5fc5058857ddc86162) +MojoPatch [debug]: md5summing... +MojoPatch: (md5sum: 7c81865b3af5cc5fc5058857ddc86162) +MojoPatch [debug]: ([us_weapons.txt]...) +MojoPatch [debug]: md5summing... +MojoPatch: (md5sum: 31e1f7a065c4febf4090abdb1f150aa8) +MojoPatch [debug]: md5summing... +MojoPatch: (md5sum: 31e1f7a065c4febf4090abdb1f150aa8) +MojoPatch [debug]: ([weapons_cache.txt]...) +MojoPatch [debug]: md5summing... +MojoPatch: (md5sum: a8bc8883f28d8961d96a45d14291c0c9) +MojoPatch [debug]: md5summing... +MojoPatch: (md5sum: a8bc8883f28d8961d96a45d14291c0c9) +MojoPatch [debug]: ([weapons_cache_se.txt]...) +MojoPatch [debug]: md5summing... +MojoPatch: (md5sum: 2cf01f290bde7d8599ae82f54e3cb7bc) +MojoPatch [debug]: md5summing... +MojoPatch: (md5sum: 2cf01f290bde7d8599ae82f54e3cb7bc) +MojoPatch [debug]: ([weapons_cache_se_team0.txt]...) +MojoPatch [debug]: md5summing... +MojoPatch: (md5sum: ed91306df96428142c7c8bf0d7a67f6c) +MojoPatch [debug]: md5summing... +MojoPatch: (md5sum: ed91306df96428142c7c8bf0d7a67f6c) +MojoPatch [debug]: ([weapons_cache_se_team1.txt]...) +MojoPatch [debug]: md5summing... +MojoPatch: (md5sum: 3a661ff93aa7a0439f16c174e9f74f0c) +MojoPatch [debug]: md5summing... +MojoPatch: (md5sum: 3a661ff93aa7a0439f16c174e9f74f0c) +MojoPatch [debug]: ([weapons_cache_team0.txt]...) +MojoPatch [debug]: md5summing... +MojoPatch: (md5sum: 6869039ef8c5e16341b3e78debc07154) +MojoPatch [debug]: md5summing... +MojoPatch: (md5sum: 6869039ef8c5e16341b3e78debc07154) +MojoPatch [debug]: ([weapons_cache_team1.txt]...) +MojoPatch [debug]: md5summing... +MojoPatch: (md5sum: ee3cf726d430ed2d0efe83f18df4e0f7) +MojoPatch [debug]: md5summing... +MojoPatch: (md5sum: ee3cf726d430ed2d0efe83f18df4e0f7) +MojoPatch [debug]: ([Contents]...) +MojoPatch [debug]: Examining /Users/icculus/Desktop/aops200.app/Contents and Contents +MojoPatch [debug]: (looking for files that need deletion...) +MojoPatch [debug]: ([Info.plist]...) +MojoPatch [debug]: ([MacOS]...) +MojoPatch [debug]: ([PkgInfo]...) +MojoPatch [debug]: ([Resources]...) +MojoPatch [debug]: (looking for files that need addition...) +MojoPatch [debug]: ([Info.plist]...) +MojoPatch [debug]: md5summing... +MojoPatch: (md5sum: bfd704080f9a9a2255c22e13a444d81f) +MojoPatch [debug]: md5summing... +MojoPatch: (md5sum: bfd704080f9a9a2255c22e13a444d81f) +MojoPatch [debug]: ([MacOS]...) +MojoPatch [debug]: Examining /Users/icculus/Desktop/aops200.app/Contents/MacOS and Contents/MacOS +MojoPatch [debug]: (looking for files that need deletion...) +MojoPatch [debug]: (looking for files that need addition...) +MojoPatch [debug]: ([PkgInfo]...) +MojoPatch [debug]: md5summing... +MojoPatch: (md5sum: e1e1381eeb88b48dda6cbb66e7f6b29b) +MojoPatch [debug]: md5summing... +MojoPatch: (md5sum: e1e1381eeb88b48dda6cbb66e7f6b29b) +MojoPatch [debug]: ([Resources]...) +MojoPatch [debug]: Examining /Users/icculus/Desktop/aops200.app/Contents/Resources and Contents/Resources +MojoPatch [debug]: (looking for files that need deletion...) +MojoPatch [debug]: ([ArmyOps.icns]...) +MojoPatch [debug]: ([English.lproj]...) +MojoPatch [debug]: (looking for files that need addition...) +MojoPatch [debug]: ([ArmyOps.icns]...) +MojoPatch [debug]: md5summing... +MojoPatch: (md5sum: 250772a3f2bbf5f65341c1fec7e44244) +MojoPatch [debug]: md5summing... +MojoPatch: (md5sum: 250772a3f2bbf5f65341c1fec7e44244) +MojoPatch [debug]: ([English.lproj]...) +MojoPatch [debug]: Examining /Users/icculus/Desktop/aops200.app/Contents/Resources/English.lproj and Contents/Resources/English.lproj +MojoPatch [debug]: (looking for files that need deletion...) +MojoPatch [debug]: ([InfoPlist.strings]...) +MojoPatch [debug]: (looking for files that need addition...) +MojoPatch [debug]: ([InfoPlist.strings]...) +MojoPatch [debug]: md5summing... +MojoPatch: (md5sum: 020b31613141595dd8f2ff326bcca1b4) +MojoPatch [debug]: md5summing... +MojoPatch: (md5sum: 020b31613141595dd8f2ff326bcca1b4) +MojoPatch [debug]: ([Help]...) +MojoPatch [debug]: Examining /Users/icculus/Desktop/aops200.app/Help and Help +MojoPatch [debug]: (looking for files that need deletion...) +MojoPatch [debug]: ([AAO.ico]...) +MojoPatch [debug]: ([AAOMap.ico]...) +MojoPatch [debug]: ([America's Army Community.url]...) +MojoPatch [debug]: ([America's Army Support.url]...) +MojoPatch [debug]: ([America's Army Web Site.url]...) +MojoPatch [debug]: ([AmericasArmyKeyboardLayout.bmp]...) +MojoPatch [debug]: ([AmericasArmyManual.pdf]...) +MojoPatch [debug]: ([AmericasArmyQuickstartGuide.pdf]...) +MojoPatch [debug]: ([Lease an Official America's Army server.url]...) +MojoPatch [debug]: ([Official U.S. Army Web Site.url]...) +MojoPatch [debug]: ([Play America's Army Online With GameSpy Arcade.url]...) +MojoPatch [debug]: ([UWLogo.bmp]...) +MojoPatch [debug]: ([View game manuals with Adobe Reader.url]...) +MojoPatch [debug]: (looking for files that need addition...) +MojoPatch [debug]: ([AAO.ico]...) +MojoPatch [debug]: md5summing... +MojoPatch: (md5sum: 44dc63d1559f075f3c7834dac6a75821) +MojoPatch [debug]: md5summing... +MojoPatch: (md5sum: 44dc63d1559f075f3c7834dac6a75821) +MojoPatch [debug]: ([AAOMap.ico]...) +MojoPatch [debug]: md5summing... +MojoPatch: (md5sum: 921c124a07f9a14036d066d47fad5683) +MojoPatch [debug]: md5summing... +MojoPatch: (md5sum: 921c124a07f9a14036d066d47fad5683) +MojoPatch [debug]: ([America's Army Community.url]...) +MojoPatch [debug]: md5summing... +MojoPatch: (md5sum: d3c8409aa9a1455d2f60a046f30198e3) +MojoPatch [debug]: md5summing... +MojoPatch: (md5sum: d3c8409aa9a1455d2f60a046f30198e3) +MojoPatch [debug]: ([America's Army Support.url]...) +MojoPatch [debug]: md5summing... +MojoPatch: (md5sum: 778d4039c0d6d4d835caa401cb02c78d) +MojoPatch [debug]: md5summing... +MojoPatch: (md5sum: 778d4039c0d6d4d835caa401cb02c78d) +MojoPatch [debug]: ([America's Army Web Site.url]...) +MojoPatch [debug]: md5summing... +MojoPatch: (md5sum: 5b5a466fa2e4f0b19fc8b2447fc4d8df) +MojoPatch [debug]: md5summing... +MojoPatch: (md5sum: 5b5a466fa2e4f0b19fc8b2447fc4d8df) +MojoPatch [debug]: ([AmericasArmyKeyboardLayout.bmp]...) +MojoPatch [debug]: md5summing... +MojoPatch: (md5sum: 45fcef9b6f441b5225f7691cf1b3e972) +MojoPatch [debug]: md5summing... +MojoPatch: (md5sum: 45fcef9b6f441b5225f7691cf1b3e972) +MojoPatch [debug]: ([AmericasArmyManual.pdf]...) +MojoPatch [debug]: md5summing... +MojoPatch: (md5sum: 5b530e741560913d58171b89a7db0ae1) +MojoPatch [debug]: md5summing... +MojoPatch: (md5sum: 6e2a1f9849183e53149d9c96e5a7a4d5) +MojoPatch: PATCH Help/AmericasArmyManual.pdf +MojoPatch [debug]: (xdelta call: [delta -n --maxmem=128M "/Users/icculus/Desktop/aops200.app/Help/AmericasArmyManual.pdf" "Help/AmericasArmyManual.pdf" "/tmp/mojopatch.tmp1.2224"].) +MojoPatch [debug]: (1011431 bytes in patch.) +MojoPatch [debug]: ([AmericasArmyQuickstartGuide.pdf]...) +MojoPatch [debug]: md5summing... +MojoPatch: (md5sum: d20dcd158be827ff443694080309c5fe) +MojoPatch [debug]: md5summing... +MojoPatch: (md5sum: 88263dcddf6abe04954e8160599a831c) +MojoPatch: PATCH Help/AmericasArmyQuickstartGuide.pdf +MojoPatch [debug]: (xdelta call: [delta -n --maxmem=128M "/Users/icculus/Desktop/aops200.app/Help/AmericasArmyQuickstartGuide.pdf" "Help/AmericasArmyQuickstartGuide.pdf" "/tmp/mojopatch.tmp1.2224"].) +MojoPatch [debug]: (27260 bytes in patch.) +MojoPatch [debug]: ([Lease an Official America's Army server.url]...) +MojoPatch [debug]: md5summing... +MojoPatch: (md5sum: f33bd1fe27139015e987f4dbe07f8267) +MojoPatch [debug]: md5summing... +MojoPatch: (md5sum: f33bd1fe27139015e987f4dbe07f8267) +MojoPatch [debug]: ([Official U.S. Army Web Site.url]...) +MojoPatch [debug]: md5summing... +MojoPatch: (md5sum: 5e595475cce6d20fdc2d3493db01f0db) +MojoPatch [debug]: md5summing... +MojoPatch: (md5sum: 5e595475cce6d20fdc2d3493db01f0db) +MojoPatch [debug]: ([Play America's Army Online With GameSpy Arcade.url]...) +MojoPatch [debug]: md5summing... +MojoPatch: (md5sum: 922b9ad1329687408c1531196981fc4e) +MojoPatch [debug]: md5summing... +MojoPatch: (md5sum: 922b9ad1329687408c1531196981fc4e) +MojoPatch [debug]: ([UWLogo.bmp]...) +MojoPatch [debug]: md5summing... +MojoPatch: (md5sum: e0d32cd33100d3fe1dd21362ff367a5c) +MojoPatch [debug]: md5summing... +MojoPatch: (md5sum: e0d32cd33100d3fe1dd21362ff367a5c) +MojoPatch [debug]: ([View game manuals with Adobe Reader.url]...) +MojoPatch [debug]: md5summing... +MojoPatch: (md5sum: ac695aefcc4ffd0769a28717641612c1) +MojoPatch [debug]: md5summing... +MojoPatch: (md5sum: ac695aefcc4ffd0769a28717641612c1) +MojoPatch [debug]: ([Maps]...) +MojoPatch [debug]: Examining /Users/icculus/Desktop/aops200.app/Maps and Maps +MojoPatch [debug]: (looking for files that need deletion...) +MojoPatch [debug]: ([Bridge.aao]...) +MojoPatch [debug]: ([Bridge_SE.aao]...) +MojoPatch [debug]: ([camp_mackall.aao]...) +MojoPatch [debug]: ([EandE.aao]...) +MojoPatch [debug]: ([Entry.aao]...) +MojoPatch [debug]: ([Entry2.aao]...) +MojoPatch [debug]: ([FLS.aao]...) +MojoPatch [debug]: ([HQ_Raid.aao]...) +MojoPatch [debug]: ([Insurgent_Camp.aao]...) +MojoPatch [debug]: ([JRTC_Farm.aao]...) +MojoPatch [debug]: ([Jump_Tower.aao]...) +MojoPatch [debug]: ([Leavenworth.aao]...) +MojoPatch [debug]: ([Live_Jump.aao]...) +MojoPatch [debug]: ([M24_Range.aao]...) +MojoPatch [debug]: ([M82_Range.aao]...) +MojoPatch [debug]: ([Medic_Field.aao]...) +MojoPatch [debug]: ([Medic_Training1.aao]...) +MojoPatch [debug]: ([Medic_Training2.aao]...) +MojoPatch [debug]: ([Medic_Training3.aao]...) +MojoPatch [debug]: ([Mountain_Ambush.aao]...) +MojoPatch [debug]: ([Mountain_Pass.aao]...) +MojoPatch [debug]: ([Mountain_Pass_SE.aao]...) +MojoPatch [debug]: ([MOUT_McKenna.aao]...) +MojoPatch [debug]: ([Obstacle.aao]...) +MojoPatch [debug]: ([Pipeline.aao]...) +MojoPatch [debug]: ([Pipeline_SF.aao]...) +MojoPatch [debug]: ([Radio_Tower.aao]...) +MojoPatch [debug]: ([Rifle_Range.aao]...) +MojoPatch [debug]: ([River_Basin.aao]...) +MojoPatch [debug]: ([SFcsar.aao]...) +MojoPatch [debug]: ([SFhospital.aao]...) +MojoPatch [debug]: ([SFrecon.aao]...) +MojoPatch [debug]: ([Swamp_Raid.aao]...) +MojoPatch [debug]: ([Tactical_Training.aao]...) +MojoPatch [debug]: ([Tunnel.aao]...) +MojoPatch [debug]: ([US_Weapons.aao]...) +MojoPatch [debug]: ([Weapons_Cache.aao]...) +MojoPatch [debug]: ([Weapons_Cache_SE.aao]...) +MojoPatch [debug]: (looking for files that need addition...) +MojoPatch [debug]: ([Bridge.aao]...) +MojoPatch [debug]: md5summing... +MojoPatch: (md5sum: b814b9464cbfda8b9346bfe5c15749fa) +MojoPatch [debug]: md5summing... +MojoPatch: (md5sum: b814b9464cbfda8b9346bfe5c15749fa) +MojoPatch [debug]: ([Bridge_SE.aao]...) +MojoPatch [debug]: md5summing... +MojoPatch: (md5sum: 8b43f669ad768070f012e907980e2d98) +MojoPatch [debug]: md5summing... +MojoPatch: (md5sum: 8b43f669ad768070f012e907980e2d98) +MojoPatch [debug]: ([camp_mackall.aao]...) +MojoPatch [debug]: md5summing... +MojoPatch: (md5sum: 4a1a8587874705b5c7796560149270cb) +MojoPatch [debug]: md5summing... +MojoPatch: (md5sum: 4a1a8587874705b5c7796560149270cb) +MojoPatch [debug]: ([EandE.aao]...) +MojoPatch [debug]: md5summing... +MojoPatch: (md5sum: 9074dc28db06797eaef6d87917df0cdc) +MojoPatch [debug]: md5summing... +MojoPatch: (md5sum: 9074dc28db06797eaef6d87917df0cdc) +MojoPatch [debug]: ([Entry.aao]...) +MojoPatch [debug]: md5summing... +MojoPatch: (md5sum: c60918a45a0f16a5f669a561e706d6b0) +MojoPatch [debug]: md5summing... +MojoPatch: (md5sum: c60918a45a0f16a5f669a561e706d6b0) +MojoPatch [debug]: ([Entry2.aao]...) +MojoPatch [debug]: md5summing... +MojoPatch: (md5sum: 6c5c3185a65f889c52833d359dcbf3ec) +MojoPatch [debug]: md5summing... +MojoPatch: (md5sum: 6c5c3185a65f889c52833d359dcbf3ec) +MojoPatch [debug]: ([FLS.aao]...) +MojoPatch [debug]: md5summing... +MojoPatch: (md5sum: 4ad1147e5ee5381ed4d4598989d8f1a4) +MojoPatch [debug]: md5summing... +MojoPatch: (md5sum: 4ad1147e5ee5381ed4d4598989d8f1a4) +MojoPatch [debug]: ([HQ_Raid.aao]...) +MojoPatch [debug]: md5summing... +MojoPatch: (md5sum: 41eff16e9e2229554ebfd69664bb5c36) +MojoPatch [debug]: md5summing... +MojoPatch: (md5sum: 41eff16e9e2229554ebfd69664bb5c36) +MojoPatch [debug]: ([Insurgent_Camp.aao]...) +MojoPatch [debug]: md5summing... +MojoPatch: (md5sum: d1fc3bc8bad6b9c601539f7d94662de2) +MojoPatch [debug]: md5summing... +MojoPatch: (md5sum: d1fc3bc8bad6b9c601539f7d94662de2) +MojoPatch [debug]: ([JRTC_Farm.aao]...) +MojoPatch [debug]: md5summing... +MojoPatch: (md5sum: 0218cbd4d4f43d9bfa52a778ec2a96b5) +MojoPatch [debug]: md5summing... +MojoPatch: (md5sum: 0218cbd4d4f43d9bfa52a778ec2a96b5) +MojoPatch [debug]: ([Jump_Tower.aao]...) +MojoPatch [debug]: md5summing... +MojoPatch: (md5sum: 6da5b3f841cf4994a103c85a3494674b) +MojoPatch [debug]: md5summing... +MojoPatch: (md5sum: 6da5b3f841cf4994a103c85a3494674b) +MojoPatch [debug]: ([Leavenworth.aao]...) +MojoPatch [debug]: md5summing... +MojoPatch: (md5sum: ae24a5eb993b31484e2e27559fc1da11) +MojoPatch [debug]: md5summing... +MojoPatch: (md5sum: ae24a5eb993b31484e2e27559fc1da11) +MojoPatch [debug]: ([Live_Jump.aao]...) +MojoPatch [debug]: md5summing... +MojoPatch: (md5sum: 8f6c28c42b859f3089370a5c66590b9b) +MojoPatch [debug]: md5summing... +MojoPatch: (md5sum: 8f6c28c42b859f3089370a5c66590b9b) +MojoPatch [debug]: ([M24_Range.aao]...) +MojoPatch [debug]: md5summing... +MojoPatch: (md5sum: 7cc763362aa4067cd23bef0a159f54e4) +MojoPatch [debug]: md5summing... +MojoPatch: (md5sum: 7cc763362aa4067cd23bef0a159f54e4) +MojoPatch [debug]: ([M82_Range.aao]...) +MojoPatch [debug]: md5summing... +MojoPatch: (md5sum: 35885fb8393493bec739356c0be656bc) +MojoPatch [debug]: md5summing... +MojoPatch: (md5sum: 35885fb8393493bec739356c0be656bc) +MojoPatch [debug]: ([Medic_Field.aao]...) +MojoPatch [debug]: md5summing... +MojoPatch: (md5sum: e7b16429c188d4164c356e83def8026a) +MojoPatch [debug]: md5summing... +MojoPatch: (md5sum: e7b16429c188d4164c356e83def8026a) +MojoPatch [debug]: ([Medic_Training1.aao]...) +MojoPatch [debug]: md5summing... +MojoPatch: (md5sum: d671b9b4138ae39541b82a66ba13119b) +MojoPatch [debug]: md5summing... +MojoPatch: (md5sum: d671b9b4138ae39541b82a66ba13119b) +MojoPatch [debug]: ([Medic_Training2.aao]...) +MojoPatch [debug]: md5summing... +MojoPatch: (md5sum: 33c02987b76a30f7f3057b69c6519109) +MojoPatch [debug]: md5summing... +MojoPatch: (md5sum: 33c02987b76a30f7f3057b69c6519109) +MojoPatch [debug]: ([Medic_Training3.aao]...) +MojoPatch [debug]: md5summing... +MojoPatch: (md5sum: 1c1f3b697ba5392a729a8c4f4e35463f) +MojoPatch [debug]: md5summing... +MojoPatch: (md5sum: 1c1f3b697ba5392a729a8c4f4e35463f) +MojoPatch [debug]: ([Mountain_Ambush.aao]...) +MojoPatch [debug]: md5summing... +MojoPatch: (md5sum: 9de8a56971bad72d55f53d352ff97935) +MojoPatch [debug]: md5summing... +MojoPatch: (md5sum: 9de8a56971bad72d55f53d352ff97935) +MojoPatch [debug]: ([Mountain_Pass.aao]...) +MojoPatch [debug]: md5summing... +MojoPatch: (md5sum: fec1e4c23c1f9d92b15cf2805e81287c) +MojoPatch [debug]: md5summing... +MojoPatch: (md5sum: fec1e4c23c1f9d92b15cf2805e81287c) +MojoPatch [debug]: ([Mountain_Pass_SE.aao]...) +MojoPatch [debug]: md5summing... +MojoPatch: (md5sum: 1abd13373bd9b58860cf954165338110) +MojoPatch [debug]: md5summing... +MojoPatch: (md5sum: 1abd13373bd9b58860cf954165338110) +MojoPatch [debug]: ([MOUT_McKenna.aao]...) +MojoPatch [debug]: md5summing... +MojoPatch: (md5sum: 4f5e632919e06580d31e61c9a01d9c71) +MojoPatch [debug]: md5summing... +MojoPatch: (md5sum: 4f5e632919e06580d31e61c9a01d9c71) +MojoPatch [debug]: ([Obstacle.aao]...) +MojoPatch [debug]: md5summing... +MojoPatch: (md5sum: d753cad9b17e87cad216bf0e967d71c1) +MojoPatch [debug]: md5summing... +MojoPatch: (md5sum: d753cad9b17e87cad216bf0e967d71c1) +MojoPatch [debug]: ([Pipeline.aao]...) +MojoPatch [debug]: md5summing... +MojoPatch: (md5sum: 9427c874c90589d4caca915c557618f2) +MojoPatch [debug]: md5summing... +MojoPatch: (md5sum: 9427c874c90589d4caca915c557618f2) +MojoPatch [debug]: ([Pipeline_SF.aao]...) +MojoPatch [debug]: md5summing... +MojoPatch: (md5sum: 40e9fd64f76078543c225c9e5b636bbb) +MojoPatch [debug]: md5summing... +MojoPatch: (md5sum: 40e9fd64f76078543c225c9e5b636bbb) +MojoPatch [debug]: ([Radio_Tower.aao]...) +MojoPatch [debug]: md5summing... +MojoPatch: (md5sum: ba0db16185b45f55c9742ad6d2777f9d) +MojoPatch [debug]: md5summing... +MojoPatch: (md5sum: ba0db16185b45f55c9742ad6d2777f9d) +MojoPatch [debug]: ([Rifle_Range.aao]...) +MojoPatch [debug]: md5summing... +MojoPatch: (md5sum: e1b56f8c8a246e57674d2b4e3f49ab98) +MojoPatch [debug]: md5summing... +MojoPatch: (md5sum: e1b56f8c8a246e57674d2b4e3f49ab98) +MojoPatch [debug]: ([River_Basin.aao]...) +MojoPatch [debug]: md5summing... +MojoPatch: (md5sum: e01b7a0250c5d49711ad70cecf0f9e65) +MojoPatch [debug]: md5summing... +MojoPatch: (md5sum: e01b7a0250c5d49711ad70cecf0f9e65) +MojoPatch [debug]: ([SFcsar.aao]...) +MojoPatch [debug]: md5summing... +MojoPatch: (md5sum: 7c9b3f1020e80b8c9dbda70cda4411c7) +MojoPatch [debug]: md5summing... +MojoPatch: (md5sum: 7c9b3f1020e80b8c9dbda70cda4411c7) +MojoPatch [debug]: ([SFhospital.aao]...) +MojoPatch [debug]: md5summing... +MojoPatch: (md5sum: 8b2d7fe4cbfaf8140e37d9e4b5a18653) +MojoPatch [debug]: md5summing... +MojoPatch: (md5sum: 8b2d7fe4cbfaf8140e37d9e4b5a18653) +MojoPatch [debug]: ([SFrecon.aao]...) +MojoPatch [debug]: md5summing... +MojoPatch: (md5sum: a63ae072d60a49028595da27ab7162ad) +MojoPatch [debug]: md5summing... +MojoPatch: (md5sum: a63ae072d60a49028595da27ab7162ad) +MojoPatch [debug]: ([SFsandstorm.aao]...) +MojoPatch: ADDORREPLACE Maps/SFsandstorm.aao +MojoPatch [debug]: md5summing... +MojoPatch: (md5sum: e52561c5cd21da064198fabc75832d5d) +MojoPatch [debug]: (22560858 bytes in file.) +MojoPatch [debug]: ([Swamp_Raid.aao]...) +MojoPatch [debug]: md5summing... +MojoPatch: (md5sum: 9ee70c575042dc4523c04d8234e6b845) +MojoPatch [debug]: md5summing... +MojoPatch: (md5sum: 9ee70c575042dc4523c04d8234e6b845) +MojoPatch [debug]: ([Tactical_Training.aao]...) +MojoPatch [debug]: md5summing... +MojoPatch: (md5sum: 70e50289cecec72cf2800f23e9aed1aa) +MojoPatch [debug]: md5summing... +MojoPatch: (md5sum: 70e50289cecec72cf2800f23e9aed1aa) +MojoPatch [debug]: ([Tunnel.aao]...) +MojoPatch [debug]: md5summing... +MojoPatch: (md5sum: 4da04f192e9cb551767fa7c4416c020a) +MojoPatch [debug]: md5summing... +MojoPatch: (md5sum: 4da04f192e9cb551767fa7c4416c020a) +MojoPatch [debug]: ([US_Weapons.aao]...) +MojoPatch [debug]: md5summing... +MojoPatch: (md5sum: 8f6f4be8ee9c4c7532470dfb7210b268) +MojoPatch [debug]: md5summing... +MojoPatch: (md5sum: 8f6f4be8ee9c4c7532470dfb7210b268) +MojoPatch [debug]: ([Weapons_Cache.aao]...) +MojoPatch [debug]: md5summing... +MojoPatch: (md5sum: 78a000c01d79d1b764b64fb8430ac51d) +MojoPatch [debug]: md5summing... +MojoPatch: (md5sum: 78a000c01d79d1b764b64fb8430ac51d) +MojoPatch [debug]: ([Weapons_Cache_SE.aao]...) +MojoPatch [debug]: md5summing... +MojoPatch: (md5sum: f9355e5f8317ea90153dd390a847bf6c) +MojoPatch [debug]: md5summing... +MojoPatch: (md5sum: f9355e5f8317ea90153dd390a847bf6c) +MojoPatch [debug]: ([Movies]...) +MojoPatch [debug]: Examining /Users/icculus/Desktop/aops200.app/Movies and Movies +MojoPatch [debug]: (looking for files that need deletion...) +MojoPatch [debug]: ([op_vert.RoQ]...) +MojoPatch [debug]: ([sol_vert.RoQ]...) +MojoPatch [debug]: (looking for files that need addition...) +MojoPatch [debug]: ([op_vert.RoQ]...) +MojoPatch [debug]: md5summing... +MojoPatch: (md5sum: 3f780d284f792857c290fc7fe9fc55af) +MojoPatch [debug]: md5summing... +MojoPatch: (md5sum: 3f780d284f792857c290fc7fe9fc55af) +MojoPatch [debug]: ([sol_vert.RoQ]...) +MojoPatch [debug]: md5summing... +MojoPatch: (md5sum: 99ea01ca2f5145c5edff14d0ef5826b8) +MojoPatch [debug]: md5summing... +MojoPatch: (md5sum: 99ea01ca2f5145c5edff14d0ef5826b8) +MojoPatch [debug]: ([Music]...) +MojoPatch [debug]: Examining /Users/icculus/Desktop/aops200.app/Music and Music +MojoPatch [debug]: (looking for files that need deletion...) +MojoPatch [debug]: ([EscapeAndEvade.ogg]...) +MojoPatch [debug]: ([USArmyMainThemeBoostEQ256.ogg]...) +MojoPatch [debug]: (looking for files that need addition...) +MojoPatch [debug]: ([EscapeAndEvade.ogg]...) +MojoPatch [debug]: md5summing... +MojoPatch: (md5sum: cbebbd8cd0391ce62c7a3bb5de90a0ee) +MojoPatch [debug]: md5summing... +MojoPatch: (md5sum: cbebbd8cd0391ce62c7a3bb5de90a0ee) +MojoPatch [debug]: ([USArmyMainThemeBoostEQ256.ogg]...) +MojoPatch [debug]: md5summing... +MojoPatch: (md5sum: 49c7e90580aba7ddb1ae1faa582782d0) +MojoPatch [debug]: md5summing... +MojoPatch: (md5sum: 49c7e90580aba7ddb1ae1faa582782d0) +MojoPatch [debug]: ([Screenshots]...) +MojoPatch [debug]: Examining /Users/icculus/Desktop/aops200.app/Screenshots and Screenshots +MojoPatch [debug]: (looking for files that need deletion...) +MojoPatch [debug]: (looking for files that need addition...) +MojoPatch [debug]: ([Sounds]...) +MojoPatch [debug]: Examining /Users/icculus/Desktop/aops200.app/Sounds and Sounds +MojoPatch [debug]: (looking for files that need deletion...) +MojoPatch [debug]: ([S-Aircraft.uax]...) +MojoPatch [debug]: ([S-Ambient.uax]...) +MojoPatch [debug]: ([S-Animals.uax]...) +MojoPatch [debug]: ([S-BCT_RifleRange.uax]...) +MojoPatch [debug]: ([S-CampMackall.uax]...) +MojoPatch [debug]: ([S-E3.uax]...) +MojoPatch [debug]: ([S-EandE.uax]...) +MojoPatch [debug]: ([S-Explosions.uax]...) +MojoPatch [debug]: ([S-Foley.uax]...) +MojoPatch [debug]: ([S-Human.uax]...) +MojoPatch [debug]: ([S-Jumpschool.uax]...) +MojoPatch [debug]: ([S-JumpTower.uax]...) +MojoPatch [debug]: ([S-LandNav.uax]...) +MojoPatch [debug]: ([S-LiveJump.uax]...) +MojoPatch [debug]: ([S-Material.uax]...) +MojoPatch [debug]: ([S-Medic.uax]...) +MojoPatch [debug]: ([S-MedicField.uax]...) +MojoPatch [debug]: ([S-MedicTraining.uax]...) +MojoPatch [debug]: ([S-Menu.uax]...) +MojoPatch [debug]: ([S-Muffled.uax]...) +MojoPatch [debug]: ([S-Objective.uax]...) +MojoPatch [debug]: ([S-ObstacleCourse.uax]...) +MojoPatch [debug]: ([S-PlayerCommo.uax]...) +MojoPatch [debug]: ([S-RadioMusic.uax]...) +MojoPatch [debug]: ([S-SniperRange.uax]...) +MojoPatch [debug]: ([S-TacticalTraining.uax]...) +MojoPatch [debug]: ([S-US_Weapons.uax]...) +MojoPatch [debug]: ([S-WeaponFX.uax]...) +MojoPatch [debug]: ([S-WeaponsOPFOR.uax]...) +MojoPatch [debug]: ([S-WeaponsUS.uax]...) +MojoPatch [debug]: (looking for files that need addition...) +MojoPatch [debug]: ([S-Aircraft.uax]...) +MojoPatch [debug]: md5summing... +MojoPatch: (md5sum: 404f64f17ff874d29fa4bd2288b81a6f) +MojoPatch [debug]: md5summing... +MojoPatch: (md5sum: 404f64f17ff874d29fa4bd2288b81a6f) +MojoPatch [debug]: ([S-Ambient.uax]...) +MojoPatch [debug]: md5summing... +MojoPatch: (md5sum: ebf9297dad90489d1ced181c1163b780) +MojoPatch [debug]: md5summing... +MojoPatch: (md5sum: ebf9297dad90489d1ced181c1163b780) +MojoPatch [debug]: ([S-Animals.uax]...) +MojoPatch [debug]: md5summing... +MojoPatch: (md5sum: c67cbfbd1ad63be39bf469de551b9c51) +MojoPatch [debug]: md5summing... +MojoPatch: (md5sum: c67cbfbd1ad63be39bf469de551b9c51) +MojoPatch [debug]: ([S-BCT_RifleRange.uax]...) +MojoPatch [debug]: md5summing... +MojoPatch: (md5sum: 4fa4281bbb943a88ee49099f15f8a444) +MojoPatch [debug]: md5summing... +MojoPatch: (md5sum: 4fa4281bbb943a88ee49099f15f8a444) +MojoPatch [debug]: ([S-CampMackall.uax]...) +MojoPatch [debug]: md5summing... +MojoPatch: (md5sum: fcdb262f65ea4940130e8e94d775da7d) +MojoPatch [debug]: md5summing... +MojoPatch: (md5sum: fcdb262f65ea4940130e8e94d775da7d) +MojoPatch [debug]: ([S-E3.uax]...) +MojoPatch [debug]: md5summing... +MojoPatch: (md5sum: be8ba4c3c3c4418b446b63a6669c3269) +MojoPatch [debug]: md5summing... +MojoPatch: (md5sum: be8ba4c3c3c4418b446b63a6669c3269) +MojoPatch [debug]: ([S-EandE.uax]...) +MojoPatch [debug]: md5summing... +MojoPatch: (md5sum: 2dfa145ae77d3131888ab928913d272e) +MojoPatch [debug]: md5summing... +MojoPatch: (md5sum: 2dfa145ae77d3131888ab928913d272e) +MojoPatch [debug]: ([S-Explosions.uax]...) +MojoPatch [debug]: md5summing... +MojoPatch: (md5sum: 96e93da44cfb77e05c54e873ee869f61) +MojoPatch [debug]: md5summing... +MojoPatch: (md5sum: 96e93da44cfb77e05c54e873ee869f61) +MojoPatch [debug]: ([S-Foley.uax]...) +MojoPatch [debug]: md5summing... +MojoPatch: (md5sum: 669f889a96a34e4ebdbc69d85119abdb) +MojoPatch [debug]: md5summing... +MojoPatch: (md5sum: 669f889a96a34e4ebdbc69d85119abdb) +MojoPatch [debug]: ([S-Human.uax]...) +MojoPatch [debug]: md5summing... +MojoPatch: (md5sum: e7f3b9701be7e82b80d8934356abf859) +MojoPatch [debug]: md5summing... +MojoPatch: (md5sum: e7f3b9701be7e82b80d8934356abf859) +MojoPatch [debug]: ([S-Jumpschool.uax]...) +MojoPatch [debug]: md5summing... +MojoPatch: (md5sum: de94f55a957f6cf42d5a9b02733472de) +MojoPatch [debug]: md5summing... +MojoPatch: (md5sum: de94f55a957f6cf42d5a9b02733472de) +MojoPatch [debug]: ([S-JumpTower.uax]...) +MojoPatch [debug]: md5summing... +MojoPatch: (md5sum: e9bee1b61589f6b6f63fb30fcefe02de) +MojoPatch [debug]: md5summing... +MojoPatch: (md5sum: e9bee1b61589f6b6f63fb30fcefe02de) +MojoPatch [debug]: ([S-LandNav.uax]...) +MojoPatch [debug]: md5summing... +MojoPatch: (md5sum: 02a04fdf7249ef9df26f6bc42986b4b0) +MojoPatch [debug]: md5summing... +MojoPatch: (md5sum: 02a04fdf7249ef9df26f6bc42986b4b0) +MojoPatch [debug]: ([S-LiveJump.uax]...) +MojoPatch [debug]: md5summing... +MojoPatch: (md5sum: 432ad662bbf09472303c47641eecc989) +MojoPatch [debug]: md5summing... +MojoPatch: (md5sum: 432ad662bbf09472303c47641eecc989) +MojoPatch [debug]: ([S-Material.uax]...) +MojoPatch [debug]: md5summing... +MojoPatch: (md5sum: 5d92a928940a949bf4742c8b05924525) +MojoPatch [debug]: md5summing... +MojoPatch: (md5sum: 5d92a928940a949bf4742c8b05924525) +MojoPatch [debug]: ([S-Medic.uax]...) +MojoPatch [debug]: md5summing... +MojoPatch: (md5sum: 4ce7312da87231aac0b8675f7758ef8e) +MojoPatch [debug]: md5summing... +MojoPatch: (md5sum: 4ce7312da87231aac0b8675f7758ef8e) +MojoPatch [debug]: ([S-MedicField.uax]...) +MojoPatch [debug]: md5summing... +MojoPatch: (md5sum: 064a45a3159893b94594d389f445d3d0) +MojoPatch [debug]: md5summing... +MojoPatch: (md5sum: 064a45a3159893b94594d389f445d3d0) +MojoPatch [debug]: ([S-MedicTraining.uax]...) +MojoPatch [debug]: md5summing... +MojoPatch: (md5sum: 789027deff5145e3bcc02f8c48aba717) +MojoPatch [debug]: md5summing... +MojoPatch: (md5sum: 789027deff5145e3bcc02f8c48aba717) +MojoPatch [debug]: ([S-Menu.uax]...) +MojoPatch [debug]: md5summing... +MojoPatch: (md5sum: a2ea07acad866a03b051353aa36b0990) +MojoPatch [debug]: md5summing... +MojoPatch: (md5sum: a2ea07acad866a03b051353aa36b0990) +MojoPatch [debug]: ([S-Muffled.uax]...) +MojoPatch [debug]: md5summing... +MojoPatch: (md5sum: ee0c4fad39fc84595e5b8c4dc126d16a) +MojoPatch [debug]: md5summing... +MojoPatch: (md5sum: ee0c4fad39fc84595e5b8c4dc126d16a) +MojoPatch [debug]: ([S-Objective.uax]...) +MojoPatch [debug]: md5summing... +MojoPatch: (md5sum: 9a767b90cab33ae44bedc4b7661d4ede) +MojoPatch [debug]: md5summing... +MojoPatch: (md5sum: 9a767b90cab33ae44bedc4b7661d4ede) +MojoPatch [debug]: ([S-ObstacleCourse.uax]...) +MojoPatch [debug]: md5summing... +MojoPatch: (md5sum: 28edd70873532dff74b15a48daad9194) +MojoPatch [debug]: md5summing... +MojoPatch: (md5sum: 28edd70873532dff74b15a48daad9194) +MojoPatch [debug]: ([S-PlayerCommo.uax]...) +MojoPatch [debug]: md5summing... +MojoPatch: (md5sum: 622d89101b667d373be912d83e7a6232) +MojoPatch [debug]: md5summing... +MojoPatch: (md5sum: 622d89101b667d373be912d83e7a6232) +MojoPatch [debug]: ([S-RadioMusic.uax]...) +MojoPatch [debug]: md5summing... +MojoPatch: (md5sum: f8c30591cf9f6091958ce21e8677e340) +MojoPatch [debug]: md5summing... +MojoPatch: (md5sum: f8c30591cf9f6091958ce21e8677e340) +MojoPatch [debug]: ([S-SniperRange.uax]...) +MojoPatch [debug]: md5summing... +MojoPatch: (md5sum: 47ce8ef5f44d2a281c6f1997ad6fc0ba) +MojoPatch [debug]: md5summing... +MojoPatch: (md5sum: 47ce8ef5f44d2a281c6f1997ad6fc0ba) +MojoPatch [debug]: ([S-TacticalTraining.uax]...) +MojoPatch [debug]: md5summing... +MojoPatch: (md5sum: b9eab8f17e0c30f01473a608f0090008) +MojoPatch [debug]: md5summing... +MojoPatch: (md5sum: b9eab8f17e0c30f01473a608f0090008) +MojoPatch [debug]: ([S-US_Weapons.uax]...) +MojoPatch [debug]: md5summing... +MojoPatch: (md5sum: 4f34ccfc4339954fa9828cafbe256e75) +MojoPatch [debug]: md5summing... +MojoPatch: (md5sum: 4f34ccfc4339954fa9828cafbe256e75) +MojoPatch [debug]: ([S-WeaponFX.uax]...) +MojoPatch [debug]: md5summing... +MojoPatch: (md5sum: ed3c463ff7a33c7720e7405ffb55ac3e) +MojoPatch [debug]: md5summing... +MojoPatch: (md5sum: ed3c463ff7a33c7720e7405ffb55ac3e) +MojoPatch [debug]: ([S-WeaponsOPFOR.uax]...) +MojoPatch [debug]: md5summing... +MojoPatch: (md5sum: 7178e280f22326ce91c14309c1710f8e) +MojoPatch [debug]: md5summing... +MojoPatch: (md5sum: 7178e280f22326ce91c14309c1710f8e) +MojoPatch [debug]: ([S-WeaponsUS.uax]...) +MojoPatch [debug]: md5summing... +MojoPatch: (md5sum: b36bc132fb9b850667fc3074b75d3589) +MojoPatch [debug]: md5summing... +MojoPatch: (md5sum: b36bc132fb9b850667fc3074b75d3589) +MojoPatch [debug]: ([StaticMeshes]...) +MojoPatch [debug]: Examining /Users/icculus/Desktop/aops200.app/StaticMeshes and StaticMeshes +MojoPatch [debug]: (looking for files that need deletion...) +MojoPatch [debug]: ([M-Architectural.usx]...) +MojoPatch [debug]: ([M-attachments.usx]...) +MojoPatch [debug]: ([M-bathroom.usx]...) +MojoPatch [debug]: ([M-Bridge.usx]...) +MojoPatch [debug]: ([M-Caves.usx]...) +MojoPatch [debug]: ([M-Character.usx]...) +MojoPatch [debug]: ([M-Doors.usx]...) +MojoPatch [debug]: ([M-Equipment.usx]...) +MojoPatch [debug]: ([M-Exterior.usx]...) +MojoPatch [debug]: ([M-Farm.usx]...) +MojoPatch [debug]: ([M-FLS.usx]...) +MojoPatch [debug]: ([M-Foliage.usx]...) +MojoPatch [debug]: ([M-FURNITURE.usx]...) +MojoPatch [debug]: ([M-FX.usx]...) +MojoPatch [debug]: ([M-HQ_Raid.usx]...) +MojoPatch [debug]: ([M-INSCAMP.usx]...) +MojoPatch [debug]: ([M-LIGHT.usx]...) +MojoPatch [debug]: ([M-Medical.usx]...) +MojoPatch [debug]: ([M-Misc.usx]...) +MojoPatch [debug]: ([M-Mout_McKenna.usx]...) +MojoPatch [debug]: ([M-Obstacle.usx]...) +MojoPatch [debug]: ([M-Office.usx]...) +MojoPatch [debug]: ([M-Pipeline.usx]...) +MojoPatch [debug]: ([M-RifleRange.usx]...) +MojoPatch [debug]: ([M-SIGNS.usx]...) +MojoPatch [debug]: ([M-Sky.usx]...) +MojoPatch [debug]: ([M-Swamp_Raid.usx]...) +MojoPatch [debug]: ([M-Tunnel.usx]...) +MojoPatch [debug]: ([M-Urban_Movement.usx]...) +MojoPatch [debug]: ([M-vehicles.usx]...) +MojoPatch [debug]: ([M-weapons.usx]...) +MojoPatch [debug]: ([M-weapons_cache.usx]...) +MojoPatch [debug]: ([M2-Architectural.usx]...) +MojoPatch [debug]: ([M2-Attachments.usx]...) +MojoPatch [debug]: ([M2-Equipment.usx]...) +MojoPatch [debug]: ([M2-Farm.usx]...) +MojoPatch [debug]: ([M2-Foliage.usx]...) +MojoPatch [debug]: ([M2-Fx.usx]...) +MojoPatch [debug]: ([M2-Lights.usx]...) +MojoPatch [debug]: ([M2-vehicles.usx]...) +MojoPatch [debug]: ([M2-Weapons.usx]...) +MojoPatch [debug]: ([M2-weapons_cache.usx]...) +MojoPatch [debug]: ([M3-vehicles.usx]...) +MojoPatch [debug]: ([M3-weapons.usx]...) +MojoPatch [debug]: (looking for files that need addition...) +MojoPatch [debug]: ([M-Architectural.usx]...) +MojoPatch [debug]: md5summing... +MojoPatch: (md5sum: c5aa9e35694bc2c8a883d9c295e0f880) +MojoPatch [debug]: md5summing... +MojoPatch: (md5sum: c5aa9e35694bc2c8a883d9c295e0f880) +MojoPatch [debug]: ([M-attachments.usx]...) +MojoPatch [debug]: md5summing... +MojoPatch: (md5sum: 87c5e810dc12cf91db46cb9dfadf6843) +MojoPatch [debug]: md5summing... +MojoPatch: (md5sum: 87c5e810dc12cf91db46cb9dfadf6843) +MojoPatch [debug]: ([M-bathroom.usx]...) +MojoPatch [debug]: md5summing... +MojoPatch: (md5sum: 96a0ea7591ee5a38752a23a9c04d3607) +MojoPatch [debug]: md5summing... +MojoPatch: (md5sum: 96a0ea7591ee5a38752a23a9c04d3607) +MojoPatch [debug]: ([M-Bridge.usx]...) +MojoPatch [debug]: md5summing... +MojoPatch: (md5sum: 387abd5046def46cb069c7489c3f291e) +MojoPatch [debug]: md5summing... +MojoPatch: (md5sum: 387abd5046def46cb069c7489c3f291e) +MojoPatch [debug]: ([M-Caves.usx]...) +MojoPatch [debug]: md5summing... +MojoPatch: (md5sum: 1cc060c2685b13e3c99aa8ba8f40742e) +MojoPatch [debug]: md5summing... +MojoPatch: (md5sum: 1cc060c2685b13e3c99aa8ba8f40742e) +MojoPatch [debug]: ([M-Character.usx]...) +MojoPatch [debug]: md5summing... +MojoPatch: (md5sum: 725c6c4eda9c444935978128c99a05e3) +MojoPatch [debug]: md5summing... +MojoPatch: (md5sum: 725c6c4eda9c444935978128c99a05e3) +MojoPatch [debug]: ([M-Doors.usx]...) +MojoPatch [debug]: md5summing... +MojoPatch: (md5sum: 23e835a11b17fe44fd57a254bc0582e1) +MojoPatch [debug]: md5summing... +MojoPatch: (md5sum: 23e835a11b17fe44fd57a254bc0582e1) +MojoPatch [debug]: ([M-Equipment.usx]...) +MojoPatch [debug]: md5summing... +MojoPatch: (md5sum: 9b537b8e3d639e0848dd9bfa5457bee1) +MojoPatch [debug]: md5summing... +MojoPatch: (md5sum: 9b537b8e3d639e0848dd9bfa5457bee1) +MojoPatch [debug]: ([M-Exterior.usx]...) +MojoPatch [debug]: md5summing... +MojoPatch: (md5sum: 3983a2ab96f2777635a7c3ff5ec16801) +MojoPatch [debug]: md5summing... +MojoPatch: (md5sum: 3983a2ab96f2777635a7c3ff5ec16801) +MojoPatch [debug]: ([M-Farm.usx]...) +MojoPatch [debug]: md5summing... +MojoPatch: (md5sum: 38cb450b466743af5b18fc2c44394d85) +MojoPatch [debug]: md5summing... +MojoPatch: (md5sum: 38cb450b466743af5b18fc2c44394d85) +MojoPatch [debug]: ([M-FLS.usx]...) +MojoPatch [debug]: md5summing... +MojoPatch: (md5sum: 440b361e82e4ffcbf6bb4825b55a1542) +MojoPatch [debug]: md5summing... +MojoPatch: (md5sum: 440b361e82e4ffcbf6bb4825b55a1542) +MojoPatch [debug]: ([M-Foliage.usx]...) +MojoPatch [debug]: md5summing... +MojoPatch: (md5sum: dbc34dd27ea13dc9a88c577e2b0cab79) +MojoPatch [debug]: md5summing... +MojoPatch: (md5sum: dbc34dd27ea13dc9a88c577e2b0cab79) +MojoPatch [debug]: ([M-FURNITURE.usx]...) +MojoPatch [debug]: md5summing... +MojoPatch: (md5sum: ab8ad21986d5ac837da80f21b67bb890) +MojoPatch [debug]: md5summing... +MojoPatch: (md5sum: ab8ad21986d5ac837da80f21b67bb890) +MojoPatch [debug]: ([M-FX.usx]...) +MojoPatch [debug]: md5summing... +MojoPatch: (md5sum: 47996d564e6a9ea4280fde9aad1f6171) +MojoPatch [debug]: md5summing... +MojoPatch: (md5sum: 47996d564e6a9ea4280fde9aad1f6171) +MojoPatch [debug]: ([M-HQ_Raid.usx]...) +MojoPatch [debug]: md5summing... +MojoPatch: (md5sum: 44e7f9f4a516adf2b98f8a40bfe8fe7c) +MojoPatch [debug]: md5summing... +MojoPatch: (md5sum: 44e7f9f4a516adf2b98f8a40bfe8fe7c) +MojoPatch [debug]: ([M-INSCAMP.usx]...) +MojoPatch [debug]: md5summing... +MojoPatch: (md5sum: 9d4dc90820c34da9bbf65ca276db2f65) +MojoPatch [debug]: md5summing... +MojoPatch: (md5sum: 9d4dc90820c34da9bbf65ca276db2f65) +MojoPatch [debug]: ([M-LIGHT.usx]...) +MojoPatch [debug]: md5summing... +MojoPatch: (md5sum: 3f59eda8b02f03977ef6b5a47bbeaa3e) +MojoPatch [debug]: md5summing... +MojoPatch: (md5sum: 3f59eda8b02f03977ef6b5a47bbeaa3e) +MojoPatch [debug]: ([M-Medical.usx]...) +MojoPatch [debug]: md5summing... +MojoPatch: (md5sum: 3cc4418c207c5b068df299d807bbcdb2) +MojoPatch [debug]: md5summing... +MojoPatch: (md5sum: 3cc4418c207c5b068df299d807bbcdb2) +MojoPatch [debug]: ([M-Misc.usx]...) +MojoPatch [debug]: md5summing... +MojoPatch: (md5sum: 9fd1754e23fd3fc3e5d711441ecbe167) +MojoPatch [debug]: md5summing... +MojoPatch: (md5sum: 9fd1754e23fd3fc3e5d711441ecbe167) +MojoPatch [debug]: ([M-Mout_McKenna.usx]...) +MojoPatch [debug]: md5summing... +MojoPatch: (md5sum: 145834f8b2ee4a91fc1cfca1a5b9d202) +MojoPatch [debug]: md5summing... +MojoPatch: (md5sum: 145834f8b2ee4a91fc1cfca1a5b9d202) +MojoPatch [debug]: ([M-Obstacle.usx]...) +MojoPatch [debug]: md5summing... +MojoPatch: (md5sum: 24b741903395f1463e02fee460583905) +MojoPatch [debug]: md5summing... +MojoPatch: (md5sum: 24b741903395f1463e02fee460583905) +MojoPatch [debug]: ([M-Office.usx]...) +MojoPatch [debug]: md5summing... +MojoPatch: (md5sum: 3378ad763fdc2f640125cd5e0aa15636) +MojoPatch [debug]: md5summing... +MojoPatch: (md5sum: 3378ad763fdc2f640125cd5e0aa15636) +MojoPatch [debug]: ([M-Pipeline.usx]...) +MojoPatch [debug]: md5summing... +MojoPatch: (md5sum: 5845ec78b2b72edca203576319d6d406) +MojoPatch [debug]: md5summing... +MojoPatch: (md5sum: 5845ec78b2b72edca203576319d6d406) +MojoPatch [debug]: ([M-RifleRange.usx]...) +MojoPatch [debug]: md5summing... +MojoPatch: (md5sum: 78154b7625d568820919ba3df0d199ee) +MojoPatch [debug]: md5summing... +MojoPatch: (md5sum: 78154b7625d568820919ba3df0d199ee) +MojoPatch [debug]: ([M-SIGNS.usx]...) +MojoPatch [debug]: md5summing... +MojoPatch: (md5sum: c623af57aeb759e39b667264920417b9) +MojoPatch [debug]: md5summing... +MojoPatch: (md5sum: c623af57aeb759e39b667264920417b9) +MojoPatch [debug]: ([M-Sky.usx]...) +MojoPatch [debug]: md5summing... +MojoPatch: (md5sum: 884abd06edbd296e777e8a72bf235540) +MojoPatch [debug]: md5summing... +MojoPatch: (md5sum: 884abd06edbd296e777e8a72bf235540) +MojoPatch [debug]: ([M-Swamp_Raid.usx]...) +MojoPatch [debug]: md5summing... +MojoPatch: (md5sum: 16c65b1fe47affa86beb1750534eb564) +MojoPatch [debug]: md5summing... +MojoPatch: (md5sum: 16c65b1fe47affa86beb1750534eb564) +MojoPatch [debug]: ([M-Tunnel.usx]...) +MojoPatch [debug]: md5summing... +MojoPatch: (md5sum: dfbb75ed69bc1ff78373fd4895a5f414) +MojoPatch [debug]: md5summing... +MojoPatch: (md5sum: dfbb75ed69bc1ff78373fd4895a5f414) +MojoPatch [debug]: ([M-Urban_Movement.usx]...) +MojoPatch [debug]: md5summing... +MojoPatch: (md5sum: 2be2664c17f5b03b02fa99952ce4e822) +MojoPatch [debug]: md5summing... +MojoPatch: (md5sum: 2be2664c17f5b03b02fa99952ce4e822) +MojoPatch [debug]: ([M-vehicles.usx]...) +MojoPatch [debug]: md5summing... +MojoPatch: (md5sum: 9df576068ae4e00eecf304ece5796c19) +MojoPatch [debug]: md5summing... +MojoPatch: (md5sum: 9df576068ae4e00eecf304ece5796c19) +MojoPatch [debug]: ([M-weapons.usx]...) +MojoPatch [debug]: md5summing... +MojoPatch: (md5sum: ad314636ddb76aec3ff472c2e979a620) +MojoPatch [debug]: md5summing... +MojoPatch: (md5sum: ad314636ddb76aec3ff472c2e979a620) +MojoPatch [debug]: ([M-weapons_cache.usx]...) +MojoPatch [debug]: md5summing... +MojoPatch: (md5sum: 69ddfbe1e3b5277bb4462f11f8fe4fed) +MojoPatch [debug]: md5summing... +MojoPatch: (md5sum: 69ddfbe1e3b5277bb4462f11f8fe4fed) +MojoPatch [debug]: ([M2-Architectural.usx]...) +MojoPatch [debug]: md5summing... +MojoPatch: (md5sum: fb434b204b2984c2cf1eceb9fd684f4b) +MojoPatch [debug]: md5summing... +MojoPatch: (md5sum: fb434b204b2984c2cf1eceb9fd684f4b) +MojoPatch [debug]: ([M2-Attachments.usx]...) +MojoPatch [debug]: md5summing... +MojoPatch: (md5sum: 984e41fff6ce42f2cfa75b851fa20b2a) +MojoPatch [debug]: md5summing... +MojoPatch: (md5sum: 984e41fff6ce42f2cfa75b851fa20b2a) +MojoPatch [debug]: ([M2-Equipment.usx]...) +MojoPatch [debug]: md5summing... +MojoPatch: (md5sum: 5a775e1964eb1ca50029a35a3b46ed37) +MojoPatch [debug]: md5summing... +MojoPatch: (md5sum: 5a775e1964eb1ca50029a35a3b46ed37) +MojoPatch [debug]: ([M2-Farm.usx]...) +MojoPatch [debug]: md5summing... +MojoPatch: (md5sum: 06a10adf044e404663304094cfd8b5e2) +MojoPatch [debug]: md5summing... +MojoPatch: (md5sum: 06a10adf044e404663304094cfd8b5e2) +MojoPatch [debug]: ([M2-Foliage.usx]...) +MojoPatch [debug]: md5summing... +MojoPatch: (md5sum: 5e7d52c24d10449f7eb5fd767bdd5107) +MojoPatch [debug]: md5summing... +MojoPatch: (md5sum: 5e7d52c24d10449f7eb5fd767bdd5107) +MojoPatch [debug]: ([M2-Fx.usx]...) +MojoPatch [debug]: md5summing... +MojoPatch: (md5sum: ac4066be87bafe18a7dc37302cd0d37d) +MojoPatch [debug]: md5summing... +MojoPatch: (md5sum: ac4066be87bafe18a7dc37302cd0d37d) +MojoPatch [debug]: ([M2-Lights.usx]...) +MojoPatch [debug]: md5summing... +MojoPatch: (md5sum: 08764b6ffa3253acf9d060823ef751ea) +MojoPatch [debug]: md5summing... +MojoPatch: (md5sum: 08764b6ffa3253acf9d060823ef751ea) +MojoPatch [debug]: ([M2-vehicles.usx]...) +MojoPatch [debug]: md5summing... +MojoPatch: (md5sum: 50ba4a2afcd5ac798a31716f5363fb6d) +MojoPatch [debug]: md5summing... +MojoPatch: (md5sum: 50ba4a2afcd5ac798a31716f5363fb6d) +MojoPatch [debug]: ([M2-Weapons.usx]...) +MojoPatch [debug]: md5summing... +MojoPatch: (md5sum: 562ca2789a77efd0010f74a2ab895acd) +MojoPatch [debug]: md5summing... +MojoPatch: (md5sum: 562ca2789a77efd0010f74a2ab895acd) +MojoPatch [debug]: ([M2-weapons_cache.usx]...) +MojoPatch [debug]: md5summing... +MojoPatch: (md5sum: d96dc549c7ab68fec860433831b2cefa) +MojoPatch [debug]: md5summing... +MojoPatch: (md5sum: d96dc549c7ab68fec860433831b2cefa) +MojoPatch [debug]: ([M3-vehicles.usx]...) +MojoPatch [debug]: md5summing... +MojoPatch: (md5sum: 136339cc3eabfd2ae06bfdfe723be383) +MojoPatch [debug]: md5summing... +MojoPatch: (md5sum: 136339cc3eabfd2ae06bfdfe723be383) +MojoPatch [debug]: ([M3-weapons.usx]...) +MojoPatch [debug]: md5summing... +MojoPatch: (md5sum: 98c6b5370d662dc0396e63710e862e4d) +MojoPatch [debug]: md5summing... +MojoPatch: (md5sum: 98c6b5370d662dc0396e63710e862e4d) +MojoPatch [debug]: ([System]...) +MojoPatch [debug]: Examining /Users/icculus/Desktop/aops200.app/System and System +MojoPatch [debug]: (looking for files that need deletion...) +MojoPatch [debug]: ([AdditionalCredits.txt]...) +MojoPatch [debug]: ([AGP.u]...) +MojoPatch [debug]: ([AGP_AI.u]...) +MojoPatch [debug]: ([AGP_Characters.u]...) +MojoPatch [debug]: ([AGP_Effects.u]...) +MojoPatch [debug]: ([AGP_Gameplay.u]...) +MojoPatch [debug]: ([AGP_Inventory.u]...) +MojoPatch [debug]: ([AGP_Objects.u]...) +MojoPatch [debug]: ([AGP_Script.u]...) +MojoPatch [debug]: ([AGP_UI.u]...) +MojoPatch [debug]: ([armyops-bin]...) +MojoPatch [debug]: ([ArmyOpsGlossary.txt]...) +MojoPatch [debug]: ([ArmyOpsReadMe.txt]...) +MojoPatch [debug]: ([BUGSUBMIT.url]...) +MojoPatch [debug]: ([Config]...) +MojoPatch [debug]: ([Core.int]...) +MojoPatch [debug]: ([Core.u]...) +MojoPatch [debug]: ([credits.ini]...) +MojoPatch [debug]: ([credits.txt]...) +MojoPatch [debug]: ([creditsarmy.ini]...) +MojoPatch [debug]: ([creditsarmy.txt]...) +MojoPatch [debug]: ([D3DDrv.int]...) +MojoPatch [debug]: ([Default.ini]...) +MojoPatch [debug]: ([DefUnrealEd.ini]...) +MojoPatch [debug]: ([DefUser.ini]...) +MojoPatch [debug]: ([descriptions]...) +MojoPatch [debug]: ([Editor.int]...) +MojoPatch [debug]: ([Editor.u]...) +MojoPatch [debug]: ([Engine.int]...) +MojoPatch [debug]: ([Engine.u]...) +MojoPatch [debug]: ([FanSites.ini]...) +MojoPatch [debug]: ([Fire.u]...) +MojoPatch [debug]: ([Gameplay.u]...) +MojoPatch [debug]: ([Help.ini]...) +MojoPatch [debug]: ([IpDrv.int]...) +MojoPatch [debug]: ([IpDrv.u]...) +MojoPatch [debug]: ([KeyBindings.ini]...) +MojoPatch [debug]: ([libSDL-1.2.0.dylib]...) +MojoPatch [debug]: ([lipsincdata]...) +MojoPatch [debug]: ([openal.dylib]...) +MojoPatch [debug]: ([overview.txt]...) +MojoPatch [debug]: ([Partners.ini]...) +MojoPatch [debug]: ([pb]...) +MojoPatch [debug]: ([RunServer.bat]...) +MojoPatch [debug]: ([save]...) +MojoPatch [debug]: ([server-bin]...) +MojoPatch [debug]: ([services.ini]...) +MojoPatch [debug]: ([Setup.int]...) +MojoPatch [debug]: ([Skins.int]...) +MojoPatch [debug]: ([splash.bmp]...) +MojoPatch [debug]: ([Startup.int]...) +MojoPatch [debug]: ([tours.ini]...) +MojoPatch [debug]: ([UnrealEd.int]...) +MojoPatch [debug]: ([UnrealEd.u]...) +MojoPatch [debug]: ([Window.int]...) +MojoPatch [debug]: ([WinDrv.int]...) +MojoPatch [debug]: ([XInterface.u]...) +MojoPatch [debug]: (looking for files that need addition...) +MojoPatch [debug]: ([AdditionalCredits.txt]...) +MojoPatch [debug]: md5summing... +MojoPatch: (md5sum: d797e54cc59d386e558fcbe3a71b070a) +MojoPatch [debug]: md5summing... +MojoPatch: (md5sum: d797e54cc59d386e558fcbe3a71b070a) +MojoPatch [debug]: ([AGP.u]...) +MojoPatch [debug]: md5summing... +MojoPatch: (md5sum: 4a12e59d3eaddb582934b0202940b8dd) +MojoPatch [debug]: md5summing... +MojoPatch: (md5sum: 337b4f187c370fcd74a3f7c6cbe1dbaf) +MojoPatch: PATCH System/AGP.u +MojoPatch [debug]: (xdelta call: [delta -n --maxmem=128M "/Users/icculus/Desktop/aops200.app/System/AGP.u" "System/AGP.u" "/tmp/mojopatch.tmp1.2224"].) +MojoPatch [debug]: (904543 bytes in patch.) +MojoPatch [debug]: ([AGP_AI.u]...) +MojoPatch [debug]: md5summing... +MojoPatch: (md5sum: 074c3bec8298c897510953d43c044aea) +MojoPatch [debug]: md5summing... +MojoPatch: (md5sum: 074c3bec8298c897510953d43c044aea) +MojoPatch [debug]: ([AGP_Characters.u]...) +MojoPatch [debug]: md5summing... +MojoPatch: (md5sum: 26d0f42590b09ddea809294409e1552e) +MojoPatch [debug]: md5summing... +MojoPatch: (md5sum: 26d0f42590b09ddea809294409e1552e) +MojoPatch [debug]: ([AGP_Effects.u]...) +MojoPatch [debug]: md5summing... +MojoPatch: (md5sum: 61890b9e6ef7ca889280dea7c730beb3) +MojoPatch [debug]: md5summing... +MojoPatch: (md5sum: 61890b9e6ef7ca889280dea7c730beb3) +MojoPatch [debug]: ([AGP_Gameplay.u]...) +MojoPatch [debug]: md5summing... +MojoPatch: (md5sum: 83dbb0bd106f4d83268aaada991a887a) +MojoPatch [debug]: md5summing... +MojoPatch: (md5sum: 83dbb0bd106f4d83268aaada991a887a) +MojoPatch [debug]: ([AGP_Inventory.u]...) +MojoPatch [debug]: md5summing... +MojoPatch: (md5sum: 9c33c19ed545b9dcc9f7e31b01e65031) +MojoPatch [debug]: md5summing... +MojoPatch: (md5sum: 9c33c19ed545b9dcc9f7e31b01e65031) +MojoPatch [debug]: ([AGP_Objects.u]...) +MojoPatch [debug]: md5summing... +MojoPatch: (md5sum: 940a2cd464a7762f8690802896c8779b) +MojoPatch [debug]: md5summing... +MojoPatch: (md5sum: 940a2cd464a7762f8690802896c8779b) +MojoPatch [debug]: ([AGP_Script.u]...) +MojoPatch [debug]: md5summing... +MojoPatch: (md5sum: ea6de3d608480d765630bbb6edaf7a0b) +MojoPatch [debug]: md5summing... +MojoPatch: (md5sum: ea6de3d608480d765630bbb6edaf7a0b) +MojoPatch [debug]: ([AGP_UI.u]...) +MojoPatch [debug]: md5summing... +MojoPatch: (md5sum: 89eeb003ed0a79ee203cccfaba276540) +MojoPatch [debug]: md5summing... +MojoPatch: (md5sum: 89eeb003ed0a79ee203cccfaba276540) +MojoPatch [debug]: ([armyops-bin]...) +MojoPatch [debug]: md5summing... +MojoPatch: (md5sum: a25b27024d52b58a381f6975b5c0ebc8) +MojoPatch [debug]: md5summing... +MojoPatch: (md5sum: c55b1445dafa53cdfd7d91d5410dbf01) +MojoPatch: PATCH System/armyops-bin +MojoPatch [debug]: (xdelta call: [delta -n --maxmem=128M "/Users/icculus/Desktop/aops200.app/System/armyops-bin" "System/armyops-bin" "/tmp/mojopatch.tmp1.2224"].) +MojoPatch [debug]: (1071994 bytes in patch.) +MojoPatch [debug]: ([ArmyOpsGlossary.txt]...) +MojoPatch [debug]: md5summing... +MojoPatch: (md5sum: 8b85b42c900b206add7be26b80a104d7) +MojoPatch [debug]: md5summing... +MojoPatch: (md5sum: 8b85b42c900b206add7be26b80a104d7) +MojoPatch [debug]: ([ArmyOpsReadMe.txt]...) +MojoPatch [debug]: md5summing... +MojoPatch: (md5sum: 46a037ac5ee2da702d1f82aa0013265f) +MojoPatch [debug]: md5summing... +MojoPatch: (md5sum: ef34eadf0991a8c91ef6f484bb80e6ad) +MojoPatch: PATCH System/ArmyOpsReadMe.txt +MojoPatch [debug]: (xdelta call: [delta -n --maxmem=128M "/Users/icculus/Desktop/aops200.app/System/ArmyOpsReadMe.txt" "System/ArmyOpsReadMe.txt" "/tmp/mojopatch.tmp1.2224"].) +MojoPatch [debug]: (909 bytes in patch.) +MojoPatch [debug]: ([BUGSUBMIT.url]...) +MojoPatch [debug]: md5summing... +MojoPatch: (md5sum: c3f7af07175b92f69ff0e94e425d9dc6) +MojoPatch [debug]: md5summing... +MojoPatch: (md5sum: c3f7af07175b92f69ff0e94e425d9dc6) +MojoPatch [debug]: ([Config]...) +MojoPatch [debug]: Examining /Users/icculus/Desktop/aops200.app/System/Config and System/Config +MojoPatch [debug]: (looking for files that need deletion...) +MojoPatch [debug]: ([Abraxas.txt]...) +MojoPatch [debug]: ([AceKilla.txt]...) +MojoPatch [debug]: ([Boston.txt]...) +MojoPatch [debug]: ([clean.txt]...) +MojoPatch [debug]: ([Cyan.txt]...) +MojoPatch [debug]: ([Dossett.txt]...) +MojoPatch [debug]: ([Ezekiel]...) +MojoPatch [debug]: ([Ezekiel.txt]...) +MojoPatch [debug]: ([ltcjay.txt]...) +MojoPatch [debug]: ([ramm.txt]...) +MojoPatch [debug]: ([raYGunn.txt]...) +MojoPatch [debug]: ([RU486.txt]...) +MojoPatch [debug]: ([SnoopDoug.txt]...) +MojoPatch [debug]: ([technoloG.txt]...) +MojoPatch [debug]: ([ZekeDev]...) +MojoPatch [debug]: (looking for files that need addition...) +MojoPatch [debug]: ([Abraxas.txt]...) +MojoPatch [debug]: md5summing... +MojoPatch: (md5sum: 29ff6b90f2fb6dcc1aad2141370795c0) +MojoPatch [debug]: md5summing... +MojoPatch: (md5sum: 29ff6b90f2fb6dcc1aad2141370795c0) +MojoPatch [debug]: ([AceKilla.txt]...) +MojoPatch [debug]: md5summing... +MojoPatch: (md5sum: 69929d36ee83e42caa18e104bc661d06) +MojoPatch [debug]: md5summing... +MojoPatch: (md5sum: 69929d36ee83e42caa18e104bc661d06) +MojoPatch [debug]: ([Boston.txt]...) +MojoPatch [debug]: md5summing... +MojoPatch: (md5sum: e3f54cbbeca0609220dfd6ac20a02694) +MojoPatch [debug]: md5summing... +MojoPatch: (md5sum: e3f54cbbeca0609220dfd6ac20a02694) +MojoPatch [debug]: ([clean.txt]...) +MojoPatch [debug]: md5summing... +MojoPatch: (md5sum: 032b0fd430ce9d59f63899763ab9d3c1) +MojoPatch [debug]: md5summing... +MojoPatch: (md5sum: 032b0fd430ce9d59f63899763ab9d3c1) +MojoPatch [debug]: ([Cyan.txt]...) +MojoPatch [debug]: md5summing... +MojoPatch: (md5sum: a1608c04a71ca9f64717015e93088ab1) +MojoPatch [debug]: md5summing... +MojoPatch: (md5sum: a1608c04a71ca9f64717015e93088ab1) +MojoPatch [debug]: ([Dossett.txt]...) +MojoPatch [debug]: md5summing... +MojoPatch: (md5sum: 59ceda94465d0dcdf8deda6c15916ea7) +MojoPatch [debug]: md5summing... +MojoPatch: (md5sum: 59ceda94465d0dcdf8deda6c15916ea7) +MojoPatch [debug]: ([Ezekiel]...) +MojoPatch [debug]: md5summing... +MojoPatch: (md5sum: ccf3417e77a2c547b772b245f17d65d5) +MojoPatch [debug]: md5summing... +MojoPatch: (md5sum: ccf3417e77a2c547b772b245f17d65d5) +MojoPatch [debug]: ([Ezekiel.txt]...) +MojoPatch [debug]: md5summing... +MojoPatch: (md5sum: ccf3417e77a2c547b772b245f17d65d5) +MojoPatch [debug]: md5summing... +MojoPatch: (md5sum: ccf3417e77a2c547b772b245f17d65d5) +MojoPatch [debug]: ([ltcjay.txt]...) +MojoPatch [debug]: md5summing... +MojoPatch: (md5sum: f524eacfe1dd6832a8200d9ba8b4a7cc) +MojoPatch [debug]: md5summing... +MojoPatch: (md5sum: f524eacfe1dd6832a8200d9ba8b4a7cc) +MojoPatch [debug]: ([ramm.txt]...) +MojoPatch [debug]: md5summing... +MojoPatch: (md5sum: 2a1f2e5121f0422279b9e08ba5be3da2) +MojoPatch [debug]: md5summing... +MojoPatch: (md5sum: 2a1f2e5121f0422279b9e08ba5be3da2) +MojoPatch [debug]: ([raYGunn.txt]...) +MojoPatch [debug]: md5summing... +MojoPatch: (md5sum: aca24a047be6d4f1c0c0412501f299b9) +MojoPatch [debug]: md5summing... +MojoPatch: (md5sum: aca24a047be6d4f1c0c0412501f299b9) +MojoPatch [debug]: ([RU486.txt]...) +MojoPatch [debug]: md5summing... +MojoPatch: (md5sum: 37db757e280eafbce291d59b7b517150) +MojoPatch [debug]: md5summing... +MojoPatch: (md5sum: 37db757e280eafbce291d59b7b517150) +MojoPatch [debug]: ([SnoopDoug.txt]...) +MojoPatch [debug]: md5summing... +MojoPatch: (md5sum: af2a528daf4b7bd95082ebd0c6465491) +MojoPatch [debug]: md5summing... +MojoPatch: (md5sum: af2a528daf4b7bd95082ebd0c6465491) +MojoPatch [debug]: ([technoloG.txt]...) +MojoPatch [debug]: md5summing... +MojoPatch: (md5sum: 28edeb05a93c6840b66664fe253afaf3) +MojoPatch [debug]: md5summing... +MojoPatch: (md5sum: 28edeb05a93c6840b66664fe253afaf3) +MojoPatch [debug]: ([ZekeDev]...) +MojoPatch [debug]: md5summing... +MojoPatch: (md5sum: b8209fece30245ef1468de79a2a40bc1) +MojoPatch [debug]: md5summing... +MojoPatch: (md5sum: b8209fece30245ef1468de79a2a40bc1) +MojoPatch [debug]: ([Core.int]...) +MojoPatch [debug]: md5summing... +MojoPatch: (md5sum: 2fdd666e2aa1cd98accc91bd2c49e438) +MojoPatch [debug]: md5summing... +MojoPatch: (md5sum: 2fdd666e2aa1cd98accc91bd2c49e438) +MojoPatch [debug]: ([Core.u]...) +MojoPatch [debug]: md5summing... +MojoPatch: (md5sum: 701ed13505413a26f4c419e94cd77516) +MojoPatch [debug]: md5summing... +MojoPatch: (md5sum: 701ed13505413a26f4c419e94cd77516) +MojoPatch [debug]: ([credits.ini]...) +MojoPatch [debug]: md5summing... +MojoPatch: (md5sum: 6069b74f5cf630d5b27a858e4627fbcb) +MojoPatch [debug]: md5summing... +MojoPatch: (md5sum: 1140cff099294600dfd045fc3c24e1f2) +MojoPatch: PATCH System/credits.ini +MojoPatch [debug]: (xdelta call: [delta -n --maxmem=128M "/Users/icculus/Desktop/aops200.app/System/credits.ini" "System/credits.ini" "/tmp/mojopatch.tmp1.2224"].) +MojoPatch [debug]: (197 bytes in patch.) +MojoPatch [debug]: ([credits.txt]...) +MojoPatch [debug]: md5summing... +MojoPatch: (md5sum: 46759a4c477f869e602c98da075c8b3b) +MojoPatch [debug]: md5summing... +MojoPatch: (md5sum: 6dfd711a60bbfd3453355a56c40bd01c) +MojoPatch: PATCH System/credits.txt +MojoPatch [debug]: (xdelta call: [delta -n --maxmem=128M "/Users/icculus/Desktop/aops200.app/System/credits.txt" "System/credits.txt" "/tmp/mojopatch.tmp1.2224"].) +MojoPatch [debug]: (209 bytes in patch.) +MojoPatch [debug]: ([creditsarmy.ini]...) +MojoPatch [debug]: md5summing... +MojoPatch: (md5sum: 73147c0f115e0bd14c0cb25f390ead1a) +MojoPatch [debug]: md5summing... +MojoPatch: (md5sum: d38931afed03dceef0b71ddb3d5d06bb) +MojoPatch: PATCH System/creditsarmy.ini +MojoPatch [debug]: (xdelta call: [delta -n --maxmem=128M "/Users/icculus/Desktop/aops200.app/System/creditsarmy.ini" "System/creditsarmy.ini" "/tmp/mojopatch.tmp1.2224"].) +MojoPatch [debug]: (438 bytes in patch.) +MojoPatch [debug]: ([creditsarmy.txt]...) +MojoPatch [debug]: md5summing... +MojoPatch: (md5sum: 67ce75ca2ec92e97fe71e05a359df8d7) +MojoPatch [debug]: md5summing... +MojoPatch: (md5sum: c1f5130083844fb0c292887b745e43f6) +MojoPatch: PATCH System/creditsarmy.txt +MojoPatch [debug]: (xdelta call: [delta -n --maxmem=128M "/Users/icculus/Desktop/aops200.app/System/creditsarmy.txt" "System/creditsarmy.txt" "/tmp/mojopatch.tmp1.2224"].) +MojoPatch [debug]: (318 bytes in patch.) +MojoPatch [debug]: ([D3DDrv.int]...) +MojoPatch [debug]: md5summing... +MojoPatch: (md5sum: 351ecc8f84070e0a179660adb3cacfaa) +MojoPatch [debug]: md5summing... +MojoPatch: (md5sum: 351ecc8f84070e0a179660adb3cacfaa) +MojoPatch [debug]: ([Default.ini]...) +MojoPatch [debug]: md5summing... +MojoPatch: (md5sum: 75fb4daf6c5834a9c3cd3e9bb9689f93) +MojoPatch [debug]: md5summing... +MojoPatch: (md5sum: 75fb4daf6c5834a9c3cd3e9bb9689f93) +MojoPatch [debug]: ([DefUnrealEd.ini]...) +MojoPatch [debug]: md5summing... +MojoPatch: (md5sum: ad5305f7fe9cbb0822314f05b19f2c4f) +MojoPatch [debug]: md5summing... +MojoPatch: (md5sum: ad5305f7fe9cbb0822314f05b19f2c4f) +MojoPatch [debug]: ([DefUser.ini]...) +MojoPatch [debug]: md5summing... +MojoPatch: (md5sum: 281bf3fe5e435dd8b09f2c6a9c2b90d6) +MojoPatch [debug]: md5summing... +MojoPatch: (md5sum: 281bf3fe5e435dd8b09f2c6a9c2b90d6) +MojoPatch [debug]: ([descriptions]...) +MojoPatch [debug]: Examining /Users/icculus/Desktop/aops200.app/System/descriptions and System/descriptions +MojoPatch [debug]: (looking for files that need deletion...) +MojoPatch [debug]: ([Mod_Acog_4x.txt]...) +MojoPatch [debug]: ([Mod_ACOG_Reflex.txt]...) +MojoPatch [debug]: ([Mod_Harris_Bipod.txt]...) +MojoPatch [debug]: ([Mod_heatshield.txt]...) +MojoPatch [debug]: ([Mod_Ironsight.txt]...) +MojoPatch [debug]: ([Mod_M203A1_Grenade.txt]...) +MojoPatch [debug]: ([Mod_M4qd_suppressor.txt]...) +MojoPatch [debug]: ([Mod_M583A1_Flare.txt]...) +MojoPatch [debug]: ([Mod_M68_Aimpoint.txt]...) +MojoPatch [debug]: ([Mod_NONE.txt]...) +MojoPatch [debug]: ([Weapon_M4A1.txt]...) +MojoPatch [debug]: (looking for files that need addition...) +MojoPatch [debug]: ([Mod_Acog_4x.txt]...) +MojoPatch [debug]: md5summing... +MojoPatch: (md5sum: 9266e06f56deee0852b9412e2876a0f4) +MojoPatch [debug]: md5summing... +MojoPatch: (md5sum: 9266e06f56deee0852b9412e2876a0f4) +MojoPatch [debug]: ([Mod_ACOG_Reflex.txt]...) +MojoPatch [debug]: md5summing... +MojoPatch: (md5sum: a377688cc3ce3891b9ab08e8456355d3) +MojoPatch [debug]: md5summing... +MojoPatch: (md5sum: a377688cc3ce3891b9ab08e8456355d3) +MojoPatch [debug]: ([Mod_Harris_Bipod.txt]...) +MojoPatch [debug]: md5summing... +MojoPatch: (md5sum: 0039151c733cb1177770d7fb29a99522) +MojoPatch [debug]: md5summing... +MojoPatch: (md5sum: 0039151c733cb1177770d7fb29a99522) +MojoPatch [debug]: ([Mod_heatshield.txt]...) +MojoPatch [debug]: md5summing... +MojoPatch: (md5sum: 816a9f6ac4bcb179adba2a632fe23c84) +MojoPatch [debug]: md5summing... +MojoPatch: (md5sum: 816a9f6ac4bcb179adba2a632fe23c84) +MojoPatch [debug]: ([Mod_Ironsight.txt]...) +MojoPatch [debug]: md5summing... +MojoPatch: (md5sum: 8353066c8ffd6d767bca1e41e7d4a630) +MojoPatch [debug]: md5summing... +MojoPatch: (md5sum: 8353066c8ffd6d767bca1e41e7d4a630) +MojoPatch [debug]: ([Mod_M203A1_Grenade.txt]...) +MojoPatch [debug]: md5summing... +MojoPatch: (md5sum: 227d3345424927c02bf7656adb0e3843) +MojoPatch [debug]: md5summing... +MojoPatch: (md5sum: 227d3345424927c02bf7656adb0e3843) +MojoPatch [debug]: ([Mod_M4qd_suppressor.txt]...) +MojoPatch [debug]: md5summing... +MojoPatch: (md5sum: ebf90d9541343d019bba8ef452eb6844) +MojoPatch [debug]: md5summing... +MojoPatch: (md5sum: ebf90d9541343d019bba8ef452eb6844) +MojoPatch [debug]: ([Mod_M583A1_Flare.txt]...) +MojoPatch [debug]: md5summing... +MojoPatch: (md5sum: 6e67f07b37e306ca2e45bf0bb2ac8a66) +MojoPatch [debug]: md5summing... +MojoPatch: (md5sum: 6e67f07b37e306ca2e45bf0bb2ac8a66) +MojoPatch [debug]: ([Mod_M68_Aimpoint.txt]...) +MojoPatch [debug]: md5summing... +MojoPatch: (md5sum: c81bb239a62b73490851d2d73111655a) +MojoPatch [debug]: md5summing... +MojoPatch: (md5sum: c81bb239a62b73490851d2d73111655a) +MojoPatch [debug]: ([Mod_NONE.txt]...) +MojoPatch [debug]: md5summing... +MojoPatch: (md5sum: ff6d0f19e7e6580545ee7c416badd8f5) +MojoPatch [debug]: md5summing... +MojoPatch: (md5sum: ff6d0f19e7e6580545ee7c416badd8f5) +MojoPatch [debug]: ([Weapon_M4A1.txt]...) +MojoPatch [debug]: md5summing... +MojoPatch: (md5sum: 7a58b34629573602fd106cd5d0c2f451) +MojoPatch [debug]: md5summing... +MojoPatch: (md5sum: 7a58b34629573602fd106cd5d0c2f451) +MojoPatch [debug]: ([Distribution.ini]...) +MojoPatch: ADDORREPLACE System/Distribution.ini +MojoPatch [debug]: md5summing... +MojoPatch: (md5sum: 605b8b7d5dc327a9f30150b04b12a749) +MojoPatch [debug]: (32 bytes in file.) +MojoPatch [debug]: ([Editor.int]...) +MojoPatch [debug]: md5summing... +MojoPatch: (md5sum: ab1f6420dcfeabed461a8a6907ebc8fc) +MojoPatch [debug]: md5summing... +MojoPatch: (md5sum: ab1f6420dcfeabed461a8a6907ebc8fc) +MojoPatch [debug]: ([Editor.u]...) +MojoPatch [debug]: md5summing... +MojoPatch: (md5sum: d2aded02132568d3bb67c02c6ae92fc9) +MojoPatch [debug]: md5summing... +MojoPatch: (md5sum: d2aded02132568d3bb67c02c6ae92fc9) +MojoPatch [debug]: ([Engine.int]...) +MojoPatch [debug]: md5summing... +MojoPatch: (md5sum: 77f9ee17418947bafffb89f778311fa6) +MojoPatch [debug]: md5summing... +MojoPatch: (md5sum: 77f9ee17418947bafffb89f778311fa6) +MojoPatch [debug]: ([Engine.u]...) +MojoPatch [debug]: md5summing... +MojoPatch: (md5sum: 415bc718ea68868951a3c14189e87e1e) +MojoPatch [debug]: md5summing... +MojoPatch: (md5sum: 415bc718ea68868951a3c14189e87e1e) +MojoPatch [debug]: ([FanSites.ini]...) +MojoPatch [debug]: md5summing... +MojoPatch: (md5sum: 36f28e9b024988b79a5637c48308fff9) +MojoPatch [debug]: md5summing... +MojoPatch: (md5sum: 1cfed4458fa35406042c28d8129f0921) +MojoPatch: PATCH System/FanSites.ini +MojoPatch [debug]: (xdelta call: [delta -n --maxmem=128M "/Users/icculus/Desktop/aops200.app/System/FanSites.ini" "System/FanSites.ini" "/tmp/mojopatch.tmp1.2224"].) +MojoPatch [debug]: (368 bytes in patch.) +MojoPatch [debug]: ([Fire.u]...) +MojoPatch [debug]: md5summing... +MojoPatch: (md5sum: d67476d133ebe0942e43975de07a068c) +MojoPatch [debug]: md5summing... +MojoPatch: (md5sum: d67476d133ebe0942e43975de07a068c) +MojoPatch [debug]: ([Gameplay.u]...) +MojoPatch [debug]: md5summing... +MojoPatch: (md5sum: 84b6b413f24520c766c7d30671a7f7bb) +MojoPatch [debug]: md5summing... +MojoPatch: (md5sum: 84b6b413f24520c766c7d30671a7f7bb) +MojoPatch [debug]: ([Help.ini]...) +MojoPatch [debug]: md5summing... +MojoPatch: (md5sum: 046c2901db8ad0b43261cc01c0027dc8) +MojoPatch [debug]: md5summing... +MojoPatch: (md5sum: 956f74c6f7e1723a97cd8aa46e038c61) +MojoPatch: PATCH System/Help.ini +MojoPatch [debug]: (xdelta call: [delta -n --maxmem=128M "/Users/icculus/Desktop/aops200.app/System/Help.ini" "System/Help.ini" "/tmp/mojopatch.tmp1.2224"].) +MojoPatch [debug]: (366 bytes in patch.) +MojoPatch [debug]: ([IpDrv.int]...) +MojoPatch [debug]: md5summing... +MojoPatch: (md5sum: 0f57165391148a0bf7af1d28befdb43d) +MojoPatch [debug]: md5summing... +MojoPatch: (md5sum: 0f57165391148a0bf7af1d28befdb43d) +MojoPatch [debug]: ([IpDrv.u]...) +MojoPatch [debug]: md5summing... +MojoPatch: (md5sum: 57a7de720ae3c34cd86a4249da676e73) +MojoPatch [debug]: md5summing... +MojoPatch: (md5sum: 01ff1a11c30c0521efcb19c7e81cc718) +MojoPatch: PATCH System/IpDrv.u +MojoPatch [debug]: (xdelta call: [delta -n --maxmem=128M "/Users/icculus/Desktop/aops200.app/System/IpDrv.u" "System/IpDrv.u" "/tmp/mojopatch.tmp1.2224"].) +MojoPatch [debug]: (76552 bytes in patch.) +MojoPatch [debug]: ([KeyBindings.ini]...) +MojoPatch [debug]: md5summing... +MojoPatch: (md5sum: 36ecfbf741ac1994ccf54a64b99b9db9) +MojoPatch [debug]: md5summing... +MojoPatch: (md5sum: 36ecfbf741ac1994ccf54a64b99b9db9) +MojoPatch [debug]: ([libSDL-1.2.0.dylib]...) +MojoPatch [debug]: md5summing... +MojoPatch: (md5sum: eab503aeda2e5678b28b9ca5a83898bc) +MojoPatch [debug]: md5summing... +MojoPatch: (md5sum: eab503aeda2e5678b28b9ca5a83898bc) +MojoPatch [debug]: ([lipsincdata]...) +MojoPatch [debug]: Examining /Users/icculus/Desktop/aops200.app/System/lipsincdata and System/lipsincdata +MojoPatch [debug]: (looking for files that need deletion...) +MojoPatch [debug]: ([CivDoc_3P.lad]...) +MojoPatch [debug]: ([Controllers]...) +MojoPatch [debug]: ([DI-oc3entver.lad]...) +MojoPatch [debug]: ([DtC6dal.dat]...) +MojoPatch [debug]: ([DtC6dl.dat]...) +MojoPatch [debug]: ([Generic_female.lbp]...) +MojoPatch [debug]: ([Generic_male.lbp]...) +MojoPatch [debug]: ([Generic_old.lbp]...) +MojoPatch [debug]: ([Mappings]...) +MojoPatch [debug]: ([Wt16M9bs.dat]...) +MojoPatch [debug]: ([Wt16M9fs.dat]...) +MojoPatch [debug]: ([Wt8S9bs.dat]...) +MojoPatch [debug]: ([Wt8S9fs.dat]...) +MojoPatch [debug]: (looking for files that need addition...) +MojoPatch [debug]: ([CivDoc_3P.lad]...) +MojoPatch [debug]: md5summing... +MojoPatch: (md5sum: 2634840e21cf38669f2abe0429ec8f6b) +MojoPatch [debug]: md5summing... +MojoPatch: (md5sum: 2634840e21cf38669f2abe0429ec8f6b) +MojoPatch [debug]: ([Controllers]...) +MojoPatch [debug]: Examining /Users/icculus/Desktop/aops200.app/System/lipsincdata/Controllers and System/lipsincdata/Controllers +MojoPatch [debug]: (looking for files that need deletion...) +MojoPatch [debug]: ([CivDoc_3P.lad]...) +MojoPatch [debug]: ([COGGruntMesh.lad]...) +MojoPatch [debug]: ([DI-oc3entver.lad]...) +MojoPatch [debug]: ([DocF_Nurse.lad]...) +MojoPatch [debug]: ([DocM_Labcoat.lad]...) +MojoPatch [debug]: ([George_FlakVest.lad]...) +MojoPatch [debug]: ([SF_3P.lad]...) +MojoPatch [debug]: ([SoldierF_Infantry_ClassB.lad]...) +MojoPatch [debug]: ([SoldierM_Infantry_ClassB.lad]...) +MojoPatch [debug]: ([SoldierM_Instr_AA.lad]...) +MojoPatch [debug]: ([SoldierM_Pilot.lad]...) +MojoPatch [debug]: ([SoldierM_SF_RBA_AdvMarksman.lad]...) +MojoPatch [debug]: ([SoldierM_SF_RBA_Rifleman.lad]...) +MojoPatch [debug]: ([SoldierM_SF_RBA_Saw.lad]...) +MojoPatch [debug]: ([UT-Ref-maya.lad]...) +MojoPatch [debug]: (looking for files that need addition...) +MojoPatch [debug]: ([CivDoc_3P.lad]...) +MojoPatch [debug]: md5summing... +MojoPatch: (md5sum: 29144e19fe49a8769b4d9d283c3f172e) +MojoPatch [debug]: md5summing... +MojoPatch: (md5sum: 29144e19fe49a8769b4d9d283c3f172e) +MojoPatch [debug]: ([COGGruntMesh.lad]...) +MojoPatch [debug]: md5summing... +MojoPatch: (md5sum: cf5483f26745f18be9f2e84bc2f39f09) +MojoPatch [debug]: md5summing... +MojoPatch: (md5sum: cf5483f26745f18be9f2e84bc2f39f09) +MojoPatch [debug]: ([DI-oc3entver.lad]...) +MojoPatch [debug]: md5summing... +MojoPatch: (md5sum: 957435ad0940b5fa1b9a1a4f2034ffa7) +MojoPatch [debug]: md5summing... +MojoPatch: (md5sum: 957435ad0940b5fa1b9a1a4f2034ffa7) +MojoPatch [debug]: ([DocF_Nurse.lad]...) +MojoPatch [debug]: md5summing... +MojoPatch: (md5sum: bd1608cedfde32441ccb6fe0028481f7) +MojoPatch [debug]: md5summing... +MojoPatch: (md5sum: bd1608cedfde32441ccb6fe0028481f7) +MojoPatch [debug]: ([DocM_Labcoat.lad]...) +MojoPatch [debug]: md5summing... +MojoPatch: (md5sum: 51558cbc2ea4520058b49dd196e463a4) +MojoPatch [debug]: md5summing... +MojoPatch: (md5sum: 51558cbc2ea4520058b49dd196e463a4) +MojoPatch [debug]: ([George_FlakVest.lad]...) +MojoPatch [debug]: md5summing... +MojoPatch: (md5sum: dccba25580f1ec3a8d88400f53fea088) +MojoPatch [debug]: md5summing... +MojoPatch: (md5sum: dccba25580f1ec3a8d88400f53fea088) +MojoPatch [debug]: ([SF_3P.lad]...) +MojoPatch [debug]: md5summing... +MojoPatch: (md5sum: 6dfbe92d2ca6fed3211d16f905dd6e0d) +MojoPatch [debug]: md5summing... +MojoPatch: (md5sum: 6dfbe92d2ca6fed3211d16f905dd6e0d) +MojoPatch [debug]: ([SoldierF_Infantry_ClassB.lad]...) +MojoPatch [debug]: md5summing... +MojoPatch: (md5sum: 6063260cf85fcd4d9aabdfa64cdc140e) +MojoPatch [debug]: md5summing... +MojoPatch: (md5sum: 6063260cf85fcd4d9aabdfa64cdc140e) +MojoPatch [debug]: ([SoldierM_Infantry_ClassB.lad]...) +MojoPatch [debug]: md5summing... +MojoPatch: (md5sum: 1d804db116970bb2ca1608ae50349303) +MojoPatch [debug]: md5summing... +MojoPatch: (md5sum: 1d804db116970bb2ca1608ae50349303) +MojoPatch [debug]: ([SoldierM_Instr_AA.lad]...) +MojoPatch [debug]: md5summing... +MojoPatch: (md5sum: c9ab6d0f9a93d0a37b89eae8aabb0aa5) +MojoPatch [debug]: md5summing... +MojoPatch: (md5sum: c9ab6d0f9a93d0a37b89eae8aabb0aa5) +MojoPatch [debug]: ([SoldierM_Pilot.lad]...) +MojoPatch [debug]: md5summing... +MojoPatch: (md5sum: b5ed43a10e0c8c0b928b715b0a19e46c) +MojoPatch [debug]: md5summing... +MojoPatch: (md5sum: b5ed43a10e0c8c0b928b715b0a19e46c) +MojoPatch [debug]: ([SoldierM_SF_RBA_AdvMarksman.lad]...) +MojoPatch [debug]: md5summing... +MojoPatch: (md5sum: fdd3031b765aaee747ba44a24f453774) +MojoPatch [debug]: md5summing... +MojoPatch: (md5sum: fdd3031b765aaee747ba44a24f453774) +MojoPatch [debug]: ([SoldierM_SF_RBA_Rifleman.lad]...) +MojoPatch [debug]: md5summing... +MojoPatch: (md5sum: fdd3031b765aaee747ba44a24f453774) +MojoPatch [debug]: md5summing... +MojoPatch: (md5sum: fdd3031b765aaee747ba44a24f453774) +MojoPatch [debug]: ([SoldierM_SF_RBA_Saw.lad]...) +MojoPatch [debug]: md5summing... +MojoPatch: (md5sum: fdd3031b765aaee747ba44a24f453774) +MojoPatch [debug]: md5summing... +MojoPatch: (md5sum: fdd3031b765aaee747ba44a24f453774) +MojoPatch [debug]: ([UT-Ref-maya.lad]...) +MojoPatch [debug]: md5summing... +MojoPatch: (md5sum: b35714268a40bd09303e4a661ea493b7) +MojoPatch [debug]: md5summing... +MojoPatch: (md5sum: b35714268a40bd09303e4a661ea493b7) +MojoPatch [debug]: ([DI-oc3entver.lad]...) +MojoPatch [debug]: md5summing... +MojoPatch: (md5sum: e91acd10ca2c02a9d35c9c2fdcbb0ca5) +MojoPatch [debug]: md5summing... +MojoPatch: (md5sum: e91acd10ca2c02a9d35c9c2fdcbb0ca5) +MojoPatch [debug]: ([DtC6dal.dat]...) +MojoPatch [debug]: md5summing... +MojoPatch: (md5sum: 6ca9791d3d87ccf58841913adb6dc786) +MojoPatch [debug]: md5summing... +MojoPatch: (md5sum: 6ca9791d3d87ccf58841913adb6dc786) +MojoPatch [debug]: ([DtC6dl.dat]...) +MojoPatch [debug]: md5summing... +MojoPatch: (md5sum: 6023c345eb73ce943a7636209776affa) +MojoPatch [debug]: md5summing... +MojoPatch: (md5sum: 6023c345eb73ce943a7636209776affa) +MojoPatch [debug]: ([Generic_female.lbp]...) +MojoPatch [debug]: md5summing... +MojoPatch: (md5sum: 979d89de94b14f8b1045f57e8042677f) +MojoPatch [debug]: md5summing... +MojoPatch: (md5sum: 979d89de94b14f8b1045f57e8042677f) +MojoPatch [debug]: ([Generic_male.lbp]...) +MojoPatch [debug]: md5summing... +MojoPatch: (md5sum: 4c38bdd158da906d962d8a30bd2f78d9) +MojoPatch [debug]: md5summing... +MojoPatch: (md5sum: 4c38bdd158da906d962d8a30bd2f78d9) +MojoPatch [debug]: ([Generic_old.lbp]...) +MojoPatch [debug]: md5summing... +MojoPatch: (md5sum: f1415daf5879ea54113387f74dd35ee9) +MojoPatch [debug]: md5summing... +MojoPatch: (md5sum: f1415daf5879ea54113387f74dd35ee9) +MojoPatch [debug]: ([Mappings]...) +MojoPatch [debug]: Examining /Users/icculus/Desktop/aops200.app/System/lipsincdata/Mappings and System/lipsincdata/Mappings +MojoPatch [debug]: (looking for files that need deletion...) +MojoPatch [debug]: ([CivDoc_3P.map]...) +MojoPatch [debug]: ([CivDocFemale_3P.map]...) +MojoPatch [debug]: ([COGGruntMesh.map]...) +MojoPatch [debug]: ([DI-oc3entver.map]...) +MojoPatch [debug]: ([SF_3P.map]...) +MojoPatch [debug]: ([UT-Ref-maya.map]...) +MojoPatch [debug]: (looking for files that need addition...) +MojoPatch [debug]: ([CivDoc_3P.map]...) +MojoPatch [debug]: md5summing... +MojoPatch: (md5sum: 0d19e10cfd7a81bd95620a2a6ec81ec5) +MojoPatch [debug]: md5summing... +MojoPatch: (md5sum: 0d19e10cfd7a81bd95620a2a6ec81ec5) +MojoPatch [debug]: ([CivDocFemale_3P.map]...) +MojoPatch [debug]: md5summing... +MojoPatch: (md5sum: 612006fe72dc5d5d7ccf022072fbaf89) +MojoPatch [debug]: md5summing... +MojoPatch: (md5sum: 612006fe72dc5d5d7ccf022072fbaf89) +MojoPatch [debug]: ([COGGruntMesh.map]...) +MojoPatch [debug]: md5summing... +MojoPatch: (md5sum: 2b7b0ee7dadb9fa45a90824e906de45e) +MojoPatch [debug]: md5summing... +MojoPatch: (md5sum: 2b7b0ee7dadb9fa45a90824e906de45e) +MojoPatch [debug]: ([DI-oc3entver.map]...) +MojoPatch [debug]: md5summing... +MojoPatch: (md5sum: 025b7e49fc862221db227b7ac00d1eea) +MojoPatch [debug]: md5summing... +MojoPatch: (md5sum: 025b7e49fc862221db227b7ac00d1eea) +MojoPatch [debug]: ([SF_3P.map]...) +MojoPatch [debug]: md5summing... +MojoPatch: (md5sum: 85ed27c51553135bc6aa33f0367a86b5) +MojoPatch [debug]: md5summing... +MojoPatch: (md5sum: 85ed27c51553135bc6aa33f0367a86b5) +MojoPatch [debug]: ([UT-Ref-maya.map]...) +MojoPatch [debug]: md5summing... +MojoPatch: (md5sum: 05864034b49d6f143597cb3ec05789ee) +MojoPatch [debug]: md5summing... +MojoPatch: (md5sum: 05864034b49d6f143597cb3ec05789ee) +MojoPatch [debug]: ([Wt16M9bs.dat]...) +MojoPatch [debug]: md5summing... +MojoPatch: (md5sum: 58b43a4c03ca5cbf357bf2108fd420ca) +MojoPatch [debug]: md5summing... +MojoPatch: (md5sum: 58b43a4c03ca5cbf357bf2108fd420ca) +MojoPatch [debug]: ([Wt16M9fs.dat]...) +MojoPatch [debug]: md5summing... +MojoPatch: (md5sum: f9e901a5d0c9d29d40b2b8a32b0c5f93) +MojoPatch [debug]: md5summing... +MojoPatch: (md5sum: f9e901a5d0c9d29d40b2b8a32b0c5f93) +MojoPatch [debug]: ([Wt8S9bs.dat]...) +MojoPatch [debug]: md5summing... +MojoPatch: (md5sum: 71848f95fb87c7f900fdd265f6a58fe7) +MojoPatch [debug]: md5summing... +MojoPatch: (md5sum: 71848f95fb87c7f900fdd265f6a58fe7) +MojoPatch [debug]: ([Wt8S9fs.dat]...) +MojoPatch [debug]: md5summing... +MojoPatch: (md5sum: 2fc094d6aea105a0345484b58a0fa081) +MojoPatch [debug]: md5summing... +MojoPatch: (md5sum: 2fc094d6aea105a0345484b58a0fa081) +MojoPatch [debug]: ([openal.dylib]...) +MojoPatch [debug]: md5summing... +MojoPatch: (md5sum: 8f78a49ff4c55c673e5f3c3d23593728) +MojoPatch [debug]: md5summing... +MojoPatch: (md5sum: 8f78a49ff4c55c673e5f3c3d23593728) +MojoPatch [debug]: ([overview.txt]...) +MojoPatch [debug]: md5summing... +MojoPatch: (md5sum: bd459ccfc51f2dd1a9fcf64033592f9c) +MojoPatch [debug]: md5summing... +MojoPatch: (md5sum: 1895b71f79c609ba0c764b357855c2ad) +MojoPatch: PATCH System/overview.txt +MojoPatch [debug]: (xdelta call: [delta -n --maxmem=128M "/Users/icculus/Desktop/aops200.app/System/overview.txt" "System/overview.txt" "/tmp/mojopatch.tmp1.2224"].) +MojoPatch [debug]: (249 bytes in patch.) +MojoPatch [debug]: ([Partners.ini]...) +MojoPatch [debug]: md5summing... +MojoPatch: (md5sum: 7268067ad12b52e22c2c37c3144f8a36) +MojoPatch [debug]: md5summing... +MojoPatch: (md5sum: c3715d7bc1fbad3139d60808655d7be2) +MojoPatch: PATCH System/Partners.ini +MojoPatch [debug]: (xdelta call: [delta -n --maxmem=128M "/Users/icculus/Desktop/aops200.app/System/Partners.ini" "System/Partners.ini" "/tmp/mojopatch.tmp1.2224"].) +MojoPatch [debug]: (1170 bytes in patch.) +MojoPatch [debug]: ([pb]...) +MojoPatch [debug]: Examining /Users/icculus/Desktop/aops200.app/System/pb and System/pb +MojoPatch [debug]: (looking for files that need deletion...) +MojoPatch [debug]: ([htm]...) +MojoPatch [debug]: ([pbag.mac]...) +MojoPatch [debug]: ([pbags.mac]...) +MojoPatch [debug]: ([pbcl.db]...) +MojoPatch [debug]: ([pbcl.mac]...) +MojoPatch [debug]: ([pbcls.mac]...) +MojoPatch [debug]: ([pbsv.db]...) +MojoPatch [debug]: ([pbsv.mac]...) +MojoPatch [debug]: (looking for files that need addition...) +MojoPatch [debug]: ([htm]...) +MojoPatch [debug]: Examining /Users/icculus/Desktop/aops200.app/System/pb/htm and System/pb/htm +MojoPatch [debug]: (looking for files that need deletion...) +MojoPatch [debug]: ([la001311.htm]...) +MojoPatch [debug]: ([lc001032.htm]...) +MojoPatch [debug]: ([ls001032.htm]...) +MojoPatch [debug]: ([ma001311.htm]...) +MojoPatch [debug]: ([mc001032.htm]...) +MojoPatch [debug]: ([ms001032.htm]...) +MojoPatch [debug]: ([wa001311.htm]...) +MojoPatch [debug]: ([wc001032.htm]...) +MojoPatch [debug]: ([ws001032.htm]...) +MojoPatch [debug]: (looking for files that need addition...) +MojoPatch [debug]: ([la001311.htm]...) +MojoPatch [debug]: md5summing... +MojoPatch: (md5sum: 6719a14748a6d86e72bca16338f1514c) +MojoPatch [debug]: md5summing... +MojoPatch: (md5sum: 6719a14748a6d86e72bca16338f1514c) +MojoPatch [debug]: ([lc001032.htm]...) +MojoPatch [debug]: md5summing... +MojoPatch: (md5sum: 5193c613753a601ff7d99781acbc4cd9) +MojoPatch [debug]: md5summing... +MojoPatch: (md5sum: 5193c613753a601ff7d99781acbc4cd9) +MojoPatch [debug]: ([ls001032.htm]...) +MojoPatch [debug]: md5summing... +MojoPatch: (md5sum: 39bf45b7838662b7ad4fccc412489669) +MojoPatch [debug]: md5summing... +MojoPatch: (md5sum: 39bf45b7838662b7ad4fccc412489669) +MojoPatch [debug]: ([ma001311.htm]...) +MojoPatch [debug]: md5summing... +MojoPatch: (md5sum: 765d3a07737ff03fefc8e5e80ccc7615) +MojoPatch [debug]: md5summing... +MojoPatch: (md5sum: 765d3a07737ff03fefc8e5e80ccc7615) +MojoPatch [debug]: ([mc001032.htm]...) +MojoPatch [debug]: md5summing... +MojoPatch: (md5sum: 689c014c83d2bb29a1e467c4d850a740) +MojoPatch [debug]: md5summing... +MojoPatch: (md5sum: 689c014c83d2bb29a1e467c4d850a740) +MojoPatch [debug]: ([ms001032.htm]...) +MojoPatch [debug]: md5summing... +MojoPatch: (md5sum: 62c584db83298f450bed34c1425eabda) +MojoPatch [debug]: md5summing... +MojoPatch: (md5sum: 62c584db83298f450bed34c1425eabda) +MojoPatch [debug]: ([wa001311.htm]...) +MojoPatch [debug]: md5summing... +MojoPatch: (md5sum: 868e6460573cd7069fd794f542e8c316) +MojoPatch [debug]: md5summing... +MojoPatch: (md5sum: 868e6460573cd7069fd794f542e8c316) +MojoPatch [debug]: ([wc001032.htm]...) +MojoPatch [debug]: md5summing... +MojoPatch: (md5sum: 859aeb0327e48c6fc4aaaa66bf750ea2) +MojoPatch [debug]: md5summing... +MojoPatch: (md5sum: 859aeb0327e48c6fc4aaaa66bf750ea2) +MojoPatch [debug]: ([ws001032.htm]...) +MojoPatch [debug]: md5summing... +MojoPatch: (md5sum: 3d9457528786a38f620f3f292c32e4c3) +MojoPatch [debug]: md5summing... +MojoPatch: (md5sum: 3d9457528786a38f620f3f292c32e4c3) +MojoPatch [debug]: ([pbag.mac]...) +MojoPatch [debug]: md5summing... +MojoPatch: (md5sum: a2df2d2064df67cea676a4641c0d317c) +MojoPatch [debug]: md5summing... +MojoPatch: (md5sum: a2df2d2064df67cea676a4641c0d317c) +MojoPatch [debug]: ([pbags.mac]...) +MojoPatch [debug]: md5summing... +MojoPatch: (md5sum: a2df2d2064df67cea676a4641c0d317c) +MojoPatch [debug]: md5summing... +MojoPatch: (md5sum: a2df2d2064df67cea676a4641c0d317c) +MojoPatch [debug]: ([pbcl.db]...) +MojoPatch [debug]: md5summing... +MojoPatch: (md5sum: 3185866ad054fad306842f272c31f83d) +MojoPatch [debug]: md5summing... +MojoPatch: (md5sum: 3185866ad054fad306842f272c31f83d) +MojoPatch [debug]: ([pbcl.mac]...) +MojoPatch [debug]: md5summing... +MojoPatch: (md5sum: 5623e6788df1a39d8da063b2d8c3f4dd) +MojoPatch [debug]: md5summing... +MojoPatch: (md5sum: 5623e6788df1a39d8da063b2d8c3f4dd) +MojoPatch [debug]: ([pbcls.mac]...) +MojoPatch [debug]: md5summing... +MojoPatch: (md5sum: 5623e6788df1a39d8da063b2d8c3f4dd) +MojoPatch [debug]: md5summing... +MojoPatch: (md5sum: 5623e6788df1a39d8da063b2d8c3f4dd) +MojoPatch [debug]: ([pbsv.db]...) +MojoPatch [debug]: md5summing... +MojoPatch: (md5sum: 3185866ad054fad306842f272c31f83d) +MojoPatch [debug]: md5summing... +MojoPatch: (md5sum: 3185866ad054fad306842f272c31f83d) +MojoPatch [debug]: ([pbsv.mac]...) +MojoPatch [debug]: md5summing... +MojoPatch: (md5sum: ff7fc31ded0303428e3a8b5e16b25f90) +MojoPatch [debug]: md5summing... +MojoPatch: (md5sum: ff7fc31ded0303428e3a8b5e16b25f90) +MojoPatch [debug]: ([RunServer.bat]...) +MojoPatch [debug]: md5summing... +MojoPatch: (md5sum: f0bae9a57a1f841edd48fa7400187d38) +MojoPatch [debug]: md5summing... +MojoPatch: (md5sum: f0bae9a57a1f841edd48fa7400187d38) +MojoPatch [debug]: ([save]...) +MojoPatch [debug]: Examining /Users/icculus/Desktop/aops200.app/System/save and System/save +MojoPatch [debug]: (looking for files that need deletion...) +MojoPatch [debug]: ([save.txt]...) +MojoPatch [debug]: (looking for files that need addition...) +MojoPatch [debug]: ([save.txt]...) +MojoPatch [debug]: md5summing... +MojoPatch: (md5sum: 47d1950b7eda82fd973e1ef28a028949) +MojoPatch [debug]: md5summing... +MojoPatch: (md5sum: 47d1950b7eda82fd973e1ef28a028949) +MojoPatch [debug]: ([server-bin]...) +MojoPatch [debug]: md5summing... +MojoPatch: (md5sum: abcbeb6d34609cc46b0b780c1db65c56) +MojoPatch [debug]: md5summing... +MojoPatch: (md5sum: 7d5ae3152045b6dfac917b86777b77b2) +MojoPatch: PATCH System/server-bin +MojoPatch [debug]: (xdelta call: [delta -n --maxmem=128M "/Users/icculus/Desktop/aops200.app/System/server-bin" "System/server-bin" "/tmp/mojopatch.tmp1.2224"].) +MojoPatch [debug]: (980352 bytes in patch.) +MojoPatch [debug]: ([services.ini]...) +MojoPatch [debug]: md5summing... +MojoPatch: (md5sum: 6115ffaef0a5dc1946a111a42c1d0d4f) +MojoPatch [debug]: md5summing... +MojoPatch: (md5sum: 20b1dd9a69ba59805402317e0d9fc25f) +MojoPatch: PATCH System/services.ini +MojoPatch [debug]: (xdelta call: [delta -n --maxmem=128M "/Users/icculus/Desktop/aops200.app/System/services.ini" "System/services.ini" "/tmp/mojopatch.tmp1.2224"].) +MojoPatch [debug]: (308 bytes in patch.) +MojoPatch [debug]: ([Setup.int]...) +MojoPatch [debug]: md5summing... +MojoPatch: (md5sum: 890435763c236061ec447c81eb0d4ddf) +MojoPatch [debug]: md5summing... +MojoPatch: (md5sum: 890435763c236061ec447c81eb0d4ddf) +MojoPatch [debug]: ([Skins.int]...) +MojoPatch [debug]: md5summing... +MojoPatch: (md5sum: 92a616884a2910d566b78cf01d23735a) +MojoPatch [debug]: md5summing... +MojoPatch: (md5sum: 92a616884a2910d566b78cf01d23735a) +MojoPatch [debug]: ([splash.bmp]...) +MojoPatch [debug]: md5summing... +MojoPatch: (md5sum: faf941600d1216fe6385dd9b3eb760e2) +MojoPatch [debug]: md5summing... +MojoPatch: (md5sum: faf941600d1216fe6385dd9b3eb760e2) +MojoPatch [debug]: ([Startup.int]...) +MojoPatch [debug]: md5summing... +MojoPatch: (md5sum: ba987646e874cb44029c5463b805c204) +MojoPatch [debug]: md5summing... +MojoPatch: (md5sum: ba987646e874cb44029c5463b805c204) +MojoPatch [debug]: ([tours.ini]...) +MojoPatch [debug]: md5summing... +MojoPatch: (md5sum: 34b5ee1f856156560ff6c9e808afbcc7) +MojoPatch [debug]: md5summing... +MojoPatch: (md5sum: 6ab352752137e456cd953d1a482c9a02) +MojoPatch: PATCH System/tours.ini +MojoPatch [debug]: (xdelta call: [delta -n --maxmem=128M "/Users/icculus/Desktop/aops200.app/System/tours.ini" "System/tours.ini" "/tmp/mojopatch.tmp1.2224"].) +MojoPatch [debug]: (341 bytes in patch.) +MojoPatch [debug]: ([UnrealEd.int]...) +MojoPatch [debug]: md5summing... +MojoPatch: (md5sum: f982011a01b14b7f4dd83885bbb272f8) +MojoPatch [debug]: md5summing... +MojoPatch: (md5sum: f982011a01b14b7f4dd83885bbb272f8) +MojoPatch [debug]: ([UnrealEd.u]...) +MojoPatch [debug]: md5summing... +MojoPatch: (md5sum: 8284c82703fbc51c899c8ed0c0981da6) +MojoPatch [debug]: md5summing... +MojoPatch: (md5sum: 8284c82703fbc51c899c8ed0c0981da6) +MojoPatch [debug]: ([Window.int]...) +MojoPatch [debug]: md5summing... +MojoPatch: (md5sum: 096eb27ee06945d163d3c8e689639520) +MojoPatch [debug]: md5summing... +MojoPatch: (md5sum: 096eb27ee06945d163d3c8e689639520) +MojoPatch [debug]: ([WinDrv.int]...) +MojoPatch [debug]: md5summing... +MojoPatch: (md5sum: af89094be2c9321c8b828fccc8f5be47) +MojoPatch [debug]: md5summing... +MojoPatch: (md5sum: af89094be2c9321c8b828fccc8f5be47) +MojoPatch [debug]: ([XInterface.u]...) +MojoPatch [debug]: md5summing... +MojoPatch: (md5sum: ea241dbae6dae4247e8fd49ce17d3f57) +MojoPatch [debug]: md5summing... +MojoPatch: (md5sum: 8dc61b02f2ad5a259e83c81e57019d7b) +MojoPatch: PATCH System/XInterface.u +MojoPatch [debug]: (xdelta call: [delta -n --maxmem=128M "/Users/icculus/Desktop/aops200.app/System/XInterface.u" "System/XInterface.u" "/tmp/mojopatch.tmp1.2224"].) +MojoPatch [debug]: (100122 bytes in patch.) +MojoPatch [debug]: ([Textures]...) +MojoPatch [debug]: Examining /Users/icculus/Desktop/aops200.app/Textures and Textures +MojoPatch [debug]: (looking for files that need deletion...) +MojoPatch [debug]: ([Coronas.utx]...) +MojoPatch [debug]: ([CubeMaps.utx]...) +MojoPatch [debug]: ([InterfaceContent.utx]...) +MojoPatch [debug]: ([T-ATTACHMENTS.utx]...) +MojoPatch [debug]: ([T-BRICK.utx]...) +MojoPatch [debug]: ([T-CampMackall.utx]...) +MojoPatch [debug]: ([T-Characters.utx]...) +MojoPatch [debug]: ([T-CONCRETE.utx]...) +MojoPatch [debug]: ([T-DOORS.utx]...) +MojoPatch [debug]: ([T-EDITOR.utx]...) +MojoPatch [debug]: ([T-EQUIPMENT.utx]...) +MojoPatch [debug]: ([T-FABRIC.utx]...) +MojoPatch [debug]: ([T-Facade.utx]...) +MojoPatch [debug]: ([T-FOLIAGE.utx]...) +MojoPatch [debug]: ([T-FONTS.utx]...) +MojoPatch [debug]: ([T-FX.utx]...) +MojoPatch [debug]: ([T-LIGHTS.utx]...) +MojoPatch [debug]: ([T-LIQUIDS.utx]...) +MojoPatch [debug]: ([T-Maps.utx]...) +MojoPatch [debug]: ([T-MedicTraining.utx]...) +MojoPatch [debug]: ([T-METAL.utx]...) +MojoPatch [debug]: ([T-MISC.utx]...) +MojoPatch [debug]: ([T-SIGN.utx]...) +MojoPatch [debug]: ([T-SKINS.utx]...) +MojoPatch [debug]: ([T-SKINS_vehicles.utx]...) +MojoPatch [debug]: ([T-SKY.utx]...) +MojoPatch [debug]: ([T-STONE.utx]...) +MojoPatch [debug]: ([T-TERRAIN.utx]...) +MojoPatch [debug]: ([T-TILE.utx]...) +MojoPatch [debug]: ([T-UI.utx]...) +MojoPatch [debug]: ([T-Weapons.utx]...) +MojoPatch [debug]: ([T-WINDOWS.utx]...) +MojoPatch [debug]: ([T-WOOD.utx]...) +MojoPatch [debug]: ([T2-ATTACHMENTS.utx]...) +MojoPatch [debug]: ([T2-BRICK.utx]...) +MojoPatch [debug]: ([T2-CHARACTERS.utx]...) +MojoPatch [debug]: ([T2-CONCRETE.utx]...) +MojoPatch [debug]: ([T2-DOORS.utx]...) +MojoPatch [debug]: ([T2-EQUIPMENT.utx]...) +MojoPatch [debug]: ([T2-FABRIC.utx]...) +MojoPatch [debug]: ([T2-FOLIAGE.utx]...) +MojoPatch [debug]: ([T2-Fonts.utx]...) +MojoPatch [debug]: ([T2-FX.utx]...) +MojoPatch [debug]: ([T2-LIGHTS.utx]...) +MojoPatch [debug]: ([T2-LIQUIDS.utx]...) +MojoPatch [debug]: ([T2-METAL.utx]...) +MojoPatch [debug]: ([T2-MISC.utx]...) +MojoPatch [debug]: ([T2-SIGNS.utx]...) +MojoPatch [debug]: ([T2-SKINS.utx]...) +MojoPatch [debug]: ([T2-SKINS_vehicles.utx]...) +MojoPatch [debug]: ([T2-SKY.utx]...) +MojoPatch [debug]: ([T2-STONE.utx]...) +MojoPatch [debug]: ([T2-TERRAIN.utx]...) +MojoPatch [debug]: ([T2-TILE.utx]...) +MojoPatch [debug]: ([T2-UI.utx]...) +MojoPatch [debug]: ([T2-WINDOWS.utx]...) +MojoPatch [debug]: ([T2-WOOD.utx]...) +MojoPatch [debug]: ([T3-SKINS_vehicles.utx]...) +MojoPatch [debug]: ([T_UI2.utx]...) +MojoPatch [debug]: ([X-TEMP.utx]...) +MojoPatch [debug]: (looking for files that need addition...) +MojoPatch [debug]: ([Coronas.utx]...) +MojoPatch [debug]: md5summing... +MojoPatch: (md5sum: 55484fac70355a26ff36f35c5ac2e784) +MojoPatch [debug]: md5summing... +MojoPatch: (md5sum: 55484fac70355a26ff36f35c5ac2e784) +MojoPatch [debug]: ([CubeMaps.utx]...) +MojoPatch [debug]: md5summing... +MojoPatch: (md5sum: bf2b5c767c43b990889d79daad8d2222) +MojoPatch [debug]: md5summing... +MojoPatch: (md5sum: bf2b5c767c43b990889d79daad8d2222) +MojoPatch [debug]: ([InterfaceContent.utx]...) +MojoPatch [debug]: md5summing... +MojoPatch: (md5sum: c965c7a1b5a44e7c7989c73b60843ce4) +MojoPatch [debug]: md5summing... +MojoPatch: (md5sum: c965c7a1b5a44e7c7989c73b60843ce4) +MojoPatch [debug]: ([T-ATTACHMENTS.utx]...) +MojoPatch [debug]: md5summing... +MojoPatch: (md5sum: 80e81bc6c667ed2da0f04d19d262c73e) +MojoPatch [debug]: md5summing... +MojoPatch: (md5sum: 80e81bc6c667ed2da0f04d19d262c73e) +MojoPatch [debug]: ([T-BRICK.utx]...) +MojoPatch [debug]: md5summing... +MojoPatch: (md5sum: 7c26e9774fdaee3ffd4e67c71040c4c4) +MojoPatch [debug]: md5summing... +MojoPatch: (md5sum: 7c26e9774fdaee3ffd4e67c71040c4c4) +MojoPatch [debug]: ([T-CampMackall.utx]...) +MojoPatch [debug]: md5summing... +MojoPatch: (md5sum: f5835aacedff8203f7cbcc076863c022) +MojoPatch [debug]: md5summing... +MojoPatch: (md5sum: f5835aacedff8203f7cbcc076863c022) +MojoPatch [debug]: ([T-Characters.utx]...) +MojoPatch [debug]: md5summing... +MojoPatch: (md5sum: 8475165a9bf42f308248a9386c7cc9b4) +MojoPatch [debug]: md5summing... +MojoPatch: (md5sum: 8475165a9bf42f308248a9386c7cc9b4) +MojoPatch [debug]: ([T-CONCRETE.utx]...) +MojoPatch [debug]: md5summing... +MojoPatch: (md5sum: cf859135c18ab4ddd99f2408292c8845) +MojoPatch [debug]: md5summing... +MojoPatch: (md5sum: cf859135c18ab4ddd99f2408292c8845) +MojoPatch [debug]: ([T-DOORS.utx]...) +MojoPatch [debug]: md5summing... +MojoPatch: (md5sum: d9f1b8da19c2a4fae0e0ac3e142f767a) +MojoPatch [debug]: md5summing... +MojoPatch: (md5sum: d9f1b8da19c2a4fae0e0ac3e142f767a) +MojoPatch [debug]: ([T-EDITOR.utx]...) +MojoPatch [debug]: md5summing... +MojoPatch: (md5sum: b7cfc7010b765579153652d9a1a1c8d7) +MojoPatch [debug]: md5summing... +MojoPatch: (md5sum: b7cfc7010b765579153652d9a1a1c8d7) +MojoPatch [debug]: ([T-EQUIPMENT.utx]...) +MojoPatch [debug]: md5summing... +MojoPatch: (md5sum: 2fed5aab73091c0cfb54a8a04c60ce51) +MojoPatch [debug]: md5summing... +MojoPatch: (md5sum: 2fed5aab73091c0cfb54a8a04c60ce51) +MojoPatch [debug]: ([T-FABRIC.utx]...) +MojoPatch [debug]: md5summing... +MojoPatch: (md5sum: cf7172aa0649d9ca14de5e94a460f3fa) +MojoPatch [debug]: md5summing... +MojoPatch: (md5sum: cf7172aa0649d9ca14de5e94a460f3fa) +MojoPatch [debug]: ([T-Facade.utx]...) +MojoPatch [debug]: md5summing... +MojoPatch: (md5sum: 3b30f81a9d6388578f6c77ec79a6b318) +MojoPatch [debug]: md5summing... +MojoPatch: (md5sum: 3b30f81a9d6388578f6c77ec79a6b318) +MojoPatch [debug]: ([T-FOLIAGE.utx]...) +MojoPatch [debug]: md5summing... +MojoPatch: (md5sum: 461527a0608fd36c9700936e63d7090a) +MojoPatch [debug]: md5summing... +MojoPatch: (md5sum: 461527a0608fd36c9700936e63d7090a) +MojoPatch [debug]: ([T-FONTS.utx]...) +MojoPatch [debug]: md5summing... +MojoPatch: (md5sum: 8f4bfef62859aae319cb9ef0ee65c73b) +MojoPatch [debug]: md5summing... +MojoPatch: (md5sum: 8f4bfef62859aae319cb9ef0ee65c73b) +MojoPatch [debug]: ([T-FX.utx]...) +MojoPatch [debug]: md5summing... +MojoPatch: (md5sum: b7889453fb97ffc78743bbdd2a43e530) +MojoPatch [debug]: md5summing... +MojoPatch: (md5sum: b7889453fb97ffc78743bbdd2a43e530) +MojoPatch [debug]: ([T-LIGHTS.utx]...) +MojoPatch [debug]: md5summing... +MojoPatch: (md5sum: 9c6b8e86fe11b6496718a1ded7372a82) +MojoPatch [debug]: md5summing... +MojoPatch: (md5sum: 9c6b8e86fe11b6496718a1ded7372a82) +MojoPatch [debug]: ([T-LIQUIDS.utx]...) +MojoPatch [debug]: md5summing... +MojoPatch: (md5sum: 9222ef644cda9244266fe28c9d62e1a8) +MojoPatch [debug]: md5summing... +MojoPatch: (md5sum: 9222ef644cda9244266fe28c9d62e1a8) +MojoPatch [debug]: ([T-Maps.utx]...) +MojoPatch [debug]: md5summing... +MojoPatch: (md5sum: 7a97ea6eb635cbc1ec44e1073b713093) +MojoPatch [debug]: md5summing... +MojoPatch: (md5sum: dee1ac58a88169fb2e062559b904fa36) +MojoPatch: PATCH Textures/T-Maps.utx +MojoPatch [debug]: (xdelta call: [delta -n --maxmem=128M "/Users/icculus/Desktop/aops200.app/Textures/T-Maps.utx" "Textures/T-Maps.utx" "/tmp/mojopatch.tmp1.2224"].) +MojoPatch [debug]: (42724 bytes in patch.) +MojoPatch [debug]: ([T-MedicTraining.utx]...) +MojoPatch [debug]: md5summing... +MojoPatch: (md5sum: b82b99f4ca0c84249c6e311f55afe309) +MojoPatch [debug]: md5summing... +MojoPatch: (md5sum: b82b99f4ca0c84249c6e311f55afe309) +MojoPatch [debug]: ([T-METAL.utx]...) +MojoPatch [debug]: md5summing... +MojoPatch: (md5sum: b1fd5007ca00b9b7007fb0a935149889) +MojoPatch [debug]: md5summing... +MojoPatch: (md5sum: b1fd5007ca00b9b7007fb0a935149889) +MojoPatch [debug]: ([T-MISC.utx]...) +MojoPatch [debug]: md5summing... +MojoPatch: (md5sum: 7e5bfd276448bbb9d152881d39bbb68d) +MojoPatch [debug]: md5summing... +MojoPatch: (md5sum: 7e5bfd276448bbb9d152881d39bbb68d) +MojoPatch [debug]: ([T-SIGN.utx]...) +MojoPatch [debug]: md5summing... +MojoPatch: (md5sum: 2a4a58c7d3d574e9a74fb9d5fbcc26da) +MojoPatch [debug]: md5summing... +MojoPatch: (md5sum: 2a4a58c7d3d574e9a74fb9d5fbcc26da) +MojoPatch [debug]: ([T-SKINS.utx]...) +MojoPatch [debug]: md5summing... +MojoPatch: (md5sum: a90cfd3f72715323bb1f2f43d2548772) +MojoPatch [debug]: md5summing... +MojoPatch: (md5sum: a90cfd3f72715323bb1f2f43d2548772) +MojoPatch [debug]: ([T-SKINS_vehicles.utx]...) +MojoPatch [debug]: md5summing... +MojoPatch: (md5sum: aa10e2e4d7f8cf8126338cb5aed6d06c) +MojoPatch [debug]: md5summing... +MojoPatch: (md5sum: aa10e2e4d7f8cf8126338cb5aed6d06c) +MojoPatch [debug]: ([T-SKY.utx]...) +MojoPatch [debug]: md5summing... +MojoPatch: (md5sum: d7923176867ed1bba03a5c9d026f8270) +MojoPatch [debug]: md5summing... +MojoPatch: (md5sum: d7923176867ed1bba03a5c9d026f8270) +MojoPatch [debug]: ([T-STONE.utx]...) +MojoPatch [debug]: md5summing... +MojoPatch: (md5sum: 7a3bdc41f125b51bac76cb65b6b187e8) +MojoPatch [debug]: md5summing... +MojoPatch: (md5sum: 7a3bdc41f125b51bac76cb65b6b187e8) +MojoPatch [debug]: ([T-TERRAIN.utx]...) +MojoPatch [debug]: md5summing... +MojoPatch: (md5sum: 66031c17f76fd8f3ca72eddfc0ec6df8) +MojoPatch [debug]: md5summing... +MojoPatch: (md5sum: 66031c17f76fd8f3ca72eddfc0ec6df8) +MojoPatch [debug]: ([T-TILE.utx]...) +MojoPatch [debug]: md5summing... +MojoPatch: (md5sum: aa42730febdf324d894333d39425edff) +MojoPatch [debug]: md5summing... +MojoPatch: (md5sum: aa42730febdf324d894333d39425edff) +MojoPatch [debug]: ([T-UI.utx]...) +MojoPatch [debug]: md5summing... +MojoPatch: (md5sum: 3819b1627f2c500ca963d1624086aee8) +MojoPatch [debug]: md5summing... +MojoPatch: (md5sum: 3819b1627f2c500ca963d1624086aee8) +MojoPatch [debug]: ([T-Weapons.utx]...) +MojoPatch [debug]: md5summing... +MojoPatch: (md5sum: 74565d44462bb9628d3f792aeaba780a) +MojoPatch [debug]: md5summing... +MojoPatch: (md5sum: 74565d44462bb9628d3f792aeaba780a) +MojoPatch [debug]: ([T-WINDOWS.utx]...) +MojoPatch [debug]: md5summing... +MojoPatch: (md5sum: eb09fa0479a2e418fe44815a9b5fcf9c) +MojoPatch [debug]: md5summing... +MojoPatch: (md5sum: eb09fa0479a2e418fe44815a9b5fcf9c) +MojoPatch [debug]: ([T-WOOD.utx]...) +MojoPatch [debug]: md5summing... +MojoPatch: (md5sum: 8a7f59843b465a5bc776963f351fb804) +MojoPatch [debug]: md5summing... +MojoPatch: (md5sum: 8a7f59843b465a5bc776963f351fb804) +MojoPatch [debug]: ([T2-ATTACHMENTS.utx]...) +MojoPatch [debug]: md5summing... +MojoPatch: (md5sum: fc032c24d2c6faaa12c7b9c93caa9754) +MojoPatch [debug]: md5summing... +MojoPatch: (md5sum: fc032c24d2c6faaa12c7b9c93caa9754) +MojoPatch [debug]: ([T2-BRICK.utx]...) +MojoPatch [debug]: md5summing... +MojoPatch: (md5sum: 0be98a246e0b00df8b3ded6b61010588) +MojoPatch [debug]: md5summing... +MojoPatch: (md5sum: 0be98a246e0b00df8b3ded6b61010588) +MojoPatch [debug]: ([T2-CHARACTERS.utx]...) +MojoPatch [debug]: md5summing... +MojoPatch: (md5sum: 75622363da75781f7b8d1f9c697a53f1) +MojoPatch [debug]: md5summing... +MojoPatch: (md5sum: 75622363da75781f7b8d1f9c697a53f1) +MojoPatch [debug]: ([T2-CONCRETE.utx]...) +MojoPatch [debug]: md5summing... +MojoPatch: (md5sum: 7576683214d7dcec62bb4c2ba6231e37) +MojoPatch [debug]: md5summing... +MojoPatch: (md5sum: 7576683214d7dcec62bb4c2ba6231e37) +MojoPatch [debug]: ([T2-DOORS.utx]...) +MojoPatch [debug]: md5summing... +MojoPatch: (md5sum: 9b91e79c7e75b26a21c7bbafaf1d0e71) +MojoPatch [debug]: md5summing... +MojoPatch: (md5sum: 9b91e79c7e75b26a21c7bbafaf1d0e71) +MojoPatch [debug]: ([T2-EQUIPMENT.utx]...) +MojoPatch [debug]: md5summing... +MojoPatch: (md5sum: 20bbaad04f0967c7e31af5c62fcdad0f) +MojoPatch [debug]: md5summing... +MojoPatch: (md5sum: 20bbaad04f0967c7e31af5c62fcdad0f) +MojoPatch [debug]: ([T2-FABRIC.utx]...) +MojoPatch [debug]: md5summing... +MojoPatch: (md5sum: 665f814a304fc60eeea9752e7c743302) +MojoPatch [debug]: md5summing... +MojoPatch: (md5sum: 665f814a304fc60eeea9752e7c743302) +MojoPatch [debug]: ([T2-FOLIAGE.utx]...) +MojoPatch [debug]: md5summing... +MojoPatch: (md5sum: 8f4e4d43a51589f1ff0751c9971dd05e) +MojoPatch [debug]: md5summing... +MojoPatch: (md5sum: 8f4e4d43a51589f1ff0751c9971dd05e) +MojoPatch [debug]: ([T2-Fonts.utx]...) +MojoPatch [debug]: md5summing... +MojoPatch: (md5sum: fbc99795c144dade16bff90f90bf0098) +MojoPatch [debug]: md5summing... +MojoPatch: (md5sum: fbc99795c144dade16bff90f90bf0098) +MojoPatch [debug]: ([T2-FX.utx]...) +MojoPatch [debug]: md5summing... +MojoPatch: (md5sum: df6ecb5303181c5bc5e8592b20d990b3) +MojoPatch [debug]: md5summing... +MojoPatch: (md5sum: df6ecb5303181c5bc5e8592b20d990b3) +MojoPatch [debug]: ([T2-LIGHTS.utx]...) +MojoPatch [debug]: md5summing... +MojoPatch: (md5sum: 8abf847a37527958b1c3a97cb5fb6b2e) +MojoPatch [debug]: md5summing... +MojoPatch: (md5sum: 8abf847a37527958b1c3a97cb5fb6b2e) +MojoPatch [debug]: ([T2-LIQUIDS.utx]...) +MojoPatch [debug]: md5summing... +MojoPatch: (md5sum: 0304bf0f9ea04675d504f24d1b682b8d) +MojoPatch [debug]: md5summing... +MojoPatch: (md5sum: 0304bf0f9ea04675d504f24d1b682b8d) +MojoPatch [debug]: ([T2-METAL.utx]...) +MojoPatch [debug]: md5summing... +MojoPatch: (md5sum: 3bdb7a3bbc37823244e5985e803e9f8a) +MojoPatch [debug]: md5summing... +MojoPatch: (md5sum: 3bdb7a3bbc37823244e5985e803e9f8a) +MojoPatch [debug]: ([T2-MISC.utx]...) +MojoPatch [debug]: md5summing... +MojoPatch: (md5sum: c213d9cc51db80f46c8409b6e85db54f) +MojoPatch [debug]: md5summing... +MojoPatch: (md5sum: c213d9cc51db80f46c8409b6e85db54f) +MojoPatch [debug]: ([T2-SIGNS.utx]...) +MojoPatch [debug]: md5summing... +MojoPatch: (md5sum: 846f3a6ffd5dd28b80a70c7d2a1ba474) +MojoPatch [debug]: md5summing... +MojoPatch: (md5sum: 846f3a6ffd5dd28b80a70c7d2a1ba474) +MojoPatch [debug]: ([T2-SKINS.utx]...) +MojoPatch [debug]: md5summing... +MojoPatch: (md5sum: fe422b32582baab7edc18d314281c767) +MojoPatch [debug]: md5summing... +MojoPatch: (md5sum: fe422b32582baab7edc18d314281c767) +MojoPatch [debug]: ([T2-SKINS_vehicles.utx]...) +MojoPatch [debug]: md5summing... +MojoPatch: (md5sum: b4e8b799992aae02476b92f7424105cb) +MojoPatch [debug]: md5summing... +MojoPatch: (md5sum: b4e8b799992aae02476b92f7424105cb) +MojoPatch [debug]: ([T2-SKY.utx]...) +MojoPatch [debug]: md5summing... +MojoPatch: (md5sum: 9d64d29ecb7f3d00906112bc1cd4d2aa) +MojoPatch [debug]: md5summing... +MojoPatch: (md5sum: 9d64d29ecb7f3d00906112bc1cd4d2aa) +MojoPatch [debug]: ([T2-STONE.utx]...) +MojoPatch [debug]: md5summing... +MojoPatch: (md5sum: 0b4fec36f3dd48d6d7b76caabfca8d1a) +MojoPatch [debug]: md5summing... +MojoPatch: (md5sum: 0b4fec36f3dd48d6d7b76caabfca8d1a) +MojoPatch [debug]: ([T2-TERRAIN.utx]...) +MojoPatch [debug]: md5summing... +MojoPatch: (md5sum: 6120d113b42d53df4c2e484a871c9dbd) +MojoPatch [debug]: md5summing... +MojoPatch: (md5sum: 6120d113b42d53df4c2e484a871c9dbd) +MojoPatch [debug]: ([T2-TILE.utx]...) +MojoPatch [debug]: md5summing... +MojoPatch: (md5sum: 81e412d1ac19aea165041b55b8ef3be4) +MojoPatch [debug]: md5summing... +MojoPatch: (md5sum: 81e412d1ac19aea165041b55b8ef3be4) +MojoPatch [debug]: ([T2-UI.utx]...) +MojoPatch [debug]: md5summing... +MojoPatch: (md5sum: dd801f6391fd7e5b9e1612617609868f) +MojoPatch [debug]: md5summing... +MojoPatch: (md5sum: dd801f6391fd7e5b9e1612617609868f) +MojoPatch [debug]: ([T2-WINDOWS.utx]...) +MojoPatch [debug]: md5summing... +MojoPatch: (md5sum: 1ed184c422ac331f4244e28f08fb83d0) +MojoPatch [debug]: md5summing... +MojoPatch: (md5sum: 1ed184c422ac331f4244e28f08fb83d0) +MojoPatch [debug]: ([T2-WOOD.utx]...) +MojoPatch [debug]: md5summing... +MojoPatch: (md5sum: 04acc7697e3f76cde68b23440d639f7f) +MojoPatch [debug]: md5summing... +MojoPatch: (md5sum: 04acc7697e3f76cde68b23440d639f7f) +MojoPatch [debug]: ([T3-SKINS_vehicles.utx]...) +MojoPatch [debug]: md5summing... +MojoPatch: (md5sum: 33163b8971396fbf5f2d65c7035b0bdd) +MojoPatch [debug]: md5summing... +MojoPatch: (md5sum: 33163b8971396fbf5f2d65c7035b0bdd) +MojoPatch [debug]: ([T_UI2.utx]...) +MojoPatch [debug]: md5summing... +MojoPatch: (md5sum: 6d09d0c56f883aa5c2de50975250ed06) +MojoPatch [debug]: md5summing... +MojoPatch: (md5sum: 6d09d0c56f883aa5c2de50975250ed06) +MojoPatch [debug]: ([X-TEMP.utx]...) +MojoPatch [debug]: md5summing... +MojoPatch: (md5sum: cdadb7adc59c3e1b2084bdf87118c245) +MojoPatch [debug]: md5summing... +MojoPatch: (md5sum: cdadb7adc59c3e1b2084bdf87118c245) +MojoPatch: 26787419 bytes in the file [/Users/icculus/Desktop/default.mojopatch]. +MojoPatch [debug]: (Total running time: 254 seconds.) diff --git a/xdelta-1.1.3/.libs/libxdelta.lai b/xdelta-1.1.3/.libs/libxdelta.lai new file mode 100644 index 0000000..c7a3dcc --- /dev/null +++ b/xdelta-1.1.3/.libs/libxdelta.lai @@ -0,0 +1,28 @@ +# libxdelta.la - a libtool library file +# Generated by ltmain.sh - GNU libtool 1.3.3 (1.385.2.181 1999/07/02 15:49:11) +# +# Please DO NOT delete this file! +# It is necessary for linking the library. + +# The name that we can dlopen(3). +dlname='' + +# Names of this library. +library_names='' + +# The name of the static archive. +old_library='libxdelta.a' + +# Libraries that this one depends upon. +dependency_libs=' -L/usr/local/lib -lglib' + +# Version information for libxdelta. +current=2 +age=0 +revision=0 + +# Is this an already installed library? +installed=yes + +# Directory that this library needs to be installed in: +libdir='/usr/local/lib' diff --git a/xdelta-1.1.3/AUTHORS b/xdelta-1.1.3/AUTHORS new file mode 100644 index 0000000..562970c --- /dev/null +++ b/xdelta-1.1.3/AUTHORS @@ -0,0 +1,3 @@ +The author is Joshua MacDonald, . The Rsync +algorithm, which inspired the core delta algorithm, is due to Andrew +Tridgell and Paul Mackerras. diff --git a/xdelta-1.1.3/COPYING b/xdelta-1.1.3/COPYING new file mode 100644 index 0000000..a43ea21 --- /dev/null +++ b/xdelta-1.1.3/COPYING @@ -0,0 +1,339 @@ + GNU GENERAL PUBLIC LICENSE + Version 2, June 1991 + + Copyright (C) 1989, 1991 Free Software Foundation, Inc. + 675 Mass Ave, Cambridge, MA 02139, USA + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + Preamble + + The licenses for most software are designed to take away your +freedom to share and change it. By contrast, the GNU General Public +License is intended to guarantee your freedom to share and change free +software--to make sure the software is free for all its users. This +General Public License applies to most of the Free Software +Foundation's software and to any other program whose authors commit to +using it. (Some other Free Software Foundation software is covered by +the GNU Library General Public License instead.) You can apply it to +your programs, too. + + When we speak of free software, we are referring to freedom, not +price. Our General Public Licenses are designed to make sure that you +have the freedom to distribute copies of free software (and charge for +this service if you wish), that you receive source code or can get it +if you want it, that you can change the software or use pieces of it +in new free programs; and that you know you can do these things. + + To protect your rights, we need to make restrictions that forbid +anyone to deny you these rights or to ask you to surrender the rights. +These restrictions translate to certain responsibilities for you if you +distribute copies of the software, or if you modify it. + + For example, if you distribute copies of such a program, whether +gratis or for a fee, you must give the recipients all the rights that +you have. You must make sure that they, too, receive or can get the +source code. And you must show them these terms so they know their +rights. + + We protect your rights with two steps: (1) copyright the software, and +(2) offer you this license which gives you legal permission to copy, +distribute and/or modify the software. + + Also, for each author's protection and ours, we want to make certain +that everyone understands that there is no warranty for this free +software. If the software is modified by someone else and passed on, we +want its recipients to know that what they have is not the original, so +that any problems introduced by others will not reflect on the original +authors' reputations. + + Finally, any free program is threatened constantly by software +patents. We wish to avoid the danger that redistributors of a free +program will individually obtain patent licenses, in effect making the +program proprietary. To prevent this, we have made it clear that any +patent must be licensed for everyone's free use or not licensed at all. + + The precise terms and conditions for copying, distribution and +modification follow. + + GNU GENERAL PUBLIC LICENSE + TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION + + 0. This License applies to any program or other work which contains +a notice placed by the copyright holder saying it may be distributed +under the terms of this General Public License. The "Program", below, +refers to any such program or work, and a "work based on the Program" +means either the Program or any derivative work under copyright law: +that is to say, a work containing the Program or a portion of it, +either verbatim or with modifications and/or translated into another +language. (Hereinafter, translation is included without limitation in +the term "modification".) Each licensee is addressed as "you". + +Activities other than copying, distribution and modification are not +covered by this License; they are outside its scope. The act of +running the Program is not restricted, and the output from the Program +is covered only if its contents constitute a work based on the +Program (independent of having been made by running the Program). +Whether that is true depends on what the Program does. + + 1. You may copy and distribute verbatim copies of the Program's +source code as you receive it, in any medium, provided that you +conspicuously and appropriately publish on each copy an appropriate +copyright notice and disclaimer of warranty; keep intact all the +notices that refer to this License and to the absence of any warranty; +and give any other recipients of the Program a copy of this License +along with the Program. + +You may charge a fee for the physical act of transferring a copy, and +you may at your option offer warranty protection in exchange for a fee. + + 2. You may modify your copy or copies of the Program or any portion +of it, thus forming a work based on the Program, and copy and +distribute such modifications or work under the terms of Section 1 +above, provided that you also meet all of these conditions: + + a) You must cause the modified files to carry prominent notices + stating that you changed the files and the date of any change. + + b) You must cause any work that you distribute or publish, that in + whole or in part contains or is derived from the Program or any + part thereof, to be licensed as a whole at no charge to all third + parties under the terms of this License. + + c) If the modified program normally reads commands interactively + when run, you must cause it, when started running for such + interactive use in the most ordinary way, to print or display an + announcement including an appropriate copyright notice and a + notice that there is no warranty (or else, saying that you provide + a warranty) and that users may redistribute the program under + these conditions, and telling the user how to view a copy of this + License. (Exception: if the Program itself is interactive but + does not normally print such an announcement, your work based on + the Program is not required to print an announcement.) + +These requirements apply to the modified work as a whole. If +identifiable sections of that work are not derived from the Program, +and can be reasonably considered independent and separate works in +themselves, then this License, and its terms, do not apply to those +sections when you distribute them as separate works. But when you +distribute the same sections as part of a whole which is a work based +on the Program, the distribution of the whole must be on the terms of +this License, whose permissions for other licensees extend to the +entire whole, and thus to each and every part regardless of who wrote it. + +Thus, it is not the intent of this section to claim rights or contest +your rights to work written entirely by you; rather, the intent is to +exercise the right to control the distribution of derivative or +collective works based on the Program. + +In addition, mere aggregation of another work not based on the Program +with the Program (or with a work based on the Program) on a volume of +a storage or distribution medium does not bring the other work under +the scope of this License. + + 3. You may copy and distribute the Program (or a work based on it, +under Section 2) in object code or executable form under the terms of +Sections 1 and 2 above provided that you also do one of the following: + + a) Accompany it with the complete corresponding machine-readable + source code, which must be distributed under the terms of Sections + 1 and 2 above on a medium customarily used for software interchange; or, + + b) Accompany it with a written offer, valid for at least three + years, to give any third party, for a charge no more than your + cost of physically performing source distribution, a complete + machine-readable copy of the corresponding source code, to be + distributed under the terms of Sections 1 and 2 above on a medium + customarily used for software interchange; or, + + c) Accompany it with the information you received as to the offer + to distribute corresponding source code. (This alternative is + allowed only for noncommercial distribution and only if you + received the program in object code or executable form with such + an offer, in accord with Subsection b above.) + +The source code for a work means the preferred form of the work for +making modifications to it. For an executable work, complete source +code means all the source code for all modules it contains, plus any +associated interface definition files, plus the scripts used to +control compilation and installation of the executable. However, as a +special exception, the source code distributed need not include +anything that is normally distributed (in either source or binary +form) with the major components (compiler, kernel, and so on) of the +operating system on which the executable runs, unless that component +itself accompanies the executable. + +If distribution of executable or object code is made by offering +access to copy from a designated place, then offering equivalent +access to copy the source code from the same place counts as +distribution of the source code, even though third parties are not +compelled to copy the source along with the object code. + + 4. You may not copy, modify, sublicense, or distribute the Program +except as expressly provided under this License. Any attempt +otherwise to copy, modify, sublicense or distribute the Program is +void, and will automatically terminate your rights under this License. +However, parties who have received copies, or rights, from you under +this License will not have their licenses terminated so long as such +parties remain in full compliance. + + 5. You are not required to accept this License, since you have not +signed it. However, nothing else grants you permission to modify or +distribute the Program or its derivative works. These actions are +prohibited by law if you do not accept this License. Therefore, by +modifying or distributing the Program (or any work based on the +Program), you indicate your acceptance of this License to do so, and +all its terms and conditions for copying, distributing or modifying +the Program or works based on it. + + 6. Each time you redistribute the Program (or any work based on the +Program), the recipient automatically receives a license from the +original licensor to copy, distribute or modify the Program subject to +these terms and conditions. You may not impose any further +restrictions on the recipients' exercise of the rights granted herein. +You are not responsible for enforcing compliance by third parties to +this License. + + 7. If, as a consequence of a court judgment or allegation of patent +infringement or for any other reason (not limited to patent issues), +conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot +distribute so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you +may not distribute the Program at all. For example, if a patent +license would not permit royalty-free redistribution of the Program by +all those who receive copies directly or indirectly through you, then +the only way you could satisfy both it and this License would be to +refrain entirely from distribution of the Program. + +If any portion of this section is held invalid or unenforceable under +any particular circumstance, the balance of the section is intended to +apply and the section as a whole is intended to apply in other +circumstances. + +It is not the purpose of this section to induce you to infringe any +patents or other property right claims or to contest validity of any +such claims; this section has the sole purpose of protecting the +integrity of the free software distribution system, which is +implemented by public license practices. Many people have made +generous contributions to the wide range of software distributed +through that system in reliance on consistent application of that +system; it is up to the author/donor to decide if he or she is willing +to distribute software through any other system and a licensee cannot +impose that choice. + +This section is intended to make thoroughly clear what is believed to +be a consequence of the rest of this License. + + 8. If the distribution and/or use of the Program is restricted in +certain countries either by patents or by copyrighted interfaces, the +original copyright holder who places the Program under this License +may add an explicit geographical distribution limitation excluding +those countries, so that distribution is permitted only in or among +countries not thus excluded. In such case, this License incorporates +the limitation as if written in the body of this License. + + 9. The Free Software Foundation may publish revised and/or new versions +of the General Public License from time to time. Such new versions will +be similar in spirit to the present version, but may differ in detail to +address new problems or concerns. + +Each version is given a distinguishing version number. If the Program +specifies a version number of this License which applies to it and "any +later version", you have the option of following the terms and conditions +either of that version or of any later version published by the Free +Software Foundation. If the Program does not specify a version number of +this License, you may choose any version ever published by the Free Software +Foundation. + + 10. If you wish to incorporate parts of the Program into other free +programs whose distribution conditions are different, write to the author +to ask for permission. For software which is copyrighted by the Free +Software Foundation, write to the Free Software Foundation; we sometimes +make exceptions for this. Our decision will be guided by the two goals +of preserving the free status of all derivatives of our free software and +of promoting the sharing and reuse of software generally. + + NO WARRANTY + + 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY +FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN +OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES +PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED +OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF +MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS +TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE +PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, +REPAIR OR CORRECTION. + + 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING +WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR +REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, +INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING +OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED +TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY +YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER +PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE +POSSIBILITY OF SUCH DAMAGES. + + END OF TERMS AND CONDITIONS + + Appendix: How to Apply These Terms to Your New Programs + + If you develop a new program, and you want it to be of the greatest +possible use to the public, the best way to achieve this is to make it +free software which everyone can redistribute and change under these terms. + + To do so, attach the following notices to the program. It is safest +to attach them to the start of each source file to most effectively +convey the exclusion of warranty; and each file should have at least +the "copyright" line and a pointer to where the full notice is found. + + + Copyright (C) 19yy + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + +Also add information on how to contact you by electronic and paper mail. + +If the program is interactive, make it output a short notice like this +when it starts in an interactive mode: + + Gnomovision version 69, Copyright (C) 19yy name of author + Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'. + This is free software, and you are welcome to redistribute it + under certain conditions; type `show c' for details. + +The hypothetical commands `show w' and `show c' should show the appropriate +parts of the General Public License. Of course, the commands you use may +be called something other than `show w' and `show c'; they could even be +mouse-clicks or menu items--whatever suits your program. + +You should also get your employer (if you work as a programmer) or your +school, if any, to sign a "copyright disclaimer" for the program, if +necessary. Here is a sample; alter the names: + + Yoyodyne, Inc., hereby disclaims all copyright interest in the program + `Gnomovision' (which makes passes at compilers) written by James Hacker. + + , 1 April 1989 + Ty Coon, President of Vice + +This General Public License does not permit incorporating your program into +proprietary programs. If your program is a subroutine library, you may +consider it more useful to permit linking proprietary applications with the +library. If this is what you want to do, use the GNU Library General +Public License instead of this License. diff --git a/xdelta-1.1.3/ChangeLog b/xdelta-1.1.3/ChangeLog new file mode 100644 index 0000000..e69de29 diff --git a/xdelta-1.1.3/INSTALL b/xdelta-1.1.3/INSTALL new file mode 100644 index 0000000..6319012 --- /dev/null +++ b/xdelta-1.1.3/INSTALL @@ -0,0 +1,217 @@ +-*- Text -*- + +XDelta depends on + + glib 1.2.8 or later + zlib 1.1.3 or later + +You can get glib from + + ftp://ftp.gtk.org/pub/gtk/v1.2 + +You can get zlib from + + ftp://ftp.cdrom.com/pub/infozip/zlib + +To install, make sure these packages are installed and your compiler +and linker either locates zlib by default or that the CFLAGS +environment variable contains an appropriate include directive and the +LDFLAGS environment variable contains a suitable linker directive. + +Then run + + ./configure + +Then run + + make + +Then run + + make install + +Below follows the standard GNU INSTALL file, which contains general +troubleshooting tips. + +Basic Installation +================== + + These are generic installation instructions. + + The `configure' shell script attempts to guess correct values for +various system-dependent variables used during compilation. It uses +those values to create a `Makefile' in each directory of the package. +It may also create one or more `.h' files containing system-dependent +definitions. Finally, it creates a shell script `config.status' that +you can run in the future to recreate the current configuration, a file +`config.cache' that saves the results of its tests to speed up +reconfiguring, and a file `config.log' containing compiler output +(useful mainly for debugging `configure'). + + If you need to do unusual things to compile the package, please try +to figure out how `configure' could check whether to do them, and mail +diffs or instructions to the address given in the `README' so they can +be considered for the next release. If at some point `config.cache' +contains results you don't want to keep, you may remove or edit it. + + The file `configure.in' is used to create `configure' by a program +called `autoconf'. You only need `configure.in' if you want to change +it or regenerate `configure' using a newer version of `autoconf'. + +The simplest way to compile this package is: + + 1. `cd' to the directory containing the package's source code and type + `./configure' to configure the package for your system. If you're + using `csh' on an old version of System V, you might need to type + `sh ./configure' instead to prevent `csh' from trying to execute + `configure' itself. + + Running `configure' takes awhile. While running, it prints some + messages telling which features it is checking for. + + 2. Type `make' to compile the package. + + 3. Optionally, type `make check' to run any self-tests that come with + the package. + + 4. Type `make install' to install the programs and any data files and + documentation. + + 5. You can remove the program binaries and object files from the + source code directory by typing `make clean'. To also remove the + files that `configure' created (so you can compile the package for + a different kind of computer), type `make distclean'. There is + also a `make maintainer-clean' target, but that is intended mainly + for the package's developers. If you use it, you may have to get + all sorts of other programs in order to regenerate files that came + with the distribution. + +Compilers and Options +===================== + + Some systems require unusual options for compilation or linking that +the `configure' script does not know about. You can give `configure' +initial values for variables by setting them in the environment. Using +a Bourne-compatible shell, you can do that on the command line like +this: + CC=c89 CFLAGS=-O2 LIBS=-lposix ./configure + +Or on systems that have the `env' program, you can do it like this: + env CPPFLAGS=-I/usr/local/include LDFLAGS=-s ./configure + +Compiling For Multiple Architectures +==================================== + + You can compile the package for more than one kind of computer at the +same time, by placing the object files for each architecture in their +own directory. To do this, you must use a version of `make' that +supports the `VPATH' variable, such as GNU `make'. `cd' to the +directory where you want the object files and executables to go and run +the `configure' script. `configure' automatically checks for the +source code in the directory that `configure' is in and in `..'. + + If you have to use a `make' that does not supports the `VPATH' +variable, you have to compile the package for one architecture at a time +in the source code directory. After you have installed the package for +one architecture, use `make distclean' before reconfiguring for another +architecture. + +Installation Names +================== + + By default, `make install' will install the package's files in +`/usr/local/bin', `/usr/local/man', etc. You can specify an +installation prefix other than `/usr/local' by giving `configure' the +option `--prefix=PATH'. + + You can specify separate installation prefixes for +architecture-specific files and architecture-independent files. If you +give `configure' the option `--exec-prefix=PATH', the package will use +PATH as the prefix for installing programs and libraries. +Documentation and other data files will still use the regular prefix. + + In addition, if you use an unusual directory layout you can give +options like `--bindir=PATH' to specify different values for particular +kinds of files. Run `configure --help' for a list of the directories +you can set and what kinds of files go in them. + + If the package supports it, you can cause programs to be installed +with an extra prefix or suffix on their names by giving `configure' the +option `--program-prefix=PREFIX' or `--program-suffix=SUFFIX'. + +Optional Features +================= + + Some packages pay attention to `--enable-FEATURE' options to +`configure', where FEATURE indicates an optional part of the package. +They may also pay attention to `--with-PACKAGE' options, where PACKAGE +is something like `gnu-as' or `x' (for the X Window System). The +`README' should mention any `--enable-' and `--with-' options that the +package recognizes. + + For packages that use the X Window System, `configure' can usually +find the X include and library files automatically, but if it doesn't, +you can use the `configure' options `--x-includes=DIR' and +`--x-libraries=DIR' to specify their locations. + +Specifying the System Type +========================== + + There may be some features `configure' can not figure out +automatically, but needs to determine by the type of host the package +will run on. Usually `configure' can figure that out, but if it prints +a message saying it can not guess the host type, give it the +`--host=TYPE' option. TYPE can either be a short name for the system +type, such as `sun4', or a canonical name with three fields: + CPU-COMPANY-SYSTEM + +See the file `config.sub' for the possible values of each field. If +`config.sub' isn't included in this package, then this package doesn't +need to know the host type. + + If you are building compiler tools for cross-compiling, you can also +use the `--target=TYPE' option to select the type of system they will +produce code for and the `--build=TYPE' option to select the type of +system on which you are compiling the package. + +Sharing Defaults +================ + + If you want to set default values for `configure' scripts to share, +you can create a site shell script called `config.site' that gives +default values for variables like `CC', `cache_file', and `prefix'. +`configure' looks for `PREFIX/share/config.site' if it exists, then +`PREFIX/etc/config.site' if it exists. Or, you can set the +`CONFIG_SITE' environment variable to the location of the site script. +A warning: not all `configure' scripts look for a site script. + +Operation Controls +================== + + `configure' recognizes the following options to control how it +operates. + +`--cache-file=FILE' + Use and save the results of the tests in FILE instead of + `./config.cache'. Set FILE to `/dev/null' to disable caching, for + debugging `configure'. + +`--help' + Print a summary of the options to `configure', and exit. + +`--quiet' +`--silent' +`-q' + Do not print messages saying which checks are being made. To + suppress all normal output, redirect it to `/dev/null' (any error + messages will still be shown). + +`--srcdir=DIR' + Look for the package's source code in directory DIR. Usually + `configure' can determine that directory automatically. + +`--version' + Print the version of Autoconf used to generate the `configure' + script, and exit. + +`configure' also accepts some other, not widely useful, options. diff --git a/xdelta-1.1.3/Makefile b/xdelta-1.1.3/Makefile new file mode 100644 index 0000000..d3d0717 --- /dev/null +++ b/xdelta-1.1.3/Makefile @@ -0,0 +1,629 @@ +# Generated automatically from Makefile.in by configure. +# Makefile.in generated automatically by automake 1.4 from Makefile.am + +# Copyright (C) 1994, 1995-8, 1999 Free Software Foundation, Inc. +# This Makefile.in is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY, to the extent permitted by law; without +# even the implied warranty of MERCHANTABILITY or FITNESS FOR A +# PARTICULAR PURPOSE. + + +SHELL = /bin/sh + +srcdir = . +top_srcdir = . +prefix = /usr/local +exec_prefix = ${prefix} + +bindir = ${exec_prefix}/bin +sbindir = ${exec_prefix}/sbin +libexecdir = ${exec_prefix}/libexec +datadir = ${prefix}/share +sysconfdir = ${prefix}/etc +sharedstatedir = ${prefix}/com +localstatedir = ${prefix}/var +libdir = ${exec_prefix}/lib +infodir = ${prefix}/info +mandir = ${prefix}/man +includedir = ${prefix}/include +oldincludedir = /usr/include + +DESTDIR = + +pkgdatadir = $(datadir)/xdelta +pkglibdir = $(libdir)/xdelta +pkgincludedir = $(includedir)/xdelta + +top_builddir = . + +ACLOCAL = aclocal +AUTOCONF = autoconf +AUTOMAKE = automake +AUTOHEADER = autoheader + +INSTALL = /usr/bin/install -c +INSTALL_PROGRAM = ${INSTALL} $(AM_INSTALL_PROGRAM_FLAGS) +INSTALL_DATA = ${INSTALL} -m 644 +INSTALL_SCRIPT = ${INSTALL_PROGRAM} +transform = s,x,x, + +NORMAL_INSTALL = : +PRE_INSTALL = : +POST_INSTALL = : +NORMAL_UNINSTALL = : +PRE_UNINSTALL = : +POST_UNINSTALL = : +host_alias = powerpc-apple +host_triplet = powerpc-apple-macos +AS = @AS@ +CC = gcc +CPP = gcc -E +DLLTOOL = @DLLTOOL@ +EMACS = /usr/bin/emacs +GLIB_CFLAGS = -I/usr/local/include/glib-1.2 -I/usr/local/lib/glib/include +GLIB_CONFIG = /usr/local/bin/glib-config +GLIB_LIBS = -L/usr/local/lib -lglib +LD = /usr/bin/ld +LIBTOOL = $(SHELL) $(top_builddir)/libtool +LN_S = ln -s +MAINT = # +MAKEINFO = makeinfo +NM = /usr/bin/nm -p +OBJDUMP = @OBJDUMP@ +PACKAGE = xdelta +RANLIB = ranlib +VERSION = 1.1.3 +top_srcdir_absolute = /Users/icculus/projects/mojopatch/xdelta-1.1.3 + +INCLUDES = -I$(top_srcdir)/libedsio $(GLIB_CFLAGS) + +bin_PROGRAMS = xdelta +bin_SCRIPTS = xdelta-config + +xdelta_SOURCES = xdmain.c getopt.c getopt1.c + +xdelta_LDADD = libxdelta.la $(top_srcdir)/libedsio/libedsio.la $(GLIB_LIBS) -lz + + +include_HEADERS = xdelta.h xd_edsio.h +noinst_HEADERS = xdeltapriv.h getopt.h + +lib_LTLIBRARIES = libxdelta.la + +libxdelta_la_SOURCES = xdelta.c xdapply.c $(SER_SOURCES) +libxdelta_la_LIBADD = $(GLIB_LIBS) + +EXTRA_DIST = xd.ser $(SER_OUT) xdelta.magic xdelta.prj xdelta.m4 autogen.sh xdelta.dsp xdelta.dsw stamp-ser xdrsync.c + + +SUBDIRS = libedsio . test doc djgpp + +m4datadir = $(datadir)/aclocal +m4data_DATA = xdelta.m4 + +libxdelta_la_LDFLAGS = -version-info 2:0:0 + +SER_OUT = xd_edsio.h xd_edsio.c + +SER_SOURCES = xd_edsio.c +BUILT_SOURCES = $(SER_SOURCES) +ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 +mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs +CONFIG_HEADER = config.h +CONFIG_CLEAN_FILES = xdelta-config +LTLIBRARIES = $(lib_LTLIBRARIES) + + +DEFS = -DHAVE_CONFIG_H -I. -I$(srcdir) -I. +CPPFLAGS = +LDFLAGS = +LIBS = +libxdelta_la_DEPENDENCIES = +libxdelta_la_OBJECTS = xdelta.lo xdapply.lo xd_edsio.lo +PROGRAMS = $(bin_PROGRAMS) + +xdelta_OBJECTS = xdmain.o getopt.o getopt1.o +xdelta_DEPENDENCIES = libxdelta.la $(top_srcdir)/libedsio/libedsio.la +xdelta_LDFLAGS = +SCRIPTS = $(bin_SCRIPTS) + +CFLAGS = -Wall -Os +COMPILE = $(CC) $(DEFS) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) +LTCOMPILE = $(LIBTOOL) --mode=compile $(CC) $(DEFS) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) +CCLD = $(CC) +LINK = $(LIBTOOL) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(LDFLAGS) -o $@ +DATA = $(m4data_DATA) + +HEADERS = $(include_HEADERS) $(noinst_HEADERS) + +DIST_COMMON = README ./stamp-h.in AUTHORS COPYING ChangeLog INSTALL \ +Makefile.am Makefile.in NEWS aclocal.m4 config.guess config.h.in \ +config.sub configure configure.in install-sh ltconfig ltmain.sh missing \ +mkinstalldirs xdelta-config.in + + +DISTFILES = $(DIST_COMMON) $(SOURCES) $(HEADERS) $(TEXINFOS) $(EXTRA_DIST) + +TAR = tar +GZIP_ENV = --best +SOURCES = $(libxdelta_la_SOURCES) $(xdelta_SOURCES) +OBJECTS = $(libxdelta_la_OBJECTS) $(xdelta_OBJECTS) + +all: all-redirect +.SUFFIXES: +.SUFFIXES: .S .c .lo .o .s +$(srcdir)/Makefile.in: # Makefile.am $(top_srcdir)/configure.in $(ACLOCAL_M4) + cd $(top_srcdir) && $(AUTOMAKE) --gnu --include-deps Makefile + +Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status + cd $(top_builddir) \ + && CONFIG_FILES=$@ CONFIG_HEADERS= $(SHELL) ./config.status + +$(ACLOCAL_M4): # configure.in + cd $(srcdir) && $(ACLOCAL) + +config.status: $(srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) + $(SHELL) ./config.status --recheck +$(srcdir)/configure: #$(srcdir)/configure.in $(ACLOCAL_M4) $(CONFIGURE_DEPENDENCIES) + cd $(srcdir) && $(AUTOCONF) + +config.h: stamp-h + @if test ! -f $@; then \ + rm -f stamp-h; \ + $(MAKE) stamp-h; \ + else :; fi +stamp-h: $(srcdir)/config.h.in $(top_builddir)/config.status + cd $(top_builddir) \ + && CONFIG_FILES= CONFIG_HEADERS=config.h \ + $(SHELL) ./config.status + @echo timestamp > stamp-h 2> /dev/null +$(srcdir)/config.h.in: #$(srcdir)/stamp-h.in + @if test ! -f $@; then \ + rm -f $(srcdir)/stamp-h.in; \ + $(MAKE) $(srcdir)/stamp-h.in; \ + else :; fi +$(srcdir)/stamp-h.in: $(top_srcdir)/configure.in $(ACLOCAL_M4) + cd $(top_srcdir) && $(AUTOHEADER) + @echo timestamp > $(srcdir)/stamp-h.in 2> /dev/null + +mostlyclean-hdr: + +clean-hdr: + +distclean-hdr: + -rm -f config.h + +maintainer-clean-hdr: +xdelta-config: $(top_builddir)/config.status xdelta-config.in + cd $(top_builddir) && CONFIG_FILES=$@ CONFIG_HEADERS= $(SHELL) ./config.status + +mostlyclean-libLTLIBRARIES: + +clean-libLTLIBRARIES: + -test -z "$(lib_LTLIBRARIES)" || rm -f $(lib_LTLIBRARIES) + +distclean-libLTLIBRARIES: + +maintainer-clean-libLTLIBRARIES: + +install-libLTLIBRARIES: $(lib_LTLIBRARIES) + @$(NORMAL_INSTALL) + $(mkinstalldirs) $(DESTDIR)$(libdir) + @list='$(lib_LTLIBRARIES)'; for p in $$list; do \ + if test -f $$p; then \ + echo "$(LIBTOOL) --mode=install $(INSTALL) $$p $(DESTDIR)$(libdir)/$$p"; \ + $(LIBTOOL) --mode=install $(INSTALL) $$p $(DESTDIR)$(libdir)/$$p; \ + else :; fi; \ + done + +uninstall-libLTLIBRARIES: + @$(NORMAL_UNINSTALL) + list='$(lib_LTLIBRARIES)'; for p in $$list; do \ + $(LIBTOOL) --mode=uninstall rm -f $(DESTDIR)$(libdir)/$$p; \ + done + +.c.o: + $(COMPILE) -c $< + +.s.o: + $(COMPILE) -c $< + +.S.o: + $(COMPILE) -c $< + +mostlyclean-compile: + -rm -f *.o core *.core + +clean-compile: + +distclean-compile: + -rm -f *.tab.c + +maintainer-clean-compile: + +.c.lo: + $(LIBTOOL) --mode=compile $(COMPILE) -c $< + +.s.lo: + $(LIBTOOL) --mode=compile $(COMPILE) -c $< + +.S.lo: + $(LIBTOOL) --mode=compile $(COMPILE) -c $< + +mostlyclean-libtool: + -rm -f *.lo + +clean-libtool: + -rm -rf .libs _libs + +distclean-libtool: + +maintainer-clean-libtool: + +libxdelta.la: $(libxdelta_la_OBJECTS) $(libxdelta_la_DEPENDENCIES) + $(LINK) -rpath $(libdir) $(libxdelta_la_LDFLAGS) $(libxdelta_la_OBJECTS) $(libxdelta_la_LIBADD) $(LIBS) + +mostlyclean-binPROGRAMS: + +clean-binPROGRAMS: + -test -z "$(bin_PROGRAMS)" || rm -f $(bin_PROGRAMS) + +distclean-binPROGRAMS: + +maintainer-clean-binPROGRAMS: + +install-binPROGRAMS: $(bin_PROGRAMS) + @$(NORMAL_INSTALL) + $(mkinstalldirs) $(DESTDIR)$(bindir) + @list='$(bin_PROGRAMS)'; for p in $$list; do \ + if test -f $$p; then \ + echo " $(LIBTOOL) --mode=install $(INSTALL_PROGRAM) $$p $(DESTDIR)$(bindir)/`echo $$p|sed 's/$(EXEEXT)$$//'|sed '$(transform)'|sed 's/$$/$(EXEEXT)/'`"; \ + $(LIBTOOL) --mode=install $(INSTALL_PROGRAM) $$p $(DESTDIR)$(bindir)/`echo $$p|sed 's/$(EXEEXT)$$//'|sed '$(transform)'|sed 's/$$/$(EXEEXT)/'`; \ + else :; fi; \ + done + +uninstall-binPROGRAMS: + @$(NORMAL_UNINSTALL) + list='$(bin_PROGRAMS)'; for p in $$list; do \ + rm -f $(DESTDIR)$(bindir)/`echo $$p|sed 's/$(EXEEXT)$$//'|sed '$(transform)'|sed 's/$$/$(EXEEXT)/'`; \ + done + +xdelta: $(xdelta_OBJECTS) $(xdelta_DEPENDENCIES) + @rm -f xdelta + $(LINK) $(xdelta_LDFLAGS) $(xdelta_OBJECTS) $(xdelta_LDADD) $(LIBS) + +install-binSCRIPTS: $(bin_SCRIPTS) + @$(NORMAL_INSTALL) + $(mkinstalldirs) $(DESTDIR)$(bindir) + @list='$(bin_SCRIPTS)'; for p in $$list; do \ + if test -f $$p; then \ + echo " $(INSTALL_SCRIPT) $$p $(DESTDIR)$(bindir)/`echo $$p|sed '$(transform)'`"; \ + $(INSTALL_SCRIPT) $$p $(DESTDIR)$(bindir)/`echo $$p|sed '$(transform)'`; \ + else if test -f $(srcdir)/$$p; then \ + echo " $(INSTALL_SCRIPT) $(srcdir)/$$p $(DESTDIR)$(bindir)/`echo $$p|sed '$(transform)'`"; \ + $(INSTALL_SCRIPT) $(srcdir)/$$p $(DESTDIR)$(bindir)/`echo $$p|sed '$(transform)'`; \ + else :; fi; fi; \ + done + +uninstall-binSCRIPTS: + @$(NORMAL_UNINSTALL) + list='$(bin_SCRIPTS)'; for p in $$list; do \ + rm -f $(DESTDIR)$(bindir)/`echo $$p|sed '$(transform)'`; \ + done + +install-m4dataDATA: $(m4data_DATA) + @$(NORMAL_INSTALL) + $(mkinstalldirs) $(DESTDIR)$(m4datadir) + @list='$(m4data_DATA)'; for p in $$list; do \ + if test -f $(srcdir)/$$p; then \ + echo " $(INSTALL_DATA) $(srcdir)/$$p $(DESTDIR)$(m4datadir)/$$p"; \ + $(INSTALL_DATA) $(srcdir)/$$p $(DESTDIR)$(m4datadir)/$$p; \ + else if test -f $$p; then \ + echo " $(INSTALL_DATA) $$p $(DESTDIR)$(m4datadir)/$$p"; \ + $(INSTALL_DATA) $$p $(DESTDIR)$(m4datadir)/$$p; \ + fi; fi; \ + done + +uninstall-m4dataDATA: + @$(NORMAL_UNINSTALL) + list='$(m4data_DATA)'; for p in $$list; do \ + rm -f $(DESTDIR)$(m4datadir)/$$p; \ + done + +install-includeHEADERS: $(include_HEADERS) + @$(NORMAL_INSTALL) + $(mkinstalldirs) $(DESTDIR)$(includedir) + @list='$(include_HEADERS)'; for p in $$list; do \ + if test -f "$$p"; then d= ; else d="$(srcdir)/"; fi; \ + echo " $(INSTALL_DATA) $$d$$p $(DESTDIR)$(includedir)/$$p"; \ + $(INSTALL_DATA) $$d$$p $(DESTDIR)$(includedir)/$$p; \ + done + +uninstall-includeHEADERS: + @$(NORMAL_UNINSTALL) + list='$(include_HEADERS)'; for p in $$list; do \ + rm -f $(DESTDIR)$(includedir)/$$p; \ + done + +# This directory's subdirectories are mostly independent; you can cd +# into them and run `make' without going through this Makefile. +# To change the values of `make' variables: instead of editing Makefiles, +# (1) if the variable is set in `config.status', edit `config.status' +# (which will cause the Makefiles to be regenerated when you run `make'); +# (2) otherwise, pass the desired values on the `make' command line. + + + +all-recursive install-data-recursive install-exec-recursive \ +installdirs-recursive install-recursive uninstall-recursive \ +check-recursive installcheck-recursive info-recursive dvi-recursive: + @set fnord $(MAKEFLAGS); amf=$$2; \ + dot_seen=no; \ + target=`echo $@ | sed s/-recursive//`; \ + list='$(SUBDIRS)'; for subdir in $$list; do \ + echo "Making $$target in $$subdir"; \ + if test "$$subdir" = "."; then \ + dot_seen=yes; \ + local_target="$$target-am"; \ + else \ + local_target="$$target"; \ + fi; \ + (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \ + || case "$$amf" in *=*) exit 1;; *k*) fail=yes;; *) exit 1;; esac; \ + done; \ + if test "$$dot_seen" = "no"; then \ + $(MAKE) $(AM_MAKEFLAGS) "$$target-am" || exit 1; \ + fi; test -z "$$fail" + +mostlyclean-recursive clean-recursive distclean-recursive \ +maintainer-clean-recursive: + @set fnord $(MAKEFLAGS); amf=$$2; \ + dot_seen=no; \ + rev=''; list='$(SUBDIRS)'; for subdir in $$list; do \ + rev="$$subdir $$rev"; \ + test "$$subdir" = "." && dot_seen=yes; \ + done; \ + test "$$dot_seen" = "no" && rev=". $$rev"; \ + target=`echo $@ | sed s/-recursive//`; \ + for subdir in $$rev; do \ + echo "Making $$target in $$subdir"; \ + if test "$$subdir" = "."; then \ + local_target="$$target-am"; \ + else \ + local_target="$$target"; \ + fi; \ + (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \ + || case "$$amf" in *=*) exit 1;; *k*) fail=yes;; *) exit 1;; esac; \ + done && test -z "$$fail" +tags-recursive: + list='$(SUBDIRS)'; for subdir in $$list; do \ + test "$$subdir" = . || (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) tags); \ + done + +tags: TAGS + +ID: $(HEADERS) $(SOURCES) $(LISP) + list='$(SOURCES) $(HEADERS)'; \ + unique=`for i in $$list; do echo $$i; done | \ + awk ' { files[$$0] = 1; } \ + END { for (i in files) print i; }'`; \ + here=`pwd` && cd $(srcdir) \ + && mkid -f$$here/ID $$unique $(LISP) + +TAGS: tags-recursive $(HEADERS) $(SOURCES) config.h.in $(TAGS_DEPENDENCIES) $(LISP) + tags=; \ + here=`pwd`; \ + list='$(SUBDIRS)'; for subdir in $$list; do \ + if test "$$subdir" = .; then :; else \ + test -f $$subdir/TAGS && tags="$$tags -i $$here/$$subdir/TAGS"; \ + fi; \ + done; \ + list='$(SOURCES) $(HEADERS)'; \ + unique=`for i in $$list; do echo $$i; done | \ + awk ' { files[$$0] = 1; } \ + END { for (i in files) print i; }'`; \ + test -z "$(ETAGS_ARGS)config.h.in$$unique$(LISP)$$tags" \ + || (cd $(srcdir) && etags $(ETAGS_ARGS) $$tags config.h.in $$unique $(LISP) -o $$here/TAGS) + +mostlyclean-tags: + +clean-tags: + +distclean-tags: + -rm -f TAGS ID + +maintainer-clean-tags: + +distdir = $(PACKAGE)-$(VERSION) +top_distdir = $(distdir) + +# This target untars the dist file and tries a VPATH configuration. Then +# it guarantees that the distribution is self-contained by making another +# tarfile. +distcheck: dist + -rm -rf $(distdir) + GZIP=$(GZIP_ENV) $(TAR) zxf $(distdir).tar.gz + mkdir $(distdir)/=build + mkdir $(distdir)/=inst + dc_install_base=`cd $(distdir)/=inst && pwd`; \ + cd $(distdir)/=build \ + && ../configure --srcdir=.. --prefix=$$dc_install_base \ + && $(MAKE) $(AM_MAKEFLAGS) \ + && $(MAKE) $(AM_MAKEFLAGS) dvi \ + && $(MAKE) $(AM_MAKEFLAGS) check \ + && $(MAKE) $(AM_MAKEFLAGS) install \ + && $(MAKE) $(AM_MAKEFLAGS) installcheck \ + && $(MAKE) $(AM_MAKEFLAGS) dist + -rm -rf $(distdir) + @banner="$(distdir).tar.gz is ready for distribution"; \ + dashes=`echo "$$banner" | sed s/./=/g`; \ + echo "$$dashes"; \ + echo "$$banner"; \ + echo "$$dashes" +dist: distdir + -chmod -R a+r $(distdir) + GZIP=$(GZIP_ENV) $(TAR) chozf $(distdir).tar.gz $(distdir) + -rm -rf $(distdir) +dist-all: distdir + -chmod -R a+r $(distdir) + GZIP=$(GZIP_ENV) $(TAR) chozf $(distdir).tar.gz $(distdir) + -rm -rf $(distdir) +distdir: $(DISTFILES) + -rm -rf $(distdir) + mkdir $(distdir) + -chmod 777 $(distdir) + @for file in $(DISTFILES); do \ + d=$(srcdir); \ + if test -d $$d/$$file; then \ + cp -pr $$d/$$file $(distdir)/$$file; \ + else \ + test -f $(distdir)/$$file \ + || ln $$d/$$file $(distdir)/$$file 2> /dev/null \ + || cp -p $$d/$$file $(distdir)/$$file || :; \ + fi; \ + done + for subdir in $(SUBDIRS); do \ + if test "$$subdir" = .; then :; else \ + test -d $(distdir)/$$subdir \ + || mkdir $(distdir)/$$subdir \ + || exit 1; \ + chmod 777 $(distdir)/$$subdir; \ + (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) top_distdir=../$(distdir) distdir=../$(distdir)/$$subdir distdir) \ + || exit 1; \ + fi; \ + done +getopt.o: getopt.c config.h +getopt1.o: getopt1.c config.h getopt.h +xd_edsio.lo xd_edsio.o : xd_edsio.c xdelta.h xd_edsio.h libedsio/edsio.h \ + config.h libedsio/edsio_edsio.h +xdapply.lo xdapply.o : xdapply.c xdelta.h xd_edsio.h libedsio/edsio.h \ + config.h libedsio/edsio_edsio.h xdeltapriv.h +xdelta.lo xdelta.o : xdelta.c xdelta.h xd_edsio.h libedsio/edsio.h \ + config.h libedsio/edsio_edsio.h xdeltapriv.h +xdmain.o: xdmain.c getopt.h xdelta.h xd_edsio.h libedsio/edsio.h \ + config.h libedsio/edsio_edsio.h + +info-am: +info: info-recursive +dvi-am: +dvi: dvi-recursive +check-am: all-am +check: check-recursive +installcheck-am: +installcheck: installcheck-recursive +all-recursive-am: config.h + $(MAKE) $(AM_MAKEFLAGS) all-recursive + +install-exec-am: install-libLTLIBRARIES install-binPROGRAMS \ + install-binSCRIPTS +install-exec: install-exec-recursive + +install-data-am: install-m4dataDATA install-includeHEADERS +install-data: install-data-recursive + +install-am: all-am + @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am +install: install-recursive +uninstall-am: uninstall-libLTLIBRARIES uninstall-binPROGRAMS \ + uninstall-binSCRIPTS uninstall-m4dataDATA \ + uninstall-includeHEADERS +uninstall: uninstall-recursive +all-am: Makefile $(LTLIBRARIES) $(PROGRAMS) $(SCRIPTS) $(DATA) \ + $(HEADERS) config.h +all-redirect: all-recursive-am +install-strip: + $(MAKE) $(AM_MAKEFLAGS) AM_INSTALL_PROGRAM_FLAGS=-s install +installdirs: installdirs-recursive +installdirs-am: + $(mkinstalldirs) $(DESTDIR)$(libdir) $(DESTDIR)$(bindir) \ + $(DESTDIR)$(bindir) $(DESTDIR)$(m4datadir) \ + $(DESTDIR)$(includedir) + + +mostlyclean-generic: + +clean-generic: + +distclean-generic: + -rm -f Makefile $(CONFIG_CLEAN_FILES) + -rm -f config.cache config.log stamp-h stamp-h[0-9]* + +maintainer-clean-generic: + -test -z "$(BUILT_SOURCES)" || rm -f $(BUILT_SOURCES) +mostlyclean-am: mostlyclean-hdr mostlyclean-libLTLIBRARIES \ + mostlyclean-compile mostlyclean-libtool \ + mostlyclean-binPROGRAMS mostlyclean-tags \ + mostlyclean-generic + +mostlyclean: mostlyclean-recursive + +clean-am: clean-hdr clean-libLTLIBRARIES clean-compile clean-libtool \ + clean-binPROGRAMS clean-tags clean-generic \ + mostlyclean-am + +clean: clean-recursive + +distclean-am: distclean-hdr distclean-libLTLIBRARIES distclean-compile \ + distclean-libtool distclean-binPROGRAMS distclean-tags \ + distclean-generic clean-am + -rm -f libtool + +distclean: distclean-recursive + -rm -f config.status + +maintainer-clean-am: maintainer-clean-hdr \ + maintainer-clean-libLTLIBRARIES \ + maintainer-clean-compile maintainer-clean-libtool \ + maintainer-clean-binPROGRAMS maintainer-clean-tags \ + maintainer-clean-generic distclean-am + @echo "This command is intended for maintainers to use;" + @echo "it deletes files that may require special tools to rebuild." + +maintainer-clean: maintainer-clean-recursive + -rm -f config.status + +.PHONY: mostlyclean-hdr distclean-hdr clean-hdr maintainer-clean-hdr \ +mostlyclean-libLTLIBRARIES distclean-libLTLIBRARIES \ +clean-libLTLIBRARIES maintainer-clean-libLTLIBRARIES \ +uninstall-libLTLIBRARIES install-libLTLIBRARIES mostlyclean-compile \ +distclean-compile clean-compile maintainer-clean-compile \ +mostlyclean-libtool distclean-libtool clean-libtool \ +maintainer-clean-libtool mostlyclean-binPROGRAMS distclean-binPROGRAMS \ +clean-binPROGRAMS maintainer-clean-binPROGRAMS uninstall-binPROGRAMS \ +install-binPROGRAMS uninstall-binSCRIPTS install-binSCRIPTS \ +uninstall-m4dataDATA install-m4dataDATA uninstall-includeHEADERS \ +install-includeHEADERS install-data-recursive uninstall-data-recursive \ +install-exec-recursive uninstall-exec-recursive installdirs-recursive \ +uninstalldirs-recursive all-recursive check-recursive \ +installcheck-recursive info-recursive dvi-recursive \ +mostlyclean-recursive distclean-recursive clean-recursive \ +maintainer-clean-recursive tags tags-recursive mostlyclean-tags \ +distclean-tags clean-tags maintainer-clean-tags distdir info-am info \ +dvi-am dvi check check-am installcheck-am installcheck all-recursive-am \ +install-exec-am install-exec install-data-am install-data install-am \ +install uninstall-am uninstall all-redirect all-am all installdirs-am \ +installdirs mostlyclean-generic distclean-generic clean-generic \ +maintainer-clean-generic clean mostlyclean distclean maintainer-clean + + +# +# Rules for the generated code +# + +stamp-ser: $(top_srcdir)/libedsio/edsio.el xd.ser + $(top_srcdir)/libedsio/edsio-comp xd.ser + touch stamp-ser + +$(SER_OUT): stamp-ser + +# +# +# + +# Tell versions [3.59,3.63) of GNU make to not export all variables. +# Otherwise a system limit (for SysV at least) may be exceeded. +.NOEXPORT: diff --git a/xdelta-1.1.3/Makefile.am b/xdelta-1.1.3/Makefile.am new file mode 100644 index 0000000..41b217e --- /dev/null +++ b/xdelta-1.1.3/Makefile.am @@ -0,0 +1,50 @@ + +INCLUDES = -I$(top_srcdir)/libedsio $(GLIB_CFLAGS) + +bin_PROGRAMS = xdelta +bin_SCRIPTS = xdelta-config + +xdelta_SOURCES = xdmain.c getopt.c getopt1.c + +xdelta_LDADD = libxdelta.la \ + $(top_srcdir)/libedsio/libedsio.la \ + $(GLIB_LIBS) \ + -lz + +include_HEADERS = xdelta.h xd_edsio.h +noinst_HEADERS = xdeltapriv.h getopt.h + +lib_LTLIBRARIES = libxdelta.la + +libxdelta_la_SOURCES = xdelta.c xdapply.c $(SER_SOURCES) +libxdelta_la_LIBADD = $(GLIB_LIBS) + +EXTRA_DIST = xd.ser $(SER_OUT) xdelta.magic xdelta.prj xdelta.m4 \ + autogen.sh xdelta.dsp xdelta.dsw stamp-ser xdrsync.c + +SUBDIRS = libedsio . test doc djgpp + +m4datadir = $(datadir)/aclocal +m4data_DATA = xdelta.m4 + +## $Format: "libxdelta_la_LDFLAGS = -version-info $LibCurrent$:$LibRevision$:$LibAge$" $ +libxdelta_la_LDFLAGS = -version-info 2:0:0 + +# +# Rules for the generated code +# + +stamp-ser: $(top_srcdir)/libedsio/edsio.el xd.ser + $(top_srcdir)/libedsio/edsio-comp xd.ser + touch stamp-ser + +SER_OUT = xd_edsio.h xd_edsio.c + +$(SER_OUT): stamp-ser + +SER_SOURCES = xd_edsio.c +BUILT_SOURCES = $(SER_SOURCES) + +# +# +# diff --git a/xdelta-1.1.3/Makefile.in b/xdelta-1.1.3/Makefile.in new file mode 100644 index 0000000..1328faf --- /dev/null +++ b/xdelta-1.1.3/Makefile.in @@ -0,0 +1,629 @@ +# Makefile.in generated automatically by automake 1.4 from Makefile.am + +# Copyright (C) 1994, 1995-8, 1999 Free Software Foundation, Inc. +# This Makefile.in is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY, to the extent permitted by law; without +# even the implied warranty of MERCHANTABILITY or FITNESS FOR A +# PARTICULAR PURPOSE. + + +SHELL = @SHELL@ + +srcdir = @srcdir@ +top_srcdir = @top_srcdir@ +VPATH = @srcdir@ +prefix = @prefix@ +exec_prefix = @exec_prefix@ + +bindir = @bindir@ +sbindir = @sbindir@ +libexecdir = @libexecdir@ +datadir = @datadir@ +sysconfdir = @sysconfdir@ +sharedstatedir = @sharedstatedir@ +localstatedir = @localstatedir@ +libdir = @libdir@ +infodir = @infodir@ +mandir = @mandir@ +includedir = @includedir@ +oldincludedir = /usr/include + +DESTDIR = + +pkgdatadir = $(datadir)/@PACKAGE@ +pkglibdir = $(libdir)/@PACKAGE@ +pkgincludedir = $(includedir)/@PACKAGE@ + +top_builddir = . + +ACLOCAL = @ACLOCAL@ +AUTOCONF = @AUTOCONF@ +AUTOMAKE = @AUTOMAKE@ +AUTOHEADER = @AUTOHEADER@ + +INSTALL = @INSTALL@ +INSTALL_PROGRAM = @INSTALL_PROGRAM@ $(AM_INSTALL_PROGRAM_FLAGS) +INSTALL_DATA = @INSTALL_DATA@ +INSTALL_SCRIPT = @INSTALL_SCRIPT@ +transform = @program_transform_name@ + +NORMAL_INSTALL = : +PRE_INSTALL = : +POST_INSTALL = : +NORMAL_UNINSTALL = : +PRE_UNINSTALL = : +POST_UNINSTALL = : +host_alias = @host_alias@ +host_triplet = @host@ +AS = @AS@ +CC = @CC@ +CPP = @CPP@ +DLLTOOL = @DLLTOOL@ +EMACS = @EMACS@ +GLIB_CFLAGS = @GLIB_CFLAGS@ +GLIB_CONFIG = @GLIB_CONFIG@ +GLIB_LIBS = @GLIB_LIBS@ +LD = @LD@ +LIBTOOL = @LIBTOOL@ +LN_S = @LN_S@ +MAINT = @MAINT@ +MAKEINFO = @MAKEINFO@ +NM = @NM@ +OBJDUMP = @OBJDUMP@ +PACKAGE = @PACKAGE@ +RANLIB = @RANLIB@ +VERSION = @VERSION@ +top_srcdir_absolute = @top_srcdir_absolute@ + +INCLUDES = -I$(top_srcdir)/libedsio $(GLIB_CFLAGS) + +bin_PROGRAMS = xdelta +bin_SCRIPTS = xdelta-config + +xdelta_SOURCES = xdmain.c getopt.c getopt1.c + +xdelta_LDADD = libxdelta.la $(top_srcdir)/libedsio/libedsio.la $(GLIB_LIBS) -lz + + +include_HEADERS = xdelta.h xd_edsio.h +noinst_HEADERS = xdeltapriv.h getopt.h + +lib_LTLIBRARIES = libxdelta.la + +libxdelta_la_SOURCES = xdelta.c xdapply.c $(SER_SOURCES) +libxdelta_la_LIBADD = $(GLIB_LIBS) + +EXTRA_DIST = xd.ser $(SER_OUT) xdelta.magic xdelta.prj xdelta.m4 autogen.sh xdelta.dsp xdelta.dsw stamp-ser xdrsync.c + + +SUBDIRS = libedsio . test doc djgpp + +m4datadir = $(datadir)/aclocal +m4data_DATA = xdelta.m4 + +libxdelta_la_LDFLAGS = -version-info 2:0:0 + +SER_OUT = xd_edsio.h xd_edsio.c + +SER_SOURCES = xd_edsio.c +BUILT_SOURCES = $(SER_SOURCES) +ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 +mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs +CONFIG_HEADER = config.h +CONFIG_CLEAN_FILES = xdelta-config +LTLIBRARIES = $(lib_LTLIBRARIES) + + +DEFS = @DEFS@ -I. -I$(srcdir) -I. +CPPFLAGS = @CPPFLAGS@ +LDFLAGS = @LDFLAGS@ +LIBS = @LIBS@ +libxdelta_la_DEPENDENCIES = +libxdelta_la_OBJECTS = xdelta.lo xdapply.lo xd_edsio.lo +PROGRAMS = $(bin_PROGRAMS) + +xdelta_OBJECTS = xdmain.o getopt.o getopt1.o +xdelta_DEPENDENCIES = libxdelta.la $(top_srcdir)/libedsio/libedsio.la +xdelta_LDFLAGS = +SCRIPTS = $(bin_SCRIPTS) + +CFLAGS = @CFLAGS@ +COMPILE = $(CC) $(DEFS) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) +LTCOMPILE = $(LIBTOOL) --mode=compile $(CC) $(DEFS) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) +CCLD = $(CC) +LINK = $(LIBTOOL) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(LDFLAGS) -o $@ +DATA = $(m4data_DATA) + +HEADERS = $(include_HEADERS) $(noinst_HEADERS) + +DIST_COMMON = README ./stamp-h.in AUTHORS COPYING ChangeLog INSTALL \ +Makefile.am Makefile.in NEWS aclocal.m4 config.guess config.h.in \ +config.sub configure configure.in install-sh ltconfig ltmain.sh missing \ +mkinstalldirs xdelta-config.in + + +DISTFILES = $(DIST_COMMON) $(SOURCES) $(HEADERS) $(TEXINFOS) $(EXTRA_DIST) + +TAR = tar +GZIP_ENV = --best +SOURCES = $(libxdelta_la_SOURCES) $(xdelta_SOURCES) +OBJECTS = $(libxdelta_la_OBJECTS) $(xdelta_OBJECTS) + +all: all-redirect +.SUFFIXES: +.SUFFIXES: .S .c .lo .o .s +$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ Makefile.am $(top_srcdir)/configure.in $(ACLOCAL_M4) + cd $(top_srcdir) && $(AUTOMAKE) --gnu --include-deps Makefile + +Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status + cd $(top_builddir) \ + && CONFIG_FILES=$@ CONFIG_HEADERS= $(SHELL) ./config.status + +$(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ configure.in + cd $(srcdir) && $(ACLOCAL) + +config.status: $(srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) + $(SHELL) ./config.status --recheck +$(srcdir)/configure: @MAINTAINER_MODE_TRUE@$(srcdir)/configure.in $(ACLOCAL_M4) $(CONFIGURE_DEPENDENCIES) + cd $(srcdir) && $(AUTOCONF) + +config.h: stamp-h + @if test ! -f $@; then \ + rm -f stamp-h; \ + $(MAKE) stamp-h; \ + else :; fi +stamp-h: $(srcdir)/config.h.in $(top_builddir)/config.status + cd $(top_builddir) \ + && CONFIG_FILES= CONFIG_HEADERS=config.h \ + $(SHELL) ./config.status + @echo timestamp > stamp-h 2> /dev/null +$(srcdir)/config.h.in: @MAINTAINER_MODE_TRUE@$(srcdir)/stamp-h.in + @if test ! -f $@; then \ + rm -f $(srcdir)/stamp-h.in; \ + $(MAKE) $(srcdir)/stamp-h.in; \ + else :; fi +$(srcdir)/stamp-h.in: $(top_srcdir)/configure.in $(ACLOCAL_M4) + cd $(top_srcdir) && $(AUTOHEADER) + @echo timestamp > $(srcdir)/stamp-h.in 2> /dev/null + +mostlyclean-hdr: + +clean-hdr: + +distclean-hdr: + -rm -f config.h + +maintainer-clean-hdr: +xdelta-config: $(top_builddir)/config.status xdelta-config.in + cd $(top_builddir) && CONFIG_FILES=$@ CONFIG_HEADERS= $(SHELL) ./config.status + +mostlyclean-libLTLIBRARIES: + +clean-libLTLIBRARIES: + -test -z "$(lib_LTLIBRARIES)" || rm -f $(lib_LTLIBRARIES) + +distclean-libLTLIBRARIES: + +maintainer-clean-libLTLIBRARIES: + +install-libLTLIBRARIES: $(lib_LTLIBRARIES) + @$(NORMAL_INSTALL) + $(mkinstalldirs) $(DESTDIR)$(libdir) + @list='$(lib_LTLIBRARIES)'; for p in $$list; do \ + if test -f $$p; then \ + echo "$(LIBTOOL) --mode=install $(INSTALL) $$p $(DESTDIR)$(libdir)/$$p"; \ + $(LIBTOOL) --mode=install $(INSTALL) $$p $(DESTDIR)$(libdir)/$$p; \ + else :; fi; \ + done + +uninstall-libLTLIBRARIES: + @$(NORMAL_UNINSTALL) + list='$(lib_LTLIBRARIES)'; for p in $$list; do \ + $(LIBTOOL) --mode=uninstall rm -f $(DESTDIR)$(libdir)/$$p; \ + done + +.c.o: + $(COMPILE) -c $< + +.s.o: + $(COMPILE) -c $< + +.S.o: + $(COMPILE) -c $< + +mostlyclean-compile: + -rm -f *.o core *.core + +clean-compile: + +distclean-compile: + -rm -f *.tab.c + +maintainer-clean-compile: + +.c.lo: + $(LIBTOOL) --mode=compile $(COMPILE) -c $< + +.s.lo: + $(LIBTOOL) --mode=compile $(COMPILE) -c $< + +.S.lo: + $(LIBTOOL) --mode=compile $(COMPILE) -c $< + +mostlyclean-libtool: + -rm -f *.lo + +clean-libtool: + -rm -rf .libs _libs + +distclean-libtool: + +maintainer-clean-libtool: + +libxdelta.la: $(libxdelta_la_OBJECTS) $(libxdelta_la_DEPENDENCIES) + $(LINK) -rpath $(libdir) $(libxdelta_la_LDFLAGS) $(libxdelta_la_OBJECTS) $(libxdelta_la_LIBADD) $(LIBS) + +mostlyclean-binPROGRAMS: + +clean-binPROGRAMS: + -test -z "$(bin_PROGRAMS)" || rm -f $(bin_PROGRAMS) + +distclean-binPROGRAMS: + +maintainer-clean-binPROGRAMS: + +install-binPROGRAMS: $(bin_PROGRAMS) + @$(NORMAL_INSTALL) + $(mkinstalldirs) $(DESTDIR)$(bindir) + @list='$(bin_PROGRAMS)'; for p in $$list; do \ + if test -f $$p; then \ + echo " $(LIBTOOL) --mode=install $(INSTALL_PROGRAM) $$p $(DESTDIR)$(bindir)/`echo $$p|sed 's/$(EXEEXT)$$//'|sed '$(transform)'|sed 's/$$/$(EXEEXT)/'`"; \ + $(LIBTOOL) --mode=install $(INSTALL_PROGRAM) $$p $(DESTDIR)$(bindir)/`echo $$p|sed 's/$(EXEEXT)$$//'|sed '$(transform)'|sed 's/$$/$(EXEEXT)/'`; \ + else :; fi; \ + done + +uninstall-binPROGRAMS: + @$(NORMAL_UNINSTALL) + list='$(bin_PROGRAMS)'; for p in $$list; do \ + rm -f $(DESTDIR)$(bindir)/`echo $$p|sed 's/$(EXEEXT)$$//'|sed '$(transform)'|sed 's/$$/$(EXEEXT)/'`; \ + done + +xdelta: $(xdelta_OBJECTS) $(xdelta_DEPENDENCIES) + @rm -f xdelta + $(LINK) $(xdelta_LDFLAGS) $(xdelta_OBJECTS) $(xdelta_LDADD) $(LIBS) + +install-binSCRIPTS: $(bin_SCRIPTS) + @$(NORMAL_INSTALL) + $(mkinstalldirs) $(DESTDIR)$(bindir) + @list='$(bin_SCRIPTS)'; for p in $$list; do \ + if test -f $$p; then \ + echo " $(INSTALL_SCRIPT) $$p $(DESTDIR)$(bindir)/`echo $$p|sed '$(transform)'`"; \ + $(INSTALL_SCRIPT) $$p $(DESTDIR)$(bindir)/`echo $$p|sed '$(transform)'`; \ + else if test -f $(srcdir)/$$p; then \ + echo " $(INSTALL_SCRIPT) $(srcdir)/$$p $(DESTDIR)$(bindir)/`echo $$p|sed '$(transform)'`"; \ + $(INSTALL_SCRIPT) $(srcdir)/$$p $(DESTDIR)$(bindir)/`echo $$p|sed '$(transform)'`; \ + else :; fi; fi; \ + done + +uninstall-binSCRIPTS: + @$(NORMAL_UNINSTALL) + list='$(bin_SCRIPTS)'; for p in $$list; do \ + rm -f $(DESTDIR)$(bindir)/`echo $$p|sed '$(transform)'`; \ + done + +install-m4dataDATA: $(m4data_DATA) + @$(NORMAL_INSTALL) + $(mkinstalldirs) $(DESTDIR)$(m4datadir) + @list='$(m4data_DATA)'; for p in $$list; do \ + if test -f $(srcdir)/$$p; then \ + echo " $(INSTALL_DATA) $(srcdir)/$$p $(DESTDIR)$(m4datadir)/$$p"; \ + $(INSTALL_DATA) $(srcdir)/$$p $(DESTDIR)$(m4datadir)/$$p; \ + else if test -f $$p; then \ + echo " $(INSTALL_DATA) $$p $(DESTDIR)$(m4datadir)/$$p"; \ + $(INSTALL_DATA) $$p $(DESTDIR)$(m4datadir)/$$p; \ + fi; fi; \ + done + +uninstall-m4dataDATA: + @$(NORMAL_UNINSTALL) + list='$(m4data_DATA)'; for p in $$list; do \ + rm -f $(DESTDIR)$(m4datadir)/$$p; \ + done + +install-includeHEADERS: $(include_HEADERS) + @$(NORMAL_INSTALL) + $(mkinstalldirs) $(DESTDIR)$(includedir) + @list='$(include_HEADERS)'; for p in $$list; do \ + if test -f "$$p"; then d= ; else d="$(srcdir)/"; fi; \ + echo " $(INSTALL_DATA) $$d$$p $(DESTDIR)$(includedir)/$$p"; \ + $(INSTALL_DATA) $$d$$p $(DESTDIR)$(includedir)/$$p; \ + done + +uninstall-includeHEADERS: + @$(NORMAL_UNINSTALL) + list='$(include_HEADERS)'; for p in $$list; do \ + rm -f $(DESTDIR)$(includedir)/$$p; \ + done + +# This directory's subdirectories are mostly independent; you can cd +# into them and run `make' without going through this Makefile. +# To change the values of `make' variables: instead of editing Makefiles, +# (1) if the variable is set in `config.status', edit `config.status' +# (which will cause the Makefiles to be regenerated when you run `make'); +# (2) otherwise, pass the desired values on the `make' command line. + +@SET_MAKE@ + +all-recursive install-data-recursive install-exec-recursive \ +installdirs-recursive install-recursive uninstall-recursive \ +check-recursive installcheck-recursive info-recursive dvi-recursive: + @set fnord $(MAKEFLAGS); amf=$$2; \ + dot_seen=no; \ + target=`echo $@ | sed s/-recursive//`; \ + list='$(SUBDIRS)'; for subdir in $$list; do \ + echo "Making $$target in $$subdir"; \ + if test "$$subdir" = "."; then \ + dot_seen=yes; \ + local_target="$$target-am"; \ + else \ + local_target="$$target"; \ + fi; \ + (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \ + || case "$$amf" in *=*) exit 1;; *k*) fail=yes;; *) exit 1;; esac; \ + done; \ + if test "$$dot_seen" = "no"; then \ + $(MAKE) $(AM_MAKEFLAGS) "$$target-am" || exit 1; \ + fi; test -z "$$fail" + +mostlyclean-recursive clean-recursive distclean-recursive \ +maintainer-clean-recursive: + @set fnord $(MAKEFLAGS); amf=$$2; \ + dot_seen=no; \ + rev=''; list='$(SUBDIRS)'; for subdir in $$list; do \ + rev="$$subdir $$rev"; \ + test "$$subdir" = "." && dot_seen=yes; \ + done; \ + test "$$dot_seen" = "no" && rev=". $$rev"; \ + target=`echo $@ | sed s/-recursive//`; \ + for subdir in $$rev; do \ + echo "Making $$target in $$subdir"; \ + if test "$$subdir" = "."; then \ + local_target="$$target-am"; \ + else \ + local_target="$$target"; \ + fi; \ + (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \ + || case "$$amf" in *=*) exit 1;; *k*) fail=yes;; *) exit 1;; esac; \ + done && test -z "$$fail" +tags-recursive: + list='$(SUBDIRS)'; for subdir in $$list; do \ + test "$$subdir" = . || (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) tags); \ + done + +tags: TAGS + +ID: $(HEADERS) $(SOURCES) $(LISP) + list='$(SOURCES) $(HEADERS)'; \ + unique=`for i in $$list; do echo $$i; done | \ + awk ' { files[$$0] = 1; } \ + END { for (i in files) print i; }'`; \ + here=`pwd` && cd $(srcdir) \ + && mkid -f$$here/ID $$unique $(LISP) + +TAGS: tags-recursive $(HEADERS) $(SOURCES) config.h.in $(TAGS_DEPENDENCIES) $(LISP) + tags=; \ + here=`pwd`; \ + list='$(SUBDIRS)'; for subdir in $$list; do \ + if test "$$subdir" = .; then :; else \ + test -f $$subdir/TAGS && tags="$$tags -i $$here/$$subdir/TAGS"; \ + fi; \ + done; \ + list='$(SOURCES) $(HEADERS)'; \ + unique=`for i in $$list; do echo $$i; done | \ + awk ' { files[$$0] = 1; } \ + END { for (i in files) print i; }'`; \ + test -z "$(ETAGS_ARGS)config.h.in$$unique$(LISP)$$tags" \ + || (cd $(srcdir) && etags $(ETAGS_ARGS) $$tags config.h.in $$unique $(LISP) -o $$here/TAGS) + +mostlyclean-tags: + +clean-tags: + +distclean-tags: + -rm -f TAGS ID + +maintainer-clean-tags: + +distdir = $(PACKAGE)-$(VERSION) +top_distdir = $(distdir) + +# This target untars the dist file and tries a VPATH configuration. Then +# it guarantees that the distribution is self-contained by making another +# tarfile. +distcheck: dist + -rm -rf $(distdir) + GZIP=$(GZIP_ENV) $(TAR) zxf $(distdir).tar.gz + mkdir $(distdir)/=build + mkdir $(distdir)/=inst + dc_install_base=`cd $(distdir)/=inst && pwd`; \ + cd $(distdir)/=build \ + && ../configure --srcdir=.. --prefix=$$dc_install_base \ + && $(MAKE) $(AM_MAKEFLAGS) \ + && $(MAKE) $(AM_MAKEFLAGS) dvi \ + && $(MAKE) $(AM_MAKEFLAGS) check \ + && $(MAKE) $(AM_MAKEFLAGS) install \ + && $(MAKE) $(AM_MAKEFLAGS) installcheck \ + && $(MAKE) $(AM_MAKEFLAGS) dist + -rm -rf $(distdir) + @banner="$(distdir).tar.gz is ready for distribution"; \ + dashes=`echo "$$banner" | sed s/./=/g`; \ + echo "$$dashes"; \ + echo "$$banner"; \ + echo "$$dashes" +dist: distdir + -chmod -R a+r $(distdir) + GZIP=$(GZIP_ENV) $(TAR) chozf $(distdir).tar.gz $(distdir) + -rm -rf $(distdir) +dist-all: distdir + -chmod -R a+r $(distdir) + GZIP=$(GZIP_ENV) $(TAR) chozf $(distdir).tar.gz $(distdir) + -rm -rf $(distdir) +distdir: $(DISTFILES) + -rm -rf $(distdir) + mkdir $(distdir) + -chmod 777 $(distdir) + @for file in $(DISTFILES); do \ + d=$(srcdir); \ + if test -d $$d/$$file; then \ + cp -pr $$d/$$file $(distdir)/$$file; \ + else \ + test -f $(distdir)/$$file \ + || ln $$d/$$file $(distdir)/$$file 2> /dev/null \ + || cp -p $$d/$$file $(distdir)/$$file || :; \ + fi; \ + done + for subdir in $(SUBDIRS); do \ + if test "$$subdir" = .; then :; else \ + test -d $(distdir)/$$subdir \ + || mkdir $(distdir)/$$subdir \ + || exit 1; \ + chmod 777 $(distdir)/$$subdir; \ + (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) top_distdir=../$(distdir) distdir=../$(distdir)/$$subdir distdir) \ + || exit 1; \ + fi; \ + done +getopt.o: getopt.c config.h +getopt1.o: getopt1.c config.h getopt.h +xd_edsio.lo xd_edsio.o : xd_edsio.c xdelta.h xd_edsio.h libedsio/edsio.h \ + config.h libedsio/edsio_edsio.h +xdapply.lo xdapply.o : xdapply.c xdelta.h xd_edsio.h libedsio/edsio.h \ + config.h libedsio/edsio_edsio.h xdeltapriv.h +xdelta.lo xdelta.o : xdelta.c xdelta.h xd_edsio.h libedsio/edsio.h \ + config.h libedsio/edsio_edsio.h xdeltapriv.h +xdmain.o: xdmain.c getopt.h xdelta.h xd_edsio.h libedsio/edsio.h \ + config.h libedsio/edsio_edsio.h + +info-am: +info: info-recursive +dvi-am: +dvi: dvi-recursive +check-am: all-am +check: check-recursive +installcheck-am: +installcheck: installcheck-recursive +all-recursive-am: config.h + $(MAKE) $(AM_MAKEFLAGS) all-recursive + +install-exec-am: install-libLTLIBRARIES install-binPROGRAMS \ + install-binSCRIPTS +install-exec: install-exec-recursive + +install-data-am: install-m4dataDATA install-includeHEADERS +install-data: install-data-recursive + +install-am: all-am + @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am +install: install-recursive +uninstall-am: uninstall-libLTLIBRARIES uninstall-binPROGRAMS \ + uninstall-binSCRIPTS uninstall-m4dataDATA \ + uninstall-includeHEADERS +uninstall: uninstall-recursive +all-am: Makefile $(LTLIBRARIES) $(PROGRAMS) $(SCRIPTS) $(DATA) \ + $(HEADERS) config.h +all-redirect: all-recursive-am +install-strip: + $(MAKE) $(AM_MAKEFLAGS) AM_INSTALL_PROGRAM_FLAGS=-s install +installdirs: installdirs-recursive +installdirs-am: + $(mkinstalldirs) $(DESTDIR)$(libdir) $(DESTDIR)$(bindir) \ + $(DESTDIR)$(bindir) $(DESTDIR)$(m4datadir) \ + $(DESTDIR)$(includedir) + + +mostlyclean-generic: + +clean-generic: + +distclean-generic: + -rm -f Makefile $(CONFIG_CLEAN_FILES) + -rm -f config.cache config.log stamp-h stamp-h[0-9]* + +maintainer-clean-generic: + -test -z "$(BUILT_SOURCES)" || rm -f $(BUILT_SOURCES) +mostlyclean-am: mostlyclean-hdr mostlyclean-libLTLIBRARIES \ + mostlyclean-compile mostlyclean-libtool \ + mostlyclean-binPROGRAMS mostlyclean-tags \ + mostlyclean-generic + +mostlyclean: mostlyclean-recursive + +clean-am: clean-hdr clean-libLTLIBRARIES clean-compile clean-libtool \ + clean-binPROGRAMS clean-tags clean-generic \ + mostlyclean-am + +clean: clean-recursive + +distclean-am: distclean-hdr distclean-libLTLIBRARIES distclean-compile \ + distclean-libtool distclean-binPROGRAMS distclean-tags \ + distclean-generic clean-am + -rm -f libtool + +distclean: distclean-recursive + -rm -f config.status + +maintainer-clean-am: maintainer-clean-hdr \ + maintainer-clean-libLTLIBRARIES \ + maintainer-clean-compile maintainer-clean-libtool \ + maintainer-clean-binPROGRAMS maintainer-clean-tags \ + maintainer-clean-generic distclean-am + @echo "This command is intended for maintainers to use;" + @echo "it deletes files that may require special tools to rebuild." + +maintainer-clean: maintainer-clean-recursive + -rm -f config.status + +.PHONY: mostlyclean-hdr distclean-hdr clean-hdr maintainer-clean-hdr \ +mostlyclean-libLTLIBRARIES distclean-libLTLIBRARIES \ +clean-libLTLIBRARIES maintainer-clean-libLTLIBRARIES \ +uninstall-libLTLIBRARIES install-libLTLIBRARIES mostlyclean-compile \ +distclean-compile clean-compile maintainer-clean-compile \ +mostlyclean-libtool distclean-libtool clean-libtool \ +maintainer-clean-libtool mostlyclean-binPROGRAMS distclean-binPROGRAMS \ +clean-binPROGRAMS maintainer-clean-binPROGRAMS uninstall-binPROGRAMS \ +install-binPROGRAMS uninstall-binSCRIPTS install-binSCRIPTS \ +uninstall-m4dataDATA install-m4dataDATA uninstall-includeHEADERS \ +install-includeHEADERS install-data-recursive uninstall-data-recursive \ +install-exec-recursive uninstall-exec-recursive installdirs-recursive \ +uninstalldirs-recursive all-recursive check-recursive \ +installcheck-recursive info-recursive dvi-recursive \ +mostlyclean-recursive distclean-recursive clean-recursive \ +maintainer-clean-recursive tags tags-recursive mostlyclean-tags \ +distclean-tags clean-tags maintainer-clean-tags distdir info-am info \ +dvi-am dvi check check-am installcheck-am installcheck all-recursive-am \ +install-exec-am install-exec install-data-am install-data install-am \ +install uninstall-am uninstall all-redirect all-am all installdirs-am \ +installdirs mostlyclean-generic distclean-generic clean-generic \ +maintainer-clean-generic clean mostlyclean distclean maintainer-clean + + +# +# Rules for the generated code +# + +stamp-ser: $(top_srcdir)/libedsio/edsio.el xd.ser + $(top_srcdir)/libedsio/edsio-comp xd.ser + touch stamp-ser + +$(SER_OUT): stamp-ser + +# +# +# + +# Tell versions [3.59,3.63) of GNU make to not export all variables. +# Otherwise a system limit (for SysV at least) may be exceeded. +.NOEXPORT: diff --git a/xdelta-1.1.3/NEWS b/xdelta-1.1.3/NEWS new file mode 100644 index 0000000..bd9d818 --- /dev/null +++ b/xdelta-1.1.3/NEWS @@ -0,0 +1,208 @@ +XDelta NEWS -- history of user-visible changes. -*- Text -*- +$Date: 2004/01/05 18:54:21 $ +$ReleaseVersion: 1.1.3 $ + +Please send bug reports to xdelta-bugs@XCF.Berkeley.EDU. See the file +`README' for a description of how to report bugs. + + +** Changes since version 1.1.2 + +* Correct error message format for the case when gzread fails trying + to automatically decompress a corrupted GZIP file. The situation + itself--corrupt GZIP files--should be dealt with the -p (--pristine) + option, which disables GZIP file recognition. Reported by Ben + Escoto. + +* Apply a patch from Klaus Dittrich for building on HPUX with the + native compiler. There is now a script called "contrib/build_hpux". + + +** Changes since version 1.1.1 + +* This code release is a distant fork of the 2.0 release. It will + hopefully be replaced. + +* When 'patch' supplies its default TO file name recorded in the + delta, it still generates a unique file name to avoid overwriting an + existing copy. Use the 'xdelta info' command to see what file names + are contained in the delta. + +* The code for writing patches to stdout was broken in the case where + gzip compression is used. Writing patches to stdout has therefore + been disabled. The problem is a limitation in the gzdopen/gzwrite + functions provided by zlib--you cannot determine how many bytes have + been written to the file descriptor without dup-ing the FD + beforehand and then lseek-ing afterwards, which does not work + correctly if the output file is not seekable. + +* By default, Xdelta uses a hard-coded 16 byte block size. If you're + working with large files, try #undef XDELTA_HARDCODE_SIZE in + xdelta.h then use -s BLOCKSIZE (--blocksize=BLOCKSIZE), which should + be a power of 2. + +* New test program in the 'test' subdirectory, which runs comparisons + against "diff --rcs -a" and also verifies the "xdelta patch" + command. + +* Incorporate DJGPP patches from Richard Dawe . + You can find his versions directly at: + + ftp://ftp.simtel.net/pub/simtelnet/gnu/djgpp/v2apps/xdlt112b.zip + ftp://ftp.simtel.net/pub/simtelnet/gnu/djgpp/v2apps/xdlt112s.zip + +* Updated xdelta(1) man page. + +* Updated autoconf (2.50), automake (1.4-p4), libtool (1.4) scripts, + which includes updated config.guess and config.sub scripts. + +* Correct some backward compatibility issues: strcmp() was not being + tested == 0 for formats older than 1.0.4. + +* Update GLIB version requirement, now 1.2.8. + +* We really need support for 64bit file sizes... perhaps the next + version? + + +** Changes since version 1.1.0 + +* No one was were able to build the 1.1.0 release because it depended + on a version of glib which will not be distributed for some time. + This version backs out those dependencies and now requires + glib-1.2.1. + + +** Changes since version 1.0.6 + +* The 64M limit on file sizes has been lifted. File lengths are now + limited by the size of a 32-bit integer. + +* The internal data structures were changed and some of the + experimental bits of the interface have been moved out of libxdelta, + resulting in a simpler interface. Old patch files are still + supported. + + +** Changes since version 1.0.5 + +* There are 8 bytes of space in the patch format's header that are + reserved for future use. They are not currently used, but were also + not being initialized, making it possible for two deltas produced in + the same manner to differ. This was exposed by comparing deltas + produced between the same files on Windows and Linux. With this + patch, the results should be identical. + + +** Changes since version 1.0.4 + +* The code now compiles natively under Windows. I used MS VC++ 5.0. + It depends on glib and zlib, but I don't feel like documenting + the build process yet. I have had some trouble with the zlib DLLs + and had to build my own, so you can't build it yourself yet. There + is a pre-built version at + + ftp://ftp.xcf.berkeley.edu/pub/xdelta/xdelta-1.0.5.win32.zip + +* Many changes required to keep Xdelta working with PRCS 2. Mostly + this involved keeping up to date with some code that is shared + between the two. All the shared code is now in the "libedsio" + subdirectory, which stands for "Error Delivery and Serialized IO". + + +** Changes since version 1.0.3 + +* Slight change in file format to improve detection of and error + messages regarding corrupt deltas (specifically, those left behing + when an xdelta process is killed while computing a delta). This + means 1.0.0-1.0.3 will not read these new deltas, they will report a + bad magic number. + +* Improve several error messages related to corrupt deltas. + + +** Changes since version 1.0.2 + +* Fix a few bugs, especially one related to the implementation of -m, + and a couple more which were shaken out by testing on a pair of + emacs releases (~55M each). These changes only affect the xdelta + application, the library is unchanged. + +* Add a new command `xdelta info' that lists information about a + delta, for example: + + $ xdelta info some.patch + xdelta: version 1.0.3 found patch version 1.0 in some.patch + xdelta: patch contents are compressed + xdelta: patch from: from + xdelta: patch from length: 53309440 + xdelta: patch from md5: c0ddcb6904d40da7cf1eae5e6bdbbc01 + xdelta: patch to: to + xdelta: patch to length: 55377920 + xdelta: patch to md5: 00b3dd4d1a9b450bc5b8991b183013fb + xdelta: patch insert length: 2436426 + xdelta: patch inst count: 253649 + + +** Changes since version 1.0.1 + +* Fix minor typos, and build improvements. There is now a gtk-style + 'xdelta-config' program and autoconf macro to locate the library. + + +** Changes since version 1.0.0 + +* Fix incorrect usage report in --help output for the patch command. + +* Abort when directories are specified, there is no recursive mode. + +* Now requires glib-1.1.5. + +* The new ``pristine'' option (-p, --pristine) disables + automatic uncompression of compressed input data, and is for use + when data integrity is being externally verified. This enables a + tool written by Manish Singh (yosh@gimp.org) to compute deltas + between the Debian dpkg utility's .deb format. + +* A draft paper describing its algorithms, rational, advanced + features, and future work is now available at + ftp://ftp.xcf.berkeley.edu/pub/xdelta/xdelta.ps. + +** Changes since version 0.24 + +* This version is a complete rewrite, and removes some of the features + available in version 0. Featuring: + + - A completely new and much improved library interface. This code is + a complete rewrite. + - An optimized implementation of the XDelta algorithm. + - A drastic memory reduction. + - The library stream-processes files where possible and uses a page- + based interface when seeking is required (allowing the application + to run in bounded memory on large files). + - There is now a little documentation. A man page and the + beginnings of texinfo documentation. + - Includes several advanced features used by PRCS version 2, see the + documentation for more information. + - Includes a minimal implementation of the Rsync algorithm, also used + by PRCS version 2. + - Uses an abstract file handle interface, the library has very few + system dependencies. This allows the library client to compute + MD5 checksums in a single-pass as XDelta reads files, use pre- + computed checksums, or disable checksum verification entirely. + - Compression and file-unarchival have been removed from the library, + these features are orthogonal. + + At the application level: + + - GDBM archive experiment has been removed. This functionality is + implemented directly in PRCS version 2 using the present library + interface. + - Base 64 encoding support has been removed for technical reasons. + - Can no longer accept patches from stdin, due to the same + technical reasons (the patch instruction index is stored at the + end of the file, requiring seeking). + - Automatic detection and un-archival of RPM and dpkg file formats + has been removed. Automatic uncompression of gzipped files is + still supported. + - The GIMP plugin is no longer supported. diff --git a/xdelta-1.1.3/README b/xdelta-1.1.3/README new file mode 100644 index 0000000..3e72daa --- /dev/null +++ b/xdelta-1.1.3/README @@ -0,0 +1,180 @@ + -*- Text -*- + + Xdelta -- A binary delta generator + +Announcing version 1.1.2 of Xdelta. Xdelta is an application program +designed to compute changes between files. These changes (deltas) are +similar to the output of the "diff" program in that they may be used +to store and transmit only the changes between files. However, unlike +diff, the output of Xdelta is not expressed in a human-readable +format--Xdelta can also also apply these deltas to a copy of the +original file. Xdelta uses a fast, linear algorithm and performs well +on both binary and text files. + +Xdelta 1.1.2 is a stable, maintenence release. New, ongoing work on +Xdelta has focused on a new storage system with features similar to +the RCS command set. For more information on new development, see the +Xdelta-2.0 release series at http://xdelta.sourceforge.net. + +Xdelta was designed and implemented by Joshua MacDonald. The delta +algorithm is based on the Rsync algorithm, though implementation and +interface considerations leave the two programs quite distinct. The +Rsync algorithm is due to Andrew Tridgell and Paul Mackerras. + +To compile and install Xdelta, read the instructions in the INSTALL +file. Once you have done this, you should at least read the first few +sections of the documentation. It is available in info format. All +documentation is located in the doc/ subdirectory. + +This release, version 1.1.2, and future releases of Xdelta can be +found at http://xdelta.sourceforge.net. + +Xdelta is released under the GNU Library Public License (GPL), see the +file COPYING for details. + +There is mailing list for announcements: + + xdelta-announce@lists.sourceforge.net + +you can subscribe to the mailing list or file bug reports through +Sourceforge at: + + http://sourceforge.net/projects/xdelta/ + +Comments about Xdelta can be addressed to the following addresses: + + jmacd@cs.berkeley.edu + +The man page describes how to use Xdelta in more detail: + +NAME + xdelta - Invoke Xdelta + +SYNOPSIS + xdelta subcommand [ option... ] [ operand... ] + +DESCRIPTION + + Xdelta provides the ability to generate deltas between a pair + of files and later apply those deltas. It operates similar to + the diff and patch commands, but works on binary files and does + not produce a human readable output. + + Xdelta has three subcommands, delta, patch, and info. Delta + accepts two file versions and produces a delta, while patch + accepts the original file version and delta and produces the + second version. The info command prints useful information + about a delta. Each subcommand will be detailed seperately. + + Gzip processing + + Attempting to compute a delta between compressed input files + usually results in poor compression. This is because small + differences between the original contents causes changes in the + compression of whole blocks of data. To simplify things, + Xdelta implements a special case for gzip(1) compressed files. + If any version input to the delta command is recognized as + having gzip compression, it will be automatically decompressed + into a temporary location prior to comparison. This temporary + location is either the value of the TMPDIR environment + variable, if set, otherwise "/tmp". + + The Xdelta patch header contains a flag indicating that the + reconstructed version should be recompressed after applying + the patch. In general, this allows Xdelta to operate + transparently on gzip compressed inputs. + + There is one potential problem when automatically processing + gzip compressed files, which is that the recompressed content + does not always match byte-for-byte with the original + compressed content. The uncompressed content still matches, + but if there is an external integrity check such as + cryptographic signature verification, it may fail. To prevent + this from happening, the --pristine option disables automatic + gzip processing. + + MD5 integrity check + + By default, Xdelta always verifies the MD5 checksum of the + files it reconstructs. This prevents you from supplying an + incorrect input during patch, which would result in corrupt + output. Because of this feature, you can feel confident that + patch has produced valid results. The --noverify option + disables MD5 verification, but this is only recommended for + performance testing. + + Compressed patch format + + Xdelta uses a fairly simple encoding for its delta, then + applies zlib compression to the result. You should not have to + post-compress an Xdelta delta. + + Delta + + The delta subcommand has the following synopsis: + + xdelta delta [ option... ] fromfile tofile patchout + + Computes a delta from fromfile to tofile and writes it to patchout + + Patch + + The patch subcommand has the following synopsis: + + xdelta patch [ option... ] patchin [ fromfile [ tofile ]] + + Applies patchin to fromfile and produces a reconstructed + version of tofile. + + If fromfile was omitted, Xdelta attempts to use the original + fromfile name, which is stored in the delta. The from file + must be identical to the one used to create the delta. If its + length or MD5 checksum differs, patch will abort with an error + message. + + If tofile was omitted, Xdelta attempts to use the original + tofile name, which is also stored in the delta. If the + original tofile name already exists, a unique filename + extension will be added to avoid destroying any existing data. + + Info + The info subcommand has the following synopsis: + + xdelta info patchinfo + + Prints information about patchinfo and the version it + reconstructs, including file names, lengths, and MD5 checksums. + + Options + -0..9 Set the zlib compression level. Zero indicates no + compression. Nine indicates maximum compression. + + -h, --help + Print a short help message and exit. + + -q, --quiet + Quiet. Surpresses several warning messages. + + -v, --version + Print the Xdelta version number and exit. + + -V, --verbose + Verbose. Prints a bit of extra information. + + -n, --noverify + No verify. Turns off MD5 checksum verification of the + input and output files. + + -m=SIZE, --maxmem=SIZE + Set an upper bound on the size of an in-memory page + cache. For example, --maxmem=32M will use a 32 megabyte + page cache. + + -s=BLOCK_SIZE + Set the block size, unless it was hard coded (20% speed + improvement). Should be a power of 2. + + -p, --pristine + Disable the automatic decompression of gzipped + inputs, to prevent unexpected differences in the + re-compressed content. diff --git a/xdelta-1.1.3/aclocal.m4 b/xdelta-1.1.3/aclocal.m4 new file mode 100644 index 0000000..0caafaa --- /dev/null +++ b/xdelta-1.1.3/aclocal.m4 @@ -0,0 +1,766 @@ +dnl aclocal.m4 generated automatically by aclocal 1.4 + +dnl Copyright (C) 1994, 1995-8, 1999 Free Software Foundation, Inc. +dnl This file is free software; the Free Software Foundation +dnl gives unlimited permission to copy and/or distribute it, +dnl with or without modifications, as long as this notice is preserved. + +dnl This program is distributed in the hope that it will be useful, +dnl but WITHOUT ANY WARRANTY, to the extent permitted by law; without +dnl even the implied warranty of MERCHANTABILITY or FITNESS FOR A +dnl PARTICULAR PURPOSE. + +# Like AC_CONFIG_HEADER, but automatically create stamp file. + +AC_DEFUN(AM_CONFIG_HEADER, +[AC_PREREQ([2.12]) +AC_CONFIG_HEADER([$1]) +dnl When config.status generates a header, we must update the stamp-h file. +dnl This file resides in the same directory as the config header +dnl that is generated. We must strip everything past the first ":", +dnl and everything past the last "/". +AC_OUTPUT_COMMANDS(changequote(<<,>>)dnl +ifelse(patsubst(<<$1>>, <<[^ ]>>, <<>>), <<>>, +<>CONFIG_HEADERS" || echo timestamp > patsubst(<<$1>>, <<^\([^:]*/\)?.*>>, <<\1>>)stamp-h<<>>dnl>>, +<>; do + case " <<$>>CONFIG_HEADERS " in + *" <<$>>am_file "*<<)>> + echo timestamp > `echo <<$>>am_file | sed -e 's%:.*%%' -e 's%[^/]*$%%'`stamp-h$am_indx + ;; + esac + am_indx=`expr "<<$>>am_indx" + 1` +done<<>>dnl>>) +changequote([,]))]) + +# Do all the work for Automake. This macro actually does too much -- +# some checks are only needed if your package does certain things. +# But this isn't really a big deal. + +# serial 1 + +dnl Usage: +dnl AM_INIT_AUTOMAKE(package,version, [no-define]) + +AC_DEFUN(AM_INIT_AUTOMAKE, +[AC_REQUIRE([AC_PROG_INSTALL]) +PACKAGE=[$1] +AC_SUBST(PACKAGE) +VERSION=[$2] +AC_SUBST(VERSION) +dnl test to see if srcdir already configured +if test "`cd $srcdir && pwd`" != "`pwd`" && test -f $srcdir/config.status; then + AC_MSG_ERROR([source directory already configured; run "make distclean" there first]) +fi +ifelse([$3],, +AC_DEFINE_UNQUOTED(PACKAGE, "$PACKAGE", [Name of package]) +AC_DEFINE_UNQUOTED(VERSION, "$VERSION", [Version number of package])) +AC_REQUIRE([AM_SANITY_CHECK]) +AC_REQUIRE([AC_ARG_PROGRAM]) +dnl FIXME This is truly gross. +missing_dir=`cd $ac_aux_dir && pwd` +AM_MISSING_PROG(ACLOCAL, aclocal, $missing_dir) +AM_MISSING_PROG(AUTOCONF, autoconf, $missing_dir) +AM_MISSING_PROG(AUTOMAKE, automake, $missing_dir) +AM_MISSING_PROG(AUTOHEADER, autoheader, $missing_dir) +AM_MISSING_PROG(MAKEINFO, makeinfo, $missing_dir) +AC_REQUIRE([AC_PROG_MAKE_SET])]) + +# +# Check to make sure that the build environment is sane. +# + +AC_DEFUN(AM_SANITY_CHECK, +[AC_MSG_CHECKING([whether build environment is sane]) +# Just in case +sleep 1 +echo timestamp > conftestfile +# Do `set' in a subshell so we don't clobber the current shell's +# arguments. Must try -L first in case configure is actually a +# symlink; some systems play weird games with the mod time of symlinks +# (eg FreeBSD returns the mod time of the symlink's containing +# directory). +if ( + set X `ls -Lt $srcdir/configure conftestfile 2> /dev/null` + if test "[$]*" = "X"; then + # -L didn't work. + set X `ls -t $srcdir/configure conftestfile` + fi + if test "[$]*" != "X $srcdir/configure conftestfile" \ + && test "[$]*" != "X conftestfile $srcdir/configure"; then + + # If neither matched, then we have a broken ls. This can happen + # if, for instance, CONFIG_SHELL is bash and it inherits a + # broken ls alias from the environment. This has actually + # happened. Such a system could not be considered "sane". + AC_MSG_ERROR([ls -t appears to fail. Make sure there is not a broken +alias in your environment]) + fi + + test "[$]2" = conftestfile + ) +then + # Ok. + : +else + AC_MSG_ERROR([newly created file is older than distributed files! +Check your system clock]) +fi +rm -f conftest* +AC_MSG_RESULT(yes)]) + +dnl AM_MISSING_PROG(NAME, PROGRAM, DIRECTORY) +dnl The program must properly implement --version. +AC_DEFUN(AM_MISSING_PROG, +[AC_MSG_CHECKING(for working $2) +# Run test in a subshell; some versions of sh will print an error if +# an executable is not found, even if stderr is redirected. +# Redirect stdin to placate older versions of autoconf. Sigh. +if ($2 --version) < /dev/null > /dev/null 2>&1; then + $1=$2 + AC_MSG_RESULT(found) +else + $1="$3/missing $2" + AC_MSG_RESULT(missing) +fi +AC_SUBST($1)]) + +# Add --enable-maintainer-mode option to configure. +# From Jim Meyering + +# serial 1 + +AC_DEFUN(AM_MAINTAINER_MODE, +[AC_MSG_CHECKING([whether to enable maintainer-specific portions of Makefiles]) + dnl maintainer-mode is disabled by default + AC_ARG_ENABLE(maintainer-mode, +[ --enable-maintainer-mode enable make rules and dependencies not useful + (and sometimes confusing) to the casual installer], + USE_MAINTAINER_MODE=$enableval, + USE_MAINTAINER_MODE=no) + AC_MSG_RESULT($USE_MAINTAINER_MODE) + AM_CONDITIONAL(MAINTAINER_MODE, test $USE_MAINTAINER_MODE = yes) + MAINT=$MAINTAINER_MODE_TRUE + AC_SUBST(MAINT)dnl +] +) + +# Define a conditional. + +AC_DEFUN(AM_CONDITIONAL, +[AC_SUBST($1_TRUE) +AC_SUBST($1_FALSE) +if $2; then + $1_TRUE= + $1_FALSE='#' +else + $1_TRUE='#' + $1_FALSE= +fi]) + + +# serial 40 AC_PROG_LIBTOOL +AC_DEFUN(AC_PROG_LIBTOOL, +[AC_REQUIRE([AC_LIBTOOL_SETUP])dnl + +# Save cache, so that ltconfig can load it +AC_CACHE_SAVE + +# Actually configure libtool. ac_aux_dir is where install-sh is found. +CC="$CC" CFLAGS="$CFLAGS" CPPFLAGS="$CPPFLAGS" \ +LD="$LD" LDFLAGS="$LDFLAGS" LIBS="$LIBS" \ +LN_S="$LN_S" NM="$NM" RANLIB="$RANLIB" \ +DLLTOOL="$DLLTOOL" AS="$AS" OBJDUMP="$OBJDUMP" \ +${CONFIG_SHELL-/bin/sh} $ac_aux_dir/ltconfig --no-reexec \ +$libtool_flags --no-verify $ac_aux_dir/ltmain.sh $host \ +|| AC_MSG_ERROR([libtool configure failed]) + +# Reload cache, that may have been modified by ltconfig +AC_CACHE_LOAD + +# This can be used to rebuild libtool when needed +LIBTOOL_DEPS="$ac_aux_dir/ltconfig $ac_aux_dir/ltmain.sh" + +# Always use our own libtool. +LIBTOOL='$(SHELL) $(top_builddir)/libtool' +AC_SUBST(LIBTOOL)dnl + +# Redirect the config.log output again, so that the ltconfig log is not +# clobbered by the next message. +exec 5>>./config.log +]) + +AC_DEFUN(AC_LIBTOOL_SETUP, +[AC_PREREQ(2.13)dnl +AC_REQUIRE([AC_ENABLE_SHARED])dnl +AC_REQUIRE([AC_ENABLE_STATIC])dnl +AC_REQUIRE([AC_ENABLE_FAST_INSTALL])dnl +AC_REQUIRE([AC_CANONICAL_HOST])dnl +AC_REQUIRE([AC_CANONICAL_BUILD])dnl +AC_REQUIRE([AC_PROG_RANLIB])dnl +AC_REQUIRE([AC_PROG_CC])dnl +AC_REQUIRE([AC_PROG_LD])dnl +AC_REQUIRE([AC_PROG_NM])dnl +AC_REQUIRE([AC_PROG_LN_S])dnl +dnl + +# Check for any special flags to pass to ltconfig. +libtool_flags="--cache-file=$cache_file" +test "$enable_shared" = no && libtool_flags="$libtool_flags --disable-shared" +test "$enable_static" = no && libtool_flags="$libtool_flags --disable-static" +test "$enable_fast_install" = no && libtool_flags="$libtool_flags --disable-fast-install" +test "$ac_cv_prog_gcc" = yes && libtool_flags="$libtool_flags --with-gcc" +test "$ac_cv_prog_gnu_ld" = yes && libtool_flags="$libtool_flags --with-gnu-ld" +ifdef([AC_PROVIDE_AC_LIBTOOL_DLOPEN], +[libtool_flags="$libtool_flags --enable-dlopen"]) +ifdef([AC_PROVIDE_AC_LIBTOOL_WIN32_DLL], +[libtool_flags="$libtool_flags --enable-win32-dll"]) +AC_ARG_ENABLE(libtool-lock, + [ --disable-libtool-lock avoid locking (might break parallel builds)]) +test "x$enable_libtool_lock" = xno && libtool_flags="$libtool_flags --disable-lock" +test x"$silent" = xyes && libtool_flags="$libtool_flags --silent" + +# Some flags need to be propagated to the compiler or linker for good +# libtool support. +case "$host" in +*-*-irix6*) + # Find out which ABI we are using. + echo '[#]line __oline__ "configure"' > conftest.$ac_ext + if AC_TRY_EVAL(ac_compile); then + case "`/usr/bin/file conftest.o`" in + *32-bit*) + LD="${LD-ld} -32" + ;; + *N32*) + LD="${LD-ld} -n32" + ;; + *64-bit*) + LD="${LD-ld} -64" + ;; + esac + fi + rm -rf conftest* + ;; + +*-*-sco3.2v5*) + # On SCO OpenServer 5, we need -belf to get full-featured binaries. + SAVE_CFLAGS="$CFLAGS" + CFLAGS="$CFLAGS -belf" + AC_CACHE_CHECK([whether the C compiler needs -belf], lt_cv_cc_needs_belf, + [AC_LANG_SAVE + AC_LANG_C + AC_TRY_LINK([],[],[lt_cv_cc_needs_belf=yes],[lt_cv_cc_needs_belf=no]) + AC_LANG_RESTORE]) + if test x"$lt_cv_cc_needs_belf" != x"yes"; then + # this is probably gcc 2.8.0, egcs 1.0 or newer; no need for -belf + CFLAGS="$SAVE_CFLAGS" + fi + ;; + +ifdef([AC_PROVIDE_AC_LIBTOOL_WIN32_DLL], +[*-*-cygwin* | *-*-mingw*) + AC_CHECK_TOOL(DLLTOOL, dlltool, false) + AC_CHECK_TOOL(AS, as, false) + AC_CHECK_TOOL(OBJDUMP, objdump, false) + ;; +]) +esac +]) + +# AC_LIBTOOL_DLOPEN - enable checks for dlopen support +AC_DEFUN(AC_LIBTOOL_DLOPEN, [AC_BEFORE([$0],[AC_LIBTOOL_SETUP])]) + +# AC_LIBTOOL_WIN32_DLL - declare package support for building win32 dll's +AC_DEFUN(AC_LIBTOOL_WIN32_DLL, [AC_BEFORE([$0], [AC_LIBTOOL_SETUP])]) + +# AC_ENABLE_SHARED - implement the --enable-shared flag +# Usage: AC_ENABLE_SHARED[(DEFAULT)] +# Where DEFAULT is either `yes' or `no'. If omitted, it defaults to +# `yes'. +AC_DEFUN(AC_ENABLE_SHARED, [dnl +define([AC_ENABLE_SHARED_DEFAULT], ifelse($1, no, no, yes))dnl +AC_ARG_ENABLE(shared, +changequote(<<, >>)dnl +<< --enable-shared[=PKGS] build shared libraries [default=>>AC_ENABLE_SHARED_DEFAULT], +changequote([, ])dnl +[p=${PACKAGE-default} +case "$enableval" in +yes) enable_shared=yes ;; +no) enable_shared=no ;; +*) + enable_shared=no + # Look at the argument we got. We use all the common list separators. + IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS="${IFS}:," + for pkg in $enableval; do + if test "X$pkg" = "X$p"; then + enable_shared=yes + fi + done + IFS="$ac_save_ifs" + ;; +esac], +enable_shared=AC_ENABLE_SHARED_DEFAULT)dnl +]) + +# AC_DISABLE_SHARED - set the default shared flag to --disable-shared +AC_DEFUN(AC_DISABLE_SHARED, [AC_BEFORE([$0],[AC_LIBTOOL_SETUP])dnl +AC_ENABLE_SHARED(no)]) + +# AC_ENABLE_STATIC - implement the --enable-static flag +# Usage: AC_ENABLE_STATIC[(DEFAULT)] +# Where DEFAULT is either `yes' or `no'. If omitted, it defaults to +# `yes'. +AC_DEFUN(AC_ENABLE_STATIC, [dnl +define([AC_ENABLE_STATIC_DEFAULT], ifelse($1, no, no, yes))dnl +AC_ARG_ENABLE(static, +changequote(<<, >>)dnl +<< --enable-static[=PKGS] build static libraries [default=>>AC_ENABLE_STATIC_DEFAULT], +changequote([, ])dnl +[p=${PACKAGE-default} +case "$enableval" in +yes) enable_static=yes ;; +no) enable_static=no ;; +*) + enable_static=no + # Look at the argument we got. We use all the common list separators. + IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS="${IFS}:," + for pkg in $enableval; do + if test "X$pkg" = "X$p"; then + enable_static=yes + fi + done + IFS="$ac_save_ifs" + ;; +esac], +enable_static=AC_ENABLE_STATIC_DEFAULT)dnl +]) + +# AC_DISABLE_STATIC - set the default static flag to --disable-static +AC_DEFUN(AC_DISABLE_STATIC, [AC_BEFORE([$0],[AC_LIBTOOL_SETUP])dnl +AC_ENABLE_STATIC(no)]) + + +# AC_ENABLE_FAST_INSTALL - implement the --enable-fast-install flag +# Usage: AC_ENABLE_FAST_INSTALL[(DEFAULT)] +# Where DEFAULT is either `yes' or `no'. If omitted, it defaults to +# `yes'. +AC_DEFUN(AC_ENABLE_FAST_INSTALL, [dnl +define([AC_ENABLE_FAST_INSTALL_DEFAULT], ifelse($1, no, no, yes))dnl +AC_ARG_ENABLE(fast-install, +changequote(<<, >>)dnl +<< --enable-fast-install[=PKGS] optimize for fast installation [default=>>AC_ENABLE_FAST_INSTALL_DEFAULT], +changequote([, ])dnl +[p=${PACKAGE-default} +case "$enableval" in +yes) enable_fast_install=yes ;; +no) enable_fast_install=no ;; +*) + enable_fast_install=no + # Look at the argument we got. We use all the common list separators. + IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS="${IFS}:," + for pkg in $enableval; do + if test "X$pkg" = "X$p"; then + enable_fast_install=yes + fi + done + IFS="$ac_save_ifs" + ;; +esac], +enable_fast_install=AC_ENABLE_FAST_INSTALL_DEFAULT)dnl +]) + +# AC_ENABLE_FAST_INSTALL - set the default to --disable-fast-install +AC_DEFUN(AC_DISABLE_FAST_INSTALL, [AC_BEFORE([$0],[AC_LIBTOOL_SETUP])dnl +AC_ENABLE_FAST_INSTALL(no)]) + +# AC_PROG_LD - find the path to the GNU or non-GNU linker +AC_DEFUN(AC_PROG_LD, +[AC_ARG_WITH(gnu-ld, +[ --with-gnu-ld assume the C compiler uses GNU ld [default=no]], +test "$withval" = no || with_gnu_ld=yes, with_gnu_ld=no) +AC_REQUIRE([AC_PROG_CC])dnl +AC_REQUIRE([AC_CANONICAL_HOST])dnl +AC_REQUIRE([AC_CANONICAL_BUILD])dnl +ac_prog=ld +if test "$ac_cv_prog_gcc" = yes; then + # Check if gcc -print-prog-name=ld gives a path. + AC_MSG_CHECKING([for ld used by GCC]) + ac_prog=`($CC -print-prog-name=ld) 2>&5` + case "$ac_prog" in + # Accept absolute paths. +changequote(,)dnl + [\\/]* | [A-Za-z]:[\\/]*) + re_direlt='/[^/][^/]*/\.\./' +changequote([,])dnl + # Canonicalize the path of ld + ac_prog=`echo $ac_prog| sed 's%\\\\%/%g'` + while echo $ac_prog | grep "$re_direlt" > /dev/null 2>&1; do + ac_prog=`echo $ac_prog| sed "s%$re_direlt%/%"` + done + test -z "$LD" && LD="$ac_prog" + ;; + "") + # If it fails, then pretend we aren't using GCC. + ac_prog=ld + ;; + *) + # If it is relative, then search for the first ld in PATH. + with_gnu_ld=unknown + ;; + esac +elif test "$with_gnu_ld" = yes; then + AC_MSG_CHECKING([for GNU ld]) +else + AC_MSG_CHECKING([for non-GNU ld]) +fi +AC_CACHE_VAL(ac_cv_path_LD, +[if test -z "$LD"; then + IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS="${IFS}${PATH_SEPARATOR-:}" + for ac_dir in $PATH; do + test -z "$ac_dir" && ac_dir=. + if test -f "$ac_dir/$ac_prog" || test -f "$ac_dir/$ac_prog$ac_exeext"; then + ac_cv_path_LD="$ac_dir/$ac_prog" + # Check to see if the program is GNU ld. I'd rather use --version, + # but apparently some GNU ld's only accept -v. + # Break only if it was the GNU/non-GNU ld that we prefer. + if "$ac_cv_path_LD" -v 2>&1 < /dev/null | egrep '(GNU|with BFD)' > /dev/null; then + test "$with_gnu_ld" != no && break + else + test "$with_gnu_ld" != yes && break + fi + fi + done + IFS="$ac_save_ifs" +else + ac_cv_path_LD="$LD" # Let the user override the test with a path. +fi]) +LD="$ac_cv_path_LD" +if test -n "$LD"; then + AC_MSG_RESULT($LD) +else + AC_MSG_RESULT(no) +fi +test -z "$LD" && AC_MSG_ERROR([no acceptable ld found in \$PATH]) +AC_SUBST(LD) +AC_PROG_LD_GNU +]) + +AC_DEFUN(AC_PROG_LD_GNU, +[AC_CACHE_CHECK([if the linker ($LD) is GNU ld], ac_cv_prog_gnu_ld, +[# I'd rather use --version here, but apparently some GNU ld's only accept -v. +if $LD -v 2>&1 &5; then + ac_cv_prog_gnu_ld=yes +else + ac_cv_prog_gnu_ld=no +fi]) +]) + +# AC_PROG_NM - find the path to a BSD-compatible name lister +AC_DEFUN(AC_PROG_NM, +[AC_MSG_CHECKING([for BSD-compatible nm]) +AC_CACHE_VAL(ac_cv_path_NM, +[if test -n "$NM"; then + # Let the user override the test. + ac_cv_path_NM="$NM" +else + IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS="${IFS}${PATH_SEPARATOR-:}" + for ac_dir in $PATH /usr/ccs/bin /usr/ucb /bin; do + test -z "$ac_dir" && ac_dir=. + if test -f $ac_dir/nm || test -f $ac_dir/nm$ac_exeext ; then + # Check to see if the nm accepts a BSD-compat flag. + # Adding the `sed 1q' prevents false positives on HP-UX, which says: + # nm: unknown option "B" ignored + if ($ac_dir/nm -B /dev/null 2>&1 | sed '1q'; exit 0) | egrep /dev/null >/dev/null; then + ac_cv_path_NM="$ac_dir/nm -B" + break + elif ($ac_dir/nm -p /dev/null 2>&1 | sed '1q'; exit 0) | egrep /dev/null >/dev/null; then + ac_cv_path_NM="$ac_dir/nm -p" + break + else + ac_cv_path_NM=${ac_cv_path_NM="$ac_dir/nm"} # keep the first match, but + continue # so that we can try to find one that supports BSD flags + fi + fi + done + IFS="$ac_save_ifs" + test -z "$ac_cv_path_NM" && ac_cv_path_NM=nm +fi]) +NM="$ac_cv_path_NM" +AC_MSG_RESULT([$NM]) +AC_SUBST(NM) +]) + +# AC_CHECK_LIBM - check for math library +AC_DEFUN(AC_CHECK_LIBM, +[AC_REQUIRE([AC_CANONICAL_HOST])dnl +LIBM= +case "$host" in +*-*-beos* | *-*-cygwin*) + # These system don't have libm + ;; +*-ncr-sysv4.3*) + AC_CHECK_LIB(mw, _mwvalidcheckl, LIBM="-lmw") + AC_CHECK_LIB(m, main, LIBM="$LIBM -lm") + ;; +*) + AC_CHECK_LIB(m, main, LIBM="-lm") + ;; +esac +]) + +# AC_LIBLTDL_CONVENIENCE[(dir)] - sets LIBLTDL to the link flags for +# the libltdl convenience library, adds --enable-ltdl-convenience to +# the configure arguments. Note that LIBLTDL is not AC_SUBSTed, nor +# is AC_CONFIG_SUBDIRS called. If DIR is not provided, it is assumed +# to be `${top_builddir}/libltdl'. Make sure you start DIR with +# '${top_builddir}/' (note the single quotes!) if your package is not +# flat, and, if you're not using automake, define top_builddir as +# appropriate in the Makefiles. +AC_DEFUN(AC_LIBLTDL_CONVENIENCE, [AC_BEFORE([$0],[AC_LIBTOOL_SETUP])dnl + case "$enable_ltdl_convenience" in + no) AC_MSG_ERROR([this package needs a convenience libltdl]) ;; + "") enable_ltdl_convenience=yes + ac_configure_args="$ac_configure_args --enable-ltdl-convenience" ;; + esac + LIBLTDL=ifelse($#,1,$1,['${top_builddir}/libltdl'])/libltdlc.la + INCLTDL=ifelse($#,1,-I$1,['-I${top_builddir}/libltdl']) +]) + +# AC_LIBLTDL_INSTALLABLE[(dir)] - sets LIBLTDL to the link flags for +# the libltdl installable library, and adds --enable-ltdl-install to +# the configure arguments. Note that LIBLTDL is not AC_SUBSTed, nor +# is AC_CONFIG_SUBDIRS called. If DIR is not provided, it is assumed +# to be `${top_builddir}/libltdl'. Make sure you start DIR with +# '${top_builddir}/' (note the single quotes!) if your package is not +# flat, and, if you're not using automake, define top_builddir as +# appropriate in the Makefiles. +# In the future, this macro may have to be called after AC_PROG_LIBTOOL. +AC_DEFUN(AC_LIBLTDL_INSTALLABLE, [AC_BEFORE([$0],[AC_LIBTOOL_SETUP])dnl + AC_CHECK_LIB(ltdl, main, + [test x"$enable_ltdl_install" != xyes && enable_ltdl_install=no], + [if test x"$enable_ltdl_install" = xno; then + AC_MSG_WARN([libltdl not installed, but installation disabled]) + else + enable_ltdl_install=yes + fi + ]) + if test x"$enable_ltdl_install" = x"yes"; then + ac_configure_args="$ac_configure_args --enable-ltdl-install" + LIBLTDL=ifelse($#,1,$1,['${top_builddir}/libltdl'])/libltdl.la + INCLTDL=ifelse($#,1,-I$1,['-I${top_builddir}/libltdl']) + else + ac_configure_args="$ac_configure_args --enable-ltdl-install=no" + LIBLTDL="-lltdl" + INCLTDL= + fi +]) + +dnl old names +AC_DEFUN(AM_PROG_LIBTOOL, [indir([AC_PROG_LIBTOOL])])dnl +AC_DEFUN(AM_ENABLE_SHARED, [indir([AC_ENABLE_SHARED], $@)])dnl +AC_DEFUN(AM_ENABLE_STATIC, [indir([AC_ENABLE_STATIC], $@)])dnl +AC_DEFUN(AM_DISABLE_SHARED, [indir([AC_DISABLE_SHARED], $@)])dnl +AC_DEFUN(AM_DISABLE_STATIC, [indir([AC_DISABLE_STATIC], $@)])dnl +AC_DEFUN(AM_PROG_LD, [indir([AC_PROG_LD])])dnl +AC_DEFUN(AM_PROG_NM, [indir([AC_PROG_NM])])dnl + +dnl This is just to silence aclocal about the macro not being used +ifelse([AC_DISABLE_FAST_INSTALL])dnl + +# Configure paths for GLIB +# Owen Taylor 97-11-3 + +dnl AM_PATH_GLIB([MINIMUM-VERSION, [ACTION-IF-FOUND [, ACTION-IF-NOT-FOUND [, MODULES]]]]) +dnl Test for GLIB, and define GLIB_CFLAGS and GLIB_LIBS, if "gmodule" or +dnl gthread is specified in MODULES, pass to glib-config +dnl +AC_DEFUN(AM_PATH_GLIB, +[dnl +dnl Get the cflags and libraries from the glib-config script +dnl +AC_ARG_WITH(glib-prefix,[ --with-glib-prefix=PFX Prefix where GLIB is installed (optional)], + glib_config_prefix="$withval", glib_config_prefix="") +AC_ARG_WITH(glib-exec-prefix,[ --with-glib-exec-prefix=PFX Exec prefix where GLIB is installed (optional)], + glib_config_exec_prefix="$withval", glib_config_exec_prefix="") +AC_ARG_ENABLE(glibtest, [ --disable-glibtest Do not try to compile and run a test GLIB program], + , enable_glibtest=yes) + + if test x$glib_config_exec_prefix != x ; then + glib_config_args="$glib_config_args --exec-prefix=$glib_config_exec_prefix" + if test x${GLIB_CONFIG+set} != xset ; then + GLIB_CONFIG=$glib_config_exec_prefix/bin/glib-config + fi + fi + if test x$glib_config_prefix != x ; then + glib_config_args="$glib_config_args --prefix=$glib_config_prefix" + if test x${GLIB_CONFIG+set} != xset ; then + GLIB_CONFIG=$glib_config_prefix/bin/glib-config + fi + fi + + for module in . $4 + do + case "$module" in + gmodule) + glib_config_args="$glib_config_args gmodule" + ;; + gthread) + glib_config_args="$glib_config_args gthread" + ;; + esac + done + + AC_PATH_PROG(GLIB_CONFIG, glib-config, no) + min_glib_version=ifelse([$1], ,0.99.7,$1) + AC_MSG_CHECKING(for GLIB - version >= $min_glib_version) + no_glib="" + if test "$GLIB_CONFIG" = "no" ; then + no_glib=yes + else + GLIB_CFLAGS=`$GLIB_CONFIG $glib_config_args --cflags` + GLIB_LIBS=`$GLIB_CONFIG $glib_config_args --libs` + glib_config_major_version=`$GLIB_CONFIG $glib_config_args --version | \ + sed 's/\([[0-9]]*\).\([[0-9]]*\).\([[0-9]]*\)/\1/'` + glib_config_minor_version=`$GLIB_CONFIG $glib_config_args --version | \ + sed 's/\([[0-9]]*\).\([[0-9]]*\).\([[0-9]]*\)/\2/'` + glib_config_micro_version=`$GLIB_CONFIG $glib_config_args --version | \ + sed 's/\([[0-9]]*\).\([[0-9]]*\).\([[0-9]]*\)/\3/'` + if test "x$enable_glibtest" = "xyes" ; then + ac_save_CFLAGS="$CFLAGS" + ac_save_LIBS="$LIBS" + CFLAGS="$CFLAGS $GLIB_CFLAGS" + LIBS="$GLIB_LIBS $LIBS" +dnl +dnl Now check if the installed GLIB is sufficiently new. (Also sanity +dnl checks the results of glib-config to some extent +dnl + rm -f conf.glibtest + AC_TRY_RUN([ +#include +#include +#include + +int +main () +{ + int major, minor, micro; + char *tmp_version; + + system ("touch conf.glibtest"); + + /* HP/UX 9 (%@#!) writes to sscanf strings */ + tmp_version = g_strdup("$min_glib_version"); + if (sscanf(tmp_version, "%d.%d.%d", &major, &minor, µ) != 3) { + printf("%s, bad version string\n", "$min_glib_version"); + exit(1); + } + + if ((glib_major_version != $glib_config_major_version) || + (glib_minor_version != $glib_config_minor_version) || + (glib_micro_version != $glib_config_micro_version)) + { + printf("\n*** 'glib-config --version' returned %d.%d.%d, but GLIB (%d.%d.%d)\n", + $glib_config_major_version, $glib_config_minor_version, $glib_config_micro_version, + glib_major_version, glib_minor_version, glib_micro_version); + printf ("*** was found! If glib-config was correct, then it is best\n"); + printf ("*** to remove the old version of GLIB. You may also be able to fix the error\n"); + printf("*** by modifying your LD_LIBRARY_PATH enviroment variable, or by editing\n"); + printf("*** /etc/ld.so.conf. Make sure you have run ldconfig if that is\n"); + printf("*** required on your system.\n"); + printf("*** If glib-config was wrong, set the environment variable GLIB_CONFIG\n"); + printf("*** to point to the correct copy of glib-config, and remove the file config.cache\n"); + printf("*** before re-running configure\n"); + } + else if ((glib_major_version != GLIB_MAJOR_VERSION) || + (glib_minor_version != GLIB_MINOR_VERSION) || + (glib_micro_version != GLIB_MICRO_VERSION)) + { + printf("*** GLIB header files (version %d.%d.%d) do not match\n", + GLIB_MAJOR_VERSION, GLIB_MINOR_VERSION, GLIB_MICRO_VERSION); + printf("*** library (version %d.%d.%d)\n", + glib_major_version, glib_minor_version, glib_micro_version); + } + else + { + if ((glib_major_version > major) || + ((glib_major_version == major) && (glib_minor_version > minor)) || + ((glib_major_version == major) && (glib_minor_version == minor) && (glib_micro_version >= micro))) + { + return 0; + } + else + { + printf("\n*** An old version of GLIB (%d.%d.%d) was found.\n", + glib_major_version, glib_minor_version, glib_micro_version); + printf("*** You need a version of GLIB newer than %d.%d.%d. The latest version of\n", + major, minor, micro); + printf("*** GLIB is always available from ftp://ftp.gtk.org.\n"); + printf("***\n"); + printf("*** If you have already installed a sufficiently new version, this error\n"); + printf("*** probably means that the wrong copy of the glib-config shell script is\n"); + printf("*** being found. The easiest way to fix this is to remove the old version\n"); + printf("*** of GLIB, but you can also set the GLIB_CONFIG environment to point to the\n"); + printf("*** correct copy of glib-config. (In this case, you will have to\n"); + printf("*** modify your LD_LIBRARY_PATH enviroment variable, or edit /etc/ld.so.conf\n"); + printf("*** so that the correct libraries are found at run-time))\n"); + } + } + return 1; +} +],, no_glib=yes,[echo $ac_n "cross compiling; assumed OK... $ac_c"]) + CFLAGS="$ac_save_CFLAGS" + LIBS="$ac_save_LIBS" + fi + fi + if test "x$no_glib" = x ; then + AC_MSG_RESULT(yes) + ifelse([$2], , :, [$2]) + else + AC_MSG_RESULT(no) + if test "$GLIB_CONFIG" = "no" ; then + echo "*** The glib-config script installed by GLIB could not be found" + echo "*** If GLIB was installed in PREFIX, make sure PREFIX/bin is in" + echo "*** your path, or set the GLIB_CONFIG environment variable to the" + echo "*** full path to glib-config." + else + if test -f conf.glibtest ; then + : + else + echo "*** Could not run GLIB test program, checking why..." + CFLAGS="$CFLAGS $GLIB_CFLAGS" + LIBS="$LIBS $GLIB_LIBS" + AC_TRY_LINK([ +#include +#include +], [ return ((glib_major_version) || (glib_minor_version) || (glib_micro_version)); ], + [ echo "*** The test program compiled, but did not run. This usually means" + echo "*** that the run-time linker is not finding GLIB or finding the wrong" + echo "*** version of GLIB. If it is not finding GLIB, you'll need to set your" + echo "*** LD_LIBRARY_PATH environment variable, or edit /etc/ld.so.conf to point" + echo "*** to the installed location Also, make sure you have run ldconfig if that" + echo "*** is required on your system" + echo "***" + echo "*** If you have an old version installed, it is best to remove it, although" + echo "*** you may also be able to get things to work by modifying LD_LIBRARY_PATH" + echo "***" + echo "*** If you have a RedHat 5.0 system, you should remove the GTK package that" + echo "*** came with the system with the command" + echo "***" + echo "*** rpm --erase --nodeps gtk gtk-devel" ], + [ echo "*** The test program failed to compile or link. See the file config.log for the" + echo "*** exact error that occured. This usually means GLIB was incorrectly installed" + echo "*** or that you have moved GLIB since it was installed. In the latter case, you" + echo "*** may want to edit the glib-config script: $GLIB_CONFIG" ]) + CFLAGS="$ac_save_CFLAGS" + LIBS="$ac_save_LIBS" + fi + fi + GLIB_CFLAGS="" + GLIB_LIBS="" + ifelse([$3], , :, [$3]) + fi + AC_SUBST(GLIB_CFLAGS) + AC_SUBST(GLIB_LIBS) + rm -f conf.glibtest +]) + diff --git a/xdelta-1.1.3/autogen.sh b/xdelta-1.1.3/autogen.sh new file mode 100755 index 0000000..5f2e9c2 --- /dev/null +++ b/xdelta-1.1.3/autogen.sh @@ -0,0 +1,59 @@ +#!/bin/sh +# Run this to generate all the initial makefiles, etc. + +DIE=0 + +(autoconf --version) < /dev/null > /dev/null 2>&1 || { + echo + echo "You must have autoconf installed to compile xdelta." + echo "Download the appropriate package for your distribution," + echo "or get the source tarball at ftp://ftp.gnu.org/pub/gnu/" + DIE=1 +} + +(libtool --version) < /dev/null > /dev/null 2>&1 || { + echo + echo "You must have libtool installed to compile xdelta." + echo "Get ftp://alpha.gnu.org/gnu/libtool-1.2d.tar.gz" + echo "(or a newer version if it is available)" + DIE=1 +} + +(automake --version) < /dev/null > /dev/null 2>&1 || { + echo + echo "You must have automake installed to compile xdelta." + echo "Get ftp://ftp.cygnus.com/pub/home/tromey/automake-1.4.tar.gz" + echo "(or a newer version if it is available)" + DIE=1 +} + +if test "$DIE" -eq 1; then + exit 1 +fi + +(test -f xdelta.c) || { + echo "You must run this script in the top-level xdelta directory" + exit 1 +} + +if test -z "$*"; then + echo "I am going to run ./configure with no arguments - if you wish " + echo "to pass any to it, please specify them on the $0 command line." +fi + +for i in . +do + echo processing $i + (cd $i; \ + libtoolize --copy --force; \ + aclocal $ACLOCAL_FLAGS; autoheader; \ + automake --add-missing; \ + autoheader; \ + autoconf) +done + +echo "Running ./configure --enable-maintainer-mode" "$@" +./configure --enable-maintainer-mode "$@" + +echo +echo "Now type 'make' to compile xdelta." diff --git a/xdelta-1.1.3/config.cache b/xdelta-1.1.3/config.cache new file mode 100644 index 0000000..0803c3b --- /dev/null +++ b/xdelta-1.1.3/config.cache @@ -0,0 +1,35 @@ +# This file is a shell script that caches the results of configure +# tests run on this system so they can be shared between configure +# scripts and configure runs. It is not useful on other systems. +# If it contains results you don't want to keep, you may remove or edit it. +# +# By default, configure uses ./config.cache as the cache file, +# creating it if it does not exist already. You can give configure +# the --cache-file=FILE option to use a different cache file; that is +# what configure does when it calls configure scripts in +# subdirectories, so they share the cache. +# Giving --cache-file=/dev/null disables caching, for debugging configure. +# config.status only pays attention to the cache file if you give it the +# --recheck option to rerun configure. +# +ac_cv_exeext=${ac_cv_exeext=no} +ac_cv_func_gettimeofday=${ac_cv_func_gettimeofday=yes} +ac_cv_header_stdc=${ac_cv_header_stdc=yes} +ac_cv_header_time=${ac_cv_header_time=yes} +ac_cv_header_zlib_h=${ac_cv_header_zlib_h=yes} +ac_cv_lib_z_gzsetparams=${ac_cv_lib_z_gzsetparams=yes} +ac_cv_path_EMACS=${ac_cv_path_EMACS=/usr/bin/emacs} +ac_cv_path_GLIB_CONFIG=${ac_cv_path_GLIB_CONFIG=/usr/local/bin/glib-config} +ac_cv_path_LD=${ac_cv_path_LD=/usr/bin/ld} +ac_cv_path_NM=${ac_cv_path_NM='/usr/bin/nm -p'} +ac_cv_path_install=${ac_cv_path_install='/usr/bin/install -c'} +ac_cv_prog_CC=${ac_cv_prog_CC=gcc} +ac_cv_prog_CPP=${ac_cv_prog_CPP='gcc -E'} +ac_cv_prog_LN_S=${ac_cv_prog_LN_S='ln -s'} +ac_cv_prog_RANLIB=${ac_cv_prog_RANLIB=ranlib} +ac_cv_prog_cc_cross=${ac_cv_prog_cc_cross=no} +ac_cv_prog_cc_g=${ac_cv_prog_cc_g=yes} +ac_cv_prog_cc_works=${ac_cv_prog_cc_works=yes} +ac_cv_prog_gcc=${ac_cv_prog_gcc=yes} +ac_cv_prog_gnu_ld=${ac_cv_prog_gnu_ld=no} +ac_cv_prog_make_make_set=${ac_cv_prog_make_make_set=yes} diff --git a/xdelta-1.1.3/config.guess b/xdelta-1.1.3/config.guess new file mode 100755 index 0000000..e1b5871 --- /dev/null +++ b/xdelta-1.1.3/config.guess @@ -0,0 +1,1121 @@ +#! /bin/sh +# Attempt to guess a canonical system name. +# Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999 +# Free Software Foundation, Inc. +# +# This file is free software; you can redistribute it and/or modify it +# under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, but +# WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. +# +# As a special exception to the GNU General Public License, if you +# distribute this file as part of a program that contains a +# configuration script generated by Autoconf, you may include it under +# the same distribution terms that you use for the rest of that program. + +# Written by Per Bothner . +# The master version of this file is at the FSF in /home/gd/gnu/lib. +# Please send patches to . +# +# This script attempts to guess a canonical system name similar to +# config.sub. If it succeeds, it prints the system name on stdout, and +# exits with 0. Otherwise, it exits with 1. +# +# The plan is that this can be called by configure scripts if you +# don't specify an explicit system type (host/target name). +# +# Only a few systems have been added to this list; please add others +# (but try to keep the structure clean). +# + +# Use $HOST_CC if defined. $CC may point to a cross-compiler +if test x"$CC_FOR_BUILD" = x; then + if test x"$HOST_CC" != x; then + CC_FOR_BUILD="$HOST_CC" + else + if test x"$CC" != x; then + CC_FOR_BUILD="$CC" + else + CC_FOR_BUILD=cc + fi + fi +fi + + +# This is needed to find uname on a Pyramid OSx when run in the BSD universe. +# (ghazi@noc.rutgers.edu 8/24/94.) +if (test -f /.attbin/uname) >/dev/null 2>&1 ; then + PATH=$PATH:/.attbin ; export PATH +fi + +UNAME_MACHINE=`(uname -m) 2>/dev/null` || UNAME_MACHINE=unknown +UNAME_RELEASE=`(uname -r) 2>/dev/null` || UNAME_RELEASE=unknown +UNAME_SYSTEM=`(uname -s) 2>/dev/null` || UNAME_SYSTEM=unknown +UNAME_VERSION=`(uname -v) 2>/dev/null` || UNAME_VERSION=unknown + +dummy=dummy-$$ +trap 'rm -f $dummy.c $dummy.o $dummy; exit 1' 1 2 15 + +# Note: order is significant - the case branches are not exclusive. + +case "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" in + alpha:OSF1:*:*) + if test $UNAME_RELEASE = "V4.0"; then + UNAME_RELEASE=`/usr/sbin/sizer -v | awk '{print $3}'` + fi + # A Vn.n version is a released version. + # A Tn.n version is a released field test version. + # A Xn.n version is an unreleased experimental baselevel. + # 1.2 uses "1.2" for uname -r. + cat <$dummy.s + .globl main + .ent main +main: + .frame \$30,0,\$26,0 + .prologue 0 + .long 0x47e03d80 # implver $0 + lda \$2,259 + .long 0x47e20c21 # amask $2,$1 + srl \$1,8,\$2 + sll \$2,2,\$2 + sll \$0,3,\$0 + addl \$1,\$0,\$0 + addl \$2,\$0,\$0 + ret \$31,(\$26),1 + .end main +EOF + $CC_FOR_BUILD $dummy.s -o $dummy 2>/dev/null + if test "$?" = 0 ; then + ./$dummy + case "$?" in + 7) + UNAME_MACHINE="alpha" + ;; + 15) + UNAME_MACHINE="alphaev5" + ;; + 14) + UNAME_MACHINE="alphaev56" + ;; + 10) + UNAME_MACHINE="alphapca56" + ;; + 16) + UNAME_MACHINE="alphaev6" + ;; + esac + fi + rm -f $dummy.s $dummy + echo ${UNAME_MACHINE}-dec-osf`echo ${UNAME_RELEASE} | sed -e 's/^[VTX]//' | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz'` + exit 0 ;; + Alpha\ *:Windows_NT*:*) + # How do we know it's Interix rather than the generic POSIX subsystem? + # Should we change UNAME_MACHINE based on the output of uname instead + # of the specific Alpha model? + echo alpha-pc-interix + exit 0 ;; + 21064:Windows_NT:50:3) + echo alpha-dec-winnt3.5 + exit 0 ;; + Amiga*:UNIX_System_V:4.0:*) + echo m68k-cbm-sysv4 + exit 0;; + amiga:NetBSD:*:*) + echo m68k-cbm-netbsd${UNAME_RELEASE} + exit 0 ;; + amiga:OpenBSD:*:*) + echo m68k-unknown-openbsd${UNAME_RELEASE} + exit 0 ;; + *:[Aa]miga[Oo][Ss]:*:*) + echo ${UNAME_MACHINE}-unknown-amigaos + exit 0 ;; + arc64:OpenBSD:*:*) + echo mips64el-unknown-openbsd${UNAME_RELEASE} + exit 0 ;; + arc:OpenBSD:*:*) + echo mipsel-unknown-openbsd${UNAME_RELEASE} + exit 0 ;; + hkmips:OpenBSD:*:*) + echo mips-unknown-openbsd${UNAME_RELEASE} + exit 0 ;; + pmax:OpenBSD:*:*) + echo mipsel-unknown-openbsd${UNAME_RELEASE} + exit 0 ;; + sgi:OpenBSD:*:*) + echo mips-unknown-openbsd${UNAME_RELEASE} + exit 0 ;; + wgrisc:OpenBSD:*:*) + echo mipsel-unknown-openbsd${UNAME_RELEASE} + exit 0 ;; + *:OS/390:*:*) + echo i370-ibm-openedition + exit 0 ;; + arm:RISC*:1.[012]*:*|arm:riscix:1.[012]*:*) + echo arm-acorn-riscix${UNAME_RELEASE} + exit 0;; + arm32:NetBSD:*:*) + echo arm-unknown-netbsd`echo ${UNAME_RELEASE}|sed -e 's/[-_].*/\./'` + exit 0 ;; + SR2?01:HI-UX/MPP:*:*) + echo hppa1.1-hitachi-hiuxmpp + exit 0;; + Pyramid*:OSx*:*:* | MIS*:OSx*:*:* | MIS*:SMP_DC-OSx*:*:*) + # akee@wpdis03.wpafb.af.mil (Earle F. Ake) contributed MIS and NILE. + if test "`(/bin/universe) 2>/dev/null`" = att ; then + echo pyramid-pyramid-sysv3 + else + echo pyramid-pyramid-bsd + fi + exit 0 ;; + NILE*:*:*:dcosx) + echo pyramid-pyramid-svr4 + exit 0 ;; + sun4H:SunOS:5.*:*) + echo sparc-hal-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` + exit 0 ;; + sun4*:SunOS:5.*:* | tadpole*:SunOS:5.*:*) + echo sparc-sun-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` + exit 0 ;; + i86pc:SunOS:5.*:*) + echo i386-pc-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` + exit 0 ;; + sun4*:SunOS:6*:*) + # According to config.sub, this is the proper way to canonicalize + # SunOS6. Hard to guess exactly what SunOS6 will be like, but + # it's likely to be more like Solaris than SunOS4. + echo sparc-sun-solaris3`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` + exit 0 ;; + sun4*:SunOS:*:*) + case "`/usr/bin/arch -k`" in + Series*|S4*) + UNAME_RELEASE=`uname -v` + ;; + esac + # Japanese Language versions have a version number like `4.1.3-JL'. + echo sparc-sun-sunos`echo ${UNAME_RELEASE}|sed -e 's/-/_/'` + exit 0 ;; + sun3*:SunOS:*:*) + echo m68k-sun-sunos${UNAME_RELEASE} + exit 0 ;; + sun*:*:4.2BSD:*) + UNAME_RELEASE=`(head -1 /etc/motd | awk '{print substr($5,1,3)}') 2>/dev/null` + test "x${UNAME_RELEASE}" = "x" && UNAME_RELEASE=3 + case "`/bin/arch`" in + sun3) + echo m68k-sun-sunos${UNAME_RELEASE} + ;; + sun4) + echo sparc-sun-sunos${UNAME_RELEASE} + ;; + esac + exit 0 ;; + aushp:SunOS:*:*) + echo sparc-auspex-sunos${UNAME_RELEASE} + exit 0 ;; + atari*:NetBSD:*:*) + echo m68k-atari-netbsd${UNAME_RELEASE} + exit 0 ;; + atari*:OpenBSD:*:*) + echo m68k-unknown-openbsd${UNAME_RELEASE} + exit 0 ;; + # The situation for MiNT is a little confusing. The machine name + # can be virtually everything (everything which is not + # "atarist" or "atariste" at least should have a processor + # > m68000). The system name ranges from "MiNT" over "FreeMiNT" + # to the lowercase version "mint" (or "freemint"). Finally + # the system name "TOS" denotes a system which is actually not + # MiNT. But MiNT is downward compatible to TOS, so this should + # be no problem. + atarist[e]:*MiNT:*:* | atarist[e]:*mint:*:* | atarist[e]:*TOS:*:*) + echo m68k-atari-mint${UNAME_RELEASE} + exit 0 ;; + atari*:*MiNT:*:* | atari*:*mint:*:* | atarist[e]:*TOS:*:*) + echo m68k-atari-mint${UNAME_RELEASE} + exit 0 ;; + *falcon*:*MiNT:*:* | *falcon*:*mint:*:* | *falcon*:*TOS:*:*) + echo m68k-atari-mint${UNAME_RELEASE} + exit 0 ;; + milan*:*MiNT:*:* | milan*:*mint:*:* | *milan*:*TOS:*:*) + echo m68k-milan-mint${UNAME_RELEASE} + exit 0 ;; + hades*:*MiNT:*:* | hades*:*mint:*:* | *hades*:*TOS:*:*) + echo m68k-hades-mint${UNAME_RELEASE} + exit 0 ;; + *:*MiNT:*:* | *:*mint:*:* | *:*TOS:*:*) + echo m68k-unknown-mint${UNAME_RELEASE} + exit 0 ;; + sun3*:NetBSD:*:*) + echo m68k-sun-netbsd${UNAME_RELEASE} + exit 0 ;; + sun3*:OpenBSD:*:*) + echo m68k-unknown-openbsd${UNAME_RELEASE} + exit 0 ;; + mac68k:NetBSD:*:*) + echo m68k-apple-netbsd${UNAME_RELEASE} + exit 0 ;; + mac68k:OpenBSD:*:*) + echo m68k-unknown-openbsd${UNAME_RELEASE} + exit 0 ;; + mvme68k:OpenBSD:*:*) + echo m68k-unknown-openbsd${UNAME_RELEASE} + exit 0 ;; + mvme88k:OpenBSD:*:*) + echo m88k-unknown-openbsd${UNAME_RELEASE} + exit 0 ;; + powerpc:machten:*:*) + echo powerpc-apple-machten${UNAME_RELEASE} + exit 0 ;; + macppc:NetBSD:*:*) + echo powerpc-apple-netbsd${UNAME_RELEASE} + exit 0 ;; + RISC*:Mach:*:*) + echo mips-dec-mach_bsd4.3 + exit 0 ;; + RISC*:ULTRIX:*:*) + echo mips-dec-ultrix${UNAME_RELEASE} + exit 0 ;; + VAX*:ULTRIX*:*:*) + echo vax-dec-ultrix${UNAME_RELEASE} + exit 0 ;; + 2020:CLIX:*:* | 2430:CLIX:*:*) + echo clipper-intergraph-clix${UNAME_RELEASE} + exit 0 ;; + mips:*:*:UMIPS | mips:*:*:RISCos) + sed 's/^ //' << EOF >$dummy.c +#ifdef __cplusplus + int main (int argc, char *argv[]) { +#else + int main (argc, argv) int argc; char *argv[]; { +#endif + #if defined (host_mips) && defined (MIPSEB) + #if defined (SYSTYPE_SYSV) + printf ("mips-mips-riscos%ssysv\n", argv[1]); exit (0); + #endif + #if defined (SYSTYPE_SVR4) + printf ("mips-mips-riscos%ssvr4\n", argv[1]); exit (0); + #endif + #if defined (SYSTYPE_BSD43) || defined(SYSTYPE_BSD) + printf ("mips-mips-riscos%sbsd\n", argv[1]); exit (0); + #endif + #endif + exit (-1); + } +EOF + $CC_FOR_BUILD $dummy.c -o $dummy \ + && ./$dummy `echo "${UNAME_RELEASE}" | sed -n 's/\([0-9]*\).*/\1/p'` \ + && rm $dummy.c $dummy && exit 0 + rm -f $dummy.c $dummy + echo mips-mips-riscos${UNAME_RELEASE} + exit 0 ;; + Night_Hawk:Power_UNIX:*:*) + echo powerpc-harris-powerunix + exit 0 ;; + m88k:CX/UX:7*:*) + echo m88k-harris-cxux7 + exit 0 ;; + m88k:*:4*:R4*) + echo m88k-motorola-sysv4 + exit 0 ;; + m88k:*:3*:R3*) + echo m88k-motorola-sysv3 + exit 0 ;; + AViiON:dgux:*:*) + # DG/UX returns AViiON for all architectures + UNAME_PROCESSOR=`/usr/bin/uname -p` + if [ $UNAME_PROCESSOR = mc88100 ] || [ $UNAME_PROCESSOR = mc88110] + then + if [ ${TARGET_BINARY_INTERFACE}x = m88kdguxelfx ] || \ + [ ${TARGET_BINARY_INTERFACE}x = x ] + then + echo m88k-dg-dgux${UNAME_RELEASE} + else + echo m88k-dg-dguxbcs${UNAME_RELEASE} + fi + else + echo i586-dg-dgux${UNAME_RELEASE} + fi + exit 0 ;; + M88*:DolphinOS:*:*) # DolphinOS (SVR3) + echo m88k-dolphin-sysv3 + exit 0 ;; + M88*:*:R3*:*) + # Delta 88k system running SVR3 + echo m88k-motorola-sysv3 + exit 0 ;; + XD88*:*:*:*) # Tektronix XD88 system running UTekV (SVR3) + echo m88k-tektronix-sysv3 + exit 0 ;; + Tek43[0-9][0-9]:UTek:*:*) # Tektronix 4300 system running UTek (BSD) + echo m68k-tektronix-bsd + exit 0 ;; + *:IRIX*:*:*) + echo mips-sgi-irix`echo ${UNAME_RELEASE}|sed -e 's/-/_/g'` + exit 0 ;; + ????????:AIX?:[12].1:2) # AIX 2.2.1 or AIX 2.1.1 is RT/PC AIX. + echo romp-ibm-aix # uname -m gives an 8 hex-code CPU id + exit 0 ;; # Note that: echo "'`uname -s`'" gives 'AIX ' + i?86:AIX:*:*) + echo i386-ibm-aix + exit 0 ;; + *:AIX:2:3) + if grep bos325 /usr/include/stdio.h >/dev/null 2>&1; then + sed 's/^ //' << EOF >$dummy.c + #include + + main() + { + if (!__power_pc()) + exit(1); + puts("powerpc-ibm-aix3.2.5"); + exit(0); + } +EOF + $CC_FOR_BUILD $dummy.c -o $dummy && ./$dummy && rm $dummy.c $dummy && exit 0 + rm -f $dummy.c $dummy + echo rs6000-ibm-aix3.2.5 + elif grep bos324 /usr/include/stdio.h >/dev/null 2>&1; then + echo rs6000-ibm-aix3.2.4 + else + echo rs6000-ibm-aix3.2 + fi + exit 0 ;; + *:AIX:*:4) + IBM_CPU_ID=`/usr/sbin/lsdev -C -c processor -S available | head -1 | awk '{ print $1 }'` + if /usr/sbin/lsattr -EHl ${IBM_CPU_ID} | grep POWER >/dev/null 2>&1; then + IBM_ARCH=rs6000 + else + IBM_ARCH=powerpc + fi + if [ -x /usr/bin/oslevel ] ; then + IBM_REV=`/usr/bin/oslevel` + else + IBM_REV=4.${UNAME_RELEASE} + fi + echo ${IBM_ARCH}-ibm-aix${IBM_REV} + exit 0 ;; + *:AIX:*:*) + echo rs6000-ibm-aix + exit 0 ;; + ibmrt:4.4BSD:*|romp-ibm:BSD:*) + echo romp-ibm-bsd4.4 + exit 0 ;; + ibmrt:*BSD:*|romp-ibm:BSD:*) # covers RT/PC NetBSD and + echo romp-ibm-bsd${UNAME_RELEASE} # 4.3 with uname added to + exit 0 ;; # report: romp-ibm BSD 4.3 + *:BOSX:*:*) + echo rs6000-bull-bosx + exit 0 ;; + DPX/2?00:B.O.S.:*:*) + echo m68k-bull-sysv3 + exit 0 ;; + 9000/[34]??:4.3bsd:1.*:*) + echo m68k-hp-bsd + exit 0 ;; + hp300:4.4BSD:*:* | 9000/[34]??:4.3bsd:2.*:*) + echo m68k-hp-bsd4.4 + exit 0 ;; + 9000/[34678]??:HP-UX:*:*) + case "${UNAME_MACHINE}" in + 9000/31? ) HP_ARCH=m68000 ;; + 9000/[34]?? ) HP_ARCH=m68k ;; + 9000/[678][0-9][0-9]) + sed 's/^ //' << EOF >$dummy.c + #include + #include + + int main () + { + #if defined(_SC_KERNEL_BITS) + long bits = sysconf(_SC_KERNEL_BITS); + #endif + long cpu = sysconf (_SC_CPU_VERSION); + + switch (cpu) + { + case CPU_PA_RISC1_0: puts ("hppa1.0"); break; + case CPU_PA_RISC1_1: puts ("hppa1.1"); break; + case CPU_PA_RISC2_0: + #if defined(_SC_KERNEL_BITS) + switch (bits) + { + case 64: puts ("hppa2.0w"); break; + case 32: puts ("hppa2.0n"); break; + default: puts ("hppa2.0"); break; + } break; + #else /* !defined(_SC_KERNEL_BITS) */ + puts ("hppa2.0"); break; + #endif + default: puts ("hppa1.0"); break; + } + exit (0); + } +EOF + (CCOPTS= $CC_FOR_BUILD $dummy.c -o $dummy 2>/dev/null ) && HP_ARCH=`./$dummy` + rm -f $dummy.c $dummy + esac + HPUX_REV=`echo ${UNAME_RELEASE}|sed -e 's/[^.]*.[0B]*//'` + echo ${HP_ARCH}-hp-hpux${HPUX_REV} + exit 0 ;; + 3050*:HI-UX:*:*) + sed 's/^ //' << EOF >$dummy.c + #include + int + main () + { + long cpu = sysconf (_SC_CPU_VERSION); + /* The order matters, because CPU_IS_HP_MC68K erroneously returns + true for CPU_PA_RISC1_0. CPU_IS_PA_RISC returns correct + results, however. */ + if (CPU_IS_PA_RISC (cpu)) + { + switch (cpu) + { + case CPU_PA_RISC1_0: puts ("hppa1.0-hitachi-hiuxwe2"); break; + case CPU_PA_RISC1_1: puts ("hppa1.1-hitachi-hiuxwe2"); break; + case CPU_PA_RISC2_0: puts ("hppa2.0-hitachi-hiuxwe2"); break; + default: puts ("hppa-hitachi-hiuxwe2"); break; + } + } + else if (CPU_IS_HP_MC68K (cpu)) + puts ("m68k-hitachi-hiuxwe2"); + else puts ("unknown-hitachi-hiuxwe2"); + exit (0); + } +EOF + $CC_FOR_BUILD $dummy.c -o $dummy && ./$dummy && rm $dummy.c $dummy && exit 0 + rm -f $dummy.c $dummy + echo unknown-hitachi-hiuxwe2 + exit 0 ;; + 9000/7??:4.3bsd:*:* | 9000/8?[79]:4.3bsd:*:* ) + echo hppa1.1-hp-bsd + exit 0 ;; + 9000/8??:4.3bsd:*:*) + echo hppa1.0-hp-bsd + exit 0 ;; + *9??*:MPE/iX:*:*) + echo hppa1.0-hp-mpeix + exit 0 ;; + hp7??:OSF1:*:* | hp8?[79]:OSF1:*:* ) + echo hppa1.1-hp-osf + exit 0 ;; + hp8??:OSF1:*:*) + echo hppa1.0-hp-osf + exit 0 ;; + i?86:OSF1:*:*) + if [ -x /usr/sbin/sysversion ] ; then + echo ${UNAME_MACHINE}-unknown-osf1mk + else + echo ${UNAME_MACHINE}-unknown-osf1 + fi + exit 0 ;; + parisc*:Lites*:*:*) + echo hppa1.1-hp-lites + exit 0 ;; + hppa*:OpenBSD:*:*) + echo hppa-unknown-openbsd + exit 0 ;; + C1*:ConvexOS:*:* | convex:ConvexOS:C1*:*) + echo c1-convex-bsd + exit 0 ;; + C2*:ConvexOS:*:* | convex:ConvexOS:C2*:*) + if getsysinfo -f scalar_acc + then echo c32-convex-bsd + else echo c2-convex-bsd + fi + exit 0 ;; + C34*:ConvexOS:*:* | convex:ConvexOS:C34*:*) + echo c34-convex-bsd + exit 0 ;; + C38*:ConvexOS:*:* | convex:ConvexOS:C38*:*) + echo c38-convex-bsd + exit 0 ;; + C4*:ConvexOS:*:* | convex:ConvexOS:C4*:*) + echo c4-convex-bsd + exit 0 ;; + CRAY*X-MP:*:*:*) + echo xmp-cray-unicos + exit 0 ;; + CRAY*Y-MP:*:*:*) + echo ymp-cray-unicos${UNAME_RELEASE} + exit 0 ;; + CRAY*[A-Z]90:*:*:*) + echo ${UNAME_MACHINE}-cray-unicos${UNAME_RELEASE} \ + | sed -e 's/CRAY.*\([A-Z]90\)/\1/' \ + -e y/ABCDEFGHIJKLMNOPQRSTUVWXYZ/abcdefghijklmnopqrstuvwxyz/ + exit 0 ;; + CRAY*TS:*:*:*) + echo t90-cray-unicos${UNAME_RELEASE} + exit 0 ;; + CRAY*T3E:*:*:*) + echo alpha-cray-unicosmk${UNAME_RELEASE} + exit 0 ;; + CRAY-2:*:*:*) + echo cray2-cray-unicos + exit 0 ;; + F300:UNIX_System_V:*:*) + FUJITSU_SYS=`uname -p | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz' | sed -e 's/\///'` + FUJITSU_REL=`echo ${UNAME_RELEASE} | sed -e 's/ /_/'` + echo "f300-fujitsu-${FUJITSU_SYS}${FUJITSU_REL}" + exit 0 ;; + F301:UNIX_System_V:*:*) + echo f301-fujitsu-uxpv`echo $UNAME_RELEASE | sed 's/ .*//'` + exit 0 ;; + hp3[0-9][05]:NetBSD:*:*) + echo m68k-hp-netbsd${UNAME_RELEASE} + exit 0 ;; + hp300:OpenBSD:*:*) + echo m68k-unknown-openbsd${UNAME_RELEASE} + exit 0 ;; + i?86:BSD/386:*:* | i?86:BSD/OS:*:*) + echo ${UNAME_MACHINE}-pc-bsdi${UNAME_RELEASE} + exit 0 ;; + sparc*:BSD/OS:*:*) + echo sparc-unknown-bsdi${UNAME_RELEASE} + exit 0 ;; + *:BSD/OS:*:*) + echo ${UNAME_MACHINE}-unknown-bsdi${UNAME_RELEASE} + exit 0 ;; + *:FreeBSD:*:*) + if test -x /usr/bin/objformat; then + if test "elf" = "`/usr/bin/objformat`"; then + echo ${UNAME_MACHINE}-unknown-freebsdelf`echo ${UNAME_RELEASE}|sed -e 's/[-_].*//'` + exit 0 + fi + fi + echo ${UNAME_MACHINE}-unknown-freebsd`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'` + exit 0 ;; + *:NetBSD:*:*) + echo ${UNAME_MACHINE}-unknown-netbsd`echo ${UNAME_RELEASE}|sed -e 's/[-_].*//'` + exit 0 ;; + *:OpenBSD:*:*) + echo ${UNAME_MACHINE}-unknown-openbsd`echo ${UNAME_RELEASE}|sed -e 's/[-_].*/\./'` + exit 0 ;; + i*:CYGWIN*:*) + echo ${UNAME_MACHINE}-pc-cygwin + exit 0 ;; + i*:MINGW*:*) + echo ${UNAME_MACHINE}-pc-mingw32 + exit 0 ;; + i*:Windows_NT*:* | Pentium*:Windows_NT*:*) + # How do we know it's Interix rather than the generic POSIX subsystem? + # It also conflicts with pre-2.0 versions of AT&T UWIN. Should we + # UNAME_MACHINE based on the output of uname instead of i386? + echo i386-pc-interix + exit 0 ;; + i*:UWIN*:*) + echo ${UNAME_MACHINE}-pc-uwin + exit 0 ;; + p*:CYGWIN*:*) + echo powerpcle-unknown-cygwin + exit 0 ;; + prep*:SunOS:5.*:*) + echo powerpcle-unknown-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` + exit 0 ;; + *:GNU:*:*) + echo `echo ${UNAME_MACHINE}|sed -e 's,[-/].*$,,'`-unknown-gnu`echo ${UNAME_RELEASE}|sed -e 's,/.*$,,'` + exit 0 ;; + *:Linux:*:*) + + # The BFD linker knows what the default object file format is, so + # first see if it will tell us. cd to the root directory to prevent + # problems with other programs or directories called `ld' in the path. + ld_help_string=`cd /; ld --help 2>&1` + ld_supported_emulations=`echo $ld_help_string \ + | sed -ne '/supported emulations:/!d + s/[ ][ ]*/ /g + s/.*supported emulations: *// + s/ .*// + p'` + case "$ld_supported_emulations" in + *ia64) + echo "${UNAME_MACHINE}-unknown-linux" + exit 0 + ;; + i?86linux) + echo "${UNAME_MACHINE}-pc-linux-gnuaout" + exit 0 + ;; + i?86coff) + echo "${UNAME_MACHINE}-pc-linux-gnucoff" + exit 0 + ;; + sparclinux) + echo "${UNAME_MACHINE}-unknown-linux-gnuaout" + exit 0 + ;; + armlinux) + echo "${UNAME_MACHINE}-unknown-linux-gnuaout" + exit 0 + ;; + elf32arm*) + echo "${UNAME_MACHINE}-unknown-linux-gnu" + exit 0 + ;; + armelf_linux*) + echo "${UNAME_MACHINE}-unknown-linux-gnu" + exit 0 + ;; + m68klinux) + echo "${UNAME_MACHINE}-unknown-linux-gnuaout" + exit 0 + ;; + elf32ppc) + # Determine Lib Version + cat >$dummy.c < +#if defined(__GLIBC__) +extern char __libc_version[]; +extern char __libc_release[]; +#endif +main(argc, argv) + int argc; + char *argv[]; +{ +#if defined(__GLIBC__) + printf("%s %s\n", __libc_version, __libc_release); +#else + printf("unkown\n"); +#endif + return 0; +} +EOF + LIBC="" + $CC_FOR_BUILD $dummy.c -o $dummy 2>/dev/null + if test "$?" = 0 ; then + ./$dummy | grep 1\.99 > /dev/null + if test "$?" = 0 ; then + LIBC="libc1" + fi + fi + rm -f $dummy.c $dummy + echo powerpc-unknown-linux-gnu${LIBC} + exit 0 + ;; + esac + + if test "${UNAME_MACHINE}" = "alpha" ; then + sed 's/^ //' <$dummy.s + .globl main + .ent main + main: + .frame \$30,0,\$26,0 + .prologue 0 + .long 0x47e03d80 # implver $0 + lda \$2,259 + .long 0x47e20c21 # amask $2,$1 + srl \$1,8,\$2 + sll \$2,2,\$2 + sll \$0,3,\$0 + addl \$1,\$0,\$0 + addl \$2,\$0,\$0 + ret \$31,(\$26),1 + .end main +EOF + LIBC="" + $CC_FOR_BUILD $dummy.s -o $dummy 2>/dev/null + if test "$?" = 0 ; then + ./$dummy + case "$?" in + 7) + UNAME_MACHINE="alpha" + ;; + 15) + UNAME_MACHINE="alphaev5" + ;; + 14) + UNAME_MACHINE="alphaev56" + ;; + 10) + UNAME_MACHINE="alphapca56" + ;; + 16) + UNAME_MACHINE="alphaev6" + ;; + esac + + objdump --private-headers $dummy | \ + grep ld.so.1 > /dev/null + if test "$?" = 0 ; then + LIBC="libc1" + fi + fi + rm -f $dummy.s $dummy + echo ${UNAME_MACHINE}-unknown-linux-gnu${LIBC} ; exit 0 + elif test "${UNAME_MACHINE}" = "mips" ; then + cat >$dummy.c </dev/null && ./$dummy "${UNAME_MACHINE}" && rm $dummy.c $dummy && exit 0 + rm -f $dummy.c $dummy + else + # Either a pre-BFD a.out linker (linux-gnuoldld) + # or one that does not give us useful --help. + # GCC wants to distinguish between linux-gnuoldld and linux-gnuaout. + # If ld does not provide *any* "supported emulations:" + # that means it is gnuoldld. + echo "$ld_help_string" | grep >/dev/null 2>&1 "supported emulations:" + test $? != 0 && echo "${UNAME_MACHINE}-pc-linux-gnuoldld" && exit 0 + + case "${UNAME_MACHINE}" in + i?86) + VENDOR=pc; + ;; + *) + VENDOR=unknown; + ;; + esac + # Determine whether the default compiler is a.out or elf + cat >$dummy.c < +#ifdef __cplusplus + int main (int argc, char *argv[]) { +#else + int main (argc, argv) int argc; char *argv[]; { +#endif +#ifdef __ELF__ +# ifdef __GLIBC__ +# if __GLIBC__ >= 2 + printf ("%s-${VENDOR}-linux-gnu\n", argv[1]); +# else + printf ("%s-${VENDOR}-linux-gnulibc1\n", argv[1]); +# endif +# else + printf ("%s-${VENDOR}-linux-gnulibc1\n", argv[1]); +# endif +#else + printf ("%s-${VENDOR}-linux-gnuaout\n", argv[1]); +#endif + return 0; +} +EOF + $CC_FOR_BUILD $dummy.c -o $dummy 2>/dev/null && ./$dummy "${UNAME_MACHINE}" && rm $dummy.c $dummy && exit 0 + rm -f $dummy.c $dummy + fi ;; +# ptx 4.0 does uname -s correctly, with DYNIX/ptx in there. earlier versions +# are messed up and put the nodename in both sysname and nodename. + i?86:DYNIX/ptx:4*:*) + echo i386-sequent-sysv4 + exit 0 ;; + i?86:UNIX_SV:4.2MP:2.*) + # Unixware is an offshoot of SVR4, but it has its own version + # number series starting with 2... + # I am not positive that other SVR4 systems won't match this, + # I just have to hope. -- rms. + # Use sysv4.2uw... so that sysv4* matches it. + echo ${UNAME_MACHINE}-pc-sysv4.2uw${UNAME_VERSION} + exit 0 ;; + i?86:*:4.*:* | i?86:SYSTEM_V:4.*:*) + UNAME_REL=`echo ${UNAME_RELEASE} | sed 's/\/MP$//'` + if grep Novell /usr/include/link.h >/dev/null 2>/dev/null; then + echo ${UNAME_MACHINE}-univel-sysv${UNAME_REL} + else + echo ${UNAME_MACHINE}-pc-sysv${UNAME_REL} + fi + exit 0 ;; + i?86:*:5:7*) + # Fixed at (any) Pentium or better + UNAME_MACHINE=i586 + if [ ${UNAME_SYSTEM} = "UnixWare" ] ; then + echo ${UNAME_MACHINE}-sco-sysv${UNAME_RELEASE}uw${UNAME_VERSION} + else + echo ${UNAME_MACHINE}-pc-sysv${UNAME_RELEASE} + fi + exit 0 ;; + i?86:*:3.2:*) + if test -f /usr/options/cb.name; then + UNAME_REL=`sed -n 's/.*Version //p' /dev/null >/dev/null ; then + UNAME_REL=`(/bin/uname -X|egrep Release|sed -e 's/.*= //')` + (/bin/uname -X|egrep i80486 >/dev/null) && UNAME_MACHINE=i486 + (/bin/uname -X|egrep '^Machine.*Pentium' >/dev/null) \ + && UNAME_MACHINE=i586 + (/bin/uname -X|egrep '^Machine.*Pent ?II' >/dev/null) \ + && UNAME_MACHINE=i686 + (/bin/uname -X|egrep '^Machine.*Pentium Pro' >/dev/null) \ + && UNAME_MACHINE=i686 + echo ${UNAME_MACHINE}-pc-sco$UNAME_REL + else + echo ${UNAME_MACHINE}-pc-sysv32 + fi + exit 0 ;; + pc:*:*:*) + # uname -m prints for DJGPP always 'pc', but it prints nothing about + # the processor, so we play safe by assuming i386. + echo i386-pc-msdosdjgpp + exit 0 ;; + Intel:Mach:3*:*) + echo i386-pc-mach3 + exit 0 ;; + paragon:*:*:*) + echo i860-intel-osf1 + exit 0 ;; + i860:*:4.*:*) # i860-SVR4 + if grep Stardent /usr/include/sys/uadmin.h >/dev/null 2>&1 ; then + echo i860-stardent-sysv${UNAME_RELEASE} # Stardent Vistra i860-SVR4 + else # Add other i860-SVR4 vendors below as they are discovered. + echo i860-unknown-sysv${UNAME_RELEASE} # Unknown i860-SVR4 + fi + exit 0 ;; + mini*:CTIX:SYS*5:*) + # "miniframe" + echo m68010-convergent-sysv + exit 0 ;; + M68*:*:R3V[567]*:*) + test -r /sysV68 && echo 'm68k-motorola-sysv' && exit 0 ;; + 3[34]??:*:4.0:3.0 | 3[34]??,*:*:4.0:3.0 | 4850:*:4.0:3.0) + OS_REL='' + test -r /etc/.relid \ + && OS_REL=.`sed -n 's/[^ ]* [^ ]* \([0-9][0-9]\).*/\1/p' < /etc/.relid` + /bin/uname -p 2>/dev/null | grep 86 >/dev/null \ + && echo i486-ncr-sysv4.3${OS_REL} && exit 0 + /bin/uname -p 2>/dev/null | /bin/grep entium >/dev/null \ + && echo i586-ncr-sysv4.3${OS_REL} && exit 0 ;; + 3[34]??:*:4.0:* | 3[34]??,*:*:4.0:*) + /bin/uname -p 2>/dev/null | grep 86 >/dev/null \ + && echo i486-ncr-sysv4 && exit 0 ;; + m68*:LynxOS:2.*:*) + echo m68k-unknown-lynxos${UNAME_RELEASE} + exit 0 ;; + mc68030:UNIX_System_V:4.*:*) + echo m68k-atari-sysv4 + exit 0 ;; + i?86:LynxOS:2.*:* | i?86:LynxOS:3.[01]*:*) + echo i386-unknown-lynxos${UNAME_RELEASE} + exit 0 ;; + TSUNAMI:LynxOS:2.*:*) + echo sparc-unknown-lynxos${UNAME_RELEASE} + exit 0 ;; + rs6000:LynxOS:2.*:* | PowerPC:LynxOS:2.*:*) + echo rs6000-unknown-lynxos${UNAME_RELEASE} + exit 0 ;; + SM[BE]S:UNIX_SV:*:*) + echo mips-dde-sysv${UNAME_RELEASE} + exit 0 ;; + RM*:ReliantUNIX-*:*:*) + echo mips-sni-sysv4 + exit 0 ;; + RM*:SINIX-*:*:*) + echo mips-sni-sysv4 + exit 0 ;; + *:SINIX-*:*:*) + if uname -p 2>/dev/null >/dev/null ; then + UNAME_MACHINE=`(uname -p) 2>/dev/null` + echo ${UNAME_MACHINE}-sni-sysv4 + else + echo ns32k-sni-sysv + fi + exit 0 ;; + PENTIUM:CPunix:4.0*:*) # Unisys `ClearPath HMP IX 4000' SVR4/MP effort + # says + echo i586-unisys-sysv4 + exit 0 ;; + *:UNIX_System_V:4*:FTX*) + # From Gerald Hewes . + # How about differentiating between stratus architectures? -djm + echo hppa1.1-stratus-sysv4 + exit 0 ;; + *:*:*:FTX*) + # From seanf@swdc.stratus.com. + echo i860-stratus-sysv4 + exit 0 ;; + mc68*:A/UX:*:*) + echo m68k-apple-aux${UNAME_RELEASE} + exit 0 ;; + news*:NEWS-OS:*:6*) + echo mips-sony-newsos6 + exit 0 ;; + R[34]000:*System_V*:*:* | R4000:UNIX_SYSV:*:* | R*000:UNIX_SV:*:*) + if [ -d /usr/nec ]; then + echo mips-nec-sysv${UNAME_RELEASE} + else + echo mips-unknown-sysv${UNAME_RELEASE} + fi + exit 0 ;; + BeBox:BeOS:*:*) # BeOS running on hardware made by Be, PPC only. + echo powerpc-be-beos + exit 0 ;; + BeMac:BeOS:*:*) # BeOS running on Mac or Mac clone, PPC only. + echo powerpc-apple-beos + exit 0 ;; + BePC:BeOS:*:*) # BeOS running on Intel PC compatible. + echo i586-pc-beos + exit 0 ;; + SX-4:SUPER-UX:*:*) + echo sx4-nec-superux${UNAME_RELEASE} + exit 0 ;; + SX-5:SUPER-UX:*:*) + echo sx5-nec-superux${UNAME_RELEASE} + exit 0 ;; + Power*:Rhapsody:*:*) + echo powerpc-apple-rhapsody${UNAME_RELEASE} + exit 0 ;; + *:Rhapsody:*:*) + echo ${UNAME_MACHINE}-apple-rhapsody${UNAME_RELEASE} + exit 0 ;; + *:QNX:*:4*) + echo i386-qnx-qnx${UNAME_VERSION} + exit 0 ;; +esac + +#echo '(No uname command or uname output not recognized.)' 1>&2 +#echo "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" 1>&2 + +cat >$dummy.c < +# include +#endif +main () +{ +#if defined (sony) +#if defined (MIPSEB) + /* BFD wants "bsd" instead of "newsos". Perhaps BFD should be changed, + I don't know.... */ + printf ("mips-sony-bsd\n"); exit (0); +#else +#include + printf ("m68k-sony-newsos%s\n", +#ifdef NEWSOS4 + "4" +#else + "" +#endif + ); exit (0); +#endif +#endif + +#if defined (__arm) && defined (__acorn) && defined (__unix) + printf ("arm-acorn-riscix"); exit (0); +#endif + +#if defined (hp300) && !defined (hpux) + printf ("m68k-hp-bsd\n"); exit (0); +#endif + +#if defined (NeXT) +#if !defined (__ARCHITECTURE__) +#define __ARCHITECTURE__ "m68k" +#endif + int version; + version=`(hostinfo | sed -n 's/.*NeXT Mach \([0-9]*\).*/\1/p') 2>/dev/null`; + if (version < 4) + printf ("%s-next-nextstep%d\n", __ARCHITECTURE__, version); + else + printf ("%s-next-openstep%d\n", __ARCHITECTURE__, version); + exit (0); +#endif + +#if defined (MULTIMAX) || defined (n16) +#if defined (UMAXV) + printf ("ns32k-encore-sysv\n"); exit (0); +#else +#if defined (CMU) + printf ("ns32k-encore-mach\n"); exit (0); +#else + printf ("ns32k-encore-bsd\n"); exit (0); +#endif +#endif +#endif + +#if defined (__386BSD__) + printf ("i386-pc-bsd\n"); exit (0); +#endif + +#if defined (sequent) +#if defined (i386) + printf ("i386-sequent-dynix\n"); exit (0); +#endif +#if defined (ns32000) + printf ("ns32k-sequent-dynix\n"); exit (0); +#endif +#endif + +#if defined (_SEQUENT_) + struct utsname un; + + uname(&un); + + if (strncmp(un.version, "V2", 2) == 0) { + printf ("i386-sequent-ptx2\n"); exit (0); + } + if (strncmp(un.version, "V1", 2) == 0) { /* XXX is V1 correct? */ + printf ("i386-sequent-ptx1\n"); exit (0); + } + printf ("i386-sequent-ptx\n"); exit (0); + +#endif + +#if defined (vax) +#if !defined (ultrix) + printf ("vax-dec-bsd\n"); exit (0); +#else + printf ("vax-dec-ultrix\n"); exit (0); +#endif +#endif + +#if defined (alliant) && defined (i860) + printf ("i860-alliant-bsd\n"); exit (0); +#endif + + exit (1); +} +EOF + +$CC_FOR_BUILD $dummy.c -o $dummy 2>/dev/null && ./$dummy && rm $dummy.c $dummy && exit 0 +rm -f $dummy.c $dummy + +# Apollos put the system type in the environment. + +test -d /usr/apollo && { echo ${ISP}-apollo-${SYSTYPE}; exit 0; } + +# Convex versions that predate uname can use getsysinfo(1) + +if [ -x /usr/convex/getsysinfo ] +then + case `getsysinfo -f cpu_type` in + c1*) + echo c1-convex-bsd + exit 0 ;; + c2*) + if getsysinfo -f scalar_acc + then echo c32-convex-bsd + else echo c2-convex-bsd + fi + exit 0 ;; + c34*) + echo c34-convex-bsd + exit 0 ;; + c38*) + echo c38-convex-bsd + exit 0 ;; + c4*) + echo c4-convex-bsd + exit 0 ;; + esac +fi + +#echo '(Unable to guess system type)' 1>&2 + +exit 1 diff --git a/xdelta-1.1.3/config.h b/xdelta-1.1.3/config.h new file mode 100644 index 0000000..8686136 --- /dev/null +++ b/xdelta-1.1.3/config.h @@ -0,0 +1,11 @@ +/* config.h. Generated automatically by configure. */ +/* config.h.in. Generated automatically from configure.in by autoheader. */ + +/* Define if you have the ANSI C header files. */ +#define STDC_HEADERS 1 + +/* Define if you can safely include both and . */ +#define TIME_WITH_SYS_TIME 1 + +/* Define if you have the gettimeofday function. */ +#define HAVE_GETTIMEOFDAY 1 diff --git a/xdelta-1.1.3/config.h.in b/xdelta-1.1.3/config.h.in new file mode 100644 index 0000000..c966e83 --- /dev/null +++ b/xdelta-1.1.3/config.h.in @@ -0,0 +1,10 @@ +/* config.h.in. Generated automatically from configure.in by autoheader. */ + +/* Define if you have the ANSI C header files. */ +#undef STDC_HEADERS + +/* Define if you can safely include both and . */ +#undef TIME_WITH_SYS_TIME + +/* Define if you have the gettimeofday function. */ +#undef HAVE_GETTIMEOFDAY diff --git a/xdelta-1.1.3/config.log b/xdelta-1.1.3/config.log new file mode 100644 index 0000000..9008180 --- /dev/null +++ b/xdelta-1.1.3/config.log @@ -0,0 +1,76 @@ +This file contains any messages produced by compilers while +running configure, to aid debugging if configure makes a mistake. + +configure:697: checking for a BSD compatible install +configure:750: checking whether build environment is sane +configure:807: checking whether make sets ${MAKE} +configure:846: checking for working aclocal +configure:859: checking for working autoconf +configure:872: checking for working automake +configure:885: checking for working autoheader +configure:898: checking for working makeinfo +configure:913: checking whether to enable maintainer-specific portions of Makefiles +configure:958: checking for gcc +configure:1071: checking whether the C compiler (gcc ) works +configure:1087: gcc -o conftest conftest.c 1>&5 +configure:1113: checking whether the C compiler (gcc ) is a cross-compiler +configure:1118: checking whether we are using GNU C +configure:1127: gcc -E conftest.c +configure:1146: checking whether gcc accepts -g +configure:1178: checking how to run the C preprocessor +configure:1199: gcc -E conftest.c >/dev/null 2>conftest.out +configure:1370: checking host system type +configure:1391: checking build system type +configure:1411: checking for ranlib +configure:1450: checking for ld used by GCC +configure:1513: checking if the linker (/usr/bin/ld) is GNU ld +configure:1529: checking for BSD-compatible nm +configure:1566: checking whether ln -s works +ltconfig:603: checking for object suffix +ltconfig:604: gcc -c -Wall -O3 conftest.c 1>&5 +ltconfig:629: checking for executable suffix +ltconfig:630: gcc -o conftest -Wall -O3 conftest.c 1>&5 +conftest.c:1: warning: return type defaults to `int' +ltconfig:776: checking if gcc PIC flag -fPIC works +ltconfig:777: gcc -c -Wall -O3 -fPIC -DPIC conftest.c 1>&5 +ltconfig:829: checking if gcc supports -c -o file.o +ltconfig:830: gcc -c -Wall -O3 -o out/conftest2.o conftest.c 1>&5 +ltconfig:862: checking if gcc supports -c -o file.lo +ltconfig:863: gcc -c -Wall -O3 -c -o conftest.lo conftest.c 1>&5 +ltconfig:914: checking if gcc supports -fno-rtti -fno-exceptions +ltconfig:915: gcc -c -Wall -O3 -fno-rtti -fno-exceptions -c conftest.c conftest.c 1>&5 +ltconfig:958: checking if gcc static flag -static works +ltconfig:959: gcc -o conftest -Wall -O3 -static conftest.c 1>&5 +conftest.c:1: warning: return type defaults to `int' +ld: can't locate file for: -lcrt0.o +ltconfig:1592: checking if global_symbol_pipe works +ltconfig:1593: gcc -c -Wall -O3 conftest.c 1>&5 +conftest.c:9: warning: return type defaults to `int' +ltconfig:1596: eval "/usr/bin/nm -p conftest.o | sed -n -e 's/^.*[ ]\([BCDEGRST]\)[ ][ ]*\(\)\([_A-Za-z][_A-Za-z0-9]*\)$/\1 \2\3 \3/p' > conftest.nm" +cannot find nm_test_var in conftest.nm +ltconfig:1592: checking if global_symbol_pipe works +ltconfig:1593: gcc -c -Wall -O3 conftest.c 1>&5 +conftest.c:9: warning: return type defaults to `int' +ltconfig:1596: eval "/usr/bin/nm -p conftest.o | sed -n -e 's/^.*[ ]\([BCDEGRST]\)[ ][ ]*\(_\)\([_A-Za-z][_A-Za-z0-9]*\)$/\1 \2\3 \3/p' > conftest.nm" +ltconfig:1648: gcc -o conftest -Wall -O3 -fno-builtin conftest.c conftstm.o 1>&5 +conftest.c:6: warning: `main' is usually a function +configure:1761: checking for ANSI C header files +configure:1774: gcc -E conftest.c >/dev/null 2>conftest.out +configure:1841: gcc -o conftest -Wall -O3 conftest.c 1>&5 +configure: In function `main': +configure:1836: warning: implicit declaration of function `exit' +configure:1865: checking whether make sets ${MAKE} +configure:1895: checking for gettimeofday +configure:1923: gcc -o conftest -Wall -O3 conftest.c 1>&5 +configure:1948: checking whether time.h and sys/time.h may both be included +configure:1962: gcc -c -Wall -O3 conftest.c 1>&5 +configure: In function `main': +configure:1958: warning: unused variable `tp' +configure:1988: checking for emacs +configure:2081: checking for glib-config +configure:2116: checking for GLIB - version >= 1.2.8 +configure:2215: gcc -o conftest -Wall -O3 -I/usr/local/include/glib-1.2 -I/usr/local/lib/glib/include conftest.c -L/usr/local/lib -lglib 1>&5 +configure:2299: checking for gzsetparams in -lz +configure:2318: gcc -o conftest -Wall -O3 conftest.c -lz 1>&5 +configure:2335: checking for zlib.h +configure:2345: gcc -E conftest.c >/dev/null 2>conftest.out diff --git a/xdelta-1.1.3/config.status b/xdelta-1.1.3/config.status new file mode 100755 index 0000000..ab97159 --- /dev/null +++ b/xdelta-1.1.3/config.status @@ -0,0 +1,277 @@ +#! /bin/sh +# Generated automatically by configure. +# Run this file to recreate the current configuration. +# This directory was configured as follows, +# on host Ryan-C-Gordons-Computer.local: +# +# ./configure --host=powerpc-apple +# +# Compiler output produced by configure, useful for debugging +# configure, is in ./config.log if it exists. + +ac_cs_usage="Usage: ./config.status [--recheck] [--version] [--help]" +for ac_option +do + case "$ac_option" in + -recheck | --recheck | --rechec | --reche | --rech | --rec | --re | --r) + echo "running ${CONFIG_SHELL-/bin/sh} ./configure --host=powerpc-apple --no-create --no-recursion" + exec ${CONFIG_SHELL-/bin/sh} ./configure --host=powerpc-apple --no-create --no-recursion ;; + -version | --version | --versio | --versi | --vers | --ver | --ve | --v) + echo "./config.status generated by autoconf version 2.13" + exit 0 ;; + -help | --help | --hel | --he | --h) + echo "$ac_cs_usage"; exit 0 ;; + *) echo "$ac_cs_usage"; exit 1 ;; + esac +done + +ac_given_srcdir=. +ac_given_INSTALL="/usr/bin/install -c" + +trap 'rm -fr Makefile + doc/Makefile + test/Makefile + djgpp/Makefile + xdelta-config + libedsio/Makefile + libedsio/edsio-comp config.h conftest*; exit 1' 1 2 15 + +# Protect against being on the right side of a sed subst in config.status. +sed 's/%@/@@/; s/@%/@@/; s/%g$/@g/; /@g$/s/[\\&%]/\\&/g; + s/@@/%@/; s/@@/@%/; s/@g$/%g/' > conftest.subs <<\CEOF +/^[ ]*VPATH[ ]*=[^:]*$/d + +s%@SHELL@%/bin/sh%g +s%@CFLAGS@% -Wall -O3%g +s%@CPPFLAGS@%%g +s%@CXXFLAGS@%%g +s%@FFLAGS@%%g +s%@DEFS@%-DHAVE_CONFIG_H%g +s%@LDFLAGS@%%g +s%@LIBS@%%g +s%@exec_prefix@%${prefix}%g +s%@prefix@%/usr/local%g +s%@program_transform_name@%s,x,x,%g +s%@bindir@%${exec_prefix}/bin%g +s%@sbindir@%${exec_prefix}/sbin%g +s%@libexecdir@%${exec_prefix}/libexec%g +s%@datadir@%${prefix}/share%g +s%@sysconfdir@%${prefix}/etc%g +s%@sharedstatedir@%${prefix}/com%g +s%@localstatedir@%${prefix}/var%g +s%@libdir@%${exec_prefix}/lib%g +s%@includedir@%${prefix}/include%g +s%@oldincludedir@%/usr/include%g +s%@infodir@%${prefix}/info%g +s%@mandir@%${prefix}/man%g +s%@INSTALL_PROGRAM@%${INSTALL}%g +s%@INSTALL_SCRIPT@%${INSTALL_PROGRAM}%g +s%@INSTALL_DATA@%${INSTALL} -m 644%g +s%@PACKAGE@%xdelta%g +s%@VERSION@%1.1.3%g +s%@ACLOCAL@%aclocal%g +s%@AUTOCONF@%autoconf%g +s%@AUTOMAKE@%automake%g +s%@AUTOHEADER@%autoheader%g +s%@MAKEINFO@%makeinfo%g +s%@SET_MAKE@%%g +s%@MAINTAINER_MODE_TRUE@%#%g +s%@MAINTAINER_MODE_FALSE@%%g +s%@MAINT@%#%g +s%@CC@%gcc%g +s%@CPP@%gcc -E%g +s%@host@%powerpc-apple-macos%g +s%@host_alias@%powerpc-apple%g +s%@host_cpu@%powerpc%g +s%@host_vendor@%apple%g +s%@host_os@%macos%g +s%@build@%powerpc-apple-macos%g +s%@build_alias@%powerpc-apple%g +s%@build_cpu@%powerpc%g +s%@build_vendor@%apple%g +s%@build_os@%macos%g +s%@RANLIB@%ranlib%g +s%@LD@%/usr/bin/ld%g +s%@NM@%/usr/bin/nm -p%g +s%@LN_S@%ln -s%g +s%@LIBTOOL@%$(SHELL) $(top_builddir)/libtool%g +s%@EMACS@%/usr/bin/emacs%g +s%@top_srcdir_absolute@%/Users/icculus/projects/mojopatch/xdelta-1.1.3%g +s%@GLIB_CONFIG@%/usr/local/bin/glib-config%g +s%@GLIB_CFLAGS@%-I/usr/local/include/glib-1.2 -I/usr/local/lib/glib/include%g +s%@GLIB_LIBS@%-L/usr/local/lib -lglib%g + +CEOF + +# Split the substitutions into bite-sized pieces for seds with +# small command number limits, like on Digital OSF/1 and HP-UX. +ac_max_sed_cmds=90 # Maximum number of lines to put in a sed script. +ac_file=1 # Number of current file. +ac_beg=1 # First line for current file. +ac_end=$ac_max_sed_cmds # Line after last line for current file. +ac_more_lines=: +ac_sed_cmds="" +while $ac_more_lines; do + if test $ac_beg -gt 1; then + sed "1,${ac_beg}d; ${ac_end}q" conftest.subs > conftest.s$ac_file + else + sed "${ac_end}q" conftest.subs > conftest.s$ac_file + fi + if test ! -s conftest.s$ac_file; then + ac_more_lines=false + rm -f conftest.s$ac_file + else + if test -z "$ac_sed_cmds"; then + ac_sed_cmds="sed -f conftest.s$ac_file" + else + ac_sed_cmds="$ac_sed_cmds | sed -f conftest.s$ac_file" + fi + ac_file=`expr $ac_file + 1` + ac_beg=$ac_end + ac_end=`expr $ac_end + $ac_max_sed_cmds` + fi +done +if test -z "$ac_sed_cmds"; then + ac_sed_cmds=cat +fi + +CONFIG_FILES=${CONFIG_FILES-"Makefile + doc/Makefile + test/Makefile + djgpp/Makefile + xdelta-config + libedsio/Makefile + libedsio/edsio-comp"} +for ac_file in .. $CONFIG_FILES; do if test "x$ac_file" != x..; then + # Support "outfile[:infile[:infile...]]", defaulting infile="outfile.in". + case "$ac_file" in + *:*) ac_file_in=`echo "$ac_file"|sed 's%[^:]*:%%'` + ac_file=`echo "$ac_file"|sed 's%:.*%%'` ;; + *) ac_file_in="${ac_file}.in" ;; + esac + + # Adjust a relative srcdir, top_srcdir, and INSTALL for subdirectories. + + # Remove last slash and all that follows it. Not all systems have dirname. + ac_dir=`echo $ac_file|sed 's%/[^/][^/]*$%%'` + if test "$ac_dir" != "$ac_file" && test "$ac_dir" != .; then + # The file is in a subdirectory. + test ! -d "$ac_dir" && mkdir "$ac_dir" + ac_dir_suffix="/`echo $ac_dir|sed 's%^\./%%'`" + # A "../" for each directory in $ac_dir_suffix. + ac_dots=`echo $ac_dir_suffix|sed 's%/[^/]*%../%g'` + else + ac_dir_suffix= ac_dots= + fi + + case "$ac_given_srcdir" in + .) srcdir=. + if test -z "$ac_dots"; then top_srcdir=. + else top_srcdir=`echo $ac_dots|sed 's%/$%%'`; fi ;; + /*) srcdir="$ac_given_srcdir$ac_dir_suffix"; top_srcdir="$ac_given_srcdir" ;; + *) # Relative path. + srcdir="$ac_dots$ac_given_srcdir$ac_dir_suffix" + top_srcdir="$ac_dots$ac_given_srcdir" ;; + esac + + case "$ac_given_INSTALL" in + [/$]*) INSTALL="$ac_given_INSTALL" ;; + *) INSTALL="$ac_dots$ac_given_INSTALL" ;; + esac + + echo creating "$ac_file" + rm -f "$ac_file" + configure_input="Generated automatically from `echo $ac_file_in|sed 's%.*/%%'` by configure." + case "$ac_file" in + *Makefile*) ac_comsub="1i\\ +# $configure_input" ;; + *) ac_comsub= ;; + esac + + ac_file_inputs=`echo $ac_file_in|sed -e "s%^%$ac_given_srcdir/%" -e "s%:% $ac_given_srcdir/%g"` + sed -e "$ac_comsub +s%@configure_input@%$configure_input%g +s%@srcdir@%$srcdir%g +s%@top_srcdir@%$top_srcdir%g +s%@INSTALL@%$INSTALL%g +" $ac_file_inputs | (eval "$ac_sed_cmds") > $ac_file +fi; done +rm -f conftest.s* + +# These sed commands are passed to sed as "A NAME B NAME C VALUE D", where +# NAME is the cpp macro being defined and VALUE is the value it is being given. +# +# ac_d sets the value in "#define NAME VALUE" lines. +ac_dA='s%^\([ ]*\)#\([ ]*define[ ][ ]*\)' +ac_dB='\([ ][ ]*\)[^ ]*%\1#\2' +ac_dC='\3' +ac_dD='%g' +# ac_u turns "#undef NAME" with trailing blanks into "#define NAME VALUE". +ac_uA='s%^\([ ]*\)#\([ ]*\)undef\([ ][ ]*\)' +ac_uB='\([ ]\)%\1#\2define\3' +ac_uC=' ' +ac_uD='\4%g' +# ac_e turns "#undef NAME" without trailing blanks into "#define NAME VALUE". +ac_eA='s%^\([ ]*\)#\([ ]*\)undef\([ ][ ]*\)' +ac_eB='$%\1#\2define\3' +ac_eC=' ' +ac_eD='%g' + +if test "${CONFIG_HEADERS+set}" != set; then + CONFIG_HEADERS="config.h" +fi +for ac_file in .. $CONFIG_HEADERS; do if test "x$ac_file" != x..; then + # Support "outfile[:infile[:infile...]]", defaulting infile="outfile.in". + case "$ac_file" in + *:*) ac_file_in=`echo "$ac_file"|sed 's%[^:]*:%%'` + ac_file=`echo "$ac_file"|sed 's%:.*%%'` ;; + *) ac_file_in="${ac_file}.in" ;; + esac + + echo creating $ac_file + + rm -f conftest.frag conftest.in conftest.out + ac_file_inputs=`echo $ac_file_in|sed -e "s%^%$ac_given_srcdir/%" -e "s%:% $ac_given_srcdir/%g"` + cat $ac_file_inputs > conftest.in + + cat > conftest.frag < conftest.out + rm -f conftest.in + mv conftest.out conftest.in + + rm -f conftest.frag conftest.h + echo "/* $ac_file. Generated automatically by configure. */" > conftest.h + cat conftest.in >> conftest.h + rm -f conftest.in + if cmp -s $ac_file conftest.h 2>/dev/null; then + echo "$ac_file is unchanged" + rm -f conftest.h + else + # Remove last slash and all that follows it. Not all systems have dirname. + ac_dir=`echo $ac_file|sed 's%/[^/][^/]*$%%'` + if test "$ac_dir" != "$ac_file" && test "$ac_dir" != .; then + # The file is in a subdirectory. + test ! -d "$ac_dir" && mkdir "$ac_dir" + fi + rm -f $ac_file + mv conftest.h $ac_file + fi +fi; done + + + +test -z "$CONFIG_HEADERS" || echo timestamp > stamp-h +chmod +x libedsio/edsio-comp xdelta-config + +exit 0 diff --git a/xdelta-1.1.3/config.sub b/xdelta-1.1.3/config.sub new file mode 100755 index 0000000..28426bb --- /dev/null +++ b/xdelta-1.1.3/config.sub @@ -0,0 +1,1232 @@ +#! /bin/sh +# Configuration validation subroutine script, version 1.1. +# Copyright (C) 1991, 92-97, 1998, 1999 Free Software Foundation, Inc. +# This file is (in principle) common to ALL GNU software. +# The presence of a machine in this file suggests that SOME GNU software +# can handle that machine. It does not imply ALL GNU software can. +# +# This file is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place - Suite 330, +# Boston, MA 02111-1307, USA. + +# As a special exception to the GNU General Public License, if you +# distribute this file as part of a program that contains a +# configuration script generated by Autoconf, you may include it under +# the same distribution terms that you use for the rest of that program. + +# Configuration subroutine to validate and canonicalize a configuration type. +# Supply the specified configuration type as an argument. +# If it is invalid, we print an error message on stderr and exit with code 1. +# Otherwise, we print the canonical config type on stdout and succeed. + +# This file is supposed to be the same for all GNU packages +# and recognize all the CPU types, system types and aliases +# that are meaningful with *any* GNU software. +# Each package is responsible for reporting which valid configurations +# it does not support. The user should be able to distinguish +# a failure to support a valid configuration from a meaningless +# configuration. + +# The goal of this file is to map all the various variations of a given +# machine specification into a single specification in the form: +# CPU_TYPE-MANUFACTURER-OPERATING_SYSTEM +# or in some cases, the newer four-part form: +# CPU_TYPE-MANUFACTURER-KERNEL-OPERATING_SYSTEM +# It is wrong to echo any other type of specification. + +if [ x$1 = x ] +then + echo Configuration name missing. 1>&2 + echo "Usage: $0 CPU-MFR-OPSYS" 1>&2 + echo "or $0 ALIAS" 1>&2 + echo where ALIAS is a recognized configuration type. 1>&2 + exit 1 +fi + +# First pass through any local machine types. +case $1 in + *local*) + echo $1 + exit 0 + ;; + *) + ;; +esac + +# Separate what the user gave into CPU-COMPANY and OS or KERNEL-OS (if any). +# Here we must recognize all the valid KERNEL-OS combinations. +maybe_os=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\2/'` +case $maybe_os in + linux-gnu*) + os=-$maybe_os + basic_machine=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\1/'` + ;; + *) + basic_machine=`echo $1 | sed 's/-[^-]*$//'` + if [ $basic_machine != $1 ] + then os=`echo $1 | sed 's/.*-/-/'` + else os=; fi + ;; +esac + +### Let's recognize common machines as not being operating systems so +### that things like config.sub decstation-3100 work. We also +### recognize some manufacturers as not being operating systems, so we +### can provide default operating systems below. +case $os in + -sun*os*) + # Prevent following clause from handling this invalid input. + ;; + -dec* | -mips* | -sequent* | -encore* | -pc532* | -sgi* | -sony* | \ + -att* | -7300* | -3300* | -delta* | -motorola* | -sun[234]* | \ + -unicom* | -ibm* | -next | -hp | -isi* | -apollo | -altos* | \ + -convergent* | -ncr* | -news | -32* | -3600* | -3100* | -hitachi* |\ + -c[123]* | -convex* | -sun | -crds | -omron* | -dg | -ultra | -tti* | \ + -harris | -dolphin | -highlevel | -gould | -cbm | -ns | -masscomp | \ + -apple) + os= + basic_machine=$1 + ;; + -sim | -cisco | -oki | -wec | -winbond) + os= + basic_machine=$1 + ;; + -scout) + ;; + -wrs) + os=-vxworks + basic_machine=$1 + ;; + -hiux*) + os=-hiuxwe2 + ;; + -sco5) + os=-sco3.2v5 + basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` + ;; + -sco4) + os=-sco3.2v4 + basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` + ;; + -sco3.2.[4-9]*) + os=`echo $os | sed -e 's/sco3.2./sco3.2v/'` + basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` + ;; + -sco3.2v[4-9]*) + # Don't forget version if it is 3.2v4 or newer. + basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` + ;; + -sco*) + os=-sco3.2v2 + basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` + ;; + -udk*) + basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` + ;; + -isc) + os=-isc2.2 + basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` + ;; + -clix*) + basic_machine=clipper-intergraph + ;; + -isc*) + basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` + ;; + -lynx*) + os=-lynxos + ;; + -ptx*) + basic_machine=`echo $1 | sed -e 's/86-.*/86-sequent/'` + ;; + -windowsnt*) + os=`echo $os | sed -e 's/windowsnt/winnt/'` + ;; + -psos*) + os=-psos + ;; + -mint | -mint[0-9]*) + basic_machine=m68k-atari + os=-mint + ;; +esac + +# Decode aliases for certain CPU-COMPANY combinations. +case $basic_machine in + # Recognize the basic CPU types without company name. + # Some are omitted here because they have special meanings below. + tahoe | i860 | ia64 | m32r | m68k | m68000 | m88k | ns32k | arc | arm \ + | arme[lb] | pyramid | mn10200 | mn10300 | tron | a29k \ + | 580 | i960 | h8300 \ + | hppa | hppa1.0 | hppa1.1 | hppa2.0 | hppa2.0w | hppa2.0n \ + | alpha | alphaev[4-7] | alphaev56 | alphapca5[67] \ + | we32k | ns16k | clipper | i370 | sh | powerpc | powerpcle \ + | 1750a | dsp16xx | pdp11 | mips16 | mips64 | mipsel | mips64el \ + | mips64orion | mips64orionel | mipstx39 | mipstx39el \ + | mips64vr4300 | mips64vr4300el | mips64vr4100 | mips64vr4100el \ + | mips64vr5000 | miprs64vr5000el | mcore \ + | sparc | sparclet | sparclite | sparc64 | sparcv9 | v850 | c4x \ + | thumb | d10v | fr30) + basic_machine=$basic_machine-unknown + ;; + m88110 | m680[12346]0 | m683?2 | m68360 | m5200 | z8k | v70 | h8500 | w65 | pj | pjl) + ;; + + # We use `pc' rather than `unknown' + # because (1) that's what they normally are, and + # (2) the word "unknown" tends to confuse beginning users. + i[34567]86) + basic_machine=$basic_machine-pc + ;; + # Object if more than one company name word. + *-*-*) + echo Invalid configuration \`$1\': machine \`$basic_machine\' not recognized 1>&2 + exit 1 + ;; + # Recognize the basic CPU types with company name. + # FIXME: clean up the formatting here. + vax-* | tahoe-* | i[34567]86-* | i860-* | ia64-* | m32r-* | m68k-* | m68000-* \ + | m88k-* | sparc-* | ns32k-* | fx80-* | arc-* | arm-* | c[123]* \ + | mips-* | pyramid-* | tron-* | a29k-* | romp-* | rs6000-* \ + | power-* | none-* | 580-* | cray2-* | h8300-* | h8500-* | i960-* \ + | xmp-* | ymp-* \ + | hppa-* | hppa1.0-* | hppa1.1-* | hppa2.0-* | hppa2.0w-* | hppa2.0n-* \ + | alpha-* | alphaev[4-7]-* | alphaev56-* | alphapca5[67]-* \ + | we32k-* | cydra-* | ns16k-* | pn-* | np1-* | xps100-* \ + | clipper-* | orion-* \ + | sparclite-* | pdp11-* | sh-* | powerpc-* | powerpcle-* \ + | sparc64-* | sparcv9-* | sparc86x-* | mips16-* | mips64-* | mipsel-* \ + | mips64el-* | mips64orion-* | mips64orionel-* \ + | mips64vr4100-* | mips64vr4100el-* | mips64vr4300-* | mips64vr4300el-* \ + | mipstx39-* | mipstx39el-* | mcore-* \ + | f301-* | armv*-* | t3e-* \ + | m88110-* | m680[01234]0-* | m683?2-* | m68360-* | z8k-* | d10v-* \ + | thumb-* | v850-* | d30v-* | tic30-* | c30-* | fr30-* ) + ;; + # Recognize the various machine names and aliases which stand + # for a CPU type and a company and sometimes even an OS. + 386bsd) + basic_machine=i386-unknown + os=-bsd + ;; + 3b1 | 7300 | 7300-att | att-7300 | pc7300 | safari | unixpc) + basic_machine=m68000-att + ;; + 3b*) + basic_machine=we32k-att + ;; + a29khif) + basic_machine=a29k-amd + os=-udi + ;; + adobe68k) + basic_machine=m68010-adobe + os=-scout + ;; + alliant | fx80) + basic_machine=fx80-alliant + ;; + altos | altos3068) + basic_machine=m68k-altos + ;; + am29k) + basic_machine=a29k-none + os=-bsd + ;; + amdahl) + basic_machine=580-amdahl + os=-sysv + ;; + amiga | amiga-*) + basic_machine=m68k-cbm + ;; + amigaos | amigados) + basic_machine=m68k-cbm + os=-amigaos + ;; + amigaunix | amix) + basic_machine=m68k-cbm + os=-sysv4 + ;; + apollo68) + basic_machine=m68k-apollo + os=-sysv + ;; + apollo68bsd) + basic_machine=m68k-apollo + os=-bsd + ;; + aux) + basic_machine=m68k-apple + os=-aux + ;; + balance) + basic_machine=ns32k-sequent + os=-dynix + ;; + convex-c1) + basic_machine=c1-convex + os=-bsd + ;; + convex-c2) + basic_machine=c2-convex + os=-bsd + ;; + convex-c32) + basic_machine=c32-convex + os=-bsd + ;; + convex-c34) + basic_machine=c34-convex + os=-bsd + ;; + convex-c38) + basic_machine=c38-convex + os=-bsd + ;; + cray | ymp) + basic_machine=ymp-cray + os=-unicos + ;; + cray2) + basic_machine=cray2-cray + os=-unicos + ;; + [ctj]90-cray) + basic_machine=c90-cray + os=-unicos + ;; + crds | unos) + basic_machine=m68k-crds + ;; + da30 | da30-*) + basic_machine=m68k-da30 + ;; + decstation | decstation-3100 | pmax | pmax-* | pmin | dec3100 | decstatn) + basic_machine=mips-dec + ;; + delta | 3300 | motorola-3300 | motorola-delta \ + | 3300-motorola | delta-motorola) + basic_machine=m68k-motorola + ;; + delta88) + basic_machine=m88k-motorola + os=-sysv3 + ;; + dpx20 | dpx20-*) + basic_machine=rs6000-bull + os=-bosx + ;; + dpx2* | dpx2*-bull) + basic_machine=m68k-bull + os=-sysv3 + ;; + ebmon29k) + basic_machine=a29k-amd + os=-ebmon + ;; + elxsi) + basic_machine=elxsi-elxsi + os=-bsd + ;; + encore | umax | mmax) + basic_machine=ns32k-encore + ;; + es1800 | OSE68k | ose68k | ose | OSE) + basic_machine=m68k-ericsson + os=-ose + ;; + fx2800) + basic_machine=i860-alliant + ;; + genix) + basic_machine=ns32k-ns + ;; + gmicro) + basic_machine=tron-gmicro + os=-sysv + ;; + h3050r* | hiux*) + basic_machine=hppa1.1-hitachi + os=-hiuxwe2 + ;; + h8300hms) + basic_machine=h8300-hitachi + os=-hms + ;; + h8300xray) + basic_machine=h8300-hitachi + os=-xray + ;; + h8500hms) + basic_machine=h8500-hitachi + os=-hms + ;; + harris) + basic_machine=m88k-harris + os=-sysv3 + ;; + hp300-*) + basic_machine=m68k-hp + ;; + hp300bsd) + basic_machine=m68k-hp + os=-bsd + ;; + hp300hpux) + basic_machine=m68k-hp + os=-hpux + ;; + hp3k9[0-9][0-9] | hp9[0-9][0-9]) + basic_machine=hppa1.0-hp + ;; + hp9k2[0-9][0-9] | hp9k31[0-9]) + basic_machine=m68000-hp + ;; + hp9k3[2-9][0-9]) + basic_machine=m68k-hp + ;; + hp9k6[0-9][0-9] | hp6[0-9][0-9]) + basic_machine=hppa1.0-hp + ;; + hp9k7[0-79][0-9] | hp7[0-79][0-9]) + basic_machine=hppa1.1-hp + ;; + hp9k78[0-9] | hp78[0-9]) + # FIXME: really hppa2.0-hp + basic_machine=hppa1.1-hp + ;; + hp9k8[67]1 | hp8[67]1 | hp9k80[24] | hp80[24] | hp9k8[78]9 | hp8[78]9 | hp9k893 | hp893) + # FIXME: really hppa2.0-hp + basic_machine=hppa1.1-hp + ;; + hp9k8[0-9][13679] | hp8[0-9][13679]) + basic_machine=hppa1.1-hp + ;; + hp9k8[0-9][0-9] | hp8[0-9][0-9]) + basic_machine=hppa1.0-hp + ;; + hppa-next) + os=-nextstep3 + ;; + hppaosf) + basic_machine=hppa1.1-hp + os=-osf + ;; + hppro) + basic_machine=hppa1.1-hp + os=-proelf + ;; + i370-ibm* | ibm*) + basic_machine=i370-ibm + ;; +# I'm not sure what "Sysv32" means. Should this be sysv3.2? + i[34567]86v32) + basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'` + os=-sysv32 + ;; + i[34567]86v4*) + basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'` + os=-sysv4 + ;; + i[34567]86v) + basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'` + os=-sysv + ;; + i[34567]86sol2) + basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'` + os=-solaris2 + ;; + i386mach) + basic_machine=i386-mach + os=-mach + ;; + i386-vsta | vsta) + basic_machine=i386-unknown + os=-vsta + ;; + i386-go32 | go32) + basic_machine=i386-unknown + os=-go32 + ;; + i386-mingw32 | mingw32) + basic_machine=i386-unknown + os=-mingw32 + ;; + i386-qnx | qnx) + basic_machine=i386-qnx + ;; + iris | iris4d) + basic_machine=mips-sgi + case $os in + -irix*) + ;; + *) + os=-irix4 + ;; + esac + ;; + isi68 | isi) + basic_machine=m68k-isi + os=-sysv + ;; + m88k-omron*) + basic_machine=m88k-omron + ;; + magnum | m3230) + basic_machine=mips-mips + os=-sysv + ;; + merlin) + basic_machine=ns32k-utek + os=-sysv + ;; + miniframe) + basic_machine=m68000-convergent + ;; + *mint | -mint[0-9]* | *MiNT | *MiNT[0-9]*) + basic_machine=m68k-atari + os=-mint + ;; + mipsel*-linux*) + basic_machine=mipsel-unknown + os=-linux-gnu + ;; + mips*-linux*) + basic_machine=mips-unknown + os=-linux-gnu + ;; + mips3*-*) + basic_machine=`echo $basic_machine | sed -e 's/mips3/mips64/'` + ;; + mips3*) + basic_machine=`echo $basic_machine | sed -e 's/mips3/mips64/'`-unknown + ;; + monitor) + basic_machine=m68k-rom68k + os=-coff + ;; + msdos) + basic_machine=i386-unknown + os=-msdos + ;; + mvs) + basic_machine=i370-ibm + os=-mvs + ;; + ncr3000) + basic_machine=i486-ncr + os=-sysv4 + ;; + netbsd386) + basic_machine=i386-unknown + os=-netbsd + ;; + netwinder) + basic_machine=armv4l-rebel + os=-linux + ;; + news | news700 | news800 | news900) + basic_machine=m68k-sony + os=-newsos + ;; + news1000) + basic_machine=m68030-sony + os=-newsos + ;; + news-3600 | risc-news) + basic_machine=mips-sony + os=-newsos + ;; + necv70) + basic_machine=v70-nec + os=-sysv + ;; + next | m*-next ) + basic_machine=m68k-next + case $os in + -nextstep* ) + ;; + -ns2*) + os=-nextstep2 + ;; + *) + os=-nextstep3 + ;; + esac + ;; + nh3000) + basic_machine=m68k-harris + os=-cxux + ;; + nh[45]000) + basic_machine=m88k-harris + os=-cxux + ;; + nindy960) + basic_machine=i960-intel + os=-nindy + ;; + mon960) + basic_machine=i960-intel + os=-mon960 + ;; + np1) + basic_machine=np1-gould + ;; + op50n-* | op60c-*) + basic_machine=hppa1.1-oki + os=-proelf + ;; + OSE68000 | ose68000) + basic_machine=m68000-ericsson + os=-ose + ;; + os68k) + basic_machine=m68k-none + os=-os68k + ;; + pa-hitachi) + basic_machine=hppa1.1-hitachi + os=-hiuxwe2 + ;; + paragon) + basic_machine=i860-intel + os=-osf + ;; + pbd) + basic_machine=sparc-tti + ;; + pbb) + basic_machine=m68k-tti + ;; + pc532 | pc532-*) + basic_machine=ns32k-pc532 + ;; + pentium | p5 | k5 | k6 | nexen) + basic_machine=i586-pc + ;; + pentiumpro | p6 | 6x86) + basic_machine=i686-pc + ;; + pentiumii | pentium2) + basic_machine=i786-pc + ;; + pentium-* | p5-* | k5-* | k6-* | nexen-*) + basic_machine=i586-`echo $basic_machine | sed 's/^[^-]*-//'` + ;; + pentiumpro-* | p6-* | 6x86-*) + basic_machine=i686-`echo $basic_machine | sed 's/^[^-]*-//'` + ;; + pentiumii-* | pentium2-*) + basic_machine=i786-`echo $basic_machine | sed 's/^[^-]*-//'` + ;; + pn) + basic_machine=pn-gould + ;; + power) basic_machine=rs6000-ibm + ;; + ppc) basic_machine=powerpc-unknown + ;; + ppc-*) basic_machine=powerpc-`echo $basic_machine | sed 's/^[^-]*-//'` + ;; + ppcle | powerpclittle | ppc-le | powerpc-little) + basic_machine=powerpcle-unknown + ;; + ppcle-* | powerpclittle-*) + basic_machine=powerpcle-`echo $basic_machine | sed 's/^[^-]*-//'` + ;; + ps2) + basic_machine=i386-ibm + ;; + rom68k) + basic_machine=m68k-rom68k + os=-coff + ;; + rm[46]00) + basic_machine=mips-siemens + ;; + rtpc | rtpc-*) + basic_machine=romp-ibm + ;; + sa29200) + basic_machine=a29k-amd + os=-udi + ;; + sequent) + basic_machine=i386-sequent + ;; + sh) + basic_machine=sh-hitachi + os=-hms + ;; + sparclite-wrs) + basic_machine=sparclite-wrs + os=-vxworks + ;; + sps7) + basic_machine=m68k-bull + os=-sysv2 + ;; + spur) + basic_machine=spur-unknown + ;; + st2000) + basic_machine=m68k-tandem + ;; + stratus) + basic_machine=i860-stratus + os=-sysv4 + ;; + sun2) + basic_machine=m68000-sun + ;; + sun2os3) + basic_machine=m68000-sun + os=-sunos3 + ;; + sun2os4) + basic_machine=m68000-sun + os=-sunos4 + ;; + sun3os3) + basic_machine=m68k-sun + os=-sunos3 + ;; + sun3os4) + basic_machine=m68k-sun + os=-sunos4 + ;; + sun4os3) + basic_machine=sparc-sun + os=-sunos3 + ;; + sun4os4) + basic_machine=sparc-sun + os=-sunos4 + ;; + sun4sol2) + basic_machine=sparc-sun + os=-solaris2 + ;; + sun3 | sun3-*) + basic_machine=m68k-sun + ;; + sun4) + basic_machine=sparc-sun + ;; + sun386 | sun386i | roadrunner) + basic_machine=i386-sun + ;; + symmetry) + basic_machine=i386-sequent + os=-dynix + ;; + t3e) + basic_machine=t3e-cray + os=-unicos + ;; + tx39) + basic_machine=mipstx39-unknown + ;; + tx39el) + basic_machine=mipstx39el-unknown + ;; + tower | tower-32) + basic_machine=m68k-ncr + ;; + udi29k) + basic_machine=a29k-amd + os=-udi + ;; + ultra3) + basic_machine=a29k-nyu + os=-sym1 + ;; + v810 | necv810) + basic_machine=v810-nec + os=-none + ;; + vaxv) + basic_machine=vax-dec + os=-sysv + ;; + vms) + basic_machine=vax-dec + os=-vms + ;; + vpp*|vx|vx-*) + basic_machine=f301-fujitsu + ;; + vxworks960) + basic_machine=i960-wrs + os=-vxworks + ;; + vxworks68) + basic_machine=m68k-wrs + os=-vxworks + ;; + vxworks29k) + basic_machine=a29k-wrs + os=-vxworks + ;; + w65*) + basic_machine=w65-wdc + os=-none + ;; + w89k-*) + basic_machine=hppa1.1-winbond + os=-proelf + ;; + xmp) + basic_machine=xmp-cray + os=-unicos + ;; + xps | xps100) + basic_machine=xps100-honeywell + ;; + z8k-*-coff) + basic_machine=z8k-unknown + os=-sim + ;; + none) + basic_machine=none-none + os=-none + ;; + +# Here we handle the default manufacturer of certain CPU types. It is in +# some cases the only manufacturer, in others, it is the most popular. + w89k) + basic_machine=hppa1.1-winbond + ;; + op50n) + basic_machine=hppa1.1-oki + ;; + op60c) + basic_machine=hppa1.1-oki + ;; + mips) + if [ x$os = x-linux-gnu ]; then + basic_machine=mips-unknown + else + basic_machine=mips-mips + fi + ;; + romp) + basic_machine=romp-ibm + ;; + rs6000) + basic_machine=rs6000-ibm + ;; + vax) + basic_machine=vax-dec + ;; + pdp11) + basic_machine=pdp11-dec + ;; + we32k) + basic_machine=we32k-att + ;; + sparc | sparcv9) + basic_machine=sparc-sun + ;; + cydra) + basic_machine=cydra-cydrome + ;; + orion) + basic_machine=orion-highlevel + ;; + orion105) + basic_machine=clipper-highlevel + ;; + mac | mpw | mac-mpw) + basic_machine=m68k-apple + ;; + pmac | pmac-mpw) + basic_machine=powerpc-apple + ;; + c4x*) + basic_machine=c4x-none + os=-coff + ;; + *) + echo Invalid configuration \`$1\': machine \`$basic_machine\' not recognized 1>&2 + exit 1 + ;; +esac + +# Here we canonicalize certain aliases for manufacturers. +case $basic_machine in + *-digital*) + basic_machine=`echo $basic_machine | sed 's/digital.*/dec/'` + ;; + *-commodore*) + basic_machine=`echo $basic_machine | sed 's/commodore.*/cbm/'` + ;; + *) + ;; +esac + +# Decode manufacturer-specific aliases for certain operating systems. + +if [ x"$os" != x"" ] +then +case $os in + # First match some system type aliases + # that might get confused with valid system types. + # -solaris* is a basic system type, with this one exception. + -solaris1 | -solaris1.*) + os=`echo $os | sed -e 's|solaris1|sunos4|'` + ;; + -solaris) + os=-solaris2 + ;; + -svr4*) + os=-sysv4 + ;; + -unixware*) + os=-sysv4.2uw + ;; + -gnu/linux*) + os=`echo $os | sed -e 's|gnu/linux|linux-gnu|'` + ;; + # First accept the basic system types. + # The portable systems comes first. + # Each alternative MUST END IN A *, to match a version number. + # -sysv* is not here because it comes later, after sysvr4. + -gnu* | -bsd* | -mach* | -minix* | -genix* | -ultrix* | -irix* \ + | -*vms* | -sco* | -esix* | -isc* | -aix* | -sunos | -sunos[34]*\ + | -hpux* | -unos* | -osf* | -luna* | -dgux* | -solaris* | -sym* \ + | -amigaos* | -amigados* | -msdos* | -newsos* | -unicos* | -aof* \ + | -aos* \ + | -nindy* | -vxsim* | -vxworks* | -ebmon* | -hms* | -mvs* \ + | -clix* | -riscos* | -uniplus* | -iris* | -rtu* | -xenix* \ + | -hiux* | -386bsd* | -netbsd* | -openbsd* | -freebsd* | -riscix* \ + | -lynxos* | -bosx* | -nextstep* | -cxux* | -aout* | -elf* | -oabi* \ + | -ptx* | -coff* | -ecoff* | -winnt* | -domain* | -vsta* \ + | -udi* | -eabi* | -lites* | -ieee* | -go32* | -aux* \ + | -cygwin* | -pe* | -psos* | -moss* | -proelf* | -rtems* \ + | -mingw32* | -linux-gnu* | -uxpv* | -beos* | -mpeix* | -udk* \ + | -interix* | -uwin* | -rhapsody* | -opened* | -openstep* | -oskit*) + # Remember, each alternative MUST END IN *, to match a version number. + ;; + -sim | -es1800* | -hms* | -xray | -os68k* | -none* | -v88r* \ + | -windows* | -osx | -abug | -netware* | -os9* | -beos* \ + | -macos* | -mpw* | -magic* | -mon960* | -lnews*) + ;; + -mac*) + os=`echo $os | sed -e 's|mac|macos|'` + ;; + -linux*) + os=`echo $os | sed -e 's|linux|linux-gnu|'` + ;; + -sunos5*) + os=`echo $os | sed -e 's|sunos5|solaris2|'` + ;; + -sunos6*) + os=`echo $os | sed -e 's|sunos6|solaris3|'` + ;; + -opened*) + os=-openedition + ;; + -osfrose*) + os=-osfrose + ;; + -osf*) + os=-osf + ;; + -utek*) + os=-bsd + ;; + -dynix*) + os=-bsd + ;; + -acis*) + os=-aos + ;; + -386bsd) + os=-bsd + ;; + -ctix* | -uts*) + os=-sysv + ;; + -ns2 ) + os=-nextstep2 + ;; + # Preserve the version number of sinix5. + -sinix5.*) + os=`echo $os | sed -e 's|sinix|sysv|'` + ;; + -sinix*) + os=-sysv4 + ;; + -triton*) + os=-sysv3 + ;; + -oss*) + os=-sysv3 + ;; + -qnx) + os=-qnx4 + ;; + -svr4) + os=-sysv4 + ;; + -svr3) + os=-sysv3 + ;; + -sysvr4) + os=-sysv4 + ;; + # This must come after -sysvr4. + -sysv*) + ;; + -ose*) + os=-ose + ;; + -es1800*) + os=-ose + ;; + -xenix) + os=-xenix + ;; + -*mint | -*MiNT) + os=-mint + ;; + -none) + ;; + *) + # Get rid of the `-' at the beginning of $os. + os=`echo $os | sed 's/[^-]*-//'` + echo Invalid configuration \`$1\': system \`$os\' not recognized 1>&2 + exit 1 + ;; +esac +else + +# Here we handle the default operating systems that come with various machines. +# The value should be what the vendor currently ships out the door with their +# machine or put another way, the most popular os provided with the machine. + +# Note that if you're going to try to match "-MANUFACTURER" here (say, +# "-sun"), then you have to tell the case statement up towards the top +# that MANUFACTURER isn't an operating system. Otherwise, code above +# will signal an error saying that MANUFACTURER isn't an operating +# system, and we'll never get to this point. + +case $basic_machine in + *-acorn) + os=-riscix1.2 + ;; + arm*-rebel) + os=-linux + ;; + arm*-semi) + os=-aout + ;; + pdp11-*) + os=-none + ;; + *-dec | vax-*) + os=-ultrix4.2 + ;; + m68*-apollo) + os=-domain + ;; + i386-sun) + os=-sunos4.0.2 + ;; + m68000-sun) + os=-sunos3 + # This also exists in the configure program, but was not the + # default. + # os=-sunos4 + ;; + m68*-cisco) + os=-aout + ;; + mips*-cisco) + os=-elf + ;; + mips*-*) + os=-elf + ;; + *-tti) # must be before sparc entry or we get the wrong os. + os=-sysv3 + ;; + sparc-* | *-sun) + os=-sunos4.1.1 + ;; + *-be) + os=-beos + ;; + *-ibm) + os=-aix + ;; + *-wec) + os=-proelf + ;; + *-winbond) + os=-proelf + ;; + *-oki) + os=-proelf + ;; + *-hp) + os=-hpux + ;; + *-hitachi) + os=-hiux + ;; + i860-* | *-att | *-ncr | *-altos | *-motorola | *-convergent) + os=-sysv + ;; + *-cbm) + os=-amigaos + ;; + *-dg) + os=-dgux + ;; + *-dolphin) + os=-sysv3 + ;; + m68k-ccur) + os=-rtu + ;; + m88k-omron*) + os=-luna + ;; + *-next ) + os=-nextstep + ;; + *-sequent) + os=-ptx + ;; + *-crds) + os=-unos + ;; + *-ns) + os=-genix + ;; + i370-*) + os=-mvs + ;; + *-next) + os=-nextstep3 + ;; + *-gould) + os=-sysv + ;; + *-highlevel) + os=-bsd + ;; + *-encore) + os=-bsd + ;; + *-sgi) + os=-irix + ;; + *-siemens) + os=-sysv4 + ;; + *-masscomp) + os=-rtu + ;; + f301-fujitsu) + os=-uxpv + ;; + *-rom68k) + os=-coff + ;; + *-*bug) + os=-coff + ;; + *-apple) + os=-macos + ;; + *-atari*) + os=-mint + ;; + *) + os=-none + ;; +esac +fi + +# Here we handle the case where we know the os, and the CPU type, but not the +# manufacturer. We pick the logical manufacturer. +vendor=unknown +case $basic_machine in + *-unknown) + case $os in + -riscix*) + vendor=acorn + ;; + -sunos*) + vendor=sun + ;; + -aix*) + vendor=ibm + ;; + -beos*) + vendor=be + ;; + -hpux*) + vendor=hp + ;; + -mpeix*) + vendor=hp + ;; + -hiux*) + vendor=hitachi + ;; + -unos*) + vendor=crds + ;; + -dgux*) + vendor=dg + ;; + -luna*) + vendor=omron + ;; + -genix*) + vendor=ns + ;; + -mvs* | -opened*) + vendor=ibm + ;; + -ptx*) + vendor=sequent + ;; + -vxsim* | -vxworks*) + vendor=wrs + ;; + -aux*) + vendor=apple + ;; + -hms*) + vendor=hitachi + ;; + -mpw* | -macos*) + vendor=apple + ;; + -*mint | -*MiNT) + vendor=atari + ;; + esac + basic_machine=`echo $basic_machine | sed "s/unknown/$vendor/"` + ;; +esac + +echo $basic_machine$os diff --git a/xdelta-1.1.3/configure b/xdelta-1.1.3/configure new file mode 100755 index 0000000..a66789f --- /dev/null +++ b/xdelta-1.1.3/configure @@ -0,0 +1,2774 @@ +#! /bin/sh + +# From configure.in configure.in,v 1.2 1998/10/03 00:17:50 jmacd Exp + + +# Like AC_CONFIG_HEADER, but automatically create stamp file. + + + +# Do all the work for Automake. This macro actually does too much -- +# some checks are only needed if your package does certain things. +# But this isn't really a big deal. + +# serial 1 + + + + +# +# Check to make sure that the build environment is sane. +# + + + + + +# Add --enable-maintainer-mode option to configure. +# From Jim Meyering + +# serial 1 + + + +# Define a conditional. + + + + +# serial 40 AC_PROG_LIBTOOL + + + + +# AC_LIBTOOL_DLOPEN - enable checks for dlopen support + + +# AC_LIBTOOL_WIN32_DLL - declare package support for building win32 dll's + + +# AC_ENABLE_SHARED - implement the --enable-shared flag +# Usage: AC_ENABLE_SHARED[(DEFAULT)] +# Where DEFAULT is either `yes' or `no'. If omitted, it defaults to +# `yes'. + + +# AC_DISABLE_SHARED - set the default shared flag to --disable-shared + + +# AC_ENABLE_STATIC - implement the --enable-static flag +# Usage: AC_ENABLE_STATIC[(DEFAULT)] +# Where DEFAULT is either `yes' or `no'. If omitted, it defaults to +# `yes'. + + +# AC_DISABLE_STATIC - set the default static flag to --disable-static + + + +# AC_ENABLE_FAST_INSTALL - implement the --enable-fast-install flag +# Usage: AC_ENABLE_FAST_INSTALL[(DEFAULT)] +# Where DEFAULT is either `yes' or `no'. If omitted, it defaults to +# `yes'. + + +# AC_ENABLE_FAST_INSTALL - set the default to --disable-fast-install + + +# AC_PROG_LD - find the path to the GNU or non-GNU linker + + + + +# AC_PROG_NM - find the path to a BSD-compatible name lister + + +# AC_CHECK_LIBM - check for math library + + +# AC_LIBLTDL_CONVENIENCE[(dir)] - sets LIBLTDL to the link flags for +# the libltdl convenience library, adds --enable-ltdl-convenience to +# the configure arguments. Note that LIBLTDL is not AC_SUBSTed, nor +# is AC_CONFIG_SUBDIRS called. If DIR is not provided, it is assumed +# to be `${top_builddir}/libltdl'. Make sure you start DIR with +# '${top_builddir}/' (note the single quotes!) if your package is not +# flat, and, if you're not using automake, define top_builddir as +# appropriate in the Makefiles. + + +# AC_LIBLTDL_INSTALLABLE[(dir)] - sets LIBLTDL to the link flags for +# the libltdl installable library, and adds --enable-ltdl-install to +# the configure arguments. Note that LIBLTDL is not AC_SUBSTed, nor +# is AC_CONFIG_SUBDIRS called. If DIR is not provided, it is assumed +# to be `${top_builddir}/libltdl'. Make sure you start DIR with +# '${top_builddir}/' (note the single quotes!) if your package is not +# flat, and, if you're not using automake, define top_builddir as +# appropriate in the Makefiles. +# In the future, this macro may have to be called after AC_PROG_LIBTOOL. + + + + +# Configure paths for GLIB +# Owen Taylor 97-11-3 + + + +# Guess values for system-dependent variables and create Makefiles. +# Generated automatically using autoconf version 2.13 +# Copyright (C) 1992, 93, 94, 95, 96 Free Software Foundation, Inc. +# +# This configure script is free software; the Free Software Foundation +# gives unlimited permission to copy, distribute and modify it. + +# Defaults: +ac_help= +ac_default_prefix=/usr/local +# Any additions from configure.in: +ac_help="$ac_help + --enable-maintainer-mode enable make rules and dependencies not useful + (and sometimes confusing) to the casual installer" +ac_help="$ac_help + --enable-debug turn on debugging [default=no]" +ac_help="$ac_help + --enable-profile turn on profiling [default=no]" +ac_help="$ac_help + --enable-shared[=PKGS] build shared libraries [default=yes]" +ac_help="$ac_help + --enable-static[=PKGS] build static libraries [default=yes]" +ac_help="$ac_help + --enable-fast-install[=PKGS] optimize for fast installation [default=yes]" +ac_help="$ac_help + --with-gnu-ld assume the C compiler uses GNU ld [default=no]" +ac_help="$ac_help + --disable-libtool-lock avoid locking (might break parallel builds)" +ac_help="$ac_help + --with-glib-prefix=PFX Prefix where GLIB is installed (optional)" +ac_help="$ac_help + --with-glib-exec-prefix=PFX Exec prefix where GLIB is installed (optional)" +ac_help="$ac_help + --disable-glibtest Do not try to compile and run a test GLIB program" + +# Initialize some variables set by options. +# The variables have the same names as the options, with +# dashes changed to underlines. +build=NONE +cache_file=./config.cache +exec_prefix=NONE +host=NONE +no_create= +nonopt=NONE +no_recursion= +prefix=NONE +program_prefix=NONE +program_suffix=NONE +program_transform_name=s,x,x, +silent= +site= +srcdir= +target=NONE +verbose= +x_includes=NONE +x_libraries=NONE +bindir='${exec_prefix}/bin' +sbindir='${exec_prefix}/sbin' +libexecdir='${exec_prefix}/libexec' +datadir='${prefix}/share' +sysconfdir='${prefix}/etc' +sharedstatedir='${prefix}/com' +localstatedir='${prefix}/var' +libdir='${exec_prefix}/lib' +includedir='${prefix}/include' +oldincludedir='/usr/include' +infodir='${prefix}/info' +mandir='${prefix}/man' + +# Initialize some other variables. +subdirs= +MFLAGS= MAKEFLAGS= +SHELL=${CONFIG_SHELL-/bin/sh} +# Maximum number of lines to put in a shell here document. +ac_max_here_lines=12 + +ac_prev= +for ac_option +do + + # If the previous option needs an argument, assign it. + if test -n "$ac_prev"; then + eval "$ac_prev=\$ac_option" + ac_prev= + continue + fi + + case "$ac_option" in + -*=*) ac_optarg=`echo "$ac_option" | sed 's/[-_a-zA-Z0-9]*=//'` ;; + *) ac_optarg= ;; + esac + + # Accept the important Cygnus configure options, so we can diagnose typos. + + case "$ac_option" in + + -bindir | --bindir | --bindi | --bind | --bin | --bi) + ac_prev=bindir ;; + -bindir=* | --bindir=* | --bindi=* | --bind=* | --bin=* | --bi=*) + bindir="$ac_optarg" ;; + + -build | --build | --buil | --bui | --bu) + ac_prev=build ;; + -build=* | --build=* | --buil=* | --bui=* | --bu=*) + build="$ac_optarg" ;; + + -cache-file | --cache-file | --cache-fil | --cache-fi \ + | --cache-f | --cache- | --cache | --cach | --cac | --ca | --c) + ac_prev=cache_file ;; + -cache-file=* | --cache-file=* | --cache-fil=* | --cache-fi=* \ + | --cache-f=* | --cache-=* | --cache=* | --cach=* | --cac=* | --ca=* | --c=*) + cache_file="$ac_optarg" ;; + + -datadir | --datadir | --datadi | --datad | --data | --dat | --da) + ac_prev=datadir ;; + -datadir=* | --datadir=* | --datadi=* | --datad=* | --data=* | --dat=* \ + | --da=*) + datadir="$ac_optarg" ;; + + -disable-* | --disable-*) + ac_feature=`echo $ac_option|sed -e 's/-*disable-//'` + # Reject names that are not valid shell variable names. + if test -n "`echo $ac_feature| sed 's/[-a-zA-Z0-9_]//g'`"; then + { echo "configure: error: $ac_feature: invalid feature name" 1>&2; exit 1; } + fi + ac_feature=`echo $ac_feature| sed 's/-/_/g'` + eval "enable_${ac_feature}=no" ;; + + -enable-* | --enable-*) + ac_feature=`echo $ac_option|sed -e 's/-*enable-//' -e 's/=.*//'` + # Reject names that are not valid shell variable names. + if test -n "`echo $ac_feature| sed 's/[-_a-zA-Z0-9]//g'`"; then + { echo "configure: error: $ac_feature: invalid feature name" 1>&2; exit 1; } + fi + ac_feature=`echo $ac_feature| sed 's/-/_/g'` + case "$ac_option" in + *=*) ;; + *) ac_optarg=yes ;; + esac + eval "enable_${ac_feature}='$ac_optarg'" ;; + + -exec-prefix | --exec_prefix | --exec-prefix | --exec-prefi \ + | --exec-pref | --exec-pre | --exec-pr | --exec-p | --exec- \ + | --exec | --exe | --ex) + ac_prev=exec_prefix ;; + -exec-prefix=* | --exec_prefix=* | --exec-prefix=* | --exec-prefi=* \ + | --exec-pref=* | --exec-pre=* | --exec-pr=* | --exec-p=* | --exec-=* \ + | --exec=* | --exe=* | --ex=*) + exec_prefix="$ac_optarg" ;; + + -gas | --gas | --ga | --g) + # Obsolete; use --with-gas. + with_gas=yes ;; + + -help | --help | --hel | --he) + # Omit some internal or obsolete options to make the list less imposing. + # This message is too long to be a string in the A/UX 3.1 sh. + cat << EOF +Usage: configure [options] [host] +Options: [defaults in brackets after descriptions] +Configuration: + --cache-file=FILE cache test results in FILE + --help print this message + --no-create do not create output files + --quiet, --silent do not print \`checking...' messages + --version print the version of autoconf that created configure +Directory and file names: + --prefix=PREFIX install architecture-independent files in PREFIX + [$ac_default_prefix] + --exec-prefix=EPREFIX install architecture-dependent files in EPREFIX + [same as prefix] + --bindir=DIR user executables in DIR [EPREFIX/bin] + --sbindir=DIR system admin executables in DIR [EPREFIX/sbin] + --libexecdir=DIR program executables in DIR [EPREFIX/libexec] + --datadir=DIR read-only architecture-independent data in DIR + [PREFIX/share] + --sysconfdir=DIR read-only single-machine data in DIR [PREFIX/etc] + --sharedstatedir=DIR modifiable architecture-independent data in DIR + [PREFIX/com] + --localstatedir=DIR modifiable single-machine data in DIR [PREFIX/var] + --libdir=DIR object code libraries in DIR [EPREFIX/lib] + --includedir=DIR C header files in DIR [PREFIX/include] + --oldincludedir=DIR C header files for non-gcc in DIR [/usr/include] + --infodir=DIR info documentation in DIR [PREFIX/info] + --mandir=DIR man documentation in DIR [PREFIX/man] + --srcdir=DIR find the sources in DIR [configure dir or ..] + --program-prefix=PREFIX prepend PREFIX to installed program names + --program-suffix=SUFFIX append SUFFIX to installed program names + --program-transform-name=PROGRAM + run sed PROGRAM on installed program names +EOF + cat << EOF +Host type: + --build=BUILD configure for building on BUILD [BUILD=HOST] + --host=HOST configure for HOST [guessed] + --target=TARGET configure for TARGET [TARGET=HOST] +Features and packages: + --disable-FEATURE do not include FEATURE (same as --enable-FEATURE=no) + --enable-FEATURE[=ARG] include FEATURE [ARG=yes] + --with-PACKAGE[=ARG] use PACKAGE [ARG=yes] + --without-PACKAGE do not use PACKAGE (same as --with-PACKAGE=no) + --x-includes=DIR X include files are in DIR + --x-libraries=DIR X library files are in DIR +EOF + if test -n "$ac_help"; then + echo "--enable and --with options recognized:$ac_help" + fi + exit 0 ;; + + -host | --host | --hos | --ho) + ac_prev=host ;; + -host=* | --host=* | --hos=* | --ho=*) + host="$ac_optarg" ;; + + -includedir | --includedir | --includedi | --included | --include \ + | --includ | --inclu | --incl | --inc) + ac_prev=includedir ;; + -includedir=* | --includedir=* | --includedi=* | --included=* | --include=* \ + | --includ=* | --inclu=* | --incl=* | --inc=*) + includedir="$ac_optarg" ;; + + -infodir | --infodir | --infodi | --infod | --info | --inf) + ac_prev=infodir ;; + -infodir=* | --infodir=* | --infodi=* | --infod=* | --info=* | --inf=*) + infodir="$ac_optarg" ;; + + -libdir | --libdir | --libdi | --libd) + ac_prev=libdir ;; + -libdir=* | --libdir=* | --libdi=* | --libd=*) + libdir="$ac_optarg" ;; + + -libexecdir | --libexecdir | --libexecdi | --libexecd | --libexec \ + | --libexe | --libex | --libe) + ac_prev=libexecdir ;; + -libexecdir=* | --libexecdir=* | --libexecdi=* | --libexecd=* | --libexec=* \ + | --libexe=* | --libex=* | --libe=*) + libexecdir="$ac_optarg" ;; + + -localstatedir | --localstatedir | --localstatedi | --localstated \ + | --localstate | --localstat | --localsta | --localst \ + | --locals | --local | --loca | --loc | --lo) + ac_prev=localstatedir ;; + -localstatedir=* | --localstatedir=* | --localstatedi=* | --localstated=* \ + | --localstate=* | --localstat=* | --localsta=* | --localst=* \ + | --locals=* | --local=* | --loca=* | --loc=* | --lo=*) + localstatedir="$ac_optarg" ;; + + -mandir | --mandir | --mandi | --mand | --man | --ma | --m) + ac_prev=mandir ;; + -mandir=* | --mandir=* | --mandi=* | --mand=* | --man=* | --ma=* | --m=*) + mandir="$ac_optarg" ;; + + -nfp | --nfp | --nf) + # Obsolete; use --without-fp. + with_fp=no ;; + + -no-create | --no-create | --no-creat | --no-crea | --no-cre \ + | --no-cr | --no-c) + no_create=yes ;; + + -no-recursion | --no-recursion | --no-recursio | --no-recursi \ + | --no-recurs | --no-recur | --no-recu | --no-rec | --no-re | --no-r) + no_recursion=yes ;; + + -oldincludedir | --oldincludedir | --oldincludedi | --oldincluded \ + | --oldinclude | --oldinclud | --oldinclu | --oldincl | --oldinc \ + | --oldin | --oldi | --old | --ol | --o) + ac_prev=oldincludedir ;; + -oldincludedir=* | --oldincludedir=* | --oldincludedi=* | --oldincluded=* \ + | --oldinclude=* | --oldinclud=* | --oldinclu=* | --oldincl=* | --oldinc=* \ + | --oldin=* | --oldi=* | --old=* | --ol=* | --o=*) + oldincludedir="$ac_optarg" ;; + + -prefix | --prefix | --prefi | --pref | --pre | --pr | --p) + ac_prev=prefix ;; + -prefix=* | --prefix=* | --prefi=* | --pref=* | --pre=* | --pr=* | --p=*) + prefix="$ac_optarg" ;; + + -program-prefix | --program-prefix | --program-prefi | --program-pref \ + | --program-pre | --program-pr | --program-p) + ac_prev=program_prefix ;; + -program-prefix=* | --program-prefix=* | --program-prefi=* \ + | --program-pref=* | --program-pre=* | --program-pr=* | --program-p=*) + program_prefix="$ac_optarg" ;; + + -program-suffix | --program-suffix | --program-suffi | --program-suff \ + | --program-suf | --program-su | --program-s) + ac_prev=program_suffix ;; + -program-suffix=* | --program-suffix=* | --program-suffi=* \ + | --program-suff=* | --program-suf=* | --program-su=* | --program-s=*) + program_suffix="$ac_optarg" ;; + + -program-transform-name | --program-transform-name \ + | --program-transform-nam | --program-transform-na \ + | --program-transform-n | --program-transform- \ + | --program-transform | --program-transfor \ + | --program-transfo | --program-transf \ + | --program-trans | --program-tran \ + | --progr-tra | --program-tr | --program-t) + ac_prev=program_transform_name ;; + -program-transform-name=* | --program-transform-name=* \ + | --program-transform-nam=* | --program-transform-na=* \ + | --program-transform-n=* | --program-transform-=* \ + | --program-transform=* | --program-transfor=* \ + | --program-transfo=* | --program-transf=* \ + | --program-trans=* | --program-tran=* \ + | --progr-tra=* | --program-tr=* | --program-t=*) + program_transform_name="$ac_optarg" ;; + + -q | -quiet | --quiet | --quie | --qui | --qu | --q \ + | -silent | --silent | --silen | --sile | --sil) + silent=yes ;; + + -sbindir | --sbindir | --sbindi | --sbind | --sbin | --sbi | --sb) + ac_prev=sbindir ;; + -sbindir=* | --sbindir=* | --sbindi=* | --sbind=* | --sbin=* \ + | --sbi=* | --sb=*) + sbindir="$ac_optarg" ;; + + -sharedstatedir | --sharedstatedir | --sharedstatedi \ + | --sharedstated | --sharedstate | --sharedstat | --sharedsta \ + | --sharedst | --shareds | --shared | --share | --shar \ + | --sha | --sh) + ac_prev=sharedstatedir ;; + -sharedstatedir=* | --sharedstatedir=* | --sharedstatedi=* \ + | --sharedstated=* | --sharedstate=* | --sharedstat=* | --sharedsta=* \ + | --sharedst=* | --shareds=* | --shared=* | --share=* | --shar=* \ + | --sha=* | --sh=*) + sharedstatedir="$ac_optarg" ;; + + -site | --site | --sit) + ac_prev=site ;; + -site=* | --site=* | --sit=*) + site="$ac_optarg" ;; + + -srcdir | --srcdir | --srcdi | --srcd | --src | --sr) + ac_prev=srcdir ;; + -srcdir=* | --srcdir=* | --srcdi=* | --srcd=* | --src=* | --sr=*) + srcdir="$ac_optarg" ;; + + -sysconfdir | --sysconfdir | --sysconfdi | --sysconfd | --sysconf \ + | --syscon | --sysco | --sysc | --sys | --sy) + ac_prev=sysconfdir ;; + -sysconfdir=* | --sysconfdir=* | --sysconfdi=* | --sysconfd=* | --sysconf=* \ + | --syscon=* | --sysco=* | --sysc=* | --sys=* | --sy=*) + sysconfdir="$ac_optarg" ;; + + -target | --target | --targe | --targ | --tar | --ta | --t) + ac_prev=target ;; + -target=* | --target=* | --targe=* | --targ=* | --tar=* | --ta=* | --t=*) + target="$ac_optarg" ;; + + -v | -verbose | --verbose | --verbos | --verbo | --verb) + verbose=yes ;; + + -version | --version | --versio | --versi | --vers) + echo "configure generated by autoconf version 2.13" + exit 0 ;; + + -with-* | --with-*) + ac_package=`echo $ac_option|sed -e 's/-*with-//' -e 's/=.*//'` + # Reject names that are not valid shell variable names. + if test -n "`echo $ac_package| sed 's/[-_a-zA-Z0-9]//g'`"; then + { echo "configure: error: $ac_package: invalid package name" 1>&2; exit 1; } + fi + ac_package=`echo $ac_package| sed 's/-/_/g'` + case "$ac_option" in + *=*) ;; + *) ac_optarg=yes ;; + esac + eval "with_${ac_package}='$ac_optarg'" ;; + + -without-* | --without-*) + ac_package=`echo $ac_option|sed -e 's/-*without-//'` + # Reject names that are not valid shell variable names. + if test -n "`echo $ac_package| sed 's/[-a-zA-Z0-9_]//g'`"; then + { echo "configure: error: $ac_package: invalid package name" 1>&2; exit 1; } + fi + ac_package=`echo $ac_package| sed 's/-/_/g'` + eval "with_${ac_package}=no" ;; + + --x) + # Obsolete; use --with-x. + with_x=yes ;; + + -x-includes | --x-includes | --x-include | --x-includ | --x-inclu \ + | --x-incl | --x-inc | --x-in | --x-i) + ac_prev=x_includes ;; + -x-includes=* | --x-includes=* | --x-include=* | --x-includ=* | --x-inclu=* \ + | --x-incl=* | --x-inc=* | --x-in=* | --x-i=*) + x_includes="$ac_optarg" ;; + + -x-libraries | --x-libraries | --x-librarie | --x-librari \ + | --x-librar | --x-libra | --x-libr | --x-lib | --x-li | --x-l) + ac_prev=x_libraries ;; + -x-libraries=* | --x-libraries=* | --x-librarie=* | --x-librari=* \ + | --x-librar=* | --x-libra=* | --x-libr=* | --x-lib=* | --x-li=* | --x-l=*) + x_libraries="$ac_optarg" ;; + + -*) { echo "configure: error: $ac_option: invalid option; use --help to show usage" 1>&2; exit 1; } + ;; + + *) + if test -n "`echo $ac_option| sed 's/[-a-z0-9.]//g'`"; then + echo "configure: warning: $ac_option: invalid host type" 1>&2 + fi + if test "x$nonopt" != xNONE; then + { echo "configure: error: can only configure for one host and one target at a time" 1>&2; exit 1; } + fi + nonopt="$ac_option" + ;; + + esac +done + +if test -n "$ac_prev"; then + { echo "configure: error: missing argument to --`echo $ac_prev | sed 's/_/-/g'`" 1>&2; exit 1; } +fi + +trap 'rm -fr conftest* confdefs* core core.* *.core $ac_clean_files; exit 1' 1 2 15 + +# File descriptor usage: +# 0 standard input +# 1 file creation +# 2 errors and warnings +# 3 some systems may open it to /dev/tty +# 4 used on the Kubota Titan +# 6 checking for... messages and results +# 5 compiler messages saved in config.log +if test "$silent" = yes; then + exec 6>/dev/null +else + exec 6>&1 +fi +exec 5>./config.log + +echo "\ +This file contains any messages produced by compilers while +running configure, to aid debugging if configure makes a mistake. +" 1>&5 + +# Strip out --no-create and --no-recursion so they do not pile up. +# Also quote any args containing shell metacharacters. +ac_configure_args= +for ac_arg +do + case "$ac_arg" in + -no-create | --no-create | --no-creat | --no-crea | --no-cre \ + | --no-cr | --no-c) ;; + -no-recursion | --no-recursion | --no-recursio | --no-recursi \ + | --no-recurs | --no-recur | --no-recu | --no-rec | --no-re | --no-r) ;; + *" "*|*" "*|*[\[\]\~\#\$\^\&\*\(\)\{\}\\\|\;\<\>\?]*) + ac_configure_args="$ac_configure_args '$ac_arg'" ;; + *) ac_configure_args="$ac_configure_args $ac_arg" ;; + esac +done + +# NLS nuisances. +# Only set these to C if already set. These must not be set unconditionally +# because not all systems understand e.g. LANG=C (notably SCO). +# Fixing LC_MESSAGES prevents Solaris sh from translating var values in `set'! +# Non-C LC_CTYPE values break the ctype check. +if test "${LANG+set}" = set; then LANG=C; export LANG; fi +if test "${LC_ALL+set}" = set; then LC_ALL=C; export LC_ALL; fi +if test "${LC_MESSAGES+set}" = set; then LC_MESSAGES=C; export LC_MESSAGES; fi +if test "${LC_CTYPE+set}" = set; then LC_CTYPE=C; export LC_CTYPE; fi + +# confdefs.h avoids OS command line length limits that DEFS can exceed. +rm -rf conftest* confdefs.h +# AIX cpp loses on an empty file, so make sure it contains at least a newline. +echo > confdefs.h + +# A filename unique to this package, relative to the directory that +# configure is in, which we can look for to find out if srcdir is correct. +ac_unique_file=xdelta.c + +# Find the source files, if location was not specified. +if test -z "$srcdir"; then + ac_srcdir_defaulted=yes + # Try the directory containing this script, then its parent. + ac_prog=$0 + ac_confdir=`echo $ac_prog|sed 's%/[^/][^/]*$%%'` + test "x$ac_confdir" = "x$ac_prog" && ac_confdir=. + srcdir=$ac_confdir + if test ! -r $srcdir/$ac_unique_file; then + srcdir=.. + fi +else + ac_srcdir_defaulted=no +fi +if test ! -r $srcdir/$ac_unique_file; then + if test "$ac_srcdir_defaulted" = yes; then + { echo "configure: error: can not find sources in $ac_confdir or .." 1>&2; exit 1; } + else + { echo "configure: error: can not find sources in $srcdir" 1>&2; exit 1; } + fi +fi +srcdir=`echo "${srcdir}" | sed 's%\([^/]\)/*$%\1%'` + +# Prefer explicitly selected file to automatically selected ones. +if test -z "$CONFIG_SITE"; then + if test "x$prefix" != xNONE; then + CONFIG_SITE="$prefix/share/config.site $prefix/etc/config.site" + else + CONFIG_SITE="$ac_default_prefix/share/config.site $ac_default_prefix/etc/config.site" + fi +fi +for ac_site_file in $CONFIG_SITE; do + if test -r "$ac_site_file"; then + echo "loading site script $ac_site_file" + . "$ac_site_file" + fi +done + +if test -r "$cache_file"; then + echo "loading cache $cache_file" + . $cache_file +else + echo "creating cache $cache_file" + > $cache_file +fi + +ac_ext=c +# CFLAGS is not in ac_cpp because -g, -O, etc. are not valid cpp options. +ac_cpp='$CPP $CPPFLAGS' +ac_compile='${CC-cc} -c $CFLAGS $CPPFLAGS conftest.$ac_ext 1>&5' +ac_link='${CC-cc} -o conftest${ac_exeext} $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS 1>&5' +cross_compiling=$ac_cv_prog_cc_cross + +ac_exeext= +ac_objext=o +if (echo "testing\c"; echo 1,2,3) | grep c >/dev/null; then + # Stardent Vistra SVR4 grep lacks -e, says ghazi@caip.rutgers.edu. + if (echo -n testing; echo 1,2,3) | sed s/-n/xn/ | grep xn >/dev/null; then + ac_n= ac_c=' +' ac_t=' ' + else + ac_n=-n ac_c= ac_t= + fi +else + ac_n= ac_c='\c' ac_t= +fi + + + + + + +ac_aux_dir= +for ac_dir in $srcdir $srcdir/.. $srcdir/../..; do + if test -f $ac_dir/install-sh; then + ac_aux_dir=$ac_dir + ac_install_sh="$ac_aux_dir/install-sh -c" + break + elif test -f $ac_dir/install.sh; then + ac_aux_dir=$ac_dir + ac_install_sh="$ac_aux_dir/install.sh -c" + break + fi +done +if test -z "$ac_aux_dir"; then + { echo "configure: error: can not find install-sh or install.sh in $srcdir $srcdir/.. $srcdir/../.." 1>&2; exit 1; } +fi +ac_config_guess=$ac_aux_dir/config.guess +ac_config_sub=$ac_aux_dir/config.sub +ac_configure=$ac_aux_dir/configure # This should be Cygnus configure. + +# Find a good install program. We prefer a C program (faster), +# so one script is as good as another. But avoid the broken or +# incompatible versions: +# SysV /etc/install, /usr/sbin/install +# SunOS /usr/etc/install +# IRIX /sbin/install +# AIX /bin/install +# AIX 4 /usr/bin/installbsd, which doesn't work without a -g flag +# AFS /usr/afsws/bin/install, which mishandles nonexistent args +# SVR4 /usr/ucb/install, which tries to use the nonexistent group "staff" +# ./install, which can be erroneously created by make from ./install.sh. +echo $ac_n "checking for a BSD compatible install""... $ac_c" 1>&6 +echo "configure:697: checking for a BSD compatible install" >&5 +if test -z "$INSTALL"; then +if eval "test \"`echo '$''{'ac_cv_path_install'+set}'`\" = set"; then + echo $ac_n "(cached) $ac_c" 1>&6 +else + IFS="${IFS= }"; ac_save_IFS="$IFS"; IFS=":" + for ac_dir in $PATH; do + # Account for people who put trailing slashes in PATH elements. + case "$ac_dir/" in + /|./|.//|/etc/*|/usr/sbin/*|/usr/etc/*|/sbin/*|/usr/afsws/bin/*|/usr/ucb/*) ;; + *) + # OSF1 and SCO ODT 3.0 have their own names for install. + # Don't use installbsd from OSF since it installs stuff as root + # by default. + for ac_prog in ginstall scoinst install; do + if test -f $ac_dir/$ac_prog; then + if test $ac_prog = install && + grep dspmsg $ac_dir/$ac_prog >/dev/null 2>&1; then + # AIX install. It has an incompatible calling convention. + : + else + ac_cv_path_install="$ac_dir/$ac_prog -c" + break 2 + fi + fi + done + ;; + esac + done + IFS="$ac_save_IFS" + +fi + if test "${ac_cv_path_install+set}" = set; then + INSTALL="$ac_cv_path_install" + else + # As a last resort, use the slow shell script. We don't cache a + # path for INSTALL within a source directory, because that will + # break other packages using the cache if that directory is + # removed, or if the path is relative. + INSTALL="$ac_install_sh" + fi +fi +echo "$ac_t""$INSTALL" 1>&6 + +# Use test -z because SunOS4 sh mishandles braces in ${var-val}. +# It thinks the first close brace ends the variable substitution. +test -z "$INSTALL_PROGRAM" && INSTALL_PROGRAM='${INSTALL}' + +test -z "$INSTALL_SCRIPT" && INSTALL_SCRIPT='${INSTALL_PROGRAM}' + +test -z "$INSTALL_DATA" && INSTALL_DATA='${INSTALL} -m 644' + +echo $ac_n "checking whether build environment is sane""... $ac_c" 1>&6 +echo "configure:750: checking whether build environment is sane" >&5 +# Just in case +sleep 1 +echo timestamp > conftestfile +# Do `set' in a subshell so we don't clobber the current shell's +# arguments. Must try -L first in case configure is actually a +# symlink; some systems play weird games with the mod time of symlinks +# (eg FreeBSD returns the mod time of the symlink's containing +# directory). +if ( + set X `ls -Lt $srcdir/configure conftestfile 2> /dev/null` + if test "$*" = "X"; then + # -L didn't work. + set X `ls -t $srcdir/configure conftestfile` + fi + if test "$*" != "X $srcdir/configure conftestfile" \ + && test "$*" != "X conftestfile $srcdir/configure"; then + + # If neither matched, then we have a broken ls. This can happen + # if, for instance, CONFIG_SHELL is bash and it inherits a + # broken ls alias from the environment. This has actually + # happened. Such a system could not be considered "sane". + { echo "configure: error: ls -t appears to fail. Make sure there is not a broken +alias in your environment" 1>&2; exit 1; } + fi + + test "$2" = conftestfile + ) +then + # Ok. + : +else + { echo "configure: error: newly created file is older than distributed files! +Check your system clock" 1>&2; exit 1; } +fi +rm -f conftest* +echo "$ac_t""yes" 1>&6 +if test "$program_transform_name" = s,x,x,; then + program_transform_name= +else + # Double any \ or $. echo might interpret backslashes. + cat <<\EOF_SED > conftestsed +s,\\,\\\\,g; s,\$,$$,g +EOF_SED + program_transform_name="`echo $program_transform_name|sed -f conftestsed`" + rm -f conftestsed +fi +test "$program_prefix" != NONE && + program_transform_name="s,^,${program_prefix},; $program_transform_name" +# Use a double $ so make ignores it. +test "$program_suffix" != NONE && + program_transform_name="s,\$\$,${program_suffix},; $program_transform_name" + +# sed with no file args requires a program. +test "$program_transform_name" = "" && program_transform_name="s,x,x," + +echo $ac_n "checking whether ${MAKE-make} sets \${MAKE}""... $ac_c" 1>&6 +echo "configure:807: checking whether ${MAKE-make} sets \${MAKE}" >&5 +set dummy ${MAKE-make}; ac_make=`echo "$2" | sed 'y%./+-%__p_%'` +if eval "test \"`echo '$''{'ac_cv_prog_make_${ac_make}_set'+set}'`\" = set"; then + echo $ac_n "(cached) $ac_c" 1>&6 +else + cat > conftestmake <<\EOF +all: + @echo 'ac_maketemp="${MAKE}"' +EOF +# GNU make sometimes prints "make[1]: Entering...", which would confuse us. +eval `${MAKE-make} -f conftestmake 2>/dev/null | grep temp=` +if test -n "$ac_maketemp"; then + eval ac_cv_prog_make_${ac_make}_set=yes +else + eval ac_cv_prog_make_${ac_make}_set=no +fi +rm -f conftestmake +fi +if eval "test \"`echo '$ac_cv_prog_make_'${ac_make}_set`\" = yes"; then + echo "$ac_t""yes" 1>&6 + SET_MAKE= +else + echo "$ac_t""no" 1>&6 + SET_MAKE="MAKE=${MAKE-make}" +fi + + +PACKAGE=xdelta + +VERSION=1.1.3 + +if test "`cd $srcdir && pwd`" != "`pwd`" && test -f $srcdir/config.status; then + { echo "configure: error: source directory already configured; run "make distclean" there first" 1>&2; exit 1; } +fi + + + +missing_dir=`cd $ac_aux_dir && pwd` +echo $ac_n "checking for working aclocal""... $ac_c" 1>&6 +echo "configure:846: checking for working aclocal" >&5 +# Run test in a subshell; some versions of sh will print an error if +# an executable is not found, even if stderr is redirected. +# Redirect stdin to placate older versions of autoconf. Sigh. +if (aclocal --version) < /dev/null > /dev/null 2>&1; then + ACLOCAL=aclocal + echo "$ac_t""found" 1>&6 +else + ACLOCAL="$missing_dir/missing aclocal" + echo "$ac_t""missing" 1>&6 +fi + +echo $ac_n "checking for working autoconf""... $ac_c" 1>&6 +echo "configure:859: checking for working autoconf" >&5 +# Run test in a subshell; some versions of sh will print an error if +# an executable is not found, even if stderr is redirected. +# Redirect stdin to placate older versions of autoconf. Sigh. +if (autoconf --version) < /dev/null > /dev/null 2>&1; then + AUTOCONF=autoconf + echo "$ac_t""found" 1>&6 +else + AUTOCONF="$missing_dir/missing autoconf" + echo "$ac_t""missing" 1>&6 +fi + +echo $ac_n "checking for working automake""... $ac_c" 1>&6 +echo "configure:872: checking for working automake" >&5 +# Run test in a subshell; some versions of sh will print an error if +# an executable is not found, even if stderr is redirected. +# Redirect stdin to placate older versions of autoconf. Sigh. +if (automake --version) < /dev/null > /dev/null 2>&1; then + AUTOMAKE=automake + echo "$ac_t""found" 1>&6 +else + AUTOMAKE="$missing_dir/missing automake" + echo "$ac_t""missing" 1>&6 +fi + +echo $ac_n "checking for working autoheader""... $ac_c" 1>&6 +echo "configure:885: checking for working autoheader" >&5 +# Run test in a subshell; some versions of sh will print an error if +# an executable is not found, even if stderr is redirected. +# Redirect stdin to placate older versions of autoconf. Sigh. +if (autoheader --version) < /dev/null > /dev/null 2>&1; then + AUTOHEADER=autoheader + echo "$ac_t""found" 1>&6 +else + AUTOHEADER="$missing_dir/missing autoheader" + echo "$ac_t""missing" 1>&6 +fi + +echo $ac_n "checking for working makeinfo""... $ac_c" 1>&6 +echo "configure:898: checking for working makeinfo" >&5 +# Run test in a subshell; some versions of sh will print an error if +# an executable is not found, even if stderr is redirected. +# Redirect stdin to placate older versions of autoconf. Sigh. +if (makeinfo --version) < /dev/null > /dev/null 2>&1; then + MAKEINFO=makeinfo + echo "$ac_t""found" 1>&6 +else + MAKEINFO="$missing_dir/missing makeinfo" + echo "$ac_t""missing" 1>&6 +fi + + + +echo $ac_n "checking whether to enable maintainer-specific portions of Makefiles""... $ac_c" 1>&6 +echo "configure:913: checking whether to enable maintainer-specific portions of Makefiles" >&5 + # Check whether --enable-maintainer-mode or --disable-maintainer-mode was given. +if test "${enable_maintainer_mode+set}" = set; then + enableval="$enable_maintainer_mode" + USE_MAINTAINER_MODE=$enableval +else + USE_MAINTAINER_MODE=no +fi + + echo "$ac_t""$USE_MAINTAINER_MODE" 1>&6 + + +if test $USE_MAINTAINER_MODE = yes; then + MAINTAINER_MODE_TRUE= + MAINTAINER_MODE_FALSE='#' +else + MAINTAINER_MODE_TRUE='#' + MAINTAINER_MODE_FALSE= +fi + MAINT=$MAINTAINER_MODE_TRUE + + + +DEBUGFLAG= +PROFILEFLAG= + +# Check whether --enable-debug or --disable-debug was given. +if test "${enable_debug+set}" = set; then + enableval="$enable_debug" + : +fi + +# Check whether --enable-profile or --disable-profile was given. +if test "${enable_profile+set}" = set; then + enableval="$enable_profile" + : +fi + + +TMPCFLAGS="$CFLAGS" +CFLAGS= + +# Extract the first word of "gcc", so it can be a program name with args. +set dummy gcc; ac_word=$2 +echo $ac_n "checking for $ac_word""... $ac_c" 1>&6 +echo "configure:958: checking for $ac_word" >&5 +if eval "test \"`echo '$''{'ac_cv_prog_CC'+set}'`\" = set"; then + echo $ac_n "(cached) $ac_c" 1>&6 +else + if test -n "$CC"; then + ac_cv_prog_CC="$CC" # Let the user override the test. +else + IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS=":" + ac_dummy="$PATH" + for ac_dir in $ac_dummy; do + test -z "$ac_dir" && ac_dir=. + if test -f $ac_dir/$ac_word; then + ac_cv_prog_CC="gcc" + break + fi + done + IFS="$ac_save_ifs" +fi +fi +CC="$ac_cv_prog_CC" +if test -n "$CC"; then + echo "$ac_t""$CC" 1>&6 +else + echo "$ac_t""no" 1>&6 +fi + +if test -z "$CC"; then + # Extract the first word of "cc", so it can be a program name with args. +set dummy cc; ac_word=$2 +echo $ac_n "checking for $ac_word""... $ac_c" 1>&6 +echo "configure:988: checking for $ac_word" >&5 +if eval "test \"`echo '$''{'ac_cv_prog_CC'+set}'`\" = set"; then + echo $ac_n "(cached) $ac_c" 1>&6 +else + if test -n "$CC"; then + ac_cv_prog_CC="$CC" # Let the user override the test. +else + IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS=":" + ac_prog_rejected=no + ac_dummy="$PATH" + for ac_dir in $ac_dummy; do + test -z "$ac_dir" && ac_dir=. + if test -f $ac_dir/$ac_word; then + if test "$ac_dir/$ac_word" = "/usr/ucb/cc"; then + ac_prog_rejected=yes + continue + fi + ac_cv_prog_CC="cc" + break + fi + done + IFS="$ac_save_ifs" +if test $ac_prog_rejected = yes; then + # We found a bogon in the path, so make sure we never use it. + set dummy $ac_cv_prog_CC + shift + if test $# -gt 0; then + # We chose a different compiler from the bogus one. + # However, it has the same basename, so the bogon will be chosen + # first if we set CC to just the basename; use the full file name. + shift + set dummy "$ac_dir/$ac_word" "$@" + shift + ac_cv_prog_CC="$@" + fi +fi +fi +fi +CC="$ac_cv_prog_CC" +if test -n "$CC"; then + echo "$ac_t""$CC" 1>&6 +else + echo "$ac_t""no" 1>&6 +fi + + if test -z "$CC"; then + case "`uname -s`" in + *win32* | *WIN32*) + # Extract the first word of "cl", so it can be a program name with args. +set dummy cl; ac_word=$2 +echo $ac_n "checking for $ac_word""... $ac_c" 1>&6 +echo "configure:1039: checking for $ac_word" >&5 +if eval "test \"`echo '$''{'ac_cv_prog_CC'+set}'`\" = set"; then + echo $ac_n "(cached) $ac_c" 1>&6 +else + if test -n "$CC"; then + ac_cv_prog_CC="$CC" # Let the user override the test. +else + IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS=":" + ac_dummy="$PATH" + for ac_dir in $ac_dummy; do + test -z "$ac_dir" && ac_dir=. + if test -f $ac_dir/$ac_word; then + ac_cv_prog_CC="cl" + break + fi + done + IFS="$ac_save_ifs" +fi +fi +CC="$ac_cv_prog_CC" +if test -n "$CC"; then + echo "$ac_t""$CC" 1>&6 +else + echo "$ac_t""no" 1>&6 +fi + ;; + esac + fi + test -z "$CC" && { echo "configure: error: no acceptable cc found in \$PATH" 1>&2; exit 1; } +fi + +echo $ac_n "checking whether the C compiler ($CC $CFLAGS $LDFLAGS) works""... $ac_c" 1>&6 +echo "configure:1071: checking whether the C compiler ($CC $CFLAGS $LDFLAGS) works" >&5 + +ac_ext=c +# CFLAGS is not in ac_cpp because -g, -O, etc. are not valid cpp options. +ac_cpp='$CPP $CPPFLAGS' +ac_compile='${CC-cc} -c $CFLAGS $CPPFLAGS conftest.$ac_ext 1>&5' +ac_link='${CC-cc} -o conftest${ac_exeext} $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS 1>&5' +cross_compiling=$ac_cv_prog_cc_cross + +cat > conftest.$ac_ext << EOF + +#line 1082 "configure" +#include "confdefs.h" + +main(){return(0);} +EOF +if { (eval echo configure:1087: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then + ac_cv_prog_cc_works=yes + # If we can't run a trivial program, we are probably using a cross compiler. + if (./conftest; exit) 2>/dev/null; then + ac_cv_prog_cc_cross=no + else + ac_cv_prog_cc_cross=yes + fi +else + echo "configure: failed program was:" >&5 + cat conftest.$ac_ext >&5 + ac_cv_prog_cc_works=no +fi +rm -fr conftest* +ac_ext=c +# CFLAGS is not in ac_cpp because -g, -O, etc. are not valid cpp options. +ac_cpp='$CPP $CPPFLAGS' +ac_compile='${CC-cc} -c $CFLAGS $CPPFLAGS conftest.$ac_ext 1>&5' +ac_link='${CC-cc} -o conftest${ac_exeext} $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS 1>&5' +cross_compiling=$ac_cv_prog_cc_cross + +echo "$ac_t""$ac_cv_prog_cc_works" 1>&6 +if test $ac_cv_prog_cc_works = no; then + { echo "configure: error: installation or configuration problem: C compiler cannot create executables." 1>&2; exit 1; } +fi +echo $ac_n "checking whether the C compiler ($CC $CFLAGS $LDFLAGS) is a cross-compiler""... $ac_c" 1>&6 +echo "configure:1113: checking whether the C compiler ($CC $CFLAGS $LDFLAGS) is a cross-compiler" >&5 +echo "$ac_t""$ac_cv_prog_cc_cross" 1>&6 +cross_compiling=$ac_cv_prog_cc_cross + +echo $ac_n "checking whether we are using GNU C""... $ac_c" 1>&6 +echo "configure:1118: checking whether we are using GNU C" >&5 +if eval "test \"`echo '$''{'ac_cv_prog_gcc'+set}'`\" = set"; then + echo $ac_n "(cached) $ac_c" 1>&6 +else + cat > conftest.c <&5; (eval $ac_try) 2>&5; }; } | egrep yes >/dev/null 2>&1; then + ac_cv_prog_gcc=yes +else + ac_cv_prog_gcc=no +fi +fi + +echo "$ac_t""$ac_cv_prog_gcc" 1>&6 + +if test $ac_cv_prog_gcc = yes; then + GCC=yes +else + GCC= +fi + +ac_test_CFLAGS="${CFLAGS+set}" +ac_save_CFLAGS="$CFLAGS" +CFLAGS= +echo $ac_n "checking whether ${CC-cc} accepts -g""... $ac_c" 1>&6 +echo "configure:1146: checking whether ${CC-cc} accepts -g" >&5 +if eval "test \"`echo '$''{'ac_cv_prog_cc_g'+set}'`\" = set"; then + echo $ac_n "(cached) $ac_c" 1>&6 +else + echo 'void f(){}' > conftest.c +if test -z "`${CC-cc} -g -c conftest.c 2>&1`"; then + ac_cv_prog_cc_g=yes +else + ac_cv_prog_cc_g=no +fi +rm -f conftest* + +fi + +echo "$ac_t""$ac_cv_prog_cc_g" 1>&6 +if test "$ac_test_CFLAGS" = set; then + CFLAGS="$ac_save_CFLAGS" +elif test $ac_cv_prog_cc_g = yes; then + if test "$GCC" = yes; then + CFLAGS="-g -O2" + else + CFLAGS="-g" + fi +else + if test "$GCC" = yes; then + CFLAGS="-O2" + else + CFLAGS= + fi +fi + +echo $ac_n "checking how to run the C preprocessor""... $ac_c" 1>&6 +echo "configure:1178: checking how to run the C preprocessor" >&5 +# On Suns, sometimes $CPP names a directory. +if test -n "$CPP" && test -d "$CPP"; then + CPP= +fi +if test -z "$CPP"; then +if eval "test \"`echo '$''{'ac_cv_prog_CPP'+set}'`\" = set"; then + echo $ac_n "(cached) $ac_c" 1>&6 +else + # This must be in double quotes, not single quotes, because CPP may get + # substituted into the Makefile and "${CC-cc}" will confuse make. + CPP="${CC-cc} -E" + # On the NeXT, cc -E runs the code through the compiler's parser, + # not just through cpp. + cat > conftest.$ac_ext < +Syntax Error +EOF +ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out" +{ (eval echo configure:1199: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; } +ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"` +if test -z "$ac_err"; then + : +else + echo "$ac_err" >&5 + echo "configure: failed program was:" >&5 + cat conftest.$ac_ext >&5 + rm -rf conftest* + CPP="${CC-cc} -E -traditional-cpp" + cat > conftest.$ac_ext < +Syntax Error +EOF +ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out" +{ (eval echo configure:1216: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; } +ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"` +if test -z "$ac_err"; then + : +else + echo "$ac_err" >&5 + echo "configure: failed program was:" >&5 + cat conftest.$ac_ext >&5 + rm -rf conftest* + CPP="${CC-cc} -nologo -E" + cat > conftest.$ac_ext < +Syntax Error +EOF +ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out" +{ (eval echo configure:1233: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; } +ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"` +if test -z "$ac_err"; then + : +else + echo "$ac_err" >&5 + echo "configure: failed program was:" >&5 + cat conftest.$ac_ext >&5 + rm -rf conftest* + CPP=/lib/cpp +fi +rm -f conftest* +fi +rm -f conftest* +fi +rm -f conftest* + ac_cv_prog_CPP="$CPP" +fi + CPP="$ac_cv_prog_CPP" +else + ac_cv_prog_CPP="$CPP" +fi +echo "$ac_t""$CPP" 1>&6 + + +CFLAGS=$TMPCFLAGS + +if test "x$GCC" = "xyes"; then + case " $CFLAGS " in + *[\ \ ]-Wall[\ \ ]*) ;; + *) CFLAGS="$CFLAGS -Wall" ;; + esac + + if test "x$enable_debug" = "xyes"; then + DEBUGFLAG="-g" + fi + + if test "x$enable_profile" = "xyes"; then + PROFILEFLAG="-pg" + fi + + if test -n "$DEBUGFLAG"; then + case " $CFLAGS " in + *[\ \ ]$DEBUGFLAG[\ \ ]*) ;; + *) CFLAGS="$DEBUGFLAG $CFLAGS" ;; + esac + else + case " $CFLAGS " in + *[\ \ ]-O[0-9\ \ ]*) ;; + *) CFLAGS="$CFLAGS -O3" ;; + esac + fi + + if test -n "$PROFILEFLAG"; then + case " $CFLAGS " in + *[\ \ ]$PROFILEFLAG[\ \ ]*) ;; + *) CFLAGS="$PROFILEFLAG $CFLAGS" ;; + esac + fi +fi + +# Check whether --enable-shared or --disable-shared was given. +if test "${enable_shared+set}" = set; then + enableval="$enable_shared" + p=${PACKAGE-default} +case "$enableval" in +yes) enable_shared=yes ;; +no) enable_shared=no ;; +*) + enable_shared=no + # Look at the argument we got. We use all the common list separators. + IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS="${IFS}:," + for pkg in $enableval; do + if test "X$pkg" = "X$p"; then + enable_shared=yes + fi + done + IFS="$ac_save_ifs" + ;; +esac +else + enable_shared=yes +fi + +# Check whether --enable-static or --disable-static was given. +if test "${enable_static+set}" = set; then + enableval="$enable_static" + p=${PACKAGE-default} +case "$enableval" in +yes) enable_static=yes ;; +no) enable_static=no ;; +*) + enable_static=no + # Look at the argument we got. We use all the common list separators. + IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS="${IFS}:," + for pkg in $enableval; do + if test "X$pkg" = "X$p"; then + enable_static=yes + fi + done + IFS="$ac_save_ifs" + ;; +esac +else + enable_static=yes +fi + +# Check whether --enable-fast-install or --disable-fast-install was given. +if test "${enable_fast_install+set}" = set; then + enableval="$enable_fast_install" + p=${PACKAGE-default} +case "$enableval" in +yes) enable_fast_install=yes ;; +no) enable_fast_install=no ;; +*) + enable_fast_install=no + # Look at the argument we got. We use all the common list separators. + IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS="${IFS}:," + for pkg in $enableval; do + if test "X$pkg" = "X$p"; then + enable_fast_install=yes + fi + done + IFS="$ac_save_ifs" + ;; +esac +else + enable_fast_install=yes +fi + + +# Make sure we can run config.sub. +if ${CONFIG_SHELL-/bin/sh} $ac_config_sub sun4 >/dev/null 2>&1; then : +else { echo "configure: error: can not run $ac_config_sub" 1>&2; exit 1; } +fi + +echo $ac_n "checking host system type""... $ac_c" 1>&6 +echo "configure:1370: checking host system type" >&5 + +host_alias=$host +case "$host_alias" in +NONE) + case $nonopt in + NONE) + if host_alias=`${CONFIG_SHELL-/bin/sh} $ac_config_guess`; then : + else { echo "configure: error: can not guess host type; you must specify one" 1>&2; exit 1; } + fi ;; + *) host_alias=$nonopt ;; + esac ;; +esac + +host=`${CONFIG_SHELL-/bin/sh} $ac_config_sub $host_alias` +host_cpu=`echo $host | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\1/'` +host_vendor=`echo $host | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\2/'` +host_os=`echo $host | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\3/'` +echo "$ac_t""$host" 1>&6 + +echo $ac_n "checking build system type""... $ac_c" 1>&6 +echo "configure:1391: checking build system type" >&5 + +build_alias=$build +case "$build_alias" in +NONE) + case $nonopt in + NONE) build_alias=$host_alias ;; + *) build_alias=$nonopt ;; + esac ;; +esac + +build=`${CONFIG_SHELL-/bin/sh} $ac_config_sub $build_alias` +build_cpu=`echo $build | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\1/'` +build_vendor=`echo $build | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\2/'` +build_os=`echo $build | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\3/'` +echo "$ac_t""$build" 1>&6 + +# Extract the first word of "ranlib", so it can be a program name with args. +set dummy ranlib; ac_word=$2 +echo $ac_n "checking for $ac_word""... $ac_c" 1>&6 +echo "configure:1411: checking for $ac_word" >&5 +if eval "test \"`echo '$''{'ac_cv_prog_RANLIB'+set}'`\" = set"; then + echo $ac_n "(cached) $ac_c" 1>&6 +else + if test -n "$RANLIB"; then + ac_cv_prog_RANLIB="$RANLIB" # Let the user override the test. +else + IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS=":" + ac_dummy="$PATH" + for ac_dir in $ac_dummy; do + test -z "$ac_dir" && ac_dir=. + if test -f $ac_dir/$ac_word; then + ac_cv_prog_RANLIB="ranlib" + break + fi + done + IFS="$ac_save_ifs" + test -z "$ac_cv_prog_RANLIB" && ac_cv_prog_RANLIB=":" +fi +fi +RANLIB="$ac_cv_prog_RANLIB" +if test -n "$RANLIB"; then + echo "$ac_t""$RANLIB" 1>&6 +else + echo "$ac_t""no" 1>&6 +fi + +# Check whether --with-gnu-ld or --without-gnu-ld was given. +if test "${with_gnu_ld+set}" = set; then + withval="$with_gnu_ld" + test "$withval" = no || with_gnu_ld=yes +else + with_gnu_ld=no +fi + +ac_prog=ld +if test "$ac_cv_prog_gcc" = yes; then + # Check if gcc -print-prog-name=ld gives a path. + echo $ac_n "checking for ld used by GCC""... $ac_c" 1>&6 +echo "configure:1450: checking for ld used by GCC" >&5 + ac_prog=`($CC -print-prog-name=ld) 2>&5` + case "$ac_prog" in + # Accept absolute paths. + [\\/]* | [A-Za-z]:[\\/]*) + re_direlt='/[^/][^/]*/\.\./' + # Canonicalize the path of ld + ac_prog=`echo $ac_prog| sed 's%\\\\%/%g'` + while echo $ac_prog | grep "$re_direlt" > /dev/null 2>&1; do + ac_prog=`echo $ac_prog| sed "s%$re_direlt%/%"` + done + test -z "$LD" && LD="$ac_prog" + ;; + "") + # If it fails, then pretend we aren't using GCC. + ac_prog=ld + ;; + *) + # If it is relative, then search for the first ld in PATH. + with_gnu_ld=unknown + ;; + esac +elif test "$with_gnu_ld" = yes; then + echo $ac_n "checking for GNU ld""... $ac_c" 1>&6 +echo "configure:1474: checking for GNU ld" >&5 +else + echo $ac_n "checking for non-GNU ld""... $ac_c" 1>&6 +echo "configure:1477: checking for non-GNU ld" >&5 +fi +if eval "test \"`echo '$''{'ac_cv_path_LD'+set}'`\" = set"; then + echo $ac_n "(cached) $ac_c" 1>&6 +else + if test -z "$LD"; then + IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS="${IFS}${PATH_SEPARATOR-:}" + for ac_dir in $PATH; do + test -z "$ac_dir" && ac_dir=. + if test -f "$ac_dir/$ac_prog" || test -f "$ac_dir/$ac_prog$ac_exeext"; then + ac_cv_path_LD="$ac_dir/$ac_prog" + # Check to see if the program is GNU ld. I'd rather use --version, + # but apparently some GNU ld's only accept -v. + # Break only if it was the GNU/non-GNU ld that we prefer. + if "$ac_cv_path_LD" -v 2>&1 < /dev/null | egrep '(GNU|with BFD)' > /dev/null; then + test "$with_gnu_ld" != no && break + else + test "$with_gnu_ld" != yes && break + fi + fi + done + IFS="$ac_save_ifs" +else + ac_cv_path_LD="$LD" # Let the user override the test with a path. +fi +fi + +LD="$ac_cv_path_LD" +if test -n "$LD"; then + echo "$ac_t""$LD" 1>&6 +else + echo "$ac_t""no" 1>&6 +fi +test -z "$LD" && { echo "configure: error: no acceptable ld found in \$PATH" 1>&2; exit 1; } + +echo $ac_n "checking if the linker ($LD) is GNU ld""... $ac_c" 1>&6 +echo "configure:1513: checking if the linker ($LD) is GNU ld" >&5 +if eval "test \"`echo '$''{'ac_cv_prog_gnu_ld'+set}'`\" = set"; then + echo $ac_n "(cached) $ac_c" 1>&6 +else + # I'd rather use --version here, but apparently some GNU ld's only accept -v. +if $LD -v 2>&1 &5; then + ac_cv_prog_gnu_ld=yes +else + ac_cv_prog_gnu_ld=no +fi +fi + +echo "$ac_t""$ac_cv_prog_gnu_ld" 1>&6 + + +echo $ac_n "checking for BSD-compatible nm""... $ac_c" 1>&6 +echo "configure:1529: checking for BSD-compatible nm" >&5 +if eval "test \"`echo '$''{'ac_cv_path_NM'+set}'`\" = set"; then + echo $ac_n "(cached) $ac_c" 1>&6 +else + if test -n "$NM"; then + # Let the user override the test. + ac_cv_path_NM="$NM" +else + IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS="${IFS}${PATH_SEPARATOR-:}" + for ac_dir in $PATH /usr/ccs/bin /usr/ucb /bin; do + test -z "$ac_dir" && ac_dir=. + if test -f $ac_dir/nm || test -f $ac_dir/nm$ac_exeext ; then + # Check to see if the nm accepts a BSD-compat flag. + # Adding the `sed 1q' prevents false positives on HP-UX, which says: + # nm: unknown option "B" ignored + if ($ac_dir/nm -B /dev/null 2>&1 | sed '1q'; exit 0) | egrep /dev/null >/dev/null; then + ac_cv_path_NM="$ac_dir/nm -B" + break + elif ($ac_dir/nm -p /dev/null 2>&1 | sed '1q'; exit 0) | egrep /dev/null >/dev/null; then + ac_cv_path_NM="$ac_dir/nm -p" + break + else + ac_cv_path_NM=${ac_cv_path_NM="$ac_dir/nm"} # keep the first match, but + continue # so that we can try to find one that supports BSD flags + fi + fi + done + IFS="$ac_save_ifs" + test -z "$ac_cv_path_NM" && ac_cv_path_NM=nm +fi +fi + +NM="$ac_cv_path_NM" +echo "$ac_t""$NM" 1>&6 + + +echo $ac_n "checking whether ln -s works""... $ac_c" 1>&6 +echo "configure:1566: checking whether ln -s works" >&5 +if eval "test \"`echo '$''{'ac_cv_prog_LN_S'+set}'`\" = set"; then + echo $ac_n "(cached) $ac_c" 1>&6 +else + rm -f conftestdata +if ln -s X conftestdata 2>/dev/null +then + rm -f conftestdata + ac_cv_prog_LN_S="ln -s" +else + ac_cv_prog_LN_S=ln +fi +fi +LN_S="$ac_cv_prog_LN_S" +if test "$ac_cv_prog_LN_S" = "ln -s"; then + echo "$ac_t""yes" 1>&6 +else + echo "$ac_t""no" 1>&6 +fi + + +# Check for any special flags to pass to ltconfig. +libtool_flags="--cache-file=$cache_file" +test "$enable_shared" = no && libtool_flags="$libtool_flags --disable-shared" +test "$enable_static" = no && libtool_flags="$libtool_flags --disable-static" +test "$enable_fast_install" = no && libtool_flags="$libtool_flags --disable-fast-install" +test "$ac_cv_prog_gcc" = yes && libtool_flags="$libtool_flags --with-gcc" +test "$ac_cv_prog_gnu_ld" = yes && libtool_flags="$libtool_flags --with-gnu-ld" + + +# Check whether --enable-libtool-lock or --disable-libtool-lock was given. +if test "${enable_libtool_lock+set}" = set; then + enableval="$enable_libtool_lock" + : +fi + +test "x$enable_libtool_lock" = xno && libtool_flags="$libtool_flags --disable-lock" +test x"$silent" = xyes && libtool_flags="$libtool_flags --silent" + +# Some flags need to be propagated to the compiler or linker for good +# libtool support. +case "$host" in +*-*-irix6*) + # Find out which ABI we are using. + echo '#line 1610 "configure"' > conftest.$ac_ext + if { (eval echo configure:1611: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then + case "`/usr/bin/file conftest.o`" in + *32-bit*) + LD="${LD-ld} -32" + ;; + *N32*) + LD="${LD-ld} -n32" + ;; + *64-bit*) + LD="${LD-ld} -64" + ;; + esac + fi + rm -rf conftest* + ;; + +*-*-sco3.2v5*) + # On SCO OpenServer 5, we need -belf to get full-featured binaries. + SAVE_CFLAGS="$CFLAGS" + CFLAGS="$CFLAGS -belf" + echo $ac_n "checking whether the C compiler needs -belf""... $ac_c" 1>&6 +echo "configure:1632: checking whether the C compiler needs -belf" >&5 +if eval "test \"`echo '$''{'lt_cv_cc_needs_belf'+set}'`\" = set"; then + echo $ac_n "(cached) $ac_c" 1>&6 +else + + ac_ext=c +# CFLAGS is not in ac_cpp because -g, -O, etc. are not valid cpp options. +ac_cpp='$CPP $CPPFLAGS' +ac_compile='${CC-cc} -c $CFLAGS $CPPFLAGS conftest.$ac_ext 1>&5' +ac_link='${CC-cc} -o conftest${ac_exeext} $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS 1>&5' +cross_compiling=$ac_cv_prog_cc_cross + + cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then + rm -rf conftest* + lt_cv_cc_needs_belf=yes +else + echo "configure: failed program was:" >&5 + cat conftest.$ac_ext >&5 + rm -rf conftest* + lt_cv_cc_needs_belf=no +fi +rm -f conftest* + ac_ext=c +# CFLAGS is not in ac_cpp because -g, -O, etc. are not valid cpp options. +ac_cpp='$CPP $CPPFLAGS' +ac_compile='${CC-cc} -c $CFLAGS $CPPFLAGS conftest.$ac_ext 1>&5' +ac_link='${CC-cc} -o conftest${ac_exeext} $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS 1>&5' +cross_compiling=$ac_cv_prog_cc_cross + +fi + +echo "$ac_t""$lt_cv_cc_needs_belf" 1>&6 + if test x"$lt_cv_cc_needs_belf" != x"yes"; then + # this is probably gcc 2.8.0, egcs 1.0 or newer; no need for -belf + CFLAGS="$SAVE_CFLAGS" + fi + ;; + + +esac + + +# Save cache, so that ltconfig can load it +cat > confcache <<\EOF +# This file is a shell script that caches the results of configure +# tests run on this system so they can be shared between configure +# scripts and configure runs. It is not useful on other systems. +# If it contains results you don't want to keep, you may remove or edit it. +# +# By default, configure uses ./config.cache as the cache file, +# creating it if it does not exist already. You can give configure +# the --cache-file=FILE option to use a different cache file; that is +# what configure does when it calls configure scripts in +# subdirectories, so they share the cache. +# Giving --cache-file=/dev/null disables caching, for debugging configure. +# config.status only pays attention to the cache file if you give it the +# --recheck option to rerun configure. +# +EOF +# The following way of writing the cache mishandles newlines in values, +# but we know of no workaround that is simple, portable, and efficient. +# So, don't put newlines in cache variables' values. +# Ultrix sh set writes to stderr and can't be redirected directly, +# and sets the high bit in the cache file unless we assign to the vars. +(set) 2>&1 | + case `(ac_space=' '; set | grep ac_space) 2>&1` in + *ac_space=\ *) + # `set' does not quote correctly, so add quotes (double-quote substitution + # turns \\\\ into \\, and sed turns \\ into \). + sed -n \ + -e "s/'/'\\\\''/g" \ + -e "s/^\\([a-zA-Z0-9_]*_cv_[a-zA-Z0-9_]*\\)=\\(.*\\)/\\1=\${\\1='\\2'}/p" + ;; + *) + # `set' quotes correctly as required by POSIX, so do not add quotes. + sed -n -e 's/^\([a-zA-Z0-9_]*_cv_[a-zA-Z0-9_]*\)=\(.*\)/\1=${\1=\2}/p' + ;; + esac >> confcache +if cmp -s $cache_file confcache; then + : +else + if test -w $cache_file; then + echo "updating cache $cache_file" + cat confcache > $cache_file + else + echo "not updating unwritable cache $cache_file" + fi +fi +rm -f confcache + + +# Actually configure libtool. ac_aux_dir is where install-sh is found. +CC="$CC" CFLAGS="$CFLAGS" CPPFLAGS="$CPPFLAGS" \ +LD="$LD" LDFLAGS="$LDFLAGS" LIBS="$LIBS" \ +LN_S="$LN_S" NM="$NM" RANLIB="$RANLIB" \ +DLLTOOL="$DLLTOOL" AS="$AS" OBJDUMP="$OBJDUMP" \ +${CONFIG_SHELL-/bin/sh} $ac_aux_dir/ltconfig --no-reexec \ +$libtool_flags --no-verify $ac_aux_dir/ltmain.sh $host \ +|| { echo "configure: error: libtool configure failed" 1>&2; exit 1; } + +# Reload cache, that may have been modified by ltconfig +if test -r "$cache_file"; then + echo "loading cache $cache_file" + . $cache_file +else + echo "creating cache $cache_file" + > $cache_file +fi + + +# This can be used to rebuild libtool when needed +LIBTOOL_DEPS="$ac_aux_dir/ltconfig $ac_aux_dir/ltmain.sh" + +# Always use our own libtool. +LIBTOOL='$(SHELL) $(top_builddir)/libtool' + +# Redirect the config.log output again, so that the ltconfig log is not +# clobbered by the next message. +exec 5>>./config.log + +echo $ac_n "checking for ANSI C header files""... $ac_c" 1>&6 +echo "configure:1761: checking for ANSI C header files" >&5 +if eval "test \"`echo '$''{'ac_cv_header_stdc'+set}'`\" = set"; then + echo $ac_n "(cached) $ac_c" 1>&6 +else + cat > conftest.$ac_ext < +#include +#include +#include +EOF +ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out" +{ (eval echo configure:1774: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; } +ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"` +if test -z "$ac_err"; then + rm -rf conftest* + ac_cv_header_stdc=yes +else + echo "$ac_err" >&5 + echo "configure: failed program was:" >&5 + cat conftest.$ac_ext >&5 + rm -rf conftest* + ac_cv_header_stdc=no +fi +rm -f conftest* + +if test $ac_cv_header_stdc = yes; then + # SunOS 4.x string.h does not declare mem*, contrary to ANSI. +cat > conftest.$ac_ext < +EOF +if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | + egrep "memchr" >/dev/null 2>&1; then + : +else + rm -rf conftest* + ac_cv_header_stdc=no +fi +rm -f conftest* + +fi + +if test $ac_cv_header_stdc = yes; then + # ISC 2.0.2 stdlib.h does not declare free, contrary to ANSI. +cat > conftest.$ac_ext < +EOF +if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | + egrep "free" >/dev/null 2>&1; then + : +else + rm -rf conftest* + ac_cv_header_stdc=no +fi +rm -f conftest* + +fi + +if test $ac_cv_header_stdc = yes; then + # /bin/cc in Irix-4.0.5 gets non-ANSI ctype macros unless using -ansi. +if test "$cross_compiling" = yes; then + : +else + cat > conftest.$ac_ext < +#define ISLOWER(c) ('a' <= (c) && (c) <= 'z') +#define TOUPPER(c) (ISLOWER(c) ? 'A' + ((c) - 'a') : (c)) +#define XOR(e, f) (((e) && !(f)) || (!(e) && (f))) +int main () { int i; for (i = 0; i < 256; i++) +if (XOR (islower (i), ISLOWER (i)) || toupper (i) != TOUPPER (i)) exit(2); +exit (0); } + +EOF +if { (eval echo configure:1841: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext} && (./conftest; exit) 2>/dev/null +then + : +else + echo "configure: failed program was:" >&5 + cat conftest.$ac_ext >&5 + rm -fr conftest* + ac_cv_header_stdc=no +fi +rm -fr conftest* +fi + +fi +fi + +echo "$ac_t""$ac_cv_header_stdc" 1>&6 +if test $ac_cv_header_stdc = yes; then + cat >> confdefs.h <<\EOF +#define STDC_HEADERS 1 +EOF + +fi + +echo $ac_n "checking whether ${MAKE-make} sets \${MAKE}""... $ac_c" 1>&6 +echo "configure:1865: checking whether ${MAKE-make} sets \${MAKE}" >&5 +set dummy ${MAKE-make}; ac_make=`echo "$2" | sed 'y%./+-%__p_%'` +if eval "test \"`echo '$''{'ac_cv_prog_make_${ac_make}_set'+set}'`\" = set"; then + echo $ac_n "(cached) $ac_c" 1>&6 +else + cat > conftestmake <<\EOF +all: + @echo 'ac_maketemp="${MAKE}"' +EOF +# GNU make sometimes prints "make[1]: Entering...", which would confuse us. +eval `${MAKE-make} -f conftestmake 2>/dev/null | grep temp=` +if test -n "$ac_maketemp"; then + eval ac_cv_prog_make_${ac_make}_set=yes +else + eval ac_cv_prog_make_${ac_make}_set=no +fi +rm -f conftestmake +fi +if eval "test \"`echo '$ac_cv_prog_make_'${ac_make}_set`\" = yes"; then + echo "$ac_t""yes" 1>&6 + SET_MAKE= +else + echo "$ac_t""no" 1>&6 + SET_MAKE="MAKE=${MAKE-make}" +fi + + +for ac_func in gettimeofday +do +echo $ac_n "checking for $ac_func""... $ac_c" 1>&6 +echo "configure:1895: checking for $ac_func" >&5 +if eval "test \"`echo '$''{'ac_cv_func_$ac_func'+set}'`\" = set"; then + echo $ac_n "(cached) $ac_c" 1>&6 +else + cat > conftest.$ac_ext < +/* Override any gcc2 internal prototype to avoid an error. */ +/* We use char because int might match the return type of a gcc2 + builtin and then its argument prototype would still apply. */ +char $ac_func(); + +int main() { + +/* The GNU C library defines this for functions which it implements + to always fail with ENOSYS. Some functions are actually named + something starting with __ and the normal name is an alias. */ +#if defined (__stub_$ac_func) || defined (__stub___$ac_func) +choke me +#else +$ac_func(); +#endif + +; return 0; } +EOF +if { (eval echo configure:1923: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then + rm -rf conftest* + eval "ac_cv_func_$ac_func=yes" +else + echo "configure: failed program was:" >&5 + cat conftest.$ac_ext >&5 + rm -rf conftest* + eval "ac_cv_func_$ac_func=no" +fi +rm -f conftest* +fi + +if eval "test \"`echo '$ac_cv_func_'$ac_func`\" = yes"; then + echo "$ac_t""yes" 1>&6 + ac_tr_func=HAVE_`echo $ac_func | tr 'abcdefghijklmnopqrstuvwxyz' 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'` + cat >> confdefs.h <&6 +fi +done + +echo $ac_n "checking whether time.h and sys/time.h may both be included""... $ac_c" 1>&6 +echo "configure:1948: checking whether time.h and sys/time.h may both be included" >&5 +if eval "test \"`echo '$''{'ac_cv_header_time'+set}'`\" = set"; then + echo $ac_n "(cached) $ac_c" 1>&6 +else + cat > conftest.$ac_ext < +#include +#include +int main() { +struct tm *tp; +; return 0; } +EOF +if { (eval echo configure:1962: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then + rm -rf conftest* + ac_cv_header_time=yes +else + echo "configure: failed program was:" >&5 + cat conftest.$ac_ext >&5 + rm -rf conftest* + ac_cv_header_time=no +fi +rm -f conftest* +fi + +echo "$ac_t""$ac_cv_header_time" 1>&6 +if test $ac_cv_header_time = yes; then + cat >> confdefs.h <<\EOF +#define TIME_WITH_SYS_TIME 1 +EOF + +fi + + +for ac_prog in emacs xemacs +do +# Extract the first word of "$ac_prog", so it can be a program name with args. +set dummy $ac_prog; ac_word=$2 +echo $ac_n "checking for $ac_word""... $ac_c" 1>&6 +echo "configure:1988: checking for $ac_word" >&5 +if eval "test \"`echo '$''{'ac_cv_path_EMACS'+set}'`\" = set"; then + echo $ac_n "(cached) $ac_c" 1>&6 +else + case "$EMACS" in + /*) + ac_cv_path_EMACS="$EMACS" # Let the user override the test with a path. + ;; + ?:/*) + ac_cv_path_EMACS="$EMACS" # Let the user override the test with a dos path. + ;; + *) + IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS=":" + ac_dummy="$PATH" + for ac_dir in $ac_dummy; do + test -z "$ac_dir" && ac_dir=. + if test -f $ac_dir/$ac_word; then + ac_cv_path_EMACS="$ac_dir/$ac_word" + break + fi + done + IFS="$ac_save_ifs" + ;; +esac +fi +EMACS="$ac_cv_path_EMACS" +if test -n "$EMACS"; then + echo "$ac_t""$EMACS" 1>&6 +else + echo "$ac_t""no" 1>&6 +fi + +test -n "$EMACS" && break +done +test -n "$EMACS" || EMACS="emacs" + + +top_srcdir_absolute=`cd $srcdir; pwd` + + +# Check whether --with-glib-prefix or --without-glib-prefix was given. +if test "${with_glib_prefix+set}" = set; then + withval="$with_glib_prefix" + glib_config_prefix="$withval" +else + glib_config_prefix="" +fi + +# Check whether --with-glib-exec-prefix or --without-glib-exec-prefix was given. +if test "${with_glib_exec_prefix+set}" = set; then + withval="$with_glib_exec_prefix" + glib_config_exec_prefix="$withval" +else + glib_config_exec_prefix="" +fi + +# Check whether --enable-glibtest or --disable-glibtest was given. +if test "${enable_glibtest+set}" = set; then + enableval="$enable_glibtest" + : +else + enable_glibtest=yes +fi + + + if test x$glib_config_exec_prefix != x ; then + glib_config_args="$glib_config_args --exec-prefix=$glib_config_exec_prefix" + if test x${GLIB_CONFIG+set} != xset ; then + GLIB_CONFIG=$glib_config_exec_prefix/bin/glib-config + fi + fi + if test x$glib_config_prefix != x ; then + glib_config_args="$glib_config_args --prefix=$glib_config_prefix" + if test x${GLIB_CONFIG+set} != xset ; then + GLIB_CONFIG=$glib_config_prefix/bin/glib-config + fi + fi + + for module in . + do + case "$module" in + gmodule) + glib_config_args="$glib_config_args gmodule" + ;; + gthread) + glib_config_args="$glib_config_args gthread" + ;; + esac + done + + # Extract the first word of "glib-config", so it can be a program name with args. +set dummy glib-config; ac_word=$2 +echo $ac_n "checking for $ac_word""... $ac_c" 1>&6 +echo "configure:2081: checking for $ac_word" >&5 +if eval "test \"`echo '$''{'ac_cv_path_GLIB_CONFIG'+set}'`\" = set"; then + echo $ac_n "(cached) $ac_c" 1>&6 +else + case "$GLIB_CONFIG" in + /*) + ac_cv_path_GLIB_CONFIG="$GLIB_CONFIG" # Let the user override the test with a path. + ;; + ?:/*) + ac_cv_path_GLIB_CONFIG="$GLIB_CONFIG" # Let the user override the test with a dos path. + ;; + *) + IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS=":" + ac_dummy="$PATH" + for ac_dir in $ac_dummy; do + test -z "$ac_dir" && ac_dir=. + if test -f $ac_dir/$ac_word; then + ac_cv_path_GLIB_CONFIG="$ac_dir/$ac_word" + break + fi + done + IFS="$ac_save_ifs" + test -z "$ac_cv_path_GLIB_CONFIG" && ac_cv_path_GLIB_CONFIG="no" + ;; +esac +fi +GLIB_CONFIG="$ac_cv_path_GLIB_CONFIG" +if test -n "$GLIB_CONFIG"; then + echo "$ac_t""$GLIB_CONFIG" 1>&6 +else + echo "$ac_t""no" 1>&6 +fi + + min_glib_version=1.2.8 + echo $ac_n "checking for GLIB - version >= $min_glib_version""... $ac_c" 1>&6 +echo "configure:2116: checking for GLIB - version >= $min_glib_version" >&5 + no_glib="" + if test "$GLIB_CONFIG" = "no" ; then + no_glib=yes + else + GLIB_CFLAGS=`$GLIB_CONFIG $glib_config_args --cflags` + GLIB_LIBS=`$GLIB_CONFIG $glib_config_args --libs` + glib_config_major_version=`$GLIB_CONFIG $glib_config_args --version | \ + sed 's/\([0-9]*\).\([0-9]*\).\([0-9]*\)/\1/'` + glib_config_minor_version=`$GLIB_CONFIG $glib_config_args --version | \ + sed 's/\([0-9]*\).\([0-9]*\).\([0-9]*\)/\2/'` + glib_config_micro_version=`$GLIB_CONFIG $glib_config_args --version | \ + sed 's/\([0-9]*\).\([0-9]*\).\([0-9]*\)/\3/'` + if test "x$enable_glibtest" = "xyes" ; then + ac_save_CFLAGS="$CFLAGS" + ac_save_LIBS="$LIBS" + CFLAGS="$CFLAGS $GLIB_CFLAGS" + LIBS="$GLIB_LIBS $LIBS" + rm -f conf.glibtest + if test "$cross_compiling" = yes; then + echo $ac_n "cross compiling; assumed OK... $ac_c" +else + cat > conftest.$ac_ext < +#include +#include + +int +main () +{ + int major, minor, micro; + char *tmp_version; + + system ("touch conf.glibtest"); + + /* HP/UX 9 (%@#!) writes to sscanf strings */ + tmp_version = g_strdup("$min_glib_version"); + if (sscanf(tmp_version, "%d.%d.%d", &major, &minor, µ) != 3) { + printf("%s, bad version string\n", "$min_glib_version"); + exit(1); + } + + if ((glib_major_version != $glib_config_major_version) || + (glib_minor_version != $glib_config_minor_version) || + (glib_micro_version != $glib_config_micro_version)) + { + printf("\n*** 'glib-config --version' returned %d.%d.%d, but GLIB (%d.%d.%d)\n", + $glib_config_major_version, $glib_config_minor_version, $glib_config_micro_version, + glib_major_version, glib_minor_version, glib_micro_version); + printf ("*** was found! If glib-config was correct, then it is best\n"); + printf ("*** to remove the old version of GLIB. You may also be able to fix the error\n"); + printf("*** by modifying your LD_LIBRARY_PATH enviroment variable, or by editing\n"); + printf("*** /etc/ld.so.conf. Make sure you have run ldconfig if that is\n"); + printf("*** required on your system.\n"); + printf("*** If glib-config was wrong, set the environment variable GLIB_CONFIG\n"); + printf("*** to point to the correct copy of glib-config, and remove the file config.cache\n"); + printf("*** before re-running configure\n"); + } + else if ((glib_major_version != GLIB_MAJOR_VERSION) || + (glib_minor_version != GLIB_MINOR_VERSION) || + (glib_micro_version != GLIB_MICRO_VERSION)) + { + printf("*** GLIB header files (version %d.%d.%d) do not match\n", + GLIB_MAJOR_VERSION, GLIB_MINOR_VERSION, GLIB_MICRO_VERSION); + printf("*** library (version %d.%d.%d)\n", + glib_major_version, glib_minor_version, glib_micro_version); + } + else + { + if ((glib_major_version > major) || + ((glib_major_version == major) && (glib_minor_version > minor)) || + ((glib_major_version == major) && (glib_minor_version == minor) && (glib_micro_version >= micro))) + { + return 0; + } + else + { + printf("\n*** An old version of GLIB (%d.%d.%d) was found.\n", + glib_major_version, glib_minor_version, glib_micro_version); + printf("*** You need a version of GLIB newer than %d.%d.%d. The latest version of\n", + major, minor, micro); + printf("*** GLIB is always available from ftp://ftp.gtk.org.\n"); + printf("***\n"); + printf("*** If you have already installed a sufficiently new version, this error\n"); + printf("*** probably means that the wrong copy of the glib-config shell script is\n"); + printf("*** being found. The easiest way to fix this is to remove the old version\n"); + printf("*** of GLIB, but you can also set the GLIB_CONFIG environment to point to the\n"); + printf("*** correct copy of glib-config. (In this case, you will have to\n"); + printf("*** modify your LD_LIBRARY_PATH enviroment variable, or edit /etc/ld.so.conf\n"); + printf("*** so that the correct libraries are found at run-time))\n"); + } + } + return 1; +} + +EOF +if { (eval echo configure:2215: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext} && (./conftest; exit) 2>/dev/null +then + : +else + echo "configure: failed program was:" >&5 + cat conftest.$ac_ext >&5 + rm -fr conftest* + no_glib=yes +fi +rm -fr conftest* +fi + + CFLAGS="$ac_save_CFLAGS" + LIBS="$ac_save_LIBS" + fi + fi + if test "x$no_glib" = x ; then + echo "$ac_t""yes" 1>&6 + : + else + echo "$ac_t""no" 1>&6 + if test "$GLIB_CONFIG" = "no" ; then + echo "*** The glib-config script installed by GLIB could not be found" + echo "*** If GLIB was installed in PREFIX, make sure PREFIX/bin is in" + echo "*** your path, or set the GLIB_CONFIG environment variable to the" + echo "*** full path to glib-config." + else + if test -f conf.glibtest ; then + : + else + echo "*** Could not run GLIB test program, checking why..." + CFLAGS="$CFLAGS $GLIB_CFLAGS" + LIBS="$LIBS $GLIB_LIBS" + cat > conftest.$ac_ext < +#include + +int main() { + return ((glib_major_version) || (glib_minor_version) || (glib_micro_version)); +; return 0; } +EOF +if { (eval echo configure:2259: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then + rm -rf conftest* + echo "*** The test program compiled, but did not run. This usually means" + echo "*** that the run-time linker is not finding GLIB or finding the wrong" + echo "*** version of GLIB. If it is not finding GLIB, you'll need to set your" + echo "*** LD_LIBRARY_PATH environment variable, or edit /etc/ld.so.conf to point" + echo "*** to the installed location Also, make sure you have run ldconfig if that" + echo "*** is required on your system" + echo "***" + echo "*** If you have an old version installed, it is best to remove it, although" + echo "*** you may also be able to get things to work by modifying LD_LIBRARY_PATH" + echo "***" + echo "*** If you have a RedHat 5.0 system, you should remove the GTK package that" + echo "*** came with the system with the command" + echo "***" + echo "*** rpm --erase --nodeps gtk gtk-devel" +else + echo "configure: failed program was:" >&5 + cat conftest.$ac_ext >&5 + rm -rf conftest* + echo "*** The test program failed to compile or link. See the file config.log for the" + echo "*** exact error that occured. This usually means GLIB was incorrectly installed" + echo "*** or that you have moved GLIB since it was installed. In the latter case, you" + echo "*** may want to edit the glib-config script: $GLIB_CONFIG" +fi +rm -f conftest* + CFLAGS="$ac_save_CFLAGS" + LIBS="$ac_save_LIBS" + fi + fi + GLIB_CFLAGS="" + GLIB_LIBS="" + { echo "configure: error: Test for GLIB failed. Download it from ftp://ftp.gtk.org/pub/gtk/v1.2/" 1>&2; exit 1; } + fi + + + rm -f conf.glibtest + + +echo $ac_n "checking for gzsetparams in -lz""... $ac_c" 1>&6 +echo "configure:2299: checking for gzsetparams in -lz" >&5 +ac_lib_var=`echo z'_'gzsetparams | sed 'y%./+-%__p_%'` +if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then + echo $ac_n "(cached) $ac_c" 1>&6 +else + ac_save_LIBS="$LIBS" +LIBS="-lz $LIBS" +cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then + rm -rf conftest* + eval "ac_cv_lib_$ac_lib_var=yes" +else + echo "configure: failed program was:" >&5 + cat conftest.$ac_ext >&5 + rm -rf conftest* + eval "ac_cv_lib_$ac_lib_var=no" +fi +rm -f conftest* +LIBS="$ac_save_LIBS" + +fi +if eval "test \"`echo '$ac_cv_lib_'$ac_lib_var`\" = yes"; then + echo "$ac_t""yes" 1>&6 + ac_safe=`echo "zlib.h" | sed 'y%./+-%__p_%'` +echo $ac_n "checking for zlib.h""... $ac_c" 1>&6 +echo "configure:2335: checking for zlib.h" >&5 +if eval "test \"`echo '$''{'ac_cv_header_$ac_safe'+set}'`\" = set"; then + echo $ac_n "(cached) $ac_c" 1>&6 +else + cat > conftest.$ac_ext < +EOF +ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out" +{ (eval echo configure:2345: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; } +ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"` +if test -z "$ac_err"; then + rm -rf conftest* + eval "ac_cv_header_$ac_safe=yes" +else + echo "$ac_err" >&5 + echo "configure: failed program was:" >&5 + cat conftest.$ac_ext >&5 + rm -rf conftest* + eval "ac_cv_header_$ac_safe=no" +fi +rm -f conftest* +fi +if eval "test \"`echo '$ac_cv_header_'$ac_safe`\" = yes"; then + echo "$ac_t""yes" 1>&6 + : +else + echo "$ac_t""no" 1>&6 +{ echo "configure: error: ZLIB headers not found" 1>&2; exit 1; } +fi + +else + echo "$ac_t""no" 1>&6 +{ echo "configure: error: ZLIB library not found" 1>&2; exit 1; } +fi + + +trap '' 1 2 15 +cat > confcache <<\EOF +# This file is a shell script that caches the results of configure +# tests run on this system so they can be shared between configure +# scripts and configure runs. It is not useful on other systems. +# If it contains results you don't want to keep, you may remove or edit it. +# +# By default, configure uses ./config.cache as the cache file, +# creating it if it does not exist already. You can give configure +# the --cache-file=FILE option to use a different cache file; that is +# what configure does when it calls configure scripts in +# subdirectories, so they share the cache. +# Giving --cache-file=/dev/null disables caching, for debugging configure. +# config.status only pays attention to the cache file if you give it the +# --recheck option to rerun configure. +# +EOF +# The following way of writing the cache mishandles newlines in values, +# but we know of no workaround that is simple, portable, and efficient. +# So, don't put newlines in cache variables' values. +# Ultrix sh set writes to stderr and can't be redirected directly, +# and sets the high bit in the cache file unless we assign to the vars. +(set) 2>&1 | + case `(ac_space=' '; set | grep ac_space) 2>&1` in + *ac_space=\ *) + # `set' does not quote correctly, so add quotes (double-quote substitution + # turns \\\\ into \\, and sed turns \\ into \). + sed -n \ + -e "s/'/'\\\\''/g" \ + -e "s/^\\([a-zA-Z0-9_]*_cv_[a-zA-Z0-9_]*\\)=\\(.*\\)/\\1=\${\\1='\\2'}/p" + ;; + *) + # `set' quotes correctly as required by POSIX, so do not add quotes. + sed -n -e 's/^\([a-zA-Z0-9_]*_cv_[a-zA-Z0-9_]*\)=\(.*\)/\1=${\1=\2}/p' + ;; + esac >> confcache +if cmp -s $cache_file confcache; then + : +else + if test -w $cache_file; then + echo "updating cache $cache_file" + cat confcache > $cache_file + else + echo "not updating unwritable cache $cache_file" + fi +fi +rm -f confcache + +trap 'rm -fr conftest* confdefs* core core.* *.core $ac_clean_files; exit 1' 1 2 15 + +test "x$prefix" = xNONE && prefix=$ac_default_prefix +# Let make expand exec_prefix. +test "x$exec_prefix" = xNONE && exec_prefix='${prefix}' + +# Any assignment to VPATH causes Sun make to only execute +# the first set of double-colon rules, so remove it if not needed. +# If there is a colon in the path, we need to keep it. +if test "x$srcdir" = x.; then + ac_vpsub='/^[ ]*VPATH[ ]*=[^:]*$/d' +fi + +trap 'rm -f $CONFIG_STATUS conftest*; exit 1' 1 2 15 + +DEFS=-DHAVE_CONFIG_H + +# Without the "./", some shells look in PATH for config.status. +: ${CONFIG_STATUS=./config.status} + +echo creating $CONFIG_STATUS +rm -f $CONFIG_STATUS +cat > $CONFIG_STATUS </dev/null | sed 1q`: +# +# $0 $ac_configure_args +# +# Compiler output produced by configure, useful for debugging +# configure, is in ./config.log if it exists. + +ac_cs_usage="Usage: $CONFIG_STATUS [--recheck] [--version] [--help]" +for ac_option +do + case "\$ac_option" in + -recheck | --recheck | --rechec | --reche | --rech | --rec | --re | --r) + echo "running \${CONFIG_SHELL-/bin/sh} $0 $ac_configure_args --no-create --no-recursion" + exec \${CONFIG_SHELL-/bin/sh} $0 $ac_configure_args --no-create --no-recursion ;; + -version | --version | --versio | --versi | --vers | --ver | --ve | --v) + echo "$CONFIG_STATUS generated by autoconf version 2.13" + exit 0 ;; + -help | --help | --hel | --he | --h) + echo "\$ac_cs_usage"; exit 0 ;; + *) echo "\$ac_cs_usage"; exit 1 ;; + esac +done + +ac_given_srcdir=$srcdir +ac_given_INSTALL="$INSTALL" + +trap 'rm -fr `echo "Makefile + doc/Makefile + test/Makefile + djgpp/Makefile + xdelta-config + libedsio/Makefile + libedsio/edsio-comp config.h" | sed "s/:[^ ]*//g"` conftest*; exit 1' 1 2 15 +EOF +cat >> $CONFIG_STATUS < conftest.subs <<\\CEOF +$ac_vpsub +$extrasub +s%@SHELL@%$SHELL%g +s%@CFLAGS@%$CFLAGS%g +s%@CPPFLAGS@%$CPPFLAGS%g +s%@CXXFLAGS@%$CXXFLAGS%g +s%@FFLAGS@%$FFLAGS%g +s%@DEFS@%$DEFS%g +s%@LDFLAGS@%$LDFLAGS%g +s%@LIBS@%$LIBS%g +s%@exec_prefix@%$exec_prefix%g +s%@prefix@%$prefix%g +s%@program_transform_name@%$program_transform_name%g +s%@bindir@%$bindir%g +s%@sbindir@%$sbindir%g +s%@libexecdir@%$libexecdir%g +s%@datadir@%$datadir%g +s%@sysconfdir@%$sysconfdir%g +s%@sharedstatedir@%$sharedstatedir%g +s%@localstatedir@%$localstatedir%g +s%@libdir@%$libdir%g +s%@includedir@%$includedir%g +s%@oldincludedir@%$oldincludedir%g +s%@infodir@%$infodir%g +s%@mandir@%$mandir%g +s%@INSTALL_PROGRAM@%$INSTALL_PROGRAM%g +s%@INSTALL_SCRIPT@%$INSTALL_SCRIPT%g +s%@INSTALL_DATA@%$INSTALL_DATA%g +s%@PACKAGE@%$PACKAGE%g +s%@VERSION@%$VERSION%g +s%@ACLOCAL@%$ACLOCAL%g +s%@AUTOCONF@%$AUTOCONF%g +s%@AUTOMAKE@%$AUTOMAKE%g +s%@AUTOHEADER@%$AUTOHEADER%g +s%@MAKEINFO@%$MAKEINFO%g +s%@SET_MAKE@%$SET_MAKE%g +s%@MAINTAINER_MODE_TRUE@%$MAINTAINER_MODE_TRUE%g +s%@MAINTAINER_MODE_FALSE@%$MAINTAINER_MODE_FALSE%g +s%@MAINT@%$MAINT%g +s%@CC@%$CC%g +s%@CPP@%$CPP%g +s%@host@%$host%g +s%@host_alias@%$host_alias%g +s%@host_cpu@%$host_cpu%g +s%@host_vendor@%$host_vendor%g +s%@host_os@%$host_os%g +s%@build@%$build%g +s%@build_alias@%$build_alias%g +s%@build_cpu@%$build_cpu%g +s%@build_vendor@%$build_vendor%g +s%@build_os@%$build_os%g +s%@RANLIB@%$RANLIB%g +s%@LD@%$LD%g +s%@NM@%$NM%g +s%@LN_S@%$LN_S%g +s%@LIBTOOL@%$LIBTOOL%g +s%@EMACS@%$EMACS%g +s%@top_srcdir_absolute@%$top_srcdir_absolute%g +s%@GLIB_CONFIG@%$GLIB_CONFIG%g +s%@GLIB_CFLAGS@%$GLIB_CFLAGS%g +s%@GLIB_LIBS@%$GLIB_LIBS%g + +CEOF +EOF + +cat >> $CONFIG_STATUS <<\EOF + +# Split the substitutions into bite-sized pieces for seds with +# small command number limits, like on Digital OSF/1 and HP-UX. +ac_max_sed_cmds=90 # Maximum number of lines to put in a sed script. +ac_file=1 # Number of current file. +ac_beg=1 # First line for current file. +ac_end=$ac_max_sed_cmds # Line after last line for current file. +ac_more_lines=: +ac_sed_cmds="" +while $ac_more_lines; do + if test $ac_beg -gt 1; then + sed "1,${ac_beg}d; ${ac_end}q" conftest.subs > conftest.s$ac_file + else + sed "${ac_end}q" conftest.subs > conftest.s$ac_file + fi + if test ! -s conftest.s$ac_file; then + ac_more_lines=false + rm -f conftest.s$ac_file + else + if test -z "$ac_sed_cmds"; then + ac_sed_cmds="sed -f conftest.s$ac_file" + else + ac_sed_cmds="$ac_sed_cmds | sed -f conftest.s$ac_file" + fi + ac_file=`expr $ac_file + 1` + ac_beg=$ac_end + ac_end=`expr $ac_end + $ac_max_sed_cmds` + fi +done +if test -z "$ac_sed_cmds"; then + ac_sed_cmds=cat +fi +EOF + +cat >> $CONFIG_STATUS <> $CONFIG_STATUS <<\EOF +for ac_file in .. $CONFIG_FILES; do if test "x$ac_file" != x..; then + # Support "outfile[:infile[:infile...]]", defaulting infile="outfile.in". + case "$ac_file" in + *:*) ac_file_in=`echo "$ac_file"|sed 's%[^:]*:%%'` + ac_file=`echo "$ac_file"|sed 's%:.*%%'` ;; + *) ac_file_in="${ac_file}.in" ;; + esac + + # Adjust a relative srcdir, top_srcdir, and INSTALL for subdirectories. + + # Remove last slash and all that follows it. Not all systems have dirname. + ac_dir=`echo $ac_file|sed 's%/[^/][^/]*$%%'` + if test "$ac_dir" != "$ac_file" && test "$ac_dir" != .; then + # The file is in a subdirectory. + test ! -d "$ac_dir" && mkdir "$ac_dir" + ac_dir_suffix="/`echo $ac_dir|sed 's%^\./%%'`" + # A "../" for each directory in $ac_dir_suffix. + ac_dots=`echo $ac_dir_suffix|sed 's%/[^/]*%../%g'` + else + ac_dir_suffix= ac_dots= + fi + + case "$ac_given_srcdir" in + .) srcdir=. + if test -z "$ac_dots"; then top_srcdir=. + else top_srcdir=`echo $ac_dots|sed 's%/$%%'`; fi ;; + /*) srcdir="$ac_given_srcdir$ac_dir_suffix"; top_srcdir="$ac_given_srcdir" ;; + *) # Relative path. + srcdir="$ac_dots$ac_given_srcdir$ac_dir_suffix" + top_srcdir="$ac_dots$ac_given_srcdir" ;; + esac + + case "$ac_given_INSTALL" in + [/$]*) INSTALL="$ac_given_INSTALL" ;; + *) INSTALL="$ac_dots$ac_given_INSTALL" ;; + esac + + echo creating "$ac_file" + rm -f "$ac_file" + configure_input="Generated automatically from `echo $ac_file_in|sed 's%.*/%%'` by configure." + case "$ac_file" in + *Makefile*) ac_comsub="1i\\ +# $configure_input" ;; + *) ac_comsub= ;; + esac + + ac_file_inputs=`echo $ac_file_in|sed -e "s%^%$ac_given_srcdir/%" -e "s%:% $ac_given_srcdir/%g"` + sed -e "$ac_comsub +s%@configure_input@%$configure_input%g +s%@srcdir@%$srcdir%g +s%@top_srcdir@%$top_srcdir%g +s%@INSTALL@%$INSTALL%g +" $ac_file_inputs | (eval "$ac_sed_cmds") > $ac_file +fi; done +rm -f conftest.s* + +# These sed commands are passed to sed as "A NAME B NAME C VALUE D", where +# NAME is the cpp macro being defined and VALUE is the value it is being given. +# +# ac_d sets the value in "#define NAME VALUE" lines. +ac_dA='s%^\([ ]*\)#\([ ]*define[ ][ ]*\)' +ac_dB='\([ ][ ]*\)[^ ]*%\1#\2' +ac_dC='\3' +ac_dD='%g' +# ac_u turns "#undef NAME" with trailing blanks into "#define NAME VALUE". +ac_uA='s%^\([ ]*\)#\([ ]*\)undef\([ ][ ]*\)' +ac_uB='\([ ]\)%\1#\2define\3' +ac_uC=' ' +ac_uD='\4%g' +# ac_e turns "#undef NAME" without trailing blanks into "#define NAME VALUE". +ac_eA='s%^\([ ]*\)#\([ ]*\)undef\([ ][ ]*\)' +ac_eB='$%\1#\2define\3' +ac_eC=' ' +ac_eD='%g' + +if test "${CONFIG_HEADERS+set}" != set; then +EOF +cat >> $CONFIG_STATUS <> $CONFIG_STATUS <<\EOF +fi +for ac_file in .. $CONFIG_HEADERS; do if test "x$ac_file" != x..; then + # Support "outfile[:infile[:infile...]]", defaulting infile="outfile.in". + case "$ac_file" in + *:*) ac_file_in=`echo "$ac_file"|sed 's%[^:]*:%%'` + ac_file=`echo "$ac_file"|sed 's%:.*%%'` ;; + *) ac_file_in="${ac_file}.in" ;; + esac + + echo creating $ac_file + + rm -f conftest.frag conftest.in conftest.out + ac_file_inputs=`echo $ac_file_in|sed -e "s%^%$ac_given_srcdir/%" -e "s%:% $ac_given_srcdir/%g"` + cat $ac_file_inputs > conftest.in + +EOF + +# Transform confdefs.h into a sed script conftest.vals that substitutes +# the proper values into config.h.in to produce config.h. And first: +# Protect against being on the right side of a sed subst in config.status. +# Protect against being in an unquoted here document in config.status. +rm -f conftest.vals +cat > conftest.hdr <<\EOF +s/[\\&%]/\\&/g +s%[\\$`]%\\&%g +s%#define \([A-Za-z_][A-Za-z0-9_]*\) *\(.*\)%${ac_dA}\1${ac_dB}\1${ac_dC}\2${ac_dD}%gp +s%ac_d%ac_u%gp +s%ac_u%ac_e%gp +EOF +sed -n -f conftest.hdr confdefs.h > conftest.vals +rm -f conftest.hdr + +# This sed command replaces #undef with comments. This is necessary, for +# example, in the case of _POSIX_SOURCE, which is predefined and required +# on some systems where configure will not decide to define it. +cat >> conftest.vals <<\EOF +s%^[ ]*#[ ]*undef[ ][ ]*[a-zA-Z_][a-zA-Z_0-9]*%/* & */% +EOF + +# Break up conftest.vals because some shells have a limit on +# the size of here documents, and old seds have small limits too. + +rm -f conftest.tail +while : +do + ac_lines=`grep -c . conftest.vals` + # grep -c gives empty output for an empty file on some AIX systems. + if test -z "$ac_lines" || test "$ac_lines" -eq 0; then break; fi + # Write a limited-size here document to conftest.frag. + echo ' cat > conftest.frag <> $CONFIG_STATUS + sed ${ac_max_here_lines}q conftest.vals >> $CONFIG_STATUS + echo 'CEOF + sed -f conftest.frag conftest.in > conftest.out + rm -f conftest.in + mv conftest.out conftest.in +' >> $CONFIG_STATUS + sed 1,${ac_max_here_lines}d conftest.vals > conftest.tail + rm -f conftest.vals + mv conftest.tail conftest.vals +done +rm -f conftest.vals + +cat >> $CONFIG_STATUS <<\EOF + rm -f conftest.frag conftest.h + echo "/* $ac_file. Generated automatically by configure. */" > conftest.h + cat conftest.in >> conftest.h + rm -f conftest.in + if cmp -s $ac_file conftest.h 2>/dev/null; then + echo "$ac_file is unchanged" + rm -f conftest.h + else + # Remove last slash and all that follows it. Not all systems have dirname. + ac_dir=`echo $ac_file|sed 's%/[^/][^/]*$%%'` + if test "$ac_dir" != "$ac_file" && test "$ac_dir" != .; then + # The file is in a subdirectory. + test ! -d "$ac_dir" && mkdir "$ac_dir" + fi + rm -f $ac_file + mv conftest.h $ac_file + fi +fi; done + +EOF +cat >> $CONFIG_STATUS <> $CONFIG_STATUS <<\EOF +test -z "$CONFIG_HEADERS" || echo timestamp > stamp-h +chmod +x libedsio/edsio-comp xdelta-config + +exit 0 +EOF +chmod +x $CONFIG_STATUS +rm -fr confdefs* $ac_clean_files +test "$no_create" = yes || ${CONFIG_SHELL-/bin/sh} $CONFIG_STATUS || exit 1 + diff --git a/xdelta-1.1.3/configure.in b/xdelta-1.1.3/configure.in new file mode 100644 index 0000000..0bc3dc2 --- /dev/null +++ b/xdelta-1.1.3/configure.in @@ -0,0 +1,91 @@ +dnl -*-Mode: C; comment-start: "dnl "-*- +dnl Process this file with autoconf to produce a configure script. +AC_REVISION([configure.in,v 1.2 1998/10/03 00:17:50 jmacd Exp])dnl +AC_INIT(xdelta.c) +AM_CONFIG_HEADER(config.h) + +dnl $Format: "AM_INIT_AUTOMAKE(xdelta, $ReleaseVersion$, no-define)" $ +AM_INIT_AUTOMAKE(xdelta, 1.1.3, no-define) + +AM_MAINTAINER_MODE + +DEBUGFLAG= +PROFILEFLAG= + +AC_ARG_ENABLE(debug, [ --enable-debug turn on debugging [default=no]]) +AC_ARG_ENABLE(profile, [ --enable-profile turn on profiling [default=no]]) + +TMPCFLAGS="$CFLAGS" +CFLAGS= + +AC_PROG_CC +AC_PROG_CPP + +CFLAGS=$TMPCFLAGS + +changequote(,)dnl +if test "x$GCC" = "xyes"; then + case " $CFLAGS " in + *[\ \ ]-Wall[\ \ ]*) ;; + *) CFLAGS="$CFLAGS -Wall" ;; + esac + + if test "x$enable_debug" = "xyes"; then + DEBUGFLAG="-g" + fi + + if test "x$enable_profile" = "xyes"; then + PROFILEFLAG="-pg" + fi + + if test -n "$DEBUGFLAG"; then + case " $CFLAGS " in + *[\ \ ]$DEBUGFLAG[\ \ ]*) ;; + *) CFLAGS="$DEBUGFLAG $CFLAGS" ;; + esac + else + case " $CFLAGS " in + *[\ \ ]-O[0-9\ \ ]*) ;; + *) CFLAGS="$CFLAGS -O3" ;; + esac + fi + + if test -n "$PROFILEFLAG"; then + case " $CFLAGS " in + *[\ \ ]$PROFILEFLAG[\ \ ]*) ;; + *) CFLAGS="$PROFILEFLAG $CFLAGS" ;; + esac + fi +fi +changequote([,])dnl + +AM_PROG_LIBTOOL +AC_HEADER_STDC +AC_PROG_MAKE_SET + +AC_CHECK_FUNCS(gettimeofday) +AC_HEADER_TIME + +AC_PATH_PROGS(EMACS, emacs xemacs, emacs) + +top_srcdir_absolute=`cd $srcdir; pwd` +AC_SUBST(top_srcdir_absolute) + +AM_PATH_GLIB(1.2.8,, + AC_MSG_ERROR(Test for GLIB failed. Download it from ftp://ftp.gtk.org/pub/gtk/v1.2/)) + +AC_CHECK_LIB(z, gzsetparams, + AC_CHECK_HEADER(zlib.h,, + AC_MSG_ERROR(ZLIB headers not found)), + AC_MSG_ERROR(ZLIB library not found)) + +AC_OUTPUT(Makefile + doc/Makefile + test/Makefile + djgpp/Makefile + xdelta-config + libedsio/Makefile + libedsio/edsio-comp, + + chmod +x libedsio/edsio-comp xdelta-config + ) diff --git a/xdelta-1.1.3/djgpp/Makefile b/xdelta-1.1.3/djgpp/Makefile new file mode 100644 index 0000000..65512cb --- /dev/null +++ b/xdelta-1.1.3/djgpp/Makefile @@ -0,0 +1,185 @@ +# Generated automatically from Makefile.in by configure. +# Makefile.in generated automatically by automake 1.4 from Makefile.am + +# Copyright (C) 1994, 1995-8, 1999 Free Software Foundation, Inc. +# This Makefile.in is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY, to the extent permitted by law; without +# even the implied warranty of MERCHANTABILITY or FITNESS FOR A +# PARTICULAR PURPOSE. + + +SHELL = /bin/sh + +srcdir = . +top_srcdir = .. +prefix = /usr/local +exec_prefix = ${prefix} + +bindir = ${exec_prefix}/bin +sbindir = ${exec_prefix}/sbin +libexecdir = ${exec_prefix}/libexec +datadir = ${prefix}/share +sysconfdir = ${prefix}/etc +sharedstatedir = ${prefix}/com +localstatedir = ${prefix}/var +libdir = ${exec_prefix}/lib +infodir = ${prefix}/info +mandir = ${prefix}/man +includedir = ${prefix}/include +oldincludedir = /usr/include + +DESTDIR = + +pkgdatadir = $(datadir)/xdelta +pkglibdir = $(libdir)/xdelta +pkgincludedir = $(includedir)/xdelta + +top_builddir = .. + +ACLOCAL = aclocal +AUTOCONF = autoconf +AUTOMAKE = automake +AUTOHEADER = autoheader + +INSTALL = /usr/bin/install -c +INSTALL_PROGRAM = ${INSTALL} $(AM_INSTALL_PROGRAM_FLAGS) +INSTALL_DATA = ${INSTALL} -m 644 +INSTALL_SCRIPT = ${INSTALL_PROGRAM} +transform = s,x,x, + +NORMAL_INSTALL = : +PRE_INSTALL = : +POST_INSTALL = : +NORMAL_UNINSTALL = : +PRE_UNINSTALL = : +POST_UNINSTALL = : +host_alias = powerpc-apple +host_triplet = powerpc-apple-macos +AS = @AS@ +CC = gcc +CPP = gcc -E +DLLTOOL = @DLLTOOL@ +EMACS = /usr/bin/emacs +GLIB_CFLAGS = -I/usr/local/include/glib-1.2 -I/usr/local/lib/glib/include +GLIB_CONFIG = /usr/local/bin/glib-config +GLIB_LIBS = -L/usr/local/lib -lglib +LD = /usr/bin/ld +LIBTOOL = $(SHELL) $(top_builddir)/libtool +LN_S = ln -s +MAINT = # +MAKEINFO = makeinfo +NM = /usr/bin/nm -p +OBJDUMP = @OBJDUMP@ +PACKAGE = xdelta +RANLIB = ranlib +VERSION = 1.1.3 +top_srcdir_absolute = /Users/icculus/projects/mojopatch/xdelta-1.1.3 + +EXTRA_DIST = readme.djg announce.djg +mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs +CONFIG_HEADER = ../config.h +CONFIG_CLEAN_FILES = +DIST_COMMON = Makefile.am Makefile.in + + +DISTFILES = $(DIST_COMMON) $(SOURCES) $(HEADERS) $(TEXINFOS) $(EXTRA_DIST) + +TAR = tar +GZIP_ENV = --best +all: all-redirect +.SUFFIXES: +$(srcdir)/Makefile.in: # Makefile.am $(top_srcdir)/configure.in $(ACLOCAL_M4) + cd $(top_srcdir) && $(AUTOMAKE) --gnu --include-deps djgpp/Makefile + +Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status + cd $(top_builddir) \ + && CONFIG_FILES=$(subdir)/$@ CONFIG_HEADERS= $(SHELL) ./config.status + +tags: TAGS +TAGS: + + +distdir = $(top_builddir)/$(PACKAGE)-$(VERSION)/$(subdir) + +subdir = djgpp + +distdir: $(DISTFILES) + @for file in $(DISTFILES); do \ + d=$(srcdir); \ + if test -d $$d/$$file; then \ + cp -pr $$d/$$file $(distdir)/$$file; \ + else \ + test -f $(distdir)/$$file \ + || ln $$d/$$file $(distdir)/$$file 2> /dev/null \ + || cp -p $$d/$$file $(distdir)/$$file || :; \ + fi; \ + done +info-am: +info: info-am +dvi-am: +dvi: dvi-am +check-am: all-am +check: check-am +installcheck-am: +installcheck: installcheck-am +install-exec-am: +install-exec: install-exec-am + +install-data-am: +install-data: install-data-am + +install-am: all-am + @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am +install: install-am +uninstall-am: +uninstall: uninstall-am +all-am: Makefile +all-redirect: all-am +install-strip: + $(MAKE) $(AM_MAKEFLAGS) AM_INSTALL_PROGRAM_FLAGS=-s install +installdirs: + + +mostlyclean-generic: + +clean-generic: + +distclean-generic: + -rm -f Makefile $(CONFIG_CLEAN_FILES) + -rm -f config.cache config.log stamp-h stamp-h[0-9]* + +maintainer-clean-generic: +mostlyclean-am: mostlyclean-generic + +mostlyclean: mostlyclean-am + +clean-am: clean-generic mostlyclean-am + +clean: clean-am + +distclean-am: distclean-generic clean-am + -rm -f libtool + +distclean: distclean-am + +maintainer-clean-am: maintainer-clean-generic distclean-am + @echo "This command is intended for maintainers to use;" + @echo "it deletes files that may require special tools to rebuild." + +maintainer-clean: maintainer-clean-am + +.PHONY: tags distdir info-am info dvi-am dvi check check-am \ +installcheck-am installcheck install-exec-am install-exec \ +install-data-am install-data install-am install uninstall-am uninstall \ +all-redirect all-am all installdirs mostlyclean-generic \ +distclean-generic clean-generic maintainer-clean-generic clean \ +mostlyclean distclean maintainer-clean + + +# Tell versions [3.59,3.63) of GNU make to not export all variables. +# Otherwise a system limit (for SysV at least) may be exceeded. +.NOEXPORT: diff --git a/xdelta-1.1.3/djgpp/Makefile.am b/xdelta-1.1.3/djgpp/Makefile.am new file mode 100644 index 0000000..7ab6d22 --- /dev/null +++ b/xdelta-1.1.3/djgpp/Makefile.am @@ -0,0 +1,2 @@ + +EXTRA_DIST = readme.djg announce.djg diff --git a/xdelta-1.1.3/djgpp/Makefile.in b/xdelta-1.1.3/djgpp/Makefile.in new file mode 100644 index 0000000..82fd7de --- /dev/null +++ b/xdelta-1.1.3/djgpp/Makefile.in @@ -0,0 +1,185 @@ +# Makefile.in generated automatically by automake 1.4 from Makefile.am + +# Copyright (C) 1994, 1995-8, 1999 Free Software Foundation, Inc. +# This Makefile.in is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY, to the extent permitted by law; without +# even the implied warranty of MERCHANTABILITY or FITNESS FOR A +# PARTICULAR PURPOSE. + + +SHELL = @SHELL@ + +srcdir = @srcdir@ +top_srcdir = @top_srcdir@ +VPATH = @srcdir@ +prefix = @prefix@ +exec_prefix = @exec_prefix@ + +bindir = @bindir@ +sbindir = @sbindir@ +libexecdir = @libexecdir@ +datadir = @datadir@ +sysconfdir = @sysconfdir@ +sharedstatedir = @sharedstatedir@ +localstatedir = @localstatedir@ +libdir = @libdir@ +infodir = @infodir@ +mandir = @mandir@ +includedir = @includedir@ +oldincludedir = /usr/include + +DESTDIR = + +pkgdatadir = $(datadir)/@PACKAGE@ +pkglibdir = $(libdir)/@PACKAGE@ +pkgincludedir = $(includedir)/@PACKAGE@ + +top_builddir = .. + +ACLOCAL = @ACLOCAL@ +AUTOCONF = @AUTOCONF@ +AUTOMAKE = @AUTOMAKE@ +AUTOHEADER = @AUTOHEADER@ + +INSTALL = @INSTALL@ +INSTALL_PROGRAM = @INSTALL_PROGRAM@ $(AM_INSTALL_PROGRAM_FLAGS) +INSTALL_DATA = @INSTALL_DATA@ +INSTALL_SCRIPT = @INSTALL_SCRIPT@ +transform = @program_transform_name@ + +NORMAL_INSTALL = : +PRE_INSTALL = : +POST_INSTALL = : +NORMAL_UNINSTALL = : +PRE_UNINSTALL = : +POST_UNINSTALL = : +host_alias = @host_alias@ +host_triplet = @host@ +AS = @AS@ +CC = @CC@ +CPP = @CPP@ +DLLTOOL = @DLLTOOL@ +EMACS = @EMACS@ +GLIB_CFLAGS = @GLIB_CFLAGS@ +GLIB_CONFIG = @GLIB_CONFIG@ +GLIB_LIBS = @GLIB_LIBS@ +LD = @LD@ +LIBTOOL = @LIBTOOL@ +LN_S = @LN_S@ +MAINT = @MAINT@ +MAKEINFO = @MAKEINFO@ +NM = @NM@ +OBJDUMP = @OBJDUMP@ +PACKAGE = @PACKAGE@ +RANLIB = @RANLIB@ +VERSION = @VERSION@ +top_srcdir_absolute = @top_srcdir_absolute@ + +EXTRA_DIST = readme.djg announce.djg +mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs +CONFIG_HEADER = ../config.h +CONFIG_CLEAN_FILES = +DIST_COMMON = Makefile.am Makefile.in + + +DISTFILES = $(DIST_COMMON) $(SOURCES) $(HEADERS) $(TEXINFOS) $(EXTRA_DIST) + +TAR = tar +GZIP_ENV = --best +all: all-redirect +.SUFFIXES: +$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ Makefile.am $(top_srcdir)/configure.in $(ACLOCAL_M4) + cd $(top_srcdir) && $(AUTOMAKE) --gnu --include-deps djgpp/Makefile + +Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status + cd $(top_builddir) \ + && CONFIG_FILES=$(subdir)/$@ CONFIG_HEADERS= $(SHELL) ./config.status + +tags: TAGS +TAGS: + + +distdir = $(top_builddir)/$(PACKAGE)-$(VERSION)/$(subdir) + +subdir = djgpp + +distdir: $(DISTFILES) + @for file in $(DISTFILES); do \ + d=$(srcdir); \ + if test -d $$d/$$file; then \ + cp -pr $$d/$$file $(distdir)/$$file; \ + else \ + test -f $(distdir)/$$file \ + || ln $$d/$$file $(distdir)/$$file 2> /dev/null \ + || cp -p $$d/$$file $(distdir)/$$file || :; \ + fi; \ + done +info-am: +info: info-am +dvi-am: +dvi: dvi-am +check-am: all-am +check: check-am +installcheck-am: +installcheck: installcheck-am +install-exec-am: +install-exec: install-exec-am + +install-data-am: +install-data: install-data-am + +install-am: all-am + @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am +install: install-am +uninstall-am: +uninstall: uninstall-am +all-am: Makefile +all-redirect: all-am +install-strip: + $(MAKE) $(AM_MAKEFLAGS) AM_INSTALL_PROGRAM_FLAGS=-s install +installdirs: + + +mostlyclean-generic: + +clean-generic: + +distclean-generic: + -rm -f Makefile $(CONFIG_CLEAN_FILES) + -rm -f config.cache config.log stamp-h stamp-h[0-9]* + +maintainer-clean-generic: +mostlyclean-am: mostlyclean-generic + +mostlyclean: mostlyclean-am + +clean-am: clean-generic mostlyclean-am + +clean: clean-am + +distclean-am: distclean-generic clean-am + -rm -f libtool + +distclean: distclean-am + +maintainer-clean-am: maintainer-clean-generic distclean-am + @echo "This command is intended for maintainers to use;" + @echo "it deletes files that may require special tools to rebuild." + +maintainer-clean: maintainer-clean-am + +.PHONY: tags distdir info-am info dvi-am dvi check check-am \ +installcheck-am installcheck install-exec-am install-exec \ +install-data-am install-data install-am install uninstall-am uninstall \ +all-redirect all-am all installdirs mostlyclean-generic \ +distclean-generic clean-generic maintainer-clean-generic clean \ +mostlyclean distclean maintainer-clean + + +# Tell versions [3.59,3.63) of GNU make to not export all variables. +# Otherwise a system limit (for SysV at least) may be exceeded. +.NOEXPORT: diff --git a/xdelta-1.1.3/djgpp/announce.djg b/xdelta-1.1.3/djgpp/announce.djg new file mode 100644 index 0000000..cf0ecd8 --- /dev/null +++ b/xdelta-1.1.3/djgpp/announce.djg @@ -0,0 +1,98 @@ +From: Richard Dawe (rich@phekda.freeserve.co.uk) +Subject: ANNOUNCE: Release 2 of DJGPP port of XDelta 1.1.1 +Newsgroups: comp.os.msdos.djgpp +Date: 2001-04-05 13:42:13 PST + + +Hello. + +I've updated the port of XDelta 1.1.1 to DJGPP. If you used the previous +release, PLEASE UPGRADE. This release fixes a bug that could cause data +loss. Several other minor bugfixes should make the port much more usable. +See below for a list of bugfixes. The DJGPP readme has also been updated +to include a little more information on XDelta, since the XDelta +documentation is not very helpful. + +Here is a description of XDelta, from its 'readme' file: + +"XDelta is a library interface and application program designed to compute +changes between files. These changes (deltas) are similar to the output +of the "diff" program in that they may be used to store and transmit only +the changes between files. However, unlike diff, the output of XDelta is +not expressed in a human-readable format--XDelta can also also apply these +deltas to a copy of the original file(s). XDelta uses a fast, linear +algorithm and performs well on both binary and text files. XDelta +typically outperforms GNU diff in both time and generated-delta-size, even +for plain text files. XDelta also includes a simple implementation of the +Rsync algorithm and several advanced features for implementing RCS-like +file-archival with." + +XDelta is distributed under the GNU General Public License. + +The port is available from the DJGPP archive on SimTel.NET: + +ftp://ftp.simtel.net/pub/simtelnet/gnu/djgpp/v2apps/xdlt111b.zip +ftp://ftp.simtel.net/pub/simtelnet/gnu/djgpp/v2apps/xdlt111s.zip + +These are binary and source distributions respectively. If you only want +to use XDelta, please download the binary distribution. If you would like +to rebuild XDelta, please download the source distribution. Minor changes +were required to port XDelta to DJGPP - the diffs are included in the +source distribution. + +Bugs fixed since Release 1 +-------------------------- + +* Temporary filenames are now generated to fit into the MS-DOS 8+3 + filename convention. + +* Temporary files should now be removed, when XDelta has finised. + + Previously, XDelta tried to remove them before they had been closed. On + MS-DOS this can cause filesystem corruption; on Windows this just leaves + the temporary files lying around. + +* XDelta's buffers are now sized by default according to the amount of + free physical memory. It defaults to using 87.5% (7/8) of + the available memory. + + Previously, XDelta would try to entire files into memory, to patch them. + This included decompressing gzip files. Hence, it was quite easy for + XDelta to exhaust available memory, resulting in XDelta crashing. + +* The '-m' or '--maxmem' switches, which set the maximum memory usage + by XDelta, are now honoured. XDelta will use up to the specified size. + NB: XDelta will not check the amount specified - be careful. If you + give it too little memory, it will take a long time. If you give it + more memory than is actually available, it will crash. + + Previously, XDelta would take the maximum of the specified size or 8MB. + Since XDelta may be running on computers with 8MB or less, this was + unsatisfactory. + + To see XDelta's maximum memory usage, run in verbose mode, e.g.: + + xdelta patch -V + + It will display a message like: + + xdelta: using 4096 kilobytes of buffer space + +* A couple of error messages were modified to include the file name, to + make it clearer what the error is. + +* The info manual is now omitted from the distribution, since it does not + contain any useful information about XDelta. + +* A formatted man page is now included. + +Thanks to Eli Zaretskii for his detailed bug reports, suggestions and +testing! + +If you have any problems, suggestions, etc. about the port, please mail +me. + +Bye, + +-- +Richard Dawe http://www.bigfoot.com/~richdawe/ diff --git a/xdelta-1.1.3/djgpp/readme.djg b/xdelta-1.1.3/djgpp/readme.djg new file mode 100644 index 0000000..cd86eb3 --- /dev/null +++ b/xdelta-1.1.3/djgpp/readme.djg @@ -0,0 +1,152 @@ +DJGPP Port of XDelta 1.1.1 - Release 2 +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +Installing the Binary Package +----------------------------- + +Unzip the distribution preserving the directory structure - use PKUNZIP's -d +option; use an equivalent option with other unzippers. Unzip into the top +DJGPP installation directory, e.g. c:\djgpp. + +XDelta should now be ready for use. A man page for XDelta is provided - use: + + man xdelta + +to view it. You will need to have installed the man program from the v2apps/ +directory of the DJGPP archive for this to work. + +Installing the Source Package +----------------------------- + +You should only install the source package if you want to rebuild XDelta from +the sources. To build the port, I used the following packages: + +. DJGPP 2.03 +. GNU bash 2.04 +. GNU gcc 2.95.2 +. GNU binutils 2.9.5.1 beta +. GNU sed 3.02 +. GNU awk 3.03 +. GNU fileutils 3.16 +. GNU shellutils 1.12 +. glib 1.2.6 +. zlib 1.1.2 + +It may be possible to build XDelta with other versions of each package, but +this has not been tested. + +Unzip the distribution preserving the directory structure - use PKUNZIP's -d +option; use an equivalent option with other unzippers. Unzip into the top +DJGPP installation directory, e.g. c:\djgpp. + +A few changes were made to XDelta to make it work with DJGPP. The file +contrib/xdlt111/djgpp/xdmain-c.diff was applied to xdmain.c. The source +distribution has this patch applied, so no action is required to apply it. + +Before building XDelta, it must be configured. This is done from bash +in the source directory using: + + ./configure --prefix=/dev/env/DJDIR + +Once this has compelted, build using: + + make + +Run the tests using: + + make check + +If these compelte successfully, XDelta and its libraries can be installed +using: + + make install + +Some notes on using XDelta +-------------------------- + +* XDelta is fairly simple - to see what options are available, use: + + xdelta --help + +* The '-p' or '--pristine' option prevents XDelta from using gzip + compression, this avoids creating temporary files. This option + is presented because gzip does not support exact re-compression, + since there is no way to save the configuration used to produce + a particular gzip file. + +Bugs fixed since Release 1 +-------------------------- + +* Temporary filenames are now generated to fit into the MS-DOS 8+3 filename + convention. + +* Temporary files should now be removed, when XDelta has finised. + + Previously, XDelta tried to remove them before they had been closed. On + MS-DOS this can cause filesystem corruption; on Windows this just leaves + the temporary files lying around. + +* XDelta's buffers are now sized by default according to the amount of + free physical memory. It defaults to using 87.5% (7/8) of + the available memory. + + Previously, XDelta would try to entire files into memory, to patch them. + This included decompressing gzip files. Hence, it was quite easy for + XDelta to exhaust available memory, resulting in XDelta crashing. + +* The '-m' or '--maxmem' switches, which set the maximum memory usage + by XDelta, are now honoured. XDelta will use up to the specified size. + NB: XDelta will not check the amount specified - be careful. If you + give it too little memory, it will take a long time. If you give it + more memory than is actually available, it will crash. + + Previously, XDelta would take the maximum of the specified size or 8MB. + Since XDelta may be running on computers with 8MB or less, this was + unsatisfactory. + + To see XDelta's maximum memory usage, run in verbose mode, e.g.: + + xdelta patch -V + + It will display a message like: + + xdelta: using 4096 kilobytes of buffer space + +* A couple of error messages were modified to include the file name, to make + it clearer what the error is. + +* The info manual is now omitted from the distribution, since it does not + contain any useful information about XDelta. + +* A formatted man page is now included. + +libxdelta and libedsio +---------------------- + +XDelta is actually just a front-end for two libraries - libxdelta +and libedsio. libxdelta is a library for handling XDelta-format deltas. +libedsio is a library for handling serialised I/O. Both these libraries are +included in the port and can be used in your own programs. + +Unfortunately, there is no documentation for these libraries - the only +reference is the source code. If you are interested in libxdelta and libedsio, +please download the source distribution. Please note that I am not familiar +with these libraries and I will not be able to answer any queries on them. + +libxdelta and libedsio come with *-config files, which return compilation +and linking parameters. They are similar to glib-config. Example: + + bash-2.04$ xdelta-config --cflags + -I/dev/env/DJDIR/lib/glib/include -I/dev/env/DJDIR/include + bash-2.04$ $DJDIR/bin/xdelta-config --libs + -L/dev/env/DJDIR/lib -lxdelta -ledsio -lglib + +Finally +------- + +If you have any comments or problems with this port, please feel free to +e-mail me. I hope this port is useful. + +Thanks, bye, + +Richard Dawe 2001-03-31 diff --git a/xdelta-1.1.3/doc/Makefile b/xdelta-1.1.3/doc/Makefile new file mode 100644 index 0000000..224f6ac --- /dev/null +++ b/xdelta-1.1.3/doc/Makefile @@ -0,0 +1,231 @@ +# Generated automatically from Makefile.in by configure. +# Makefile.in generated automatically by automake 1.4 from Makefile.am + +# Copyright (C) 1994, 1995-8, 1999 Free Software Foundation, Inc. +# This Makefile.in is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY, to the extent permitted by law; without +# even the implied warranty of MERCHANTABILITY or FITNESS FOR A +# PARTICULAR PURPOSE. + + +SHELL = /bin/sh + +srcdir = . +top_srcdir = .. +prefix = /usr/local +exec_prefix = ${prefix} + +bindir = ${exec_prefix}/bin +sbindir = ${exec_prefix}/sbin +libexecdir = ${exec_prefix}/libexec +datadir = ${prefix}/share +sysconfdir = ${prefix}/etc +sharedstatedir = ${prefix}/com +localstatedir = ${prefix}/var +libdir = ${exec_prefix}/lib +infodir = ${prefix}/info +mandir = ${prefix}/man +includedir = ${prefix}/include +oldincludedir = /usr/include + +DESTDIR = + +pkgdatadir = $(datadir)/xdelta +pkglibdir = $(libdir)/xdelta +pkgincludedir = $(includedir)/xdelta + +top_builddir = .. + +ACLOCAL = aclocal +AUTOCONF = autoconf +AUTOMAKE = automake +AUTOHEADER = autoheader + +INSTALL = /usr/bin/install -c +INSTALL_PROGRAM = ${INSTALL} $(AM_INSTALL_PROGRAM_FLAGS) +INSTALL_DATA = ${INSTALL} -m 644 +INSTALL_SCRIPT = ${INSTALL_PROGRAM} +transform = s,x,x, + +NORMAL_INSTALL = : +PRE_INSTALL = : +POST_INSTALL = : +NORMAL_UNINSTALL = : +PRE_UNINSTALL = : +POST_UNINSTALL = : +host_alias = powerpc-apple +host_triplet = powerpc-apple-macos +AS = @AS@ +CC = gcc +CPP = gcc -E +DLLTOOL = @DLLTOOL@ +EMACS = /usr/bin/emacs +GLIB_CFLAGS = -I/usr/local/include/glib-1.2 -I/usr/local/lib/glib/include +GLIB_CONFIG = /usr/local/bin/glib-config +GLIB_LIBS = -L/usr/local/lib -lglib +LD = /usr/bin/ld +LIBTOOL = $(SHELL) $(top_builddir)/libtool +LN_S = ln -s +MAINT = # +MAKEINFO = makeinfo +NM = /usr/bin/nm -p +OBJDUMP = @OBJDUMP@ +PACKAGE = xdelta +RANLIB = ranlib +VERSION = 1.1.3 +top_srcdir_absolute = /Users/icculus/projects/mojopatch/xdelta-1.1.3 + +man_MANS = xdelta.1 + +EXTRA_DIST = xdelta.1 xdelta.cat +mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs +CONFIG_HEADER = ../config.h +CONFIG_CLEAN_FILES = +man1dir = $(mandir)/man1 +MANS = $(man_MANS) + +NROFF = nroff +DIST_COMMON = Makefile.am Makefile.in + + +DISTFILES = $(DIST_COMMON) $(SOURCES) $(HEADERS) $(TEXINFOS) $(EXTRA_DIST) + +TAR = tar +GZIP_ENV = --best +all: all-redirect +.SUFFIXES: +$(srcdir)/Makefile.in: # Makefile.am $(top_srcdir)/configure.in $(ACLOCAL_M4) + cd $(top_srcdir) && $(AUTOMAKE) --gnu --include-deps doc/Makefile + +Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status + cd $(top_builddir) \ + && CONFIG_FILES=$(subdir)/$@ CONFIG_HEADERS= $(SHELL) ./config.status + + +install-man1: + $(mkinstalldirs) $(DESTDIR)$(man1dir) + @list='$(man1_MANS)'; \ + l2='$(man_MANS)'; for i in $$l2; do \ + case "$$i" in \ + *.1*) list="$$list $$i" ;; \ + esac; \ + done; \ + for i in $$list; do \ + if test -f $(srcdir)/$$i; then file=$(srcdir)/$$i; \ + else file=$$i; fi; \ + ext=`echo $$i | sed -e 's/^.*\\.//'`; \ + inst=`echo $$i | sed -e 's/\\.[0-9a-z]*$$//'`; \ + inst=`echo $$inst | sed '$(transform)'`.$$ext; \ + echo " $(INSTALL_DATA) $$file $(DESTDIR)$(man1dir)/$$inst"; \ + $(INSTALL_DATA) $$file $(DESTDIR)$(man1dir)/$$inst; \ + done + +uninstall-man1: + @list='$(man1_MANS)'; \ + l2='$(man_MANS)'; for i in $$l2; do \ + case "$$i" in \ + *.1*) list="$$list $$i" ;; \ + esac; \ + done; \ + for i in $$list; do \ + ext=`echo $$i | sed -e 's/^.*\\.//'`; \ + inst=`echo $$i | sed -e 's/\\.[0-9a-z]*$$//'`; \ + inst=`echo $$inst | sed '$(transform)'`.$$ext; \ + echo " rm -f $(DESTDIR)$(man1dir)/$$inst"; \ + rm -f $(DESTDIR)$(man1dir)/$$inst; \ + done +install-man: $(MANS) + @$(NORMAL_INSTALL) + $(MAKE) $(AM_MAKEFLAGS) install-man1 +uninstall-man: + @$(NORMAL_UNINSTALL) + $(MAKE) $(AM_MAKEFLAGS) uninstall-man1 +tags: TAGS +TAGS: + + +distdir = $(top_builddir)/$(PACKAGE)-$(VERSION)/$(subdir) + +subdir = doc + +distdir: $(DISTFILES) + @for file in $(DISTFILES); do \ + d=$(srcdir); \ + if test -d $$d/$$file; then \ + cp -pr $$d/$$file $(distdir)/$$file; \ + else \ + test -f $(distdir)/$$file \ + || ln $$d/$$file $(distdir)/$$file 2> /dev/null \ + || cp -p $$d/$$file $(distdir)/$$file || :; \ + fi; \ + done +info-am: +info: info-am +dvi-am: +dvi: dvi-am +check-am: all-am +check: check-am +installcheck-am: +installcheck: installcheck-am +install-exec-am: +install-exec: install-exec-am + +install-data-am: install-man +install-data: install-data-am + +install-am: all-am + @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am +install: install-am +uninstall-am: uninstall-man +uninstall: uninstall-am +all-am: Makefile $(MANS) +all-redirect: all-am +install-strip: + $(MAKE) $(AM_MAKEFLAGS) AM_INSTALL_PROGRAM_FLAGS=-s install +installdirs: + $(mkinstalldirs) $(DESTDIR)$(mandir)/man1 + + +mostlyclean-generic: + +clean-generic: + +distclean-generic: + -rm -f Makefile $(CONFIG_CLEAN_FILES) + -rm -f config.cache config.log stamp-h stamp-h[0-9]* + +maintainer-clean-generic: +mostlyclean-am: mostlyclean-generic + +mostlyclean: mostlyclean-am + +clean-am: clean-generic mostlyclean-am + +clean: clean-am + +distclean-am: distclean-generic clean-am + -rm -f libtool + +distclean: distclean-am + +maintainer-clean-am: maintainer-clean-generic distclean-am + @echo "This command is intended for maintainers to use;" + @echo "it deletes files that may require special tools to rebuild." + +maintainer-clean: maintainer-clean-am + +.PHONY: install-man1 uninstall-man1 install-man uninstall-man tags \ +distdir info-am info dvi-am dvi check check-am installcheck-am \ +installcheck install-exec-am install-exec install-data-am install-data \ +install-am install uninstall-am uninstall all-redirect all-am all \ +installdirs mostlyclean-generic distclean-generic clean-generic \ +maintainer-clean-generic clean mostlyclean distclean maintainer-clean + + +# Tell versions [3.59,3.63) of GNU make to not export all variables. +# Otherwise a system limit (for SysV at least) may be exceeded. +.NOEXPORT: diff --git a/xdelta-1.1.3/doc/Makefile.am b/xdelta-1.1.3/doc/Makefile.am new file mode 100644 index 0000000..062008a --- /dev/null +++ b/xdelta-1.1.3/doc/Makefile.am @@ -0,0 +1,3 @@ +man_MANS = xdelta.1 + +EXTRA_DIST = xdelta.1 xdelta.cat diff --git a/xdelta-1.1.3/doc/Makefile.in b/xdelta-1.1.3/doc/Makefile.in new file mode 100644 index 0000000..0c72782 --- /dev/null +++ b/xdelta-1.1.3/doc/Makefile.in @@ -0,0 +1,231 @@ +# Makefile.in generated automatically by automake 1.4 from Makefile.am + +# Copyright (C) 1994, 1995-8, 1999 Free Software Foundation, Inc. +# This Makefile.in is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY, to the extent permitted by law; without +# even the implied warranty of MERCHANTABILITY or FITNESS FOR A +# PARTICULAR PURPOSE. + + +SHELL = @SHELL@ + +srcdir = @srcdir@ +top_srcdir = @top_srcdir@ +VPATH = @srcdir@ +prefix = @prefix@ +exec_prefix = @exec_prefix@ + +bindir = @bindir@ +sbindir = @sbindir@ +libexecdir = @libexecdir@ +datadir = @datadir@ +sysconfdir = @sysconfdir@ +sharedstatedir = @sharedstatedir@ +localstatedir = @localstatedir@ +libdir = @libdir@ +infodir = @infodir@ +mandir = @mandir@ +includedir = @includedir@ +oldincludedir = /usr/include + +DESTDIR = + +pkgdatadir = $(datadir)/@PACKAGE@ +pkglibdir = $(libdir)/@PACKAGE@ +pkgincludedir = $(includedir)/@PACKAGE@ + +top_builddir = .. + +ACLOCAL = @ACLOCAL@ +AUTOCONF = @AUTOCONF@ +AUTOMAKE = @AUTOMAKE@ +AUTOHEADER = @AUTOHEADER@ + +INSTALL = @INSTALL@ +INSTALL_PROGRAM = @INSTALL_PROGRAM@ $(AM_INSTALL_PROGRAM_FLAGS) +INSTALL_DATA = @INSTALL_DATA@ +INSTALL_SCRIPT = @INSTALL_SCRIPT@ +transform = @program_transform_name@ + +NORMAL_INSTALL = : +PRE_INSTALL = : +POST_INSTALL = : +NORMAL_UNINSTALL = : +PRE_UNINSTALL = : +POST_UNINSTALL = : +host_alias = @host_alias@ +host_triplet = @host@ +AS = @AS@ +CC = @CC@ +CPP = @CPP@ +DLLTOOL = @DLLTOOL@ +EMACS = @EMACS@ +GLIB_CFLAGS = @GLIB_CFLAGS@ +GLIB_CONFIG = @GLIB_CONFIG@ +GLIB_LIBS = @GLIB_LIBS@ +LD = @LD@ +LIBTOOL = @LIBTOOL@ +LN_S = @LN_S@ +MAINT = @MAINT@ +MAKEINFO = @MAKEINFO@ +NM = @NM@ +OBJDUMP = @OBJDUMP@ +PACKAGE = @PACKAGE@ +RANLIB = @RANLIB@ +VERSION = @VERSION@ +top_srcdir_absolute = @top_srcdir_absolute@ + +man_MANS = xdelta.1 + +EXTRA_DIST = xdelta.1 xdelta.cat +mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs +CONFIG_HEADER = ../config.h +CONFIG_CLEAN_FILES = +man1dir = $(mandir)/man1 +MANS = $(man_MANS) + +NROFF = nroff +DIST_COMMON = Makefile.am Makefile.in + + +DISTFILES = $(DIST_COMMON) $(SOURCES) $(HEADERS) $(TEXINFOS) $(EXTRA_DIST) + +TAR = tar +GZIP_ENV = --best +all: all-redirect +.SUFFIXES: +$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ Makefile.am $(top_srcdir)/configure.in $(ACLOCAL_M4) + cd $(top_srcdir) && $(AUTOMAKE) --gnu --include-deps doc/Makefile + +Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status + cd $(top_builddir) \ + && CONFIG_FILES=$(subdir)/$@ CONFIG_HEADERS= $(SHELL) ./config.status + + +install-man1: + $(mkinstalldirs) $(DESTDIR)$(man1dir) + @list='$(man1_MANS)'; \ + l2='$(man_MANS)'; for i in $$l2; do \ + case "$$i" in \ + *.1*) list="$$list $$i" ;; \ + esac; \ + done; \ + for i in $$list; do \ + if test -f $(srcdir)/$$i; then file=$(srcdir)/$$i; \ + else file=$$i; fi; \ + ext=`echo $$i | sed -e 's/^.*\\.//'`; \ + inst=`echo $$i | sed -e 's/\\.[0-9a-z]*$$//'`; \ + inst=`echo $$inst | sed '$(transform)'`.$$ext; \ + echo " $(INSTALL_DATA) $$file $(DESTDIR)$(man1dir)/$$inst"; \ + $(INSTALL_DATA) $$file $(DESTDIR)$(man1dir)/$$inst; \ + done + +uninstall-man1: + @list='$(man1_MANS)'; \ + l2='$(man_MANS)'; for i in $$l2; do \ + case "$$i" in \ + *.1*) list="$$list $$i" ;; \ + esac; \ + done; \ + for i in $$list; do \ + ext=`echo $$i | sed -e 's/^.*\\.//'`; \ + inst=`echo $$i | sed -e 's/\\.[0-9a-z]*$$//'`; \ + inst=`echo $$inst | sed '$(transform)'`.$$ext; \ + echo " rm -f $(DESTDIR)$(man1dir)/$$inst"; \ + rm -f $(DESTDIR)$(man1dir)/$$inst; \ + done +install-man: $(MANS) + @$(NORMAL_INSTALL) + $(MAKE) $(AM_MAKEFLAGS) install-man1 +uninstall-man: + @$(NORMAL_UNINSTALL) + $(MAKE) $(AM_MAKEFLAGS) uninstall-man1 +tags: TAGS +TAGS: + + +distdir = $(top_builddir)/$(PACKAGE)-$(VERSION)/$(subdir) + +subdir = doc + +distdir: $(DISTFILES) + @for file in $(DISTFILES); do \ + d=$(srcdir); \ + if test -d $$d/$$file; then \ + cp -pr $$d/$$file $(distdir)/$$file; \ + else \ + test -f $(distdir)/$$file \ + || ln $$d/$$file $(distdir)/$$file 2> /dev/null \ + || cp -p $$d/$$file $(distdir)/$$file || :; \ + fi; \ + done +info-am: +info: info-am +dvi-am: +dvi: dvi-am +check-am: all-am +check: check-am +installcheck-am: +installcheck: installcheck-am +install-exec-am: +install-exec: install-exec-am + +install-data-am: install-man +install-data: install-data-am + +install-am: all-am + @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am +install: install-am +uninstall-am: uninstall-man +uninstall: uninstall-am +all-am: Makefile $(MANS) +all-redirect: all-am +install-strip: + $(MAKE) $(AM_MAKEFLAGS) AM_INSTALL_PROGRAM_FLAGS=-s install +installdirs: + $(mkinstalldirs) $(DESTDIR)$(mandir)/man1 + + +mostlyclean-generic: + +clean-generic: + +distclean-generic: + -rm -f Makefile $(CONFIG_CLEAN_FILES) + -rm -f config.cache config.log stamp-h stamp-h[0-9]* + +maintainer-clean-generic: +mostlyclean-am: mostlyclean-generic + +mostlyclean: mostlyclean-am + +clean-am: clean-generic mostlyclean-am + +clean: clean-am + +distclean-am: distclean-generic clean-am + -rm -f libtool + +distclean: distclean-am + +maintainer-clean-am: maintainer-clean-generic distclean-am + @echo "This command is intended for maintainers to use;" + @echo "it deletes files that may require special tools to rebuild." + +maintainer-clean: maintainer-clean-am + +.PHONY: install-man1 uninstall-man1 install-man uninstall-man tags \ +distdir info-am info dvi-am dvi check check-am installcheck-am \ +installcheck install-exec-am install-exec install-data-am install-data \ +install-am install uninstall-am uninstall all-redirect all-am all \ +installdirs mostlyclean-generic distclean-generic clean-generic \ +maintainer-clean-generic clean mostlyclean distclean maintainer-clean + + +# Tell versions [3.59,3.63) of GNU make to not export all variables. +# Otherwise a system limit (for SysV at least) may be exceeded. +.NOEXPORT: diff --git a/xdelta-1.1.3/doc/xdelta.1 b/xdelta-1.1.3/doc/xdelta.1 new file mode 100644 index 0000000..b766255 --- /dev/null +++ b/xdelta-1.1.3/doc/xdelta.1 @@ -0,0 +1,195 @@ +.ds p \&\s-1Xdelta\s0 +.if n .ds - \%-- +.if t .ds - \(em +.if !\n(.g \{\ +. if !\w|\*(lq| \{\ +. ds lq `` +. if \w'\(lq' .ds lq "\(lq +. \} +. if !\w|\*(rq| \{\ +. ds rq '' +. if \w'\(rq' .ds rq "\(rq +. \} +.\} +.de PE +.sp \\n()Pu +.ne 2 +.nf +.IP +.. +.de EP +.fi +.PP +.sp \\n()Pu +.. +.TH Xdelta 1 +.SH NAME +xdelta \- Invoke Xdelta +.SH SYNOPSIS +.B xdelta +.I subcommand +[ +.IR option ".\|.\|. +] [ +.IR operand .\|.\|. +] +.SH DESCRIPTION +Xdelta provides the ability to generate deltas between a pair of files +and later apply those deltas. It operates similar to the +.B diff +and +.B patch +commands, but works on binary files and does not produce a human +readable output. +.PP + +Xdelta has three subcommands, delta, patch, and info. Delta accepts +two file versions and produces a delta, while patch accepts the +original file version and delta and produces the second version. The +info command prints useful information about a delta. Each subcommand +will be detailed seperately. + +.SS Gzip processing +Attempting to compute a delta between compressed input files usually +results in poor compression. This is because small differences +between the original contents causes changes in the compression of +whole blocks of data. To simplify things, Xdelta implements a special +case for +.IR gzip (1) +compressed files. If any version input to the delta command is +recognized as having gzip compression, it will be automatically +decompressed into a temporary location prior to comparison. This +temporary location is either the value of the +.IR TMPDIR +environment variable, if set, otherwise "/tmp". + +The Xdelta patch header contains a flag indicating that the +reconstructed version should be recompressed after applying the +patch. In general, this allows Xdelta to operate transparently on +gzip compressed inputs. + +There is one potential problem when automatically processing gzip +compressed files, which is that the recompressed content does not +always match byte-for-byte with the original compressed content. The +uncompressed content still matches, but if there is an external +integrity check such as cryptographic signature verification, it may +fail. To prevent this from happening, the --pristine option disables +automatic gzip processing. + +.SS MD5 integrity check +By default, Xdelta always verifies the MD5 checksum of the files it +reconstructs. This prevents you from supplying an incorrect input +during patch, which would result in corrupt output. Because of this +feature, you can feel confident that patch has produced valid results. +The --noverify option disables MD5 verification, but this is only +recommended for performance testing. + +.SS Compressed patch format +Xdelta uses a fairly simple encoding for its delta, then applies zlib +compression to the result. You should not have to post-compress an +Xdelta delta. + +.SS Delta +The delta subcommand has the following synopsis: + +.B xdelta +.I delta +[ +.IR option ".\|.\|. +] +.IR fromfile +.IR tofile +.IR patchout + +Computes a delta from +.IR fromfile +to +.IR tofile +and writes it to +.IR patchout + +.SS Patch +The patch subcommand has the following synopsis: + +.B xdelta +.I patch +[ +.IR option ".\|.\|. +] +.IR patchin +[ +.IR fromfile +[ +.IR tofile +]] + +Applies +.IR patchin +to +.IR fromfile +and produces a reconstructed version of +.IR tofile. + +If fromfile was omitted, Xdelta attempts to use the original fromfile +name, which is stored in the delta. The from file must be identical +to the one used to create the delta. If its length or MD5 checksum +differs, patch will abort with an error message. + +If tofile was omitted, Xdelta attempts to use the original tofile +name, which is also stored in the delta. If the original tofile name +already exists, a unique filename extension will be added to avoid +destroying any existing data. + +.SS Info +The info subcommand has the following synopsis: + +.B xdelta +.I info +.IR patchinfo + +Prints information about +.IR patchinfo +and the version it reconstructs, including file names, lengths, and +MD5 checksums. + +.SS Options + +.IP -0..9 +Set the zlib compression level. Zero indicates no compression. Nine +indicates maximum compression. + +.IP "-h, --help" +Print a short help message and exit. + +.IP "-q, --quiet" +Quiet. Surpresses several warning messages. + +.IP "-v, --version" +Print the Xdelta version number and exit. + +.IP "-V, --verbose" +Verbose. Prints a bit of extra information. + +.IP "-n, --noverify" +No verify. Turns off MD5 checksum verification of the input and +output files. + +.IP "-m=SIZE, --maxmem=SIZE" +Set an upper bound on the size of an in-memory page cache. For +example, --maxmem=32M will use a 32 megabyte page cache. + +.IP "-s=BLOCK_SIZE" +Set the block size, unless it was hard coded (20% speed improvement). +Should be a power of 2. + +.IP "-p, --pristine" +Disable the automatic decompression of gzipped inputs, to prevent +unexpected differences in the re-compressed content. + +.SH IDENTIFICATION +Author: Joshua P. MacDonald, jmacd@cs.berkeley.edu +.br +.\" $Format: "Manual Page Revision: $Revision: 1.1 $; Release Date: $ProjectDate$."$ +Manual Page Revision: 1.5; Release Date: Fri, 29 Jun 2001 06:01:08 -0700. +.br +Copyright \(co 1997, 1998, 1999, 2000, 2001 diff --git a/xdelta-1.1.3/doc/xdelta.cat b/xdelta-1.1.3/doc/xdelta.cat new file mode 100644 index 0000000..7bc1ed6 --- /dev/null +++ b/xdelta-1.1.3/doc/xdelta.cat @@ -0,0 +1,138 @@ +Xdelta(1) Xdelta(1) + +NAME + xdelta - Invoke Xdelta + +SYNOPSIS + xdelta subcommand [ option... ] [ operand... ] + +DESCRIPTION + + Xdelta provides the ability to generate deltas between a pair + of files and later apply those deltas. It operates similar to + the diff and patch commands, but works on binary files and does + not produce a human readable output. + + Xdelta has three subcommands, delta, patch, and info. Delta + accepts two file versions and produces a delta, while patch + accepts the original file version and delta and produces the + second version. The info command prints useful information + about a delta. Each subcommand will be detailed seperately. + + Gzip processing + + Attempting to compute a delta between compressed input files + usually results in poor compression. This is because small + differences between the original contents causes changes in the + compression of whole blocks of data. To simplify things, + Xdelta implements a special case for gzip(1) compressed files. + If any version input to the delta command is recognized as + having gzip compression, it will be automatically decompressed + into a temporary location prior to comparison. This temporary + location is either the value of the TMPDIR environment + variable, if set, otherwise "/tmp". + + The Xdelta patch header contains a flag indicating that the + reconstructed version should be recompressed after applying + the patch. In general, this allows Xdelta to operate + transparently on gzip compressed inputs. + + There is one potential problem when automatically processing + gzip compressed files, which is that the recompressed content + does not always match byte-for-byte with the original + compressed content. The uncompressed content still matches, + but if there is an external integrity check such as + cryptographic signature verification, it may fail. To prevent + this from happening, the --pristine option disables automatic + gzip processing. + + MD5 integrity check + + By default, Xdelta always verifies the MD5 checksum of the + files it reconstructs. This prevents you from supplying an + incorrect input during patch, which would result in corrupt + output. Because of this feature, you can feel confident that + patch has produced valid results. The --noverify option + disables MD5 verification, but this is only recommended for + performance testing. + + Compressed patch format + + Xdelta uses a fairly simple encoding for its delta, then + applies zlib compression to the result. You should not have to + post-compress an Xdelta delta. + + Delta + + The delta subcommand has the following synopsis: + + xdelta delta [ option... ] fromfile tofile patchout + + Computes a delta from fromfile to tofile and writes it to patchout + + Patch + + The patch subcommand has the following synopsis: + + xdelta patch [ option... ] patchin [ fromfile [ tofile ]] + + Applies patchin to fromfile and produces a reconstructed + version of tofile. + + If fromfile was omitted, Xdelta attempts to use the original + fromfile name, which is stored in the delta. The from file + must be identical to the one used to create the delta. If its + length or MD5 checksum differs, patch will abort with an error + message. + + If tofile was omitted, Xdelta attempts to use the original + tofile name, which is also stored in the delta. If the + original tofile name already exists, a unique filename + extension will be added to avoid destroying any existing data. + + Info + The info subcommand has the following synopsis: + + xdelta info patchinfo + + Prints information about patchinfo and the version it + reconstructs, including file names, lengths, and MD5 checksums. + + Options + -0..9 Set the zlib compression level. Zero indicates no + compression. Nine indicates maximum compression. + + -h, --help + Print a short help message and exit. + + -q, --quiet + Quiet. Surpresses several warning messages. + + -v, --version + Print the Xdelta version number and exit. + + -V, --verbose + Verbose. Prints a bit of extra information. + + -n, --noverify + No verify. Turns off MD5 checksum verification of the + input and output files. + + -m=SIZE, --maxmem=SIZE + Set an upper bound on the size of an in-memory page + cache. For example, --maxmem=32M will use a 32 megabyte + page cache. + + -s=BLOCK_SIZE + Set the block size, unless it was hard coded (20% speed + improvement). Should be a power of 2. + + -p, --pristine + Disable the automatic decompression of gzipped + inputs, to prevent unexpected differences in the + re-compressed content. + +IDENTIFICATION + Author: Joshua P. MacDonald, jmacd@cs.berkeley.edu + Manual Page Revision: 1.2; Release Date: Mon, 11 Jun 2001 03:39:53 -0700. + Copyright © 1997, 1998, 1999, 2000, 2001 diff --git a/xdelta-1.1.3/getopt.c b/xdelta-1.1.3/getopt.c new file mode 100644 index 0000000..28b8fea --- /dev/null +++ b/xdelta-1.1.3/getopt.c @@ -0,0 +1,749 @@ +/* Getopt for GNU. + NOTE: getopt is now part of the C library, so if you don't know what + "Keep this file name-space clean" means, talk to roland@gnu.ai.mit.edu + before changing it! + + Copyright (C) 1987, 88, 89, 90, 91, 92, 93, 94 + Free Software Foundation, Inc. + + This program is free software; you can redistribute it and/or modify it + under the terms of the GNU General Public License as published by the + Free Software Foundation; either version 2, or (at your option) any + later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. */ + +/* This tells Alpha OSF/1 not to define a getopt prototype in . + Ditto for AIX 3.2 and . */ +#ifndef _NO_PROTO +#define _NO_PROTO +#endif + +#ifndef __STDC__ +/* This is a separate conditional since some stdc systems + reject `defined (const)'. */ +#ifndef const +#define const +#endif +#endif + +#ifdef HAVE_CONFIG_H +#include +#endif + +#include +#include + +/* Comment out all this code if we are using the GNU C Library, and are not + actually compiling the library itself. This code is part of the GNU C + Library, but also included in many other GNU distributions. Compiling + and linking in this code is a waste when using the GNU C library + (especially if it is a shared library). Rather than having every GNU + program understand `configure --with-gnu-libc' and omit the object files, + it is simpler to just do this in the source for each such file. */ + +#if defined (_LIBC) || !defined (__GNU_LIBRARY__) + + +/* This needs to come after some library #include + to get __GNU_LIBRARY__ defined. */ +#ifdef __GNU_LIBRARY__ +/* Don't include stdlib.h for non-GNU C libraries because some of them + contain conflicting prototypes for getopt. */ +#include +#endif /* GNU C library. */ + +/* This version of `getopt' appears to the caller like standard Unix `getopt' + but it behaves differently for the user, since it allows the user + to intersperse the options with the other arguments. + + As `getopt' works, it permutes the elements of ARGV so that, + when it is done, all the options precede everything else. Thus + all application programs are extended to handle flexible argument order. + + Setting the environment variable POSIXLY_CORRECT disables permutation. + Then the behavior is completely standard. + + GNU application programs can use a third alternative mode in which + they can distinguish the relative order of options and other arguments. */ + +#include "getopt.h" + +/* For communication from `getopt' to the caller. + When `getopt' finds an option that takes an argument, + the argument value is returned here. + Also, when `ordering' is RETURN_IN_ORDER, + each non-option ARGV-element is returned here. */ + +char *optarg = NULL; + +/* Index in ARGV of the next element to be scanned. + This is used for communication to and from the caller + and for communication between successive calls to `getopt'. + + On entry to `getopt', zero means this is the first call; initialize. + + When `getopt' returns EOF, this is the index of the first of the + non-option elements that the caller should itself scan. + + Otherwise, `optind' communicates from one call to the next + how much of ARGV has been scanned so far. */ + +/* XXX 1003.2 says this must be 1 before any call. */ +int optind = 0; + +/* The next char to be scanned in the option-element + in which the last option character we returned was found. + This allows us to pick up the scan where we left off. + + If this is zero, or a null string, it means resume the scan + by advancing to the next ARGV-element. */ + +static char *nextchar; + +/* Callers store zero here to inhibit the error message + for unrecognized options. */ + +int opterr = 1; + +/* Set to an option character which was unrecognized. + This must be initialized on some systems to avoid linking in the + system's own getopt implementation. */ + +int optopt = '?'; + +/* Describe how to deal with options that follow non-option ARGV-elements. + + If the caller did not specify anything, + the default is REQUIRE_ORDER if the environment variable + POSIXLY_CORRECT is defined, PERMUTE otherwise. + + REQUIRE_ORDER means don't recognize them as options; + stop option processing when the first non-option is seen. + This is what Unix does. + This mode of operation is selected by either setting the environment + variable POSIXLY_CORRECT, or using `+' as the first character + of the list of option characters. + + PERMUTE is the default. We permute the contents of ARGV as we scan, + so that eventually all the non-options are at the end. This allows options + to be given in any order, even with programs that were not written to + expect this. + + RETURN_IN_ORDER is an option available to programs that were written + to expect options and other ARGV-elements in any order and that care about + the ordering of the two. We describe each non-option ARGV-element + as if it were the argument of an option with character code 1. + Using `-' as the first character of the list of option characters + selects this mode of operation. + + The special argument `--' forces an end of option-scanning regardless + of the value of `ordering'. In the case of RETURN_IN_ORDER, only + `--' can cause `getopt' to return EOF with `optind' != ARGC. */ + +static enum +{ + REQUIRE_ORDER, PERMUTE, RETURN_IN_ORDER +} ordering; + +/* Value of POSIXLY_CORRECT environment variable. */ +static char *posixly_correct; + +#ifdef __GNU_LIBRARY__ +/* We want to avoid inclusion of string.h with non-GNU libraries + because there are many ways it can cause trouble. + On some systems, it contains special magic macros that don't work + in GCC. */ +#include +#define my_index strchr +#else + +/* Avoid depending on library functions or files + whose names are inconsistent. */ + +char *getenv (); + +static char * +my_index (str, chr) + const char *str; + int chr; +{ + while (*str) + { + if (*str == chr) + return (char *) str; + str++; + } + return 0; +} + +/* If using GCC, we can safely declare strlen this way. + If not using GCC, it is ok not to declare it. */ +#ifdef __GNUC__ +/* Note that Motorola Delta 68k R3V7 comes with GCC but not stddef.h. + That was relevant to code that was here before. */ +#ifndef __STDC__ +/* gcc with -traditional declares the built-in strlen to return int, + and has done so at least since version 2.4.5. -- rms. */ +extern int strlen (const char *); +#endif /* not __STDC__ */ +#endif /* __GNUC__ */ + +#endif /* not __GNU_LIBRARY__ */ + +/* Handle permutation of arguments. */ + +/* Describe the part of ARGV that contains non-options that have + been skipped. `first_nonopt' is the index in ARGV of the first of them; + `last_nonopt' is the index after the last of them. */ + +static int first_nonopt; +static int last_nonopt; + +/* Exchange two adjacent subsequences of ARGV. + One subsequence is elements [first_nonopt,last_nonopt) + which contains all the non-options that have been skipped so far. + The other is elements [last_nonopt,optind), which contains all + the options processed since those non-options were skipped. + + `first_nonopt' and `last_nonopt' are relocated so that they describe + the new indices of the non-options in ARGV after they are moved. */ + +static void +exchange (argv) + char **argv; +{ + int bottom = first_nonopt; + int middle = last_nonopt; + int top = optind; + char *tem; + + /* Exchange the shorter segment with the far end of the longer segment. + That puts the shorter segment into the right place. + It leaves the longer segment in the right place overall, + but it consists of two parts that need to be swapped next. */ + + while (top > middle && middle > bottom) + { + if (top - middle > middle - bottom) + { + /* Bottom segment is the short one. */ + int len = middle - bottom; + register int i; + + /* Swap it with the top part of the top segment. */ + for (i = 0; i < len; i++) + { + tem = argv[bottom + i]; + argv[bottom + i] = argv[top - (middle - bottom) + i]; + argv[top - (middle - bottom) + i] = tem; + } + /* Exclude the moved bottom segment from further swapping. */ + top -= len; + } + else + { + /* Top segment is the short one. */ + int len = top - middle; + register int i; + + /* Swap it with the bottom part of the bottom segment. */ + for (i = 0; i < len; i++) + { + tem = argv[bottom + i]; + argv[bottom + i] = argv[middle + i]; + argv[middle + i] = tem; + } + /* Exclude the moved top segment from further swapping. */ + bottom += len; + } + } + + /* Update records for the slots the non-options now occupy. */ + + first_nonopt += (optind - last_nonopt); + last_nonopt = optind; +} + +/* Initialize the internal data when the first call is made. */ + +static const char * +_getopt_initialize (optstring) + const char *optstring; +{ + /* Start processing options with ARGV-element 1 (since ARGV-element 0 + is the program name); the sequence of previously skipped + non-option ARGV-elements is empty. */ + + first_nonopt = last_nonopt = optind = 1; + + nextchar = NULL; + + posixly_correct = getenv ("POSIXLY_CORRECT"); + + /* Determine how to handle the ordering of options and nonoptions. */ + + if (optstring[0] == '-') + { + ordering = RETURN_IN_ORDER; + ++optstring; + } + else if (optstring[0] == '+') + { + ordering = REQUIRE_ORDER; + ++optstring; + } + else if (posixly_correct != NULL) + ordering = REQUIRE_ORDER; + else + ordering = PERMUTE; + + return optstring; +} + +/* Scan elements of ARGV (whose length is ARGC) for option characters + given in OPTSTRING. + + If an element of ARGV starts with '-', and is not exactly "-" or "--", + then it is an option element. The characters of this element + (aside from the initial '-') are option characters. If `getopt' + is called repeatedly, it returns successively each of the option characters + from each of the option elements. + + If `getopt' finds another option character, it returns that character, + updating `optind' and `nextchar' so that the next call to `getopt' can + resume the scan with the following option character or ARGV-element. + + If there are no more option characters, `getopt' returns `EOF'. + Then `optind' is the index in ARGV of the first ARGV-element + that is not an option. (The ARGV-elements have been permuted + so that those that are not options now come last.) + + OPTSTRING is a string containing the legitimate option characters. + If an option character is seen that is not listed in OPTSTRING, + return '?' after printing an error message. If you set `opterr' to + zero, the error message is suppressed but we still return '?'. + + If a char in OPTSTRING is followed by a colon, that means it wants an arg, + so the following text in the same ARGV-element, or the text of the following + ARGV-element, is returned in `optarg'. Two colons mean an option that + wants an optional arg; if there is text in the current ARGV-element, + it is returned in `optarg', otherwise `optarg' is set to zero. + + If OPTSTRING starts with `-' or `+', it requests different methods of + handling the non-option ARGV-elements. + See the comments about RETURN_IN_ORDER and REQUIRE_ORDER, above. + + Long-named options begin with `--' instead of `-'. + Their names may be abbreviated as long as the abbreviation is unique + or is an exact match for some defined option. If they have an + argument, it follows the option name in the same ARGV-element, separated + from the option name by a `=', or else the in next ARGV-element. + When `getopt' finds a long-named option, it returns 0 if that option's + `flag' field is nonzero, the value of the option's `val' field + if the `flag' field is zero. + + The elements of ARGV aren't really const, because we permute them. + But we pretend they're const in the prototype to be compatible + with other systems. + + LONGOPTS is a vector of `struct option' terminated by an + element containing a name which is zero. + + LONGIND returns the index in LONGOPT of the long-named option found. + It is only valid when a long-named option has been found by the most + recent call. + + If LONG_ONLY is nonzero, '-' as well as '--' can introduce + long-named options. */ + +int +_getopt_internal (argc, argv, optstring, longopts, longind, long_only) + int argc; + char *const *argv; + const char *optstring; + const struct option *longopts; + int *longind; + int long_only; +{ + optarg = NULL; + + if (optind == 0) + optstring = _getopt_initialize (optstring); + + if (nextchar == NULL || *nextchar == '\0') + { + /* Advance to the next ARGV-element. */ + + if (ordering == PERMUTE) + { + /* If we have just processed some options following some non-options, + exchange them so that the options come first. */ + + if (first_nonopt != last_nonopt && last_nonopt != optind) + exchange ((char **) argv); + else if (last_nonopt != optind) + first_nonopt = optind; + + /* Skip any additional non-options + and extend the range of non-options previously skipped. */ + + while (optind < argc + && (argv[optind][0] != '-' || argv[optind][1] == '\0')) + optind++; + last_nonopt = optind; + } + + /* The special ARGV-element `--' means premature end of options. + Skip it like a null option, + then exchange with previous non-options as if it were an option, + then skip everything else like a non-option. */ + + if (optind != argc && !strcmp (argv[optind], "--")) + { + optind++; + + if (first_nonopt != last_nonopt && last_nonopt != optind) + exchange ((char **) argv); + else if (first_nonopt == last_nonopt) + first_nonopt = optind; + last_nonopt = argc; + + optind = argc; + } + + /* If we have done all the ARGV-elements, stop the scan + and back over any non-options that we skipped and permuted. */ + + if (optind == argc) + { + /* Set the next-arg-index to point at the non-options + that we previously skipped, so the caller will digest them. */ + if (first_nonopt != last_nonopt) + optind = first_nonopt; + return EOF; + } + + /* If we have come to a non-option and did not permute it, + either stop the scan or describe it to the caller and pass it by. */ + + if ((argv[optind][0] != '-' || argv[optind][1] == '\0')) + { + if (ordering == REQUIRE_ORDER) + return EOF; + optarg = argv[optind++]; + return 1; + } + + /* We have found another option-ARGV-element. + Skip the initial punctuation. */ + + nextchar = (argv[optind] + 1 + + (longopts != NULL && argv[optind][1] == '-')); + } + + /* Decode the current option-ARGV-element. */ + + /* Check whether the ARGV-element is a long option. + + If long_only and the ARGV-element has the form "-f", where f is + a valid short option, don't consider it an abbreviated form of + a long option that starts with f. Otherwise there would be no + way to give the -f short option. + + On the other hand, if there's a long option "fubar" and + the ARGV-element is "-fu", do consider that an abbreviation of + the long option, just like "--fu", and not "-f" with arg "u". + + This distinction seems to be the most useful approach. */ + + if (longopts != NULL + && (argv[optind][1] == '-' + || (long_only && (argv[optind][2] || !my_index (optstring, argv[optind][1]))))) + { + char *nameend; + const struct option *p; + const struct option *pfound = NULL; + int exact = 0; + int ambig = 0; + int indfound; + int option_index; + + for (nameend = nextchar; *nameend && *nameend != '='; nameend++) + /* Do nothing. */ ; + + /* Test all long options for either exact match + or abbreviated matches. */ + for (p = longopts, option_index = 0; p->name; p++, option_index++) + if (!strncmp (p->name, nextchar, nameend - nextchar)) + { + if (nameend - nextchar == strlen (p->name)) + { + /* Exact match found. */ + pfound = p; + indfound = option_index; + exact = 1; + break; + } + else if (pfound == NULL) + { + /* First nonexact match found. */ + pfound = p; + indfound = option_index; + } + else + /* Second or later nonexact match found. */ + ambig = 1; + } + + if (ambig && !exact) + { + if (opterr) + fprintf (stderr, "%s: option `%s' is ambiguous\n", + argv[0], argv[optind]); + nextchar += strlen (nextchar); + optind++; + return '?'; + } + + if (pfound != NULL) + { + option_index = indfound; + optind++; + if (*nameend) + { + /* Don't test has_arg with >, because some C compilers don't + allow it to be used on enums. */ + if (pfound->has_arg) + optarg = nameend + 1; + else + { + if (opterr) + { + if (argv[optind - 1][1] == '-') + /* --option */ + fprintf (stderr, + "%s: option `--%s' doesn't allow an argument\n", + argv[0], pfound->name); + else + /* +option or -option */ + fprintf (stderr, + "%s: option `%c%s' doesn't allow an argument\n", + argv[0], argv[optind - 1][0], pfound->name); + } + nextchar += strlen (nextchar); + return '?'; + } + } + else if (pfound->has_arg == 1) + { + if (optind < argc) + optarg = argv[optind++]; + else + { + if (opterr) + fprintf (stderr, "%s: option `%s' requires an argument\n", + argv[0], argv[optind - 1]); + nextchar += strlen (nextchar); + return optstring[0] == ':' ? ':' : '?'; + } + } + nextchar += strlen (nextchar); + if (longind != NULL) + *longind = option_index; + if (pfound->flag) + { + *(pfound->flag) = pfound->val; + return 0; + } + return pfound->val; + } + + /* Can't find it as a long option. If this is not getopt_long_only, + or the option starts with '--' or is not a valid short + option, then it's an error. + Otherwise interpret it as a short option. */ + if (!long_only || argv[optind][1] == '-' + || my_index (optstring, *nextchar) == NULL) + { + if (opterr) + { + if (argv[optind][1] == '-') + /* --option */ + fprintf (stderr, "%s: unrecognized option `--%s'\n", + argv[0], nextchar); + else + /* +option or -option */ + fprintf (stderr, "%s: unrecognized option `%c%s'\n", + argv[0], argv[optind][0], nextchar); + } + nextchar = (char *) ""; + optind++; + return '?'; + } + } + + /* Look at and handle the next short option-character. */ + + { + char c = *nextchar++; + char *temp = my_index (optstring, c); + + /* Increment `optind' when we start to process its last character. */ + if (*nextchar == '\0') + ++optind; + + if (temp == NULL || c == ':') + { + if (opterr) + { + if (posixly_correct) + /* 1003.2 specifies the format of this message. */ + fprintf (stderr, "%s: illegal option -- %c\n", argv[0], c); + else + fprintf (stderr, "%s: invalid option -- %c\n", argv[0], c); + } + optopt = c; + return '?'; + } + if (temp[1] == ':') + { + if (temp[2] == ':') + { + /* This is an option that accepts an argument optionally. */ + if (*nextchar != '\0') + { + optarg = nextchar; + optind++; + } + else + optarg = NULL; + nextchar = NULL; + } + else + { + /* This is an option that requires an argument. */ + if (*nextchar != '\0') + { + optarg = nextchar; + /* If we end this ARGV-element by taking the rest as an arg, + we must advance to the next element now. */ + optind++; + } + else if (optind == argc) + { + if (opterr) + { + /* 1003.2 specifies the format of this message. */ + fprintf (stderr, "%s: option requires an argument -- %c\n", + argv[0], c); + } + optopt = c; + if (optstring[0] == ':') + c = ':'; + else + c = '?'; + } + else + /* We already incremented `optind' once; + increment it again when taking next ARGV-elt as argument. */ + optarg = argv[optind++]; + nextchar = NULL; + } + } + return c; + } +} + +int +getopt (argc, argv, optstring) + int argc; + char *const *argv; + const char *optstring; +{ + return _getopt_internal (argc, argv, optstring, + (const struct option *) 0, + (int *) 0, + 0); +} + +#endif /* _LIBC or not __GNU_LIBRARY__. */ + +#ifdef TEST + +/* Compile with -DTEST to make an executable for use in testing + the above definition of `getopt'. */ + +int +main (argc, argv) + int argc; + char **argv; +{ + int c; + int digit_optind = 0; + + while (1) + { + int this_option_optind = optind ? optind : 1; + + c = getopt (argc, argv, "abc:d:0123456789"); + if (c == EOF) + break; + + switch (c) + { + case '0': + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': + if (digit_optind != 0 && digit_optind != this_option_optind) + printf ("digits occur in two different argv-elements.\n"); + digit_optind = this_option_optind; + printf ("option %c\n", c); + break; + + case 'a': + printf ("option a\n"); + break; + + case 'b': + printf ("option b\n"); + break; + + case 'c': + printf ("option c with value `%s'\n", optarg); + break; + + case '?': + break; + + default: + printf ("?? getopt returned character code 0%o ??\n", c); + } + } + + if (optind < argc) + { + printf ("non-option ARGV-elements: "); + while (optind < argc) + printf ("%s ", argv[optind++]); + printf ("\n"); + } + + exit (0); +} + +#endif /* TEST */ diff --git a/xdelta-1.1.3/getopt.h b/xdelta-1.1.3/getopt.h new file mode 100644 index 0000000..45541f5 --- /dev/null +++ b/xdelta-1.1.3/getopt.h @@ -0,0 +1,129 @@ +/* Declarations for getopt. + Copyright (C) 1989, 1990, 1991, 1992, 1993 Free Software Foundation, Inc. + + This program is free software; you can redistribute it and/or modify it + under the terms of the GNU General Public License as published by the + Free Software Foundation; either version 2, or (at your option) any + later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. */ + +#ifndef _GETOPT_H +#define _GETOPT_H 1 + +#ifdef __cplusplus +extern "C" { +#endif + +/* For communication from `getopt' to the caller. + When `getopt' finds an option that takes an argument, + the argument value is returned here. + Also, when `ordering' is RETURN_IN_ORDER, + each non-option ARGV-element is returned here. */ + +extern char *optarg; + +/* Index in ARGV of the next element to be scanned. + This is used for communication to and from the caller + and for communication between successive calls to `getopt'. + + On entry to `getopt', zero means this is the first call; initialize. + + When `getopt' returns EOF, this is the index of the first of the + non-option elements that the caller should itself scan. + + Otherwise, `optind' communicates from one call to the next + how much of ARGV has been scanned so far. */ + +extern int optind; + +/* Callers store zero here to inhibit the error message `getopt' prints + for unrecognized options. */ + +extern int opterr; + +/* Set to an option character which was unrecognized. */ + +extern int optopt; + +/* Describe the long-named options requested by the application. + The LONG_OPTIONS argument to getopt_long or getopt_long_only is a vector + of `struct option' terminated by an element containing a name which is + zero. + + The field `has_arg' is: + no_argument (or 0) if the option does not take an argument, + required_argument (or 1) if the option requires an argument, + optional_argument (or 2) if the option takes an optional argument. + + If the field `flag' is not NULL, it points to a variable that is set + to the value given in the field `val' when the option is found, but + left unchanged if the option is not found. + + To have a long-named option do something other than set an `int' to + a compiled-in constant, such as set a value from `optarg', set the + option's `flag' field to zero and its `val' field to a nonzero + value (the equivalent single-letter option character, if there is + one). For long options that have a zero `flag' field, `getopt' + returns the contents of the `val' field. */ + +struct option +{ +#if __STDC__ + const char *name; +#else + char *name; +#endif + /* has_arg can't be an enum because some compilers complain about + type mismatches in all the code that assumes it is an int. */ + int has_arg; + int *flag; + int val; +}; + +/* Names for the values of the `has_arg' field of `struct option'. */ + +#define no_argument 0 +#define required_argument 1 +#define optional_argument 2 + +#if __STDC__ +#if defined(__GNU_LIBRARY__) +/* Many other libraries have conflicting prototypes for getopt, with + differences in the consts, in stdlib.h. To avoid compilation + errors, only prototype getopt for the GNU C library. */ +extern int getopt (int argc, char *const *argv, const char *shortopts); +#else /* not __GNU_LIBRARY__ */ +extern int getopt (); +#endif /* not __GNU_LIBRARY__ */ +extern int getopt_long (int argc, char *const *argv, const char *shortopts, + const struct option *longopts, int *longind); +extern int getopt_long_only (int argc, char *const *argv, + const char *shortopts, + const struct option *longopts, int *longind); + +/* Internal only. Users should not call this directly. */ +extern int _getopt_internal (int argc, char *const *argv, + const char *shortopts, + const struct option *longopts, int *longind, + int long_only); +#else /* not __STDC__ */ +extern int getopt (); +extern int getopt_long (); +extern int getopt_long_only (); + +extern int _getopt_internal (); +#endif /* not __STDC__ */ + +#ifdef __cplusplus +} +#endif + +#endif /* _GETOPT_H */ diff --git a/xdelta-1.1.3/getopt1.c b/xdelta-1.1.3/getopt1.c new file mode 100644 index 0000000..725c653 --- /dev/null +++ b/xdelta-1.1.3/getopt1.c @@ -0,0 +1,180 @@ +/* getopt_long and getopt_long_only entry points for GNU getopt. + Copyright (C) 1987, 88, 89, 90, 91, 92, 1993 + Free Software Foundation, Inc. + + This program is free software; you can redistribute it and/or modify it + under the terms of the GNU General Public License as published by the + Free Software Foundation; either version 2, or (at your option) any + later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. */ + +#ifdef HAVE_CONFIG_H +#include +#endif + +#include "getopt.h" + +#ifndef __STDC__ +/* This is a separate conditional since some stdc systems + reject `defined (const)'. */ +#ifndef const +#define const +#endif +#endif + +#include + +/* Comment out all this code if we are using the GNU C Library, and are not + actually compiling the library itself. This code is part of the GNU C + Library, but also included in many other GNU distributions. Compiling + and linking in this code is a waste when using the GNU C library + (especially if it is a shared library). Rather than having every GNU + program understand `configure --with-gnu-libc' and omit the object files, + it is simpler to just do this in the source for each such file. */ + +#if defined (_LIBC) || !defined (__GNU_LIBRARY__) + + +/* This needs to come after some library #include + to get __GNU_LIBRARY__ defined. */ +#ifdef __GNU_LIBRARY__ +#include +#else +char *getenv (); +#endif + +#ifndef NULL +#define NULL 0 +#endif + +int +getopt_long (argc, argv, options, long_options, opt_index) + int argc; + char *const *argv; + const char *options; + const struct option *long_options; + int *opt_index; +{ + return _getopt_internal (argc, argv, options, long_options, opt_index, 0); +} + +/* Like getopt_long, but '-' as well as '--' can indicate a long option. + If an option that starts with '-' (not '--') doesn't match a long option, + but does match a short option, it is parsed as a short option + instead. */ + +int +getopt_long_only (argc, argv, options, long_options, opt_index) + int argc; + char *const *argv; + const char *options; + const struct option *long_options; + int *opt_index; +{ + return _getopt_internal (argc, argv, options, long_options, opt_index, 1); +} + + +#endif /* _LIBC or not __GNU_LIBRARY__. */ + +#ifdef TEST + +#include + +int +main (argc, argv) + int argc; + char **argv; +{ + int c; + int digit_optind = 0; + + while (1) + { + int this_option_optind = optind ? optind : 1; + int option_index = 0; + static struct option long_options[] = + { + {"add", 1, 0, 0}, + {"append", 0, 0, 0}, + {"delete", 1, 0, 0}, + {"verbose", 0, 0, 0}, + {"create", 0, 0, 0}, + {"file", 1, 0, 0}, + {0, 0, 0, 0} + }; + + c = getopt_long (argc, argv, "abc:d:0123456789", + long_options, &option_index); + if (c == EOF) + break; + + switch (c) + { + case 0: + printf ("option %s", long_options[option_index].name); + if (optarg) + printf (" with arg %s", optarg); + printf ("\n"); + break; + + case '0': + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': + if (digit_optind != 0 && digit_optind != this_option_optind) + printf ("digits occur in two different argv-elements.\n"); + digit_optind = this_option_optind; + printf ("option %c\n", c); + break; + + case 'a': + printf ("option a\n"); + break; + + case 'b': + printf ("option b\n"); + break; + + case 'c': + printf ("option c with value `%s'\n", optarg); + break; + + case 'd': + printf ("option d with value `%s'\n", optarg); + break; + + case '?': + break; + + default: + printf ("?? getopt returned character code 0%o ??\n", c); + } + } + + if (optind < argc) + { + printf ("non-option ARGV-elements: "); + while (optind < argc) + printf ("%s ", argv[optind++]); + printf ("\n"); + } + + exit (0); +} + +#endif /* TEST */ diff --git a/xdelta-1.1.3/install-sh b/xdelta-1.1.3/install-sh new file mode 100755 index 0000000..e9de238 --- /dev/null +++ b/xdelta-1.1.3/install-sh @@ -0,0 +1,251 @@ +#!/bin/sh +# +# install - install a program, script, or datafile +# This comes from X11R5 (mit/util/scripts/install.sh). +# +# Copyright 1991 by the Massachusetts Institute of Technology +# +# Permission to use, copy, modify, distribute, and sell this software and its +# documentation for any purpose is hereby granted without fee, provided that +# the above copyright notice appear in all copies and that both that +# copyright notice and this permission notice appear in supporting +# documentation, and that the name of M.I.T. not be used in advertising or +# publicity pertaining to distribution of the software without specific, +# written prior permission. M.I.T. makes no representations about the +# suitability of this software for any purpose. It is provided "as is" +# without express or implied warranty. +# +# Calling this script install-sh is preferred over install.sh, to prevent +# `make' implicit rules from creating a file called install from it +# when there is no Makefile. +# +# This script is compatible with the BSD install script, but was written +# from scratch. It can only install one file at a time, a restriction +# shared with many OS's install programs. + + +# set DOITPROG to echo to test this script + +# Don't use :- since 4.3BSD and earlier shells don't like it. +doit="${DOITPROG-}" + + +# put in absolute paths if you don't have them in your path; or use env. vars. + +mvprog="${MVPROG-mv}" +cpprog="${CPPROG-cp}" +chmodprog="${CHMODPROG-chmod}" +chownprog="${CHOWNPROG-chown}" +chgrpprog="${CHGRPPROG-chgrp}" +stripprog="${STRIPPROG-strip}" +rmprog="${RMPROG-rm}" +mkdirprog="${MKDIRPROG-mkdir}" + +transformbasename="" +transform_arg="" +instcmd="$mvprog" +chmodcmd="$chmodprog 0755" +chowncmd="" +chgrpcmd="" +stripcmd="" +rmcmd="$rmprog -f" +mvcmd="$mvprog" +src="" +dst="" +dir_arg="" + +while [ x"$1" != x ]; do + case $1 in + -c) instcmd="$cpprog" + shift + continue;; + + -d) dir_arg=true + shift + continue;; + + -m) chmodcmd="$chmodprog $2" + shift + shift + continue;; + + -o) chowncmd="$chownprog $2" + shift + shift + continue;; + + -g) chgrpcmd="$chgrpprog $2" + shift + shift + continue;; + + -s) stripcmd="$stripprog" + shift + continue;; + + -t=*) transformarg=`echo $1 | sed 's/-t=//'` + shift + continue;; + + -b=*) transformbasename=`echo $1 | sed 's/-b=//'` + shift + continue;; + + *) if [ x"$src" = x ] + then + src=$1 + else + # this colon is to work around a 386BSD /bin/sh bug + : + dst=$1 + fi + shift + continue;; + esac +done + +if [ x"$src" = x ] +then + echo "install: no input file specified" + exit 1 +else + true +fi + +if [ x"$dir_arg" != x ]; then + dst=$src + src="" + + if [ -d $dst ]; then + instcmd=: + chmodcmd="" + else + instcmd=mkdir + fi +else + +# Waiting for this to be detected by the "$instcmd $src $dsttmp" command +# might cause directories to be created, which would be especially bad +# if $src (and thus $dsttmp) contains '*'. + + if [ -f $src -o -d $src ] + then + true + else + echo "install: $src does not exist" + exit 1 + fi + + if [ x"$dst" = x ] + then + echo "install: no destination specified" + exit 1 + else + true + fi + +# If destination is a directory, append the input filename; if your system +# does not like double slashes in filenames, you may need to add some logic + + if [ -d $dst ] + then + dst="$dst"/`basename $src` + else + true + fi +fi + +## this sed command emulates the dirname command +dstdir=`echo $dst | sed -e 's,[^/]*$,,;s,/$,,;s,^$,.,'` + +# Make sure that the destination directory exists. +# this part is taken from Noah Friedman's mkinstalldirs script + +# Skip lots of stat calls in the usual case. +if [ ! -d "$dstdir" ]; then +defaultIFS=' +' +IFS="${IFS-${defaultIFS}}" + +oIFS="${IFS}" +# Some sh's can't handle IFS=/ for some reason. +IFS='%' +set - `echo ${dstdir} | sed -e 's@/@%@g' -e 's@^%@/@'` +IFS="${oIFS}" + +pathcomp='' + +while [ $# -ne 0 ] ; do + pathcomp="${pathcomp}${1}" + shift + + if [ ! -d "${pathcomp}" ] ; + then + $mkdirprog "${pathcomp}" + else + true + fi + + pathcomp="${pathcomp}/" +done +fi + +if [ x"$dir_arg" != x ] +then + $doit $instcmd $dst && + + if [ x"$chowncmd" != x ]; then $doit $chowncmd $dst; else true ; fi && + if [ x"$chgrpcmd" != x ]; then $doit $chgrpcmd $dst; else true ; fi && + if [ x"$stripcmd" != x ]; then $doit $stripcmd $dst; else true ; fi && + if [ x"$chmodcmd" != x ]; then $doit $chmodcmd $dst; else true ; fi +else + +# If we're going to rename the final executable, determine the name now. + + if [ x"$transformarg" = x ] + then + dstfile=`basename $dst` + else + dstfile=`basename $dst $transformbasename | + sed $transformarg`$transformbasename + fi + +# don't allow the sed command to completely eliminate the filename + + if [ x"$dstfile" = x ] + then + dstfile=`basename $dst` + else + true + fi + +# Make a temp file name in the proper directory. + + dsttmp=$dstdir/#inst.$$# + +# Move or copy the file name to the temp name + + $doit $instcmd $src $dsttmp && + + trap "rm -f ${dsttmp}" 0 && + +# and set any options; do chmod last to preserve setuid bits + +# If any of these fail, we abort the whole thing. If we want to +# ignore errors from any of these, just make sure not to ignore +# errors from the above "$doit $instcmd $src $dsttmp" command. + + if [ x"$chowncmd" != x ]; then $doit $chowncmd $dsttmp; else true;fi && + if [ x"$chgrpcmd" != x ]; then $doit $chgrpcmd $dsttmp; else true;fi && + if [ x"$stripcmd" != x ]; then $doit $stripcmd $dsttmp; else true;fi && + if [ x"$chmodcmd" != x ]; then $doit $chmodcmd $dsttmp; else true;fi && + +# Now rename the file to the real destination. + + $doit $rmcmd -f $dstdir/$dstfile && + $doit $mvcmd $dsttmp $dstdir/$dstfile + +fi && + + +exit 0 diff --git a/xdelta-1.1.3/libedsio/.libs/libedsio.lai b/xdelta-1.1.3/libedsio/.libs/libedsio.lai new file mode 100644 index 0000000..bcbb7e5 --- /dev/null +++ b/xdelta-1.1.3/libedsio/.libs/libedsio.lai @@ -0,0 +1,28 @@ +# libedsio.la - a libtool library file +# Generated by ltmain.sh - GNU libtool 1.3.3 (1.385.2.181 1999/07/02 15:49:11) +# +# Please DO NOT delete this file! +# It is necessary for linking the library. + +# The name that we can dlopen(3). +dlname='' + +# Names of this library. +library_names='' + +# The name of the static archive. +old_library='libedsio.a' + +# Libraries that this one depends upon. +dependency_libs=' -L/usr/local/lib -lglib' + +# Version information for libedsio. +current=0 +age=0 +revision=0 + +# Is this an already installed library? +installed=yes + +# Directory that this library needs to be installed in: +libdir='/usr/local/lib' diff --git a/xdelta-1.1.3/libedsio/Makefile b/xdelta-1.1.3/libedsio/Makefile new file mode 100644 index 0000000..2c125ed --- /dev/null +++ b/xdelta-1.1.3/libedsio/Makefile @@ -0,0 +1,411 @@ +# Generated automatically from Makefile.in by configure. +# Makefile.in generated automatically by automake 1.4 from Makefile.am + +# Copyright (C) 1994, 1995-8, 1999 Free Software Foundation, Inc. +# This Makefile.in is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY, to the extent permitted by law; without +# even the implied warranty of MERCHANTABILITY or FITNESS FOR A +# PARTICULAR PURPOSE. + + +SHELL = /bin/sh + +srcdir = . +top_srcdir = .. +prefix = /usr/local +exec_prefix = ${prefix} + +bindir = ${exec_prefix}/bin +sbindir = ${exec_prefix}/sbin +libexecdir = ${exec_prefix}/libexec +datadir = ${prefix}/share +sysconfdir = ${prefix}/etc +sharedstatedir = ${prefix}/com +localstatedir = ${prefix}/var +libdir = ${exec_prefix}/lib +infodir = ${prefix}/info +mandir = ${prefix}/man +includedir = ${prefix}/include +oldincludedir = /usr/include + +DESTDIR = + +pkgdatadir = $(datadir)/xdelta +pkglibdir = $(libdir)/xdelta +pkgincludedir = $(includedir)/xdelta + +top_builddir = .. + +ACLOCAL = aclocal +AUTOCONF = autoconf +AUTOMAKE = automake +AUTOHEADER = autoheader + +INSTALL = /usr/bin/install -c +INSTALL_PROGRAM = ${INSTALL} $(AM_INSTALL_PROGRAM_FLAGS) +INSTALL_DATA = ${INSTALL} -m 644 +INSTALL_SCRIPT = ${INSTALL_PROGRAM} +transform = s,x,x, + +NORMAL_INSTALL = : +PRE_INSTALL = : +POST_INSTALL = : +NORMAL_UNINSTALL = : +PRE_UNINSTALL = : +POST_UNINSTALL = : +host_alias = powerpc-apple +host_triplet = powerpc-apple-macos +AS = @AS@ +CC = gcc +CPP = gcc -E +DLLTOOL = @DLLTOOL@ +EMACS = /usr/bin/emacs +GLIB_CFLAGS = -I/usr/local/include/glib-1.2 -I/usr/local/lib/glib/include +GLIB_CONFIG = /usr/local/bin/glib-config +GLIB_LIBS = -L/usr/local/lib -lglib +LD = /usr/bin/ld +LIBTOOL = $(SHELL) $(top_builddir)/libtool +LN_S = ln -s +MAINT = # +MAKEINFO = makeinfo +NM = /usr/bin/nm -p +OBJDUMP = @OBJDUMP@ +PACKAGE = xdelta +RANLIB = ranlib +VERSION = 1.1.3 +top_srcdir_absolute = /Users/icculus/projects/mojopatch/xdelta-1.1.3 + +INCLUDES = $(GLIB_CFLAGS) + +noinst_SCRIPTS = edsio-comp + +lib_LTLIBRARIES = libedsio.la + +noinst_PROGRAMS = edsiotest + +edsiotest_SOURCES = edsiotest.c + +edsiotest_LDADD = libedsio.la $(GLIB_LIBS) + +noinst_HEADERS = maketime.h partime.h + +include_HEADERS = edsio.h edsio_edsio.h + +libedsio_la_LIBADD = $(GLIB_LIBS) + +libedsio_la_SOURCES = library.c simple.c edsio.c edsio_edsio.c sha.c md5c.c fh.c generic.c default.c base64.c maketime.c partime.c + + +EXTRA_DIST = edsio.el edsio.ser $(SER_OUT1) edsio-comp.in edsio.prj stamp-ser1 + +SER_OUT1 = edsio_edsio.c edsio_edsio.h + +BUILT_SOURCES = edsio_edsio.c +mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs +CONFIG_HEADER = ../config.h +CONFIG_CLEAN_FILES = edsio-comp +LTLIBRARIES = $(lib_LTLIBRARIES) + + +DEFS = -DHAVE_CONFIG_H -I. -I$(srcdir) -I.. +CPPFLAGS = +LDFLAGS = +LIBS = +libedsio_la_LDFLAGS = +libedsio_la_DEPENDENCIES = +libedsio_la_OBJECTS = library.lo simple.lo edsio.lo edsio_edsio.lo \ +sha.lo md5c.lo fh.lo generic.lo default.lo base64.lo maketime.lo \ +partime.lo +PROGRAMS = $(noinst_PROGRAMS) + +edsiotest_OBJECTS = edsiotest.o +edsiotest_DEPENDENCIES = libedsio.la +edsiotest_LDFLAGS = +SCRIPTS = $(noinst_SCRIPTS) + +CFLAGS = -Wall -Os +COMPILE = $(CC) $(DEFS) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) +LTCOMPILE = $(LIBTOOL) --mode=compile $(CC) $(DEFS) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) +CCLD = $(CC) +LINK = $(LIBTOOL) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(LDFLAGS) -o $@ +HEADERS = $(include_HEADERS) $(noinst_HEADERS) + +DIST_COMMON = Makefile.am Makefile.in edsio-comp.in + + +DISTFILES = $(DIST_COMMON) $(SOURCES) $(HEADERS) $(TEXINFOS) $(EXTRA_DIST) + +TAR = tar +GZIP_ENV = --best +SOURCES = $(libedsio_la_SOURCES) $(edsiotest_SOURCES) +OBJECTS = $(libedsio_la_OBJECTS) $(edsiotest_OBJECTS) + +all: all-redirect +.SUFFIXES: +.SUFFIXES: .S .c .lo .o .s +$(srcdir)/Makefile.in: # Makefile.am $(top_srcdir)/configure.in $(ACLOCAL_M4) + cd $(top_srcdir) && $(AUTOMAKE) --gnu --include-deps libedsio/Makefile + +Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status + cd $(top_builddir) \ + && CONFIG_FILES=$(subdir)/$@ CONFIG_HEADERS= $(SHELL) ./config.status + +edsio-comp: $(top_builddir)/config.status edsio-comp.in + cd $(top_builddir) && CONFIG_FILES=$(subdir)/$@ CONFIG_HEADERS= $(SHELL) ./config.status + +mostlyclean-libLTLIBRARIES: + +clean-libLTLIBRARIES: + -test -z "$(lib_LTLIBRARIES)" || rm -f $(lib_LTLIBRARIES) + +distclean-libLTLIBRARIES: + +maintainer-clean-libLTLIBRARIES: + +install-libLTLIBRARIES: $(lib_LTLIBRARIES) + @$(NORMAL_INSTALL) + $(mkinstalldirs) $(DESTDIR)$(libdir) + @list='$(lib_LTLIBRARIES)'; for p in $$list; do \ + if test -f $$p; then \ + echo "$(LIBTOOL) --mode=install $(INSTALL) $$p $(DESTDIR)$(libdir)/$$p"; \ + $(LIBTOOL) --mode=install $(INSTALL) $$p $(DESTDIR)$(libdir)/$$p; \ + else :; fi; \ + done + +uninstall-libLTLIBRARIES: + @$(NORMAL_UNINSTALL) + list='$(lib_LTLIBRARIES)'; for p in $$list; do \ + $(LIBTOOL) --mode=uninstall rm -f $(DESTDIR)$(libdir)/$$p; \ + done + +.c.o: + $(COMPILE) -c $< + +.s.o: + $(COMPILE) -c $< + +.S.o: + $(COMPILE) -c $< + +mostlyclean-compile: + -rm -f *.o core *.core + +clean-compile: + +distclean-compile: + -rm -f *.tab.c + +maintainer-clean-compile: + +.c.lo: + $(LIBTOOL) --mode=compile $(COMPILE) -c $< + +.s.lo: + $(LIBTOOL) --mode=compile $(COMPILE) -c $< + +.S.lo: + $(LIBTOOL) --mode=compile $(COMPILE) -c $< + +mostlyclean-libtool: + -rm -f *.lo + +clean-libtool: + -rm -rf .libs _libs + +distclean-libtool: + +maintainer-clean-libtool: + +libedsio.la: $(libedsio_la_OBJECTS) $(libedsio_la_DEPENDENCIES) + $(LINK) -rpath $(libdir) $(libedsio_la_LDFLAGS) $(libedsio_la_OBJECTS) $(libedsio_la_LIBADD) $(LIBS) + +mostlyclean-noinstPROGRAMS: + +clean-noinstPROGRAMS: + -test -z "$(noinst_PROGRAMS)" || rm -f $(noinst_PROGRAMS) + +distclean-noinstPROGRAMS: + +maintainer-clean-noinstPROGRAMS: + +edsiotest: $(edsiotest_OBJECTS) $(edsiotest_DEPENDENCIES) + @rm -f edsiotest + $(LINK) $(edsiotest_LDFLAGS) $(edsiotest_OBJECTS) $(edsiotest_LDADD) $(LIBS) + +install-includeHEADERS: $(include_HEADERS) + @$(NORMAL_INSTALL) + $(mkinstalldirs) $(DESTDIR)$(includedir) + @list='$(include_HEADERS)'; for p in $$list; do \ + if test -f "$$p"; then d= ; else d="$(srcdir)/"; fi; \ + echo " $(INSTALL_DATA) $$d$$p $(DESTDIR)$(includedir)/$$p"; \ + $(INSTALL_DATA) $$d$$p $(DESTDIR)$(includedir)/$$p; \ + done + +uninstall-includeHEADERS: + @$(NORMAL_UNINSTALL) + list='$(include_HEADERS)'; for p in $$list; do \ + rm -f $(DESTDIR)$(includedir)/$$p; \ + done + +tags: TAGS + +ID: $(HEADERS) $(SOURCES) $(LISP) + list='$(SOURCES) $(HEADERS)'; \ + unique=`for i in $$list; do echo $$i; done | \ + awk ' { files[$$0] = 1; } \ + END { for (i in files) print i; }'`; \ + here=`pwd` && cd $(srcdir) \ + && mkid -f$$here/ID $$unique $(LISP) + +TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) $(LISP) + tags=; \ + here=`pwd`; \ + list='$(SOURCES) $(HEADERS)'; \ + unique=`for i in $$list; do echo $$i; done | \ + awk ' { files[$$0] = 1; } \ + END { for (i in files) print i; }'`; \ + test -z "$(ETAGS_ARGS)$$unique$(LISP)$$tags" \ + || (cd $(srcdir) && etags $(ETAGS_ARGS) $$tags $$unique $(LISP) -o $$here/TAGS) + +mostlyclean-tags: + +clean-tags: + +distclean-tags: + -rm -f TAGS ID + +maintainer-clean-tags: + +distdir = $(top_builddir)/$(PACKAGE)-$(VERSION)/$(subdir) + +subdir = libedsio + +distdir: $(DISTFILES) + @for file in $(DISTFILES); do \ + d=$(srcdir); \ + if test -d $$d/$$file; then \ + cp -pr $$d/$$file $(distdir)/$$file; \ + else \ + test -f $(distdir)/$$file \ + || ln $$d/$$file $(distdir)/$$file 2> /dev/null \ + || cp -p $$d/$$file $(distdir)/$$file || :; \ + fi; \ + done +base64.lo base64.o : base64.c edsio.h ../config.h edsio_edsio.h +default.lo default.o : default.c edsio.h ../config.h edsio_edsio.h +edsio.lo edsio.o : edsio.c edsio.h ../config.h edsio_edsio.h maketime.h +edsio_edsio.lo edsio_edsio.o : edsio_edsio.c edsio.h ../config.h \ + edsio_edsio.h +edsiotest.o: edsiotest.c edsio.h ../config.h edsio_edsio.h +fh.lo fh.o : fh.c edsio.h ../config.h edsio_edsio.h +generic.lo generic.o : generic.c edsio.h ../config.h edsio_edsio.h +library.lo library.o : library.c edsio.h ../config.h edsio_edsio.h +maketime.lo maketime.o : maketime.c ../config.h partime.h maketime.h +md5c.lo md5c.o : md5c.c edsio.h ../config.h edsio_edsio.h +partime.lo partime.o : partime.c ../config.h partime.h +sha.lo sha.o : sha.c edsio.h ../config.h edsio_edsio.h +simple.lo simple.o : simple.c edsio.h ../config.h edsio_edsio.h + +info-am: +info: info-am +dvi-am: +dvi: dvi-am +check-am: all-am +check: check-am +installcheck-am: +installcheck: installcheck-am +install-exec-am: install-libLTLIBRARIES +install-exec: install-exec-am + +install-data-am: install-includeHEADERS +install-data: install-data-am + +install-am: all-am + @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am +install: install-am +uninstall-am: uninstall-libLTLIBRARIES uninstall-includeHEADERS +uninstall: uninstall-am +all-am: Makefile $(LTLIBRARIES) $(PROGRAMS) $(SCRIPTS) $(HEADERS) +all-redirect: all-am +install-strip: + $(MAKE) $(AM_MAKEFLAGS) AM_INSTALL_PROGRAM_FLAGS=-s install +installdirs: + $(mkinstalldirs) $(DESTDIR)$(libdir) $(DESTDIR)$(includedir) + + +mostlyclean-generic: + +clean-generic: + +distclean-generic: + -rm -f Makefile $(CONFIG_CLEAN_FILES) + -rm -f config.cache config.log stamp-h stamp-h[0-9]* + +maintainer-clean-generic: + -test -z "$(BUILT_SOURCES)" || rm -f $(BUILT_SOURCES) +mostlyclean-am: mostlyclean-libLTLIBRARIES mostlyclean-compile \ + mostlyclean-libtool mostlyclean-noinstPROGRAMS \ + mostlyclean-tags mostlyclean-generic + +mostlyclean: mostlyclean-am + +clean-am: clean-libLTLIBRARIES clean-compile clean-libtool \ + clean-noinstPROGRAMS clean-tags clean-generic \ + mostlyclean-am + +clean: clean-am + +distclean-am: distclean-libLTLIBRARIES distclean-compile \ + distclean-libtool distclean-noinstPROGRAMS \ + distclean-tags distclean-generic clean-am + -rm -f libtool + +distclean: distclean-am + +maintainer-clean-am: maintainer-clean-libLTLIBRARIES \ + maintainer-clean-compile maintainer-clean-libtool \ + maintainer-clean-noinstPROGRAMS maintainer-clean-tags \ + maintainer-clean-generic distclean-am + @echo "This command is intended for maintainers to use;" + @echo "it deletes files that may require special tools to rebuild." + +maintainer-clean: maintainer-clean-am + +.PHONY: mostlyclean-libLTLIBRARIES distclean-libLTLIBRARIES \ +clean-libLTLIBRARIES maintainer-clean-libLTLIBRARIES \ +uninstall-libLTLIBRARIES install-libLTLIBRARIES mostlyclean-compile \ +distclean-compile clean-compile maintainer-clean-compile \ +mostlyclean-libtool distclean-libtool clean-libtool \ +maintainer-clean-libtool mostlyclean-noinstPROGRAMS \ +distclean-noinstPROGRAMS clean-noinstPROGRAMS \ +maintainer-clean-noinstPROGRAMS uninstall-includeHEADERS \ +install-includeHEADERS tags mostlyclean-tags distclean-tags clean-tags \ +maintainer-clean-tags distdir info-am info dvi-am dvi check check-am \ +installcheck-am installcheck install-exec-am install-exec \ +install-data-am install-data install-am install uninstall-am uninstall \ +all-redirect all-am all installdirs mostlyclean-generic \ +distclean-generic clean-generic maintainer-clean-generic clean \ +mostlyclean distclean maintainer-clean + + +# +# Rules for the generated code +# + +stamp-ser1: $(top_srcdir)/libedsio/edsio.el edsio.ser + $(top_srcdir)/libedsio/edsio-comp edsio.ser + touch stamp-ser1 + +$(SER_OUT1): stamp-ser1 + +# +# +# + +# Tell versions [3.59,3.63) of GNU make to not export all variables. +# Otherwise a system limit (for SysV at least) may be exceeded. +.NOEXPORT: diff --git a/xdelta-1.1.3/libedsio/Makefile.am b/xdelta-1.1.3/libedsio/Makefile.am new file mode 100644 index 0000000..298aa02 --- /dev/null +++ b/xdelta-1.1.3/libedsio/Makefile.am @@ -0,0 +1,52 @@ + +INCLUDES = $(GLIB_CFLAGS) + +noinst_SCRIPTS = edsio-comp + +lib_LTLIBRARIES = libedsio.la + +noinst_PROGRAMS = edsiotest + +edsiotest_SOURCES = edsiotest.c + +edsiotest_LDADD = libedsio.la $(GLIB_LIBS) + +noinst_HEADERS = maketime.h partime.h + +include_HEADERS = edsio.h edsio_edsio.h + +libedsio_la_LIBADD = $(GLIB_LIBS) + +libedsio_la_SOURCES = \ + library.c \ + simple.c \ + edsio.c \ + edsio_edsio.c \ + sha.c \ + md5c.c \ + fh.c \ + generic.c \ + default.c \ + base64.c \ + maketime.c \ + partime.c + +EXTRA_DIST = edsio.el edsio.ser $(SER_OUT1) edsio-comp.in edsio.prj stamp-ser1 + +# +# Rules for the generated code +# + +stamp-ser1: $(top_srcdir)/libedsio/edsio.el edsio.ser + $(top_srcdir)/libedsio/edsio-comp edsio.ser + touch stamp-ser1 + +SER_OUT1 = edsio_edsio.c edsio_edsio.h + +$(SER_OUT1): stamp-ser1 + +BUILT_SOURCES = edsio_edsio.c + +# +# +# diff --git a/xdelta-1.1.3/libedsio/Makefile.in b/xdelta-1.1.3/libedsio/Makefile.in new file mode 100644 index 0000000..a70b820 --- /dev/null +++ b/xdelta-1.1.3/libedsio/Makefile.in @@ -0,0 +1,411 @@ +# Makefile.in generated automatically by automake 1.4 from Makefile.am + +# Copyright (C) 1994, 1995-8, 1999 Free Software Foundation, Inc. +# This Makefile.in is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY, to the extent permitted by law; without +# even the implied warranty of MERCHANTABILITY or FITNESS FOR A +# PARTICULAR PURPOSE. + + +SHELL = @SHELL@ + +srcdir = @srcdir@ +top_srcdir = @top_srcdir@ +VPATH = @srcdir@ +prefix = @prefix@ +exec_prefix = @exec_prefix@ + +bindir = @bindir@ +sbindir = @sbindir@ +libexecdir = @libexecdir@ +datadir = @datadir@ +sysconfdir = @sysconfdir@ +sharedstatedir = @sharedstatedir@ +localstatedir = @localstatedir@ +libdir = @libdir@ +infodir = @infodir@ +mandir = @mandir@ +includedir = @includedir@ +oldincludedir = /usr/include + +DESTDIR = + +pkgdatadir = $(datadir)/@PACKAGE@ +pkglibdir = $(libdir)/@PACKAGE@ +pkgincludedir = $(includedir)/@PACKAGE@ + +top_builddir = .. + +ACLOCAL = @ACLOCAL@ +AUTOCONF = @AUTOCONF@ +AUTOMAKE = @AUTOMAKE@ +AUTOHEADER = @AUTOHEADER@ + +INSTALL = @INSTALL@ +INSTALL_PROGRAM = @INSTALL_PROGRAM@ $(AM_INSTALL_PROGRAM_FLAGS) +INSTALL_DATA = @INSTALL_DATA@ +INSTALL_SCRIPT = @INSTALL_SCRIPT@ +transform = @program_transform_name@ + +NORMAL_INSTALL = : +PRE_INSTALL = : +POST_INSTALL = : +NORMAL_UNINSTALL = : +PRE_UNINSTALL = : +POST_UNINSTALL = : +host_alias = @host_alias@ +host_triplet = @host@ +AS = @AS@ +CC = @CC@ +CPP = @CPP@ +DLLTOOL = @DLLTOOL@ +EMACS = @EMACS@ +GLIB_CFLAGS = @GLIB_CFLAGS@ +GLIB_CONFIG = @GLIB_CONFIG@ +GLIB_LIBS = @GLIB_LIBS@ +LD = @LD@ +LIBTOOL = @LIBTOOL@ +LN_S = @LN_S@ +MAINT = @MAINT@ +MAKEINFO = @MAKEINFO@ +NM = @NM@ +OBJDUMP = @OBJDUMP@ +PACKAGE = @PACKAGE@ +RANLIB = @RANLIB@ +VERSION = @VERSION@ +top_srcdir_absolute = @top_srcdir_absolute@ + +INCLUDES = $(GLIB_CFLAGS) + +noinst_SCRIPTS = edsio-comp + +lib_LTLIBRARIES = libedsio.la + +noinst_PROGRAMS = edsiotest + +edsiotest_SOURCES = edsiotest.c + +edsiotest_LDADD = libedsio.la $(GLIB_LIBS) + +noinst_HEADERS = maketime.h partime.h + +include_HEADERS = edsio.h edsio_edsio.h + +libedsio_la_LIBADD = $(GLIB_LIBS) + +libedsio_la_SOURCES = library.c simple.c edsio.c edsio_edsio.c sha.c md5c.c fh.c generic.c default.c base64.c maketime.c partime.c + + +EXTRA_DIST = edsio.el edsio.ser $(SER_OUT1) edsio-comp.in edsio.prj stamp-ser1 + +SER_OUT1 = edsio_edsio.c edsio_edsio.h + +BUILT_SOURCES = edsio_edsio.c +mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs +CONFIG_HEADER = ../config.h +CONFIG_CLEAN_FILES = edsio-comp +LTLIBRARIES = $(lib_LTLIBRARIES) + + +DEFS = @DEFS@ -I. -I$(srcdir) -I.. +CPPFLAGS = @CPPFLAGS@ +LDFLAGS = @LDFLAGS@ +LIBS = @LIBS@ +libedsio_la_LDFLAGS = +libedsio_la_DEPENDENCIES = +libedsio_la_OBJECTS = library.lo simple.lo edsio.lo edsio_edsio.lo \ +sha.lo md5c.lo fh.lo generic.lo default.lo base64.lo maketime.lo \ +partime.lo +PROGRAMS = $(noinst_PROGRAMS) + +edsiotest_OBJECTS = edsiotest.o +edsiotest_DEPENDENCIES = libedsio.la +edsiotest_LDFLAGS = +SCRIPTS = $(noinst_SCRIPTS) + +CFLAGS = @CFLAGS@ +COMPILE = $(CC) $(DEFS) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) +LTCOMPILE = $(LIBTOOL) --mode=compile $(CC) $(DEFS) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) +CCLD = $(CC) +LINK = $(LIBTOOL) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(LDFLAGS) -o $@ +HEADERS = $(include_HEADERS) $(noinst_HEADERS) + +DIST_COMMON = Makefile.am Makefile.in edsio-comp.in + + +DISTFILES = $(DIST_COMMON) $(SOURCES) $(HEADERS) $(TEXINFOS) $(EXTRA_DIST) + +TAR = tar +GZIP_ENV = --best +SOURCES = $(libedsio_la_SOURCES) $(edsiotest_SOURCES) +OBJECTS = $(libedsio_la_OBJECTS) $(edsiotest_OBJECTS) + +all: all-redirect +.SUFFIXES: +.SUFFIXES: .S .c .lo .o .s +$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ Makefile.am $(top_srcdir)/configure.in $(ACLOCAL_M4) + cd $(top_srcdir) && $(AUTOMAKE) --gnu --include-deps libedsio/Makefile + +Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status + cd $(top_builddir) \ + && CONFIG_FILES=$(subdir)/$@ CONFIG_HEADERS= $(SHELL) ./config.status + +edsio-comp: $(top_builddir)/config.status edsio-comp.in + cd $(top_builddir) && CONFIG_FILES=$(subdir)/$@ CONFIG_HEADERS= $(SHELL) ./config.status + +mostlyclean-libLTLIBRARIES: + +clean-libLTLIBRARIES: + -test -z "$(lib_LTLIBRARIES)" || rm -f $(lib_LTLIBRARIES) + +distclean-libLTLIBRARIES: + +maintainer-clean-libLTLIBRARIES: + +install-libLTLIBRARIES: $(lib_LTLIBRARIES) + @$(NORMAL_INSTALL) + $(mkinstalldirs) $(DESTDIR)$(libdir) + @list='$(lib_LTLIBRARIES)'; for p in $$list; do \ + if test -f $$p; then \ + echo "$(LIBTOOL) --mode=install $(INSTALL) $$p $(DESTDIR)$(libdir)/$$p"; \ + $(LIBTOOL) --mode=install $(INSTALL) $$p $(DESTDIR)$(libdir)/$$p; \ + else :; fi; \ + done + +uninstall-libLTLIBRARIES: + @$(NORMAL_UNINSTALL) + list='$(lib_LTLIBRARIES)'; for p in $$list; do \ + $(LIBTOOL) --mode=uninstall rm -f $(DESTDIR)$(libdir)/$$p; \ + done + +.c.o: + $(COMPILE) -c $< + +.s.o: + $(COMPILE) -c $< + +.S.o: + $(COMPILE) -c $< + +mostlyclean-compile: + -rm -f *.o core *.core + +clean-compile: + +distclean-compile: + -rm -f *.tab.c + +maintainer-clean-compile: + +.c.lo: + $(LIBTOOL) --mode=compile $(COMPILE) -c $< + +.s.lo: + $(LIBTOOL) --mode=compile $(COMPILE) -c $< + +.S.lo: + $(LIBTOOL) --mode=compile $(COMPILE) -c $< + +mostlyclean-libtool: + -rm -f *.lo + +clean-libtool: + -rm -rf .libs _libs + +distclean-libtool: + +maintainer-clean-libtool: + +libedsio.la: $(libedsio_la_OBJECTS) $(libedsio_la_DEPENDENCIES) + $(LINK) -rpath $(libdir) $(libedsio_la_LDFLAGS) $(libedsio_la_OBJECTS) $(libedsio_la_LIBADD) $(LIBS) + +mostlyclean-noinstPROGRAMS: + +clean-noinstPROGRAMS: + -test -z "$(noinst_PROGRAMS)" || rm -f $(noinst_PROGRAMS) + +distclean-noinstPROGRAMS: + +maintainer-clean-noinstPROGRAMS: + +edsiotest: $(edsiotest_OBJECTS) $(edsiotest_DEPENDENCIES) + @rm -f edsiotest + $(LINK) $(edsiotest_LDFLAGS) $(edsiotest_OBJECTS) $(edsiotest_LDADD) $(LIBS) + +install-includeHEADERS: $(include_HEADERS) + @$(NORMAL_INSTALL) + $(mkinstalldirs) $(DESTDIR)$(includedir) + @list='$(include_HEADERS)'; for p in $$list; do \ + if test -f "$$p"; then d= ; else d="$(srcdir)/"; fi; \ + echo " $(INSTALL_DATA) $$d$$p $(DESTDIR)$(includedir)/$$p"; \ + $(INSTALL_DATA) $$d$$p $(DESTDIR)$(includedir)/$$p; \ + done + +uninstall-includeHEADERS: + @$(NORMAL_UNINSTALL) + list='$(include_HEADERS)'; for p in $$list; do \ + rm -f $(DESTDIR)$(includedir)/$$p; \ + done + +tags: TAGS + +ID: $(HEADERS) $(SOURCES) $(LISP) + list='$(SOURCES) $(HEADERS)'; \ + unique=`for i in $$list; do echo $$i; done | \ + awk ' { files[$$0] = 1; } \ + END { for (i in files) print i; }'`; \ + here=`pwd` && cd $(srcdir) \ + && mkid -f$$here/ID $$unique $(LISP) + +TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) $(LISP) + tags=; \ + here=`pwd`; \ + list='$(SOURCES) $(HEADERS)'; \ + unique=`for i in $$list; do echo $$i; done | \ + awk ' { files[$$0] = 1; } \ + END { for (i in files) print i; }'`; \ + test -z "$(ETAGS_ARGS)$$unique$(LISP)$$tags" \ + || (cd $(srcdir) && etags $(ETAGS_ARGS) $$tags $$unique $(LISP) -o $$here/TAGS) + +mostlyclean-tags: + +clean-tags: + +distclean-tags: + -rm -f TAGS ID + +maintainer-clean-tags: + +distdir = $(top_builddir)/$(PACKAGE)-$(VERSION)/$(subdir) + +subdir = libedsio + +distdir: $(DISTFILES) + @for file in $(DISTFILES); do \ + d=$(srcdir); \ + if test -d $$d/$$file; then \ + cp -pr $$d/$$file $(distdir)/$$file; \ + else \ + test -f $(distdir)/$$file \ + || ln $$d/$$file $(distdir)/$$file 2> /dev/null \ + || cp -p $$d/$$file $(distdir)/$$file || :; \ + fi; \ + done +base64.lo base64.o : base64.c edsio.h ../config.h edsio_edsio.h +default.lo default.o : default.c edsio.h ../config.h edsio_edsio.h +edsio.lo edsio.o : edsio.c edsio.h ../config.h edsio_edsio.h maketime.h +edsio_edsio.lo edsio_edsio.o : edsio_edsio.c edsio.h ../config.h \ + edsio_edsio.h +edsiotest.o: edsiotest.c edsio.h ../config.h edsio_edsio.h +fh.lo fh.o : fh.c edsio.h ../config.h edsio_edsio.h +generic.lo generic.o : generic.c edsio.h ../config.h edsio_edsio.h +library.lo library.o : library.c edsio.h ../config.h edsio_edsio.h +maketime.lo maketime.o : maketime.c ../config.h partime.h maketime.h +md5c.lo md5c.o : md5c.c edsio.h ../config.h edsio_edsio.h +partime.lo partime.o : partime.c ../config.h partime.h +sha.lo sha.o : sha.c edsio.h ../config.h edsio_edsio.h +simple.lo simple.o : simple.c edsio.h ../config.h edsio_edsio.h + +info-am: +info: info-am +dvi-am: +dvi: dvi-am +check-am: all-am +check: check-am +installcheck-am: +installcheck: installcheck-am +install-exec-am: install-libLTLIBRARIES +install-exec: install-exec-am + +install-data-am: install-includeHEADERS +install-data: install-data-am + +install-am: all-am + @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am +install: install-am +uninstall-am: uninstall-libLTLIBRARIES uninstall-includeHEADERS +uninstall: uninstall-am +all-am: Makefile $(LTLIBRARIES) $(PROGRAMS) $(SCRIPTS) $(HEADERS) +all-redirect: all-am +install-strip: + $(MAKE) $(AM_MAKEFLAGS) AM_INSTALL_PROGRAM_FLAGS=-s install +installdirs: + $(mkinstalldirs) $(DESTDIR)$(libdir) $(DESTDIR)$(includedir) + + +mostlyclean-generic: + +clean-generic: + +distclean-generic: + -rm -f Makefile $(CONFIG_CLEAN_FILES) + -rm -f config.cache config.log stamp-h stamp-h[0-9]* + +maintainer-clean-generic: + -test -z "$(BUILT_SOURCES)" || rm -f $(BUILT_SOURCES) +mostlyclean-am: mostlyclean-libLTLIBRARIES mostlyclean-compile \ + mostlyclean-libtool mostlyclean-noinstPROGRAMS \ + mostlyclean-tags mostlyclean-generic + +mostlyclean: mostlyclean-am + +clean-am: clean-libLTLIBRARIES clean-compile clean-libtool \ + clean-noinstPROGRAMS clean-tags clean-generic \ + mostlyclean-am + +clean: clean-am + +distclean-am: distclean-libLTLIBRARIES distclean-compile \ + distclean-libtool distclean-noinstPROGRAMS \ + distclean-tags distclean-generic clean-am + -rm -f libtool + +distclean: distclean-am + +maintainer-clean-am: maintainer-clean-libLTLIBRARIES \ + maintainer-clean-compile maintainer-clean-libtool \ + maintainer-clean-noinstPROGRAMS maintainer-clean-tags \ + maintainer-clean-generic distclean-am + @echo "This command is intended for maintainers to use;" + @echo "it deletes files that may require special tools to rebuild." + +maintainer-clean: maintainer-clean-am + +.PHONY: mostlyclean-libLTLIBRARIES distclean-libLTLIBRARIES \ +clean-libLTLIBRARIES maintainer-clean-libLTLIBRARIES \ +uninstall-libLTLIBRARIES install-libLTLIBRARIES mostlyclean-compile \ +distclean-compile clean-compile maintainer-clean-compile \ +mostlyclean-libtool distclean-libtool clean-libtool \ +maintainer-clean-libtool mostlyclean-noinstPROGRAMS \ +distclean-noinstPROGRAMS clean-noinstPROGRAMS \ +maintainer-clean-noinstPROGRAMS uninstall-includeHEADERS \ +install-includeHEADERS tags mostlyclean-tags distclean-tags clean-tags \ +maintainer-clean-tags distdir info-am info dvi-am dvi check check-am \ +installcheck-am installcheck install-exec-am install-exec \ +install-data-am install-data install-am install uninstall-am uninstall \ +all-redirect all-am all installdirs mostlyclean-generic \ +distclean-generic clean-generic maintainer-clean-generic clean \ +mostlyclean distclean maintainer-clean + + +# +# Rules for the generated code +# + +stamp-ser1: $(top_srcdir)/libedsio/edsio.el edsio.ser + $(top_srcdir)/libedsio/edsio-comp edsio.ser + touch stamp-ser1 + +$(SER_OUT1): stamp-ser1 + +# +# +# + +# Tell versions [3.59,3.63) of GNU make to not export all variables. +# Otherwise a system limit (for SysV at least) may be exceeded. +.NOEXPORT: diff --git a/xdelta-1.1.3/libedsio/base64.c b/xdelta-1.1.3/libedsio/base64.c new file mode 100644 index 0000000..fef32ef --- /dev/null +++ b/xdelta-1.1.3/libedsio/base64.c @@ -0,0 +1,525 @@ +/* -*-Mode: C;-*- + * $Id: base64.c,v 1.1 2004/01/05 18:54:22 icculus Exp $ + * + * Copyright (C) 1998, 1999, Josh MacDonald. + * All Rights Reserved. + * + * Author: Josh MacDonald + */ + +#include "edsio.h" + +/* BASE64 Encoding + */ + +static const unsigned char base64_table[64] = { + 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', + 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z', 'a', + 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', + 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z', '0', '1', '2', + '3', '4', '5', '6', '7', '8', '9', '+', '/' +}; + +static gint16 base64_inverse_table[128]; + +static void +init_inverse_table (void) +{ + static int i = 0; + static int j = 0; + + for (; j < 128; j += 1) + base64_inverse_table[j] = -1; + + for (; i < 64; i += 1) + base64_inverse_table[base64_table[i]] = i; + + base64_inverse_table['='] = 0; +} + +GByteArray* +edsio_base64_encode_region (const guint8* data, guint len) +{ + GByteArray* out = g_byte_array_new (); + guint real_len; + + g_byte_array_set_size (out, (len+2)*4/3); + + real_len = out->len; + + if (! edsio_base64_encode_region_into (data, len, out->data, &real_len)) + { + g_byte_array_free (out, TRUE); + return NULL; + } + + g_byte_array_set_size (out, real_len); + + return out; +} + +gboolean +edsio_base64_encode_region_into (const guint8* data, guint len, guint8* out, guint *out_len) +{ + gint i; + guint32 word = 0, count = 0; + + if ((*out_len) < (len + 2) * 4/3) + { + edsio_generate_void_event (EC_EdsioInvalidBase64Encoding); + return FALSE; + } + + *out_len = 0; + + for (i = 0; i < len; i += 1) + { + word |= data[i] << (8*(2-(count++))); + + if (count == 3) + { + out[(*out_len)++] = base64_table[(word>>18) & 0x3f]; + out[(*out_len)++] = base64_table[(word>>12) & 0x3f]; + out[(*out_len)++] = base64_table[(word>> 6) & 0x3f]; + out[(*out_len)++] = base64_table[(word ) & 0x3f]; + + count = 0; + word = 0; + } + } + + if (count > 0) + { + out[(*out_len)++] = base64_table[(word>>18) & 0x3f]; + out[(*out_len)++] = base64_table[(word>>12) & 0x3f]; + out[(*out_len)++] = (count > 1) ? base64_table[(word>>6) & 0x3f] : '='; + out[(*out_len)++] = '='; + } + + return TRUE; +} + +GByteArray* +edsio_base64_decode_region (const guint8* data, guint data_len) +{ + GByteArray* it = g_byte_array_new (); + guint real_len; + + g_byte_array_set_size (it, data_len*3/4); + + real_len = it->len; + + if (! edsio_base64_decode_region_into (data, data_len, it->data, &real_len)) + { + g_byte_array_free (it, TRUE); + return NULL; + } + + g_byte_array_set_size (it, real_len); + + return it; +} + +gboolean +edsio_base64_decode_region_into (const guint8* data, guint len, guint8* out, guint *out_len) +{ + guint32 pos = 0; + gboolean found_end = FALSE; + gint found_end_at = 0; + + init_inverse_table (); + + if ((*out_len) < (len*3/4)) + { + edsio_generate_void_event (EC_EdsioOutputBufferShort); + return FALSE; + } + + (*out_len) = 0; + + while (pos < len) + { + gint i, x; + gint word = 0, junk = 0; + + if (len - pos < 4) + { + edsio_generate_void_event (EC_EdsioInvalidBase64Encoding); + return FALSE; + } + + for (i = 0; i < 4; i += 1) + { + x = data[pos++]; + + if (x > 127 || base64_inverse_table[x] < 0) + { + edsio_generate_void_event (EC_EdsioInvalidBase64Encoding); + return FALSE; + } + + if (x == '=') + { + if (! found_end) + found_end_at = i; + + found_end = TRUE; + } + else + { + if (found_end) + { + edsio_generate_void_event (EC_EdsioInvalidBase64Encoding); + return FALSE; + } + + word |= base64_inverse_table[x] << (6*(3-i)); + } + } + + if (found_end) + { + if (found_end_at < 2) + { + edsio_generate_void_event (EC_EdsioInvalidBase64Encoding); + return FALSE; + } + + if (found_end_at == 2) + junk = 2; + else if (found_end_at == 3) + junk = 1; + } + else + junk = 0; + + out[(*out_len)++] = (word >> 16) & 0xff; + + if (junk < 2) + out[(*out_len)++] = (word >> 8) & 0xff; + + if (junk < 1) + out[(*out_len)++] = (word >> 0) & 0xff; + } + + return TRUE; +} + +/* Base64 sink + */ +typedef struct _Base64Sink Base64Sink; + +static gboolean base64_sink_close (SerialSink* sink); +static gboolean base64_sink_write (SerialSink* sink, const guint8 *ptr, guint32 len); +static void base64_sink_free (SerialSink* sink); +static gboolean base64_sink_quantum (SerialSink* sink); + +struct _Base64Sink +{ + SerialSink sink; + + SerialSink* out; + + guint32 word; + guint32 count; +}; + +SerialSink* +serializeio_base64_sink (SerialSink* out) +{ + Base64Sink* it = g_new0 (Base64Sink, 1); + SerialSink* sink = (SerialSink*) it; + + serializeio_sink_init (sink, + NULL, + base64_sink_close, + base64_sink_write, + base64_sink_free, + base64_sink_quantum); + + it->out = out; + + return sink; +} + +gboolean +base64_sink_write (SerialSink* fsink, const guint8 *ptr, guint32 len) +{ + guint32 i; + + Base64Sink* sink = (Base64Sink*) fsink; + + for (i = 0; i < len; ) + { + if (sink->count == 3) + { + guint8 out[4]; + + out[0] = base64_table[(sink->word>>18) & 0x3f]; + out[1] = base64_table[(sink->word>>12) & 0x3f]; + out[2] = base64_table[(sink->word>> 6) & 0x3f]; + out[3] = base64_table[(sink->word ) & 0x3f]; + +#if 0 + g_print ("%02x %02x %02x -> %c%c%c%c (3)\n", + (sink->word>>16) & 0xff, + (sink->word>>8) & 0xff, + (sink->word>>0) & 0xff, + out[0], + out[1], + out[2], + out[3]); +#endif + + if (! sink->out->sink_write (sink->out, out, 4)) + return FALSE; + + sink->count = 0; + sink->word = 0; + } + + while (sink->count < 3 && i < len) + sink->word |= ptr[i++] << (8*(2-(sink->count++))); + } + + return TRUE; +} + +gboolean +base64_sink_close (SerialSink* fsink) +{ + Base64Sink* sink = (Base64Sink*) fsink; + + if (sink->count == 3) + { + guint8 out[4]; + + out[0] = base64_table[(sink->word>>18) & 0x3f]; + out[1] = base64_table[(sink->word>>12) & 0x3f]; + out[2] = base64_table[(sink->word>> 6) & 0x3f]; + out[3] = base64_table[(sink->word ) & 0x3f]; + +#if 0 + g_print ("%02x %02x %02x -> %c%c%c%c (3)\n", + (sink->word>>16) & 0xff, + (sink->word>>8) & 0xff, + (sink->word>>0) & 0xff, + out[0], + out[1], + out[2], + out[3]); +#endif + + if (! sink->out->sink_write (sink->out, out, 4)) + return FALSE; + + sink->count = 0; + sink->word = 0; + } + + if (sink->count > 0) + { + guint8 out[4]; + + out[0] = base64_table[(sink->word>>18) & 0x3f]; + out[1] = base64_table[(sink->word>>12) & 0x3f]; + out[2] = (sink->count > 1) ? base64_table[(sink->word>>6) & 0x3f] : '='; + out[3] = '='; + +#if 0 + g_print ("%02x %02x %02x -> %c%c%c%c (%d)\n", + (sink->word>>16) & 0xff, + (sink->word>>8) & 0xff, + (sink->word>>0) & 0xff, + out[0], + out[1], + out[2], + out[3], + sink->count); +#endif + + if (! sink->out->sink_write (sink->out, out, 4)) + return FALSE; + + sink->count = 0; + sink->word = 0; + } + + return sink->out->sink_close (sink->out); +} + + +void +base64_sink_free (SerialSink* fsink) +{ + Base64Sink* sink = (Base64Sink*) fsink; + + sink->out->sink_free (sink->out); + + g_free (sink); +} + +gboolean +base64_sink_quantum (SerialSink* fsink) +{ + Base64Sink* sink = (Base64Sink*) fsink; + + if (sink->out->sink_quantum) + return sink->out->sink_quantum (sink->out); + + return TRUE; +} + +/* Base64 source + */ + +typedef struct _Base64Source Base64Source; + +struct _Base64Source { + SerialSource source; + + SerialSource *in; + + guint32 avail; + guint32 count; + gboolean found_end; + gint found_end_at; + guint8 buf[3]; +}; + +static gboolean base64_source_close (SerialSource* source); +static gboolean base64_source_read (SerialSource* source, guint8 *ptr, guint32 len); +static void base64_source_free (SerialSource* source); + +SerialSource* +serializeio_base64_source (SerialSource* in0) +{ + Base64Source* it = g_new0 (Base64Source, 1); + SerialSource* source = (SerialSource*) it; + + serializeio_source_init (source, + NULL, + base64_source_close, + base64_source_read, + base64_source_free, + NULL, + NULL); + + it->in = in0; + + return source; +} + +gboolean +base64_source_close (SerialSource* fsource) +{ + Base64Source* source = (Base64Source*) fsource; + + if (! source->in->source_close (source->in)) + return FALSE; + + return TRUE; +} + +gboolean +base64_source_read (SerialSource* fsource, guint8 *ptr, guint32 len) +{ + guint32 pos; + Base64Source* source = (Base64Source*) fsource; + + init_inverse_table (); + + for (pos = 0; pos < len; ) + { + if (source->count == 0) + { + guint8 buf[4]; + guint32 i, word = 0, junk; + + if (source->found_end) + { + edsio_generate_void_event (EC_EdsioInvalidBase64Encoding); + return FALSE; + } + + if (! source->in->source_read (source->in, buf, 4)) + return FALSE; + + for (i = 0; i < 4; i += 1) + { + gint x = buf[i]; + + if (x > 127 || base64_inverse_table[x] < 0) + { + edsio_generate_void_event (EC_EdsioInvalidBase64Encoding); + return FALSE; + } + + if (x == '=') + { + if (! source->found_end) + source->found_end_at = i; + + source->found_end = TRUE; + } + else + { + if (source->found_end) + { + edsio_generate_void_event (EC_EdsioInvalidBase64Encoding); + return FALSE; + } + + word |= base64_inverse_table[x] << (6*(3-i)); + } + } + + if (source->found_end) + { + if (source->found_end_at == 2) + junk = 2; + else if (source->found_end_at == 3) + junk = 1; + else + { + edsio_generate_void_event (EC_EdsioInvalidBase64Encoding); + return FALSE; + } + } + else + junk = 0; + + source->avail = source->count = 3 - junk; + + source->buf[0] = (word >> 16) & 0xff; + source->buf[1] = (word >> 8) & 0xff; + source->buf[2] = (word >> 0) & 0xff; + +#if 0 + g_print ("%c%c%c%c -> %02x %02x %02x (%d)\n", + buf[0], + buf[1], + buf[2], + buf[3], + (word>>16) & 0xff, + (word>>8) & 0xff, + (word>>0) & 0xff, + 3-junk); +#endif + } + + ptr[pos++] = source->buf[source->avail-(source->count--)]; + } + + return TRUE; +} + +void +base64_source_free (SerialSource* fsource) +{ + Base64Source* source = (Base64Source*) fsource; + + source->in->source_free (source->in); + + g_free (source); +} diff --git a/xdelta-1.1.3/libedsio/base64.lo b/xdelta-1.1.3/libedsio/base64.lo new file mode 100644 index 0000000..9788f70 --- /dev/null +++ b/xdelta-1.1.3/libedsio/base64.lo @@ -0,0 +1 @@ +timestamp diff --git a/xdelta-1.1.3/libedsio/default.c b/xdelta-1.1.3/libedsio/default.c new file mode 100644 index 0000000..526274b --- /dev/null +++ b/xdelta-1.1.3/libedsio/default.c @@ -0,0 +1,378 @@ +/* -*-Mode: C;-*- + * $Id: default.c,v 1.1 2004/01/05 18:54:22 icculus Exp $ + * + * Copyright (C) 1998, 1999, Josh MacDonald. + * All Rights Reserved. + * + * Author: Josh MacDonald + */ + +#include "edsio.h" + +/* Default Sink methods + */ + +static gboolean +sink_type_default (SerialSink* sink, SerialType type, guint len, gboolean set_allocation) +{ + if (! sink->next_uint32 (sink, type)) + return FALSE; + + if (set_allocation && !sink->next_uint32 (sink, len)) + return FALSE; + + return TRUE; +} + +static gboolean +sink_next_uint16 (SerialSink* sink, guint16 num) +{ + num = g_htons (num); + + return sink->sink_write (sink, (guint8*) &num, sizeof (num)); +} + +static gboolean +sink_next_uint32 (SerialSink* sink, guint32 num) +{ + num = g_htonl (num); + + return sink->sink_write (sink, (guint8*) &num, sizeof (num)); +} + +static gboolean +sink_next_uint (SerialSink* sink, guint32 num) +{ + /* This is mostly because I dislike endian, and less to save space + * on small ints. However, the uint32 and uint16 functions are used + * when the number is expected to be large, in which case this + * format can expand the number. */ + + guint8 sink_buf[16]; /* this is enough room for a 12-byte int */ + guint sink_count = 0; + + do + { + guint left = num & 0x7f; + guint outnum; + + num >>= 7; + + outnum = left | (num ? 0x80 : 0); + + sink_buf[sink_count++] = outnum; + } + while (num); + + return sink->sink_write (sink, sink_buf, sink_count); +} + +static gboolean +sink_next_uint8 (SerialSink* sink, guint8 val) +{ + return sink->sink_write (sink, &val, 1); +} + +static gboolean +sink_next_bool (SerialSink* sink, gboolean val) +{ + guint8 sink_buf[1]; + sink_buf[0] = val; + return sink->sink_write (sink, sink_buf, 1); +} + +static gboolean +sink_next_string (SerialSink* sink, const char *ptr) +{ + return sink->next_bytes (sink, ptr, strlen (ptr)); +} + +static gboolean +sink_next_bytes (SerialSink* sink, const guint8 *ptr, guint32 len) +{ + return sink->next_uint (sink, len) && + sink->sink_write (sink, ptr, len); +} + +static gboolean +sink_next_bytes_known (SerialSink* sink, const guint8 *ptr, guint32 len) +{ + return sink->sink_write (sink, ptr, len); +} + +void +serializeio_sink_init (SerialSink* it, + gboolean (* sink_type) (SerialSink* sink, + SerialType type, + guint mem_size, + gboolean set_allocation), + gboolean (* sink_close) (SerialSink* sink), + gboolean (* sink_write) (SerialSink* sink, + const guint8 *ptr, + guint32 len), + void (* sink_free) (SerialSink* sink), + gboolean (* sink_quantum) (SerialSink* sink)) +{ + it->next_bytes_known = sink_next_bytes_known; + it->next_bytes = sink_next_bytes; + it->next_uint = sink_next_uint; + it->next_uint32 = sink_next_uint32; + it->next_uint16 = sink_next_uint16; + it->next_uint8 = sink_next_uint8; + it->next_bool = sink_next_bool; + it->next_string = sink_next_string; + + if (sink_type) + it->sink_type = sink_type; + else + it->sink_type = sink_type_default; + + it->sink_close = sink_close; + it->sink_write = sink_write; + it->sink_free = sink_free; + it->sink_quantum = sink_quantum; +} + +/* Default Source methods + */ + +static SerialType +source_type_default (SerialSource* source, gboolean set_allocation) +{ + guint32 x; + + if (! source->next_uint32 (source, & x)) + return ST_Error; + + if (set_allocation) + { + if (! source->next_uint32 (source, &source->alloc_total)) + return ST_Error; + } + + return x; +} + +static gboolean +source_next_uint32 (SerialSource* source, guint32 *ptr) +{ + guint32 x; + + if (! source->source_read (source, (guint8*) &x, sizeof (x))) + return FALSE; + + (*ptr) = g_ntohl (x); + + return TRUE; +} + +static gboolean +source_next_uint16 (SerialSource* source, guint16 *ptr) +{ + guint16 x; + + if (! source->source_read (source, (guint8*) &x, sizeof (x))) + return FALSE; + + (*ptr) = g_ntohs (x); + + return TRUE; +} + +static gboolean +source_next_uint (SerialSource* source, guint32 *ptr) +{ + /* This is mostly because I dislike endian, and less to save space + * on small ints */ + guint8 c; + guint8 arr[16]; + gint i = 0; + gint donebit = 1; + gint bits; + + while (source->next_uint8 (source, &c)) + { + donebit = c & 0x80; + bits = c & 0x7f; + + arr[i++] = bits; + + if (!donebit) + break; + } + + if (donebit) + return FALSE; + + *ptr = 0; + + for (i -= 1; i >= 0; i -= 1) + { + *ptr <<= 7; + *ptr |= arr[i]; + } + + return TRUE; +} + +static gboolean +source_next_uint8 (SerialSource* source, guint8 *ptr) +{ + return source->source_read (source, ptr, 1); +} + +static gboolean +source_next_bool (SerialSource* source, gboolean *ptr) +{ + guint8 sink_buf[1]; + + if (! source->source_read (source, sink_buf, 1)) + return FALSE; + + if (sink_buf[0]) + *ptr = TRUE; + else + *ptr = FALSE; + + return TRUE; +} + +static gboolean +source_next_string (SerialSource* source, const char **ptr) +{ + guint32 len; + guint8* buf; + + if (! source->next_uint (source, &len)) + return FALSE; + + if (! (buf = serializeio_source_alloc (source, len+1))) + return FALSE; + + buf[len] = 0; + + (*ptr) = buf; + + return source->source_read (source, buf, len); +} + +static gboolean +source_next_bytes (SerialSource* source, const guint8 **ptr, guint32 *len_ptr) +{ + guint32 len; + guint8* buf; + + if (! source->next_uint (source, &len)) + return FALSE; + + if (! (buf = serializeio_source_alloc (source, len))) + return FALSE; + + (*len_ptr) = len; + (*ptr) = buf; + + return source->source_read (source, buf, len); +} + +static gboolean +source_next_bytes_known (SerialSource* source, guint8 *ptr, guint32 len) +{ + return source->source_read (source, ptr, len); +} + +void* +serializeio_source_alloc (SerialSource* source, guint32 len) +{ + void* ret; + + if (! source->alloc_buf) + { + if (source->salloc_func) + source->alloc_buf_orig = source->salloc_func (source, source->alloc_total + 8); + else + source->alloc_buf_orig = g_malloc0 (source->alloc_total + 8); + + source->alloc_buf = source->alloc_buf_orig; + + { long x = source->alloc_buf; ALIGN_8 (x); source->alloc_buf = x; } + + } + + if (len+source->alloc_pos > source->alloc_total) + { + edsio_generate_source_event (EC_EdsioIncorrectAllocation, source); + return NULL; + } + + ret = ((guint8*)source->alloc_buf) + source->alloc_pos; + + source->alloc_pos += len; + + ALIGN_8 (source->alloc_pos); + + g_assert (((long)ret) % 8 == 0); + g_assert (source->alloc_pos % 8 == 0); + + return ret; +} + +gboolean +serializeio_source_object_received (SerialSource* source) +{ + source->alloc_pos = 0; + source->alloc_total = 0; + source->alloc_buf_orig = NULL; + source->alloc_buf = NULL; + + return TRUE; +} + +void +serializeio_source_reset_allocation (SerialSource* source) +{ + source->alloc_pos = 0; + source->alloc_total = 0; + source->alloc_buf = NULL; + + if (source->alloc_buf_orig) + { + if (source->sfree_func) + source->sfree_func (source, source->alloc_buf_orig); + else + g_free (source->alloc_buf_orig); + } +} + +void +serializeio_source_init (SerialSource* it, + SerialType (* source_type) (SerialSource* source, + gboolean set_allocation), + gboolean (* source_close) (SerialSource* source), + gboolean (* source_read) (SerialSource* source, + guint8 *ptr, + guint32 len), + void (* source_free) (SerialSource* source), + void* (* salloc_func) (SerialSource* source, + guint32 len), + void (* sfree_func) (SerialSource* source, + void* ptr)) +{ + it->next_bytes_known = source_next_bytes_known; + it->next_bytes = source_next_bytes; + it->next_uint = source_next_uint; + it->next_uint32 = source_next_uint32; + it->next_uint16 = source_next_uint16; + it->next_uint8 = source_next_uint8; + it->next_bool = source_next_bool; + it->next_string = source_next_string; + + if (source_type != NULL) + it->source_type = source_type; + else + it->source_type = source_type_default; + it->source_close = source_close; + it->source_read = source_read; + it->source_free = source_free; + it->salloc_func = salloc_func; + it->sfree_func = sfree_func; +} diff --git a/xdelta-1.1.3/libedsio/default.lo b/xdelta-1.1.3/libedsio/default.lo new file mode 100644 index 0000000..9788f70 --- /dev/null +++ b/xdelta-1.1.3/libedsio/default.lo @@ -0,0 +1 @@ +timestamp diff --git a/xdelta-1.1.3/libedsio/edsio-comp b/xdelta-1.1.3/libedsio/edsio-comp new file mode 100755 index 0000000..1c3c130 --- /dev/null +++ b/xdelta-1.1.3/libedsio/edsio-comp @@ -0,0 +1,46 @@ +#!/bin/sh + +# Derived from: + +# Copyright (C) 1995 Free Software Foundation, Inc. +# François Pinard , 1995. +# +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2, or (at your option) +# any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + +EMACS=/usr/bin/emacs +TOP_SRCDIR=/Users/icculus/projects/mojopatch/xdelta-1.1.3/libedsio + +SCRIPT=$TMPDIR/script.$$ + +trap "rm -f $SCRIPT" 0 + +if test $# != 1; then + echo 1>&2 "usage: $0 INPUT" + exit 1 +else + if test -z "$EMACS" || test "$EMACS" = "t"; then + # Value of "t" means we are running in a shell under Emacs. + # Just assume Emacs is called "emacs". + EMACS=emacs + fi + + INPUT=$1 + INPUT_PREF=`echo $INPUT | sed 's/\.[^\.]*$//'` + + echo "(load-file \"$TOP_SRCDIR/edsio.el\") " \ + "(generate-ser \"$INPUT\" \"$INPUT_PREF\")" > $SCRIPT + + $EMACS --batch -l $SCRIPT +fi diff --git a/xdelta-1.1.3/libedsio/edsio-comp.in b/xdelta-1.1.3/libedsio/edsio-comp.in new file mode 100644 index 0000000..51b55d7 --- /dev/null +++ b/xdelta-1.1.3/libedsio/edsio-comp.in @@ -0,0 +1,46 @@ +#!/bin/sh + +# Derived from: + +# Copyright (C) 1995 Free Software Foundation, Inc. +# François Pinard , 1995. +# +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2, or (at your option) +# any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + +EMACS=@EMACS@ +TOP_SRCDIR=@top_srcdir_absolute@/libedsio + +SCRIPT=$TMPDIR/script.$$ + +trap "rm -f $SCRIPT" 0 + +if test $# != 1; then + echo 1>&2 "usage: $0 INPUT" + exit 1 +else + if test -z "$EMACS" || test "$EMACS" = "t"; then + # Value of "t" means we are running in a shell under Emacs. + # Just assume Emacs is called "emacs". + EMACS=emacs + fi + + INPUT=$1 + INPUT_PREF=`echo $INPUT | sed 's/\.[^\.]*$//'` + + echo "(load-file \"$TOP_SRCDIR/edsio.el\") " \ + "(generate-ser \"$INPUT\" \"$INPUT_PREF\")" > $SCRIPT + + $EMACS --batch -l $SCRIPT +fi diff --git a/xdelta-1.1.3/libedsio/edsio.c b/xdelta-1.1.3/libedsio/edsio.c new file mode 100644 index 0000000..50b7f79 --- /dev/null +++ b/xdelta-1.1.3/libedsio/edsio.c @@ -0,0 +1,1610 @@ +/* -*-Mode: C;-*- + * $Id: edsio.c,v 1.1 2004/01/05 18:54:23 icculus Exp $ + * + * Copyright (C) 1998, 1999, Josh MacDonald. + * All Rights Reserved. + * + * Author: Josh MacDonald + */ + +#include "edsio.h" +#include + +#if TIME_WITH_SYS_TIME +# include +# include +#else +# if HAVE_SYS_TIME_H +# include +# else +# include +# endif +#endif + +#include "maketime.h" + +/*#define DEBUG_PROPS*/ + +/* Event delivery + */ + +static GHashTable* all_event_defs = NULL; + +static GPtrArray* all_event_watchers = NULL; + +typedef struct _ErrorDeliveryWatcher ErrorDeliveryWatcher; +typedef struct _DelayedEvent DelayedEvent; + +struct _ErrorDeliveryWatcher { + ErrorDeliveryFunc deliver; +}; + +struct _DelayedEvent { + GenericEvent ev; + GenericEventDef *def; + const char *msg; +}; + +void +eventdelivery_initialize_event_def (gint code, + gint level, + gint flags, + const char* name, + const char* oneline, + const char * (* field_to_string) (GenericEvent* ev, gint field)) +{ + GenericEventDef* def = g_new0 (GenericEventDef, 1); + + if (! all_event_defs) + all_event_defs = g_hash_table_new (g_int_hash, g_int_equal); + + def->code = code; + def->level = level; + def->flags = flags; + def->name = name; + def->oneline = oneline; + def->field_to_string = field_to_string; + + g_hash_table_insert (all_event_defs, & def->code, def); +} + +void +eventdelivery_event_watch_all (ErrorDeliveryFunc func) +{ + ErrorDeliveryWatcher* w = g_new0 (ErrorDeliveryWatcher, 1); + + w->deliver = func; + + if (! all_event_watchers) + all_event_watchers = g_ptr_array_new (); + + g_ptr_array_add (all_event_watchers, w); +} + +GenericEventDef* +eventdelivery_event_lookup (gint code) +{ + return g_hash_table_lookup (all_event_defs, & code); +} + +void +eventdelivery_event_deliver (GenericEvent* e) +{ + static gint in_call = FALSE; + static GQueue* queued = NULL; + static GPtrArray* free_strings = NULL; + + if (! queued) + { + queued = g_queue_new (); + free_strings = g_ptr_array_new (); + } + + in_call += 1; + + g_assert (e); + + edsio_edsio_init (); + + if (all_event_defs) + { + GenericEventDef* def = g_hash_table_lookup (all_event_defs, & e->code); + + if (def) + { + GString* out; + const char* oneline = def->oneline; + char c; + + out = g_string_new (NULL); + + while ((c = *oneline++)) + { + switch (c) + { + case '$': + { + const char* field; + char *end; + int f; + + if ((*oneline++) != '{') + goto badevent; + + f = strtol (oneline, &end, 10); + + if (f < 0 || !end || end[0] != '}') + goto badevent; + + oneline = end+1; + + g_assert (def->field_to_string); + + field = def->field_to_string (e, f); + + if (field) + { + g_string_append (out, field); + + g_free ((void*) field); + } + else + goto badevent; + } + break; + default: + g_string_append_c (out, c); + } + } + + if (! all_event_watchers) + { + fprintf (stderr, "%s:%d: %s\n", e->srcfile, e->srcline, out->str); + + g_string_free (out, TRUE); + } + else if (in_call == 1) + { + gint i; + + for (i = 0; i < all_event_watchers->len; i += 1) + { + ErrorDeliveryWatcher* w = all_event_watchers->pdata[i]; + + if (! w->deliver (e, def, out->str)) + { + g_warning ("%s:%d: An error delivery routine failed: %s\n", e->srcfile, e->srcline, out->str); + in_call = 0; + return; + } + } + + while (g_queue_get_size (queued) > 0) + { + DelayedEvent* de = g_queue_pop (queued); + + for (i = 0; i < all_event_watchers->len; i += 1) + { + ErrorDeliveryWatcher* w = all_event_watchers->pdata[i]; + + if (! w->deliver (& de->ev, de->def, de->msg)) + { + g_warning ("%s:%d: An error delivery routine failed: %s\n", e->srcfile, e->srcline, out->str); + in_call = 0; + return; + } + } + } + + for (i = 0; i < free_strings->len; i += 1) + g_string_free (free_strings->pdata[i], TRUE); + + g_ptr_array_set_size (free_strings, 0); + + g_string_free (out, TRUE); + } + else + { + DelayedEvent* de = g_new (DelayedEvent, 1); + + de->ev = *e; + de->def = def; + de->msg = out->str; + + g_queue_push (queued, de); + + g_ptr_array_add (free_strings, out); + } + + in_call -= 1; + + return; + } + } + + g_warning ("%s:%d: Unrecognized event delivered (code=%d)\n", e->srcfile, e->srcline, e->code); + + in_call -= 1; + + return; + + badevent: + + g_warning ("%s:%d: An malformed error could not print here (code=%d)\n", e->srcfile, e->srcline, e->code); + + in_call -= 1; + + return; +} + +const char* +eventdelivery_int_to_string (int x) +{ + return g_strdup_printf ("%d", x); +} + +const char* +eventdelivery_string_to_string (const char* x) +{ + return g_strdup (x); +} + +const char* +eventdelivery_source_to_string (SerialSource* x) +{ + return g_strdup ("@@@SerialSource"); +} + +const char* +eventdelivery_sink_to_string (SerialSink* x) +{ + return g_strdup ("@@@SerialSink"); +} + +const char* +eventdelivery_handle_to_string (FileHandle* x) +{ + g_return_val_if_fail (x, g_strdup ("*error*")); + + return x->table->table_handle_name (x); +} + +/* Misc crap. + */ + +gboolean +edsio_time_of_day (SerialGenericTime* setme) +{ +#if HAVE_GETTIMEOFDAY + + struct timeval tv; + + if (gettimeofday (& tv, NULL)) + { + edsio_generate_errno_event (EC_EdsioGetTimeOfDayFailure); + goto bail; + } + + if (setme) + { + setme->nanos = tv.tv_usec * 1000; + setme->seconds = tv.tv_sec; + } + +#else + + struct timeval tv; + time_t t = time (NULL); + + if (t < 0) + { + edsio_generate_errno_event (EC_EdsioTimeFailure); + goto bail; + } + + if (setme) + { + setme->nanos = 0; + setme->seconds = tv.tv_sec; + } + +#endif + + return TRUE; + + bail: + + setme->nanos = 0; + setme->seconds = 10; + + return FALSE; +} + +gchar* +edsio_time_to_iso8601 (SerialGenericTime *tp) +{ + return edsio_time_t_to_iso8601 (tp->seconds); +} + +gchar* +edsio_time_t_to_iso8601 (GTime t0) +{ + static char timebuf[64]; + time_t t = t0; + + struct tm lt = *localtime(&t); + int utc_offset = difftm(<, gmtime(&t)); + char sign = utc_offset < 0 ? '-' : '+'; + int minutes = abs (utc_offset) / 60; + int hours = minutes / 60; + + sprintf(timebuf, + "%d-%02d-%02d %02d:%02d:%02d%c%02d%02d", + lt.tm_year + 1900, + lt.tm_mon + 1, + lt.tm_mday, + lt.tm_hour, + lt.tm_min, + lt.tm_sec, + sign, + hours, + minutes % 60); + + return timebuf; +} + +static gboolean +strtosl_checked (const char* str, long* l, const char* errmsg) +{ + char* end; + + (*l) = strtol (str, &end, 10); + + if (!end || end[0]) + { + if (errmsg) + edsio_generate_stringstring_event (EC_EdsioInvalidIntegerString, errmsg, str); + + (*l) = 0; + return FALSE; + } + + return TRUE; +} + +gboolean +strtosi_checked (const char* str, gint32* i, const char* errmsg) +{ + long l; + + if (! strtosl_checked (str, &l, errmsg)) + { + (*i) = 0; + return FALSE; + } + + if (l > G_MAXINT || l < G_MININT) + { + if (errmsg) + edsio_generate_stringstring_event (EC_EdsioIntegerOutOfRange, errmsg, str); + + (*i) = 0; + return FALSE; + } + + (*i) = l; + + return TRUE; +} + +gboolean +strtoss_checked (const char* str, gint16* i, const char* errmsg) +{ + long l; + + if (! strtosl_checked (str, &l, errmsg)) + { + (*i) = 0; + return FALSE; + } + + if (l > G_MAXSHORT || l < G_MINSHORT) + { + if (errmsg) + edsio_generate_stringstring_event (EC_EdsioIntegerOutOfRange, errmsg, str); + + (*i) = 0; + return FALSE; + } + + (*i) = l; + + return TRUE; +} + +gboolean +strtoui_checked (const char* str, guint32* i, const char* errmsg) +{ + long l; + + if (! strtosl_checked (str, &l, errmsg)) + { + (*i) = 0; + return FALSE; + } + + if (l < 0) + { + if (errmsg) + edsio_generate_stringstring_event (EC_EdsioInvalidIntegerSign, errmsg, str); + + (*i) = 0; + return FALSE; + } + + (*i) = l; + + if (l != (*i)) + { + if (errmsg) + edsio_generate_stringstring_event (EC_EdsioIntegerOutOfRange, errmsg, str); + + (*i) = 0; + return FALSE; + } + + return TRUE; +} + +gboolean +strtous_checked (const char* str, guint16* i, const char* errmsg) +{ + long l; + + if (! strtosl_checked (str, &l, errmsg)) + { + (*i) = 0; + return FALSE; + } + + if (l < 0) + { + if (errmsg) + edsio_generate_stringstring_event (EC_EdsioInvalidIntegerSign, errmsg, str); + + (*i) = 0; + return FALSE; + } + + (*i) = l; + + if (l != (*i)) + { + if (errmsg) + edsio_generate_stringstring_event (EC_EdsioIntegerOutOfRange, errmsg, str); + + (*i) = 0; + return FALSE; + } + + return TRUE; +} + +gint +edsio_md5_equal (gconstpointer v, + gconstpointer v2) +{ + return memcmp (v, v2, 16) == 0; +} + +guint +edsio_md5_hash (gconstpointer v) +{ + guint8* md5 = (guint8*) v; + guint x = 0; + gint i, j; + + for (i = 0, j = 0; i < 16; i += 1, j += 1, j %= sizeof (guint)) + x ^= md5[i] << (8*j); + + return x; +} + +void +serializeio_print_bytes (const guint8* bytes, guint len0) +{ + char buf[100]; + int i; + guint len; + + len = MIN (len0, 32); + + for (i = 0; i < len; i += 1) + sprintf (buf + 2*i, "%02x", bytes[i]); + + if (len0 > len) + strcat (buf, "..."); + + g_print ("%s\n", buf); +} + +void +edsio_md5_to_string (const guint8* md5, char buf[33]) +{ + gint i; + + for (i = 0; i < 16; i += 1) + sprintf (buf + 2*i, "%02x", md5[i]); +} + +static gboolean +from_hex (char c, int* x, const char* ctx) +{ + char buf[2]; + + if (c >= '0' && c <= '9') + { + (*x) = c - '0'; + return TRUE; + } + else if (c >= 'A' && c <= 'F') + { + (*x) = c - 'A' + 10; + return TRUE; + } + else if (c >= 'a' && c <= 'f') + { + (*x) = c - 'a' + 10; + return TRUE; + } + + buf[0] = c; + buf[1] = 0; + + edsio_generate_stringstring_event (EC_EdsioInvalidHexDigit, buf, ctx); + return FALSE; +} + +gboolean +edsio_md5_from_string (guint8* md5, const char buf[33]) +{ + gint i; + gint l = strlen (buf); + + if (l < 32) + { + edsio_generate_string_event (EC_EdsioMD5StringShort, buf); + return FALSE; + } + else if (l > 32) + { + edsio_generate_string_event (EC_EdsioMD5StringLong, buf); + return FALSE; + } + + for (i = 0; i < 16; i += 1) + { + char c1 = buf[(2*i)]; + char c2 = buf[(2*i)+1]; + int x1, x2; + + if (! from_hex (c1, &x1, buf)) + return FALSE; + + if (! from_hex (c2, &x2, buf)) + return FALSE; + + md5[i] = (x1 << 4) | x2; + } + + return TRUE; +} + +/* Strings + */ + +const char* edsio_intern_string (const char* str) +{ + static GStringChunk* chunk = NULL; + + if (! chunk) + chunk = g_string_chunk_new (256); + + return g_string_chunk_insert_const (chunk, str); +} + +/* Properties + */ + +typedef struct _EdsioHostType EdsioHostType; +typedef struct _EdsioPropertyType EdsioPropertyType; + +struct _EdsioPropertyType { + const char *type_name; + PropFreeFunc freer; + PropGSFunc getter; + PropGSFunc setter; + PropSerialize serialize; + PropUnserialize unserialize; +}; + +struct _EdsioHostType { + const char *host_name; + PropertyTableFunc ptable; + PersistSourceFunc source; + PersistSinkFunc sink; + PersistIssetFunc isset; + PersistUnsetFunc unset; +}; + +struct _EdsioProperty { + guint32 prop_code; + const char *prop_name; + guint32 prop_flags; + EdsioPropertyType *type; + EdsioHostType *host; +}; + +union _EdsioPropertyEntry { + guint32 as_uint32; + SerialEdsioBytes as_bytes; + gpointer as_vptr; + const char* as_string; +}; + +struct _EdsioGenericProperty +{ + guint32 code; +}; + +static GHashTable* all_property_types = NULL; +static GHashTable* all_host_types = NULL; +static GHashTable* all_properties = NULL; +static GHashTable* all_property_codes = NULL; +static guint32 property_code_sequence = 0; + +void +edsio_initialize_property_type (const char* t, PropFreeFunc freer, PropGSFunc getter, PropGSFunc setter, PropSerialize ser, PropUnserialize unser) +{ + EdsioPropertyType* type; + + t = edsio_intern_string (t); + + if (! all_property_types) + all_property_types = g_hash_table_new (g_direct_hash, g_direct_equal); + + if ((type = g_hash_table_lookup (all_property_types, t)) != NULL) + { + if (getter != type->getter || + setter != type->setter || + ser != type->serialize || + unser != type->unserialize) + edsio_generate_string_event (EC_EdsioDuplicatePropertyTypeRegistered, t); + return; + } + + type = g_new0 (EdsioPropertyType, 1); + + type->type_name = t; + type->freer = freer; + type->getter = getter; + type->setter = setter; + type->serialize = ser; + type->unserialize = unser; + + g_hash_table_insert (all_property_types, (gpointer) t, type); +} + +void +edsio_initialize_host_type (const char* ph, + PropertyTableFunc ptable, + PersistSourceFunc source, + PersistSinkFunc sink, + PersistIssetFunc isset, + PersistUnsetFunc unset) +{ + EdsioHostType* host; + + ph = edsio_intern_string (ph); + + if (! all_host_types) + all_host_types = g_hash_table_new (g_direct_hash, g_direct_equal); + + if (g_hash_table_lookup (all_host_types, ph)) + { + edsio_generate_string_event (EC_EdsioDuplicateHostTypeRegistered, ph); + return; + } + + host = g_new0 (EdsioHostType, 1); + + host->host_name = ph; + host->ptable = ptable; + host->source = source; + host->sink = sink; + host->isset = isset; + host->unset = unset; + + g_hash_table_insert (all_host_types, (gpointer) ph, host); + +} + +gboolean +edsio_new_property (const char* name, const char* ph, const char* t, guint32 flags, EdsioGenericProperty *ret_prop) +{ + EdsioProperty* prop; + EdsioPropertyType* type; + EdsioHostType* host; + + name = edsio_intern_string (name); + ph = edsio_intern_string (ph); + t = edsio_intern_string (t); + + g_assert (all_property_types); + + if (! all_properties) + { + all_properties = g_hash_table_new (g_direct_hash, g_direct_equal); + all_property_codes = g_hash_table_new (g_int_hash, g_int_equal); + } + + if ((prop = g_hash_table_lookup (all_properties, name)) != NULL) + { + edsio_generate_string_event (EC_EdsioDuplicatePropertyNameRegistered, name); + ret_prop->code = prop->prop_code; + return TRUE; + } + + if ((type = g_hash_table_lookup (all_property_types, t)) == NULL) + { + edsio_generate_string_event (EC_EdsioNoSuchPropertyType, t); + return FALSE; + } + + if ((host = g_hash_table_lookup (all_host_types, ph)) == NULL) + { + edsio_generate_string_event (EC_EdsioNoSuchHostType, ph); + return FALSE; + } + + if (flags & PF_Persistent && ! host->isset) + { + edsio_generate_stringstring_event (EC_EdsioPersistenceUnavailable, name, ph); + return FALSE; + } + + prop = g_new0 (EdsioProperty, 1); + + prop->prop_code = ++property_code_sequence; + prop->prop_name = name; + prop->prop_flags = flags; + prop->type = type; + prop->host = host; + + g_hash_table_insert (all_properties, (gpointer) name, prop); + g_hash_table_insert (all_property_codes, & prop->prop_code, prop); + + ret_prop->code = prop->prop_code; + + return TRUE; +} + +static EdsioProperty* +edsio_property_find (const char* ph, const char* t, guint32 code) +{ + EdsioProperty* prop; + + ph = edsio_intern_string (ph); + t = edsio_intern_string (t); + + if (code <= 0 || code > property_code_sequence) + { + edsio_generate_int_event (EC_EdsioNoSuchProperty, code); + return NULL; + } + + if (! (prop = g_hash_table_lookup (all_property_codes, & code))) + { + edsio_generate_int_event (EC_EdsioNoSuchProperty, code); + return NULL; + } + + if (prop->host->host_name != ph) + { + edsio_generate_stringstringstring_event (EC_EdsioWrongHostType, prop->prop_name, ph, prop->host->host_name); + return NULL; + } + + if (prop->type->type_name != t) + { + edsio_generate_stringstringstring_event (EC_EdsioWrongDataType, prop->prop_name, t, prop->type->type_name); + return NULL; + } + + return prop; +} + +EdsioPropertyEntry* +edsio_property_get (gpointer obj, EdsioProperty* prop) +{ + EdsioPropertyEntry* ent; + GHashTable* table = * prop->host->ptable (obj); + gboolean persist = prop->prop_flags & PF_Persistent; + +#ifdef DEBUG_PROPS + g_print ("get %p.%s\n", obj, prop->prop_name); +#endif + + if (table && (ent = g_hash_table_lookup (table, & prop->prop_code)) != NULL) + return ent; + + if (persist) + { + SerialSource* src; + + if (! (src = prop->host->source (obj, prop->prop_name))) + return NULL; + + g_assert (prop->type->unserialize); + + if (! prop->type->unserialize (src, & ent)) + return NULL; + + g_assert (ent); + + if (! src->source_close (src)) + return NULL; + + src->source_free (src); + + if (! table) + table = (* prop->host->ptable (obj)) = g_hash_table_new (g_int_hash, g_int_equal); + + g_hash_table_insert (table, & prop->prop_code, ent); + + return ent; + } + + edsio_generate_string_event (EC_EdsioPropertyNotSet, prop->prop_name); + return NULL; +} + +gboolean +edsio_property_set (gpointer obj, EdsioProperty* prop, EdsioPropertyEntry* set) +{ + EdsioPropertyEntry* ent; + gboolean persist = prop->prop_flags & PF_Persistent; + GHashTable* table = * prop->host->ptable (obj); + +#ifdef DEBUG_PROPS + g_print ("set %p.%s\n", obj, prop->prop_name); +#endif + + if (! table) + table = (* prop->host->ptable (obj)) = g_hash_table_new (g_int_hash, g_int_equal); + + ent = g_hash_table_lookup (table, & prop->prop_code); + + if (ent) + { + g_hash_table_remove (table, & prop->prop_code); + prop->type->freer (ent); + } + + g_hash_table_insert (table, & prop->prop_code, set); + + if (persist) + { + SerialSink* sink; + + if (! (sink = prop->host->sink (obj, prop->prop_name))) + return FALSE; + + g_assert (prop->type->serialize); + + if (! prop->type->serialize (sink, set)) + return FALSE; + + if (! sink->sink_close (sink)) + return FALSE; + + sink->sink_free (sink); + } + + return TRUE; +} + +gboolean +edsio_property_isset (const char* ph, const char* t, guint32 code, gpointer obj) +{ + EdsioProperty* prop; + GHashTable* table; + gboolean persist; + gboolean result = FALSE; + + if (! (prop = edsio_property_find (ph, t, code))) + goto done; + + persist = prop->prop_flags & PF_Persistent; + + table = * prop->host->ptable (obj); + + if (persist) + { + PersistIssetFunc issetfunc = prop->host->isset; + if (issetfunc(obj, prop->prop_name)) + { + if (! edsio_property_get (obj, prop)) + goto done; + + table = * prop->host->ptable (obj); + } + } + + if (! table) + goto done; + + result = (g_hash_table_lookup (table, & code) != NULL); + + done: + +#ifdef DEBUG_PROPS + g_print ("isset %p.%s = %s\n", obj, prop->prop_name, result ? "true" : "false"); +#endif + + return result; +} + +gboolean +edsio_property_unset (const char* ph, const char* t, guint32 code, gpointer obj) +{ + EdsioProperty* prop; + gboolean persist; + GHashTable* table; + + if (! (prop = edsio_property_find (ph, t, code))) + return FALSE; + +#ifdef DEBUG_PROPS + g_print ("unset %p.%s\n", obj, prop->prop_name); +#endif + + persist = prop->prop_flags & PF_Persistent; + table = * prop->host->ptable (obj); + + if (table) + { + EdsioPropertyEntry* ent; + + ent = g_hash_table_lookup (table, & code); + + g_hash_table_remove (table, & code); + + if (g_hash_table_size (table) == 0) + { + g_hash_table_destroy (table); + table = (* prop->host->ptable (obj)) = NULL; + } + + /*g_free (ent);*/ + } + + if (persist) + { + if (! prop->host->unset (obj, prop->prop_name)) + return FALSE; + } + + return TRUE; +} + +static gboolean +edsio_false () +{ + return FALSE; +} + +PropGSFunc +edsio_property_getter (const char* ph, const char* t, guint32 code, EdsioProperty** ep) +{ + if (! ((*ep) = edsio_property_find (ph, t, code))) + return & edsio_false; + + return (* ep)->type->getter; +} + +PropGSFunc +edsio_property_setter (const char* ph, const char* t, guint32 code, EdsioProperty** ep) +{ + if (! ((* ep) = edsio_property_find (ph, t, code))) + return & edsio_false; + + return (* ep)->type->setter; +} + +/* Primitive type serializers + */ + +/* integer + */ +gboolean +edsio_property_uint_getter (gpointer obj, EdsioProperty* prop, guint32* get) +{ + EdsioPropertyEntry *ent; + + if (! (ent = edsio_property_get (obj, prop))) + return FALSE; + + (*get) = ent->as_uint32; + + return TRUE; +} + +gboolean +edsio_property_uint_setter (gpointer obj, EdsioProperty* prop, guint32 set) +{ + EdsioPropertyEntry *ent = g_new (EdsioPropertyEntry, 1); + + ent->as_uint32 = set; + + return edsio_property_set (obj, prop, ent); +} + +void +edsio_property_uint_free (gpointer obj) +{ + g_free (obj); +} + +gboolean +unserialize_uint (SerialSource *source, guint32** x) +{ + SerialEdsioUint *s; + guint32 *n; + + if (! unserialize_edsiouint (source, & s)) + return FALSE; + + n = g_new (guint32, 1); + + (* x) = n; + + (* n) = s->val; + + g_free (s); + + return TRUE; +} + +gboolean +serialize_uint_obj (SerialSink *sink, guint32* x) +{ + return serialize_edsiouint (sink, *x); +} + +/* String + */ + +void +edsio_property_string_free (gpointer obj) +{ + g_free (obj); +} + +gboolean +edsio_property_string_getter (gpointer obj, EdsioProperty* prop, const char** get) +{ + if (! ((*get) = (const char*) edsio_property_get (obj, prop))) + return FALSE; + + return TRUE; +} + +gboolean +edsio_property_string_setter (gpointer obj, EdsioProperty* prop, const char* set) +{ + return edsio_property_set (obj, prop, (EdsioPropertyEntry*) set); +} + +gboolean +unserialize_string (SerialSource *source, const char** x) +{ + SerialEdsioString *s; + + if (! unserialize_edsiostring (source, & s)) + return FALSE; + + (*x) = g_strdup (s->val); + + g_free (s); + + return TRUE; +} + +gboolean +serialize_string_obj (SerialSink *sink, const char* x) +{ + return serialize_edsiostring (sink, x); +} + +/* Bytes + */ + +gboolean +unserialize_bytes (SerialSource *source, SerialEdsioBytes** x) +{ + return unserialize_edsiobytes (source, x); +} + +gboolean +serialize_bytes_obj (SerialSink *sink, SerialEdsioBytes *x) +{ + return serialize_edsiobytes_obj (sink, x); +} + +gboolean +edsio_property_bytes_getter (gpointer obj, EdsioProperty* prop, guint8** get, guint32* get_len) +{ + EdsioPropertyEntry *ent; + + if (! (ent = edsio_property_get (obj, prop))) + return FALSE; + + (* get) = (gpointer) ent->as_bytes.val; + (* get_len) = ent->as_bytes.val_len; + + return TRUE; +} + +gboolean +edsio_property_bytes_setter (gpointer obj, EdsioProperty* prop, guint8* set, guint32 set_len) +{ + EdsioPropertyEntry *ent = g_new (EdsioPropertyEntry, 1); + + ent->as_bytes.val = set; + ent->as_bytes.val_len = set_len; + + return edsio_property_set (obj, prop, ent); +} + +void +edsio_property_bytes_free (gpointer obj) +{ + g_free (obj); +} + +/* Vptr + */ + +gboolean +edsio_property_vptr_getter (gpointer obj, EdsioProperty* prop, void** get) +{ + if (! ((*get) = edsio_property_get (obj, prop))) + return FALSE; + + return TRUE; +} + +gboolean +edsio_property_vptr_setter (gpointer obj, EdsioProperty* prop, void* set) +{ + return edsio_property_set (obj, prop, (EdsioPropertyEntry*) set); +} + +void +edsio_property_vptr_free (gpointer obj) +{ + /* nothing */ +} + +/* Testing + */ + +#ifdef DEBUG_LIBEDSIO + +GHashTable** +edsio_proptest_property_table (PropTest *pt) +{ + return & pt->_edsio_property_table; +} + +SerialSource* +edsio_persist_proptest_source (PropTest *pt, const char* prop_name) +{ + GByteArray* array; + + if (! pt->ptable) + { + g_warning ("can't get persist property, no table\n"); + return NULL; + } + + if (! (array = g_hash_table_lookup (pt->ptable, prop_name))) + { + g_warning ("can't lookup persist property\n"); + return NULL; + } + + return edsio_simple_source (array->data, array->len, SBF_None); +} + +static void +pt_success (gpointer data, GByteArray* result) +{ + PropTest* pt = data; + + GByteArray* old; + + if (! pt->ptable) + pt->ptable = g_hash_table_new (g_str_hash, g_str_equal); + + old = g_hash_table_lookup (pt->ptable, (gpointer) pt->kludge); + + if (old) + g_byte_array_free (old, TRUE); + + g_hash_table_insert (pt->ptable, (gpointer) pt->kludge, result); +} + +SerialSink* +edsio_persist_proptest_sink (PropTest *pt, const char* prop_name) +{ + pt->kludge = prop_name; + + return edsio_simple_sink (pt, SBF_None, FALSE, pt_success, NULL); +} + +gboolean +edsio_persist_proptest_isset (PropTest *pt, const char* prop_name) +{ + if (! pt->ptable) + return FALSE; + + return g_hash_table_lookup (pt->ptable, prop_name) != NULL; +} + +gboolean +edsio_persist_proptest_unset (PropTest *pt, const char* prop_name) +{ + GByteArray* old; + + if (! pt->ptable) + return FALSE; + + old = g_hash_table_lookup (pt->ptable, prop_name); + + if (old) + { + g_byte_array_free (old, TRUE); + g_hash_table_remove (pt->ptable, prop_name); + return TRUE; + } + + return FALSE; +} + +#endif + +/* Misc source/sink stuff + */ + +SerialSink* +serializeio_gzip_sink (SerialSink* sink) +{ + /* @@@ not implemented */ + return sink; +} + +SerialSource* +serializeio_gzip_source (SerialSource* source) +{ + /* @@@ not implemented */ + return source; +} + +/* Checksum sink + */ +typedef struct _ChecksumSink ChecksumSink; + +static gboolean checksum_sink_close (SerialSink* sink); +static gboolean checksum_sink_write (SerialSink* sink, const guint8 *ptr, guint32 len); +static void checksum_sink_free (SerialSink* sink); +static gboolean checksum_sink_quantum (SerialSink* sink); + +struct _ChecksumSink +{ + SerialSink sink; + + SerialSink* out; + + EdsioMD5Ctx ctx; + guint8 md5[16]; + gboolean md5_done; + gboolean md5_written; +}; + +SerialSink* +serializeio_checksum_sink (SerialSink* out) +{ + ChecksumSink* it = g_new0 (ChecksumSink, 1); + SerialSink* sink = (SerialSink*) it; + + serializeio_sink_init (sink, + NULL, + checksum_sink_close, + checksum_sink_write, + checksum_sink_free, + checksum_sink_quantum); + + it->out = out; + + edsio_md5_init (& it->ctx); + + return sink; +} + +gboolean +checksum_sink_write (SerialSink* fsink, const guint8 *ptr, guint32 len) +{ + ChecksumSink* sink = (ChecksumSink*) fsink; + + if (! sink->out->sink_write (sink->out, ptr, len)) + return FALSE; + + edsio_md5_update (& sink->ctx, ptr, len); + + return TRUE; +} + +gboolean +checksum_sink_close (SerialSink* fsink) +{ + ChecksumSink* sink = (ChecksumSink*) fsink; + + if (! sink->md5_done) + { + edsio_md5_final (sink->md5, & sink->ctx); + sink->md5_done = TRUE; + } + + if (! sink->out->sink_write (sink->out, sink->md5, 16)) + return FALSE; + + if (! sink->out->sink_close (sink->out)) + return FALSE; + + return TRUE; +} + +void +checksum_sink_free (SerialSink* fsink) +{ + ChecksumSink* sink = (ChecksumSink*) fsink; + + sink->out->sink_free (sink->out); + + g_free (sink); +} + +gboolean +checksum_sink_quantum (SerialSink* fsink) +{ + ChecksumSink* sink = (ChecksumSink*) fsink; + + if (sink->out->sink_quantum) + return sink->out->sink_quantum (sink->out); + + return TRUE; +} + +/* Checksum source + */ + +typedef struct _ChecksumSource ChecksumSource; + +struct _ChecksumSource { + SerialSource source; + + SerialSource *in; + + EdsioMD5Ctx ctx; +}; + +static gboolean checksum_source_close (SerialSource* source); +static gboolean checksum_source_read (SerialSource* source, guint8 *ptr, guint32 len); +static void checksum_source_free (SerialSource* source); + +SerialSource* +serializeio_checksum_source (SerialSource* in0) +{ + ChecksumSource* it = g_new0 (ChecksumSource, 1); + SerialSource* source = (SerialSource*) it; + + serializeio_source_init (source, + NULL, + checksum_source_close, + checksum_source_read, + checksum_source_free, + NULL, + NULL); + + it->in = in0; + + edsio_md5_init (& it->ctx); + + return source; +} + +gboolean +checksum_source_close (SerialSource* fsource) +{ + ChecksumSource* source = (ChecksumSource*) fsource; + guint8 buf1[16]; + guint8 buf2[16]; + + if (! source->in->source_read (source->in, buf1, 16)) + return FALSE; + + edsio_md5_final (buf2, & source->ctx); + + if (memcmp (buf1, buf2, 16) != 0) + { + edsio_generate_void_event (EC_EdsioInvalidStreamChecksum); + return FALSE; + } + + if (! source->in->source_close (source->in)) + return FALSE; + + return TRUE; +} + +gboolean +checksum_source_read (SerialSource* fsource, guint8 *ptr, guint32 len) +{ + ChecksumSource* source = (ChecksumSource*) fsource; + + if (! source->in->source_read (source->in, ptr, len)) + return FALSE; + + edsio_md5_update (& source->ctx, ptr, len); + + return TRUE; +} + +void +checksum_source_free (SerialSource* fsource) +{ + ChecksumSource* source = (ChecksumSource*) fsource; + + source->in->source_free (source->in); + + g_free (source); +} + +/* Missing glib stuff + */ + +GQueue * +g_queue_new (void) +{ + GQueue *q = g_new (GQueue, 1); + + q->list = q->list_end = NULL; + q->list_size = 0; + + return q; +} + + +void +g_queue_free (GQueue *q) +{ + if (q) + { + if (q->list) + g_list_free (q->list); + g_free (q); + } +} + + +guint +g_queue_get_size (GQueue *q) +{ + return (q == NULL) ? 0 : q->list_size; +} + + +void +g_queue_push_front (GQueue *q, gpointer data) +{ + if (q) + { + q->list = g_list_prepend (q->list, data); + + if (q->list_end == NULL) + q->list_end = q->list; + + q->list_size++; + } +} + + +void +g_queue_push_back (GQueue *q, gpointer data) +{ + if (q) + { + q->list_end = g_list_append (q->list_end, data); + + if (! q->list) + q->list = q->list_end; + else + q->list_end = q->list_end->next; + + q->list_size++; + } +} + + +gpointer +g_queue_pop_front (GQueue *q) +{ + gpointer data = NULL; + + if ((q) && (q->list)) + { + GList *node; + + node = q->list; + data = node->data; + + if (! node->next) + { + q->list = q->list_end = NULL; + q->list_size = 0; + } + else + { + q->list = node->next; + q->list->prev = NULL; + q->list_size--; + } + + g_list_free_1 (node); + } + + return data; +} + + +gpointer +g_queue_pop_back (GQueue *q) +{ + gpointer data = NULL; + + if ((q) && (q->list)) + { + GList *node; + + node = q->list_end; + data = node->data; + + if (! node->prev) + { + q->list = q->list_end = NULL; + q->list_size = 0; + } + else + { + q->list_end = node->prev; + q->list_end->next = NULL; + q->list_size--; + } + + g_list_free_1 (node); + } + + return data; +} diff --git a/xdelta-1.1.3/libedsio/edsio.el b/xdelta-1.1.3/libedsio/edsio.el new file mode 100644 index 0000000..cbc0020 --- /dev/null +++ b/xdelta-1.1.3/libedsio/edsio.el @@ -0,0 +1,1865 @@ +;; -*- Emacs-Lisp -*- + +(require 'cl) +(require 'pp) + +(eval-and-compile (setq load-path (cons ".." (cons "." load-path)))) +(provide 'edsio) +(eval-and-compile (setq load-path (cdr (cdr load-path)))) + +;; Turn of assertions in compiled code. +(eval-and-compile + (setq cl-optimize-speed 3) + (setq cl-optimize-safety 1) + ) + +;; Begin + +(defconst *definition-state* nil + "List of all the names of variables containing state from the +definition file so that operations may be performed on everything in +the definition file.") +(defconst *definition-attrs* nil + "List of attributes for sharing indices.") +(defconst *all-objects* nil) +(defconst *output-files* nil + "List of lists (NAME BUFFER) used during output of headers.") +(defconst *output-prefix* nil + "Prefix used for outputing header files.") +(defconst *cpp-extension* "c") + +;; This defines several functions and one macro. The indirection makes +;; it a little bit confusing to read. It defines the macro DEFDNAME, +;; a function DEFDNAME*, MAKE-DNAME, and a setter and getter for each arg. +(eval-and-compile +(defmacro attr-index (attr) + `(- (length *definition-attrs*) (length (memq ,attr *definition-attrs*)))) + +(defmacro defastmacro(dtype args attrs) + "Defines a macro named DEFDTYPE for defining various AST properties." + (let ((def-macr (intern (format "def%s" dtype))) + (def-func (intern (format "def%s*" dtype))) + (make-func (intern (format "make-%s" dtype))) + (state (intern (format "*%s-defs*" dtype))) + (exprs nil)) + (if (not *definition-attrs*) + (setq *definition-attrs* '(menunode menuline))) + (let ((fields (append args attrs))) + (while fields + (if (not (memq (car fields) *definition-attrs*)) + (setq *definition-attrs* (append *definition-attrs* (list (car fields))))) + (setq fields (cdr fields)) + ) + ) + ;; Add it to *definition-state* + (setq *definition-state* (cons state *definition-state*)) + ;; DEFCONST it + (setq exprs (cons (list 'defconst state (quote nil)) exprs)) + ;; DEFMACRO DEFDTYPE + (setq exprs (cons (list 'defmacro + def-macr + args + (append (list 'list (list 'quote def-func)) + (mapcar (function (lambda (x) + (list 'list (list 'quote 'quote) x) + ) + ) + args) + ) + ) + exprs + ) + ) + ;; DEFUN DEFDTYPE* + (setq exprs (cons (list 'defun + def-func + args + (list 'setq + state + (list 'cons + (cons make-func args) + state + ) + ) + ) + exprs + ) + ) + ;; MAKE-DTYPE + (setq exprs (cons (list 'defun + make-func + args + (list 'let (list (list 'it (list 'make-vector (length *definition-attrs*) nil))) + (if args + (cons 'progn (mapcar + (function + (lambda (x) + (list 'aset 'it (attr-index x) x) + ) + ) + args + ) + ) + ) + (if attrs + (cons 'progn (mapcar + (function + (lambda (x) + (list 'aset 'it (attr-index x) nil) + ) + ) + attrs + ) + ) + ) + (if (memq 'menu args) + (list 'progn + (list 'aset 'it (attr-index 'menunode) (list 'function (intern (format "%s-menunode" dtype)))) + (list 'aset 'it (attr-index 'menuline) (list 'function (intern (format "%s-menuline" dtype)))) + ) + ) + (list 'cons (list 'quote dtype) 'it) + ) + ) + exprs + ) + ) + ;; Add the fake arguments: + (if (memq 'menu args) + (setq attrs (append (list 'menunode 'menuline) attrs))) + (setq args (append args attrs)) + (while args + (let* ((thearg (car args)) + (arg-set (intern (format "%s-%s-set" dtype thearg))) + (arg-get (intern (format "%s-%s-get" dtype thearg)))) + ;; DTYPE-ARG-GET + (setq exprs (cons (list 'defmacro + (intern (format "%s-%s-get" dtype thearg)) + '(obj) + (list 'list + (list 'quote 'aref) + (list 'list (list 'quote 'cdr) 'obj) + (attr-index thearg)) + ) + exprs + ) + ) + ;; DTYPE-ARG-SET + (setq exprs (cons (list 'defmacro + (intern (format "%s-%s-set" dtype thearg)) + '(obj val) + (list 'list + (list 'quote 'aset) + (list 'list (list 'quote 'cdr) 'obj) + (attr-index thearg) + 'val) + ) + exprs + ) + ) + ) + (setq args (cdr args)) + ) + ;; To see what it's generating uncomment the next 2 lines. + ;;(setq message-log-max t) + ;;(mapcar (function pp) exprs) + (cons 'progn exprs) + ) + ) + + +;; This is, as the name suggests, really bogus. Basically, each DEFASTMACRO +;; call adds to the list *definition-state*. To compile it, however, it has +;; to be done at compile time, so this macro gets evaluated when being compiled +;; and clears the list. Then the DEFASTMACRO calls are made, and then DEFCDS +;; is called to define CLEAR-DEFINITION-STATE which resets the list to the +;; compile-time computed value of *definition-state*, it would otherwise be +;; empty when running compiled code. +(defmacro bogus () + (setq *definition-state* nil) + (setq *definition-attrs* nil) + ) + + (bogus) + +;; Each DEFASTMACRO statement defines a directive for the definition +;; file along with it's argument names. +(defastmacro sertype (name number fields transients) ()) +(defastmacro module (name id header pheader) ()) +(defastmacro import (name) (prefix)) + +(defastmacro event (name level uargs sargs desc) ()) +(defastmacro etype (name ctype) ()) + +(defastmacro prophost (name letter ctype persist) (proptypes)) +(defastmacro prophosttype (host type) ()) + +(defmacro defcds () + (let ((exprs nil)) + (setq exprs (list (list 'defun 'clear-definition-state nil + '(setq *all-objects* nil) + (list 'setq '*definition-state* (list 'quote *definition-state*)) + (list 'setq '*definition-attrs* (list 'quote *definition-attrs*)) + '(mapcar (function (lambda (x) (set x nil))) *definition-state*) + ) + + ) + ) + (mapcar + (function + (lambda (x) + (setq exprs (cons (list 'defmacro + (intern (format "obj-%s-get" x)) + '(obj) + (list 'list + (list 'quote 'aref) + (list 'list (list 'quote 'cdr) 'obj) + (attr-index x)) + ) + exprs + ) + ) + (setq exprs (cons (list 'defmacro + (intern (format "obj-%s-set" x)) + '(obj val) + (list 'list + (list 'quote 'aset) + (list 'list (list 'quote 'cdr) 'obj) + (attr-index x) + 'val) + ) + exprs + ) + ) + (let ((get (intern (format "obj-%s-get" x)))) + (setq exprs (cons (list 'defun + (intern (format "obj-%s-eq" x)) + '(val olist) + `(let ((ret nil)) + (while (and (not ret) olist) + (if (eq val (,get (car olist))) + (setq ret (car olist)) + ) + (setq olist (cdr olist)) + ) + ret + ) + ) + exprs + ) + ) + ) + ) + ) + *definition-attrs* + ) + ;;(setq message-log-max t) + ;;(mapcar (function pp) exprs) + (cons 'progn exprs) + ) + ) + +(defcds) +) +;; Entry Points + +(defun generate-ser-noargs () + (interactive) + (generate-ser "edsio.ser" "edsio") + ) + +(defun generate-ser (input-file output-prefix) + ;(interactive "finput: \nsoutput: \nsid: ") + (let ((make-backup-files nil) + (executing-kbd-macro t)) + (clear-definition-state) + + (do-it input-file output-prefix) + ) + ) + +(defconst *library-id* nil + "Identifier of this library.") + +(defconst *library-header* nil + "Header of this library.") +(defconst *library-pheader* nil + "Header of this library.") + +(defconst *prefix-with-library-header* t) + +(defun load-defs(file) + (load-file file) + (setq *import-defs* (reverse *import-defs*)) + (setq *module-defs* (reverse *module-defs*)) + (setq *sertype-defs* (reverse *sertype-defs*)) + + (setq *event-defs* (reverse *event-defs*)) + (setq *etype-defs* (reverse *etype-defs*)) + + (setq *prophost-defs* (reverse *prophost-defs*)) + (setq *prophosttype-defs* (reverse *prophosttype-defs*)) + ) + +(defconst *header-typedef-marker* nil) +(defconst *source-init-marker* nil) +(defconst *source-top-marker* nil) + +(defun do-it (input-file output-prefix) + (setq *output-files* nil) + (setq *output-prefix* output-prefix) + + (load-defs input-file) + + (if (not *module-defs*) + (error "no defmodule in %s" input-file)) + + (if (> (length *module-defs*) 1) + (error "too many defmodules in %s" input-file)) + + (setq *library-id* (module-id-get (car *module-defs*))) + (setq *library-header* (module-header-get (car *module-defs*))) + (setq *library-pheader* (module-pheader-get (car *module-defs*))) + + (when (not *library-header*) + (setq *prefix-with-library-header* nil) + (setq *library-header* (format "%s_edsio.h" *output-prefix*)) + ) + + (if (or (<= *library-id* 0) + (>= *library-id* 256)) + (error "Library-id is out of range")) + + (if (> (length *sertype-defs*) 24) + (error "no more than 24 types")) + + (unwind-protect + (progn + + (output-header-file "_edsio") + + (read-imports) + + (insert "/* Initialize this library. */\n\n") + (insert "gboolean " *output-prefix* "_edsio_init (void);\n\n") + + (insert "/* Types defined here. */\n\n") + (setq *header-typedef-marker* (point-marker)) + + (insert "/* Functions declared here. */\n\n") + + (output-source-file "_edsio") + + (insert "#include \"" *library-header* "\"\n\n") + (insert "#include \n\n") + + (if *library-pheader* + (insert "#include \"" *library-pheader* "\"\n\n")) + + (insert "/* Declarations. */\n\n") + (setq *source-top-marker* (point-marker)) + + (insert "\n") + + (insert "/* initialize this library. */\n\n") + (insert "gboolean\n" *output-prefix* "_edsio_init (void)\n{\n") + (insert " static gboolean once = FALSE;\n") + (insert " static gboolean result = FALSE;\n") + (insert " if (once) return result;\n") + (insert " once = TRUE;\n") + + (setq *source-init-marker* (point-marker)) + + (insert (format " edsio_library_register (%d, \"%s\");\n" *library-id* *output-prefix*)) + (insert " result = TRUE;\n") + (insert " return TRUE;\n") + (insert "};\n\n") + + (if *prophosttype-defs* + (generate-properties)) + + (if *sertype-defs* + (generate-code)) + + (if *event-defs* + (generate-events)) + +; (message "source file:\n%s" (buffer-string)) + + (mapcar (function (lambda (x) (output-finish-file x))) *output-files*) + ) + (mapcar (function (lambda (x) (kill-buffer (cadr x)))) *output-files*) + ) + ) + +(defvar *all-sertype-defs* nil) +(defvar *all-prophost-defs* nil) +(defvar *all-etype-defs* nil) + +(defun read-imports () + + (setq *all-sertype-defs* *sertype-defs*) + (setq *all-etype-defs* *etype-defs*) + (setq *all-prophost-defs* *prophost-defs*) + + (let ((mods *module-defs*) + (imps0 *import-defs*) + (imps *import-defs*) + (types *sertype-defs*) + (events *event-defs*) + (etypes *etype-defs*) + (phosts *prophost-defs*) + (phts *prophosttype-defs*) + ) + + (while imps + (clear-definition-state) + + (load-defs (import-name-get (car imps))) + + (setq *all-sertype-defs* (append *all-sertype-defs* *sertype-defs*)) + (setq *all-etype-defs* (append *all-etype-defs* *etype-defs*)) + (setq *all-prophost-defs* (append *all-prophost-defs* *prophost-defs*)) + + (import-prefix-set (car imps) (module-name-get (car *module-defs*))) + + (when (or *sertype-defs* *event-defs*) + (output-header-file "_edsio") + (insert (format "#include \"%s_edsio.h\"\n\n" (import-prefix-get (car imps)))) + ) + + (setq imps (cdr imps)) + ) + + (setq *module-defs* mods) + (setq *import-defs* imps0) + (setq *sertype-defs* types) + (setq *event-defs* events) + (setq *etype-defs* etypes) + (setq *prophost-defs* phosts) + (setq *prophosttype-defs* phts) + ) + ) + + +(defun output-header-file (name) + (output-file (format "%s.h" name) 'c-header *output-prefix*)) + +(defun output-source-file (name) + (output-file (format "%s.%s" name *cpp-extension*) 'c *output-prefix*)) + +(defun output-source-include-file (name) + (output-file (format "%s.%si" name *cpp-extension*) 'c *output-prefix*)) + +(defun output-plain-file (name) + (output-file (format "%s" name) 'plain "")) + +(defun output-file (name type prefix) + (let* ((name (format "%s%s" prefix name)) + (it (assoc name *output-files*))) + (if it + (set-buffer (cadr it)) + (let ((nbuf (get-buffer-create (generate-new-buffer-name name)))) + (setq *output-files* (cons (list name nbuf type) *output-files*)) + (set-buffer nbuf) + ) + ) + ) + ) + +(defun output-finish-file (file) + (let ((name (car file)) + (buf (cadr file)) + (type (caddr file))) + (set-buffer buf) + ;(message "printing %s: %s" file (buffer-string)) + (cond ((eq type 'c) + (output-to-c name nil)) + ((eq type 'c-header) + (output-to-c name t)) + ) + (write-file-if-different buf name) + ) + ) + +(defun output-to-c (name is-header) + (goto-char (point-min)) + (insert "/* -*-Mode: C;-*- + * Copyright (C) 1997, 1998, 1999 Josh MacDonald + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + * + * Author: Josh MacDonald + * + * This file was AUTOMATICALLY GENERATED using: + * + * $Id: edsio.el,v 1.1 2004/01/05 18:54:23 icculus Exp $ + */ + +") + + (if is-header + (let ((cppname (string-replace-regexp (upcase name) "[-./]" "_"))) + (insert "#include \"edsio.h\"\n\n") + + (if *prefix-with-library-header* + (insert "#include \"" *library-header* "\"\n\n")) + + (insert "#ifndef _" cppname "_\n") + (insert "#define _" cppname "_\n\n") + (insert "#ifdef __cplusplus\n") + (insert "extern \"C\" {\n") + (insert "#endif\n\n") + (goto-char (point-max)) + (insert "#ifdef __cplusplus\n") + (insert "}\n") + (insert "#endif\n") + (insert "\n#endif /* _" cppname "_ */\n\n") + ) + ) + ) + +(defun string-replace-regexp (str regexp to-string) + "Result of replacing all occurrences in STR of REGEXP by TO-STRING. The +replacement is as for replace-regexp." + (let ((work (get-buffer-create "*string-tmp*"))) + (save-excursion + (set-buffer work) + (erase-buffer) + (insert str) + (beginning-of-buffer) + (while (re-search-forward regexp nil t) + (replace-match to-string nil nil)) + (buffer-string)))) + +(defun write-file-if-different (buf filename) + (save-excursion + (if (not (file-exists-p filename)) + (write-file filename) + (set-buffer buf) + (let ((old (get-buffer-create (generate-new-buffer-name filename))) + (bmin (point-min)) + (bmax (point-max))) + (unwind-protect + (progn + (set-buffer old) + (insert-file filename) + (let ((omin (point-min)) + (omax (point-max)) + (case-fold-search nil)) + (if (= 0 (compare-buffer-substrings old omin omax buf bmin bmax)) + (message "Output file %s is unchanged." filename) + (set-buffer buf) + (write-file filename) + ) + ) + ) + (kill-buffer old) + ) + ) + ) + ) + ) + + +(defun format-comlist (func l) + (let ((x "")) + (while l + (setq x (concat x (funcall func (car l)))) + (if (cdr l) + (setq x (concat x ", "))) + (setq l (cdr l)) + ) + x + ) + ) + +(defun format-semilist (func l) + (let ((x "")) + (while l + (setq x (concat x (funcall func (car l)))) + (if (cdr l) + (setq x (concat x "; "))) + (setq l (cdr l)) + ) + x + ) + ) + +(defun format-numbered-comlist (func l) + (let ((x "") + (n 0)) + (while l + (setq x (concat x (funcall func (car l) n))) + (setq n (+ n 1)) + (if (cdr l) + (setq x (concat x ", "))) + (setq l (cdr l)) + ) + x + ) + ) + +(defun capitalize1(s) + (let ((work (get-buffer-create "*string-tmp*"))) + (save-excursion + (set-buffer work) + (erase-buffer) + (insert (format "%s" s)) + (upcase-region (point-min) (+ (point-min) 1)) + (buffer-substring-no-properties (point-min) (point-max)) + ) + ) + ) + +(defun upcase-string (s) + (let ((work (get-buffer-create "*string-tmp*"))) + (save-excursion + (set-buffer work) + (erase-buffer) + (insert (format "%s" s)) + (upcase-region (point-min) (point-max)) + (buffer-substring-no-properties (point-min) (point-max)) + ) + ) + ) + +(defun downcase-string (s) + (let ((work (get-buffer-create "*string-tmp*"))) + (save-excursion + (set-buffer work) + (erase-buffer) + (insert (format "%s" s)) + (downcase-region (point-min) (point-max)) + (buffer-substring-no-properties (point-min) (point-max)) + ) + ) + ) + +;; HERE IT IS + +(defun generate-code () + + (let ((all-codes nil)) + (mapcar + (function + (lambda (st) + (let ((x (sertype-number-get st))) + (cond ((member x all-codes) + (error "serial type number %d defined twice" x)) + ((> x 24) + (error "serial type value %d too high" x)) + ((< x 0) + (error "serial type value %d too low" x)) + (t (setq all-codes (cons x all-codes)))))) + ) + *sertype-defs*) + ) + + (output-header-file "_edsio") + + (insert "/* Serial Types */\n\n") + (insert (format "enum _Serial%sType {\n" (capitalize1 *output-prefix*))) + (insert (format-comlist + (function + (lambda (x) + (format "\n ST_%s = (1<<(%d+EDSIO_LIBRARY_OFFSET_BITS))+%d" (sertype-name-get x) (sertype-number-get x) *library-id*))) *sertype-defs*)) + (insert "\n};\n\n") + + (insert "\n\n") + + (output-source-file "_edsio") + + (save-excursion + (goto-char *source-top-marker*) + + (insert "static void print_spaces (guint n) { int i; for (i = 0; i < n; i += 1) g_print (\" \"); }\n\n") + ) + + (mapcar (function generate-code-entry) *sertype-defs*) + + ) + +(defun generate-code-entry (entry) + (let ((ent-upcase (sertype-name-get entry)) + (ent-downcase (downcase-string (sertype-name-get entry)))) + + (output-header-file "_edsio") + + ;; The typedef, structure, and declarations. + + (save-excursion + (goto-char *header-typedef-marker*) + (insert (format "typedef struct _Serial%s Serial%s;\n" ent-upcase ent-upcase)) + ) + + (insert (format "/* %s Structure\n */\n\n" ent-upcase)) + + (insert (format "struct _Serial%s {\n" ent-upcase)) + + (apply (function insert) + (mapcar (function + (lambda (x) + (format " %s;\n" x))) + (entry-typename-pairs entry nil))) + + (apply (function insert) + (mapcar (function + (lambda (x) + (format " %s;\n" x))) + (sertype-transients-get entry))) + + (insert "};\n\n") + + (insert (format "void serializeio_print_%s_obj (Serial%s* obj, guint indent_spaces);\n\n" ent-downcase ent-upcase)) + + (insert (format "gboolean unserialize_%s (SerialSource *source, Serial%s**);\n" ent-downcase ent-upcase)) + (insert (format "gboolean unserialize_%s_internal (SerialSource *source, Serial%s** );\n" ent-downcase ent-upcase)) + (insert (format "gboolean unserialize_%s_internal_noalloc (SerialSource *source, Serial%s* );\n" ent-downcase ent-upcase)) + (insert (format "gboolean serialize_%s (SerialSink *sink%s);\n" ent-downcase (entry-arglist t entry))) + (insert (format "gboolean serialize_%s_obj (SerialSink *sink, const Serial%s* obj);\n" ent-downcase ent-upcase)) + (insert (format "gboolean serialize_%s_internal (SerialSink *sink%s);\n" ent-downcase (entry-arglist t entry))) + (insert (format "gboolean serialize_%s_obj_internal (SerialSink *sink, Serial%s* obj);\n" ent-downcase ent-upcase)) + (insert (format "guint serializeio_count_%s (%s);\n" ent-downcase (entry-arglist nil entry))) + (insert (format "guint serializeio_count_%s_obj (Serial%s const* obj);\n" ent-downcase ent-upcase)) + (insert (format "\n")) + + (output-source-file "_edsio") + + ;; The init entry + + (save-excursion + (goto-char *source-init-marker*) + (insert (format " serializeio_initialize_type (\"ST_%s\", ST_%s, &unserialize_%s_internal, &serialize_%s_obj_internal, &serializeio_count_%s_obj, &serializeio_print_%s_obj);\n" ent-upcase ent-upcase ent-downcase ent-downcase ent-downcase ent-downcase)) + ) + + ;; Count code + + (insert (format "/* %s Count\n */\n\n" ent-upcase)) + + (insert (format "guint\nserializeio_count_%s (%s) {\n" ent-downcase (entry-arglist nil entry))) + (insert (format " guint size = sizeof (Serial%s);\n" ent-upcase)) + (apply (function insert) + (mapcar (function (lambda (x) (concat + (format " ALIGN_8 (size);\n") + (entry-count-field entry x (format "%s" (car x)) " " t)))) + (sertype-fields-get entry))) + (insert (format " ALIGN_8 (size);\n")) + (insert (format " return size;\n")) + (insert (format "}\n\n")) + + ;; Count Object code + + (insert (format "guint\nserializeio_count_%s_obj (Serial%s const* obj) {\n" ent-downcase ent-upcase)) + (insert (format " return serializeio_count_%s (%s);\n" ent-downcase (entry-plist t nil "obj->" entry))) + (insert (format "}\n\n")) + + ;; Print object code + + (insert (format "/* %s Print\n */\n\n" ent-upcase)) + + (insert (format "void\nserializeio_print_%s_obj (Serial%s* obj, guint indent_spaces) {\n" ent-downcase ent-upcase)) + (insert (format " print_spaces (indent_spaces);\n")) + + (insert (format " g_print (\"[ST_%s]\\n\");\n" ent-upcase)) + + (apply (function insert) + (mapcar (function (lambda (x) (entry-print-field entry x (format "obj->%s" (car x)) " " t))) + (sertype-fields-get entry))) + + (insert (format "}\n\n")) + + ;; Print internal code + + ;; Serialize code + + (insert (format "/* %s Serialize\n */\n\n" ent-upcase)) + + (insert (format "gboolean\nserialize_%s_internal (SerialSink *sink%s)\n" ent-downcase (entry-arglist t entry))) + (insert (format "{\n")) + + (apply (function insert) + (mapcar (function (lambda (x) (entry-serialize-field entry x (format "%s" (car x)) " " t))) + (sertype-fields-get entry))) + + (insert (format " return TRUE;\n")) + (if (sertype-fields-get entry) + (insert (format "bail:\n return FALSE;\n"))) + (insert (format "}\n\n")) + + ;; Internal Serialize Object code + + (insert (format "gboolean\nserialize_%s_obj_internal (SerialSink *sink, Serial%s* obj)\n" ent-downcase ent-upcase)) + (insert (format "{\n")) + (insert (format " return serialize_%s_internal (sink%s);\n" ent-downcase (entry-plist t t "obj->" entry))) + (insert (format "}\n\n")) + + ;; External Serialize code + + (insert (format "gboolean\nserialize_%s (SerialSink *sink%s)\n" ent-downcase (entry-arglist t entry))) + (insert (format "{\n")) + + (insert (format " if (! (* sink->sink_type) (sink, ST_%s, serializeio_count_%s (%s), TRUE)) goto bail;\n" ent-upcase ent-downcase (entry-plist nil nil "" entry))) + + (insert (format " if (! serialize_%s_internal (sink%s)) goto bail;\n" ent-downcase (entry-plist nil t "" entry))) + (insert (format " if (sink->sink_quantum && ! sink->sink_quantum (sink)) goto bail;\n")) + + (insert (format " return TRUE;\n")) + (insert (format "bail:\n")) + (insert (format " return FALSE;\n")) + (insert (format "}\n\n")) + + ;; External serialize_obj + + (insert (format "gboolean\nserialize_%s_obj (SerialSink *sink, const Serial%s* obj) {\n\n" ent-downcase ent-upcase)) + (insert (format " return serialize_%s (sink%s);\n" ent-downcase (entry-plist t t "obj->" entry))) + (insert (format "}\n\n")) + + ;; Unserialize code + + (insert (format "/* %s Unserialize\n */\n\n" ent-upcase)) + + (insert (format "gboolean\nunserialize_%s_internal_noalloc (SerialSource *source, Serial%s* result)\n" ent-downcase ent-upcase)) + (insert (format "{\n")) + + (apply (function insert) + (mapcar (function (lambda (x) (entry-unserialize-field entry x (format "result->%s" (car x)) " "))) + (sertype-fields-get entry))) + + (insert (format " return TRUE;\n")) + (if (sertype-fields-get entry) + (insert (format "bail:\n return FALSE;\n"))) + (insert (format "}\n\n")) + + + (insert (format "gboolean\nunserialize_%s_internal (SerialSource *source, Serial%s** result)\n" ent-downcase ent-upcase)) + (insert (format "{\n")) + + (insert (format " Serial%s* unser;\n" ent-upcase)) + (insert (format " (*result) = NULL;\n")) + (insert (format " unser = serializeio_source_alloc (source, sizeof (Serial%s));\n" ent-upcase)) + (insert (format " if (! unser) goto bail;\n")) + + (insert (format " if (! unserialize_%s_internal_noalloc (source, unser)) goto bail;\n" ent-downcase)) + + (insert (format " (*result) = unser;\n")) + (insert (format " return TRUE;\n")) + (insert (format "bail:\n")) + (insert (format " return FALSE;\n")) + (insert (format "}\n\n")) + + ;; External unserialize + + (insert (format "gboolean\nunserialize_%s (SerialSource *source, Serial%s** result)\n" ent-downcase ent-upcase)) + (insert (format "{\n")) + + (insert (format " if ( (* source->source_type) (source, TRUE) != ST_%s) goto bail;\n" ent-upcase)) + + (insert (format " if (! unserialize_%s_internal (source, result)) goto bail;\n" ent-downcase)) + + (insert (format " if (! serializeio_source_object_received (source)) goto bail;\n")) + + (insert (format " return TRUE;\n")) + (insert (format "bail:\n")) + (insert (format " return FALSE;\n")) + + (insert (format "}\n\n")) + + ) + ) + +(defun entry-typename-pairs (entry is-param) + (let ((pairs nil) + (fields (sertype-fields-get entry))) + (while fields + (let ((field (car fields))) + (when (or (equal (cadr field) 'bytes) + (and (consp (cadr field)) (equal (caadr field) 'array))) + (setq pairs (cons (format "guint32 %s_len" (car field)) pairs)) + ) + (when (equal (cadr field) 'object) + (setq pairs (cons (format "guint32 %s_type" (car field)) pairs)) + ) + (setq pairs (cons (field-decl field is-param) pairs)) + ) + (setq fields (cdr fields)) + ) + (nreverse pairs) + ) + ) + +(defun entry-param-names (prefix entry need_pbr) + (let ((pairs nil) + (fields (sertype-fields-get entry))) + (while fields + (let ((field (car fields))) + (when (or (equal (cadr field) 'bytes) + (and (consp (cadr field)) (equal (caadr field) 'array))) + (setq pairs (cons (format "%s%s_len" prefix (car field)) pairs)) + ) + (when (equal (cadr field) 'object) + (setq pairs (cons (format "%s%s_type" prefix (car field)) pairs)) + ) + (setq pairs (cons (format "%s%s%s" (if (and need_pbr (needs-ref field)) "&" "") prefix (car field)) pairs)) + ) + (setq fields (cdr fields)) + ) + (nreverse pairs) + ) + ) + +(defun field-ctype (field) + (cond ((equal (cadr field) 'string) + "const gchar*") + ((equal (cadr field) 'uint) + "guint32") + ((equal (cadr field) 'uint32) + "guint32") + ((equal (cadr field) 'uint16) + "guint16") + ((equal (cadr field) 'uint8) + "guint8") + ((equal (cadr field) 'boolean) + "gboolean") + ((equal (cadr field) 'bytes) + "const guint8*") + ((equal (cadr field) 'object) + "void*") + ((member (cadr field) (mapcar (lambda (x) (sertype-name-get x)) *all-sertype-defs*)) + (format "Serial%s" (cadr field))) + ((equal (car (cadr field)) 'bytes) + "const guint8*") + ((member (car (cadr field)) '(array ptr)) + (concat (field-ctype (cadr field)) "*")) + (t (error "unrecognized field type: %s" (cadr field)))) + ) + +(defun field-decl (field is-param) + (if (and (consp (cadr field)) + (equal (car (cadr field)) 'bytes)) + (format "%sguint8 %s[%d]" (if is-param "const " "") (car field) (cadr (cadr field))) + ;(message "foo %s %s" field (member (cadr field) (mapcar (lambda (x) (sertype-name-get x)) *all-sertype-defs*))) + (format "%s %s" + (cond ((member (cadr field) (mapcar (lambda (x) (sertype-name-get x)) *all-sertype-defs*)) + (format "Serial%s%s" (cadr field) (if is-param " const*" ""))) + ((equal (cadr field) 'string) + "const gchar*") + ((equal (cadr field) 'uint) + "guint32") + ((equal (cadr field) 'uint32) + "guint32") + ((equal (cadr field) 'uint16) + "guint16") + ((equal (cadr field) 'uint8) + "guint8") + ((equal (cadr field) 'boolean) + "gboolean") + ((equal (cadr field) 'bytes) + "const guint8*") + ((equal (cadr field) 'object) + "void*") + ((member (car (cadr field)) '(array ptr)) + (concat (field-ctype (cadr field)) (if is-param " const*" "*"))) + (t (error "unrecognized field type: %s" (cadr field)))) + (car field))) + ) + +(defun entry-arglist (need_first entry) + (concat + (if (and need_first (sertype-fields-get entry)) ", " "") + (format-comlist (function (lambda (x) x)) (entry-typename-pairs entry t)))) + +(defun needs-ref (field) + (member (cadr field) (mapcar (lambda (x) (sertype-name-get x)) *all-sertype-defs*)) + ) + +(defun entry-plist (need_pbr need_first prefix entry) + (concat + (if (and need_first (sertype-fields-get entry)) ", " "") + (format-comlist (function (lambda (x) (format "%s" x))) + (entry-param-names prefix entry need_pbr)))) + +(defun entry-unserialize-field (entry field name prefix) + (cond ((equal (cadr field) 'uint) + (format "%sif (! (* source->next_uint) (source, &%s)) goto bail;\n" prefix name)) + ((equal (cadr field) 'uint32) + (format "%sif (! (* source->next_uint32) (source, &%s)) goto bail;\n" prefix name)) + ((equal (cadr field) 'uint16) + (format "%sif (! (* source->next_uint16) (source, &%s)) goto bail;\n" prefix name)) + ((equal (cadr field) 'uint8) + (format "%sif (! (* source->next_uint8) (source, &%s)) goto bail;\n" prefix name)) + ((equal (cadr field) 'boolean) + (format "%sif (! (* source->next_bool) (source, &%s)) goto bail;\n" prefix name)) + ((equal (cadr field) 'string) + (format "%sif (! (* source->next_string) (source, &%s)) goto bail;\n" prefix name)) + ((equal (cadr field) 'bytes) + (format "%sif (! (* source->next_bytes) (source, &%s, &%s_len)) goto bail;\n" prefix name name)) + ((equal (cadr field) 'object) + (format "%sif (! serializeio_unserialize_generic_internal (source, &%s_type, &%s, FALSE)) goto bail;\n" prefix name name)) + ((member (cadr field) (mapcar (lambda (x) (sertype-name-get x)) *all-sertype-defs*)) + (format "%sif (! unserialize_%s_internal_noalloc (source, &%s)) goto bail;\n" prefix (downcase-string (cadr field)) name)) + ((and (equal (car (cadr field)) 'ptr) + (member (cadr (cadr field)) (mapcar (lambda (x) (sertype-name-get x)) *all-sertype-defs*))) + (format "%sif (! unserialize_%s_internal (source, &%s)) goto bail;\n" prefix (downcase-string (cadr (cadr field))) name)) + ((equal (car (cadr field)) 'bytes) + (format "%sif (! (* source->next_bytes_known) (source, %s, %d)) goto bail;\n" prefix name (cadr (cadr field)))) + ((equal (car (cadr field)) 'array) + (format "%s{ +%s gint i; +%s if (! (* source->next_uint) (source, &%s_len)) goto bail; +%s if (! (%s = serializeio_source_alloc (source, sizeof (%s) * %s_len))) goto bail; +%s for (i = 0; i < %s_len; i += 1) +%s { +%s%s } +%s} +" + prefix + prefix prefix + name + prefix + name + (field-ctype (cadr field)) + name + prefix + name + prefix + prefix + (entry-unserialize-field entry (cadr field) (concat "(" name "[i])") (concat prefix " ")) + prefix + )) + (t (error "unrecognized field type: %s" (cadr field))))) + + +(defun entry-serialize-field (entry field name prefix is-param) + (cond ((equal (cadr field) 'uint) + (format "%sif (! (* sink->next_uint) (sink, %s)) goto bail;\n" prefix name)) + ((equal (cadr field) 'uint16) + (format "%sif (! (* sink->next_uint16) (sink, %s)) goto bail;\n" prefix name)) + ((equal (cadr field) 'uint8) + (format "%sif (! (* sink->next_uint8) (sink, %s)) goto bail;\n" prefix name)) + ((equal (cadr field) 'uint32) + (format "%sif (! (* sink->next_uint32) (sink, %s)) goto bail;\n" prefix name)) + ((equal (cadr field) 'boolean) + (format "%sif (! (* sink->next_bool) (sink, %s)) goto bail;\n" prefix name)) + ((equal (cadr field) 'string) + (format "%sif (! (* sink->next_string) (sink, %s)) goto bail;\n" prefix name)) + ((equal (cadr field) 'bytes) + (format "%sif (! (* sink->next_bytes) (sink, %s, %s_len)) goto bail;\n" prefix name name)) + ((equal (cadr field) 'object) + (format "%sif (! serializeio_serialize_generic_internal (sink, %s_type, %s, FALSE)) goto bail;\n" prefix name name)) + ((member (cadr field) (mapcar (lambda (x) (sertype-name-get x)) *all-sertype-defs*)) + (format "%sif (! serialize_%s_internal (sink%s)) goto bail;\n" prefix (downcase-string (cadr field)) + (entry-plist t t (concat name (if is-param "->" ".")) (obj-name-eq (cadr field) *all-sertype-defs*)))) + ((and (equal (car (cadr field)) 'ptr) + (member (cadr (cadr field)) (mapcar (lambda (x) (sertype-name-get x)) *all-sertype-defs*))) + (format "%sif (! serialize_%s_internal (sink%s)) goto bail;\n" prefix (downcase-string (cadr (cadr field))) + (entry-plist t t (concat name "->") (obj-name-eq (cadr (cadr field)) *all-sertype-defs*)))) + ((equal (car (cadr field)) 'bytes) + (format "%sif (! (* sink->next_bytes_known) (sink, %s, %d)) goto bail;\n" prefix name (cadr (cadr field)))) + ((equal (car (cadr field)) 'array) + (format "%s{ +%s gint i; +%s if (! (* sink->next_uint) (sink, %s_len)) goto bail; +%s for (i = 0; i < %s_len; i += 1) +%s { +%s%s } +%s} +" + prefix prefix prefix + name + prefix + name + prefix + prefix + (entry-serialize-field entry (cadr field) (array-index name (cadr field)) (concat prefix " ") nil) + prefix + )) + (t (error "unrecognized field type: %s" (cadr field))))) + +(defun array-index (name field) + ;(concat "(" (if (needs-ref field) "&" "") name "[i])") + (concat "(" name "[i])") + ) + +(defun entry-count-field (entry field name prefix is-param) + (cond ((equal (cadr field) 'uint) + ;(format "%ssize += sizeof (guint32);\n" prefix) + "" + ) + ((equal (cadr field) 'uint32) + ;(format "%ssize += sizeof (guint32);\n" prefix) + "" + ) + ((equal (cadr field) 'uint16) + ;(format "%ssize += sizeof (guint16);\n" prefix) + "" + ) + ((equal (cadr field) 'uint8) + ;(format "%ssize += sizeof (guint8);\n" prefix) + "" + ) + ((equal (cadr field) 'boolean) + ;(format "%ssize += sizeof (gboolean);\n" prefix) + "" + ) + ((equal (cadr field) 'string) + (format "%ssize += strlen (%s) + 1;\n" prefix name) + ) + ((equal (cadr field) 'bytes) + (format "%ssize += %s_len;\n" prefix name) + ) + ((equal (cadr field) 'object) + (format "%ssize += serializeio_generic_count (%s_type, %s);\n" prefix name name) + ) + ((member (cadr field) (mapcar (lambda (x) (sertype-name-get x)) *all-sertype-defs*)) + (format "%ssize += serializeio_count_%s_obj (%s%s) - sizeof (Serial%s);\n" + prefix + (downcase-string (cadr field)) + (if is-param "" "& ") + name + (cadr field) + ) + ) + ((and (equal (car (cadr field)) 'ptr) + (member (cadr (cadr field)) (mapcar (lambda (x) (sertype-name-get x)) *all-sertype-defs*))) + (format "%ssize += serializeio_count_%s_obj (%s);\n" prefix (downcase-string (cadr (cadr field))) name) + ) + ((equal (car (cadr field)) 'bytes) + ;(format "%ssize += 0;\n" prefix (cadr (cadr field))) + "" + ) + ((equal (car (cadr field)) 'array) + (format "%s{ +%s gint i; +%s for (i = 0; i < %s_len; i += 1) +%s { +%s%s } +%s} +" + prefix prefix prefix + name + prefix + prefix + (entry-count-array-field entry (cadr field) (array-index name (cadr field)) (concat prefix " ") nil) + prefix + )) + (t (error "unrecognized field type: %s" (cadr field))))) + +(defun entry-count-array-field (entry field name prefix is-param) + (cond ((equal (cadr field) 'uint) + (format "%ssize += sizeof (guint32);\n" prefix) + ) + ((equal (cadr field) 'uint32) + (format "%ssize += sizeof (guint32);\n" prefix) + ) + ((equal (cadr field) 'uint16) + (format "%ssize += sizeof (guint16);\n" prefix) + ) + ((equal (cadr field) 'uint8) + (format "%ssize += sizeof (guint8);\n" prefix) + ) + ((equal (cadr field) 'boolean) + (format "%ssize += sizeof (gboolean);\n" prefix) + ) + ((equal (cadr field) 'string) + (format "%ssize += strlen (%s) + 1 + sizeof (void*);\n" prefix name) + ) + ((equal (cadr field) 'bytes) + (error "can't do that: bytes1") + ) + ((equal (cadr field) 'object) + (error "can't do that: object") + ) + ((member (cadr field) (mapcar (lambda (x) (sertype-name-get x)) *all-sertype-defs*)) + (format "%ssize += serializeio_count_%s_obj (%s%s);\n" + prefix + (downcase-string (cadr field)) + (if is-param "" "& ") + name + (cadr field) + ) + ) + ((and (equal (car (cadr field)) 'ptr) + (member (cadr (cadr field)) (mapcar (lambda (x) (sertype-name-get x)) *all-sertype-defs*))) + (format "%ssize += serializeio_count_%s_obj (%s) + sizeof (void*);\n" prefix (downcase-string (cadr (cadr field))) name) + ) + ((equal (car (cadr field)) 'bytes) + (error "can't do that: bytes2") + ) + ((equal (car (cadr field)) 'array) + (error "can't do that: array") + ) + (t (error "unrecognized field type: %s" (cadr field))))) + +(defun entry-print-field (entry field name prefix is-param) + (concat + (format "%sprint_spaces (indent_spaces);\n" prefix) + (if is-param (format "%sg_print (\"%s = \");\n" prefix (car field)) "") + (cond ((equal (cadr field) 'uint) + (format "%sg_print (\"%%d\\n\", %s);\n" prefix name)) + ((equal (cadr field) 'uint32) + (format "%sg_print (\"%%d\\n\", %s);\n" prefix name)) + ((equal (cadr field) 'uint16) + (format "%sg_print (\"%%d\\n\", %s);\n" prefix name)) + ((equal (cadr field) 'uint8) + (format "%sg_print (\"%%d\\n\", %s);\n" prefix name)) + ((equal (cadr field) 'boolean) + (format "%sg_print (\"%%s\\n\", %s ? \"true\" : \"false\");\n" prefix name)) + ((equal (cadr field) 'string) + (format "%sg_print (\"%%s\\n\", %s);\n" prefix name)) + ((equal (cadr field) 'bytes) + (format "%sserializeio_print_bytes (%s, %s_len);\n" prefix name name)) + ((equal (cadr field) 'object) + (concat + (if is-param (format "%sg_print (\"{\\n\");\n" prefix) "") + (format "%sserializeio_generic_print (%s_type, %s, indent_spaces + 2);\n" prefix name name) + (format "%sprint_spaces (indent_spaces);\n;\n" prefix) + (if is-param (format "%sg_print (\"}\\n\");\n" prefix) "") + ) + ) + ((member (cadr field) (mapcar (lambda (x) (sertype-name-get x)) *all-sertype-defs*)) + (concat + (if is-param (format "%sg_print (\"{\\n\");\n" prefix) "") + (format "%sserializeio_print_%s_obj (& %s, indent_spaces + 2);\n" prefix (downcase-string (cadr field)) name name) + (format "%sprint_spaces (indent_spaces);\n;\n" prefix) + (if is-param (format "%sg_print (\"}\\n\");\n" prefix) "") + ) + ) + ((and (equal (car (cadr field)) 'ptr) + (member (cadr (cadr field)) (mapcar (lambda (x) (sertype-name-get x)) *all-sertype-defs*))) + (concat + (if is-param (format "%sg_print (\"{\\n\");\n" prefix) "") + (format "%sserializeio_print_%s_obj (%s, indent_spaces + 2);\n" + prefix (downcase-string (cadr (cadr field))) name name) + (format "%sprint_spaces (indent_spaces);\n;\n" prefix) + (if is-param (format "%sg_print (\"}\\n\");\n" prefix) "") + ) + ) + ((equal (car (cadr field)) 'bytes) + (format "%sserializeio_print_bytes (%s, %d);\n" prefix name (cadr (cadr field)))) + ((equal (car (cadr field)) 'array) + (concat + (if is-param (format "%sg_print (\"{\\n\");\n" prefix) "") + (format "%s{ +%s gint i; +%s for (i = 0; i < %s_len; i += 1) +%s { +%s print_spaces (indent_spaces); +%s g_print (\"%%d:\n\", i); +%s%s } +%s} +" + prefix prefix prefix + name + prefix + prefix + prefix + prefix + (entry-print-field entry (cadr field) (array-index name (cadr field)) (concat prefix " ") nil) + prefix + ) + (if is-param (format "%sg_print (\"}\\n\");\n" prefix) ""))) + (t (error "unrecognized field type: %s" (cadr field))))) + ) + +(defconst *event-id* 0) + +(defconst *event-types* nil) + +(defun generate-events () + (let ((events *event-defs*)) + (while events + + (let* ((event (car events)) + (uargs (event-uargs-get event)) + (sargs (event-sargs-get event)) + (type-prefix (intern (apply (function concat) + (append (mapcar (function (lambda (x) (capitalize1 (cadr x)))) uargs) + (mapcar (function (lambda (x) (capitalize1 x))) sargs))))) + (capprefix (capitalize1 *output-prefix*))) + + (if (and (not uargs) (not sargs)) + (setq type-prefix "Void")) + + (when (not (member type-prefix *event-types*)) + (setq *event-types* (cons type-prefix *event-types*)) + + (output-header-file "_edsio") + + (save-excursion + (goto-char *header-typedef-marker*) + + (insert (format "/* %s%sEventCode.\n */\n\n" capprefix type-prefix)) + + (insert (format "typedef struct _%s%sEventCode %s%sEventCode;\n" capprefix type-prefix capprefix type-prefix)) + (insert (format "struct _%s%sEventCode { gint code; };\n\n" capprefix type-prefix)) + + (insert (format "typedef struct _%s%sEvent %s%sEvent;\n" capprefix type-prefix capprefix type-prefix)) + (insert (format "struct _%s%sEvent { gint code; const char* srcfile; guint srcline;%s%s };\n\n" capprefix type-prefix (event-struct-entries event) (event-struct-sys-entries event))) + ) + + (insert (format "void %s_generate_%s_event_internal (%s%sEventCode code, const char* srcfile, gint srcline%s);\n" + *output-prefix* + (downcase-string type-prefix) + capprefix + type-prefix + (event-uargs-plist uargs t) + )) + (insert (format "#define %s_generate_%s_event(ecode%s) %s_generate_%s_event_internal((ecode),__FILE__,__LINE__%s)\n\n" + *output-prefix* + (downcase-string type-prefix) + (event-uargs-alist uargs t) + *output-prefix* + (downcase-string type-prefix) + (event-uargs-mlist uargs t))) + + (output-source-file "_edsio") + + (insert (format "void\n%s_generate_%s_event_internal (%s%sEventCode _code, const char* _srcfile, gint _srcline%s)\n" + *output-prefix* + (downcase-string type-prefix) + capprefix + type-prefix + (event-uargs-plist uargs t) + )) + (insert (format "{\n")) + (insert (format " %s%sEvent *_e = g_new0 (%s%sEvent, 1);\n" capprefix type-prefix capprefix type-prefix)) + (insert (format " _e->code = _code.code;\n _e->srcline = _srcline;\n _e->srcfile = _srcfile;\n")) + (insert (event-uargs-copy "_e" event)) + (insert (event-sargs-copy "_e" event)) + (insert (format " eventdelivery_event_deliver ((GenericEvent*) _e);\n")) + (insert (format "}\n\n")) + + ;; Field to string def + + (unless (equal type-prefix "Void") + (save-excursion + (goto-char *source-top-marker*) + (insert (format "static const char* %s_%s_event_field_to_string (GenericEvent* ev, gint field);\n" capprefix type-prefix)) + ) + + (insert (format "const char*\n%s_%s_event_field_to_string (GenericEvent* ev, gint field)\n" + capprefix type-prefix)) + (insert (format "{\n")) + + (unless (equal type-prefix (intern "Ssl")) + (insert (format " %s%sEvent* it = (%s%sEvent*) ev;\n" capprefix type-prefix capprefix type-prefix))) + (insert (format " switch (field)\n")) + (insert (format " {\n")) + + (let ((uargs (event-uargs-get event)) + (i 0)) + (while uargs + (let ((uarg (car uargs))) + (insert (format " case %d: return eventdelivery_%s_to_string (it->%s);\n" i (cadr uarg) (car uarg))) + ) + (setq i (+ i 1)) + (setq uargs (cdr uargs)) + ) + ) + + (if (< 1 (length (event-sargs-get event))) + (error "unhandled case, too many sargs")) + + (when (event-sargs-get event) + (let ((sarg (car (event-sargs-get event)))) + (insert (format " case %d: " (length (event-uargs-get event)))) + + (if (not (member sarg '(ssl errno))) + (error "what type of sarg is %s" sarg)) + + (if (eq sarg 'errno) + (insert (format "return g_strdup (g_strerror (it->ev_errno));\n"))) + + (if (eq sarg 'ssl) + (insert (format "return eventdelivery_ssl_errors_to_string ();\n"))) + ) + ) + + (insert (format " default: abort ();\n")) + (insert (format " }\n")) + + (insert (format "}\n\n")) + ) + ) + + (output-header-file "_edsio") + + (insert (format "extern const %s%sEventCode EC_%s%s;\n" + capprefix + type-prefix + capprefix + (event-name-get event))) + + (insert (format "#define EC_%s%sValue ((%d<%s = %s;\n" name (car x) (car x)))) + (event-uargs-get event))) + ) + +(defun event-sargs-copy (name event) + (if (member 'errno (event-sargs-get event)) + (format " %s->ev_errno = errno;\n" name) + "") + ) + +(defun event-type-to-ctype (etype) + (let ((it (obj-name-eq etype *all-etype-defs*))) + (if (not it) + (message "no ctype for %s" etype)) + (etype-ctype-get it) + ) + ) + +(defun event-uargs-plist(uargs need_first) + (concat + (if (and need_first uargs) ", " "") + (format-comlist (function (lambda (x) (format "%s %s" (event-type-to-ctype (cadr x)) (car x)))) uargs)) + ) + +(defun event-uargs-alist(uargs need_first) + (concat + (if (and need_first uargs) ", " "") + (format-comlist (function (lambda (x) (format "%s" (car x)))) uargs)) + ) + +(defun event-uargs-mlist(uargs need_first) + (concat + (if (and need_first uargs) ", " "") + (format-comlist (function (lambda (x) (format "(%s)" (car x)))) uargs)) + ) + +(defun fixup-oneline (event oneline) + (let ((work (get-buffer-create "*string-tmp2*"))) + (save-excursion + (set-buffer work) + (erase-buffer) + (insert oneline) + (beginning-of-buffer) + + (while (re-search-forward "${\\(\\w+\\)}" nil t) + + (let* ((it (intern (downcase-string (match-string 1)))) + (uargs (event-uargs-get event)) + (i 0) + (repl nil)) + + (while uargs + + (if (eq (car (car uargs)) it) + (setq repl (format "${%d}" i))) + + (setq uargs (cdr uargs)) + (setq i (+ i 1)) + ) + + (when (eq it 'strerror) + (if repl + (error "No wildcards named STRERROR")) + (setq repl (format "${%d}" i)) + ) + + (when (eq it 'ssl) + (if repl + (error "No wildcards named SSL")) + (setq repl (format "${%d}" i)) + ) + + (if (not repl) + (error "Illegal wildcard %s in %s" it oneline)) + + (replace-match repl nil nil) + ) + ) + + (buffer-string) + ) + ) + ) + +;; Properties + +(defun generate-properties () + (let ((cap-prefix (capitalize1 *output-prefix*)) + (unique-types nil)) + (output-header-file "_edsio") + + (insert (format "/* Property definitions */\n\n")) + + ;; Types + + (output-source-file "_edsio") + + (mapcar + (function + (lambda (pht) + (let ((type (prophosttype-type-get pht))) + (unless (member type unique-types) + (setq unique-types (cons type unique-types)) + + (save-excursion + (goto-char *source-init-marker*) + + ;(message "%s -> %s %s" type (type-free-func type) (member type (mapcar (lambda (x) (sertype-name-get x)) *all-sertype-defs*))) + + (insert (format " edsio_initialize_property_type (\"%s\", %s, %s, %s, %s, %s);\n" + type + (type-free-func type) + (type-gs-func type "getter") + (type-gs-func type "setter") + (type-serialize-func type) + (type-unserialize-func type))) + ) + ) + ) + ) + ) + *prophosttype-defs* + ) + + ;; Host reg + + (mapcar + (function + (lambda (prophost) + (save-excursion + (goto-char *source-init-marker*) + (insert (format " edsio_initialize_host_type (\"%s\", %s, %s, %s, %s, %s);\n" + (prophost-name-get prophost) + (format "(PropertyTableFunc) & edsio_%s_property_table" + (downcase-string (prophost-name-get prophost))) + (prophost-persist prophost "source") + (prophost-persist prophost "sink") + (prophost-persist prophost "isset") + (prophost-persist prophost "unset") + )) + ) + ) + ) + *prophost-defs*) + + ;; Compute each distinct (host type) x (prop type) + + (mapcar + (function + (lambda (prophost) + + (mapcar + (function + (lambda (prophosttype) + + (when (equal (prophosttype-host-get prophosttype) (prophost-name-get prophost)) + + (when (not (member (prophosttype-type-get prophosttype) (prophost-proptypes-get prophost))) + (prophost-proptypes-set prophost (cons (prophosttype-type-get prophosttype) (prophost-proptypes-get prophost))) + ) + ))) + *prophosttype-defs* + ) + + ;; Output the get/set functions for each property type + + (mapcar + (function + (lambda (type) + + (let ((it (property-code-typename type prophost))) + + ;; Header + + (output-header-file "_edsio") + + (insert (format "/* Property get/set for %s/%s\n */\n\n" (prophost-name-get prophost) type)) + + (insert (format "typedef struct _%s %s;\n" it it)) + + (insert (format "struct _%s { guint32 code; };\n\n" it)) + + (insert (format "gboolean edsio_new_%s_%s_property (const char* name, guint32 flags, %s* prop);\n" + (downcase-string (prophost-name-get prophost)) + (type-canon-name type) + it + )) + + (insert (format "gboolean %s_get_%s (%s obj, %s prop%s);\n" + (downcase-string (prophost-name-get prophost)) + (type-canon-name type) + (prophost-ctype-get prophost) + it + (prop-type-to-get-fps type))) + + (insert (format "gboolean %s_set_%s (%s obj, %s prop%s);\n" + (downcase-string (prophost-name-get prophost)) + (type-canon-name type) + (prophost-ctype-get prophost) + it + (prop-type-to-set-fps type))) + + (insert (format "gboolean %s_unset_%s (%s obj, %s prop);\n" + (downcase-string (prophost-name-get prophost)) + (type-canon-name type) + (prophost-ctype-get prophost) + it)) + + (insert (format "gboolean %s_isset_%s (%s obj, %s prop);\n\n" + (downcase-string (prophost-name-get prophost)) + (type-canon-name type) + (prophost-ctype-get prophost) + it)) + + ;; Source + + (output-source-file "_edsio") + + (insert (format "gboolean edsio_new_%s_%s_property (const char* name, guint32 flags, %s* prop)\n{\n" + (downcase-string (prophost-name-get prophost)) + (type-canon-name type) + it + )) + (insert (format " return edsio_new_property (name, \"%s\", \"%s\", flags, (EdsioGenericProperty*) prop);\n" (prophost-name-get prophost) type)) + (insert (format "}\n\n")) + + (insert (format "gboolean\n%s_get_%s (%s obj, %s prop%s)\n{\n" + (downcase-string (prophost-name-get prophost)) + (type-canon-name type) + (prophost-ctype-get prophost) + it + (prop-type-to-get-fps type))) + (insert (format " EdsioProperty* ep;\n")) + (insert (format " g_return_val_if_fail (obj, FALSE);\n")) + (insert (format " return (* edsio_property_getter (\"%s\", \"%s\", prop.code, & ep)) (obj, ep%s);\n" + (prophost-name-get prophost) + type + (prop-type-to-args type) + )) + + (insert (format "}\n\n")) + + (insert (format "gboolean\n%s_set_%s (%s obj, %s prop%s)\n{\n" + (downcase-string (prophost-name-get prophost)) + (type-canon-name type) + (prophost-ctype-get prophost) + it + (prop-type-to-set-fps type))) + (insert (format " EdsioProperty* ep;\n")) + (insert (format " g_return_val_if_fail (obj, FALSE);\n")) + (insert (format " return (* edsio_property_setter (\"%s\", \"%s\", prop.code, & ep)) (obj, ep%s);\n" + (prophost-name-get prophost) + type + (prop-type-to-args type) + )) + + (insert (format "}\n\n")) + + (insert (format "gboolean\n%s_unset_%s (%s obj, %s prop)\n{\n" + (downcase-string (prophost-name-get prophost)) + (type-canon-name type) + (prophost-ctype-get prophost) + it)) + (insert (format " g_return_val_if_fail (obj, FALSE);\n")) + (insert (format " return edsio_property_unset (\"%s\", \"%s\", prop.code, obj);\n" + (prophost-name-get prophost) + type + "" + )) + + (insert (format "}\n\n")) + + (insert (format "gboolean\n%s_isset_%s (%s obj, %s prop)\n{\n" + (downcase-string (prophost-name-get prophost)) + (type-canon-name type) + (prophost-ctype-get prophost) + it)) + (insert (format " g_return_val_if_fail (obj, FALSE);\n")) + (insert (format " return edsio_property_isset (\"%s\", \"%s\", prop.code, obj);\n" + (prophost-name-get prophost) + type + )) + + (insert (format "}\n\n")) + + ) + ) + ) + (prophost-proptypes-get prophost) + ) + ) + ) + *all-prophost-defs* + ) + ) + ) + +(defun property-code-typename(type prophost) + (format "%s%s%sProperty" + (capitalize1 *output-prefix*) + (prophost-name-get prophost) + (capitalize1 type)) + ) + +(defun prop-typename-ctypes (type) + (cond ((equal type 'string) + (list (list 'arg "const gchar*"))) + ((equal type 'uint) + (list (list 'arg "guint32"))) + ((equal type 'uint32) + (list (list 'arg "guint32"))) + ((equal type 'uint16) + (list (list 'arg "guint16"))) + ((equal type 'uint8) + (list (list 'arg "guint8"))) + ((equal type 'boolean) + (list (list 'arg "gboolean"))) + ((equal type 'bytes) + (list (list 'arg "const guint8*") (list 'arg_len "guint32"))) + ((equal type 'object) + (list (list 'arg "void*") (list 'arg_type "guint32"))) + ((member type (mapcar (lambda (x) (sertype-name-get x)) *all-sertype-defs*)) + (list (list 'arg (format "Serial%s*" type)))) + ((equal (car type) 'bytes) + (list (list 'arg "const guint8*"))) + ((equal (car type) 'array) + (list (list 'arg (format "%s*" (cadr (car (prop-typename-ctypes (cadr type)))))) + (list 'arg_len "guint32"))) + ((equal (car type) 'ptr) + (list (list 'arg (format "%s*" (cadr (car (prop-typename-ctypes (cadr type)))))))) + (t (error "unrecognized field type: %s" type))) + ) + +(defun prop-type-to-get-fps (type) + (concat ", " + (format-comlist + (function + (lambda (pair) + (format "%s* %s" (cadr pair) (car pair)) + ) + ) + (prop-typename-ctypes type)) + ) + ) + +(defun prop-type-to-set-fps (type) + (concat ", " + (format-comlist + (function + (lambda (pair) + (format "%s %s" (cadr pair) (car pair)) + ) + ) + (prop-typename-ctypes type)) + ) + ) + +(defun prop-type-to-args (type) + (concat ", " + (format-comlist + (function + (lambda (pair) + (format "%s" (car pair)) + ) + ) + (prop-typename-ctypes type)) + ) + ) + +(defun type-canon-name (type) + ; @@@ does not work for (array ...), etc + (downcase-string type)) + +(defun type-serialize-func (type) + (format "serialize_%s_obj" (downcase-string type)) + ) + +(defun type-unserialize-func (type) + (format "unserialize_%s" (downcase-string type)) + ) + +(defun type-gs-func (type name) + (if (member type (mapcar (lambda (x) (sertype-name-get x)) *all-sertype-defs*)) + (format "& edsio_property_vptr_%s" name) + (format "& edsio_property_%s_%s" type name))) + +(defun type-free-func (type) + (if (member type (mapcar (lambda (x) (sertype-name-get x)) *all-sertype-defs*)) + (format "& edsio_property_vptr_free") + (format "& edsio_property_%s_free" type))) + +(defun prophost-persist (prophost func) + (if (prophost-persist-get prophost) + (format "(Persist%sFunc) & %s_persist_%s_%s" + (capitalize1 func) + *output-prefix* + (downcase-string (prophost-name-get prophost)) + func) + "NULL")) diff --git a/xdelta-1.1.3/libedsio/edsio.h b/xdelta-1.1.3/libedsio/edsio.h new file mode 100644 index 0000000..48afa3b --- /dev/null +++ b/xdelta-1.1.3/libedsio/edsio.h @@ -0,0 +1,530 @@ +/* -*-Mode: C;-*- + * $Id: edsio.h,v 1.1 2004/01/05 18:54:23 icculus Exp $ + * + * Copyright (C) 1998, 1999, Josh MacDonald. + * All Rights Reserved. + * + * Author: Josh MacDonald + */ + +#ifndef _EDSIO_H_ +#define _EDSIO_H_ + +#ifdef __cplusplus +extern "C" { +#endif + +#ifdef HAVE_CONFIG_H +#include +#endif + +#include +#include +#include + +typedef struct _SerialSource SerialSource; +typedef struct _SerialSink SerialSink; +typedef gint32 SerialType; +typedef struct _HandleFuncTable HandleFuncTable; +typedef struct _PropTest PropTest; +typedef struct _FileHandle FileHandle; + +struct _FileHandle { + const HandleFuncTable* table; + + /* This is an opaque type, feel free to define your own, just make + * sure that the first field of yours is one of these, and that you + * supply a table. */ +}; + +#define EDSIO_LIBRARY_OFFSET_BITS 8 +#define EDSIO_LIBRARY_OFFSET_MASK 0xff + +#include "edsio_edsio.h" + +#define ST_Error -1 +#define ST_IncorrectType -2 +#define ST_NotFound -3 + +#define ALIGN_8(v) if (((v) % 8) != 0) { (v) += 8; (v) &= ~7; } + +/* This serves as a virtual table for I/O to the FileHandle */ + +struct _HandleFuncTable +{ + gssize (* table_handle_length) (FileHandle *fh); + gssize (* table_handle_pages) (FileHandle *fh); + gssize (* table_handle_pagesize) (FileHandle *fh); + gssize (* table_handle_map_page) (FileHandle *fh, guint pgno, const guint8** mem); + gboolean (* table_handle_unmap_page) (FileHandle *fh, guint pgno, const guint8** mem); + const guint8* (* table_handle_checksum_md5) (FileHandle *fh); + gboolean (* table_handle_close) (FileHandle *fh, gint flags); + gboolean (* table_handle_write) (FileHandle *fh, const guint8 *buf, gsize nbyte); + gboolean (* table_handle_copy) (FileHandle *from, FileHandle *to, guint off, guint len); + gboolean (* table_handle_getui) (FileHandle *fh, guint32* i); + gboolean (* table_handle_putui) (FileHandle *fh, guint32 i); + gssize (* table_handle_read) (FileHandle *fh, guint8 *buf, gsize nbyte); + const gchar* (* table_handle_name) (FileHandle *fh); /* user must free */ +}; + +struct _SerialSource { + /* Internal variables: don't touch. */ + guint32 alloc_total; + guint32 alloc_pos; + void *alloc_buf; + void *alloc_buf_orig; + + /* These are setup by init. + */ + SerialType (* source_type) (SerialSource* source, gboolean set_allocation); + gboolean (* source_close) (SerialSource* source); + gboolean (* source_read) (SerialSource* source, guint8 *ptr, guint32 len); + void (* source_free) (SerialSource* source); + + /* These may be NULL + */ + void* (* salloc_func) (SerialSource* source, + guint32 len); + void (* sfree_func) (SerialSource* source, + void* ptr); + + /* Public functions, defaulted, but may be over-ridden + * before calls to unserialize. + */ + gboolean (* next_bytes_known) (SerialSource* source, guint8 *ptr, guint32 len); + gboolean (* next_bytes) (SerialSource* source, const guint8 **ptr, guint32 *len); + gboolean (* next_uint) (SerialSource* source, guint32 *ptr); + gboolean (* next_uint32) (SerialSource* source, guint32 *ptr); + gboolean (* next_uint16) (SerialSource* source, guint16 *ptr); + gboolean (* next_uint8) (SerialSource* source, guint8 *ptr); + gboolean (* next_bool) (SerialSource* source, gboolean *ptr); + gboolean (* next_string) (SerialSource* source, const char **ptr); +}; + +struct _SerialSink { + + /* These are setup by init. + */ + gboolean (* sink_type) (SerialSink* sink, SerialType type, guint mem_size, gboolean set_allocation); + gboolean (* sink_close) (SerialSink* sink); + gboolean (* sink_write) (SerialSink* sink, const guint8 *ptr, guint32 len); + void (* sink_free) (SerialSink* sink); + + /* This may be null, called after each object is serialized. */ + gboolean (* sink_quantum) (SerialSink* sink); + + /* Public functions, defaulted, but may be over-ridden + * before calls to serialize. + */ + gboolean (* next_bytes_known) (SerialSink* sink, const guint8 *ptr, guint32 len); + gboolean (* next_bytes) (SerialSink* sink, const guint8 *ptr, guint32 len); + gboolean (* next_uint) (SerialSink* sink, guint32 ptr); + gboolean (* next_uint32) (SerialSink* sink, guint32 ptr); + gboolean (* next_uint16) (SerialSink* sink, guint16 ptr); + gboolean (* next_uint8) (SerialSink* sink, guint8 ptr); + gboolean (* next_bool) (SerialSink* sink, gboolean ptr); + gboolean (* next_string) (SerialSink* sink, const char *ptr); +}; + +void serializeio_initialize_type (const char* name, + guint32 val, + gboolean (*unserialize_func) (), + gboolean (*serialize_func) (), + guint (*count_func) (), + void (*print_func) ()); + +const char* serializeio_generic_type_to_string (SerialType type); +void serializeio_generic_print (SerialType type, void* object, guint indent_spaces); + +gboolean serializeio_serialize_generic (SerialSink *sink, + SerialType object_type, + void *object); + +gboolean serializeio_serialize_generic_internal (SerialSink *sink, + SerialType object_type, + void *object, + gboolean set_allocation); + +guint serializeio_generic_count (SerialType object_type, + void *object); + +gboolean serializeio_unserialize_generic (SerialSource *source, + SerialType *object_type, + void **object); + +gboolean serializeio_unserialize_generic_internal (SerialSource *source, + SerialType *object_type, + void **object, + gboolean set_allocation); + +gboolean serializeio_unserialize_generic_acceptable (SerialSource* source, + guint32 acceptable, + SerialType *object_type, + void **object); + +void serializeio_sink_init (SerialSink* sink, + gboolean (* sink_type) (SerialSink* sink, + SerialType type, + guint mem_size, + gboolean set_allocation), + gboolean (* sink_close) (SerialSink* sink), + gboolean (* sink_write) (SerialSink* sink, + const guint8 *ptr, + guint32 len), + void (* sink_free) (SerialSink* sink), + gboolean (* sink_quantum) (SerialSink* sink)); + +void serializeio_source_init (SerialSource* source, + SerialType (* source_type) (SerialSource* source, + gboolean set_allocation), + gboolean (* source_close) (SerialSource* source), + gboolean (* source_read) (SerialSource* source, + guint8 *ptr, + guint32 len), + void (* source_free) (SerialSource* source), + void* (* salloc_func) (SerialSource* source, + guint32 len), + void (* sfree_func) (SerialSource* source, + void* ptr)); + +/* These two functions are internal, don't use. */ +gboolean serializeio_source_object_received (SerialSource* source); +void* serializeio_source_alloc (SerialSource* source, + guint32 len); + +SerialSink* serializeio_gzip_sink (SerialSink* sink); +SerialSource* serializeio_gzip_source (SerialSource* source); + +SerialSink* serializeio_checksum_sink (SerialSink* sink); +SerialSource* serializeio_checksum_source (SerialSource* source); + +SerialSink* serializeio_base64_sink (SerialSink* sink); +SerialSource* serializeio_base64_source (SerialSource* source); + +SerialSource* handle_source (FileHandle *fh); +SerialSink* handle_sink (FileHandle *fh, + gpointer data1, + gpointer data2, + gpointer data3, + gboolean (* cont_onclose) (gpointer data1, gpointer data2, gpointer data3)); + +gboolean unserialize_uint (SerialSource *source, guint32** x); +gboolean serialize_uint_obj (SerialSink *sink, guint32* x); + +gboolean unserialize_string (SerialSource *source, const char** x); +gboolean serialize_string_obj (SerialSink *sink, const char* x); + +/* These are a bit odd, and edsio_property_bytes_{g,s}etter account for it. + * Try not to use yourself. */ +gboolean unserialize_bytes (SerialSource *source, SerialEdsioBytes** x); +gboolean serialize_bytes_obj (SerialSink *sink, SerialEdsioBytes *x); + +/* Event delivery + */ + +enum _EventLevel +{ + EL_Information = 1<<0, + EL_Warning = 1<<5, + EL_Error = 1<<10, + EL_InternalError = 1<<15, + EL_FatalError = 1<<20 +}; + +typedef enum _EventLevel EventLevel; + +enum _EventFlags +{ + EF_None = 1<<0, + EF_OpenSSL = 1<<1 +}; + +typedef enum _EventFlags EventFlags; + +const char* eventdelivery_int_to_string (int x); +const char* eventdelivery_string_to_string (const char* x); +const char* eventdelivery_source_to_string (SerialSource* x); +const char* eventdelivery_sink_to_string (SerialSink* x); +const char* eventdelivery_handle_to_string (FileHandle* x); + +void serializeio_print_bytes (const guint8* buf, guint len); + +/* Event delivery privates + */ + +typedef struct _GenericEventDef GenericEventDef; +typedef struct _GenericEvent GenericEvent; + +struct _GenericEvent +{ + gint code; + const char* srcfile; + guint srcline; +}; + +GenericEventDef* eventdelivery_event_lookup (gint code); + +void eventdelivery_event_deliver (GenericEvent* e); + +typedef gboolean (* ErrorDeliveryFunc) (GenericEvent* ev, GenericEventDef* def, const char* message); + +void eventdelivery_event_watch_all (ErrorDeliveryFunc func); + +void eventdelivery_initialize_event_def (gint code, + gint level, + gint flags, + const char* name, + const char* oneline, + const char * (* field_to_string) (GenericEvent* ev, gint field)); + +const char* eventdelivery_ssl_errors_to_string (void); + +struct _GenericEventDef +{ + gint code; + gint level; + gint flags; + const char *name; + const char *oneline; + + const char * (* field_to_string) (GenericEvent* ev, gint field); +}; + +/* MD5.H - header file for MD5C.C */ + +/* Copyright (C) 1991-2, RSA Data Security, Inc. Created 1991. All + rights reserved. + + License to copy and use this software is granted provided that it + is identified as the "RSA Data Security, Inc. MD5 Message-Digest + Algorithm" in all material mentioning or referencing this software + or this function. + + License is also granted to make and use derivative works provided + that such works are identified as "derived from the RSA Data + Security, Inc. MD5 Message-Digest Algorithm" in all material + mentioning or referencing the derived work. + + RSA Data Security, Inc. makes no representations concerning either + the merchantability of this software or the suitability of this + software for any particular purpose. It is provided "as is" + without express or implied warranty of any kind. + + These notices must be retained in any copies of any part of this + documentation and/or software. + */ + +/* MD5 context. */ +typedef struct { + guint32 state[4]; /* state (ABCD) */ + guint32 count[2]; /* number of bits, modulo 2^64 (lsb first) */ + guint8 buffer[64]; /* input buffer */ +} EdsioMD5Ctx; + +void edsio_md5_init (EdsioMD5Ctx *); +void edsio_md5_update (EdsioMD5Ctx *, const guint8 *, guint); +void edsio_md5_final (guint8*, EdsioMD5Ctx *); + +gint edsio_md5_equal (gconstpointer v, + gconstpointer v2); +guint edsio_md5_hash (gconstpointer v); + +void edsio_md5_to_string (const guint8* md5, char buf[33]); +gboolean edsio_md5_from_string (guint8* md5, const char buf[33]); + +/* NIST Secure Hash Algorithm */ +/* heavily modified from Peter C. Gutmann's implementation */ +/* then taken from from Uwe Hollerbach, */ +/* and then modified a little by Josh MacDonald. */ + +/* This code is in the public domain */ + +typedef struct { + guint32 digest[5]; /* message digest */ + guint32 count_lo, count_hi; /* 64-bit bit count */ + guint32 data[16]; /* SHA data buffer */ + int local; /* unprocessed amount in data */ +} EdsioSHACtx; + +void edsio_sha_init (EdsioSHACtx *); +void edsio_sha_update (EdsioSHACtx *, const guint8 *, guint); +void edsio_sha_final (guint8 *, EdsioSHACtx *); + +gint edsio_sha_equal (gconstpointer v, + gconstpointer v2); +guint edsio_sha_hash (gconstpointer v); + +/* Misc stuff. + */ + +/* These raise an error if errmsg is non-null. The errmsg should + * be something like "Invalid port number". See edsio.ser for the + * format. + */ +gboolean strtosi_checked (const char* str, gint32* i, const char* errmsg); +gboolean strtoss_checked (const char* str, gint16* s, const char* errmsg); + +gboolean strtoui_checked (const char* str, guint32* i, const char* errmsg); +gboolean strtous_checked (const char* str, guint16* i, const char* errmsg); + +const char* edsio_intern_string (const char* str); + +GByteArray* edsio_base64_encode_region (const guint8* data, guint data_len); +GByteArray* edsio_base64_decode_region (const guint8* data, guint data_len); +gboolean edsio_base64_encode_region_into (const guint8* data, guint data_len, guint8* out, guint *out_len); +gboolean edsio_base64_decode_region_into (const guint8* data, guint data_len, guint8* out, guint *out_len); + +gchar* edsio_time_to_iso8601 (SerialGenericTime* time); +gchar* edsio_time_t_to_iso8601 (GTime time); +gboolean edsio_time_of_day (SerialGenericTime* time); + +enum _SimpleBufferFlags { + SBF_None = 0, + SBF_Compress = 1 << 0, + SBF_Checksum = 1 << 1, + SBF_Base64 = 1 << 2 +}; + +typedef enum _SimpleBufferFlags SimpleBufferFlags; + +SerialSource* edsio_simple_source (const guint8* data, guint len, guint flags); +SerialSink* edsio_simple_sink (gpointer data, + guint flags, + gboolean free_result, + void (* success) (gpointer data, GByteArray* result), + GByteArray **result); + +gboolean edsio_library_check (guint32 number); +void edsio_library_register (guint32 number, const char*name); + +/* (Persistent) Property stuff. + */ + +enum _PropertyFlags { + PF_None = 0, + PF_Persistent = 1 +}; + +typedef enum _PropertyFlags PropertyFlags; + +typedef struct _EdsioProperty EdsioProperty; +typedef union _EdsioPropertyEntry EdsioPropertyEntry; +typedef struct _EdsioGenericProperty EdsioGenericProperty; + +typedef void (* PropFreeFunc) (gpointer obj); +typedef gboolean (* PropGSFunc) (/*gpointer obj, GHashTable** obj_table, EdsioProperty* prop, ... */); +typedef gboolean (* PropSerialize) (/*SerialSink* sink, ... */); +typedef gboolean (* PropUnserialize) (/*SerialSource* source, ... */); + +typedef GHashTable** (* PropertyTableFunc) (gpointer obj); +typedef SerialSource* (* PersistSourceFunc) (gpointer obj, const char* prop_name); +typedef SerialSink* (* PersistSinkFunc) (gpointer obj, const char* prop_name); +typedef gboolean (* PersistIssetFunc) (gpointer obj, const char* prop_name); +typedef gboolean (* PersistUnsetFunc) (gpointer obj, const char* prop_name); + +void edsio_initialize_property_type (const char* t, PropFreeFunc freer, PropGSFunc getter, PropGSFunc setter, PropSerialize ser, PropUnserialize unser); +void edsio_initialize_host_type (const char* ph, + PropertyTableFunc ptable, + PersistSourceFunc source, + PersistSinkFunc sink, + PersistIssetFunc isset, + PersistUnsetFunc unset); + +gboolean edsio_property_isset (const char* ph, const char* t, guint32 code, gpointer obj); +gboolean edsio_property_unset (const char* ph, const char* t, guint32 code, gpointer obj); + +PropGSFunc edsio_property_getter (const char* ph, const char* t, guint32 code, EdsioProperty** prop); +PropGSFunc edsio_property_setter (const char* ph, const char* t, guint32 code, EdsioProperty** prop); + +void edsio_property_uint_free (gpointer obj); +gboolean edsio_property_uint_getter (gpointer obj, EdsioProperty* ep, guint32* get); +gboolean edsio_property_uint_setter (gpointer obj, EdsioProperty* ep, guint32 set); + +void edsio_property_string_free (gpointer obj); +gboolean edsio_property_string_getter (gpointer obj, EdsioProperty* ep, const char** get); +gboolean edsio_property_string_setter (gpointer obj, EdsioProperty* ep, const char* set); + +void edsio_property_bytes_free (gpointer obj); +gboolean edsio_property_bytes_getter (gpointer obj, EdsioProperty* ep, guint8** get, guint32 *get_len); +gboolean edsio_property_bytes_setter (gpointer obj, EdsioProperty* ep, guint8* set, guint32 set_len); + +void edsio_property_vptr_free (gpointer obj); +gboolean edsio_property_vptr_getter (gpointer obj, EdsioProperty* ep, void** get); +gboolean edsio_property_vptr_setter (gpointer obj, EdsioProperty* ep, void* set); + +EdsioPropertyEntry* edsio_property_get (gpointer obj, EdsioProperty* ep); +gboolean edsio_property_set (gpointer obj, EdsioProperty* ep, EdsioPropertyEntry* set); + +gboolean edsio_new_property (const char* name, const char* ph, const char* t, guint32 flags, EdsioGenericProperty* prop); + +/* Testing... + */ + +#define DEBUG_LIBEDSIO + +#ifdef DEBUG_LIBEDSIO +struct _PropTest +{ + GHashTable* _edsio_property_table; + + GHashTable* ptable; + + const char* kludge; +}; + +GHashTable** edsio_proptest_property_table (PropTest *pt); +SerialSource* edsio_persist_proptest_source (PropTest *pt, const char* prop_name); +SerialSink* edsio_persist_proptest_sink (PropTest *pt, const char* prop_name); +gboolean edsio_persist_proptest_isset (PropTest *pt, const char* prop_name); +gboolean edsio_persist_proptest_unset (PropTest *pt, const char* prop_name); + +#endif + +/* Missing glib stuff + */ + +typedef struct _GQueue GQueue; + +struct _GQueue +{ + GList *list; + GList *list_end; + guint list_size; +}; + +/* Queues + */ + +GQueue * g_queue_new (void); +void g_queue_free (GQueue *q); +guint g_queue_get_size (GQueue *q); +void g_queue_push_front (GQueue *q, gpointer data); +void g_queue_push_back (GQueue *q, gpointer data); +gpointer g_queue_pop_front (GQueue *q); +gpointer g_queue_pop_back (GQueue *q); + +#define g_queue_empty(queue) \ + ((((GQueue *)(queue)) && ((GQueue *)(queue))->list) ? FALSE : TRUE) + +#define g_queue_peek_front(queue) \ + ((((GQueue *)(queue)) && ((GQueue *)(queue))->list) ? \ + ((GQueue *)(queue))->list->data : NULL) + +#define g_queue_peek_back(queue) \ + ((((GQueue *)(queue)) && ((GQueue *)(queue))->list_end) ? \ + ((GQueue *)(queue))->list_end->data : NULL) + +#define g_queue_index(queue,ptr) \ + ((((GQueue *)(queue)) && ((GQueue *)(queue))->list) ? \ + g_list_index (((GQueue *)(queue))->list, (ptr)) : -1) + +#define g_queue_push g_queue_push_back +#define g_queue_pop g_queue_pop_front +#define g_queue_peek g_queue_peek_front + + +#ifdef __cplusplus +} +#endif + +#endif /* _EDSIO_H_ */ diff --git a/xdelta-1.1.3/libedsio/edsio.lo b/xdelta-1.1.3/libedsio/edsio.lo new file mode 100644 index 0000000..9788f70 --- /dev/null +++ b/xdelta-1.1.3/libedsio/edsio.lo @@ -0,0 +1 @@ +timestamp diff --git a/xdelta-1.1.3/libedsio/edsio.prj b/xdelta-1.1.3/libedsio/edsio.prj new file mode 100644 index 0000000..6f4f064 --- /dev/null +++ b/xdelta-1.1.3/libedsio/edsio.prj @@ -0,0 +1,40 @@ +;; -*- Prcs -*- +(Created-By-Prcs-Version 1 2 16) +(Project-Description "") +(Project-Version edsio xdelta11-maint 1) +(Parent-Version edsio 0 47) +(Version-Log "") +(New-Version-Log "") +(Checkin-Time "Mon, 11 Jun 2001 01:56:01 -0700") +(Checkin-Login jmacd) +(Populate-Ignore (".libs" ".deps" "\\.lo$" "\\.o$" "\\.la$" "edsiotest$" "\\.elc$" "CVS" "edsio_edsio\\." "edsio-comp$" "dead.code" "stamp-ser" "Makefile.in" "Makefile")) +(Project-Keywords) +(Files + (Makefile.am (edsio/0_Makefile.a 1.9 644)) + (edsio.el (edsio/1_edsio.el 1.16 644)) + (edsio-comp.in (edsio/2_edsio-comp 1.2 644)) + (edsio.ser (edsio/3_edsio.ser 1.9 644)) + (edsio.h (edsio/7_serializei 1.15.1.1 644)) + (edsio.c (edsio/8_serializei 1.24.1.1 644)) + (sha.c (edsio/9_sha.c 1.2 644)) + (md5c.c (edsio/10_md5c.c 1.1 644)) + (edsiotest.c (edsio/11_edsiotest. 1.6 644)) + (base64.c (edsio/12_base64.c 1.14 644)) + (simple.c (edsio/13_simple.c 1.6 644)) + (default.c (edsio/14_default.c 1.5 644)) + (generic.c (edsio/15_generic.c 1.3 644)) + (fh.c (edsio/16_fh.c 1.3 644)) + (library.c (edsio/21_library.c 1.1 644)) + + ;; Sources obtained from RCS, primarily for parsing date formats. + (partime.c (edsio/17_partime.c 1.1 644)) + (maketime.c (edsio/18_maketime.c 1.1 644)) + (maketime.h (edsio/19_maketime.h 1.1 644)) + (partime.h (edsio/20_partime.h 1.1 644)) + + ;; Not used + (modtest.c (edsio/22_modtest.c 1.1 644)) + (modtest.ser (edsio/23_modtest.se 1.1 644)) +) +(Merge-Parents) +(New-Merge-Parents) diff --git a/xdelta-1.1.3/libedsio/edsio.ser b/xdelta-1.1.3/libedsio/edsio.ser new file mode 100644 index 0000000..ada3b11 --- /dev/null +++ b/xdelta-1.1.3/libedsio/edsio.ser @@ -0,0 +1,129 @@ +;; -*- Emacs-Lisp -*- + +(defmodule edsio 6 "edsio.h" nil) + +(defsertype EdsioUint 1 + ((val uint)) + () + ) + +(defsertype EdsioBytes 2 + ((val bytes)) + () + ) + +(defsertype EdsioString 3 + ((val string)) + () + ) + +(defsertype GenericTime 4 + ((seconds uint) + (nanos uint) + ) + () + ) + +(defetype source "SerialSource*") +(defetype sink "SerialSink*") +(defetype int "int") +(defetype string "const char*") + +(defevent GetTimeOfDayFailure Error () (errno) + "Gettimeofday failed: ${STRERROR}") + +(defevent TimeFailure Error () (errno) + "Time failed: ${STRERROR}") + +(defevent UnregisteredType Error ((library int) (number int)) () + "Unregistered serial type: library=${LIBRARY} number=${NUMBER}") + +(defevent UnexpectedLibraryType Error ((expected int) (received int)) () + "Unexpected serial library type: expected ${EXPECTED}, received ${RECEIVED}") + +(defevent UnexpectedType Error () () + "Unexpected serial type") + +(defevent OutputBufferShort Error () () + "Output buffer is too short") + +(defevent InvalidBase64Encoding Error () () + "Invalid base64 encoding") + +(defevent MissingChecksum Error () () + "Missing embedded checksum in base64 encoding") + +(defevent InvalidChecksum Error () () + "Checksum verification failed") + +(defevent SourceEof Error ((source source)) () + "${SOURCE}: Unexpected EOF") + +(defevent IncorrectAllocation Error ((source source)) () + "${SOURCE}: Incorrect allocation") + +(defevent InvalidIntegerString Error ((msg string) (arg string)) () + "${MSG}: not an integer: ${ARG}") + +(defevent IntegerOutOfRange Error ((msg string) (arg string)) () + "${MSG}: integer out of range: ${ARG}") + +(defevent InvalidIntegerSign Error ((msg string) (arg string)) () + "${MSG}: expected an unsigned integer: ${ARG}") + +(defevent DuplicatePropertyTypeRegistered Error ((name string)) () + "Property type registered twice: ${NAME}") + +(defevent DuplicateHostTypeRegistered Error ((name string)) () + "Property host registered twice: ${NAME}") + +(defevent DuplicatePropertyNameRegistered Warning ((name string)) () + "Property name registered twice (ignored): ${NAME}") + +(defevent NoSuchProperty Error ((num int)) () + "Unregistered property: ${NUM}") + +(defevent NoSuchPropertyType Error ((name string)) () + "Unregistered property type: ${NAME}") + +(defevent NoSuchHostType Error ((name string)) () + "Unregistered host type: ${NAME}") + +(defevent WrongHostType Error ((name string) (recv string) (expect string)) () + "Wrong property host type: received ${RECV}, expected ${EXPECT}") + +(defevent WrongDataType Error ((name string) (recv string) (expect string)) () + "Wrong property data type: received ${RECV}, expected ${EXPECT}") + +(defevent PropertyNotSet Error ((name string)) () + "${NAME} property not set") + +(defevent PersistenceUnavailable Error ((name string) (host string)) () + "Persistence is unavailable in host ${HOST} for property ${NAME}") + +(defevent InvalidStreamChecksum Error () () + "Incorrect stream checksum") + +(defevent InvalidHexDigit Error ((bad string) (ctx string)) () + "Invalid hex digit ${BAD} in context: ${CTX}") + +(defevent MD5StringShort Error ((short string)) () + "MD5 string too short: ${SHORT}") + +(defevent MD5StringLong Error ((long string)) () + "MD5 string too long: ${LONG}") + +(defevent UnregisteredLibrary Error ((number int)) () + "Unregistered library: ${NUMBER}") + +(defevent GModuleError Error ((file string) (msg string)) () + "GModule: ${FILE}: ${MSG}") + +;; properties + +(defprophost PropTest "P" "PropTest*" t) + +(defprophosttype PropTest uint) +(defprophosttype PropTest bytes) +(defprophosttype PropTest string) +(defprophosttype PropTest EdsioUint) diff --git a/xdelta-1.1.3/libedsio/edsio_edsio.c b/xdelta-1.1.3/libedsio/edsio_edsio.c new file mode 100644 index 0000000..ed24774 --- /dev/null +++ b/xdelta-1.1.3/libedsio/edsio_edsio.c @@ -0,0 +1,873 @@ +/* -*-Mode: C;-*- + * Copyright (C) 1997, 1998, 1999 Josh MacDonald + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + * + * Author: Josh MacDonald + * + * This file was AUTOMATICALLY GENERATED using: + * + * $Id: edsio_edsio.c,v 1.1 2004/01/05 18:54:23 icculus Exp $ + */ + +#include "edsio.h" + +#include + +/* Declarations. */ + +static const char* Edsio_StringStringString_event_field_to_string (GenericEvent* ev, gint field); +static const char* Edsio_Int_event_field_to_string (GenericEvent* ev, gint field); +static const char* Edsio_String_event_field_to_string (GenericEvent* ev, gint field); +static const char* Edsio_StringString_event_field_to_string (GenericEvent* ev, gint field); +static const char* Edsio_Source_event_field_to_string (GenericEvent* ev, gint field); +static const char* Edsio_IntInt_event_field_to_string (GenericEvent* ev, gint field); +static const char* Edsio_Errno_event_field_to_string (GenericEvent* ev, gint field); +static void print_spaces (guint n) { int i; for (i = 0; i < n; i += 1) g_print (" "); } + + +/* initialize this library. */ + +gboolean +edsio_edsio_init (void) +{ + static gboolean once = FALSE; + static gboolean result = FALSE; + if (once) return result; + once = TRUE; + eventdelivery_initialize_event_def (EC_EdsioGModuleErrorValue, EL_Error, EF_None, "GModuleError", "GModule: ${0}: ${1}", & Edsio_StringString_event_field_to_string); + eventdelivery_initialize_event_def (EC_EdsioUnregisteredLibraryValue, EL_Error, EF_None, "UnregisteredLibrary", "Unregistered library: ${0}", & Edsio_Int_event_field_to_string); + eventdelivery_initialize_event_def (EC_EdsioMD5StringLongValue, EL_Error, EF_None, "MD5StringLong", "MD5 string too long: ${0}", & Edsio_String_event_field_to_string); + eventdelivery_initialize_event_def (EC_EdsioMD5StringShortValue, EL_Error, EF_None, "MD5StringShort", "MD5 string too short: ${0}", & Edsio_String_event_field_to_string); + eventdelivery_initialize_event_def (EC_EdsioInvalidHexDigitValue, EL_Error, EF_None, "InvalidHexDigit", "Invalid hex digit ${0} in context: ${1}", & Edsio_StringString_event_field_to_string); + eventdelivery_initialize_event_def (EC_EdsioInvalidStreamChecksumValue, EL_Error, EF_None, "InvalidStreamChecksum", "Incorrect stream checksum", NULL); + eventdelivery_initialize_event_def (EC_EdsioPersistenceUnavailableValue, EL_Error, EF_None, "PersistenceUnavailable", "Persistence is unavailable in host ${1} for property ${0}", & Edsio_StringString_event_field_to_string); + eventdelivery_initialize_event_def (EC_EdsioPropertyNotSetValue, EL_Error, EF_None, "PropertyNotSet", "${0} property not set", & Edsio_String_event_field_to_string); + eventdelivery_initialize_event_def (EC_EdsioWrongDataTypeValue, EL_Error, EF_None, "WrongDataType", "Wrong property data type: received ${1}, expected ${2}", & Edsio_StringStringString_event_field_to_string); + eventdelivery_initialize_event_def (EC_EdsioWrongHostTypeValue, EL_Error, EF_None, "WrongHostType", "Wrong property host type: received ${1}, expected ${2}", & Edsio_StringStringString_event_field_to_string); + eventdelivery_initialize_event_def (EC_EdsioNoSuchHostTypeValue, EL_Error, EF_None, "NoSuchHostType", "Unregistered host type: ${0}", & Edsio_String_event_field_to_string); + eventdelivery_initialize_event_def (EC_EdsioNoSuchPropertyTypeValue, EL_Error, EF_None, "NoSuchPropertyType", "Unregistered property type: ${0}", & Edsio_String_event_field_to_string); + eventdelivery_initialize_event_def (EC_EdsioNoSuchPropertyValue, EL_Error, EF_None, "NoSuchProperty", "Unregistered property: ${0}", & Edsio_Int_event_field_to_string); + eventdelivery_initialize_event_def (EC_EdsioDuplicatePropertyNameRegisteredValue, EL_Warning, EF_None, "DuplicatePropertyNameRegistered", "Property name registered twice (ignored): ${0}", & Edsio_String_event_field_to_string); + eventdelivery_initialize_event_def (EC_EdsioDuplicateHostTypeRegisteredValue, EL_Error, EF_None, "DuplicateHostTypeRegistered", "Property host registered twice: ${0}", & Edsio_String_event_field_to_string); + eventdelivery_initialize_event_def (EC_EdsioDuplicatePropertyTypeRegisteredValue, EL_Error, EF_None, "DuplicatePropertyTypeRegistered", "Property type registered twice: ${0}", & Edsio_String_event_field_to_string); + eventdelivery_initialize_event_def (EC_EdsioInvalidIntegerSignValue, EL_Error, EF_None, "InvalidIntegerSign", "${0}: expected an unsigned integer: ${1}", & Edsio_StringString_event_field_to_string); + eventdelivery_initialize_event_def (EC_EdsioIntegerOutOfRangeValue, EL_Error, EF_None, "IntegerOutOfRange", "${0}: integer out of range: ${1}", & Edsio_StringString_event_field_to_string); + eventdelivery_initialize_event_def (EC_EdsioInvalidIntegerStringValue, EL_Error, EF_None, "InvalidIntegerString", "${0}: not an integer: ${1}", & Edsio_StringString_event_field_to_string); + eventdelivery_initialize_event_def (EC_EdsioIncorrectAllocationValue, EL_Error, EF_None, "IncorrectAllocation", "${0}: Incorrect allocation", & Edsio_Source_event_field_to_string); + eventdelivery_initialize_event_def (EC_EdsioSourceEofValue, EL_Error, EF_None, "SourceEof", "${0}: Unexpected EOF", & Edsio_Source_event_field_to_string); + eventdelivery_initialize_event_def (EC_EdsioInvalidChecksumValue, EL_Error, EF_None, "InvalidChecksum", "Checksum verification failed", NULL); + eventdelivery_initialize_event_def (EC_EdsioMissingChecksumValue, EL_Error, EF_None, "MissingChecksum", "Missing embedded checksum in base64 encoding", NULL); + eventdelivery_initialize_event_def (EC_EdsioInvalidBase64EncodingValue, EL_Error, EF_None, "InvalidBase64Encoding", "Invalid base64 encoding", NULL); + eventdelivery_initialize_event_def (EC_EdsioOutputBufferShortValue, EL_Error, EF_None, "OutputBufferShort", "Output buffer is too short", NULL); + eventdelivery_initialize_event_def (EC_EdsioUnexpectedTypeValue, EL_Error, EF_None, "UnexpectedType", "Unexpected serial type", NULL); + eventdelivery_initialize_event_def (EC_EdsioUnexpectedLibraryTypeValue, EL_Error, EF_None, "UnexpectedLibraryType", "Unexpected serial library type: expected ${0}, received ${1}", & Edsio_IntInt_event_field_to_string); + eventdelivery_initialize_event_def (EC_EdsioUnregisteredTypeValue, EL_Error, EF_None, "UnregisteredType", "Unregistered serial type: library=${0} number=${1}", & Edsio_IntInt_event_field_to_string); + eventdelivery_initialize_event_def (EC_EdsioTimeFailureValue, EL_Error, EF_None, "TimeFailure", "Time failed: ${0}", & Edsio_Errno_event_field_to_string); + eventdelivery_initialize_event_def (EC_EdsioGetTimeOfDayFailureValue, EL_Error, EF_None, "GetTimeOfDayFailure", "Gettimeofday failed: ${0}", & Edsio_Errno_event_field_to_string); + serializeio_initialize_type ("ST_GenericTime", ST_GenericTime, &unserialize_generictime_internal, &serialize_generictime_obj_internal, &serializeio_count_generictime_obj, &serializeio_print_generictime_obj); + serializeio_initialize_type ("ST_EdsioString", ST_EdsioString, &unserialize_edsiostring_internal, &serialize_edsiostring_obj_internal, &serializeio_count_edsiostring_obj, &serializeio_print_edsiostring_obj); + serializeio_initialize_type ("ST_EdsioBytes", ST_EdsioBytes, &unserialize_edsiobytes_internal, &serialize_edsiobytes_obj_internal, &serializeio_count_edsiobytes_obj, &serializeio_print_edsiobytes_obj); + serializeio_initialize_type ("ST_EdsioUint", ST_EdsioUint, &unserialize_edsiouint_internal, &serialize_edsiouint_obj_internal, &serializeio_count_edsiouint_obj, &serializeio_print_edsiouint_obj); + edsio_initialize_host_type ("PropTest", (PropertyTableFunc) & edsio_proptest_property_table, (PersistSourceFunc) & edsio_persist_proptest_source, (PersistSinkFunc) & edsio_persist_proptest_sink, (PersistIssetFunc) & edsio_persist_proptest_isset, (PersistUnsetFunc) & edsio_persist_proptest_unset); + edsio_initialize_property_type ("EdsioUint", & edsio_property_vptr_free, & edsio_property_vptr_getter, & edsio_property_vptr_setter, serialize_edsiouint_obj, unserialize_edsiouint); + edsio_initialize_property_type ("string", & edsio_property_string_free, & edsio_property_string_getter, & edsio_property_string_setter, serialize_string_obj, unserialize_string); + edsio_initialize_property_type ("bytes", & edsio_property_bytes_free, & edsio_property_bytes_getter, & edsio_property_bytes_setter, serialize_bytes_obj, unserialize_bytes); + edsio_initialize_property_type ("uint", & edsio_property_uint_free, & edsio_property_uint_getter, & edsio_property_uint_setter, serialize_uint_obj, unserialize_uint); + edsio_library_register (6, "edsio"); + result = TRUE; + return TRUE; +}; + +gboolean edsio_new_proptest_edsiouint_property (const char* name, guint32 flags, EdsioPropTestEdsioUintProperty* prop) +{ + return edsio_new_property (name, "PropTest", "EdsioUint", flags, (EdsioGenericProperty*) prop); +} + +gboolean +proptest_get_edsiouint (PropTest* obj, EdsioPropTestEdsioUintProperty prop, SerialEdsioUint** arg) +{ + EdsioProperty* ep; + g_return_val_if_fail (obj, FALSE); + return (* edsio_property_getter ("PropTest", "EdsioUint", prop.code, & ep)) (obj, ep, arg); +} + +gboolean +proptest_set_edsiouint (PropTest* obj, EdsioPropTestEdsioUintProperty prop, SerialEdsioUint* arg) +{ + EdsioProperty* ep; + g_return_val_if_fail (obj, FALSE); + return (* edsio_property_setter ("PropTest", "EdsioUint", prop.code, & ep)) (obj, ep, arg); +} + +gboolean +proptest_unset_edsiouint (PropTest* obj, EdsioPropTestEdsioUintProperty prop) +{ + g_return_val_if_fail (obj, FALSE); + return edsio_property_unset ("PropTest", "EdsioUint", prop.code, obj); +} + +gboolean +proptest_isset_edsiouint (PropTest* obj, EdsioPropTestEdsioUintProperty prop) +{ + g_return_val_if_fail (obj, FALSE); + return edsio_property_isset ("PropTest", "EdsioUint", prop.code, obj); +} + +gboolean edsio_new_proptest_string_property (const char* name, guint32 flags, EdsioPropTestStringProperty* prop) +{ + return edsio_new_property (name, "PropTest", "string", flags, (EdsioGenericProperty*) prop); +} + +gboolean +proptest_get_string (PropTest* obj, EdsioPropTestStringProperty prop, const gchar** arg) +{ + EdsioProperty* ep; + g_return_val_if_fail (obj, FALSE); + return (* edsio_property_getter ("PropTest", "string", prop.code, & ep)) (obj, ep, arg); +} + +gboolean +proptest_set_string (PropTest* obj, EdsioPropTestStringProperty prop, const gchar* arg) +{ + EdsioProperty* ep; + g_return_val_if_fail (obj, FALSE); + return (* edsio_property_setter ("PropTest", "string", prop.code, & ep)) (obj, ep, arg); +} + +gboolean +proptest_unset_string (PropTest* obj, EdsioPropTestStringProperty prop) +{ + g_return_val_if_fail (obj, FALSE); + return edsio_property_unset ("PropTest", "string", prop.code, obj); +} + +gboolean +proptest_isset_string (PropTest* obj, EdsioPropTestStringProperty prop) +{ + g_return_val_if_fail (obj, FALSE); + return edsio_property_isset ("PropTest", "string", prop.code, obj); +} + +gboolean edsio_new_proptest_bytes_property (const char* name, guint32 flags, EdsioPropTestBytesProperty* prop) +{ + return edsio_new_property (name, "PropTest", "bytes", flags, (EdsioGenericProperty*) prop); +} + +gboolean +proptest_get_bytes (PropTest* obj, EdsioPropTestBytesProperty prop, const guint8** arg, guint32* arg_len) +{ + EdsioProperty* ep; + g_return_val_if_fail (obj, FALSE); + return (* edsio_property_getter ("PropTest", "bytes", prop.code, & ep)) (obj, ep, arg, arg_len); +} + +gboolean +proptest_set_bytes (PropTest* obj, EdsioPropTestBytesProperty prop, const guint8* arg, guint32 arg_len) +{ + EdsioProperty* ep; + g_return_val_if_fail (obj, FALSE); + return (* edsio_property_setter ("PropTest", "bytes", prop.code, & ep)) (obj, ep, arg, arg_len); +} + +gboolean +proptest_unset_bytes (PropTest* obj, EdsioPropTestBytesProperty prop) +{ + g_return_val_if_fail (obj, FALSE); + return edsio_property_unset ("PropTest", "bytes", prop.code, obj); +} + +gboolean +proptest_isset_bytes (PropTest* obj, EdsioPropTestBytesProperty prop) +{ + g_return_val_if_fail (obj, FALSE); + return edsio_property_isset ("PropTest", "bytes", prop.code, obj); +} + +gboolean edsio_new_proptest_uint_property (const char* name, guint32 flags, EdsioPropTestUintProperty* prop) +{ + return edsio_new_property (name, "PropTest", "uint", flags, (EdsioGenericProperty*) prop); +} + +gboolean +proptest_get_uint (PropTest* obj, EdsioPropTestUintProperty prop, guint32* arg) +{ + EdsioProperty* ep; + g_return_val_if_fail (obj, FALSE); + return (* edsio_property_getter ("PropTest", "uint", prop.code, & ep)) (obj, ep, arg); +} + +gboolean +proptest_set_uint (PropTest* obj, EdsioPropTestUintProperty prop, guint32 arg) +{ + EdsioProperty* ep; + g_return_val_if_fail (obj, FALSE); + return (* edsio_property_setter ("PropTest", "uint", prop.code, & ep)) (obj, ep, arg); +} + +gboolean +proptest_unset_uint (PropTest* obj, EdsioPropTestUintProperty prop) +{ + g_return_val_if_fail (obj, FALSE); + return edsio_property_unset ("PropTest", "uint", prop.code, obj); +} + +gboolean +proptest_isset_uint (PropTest* obj, EdsioPropTestUintProperty prop) +{ + g_return_val_if_fail (obj, FALSE); + return edsio_property_isset ("PropTest", "uint", prop.code, obj); +} + +/* EdsioUint Count + */ + +guint +serializeio_count_edsiouint (guint32 val) { + guint size = sizeof (SerialEdsioUint); + ALIGN_8 (size); + ALIGN_8 (size); + return size; +} + +guint +serializeio_count_edsiouint_obj (SerialEdsioUint const* obj) { + return serializeio_count_edsiouint (obj->val); +} + +/* EdsioUint Print + */ + +void +serializeio_print_edsiouint_obj (SerialEdsioUint* obj, guint indent_spaces) { + print_spaces (indent_spaces); + g_print ("[ST_EdsioUint]\n"); + print_spaces (indent_spaces); + g_print ("val = "); + g_print ("%d\n", obj->val); +} + +/* EdsioUint Serialize + */ + +gboolean +serialize_edsiouint_internal (SerialSink *sink, guint32 val) +{ + if (! (* sink->next_uint) (sink, val)) goto bail; + return TRUE; +bail: + return FALSE; +} + +gboolean +serialize_edsiouint_obj_internal (SerialSink *sink, SerialEdsioUint* obj) +{ + return serialize_edsiouint_internal (sink, obj->val); +} + +gboolean +serialize_edsiouint (SerialSink *sink, guint32 val) +{ + if (! (* sink->sink_type) (sink, ST_EdsioUint, serializeio_count_edsiouint (val), TRUE)) goto bail; + if (! serialize_edsiouint_internal (sink, val)) goto bail; + if (sink->sink_quantum && ! sink->sink_quantum (sink)) goto bail; + return TRUE; +bail: + return FALSE; +} + +gboolean +serialize_edsiouint_obj (SerialSink *sink, const SerialEdsioUint* obj) { + + return serialize_edsiouint (sink, obj->val); +} + +/* EdsioUint Unserialize + */ + +gboolean +unserialize_edsiouint_internal_noalloc (SerialSource *source, SerialEdsioUint* result) +{ + if (! (* source->next_uint) (source, &result->val)) goto bail; + return TRUE; +bail: + return FALSE; +} + +gboolean +unserialize_edsiouint_internal (SerialSource *source, SerialEdsioUint** result) +{ + SerialEdsioUint* unser; + (*result) = NULL; + unser = serializeio_source_alloc (source, sizeof (SerialEdsioUint)); + if (! unser) goto bail; + if (! unserialize_edsiouint_internal_noalloc (source, unser)) goto bail; + (*result) = unser; + return TRUE; +bail: + return FALSE; +} + +gboolean +unserialize_edsiouint (SerialSource *source, SerialEdsioUint** result) +{ + if ( (* source->source_type) (source, TRUE) != ST_EdsioUint) goto bail; + if (! unserialize_edsiouint_internal (source, result)) goto bail; + if (! serializeio_source_object_received (source)) goto bail; + return TRUE; +bail: + return FALSE; +} + +/* EdsioBytes Count + */ + +guint +serializeio_count_edsiobytes (guint32 val_len, const guint8* val) { + guint size = sizeof (SerialEdsioBytes); + ALIGN_8 (size); + size += val_len; + ALIGN_8 (size); + return size; +} + +guint +serializeio_count_edsiobytes_obj (SerialEdsioBytes const* obj) { + return serializeio_count_edsiobytes (obj->val_len, obj->val); +} + +/* EdsioBytes Print + */ + +void +serializeio_print_edsiobytes_obj (SerialEdsioBytes* obj, guint indent_spaces) { + print_spaces (indent_spaces); + g_print ("[ST_EdsioBytes]\n"); + print_spaces (indent_spaces); + g_print ("val = "); + serializeio_print_bytes (obj->val, obj->val_len); +} + +/* EdsioBytes Serialize + */ + +gboolean +serialize_edsiobytes_internal (SerialSink *sink, guint32 val_len, const guint8* val) +{ + if (! (* sink->next_bytes) (sink, val, val_len)) goto bail; + return TRUE; +bail: + return FALSE; +} + +gboolean +serialize_edsiobytes_obj_internal (SerialSink *sink, SerialEdsioBytes* obj) +{ + return serialize_edsiobytes_internal (sink, obj->val_len, obj->val); +} + +gboolean +serialize_edsiobytes (SerialSink *sink, guint32 val_len, const guint8* val) +{ + if (! (* sink->sink_type) (sink, ST_EdsioBytes, serializeio_count_edsiobytes (val_len, val), TRUE)) goto bail; + if (! serialize_edsiobytes_internal (sink, val_len, val)) goto bail; + if (sink->sink_quantum && ! sink->sink_quantum (sink)) goto bail; + return TRUE; +bail: + return FALSE; +} + +gboolean +serialize_edsiobytes_obj (SerialSink *sink, const SerialEdsioBytes* obj) { + + return serialize_edsiobytes (sink, obj->val_len, obj->val); +} + +/* EdsioBytes Unserialize + */ + +gboolean +unserialize_edsiobytes_internal_noalloc (SerialSource *source, SerialEdsioBytes* result) +{ + if (! (* source->next_bytes) (source, &result->val, &result->val_len)) goto bail; + return TRUE; +bail: + return FALSE; +} + +gboolean +unserialize_edsiobytes_internal (SerialSource *source, SerialEdsioBytes** result) +{ + SerialEdsioBytes* unser; + (*result) = NULL; + unser = serializeio_source_alloc (source, sizeof (SerialEdsioBytes)); + if (! unser) goto bail; + if (! unserialize_edsiobytes_internal_noalloc (source, unser)) goto bail; + (*result) = unser; + return TRUE; +bail: + return FALSE; +} + +gboolean +unserialize_edsiobytes (SerialSource *source, SerialEdsioBytes** result) +{ + if ( (* source->source_type) (source, TRUE) != ST_EdsioBytes) goto bail; + if (! unserialize_edsiobytes_internal (source, result)) goto bail; + if (! serializeio_source_object_received (source)) goto bail; + return TRUE; +bail: + return FALSE; +} + +/* EdsioString Count + */ + +guint +serializeio_count_edsiostring (const gchar* val) { + guint size = sizeof (SerialEdsioString); + ALIGN_8 (size); + size += strlen (val) + 1; + ALIGN_8 (size); + return size; +} + +guint +serializeio_count_edsiostring_obj (SerialEdsioString const* obj) { + return serializeio_count_edsiostring (obj->val); +} + +/* EdsioString Print + */ + +void +serializeio_print_edsiostring_obj (SerialEdsioString* obj, guint indent_spaces) { + print_spaces (indent_spaces); + g_print ("[ST_EdsioString]\n"); + print_spaces (indent_spaces); + g_print ("val = "); + g_print ("%s\n", obj->val); +} + +/* EdsioString Serialize + */ + +gboolean +serialize_edsiostring_internal (SerialSink *sink, const gchar* val) +{ + if (! (* sink->next_string) (sink, val)) goto bail; + return TRUE; +bail: + return FALSE; +} + +gboolean +serialize_edsiostring_obj_internal (SerialSink *sink, SerialEdsioString* obj) +{ + return serialize_edsiostring_internal (sink, obj->val); +} + +gboolean +serialize_edsiostring (SerialSink *sink, const gchar* val) +{ + if (! (* sink->sink_type) (sink, ST_EdsioString, serializeio_count_edsiostring (val), TRUE)) goto bail; + if (! serialize_edsiostring_internal (sink, val)) goto bail; + if (sink->sink_quantum && ! sink->sink_quantum (sink)) goto bail; + return TRUE; +bail: + return FALSE; +} + +gboolean +serialize_edsiostring_obj (SerialSink *sink, const SerialEdsioString* obj) { + + return serialize_edsiostring (sink, obj->val); +} + +/* EdsioString Unserialize + */ + +gboolean +unserialize_edsiostring_internal_noalloc (SerialSource *source, SerialEdsioString* result) +{ + if (! (* source->next_string) (source, &result->val)) goto bail; + return TRUE; +bail: + return FALSE; +} + +gboolean +unserialize_edsiostring_internal (SerialSource *source, SerialEdsioString** result) +{ + SerialEdsioString* unser; + (*result) = NULL; + unser = serializeio_source_alloc (source, sizeof (SerialEdsioString)); + if (! unser) goto bail; + if (! unserialize_edsiostring_internal_noalloc (source, unser)) goto bail; + (*result) = unser; + return TRUE; +bail: + return FALSE; +} + +gboolean +unserialize_edsiostring (SerialSource *source, SerialEdsioString** result) +{ + if ( (* source->source_type) (source, TRUE) != ST_EdsioString) goto bail; + if (! unserialize_edsiostring_internal (source, result)) goto bail; + if (! serializeio_source_object_received (source)) goto bail; + return TRUE; +bail: + return FALSE; +} + +/* GenericTime Count + */ + +guint +serializeio_count_generictime (guint32 seconds, guint32 nanos) { + guint size = sizeof (SerialGenericTime); + ALIGN_8 (size); + ALIGN_8 (size); + ALIGN_8 (size); + return size; +} + +guint +serializeio_count_generictime_obj (SerialGenericTime const* obj) { + return serializeio_count_generictime (obj->seconds, obj->nanos); +} + +/* GenericTime Print + */ + +void +serializeio_print_generictime_obj (SerialGenericTime* obj, guint indent_spaces) { + print_spaces (indent_spaces); + g_print ("[ST_GenericTime]\n"); + print_spaces (indent_spaces); + g_print ("seconds = "); + g_print ("%d\n", obj->seconds); + print_spaces (indent_spaces); + g_print ("nanos = "); + g_print ("%d\n", obj->nanos); +} + +/* GenericTime Serialize + */ + +gboolean +serialize_generictime_internal (SerialSink *sink, guint32 seconds, guint32 nanos) +{ + if (! (* sink->next_uint) (sink, seconds)) goto bail; + if (! (* sink->next_uint) (sink, nanos)) goto bail; + return TRUE; +bail: + return FALSE; +} + +gboolean +serialize_generictime_obj_internal (SerialSink *sink, SerialGenericTime* obj) +{ + return serialize_generictime_internal (sink, obj->seconds, obj->nanos); +} + +gboolean +serialize_generictime (SerialSink *sink, guint32 seconds, guint32 nanos) +{ + if (! (* sink->sink_type) (sink, ST_GenericTime, serializeio_count_generictime (seconds, nanos), TRUE)) goto bail; + if (! serialize_generictime_internal (sink, seconds, nanos)) goto bail; + if (sink->sink_quantum && ! sink->sink_quantum (sink)) goto bail; + return TRUE; +bail: + return FALSE; +} + +gboolean +serialize_generictime_obj (SerialSink *sink, const SerialGenericTime* obj) { + + return serialize_generictime (sink, obj->seconds, obj->nanos); +} + +/* GenericTime Unserialize + */ + +gboolean +unserialize_generictime_internal_noalloc (SerialSource *source, SerialGenericTime* result) +{ + if (! (* source->next_uint) (source, &result->seconds)) goto bail; + if (! (* source->next_uint) (source, &result->nanos)) goto bail; + return TRUE; +bail: + return FALSE; +} + +gboolean +unserialize_generictime_internal (SerialSource *source, SerialGenericTime** result) +{ + SerialGenericTime* unser; + (*result) = NULL; + unser = serializeio_source_alloc (source, sizeof (SerialGenericTime)); + if (! unser) goto bail; + if (! unserialize_generictime_internal_noalloc (source, unser)) goto bail; + (*result) = unser; + return TRUE; +bail: + return FALSE; +} + +gboolean +unserialize_generictime (SerialSource *source, SerialGenericTime** result) +{ + if ( (* source->source_type) (source, TRUE) != ST_GenericTime) goto bail; + if (! unserialize_generictime_internal (source, result)) goto bail; + if (! serializeio_source_object_received (source)) goto bail; + return TRUE; +bail: + return FALSE; +} + +void +edsio_generate_errno_event_internal (EdsioErrnoEventCode _code, const char* _srcfile, gint _srcline) +{ + EdsioErrnoEvent *_e = g_new0 (EdsioErrnoEvent, 1); + _e->code = _code.code; + _e->srcline = _srcline; + _e->srcfile = _srcfile; + _e->ev_errno = errno; + eventdelivery_event_deliver ((GenericEvent*) _e); +} + +const char* +Edsio_Errno_event_field_to_string (GenericEvent* ev, gint field) +{ + EdsioErrnoEvent* it = (EdsioErrnoEvent*) ev; + switch (field) + { + case 0: return g_strdup (g_strerror (it->ev_errno)); + default: abort (); + } +} + +const EdsioErrnoEventCode EC_EdsioGetTimeOfDayFailure = { EC_EdsioGetTimeOfDayFailureValue }; + +const EdsioErrnoEventCode EC_EdsioTimeFailure = { EC_EdsioTimeFailureValue }; + +void +edsio_generate_intint_event_internal (EdsioIntIntEventCode _code, const char* _srcfile, gint _srcline, int library, int number) +{ + EdsioIntIntEvent *_e = g_new0 (EdsioIntIntEvent, 1); + _e->code = _code.code; + _e->srcline = _srcline; + _e->srcfile = _srcfile; + _e->library = library; + _e->number = number; + eventdelivery_event_deliver ((GenericEvent*) _e); +} + +const char* +Edsio_IntInt_event_field_to_string (GenericEvent* ev, gint field) +{ + EdsioIntIntEvent* it = (EdsioIntIntEvent*) ev; + switch (field) + { + case 0: return eventdelivery_int_to_string (it->library); + case 1: return eventdelivery_int_to_string (it->number); + default: abort (); + } +} + +const EdsioIntIntEventCode EC_EdsioUnregisteredType = { EC_EdsioUnregisteredTypeValue }; + +const EdsioIntIntEventCode EC_EdsioUnexpectedLibraryType = { EC_EdsioUnexpectedLibraryTypeValue }; + +void +edsio_generate_void_event_internal (EdsioVoidEventCode _code, const char* _srcfile, gint _srcline) +{ + EdsioVoidEvent *_e = g_new0 (EdsioVoidEvent, 1); + _e->code = _code.code; + _e->srcline = _srcline; + _e->srcfile = _srcfile; + eventdelivery_event_deliver ((GenericEvent*) _e); +} + +const EdsioVoidEventCode EC_EdsioUnexpectedType = { EC_EdsioUnexpectedTypeValue }; + +const EdsioVoidEventCode EC_EdsioOutputBufferShort = { EC_EdsioOutputBufferShortValue }; + +const EdsioVoidEventCode EC_EdsioInvalidBase64Encoding = { EC_EdsioInvalidBase64EncodingValue }; + +const EdsioVoidEventCode EC_EdsioMissingChecksum = { EC_EdsioMissingChecksumValue }; + +const EdsioVoidEventCode EC_EdsioInvalidChecksum = { EC_EdsioInvalidChecksumValue }; + +void +edsio_generate_source_event_internal (EdsioSourceEventCode _code, const char* _srcfile, gint _srcline, SerialSource* source) +{ + EdsioSourceEvent *_e = g_new0 (EdsioSourceEvent, 1); + _e->code = _code.code; + _e->srcline = _srcline; + _e->srcfile = _srcfile; + _e->source = source; + eventdelivery_event_deliver ((GenericEvent*) _e); +} + +const char* +Edsio_Source_event_field_to_string (GenericEvent* ev, gint field) +{ + EdsioSourceEvent* it = (EdsioSourceEvent*) ev; + switch (field) + { + case 0: return eventdelivery_source_to_string (it->source); + default: abort (); + } +} + +const EdsioSourceEventCode EC_EdsioSourceEof = { EC_EdsioSourceEofValue }; + +const EdsioSourceEventCode EC_EdsioIncorrectAllocation = { EC_EdsioIncorrectAllocationValue }; + +void +edsio_generate_stringstring_event_internal (EdsioStringStringEventCode _code, const char* _srcfile, gint _srcline, const char* msg, const char* arg) +{ + EdsioStringStringEvent *_e = g_new0 (EdsioStringStringEvent, 1); + _e->code = _code.code; + _e->srcline = _srcline; + _e->srcfile = _srcfile; + _e->msg = msg; + _e->arg = arg; + eventdelivery_event_deliver ((GenericEvent*) _e); +} + +const char* +Edsio_StringString_event_field_to_string (GenericEvent* ev, gint field) +{ + EdsioStringStringEvent* it = (EdsioStringStringEvent*) ev; + switch (field) + { + case 0: return eventdelivery_string_to_string (it->msg); + case 1: return eventdelivery_string_to_string (it->arg); + default: abort (); + } +} + +const EdsioStringStringEventCode EC_EdsioInvalidIntegerString = { EC_EdsioInvalidIntegerStringValue }; + +const EdsioStringStringEventCode EC_EdsioIntegerOutOfRange = { EC_EdsioIntegerOutOfRangeValue }; + +const EdsioStringStringEventCode EC_EdsioInvalidIntegerSign = { EC_EdsioInvalidIntegerSignValue }; + +void +edsio_generate_string_event_internal (EdsioStringEventCode _code, const char* _srcfile, gint _srcline, const char* name) +{ + EdsioStringEvent *_e = g_new0 (EdsioStringEvent, 1); + _e->code = _code.code; + _e->srcline = _srcline; + _e->srcfile = _srcfile; + _e->name = name; + eventdelivery_event_deliver ((GenericEvent*) _e); +} + +const char* +Edsio_String_event_field_to_string (GenericEvent* ev, gint field) +{ + EdsioStringEvent* it = (EdsioStringEvent*) ev; + switch (field) + { + case 0: return eventdelivery_string_to_string (it->name); + default: abort (); + } +} + +const EdsioStringEventCode EC_EdsioDuplicatePropertyTypeRegistered = { EC_EdsioDuplicatePropertyTypeRegisteredValue }; + +const EdsioStringEventCode EC_EdsioDuplicateHostTypeRegistered = { EC_EdsioDuplicateHostTypeRegisteredValue }; + +const EdsioStringEventCode EC_EdsioDuplicatePropertyNameRegistered = { EC_EdsioDuplicatePropertyNameRegisteredValue }; + +void +edsio_generate_int_event_internal (EdsioIntEventCode _code, const char* _srcfile, gint _srcline, int num) +{ + EdsioIntEvent *_e = g_new0 (EdsioIntEvent, 1); + _e->code = _code.code; + _e->srcline = _srcline; + _e->srcfile = _srcfile; + _e->num = num; + eventdelivery_event_deliver ((GenericEvent*) _e); +} + +const char* +Edsio_Int_event_field_to_string (GenericEvent* ev, gint field) +{ + EdsioIntEvent* it = (EdsioIntEvent*) ev; + switch (field) + { + case 0: return eventdelivery_int_to_string (it->num); + default: abort (); + } +} + +const EdsioIntEventCode EC_EdsioNoSuchProperty = { EC_EdsioNoSuchPropertyValue }; + +const EdsioStringEventCode EC_EdsioNoSuchPropertyType = { EC_EdsioNoSuchPropertyTypeValue }; + +const EdsioStringEventCode EC_EdsioNoSuchHostType = { EC_EdsioNoSuchHostTypeValue }; + +void +edsio_generate_stringstringstring_event_internal (EdsioStringStringStringEventCode _code, const char* _srcfile, gint _srcline, const char* name, const char* recv, const char* expect) +{ + EdsioStringStringStringEvent *_e = g_new0 (EdsioStringStringStringEvent, 1); + _e->code = _code.code; + _e->srcline = _srcline; + _e->srcfile = _srcfile; + _e->name = name; + _e->recv = recv; + _e->expect = expect; + eventdelivery_event_deliver ((GenericEvent*) _e); +} + +const char* +Edsio_StringStringString_event_field_to_string (GenericEvent* ev, gint field) +{ + EdsioStringStringStringEvent* it = (EdsioStringStringStringEvent*) ev; + switch (field) + { + case 0: return eventdelivery_string_to_string (it->name); + case 1: return eventdelivery_string_to_string (it->recv); + case 2: return eventdelivery_string_to_string (it->expect); + default: abort (); + } +} + +const EdsioStringStringStringEventCode EC_EdsioWrongHostType = { EC_EdsioWrongHostTypeValue }; + +const EdsioStringStringStringEventCode EC_EdsioWrongDataType = { EC_EdsioWrongDataTypeValue }; + +const EdsioStringEventCode EC_EdsioPropertyNotSet = { EC_EdsioPropertyNotSetValue }; + +const EdsioStringStringEventCode EC_EdsioPersistenceUnavailable = { EC_EdsioPersistenceUnavailableValue }; + +const EdsioVoidEventCode EC_EdsioInvalidStreamChecksum = { EC_EdsioInvalidStreamChecksumValue }; + +const EdsioStringStringEventCode EC_EdsioInvalidHexDigit = { EC_EdsioInvalidHexDigitValue }; + +const EdsioStringEventCode EC_EdsioMD5StringShort = { EC_EdsioMD5StringShortValue }; + +const EdsioStringEventCode EC_EdsioMD5StringLong = { EC_EdsioMD5StringLongValue }; + +const EdsioIntEventCode EC_EdsioUnregisteredLibrary = { EC_EdsioUnregisteredLibraryValue }; + +const EdsioStringStringEventCode EC_EdsioGModuleError = { EC_EdsioGModuleErrorValue }; + diff --git a/xdelta-1.1.3/libedsio/edsio_edsio.h b/xdelta-1.1.3/libedsio/edsio_edsio.h new file mode 100644 index 0000000..64016f6 --- /dev/null +++ b/xdelta-1.1.3/libedsio/edsio_edsio.h @@ -0,0 +1,379 @@ +/* -*-Mode: C;-*- + * Copyright (C) 1997, 1998, 1999 Josh MacDonald + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + * + * Author: Josh MacDonald + * + * This file was AUTOMATICALLY GENERATED using: + * + * $Id: edsio_edsio.h,v 1.1 2004/01/05 18:54:23 icculus Exp $ + */ + +#include "edsio.h" + +#include "edsio.h" + +#ifndef _EDSIO_EDSIO_H_ +#define _EDSIO_EDSIO_H_ + +#ifdef __cplusplus +extern "C" { +#endif + +/* Initialize this library. */ + +gboolean edsio_edsio_init (void); + +/* Types defined here. */ + +/* EdsioStringStringStringEventCode. + */ + +typedef struct _EdsioStringStringStringEventCode EdsioStringStringStringEventCode; +struct _EdsioStringStringStringEventCode { gint code; }; + +typedef struct _EdsioStringStringStringEvent EdsioStringStringStringEvent; +struct _EdsioStringStringStringEvent { gint code; const char* srcfile; guint srcline; const char* name; const char* recv; const char* expect; }; + +/* EdsioIntEventCode. + */ + +typedef struct _EdsioIntEventCode EdsioIntEventCode; +struct _EdsioIntEventCode { gint code; }; + +typedef struct _EdsioIntEvent EdsioIntEvent; +struct _EdsioIntEvent { gint code; const char* srcfile; guint srcline; int num; }; + +/* EdsioStringEventCode. + */ + +typedef struct _EdsioStringEventCode EdsioStringEventCode; +struct _EdsioStringEventCode { gint code; }; + +typedef struct _EdsioStringEvent EdsioStringEvent; +struct _EdsioStringEvent { gint code; const char* srcfile; guint srcline; const char* name; }; + +/* EdsioStringStringEventCode. + */ + +typedef struct _EdsioStringStringEventCode EdsioStringStringEventCode; +struct _EdsioStringStringEventCode { gint code; }; + +typedef struct _EdsioStringStringEvent EdsioStringStringEvent; +struct _EdsioStringStringEvent { gint code; const char* srcfile; guint srcline; const char* msg; const char* arg; }; + +/* EdsioSourceEventCode. + */ + +typedef struct _EdsioSourceEventCode EdsioSourceEventCode; +struct _EdsioSourceEventCode { gint code; }; + +typedef struct _EdsioSourceEvent EdsioSourceEvent; +struct _EdsioSourceEvent { gint code; const char* srcfile; guint srcline; SerialSource* source; }; + +/* EdsioVoidEventCode. + */ + +typedef struct _EdsioVoidEventCode EdsioVoidEventCode; +struct _EdsioVoidEventCode { gint code; }; + +typedef struct _EdsioVoidEvent EdsioVoidEvent; +struct _EdsioVoidEvent { gint code; const char* srcfile; guint srcline; }; + +/* EdsioIntIntEventCode. + */ + +typedef struct _EdsioIntIntEventCode EdsioIntIntEventCode; +struct _EdsioIntIntEventCode { gint code; }; + +typedef struct _EdsioIntIntEvent EdsioIntIntEvent; +struct _EdsioIntIntEvent { gint code; const char* srcfile; guint srcline; int library; int number; }; + +/* EdsioErrnoEventCode. + */ + +typedef struct _EdsioErrnoEventCode EdsioErrnoEventCode; +struct _EdsioErrnoEventCode { gint code; }; + +typedef struct _EdsioErrnoEvent EdsioErrnoEvent; +struct _EdsioErrnoEvent { gint code; const char* srcfile; guint srcline; gint ev_errno; }; + +typedef struct _SerialGenericTime SerialGenericTime; +typedef struct _SerialEdsioString SerialEdsioString; +typedef struct _SerialEdsioBytes SerialEdsioBytes; +typedef struct _SerialEdsioUint SerialEdsioUint; +/* Functions declared here. */ + +/* Property definitions */ + +/* Property get/set for PropTest/EdsioUint + */ + +typedef struct _EdsioPropTestEdsioUintProperty EdsioPropTestEdsioUintProperty; +struct _EdsioPropTestEdsioUintProperty { guint32 code; }; + +gboolean edsio_new_proptest_edsiouint_property (const char* name, guint32 flags, EdsioPropTestEdsioUintProperty* prop); +gboolean proptest_get_edsiouint (PropTest* obj, EdsioPropTestEdsioUintProperty prop, SerialEdsioUint** arg); +gboolean proptest_set_edsiouint (PropTest* obj, EdsioPropTestEdsioUintProperty prop, SerialEdsioUint* arg); +gboolean proptest_unset_edsiouint (PropTest* obj, EdsioPropTestEdsioUintProperty prop); +gboolean proptest_isset_edsiouint (PropTest* obj, EdsioPropTestEdsioUintProperty prop); + +/* Property get/set for PropTest/string + */ + +typedef struct _EdsioPropTestStringProperty EdsioPropTestStringProperty; +struct _EdsioPropTestStringProperty { guint32 code; }; + +gboolean edsio_new_proptest_string_property (const char* name, guint32 flags, EdsioPropTestStringProperty* prop); +gboolean proptest_get_string (PropTest* obj, EdsioPropTestStringProperty prop, const gchar** arg); +gboolean proptest_set_string (PropTest* obj, EdsioPropTestStringProperty prop, const gchar* arg); +gboolean proptest_unset_string (PropTest* obj, EdsioPropTestStringProperty prop); +gboolean proptest_isset_string (PropTest* obj, EdsioPropTestStringProperty prop); + +/* Property get/set for PropTest/bytes + */ + +typedef struct _EdsioPropTestBytesProperty EdsioPropTestBytesProperty; +struct _EdsioPropTestBytesProperty { guint32 code; }; + +gboolean edsio_new_proptest_bytes_property (const char* name, guint32 flags, EdsioPropTestBytesProperty* prop); +gboolean proptest_get_bytes (PropTest* obj, EdsioPropTestBytesProperty prop, const guint8** arg, guint32* arg_len); +gboolean proptest_set_bytes (PropTest* obj, EdsioPropTestBytesProperty prop, const guint8* arg, guint32 arg_len); +gboolean proptest_unset_bytes (PropTest* obj, EdsioPropTestBytesProperty prop); +gboolean proptest_isset_bytes (PropTest* obj, EdsioPropTestBytesProperty prop); + +/* Property get/set for PropTest/uint + */ + +typedef struct _EdsioPropTestUintProperty EdsioPropTestUintProperty; +struct _EdsioPropTestUintProperty { guint32 code; }; + +gboolean edsio_new_proptest_uint_property (const char* name, guint32 flags, EdsioPropTestUintProperty* prop); +gboolean proptest_get_uint (PropTest* obj, EdsioPropTestUintProperty prop, guint32* arg); +gboolean proptest_set_uint (PropTest* obj, EdsioPropTestUintProperty prop, guint32 arg); +gboolean proptest_unset_uint (PropTest* obj, EdsioPropTestUintProperty prop); +gboolean proptest_isset_uint (PropTest* obj, EdsioPropTestUintProperty prop); + +/* Serial Types */ + +enum _SerialEdsioType { + + ST_EdsioUint = (1<<(1+EDSIO_LIBRARY_OFFSET_BITS))+6, + ST_EdsioBytes = (1<<(2+EDSIO_LIBRARY_OFFSET_BITS))+6, + ST_EdsioString = (1<<(3+EDSIO_LIBRARY_OFFSET_BITS))+6, + ST_GenericTime = (1<<(4+EDSIO_LIBRARY_OFFSET_BITS))+6 +}; + + + +/* EdsioUint Structure + */ + +struct _SerialEdsioUint { + guint32 val; +}; + +void serializeio_print_edsiouint_obj (SerialEdsioUint* obj, guint indent_spaces); + +gboolean unserialize_edsiouint (SerialSource *source, SerialEdsioUint**); +gboolean unserialize_edsiouint_internal (SerialSource *source, SerialEdsioUint** ); +gboolean unserialize_edsiouint_internal_noalloc (SerialSource *source, SerialEdsioUint* ); +gboolean serialize_edsiouint (SerialSink *sink, guint32 val); +gboolean serialize_edsiouint_obj (SerialSink *sink, const SerialEdsioUint* obj); +gboolean serialize_edsiouint_internal (SerialSink *sink, guint32 val); +gboolean serialize_edsiouint_obj_internal (SerialSink *sink, SerialEdsioUint* obj); +guint serializeio_count_edsiouint (guint32 val); +guint serializeio_count_edsiouint_obj (SerialEdsioUint const* obj); + +/* EdsioBytes Structure + */ + +struct _SerialEdsioBytes { + guint32 val_len; + const guint8* val; +}; + +void serializeio_print_edsiobytes_obj (SerialEdsioBytes* obj, guint indent_spaces); + +gboolean unserialize_edsiobytes (SerialSource *source, SerialEdsioBytes**); +gboolean unserialize_edsiobytes_internal (SerialSource *source, SerialEdsioBytes** ); +gboolean unserialize_edsiobytes_internal_noalloc (SerialSource *source, SerialEdsioBytes* ); +gboolean serialize_edsiobytes (SerialSink *sink, guint32 val_len, const guint8* val); +gboolean serialize_edsiobytes_obj (SerialSink *sink, const SerialEdsioBytes* obj); +gboolean serialize_edsiobytes_internal (SerialSink *sink, guint32 val_len, const guint8* val); +gboolean serialize_edsiobytes_obj_internal (SerialSink *sink, SerialEdsioBytes* obj); +guint serializeio_count_edsiobytes (guint32 val_len, const guint8* val); +guint serializeio_count_edsiobytes_obj (SerialEdsioBytes const* obj); + +/* EdsioString Structure + */ + +struct _SerialEdsioString { + const gchar* val; +}; + +void serializeio_print_edsiostring_obj (SerialEdsioString* obj, guint indent_spaces); + +gboolean unserialize_edsiostring (SerialSource *source, SerialEdsioString**); +gboolean unserialize_edsiostring_internal (SerialSource *source, SerialEdsioString** ); +gboolean unserialize_edsiostring_internal_noalloc (SerialSource *source, SerialEdsioString* ); +gboolean serialize_edsiostring (SerialSink *sink, const gchar* val); +gboolean serialize_edsiostring_obj (SerialSink *sink, const SerialEdsioString* obj); +gboolean serialize_edsiostring_internal (SerialSink *sink, const gchar* val); +gboolean serialize_edsiostring_obj_internal (SerialSink *sink, SerialEdsioString* obj); +guint serializeio_count_edsiostring (const gchar* val); +guint serializeio_count_edsiostring_obj (SerialEdsioString const* obj); + +/* GenericTime Structure + */ + +struct _SerialGenericTime { + guint32 seconds; + guint32 nanos; +}; + +void serializeio_print_generictime_obj (SerialGenericTime* obj, guint indent_spaces); + +gboolean unserialize_generictime (SerialSource *source, SerialGenericTime**); +gboolean unserialize_generictime_internal (SerialSource *source, SerialGenericTime** ); +gboolean unserialize_generictime_internal_noalloc (SerialSource *source, SerialGenericTime* ); +gboolean serialize_generictime (SerialSink *sink, guint32 seconds, guint32 nanos); +gboolean serialize_generictime_obj (SerialSink *sink, const SerialGenericTime* obj); +gboolean serialize_generictime_internal (SerialSink *sink, guint32 seconds, guint32 nanos); +gboolean serialize_generictime_obj_internal (SerialSink *sink, SerialGenericTime* obj); +guint serializeio_count_generictime (guint32 seconds, guint32 nanos); +guint serializeio_count_generictime_obj (SerialGenericTime const* obj); + +void edsio_generate_errno_event_internal (EdsioErrnoEventCode code, const char* srcfile, gint srcline); +#define edsio_generate_errno_event(ecode) edsio_generate_errno_event_internal((ecode),__FILE__,__LINE__) + +extern const EdsioErrnoEventCode EC_EdsioGetTimeOfDayFailure; +#define EC_EdsioGetTimeOfDayFailureValue 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 + */ + +#include "edsio.h" + +void +test1 () +{ + guint32 x = 0; + + PropTest *pt = g_new0 (PropTest, 1); + + EdsioPropTestUintProperty prop; + + g_assert (edsio_edsio_init ()); + + g_assert (edsio_new_proptest_uint_property ("Just testing (1)...", PF_Persistent, & prop)); + + g_assert (! proptest_isset_uint (pt, prop)); + + g_assert (proptest_set_uint (pt, prop, 42)); + + g_assert (proptest_isset_uint (pt, prop)); + + g_assert (proptest_get_uint (pt, prop, & x) && x == 42); + + /* kill the cache, to test persistence. */ + pt->_edsio_property_table = NULL; + + g_assert (proptest_get_uint (pt, prop, & x) && x == 42); + + g_assert (proptest_unset_uint (pt, prop)); + + g_assert (! proptest_isset_uint (pt, prop)); + + g_assert (! pt->_edsio_property_table); +} + +void +test2 () +{ + const char* str = "hello there"; + const char* str2; + guint32 str2_len; + + PropTest *pt = g_new0 (PropTest, 1); + + EdsioPropTestBytesProperty prop; + + g_assert (edsio_edsio_init ()); + + g_assert (edsio_new_proptest_bytes_property ("Just testing (2)...", PF_Persistent, & prop)); + + g_assert (! proptest_isset_bytes (pt, prop)); + + g_assert (proptest_set_bytes (pt, prop, (guint8*) str, strlen (str) + 1)); + + g_assert (proptest_isset_bytes (pt, prop)); + + g_assert (proptest_get_bytes (pt, prop, (const guint8**) & str2, & str2_len) && str2_len == (strlen (str) + 1) && strcmp (str, str2) == 0); + + /* kill the cache, to test persistence. */ + pt->_edsio_property_table = NULL; + + g_assert (proptest_get_bytes (pt, prop, (const guint8**) & str2, & str2_len) && str2_len == (strlen (str) + 1) && strcmp (str, str2) == 0); + + g_assert (proptest_unset_bytes (pt, prop)); + + g_assert (! proptest_isset_bytes (pt, prop)); + + g_assert (! pt->_edsio_property_table); +} + +void +test3 () +{ + SerialEdsioUint x; + SerialEdsioUint *p; + EdsioPropTestEdsioUintProperty prop; + + PropTest *pt = g_new0 (PropTest, 1); + + x.val = 42; + + g_assert (edsio_edsio_init ()); + + g_assert (edsio_new_proptest_edsiouint_property ("Just testing (3)...", PF_Persistent, & prop)); + + g_assert (! proptest_isset_edsiouint (pt, prop)); + + g_assert (proptest_set_edsiouint (pt, prop, & x)); + + g_assert (proptest_isset_edsiouint (pt, prop)); + + g_assert (proptest_get_edsiouint (pt, prop, & p) && x.val == p->val); + + /* kill the cache, to test persistence. */ + pt->_edsio_property_table = NULL; + + g_assert (proptest_get_edsiouint (pt, prop, & p) && x.val == p->val); + + g_assert (proptest_unset_edsiouint (pt, prop)); + + g_assert (! proptest_isset_edsiouint (pt, prop)); + + g_assert (! pt->_edsio_property_table); +} + +void +test4 () +{ + const char* str = "hello there"; + const char* str2; + + PropTest *pt = g_new0 (PropTest, 1); + + EdsioPropTestStringProperty prop; + + g_assert (edsio_edsio_init ()); + + g_assert (edsio_new_proptest_string_property ("Just testing (4)...", PF_Persistent, & prop)); + + g_assert (! proptest_isset_string (pt, prop)); + + g_assert (proptest_set_string (pt, prop, str)); + + g_assert (proptest_isset_string (pt, prop)); + + g_assert (proptest_get_string (pt, prop, & str2) && strcmp (str, str2) == 0); + + /* kill the cache, to test persistence. */ + pt->_edsio_property_table = NULL; + + g_assert (proptest_get_string (pt, prop, & str2) && strcmp (str, str2) == 0); + + g_assert (proptest_unset_string (pt, prop)); + + g_assert (! proptest_isset_string (pt, prop)); + + g_assert (! pt->_edsio_property_table); +} + +void test5 () +{ + GByteArray* sink_result; + SerialSink* sink = edsio_simple_sink (NULL, SBF_Checksum | SBF_Base64 | SBF_Compress, FALSE, NULL, & sink_result); + SerialSource* src; + const char* input = "hello there!!!!!!!!"; + SerialEdsioString *output; + guint8 zero[1]; + zero[0] = 0; + + g_assert (serialize_edsiostring (sink, input)); + + g_assert (sink->sink_close (sink)); + + g_byte_array_append (sink_result, zero, 1); + + g_print ("%s -> %s\n", input, sink_result->data); + + src = edsio_simple_source (sink_result->data, sink_result->len - 1, SBF_Checksum | SBF_Base64 | SBF_Compress); + + g_assert (unserialize_edsiostring (src, & output)); + + g_assert (src->source_close (src)); + + g_assert (strcmp (output->val, input) == 0); +} + +void +test6 () +{ + const char* md5str = "aed3918c4ccb89f2dcf74d5dcab22989"; + const char* md5strbad1 = "aed3918c4cXb89f2dcf74d5dcab22989"; + const char* md5strbad2 = "aed3918c4cab89f2dcf74d5dcab22989X"; + const char* md5strbad3 = "aed3918c4cab89f2dcf74d5dcab2298"; + char md5str2[33]; + guint8 md5[16]; + + g_assert (! edsio_md5_from_string (md5, md5strbad1)); + g_assert (! edsio_md5_from_string (md5, md5strbad2)); + g_assert (! edsio_md5_from_string (md5, md5strbad3)); + + g_assert (edsio_md5_from_string (md5, md5str)); + + edsio_md5_to_string (md5, md5str2); + + g_assert (strcmp (md5str, md5str2) == 0); +} + +int +main () +{ + test1 (); + + test2 (); + + test3 (); + + test4 (); + + test5 (); + + test6 (); + + return 0; +} diff --git a/xdelta-1.1.3/libedsio/fh.c b/xdelta-1.1.3/libedsio/fh.c new file mode 100644 index 0000000..80b0651 --- /dev/null +++ b/xdelta-1.1.3/libedsio/fh.c @@ -0,0 +1,164 @@ +/* -*-Mode: C;-*- + * $Id: fh.c,v 1.1 2004/01/05 18:54:23 icculus Exp $ + * + * Copyright (C) 1998, 1999, Josh MacDonald. + * All Rights Reserved. + * + * Author: Josh MacDonald + */ + +#include "edsio.h" + +/* Handle source/sink impls + */ +typedef struct _HandleSerialSource HandleSerialSource; +typedef struct _HandleSerialSink HandleSerialSink; + +struct _HandleSerialSource { + SerialSource source; + + FileHandle* fh; +}; + +struct _HandleSerialSink { + SerialSink sink; + + FileHandle* fh; + gpointer data1; + gpointer data2; + gpointer data3; + gboolean (* cont_onclose) (gpointer data1, gpointer data2, gpointer data3); +}; + +static SerialType handle_source_type (SerialSource* source, gboolean set_allocation); +static gboolean handle_source_close (SerialSource* source); +static gboolean handle_source_read (SerialSource* source, guint8 *ptr, guint32 len); +static void handle_source_free (SerialSource* source); + +static gboolean handle_sink_type (SerialSink* sink, SerialType type, guint len, gboolean set_allocation); +static gboolean handle_sink_close (SerialSink* sink); +static gboolean handle_sink_write (SerialSink* sink, const guint8 *ptr, guint32 len); +static void handle_sink_free (SerialSink* sink); + +SerialSource* +handle_source (FileHandle* fh) +{ + HandleSerialSource* it = g_new0 (HandleSerialSource, 1); + + serializeio_source_init (&it->source, + handle_source_type, + handle_source_close, + handle_source_read, + handle_source_free, + NULL, + NULL); + + it->fh = fh; + + return &it->source; +} + +SerialSink* +handle_sink (FileHandle* fh, gpointer data1, gpointer data2, gpointer data3, gboolean (* cont_onclose) (gpointer data1, gpointer data2, gpointer data3)) +{ + HandleSerialSink* it = g_new0 (HandleSerialSink, 1); + + serializeio_sink_init (&it->sink, + handle_sink_type, + handle_sink_close, + handle_sink_write, + handle_sink_free, + NULL); + + it->fh = fh; + it->data1 = data1; + it->data2 = data2; + it->data3 = data3; + it->cont_onclose = cont_onclose; + + return &it->sink; +} + +SerialType +handle_source_type (SerialSource* source, gboolean set_allocation) +{ + HandleSerialSource* ssource = (HandleSerialSource*) source; + guint32 x; + + if (! ssource->fh->table->table_handle_getui (ssource->fh, &x)) + return ST_Error; + + if (set_allocation) + { + if (! ssource->fh->table->table_handle_getui (ssource->fh, &source->alloc_total)) + return ST_Error; + } + + return x; +} + +gboolean +handle_source_close (SerialSource* source) +{ + HandleSerialSource* ssource = (HandleSerialSource*) source; + + return ssource->fh->table->table_handle_close (ssource->fh, 0); +} + +gboolean +handle_source_read (SerialSource* source, guint8 *ptr, guint32 len) +{ + HandleSerialSource* ssource = (HandleSerialSource*) source; + + return ssource->fh->table->table_handle_read (ssource->fh, ptr, len) == len; +} + +void +handle_source_free (SerialSource* source) +{ + g_free (source); +} + +gboolean +handle_sink_type (SerialSink* sink, SerialType type, guint len, gboolean set_allocation) +{ + HandleSerialSink* ssink = (HandleSerialSink*) sink; + + if (! ssink->fh->table->table_handle_putui (ssink->fh, type)) + return FALSE; + + if (set_allocation && ! ssink->fh->table->table_handle_putui (ssink->fh, len)) + return FALSE; + + return TRUE; +} + +gboolean +handle_sink_close (SerialSink* sink) +{ + HandleSerialSink* ssink = (HandleSerialSink*) sink; + + if (ssink->fh->table->table_handle_close (ssink->fh, 0)) + { + if (ssink->cont_onclose) + return ssink->cont_onclose (ssink->data1, ssink->data2, ssink->data3); + + return TRUE; + } + + return FALSE; +} + +gboolean +handle_sink_write (SerialSink* sink, const guint8 *ptr, guint32 len) +{ + HandleSerialSink* ssink = (HandleSerialSink*) sink; + + return ssink->fh->table->table_handle_write (ssink->fh, ptr, len); +} + +void +handle_sink_free (SerialSink* sink) +{ + g_free (sink); +} diff --git a/xdelta-1.1.3/libedsio/fh.lo b/xdelta-1.1.3/libedsio/fh.lo new file mode 100644 index 0000000..9788f70 --- /dev/null +++ b/xdelta-1.1.3/libedsio/fh.lo @@ -0,0 +1 @@ +timestamp diff --git a/xdelta-1.1.3/libedsio/generic.c b/xdelta-1.1.3/libedsio/generic.c new file mode 100644 index 0000000..35c0920 --- /dev/null +++ b/xdelta-1.1.3/libedsio/generic.c @@ -0,0 +1,263 @@ +/* -*-Mode: C;-*- + * $Id: generic.c,v 1.1 2004/01/05 18:54:23 icculus Exp $ + * + * Copyright (C) 1998, 1999, Josh MacDonald. + * All Rights Reserved. + * + * Author: Josh MacDonald + */ + +#include "edsio.h" + +/* Type-based selectors for unknown types + */ + +typedef struct { + const char* name; + gboolean (*unserialize_func) (); + gboolean (*serialize_func) (); + guint (*count_func) (); + void (*print_func) (); + guint32 val; +} SerEntry; + +static GArray *ser_array; +static gboolean ser_array_sorted; + +void serializeio_source_reset_allocation (SerialSource* source); + +void +serializeio_initialize_type (const char* name, + guint32 val, + gboolean (*unserialize_func) (), + gboolean (*serialize_func) (), + guint (*count_func) (), + void (*print_func) ()) +{ + SerEntry it; + + it.name = name; + it.val = val; + it.unserialize_func = unserialize_func; + it.serialize_func = serialize_func; + it.count_func = count_func; + it.print_func = print_func; + + if (ser_array == NULL) + ser_array = g_array_new (FALSE, TRUE, sizeof (SerEntry)); + + g_array_append_val (ser_array, it); + + ser_array_sorted = FALSE; +} + +static int +ser_entry_compare (const void* va, const void* vb) +{ + SerEntry* a = (SerEntry*) va; + SerEntry* b = (SerEntry*) vb; + + return a->val - b->val; +} + +static SerEntry* +serializeio_find_entry (SerialType type) +{ + if (! edsio_library_check (type & EDSIO_LIBRARY_OFFSET_MASK)) + return NULL; + + if (ser_array) + { + gint high_index = ser_array->len; + gint low_index = 0; + gint index; + gint this_val; + + if (! ser_array_sorted) + { + ser_array_sorted = TRUE; + qsort (ser_array->data, ser_array->len, sizeof (SerEntry), ser_entry_compare); + } + + again: + + index = (low_index + high_index) / 2; + + this_val = g_array_index (ser_array, SerEntry, index).val; + + if (this_val < type) + { + low_index = index + 1; + goto again; + } + else if (this_val > type) + { + high_index = index - 1; + goto again; + } + else + { + return & g_array_index (ser_array, SerEntry, index); + } + } + + edsio_generate_intint_event (EC_EdsioUnregisteredType, + type & EDSIO_LIBRARY_OFFSET_MASK, + type >> EDSIO_LIBRARY_OFFSET_BITS); + return NULL; +} + +gboolean +serializeio_unserialize_generic_internal (SerialSource *source, + SerialType *object_type, + void **object, + gboolean set_allocation) +{ + SerialType type = (* source->source_type) (source, set_allocation); + SerEntry* ent; + gboolean res = FALSE; + + if (type < 0) + return FALSE; + + ent = serializeio_find_entry (type); + + (*object_type) = type; + + if (ent) + { + res = ent->unserialize_func (source, object); + + if (set_allocation && res) + { + if (! serializeio_source_object_received (source)) + return FALSE; + } + } + + if (set_allocation) + serializeio_source_reset_allocation (source); + + return res; +} + +gboolean +serializeio_unserialize_generic (SerialSource *source, + SerialType *object_type, + void **object) +{ + return serializeio_unserialize_generic_internal (source, object_type, object, TRUE); +} + +gboolean +serializeio_serialize_generic (SerialSink *sink, + SerialType object_type, + void *object) +{ + return serializeio_serialize_generic_internal (sink, object_type, object, TRUE); +} + +gboolean +serializeio_serialize_generic_internal (SerialSink *sink, + SerialType object_type, + void *object, + gboolean set_allocation) +{ + SerEntry* ent; + gboolean res = FALSE; + + if (! (* sink->sink_type) (sink, object_type, set_allocation ? serializeio_generic_count (object_type, object) : 0, set_allocation)) + return FALSE; + + ent = serializeio_find_entry (object_type); + + if (ent) + res = ent->serialize_func (sink, object); + + return res; +} + +const char* +serializeio_generic_type_to_string (SerialType type) +{ + SerEntry* ent; + const char* res = "*Unknown*"; + + ent = serializeio_find_entry (type); + + if (ent) + res = ent->name; + + return res; +} + +guint +serializeio_generic_count (SerialType object_type, + void *object) +{ + SerEntry* ent; + gboolean res = FALSE; + + ent = serializeio_find_entry (object_type); + + if (ent) + res = ent->count_func (object); + + return res; +} + +void +serializeio_generic_print (SerialType type, void* object, guint indent_spaces) +{ + SerEntry* ent; + + ent = serializeio_find_entry (type); + + if (ent) + ent->print_func (object, indent_spaces); + else + { + int i = 0; + + for (; i < indent_spaces; i += 1) + g_print (" "); + + g_print ("*Type Not Registered*\n"); + } +} + +gboolean +serializeio_unserialize_generic_acceptable (SerialSource *source, + guint32 accept, + SerialType *object_type, + void **object) +{ + gboolean s; + + s = serializeio_unserialize_generic (source, object_type, object); + + if (s) + { + if (accept != -1) + { + if ((*object_type & EDSIO_LIBRARY_OFFSET_MASK) != (accept & EDSIO_LIBRARY_OFFSET_MASK)) + { + edsio_generate_intint_event (EC_EdsioUnexpectedLibraryType, + accept & EDSIO_LIBRARY_OFFSET_MASK, + *object_type & EDSIO_LIBRARY_OFFSET_MASK); + + return FALSE; + } + + if (! ((*object_type & ~EDSIO_LIBRARY_OFFSET_MASK) | + (accept & ~EDSIO_LIBRARY_OFFSET_MASK))) + { + edsio_generate_void_event (EC_EdsioUnexpectedType); + + return FALSE; + } + } + } + + return s; +} diff --git a/xdelta-1.1.3/libedsio/generic.lo b/xdelta-1.1.3/libedsio/generic.lo new file mode 100644 index 0000000..9788f70 --- /dev/null +++ b/xdelta-1.1.3/libedsio/generic.lo @@ -0,0 +1 @@ +timestamp diff --git a/xdelta-1.1.3/libedsio/libedsio.la b/xdelta-1.1.3/libedsio/libedsio.la new file mode 100644 index 0000000..39098fd --- /dev/null +++ b/xdelta-1.1.3/libedsio/libedsio.la @@ -0,0 +1,28 @@ +# libedsio.la - a libtool library file +# Generated by ltmain.sh - GNU libtool 1.3.3 (1.385.2.181 1999/07/02 15:49:11) +# +# Please DO NOT delete this file! +# It is necessary for linking the library. + +# The name that we can dlopen(3). +dlname='' + +# Names of this library. +library_names='' + +# The name of the static archive. +old_library='libedsio.a' + +# Libraries that this one depends upon. +dependency_libs=' -L/usr/local/lib -lglib' + +# Version information for libedsio. +current=0 +age=0 +revision=0 + +# Is this an already installed library? +installed=no + +# Directory that this library needs to be installed in: +libdir='/usr/local/lib' diff --git a/xdelta-1.1.3/libedsio/library.c b/xdelta-1.1.3/libedsio/library.c new file mode 100644 index 0000000..0e83995 --- /dev/null +++ b/xdelta-1.1.3/libedsio/library.c @@ -0,0 +1,121 @@ +/* -*-Mode: C;-*- + * $Id: library.c,v 1.1 2004/01/05 18:54:23 icculus Exp $ + * + * Copyright (C) 1998, 1999, Josh MacDonald. + * All Rights Reserved. + * + * Author: Josh MacDonald + */ + +#include "edsio.h" +#include + +typedef struct _Library Library; + +struct _Library { + const char* name; + const char* libname; + gint index; + gboolean loaded; +}; + +static Library known_libraries[] = { + { "xd", "xdelta", 3 }, + { "edsio", "edsio", 6 }, +}; + +static GHashTable* loaded_libraries; + +static void +edsio_library_init () +{ + if (! loaded_libraries) + { + gint i; + gint n = sizeof (known_libraries) / sizeof (Library);; + + loaded_libraries = g_hash_table_new (g_int_hash, g_int_equal); + + for (i = 0; i < n; i += 1) + { + Library* lib = known_libraries + i; + + g_hash_table_insert (loaded_libraries, & lib->index, lib); + } + } +} + +void +edsio_library_register (guint32 number, const char* name) +{ + Library* lib; + + edsio_library_init (); + + lib = g_hash_table_lookup (loaded_libraries, & number); + + if (lib) + { + lib->loaded = TRUE; + return; + } + + lib = g_new0 (Library, 1); + + lib->index = number; + lib->name = name; + lib->loaded = TRUE; + + g_hash_table_insert (loaded_libraries, & lib->index, lib); +} + +gboolean +edsio_library_check (guint32 number) +{ + Library* lib; + + edsio_library_init (); + + lib = g_hash_table_lookup (loaded_libraries, & number); + + if (lib) + { + lib->loaded = TRUE; + return TRUE; + } + +#if 0 + if (lib->libname && g_module_supported ()) + { + GModule *module; + GString *module_name = g_string_new (NULL); + GString *symbol_name = g_string_new (NULL); + gboolean (* init) (void); + + if (! (module = g_module_open (module_name->str, 0))) + { + edsio_generate_stringstring_event (EC_EdsioGModuleError, module_name->str, g_module_error ()); + return FALSE; + } + + if (! g_module_symbol (module, + symbol_name->str, + (void**) & init)) + { + edsio_generate_stringstring_event (EC_EdsioGModuleError, g_module_name (module), g_module_error ()); + return FALSE; + } + + g_module_make_resident (module); + + g_module_close (module); + + lib->loaded = TRUE; + + return (* init) (); + } +#endif + + edsio_generate_int_event (EC_EdsioUnregisteredLibrary, number); + return FALSE; +} diff --git a/xdelta-1.1.3/libedsio/library.lo b/xdelta-1.1.3/libedsio/library.lo new file mode 100644 index 0000000..9788f70 --- /dev/null +++ b/xdelta-1.1.3/libedsio/library.lo @@ -0,0 +1 @@ +timestamp diff --git a/xdelta-1.1.3/libedsio/maketime.c b/xdelta-1.1.3/libedsio/maketime.c new file mode 100644 index 0000000..8c83b2c --- /dev/null +++ b/xdelta-1.1.3/libedsio/maketime.c @@ -0,0 +1,391 @@ +/* Convert struct partime into time_t. */ + +/* Copyright 1992, 1993, 1994, 1995, 1997 Paul Eggert + Distributed under license by the Free Software Foundation, Inc. + + This file is part of RCS. + + RCS is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2, or (at your option) + any later version. + + RCS is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with RCS; see the file COPYING. + If not, write to the Free Software Foundation, + 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + + Report problems and direct all questions to: + + rcs-bugs@cs.purdue.edu + + */ + +#if has_conf_h +# include +#else +# if HAVE_CONFIG_H +# include +# else +# ifndef __STDC__ +# define const +# endif +# endif + /* MIPS RISCOS4.52 defines time_t in not . */ +# include +# if HAVE_LIMITS_H +# include +# endif +# ifndef LONG_MIN +# define LONG_MIN (-1-2147483647L) +# endif +# if STDC_HEADERS +# include +# endif +# include +# ifdef __STDC__ +# define P(x) x +# else +# define P(x) () +# endif +#endif + +#include +#include + +char const maketId[] = + "$Id: maketime.c,v 1.1 2004/01/05 18:54:23 icculus Exp $"; + +static int isleap P ((int)); +static int month_days P ((struct tm const *)); +static time_t maketime P ((struct partime const *, time_t)); + +/* For maximum portability, use only localtime and gmtime. + Make no assumptions about the time_t epoch or the range of time_t values. + Avoid mktime because it's not universal and because there's no easy, + portable way for mktime to yield the inverse of gmtime. */ + +#define TM_YEAR_ORIGIN 1900 + +static int +isleap (y) + int y; +{ + return (y & 3) == 0 && (y % 100 != 0 || y % 400 == 0); +} + +/* days in year before start of months 0-12 */ +static int const month_yday[] = +{ + 0, 31, 59, 90, 120, 151, 181, 212, 243, 273, 304, 334, 365 +}; + +/* Yield the number of days in TM's month. */ +static int +month_days (tm) + struct tm const *tm; +{ + int m = tm->tm_mon; + return (month_yday[m + 1] - month_yday[m] + + (m == 1 && isleap (tm->tm_year + TM_YEAR_ORIGIN))); +} + +/* Convert UNIXTIME to struct tm form. + Use gmtime if available and if !LOCALZONE, localtime otherwise. */ +struct tm * +time2tm (unixtime, localzone) + time_t unixtime; + int localzone; +{ + struct tm *tm; +#ifdef TZ_is_unset + static char const *TZ; + if (!TZ && !(TZ = getenv ("TZ"))) + TZ_is_unset ("The TZ environment variable is not set; please set it to your timezone"); +#endif + if (localzone || !(tm = gmtime (&unixtime))) + tm = localtime (&unixtime); + return tm; +} + +/* Yield A - B, measured in seconds. */ +time_t +difftm (a, b) + struct tm const *a; + struct tm const *b; +{ + int ay = a->tm_year + (TM_YEAR_ORIGIN - 1); + int by = b->tm_year + (TM_YEAR_ORIGIN - 1); + int ac = ay / 100 - (ay % 100 < 0); + int bc = by / 100 - (by % 100 < 0); + int difference_in_day_of_year = a->tm_yday - b->tm_yday; + int intervening_leap_days = (((ay >> 2) - (by >> 2)) + - (ac - bc) + + ((ac >> 2) - (bc >> 2))); + time_t difference_in_years = ay - by; + time_t difference_in_days + = (difference_in_years * 365 + + (intervening_leap_days + difference_in_day_of_year)); + return (((((difference_in_days * 24 + + (a->tm_hour - b->tm_hour)) + * 60) + + (a->tm_min - b->tm_min)) + * 60) + + (a->tm_sec - b->tm_sec)); +} + +/* + * Adjust time T by adding SECONDS. SECONDS must be at most 24 hours' worth. + * Adjust only T's year, mon, mday, hour, min and sec members; + * plus adjust wday if it is defined. + */ +void +adjzone (t, seconds) + register struct tm *t; + long seconds; +{ + /* + * This code can be off by a second if SECONDS is not a multiple of 60, + * if T is local time, and if a leap second happens during this minute. + * But this bug has never occurred, and most likely will not ever occur. + * Liberia, the last country for which SECONDS % 60 was nonzero, + * switched to UTC in May 1972; the first leap second was in June 1972. + */ + int leap_second = t->tm_sec == 60; + long sec = seconds + (t->tm_sec - leap_second); + if (sec < 0) + { + if ((t->tm_min -= (59 - sec) / 60) < 0) + { + if ((t->tm_hour -= (59 - t->tm_min) / 60) < 0) + { + t->tm_hour += 24; + if (TM_DEFINED (t->tm_wday) && --t->tm_wday < 0) + t->tm_wday = 6; + if (--t->tm_mday <= 0) + { + if (--t->tm_mon < 0) + { + --t->tm_year; + t->tm_mon = 11; + } + t->tm_mday = month_days (t); + } + } + t->tm_min += 24 * 60; + } + sec += 24L * 60 * 60; + } + else if (60 <= (t->tm_min += sec / 60)) + if (24 <= (t->tm_hour += t->tm_min / 60)) + { + t->tm_hour -= 24; + if (TM_DEFINED (t->tm_wday) && ++t->tm_wday == 7) + t->tm_wday = 0; + if (month_days (t) < ++t->tm_mday) + { + if (11 < ++t->tm_mon) + { + ++t->tm_year; + t->tm_mon = 0; + } + t->tm_mday = 1; + } + } + t->tm_min %= 60; + t->tm_sec = (int) (sec % 60) + leap_second; +} + +/* + * Convert TM to time_t, using localtime if LOCALZONE and gmtime otherwise. + * Use only TM's year, mon, mday, hour, min, and sec members. + * Ignore TM's old tm_yday and tm_wday, but fill in their correct values. + * Yield -1 on failure (e.g. a member out of range). + * Posix 1003.1-1990 doesn't allow leap seconds, but some implementations + * have them anyway, so allow them if localtime/gmtime does. + */ +time_t +tm2time (tm, localzone) + struct tm *tm; + int localzone; +{ + /* Cache the most recent t,tm pairs; 1 for gmtime, 1 for localtime. */ + static time_t t_cache[2]; + static struct tm tm_cache[2]; + + time_t d, gt; + struct tm const *gtm; + /* + * The maximum number of iterations should be enough to handle any + * combinations of leap seconds, time zone rule changes, and solar time. + * 4 is probably enough; we use a bigger number just to be safe. + */ + int remaining_tries = 8; + + /* Avoid subscript errors. */ + if (12 <= (unsigned) tm->tm_mon) + return -1; + + tm->tm_yday = month_yday[tm->tm_mon] + tm->tm_mday + - (tm->tm_mon < 2 || !isleap (tm->tm_year + TM_YEAR_ORIGIN)); + + /* Make a first guess. */ + gt = t_cache[localzone]; + gtm = gt ? &tm_cache[localzone] : time2tm (gt, localzone); + + /* Repeatedly use the error from the guess to improve the guess. */ + while ((d = difftm (tm, gtm)) != 0) + { + if (--remaining_tries == 0) + return -1; + gt += d; + gtm = time2tm (gt, localzone); + } + + /* + * Check that the guess actually matches; + * overflow can cause difftm to yield 0 even on differing times, + * or tm may have members out of range (e.g. bad leap seconds). + */ +#define TM_DIFFER(a,b) \ + ( \ + ((a)->tm_year ^ (b)->tm_year) | \ + ((a)->tm_mon ^ (b)->tm_mon) | \ + ((a)->tm_mday ^ (b)->tm_mday) | \ + ((a)->tm_hour ^ (b)->tm_hour) | \ + ((a)->tm_min ^ (b)->tm_min) | \ + ((a)->tm_sec ^ (b)->tm_sec) \ + ) + if (TM_DIFFER (tm, gtm)) + { + /* + * If gt is a leap second, try gt+1; if it is one greater than + * a leap second, try gt-1; otherwise, it doesn't matter. + * Leap seconds always fall at month end. + */ + int yd = tm->tm_year - gtm->tm_year; + gt += yd + (yd ? 0 : tm->tm_mon - gtm->tm_mon); + gtm = time2tm (gt, localzone); + if (TM_DIFFER (tm, gtm)) + return -1; + } + t_cache[localzone] = gt; + tm_cache[localzone] = *gtm; + + tm->tm_wday = gtm->tm_wday; + return gt; +} + +/* + * Check *PT and convert it to time_t. + * If it is incompletely specified, use DEFAULT_TIME to fill it out. + * Use localtime if PT->zone is the special value TM_LOCAL_ZONE. + * Yield -1 on failure. + * ISO 8601 day-of-year and week numbers are not yet supported. + */ +static time_t +maketime (pt, default_time) + struct partime const *pt; + time_t default_time; +{ + int localzone, wday; + struct tm tm; + struct tm *tm0 = 0; + time_t r; + + tm0 = 0; /* Keep gcc -Wall happy. */ + localzone = pt->zone == TM_LOCAL_ZONE; + + tm = pt->tm; + + if (TM_DEFINED (pt->ymodulus) || !TM_DEFINED (tm.tm_year)) + { + /* Get tm corresponding to default time. */ + tm0 = time2tm (default_time, localzone); + if (!localzone) + adjzone (tm0, pt->zone); + } + + if (TM_DEFINED (pt->ymodulus)) + tm.tm_year += + (tm0->tm_year + TM_YEAR_ORIGIN) / pt->ymodulus * pt->ymodulus; + else if (!TM_DEFINED (tm.tm_year)) + { + /* Set default year, month, day from current time. */ + tm.tm_year = tm0->tm_year + TM_YEAR_ORIGIN; + if (!TM_DEFINED (tm.tm_mon)) + { + tm.tm_mon = tm0->tm_mon; + if (!TM_DEFINED (tm.tm_mday)) + tm.tm_mday = tm0->tm_mday; + } + } + + /* Convert from partime year (Gregorian) to Posix year. */ + tm.tm_year -= TM_YEAR_ORIGIN; + + /* Set remaining default fields to be their minimum values. */ + if (!TM_DEFINED (tm.tm_mon)) + tm.tm_mon = 0; + if (!TM_DEFINED (tm.tm_mday)) + tm.tm_mday = 1; + if (!TM_DEFINED (tm.tm_hour)) + tm.tm_hour = 0; + if (!TM_DEFINED (tm.tm_min)) + tm.tm_min = 0; + if (!TM_DEFINED (tm.tm_sec)) + tm.tm_sec = 0; + + if (!localzone) + adjzone (&tm, -pt->zone); + wday = tm.tm_wday; + + /* Convert and fill in the rest of the tm. */ + r = tm2time (&tm, localzone); + + /* Check weekday. */ + if (r != -1 && TM_DEFINED (wday) && wday != tm.tm_wday) + return -1; + + return r; +} + +/* Parse a free-format date in SOURCE, yielding a Unix format time. */ +time_t +str2time (source, default_time, default_zone) + char const *source; + time_t default_time; + long default_zone; +{ + struct partime pt; + + if (*partime (source, &pt)) + return -1; + if (pt.zone == TM_UNDEFINED_ZONE) + pt.zone = default_zone; + return maketime (&pt, default_time); +} + +#if TEST +#include +int +main (argc, argv) + int argc; + char **argv; +{ + time_t default_time = time ((time_t *) 0); + long default_zone = argv[1] ? atol (argv[1]) : 0; + char buf[1000]; + while (fgets (buf, sizeof (buf), stdin)) + { + time_t t = str2time (buf, default_time, default_zone); + printf ("%s", asctime (gmtime (&t))); + } + return 0; +} +#endif diff --git a/xdelta-1.1.3/libedsio/maketime.h b/xdelta-1.1.3/libedsio/maketime.h new file mode 100644 index 0000000..3948eda --- /dev/null +++ b/xdelta-1.1.3/libedsio/maketime.h @@ -0,0 +1,39 @@ +/* Yield time_t from struct partime yielded by partime. */ + +/* Copyright 1993, 1994, 1995 Paul Eggert + Distributed under license by the Free Software Foundation, Inc. + + This file is part of RCS. + + RCS is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2, or (at your option) + any later version. + + RCS is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with RCS; see the file COPYING. + If not, write to the Free Software Foundation, + 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + + Report problems and direct all questions to: + + rcs-bugs@cs.purdue.edu + + */ + +#if defined __STDC__ || has_prototypes +# define __MAKETIME_P(x) x +#else +# define __MAKETIME_P(x) () +#endif + +struct tm *time2tm __MAKETIME_P ((time_t, int)); +time_t difftm __MAKETIME_P ((struct tm const *, struct tm const *)); +time_t str2time __MAKETIME_P ((char const *, time_t, long)); +time_t tm2time __MAKETIME_P ((struct tm *, int)); +void adjzone __MAKETIME_P ((struct tm *, long)); diff --git a/xdelta-1.1.3/libedsio/maketime.lo b/xdelta-1.1.3/libedsio/maketime.lo new file mode 100644 index 0000000..9788f70 --- /dev/null +++ b/xdelta-1.1.3/libedsio/maketime.lo @@ -0,0 +1 @@ +timestamp diff --git a/xdelta-1.1.3/libedsio/md5c.c b/xdelta-1.1.3/libedsio/md5c.c new file mode 100644 index 0000000..0a76927 --- /dev/null +++ b/xdelta-1.1.3/libedsio/md5c.c @@ -0,0 +1,298 @@ +/* MD5C.C - RSA Data Security, Inc., MD5 message-digest algorithm + */ + +/* Copyright (C) 1991-2, RSA Data Security, Inc. Created 1991. All + rights reserved. + + License to copy and use this software is granted provided that it + is identified as the "RSA Data Security, Inc. MD5 Message-Digest +Algorithm" in all material mentioning or referencing this software +or this function. + +License is also granted to make and use derivative works provided +that such works are identified as "derived from the RSA Data +Security, Inc. MD5 Message-Digest Algorithm" in all material +mentioning or referencing the derived work. + +RSA Data Security, Inc. makes no representations concerning either +the merchantability of this software or the suitability of this +software for any particular purpose. It is provided "as is" +without express or implied warranty of any kind. + +These notices must be retained in any copies of any part of this +documentation and/or software. +*/ + +#include "edsio.h" +#include + + +/* Constants for MD5Transform routine. + */ +#define S11 7 +#define S12 12 +#define S13 17 +#define S14 22 +#define S21 5 +#define S22 9 +#define S23 14 +#define S24 20 +#define S31 4 +#define S32 11 +#define S33 16 +#define S34 23 +#define S41 6 +#define S42 10 +#define S43 15 +#define S44 21 + +static void MD5Transform (guint32 [4], unsigned const char [64]); +static void Encode (unsigned char *, guint32 *, unsigned int); +static void Decode (guint32 *, unsigned const char *, unsigned int); + +#define MD5_memcpy memcpy +#define MD5_memset memset + +static unsigned char PADDING[64] = { + 0x80, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 +}; + +/* F, G, H and I are basic MD5 functions. + */ +#define F(x, y, z) (((x) & (y)) | ((~x) & (z))) +#define G(x, y, z) (((x) & (z)) | ((y) & (~z))) +#define H(x, y, z) ((x) ^ (y) ^ (z)) +#define I(x, y, z) ((y) ^ ((x) | (~z))) + +/* ROTATE_LEFT rotates x left n bits. + */ +#define ROTATE_LEFT(x, n) (((x) << (n)) | ((x) >> (32-(n)))) + +/* FF, GG, HH, and II transformations for rounds 1, 2, 3, and 4. + Rotation is separate from addition to prevent recomputation. + */ +#define FF(a, b, c, d, x, s, ac) { \ + (a) += F ((b), (c), (d)) + (x) + (guint32)(ac); \ + (a) = ROTATE_LEFT ((a), (s)); \ + (a) += (b); \ + } +#define GG(a, b, c, d, x, s, ac) { \ + (a) += G ((b), (c), (d)) + (x) + (guint32)(ac); \ + (a) = ROTATE_LEFT ((a), (s)); \ + (a) += (b); \ + } +#define HH(a, b, c, d, x, s, ac) { \ + (a) += H ((b), (c), (d)) + (x) + (guint32)(ac); \ + (a) = ROTATE_LEFT ((a), (s)); \ + (a) += (b); \ + } +#define II(a, b, c, d, x, s, ac) { \ + (a) += I ((b), (c), (d)) + (x) + (guint32)(ac); \ + (a) = ROTATE_LEFT ((a), (s)); \ + (a) += (b); \ + } + +/* MD5 initialization. Begins an MD5 operation, writing a new context. + */ +void edsio_md5_init (EdsioMD5Ctx *context) +{ + context->count[0] = context->count[1] = 0; + /* Load magic initialization constants. + */ + context->state[0] = 0x67452301; + context->state[1] = 0xefcdab89; + context->state[2] = 0x98badcfe; + context->state[3] = 0x10325476; +} + +/* MD5 block update operation. Continues an MD5 message-digest + operation, processing another message block, and updating the + context. + */ +void edsio_md5_update (EdsioMD5Ctx *context, const guint8* input, guint inputLen) +{ + unsigned int i, index, partLen; + + /* Compute number of bytes mod 64 */ + index = (unsigned int)((context->count[0] >> 3) & 0x3F); + + /* Update number of bits */ + if ((context->count[0] += ((guint32)inputLen << 3)) + < ((guint32)inputLen << 3)) + context->count[1]++; + context->count[1] += ((guint32)inputLen >> 29); + + partLen = 64 - index; + + /* Transform as many times as possible. + */ + if (inputLen >= partLen) { + MD5_memcpy + ((guint8*)&context->buffer[index], (guint8*)input, partLen); + MD5Transform (context->state, context->buffer); + + for (i = partLen; i + 63 < inputLen; i += 64) + MD5Transform (context->state, &input[i]); + + index = 0; + } + else + i = 0; + + /* Buffer remaining input */ + MD5_memcpy + ((guint8*)&context->buffer[index], (guint8*)&input[i], + inputLen-i); +} + +/* MD5 finalization. Ends an MD5 message-digest operation, writing the + the message digest and zeroizing the context. + */ +void edsio_md5_final (guint8* digest, EdsioMD5Ctx* context) +{ + unsigned char bits[8]; + unsigned int index, padLen; + + /* Save number of bits */ + Encode (bits, context->count, 8); + + /* Pad out to 56 mod 64. + */ + index = (unsigned int)((context->count[0] >> 3) & 0x3f); + padLen = (index < 56) ? (56 - index) : (120 - index); + edsio_md5_update (context, PADDING, padLen); + + /* Append length (before padding) */ + edsio_md5_update (context, bits, 8); + /* Store state in digest */ + Encode (digest, context->state, 16); + + /* Zeroize sensitive information. + */ + MD5_memset ((guint8*)context, 0, sizeof (*context)); +} + +/* MD5 basic transformation. Transforms state based on block. + */ +static void MD5Transform (guint32 state[4], const guint8 block[64]) +{ + guint32 a = state[0], b = state[1], c = state[2], d = state[3], x[16]; + + Decode (x, block, 64); + + /* Round 1 */ + FF (a, b, c, d, x[ 0], S11, 0xd76aa478); /* 1 */ + FF (d, a, b, c, x[ 1], S12, 0xe8c7b756); /* 2 */ + FF (c, d, a, b, x[ 2], S13, 0x242070db); /* 3 */ + FF (b, c, d, a, x[ 3], S14, 0xc1bdceee); /* 4 */ + FF (a, b, c, d, x[ 4], S11, 0xf57c0faf); /* 5 */ + FF (d, a, b, c, x[ 5], S12, 0x4787c62a); /* 6 */ + FF (c, d, a, b, x[ 6], S13, 0xa8304613); /* 7 */ + FF (b, c, d, a, x[ 7], S14, 0xfd469501); /* 8 */ + FF (a, b, c, d, x[ 8], S11, 0x698098d8); /* 9 */ + FF (d, a, b, c, x[ 9], S12, 0x8b44f7af); /* 10 */ + FF (c, d, a, b, x[10], S13, 0xffff5bb1); /* 11 */ + FF (b, c, d, a, x[11], S14, 0x895cd7be); /* 12 */ + FF (a, b, c, d, x[12], S11, 0x6b901122); /* 13 */ + FF (d, a, b, c, x[13], S12, 0xfd987193); /* 14 */ + FF (c, d, a, b, x[14], S13, 0xa679438e); /* 15 */ + FF (b, c, d, a, x[15], S14, 0x49b40821); /* 16 */ + + /* Round 2 */ + GG (a, b, c, d, x[ 1], S21, 0xf61e2562); /* 17 */ + GG (d, a, b, c, x[ 6], S22, 0xc040b340); /* 18 */ + GG (c, d, a, b, x[11], S23, 0x265e5a51); /* 19 */ + GG (b, c, d, a, x[ 0], S24, 0xe9b6c7aa); /* 20 */ + GG (a, b, c, d, x[ 5], S21, 0xd62f105d); /* 21 */ + GG (d, a, b, c, x[10], S22, 0x2441453); /* 22 */ + GG (c, d, a, b, x[15], S23, 0xd8a1e681); /* 23 */ + GG (b, c, d, a, x[ 4], S24, 0xe7d3fbc8); /* 24 */ + GG (a, b, c, d, x[ 9], S21, 0x21e1cde6); /* 25 */ + GG (d, a, b, c, x[14], S22, 0xc33707d6); /* 26 */ + GG (c, d, a, b, x[ 3], S23, 0xf4d50d87); /* 27 */ + GG (b, c, d, a, x[ 8], S24, 0x455a14ed); /* 28 */ + GG (a, b, c, d, x[13], S21, 0xa9e3e905); /* 29 */ + GG (d, a, b, c, x[ 2], S22, 0xfcefa3f8); /* 30 */ + GG (c, d, a, b, x[ 7], S23, 0x676f02d9); /* 31 */ + GG (b, c, d, a, x[12], S24, 0x8d2a4c8a); /* 32 */ + + /* Round 3 */ + HH (a, b, c, d, x[ 5], S31, 0xfffa3942); /* 33 */ + HH (d, a, b, c, x[ 8], S32, 0x8771f681); /* 34 */ + HH (c, d, a, b, x[11], S33, 0x6d9d6122); /* 35 */ + HH (b, c, d, a, x[14], S34, 0xfde5380c); /* 36 */ + HH (a, b, c, d, x[ 1], S31, 0xa4beea44); /* 37 */ + HH (d, a, b, c, x[ 4], S32, 0x4bdecfa9); /* 38 */ + HH (c, d, a, b, x[ 7], S33, 0xf6bb4b60); /* 39 */ + HH (b, c, d, a, x[10], S34, 0xbebfbc70); /* 40 */ + HH (a, b, c, d, x[13], S31, 0x289b7ec6); /* 41 */ + HH (d, a, b, c, x[ 0], S32, 0xeaa127fa); /* 42 */ + HH (c, d, a, b, x[ 3], S33, 0xd4ef3085); /* 43 */ + HH (b, c, d, a, x[ 6], S34, 0x4881d05); /* 44 */ + HH (a, b, c, d, x[ 9], S31, 0xd9d4d039); /* 45 */ + HH (d, a, b, c, x[12], S32, 0xe6db99e5); /* 46 */ + HH (c, d, a, b, x[15], S33, 0x1fa27cf8); /* 47 */ + HH (b, c, d, a, x[ 2], S34, 0xc4ac5665); /* 48 */ + + /* Round 4 */ + II (a, b, c, d, x[ 0], S41, 0xf4292244); /* 49 */ + II (d, a, b, c, x[ 7], S42, 0x432aff97); /* 50 */ + II (c, d, a, b, x[14], S43, 0xab9423a7); /* 51 */ + II (b, c, d, a, x[ 5], S44, 0xfc93a039); /* 52 */ + II (a, b, c, d, x[12], S41, 0x655b59c3); /* 53 */ + II (d, a, b, c, x[ 3], S42, 0x8f0ccc92); /* 54 */ + II (c, d, a, b, x[10], S43, 0xffeff47d); /* 55 */ + II (b, c, d, a, x[ 1], S44, 0x85845dd1); /* 56 */ + II (a, b, c, d, x[ 8], S41, 0x6fa87e4f); /* 57 */ + II (d, a, b, c, x[15], S42, 0xfe2ce6e0); /* 58 */ + II (c, d, a, b, x[ 6], S43, 0xa3014314); /* 59 */ + II (b, c, d, a, x[13], S44, 0x4e0811a1); /* 60 */ + II (a, b, c, d, x[ 4], S41, 0xf7537e82); /* 61 */ + II (d, a, b, c, x[11], S42, 0xbd3af235); /* 62 */ + II (c, d, a, b, x[ 2], S43, 0x2ad7d2bb); /* 63 */ + II (b, c, d, a, x[ 9], S44, 0xeb86d391); /* 64 */ + + state[0] += a; + state[1] += b; + state[2] += c; + state[3] += d; + + /* Zeroize sensitive information. + */ + MD5_memset ((guint8*)x, 0, sizeof (x)); +} + +/* Encodes input (guint32) into output (unsigned char). Assumes len is + a multiple of 4. + */ +static void Encode (output, input, len) + unsigned char *output; + guint32 *input; + unsigned int len; +{ + unsigned int i, j; + + for (i = 0, j = 0; j < len; i++, j += 4) { + output[j] = (unsigned char)(input[i] & 0xff); + output[j+1] = (unsigned char)((input[i] >> 8) & 0xff); + output[j+2] = (unsigned char)((input[i] >> 16) & 0xff); + output[j+3] = (unsigned char)((input[i] >> 24) & 0xff); + } +} + +/* Decodes input (unsigned char) into output (guint32). Assumes len is + a multiple of 4. + */ +static void Decode (output, input, len) + guint32 *output; + unsigned const char *input; + unsigned int len; +{ + unsigned int i, j; + + for (i = 0, j = 0; j < len; i++, j += 4) + output[i] = ((guint32)input[j]) | (((guint32)input[j+1]) << 8) | + (((guint32)input[j+2]) << 16) | (((guint32)input[j+3]) << 24); +} diff --git a/xdelta-1.1.3/libedsio/md5c.lo b/xdelta-1.1.3/libedsio/md5c.lo new file mode 100644 index 0000000..9788f70 --- /dev/null +++ b/xdelta-1.1.3/libedsio/md5c.lo @@ -0,0 +1 @@ +timestamp diff --git a/xdelta-1.1.3/libedsio/partime.c b/xdelta-1.1.3/libedsio/partime.c new file mode 100644 index 0000000..cb54553 --- /dev/null +++ b/xdelta-1.1.3/libedsio/partime.c @@ -0,0 +1,742 @@ +/* Parse a string, yielding a struct partime that describes it. */ + +/* Copyright 1993, 1994, 1995, 1997 Paul Eggert + Distributed under license by the Free Software Foundation, Inc. + + This file is part of RCS. + + RCS is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2, or (at your option) + any later version. + + RCS is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with RCS; see the file COPYING. + If not, write to the Free Software Foundation, + 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + + Report problems and direct all questions to: + + rcs-bugs@cs.purdue.edu + + */ + +#if has_conf_h +# include +#else +# if HAVE_CONFIG_H +# include +# else +# ifndef __STDC__ +# define const +# endif +# endif +# if HAVE_LIMITS_H +# include +# endif +# ifndef LONG_MIN +# define LONG_MIN (-1-2147483647L) +# endif +# if STDC_HEADERS +# include +# endif +# include +# ifdef __STDC__ +# define P(x) x +# else +# define P(x) () +# endif +#endif + +#include +#if STDC_HEADERS +# define CTYPE_DOMAIN(c) 1 +#else +# define CTYPE_DOMAIN(c) ((unsigned) (c) <= 0177) +#endif +#define ISALNUM(c) (CTYPE_DOMAIN (c) && isalnum (c)) +#define ISALPHA(c) (CTYPE_DOMAIN (c) && isalpha (c)) +#define ISSPACE(c) (CTYPE_DOMAIN (c) && isspace (c)) +#define ISUPPER(c) (CTYPE_DOMAIN (c) && isupper (c)) +#define ISDIGIT(c) ((unsigned) (c) - '0' <= 9) + +#include + +char const partimeId[] = + "$Id: partime.c,v 1.1 2004/01/05 18:54:23 icculus Exp $"; + + +/* Lookup tables for names of months, weekdays, time zones. */ + +#define NAME_LENGTH_MAXIMUM 4 + +struct name_val + { + char name[NAME_LENGTH_MAXIMUM]; + int val; + }; + + +static char const *parse_decimal P ((char const *, int, int, int, int, int *, int *)); +static char const *parse_fixed P ((char const *, int, int *)); +static char const *parse_pattern_letter P ((char const *, int, struct partime *)); +static char const *parse_prefix P ((char const *, struct partime *, int *)); +static char const *parse_ranged P ((char const *, int, int, int, int *)); +static int lookup P ((char const *, struct name_val const[])); +static int merge_partime P ((struct partime *, struct partime const *)); +static void undefine P ((struct partime *)); + + +static struct name_val const month_names[] = +{ + {"jan", 0}, + {"feb", 1}, + {"mar", 2}, + {"apr", 3}, + {"may", 4}, + {"jun", 5}, + {"jul", 6}, + {"aug", 7}, + {"sep", 8}, + {"oct", 9}, + {"nov", 10}, + {"dec", 11}, + {"", TM_UNDEFINED} +}; + +static struct name_val const weekday_names[] = +{ + {"sun", 0}, + {"mon", 1}, + {"tue", 2}, + {"wed", 3}, + {"thu", 4}, + {"fri", 5}, + {"sat", 6}, + {"", TM_UNDEFINED} +}; + +#define hr60nonnegative(t) ((t)/100 * 60 + (t)%100) +#define hr60(t) ((t)<0 ? -hr60nonnegative(-(t)) : hr60nonnegative(t)) +#define zs(t,s) {s, hr60(t)} +#define zd(t,s,d) zs(t, s), zs((t)+100, d) + +static struct name_val const zone_names[] = +{ + zs (-1000, "hst"), /* Hawaii */ + zd (-1000, "hast", "hadt"), /* Hawaii-Aleutian */ + zd (- 900, "akst", "akdt"), /* Alaska */ + zd (- 800, "pst" , "pdt" ), /* Pacific */ + zd (- 700, "mst" , "mdt" ), /* Mountain */ + zd (- 600, "cst" , "cdt" ), /* Central */ + zd (- 500, "est" , "edt" ), /* Eastern */ + zd (- 400, "ast" , "adt" ), /* Atlantic */ + zd (- 330, "nst" , "ndt" ), /* Newfoundland */ + zs ( 000, "utc" ), /* Coordinated Universal */ + zs ( 000, "uct" ), /* " */ + zs ( 000, "cut" ), /* " */ + zs ( 000, "ut"), /* Universal */ + zs ( 000, "z"), /* Zulu (required by ISO 8601) */ + zd ( 000, "gmt" , "bst" ), /* Greenwich Mean, British Summer */ + zd ( 000, "wet" , "west"), /* Western European */ + zd ( 100, "cet" , "cest"), /* Central European */ + zd ( 100, "met" , "mest"), /* Middle European (bug in old tz versions) */ + zd ( 100, "mez" , "mesz"), /* Mittel-Europaeische Zeit */ + zd ( 200, "eet" , "eest"), /* Eastern European */ + zs ( 530, "ist" ), /* India */ + zd ( 900, "jst" , "jdt" ), /* Japan */ + zd ( 900, "kst" , "kdt" ), /* Korea */ + zd ( 1200, "nzst", "nzdt"), /* New Zealand */ + {"lt", 1}, +#if 0 + /* The following names are duplicates or are not well attested. + There are lots more where these came from. */ + zs (-1100, "sst" ), /* Samoan */ + zd (- 900, "yst" , "ydt" ), /* Yukon - name is no longer used */ + zd (- 500, "ast" , "adt" ), /* Acre */ + zd (- 400, "wst" , "wdt" ), /* Western Brazil */ + zd (- 400, "cst" , "cdt" ), /* Chile */ + zd (- 200, "fst" , "fdt" ), /* Fernando de Noronha */ + zs ( 000, "wat" ), /* West African */ + zs ( 100, "cat" ), /* Central African */ + zs ( 200, "sat" ), /* South African */ + zd ( 200, "ist" , "idt" ), /* Israel */ + zs ( 300, "eat" ), /* East African */ + zd ( 300, "msk" , "msd" ), /* Moscow */ + zd ( 330, "ist" , "idt" ), /* Iran */ + zs ( 800, "hkt" ), /* Hong Kong */ + zs ( 800, "sgt" ), /* Singapore */ + zd ( 800, "cst" , "cdt" ), /* China */ + zd ( 800, "wst" , "wst" ), /* Western Australia */ + zd ( 930, "cst" , "cst" ), /* Central Australia */ + zs ( 1000, "gst" ), /* Guam */ + zd ( 1000, "est" , "est" ), /* Eastern Australia */ +#endif + {"", -1} +}; + +/* Look for a prefix of S in TABLE, returning val for first matching entry. */ +static int +lookup (s, table) + char const *s; + struct name_val const table[]; +{ + int j; + char buf[NAME_LENGTH_MAXIMUM]; + + for (j = 0; j < NAME_LENGTH_MAXIMUM; j++) + { + unsigned char c = *s++; + if (! ISALPHA (c)) + { + buf[j] = '\0'; + break; + } + buf[j] = ISUPPER (c) ? tolower (c) : c; + } + + for (;; table++) + for (j = 0; ; j++) + if (j == NAME_LENGTH_MAXIMUM || ! table[0].name[j]) + return table[0].val; + else if (buf[j] != table[0].name[j]) + break; +} + + +/* Set *T to ``undefined'' values. */ +static void +undefine (t) + struct partime *t; +{ + t->tm.tm_sec = t->tm.tm_min = t->tm.tm_hour = t->tm.tm_mday = t->tm.tm_mon + = t->tm.tm_year = t->tm.tm_wday = t->tm.tm_yday + = t->ymodulus = t->yweek + = TM_UNDEFINED; + t->zone = TM_UNDEFINED_ZONE; +} + +/* Array of patterns to look for in a date string. + Order is important: we look for the first matching pattern + whose values do not contradict values that we already know about. + See `parse_pattern_letter' below for the meaning of the pattern codes. */ +static char const *const patterns[] = +{ + /* These traditional patterns must come first, + to prevent an ISO 8601 format from misinterpreting their prefixes. */ + "E_n_y", "x", /* RFC 822 */ + "E_n", "n_E", "n", "t:m:s_A", "t:m_A", "t_A", /* traditional */ + "y/N/D$", /* traditional RCS */ + + /* ISO 8601:1988 formats, generalized a bit. */ + "y-N-D$", "4ND$", "Y-N$", + "RND$", "-R=N$", "-R$", "--N=D$", "N=DT", + "--N$", "---D$", "DT", + "Y-d$", "4d$", "R=d$", "-d$", "dT", + "y-W-X", "yWX", "y=W", + "-r-W-X", "r-W-XT", "-rWX", "rWXT", "-W=X", "W=XT", "-W", + "-w-X", "w-XT", "---X$", "XT", "4$", + "T", + "h:m:s$", "hms$", "h:m$", "hm$", "h$", "-m:s$", "-ms$", "-m$", "--s$", + "Y", "Z", + + 0 +}; + +/* Parse an initial prefix of STR, setting *T accordingly. + Return the first character after the prefix, or 0 if it couldn't be parsed. + Start with pattern *PI; if success, set *PI to the next pattern to try. + Set *PI to -1 if we know there are no more patterns to try; + if *PI is initially negative, give up immediately. */ +static char const * +parse_prefix (str, t, pi) + char const *str; + struct partime *t; + int *pi; +{ + int i = *pi; + char const *pat; + unsigned char c; + + if (i < 0) + return 0; + + /* Remove initial noise. */ + while (! ISALNUM (c = *str) && c != '-' && c != '+') + { + if (! c) + { + undefine (t); + *pi = -1; + return str; + } + str++; + } + + /* Try a pattern until one succeeds. */ + while ((pat = patterns[i++]) != 0) + { + char const *s = str; + undefine (t); + do + { + if (! (c = *pat++)) + { + *pi = i; + return s; + } + } + while ((s = parse_pattern_letter (s, c, t)) != 0); + } + + return 0; +} + +/* Parse an initial prefix of S of length DIGITS; it must be a number. + Store the parsed number into *RES. + Return the first character after the prefix, or 0 if it wasn't parsed. */ +static char const * +parse_fixed (s, digits, res) + char const *s; + int digits, *res; +{ + int n = 0; + char const *lim = s + digits; + while (s < lim) + { + unsigned d = *s++ - '0'; + if (9 < d) + return 0; + n = 10 * n + d; + } + *res = n; + return s; +} + +/* Parse an initial prefix of S of length DIGITS; + it must be a number in the range LO through HI. + Store the parsed number into *RES. + Return the first character after the prefix, or 0 if it wasn't parsed. */ +static char const * +parse_ranged (s, digits, lo, hi, res) + char const *s; + int digits, lo, hi, *res; +{ + s = parse_fixed (s, digits, res); + return s && lo <= *res && *res <= hi ? s : 0; +} + +/* Parse an initial prefix of S of length DIGITS; + it must be a number in the range LO through HI + and it may be followed by a fraction to be computed using RESOLUTION. + Store the parsed number into *RES; store the fraction times RESOLUTION, + rounded to the nearest integer, into *FRES. + Return the first character after the prefix, or 0 if it wasn't parsed. */ +static char const * +parse_decimal (s, digits, lo, hi, resolution, res, fres) + char const *s; + int digits, lo, hi, resolution, *res, *fres; +{ + s = parse_fixed (s, digits, res); + if (s && lo <= *res && *res <= hi) + { + int f = 0; + if ((s[0] == ',' || s[0] == '.') && ISDIGIT (s[1])) + { + char const *s1 = ++s; + int num10 = 0, denom10 = 10, product; + while (ISDIGIT (*++s)) + { + int d = denom10 * 10; + if (d / 10 != denom10) + return 0; /* overflow */ + denom10 = d; + } + s = parse_fixed (s1, (int) (s - s1), &num10); + product = num10 * resolution; + f = (product + (denom10 >> 1)) / denom10; + f -= f & (product % denom10 == denom10 >> 1); /* round to even */ + if (f < 0 || product/resolution != num10) + return 0; /* overflow */ + } + *fres = f; + return s; + } + return 0; +} + +/* Parse an initial prefix of S; it must denote a time zone. + Set *ZONE to the number of seconds east of GMT, + or to TM_LOCAL_ZONE if it is the local time zone. + Return the first character after the prefix, or 0 if it wasn't parsed. */ +char * +parzone (s, zone) + char const *s; + long *zone; +{ + char sign; + int hh, mm, ss; + int minutesEastOfUTC; + long offset, z; + + /* The formats are LT, n, n DST, nDST, no, o + where n is a time zone name + and o is a time zone offset of the form [-+]hh[:mm[:ss]]. */ + switch (*s) + { + case '-': + case '+': + z = 0; + break; + + default: + minutesEastOfUTC = lookup (s, zone_names); + if (minutesEastOfUTC == -1) + return 0; + + /* Don't bother to check rest of spelling. */ + while (ISALPHA ((unsigned char) *s)) + s++; + + /* Don't modify LT. */ + if (minutesEastOfUTC == 1) + { + *zone = TM_LOCAL_ZONE; + return (char *) s; + } + + z = minutesEastOfUTC * 60L; + + /* Look for trailing " DST". */ + if ((s[-1] == 'T' || s[-1] == 't') + && (s[-2] == 'S' || s[-2] == 's') + && (s[-3] == 'D' || s[-3] == 'd')) + goto trailing_dst; + while (ISSPACE ((unsigned char) *s)) + s++; + if ((s[0] == 'D' || s[0] == 'd') + && (s[1] == 'S' || s[1] == 's') + && (s[2] == 'T' || s[2] == 't')) + { + s += 3; + trailing_dst: + *zone = z + 60*60; + return (char *) s; + } + + switch (*s) + { + case '-': + case '+': + break; + + default: + *zone = z; + return (char *) s; + } + + break; + } + + sign = *s++; + + if (! (s = parse_ranged (s, 2, 0, 23, &hh))) + return 0; + mm = ss = 0; + if (*s == ':') + s++; + if (ISDIGIT (*s)) + { + if (! (s = parse_ranged (s, 2, 0, 59, &mm))) + return 0; + if (*s == ':' && s[-3] == ':' && ISDIGIT (s[1]) + && ! (s = parse_ranged (s + 1, 2, 0, 59, &ss))) + return 0; + } + if (ISDIGIT (*s)) + return 0; + offset = (hh * 60 + mm) * 60L + ss; + *zone = z + (sign == '-' ? -offset : offset); + /* ?? Are fractions allowed here? If so, they're not implemented. */ + return (char *) s; +} + +/* Parse an initial prefix of S, matching the pattern whose code is C. + Set *T accordingly. + Return the first character after the prefix, or 0 if it wasn't parsed. */ +static char const * +parse_pattern_letter (s, c, t) + char const *s; + int c; + struct partime *t; +{ + switch (c) + { + case '$': /* The next character must be a non-digit. */ + if (ISDIGIT (*s)) + return 0; + break; + + case '-': + case '/': + case ':': + /* These characters stand for themselves. */ + if (*s++ != c) + return 0; + break; + + case '4': /* 4-digit year */ + s = parse_fixed (s, 4, &t->tm.tm_year); + break; + + case '=': /* optional '-' */ + s += *s == '-'; + break; + + case 'A': /* AM or PM */ + /* This matches the regular expression [AaPp][Mm]?. + It must not be followed by a letter or digit; + otherwise it would match prefixes of strings like "PST". */ + switch (*s++) + { + case 'A': + case 'a': + if (t->tm.tm_hour == 12) + t->tm.tm_hour = 0; + break; + + case 'P': + case 'p': + if (t->tm.tm_hour != 12) + t->tm.tm_hour += 12; + break; + + default: + return 0; + } + switch (*s) + { + case 'M': + case 'm': + s++; + break; + } + if (ISALNUM ((unsigned char) *s)) + return 0; + break; + + case 'D': /* day of month [01-31] */ + s = parse_ranged (s, 2, 1, 31, &t->tm.tm_mday); + break; + + case 'd': /* day of year [001-366] */ + s = parse_ranged (s, 3, 1, 366, &t->tm.tm_yday); + t->tm.tm_yday--; + break; + + case 'E': /* extended day of month [1-9, 01-31] */ + s = parse_ranged (s, (ISDIGIT (s[0]) && ISDIGIT (s[1])) + 1, 1, 31, + &t->tm.tm_mday); + break; + + case 'h': /* hour [00-23 followed by optional fraction] */ + { + int frac; + s = parse_decimal (s, 2, 0, 23, 60 * 60, &t->tm.tm_hour, &frac); + t->tm.tm_min = frac / 60; + t->tm.tm_sec = frac % 60; + } + break; + + case 'm': /* minute [00-59 followed by optional fraction] */ + s = parse_decimal (s, 2, 0, 59, 60, &t->tm.tm_min, &t->tm.tm_sec); + break; + + case 'n': /* month name [e.g. "Jan"] */ + if (! TM_DEFINED (t->tm.tm_mon = lookup (s, month_names))) + return 0; + /* Don't bother to check rest of spelling. */ + while (ISALPHA ((unsigned char) *s)) + s++; + break; + + case 'N': /* month [01-12] */ + s = parse_ranged (s, 2, 1, 12, &t->tm.tm_mon); + t->tm.tm_mon--; + break; + + case 'r': /* year % 10 (remainder in origin-0 decade) [0-9] */ + s = parse_fixed (s, 1, &t->tm.tm_year); + t->ymodulus = 10; + break; + + case_R: + case 'R': /* year % 100 (remainder in origin-0 century) [00-99] */ + s = parse_fixed (s, 2, &t->tm.tm_year); + t->ymodulus = 100; + break; + + case 's': /* second [00-60 followed by optional fraction] */ + { + int frac; + s = parse_decimal (s, 2, 0, 60, 1, &t->tm.tm_sec, &frac); + t->tm.tm_sec += frac; + } + break; + + case 'T': /* 'T' or 't' */ + switch (*s++) + { + case 'T': + case 't': + break; + default: + return 0; + } + break; + + case 't': /* traditional hour [1-9 or 01-12] */ + s = parse_ranged (s, (ISDIGIT (s[0]) && ISDIGIT (s[1])) + 1, 1, 12, + &t->tm.tm_hour); + break; + + case 'w': /* 'W' or 'w' only (stands for current week) */ + switch (*s++) + { + case 'W': + case 'w': + break; + default: + return 0; + } + break; + + case 'W': /* 'W' or 'w', followed by a week of year [00-53] */ + switch (*s++) + { + case 'W': + case 'w': + break; + default: + return 0; + } + s = parse_ranged (s, 2, 0, 53, &t->yweek); + break; + + case 'X': /* weekday (1=Mon ... 7=Sun) [1-7] */ + s = parse_ranged (s, 1, 1, 7, &t->tm.tm_wday); + t->tm.tm_wday--; + break; + + case 'x': /* weekday name [e.g. "Sun"] */ + if (! TM_DEFINED (t->tm.tm_wday = lookup (s, weekday_names))) + return 0; + /* Don't bother to check rest of spelling. */ + while (ISALPHA ((unsigned char) *s)) + s++; + break; + + case 'y': /* either R or Y */ + if (ISDIGIT (s[0]) && ISDIGIT (s[1]) && ! ISDIGIT (s[2])) + goto case_R; + /* fall into */ + case 'Y': /* year in full [4 or more digits] */ + { + int len = 0; + while (ISDIGIT (s[len])) + len++; + if (len < 4) + return 0; + s = parse_fixed (s, len, &t->tm.tm_year); + } + break; + + case 'Z': /* time zone */ + s = parzone (s, &t->zone); + break; + + case '_': /* possibly empty sequence of non-alphanumerics */ + while (! ISALNUM ((unsigned char) *s) && *s) + s++; + break; + + default: /* bad pattern */ + return 0; + } + + return s; +} + +/* If there is no conflict, merge into *T the additional information in *U + and return 0. Otherwise do nothing and return -1. */ +static int +merge_partime (t, u) + struct partime *t; + struct partime const *u; +{ +# define conflict(a,b) ((a) != (b) && TM_DEFINED (a) && TM_DEFINED (b)) + if (conflict (t->tm.tm_sec, u->tm.tm_sec) + || conflict (t->tm.tm_min, u->tm.tm_min) + || conflict (t->tm.tm_hour, u->tm.tm_hour) + || conflict (t->tm.tm_mday, u->tm.tm_mday) + || conflict (t->tm.tm_mon, u->tm.tm_mon) + || conflict (t->tm.tm_year, u->tm.tm_year) + || conflict (t->tm.tm_wday, u->tm.tm_yday) + || conflict (t->ymodulus, u->ymodulus) + || conflict (t->yweek, u->yweek) + || (t->zone != u->zone + && t->zone != TM_UNDEFINED_ZONE + && u->zone != TM_UNDEFINED_ZONE)) + return -1; +# undef conflict +# define merge_(a,b) if (TM_DEFINED (b)) (a) = (b); + merge_ (t->tm.tm_sec, u->tm.tm_sec) + merge_ (t->tm.tm_min, u->tm.tm_min) + merge_ (t->tm.tm_hour, u->tm.tm_hour) + merge_ (t->tm.tm_mday, u->tm.tm_mday) + merge_ (t->tm.tm_mon, u->tm.tm_mon) + merge_ (t->tm.tm_year, u->tm.tm_year) + merge_ (t->tm.tm_wday, u->tm.tm_yday) + merge_ (t->ymodulus, u->ymodulus) + merge_ (t->yweek, u->yweek) +# undef merge_ + if (u->zone != TM_UNDEFINED_ZONE) + t->zone = u->zone; + return 0; +} + +/* Parse a date/time prefix of S, putting the parsed result into *T. + Return the first character after the prefix. + The prefix may contain no useful information; + in that case, *T will contain only undefined values. */ +char * +partime (s, t) + char const *s; + struct partime *t; +{ + struct partime p; + + undefine (t); + + while (*s) + { + int i = 0; + char const *s1; + + do + { + if (! (s1 = parse_prefix (s, &p, &i))) + return (char *) s; + } + while (merge_partime (t, &p) != 0); + + s = s1; + } + + return (char *) s; +} diff --git a/xdelta-1.1.3/libedsio/partime.h b/xdelta-1.1.3/libedsio/partime.h new file mode 100644 index 0000000..bcc8165 --- /dev/null +++ b/xdelta-1.1.3/libedsio/partime.h @@ -0,0 +1,67 @@ +/* Parse a string, yielding a struct partime that describes it. */ + +/* Copyright 1993, 1994, 1995, 1997 Paul Eggert + Distributed under license by the Free Software Foundation, Inc. + + This file is part of RCS. + + RCS is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2, or (at your option) + any later version. + + RCS is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with RCS; see the file COPYING. + If not, write to the Free Software Foundation, + 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + + Report problems and direct all questions to: + + rcs-bugs@cs.purdue.edu + + */ + +#define TM_UNDEFINED (-1) +#define TM_DEFINED(x) (0 <= (x)) + +/* #include if you want to use these symbols. */ +#define TM_LOCAL_ZONE LONG_MIN +#define TM_UNDEFINED_ZONE (LONG_MIN + 1) + +struct partime + { + /* This structure describes the parsed time. + Only the following tm_* values in it are used: + sec, min, hour, mday, mon, year, wday, yday. + If TM_UNDEFINED (value), the parser never found the value. + The tm_year field is the actual year, not the year - 1900; + but see ymodulus below. */ + struct tm tm; + + /* If !TM_UNDEFINED (ymodulus), + then tm.tm_year is actually modulo ymodulus. */ + int ymodulus; + + /* Week of year, ISO 8601 style. + If TM_UNDEFINED (yweek), the parser never found yweek. + Weeks start on Mondays. + Week 1 includes Jan 4. */ + int yweek; + + /* Seconds east of UTC; or TM_LOCAL_ZONE or TM_UNDEFINED_ZONE. */ + long zone; + }; + +#if defined __STDC__ || has_prototypes +# define __PARTIME_P(x) x +#else +# define __PARTIME_P(x) () +#endif + +char *partime __PARTIME_P ((char const *, struct partime *)); +char *parzone __PARTIME_P ((char const *, long *)); diff --git a/xdelta-1.1.3/libedsio/partime.lo b/xdelta-1.1.3/libedsio/partime.lo new file mode 100644 index 0000000..9788f70 --- /dev/null +++ b/xdelta-1.1.3/libedsio/partime.lo @@ -0,0 +1 @@ +timestamp diff --git a/xdelta-1.1.3/libedsio/sha.c b/xdelta-1.1.3/libedsio/sha.c new file mode 100644 index 0000000..503fe85 --- /dev/null +++ b/xdelta-1.1.3/libedsio/sha.c @@ -0,0 +1,239 @@ +/* NIST Secure Hash Algorithm */ +/* heavily modified by Uwe Hollerbach */ +/* from Peter C. Gutmann's implementation as found in */ +/* Applied Cryptography by Bruce Schneier */ +/* Further modifications to include the "UNRAVEL" stuff, below */ + +/* This code is in the public domain */ + +#include "edsio.h" +#include + +#define SHA_BLOCKSIZE 64 +#define SHA_DIGESTSIZE 20 + +/* UNRAVEL should be fastest & biggest */ +/* UNROLL_LOOPS should be just as big, but slightly slower */ +/* both undefined should be smallest and slowest */ + +#define UNRAVEL +/* #define UNROLL_LOOPS */ + +/* by default, compile for little-endian machines (Intel, Vax) */ +/* change for big-endian machines; for machines which are neither, */ +/* you will need to change the definition of maybe_byte_reverse */ + +#ifndef WORDS_BIGENDIAN /* from config.h */ +#define SHA_LITTLE_ENDIAN +#endif + +/* NIST's proposed modification to SHA of 7/11/94 may be */ +/* activated by defining USE_MODIFIED_SHA; leave it off for now */ +#undef USE_MODIFIED_SHA + +/* SHA f()-functions */ + +#define f1(x,y,z) ((x & y) | (~x & z)) +#define f2(x,y,z) (x ^ y ^ z) +#define f3(x,y,z) ((x & y) | (x & z) | (y & z)) +#define f4(x,y,z) (x ^ y ^ z) + +/* SHA constants */ + +#define CONST1 0x5a827999L +#define CONST2 0x6ed9eba1L +#define CONST3 0x8f1bbcdcL +#define CONST4 0xca62c1d6L + +/* 32-bit rotate */ + +#define ROT32(x,n) ((x << n) | (x >> (32 - n))) + +/* the generic case, for when the overall rotation is not unraveled */ + +#define FG(n) \ + T = ROT32(A,5) + f##n(B,C,D) + E + *WP++ + CONST##n; \ + E = D; D = C; C = ROT32(B,30); B = A; A = T + +/* specific cases, for when the overall rotation is unraveled */ + +#define FA(n) \ + T = ROT32(A,5) + f##n(B,C,D) + E + *WP++ + CONST##n; B = ROT32(B,30) + +#define FB(n) \ + E = ROT32(T,5) + f##n(A,B,C) + D + *WP++ + CONST##n; A = ROT32(A,30) + +#define FC(n) \ + D = ROT32(E,5) + f##n(T,A,B) + C + *WP++ + CONST##n; T = ROT32(T,30) + +#define FD(n) \ + C = ROT32(D,5) + f##n(E,T,A) + B + *WP++ + CONST##n; E = ROT32(E,30) + +#define FE(n) \ + B = ROT32(C,5) + f##n(D,E,T) + A + *WP++ + CONST##n; D = ROT32(D,30) + +#define FT(n) \ + A = ROT32(B,5) + f##n(C,D,E) + T + *WP++ + CONST##n; C = ROT32(C,30) + +/* do SHA transformation */ + +static void sha_transform(EdsioSHACtx *ctx) +{ + int i; + guint32 T, A, B, C, D, E, W[80], *WP; + + for (i = 0; i < 16; ++i) { + W[i] = ctx->data[i]; + } + for (i = 16; i < 80; ++i) { + W[i] = W[i-3] ^ W[i-8] ^ W[i-14] ^ W[i-16]; +#ifdef USE_MODIFIED_SHA + W[i] = ROT32(W[i], 1); +#endif /* USE_MODIFIED_SHA */ + } + A = ctx->digest[0]; + B = ctx->digest[1]; + C = ctx->digest[2]; + D = ctx->digest[3]; + E = ctx->digest[4]; + WP = W; +#ifdef UNRAVEL + FA(1); FB(1); FC(1); FD(1); FE(1); FT(1); FA(1); FB(1); FC(1); FD(1); + FE(1); FT(1); FA(1); FB(1); FC(1); FD(1); FE(1); FT(1); FA(1); FB(1); + FC(2); FD(2); FE(2); FT(2); FA(2); FB(2); FC(2); FD(2); FE(2); FT(2); + FA(2); FB(2); FC(2); FD(2); FE(2); FT(2); FA(2); FB(2); FC(2); FD(2); + FE(3); FT(3); FA(3); FB(3); FC(3); FD(3); FE(3); FT(3); FA(3); FB(3); + FC(3); FD(3); FE(3); FT(3); FA(3); FB(3); FC(3); FD(3); FE(3); FT(3); + FA(4); FB(4); FC(4); FD(4); FE(4); FT(4); FA(4); FB(4); FC(4); FD(4); + FE(4); FT(4); FA(4); FB(4); FC(4); FD(4); FE(4); FT(4); FA(4); FB(4); + ctx->digest[0] += E; + ctx->digest[1] += T; + ctx->digest[2] += A; + ctx->digest[3] += B; + ctx->digest[4] += C; +#else /* !UNRAVEL */ +#ifdef UNROLL_LOOPS + FG(1); FG(1); FG(1); FG(1); FG(1); FG(1); FG(1); FG(1); FG(1); FG(1); + FG(1); FG(1); FG(1); FG(1); FG(1); FG(1); FG(1); FG(1); FG(1); FG(1); + FG(2); FG(2); FG(2); FG(2); FG(2); FG(2); FG(2); FG(2); FG(2); FG(2); + FG(2); FG(2); FG(2); FG(2); FG(2); FG(2); FG(2); FG(2); FG(2); FG(2); + FG(3); FG(3); FG(3); FG(3); FG(3); FG(3); FG(3); FG(3); FG(3); FG(3); + FG(3); FG(3); FG(3); FG(3); FG(3); FG(3); FG(3); FG(3); FG(3); FG(3); + FG(4); FG(4); FG(4); FG(4); FG(4); FG(4); FG(4); FG(4); FG(4); FG(4); + FG(4); FG(4); FG(4); FG(4); FG(4); FG(4); FG(4); FG(4); FG(4); FG(4); +#else /* !UNROLL_LOOPS */ + for (i = 0; i < 20; ++i) { FG(1); } + for (i = 20; i < 40; ++i) { FG(2); } + for (i = 40; i < 60; ++i) { FG(3); } + for (i = 60; i < 80; ++i) { FG(4); } +#endif /* !UNROLL_LOOPS */ + ctx->digest[0] += A; + ctx->digest[1] += B; + ctx->digest[2] += C; + ctx->digest[3] += D; + ctx->digest[4] += E; +#endif /* !UNRAVEL */ +} + +#ifdef SHA_LITTLE_ENDIAN + +/* change endianness of data */ + +static void maybe_byte_reverse(guint32 *buffer, int count) +{ + int i; + guint32 in; + + count /= sizeof(guint32); + for (i = 0; i < count; ++i) { + in = *buffer; + *buffer++ = ((in << 24) & 0xff000000) | ((in << 8) & 0x00ff0000) | + ((in >> 8) & 0x0000ff00) | ((in >> 24) & 0x000000ff); + } +} + +#else /* !SHA_LITTLE_ENDIAN */ + +#define maybe_byte_reverse(a,b) /* do nothing */ + +#endif /* SHA_LITTLE_ENDIAN */ + +/* initialize the SHA digest */ + +void edsio_sha_init(EdsioSHACtx *ctx) +{ + ctx->digest[0] = 0x67452301L; + ctx->digest[1] = 0xefcdab89L; + ctx->digest[2] = 0x98badcfeL; + ctx->digest[3] = 0x10325476L; + ctx->digest[4] = 0xc3d2e1f0L; + ctx->count_lo = 0L; + ctx->count_hi = 0L; + ctx->local = 0; +} + +/* update the SHA digest */ + +void edsio_sha_update(EdsioSHACtx *ctx, const guint8 *buffer, guint count) +{ + int i; + + if ((ctx->count_lo + ((guint32) count << 3)) < ctx->count_lo) { + ++ctx->count_hi; + } + ctx->count_lo += (guint32) count << 3; + ctx->count_hi += (guint32) count >> 29; + if (ctx->local) { + i = SHA_BLOCKSIZE - ctx->local; + if (i > count) { + i = count; + } + memcpy(((guint8 *) ctx->data) + ctx->local, buffer, i); + count -= i; + buffer += i; + ctx->local += i; + if (ctx->local == SHA_BLOCKSIZE) { + maybe_byte_reverse(ctx->data, SHA_BLOCKSIZE); + sha_transform(ctx); + } else { + return; + } + } + while (count >= SHA_BLOCKSIZE) { + memcpy(ctx->data, buffer, SHA_BLOCKSIZE); + buffer += SHA_BLOCKSIZE; + count -= SHA_BLOCKSIZE; + maybe_byte_reverse(ctx->data, SHA_BLOCKSIZE); + sha_transform(ctx); + } + memcpy(ctx->data, buffer, count); + ctx->local = count; +} + +/* finish computing the SHA digest */ + +void edsio_sha_final(guint8* digest, EdsioSHACtx *ctx) +{ + int count; + guint32 lo_bit_count, hi_bit_count; + + lo_bit_count = ctx->count_lo; + hi_bit_count = ctx->count_hi; + count = (int) ((lo_bit_count >> 3) & 0x3f); + ((guint8 *) ctx->data)[count++] = 0x80; + if (count > SHA_BLOCKSIZE - 8) { + memset(((guint8 *) ctx->data) + count, 0, SHA_BLOCKSIZE - count); + maybe_byte_reverse(ctx->data, SHA_BLOCKSIZE); + sha_transform(ctx); + memset((guint8 *) ctx->data, 0, SHA_BLOCKSIZE - 8); + } else { + memset(((guint8 *) ctx->data) + count, 0, + SHA_BLOCKSIZE - 8 - count); + } + maybe_byte_reverse(ctx->data, SHA_BLOCKSIZE); + ctx->data[14] = hi_bit_count; + ctx->data[15] = lo_bit_count; + sha_transform(ctx); + + memcpy (digest, ctx->digest, 20); +} diff --git a/xdelta-1.1.3/libedsio/sha.lo b/xdelta-1.1.3/libedsio/sha.lo new file mode 100644 index 0000000..9788f70 --- /dev/null +++ b/xdelta-1.1.3/libedsio/sha.lo @@ -0,0 +1 @@ +timestamp diff --git a/xdelta-1.1.3/libedsio/simple.c b/xdelta-1.1.3/libedsio/simple.c new file mode 100644 index 0000000..5de0667 --- /dev/null +++ b/xdelta-1.1.3/libedsio/simple.c @@ -0,0 +1,179 @@ +/* -*-Mode: C;-*- + * $Id: simple.c,v 1.1 2004/01/05 18:54:23 icculus Exp $ + * + * Copyright (C) 1998, 1999, Josh MacDonald. + * All Rights Reserved. + * + * Author: Josh MacDonald + */ + +#include "edsio.h" + +/* Simple Source + */ + +typedef struct _ByteArraySource ByteArraySource; + +struct _ByteArraySource { + SerialSource source; + + const guint8* in_data; + guint in_len; + + guint read_pos; + guint flags; +}; + +static gboolean byte_array_source_close (SerialSource* source); +static gboolean byte_array_source_read (SerialSource* source, guint8 *ptr, guint32 len); +static void byte_array_source_free (SerialSource* source); + +SerialSource* +edsio_simple_source (const guint8* data, guint len, guint flags) +{ + ByteArraySource* it = g_new0 (ByteArraySource, 1); + SerialSource* src = (SerialSource*) it; + + serializeio_source_init (& it->source, + NULL, + byte_array_source_close, + byte_array_source_read, + byte_array_source_free, + NULL, + NULL); + + it->in_data = data; + it->in_len = len; + it->flags = flags; + + if (flags & SBF_Base64) + src = serializeio_base64_source (src); + + if (flags & SBF_Checksum) + src = serializeio_checksum_source (src); + + if (flags & SBF_Compress) + src = serializeio_gzip_source (src); + + return src; +} + +gboolean +byte_array_source_close (SerialSource* source) +{ + return TRUE; +} + +gboolean +byte_array_source_read (SerialSource* source, guint8 *buf, guint32 len) +{ + ByteArraySource* ssource = (ByteArraySource*) source; + + if (len + ssource->read_pos > ssource->in_len) + { + edsio_generate_source_event (EC_EdsioSourceEof, source); + return FALSE; + } + + memcpy (buf, ssource->in_data + ssource->read_pos, len); + + ssource->read_pos += len; + + return TRUE; +} + +void +byte_array_source_free (SerialSource* source) +{ + g_free (source); +} + +/* BASE64 Sink + */ + +typedef struct _ByteArraySink ByteArraySink; + +struct _ByteArraySink { + SerialSink sink; + + GByteArray* out; + + gpointer data; + guint flags; + gboolean free_result; + void (* success) (gpointer data, GByteArray* result); +}; + +static gboolean byte_array_sink_close (SerialSink* sink); +static gboolean byte_array_sink_write (SerialSink* sink, const guint8 *ptr, guint32 len); +static void byte_array_sink_free (SerialSink* sink); + +SerialSink* +edsio_simple_sink (gpointer data, + guint flags, + gboolean free_result, + void (* success) (gpointer data, GByteArray* result), + GByteArray **result) +{ + ByteArraySink* it = g_new0 (ByteArraySink, 1); + SerialSink* sink = (SerialSink*) it; + + serializeio_sink_init (&it->sink, + NULL, + byte_array_sink_close, + byte_array_sink_write, + byte_array_sink_free, + NULL); + + it->data = data; + it->out = g_byte_array_new (); + it->flags = flags; + it->free_result = free_result; + it->success = success; + + if (result) + (*result) = it->out; + + if (flags & SBF_Base64) + sink = serializeio_base64_sink (sink); + + if (flags & SBF_Checksum) + sink = serializeio_checksum_sink (sink); + + if (flags & SBF_Compress) + sink = serializeio_gzip_sink (sink); + + return sink; +} + +gboolean +byte_array_sink_close (SerialSink* sink) +{ + ByteArraySink* ssink = (ByteArraySink*) sink; + + if (ssink->success) + ssink->success (ssink->data, ssink->out); + + return TRUE; +} + +gboolean +byte_array_sink_write (SerialSink* sink, const guint8 *ptr, guint32 len) +{ + ByteArraySink* ssink = (ByteArraySink*) sink; + + g_byte_array_append (ssink->out, ptr, len); + + return TRUE; +} + +void +byte_array_sink_free (SerialSink* sink) +{ + ByteArraySink* ssink = (ByteArraySink*) sink; + + if (ssink->out && ssink->free_result) + g_byte_array_free (ssink->out, TRUE); + + g_free (sink); +} diff --git a/xdelta-1.1.3/libedsio/simple.lo b/xdelta-1.1.3/libedsio/simple.lo new file mode 100644 index 0000000..9788f70 --- /dev/null +++ b/xdelta-1.1.3/libedsio/simple.lo @@ -0,0 +1 @@ +timestamp diff --git a/xdelta-1.1.3/libedsio/stamp-ser1 b/xdelta-1.1.3/libedsio/stamp-ser1 new file mode 100644 index 0000000..e69de29 diff --git a/xdelta-1.1.3/libtool b/xdelta-1.1.3/libtool new file mode 100755 index 0000000..146b47e --- /dev/null +++ b/xdelta-1.1.3/libtool @@ -0,0 +1,4235 @@ +#! /bin/sh + +# libtool - Provide generalized library-building support services. +# Generated automatically by ltconfig (GNU libtool 1.3.3 (1.385.2.181 1999/07/02 15:49:11)) +# NOTE: Changes made to this file will be lost: look at ltconfig or ltmain.sh. +# +# Copyright (C) 1996-1999 Free Software Foundation, Inc. +# Gordon Matzigkeit , 1996 +# +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, but +# WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. +# +# As a special exception to the GNU General Public License, if you +# distribute this file as part of a program that contains a +# configuration script generated by Autoconf, you may include it under +# the same distribution terms that you use for the rest of that program. + +# Sed that helps us avoid accidentally triggering echo(1) options like -n. +Xsed="sed -e s/^X//" + +# The HP-UX ksh and POSIX shell print the target directory to stdout +# if CDPATH is set. +if test "${CDPATH+set}" = set; then CDPATH=; export CDPATH; fi + +### BEGIN LIBTOOL CONFIG +# Libtool was configured as follows, on host Ryan-C-Gordons-Computer.local: +# +# CC="gcc" CFLAGS=" -Wall -O3" CPPFLAGS="" \ +# LD="/usr/bin/ld" LDFLAGS="" LIBS="" \ +# NM="/usr/bin/nm -p" RANLIB="ranlib" LN_S="ln -s" \ +# DLLTOOL="" OBJDUMP="" AS="" \ +# ./ltconfig --cache-file=./config.cache --with-gcc --no-verify ./ltmain.sh powerpc-apple-macos +# +# Compiler and other test output produced by ltconfig, useful for +# debugging ltconfig, is in ./config.log if it exists. + +# The version of ltconfig that generated this script. +LTCONFIG_VERSION="1.3.3" + +# Shell to use when invoking shell scripts. +SHELL="/bin/sh" + +# Whether or not to build shared libraries. +build_libtool_libs=no + +# Whether or not to build static libraries. +build_old_libs=yes + +# Whether or not to optimize for fast installation. +fast_install=needless + +# The host system. +host_alias=powerpc-apple-macos +host=powerpc-apple-macos + +# An echo program that does not interpret backslashes. +echo="echo" + +# The archiver. +AR="ar" + +# The default C compiler. +CC="gcc" + +# The linker used to build libraries. +LD="/usr/bin/ld" + +# Whether we need hard or soft links. +LN_S="ln -s" + +# A BSD-compatible nm program. +NM="/usr/bin/nm -p" + +# Used on cygwin: DLL creation program. +DLLTOOL="dlltool" + +# Used on cygwin: object dumper. +OBJDUMP="objdump" + +# Used on cygwin: assembler. +AS="as" + +# The name of the directory that contains temporary libtool files. +objdir=.libs + +# How to create reloadable object files. +reload_flag=" -r" +reload_cmds="\$LD\$reload_flag -o \$output\$reload_objs" + +# How to pass a linker flag through the compiler. +wl="-Wl," + +# Object file suffix (normally "o"). +objext="o" + +# Old archive suffix (normally "a"). +libext="a" + +# Executable file suffix (normally ""). +exeext="" + +# Additional compiler flags for building library objects. +pic_flag=" -fPIC" + +# Does compiler simultaneously support -c and -o options? +compiler_c_o="yes" + +# Can we write directly to a .lo ? +compiler_o_lo="yes" + +# Must we lock files when doing compilation ? +need_locks="no" + +# Do we need the lib prefix for modules? +need_lib_prefix=unknown + +# Do we need a version for libraries? +need_version=unknown + +# Whether dlopen is supported. +dlopen=unknown + +# Whether dlopen of programs is supported. +dlopen_self=unknown + +# Whether dlopen of statically linked programs is supported. +dlopen_self_static=unknown + +# Compiler flag to prevent dynamic linking. +link_static_flag="" + +# Compiler flag to turn off builtin functions. +no_builtin_flag=" -fno-builtin" + +# Compiler flag to allow reflexive dlopens. +export_dynamic_flag_spec="" + +# Compiler flag to generate shared objects directly from archives. +whole_archive_flag_spec="" + +# Compiler flag to generate thread-safe objects. +thread_safe_flag_spec="" + +# Library versioning type. +version_type=none + +# Format of library name prefix. +libname_spec="lib\$name" + +# List of archive names. First name is the real one, the rest are links. +# The last name is the one that the linker finds with -lNAME. +library_names_spec="" + +# The coded name of the library, if different from the real name. +soname_spec="" + +# Commands used to build and install an old-style archive. +RANLIB="ranlib" +old_archive_cmds="\$AR cru \$oldlib\$oldobjs~\$RANLIB \$oldlib" +old_postinstall_cmds="\$RANLIB \$oldlib~chmod 644 \$oldlib" +old_postuninstall_cmds="" + +# Create an old-style archive from a shared archive. +old_archive_from_new_cmds="" + +# Commands used to build and install a shared archive. +archive_cmds="" +archive_expsym_cmds="" +postinstall_cmds="" +postuninstall_cmds="" + +# Method to check whether dependent libraries are shared objects. +deplibs_check_method="unknown" + +# Command to use when deplibs_check_method == file_magic. +file_magic_cmd="" + +# Flag that allows shared libraries with undefined symbols to be built. +allow_undefined_flag="" + +# Flag that forces no undefined symbols. +no_undefined_flag="" + +# Commands used to finish a libtool library installation in a directory. +finish_cmds="" + +# Same as above, but a single script fragment to be evaled but not shown. +finish_eval="" + +# Take the output of nm and produce a listing of raw symbols and C names. +global_symbol_pipe="sed -n -e 's/^.*[ ]\\([BCDEGRST]\\)[ ][ ]*\\(_\\)\\([_A-Za-z][_A-Za-z0-9]*\\)\$/\\1 \\2\\3 \\3/p'" + +# Transform the output of nm in a proper C declaration +global_symbol_to_cdecl="sed -n -e 's/^. .* \\(.*\\)\$/extern char \\1;/p'" + +# This is the shared library runtime path variable. +runpath_var= + +# This is the shared library path variable. +shlibpath_var= + +# Is shlibpath searched before the hard-coded library search path? +shlibpath_overrides_runpath=unknown + +# How to hardcode a shared library path into an executable. +hardcode_action=unsupported + +# Flag to hardcode $libdir into a binary during linking. +# This must work even if $libdir does not exist. +hardcode_libdir_flag_spec="" + +# Whether we need a single -rpath flag with a separated argument. +hardcode_libdir_separator="" + +# Set to yes if using DIR/libNAME.so during linking hardcodes DIR into the +# resulting binary. +hardcode_direct=no + +# Set to yes if using the -LDIR flag during linking hardcodes DIR into the +# resulting binary. +hardcode_minus_L=no + +# Set to yes if using SHLIBPATH_VAR=DIR during linking hardcodes DIR into +# the resulting binary. +hardcode_shlibpath_var=unsupported + +# Compile-time system search path for libraries +sys_lib_search_path_spec="/lib /usr/lib /usr/local/lib" + +# Run-time system search path for libraries +sys_lib_dlsearch_path_spec="/lib /usr/lib" + +# Fix the shell variable $srcfile for the compiler. +fix_srcfile_path="" + +# Set to yes if exported symbols are required. +always_export_symbols=no + +# The commands to list exported symbols. +export_symbols_cmds="\$NM \$libobjs \$convenience | \$global_symbol_pipe | sed 's/.* //' | sort | uniq > \$export_symbols" + +# Symbols that should not be listed in the preloaded symbols. +exclude_expsyms="_GLOBAL_OFFSET_TABLE_" + +# Symbols that must always be exported. +include_expsyms="" + +### END LIBTOOL CONFIG + +# ltmain.sh - Provide generalized library-building support services. +# NOTE: Changing this file will not affect anything until you rerun ltconfig. +# +# Copyright (C) 1996-1999 Free Software Foundation, Inc. +# Originally by Gordon Matzigkeit , 1996 +# +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, but +# WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. +# +# As a special exception to the GNU General Public License, if you +# distribute this file as part of a program that contains a +# configuration script generated by Autoconf, you may include it under +# the same distribution terms that you use for the rest of that program. + +# Check that we have a working $echo. +if test "X$1" = X--no-reexec; then + # Discard the --no-reexec flag, and continue. + shift +elif test "X$1" = X--fallback-echo; then + # Avoid inline document here, it may be left over + : +elif test "X`($echo '\t') 2>/dev/null`" = 'X\t'; then + # Yippee, $echo works! + : +else + # Restart under the correct shell, and then maybe $echo will work. + exec $SHELL "$0" --no-reexec ${1+"$@"} +fi + +if test "X$1" = X--fallback-echo; then + # used as fallback echo + shift + cat <&2 + echo "Fatal configuration error. See the $PACKAGE docs for more information." 1>&2 + exit 1 +fi + +if test "$build_libtool_libs" != yes && test "$build_old_libs" != yes; then + echo "$modename: not configured to build any kind of library" 1>&2 + echo "Fatal configuration error. See the $PACKAGE docs for more information." 1>&2 + exit 1 +fi + +# Global variables. +mode=$default_mode +nonopt= +prev= +prevopt= +run= +show="$echo" +show_help= +execute_dlfiles= +lo2o="s/\\.lo\$/.${objext}/" +o2lo="s/\\.${objext}\$/.lo/" + +# Parse our command line options once, thoroughly. +while test $# -gt 0 +do + arg="$1" + shift + + case "$arg" in + -*=*) optarg=`$echo "X$arg" | $Xsed -e 's/[-_a-zA-Z0-9]*=//'` ;; + *) optarg= ;; + esac + + # If the previous option needs an argument, assign it. + if test -n "$prev"; then + case "$prev" in + execute_dlfiles) + eval "$prev=\"\$$prev \$arg\"" + ;; + *) + eval "$prev=\$arg" + ;; + esac + + prev= + prevopt= + continue + fi + + # Have we seen a non-optional argument yet? + case "$arg" in + --help) + show_help=yes + ;; + + --version) + echo "$PROGRAM (GNU $PACKAGE) $VERSION$TIMESTAMP" + exit 0 + ;; + + --config) + sed -e '1,/^### BEGIN LIBTOOL CONFIG/d' -e '/^### END LIBTOOL CONFIG/,$d' $0 + exit 0 + ;; + + --debug) + echo "$progname: enabling shell trace mode" + set -x + ;; + + --dry-run | -n) + run=: + ;; + + --features) + echo "host: $host" + if test "$build_libtool_libs" = yes; then + echo "enable shared libraries" + else + echo "disable shared libraries" + fi + if test "$build_old_libs" = yes; then + echo "enable static libraries" + else + echo "disable static libraries" + fi + exit 0 + ;; + + --finish) mode="finish" ;; + + --mode) prevopt="--mode" prev=mode ;; + --mode=*) mode="$optarg" ;; + + --quiet | --silent) + show=: + ;; + + -dlopen) + prevopt="-dlopen" + prev=execute_dlfiles + ;; + + -*) + $echo "$modename: unrecognized option \`$arg'" 1>&2 + $echo "$help" 1>&2 + exit 1 + ;; + + *) + nonopt="$arg" + break + ;; + esac +done + +if test -n "$prevopt"; then + $echo "$modename: option \`$prevopt' requires an argument" 1>&2 + $echo "$help" 1>&2 + exit 1 +fi + +if test -z "$show_help"; then + + # Infer the operation mode. + if test -z "$mode"; then + case "$nonopt" in + *cc | *++ | gcc* | *-gcc*) + mode=link + for arg + do + case "$arg" in + -c) + mode=compile + break + ;; + esac + done + ;; + *db | *dbx | *strace | *truss) + mode=execute + ;; + *install*|cp|mv) + mode=install + ;; + *rm) + mode=uninstall + ;; + *) + # If we have no mode, but dlfiles were specified, then do execute mode. + test -n "$execute_dlfiles" && mode=execute + + # Just use the default operation mode. + if test -z "$mode"; then + if test -n "$nonopt"; then + $echo "$modename: warning: cannot infer operation mode from \`$nonopt'" 1>&2 + else + $echo "$modename: warning: cannot infer operation mode without MODE-ARGS" 1>&2 + fi + fi + ;; + esac + fi + + # Only execute mode is allowed to have -dlopen flags. + if test -n "$execute_dlfiles" && test "$mode" != execute; then + $echo "$modename: unrecognized option \`-dlopen'" 1>&2 + $echo "$help" 1>&2 + exit 1 + fi + + # Change the help message to a mode-specific one. + generic_help="$help" + help="Try \`$modename --help --mode=$mode' for more information." + + # These modes are in order of execution frequency so that they run quickly. + case "$mode" in + # libtool compile mode + compile) + modename="$modename: compile" + # Get the compilation command and the source file. + base_compile= + lastarg= + srcfile="$nonopt" + suppress_output= + + user_target=no + for arg + do + # Accept any command-line options. + case "$arg" in + -o) + if test "$user_target" != "no"; then + $echo "$modename: you cannot specify \`-o' more than once" 1>&2 + exit 1 + fi + user_target=next + ;; + + -static) + build_old_libs=yes + continue + ;; + esac + + case "$user_target" in + next) + # The next one is the -o target name + user_target=yes + continue + ;; + yes) + # We got the output file + user_target=set + libobj="$arg" + continue + ;; + esac + + # Accept the current argument as the source file. + lastarg="$srcfile" + srcfile="$arg" + + # Aesthetically quote the previous argument. + + # Backslashify any backslashes, double quotes, and dollar signs. + # These are the only characters that are still specially + # interpreted inside of double-quoted scrings. + lastarg=`$echo "X$lastarg" | $Xsed -e "$sed_quote_subst"` + + # Double-quote args containing other shell metacharacters. + # Many Bourne shells cannot handle close brackets correctly in scan + # sets, so we specify it separately. + case "$lastarg" in + *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \ ]*|*]*) + lastarg="\"$lastarg\"" + ;; + esac + + # Add the previous argument to base_compile. + if test -z "$base_compile"; then + base_compile="$lastarg" + else + base_compile="$base_compile $lastarg" + fi + done + + case "$user_target" in + set) + ;; + no) + # Get the name of the library object. + libobj=`$echo "X$srcfile" | $Xsed -e 's%^.*/%%'` + ;; + *) + $echo "$modename: you must specify a target with \`-o'" 1>&2 + exit 1 + ;; + esac + + # Recognize several different file suffixes. + # If the user specifies -o file.o, it is replaced with file.lo + xform='[cCFSfmso]' + case "$libobj" in + *.ada) xform=ada ;; + *.adb) xform=adb ;; + *.ads) xform=ads ;; + *.asm) xform=asm ;; + *.c++) xform=c++ ;; + *.cc) xform=cc ;; + *.cpp) xform=cpp ;; + *.cxx) xform=cxx ;; + *.f90) xform=f90 ;; + *.for) xform=for ;; + esac + + libobj=`$echo "X$libobj" | $Xsed -e "s/\.$xform$/.lo/"` + + case "$libobj" in + *.lo) obj=`$echo "X$libobj" | $Xsed -e "$lo2o"` ;; + *) + $echo "$modename: cannot determine name of library object from \`$libobj'" 1>&2 + exit 1 + ;; + esac + + if test -z "$base_compile"; then + $echo "$modename: you must specify a compilation command" 1>&2 + $echo "$help" 1>&2 + exit 1 + fi + + # Delete any leftover library objects. + if test "$build_old_libs" = yes; then + removelist="$obj $libobj" + else + removelist="$libobj" + fi + + $run $rm $removelist + trap "$run $rm $removelist; exit 1" 1 2 15 + + # Calculate the filename of the output object if compiler does + # not support -o with -c + if test "$compiler_c_o" = no; then + output_obj=`$echo "X$srcfile" | $Xsed -e 's%^.*/%%' -e 's%\..*$%%'`.${objext} + lockfile="$output_obj.lock" + removelist="$removelist $output_obj $lockfile" + trap "$run $rm $removelist; exit 1" 1 2 15 + else + need_locks=no + lockfile= + fi + + # Lock this critical section if it is needed + # We use this script file to make the link, it avoids creating a new file + if test "$need_locks" = yes; then + until ln "$0" "$lockfile" 2>/dev/null; do + $show "Waiting for $lockfile to be removed" + sleep 2 + done + elif test "$need_locks" = warn; then + if test -f "$lockfile"; then + echo "\ +*** ERROR, $lockfile exists and contains: +`cat $lockfile 2>/dev/null` + +This indicates that another process is trying to use the same +temporary object file, and libtool could not work around it because +your compiler does not support \`-c' and \`-o' together. If you +repeat this compilation, it may succeed, by chance, but you had better +avoid parallel builds (make -j) in this platform, or get a better +compiler." + + $run $rm $removelist + exit 1 + fi + echo $srcfile > "$lockfile" + fi + + if test -n "$fix_srcfile_path"; then + eval srcfile=\"$fix_srcfile_path\" + fi + + # Only build a PIC object if we are building libtool libraries. + if test "$build_libtool_libs" = yes; then + # Without this assignment, base_compile gets emptied. + fbsd_hideous_sh_bug=$base_compile + + # All platforms use -DPIC, to notify preprocessed assembler code. + command="$base_compile $pic_flag -DPIC $srcfile" + if test "$build_old_libs" = yes; then + lo_libobj="$libobj" + dir=`$echo "X$libobj" | $Xsed -e 's%/[^/]*$%%'` + if test "X$dir" = "X$libobj"; then + dir="$objdir" + else + dir="$dir/$objdir" + fi + libobj="$dir/"`$echo "X$libobj" | $Xsed -e 's%^.*/%%'` + + if test -d "$dir"; then + $show "$rm $libobj" + $run $rm $libobj + else + $show "$mkdir $dir" + $run $mkdir $dir + status=$? + if test $status -ne 0 && test ! -d $dir; then + exit $status + fi + fi + fi + if test "$compiler_o_lo" = yes; then + output_obj="$libobj" + command="$command -o $output_obj" + elif test "$compiler_c_o" = yes; then + output_obj="$obj" + command="$command -o $output_obj" + fi + + $run $rm "$output_obj" + $show "$command" + if $run eval "$command"; then : + else + test -n "$output_obj" && $run $rm $removelist + exit 1 + fi + + if test "$need_locks" = warn && + test x"`cat $lockfile 2>/dev/null`" != x"$srcfile"; then + echo "\ +*** ERROR, $lockfile contains: +`cat $lockfile 2>/dev/null` + +but it should contain: +$srcfile + +This indicates that another process is trying to use the same +temporary object file, and libtool could not work around it because +your compiler does not support \`-c' and \`-o' together. If you +repeat this compilation, it may succeed, by chance, but you had better +avoid parallel builds (make -j) in this platform, or get a better +compiler." + + $run $rm $removelist + exit 1 + fi + + # Just move the object if needed, then go on to compile the next one + if test x"$output_obj" != x"$libobj"; then + $show "$mv $output_obj $libobj" + if $run $mv $output_obj $libobj; then : + else + error=$? + $run $rm $removelist + exit $error + fi + fi + + # If we have no pic_flag, then copy the object into place and finish. + if test -z "$pic_flag" && test "$build_old_libs" = yes; then + # Rename the .lo from within objdir to obj + if test -f $obj; then + $show $rm $obj + $run $rm $obj + fi + + $show "$mv $libobj $obj" + if $run $mv $libobj $obj; then : + else + error=$? + $run $rm $removelist + exit $error + fi + + # Now arrange that obj and lo_libobj become the same file + $show "$LN_S $obj $lo_libobj" + if $run $LN_S $obj $lo_libobj; then + exit 0 + else + error=$? + $run $rm $removelist + exit $error + fi + fi + + # Allow error messages only from the first compilation. + suppress_output=' >/dev/null 2>&1' + fi + + # Only build a position-dependent object if we build old libraries. + if test "$build_old_libs" = yes; then + command="$base_compile $srcfile" + if test "$compiler_c_o" = yes; then + command="$command -o $obj" + output_obj="$obj" + fi + + # Suppress compiler output if we already did a PIC compilation. + command="$command$suppress_output" + $run $rm "$output_obj" + $show "$command" + if $run eval "$command"; then : + else + $run $rm $removelist + exit 1 + fi + + if test "$need_locks" = warn && + test x"`cat $lockfile 2>/dev/null`" != x"$srcfile"; then + echo "\ +*** ERROR, $lockfile contains: +`cat $lockfile 2>/dev/null` + +but it should contain: +$srcfile + +This indicates that another process is trying to use the same +temporary object file, and libtool could not work around it because +your compiler does not support \`-c' and \`-o' together. If you +repeat this compilation, it may succeed, by chance, but you had better +avoid parallel builds (make -j) in this platform, or get a better +compiler." + + $run $rm $removelist + exit 1 + fi + + # Just move the object if needed + if test x"$output_obj" != x"$obj"; then + $show "$mv $output_obj $obj" + if $run $mv $output_obj $obj; then : + else + error=$? + $run $rm $removelist + exit $error + fi + fi + + # Create an invalid libtool object if no PIC, so that we do not + # accidentally link it into a program. + if test "$build_libtool_libs" != yes; then + $show "echo timestamp > $libobj" + $run eval "echo timestamp > \$libobj" || exit $? + else + # Move the .lo from within objdir + $show "$mv $libobj $lo_libobj" + if $run $mv $libobj $lo_libobj; then : + else + error=$? + $run $rm $removelist + exit $error + fi + fi + fi + + # Unlock the critical section if it was locked + if test "$need_locks" != no; then + $rm "$lockfile" + fi + + exit 0 + ;; + + # libtool link mode + link) + modename="$modename: link" + C_compiler="$CC" # save it, to compile generated C sources + CC="$nonopt" + case "$host" in + *-*-cygwin* | *-*-mingw* | *-*-os2*) + # It is impossible to link a dll without this setting, and + # we shouldn't force the makefile maintainer to figure out + # which system we are compiling for in order to pass an extra + # flag for every libtool invokation. + # allow_undefined=no + + # FIXME: Unfortunately, there are problems with the above when trying + # to make a dll which has undefined symbols, in which case not + # even a static library is built. For now, we need to specify + # -no-undefined on the libtool link line when we can be certain + # that all symbols are satisfied, otherwise we get a static library. + allow_undefined=yes + + # This is a source program that is used to create dlls on Windows + # Don't remove nor modify the starting and closing comments +# /* ltdll.c starts here */ +# #define WIN32_LEAN_AND_MEAN +# #include +# #undef WIN32_LEAN_AND_MEAN +# #include +# +# #ifndef __CYGWIN__ +# # ifdef __CYGWIN32__ +# # define __CYGWIN__ __CYGWIN32__ +# # endif +# #endif +# +# #ifdef __cplusplus +# extern "C" { +# #endif +# BOOL APIENTRY DllMain (HINSTANCE hInst, DWORD reason, LPVOID reserved); +# #ifdef __cplusplus +# } +# #endif +# +# #ifdef __CYGWIN__ +# #include +# DECLARE_CYGWIN_DLL( DllMain ); +# #endif +# HINSTANCE __hDllInstance_base; +# +# BOOL APIENTRY +# DllMain (HINSTANCE hInst, DWORD reason, LPVOID reserved) +# { +# __hDllInstance_base = hInst; +# return TRUE; +# } +# /* ltdll.c ends here */ + # This is a source program that is used to create import libraries + # on Windows for dlls which lack them. Don't remove nor modify the + # starting and closing comments +# /* impgen.c starts here */ +# /* Copyright (C) 1999 Free Software Foundation, Inc. +# +# This file is part of GNU libtool. +# +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. +# */ +# +# #include /* for printf() */ +# #include /* for open(), lseek(), read() */ +# #include /* for O_RDONLY, O_BINARY */ +# #include /* for strdup() */ +# +# static unsigned int +# pe_get16 (fd, offset) +# int fd; +# int offset; +# { +# unsigned char b[2]; +# lseek (fd, offset, SEEK_SET); +# read (fd, b, 2); +# return b[0] + (b[1]<<8); +# } +# +# static unsigned int +# pe_get32 (fd, offset) +# int fd; +# int offset; +# { +# unsigned char b[4]; +# lseek (fd, offset, SEEK_SET); +# read (fd, b, 4); +# return b[0] + (b[1]<<8) + (b[2]<<16) + (b[3]<<24); +# } +# +# static unsigned int +# pe_as32 (ptr) +# void *ptr; +# { +# unsigned char *b = ptr; +# return b[0] + (b[1]<<8) + (b[2]<<16) + (b[3]<<24); +# } +# +# int +# main (argc, argv) +# int argc; +# char *argv[]; +# { +# int dll; +# unsigned long pe_header_offset, opthdr_ofs, num_entries, i; +# unsigned long export_rva, export_size, nsections, secptr, expptr; +# unsigned long name_rvas, nexp; +# unsigned char *expdata, *erva; +# char *filename, *dll_name; +# +# filename = argv[1]; +# +# dll = open(filename, O_RDONLY|O_BINARY); +# if (!dll) +# return 1; +# +# dll_name = filename; +# +# for (i=0; filename[i]; i++) +# if (filename[i] == '/' || filename[i] == '\\' || filename[i] == ':') +# dll_name = filename + i +1; +# +# pe_header_offset = pe_get32 (dll, 0x3c); +# opthdr_ofs = pe_header_offset + 4 + 20; +# num_entries = pe_get32 (dll, opthdr_ofs + 92); +# +# if (num_entries < 1) /* no exports */ +# return 1; +# +# export_rva = pe_get32 (dll, opthdr_ofs + 96); +# export_size = pe_get32 (dll, opthdr_ofs + 100); +# nsections = pe_get16 (dll, pe_header_offset + 4 +2); +# secptr = (pe_header_offset + 4 + 20 + +# pe_get16 (dll, pe_header_offset + 4 + 16)); +# +# expptr = 0; +# for (i = 0; i < nsections; i++) +# { +# char sname[8]; +# unsigned long secptr1 = secptr + 40 * i; +# unsigned long vaddr = pe_get32 (dll, secptr1 + 12); +# unsigned long vsize = pe_get32 (dll, secptr1 + 16); +# unsigned long fptr = pe_get32 (dll, secptr1 + 20); +# lseek(dll, secptr1, SEEK_SET); +# read(dll, sname, 8); +# if (vaddr <= export_rva && vaddr+vsize > export_rva) +# { +# expptr = fptr + (export_rva - vaddr); +# if (export_rva + export_size > vaddr + vsize) +# export_size = vsize - (export_rva - vaddr); +# break; +# } +# } +# +# expdata = (unsigned char*)malloc(export_size); +# lseek (dll, expptr, SEEK_SET); +# read (dll, expdata, export_size); +# erva = expdata - export_rva; +# +# nexp = pe_as32 (expdata+24); +# name_rvas = pe_as32 (expdata+32); +# +# printf ("EXPORTS\n"); +# for (i = 0; i&2 + fi + if test -n "$link_static_flag"; then + dlopen_self=$dlopen_self_static + fi + else + if test -z "$pic_flag" && test -n "$link_static_flag"; then + dlopen_self=$dlopen_self_static + fi + fi + build_libtool_libs=no + build_old_libs=yes + prefer_static_libs=yes + break + ;; + esac + done + + # See if our shared archives depend on static archives. + test -n "$old_archive_from_new_cmds" && build_old_libs=yes + + # Go through the arguments, transforming them on the way. + while test $# -gt 0; do + arg="$1" + shift + + # If the previous option needs an argument, assign it. + if test -n "$prev"; then + case "$prev" in + output) + compile_command="$compile_command @OUTPUT@" + finalize_command="$finalize_command @OUTPUT@" + ;; + esac + + case "$prev" in + dlfiles|dlprefiles) + if test "$preload" = no; then + # Add the symbol object into the linking commands. + compile_command="$compile_command @SYMFILE@" + finalize_command="$finalize_command @SYMFILE@" + preload=yes + fi + case "$arg" in + *.la | *.lo) ;; # We handle these cases below. + force) + if test "$dlself" = no; then + dlself=needless + export_dynamic=yes + fi + prev= + continue + ;; + self) + if test "$prev" = dlprefiles; then + dlself=yes + elif test "$prev" = dlfiles && test "$dlopen_self" != yes; then + dlself=yes + else + dlself=needless + export_dynamic=yes + fi + prev= + continue + ;; + *) + if test "$prev" = dlfiles; then + dlfiles="$dlfiles $arg" + else + dlprefiles="$dlprefiles $arg" + fi + prev= + ;; + esac + ;; + expsyms) + export_symbols="$arg" + if test ! -f "$arg"; then + $echo "$modename: symbol file \`$arg' does not exist" + exit 1 + fi + prev= + continue + ;; + expsyms_regex) + export_symbols_regex="$arg" + prev= + continue + ;; + release) + release="-$arg" + prev= + continue + ;; + rpath | xrpath) + # We need an absolute path. + case "$arg" in + [\\/]* | [A-Za-z]:[\\/]*) ;; + *) + $echo "$modename: only absolute run-paths are allowed" 1>&2 + exit 1 + ;; + esac + if test "$prev" = rpath; then + case "$rpath " in + *" $arg "*) ;; + *) rpath="$rpath $arg" ;; + esac + else + case "$xrpath " in + *" $arg "*) ;; + *) xrpath="$xrpath $arg" ;; + esac + fi + prev= + continue + ;; + *) + eval "$prev=\"\$arg\"" + prev= + continue + ;; + esac + fi + + prevarg="$arg" + + case "$arg" in + -all-static) + if test -n "$link_static_flag"; then + compile_command="$compile_command $link_static_flag" + finalize_command="$finalize_command $link_static_flag" + fi + continue + ;; + + -allow-undefined) + # FIXME: remove this flag sometime in the future. + $echo "$modename: \`-allow-undefined' is deprecated because it is the default" 1>&2 + continue + ;; + + -avoid-version) + avoid_version=yes + continue + ;; + + -dlopen) + prev=dlfiles + continue + ;; + + -dlpreopen) + prev=dlprefiles + continue + ;; + + -export-dynamic) + export_dynamic=yes + continue + ;; + + -export-symbols | -export-symbols-regex) + if test -n "$export_symbols" || test -n "$export_symbols_regex"; then + $echo "$modename: not more than one -exported-symbols argument allowed" + exit 1 + fi + if test "X$arg" = "X-export-symbols"; then + prev=expsyms + else + prev=expsyms_regex + fi + continue + ;; + + -L*) + dir=`$echo "X$arg" | $Xsed -e 's/^-L//'` + # We need an absolute path. + case "$dir" in + [\\/]* | [A-Za-z]:[\\/]*) ;; + *) + absdir=`cd "$dir" && pwd` + if test -z "$absdir"; then + $echo "$modename: warning: cannot determine absolute directory name of \`$dir'" 1>&2 + $echo "$modename: passing it literally to the linker, although it might fail" 1>&2 + absdir="$dir" + fi + dir="$absdir" + ;; + esac + case " $deplibs " in + *" $arg "*) ;; + *) deplibs="$deplibs $arg";; + esac + case " $lib_search_path " in + *" $dir "*) ;; + *) lib_search_path="$lib_search_path $dir";; + esac + case "$host" in + *-*-cygwin* | *-*-mingw* | *-*-os2*) + dllsearchdir=`cd "$dir" && pwd || echo "$dir"` + case ":$dllsearchpath:" in + ::) dllsearchpath="$dllsearchdir";; + *":$dllsearchdir:"*) ;; + *) dllsearchpath="$dllsearchpath:$dllsearchdir";; + esac + ;; + esac + ;; + + -l*) + if test "$arg" = "-lc"; then + case "$host" in + *-*-cygwin* | *-*-mingw* | *-*-os2* | *-*-beos*) + # These systems don't actually have c library (as such) + continue + ;; + esac + elif test "$arg" = "-lm"; then + case "$host" in + *-*-cygwin* | *-*-beos*) + # These systems don't actually have math library (as such) + continue + ;; + esac + fi + deplibs="$deplibs $arg" + ;; + + -module) + module=yes + continue + ;; + + -no-undefined) + allow_undefined=no + continue + ;; + + -o) prev=output ;; + + -release) + prev=release + continue + ;; + + -rpath) + prev=rpath + continue + ;; + + -R) + prev=xrpath + continue + ;; + + -R*) + dir=`$echo "X$arg" | $Xsed -e 's/^-R//'` + # We need an absolute path. + case "$dir" in + [\\/]* | [A-Za-z]:[\\/]*) ;; + *) + $echo "$modename: only absolute run-paths are allowed" 1>&2 + exit 1 + ;; + esac + case "$xrpath " in + *" $dir "*) ;; + *) xrpath="$xrpath $dir" ;; + esac + continue + ;; + + -static) + # If we have no pic_flag, then this is the same as -all-static. + if test -z "$pic_flag" && test -n "$link_static_flag"; then + compile_command="$compile_command $link_static_flag" + finalize_command="$finalize_command $link_static_flag" + fi + continue + ;; + + -thread-safe) + thread_safe=yes + continue + ;; + + -version-info) + prev=vinfo + continue + ;; + + # Some other compiler flag. + -* | +*) + # Unknown arguments in both finalize_command and compile_command need + # to be aesthetically quoted because they are evaled later. + arg=`$echo "X$arg" | $Xsed -e "$sed_quote_subst"` + case "$arg" in + *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \ ]*|*]*) + arg="\"$arg\"" + ;; + esac + ;; + + *.o | *.obj | *.a | *.lib) + # A standard object. + objs="$objs $arg" + ;; + + *.lo) + # A library object. + if test "$prev" = dlfiles; then + dlfiles="$dlfiles $arg" + if test "$build_libtool_libs" = yes && test "$dlopen" = yes; then + prev= + continue + else + # If libtool objects are unsupported, then we need to preload. + prev=dlprefiles + fi + fi + + if test "$prev" = dlprefiles; then + # Preload the old-style object. + dlprefiles="$dlprefiles "`$echo "X$arg" | $Xsed -e "$lo2o"` + prev= + fi + libobjs="$libobjs $arg" + ;; + + *.la) + # A libtool-controlled library. + + dlname= + libdir= + library_names= + old_library= + + # Check to see that this really is a libtool archive. + if (sed -e '2q' $arg | egrep "^# Generated by .*$PACKAGE") >/dev/null 2>&1; then : + else + $echo "$modename: \`$arg' is not a valid libtool archive" 1>&2 + exit 1 + fi + + # If the library was installed with an old release of libtool, + # it will not redefine variable installed. + installed=yes + + # Read the .la file + # If there is no directory component, then add one. + case "$arg" in + */* | *\\*) . $arg ;; + *) . ./$arg ;; + esac + + # Get the name of the library we link against. + linklib= + for l in $old_library $library_names; do + linklib="$l" + done + + if test -z "$linklib"; then + $echo "$modename: cannot find name of link library for \`$arg'" 1>&2 + exit 1 + fi + + # Find the relevant object directory and library name. + name=`$echo "X$arg" | $Xsed -e 's%^.*/%%' -e 's/\.la$//' -e 's/^lib//'` + + if test "X$installed" = Xyes; then + dir="$libdir" + else + dir=`$echo "X$arg" | $Xsed -e 's%/[^/]*$%%'` + if test "X$dir" = "X$arg"; then + dir="$objdir" + else + dir="$dir/$objdir" + fi + fi + + if test -n "$dependency_libs"; then + # Extract -R and -L from dependency_libs + temp_deplibs= + for deplib in $dependency_libs; do + case "$deplib" in + -R*) temp_xrpath=`$echo "X$deplib" | $Xsed -e 's/^-R//'` + case " $rpath $xrpath " in + *" $temp_xrpath "*) ;; + *) xrpath="$xrpath $temp_xrpath";; + esac;; + -L*) case "$compile_command $temp_deplibs " in + *" $deplib "*) ;; + *) temp_deplibs="$temp_deplibs $deplib";; + esac + temp_dir=`$echo "X$deplib" | $Xsed -e 's/^-L//'` + case " $lib_search_path " in + *" $temp_dir "*) ;; + *) lib_search_path="$lib_search_path $temp_dir";; + esac + ;; + *) temp_deplibs="$temp_deplibs $deplib";; + esac + done + dependency_libs="$temp_deplibs" + fi + + if test -z "$libdir"; then + # It is a libtool convenience library, so add in its objects. + convenience="$convenience $dir/$old_library" + old_convenience="$old_convenience $dir/$old_library" + deplibs="$deplibs$dependency_libs" + compile_command="$compile_command $dir/$old_library$dependency_libs" + finalize_command="$finalize_command $dir/$old_library$dependency_libs" + continue + fi + + # This library was specified with -dlopen. + if test "$prev" = dlfiles; then + dlfiles="$dlfiles $arg" + if test -z "$dlname" || test "$dlopen" != yes || test "$build_libtool_libs" = no; then + # If there is no dlname, no dlopen support or we're linking statically, + # we need to preload. + prev=dlprefiles + else + # We should not create a dependency on this library, but we + # may need any libraries it requires. + compile_command="$compile_command$dependency_libs" + finalize_command="$finalize_command$dependency_libs" + prev= + continue + fi + fi + + # The library was specified with -dlpreopen. + if test "$prev" = dlprefiles; then + # Prefer using a static library (so that no silly _DYNAMIC symbols + # are required to link). + if test -n "$old_library"; then + dlprefiles="$dlprefiles $dir/$old_library" + else + dlprefiles="$dlprefiles $dir/$linklib" + fi + prev= + fi + + if test -n "$library_names" && + { test "$prefer_static_libs" = no || test -z "$old_library"; }; then + link_against_libtool_libs="$link_against_libtool_libs $arg" + if test -n "$shlibpath_var"; then + # Make sure the rpath contains only unique directories. + case "$temp_rpath " in + *" $dir "*) ;; + *) temp_rpath="$temp_rpath $dir" ;; + esac + fi + + # We need an absolute path. + case "$dir" in + [\\/] | [A-Za-z]:[\\/]*) absdir="$dir" ;; + *) + absdir=`cd "$dir" && pwd` + if test -z "$absdir"; then + $echo "$modename: warning: cannot determine absolute directory name of \`$dir'" 1>&2 + $echo "$modename: passing it literally to the linker, although it might fail" 1>&2 + absdir="$dir" + fi + ;; + esac + + # This is the magic to use -rpath. + # Skip directories that are in the system default run-time + # search path, unless they have been requested with -R. + case " $sys_lib_dlsearch_path " in + *" $absdir "*) ;; + *) + case "$compile_rpath " in + *" $absdir "*) ;; + *) compile_rpath="$compile_rpath $absdir" + esac + ;; + esac + + case " $sys_lib_dlsearch_path " in + *" $libdir "*) ;; + *) + case "$finalize_rpath " in + *" $libdir "*) ;; + *) finalize_rpath="$finalize_rpath $libdir" + esac + ;; + esac + + lib_linked=yes + case "$hardcode_action" in + immediate | unsupported) + if test "$hardcode_direct" = no; then + compile_command="$compile_command $dir/$linklib" + deplibs="$deplibs $dir/$linklib" + case "$host" in + *-*-cygwin* | *-*-mingw* | *-*-os2*) + dllsearchdir=`cd "$dir" && pwd || echo "$dir"` + if test -n "$dllsearchpath"; then + dllsearchpath="$dllsearchpath:$dllsearchdir" + else + dllsearchpath="$dllsearchdir" + fi + ;; + esac + elif test "$hardcode_minus_L" = no; then + case "$host" in + *-*-sunos*) + compile_shlibpath="$compile_shlibpath$dir:" + ;; + esac + case "$compile_command " in + *" -L$dir "*) ;; + *) compile_command="$compile_command -L$dir";; + esac + compile_command="$compile_command -l$name" + deplibs="$deplibs -L$dir -l$name" + elif test "$hardcode_shlibpath_var" = no; then + case ":$compile_shlibpath:" in + *":$dir:"*) ;; + *) compile_shlibpath="$compile_shlibpath$dir:";; + esac + compile_command="$compile_command -l$name" + deplibs="$deplibs -l$name" + else + lib_linked=no + fi + ;; + + relink) + if test "$hardcode_direct" = yes; then + compile_command="$compile_command $absdir/$linklib" + deplibs="$deplibs $absdir/$linklib" + elif test "$hardcode_minus_L" = yes; then + case "$compile_command " in + *" -L$absdir "*) ;; + *) compile_command="$compile_command -L$absdir";; + esac + compile_command="$compile_command -l$name" + deplibs="$deplibs -L$absdir -l$name" + elif test "$hardcode_shlibpath_var" = yes; then + case ":$compile_shlibpath:" in + *":$absdir:"*) ;; + *) compile_shlibpath="$compile_shlibpath$absdir:";; + esac + compile_command="$compile_command -l$name" + deplibs="$deplibs -l$name" + else + lib_linked=no + fi + ;; + + *) + lib_linked=no + ;; + esac + + if test "$lib_linked" != yes; then + $echo "$modename: configuration error: unsupported hardcode properties" + exit 1 + fi + + # Finalize command for both is simple: just hardcode it. + if test "$hardcode_direct" = yes; then + finalize_command="$finalize_command $libdir/$linklib" + elif test "$hardcode_minus_L" = yes; then + case "$finalize_command " in + *" -L$libdir "*) ;; + *) finalize_command="$finalize_command -L$libdir";; + esac + finalize_command="$finalize_command -l$name" + elif test "$hardcode_shlibpath_var" = yes; then + case ":$finalize_shlibpath:" in + *":$libdir:"*) ;; + *) finalize_shlibpath="$finalize_shlibpath$libdir:";; + esac + finalize_command="$finalize_command -l$name" + else + # We cannot seem to hardcode it, guess we'll fake it. + case "$finalize_command " in + *" -L$dir "*) ;; + *) finalize_command="$finalize_command -L$libdir";; + esac + finalize_command="$finalize_command -l$name" + fi + else + # Transform directly to old archives if we don't build new libraries. + if test -n "$pic_flag" && test -z "$old_library"; then + $echo "$modename: cannot find static library for \`$arg'" 1>&2 + exit 1 + fi + + # Here we assume that one of hardcode_direct or hardcode_minus_L + # is not unsupported. This is valid on all known static and + # shared platforms. + if test "$hardcode_direct" != unsupported; then + test -n "$old_library" && linklib="$old_library" + compile_command="$compile_command $dir/$linklib" + finalize_command="$finalize_command $dir/$linklib" + else + case "$compile_command " in + *" -L$dir "*) ;; + *) compile_command="$compile_command -L$dir";; + esac + compile_command="$compile_command -l$name" + case "$finalize_command " in + *" -L$dir "*) ;; + *) finalize_command="$finalize_command -L$dir";; + esac + finalize_command="$finalize_command -l$name" + fi + fi + + # Add in any libraries that this one depends upon. + compile_command="$compile_command$dependency_libs" + finalize_command="$finalize_command$dependency_libs" + continue + ;; + + # Some other compiler argument. + *) + # Unknown arguments in both finalize_command and compile_command need + # to be aesthetically quoted because they are evaled later. + arg=`$echo "X$arg" | $Xsed -e "$sed_quote_subst"` + case "$arg" in + *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \ ]*|*]*) + arg="\"$arg\"" + ;; + esac + ;; + esac + + # Now actually substitute the argument into the commands. + if test -n "$arg"; then + compile_command="$compile_command $arg" + finalize_command="$finalize_command $arg" + fi + done + + if test -n "$prev"; then + $echo "$modename: the \`$prevarg' option requires an argument" 1>&2 + $echo "$help" 1>&2 + exit 1 + fi + + if test "$export_dynamic" = yes && test -n "$export_dynamic_flag_spec"; then + eval arg=\"$export_dynamic_flag_spec\" + compile_command="$compile_command $arg" + finalize_command="$finalize_command $arg" + fi + + oldlibs= + # calculate the name of the file, without its directory + outputname=`$echo "X$output" | $Xsed -e 's%^.*/%%'` + libobjs_save="$libobjs" + + case "$output" in + "") + $echo "$modename: you must specify an output file" 1>&2 + $echo "$help" 1>&2 + exit 1 + ;; + + *.a | *.lib) + if test -n "$link_against_libtool_libs"; then + $echo "$modename: error: cannot link libtool libraries into archives" 1>&2 + exit 1 + fi + + if test -n "$deplibs"; then + $echo "$modename: warning: \`-l' and \`-L' are ignored for archives" 1>&2 + fi + + if test -n "$dlfiles$dlprefiles" || test "$dlself" != no; then + $echo "$modename: warning: \`-dlopen' is ignored for archives" 1>&2 + fi + + if test -n "$rpath"; then + $echo "$modename: warning: \`-rpath' is ignored for archives" 1>&2 + fi + + if test -n "$xrpath"; then + $echo "$modename: warning: \`-R' is ignored for archives" 1>&2 + fi + + if test -n "$vinfo"; then + $echo "$modename: warning: \`-version-info' is ignored for archives" 1>&2 + fi + + if test -n "$release"; then + $echo "$modename: warning: \`-release' is ignored for archives" 1>&2 + fi + + if test -n "$export_symbols" || test -n "$export_symbols_regex"; then + $echo "$modename: warning: \`-export-symbols' is ignored for archives" 1>&2 + fi + + # Now set the variables for building old libraries. + build_libtool_libs=no + oldlibs="$output" + ;; + + *.la) + # Make sure we only generate libraries of the form `libNAME.la'. + case "$outputname" in + lib*) + name=`$echo "X$outputname" | $Xsed -e 's/\.la$//' -e 's/^lib//'` + eval libname=\"$libname_spec\" + ;; + *) + if test "$module" = no; then + $echo "$modename: libtool library \`$output' must begin with \`lib'" 1>&2 + $echo "$help" 1>&2 + exit 1 + fi + if test "$need_lib_prefix" != no; then + # Add the "lib" prefix for modules if required + name=`$echo "X$outputname" | $Xsed -e 's/\.la$//'` + eval libname=\"$libname_spec\" + else + libname=`$echo "X$outputname" | $Xsed -e 's/\.la$//'` + fi + ;; + esac + + output_objdir=`$echo "X$output" | $Xsed -e 's%/[^/]*$%%'` + if test "X$output_objdir" = "X$output"; then + output_objdir="$objdir" + else + output_objdir="$output_objdir/$objdir" + fi + + if test -n "$objs"; then + $echo "$modename: cannot build libtool library \`$output' from non-libtool objects:$objs" 2>&1 + exit 1 + fi + + # How the heck are we supposed to write a wrapper for a shared library? + if test -n "$link_against_libtool_libs"; then + $echo "$modename: error: cannot link shared libraries into libtool libraries" 1>&2 + exit 1 + fi + + if test -n "$dlfiles$dlprefiles" || test "$dlself" != no; then + $echo "$modename: warning: \`-dlopen' is ignored for libtool libraries" 1>&2 + fi + + set dummy $rpath + if test $# -gt 2; then + $echo "$modename: warning: ignoring multiple \`-rpath's for a libtool library" 1>&2 + fi + install_libdir="$2" + + oldlibs= + if test -z "$rpath"; then + if test "$build_libtool_libs" = yes; then + # Building a libtool convenience library. + libext=al + oldlibs="$output_objdir/$libname.$libext $oldlibs" + build_libtool_libs=convenience + build_old_libs=yes + fi + dependency_libs="$deplibs" + + if test -n "$vinfo"; then + $echo "$modename: warning: \`-version-info' is ignored for convenience libraries" 1>&2 + fi + + if test -n "$release"; then + $echo "$modename: warning: \`-release' is ignored for convenience libraries" 1>&2 + fi + else + + # Parse the version information argument. + IFS="${IFS= }"; save_ifs="$IFS"; IFS=':' + set dummy $vinfo 0 0 0 + IFS="$save_ifs" + + if test -n "$8"; then + $echo "$modename: too many parameters to \`-version-info'" 1>&2 + $echo "$help" 1>&2 + exit 1 + fi + + current="$2" + revision="$3" + age="$4" + + # Check that each of the things are valid numbers. + case "$current" in + 0 | [1-9] | [1-9][0-9]*) ;; + *) + $echo "$modename: CURRENT \`$current' is not a nonnegative integer" 1>&2 + $echo "$modename: \`$vinfo' is not valid version information" 1>&2 + exit 1 + ;; + esac + + case "$revision" in + 0 | [1-9] | [1-9][0-9]*) ;; + *) + $echo "$modename: REVISION \`$revision' is not a nonnegative integer" 1>&2 + $echo "$modename: \`$vinfo' is not valid version information" 1>&2 + exit 1 + ;; + esac + + case "$age" in + 0 | [1-9] | [1-9][0-9]*) ;; + *) + $echo "$modename: AGE \`$age' is not a nonnegative integer" 1>&2 + $echo "$modename: \`$vinfo' is not valid version information" 1>&2 + exit 1 + ;; + esac + + if test $age -gt $current; then + $echo "$modename: AGE \`$age' is greater than the current interface number \`$current'" 1>&2 + $echo "$modename: \`$vinfo' is not valid version information" 1>&2 + exit 1 + fi + + # Calculate the version variables. + major= + versuffix= + verstring= + case "$version_type" in + none) ;; + + irix) + major=`expr $current - $age + 1` + versuffix="$major.$revision" + verstring="sgi$major.$revision" + + # Add in all the interfaces that we are compatible with. + loop=$revision + while test $loop != 0; do + iface=`expr $revision - $loop` + loop=`expr $loop - 1` + verstring="sgi$major.$iface:$verstring" + done + ;; + + linux) + major=.`expr $current - $age` + versuffix="$major.$age.$revision" + ;; + + osf) + major=`expr $current - $age` + versuffix=".$current.$age.$revision" + verstring="$current.$age.$revision" + + # Add in all the interfaces that we are compatible with. + loop=$age + while test $loop != 0; do + iface=`expr $current - $loop` + loop=`expr $loop - 1` + verstring="$verstring:${iface}.0" + done + + # Make executables depend on our current version. + verstring="$verstring:${current}.0" + ;; + + sunos) + major=".$current" + versuffix=".$current.$revision" + ;; + + freebsd-aout) + major=".$current" + versuffix=".$current.$revision"; + ;; + + freebsd-elf) + major=".$current" + versuffix=".$current"; + ;; + + windows) + # Like Linux, but with '-' rather than '.', since we only + # want one extension on Windows 95. + major=`expr $current - $age` + versuffix="-$major-$age-$revision" + ;; + + *) + $echo "$modename: unknown library version type \`$version_type'" 1>&2 + echo "Fatal configuration error. See the $PACKAGE docs for more information." 1>&2 + exit 1 + ;; + esac + + # Clear the version info if we defaulted, and they specified a release. + if test -z "$vinfo" && test -n "$release"; then + major= + verstring="0.0" + if test "$need_version" = no; then + versuffix= + else + versuffix=".0.0" + fi + fi + + # Remove version info from name if versioning should be avoided + if test "$avoid_version" = yes && test "$need_version" = no; then + major= + versuffix= + verstring="" + fi + + # Check to see if the archive will have undefined symbols. + if test "$allow_undefined" = yes; then + if test "$allow_undefined_flag" = unsupported; then + $echo "$modename: warning: undefined symbols not allowed in $host shared libraries" 1>&2 + build_libtool_libs=no + build_old_libs=yes + fi + else + # Don't allow undefined symbols. + allow_undefined_flag="$no_undefined_flag" + fi + + dependency_libs="$deplibs" + case "$host" in + *-*-cygwin* | *-*-mingw* | *-*-os2* | *-*-beos*) + # these systems don't actually have a c library (as such)! + ;; + *) + # Add libc to deplibs on all other systems. + deplibs="$deplibs -lc" + ;; + esac + fi + + # Create the output directory, or remove our outputs if we need to. + if test -d $output_objdir; then + $show "${rm}r $output_objdir/$outputname $output_objdir/$libname.* $output_objdir/${libname}${release}.*" + $run ${rm}r $output_objdir/$outputname $output_objdir/$libname.* $output_objdir/${libname}${release}.* + else + $show "$mkdir $output_objdir" + $run $mkdir $output_objdir + status=$? + if test $status -ne 0 && test ! -d $output_objdir; then + exit $status + fi + fi + + # Now set the variables for building old libraries. + if test "$build_old_libs" = yes && test "$build_libtool_libs" != convenience ; then + oldlibs="$oldlibs $output_objdir/$libname.$libext" + + # Transform .lo files to .o files. + oldobjs="$objs "`$echo "X$libobjs" | $SP2NL | $Xsed -e '/\.'${libext}'$/d' -e "$lo2o" | $NL2SP` + fi + + if test "$build_libtool_libs" = yes; then + # Transform deplibs into only deplibs that can be linked in shared. + name_save=$name + libname_save=$libname + release_save=$release + versuffix_save=$versuffix + major_save=$major + # I'm not sure if I'm treating the release correctly. I think + # release should show up in the -l (ie -lgmp5) so we don't want to + # add it in twice. Is that correct? + release="" + versuffix="" + major="" + newdeplibs= + droppeddeps=no + case "$deplibs_check_method" in + pass_all) + # Don't check for shared/static. Everything works. + # This might be a little naive. We might want to check + # whether the library exists or not. But this is on + # osf3 & osf4 and I'm not really sure... Just + # implementing what was already the behaviour. + newdeplibs=$deplibs + ;; + test_compile) + # This code stresses the "libraries are programs" paradigm to its + # limits. Maybe even breaks it. We compile a program, linking it + # against the deplibs as a proxy for the library. Then we can check + # whether they linked in statically or dynamically with ldd. + $rm conftest.c + cat > conftest.c </dev/null` + for potent_lib in $potential_libs; do + # Follow soft links. + if ls -lLd "$potent_lib" 2>/dev/null \ + | grep " -> " >/dev/null; then + continue + fi + # The statement above tries to avoid entering an + # endless loop below, in case of cyclic links. + # We might still enter an endless loop, since a link + # loop can be closed while we follow links, + # but so what? + potlib="$potent_lib" + while test -h "$potlib" 2>/dev/null; do + potliblink=`ls -ld $potlib | sed 's/.* -> //'` + case "$potliblink" in + [\\/]* | [A-Za-z]:[\\/]*) potlib="$potliblink";; + *) potlib=`$echo "X$potlib" | $Xsed -e 's,[^/]*$,,'`"$potliblink";; + esac + done + if eval $file_magic_cmd \"\$potlib\" 2>/dev/null \ + | sed 10q \ + | egrep "$file_magic_regex" > /dev/null; then + newdeplibs="$newdeplibs $a_deplib" + a_deplib="" + break 2 + fi + done + done + if test -n "$a_deplib" ; then + droppeddeps=yes + echo + echo "*** Warning: This library needs some functionality provided by $a_deplib." + echo "*** I have the capability to make that library automatically link in when" + echo "*** you link to this library. But I can only do this if you have a" + echo "*** shared version of the library, which you do not appear to have." + fi + else + # Add a -L argument. + newdeplibs="$newdeplibs $a_deplib" + fi + done # Gone through all deplibs. + ;; + none | unknown | *) + newdeplibs="" + if $echo "X $deplibs" | $Xsed -e 's/ -lc$//' \ + -e 's/ -[LR][^ ]*//g' -e 's/[ ]//g' | + grep . >/dev/null; then + echo + if test "X$deplibs_check_method" = "Xnone"; then + echo "*** Warning: inter-library dependencies are not supported in this platform." + else + echo "*** Warning: inter-library dependencies are not known to be supported." + fi + echo "*** All declared inter-library dependencies are being dropped." + droppeddeps=yes + fi + ;; + esac + versuffix=$versuffix_save + major=$major_save + release=$release_save + libname=$libname_save + name=$name_save + + if test "$droppeddeps" = yes; then + if test "$module" = yes; then + echo + echo "*** Warning: libtool could not satisfy all declared inter-library" + echo "*** dependencies of module $libname. Therefore, libtool will create" + echo "*** a static module, that should work as long as the dlopening" + echo "*** application is linked with the -dlopen flag." + if test -z "$global_symbol_pipe"; then + echo + echo "*** However, this would only work if libtool was able to extract symbol" + echo "*** lists from a program, using \`nm' or equivalent, but libtool could" + echo "*** not find such a program. So, this module is probably useless." + echo "*** \`nm' from GNU binutils and a full rebuild may help." + fi + if test "$build_old_libs" = no; then + oldlibs="$output_objdir/$libname.$libext" + build_libtool_libs=module + build_old_libs=yes + else + build_libtool_libs=no + fi + else + echo "*** The inter-library dependencies that have been dropped here will be" + echo "*** automatically added whenever a program is linked with this library" + echo "*** or is declared to -dlopen it." + fi + fi + # Done checking deplibs! + deplibs=$newdeplibs + fi + + # All the library-specific variables (install_libdir is set above). + library_names= + old_library= + dlname= + + # Test again, we may have decided not to build it any more + if test "$build_libtool_libs" = yes; then + # Get the real and link names of the library. + eval library_names=\"$library_names_spec\" + set dummy $library_names + realname="$2" + shift; shift + + if test -n "$soname_spec"; then + eval soname=\"$soname_spec\" + else + soname="$realname" + fi + + lib="$output_objdir/$realname" + for link + do + linknames="$linknames $link" + done + + # Ensure that we have .o objects for linkers which dislike .lo + # (e.g. aix) incase we are running --disable-static + for obj in $libobjs; do + oldobj=`$echo "X$obj" | $Xsed -e "$lo2o"` + if test ! -f $oldobj; then + $show "${LN_S} $obj $oldobj" + $run ${LN_S} $obj $oldobj || exit $? + fi + done + + # Use standard objects if they are pic + test -z "$pic_flag" && libobjs=`$echo "X$libobjs" | $SP2NL | $Xsed -e "$lo2o" | $NL2SP` + + # Prepare the list of exported symbols + if test -z "$export_symbols"; then + if test "$always_export_symbols" = yes || test -n "$export_symbols_regex"; then + $show "generating symbol list for \`$libname.la'" + export_symbols="$output_objdir/$libname.exp" + $run $rm $export_symbols + eval cmds=\"$export_symbols_cmds\" + IFS="${IFS= }"; save_ifs="$IFS"; IFS='~' + for cmd in $cmds; do + IFS="$save_ifs" + $show "$cmd" + $run eval "$cmd" || exit $? + done + IFS="$save_ifs" + if test -n "$export_symbols_regex"; then + $show "egrep -e \"$export_symbols_regex\" \"$export_symbols\" > \"${export_symbols}T\"" + $run eval 'egrep -e "$export_symbols_regex" "$export_symbols" > "${export_symbols}T"' + $show "$mv \"${export_symbols}T\" \"$export_symbols\"" + $run eval '$mv "${export_symbols}T" "$export_symbols"' + fi + fi + fi + + if test -n "$export_symbols" && test -n "$include_expsyms"; then + $run eval '$echo "X$include_expsyms" | $SP2NL >> "$export_symbols"' + fi + + if test -n "$convenience"; then + if test -n "$whole_archive_flag_spec"; then + eval libobjs=\"\$libobjs $whole_archive_flag_spec\" + else + gentop="$output_objdir/${outputname}x" + $show "${rm}r $gentop" + $run ${rm}r "$gentop" + $show "mkdir $gentop" + $run mkdir "$gentop" + status=$? + if test $status -ne 0 && test ! -d "$gentop"; then + exit $status + fi + generated="$generated $gentop" + + for xlib in $convenience; do + # Extract the objects. + case "$xlib" in + [\\/]* | [A-Za-z]:[\\/]*) xabs="$xlib" ;; + *) xabs=`pwd`"/$xlib" ;; + esac + xlib=`$echo "X$xlib" | $Xsed -e 's%^.*/%%'` + xdir="$gentop/$xlib" + + $show "${rm}r $xdir" + $run ${rm}r "$xdir" + $show "mkdir $xdir" + $run mkdir "$xdir" + status=$? + if test $status -ne 0 && test ! -d "$xdir"; then + exit $status + fi + $show "(cd $xdir && $AR x $xabs)" + $run eval "(cd \$xdir && $AR x \$xabs)" || exit $? + + libobjs="$libobjs "`find $xdir -name \*.o -print -o -name \*.lo -print | $NL2SP` + done + fi + fi + + if test "$thread_safe" = yes && test -n "$thread_safe_flag_spec"; then + eval flag=\"$thread_safe_flag_spec\" + linkopts="$linkopts $flag" + fi + + # Do each of the archive commands. + if test -n "$export_symbols" && test -n "$archive_expsym_cmds"; then + eval cmds=\"$archive_expsym_cmds\" + else + eval cmds=\"$archive_cmds\" + fi + IFS="${IFS= }"; save_ifs="$IFS"; IFS='~' + for cmd in $cmds; do + IFS="$save_ifs" + $show "$cmd" + $run eval "$cmd" || exit $? + done + IFS="$save_ifs" + + # Create links to the real library. + for linkname in $linknames; do + if test "$realname" != "$linkname"; then + $show "(cd $output_objdir && $rm $linkname && $LN_S $realname $linkname)" + $run eval '(cd $output_objdir && $rm $linkname && $LN_S $realname $linkname)' || exit $? + fi + done + + # If -module or -export-dynamic was specified, set the dlname. + if test "$module" = yes || test "$export_dynamic" = yes; then + # On all known operating systems, these are identical. + dlname="$soname" + fi + fi + ;; + + *.lo | *.o | *.obj) + if test -n "$link_against_libtool_libs"; then + $echo "$modename: error: cannot link libtool libraries into objects" 1>&2 + exit 1 + fi + + if test -n "$deplibs"; then + $echo "$modename: warning: \`-l' and \`-L' are ignored for objects" 1>&2 + fi + + if test -n "$dlfiles$dlprefiles" || test "$dlself" != no; then + $echo "$modename: warning: \`-dlopen' is ignored for objects" 1>&2 + fi + + if test -n "$rpath"; then + $echo "$modename: warning: \`-rpath' is ignored for objects" 1>&2 + fi + + if test -n "$xrpath"; then + $echo "$modename: warning: \`-R' is ignored for objects" 1>&2 + fi + + if test -n "$vinfo"; then + $echo "$modename: warning: \`-version-info' is ignored for objects" 1>&2 + fi + + if test -n "$release"; then + $echo "$modename: warning: \`-release' is ignored for objects" 1>&2 + fi + + case "$output" in + *.lo) + if test -n "$objs"; then + $echo "$modename: cannot build library object \`$output' from non-libtool objects" 1>&2 + exit 1 + fi + libobj="$output" + obj=`$echo "X$output" | $Xsed -e "$lo2o"` + ;; + *) + libobj= + obj="$output" + ;; + esac + + # Delete the old objects. + $run $rm $obj $libobj + + # Objects from convenience libraries. This assumes + # single-version convenience libraries. Whenever we create + # different ones for PIC/non-PIC, this we'll have to duplicate + # the extraction. + reload_conv_objs= + gentop= + # reload_cmds runs $LD directly, so let us get rid of + # -Wl from whole_archive_flag_spec + wl= + + if test -n "$convenience"; then + if test -n "$whole_archive_flag_spec"; then + eval reload_conv_objs=\"\$reload_objs $whole_archive_flag_spec\" + else + gentop="$output_objdir/${obj}x" + $show "${rm}r $gentop" + $run ${rm}r "$gentop" + $show "mkdir $gentop" + $run mkdir "$gentop" + status=$? + if test $status -ne 0 && test ! -d "$gentop"; then + exit $status + fi + generated="$generated $gentop" + + for xlib in $convenience; do + # Extract the objects. + case "$xlib" in + [\\/]* | [A-Za-z]:[\\/]*) xabs="$xlib" ;; + *) xabs=`pwd`"/$xlib" ;; + esac + xlib=`$echo "X$xlib" | $Xsed -e 's%^.*/%%'` + xdir="$gentop/$xlib" + + $show "${rm}r $xdir" + $run ${rm}r "$xdir" + $show "mkdir $xdir" + $run mkdir "$xdir" + status=$? + if test $status -ne 0 && test ! -d "$xdir"; then + exit $status + fi + $show "(cd $xdir && $AR x $xabs)" + $run eval "(cd \$xdir && $AR x \$xabs)" || exit $? + + reload_conv_objs="$reload_objs "`find $xdir -name \*.o -print -o -name \*.lo -print | $NL2SP` + done + fi + fi + + # Create the old-style object. + reload_objs="$objs "`$echo "X$libobjs" | $SP2NL | $Xsed -e '/\.'${libext}$'/d' -e '/\.lib$/d' -e "$lo2o" | $NL2SP`" $reload_conv_objs" + + output="$obj" + eval cmds=\"$reload_cmds\" + IFS="${IFS= }"; save_ifs="$IFS"; IFS='~' + for cmd in $cmds; do + IFS="$save_ifs" + $show "$cmd" + $run eval "$cmd" || exit $? + done + IFS="$save_ifs" + + # Exit if we aren't doing a library object file. + if test -z "$libobj"; then + if test -n "$gentop"; then + $show "${rm}r $gentop" + $run ${rm}r $gentop + fi + + exit 0 + fi + + if test "$build_libtool_libs" != yes; then + if test -n "$gentop"; then + $show "${rm}r $gentop" + $run ${rm}r $gentop + fi + + # Create an invalid libtool object if no PIC, so that we don't + # accidentally link it into a program. + $show "echo timestamp > $libobj" + $run eval "echo timestamp > $libobj" || exit $? + exit 0 + fi + + if test -n "$pic_flag"; then + # Only do commands if we really have different PIC objects. + reload_objs="$libobjs $reload_conv_objs" + output="$libobj" + eval cmds=\"$reload_cmds\" + IFS="${IFS= }"; save_ifs="$IFS"; IFS='~' + for cmd in $cmds; do + IFS="$save_ifs" + $show "$cmd" + $run eval "$cmd" || exit $? + done + IFS="$save_ifs" + else + # Just create a symlink. + $show $rm $libobj + $run $rm $libobj + $show "$LN_S $obj $libobj" + $run $LN_S $obj $libobj || exit $? + fi + + if test -n "$gentop"; then + $show "${rm}r $gentop" + $run ${rm}r $gentop + fi + + exit 0 + ;; + + # Anything else should be a program. + *) + if test -n "$vinfo"; then + $echo "$modename: warning: \`-version-info' is ignored for programs" 1>&2 + fi + + if test -n "$release"; then + $echo "$modename: warning: \`-release' is ignored for programs" 1>&2 + fi + + if test "$preload" = yes; then + if test "$dlopen" = unknown && test "$dlopen_self" = unknown && + test "$dlopen_self_static" = unknown; then + $echo "$modename: warning: \`AC_LIBTOOL_DLOPEN' not used. Assuming no dlopen support." + fi + fi + + if test -n "$rpath$xrpath"; then + # If the user specified any rpath flags, then add them. + for libdir in $rpath $xrpath; do + # This is the magic to use -rpath. + case "$compile_rpath " in + *" $libdir "*) ;; + *) compile_rpath="$compile_rpath $libdir" ;; + esac + case "$finalize_rpath " in + *" $libdir "*) ;; + *) finalize_rpath="$finalize_rpath $libdir" ;; + esac + done + fi + + # Now hardcode the library paths + rpath= + hardcode_libdirs= + for libdir in $compile_rpath $finalize_rpath; do + if test -n "$hardcode_libdir_flag_spec"; then + if test -n "$hardcode_libdir_separator"; then + if test -z "$hardcode_libdirs"; then + hardcode_libdirs="$libdir" + else + # Just accumulate the unique libdirs. + case "$hardcode_libdir_separator$hardcode_libdirs$hardcode_libdir_separator" in + *"$hardcode_libdir_separator$libdir$hardcode_libdir_separator"*) + ;; + *) + hardcode_libdirs="$hardcode_libdirs$hardcode_libdir_separator$libdir" + ;; + esac + fi + else + eval flag=\"$hardcode_libdir_flag_spec\" + rpath="$rpath $flag" + fi + elif test -n "$runpath_var"; then + case "$perm_rpath " in + *" $libdir "*) ;; + *) perm_rpath="$perm_rpath $libdir" ;; + esac + fi + done + # Substitute the hardcoded libdirs into the rpath. + if test -n "$hardcode_libdir_separator" && + test -n "$hardcode_libdirs"; then + libdir="$hardcode_libdirs" + eval rpath=\" $hardcode_libdir_flag_spec\" + fi + compile_rpath="$rpath" + + rpath= + hardcode_libdirs= + for libdir in $finalize_rpath; do + if test -n "$hardcode_libdir_flag_spec"; then + if test -n "$hardcode_libdir_separator"; then + if test -z "$hardcode_libdirs"; then + hardcode_libdirs="$libdir" + else + # Just accumulate the unique libdirs. + case "$hardcode_libdir_separator$hardcode_libdirs$hardcode_libdir_separator" in + *"$hardcode_libdir_separator$libdir$hardcode_libdir_separator"*) + ;; + *) + hardcode_libdirs="$hardcode_libdirs$hardcode_libdir_separator$libdir" + ;; + esac + fi + else + eval flag=\"$hardcode_libdir_flag_spec\" + rpath="$rpath $flag" + fi + elif test -n "$runpath_var"; then + case "$finalize_perm_rpath " in + *" $libdir "*) ;; + *) finalize_perm_rpath="$finalize_perm_rpath $libdir" ;; + esac + fi + done + # Substitute the hardcoded libdirs into the rpath. + if test -n "$hardcode_libdir_separator" && + test -n "$hardcode_libdirs"; then + libdir="$hardcode_libdirs" + eval rpath=\" $hardcode_libdir_flag_spec\" + fi + finalize_rpath="$rpath" + + output_objdir=`$echo "X$output" | $Xsed -e 's%/[^/]*$%%'` + if test "X$output_objdir" = "X$output"; then + output_objdir="$objdir" + else + output_objdir="$output_objdir/$objdir" + fi + + # Create the binary in the object directory, then wrap it. + if test ! -d $output_objdir; then + $show "$mkdir $output_objdir" + $run $mkdir $output_objdir + status=$? + if test $status -ne 0 && test ! -d $output_objdir; then + exit $status + fi + fi + + if test -n "$libobjs" && test "$build_old_libs" = yes; then + # Transform all the library objects into standard objects. + compile_command=`$echo "X$compile_command" | $SP2NL | $Xsed -e "$lo2o" | $NL2SP` + finalize_command=`$echo "X$finalize_command" | $SP2NL | $Xsed -e "$lo2o" | $NL2SP` + fi + + dlsyms= + if test -n "$dlfiles$dlprefiles" || test "$dlself" != no; then + if test -n "$NM" && test -n "$global_symbol_pipe"; then + dlsyms="${outputname}S.c" + else + $echo "$modename: not configured to extract global symbols from dlpreopened files" 1>&2 + fi + fi + + if test -n "$dlsyms"; then + case "$dlsyms" in + "") ;; + *.c) + # Discover the nlist of each of the dlfiles. + nlist="$output_objdir/${outputname}.nm" + + $show "$rm $nlist ${nlist}S ${nlist}T" + $run $rm "$nlist" "${nlist}S" "${nlist}T" + + # Parse the name list into a source file. + $show "creating $output_objdir/$dlsyms" + + test -z "$run" && $echo > "$output_objdir/$dlsyms" "\ +/* $dlsyms - symbol resolution table for \`$outputname' dlsym emulation. */ +/* Generated by $PROGRAM - GNU $PACKAGE $VERSION$TIMESTAMP */ + +#ifdef __cplusplus +extern \"C\" { +#endif + +/* Prevent the only kind of declaration conflicts we can make. */ +#define lt_preloaded_symbols some_other_symbol + +/* External symbol declarations for the compiler. */\ +" + + if test "$dlself" = yes; then + $show "generating symbol list for \`$output'" + + test -z "$run" && $echo ': @PROGRAM@ ' > "$nlist" + + # Add our own program objects to the symbol list. + progfiles=`$echo "X$objs" | $SP2NL | $Xsed -e "$lo2o" | $NL2SP` + for arg in $progfiles; do + $show "extracting global C symbols from \`$arg'" + $run eval "$NM $arg | $global_symbol_pipe >> '$nlist'" + done + + if test -n "$exclude_expsyms"; then + $run eval 'egrep -v " ($exclude_expsyms)$" "$nlist" > "$nlist"T' + $run eval '$mv "$nlist"T "$nlist"' + fi + + if test -n "$export_symbols_regex"; then + $run eval 'egrep -e "$export_symbols_regex" "$nlist" > "$nlist"T' + $run eval '$mv "$nlist"T "$nlist"' + fi + + # Prepare the list of exported symbols + if test -z "$export_symbols"; then + export_symbols="$output_objdir/$output.exp" + $run $rm $export_symbols + $run eval "sed -n -e '/^: @PROGRAM@$/d' -e 's/^.* \(.*\)$/\1/p' "'< "$nlist" > "$export_symbols"' + else + $run eval "sed -e 's/\([][.*^$]\)/\\\1/g' -e 's/^/ /' -e 's/$/$/'"' < "$export_symbols" > "$output_objdir/$output.exp"' + $run eval 'grep -f "$output_objdir/$output.exp" < "$nlist" > "$nlist"T' + $run eval 'mv "$nlist"T "$nlist"' + fi + fi + + for arg in $dlprefiles; do + $show "extracting global C symbols from \`$arg'" + name=`echo "$arg" | sed -e 's%^.*/%%'` + $run eval 'echo ": $name " >> "$nlist"' + $run eval "$NM $arg | $global_symbol_pipe >> '$nlist'" + done + + if test -z "$run"; then + # Make sure we have at least an empty file. + test -f "$nlist" || : > "$nlist" + + if test -n "$exclude_expsyms"; then + egrep -v " ($exclude_expsyms)$" "$nlist" > "$nlist"T + $mv "$nlist"T "$nlist" + fi + + # Try sorting and uniquifying the output. + if grep -v "^: " < "$nlist" | sort +2 | uniq > "$nlist"S; then + : + else + grep -v "^: " < "$nlist" > "$nlist"S + fi + + if test -f "$nlist"S; then + eval "$global_symbol_to_cdecl"' < "$nlist"S >> "$output_objdir/$dlsyms"' + else + echo '/* NONE */' >> "$output_objdir/$dlsyms" + fi + + $echo >> "$output_objdir/$dlsyms" "\ + +#undef lt_preloaded_symbols + +#if defined (__STDC__) && __STDC__ +# define lt_ptr_t void * +#else +# define lt_ptr_t char * +# define const +#endif + +/* The mapping between symbol names and symbols. */ +const struct { + const char *name; + lt_ptr_t address; +} +lt_preloaded_symbols[] = +{\ +" + + sed -n -e 's/^: \([^ ]*\) $/ {\"\1\", (lt_ptr_t) 0},/p' \ + -e 's/^. \([^ ]*\) \([^ ]*\)$/ {"\2", (lt_ptr_t) \&\2},/p' \ + < "$nlist" >> "$output_objdir/$dlsyms" + + $echo >> "$output_objdir/$dlsyms" "\ + {0, (lt_ptr_t) 0} +}; + +/* This works around a problem in FreeBSD linker */ +#ifdef FREEBSD_WORKAROUND +static const void *lt_preloaded_setup() { + return lt_preloaded_symbols; +} +#endif + +#ifdef __cplusplus +} +#endif\ +" + fi + + pic_flag_for_symtable= + case "$host" in + # compiling the symbol table file with pic_flag works around + # a FreeBSD bug that causes programs to crash when -lm is + # linked before any other PIC object. But we must not use + # pic_flag when linking with -static. The problem exists in + # FreeBSD 2.2.6 and is fixed in FreeBSD 3.1. + *-*-freebsd2*|*-*-freebsd3.0*) + case "$compile_command " in + *" -static "*) ;; + *) pic_flag_for_symtable=" $pic_flag -DPIC -DFREEBSD_WORKAROUND";; + esac + esac + + # Now compile the dynamic symbol file. + $show "(cd $output_objdir && $C_compiler -c$no_builtin_flag$pic_flag_for_symtable \"$dlsyms\")" + $run eval '(cd $output_objdir && $C_compiler -c$no_builtin_flag$pic_flag_for_symtable "$dlsyms")' || exit $? + + # Clean up the generated files. + $show "$rm $output_objdir/$dlsyms $nlist ${nlist}S ${nlist}T" + $run $rm "$output_objdir/$dlsyms" "$nlist" "${nlist}S" "${nlist}T" + + # Transform the symbol file into the correct name. + compile_command=`$echo "X$compile_command" | $Xsed -e "s%@SYMFILE@%$output_objdir/${outputname}S.${objext}%"` + finalize_command=`$echo "X$finalize_command" | $Xsed -e "s%@SYMFILE@%$output_objdir/${outputname}S.${objext}%"` + ;; + *) + $echo "$modename: unknown suffix for \`$dlsyms'" 1>&2 + exit 1 + ;; + esac + else + # We keep going just in case the user didn't refer to + # lt_preloaded_symbols. The linker will fail if global_symbol_pipe + # really was required. + + # Nullify the symbol file. + compile_command=`$echo "X$compile_command" | $Xsed -e "s% @SYMFILE@%%"` + finalize_command=`$echo "X$finalize_command" | $Xsed -e "s% @SYMFILE@%%"` + fi + + if test -z "$link_against_libtool_libs" || test "$build_libtool_libs" != yes; then + # Replace the output file specification. + compile_command=`$echo "X$compile_command" | $Xsed -e 's%@OUTPUT@%'"$output"'%g'` + link_command="$compile_command$compile_rpath" + + # We have no uninstalled library dependencies, so finalize right now. + $show "$link_command" + $run eval "$link_command" + status=$? + + # Delete the generated files. + if test -n "$dlsyms"; then + $show "$rm $output_objdir/${outputname}S.${objext}" + $run $rm "$output_objdir/${outputname}S.${objext}" + fi + + exit $status + fi + + if test -n "$shlibpath_var"; then + # We should set the shlibpath_var + rpath= + for dir in $temp_rpath; do + case "$dir" in + [\\/]* | [A-Za-z]:[\\/]*) + # Absolute path. + rpath="$rpath$dir:" + ;; + *) + # Relative path: add a thisdir entry. + rpath="$rpath\$thisdir/$dir:" + ;; + esac + done + temp_rpath="$rpath" + fi + + if test -n "$compile_shlibpath$finalize_shlibpath"; then + compile_command="$shlibpath_var=\"$compile_shlibpath$finalize_shlibpath\$$shlibpath_var\" $compile_command" + fi + if test -n "$finalize_shlibpath"; then + finalize_command="$shlibpath_var=\"$finalize_shlibpath\$$shlibpath_var\" $finalize_command" + fi + + compile_var= + finalize_var= + if test -n "$runpath_var"; then + if test -n "$perm_rpath"; then + # We should set the runpath_var. + rpath= + for dir in $perm_rpath; do + rpath="$rpath$dir:" + done + compile_var="$runpath_var=\"$rpath\$$runpath_var\" " + fi + if test -n "$finalize_perm_rpath"; then + # We should set the runpath_var. + rpath= + for dir in $finalize_perm_rpath; do + rpath="$rpath$dir:" + done + finalize_var="$runpath_var=\"$rpath\$$runpath_var\" " + fi + fi + + if test "$hardcode_action" = relink; then + # Fast installation is not supported + link_command="$compile_var$compile_command$compile_rpath" + relink_command="$finalize_var$finalize_command$finalize_rpath" + + $echo "$modename: warning: this platform does not like uninstalled shared libraries" 1>&2 + $echo "$modename: \`$output' will be relinked during installation" 1>&2 + else + if test "$fast_install" != no; then + link_command="$finalize_var$compile_command$finalize_rpath" + if test "$fast_install" = yes; then + relink_command=`$echo "X$compile_var$compile_command$compile_rpath" | $Xsed -e 's%@OUTPUT@%\$progdir/\$file%g'` + else + # fast_install is set to needless + relink_command= + fi + else + link_command="$compile_var$compile_command$compile_rpath" + relink_command="$finalize_var$finalize_command$finalize_rpath" + fi + fi + + # Replace the output file specification. + link_command=`$echo "X$link_command" | $Xsed -e 's%@OUTPUT@%'"$output_objdir/$outputname"'%g'` + + # Delete the old output files. + $run $rm $output $output_objdir/$outputname $output_objdir/lt-$outputname + + $show "$link_command" + $run eval "$link_command" || exit $? + + # Now create the wrapper script. + $show "creating $output" + + # Quote the relink command for shipping. + if test -n "$relink_command"; then + relink_command=`$echo "X$relink_command" | $Xsed -e "$sed_quote_subst"` + fi + + # Quote $echo for shipping. + if test "X$echo" = "X$SHELL $0 --fallback-echo"; then + case "$0" in + [\\/]* | [A-Za-z]:[\\/]*) qecho="$SHELL $0 --fallback-echo";; + *) qecho="$SHELL `pwd`/$0 --fallback-echo";; + esac + qecho=`$echo "X$qecho" | $Xsed -e "$sed_quote_subst"` + else + qecho=`$echo "X$echo" | $Xsed -e "$sed_quote_subst"` + fi + + # Only actually do things if our run command is non-null. + if test -z "$run"; then + # win32 will think the script is a binary if it has + # a .exe suffix, so we strip it off here. + case $output in + *.exe) output=`echo $output|sed 's,.exe$,,'` ;; + esac + $rm $output + trap "$rm $output; exit 1" 1 2 15 + + $echo > $output "\ +#! $SHELL + +# $output - temporary wrapper script for $objdir/$outputname +# Generated by $PROGRAM - GNU $PACKAGE $VERSION$TIMESTAMP +# +# The $output program cannot be directly executed until all the libtool +# libraries that it depends on are installed. +# +# This wrapper script should never be moved out of the build directory. +# If it is, it will not operate correctly. + +# Sed substitution that helps us do robust quoting. It backslashifies +# metacharacters that are still active within double-quoted strings. +Xsed='sed -e 1s/^X//' +sed_quote_subst='$sed_quote_subst' + +# The HP-UX ksh and POSIX shell print the target directory to stdout +# if CDPATH is set. +if test \"\${CDPATH+set}\" = set; then CDPATH=; export CDPATH; fi + +relink_command=\"$relink_command\" + +# This environment variable determines our operation mode. +if test \"\$libtool_install_magic\" = \"$magic\"; then + # install mode needs the following variable: + link_against_libtool_libs='$link_against_libtool_libs' +else + # When we are sourced in execute mode, \$file and \$echo are already set. + if test \"\$libtool_execute_magic\" != \"$magic\"; then + echo=\"$qecho\" + file=\"\$0\" + # Make sure echo works. + if test \"X\$1\" = X--no-reexec; then + # Discard the --no-reexec flag, and continue. + shift + elif test \"X\`(\$echo '\t') 2>/dev/null\`\" = 'X\t'; then + # Yippee, \$echo works! + : + else + # Restart under the correct shell, and then maybe \$echo will work. + exec $SHELL \"\$0\" --no-reexec \${1+\"\$@\"} + fi + fi\ +" + $echo >> $output "\ + + # Find the directory that this script lives in. + thisdir=\`\$echo \"X\$file\" | \$Xsed -e 's%/[^/]*$%%'\` + test \"x\$thisdir\" = \"x\$file\" && thisdir=. + + # Follow symbolic links until we get to the real thisdir. + file=\`ls -ld \"\$file\" | sed -n 's/.*-> //p'\` + while test -n \"\$file\"; do + destdir=\`\$echo \"X\$file\" | \$Xsed -e 's%/[^/]*\$%%'\` + + # If there was a directory component, then change thisdir. + if test \"x\$destdir\" != \"x\$file\"; then + case \"\$destdir\" in + [\\/]* | [A-Za-z]:[\\/]*) thisdir=\"\$destdir\" ;; + *) thisdir=\"\$thisdir/\$destdir\" ;; + esac + fi + + file=\`\$echo \"X\$file\" | \$Xsed -e 's%^.*/%%'\` + file=\`ls -ld \"\$thisdir/\$file\" | sed -n 's/.*-> //p'\` + done + + # Try to get the absolute directory name. + absdir=\`cd \"\$thisdir\" && pwd\` + test -n \"\$absdir\" && thisdir=\"\$absdir\" +" + + if test "$fast_install" = yes; then + echo >> $output "\ + program=lt-'$outputname' + progdir=\"\$thisdir/$objdir\" + + if test ! -f \"\$progdir/\$program\" || \\ + { file=\`ls -1dt \"\$progdir/\$program\" \"\$progdir/../\$program\" 2>/dev/null | sed 1q\`; \\ + test \"X\$file\" != \"X\$progdir/\$program\"; }; then + + file=\"\$\$-\$program\" + + if test ! -d \"\$progdir\"; then + $mkdir \"\$progdir\" + else + $rm \"\$progdir/\$file\" + fi" + + echo >> $output "\ + + # relink executable if necessary + if test -n \"\$relink_command\"; then + if (cd \"\$thisdir\" && eval \$relink_command); then : + else + $rm \"\$progdir/\$file\" + exit 1 + fi + fi + + $mv \"\$progdir/\$file\" \"\$progdir/\$program\" 2>/dev/null || + { $rm \"\$progdir/\$program\"; + $mv \"\$progdir/\$file\" \"\$progdir/\$program\"; } + $rm \"\$progdir/\$file\" + fi" + else + echo >> $output "\ + program='$outputname$exeext' + progdir=\"\$thisdir/$objdir\" +" + fi + + echo >> $output "\ + + if test -f \"\$progdir/\$program\"; then" + + # Export our shlibpath_var if we have one. + if test "$shlibpath_overrides_runpath" = yes && test -n "$shlibpath_var" && test -n "$temp_rpath"; then + $echo >> $output "\ + # Add our own library path to $shlibpath_var + $shlibpath_var=\"$temp_rpath\$$shlibpath_var\" + + # Some systems cannot cope with colon-terminated $shlibpath_var + # The second colon is a workaround for a bug in BeOS R4 sed + $shlibpath_var=\`\$echo \"X\$$shlibpath_var\" | \$Xsed -e 's/::*\$//'\` + + export $shlibpath_var +" + fi + + # fixup the dll searchpath if we need to. + if test -n "$dllsearchpath"; then + $echo >> $output "\ + # Add the dll search path components to the executable PATH + PATH=$dllsearchpath:\$PATH +" + fi + + $echo >> $output "\ + if test \"\$libtool_execute_magic\" != \"$magic\"; then + # Run the actual program with our arguments. +" + case $host in + *-*-cygwin* | *-*-mingw | *-*-os2*) + # win32 systems need to use the prog path for dll + # lookup to work + $echo >> $output "\ + exec \$progdir\\\\\$program \${1+\"\$@\"} +" + ;; + *) + $echo >> $output "\ + # Export the path to the program. + PATH=\"\$progdir:\$PATH\" + export PATH + + exec \$program \${1+\"\$@\"} +" + ;; + esac + $echo >> $output "\ + \$echo \"\$0: cannot exec \$program \${1+\"\$@\"}\" + exit 1 + fi + else + # The program doesn't exist. + \$echo \"\$0: error: \$progdir/\$program does not exist\" 1>&2 + \$echo \"This script is just a wrapper for \$program.\" 1>&2 + echo \"See the $PACKAGE documentation for more information.\" 1>&2 + exit 1 + fi +fi\ +" + chmod +x $output + fi + exit 0 + ;; + esac + + # See if we need to build an old-fashioned archive. + for oldlib in $oldlibs; do + + if test "$build_libtool_libs" = convenience; then + oldobjs="$libobjs_save" + addlibs="$convenience" + build_libtool_libs=no + else + if test "$build_libtool_libs" = module; then + oldobjs="$libobjs_save" + build_libtool_libs=no + else + oldobjs="$objs "`$echo "X$libobjs_save" | $SP2NL | $Xsed -e '/\.'${libext}'$/d' -e '/\.lib$/d' -e "$lo2o" | $NL2SP` + fi + addlibs="$old_convenience" + fi + + if test -n "$addlibs"; then + gentop="$output_objdir/${outputname}x" + $show "${rm}r $gentop" + $run ${rm}r "$gentop" + $show "mkdir $gentop" + $run mkdir "$gentop" + status=$? + if test $status -ne 0 && test ! -d "$gentop"; then + exit $status + fi + generated="$generated $gentop" + + # Add in members from convenience archives. + for xlib in $addlibs; do + # Extract the objects. + case "$xlib" in + [\\/]* | [A-Za-z]:[\\/]*) xabs="$xlib" ;; + *) xabs=`pwd`"/$xlib" ;; + esac + xlib=`$echo "X$xlib" | $Xsed -e 's%^.*/%%'` + xdir="$gentop/$xlib" + + $show "${rm}r $xdir" + $run ${rm}r "$xdir" + $show "mkdir $xdir" + $run mkdir "$xdir" + status=$? + if test $status -ne 0 && test ! -d "$xdir"; then + exit $status + fi + $show "(cd $xdir && $AR x $xabs)" + $run eval "(cd \$xdir && $AR x \$xabs)" || exit $? + + oldobjs="$oldobjs "`find $xdir -name \*.${objext} -print -o -name \*.lo -print | $NL2SP` + done + fi + + # Do each command in the archive commands. + if test -n "$old_archive_from_new_cmds" && test "$build_libtool_libs" = yes; then + eval cmds=\"$old_archive_from_new_cmds\" + else + # Ensure that we have .o objects in place incase we decided + # not to build a shared library, and have fallen back to building + # static libs even though --disable-static was passed! + for oldobj in $oldobjs; do + if test ! -f $oldobj; then + obj=`$echo "X$oldobj" | $Xsed -e "$o2lo"` + $show "${LN_S} $obj $oldobj" + $run ${LN_S} $obj $oldobj || exit $? + fi + done + + eval cmds=\"$old_archive_cmds\" + fi + IFS="${IFS= }"; save_ifs="$IFS"; IFS='~' + for cmd in $cmds; do + IFS="$save_ifs" + $show "$cmd" + $run eval "$cmd" || exit $? + done + IFS="$save_ifs" + done + + if test -n "$generated"; then + $show "${rm}r$generated" + $run ${rm}r$generated + fi + + # Now create the libtool archive. + case "$output" in + *.la) + old_library= + test "$build_old_libs" = yes && old_library="$libname.$libext" + $show "creating $output" + + if test -n "$xrpath"; then + temp_xrpath= + for libdir in $xrpath; do + temp_xrpath="$temp_xrpath -R$libdir" + done + dependency_libs="$temp_xrpath $dependency_libs" + fi + + # Only create the output if not a dry run. + if test -z "$run"; then + for installed in no yes; do + if test "$installed" = yes; then + if test -z "$install_libdir"; then + break + fi + output="$output_objdir/$outputname"i + fi + $rm $output + $echo > $output "\ +# $outputname - a libtool library file +# Generated by $PROGRAM - GNU $PACKAGE $VERSION$TIMESTAMP +# +# Please DO NOT delete this file! +# It is necessary for linking the library. + +# The name that we can dlopen(3). +dlname='$dlname' + +# Names of this library. +library_names='$library_names' + +# The name of the static archive. +old_library='$old_library' + +# Libraries that this one depends upon. +dependency_libs='$dependency_libs' + +# Version information for $libname. +current=$current +age=$age +revision=$revision + +# Is this an already installed library? +installed=$installed + +# Directory that this library needs to be installed in: +libdir='$install_libdir'\ +" + done + fi + + # Do a symbolic link so that the libtool archive can be found in + # LD_LIBRARY_PATH before the program is installed. + $show "(cd $output_objdir && $rm $outputname && $LN_S ../$outputname $outputname)" + $run eval "(cd $output_objdir && $rm $outputname && $LN_S ../$outputname $outputname)" || exit $? + ;; + esac + exit 0 + ;; + + # libtool install mode + install) + modename="$modename: install" + + # There may be an optional sh(1) argument at the beginning of + # install_prog (especially on Windows NT). + if test "$nonopt" = "$SHELL" || test "$nonopt" = /bin/sh; then + # Aesthetically quote it. + arg=`$echo "X$nonopt" | $Xsed -e "$sed_quote_subst"` + case "$arg" in + *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \ ]*|*]*) + arg="\"$arg\"" + ;; + esac + install_prog="$arg " + arg="$1" + shift + else + install_prog= + arg="$nonopt" + fi + + # The real first argument should be the name of the installation program. + # Aesthetically quote it. + arg=`$echo "X$arg" | $Xsed -e "$sed_quote_subst"` + case "$arg" in + *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \ ]*|*]*) + arg="\"$arg\"" + ;; + esac + install_prog="$install_prog$arg" + + # We need to accept at least all the BSD install flags. + dest= + files= + opts= + prev= + install_type= + isdir=no + stripme= + for arg + do + if test -n "$dest"; then + files="$files $dest" + dest="$arg" + continue + fi + + case "$arg" in + -d) isdir=yes ;; + -f) prev="-f" ;; + -g) prev="-g" ;; + -m) prev="-m" ;; + -o) prev="-o" ;; + -s) + stripme=" -s" + continue + ;; + -*) ;; + + *) + # If the previous option needed an argument, then skip it. + if test -n "$prev"; then + prev= + else + dest="$arg" + continue + fi + ;; + esac + + # Aesthetically quote the argument. + arg=`$echo "X$arg" | $Xsed -e "$sed_quote_subst"` + case "$arg" in + *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \ ]*|*]*) + arg="\"$arg\"" + ;; + esac + install_prog="$install_prog $arg" + done + + if test -z "$install_prog"; then + $echo "$modename: you must specify an install program" 1>&2 + $echo "$help" 1>&2 + exit 1 + fi + + if test -n "$prev"; then + $echo "$modename: the \`$prev' option requires an argument" 1>&2 + $echo "$help" 1>&2 + exit 1 + fi + + if test -z "$files"; then + if test -z "$dest"; then + $echo "$modename: no file or destination specified" 1>&2 + else + $echo "$modename: you must specify a destination" 1>&2 + fi + $echo "$help" 1>&2 + exit 1 + fi + + # Strip any trailing slash from the destination. + dest=`$echo "X$dest" | $Xsed -e 's%/$%%'` + + # Check to see that the destination is a directory. + test -d "$dest" && isdir=yes + if test "$isdir" = yes; then + destdir="$dest" + destname= + else + destdir=`$echo "X$dest" | $Xsed -e 's%/[^/]*$%%'` + test "X$destdir" = "X$dest" && destdir=. + destname=`$echo "X$dest" | $Xsed -e 's%^.*/%%'` + + # Not a directory, so check to see that there is only one file specified. + set dummy $files + if test $# -gt 2; then + $echo "$modename: \`$dest' is not a directory" 1>&2 + $echo "$help" 1>&2 + exit 1 + fi + fi + case "$destdir" in + [\\/]* | [A-Za-z]:[\\/]*) ;; + *) + for file in $files; do + case "$file" in + *.lo) ;; + *) + $echo "$modename: \`$destdir' must be an absolute directory name" 1>&2 + $echo "$help" 1>&2 + exit 1 + ;; + esac + done + ;; + esac + + # This variable tells wrapper scripts just to set variables rather + # than running their programs. + libtool_install_magic="$magic" + + staticlibs= + future_libdirs= + current_libdirs= + for file in $files; do + + # Do each installation. + case "$file" in + *.a | *.lib) + # Do the static libraries later. + staticlibs="$staticlibs $file" + ;; + + *.la) + # Check to see that this really is a libtool archive. + if (sed -e '2q' $file | egrep "^# Generated by .*$PACKAGE") >/dev/null 2>&1; then : + else + $echo "$modename: \`$file' is not a valid libtool archive" 1>&2 + $echo "$help" 1>&2 + exit 1 + fi + + library_names= + old_library= + # If there is no directory component, then add one. + case "$file" in + */* | *\\*) . $file ;; + *) . ./$file ;; + esac + + # Add the libdir to current_libdirs if it is the destination. + if test "X$destdir" = "X$libdir"; then + case "$current_libdirs " in + *" $libdir "*) ;; + *) current_libdirs="$current_libdirs $libdir" ;; + esac + else + # Note the libdir as a future libdir. + case "$future_libdirs " in + *" $libdir "*) ;; + *) future_libdirs="$future_libdirs $libdir" ;; + esac + fi + + dir="`$echo "X$file" | $Xsed -e 's%/[^/]*$%%'`/" + test "X$dir" = "X$file/" && dir= + dir="$dir$objdir" + + # See the names of the shared library. + set dummy $library_names + if test -n "$2"; then + realname="$2" + shift + shift + + # Install the shared library and build the symlinks. + $show "$install_prog$stripme $dir/$realname $destdir/$realname" + $run eval "$install_prog$stripme $dir/$realname $destdir/$realname" || exit $? + + if test $# -gt 0; then + # Delete the old symlinks, and create new ones. + for linkname + do + if test "$linkname" != "$realname"; then + $show "(cd $destdir && $rm $linkname && $LN_S $realname $linkname)" + $run eval "(cd $destdir && $rm $linkname && $LN_S $realname $linkname)" + fi + done + fi + + # Do each command in the postinstall commands. + lib="$destdir/$realname" + eval cmds=\"$postinstall_cmds\" + IFS="${IFS= }"; save_ifs="$IFS"; IFS='~' + for cmd in $cmds; do + IFS="$save_ifs" + $show "$cmd" + $run eval "$cmd" || exit $? + done + IFS="$save_ifs" + fi + + # Install the pseudo-library for information purposes. + name=`$echo "X$file" | $Xsed -e 's%^.*/%%'` + instname="$dir/$name"i + $show "$install_prog $instname $destdir/$name" + $run eval "$install_prog $instname $destdir/$name" || exit $? + + # Maybe install the static library, too. + test -n "$old_library" && staticlibs="$staticlibs $dir/$old_library" + ;; + + *.lo) + # Install (i.e. copy) a libtool object. + + # Figure out destination file name, if it wasn't already specified. + if test -n "$destname"; then + destfile="$destdir/$destname" + else + destfile=`$echo "X$file" | $Xsed -e 's%^.*/%%'` + destfile="$destdir/$destfile" + fi + + # Deduce the name of the destination old-style object file. + case "$destfile" in + *.lo) + staticdest=`$echo "X$destfile" | $Xsed -e "$lo2o"` + ;; + *.o | *.obj) + staticdest="$destfile" + destfile= + ;; + *) + $echo "$modename: cannot copy a libtool object to \`$destfile'" 1>&2 + $echo "$help" 1>&2 + exit 1 + ;; + esac + + # Install the libtool object if requested. + if test -n "$destfile"; then + $show "$install_prog $file $destfile" + $run eval "$install_prog $file $destfile" || exit $? + fi + + # Install the old object if enabled. + if test "$build_old_libs" = yes; then + # Deduce the name of the old-style object file. + staticobj=`$echo "X$file" | $Xsed -e "$lo2o"` + + $show "$install_prog $staticobj $staticdest" + $run eval "$install_prog \$staticobj \$staticdest" || exit $? + fi + exit 0 + ;; + + *) + # Figure out destination file name, if it wasn't already specified. + if test -n "$destname"; then + destfile="$destdir/$destname" + else + destfile=`$echo "X$file" | $Xsed -e 's%^.*/%%'` + destfile="$destdir/$destfile" + fi + + # Do a test to see if this is really a libtool program. + if (sed -e '4q' $file | egrep "^# Generated by .*$PACKAGE") >/dev/null 2>&1; then + link_against_libtool_libs= + relink_command= + + # If there is no directory component, then add one. + case "$file" in + */* | *\\*) . $file ;; + *) . ./$file ;; + esac + + # Check the variables that should have been set. + if test -z "$link_against_libtool_libs"; then + $echo "$modename: invalid libtool wrapper script \`$file'" 1>&2 + exit 1 + fi + + finalize=yes + for lib in $link_against_libtool_libs; do + # Check to see that each library is installed. + libdir= + if test -f "$lib"; then + # If there is no directory component, then add one. + case "$lib" in + */* | *\\*) . $lib ;; + *) . ./$lib ;; + esac + fi + libfile="$libdir/`$echo "X$lib" | $Xsed -e 's%^.*/%%g'`" + if test -n "$libdir" && test ! -f "$libfile"; then + $echo "$modename: warning: \`$lib' has not been installed in \`$libdir'" 1>&2 + finalize=no + fi + done + + outputname= + if test "$fast_install" = no && test -n "$relink_command"; then + if test "$finalize" = yes && test -z "$run"; then + tmpdir="/tmp" + test -n "$TMPDIR" && tmpdir="$TMPDIR" + tmpdir="$tmpdir/libtool-$$" + if $mkdir -p "$tmpdir" && chmod 700 "$tmpdir"; then : + else + $echo "$modename: error: cannot create temporary directory \`$tmpdir'" 1>&2 + continue + fi + outputname="$tmpdir/$file" + # Replace the output file specification. + relink_command=`$echo "X$relink_command" | $Xsed -e 's%@OUTPUT@%'"$outputname"'%g'` + + $show "$relink_command" + if $run eval "$relink_command"; then : + else + $echo "$modename: error: relink \`$file' with the above command before installing it" 1>&2 + ${rm}r "$tmpdir" + continue + fi + file="$outputname" + else + $echo "$modename: warning: cannot relink \`$file'" 1>&2 + fi + else + # Install the binary that we compiled earlier. + file=`$echo "X$file" | $Xsed -e "s%\([^/]*\)$%$objdir/\1%"` + fi + fi + + $show "$install_prog$stripme $file $destfile" + $run eval "$install_prog\$stripme \$file \$destfile" || exit $? + test -n "$outputname" && ${rm}r "$tmpdir" + ;; + esac + done + + for file in $staticlibs; do + name=`$echo "X$file" | $Xsed -e 's%^.*/%%'` + + # Set up the ranlib parameters. + oldlib="$destdir/$name" + + $show "$install_prog $file $oldlib" + $run eval "$install_prog \$file \$oldlib" || exit $? + + # Do each command in the postinstall commands. + eval cmds=\"$old_postinstall_cmds\" + IFS="${IFS= }"; save_ifs="$IFS"; IFS='~' + for cmd in $cmds; do + IFS="$save_ifs" + $show "$cmd" + $run eval "$cmd" || exit $? + done + IFS="$save_ifs" + done + + if test -n "$future_libdirs"; then + $echo "$modename: warning: remember to run \`$progname --finish$future_libdirs'" 1>&2 + fi + + if test -n "$current_libdirs"; then + # Maybe just do a dry run. + test -n "$run" && current_libdirs=" -n$current_libdirs" + exec $SHELL $0 --finish$current_libdirs + exit 1 + fi + + exit 0 + ;; + + # libtool finish mode + finish) + modename="$modename: finish" + libdirs="$nonopt" + admincmds= + + if test -n "$finish_cmds$finish_eval" && test -n "$libdirs"; then + for dir + do + libdirs="$libdirs $dir" + done + + for libdir in $libdirs; do + if test -n "$finish_cmds"; then + # Do each command in the finish commands. + eval cmds=\"$finish_cmds\" + IFS="${IFS= }"; save_ifs="$IFS"; IFS='~' + for cmd in $cmds; do + IFS="$save_ifs" + $show "$cmd" + $run eval "$cmd" || admincmds="$admincmds + $cmd" + done + IFS="$save_ifs" + fi + if test -n "$finish_eval"; then + # Do the single finish_eval. + eval cmds=\"$finish_eval\" + $run eval "$cmds" || admincmds="$admincmds + $cmds" + fi + done + fi + + # Exit here if they wanted silent mode. + test "$show" = : && exit 0 + + echo "----------------------------------------------------------------------" + echo "Libraries have been installed in:" + for libdir in $libdirs; do + echo " $libdir" + done + echo + echo "If you ever happen to want to link against installed libraries" + echo "in a given directory, LIBDIR, you must either use libtool, and" + echo "specify the full pathname of the library, or use \`-LLIBDIR'" + echo "flag during linking and do at least one of the following:" + if test -n "$shlibpath_var"; then + echo " - add LIBDIR to the \`$shlibpath_var' environment variable" + echo " during execution" + fi + if test -n "$runpath_var"; then + echo " - add LIBDIR to the \`$runpath_var' environment variable" + echo " during linking" + fi + if test -n "$hardcode_libdir_flag_spec"; then + libdir=LIBDIR + eval flag=\"$hardcode_libdir_flag_spec\" + + echo " - use the \`$flag' linker flag" + fi + if test -n "$admincmds"; then + echo " - have your system administrator run these commands:$admincmds" + fi + if test -f /etc/ld.so.conf; then + echo " - have your system administrator add LIBDIR to \`/etc/ld.so.conf'" + fi + echo + echo "See any operating system documentation about shared libraries for" + echo "more information, such as the ld(1) and ld.so(8) manual pages." + echo "----------------------------------------------------------------------" + exit 0 + ;; + + # libtool execute mode + execute) + modename="$modename: execute" + + # The first argument is the command name. + cmd="$nonopt" + if test -z "$cmd"; then + $echo "$modename: you must specify a COMMAND" 1>&2 + $echo "$help" + exit 1 + fi + + # Handle -dlopen flags immediately. + for file in $execute_dlfiles; do + if test ! -f "$file"; then + $echo "$modename: \`$file' is not a file" 1>&2 + $echo "$help" 1>&2 + exit 1 + fi + + dir= + case "$file" in + *.la) + # Check to see that this really is a libtool archive. + if (sed -e '2q' $file | egrep "^# Generated by .*$PACKAGE") >/dev/null 2>&1; then : + else + $echo "$modename: \`$lib' is not a valid libtool archive" 1>&2 + $echo "$help" 1>&2 + exit 1 + fi + + # Read the libtool library. + dlname= + library_names= + + # If there is no directory component, then add one. + case "$file" in + */* | *\\*) . $file ;; + *) . ./$file ;; + esac + + # Skip this library if it cannot be dlopened. + if test -z "$dlname"; then + # Warn if it was a shared library. + test -n "$library_names" && $echo "$modename: warning: \`$file' was not linked with \`-export-dynamic'" + continue + fi + + dir=`$echo "X$file" | $Xsed -e 's%/[^/]*$%%'` + test "X$dir" = "X$file" && dir=. + + if test -f "$dir/$objdir/$dlname"; then + dir="$dir/$objdir" + else + $echo "$modename: cannot find \`$dlname' in \`$dir' or \`$dir/$objdir'" 1>&2 + exit 1 + fi + ;; + + *.lo) + # Just add the directory containing the .lo file. + dir=`$echo "X$file" | $Xsed -e 's%/[^/]*$%%'` + test "X$dir" = "X$file" && dir=. + ;; + + *) + $echo "$modename: warning \`-dlopen' is ignored for non-libtool libraries and objects" 1>&2 + continue + ;; + esac + + # Get the absolute pathname. + absdir=`cd "$dir" && pwd` + test -n "$absdir" && dir="$absdir" + + # Now add the directory to shlibpath_var. + if eval "test -z \"\$$shlibpath_var\""; then + eval "$shlibpath_var=\"\$dir\"" + else + eval "$shlibpath_var=\"\$dir:\$$shlibpath_var\"" + fi + done + + # This variable tells wrapper scripts just to set shlibpath_var + # rather than running their programs. + libtool_execute_magic="$magic" + + # Check if any of the arguments is a wrapper script. + args= + for file + do + case "$file" in + -*) ;; + *) + # Do a test to see if this is really a libtool program. + if (sed -e '4q' $file | egrep "^# Generated by .*$PACKAGE") >/dev/null 2>&1; then + # If there is no directory component, then add one. + case "$file" in + */* | *\\*) . $file ;; + *) . ./$file ;; + esac + + # Transform arg to wrapped name. + file="$progdir/$program" + fi + ;; + esac + # Quote arguments (to preserve shell metacharacters). + file=`$echo "X$file" | $Xsed -e "$sed_quote_subst"` + args="$args \"$file\"" + done + + if test -z "$run"; then + # Export the shlibpath_var. + eval "export $shlibpath_var" + + # Restore saved enviroment variables + if test "${save_LC_ALL+set}" = set; then + LC_ALL="$save_LC_ALL"; export LC_ALL + fi + if test "${save_LANG+set}" = set; then + LANG="$save_LANG"; export LANG + fi + + # Now actually exec the command. + eval "exec \$cmd$args" + + $echo "$modename: cannot exec \$cmd$args" + exit 1 + else + # Display what would be done. + eval "\$echo \"\$shlibpath_var=\$$shlibpath_var\"" + $echo "export $shlibpath_var" + $echo "$cmd$args" + exit 0 + fi + ;; + + # libtool uninstall mode + uninstall) + modename="$modename: uninstall" + rm="$nonopt" + files= + + for arg + do + case "$arg" in + -*) rm="$rm $arg" ;; + *) files="$files $arg" ;; + esac + done + + if test -z "$rm"; then + $echo "$modename: you must specify an RM program" 1>&2 + $echo "$help" 1>&2 + exit 1 + fi + + for file in $files; do + dir=`$echo "X$file" | $Xsed -e 's%/[^/]*$%%'` + test "X$dir" = "X$file" && dir=. + name=`$echo "X$file" | $Xsed -e 's%^.*/%%'` + + rmfiles="$file" + + case "$name" in + *.la) + # Possibly a libtool archive, so verify it. + if (sed -e '2q' $file | egrep "^# Generated by .*$PACKAGE") >/dev/null 2>&1; then + . $dir/$name + + # Delete the libtool libraries and symlinks. + for n in $library_names; do + rmfiles="$rmfiles $dir/$n" + done + test -n "$old_library" && rmfiles="$rmfiles $dir/$old_library" + + $show "$rm $rmfiles" + $run $rm $rmfiles + + if test -n "$library_names"; then + # Do each command in the postuninstall commands. + eval cmds=\"$postuninstall_cmds\" + IFS="${IFS= }"; save_ifs="$IFS"; IFS='~' + for cmd in $cmds; do + IFS="$save_ifs" + $show "$cmd" + $run eval "$cmd" + done + IFS="$save_ifs" + fi + + if test -n "$old_library"; then + # Do each command in the old_postuninstall commands. + eval cmds=\"$old_postuninstall_cmds\" + IFS="${IFS= }"; save_ifs="$IFS"; IFS='~' + for cmd in $cmds; do + IFS="$save_ifs" + $show "$cmd" + $run eval "$cmd" + done + IFS="$save_ifs" + fi + + # FIXME: should reinstall the best remaining shared library. + fi + ;; + + *.lo) + if test "$build_old_libs" = yes; then + oldobj=`$echo "X$name" | $Xsed -e "$lo2o"` + rmfiles="$rmfiles $dir/$oldobj" + fi + $show "$rm $rmfiles" + $run $rm $rmfiles + ;; + + *) + $show "$rm $rmfiles" + $run $rm $rmfiles + ;; + esac + done + exit 0 + ;; + + "") + $echo "$modename: you must specify a MODE" 1>&2 + $echo "$generic_help" 1>&2 + exit 1 + ;; + esac + + $echo "$modename: invalid operation mode \`$mode'" 1>&2 + $echo "$generic_help" 1>&2 + exit 1 +fi # test -z "$show_help" + +# We need to display help for each of the modes. +case "$mode" in +"") $echo \ +"Usage: $modename [OPTION]... [MODE-ARG]... + +Provide generalized library-building support services. + + --config show all configuration variables + --debug enable verbose shell tracing +-n, --dry-run display commands without modifying any files + --features display basic configuration information and exit + --finish same as \`--mode=finish' + --help display this help message and exit + --mode=MODE use operation mode MODE [default=inferred from MODE-ARGS] + --quiet same as \`--silent' + --silent don't print informational messages + --version print version information + +MODE must be one of the following: + + compile compile a source file into a libtool object + execute automatically set library path, then run a program + finish complete the installation of libtool libraries + install install libraries or executables + link create a library or an executable + uninstall remove libraries from an installed directory + +MODE-ARGS vary depending on the MODE. Try \`$modename --help --mode=MODE' for +a more detailed description of MODE." + exit 0 + ;; + +compile) + $echo \ +"Usage: $modename [OPTION]... --mode=compile COMPILE-COMMAND... SOURCEFILE + +Compile a source file into a libtool library object. + +This mode accepts the following additional options: + + -o OUTPUT-FILE set the output file name to OUTPUT-FILE + -static always build a \`.o' file suitable for static linking + +COMPILE-COMMAND is a command to be used in creating a \`standard' object file +from the given SOURCEFILE. + +The output file name is determined by removing the directory component from +SOURCEFILE, then substituting the C source code suffix \`.c' with the +library object suffix, \`.lo'." + ;; + +execute) + $echo \ +"Usage: $modename [OPTION]... --mode=execute COMMAND [ARGS]... + +Automatically set library path, then run a program. + +This mode accepts the following additional options: + + -dlopen FILE add the directory containing FILE to the library path + +This mode sets the library path environment variable according to \`-dlopen' +flags. + +If any of the ARGS are libtool executable wrappers, then they are translated +into their corresponding uninstalled binary, and any of their required library +directories are added to the library path. + +Then, COMMAND is executed, with ARGS as arguments." + ;; + +finish) + $echo \ +"Usage: $modename [OPTION]... --mode=finish [LIBDIR]... + +Complete the installation of libtool libraries. + +Each LIBDIR is a directory that contains libtool libraries. + +The commands that this mode executes may require superuser privileges. Use +the \`--dry-run' option if you just want to see what would be executed." + ;; + +install) + $echo \ +"Usage: $modename [OPTION]... --mode=install INSTALL-COMMAND... + +Install executables or libraries. + +INSTALL-COMMAND is the installation command. The first component should be +either the \`install' or \`cp' program. + +The rest of the components are interpreted as arguments to that command (only +BSD-compatible install options are recognized)." + ;; + +link) + $echo \ +"Usage: $modename [OPTION]... --mode=link LINK-COMMAND... + +Link object files or libraries together to form another library, or to +create an executable program. + +LINK-COMMAND is a command using the C compiler that you would use to create +a program from several object files. + +The following components of LINK-COMMAND are treated specially: + + -all-static do not do any dynamic linking at all + -avoid-version do not add a version suffix if possible + -dlopen FILE \`-dlpreopen' FILE if it cannot be dlopened at runtime + -dlpreopen FILE link in FILE and add its symbols to lt_preloaded_symbols + -export-dynamic allow symbols from OUTPUT-FILE to be resolved with dlsym(3) + -export-symbols SYMFILE + try to export only the symbols listed in SYMFILE + -export-symbols-regex REGEX + try to export only the symbols matching REGEX + -LLIBDIR search LIBDIR for required installed libraries + -lNAME OUTPUT-FILE requires the installed library libNAME + -module build a library that can dlopened + -no-undefined declare that a library does not refer to external symbols + -o OUTPUT-FILE create OUTPUT-FILE from the specified objects + -release RELEASE specify package release information + -rpath LIBDIR the created library will eventually be installed in LIBDIR + -R[ ]LIBDIR add LIBDIR to the runtime path of programs and libraries + -static do not do any dynamic linking of libtool libraries + -version-info CURRENT[:REVISION[:AGE]] + specify library version info [each variable defaults to 0] + +All other options (arguments beginning with \`-') are ignored. + +Every other argument is treated as a filename. Files ending in \`.la' are +treated as uninstalled libtool libraries, other files are standard or library +object files. + +If the OUTPUT-FILE ends in \`.la', then a libtool library is created, +only library objects (\`.lo' files) may be specified, and \`-rpath' is +required, except when creating a convenience library. + +If OUTPUT-FILE ends in \`.a' or \`.lib', then a standard library is created +using \`ar' and \`ranlib', or on Windows using \`lib'. + +If OUTPUT-FILE ends in \`.lo' or \`.${objext}', then a reloadable object file +is created, otherwise an executable program is created." + ;; + +uninstall) + $echo \ +"Usage: $modename [OPTION]... --mode=uninstall RM [RM-OPTION]... FILE... + +Remove libraries from an installation directory. + +RM is the name of the program to use to delete files associated with each FILE +(typically \`/bin/rm'). RM-OPTIONS are options (such as \`-f') to be passed +to RM. + +If FILE is a libtool library, all the files associated with it are deleted. +Otherwise, only FILE itself is deleted using RM." + ;; + +*) + $echo "$modename: invalid operation mode \`$mode'" 1>&2 + $echo "$help" 1>&2 + exit 1 + ;; +esac + +echo +$echo "Try \`$modename --help' for more information about other modes." + +exit 0 + +# Local Variables: +# mode:shell-script +# sh-indentation:2 +# End: diff --git a/xdelta-1.1.3/libxdelta.la b/xdelta-1.1.3/libxdelta.la new file mode 100644 index 0000000..d8c3270 --- /dev/null +++ b/xdelta-1.1.3/libxdelta.la @@ -0,0 +1,28 @@ +# libxdelta.la - a libtool library file +# Generated by ltmain.sh - GNU libtool 1.3.3 (1.385.2.181 1999/07/02 15:49:11) +# +# Please DO NOT delete this file! +# It is necessary for linking the library. + +# The name that we can dlopen(3). +dlname='' + +# Names of this library. +library_names='' + +# The name of the static archive. +old_library='libxdelta.a' + +# Libraries that this one depends upon. +dependency_libs=' -L/usr/local/lib -lglib' + +# Version information for libxdelta. +current=2 +age=0 +revision=0 + +# Is this an already installed library? +installed=no + +# Directory that this library needs to be installed in: +libdir='/usr/local/lib' diff --git a/xdelta-1.1.3/ltconfig b/xdelta-1.1.3/ltconfig new file mode 100755 index 0000000..65ec6f6 --- /dev/null +++ b/xdelta-1.1.3/ltconfig @@ -0,0 +1,3017 @@ +#! /bin/sh + +# ltconfig - Create a system-specific libtool. +# Copyright (C) 1996-1999 Free Software Foundation, Inc. +# Originally by Gordon Matzigkeit , 1996 +# +# This file is free software; you can redistribute it and/or modify it +# under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, but +# WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. +# +# As a special exception to the GNU General Public License, if you +# distribute this file as part of a program that contains a +# configuration script generated by Autoconf, you may include it under +# the same distribution terms that you use for the rest of that program. + +# A lot of this script is taken from autoconf-2.10. + +# Check that we are running under the correct shell. +SHELL=${CONFIG_SHELL-/bin/sh} +echo=echo +if test "X$1" = X--no-reexec; then + # Discard the --no-reexec flag, and continue. + shift +elif test "X$1" = X--fallback-echo; then + # Avoid inline document here, it may be left over + : +elif test "X`($echo '\t') 2>/dev/null`" = 'X\t'; then + # Yippee, $echo works! + : +else + # Restart under the correct shell. + exec "$SHELL" "$0" --no-reexec ${1+"$@"} +fi + +if test "X$1" = X--fallback-echo; then + # used as fallback echo + shift + cat </dev/null`} + case X$UNAME in + *-DOS) PATH_SEPARATOR=';' ;; + *) PATH_SEPARATOR=':' ;; + esac +fi + +# The HP-UX ksh and POSIX shell print the target directory to stdout +# if CDPATH is set. +if test "${CDPATH+set}" = set; then CDPATH=; export CDPATH; fi + +if test "X${echo_test_string+set}" != "Xset"; then + # find a string as large as possible, as long as the shell can cope with it + for cmd in 'sed 50q "$0"' 'sed 20q "$0"' 'sed 10q "$0"' 'sed 2q "$0"' 'echo test'; do + # expected sizes: less than 2Kb, 1Kb, 512 bytes, 16 bytes, ... + if (echo_test_string="`eval $cmd`") 2>/dev/null && + echo_test_string="`eval $cmd`" && + (test "X$echo_test_string" = "X$echo_test_string") 2>/dev/null; then + break + fi + done +fi + +if test "X`($echo '\t') 2>/dev/null`" != 'X\t' || + test "X`($echo "$echo_test_string") 2>/dev/null`" != X"$echo_test_string"; then + # The Solaris, AIX, and Digital Unix default echo programs unquote + # backslashes. This makes it impossible to quote backslashes using + # echo "$something" | sed 's/\\/\\\\/g' + # + # So, first we look for a working echo in the user's PATH. + + IFS="${IFS= }"; save_ifs="$IFS"; IFS="${IFS}${PATH_SEPARATOR}" + for dir in $PATH /usr/ucb; do + if (test -f $dir/echo || test -f $dir/echo$ac_exeext) && + test "X`($dir/echo '\t') 2>/dev/null`" = 'X\t' && + test "X`($dir/echo "$echo_test_string") 2>/dev/null`" = X"$echo_test_string"; then + echo="$dir/echo" + break + fi + done + IFS="$save_ifs" + + if test "X$echo" = Xecho; then + # We didn't find a better echo, so look for alternatives. + if test "X`(print -r '\t') 2>/dev/null`" = 'X\t' && + test "X`(print -r "$echo_test_string") 2>/dev/null`" = X"$echo_test_string"; then + # This shell has a builtin print -r that does the trick. + echo='print -r' + elif (test -f /bin/ksh || test -f /bin/ksh$ac_exeext) && + test "X$CONFIG_SHELL" != X/bin/ksh; then + # If we have ksh, try running ltconfig again with it. + ORIGINAL_CONFIG_SHELL="${CONFIG_SHELL-/bin/sh}" + export ORIGINAL_CONFIG_SHELL + CONFIG_SHELL=/bin/ksh + export CONFIG_SHELL + exec "$CONFIG_SHELL" "$0" --no-reexec ${1+"$@"} + else + # Try using printf. + echo='printf "%s\n"' + if test "X`($echo '\t') 2>/dev/null`" = 'X\t' && + test "X`($echo "$echo_test_string") 2>/dev/null`" = X"$echo_test_string"; then + # Cool, printf works + : + elif test "X`("$ORIGINAL_CONFIG_SHELL" "$0" --fallback-echo '\t') 2>/dev/null`" = 'X\t' && + test "X`("$ORIGINAL_CONFIG_SHELL" "$0" --fallback-echo "$echo_test_string") 2>/dev/null`" = X"$echo_test_string"; then + CONFIG_SHELL="$ORIGINAL_CONFIG_SHELL" + export CONFIG_SHELL + SHELL="$CONFIG_SHELL" + export SHELL + echo="$CONFIG_SHELL $0 --fallback-echo" + elif test "X`("$CONFIG_SHELL" "$0" --fallback-echo '\t') 2>/dev/null`" = 'X\t' && + test "X`("$CONFIG_SHELL" "$0" --fallback-echo "$echo_test_string") 2>/dev/null`" = X"$echo_test_string"; then + echo="$CONFIG_SHELL $0 --fallback-echo" + else + # maybe with a smaller string... + prev=: + + for cmd in 'echo test' 'sed 2q "$0"' 'sed 10q "$0"' 'sed 20q "$0"' 'sed 50q "$0"'; do + if (test "X$echo_test_string" = "X`eval $cmd`") 2>/dev/null; then + break + fi + prev="$cmd" + done + + if test "$prev" != 'sed 50q "$0"'; then + echo_test_string=`eval $prev` + export echo_test_string + exec "${ORIGINAL_CONFIG_SHELL}" "$0" ${1+"$@"} + else + # Oops. We lost completely, so just stick with echo. + echo=echo + fi + fi + fi + fi +fi + +# Sed substitution that helps us do robust quoting. It backslashifies +# metacharacters that are still active within double-quoted strings. +Xsed='sed -e s/^X//' +sed_quote_subst='s/\([\\"\\`$\\\\]\)/\\\1/g' + +# Same as above, but do not quote variable references. +double_quote_subst='s/\([\\"\\`\\\\]\)/\\\1/g' + +# Sed substitution to delay expansion of an escaped shell variable in a +# double_quote_subst'ed string. +delay_variable_subst='s/\\\\\\\\\\\$/\\\\\\$/g' + +# The name of this program. +progname=`$echo "X$0" | $Xsed -e 's%^.*/%%'` + +# Constants: +PROGRAM=ltconfig +PACKAGE=libtool +VERSION=1.3.3 +TIMESTAMP=" (1.385.2.181 1999/07/02 15:49:11)" +ac_compile='${CC-cc} -c $CFLAGS $CPPFLAGS conftest.c 1>&5' +ac_link='${CC-cc} -o conftest $CFLAGS $CPPFLAGS $LDFLAGS conftest.c $LIBS 1>&5' +rm="rm -f" + +help="Try \`$progname --help' for more information." + +# Global variables: +default_ofile=libtool +can_build_shared=yes +enable_shared=yes +# All known linkers require a `.a' archive for static linking (except M$VC, +# which needs '.lib'). +enable_static=yes +enable_fast_install=yes +enable_dlopen=unknown +enable_win32_dll=no +ltmain= +silent= +srcdir= +ac_config_guess= +ac_config_sub= +host= +nonopt= +ofile="$default_ofile" +verify_host=yes +with_gcc=no +with_gnu_ld=no +need_locks=yes +ac_ext=c +objext=o +libext=a +exeext= +cache_file= + +old_AR="$AR" +old_CC="$CC" +old_CFLAGS="$CFLAGS" +old_CPPFLAGS="$CPPFLAGS" +old_LDFLAGS="$LDFLAGS" +old_LD="$LD" +old_LN_S="$LN_S" +old_LIBS="$LIBS" +old_NM="$NM" +old_RANLIB="$RANLIB" +old_DLLTOOL="$DLLTOOL" +old_OBJDUMP="$OBJDUMP" +old_AS="$AS" + +# Parse the command line options. +args= +prev= +for option +do + case "$option" in + -*=*) optarg=`echo "$option" | sed 's/[-_a-zA-Z0-9]*=//'` ;; + *) optarg= ;; + esac + + # If the previous option needs an argument, assign it. + if test -n "$prev"; then + eval "$prev=\$option" + prev= + continue + fi + + case "$option" in + --help) cat <&2 + echo "$help" 1>&2 + exit 1 + ;; + + *) + if test -z "$ltmain"; then + ltmain="$option" + elif test -z "$host"; then +# This generates an unnecessary warning for sparc-sun-solaris4.1.3_U1 +# if test -n "`echo $option| sed 's/[-a-z0-9.]//g'`"; then +# echo "$progname: warning \`$option' is not a valid host type" 1>&2 +# fi + host="$option" + else + echo "$progname: too many arguments" 1>&2 + echo "$help" 1>&2 + exit 1 + fi ;; + esac +done + +if test -z "$ltmain"; then + echo "$progname: you must specify a LTMAIN file" 1>&2 + echo "$help" 1>&2 + exit 1 +fi + +if test ! -f "$ltmain"; then + echo "$progname: \`$ltmain' does not exist" 1>&2 + echo "$help" 1>&2 + exit 1 +fi + +# Quote any args containing shell metacharacters. +ltconfig_args= +for arg +do + case "$arg" in + *" "*|*" "*|*[\[\]\~\#\$\^\&\*\(\)\{\}\\\|\;\<\>\?]*) + ltconfig_args="$ltconfig_args '$arg'" ;; + *) ltconfig_args="$ltconfig_args $arg" ;; + esac +done + +# A relevant subset of AC_INIT. + +# File descriptor usage: +# 0 standard input +# 1 file creation +# 2 errors and warnings +# 3 some systems may open it to /dev/tty +# 4 used on the Kubota Titan +# 5 compiler messages saved in config.log +# 6 checking for... messages and results +if test "$silent" = yes; then + exec 6>/dev/null +else + exec 6>&1 +fi +exec 5>>./config.log + +# NLS nuisances. +# Only set LANG and LC_ALL to C if already set. +# These must not be set unconditionally because not all systems understand +# e.g. LANG=C (notably SCO). +if test "${LC_ALL+set}" = set; then LC_ALL=C; export LC_ALL; fi +if test "${LANG+set}" = set; then LANG=C; export LANG; fi + +if test -n "$cache_file" && test -r "$cache_file"; then + echo "loading cache $cache_file within ltconfig" + . $cache_file +fi + +if (echo "testing\c"; echo 1,2,3) | grep c >/dev/null; then + # Stardent Vistra SVR4 grep lacks -e, says ghazi@caip.rutgers.edu. + if (echo -n testing; echo 1,2,3) | sed s/-n/xn/ | grep xn >/dev/null; then + ac_n= ac_c=' +' ac_t=' ' + else + ac_n=-n ac_c= ac_t= + fi +else + ac_n= ac_c='\c' ac_t= +fi + +if test -z "$srcdir"; then + # Assume the source directory is the same one as the path to LTMAIN. + srcdir=`$echo "X$ltmain" | $Xsed -e 's%/[^/]*$%%'` + test "$srcdir" = "$ltmain" && srcdir=. +fi + +trap "$rm conftest*; exit 1" 1 2 15 +if test "$verify_host" = yes; then + # Check for config.guess and config.sub. + ac_aux_dir= + for ac_dir in $srcdir $srcdir/.. $srcdir/../..; do + if test -f $ac_dir/config.guess; then + ac_aux_dir=$ac_dir + break + fi + done + if test -z "$ac_aux_dir"; then + echo "$progname: cannot find config.guess in $srcdir $srcdir/.. $srcdir/../.." 1>&2 + echo "$help" 1>&2 + exit 1 + fi + ac_config_guess=$ac_aux_dir/config.guess + ac_config_sub=$ac_aux_dir/config.sub + + # Make sure we can run config.sub. + if $SHELL $ac_config_sub sun4 >/dev/null 2>&1; then : + else + echo "$progname: cannot run $ac_config_sub" 1>&2 + echo "$help" 1>&2 + exit 1 + fi + + echo $ac_n "checking host system type""... $ac_c" 1>&6 + + host_alias=$host + case "$host_alias" in + "") + if host_alias=`$SHELL $ac_config_guess`; then : + else + echo "$progname: cannot guess host type; you must specify one" 1>&2 + echo "$help" 1>&2 + exit 1 + fi ;; + esac + host=`$SHELL $ac_config_sub $host_alias` + echo "$ac_t$host" 1>&6 + + # Make sure the host verified. + test -z "$host" && exit 1 + +elif test -z "$host"; then + echo "$progname: you must specify a host type if you use \`--no-verify'" 1>&2 + echo "$help" 1>&2 + exit 1 +else + host_alias=$host +fi + +# Transform linux* to *-*-linux-gnu*, to support old configure scripts. +case "$host_os" in +linux-gnu*) ;; +linux*) host=`echo $host | sed 's/^\(.*-.*-linux\)\(.*\)$/\1-gnu\2/'` +esac + +host_cpu=`echo $host | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\1/'` +host_vendor=`echo $host | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\2/'` +host_os=`echo $host | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\3/'` + +case "$host_os" in +aix3*) + # AIX sometimes has problems with the GCC collect2 program. For some + # reason, if we set the COLLECT_NAMES environment variable, the problems + # vanish in a puff of smoke. + if test "${COLLECT_NAMES+set}" != set; then + COLLECT_NAMES= + export COLLECT_NAMES + fi + ;; +esac + +# Determine commands to create old-style static archives. +old_archive_cmds='$AR cru $oldlib$oldobjs' +old_postinstall_cmds='chmod 644 $oldlib' +old_postuninstall_cmds= + +# Set a sane default for `AR'. +test -z "$AR" && AR=ar + +# Set a sane default for `OBJDUMP'. +test -z "$OBJDUMP" && OBJDUMP=objdump + +# If RANLIB is not set, then run the test. +if test "${RANLIB+set}" != "set"; then + result=no + + echo $ac_n "checking for ranlib... $ac_c" 1>&6 + IFS="${IFS= }"; save_ifs="$IFS"; IFS="${IFS}${PATH_SEPARATOR}" + for dir in $PATH; do + test -z "$dir" && dir=. + if test -f $dir/ranlib || test -f $dir/ranlib$ac_exeext; then + RANLIB="ranlib" + result="ranlib" + break + fi + done + IFS="$save_ifs" + + echo "$ac_t$result" 1>&6 +fi + +if test -n "$RANLIB"; then + old_archive_cmds="$old_archive_cmds~\$RANLIB \$oldlib" + old_postinstall_cmds="\$RANLIB \$oldlib~$old_postinstall_cmds" +fi + +# Set sane defaults for `DLLTOOL', `OBJDUMP', and `AS', used on cygwin. +test -z "$DLLTOOL" && DLLTOOL=dlltool +test -z "$OBJDUMP" && OBJDUMP=objdump +test -z "$AS" && AS=as + +# Check to see if we are using GCC. +if test "$with_gcc" != yes || test -z "$CC"; then + # If CC is not set, then try to find GCC or a usable CC. + if test -z "$CC"; then + echo $ac_n "checking for gcc... $ac_c" 1>&6 + IFS="${IFS= }"; save_ifs="$IFS"; IFS="${IFS}${PATH_SEPARATOR}" + for dir in $PATH; do + test -z "$dir" && dir=. + if test -f $dir/gcc || test -f $dir/gcc$ac_exeext; then + CC="gcc" + break + fi + done + IFS="$save_ifs" + + if test -n "$CC"; then + echo "$ac_t$CC" 1>&6 + else + echo "$ac_t"no 1>&6 + fi + fi + + # Not "gcc", so try "cc", rejecting "/usr/ucb/cc". + if test -z "$CC"; then + echo $ac_n "checking for cc... $ac_c" 1>&6 + IFS="${IFS= }"; save_ifs="$IFS"; IFS="${IFS}${PATH_SEPARATOR}" + cc_rejected=no + for dir in $PATH; do + test -z "$dir" && dir=. + if test -f $dir/cc || test -f $dir/cc$ac_exeext; then + if test "$dir/cc" = "/usr/ucb/cc"; then + cc_rejected=yes + continue + fi + CC="cc" + break + fi + done + IFS="$save_ifs" + if test $cc_rejected = yes; then + # We found a bogon in the path, so make sure we never use it. + set dummy $CC + shift + if test $# -gt 0; then + # We chose a different compiler from the bogus one. + # However, it has the same name, so the bogon will be chosen + # first if we set CC to just the name; use the full file name. + shift + set dummy "$dir/cc" "$@" + shift + CC="$@" + fi + fi + + if test -n "$CC"; then + echo "$ac_t$CC" 1>&6 + else + echo "$ac_t"no 1>&6 + fi + + if test -z "$CC"; then + echo "$progname: error: no acceptable cc found in \$PATH" 1>&2 + exit 1 + fi + fi + + # Now see if the compiler is really GCC. + with_gcc=no + echo $ac_n "checking whether we are using GNU C... $ac_c" 1>&6 + echo "$progname:581: checking whether we are using GNU C" >&5 + + $rm conftest.c + cat > conftest.c <&5; (eval $ac_try) 2>&5; }; } | egrep yes >/dev/null 2>&1; then + with_gcc=yes + fi + $rm conftest.c + echo "$ac_t$with_gcc" 1>&6 +fi + +# Allow CC to be a program name with arguments. +set dummy $CC +compiler="$2" + +echo $ac_n "checking for object suffix... $ac_c" 1>&6 +$rm conftest* +echo 'int i = 1;' > conftest.c +echo "$progname:603: checking for object suffix" >& 5 +if { (eval echo $progname:604: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>conftest.err; }; then + # Append any warnings to the config.log. + cat conftest.err 1>&5 + + for ac_file in conftest.*; do + case $ac_file in + *.c) ;; + *) objext=`echo $ac_file | sed -e s/conftest.//` ;; + esac + done +else + cat conftest.err 1>&5 + echo "$progname: failed program was:" >&5 + cat conftest.c >&5 +fi +$rm conftest* +echo "$ac_t$objext" 1>&6 + +echo $ac_n "checking for executable suffix... $ac_c" 1>&6 +if eval "test \"`echo '$''{'ac_cv_exeext'+set}'`\" = set"; then + echo $ac_n "(cached) $ac_c" 1>&6 +else + ac_cv_exeext="no" + $rm conftest* + echo 'main () { return 0; }' > conftest.c + echo "$progname:629: checking for executable suffix" >& 5 + if { (eval echo $progname:630: \"$ac_link\") 1>&5; (eval $ac_link) 2>conftest.err; }; then + # Append any warnings to the config.log. + cat conftest.err 1>&5 + + for ac_file in conftest.*; do + case $ac_file in + *.c | *.err | *.$objext ) ;; + *) ac_cv_exeext=.`echo $ac_file | sed -e s/conftest.//` ;; + esac + done + else + cat conftest.err 1>&5 + echo "$progname: failed program was:" >&5 + cat conftest.c >&5 + fi + $rm conftest* +fi +if test "X$ac_cv_exeext" = Xno; then + exeext="" +else + exeext="$ac_cv_exeext" +fi +echo "$ac_t$ac_cv_exeext" 1>&6 + +echo $ac_n "checking for $compiler option to produce PIC... $ac_c" 1>&6 +pic_flag= +special_shlib_compile_flags= +wl= +link_static_flag= +no_builtin_flag= + +if test "$with_gcc" = yes; then + wl='-Wl,' + link_static_flag='-static' + + case "$host_os" in + beos* | irix5* | irix6* | osf3* | osf4*) + # PIC is the default for these OSes. + ;; + aix*) + # Below there is a dirty hack to force normal static linking with -ldl + # The problem is because libdl dynamically linked with both libc and + # libC (AIX C++ library), which obviously doesn't included in libraries + # list by gcc. This cause undefined symbols with -static flags. + # This hack allows C programs to be linked with "-static -ldl", but + # we not sure about C++ programs. + link_static_flag="$link_static_flag ${wl}-lC" + ;; + cygwin* | mingw* | os2*) + # We can build DLLs from non-PIC. + ;; + amigaos*) + # FIXME: we need at least 68020 code to build shared libraries, but + # adding the `-m68020' flag to GCC prevents building anything better, + # like `-m68040'. + pic_flag='-m68020 -resident32 -malways-restore-a4' + ;; + sysv4*MP*) + if test -d /usr/nec; then + pic_flag=-Kconform_pic + fi + ;; + *) + pic_flag='-fPIC' + ;; + esac +else + # PORTME Check for PIC flags for the system compiler. + case "$host_os" in + aix3* | aix4*) + # All AIX code is PIC. + link_static_flag='-bnso -bI:/lib/syscalls.exp' + ;; + + hpux9* | hpux10* | hpux11*) + # Is there a better link_static_flag that works with the bundled CC? + wl='-Wl,' + link_static_flag="${wl}-a ${wl}archive" + pic_flag='+Z' + ;; + + irix5* | irix6*) + wl='-Wl,' + link_static_flag='-non_shared' + # PIC (with -KPIC) is the default. + ;; + + cygwin* | mingw* | os2*) + # We can build DLLs from non-PIC. + ;; + + osf3* | osf4*) + # All OSF/1 code is PIC. + wl='-Wl,' + link_static_flag='-non_shared' + ;; + + sco3.2v5*) + pic_flag='-Kpic' + link_static_flag='-dn' + special_shlib_compile_flags='-belf' + ;; + + solaris*) + pic_flag='-KPIC' + link_static_flag='-Bstatic' + wl='-Wl,' + ;; + + sunos4*) + pic_flag='-PIC' + link_static_flag='-Bstatic' + wl='-Qoption ld ' + ;; + + sysv4 | sysv4.2uw2* | sysv4.3* | sysv5*) + pic_flag='-KPIC' + link_static_flag='-Bstatic' + wl='-Wl,' + ;; + + uts4*) + pic_flag='-pic' + link_static_flag='-Bstatic' + ;; + sysv4*MP*) + if test -d /usr/nec ;then + pic_flag='-Kconform_pic' + link_static_flag='-Bstatic' + fi + ;; + *) + can_build_shared=no + ;; + esac +fi + +if test -n "$pic_flag"; then + echo "$ac_t$pic_flag" 1>&6 + + # Check to make sure the pic_flag actually works. + echo $ac_n "checking if $compiler PIC flag $pic_flag works... $ac_c" 1>&6 + $rm conftest* + echo "int some_variable = 0;" > conftest.c + save_CFLAGS="$CFLAGS" + CFLAGS="$CFLAGS $pic_flag -DPIC" + echo "$progname:776: checking if $compiler PIC flag $pic_flag works" >&5 + if { (eval echo $progname:777: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>conftest.err; } && test -s conftest.$objext; then + # Append any warnings to the config.log. + cat conftest.err 1>&5 + + case "$host_os" in + hpux9* | hpux10* | hpux11*) + # On HP-UX, both CC and GCC only warn that PIC is supported... then they + # create non-PIC objects. So, if there were any warnings, we assume that + # PIC is not supported. + if test -s conftest.err; then + echo "$ac_t"no 1>&6 + can_build_shared=no + pic_flag= + else + echo "$ac_t"yes 1>&6 + pic_flag=" $pic_flag" + fi + ;; + *) + echo "$ac_t"yes 1>&6 + pic_flag=" $pic_flag" + ;; + esac + else + # Append any errors to the config.log. + cat conftest.err 1>&5 + can_build_shared=no + pic_flag= + echo "$ac_t"no 1>&6 + fi + CFLAGS="$save_CFLAGS" + $rm conftest* +else + echo "$ac_t"none 1>&6 +fi + +# Check to see if options -o and -c are simultaneously supported by compiler +echo $ac_n "checking if $compiler supports -c -o file.o... $ac_c" 1>&6 +$rm -r conftest 2>/dev/null +mkdir conftest +cd conftest +$rm conftest* +echo "int some_variable = 0;" > conftest.c +mkdir out +# According to Tom Tromey, Ian Lance Taylor reported there are C compilers +# that will create temporary files in the current directory regardless of +# the output directory. Thus, making CWD read-only will cause this test +# to fail, enabling locking or at least warning the user not to do parallel +# builds. +chmod -w . +save_CFLAGS="$CFLAGS" +CFLAGS="$CFLAGS -o out/conftest2.o" +echo "$progname:829: checking if $compiler supports -c -o file.o" >&5 +if { (eval echo $progname:830: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>out/conftest.err; } && test -s out/conftest2.o; then + + # The compiler can only warn and ignore the option if not recognized + # So say no if there are warnings + if test -s out/conftest.err; then + echo "$ac_t"no 1>&6 + compiler_c_o=no + else + echo "$ac_t"yes 1>&6 + compiler_c_o=yes + fi +else + # Append any errors to the config.log. + cat out/conftest.err 1>&5 + compiler_c_o=no + echo "$ac_t"no 1>&6 +fi +CFLAGS="$save_CFLAGS" +chmod u+w . +$rm conftest* out/* +rmdir out +cd .. +rmdir conftest +$rm -r conftest 2>/dev/null + +if test x"$compiler_c_o" = x"yes"; then + # Check to see if we can write to a .lo + echo $ac_n "checking if $compiler supports -c -o file.lo... $ac_c" 1>&6 + $rm conftest* + echo "int some_variable = 0;" > conftest.c + save_CFLAGS="$CFLAGS" + CFLAGS="$CFLAGS -c -o conftest.lo" + echo "$progname:862: checking if $compiler supports -c -o file.lo" >&5 +if { (eval echo $progname:863: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>conftest.err; } && test -s conftest.lo; then + + # The compiler can only warn and ignore the option if not recognized + # So say no if there are warnings + if test -s conftest.err; then + echo "$ac_t"no 1>&6 + compiler_o_lo=no + else + echo "$ac_t"yes 1>&6 + compiler_o_lo=yes + fi + else + # Append any errors to the config.log. + cat conftest.err 1>&5 + compiler_o_lo=no + echo "$ac_t"no 1>&6 + fi + CFLAGS="$save_CFLAGS" + $rm conftest* +else + compiler_o_lo=no +fi + +# Check to see if we can do hard links to lock some files if needed +hard_links="nottested" +if test "$compiler_c_o" = no && test "$need_locks" != no; then + # do not overwrite the value of need_locks provided by the user + echo $ac_n "checking if we can lock with hard links... $ac_c" 1>&6 + hard_links=yes + $rm conftest* + ln conftest.a conftest.b 2>/dev/null && hard_links=no + touch conftest.a + ln conftest.a conftest.b 2>&5 || hard_links=no + ln conftest.a conftest.b 2>/dev/null && hard_links=no + echo "$ac_t$hard_links" 1>&6 + $rm conftest* + if test "$hard_links" = no; then + echo "*** WARNING: \`$CC' does not support \`-c -o', so \`make -j' may be unsafe" >&2 + need_locks=warn + fi +else + need_locks=no +fi + +if test "$with_gcc" = yes; then + # Check to see if options -fno-rtti -fno-exceptions are supported by compiler + echo $ac_n "checking if $compiler supports -fno-rtti -fno-exceptions ... $ac_c" 1>&6 + $rm conftest* + echo "int some_variable = 0;" > conftest.c + save_CFLAGS="$CFLAGS" + CFLAGS="$CFLAGS -fno-rtti -fno-exceptions -c conftest.c" + echo "$progname:914: checking if $compiler supports -fno-rtti -fno-exceptions" >&5 + if { (eval echo $progname:915: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>conftest.err; } && test -s conftest.o; then + + # The compiler can only warn and ignore the option if not recognized + # So say no if there are warnings + if test -s conftest.err; then + echo "$ac_t"no 1>&6 + compiler_rtti_exceptions=no + else + echo "$ac_t"yes 1>&6 + compiler_rtti_exceptions=yes + fi + else + # Append any errors to the config.log. + cat conftest.err 1>&5 + compiler_rtti_exceptions=no + echo "$ac_t"no 1>&6 + fi + CFLAGS="$save_CFLAGS" + $rm conftest* + + if test "$compiler_rtti_exceptions" = "yes"; then + no_builtin_flag=' -fno-builtin -fno-rtti -fno-exceptions' + else + no_builtin_flag=' -fno-builtin' + fi + +fi + +# Check for any special shared library compilation flags. +if test -n "$special_shlib_compile_flags"; then + echo "$progname: warning: \`$CC' requires \`$special_shlib_compile_flags' to build shared libraries" 1>&2 + if echo "$old_CC $old_CFLAGS " | egrep -e "[ ]$special_shlib_compile_flags[ ]" >/dev/null; then : + else + echo "$progname: add \`$special_shlib_compile_flags' to the CC or CFLAGS env variable and reconfigure" 1>&2 + can_build_shared=no + fi +fi + +echo $ac_n "checking if $compiler static flag $link_static_flag works... $ac_c" 1>&6 +$rm conftest* +echo 'main(){return(0);}' > conftest.c +save_LDFLAGS="$LDFLAGS" +LDFLAGS="$LDFLAGS $link_static_flag" +echo "$progname:958: checking if $compiler static flag $link_static_flag works" >&5 +if { (eval echo $progname:959: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest; then + echo "$ac_t$link_static_flag" 1>&6 +else + echo "$ac_t"none 1>&6 + link_static_flag= +fi +LDFLAGS="$save_LDFLAGS" +$rm conftest* + +if test -z "$LN_S"; then + # Check to see if we can use ln -s, or we need hard links. + echo $ac_n "checking whether ln -s works... $ac_c" 1>&6 + $rm conftest.dat + if ln -s X conftest.dat 2>/dev/null; then + $rm conftest.dat + LN_S="ln -s" + else + LN_S=ln + fi + if test "$LN_S" = "ln -s"; then + echo "$ac_t"yes 1>&6 + else + echo "$ac_t"no 1>&6 + fi +fi + +# Make sure LD is an absolute path. +if test -z "$LD"; then + ac_prog=ld + if test "$with_gcc" = yes; then + # Check if gcc -print-prog-name=ld gives a path. + echo $ac_n "checking for ld used by GCC... $ac_c" 1>&6 + echo "$progname:991: checking for ld used by GCC" >&5 + ac_prog=`($CC -print-prog-name=ld) 2>&5` + case "$ac_prog" in + # Accept absolute paths. + [\\/]* | [A-Za-z]:[\\/]*) + re_direlt='/[^/][^/]*/\.\./' + # Canonicalize the path of ld + ac_prog=`echo $ac_prog| sed 's%\\\\%/%g'` + while echo $ac_prog | grep "$re_direlt" > /dev/null 2>&1; do + ac_prog=`echo $ac_prog| sed "s%$re_direlt%/%"` + done + test -z "$LD" && LD="$ac_prog" + ;; + "") + # If it fails, then pretend we are not using GCC. + ac_prog=ld + ;; + *) + # If it is relative, then search for the first ld in PATH. + with_gnu_ld=unknown + ;; + esac + elif test "$with_gnu_ld" = yes; then + echo $ac_n "checking for GNU ld... $ac_c" 1>&6 + echo "$progname:1015: checking for GNU ld" >&5 + else + echo $ac_n "checking for non-GNU ld""... $ac_c" 1>&6 + echo "$progname:1018: checking for non-GNU ld" >&5 + fi + + if test -z "$LD"; then + IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS="${IFS}${PATH_SEPARATOR}" + for ac_dir in $PATH; do + test -z "$ac_dir" && ac_dir=. + if test -f "$ac_dir/$ac_prog" || test -f "$ac_dir/$ac_prog$ac_exeext"; then + LD="$ac_dir/$ac_prog" + # Check to see if the program is GNU ld. I'd rather use --version, + # but apparently some GNU ld's only accept -v. + # Break only if it was the GNU/non-GNU ld that we prefer. + if "$LD" -v 2>&1 < /dev/null | egrep '(GNU|with BFD)' > /dev/null; then + test "$with_gnu_ld" != no && break + else + test "$with_gnu_ld" != yes && break + fi + fi + done + IFS="$ac_save_ifs" + fi + + if test -n "$LD"; then + echo "$ac_t$LD" 1>&6 + else + echo "$ac_t"no 1>&6 + fi + + if test -z "$LD"; then + echo "$progname: error: no acceptable ld found in \$PATH" 1>&2 + exit 1 + fi +fi + +# Check to see if it really is or is not GNU ld. +echo $ac_n "checking if the linker ($LD) is GNU ld... $ac_c" 1>&6 +# I'd rather use --version here, but apparently some GNU ld's only accept -v. +if $LD -v 2>&1 &5; then + with_gnu_ld=yes +else + with_gnu_ld=no +fi +echo "$ac_t$with_gnu_ld" 1>&6 + +# See if the linker supports building shared libraries. +echo $ac_n "checking whether the linker ($LD) supports shared libraries... $ac_c" 1>&6 + +allow_undefined_flag= +no_undefined_flag= +need_lib_prefix=unknown +need_version=unknown +# when you set need_version to no, make sure it does not cause -set_version +# flags to be left without arguments +archive_cmds= +archive_expsym_cmds= +old_archive_from_new_cmds= +export_dynamic_flag_spec= +whole_archive_flag_spec= +thread_safe_flag_spec= +hardcode_libdir_flag_spec= +hardcode_libdir_separator= +hardcode_direct=no +hardcode_minus_L=no +hardcode_shlibpath_var=unsupported +runpath_var= +always_export_symbols=no +export_symbols_cmds='$NM $libobjs $convenience | $global_symbol_pipe | sed '\''s/.* //'\'' | sort | uniq > $export_symbols' +# include_expsyms should be a list of space-separated symbols to be *always* +# included in the symbol list +include_expsyms= +# exclude_expsyms can be an egrep regular expression of symbols to exclude +# it will be wrapped by ` (' and `)$', so one must not match beginning or +# end of line. Example: `a|bc|.*d.*' will exclude the symbols `a' and `bc', +# as well as any symbol that contains `d'. +exclude_expsyms="_GLOBAL_OFFSET_TABLE_" +# Although _GLOBAL_OFFSET_TABLE_ is a valid symbol C name, most a.out +# platforms (ab)use it in PIC code, but their linkers get confused if +# the symbol is explicitly referenced. Since portable code cannot +# rely on this symbol name, it's probably fine to never include it in +# preloaded symbol tables. + +case "$host_os" in +cygwin* | mingw*) + # FIXME: the MSVC++ port hasn't been tested in a loooong time + # When not using gcc, we currently assume that we are using + # Microsoft Visual C++. + if test "$with_gcc" != yes; then + with_gnu_ld=no + fi + ;; + +esac + +ld_shlibs=yes +if test "$with_gnu_ld" = yes; then + # If archive_cmds runs LD, not CC, wlarc should be empty + wlarc='${wl}' + + # See if GNU ld supports shared libraries. + case "$host_os" in + aix3* | aix4*) + # On AIX, the GNU linker is very broken + ld_shlibs=no + cat <&2 + +*** Warning: the GNU linker, at least up to release 2.9.1, is reported +*** to be unable to reliably create shared libraries on AIX. +*** Therefore, libtool is disabling shared libraries support. If you +*** really care for shared libraries, you may want to modify your PATH +*** so that a non-GNU linker is found, and then restart. + +EOF + ;; + + amigaos*) + archive_cmds='$rm $objdir/a2ixlibrary.data~$echo "#define NAME $libname" > $objdir/a2ixlibrary.data~$echo "#define LIBRARY_ID 1" >> $objdir/a2ixlibrary.data~$echo "#define VERSION $major" >> $objdir/a2ixlibrary.data~$echo "#define REVISION $revision" >> $objdir/a2ixlibrary.data~$AR cru $lib $libobjs~$RANLIB $lib~(cd $objdir && a2ixlibrary -32)' + hardcode_libdir_flag_spec='-L$libdir' + hardcode_minus_L=yes + + # Samuel A. Falvo II reports + # that the semantics of dynamic libraries on AmigaOS, at least up + # to version 4, is to share data among multiple programs linked + # with the same dynamic library. Since this doesn't match the + # behavior of shared libraries on other platforms, we can use + # them. + ld_shlibs=no + ;; + + beos*) + if $LD --help 2>&1 | egrep ': supported targets:.* elf' > /dev/null; then + allow_undefined_flag=unsupported + # Joseph Beckenbach says some releases of gcc + # support --undefined. This deserves some investigation. FIXME + archive_cmds='$CC -nostart $libobjs $deplibs $linkopts ${wl}-soname $wl$soname -o $lib' + else + ld_shlibs=no + fi + ;; + + cygwin* | mingw*) + # hardcode_libdir_flag_spec is actually meaningless, as there is + # no search path for DLLs. + hardcode_libdir_flag_spec='-L$libdir' + allow_undefined_flag=unsupported + always_export_symbols=yes + + # Extract the symbol export list from an `--export-all' def file, + # then regenerate the def file from the symbol export list, so that + # the compiled dll only exports the symbol export list. + export_symbols_cmds='test -f $objdir/$soname-ltdll.c || sed -e "/^# \/\* ltdll\.c starts here \*\//,/^# \/\* ltdll.c ends here \*\// { s/^# //; p; }" -e d < $0 > $objdir/$soname-ltdll.c~ + test -f $objdir/$soname-ltdll.$objext || (cd $objdir && $CC -c $soname-ltdll.c)~ + $DLLTOOL --export-all --exclude-symbols DllMain@12,_cygwin_dll_entry@12,_cygwin_noncygwin_dll_entry@12 --output-def $objdir/$soname-def $objdir/$soname-ltdll.$objext $libobjs $convenience~ + sed -e "1,/EXPORTS/d" -e "s/ @ [0-9]* ; *//" < $objdir/$soname-def > $export_symbols' + + archive_expsym_cmds='echo EXPORTS > $objdir/$soname-def~ + _lt_hint=1; + for symbol in `cat $export_symbols`; do + echo " \$symbol @ \$_lt_hint ; " >> $objdir/$soname-def; + _lt_hint=`expr 1 + \$_lt_hint`; + done~ + test -f $objdir/$soname-ltdll.c || sed -e "/^# \/\* ltdll\.c starts here \*\//,/^# \/\* ltdll.c ends here \*\// { s/^# //; p; }" -e d < $0 > $objdir/$soname-ltdll.c~ + test -f $objdir/$soname-ltdll.$objext || (cd $objdir && $CC -c $soname-ltdll.c)~ + $CC -Wl,--base-file,$objdir/$soname-base -Wl,--dll -nostartfiles -Wl,-e,__cygwin_dll_entry@12 -o $lib $objdir/$soname-ltdll.$objext $libobjs $deplibs $linkopts~ + $DLLTOOL --as=$AS --dllname $soname --exclude-symbols DllMain@12,_cygwin_dll_entry@12,_cygwin_noncygwin_dll_entry@12 --def $objdir/$soname-def --base-file $objdir/$soname-base --output-exp $objdir/$soname-exp~ + $CC -Wl,--base-file,$objdir/$soname-base $objdir/$soname-exp -Wl,--dll -nostartfiles -Wl,-e,__cygwin_dll_entry@12 -o $lib $objdir/$soname-ltdll.$objext $libobjs $deplibs $linkopts~ + $DLLTOOL --as=$AS --dllname $soname --exclude-symbols DllMain@12,_cygwin_dll_entry@12,_cygwin_noncygwin_dll_entry@12 --def $objdir/$soname-def --base-file $objdir/$soname-base --output-exp $objdir/$soname-exp~ + $CC $objdir/$soname-exp -Wl,--dll -nostartfiles -Wl,-e,__cygwin_dll_entry@12 -o $lib $objdir/$soname-ltdll.$objext $libobjs $deplibs $linkopts' + + old_archive_from_new_cmds='$DLLTOOL --as=$AS --dllname $soname --def $objdir/$soname-def --output-lib $objdir/$libname.a' + ;; + + netbsd*) + if $LD --help 2>&1 | egrep ': supported targets:.* elf' > /dev/null; then + archive_cmds='$CC -shared $libobjs $deplibs $linkopts ${wl}-soname $wl$soname -o $lib' + archive_expsym_cmds='$CC -shared $libobjs $deplibs $linkopts ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' + else + archive_cmds='$LD -Bshareable $libobjs $deplibs $linkopts -o $lib' + # can we support soname and/or expsyms with a.out? -oliva + fi + ;; + + solaris*) + if $LD -v 2>&1 | egrep 'BFD 2\.8' > /dev/null; then + ld_shlibs=no + cat <&2 + +*** Warning: The releases 2.8.* of the GNU linker cannot reliably +*** create shared libraries on Solaris systems. Therefore, libtool +*** is disabling shared libraries support. We urge you to upgrade GNU +*** binutils to release 2.9.1 or newer. Another option is to modify +*** your PATH or compiler configuration so that the native linker is +*** used, and then restart. + +EOF + elif $LD --help 2>&1 | egrep ': supported targets:.* elf' > /dev/null; then + archive_cmds='$CC -shared $libobjs $deplibs $linkopts ${wl}-soname $wl$soname -o $lib' + archive_expsym_cmds='$CC -shared $libobjs $deplibs $linkopts ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' + else + ld_shlibs=no + fi + ;; + + sunos4*) + archive_cmds='$LD -assert pure-text -Bshareable -o $lib $libobjs $deplibs $linkopts' + wlarc= + hardcode_direct=yes + hardcode_shlibpath_var=no + ;; + + *) + if $LD --help 2>&1 | egrep ': supported targets:.* elf' > /dev/null; then + archive_cmds='$CC -shared $libobjs $deplibs $linkopts ${wl}-soname $wl$soname -o $lib' + archive_expsym_cmds='$CC -shared $libobjs $deplibs $linkopts ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' + else + ld_shlibs=no + fi + ;; + esac + + if test "$ld_shlibs" = yes; then + runpath_var=LD_RUN_PATH + hardcode_libdir_flag_spec='${wl}--rpath ${wl}$libdir' + export_dynamic_flag_spec='${wl}--export-dynamic' + case $host_os in + cygwin* | mingw*) + # dlltool doesn't understand --whole-archive et. al. + whole_archive_flag_spec= + ;; + *) + whole_archive_flag_spec="$wlarc"'--whole-archive$convenience '"$wlarc"'--no-whole-archive' + ;; + esac + fi +else + # PORTME fill in a description of your system's linker (not GNU ld) + case "$host_os" in + aix3*) + allow_undefined_flag=unsupported + always_export_symbols=yes + archive_expsym_cmds='$LD -o $objdir/$soname $libobjs $deplibs $linkopts -bE:$export_symbols -T512 -H512 -bM:SRE~$AR cru $lib $objdir/$soname' + # Note: this linker hardcodes the directories in LIBPATH if there + # are no directories specified by -L. + hardcode_minus_L=yes + if test "$with_gcc" = yes && test -z "$link_static_flag"; then + # Neither direct hardcoding nor static linking is supported with a + # broken collect2. + hardcode_direct=unsupported + fi + ;; + + aix4*) + hardcode_libdir_flag_spec='${wl}-b ${wl}nolibpath ${wl}-b ${wl}libpath:$libdir:/usr/lib:/lib' + hardcode_libdir_separator=':' + if test "$with_gcc" = yes; then + collect2name=`${CC} -print-prog-name=collect2` + if test -f "$collect2name" && \ + strings "$collect2name" | grep resolve_lib_name >/dev/null + then + # We have reworked collect2 + hardcode_direct=yes + else + # We have old collect2 + hardcode_direct=unsupported + # It fails to find uninstalled libraries when the uninstalled + # path is not listed in the libpath. Setting hardcode_minus_L + # to unsupported forces relinking + hardcode_minus_L=yes + hardcode_libdir_flag_spec='-L$libdir' + hardcode_libdir_separator= + fi + shared_flag='-shared' + else + shared_flag='${wl}-bM:SRE' + hardcode_direct=yes + fi + allow_undefined_flag=' ${wl}-berok' + archive_cmds="\$CC $shared_flag"' -o $objdir/$soname $libobjs $deplibs $linkopts ${wl}-bexpall ${wl}-bnoentry${allow_undefined_flag}' + archive_expsym_cmds="\$CC $shared_flag"' -o $objdir/$soname $libobjs $deplibs $linkopts ${wl}-bE:$export_symbols ${wl}-bnoentry${allow_undefined_flag}' + case "$host_os" in aix4.[01]|aix4.[01].*) + # According to Greg Wooledge, -bexpall is only supported from AIX 4.2 on + always_export_symbols=yes ;; + esac + ;; + + amigaos*) + archive_cmds='$rm $objdir/a2ixlibrary.data~$echo "#define NAME $libname" > $objdir/a2ixlibrary.data~$echo "#define LIBRARY_ID 1" >> $objdir/a2ixlibrary.data~$echo "#define VERSION $major" >> $objdir/a2ixlibrary.data~$echo "#define REVISION $revision" >> $objdir/a2ixlibrary.data~$AR cru $lib $libobjs~$RANLIB $lib~(cd $objdir && a2ixlibrary -32)' + hardcode_libdir_flag_spec='-L$libdir' + hardcode_minus_L=yes + # see comment about different semantics on the GNU ld section + ld_shlibs=no + ;; + + cygwin* | mingw*) + # When not using gcc, we currently assume that we are using + # Microsoft Visual C++. + # hardcode_libdir_flag_spec is actually meaningless, as there is + # no search path for DLLs. + hardcode_libdir_flag_spec=' ' + allow_undefined_flag=unsupported + # Tell ltmain to make .lib files, not .a files. + libext=lib + # FIXME: Setting linknames here is a bad hack. + archive_cmds='$CC -o $lib $libobjs $linkopts `echo "$deplibs" | sed -e '\''s/ -lc$//'\''` -link -dll~linknames=' + # The linker will automatically build a .lib file if we build a DLL. + old_archive_from_new_cmds='true' + # FIXME: Should let the user specify the lib program. + old_archive_cmds='lib /OUT:$oldlib$oldobjs' + fix_srcfile_path='`cygpath -w $srcfile`' + ;; + + freebsd1*) + ld_shlibs=no + ;; + + # FreeBSD 2.2.[012] allows us to include c++rt0.o to get C++ constructor + # support. Future versions do this automatically, but an explicit c++rt0.o + # does not break anything, and helps significantly (at the cost of a little + # extra space). + freebsd2.2*) + archive_cmds='$LD -Bshareable -o $lib $libobjs $deplibs $linkopts /usr/lib/c++rt0.o' + hardcode_libdir_flag_spec='-R$libdir' + hardcode_direct=yes + hardcode_shlibpath_var=no + ;; + + # Unfortunately, older versions of FreeBSD 2 do not have this feature. + freebsd2*) + archive_cmds='$LD -Bshareable -o $lib $libobjs $deplibs $linkopts' + hardcode_direct=yes + hardcode_minus_L=yes + hardcode_shlibpath_var=no + ;; + + # FreeBSD 3 and greater uses gcc -shared to do shared libraries. + freebsd*) + archive_cmds='$CC -shared -o $lib $libobjs $deplibs $linkopts' + hardcode_libdir_flag_spec='-R$libdir' + hardcode_direct=yes + hardcode_shlibpath_var=no + ;; + + hpux9* | hpux10* | hpux11*) + case "$host_os" in + hpux9*) archive_cmds='$rm $objdir/$soname~$LD -b +b $install_libdir -o $objdir/$soname $libobjs $deplibs $linkopts~test $objdir/$soname = $lib || mv $objdir/$soname $lib' ;; + *) archive_cmds='$LD -b +h $soname +b $install_libdir -o $lib $libobjs $deplibs $linkopts' ;; + esac + hardcode_libdir_flag_spec='${wl}+b ${wl}$libdir' + hardcode_libdir_separator=: + hardcode_direct=yes + hardcode_minus_L=yes # Not in the search PATH, but as the default + # location of the library. + export_dynamic_flag_spec='${wl}-E' + ;; + + irix5* | irix6*) + if test "$with_gcc" = yes; then + archive_cmds='$CC -shared $libobjs $deplibs $linkopts ${wl}-soname ${wl}$soname `test -n "$verstring" && echo ${wl}-set_version ${wl}$verstring` ${wl}-update_registry ${wl}${objdir}/so_locations -o $lib' + else + archive_cmds='$LD -shared $libobjs $deplibs $linkopts -soname $soname `test -n "$verstring" && echo -set_version $verstring` -update_registry ${objdir}/so_locations -o $lib' + fi + hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir' + hardcode_libdir_separator=: + ;; + + netbsd*) + if echo __ELF__ | $CC -E - | grep __ELF__ >/dev/null; then + archive_cmds='$LD -Bshareable -o $lib $libobjs $deplibs $linkopts' # a.out + else + archive_cmds='$LD -shared -o $lib $libobjs $deplibs $linkopts' # ELF + fi + hardcode_libdir_flag_spec='${wl}-R$libdir' + hardcode_direct=yes + hardcode_shlibpath_var=no + ;; + + openbsd*) + archive_cmds='$LD -Bshareable -o $lib $libobjs $deplibs $linkopts' + hardcode_libdir_flag_spec='-R$libdir' + hardcode_direct=yes + hardcode_shlibpath_var=no + ;; + + os2*) + hardcode_libdir_flag_spec='-L$libdir' + hardcode_minus_L=yes + allow_undefined_flag=unsupported + archive_cmds='$echo "LIBRARY $libname INITINSTANCE" > $objdir/$libname.def~$echo "DESCRIPTION \"$libname\"" >> $objdir/$libname.def~$echo DATA >> $objdir/$libname.def~$echo " SINGLE NONSHARED" >> $objdir/$libname.def~$echo EXPORTS >> $objdir/$libname.def~emxexp $libobjs >> $objdir/$libname.def~$CC -Zdll -Zcrtdll -o $lib $libobjs $deplibs $linkopts $objdir/$libname.def' + old_archive_from_new_cmds='emximp -o $objdir/$libname.a $objdir/$libname.def' + ;; + + osf3* | osf4*) + if test "$with_gcc" = yes; then + allow_undefined_flag=' ${wl}-expect_unresolved ${wl}\*' + archive_cmds='$CC -shared${allow_undefined_flag} $libobjs $deplibs $linkopts ${wl}-soname ${wl}$soname `test -n "$verstring" && echo ${wl}-set_version ${wl}$verstring` ${wl}-update_registry ${wl}${objdir}/so_locations -o $lib' + else + allow_undefined_flag=' -expect_unresolved \*' + archive_cmds='$LD -shared${allow_undefined_flag} $libobjs $deplibs $linkopts -soname $soname `test -n "$verstring" && echo -set_version $verstring` -update_registry ${objdir}/so_locations -o $lib' + fi + hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir' + hardcode_libdir_separator=: + ;; + + sco3.2v5*) + archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linkopts' + hardcode_shlibpath_var=no + runpath_var=LD_RUN_PATH + hardcode_runpath_var=yes + ;; + + solaris*) + no_undefined_flag=' -z text' + # $CC -shared without GNU ld will not create a library from C++ + # object files and a static libstdc++, better avoid it by now + archive_cmds='$LD -G${allow_undefined_flag} -h $soname -o $lib $libobjs $deplibs $linkopts' + archive_expsym_cmds='$echo "{ global:" > $lib.exp~cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $lib.exp~$echo "local: *; };" >> $lib.exp~ + $LD -G${allow_undefined_flag} -M $lib.exp -h $soname -o $lib $libobjs $deplibs $linkopts~$rm $lib.exp' + hardcode_libdir_flag_spec='-R$libdir' + hardcode_shlibpath_var=no + case "$host_os" in + solaris2.[0-5] | solaris2.[0-5].*) ;; + *) # Supported since Solaris 2.6 (maybe 2.5.1?) + whole_archive_flag_spec='-z allextract$convenience -z defaultextract' ;; + esac + ;; + + sunos4*) + archive_cmds='$LD -assert pure-text -Bstatic -o $lib $libobjs $deplibs $linkopts' + hardcode_libdir_flag_spec='-L$libdir' + hardcode_direct=yes + hardcode_minus_L=yes + hardcode_shlibpath_var=no + ;; + + sysv4) + archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linkopts' + runpath_var='LD_RUN_PATH' + hardcode_shlibpath_var=no + hardcode_direct=no #Motorola manual says yes, but my tests say they lie + ;; + + sysv4.3*) + archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linkopts' + hardcode_shlibpath_var=no + export_dynamic_flag_spec='-Bexport' + ;; + + uts4*) + archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linkopts' + hardcode_libdir_flag_spec='-L$libdir' + hardcode_shlibpath_var=no + ;; + + dgux*) + archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linkopts' + hardcode_libdir_flag_spec='-L$libdir' + hardcode_shlibpath_var=no + ;; + + sysv4*MP*) + if test -d /usr/nec ;then + # archive_cmds='$LD -G -z text -h $soname -o $lib$libobjs$deplibs' + archive_cmds='$LD -G -h $soname -o $lib$libobjs$deplibs' + hardcode_shlibpath_var=no + runpath_var=LD_RUN_PATH + hardcode_runpath_var=yes + ld_shlibs=yes + fi + ;; + + *) + ld_shlibs=no + ;; + esac +fi +echo "$ac_t$ld_shlibs" 1>&6 +test "$ld_shlibs" = no && can_build_shared=no + +if test -z "$NM"; then + echo $ac_n "checking for BSD-compatible nm... $ac_c" 1>&6 + case "$NM" in + [\\/]* | [A-Za-z]:[\\/]*) ;; # Let the user override the test with a path. + *) + IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS="${IFS}${PATH_SEPARATOR}" + for ac_dir in $PATH /usr/ucb /usr/ccs/bin /bin; do + test -z "$ac_dir" && ac_dir=. + if test -f $ac_dir/nm || test -f $ac_dir/nm$ac_exeext; then + # Check to see if the nm accepts a BSD-compat flag. + # Adding the `sed 1q' prevents false positives on HP-UX, which says: + # nm: unknown option "B" ignored + if ($ac_dir/nm -B /dev/null 2>&1 | sed '1q'; exit 0) | egrep /dev/null >/dev/null; then + NM="$ac_dir/nm -B" + break + elif ($ac_dir/nm -p /dev/null 2>&1 | sed '1q'; exit 0) | egrep /dev/null >/dev/null; then + NM="$ac_dir/nm -p" + break + else + NM=${NM="$ac_dir/nm"} # keep the first match, but + continue # so that we can try to find one that supports BSD flags + fi + fi + done + IFS="$ac_save_ifs" + test -z "$NM" && NM=nm + ;; + esac + echo "$ac_t$NM" 1>&6 +fi + +# Check for command to grab the raw symbol name followed by C symbol from nm. +echo $ac_n "checking command to parse $NM output... $ac_c" 1>&6 + +# These are sane defaults that work on at least a few old systems. +# [They come from Ultrix. What could be older than Ultrix?!! ;)] + +# Character class describing NM global symbol codes. +symcode='[BCDEGRST]' + +# Regexp to match symbols that can be accessed directly from C. +sympat='\([_A-Za-z][_A-Za-z0-9]*\)' + +# Transform the above into a raw symbol and a C symbol. +symxfrm='\1 \2\3 \3' + +# Transform an extracted symbol line into a proper C declaration +global_symbol_to_cdecl="sed -n -e 's/^. .* \(.*\)$/extern char \1;/p'" + +# Define system-specific variables. +case "$host_os" in +aix*) + symcode='[BCDT]' + ;; +cygwin* | mingw*) + symcode='[ABCDGISTW]' + ;; +hpux*) # Its linker distinguishes data from code symbols + global_symbol_to_cdecl="sed -n -e 's/^T .* \(.*\)$/extern char \1();/p' -e 's/^. .* \(.*\)$/extern char \1;/p'" + ;; +irix*) + symcode='[BCDEGRST]' + ;; +solaris*) + symcode='[BDT]' + ;; +sysv4) + symcode='[DFNSTU]' + ;; +esac + +# If we're using GNU nm, then use its standard symbol codes. +if $NM -V 2>&1 | egrep '(GNU|with BFD)' > /dev/null; then + symcode='[ABCDGISTW]' +fi + +# Try without a prefix undercore, then with it. +for ac_symprfx in "" "_"; do + + # Write the raw and C identifiers. + global_symbol_pipe="sed -n -e 's/^.*[ ]\($symcode\)[ ][ ]*\($ac_symprfx\)$sympat$/$symxfrm/p'" + + # Check to see that the pipe works correctly. + pipe_works=no + $rm conftest* + cat > conftest.c <&5 + if { (eval echo $progname:1593: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; } && test -s conftest.$objext; then + # Now try to grab the symbols. + nlist=conftest.nm + if { echo "$progname:1596: eval \"$NM conftest.$objext | $global_symbol_pipe > $nlist\"" >&5; eval "$NM conftest.$objext | $global_symbol_pipe > $nlist 2>&5"; } && test -s "$nlist"; then + + # Try sorting and uniquifying the output. + if sort "$nlist" | uniq > "$nlist"T; then + mv -f "$nlist"T "$nlist" + else + rm -f "$nlist"T + fi + + # Make sure that we snagged all the symbols we need. + if egrep ' nm_test_var$' "$nlist" >/dev/null; then + if egrep ' nm_test_func$' "$nlist" >/dev/null; then + cat < conftest.c +#ifdef __cplusplus +extern "C" { +#endif + +EOF + # Now generate the symbol file. + eval "$global_symbol_to_cdecl"' < "$nlist" >> conftest.c' + + cat <> conftest.c +#if defined (__STDC__) && __STDC__ +# define lt_ptr_t void * +#else +# define lt_ptr_t char * +# define const +#endif + +/* The mapping between symbol names and symbols. */ +const struct { + const char *name; + lt_ptr_t address; +} +lt_preloaded_symbols[] = +{ +EOF + sed 's/^. \(.*\) \(.*\)$/ {"\2", (lt_ptr_t) \&\2},/' < "$nlist" >> conftest.c + cat <<\EOF >> conftest.c + {0, (lt_ptr_t) 0} +}; + +#ifdef __cplusplus +} +#endif +EOF + # Now try linking the two files. + mv conftest.$objext conftstm.$objext + save_LIBS="$LIBS" + save_CFLAGS="$CFLAGS" + LIBS="conftstm.$objext" + CFLAGS="$CFLAGS$no_builtin_flag" + if { (eval echo $progname:1648: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest; then + pipe_works=yes + else + echo "$progname: failed program was:" >&5 + cat conftest.c >&5 + fi + LIBS="$save_LIBS" + else + echo "cannot find nm_test_func in $nlist" >&5 + fi + else + echo "cannot find nm_test_var in $nlist" >&5 + fi + else + echo "cannot run $global_symbol_pipe" >&5 + fi + else + echo "$progname: failed program was:" >&5 + cat conftest.c >&5 + fi + $rm conftest* conftst* + + # Do not use the global_symbol_pipe unless it works. + if test "$pipe_works" = yes; then + break + else + global_symbol_pipe= + fi +done +if test "$pipe_works" = yes; then + echo "${ac_t}ok" 1>&6 +else + echo "${ac_t}failed" 1>&6 +fi + +if test -z "$global_symbol_pipe"; then + global_symbol_to_cdecl= +fi + +# Check hardcoding attributes. +echo $ac_n "checking how to hardcode library paths into programs... $ac_c" 1>&6 +hardcode_action= +if test -n "$hardcode_libdir_flag_spec" || \ + test -n "$runpath_var"; then + + # We can hardcode non-existant directories. + if test "$hardcode_direct" != no && + # If the only mechanism to avoid hardcoding is shlibpath_var, we + # have to relink, otherwise we might link with an installed library + # when we should be linking with a yet-to-be-installed one + ## test "$hardcode_shlibpath_var" != no && + test "$hardcode_minus_L" != no; then + # Linking always hardcodes the temporary library directory. + hardcode_action=relink + else + # We can link without hardcoding, and we can hardcode nonexisting dirs. + hardcode_action=immediate + fi +else + # We cannot hardcode anything, or else we can only hardcode existing + # directories. + hardcode_action=unsupported +fi +echo "$ac_t$hardcode_action" 1>&6 + + +reload_flag= +reload_cmds='$LD$reload_flag -o $output$reload_objs' +echo $ac_n "checking for $LD option to reload object files... $ac_c" 1>&6 +# PORTME Some linkers may need a different reload flag. +reload_flag='-r' +echo "$ac_t$reload_flag" 1>&6 +test -n "$reload_flag" && reload_flag=" $reload_flag" + +# PORTME Fill in your ld.so characteristics +library_names_spec= +libname_spec='lib$name' +soname_spec= +postinstall_cmds= +postuninstall_cmds= +finish_cmds= +finish_eval= +shlibpath_var= +shlibpath_overrides_runpath=unknown +version_type=none +dynamic_linker="$host_os ld.so" +sys_lib_dlsearch_path_spec="/lib /usr/lib" +sys_lib_search_path_spec="/lib /usr/lib /usr/local/lib" +file_magic_cmd= +file_magic_test_file= +deplibs_check_method='unknown' +# Need to set the preceding variable on all platforms that support +# interlibrary dependencies. +# 'none' -- dependencies not supported. +# `unknown' -- same as none, but documents that we really don't know. +# 'pass_all' -- all dependencies passed with no checks. +# 'test_compile' -- check by making test program. +# 'file_magic [regex]' -- check by looking for files in library path +# which responds to the $file_magic_cmd with a given egrep regex. +# If you have `file' or equivalent on your system and you're not sure +# whether `pass_all' will *always* work, you probably want this one. +echo $ac_n "checking dynamic linker characteristics... $ac_c" 1>&6 +case "$host_os" in +aix3*) + version_type=linux + library_names_spec='${libname}${release}.so$versuffix $libname.a' + shlibpath_var=LIBPATH + + # AIX has no versioning support, so we append a major version to the name. + soname_spec='${libname}${release}.so$major' + ;; + +aix4*) + version_type=linux + # AIX has no versioning support, so currently we can not hardcode correct + # soname into executable. Probably we can add versioning support to + # collect2, so additional links can be useful in future. + # We preserve .a as extension for shared libraries though AIX4.2 + # and later linker supports .so + library_names_spec='${libname}${release}.so$versuffix ${libname}${release}.so$major $libname.a' + shlibpath_var=LIBPATH + deplibs_check_method=pass_all + ;; + +amigaos*) + library_names_spec='$libname.ixlibrary $libname.a' + # Create ${libname}_ixlibrary.a entries in /sys/libs. + finish_eval='for lib in `ls $libdir/*.ixlibrary 2>/dev/null`; do libname=`$echo "X$lib" | $Xsed -e '\''s%^.*/\([^/]*\)\.ixlibrary$%\1%'\''`; test $rm /sys/libs/${libname}_ixlibrary.a; $show "(cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a)"; (cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a) || exit 1; done' + ;; + +beos*) + library_names_spec='${libname}.so' + dynamic_linker="$host_os ld.so" + shlibpath_var=LIBRARY_PATH + deplibs_check_method=pass_all + lt_cv_dlopen="load_add_on" + lt_cv_dlopen_libs= + lt_cv_dlopen_self=yes + ;; + +bsdi4*) + version_type=linux + library_names_spec='${libname}.so$major ${libname}.so' + soname_spec='${libname}.so' + finish_cmds='PATH="\$PATH:/sbin" ldconfig $libdir' + shlibpath_var=LD_LIBRARY_PATH + deplibs_check_method='file_magic ELF [0-9][0-9]*-bit [ML]SB (shared object|dynamic lib)' + file_magic_cmd=/usr/bin/file + file_magic_test_file=/shlib/libc.so + sys_lib_search_path_spec="/shlib /usr/lib /usr/X11/lib /usr/contrib/lib /lib /usr/local/lib" + sys_lib_dlsearch_path_spec="/shlib /usr/lib /usr/local/lib" + # the default ld.so.conf also contains /usr/contrib/lib and + # /usr/X11R6/lib (/usr/X11 is a link to /usr/X11R6), but let us allow + # libtool to hard-code these into programs + ;; + +cygwin* | mingw*) + version_type=windows + need_version=no + need_lib_prefix=no + if test "$with_gcc" = yes; then + library_names_spec='${libname}`echo ${release} | sed -e 's/[.]/-/g'`${versuffix}.dll $libname.a' + else + library_names_spec='${libname}`echo ${release} | sed -e 's/[.]/-/g'`${versuffix}.dll $libname.lib' + fi + dynamic_linker='Win32 ld.exe' + deplibs_check_method='file_magic file format pei*-i386(.*architecture: i386)?' + file_magic_cmd='${OBJDUMP} -f' + # FIXME: first we should search . and the directory the executable is in + shlibpath_var=PATH + lt_cv_dlopen="LoadLibrary" + lt_cv_dlopen_libs= + ;; + +freebsd1*) + dynamic_linker=no + ;; + +freebsd*) + objformat=`test -x /usr/bin/objformat && /usr/bin/objformat || echo aout` + version_type=freebsd-$objformat + case "$version_type" in + freebsd-elf*) + deplibs_check_method='file_magic ELF [0-9][0-9]*-bit [LM]SB shared object' + file_magic_cmd=/usr/bin/file + file_magic_test_file=`echo /usr/lib/libc.so*` + library_names_spec='${libname}${release}.so$versuffix ${libname}${release}.so $libname.so' + need_version=no + need_lib_prefix=no + ;; + freebsd-*) + deplibs_check_method=unknown + library_names_spec='${libname}${release}.so$versuffix $libname.so$versuffix' + need_version=yes + ;; + esac + finish_cmds='PATH="\$PATH:/sbin" OBJFORMAT="'"$objformat"'" ldconfig -m $libdir' + shlibpath_var=LD_LIBRARY_PATH + case "$host_os" in + freebsd2* | freebsd3.[01]*) + shlibpath_overrides_runpath=yes + ;; + *) # from 3.2 on + shlibpath_overrides_runpath=no + ;; + esac + ;; + +gnu*) + version_type=linux + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}.so$versuffix ${libname}${release}.so${major} ${libname}.so' + soname_spec='${libname}${release}.so$major' + shlibpath_var=LD_LIBRARY_PATH + ;; + +hpux9* | hpux10* | hpux11*) + # Give a soname corresponding to the major version so that dld.sl refuses to + # link against other versions. + dynamic_linker="$host_os dld.sl" + version_type=sunos + need_lib_prefix=no + need_version=no + shlibpath_var=SHLIB_PATH + shlibpath_overrides_runpath=no # +s is required to enable SHLIB_PATH + library_names_spec='${libname}${release}.sl$versuffix ${libname}${release}.sl$major $libname.sl' + soname_spec='${libname}${release}.sl$major' + # HP-UX runs *really* slowly unless shared libraries are mode 555. + postinstall_cmds='chmod 555 $lib' + ;; + +irix5* | irix6*) + version_type=irix + need_lib_prefix=no + need_version=no + soname_spec='${libname}${release}.so.$major' + library_names_spec='${libname}${release}.so.$versuffix ${libname}${release}.so.$major ${libname}${release}.so $libname.so' + case "$host_os" in + irix5*) + libsuff= shlibsuff= + # this will be overridden with pass_all, but let us keep it just in case + deplibs_check_method="file_magic ELF 32-bit MSB dynamic lib MIPS - version 1" + ;; + *) + case "$LD" in # libtool.m4 will add one of these switches to LD + *-32|*"-32 ") libsuff= shlibsuff= libmagic=32-bit;; + *-n32|*"-n32 ") libsuff=32 shlibsuff=N32 libmagic=N32;; + *-64|*"-64 ") libsuff=64 shlibsuff=64 libmagic=64-bit;; + *) libsuff= shlibsuff= libmagic=never-match;; + esac + # this will be overridden with pass_all, but let us keep it just in case + deplibs_check_method="file_magic ELF ${libmagic} MSB mips-[1234] dynamic lib MIPS - version 1" + ;; + esac + shlibpath_var=LD_LIBRARY${shlibsuff}_PATH + shlibpath_overrides_runpath=no + sys_lib_search_path_spec="/usr/lib${libsuff} /lib${libsuff} /usr/local/lib${libsuff}" + sys_lib_dlsearch_path_spec="/usr/lib${libsuff} /lib${libsuff}" + file_magic_cmd=/usr/bin/file + file_magic_test_file=`echo /lib${libsuff}/libc.so*` + deplibs_check_method='pass_all' + ;; + +# No shared lib support for Linux oldld, aout, or coff. +linux-gnuoldld* | linux-gnuaout* | linux-gnucoff*) + dynamic_linker=no + ;; + +# This must be Linux ELF. +linux-gnu*) + version_type=linux + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}.so$versuffix ${libname}${release}.so$major $libname.so' + soname_spec='${libname}${release}.so$major' + finish_cmds='PATH="\$PATH:/sbin" ldconfig -n $libdir' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=no + deplibs_check_method='file_magic ELF [0-9][0-9]*-bit [LM]SB (shared object|dynamic lib )' + file_magic_cmd=/usr/bin/file + file_magic_test_file=`echo /lib/libc.so* /lib/libc-*.so` + + if test -f /lib/ld.so.1; then + dynamic_linker='GNU ld.so' + else + # Only the GNU ld.so supports shared libraries on MkLinux. + case "$host_cpu" in + powerpc*) dynamic_linker=no ;; + *) dynamic_linker='Linux ld.so' ;; + esac + fi + ;; + +netbsd*) + version_type=sunos + if echo __ELF__ | $CC -E - | grep __ELF__ >/dev/null; then + library_names_spec='${libname}${release}.so$versuffix ${libname}.so$versuffix' + finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir' + dynamic_linker='NetBSD (a.out) ld.so' + else + library_names_spec='${libname}${release}.so$versuffix ${libname}${release}.so$major ${libname}${release}.so ${libname}.so' + soname_spec='${libname}${release}.so$major' + dynamic_linker='NetBSD ld.elf_so' + fi + shlibpath_var=LD_LIBRARY_PATH + ;; + +openbsd*) + version_type=sunos + if test "$with_gnu_ld" = yes; then + need_lib_prefix=no + need_version=no + fi + library_names_spec='${libname}${release}.so$versuffix ${libname}.so$versuffix' + finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir' + shlibpath_var=LD_LIBRARY_PATH + ;; + +os2*) + libname_spec='$name' + need_lib_prefix=no + library_names_spec='$libname.dll $libname.a' + dynamic_linker='OS/2 ld.exe' + shlibpath_var=LIBPATH + ;; + +osf3* | osf4*) + version_type=osf + need_version=no + soname_spec='${libname}${release}.so' + library_names_spec='${libname}${release}.so$versuffix ${libname}${release}.so $libname.so' + shlibpath_var=LD_LIBRARY_PATH + # this will be overridden with pass_all, but let us keep it just in case + deplibs_check_method='file_magic COFF format alpha shared library' + file_magic_cmd=/usr/bin/file + file_magic_test_file=/shlib/libc.so + deplibs_check_method='pass_all' + sys_lib_search_path_spec="/usr/shlib /usr/ccs/lib /usr/lib/cmplrs/cc /usr/lib /usr/local/lib /var/shlib" + sys_lib_dlsearch_path_spec="$sys_lib_search_path_spec" + ;; + +sco3.2v5*) + version_type=osf + soname_spec='${libname}${release}.so$major' + library_names_spec='${libname}${release}.so$versuffix ${libname}${release}.so$major $libname.so' + shlibpath_var=LD_LIBRARY_PATH + ;; + +solaris*) + version_type=linux + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}.so$versuffix ${libname}${release}.so$major $libname.so' + soname_spec='${libname}${release}.so$major' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes + # ldd complains unless libraries are executable + postinstall_cmds='chmod +x $lib' + deplibs_check_method="file_magic ELF [0-9][0-9]-bit [LM]SB dynamic lib" + file_magic_cmd=/usr/bin/file + file_magic_test_file=/lib/libc.so + ;; + +sunos4*) + version_type=sunos + library_names_spec='${libname}${release}.so$versuffix ${libname}.so$versuffix' + finish_cmds='PATH="\$PATH:/usr/etc" ldconfig $libdir' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes + if test "$with_gnu_ld" = yes; then + need_lib_prefix=no + fi + need_version=yes + ;; + +sysv4 | sysv4.2uw2* | sysv4.3* | sysv5*) + version_type=linux + library_names_spec='${libname}${release}.so$versuffix ${libname}${release}.so$major $libname.so' + soname_spec='${libname}${release}.so$major' + shlibpath_var=LD_LIBRARY_PATH + case "$host_vendor" in + ncr) + deplibs_check_method='pass_all' + ;; + motorola) + need_lib_prefix=no + need_version=no + shlibpath_overrides_runpath=no + sys_lib_search_path_spec='/lib /usr/lib /usr/ccs/lib' + deplibs_check_method='file_magic ELF [0-9][0-9]*-bit [ML]SB (shared object|dynamic lib) M[0-9][0-9]* Version [0-9]' + file_magic_cmd=/usr/bin/file + file_magic_test_file=`echo /usr/lib/libc.so*` + ;; + esac + ;; + +uts4*) + version_type=linux + library_names_spec='${libname}${release}.so$versuffix ${libname}${release}.so$major $libname.so' + soname_spec='${libname}${release}.so$major' + shlibpath_var=LD_LIBRARY_PATH + ;; + +dgux*) + version_type=linux + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}.so$versuffix ${libname}${release}.so$major $libname.so' + soname_spec='${libname}${release}.so$major' + shlibpath_var=LD_LIBRARY_PATH + ;; + +sysv4*MP*) + if test -d /usr/nec ;then + version_type=linux + library_names_spec='$libname.so.$versuffix $libname.so.$major $libname.so' + soname_spec='$libname.so.$major' + shlibpath_var=LD_LIBRARY_PATH + fi + ;; + +*) + dynamic_linker=no + ;; +esac +echo "$ac_t$dynamic_linker" 1>&6 +test "$dynamic_linker" = no && can_build_shared=no + +# Report the final consequences. +echo "checking if libtool supports shared libraries... $can_build_shared" 1>&6 + +# Only try to build win32 dlls if AC_LIBTOOL_WIN32_DLL was used in +# configure.in, otherwise build static only libraries. +case "$host_os" in +cygwin* | mingw* | os2*) + if test x$can_build_shared = xyes; then + test x$enable_win32_dll = xno && can_build_shared=no + echo "checking if package supports dlls... $can_build_shared" 1>&6 + fi +;; +esac + +if test -n "$file_magic_test_file" && test -n "$file_magic_cmd"; then + case "$deplibs_check_method" in + "file_magic "*) + file_magic_regex="`expr \"$deplibs_check_method\" : \"file_magic \(.*\)\"`" + if eval $file_magic_cmd \$file_magic_test_file 2> /dev/null | + egrep "$file_magic_regex" > /dev/null; then + : + else + cat <&2 + +*** Warning: the command libtool uses to detect shared libraries, +*** $file_magic_cmd, produces output that libtool cannot recognize. +*** The result is that libtool may fail to recognize shared libraries +*** as such. This will affect the creation of libtool libraries that +*** depend on shared libraries, but programs linked with such libtool +*** libraries will work regardless of this problem. Nevertheless, you +*** may want to report the problem to your system manager and/or to +*** bug-libtool@gnu.org + +EOF + fi ;; + esac +fi + +echo $ac_n "checking whether to build shared libraries... $ac_c" 1>&6 +test "$can_build_shared" = "no" && enable_shared=no + +# On AIX, shared libraries and static libraries use the same namespace, and +# are all built from PIC. +case "$host_os" in +aix3*) + test "$enable_shared" = yes && enable_static=no + if test -n "$RANLIB"; then + archive_cmds="$archive_cmds~\$RANLIB \$lib" + postinstall_cmds='$RANLIB $lib' + fi + ;; + +aix4*) + test "$enable_shared" = yes && enable_static=no + ;; +esac + +echo "$ac_t$enable_shared" 1>&6 + +# Make sure either enable_shared or enable_static is yes. +test "$enable_shared" = yes || enable_static=yes + +echo "checking whether to build static libraries... $enable_static" 1>&6 + +if test "$hardcode_action" = relink; then + # Fast installation is not supported + enable_fast_install=no +elif test "$shlibpath_overrides_runpath" = yes || + test "$enable_shared" = no; then + # Fast installation is not necessary + enable_fast_install=needless +fi + +echo $ac_n "checking for objdir... $ac_c" 1>&6 +rm -f .libs 2>/dev/null +mkdir .libs 2>/dev/null +if test -d .libs; then + objdir=.libs +else + # MS-DOS does not allow filenames that begin with a dot. + objdir=_libs +fi +rmdir .libs 2>/dev/null +echo "$ac_t$objdir" 1>&6 + +if test "x$enable_dlopen" != xyes; then + enable_dlopen=unknown + enable_dlopen_self=unknown + enable_dlopen_self_static=unknown +else +if eval "test \"`echo '$''{'lt_cv_dlopen'+set}'`\" != set"; then + lt_cv_dlopen=no lt_cv_dlopen_libs= +echo $ac_n "checking for dlopen in -ldl""... $ac_c" 1>&6 +echo "$progname:2170: checking for dlopen in -ldl" >&5 +ac_lib_var=`echo dl'_'dlopen | sed 'y%./+-%__p_%'` +if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then + echo $ac_n "(cached) $ac_c" 1>&6 +else + ac_save_LIBS="$LIBS" +LIBS="-ldl $LIBS" +cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then + rm -rf conftest* + eval "ac_cv_lib_$ac_lib_var=yes" +else + echo "$progname: failed program was:" >&5 + cat conftest.$ac_ext >&5 + rm -rf conftest* + eval "ac_cv_lib_$ac_lib_var=no" +fi +rm -f conftest* +LIBS="$ac_save_LIBS" + +fi +if eval "test \"`echo '$ac_cv_lib_'$ac_lib_var`\" = yes"; then + echo "$ac_t""yes" 1>&6 + lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-ldl" +else + echo "$ac_t""no" 1>&6 +echo $ac_n "checking for dlopen""... $ac_c" 1>&6 +echo "$progname:2207: checking for dlopen" >&5 +if eval "test \"`echo '$''{'ac_cv_func_dlopen'+set}'`\" = set"; then + echo $ac_n "(cached) $ac_c" 1>&6 +else + cat > conftest.$ac_ext < +/* Override any gcc2 internal prototype to avoid an error. */ +/* We use char because int might match the return type of a gcc2 + builtin and then its argument prototype would still apply. */ +char dlopen(); + +int main() { + +/* The GNU C library defines this for functions which it implements + to always fail with ENOSYS. Some functions are actually named + something starting with __ and the normal name is an alias. */ +#if defined (__stub_dlopen) || defined (__stub___dlopen) +choke me +#else +dlopen(); +#endif + +; return 0; } +EOF +if { (eval echo $progname:2234: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then + rm -rf conftest* + eval "ac_cv_func_dlopen=yes" +else + echo "$progname: failed program was:" >&5 + cat conftest.$ac_ext >&5 + rm -rf conftest* + eval "ac_cv_func_dlopen=no" +fi +rm -f conftest* +fi +if eval "test \"`echo '$ac_cv_func_'dlopen`\" = yes"; then + echo "$ac_t""yes" 1>&6 + lt_cv_dlopen="dlopen" +else + echo "$ac_t""no" 1>&6 +echo $ac_n "checking for dld_link in -ldld""... $ac_c" 1>&6 +echo "$progname:2251: checking for dld_link in -ldld" >&5 +ac_lib_var=`echo dld'_'dld_link | sed 'y%./+-%__p_%'` +if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then + echo $ac_n "(cached) $ac_c" 1>&6 +else + ac_save_LIBS="$LIBS" +LIBS="-ldld $LIBS" +cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then + rm -rf conftest* + eval "ac_cv_lib_$ac_lib_var=yes" +else + echo "$progname: failed program was:" >&5 + cat conftest.$ac_ext >&5 + rm -rf conftest* + eval "ac_cv_lib_$ac_lib_var=no" +fi +rm -f conftest* +LIBS="$ac_save_LIBS" + +fi +if eval "test \"`echo '$ac_cv_lib_'$ac_lib_var`\" = yes"; then + echo "$ac_t""yes" 1>&6 + lt_cv_dlopen="dld_link" lt_cv_dlopen_libs="-ldld" +else + echo "$ac_t""no" 1>&6 +echo $ac_n "checking for shl_load""... $ac_c" 1>&6 +echo "$progname:2288: checking for shl_load" >&5 +if eval "test \"`echo '$''{'ac_cv_func_shl_load'+set}'`\" = set"; then + echo $ac_n "(cached) $ac_c" 1>&6 +else + cat > conftest.$ac_ext < +/* Override any gcc2 internal prototype to avoid an error. */ +/* We use char because int might match the return type of a gcc2 + builtin and then its argument prototype would still apply. */ +char shl_load(); + +int main() { + +/* The GNU C library defines this for functions which it implements + to always fail with ENOSYS. Some functions are actually named + something starting with __ and the normal name is an alias. */ +#if defined (__stub_shl_load) || defined (__stub___shl_load) +choke me +#else +shl_load(); +#endif + +; return 0; } +EOF +if { (eval echo $progname:2315: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then + rm -rf conftest* + eval "ac_cv_func_shl_load=yes" +else + echo "$progname: failed program was:" >&5 + cat conftest.$ac_ext >&5 + rm -rf conftest* + eval "ac_cv_func_shl_load=no" +fi +rm -f conftest* +fi + +if eval "test \"`echo '$ac_cv_func_'shl_load`\" = yes"; then + echo "$ac_t""yes" 1>&6 + lt_cv_dlopen="shl_load" +else + echo "$ac_t""no" 1>&6 +echo $ac_n "checking for shl_load in -ldld""... $ac_c" 1>&6 +echo "$progname:2333: checking for shl_load in -ldld" >&5 +ac_lib_var=`echo dld'_'shl_load | sed 'y%./+-%__p_%'` +if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then + echo $ac_n "(cached) $ac_c" 1>&6 +else + ac_save_LIBS="$LIBS" +LIBS="-ldld $LIBS" +cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then + rm -rf conftest* + eval "ac_cv_lib_$ac_lib_var=yes" +else + echo "$progname: failed program was:" >&5 + cat conftest.$ac_ext >&5 + rm -rf conftest* + eval "ac_cv_lib_$ac_lib_var=no" +fi +rm -f conftest* +LIBS="$ac_save_LIBS" + +fi +if eval "test \"`echo '$ac_cv_lib_'$ac_lib_var`\" = yes"; then + echo "$ac_t""yes" 1>&6 + lt_cv_dlopen="shl_load" lt_cv_dlopen_libs="-ldld" +else + echo "$ac_t""no" 1>&6 +fi + + +fi + + +fi + + +fi + + +fi + +fi + + if test "x$lt_cv_dlopen" != xno; then + enable_dlopen=yes + fi + + case "$lt_cv_dlopen" in + dlopen) +for ac_hdr in dlfcn.h; do +ac_safe=`echo "$ac_hdr" | sed 'y%./+-%__p_%'` +echo $ac_n "checking for $ac_hdr""... $ac_c" 1>&6 +echo "$progname:2395: checking for $ac_hdr" >&5 +if eval "test \"`echo '$''{'ac_cv_header_$ac_safe'+set}'`\" = set"; then + echo $ac_n "(cached) $ac_c" 1>&6 +else + cat > conftest.$ac_ext < +int fnord = 0; +EOF +ac_try="$ac_compile conftest.$ac_ext >/dev/null 2>conftest.out" +{ (eval echo $progname:2405: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; } +ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"` +if test -z "$ac_err"; then + rm -rf conftest* + eval "ac_cv_header_$ac_safe=yes" +else + echo "$ac_err" >&5 + echo "$progname: failed program was:" >&5 + cat conftest.$ac_ext >&5 + rm -rf conftest* + eval "ac_cv_header_$ac_safe=no" +fi +rm -f conftest* +fi +if eval "test \"`echo '$ac_cv_header_'$ac_safe`\" = yes"; then + echo "$ac_t""yes" 1>&6 +else + echo "$ac_t""no" 1>&6 +fi +done + + if test "x$ac_cv_header_dlfcn_h" = xyes; then + CPPFLAGS="$CPPFLAGS -DHAVE_DLFCN_H" + fi + eval LDFLAGS=\"\$LDFLAGS $export_dynamic_flag_spec\" + LIBS="$lt_cv_dlopen_libs $LIBS" + + echo $ac_n "checking whether a program can dlopen itself""... $ac_c" 1>&6 +echo "$progname:2433: checking whether a program can dlopen itself" >&5 +if test "${lt_cv_dlopen_self+set}" = set; then + echo $ac_n "(cached) $ac_c" 1>&6 +else + if test "$cross_compiling" = yes; then + lt_cv_dlopen_self=cross + else + cat > conftest.c < +#endif + +#include + +#ifdef RTLD_GLOBAL +# define LTDL_GLOBAL RTLD_GLOBAL +#else +# ifdef DL_GLOBAL +# define LTDL_GLOBAL DL_GLOBAL +# else +# define LTDL_GLOBAL 0 +# endif +#endif + +/* We may have to define LTDL_LAZY_OR_NOW in the command line if we + find out it does not work in some platform. */ +#ifndef LTDL_LAZY_OR_NOW +# ifdef RTLD_LAZY +# define LTDL_LAZY_OR_NOW RTLD_LAZY +# else +# ifdef DL_LAZY +# define LTDL_LAZY_OR_NOW DL_LAZY +# else +# ifdef RTLD_NOW +# define LTDL_LAZY_OR_NOW RTLD_NOW +# else +# ifdef DL_NOW +# define LTDL_LAZY_OR_NOW DL_NOW +# else +# define LTDL_LAZY_OR_NOW 0 +# endif +# endif +# endif +# endif +#endif + +fnord() { int i=42;} +main() { void *self, *ptr1, *ptr2; self=dlopen(0,LTDL_GLOBAL|LTDL_LAZY_OR_NOW); + if(self) { ptr1=dlsym(self,"fnord"); ptr2=dlsym(self,"_fnord"); + if(ptr1 || ptr2) { dlclose(self); exit(0); } } exit(1); } + +EOF +if { (eval echo $progname:2487: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest && (./conftest; exit) 2>/dev/null +then + lt_cv_dlopen_self=yes +else + echo "$progname: failed program was:" >&5 + cat conftest.$ac_ext >&5 + rm -fr conftest* + lt_cv_dlopen_self=no +fi +rm -fr conftest* +fi + +fi + +echo "$ac_t""$lt_cv_dlopen_self" 1>&6 + + if test "$lt_cv_dlopen_self" = yes; then + LDFLAGS="$LDFLAGS $link_static_flag" + echo $ac_n "checking whether a statically linked program can dlopen itself""... $ac_c" 1>&6 +echo "$progname:2506: checking whether a statically linked program can dlopen itself" >&5 +if test "${lt_cv_dlopen_self_static+set}" = set; then + echo $ac_n "(cached) $ac_c" 1>&6 +else + if test "$cross_compiling" = yes; then + lt_cv_dlopen_self_static=cross + else + cat > conftest.c < +#endif + +#include + +#ifdef RTLD_GLOBAL +# define LTDL_GLOBAL RTLD_GLOBAL +#else +# ifdef DL_GLOBAL +# define LTDL_GLOBAL DL_GLOBAL +# else +# define LTDL_GLOBAL 0 +# endif +#endif + +/* We may have to define LTDL_LAZY_OR_NOW in the command line if we + find out it does not work in some platform. */ +#ifndef LTDL_LAZY_OR_NOW +# ifdef RTLD_LAZY +# define LTDL_LAZY_OR_NOW RTLD_LAZY +# else +# ifdef DL_LAZY +# define LTDL_LAZY_OR_NOW DL_LAZY +# else +# ifdef RTLD_NOW +# define LTDL_LAZY_OR_NOW RTLD_NOW +# else +# ifdef DL_NOW +# define LTDL_LAZY_OR_NOW DL_NOW +# else +# define LTDL_LAZY_OR_NOW 0 +# endif +# endif +# endif +# endif +#endif + +fnord() { int i=42;} +main() { void *self, *ptr1, *ptr2; self=dlopen(0,LTDL_GLOBAL|LTDL_LAZY_OR_NOW); + if(self) { ptr1=dlsym(self,"fnord"); ptr2=dlsym(self,"_fnord"); + if(ptr1 || ptr2) { dlclose(self); exit(0); } } exit(1); } + +EOF +if { (eval echo $progname:2560: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest && (./conftest; exit) 2>/dev/null +then + lt_cv_dlopen_self_static=yes +else + echo "$progname: failed program was:" >&5 + cat conftest.$ac_ext >&5 + rm -fr conftest* + lt_cv_dlopen_self_static=no +fi +rm -fr conftest* +fi + +fi + +echo "$ac_t""$lt_cv_dlopen_self_static" 1>&6 +fi + ;; + esac + + case "$lt_cv_dlopen_self" in + yes|no) enable_dlopen_self=$lt_cv_dlopen_self ;; + *) enable_dlopen_self=unknown ;; + esac + + case "$lt_cv_dlopen_self_static" in + yes|no) enable_dlopen_self_static=$lt_cv_dlopen_self_static ;; + *) enable_dlopen_self_static=unknown ;; + esac +fi + +# Copy echo and quote the copy, instead of the original, because it is +# used later. +ltecho="$echo" +if test "X$ltecho" = "X$CONFIG_SHELL $0 --fallback-echo"; then + ltecho="$CONFIG_SHELL \$0 --fallback-echo" +fi +LTSHELL="$SHELL" + +LTCONFIG_VERSION="$VERSION" + +# Only quote variables if we're using ltmain.sh. +case "$ltmain" in +*.sh) + # Now quote all the things that may contain metacharacters. + for var in ltecho old_CC old_CFLAGS old_CPPFLAGS \ + old_LD old_LDFLAGS old_LIBS \ + old_NM old_RANLIB old_LN_S old_DLLTOOL old_OBJDUMP old_AS \ + AR CC LD LN_S NM LTSHELL LTCONFIG_VERSION \ + reload_flag reload_cmds wl \ + pic_flag link_static_flag no_builtin_flag export_dynamic_flag_spec \ + thread_safe_flag_spec whole_archive_flag_spec libname_spec \ + library_names_spec soname_spec \ + RANLIB old_archive_cmds old_archive_from_new_cmds old_postinstall_cmds \ + old_postuninstall_cmds archive_cmds archive_expsym_cmds postinstall_cmds postuninstall_cmds \ + file_magic_cmd export_symbols_cmds deplibs_check_method allow_undefined_flag no_undefined_flag \ + finish_cmds finish_eval global_symbol_pipe global_symbol_to_cdecl \ + hardcode_libdir_flag_spec hardcode_libdir_separator \ + sys_lib_search_path_spec sys_lib_dlsearch_path_spec \ + compiler_c_o compiler_o_lo need_locks exclude_expsyms include_expsyms; do + + case "$var" in + reload_cmds | old_archive_cmds | old_archive_from_new_cmds | \ + old_postinstall_cmds | old_postuninstall_cmds | \ + export_symbols_cmds | archive_cmds | archive_expsym_cmds | \ + postinstall_cmds | postuninstall_cmds | \ + finish_cmds | sys_lib_search_path_spec | sys_lib_dlsearch_path_spec) + # Double-quote double-evaled strings. + eval "$var=\\\"\`\$echo \"X\$$var\" | \$Xsed -e \"\$double_quote_subst\" -e \"\$sed_quote_subst\" -e \"\$delay_variable_subst\"\`\\\"" + ;; + *) + eval "$var=\\\"\`\$echo \"X\$$var\" | \$Xsed -e \"\$sed_quote_subst\"\`\\\"" + ;; + esac + done + + case "$ltecho" in + *'\$0 --fallback-echo"') + ltecho=`$echo "X$ltecho" | $Xsed -e 's/\\\\\\\$0 --fallback-echo"$/$0 --fallback-echo"/'` + ;; + esac + + trap "$rm \"$ofile\"; exit 1" 1 2 15 + echo "creating $ofile" + $rm "$ofile" + cat < "$ofile" +#! $SHELL + +# `$echo "$ofile" | sed 's%^.*/%%'` - Provide generalized library-building support services. +# Generated automatically by $PROGRAM (GNU $PACKAGE $VERSION$TIMESTAMP) +# NOTE: Changes made to this file will be lost: look at ltconfig or ltmain.sh. +# +# Copyright (C) 1996-1999 Free Software Foundation, Inc. +# Gordon Matzigkeit , 1996 +# +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, but +# WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. +# +# As a special exception to the GNU General Public License, if you +# distribute this file as part of a program that contains a +# configuration script generated by Autoconf, you may include it under +# the same distribution terms that you use for the rest of that program. + +# Sed that helps us avoid accidentally triggering echo(1) options like -n. +Xsed="sed -e s/^X//" + +# The HP-UX ksh and POSIX shell print the target directory to stdout +# if CDPATH is set. +if test "\${CDPATH+set}" = set; then CDPATH=; export CDPATH; fi + +### BEGIN LIBTOOL CONFIG +EOF + cfgfile="$ofile" + ;; + +*) + # Double-quote the variables that need it (for aesthetics). + for var in old_CC old_CFLAGS old_CPPFLAGS \ + old_LD old_LDFLAGS old_LIBS \ + old_NM old_RANLIB old_LN_S old_DLLTOOL old_OBJDUMP old_AS; do + eval "$var=\\\"\$var\\\"" + done + + # Just create a config file. + cfgfile="$ofile.cfg" + trap "$rm \"$cfgfile\"; exit 1" 1 2 15 + echo "creating $cfgfile" + $rm "$cfgfile" + cat < "$cfgfile" +# `$echo "$cfgfile" | sed 's%^.*/%%'` - Libtool configuration file. +# Generated automatically by $PROGRAM (GNU $PACKAGE $VERSION$TIMESTAMP) +EOF + ;; +esac + +cat <> "$cfgfile" +# Libtool was configured as follows, on host `(hostname || uname -n) 2>/dev/null | sed 1q`: +# +# CC=$old_CC CFLAGS=$old_CFLAGS CPPFLAGS=$old_CPPFLAGS \\ +# LD=$old_LD LDFLAGS=$old_LDFLAGS LIBS=$old_LIBS \\ +# NM=$old_NM RANLIB=$old_RANLIB LN_S=$old_LN_S \\ +# DLLTOOL=$old_DLLTOOL OBJDUMP=$old_OBJDUMP AS=$old_AS \\ +# $0$ltconfig_args +# +# Compiler and other test output produced by $progname, useful for +# debugging $progname, is in ./config.log if it exists. + +# The version of $progname that generated this script. +LTCONFIG_VERSION=$LTCONFIG_VERSION + +# Shell to use when invoking shell scripts. +SHELL=$LTSHELL + +# Whether or not to build shared libraries. +build_libtool_libs=$enable_shared + +# Whether or not to build static libraries. +build_old_libs=$enable_static + +# Whether or not to optimize for fast installation. +fast_install=$enable_fast_install + +# The host system. +host_alias=$host_alias +host=$host + +# An echo program that does not interpret backslashes. +echo=$ltecho + +# The archiver. +AR=$AR + +# The default C compiler. +CC=$CC + +# The linker used to build libraries. +LD=$LD + +# Whether we need hard or soft links. +LN_S=$LN_S + +# A BSD-compatible nm program. +NM=$NM + +# Used on cygwin: DLL creation program. +DLLTOOL="$DLLTOOL" + +# Used on cygwin: object dumper. +OBJDUMP="$OBJDUMP" + +# Used on cygwin: assembler. +AS="$AS" + +# The name of the directory that contains temporary libtool files. +objdir=$objdir + +# How to create reloadable object files. +reload_flag=$reload_flag +reload_cmds=$reload_cmds + +# How to pass a linker flag through the compiler. +wl=$wl + +# Object file suffix (normally "o"). +objext="$objext" + +# Old archive suffix (normally "a"). +libext="$libext" + +# Executable file suffix (normally ""). +exeext="$exeext" + +# Additional compiler flags for building library objects. +pic_flag=$pic_flag + +# Does compiler simultaneously support -c and -o options? +compiler_c_o=$compiler_c_o + +# Can we write directly to a .lo ? +compiler_o_lo=$compiler_o_lo + +# Must we lock files when doing compilation ? +need_locks=$need_locks + +# Do we need the lib prefix for modules? +need_lib_prefix=$need_lib_prefix + +# Do we need a version for libraries? +need_version=$need_version + +# Whether dlopen is supported. +dlopen=$enable_dlopen + +# Whether dlopen of programs is supported. +dlopen_self=$enable_dlopen_self + +# Whether dlopen of statically linked programs is supported. +dlopen_self_static=$enable_dlopen_self_static + +# Compiler flag to prevent dynamic linking. +link_static_flag=$link_static_flag + +# Compiler flag to turn off builtin functions. +no_builtin_flag=$no_builtin_flag + +# Compiler flag to allow reflexive dlopens. +export_dynamic_flag_spec=$export_dynamic_flag_spec + +# Compiler flag to generate shared objects directly from archives. +whole_archive_flag_spec=$whole_archive_flag_spec + +# Compiler flag to generate thread-safe objects. +thread_safe_flag_spec=$thread_safe_flag_spec + +# Library versioning type. +version_type=$version_type + +# Format of library name prefix. +libname_spec=$libname_spec + +# List of archive names. First name is the real one, the rest are links. +# The last name is the one that the linker finds with -lNAME. +library_names_spec=$library_names_spec + +# The coded name of the library, if different from the real name. +soname_spec=$soname_spec + +# Commands used to build and install an old-style archive. +RANLIB=$RANLIB +old_archive_cmds=$old_archive_cmds +old_postinstall_cmds=$old_postinstall_cmds +old_postuninstall_cmds=$old_postuninstall_cmds + +# Create an old-style archive from a shared archive. +old_archive_from_new_cmds=$old_archive_from_new_cmds + +# Commands used to build and install a shared archive. +archive_cmds=$archive_cmds +archive_expsym_cmds=$archive_expsym_cmds +postinstall_cmds=$postinstall_cmds +postuninstall_cmds=$postuninstall_cmds + +# Method to check whether dependent libraries are shared objects. +deplibs_check_method=$deplibs_check_method + +# Command to use when deplibs_check_method == file_magic. +file_magic_cmd=$file_magic_cmd + +# Flag that allows shared libraries with undefined symbols to be built. +allow_undefined_flag=$allow_undefined_flag + +# Flag that forces no undefined symbols. +no_undefined_flag=$no_undefined_flag + +# Commands used to finish a libtool library installation in a directory. +finish_cmds=$finish_cmds + +# Same as above, but a single script fragment to be evaled but not shown. +finish_eval=$finish_eval + +# Take the output of nm and produce a listing of raw symbols and C names. +global_symbol_pipe=$global_symbol_pipe + +# Transform the output of nm in a proper C declaration +global_symbol_to_cdecl=$global_symbol_to_cdecl + +# This is the shared library runtime path variable. +runpath_var=$runpath_var + +# This is the shared library path variable. +shlibpath_var=$shlibpath_var + +# Is shlibpath searched before the hard-coded library search path? +shlibpath_overrides_runpath=$shlibpath_overrides_runpath + +# How to hardcode a shared library path into an executable. +hardcode_action=$hardcode_action + +# Flag to hardcode \$libdir into a binary during linking. +# This must work even if \$libdir does not exist. +hardcode_libdir_flag_spec=$hardcode_libdir_flag_spec + +# Whether we need a single -rpath flag with a separated argument. +hardcode_libdir_separator=$hardcode_libdir_separator + +# Set to yes if using DIR/libNAME.so during linking hardcodes DIR into the +# resulting binary. +hardcode_direct=$hardcode_direct + +# Set to yes if using the -LDIR flag during linking hardcodes DIR into the +# resulting binary. +hardcode_minus_L=$hardcode_minus_L + +# Set to yes if using SHLIBPATH_VAR=DIR during linking hardcodes DIR into +# the resulting binary. +hardcode_shlibpath_var=$hardcode_shlibpath_var + +# Compile-time system search path for libraries +sys_lib_search_path_spec=$sys_lib_search_path_spec + +# Run-time system search path for libraries +sys_lib_dlsearch_path_spec=$sys_lib_dlsearch_path_spec + +# Fix the shell variable \$srcfile for the compiler. +fix_srcfile_path="$fix_srcfile_path" + +# Set to yes if exported symbols are required. +always_export_symbols=$always_export_symbols + +# The commands to list exported symbols. +export_symbols_cmds=$export_symbols_cmds + +# Symbols that should not be listed in the preloaded symbols. +exclude_expsyms=$exclude_expsyms + +# Symbols that must always be exported. +include_expsyms=$include_expsyms + +EOF + +case "$ltmain" in +*.sh) + echo '### END LIBTOOL CONFIG' >> "$ofile" + echo >> "$ofile" + case "$host_os" in + aix3*) + cat <<\EOF >> "$ofile" + +# AIX sometimes has problems with the GCC collect2 program. For some +# reason, if we set the COLLECT_NAMES environment variable, the problems +# vanish in a puff of smoke. +if test "${COLLECT_NAMES+set}" != set; then + COLLECT_NAMES= + export COLLECT_NAMES +fi +EOF + ;; + esac + + # Append the ltmain.sh script. + sed '$q' "$ltmain" >> "$ofile" || (rm -f "$ofile"; exit 1) + + chmod +x "$ofile" + ;; + +*) + # Compile the libtool program. + echo "FIXME: would compile $ltmain" + ;; +esac + +test -n "$cache_file" || exit 0 + +# AC_CACHE_SAVE +trap '' 1 2 15 +cat > confcache <<\EOF +# This file is a shell script that caches the results of configure +# tests run on this system so they can be shared between configure +# scripts and configure runs. It is not useful on other systems. +# If it contains results you don't want to keep, you may remove or edit it. +# +# By default, configure uses ./config.cache as the cache file, +# creating it if it does not exist already. You can give configure +# the --cache-file=FILE option to use a different cache file; that is +# what configure does when it calls configure scripts in +# subdirectories, so they share the cache. +# Giving --cache-file=/dev/null disables caching, for debugging configure. +# config.status only pays attention to the cache file if you give it the +# --recheck option to rerun configure. +# +EOF +# The following way of writing the cache mishandles newlines in values, +# but we know of no workaround that is simple, portable, and efficient. +# So, don't put newlines in cache variables' values. +# Ultrix sh set writes to stderr and can't be redirected directly, +# and sets the high bit in the cache file unless we assign to the vars. +(set) 2>&1 | + case `(ac_space=' '; set | grep ac_space) 2>&1` in + *ac_space=\ *) + # `set' does not quote correctly, so add quotes (double-quote substitution + # turns \\\\ into \\, and sed turns \\ into \). + sed -n \ + -e "s/'/'\\\\''/g" \ + -e "s/^\\([a-zA-Z0-9_]*_cv_[a-zA-Z0-9_]*\\)=\\(.*\\)/\\1=\${\\1='\\2'}/p" + ;; + *) + # `set' quotes correctly as required by POSIX, so do not add quotes. + sed -n -e 's/^\([a-zA-Z0-9_]*_cv_[a-zA-Z0-9_]*\)=\(.*\)/\1=${\1=\2}/p' + ;; + esac >> confcache +if cmp -s $cache_file confcache; then + : +else + if test -w $cache_file; then + echo "updating cache $cache_file" + cat confcache > $cache_file + else + echo "not updating unwritable cache $cache_file" + fi +fi +rm -f confcache + +exit 0 + +# Local Variables: +# mode:shell-script +# sh-indentation:2 +# End: diff --git a/xdelta-1.1.3/ltmain.sh b/xdelta-1.1.3/ltmain.sh new file mode 100644 index 0000000..c34de00 --- /dev/null +++ b/xdelta-1.1.3/ltmain.sh @@ -0,0 +1,3975 @@ +# ltmain.sh - Provide generalized library-building support services. +# NOTE: Changing this file will not affect anything until you rerun ltconfig. +# +# Copyright (C) 1996-1999 Free Software Foundation, Inc. +# Originally by Gordon Matzigkeit , 1996 +# +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, but +# WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. +# +# As a special exception to the GNU General Public License, if you +# distribute this file as part of a program that contains a +# configuration script generated by Autoconf, you may include it under +# the same distribution terms that you use for the rest of that program. + +# Check that we have a working $echo. +if test "X$1" = X--no-reexec; then + # Discard the --no-reexec flag, and continue. + shift +elif test "X$1" = X--fallback-echo; then + # Avoid inline document here, it may be left over + : +elif test "X`($echo '\t') 2>/dev/null`" = 'X\t'; then + # Yippee, $echo works! + : +else + # Restart under the correct shell, and then maybe $echo will work. + exec $SHELL "$0" --no-reexec ${1+"$@"} +fi + +if test "X$1" = X--fallback-echo; then + # used as fallback echo + shift + cat <&2 + echo "Fatal configuration error. See the $PACKAGE docs for more information." 1>&2 + exit 1 +fi + +if test "$build_libtool_libs" != yes && test "$build_old_libs" != yes; then + echo "$modename: not configured to build any kind of library" 1>&2 + echo "Fatal configuration error. See the $PACKAGE docs for more information." 1>&2 + exit 1 +fi + +# Global variables. +mode=$default_mode +nonopt= +prev= +prevopt= +run= +show="$echo" +show_help= +execute_dlfiles= +lo2o="s/\\.lo\$/.${objext}/" +o2lo="s/\\.${objext}\$/.lo/" + +# Parse our command line options once, thoroughly. +while test $# -gt 0 +do + arg="$1" + shift + + case "$arg" in + -*=*) optarg=`$echo "X$arg" | $Xsed -e 's/[-_a-zA-Z0-9]*=//'` ;; + *) optarg= ;; + esac + + # If the previous option needs an argument, assign it. + if test -n "$prev"; then + case "$prev" in + execute_dlfiles) + eval "$prev=\"\$$prev \$arg\"" + ;; + *) + eval "$prev=\$arg" + ;; + esac + + prev= + prevopt= + continue + fi + + # Have we seen a non-optional argument yet? + case "$arg" in + --help) + show_help=yes + ;; + + --version) + echo "$PROGRAM (GNU $PACKAGE) $VERSION$TIMESTAMP" + exit 0 + ;; + + --config) + sed -e '1,/^### BEGIN LIBTOOL CONFIG/d' -e '/^### END LIBTOOL CONFIG/,$d' $0 + exit 0 + ;; + + --debug) + echo "$progname: enabling shell trace mode" + set -x + ;; + + --dry-run | -n) + run=: + ;; + + --features) + echo "host: $host" + if test "$build_libtool_libs" = yes; then + echo "enable shared libraries" + else + echo "disable shared libraries" + fi + if test "$build_old_libs" = yes; then + echo "enable static libraries" + else + echo "disable static libraries" + fi + exit 0 + ;; + + --finish) mode="finish" ;; + + --mode) prevopt="--mode" prev=mode ;; + --mode=*) mode="$optarg" ;; + + --quiet | --silent) + show=: + ;; + + -dlopen) + prevopt="-dlopen" + prev=execute_dlfiles + ;; + + -*) + $echo "$modename: unrecognized option \`$arg'" 1>&2 + $echo "$help" 1>&2 + exit 1 + ;; + + *) + nonopt="$arg" + break + ;; + esac +done + +if test -n "$prevopt"; then + $echo "$modename: option \`$prevopt' requires an argument" 1>&2 + $echo "$help" 1>&2 + exit 1 +fi + +if test -z "$show_help"; then + + # Infer the operation mode. + if test -z "$mode"; then + case "$nonopt" in + *cc | *++ | gcc* | *-gcc*) + mode=link + for arg + do + case "$arg" in + -c) + mode=compile + break + ;; + esac + done + ;; + *db | *dbx | *strace | *truss) + mode=execute + ;; + *install*|cp|mv) + mode=install + ;; + *rm) + mode=uninstall + ;; + *) + # If we have no mode, but dlfiles were specified, then do execute mode. + test -n "$execute_dlfiles" && mode=execute + + # Just use the default operation mode. + if test -z "$mode"; then + if test -n "$nonopt"; then + $echo "$modename: warning: cannot infer operation mode from \`$nonopt'" 1>&2 + else + $echo "$modename: warning: cannot infer operation mode without MODE-ARGS" 1>&2 + fi + fi + ;; + esac + fi + + # Only execute mode is allowed to have -dlopen flags. + if test -n "$execute_dlfiles" && test "$mode" != execute; then + $echo "$modename: unrecognized option \`-dlopen'" 1>&2 + $echo "$help" 1>&2 + exit 1 + fi + + # Change the help message to a mode-specific one. + generic_help="$help" + help="Try \`$modename --help --mode=$mode' for more information." + + # These modes are in order of execution frequency so that they run quickly. + case "$mode" in + # libtool compile mode + compile) + modename="$modename: compile" + # Get the compilation command and the source file. + base_compile= + lastarg= + srcfile="$nonopt" + suppress_output= + + user_target=no + for arg + do + # Accept any command-line options. + case "$arg" in + -o) + if test "$user_target" != "no"; then + $echo "$modename: you cannot specify \`-o' more than once" 1>&2 + exit 1 + fi + user_target=next + ;; + + -static) + build_old_libs=yes + continue + ;; + esac + + case "$user_target" in + next) + # The next one is the -o target name + user_target=yes + continue + ;; + yes) + # We got the output file + user_target=set + libobj="$arg" + continue + ;; + esac + + # Accept the current argument as the source file. + lastarg="$srcfile" + srcfile="$arg" + + # Aesthetically quote the previous argument. + + # Backslashify any backslashes, double quotes, and dollar signs. + # These are the only characters that are still specially + # interpreted inside of double-quoted scrings. + lastarg=`$echo "X$lastarg" | $Xsed -e "$sed_quote_subst"` + + # Double-quote args containing other shell metacharacters. + # Many Bourne shells cannot handle close brackets correctly in scan + # sets, so we specify it separately. + case "$lastarg" in + *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \ ]*|*]*) + lastarg="\"$lastarg\"" + ;; + esac + + # Add the previous argument to base_compile. + if test -z "$base_compile"; then + base_compile="$lastarg" + else + base_compile="$base_compile $lastarg" + fi + done + + case "$user_target" in + set) + ;; + no) + # Get the name of the library object. + libobj=`$echo "X$srcfile" | $Xsed -e 's%^.*/%%'` + ;; + *) + $echo "$modename: you must specify a target with \`-o'" 1>&2 + exit 1 + ;; + esac + + # Recognize several different file suffixes. + # If the user specifies -o file.o, it is replaced with file.lo + xform='[cCFSfmso]' + case "$libobj" in + *.ada) xform=ada ;; + *.adb) xform=adb ;; + *.ads) xform=ads ;; + *.asm) xform=asm ;; + *.c++) xform=c++ ;; + *.cc) xform=cc ;; + *.cpp) xform=cpp ;; + *.cxx) xform=cxx ;; + *.f90) xform=f90 ;; + *.for) xform=for ;; + esac + + libobj=`$echo "X$libobj" | $Xsed -e "s/\.$xform$/.lo/"` + + case "$libobj" in + *.lo) obj=`$echo "X$libobj" | $Xsed -e "$lo2o"` ;; + *) + $echo "$modename: cannot determine name of library object from \`$libobj'" 1>&2 + exit 1 + ;; + esac + + if test -z "$base_compile"; then + $echo "$modename: you must specify a compilation command" 1>&2 + $echo "$help" 1>&2 + exit 1 + fi + + # Delete any leftover library objects. + if test "$build_old_libs" = yes; then + removelist="$obj $libobj" + else + removelist="$libobj" + fi + + $run $rm $removelist + trap "$run $rm $removelist; exit 1" 1 2 15 + + # Calculate the filename of the output object if compiler does + # not support -o with -c + if test "$compiler_c_o" = no; then + output_obj=`$echo "X$srcfile" | $Xsed -e 's%^.*/%%' -e 's%\..*$%%'`.${objext} + lockfile="$output_obj.lock" + removelist="$removelist $output_obj $lockfile" + trap "$run $rm $removelist; exit 1" 1 2 15 + else + need_locks=no + lockfile= + fi + + # Lock this critical section if it is needed + # We use this script file to make the link, it avoids creating a new file + if test "$need_locks" = yes; then + until ln "$0" "$lockfile" 2>/dev/null; do + $show "Waiting for $lockfile to be removed" + sleep 2 + done + elif test "$need_locks" = warn; then + if test -f "$lockfile"; then + echo "\ +*** ERROR, $lockfile exists and contains: +`cat $lockfile 2>/dev/null` + +This indicates that another process is trying to use the same +temporary object file, and libtool could not work around it because +your compiler does not support \`-c' and \`-o' together. If you +repeat this compilation, it may succeed, by chance, but you had better +avoid parallel builds (make -j) in this platform, or get a better +compiler." + + $run $rm $removelist + exit 1 + fi + echo $srcfile > "$lockfile" + fi + + if test -n "$fix_srcfile_path"; then + eval srcfile=\"$fix_srcfile_path\" + fi + + # Only build a PIC object if we are building libtool libraries. + if test "$build_libtool_libs" = yes; then + # Without this assignment, base_compile gets emptied. + fbsd_hideous_sh_bug=$base_compile + + # All platforms use -DPIC, to notify preprocessed assembler code. + command="$base_compile $pic_flag -DPIC $srcfile" + if test "$build_old_libs" = yes; then + lo_libobj="$libobj" + dir=`$echo "X$libobj" | $Xsed -e 's%/[^/]*$%%'` + if test "X$dir" = "X$libobj"; then + dir="$objdir" + else + dir="$dir/$objdir" + fi + libobj="$dir/"`$echo "X$libobj" | $Xsed -e 's%^.*/%%'` + + if test -d "$dir"; then + $show "$rm $libobj" + $run $rm $libobj + else + $show "$mkdir $dir" + $run $mkdir $dir + status=$? + if test $status -ne 0 && test ! -d $dir; then + exit $status + fi + fi + fi + if test "$compiler_o_lo" = yes; then + output_obj="$libobj" + command="$command -o $output_obj" + elif test "$compiler_c_o" = yes; then + output_obj="$obj" + command="$command -o $output_obj" + fi + + $run $rm "$output_obj" + $show "$command" + if $run eval "$command"; then : + else + test -n "$output_obj" && $run $rm $removelist + exit 1 + fi + + if test "$need_locks" = warn && + test x"`cat $lockfile 2>/dev/null`" != x"$srcfile"; then + echo "\ +*** ERROR, $lockfile contains: +`cat $lockfile 2>/dev/null` + +but it should contain: +$srcfile + +This indicates that another process is trying to use the same +temporary object file, and libtool could not work around it because +your compiler does not support \`-c' and \`-o' together. If you +repeat this compilation, it may succeed, by chance, but you had better +avoid parallel builds (make -j) in this platform, or get a better +compiler." + + $run $rm $removelist + exit 1 + fi + + # Just move the object if needed, then go on to compile the next one + if test x"$output_obj" != x"$libobj"; then + $show "$mv $output_obj $libobj" + if $run $mv $output_obj $libobj; then : + else + error=$? + $run $rm $removelist + exit $error + fi + fi + + # If we have no pic_flag, then copy the object into place and finish. + if test -z "$pic_flag" && test "$build_old_libs" = yes; then + # Rename the .lo from within objdir to obj + if test -f $obj; then + $show $rm $obj + $run $rm $obj + fi + + $show "$mv $libobj $obj" + if $run $mv $libobj $obj; then : + else + error=$? + $run $rm $removelist + exit $error + fi + + # Now arrange that obj and lo_libobj become the same file + $show "$LN_S $obj $lo_libobj" + if $run $LN_S $obj $lo_libobj; then + exit 0 + else + error=$? + $run $rm $removelist + exit $error + fi + fi + + # Allow error messages only from the first compilation. + suppress_output=' >/dev/null 2>&1' + fi + + # Only build a position-dependent object if we build old libraries. + if test "$build_old_libs" = yes; then + command="$base_compile $srcfile" + if test "$compiler_c_o" = yes; then + command="$command -o $obj" + output_obj="$obj" + fi + + # Suppress compiler output if we already did a PIC compilation. + command="$command$suppress_output" + $run $rm "$output_obj" + $show "$command" + if $run eval "$command"; then : + else + $run $rm $removelist + exit 1 + fi + + if test "$need_locks" = warn && + test x"`cat $lockfile 2>/dev/null`" != x"$srcfile"; then + echo "\ +*** ERROR, $lockfile contains: +`cat $lockfile 2>/dev/null` + +but it should contain: +$srcfile + +This indicates that another process is trying to use the same +temporary object file, and libtool could not work around it because +your compiler does not support \`-c' and \`-o' together. If you +repeat this compilation, it may succeed, by chance, but you had better +avoid parallel builds (make -j) in this platform, or get a better +compiler." + + $run $rm $removelist + exit 1 + fi + + # Just move the object if needed + if test x"$output_obj" != x"$obj"; then + $show "$mv $output_obj $obj" + if $run $mv $output_obj $obj; then : + else + error=$? + $run $rm $removelist + exit $error + fi + fi + + # Create an invalid libtool object if no PIC, so that we do not + # accidentally link it into a program. + if test "$build_libtool_libs" != yes; then + $show "echo timestamp > $libobj" + $run eval "echo timestamp > \$libobj" || exit $? + else + # Move the .lo from within objdir + $show "$mv $libobj $lo_libobj" + if $run $mv $libobj $lo_libobj; then : + else + error=$? + $run $rm $removelist + exit $error + fi + fi + fi + + # Unlock the critical section if it was locked + if test "$need_locks" != no; then + $rm "$lockfile" + fi + + exit 0 + ;; + + # libtool link mode + link) + modename="$modename: link" + C_compiler="$CC" # save it, to compile generated C sources + CC="$nonopt" + case "$host" in + *-*-cygwin* | *-*-mingw* | *-*-os2*) + # It is impossible to link a dll without this setting, and + # we shouldn't force the makefile maintainer to figure out + # which system we are compiling for in order to pass an extra + # flag for every libtool invokation. + # allow_undefined=no + + # FIXME: Unfortunately, there are problems with the above when trying + # to make a dll which has undefined symbols, in which case not + # even a static library is built. For now, we need to specify + # -no-undefined on the libtool link line when we can be certain + # that all symbols are satisfied, otherwise we get a static library. + allow_undefined=yes + + # This is a source program that is used to create dlls on Windows + # Don't remove nor modify the starting and closing comments +# /* ltdll.c starts here */ +# #define WIN32_LEAN_AND_MEAN +# #include +# #undef WIN32_LEAN_AND_MEAN +# #include +# +# #ifndef __CYGWIN__ +# # ifdef __CYGWIN32__ +# # define __CYGWIN__ __CYGWIN32__ +# # endif +# #endif +# +# #ifdef __cplusplus +# extern "C" { +# #endif +# BOOL APIENTRY DllMain (HINSTANCE hInst, DWORD reason, LPVOID reserved); +# #ifdef __cplusplus +# } +# #endif +# +# #ifdef __CYGWIN__ +# #include +# DECLARE_CYGWIN_DLL( DllMain ); +# #endif +# HINSTANCE __hDllInstance_base; +# +# BOOL APIENTRY +# DllMain (HINSTANCE hInst, DWORD reason, LPVOID reserved) +# { +# __hDllInstance_base = hInst; +# return TRUE; +# } +# /* ltdll.c ends here */ + # This is a source program that is used to create import libraries + # on Windows for dlls which lack them. Don't remove nor modify the + # starting and closing comments +# /* impgen.c starts here */ +# /* Copyright (C) 1999 Free Software Foundation, Inc. +# +# This file is part of GNU libtool. +# +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. +# */ +# +# #include /* for printf() */ +# #include /* for open(), lseek(), read() */ +# #include /* for O_RDONLY, O_BINARY */ +# #include /* for strdup() */ +# +# static unsigned int +# pe_get16 (fd, offset) +# int fd; +# int offset; +# { +# unsigned char b[2]; +# lseek (fd, offset, SEEK_SET); +# read (fd, b, 2); +# return b[0] + (b[1]<<8); +# } +# +# static unsigned int +# pe_get32 (fd, offset) +# int fd; +# int offset; +# { +# unsigned char b[4]; +# lseek (fd, offset, SEEK_SET); +# read (fd, b, 4); +# return b[0] + (b[1]<<8) + (b[2]<<16) + (b[3]<<24); +# } +# +# static unsigned int +# pe_as32 (ptr) +# void *ptr; +# { +# unsigned char *b = ptr; +# return b[0] + (b[1]<<8) + (b[2]<<16) + (b[3]<<24); +# } +# +# int +# main (argc, argv) +# int argc; +# char *argv[]; +# { +# int dll; +# unsigned long pe_header_offset, opthdr_ofs, num_entries, i; +# unsigned long export_rva, export_size, nsections, secptr, expptr; +# unsigned long name_rvas, nexp; +# unsigned char *expdata, *erva; +# char *filename, *dll_name; +# +# filename = argv[1]; +# +# dll = open(filename, O_RDONLY|O_BINARY); +# if (!dll) +# return 1; +# +# dll_name = filename; +# +# for (i=0; filename[i]; i++) +# if (filename[i] == '/' || filename[i] == '\\' || filename[i] == ':') +# dll_name = filename + i +1; +# +# pe_header_offset = pe_get32 (dll, 0x3c); +# opthdr_ofs = pe_header_offset + 4 + 20; +# num_entries = pe_get32 (dll, opthdr_ofs + 92); +# +# if (num_entries < 1) /* no exports */ +# return 1; +# +# export_rva = pe_get32 (dll, opthdr_ofs + 96); +# export_size = pe_get32 (dll, opthdr_ofs + 100); +# nsections = pe_get16 (dll, pe_header_offset + 4 +2); +# secptr = (pe_header_offset + 4 + 20 + +# pe_get16 (dll, pe_header_offset + 4 + 16)); +# +# expptr = 0; +# for (i = 0; i < nsections; i++) +# { +# char sname[8]; +# unsigned long secptr1 = secptr + 40 * i; +# unsigned long vaddr = pe_get32 (dll, secptr1 + 12); +# unsigned long vsize = pe_get32 (dll, secptr1 + 16); +# unsigned long fptr = pe_get32 (dll, secptr1 + 20); +# lseek(dll, secptr1, SEEK_SET); +# read(dll, sname, 8); +# if (vaddr <= export_rva && vaddr+vsize > export_rva) +# { +# expptr = fptr + (export_rva - vaddr); +# if (export_rva + export_size > vaddr + vsize) +# export_size = vsize - (export_rva - vaddr); +# break; +# } +# } +# +# expdata = (unsigned char*)malloc(export_size); +# lseek (dll, expptr, SEEK_SET); +# read (dll, expdata, export_size); +# erva = expdata - export_rva; +# +# nexp = pe_as32 (expdata+24); +# name_rvas = pe_as32 (expdata+32); +# +# printf ("EXPORTS\n"); +# for (i = 0; i&2 + fi + if test -n "$link_static_flag"; then + dlopen_self=$dlopen_self_static + fi + else + if test -z "$pic_flag" && test -n "$link_static_flag"; then + dlopen_self=$dlopen_self_static + fi + fi + build_libtool_libs=no + build_old_libs=yes + prefer_static_libs=yes + break + ;; + esac + done + + # See if our shared archives depend on static archives. + test -n "$old_archive_from_new_cmds" && build_old_libs=yes + + # Go through the arguments, transforming them on the way. + while test $# -gt 0; do + arg="$1" + shift + + # If the previous option needs an argument, assign it. + if test -n "$prev"; then + case "$prev" in + output) + compile_command="$compile_command @OUTPUT@" + finalize_command="$finalize_command @OUTPUT@" + ;; + esac + + case "$prev" in + dlfiles|dlprefiles) + if test "$preload" = no; then + # Add the symbol object into the linking commands. + compile_command="$compile_command @SYMFILE@" + finalize_command="$finalize_command @SYMFILE@" + preload=yes + fi + case "$arg" in + *.la | *.lo) ;; # We handle these cases below. + force) + if test "$dlself" = no; then + dlself=needless + export_dynamic=yes + fi + prev= + continue + ;; + self) + if test "$prev" = dlprefiles; then + dlself=yes + elif test "$prev" = dlfiles && test "$dlopen_self" != yes; then + dlself=yes + else + dlself=needless + export_dynamic=yes + fi + prev= + continue + ;; + *) + if test "$prev" = dlfiles; then + dlfiles="$dlfiles $arg" + else + dlprefiles="$dlprefiles $arg" + fi + prev= + ;; + esac + ;; + expsyms) + export_symbols="$arg" + if test ! -f "$arg"; then + $echo "$modename: symbol file \`$arg' does not exist" + exit 1 + fi + prev= + continue + ;; + expsyms_regex) + export_symbols_regex="$arg" + prev= + continue + ;; + release) + release="-$arg" + prev= + continue + ;; + rpath | xrpath) + # We need an absolute path. + case "$arg" in + [\\/]* | [A-Za-z]:[\\/]*) ;; + *) + $echo "$modename: only absolute run-paths are allowed" 1>&2 + exit 1 + ;; + esac + if test "$prev" = rpath; then + case "$rpath " in + *" $arg "*) ;; + *) rpath="$rpath $arg" ;; + esac + else + case "$xrpath " in + *" $arg "*) ;; + *) xrpath="$xrpath $arg" ;; + esac + fi + prev= + continue + ;; + *) + eval "$prev=\"\$arg\"" + prev= + continue + ;; + esac + fi + + prevarg="$arg" + + case "$arg" in + -all-static) + if test -n "$link_static_flag"; then + compile_command="$compile_command $link_static_flag" + finalize_command="$finalize_command $link_static_flag" + fi + continue + ;; + + -allow-undefined) + # FIXME: remove this flag sometime in the future. + $echo "$modename: \`-allow-undefined' is deprecated because it is the default" 1>&2 + continue + ;; + + -avoid-version) + avoid_version=yes + continue + ;; + + -dlopen) + prev=dlfiles + continue + ;; + + -dlpreopen) + prev=dlprefiles + continue + ;; + + -export-dynamic) + export_dynamic=yes + continue + ;; + + -export-symbols | -export-symbols-regex) + if test -n "$export_symbols" || test -n "$export_symbols_regex"; then + $echo "$modename: not more than one -exported-symbols argument allowed" + exit 1 + fi + if test "X$arg" = "X-export-symbols"; then + prev=expsyms + else + prev=expsyms_regex + fi + continue + ;; + + -L*) + dir=`$echo "X$arg" | $Xsed -e 's/^-L//'` + # We need an absolute path. + case "$dir" in + [\\/]* | [A-Za-z]:[\\/]*) ;; + *) + absdir=`cd "$dir" && pwd` + if test -z "$absdir"; then + $echo "$modename: warning: cannot determine absolute directory name of \`$dir'" 1>&2 + $echo "$modename: passing it literally to the linker, although it might fail" 1>&2 + absdir="$dir" + fi + dir="$absdir" + ;; + esac + case " $deplibs " in + *" $arg "*) ;; + *) deplibs="$deplibs $arg";; + esac + case " $lib_search_path " in + *" $dir "*) ;; + *) lib_search_path="$lib_search_path $dir";; + esac + case "$host" in + *-*-cygwin* | *-*-mingw* | *-*-os2*) + dllsearchdir=`cd "$dir" && pwd || echo "$dir"` + case ":$dllsearchpath:" in + ::) dllsearchpath="$dllsearchdir";; + *":$dllsearchdir:"*) ;; + *) dllsearchpath="$dllsearchpath:$dllsearchdir";; + esac + ;; + esac + ;; + + -l*) + if test "$arg" = "-lc"; then + case "$host" in + *-*-cygwin* | *-*-mingw* | *-*-os2* | *-*-beos*) + # These systems don't actually have c library (as such) + continue + ;; + esac + elif test "$arg" = "-lm"; then + case "$host" in + *-*-cygwin* | *-*-beos*) + # These systems don't actually have math library (as such) + continue + ;; + esac + fi + deplibs="$deplibs $arg" + ;; + + -module) + module=yes + continue + ;; + + -no-undefined) + allow_undefined=no + continue + ;; + + -o) prev=output ;; + + -release) + prev=release + continue + ;; + + -rpath) + prev=rpath + continue + ;; + + -R) + prev=xrpath + continue + ;; + + -R*) + dir=`$echo "X$arg" | $Xsed -e 's/^-R//'` + # We need an absolute path. + case "$dir" in + [\\/]* | [A-Za-z]:[\\/]*) ;; + *) + $echo "$modename: only absolute run-paths are allowed" 1>&2 + exit 1 + ;; + esac + case "$xrpath " in + *" $dir "*) ;; + *) xrpath="$xrpath $dir" ;; + esac + continue + ;; + + -static) + # If we have no pic_flag, then this is the same as -all-static. + if test -z "$pic_flag" && test -n "$link_static_flag"; then + compile_command="$compile_command $link_static_flag" + finalize_command="$finalize_command $link_static_flag" + fi + continue + ;; + + -thread-safe) + thread_safe=yes + continue + ;; + + -version-info) + prev=vinfo + continue + ;; + + # Some other compiler flag. + -* | +*) + # Unknown arguments in both finalize_command and compile_command need + # to be aesthetically quoted because they are evaled later. + arg=`$echo "X$arg" | $Xsed -e "$sed_quote_subst"` + case "$arg" in + *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \ ]*|*]*) + arg="\"$arg\"" + ;; + esac + ;; + + *.o | *.obj | *.a | *.lib) + # A standard object. + objs="$objs $arg" + ;; + + *.lo) + # A library object. + if test "$prev" = dlfiles; then + dlfiles="$dlfiles $arg" + if test "$build_libtool_libs" = yes && test "$dlopen" = yes; then + prev= + continue + else + # If libtool objects are unsupported, then we need to preload. + prev=dlprefiles + fi + fi + + if test "$prev" = dlprefiles; then + # Preload the old-style object. + dlprefiles="$dlprefiles "`$echo "X$arg" | $Xsed -e "$lo2o"` + prev= + fi + libobjs="$libobjs $arg" + ;; + + *.la) + # A libtool-controlled library. + + dlname= + libdir= + library_names= + old_library= + + # Check to see that this really is a libtool archive. + if (sed -e '2q' $arg | egrep "^# Generated by .*$PACKAGE") >/dev/null 2>&1; then : + else + $echo "$modename: \`$arg' is not a valid libtool archive" 1>&2 + exit 1 + fi + + # If the library was installed with an old release of libtool, + # it will not redefine variable installed. + installed=yes + + # Read the .la file + # If there is no directory component, then add one. + case "$arg" in + */* | *\\*) . $arg ;; + *) . ./$arg ;; + esac + + # Get the name of the library we link against. + linklib= + for l in $old_library $library_names; do + linklib="$l" + done + + if test -z "$linklib"; then + $echo "$modename: cannot find name of link library for \`$arg'" 1>&2 + exit 1 + fi + + # Find the relevant object directory and library name. + name=`$echo "X$arg" | $Xsed -e 's%^.*/%%' -e 's/\.la$//' -e 's/^lib//'` + + if test "X$installed" = Xyes; then + dir="$libdir" + else + dir=`$echo "X$arg" | $Xsed -e 's%/[^/]*$%%'` + if test "X$dir" = "X$arg"; then + dir="$objdir" + else + dir="$dir/$objdir" + fi + fi + + if test -n "$dependency_libs"; then + # Extract -R and -L from dependency_libs + temp_deplibs= + for deplib in $dependency_libs; do + case "$deplib" in + -R*) temp_xrpath=`$echo "X$deplib" | $Xsed -e 's/^-R//'` + case " $rpath $xrpath " in + *" $temp_xrpath "*) ;; + *) xrpath="$xrpath $temp_xrpath";; + esac;; + -L*) case "$compile_command $temp_deplibs " in + *" $deplib "*) ;; + *) temp_deplibs="$temp_deplibs $deplib";; + esac + temp_dir=`$echo "X$deplib" | $Xsed -e 's/^-L//'` + case " $lib_search_path " in + *" $temp_dir "*) ;; + *) lib_search_path="$lib_search_path $temp_dir";; + esac + ;; + *) temp_deplibs="$temp_deplibs $deplib";; + esac + done + dependency_libs="$temp_deplibs" + fi + + if test -z "$libdir"; then + # It is a libtool convenience library, so add in its objects. + convenience="$convenience $dir/$old_library" + old_convenience="$old_convenience $dir/$old_library" + deplibs="$deplibs$dependency_libs" + compile_command="$compile_command $dir/$old_library$dependency_libs" + finalize_command="$finalize_command $dir/$old_library$dependency_libs" + continue + fi + + # This library was specified with -dlopen. + if test "$prev" = dlfiles; then + dlfiles="$dlfiles $arg" + if test -z "$dlname" || test "$dlopen" != yes || test "$build_libtool_libs" = no; then + # If there is no dlname, no dlopen support or we're linking statically, + # we need to preload. + prev=dlprefiles + else + # We should not create a dependency on this library, but we + # may need any libraries it requires. + compile_command="$compile_command$dependency_libs" + finalize_command="$finalize_command$dependency_libs" + prev= + continue + fi + fi + + # The library was specified with -dlpreopen. + if test "$prev" = dlprefiles; then + # Prefer using a static library (so that no silly _DYNAMIC symbols + # are required to link). + if test -n "$old_library"; then + dlprefiles="$dlprefiles $dir/$old_library" + else + dlprefiles="$dlprefiles $dir/$linklib" + fi + prev= + fi + + if test -n "$library_names" && + { test "$prefer_static_libs" = no || test -z "$old_library"; }; then + link_against_libtool_libs="$link_against_libtool_libs $arg" + if test -n "$shlibpath_var"; then + # Make sure the rpath contains only unique directories. + case "$temp_rpath " in + *" $dir "*) ;; + *) temp_rpath="$temp_rpath $dir" ;; + esac + fi + + # We need an absolute path. + case "$dir" in + [\\/] | [A-Za-z]:[\\/]*) absdir="$dir" ;; + *) + absdir=`cd "$dir" && pwd` + if test -z "$absdir"; then + $echo "$modename: warning: cannot determine absolute directory name of \`$dir'" 1>&2 + $echo "$modename: passing it literally to the linker, although it might fail" 1>&2 + absdir="$dir" + fi + ;; + esac + + # This is the magic to use -rpath. + # Skip directories that are in the system default run-time + # search path, unless they have been requested with -R. + case " $sys_lib_dlsearch_path " in + *" $absdir "*) ;; + *) + case "$compile_rpath " in + *" $absdir "*) ;; + *) compile_rpath="$compile_rpath $absdir" + esac + ;; + esac + + case " $sys_lib_dlsearch_path " in + *" $libdir "*) ;; + *) + case "$finalize_rpath " in + *" $libdir "*) ;; + *) finalize_rpath="$finalize_rpath $libdir" + esac + ;; + esac + + lib_linked=yes + case "$hardcode_action" in + immediate | unsupported) + if test "$hardcode_direct" = no; then + compile_command="$compile_command $dir/$linklib" + deplibs="$deplibs $dir/$linklib" + case "$host" in + *-*-cygwin* | *-*-mingw* | *-*-os2*) + dllsearchdir=`cd "$dir" && pwd || echo "$dir"` + if test -n "$dllsearchpath"; then + dllsearchpath="$dllsearchpath:$dllsearchdir" + else + dllsearchpath="$dllsearchdir" + fi + ;; + esac + elif test "$hardcode_minus_L" = no; then + case "$host" in + *-*-sunos*) + compile_shlibpath="$compile_shlibpath$dir:" + ;; + esac + case "$compile_command " in + *" -L$dir "*) ;; + *) compile_command="$compile_command -L$dir";; + esac + compile_command="$compile_command -l$name" + deplibs="$deplibs -L$dir -l$name" + elif test "$hardcode_shlibpath_var" = no; then + case ":$compile_shlibpath:" in + *":$dir:"*) ;; + *) compile_shlibpath="$compile_shlibpath$dir:";; + esac + compile_command="$compile_command -l$name" + deplibs="$deplibs -l$name" + else + lib_linked=no + fi + ;; + + relink) + if test "$hardcode_direct" = yes; then + compile_command="$compile_command $absdir/$linklib" + deplibs="$deplibs $absdir/$linklib" + elif test "$hardcode_minus_L" = yes; then + case "$compile_command " in + *" -L$absdir "*) ;; + *) compile_command="$compile_command -L$absdir";; + esac + compile_command="$compile_command -l$name" + deplibs="$deplibs -L$absdir -l$name" + elif test "$hardcode_shlibpath_var" = yes; then + case ":$compile_shlibpath:" in + *":$absdir:"*) ;; + *) compile_shlibpath="$compile_shlibpath$absdir:";; + esac + compile_command="$compile_command -l$name" + deplibs="$deplibs -l$name" + else + lib_linked=no + fi + ;; + + *) + lib_linked=no + ;; + esac + + if test "$lib_linked" != yes; then + $echo "$modename: configuration error: unsupported hardcode properties" + exit 1 + fi + + # Finalize command for both is simple: just hardcode it. + if test "$hardcode_direct" = yes; then + finalize_command="$finalize_command $libdir/$linklib" + elif test "$hardcode_minus_L" = yes; then + case "$finalize_command " in + *" -L$libdir "*) ;; + *) finalize_command="$finalize_command -L$libdir";; + esac + finalize_command="$finalize_command -l$name" + elif test "$hardcode_shlibpath_var" = yes; then + case ":$finalize_shlibpath:" in + *":$libdir:"*) ;; + *) finalize_shlibpath="$finalize_shlibpath$libdir:";; + esac + finalize_command="$finalize_command -l$name" + else + # We cannot seem to hardcode it, guess we'll fake it. + case "$finalize_command " in + *" -L$dir "*) ;; + *) finalize_command="$finalize_command -L$libdir";; + esac + finalize_command="$finalize_command -l$name" + fi + else + # Transform directly to old archives if we don't build new libraries. + if test -n "$pic_flag" && test -z "$old_library"; then + $echo "$modename: cannot find static library for \`$arg'" 1>&2 + exit 1 + fi + + # Here we assume that one of hardcode_direct or hardcode_minus_L + # is not unsupported. This is valid on all known static and + # shared platforms. + if test "$hardcode_direct" != unsupported; then + test -n "$old_library" && linklib="$old_library" + compile_command="$compile_command $dir/$linklib" + finalize_command="$finalize_command $dir/$linklib" + else + case "$compile_command " in + *" -L$dir "*) ;; + *) compile_command="$compile_command -L$dir";; + esac + compile_command="$compile_command -l$name" + case "$finalize_command " in + *" -L$dir "*) ;; + *) finalize_command="$finalize_command -L$dir";; + esac + finalize_command="$finalize_command -l$name" + fi + fi + + # Add in any libraries that this one depends upon. + compile_command="$compile_command$dependency_libs" + finalize_command="$finalize_command$dependency_libs" + continue + ;; + + # Some other compiler argument. + *) + # Unknown arguments in both finalize_command and compile_command need + # to be aesthetically quoted because they are evaled later. + arg=`$echo "X$arg" | $Xsed -e "$sed_quote_subst"` + case "$arg" in + *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \ ]*|*]*) + arg="\"$arg\"" + ;; + esac + ;; + esac + + # Now actually substitute the argument into the commands. + if test -n "$arg"; then + compile_command="$compile_command $arg" + finalize_command="$finalize_command $arg" + fi + done + + if test -n "$prev"; then + $echo "$modename: the \`$prevarg' option requires an argument" 1>&2 + $echo "$help" 1>&2 + exit 1 + fi + + if test "$export_dynamic" = yes && test -n "$export_dynamic_flag_spec"; then + eval arg=\"$export_dynamic_flag_spec\" + compile_command="$compile_command $arg" + finalize_command="$finalize_command $arg" + fi + + oldlibs= + # calculate the name of the file, without its directory + outputname=`$echo "X$output" | $Xsed -e 's%^.*/%%'` + libobjs_save="$libobjs" + + case "$output" in + "") + $echo "$modename: you must specify an output file" 1>&2 + $echo "$help" 1>&2 + exit 1 + ;; + + *.a | *.lib) + if test -n "$link_against_libtool_libs"; then + $echo "$modename: error: cannot link libtool libraries into archives" 1>&2 + exit 1 + fi + + if test -n "$deplibs"; then + $echo "$modename: warning: \`-l' and \`-L' are ignored for archives" 1>&2 + fi + + if test -n "$dlfiles$dlprefiles" || test "$dlself" != no; then + $echo "$modename: warning: \`-dlopen' is ignored for archives" 1>&2 + fi + + if test -n "$rpath"; then + $echo "$modename: warning: \`-rpath' is ignored for archives" 1>&2 + fi + + if test -n "$xrpath"; then + $echo "$modename: warning: \`-R' is ignored for archives" 1>&2 + fi + + if test -n "$vinfo"; then + $echo "$modename: warning: \`-version-info' is ignored for archives" 1>&2 + fi + + if test -n "$release"; then + $echo "$modename: warning: \`-release' is ignored for archives" 1>&2 + fi + + if test -n "$export_symbols" || test -n "$export_symbols_regex"; then + $echo "$modename: warning: \`-export-symbols' is ignored for archives" 1>&2 + fi + + # Now set the variables for building old libraries. + build_libtool_libs=no + oldlibs="$output" + ;; + + *.la) + # Make sure we only generate libraries of the form `libNAME.la'. + case "$outputname" in + lib*) + name=`$echo "X$outputname" | $Xsed -e 's/\.la$//' -e 's/^lib//'` + eval libname=\"$libname_spec\" + ;; + *) + if test "$module" = no; then + $echo "$modename: libtool library \`$output' must begin with \`lib'" 1>&2 + $echo "$help" 1>&2 + exit 1 + fi + if test "$need_lib_prefix" != no; then + # Add the "lib" prefix for modules if required + name=`$echo "X$outputname" | $Xsed -e 's/\.la$//'` + eval libname=\"$libname_spec\" + else + libname=`$echo "X$outputname" | $Xsed -e 's/\.la$//'` + fi + ;; + esac + + output_objdir=`$echo "X$output" | $Xsed -e 's%/[^/]*$%%'` + if test "X$output_objdir" = "X$output"; then + output_objdir="$objdir" + else + output_objdir="$output_objdir/$objdir" + fi + + if test -n "$objs"; then + $echo "$modename: cannot build libtool library \`$output' from non-libtool objects:$objs" 2>&1 + exit 1 + fi + + # How the heck are we supposed to write a wrapper for a shared library? + if test -n "$link_against_libtool_libs"; then + $echo "$modename: error: cannot link shared libraries into libtool libraries" 1>&2 + exit 1 + fi + + if test -n "$dlfiles$dlprefiles" || test "$dlself" != no; then + $echo "$modename: warning: \`-dlopen' is ignored for libtool libraries" 1>&2 + fi + + set dummy $rpath + if test $# -gt 2; then + $echo "$modename: warning: ignoring multiple \`-rpath's for a libtool library" 1>&2 + fi + install_libdir="$2" + + oldlibs= + if test -z "$rpath"; then + if test "$build_libtool_libs" = yes; then + # Building a libtool convenience library. + libext=al + oldlibs="$output_objdir/$libname.$libext $oldlibs" + build_libtool_libs=convenience + build_old_libs=yes + fi + dependency_libs="$deplibs" + + if test -n "$vinfo"; then + $echo "$modename: warning: \`-version-info' is ignored for convenience libraries" 1>&2 + fi + + if test -n "$release"; then + $echo "$modename: warning: \`-release' is ignored for convenience libraries" 1>&2 + fi + else + + # Parse the version information argument. + IFS="${IFS= }"; save_ifs="$IFS"; IFS=':' + set dummy $vinfo 0 0 0 + IFS="$save_ifs" + + if test -n "$8"; then + $echo "$modename: too many parameters to \`-version-info'" 1>&2 + $echo "$help" 1>&2 + exit 1 + fi + + current="$2" + revision="$3" + age="$4" + + # Check that each of the things are valid numbers. + case "$current" in + 0 | [1-9] | [1-9][0-9]*) ;; + *) + $echo "$modename: CURRENT \`$current' is not a nonnegative integer" 1>&2 + $echo "$modename: \`$vinfo' is not valid version information" 1>&2 + exit 1 + ;; + esac + + case "$revision" in + 0 | [1-9] | [1-9][0-9]*) ;; + *) + $echo "$modename: REVISION \`$revision' is not a nonnegative integer" 1>&2 + $echo "$modename: \`$vinfo' is not valid version information" 1>&2 + exit 1 + ;; + esac + + case "$age" in + 0 | [1-9] | [1-9][0-9]*) ;; + *) + $echo "$modename: AGE \`$age' is not a nonnegative integer" 1>&2 + $echo "$modename: \`$vinfo' is not valid version information" 1>&2 + exit 1 + ;; + esac + + if test $age -gt $current; then + $echo "$modename: AGE \`$age' is greater than the current interface number \`$current'" 1>&2 + $echo "$modename: \`$vinfo' is not valid version information" 1>&2 + exit 1 + fi + + # Calculate the version variables. + major= + versuffix= + verstring= + case "$version_type" in + none) ;; + + irix) + major=`expr $current - $age + 1` + versuffix="$major.$revision" + verstring="sgi$major.$revision" + + # Add in all the interfaces that we are compatible with. + loop=$revision + while test $loop != 0; do + iface=`expr $revision - $loop` + loop=`expr $loop - 1` + verstring="sgi$major.$iface:$verstring" + done + ;; + + linux) + major=.`expr $current - $age` + versuffix="$major.$age.$revision" + ;; + + osf) + major=`expr $current - $age` + versuffix=".$current.$age.$revision" + verstring="$current.$age.$revision" + + # Add in all the interfaces that we are compatible with. + loop=$age + while test $loop != 0; do + iface=`expr $current - $loop` + loop=`expr $loop - 1` + verstring="$verstring:${iface}.0" + done + + # Make executables depend on our current version. + verstring="$verstring:${current}.0" + ;; + + sunos) + major=".$current" + versuffix=".$current.$revision" + ;; + + freebsd-aout) + major=".$current" + versuffix=".$current.$revision"; + ;; + + freebsd-elf) + major=".$current" + versuffix=".$current"; + ;; + + windows) + # Like Linux, but with '-' rather than '.', since we only + # want one extension on Windows 95. + major=`expr $current - $age` + versuffix="-$major-$age-$revision" + ;; + + *) + $echo "$modename: unknown library version type \`$version_type'" 1>&2 + echo "Fatal configuration error. See the $PACKAGE docs for more information." 1>&2 + exit 1 + ;; + esac + + # Clear the version info if we defaulted, and they specified a release. + if test -z "$vinfo" && test -n "$release"; then + major= + verstring="0.0" + if test "$need_version" = no; then + versuffix= + else + versuffix=".0.0" + fi + fi + + # Remove version info from name if versioning should be avoided + if test "$avoid_version" = yes && test "$need_version" = no; then + major= + versuffix= + verstring="" + fi + + # Check to see if the archive will have undefined symbols. + if test "$allow_undefined" = yes; then + if test "$allow_undefined_flag" = unsupported; then + $echo "$modename: warning: undefined symbols not allowed in $host shared libraries" 1>&2 + build_libtool_libs=no + build_old_libs=yes + fi + else + # Don't allow undefined symbols. + allow_undefined_flag="$no_undefined_flag" + fi + + dependency_libs="$deplibs" + case "$host" in + *-*-cygwin* | *-*-mingw* | *-*-os2* | *-*-beos*) + # these systems don't actually have a c library (as such)! + ;; + *) + # Add libc to deplibs on all other systems. + deplibs="$deplibs -lc" + ;; + esac + fi + + # Create the output directory, or remove our outputs if we need to. + if test -d $output_objdir; then + $show "${rm}r $output_objdir/$outputname $output_objdir/$libname.* $output_objdir/${libname}${release}.*" + $run ${rm}r $output_objdir/$outputname $output_objdir/$libname.* $output_objdir/${libname}${release}.* + else + $show "$mkdir $output_objdir" + $run $mkdir $output_objdir + status=$? + if test $status -ne 0 && test ! -d $output_objdir; then + exit $status + fi + fi + + # Now set the variables for building old libraries. + if test "$build_old_libs" = yes && test "$build_libtool_libs" != convenience ; then + oldlibs="$oldlibs $output_objdir/$libname.$libext" + + # Transform .lo files to .o files. + oldobjs="$objs "`$echo "X$libobjs" | $SP2NL | $Xsed -e '/\.'${libext}'$/d' -e "$lo2o" | $NL2SP` + fi + + if test "$build_libtool_libs" = yes; then + # Transform deplibs into only deplibs that can be linked in shared. + name_save=$name + libname_save=$libname + release_save=$release + versuffix_save=$versuffix + major_save=$major + # I'm not sure if I'm treating the release correctly. I think + # release should show up in the -l (ie -lgmp5) so we don't want to + # add it in twice. Is that correct? + release="" + versuffix="" + major="" + newdeplibs= + droppeddeps=no + case "$deplibs_check_method" in + pass_all) + # Don't check for shared/static. Everything works. + # This might be a little naive. We might want to check + # whether the library exists or not. But this is on + # osf3 & osf4 and I'm not really sure... Just + # implementing what was already the behaviour. + newdeplibs=$deplibs + ;; + test_compile) + # This code stresses the "libraries are programs" paradigm to its + # limits. Maybe even breaks it. We compile a program, linking it + # against the deplibs as a proxy for the library. Then we can check + # whether they linked in statically or dynamically with ldd. + $rm conftest.c + cat > conftest.c </dev/null` + for potent_lib in $potential_libs; do + # Follow soft links. + if ls -lLd "$potent_lib" 2>/dev/null \ + | grep " -> " >/dev/null; then + continue + fi + # The statement above tries to avoid entering an + # endless loop below, in case of cyclic links. + # We might still enter an endless loop, since a link + # loop can be closed while we follow links, + # but so what? + potlib="$potent_lib" + while test -h "$potlib" 2>/dev/null; do + potliblink=`ls -ld $potlib | sed 's/.* -> //'` + case "$potliblink" in + [\\/]* | [A-Za-z]:[\\/]*) potlib="$potliblink";; + *) potlib=`$echo "X$potlib" | $Xsed -e 's,[^/]*$,,'`"$potliblink";; + esac + done + if eval $file_magic_cmd \"\$potlib\" 2>/dev/null \ + | sed 10q \ + | egrep "$file_magic_regex" > /dev/null; then + newdeplibs="$newdeplibs $a_deplib" + a_deplib="" + break 2 + fi + done + done + if test -n "$a_deplib" ; then + droppeddeps=yes + echo + echo "*** Warning: This library needs some functionality provided by $a_deplib." + echo "*** I have the capability to make that library automatically link in when" + echo "*** you link to this library. But I can only do this if you have a" + echo "*** shared version of the library, which you do not appear to have." + fi + else + # Add a -L argument. + newdeplibs="$newdeplibs $a_deplib" + fi + done # Gone through all deplibs. + ;; + none | unknown | *) + newdeplibs="" + if $echo "X $deplibs" | $Xsed -e 's/ -lc$//' \ + -e 's/ -[LR][^ ]*//g' -e 's/[ ]//g' | + grep . >/dev/null; then + echo + if test "X$deplibs_check_method" = "Xnone"; then + echo "*** Warning: inter-library dependencies are not supported in this platform." + else + echo "*** Warning: inter-library dependencies are not known to be supported." + fi + echo "*** All declared inter-library dependencies are being dropped." + droppeddeps=yes + fi + ;; + esac + versuffix=$versuffix_save + major=$major_save + release=$release_save + libname=$libname_save + name=$name_save + + if test "$droppeddeps" = yes; then + if test "$module" = yes; then + echo + echo "*** Warning: libtool could not satisfy all declared inter-library" + echo "*** dependencies of module $libname. Therefore, libtool will create" + echo "*** a static module, that should work as long as the dlopening" + echo "*** application is linked with the -dlopen flag." + if test -z "$global_symbol_pipe"; then + echo + echo "*** However, this would only work if libtool was able to extract symbol" + echo "*** lists from a program, using \`nm' or equivalent, but libtool could" + echo "*** not find such a program. So, this module is probably useless." + echo "*** \`nm' from GNU binutils and a full rebuild may help." + fi + if test "$build_old_libs" = no; then + oldlibs="$output_objdir/$libname.$libext" + build_libtool_libs=module + build_old_libs=yes + else + build_libtool_libs=no + fi + else + echo "*** The inter-library dependencies that have been dropped here will be" + echo "*** automatically added whenever a program is linked with this library" + echo "*** or is declared to -dlopen it." + fi + fi + # Done checking deplibs! + deplibs=$newdeplibs + fi + + # All the library-specific variables (install_libdir is set above). + library_names= + old_library= + dlname= + + # Test again, we may have decided not to build it any more + if test "$build_libtool_libs" = yes; then + # Get the real and link names of the library. + eval library_names=\"$library_names_spec\" + set dummy $library_names + realname="$2" + shift; shift + + if test -n "$soname_spec"; then + eval soname=\"$soname_spec\" + else + soname="$realname" + fi + + lib="$output_objdir/$realname" + for link + do + linknames="$linknames $link" + done + + # Ensure that we have .o objects for linkers which dislike .lo + # (e.g. aix) incase we are running --disable-static + for obj in $libobjs; do + oldobj=`$echo "X$obj" | $Xsed -e "$lo2o"` + if test ! -f $oldobj; then + $show "${LN_S} $obj $oldobj" + $run ${LN_S} $obj $oldobj || exit $? + fi + done + + # Use standard objects if they are pic + test -z "$pic_flag" && libobjs=`$echo "X$libobjs" | $SP2NL | $Xsed -e "$lo2o" | $NL2SP` + + # Prepare the list of exported symbols + if test -z "$export_symbols"; then + if test "$always_export_symbols" = yes || test -n "$export_symbols_regex"; then + $show "generating symbol list for \`$libname.la'" + export_symbols="$output_objdir/$libname.exp" + $run $rm $export_symbols + eval cmds=\"$export_symbols_cmds\" + IFS="${IFS= }"; save_ifs="$IFS"; IFS='~' + for cmd in $cmds; do + IFS="$save_ifs" + $show "$cmd" + $run eval "$cmd" || exit $? + done + IFS="$save_ifs" + if test -n "$export_symbols_regex"; then + $show "egrep -e \"$export_symbols_regex\" \"$export_symbols\" > \"${export_symbols}T\"" + $run eval 'egrep -e "$export_symbols_regex" "$export_symbols" > "${export_symbols}T"' + $show "$mv \"${export_symbols}T\" \"$export_symbols\"" + $run eval '$mv "${export_symbols}T" "$export_symbols"' + fi + fi + fi + + if test -n "$export_symbols" && test -n "$include_expsyms"; then + $run eval '$echo "X$include_expsyms" | $SP2NL >> "$export_symbols"' + fi + + if test -n "$convenience"; then + if test -n "$whole_archive_flag_spec"; then + eval libobjs=\"\$libobjs $whole_archive_flag_spec\" + else + gentop="$output_objdir/${outputname}x" + $show "${rm}r $gentop" + $run ${rm}r "$gentop" + $show "mkdir $gentop" + $run mkdir "$gentop" + status=$? + if test $status -ne 0 && test ! -d "$gentop"; then + exit $status + fi + generated="$generated $gentop" + + for xlib in $convenience; do + # Extract the objects. + case "$xlib" in + [\\/]* | [A-Za-z]:[\\/]*) xabs="$xlib" ;; + *) xabs=`pwd`"/$xlib" ;; + esac + xlib=`$echo "X$xlib" | $Xsed -e 's%^.*/%%'` + xdir="$gentop/$xlib" + + $show "${rm}r $xdir" + $run ${rm}r "$xdir" + $show "mkdir $xdir" + $run mkdir "$xdir" + status=$? + if test $status -ne 0 && test ! -d "$xdir"; then + exit $status + fi + $show "(cd $xdir && $AR x $xabs)" + $run eval "(cd \$xdir && $AR x \$xabs)" || exit $? + + libobjs="$libobjs "`find $xdir -name \*.o -print -o -name \*.lo -print | $NL2SP` + done + fi + fi + + if test "$thread_safe" = yes && test -n "$thread_safe_flag_spec"; then + eval flag=\"$thread_safe_flag_spec\" + linkopts="$linkopts $flag" + fi + + # Do each of the archive commands. + if test -n "$export_symbols" && test -n "$archive_expsym_cmds"; then + eval cmds=\"$archive_expsym_cmds\" + else + eval cmds=\"$archive_cmds\" + fi + IFS="${IFS= }"; save_ifs="$IFS"; IFS='~' + for cmd in $cmds; do + IFS="$save_ifs" + $show "$cmd" + $run eval "$cmd" || exit $? + done + IFS="$save_ifs" + + # Create links to the real library. + for linkname in $linknames; do + if test "$realname" != "$linkname"; then + $show "(cd $output_objdir && $rm $linkname && $LN_S $realname $linkname)" + $run eval '(cd $output_objdir && $rm $linkname && $LN_S $realname $linkname)' || exit $? + fi + done + + # If -module or -export-dynamic was specified, set the dlname. + if test "$module" = yes || test "$export_dynamic" = yes; then + # On all known operating systems, these are identical. + dlname="$soname" + fi + fi + ;; + + *.lo | *.o | *.obj) + if test -n "$link_against_libtool_libs"; then + $echo "$modename: error: cannot link libtool libraries into objects" 1>&2 + exit 1 + fi + + if test -n "$deplibs"; then + $echo "$modename: warning: \`-l' and \`-L' are ignored for objects" 1>&2 + fi + + if test -n "$dlfiles$dlprefiles" || test "$dlself" != no; then + $echo "$modename: warning: \`-dlopen' is ignored for objects" 1>&2 + fi + + if test -n "$rpath"; then + $echo "$modename: warning: \`-rpath' is ignored for objects" 1>&2 + fi + + if test -n "$xrpath"; then + $echo "$modename: warning: \`-R' is ignored for objects" 1>&2 + fi + + if test -n "$vinfo"; then + $echo "$modename: warning: \`-version-info' is ignored for objects" 1>&2 + fi + + if test -n "$release"; then + $echo "$modename: warning: \`-release' is ignored for objects" 1>&2 + fi + + case "$output" in + *.lo) + if test -n "$objs"; then + $echo "$modename: cannot build library object \`$output' from non-libtool objects" 1>&2 + exit 1 + fi + libobj="$output" + obj=`$echo "X$output" | $Xsed -e "$lo2o"` + ;; + *) + libobj= + obj="$output" + ;; + esac + + # Delete the old objects. + $run $rm $obj $libobj + + # Objects from convenience libraries. This assumes + # single-version convenience libraries. Whenever we create + # different ones for PIC/non-PIC, this we'll have to duplicate + # the extraction. + reload_conv_objs= + gentop= + # reload_cmds runs $LD directly, so let us get rid of + # -Wl from whole_archive_flag_spec + wl= + + if test -n "$convenience"; then + if test -n "$whole_archive_flag_spec"; then + eval reload_conv_objs=\"\$reload_objs $whole_archive_flag_spec\" + else + gentop="$output_objdir/${obj}x" + $show "${rm}r $gentop" + $run ${rm}r "$gentop" + $show "mkdir $gentop" + $run mkdir "$gentop" + status=$? + if test $status -ne 0 && test ! -d "$gentop"; then + exit $status + fi + generated="$generated $gentop" + + for xlib in $convenience; do + # Extract the objects. + case "$xlib" in + [\\/]* | [A-Za-z]:[\\/]*) xabs="$xlib" ;; + *) xabs=`pwd`"/$xlib" ;; + esac + xlib=`$echo "X$xlib" | $Xsed -e 's%^.*/%%'` + xdir="$gentop/$xlib" + + $show "${rm}r $xdir" + $run ${rm}r "$xdir" + $show "mkdir $xdir" + $run mkdir "$xdir" + status=$? + if test $status -ne 0 && test ! -d "$xdir"; then + exit $status + fi + $show "(cd $xdir && $AR x $xabs)" + $run eval "(cd \$xdir && $AR x \$xabs)" || exit $? + + reload_conv_objs="$reload_objs "`find $xdir -name \*.o -print -o -name \*.lo -print | $NL2SP` + done + fi + fi + + # Create the old-style object. + reload_objs="$objs "`$echo "X$libobjs" | $SP2NL | $Xsed -e '/\.'${libext}$'/d' -e '/\.lib$/d' -e "$lo2o" | $NL2SP`" $reload_conv_objs" + + output="$obj" + eval cmds=\"$reload_cmds\" + IFS="${IFS= }"; save_ifs="$IFS"; IFS='~' + for cmd in $cmds; do + IFS="$save_ifs" + $show "$cmd" + $run eval "$cmd" || exit $? + done + IFS="$save_ifs" + + # Exit if we aren't doing a library object file. + if test -z "$libobj"; then + if test -n "$gentop"; then + $show "${rm}r $gentop" + $run ${rm}r $gentop + fi + + exit 0 + fi + + if test "$build_libtool_libs" != yes; then + if test -n "$gentop"; then + $show "${rm}r $gentop" + $run ${rm}r $gentop + fi + + # Create an invalid libtool object if no PIC, so that we don't + # accidentally link it into a program. + $show "echo timestamp > $libobj" + $run eval "echo timestamp > $libobj" || exit $? + exit 0 + fi + + if test -n "$pic_flag"; then + # Only do commands if we really have different PIC objects. + reload_objs="$libobjs $reload_conv_objs" + output="$libobj" + eval cmds=\"$reload_cmds\" + IFS="${IFS= }"; save_ifs="$IFS"; IFS='~' + for cmd in $cmds; do + IFS="$save_ifs" + $show "$cmd" + $run eval "$cmd" || exit $? + done + IFS="$save_ifs" + else + # Just create a symlink. + $show $rm $libobj + $run $rm $libobj + $show "$LN_S $obj $libobj" + $run $LN_S $obj $libobj || exit $? + fi + + if test -n "$gentop"; then + $show "${rm}r $gentop" + $run ${rm}r $gentop + fi + + exit 0 + ;; + + # Anything else should be a program. + *) + if test -n "$vinfo"; then + $echo "$modename: warning: \`-version-info' is ignored for programs" 1>&2 + fi + + if test -n "$release"; then + $echo "$modename: warning: \`-release' is ignored for programs" 1>&2 + fi + + if test "$preload" = yes; then + if test "$dlopen" = unknown && test "$dlopen_self" = unknown && + test "$dlopen_self_static" = unknown; then + $echo "$modename: warning: \`AC_LIBTOOL_DLOPEN' not used. Assuming no dlopen support." + fi + fi + + if test -n "$rpath$xrpath"; then + # If the user specified any rpath flags, then add them. + for libdir in $rpath $xrpath; do + # This is the magic to use -rpath. + case "$compile_rpath " in + *" $libdir "*) ;; + *) compile_rpath="$compile_rpath $libdir" ;; + esac + case "$finalize_rpath " in + *" $libdir "*) ;; + *) finalize_rpath="$finalize_rpath $libdir" ;; + esac + done + fi + + # Now hardcode the library paths + rpath= + hardcode_libdirs= + for libdir in $compile_rpath $finalize_rpath; do + if test -n "$hardcode_libdir_flag_spec"; then + if test -n "$hardcode_libdir_separator"; then + if test -z "$hardcode_libdirs"; then + hardcode_libdirs="$libdir" + else + # Just accumulate the unique libdirs. + case "$hardcode_libdir_separator$hardcode_libdirs$hardcode_libdir_separator" in + *"$hardcode_libdir_separator$libdir$hardcode_libdir_separator"*) + ;; + *) + hardcode_libdirs="$hardcode_libdirs$hardcode_libdir_separator$libdir" + ;; + esac + fi + else + eval flag=\"$hardcode_libdir_flag_spec\" + rpath="$rpath $flag" + fi + elif test -n "$runpath_var"; then + case "$perm_rpath " in + *" $libdir "*) ;; + *) perm_rpath="$perm_rpath $libdir" ;; + esac + fi + done + # Substitute the hardcoded libdirs into the rpath. + if test -n "$hardcode_libdir_separator" && + test -n "$hardcode_libdirs"; then + libdir="$hardcode_libdirs" + eval rpath=\" $hardcode_libdir_flag_spec\" + fi + compile_rpath="$rpath" + + rpath= + hardcode_libdirs= + for libdir in $finalize_rpath; do + if test -n "$hardcode_libdir_flag_spec"; then + if test -n "$hardcode_libdir_separator"; then + if test -z "$hardcode_libdirs"; then + hardcode_libdirs="$libdir" + else + # Just accumulate the unique libdirs. + case "$hardcode_libdir_separator$hardcode_libdirs$hardcode_libdir_separator" in + *"$hardcode_libdir_separator$libdir$hardcode_libdir_separator"*) + ;; + *) + hardcode_libdirs="$hardcode_libdirs$hardcode_libdir_separator$libdir" + ;; + esac + fi + else + eval flag=\"$hardcode_libdir_flag_spec\" + rpath="$rpath $flag" + fi + elif test -n "$runpath_var"; then + case "$finalize_perm_rpath " in + *" $libdir "*) ;; + *) finalize_perm_rpath="$finalize_perm_rpath $libdir" ;; + esac + fi + done + # Substitute the hardcoded libdirs into the rpath. + if test -n "$hardcode_libdir_separator" && + test -n "$hardcode_libdirs"; then + libdir="$hardcode_libdirs" + eval rpath=\" $hardcode_libdir_flag_spec\" + fi + finalize_rpath="$rpath" + + output_objdir=`$echo "X$output" | $Xsed -e 's%/[^/]*$%%'` + if test "X$output_objdir" = "X$output"; then + output_objdir="$objdir" + else + output_objdir="$output_objdir/$objdir" + fi + + # Create the binary in the object directory, then wrap it. + if test ! -d $output_objdir; then + $show "$mkdir $output_objdir" + $run $mkdir $output_objdir + status=$? + if test $status -ne 0 && test ! -d $output_objdir; then + exit $status + fi + fi + + if test -n "$libobjs" && test "$build_old_libs" = yes; then + # Transform all the library objects into standard objects. + compile_command=`$echo "X$compile_command" | $SP2NL | $Xsed -e "$lo2o" | $NL2SP` + finalize_command=`$echo "X$finalize_command" | $SP2NL | $Xsed -e "$lo2o" | $NL2SP` + fi + + dlsyms= + if test -n "$dlfiles$dlprefiles" || test "$dlself" != no; then + if test -n "$NM" && test -n "$global_symbol_pipe"; then + dlsyms="${outputname}S.c" + else + $echo "$modename: not configured to extract global symbols from dlpreopened files" 1>&2 + fi + fi + + if test -n "$dlsyms"; then + case "$dlsyms" in + "") ;; + *.c) + # Discover the nlist of each of the dlfiles. + nlist="$output_objdir/${outputname}.nm" + + $show "$rm $nlist ${nlist}S ${nlist}T" + $run $rm "$nlist" "${nlist}S" "${nlist}T" + + # Parse the name list into a source file. + $show "creating $output_objdir/$dlsyms" + + test -z "$run" && $echo > "$output_objdir/$dlsyms" "\ +/* $dlsyms - symbol resolution table for \`$outputname' dlsym emulation. */ +/* Generated by $PROGRAM - GNU $PACKAGE $VERSION$TIMESTAMP */ + +#ifdef __cplusplus +extern \"C\" { +#endif + +/* Prevent the only kind of declaration conflicts we can make. */ +#define lt_preloaded_symbols some_other_symbol + +/* External symbol declarations for the compiler. */\ +" + + if test "$dlself" = yes; then + $show "generating symbol list for \`$output'" + + test -z "$run" && $echo ': @PROGRAM@ ' > "$nlist" + + # Add our own program objects to the symbol list. + progfiles=`$echo "X$objs" | $SP2NL | $Xsed -e "$lo2o" | $NL2SP` + for arg in $progfiles; do + $show "extracting global C symbols from \`$arg'" + $run eval "$NM $arg | $global_symbol_pipe >> '$nlist'" + done + + if test -n "$exclude_expsyms"; then + $run eval 'egrep -v " ($exclude_expsyms)$" "$nlist" > "$nlist"T' + $run eval '$mv "$nlist"T "$nlist"' + fi + + if test -n "$export_symbols_regex"; then + $run eval 'egrep -e "$export_symbols_regex" "$nlist" > "$nlist"T' + $run eval '$mv "$nlist"T "$nlist"' + fi + + # Prepare the list of exported symbols + if test -z "$export_symbols"; then + export_symbols="$output_objdir/$output.exp" + $run $rm $export_symbols + $run eval "sed -n -e '/^: @PROGRAM@$/d' -e 's/^.* \(.*\)$/\1/p' "'< "$nlist" > "$export_symbols"' + else + $run eval "sed -e 's/\([][.*^$]\)/\\\1/g' -e 's/^/ /' -e 's/$/$/'"' < "$export_symbols" > "$output_objdir/$output.exp"' + $run eval 'grep -f "$output_objdir/$output.exp" < "$nlist" > "$nlist"T' + $run eval 'mv "$nlist"T "$nlist"' + fi + fi + + for arg in $dlprefiles; do + $show "extracting global C symbols from \`$arg'" + name=`echo "$arg" | sed -e 's%^.*/%%'` + $run eval 'echo ": $name " >> "$nlist"' + $run eval "$NM $arg | $global_symbol_pipe >> '$nlist'" + done + + if test -z "$run"; then + # Make sure we have at least an empty file. + test -f "$nlist" || : > "$nlist" + + if test -n "$exclude_expsyms"; then + egrep -v " ($exclude_expsyms)$" "$nlist" > "$nlist"T + $mv "$nlist"T "$nlist" + fi + + # Try sorting and uniquifying the output. + if grep -v "^: " < "$nlist" | sort +2 | uniq > "$nlist"S; then + : + else + grep -v "^: " < "$nlist" > "$nlist"S + fi + + if test -f "$nlist"S; then + eval "$global_symbol_to_cdecl"' < "$nlist"S >> "$output_objdir/$dlsyms"' + else + echo '/* NONE */' >> "$output_objdir/$dlsyms" + fi + + $echo >> "$output_objdir/$dlsyms" "\ + +#undef lt_preloaded_symbols + +#if defined (__STDC__) && __STDC__ +# define lt_ptr_t void * +#else +# define lt_ptr_t char * +# define const +#endif + +/* The mapping between symbol names and symbols. */ +const struct { + const char *name; + lt_ptr_t address; +} +lt_preloaded_symbols[] = +{\ +" + + sed -n -e 's/^: \([^ ]*\) $/ {\"\1\", (lt_ptr_t) 0},/p' \ + -e 's/^. \([^ ]*\) \([^ ]*\)$/ {"\2", (lt_ptr_t) \&\2},/p' \ + < "$nlist" >> "$output_objdir/$dlsyms" + + $echo >> "$output_objdir/$dlsyms" "\ + {0, (lt_ptr_t) 0} +}; + +/* This works around a problem in FreeBSD linker */ +#ifdef FREEBSD_WORKAROUND +static const void *lt_preloaded_setup() { + return lt_preloaded_symbols; +} +#endif + +#ifdef __cplusplus +} +#endif\ +" + fi + + pic_flag_for_symtable= + case "$host" in + # compiling the symbol table file with pic_flag works around + # a FreeBSD bug that causes programs to crash when -lm is + # linked before any other PIC object. But we must not use + # pic_flag when linking with -static. The problem exists in + # FreeBSD 2.2.6 and is fixed in FreeBSD 3.1. + *-*-freebsd2*|*-*-freebsd3.0*) + case "$compile_command " in + *" -static "*) ;; + *) pic_flag_for_symtable=" $pic_flag -DPIC -DFREEBSD_WORKAROUND";; + esac + esac + + # Now compile the dynamic symbol file. + $show "(cd $output_objdir && $C_compiler -c$no_builtin_flag$pic_flag_for_symtable \"$dlsyms\")" + $run eval '(cd $output_objdir && $C_compiler -c$no_builtin_flag$pic_flag_for_symtable "$dlsyms")' || exit $? + + # Clean up the generated files. + $show "$rm $output_objdir/$dlsyms $nlist ${nlist}S ${nlist}T" + $run $rm "$output_objdir/$dlsyms" "$nlist" "${nlist}S" "${nlist}T" + + # Transform the symbol file into the correct name. + compile_command=`$echo "X$compile_command" | $Xsed -e "s%@SYMFILE@%$output_objdir/${outputname}S.${objext}%"` + finalize_command=`$echo "X$finalize_command" | $Xsed -e "s%@SYMFILE@%$output_objdir/${outputname}S.${objext}%"` + ;; + *) + $echo "$modename: unknown suffix for \`$dlsyms'" 1>&2 + exit 1 + ;; + esac + else + # We keep going just in case the user didn't refer to + # lt_preloaded_symbols. The linker will fail if global_symbol_pipe + # really was required. + + # Nullify the symbol file. + compile_command=`$echo "X$compile_command" | $Xsed -e "s% @SYMFILE@%%"` + finalize_command=`$echo "X$finalize_command" | $Xsed -e "s% @SYMFILE@%%"` + fi + + if test -z "$link_against_libtool_libs" || test "$build_libtool_libs" != yes; then + # Replace the output file specification. + compile_command=`$echo "X$compile_command" | $Xsed -e 's%@OUTPUT@%'"$output"'%g'` + link_command="$compile_command$compile_rpath" + + # We have no uninstalled library dependencies, so finalize right now. + $show "$link_command" + $run eval "$link_command" + status=$? + + # Delete the generated files. + if test -n "$dlsyms"; then + $show "$rm $output_objdir/${outputname}S.${objext}" + $run $rm "$output_objdir/${outputname}S.${objext}" + fi + + exit $status + fi + + if test -n "$shlibpath_var"; then + # We should set the shlibpath_var + rpath= + for dir in $temp_rpath; do + case "$dir" in + [\\/]* | [A-Za-z]:[\\/]*) + # Absolute path. + rpath="$rpath$dir:" + ;; + *) + # Relative path: add a thisdir entry. + rpath="$rpath\$thisdir/$dir:" + ;; + esac + done + temp_rpath="$rpath" + fi + + if test -n "$compile_shlibpath$finalize_shlibpath"; then + compile_command="$shlibpath_var=\"$compile_shlibpath$finalize_shlibpath\$$shlibpath_var\" $compile_command" + fi + if test -n "$finalize_shlibpath"; then + finalize_command="$shlibpath_var=\"$finalize_shlibpath\$$shlibpath_var\" $finalize_command" + fi + + compile_var= + finalize_var= + if test -n "$runpath_var"; then + if test -n "$perm_rpath"; then + # We should set the runpath_var. + rpath= + for dir in $perm_rpath; do + rpath="$rpath$dir:" + done + compile_var="$runpath_var=\"$rpath\$$runpath_var\" " + fi + if test -n "$finalize_perm_rpath"; then + # We should set the runpath_var. + rpath= + for dir in $finalize_perm_rpath; do + rpath="$rpath$dir:" + done + finalize_var="$runpath_var=\"$rpath\$$runpath_var\" " + fi + fi + + if test "$hardcode_action" = relink; then + # Fast installation is not supported + link_command="$compile_var$compile_command$compile_rpath" + relink_command="$finalize_var$finalize_command$finalize_rpath" + + $echo "$modename: warning: this platform does not like uninstalled shared libraries" 1>&2 + $echo "$modename: \`$output' will be relinked during installation" 1>&2 + else + if test "$fast_install" != no; then + link_command="$finalize_var$compile_command$finalize_rpath" + if test "$fast_install" = yes; then + relink_command=`$echo "X$compile_var$compile_command$compile_rpath" | $Xsed -e 's%@OUTPUT@%\$progdir/\$file%g'` + else + # fast_install is set to needless + relink_command= + fi + else + link_command="$compile_var$compile_command$compile_rpath" + relink_command="$finalize_var$finalize_command$finalize_rpath" + fi + fi + + # Replace the output file specification. + link_command=`$echo "X$link_command" | $Xsed -e 's%@OUTPUT@%'"$output_objdir/$outputname"'%g'` + + # Delete the old output files. + $run $rm $output $output_objdir/$outputname $output_objdir/lt-$outputname + + $show "$link_command" + $run eval "$link_command" || exit $? + + # Now create the wrapper script. + $show "creating $output" + + # Quote the relink command for shipping. + if test -n "$relink_command"; then + relink_command=`$echo "X$relink_command" | $Xsed -e "$sed_quote_subst"` + fi + + # Quote $echo for shipping. + if test "X$echo" = "X$SHELL $0 --fallback-echo"; then + case "$0" in + [\\/]* | [A-Za-z]:[\\/]*) qecho="$SHELL $0 --fallback-echo";; + *) qecho="$SHELL `pwd`/$0 --fallback-echo";; + esac + qecho=`$echo "X$qecho" | $Xsed -e "$sed_quote_subst"` + else + qecho=`$echo "X$echo" | $Xsed -e "$sed_quote_subst"` + fi + + # Only actually do things if our run command is non-null. + if test -z "$run"; then + # win32 will think the script is a binary if it has + # a .exe suffix, so we strip it off here. + case $output in + *.exe) output=`echo $output|sed 's,.exe$,,'` ;; + esac + $rm $output + trap "$rm $output; exit 1" 1 2 15 + + $echo > $output "\ +#! $SHELL + +# $output - temporary wrapper script for $objdir/$outputname +# Generated by $PROGRAM - GNU $PACKAGE $VERSION$TIMESTAMP +# +# The $output program cannot be directly executed until all the libtool +# libraries that it depends on are installed. +# +# This wrapper script should never be moved out of the build directory. +# If it is, it will not operate correctly. + +# Sed substitution that helps us do robust quoting. It backslashifies +# metacharacters that are still active within double-quoted strings. +Xsed='sed -e 1s/^X//' +sed_quote_subst='$sed_quote_subst' + +# The HP-UX ksh and POSIX shell print the target directory to stdout +# if CDPATH is set. +if test \"\${CDPATH+set}\" = set; then CDPATH=; export CDPATH; fi + +relink_command=\"$relink_command\" + +# This environment variable determines our operation mode. +if test \"\$libtool_install_magic\" = \"$magic\"; then + # install mode needs the following variable: + link_against_libtool_libs='$link_against_libtool_libs' +else + # When we are sourced in execute mode, \$file and \$echo are already set. + if test \"\$libtool_execute_magic\" != \"$magic\"; then + echo=\"$qecho\" + file=\"\$0\" + # Make sure echo works. + if test \"X\$1\" = X--no-reexec; then + # Discard the --no-reexec flag, and continue. + shift + elif test \"X\`(\$echo '\t') 2>/dev/null\`\" = 'X\t'; then + # Yippee, \$echo works! + : + else + # Restart under the correct shell, and then maybe \$echo will work. + exec $SHELL \"\$0\" --no-reexec \${1+\"\$@\"} + fi + fi\ +" + $echo >> $output "\ + + # Find the directory that this script lives in. + thisdir=\`\$echo \"X\$file\" | \$Xsed -e 's%/[^/]*$%%'\` + test \"x\$thisdir\" = \"x\$file\" && thisdir=. + + # Follow symbolic links until we get to the real thisdir. + file=\`ls -ld \"\$file\" | sed -n 's/.*-> //p'\` + while test -n \"\$file\"; do + destdir=\`\$echo \"X\$file\" | \$Xsed -e 's%/[^/]*\$%%'\` + + # If there was a directory component, then change thisdir. + if test \"x\$destdir\" != \"x\$file\"; then + case \"\$destdir\" in + [\\/]* | [A-Za-z]:[\\/]*) thisdir=\"\$destdir\" ;; + *) thisdir=\"\$thisdir/\$destdir\" ;; + esac + fi + + file=\`\$echo \"X\$file\" | \$Xsed -e 's%^.*/%%'\` + file=\`ls -ld \"\$thisdir/\$file\" | sed -n 's/.*-> //p'\` + done + + # Try to get the absolute directory name. + absdir=\`cd \"\$thisdir\" && pwd\` + test -n \"\$absdir\" && thisdir=\"\$absdir\" +" + + if test "$fast_install" = yes; then + echo >> $output "\ + program=lt-'$outputname' + progdir=\"\$thisdir/$objdir\" + + if test ! -f \"\$progdir/\$program\" || \\ + { file=\`ls -1dt \"\$progdir/\$program\" \"\$progdir/../\$program\" 2>/dev/null | sed 1q\`; \\ + test \"X\$file\" != \"X\$progdir/\$program\"; }; then + + file=\"\$\$-\$program\" + + if test ! -d \"\$progdir\"; then + $mkdir \"\$progdir\" + else + $rm \"\$progdir/\$file\" + fi" + + echo >> $output "\ + + # relink executable if necessary + if test -n \"\$relink_command\"; then + if (cd \"\$thisdir\" && eval \$relink_command); then : + else + $rm \"\$progdir/\$file\" + exit 1 + fi + fi + + $mv \"\$progdir/\$file\" \"\$progdir/\$program\" 2>/dev/null || + { $rm \"\$progdir/\$program\"; + $mv \"\$progdir/\$file\" \"\$progdir/\$program\"; } + $rm \"\$progdir/\$file\" + fi" + else + echo >> $output "\ + program='$outputname$exeext' + progdir=\"\$thisdir/$objdir\" +" + fi + + echo >> $output "\ + + if test -f \"\$progdir/\$program\"; then" + + # Export our shlibpath_var if we have one. + if test "$shlibpath_overrides_runpath" = yes && test -n "$shlibpath_var" && test -n "$temp_rpath"; then + $echo >> $output "\ + # Add our own library path to $shlibpath_var + $shlibpath_var=\"$temp_rpath\$$shlibpath_var\" + + # Some systems cannot cope with colon-terminated $shlibpath_var + # The second colon is a workaround for a bug in BeOS R4 sed + $shlibpath_var=\`\$echo \"X\$$shlibpath_var\" | \$Xsed -e 's/::*\$//'\` + + export $shlibpath_var +" + fi + + # fixup the dll searchpath if we need to. + if test -n "$dllsearchpath"; then + $echo >> $output "\ + # Add the dll search path components to the executable PATH + PATH=$dllsearchpath:\$PATH +" + fi + + $echo >> $output "\ + if test \"\$libtool_execute_magic\" != \"$magic\"; then + # Run the actual program with our arguments. +" + case $host in + *-*-cygwin* | *-*-mingw | *-*-os2*) + # win32 systems need to use the prog path for dll + # lookup to work + $echo >> $output "\ + exec \$progdir\\\\\$program \${1+\"\$@\"} +" + ;; + *) + $echo >> $output "\ + # Export the path to the program. + PATH=\"\$progdir:\$PATH\" + export PATH + + exec \$program \${1+\"\$@\"} +" + ;; + esac + $echo >> $output "\ + \$echo \"\$0: cannot exec \$program \${1+\"\$@\"}\" + exit 1 + fi + else + # The program doesn't exist. + \$echo \"\$0: error: \$progdir/\$program does not exist\" 1>&2 + \$echo \"This script is just a wrapper for \$program.\" 1>&2 + echo \"See the $PACKAGE documentation for more information.\" 1>&2 + exit 1 + fi +fi\ +" + chmod +x $output + fi + exit 0 + ;; + esac + + # See if we need to build an old-fashioned archive. + for oldlib in $oldlibs; do + + if test "$build_libtool_libs" = convenience; then + oldobjs="$libobjs_save" + addlibs="$convenience" + build_libtool_libs=no + else + if test "$build_libtool_libs" = module; then + oldobjs="$libobjs_save" + build_libtool_libs=no + else + oldobjs="$objs "`$echo "X$libobjs_save" | $SP2NL | $Xsed -e '/\.'${libext}'$/d' -e '/\.lib$/d' -e "$lo2o" | $NL2SP` + fi + addlibs="$old_convenience" + fi + + if test -n "$addlibs"; then + gentop="$output_objdir/${outputname}x" + $show "${rm}r $gentop" + $run ${rm}r "$gentop" + $show "mkdir $gentop" + $run mkdir "$gentop" + status=$? + if test $status -ne 0 && test ! -d "$gentop"; then + exit $status + fi + generated="$generated $gentop" + + # Add in members from convenience archives. + for xlib in $addlibs; do + # Extract the objects. + case "$xlib" in + [\\/]* | [A-Za-z]:[\\/]*) xabs="$xlib" ;; + *) xabs=`pwd`"/$xlib" ;; + esac + xlib=`$echo "X$xlib" | $Xsed -e 's%^.*/%%'` + xdir="$gentop/$xlib" + + $show "${rm}r $xdir" + $run ${rm}r "$xdir" + $show "mkdir $xdir" + $run mkdir "$xdir" + status=$? + if test $status -ne 0 && test ! -d "$xdir"; then + exit $status + fi + $show "(cd $xdir && $AR x $xabs)" + $run eval "(cd \$xdir && $AR x \$xabs)" || exit $? + + oldobjs="$oldobjs "`find $xdir -name \*.${objext} -print -o -name \*.lo -print | $NL2SP` + done + fi + + # Do each command in the archive commands. + if test -n "$old_archive_from_new_cmds" && test "$build_libtool_libs" = yes; then + eval cmds=\"$old_archive_from_new_cmds\" + else + # Ensure that we have .o objects in place incase we decided + # not to build a shared library, and have fallen back to building + # static libs even though --disable-static was passed! + for oldobj in $oldobjs; do + if test ! -f $oldobj; then + obj=`$echo "X$oldobj" | $Xsed -e "$o2lo"` + $show "${LN_S} $obj $oldobj" + $run ${LN_S} $obj $oldobj || exit $? + fi + done + + eval cmds=\"$old_archive_cmds\" + fi + IFS="${IFS= }"; save_ifs="$IFS"; IFS='~' + for cmd in $cmds; do + IFS="$save_ifs" + $show "$cmd" + $run eval "$cmd" || exit $? + done + IFS="$save_ifs" + done + + if test -n "$generated"; then + $show "${rm}r$generated" + $run ${rm}r$generated + fi + + # Now create the libtool archive. + case "$output" in + *.la) + old_library= + test "$build_old_libs" = yes && old_library="$libname.$libext" + $show "creating $output" + + if test -n "$xrpath"; then + temp_xrpath= + for libdir in $xrpath; do + temp_xrpath="$temp_xrpath -R$libdir" + done + dependency_libs="$temp_xrpath $dependency_libs" + fi + + # Only create the output if not a dry run. + if test -z "$run"; then + for installed in no yes; do + if test "$installed" = yes; then + if test -z "$install_libdir"; then + break + fi + output="$output_objdir/$outputname"i + fi + $rm $output + $echo > $output "\ +# $outputname - a libtool library file +# Generated by $PROGRAM - GNU $PACKAGE $VERSION$TIMESTAMP +# +# Please DO NOT delete this file! +# It is necessary for linking the library. + +# The name that we can dlopen(3). +dlname='$dlname' + +# Names of this library. +library_names='$library_names' + +# The name of the static archive. +old_library='$old_library' + +# Libraries that this one depends upon. +dependency_libs='$dependency_libs' + +# Version information for $libname. +current=$current +age=$age +revision=$revision + +# Is this an already installed library? +installed=$installed + +# Directory that this library needs to be installed in: +libdir='$install_libdir'\ +" + done + fi + + # Do a symbolic link so that the libtool archive can be found in + # LD_LIBRARY_PATH before the program is installed. + $show "(cd $output_objdir && $rm $outputname && $LN_S ../$outputname $outputname)" + $run eval "(cd $output_objdir && $rm $outputname && $LN_S ../$outputname $outputname)" || exit $? + ;; + esac + exit 0 + ;; + + # libtool install mode + install) + modename="$modename: install" + + # There may be an optional sh(1) argument at the beginning of + # install_prog (especially on Windows NT). + if test "$nonopt" = "$SHELL" || test "$nonopt" = /bin/sh; then + # Aesthetically quote it. + arg=`$echo "X$nonopt" | $Xsed -e "$sed_quote_subst"` + case "$arg" in + *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \ ]*|*]*) + arg="\"$arg\"" + ;; + esac + install_prog="$arg " + arg="$1" + shift + else + install_prog= + arg="$nonopt" + fi + + # The real first argument should be the name of the installation program. + # Aesthetically quote it. + arg=`$echo "X$arg" | $Xsed -e "$sed_quote_subst"` + case "$arg" in + *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \ ]*|*]*) + arg="\"$arg\"" + ;; + esac + install_prog="$install_prog$arg" + + # We need to accept at least all the BSD install flags. + dest= + files= + opts= + prev= + install_type= + isdir=no + stripme= + for arg + do + if test -n "$dest"; then + files="$files $dest" + dest="$arg" + continue + fi + + case "$arg" in + -d) isdir=yes ;; + -f) prev="-f" ;; + -g) prev="-g" ;; + -m) prev="-m" ;; + -o) prev="-o" ;; + -s) + stripme=" -s" + continue + ;; + -*) ;; + + *) + # If the previous option needed an argument, then skip it. + if test -n "$prev"; then + prev= + else + dest="$arg" + continue + fi + ;; + esac + + # Aesthetically quote the argument. + arg=`$echo "X$arg" | $Xsed -e "$sed_quote_subst"` + case "$arg" in + *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \ ]*|*]*) + arg="\"$arg\"" + ;; + esac + install_prog="$install_prog $arg" + done + + if test -z "$install_prog"; then + $echo "$modename: you must specify an install program" 1>&2 + $echo "$help" 1>&2 + exit 1 + fi + + if test -n "$prev"; then + $echo "$modename: the \`$prev' option requires an argument" 1>&2 + $echo "$help" 1>&2 + exit 1 + fi + + if test -z "$files"; then + if test -z "$dest"; then + $echo "$modename: no file or destination specified" 1>&2 + else + $echo "$modename: you must specify a destination" 1>&2 + fi + $echo "$help" 1>&2 + exit 1 + fi + + # Strip any trailing slash from the destination. + dest=`$echo "X$dest" | $Xsed -e 's%/$%%'` + + # Check to see that the destination is a directory. + test -d "$dest" && isdir=yes + if test "$isdir" = yes; then + destdir="$dest" + destname= + else + destdir=`$echo "X$dest" | $Xsed -e 's%/[^/]*$%%'` + test "X$destdir" = "X$dest" && destdir=. + destname=`$echo "X$dest" | $Xsed -e 's%^.*/%%'` + + # Not a directory, so check to see that there is only one file specified. + set dummy $files + if test $# -gt 2; then + $echo "$modename: \`$dest' is not a directory" 1>&2 + $echo "$help" 1>&2 + exit 1 + fi + fi + case "$destdir" in + [\\/]* | [A-Za-z]:[\\/]*) ;; + *) + for file in $files; do + case "$file" in + *.lo) ;; + *) + $echo "$modename: \`$destdir' must be an absolute directory name" 1>&2 + $echo "$help" 1>&2 + exit 1 + ;; + esac + done + ;; + esac + + # This variable tells wrapper scripts just to set variables rather + # than running their programs. + libtool_install_magic="$magic" + + staticlibs= + future_libdirs= + current_libdirs= + for file in $files; do + + # Do each installation. + case "$file" in + *.a | *.lib) + # Do the static libraries later. + staticlibs="$staticlibs $file" + ;; + + *.la) + # Check to see that this really is a libtool archive. + if (sed -e '2q' $file | egrep "^# Generated by .*$PACKAGE") >/dev/null 2>&1; then : + else + $echo "$modename: \`$file' is not a valid libtool archive" 1>&2 + $echo "$help" 1>&2 + exit 1 + fi + + library_names= + old_library= + # If there is no directory component, then add one. + case "$file" in + */* | *\\*) . $file ;; + *) . ./$file ;; + esac + + # Add the libdir to current_libdirs if it is the destination. + if test "X$destdir" = "X$libdir"; then + case "$current_libdirs " in + *" $libdir "*) ;; + *) current_libdirs="$current_libdirs $libdir" ;; + esac + else + # Note the libdir as a future libdir. + case "$future_libdirs " in + *" $libdir "*) ;; + *) future_libdirs="$future_libdirs $libdir" ;; + esac + fi + + dir="`$echo "X$file" | $Xsed -e 's%/[^/]*$%%'`/" + test "X$dir" = "X$file/" && dir= + dir="$dir$objdir" + + # See the names of the shared library. + set dummy $library_names + if test -n "$2"; then + realname="$2" + shift + shift + + # Install the shared library and build the symlinks. + $show "$install_prog$stripme $dir/$realname $destdir/$realname" + $run eval "$install_prog$stripme $dir/$realname $destdir/$realname" || exit $? + + if test $# -gt 0; then + # Delete the old symlinks, and create new ones. + for linkname + do + if test "$linkname" != "$realname"; then + $show "(cd $destdir && $rm $linkname && $LN_S $realname $linkname)" + $run eval "(cd $destdir && $rm $linkname && $LN_S $realname $linkname)" + fi + done + fi + + # Do each command in the postinstall commands. + lib="$destdir/$realname" + eval cmds=\"$postinstall_cmds\" + IFS="${IFS= }"; save_ifs="$IFS"; IFS='~' + for cmd in $cmds; do + IFS="$save_ifs" + $show "$cmd" + $run eval "$cmd" || exit $? + done + IFS="$save_ifs" + fi + + # Install the pseudo-library for information purposes. + name=`$echo "X$file" | $Xsed -e 's%^.*/%%'` + instname="$dir/$name"i + $show "$install_prog $instname $destdir/$name" + $run eval "$install_prog $instname $destdir/$name" || exit $? + + # Maybe install the static library, too. + test -n "$old_library" && staticlibs="$staticlibs $dir/$old_library" + ;; + + *.lo) + # Install (i.e. copy) a libtool object. + + # Figure out destination file name, if it wasn't already specified. + if test -n "$destname"; then + destfile="$destdir/$destname" + else + destfile=`$echo "X$file" | $Xsed -e 's%^.*/%%'` + destfile="$destdir/$destfile" + fi + + # Deduce the name of the destination old-style object file. + case "$destfile" in + *.lo) + staticdest=`$echo "X$destfile" | $Xsed -e "$lo2o"` + ;; + *.o | *.obj) + staticdest="$destfile" + destfile= + ;; + *) + $echo "$modename: cannot copy a libtool object to \`$destfile'" 1>&2 + $echo "$help" 1>&2 + exit 1 + ;; + esac + + # Install the libtool object if requested. + if test -n "$destfile"; then + $show "$install_prog $file $destfile" + $run eval "$install_prog $file $destfile" || exit $? + fi + + # Install the old object if enabled. + if test "$build_old_libs" = yes; then + # Deduce the name of the old-style object file. + staticobj=`$echo "X$file" | $Xsed -e "$lo2o"` + + $show "$install_prog $staticobj $staticdest" + $run eval "$install_prog \$staticobj \$staticdest" || exit $? + fi + exit 0 + ;; + + *) + # Figure out destination file name, if it wasn't already specified. + if test -n "$destname"; then + destfile="$destdir/$destname" + else + destfile=`$echo "X$file" | $Xsed -e 's%^.*/%%'` + destfile="$destdir/$destfile" + fi + + # Do a test to see if this is really a libtool program. + if (sed -e '4q' $file | egrep "^# Generated by .*$PACKAGE") >/dev/null 2>&1; then + link_against_libtool_libs= + relink_command= + + # If there is no directory component, then add one. + case "$file" in + */* | *\\*) . $file ;; + *) . ./$file ;; + esac + + # Check the variables that should have been set. + if test -z "$link_against_libtool_libs"; then + $echo "$modename: invalid libtool wrapper script \`$file'" 1>&2 + exit 1 + fi + + finalize=yes + for lib in $link_against_libtool_libs; do + # Check to see that each library is installed. + libdir= + if test -f "$lib"; then + # If there is no directory component, then add one. + case "$lib" in + */* | *\\*) . $lib ;; + *) . ./$lib ;; + esac + fi + libfile="$libdir/`$echo "X$lib" | $Xsed -e 's%^.*/%%g'`" + if test -n "$libdir" && test ! -f "$libfile"; then + $echo "$modename: warning: \`$lib' has not been installed in \`$libdir'" 1>&2 + finalize=no + fi + done + + outputname= + if test "$fast_install" = no && test -n "$relink_command"; then + if test "$finalize" = yes && test -z "$run"; then + tmpdir="/tmp" + test -n "$TMPDIR" && tmpdir="$TMPDIR" + tmpdir="$tmpdir/libtool-$$" + if $mkdir -p "$tmpdir" && chmod 700 "$tmpdir"; then : + else + $echo "$modename: error: cannot create temporary directory \`$tmpdir'" 1>&2 + continue + fi + outputname="$tmpdir/$file" + # Replace the output file specification. + relink_command=`$echo "X$relink_command" | $Xsed -e 's%@OUTPUT@%'"$outputname"'%g'` + + $show "$relink_command" + if $run eval "$relink_command"; then : + else + $echo "$modename: error: relink \`$file' with the above command before installing it" 1>&2 + ${rm}r "$tmpdir" + continue + fi + file="$outputname" + else + $echo "$modename: warning: cannot relink \`$file'" 1>&2 + fi + else + # Install the binary that we compiled earlier. + file=`$echo "X$file" | $Xsed -e "s%\([^/]*\)$%$objdir/\1%"` + fi + fi + + $show "$install_prog$stripme $file $destfile" + $run eval "$install_prog\$stripme \$file \$destfile" || exit $? + test -n "$outputname" && ${rm}r "$tmpdir" + ;; + esac + done + + for file in $staticlibs; do + name=`$echo "X$file" | $Xsed -e 's%^.*/%%'` + + # Set up the ranlib parameters. + oldlib="$destdir/$name" + + $show "$install_prog $file $oldlib" + $run eval "$install_prog \$file \$oldlib" || exit $? + + # Do each command in the postinstall commands. + eval cmds=\"$old_postinstall_cmds\" + IFS="${IFS= }"; save_ifs="$IFS"; IFS='~' + for cmd in $cmds; do + IFS="$save_ifs" + $show "$cmd" + $run eval "$cmd" || exit $? + done + IFS="$save_ifs" + done + + if test -n "$future_libdirs"; then + $echo "$modename: warning: remember to run \`$progname --finish$future_libdirs'" 1>&2 + fi + + if test -n "$current_libdirs"; then + # Maybe just do a dry run. + test -n "$run" && current_libdirs=" -n$current_libdirs" + exec $SHELL $0 --finish$current_libdirs + exit 1 + fi + + exit 0 + ;; + + # libtool finish mode + finish) + modename="$modename: finish" + libdirs="$nonopt" + admincmds= + + if test -n "$finish_cmds$finish_eval" && test -n "$libdirs"; then + for dir + do + libdirs="$libdirs $dir" + done + + for libdir in $libdirs; do + if test -n "$finish_cmds"; then + # Do each command in the finish commands. + eval cmds=\"$finish_cmds\" + IFS="${IFS= }"; save_ifs="$IFS"; IFS='~' + for cmd in $cmds; do + IFS="$save_ifs" + $show "$cmd" + $run eval "$cmd" || admincmds="$admincmds + $cmd" + done + IFS="$save_ifs" + fi + if test -n "$finish_eval"; then + # Do the single finish_eval. + eval cmds=\"$finish_eval\" + $run eval "$cmds" || admincmds="$admincmds + $cmds" + fi + done + fi + + # Exit here if they wanted silent mode. + test "$show" = : && exit 0 + + echo "----------------------------------------------------------------------" + echo "Libraries have been installed in:" + for libdir in $libdirs; do + echo " $libdir" + done + echo + echo "If you ever happen to want to link against installed libraries" + echo "in a given directory, LIBDIR, you must either use libtool, and" + echo "specify the full pathname of the library, or use \`-LLIBDIR'" + echo "flag during linking and do at least one of the following:" + if test -n "$shlibpath_var"; then + echo " - add LIBDIR to the \`$shlibpath_var' environment variable" + echo " during execution" + fi + if test -n "$runpath_var"; then + echo " - add LIBDIR to the \`$runpath_var' environment variable" + echo " during linking" + fi + if test -n "$hardcode_libdir_flag_spec"; then + libdir=LIBDIR + eval flag=\"$hardcode_libdir_flag_spec\" + + echo " - use the \`$flag' linker flag" + fi + if test -n "$admincmds"; then + echo " - have your system administrator run these commands:$admincmds" + fi + if test -f /etc/ld.so.conf; then + echo " - have your system administrator add LIBDIR to \`/etc/ld.so.conf'" + fi + echo + echo "See any operating system documentation about shared libraries for" + echo "more information, such as the ld(1) and ld.so(8) manual pages." + echo "----------------------------------------------------------------------" + exit 0 + ;; + + # libtool execute mode + execute) + modename="$modename: execute" + + # The first argument is the command name. + cmd="$nonopt" + if test -z "$cmd"; then + $echo "$modename: you must specify a COMMAND" 1>&2 + $echo "$help" + exit 1 + fi + + # Handle -dlopen flags immediately. + for file in $execute_dlfiles; do + if test ! -f "$file"; then + $echo "$modename: \`$file' is not a file" 1>&2 + $echo "$help" 1>&2 + exit 1 + fi + + dir= + case "$file" in + *.la) + # Check to see that this really is a libtool archive. + if (sed -e '2q' $file | egrep "^# Generated by .*$PACKAGE") >/dev/null 2>&1; then : + else + $echo "$modename: \`$lib' is not a valid libtool archive" 1>&2 + $echo "$help" 1>&2 + exit 1 + fi + + # Read the libtool library. + dlname= + library_names= + + # If there is no directory component, then add one. + case "$file" in + */* | *\\*) . $file ;; + *) . ./$file ;; + esac + + # Skip this library if it cannot be dlopened. + if test -z "$dlname"; then + # Warn if it was a shared library. + test -n "$library_names" && $echo "$modename: warning: \`$file' was not linked with \`-export-dynamic'" + continue + fi + + dir=`$echo "X$file" | $Xsed -e 's%/[^/]*$%%'` + test "X$dir" = "X$file" && dir=. + + if test -f "$dir/$objdir/$dlname"; then + dir="$dir/$objdir" + else + $echo "$modename: cannot find \`$dlname' in \`$dir' or \`$dir/$objdir'" 1>&2 + exit 1 + fi + ;; + + *.lo) + # Just add the directory containing the .lo file. + dir=`$echo "X$file" | $Xsed -e 's%/[^/]*$%%'` + test "X$dir" = "X$file" && dir=. + ;; + + *) + $echo "$modename: warning \`-dlopen' is ignored for non-libtool libraries and objects" 1>&2 + continue + ;; + esac + + # Get the absolute pathname. + absdir=`cd "$dir" && pwd` + test -n "$absdir" && dir="$absdir" + + # Now add the directory to shlibpath_var. + if eval "test -z \"\$$shlibpath_var\""; then + eval "$shlibpath_var=\"\$dir\"" + else + eval "$shlibpath_var=\"\$dir:\$$shlibpath_var\"" + fi + done + + # This variable tells wrapper scripts just to set shlibpath_var + # rather than running their programs. + libtool_execute_magic="$magic" + + # Check if any of the arguments is a wrapper script. + args= + for file + do + case "$file" in + -*) ;; + *) + # Do a test to see if this is really a libtool program. + if (sed -e '4q' $file | egrep "^# Generated by .*$PACKAGE") >/dev/null 2>&1; then + # If there is no directory component, then add one. + case "$file" in + */* | *\\*) . $file ;; + *) . ./$file ;; + esac + + # Transform arg to wrapped name. + file="$progdir/$program" + fi + ;; + esac + # Quote arguments (to preserve shell metacharacters). + file=`$echo "X$file" | $Xsed -e "$sed_quote_subst"` + args="$args \"$file\"" + done + + if test -z "$run"; then + # Export the shlibpath_var. + eval "export $shlibpath_var" + + # Restore saved enviroment variables + if test "${save_LC_ALL+set}" = set; then + LC_ALL="$save_LC_ALL"; export LC_ALL + fi + if test "${save_LANG+set}" = set; then + LANG="$save_LANG"; export LANG + fi + + # Now actually exec the command. + eval "exec \$cmd$args" + + $echo "$modename: cannot exec \$cmd$args" + exit 1 + else + # Display what would be done. + eval "\$echo \"\$shlibpath_var=\$$shlibpath_var\"" + $echo "export $shlibpath_var" + $echo "$cmd$args" + exit 0 + fi + ;; + + # libtool uninstall mode + uninstall) + modename="$modename: uninstall" + rm="$nonopt" + files= + + for arg + do + case "$arg" in + -*) rm="$rm $arg" ;; + *) files="$files $arg" ;; + esac + done + + if test -z "$rm"; then + $echo "$modename: you must specify an RM program" 1>&2 + $echo "$help" 1>&2 + exit 1 + fi + + for file in $files; do + dir=`$echo "X$file" | $Xsed -e 's%/[^/]*$%%'` + test "X$dir" = "X$file" && dir=. + name=`$echo "X$file" | $Xsed -e 's%^.*/%%'` + + rmfiles="$file" + + case "$name" in + *.la) + # Possibly a libtool archive, so verify it. + if (sed -e '2q' $file | egrep "^# Generated by .*$PACKAGE") >/dev/null 2>&1; then + . $dir/$name + + # Delete the libtool libraries and symlinks. + for n in $library_names; do + rmfiles="$rmfiles $dir/$n" + done + test -n "$old_library" && rmfiles="$rmfiles $dir/$old_library" + + $show "$rm $rmfiles" + $run $rm $rmfiles + + if test -n "$library_names"; then + # Do each command in the postuninstall commands. + eval cmds=\"$postuninstall_cmds\" + IFS="${IFS= }"; save_ifs="$IFS"; IFS='~' + for cmd in $cmds; do + IFS="$save_ifs" + $show "$cmd" + $run eval "$cmd" + done + IFS="$save_ifs" + fi + + if test -n "$old_library"; then + # Do each command in the old_postuninstall commands. + eval cmds=\"$old_postuninstall_cmds\" + IFS="${IFS= }"; save_ifs="$IFS"; IFS='~' + for cmd in $cmds; do + IFS="$save_ifs" + $show "$cmd" + $run eval "$cmd" + done + IFS="$save_ifs" + fi + + # FIXME: should reinstall the best remaining shared library. + fi + ;; + + *.lo) + if test "$build_old_libs" = yes; then + oldobj=`$echo "X$name" | $Xsed -e "$lo2o"` + rmfiles="$rmfiles $dir/$oldobj" + fi + $show "$rm $rmfiles" + $run $rm $rmfiles + ;; + + *) + $show "$rm $rmfiles" + $run $rm $rmfiles + ;; + esac + done + exit 0 + ;; + + "") + $echo "$modename: you must specify a MODE" 1>&2 + $echo "$generic_help" 1>&2 + exit 1 + ;; + esac + + $echo "$modename: invalid operation mode \`$mode'" 1>&2 + $echo "$generic_help" 1>&2 + exit 1 +fi # test -z "$show_help" + +# We need to display help for each of the modes. +case "$mode" in +"") $echo \ +"Usage: $modename [OPTION]... [MODE-ARG]... + +Provide generalized library-building support services. + + --config show all configuration variables + --debug enable verbose shell tracing +-n, --dry-run display commands without modifying any files + --features display basic configuration information and exit + --finish same as \`--mode=finish' + --help display this help message and exit + --mode=MODE use operation mode MODE [default=inferred from MODE-ARGS] + --quiet same as \`--silent' + --silent don't print informational messages + --version print version information + +MODE must be one of the following: + + compile compile a source file into a libtool object + execute automatically set library path, then run a program + finish complete the installation of libtool libraries + install install libraries or executables + link create a library or an executable + uninstall remove libraries from an installed directory + +MODE-ARGS vary depending on the MODE. Try \`$modename --help --mode=MODE' for +a more detailed description of MODE." + exit 0 + ;; + +compile) + $echo \ +"Usage: $modename [OPTION]... --mode=compile COMPILE-COMMAND... SOURCEFILE + +Compile a source file into a libtool library object. + +This mode accepts the following additional options: + + -o OUTPUT-FILE set the output file name to OUTPUT-FILE + -static always build a \`.o' file suitable for static linking + +COMPILE-COMMAND is a command to be used in creating a \`standard' object file +from the given SOURCEFILE. + +The output file name is determined by removing the directory component from +SOURCEFILE, then substituting the C source code suffix \`.c' with the +library object suffix, \`.lo'." + ;; + +execute) + $echo \ +"Usage: $modename [OPTION]... --mode=execute COMMAND [ARGS]... + +Automatically set library path, then run a program. + +This mode accepts the following additional options: + + -dlopen FILE add the directory containing FILE to the library path + +This mode sets the library path environment variable according to \`-dlopen' +flags. + +If any of the ARGS are libtool executable wrappers, then they are translated +into their corresponding uninstalled binary, and any of their required library +directories are added to the library path. + +Then, COMMAND is executed, with ARGS as arguments." + ;; + +finish) + $echo \ +"Usage: $modename [OPTION]... --mode=finish [LIBDIR]... + +Complete the installation of libtool libraries. + +Each LIBDIR is a directory that contains libtool libraries. + +The commands that this mode executes may require superuser privileges. Use +the \`--dry-run' option if you just want to see what would be executed." + ;; + +install) + $echo \ +"Usage: $modename [OPTION]... --mode=install INSTALL-COMMAND... + +Install executables or libraries. + +INSTALL-COMMAND is the installation command. The first component should be +either the \`install' or \`cp' program. + +The rest of the components are interpreted as arguments to that command (only +BSD-compatible install options are recognized)." + ;; + +link) + $echo \ +"Usage: $modename [OPTION]... --mode=link LINK-COMMAND... + +Link object files or libraries together to form another library, or to +create an executable program. + +LINK-COMMAND is a command using the C compiler that you would use to create +a program from several object files. + +The following components of LINK-COMMAND are treated specially: + + -all-static do not do any dynamic linking at all + -avoid-version do not add a version suffix if possible + -dlopen FILE \`-dlpreopen' FILE if it cannot be dlopened at runtime + -dlpreopen FILE link in FILE and add its symbols to lt_preloaded_symbols + -export-dynamic allow symbols from OUTPUT-FILE to be resolved with dlsym(3) + -export-symbols SYMFILE + try to export only the symbols listed in SYMFILE + -export-symbols-regex REGEX + try to export only the symbols matching REGEX + -LLIBDIR search LIBDIR for required installed libraries + -lNAME OUTPUT-FILE requires the installed library libNAME + -module build a library that can dlopened + -no-undefined declare that a library does not refer to external symbols + -o OUTPUT-FILE create OUTPUT-FILE from the specified objects + -release RELEASE specify package release information + -rpath LIBDIR the created library will eventually be installed in LIBDIR + -R[ ]LIBDIR add LIBDIR to the runtime path of programs and libraries + -static do not do any dynamic linking of libtool libraries + -version-info CURRENT[:REVISION[:AGE]] + specify library version info [each variable defaults to 0] + +All other options (arguments beginning with \`-') are ignored. + +Every other argument is treated as a filename. Files ending in \`.la' are +treated as uninstalled libtool libraries, other files are standard or library +object files. + +If the OUTPUT-FILE ends in \`.la', then a libtool library is created, +only library objects (\`.lo' files) may be specified, and \`-rpath' is +required, except when creating a convenience library. + +If OUTPUT-FILE ends in \`.a' or \`.lib', then a standard library is created +using \`ar' and \`ranlib', or on Windows using \`lib'. + +If OUTPUT-FILE ends in \`.lo' or \`.${objext}', then a reloadable object file +is created, otherwise an executable program is created." + ;; + +uninstall) + $echo \ +"Usage: $modename [OPTION]... --mode=uninstall RM [RM-OPTION]... FILE... + +Remove libraries from an installation directory. + +RM is the name of the program to use to delete files associated with each FILE +(typically \`/bin/rm'). RM-OPTIONS are options (such as \`-f') to be passed +to RM. + +If FILE is a libtool library, all the files associated with it are deleted. +Otherwise, only FILE itself is deleted using RM." + ;; + +*) + $echo "$modename: invalid operation mode \`$mode'" 1>&2 + $echo "$help" 1>&2 + exit 1 + ;; +esac + +echo +$echo "Try \`$modename --help' for more information about other modes." + +exit 0 + +# Local Variables: +# mode:shell-script +# sh-indentation:2 +# End: diff --git a/xdelta-1.1.3/missing b/xdelta-1.1.3/missing new file mode 100755 index 0000000..7789652 --- /dev/null +++ b/xdelta-1.1.3/missing @@ -0,0 +1,190 @@ +#! /bin/sh +# Common stub for a few missing GNU programs while installing. +# Copyright (C) 1996, 1997 Free Software Foundation, Inc. +# Franc,ois Pinard , 1996. + +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2, or (at your option) +# any later version. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. + +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA +# 02111-1307, USA. + +if test $# -eq 0; then + echo 1>&2 "Try \`$0 --help' for more information" + exit 1 +fi + +case "$1" in + + -h|--h|--he|--hel|--help) + echo "\ +$0 [OPTION]... PROGRAM [ARGUMENT]... + +Handle \`PROGRAM [ARGUMENT]...' for when PROGRAM is missing, or return an +error status if there is no known handling for PROGRAM. + +Options: + -h, --help display this help and exit + -v, --version output version information and exit + +Supported PROGRAM values: + aclocal touch file \`aclocal.m4' + autoconf touch file \`configure' + autoheader touch file \`config.h.in' + automake touch all \`Makefile.in' files + bison create \`y.tab.[ch]', if possible, from existing .[ch] + flex create \`lex.yy.c', if possible, from existing .c + lex create \`lex.yy.c', if possible, from existing .c + makeinfo touch the output file + yacc create \`y.tab.[ch]', if possible, from existing .[ch]" + ;; + + -v|--v|--ve|--ver|--vers|--versi|--versio|--version) + echo "missing - GNU libit 0.0" + ;; + + -*) + echo 1>&2 "$0: Unknown \`$1' option" + echo 1>&2 "Try \`$0 --help' for more information" + exit 1 + ;; + + aclocal) + echo 1>&2 "\ +WARNING: \`$1' is missing on your system. You should only need it if + you modified \`acinclude.m4' or \`configure.in'. You might want + to install the \`Automake' and \`Perl' packages. Grab them from + any GNU archive site." + touch aclocal.m4 + ;; + + autoconf) + echo 1>&2 "\ +WARNING: \`$1' is missing on your system. You should only need it if + you modified \`configure.in'. You might want to install the + \`Autoconf' and \`GNU m4' packages. Grab them from any GNU + archive site." + touch configure + ;; + + autoheader) + echo 1>&2 "\ +WARNING: \`$1' is missing on your system. You should only need it if + you modified \`acconfig.h' or \`configure.in'. You might want + to install the \`Autoconf' and \`GNU m4' packages. Grab them + from any GNU archive site." + files=`sed -n 's/^[ ]*A[CM]_CONFIG_HEADER(\([^)]*\)).*/\1/p' configure.in` + test -z "$files" && files="config.h" + touch_files= + for f in $files; do + case "$f" in + *:*) touch_files="$touch_files "`echo "$f" | + sed -e 's/^[^:]*://' -e 's/:.*//'`;; + *) touch_files="$touch_files $f.in";; + esac + done + touch $touch_files + ;; + + automake) + echo 1>&2 "\ +WARNING: \`$1' is missing on your system. You should only need it if + you modified \`Makefile.am', \`acinclude.m4' or \`configure.in'. + You might want to install the \`Automake' and \`Perl' packages. + Grab them from any GNU archive site." + find . -type f -name Makefile.am -print | + sed 's/\.am$/.in/' | + while read f; do touch "$f"; done + ;; + + bison|yacc) + echo 1>&2 "\ +WARNING: \`$1' is missing on your system. You should only need it if + you modified a \`.y' file. You may need the \`Bison' package + in order for those modifications to take effect. You can get + \`Bison' from any GNU archive site." + rm -f y.tab.c y.tab.h + if [ $# -ne 1 ]; then + eval LASTARG="\${$#}" + case "$LASTARG" in + *.y) + SRCFILE=`echo "$LASTARG" | sed 's/y$/c/'` + if [ -f "$SRCFILE" ]; then + cp "$SRCFILE" y.tab.c + fi + SRCFILE=`echo "$LASTARG" | sed 's/y$/h/'` + if [ -f "$SRCFILE" ]; then + cp "$SRCFILE" y.tab.h + fi + ;; + esac + fi + if [ ! -f y.tab.h ]; then + echo >y.tab.h + fi + if [ ! -f y.tab.c ]; then + echo 'main() { return 0; }' >y.tab.c + fi + ;; + + lex|flex) + echo 1>&2 "\ +WARNING: \`$1' is missing on your system. You should only need it if + you modified a \`.l' file. You may need the \`Flex' package + in order for those modifications to take effect. You can get + \`Flex' from any GNU archive site." + rm -f lex.yy.c + if [ $# -ne 1 ]; then + eval LASTARG="\${$#}" + case "$LASTARG" in + *.l) + SRCFILE=`echo "$LASTARG" | sed 's/l$/c/'` + if [ -f "$SRCFILE" ]; then + cp "$SRCFILE" lex.yy.c + fi + ;; + esac + fi + if [ ! -f lex.yy.c ]; then + echo 'main() { return 0; }' >lex.yy.c + fi + ;; + + makeinfo) + echo 1>&2 "\ +WARNING: \`$1' is missing on your system. You should only need it if + you modified a \`.texi' or \`.texinfo' file, or any other file + indirectly affecting the aspect of the manual. The spurious + call might also be the consequence of using a buggy \`make' (AIX, + DU, IRIX). You might want to install the \`Texinfo' package or + the \`GNU make' package. Grab either from any GNU archive site." + file=`echo "$*" | sed -n 's/.*-o \([^ ]*\).*/\1/p'` + if test -z "$file"; then + file=`echo "$*" | sed 's/.* \([^ ]*\) *$/\1/'` + file=`sed -n '/^@setfilename/ { s/.* \([^ ]*\) *$/\1/; p; q; }' $file` + fi + touch $file + ;; + + *) + echo 1>&2 "\ +WARNING: \`$1' is needed, and you do not seem to have it handy on your + system. You might have modified some files without having the + proper tools for further handling them. Check the \`README' file, + it often tells you about the needed prerequirements for installing + this package. You may also peek at any GNU archive site, in case + some other package would contain this missing \`$1' program." + exit 1 + ;; +esac + +exit 0 diff --git a/xdelta-1.1.3/mkinstalldirs b/xdelta-1.1.3/mkinstalldirs new file mode 100755 index 0000000..a83c5ac --- /dev/null +++ b/xdelta-1.1.3/mkinstalldirs @@ -0,0 +1,40 @@ +#! /bin/sh +# mkinstalldirs --- make directory hierarchy +# Author: Noah Friedman +# Created: 1993-05-16 +# Public domain + +# $Id: mkinstalldirs,v 1.1 2004/01/05 18:54:21 icculus Exp $ + +errstatus=0 + +for file +do + set fnord `echo ":$file" | sed -ne 's/^:\//#/;s/^://;s/\// /g;s/^#/\//;p'` + shift + + pathcomp= + for d + do + pathcomp="$pathcomp$d" + case "$pathcomp" in + -* ) pathcomp=./$pathcomp ;; + esac + + if test ! -d "$pathcomp"; then + echo "mkdir $pathcomp" + + mkdir "$pathcomp" || lasterr=$? + + if test ! -d "$pathcomp"; then + errstatus=$lasterr + fi + fi + + pathcomp="$pathcomp/" + done +done + +exit $errstatus + +# mkinstalldirs ends here diff --git a/xdelta-1.1.3/stamp-h b/xdelta-1.1.3/stamp-h new file mode 100644 index 0000000..9788f70 --- /dev/null +++ b/xdelta-1.1.3/stamp-h @@ -0,0 +1 @@ +timestamp diff --git a/xdelta-1.1.3/stamp-h.in b/xdelta-1.1.3/stamp-h.in new file mode 100644 index 0000000..9788f70 --- /dev/null +++ b/xdelta-1.1.3/stamp-h.in @@ -0,0 +1 @@ +timestamp diff --git a/xdelta-1.1.3/stamp-ser b/xdelta-1.1.3/stamp-ser new file mode 100644 index 0000000..e69de29 diff --git a/xdelta-1.1.3/test/Makefile b/xdelta-1.1.3/test/Makefile new file mode 100644 index 0000000..de440e5 --- /dev/null +++ b/xdelta-1.1.3/test/Makefile @@ -0,0 +1,307 @@ +# Generated automatically from Makefile.in by configure. +# Makefile.in generated automatically by automake 1.4 from Makefile.am + +# Copyright (C) 1994, 1995-8, 1999 Free Software Foundation, Inc. +# This Makefile.in is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY, to the extent permitted by law; without +# even the implied warranty of MERCHANTABILITY or FITNESS FOR A +# PARTICULAR PURPOSE. + + +SHELL = /bin/sh + +srcdir = . +top_srcdir = .. +prefix = /usr/local +exec_prefix = ${prefix} + +bindir = ${exec_prefix}/bin +sbindir = ${exec_prefix}/sbin +libexecdir = ${exec_prefix}/libexec +datadir = ${prefix}/share +sysconfdir = ${prefix}/etc +sharedstatedir = ${prefix}/com +localstatedir = ${prefix}/var +libdir = ${exec_prefix}/lib +infodir = ${prefix}/info +mandir = ${prefix}/man +includedir = ${prefix}/include +oldincludedir = /usr/include + +DESTDIR = + +pkgdatadir = $(datadir)/xdelta +pkglibdir = $(libdir)/xdelta +pkgincludedir = $(includedir)/xdelta + +top_builddir = .. + +ACLOCAL = aclocal +AUTOCONF = autoconf +AUTOMAKE = automake +AUTOHEADER = autoheader + +INSTALL = /usr/bin/install -c +INSTALL_PROGRAM = ${INSTALL} $(AM_INSTALL_PROGRAM_FLAGS) +INSTALL_DATA = ${INSTALL} -m 644 +INSTALL_SCRIPT = ${INSTALL_PROGRAM} +transform = s,x,x, + +NORMAL_INSTALL = : +PRE_INSTALL = : +POST_INSTALL = : +NORMAL_UNINSTALL = : +PRE_UNINSTALL = : +POST_UNINSTALL = : +host_alias = powerpc-apple +host_triplet = powerpc-apple-macos +AS = @AS@ +CC = gcc +CPP = gcc -E +DLLTOOL = @DLLTOOL@ +EMACS = /usr/bin/emacs +GLIB_CFLAGS = -I/usr/local/include/glib-1.2 -I/usr/local/lib/glib/include +GLIB_CONFIG = /usr/local/bin/glib-config +GLIB_LIBS = -L/usr/local/lib -lglib +LD = /usr/bin/ld +LIBTOOL = $(SHELL) $(top_builddir)/libtool +LN_S = ln -s +MAINT = # +MAKEINFO = makeinfo +NM = /usr/bin/nm -p +OBJDUMP = @OBJDUMP@ +PACKAGE = xdelta +RANLIB = ranlib +VERSION = 1.1.3 +top_srcdir_absolute = /Users/icculus/projects/mojopatch/xdelta-1.1.3 + +EXTRA_DIST = xdeltatest.c README.test + +INCLUDES = -I$(top_srcdir)/libedsio $(GLIB_CFLAGS) + +noinst_PROGRAMS = xdeltatest + +xdeltatest_SOURCES = xdeltatest.c + +xdeltatest_LDADD = $(top_srcdir)/libxdelta.la $(top_srcdir)/libedsio/libedsio.la -lz $(GLIB_LIBS) + +mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs +CONFIG_HEADER = ../config.h +CONFIG_CLEAN_FILES = +PROGRAMS = $(noinst_PROGRAMS) + + +DEFS = -DHAVE_CONFIG_H -I. -I$(srcdir) -I.. +CPPFLAGS = +LDFLAGS = +LIBS = +xdeltatest_OBJECTS = xdeltatest.o +xdeltatest_DEPENDENCIES = $(top_srcdir)/libxdelta.la \ +$(top_srcdir)/libedsio/libedsio.la +xdeltatest_LDFLAGS = +CFLAGS = -Wall -O3 +COMPILE = $(CC) $(DEFS) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) +LTCOMPILE = $(LIBTOOL) --mode=compile $(CC) $(DEFS) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) +CCLD = $(CC) +LINK = $(LIBTOOL) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(LDFLAGS) -o $@ +DIST_COMMON = Makefile.am Makefile.in + + +DISTFILES = $(DIST_COMMON) $(SOURCES) $(HEADERS) $(TEXINFOS) $(EXTRA_DIST) + +TAR = tar +GZIP_ENV = --best +SOURCES = $(xdeltatest_SOURCES) +OBJECTS = $(xdeltatest_OBJECTS) + +all: all-redirect +.SUFFIXES: +.SUFFIXES: .S .c .lo .o .s +$(srcdir)/Makefile.in: # Makefile.am $(top_srcdir)/configure.in $(ACLOCAL_M4) + cd $(top_srcdir) && $(AUTOMAKE) --gnu --include-deps test/Makefile + +Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status + cd $(top_builddir) \ + && CONFIG_FILES=$(subdir)/$@ CONFIG_HEADERS= $(SHELL) ./config.status + + +mostlyclean-noinstPROGRAMS: + +clean-noinstPROGRAMS: + -test -z "$(noinst_PROGRAMS)" || rm -f $(noinst_PROGRAMS) + +distclean-noinstPROGRAMS: + +maintainer-clean-noinstPROGRAMS: + +.c.o: + $(COMPILE) -c $< + +.s.o: + $(COMPILE) -c $< + +.S.o: + $(COMPILE) -c $< + +mostlyclean-compile: + -rm -f *.o core *.core + +clean-compile: + +distclean-compile: + -rm -f *.tab.c + +maintainer-clean-compile: + +.c.lo: + $(LIBTOOL) --mode=compile $(COMPILE) -c $< + +.s.lo: + $(LIBTOOL) --mode=compile $(COMPILE) -c $< + +.S.lo: + $(LIBTOOL) --mode=compile $(COMPILE) -c $< + +mostlyclean-libtool: + -rm -f *.lo + +clean-libtool: + -rm -rf .libs _libs + +distclean-libtool: + +maintainer-clean-libtool: + +xdeltatest: $(xdeltatest_OBJECTS) $(xdeltatest_DEPENDENCIES) + @rm -f xdeltatest + $(LINK) $(xdeltatest_LDFLAGS) $(xdeltatest_OBJECTS) $(xdeltatest_LDADD) $(LIBS) + +tags: TAGS + +ID: $(HEADERS) $(SOURCES) $(LISP) + list='$(SOURCES) $(HEADERS)'; \ + unique=`for i in $$list; do echo $$i; done | \ + awk ' { files[$$0] = 1; } \ + END { for (i in files) print i; }'`; \ + here=`pwd` && cd $(srcdir) \ + && mkid -f$$here/ID $$unique $(LISP) + +TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) $(LISP) + tags=; \ + here=`pwd`; \ + list='$(SOURCES) $(HEADERS)'; \ + unique=`for i in $$list; do echo $$i; done | \ + awk ' { files[$$0] = 1; } \ + END { for (i in files) print i; }'`; \ + test -z "$(ETAGS_ARGS)$$unique$(LISP)$$tags" \ + || (cd $(srcdir) && etags $(ETAGS_ARGS) $$tags $$unique $(LISP) -o $$here/TAGS) + +mostlyclean-tags: + +clean-tags: + +distclean-tags: + -rm -f TAGS ID + +maintainer-clean-tags: + +distdir = $(top_builddir)/$(PACKAGE)-$(VERSION)/$(subdir) + +subdir = test + +distdir: $(DISTFILES) + @for file in $(DISTFILES); do \ + d=$(srcdir); \ + if test -d $$d/$$file; then \ + cp -pr $$d/$$file $(distdir)/$$file; \ + else \ + test -f $(distdir)/$$file \ + || ln $$d/$$file $(distdir)/$$file 2> /dev/null \ + || cp -p $$d/$$file $(distdir)/$$file || :; \ + fi; \ + done +xdeltatest.o: xdeltatest.c ../getopt.h ../config.h ../xdelta.h \ + ../xd_edsio.h ../libedsio/edsio.h ../libedsio/edsio_edsio.h + +info-am: +info: info-am +dvi-am: +dvi: dvi-am +check-am: all-am +check: check-am +installcheck-am: +installcheck: installcheck-am +install-exec-am: +install-exec: install-exec-am + +install-data-am: +install-data: install-data-am + +install-am: all-am + @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am +install: install-am +uninstall-am: +uninstall: uninstall-am +all-am: Makefile $(PROGRAMS) +all-redirect: all-am +install-strip: + $(MAKE) $(AM_MAKEFLAGS) AM_INSTALL_PROGRAM_FLAGS=-s install +installdirs: + + +mostlyclean-generic: + +clean-generic: + +distclean-generic: + -rm -f Makefile $(CONFIG_CLEAN_FILES) + -rm -f config.cache config.log stamp-h stamp-h[0-9]* + +maintainer-clean-generic: +mostlyclean-am: mostlyclean-noinstPROGRAMS mostlyclean-compile \ + mostlyclean-libtool mostlyclean-tags \ + mostlyclean-generic + +mostlyclean: mostlyclean-am + +clean-am: clean-noinstPROGRAMS clean-compile clean-libtool clean-tags \ + clean-generic mostlyclean-am + +clean: clean-am + +distclean-am: distclean-noinstPROGRAMS distclean-compile \ + distclean-libtool distclean-tags distclean-generic \ + clean-am + -rm -f libtool + +distclean: distclean-am + +maintainer-clean-am: maintainer-clean-noinstPROGRAMS \ + maintainer-clean-compile maintainer-clean-libtool \ + maintainer-clean-tags maintainer-clean-generic \ + distclean-am + @echo "This command is intended for maintainers to use;" + @echo "it deletes files that may require special tools to rebuild." + +maintainer-clean: maintainer-clean-am + +.PHONY: mostlyclean-noinstPROGRAMS distclean-noinstPROGRAMS \ +clean-noinstPROGRAMS maintainer-clean-noinstPROGRAMS \ +mostlyclean-compile distclean-compile clean-compile \ +maintainer-clean-compile mostlyclean-libtool distclean-libtool \ +clean-libtool maintainer-clean-libtool tags mostlyclean-tags \ +distclean-tags clean-tags maintainer-clean-tags distdir info-am info \ +dvi-am dvi check check-am installcheck-am installcheck install-exec-am \ +install-exec install-data-am install-data install-am install \ +uninstall-am uninstall all-redirect all-am all installdirs \ +mostlyclean-generic distclean-generic clean-generic \ +maintainer-clean-generic clean mostlyclean distclean maintainer-clean + + +# Tell versions [3.59,3.63) of GNU make to not export all variables. +# Otherwise a system limit (for SysV at least) may be exceeded. +.NOEXPORT: diff --git a/xdelta-1.1.3/test/Makefile.am b/xdelta-1.1.3/test/Makefile.am new file mode 100644 index 0000000..9ab70bf --- /dev/null +++ b/xdelta-1.1.3/test/Makefile.am @@ -0,0 +1,13 @@ + +EXTRA_DIST = xdeltatest.c README.test + +INCLUDES = -I$(top_srcdir)/libedsio $(GLIB_CFLAGS) + +noinst_PROGRAMS = xdeltatest + +xdeltatest_SOURCES = xdeltatest.c + +xdeltatest_LDADD = $(top_srcdir)/libxdelta.la \ + $(top_srcdir)/libedsio/libedsio.la \ + -lz \ + $(GLIB_LIBS) diff --git a/xdelta-1.1.3/test/Makefile.in b/xdelta-1.1.3/test/Makefile.in new file mode 100644 index 0000000..452e01b --- /dev/null +++ b/xdelta-1.1.3/test/Makefile.in @@ -0,0 +1,307 @@ +# Makefile.in generated automatically by automake 1.4 from Makefile.am + +# Copyright (C) 1994, 1995-8, 1999 Free Software Foundation, Inc. +# This Makefile.in is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY, to the extent permitted by law; without +# even the implied warranty of MERCHANTABILITY or FITNESS FOR A +# PARTICULAR PURPOSE. + + +SHELL = @SHELL@ + +srcdir = @srcdir@ +top_srcdir = @top_srcdir@ +VPATH = @srcdir@ +prefix = @prefix@ +exec_prefix = @exec_prefix@ + +bindir = @bindir@ +sbindir = @sbindir@ +libexecdir = @libexecdir@ +datadir = @datadir@ +sysconfdir = @sysconfdir@ +sharedstatedir = @sharedstatedir@ +localstatedir = @localstatedir@ +libdir = @libdir@ +infodir = @infodir@ +mandir = @mandir@ +includedir = @includedir@ +oldincludedir = /usr/include + +DESTDIR = + +pkgdatadir = $(datadir)/@PACKAGE@ +pkglibdir = $(libdir)/@PACKAGE@ +pkgincludedir = $(includedir)/@PACKAGE@ + +top_builddir = .. + +ACLOCAL = @ACLOCAL@ +AUTOCONF = @AUTOCONF@ +AUTOMAKE = @AUTOMAKE@ +AUTOHEADER = @AUTOHEADER@ + +INSTALL = @INSTALL@ +INSTALL_PROGRAM = @INSTALL_PROGRAM@ $(AM_INSTALL_PROGRAM_FLAGS) +INSTALL_DATA = @INSTALL_DATA@ +INSTALL_SCRIPT = @INSTALL_SCRIPT@ +transform = @program_transform_name@ + +NORMAL_INSTALL = : +PRE_INSTALL = : +POST_INSTALL = : +NORMAL_UNINSTALL = : +PRE_UNINSTALL = : +POST_UNINSTALL = : +host_alias = @host_alias@ +host_triplet = @host@ +AS = @AS@ +CC = @CC@ +CPP = @CPP@ +DLLTOOL = @DLLTOOL@ +EMACS = @EMACS@ +GLIB_CFLAGS = @GLIB_CFLAGS@ +GLIB_CONFIG = @GLIB_CONFIG@ +GLIB_LIBS = @GLIB_LIBS@ +LD = @LD@ +LIBTOOL = @LIBTOOL@ +LN_S = @LN_S@ +MAINT = @MAINT@ +MAKEINFO = @MAKEINFO@ +NM = @NM@ +OBJDUMP = @OBJDUMP@ +PACKAGE = @PACKAGE@ +RANLIB = @RANLIB@ +VERSION = @VERSION@ +top_srcdir_absolute = @top_srcdir_absolute@ + +EXTRA_DIST = xdeltatest.c README.test + +INCLUDES = -I$(top_srcdir)/libedsio $(GLIB_CFLAGS) + +noinst_PROGRAMS = xdeltatest + +xdeltatest_SOURCES = xdeltatest.c + +xdeltatest_LDADD = $(top_srcdir)/libxdelta.la $(top_srcdir)/libedsio/libedsio.la -lz $(GLIB_LIBS) + +mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs +CONFIG_HEADER = ../config.h +CONFIG_CLEAN_FILES = +PROGRAMS = $(noinst_PROGRAMS) + + +DEFS = @DEFS@ -I. -I$(srcdir) -I.. +CPPFLAGS = @CPPFLAGS@ +LDFLAGS = @LDFLAGS@ +LIBS = @LIBS@ +xdeltatest_OBJECTS = xdeltatest.o +xdeltatest_DEPENDENCIES = $(top_srcdir)/libxdelta.la \ +$(top_srcdir)/libedsio/libedsio.la +xdeltatest_LDFLAGS = +CFLAGS = @CFLAGS@ +COMPILE = $(CC) $(DEFS) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) +LTCOMPILE = $(LIBTOOL) --mode=compile $(CC) $(DEFS) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) +CCLD = $(CC) +LINK = $(LIBTOOL) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(LDFLAGS) -o $@ +DIST_COMMON = Makefile.am Makefile.in + + +DISTFILES = $(DIST_COMMON) $(SOURCES) $(HEADERS) $(TEXINFOS) $(EXTRA_DIST) + +TAR = tar +GZIP_ENV = --best +SOURCES = $(xdeltatest_SOURCES) +OBJECTS = $(xdeltatest_OBJECTS) + +all: all-redirect +.SUFFIXES: +.SUFFIXES: .S .c .lo .o .s +$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ Makefile.am $(top_srcdir)/configure.in $(ACLOCAL_M4) + cd $(top_srcdir) && $(AUTOMAKE) --gnu --include-deps test/Makefile + +Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status + cd $(top_builddir) \ + && CONFIG_FILES=$(subdir)/$@ CONFIG_HEADERS= $(SHELL) ./config.status + + +mostlyclean-noinstPROGRAMS: + +clean-noinstPROGRAMS: + -test -z "$(noinst_PROGRAMS)" || rm -f $(noinst_PROGRAMS) + +distclean-noinstPROGRAMS: + +maintainer-clean-noinstPROGRAMS: + +.c.o: + $(COMPILE) -c $< + +.s.o: + $(COMPILE) -c $< + +.S.o: + $(COMPILE) -c $< + +mostlyclean-compile: + -rm -f *.o core *.core + +clean-compile: + +distclean-compile: + -rm -f *.tab.c + +maintainer-clean-compile: + +.c.lo: + $(LIBTOOL) --mode=compile $(COMPILE) -c $< + +.s.lo: + $(LIBTOOL) --mode=compile $(COMPILE) -c $< + +.S.lo: + $(LIBTOOL) --mode=compile $(COMPILE) -c $< + +mostlyclean-libtool: + -rm -f *.lo + +clean-libtool: + -rm -rf .libs _libs + +distclean-libtool: + +maintainer-clean-libtool: + +xdeltatest: $(xdeltatest_OBJECTS) $(xdeltatest_DEPENDENCIES) + @rm -f xdeltatest + $(LINK) $(xdeltatest_LDFLAGS) $(xdeltatest_OBJECTS) $(xdeltatest_LDADD) $(LIBS) + +tags: TAGS + +ID: $(HEADERS) $(SOURCES) $(LISP) + list='$(SOURCES) $(HEADERS)'; \ + unique=`for i in $$list; do echo $$i; done | \ + awk ' { files[$$0] = 1; } \ + END { for (i in files) print i; }'`; \ + here=`pwd` && cd $(srcdir) \ + && mkid -f$$here/ID $$unique $(LISP) + +TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) $(LISP) + tags=; \ + here=`pwd`; \ + list='$(SOURCES) $(HEADERS)'; \ + unique=`for i in $$list; do echo $$i; done | \ + awk ' { files[$$0] = 1; } \ + END { for (i in files) print i; }'`; \ + test -z "$(ETAGS_ARGS)$$unique$(LISP)$$tags" \ + || (cd $(srcdir) && etags $(ETAGS_ARGS) $$tags $$unique $(LISP) -o $$here/TAGS) + +mostlyclean-tags: + +clean-tags: + +distclean-tags: + -rm -f TAGS ID + +maintainer-clean-tags: + +distdir = $(top_builddir)/$(PACKAGE)-$(VERSION)/$(subdir) + +subdir = test + +distdir: $(DISTFILES) + @for file in $(DISTFILES); do \ + d=$(srcdir); \ + if test -d $$d/$$file; then \ + cp -pr $$d/$$file $(distdir)/$$file; \ + else \ + test -f $(distdir)/$$file \ + || ln $$d/$$file $(distdir)/$$file 2> /dev/null \ + || cp -p $$d/$$file $(distdir)/$$file || :; \ + fi; \ + done +xdeltatest.o: xdeltatest.c ../getopt.h ../config.h ../xdelta.h \ + ../xd_edsio.h ../libedsio/edsio.h ../libedsio/edsio_edsio.h + +info-am: +info: info-am +dvi-am: +dvi: dvi-am +check-am: all-am +check: check-am +installcheck-am: +installcheck: installcheck-am +install-exec-am: +install-exec: install-exec-am + +install-data-am: +install-data: install-data-am + +install-am: all-am + @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am +install: install-am +uninstall-am: +uninstall: uninstall-am +all-am: Makefile $(PROGRAMS) +all-redirect: all-am +install-strip: + $(MAKE) $(AM_MAKEFLAGS) AM_INSTALL_PROGRAM_FLAGS=-s install +installdirs: + + +mostlyclean-generic: + +clean-generic: + +distclean-generic: + -rm -f Makefile $(CONFIG_CLEAN_FILES) + -rm -f config.cache config.log stamp-h stamp-h[0-9]* + +maintainer-clean-generic: +mostlyclean-am: mostlyclean-noinstPROGRAMS mostlyclean-compile \ + mostlyclean-libtool mostlyclean-tags \ + mostlyclean-generic + +mostlyclean: mostlyclean-am + +clean-am: clean-noinstPROGRAMS clean-compile clean-libtool clean-tags \ + clean-generic mostlyclean-am + +clean: clean-am + +distclean-am: distclean-noinstPROGRAMS distclean-compile \ + distclean-libtool distclean-tags distclean-generic \ + clean-am + -rm -f libtool + +distclean: distclean-am + +maintainer-clean-am: maintainer-clean-noinstPROGRAMS \ + maintainer-clean-compile maintainer-clean-libtool \ + maintainer-clean-tags maintainer-clean-generic \ + distclean-am + @echo "This command is intended for maintainers to use;" + @echo "it deletes files that may require special tools to rebuild." + +maintainer-clean: maintainer-clean-am + +.PHONY: mostlyclean-noinstPROGRAMS distclean-noinstPROGRAMS \ +clean-noinstPROGRAMS maintainer-clean-noinstPROGRAMS \ +mostlyclean-compile distclean-compile clean-compile \ +maintainer-clean-compile mostlyclean-libtool distclean-libtool \ +clean-libtool maintainer-clean-libtool tags mostlyclean-tags \ +distclean-tags clean-tags maintainer-clean-tags distdir info-am info \ +dvi-am dvi check check-am installcheck-am installcheck install-exec-am \ +install-exec install-data-am install-data install-am install \ +uninstall-am uninstall all-redirect all-am all installdirs \ +mostlyclean-generic distclean-generic clean-generic \ +maintainer-clean-generic clean mostlyclean distclean maintainer-clean + + +# Tell versions [3.59,3.63) of GNU make to not export all variables. +# Otherwise a system limit (for SysV at least) may be exceeded. +.NOEXPORT: diff --git a/xdelta-1.1.3/test/README.test b/xdelta-1.1.3/test/README.test new file mode 100644 index 0000000..11ac3b8 --- /dev/null +++ b/xdelta-1.1.3/test/README.test @@ -0,0 +1,9 @@ +The code in this directory produces a test for Xdelta. To run it you +have to edit the hard-coded constants at the top of the file, which +include "cmd_data_source", which should be the name of a big file +containing source data that the test uses to construct sample inputs. +This allows you to test on whatever kind of data you want, but the +synthetic edits are still hardcoded. Have a look. + +Of course, a better test would let you run it without any +configuration, but this is not that test. diff --git a/xdelta-1.1.3/test/xdeltatest b/xdelta-1.1.3/test/xdeltatest new file mode 100755 index 0000000000000000000000000000000000000000..ad8585b397de7d098f94894f4d8a5355385d29ad GIT binary patch literal 126336 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

`~~c4Yf8HjAEc=vOjU0-s5< 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 Q?XYRDeXbYPrFA#|2kUP@D*ylh literal 0 HcmV?d00001 diff --git a/xdelta-1.1.3/test/xdeltatest.c b/xdelta-1.1.3/test/xdeltatest.c new file mode 100644 index 0000000..1eb7bc9 --- /dev/null +++ b/xdelta-1.1.3/test/xdeltatest.c @@ -0,0 +1,681 @@ +/* -*- Mode: C;-*- + * + * This file is part of XDelta - A binary delta generator. + * + * Copyright (C) 1997, 1998, 2001 Josh MacDonald + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + * + * Author: Josh MacDonald + * + * $Id: xdeltatest.c,v 1.1 2004/01/05 18:54:24 icculus Exp $ + */ + +#include +#include +#include +#include "config.h" + +#if TIME_WITH_SYS_TIME +# include +# include +#else +# if HAVE_SYS_TIME_H +# include +# else +# include +# endif +#endif + +#include +#include +#include +#include +#include +#include + +#include "xdelta.h" + +////////////////////////////////////////////////////////////////////// +// Configure these parameters +// @@@ Of course, a real test wouldn't require this configuration, +// fix that! +////////////////////////////////////////////////////////////////////// + +const char* cmd_data_source = "/scratch/jmacd/source-code-data"; +guint cmd_size = 1<<20; + +guint cmd_warmups = 2; +guint cmd_reps = 20; + +guint cmd_changes = 1000; +guint cmd_deletion_length = 30; +guint cmd_insertion_length = 15; + +////////////////////////////////////////////////////////////////////// +// +////////////////////////////////////////////////////////////////////// + +#define ARRAY_LENGTH(x) (sizeof(x)/sizeof(x[0])) + +#define TEST_PREFIX "/tmp/xdeltatest" + +#define TEST_IS_GZIP 1 +#define TEST_IS_XDELTA 2 + +typedef struct _File File; +typedef struct _Patch Patch; +typedef struct _TestProfile TestProfile; +typedef struct _Instruction Instruction; + +struct _Instruction { + guint32 offset; + guint32 length; + Instruction* next; +}; + +struct _File +{ + char name[MAXPATHLEN]; +}; + +struct _Patch +{ + guint8 *data; + guint32 length; +}; + +struct _TestProfile +{ + const char *name; + const char *progname; + int flags; +}; + +#undef BUFSIZ +#define BUFSIZ (1<<24) + +guint8 __tmp_buffer[BUFSIZ]; + +// Note: Of course you should be able to set all this up on the +// command line. + +TestProfile cmd_profiles[] = +{ + { "xdelta -qn ", "../xdelta", TEST_IS_XDELTA }, + { "diff --rcs -a", "/usr/bin/diff", 0 }, + { "gzip ", "/bin/gzip", TEST_IS_GZIP }, +}; + +int cmd_slevels[] = { 16, 32, 64 }; +int cmd_zlevels[] = { 0, 1, 3, 6, 9 }; +guint16 cmd_seed[3] = { 47384, 8594, 27489 }; + +FILE* data_source_handle; +guint data_source_length; +File* data_source_file; + +long current_to_size; +long current_from_size; + +double __total_time; +off_t __dsize; + +void +reset_stats () +{ + __total_time = 0; + __dsize = -1; +} + +void add_tv (GTimer *timer) +{ + __total_time += g_timer_elapsed (timer, NULL); +} + +void +report (TestProfile *tp, int zlevel, int slevel) +{ + static gboolean once = TRUE; + + double t = __total_time / (double) cmd_reps; + double s; + const char *u; + char slevel_str[16]; + + if (tp->flags & TEST_IS_XDELTA) + { + sprintf (slevel_str, "%d", slevel); + } + else + { + slevel_str[0] = 0; + } + + if (tp->flags & TEST_IS_GZIP) + { + s = __dsize / (double) current_to_size; + u = "total size"; + } + else + { + s = __dsize / (double) (cmd_changes * cmd_insertion_length); + u = "insertion size"; + } + + if (once) + { + once = FALSE; + + g_print ("Program\t\tzlevel\tslevel\tSeconds\tNormalized\n\t\t\t\t\tcompression\n"); + } + + g_print ("%s\t%d\t%s\t%0.3f\t%0.3f (of %s)\n", tp->name, zlevel, slevel_str, t, s, u); +} + +guint32 +random_offset (guint len) +{ + return lrand48 () % (data_source_length - len); +} + +void +fail () +{ + g_warning ("FAILURE\n"); + abort (); +} + +gboolean starts_with (const char* s, const char *start) +{ + return strncmp (s, start, strlen (start)) == 0; +} + +Patch* +read_patch (File *file, struct stat *sbuf) +{ + Patch *p = g_new0 (Patch,1); + FILE *f = fopen (file->name, "r"); + + p->length = (int)sbuf->st_size; + + p->data = g_malloc (p->length); + + if (! f || fread (p->data, 1, p->length, f) != p->length) + { + perror ("fread"); + fail (); + } + + fclose (f); + + return p; +} + +File* +empty_file () +{ + static gint count = 0; + File *file = g_new0 (File, 1); + + sprintf (file->name, "%s.%d.%d", TEST_PREFIX, getpid (), count++); + + return file; +} + +void +compare_files (File* fromfile, File* tofile) +{ + gint pos = 0; + + FILE* toh; + FILE* fromh; + + guint8 buf1[1024], buf2[1024]; + + toh = fopen (tofile->name, "r"); + fromh = fopen (fromfile->name, "r"); + + if (!toh || !fromh) + fail (); + + for (;;) + { + gint readf = fread (buf1, 1, 1024, fromh); + gint readt = fread (buf2, 1, 1024, toh); + gint i, m = MIN(readf, readt); + + if (readf < 0 || readt < 0) + fail (); + + for (i = 0; i < m; i += 1, pos += 1) + { + if (buf1[i] != buf2[i]) + fail (); + } + + if (m != 1024) + { + if (readt == readf) + { + fclose (toh); + fclose (fromh); + return; + } + + fail (); + } + } +} + +int +write_file (File* file, Instruction* inst) +{ + FILE* h; + int ret; + int size = 0; + + if (! (h = fopen (file->name, "w"))) { + perror (file->name); + fail (); + } + + for (; inst; inst = inst->next) + { + g_assert (inst->length <= BUFSIZ); + + if ((ret = fseek (data_source_handle, inst->offset, SEEK_SET))) { + perror ("fseek"); + fail (); + } + + if ((ret = fread (__tmp_buffer, 1, inst->length, data_source_handle)) != inst->length) { + perror ("fread"); + fail (); + } + + if ((ret = fwrite (__tmp_buffer, 1, inst->length, h)) != inst->length) { + perror ("fwrite"); + fail (); + } + + size += inst->length; + } + + if ((ret = fclose (h))) { + perror ("fclose"); + fail (); + } + + return size; +} + +Instruction* +perform_change_rec (Instruction* inst, guint32 change_off, guint* total_len) +{ + if (change_off < inst->length) + { + guint32 to_delete = cmd_deletion_length; + guint32 avail = inst->length; + guint32 this_delete = MIN (to_delete, avail); + Instruction* new_inst; + + // One delete + inst->length -= this_delete; + to_delete -= this_delete; + + while (to_delete > 0 && inst->next->length < to_delete) + { + to_delete -= inst->next->length; + inst->next = inst->next->next; + } + + if (to_delete > 0) + inst->next->offset += to_delete; + + // One insert + new_inst = g_new0 (Instruction, 1); + + new_inst->offset = random_offset (cmd_insertion_length); + new_inst->length = cmd_insertion_length; + new_inst->next = inst->next; + inst->next = new_inst; + + (* total_len) += cmd_insertion_length - cmd_deletion_length; + + return inst; + } + else + { + inst->next = perform_change_rec (inst->next, change_off - inst->length, total_len); + return inst; + } +} + +Instruction* +perform_change (Instruction* inst, guint* len) +{ + return perform_change_rec (inst, lrand48() % ((* len) - cmd_deletion_length), len); +} + +gboolean +xdelta_verify (TestProfile *tp, int zlevel, int slevel, File* from, File* to, File* out, File *re) +{ + int pid, status; + + if ((pid = vfork()) < 0) + return FALSE; + + if (pid == 0) + { + execl (tp->progname, + tp->progname, + "patch", + out->name, + from->name, + re->name, + NULL); + perror ("execl failed"); + _exit (127); + } + + if (waitpid (pid, &status, 0) != pid) + { + perror ("wait failed"); + fail (); + } + + // Note: program is expected to return 0, 1 meaning diff or no diff, + // > 1 indicates failure + if (! WIFEXITED (status) || WEXITSTATUS (status) > 1) + { + g_warning ("patch command failed\n"); + fail (); + } + + compare_files (to, re); + + return TRUE; +} + +gboolean +run_command (TestProfile *tp, int zlevel, int slevel, File* from, File* to, File* out, File *re, gboolean accounting) +{ + int pid, status, outfd; + struct stat sbuf; + char xdelta_args[16]; + char xdelta_args2[16]; + char diff_gzargs[16]; + char gzip_args[16]; + + GTimer *timer = g_timer_new (); + + sprintf (xdelta_args, "-qn%d", zlevel); + sprintf (xdelta_args2, "-s%d", slevel); + sprintf (diff_gzargs, "wb%d", zlevel); + sprintf (gzip_args, "-c%d", zlevel); + + unlink (out->name); + + g_timer_start (timer); + + if ((pid = vfork()) < 0) + return FALSE; + + if (pid == 0) + { + if (starts_with (tp->name, "xdelta")) + { + execl (tp->progname, + tp->progname, + "delta", + xdelta_args, + xdelta_args2, + from->name, + to->name, + out->name, + NULL); + } + else + { + outfd = open (out->name, O_CREAT | O_TRUNC | O_WRONLY, 0777); + + if (outfd < 0) + { + perror ("open"); + fail (); + } + + dup2(outfd, STDOUT_FILENO); + + if (close (outfd)) + { + perror ("close"); + fail (); + } + + if (starts_with (tp->name, "diff")) + execl (tp->progname, + tp->progname, + "--rcs", + "-a", + from->name, + to->name, + NULL); + else if (starts_with (tp->name, "gzip")) + execl (tp->progname, + tp->progname, + gzip_args, + to->name, + NULL); + else + abort (); + } + + perror ("execl failed"); + _exit (127); + } + + if (waitpid (pid, &status, 0) != pid) + { + perror ("wait failed"); + fail (); + } + + // Note: program is expected to return 0, 1 meaning diff or no diff, + // > 1 indicates failure + if (! WIFEXITED (status) || WEXITSTATUS (status) > 1) + { + g_warning ("delta command failed\n"); + fail (); + } + + if (stat (out->name, & sbuf)) + { + perror ("stat"); + fail (); + } + + // Do zlib compression on behalf of diff + if (zlevel > 0 && starts_with (tp->name, "diff")) + { + Patch *patch = read_patch (out, & sbuf); + gzFile *rewrite = gzopen (out->name, diff_gzargs); + + if (! rewrite) fail (); + + if (gzwrite (rewrite, patch->data, patch->length) == 0) { perror ("gzwrite"); fail (); } + if (gzclose (rewrite) != Z_OK) { perror ("gzclose"); fail (); } + if (stat (out->name, & sbuf)) { perror ("stat"); fail (); } + } + + g_timer_stop (timer); + + if (accounting) + { + add_tv (timer); + } + + if (__dsize < 0) + { + __dsize = sbuf.st_size; + + // Verify only once + + if (starts_with (tp->name, "xdelta")) + { + if (! xdelta_verify (tp, zlevel, slevel, from, to, out, re)) + { + g_warning ("verify failed"); + fail (); + } + } + } + else + { + if (__dsize != sbuf.st_size) + { + g_warning ("%s -%d: delta command produced different size deltas: %d and %d", + tp->progname, zlevel, (int)__dsize, (int)sbuf.st_size); + fail (); + } + } + + g_timer_destroy (timer); + + return TRUE; +} + +void +test1 (TestProfile *test_profile, + File *from_file, + File *to_file, + File *out_file, + File *re_file) +{ + int ret; + guint i, change, current_size = cmd_size; + guint end_size = (cmd_changes * cmd_insertion_length) + cmd_size; + Instruction* inst; + struct stat sbuf; + int zlevel_i, slevel_i; + + seed48 (cmd_seed); + + if ((ret = stat (cmd_data_source, & sbuf))) + { + perror (cmd_data_source); + fail (); + } + + if (! (data_source_handle = fopen (cmd_data_source, "r"))) + { + perror (cmd_data_source); + fail (); + } + + data_source_length = sbuf.st_size; + + /* arbitrary checks */ + if (data_source_length < (1.5 * end_size)) + g_warning ("data source should be longer\n"); + + if ((cmd_changes * cmd_deletion_length) > cmd_size) + { + g_warning ("no copies are expected\n"); + fail (); + } + + inst = g_new0 (Instruction, 1); + + inst->offset = random_offset (cmd_size); + inst->length = cmd_size; + + current_from_size = write_file (from_file, inst); + + for (change = 0; change < cmd_changes; change += 1) + inst = perform_change (inst, & current_size); + + current_to_size = write_file (to_file, inst); + + for (slevel_i = 0; slevel_i < ARRAY_LENGTH(cmd_slevels); slevel_i += 1) + { + int slevel = cmd_slevels[slevel_i]; + + if ((test_profile->flags & TEST_IS_XDELTA) == 0 && slevel_i != 0) + { + continue; + } + + for (zlevel_i = 0; zlevel_i < ARRAY_LENGTH(cmd_zlevels); zlevel_i += 1) + { + int zlevel = cmd_zlevels[zlevel_i]; + + if (test_profile->flags & TEST_IS_GZIP) + { + if (zlevel != 1 && zlevel != 9) + continue; + } + + reset_stats (); + + for (i = 0; i < cmd_warmups + cmd_reps; i += 1) + { + if (! run_command (test_profile, + zlevel, + slevel, + from_file, + to_file, + out_file, + re_file, + (i >= cmd_warmups) /* true => accounting */)) + { + fail (); + } + } + + report (test_profile, zlevel, slevel); + } + + g_print ("\n"); + } +} + +int +main (gint argc, gchar** argv) +{ + int profile_i; + + File *from_file; + File *to_file; + File *out_file; + File *re_file; + + system ("rm -rf " TEST_PREFIX "*"); + + from_file = empty_file (); + to_file = empty_file (); + out_file = empty_file (); + re_file = empty_file (); + + for (profile_i = 0; profile_i < ARRAY_LENGTH(cmd_profiles); profile_i += 1) + { + test1 (& cmd_profiles[profile_i], from_file, to_file, out_file, re_file); + + system ("rm -rf " TEST_PREFIX "*"); + } + + return 0; +} diff --git a/xdelta-1.1.3/xd.ser b/xdelta-1.1.3/xd.ser new file mode 100644 index 0000000..7dd91c6 --- /dev/null +++ b/xdelta-1.1.3/xd.ser @@ -0,0 +1,138 @@ +;; -*- Emacs-Lisp -*- + +(defmodule xd 3 "xdelta.h" nil) + +(defimport "libedsio/edsio.ser") + +(defsertype XdeltaChecksum 1 + ((high uint16) + (low uint16) + ) + () + ) + +(defsertype XdeltaIndex 2 + ((file_len uint) + (file_md5 (bytes 16)) + (index (array XdeltaChecksum)) + ) + () + ) + +(defsertype XdeltaSourceInfo 3 + ((name string) + (md5 (bytes 16)) + (len uint) + (isdata boolean) ;;; if true, then its source index is 0 and it is the data segment + (sequential boolean) ;;; if true, then offset field is not persistent, but instead + ;;; recomputed when loaded as the sum of + ;;; previous instruction's length fields, to + ;;; indicate a sequential read + ) + ("guint32 position" + "guint32 copies" + "guint32 copy_length" + "FileHandle *in") + ) + +(defsertype XdeltaControl 7 + ((to_md5 (bytes 16)) + (to_len uint) + (has_data boolean) + (source_info (array (ptr XdeltaSourceInfo))) + (inst (array XdeltaInstruction)) + ) + ("GArray *inst_array" + "GPtrArray *source_info_array" + ) + ) + +(defsertype XdeltaInstruction 8 + ((index uint) + (offset uint) + (length uint) + ) + ("guint32 output_start") + ) + +;; rsync stuff + +(defsertype RsyncIndexElt 9 + ((md5 (bytes 16)) + (cksum XdeltaChecksum) + ) + ("SerialRsyncIndexElt* next" + "gint match_offset") + ) + +(defsertype RsyncIndex 10 + ((seg_len uint) + (file_len uint) + (file_md5 (bytes 16)) + (index (array RsyncIndexElt)) + ) + ("SerialRsyncIndexElt** table" + "guint table_size") + ) + +;; backward compat, these are the 1.0 defs + +(defsertype Version0SourceInfo 4 + ((md5 (bytes 16)) + (real_md5 (bytes 16)) + (length uint) + ) + () + ) + +(defsertype Version0Control 5 + ((normalized boolean) + (data_len uint) + (to_info Version0SourceInfo) + (source_info (array (ptr Version0SourceInfo))) + (inst (array Version0Instruction)) + ) + ("GArray *inst_array" + "GPtrArray *source_info_array" + ) + ) + +(defsertype Version0Instruction 6 + ((offset uint) + (length uint) + ) + ("guint8 type" ;; these two fields get packed into length + "guint8 index" + ) + ) + +;; events + +(defetype handle "FileHandle*") + +(defevent TooFewSources Error () () + "Too few input sources") + +(defevent TooManySources Error () () + "Too many input sources") + +(defevent OutOfRangeSourceIndex Error ((index int)) () + "Instruction references out-of-range source index: ${INDEX}") + +(defevent InvalidControl Error () () + "Delta control is corrupt") + +(defevent InvalidRsyncCache Error () () + "The rsync checksum cache is corrupt") + +(defevent IncompatibleDelta Error () () + "The delta was not produced according by the `xdelta delta' command") + +(defevent StreamChecksumFailed Error ((stream handle) (expected string) (received string)) () + "${STREAM}: Checksum validation failed, expected: ${EXPECTED}, received: ${RECEIVED}") + +(defevent StreamLengthFailed Error ((stream handle) (expected int) (received int)) () + "${STREAM}: Length validation failed, expected: ${EXPECTED}, received: ${RECEIVED}") + +(defevent BackwardCompatibilityMode Information ((version string)) () + "Reading a version ${VERSION} delta control") diff --git a/xdelta-1.1.3/xd_edsio.c b/xdelta-1.1.3/xd_edsio.c new file mode 100644 index 0000000..c866735 --- /dev/null +++ b/xdelta-1.1.3/xd_edsio.c @@ -0,0 +1,1559 @@ +/* -*-Mode: C;-*- + * Copyright (C) 1997, 1998, 1999 Josh MacDonald + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + * + * Author: Josh MacDonald + * + * This file was AUTOMATICALLY GENERATED using: + * + * $Id: xd_edsio.c,v 1.1 2004/01/05 18:54:21 icculus Exp $ + */ + +#include "xdelta.h" + +#include + +/* Declarations. */ + +static const char* Xd_String_event_field_to_string (GenericEvent* ev, gint field); +static const char* Xd_HandleIntInt_event_field_to_string (GenericEvent* ev, gint field); +static const char* Xd_HandleStringString_event_field_to_string (GenericEvent* ev, gint field); +static const char* Xd_Int_event_field_to_string (GenericEvent* ev, gint field); +static void print_spaces (guint n) { int i; for (i = 0; i < n; i += 1) g_print (" "); } + + +/* initialize this library. */ + +gboolean +xd_edsio_init (void) +{ + static gboolean once = FALSE; + static gboolean result = FALSE; + if (once) return result; + once = TRUE; + eventdelivery_initialize_event_def (EC_XdBackwardCompatibilityModeValue, EL_Information, EF_None, "BackwardCompatibilityMode", "Reading a version ${0} delta control", & Xd_String_event_field_to_string); + eventdelivery_initialize_event_def (EC_XdStreamLengthFailedValue, EL_Error, EF_None, "StreamLengthFailed", "${0}: Length validation failed, expected: ${1}, received: ${2}", & Xd_HandleIntInt_event_field_to_string); + eventdelivery_initialize_event_def (EC_XdStreamChecksumFailedValue, EL_Error, EF_None, "StreamChecksumFailed", "${0}: Checksum validation failed, expected: ${1}, received: ${2}", & Xd_HandleStringString_event_field_to_string); + eventdelivery_initialize_event_def (EC_XdIncompatibleDeltaValue, EL_Error, EF_None, "IncompatibleDelta", "The delta was not produced according by the `xdelta delta' command", NULL); + eventdelivery_initialize_event_def (EC_XdInvalidRsyncCacheValue, EL_Error, EF_None, "InvalidRsyncCache", "The rsync checksum cache is corrupt", NULL); + eventdelivery_initialize_event_def (EC_XdInvalidControlValue, EL_Error, EF_None, "InvalidControl", "Delta control is corrupt", NULL); + eventdelivery_initialize_event_def (EC_XdOutOfRangeSourceIndexValue, EL_Error, EF_None, "OutOfRangeSourceIndex", "Instruction references out-of-range source index: ${0}", & Xd_Int_event_field_to_string); + eventdelivery_initialize_event_def (EC_XdTooManySourcesValue, EL_Error, EF_None, "TooManySources", "Too many input sources", NULL); + eventdelivery_initialize_event_def (EC_XdTooFewSourcesValue, EL_Error, EF_None, "TooFewSources", "Too few input sources", NULL); + serializeio_initialize_type ("ST_Version0Instruction", ST_Version0Instruction, &unserialize_version0instruction_internal, &serialize_version0instruction_obj_internal, &serializeio_count_version0instruction_obj, &serializeio_print_version0instruction_obj); + serializeio_initialize_type ("ST_Version0Control", ST_Version0Control, &unserialize_version0control_internal, &serialize_version0control_obj_internal, &serializeio_count_version0control_obj, &serializeio_print_version0control_obj); + serializeio_initialize_type ("ST_Version0SourceInfo", ST_Version0SourceInfo, &unserialize_version0sourceinfo_internal, &serialize_version0sourceinfo_obj_internal, &serializeio_count_version0sourceinfo_obj, &serializeio_print_version0sourceinfo_obj); + serializeio_initialize_type ("ST_RsyncIndex", ST_RsyncIndex, &unserialize_rsyncindex_internal, &serialize_rsyncindex_obj_internal, &serializeio_count_rsyncindex_obj, &serializeio_print_rsyncindex_obj); + serializeio_initialize_type ("ST_RsyncIndexElt", ST_RsyncIndexElt, &unserialize_rsyncindexelt_internal, &serialize_rsyncindexelt_obj_internal, &serializeio_count_rsyncindexelt_obj, &serializeio_print_rsyncindexelt_obj); + serializeio_initialize_type ("ST_XdeltaInstruction", ST_XdeltaInstruction, &unserialize_xdeltainstruction_internal, &serialize_xdeltainstruction_obj_internal, &serializeio_count_xdeltainstruction_obj, &serializeio_print_xdeltainstruction_obj); + serializeio_initialize_type ("ST_XdeltaControl", ST_XdeltaControl, &unserialize_xdeltacontrol_internal, &serialize_xdeltacontrol_obj_internal, &serializeio_count_xdeltacontrol_obj, &serializeio_print_xdeltacontrol_obj); + serializeio_initialize_type ("ST_XdeltaSourceInfo", ST_XdeltaSourceInfo, &unserialize_xdeltasourceinfo_internal, &serialize_xdeltasourceinfo_obj_internal, &serializeio_count_xdeltasourceinfo_obj, &serializeio_print_xdeltasourceinfo_obj); + serializeio_initialize_type ("ST_XdeltaIndex", ST_XdeltaIndex, &unserialize_xdeltaindex_internal, &serialize_xdeltaindex_obj_internal, &serializeio_count_xdeltaindex_obj, &serializeio_print_xdeltaindex_obj); + serializeio_initialize_type ("ST_XdeltaChecksum", ST_XdeltaChecksum, &unserialize_xdeltachecksum_internal, &serialize_xdeltachecksum_obj_internal, &serializeio_count_xdeltachecksum_obj, &serializeio_print_xdeltachecksum_obj); + edsio_library_register (3, "xd"); + result = TRUE; + return TRUE; +} + +/* XdeltaChecksum Count + */ + +guint +serializeio_count_xdeltachecksum (guint16 high, guint16 low) { + guint size = sizeof (SerialXdeltaChecksum); + ALIGN_8 (size); + ALIGN_8 (size); + ALIGN_8 (size); + return size; +} + +guint +serializeio_count_xdeltachecksum_obj (SerialXdeltaChecksum const* obj) { + return serializeio_count_xdeltachecksum (obj->high, obj->low); +} + +/* XdeltaChecksum Print + */ + +void +serializeio_print_xdeltachecksum_obj (SerialXdeltaChecksum* obj, guint indent_spaces) { + print_spaces (indent_spaces); + g_print ("[ST_XdeltaChecksum]\n"); + print_spaces (indent_spaces); + g_print ("high = "); + g_print ("%d\n", obj->high); + print_spaces (indent_spaces); + g_print ("low = "); + g_print ("%d\n", obj->low); +} + +/* XdeltaChecksum Serialize + */ + +gboolean +serialize_xdeltachecksum_internal (SerialSink *sink, guint16 high, guint16 low) +{ + if (! (* sink->next_uint16) (sink, high)) goto bail; + if (! (* sink->next_uint16) (sink, low)) goto bail; + return TRUE; +bail: + return FALSE; +} + +gboolean +serialize_xdeltachecksum_obj_internal (SerialSink *sink, SerialXdeltaChecksum* obj) +{ + return serialize_xdeltachecksum_internal (sink, obj->high, obj->low); +} + +gboolean +serialize_xdeltachecksum (SerialSink *sink, guint16 high, guint16 low) +{ + if (! (* sink->sink_type) (sink, ST_XdeltaChecksum, serializeio_count_xdeltachecksum (high, low), TRUE)) goto bail; + if (! serialize_xdeltachecksum_internal (sink, high, low)) goto bail; + if (sink->sink_quantum && ! sink->sink_quantum (sink)) goto bail; + return TRUE; +bail: + return FALSE; +} + +gboolean +serialize_xdeltachecksum_obj (SerialSink *sink, const SerialXdeltaChecksum* obj) { + + return serialize_xdeltachecksum (sink, obj->high, obj->low); +} + +/* XdeltaChecksum Unserialize + */ + +gboolean +unserialize_xdeltachecksum_internal_noalloc (SerialSource *source, SerialXdeltaChecksum* result) +{ + if (! (* source->next_uint16) (source, &result->high)) goto bail; + if (! (* source->next_uint16) (source, &result->low)) goto bail; + return TRUE; +bail: + return FALSE; +} + +gboolean +unserialize_xdeltachecksum_internal (SerialSource *source, SerialXdeltaChecksum** result) +{ + SerialXdeltaChecksum* unser; + (*result) = NULL; + unser = serializeio_source_alloc (source, sizeof (SerialXdeltaChecksum)); + if (! unser) goto bail; + if (! unserialize_xdeltachecksum_internal_noalloc (source, unser)) goto bail; + (*result) = unser; + return TRUE; +bail: + return FALSE; +} + +gboolean +unserialize_xdeltachecksum (SerialSource *source, SerialXdeltaChecksum** result) +{ + if ( (* source->source_type) (source, TRUE) != ST_XdeltaChecksum) goto bail; + if (! unserialize_xdeltachecksum_internal (source, result)) goto bail; + if (! serializeio_source_object_received (source)) goto bail; + return TRUE; +bail: + return FALSE; +} + +/* XdeltaIndex Count + */ + +guint +serializeio_count_xdeltaindex (guint32 file_len, const guint8 file_md5[16], guint32 index_len, SerialXdeltaChecksum const* index) { + guint size = sizeof (SerialXdeltaIndex); + ALIGN_8 (size); + ALIGN_8 (size); + ALIGN_8 (size); + { + gint i; + for (i = 0; i < index_len; i += 1) + { + size += serializeio_count_xdeltachecksum_obj (& (index[i])); + } + } + ALIGN_8 (size); + return size; +} + +guint +serializeio_count_xdeltaindex_obj (SerialXdeltaIndex const* obj) { + return serializeio_count_xdeltaindex (obj->file_len, obj->file_md5, obj->index_len, obj->index); +} + +/* XdeltaIndex Print + */ + +void +serializeio_print_xdeltaindex_obj (SerialXdeltaIndex* obj, guint indent_spaces) { + print_spaces (indent_spaces); + g_print ("[ST_XdeltaIndex]\n"); + print_spaces (indent_spaces); + g_print ("file_len = "); + g_print ("%d\n", obj->file_len); + print_spaces (indent_spaces); + g_print ("file_md5 = "); + serializeio_print_bytes (obj->file_md5, 16); + print_spaces (indent_spaces); + g_print ("index = "); + g_print ("{\n"); + { + gint i; + for (i = 0; i < obj->index_len; i += 1) + { + print_spaces (indent_spaces); + g_print ("%d: ", i); + print_spaces (indent_spaces); + serializeio_print_xdeltachecksum_obj (& (obj->index[i]), indent_spaces + 2); + print_spaces (indent_spaces); +; + } + } + g_print ("}\n"); +} + +/* XdeltaIndex Serialize + */ + +gboolean +serialize_xdeltaindex_internal (SerialSink *sink, guint32 file_len, const guint8 file_md5[16], guint32 index_len, SerialXdeltaChecksum const* index) +{ + if (! (* sink->next_uint) (sink, file_len)) goto bail; + if (! (* sink->next_bytes_known) (sink, file_md5, 16)) goto bail; + { + gint i; + if (! (* sink->next_uint) (sink, index_len)) goto bail; + for (i = 0; i < index_len; i += 1) + { + if (! serialize_xdeltachecksum_internal (sink, (index[i]).high, (index[i]).low)) goto bail; + } + } + return TRUE; +bail: + return FALSE; +} + +gboolean +serialize_xdeltaindex_obj_internal (SerialSink *sink, SerialXdeltaIndex* obj) +{ + return serialize_xdeltaindex_internal (sink, obj->file_len, obj->file_md5, obj->index_len, obj->index); +} + +gboolean +serialize_xdeltaindex (SerialSink *sink, guint32 file_len, const guint8 file_md5[16], guint32 index_len, SerialXdeltaChecksum const* index) +{ + if (! (* sink->sink_type) (sink, ST_XdeltaIndex, serializeio_count_xdeltaindex (file_len, file_md5, index_len, index), TRUE)) goto bail; + if (! serialize_xdeltaindex_internal (sink, file_len, file_md5, index_len, index)) goto bail; + if (sink->sink_quantum && ! sink->sink_quantum (sink)) goto bail; + return TRUE; +bail: + return FALSE; +} + +gboolean +serialize_xdeltaindex_obj (SerialSink *sink, const SerialXdeltaIndex* obj) { + + return serialize_xdeltaindex (sink, obj->file_len, obj->file_md5, obj->index_len, obj->index); +} + +/* XdeltaIndex Unserialize + */ + +gboolean +unserialize_xdeltaindex_internal_noalloc (SerialSource *source, SerialXdeltaIndex* result) +{ + if (! (* source->next_uint) (source, &result->file_len)) goto bail; + if (! (* source->next_bytes_known) (source, result->file_md5, 16)) goto bail; + { + gint i; + if (! (* source->next_uint) (source, &result->index_len)) goto bail; + if (! (result->index = serializeio_source_alloc (source, sizeof (SerialXdeltaChecksum) * result->index_len))) goto bail; + for (i = 0; i < result->index_len; i += 1) + { + if (! unserialize_xdeltachecksum_internal_noalloc (source, &(result->index[i]))) goto bail; + } + } + return TRUE; +bail: + return FALSE; +} + +gboolean +unserialize_xdeltaindex_internal (SerialSource *source, SerialXdeltaIndex** result) +{ + SerialXdeltaIndex* unser; + (*result) = NULL; + unser = serializeio_source_alloc (source, sizeof (SerialXdeltaIndex)); + if (! unser) goto bail; + if (! unserialize_xdeltaindex_internal_noalloc (source, unser)) goto bail; + (*result) = unser; + return TRUE; +bail: + return FALSE; +} + +gboolean +unserialize_xdeltaindex (SerialSource *source, SerialXdeltaIndex** result) +{ + if ( (* source->source_type) (source, TRUE) != ST_XdeltaIndex) goto bail; + if (! unserialize_xdeltaindex_internal (source, result)) goto bail; + if (! serializeio_source_object_received (source)) goto bail; + return TRUE; +bail: + return FALSE; +} + +/* XdeltaSourceInfo Count + */ + +guint +serializeio_count_xdeltasourceinfo (const gchar* name, const guint8 md5[16], guint32 len, gboolean isdata, gboolean sequential) { + guint size = sizeof (SerialXdeltaSourceInfo); + ALIGN_8 (size); + size += strlen (name) + 1; + ALIGN_8 (size); + ALIGN_8 (size); + ALIGN_8 (size); + ALIGN_8 (size); + ALIGN_8 (size); + return size; +} + +guint +serializeio_count_xdeltasourceinfo_obj (SerialXdeltaSourceInfo const* obj) { + return serializeio_count_xdeltasourceinfo (obj->name, obj->md5, obj->len, obj->isdata, obj->sequential); +} + +/* XdeltaSourceInfo Print + */ + +void +serializeio_print_xdeltasourceinfo_obj (SerialXdeltaSourceInfo* obj, guint indent_spaces) { + print_spaces (indent_spaces); + g_print ("[ST_XdeltaSourceInfo]\n"); + print_spaces (indent_spaces); + g_print ("name = "); + g_print ("%s\n", obj->name); + print_spaces (indent_spaces); + g_print ("md5 = "); + serializeio_print_bytes (obj->md5, 16); + print_spaces (indent_spaces); + g_print ("len = "); + g_print ("%d\n", obj->len); + print_spaces (indent_spaces); + g_print ("isdata = "); + g_print ("%s\n", obj->isdata ? "true" : "false"); + print_spaces (indent_spaces); + g_print ("sequential = "); + g_print ("%s\n", obj->sequential ? "true" : "false"); +} + +/* XdeltaSourceInfo Serialize + */ + +gboolean +serialize_xdeltasourceinfo_internal (SerialSink *sink, const gchar* name, const guint8 md5[16], guint32 len, gboolean isdata, gboolean sequential) +{ + if (! (* sink->next_string) (sink, name)) goto bail; + if (! (* sink->next_bytes_known) (sink, md5, 16)) goto bail; + if (! (* sink->next_uint) (sink, len)) goto bail; + if (! (* sink->next_bool) (sink, isdata)) goto bail; + if (! (* sink->next_bool) (sink, sequential)) goto bail; + return TRUE; +bail: + return FALSE; +} + +gboolean +serialize_xdeltasourceinfo_obj_internal (SerialSink *sink, SerialXdeltaSourceInfo* obj) +{ + return serialize_xdeltasourceinfo_internal (sink, obj->name, obj->md5, obj->len, obj->isdata, obj->sequential); +} + +gboolean +serialize_xdeltasourceinfo (SerialSink *sink, const gchar* name, const guint8 md5[16], guint32 len, gboolean isdata, gboolean sequential) +{ + if (! (* sink->sink_type) (sink, ST_XdeltaSourceInfo, serializeio_count_xdeltasourceinfo (name, md5, len, isdata, sequential), TRUE)) goto bail; + if (! serialize_xdeltasourceinfo_internal (sink, name, md5, len, isdata, sequential)) goto bail; + if (sink->sink_quantum && ! sink->sink_quantum (sink)) goto bail; + return TRUE; +bail: + return FALSE; +} + +gboolean +serialize_xdeltasourceinfo_obj (SerialSink *sink, const SerialXdeltaSourceInfo* obj) { + + return serialize_xdeltasourceinfo (sink, obj->name, obj->md5, obj->len, obj->isdata, obj->sequential); +} + +/* XdeltaSourceInfo Unserialize + */ + +gboolean +unserialize_xdeltasourceinfo_internal_noalloc (SerialSource *source, SerialXdeltaSourceInfo* result) +{ + if (! (* source->next_string) (source, &result->name)) goto bail; + if (! (* source->next_bytes_known) (source, result->md5, 16)) goto bail; + if (! (* source->next_uint) (source, &result->len)) goto bail; + if (! (* source->next_bool) (source, &result->isdata)) goto bail; + if (! (* source->next_bool) (source, &result->sequential)) goto bail; + return TRUE; +bail: + return FALSE; +} + +gboolean +unserialize_xdeltasourceinfo_internal (SerialSource *source, SerialXdeltaSourceInfo** result) +{ + SerialXdeltaSourceInfo* unser; + (*result) = NULL; + unser = serializeio_source_alloc (source, sizeof (SerialXdeltaSourceInfo)); + if (! unser) goto bail; + if (! unserialize_xdeltasourceinfo_internal_noalloc (source, unser)) goto bail; + (*result) = unser; + return TRUE; +bail: + return FALSE; +} + +gboolean +unserialize_xdeltasourceinfo (SerialSource *source, SerialXdeltaSourceInfo** result) +{ + if ( (* source->source_type) (source, TRUE) != ST_XdeltaSourceInfo) goto bail; + if (! unserialize_xdeltasourceinfo_internal (source, result)) goto bail; + if (! serializeio_source_object_received (source)) goto bail; + return TRUE; +bail: + return FALSE; +} + +/* XdeltaControl Count + */ + +guint +serializeio_count_xdeltacontrol (const guint8 to_md5[16], guint32 to_len, gboolean has_data, guint32 source_info_len, SerialXdeltaSourceInfo* const* source_info, guint32 inst_len, SerialXdeltaInstruction const* inst) { + guint size = sizeof (SerialXdeltaControl); + ALIGN_8 (size); + ALIGN_8 (size); + ALIGN_8 (size); + ALIGN_8 (size); + { + gint i; + for (i = 0; i < source_info_len; i += 1) + { + size += serializeio_count_xdeltasourceinfo_obj ((source_info[i])) + sizeof (void*); + } + } + ALIGN_8 (size); + { + gint i; + for (i = 0; i < inst_len; i += 1) + { + size += serializeio_count_xdeltainstruction_obj (& (inst[i])); + } + } + ALIGN_8 (size); + return size; +} + +guint +serializeio_count_xdeltacontrol_obj (SerialXdeltaControl const* obj) { + return serializeio_count_xdeltacontrol (obj->to_md5, obj->to_len, obj->has_data, obj->source_info_len, obj->source_info, obj->inst_len, obj->inst); +} + +/* XdeltaControl Print + */ + +void +serializeio_print_xdeltacontrol_obj (SerialXdeltaControl* obj, guint indent_spaces) { + print_spaces (indent_spaces); + g_print ("[ST_XdeltaControl]\n"); + print_spaces (indent_spaces); + g_print ("to_md5 = "); + serializeio_print_bytes (obj->to_md5, 16); + print_spaces (indent_spaces); + g_print ("to_len = "); + g_print ("%d\n", obj->to_len); + print_spaces (indent_spaces); + g_print ("has_data = "); + g_print ("%s\n", obj->has_data ? "true" : "false"); + print_spaces (indent_spaces); + g_print ("source_info = "); + g_print ("{\n"); + { + gint i; + for (i = 0; i < obj->source_info_len; i += 1) + { + print_spaces (indent_spaces); + g_print ("%d: ", i); + print_spaces (indent_spaces); + serializeio_print_xdeltasourceinfo_obj ((obj->source_info[i]), indent_spaces + 2); + print_spaces (indent_spaces); +; + } + } + g_print ("}\n"); + print_spaces (indent_spaces); + g_print ("inst = "); + g_print ("{\n"); + { + gint i; + for (i = 0; i < obj->inst_len; i += 1) + { + print_spaces (indent_spaces); + g_print ("%d: ", i); + print_spaces (indent_spaces); + serializeio_print_xdeltainstruction_obj (& (obj->inst[i]), indent_spaces + 2); + print_spaces (indent_spaces); +; + } + } + g_print ("}\n"); +} + +/* XdeltaControl Serialize + */ + +gboolean +serialize_xdeltacontrol_internal (SerialSink *sink, const guint8 to_md5[16], guint32 to_len, gboolean has_data, guint32 source_info_len, SerialXdeltaSourceInfo* const* source_info, guint32 inst_len, SerialXdeltaInstruction const* inst) +{ + if (! (* sink->next_bytes_known) (sink, to_md5, 16)) goto bail; + if (! (* sink->next_uint) (sink, to_len)) goto bail; + if (! (* sink->next_bool) (sink, has_data)) goto bail; + { + gint i; + if (! (* sink->next_uint) (sink, source_info_len)) goto bail; + for (i = 0; i < source_info_len; i += 1) + { + if (! serialize_xdeltasourceinfo_internal (sink, (source_info[i])->name, (source_info[i])->md5, (source_info[i])->len, (source_info[i])->isdata, (source_info[i])->sequential)) goto bail; + } + } + { + gint i; + if (! (* sink->next_uint) (sink, inst_len)) goto bail; + for (i = 0; i < inst_len; i += 1) + { + if (! serialize_xdeltainstruction_internal (sink, (inst[i]).index, (inst[i]).offset, (inst[i]).length)) goto bail; + } + } + return TRUE; +bail: + return FALSE; +} + +gboolean +serialize_xdeltacontrol_obj_internal (SerialSink *sink, SerialXdeltaControl* obj) +{ + return serialize_xdeltacontrol_internal (sink, obj->to_md5, obj->to_len, obj->has_data, obj->source_info_len, obj->source_info, obj->inst_len, obj->inst); +} + +gboolean +serialize_xdeltacontrol (SerialSink *sink, const guint8 to_md5[16], guint32 to_len, gboolean has_data, guint32 source_info_len, SerialXdeltaSourceInfo* const* source_info, guint32 inst_len, SerialXdeltaInstruction const* inst) +{ + if (! (* sink->sink_type) (sink, ST_XdeltaControl, serializeio_count_xdeltacontrol (to_md5, to_len, has_data, source_info_len, source_info, inst_len, inst), TRUE)) goto bail; + if (! serialize_xdeltacontrol_internal (sink, to_md5, to_len, has_data, source_info_len, source_info, inst_len, inst)) goto bail; + if (sink->sink_quantum && ! sink->sink_quantum (sink)) goto bail; + return TRUE; +bail: + return FALSE; +} + +gboolean +serialize_xdeltacontrol_obj (SerialSink *sink, const SerialXdeltaControl* obj) { + + return serialize_xdeltacontrol (sink, obj->to_md5, obj->to_len, obj->has_data, obj->source_info_len, obj->source_info, obj->inst_len, obj->inst); +} + +/* XdeltaControl Unserialize + */ + +gboolean +unserialize_xdeltacontrol_internal_noalloc (SerialSource *source, SerialXdeltaControl* result) +{ + if (! (* source->next_bytes_known) (source, result->to_md5, 16)) goto bail; + if (! (* source->next_uint) (source, &result->to_len)) goto bail; + if (! (* source->next_bool) (source, &result->has_data)) goto bail; + { + gint i; + if (! (* source->next_uint) (source, &result->source_info_len)) goto bail; + if (! (result->source_info = serializeio_source_alloc (source, sizeof (SerialXdeltaSourceInfo*) * result->source_info_len))) goto bail; + for (i = 0; i < result->source_info_len; i += 1) + { + if (! unserialize_xdeltasourceinfo_internal (source, &(result->source_info[i]))) goto bail; + } + } + { + gint i; + if (! (* source->next_uint) (source, &result->inst_len)) goto bail; + if (! (result->inst = serializeio_source_alloc (source, sizeof (SerialXdeltaInstruction) * result->inst_len))) goto bail; + for (i = 0; i < result->inst_len; i += 1) + { + if (! unserialize_xdeltainstruction_internal_noalloc (source, &(result->inst[i]))) goto bail; + } + } + return TRUE; +bail: + return FALSE; +} + +gboolean +unserialize_xdeltacontrol_internal (SerialSource *source, SerialXdeltaControl** result) +{ + SerialXdeltaControl* unser; + (*result) = NULL; + unser = serializeio_source_alloc (source, sizeof (SerialXdeltaControl)); + if (! unser) goto bail; + if (! unserialize_xdeltacontrol_internal_noalloc (source, unser)) goto bail; + (*result) = unser; + return TRUE; +bail: + return FALSE; +} + +gboolean +unserialize_xdeltacontrol (SerialSource *source, SerialXdeltaControl** result) +{ + if ( (* source->source_type) (source, TRUE) != ST_XdeltaControl) goto bail; + if (! unserialize_xdeltacontrol_internal (source, result)) goto bail; + if (! serializeio_source_object_received (source)) goto bail; + return TRUE; +bail: + return FALSE; +} + +/* XdeltaInstruction Count + */ + +guint +serializeio_count_xdeltainstruction (guint32 index, guint32 offset, guint32 length) { + guint size = sizeof (SerialXdeltaInstruction); + ALIGN_8 (size); + ALIGN_8 (size); + ALIGN_8 (size); + ALIGN_8 (size); + return size; +} + +guint +serializeio_count_xdeltainstruction_obj (SerialXdeltaInstruction const* obj) { + return serializeio_count_xdeltainstruction (obj->index, obj->offset, obj->length); +} + +/* XdeltaInstruction Print + */ + +void +serializeio_print_xdeltainstruction_obj (SerialXdeltaInstruction* obj, guint indent_spaces) { + print_spaces (indent_spaces); + g_print ("[ST_XdeltaInstruction]\n"); + print_spaces (indent_spaces); + g_print ("index = "); + g_print ("%d\n", obj->index); + print_spaces (indent_spaces); + g_print ("offset = "); + g_print ("%d\n", obj->offset); + print_spaces (indent_spaces); + g_print ("length = "); + g_print ("%d\n", obj->length); +} + +/* XdeltaInstruction Serialize + */ + +gboolean +serialize_xdeltainstruction_internal (SerialSink *sink, guint32 index, guint32 offset, guint32 length) +{ + if (! (* sink->next_uint) (sink, index)) goto bail; + if (! (* sink->next_uint) (sink, offset)) goto bail; + if (! (* sink->next_uint) (sink, length)) goto bail; + return TRUE; +bail: + return FALSE; +} + +gboolean +serialize_xdeltainstruction_obj_internal (SerialSink *sink, SerialXdeltaInstruction* obj) +{ + return serialize_xdeltainstruction_internal (sink, obj->index, obj->offset, obj->length); +} + +gboolean +serialize_xdeltainstruction (SerialSink *sink, guint32 index, guint32 offset, guint32 length) +{ + if (! (* sink->sink_type) (sink, ST_XdeltaInstruction, serializeio_count_xdeltainstruction (index, offset, length), TRUE)) goto bail; + if (! serialize_xdeltainstruction_internal (sink, index, offset, length)) goto bail; + if (sink->sink_quantum && ! sink->sink_quantum (sink)) goto bail; + return TRUE; +bail: + return FALSE; +} + +gboolean +serialize_xdeltainstruction_obj (SerialSink *sink, const SerialXdeltaInstruction* obj) { + + return serialize_xdeltainstruction (sink, obj->index, obj->offset, obj->length); +} + +/* XdeltaInstruction Unserialize + */ + +gboolean +unserialize_xdeltainstruction_internal_noalloc (SerialSource *source, SerialXdeltaInstruction* result) +{ + if (! (* source->next_uint) (source, &result->index)) goto bail; + if (! (* source->next_uint) (source, &result->offset)) goto bail; + if (! (* source->next_uint) (source, &result->length)) goto bail; + return TRUE; +bail: + return FALSE; +} + +gboolean +unserialize_xdeltainstruction_internal (SerialSource *source, SerialXdeltaInstruction** result) +{ + SerialXdeltaInstruction* unser; + (*result) = NULL; + unser = serializeio_source_alloc (source, sizeof (SerialXdeltaInstruction)); + if (! unser) goto bail; + if (! unserialize_xdeltainstruction_internal_noalloc (source, unser)) goto bail; + (*result) = unser; + return TRUE; +bail: + return FALSE; +} + +gboolean +unserialize_xdeltainstruction (SerialSource *source, SerialXdeltaInstruction** result) +{ + if ( (* source->source_type) (source, TRUE) != ST_XdeltaInstruction) goto bail; + if (! unserialize_xdeltainstruction_internal (source, result)) goto bail; + if (! serializeio_source_object_received (source)) goto bail; + return TRUE; +bail: + return FALSE; +} + +/* RsyncIndexElt Count + */ + +guint +serializeio_count_rsyncindexelt (const guint8 md5[16], SerialXdeltaChecksum const* cksum) { + guint size = sizeof (SerialRsyncIndexElt); + ALIGN_8 (size); + ALIGN_8 (size); + size += serializeio_count_xdeltachecksum_obj (cksum) - sizeof (SerialXdeltaChecksum); + ALIGN_8 (size); + return size; +} + +guint +serializeio_count_rsyncindexelt_obj (SerialRsyncIndexElt const* obj) { + return serializeio_count_rsyncindexelt (obj->md5, &obj->cksum); +} + +/* RsyncIndexElt Print + */ + +void +serializeio_print_rsyncindexelt_obj (SerialRsyncIndexElt* obj, guint indent_spaces) { + print_spaces (indent_spaces); + g_print ("[ST_RsyncIndexElt]\n"); + print_spaces (indent_spaces); + g_print ("md5 = "); + serializeio_print_bytes (obj->md5, 16); + print_spaces (indent_spaces); + g_print ("cksum = "); + g_print ("{\n"); + serializeio_print_xdeltachecksum_obj (& obj->cksum, indent_spaces + 2); + print_spaces (indent_spaces); +; + g_print ("}\n"); +} + +/* RsyncIndexElt Serialize + */ + +gboolean +serialize_rsyncindexelt_internal (SerialSink *sink, const guint8 md5[16], SerialXdeltaChecksum const* cksum) +{ + if (! (* sink->next_bytes_known) (sink, md5, 16)) goto bail; + if (! serialize_xdeltachecksum_internal (sink, cksum->high, cksum->low)) goto bail; + return TRUE; +bail: + return FALSE; +} + +gboolean +serialize_rsyncindexelt_obj_internal (SerialSink *sink, SerialRsyncIndexElt* obj) +{ + return serialize_rsyncindexelt_internal (sink, obj->md5, &obj->cksum); +} + +gboolean +serialize_rsyncindexelt (SerialSink *sink, const guint8 md5[16], SerialXdeltaChecksum const* cksum) +{ + if (! (* sink->sink_type) (sink, ST_RsyncIndexElt, serializeio_count_rsyncindexelt (md5, cksum), TRUE)) goto bail; + if (! serialize_rsyncindexelt_internal (sink, md5, cksum)) goto bail; + if (sink->sink_quantum && ! sink->sink_quantum (sink)) goto bail; + return TRUE; +bail: + return FALSE; +} + +gboolean +serialize_rsyncindexelt_obj (SerialSink *sink, const SerialRsyncIndexElt* obj) { + + return serialize_rsyncindexelt (sink, obj->md5, &obj->cksum); +} + +/* RsyncIndexElt Unserialize + */ + +gboolean +unserialize_rsyncindexelt_internal_noalloc (SerialSource *source, SerialRsyncIndexElt* result) +{ + if (! (* source->next_bytes_known) (source, result->md5, 16)) goto bail; + if (! unserialize_xdeltachecksum_internal_noalloc (source, &result->cksum)) goto bail; + return TRUE; +bail: + return FALSE; +} + +gboolean +unserialize_rsyncindexelt_internal (SerialSource *source, SerialRsyncIndexElt** result) +{ + SerialRsyncIndexElt* unser; + (*result) = NULL; + unser = serializeio_source_alloc (source, sizeof (SerialRsyncIndexElt)); + if (! unser) goto bail; + if (! unserialize_rsyncindexelt_internal_noalloc (source, unser)) goto bail; + (*result) = unser; + return TRUE; +bail: + return FALSE; +} + +gboolean +unserialize_rsyncindexelt (SerialSource *source, SerialRsyncIndexElt** result) +{ + if ( (* source->source_type) (source, TRUE) != ST_RsyncIndexElt) goto bail; + if (! unserialize_rsyncindexelt_internal (source, result)) goto bail; + if (! serializeio_source_object_received (source)) goto bail; + return TRUE; +bail: + return FALSE; +} + +/* RsyncIndex Count + */ + +guint +serializeio_count_rsyncindex (guint32 seg_len, guint32 file_len, const guint8 file_md5[16], guint32 index_len, SerialRsyncIndexElt const* index) { + guint size = sizeof (SerialRsyncIndex); + ALIGN_8 (size); + ALIGN_8 (size); + ALIGN_8 (size); + ALIGN_8 (size); + { + gint i; + for (i = 0; i < index_len; i += 1) + { + size += serializeio_count_rsyncindexelt_obj (& (index[i])); + } + } + ALIGN_8 (size); + return size; +} + +guint +serializeio_count_rsyncindex_obj (SerialRsyncIndex const* obj) { + return serializeio_count_rsyncindex (obj->seg_len, obj->file_len, obj->file_md5, obj->index_len, obj->index); +} + +/* RsyncIndex Print + */ + +void +serializeio_print_rsyncindex_obj (SerialRsyncIndex* obj, guint indent_spaces) { + print_spaces (indent_spaces); + g_print ("[ST_RsyncIndex]\n"); + print_spaces (indent_spaces); + g_print ("seg_len = "); + g_print ("%d\n", obj->seg_len); + print_spaces (indent_spaces); + g_print ("file_len = "); + g_print ("%d\n", obj->file_len); + print_spaces (indent_spaces); + g_print ("file_md5 = "); + serializeio_print_bytes (obj->file_md5, 16); + print_spaces (indent_spaces); + g_print ("index = "); + g_print ("{\n"); + { + gint i; + for (i = 0; i < obj->index_len; i += 1) + { + print_spaces (indent_spaces); + g_print ("%d: ", i); + print_spaces (indent_spaces); + serializeio_print_rsyncindexelt_obj (& (obj->index[i]), indent_spaces + 2); + print_spaces (indent_spaces); +; + } + } + g_print ("}\n"); +} + +/* RsyncIndex Serialize + */ + +gboolean +serialize_rsyncindex_internal (SerialSink *sink, guint32 seg_len, guint32 file_len, const guint8 file_md5[16], guint32 index_len, SerialRsyncIndexElt const* index) +{ + if (! (* sink->next_uint) (sink, seg_len)) goto bail; + if (! (* sink->next_uint) (sink, file_len)) goto bail; + if (! (* sink->next_bytes_known) (sink, file_md5, 16)) goto bail; + { + gint i; + if (! (* sink->next_uint) (sink, index_len)) goto bail; + for (i = 0; i < index_len; i += 1) + { + if (! serialize_rsyncindexelt_internal (sink, (index[i]).md5, &(index[i]).cksum)) goto bail; + } + } + return TRUE; +bail: + return FALSE; +} + +gboolean +serialize_rsyncindex_obj_internal (SerialSink *sink, SerialRsyncIndex* obj) +{ + return serialize_rsyncindex_internal (sink, obj->seg_len, obj->file_len, obj->file_md5, obj->index_len, obj->index); +} + +gboolean +serialize_rsyncindex (SerialSink *sink, guint32 seg_len, guint32 file_len, const guint8 file_md5[16], guint32 index_len, SerialRsyncIndexElt const* index) +{ + if (! (* sink->sink_type) (sink, ST_RsyncIndex, serializeio_count_rsyncindex (seg_len, file_len, file_md5, index_len, index), TRUE)) goto bail; + if (! serialize_rsyncindex_internal (sink, seg_len, file_len, file_md5, index_len, index)) goto bail; + if (sink->sink_quantum && ! sink->sink_quantum (sink)) goto bail; + return TRUE; +bail: + return FALSE; +} + +gboolean +serialize_rsyncindex_obj (SerialSink *sink, const SerialRsyncIndex* obj) { + + return serialize_rsyncindex (sink, obj->seg_len, obj->file_len, obj->file_md5, obj->index_len, obj->index); +} + +/* RsyncIndex Unserialize + */ + +gboolean +unserialize_rsyncindex_internal_noalloc (SerialSource *source, SerialRsyncIndex* result) +{ + if (! (* source->next_uint) (source, &result->seg_len)) goto bail; + if (! (* source->next_uint) (source, &result->file_len)) goto bail; + if (! (* source->next_bytes_known) (source, result->file_md5, 16)) goto bail; + { + gint i; + if (! (* source->next_uint) (source, &result->index_len)) goto bail; + if (! (result->index = serializeio_source_alloc (source, sizeof (SerialRsyncIndexElt) * result->index_len))) goto bail; + for (i = 0; i < result->index_len; i += 1) + { + if (! unserialize_rsyncindexelt_internal_noalloc (source, &(result->index[i]))) goto bail; + } + } + return TRUE; +bail: + return FALSE; +} + +gboolean +unserialize_rsyncindex_internal (SerialSource *source, SerialRsyncIndex** result) +{ + SerialRsyncIndex* unser; + (*result) = NULL; + unser = serializeio_source_alloc (source, sizeof (SerialRsyncIndex)); + if (! unser) goto bail; + if (! unserialize_rsyncindex_internal_noalloc (source, unser)) goto bail; + (*result) = unser; + return TRUE; +bail: + return FALSE; +} + +gboolean +unserialize_rsyncindex (SerialSource *source, SerialRsyncIndex** result) +{ + if ( (* source->source_type) (source, TRUE) != ST_RsyncIndex) goto bail; + if (! unserialize_rsyncindex_internal (source, result)) goto bail; + if (! serializeio_source_object_received (source)) goto bail; + return TRUE; +bail: + return FALSE; +} + +/* Version0SourceInfo Count + */ + +guint +serializeio_count_version0sourceinfo (const guint8 md5[16], const guint8 real_md5[16], guint32 length) { + guint size = sizeof (SerialVersion0SourceInfo); + ALIGN_8 (size); + ALIGN_8 (size); + ALIGN_8 (size); + ALIGN_8 (size); + return size; +} + +guint +serializeio_count_version0sourceinfo_obj (SerialVersion0SourceInfo const* obj) { + return serializeio_count_version0sourceinfo (obj->md5, obj->real_md5, obj->length); +} + +/* Version0SourceInfo Print + */ + +void +serializeio_print_version0sourceinfo_obj (SerialVersion0SourceInfo* obj, guint indent_spaces) { + print_spaces (indent_spaces); + g_print ("[ST_Version0SourceInfo]\n"); + print_spaces (indent_spaces); + g_print ("md5 = "); + serializeio_print_bytes (obj->md5, 16); + print_spaces (indent_spaces); + g_print ("real_md5 = "); + serializeio_print_bytes (obj->real_md5, 16); + print_spaces (indent_spaces); + g_print ("length = "); + g_print ("%d\n", obj->length); +} + +/* Version0SourceInfo Serialize + */ + +gboolean +serialize_version0sourceinfo_internal (SerialSink *sink, const guint8 md5[16], const guint8 real_md5[16], guint32 length) +{ + if (! (* sink->next_bytes_known) (sink, md5, 16)) goto bail; + if (! (* sink->next_bytes_known) (sink, real_md5, 16)) goto bail; + if (! (* sink->next_uint) (sink, length)) goto bail; + return TRUE; +bail: + return FALSE; +} + +gboolean +serialize_version0sourceinfo_obj_internal (SerialSink *sink, SerialVersion0SourceInfo* obj) +{ + return serialize_version0sourceinfo_internal (sink, obj->md5, obj->real_md5, obj->length); +} + +gboolean +serialize_version0sourceinfo (SerialSink *sink, const guint8 md5[16], const guint8 real_md5[16], guint32 length) +{ + if (! (* sink->sink_type) (sink, ST_Version0SourceInfo, serializeio_count_version0sourceinfo (md5, real_md5, length), TRUE)) goto bail; + if (! serialize_version0sourceinfo_internal (sink, md5, real_md5, length)) goto bail; + if (sink->sink_quantum && ! sink->sink_quantum (sink)) goto bail; + return TRUE; +bail: + return FALSE; +} + +gboolean +serialize_version0sourceinfo_obj (SerialSink *sink, const SerialVersion0SourceInfo* obj) { + + return serialize_version0sourceinfo (sink, obj->md5, obj->real_md5, obj->length); +} + +/* Version0SourceInfo Unserialize + */ + +gboolean +unserialize_version0sourceinfo_internal_noalloc (SerialSource *source, SerialVersion0SourceInfo* result) +{ + if (! (* source->next_bytes_known) (source, result->md5, 16)) goto bail; + if (! (* source->next_bytes_known) (source, result->real_md5, 16)) goto bail; + if (! (* source->next_uint) (source, &result->length)) goto bail; + return TRUE; +bail: + return FALSE; +} + +gboolean +unserialize_version0sourceinfo_internal (SerialSource *source, SerialVersion0SourceInfo** result) +{ + SerialVersion0SourceInfo* unser; + (*result) = NULL; + unser = serializeio_source_alloc (source, sizeof (SerialVersion0SourceInfo)); + if (! unser) goto bail; + if (! unserialize_version0sourceinfo_internal_noalloc (source, unser)) goto bail; + (*result) = unser; + return TRUE; +bail: + return FALSE; +} + +gboolean +unserialize_version0sourceinfo (SerialSource *source, SerialVersion0SourceInfo** result) +{ + if ( (* source->source_type) (source, TRUE) != ST_Version0SourceInfo) goto bail; + if (! unserialize_version0sourceinfo_internal (source, result)) goto bail; + if (! serializeio_source_object_received (source)) goto bail; + return TRUE; +bail: + return FALSE; +} + +/* Version0Control Count + */ + +guint +serializeio_count_version0control (gboolean normalized, guint32 data_len, SerialVersion0SourceInfo const* to_info, guint32 source_info_len, SerialVersion0SourceInfo* const* source_info, guint32 inst_len, SerialVersion0Instruction const* inst) { + guint size = sizeof (SerialVersion0Control); + ALIGN_8 (size); + ALIGN_8 (size); + ALIGN_8 (size); + size += serializeio_count_version0sourceinfo_obj (to_info) - sizeof (SerialVersion0SourceInfo); + ALIGN_8 (size); + { + gint i; + for (i = 0; i < source_info_len; i += 1) + { + size += serializeio_count_version0sourceinfo_obj ((source_info[i])) + sizeof (void*); + } + } + ALIGN_8 (size); + { + gint i; + for (i = 0; i < inst_len; i += 1) + { + size += serializeio_count_version0instruction_obj (& (inst[i])); + } + } + ALIGN_8 (size); + return size; +} + +guint +serializeio_count_version0control_obj (SerialVersion0Control const* obj) { + return serializeio_count_version0control (obj->normalized, obj->data_len, &obj->to_info, obj->source_info_len, obj->source_info, obj->inst_len, obj->inst); +} + +/* Version0Control Print + */ + +void +serializeio_print_version0control_obj (SerialVersion0Control* obj, guint indent_spaces) { + print_spaces (indent_spaces); + g_print ("[ST_Version0Control]\n"); + print_spaces (indent_spaces); + g_print ("normalized = "); + g_print ("%s\n", obj->normalized ? "true" : "false"); + print_spaces (indent_spaces); + g_print ("data_len = "); + g_print ("%d\n", obj->data_len); + print_spaces (indent_spaces); + g_print ("to_info = "); + g_print ("{\n"); + serializeio_print_version0sourceinfo_obj (& obj->to_info, indent_spaces + 2); + print_spaces (indent_spaces); +; + g_print ("}\n"); + print_spaces (indent_spaces); + g_print ("source_info = "); + g_print ("{\n"); + { + gint i; + for (i = 0; i < obj->source_info_len; i += 1) + { + print_spaces (indent_spaces); + g_print ("%d: ", i); + print_spaces (indent_spaces); + serializeio_print_version0sourceinfo_obj ((obj->source_info[i]), indent_spaces + 2); + print_spaces (indent_spaces); +; + } + } + g_print ("}\n"); + print_spaces (indent_spaces); + g_print ("inst = "); + g_print ("{\n"); + { + gint i; + for (i = 0; i < obj->inst_len; i += 1) + { + print_spaces (indent_spaces); + g_print ("%d: ", i); + print_spaces (indent_spaces); + serializeio_print_version0instruction_obj (& (obj->inst[i]), indent_spaces + 2); + print_spaces (indent_spaces); +; + } + } + g_print ("}\n"); +} + +/* Version0Control Serialize + */ + +gboolean +serialize_version0control_internal (SerialSink *sink, gboolean normalized, guint32 data_len, SerialVersion0SourceInfo const* to_info, guint32 source_info_len, SerialVersion0SourceInfo* const* source_info, guint32 inst_len, SerialVersion0Instruction const* inst) +{ + if (! (* sink->next_bool) (sink, normalized)) goto bail; + if (! (* sink->next_uint) (sink, data_len)) goto bail; + if (! serialize_version0sourceinfo_internal (sink, to_info->md5, to_info->real_md5, to_info->length)) goto bail; + { + gint i; + if (! (* sink->next_uint) (sink, source_info_len)) goto bail; + for (i = 0; i < source_info_len; i += 1) + { + if (! serialize_version0sourceinfo_internal (sink, (source_info[i])->md5, (source_info[i])->real_md5, (source_info[i])->length)) goto bail; + } + } + { + gint i; + if (! (* sink->next_uint) (sink, inst_len)) goto bail; + for (i = 0; i < inst_len; i += 1) + { + if (! serialize_version0instruction_internal (sink, (inst[i]).offset, (inst[i]).length)) goto bail; + } + } + return TRUE; +bail: + return FALSE; +} + +gboolean +serialize_version0control_obj_internal (SerialSink *sink, SerialVersion0Control* obj) +{ + return serialize_version0control_internal (sink, obj->normalized, obj->data_len, &obj->to_info, obj->source_info_len, obj->source_info, obj->inst_len, obj->inst); +} + +gboolean +serialize_version0control (SerialSink *sink, gboolean normalized, guint32 data_len, SerialVersion0SourceInfo const* to_info, guint32 source_info_len, SerialVersion0SourceInfo* const* source_info, guint32 inst_len, SerialVersion0Instruction const* inst) +{ + if (! (* sink->sink_type) (sink, ST_Version0Control, serializeio_count_version0control (normalized, data_len, to_info, source_info_len, source_info, inst_len, inst), TRUE)) goto bail; + if (! serialize_version0control_internal (sink, normalized, data_len, to_info, source_info_len, source_info, inst_len, inst)) goto bail; + if (sink->sink_quantum && ! sink->sink_quantum (sink)) goto bail; + return TRUE; +bail: + return FALSE; +} + +gboolean +serialize_version0control_obj (SerialSink *sink, const SerialVersion0Control* obj) { + + return serialize_version0control (sink, obj->normalized, obj->data_len, &obj->to_info, obj->source_info_len, obj->source_info, obj->inst_len, obj->inst); +} + +/* Version0Control Unserialize + */ + +gboolean +unserialize_version0control_internal_noalloc (SerialSource *source, SerialVersion0Control* result) +{ + if (! (* source->next_bool) (source, &result->normalized)) goto bail; + if (! (* source->next_uint) (source, &result->data_len)) goto bail; + if (! unserialize_version0sourceinfo_internal_noalloc (source, &result->to_info)) goto bail; + { + gint i; + if (! (* source->next_uint) (source, &result->source_info_len)) goto bail; + if (! (result->source_info = serializeio_source_alloc (source, sizeof (SerialVersion0SourceInfo*) * result->source_info_len))) goto bail; + for (i = 0; i < result->source_info_len; i += 1) + { + if (! unserialize_version0sourceinfo_internal (source, &(result->source_info[i]))) goto bail; + } + } + { + gint i; + if (! (* source->next_uint) (source, &result->inst_len)) goto bail; + if (! (result->inst = serializeio_source_alloc (source, sizeof (SerialVersion0Instruction) * result->inst_len))) goto bail; + for (i = 0; i < result->inst_len; i += 1) + { + if (! unserialize_version0instruction_internal_noalloc (source, &(result->inst[i]))) goto bail; + } + } + return TRUE; +bail: + return FALSE; +} + +gboolean +unserialize_version0control_internal (SerialSource *source, SerialVersion0Control** result) +{ + SerialVersion0Control* unser; + (*result) = NULL; + unser = serializeio_source_alloc (source, sizeof (SerialVersion0Control)); + if (! unser) goto bail; + if (! unserialize_version0control_internal_noalloc (source, unser)) goto bail; + (*result) = unser; + return TRUE; +bail: + return FALSE; +} + +gboolean +unserialize_version0control (SerialSource *source, SerialVersion0Control** result) +{ + if ( (* source->source_type) (source, TRUE) != ST_Version0Control) goto bail; + if (! unserialize_version0control_internal (source, result)) goto bail; + if (! serializeio_source_object_received (source)) goto bail; + return TRUE; +bail: + return FALSE; +} + +/* Version0Instruction Count + */ + +guint +serializeio_count_version0instruction (guint32 offset, guint32 length) { + guint size = sizeof (SerialVersion0Instruction); + ALIGN_8 (size); + ALIGN_8 (size); + ALIGN_8 (size); + return size; +} + +guint +serializeio_count_version0instruction_obj (SerialVersion0Instruction const* obj) { + return serializeio_count_version0instruction (obj->offset, obj->length); +} + +/* Version0Instruction Print + */ + +void +serializeio_print_version0instruction_obj (SerialVersion0Instruction* obj, guint indent_spaces) { + print_spaces (indent_spaces); + g_print ("[ST_Version0Instruction]\n"); + print_spaces (indent_spaces); + g_print ("offset = "); + g_print ("%d\n", obj->offset); + print_spaces (indent_spaces); + g_print ("length = "); + g_print ("%d\n", obj->length); +} + +/* Version0Instruction Serialize + */ + +gboolean +serialize_version0instruction_internal (SerialSink *sink, guint32 offset, guint32 length) +{ + if (! (* sink->next_uint) (sink, offset)) goto bail; + if (! (* sink->next_uint) (sink, length)) goto bail; + return TRUE; +bail: + return FALSE; +} + +gboolean +serialize_version0instruction_obj_internal (SerialSink *sink, SerialVersion0Instruction* obj) +{ + return serialize_version0instruction_internal (sink, obj->offset, obj->length); +} + +gboolean +serialize_version0instruction (SerialSink *sink, guint32 offset, guint32 length) +{ + if (! (* sink->sink_type) (sink, ST_Version0Instruction, serializeio_count_version0instruction (offset, length), TRUE)) goto bail; + if (! serialize_version0instruction_internal (sink, offset, length)) goto bail; + if (sink->sink_quantum && ! sink->sink_quantum (sink)) goto bail; + return TRUE; +bail: + return FALSE; +} + +gboolean +serialize_version0instruction_obj (SerialSink *sink, const SerialVersion0Instruction* obj) { + + return serialize_version0instruction (sink, obj->offset, obj->length); +} + +/* Version0Instruction Unserialize + */ + +gboolean +unserialize_version0instruction_internal_noalloc (SerialSource *source, SerialVersion0Instruction* result) +{ + if (! (* source->next_uint) (source, &result->offset)) goto bail; + if (! (* source->next_uint) (source, &result->length)) goto bail; + return TRUE; +bail: + return FALSE; +} + +gboolean +unserialize_version0instruction_internal (SerialSource *source, SerialVersion0Instruction** result) +{ + SerialVersion0Instruction* unser; + (*result) = NULL; + unser = serializeio_source_alloc (source, sizeof (SerialVersion0Instruction)); + if (! unser) goto bail; + if (! unserialize_version0instruction_internal_noalloc (source, unser)) goto bail; + (*result) = unser; + return TRUE; +bail: + return FALSE; +} + +gboolean +unserialize_version0instruction (SerialSource *source, SerialVersion0Instruction** result) +{ + if ( (* source->source_type) (source, TRUE) != ST_Version0Instruction) goto bail; + if (! unserialize_version0instruction_internal (source, result)) goto bail; + if (! serializeio_source_object_received (source)) goto bail; + return TRUE; +bail: + return FALSE; +} + +void +xd_generate_void_event_internal (XdVoidEventCode _code, const char* _srcfile, gint _srcline) +{ + XdVoidEvent *_e = g_new0 (XdVoidEvent, 1); + _e->code = _code.code; + _e->srcline = _srcline; + _e->srcfile = _srcfile; + eventdelivery_event_deliver ((GenericEvent*) _e); +} + +const XdVoidEventCode EC_XdTooFewSources = { EC_XdTooFewSourcesValue }; + +const XdVoidEventCode EC_XdTooManySources = { EC_XdTooManySourcesValue }; + +void +xd_generate_int_event_internal (XdIntEventCode _code, const char* _srcfile, gint _srcline, int index) +{ + XdIntEvent *_e = g_new0 (XdIntEvent, 1); + _e->code = _code.code; + _e->srcline = _srcline; + _e->srcfile = _srcfile; + _e->index = index; + eventdelivery_event_deliver ((GenericEvent*) _e); +} + +const char* +Xd_Int_event_field_to_string (GenericEvent* ev, gint field) +{ + XdIntEvent* it = (XdIntEvent*) ev; + switch (field) + { + case 0: return eventdelivery_int_to_string (it->index); + default: abort (); + } +} + +const XdIntEventCode EC_XdOutOfRangeSourceIndex = { EC_XdOutOfRangeSourceIndexValue }; + +const XdVoidEventCode EC_XdInvalidControl = { EC_XdInvalidControlValue }; + +const XdVoidEventCode EC_XdInvalidRsyncCache = { EC_XdInvalidRsyncCacheValue }; + +const XdVoidEventCode EC_XdIncompatibleDelta = { EC_XdIncompatibleDeltaValue }; + +void +xd_generate_handlestringstring_event_internal (XdHandleStringStringEventCode _code, const char* _srcfile, gint _srcline, FileHandle* stream, const char* expected, const char* received) +{ + XdHandleStringStringEvent *_e = g_new0 (XdHandleStringStringEvent, 1); + _e->code = _code.code; + _e->srcline = _srcline; + _e->srcfile = _srcfile; + _e->stream = stream; + _e->expected = expected; + _e->received = received; + eventdelivery_event_deliver ((GenericEvent*) _e); +} + +const char* +Xd_HandleStringString_event_field_to_string (GenericEvent* ev, gint field) +{ + XdHandleStringStringEvent* it = (XdHandleStringStringEvent*) ev; + switch (field) + { + case 0: return eventdelivery_handle_to_string (it->stream); + case 1: return eventdelivery_string_to_string (it->expected); + case 2: return eventdelivery_string_to_string (it->received); + default: abort (); + } +} + +const XdHandleStringStringEventCode EC_XdStreamChecksumFailed = { EC_XdStreamChecksumFailedValue }; + +void +xd_generate_handleintint_event_internal (XdHandleIntIntEventCode _code, const char* _srcfile, gint _srcline, FileHandle* stream, int expected, int received) +{ + XdHandleIntIntEvent *_e = g_new0 (XdHandleIntIntEvent, 1); + _e->code = _code.code; + _e->srcline = _srcline; + _e->srcfile = _srcfile; + _e->stream = stream; + _e->expected = expected; + _e->received = received; + eventdelivery_event_deliver ((GenericEvent*) _e); +} + +const char* +Xd_HandleIntInt_event_field_to_string (GenericEvent* ev, gint field) +{ + XdHandleIntIntEvent* it = (XdHandleIntIntEvent*) ev; + switch (field) + { + case 0: return eventdelivery_handle_to_string (it->stream); + case 1: return eventdelivery_int_to_string (it->expected); + case 2: return eventdelivery_int_to_string (it->received); + default: abort (); + } +} + +const XdHandleIntIntEventCode EC_XdStreamLengthFailed = { EC_XdStreamLengthFailedValue }; + +void +xd_generate_string_event_internal (XdStringEventCode _code, const char* _srcfile, gint _srcline, const char* version) +{ + XdStringEvent *_e = g_new0 (XdStringEvent, 1); + _e->code = _code.code; + _e->srcline = _srcline; + _e->srcfile = _srcfile; + _e->version = version; + eventdelivery_event_deliver ((GenericEvent*) _e); +} + +const char* +Xd_String_event_field_to_string (GenericEvent* ev, gint field) +{ + XdStringEvent* it = (XdStringEvent*) ev; + switch (field) + { + case 0: return eventdelivery_string_to_string (it->version); + default: abort (); + } +} + +const XdStringEventCode EC_XdBackwardCompatibilityMode = { EC_XdBackwardCompatibilityModeValue }; + diff --git a/xdelta-1.1.3/xd_edsio.h b/xdelta-1.1.3/xd_edsio.h new file mode 100644 index 0000000..38958e8 --- /dev/null +++ b/xdelta-1.1.3/xd_edsio.h @@ -0,0 +1,401 @@ +/* -*-Mode: C;-*- + * Copyright (C) 1997, 1998, 1999 Josh MacDonald + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + * + * Author: Josh MacDonald + * + * This file was AUTOMATICALLY GENERATED using: + * + * $Id: xd_edsio.h,v 1.1 2004/01/05 18:54:21 icculus Exp $ + */ + +#include "edsio.h" + +#include "xdelta.h" + +#ifndef _XD_EDSIO_H_ +#define _XD_EDSIO_H_ + +#ifdef __cplusplus +extern "C" { +#endif + +#include "edsio_edsio.h" + +/* Initialize this library. */ + +gboolean xd_edsio_init (void); + +/* Types defined here. */ + +/* XdStringEventCode. + */ + +typedef struct _XdStringEventCode XdStringEventCode; +struct _XdStringEventCode { gint code; }; + +typedef struct _XdStringEvent XdStringEvent; +struct _XdStringEvent { gint code; const char* srcfile; guint srcline; const char* version; }; + +/* XdHandleIntIntEventCode. + */ + +typedef struct _XdHandleIntIntEventCode XdHandleIntIntEventCode; +struct _XdHandleIntIntEventCode { gint code; }; + +typedef struct _XdHandleIntIntEvent XdHandleIntIntEvent; +struct _XdHandleIntIntEvent { gint code; const char* srcfile; guint srcline; FileHandle* stream; int expected; int received; }; + +/* XdHandleStringStringEventCode. + */ + +typedef struct _XdHandleStringStringEventCode XdHandleStringStringEventCode; +struct _XdHandleStringStringEventCode { gint code; }; + +typedef struct _XdHandleStringStringEvent XdHandleStringStringEvent; +struct _XdHandleStringStringEvent { gint code; const char* srcfile; guint srcline; FileHandle* stream; const char* expected; const char* received; }; + +/* XdIntEventCode. + */ + +typedef struct _XdIntEventCode XdIntEventCode; +struct _XdIntEventCode { gint code; }; + +typedef struct _XdIntEvent XdIntEvent; +struct _XdIntEvent { gint code; const char* srcfile; guint srcline; int index; }; + +/* XdVoidEventCode. + */ + +typedef struct _XdVoidEventCode XdVoidEventCode; +struct _XdVoidEventCode { gint code; }; + +typedef struct _XdVoidEvent XdVoidEvent; +struct _XdVoidEvent { gint code; const char* srcfile; guint srcline; }; + +typedef struct _SerialVersion0Instruction SerialVersion0Instruction; +typedef struct _SerialVersion0Control SerialVersion0Control; +typedef struct _SerialVersion0SourceInfo SerialVersion0SourceInfo; +typedef struct _SerialRsyncIndex SerialRsyncIndex; +typedef struct _SerialRsyncIndexElt SerialRsyncIndexElt; +typedef struct _SerialXdeltaInstruction SerialXdeltaInstruction; +typedef struct _SerialXdeltaControl SerialXdeltaControl; +typedef struct _SerialXdeltaSourceInfo SerialXdeltaSourceInfo; +typedef struct _SerialXdeltaIndex SerialXdeltaIndex; +typedef struct _SerialXdeltaChecksum SerialXdeltaChecksum; +/* Functions declared here. */ + +/* Serial Types */ + +enum _SerialXdType { + + ST_XdeltaChecksum = (1<<(1+EDSIO_LIBRARY_OFFSET_BITS))+3, + ST_XdeltaIndex = (1<<(2+EDSIO_LIBRARY_OFFSET_BITS))+3, + ST_XdeltaSourceInfo = (1<<(3+EDSIO_LIBRARY_OFFSET_BITS))+3, + ST_XdeltaControl = (1<<(7+EDSIO_LIBRARY_OFFSET_BITS))+3, + ST_XdeltaInstruction = (1<<(8+EDSIO_LIBRARY_OFFSET_BITS))+3, + ST_RsyncIndexElt = (1<<(9+EDSIO_LIBRARY_OFFSET_BITS))+3, + ST_RsyncIndex = (1<<(10+EDSIO_LIBRARY_OFFSET_BITS))+3, + ST_Version0SourceInfo = (1<<(4+EDSIO_LIBRARY_OFFSET_BITS))+3, + ST_Version0Control = (1<<(5+EDSIO_LIBRARY_OFFSET_BITS))+3, + ST_Version0Instruction = (1<<(6+EDSIO_LIBRARY_OFFSET_BITS))+3 +}; + + + +/* XdeltaChecksum Structure + */ + +struct _SerialXdeltaChecksum { + guint16 high; + guint16 low; +}; + +void serializeio_print_xdeltachecksum_obj (SerialXdeltaChecksum* obj, guint indent_spaces); + +gboolean unserialize_xdeltachecksum (SerialSource *source, SerialXdeltaChecksum**); +gboolean unserialize_xdeltachecksum_internal (SerialSource *source, SerialXdeltaChecksum** ); +gboolean unserialize_xdeltachecksum_internal_noalloc (SerialSource *source, SerialXdeltaChecksum* ); +gboolean serialize_xdeltachecksum (SerialSink *sink, guint16 high, guint16 low); +gboolean serialize_xdeltachecksum_obj (SerialSink *sink, const SerialXdeltaChecksum* obj); +gboolean serialize_xdeltachecksum_internal (SerialSink *sink, guint16 high, guint16 low); +gboolean serialize_xdeltachecksum_obj_internal (SerialSink *sink, SerialXdeltaChecksum* obj); +guint serializeio_count_xdeltachecksum (guint16 high, guint16 low); +guint serializeio_count_xdeltachecksum_obj (SerialXdeltaChecksum const* obj); + +/* XdeltaIndex Structure + */ + +struct _SerialXdeltaIndex { + guint32 file_len; + guint8 file_md5[16]; + guint32 index_len; + SerialXdeltaChecksum* index; +}; + +void serializeio_print_xdeltaindex_obj (SerialXdeltaIndex* obj, guint indent_spaces); + +gboolean unserialize_xdeltaindex (SerialSource *source, SerialXdeltaIndex**); +gboolean unserialize_xdeltaindex_internal (SerialSource *source, SerialXdeltaIndex** ); +gboolean unserialize_xdeltaindex_internal_noalloc (SerialSource *source, SerialXdeltaIndex* ); +gboolean serialize_xdeltaindex (SerialSink *sink, guint32 file_len, const guint8 file_md5[16], guint32 index_len, SerialXdeltaChecksum const* index); +gboolean serialize_xdeltaindex_obj (SerialSink *sink, const SerialXdeltaIndex* obj); +gboolean serialize_xdeltaindex_internal (SerialSink *sink, guint32 file_len, const guint8 file_md5[16], guint32 index_len, SerialXdeltaChecksum const* index); +gboolean serialize_xdeltaindex_obj_internal (SerialSink *sink, SerialXdeltaIndex* obj); +guint serializeio_count_xdeltaindex (guint32 file_len, const guint8 file_md5[16], guint32 index_len, SerialXdeltaChecksum const* index); +guint serializeio_count_xdeltaindex_obj (SerialXdeltaIndex const* obj); + +/* XdeltaSourceInfo Structure + */ + +struct _SerialXdeltaSourceInfo { + const gchar* name; + guint8 md5[16]; + guint32 len; + gboolean isdata; + gboolean sequential; + guint32 position; + guint32 copies; + guint32 copy_length; + FileHandle *in; +}; + +void serializeio_print_xdeltasourceinfo_obj (SerialXdeltaSourceInfo* obj, guint indent_spaces); + +gboolean unserialize_xdeltasourceinfo (SerialSource *source, SerialXdeltaSourceInfo**); +gboolean unserialize_xdeltasourceinfo_internal (SerialSource *source, SerialXdeltaSourceInfo** ); +gboolean unserialize_xdeltasourceinfo_internal_noalloc (SerialSource *source, SerialXdeltaSourceInfo* ); +gboolean serialize_xdeltasourceinfo (SerialSink *sink, const gchar* name, const guint8 md5[16], guint32 len, gboolean isdata, gboolean sequential); +gboolean serialize_xdeltasourceinfo_obj (SerialSink *sink, const SerialXdeltaSourceInfo* obj); +gboolean serialize_xdeltasourceinfo_internal (SerialSink *sink, const gchar* name, const guint8 md5[16], guint32 len, gboolean isdata, gboolean sequential); +gboolean serialize_xdeltasourceinfo_obj_internal (SerialSink *sink, SerialXdeltaSourceInfo* obj); +guint serializeio_count_xdeltasourceinfo (const gchar* name, const guint8 md5[16], guint32 len, gboolean isdata, gboolean sequential); +guint serializeio_count_xdeltasourceinfo_obj (SerialXdeltaSourceInfo const* obj); + +/* XdeltaControl Structure + */ + +struct _SerialXdeltaControl { + guint8 to_md5[16]; + guint32 to_len; + gboolean has_data; + guint32 source_info_len; + SerialXdeltaSourceInfo** source_info; + guint32 inst_len; + SerialXdeltaInstruction* inst; + GArray *inst_array; + GPtrArray *source_info_array; +}; + +void serializeio_print_xdeltacontrol_obj (SerialXdeltaControl* obj, guint indent_spaces); + +gboolean unserialize_xdeltacontrol (SerialSource *source, SerialXdeltaControl**); +gboolean unserialize_xdeltacontrol_internal (SerialSource *source, SerialXdeltaControl** ); +gboolean unserialize_xdeltacontrol_internal_noalloc (SerialSource *source, SerialXdeltaControl* ); +gboolean serialize_xdeltacontrol (SerialSink *sink, const guint8 to_md5[16], guint32 to_len, gboolean has_data, guint32 source_info_len, SerialXdeltaSourceInfo* const* source_info, guint32 inst_len, SerialXdeltaInstruction const* inst); +gboolean serialize_xdeltacontrol_obj (SerialSink *sink, const SerialXdeltaControl* obj); +gboolean serialize_xdeltacontrol_internal (SerialSink *sink, const guint8 to_md5[16], guint32 to_len, gboolean has_data, guint32 source_info_len, SerialXdeltaSourceInfo* const* source_info, guint32 inst_len, SerialXdeltaInstruction const* inst); +gboolean serialize_xdeltacontrol_obj_internal (SerialSink *sink, SerialXdeltaControl* obj); +guint serializeio_count_xdeltacontrol (const guint8 to_md5[16], guint32 to_len, gboolean has_data, guint32 source_info_len, SerialXdeltaSourceInfo* const* source_info, guint32 inst_len, SerialXdeltaInstruction const* inst); +guint serializeio_count_xdeltacontrol_obj (SerialXdeltaControl const* obj); + +/* XdeltaInstruction Structure + */ + +struct _SerialXdeltaInstruction { + guint32 index; + guint32 offset; + guint32 length; + guint32 output_start; +}; + +void serializeio_print_xdeltainstruction_obj (SerialXdeltaInstruction* obj, guint indent_spaces); + +gboolean unserialize_xdeltainstruction (SerialSource *source, SerialXdeltaInstruction**); +gboolean unserialize_xdeltainstruction_internal (SerialSource *source, SerialXdeltaInstruction** ); +gboolean unserialize_xdeltainstruction_internal_noalloc (SerialSource *source, SerialXdeltaInstruction* ); +gboolean serialize_xdeltainstruction (SerialSink *sink, guint32 index, guint32 offset, guint32 length); +gboolean serialize_xdeltainstruction_obj (SerialSink *sink, const SerialXdeltaInstruction* obj); +gboolean serialize_xdeltainstruction_internal (SerialSink *sink, guint32 index, guint32 offset, guint32 length); +gboolean serialize_xdeltainstruction_obj_internal (SerialSink *sink, SerialXdeltaInstruction* obj); +guint serializeio_count_xdeltainstruction (guint32 index, guint32 offset, guint32 length); +guint serializeio_count_xdeltainstruction_obj (SerialXdeltaInstruction const* obj); + +/* RsyncIndexElt Structure + */ + +struct _SerialRsyncIndexElt { + guint8 md5[16]; + SerialXdeltaChecksum cksum; + SerialRsyncIndexElt* next; + gint match_offset; +}; + +void serializeio_print_rsyncindexelt_obj (SerialRsyncIndexElt* obj, guint indent_spaces); + +gboolean unserialize_rsyncindexelt (SerialSource *source, SerialRsyncIndexElt**); +gboolean unserialize_rsyncindexelt_internal (SerialSource *source, SerialRsyncIndexElt** ); +gboolean unserialize_rsyncindexelt_internal_noalloc (SerialSource *source, SerialRsyncIndexElt* ); +gboolean serialize_rsyncindexelt (SerialSink *sink, const guint8 md5[16], SerialXdeltaChecksum const* cksum); +gboolean serialize_rsyncindexelt_obj (SerialSink *sink, const SerialRsyncIndexElt* obj); +gboolean serialize_rsyncindexelt_internal (SerialSink *sink, const guint8 md5[16], SerialXdeltaChecksum const* cksum); +gboolean serialize_rsyncindexelt_obj_internal (SerialSink *sink, SerialRsyncIndexElt* obj); +guint serializeio_count_rsyncindexelt (const guint8 md5[16], SerialXdeltaChecksum const* cksum); +guint serializeio_count_rsyncindexelt_obj (SerialRsyncIndexElt const* obj); + +/* RsyncIndex Structure + */ + +struct _SerialRsyncIndex { + guint32 seg_len; + guint32 file_len; + guint8 file_md5[16]; + guint32 index_len; + SerialRsyncIndexElt* index; + SerialRsyncIndexElt** table; + guint table_size; +}; + +void serializeio_print_rsyncindex_obj (SerialRsyncIndex* obj, guint indent_spaces); + +gboolean unserialize_rsyncindex (SerialSource *source, SerialRsyncIndex**); +gboolean unserialize_rsyncindex_internal (SerialSource *source, SerialRsyncIndex** ); +gboolean unserialize_rsyncindex_internal_noalloc (SerialSource *source, SerialRsyncIndex* ); +gboolean serialize_rsyncindex (SerialSink *sink, guint32 seg_len, guint32 file_len, const guint8 file_md5[16], guint32 index_len, SerialRsyncIndexElt const* index); +gboolean serialize_rsyncindex_obj (SerialSink *sink, const SerialRsyncIndex* obj); +gboolean serialize_rsyncindex_internal (SerialSink *sink, guint32 seg_len, guint32 file_len, const guint8 file_md5[16], guint32 index_len, SerialRsyncIndexElt const* index); +gboolean serialize_rsyncindex_obj_internal (SerialSink *sink, SerialRsyncIndex* obj); +guint serializeio_count_rsyncindex (guint32 seg_len, guint32 file_len, const guint8 file_md5[16], guint32 index_len, SerialRsyncIndexElt const* index); +guint serializeio_count_rsyncindex_obj (SerialRsyncIndex const* obj); + +/* Version0SourceInfo Structure + */ + +struct _SerialVersion0SourceInfo { + guint8 md5[16]; + guint8 real_md5[16]; + guint32 length; +}; + +void serializeio_print_version0sourceinfo_obj (SerialVersion0SourceInfo* obj, guint indent_spaces); + +gboolean unserialize_version0sourceinfo (SerialSource *source, SerialVersion0SourceInfo**); +gboolean unserialize_version0sourceinfo_internal (SerialSource *source, SerialVersion0SourceInfo** ); +gboolean unserialize_version0sourceinfo_internal_noalloc (SerialSource *source, SerialVersion0SourceInfo* ); +gboolean serialize_version0sourceinfo (SerialSink *sink, const guint8 md5[16], const guint8 real_md5[16], guint32 length); +gboolean serialize_version0sourceinfo_obj (SerialSink *sink, const SerialVersion0SourceInfo* obj); +gboolean serialize_version0sourceinfo_internal (SerialSink *sink, const guint8 md5[16], const guint8 real_md5[16], guint32 length); +gboolean serialize_version0sourceinfo_obj_internal (SerialSink *sink, SerialVersion0SourceInfo* obj); +guint serializeio_count_version0sourceinfo (const guint8 md5[16], const guint8 real_md5[16], guint32 length); +guint serializeio_count_version0sourceinfo_obj (SerialVersion0SourceInfo const* obj); + +/* Version0Control Structure + */ + +struct _SerialVersion0Control { + gboolean normalized; + guint32 data_len; + SerialVersion0SourceInfo to_info; + guint32 source_info_len; + SerialVersion0SourceInfo** source_info; + guint32 inst_len; + SerialVersion0Instruction* inst; + GArray *inst_array; + GPtrArray *source_info_array; +}; + +void serializeio_print_version0control_obj (SerialVersion0Control* obj, guint indent_spaces); + +gboolean unserialize_version0control (SerialSource *source, SerialVersion0Control**); +gboolean unserialize_version0control_internal (SerialSource *source, SerialVersion0Control** ); +gboolean unserialize_version0control_internal_noalloc (SerialSource *source, SerialVersion0Control* ); +gboolean serialize_version0control (SerialSink *sink, gboolean normalized, guint32 data_len, SerialVersion0SourceInfo const* to_info, guint32 source_info_len, SerialVersion0SourceInfo* const* source_info, guint32 inst_len, SerialVersion0Instruction const* inst); +gboolean serialize_version0control_obj (SerialSink *sink, const SerialVersion0Control* obj); +gboolean serialize_version0control_internal (SerialSink *sink, gboolean normalized, guint32 data_len, SerialVersion0SourceInfo const* to_info, guint32 source_info_len, SerialVersion0SourceInfo* const* source_info, guint32 inst_len, SerialVersion0Instruction const* inst); +gboolean serialize_version0control_obj_internal (SerialSink *sink, SerialVersion0Control* obj); +guint serializeio_count_version0control (gboolean normalized, guint32 data_len, SerialVersion0SourceInfo const* to_info, guint32 source_info_len, SerialVersion0SourceInfo* const* source_info, guint32 inst_len, SerialVersion0Instruction const* inst); +guint serializeio_count_version0control_obj (SerialVersion0Control const* obj); + +/* Version0Instruction Structure + */ + +struct _SerialVersion0Instruction { + guint32 offset; + guint32 length; + guint8 type; + guint8 index; +}; + +void serializeio_print_version0instruction_obj (SerialVersion0Instruction* obj, guint indent_spaces); + +gboolean unserialize_version0instruction (SerialSource *source, SerialVersion0Instruction**); +gboolean unserialize_version0instruction_internal (SerialSource *source, SerialVersion0Instruction** ); +gboolean unserialize_version0instruction_internal_noalloc (SerialSource *source, SerialVersion0Instruction* ); +gboolean serialize_version0instruction (SerialSink *sink, guint32 offset, guint32 length); +gboolean serialize_version0instruction_obj (SerialSink *sink, const SerialVersion0Instruction* obj); +gboolean serialize_version0instruction_internal (SerialSink *sink, guint32 offset, guint32 length); +gboolean serialize_version0instruction_obj_internal (SerialSink *sink, SerialVersion0Instruction* obj); +guint serializeio_count_version0instruction (guint32 offset, guint32 length); +guint serializeio_count_version0instruction_obj (SerialVersion0Instruction const* obj); + +void xd_generate_void_event_internal (XdVoidEventCode code, const char* srcfile, gint srcline); +#define xd_generate_void_event(ecode) xd_generate_void_event_internal((ecode),__FILE__,__LINE__) + +extern const XdVoidEventCode EC_XdTooFewSources; +#define EC_XdTooFewSourcesValue ((0< + * + * $Id: xdapply.c,v 1.1 2004/01/05 18:54:21 icculus Exp $ + */ + +#include +#include + +#include "xdelta.h" +#include "xdeltapriv.h" + +/* This code used to be more general, but implemented a very + * inefficient algorithm. It is sufficient (and efficient) for the + * special case below, though, so I'm leaving it. */ +static gboolean +xdp_copy_delta_region (XdeltaControl *cont, + XdeltaOutStream *output_stream) +{ + gint i, l = cont->inst_len; + guint save_written = 0; + + for (i = 0; i < l; i += 1) + { + const XdeltaInstruction *inst = cont->inst + i; + XdeltaSourceInfo* info; + + if (inst->index >= cont->source_info_len) + { + xd_generate_int_event (EC_XdOutOfRangeSourceIndex, inst->index); + return FALSE; + } + + info = cont->source_info[inst->index]; + + if (! handle_copy (info->in, output_stream, inst->offset, inst->length)) + return FALSE; + + save_written += inst->length; + } + + return TRUE; +} + +gboolean +xdp_apply_delta (XdeltaControl *cont, + XdeltaOutStream *res) +{ + if (! xdp_copy_delta_region (cont, res)) + return FALSE; + + if (! handle_close (res, 0)) + return FALSE; + + if (! check_stream_integrity (res, cont->to_md5, cont->to_len)) + { + int i; + + /* to better report errors, check if the inputs were invalid now + */ + for (i = 0; i < cont->source_info_len; i += 1) + { + check_stream_integrity (cont->source_info[i]->in, + cont->source_info[i]->md5, + cont->source_info[i]->len); + } + + return FALSE; + } + + return TRUE; +} diff --git a/xdelta-1.1.3/xdapply.lo b/xdelta-1.1.3/xdapply.lo new file mode 100644 index 0000000..9788f70 --- /dev/null +++ b/xdelta-1.1.3/xdapply.lo @@ -0,0 +1 @@ +timestamp diff --git a/xdelta-1.1.3/xdelta b/xdelta-1.1.3/xdelta new file mode 100755 index 0000000000000000000000000000000000000000..89c14aa6f6525a2aedd842af4f3114f383dd8757 GIT binary patch literal 180689 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 MUZx*PldRasZyC3b5C8xG literal 0 HcmV?d00001 diff --git a/xdelta-1.1.3/xdelta-config b/xdelta-1.1.3/xdelta-config new file mode 100755 index 0000000..06c92c9 --- /dev/null +++ b/xdelta-1.1.3/xdelta-config @@ -0,0 +1,115 @@ +#!/bin/sh + +glib_libs="-L/usr/local/lib -lglib" +glib_cflags="-I/usr/local/include/glib-1.2 -I/usr/local/lib/glib/include" + +prefix=/usr/local +exec_prefix=${prefix} +exec_prefix_set=no + +usage() +{ + cat <&2 +fi + +lib_xdelta=yes + +while test $# -gt 0; do + case "$1" in + -*=*) optarg=`echo "$1" | sed 's/[-_a-zA-Z0-9]*=//'` ;; + *) optarg= ;; + esac + + case $1 in + --prefix=*) + prefix=$optarg + if test $exec_prefix_set = no ; then + exec_prefix=$optarg + fi + ;; + --prefix) + echo_prefix=yes + ;; + --exec-prefix=*) + exec_prefix=$optarg + exec_prefix_set=yes + ;; + --exec-prefix) + echo_exec_prefix=yes + ;; + --version) +# $Format: " echo $ReleaseVersion$" $ */ + echo 1.1.3 + exit 0 + ;; + --cflags) + echo_cflags=yes + ;; + --libs) + echo_libs=yes + ;; + xdelta) + lib_xdelta=yes + ;; + *) + usage 1 1>&2 + ;; + esac + shift +done + +if test "$echo_prefix" = "yes"; then + echo $prefix +fi + +if test "$echo_exec_prefix" = "yes"; then + echo $exec_prefix +fi + +if test "$echo_cflags" = "yes"; then + if test ${prefix}/include != /usr/include ; then + includes=-I${prefix}/include + for i in $glib_cflags ; do + if test $i = -I${prefix}/include ; then + includes="" + fi + done + fi + echo $includes $glib_cflags +fi + +if test "$echo_libs" = "yes"; then + libdirs=-L${exec_prefix}/lib + libsp="" + if test "$lib_xdelta" = "yes"; then + my_glib_libs= + for i in $glib_libs ; do + if test $i != -L${exec_prefix}/lib ; then + if test -z "$my_glib_libs" ; then + my_glib_libs="$i" + else + my_glib_libs="$my_glib_libs $i" + fi + fi + done + + libsp="$libsp -lxdelta -ledsio $my_glib_libs" + fi + + echo $libdirs $libsp +fi diff --git a/xdelta-1.1.3/xdelta-config.in b/xdelta-1.1.3/xdelta-config.in new file mode 100644 index 0000000..3226a35 --- /dev/null +++ b/xdelta-1.1.3/xdelta-config.in @@ -0,0 +1,115 @@ +#!/bin/sh + +glib_libs="@GLIB_LIBS@" +glib_cflags="@GLIB_CFLAGS@" + +prefix=@prefix@ +exec_prefix=@exec_prefix@ +exec_prefix_set=no + +usage() +{ + cat <&2 +fi + +lib_xdelta=yes + +while test $# -gt 0; do + case "$1" in + -*=*) optarg=`echo "$1" | sed 's/[-_a-zA-Z0-9]*=//'` ;; + *) optarg= ;; + esac + + case $1 in + --prefix=*) + prefix=$optarg + if test $exec_prefix_set = no ; then + exec_prefix=$optarg + fi + ;; + --prefix) + echo_prefix=yes + ;; + --exec-prefix=*) + exec_prefix=$optarg + exec_prefix_set=yes + ;; + --exec-prefix) + echo_exec_prefix=yes + ;; + --version) +# $Format: " echo $ReleaseVersion$" $ */ + echo 1.1.3 + exit 0 + ;; + --cflags) + echo_cflags=yes + ;; + --libs) + echo_libs=yes + ;; + xdelta) + lib_xdelta=yes + ;; + *) + usage 1 1>&2 + ;; + esac + shift +done + +if test "$echo_prefix" = "yes"; then + echo $prefix +fi + +if test "$echo_exec_prefix" = "yes"; then + echo $exec_prefix +fi + +if test "$echo_cflags" = "yes"; then + if test @includedir@ != /usr/include ; then + includes=-I@includedir@ + for i in $glib_cflags ; do + if test $i = -I@includedir@ ; then + includes="" + fi + done + fi + echo $includes $glib_cflags +fi + +if test "$echo_libs" = "yes"; then + libdirs=-L@libdir@ + libsp="" + if test "$lib_xdelta" = "yes"; then + my_glib_libs= + for i in $glib_libs ; do + if test $i != -L@libdir@ ; then + if test -z "$my_glib_libs" ; then + my_glib_libs="$i" + else + my_glib_libs="$my_glib_libs $i" + fi + fi + done + + libsp="$libsp -lxdelta -ledsio $my_glib_libs" + fi + + echo $libdirs $libsp +fi diff --git a/xdelta-1.1.3/xdelta.c b/xdelta-1.1.3/xdelta.c new file mode 100644 index 0000000..c39b52c --- /dev/null +++ b/xdelta-1.1.3/xdelta.c @@ -0,0 +1,1519 @@ +/* -*- Mode: C;-*- + * + * This file is part of XDelta - A binary delta generator. + * + * Copyright (C) 1997, 1998, 1999, 2001 Josh MacDonald + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + * + * Author: Josh MacDonald + * + * $Id: xdelta.c,v 1.1 2004/01/05 18:54:22 icculus Exp $ + */ + +#define G_DISABLE_ASSERT + +#include +#include +#include + +#include "xdelta.h" +#include "xdeltapriv.h" + +/* $Format: "const guint xdelta_major_version = $ReleaseMajorVersion$;" $ */ +const guint xdelta_major_version = 1; +/* $Format: "const guint xdelta_minor_version = $ReleaseMinorVersion$;" $ */ +const guint xdelta_minor_version = 1; +/* $Format: "const guint xdelta_micro_version = $ReleaseMicroVersion$;" $ */ +const guint xdelta_micro_version = 3; + +/* Control functions. + */ + +static XdeltaControl* control_version_0 (SerialVersion0Control* cont) ; +static void control_copy (XdeltaControl* cont, XdeltaSource* src, guint from, guint to); +static gboolean control_add_info (XdeltaControl* cont, XdeltaSource* src, const guint8* md5, guint len); + +#ifndef XDELTA_HARDCODE_SIZE +int QUERY_SIZE = 0; +int QUERY_SIZE_POW = 0; +int QUERY_SIZE_MASK = 0; +#endif + +int xdp_set_query_size_pow (int size_pow) +{ +#ifdef XDELTA_HARDCODE_SIZE + return XDP_QUERY_HARDCODED; +#else + + int x = 1; + int size_log = 0; + + for (; x != 0; x <<= 1, size_log += 1) + { + if (x == size_pow) + goto good; + } + + return XDP_QUERY_POW2; + + good: + + QUERY_SIZE = size_log; + QUERY_SIZE_POW = size_pow; + QUERY_SIZE_MASK = size_pow-1; + + return 0; + +#endif +} + +int +xdp_blocksize () +{ + if (QUERY_SIZE == 0) + { + xdp_set_query_size_pow (1<low = low; + cksum->high = high; +} + +/* Generate checksums + */ + +static gboolean +generate_checksums (XdeltaStream *stream, + XdeltaSource *source) +{ + gint total_checksums = handle_length (stream) / QUERY_SIZE_POW; + gint checksum_index = 0; + XdeltaChecksum cksum; + XdeltaChecksum *result; + const guint8* segment = NULL, *segment_pointer; + gint segment_len, orig_segment_len; + guint segment_page = 0; + guint pages; + +#ifdef DEBUG_CKSUM + g_print ("Total base checksums: %d\n", total_checksums); +#endif + + source->ck_count = total_checksums; + + if (total_checksums == 0) + return TRUE; + + /* This is the in-core FROM checksum table. */ + result = g_new (XdeltaChecksum, total_checksums); + source->cksums = result; + + for (pages = handle_pages (stream); segment_page <= pages; segment_page += 1) + { + segment_len = handle_map_page (stream, segment_page, &segment); + + if (segment_len < 0) + return FALSE; + + orig_segment_len = segment_len; + + segment_len >>= QUERY_SIZE; + + for (segment_pointer = segment; + segment_len != 0; + segment_len -= 1, segment_pointer += QUERY_SIZE_POW) + { + /* note: cheating at the boundaries */ + init_query_checksum (segment_pointer, &cksum); + +#ifdef DEBUG_CKSUM + g_print ("New cksum %04x %04x indices %d-%d\n", + cksum.low, cksum.high, + checksum_index * QUERY_SIZE_POW, (checksum_index * QUERY_SIZE_POW) + QUERY_SIZE_POW - 1); +#endif + + result[checksum_index++] = cksum; + } + + if (! handle_unmap_page (stream, segment_page, &segment)) + return FALSE; + } + + return TRUE; +} + +/* $Format: "#define XDELTA_REQUIRED_VERSION \"$ReleaseMajorVersion$.$ReleaseMinorVersion$.\"" $ */ +#define XDELTA_REQUIRED_VERSION "1.1." + +XdeltaGenerator* +__xdp_generator_new (const char* version) +{ + XdeltaGenerator* xg; + + if (strncmp (version, XDELTA_REQUIRED_VERSION, strlen (XDELTA_REQUIRED_VERSION)) != 0) + g_error ("XDelta library version mismatched, compiled for %s, running %s\n", version, XDELTA_VERSION); + + xg = g_new0 (XdeltaGenerator, 1); + + xg->sources = g_ptr_array_new (); + + xg->data_source = g_new0 (XdeltaSource, 1); + xg->data_source->name = "(patch data)"; + + g_ptr_array_add (xg->sources, xg->data_source); + + return xg; +} + +void +init_pos (XdeltaStream* str, XdeltaPos* pos) +{ + g_assert (str); + + memset (pos, 0, sizeof (*pos)); + + pos->page_size = handle_pagesize (str); +} + +gboolean +check_stream_integrity (XdeltaStream* str, const guint8* md5, guint len) +{ + const guint8* act_md5; + + if (len != handle_length (str)) + { + xd_generate_handleintint_event (EC_XdStreamLengthFailed, str, len, handle_length (str)); + return FALSE; + } + + act_md5 = handle_checksum_md5 (str); + + if (! act_md5) + return FALSE; + + if (memcmp (md5, act_md5, 16) != 0) + { + char exp[33], rec[33]; + + edsio_md5_to_string (md5, exp); + edsio_md5_to_string (act_md5, rec); + + xd_generate_handlestringstring_event (EC_XdStreamChecksumFailed, str, exp, rec); + g_free ((void*) act_md5); + return FALSE; + } + + g_free ((void*) act_md5); + + return TRUE; +} + +static gboolean +xdp_source_index_read (XdeltaSource *xs, + XdeltaStream *index_in) +{ + SerialSource *ss = handle_source (index_in); + XdeltaIndex *index; + + if (! ss) + return FALSE; + + if (! unserialize_xdeltaindex (ss, &index)) + return FALSE; + + if (! check_stream_integrity (xs->source_in, index->file_md5, index->file_len)) + return FALSE; + + xs->ck_count = index->index_len; + xs->cksums = index->index; + + /* @@@ how to free this? */ + + return TRUE; +} + +static gboolean +xdp_source_index_internal (XdeltaSource *init, + XdeltaStream *source_in, + XdeltaOutStream *index_out) +{ + if (! generate_checksums (source_in, init)) + return FALSE; + + if (index_out) + { + const guint8* source_in_md5; + SerialSink* sink = handle_sink (index_out, NULL, NULL, NULL, NULL); + + if (! sink) + return FALSE; + + if (! (source_in_md5 = handle_checksum_md5 (source_in))) + return FALSE; + + if (! serialize_xdeltaindex (sink, + handle_length (source_in), + source_in_md5, + init->ck_count, + init->cksums)) + { + g_free ((void*) source_in_md5); + return FALSE; + } + + g_free ((void*) source_in_md5); + + if (! handle_close (index_out, 0)) + return FALSE; + } + + return TRUE; +} + +gboolean +xdp_source_index (XdeltaStream *source_in, + XdeltaOutStream *index_out) +{ + XdeltaSource* xs = xdp_source_new ("(ignored)", source_in, NULL, index_out); + + if (xs) + { + xdp_source_free (xs); + return TRUE; + } + + return FALSE; +} + +XdeltaSource* +xdp_source_new (const char *name, + XdeltaStream *source_in, + XdeltaStream *index_in, + XdeltaOutStream *index_out) +{ + XdeltaSource* xs = g_new0 (XdeltaSource, 1); + + xs->source_in = source_in; + xs->name = name; + + g_return_val_if_fail (source_in, NULL); + g_return_val_if_fail (index_in ? ! index_out : TRUE, NULL); + + xs->index_in = index_in; + xs->index_out = index_out; + xs->source_pos.page_size = handle_pagesize (source_in); + + return xs; +} + +static gboolean +xdp_source_check_index (XdeltaSource *xs) +{ + if (xs->source_index == 0) + return TRUE; + + if (! xs->index_in) + return xdp_source_index_internal (xs, xs->source_in, xs->index_out); + else + return xdp_source_index_read (xs, xs->index_in); +} + +void +xdp_source_free (XdeltaSource* xs) +{ + if (xs) + { + /* if (xs->ckarray) @@@ this is troublesome now + g_free (xs->ckarray);*/ + + g_free (xs); + } +} + +void +xdp_source_add (XdeltaGenerator *gen, + XdeltaSource *src) +{ + if (gen->table) + { + g_free ((gpointer)gen->table); + gen->table = NULL; + } + + g_ptr_array_add (gen->sources, src); +} + +guint +c_hash (const XdeltaChecksum* c) +{ + const guint high = c->high; + const guint low = c->low; + const guint it = (high >> 2) + (low << 3) + (high << 16); + + return (it ^ high ^ low); +} + +static gboolean +region_insert (XdeltaGenerator* gen, const XdeltaPos *xpos, guint len) +{ + /* This is a little bit cryptic: the xpos.mem + EXPR expression + * computes the offset into the current page, which is guaranteed + * to be correct since map_page has not occured yet. */ + const guint8* buf = xpos->mem + (gen->to_output_pos % xpos->page_size); + + if (len == 0) + return TRUE; + +#ifdef DEBUG_INST + g_print ("insert %d at %d\n", len, gen->to_output_pos); +#endif + + if (! handle_write (gen->data_out, buf, len)) + return FALSE; + + control_copy (gen->control, gen->data_source, gen->data_output_pos, gen->data_output_pos + len); + + gen->to_output_pos += len; + gen->data_output_pos += len; + + return TRUE; +} + +static gboolean +region_copy (XdeltaGenerator* gen, XdeltaSource* src, guint from, guint to) +{ +#ifdef DEBUG_INST + g_print ("copy %d - %d (%d) to %d\n", from, to, to-from, gen->to_output_pos); +#endif + + control_copy (gen->control, src, from, to); + + gen->to_output_pos += (to-from); + + return TRUE; +} + +gboolean +unmap_page (XdeltaStream* stream, XdeltaPos* pos) +{ + if (! pos->mem) + return TRUE; + + if (handle_unmap_page (stream, + pos->mem_page, + &pos->mem)) + { + pos->mem = NULL; + return TRUE; + } + + return FALSE; +} + +gboolean +map_page (XdeltaStream* stream, XdeltaPos* pos) +{ + gint on_page; + + if (pos->mem && pos->mem_page == pos->page) + return TRUE; + + if (pos->mem) + { + if (! handle_unmap_page (stream, + pos->mem_page, + &pos->mem)) + return FALSE; + + pos->mem = NULL; + } + + pos->mem_page = pos->page; + + on_page = handle_map_page (stream, + pos->mem_page, + &pos->mem); + + if (on_page >= 0) + { + pos->mem_rem = on_page; + return TRUE; + } + + return FALSE; +} + +static gboolean +try_match (XdeltaGenerator *gen, + XdeltaStream *in, + XdeltaPos *xpos_ptr, + XdeltaSource *src, + guint src_offset, + gboolean *found) +{ + XdeltaPos xpos = *xpos_ptr; + XdeltaPos ypos = src->source_pos; + gint rem, remsave; + gint match_forward = 0; + gint match_backward = 0; + gint match_forward_max; + gint match_backward_max; + guint to_offset = XPOS (xpos); + gboolean one_insert = FALSE; + + *found = FALSE; + + ypos.page = src_offset / ypos.page_size; + ypos.off = src_offset % ypos.page_size; + + match_forward_max = MIN (handle_length (in) - to_offset, + handle_length (src->source_in) - src_offset); + match_backward_max = MIN (src_offset, to_offset - gen->to_output_pos); + + /* Don't allow backward paging */ + match_backward_max = MIN (match_backward_max, xpos.off); + + /* We're testing against the negative below. */ + match_backward_max = - match_backward_max; + + for (; match_backward > match_backward_max; ) + { + g_assert (xpos.off != 0); + + if (ypos.off == 0) + { + ypos.off = ypos.page_size; + ypos.page -= 1; + } + + if (! map_page (src->source_in, &ypos)) + goto bail; + + rem = MIN (xpos.off, ypos.off); + rem = MIN (match_backward - match_backward_max, rem); + + for (; rem > 0; rem -= 1, match_backward -= 1) + { + if (xpos.mem[xpos.off-1] != ypos.mem[ypos.off-1]) + goto doneback; + + xpos.off -= 1; + ypos.off -= 1; + } + } + +doneback: + + xpos.page = to_offset / xpos.page_size; + xpos.off = to_offset % xpos.page_size; + + ypos.page = src_offset / ypos.page_size; + ypos.off = src_offset % ypos.page_size; + + for (; match_forward < match_forward_max; ) + { + if (! map_page (src->source_in, &ypos)) + goto bail; + + /* Fortunately, if this map happens it means that the match must + * be long enough to succeed below, therefore it is safe to write + * the insert out now. */ + if (! one_insert && xpos.page != xpos.mem_page) + { + one_insert = TRUE; + + if (! region_insert (gen, &xpos, (to_offset + match_backward) - gen->to_output_pos)) + goto bail; + } + + if (! map_page (in, &xpos)) + goto bail; + + rem = MIN (xpos.mem_rem - xpos.off, ypos.mem_rem - ypos.off); + rem = MIN (match_forward_max - match_forward, rem); + + /* Do a int-wise comparison if the regions are aligned. */ + if (rem > (4*sizeof(int)) && (xpos.off % sizeof (int)) == (ypos.off % sizeof(int))) + { + gint is; + const int *xi, *yi; + + for (; xpos.off % sizeof(int); rem -= 1, match_forward += 1) + { + if (xpos.mem[xpos.off] != ypos.mem[ypos.off]) + goto done; + + xpos.off += 1; + ypos.off += 1; + } + + remsave = rem; + rem /= sizeof(int); + + xi = (const int*) (xpos.mem + xpos.off); + yi = (const int*) (ypos.mem + ypos.off); + + is = rem; + + for (; rem > 0 && *xi == *yi; ) + { + rem -= 1; + xi += 1; + yi += 1; + } + + is -= rem; + + match_forward += is * sizeof(int); + xpos.off += is * sizeof(int); + ypos.off += is * sizeof(int); + + rem = (rem * sizeof(int)) + (remsave % sizeof(int)); + } + + for (; rem > 0; rem -= 1, match_forward += 1) + { + if (xpos.mem[xpos.off] != ypos.mem[ypos.off]) + goto done; + + xpos.off += 1; + ypos.off += 1; + } + + FLIP_FORWARD (xpos); + FLIP_FORWARD (ypos); + } + +done: + + if (match_forward - match_backward >= QUERY_SIZE_POW) + { + *found = TRUE; + + if (! one_insert) + { + if (! region_insert (gen, &xpos, (to_offset + match_backward) - gen->to_output_pos)) + goto bail; + } + + if (! region_copy (gen, src, src_offset + match_backward, src_offset + match_forward)) + goto bail; + } + else + { + g_assert (! one_insert); + } + + *xpos_ptr = xpos; + src->source_pos = ypos; + return TRUE; + +bail: + *xpos_ptr = xpos; + src->source_pos = ypos; + return FALSE; +} + +static gboolean +compute_copies (XdeltaGenerator* gen, XdeltaStream* stream) +{ + XdeltaChecksum cksum; + const XdeltaChecksum *source_cksum; + const guint8 *segment_pointer; + guint source_offset, segment_index, index, prime = gen->table_size; + guint source_index; + const guint32* table = gen->table; + guint16 old_c, new_c; + guint save_page, save_off; +#ifdef DEBUG_MATCH_PRINT + guint i; +#endif + XdeltaPos xpos; + gboolean found; + gboolean ret = TRUE; + + if (handle_length (stream) < QUERY_SIZE_POW) + return TRUE; + + init_pos (stream, &xpos); + + while (XPOS (xpos) <= (handle_length (stream) - QUERY_SIZE_POW)) + { + if (!map_page (stream, &xpos)) + return FALSE; + + g_assert (xpos.mem_rem > xpos.off); + + segment_index = (xpos.mem_rem - xpos.off); + + if (segment_index < QUERY_SIZE_POW) + goto nextpage; + + segment_index -= QUERY_SIZE_POW; + + segment_pointer = xpos.mem + xpos.off; + + init_query_checksum (segment_pointer, &cksum); + + for (; ; segment_pointer += 1) + { +#ifdef DEBUG_CKSUM_UPDATE + XdeltaChecksum cktest; + + init_query_checksum (segment_pointer, &cktest); + + if (cktest.high != cksum.high || cktest.low != cktest.low) + abort (); +#endif + + index = c_hash (&cksum) % prime; + +#ifdef DEBUG_MATCH_PRINT + g_print ("%d: searching for match \"", XPOS(xpos)); + for (i = 0; i < QUERY_SIZE_POW; i += 1) + { + if (isprint (segment_pointer[i])) + g_print ("%c", segment_pointer[i]); + else + g_print ("\\0%o", segment_pointer[i]); + } + g_print ("\"... %s\n", table[index] ? "found" : "notfound"); +#endif + + if (table[index]) + { + source_index = (table[index] & QUERY_SIZE_MASK) - 1; + source_offset = (table[index] >> QUERY_SIZE); + + source_cksum = ((XdeltaSource*)gen->sources->pdata[source_index])->cksums + source_offset; + + if (cksum.high == source_cksum->high && + cksum.low == source_cksum->low) + { + save_page = xpos.page; + save_off = xpos.off; + + if (! try_match (gen, + stream, + &xpos, + gen->sources->pdata[source_index], + source_offset << QUERY_SIZE, + &found)) + { + ret = FALSE; + goto bail; + } + + if (found) + { + g_assert (xpos.page*xpos.page_size+xpos.off == gen->to_output_pos); + + goto reenter; + } + else + { + xpos.page = save_page; + xpos.off = save_off; + } + } + } + + if (segment_index == 0) + goto nextpage; + + segment_index -= 1; + xpos.off += 1; + + old_c = CHEW(segment_pointer[0]); + new_c = CHEW(segment_pointer[QUERY_SIZE_POW]); + + cksum.low -= old_c; + cksum.low += new_c; + + cksum.high -= old_c << QUERY_SIZE; + cksum.high += cksum.low; + } + + nextpage: + + if (xpos.mem_rem < xpos.page_size) + break; + + xpos.page += 1; + xpos.off = 0; + + if (xpos.page != xpos.mem_page) + { + if (! region_insert (gen, &xpos, XPOS (xpos) - gen->to_output_pos)) + return FALSE; + } + + reenter: + (void) 0; + } + + xpos.off = gen->to_output_pos % handle_pagesize (stream); + + while (gen->to_output_pos < handle_length (stream)) + { + if (! map_page (stream, &xpos)) + return FALSE; + + if (! region_insert (gen, &xpos, xpos.mem_rem - xpos.off)) + ret = FALSE; + + xpos.off = 0; + xpos.page += 1; + } + +bail: + + if (! unmap_page (stream, &xpos)) + return FALSE; + + return ret; +} + +static gboolean +just_output (XdeltaGenerator *gen, + XdeltaStream *in) +{ + XdeltaPos pos; + + init_pos (in, &pos); + + while (gen->to_output_pos < handle_length (in)) + { + if (! map_page (in, &pos)) + return FALSE; + + if (! region_insert (gen, &pos, pos.mem_rem - pos.off)) + return FALSE; + + pos.off = 0; + pos.page += 1; + } + + if (! unmap_page (in, &pos)) + return FALSE; + + return TRUE; +} + +/* Clobbering decision (see below): + * + * Algorithm A: Clobber it always (its fast!). The problem + * is that this prefers matches at the front of + * the file and leads to poor matches at the back + * of the file (assuming I insert going backwards). + * + * Algorithm B: Keep a table of how many times there has + * been a clobber at each index i, C[i]. + * With probability 1/(C[i]+1), replace the + * previous entry. This gives a uniform + * probability of each entry surviving. + * The problem (supposed) with this + * algorithm is that the probabilities + * should not be uniform (though uniform is + * better than A) because there are more + * chances to match a segment at the end of + * the file than at the beginning. + * + * Algorithm C: Give a linear weight to each match + * according to it's position in the file + * -- number the segments from N down to 1 + * starting at the beginning. Same as the + * above but with a different weight. The + * weight for segment i, match at checksum + * offset k, follows. The total number of + * checksums in the segment is C_i, + * therefore the total checksum count is + * C = sum_i (C_i). + * Now the interior weight is the (C_i-k) + * (the linear assumption) and the total + * interior weight is sum_{j=1}^{N}{j}=(N)(N+1)/2 + * so the kth segment has interior weight + * + * [2 (C_i - k)] / [(C_i) (C_i + 1)] + * + * add in the exterior weight (after + * cancelling a C_i): + * + * w(i,k) = [2 (C_i - k)] / [(C_i + 1) (C)] + * + * Now, as above, we will compute whether to + * keep or replace the current value at the j-th + * decision. Let R_j be the running sum of + * weights considered so far. R_0 = 0. At the + * j-th decision, + * + * P_ikj(use new value) = w(i,k)/R_{j+1} + * R_{j+1} = R_j + w(i,k) + */ + +static gboolean +xdp_generate_delta_int (XdeltaGenerator *gen, + XdeltaStream *in, + XdeltaOutStream *control_out, + XdeltaOutStream *data_out) +{ + gint i, j, total_from_ck_count = 0, prime = 0, index = 0; + gint total_from_len = 0; + guint32* table = NULL; + + if (QUERY_SIZE == 0) + { + xdp_set_query_size_pow (1<sources->len == 0) + { + xd_generate_void_event (EC_XdTooFewSources); + return FALSE; + } + + for (i = 0; i < gen->sources->len; i += 1) + { + XdeltaSource* src = gen->sources->pdata[i]; + + src->used = FALSE; + src->sequential = TRUE; + src->position = 0; + src->source_index = i; + + if (src->source_index != 0) + total_from_len += handle_length (src->source_in); + } + + /* QUERY_SIZE_POW is the number of elements freed in the cksum hash + * table for storing segment number + (offset/QUERY_SIZE_POW) in. 1 + * for the zero + 1 for the data segment */ + if (gen->sources->len > (QUERY_SIZE_POW-2)) + { + xd_generate_void_event (EC_XdTooManySources); + return FALSE; + } + + if (handle_length (in) < QUERY_SIZE_POW || total_from_len < QUERY_SIZE_POW) + { + if (! just_output (gen, in)) + return FALSE; + } + else + { + for (i = 0; i < gen->sources->len; i += 1) + { + XdeltaSource* xs = (XdeltaSource*)gen->sources->pdata[i]; + + if (! xdp_source_check_index (xs)) + return FALSE; + + total_from_ck_count += xs->ck_count; + } + + prime = g_spaced_primes_closest (total_from_ck_count); + + gen->table = table = g_new0 (guint32, prime); + gen->table_size = prime; + + for (i = 0; i < gen->sources->len; i += 1) + { + XdeltaSource* xs = (XdeltaSource*)gen->sources->pdata[i]; + + for (j = xs->ck_count-1; j >= 0; j -= 1) + { + index = c_hash (xs->cksums + j) % prime; + +#ifdef DEBUG_HASH + gen->hash_entries += 1; + + if (table[index]) + { + gen->hash_conflicts += 1; + + /*regions_similar (gen, + i, + j, + (table[index] & QUERY_SIZE_MASK) - 1, + table[index] >> QUERY_SIZE);*/ + } +#endif + + /* This is the real code */ + table[index] = (j << QUERY_SIZE) + 1 + i; + } + } + +#ifdef DEBUG_HASH + for (i = 0; i < prime; i += 1) + { + if (gen->table[i]) + gen->hash_fill += 1; + } + + g_print ("*** Hash stats:\n"); + g_print ("Hash conflicts: %d\n", gen->hash_conflicts); + g_print ("Hash real conflicts: %d\n", gen->hash_real_conflicts); + g_print ("Hash real real conflicts: %d\n", gen->hash_real_real_conflicts); + g_print ("Hash fill: %d\n", gen->hash_fill); + g_print ("Hash size: %d\n", gen->table_size); + g_print ("Hash entries: %d\n", gen->hash_entries); + g_print ("Hash fill/entries: %f\n", (float)gen->hash_fill/(float)gen->hash_entries); +#endif + + if (! compute_copies (gen, in)) + return FALSE; + } + + return TRUE; +} + +XdeltaControl* +xdp_generate_delta (XdeltaGenerator *gen, + XdeltaStream *in, + XdeltaOutStream *control_out, + XdeltaOutStream *data_out) +{ + gint i; + const guint8* in_md5; + const guint8* data_out_md5; + + gen->data_out = data_out; + gen->control_out = control_out; + gen->control = control_new (); + + if (! xdp_generate_delta_int (gen, in, control_out, data_out)) + return NULL; + + if (! handle_close (data_out, 0)) + return NULL; + + if (! (in_md5 = handle_checksum_md5 (in))) + return FALSE; + + if (! (data_out_md5 = handle_checksum_md5 (data_out))) + return FALSE; + + gen->control->has_data = gen->data_source->used; + gen->control->inst = &g_array_index (gen->control->inst_array, XdeltaInstruction, 0); + gen->control->inst_len = gen->control->inst_array->len; + + gen->control->to_len = handle_length (in); + memcpy (gen->control->to_md5, in_md5, 16); + + for (i = 0; i < gen->sources->len; i += 1) + { + XdeltaSource* src = gen->sources->pdata[i]; + const guint8* md5; + guint len; + + if (src->source_in) + { + if (! (md5 = handle_checksum_md5 (src->source_in))) + return FALSE; + + len = handle_length (src->source_in); + } + else + { + len = handle_length (data_out); + md5 = data_out_md5; + } + + if (! control_add_info (gen->control, src, md5, len)) + return NULL; + } + + gen->control->source_info = (XdeltaSourceInfo**) gen->control->source_info_array->pdata; + gen->control->source_info_len = gen->control->source_info_array->len; + + if (control_out && ! xdp_control_write (gen->control, control_out)) + return NULL; + + return gen->control; +} + +/* Below here boring details mostly to do with reading and writing + * control. */ + +XdeltaControl* +control_new (void) +{ + XdeltaControl* it = g_new0 (XdeltaControl, 1); + + it->inst_array = g_array_new (FALSE, FALSE, sizeof (XdeltaInstruction)); + it->source_info_array = g_ptr_array_new (); + + return it; +} + +static void +control_reindex (XdeltaControl* cont, XdeltaSource* src) +{ + gint i; + gint new_index = cont->source_info_array->len; + + for (i = 0; i < cont->inst_len; i += 1) + { + XdeltaInstruction* inst = cont->inst + i; + + if (inst->index == src->source_index) + inst->index = new_index; + } +} + +gboolean +control_add_info (XdeltaControl* cont, XdeltaSource* src, const guint8* md5, guint len) +{ + XdeltaSourceInfo* si; + + if (! src->used) + return TRUE; + + si = g_new0 (XdeltaSourceInfo, 1); + + si->name = src->name; + si->sequential = src->sequential; + si->len = len; + si->isdata = (src->source_index == 0); + + memcpy (si->md5, md5, 16); + + control_reindex (cont, src); + + g_ptr_array_add (cont->source_info_array, si); + + return TRUE; +} + +void +xdp_control_free (XdeltaControl* cont) +{ + if (cont->source_info_array) + g_ptr_array_free (cont->source_info_array, TRUE); + if (cont->inst_array) + g_array_free (cont->inst_array, TRUE); + g_free (cont); +} + +void +control_copy (XdeltaControl* cont, XdeltaSource* src, guint from, guint to) +{ + XdeltaInstruction i; + + if (cont->inst_array->len > 0) + { + XdeltaInstruction* oi = & g_array_index (cont->inst_array, XdeltaInstruction, cont->inst_array->len-1); + + if (oi->index == src->source_index && (oi->offset + oi->length) == from) + { + oi->length += (to - from); + return; + } + } + + i.index = src->source_index; + i.offset = from; + i.length = to - from; + + src->used = TRUE; + + if (src->position != from) + src->sequential = FALSE; + + src->position = to; + + g_array_append_val (cont->inst_array, i); +} + +#ifdef DEBUG_CONT +static void +print_info (XdeltaSourceInfo* si) +{ + char md5str[33]; + + edsio_md5_to_string (si->md5, md5str); + + g_print (" ** info\n"); + g_print (" md5: %s\n", md5str); + g_print (" len: %d\n", si->length); +} + +static void +print_inst (XdeltaInstruction* i) +{ + switch (i->type) + { + case INST_TYPE_COPY: + g_print (" copy (%c) %d-%d (%d) from %d\n", i->type, i->offset, i->offset + i->length, i->length, i->index); + break; + case INST_TYPE_INSERT: + g_print (" insert %d\n", i->length); + break; + } +} + +static void +xdp_print_control (XdeltaControl *cont) +{ + gint i; + + g_print ("*** control\n"); + + g_print (" data len: %d\n", cont->data_len); + print_info (&cont->to_info); + + g_print (" source info len: %d\n", cont->source_info_len); + + for (i = 0; i < cont->source_info_len; i += 1) + print_info (cont->source_info[i]); + + g_print (" inst len: %d\n", cont->inst_len); + + for (i = 0; i < cont->inst_len; i += 1) + print_inst (cont->inst + i); + +} +#endif + +#ifdef DEBUG_CHECK_CONTROL +void +check_control (XdeltaControl* cont) +{ + gint i; + + for (i = 0; i < cont->inst_len; i += 1) + { + switch (cont->inst[i].type) + { + case INST_TYPE_NCOPY: + case INST_TYPE_COPY: + if (cont->inst[i].index >= cont->source_info_len) + g_error ("control has a too high instruction index\n"); + } + } +} +#endif + +static gboolean +unpack_instructions (XdeltaControl* cont) +{ + gint i; + guint output_pos = 0; + + for (i = 0; i < cont->source_info_len; i += 1) + { + XdeltaSourceInfo* info = cont->source_info[i]; + + info->position = 0; + info->copies = 0; + info->copy_length = 0; + } + + for (i = 0; i < cont->inst_len; i += 1) + { + XdeltaSourceInfo* info; + XdeltaInstruction *inst = cont->inst + i; + + if (inst->index >= cont->source_info_len) + { + xd_generate_int_event (EC_XdOutOfRangeSourceIndex, inst->index); + return FALSE; + } + + info = cont->source_info[inst->index]; + + if (info->sequential) + { + inst->offset = info->position; + info->position = inst->offset + inst->length; + } + + inst->output_start = output_pos; + output_pos += inst->length; + + info->copies += 1; + info->copy_length += inst->length; + } + + return TRUE; +} + +static gboolean +pack_instructions (XdeltaControl* cont) +{ + gint i; + + for (i = 0; i < cont->source_info_len; i += 1) + { + XdeltaSourceInfo* info = cont->source_info[i]; + + info->position = 0; + info->copies = 0; + info->copy_length = 0; + } + + for (i = 0; i < cont->inst_len; i += 1) + { + XdeltaSourceInfo* info; + XdeltaInstruction *inst = cont->inst + i; + + if (inst->index >= cont->source_info_len) + { + xd_generate_int_event (EC_XdOutOfRangeSourceIndex, inst->index); + return FALSE; + } + + info = cont->source_info[inst->index]; + + if (info->sequential) + { + g_assert (info->position == inst->offset); + info->position += inst->length; + inst->offset = 0; + } + + info->copies += 1; + info->copy_length += inst->length; + } + + return TRUE; +} + + +gboolean +xdp_control_write (XdeltaControl *cont, + XdeltaOutStream *cont_out) +{ + SerialSink* sink = handle_sink (cont_out, NULL, NULL, NULL, NULL); + +#ifdef DEBUG_CONT + xdp_print_control (cont); +#endif +#ifdef DEBUG_CHECK_CONTROL + check_control (cont); +#endif + + if (! sink) + return FALSE; + + if (! pack_instructions (cont)) + return FALSE; + + /* @@@ think about how the count function overcounts on the instruction + * array by a factor of 2 or more. */ + if (! serialize_xdeltacontrol_obj (sink, cont)) + return FALSE; + + if (! handle_close (cont_out, 0)) + return FALSE; + + return TRUE; +} + +XdeltaControl* +xdp_control_read (XdeltaStream *cont_in) +{ + SerialSource* src = handle_source (cont_in); + XdeltaControl* cont; + SerialType type; + + if (! src) + return NULL; + + if (! serializeio_unserialize_generic_acceptable (src, ST_XdeltaControl | ST_Version0Control, & type, (void**) & cont)) + return NULL; + + if (type == ST_Version0Control) + { + SerialVersion0Control *ocont = (SerialVersion0Control*) cont; + + xd_generate_string_event (EC_XdBackwardCompatibilityMode, "1.0"); + + cont = control_version_0 (ocont); + + g_free (ocont); + } + + if (! unpack_instructions (cont)) + return NULL; + +#ifdef DEBUG_CHECK_CONTROL + check_control (cont); +#endif + + return cont; +} + +XdeltaControl* +control_version_0 (SerialVersion0Control* ocont) +{ + XdeltaControl* cont = g_new0 (XdeltaControl, 1); + gint i; + XdeltaSourceInfo* dinfo; + + g_assert (! ocont->normalized); + + memcpy (cont->to_md5, ocont->to_info.real_md5, 16); + + cont->to_len = ocont->to_info.length; + + cont->has_data = TRUE; + + cont->source_info_len = ocont->source_info_len + 1; + cont->source_info = g_new (XdeltaSourceInfo*, cont->source_info_len); + + cont->source_info[0] = dinfo = g_new0 (XdeltaSourceInfo, 1); + + dinfo->name = "(patch data)"; + memcpy (dinfo->md5, ocont->to_info.md5, 15); + dinfo->len = ocont->data_len; + dinfo->isdata = TRUE; + dinfo->sequential = FALSE; + + for (i = 0; i < ocont->source_info_len; i += 1) + { + XdeltaSourceInfo* info = g_new0 (XdeltaSourceInfo, 1); + SerialVersion0SourceInfo* oinfo = ocont->source_info[i]; + + cont->source_info[i+1] = info; + + info->name = "unnamed"; + memcpy (info->md5, oinfo->md5, 16); + info->len = oinfo->length; + info->isdata = FALSE; + info->sequential = FALSE; + } + + /* The old unpack */ +#define OLD_QUERY_SIZE 4 + for (i = 0; i < ocont->inst_len; i += 1) + { + switch (ocont->inst[i].length & 3) + { + case 0: ocont->inst[i].type = 'N'; break; + case 1: ocont->inst[i].type = 'E'; break; + case 2: ocont->inst[i].type = 'C'; break; + case 3: ocont->inst[i].type = 'I'; break; + } + + ocont->inst[i].length >>= 2; + ocont->inst[i].index = ocont->inst[i].length & OLD_QUERY_SIZE; + ocont->inst[i].length >>= OLD_QUERY_SIZE; + } + + cont->inst_len = ocont->inst_len; + cont->inst = g_new (XdeltaInstruction, cont->inst_len); + + for (i = 0; i < cont->inst_len; i += 1) + { + cont->inst[i].length = ocont->inst[i].length; + cont->inst[i].offset = ocont->inst[i].offset; + + switch (ocont->inst[i].type) + { + case 'N': + case 'E': + abort (); + break; + + case 'C': + g_assert (ocont->inst[i].index == 0); + + cont->inst[i].index = 1; + break; + + case 'I': + cont->inst[i].index = 0; + break; + } + + } + + return cont; +} diff --git a/xdelta-1.1.3/xdelta.dsp b/xdelta-1.1.3/xdelta.dsp new file mode 100644 index 0000000..15c3d8e --- /dev/null +++ b/xdelta-1.1.3/xdelta.dsp @@ -0,0 +1,121 @@ +# Microsoft Developer Studio Project File - Name="xdelta" - Package Owner=<4> +# Microsoft Developer Studio Generated Build File, Format Version 5.00 +# ** DO NOT EDIT ** + +# TARGTYPE "Win32 (x86) Console Application" 0x0103 + +CFG=xdelta - Win32 Debug +!MESSAGE This is not a valid makefile. To build this project using NMAKE, +!MESSAGE use the Export Makefile command and run +!MESSAGE +!MESSAGE NMAKE /f "xdelta.mak". +!MESSAGE +!MESSAGE You can specify a configuration when running NMAKE +!MESSAGE by defining the macro CFG on the command line. For example: +!MESSAGE +!MESSAGE NMAKE /f "xdelta.mak" CFG="xdelta - Win32 Debug" +!MESSAGE +!MESSAGE Possible choices for configuration are: +!MESSAGE +!MESSAGE "xdelta - Win32 Release" (based on "Win32 (x86) Console Application") +!MESSAGE "xdelta - Win32 Debug" (based on "Win32 (x86) Console Application") +!MESSAGE + +# Begin Project +# PROP Scc_ProjName "" +# PROP Scc_LocalPath "" +CPP=cl.exe +RSC=rc.exe + +!IF "$(CFG)" == "xdelta - Win32 Release" + +# PROP BASE Use_MFC 0 +# PROP BASE Use_Debug_Libraries 0 +# PROP BASE Output_Dir "Release" +# PROP BASE Intermediate_Dir "Release" +# PROP BASE Target_Dir "" +# PROP Use_MFC 0 +# PROP Use_Debug_Libraries 0 +# PROP Output_Dir "Release" +# PROP Intermediate_Dir "Release" +# PROP Ignore_Export_Lib 0 +# PROP Target_Dir "" +# ADD BASE CPP /nologo /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /c +# ADD CPP /nologo /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /c +# ADD BASE RSC /l 0x409 /d "NDEBUG" +# ADD RSC /l 0x409 /d "NDEBUG" +BSC32=bscmake.exe +# ADD BASE BSC32 /nologo +# ADD BSC32 /nologo +LINK32=link.exe +# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /machine:I386 +# ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib zlibs.lib glib-1.2.lib /nologo /subsystem:console /machine:I386 + +!ELSEIF "$(CFG)" == "xdelta - Win32 Debug" + +# PROP BASE Use_MFC 0 +# PROP BASE Use_Debug_Libraries 1 +# PROP BASE Output_Dir "Debug" +# PROP BASE Intermediate_Dir "Debug" +# PROP BASE Target_Dir "" +# PROP Use_MFC 0 +# PROP Use_Debug_Libraries 1 +# PROP Output_Dir "Debug" +# PROP Intermediate_Dir "Debug" +# PROP Ignore_Export_Lib 0 +# PROP Target_Dir "" +# ADD BASE CPP /nologo /W3 /Gm /GX /Zi /Od /D "WIN32" /D "_DEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /c +# ADD CPP /nologo /W3 /GX /Zi /Od /D "WIN32" /D "_DEBUG" /D "_CONSOLE" /D "_MBCS" /D "XDELTA_COMPILATION" /FR /YX /FD /ZI /c +# ADD BASE RSC /l 0x409 /d "_DEBUG" +# ADD RSC /l 0x409 /d "_DEBUG" +BSC32=bscmake.exe +# ADD BASE BSC32 /nologo +# ADD BSC32 /nologo +LINK32=link.exe +# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /debug /machine:I386 /pdbtype:sept +# ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib zlibs.lib glib-1.2.lib /nologo /subsystem:console /debug /machine:I386 /pdbtype:sept + +!ENDIF + +# Begin Target + +# Name "xdelta - Win32 Release" +# Name "xdelta - Win32 Debug" +# Begin Source File + +SOURCE=.\libedsio\edsio.c +# End Source File +# Begin Source File + +SOURCE=.\libedsio\edsio_edsio.c +# End Source File +# Begin Source File + +SOURCE=.\getopt.c +# End Source File +# Begin Source File + +SOURCE=.\getopt1.c +# End Source File +# Begin Source File + +SOURCE=.\libedsio\md5c.c +# End Source File +# Begin Source File + +SOURCE=.\libedsio\sha.c +# End Source File +# Begin Source File + +SOURCE=.\xd_edsio.c +# End Source File +# Begin Source File + +SOURCE=.\xdelta.c +# End Source File +# Begin Source File + +SOURCE=.\xdmain.c +# End Source File +# End Target +# End Project diff --git a/xdelta-1.1.3/xdelta.dsw b/xdelta-1.1.3/xdelta.dsw new file mode 100644 index 0000000..2fa4317 --- /dev/null +++ b/xdelta-1.1.3/xdelta.dsw @@ -0,0 +1,29 @@ +Microsoft Developer Studio Workspace File, Format Version 6.00 +# WARNING: DO NOT EDIT OR DELETE THIS WORKSPACE FILE! + +############################################################################### + +Project: "xdelta"=".\xdelta.dsp" - Package Owner=<4> + +Package=<5> +{{{ +}}} + +Package=<4> +{{{ +}}} + +############################################################################### + +Global: + +Package=<5> +{{{ +}}} + +Package=<3> +{{{ +}}} + +############################################################################### + diff --git a/xdelta-1.1.3/xdelta.h b/xdelta-1.1.3/xdelta.h new file mode 100644 index 0000000..a758301 --- /dev/null +++ b/xdelta-1.1.3/xdelta.h @@ -0,0 +1,195 @@ +/* -*- Mode: C;-*- + * + * This file is part of XDelta - A binary delta generator. + * + * Copyright (C) 1997, 1998, 2001 Josh MacDonald + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + * + * Author: Josh MacDonald + * + * $Id: xdelta.h,v 1.1 2004/01/05 18:54:22 icculus Exp $ + */ + +#ifndef _XDELTA_H_ +#define _XDELTA_H_ + +#include "xd_edsio.h" + +typedef SerialRsyncIndex XdeltaRsync; +typedef SerialRsyncIndexElt XdeltaRsyncElt; +typedef SerialXdeltaChecksum XdeltaChecksum; +typedef SerialXdeltaIndex XdeltaIndex; +typedef SerialXdeltaSourceInfo XdeltaSourceInfo; +typedef SerialXdeltaControl XdeltaControl; +typedef SerialXdeltaInstruction XdeltaInstruction; + +typedef struct _XdeltaGenerator XdeltaGenerator; +typedef struct _XdeltaSource XdeltaSource; + +typedef FileHandle XdeltaStream; +typedef FileHandle XdeltaOutStream; + +/* Note: FileHandle is an opaque type, you must define it + * to use this library. See how its done in xdmain.c. + */ + +/* $Format: "#define XDELTA_VERSION \"$ReleaseVersion$\"" $ */ +#define XDELTA_VERSION "1.1.3" + +/* $Format: "#define XDELTA_MAJOR_VERSION $ReleaseMajorVersion$" $ */ +#define XDELTA_MAJOR_VERSION 1 + +/* $Format: "#define XDELTA_MINOR_VERSION $ReleaseMinorVersion$" $ */ +#define XDELTA_MINOR_VERSION 1 + +/* $Format: "#define XDELTA_MICRO_VERSION $ReleaseMicroVersion$" $ */ +#define XDELTA_MICRO_VERSION 3 + +extern const guint xdelta_major_version; +extern const guint xdelta_minor_version; +extern const guint xdelta_micro_version; + +/* copy segments are of length 1<= $min_xdelta_version) + no_xdelta="" + if test "$XDELTA_CONFIG" = "no" ; then + no_xdelta=yes + else + XDELTA_CFLAGS=`$XDELTA_CONFIG $xdelta_config_args --cflags` + XDELTA_LIBS=`$XDELTA_CONFIG $xdelta_config_args --libs` + xdelta_config_major_version=`$XDELTA_CONFIG $xdelta_config_args --version | \ + sed 's/\([[0-9]]*\).\([[0-9]]*\).\([[0-9]]*\)/\1/'` + xdelta_config_minor_version=`$XDELTA_CONFIG $xdelta_config_args --version | \ + sed 's/\([[0-9]]*\).\([[0-9]]*\).\([[0-9]]*\)/\2/'` + xdelta_config_micro_version=`$XDELTA_CONFIG $xdelta_config_args --version | \ + sed 's/\([[0-9]]*\).\([[0-9]]*\).\([[0-9]]*\)/\3/'` + if test "x$enable_xdeltatest" = "xyes" ; then + ac_save_CFLAGS="$CFLAGS" + ac_save_LIBS="$LIBS" + CFLAGS="$CFLAGS $XDELTA_CFLAGS" + LIBS="$LIBS $XDELTA_LIBS" +dnl +dnl Now check if the installed XDELTA is sufficiently new. (Also sanity +dnl checks the results of xdelta-config to some extent +dnl + rm -f conf.xdeltatest + AC_TRY_RUN([ +#include +#include +#include + +int +main () +{ + int major, minor, micro; + char *tmp_version; + + system ("touch conf.xdeltatest"); + + /* HP/UX 9 (%@#!) writes to sscanf strings */ + tmp_version = g_strdup("$min_xdelta_version"); + if (sscanf(tmp_version, "%d.%d.%d", &major, &minor, µ) != 3) { + printf("%s, bad version string\n", "$min_xdelta_version"); + exit(1); + } + + if ((xdelta_major_version != $xdelta_config_major_version) || + (xdelta_minor_version != $xdelta_config_minor_version) || + (xdelta_micro_version != $xdelta_config_micro_version)) + { + printf("\n*** 'xdelta-config --version' returned %d.%d.%d, but XDELTA (%d.%d.%d)\n", + $xdelta_config_major_version, $xdelta_config_minor_version, $xdelta_config_micro_version, + xdelta_major_version, xdelta_minor_version, xdelta_micro_version); + printf ("*** was found! If xdelta-config was correct, then it is best\n"); + printf ("*** to remove the old version of XDELTA. You may also be able to fix the error\n"); + printf("*** by modifying your LD_LIBRARY_PATH enviroment variable, or by editing\n"); + printf("*** /etc/ld.so.conf. Make sure you have run ldconfig if that is\n"); + printf("*** required on your system.\n"); + printf("*** If xdelta-config was wrong, set the environment variable XDELTA_CONFIG\n"); + printf("*** to point to the correct copy of xdelta-config, and remove the file config.cache\n"); + printf("*** before re-running configure\n"); + } + else if ((xdelta_major_version != XDELTA_MAJOR_VERSION) || + (xdelta_minor_version != XDELTA_MINOR_VERSION) || + (xdelta_micro_version != XDELTA_MICRO_VERSION)) + { + printf("*** XDELTA header files (version %d.%d.%d) do not match\n", + XDELTA_MAJOR_VERSION, XDELTA_MINOR_VERSION, XDELTA_MICRO_VERSION); + printf("*** library (version %d.%d.%d)\n", + xdelta_major_version, xdelta_minor_version, xdelta_micro_version); + } + else + { + if ((xdelta_major_version > major) || + ((xdelta_major_version == major) && (xdelta_minor_version > minor)) || + ((xdelta_major_version == major) && (xdelta_minor_version == minor) && (xdelta_micro_version >= micro))) + { + return 0; + } + else + { + printf("\n*** An old version of XDELTA (%d.%d.%d) was found.\n", + xdelta_major_version, xdelta_minor_version, xdelta_micro_version); + printf("*** You need a version of XDELTA newer than %d.%d.%d. The latest version of\n", + major, minor, micro); + printf("*** XDELTA is always available from ftp://ftp.gtk.org.\n"); + printf("***\n"); + printf("*** If you have already installed a sufficiently new version, this error\n"); + printf("*** probably means that the wrong copy of the xdelta-config shell script is\n"); + printf("*** being found. The easiest way to fix this is to remove the old version\n"); + printf("*** of XDELTA, but you can also set the XDELTA_CONFIG environment to point to the\n"); + printf("*** correct copy of xdelta-config. (In this case, you will have to\n"); + printf("*** modify your LD_LIBRARY_PATH enviroment variable, or edit /etc/ld.so.conf\n"); + printf("*** so that the correct libraries are found at run-time))\n"); + } + } + return 1; +} +],, no_xdelta=yes,[echo $ac_n "cross compiling; assumed OK... $ac_c"]) + CFLAGS="$ac_save_CFLAGS" + LIBS="$ac_save_LIBS" + fi + fi + if test "x$no_xdelta" = x ; then + AC_MSG_RESULT(yes) + ifelse([$2], , :, [$2]) + else + AC_MSG_RESULT(no) + if test "$XDELTA_CONFIG" = "no" ; then + echo "*** The xdelta-config script installed by XDELTA could not be found" + echo "*** If XDELTA was installed in PREFIX, make sure PREFIX/bin is in" + echo "*** your path, or set the XDELTA_CONFIG environment variable to the" + echo "*** full path to xdelta-config." + else + if test -f conf.xdeltatest ; then + : + else + echo "*** Could not run XDELTA test program, checking why..." + CFLAGS="$CFLAGS $XDELTA_CFLAGS" + LIBS="$LIBS $XDELTA_LIBS" + AC_TRY_LINK([ +#include +#include +], [ return ((xdelta_major_version) || (xdelta_minor_version) || (xdelta_micro_version)); ], + [ echo "*** The test program compiled, but did not run. This usually means" + echo "*** that the run-time linker is not finding XDELTA or finding the wrong" + echo "*** version of XDELTA. If it is not finding XDELTA, you'll need to set your" + echo "*** LD_LIBRARY_PATH environment variable, or edit /etc/ld.so.conf to point" + echo "*** to the installed location Also, make sure you have run ldconfig if that" + echo "*** is required on your system" + echo "***" + echo "*** If you have an old version installed, it is best to remove it, although" + echo "*** you may also be able to get things to work by modifying LD_LIBRARY_PATH" + echo "***" + echo "*** If you have a RedHat 5.0 system, you should remove the GTK package that" + echo "*** came with the system with the command" + echo "***" + echo "*** rpm --erase --nodeps gtk gtk-devel" ], + [ echo "*** The test program failed to compile or link. See the file config.log for the" + echo "*** exact error that occured. This usually means XDELTA was incorrectly installed" + echo "*** or that you have moved XDELTA since it was installed. In the latter case, you" + echo "*** may want to edit the xdelta-config script: $XDELTA_CONFIG" ]) + CFLAGS="$ac_save_CFLAGS" + LIBS="$ac_save_LIBS" + fi + fi + XDELTA_CFLAGS="" + XDELTA_LIBS="" + ifelse([$3], , :, [$3]) + fi + AC_SUBST(XDELTA_CFLAGS) + AC_SUBST(XDELTA_LIBS) + rm -f conf.xdeltatest +]) diff --git a/xdelta-1.1.3/xdelta.magic b/xdelta-1.1.3/xdelta.magic new file mode 100644 index 0000000..3e11f09 --- /dev/null +++ b/xdelta-1.1.3/xdelta.magic @@ -0,0 +1,9 @@ +#------------------------------------------------------------------------------ +# file(1) magic(5) data for xdelta +# +0 string %XDELTA% XDelta binary patch file 0.14 +0 string %XDZ000% XDelta binary patch file 0.18 +0 string %XDZ001% XDelta binary patch file 0.20 +0 string %XDZ002% XDelta binary patch file 1.0 +0 string %XDZ003% XDelta binary patch file 1.0.4 +0 string %XDZ004% XDelta binary patch file 1.1 diff --git a/xdelta-1.1.3/xdelta.prj b/xdelta-1.1.3/xdelta.prj new file mode 100644 index 0000000..7b1816f --- /dev/null +++ b/xdelta-1.1.3/xdelta.prj @@ -0,0 +1,96 @@ +;; -*- PRCS -*- +(Created-By-Prcs-Version 1 2 16) +(Project-Description "") +(Project-Version xdelta 1.1-maint 7) +(Parent-Version xdelta 1.1-maint 6) +(Version-Log "") +(New-Version-Log "") +(Checkin-Time "Fri, 29 Jun 2001 06:01:08 -0700") +(Checkin-Login jmacd) +(Populate-Ignore ("\\.o$" + "\\.deps" + "\\.lo$" + ".libs/" + "^\\.#" + "\\.la$" + "stamp-" + "libedsio" + "mkinstalldirs" + "missing" + "ltmain\\.sh" + "ltconfig" + "install-sh" + "xdser\\.h" + "xdser\\.c" + "config\\." + "aclocal\\.m4" + "CVS/" + "Makefile\\.in$" + "Makefile$" + ".cvsignore" + "configure$" + "xdelta$" + "libtool" + "doc/xdelta.info" + )) +(Project-Keywords + (ReleaseMajorVersion 1) + (ReleaseMinorVersion 1) + (ReleaseMicroVersion 3) + (LibCurrent 2) + (LibRevision 0) + (LibAge 0) + (ReleaseVersion "$ReleaseMajorVersion$.$ReleaseMinorVersion$.$ReleaseMicroVersion$") +) +(Files + ;; Config + (configure.in (xdelta/1_configure. 1.10.1.37 664)) + (Makefile.am (xdelta/2_Makefile.a 1.19.1.40.1.4 664)) + (ChangeLog (xdelta/d/9_ChangeLog 1.6 664)) + (runtest (xdelta/d/5_runtest 1.7 755)) + (README (xdelta/d/6_README 1.5 664)) + (INSTALL (xdelta/d/10_INSTALL 1.3 664)) + (COPYING (xdelta/d/11_COPYING 1.2 664)) + (AUTHORS (xdelta/d/12_AUTHORS 1.2 664)) + (NEWS (xdelta/d/13_NEWS 1.15.1.6 664)) + (xdelta.magic (xdelta/d/20_xdelta.mag 1.2 664)) + (xdelta-config.in (xdelta/d/33_xdelta-con 1.4 664)) + (autogen.sh (xdelta/d/34_autogen.sh 1.1 775)) + (xdelta.m4 (xdelta/d/35_xdelta.m4 1.5 664)) + + ;; Library + (xdelta.h (xdelta/b/8_xdelta.h 1.4.1.8.1.50.1.3 664)) + (xdeltapriv.h (xdelta/c/42_xdeltapriv 1.29 664)) + (xdelta.c (xdelta/b/14_xdelta.c 1.4.1.50.1.2 664)) + (xd.ser (xdelta/d/7_xd.ser 1.12 664)) + (xdrsync.c (xdelta/d/44_xdrsync.c 1.2 664)) + (xdapply.c (xdelta/e/37_xdapply.c 1.1 664)) + + ;; Application + (xdmain.c (xdelta/d/15_xdmain.c 1.22.1.5 644)) + (getopt1.c (xdelta/d/17_getopt1.c 1.1 664)) + (getopt.h (xdelta/d/18_getopt.h 1.1 664)) + (getopt.c (xdelta/d/19_getopt.c 1.1 664)) + + ;; Windows project files + (xdelta.dsp (xdelta/d/36_xdelta.dsp 1.2 664) :no-keywords) + (xdelta.dsw (xdelta/d/37_xdelta.dsw 1.2 664) :no-keywords) + + ;; Testing + (test/Makefile.am (xdelta/e/39_Makefile.a 1.1.1.3 664)) + (test/xdeltatest.c (xdelta/e/38_xdeltatest 1.6 664)) + (test/README.test (xdelta/21_README.tes 1.2 664)) + + ;; Not much docs + (doc/Makefile.am (xdelta/d/21_Makefile.a 1.4 664)) + (doc/xdelta.1 (xdelta/d/23_xdelta.1 1.5 664)) + (doc/xdelta.cat (xdelta/22_xdelta.cat 1.2 664)) + + ;; DJGPP contrib + (djgpp/readme.djg (xdelta/18_readme.djg 1.1 664)) + (djgpp/announce.djg (xdelta/19_announce.d 1.1 664)) + (djgpp/Makefile.am (xdelta/20_Makefile.a 1.1 664)) + +) +(Merge-Parents) +(New-Merge-Parents) diff --git a/xdelta-1.1.3/xdeltapriv.h b/xdelta-1.1.3/xdeltapriv.h new file mode 100644 index 0000000..2be7dab --- /dev/null +++ b/xdelta-1.1.3/xdeltapriv.h @@ -0,0 +1,131 @@ +/* -*- Mode: C;-*- + * + * This file is part of XDelta - A binary delta generator. + * + * Copyright (C) 1997, 1998, 1999 Josh MacDonald + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + * + * Author: Josh MacDonald + * + * $Id: xdeltapriv.h,v 1.1 2004/01/05 18:54:22 icculus Exp $ + */ + +#ifndef _XDELTAPRIV_H_ +#define _XDELTAPRIV_H_ + +#if 0 +#define DEBUG_CKSUM_UPDATE +#define DEBUG_MATCH_PRINT +#define DEBUG_CKSUM +#define DEBUG_HASH +#define DEBUG_INST +#define CLOBBER_ALGORITHM_C +#define DEBUG_MD5 +#define DEBUG_CONT +#define DEBUG_COPY +#define DEBUG_FIND +#define DEBUG_RSYNC_REQUEST +#define DEBUG_CONT +#define DEBUG_CONT2 +#define DEBUG_CHECK_CONTROL +#endif + +typedef struct _XdeltaPos XdeltaPos; +typedef struct _RsyncHash RsyncHash; + +#define XPOS(p) (((p).page * (p).page_size) + (p).off) + +struct _XdeltaPos { + guint page; + guint page_size; + guint off; + + const guint8* mem; + guint mem_page; + guint mem_rem; +}; + +#define handle_length(x) ((* (x)->table->table_handle_length) (x)) +#define handle_pages(x) ((* (x)->table->table_handle_pages) (x)) +#define handle_pagesize(x) ((* (x)->table->table_handle_pagesize) (x)) +#define handle_map_page(x,y,z) ((* (x)->table->table_handle_map_page) ((x),(y),(z))) +#define handle_unmap_page(x,y,z) ((* (x)->table->table_handle_unmap_page) ((x),(y),(z))) +#define handle_checksum_md5(x) ((* (x)->table->table_handle_checksum_md5) (x)) +#define handle_close(x,y) ((* (x)->table->table_handle_close) ((x), (y))) +#define handle_write(x,y,z) ((* (x)->table->table_handle_write) ((x),(y),(z))) +#define handle_copy(x,y,z,a) ((* (x)->table->table_handle_copy) ((x),(y),(z),(a))) + +struct _XdeltaGenerator +{ + GPtrArray *sources; + + const guint32 *table; + guint table_size; + + guint to_output_pos; + guint data_output_pos; + + XdeltaOutStream *data_out; + XdeltaOutStream *control_out; + + XdeltaControl *control; + + XdeltaSource *data_source; + +#ifdef DEBUG_HASH + gint hash_conflicts; /* bucket already used. */ + gint hash_real_conflicts; /* bucket had different checksum. */ + gint hash_real_real_conflicts; /* bucket had same checksum, different region */ + gint hash_fill; + gint hash_entries; +#endif + + EdsioMD5Ctx ctx; +}; + +struct _XdeltaSource +{ + XdeltaStream *source_in; + XdeltaPos source_pos; + + gint ck_count; /* number of elts in cksums. */ + const XdeltaChecksum *cksums; /* array of cksums. */ + + const char *name; + + XdeltaStream *index_in; + XdeltaOutStream *index_out; + + gint source_index; + gboolean used; + gboolean sequential; + guint32 position; +}; + +#define CHEW(x) (single_hash[(guint)x]) +#define FLIP_FORWARD(p) if ((p).off == (p).page_size) { (p).page += 1; (p).off = 0; } + +extern const guint16 single_hash[256]; + +void init_pos (XdeltaStream* str, XdeltaPos* pos); +gboolean unmap_page (XdeltaStream* stream, XdeltaPos* pos); +gboolean map_page (XdeltaStream* stream, XdeltaPos* pos); +gboolean check_stream_integrity (XdeltaStream* str, const guint8* md5, guint len); +XdeltaControl* control_new (void); + +guint c_hash (const XdeltaChecksum* c); + +#endif /* _XDELTAPRIV_H_ */ diff --git a/xdelta-1.1.3/xdmain.c b/xdelta-1.1.3/xdmain.c new file mode 100644 index 0000000..68d1466 --- /dev/null +++ b/xdelta-1.1.3/xdmain.c @@ -0,0 +1,1924 @@ +/* -*- Mode: C;-*- + * + * This file is part of XDelta - A binary delta generator. + * + * Copyright (C) 1997, 1998, 1999, 2001 Josh MacDonald + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + * + * Author: Josh MacDonald + * + * $Id: xdmain.c,v 1.1 2004/01/05 18:54:22 icculus Exp $ + */ + +#include +#include +#include +#include +#include + +#include +#include + +#if defined(_WIN32) || defined(__DJGPP__) +#define WINHACK +#endif + +#ifndef WINHACK +#include +#include +#define O_BINARY 0 + +#else /* WINHACK */ + +#include +#include +#ifdef __DJGPP__ +#include +#include +#endif + +#define STDOUT_FILENO 1 +#define lstat stat + +#ifndef __DJGPP__ +#define S_IFMT _S_IFMT +#define S_IFREG _S_IFREG +#endif /* !__DJGPP__ */ + +#endif /* !WINHACK_ */ + +#include + +#include "xdelta.h" + +extern HandleFuncTable xd_handle_table; + +#define XD_PAGE_SIZE (1<<20) + +#define XDELTA_110_PREFIX "%XDZ004%" +#define XDELTA_104_PREFIX "%XDZ003%" +#define XDELTA_100_PREFIX "%XDZ002%" +#define XDELTA_020_PREFIX "%XDZ001%" +#define XDELTA_018_PREFIX "%XDZ000%" +#define XDELTA_014_PREFIX "%XDELTA%" +#define XDELTA_PREFIX XDELTA_110_PREFIX +#define XDELTA_PREFIX_LEN 8 + +#define HEADER_WORDS (6) +#define HEADER_SPACE (HEADER_WORDS*4) +/* The header is composed of 4-byte words (network byte order) as follows: + * word 1: flags + * word 2: (from name length) << 16 | (to name length) + * word 3: (reserved) + * word 4: (reserved) + * word 5: (reserved) + * word 6: (reserved) + * flags are: + */ +#define FLAG_NO_VERIFY 1 +#define FLAG_FROM_COMPRESSED 2 +#define FLAG_TO_COMPRESSED 4 +#define FLAG_PATCH_COMPRESSED 8 +/* and, the header is follwed by the from file name, then the to file + * name, then the data. */ + +#ifdef WINHACK +#define FOPEN_READ_ARG "rb" +#define FOPEN_WRITE_ARG "wb" +#define FILE_SEPARATOR '\\' +#else +#define FOPEN_READ_ARG "r" +#define FOPEN_WRITE_ARG "w" +#define FILE_SEPARATOR '/' +#endif /* WINHACK */ + +#include "getopt.h" + +typedef struct _LRU LRU; + +struct _LRU +{ + LRU *next; + LRU *prev; + + gint refs; + guint page; + guint8* buffer; +}; + +typedef struct _XdFileHandle XdFileHandle; + +typedef struct { + gboolean patch_is_compressed; + const gchar* patch_name; + guint patch_flags; + const gchar* patch_version; + gboolean has_trailer; + + XdeltaSourceInfo* data_source; + XdeltaSourceInfo* from_source; + + gchar *from_name; + gchar *to_name; + + guint control_offset; + guint header_offset; + + gint16 from_name_len; + gint16 to_name_len; + + guint32 header_space[HEADER_WORDS]; + guint8 magic_buf[XDELTA_PREFIX_LEN]; + + XdFileHandle *patch_in; + + XdeltaControl *cont; +} XdeltaPatch; + +struct _XdFileHandle +{ + FileHandle fh; + + guint length; + guint real_length; + gint type; + const char* name; + const char* cleanup; + + guint8 md5[16]; + EdsioMD5Ctx ctx; + + /* for write */ + int out_fd; + void* out; + gboolean (* out_write) (XdFileHandle* handle, const void* buf, gint nbyte); + gboolean (* out_close) (XdFileHandle* handle); + + /* for read */ + GPtrArray *lru_table; + LRU *lru_head; /* most recently used. */ + LRU *lru_tail; /* least recently used. */ + GMemChunk *lru_chunk; + guint lru_count; + guint lru_outstanding_refs; + + guint narrow_low; + guint narrow_high; + guint current_pos; + FILE* in; + gboolean (* in_read) (XdFileHandle* handle, void* buf, gint nbyte); + gboolean (* in_close) (XdFileHandle* handle); + gboolean in_compressed; + + const guint8* copy_page; + guint copy_pgno; + gboolean md5_good; + gboolean reset_length_next_write; + + gint md5_page; + gint fd; +}; + +/* $Format: "static const char xdelta_version[] = \"$ReleaseVersion$\"; " $ */ +static const char xdelta_version[] = "1.1.3"; + +typedef struct _Command Command; + +struct _Command { + gchar* name; + gint (* func) (gint argc, gchar** argv); + gint nargs; +}; + +static gint delta_command (gint argc, gchar** argv); +static gint patch_command (gint argc, gchar** argv); +static gint info_command (gint argc, gchar** argv); + +static const Command commands[] = +{ + { "delta", delta_command, -1 }, + { "patch", patch_command, -1 }, + { "info", info_command, 1 }, + { NULL, NULL, 0 } +}; + +static struct option const long_options[] = +{ + {"help", no_argument, 0, 'h'}, + {"version", no_argument, 0, 'v'}, + {"verbose", no_argument, 0, 'V'}, + {"noverify", no_argument, 0, 'n'}, + {"pristine", no_argument, 0, 'p'}, + {"quiet", no_argument, 0, 'q'}, + {"maxmem", required_argument, 0, 'm'}, + {"blocksize", required_argument, 0, 's'}, + {0,0,0,0} +}; + +static const gchar* program_name; +static gint compress_level = Z_DEFAULT_COMPRESSION; +static gint no_verify = FALSE; +static gint pristine = FALSE; +static gint verbose = FALSE; +static gint max_mapped_pages = G_MAXINT; +static gint quiet = FALSE; + +#define xd_error g_warning + +static void +usage () +{ + xd_error ("usage: %s COMMAND [OPTIONS] [ARG1 ...]\n", program_name); + xd_error ("use --help for more help\n"); + exit (2); +} + +static void +help () +{ + xd_error ("usage: %s COMMAND [OPTIONS] [ARG1 ...]\n", program_name); + xd_error ("COMMAND is one of:\n"); + xd_error (" delta Produce a delta from ARG1 to ARG2 producing ARG3\n"); + xd_error (" info List details about delta ARG1\n"); + xd_error (" patch Apply patch ARG1 using file ARG2 producing ARG3\n"); + xd_error ("OPTIONS are:\n"); + xd_error (" -v, --version Print version information\n"); + xd_error (" -V, --verbose Print verbose error messages\n"); + xd_error (" -h, --help Print this summary\n"); + xd_error (" -n, --noverify Disable automatic MD5 verification\n"); + xd_error (" -p, --pristine Disable automatic GZIP decompression\n"); + xd_error (" -m, --maxmem=SIZE Set the buffer size limit, e.g. 640K, 16M\n"); + xd_error (" -[0-9] ZLIB compress level: 0=none, 1=fast, 6=default, 9=best\n"); + xd_error (" -s=BLOCK_SIZE Sets block size (power of 2), minimum match length\n"); + xd_error (" In-core memory requirement is (FROM_LEN * 8) / BLOCK_SIZE\n"); + exit (2); +} + +static void +version () +{ + xd_error ("version %s\n", xdelta_version); + exit (2); +} + +static FILE* xd_error_file = NULL; + +static void +xd_error_func (const gchar *log_domain, + GLogLevelFlags log_level, + const gchar *message, + gpointer user_data) +{ + if (! xd_error_file) + xd_error_file = stderr; + + fprintf (xd_error_file, "%s: %s", program_name, message); +} + +static gboolean +event_devel (void) +{ + static gboolean once = FALSE; + static gboolean devel = FALSE; + + if (! once) + { + devel = g_getenv ("EDSIO_DEVEL") != NULL; + once = TRUE; + } + + return devel; +} + +static gboolean +event_watch (GenericEvent* ev, GenericEventDef* def, const char* message) +{ + if (quiet && def->level <= EL_Warning) + return TRUE; + + if (event_devel ()) + fprintf (stderr, "%s:%d: %s\n", ev->srcfile, ev->srcline, message); + else + fprintf (stderr, "%s: %s\n", program_name, message); + + return TRUE; +} + +gint +main (gint argc, gchar** argv) +{ + const Command *cmd = NULL; + gint c; + gint longind; + + eventdelivery_event_watch_all (event_watch); + + if (! xd_edsio_init ()) + return 2; + +#ifdef __DJGPP__ + /* + * (richdawe@bigfoot.com): Limit maximum memory usage to 87.5% of available + * physical memory for DJGPP. Otherwise the replacement for mmap() will + * exhaust memory and XDelta will fail. + */ + { + unsigned long phys_free = _go32_dpmi_remaining_physical_memory(); + + max_mapped_pages = phys_free / XD_PAGE_SIZE; + max_mapped_pages %= 8; + max_mapped_pages *= 7; + } +#endif /* DJGPP */ + + program_name = g_basename (argv[0]); + + g_log_set_handler (G_LOG_DOMAIN, + G_LOG_LEVEL_WARNING, + xd_error_func, + NULL); + + if (argc < 2) + usage (); + + for (cmd = commands; cmd->name; cmd += 1) + if (strcmp (cmd->name, argv[1]) == 0) + break; + + if (strcmp (argv[1], "-h") == 0 || + strcmp (argv[1], "--help") == 0) + help (); + + if (strcmp (argv[1], "-v") == 0 || + strcmp (argv[1], "--version") == 0) + version (); + + if (!cmd->name) + { + xd_error ("unrecognized command\n"); + help (); + } + + argc -= 1; + argv += 1; + + while ((c = getopt_long(argc, + argv, + "+nqphvVs:m:0123456789", + long_options, + &longind)) != EOF) + { + switch (c) + { + case 'q': quiet = TRUE; break; + case 'n': no_verify = TRUE; break; + case 'p': pristine = TRUE; break; + case 'V': verbose = TRUE; break; + case 's': + { + int ret; + int s = atoi (optarg); + + if ((ret = xdp_set_query_size_pow (s)) && ! quiet) + { + xd_error ("illegal query size: %s\n", xdp_errno (ret)); + } + } + break; + case 'm': + { + gchar* end = NULL; + glong l = strtol (optarg, &end, 0); + + if (end && g_strcasecmp (end, "M") == 0) + l <<= 20; + else if (end && g_strcasecmp (end, "K") == 0) + l <<= 10; + else if (end || l < 0) + { + xd_error ("illegal maxmem argument %s\n", optarg); + return 2; + } + +#ifdef __DJGPP__ + /* + * (richdawe@bigfoot.com): Old MS-DOS systems may have a maximum + * of 8MB memory == XD_PAGE_SIZE * 8. Therefore, do what the user + * asks for on MS-DOS. + */ +#else /* !__DJGPP__ */ + l = MAX (l, XD_PAGE_SIZE * 8); +#endif /* __DJGPP__ */ + + max_mapped_pages = l / XD_PAGE_SIZE; + } + break; + case 'h': help (); break; + case 'v': version (); break; + case '0': case '1': case '2': case '3': case '4': + case '5': case '6': case '7': case '8': case '9': + compress_level = c - '0'; + break; + case '?': + default: + xd_error ("illegal argument, use --help for help\n"); + return 2; + } + } + + if (verbose && max_mapped_pages < G_MAXINT) + xd_error ("using %d kilobytes of buffer space\n", (max_mapped_pages * XD_PAGE_SIZE) >> 10); + + argc -= optind; + argv += optind; + + if (cmd->nargs >= 0 && argc != cmd->nargs) + { + xd_error ("wrong number of arguments\n"); + help (); + return 2; + } + + return (* cmd->func) (argc, argv); +} + +/* Commands */ + +#define READ_TYPE 1 +#define READ_NOSEEK_TYPE 1 +#define READ_SEEK_TYPE 3 +#define WRITE_TYPE 4 + +/* Note to the casual reader: the filehandle implemented here is + * highly aware of the calling patterns of the Xdelta library. It + * also plays games with narrowing to implement several files in the + * same handle. So, if you try to modify or use this code, BEWARE. + * See the repository package for a complete implementation. + * In fact, its really quite a hack. */ + +static gssize xd_handle_map_page (XdFileHandle *fh, guint pgno, const guint8** mem); +static gboolean xd_handle_unmap_page (XdFileHandle *fh, guint pgno, const guint8** mem); + +static gboolean +xd_fwrite (XdFileHandle* fh, const void* buf, gint nbyte) +{ + return fwrite (buf, nbyte, 1, fh->out) == 1; +} + +static gboolean +xd_fread (XdFileHandle* fh, void* buf, gint nbyte) +{ + return fread (buf, nbyte, 1, fh->in) == 1; +} + +static gboolean +xd_fclose (XdFileHandle* fh) +{ + return fclose (fh->out) == 0; +} + +static gboolean +xd_frclose (XdFileHandle* fh) +{ + return fclose (fh->in) == 0; +} + +static gboolean +xd_gzwrite (XdFileHandle* fh, const void* buf, gint nbyte) +{ + return gzwrite (fh->out, (void*) buf, nbyte) == nbyte; +} + +static gboolean +xd_gzread (XdFileHandle* fh, void* buf, gint nbyte) +{ + return gzread (fh->in, buf, nbyte) == nbyte; +} + +static gboolean +xd_gzclose (XdFileHandle* fh) +{ + return gzclose (fh->out) == Z_OK; +} + +static gboolean +xd_gzrclose (XdFileHandle* fh) +{ + return gzclose (fh->in) == Z_OK; +} + +static void +init_table (XdFileHandle* fh) +{ + fh->lru_table = g_ptr_array_new (); + fh->lru_chunk = g_mem_chunk_create(LRU, 1<<9, G_ALLOC_ONLY); + fh->lru_head = NULL; + fh->lru_tail = NULL; +} + +static XdFileHandle* +open_common (const char* name, const char* real_name) +{ + XdFileHandle* fh; + + gint fd; + struct stat buf; + + if ((fd = open (name, O_RDONLY | O_BINARY, 0)) < 0) + { + xd_error ("open %s failed: %s\n", name, g_strerror (errno)); + return NULL; + } + + if (stat (name, &buf) < 0) + { + xd_error ("stat %s failed: %s\n", name, g_strerror (errno)); + return NULL; + } + + /* S_ISREG() is not on Windows */ + if ((buf.st_mode & S_IFMT) != S_IFREG) + { + xd_error ("%s is not a regular file\n", name); + return NULL; + } + + fh = g_new0 (XdFileHandle, 1); + + fh->fh.table = & xd_handle_table; + fh->name = real_name; + fh->fd = fd; + fh->length = buf.st_size; + fh->narrow_high = buf.st_size; + + return fh; +} + +static gboolean +file_gzipped (const char* name, gboolean *is_compressed) +{ + FILE* f = fopen (name, FOPEN_READ_ARG); + guint8 buf[2]; + + (*is_compressed) = FALSE; + + if (! f) + { + xd_error ("open %s failed: %s\n", name, g_strerror (errno)); + return FALSE; + } + + if (fread (buf, 2, 1, f) != 1) + return TRUE; + +#define GZIP_MAGIC1 037 +#define GZIP_MAGIC2 0213 + + if (buf[0] == GZIP_MAGIC1 && buf[1] == GZIP_MAGIC2) + (* is_compressed) = TRUE; + + return TRUE; +} + +static const char* +xd_tmpname (void) +{ + const char* tmpdir = g_get_tmp_dir (); + GString* s; + gint x = getpid (); + static gint seq = 0; + struct stat buf; + + s = g_string_new (NULL); + + do + { + /* + * (richdawe@bigfoot.com): Limit temporary filenames to + * the MS-DOS 8+3 convention for DJGPP. + */ + g_string_sprintf (s, "%s/xd-%05d.%03d", tmpdir, x, seq++); + } + while (lstat (s->str, &buf) == 0); + + return s->str; +} + +static const char* +file_gunzip (const char* name) +{ + const char* new_name = xd_tmpname (); + FILE* out = fopen (new_name, FOPEN_WRITE_ARG); + gzFile in = gzopen (name, "rb"); + guint8 buf[1024]; + int nread; + + while ((nread = gzread (in, buf, 1024)) > 0) + { + if (fwrite (buf, nread, 1, out) != 1) + { + xd_error ("write %s failed (during uncompression): %s\n", new_name, g_strerror (errno)); + return NULL; + } + } + + if (nread < 0) + { + xd_error ("gzread %s failed\n", name); + return NULL; + } + + gzclose (in); + + if (fclose (out)) + { + xd_error ("close %s failed (during uncompression): %s\n", new_name, g_strerror (errno)); + return NULL; + } + + return new_name; +} + +static XdFileHandle* +open_read_noseek_handle (const char* name, gboolean* is_compressed, gboolean will_read, gboolean honor_pristine) +{ + XdFileHandle* fh; + const char* name0 = name; + + /* we _could_ stream-read this file if compressed, but it adds a + * lot of complexity. the library can handle it, just set the + * length to (XDELTA_MAX_FILE_LEN-1) and make sure that the end + * of file condition is set when on the last page. However, I + * don't feel like it. */ + if (honor_pristine && pristine) + *is_compressed = FALSE; + else + { + if (! file_gzipped (name, is_compressed)) + return NULL; + } + + if ((* is_compressed) && ! (name = file_gunzip (name))) + return NULL; + + if (! (fh = open_common (name, name0))) + return NULL; + + fh->type = READ_NOSEEK_TYPE; + + edsio_md5_init (&fh->ctx); + + if (*is_compressed) + fh->cleanup = name; + + if (will_read) + { + g_assert (fh->fd >= 0); + if (! (fh->in = fdopen (dup (fh->fd), FOPEN_READ_ARG))) + { + xd_error ("fdopen: %s\n", g_strerror (errno)); + return NULL; + } + fh->in_read = &xd_fread; + fh->in_close = &xd_frclose; + } + else + { + init_table (fh); + } + + return fh; +} + +static void +xd_read_close (XdFileHandle* fh) +{ + /* + * (richdawe@bigfoot.com): On Unix you can unlink a file while it is + * still open. On MS-DOS this can lead to filesystem corruption. Close + * the file before unlinking it. + */ + close (fh->fd); + + if (fh->cleanup) + unlink (fh->cleanup); + + if (fh->in) + (*fh->in_close) (fh); +} + +static XdFileHandle* +open_read_seek_handle (const char* name, gboolean* is_compressed, gboolean honor_pristine) +{ + XdFileHandle* fh; + const char* name0 = name; + + if (honor_pristine && pristine) + *is_compressed = FALSE; + else + { + if (! file_gzipped (name, is_compressed)) + return NULL; + } + + if ((* is_compressed) && ! (name = file_gunzip (name))) + return NULL; + + if (! (fh = open_common (name, name0))) + return NULL; + + fh->type = READ_SEEK_TYPE; + + if (*is_compressed) + fh->cleanup = name; + + init_table (fh); + + edsio_md5_init (&fh->ctx); + + return fh; +} + +static XdFileHandle* +open_write_handle (int fd, const char* name) +{ + XdFileHandle* fh = g_new0 (XdFileHandle, 1); + int nfd; + + fh->fh.table = & xd_handle_table; + fh->out_fd = fd; + fh->out_write = &xd_fwrite; + fh->out_close = &xd_fclose; + + g_assert (fh->out_fd >= 0); + + nfd = dup (fh->out_fd); + + if (! (fh->out = fdopen (nfd, FOPEN_WRITE_ARG))) + { + xd_error ("fdopen %s failed: %s\n", name, g_strerror (errno)); + return NULL; + } + + fh->type = WRITE_TYPE; + fh->name = name; + + edsio_md5_init (&fh->ctx); + + return fh; +} + +static gint +xd_begin_compression (XdFileHandle* fh) +{ + gint filepos, nfd; + + if (compress_level == 0) + return fh->real_length; + + if (! (fh->out_close) (fh)) + { + xd_error ("fclose failed: %s\n", g_strerror (errno)); + return -1; + } + + filepos = lseek (fh->out_fd, 0, SEEK_END); + + if (filepos < 0) + { + xd_error ("lseek failed: %s\n", g_strerror (errno)); + return -1; + } + + g_assert (fh->out_fd >= 0); + + nfd = dup (fh->out_fd); + + fh->out = gzdopen (nfd, "wb"); + fh->out_write = &xd_gzwrite; + fh->out_close = &xd_gzclose; + + if (! fh->out) + { + xd_error ("gzdopen failed: %s\n", g_strerror (errno)); + return -1; + } + + if (gzsetparams(fh->out, compress_level, Z_DEFAULT_STRATEGY) != Z_OK) + { + int foo; + xd_error ("gzsetparams failed: %s\n", gzerror (fh->out, &foo)); + return -1; + } + + return filepos; +} + +static gboolean +xd_end_compression (XdFileHandle* fh) +{ + if (compress_level == 0) + return TRUE; + + if (! (fh->out_close) (fh)) + { + xd_error ("fdclose failed: %s\n", g_strerror (errno)); + return FALSE; + } + + if (lseek (fh->out_fd, 0, SEEK_END) < 0) + { + xd_error ("lseek failed: %s\n", g_strerror (errno)); + return FALSE; + } + + g_assert (fh->out_fd >= 0); + fh->out = fdopen (dup (fh->out_fd), FOPEN_WRITE_ARG); + fh->out_write = &xd_fwrite; + fh->out_close = &xd_fclose; + + if (! fh->out) + { + xd_error ("fdopen failed: %s\n", g_strerror (errno)); + return FALSE; + } + + return TRUE; +} + +static gssize +xd_handle_length (XdFileHandle *fh) +{ + if (fh->in_compressed) + return fh->current_pos; + else + return fh->narrow_high - fh->narrow_low; +} + +static gssize +xd_handle_pages (XdFileHandle *fh) +{ + g_assert (fh->type & READ_TYPE); + return xd_handle_length (fh) / XD_PAGE_SIZE; +} + +static gssize +xd_handle_pagesize (XdFileHandle *fh) +{ + g_assert (fh->type & READ_TYPE); + return XD_PAGE_SIZE; +} + +static gint +on_page (XdFileHandle* fh, guint pgno) +{ + if (pgno > xd_handle_pages (fh)) + return -1; + + if (pgno == xd_handle_pages (fh)) + return xd_handle_length (fh) % XD_PAGE_SIZE; + + return XD_PAGE_SIZE; +} + +static gboolean +xd_handle_close (XdFileHandle *fh, gint ignore) +{ + /* this is really a reset for writable files */ + + if (fh->type == WRITE_TYPE) + { + if (fh->reset_length_next_write) + { + fh->reset_length_next_write = FALSE; + fh->length = 0; + fh->narrow_high = 0; + } + + fh->reset_length_next_write = TRUE; + edsio_md5_final (fh->md5, &fh->ctx); + edsio_md5_init (&fh->ctx); + } + else if (fh->in) + { + edsio_md5_final (fh->md5, &fh->ctx); + edsio_md5_init (&fh->ctx); + fh->md5_good = FALSE; + } + + return TRUE; +} + +static const guint8* +xd_handle_checksum_md5 (XdFileHandle *fh) +{ + if (fh->in && ! fh->md5_good) + { + edsio_md5_final (fh->md5, &fh->ctx); + fh->md5_good = TRUE; + } + else if (fh->type != WRITE_TYPE && !fh->in) + { + const guint8* page; + + while (fh->md5_page <= xd_handle_pages (fh)) + { + gint pgno = fh->md5_page; + gint onpage; + + if ((onpage = xd_handle_map_page (fh, pgno, &page)) < 0) + return NULL; + + if (pgno == fh->md5_page) + { + fh->md5_page += 1; + edsio_md5_update (&fh->ctx, page, onpage); + + if (fh->md5_page > xd_handle_pages (fh)) + edsio_md5_final (fh->md5, &fh->ctx); + } + + if (! xd_handle_unmap_page (fh, pgno, &page)) + return NULL; + } + } + + return g_memdup (fh->md5, 16); +} + +static gboolean +xd_handle_set_pos (XdFileHandle *fh, guint pos) +{ + if (fh->current_pos == pos + fh->narrow_low) + return TRUE; + + if (pos + fh->narrow_low > fh->narrow_high) + { + xd_error ("unexpected EOF in %s\n", fh->name); + return FALSE; + } + + fh->current_pos = pos + fh->narrow_low; + + if (fseek (fh->in, fh->current_pos, SEEK_SET)) + { + xd_error ("fseek failed: %s\n", g_strerror (errno)); + return FALSE; + } + + return TRUE; +} + +static gboolean +xd_handle_narrow (XdFileHandle* fh, guint low, guint high, gboolean compressed) +{ + if (high > fh->length) + { + xd_error ("%s: corrupt or truncated delta\n", fh->name); + return FALSE; + } + + fh->narrow_low = low; + fh->narrow_high = high; + + edsio_md5_init (&fh->ctx); + + if (compressed) + { + (* fh->in_close) (fh); + + if (lseek (fh->fd, low, SEEK_SET) < 0) + { + xd_error ("%s: corrupt or truncated delta: cannot seek to %d: %s\n", fh->name, low, g_strerror (errno)); + return FALSE; + } + + g_assert (fh->fd >= 0); + fh->in = gzdopen (dup (fh->fd), "rb"); + fh->in_read = &xd_gzread; + fh->in_close = &xd_gzrclose; + fh->in_compressed = TRUE; + fh->current_pos = 0; + + if (! fh->in) + { + xd_error ("gzdopen failed: %s\n", g_strerror (errno)); + return -1; + } + } + else + { + if (! xd_handle_set_pos (fh, 0)) + return FALSE; + } + + return TRUE; +} + +static guint +xd_handle_get_pos (XdFileHandle* fh) +{ + return fh->current_pos - fh->narrow_low; +} + +static const gchar* +xd_handle_name (XdFileHandle *fh) +{ + return g_strdup (fh->name); +} + +static gssize +xd_handle_read (XdFileHandle *fh, guint8 *buf, gsize nbyte) +{ + if (nbyte == 0) + return 0; + + if (! (fh->in_read) (fh, buf, nbyte)) /* This is suspicious */ + { + xd_error ("read failed: %s\n", g_strerror (errno)); + return -1; + } + + if (!no_verify) + edsio_md5_update (&fh->ctx, buf, nbyte); + + fh->current_pos += nbyte; + + return nbyte; +} + +static gboolean +xd_handle_write (XdFileHandle *fh, const guint8 *buf, gsize nbyte) +{ + g_assert (fh->type == WRITE_TYPE); + + if (fh->reset_length_next_write) + { + fh->reset_length_next_write = FALSE; + fh->length = 0; + fh->narrow_high = 0; + } + + if (! no_verify) + edsio_md5_update (&fh->ctx, buf, nbyte); + + if (! (*fh->out_write) (fh, buf, nbyte)) + { + xd_error ("write failed: %s\n", g_strerror (errno)); + return FALSE; + } + + fh->length += nbyte; + fh->real_length += nbyte; + fh->narrow_high += nbyte; + + return TRUE; +} + +static gboolean +xd_handle_really_close (XdFileHandle *fh) +{ + g_assert (fh->type == WRITE_TYPE); + + if (! (* fh->out_close) (fh) || close (fh->out_fd) < 0) + { + xd_error ("write failed: %s\n", g_strerror (errno)); + return FALSE; + } + + return TRUE; +} + +static LRU* +pull_lru (XdFileHandle* fh, LRU* lru) +{ + if (lru->next && lru->prev) + { + lru->next->prev = lru->prev; + lru->prev->next = lru->next; + } + else if (lru->next) + { + fh->lru_tail = lru->next; + lru->next->prev = NULL; + } + else if (lru->prev) + { + fh->lru_head = lru->prev; + lru->prev->next = NULL; + } + else + { + fh->lru_head = NULL; + fh->lru_tail = NULL; + } + + lru->next = NULL; + lru->prev = NULL; + + return lru; +} + +static gboolean +really_free_one_page (XdFileHandle* fh) +{ + LRU *lru = fh->lru_tail; + + for (; lru; lru = lru->prev) + { + gint to_unmap; + LRU *lru_dead; + + if (lru->refs > 0) + continue; + + lru_dead = pull_lru (fh, lru); + + g_assert (lru_dead->buffer); + + to_unmap = on_page (fh, lru_dead->page); + + fh->lru_count -= 1; + + if (to_unmap > 0) + { +#ifdef WINHACK + g_free (lru_dead->buffer); +#else + if (munmap (lru_dead->buffer, to_unmap)) + { + xd_error ("munmap failed: %s\n", g_strerror (errno)); + return FALSE; + } +#endif /* WINHACK */ + } + + lru_dead->buffer = NULL; + + return TRUE; + } + + return TRUE; +} + +#if 0 +static void +print_lru (XdFileHandle* fh) +{ + LRU* lru = fh->lru_head; + + for (; lru; lru = lru->prev) + { + g_print ("page %d buffer %p\n", lru->page, lru->buffer); + + if (! lru->prev && lru != fh->lru_tail) + g_print ("incorrect lru_tail\n"); + } +} +#endif + +static gboolean +make_lru_room (XdFileHandle* fh) +{ + if (fh->lru_count == max_mapped_pages) + { + if (! really_free_one_page (fh)) + return FALSE; + } + + g_assert (fh->lru_count < max_mapped_pages); + + return TRUE; +} + +/*#define DEBUG_MAP*/ + +static gssize +xd_handle_map_page (XdFileHandle *fh, guint pgno, const guint8** mem) +{ + LRU* lru; + guint to_map; + +#ifdef DEBUG_MAP + g_print ("map %p:%d\n", fh, pgno); +#endif + + g_assert (fh->type & READ_TYPE); + + if (fh->lru_table->len < (pgno + 1)) + { + gint olen = fh->lru_table->len; + + g_ptr_array_set_size (fh->lru_table, pgno + 1); + + while (olen <= pgno) + fh->lru_table->pdata[olen++] = NULL; + } + + lru = fh->lru_table->pdata[pgno]; + + if (! lru) + { + lru = g_chunk_new0 (LRU, fh->lru_chunk); + fh->lru_table->pdata[pgno] = lru; + lru->page = pgno; + } + else if (lru->buffer) + { + pull_lru (fh, lru); + } + + lru->prev = fh->lru_head; + lru->next = NULL; + + fh->lru_head = lru; + + if (lru->prev) + lru->prev->next = lru; + + if (! fh->lru_tail) + fh->lru_tail = lru; + + to_map = on_page (fh, pgno); + + if (to_map < 0) + { + xd_error ("unexpected EOF in %s\n", fh->name); + return -1; + } + + if (! lru->buffer) + { + if (! make_lru_room (fh)) + return -1; + + fh->lru_count += 1; + + if (to_map > 0) + { +#ifdef WINHACK + lru->buffer = g_malloc (to_map); + + if (lseek (fh->fd, pgno * XD_PAGE_SIZE, SEEK_SET) < 0) + { + xd_error ("lseek failed: %s\n", g_strerror (errno)); + return -1; + } + + if (read (fh->fd, lru->buffer, to_map) != to_map) + { + xd_error ("read failed: %s\n", g_strerror (errno)); + return -1; + } +#else + if (! (lru->buffer = mmap (NULL, to_map, PROT_READ, MAP_PRIVATE, fh->fd, pgno * XD_PAGE_SIZE))) + { + xd_error ("mmap failed: %s\n", g_strerror (errno)); + return -1; + } +#endif + } + else + { + lru->buffer = (void*) -1; + } + + if (pgno == fh->md5_page) + { + if (! no_verify) + edsio_md5_update (&fh->ctx, lru->buffer, to_map); + fh->md5_page += 1; + + if (fh->md5_page > xd_handle_pages (fh)) + edsio_md5_final (fh->md5, &fh->ctx); + } + } + + (*mem) = lru->buffer; + + lru->refs += 1; + fh->lru_outstanding_refs += 1; + + return to_map; +} + +static gboolean +xd_handle_unmap_page (XdFileHandle *fh, guint pgno, const guint8** mem) +{ + LRU* lru; + +#ifdef DEBUG_MAP + g_print ("unmap %p:%d\n", fh, pgno); +#endif + + g_assert (fh->type & READ_TYPE); + + g_assert (pgno < fh->lru_table->len); + + lru = fh->lru_table->pdata[pgno]; + + g_assert (lru && lru->refs > 0); + + g_assert (lru->buffer == (*mem)); + + (*mem) = NULL; + + lru->refs -= 1; + fh->lru_outstanding_refs += 1; + + if (lru->refs == 0 && fh->type == READ_NOSEEK_TYPE) + { + pull_lru (fh, lru); + + lru->next = fh->lru_tail; + if (lru->next) lru->next->prev = lru; + lru->prev = NULL; + fh->lru_tail = lru; + + if (! really_free_one_page (fh)) + return FALSE; + } + + return TRUE; +} + +static gboolean +xd_handle_copy (XdFileHandle *from, XdFileHandle *to, guint off, guint len) +{ + if (from->in) + { + guint8 buf[1024]; + + /*if (! xd_handle_set_pos (from, off)) + return FALSE;*/ + + while (len > 0) + { + guint r = MIN (1024, len); + + if (xd_handle_read (from, buf, r) != r) + return FALSE; + + if (! xd_handle_write (to, buf, r)) + return FALSE; + + len -= r; + } + } + else + { + while (len > 0) + { + guint off_page = off / XD_PAGE_SIZE; + guint off_off = off % XD_PAGE_SIZE; + + gint on = on_page (from, off_page); + guint rem; + guint copy; + + if (on <= 0) + { + xd_error ("unexpected EOF in %s\n", from->name); + return FALSE; + } + + rem = on - off_off; + copy = MIN (len, rem); + + if (from->copy_pgno != off_page && + from->copy_page && + ! xd_handle_unmap_page (from, from->copy_pgno, &from->copy_page)) + return FALSE; + + from->copy_pgno = off_page; + + if (xd_handle_map_page (from, off_page, &from->copy_page) < 0) + return FALSE; + + if (! xd_handle_write (to, from->copy_page + off_off, copy)) + return FALSE; + + if (! xd_handle_unmap_page (from, off_page, &from->copy_page)) + return FALSE; + + len -= copy; + off += copy; + } + } + + return TRUE; +} + +static gboolean +xd_handle_putui (XdFileHandle *fh, guint32 i) +{ + guint32 hi = g_htonl (i); + + return xd_handle_write (fh, (guint8*)&hi, 4); +} + +static gboolean +xd_handle_getui (XdFileHandle *fh, guint32* i) +{ + if (xd_handle_read (fh, (guint8*)i, 4) != 4) + return FALSE; + + *i = g_ntohl (*i); + + return TRUE; +} + +static HandleFuncTable xd_handle_table = +{ + (gssize (*) (FileHandle *fh)) xd_handle_length, + (gssize (*) (FileHandle *fh)) xd_handle_pages, + (gssize (*) (FileHandle *fh)) xd_handle_pagesize, + (gssize (*) (FileHandle *fh, guint pgno, const guint8** mem)) xd_handle_map_page, + (gboolean (*) (FileHandle *fh, guint pgno, const guint8** mem)) xd_handle_unmap_page, + (const guint8* (*) (FileHandle *fh)) xd_handle_checksum_md5, + + (gboolean (*) (FileHandle *fh, gint flags)) xd_handle_close, + + (gboolean (*) (FileHandle *fh, const guint8 *buf, gsize nbyte)) xd_handle_write, + (gboolean (*) (FileHandle *from, FileHandle *to, guint off, guint len)) xd_handle_copy, + + (gboolean (*) (FileHandle *fh, guint32* i)) xd_handle_getui, + (gboolean (*) (FileHandle *fh, guint32 i)) xd_handle_putui, + (gssize (*) (FileHandle *fh, guint8 *buf, gsize nbyte)) xd_handle_read, + (const gchar* (*) (FileHandle *fh)) xd_handle_name, +}; + +static void +htonl_array (guint32* array, gint len) +{ + gint i; + + for (i = 0; i < len; i += 1) + array[i] = g_htonl(array[i]); +} + +static void +ntohl_array (guint32* array, gint len) +{ + gint i; + + for (i = 0; i < len; i += 1) + array[i] = g_ntohl(array[i]); +} + +static gint +delta_command (gint argc, gchar** argv) +{ + gint patch_out_fd; + const char* patch_out_name; + XdFileHandle *from, *to, *out; + XdeltaGenerator* gen; + XdeltaSource* src; + XdeltaControl* cont; + gboolean from_is_compressed = FALSE, to_is_compressed = FALSE; + guint32 control_offset, header_offset; + const char* from_name, *to_name; + guint32 header_space[HEADER_WORDS]; + int fd; + + memset (header_space, 0, sizeof (header_space)); + + if (argc != 3) + { + xd_error ("usage: %s delta fromfile tofile patchfile\n", program_name); + return 2; + } + + if (verbose) + { + xd_error ("using block size: %d bytes\n", xdp_blocksize ()); + } + + + if (! (from = open_read_seek_handle (argv[0], &from_is_compressed, TRUE))) + return 2; + + if (! (to = open_read_noseek_handle (argv[1], &to_is_compressed, FALSE, TRUE))) + return 2; + + // Note: I tried support to patches to stdout, but it broke when + // compression was added. Sigh + fd = open (argv[2], O_WRONLY | O_CREAT | O_TRUNC | O_BINARY, 0666); + + if (fd < 0) + { + xd_error ("open %s failed: %s\n", argv[2], g_strerror (errno)); + return 2; + } + + patch_out_fd = fd; + patch_out_name = argv[2]; + + from_name = g_basename (argv[0]); + to_name = g_basename (argv[1]); + + if (! (out = open_write_handle (patch_out_fd, patch_out_name))) + return 2; + + if (! (gen = xdp_generator_new ())) + return 2; + + if (! (src = xdp_source_new (from_name, (FileHandle*) from, NULL, NULL))) + return 2; + + xdp_source_add (gen, src); + + if (! xd_handle_write (out, XDELTA_PREFIX, XDELTA_PREFIX_LEN)) + return 2; + + /* compute the header */ + header_space[0] = 0; + + if (no_verify) header_space[0] |= FLAG_NO_VERIFY; + if (from_is_compressed) header_space[0] |= FLAG_FROM_COMPRESSED; + if (to_is_compressed) header_space[0] |= FLAG_TO_COMPRESSED; + if (compress_level != 0) header_space[0] |= FLAG_PATCH_COMPRESSED; + + header_space[1] = strlen (from_name) << 16 | strlen (to_name); + /* end compute the header */ + + htonl_array (header_space, HEADER_WORDS); + + if (! xd_handle_write (out, (guint8*) header_space, HEADER_SPACE)) + return 2; + + if (! xd_handle_write (out, from_name, strlen (from_name))) + return 2; + + if (! xd_handle_write (out, to_name, strlen (to_name))) + return 2; + + if (! xd_handle_close (out, 0)) + return 2; + + if ((header_offset = xd_begin_compression (out)) < 0) + return 2; + + if (! (cont = xdp_generate_delta (gen, (FileHandle*) to, NULL, (FileHandle*) out))) + return 2; + +#if 0 + serializeio_print_xdeltacontrol_obj (cont, 0); +#endif + + if (cont->has_data && cont->has_data == cont->source_info_len) + { + if (! quiet) + xd_error ("warning: no matches found in from file, patch will apply without it\n"); + } + + if (! xd_handle_close (out, 0)) + return 2; + + if ((control_offset = xd_begin_compression (out)) < 0) + return 2; + + if (! xdp_control_write (cont, (FileHandle*) out)) + return 2; + + if (! xd_end_compression (out)) + return 2; + + if (! xd_handle_putui (out, control_offset)) + return 2; + + if (! xd_handle_write (out, XDELTA_PREFIX, XDELTA_PREFIX_LEN)) + return 2; + + xd_read_close (from); + xd_read_close (to); + + if (! xd_handle_really_close (out)) + return 2; + + return control_offset != header_offset; +} + +static XdeltaPatch* +process_patch (const char* name) +{ + XdeltaPatch* patch; + guint total_trailer; + + patch = g_new0 (XdeltaPatch, 1); + + patch->patch_name = name; + + /* Strictly speaking, I'm violating the intended semantics of noseek here. + * It will seek the file, which is not in fact checked in the map/unmap + * logic above. This only means that it will not cache pages of this file + * since it will be read piecewise sequentially. */ + if (! (patch->patch_in = open_read_noseek_handle (name, &patch->patch_is_compressed, TRUE, TRUE))) + return NULL; + + if (xd_handle_read (patch->patch_in, patch->magic_buf, XDELTA_PREFIX_LEN) != XDELTA_PREFIX_LEN) + return NULL; + + if (xd_handle_read (patch->patch_in, (guint8*) patch->header_space, HEADER_SPACE) != HEADER_SPACE) + return NULL; + + ntohl_array (patch->header_space, HEADER_WORDS); + + if (strncmp (patch->magic_buf, XDELTA_110_PREFIX, XDELTA_PREFIX_LEN) == 0) + { + patch->has_trailer = TRUE; + patch->patch_version = "1.1"; + } + else if (strncmp (patch->magic_buf, XDELTA_104_PREFIX, XDELTA_PREFIX_LEN) == 0) + { + patch->has_trailer = TRUE; + patch->patch_version = "1.0.4"; + } + else if (strncmp (patch->magic_buf, XDELTA_100_PREFIX, XDELTA_PREFIX_LEN) == 0) + { + patch->patch_version = "1.0"; + } + else if (strncmp (patch->magic_buf, XDELTA_020_PREFIX, XDELTA_PREFIX_LEN) == 0) + goto nosupport; + else if (strncmp (patch->magic_buf, XDELTA_018_PREFIX, XDELTA_PREFIX_LEN) == 0) + goto nosupport; + else if (strncmp (patch->magic_buf, XDELTA_014_PREFIX, XDELTA_PREFIX_LEN) == 0) + goto nosupport; + else + { + xd_error ("%s: bad magic number: not a valid delta\n", name); + return NULL; + } + + patch->patch_flags = patch->header_space[0]; + + if (no_verify) + xd_error ("--noverify is only accepted when creating a delta\n"); + + if (patch->patch_flags & FLAG_NO_VERIFY) + no_verify = TRUE; + else + no_verify = FALSE; + + patch->from_name_len = patch->header_space[1] >> 16; + patch->to_name_len = patch->header_space[1] & 0xffff; + + patch->from_name = g_malloc (patch->from_name_len+1); + patch->to_name = g_malloc (patch->to_name_len+1); + + patch->from_name[patch->from_name_len] = 0; + patch->to_name[patch->to_name_len] = 0; + + if (xd_handle_read (patch->patch_in, patch->from_name, patch->from_name_len) != patch->from_name_len) + return NULL; + + if (xd_handle_read (patch->patch_in, patch->to_name, patch->to_name_len) != patch->to_name_len) + return NULL; + + patch->header_offset = xd_handle_get_pos (patch->patch_in); + + total_trailer = 4 + (patch->has_trailer ? XDELTA_PREFIX_LEN : 0); + + if (! xd_handle_set_pos (patch->patch_in, xd_handle_length (patch->patch_in) - total_trailer)) + return NULL; + + if (! xd_handle_getui (patch->patch_in, &patch->control_offset)) + return NULL; + + if (patch->has_trailer) + { + guint8 trailer_buf[XDELTA_PREFIX_LEN]; + + if (xd_handle_read (patch->patch_in, trailer_buf, XDELTA_PREFIX_LEN) != XDELTA_PREFIX_LEN) + return NULL; + + if (strncmp (trailer_buf, patch->magic_buf, XDELTA_PREFIX_LEN) != 0) + { + xd_error ("%s: bad trailing magic number, delta is corrupt\n", name); + return NULL; + } + } + + if (! xd_handle_narrow (patch->patch_in, patch->control_offset, + xd_handle_length (patch->patch_in) - total_trailer, + patch->patch_flags & FLAG_PATCH_COMPRESSED)) + return NULL; + + if (! (patch->cont = xdp_control_read ((FileHandle*) patch->patch_in))) + return NULL; + + if (patch->cont->source_info_len > 0) + { + XdeltaSourceInfo* info = patch->cont->source_info[0]; + + if (info->isdata) + patch->data_source = info; + else + { + patch->from_source = info; + + if (patch->cont->source_info_len > 1) + { + xd_generate_void_event (EC_XdIncompatibleDelta); + return NULL; + } + } + } + + if (patch->cont->source_info_len > 1) + { + patch->from_source = patch->cont->source_info[1]; + } + + if (patch->cont->source_info_len > 2) + { + xd_generate_void_event (EC_XdIncompatibleDelta); + return NULL; + } + + if (! xd_handle_narrow (patch->patch_in, + patch->header_offset, + patch->control_offset, + patch->patch_flags & FLAG_PATCH_COMPRESSED)) + return NULL; + + return patch; + + nosupport: + + xd_error ("delta format is unsupported (too old)\n"); + return NULL; +} + +static gint +info_command (gint argc, gchar** argv) +{ + XdeltaPatch* patch; + char buf[33]; + int i; + XdeltaSourceInfo* si; + + if (! (patch = process_patch (argv[0]))) + return 2; + + xd_error_file = stdout; + + xd_error ("version %s found patch version %s in %s%s\n", + xdelta_version, + patch->patch_version, + patch->patch_name, + patch->patch_flags & FLAG_PATCH_COMPRESSED ? " (compressed)" : ""); + + if (patch->patch_flags & FLAG_NO_VERIFY) + xd_error ("generated with --noverify\n"); + + if (patch->patch_flags & FLAG_FROM_COMPRESSED) + xd_error ("generated with a gzipped FROM file\n"); + + if (patch->patch_flags & FLAG_TO_COMPRESSED) + xd_error ("generated with a gzipped TO file\n"); + + edsio_md5_to_string (patch->cont->to_md5, buf); + + xd_error ("output name: %s\n", patch->to_name); + xd_error ("output length: %d\n", patch->cont->to_len); + xd_error ("output md5: %s\n", buf); + + xd_error ("patch from segments: %d\n", patch->cont->source_info_len); + + xd_error ("MD5\t\t\t\t\tLength\tCopies\tUsed\tSeq?\tName\n"); + + for (i = 0; i < patch->cont->source_info_len; i += 1) + { + si = patch->cont->source_info[i]; + + edsio_md5_to_string (si->md5, buf); + + xd_error ("%s\t%d\t%d\t%d\t%s\t%s\n", + buf, + si->len, + si->copies, + si->copy_length, + si->sequential ? "yes" : "no", + si->name); + } + + return 0; +} + +static gint +patch_command (gint argc, gchar** argv) +{ + XdFileHandle* to_out; + XdeltaPatch* patch; + gint to_out_fd; + int count = 1; + int ret; + + if (argc < 1 || argc > 3) + { + xd_error ("usage: %s patch patchfile [fromfile [tofile]]\n", program_name); + return 2; + } + + if (! (patch = process_patch (argv[0]))) + return 2; + + if (argc > 1) + patch->from_name = argv[1]; + else if (verbose) + xd_error ("using from file name: %s\n", patch->from_name); + + if (argc > 2) + patch->to_name = argv[2]; + else + { + struct stat sbuf; + gchar *defname = g_strdup (patch->to_name); + + while ((ret = stat (patch->to_name, & sbuf)) == 0) + { + if (verbose) + xd_error ("to file exists: %s\n", patch->to_name); + patch->to_name = g_strdup_printf ("%s.xdp%d", defname, count++); + } + + if (verbose || strcmp (defname, patch->to_name) != 0) + xd_error ("using to file name: %s\n", patch->to_name); + } + + if (strcmp (patch->to_name, "-") == 0) + { + to_out_fd = STDOUT_FILENO; + patch->to_name = "standard output"; + } + else + { + to_out_fd = open (patch->to_name, O_WRONLY | O_CREAT | O_TRUNC | O_BINARY, 0666); + + if (to_out_fd < 0) + { + xd_error ("open %s failed: %s\n", patch->to_name, g_strerror (errno)); + return 2; + } + } + + to_out = open_write_handle (to_out_fd, patch->to_name); + + if ((patch->patch_flags & FLAG_TO_COMPRESSED) && (xd_begin_compression (to_out) < 0)) + return 2; + + if (patch->from_source) + { + XdFileHandle* from_in; + gboolean from_is_compressed = FALSE; + + if (! (from_in = open_read_seek_handle (patch->from_name, &from_is_compressed, TRUE))) + return 2; + + if (from_is_compressed != ((patch->patch_flags & FLAG_FROM_COMPRESSED) && 1)) + xd_error ("warning: expected %scompressed from file (%s)\n", + (patch->patch_flags & FLAG_FROM_COMPRESSED) ? "" : "un", + patch->from_name); + + if (xd_handle_length (from_in) != patch->from_source->len) + { + xd_error ("expected from file (%s) of %slength %d bytes\n", + patch->from_name, + from_is_compressed ? "uncompressed " : "", + patch->from_source->len); + return 2; + } + + patch->from_source->in = (XdeltaStream*) from_in; + } + + if (patch->data_source) + patch->data_source->in = (XdeltaStream*) patch->patch_in; + + if (! xdp_apply_delta (patch->cont, (FileHandle*) to_out)) + return 2; + + if (patch->from_source) + xd_read_close ((XdFileHandle*) patch->from_source->in); + + xd_read_close (patch->patch_in); + + if (! xd_handle_really_close (to_out)) + return 2; + + return 0; +} diff --git a/xdelta-1.1.3/xdrsync.c b/xdelta-1.1.3/xdrsync.c new file mode 100644 index 0000000..058e0ef --- /dev/null +++ b/xdelta-1.1.3/xdrsync.c @@ -0,0 +1,443 @@ +/* -*- Mode: C;-*- + * + * This file is part of XDelta - A binary delta generator. + * + * Copyright (C) 1997, 1998, 1999 Josh MacDonald + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + * + * Author: Josh MacDonald + * + * $Id: xdrsync.c,v 1.1 2004/01/05 18:54:22 icculus Exp $ + */ + +#include +#include + +#include "xdelta.h" +#include "xdeltapriv.h" + +/* Rsync + */ + +static void +init_long_checksum (const guint8 *buf, guint len, XdeltaChecksum *cksum) +{ + guint16 low = cksum->low; + guint16 high = cksum->high; + + /* @@@ unroll me? */ + for (; len > 0; len -= 1) + { + low += CHEW(*buf++); + high += low; + } + + cksum->low = low; + cksum->high = high; +} + +static XdeltaRsync* +xdp_rsync_index_int (XdeltaStream *str, + guint seg_len) +{ + guint to_index = seg_len; + XdeltaPos pos; + XdeltaChecksum cksum; + GArray *index; + EdsioMD5Ctx ctx; + + index = g_array_new (FALSE, FALSE, sizeof (XdeltaRsyncElt)); + + init_pos (str, &pos); + + memset (&cksum, 0, sizeof (cksum)); + + edsio_md5_init (& ctx); + + for (;;) + { + gint consume; + + if (! map_page (str, &pos)) + return NULL; + + consume = MIN (to_index, pos.mem_rem - pos.off); + + if (consume == 0) + break; + + to_index -= consume; + + edsio_md5_update (& ctx, pos.mem + pos.off, consume); + init_long_checksum (pos.mem + pos.off, consume, &cksum); + + if (to_index == 0) + { + XdeltaRsyncElt elt; + + edsio_md5_final (elt.md5, &ctx); + + elt.cksum = cksum; + + g_array_append_val (index, elt); + + edsio_md5_init (& ctx); + memset (&cksum, 0, sizeof (cksum)); + to_index = seg_len; + } + + pos.off += consume; + + FLIP_FORWARD (pos); + } + + if (! unmap_page (str, &pos)) + return NULL; + + { + XdeltaRsync* rsync = g_new (XdeltaRsync, 1); + + rsync->seg_len = seg_len; + rsync->file_len = handle_length (str); + + memcpy (rsync->file_md5, handle_checksum_md5 (str), 16); + + rsync->index = &g_array_index (index, XdeltaRsyncElt, 0); + rsync->index_len = index->len; + + return rsync; + } +} + +static XdeltaRsync* +xdp_rsync_read_index (XdeltaStream* cache_in) +{ + SerialSource* src = handle_source (cache_in); + XdeltaRsync* rsync; + + if (! src) + return NULL; + + if (! unserialize_rsyncindex (src, &rsync)) + return NULL; + + return rsync; +} + +static gboolean +xdp_rsync_write_index (XdeltaRsync* rsync, + XdeltaOutStream* cache_out) +{ + SerialSink* sink = handle_sink (cache_out, NULL, NULL, NULL, NULL); + + if (! sink) + return FALSE; + + if (! serialize_rsyncindex_obj (sink, rsync)) + return FALSE; + + if (! handle_close (cache_out, 0)) + return FALSE; + + return TRUE; +} + +XdeltaRsync* +xdp_rsync_index (XdeltaStream *str, + guint seg_len, + XdeltaStream *cache_in, + XdeltaOutStream *cache_out) +{ + XdeltaRsync* rsync; + + if (cache_in) + { + if (! (rsync = xdp_rsync_read_index (cache_in))) + return NULL; + + if (seg_len != rsync->seg_len || + (str && ! check_stream_integrity (str, rsync->file_md5, rsync->file_len))) + { + xd_generate_void_event (EC_XdInvalidRsyncCache); + goto bail; + } + + return rsync; + } + else + { + if (! (rsync = xdp_rsync_index_int (str, seg_len))) + return NULL; + + if (cache_out) + { + if (! xdp_rsync_write_index (rsync, cache_out)) + goto bail; + } + + return rsync; + } + +bail: + + xdp_rsync_index_free (rsync); + + return NULL; +} + +void +xdp_rsync_index_free (XdeltaRsync *rsync) +{ + /* ??? */ +} + +static +gboolean xdp_rsync_hash (XdeltaRsync* rsync) +{ + guint i, index, prime = 0; + gboolean already_hashed = rsync->table != NULL; + SerialRsyncIndexElt** table = NULL; + + if (! already_hashed) + { + prime = rsync->table_size = g_spaced_primes_closest (rsync->index_len); + table = rsync->table = g_new0 (SerialRsyncIndexElt*, prime); + } + + for (i = 0; i < rsync->index_len; i += 1) + { + SerialRsyncIndexElt* elt = rsync->index + i; + + elt->match_offset = -1; + + if (! already_hashed) + { + index = c_hash (& elt->cksum) % prime; + + elt->next = table[index]; + table[index] = elt; + } + } + + return TRUE; +} + +static void +incr_by (XdeltaPos* pos, gint incr) +{ + do + { + gint rem = MIN (incr, pos->mem_rem - pos->off); + + pos->off += incr; + incr -= rem; + FLIP_FORWARD (*pos); + } + while (incr > 0 && pos->mem_rem != pos->page_size); +} + +GArray* +xdp_rsync_request (XdeltaStream *file, + XdeltaRsync *rsync) +{ + XdeltaPos opos, npos; + XdeltaChecksum cksum; + guint max_buffer_index = handle_length (file); + GArray *request = g_array_new (FALSE, FALSE, sizeof (guint)); + const guint8* n_pointer, *o_pointer; + guint thistime; + guint prime, index; + SerialRsyncIndexElt **table; + guint i; + guint matched = 0; + guint16 old_c, new_c; + + if (max_buffer_index < rsync->seg_len) + return request; + + max_buffer_index -= rsync->seg_len; + + if (! xdp_rsync_hash (rsync)) + return NULL; + + g_assert (rsync->seg_len < handle_pagesize (file)); + + init_pos (file, &opos); + init_pos (file, &npos); + memset (&cksum, 0, sizeof (cksum)); + + prime = rsync->table_size; + table = rsync->table; + + if (!map_page (file, &opos)) + return NULL; + + init_long_checksum (opos.mem, rsync->seg_len, &cksum); + + npos.off += rsync->seg_len; + + for (; XPOS (opos) < max_buffer_index; ) + { + if (!map_page (file, &opos)) + return FALSE; + + if (!map_page (file, &npos)) + return FALSE; + + if (matched == rsync->index_len) + break; + + thistime = MIN (opos.mem_rem - opos.off, + npos.mem_rem - npos.off); + + o_pointer = opos.mem + opos.off; + n_pointer = npos.mem + npos.off; + + for (; ; o_pointer += 1, n_pointer += 1) + { + index = c_hash (&cksum) % prime; + + if (table[index]) + { + gboolean md5_computed = FALSE; + gboolean found = FALSE; + guint8 md5[16]; + SerialRsyncIndexElt* elt; + + for (elt = table[index]; elt; elt = elt->next) + { + if (elt->match_offset >= 0) + continue; + + if (elt->cksum.high != cksum.high || + elt->cksum.low != cksum.low) + continue; + + if (! md5_computed) + { + EdsioMD5Ctx ctx; + + edsio_md5_init (& ctx); + + if (opos.page == npos.page) + edsio_md5_update (& ctx, opos.mem + opos.off, rsync->seg_len); + else + { + edsio_md5_update (& ctx, opos.mem + opos.off, opos.mem_rem - opos.off); + edsio_md5_update (& ctx, npos.mem, rsync->seg_len - (opos.mem_rem - opos.off)); + } + + edsio_md5_final (md5, & ctx); + + md5_computed = TRUE; + } + + if (memcmp (md5, elt->md5, 16) == 0) + { + matched += 1; + found = TRUE; + elt->match_offset = XPOS (opos); + } + } + + if (found) + { + incr_by (&opos, rsync->seg_len); + incr_by (&npos, rsync->seg_len); + goto reenter; + } + } + + if (thistime == 0) + goto nextpage; + + thistime -= 1; + opos.off += 1; + npos.off += 1; + + old_c = CHEW(*o_pointer); + new_c = CHEW(*n_pointer); + + cksum.low -= old_c; + cksum.low += new_c; + + cksum.high -= old_c * rsync->seg_len; + cksum.high += cksum.low; + } + + nextpage: + + FLIP_FORWARD (opos); + FLIP_FORWARD (npos); + + reenter: + (void) 0; + } + + for (i = 0; i < rsync->index_len; i += 1) + { + SerialRsyncIndexElt* elt = rsync->index + i; + + if (elt->match_offset < 0) + { +#ifdef DEBUG_RSYNC_REQUEST + g_print ("request segment %d\n", i); +#endif + g_array_append_val (request, i); + } + } + + return request; +} + +gboolean +xdp_apply_rsync_reply (XdeltaRsync *rsync, + XdeltaStream *from, + XdeltaStream *reply, + XdeltaStream *out) +{ + gint i; + guint reply_offset = 0; + + for (i = 0; i < rsync->index_len; i += 1) + { + SerialRsyncIndexElt* elt = rsync->index + i; + + if (elt->match_offset >= 0) + { + if (! handle_copy (from, out, elt->match_offset, rsync->seg_len)) + return FALSE; + } + else + { + if (! handle_copy (reply, out, reply_offset, rsync->seg_len)) + return FALSE; + + reply_offset += rsync->seg_len; + } + } + + if (! handle_copy (reply, out, reply_offset, rsync->file_len % rsync->seg_len)) + return FALSE; + + if (! handle_close (out, 0)) + return FALSE; + + if (! check_stream_integrity (out, rsync->file_md5, rsync->file_len)) + return FALSE; + + return TRUE; +}