ripxplore 0.0.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/bin/ripxplore.rb +188 -0
- data/doc/classes/A2Dsk.html +226 -0
- data/doc/classes/A2Dsk.src/M000005.html +18 -0
- data/doc/classes/A2Dsk.src/M000006.html +18 -0
- data/doc/classes/A2Dsk.src/M000007.html +18 -0
- data/doc/classes/A2Dsk.src/M000008.html +18 -0
- data/doc/classes/A2Dsk.src/M000009.html +18 -0
- data/doc/classes/A2Dsk.src/M000010.html +22 -0
- data/doc/classes/A2DskDosOrder.html +139 -0
- data/doc/classes/A2DskDosOrder.src/M000242.html +18 -0
- data/doc/classes/A2DskPhysicalOrder.html +139 -0
- data/doc/classes/A2DskPhysicalOrder.src/M000019.html +18 -0
- data/doc/classes/Apple2.html +187 -0
- data/doc/classes/Apple2.src/M000128.html +18 -0
- data/doc/classes/Apple2.src/M000129.html +18 -0
- data/doc/classes/Apple2.src/M000130.html +18 -0
- data/doc/classes/Apple2.src/M000131.html +19 -0
- data/doc/classes/AppleBinary.html +193 -0
- data/doc/classes/AppleBinary.src/M000089.html +20 -0
- data/doc/classes/AppleBinary.src/M000090.html +18 -0
- data/doc/classes/AppleBinary.src/M000091.html +18 -0
- data/doc/classes/AppleBinary.src/M000092.html +18 -0
- data/doc/classes/AppleCPM.html +228 -0
- data/doc/classes/AppleCPM.src/M000243.html +18 -0
- data/doc/classes/AppleCPM.src/M000244.html +18 -0
- data/doc/classes/AppleCPM.src/M000245.html +21 -0
- data/doc/classes/AppleCPM.src/M000246.html +40 -0
- data/doc/classes/AppleDos.html +275 -0
- data/doc/classes/AppleDos.src/M000161.html +18 -0
- data/doc/classes/AppleDos.src/M000162.html +18 -0
- data/doc/classes/AppleDos.src/M000163.html +18 -0
- data/doc/classes/AppleDos.src/M000164.html +86 -0
- data/doc/classes/AppleHiResPic.html +279 -0
- data/doc/classes/AppleHiResPic.src/M000083.html +22 -0
- data/doc/classes/AppleHiResPic.src/M000084.html +18 -0
- data/doc/classes/AppleHiResPic.src/M000085.html +22 -0
- data/doc/classes/AppleHiResPic.src/M000086.html +57 -0
- data/doc/classes/AppleHiResPic.src/M000087.html +18 -0
- data/doc/classes/AppleHiResPic.src/M000088.html +18 -0
- data/doc/classes/AppleText.html +156 -0
- data/doc/classes/AppleText.src/M000142.html +21 -0
- data/doc/classes/AppleText.src/M000143.html +20 -0
- data/doc/classes/AppleWorksWP.html +160 -0
- data/doc/classes/AppleWorksWP.src/M000081.html +20 -0
- data/doc/classes/AppleWorksWP.src/M000082.html +45 -0
- data/doc/classes/Applesoft.html +169 -0
- data/doc/classes/Applesoft.src/M000175.html +21 -0
- data/doc/classes/Applesoft.src/M000176.html +75 -0
- data/doc/classes/Atari800.html +169 -0
- data/doc/classes/Atari800.src/M000177.html +23 -0
- data/doc/classes/Atari800.src/M000178.html +18 -0
- data/doc/classes/Atari800.src/M000179.html +19 -0
- data/doc/classes/AtariBasic.html +215 -0
- data/doc/classes/AtariBasic.src/M000204.html +20 -0
- data/doc/classes/AtariBasic.src/M000205.html +108 -0
- data/doc/classes/AtariBinary.html +193 -0
- data/doc/classes/AtariBinary.src/M000238.html +20 -0
- data/doc/classes/AtariBinary.src/M000239.html +18 -0
- data/doc/classes/AtariBinary.src/M000240.html +18 -0
- data/doc/classes/AtariBinary.src/M000241.html +18 -0
- data/doc/classes/AtariDos.html +186 -0
- data/doc/classes/AtariDos.src/M000047.html +18 -0
- data/doc/classes/AtariDos.src/M000048.html +43 -0
- data/doc/classes/AtariText.html +159 -0
- data/doc/classes/AtariText.src/M000002.html +20 -0
- data/doc/classes/AtariText.src/M000003.html +18 -0
- data/doc/classes/Atr.html +271 -0
- data/doc/classes/Atr.src/M000208.html +18 -0
- data/doc/classes/Atr.src/M000209.html +18 -0
- data/doc/classes/Atr.src/M000210.html +19 -0
- data/doc/classes/Atr.src/M000211.html +18 -0
- data/doc/classes/Atr.src/M000212.html +18 -0
- data/doc/classes/Atr.src/M000213.html +19 -0
- data/doc/classes/Atr.src/M000214.html +19 -0
- data/doc/classes/C64.html +206 -0
- data/doc/classes/C64.src/M000020.html +18 -0
- data/doc/classes/C64.src/M000021.html +31 -0
- data/doc/classes/C64.src/M000022.html +22 -0
- data/doc/classes/C64.src/M000023.html +19 -0
- data/doc/classes/C64.src/M000024.html +19 -0
- data/doc/classes/C64BasicPrg.html +201 -0
- data/doc/classes/C64BasicPrg.src/M000035.html +20 -0
- data/doc/classes/C64BasicPrg.src/M000036.html +59 -0
- data/doc/classes/C64Prg.html +190 -0
- data/doc/classes/C64Prg.src/M000169.html +20 -0
- data/doc/classes/C64Prg.src/M000170.html +18 -0
- data/doc/classes/C64Prg.src/M000171.html +18 -0
- data/doc/classes/C64Prg.src/M000172.html +20 -0
- data/doc/classes/C64PrgText.html +139 -0
- data/doc/classes/C64PrgText.src/M000237.html +18 -0
- data/doc/classes/C64Seq.html +156 -0
- data/doc/classes/C64Seq.src/M000013.html +20 -0
- data/doc/classes/C64Seq.src/M000014.html +18 -0
- data/doc/classes/CPMFile.html +156 -0
- data/doc/classes/CPMFile.src/M000108.html +20 -0
- data/doc/classes/CPMFile.src/M000109.html +18 -0
- data/doc/classes/CbmDos.html +172 -0
- data/doc/classes/CbmDos.src/M000182.html +18 -0
- data/doc/classes/CbmDos.src/M000183.html +42 -0
- data/doc/classes/CbmFile.html +156 -0
- data/doc/classes/CbmFile.src/M000235.html +20 -0
- data/doc/classes/CbmFile.src/M000236.html +18 -0
- data/doc/classes/D64.html +247 -0
- data/doc/classes/D64.src/M000037.html +18 -0
- data/doc/classes/D64.src/M000038.html +18 -0
- data/doc/classes/D64.src/M000039.html +18 -0
- data/doc/classes/D64.src/M000040.html +22 -0
- data/doc/classes/D64.src/M000041.html +18 -0
- data/doc/classes/D64.src/M000042.html +21 -0
- data/doc/classes/D65.html +170 -0
- data/doc/classes/D65.src/M000049.html +22 -0
- data/doc/classes/D65.src/M000050.html +68 -0
- data/doc/classes/DumpUtilities.html +152 -0
- data/doc/classes/DumpUtilities.src/M000077.html +33 -0
- data/doc/classes/DumpUtilities.src/M000078.html +27 -0
- data/doc/classes/FileCache.html +210 -0
- data/doc/classes/FileCache.src/M000135.html +18 -0
- data/doc/classes/FileCache.src/M000136.html +20 -0
- data/doc/classes/FileCache.src/M000137.html +22 -0
- data/doc/classes/FileCache.src/M000138.html +32 -0
- data/doc/classes/FileCacheItem.html +152 -0
- data/doc/classes/FileCacheItem.src/M000165.html +18 -0
- data/doc/classes/FileCacheItem.src/M000166.html +18 -0
- data/doc/classes/FileContainer.html +146 -0
- data/doc/classes/FileContainer.src/M000232.html +26 -0
- data/doc/classes/FileSystem.html +252 -0
- data/doc/classes/FileSystem.src/M000069.html +18 -0
- data/doc/classes/FileSystem.src/M000070.html +18 -0
- data/doc/classes/FileSystem.src/M000071.html +18 -0
- data/doc/classes/FileSystem.src/M000072.html +18 -0
- data/doc/classes/FileSystem.src/M000073.html +18 -0
- data/doc/classes/FileSystem.src/M000074.html +18 -0
- data/doc/classes/FileSystem.src/M000075.html +20 -0
- data/doc/classes/FileSystem.src/M000076.html +25 -0
- data/doc/classes/FileSystemImage.html +430 -0
- data/doc/classes/FileSystemImage.src/M000215.html +19 -0
- data/doc/classes/FileSystemImage.src/M000216.html +41 -0
- data/doc/classes/FileSystemImage.src/M000217.html +27 -0
- data/doc/classes/FileSystemImage.src/M000218.html +18 -0
- data/doc/classes/FileSystemImage.src/M000219.html +18 -0
- data/doc/classes/FileSystemImage.src/M000220.html +18 -0
- data/doc/classes/FileSystemImage.src/M000221.html +22 -0
- data/doc/classes/FileSystemImage.src/M000222.html +19 -0
- data/doc/classes/FileSystemImage.src/M000223.html +18 -0
- data/doc/classes/FileSystemImage.src/M000224.html +18 -0
- data/doc/classes/FileSystemImage.src/M000225.html +18 -0
- data/doc/classes/FileSystemImage.src/M000226.html +18 -0
- data/doc/classes/FileSystemImage.src/M000227.html +20 -0
- data/doc/classes/FileSystemImage.src/M000228.html +22 -0
- data/doc/classes/FileSystemImage.src/M000229.html +22 -0
- data/doc/classes/FileSystemImage.src/M000230.html +18 -0
- data/doc/classes/FileSystemImage.src/M000231.html +23 -0
- data/doc/classes/G64.html +257 -0
- data/doc/classes/G64.src/M000093.html +30 -0
- data/doc/classes/G64.src/M000094.html +18 -0
- data/doc/classes/G64.src/M000095.html +18 -0
- data/doc/classes/G64.src/M000096.html +17 -0
- data/doc/classes/G64.src/M000097.html +18 -0
- data/doc/classes/G64.src/M000098.html +18 -0
- data/doc/classes/G64.src/M000099.html +21 -0
- data/doc/classes/GenericFile.html +157 -0
- data/doc/classes/GenericFile.src/M000167.html +20 -0
- data/doc/classes/GenericFile.src/M000168.html +18 -0
- data/doc/classes/HostSystem.html +225 -0
- data/doc/classes/HostSystem.src/M000025.html +22 -0
- data/doc/classes/HostSystem.src/M000026.html +18 -0
- data/doc/classes/HostSystem.src/M000027.html +18 -0
- data/doc/classes/HostSystem.src/M000028.html +22 -0
- data/doc/classes/HostSystem.src/M000029.html +33 -0
- data/doc/classes/HostSystem.src/M000030.html +18 -0
- data/doc/classes/ImageFormat.html +415 -0
- data/doc/classes/ImageFormat.src/M000144.html +18 -0
- data/doc/classes/ImageFormat.src/M000145.html +18 -0
- data/doc/classes/ImageFormat.src/M000146.html +18 -0
- data/doc/classes/ImageFormat.src/M000147.html +18 -0
- data/doc/classes/ImageFormat.src/M000148.html +18 -0
- data/doc/classes/ImageFormat.src/M000149.html +22 -0
- data/doc/classes/ImageFormat.src/M000150.html +19 -0
- data/doc/classes/ImageFormat.src/M000151.html +18 -0
- data/doc/classes/ImageFormat.src/M000152.html +18 -0
- data/doc/classes/ImageFormat.src/M000153.html +18 -0
- data/doc/classes/ImageFormat.src/M000154.html +18 -0
- data/doc/classes/ImageFormat.src/M000155.html +18 -0
- data/doc/classes/ImageFormat.src/M000156.html +18 -0
- data/doc/classes/ImageFormat.src/M000157.html +18 -0
- data/doc/classes/ImageFormat.src/M000158.html +20 -0
- data/doc/classes/ImageFormat.src/M000159.html +26 -0
- data/doc/classes/ImageFormat.src/M000160.html +18 -0
- data/doc/classes/ImageSniffing.html +152 -0
- data/doc/classes/ImageSniffing.src/M000051.html +57 -0
- data/doc/classes/ImageSniffing.src/M000052.html +131 -0
- data/doc/classes/IntegerBASIC.html +247 -0
- data/doc/classes/IntegerBASIC.src/M000206.html +20 -0
- data/doc/classes/IntegerBASIC.src/M000207.html +86 -0
- data/doc/classes/MBasic.html +182 -0
- data/doc/classes/MBasic.src/M000011.html +20 -0
- data/doc/classes/MBasic.src/M000012.html +22 -0
- data/doc/classes/NADOLDos.html +187 -0
- data/doc/classes/NADOLDos.src/M000180.html +18 -0
- data/doc/classes/NADOLDos.src/M000181.html +52 -0
- data/doc/classes/NADOLFile.html +157 -0
- data/doc/classes/NADOLFile.src/M000045.html +20 -0
- data/doc/classes/NADOLFile.src/M000046.html +18 -0
- data/doc/classes/NADOLTokens.html +170 -0
- data/doc/classes/NADOLTokens.src/M000018.html +41 -0
- data/doc/classes/NativeFileType.html +444 -0
- data/doc/classes/NativeFileType.src/M000110.html +22 -0
- data/doc/classes/NativeFileType.src/M000111.html +18 -0
- data/doc/classes/NativeFileType.src/M000112.html +18 -0
- data/doc/classes/NativeFileType.src/M000113.html +18 -0
- data/doc/classes/NativeFileType.src/M000114.html +18 -0
- data/doc/classes/NativeFileType.src/M000115.html +18 -0
- data/doc/classes/NativeFileType.src/M000116.html +18 -0
- data/doc/classes/NativeFileType.src/M000117.html +23 -0
- data/doc/classes/NativeFileType.src/M000118.html +18 -0
- data/doc/classes/NativeFileType.src/M000119.html +18 -0
- data/doc/classes/NativeFileType.src/M000120.html +24 -0
- data/doc/classes/NativeFileType.src/M000121.html +35 -0
- data/doc/classes/NativeFileType.src/M000122.html +24 -0
- data/doc/classes/NativeFileType.src/M000123.html +18 -0
- data/doc/classes/NativeFileType.src/M000124.html +18 -0
- data/doc/classes/NativeFileType.src/M000125.html +18 -0
- data/doc/classes/NativeFileType.src/M000126.html +20 -0
- data/doc/classes/NativeFileType.src/M000127.html +27 -0
- data/doc/classes/PNG/Canvas.html +273 -0
- data/doc/classes/PNG/Canvas.src/M000196.html +20 -0
- data/doc/classes/PNG/Canvas.src/M000197.html +20 -0
- data/doc/classes/PNG/Canvas.src/M000198.html +20 -0
- data/doc/classes/PNG/Canvas.src/M000199.html +22 -0
- data/doc/classes/PNG/Canvas.src/M000200.html +18 -0
- data/doc/classes/PNG/Canvas.src/M000201.html +73 -0
- data/doc/classes/PNG/Color.html +338 -0
- data/doc/classes/PNG/Color.src/M000189.html +18 -0
- data/doc/classes/PNG/Color.src/M000190.html +16 -0
- data/doc/classes/PNG/Color.src/M000191.html +16 -0
- data/doc/classes/PNG/Color.src/M000192.html +16 -0
- data/doc/classes/PNG/Color.src/M000193.html +16 -0
- data/doc/classes/PNG/Color.src/M000194.html +21 -0
- data/doc/classes/PNG/Color.src/M000195.html +18 -0
- data/doc/classes/PNG.html +229 -0
- data/doc/classes/PNG.src/M000185.html +18 -0
- data/doc/classes/PNG.src/M000186.html +21 -0
- data/doc/classes/PNG.src/M000187.html +26 -0
- data/doc/classes/PNG.src/M000188.html +26 -0
- data/doc/classes/PascalDos.html +203 -0
- data/doc/classes/PascalDos.src/M000132.html +18 -0
- data/doc/classes/PascalDos.src/M000133.html +21 -0
- data/doc/classes/PascalDos.src/M000134.html +62 -0
- data/doc/classes/PascalFile.html +169 -0
- data/doc/classes/PascalFile.src/M000173.html +20 -0
- data/doc/classes/PascalFile.src/M000174.html +18 -0
- data/doc/classes/ProDos.html +164 -0
- data/doc/classes/ProDos.src/M000102.html +18 -0
- data/doc/classes/ProDos.src/M000103.html +22 -0
- data/doc/classes/ProDosFile.html +187 -0
- data/doc/classes/ProDosFile.src/M000015.html +20 -0
- data/doc/classes/ProDosFile.src/M000016.html +18 -0
- data/doc/classes/ProDosFile.src/M000017.html +19 -0
- data/doc/classes/Proc.html +315 -0
- data/doc/classes/Proc.src/M000053.html +21 -0
- data/doc/classes/Proc.src/M000054.html +19 -0
- data/doc/classes/Proc.src/M000055.html +22 -0
- data/doc/classes/Proc.src/M000056.html +22 -0
- data/doc/classes/Proc.src/M000057.html +22 -0
- data/doc/classes/Proc.src/M000058.html +19 -0
- data/doc/classes/Proc.src/M000059.html +16 -0
- data/doc/classes/Proc.src/M000060.html +20 -0
- data/doc/classes/Proc.src/M000061.html +18 -0
- data/doc/classes/Proc.src/M000062.html +16 -0
- data/doc/classes/Proc.src/M000063.html +16 -0
- data/doc/classes/ProcSource.html +146 -0
- data/doc/classes/ProcSource.src/M000248.html +38 -0
- data/doc/classes/ProcSource.src/M000249.html +109 -0
- data/doc/classes/RDoc.html +135 -0
- data/doc/classes/RDoc.src/M000247.html +40 -0
- data/doc/classes/RawDisk.html +157 -0
- data/doc/classes/RawDisk.src/M000100.html +18 -0
- data/doc/classes/RawDisk.src/M000101.html +18 -0
- data/doc/classes/RipXplore.html +124 -0
- data/doc/classes/RipXploreLog.html +167 -0
- data/doc/classes/RipXploreLog.src/M000139.html +18 -0
- data/doc/classes/RipXploreLog.src/M000140.html +20 -0
- data/doc/classes/RipXploreLog.src/M000141.html +18 -0
- data/doc/classes/ScAsm.html +145 -0
- data/doc/classes/ScAsm.src/M000004.html +45 -0
- data/doc/classes/SubclassTracking.html +138 -0
- data/doc/classes/SubclassTracking.src/M000250.html +23 -0
- data/doc/classes/TestFileCache.html +137 -0
- data/doc/classes/TestFileCache.src/M000184.html +21 -0
- data/doc/classes/Trs80.html +157 -0
- data/doc/classes/Trs80.src/M000043.html +18 -0
- data/doc/classes/Trs80.src/M000044.html +18 -0
- data/doc/classes/Trs80Cmd.html +217 -0
- data/doc/classes/Trs80Cmd.src/M000104.html +19 -0
- data/doc/classes/Trs80Cmd.src/M000105.html +24 -0
- data/doc/classes/Trs80Cmd.src/M000106.html +20 -0
- data/doc/classes/Trs80Cmd.src/M000107.html +35 -0
- data/doc/classes/Trs80Jcl.html +156 -0
- data/doc/classes/Trs80Jcl.src/M000233.html +20 -0
- data/doc/classes/Trs80Jcl.src/M000234.html +18 -0
- data/doc/classes/Trs80Jv1Dsk.html +211 -0
- data/doc/classes/Trs80Jv1Dsk.src/M000064.html +18 -0
- data/doc/classes/Trs80Jv1Dsk.src/M000065.html +18 -0
- data/doc/classes/Trs80Jv1Dsk.src/M000066.html +18 -0
- data/doc/classes/Trs80Jv1Dsk.src/M000067.html +18 -0
- data/doc/classes/Trs80Jv1Dsk.src/M000068.html +19 -0
- data/doc/classes/Trs80LevelIIBasic.html +169 -0
- data/doc/classes/Trs80LevelIIBasic.src/M000079.html +20 -0
- data/doc/classes/Trs80LevelIIBasic.src/M000080.html +43 -0
- data/doc/classes/Trs80PascalSource.html +156 -0
- data/doc/classes/Trs80PascalSource.src/M000202.html +20 -0
- data/doc/classes/Trs80PascalSource.src/M000203.html +30 -0
- data/doc/classes/TrsDos.html +255 -0
- data/doc/classes/TrsDos.src/M000031.html +18 -0
- data/doc/classes/TrsDos.src/M000032.html +18 -0
- data/doc/classes/TrsDos.src/M000033.html +18 -0
- data/doc/classes/TrsDos.src/M000034.html +62 -0
- data/doc/created.rid +1 -0
- data/doc/files/bin/ripxplore_rb.html +150 -0
- data/doc/files/lib/DumpUtilities_rb.html +101 -0
- data/doc/files/lib/FileCache_rb.html +110 -0
- data/doc/files/lib/FileContainer_rb.html +101 -0
- data/doc/files/lib/FileSystemImage_rb.html +109 -0
- data/doc/files/lib/FileSystem_rb.html +111 -0
- data/doc/files/lib/HostSystem_rb.html +110 -0
- data/doc/files/lib/ImageFormat_rb.html +111 -0
- data/doc/files/lib/NativeFileType_rb.html +111 -0
- data/doc/files/lib/PatchedPNG_rb.html +116 -0
- data/doc/files/lib/RipXploreLog_rb.html +108 -0
- data/doc/files/lib/RipXplore_rb.html +114 -0
- data/doc/files/lib/SubclassTracking_rb.html +108 -0
- data/doc/files/lib/disassemblers/D65_rb.html +101 -0
- data/doc/files/lib/file_systems/AppleCPM_rb.html +108 -0
- data/doc/files/lib/file_systems/AppleDos_rb.html +108 -0
- data/doc/files/lib/file_systems/AtariDos_rb.html +108 -0
- data/doc/files/lib/file_systems/CbmDos_rb.html +108 -0
- data/doc/files/lib/file_systems/NADOLDos_rb.html +108 -0
- data/doc/files/lib/file_systems/PascalDos_rb.html +108 -0
- data/doc/files/lib/file_systems/ProDos_rb.html +108 -0
- data/doc/files/lib/file_systems/RawDisk_rb.html +108 -0
- data/doc/files/lib/file_systems/TrsDos_rb.html +108 -0
- data/doc/files/lib/host_systems/Apple2_rb.html +109 -0
- data/doc/files/lib/host_systems/Atari800_rb.html +109 -0
- data/doc/files/lib/host_systems/C64_rb.html +109 -0
- data/doc/files/lib/host_systems/Trs80_rb.html +108 -0
- data/doc/files/lib/image_formats/A2Dsk_rb.html +108 -0
- data/doc/files/lib/image_formats/Atr_rb.html +108 -0
- data/doc/files/lib/image_formats/D64_rb.html +108 -0
- data/doc/files/lib/image_formats/G64_rb.html +108 -0
- data/doc/files/lib/image_formats/Trs80Jv1Dsk_rb.html +108 -0
- data/doc/files/lib/native_file_types/apple2/AppleBinary_rb.html +108 -0
- data/doc/files/lib/native_file_types/apple2/AppleHiResPic_rb.html +108 -0
- data/doc/files/lib/native_file_types/apple2/AppleText_rb.html +108 -0
- data/doc/files/lib/native_file_types/apple2/AppleWorksWP_rb.html +108 -0
- data/doc/files/lib/native_file_types/apple2/Applesoft_rb.html +108 -0
- data/doc/files/lib/native_file_types/apple2/IntegerBASIC_rb.html +108 -0
- data/doc/files/lib/native_file_types/apple2/NADOLFile_rb.html +108 -0
- data/doc/files/lib/native_file_types/apple2/PascalFile_rb.html +108 -0
- data/doc/files/lib/native_file_types/apple2/ProDosFile_rb.html +108 -0
- data/doc/files/lib/native_file_types/apple2/ScAsm_rb.html +101 -0
- data/doc/files/lib/native_file_types/atari800/AtariBasic_rb.html +108 -0
- data/doc/files/lib/native_file_types/atari800/AtariBinary_rb.html +108 -0
- data/doc/files/lib/native_file_types/atari800/AtariText_rb.html +108 -0
- data/doc/files/lib/native_file_types/c64/C64BasicPrg_rb.html +109 -0
- data/doc/files/lib/native_file_types/c64/C64PrgText_rb.html +109 -0
- data/doc/files/lib/native_file_types/c64/C64Prg_rb.html +109 -0
- data/doc/files/lib/native_file_types/c64/C64Seq_rb.html +109 -0
- data/doc/files/lib/native_file_types/c64/CbmFile_rb.html +108 -0
- data/doc/files/lib/native_file_types/cpm/CPMFile_rb.html +108 -0
- data/doc/files/lib/native_file_types/cpm/MBasic_rb.html +108 -0
- data/doc/files/lib/native_file_types/generic/GenericFile_rb.html +101 -0
- data/doc/files/lib/native_file_types/trs80/Trs80Cmd_rb.html +108 -0
- data/doc/files/lib/native_file_types/trs80/Trs80Jcl_rb.html +108 -0
- data/doc/files/lib/native_file_types/trs80/Trs80LevelIIBasic_rb.html +108 -0
- data/doc/files/lib/native_file_types/trs80/Trs80PascalSource_rb.html +108 -0
- data/doc/files/lib/proc_source_rb.html +182 -0
- data/doc/files/lib/proc_source_rb.src/M000001.html +24 -0
- data/doc/files/lib/rdoc_patch_rb.html +108 -0
- data/doc/files/test/tc_file_cache_rb.html +108 -0
- data/doc/files/test/tc_image_sniffing_rb.html +108 -0
- data/doc/files/test/testhelper_rb.html +129 -0
- data/doc/files/test/ts_test_all_rb.html +108 -0
- data/doc/fr_class_index.html +26 -0
- data/doc/fr_file_index.html +27 -0
- data/doc/fr_method_index.html +26 -0
- data/doc/index.html +24 -0
- data/doc/rdoc-style.css +208 -0
- data/lib/DumpUtilities.rb +34 -0
- data/lib/FileCache.rb +84 -0
- data/lib/FileContainer.rb +45 -0
- data/lib/FileSystem.rb +83 -0
- data/lib/FileSystemImage.rb +176 -0
- data/lib/HostSystem.rb +84 -0
- data/lib/ImageFormat.rb +127 -0
- data/lib/NativeFileType.rb +168 -0
- data/lib/PatchedPNG.rb +303 -0
- data/lib/RipXplore.rb +77 -0
- data/lib/RipXploreLog.rb +63 -0
- data/lib/SubclassTracking.rb +11 -0
- data/lib/disassemblers/D65.rb +181 -0
- data/lib/file_systems/AppleCPM.rb +123 -0
- data/lib/file_systems/AppleDos.rb +211 -0
- data/lib/file_systems/AtariDos.rb +80 -0
- data/lib/file_systems/CbmDos.rb +75 -0
- data/lib/file_systems/NADOLDos.rb +110 -0
- data/lib/file_systems/PascalDos.rb +131 -0
- data/lib/file_systems/ProDos.rb +155 -0
- data/lib/file_systems/RawDisk.rb +45 -0
- data/lib/file_systems/TrsDos.rb +148 -0
- data/lib/host_systems/Apple2.rb +57 -0
- data/lib/host_systems/Atari800.rb +57 -0
- data/lib/host_systems/C64.rb +82 -0
- data/lib/host_systems/Trs80.rb +48 -0
- data/lib/host_systems/a2_symbols.yaml +199 -0
- data/lib/host_systems/atari_800_symbols.yaml +496 -0
- data/lib/host_systems/c64_symbols.yaml +636 -0
- data/lib/image_formats/A2Dsk.rb +77 -0
- data/lib/image_formats/Atr.rb +83 -0
- data/lib/image_formats/D64.rb +87 -0
- data/lib/image_formats/G64.rb +174 -0
- data/lib/image_formats/Trs80Jv1Dsk.rb +65 -0
- data/lib/native_file_types/apple2/AppleBinary.rb +51 -0
- data/lib/native_file_types/apple2/AppleHiResPic.rb +166 -0
- data/lib/native_file_types/apple2/AppleText.rb +43 -0
- data/lib/native_file_types/apple2/AppleWorksWP.rb +68 -0
- data/lib/native_file_types/apple2/Applesoft.rb +115 -0
- data/lib/native_file_types/apple2/IntegerBASIC.rb +217 -0
- data/lib/native_file_types/apple2/NADOLFile.rb +205 -0
- data/lib/native_file_types/apple2/PascalFile.rb +48 -0
- data/lib/native_file_types/apple2/ProDosFile.rb +112 -0
- data/lib/native_file_types/apple2/ScAsm.rb +110 -0
- data/lib/native_file_types/atari800/AtariBasic.rb +396 -0
- data/lib/native_file_types/atari800/AtariBinary.rb +53 -0
- data/lib/native_file_types/atari800/AtariText.rb +49 -0
- data/lib/native_file_types/c64/C64BasicPrg.rb +333 -0
- data/lib/native_file_types/c64/C64Prg.rb +57 -0
- data/lib/native_file_types/c64/C64PrgText.rb +45 -0
- data/lib/native_file_types/c64/C64Seq.rb +47 -0
- data/lib/native_file_types/c64/CbmFile.rb +41 -0
- data/lib/native_file_types/cpm/CPMFile.rb +40 -0
- data/lib/native_file_types/cpm/MBasic.rb +311 -0
- data/lib/native_file_types/generic/GenericFile.rb +43 -0
- data/lib/native_file_types/trs80/Trs80Cmd.rb +130 -0
- data/lib/native_file_types/trs80/Trs80Jcl.rb +43 -0
- data/lib/native_file_types/trs80/Trs80LevelIIBasic.rb +201 -0
- data/lib/native_file_types/trs80/Trs80PascalSource.rb +58 -0
- data/lib/proc_source.rb +238 -0
- data/lib/rdoc_patch.rb +32 -0
- data/test/tc_file_cache.rb +11 -0
- data/test/tc_image_sniffing.rb +165 -0
- data/test/testhelper.rb +14 -0
- data/test/testlog.txt +30755 -0
- data/test/ts_test_all.rb +3 -0
- metadata +601 -0
data/lib/HostSystem.rb
ADDED
|
@@ -0,0 +1,84 @@
|
|
|
1
|
+
$:.unshift(File.dirname(__FILE__)) unless
|
|
2
|
+
$:.include?(File.dirname(__FILE__)) || $:.include?(File.expand_path(File.dirname(__FILE__)))
|
|
3
|
+
require 'open-uri'
|
|
4
|
+
require 'RipXploreLog'
|
|
5
|
+
require 'SubclassTracking'
|
|
6
|
+
|
|
7
|
+
class HostSystem
|
|
8
|
+
def HostSystem.possible_file_systems
|
|
9
|
+
results=[]
|
|
10
|
+
FileSystem.all_file_systems.each do |candidate|
|
|
11
|
+
results<<candidate if self==candidate.host_system
|
|
12
|
+
end
|
|
13
|
+
results
|
|
14
|
+
end
|
|
15
|
+
|
|
16
|
+
def HostSystem.all_host_systems
|
|
17
|
+
HostSystem.subclasses
|
|
18
|
+
end
|
|
19
|
+
|
|
20
|
+
#each subclass should override to_ascii with a function that converts a character in the native format to an ASCII equivalent
|
|
21
|
+
def HostSystem.to_ascii(byte)
|
|
22
|
+
byte.chr
|
|
23
|
+
end
|
|
24
|
+
|
|
25
|
+
def HostSystem.s_to_ascii(s)
|
|
26
|
+
r=""
|
|
27
|
+
s.each_byte do |b|
|
|
28
|
+
r+=to_ascii(b)
|
|
29
|
+
end
|
|
30
|
+
r
|
|
31
|
+
end
|
|
32
|
+
|
|
33
|
+
#given a buffer (e.g a sector or a file), produce a formatted hex dump which includes chars converted to ASCII
|
|
34
|
+
def HostSystem.hex_dump(buffer)
|
|
35
|
+
s=""
|
|
36
|
+
(0..(buffer.length/16)).each {|line_number|
|
|
37
|
+
lhs=""
|
|
38
|
+
rhs=""
|
|
39
|
+
start_byte=line_number*16
|
|
40
|
+
line=buffer[start_byte,16]
|
|
41
|
+
if line.length>0 then
|
|
42
|
+
line.each_byte {|byte|
|
|
43
|
+
lhs+= sprintf("%02X ", byte)
|
|
44
|
+
rhs+= to_ascii(byte).sub(/[\x00-\x1f]/,'.')
|
|
45
|
+
}
|
|
46
|
+
lhs+=" "*(16-line.length)*3
|
|
47
|
+
s+=sprintf("%02X\t%s %s\n",start_byte,lhs,rhs)
|
|
48
|
+
end
|
|
49
|
+
}
|
|
50
|
+
s
|
|
51
|
+
end
|
|
52
|
+
|
|
53
|
+
#does counting of tracks start at track 0 (e.g. Apple 2) or track 1 (e.g. C64)?
|
|
54
|
+
def HostSystem.start_track
|
|
55
|
+
0
|
|
56
|
+
end
|
|
57
|
+
end
|
|
58
|
+
|
|
59
|
+
HostSystem.extend SubclassTracking
|
|
60
|
+
|
|
61
|
+
# == Author
|
|
62
|
+
# Jonno Downes (jonno@jamtronix.com)
|
|
63
|
+
#
|
|
64
|
+
# == Copyright
|
|
65
|
+
# Copyright (c) 2008 Jonno Downes (jonno@jamtronix.com)
|
|
66
|
+
#
|
|
67
|
+
#Permission is hereby granted, free of charge, to any person obtaining
|
|
68
|
+
#a copy of this software and associated documentation files (the
|
|
69
|
+
#"Software"), to deal in the Software without restriction, including
|
|
70
|
+
#without limitation the rights to use, copy, modify, merge, publish,
|
|
71
|
+
#distribute, sublicense, and/or sell copies of the Software, and to
|
|
72
|
+
#permit persons to whom the Software is furnished to do so, subject to
|
|
73
|
+
#the following conditions:
|
|
74
|
+
|
|
75
|
+
# The above copyright notice and this permission notice shall be
|
|
76
|
+
# included in all copies or substantial portions of the Software.
|
|
77
|
+
|
|
78
|
+
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
|
79
|
+
# EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
|
80
|
+
# MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
|
81
|
+
# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
|
82
|
+
# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
|
83
|
+
# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
|
84
|
+
# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
data/lib/ImageFormat.rb
ADDED
|
@@ -0,0 +1,127 @@
|
|
|
1
|
+
$:.unshift(File.dirname(__FILE__)) unless
|
|
2
|
+
$:.include?(File.dirname(__FILE__)) || $:.include?(File.expand_path(File.dirname(__FILE__)))
|
|
3
|
+
require 'open-uri'
|
|
4
|
+
require 'RipXploreLog'
|
|
5
|
+
require 'SubclassTracking'
|
|
6
|
+
require 'proc_source'
|
|
7
|
+
class ImageFormat
|
|
8
|
+
|
|
9
|
+
def self.possible_extensions
|
|
10
|
+
[]
|
|
11
|
+
end
|
|
12
|
+
|
|
13
|
+
def to_s
|
|
14
|
+
self.class.name
|
|
15
|
+
end
|
|
16
|
+
def self.host_system
|
|
17
|
+
nil
|
|
18
|
+
end
|
|
19
|
+
|
|
20
|
+
def host_system
|
|
21
|
+
self.class.host_system
|
|
22
|
+
end
|
|
23
|
+
def self.all_image_formats
|
|
24
|
+
ImageFormat.subclasses
|
|
25
|
+
end
|
|
26
|
+
|
|
27
|
+
def self.possible_file_systems
|
|
28
|
+
results=[]
|
|
29
|
+
FileSystem.all_file_systems.each do |candidate|
|
|
30
|
+
results<<candidate if (host_system==candidate.host_system) || (candidate.host_system==HostSystem)
|
|
31
|
+
end
|
|
32
|
+
results
|
|
33
|
+
end
|
|
34
|
+
|
|
35
|
+
@@all_possible_extensions=nil
|
|
36
|
+
def self.all_possible_extensions
|
|
37
|
+
@@all_possible_extensions= ImageFormat.all_image_formats.collect{|format| format.possible_extensions}.flatten.uniq.collect{|ext| ext.downcase} if @@all_possible_extensions.nil?
|
|
38
|
+
@@all_possible_extensions
|
|
39
|
+
end
|
|
40
|
+
|
|
41
|
+
#return an array containing a list of numbers of valid tracks on this image
|
|
42
|
+
def track_list
|
|
43
|
+
(start_track..end_track).collect
|
|
44
|
+
end
|
|
45
|
+
|
|
46
|
+
#for a given byte stream, how many tracks could be interpreted by this image format?
|
|
47
|
+
def track_count
|
|
48
|
+
0
|
|
49
|
+
end
|
|
50
|
+
|
|
51
|
+
#given a track number, a sector number, and an array of bytes, return an array of bytes representing the contents of that track/sector, or nil if specified track/sector not available
|
|
52
|
+
#needs to be overriden in each ImageFormat
|
|
53
|
+
def get_sector(track,sector)
|
|
54
|
+
nil
|
|
55
|
+
end
|
|
56
|
+
|
|
57
|
+
#given a track number, how many sectors should be in this track for this ImageFormat?
|
|
58
|
+
def sectors_in_track(track)
|
|
59
|
+
[0]
|
|
60
|
+
end
|
|
61
|
+
|
|
62
|
+
|
|
63
|
+
#is the first track called track 0 or track 1?
|
|
64
|
+
def start_track
|
|
65
|
+
host_system.respond_to?(:start_track) ? host_system.start_track : 0
|
|
66
|
+
end
|
|
67
|
+
#what track does counting end at?
|
|
68
|
+
def end_track
|
|
69
|
+
track_count-1+start_track
|
|
70
|
+
end
|
|
71
|
+
|
|
72
|
+
@@code_for_tests={}
|
|
73
|
+
def self.code_for_tests
|
|
74
|
+
@@code_for_tests[self] || []
|
|
75
|
+
end
|
|
76
|
+
|
|
77
|
+
def self.is_valid_image_if(code_for_test)
|
|
78
|
+
RipXploreLog.debug "adding test for #{self}: #{code_for_test.source}"
|
|
79
|
+
@@code_for_tests[self] ||=[]
|
|
80
|
+
@@code_for_tests[self]<<code_for_test.source
|
|
81
|
+
end
|
|
82
|
+
|
|
83
|
+
def compatability_score(file_system_image)
|
|
84
|
+
final_score=1
|
|
85
|
+
self.class.code_for_tests.each do |code_for_test|
|
|
86
|
+
RipXploreLog.debug "test for #{file_system_image.filename}#{self} : #{code_for_test} "
|
|
87
|
+
result = eval code_for_test,binding
|
|
88
|
+
RipXploreLog.debug "result : #{result}"
|
|
89
|
+
final_score+=1
|
|
90
|
+
return 0 unless (result)
|
|
91
|
+
end
|
|
92
|
+
return final_score
|
|
93
|
+
end
|
|
94
|
+
|
|
95
|
+
|
|
96
|
+
attr_accessor :file_bytes
|
|
97
|
+
def initialize(file_bytes)
|
|
98
|
+
@file_bytes=file_bytes
|
|
99
|
+
end
|
|
100
|
+
end
|
|
101
|
+
|
|
102
|
+
ImageFormat.extend SubclassTracking
|
|
103
|
+
|
|
104
|
+
# == Author
|
|
105
|
+
# Jonno Downes (jonno@jamtronix.com)
|
|
106
|
+
#
|
|
107
|
+
# == Copyright
|
|
108
|
+
# Copyright (c) 2008 Jonno Downes (jonno@jamtronix.com)
|
|
109
|
+
#
|
|
110
|
+
#Permission is hereby granted, free of charge, to any person obtaining
|
|
111
|
+
#a copy of this software and associated documentation files (the
|
|
112
|
+
#"Software"), to deal in the Software without restriction, including
|
|
113
|
+
#without limitation the rights to use, copy, modify, merge, publish,
|
|
114
|
+
#distribute, sublicense, and/or sell copies of the Software, and to
|
|
115
|
+
#permit persons to whom the Software is furnished to do so, subject to
|
|
116
|
+
#the following conditions:
|
|
117
|
+
|
|
118
|
+
# The above copyright notice and this permission notice shall be
|
|
119
|
+
# included in all copies or substantial portions of the Software.
|
|
120
|
+
|
|
121
|
+
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
|
122
|
+
# EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
|
123
|
+
# MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
|
124
|
+
# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
|
125
|
+
# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
|
126
|
+
# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
|
127
|
+
# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
|
@@ -0,0 +1,168 @@
|
|
|
1
|
+
$:.unshift(File.dirname(__FILE__)) unless
|
|
2
|
+
$:.include?(File.dirname(__FILE__)) || $:.include?(File.expand_path(File.dirname(__FILE__)))
|
|
3
|
+
require 'open-uri'
|
|
4
|
+
require 'RipXploreLog'
|
|
5
|
+
require 'SubclassTracking'
|
|
6
|
+
require 'proc_source'
|
|
7
|
+
|
|
8
|
+
class NativeFileType
|
|
9
|
+
attr_accessor(:file_system_image,:filename,:contents,:file_type,:aux_code)
|
|
10
|
+
def initialize(file_system_image,filename,contents,file_type,aux_code)
|
|
11
|
+
@file_system_image=file_system_image
|
|
12
|
+
@filename=filename
|
|
13
|
+
@contents=contents
|
|
14
|
+
@file_type=file_type
|
|
15
|
+
@aux_code=aux_code
|
|
16
|
+
end
|
|
17
|
+
|
|
18
|
+
def NativeFileType.matching_score
|
|
19
|
+
ancestors.length
|
|
20
|
+
end
|
|
21
|
+
|
|
22
|
+
def NativeFileType.non_matching_score
|
|
23
|
+
0
|
|
24
|
+
end
|
|
25
|
+
|
|
26
|
+
|
|
27
|
+
def NativeFileType.all_native_file_types
|
|
28
|
+
NativeFileType.subclasses
|
|
29
|
+
end
|
|
30
|
+
|
|
31
|
+
#how should this file be described in a catalog list?
|
|
32
|
+
def type_description
|
|
33
|
+
self.class
|
|
34
|
+
end
|
|
35
|
+
|
|
36
|
+
def load_address
|
|
37
|
+
self.class.load_address(contents)
|
|
38
|
+
end
|
|
39
|
+
|
|
40
|
+
def NativeFileType.load_address(filebytes)
|
|
41
|
+
0
|
|
42
|
+
end
|
|
43
|
+
|
|
44
|
+
def <=>(o)
|
|
45
|
+
return -1 unless o.respond_to?(:filename)
|
|
46
|
+
if filename==o.filename then
|
|
47
|
+
return self.to_s<=>o.to_s
|
|
48
|
+
else
|
|
49
|
+
return (filename<=>o.filename)
|
|
50
|
+
end
|
|
51
|
+
end
|
|
52
|
+
|
|
53
|
+
def to_hex_dump
|
|
54
|
+
file_system_image.file_system.host_system.hex_dump(contents)
|
|
55
|
+
end
|
|
56
|
+
#some filesystems differentiate between full and partial filenames.
|
|
57
|
+
#e.g. in ProDOS the 'full' filename includes the full path
|
|
58
|
+
#by default, full_filename is the same as filename, but can be overridden
|
|
59
|
+
#for those filesystems that need this
|
|
60
|
+
def full_filename
|
|
61
|
+
@filename
|
|
62
|
+
end
|
|
63
|
+
|
|
64
|
+
def ==(other_object)
|
|
65
|
+
if !other_object.kind_of? NativeFileType then
|
|
66
|
+
return false
|
|
67
|
+
end
|
|
68
|
+
if self.filename!=other_object.filename then
|
|
69
|
+
return false
|
|
70
|
+
end
|
|
71
|
+
return self.to_s==other_object.to_s
|
|
72
|
+
end
|
|
73
|
+
|
|
74
|
+
|
|
75
|
+
#given metadata and contents of a file from a file system image, return an instance of the NativeFileType subclass that is the closest match
|
|
76
|
+
def NativeFileType.best_fit(file_system_image,filename,contents,file_type=nil,aux_code=nil)
|
|
77
|
+
candidates={}
|
|
78
|
+
NativeFileType.all_native_file_types.each do |native_file_type|
|
|
79
|
+
if !native_file_type.file_system_file_types.keys.include?(file_system_image.file_system) then
|
|
80
|
+
RipXploreLog.debug("skipping #{native_file_type} - can't reside on #{file_system_image.file_system}")
|
|
81
|
+
else
|
|
82
|
+
RipXploreLog.debug("checking native file type #{native_file_type}")
|
|
83
|
+
candidate_score=native_file_type.compatability_score(file_system_image,filename,contents,file_type,aux_code)
|
|
84
|
+
RipXploreLog.debug("score - #{candidate_score}")
|
|
85
|
+
candidates[native_file_type]=candidate_score
|
|
86
|
+
end
|
|
87
|
+
end
|
|
88
|
+
if candidates.length==0 then
|
|
89
|
+
RipXploreLog.debug( 'no valid combination of file system and native file types found')
|
|
90
|
+
return nil
|
|
91
|
+
end
|
|
92
|
+
best_candidate=candidates.keys.sort{|a,b| candidates[b]<=>candidates[a]}[0]
|
|
93
|
+
RipXploreLog.debug("best candidate for #{filename} = #{best_candidate} score: #{candidates[best_candidate]}")
|
|
94
|
+
best_candidate.new(file_system_image,filename,contents,file_type,aux_code)
|
|
95
|
+
end
|
|
96
|
+
|
|
97
|
+
|
|
98
|
+
def NativeFileType.file_type_matches?(file_system_image,file_type)
|
|
99
|
+
result=false
|
|
100
|
+
[file_system_file_types[file_system_image.file_system]].flatten.each do |target_file_type|
|
|
101
|
+
result=true if target_file_type==:any
|
|
102
|
+
result=true if(file_type.to_s==target_file_type.to_s)
|
|
103
|
+
RipXploreLog.debug "test for #{file_type} == #{target_file_type} : #{result}"
|
|
104
|
+
end
|
|
105
|
+
result
|
|
106
|
+
end
|
|
107
|
+
|
|
108
|
+
#how many bytes should be skipped to get to the file data?
|
|
109
|
+
def header_length
|
|
110
|
+
0
|
|
111
|
+
end
|
|
112
|
+
|
|
113
|
+
def data_without_header
|
|
114
|
+
@contents[header_length,@contents.length-header_length]
|
|
115
|
+
end
|
|
116
|
+
|
|
117
|
+
@@code_for_tests={}
|
|
118
|
+
def self.code_for_tests
|
|
119
|
+
@@code_for_tests[self] || []
|
|
120
|
+
end
|
|
121
|
+
|
|
122
|
+
def self.is_valid_file_if(code_for_test)
|
|
123
|
+
#puts "adding test for #{self}: #{code_for_test.source}"
|
|
124
|
+
@@code_for_tests[self] ||=[]
|
|
125
|
+
@@code_for_tests[self]<<code_for_test.source
|
|
126
|
+
end
|
|
127
|
+
|
|
128
|
+
def self.compatability_score(file_system_image,filename,contents,file_type,aux_code)
|
|
129
|
+
return non_matching_score unless (file_type_matches?(file_system_image,file_type))
|
|
130
|
+
load_address=self.load_address(contents)
|
|
131
|
+
passed_tests=0
|
|
132
|
+
code_for_tests.each do |code_for_test|
|
|
133
|
+
result = eval code_for_test,binding
|
|
134
|
+
RipXploreLog.debug "test for #{self} : #{code_for_test} : #{result}"
|
|
135
|
+
return non_matching_score unless (result)
|
|
136
|
+
passed_tests+=1
|
|
137
|
+
end
|
|
138
|
+
return matching_score+passed_tests
|
|
139
|
+
end
|
|
140
|
+
|
|
141
|
+
end
|
|
142
|
+
|
|
143
|
+
NativeFileType.extend SubclassTracking
|
|
144
|
+
|
|
145
|
+
# == Author
|
|
146
|
+
# Jonno Downes (jonno@jamtronix.com)
|
|
147
|
+
#
|
|
148
|
+
# == Copyright
|
|
149
|
+
# Copyright (c) 2008 Jonno Downes (jonno@jamtronix.com)
|
|
150
|
+
#
|
|
151
|
+
#Permission is hereby granted, free of charge, to any person obtaining
|
|
152
|
+
#a copy of this software and associated documentation files (the
|
|
153
|
+
#"Software"), to deal in the Software without restriction, including
|
|
154
|
+
#without limitation the rights to use, copy, modify, merge, publish,
|
|
155
|
+
#distribute, sublicense, and/or sell copies of the Software, and to
|
|
156
|
+
#permit persons to whom the Software is furnished to do so, subject to
|
|
157
|
+
#the following conditions:
|
|
158
|
+
|
|
159
|
+
# The above copyright notice and this permission notice shall be
|
|
160
|
+
# included in all copies or substantial portions of the Software.
|
|
161
|
+
|
|
162
|
+
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
|
163
|
+
# EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
|
164
|
+
# MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
|
165
|
+
# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
|
166
|
+
# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
|
167
|
+
# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
|
168
|
+
# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
data/lib/PatchedPNG.rb
ADDED
|
@@ -0,0 +1,303 @@
|
|
|
1
|
+
#code ripped from the Pure Ruby PNG library by Ryan Davis. (http://blog.zenspider.com/)
|
|
2
|
+
|
|
3
|
+
require 'zlib'
|
|
4
|
+
|
|
5
|
+
|
|
6
|
+
class String # :nodoc:
|
|
7
|
+
|
|
8
|
+
##
|
|
9
|
+
# Calculates a CRC using the algorithm in the PNG specification.
|
|
10
|
+
|
|
11
|
+
def png_crc
|
|
12
|
+
unless defined? @@crc then
|
|
13
|
+
@@crc = Array.new(256)
|
|
14
|
+
256.times do |n|
|
|
15
|
+
c = n
|
|
16
|
+
8.times do
|
|
17
|
+
c = (c & 1 == 1) ? 0xedb88320 ^ (c >> 1) : c >> 1
|
|
18
|
+
end
|
|
19
|
+
@@crc[n] = c
|
|
20
|
+
end
|
|
21
|
+
end
|
|
22
|
+
|
|
23
|
+
c = 0xffffffff
|
|
24
|
+
each_byte do |b|
|
|
25
|
+
c = @@crc[(c^b) & 0xff] ^ (c >> 8)
|
|
26
|
+
end
|
|
27
|
+
return c ^ 0xffffffff
|
|
28
|
+
end
|
|
29
|
+
|
|
30
|
+
end
|
|
31
|
+
|
|
32
|
+
##
|
|
33
|
+
# A pure Ruby Portable Network Graphics (PNG) writer.
|
|
34
|
+
#
|
|
35
|
+
# http://www.libpng.org/pub/png/spec/1.2/
|
|
36
|
+
#
|
|
37
|
+
# PNG supports:
|
|
38
|
+
# + 8 bit truecolor PNGs
|
|
39
|
+
#
|
|
40
|
+
# PNG does not support:
|
|
41
|
+
# + any other color depth
|
|
42
|
+
# + extra data chunks
|
|
43
|
+
# + filters
|
|
44
|
+
#
|
|
45
|
+
# = Example
|
|
46
|
+
#
|
|
47
|
+
# require 'png'
|
|
48
|
+
#
|
|
49
|
+
# canvas = PNG::Canvas.new 200, 200
|
|
50
|
+
# canvas[100, 100] = PNG::Color::Black
|
|
51
|
+
# canvas.line 50, 50, 100, 50, PNG::Color::Blue
|
|
52
|
+
# png = PNG.new canvas
|
|
53
|
+
# png.save 'blah.png'
|
|
54
|
+
|
|
55
|
+
class PNG
|
|
56
|
+
|
|
57
|
+
##
|
|
58
|
+
# Creates a PNG chunk of type +type+ that contains +data+.
|
|
59
|
+
|
|
60
|
+
def self.chunk(type, data="")
|
|
61
|
+
[data.size, type, data, (type + data).png_crc].pack("Na*a*N")
|
|
62
|
+
end
|
|
63
|
+
|
|
64
|
+
##
|
|
65
|
+
# Creates a new PNG object using +canvas+
|
|
66
|
+
|
|
67
|
+
def initialize(canvas)
|
|
68
|
+
@height = canvas.height
|
|
69
|
+
@width = canvas.width
|
|
70
|
+
@bits = 8
|
|
71
|
+
@data = canvas.data
|
|
72
|
+
end
|
|
73
|
+
|
|
74
|
+
##
|
|
75
|
+
# Writes the PNG to +path+.
|
|
76
|
+
|
|
77
|
+
def save(path)
|
|
78
|
+
File.open(path, "w") do |f|
|
|
79
|
+
f.write [137, 80, 78, 71, 13, 10, 26, 10].pack("C*") # PNG signature
|
|
80
|
+
f.write PNG.chunk('IHDR',
|
|
81
|
+
[ @height, @width, @bits, 6, 0, 0, 0 ].pack("N2C5"))
|
|
82
|
+
# 0 == filter type code "none"
|
|
83
|
+
data = @data.map { |row| [0] + row.map { |p| p.values } }.flatten
|
|
84
|
+
f.write PNG.chunk('IDAT', Zlib::Deflate.deflate(data.pack("C*"), 9))
|
|
85
|
+
f.write PNG.chunk('IEND', '')
|
|
86
|
+
end
|
|
87
|
+
end
|
|
88
|
+
|
|
89
|
+
def raw_bytes
|
|
90
|
+
bytes=""
|
|
91
|
+
bytes<< [137, 80, 78, 71, 13, 10, 26, 10].pack("C*") # PNG signature
|
|
92
|
+
bytes<< PNG.chunk('IHDR',
|
|
93
|
+
[ @height, @width, @bits, 6, 0, 0, 0 ].pack("N2C5"))
|
|
94
|
+
# 0 == filter type code "none"
|
|
95
|
+
data = @data.map { |row| [0] + row.map { |p| p.values } }.flatten
|
|
96
|
+
bytes<< PNG.chunk('IDAT', Zlib::Deflate.deflate(data.pack("C*"), 9))
|
|
97
|
+
bytes<< PNG.chunk('IEND', '')
|
|
98
|
+
bytes
|
|
99
|
+
end
|
|
100
|
+
|
|
101
|
+
##
|
|
102
|
+
# RGBA colors
|
|
103
|
+
|
|
104
|
+
class Color
|
|
105
|
+
|
|
106
|
+
attr_reader :values
|
|
107
|
+
|
|
108
|
+
##
|
|
109
|
+
# Creates a new color with values +red+, +green+, +blue+, and +alpha+.
|
|
110
|
+
|
|
111
|
+
def initialize(red, green, blue, alpha)
|
|
112
|
+
@values = [red, green, blue, alpha]
|
|
113
|
+
end
|
|
114
|
+
|
|
115
|
+
##
|
|
116
|
+
# Transparent white
|
|
117
|
+
|
|
118
|
+
Background = Color.new 0xFF, 0xFF, 0xFF, 0x00
|
|
119
|
+
|
|
120
|
+
White = Color.new 0xFF, 0xFF, 0xFF, 0xFF
|
|
121
|
+
Black = Color.new 0x00, 0x00, 0x00, 0xFF
|
|
122
|
+
Gray = Color.new 0x7F, 0x7F, 0x7F, 0xFF
|
|
123
|
+
|
|
124
|
+
Red = Color.new 0xFF, 0x00, 0x00, 0xFF
|
|
125
|
+
Orange = Color.new 0xFF, 0xA5, 0x00, 0xFF
|
|
126
|
+
Yellow = Color.new 0xFF, 0xFF, 0x00, 0xFF
|
|
127
|
+
Green = Color.new 0x00, 0xFF, 0x00, 0xFF
|
|
128
|
+
Blue = Color.new 0x00, 0x00, 0xFF, 0xFF
|
|
129
|
+
Purple = Color.new 0XFF, 0x00, 0xFF, 0xFF
|
|
130
|
+
|
|
131
|
+
##
|
|
132
|
+
# Red component
|
|
133
|
+
|
|
134
|
+
def r; @values[0]; end
|
|
135
|
+
|
|
136
|
+
##
|
|
137
|
+
# Green component
|
|
138
|
+
|
|
139
|
+
def g; @values[1]; end
|
|
140
|
+
|
|
141
|
+
##
|
|
142
|
+
# Blue component
|
|
143
|
+
|
|
144
|
+
def b; @values[2]; end
|
|
145
|
+
|
|
146
|
+
##
|
|
147
|
+
# Alpha transparency component
|
|
148
|
+
|
|
149
|
+
def a; @values[3]; end
|
|
150
|
+
|
|
151
|
+
##
|
|
152
|
+
# Blends +color+ into this color returning a new blended color.
|
|
153
|
+
|
|
154
|
+
def blend(color)
|
|
155
|
+
return Color.new((r * (0xFF - color.a) + color.r * color.a) >> 8,
|
|
156
|
+
(g * (0xFF - color.a) + color.g * color.a) >> 8,
|
|
157
|
+
(b * (0xFF - color.a) + color.b * color.a) >> 8,
|
|
158
|
+
(a * (0xFF - color.a) + color.a * color.a) >> 8)
|
|
159
|
+
end
|
|
160
|
+
|
|
161
|
+
##
|
|
162
|
+
# Returns a new color with an alpha value adjusted by +i+.
|
|
163
|
+
|
|
164
|
+
def intensity(i)
|
|
165
|
+
return Color.new(r,b,g,(a*i) >> 8)
|
|
166
|
+
end
|
|
167
|
+
|
|
168
|
+
def inspect # :nodoc:
|
|
169
|
+
"#<%s %02x %02x %02x %02x>" % [self.class, *@values]
|
|
170
|
+
end
|
|
171
|
+
|
|
172
|
+
end
|
|
173
|
+
|
|
174
|
+
##
|
|
175
|
+
# PNG canvas
|
|
176
|
+
|
|
177
|
+
class Canvas
|
|
178
|
+
|
|
179
|
+
##
|
|
180
|
+
# Height of the canvas
|
|
181
|
+
|
|
182
|
+
attr_reader :height
|
|
183
|
+
|
|
184
|
+
##
|
|
185
|
+
# Width of the canvas
|
|
186
|
+
|
|
187
|
+
attr_reader :width
|
|
188
|
+
|
|
189
|
+
##
|
|
190
|
+
# Raw data
|
|
191
|
+
|
|
192
|
+
attr_reader :data
|
|
193
|
+
|
|
194
|
+
def initialize(height, width, background = Color::White)
|
|
195
|
+
@height = height
|
|
196
|
+
@width = width
|
|
197
|
+
@data = Array.new(@width) { |x| Array.new(@height) { background } }
|
|
198
|
+
end
|
|
199
|
+
|
|
200
|
+
##
|
|
201
|
+
# Retrieves the color of the pixel at (+x+, +y+).
|
|
202
|
+
|
|
203
|
+
def [](x, y)
|
|
204
|
+
raise "bad x value #{x} >= #{@height}" if x >= @height
|
|
205
|
+
raise "bad y value #{y} >= #{@width}" if y >= @width
|
|
206
|
+
@data[y][x]
|
|
207
|
+
end
|
|
208
|
+
|
|
209
|
+
##
|
|
210
|
+
# Sets the color of the pixel at (+x+, +y+) to +color+.
|
|
211
|
+
|
|
212
|
+
def []=(x, y, color)
|
|
213
|
+
raise "bad x value #{x} >= #{@height}" if x >= @height
|
|
214
|
+
raise "bad y value #{y} >= #{@width}" if y >= @width
|
|
215
|
+
@data[y][x] = color
|
|
216
|
+
end
|
|
217
|
+
|
|
218
|
+
##
|
|
219
|
+
# Iterates over each pixel in the canvas.
|
|
220
|
+
|
|
221
|
+
def each
|
|
222
|
+
@data.each_with_index do |row, y|
|
|
223
|
+
row.each_with_index do |pixel, x|
|
|
224
|
+
yield x, y, color
|
|
225
|
+
end
|
|
226
|
+
end
|
|
227
|
+
end
|
|
228
|
+
|
|
229
|
+
##
|
|
230
|
+
# Blends +color+ onto the color at point (+x+, +y+).
|
|
231
|
+
|
|
232
|
+
def point(x, y, color)
|
|
233
|
+
self[x,y] = self[x,y].blend(color)
|
|
234
|
+
end
|
|
235
|
+
|
|
236
|
+
##
|
|
237
|
+
# Draws a line using Xiaolin Wu's antialiasing technique.
|
|
238
|
+
#
|
|
239
|
+
# http://en.wikipedia.org/wiki/Xiaolin_Wu's_line_algorithm
|
|
240
|
+
|
|
241
|
+
def line(x0, y0, x1, y1, color)
|
|
242
|
+
dx = x1 - x0
|
|
243
|
+
sx = dx < 0 ? -1 : 1
|
|
244
|
+
dx *= sx # TODO: abs?
|
|
245
|
+
dy = y1 - y0
|
|
246
|
+
|
|
247
|
+
# 'easy' cases
|
|
248
|
+
if dy == 0 then
|
|
249
|
+
Range.new(*[x0,x1].sort).each do |x|
|
|
250
|
+
point(x, y0, color)
|
|
251
|
+
end
|
|
252
|
+
return
|
|
253
|
+
end
|
|
254
|
+
|
|
255
|
+
if dx == 0 then
|
|
256
|
+
(y0..y1).each do |y|
|
|
257
|
+
point(x0, y, color)
|
|
258
|
+
end
|
|
259
|
+
return
|
|
260
|
+
end
|
|
261
|
+
|
|
262
|
+
if dx == dy then
|
|
263
|
+
Range.new(*[x0,x1].sort).each do |x|
|
|
264
|
+
point(x, y0, color)
|
|
265
|
+
y0 += 1
|
|
266
|
+
end
|
|
267
|
+
return
|
|
268
|
+
end
|
|
269
|
+
|
|
270
|
+
# main loop
|
|
271
|
+
point(x0, y0, color)
|
|
272
|
+
e_acc = 0
|
|
273
|
+
if dy > dx then # vertical displacement
|
|
274
|
+
e = (dx << 16) / dy
|
|
275
|
+
(y0...y1-1).each do |i|
|
|
276
|
+
e_acc_temp, e_acc = e_acc, (e_acc + e) & 0xFFFF
|
|
277
|
+
x0 = x0 + sx if (e_acc <= e_acc_temp)
|
|
278
|
+
w = 0xFF-(e_acc >> 8)
|
|
279
|
+
point(x0, y0, color.intensity(w))
|
|
280
|
+
y0 = y0 + 1
|
|
281
|
+
point(x0 + sx, y0, color.intensity(0xFF-w))
|
|
282
|
+
end
|
|
283
|
+
point(x1, y1, color)
|
|
284
|
+
return
|
|
285
|
+
end
|
|
286
|
+
|
|
287
|
+
# horizontal displacement
|
|
288
|
+
e = (dy << 16) / dx
|
|
289
|
+
(x0...(x1-sx)).each do |i|
|
|
290
|
+
e_acc_temp, e_acc = e_acc, (e_acc + e) & 0xFFFF
|
|
291
|
+
y0 += 1 if (e_acc <= e_acc_temp)
|
|
292
|
+
w = 0xFF-(e_acc >> 8)
|
|
293
|
+
point(x0, y0, color.intensity(w))
|
|
294
|
+
x0 += sx
|
|
295
|
+
point(x0, y0 + 1, color.intensity(0xFF-w))
|
|
296
|
+
end
|
|
297
|
+
point(x1, y1, color)
|
|
298
|
+
end
|
|
299
|
+
|
|
300
|
+
end
|
|
301
|
+
|
|
302
|
+
end
|
|
303
|
+
|