From 8f6a5c8da615f34cecb7f56f6f29c359277dc958 Mon Sep 17 00:00:00 2001 From: Hawkynt Date: Fri, 23 Oct 2026 09:40:23 +0200 Subject: [PATCH 1/4] + UltraCompressor II (.uc2): read every UC2 release, create r2-readable archives UC2 had no descriptor. Its archives are an FHEAD/XHEAD, headerless "Ultra" streams (LZ77 + Huffman over a 64 KiB history that starts with a dictionary) for files and for shared masters, and a compressed central directory, each checked with UC2's 16-bit XOR checksum. Reader: FHEAD length check (falling back to the spare copy), CDIR decoded with no master and checksum-verified, directories, revisions (the newest of each name is listed), "AIP:Win95 LongN" and UC2X long-name tags (CP437), custom masters decoded over SUPER.DAT or no-master, delta methods 21-47 (dictionary delta'd as UC2 does), turbo method 80. Every file is verified by its checksum. UltraCrypt (UE2) and 2.3 PCP archives are refused. Writer: one 512-byte custom master compressed over the supermaster, every file in method 3 against it, directories, unique 8.3 aliases plus LongN tags, version needed 200 so UC2 r2 accepts it. Oracle: 9 archives written by the original UC2 r2, PRO 2.3 and 2.37b (klauspost/uc2 testdata, LGPL-3.0) are committed; every file's SHA-256 matches the recorded sums, including revisions, delta levels and long names. The format's golden vectors decode and encode exactly. unuc2 (Jan Bobrowski's independent extractor) tests and extracts what we write byte for byte. Sourcing: rung 1 - converted from klauspost/uc2 (LGPL-3.0) and its format.md; SUPER.DAT copied verbatim from that LGPL-3.0 release; notice in THIRD-PARTY-NOTICE.UltraCompressor2.txt. --- Compression.Tests/Compression.Tests.csproj | 4 + .../Uc2/ReferenceVectors/LICENSE.txt | 165 +++ .../Uc2/ReferenceVectors/README.md | 18 + .../Uc2/ReferenceVectors/README.txt | 36 + .../Uc2/ReferenceVectors/r2_def.uc2 | Bin 0 -> 8100 bytes .../Uc2/ReferenceVectors/r2_prot.uc2 | Bin 0 -> 8751 bytes .../Uc2/ReferenceVectors/r2_rev.uc2 | Bin 0 -> 286 bytes .../Uc2/ReferenceVectors/r2_tf.uc2 | Bin 0 -> 8196 bytes .../Uc2/ReferenceVectors/r2_tst.uc2 | Bin 0 -> 8078 bytes .../Uc2/ReferenceVectors/r2_tt.uc2 | Bin 0 -> 8090 bytes .../Uc2/ReferenceVectors/sums.txt | 213 +++ .../Uc2/ReferenceVectors/v237b_lfn.uc2 | Bin 0 -> 544 bytes .../Uc2/ReferenceVectors/v237b_tt.uc2 | Bin 0 -> 8088 bytes .../Uc2/ReferenceVectors/v23_def.uc2 | Bin 0 -> 8104 bytes Compression.Tests/Uc2/Uc2Tests.cs | 216 +++ .../THIRD-PARTY-NOTICE.UltraCompressor2.txt | 21 + .../FileFormats/FileFormat.Uc2/Uc2Archive.cs | 543 +++++++ .../FileFormat.Uc2/Uc2FormatDescriptor.cs | 66 + .../FileFormats/FileFormat.Uc2/Uc2Ultra.cs | 382 +++++ .../FileFormats/FileFormat.Uc2/super.dat | 1276 +++++++++++++++++ .../Hawkynt.FileFormats.Archives.csproj | 6 + Hawkynt.FileFormats.Archives/README.md | 3 +- Hawkynt.FileFormats.Archives/REFERENCE.md | 78 + docs/catalogue/our-registry.csv | 1 + docs/catalogue/reference-formats.csv | 2 +- 25 files changed, 3028 insertions(+), 2 deletions(-) create mode 100644 Compression.Tests/Uc2/ReferenceVectors/LICENSE.txt create mode 100644 Compression.Tests/Uc2/ReferenceVectors/README.md create mode 100644 Compression.Tests/Uc2/ReferenceVectors/README.txt create mode 100644 Compression.Tests/Uc2/ReferenceVectors/r2_def.uc2 create mode 100644 Compression.Tests/Uc2/ReferenceVectors/r2_prot.uc2 create mode 100644 Compression.Tests/Uc2/ReferenceVectors/r2_rev.uc2 create mode 100644 Compression.Tests/Uc2/ReferenceVectors/r2_tf.uc2 create mode 100644 Compression.Tests/Uc2/ReferenceVectors/r2_tst.uc2 create mode 100644 Compression.Tests/Uc2/ReferenceVectors/r2_tt.uc2 create mode 100644 Compression.Tests/Uc2/ReferenceVectors/sums.txt create mode 100644 Compression.Tests/Uc2/ReferenceVectors/v237b_lfn.uc2 create mode 100644 Compression.Tests/Uc2/ReferenceVectors/v237b_tt.uc2 create mode 100644 Compression.Tests/Uc2/ReferenceVectors/v23_def.uc2 create mode 100644 Compression.Tests/Uc2/Uc2Tests.cs create mode 100644 Hawkynt.FileFormats.Archives/FileFormats/FileFormat.Uc2/THIRD-PARTY-NOTICE.UltraCompressor2.txt create mode 100644 Hawkynt.FileFormats.Archives/FileFormats/FileFormat.Uc2/Uc2Archive.cs create mode 100644 Hawkynt.FileFormats.Archives/FileFormats/FileFormat.Uc2/Uc2FormatDescriptor.cs create mode 100644 Hawkynt.FileFormats.Archives/FileFormats/FileFormat.Uc2/Uc2Ultra.cs create mode 100644 Hawkynt.FileFormats.Archives/FileFormats/FileFormat.Uc2/super.dat diff --git a/Compression.Tests/Compression.Tests.csproj b/Compression.Tests/Compression.Tests.csproj index 7bba71ab0..572e8a737 100644 --- a/Compression.Tests/Compression.Tests.csproj +++ b/Compression.Tests/Compression.Tests.csproj @@ -118,6 +118,10 @@ ZfsVectors.%(Filename)%(Extension) + + + Uc2Vectors.%(Filename)%(Extension) + DarVectors.%(Filename)%(Extension) diff --git a/Compression.Tests/Uc2/ReferenceVectors/LICENSE.txt b/Compression.Tests/Uc2/ReferenceVectors/LICENSE.txt new file mode 100644 index 000000000..0a041280b --- /dev/null +++ b/Compression.Tests/Uc2/ReferenceVectors/LICENSE.txt @@ -0,0 +1,165 @@ + GNU LESSER GENERAL PUBLIC LICENSE + Version 3, 29 June 2007 + + Copyright (C) 2007 Free Software Foundation, Inc. + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + + This version of the GNU Lesser General Public License incorporates +the terms and conditions of version 3 of the GNU General Public +License, supplemented by the additional permissions listed below. + + 0. Additional Definitions. + + As used herein, "this License" refers to version 3 of the GNU Lesser +General Public License, and the "GNU GPL" refers to version 3 of the GNU +General Public License. + + "The Library" refers to a covered work governed by this License, +other than an Application or a Combined Work as defined below. + + An "Application" is any work that makes use of an interface provided +by the Library, but which is not otherwise based on the Library. +Defining a subclass of a class defined by the Library is deemed a mode +of using an interface provided by the Library. + + A "Combined Work" is a work produced by combining or linking an +Application with the Library. The particular version of the Library +with which the Combined Work was made is also called the "Linked +Version". + + The "Minimal Corresponding Source" for a Combined Work means the +Corresponding Source for the Combined Work, excluding any source code +for portions of the Combined Work that, considered in isolation, are +based on the Application, and not on the Linked Version. + + The "Corresponding Application Code" for a Combined Work means the +object code and/or source code for the Application, including any data +and utility programs needed for reproducing the Combined Work from the +Application, but excluding the System Libraries of the Combined Work. + + 1. Exception to Section 3 of the GNU GPL. + + You may convey a covered work under sections 3 and 4 of this License +without being bound by section 3 of the GNU GPL. + + 2. Conveying Modified Versions. + + If you modify a copy of the Library, and, in your modifications, a +facility refers to a function or data to be supplied by an Application +that uses the facility (other than as an argument passed when the +facility is invoked), then you may convey a copy of the modified +version: + + a) under this License, provided that you make a good faith effort to + ensure that, in the event an Application does not supply the + function or data, the facility still operates, and performs + whatever part of its purpose remains meaningful, or + + b) under the GNU GPL, with none of the additional permissions of + this License applicable to that copy. + + 3. Object Code Incorporating Material from Library Header Files. + + The object code form of an Application may incorporate material from +a header file that is part of the Library. You may convey such object +code under terms of your choice, provided that, if the incorporated +material is not limited to numerical parameters, data structure +layouts and accessors, or small macros, inline functions and templates +(ten or fewer lines in length), you do both of the following: + + a) Give prominent notice with each copy of the object code that the + Library is used in it and that the Library and its use are + covered by this License. + + b) Accompany the object code with a copy of the GNU GPL and this license + document. + + 4. Combined Works. + + You may convey a Combined Work under terms of your choice that, +taken together, effectively do not restrict modification of the +portions of the Library contained in the Combined Work and reverse +engineering for debugging such modifications, if you also do each of +the following: + + a) Give prominent notice with each copy of the Combined Work that + the Library is used in it and that the Library and its use are + covered by this License. + + b) Accompany the Combined Work with a copy of the GNU GPL and this license + document. + + c) For a Combined Work that displays copyright notices during + execution, include the copyright notice for the Library among + these notices, as well as a reference directing the user to the + copies of the GNU GPL and this license document. + + d) Do one of the following: + + 0) Convey the Minimal Corresponding Source under the terms of this + License, and the Corresponding Application Code in a form + suitable for, and under terms that permit, the user to + recombine or relink the Application with a modified version of + the Linked Version to produce a modified Combined Work, in the + manner specified by section 6 of the GNU GPL for conveying + Corresponding Source. + + 1) Use a suitable shared library mechanism for linking with the + Library. A suitable mechanism is one that (a) uses at run time + a copy of the Library already present on the user's computer + system, and (b) will operate properly with a modified version + of the Library that is interface-compatible with the Linked + Version. + + e) Provide Installation Information, but only if you would otherwise + be required to provide such information under section 6 of the + GNU GPL, and only to the extent that such information is + necessary to install and execute a modified version of the + Combined Work produced by recombining or relinking the + Application with a modified version of the Linked Version. (If + you use option 4d0, the Installation Information must accompany + the Minimal Corresponding Source and Corresponding Application + Code. If you use option 4d1, you must provide the Installation + Information in the manner specified by section 6 of the GNU GPL + for conveying Corresponding Source.) + + 5. Combined Libraries. + + You may place library facilities that are a work based on the +Library side by side in a single library together with other library +facilities that are not Applications and are not covered by this +License, and convey such a combined library under terms of your +choice, if you do both of the following: + + a) Accompany the combined library with a copy of the same work based + on the Library, uncombined with any other library facilities, + conveyed under the terms of this License. + + b) Give prominent notice with the combined library that part of it + is a work based on the Library, and explaining where to find the + accompanying uncombined form of the same work. + + 6. Revised Versions of the GNU Lesser General Public License. + + The Free Software Foundation may publish revised and/or new versions +of the GNU Lesser 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 +Library as you received it specifies that a certain numbered version +of the GNU Lesser General Public License "or any later version" +applies to it, you have the option of following the terms and +conditions either of that published version or of any later version +published by the Free Software Foundation. If the Library as you +received it does not specify a version number of the GNU Lesser +General Public License, you may choose any version of the GNU Lesser +General Public License ever published by the Free Software Foundation. + + If the Library as you received it specifies that a proxy can decide +whether future versions of the GNU Lesser General Public License shall +apply, that proxy's public statement of acceptance of any version is +permanent authorization for you to choose that version for the +Library. diff --git a/Compression.Tests/Uc2/ReferenceVectors/README.md b/Compression.Tests/Uc2/ReferenceVectors/README.md new file mode 100644 index 000000000..f01892952 --- /dev/null +++ b/Compression.Tests/Uc2/ReferenceVectors/README.md @@ -0,0 +1,18 @@ +# UltraCompressor II reference archives + +Written by the original UltraCompressor II (r2, PRO 2.3 and 2.37 beta, run in DOSBox-X), never by +CompressionWorkbench. Taken unmodified from `testdata/oracle/` of +[klauspost/uc2](https://github.com/klauspost/uc2) at revision +`53622f89ada1cf0d4a69f91b653bdd44ec5b0f92` (LGPL-3.0, `LICENSE.txt` beside this file); `README.txt` +is that directory's own description of how each archive was made, and `sums.txt` lists the first 8 +bytes of the SHA-256 of every stored file revision. + +| File | Made by | What it pins | +| --- | --- | --- | +| `r2_def.uc2` | UC r2 `UC A C:\DEF *.*` | default method, custom masters over the supermaster | +| `r2_prot.uc2` | UC r2 `UC A -S -P` | damage-protection area after the component; subdirectories | +| `r2_rev.uc2` | UC r2 `UC A` then `UC A -I` twice | three revisions of one name; the newest is listed | +| `r2_tf.uc2`, `r2_tst.uc2`, `r2_tt.uc2` | UC r2 `-TF`, `-TST`, `-TT` | fast, tight and super-tight levels (the tight levels may pick delta methods) | +| `v23_def.uc2` | UC PRO 2.3 | made-by 203 | +| `v237b_lfn.uc2` | UC 2.37b `UC A -S` | `AIP:Win95 LongN` tags, CP437 names (`Café crème.txt`) | +| `v237b_tt.uc2` | UC 2.37b `-TT` | 2.37b's encoder at the tight level | diff --git a/Compression.Tests/Uc2/ReferenceVectors/README.txt b/Compression.Tests/Uc2/ReferenceVectors/README.txt new file mode 100644 index 000000000..d561483d1 --- /dev/null +++ b/Compression.Tests/Uc2/ReferenceVectors/README.txt @@ -0,0 +1,36 @@ +Archives made by the original UltraCompressor II in DOSBox-X by +TestOracleUC2ToGo (UC2_DOSBOX=... UC2_ORACLE_SAVE=1 go test -run OracleUC2ToGo). +The corpus is generated by oracleCorpus in oracle_test.go; all files have +mtime 2025-01-02 03:04:06 local time (VERS.TXT revision n: +n hours). +Commands run in the source directory with UC2_ANONYMOUS=1, UC2_OK=OFF. +sums.txt lists "archive sha256[:8] revision name" for every file revision +(names UTF-8, decoded from CP437). "UC T -F" of all three versions accepts +every archive. DOSBox-X on Windows converts mtimes to DOS time with the +current UTC offset, so stored times may differ by the DST offset. Re-running +with the same UTC offset reproduces the archives byte for byte. + +Versions: r2 = UC2 revision 2 (uc2r2.exe), v23 = UC2 PRO 2.3 (uc2pro.exe), +v237b = UC 2.37 beta (uc237b.exe, stores Win95 long names). + +r2_def.uc2 8100 bytes UC r2: UC A C:\DEF *.* +r2_prot.uc2 8751 bytes UC r2: UC A -S -P C:\PROT *.* +r2_rev.uc2 286 bytes UC r2: UC A C:\REV *.* ; UC A -I C:\REV *.* ; UC A -I C:\REV *.* +r2_tf.uc2 8196 bytes UC r2: UC A -S -TF C:\TF *.* +r2_tn.uc2 8190 bytes UC r2: UC A -S -TN C:\TN *.* +r2_tst.uc2 8078 bytes UC r2: UC A -S -TST C:\TST *.* +r2_tt.uc2 8090 bytes UC r2: UC A -S -TT C:\TT *.* +v237b_def.uc2 8104 bytes UC 2.37b: UC A C:\DEF *.* +v237b_lfn.uc2 544 bytes UC 2.37b: UC A -S C:\LFN *.* +v237b_prot.uc2 8751 bytes UC 2.37b: UC A -S -P C:\PROT *.* +v237b_rev.uc2 286 bytes UC 2.37b: UC A C:\REV *.* ; UC A -I C:\REV *.* ; UC A -I C:\REV *.* +v237b_tf.uc2 8196 bytes UC 2.37b: UC A -S -TF C:\TF *.* +v237b_tn.uc2 8192 bytes UC 2.37b: UC A -S -TN C:\TN *.* +v237b_tst.uc2 8074 bytes UC 2.37b: UC A -S -TST C:\TST *.* +v237b_tt.uc2 8088 bytes UC 2.37b: UC A -S -TT C:\TT *.* +v23_def.uc2 8104 bytes UC 2.3: UC A C:\DEF *.* +v23_prot.uc2 8751 bytes UC 2.3: UC A -S -P C:\PROT *.* +v23_rev.uc2 286 bytes UC 2.3: UC A C:\REV *.* ; UC A -I C:\REV *.* ; UC A -I C:\REV *.* +v23_tf.uc2 8196 bytes UC 2.3: UC A -S -TF C:\TF *.* +v23_tn.uc2 8192 bytes UC 2.3: UC A -S -TN C:\TN *.* +v23_tst.uc2 8074 bytes UC 2.3: UC A -S -TST C:\TST *.* +v23_tt.uc2 8088 bytes UC 2.3: UC A -S -TT C:\TT *.* diff --git a/Compression.Tests/Uc2/ReferenceVectors/r2_def.uc2 b/Compression.Tests/Uc2/ReferenceVectors/r2_def.uc2 new file mode 100644 index 0000000000000000000000000000000000000000..3610a1bd64f1507240f6f8142b6e338aa966d88b GIT binary patch literal 8100 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 literal 0 HcmV?d00001 diff --git a/Compression.Tests/Uc2/ReferenceVectors/r2_prot.uc2 b/Compression.Tests/Uc2/ReferenceVectors/r2_prot.uc2 new file mode 100644 index 0000000000000000000000000000000000000000..8d689f3c3211b34ae16d8d5ff5e54d7b526a612f GIT binary patch literal 8751 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 WkL+A!jA9}0ueB{a())iuME(z(F}!F1 literal 0 HcmV?d00001 diff --git a/Compression.Tests/Uc2/ReferenceVectors/r2_rev.uc2 b/Compression.Tests/Uc2/ReferenceVectors/r2_rev.uc2 new file mode 100644 index 0000000000000000000000000000000000000000..fc0a4906f9059638d3a87d82d8823990026798ab GIT binary patch literal 286 zcmWG_Hj-jtWMH^)WD_F;kY;EH;#<`Wrx;E!FdW$MSC8cd1H-NjGPPgo7?|eo<6W*9 zmRBqAz<$!%nfKW{(=L7a`^x29q&>gO=^Oqm_KS}1I#9Cu%Z1+z9J@AL4qeV&d9mBB zs-A%{bA_g+U}ivA(5=*)br+bvfXuuOmfs7O2U^O&47UH!MqRG8YxAZ_#Rd8?3K(lY z*0xT*v3ak?f;s&QQ+;@Pg{5{@|5P*CA#&iHoq3|k$-A@7U%H)Tt;uJ4I%}7Cq}rps z72&g8oNlvJr>LiHUUpge=dy>@!snmPNhrR%ud~?epo^o=_g;yjv@`7P$Gm5Mw7e{w TY+)tImca8*6y&Z@fv=( literal 0 HcmV?d00001 diff --git a/Compression.Tests/Uc2/ReferenceVectors/r2_tf.uc2 b/Compression.Tests/Uc2/ReferenceVectors/r2_tf.uc2 new file mode 100644 index 0000000000000000000000000000000000000000..55cd1601f1ea2b99bfbd1afb5ad3c82557f3f074 GIT binary patch literal 8196 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 literal 0 HcmV?d00001 diff --git a/Compression.Tests/Uc2/ReferenceVectors/r2_tst.uc2 b/Compression.Tests/Uc2/ReferenceVectors/r2_tst.uc2 new file mode 100644 index 0000000000000000000000000000000000000000..a43375e8d3016b9548b878981a2f7bbcd9edc826 GIT binary patch literal 8078 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

SLXz`iAtVqoVStT-u5H?y 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 literal 0 HcmV?d00001 diff --git a/Compression.Tests/Uc2/ReferenceVectors/sums.txt b/Compression.Tests/Uc2/ReferenceVectors/sums.txt new file mode 100644 index 000000000..e16b86ab8 --- /dev/null +++ b/Compression.Tests/Uc2/ReferenceVectors/sums.txt @@ -0,0 +1,213 @@ +r2_def.uc2 fe698381b5867e9a 0 HELLO.TXT +r2_def.uc2 e3b0c44298fc1c14 0 EMPTY.DAT +r2_def.uc2 55e7449bfafaeb29 0 TEXT.TXT +r2_def.uc2 6ac9c2f2f37dffed 0 SOURCE.C +r2_def.uc2 7def5a7e066a3a2e 0 BINARY.BIN +r2_def.uc2 ce7d9ba00521670a 0 RANDOM.BIN +r2_def.uc2 9f1dcbc35c350d60 0 ZEROS.BIN +r2_def.uc2 40aff2e9d2d8922e 0 ALLBYTES.BIN +r2_def.uc2 c2e59f96175d054a 0 SOUND.WAV +r2_prot.uc2 fe698381b5867e9a 0 HELLO.TXT +r2_prot.uc2 e3b0c44298fc1c14 0 EMPTY.DAT +r2_prot.uc2 55e7449bfafaeb29 0 TEXT.TXT +r2_prot.uc2 6ac9c2f2f37dffed 0 SOURCE.C +r2_prot.uc2 7def5a7e066a3a2e 0 BINARY.BIN +r2_prot.uc2 ce7d9ba00521670a 0 RANDOM.BIN +r2_prot.uc2 9f1dcbc35c350d60 0 ZEROS.BIN +r2_prot.uc2 40aff2e9d2d8922e 0 ALLBYTES.BIN +r2_prot.uc2 c2e59f96175d054a 0 SOUND.WAV +r2_prot.uc2 c99fcad02327e45f 0 SUB/NESTED.TXT +r2_prot.uc2 f146e9b5474872cc 0 SUB/DEEP/DEEPER.TXT +r2_rev.uc2 fbdf08b036b1d798 2 VERS.TXT +r2_rev.uc2 b024953a6dc0f1d0 0 ÉTÉ.TXT +r2_rev.uc2 304d27f074f1fb66 1 VERS.TXT +r2_rev.uc2 f3adfa173b453df1 0 NEW.TXT +r2_rev.uc2 aa08feae8030e6d7 0 VERS.TXT +r2_tf.uc2 fe698381b5867e9a 0 HELLO.TXT +r2_tf.uc2 e3b0c44298fc1c14 0 EMPTY.DAT +r2_tf.uc2 55e7449bfafaeb29 0 TEXT.TXT +r2_tf.uc2 6ac9c2f2f37dffed 0 SOURCE.C +r2_tf.uc2 7def5a7e066a3a2e 0 BINARY.BIN +r2_tf.uc2 ce7d9ba00521670a 0 RANDOM.BIN +r2_tf.uc2 9f1dcbc35c350d60 0 ZEROS.BIN +r2_tf.uc2 40aff2e9d2d8922e 0 ALLBYTES.BIN +r2_tf.uc2 c2e59f96175d054a 0 SOUND.WAV +r2_tf.uc2 c99fcad02327e45f 0 SUB/NESTED.TXT +r2_tf.uc2 f146e9b5474872cc 0 SUB/DEEP/DEEPER.TXT +r2_tn.uc2 fe698381b5867e9a 0 HELLO.TXT +r2_tn.uc2 e3b0c44298fc1c14 0 EMPTY.DAT +r2_tn.uc2 55e7449bfafaeb29 0 TEXT.TXT +r2_tn.uc2 6ac9c2f2f37dffed 0 SOURCE.C +r2_tn.uc2 7def5a7e066a3a2e 0 BINARY.BIN +r2_tn.uc2 ce7d9ba00521670a 0 RANDOM.BIN +r2_tn.uc2 9f1dcbc35c350d60 0 ZEROS.BIN +r2_tn.uc2 40aff2e9d2d8922e 0 ALLBYTES.BIN +r2_tn.uc2 c2e59f96175d054a 0 SOUND.WAV +r2_tn.uc2 c99fcad02327e45f 0 SUB/NESTED.TXT +r2_tn.uc2 f146e9b5474872cc 0 SUB/DEEP/DEEPER.TXT +r2_tst.uc2 fe698381b5867e9a 0 HELLO.TXT +r2_tst.uc2 e3b0c44298fc1c14 0 EMPTY.DAT +r2_tst.uc2 55e7449bfafaeb29 0 TEXT.TXT +r2_tst.uc2 6ac9c2f2f37dffed 0 SOURCE.C +r2_tst.uc2 7def5a7e066a3a2e 0 BINARY.BIN +r2_tst.uc2 ce7d9ba00521670a 0 RANDOM.BIN +r2_tst.uc2 9f1dcbc35c350d60 0 ZEROS.BIN +r2_tst.uc2 40aff2e9d2d8922e 0 ALLBYTES.BIN +r2_tst.uc2 c2e59f96175d054a 0 SOUND.WAV +r2_tst.uc2 c99fcad02327e45f 0 SUB/NESTED.TXT +r2_tst.uc2 f146e9b5474872cc 0 SUB/DEEP/DEEPER.TXT +r2_tt.uc2 fe698381b5867e9a 0 HELLO.TXT +r2_tt.uc2 e3b0c44298fc1c14 0 EMPTY.DAT +r2_tt.uc2 55e7449bfafaeb29 0 TEXT.TXT +r2_tt.uc2 6ac9c2f2f37dffed 0 SOURCE.C +r2_tt.uc2 7def5a7e066a3a2e 0 BINARY.BIN +r2_tt.uc2 ce7d9ba00521670a 0 RANDOM.BIN +r2_tt.uc2 9f1dcbc35c350d60 0 ZEROS.BIN +r2_tt.uc2 40aff2e9d2d8922e 0 ALLBYTES.BIN +r2_tt.uc2 c2e59f96175d054a 0 SOUND.WAV +r2_tt.uc2 c99fcad02327e45f 0 SUB/NESTED.TXT +r2_tt.uc2 f146e9b5474872cc 0 SUB/DEEP/DEEPER.TXT +v237b_def.uc2 fe698381b5867e9a 0 HELLO.TXT +v237b_def.uc2 e3b0c44298fc1c14 0 EMPTY.DAT +v237b_def.uc2 55e7449bfafaeb29 0 TEXT.TXT +v237b_def.uc2 6ac9c2f2f37dffed 0 SOURCE.C +v237b_def.uc2 7def5a7e066a3a2e 0 BINARY.BIN +v237b_def.uc2 ce7d9ba00521670a 0 RANDOM.BIN +v237b_def.uc2 9f1dcbc35c350d60 0 ZEROS.BIN +v237b_def.uc2 40aff2e9d2d8922e 0 ALLBYTES.BIN +v237b_def.uc2 c2e59f96175d054a 0 SOUND.WAV +v237b_lfn.uc2 45657ab604a2607f 0 A long file name.txt +v237b_lfn.uc2 5e0449c363c3edd1 0 lower.txt +v237b_lfn.uc2 bbe2f841ea9788d9 0 multi.part.name.txt +v237b_lfn.uc2 52b46cae40507d13 0 UPPER.TXT +v237b_lfn.uc2 a23caf9bd14c14ee 0 Café crème.txt +v237b_lfn.uc2 dcadeab3cdface01 0 Long Directory Name/Another Long Name.dat +v237b_prot.uc2 fe698381b5867e9a 0 HELLO.TXT +v237b_prot.uc2 e3b0c44298fc1c14 0 EMPTY.DAT +v237b_prot.uc2 55e7449bfafaeb29 0 TEXT.TXT +v237b_prot.uc2 6ac9c2f2f37dffed 0 SOURCE.C +v237b_prot.uc2 7def5a7e066a3a2e 0 BINARY.BIN +v237b_prot.uc2 ce7d9ba00521670a 0 RANDOM.BIN +v237b_prot.uc2 9f1dcbc35c350d60 0 ZEROS.BIN +v237b_prot.uc2 40aff2e9d2d8922e 0 ALLBYTES.BIN +v237b_prot.uc2 c2e59f96175d054a 0 SOUND.WAV +v237b_prot.uc2 c99fcad02327e45f 0 SUB/NESTED.TXT +v237b_prot.uc2 f146e9b5474872cc 0 SUB/DEEP/DEEPER.TXT +v237b_rev.uc2 fbdf08b036b1d798 2 VERS.TXT +v237b_rev.uc2 b024953a6dc0f1d0 0 ÉTÉ.TXT +v237b_rev.uc2 304d27f074f1fb66 1 VERS.TXT +v237b_rev.uc2 f3adfa173b453df1 0 NEW.TXT +v237b_rev.uc2 aa08feae8030e6d7 0 VERS.TXT +v237b_tf.uc2 fe698381b5867e9a 0 HELLO.TXT +v237b_tf.uc2 e3b0c44298fc1c14 0 EMPTY.DAT +v237b_tf.uc2 55e7449bfafaeb29 0 TEXT.TXT +v237b_tf.uc2 6ac9c2f2f37dffed 0 SOURCE.C +v237b_tf.uc2 7def5a7e066a3a2e 0 BINARY.BIN +v237b_tf.uc2 ce7d9ba00521670a 0 RANDOM.BIN +v237b_tf.uc2 9f1dcbc35c350d60 0 ZEROS.BIN +v237b_tf.uc2 40aff2e9d2d8922e 0 ALLBYTES.BIN +v237b_tf.uc2 c2e59f96175d054a 0 SOUND.WAV +v237b_tf.uc2 c99fcad02327e45f 0 SUB/NESTED.TXT +v237b_tf.uc2 f146e9b5474872cc 0 SUB/DEEP/DEEPER.TXT +v237b_tn.uc2 fe698381b5867e9a 0 HELLO.TXT +v237b_tn.uc2 e3b0c44298fc1c14 0 EMPTY.DAT +v237b_tn.uc2 55e7449bfafaeb29 0 TEXT.TXT +v237b_tn.uc2 6ac9c2f2f37dffed 0 SOURCE.C +v237b_tn.uc2 7def5a7e066a3a2e 0 BINARY.BIN +v237b_tn.uc2 ce7d9ba00521670a 0 RANDOM.BIN +v237b_tn.uc2 9f1dcbc35c350d60 0 ZEROS.BIN +v237b_tn.uc2 40aff2e9d2d8922e 0 ALLBYTES.BIN +v237b_tn.uc2 c2e59f96175d054a 0 SOUND.WAV +v237b_tn.uc2 c99fcad02327e45f 0 SUB/NESTED.TXT +v237b_tn.uc2 f146e9b5474872cc 0 SUB/DEEP/DEEPER.TXT +v237b_tst.uc2 fe698381b5867e9a 0 HELLO.TXT +v237b_tst.uc2 e3b0c44298fc1c14 0 EMPTY.DAT +v237b_tst.uc2 55e7449bfafaeb29 0 TEXT.TXT +v237b_tst.uc2 6ac9c2f2f37dffed 0 SOURCE.C +v237b_tst.uc2 7def5a7e066a3a2e 0 BINARY.BIN +v237b_tst.uc2 ce7d9ba00521670a 0 RANDOM.BIN +v237b_tst.uc2 9f1dcbc35c350d60 0 ZEROS.BIN +v237b_tst.uc2 40aff2e9d2d8922e 0 ALLBYTES.BIN +v237b_tst.uc2 c2e59f96175d054a 0 SOUND.WAV +v237b_tst.uc2 c99fcad02327e45f 0 SUB/NESTED.TXT +v237b_tst.uc2 f146e9b5474872cc 0 SUB/DEEP/DEEPER.TXT +v237b_tt.uc2 fe698381b5867e9a 0 HELLO.TXT +v237b_tt.uc2 e3b0c44298fc1c14 0 EMPTY.DAT +v237b_tt.uc2 55e7449bfafaeb29 0 TEXT.TXT +v237b_tt.uc2 6ac9c2f2f37dffed 0 SOURCE.C +v237b_tt.uc2 7def5a7e066a3a2e 0 BINARY.BIN +v237b_tt.uc2 ce7d9ba00521670a 0 RANDOM.BIN +v237b_tt.uc2 9f1dcbc35c350d60 0 ZEROS.BIN +v237b_tt.uc2 40aff2e9d2d8922e 0 ALLBYTES.BIN +v237b_tt.uc2 c2e59f96175d054a 0 SOUND.WAV +v237b_tt.uc2 c99fcad02327e45f 0 SUB/NESTED.TXT +v237b_tt.uc2 f146e9b5474872cc 0 SUB/DEEP/DEEPER.TXT +v23_def.uc2 fe698381b5867e9a 0 HELLO.TXT +v23_def.uc2 e3b0c44298fc1c14 0 EMPTY.DAT +v23_def.uc2 55e7449bfafaeb29 0 TEXT.TXT +v23_def.uc2 6ac9c2f2f37dffed 0 SOURCE.C +v23_def.uc2 7def5a7e066a3a2e 0 BINARY.BIN +v23_def.uc2 ce7d9ba00521670a 0 RANDOM.BIN +v23_def.uc2 9f1dcbc35c350d60 0 ZEROS.BIN +v23_def.uc2 40aff2e9d2d8922e 0 ALLBYTES.BIN +v23_def.uc2 c2e59f96175d054a 0 SOUND.WAV +v23_prot.uc2 fe698381b5867e9a 0 HELLO.TXT +v23_prot.uc2 e3b0c44298fc1c14 0 EMPTY.DAT +v23_prot.uc2 55e7449bfafaeb29 0 TEXT.TXT +v23_prot.uc2 6ac9c2f2f37dffed 0 SOURCE.C +v23_prot.uc2 7def5a7e066a3a2e 0 BINARY.BIN +v23_prot.uc2 ce7d9ba00521670a 0 RANDOM.BIN +v23_prot.uc2 9f1dcbc35c350d60 0 ZEROS.BIN +v23_prot.uc2 40aff2e9d2d8922e 0 ALLBYTES.BIN +v23_prot.uc2 c2e59f96175d054a 0 SOUND.WAV +v23_prot.uc2 c99fcad02327e45f 0 SUB/NESTED.TXT +v23_prot.uc2 f146e9b5474872cc 0 SUB/DEEP/DEEPER.TXT +v23_rev.uc2 fbdf08b036b1d798 2 VERS.TXT +v23_rev.uc2 b024953a6dc0f1d0 0 ÉTÉ.TXT +v23_rev.uc2 304d27f074f1fb66 1 VERS.TXT +v23_rev.uc2 f3adfa173b453df1 0 NEW.TXT +v23_rev.uc2 aa08feae8030e6d7 0 VERS.TXT +v23_tf.uc2 fe698381b5867e9a 0 HELLO.TXT +v23_tf.uc2 e3b0c44298fc1c14 0 EMPTY.DAT +v23_tf.uc2 55e7449bfafaeb29 0 TEXT.TXT +v23_tf.uc2 6ac9c2f2f37dffed 0 SOURCE.C +v23_tf.uc2 7def5a7e066a3a2e 0 BINARY.BIN +v23_tf.uc2 ce7d9ba00521670a 0 RANDOM.BIN +v23_tf.uc2 9f1dcbc35c350d60 0 ZEROS.BIN +v23_tf.uc2 40aff2e9d2d8922e 0 ALLBYTES.BIN +v23_tf.uc2 c2e59f96175d054a 0 SOUND.WAV +v23_tf.uc2 c99fcad02327e45f 0 SUB/NESTED.TXT +v23_tf.uc2 f146e9b5474872cc 0 SUB/DEEP/DEEPER.TXT +v23_tn.uc2 fe698381b5867e9a 0 HELLO.TXT +v23_tn.uc2 e3b0c44298fc1c14 0 EMPTY.DAT +v23_tn.uc2 55e7449bfafaeb29 0 TEXT.TXT +v23_tn.uc2 6ac9c2f2f37dffed 0 SOURCE.C +v23_tn.uc2 7def5a7e066a3a2e 0 BINARY.BIN +v23_tn.uc2 ce7d9ba00521670a 0 RANDOM.BIN +v23_tn.uc2 9f1dcbc35c350d60 0 ZEROS.BIN +v23_tn.uc2 40aff2e9d2d8922e 0 ALLBYTES.BIN +v23_tn.uc2 c2e59f96175d054a 0 SOUND.WAV +v23_tn.uc2 c99fcad02327e45f 0 SUB/NESTED.TXT +v23_tn.uc2 f146e9b5474872cc 0 SUB/DEEP/DEEPER.TXT +v23_tst.uc2 fe698381b5867e9a 0 HELLO.TXT +v23_tst.uc2 e3b0c44298fc1c14 0 EMPTY.DAT +v23_tst.uc2 55e7449bfafaeb29 0 TEXT.TXT +v23_tst.uc2 6ac9c2f2f37dffed 0 SOURCE.C +v23_tst.uc2 7def5a7e066a3a2e 0 BINARY.BIN +v23_tst.uc2 ce7d9ba00521670a 0 RANDOM.BIN +v23_tst.uc2 9f1dcbc35c350d60 0 ZEROS.BIN +v23_tst.uc2 40aff2e9d2d8922e 0 ALLBYTES.BIN +v23_tst.uc2 c2e59f96175d054a 0 SOUND.WAV +v23_tst.uc2 c99fcad02327e45f 0 SUB/NESTED.TXT +v23_tst.uc2 f146e9b5474872cc 0 SUB/DEEP/DEEPER.TXT +v23_tt.uc2 fe698381b5867e9a 0 HELLO.TXT +v23_tt.uc2 e3b0c44298fc1c14 0 EMPTY.DAT +v23_tt.uc2 55e7449bfafaeb29 0 TEXT.TXT +v23_tt.uc2 6ac9c2f2f37dffed 0 SOURCE.C +v23_tt.uc2 7def5a7e066a3a2e 0 BINARY.BIN +v23_tt.uc2 ce7d9ba00521670a 0 RANDOM.BIN +v23_tt.uc2 9f1dcbc35c350d60 0 ZEROS.BIN +v23_tt.uc2 40aff2e9d2d8922e 0 ALLBYTES.BIN +v23_tt.uc2 c2e59f96175d054a 0 SOUND.WAV +v23_tt.uc2 c99fcad02327e45f 0 SUB/NESTED.TXT +v23_tt.uc2 f146e9b5474872cc 0 SUB/DEEP/DEEPER.TXT diff --git a/Compression.Tests/Uc2/ReferenceVectors/v237b_lfn.uc2 b/Compression.Tests/Uc2/ReferenceVectors/v237b_lfn.uc2 new file mode 100644 index 0000000000000000000000000000000000000000..6e7e374f5dc4e7339be656536a0588630934e892 GIT binary patch literal 544 zcmV+*0^j{rLoyl$0ssKo#j*ha0RR91l>h($^O*q40LTCUz_9%=1n2+&z_9%%1n2+& zys-BV5TF16y0HDM1n2+&wXpqY1n2+&v9S9g2+#lkDzWMVv2^;Oq?57!hsH|X06UO9 z^!@+>$G#6Qsi)}yuN!6GNvZW;Ad)}*Upm@S_L-9KnLh{JqSSaMP?@RwVE?ZN-akNq z000000{{U4008s$cd&BUW@cd$cAAVB$dHgssK{Ql&>*C(K3ZF}lyU}&QqW~i9d@T zlo^ZyA?TGubTDZZ+-7pS^C(Kq+|BqV>=vH<|#AO7k9 literal 0 HcmV?d00001 diff --git a/Compression.Tests/Uc2/ReferenceVectors/v237b_tt.uc2 b/Compression.Tests/Uc2/ReferenceVectors/v237b_tt.uc2 new file mode 100644 index 0000000000000000000000000000000000000000..8015334b0fed0c719e79f58298594306cf811b6c GIT binary patch literal 8088 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 literal 0 HcmV?d00001 diff --git a/Compression.Tests/Uc2/ReferenceVectors/v23_def.uc2 b/Compression.Tests/Uc2/ReferenceVectors/v23_def.uc2 new file mode 100644 index 0000000000000000000000000000000000000000..b389fbda5265df684d3587f794dab407011e5f5e GIT binary patch literal 8104 zcmY+JRa+Dc*sTYKX6WvrQxFh_l%YXtXi&Pl1?ldT?vh4n7?JKqQo6glYro%j?Ss9K z?q|g>c$TIl4|yC70AR9JhX6nT005HI0Kf$qU<5D-0OU79XjVI*0SWETfOuBu834TA zs7bS$2My?{@#jJC`mYYC`Y+?E{GZIINsDIH5E@|ANc_L-tl<&8egz=rwbM9dln;d- zj&!-*Nbiq+0BIQJ;vZ@^kUSQ!U$&NoimYbzzzU195WT=Vdol@1mH*kq1FfhHXs&B#@Rv7hTe10!i z7n?+Fdy6-&(B!xHZM55ckiW-u%%;b4$o4YZwI96hC7?{KD#xOlWbo!;J^zWL_~CSHxVwA~GlY7S?lq+~capPrtNRXYBD zjn6p4Q7U^yW#_$L6Z0EhU2`l**FeTatBhK@%eQ)pZ;5)!f*cKaMjvv}qzU-x<(aLL z1`FkVOAmW@IA%>X-xloDYeB$@A0>Rv(dAsbRzN)n4L$A>dP}{kcvHg&Ci!>WYy6`v zI@5fp(ne_ySRSHQ+I6|>k@&aqY#C=gb}t&GqxHGW5m!YgFZ*xgSh;Ni*KMt?NZI&OuEc?W-D19;(zu0lLyBvmQ#$d!Y3zom` zR_h`+zIdX39__pC)l{CMuDQK3|GDXQ!_C+dz5AJ)g-C-ltIC_`a0NistT7L zy?GE73AReAauhpf@|^3*$Kx+rG^L5b5rINh4QGoLUr%`(2ZzJSUDxuns{hn*OpBBm z0_W-BWn$aaQM^HFcK%;uHPE{_DK5n9W1UD&q<1DR0cJ#7sxo&Pb0L3qQaDx=u`OO# z`8mYyjol94d#<>UxoIb*CEJ%_g&8zv%#P39!!>-%L;Kp>?qOM|04v9hoW4

s*1* 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 +/// UltraCompressor II: archives the original UC2 r2 / 2.3 / 2.37b wrote (Uc2/ReferenceVectors), +/// the format's golden vectors, our writer, and unuc2 (an independent decoder) as the oracle for +/// what we write. +/// +[TestFixture] +public class Uc2Tests { + + private string _tmpDir = null!; + + [SetUp] + public void Setup() { + this._tmpDir = Path.Combine(Path.GetTempPath(), $"cwb_uc2_{Guid.NewGuid():N}"); + Directory.CreateDirectory(this._tmpDir); + } + + [TearDown] + public void Teardown() { + try { Directory.Delete(this._tmpDir, true); } catch { /* best effort */ } + } + + // ── checksum and bitstream vectors (format.md §5, §6.10) ──────────── + + [TestCase("", 0xA55A)] + [TestCase("a", 0xA53B)] + [TestCase("ab", 0xC73B)] + [TestCase("abc", 0xC758)] + [TestCase("abcd", 0xA358)] + [TestCase("123456789", 0xAD63)] + [Category("HappyPath")] + public void GivenKnownInput_WhenChecksummed_ThenMatchesTheFormatsVector(string input, int expected) + => Assert.That(Uc2Archive.Fletch(System.Text.Encoding.ASCII.GetBytes(input)), Is.EqualTo((ushort)expected)); + + [Test, Category("HappyPath")] + public void GivenTheEmptyRawCdir_WhenChecksummed_ThenIsA55E() { + byte[] raw = [0x04, .. new byte[21]]; + Assert.That(Uc2Archive.Fletch(raw), Is.EqualTo((ushort)0xA55E)); + } + + [Test, Category("HappyPath")] + public void GivenTheGoldenStreamForA_WhenDecodedWithNoMaster_ThenYieldsA() { + byte[] stream = [0xBF, 0xA0, 0x01, 0x7A, 0x00, 0x00]; + Assert.That(Uc2Ultra.Decode(stream, 0, stream.Length, new byte[512], 1), Is.EqualTo("A"u8.ToArray())); + } + + [Test, Category("HappyPath")] + public void GivenUc2sEmptyCdirStream_WhenDecodedToItsEnd_ThenYieldsTheEmptyCdir() { + byte[] stream = [0x09, 0xB2, 0xCF, 0xD2, 0x80, 0xDE, 0x00, 0x40]; + byte[] expected = [0x04, .. new byte[21]]; + Assert.That(Uc2Ultra.Decode(stream, 0, stream.Length, new byte[512], -1), Is.EqualTo(expected)); + } + + [Test, Category("HappyPath")] + public void GivenA_WhenEncodedWithDefaultTrees_ThenProducesTheGoldenStream() { + Assert.That(Uc2Ultra.Encode("A"u8, new byte[512]), Is.EqualTo(new byte[] { 0xBF, 0xA0, 0x01, 0x7A, 0x00, 0x00 })); + Assert.That(Uc2Ultra.Encode([], new byte[512]), Is.EqualTo(new byte[] { 0x00, 0x00 })); + } + + // ── archives written by the original UC2 ──────────────────────────── + + private static readonly string[] Vectors = ["r2_def.uc2", "r2_prot.uc2", "r2_rev.uc2", "r2_tf.uc2", "r2_tst.uc2", "r2_tt.uc2", "v23_def.uc2", "v237b_lfn.uc2", "v237b_tt.uc2"]; + + [TestCaseSource(nameof(Vectors)), Category("ThemVsUs")] + public void GivenArchiveWrittenByUc2_WhenEveryFileIsExtracted_ThenItsSha256MatchesTheRecordedSum(string vector) { + var expected = Sums().Where(s => s.Archive == vector && s.Revision == 0).ToDictionary(s => s.Name, s => s.Sha8); + Assert.That(expected, Is.Not.Empty); + var archive = Uc2Archive.Read(new MemoryStream(LoadVector(vector))); + var files = archive.Entries.Where(e => !e.IsDirectory).ToList(); + + Assert.That(files.Select(e => e.Path), Is.EquivalentTo(expected.Keys)); + foreach (var e in files) + Assert.That(Convert.ToHexStringLower(SHA256.HashData(Uc2Archive.Extract(archive, e)))[..16], Is.EqualTo(expected[e.Path]), $"{vector}: {e.Path}"); + } + + [Test, Category("ThemVsUs")] + public void GivenRevisionedArchive_WhenListed_ThenOnlyTheNewestRevisionAppears() { + var archive = Uc2Archive.Read(new MemoryStream(LoadVector("r2_rev.uc2"))); + var newest = Sums().Single(s => s.Archive == "r2_rev.uc2" && s.Name == "VERS.TXT" && s.Revision == 0); + var e = archive.Entries.Single(x => x.Path == "VERS.TXT"); + Assert.That(Convert.ToHexStringLower(SHA256.HashData(Uc2Archive.Extract(archive, e)))[..16], Is.EqualTo(newest.Sha8)); + } + + [Test, Category("Exception")] + public void GivenDamagedFileStream_WhenExtracted_ThenTheChecksumRefusesIt() { + var bytes = LoadVector("r2_def.uc2"); + var probe = Uc2Archive.Read(new MemoryStream(bytes)); + var text = probe.Entries.Single(e => e.Path == "TEXT.TXT"); + // The first stream bit (MSB of the first word's high byte) says "a block follows"; + // clearing it ends the stream before the recorded size. + bytes[text.Offset + 1] ^= 0x80; + + var archive = Uc2Archive.Read(new MemoryStream(bytes)); + Assert.That(() => Uc2Archive.Extract(archive, archive.Entries.Single(e => e.Path == "TEXT.TXT")), Throws.InstanceOf()); + } + + [Test, Category("Exception")] + public void GivenDamagedHeader_WhenRead_ThenRefused() { + var bytes = LoadVector("r2_def.uc2"); + bytes[0] = (byte)'X'; + Assert.That(() => Uc2Archive.Read(new MemoryStream(bytes)), Throws.InstanceOf()); + } + + [Test, Category("Exception")] + public void GivenUltraCryptArchive_WhenRead_ThenRefusedAsUnsupported() { + byte[] bytes = [(byte)'U', (byte)'E', (byte)'2', .. new byte[40]]; + Assert.That(() => Uc2Archive.Read(new MemoryStream(bytes)), Throws.InstanceOf()); + } + + // ── our writer ────────────────────────────────────────────────────── + + private static List SampleInputs() { + var text = System.Text.Encoding.ASCII.GetBytes(string.Concat(Enumerable.Repeat("The quick brown fox jumps over the lazy dog. ", 400))); + var noise = new byte[70_000]; + new Random(7).NextBytes(noise); + var t = new DateTime(2001, 2, 3, 4, 5, 6, DateTimeKind.Local); + return [ + new("HELLO.TXT", "hello uc2\r\n"u8.ToArray(), t), + new("Long File Name.text", text, t), + new("sub/deeper/noise.bin", noise, t), + new("sub/empty.dat", [], t), + new("zeros.bin", new byte[100_000], t), + ]; + } + + private byte[] WriteSample() { + using var ms = new MemoryStream(); + Uc2Archive.Write(ms, SampleInputs()); + return ms.ToArray(); + } + + [Test, Category("RoundTrip")] + public void GivenFilesAndFolders_WhenWrittenAndRead_ThenPathsAndBytesRoundTrip() { + var archive = Uc2Archive.Read(new MemoryStream(this.WriteSample())); + foreach (var input in SampleInputs()) { + var e = archive.Entries.Single(x => x.Path == input.Path); + Assert.That(Uc2Archive.Extract(archive, e), Is.EqualTo(input.Data), input.Path); + Assert.That(e.LastModified, Is.EqualTo(input.LastModified)); + } + Assert.That(archive.Entries.Where(e => e.IsDirectory).Select(e => e.Path), Is.EquivalentTo(new[] { "sub", "sub/deeper" })); + } + + [Test, Category("Boundary")] + public void GivenNoFiles_WhenWritten_ThenAnEmptyArchiveReadsBack() { + using var ms = new MemoryStream(); + Uc2Archive.Write(ms, []); + Assert.That(Uc2Archive.Read(new MemoryStream(ms.ToArray())).Entries, Is.Empty); + } + + [Test, Category("Boundary")] + public void GivenNamesThatCollideIn83_WhenWritten_ThenEachKeepsItsOwnContent() { + var t = DateTime.Now; + using var ms = new MemoryStream(); + Uc2Archive.Write(ms, [new("readme.first.txt", [1], t), new("readme.second.txt", [2], t), new("README.TXT", [3], t)]); + var archive = Uc2Archive.Read(new MemoryStream(ms.ToArray())); + Assert.That(Uc2Archive.Extract(archive, archive.Entries.Single(e => e.Path == "readme.first.txt")), Is.EqualTo(new byte[] { 1 })); + Assert.That(Uc2Archive.Extract(archive, archive.Entries.Single(e => e.Path == "readme.second.txt")), Is.EqualTo(new byte[] { 2 })); + Assert.That(Uc2Archive.Extract(archive, archive.Entries.Single(e => e.Path == "README.TXT")), Is.EqualTo(new byte[] { 3 })); + Assert.That(archive.Entries.Select(e => e.ShortName).Distinct().Count(), Is.EqualTo(3)); + } + + [Test, Category("Exception")] + public void GivenPassword_WhenCreated_ThenRefused() { + Assert.That(() => new Uc2FormatDescriptor().Create(new MemoryStream(), [ArchiveInputInfo.InMemory("a", [1])], new FormatCreateOptions { Password = "x" }), + Throws.InstanceOf()); + } + + [Test, Category("ExternalInterop")] + public void GivenOurArchive_WhenUnuc2ExtractsIt_ThenEveryFileMatches() { + if (OperatingSystem.IsWindows() && !FsInteropToolbox.WslAvailable) Assert.Ignore("WSL is not available."); + if (!FsInteropToolbox.WslHasTool("unuc2")) Assert.Ignore("unuc2 (github.com/jan-bobrowski/unuc2) is not installed."); + var path = Path.Combine(this._tmpDir, "OURS.UC2"); + File.WriteAllBytes(path, this.WriteSample()); + var outDir = Path.Combine(this._tmpDir, "out"); + Directory.CreateDirectory(outDir); + + var t = FsInteropToolbox.RunWsl($"unuc2 -t '{FsInteropToolbox.WinToWsl(path)}'"); + Assert.That(t.ExitCode, Is.EqualTo(0), $"unuc2 -t rejected our archive:\n{t.StdOut}\n{t.StdErr}"); + var r = FsInteropToolbox.RunWsl($"unuc2 -f -d '{FsInteropToolbox.WinToWsl(outDir)}' '{FsInteropToolbox.WinToWsl(path)}'"); + Assert.That(r.ExitCode, Is.EqualTo(0), $"unuc2 rejected our archive:\n{r.StdOut}\n{r.StdErr}"); + var archive = Uc2Archive.Read(File.OpenRead(path)); + foreach (var input in SampleInputs()) { + // unuc2 extracts under the 8.3 names, or the long name where the archive records one. + var candidates = Directory.EnumerateFiles(outDir, "*", SearchOption.AllDirectories) + .Where(f => string.Equals(Path.GetFileName(f), Path.GetFileName(input.Path), StringComparison.OrdinalIgnoreCase) + || string.Equals(Path.GetFileName(f), archive.Entries.Single(e => e.Path == input.Path).ShortName, StringComparison.OrdinalIgnoreCase)) + .ToList(); + Assert.That(candidates, Is.Not.Empty, $"unuc2 produced no {input.Path}"); + Assert.That(candidates.Any(c => File.ReadAllBytes(c).AsSpan().SequenceEqual(input.Data)), $"{input.Path} differs"); + } + } + + // ── helpers ───────────────────────────────────────────────────────── + + private static IEnumerable<(string Archive, string Sha8, int Revision, string Name)> Sums() { + var text = System.Text.Encoding.UTF8.GetString(LoadVector("sums.txt")); + foreach (var line in text.Split('\n', StringSplitOptions.RemoveEmptyEntries | StringSplitOptions.TrimEntries)) { + var parts = line.Split(' ', 4); + yield return (parts[0], parts[1], int.Parse(parts[2], System.Globalization.CultureInfo.InvariantCulture), parts[3]); + } + } + + private static byte[] LoadVector(string name) { + using var stream = Assembly.GetExecutingAssembly().GetManifestResourceStream($"Uc2Vectors.{name}") + ?? throw new InvalidOperationException($"missing embedded vector {name}"); + using var ms = new MemoryStream(); + stream.CopyTo(ms); + return ms.ToArray(); + } +} diff --git a/Hawkynt.FileFormats.Archives/FileFormats/FileFormat.Uc2/THIRD-PARTY-NOTICE.UltraCompressor2.txt b/Hawkynt.FileFormats.Archives/FileFormats/FileFormat.Uc2/THIRD-PARTY-NOTICE.UltraCompressor2.txt new file mode 100644 index 000000000..b10546fff --- /dev/null +++ b/Hawkynt.FileFormats.Archives/FileFormats/FileFormat.Uc2/THIRD-PARTY-NOTICE.UltraCompressor2.txt @@ -0,0 +1,21 @@ +UltraCompressor II support in this folder is converted from klauspost/uc2, a Go implementation of +the UltraCompressor II archive format derived from the UC2 source code that its author released. + +Upstream: https://github.com/klauspost/uc2 +Revision: 53622f89ada1cf0d4a69f91b653bdd44ec5b0f92 +Files: internal/ultra/{ultra,decode,turbo}.go, internal/format/{format,cdir}.go, reader.go, + docs/format.md (the format specification the conversion follows) +Licence: GNU Lesser General Public License v3.0 (LGPL-3.0); this repository is + LGPL-3.0-or-later. + +super.dat (embedded as FileFormat.Uc2.super.dat) is UltraCompressor II's built-in "supermaster" +dictionary, 49,152 bytes, SHA-256 4f2e3fb48a288f66a76b0e26cb2830f3f0297f3686752853de65b82e646e840e, +copied verbatim from internal/super/super.dat of the same revision. It is part of the +UltraCompressor II release by Nico de Vries / Ad Infinitum Programs (AIP-NL), released under the +GNU LGPL v3 in 2015. + +UltraCompressor II (c) 1994-1996 Ad Infinitum Programs (AIP-NL), Nico de Vries. Released under the +GNU Lesser General Public License, version 3. + +The default code lengths, the delta-code matrices and the distance/length tables are the format's +own constants; the encoder in Uc2Ultra (default trees, greedy hash-chain matcher) is original. diff --git a/Hawkynt.FileFormats.Archives/FileFormats/FileFormat.Uc2/Uc2Archive.cs b/Hawkynt.FileFormats.Archives/FileFormats/FileFormat.Uc2/Uc2Archive.cs new file mode 100644 index 000000000..8bb032b64 --- /dev/null +++ b/Hawkynt.FileFormats.Archives/FileFormats/FileFormat.Uc2/Uc2Archive.cs @@ -0,0 +1,543 @@ +using System.Buffers.Binary; +using System.Text; + +namespace FileFormat.Uc2; + +///

One file or directory of a UC2 archive (the newest revision of its name). +public sealed class Uc2Entry { + /// Gets the path inside the archive, '/'-separated (long names where the archive records them). + public string Path { get; init; } = ""; + /// Gets the DOS 8.3 name as stored. + public string ShortName { get; init; } = ""; + /// Gets whether this is a directory. + public bool IsDirectory { get; init; } + /// Gets the uncompressed size. + public long Size { get; init; } + /// Gets the compressed stream size (excluding its master). + public long CompressedSize { get; init; } + /// Gets the compression method number. + public int Method { get; init; } + /// Gets the DOS attribute byte. + public byte Attributes { get; init; } + /// Gets the modification time (DOS local time, 2-second resolution). + public DateTime? LastModified { get; init; } + + internal uint MasterPrefix { get; init; } + internal long Offset { get; init; } + internal ushort Fletch { get; init; } +} + +/// +/// UltraCompressor II (.uc2) archives: FHEAD + XHEAD, headerless compressed streams for files and +/// masters (shared dictionaries), and a compressed central directory; every stream is checked with +/// UC2's 16-bit XOR checksum. Reads every UC2 release's archives (methods 1-9, 21-29, 30-37, +/// 40-47 and turbo 80; supermaster, no-master and custom masters; delta filter) and writes archives +/// UC2 r2 reads: one 512-byte custom master compressed with the supermaster, files with method 3. +/// +/// +/// Converted from klauspost/uc2 (LGPL-3.0), whose format.md documents the format from the +/// published UC2 r2 source; SUPER.DAT is the supermaster from that LGPL-3.0 UC2 release. +/// +public static class Uc2Archive { + private const uint Magic = 0x1A324355; // "UC2\x1A" + private const uint AMag = 0x01B2C3D4; + private const int FHeadSize = 13, XHeadSize = 16, CompressSize = 10; + private const uint SuperMaster = 0, NoMaster = 1, LegacyPrefix = 0xDEDEDEDE; + private const byte BoDir = 1, BoFile = 2, BoMast = 3, BoEol = 4; + private const int MetaSize = 22, ExtSize = 21; + private const string LongNameTag = "AIP:Win95 LongN"; + private const string Utf8NameTag = "UC2X:UTF8Name"; + + private static readonly Lazy SuperDat = new(LoadSuper); + + private static byte[] LoadSuper() { + using var s = typeof(Uc2Archive).Assembly.GetManifestResourceStream("FileFormat.Uc2.super.dat") + ?? throw new InvalidOperationException("UC2 supermaster resource is missing."); + var b = new byte[s.Length]; + s.ReadExactly(b); + if (Fletch(b) != 0x1E55) throw new InvalidOperationException("UC2 supermaster resource is damaged."); + return b; + } + + private static readonly Lazy OemEncoding = new(() => { + Encoding.RegisterProvider(CodePagesEncodingProvider.Instance); + return Encoding.GetEncoding(437); // UC2 does not record the code page; CP437 is the DOS default + }); + + private static Encoding Oem => OemEncoding.Value; + + /// UC2's "Fletcher": 0xA55A XOR the XOR of all little-endian 16-bit words (odd tail byte = low byte). + public static ushort Fletch(ReadOnlySpan data) { + ushort x = 0; + var i = 0; + for (; i + 1 < data.Length; i += 2) x ^= (ushort)(data[i] | (data[i + 1] << 8)); + if (i < data.Length) x ^= data[i]; + return (ushort)(0xA55A ^ x); + } + + // ── reading ───────────────────────────────────────────────────────── + + /// A parsed archive: entries plus what is needed to extract them. + public sealed class Parsed { + internal Parsed(byte[] data, List entries, Dictionary masters) { + this.Data = data; this.Entries = entries; this.Masters = masters; + } + internal byte[] Data { get; } + /// Gets the entries, directories included. + public IReadOnlyList Entries { get; } + internal Dictionary Masters { get; } + internal Dictionary MasterCache { get; } = []; + } + + /// Parses an archive and verifies its central directory. + /// Not a UC2 archive, or its directory is damaged. + /// UltraCrypt-encrypted or private-profile (PCP) archive. + public static Parsed Read(Stream stream) { + ArgumentNullException.ThrowIfNull(stream); + if (stream.CanSeek) stream.Position = 0; + using var ms = new MemoryStream(); + stream.CopyTo(ms); + var data = ms.ToArray(); + if (data.Length >= 3 && data[0] == 'U' && data[1] == 'E' && data[2] == '2') + throw new NotSupportedException("UC2 archive is encrypted with UltraCrypt."); + if (data.Length < FHeadSize + XHeadSize || BinaryPrimitives.ReadUInt32LittleEndian(data) != Magic) + throw new InvalidDataException("Not an UltraCompressor II archive."); + var compLen = BinaryPrimitives.ReadUInt32LittleEndian(data.AsSpan(4)); + if (BinaryPrimitives.ReadUInt32LittleEndian(data.AsSpan(8)) - AMag != compLen) { + // the spare FHEAD at the end carries the same values + var spare = data.AsSpan(data.Length - FHeadSize); + if (BinaryPrimitives.ReadUInt32LittleEndian(spare) != Magic || BinaryPrimitives.ReadUInt32LittleEndian(spare[8..]) - AMag != BinaryPrimitives.ReadUInt32LittleEndian(spare[4..])) + throw new InvalidDataException("UC2 header length check fails."); + } + var x = data.AsSpan(FHeadSize, XHeadSize); + var cdirVol = BinaryPrimitives.ReadUInt32LittleEndian(x); + var cdirOff = BinaryPrimitives.ReadUInt32LittleEndian(x[4..]); + var cdirFletch = BinaryPrimitives.ReadUInt16LittleEndian(x[8..]); + var needed = BinaryPrimitives.ReadUInt16LittleEndian(x[13..]); + if (needed == 203) throw new NotSupportedException("UC2 2.3 private compression profile (PCP) archives are not supported."); + if (needed > 204) throw new NotSupportedException($"UC2 archive needs UltraCompressor version {needed}."); + long cdirAt = needed == 204 ? ((long)(cdirVol - 1) << 32) | cdirOff : cdirOff; + if (needed != 204 && cdirVol != 1 || cdirAt < FHeadSize + XHeadSize || cdirAt + CompressSize > data.Length) + throw new InvalidDataException("UC2 central directory location is invalid."); + var cdirMethod = BinaryPrimitives.ReadUInt16LittleEndian(data.AsSpan((int)cdirAt + 4)); + if (cdirMethod is < 1 or > 9) + throw new InvalidDataException($"UC2 central directory method {cdirMethod} is invalid."); + var start = (int)cdirAt + CompressSize; + var raw = Uc2Ultra.Decode(data, start, data.Length - start, new byte[512], -1); + if (Fletch(raw) != cdirFletch) + throw new InvalidDataException("UC2 central directory fails its checksum."); + return ParseCdir(data, raw, needed == 204); + } + + private static Parsed ParseCdir(byte[] data, byte[] raw, bool extended) { + var p = 0; + ReadOnlySpan Take(int n) { + if (p + n > raw.Length) throw new InvalidDataException("UC2 central directory is truncated."); + var s = raw.AsSpan(p, n); + p += n; + return s; + } + long Loc(ReadOnlySpan b) { + var vol = BinaryPrimitives.ReadUInt32LittleEndian(b); + var off = BinaryPrimitives.ReadUInt32LittleEndian(b[4..]); + return extended ? ((long)(vol - 1) << 32) | off : off; + } + + var dirs = new Dictionary { [0] = "" }; + var masters = new Dictionary(); + var byPath = new Dictionary(StringComparer.Ordinal); // newest revision wins + var order = new List(); + while (true) { + var type = Take(1)[0]; + if (type == BoEol) break; + if (type is BoDir or BoFile) { + var m = Take(MetaSize); + var parent = BinaryPrimitives.ReadUInt32LittleEndian(m); + var attr = m[4]; + var time = BinaryPrimitives.ReadUInt16LittleEndian(m[5..]); + var date = BinaryPrimitives.ReadUInt16LittleEndian(m[7..]); + var shortName = ShortName(m.Slice(9, 11)); + var hasTags = m[21] != 0; + uint index = 0, size = 0, prefix = 0; + ushort fletch = 0; + int method = 0; + long compLen = 0, offset = 0; + if (type == BoDir) { + index = BinaryPrimitives.ReadUInt32LittleEndian(Take(4)); + } else { + var f = Take(6 + CompressSize + 8); + size = BinaryPrimitives.ReadUInt32LittleEndian(f); + fletch = BinaryPrimitives.ReadUInt16LittleEndian(f[4..]); + compLen = BinaryPrimitives.ReadUInt32LittleEndian(f[6..]); + method = BinaryPrimitives.ReadUInt16LittleEndian(f[10..]); + prefix = BinaryPrimitives.ReadUInt32LittleEndian(f[12..]); + offset = Loc(f[16..]); + } + string? longName = null; + long size64 = size; + while (hasTags) { + var h = Take(ExtSize); + var tagSize = BinaryPrimitives.ReadUInt32LittleEndian(h[16..]); + if (tagSize > 1_000_000) throw new InvalidDataException("UC2 tag is implausibly large."); + var nul = h[..16].IndexOf((byte)0); + var tagName = Encoding.ASCII.GetString(h[..(nul < 0 ? 16 : nul)]); + var payload = Take((int)tagSize); + if (tagName == Utf8NameTag) longName = Encoding.UTF8.GetString(payload); + else if (tagName == LongNameTag && longName is null) { + var z = payload.IndexOf((byte)0); + longName = Oem.GetString(payload[..(z < 0 ? payload.Length : z)]); + } else if (tagName == "UC2X:Size64" && payload.Length == 8) size64 = BinaryPrimitives.ReadInt64LittleEndian(payload); + hasTags = h[20] != 0; + } + if (!dirs.TryGetValue(parent, out var parentPath)) + throw new InvalidDataException($"UC2 record refers to undefined directory {parent}."); + var leaf = Sanitize(longName ?? shortName); + var path = parentPath.Length == 0 ? leaf : parentPath + "/" + leaf; + if (type == BoDir) dirs[index] = path; + if (!byPath.ContainsKey(path)) order.Add(path); + byPath[path] = new Uc2Entry { + Path = path, ShortName = shortName, IsDirectory = type == BoDir, Size = size64, CompressedSize = compLen, + Method = method, Attributes = attr, LastModified = DosTime(date, time), MasterPrefix = prefix, Offset = offset, Fletch = fletch, + }; + continue; + } + if (type == BoMast) { + var m = Take(20 + CompressSize + 8); + var index = BinaryPrimitives.ReadUInt32LittleEndian(m); + var length = BinaryPrimitives.ReadUInt16LittleEndian(m[16..]); + var compLen = BinaryPrimitives.ReadUInt32LittleEndian(m[20..]); + var method = BinaryPrimitives.ReadUInt16LittleEndian(m[24..]); + var prefix = BinaryPrimitives.ReadUInt32LittleEndian(m[26..]); + masters[index] = (method, prefix, Loc(m[30..]), compLen, length); + continue; + } + throw new InvalidDataException($"UC2 central directory record type {type} is invalid."); + } + // Reserved U$~ members (comment, banners, locks) are UC2's own, not archive content. + var entries = order.Select(k => byPath[k]).Where(e => !e.ShortName.StartsWith("U$~", StringComparison.Ordinal)).ToList(); + return new Parsed(data, entries, masters); + } + + /// Extracts one file, verifying its checksum. + public static byte[] Extract(Parsed archive, Uc2Entry entry) { + ArgumentNullException.ThrowIfNull(archive); + ArgumentNullException.ThrowIfNull(entry); + if (entry.IsDirectory || entry.Size == 0) return []; + if (entry.MasterPrefix < 2 && entry.MasterPrefix != SuperMaster && entry.MasterPrefix != NoMaster) + throw new InvalidDataException($"'{entry.Path}' uses an invalid master."); + var dict = Dictionary(archive, entry.MasterPrefix); + return DecodeStream(archive.Data, entry.Offset, entry.CompressedSize, entry.Method, dict, entry.Size, entry.Fletch, entry.Path); + } + + private static byte[] Dictionary(Parsed archive, uint prefix) { + switch (prefix) { + case SuperMaster or LegacyPrefix: return SuperDat.Value; + case NoMaster: return new byte[512]; + } + if (archive.MasterCache.TryGetValue(prefix, out var cached)) return cached; + if (!archive.Masters.TryGetValue(prefix, out var m)) + throw new InvalidDataException($"UC2 master {prefix} is missing."); + if (m.Prefix is not (SuperMaster or NoMaster or LegacyPrefix)) + throw new InvalidDataException($"UC2 master {prefix} is chained to another master."); + var dict = m.Prefix == NoMaster ? new byte[512] : SuperDat.Value; + var content = DecodeStream(archive.Data, m.Offset, m.CompLen, m.Method, dict, m.Length, null, $"master {prefix}"); + archive.MasterCache[prefix] = content; + return content; + } + + private static (int Delta, bool Turbo) MethodInfo(int method) => method switch { + >= 1 and <= 9 => (0, false), + >= 21 and <= 29 => (1, false), + >= 30 and <= 37 => (method - 29, false), + >= 40 and <= 47 => (method - 39, false), + 80 => (0, true), + _ => throw new InvalidDataException($"UC2 method {method} is invalid."), + }; + + private static byte[] DecodeStream(byte[] data, long offset, long compLen, int method, byte[] dictionary, long size, ushort? fletch, string what) { + if (offset < 0 || offset >= data.Length) throw new InvalidDataException($"UC2 {what} points outside the archive."); + var available = (int)Math.Min(compLen > 0 ? compLen : data.Length - offset, data.Length - offset); + var (delta, turbo) = MethodInfo(method); + if (turbo) { + var t = DecodeTurbo(data, (int)offset, available, dictionary, size); + if (fletch is { } ft && Fletch(t) != ft) throw new InvalidDataException($"UC2 checksum mismatch for {what}."); + return t; + } + // For delta methods the dictionary (unless it is the supermaster) is delta'd too. + var dict = delta > 0 && !ReferenceEquals(dictionary, SuperDat.Value) ? ForwardDelta(dictionary, delta) : dictionary; + var output = Uc2Ultra.Decode(data, (int)offset, available, dict, size); + if (fletch is { } f && Fletch(output) != f) throw new InvalidDataException($"UC2 checksum mismatch for {what}."); + if (delta > 0) InverseDelta(output, delta); + return output; + } + + private static byte[] ForwardDelta(byte[] input, int size) { + var o = new byte[input.Length]; + Span arr = stackalloc byte[8]; + arr.Clear(); + var ctr = 0; + for (var i = 0; i < input.Length; ++i) { + o[i] = (byte)(input[i] - arr[ctr]); + arr[ctr] = input[i]; + ctr = (ctr + 1) % size; + } + return o; + } + + private static void InverseDelta(byte[] buffer, int size) { + Span arr = stackalloc byte[8]; + arr.Clear(); + var ctr = 0; + for (var i = 0; i < buffer.Length; ++i) { + buffer[i] = (byte)(buffer[i] + arr[ctr]); + arr[ctr] = buffer[i]; + ctr = (ctr + 1) % size; + } + } + + private static byte[] DecodeTurbo(byte[] data, int offset, int length, byte[] dict, long size) { + var table = new byte[32768]; + for (var i = 0; i + 10 < dict.Length; ++i) table[(dict[i] << 7) ^ dict[i + 1]] = dict[i + 2]; + var output = new byte[size]; + var o = 0; + byte p1 = 0, p2 = 0; + var pos = offset; + var end = offset + length; + while (o < size) { + if (pos + 2 > end) throw new InvalidDataException("UC2 turbo stream ended early."); + var n = BinaryPrimitives.ReadUInt16LittleEndian(data.AsSpan(pos)); + pos += 2; + if (n == 0 || pos + n > end) throw new InvalidDataException("UC2 turbo stream ended early."); + var blockEnd = pos + n; + while (pos < blockEnd) { + int ctl = data[pos++]; + for (var i = 0; i < 8 && (pos < blockEnd || (ctl & 0xFF) != 0); ++i) { + var h = (p2 << 7) ^ p1; + var c = table[h]; + if ((ctl & 0x80) == 0) { + if (pos >= blockEnd) throw new InvalidDataException("UC2 turbo block is truncated."); + c = data[pos++]; + table[h] = c; + } + if (o < size) output[o++] = c; + p2 = p1; p1 = c; + ctl = (ctl << 1) & 0xFF; + } + } + } + return output; + } + + private static string ShortName(ReadOnlySpan fcb) { + var oem = Oem; + var name = oem.GetString(fcb[..8]).TrimEnd(' '); + var ext = oem.GetString(fcb[8..11]).TrimEnd(' '); + return ext.Length == 0 ? name : name + "." + ext; + } + + private static string Sanitize(string name) { + var s = name.Replace('/', '_').Replace('\\', '_').Replace(':', '_'); + return s is "" or "." or ".." ? "_" : s; + } + + private static DateTime? DosTime(ushort date, ushort time) { + if (date == 0) return null; + try { + return new DateTime(1980 + (date >> 9), (date >> 5) & 15, date & 31, time >> 11, (time >> 5) & 63, (time & 31) * 2, DateTimeKind.Local); + } catch (ArgumentOutOfRangeException) { + return null; + } + } + + // ── writing ───────────────────────────────────────────────────────── + + /// A file to write: its archive path ('/'-separated), content and time. + public readonly record struct Input(string Path, byte[] Data, DateTime LastModified); + + /// + /// Writes a UC2 archive that UC2 r2 reads (wVersionNeededToExtract 200): one custom master of + /// 512 zero bytes compressed with the supermaster, every file compressed with method 3 against + /// it, directories implied by the paths, 8.3 aliases plus "AIP:Win95 LongN" tags for names that + /// do not fit 8.3, and the CDIR compressed with no master. + /// + public static void Write(Stream output, IEnumerable inputs) { + ArgumentNullException.ThrowIfNull(output); + var files = inputs.ToList(); + var body = new MemoryStream(); + body.Write(new byte[FHeadSize + XHeadSize]); + + // directories + var dirIndex = new Dictionary(StringComparer.Ordinal) { [""] = 0 }; + var dirRecords = new List<(uint Parent, uint Index, string Leaf)>(); + var aliases = new Dictionary>(); + uint nextDir = 1; + uint DirOf(string dirPath) { + if (dirIndex.TryGetValue(dirPath, out var idx)) return idx; + var slash = dirPath.LastIndexOf('/'); + var parent = DirOf(slash < 0 ? "" : dirPath[..slash]); + idx = nextDir++; + dirIndex[dirPath] = idx; + dirRecords.Add((parent, idx, slash < 0 ? dirPath : dirPath[(slash + 1)..])); + return idx; + } + + // master: 512 zeros compressed with the supermaster (method 3) + var master = new byte[512]; + var masterStream = Uc2Ultra.Encode(master, SuperDat.Value); + + var fileRecords = new List<(uint Parent, string Leaf, byte[] Data, DateTime Time, long Offset, int CompLen)>(); + foreach (var f in files) { + var path = f.Path.Replace('\\', '/').Trim('/'); + if (path.Length == 0) continue; + var slash = path.LastIndexOf('/'); + var parent = DirOf(slash < 0 ? "" : path[..slash]); + var stream = Uc2Ultra.Encode(f.Data, master); + var offset = body.Position; + body.Write(stream); + fileRecords.Add((parent, slash < 0 ? path : path[(slash + 1)..], f.Data, f.LastModified, offset, stream.Length)); + } + var masterOffset = body.Position; + body.Write(masterStream); + + // central directory (canonical order: per directory, child dirs, then files, then recurse) + var raw = new MemoryStream(); + var children = dirRecords.GroupBy(d => d.Parent).ToDictionary(g => g.Key, g => g.ToList()); + var filesByDir = fileRecords.GroupBy(f => f.Parent).ToDictionary(g => g.Key, g => g.ToList()); + void Emit(uint dir) { + foreach (var c in children.GetValueOrDefault(dir) ?? []) WriteMeta(raw, BoDir, c.Parent, 0x10, null, Alias(aliases, c.Parent, c.Leaf), c.Leaf, w => { Span ib = stackalloc byte[4]; BinaryPrimitives.WriteUInt32LittleEndian(ib, c.Index); w.Write(ib); }); + foreach (var f in filesByDir.GetValueOrDefault(dir) ?? []) { + WriteMeta(raw, BoFile, f.Parent, 0x20, f.Time, Alias(aliases, f.Parent, f.Leaf), f.Leaf, w => { + Span b = stackalloc byte[6 + CompressSize + 8]; + BinaryPrimitives.WriteUInt32LittleEndian(b, (uint)f.Data.Length); + BinaryPrimitives.WriteUInt16LittleEndian(b[4..], Fletch(f.Data)); + BinaryPrimitives.WriteUInt32LittleEndian(b[6..], (uint)f.CompLen); + BinaryPrimitives.WriteUInt16LittleEndian(b[10..], 3); + BinaryPrimitives.WriteUInt32LittleEndian(b[12..], 2); + BinaryPrimitives.WriteUInt32LittleEndian(b[16..], 1); + BinaryPrimitives.WriteUInt32LittleEndian(b[20..], checked((uint)f.Offset)); + w.Write(b); + }); + } + foreach (var c in children.GetValueOrDefault(dir) ?? []) Emit(c.Index); + } + Emit(0); + if (fileRecords.Count > 0) { + Span m = stackalloc byte[1 + 20 + CompressSize + 8]; + m[0] = BoMast; + BinaryPrimitives.WriteUInt32LittleEndian(m[1..], 2); // index + BinaryPrimitives.WriteUInt32LittleEndian(m[5..], 0); // key: one UC2 never generates, so it is not reused + BinaryPrimitives.WriteUInt32LittleEndian(m[9..], (uint)fileRecords.Sum(f => (long)f.Data.Length)); + BinaryPrimitives.WriteUInt32LittleEndian(m[13..], (uint)fileRecords.Count); + BinaryPrimitives.WriteUInt16LittleEndian(m[17..], 512); + BinaryPrimitives.WriteUInt16LittleEndian(m[19..], 0xDEDE); + BinaryPrimitives.WriteUInt32LittleEndian(m[21..], (uint)masterStream.Length); + BinaryPrimitives.WriteUInt16LittleEndian(m[25..], 3); + BinaryPrimitives.WriteUInt32LittleEndian(m[27..], SuperMaster); + BinaryPrimitives.WriteUInt32LittleEndian(m[31..], 1); + BinaryPrimitives.WriteUInt32LittleEndian(m[35..], checked((uint)masterOffset)); + raw.Write(m); + } + raw.WriteByte(BoEol); + raw.Write(new byte[17 + 4]); // XTAIL + serial + var rawCdir = raw.ToArray(); + var cdirStream = Uc2Ultra.Encode(rawCdir, new byte[512]); + + var cdirAt = body.Position; + Span comp = stackalloc byte[CompressSize]; + BinaryPrimitives.WriteUInt32LittleEndian(comp, (uint)cdirStream.Length); + BinaryPrimitives.WriteUInt16LittleEndian(comp[4..], 3); + BinaryPrimitives.WriteUInt32LittleEndian(comp[6..], NoMaster); + body.Write(comp); + body.Write(cdirStream); + var componentLength = checked((uint)(body.Position - FHeadSize)); + + var head = new byte[FHeadSize + XHeadSize]; + BinaryPrimitives.WriteUInt32LittleEndian(head, Magic); + BinaryPrimitives.WriteUInt32LittleEndian(head.AsSpan(4), componentLength); + BinaryPrimitives.WriteUInt32LittleEndian(head.AsSpan(8), componentLength + AMag); + head[12] = 0; + BinaryPrimitives.WriteUInt32LittleEndian(head.AsSpan(13), 1); + BinaryPrimitives.WriteUInt32LittleEndian(head.AsSpan(17), checked((uint)cdirAt)); + BinaryPrimitives.WriteUInt16LittleEndian(head.AsSpan(21), Fletch(rawCdir)); + head[23] = 0; + BinaryPrimitives.WriteUInt16LittleEndian(head.AsSpan(24), 202); // made by + BinaryPrimitives.WriteUInt16LittleEndian(head.AsSpan(26), 200); // needed + head[28] = 0; + body.Position = 0; + body.Write(head); + body.Position = body.Length; + body.Write(head.AsSpan(0, FHeadSize)); // spare FHEAD + if (body.Length > int.MaxValue) throw new NotSupportedException("UC2 archives this writer produces stay below 2 GiB."); + output.Write(body.GetBuffer(), 0, (int)body.Length); + } + + private static void WriteMeta(MemoryStream raw, byte type, uint parent, byte attr, DateTime? time, byte[] fcb, string leaf, Action tail) { + raw.WriteByte(type); + Span m = stackalloc byte[MetaSize]; + BinaryPrimitives.WriteUInt32LittleEndian(m, parent); + m[4] = attr; + var (dosDate, dosTime) = ToDos(time); + BinaryPrimitives.WriteUInt16LittleEndian(m[5..], dosTime); + BinaryPrimitives.WriteUInt16LittleEndian(m[7..], dosDate); + fcb.CopyTo(m[9..]); + m[20] = 0xDE; // bHidden: UC2's own fill byte + var needsLongName = !string.Equals(ShortName(fcb), leaf, StringComparison.Ordinal); + m[21] = needsLongName ? (byte)1 : (byte)0; + raw.Write(m); + tail(raw); + if (needsLongName) { + Span h = stackalloc byte[ExtSize]; + h.Clear(); + Encoding.ASCII.GetBytes(LongNameTag).CopyTo(h); + var name = Oem.GetBytes(leaf); + BinaryPrimitives.WriteUInt32LittleEndian(h[16..], (uint)name.Length + 1); + h[20] = 0; + raw.Write(h); + raw.Write(name); + raw.WriteByte(0); + } + } + + private static (ushort Date, ushort Time) ToDos(DateTime? t) { + if (t is not { } v) return (0, 0); + v = v.Kind == DateTimeKind.Utc ? v.ToLocalTime() : v; + if (v.Year is < 1980 or > 2107) return (0x21, 0); // 1980-01-01 + return ((ushort)(((v.Year - 1980) << 9) | (v.Month << 5) | v.Day), (ushort)((v.Hour << 11) | (v.Minute << 5) | (v.Second / 2))); + } + + /// An 8.3 FCB name unique within the directory: A-Z 0-9 _ ~, never a device name or U$~. + private static byte[] Alias(Dictionary> used, uint dir, string leaf) { + if (!used.TryGetValue(dir, out var set)) used[dir] = set = []; + static string Clean(string s, int max) { + var sb = new StringBuilder(); + foreach (var ch in s.ToUpperInvariant()) { + if (sb.Length == max) break; + if (ch is >= 'A' and <= 'Z' or >= '0' and <= '9' or '_' or '~') sb.Append(ch); + else if (ch == '-' && sb.Length > 0) sb.Append(ch); + } + return sb.ToString(); + } + var dot = leaf.LastIndexOf('.'); + var baseRaw = dot > 0 ? leaf[..dot] : leaf; + var extRaw = dot > 0 ? leaf[(dot + 1)..] : ""; + var b = Clean(baseRaw, 8); + var e = Clean(extRaw, 3); + if (b.Length == 0 || IsDevice(b) || b.StartsWith("U$~", StringComparison.Ordinal)) b = "FILE"; + var candidate = e.Length == 0 ? b : b + "." + e; + for (var n = 1; set.Contains(candidate); ++n) { + var suffix = "~" + n; + var stem = b[..Math.Min(b.Length, 8 - suffix.Length)] + suffix; + candidate = e.Length == 0 ? stem : stem + "." + e; + } + set.Add(candidate); + var fcb = new byte[11]; + fcb.AsSpan().Fill((byte)' '); + var cdot = candidate.IndexOf('.'); + Encoding.ASCII.GetBytes(cdot < 0 ? candidate : candidate[..cdot]).CopyTo(fcb, 0); + if (cdot >= 0) Encoding.ASCII.GetBytes(candidate[(cdot + 1)..]).CopyTo(fcb, 8); + return fcb; + } + + private static bool IsDevice(string b) => b is "CON" or "PRN" or "AUX" or "NUL" or "CLOCK$" + || (b.Length == 4 && (b.StartsWith("COM", StringComparison.Ordinal) || b.StartsWith("LPT", StringComparison.Ordinal)) && b[3] is >= '1' and <= '9'); +} diff --git a/Hawkynt.FileFormats.Archives/FileFormats/FileFormat.Uc2/Uc2FormatDescriptor.cs b/Hawkynt.FileFormats.Archives/FileFormats/FileFormat.Uc2/Uc2FormatDescriptor.cs new file mode 100644 index 000000000..53fa0327a --- /dev/null +++ b/Hawkynt.FileFormats.Archives/FileFormats/FileFormat.Uc2/Uc2FormatDescriptor.cs @@ -0,0 +1,66 @@ +using Compression.Registry; +using static Compression.Registry.FormatHelpers; + +namespace FileFormat.Uc2; + +/// UltraCompressor II archive (.uc2), Nico de Vries / AIP-NL, 1994-1996. +public sealed class Uc2FormatDescriptor : IFormatDescriptor, IArchiveFormatOperations, IArchiveCreatable { + /// + public string Id => "Uc2"; + /// + public string DisplayName => "UltraCompressor II"; + /// + public FormatCategory Category => FormatCategory.Archive; + /// + public FormatCapabilities Capabilities => + FormatCapabilities.CanList | FormatCapabilities.CanExtract | FormatCapabilities.CanCreate | FormatCapabilities.CanTest | + FormatCapabilities.SupportsMultipleEntries | FormatCapabilities.SupportsDirectories; + /// + public string DefaultExtension => ".uc2"; + /// + public IReadOnlyList Extensions => [".uc2", ".pu2"]; + /// + public IReadOnlyList CompoundExtensions => []; + /// + public IReadOnlyList MagicSignatures => [new([0x55, 0x43, 0x32, 0x1A], Confidence: 0.95)]; + /// + public IReadOnlyList Methods => [new("ultra", "Ultra (LZ77 + Huffman)")]; + /// + public string? TarCompressionFormatId => null; + /// + public AlgorithmFamily Family => AlgorithmFamily.Archive; + /// + public string Description => "UltraCompressor II archive: LZ77+Huffman against shared master dictionaries, XOR-checksummed"; + + /// + public List List(Stream stream, string? password) { + var a = Uc2Archive.Read(stream); + return a.Entries.Select((e, i) => new ArchiveEntryInfo(i, e.Path, e.IsDirectory ? 0 : e.Size, e.CompressedSize, + e.IsDirectory ? "" : e.Method == 80 ? "Turbo" : $"Ultra {e.Method}", e.IsDirectory, false, e.LastModified)).ToList(); + } + + /// + public void Extract(Stream stream, string outputDir, string? password, string[]? files) { + var a = Uc2Archive.Read(stream); + foreach (var e in a.Entries) { + if (e.IsDirectory || files is { Length: > 0 } && !MatchesFilter(e.Path, files)) continue; + WriteFile(outputDir, e.Path, Uc2Archive.Extract(a, e)); + } + } + + /// + public byte[] ExtractEntryToMemory(Stream archive, string entryName, string? password) { + var a = Uc2Archive.Read(archive); + var e = a.Entries.FirstOrDefault(x => !x.IsDirectory && string.Equals(x.Path, entryName, StringComparison.OrdinalIgnoreCase)); + return e is null ? [] : Uc2Archive.Extract(a, e); + } + + /// + public void Create(Stream output, IReadOnlyList inputs, FormatCreateOptions options) { + ArgumentNullException.ThrowIfNull(inputs); + if (!string.IsNullOrEmpty(options.Password)) + throw new NotSupportedException("UC2's UltraCrypt encryption is undocumented and is not written."); + Uc2Archive.Write(output, inputs.Where(i => !i.IsDirectory).Select(i => + new Uc2Archive.Input(i.ArchiveName, i.ReadContent(), i.Metadata?.LastWriteTimeUtc?.LocalDateTime ?? DateTime.Now))); + } +} diff --git a/Hawkynt.FileFormats.Archives/FileFormats/FileFormat.Uc2/Uc2Ultra.cs b/Hawkynt.FileFormats.Archives/FileFormats/FileFormat.Uc2/Uc2Ultra.cs new file mode 100644 index 000000000..154ddb462 --- /dev/null +++ b/Hawkynt.FileFormats.Archives/FileFormats/FileFormat.Uc2/Uc2Ultra.cs @@ -0,0 +1,382 @@ +namespace FileFormat.Uc2; + +/// +/// UltraCompressor II's "Ultra" bitstream (methods 1-9, 21-29, 30-37, 40-47): LZ77 over a 64 KiB +/// history that starts with a dictionary ("master"), Huffman-coded with a 316-symbol +/// literal/distance alphabet and a 28-symbol length alphabet, trees either the built-in defaults +/// or sent delta-coded against the previous block's. Bits are read most-significant first out of +/// little-endian 16-bit words. +/// +/// +/// Converted from klauspost/uc2 (internal/ultra, LGPL-3.0), which follows the published UC2 r2 +/// source; the default code lengths and the delta-code matrices are the format's own constants. +/// +internal static class Uc2Ultra { + private const int NumLiterals = 256; + private const int NumLd = 316; + private const int NumL = 28; + private const int NumSymbols = NumLd + NumL; + private const int NumPre = 15; + private const int RepeatSymbol = 14; + private const int MinRepeat = 6; + private const int MaxCodeBits = 13; + private const int EobDistance = 64001; + + /// Largest distance UC2's own encoder emits. + public const int MaxEncoderDistance = 64000; + + /// Default ("base") code lengths, TREEENC.CPP BasePrev. + internal static readonly byte[] BaseLengths = BuildBaseLengths(); + + private static byte[] BuildBaseLengths() { + var b = new byte[NumSymbols]; + void Fill(int lo, int hi, byte v) { for (var i = lo; i < hi; ++i) b[i] = v; } + Fill(0, 32, 9); + b[10] = b[12] = b[32] = 7; + Fill(33, 128, 8); + b[46] = b[58] = b[92] = 7; + Fill(128, 256, 10); + Fill(256, 272, 6); + Fill(272, 284, 7); + Fill(284, 290, 8); + Fill(290, 300, 9); + Fill(300, 316, 10); + Fill(316, 325, 4); + Fill(325, 334, 5); + Fill(334, 344, 6); + return b; + } + + /// vval[prev][code] → new length (decoder side of the delta matrices, TREEENC.CPP InitTables). + private static readonly byte[,] DeltaDecode = BuildDeltaDecode(); + + private static byte[,] BuildDeltaDecode() { + const int n = 14; + var table = new byte[n, n]; + var vval = new byte[n, n]; + for (var i = 1; i < n; ++i) { vval[0, i] = (byte)(n - i); table[0, i] = (byte)(n - i); } + for (var i = 1; i < n; ++i) { + var prob = 0; + var x = i < 9 ? i - 1 : n - i + 1; + var j = 1; + for (; j < x; ++j) { + table[i, i + j - 1] = (byte)prob; + vval[i, prob] = (byte)(i + j - 1); + ++prob; + table[i, i - j] = (byte)prob; + vval[i, prob] = (byte)(i - j); + ++prob; + } + table[i, i - j] = (byte)(prob + 1); + vval[i, prob + 1] = (byte)(i - j); + if (i < 8) { + table[i, 0] = n - 1; + vval[i, n - 1] = 0; + table[i, i + j - 1] = (byte)prob; + vval[i, prob] = (byte)(i + j - 1); + for (j = n - 1; j >= i * 2 - 1; --j) { + table[i, j] = (byte)(j - 1); + vval[i, j - 1] = (byte)j; + } + } else { + table[i, 0] = (byte)prob; + vval[i, prob] = 0; + for (j = 1; j <= i * 2 - 15; ++j) { + table[i, j] = (byte)(n - j); + vval[i, n - j] = (byte)j; + } + } + } + return vval; + } + + private static readonly ushort[] DistBase = new ushort[60]; + private static readonly byte[] DistExtra = new byte[60]; + private static readonly ushort[] LenBase = [3, 4, 5, 6, 7, 8, 9, 10, 11, 13, 15, 17, 19, 21, 23, 25, 27, 35, 43, 51, 59, 67, 75, 83, 91, 155, 667, 2715]; + private static readonly byte[] LenExtra = [0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 3, 3, 3, 3, 3, 3, 3, 3, 6, 9, 11, 15]; + + static Uc2Ultra() { + for (var i = 0; i < 15; ++i) { + DistBase[i] = (ushort)(i + 1); + DistBase[15 + i] = (ushort)((i + 1) << 4); DistExtra[15 + i] = 4; + DistBase[30 + i] = (ushort)((i + 1) << 8); DistExtra[30 + i] = 8; + DistBase[45 + i] = (ushort)((i + 1) << 12); DistExtra[45 + i] = 12; + } + } + + // ── bit reader ────────────────────────────────────────────────────── + + /// Reads MSB-first out of little-endian 16-bit words; past the end it supplies zero bits. + private sealed class BitReader(byte[] data, int offset, int length) { + private long _bit; // bits consumed + + /// More than a word of zero padding has been consumed: the stream is truncated. + public bool Overrun => this._bit > (long)length * 8 + 16; + + public int Bit() { + var word = this._bit >> 4; + var inWord = (int)(this._bit & 15); + var byteIndex = word * 2 + (inWord < 8 ? 1 : 0); + var b = byteIndex < length ? data[offset + byteIndex] : 0; + ++this._bit; + return (b >> (7 - (inWord & 7))) & 1; + } + + public int Bits(int n) { + var v = 0; + for (var i = 0; i < n; ++i) v = (v << 1) | this.Bit(); + return v; + } + } + + // ── canonical code ────────────────────────────────────────────────── + + private sealed class Code { + // first-code / count tables per length for canonical decoding (DEFLATE style, MSB first) + private readonly int[] _count = new int[MaxCodeBits + 1]; + private readonly int[] _symbols; + private readonly int _maxLen; + + public Code(ReadOnlySpan lengths, int maxLen) { + this._maxLen = maxLen; + var n = 0; + foreach (var l in lengths) { + if (l > maxLen) throw new InvalidDataException("UC2 code length exceeds the format maximum."); + if (l > 0) { ++this._count[l]; ++n; } + } + // reject oversubscribed codes; incomplete ones are legal + var left = 1; + for (var len = 1; len <= maxLen; ++len) { + left = (left << 1) - this._count[len]; + if (left < 0) throw new InvalidDataException("UC2 Huffman code is oversubscribed."); + } + this._symbols = new int[n]; + var offs = new int[maxLen + 2]; + for (var len = 1; len <= maxLen; ++len) offs[len + 1] = offs[len] + this._count[len]; + for (var s = 0; s < lengths.Length; ++s) + if (lengths[s] > 0) this._symbols[offs[lengths[s]]++] = s; + } + + public int Decode(BitReader r) { + int code = 0, first = 0, index = 0; + for (var len = 1; len <= this._maxLen; ++len) { + code |= r.Bit(); + var count = this._count[len]; + if (code - first < count) return this._symbols[index + code - first]; + index += count; + first += count; + first <<= 1; + code <<= 1; + } + throw new InvalidDataException("UC2 stream uses an unassigned Huffman code."); + } + } + + private static readonly Lazy<(Code Ld, Code L)> BaseCodes = + new(() => (new Code(BaseLengths.AsSpan(0, NumLd), MaxCodeBits), new Code(BaseLengths.AsSpan(NumLd), MaxCodeBits))); + + /// + /// Decodes one Ultra stream. < 0 decodes to the stream's + /// end-of-stream bit (the CDIR); otherwise decoding stops after that many bytes. + /// + public static byte[] Decode(byte[] input, int offset, int length, ReadOnlySpan dictionary, long outputLength, long cap = 100_000_000) { + if (outputLength == 0) return []; + var limit = outputLength < 0 ? cap : outputLength; + if (limit > int.MaxValue - 65536) throw new NotSupportedException("UC2 member exceeds the 2 GiB in-memory limit."); + var dictLen = dictionary.Length; + var window = new byte[dictLen + (int)Math.Min(limit, 1 << 20)]; + dictionary.CopyTo(window); + var w = dictLen; + var end = (long)dictLen + limit; + var r = new BitReader(input, offset, length); + var prev = (byte[])BaseLengths.Clone(); + Code? ld = null, l = null; + + while (w < end) { + if (r.Bit() == 0) break; // end of stream + (ld, l) = ReadTrees(r, prev); + while (w < end) { + if (r.Overrun) throw new InvalidDataException("UC2 stream ended early."); + var sym = ld.Decode(r); + if (w + 35482 >= window.Length && window.Length < end) + Array.Resize(ref window, (int)Math.Min(end, Math.Max(window.Length * 2L, w + 65536L))); + if (sym < NumLiterals) { + window[w++] = (byte)sym; + continue; + } + sym -= NumLiterals; + var dist = DistBase[sym] + r.Bits(DistExtra[sym]); + var ls = l.Decode(r); + if (dist == EobDistance) break; // end of block: the length symbol's extra bits are not sent + var len = LenBase[ls] + r.Bits(LenExtra[ls]); + if (dist > w) throw new InvalidDataException("UC2 match reaches before the dictionary."); + if (len > end - w) len = (int)(end - w); + var src = w - dist; + for (var k = 0; k < len; ++k) window[w++] = window[src + k]; + } + } + if (outputLength >= 0 && w < end) + throw new InvalidDataException("UC2 stream ended before the recorded size."); + return window.AsSpan(dictLen, w - dictLen).ToArray(); + } + + private static (Code Ld, Code L) ReadTrees(BitReader r, byte[] prev) { + if (r.Bit() == 0) { + BaseLengths.CopyTo(prev, 0); + return BaseCodes.Value; + } + var t = r.Bits(2); + var total = NumSymbols - ((t & 1) == 0 ? 28 : 0) - ((t & 2) == 0 ? 128 : 0); + var preLengths = new byte[NumPre]; + for (var i = 0; i < NumPre; ++i) preLengths[i] = (byte)r.Bits(3); + var pre = new Code(preLengths, 7); + var st = new byte[NumSymbols + 20]; + int count = 0; + byte val = 0; + while (count < total) { + var s = pre.Decode(r); + if (s != RepeatSymbol) { + val = (byte)s; + st[count++] = val; + continue; + } + var c = pre.Decode(r); + for (var k = 0; k < c + MinRepeat - 1 && count < st.Length; ++k) st[count++] = val; + } + var lens = new byte[NumSymbols]; + var idx = 0; + void Put(int lo, int hi) { for (var s = lo; s < hi; ++s) lens[s] = DeltaDecode[prev[s], st[idx++]]; } + if ((t & 1) != 0) Put(0, 32); + else { Put(9, 11); Put(12, 14); } + Put(32, 128); + if ((t & 2) != 0) Put(128, 256); + Put(256, NumSymbols); + lens.CopyTo(prev, 0); + return (new Code(lens.AsSpan(0, NumLd), MaxCodeBits), new Code(lens.AsSpan(NumLd), MaxCodeBits)); + } + + // ── encoder (default trees, greedy hash-chain matcher) ─────────────── + + private sealed class BitWriter { + private readonly List _out = []; + private uint _acc; + private int _n; + + public void Put(int value, int bits) { + for (var i = bits - 1; i >= 0; --i) { + this._acc = (this._acc << 1) | (uint)((value >> i) & 1); + if (++this._n == 16) { + this._out.Add((byte)this._acc); + this._out.Add((byte)(this._acc >> 8)); + this._acc = 0; + this._n = 0; + } + } + } + + public byte[] Finish() { + if (this._n > 0) this.Put(0, 16 - this._n); + return [.. this._out]; + } + } + + private static (int[] Codes, byte[] Lens) CanonicalCodes(ReadOnlySpan lengths) { + var codes = new int[lengths.Length]; + var count = new int[MaxCodeBits + 2]; + foreach (var l in lengths) if (l > 0) ++count[l]; + var next = new int[MaxCodeBits + 2]; + var code = 0; + for (var len = 1; len <= MaxCodeBits; ++len) { + code = (code + count[len - 1]) << 1; + next[len] = code; + } + for (var s = 0; s < lengths.Length; ++s) + if (lengths[s] > 0) codes[s] = next[lengths[s]]++; + return (codes, lengths.ToArray()); + } + + private static readonly Lazy<(int[] Codes, byte[] Lens)> BaseLdCodes = new(() => CanonicalCodes(BaseLengths.AsSpan(0, NumLd))); + private static readonly Lazy<(int[] Codes, byte[] Lens)> BaseLCodes = new(() => CanonicalCodes(BaseLengths.AsSpan(NumLd))); + + /// + /// Encodes as one Ultra stream using the default trees, with + /// as history. Matches stay within distance 64000 and length 32760. + /// + public static byte[] Encode(ReadOnlySpan data, ReadOnlySpan dictionary) { + var w = new BitWriter(); + if (data.IsEmpty) { w.Put(0, 1); return w.Finish(); } + + var (ldc, ldl) = BaseLdCodes.Value; + var (lc, ll) = BaseLCodes.Value; + var buf = new byte[dictionary.Length + data.Length]; + dictionary.CopyTo(buf); + data.CopyTo(buf.AsSpan(dictionary.Length)); + var start = dictionary.Length; + + const int hashBits = 15; + var head = new int[1 << hashBits]; + Array.Fill(head, -1); + var chain = new int[buf.Length]; + int Hash(int p) => ((buf[p] << 10) ^ (buf[p + 1] << 5) ^ buf[p + 2]) & ((1 << hashBits) - 1); + void Insert(int p) { if (p + 2 < buf.Length) { var h = Hash(p); chain[p] = head[h]; head[h] = p; } } + for (var p = 0; p < start; ++p) Insert(p); + + w.Put(1, 1); // block + w.Put(0, 1); // default trees + var pos = start; + const int maxChain = 64, maxLen = 32760; + while (pos < buf.Length) { + int bestLen = 0, bestDist = 0; + if (pos + 2 < buf.Length) { + var cand = head[Hash(pos)]; + for (var steps = 0; cand >= 0 && steps < maxChain; ++steps, cand = chain[cand]) { + var d = pos - cand; + if (d > MaxEncoderDistance) break; + if (d == EobDistance) continue; + var limit = Math.Min(maxLen, buf.Length - pos); + var l = 0; + while (l < limit && buf[cand + l] == buf[pos + l]) ++l; + if (l > bestLen) { bestLen = l; bestDist = d; if (l == limit) break; } + } + } + if (bestLen >= 3) { + EmitDistance(w, ldc, ldl, bestDist); + EmitLength(w, lc, ll, bestLen); + for (var k = 0; k < bestLen; ++k) Insert(pos + k); + pos += bestLen; + } else { + w.Put(ldc[buf[pos]], ldl[buf[pos]]); + Insert(pos); + ++pos; + } + } + // end of block: distance 64001 then one length code (L0) without extra bits + EmitDistance(w, ldc, ldl, EobDistance); + w.Put(lc[0], ll[0]); + w.Put(0, 1); // end of stream + return w.Finish(); + } + + private static void EmitDistance(BitWriter w, int[] codes, byte[] lens, int d) { + int sym, extra, bits; + if (d < 16) { sym = 255 + d; extra = 0; bits = 0; } + else if (d < 256) { sym = 270 + (d >> 4); extra = d & 15; bits = 4; } + else if (d < 4096) { sym = 285 + (d >> 8); extra = d & 255; bits = 8; } + else { sym = 300 + (d >> 12); extra = d & 4095; bits = 12; } + w.Put(codes[sym], lens[sym]); + if (bits > 0) w.Put(extra, bits); + } + + private static void EmitLength(BitWriter w, int[] codes, byte[] lens, int n) { + int sym, extra, bits; + if (n < 11) { sym = n - 3; extra = 0; bits = 0; } + else if (n < 27) { sym = 8 + (n - 11) / 2; extra = (n - 11) & 1; bits = 1; } + else if (n < 91) { sym = 16 + (n - 27) / 8; extra = (n - 27) & 7; bits = 3; } + else if (n < 155) { sym = 24; extra = n - 91; bits = 6; } + else if (n < 667) { sym = 25; extra = n - 155; bits = 9; } + else if (n < 2715) { sym = 26; extra = n - 667; bits = 11; } + else { sym = 27; extra = n - 2715; bits = 15; } + w.Put(codes[sym], lens[sym]); + if (bits > 0) w.Put(extra, bits); + } +} diff --git a/Hawkynt.FileFormats.Archives/FileFormats/FileFormat.Uc2/super.dat b/Hawkynt.FileFormats.Archives/FileFormats/FileFormat.Uc2/super.dat new file mode 100644 index 000000000..2ae429253 --- /dev/null +++ b/Hawkynt.FileFormats.Archives/FileFormats/FileFormat.Uc2/super.dat @@ -0,0 +1,1276 @@ +This software and accompanying documentation is protected by the +Copyright laws of the Netherlands and also by International Treaty +provisions. Any use of this software in violation of Copyright law or +the terms of this limited license will be prosecuted to the best of +our ability. The conditions under which you may copy this software +and documentation are clearly outlined below under "Distribution +Restrictions" (paragraph E). + +AIP-NL hereby grants you a limited license to use this software for +evaluation purposes for a period not to exceed thirty (30) days. If +you intend to continue using this software (and/or its documentation) +after the thirty (30) day evaluation period, you MUST make a +registration payment to AIP-NL. + +Using this software after the thirty (30) day evaluation period, +without registering the software is a violation of the terms of this +limited license. + +You shall not use, copy, emulate, clone, rent, lease, sell, modify, +decompile, disassemble, otherwise reverse engineer, or transfer the +licensed program, or any subset of the licensed program, except as +provided for in this agreement. Any such unauthorized use shall result in +immediate and automatic termination of this license. + +All rights not expressly granted here are reserved by AIP-NL. + +=================================================================== + + +IFS=C:\OS2\HPFS.IFS /CACHE:128 /CRECL:4 /AUTOCHECK:D +PROTSHELL=C:\OS2\PMSHELL.EXE +SET USER_INI=C:\OS2\OS2.INI +SET SYSTEM_INI=C:\OS2\OS2SYS.INI +SET OS2_SHELL=C:\OS2\CMD.EXE +SET AUTOSTART=PROGRAMS,TASKLIST,FOLDERS,CONNECTIONS +SET RUNWORKPLACE=C:\OS2\PMSHELL.EXE +SET COMSPEC=C:\OS2\CMD.EXE +LIBPATH=.;C:\OS2\DLL;C:\OS2\MDOS;C:\;C:\OS2\APPS\DLL;C:\MMOS2\DLL +SET PATH=C:\OS2;C:\OS2\SYSTEM;C:\OS2\MDOS\WINOS2;C:\OS2\INSTALL;C:\;C:\OS2\MDOS;C:\OS2\APPS;C:\MMOS2 +SET DPATH=C:\OS2;C:\OS2\SYSTEM;C:\OS2\MDOS\WINOS2;C:\OS2\INSTALL;C:\;C:\OS2\BITMAP;C:\OS2\MDOS;C:\OS2\APPS;C:\MMOS2;C:\MMOS2\INSTALL +SET PROMPT=$i[$p] +SET HELP=C:\OS2\HELP;C:\OS2\HELP\TUTORIAL;C:\MMOS2\HELP +SET GLOSSARY=C:\OS2\HELP\GLOSS; +SET IPF_KEYS=SBCS +PRIORITY_DISK_IO=YES +FILES=50 +DEVICE=C:\OS2\TESTCFG.SYS +DEVICE=C:\OS2\DOS.SYS +DEVICE=C:\OS2\PMDD.SYS +BUFFERS=100 +IOPL=YES +DISKCACHE=256,LW,AC:CD +MAXWAIT=3 +MEMMAN=SWAP,PROTECT +SWAPPATH=C:\OS2\SYSTEM 2048 4096 +BREAK=OFF +THREADS=256 +PRINTMONBUFSIZE=134,134,134 +COUNTRY=001,C:\OS2\SYSTEM\COUNTRY.SYS +SET KEYS=ON +REM SET DELDIR=C:\DELETE,512; +BASEDEV=PRINT01.SYS +BASEDEV=IBM1FLPY.ADD +BASEDEV=IBM1S506.ADD +BASEDEV=OS2DASD.DMD +SET BOOKSHELF=C:\OS2\BOOK;C:\MMOS2; +SET EPMPATH=C:\OS2\APPS; +REM DEVICE=C:\OS2\APPS\SASYNCDA.SYS +PROTECTONLY=NO +SHELL=C:\OS2\MDOS\COMMAND.COM C:\OS2\MDOS +FCBS=16,8 +RMSIZE=640 +DEVICE=C:\OS2\MDOS\VEMM.SYS +DEVICE=C:\OS2\MDOS\ANSI.SYS +DOS=LOW,NOUMB +DEVICE=C:\OS2\MDOS\VDPX.SYS +DEVICE=C:\OS2\MDOS\VXMS.SYS /UMB +DEVICE=C:\OS2\MDOS\VDPMI.SYS +DEVICE=C:\OS2\MDOS\VCDROM.SYS +DEVICE=C:\OS2\MDOS\VWIN.SYS +REM DEVICE=C:\OS2\PCMCIA.SYS +REM DEVICE=C:\OS2\MDOS\VPCMCIA.SYS +BASEDEV=AHA152X.ADD +DEVICE=C:\OS2\MDOS\VMOUSE.SYS +DEVICE=C:\OS2\POINTDD.SYS +DEVICE=C:\OS2\MOUSE.SYS +DEVICE=C:\OS2\COM.SYS +DEVICE=C:\OS2\MDOS\VCOM.SYS +CODEPAGE=437,850 +DEVINFO=KBD,US,C:\OS2\KEYBOARD.DCP +SET EPMPATH=C:\OS2\APPS +SET FAXPM=C:\OS2\APPS +SET VIO_SVGA=DEVICE(BVHVGA,BVHSVGA) +SET MMBASE=C:\MMOS2; +SET DSPPATH=C:\MMOS2\DSP; +SET NCDEBUG=4000 +DEVICE=C:\MMOS2\SSMDD.SYS +DEVICE=C:\MMOS2\ADSHDD.SYS +DEVICE=C:\MMOS2\SMVDD.SYS +DEVICE=C:\MMOS2\SBD2.SYS 1 7 220 4 /N:SBAud1$ +BASEDEV=LOCKDRV.FLT /UNIT:0,1,2,3,4 +struct ITEM_STRUCT{ + char szName[13]; /* dir/file name */ + unsigned long ulVersion; /* file version number (0 == most recent) */ + unsigned long ulFileSize; /* file size */ + int iDay, iMonth, iYear; /* dir/file date */ + int iHour, iMinute, iSecond; /* dir/file time */ + char cArchive, cHidden, /* dir/file attributes */ + cSystem, cReadOnly; /* */ + int iTags; /* number of tags */ + char aszTag[100][100]; /* dir/file tags (e.g. OS/2 EA's) */ +}; + +int Exists (char *szFileName) +{ + /* use an attempt to open the file to determine its existance */ + FILE *pfTmp = fopen (szFileName, "r"); + if (pfTmp) + { + fclose (pfTmp); + return 1; + } else { + return 0; + } +} +1234567890-=_+{}|:"<>?~`ABCDEFGHIJKLMNOPQRSTUVWXYZ 1234567890qwertyuiop[]\asdfghjkl;'zxcvbnm,./abcdefghijklmnopqrstuvwxyz1234567890-=_+{}|:"<>?~`ABCDEFGHIJKLMNOPQRSTUVWXYZ 1234567890qwertyuiop +#! rnews 1312 +Path: +From: mathematicians extended primality infinite +Newsgroups: comp.pictures.compression.general.german.french.dutch.american.crypt. number of following sequences digit opinion facilities +Subject: beginning length programmable anything interpreter comments anything +Message-ID: >>> ten thousand years +In article < + +[disclaimer: +Summary: +Followup-To: +Distribution: , The Netherlands +International Scotland Edinburg London Finland Delft Los Angelos Utrecht Helsinki Japanese English Spain Spanish Seattle Thailand Canada Denmark Aalborg France Desktop Publishing +Keywords: none Latin, CWI, Amsterdam +shell script experience expertsystems operating systems computer hardware software location Technology questions +Expires: address Laboratory for Foundation of Computing Science Department, University of project, +Reply-To: +~~ +ARPA: jim% +UUCP: jim@ +JANET: jim@ +, problem solution Switzerland Stockholm language +Telephone: Newcastle analog digital environment emacs rec.arts cut here +Internet: + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + +(w-flush (window fill-colour empty-ground 'utilities) + +(defvar field-properties ((subfields)) 'aggregate-field-subfields + +(defun +(declare + (special t) + (macros t)) + +(eval-when (compile) + (load 'constants) + +(defstruct + (field ; generic fields + (:displace t) + (:list) + (:conc-name) + (type 'generic-field) ; type = generic + (zone (make-zone)) ; bounding zone + (properties (list nil)) ; empty property list +) + +(solid pattern) +background W-PATTERN-1)))) + W-BACKGROUND)))) + (pattern-zone-interior (field-zone f) + (apply (concat ' + (type (field-type + (ncons f))) point-in-box-interior draw-labelled-button-field + +(defmacro (let ((b (get (field-properties f) 'fill-ground)) + +(def lentenv +expanded-bitmap-field-properties-ncols (divide-points draw-button-fields + + clear-zone-interior draw-field-background subfields selection routines + (equal (return (setq add-points vector subtract multiply division dimensions +(excluding boundaries) init-machine resulting sublist (mapcar ' + second-level expression pairify alternating elements (nreverse manipulation + (penultimate tail-recursive local fun -installed-fonts nil) resize-field + toggle-field check-field alter-text make-point init-text-field + input-text-field duplicate distribute radio-button-field otherwise + + + + +.pn 0 +.ls1 +.EQ +delim $$ +.EN +.ev1 +.ps-2 +.vs-2 +.ev +.sp 5 +.ps+4 +.ce +.ps-4 +.sp4 +.sp2 +.ce4 +.sp 8 +.in+1i +.ll-1i +.sp 3 +.in +0.5i +.ti -0.5i +.br +.sh "Introduction"\fR \(em +.pp +.ul +.[ +.] +.sh " \fI \& +.FN +.EF +.LB +.nf +.ta \w'u +0.5i +\w'[0.23354, \(dg [0,\ 1) +.fi +.LE +$code_value$Max_frequency$low$high$value$ +.ev2 +.nr x2 \w'symbol'/2README DOC. Wat te doen? +======================== + +Geef het UC commando om toegang tot het HELP systeem te krijgen. Zoeken op +onderwerp is mogelijk. + +Dit document bevat een korte beschrijving van de bedoeling van de "Ultra +Compressor"; wat algemene informatie die u moet weten; een algemeen overzicht +van de UltraCompressor; een overzicht van alle bestanden die bij UC2_DIST.EXE +horen en het doel daarvan, en als laatste een overzicht van het materiaal dat +hoort bij verwante AIP produkten. + +Als u de "Algemene Informatie" gelezen hebt, kunt u desgewenst de rest van dit +document overslaan. + +Wat is UltraCompressor 2 (UC) +============================== + +UC is een archiver. Een archiver stelt u in staat om meerdere bestanden en +zelfs complete directories/bomen op te slaan in een enkel bestand; het "ar- +chief". UC gebruikt "data compressie" om dit archief zo klein mogelijk te +maken, meestal veel kleiner dan de bestanden waren voor ze gearchiveerd werden. +UC kan archieven ook SCHADE BESTENDIG maken, zodat alle bestanden in een +archief beveiligd zijn, zelfs in geval van schijf fouten. (hier zijn grenzen +aan) + +Algemene informatie +==================== + +Toen u UC2-DIST.EXE uitvoerde, deed u twee dingen: + -U bepaalde waar u UC in uw systeem wil hebben. + -U voegde (naar keuze) het pad waar UC zit toe aan uw + AUTOEXEC.BAT. + + +(De mogelijkheid bestaat dat er na het toevoegen van het UC pad "Out of +environment space" op uw scherm verschijnt. Om dit op te lossen moet u uw +CONFIG.SYS shell regel, veranderen in SHELL=C: MSDOS COMMAND.COM /P /E:512 +[aangenomen dat dos in C; MSDOS staat] en/of uw DOS handleiding raadplegen.) + +Om meer over UC te weten te komen, hoeft u alleen het "UC" commando te geven. +Alle documentatie is in leesbaar ASCII zodat het mogelijk is het uit te printen +etc. Om bijvoorbeeld BASIC.DOC uit te printen, moet u het dos commando "COPY +BASIC.DOC PRN". intypen. + +UC IS NIET GRATIS. U moet ervoor betalen. Lees LICENCE.DOC voor informatie. UC +is een "shareware"Qu'est ce qu'on peut faire. + entrer le systŠme AIDER +Chercher au sujet etc. est possible. +Ce document contient une brŠve description du but du "Ultra +Compressor"; quelque information g‚n‚rale qui vous devez +savoir; un r‚sum‚ de tous fichiers qui appartiennent … UC2_- +DIST.EXE et leur but; et un r‚sum‚ du mat‚riel qui appartient +… les produits contigu‰s de AIP-NL. Quand vous avez lu "l'in- +formation g‚n‚ral" vous pouvez, quand vous voulez, passer sur +plusieurs fichiers et mˆme des r‚pertoires complŠtes/arbres +dans un seul fichier; "les archives". UC emploie "data com- +pression" pour faire ces archives si bref comme possible, +g‚n‚ralement plus bref qu'ils ‚taient avant qu'on les a entre- +pos‚ dans les archives. UC est aussi capable de faire ces + mˆme en cas des d‚gƒts au +disque magn‚tique. (dans les limites du possible) +(C'est possible que "Out of environment space" apparait … +votre ‚cran aprŠs ajouter le chemin d'UC. Pour r‚soudre cela +vous devez changer votre CONFIG.SYS rŠgle d'interpr‚teur de +commandes en SHELL=C: MSDOS COMMAND.COM /P /E:512 [… supposer +que DOS est en C: MSDOS.], et/ou consultez votre notice expli- +Pour apprendre plus d'UC, tous ce que vous devez faire est +donner le commandement "UC". Toute documentation est en lisi- +ble ASC11 de maniŠre que c'est possible de l'imprimer etc. +Pour imprimer BASIC.DOC par exemple, vous devez taper … la +machine le commandement de DOS "COPY BASIC.DOC PRN". +UC n'est pas gratuit. Vous devez le payer. Lis LICENCE.DOC +pour information. UC est un programme que vous pouvez trahir +avant que vous l'achetez. En LICENCE.DOC vous trouvez aussi +l'accord de licence de AIP-NL. Quand vous employez ce paquet +am‚liorations vous pensez nous pouvons mettre en UC et nos +autres produits. Les programmes de AIP-NL sont toujours d‚ve- +lopp‚s en collaboration avec les utilisateurs. Commentaire … +les notices explicatives en g‚n‚ral, et … les notices explica- +tives dans une certaine langue, nous appr‚cions aussi. Des +suggestions originales sont r‚mun‚r‚es. + Bundesrepubliek Deutschland Familienname Vorname Alter Wohnort Adresse M�nchen D�sseldorf Oberhausen K”ln Hamburg + mich das ist sehr gut Freundin Wie bitte wo wohnen Sie Halt! eins zwei f�nf sieben neun zw”lf dreizehn sechsundzwanzig + Welche Fragen kannst du stellen speichern richtig oder falsch Klassenlehrer Bonn Berlin Leverkusen Bremen Stuttgart Warum + J�rgen Hans Dieter KarlHeinz eigentlich Dortmund Aachen Frankfurt Hannover Ruhrgebied Aussprache Postleitzahl Vater + Mutter Geschwister der n„chtste Zug Hausfrau heiraten Ergebnisse Hauptstadt Schweiz ™sterreich Regierungssitz + Schwimmen Zeihnen Tischtennis Die Mannschaft Mittwoch Donnerstag Samtag sonntags montag freitags der Winter Herbst + Sommer Fr�hling Freunde das Alter gegnerisch L„ndern europ„ischen Nat�rlich m„nnlich weiblich s„chlich Polizei + Umleitung ausrechend befriedigend �berhaupt trotzdem versuchen Grundlage Vergleichstest CAD_Programme Seiten Programmierer + meistgekaufte Verbesserungen Speicherkapazit„t Unterst�tzt schneller Festplatten Laufwerken geschwindigkeit Schalter + ausf�hrlichen Selbstverst„ndlich Prozessor Fertigung Protokoll Hilfestellung Benutzer Anwendung Einbaurahmen 3,5 Zoll + Bildaufl”sung Steckerleiste Preis„nderungen Lieferm”glichkeit H„ndleranfragen Nadel-Drucker Sekunde abschaltbar Monitore + Pr„zisionssockel F„higkeiten erforderlich Bodensee Extrema Wendepunkte Nullstellen schiefe Asymptoten Kurvendiskussion + vielleicht Kickstart Skriptsprache kompatibel Merkmale Preis Bildkompression z.B. Sequenzerfunktionen Qualit„t Eing„nge + Einsteckkarte Darstellung Profis ausgestattet Erflogreich Farbdruck eingebaute Papiereinzug Schriftarten Kombinierter + Schubtraktor Textverarbeitung Durchgef�hrter Spezialisten Entwicklung .MODEL SMALL + ; Registers modified +"bios.inc" +$comm macro name,dist,size,count +_BSS segment word public 'BSS' +_DATA segment word public 'DATA' +_s@ label byte +_TEXT segment byte public 'CODE' +_Transform proc near + adc al,40h + add al,90h + add ax,es:[bx] + add bx,2 + add cx, dx + add cx, ax + add di, ax + add dl,'0' + add dl,'A'-'0'-10 ; Convert to A,B,C,D,E,F + add eax,3614090360 + add eax,bp[ 0*4] + add eax,ebx + add si,ax + and al,0Fh + and dl,0fh + and esi,edx + and InpSta, ax + assume cs:_TEXT,ds:DGROUP + BP MOV ES,BP MOV AH,50 MOV BX,BP + BP,CS DEC BP MOV ES,BP SUB DX,AX + BX PUSH BX MOV AH,30 INT 21 + call FileWrite + call IntDivide C,ax,NumberOfValues + call LoCase + call ProcByte + call Spaces + call StoreTab + call TabNext + cld + cli + cmp al, 0 + cmp ax, 0 + cmp cx,0 + cmp dl,'9' + cmp SpcCnt, 0 + comm dist name[size]:BYTE:count +d@ label byte +d@w label word + daa + dec ax + dec di + dec TabOff + dec [byte es:di] + DEC DX INC BP ADD BP,AX INC +DGROUP group _DATA,_BSS + DOSSEG +DX PUSH SI PUSH DI PUSH BP PUSH + end +ES PUSH DS XOR DX,DX POP DS +ES,BP POP ES PUSH CS + EXTRN _IntDivide:PROC + ifndef ??version + in al,dx + IN AL,DX INC DH INC DI INC + inc cx + inc di + INC SI DEC SP MOV SP,BP POP +include "imacros.mac" "dos.inc" "idos.mac" "ibios.mac" + int 21h +int DOSINT + IRET + jbe showhexdigit_showit + jc filopw1 ;jump if error + je stotab1 + jmp SHORT parcmd1a + jnc prolin6 + jne NoEqual + jnz filfil1 + jz stospc1 + lds si, [StrAddress] + lds si,num + lea bx, OutBlk + lea di, LinBuf + lea dx, Help + lea si, LinBuf + les bx,[bp+4] + les di,var2 + loop AverageLoop + loop HexLoop + mov ah, 9 + mov ah,al ;save it + mov ah,DOSPRINTCHAR + mov al, [di-1] + mov al, '?' + mov al, ' ' + mov al,ah + mov al,byteCount + mov ax,@DATA + mov ax,bx + mov ax,es + mov bh,bl + mov bx,ax + mov BYTE PTR [si], EOF + mov ch,al + mov cl, [byte es:di] + mov cl,255 + mov cl,ah + mov cx, dx + mov di, si + mov di,bx + mov ds, ax + mov dx, SpcCnt + mov dx,ds + mov edi,ebx + mov es:[bx],cl + mov esi,ebx + mov si,di + mov SpcCnt, 0 + mov WORD PTR [bx], 1 + mov [bx+10], ax + mov [bx+2], cx + mov [bx+4], dx + mov [bx+8], ax ;save handle +MOV AX,BX MOV AX,F000 MOV ES,AX MOV +NOP + not ax + not esi + or ax, ax + or cx, cx + or dx, dx + or edi,esi + or InpSta, LAS_LET + pop ax + pop bx + pop di + pop ds + pop dx + pop es +POP DX POP CX POP BX POP AX +POP ES POP BP POP DI POP SI + POPF + public _draw_box + public _Transform + public name + push ai + push ax + push bx + push cx + push di + push ds + push dx + push si + push WORD PTR [bp+8] + PUSH AX PUSH BX PUSH CX PUSH + PUSHF + repe cmpsb + RET + RETF REPZ MOVSB INC BP MOV + rol eax,7 + shl di,1 + shr al,1 ;extract high nibble + SI MOV DS,AX + stc + sti + STI + StoreSpc endp + stosb ;store + stosw + sub cx, ax + sub cx,di + sub dx, dx + sub TabOff, dx + test al,1 + test InpSta, ax + test Options, MAK_CAP + XCHG AH,AL NEG AX XCHG AX,CX + xor ah,ah + xor al,al + XOR DI,DI POP SS MOV SI,DIDEFINT A-Z +DECLARE SUB +declare sub +Player SetScreen Center ( GetInputs DoExplosion Results UpdateScores +DECLARE FUNCTION StartX, AS INTEGER +declare function +END TYPE +end type +'Constants +CONST TRUE = -1 +CONST FALSE = NOT TRUE +DIM SHARED +'Global Variables Mode Variables Color AS SINGLE + as single + INT(RND(1) + DEF SEG + KeyFlags = PEEK(1047) + IF AND OR XOR THEN + END IF + GOSUB InitVars +END +end if and or then +data read sleep on error goto cls step call palette enseif screen timer randomize printloop until else +return + DATA Restore RESTORE REDIM = FALSE + FOR i = 0 TO READ + NEXT i + ELSE +RETURN + CLS + LOCATE 10, 5 + PRINT + END + RESUME NEXT + resume next i +REM $STATIC +FUNCTION PLAY " + DO + LOOP UNTIL TIMER +END FUNCTION + +TYPE + CIRCLE(circle(LINE(line(paint(PAINT(SUNATTR + pset(PSET (SELECT CASE r + case 1 + CASE 1 + CASE 2 THEN PUT (OBJECTCOLOR TO 1 STEP -1 + CASE ELSE + CALL CHR$(8) = MID$(STRING$(RIGHT$(STR$(SPACE$(VAL(LEFT$(LEN(UCASE$(CHR$(13) + WHILE INKEY$ <> "": WEND 'Clear keyboard buffer + BEEP + SCREEN Mode + SetScreen + VIEW PRINT 9 TO 24 + PALETTE OBJECTCOLOR ELSEIF + COLOR 7 + J = 1 + RANDOMIZE (TIMER) + SLEEP 1 + (NOT CINT(PALETTE AS STRING * AS DOUBLE + ON ERROR GOTO OPEN FOR INPUT AS #1 + CLOSE + CHR$(27) +FIELD #1, head length finished AS INTEGER + EXIT SUB + MKD$(0) + VARPTR( + VARSEG( +MS-DOS QBasic +LPRINT TAB +LINE INPUT #1, + CHR$(0) + = (currChoice + MaxChoice - 2) MOD MaxChoice + 1 +.Title +.AType + CLOSE #2 + DATE$ RESTORE colorTable(Y/N) STEP 2 + POKE THEN END + WHILE NOT EOF(1) + "CON", "SCRN", "PRN", "COM1", "COM2" then end + data$ restore Q ]–NZ +] + +' +GO + +'7 ' + + F FUœN888888888 8 +8 @ !/ÿ&q G + + + + + + +   +    Gd š™žð›@á +áá +á á áá +á  PRINT_BLOCK ƒ : Q`–N_`7 +7 +<<E (7 +(7 (7 (7===LœH.""""""  +  /ÿÿ&ñ G    Gd š™žn€4žgwba8fwfw~ €fwÏfwÔfwÝfwæfwìfw÷fwüfwgwgw gwgwgwgw%gw+gw1gw6gw\RADOX\TABLES\SAMPAPP\RESTTEMP.DBDateEmployeeCustomerStateHome GroupYearTotalDOW #DOWMonth #MonthVolItem #QuantEmp #CustPrice  ÿPà`*ICROSOFT PIFEX‡q*INDOWS 386 3.0�h€�d2Œ *INDOWS 286 3.0ÿÿ[windows] +device=HP *aserJet 500+,HPPCL,LPT1.OS2 +load = +run= +Beep=yes +Spooler=yes +NullPort=None +BorderWidth=3 +KeyboardSpeed=31 +CursorBlinkRate=530 +DoubleClickSpeed=452 +Programs=com exe bat pif +Documents= +DeviceNotSelectedTimeout=15 +TransmissionRetryTimeout=45 +swapdisk= +MouseThreshold1=10 +MouseThreshold2=0 +MouseSpeed=0 + +[Desktop] +Pattern=(None) +Wallpaper=(None) +TileWallpaper=0 +GridGranularity=0 +IconSpacing=120 + +[Extensions] + +[intl] +sCountry=United States +iCountry=1 +iDate=0 +iTime=0 +iTLZero=0 +iCurrency=0 +iCurrDigits=2 +iNegCurr=0 +iLzero=1 +iDigits=2 +iMeasure=1 +s1159=AM +s2359=PM +sCurrency=$ +sThousand=, +sDecimal=. +sDate=/ +sTime=: +sList=, +sShortDate=M/d/yy +sLongDate=dddd, MMMM dd, yyyy + +[ports] +; A line with [filename].PRN followed by an equal sign causes +; [filename] to appear in the Control Panel's Printer Configuration dialog +; box. A printer connected to [filename] directs its output into this file. +LPT1.OS2= +LPT2.OS2= +FILE:= +EPT:= +LPT1:= +LPT2:= +LPT3:= +COM1:=9600,n,8,1 +COM2:=9600,n,8,1 +COM3:=9600,n,8,1 +COM4:=9600,n,8,1 + +[fonts] +Roman (All res)=ROMAN.FON +Script (All res)=SCRIPT.FON +Modern (All res)=MODERN.FON +Symbol 8,10,12,14,18,24 (VGA res)=SYMBOLE.FON +Helv 8,10,12,14,18,24 (VGA res)=HELVE.FON +Tms Rmn 8,10,12,14,18,24 (VGA res)=TMSRE.FON +Courier 10,12,15 (VGA res)=COURE.FON + +[PSCRIPT] +External Printers=6 +Printer1=40291760 +Printer2=40291730 +Printer3=40293930 +Printer4=40293960 +Printer5=IBM17521 +Printer6=IBM39521 + +[PrinterPorts] +HP *aserJet 500+=HPPCL,LPT1.OS2,45,15 + +[devices] +HP *aserJet 500+=HPPCL,LPT1.OS2 + +[Clock] +iFormat=1 + +[Settings] +Window=38 24 581 363 1 +SaveSettings=1 +MinOnRun=0 +AutoArrange=0 + +[Groups] +Group1= +# include +#include + + ICON .ico + +STRINGTABLE +BEGIN + IDS_NAME, "hapsnap" +END + +MAIN DIALOG LOADONCALL MOVEABLE DISCARDABLE 10, 19, 270, 123 +CAPTION "hapsnap" +STYLE WS_BORDER | WS_CAPTION | WS_DLGFRAME | WS_SYSMENU | WS_GROUP | WS_VISIBLE | WS_POPUP +BEGIN + CONTROL "Pattern:", 101, "static", SS_LEFT | WS_CHILD, 3, 7, 32, 7 + CONTROL "", 102, "edit", ES_LEFT | WS_BORDER | WS_TABSTOP | WS_CHILD, 36, 5, 104, 12 + CONTROL "Drives:", 103, "static", SS_LEFT | WS_CHILD, 3, 22, 28, 8 + CONTROL "", 104, "listbox", LBS_NOTIFY | WS_BORDER | WS_VSCROLL | WS_CHILD, 2, 41, 253, 81 + CONTROL "#: 0", 105, "static", SS_RIGHT | WS_CHILD, 216, 22, 50, 8 + CONTROL "", 106, "static", SS_LEFT | WS_CHILD, 4, 31, 250, 9 + CONTROL "Search", 107, "button", BS_DEFPUSHBUTTON | WS_TABSTOP | WS_CHILD, + CONTROL "Clear", 108, "button", BS_PUSHBUTTON | WS_TABSTOP | WS_CHILD, + CONTROL "1:", 110, "button", BS_AUTOCHECKBOX | WS_TABSTOP | WS_CHILD, +END + +SQLHistory: Created Edited +grant select on lookup to public +/ +commit +/ +declare +select distinct for update +delete from +insert into demp values ( +update set +where +create table +create index +create view +group by +order by +alter table +alter database controlfile reuse maxlogfiles maxdatafiles maxinstances noarchivelog exclusive +alter rollback segment +alter session set sql_trace true +drop table number(char(date, not null, +drop view +drop sequence +exception + cluster rollback to savepoint pctused pctfree size initrans maxtrans default storage backup dismount shared open noresetlogs close immediate +audit whenever not successfull; +abs(ceil(floor(mod(power(round(sign(sqrt(trunc(chr(initcap(lower(lpad(rpad(ltrim(rtrim(soundex(replace(substr(translate(upper(ascii(instr(length(avg(count(min(max(stddev(variance(decode(least(greatest(to_char(to_number(to_date(userenv(round(sysdate +.currval.nextval.level.rowid +union intersect minus prior increment by synonym character decimal long varchar double precision nomaxvalue nominvalue nocycle noorder modify constraint tablespace connect to identified by using ' + user_users dba_tablespaces dba_data_files dba_segments sys.dual dba_free_space dba_users +GRANT SELECT ON LOOKUP TO PUBLIC +/ +COMMIT +/ +DECLARE +SELECT DISTINCT FOR UPDATE OF +DELETE FROM +INSERT INTO DEMP VALUES (7900,',',00); +UPDATE SET +WHERE +CREATE TABLE +CREATE INDEX +CREATE VIEW SALES AS +GROUP BY +ORDER BY +ALTER TABLE +ALTER DATABASE CONTROLFILE REUSE MAXLOGFILES MAXDATAFILES MAXINSTANCES NOARCHIVELOG EXCLUSIVE +ALTER ROLLBACK SEGMENT +ALTER SESSION SET SQL_TRACE TRUE +DROP TABLE NUMBER(CHAR(DATE, NOT NULL, +DROP VIEW +DROP SEQUENCE +CREATE SEQUENCE ORDID +INCREMENT BY 1 +START WITH 622 +NOCACHE; +EXCEPTION + CLUSTER ROLLBACK TO SAVEPOINT PCTUSED PCTFREE SIZE INITRANS MAXTRANS DEFAULT STORAGE BACKUP DISMOUNT SHARED OPEN NORESETLOGS CLOSE IMMEDIATE +AUDIT WHENEVER NOT SUCCESSFULL; +ABS(CEIL(FLOOR(MOD(POWER(ROUND(SIGN(SQRT(TRUNC(CHR(INITCAP(LOWER(UPPER(LPAD(RPAD(SOUNDEX(LTRIN(RTRIM(REPLACE(SUBSTR(TRANSLATE(ASCII(INSTR(LENGTH(AVG(COUNT(MIN(MAX(STDDEV(VARIANCE(DECODE(LEAST(GREATEST(TO_CHAR(TO_NUMBER(TO_DATE(USERENV(ROUND(SYSDATE +.CURRVAL.NEXTVAL.LEVEL.ROWID +UNION INTERSECT MINUS PRIOR INCREMENT BY SYNONYM CHARACTER DECIMAL LONG VARCHAR DOUBLE PRECISION NOMAXVALUE NOMINVALUE NOCYCLE NOORDER MODIFY CONSTRAINT TABLESPACE CONNECT TO IDENTIFIED BY USING ' + USER_USERS DBA_TABLESPACES DBA_DATA_FILES DBA_SEGMENTS SYS.DUAL DBA_FREE_SPACE DBA_USERS +host echo "Building demonstration tables. Please wait." +set termout off +set feedback off Common LISP Pascal batch files numeric updating decrementing incrementing DEBUG contents introduction predicates conditionals local global iterations technique quick reference + pattern matching implementation arithmetic entering compatible methods and theory definitions adjacent successor predecessor edge Level computer failure evaluation nothing minus + routine possible terminate simulation compare rounding up common resulting headerfile generation obsolete digital analog communications engineering blitter graphics linker women + assembler compiler generate harddisk PC constants partial the attributes object-oriented disadvantage makefile syntax semantic overloading boundaries matrix exception spool only + information hiding conventions tree head interpreters static dynamic abstraction smalltalk Prolog declaration separate libraries hexadecimal binary octal statement executable + scope volatile assignment unary preprocessor resolution starting signal wait ANSI ASCII machine essential dereferencing keywords solve special remove extract determine verify + calculate feature history duplicate controller improvements polymorphic garbage collection raytracing organization edition languages classification sequential parallel serial + vector program counter mainframes magnetic frequency networks distributed systems asynchronous transmission equivalent interrupts kernel Management semaphores demand questions + loading interactive requirements hierarchical workstation identifier transformation differential generalize anti-aliasing Bresenham algorithm rotation surface perspective Huffman + projection dimensions pattern displayed quality plotters complement difference business maintenance toolbox environment sliding dictionary Shannon-Fano bibliographic techniques + leaves statistics decoding following Fibonacci concerning forever heuristics conclusions readable writable LempelZivStorer parent collections properties with from the pointer + for the information representing instructions components formulas blocks users guide notepad ctrl backspace insert overwrite typeover asterisk semi-colon scientific calculator + connector track sector heads physical device driver tested certified wordprocessing warning double sided automatic tracks per inch address miscellaneous appendices experiment the + anything something description internal external 65535 4095 16384 32768 32767 0xFFFF versus windows gadgets requesters menus viewport joystick suicide handshaking bidirectional + disclaimer DISCLAIMER transmit receive acknowledgement trademark thresholds overflow parity stopbits framing listing understand calendar help replace save move searching printing + quit cut paste forward backward compatibility uppercase lowercase underlining punctuation manipulating warning failure truncated word_wrapped linesize pagesize heading numwidth + unique primary secondary foreign Database Administrator concatenation composite key integrity constraint join column keyword logical expression precedence consistency glossary + registration player participant emerald handicap you were he was she is they are I am have been them incorporated international this that if then than where what which with until + TCP/IP SPX/IPX acquire security record tuple shadow 1,000,000 prototype shareware context configuration suitable LARGEINT credit card screen saver RS232 shortcut key profiling + performance workbench paradigms structured hypercubes multitasking microprocessor EISA development embedded {*******************************************************} +{ } +{ *urbo Pascal Version 6.0 } +{ *urbo Vision Unit } +{ } +{ Copyright (c) 1990 International } + +(* +*) + +const + ('DefaultFont', 'TriplexFont', 'SmallFont', 'SansSerifFont', 'GothicFont'); + ('SolidLn', 'DottedLn', 'CenterLn', 'DashedLn', 'UserBitLn'); + ('EmptyFill', 'SolidFill', 'LineFill', 'LtBkSlashFill', 'XHatchFill', 'InterleaveFill', 'WideDotFill', 'CloseDotFill'); + FillStyles TextDirect conditional ] of string[8] = ('HorizDir', 'VertDir'); + = packed array[1..] = ('LeftText', 'CenterText', 'RightText'); +'BottomText', 'TopText'] of Char; + +type + +var + GraphDriver : integer; + MaxX, MaxY : word; + ErrorCode : integer; + OldExitProc : Pointer; +{$F+} + +PROCEDURE = ARRAY[1.. := false; +procedure Initialize; +begin +BEGIN + InGraphicsMode : boolean; { DirectVideo repeat until REPEAT UNTIL INTEGER; +BOOLEAN; +REAL; +TYPE VAR CONST := FALSE; +FUNCTION ] OF CHAR; +{$IFDEF Use := true; +{$ELSE} +{$ENDIF} +InitGraph(GraphDriver, GraphMode, PathToDriver); +Randomize; +end; { +function DrawBorder; +{ ViewPort : ViewPortType; +SetLineStyle(GetViewSettings(with ViewPort do +WITHRectangle(SetViewPort(OutTextXY(SetTextStyle(SetTextJustify(FullPort; +LineSettingsType; +FillSettingsType; +TextSettingsType; + IF <> NIL THEN ELSE + if WriteOut('do then + else + Right := Left := Depth := trunc(Trunc(OutTextXY(Round(round(Cos(Sin(Circle(MoveTo(LineTo(Points[KeyPressed; +while (not Width, Height Ellipse(FreeMem(Rectangle(Writeln('Write('unit App; +WHILE (NOT width, height writeln('write(':= TRUE; +{$F+,O+,S-,X+,D-} + index BlackWhite TApplication CBackground = nil; +implementation + WriteLine(Dispose(HandleEvent(Message(Boolean; + Readln; + readln; +virtual; +constructor destructor Dialogs record MenuBar LongInt; +end. +QuickSort(assembler; +ScrollBar, PutPeerViewPtr SetCmdState(RegisterType(NumInputLine.FileNameCheckCollide(ReversesbHandleKeyboardShowTerminalWindow; + +uses + Dos, Objects, Drivers, Memory, Views, Menus, Dialogs, StdDlg, MsgBox, App, + DemoCmds, Gadgets, Puzzle, Calendar, AsciiTab, Calc, FViewer, HelpFile, + DemoHelp, ColorSel, MouseDlg, Overlay; + Screen, Bricks; + Dos, Crt, Graph; + TCUtil, TCLStr, TCScreen, TCHash; + +USES + DOS, CRT, GRAPH; + dos, crt, graph; + + cmRetrieveDesktop cmCalculator ClearEvent(Event); + PProtectedStream HelpCounter Offset Length ReadParagraph(TClockView = PSortedCollection; +FOR i := 1 TO RECORD +for i := 1 to NewSubMenu(WriteCard(NewItem('R.Assign(^.Next; <> nil NumLines MagicHeader = + NodePtr = ^Node; + Node = record + Item: PointPtr; + Next: NodePtr; + end; + +RootNode List.Item HeapStatus(' Modified Clicked MouseDown ovrNotFound := Board[Y, X]; + := MemAlloc(SizeOf( and Directory Control := False; + CellTypes = (ClEmpty, ClValue, ClText, ClFormula, ClRepeat); + Justification = (JLeft, JCenter, JRight); + CellHashTable Empty := True; + LegalValue Overwrite Found Total FirstItem result value label 99; + Exit; + GetQuit or (S <> '') ClrEOLXY(System.NewLen < OldLenprogram interval(input,output); +{dataflow simulator for real interval arithmetic} +{number of maxint; + Sreal = record +(finite,infinite)cardinality mantissa exponent hulp help Shift Dummy (not eof) mod MOD DIV div MAXINT PROGRAM (INPUT,OUTPUT); +END. + END;README.DOC: This document describes how to get started, features etc. + +JUST GIVE THE UC COMMAND TO GET ACCESS TO THE HELP SYSTEM! + +This document describes the purpose of "UltraCompressor II". + +UC IS NOT A FREE PRODUCT. You have to pay for it if you use it. Read +LICENSE.DOC for more information. UC is a "try-before-you-buy" program +so you can try it before you buy it. LICENSE.DOC also contains the AIP +licence agreement. By using this package, you are agreeing to be bound +by the terms of this agreement. + +This document consists of the following paragraphs: + + - A. What is Ultra Compressor II + - B. Support, feedback + - C. Ultra Compressor main feature overview + - D. Related products + - E. Manual overview + - F. Included files + +To jump to a certain paragraph, press the corresponding letter. To +jump to a specific document/chapter, press the digit. See paragraph E +for an overview of all documentation. + + +1.A WHAT IS ULTRA COMPRESSOR II (UC). +===================================== + +UltraCompressor II (UC) from Ad Infinitum Programs (AIP) is an +archiver. An archiver is a file handling and compression utility. It +will make most of your files significantly smaller and it can keep +related files together. When you need the files, you can decompress +them with the same UC utility. UC is very easy to use, thanks to its +simple user interface and has support for all archiving needs + +An archive behaves just like a floppy disk. It has a directory +structure, you can copy from the archive with extraction and copy to +the archive by adding. It is also possible to delete files from the +archive. + +UC can also make such an archive DAMAGE PROTECTED, so ALL files in the +archive are safe, even if there are disk errors (within reasonable +limits). With UC an archive can contain multiple versions of the same +file. + +With a clear manual and a limited number of commands, UC will turn out +to be very easy to use. Most of the options are configurable, so the +commands are ve +NAME + +DESCRIPTION 'adad' + +CODE PRELOAD MOVEABLE DISCARDABLE +DATA PRELOAD MOVEABLE MULTIPLE + +EXETYPE WINDOWS + +SEGMENTS + _RES PRELOAD MOVEABLE DISCARDABLE + +HEAPSIZE 128 +STACKSIZE 8192 + +EXPORTS + TstAppWndProc + About + DDEClientWndProc + +NAME DLLDEMO +DESCRIPTION 'C++ Windows DLL Demo' +EXETYPE WINDOWS +CODE PRELOAD MOVEABLE +DATA PRELOAD MOVEABLE MULTIPLE +HEAPSIZE 1024 +STACKSIZE 5120 +CC = BCC +AS = TASM +RC = RC +.asm.obj: + $(AS) $(AFLAGS) $&.asm +.c.exe: + $(CC) $(CFLAGS) $&.c +.c.obj: + $(CC) $(CFLAGS) /c $&.c +.cpp.obj: + $(CC) $(CPPFLAGS) /c $&.cpp +.rc.res: + $(RC) $(RFLAGS) /r $& +.SUFFIXES: .exe .obj .asm .c .res .rc +AUTODEPEND +# *Translator Definitions* +# *Implicit Rules* +.c.obj: + $(CC) -c {$< } +.cpp.obj: + $(CC) -c {$< } +# *List Macros* +EXE_dependencies = \ + genprime.obj \ + init.obj \ + mathsup.obj \ + basics.obj \ + random.obj \ + md5p.obj \ + fprims.obj +# *Explicit Rules* +genprime.exe: genprime.cfg $(EXE_dependencies) + # no map file +# *Individual File Dependencies* +genprime.obj: genprime.cfg genprime.c +random.obj: genprime.cfg random.c +# *Compiler Configuration File* +genprime.cfg: genprime.mak + copy &&| +-f- +-C +-w+ +-N +-v +-G +-O +-Og +-Oe +-Om +-Ov +-Ol +-Ob +-Op +-Oi +-Z +-k- +-vi- +(C) Copyright 1991 by International + +// Example Program +*/ +#include +#include + include files initialise goto global variables + + + + + + +#include +#error +#asm +#endasm +#define NR_ +#define MAX +void main(void) +{ +(argc, argv) +{ +int argc, char *argv[]) +{ + int i; + FILE *fp; + for(i = 0;i <;i++) + for(;;) + printf(" float scanf("%d",&,NULL); + getch(); + detectgraph(&g_driver, &g_mode); + initgraph(&g_driver, &g_mode, "..\\bgi"); + wide = (int)((getmaxx()) / ((ARRAYMAX * 2 ) + 1)); + bottom = getmaxy() - 20; + return; +int DoWMCommand(WORD wParam); +void DoLButtonDown(HWND hWnd,LONG lParam); +UpdateWindow(DoLButtonUp(DoMouseMove(RECTANGLE: +long FAR PASCAL function Background character delay(total; +struct +typedef struct WS_OVERLAPPEDWINDOW ELLIPSE: + char *str; + char str[ p->next; + int counter; + while (1) + while(1) + return 0; + switch( + case + break; + continue; + default: +static left = top = total = min(max(parameters wclass + return 1; +typedef unsigned int WORD; +typedef unsigned char BYTE; +typedef unsigned long DWORD; +extern char *tmp WM_DDE_FIRST, GWW_HINSTANCE | CS_HREDRAW | CS_VREDRAW; +hInstancehCursor CW_USEDEFAULT, if (Execute(Command + int len; +GlobalUnlock(GlobalAlloc(GMEM_MOVEABLE, WM_QUEYENDSESSION: +WM_DDE_FIRST,WS_CAPTION | + WS_SYSMENU | + WS_MINIMIZEBOX, + time_t t1; + time(&t1); + do +union { + lfHeight lfWidth lfCharSet message = FALSE; +cprintf("sprintf("UpdateWindow(UnlockResource(FreeResource(!CreateDialogIndirect( +#pragma argsused +#ifdef _Cdecl +#ifndef +#else +#endif +#undef _FARFUNC far + || && += -= != == >> << <<= >>= ' ' " " "\n"; +__cplusplus + bioskey(0); +_HEAPEMPTY_HEAPOK_FREEENTRY_USEDENTRY_HEAPEND_HEAPCORRUPT_BADNODE_BADVALUE_STDDEF_PTRDIFF_T_PTRDIFF_T +*_Cdecl calloc(free(realloc(brk(sbrk(heapcheck(coreleft(farmalloc( friend bcd +#pragma option -Vo- +#pragma inline +abs(acos(acos(asin(atan(cosh(exp(log(log10(pow(sinh(sqrt(tanh(operator+(const return *this; +private: +protected: +enum LASTMODECOLORS { + BLACK, BLUE, GREEN, CYAN, RED, MAGENTA, BROWN, LIGHTGRAY, DARKGRAY, LIGHTBLUE, LIGHTGREEN, LIGHTCYAN, LIGHTRED, LIGHTMAGENTA, YELLOW, WHITE +clreol(clrscr(gotoxy(wherex(wherey(getch(getche(kbhit(putch(ungetch(malloc(sizeof( +class : public virtual +inline void isalnum(isalpha(isascii(iscntrl(isdigit(isgraph(islower(isprint(ispunct(isspace(isupper(isxdigit(tolower(toupper( +extern int errno; +hourminutesecondhsecondsleep(_EPSILONgetpixel(moveto(_CLASSDEF(memcpy(read(ostream(istream(ceil(ldexp(memchr(memcmp(memcpy(memmove(memset(set_new_handler(new(abort( SEEK_CUR SEEK_END SEEK_SET stdin stdout stderr fclose(fgetc(fopen(fputc(fread(fscanf(fseek(ftell(fwrite(feof(getchar(putchar(atof(atoi(atol(getenv(rand(system(randomize(); +strcat(strchr(strcmp(strcpy(strcspn(strlen(strncat(strncmp(strncpy(strrchr(strpbrk(strstr(time( +optionS*InBuffer,*OutBufferwcHdumpClass.lp +typedef struct scrollkeys +SCROLLKEYS key2scroll [] = +VK_HOME,WM_COMMAND,IDM_HOME,VK_END,WM_VSCROLL,SB_BOTTOM,VK_PRIOR,SB_PAGEUP,VK_NEXT,SB_PAGEDOWN,VK_UP,SB_LINEUP,VK_DOWN,SB_LINEDOWN,VK_LEFT,WM_HSCROLL,SB_PAGEUP,VK_RIGHT,SB_PAGEDOWN}; +RegisterClass(GetInstanceData(CreateWindow(cursfont.lfSelectObject(getcwd(curpath,setmode( - 'A'; + printf("Hello, world\n"); +::AbstractArray::ArrayIterator::Point::HashTable::Arc::Circle::Sortable::Queue::Error::Location::GMessage::String::Definition::Container::DoubleList::Stack::SortedArray::Set::Object::BaseTime::ListElement::ListIterator::BaseDate::FilesByName::FileData::DoubleListElement::Directory::Deque::Dictionary::DoubleListIterator::ContainerIterator::Collection::Class::Bag::Array::Association::The following symbols control inclusion of various parts of this file: +WINVERversion numberNOKERNEL APIsNOUSERNOSOUNDNOCOMMNODRIVERSNOMINMAXNOLOGERRORNOPROFILERNOLFILEIOPENFILENORESOURCENOATOMNOLANGUAGENOLSTRINGNODBCSNOKEYBOARDINFONOGDICAPMASKSNOCOLORNOGDIOBJNODRAWTEXTNOTEXTMETRIC +NOSCALABLEFONTNOBITMAPNORASTEROPSNOMETAFILENOSYSMETRICSNOSYSTEMPARAMSINFONOMSGNOWINSTYLESNOWINOFFSETSNOSHOWWINDOWPOSNOVIRTUALKEYCODESNOKEYSTATESNOWHNOMENUSNOSCROLLNOCLIPBOARDNOICONSNOMBNOSYSCOMMANDSNOMDINOCTLMGRNOWINMESSAGESNOHELP +SELECTORFIELDOFFSETDECLARE_HANDLE32GetVersionGetFreeSpaceGetCurrentPDBGetWindowsDirectoryGetSystemDirectoryGetFreeSystemResourcesGFSR_SYSTEMRESOURCES0x0000GFSR_GDIRESOURCES0x0001GFSR_USERRESOURCES0x0002GetWinFlags +WF_PMODEWF_CPU286WF_CPU3860x0004WF_CPU486WF_STANDARDWF_WIN286WF_ENHANCEDWF_WIN386WF_CPU086WF_CPU186WF_LARGEFRAMEWF_SMALLFRAMEWF_80x87WF_PAGINGWF_WLO + GetDOSEnvironmentGetCurrentTimeGetTickCountGetTimerResolutionNOLOGERRORLogErrorLogParamErrorLogParamError +ERR_WARNINGERR_PARAMERR_SIZE_MASKERR_BYTERR_WORDERR_DWORDERR_BAD_VALUERR_BAD_FLAGSERR_BAD_INDEXERR_BAD_DVALUERR_BAD_DFLAGSERR_BAD_DINDEXERR_BAD_PTRERR_BAD_FUNC_PTRERR_BAD_SELECTORERR_BAD_STRING_PTRERR_BAD_HANDLERR_BAD_HINSTANCERR_BAD_HMODULE +ERR_BAD_GLOBAL_HANDLERR_BAD_LOCAL_HANDLERR_BAD_ATOMERR_BAD_HFILERR_BAD_HWNDERR_BAD_HMENUERR_BAD_HCURSORERR_BAD_HICONERR_BAD_HDWPERR_BAD_CIDERR_BAD_HDRVRERR_BAD_COORDSERR_BAD_GDI_OBJECTERR_BAD_HDCERR_BAD_HPENERR_BAD_HFONTERR_BAD_HBRUSH +ERR_BAD_HBITMAPERR_BAD_HRGNERR_BAD_HPALETTERR_BAD_HMETAFILERR_GALLOCERR_GREALLOCERR_GLOCKERR_LALLOCERR_LREALLOCERR_LLOCKERR_ALLOCRESERR_LOCKRESERR_LOADMODULERR_CREATEDLGERR_CREATEDLG2ERR_REGISTERCLASSERR_DCBUSYERR_CREATEWNDERR_STRUCEXTRA +ERR_LOADSTRERR_LOADMENUERR_NESTEDBEGINPAINTERR_BADINDEXERR_CREATEMENUERR_CREATEDCERR_CREATEMETAERR_DELOBJSELECTEDERR_SELBITMAP +dwOptionsdwFilterachAllocModule[8]dwAllocBreakdwAllocCountWINDEBUGINFOGetWinDebugInfoSetWinDebugInfoDebugOutputWDI_OPTIONSWDI_FILTERWDI_ALLOCBREAKDBO_CHECKHEAPDBO_BUFFERFILLDBO_DISABLEGPTRAPPINGDBO_CHECKFREEDBO_TRACEBREAKDBO_WARNINGBREAKDBO_NOERRORBREAK +DBO_NOFATALBREAKDBO_INT3BREAKDBF_TRACEDBF_WARNINGDBF_ERRORDBF_FATALDBF_KERNELDBF_KRN_MEMMANDBF_KRN_LOADMODULEDBF_KRN_SEGMENTLOADDBF_USERDBF_GDIDBF_MMSYSTEMDBF_PENWINDBF_APPLICATIONDBF_DRIVERFatalExitWindowsExecFatalAppExitWindowsEW_RESTARTWINDOWS +EW_REBOOTSYSTEMDebugBreakOutputDebugStringSEM_FAILCRITICALERRORSSEM_NOGPFAULTERRORBOXSEM_NOOPENFILEERRORBOXSetErrorModeIsBadReadPtrIsBadWritePtrIsBadHugeReadPtrIsBadHugeWritePtrIsBadCodePtrIsBadStringPtrProfInsChkProfSetupProfSampRateProfStartProfStop +ProfClearProfFlushProfFinishNOPROFILERSwitchStackBackSwitchStackToHINSTANCE_ERRORLoadModuleFreeModuleLoadLibraryFreeLibraryWinExecGetModuleHandleGetModuleUsageGetModuleFileNameGetProcAddressGetInstanceDataGetCodeHandleoffSegmentcbSegmentcb +AllocalignShiftreserved[2]SEGINFOGetCodeInfoMakeProcInstanceFreeProcInstanceMakeProcInstanceFreeProcInstanceSetSwapAreaSizeSwapRecordingValidateCodeSegmentsWEP_SYSTEM_EXITWEP_FREE_DLLNOKERNELGetNumTasksGetCurrentTaskDirectedYieldGMEM_FIXEDGMEM_MOVEABLE +GMEM_NOCOMPACTGMEM_NODISCARDGMEM_ZEROINITGMEM_MODIFYGMEM_DISCARDABLEGMEM_NOT_BANKEDGMEM_SHAREGMEM_DDESHAREGMEM_NOTIFYGMEM_LOWERGlobalDiscardGlobalAllocGlobalReAllocGlobalFreeGlobalDosAllocGlobalDosFreeGlobalLockGlobalUnlockGlobalSizeGlobalHandle +GMEM_DISCARDEDGMEM_LOCKCOUNTGlobalFlagsGlobalUnWireGlobalPageUnlockGlobalUnfixGlobalLRUNewestGlobalLRUOldestGlobalCompactGlobalNotifyLockSegmentAllocSelectorFreeSelectorAllocDStoCSAliasPrestoChangoSelectorGetSelectorBase +SetSelectorBaseLimitEmsPagesValidateFreeSpacesWM_COMPACTINGLMEM_FIXEDLMEM_MOVEABLELMEM_NOCOMPACTLMEM_NODISCARDLMEM_ZEROINITLMEM_MODIFYLMEM_DISCARDABLELHNDLPTRNONZEROLPTRLocalDiscardLocalAllocLocalReAllocLocalFreeLocalLockLocalUnlockUINTLocalSize +LMEM_DISCARDEDLMEM_LOCKCOUNTLocalFlagsLocalInitLocalCompactLocalShrinkNOLFILEIOOF_READOF_WRITEOF_READWRITEOF_SHARE_COMPATOF_SHARE_EXCLUSIVEOF_SHARE_DENY_WRITEOF_SHARE_DENY_READOF_SHARE_DENY_NONEOF_PARSEOF_DELETEOF_VERIFYOF_SEARCHOF_CANCELF_CREATE +OF_PROMPTOF_EXISTOF_REOPENOpenFileREAD_WRITE_lopen_lcreat_lclose_llseek_lread_lwrite_hread_hwriteTF_FORCEDRIVEGetTempFileNameGetTempDriveDRIVE_REMOVABLEDRIVE_FIXEDDRIVE_REMOTESetHandleCountWNetAddConnectionWNetGetConnectionAllocResourceSetResourceHandler +MAKEINTRESOURCEOBM_CHECKBOXESIsCharUpperIsCharLowerlstrcmpilstrcpylstrcatlstrlenhmemcpyGetEnvironmentSetViewportOrgGetViewportOrgSetViewportExtGetViewportExtOffsetViewportOrgScaleViewportExtGetBValue(rgb)COLOR_MENUTEXTCOLOR_WINDOWTEXTCOLOR_INACTIVEBORDERCOLOR_HIGHLIGHTTEXT +BS_NULLBS_HATCHEDBS_PATTERNSetSystemPaletteUseGetClipBoxMoveToGetCurrentPositionSetTextCharacterExtraRASTER_FONTTYPEDEVICE_FONTTYPETRUETYPE_FONTTYPETT_AVAILABLETT_ENABLEDWM_QUITCreateWindowIsWindowVisibleShowWindowSW_HIDESW_NORMALSW_MAXIMIZESW_MINIMIZESW_RESTOREHIDE_WINDOW +SHOW_OPENWINDOWSHOW_FULLSCREENGetNextWindowGW_CHILDGetPropVK_RBUTTONVK_CANCELVK_BACKVK_TABVK_CLEARVK_RETURNVK_SHIFTVK_CONTROLVK_MENUVK_PAUSEVK_CAPITALVK_ESCAPEVK_SPACEVK_SELECTVK_PRINTVK_EXECUTEVK_SNAPSHOTVK_INSERTVK_DELETEVK_HELPVK_NUMPADVK_MULTIPLYVK_ADDVK_SEPARATORVK_SUBTRACTVK_DECIMALVK_DIVIDEVK_F24VK_NUMLOCKVK_SCROLL +WM_LBUTTONDOWNWM_LBUTTONUPWM_LBUTTONDBLCLKWM_RBUTTONDOWM_RBUTTONUPWM_RBUTTONDBLCLKWM_MBUTTONDOWNWM_MBUTTONUPWM_MBUTTONDBLCLKGetSystemMenuDrawMenuBarChangeMenuWM_CUTWM_COPYWM_PASTEWM_CLEARWM_UNDO +DrawIconIDI_APPLICATIONMAKEINTRESOURCEIDI_HANDIDI_QUESTIONIDI_EXCLAMATIONIDI_ASTERISKHELP_CONTENTSStartSoundSendDriverMessagedel @echo off +cls +if not exist goto end +copy /b \tmp\msdos\tools\text\dos\utils\include\manual\games\docs\*.txt +dir +call \windows\*.bak +cd test.tst goto errexit +:loop +:exit +:ok +:error +:end +:errexit +:skip +device=c:\;c:\*.bat +dos=high +path=c:\;c:\loadhi batch file backup restore errorlevel driver startup drive parameters diskette format subdirectory installation error checking config.sys autoexec.bat > nul +mode con +ncd +pause +set include= +image +rem +ver +expand %_fd% +dosshell +dosswap +diskcomp +diskcopy +comp +maker .mak +shell= +files= +buffers= +lastdrive= + command.com +\*.dat +\*.* +\*.sys +\*.doc +uc2 a +uc2 l +DEL @ECHO OFF +CLS +IF NOT EXIST GOTO END +COPY /b \TMP\MSDOS\TOOLS\TEXT\DOS\UTILS\INCLUDE\MANUAL\GAMES\DOCS\*.TXT +DIR +CALL \WINDOWS\*.BAK +CD TEST.TST GOTO ERREXIT +:LOOP +:EXIT +:OK +:ERROR +:END +:ERREXIT +:SKIP +DEVICE=C:\;C:\*.BAT +DOS=HIGH +PATH=C:\;C:\LOADHI BATCH FILE BACKUP RESTORE ERRORLEVEL DRIVER STARTUP DRIVE PARAMETERS DISKETTE FORMAT SUBDIRECTORY INSTALLATION ERROR CHECKING CONFIG.SYS AUTOEXEC.BAT > NUL +MODE CON +NCD +PAUSE +SET INCLUDE= +IMAGE +REM +VER +EXPAND %_FD% +DOSSHELL +DOSSWAP +DISKCOMP +DISKCOPY +COMP +MAKER .MAK +SHELL= +FILES= +BUFFERS= +LASTDRIVE= + COMMAND.COM +\*.DAT +\*.* +\*.SYS +\*.DOC +UC2 A +UC2 E \ No newline at end of file diff --git a/Hawkynt.FileFormats.Archives/Hawkynt.FileFormats.Archives.csproj b/Hawkynt.FileFormats.Archives/Hawkynt.FileFormats.Archives.csproj index 43a2696cb..bc5b2a36a 100644 --- a/Hawkynt.FileFormats.Archives/Hawkynt.FileFormats.Archives.csproj +++ b/Hawkynt.FileFormats.Archives/Hawkynt.FileFormats.Archives.csproj @@ -22,6 +22,12 @@ $(TargetsForTfmSpecificContentInPackage);_AddBundledAssembliesToPackage + + + + + diff --git a/Hawkynt.FileFormats.Archives/README.md b/Hawkynt.FileFormats.Archives/README.md index d3f8c6198..c6b573ec5 100644 --- a/Hawkynt.FileFormats.Archives/README.md +++ b/Hawkynt.FileFormats.Archives/README.md @@ -146,6 +146,7 @@ Every State, Test, Maintenance, Compress/Decompress and Demux/Mux/Remux cell is | [Split WIM (.swm)](https://en.wikipedia.org/wiki/Windows_Imaging_Format) | `Swm` | `.swm` `.swm2` `.swm3` `.swm4` … | WORM | ✅ | wipe | Reads wimlib-written sets from part 1 with its siblings beside it; `SwmFormatDescriptor.CreateSplit` writes multi-part sets that wimlib-imagex verifies and applies (XPRESS, LZX, LZMS, none); the generic single-stream Create writes a one-part set | [Microsoft Learn](https://learn.microsoft.com/en-us/windows-hardware/manufacture/desktop/wim-and-esd-windows-image-files-overview) | | [T64 (Commodore tape image)](https://en.wikipedia.org/wiki/T64_(file_format)) | `T64` | `.t64` | R/W | ✅ | defrag · wipe | | [vice-emu.sourceforge.net](https://vice-emu.sourceforge.io/) | | [TAR](https://en.wikipedia.org/wiki/Tar_(computing)) | `Tar` | `.tar` | R/W | ✅ | shrink · wipe | | [pubs.opengroup.org](https://pubs.opengroup.org/onlinepubs/9699919799/utilities/pax.html) | +| [UltraCompressor II](http://fileformats.archiveteam.org/wiki/UltraCompressor_II) | `Uc2` | `.uc2` `.pu2` | WORM | ✅ | — | Reads every UC2 release (masters, delta, turbo, long names); writes UC2 r2-readable archives with one custom master | [GitHub](https://github.com/klauspost/uc2/blob/main/docs/format.md) | | UHARC | `Uharc` | `.uha` | R/W | ✅ | defrag · wipe | | [Archive Team](http://fileformats.archiveteam.org/wiki/UHARC) | | [WIM](https://en.wikipedia.org/wiki/Windows_Imaging_Format) | `Wim` | `.wim` `.swm` `.esd` | WORM | ✅ | wipe | LZX / XPRESS / LZMS paths; kept create-only because an append edit would break the checksum chain | [wimlib.net](https://wimlib.net/) | | Wrapster | `Wrapster` | | WORM | ✅ | defrag · wipe | MP3-wrapper archive carrying one member; stays WORM by design | [Archive Team](http://fileformats.archiveteam.org/wiki/Wrapster) | @@ -548,7 +549,7 @@ Use it when a .NET process needs to enumerate, extract, test, create, edit or in -Every public and protected member of all 2578 types, generated from the built assembly and its XML documentation, is in [REFERENCE.md](https://github.com/Hawkynt/CompressionWorkbench/blob/main/Hawkynt.FileFormats.Archives/REFERENCE.md). +Every public and protected member of all 2583 types, generated from the built assembly and its XML documentation, is in [REFERENCE.md](https://github.com/Hawkynt/CompressionWorkbench/blob/main/Hawkynt.FileFormats.Archives/REFERENCE.md). diff --git a/Hawkynt.FileFormats.Archives/REFERENCE.md b/Hawkynt.FileFormats.Archives/REFERENCE.md index 4f6a3d7bd..9170f5283 100644 --- a/Hawkynt.FileFormats.Archives/REFERENCE.md +++ b/Hawkynt.FileFormats.Archives/REFERENCE.md @@ -29700,6 +29700,84 @@ Implements `IDisposable`. | `Dispose` | `void Dispose()` | | | `Finish` | `void Finish()` | Finalizes and writes the archive. | +### Namespace `FileFormat.Uc2` + +[`Uc2Archive`](#uc2archive) · [`Uc2Archive.Input`](#uc2archiveinput) · [`Uc2Archive.Parsed`](#uc2archiveparsed) · [`Uc2Entry`](#uc2entry) · [`Uc2FormatDescriptor`](#uc2formatdescriptor) + +#### `Uc2Archive` + +UltraCompressor II (.uc2) archives: FHEAD + XHEAD, headerless compressed streams for files and masters (shared dictionaries), and a compressed central directory; every stream is checked with UC2's 16-bit XOR checksum. Reads every UC2 release's archives (methods 1-9, 21-29, 30-37, 40-47 and turbo 80; supermaster, no-master and custom masters; delta filter) and writes archives UC2 r2 reads: one 512-byte custom master compressed with the supermaster, files with method 3. + +| Member | Signature | Summary | +| --- | --- | --- | +| `Extract` | `static byte[] Extract(Parsed archive, Uc2Entry entry)` | Extracts one file, verifying its checksum. | +| `Fletch` | `static ushort Fletch(ReadOnlySpan data)` | UC2's "Fletcher": 0xA55A XOR the XOR of all little-endian 16-bit words (odd tail byte = low byte). | +| `Read` | `static Parsed Read(Stream stream)` | Parses an archive and verifies its central directory. | +| `Write` | `static void Write(Stream output, IEnumerable inputs)` | Writes a UC2 archive that UC2 r2 reads (wVersionNeededToExtract 200): one custom master of 512 zero bytes compressed with the supermaster, every file compressed with method 3 against it, directories implied by the paths, 8.3 aliases plus "AIP:Win95 LongN" tags for names that do not fit 8.3, and the CDIR compressed with no master. | + +#### `Uc2Archive.Input` + +A file to write: its archive path ('/'-separated), content and time. + +Implements `IEquatable`. + +| Member | Signature | Summary | +| --- | --- | --- | +| `Input` | `Input(string Path, byte[] Data, DateTime LastModified)` | A file to write: its archive path ('/'-separated), content and time. | +| `Data` | `byte[] Data { get; init; }` | | +| `LastModified` | `DateTime LastModified { get; init; }` | | +| `Path` | `string Path { get; init; }` | | + +#### `Uc2Archive.Parsed` + +A parsed archive: entries plus what is needed to extract them. + +| Member | Signature | Summary | +| --- | --- | --- | +| `Entries` | `IReadOnlyList Entries { get; }` | Gets the entries, directories included. | + +#### `Uc2Entry` + +One file or directory of a UC2 archive (the newest revision of its name). + +| Member | Signature | Summary | +| --- | --- | --- | +| `Uc2Entry` | `Uc2Entry()` | | +| `Attributes` | `byte Attributes { get; init; }` | Gets the DOS attribute byte. | +| `CompressedSize` | `long CompressedSize { get; init; }` | Gets the compressed stream size (excluding its master). | +| `IsDirectory` | `bool IsDirectory { get; init; }` | Gets whether this is a directory. | +| `LastModified` | `DateTime? LastModified { get; init; }` | Gets the modification time (DOS local time, 2-second resolution). | +| `Method` | `int Method { get; init; }` | Gets the compression method number. | +| `Path` | `string Path { get; init; }` | Gets the path inside the archive, '/'-separated (long names where the archive records them). | +| `ShortName` | `string ShortName { get; init; }` | Gets the DOS 8.3 name as stored. | +| `Size` | `long Size { get; init; }` | Gets the uncompressed size. | + +#### `Uc2FormatDescriptor` + +UltraCompressor II archive (.uc2), Nico de Vries / AIP-NL, 1994-1996. + +Implements `IArchiveCreatable`, `IArchiveFormatOperations`, `IFormatDescriptor`. + +| Member | Signature | Summary | +| --- | --- | --- | +| `Uc2FormatDescriptor` | `Uc2FormatDescriptor()` | | +| `Capabilities` | `FormatCapabilities Capabilities { get; }` | | +| `Category` | `FormatCategory Category { get; }` | | +| `CompoundExtensions` | `IReadOnlyList CompoundExtensions { get; }` | | +| `DefaultExtension` | `string DefaultExtension { get; }` | | +| `Description` | `string Description { get; }` | | +| `DisplayName` | `string DisplayName { get; }` | | +| `Extensions` | `IReadOnlyList Extensions { get; }` | | +| `Family` | `AlgorithmFamily Family { get; }` | | +| `Id` | `string Id { get; }` | | +| `MagicSignatures` | `IReadOnlyList MagicSignatures { get; }` | | +| `Methods` | `IReadOnlyList Methods { get; }` | | +| `TarCompressionFormatId` | `string TarCompressionFormatId { get; }` | | +| `Create` | `void Create(Stream output, IReadOnlyList inputs, FormatCreateOptions options)` | | +| `ExtractEntryToMemory` | `byte[] ExtractEntryToMemory(Stream archive, string entryName, string password)` | | +| `Extract` | `void Extract(Stream stream, string outputDir, string password, string[] files)` | | +| `List` | `List List(Stream stream, string password)` | | + ### Namespace `FileFormat.Uharc` [`UharcEntry`](#uharcentry) · [`UharcFormatDescriptor`](#uharcformatdescriptor) · [`UharcReader`](#uharcreader) · [`UharcWriter`](#uharcwriter) diff --git a/docs/catalogue/our-registry.csv b/docs/catalogue/our-registry.csv index a8bf87611..4dc8d2bea 100644 --- a/docs/catalogue/our-registry.csv +++ b/docs/catalogue/our-registry.csv @@ -537,6 +537,7 @@ format,Tux2,TUX2,Archive,Y,.tux2,Y,Y,Y,Y format,Tux3,TUX3,Archive,Y,.tux3,Y,Y,, format,Txw,TXW (Yamaha TX16W),Audio,,.txw,Y,Y,Y, format,U8,Nintendo U8,Archive,,.u8;.arc,Y,Y,Y,Y +format,Uc2,UltraCompressor II,Archive,,.uc2;.pu2,Y,Y,Y, format,Ubifs,UBIFS,Archive,Y,.ubifs;.ubi;.img,Y,Y,Y,Y format,Udf,UDF,Archive,Y,.udf,Y,Y,Y,Y format,UefiFv,UEFI Firmware Volume,Archive,,.fv;.fd,Y,Y,Y,Y diff --git a/docs/catalogue/reference-formats.csv b/docs/catalogue/reference-formats.csv index ab231c065..30292165e 100644 --- a/docs/catalogue/reference-formats.csv +++ b/docs/catalogue/reference-formats.csv @@ -84,7 +84,7 @@ Quadruple D,qda,archive,,,,,,,Y,1,,,,,,MISSING,, RK / WinRK,rk,archive,,,,,,,Y,1,,,,,,MISSING,, Self Dissolving ARChive,sda,archive,,,,,,,Y,1,,,,,,MISSING,, C64/C128 self-extracting archive,sfx,archive,,,,,,,Y,1,,,,,,MISSING,, -UltraCompressor II,uc;uc0;uc2;ucn;ur2;ue2,archive,,,,,,,Y,1,,,,,,MISSING,, +UltraCompressor II,uc;uc0;uc2;ucn;ur2;ue2,archive,,,,,,,Y,1,https://github.com/klauspost/uc2/blob/main/docs/format.md,Uc2,Y,Y,,PARTIAL,,"UltraCrypt (.ue2) and 2.3 private compression profiles (PCP) unsupported; no in-place modify" PerfectCompress,uca,archive,,,,,,,Y,1,,,,,,MISSING,, YZ1,yz1,archive,,,,,,,Y,1,,,,,,MISSING,, Zzip,zz,archive,,,,,,,Y,1,,,,,,MISSING,, From c4fee8e62a489b7ef0f6a9352a0da695a7bb0e90 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Fri, 23 Oct 2026 13:24:46 +0000 Subject: [PATCH 2/4] * refresh the archive browser screenshot --- docs/screenshots/archive-browser.png | Bin 65657 -> 66581 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/docs/screenshots/archive-browser.png b/docs/screenshots/archive-browser.png index e3795c0d04a8041389e0aaa3edc8cc5c89e36820..0e61385b2ffa2d074800e5c6d40fc30a4b9aeb35 100644 GIT binary patch literal 66581 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

QbAwb1yDjHlgcBhmX;lUGX8zOhdK5LZ% zjF1q2oy>5;f2$nBZsa5ZW(`J4^W%Eve?of$`z=P)>~L;9kkUPg!6t1uSJbF$B@Q-? z5EiAib!@rS;sC26jLg8C?#faDQ{8yuUSMPoOG%{}nJ&)El-f8J5sxblg#%||cXt

`Um>Y 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 RC{OUNjINkpE`vG$@gML4^uPcB literal 65657 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

J-t(C?D*vNbSd$Mpldw%6G^3`$t6)P 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 O*JNyHeySLKDeAvN*8HCU From 01085336cdc433ae6a7a87b1d043f3e45696d43b Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Fri, 23 Oct 2026 13:58:53 +0000 Subject: [PATCH 3/4] * refresh the application screenshot --- screenshots/main-window.png | Bin 66235 -> 65657 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/screenshots/main-window.png b/screenshots/main-window.png index a9ceb7f7ce233693ac240e941d4af64380209648..e3795c0d04a8041389e0aaa3edc8cc5c89e36820 100644 GIT binary patch literal 65657 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

J-t(C?D*vNbSd$Mpldw%6G^3`$t6)P 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 O*JNyHeySLKDeAvN*8HCU literal 66235 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 From 67c60ff225f5aed5a07414ee0d318d803a6c9716 Mon Sep 17 00:00:00 2001 From: Hawkynt Date: Wed, 28 Oct 2026 06:49:48 +0100 Subject: [PATCH 4/4] # reject ambiguous firmware payloads before writing an image Adding a second named payload to Intel HEX could silently discard a file because the shared image builder kept only the first payload in filesystem enumeration order. Reject multiple non-metadata payloads, including an empty first payload, before any output is written. Tests verify creation refusal and byte-preserving add refusal. Verified all three regressions fail before the fix and pass after it, 93 focused tests, 34280 required tests with 1582 skips and no failures, and three package documentation checks. --- .../FirmwareHex/FirmwareHexPayloadTests.cs | 37 +++++++++++++++++++ .../FirmwareHexWriter.cs | 5 ++- 2 files changed, 41 insertions(+), 1 deletion(-) create mode 100644 Compression.Tests/FirmwareHex/FirmwareHexPayloadTests.cs diff --git a/Compression.Tests/FirmwareHex/FirmwareHexPayloadTests.cs b/Compression.Tests/FirmwareHex/FirmwareHexPayloadTests.cs new file mode 100644 index 000000000..bbbc898af --- /dev/null +++ b/Compression.Tests/FirmwareHex/FirmwareHexPayloadTests.cs @@ -0,0 +1,37 @@ +using Compression.Registry; +using FileFormat.FirmwareHex; + +namespace Compression.Tests.FirmwareHex; + +[TestFixture] +public sealed class FirmwareHexPayloadTests { + [TestCase(false)] + [TestCase(true)] + public void Create_RejectsMultiplePayloadsWithoutWritingOutput(bool emptyFirst) { + var descriptor = new IntelHexFormatDescriptor(); + using var output = new MemoryStream(); + var inputs = new[] { + ArchiveInputInfo.InMemory("first.bin", emptyFirst ? [] : [1, 2, 3]), + ArchiveInputInfo.InMemory("second.bin", [9, 8, 7]), + }; + + Assert.Throws(() => + ((IArchiveCreatable)descriptor).Create(output, inputs, new FormatCreateOptions())); + Assert.That(output.Length, Is.Zero); + } + + [Test] + public void Add_RejectsAnotherPayloadWithoutChangingTheArchive() { + var descriptor = new IntelHexFormatDescriptor(); + using var archive = new MemoryStream(); + ((IArchiveCreatable)descriptor).Create(archive, + [ArchiveInputInfo.InMemory("firmware.bin", [1, 2, 3])], new FormatCreateOptions()); + var original = archive.ToArray(); + archive.Position = 0; + + Assert.Throws(() => ((IArchiveModifiable)descriptor).Add(archive, + [ArchiveInputInfo.InMemory("ADD.BIN", [9, 8, 7])])); + Assert.That(archive.ToArray(), Is.EqualTo(original)); + } + +} diff --git a/Hawkynt.FileFormats.FileSystems/FileFormats/FileFormat.FirmwareHex/FirmwareHexWriter.cs b/Hawkynt.FileFormats.FileSystems/FileFormats/FileFormat.FirmwareHex/FirmwareHexWriter.cs index 6c7d4b452..1c9e17266 100644 --- a/Hawkynt.FileFormats.FileSystems/FileFormats/FileFormat.FirmwareHex/FirmwareHexWriter.cs +++ b/Hawkynt.FileFormats.FileSystems/FileFormats/FileFormat.FirmwareHex/FirmwareHexWriter.cs @@ -33,6 +33,7 @@ public static class FirmwareHexWriter { /// one the reader rendered. An input list with no payload describes an image /// with no data, which both formats can write. /// + /// More than one non-metadata payload is supplied. public static FirmwareImage ImageFrom(IReadOnlyList inputs, string sourceFormat) { ArgumentNullException.ThrowIfNull(inputs); @@ -53,7 +54,9 @@ public static FirmwareImage ImageFrom(IReadOnlyList inputs, st } // Any other single input is the payload, whatever it is called: a caller // converting a .bin into a .hex should not have to rename it first. - payload ??= input.ReadContent(); + if (payload is not null) + throw new InvalidDataException($"{sourceFormat} represents one logical firmware payload; multiple payload inputs are ambiguous."); + payload = input.ReadContent(); } List<(uint Address, byte[] Data)> segments;