From 7cff4a0335d25d6218e0beee22f7e13a04d3277a Mon Sep 17 00:00:00 2001 From: Natalia Portillo Date: Sun, 18 Oct 2015 22:04:03 +0100 Subject: [PATCH] Added specific console handling for standard, verbose, debug and error outputs. --- CDChecksums.cs | 137 ++++++++++++++------------------- ChangeLog | 8 ++ DiscImageChef.Checksums.csproj | 4 + ReedSolomon.cs | 80 ++++++++++--------- 4 files changed, 109 insertions(+), 120 deletions(-) diff --git a/CDChecksums.cs b/CDChecksums.cs index 110e7bf1b..ee3ff20f3 100644 --- a/CDChecksums.cs +++ b/CDChecksums.cs @@ -37,6 +37,7 @@ ECC algorithm from ECM (C) 2002-2011 Neill Corlett ****************************************************************************/ //$Id$ using System; +using DiscImageChef.Console; namespace DiscImageChef.Checksums { @@ -163,19 +164,16 @@ namespace DiscImageChef.Checksums channel[0x00A] == 0xFF && channel[0x00B] == 0x00) { - //if (MainClass.isDebug) - Console.WriteLine("DEBUG (CDChecksums): Data sector, address {0:X2}:{1:X2}:{2:X2}", channel[0x00C], channel[0x00D], channel[0x00E]); + DicConsole.DebugWriteLine("CD checksums", "Data sector, address {0:X2}:{1:X2}:{2:X2}", channel[0x00C], channel[0x00D], channel[0x00E]); if (channel[0x00F] == 0x00) // mode (1 byte) { - //if (MainClass.isDebug) - Console.WriteLine("DEBUG (CDChecksums): Mode 0 sector at address {0:X2}:{1:X2}:{2:X2}", channel[0x00C], channel[0x00D], channel[0x00E]); + DicConsole.DebugWriteLine("CD checksums", "Mode 0 sector at address {0:X2}:{1:X2}:{2:X2}", channel[0x00C], channel[0x00D], channel[0x00E]); for (int i = 0x010; i < 0x930; i++) { if (channel[i] != 0x00) { - //if (MainClass.isDebug) - Console.WriteLine("DEBUG (CDChecksums): Mode 0 sector with error at address: {0:X2}:{1:X2}:{2:X2}", channel[0x00C], channel[0x00D], channel[0x00E]); + DicConsole.DebugWriteLine("CD checksums", "Mode 0 sector with error at address: {0:X2}:{1:X2}:{2:X2}", channel[0x00C], channel[0x00D], channel[0x00E]); return false; } } @@ -183,8 +181,7 @@ namespace DiscImageChef.Checksums } else if (channel[0x00F] == 0x01) // mode (1 byte) { - //if (MainClass.isDebug) - Console.WriteLine("DEBUG (CDChecksums): Mode 1 sector at address {0:X2}:{1:X2}:{2:X2}", channel[0x00C], channel[0x00D], channel[0x00E]); + DicConsole.DebugWriteLine("CD checksums", "Mode 1 sector at address {0:X2}:{1:X2}:{2:X2}", channel[0x00C], channel[0x00D], channel[0x00E]); if (channel[0x814] != 0x00 || // reserved (8 bytes) channel[0x815] != 0x00 || @@ -195,8 +192,7 @@ namespace DiscImageChef.Checksums channel[0x81A] != 0x00 || channel[0x81B] != 0x00) { - //if (MainClass.isDebug) - Console.WriteLine("DEBUG (CDChecksums): Mode 1 sector with data in reserved bytes at address: {0:X2}:{1:X2}:{2:X2}", channel[0x00C], channel[0x00D], channel[0x00E]); + DicConsole.DebugWriteLine("CD checksums", "Mode 1 sector with data in reserved bytes at address: {0:X2}:{1:X2}:{2:X2}", channel[0x00C], channel[0x00D], channel[0x00E]); return false; } @@ -216,11 +212,9 @@ namespace DiscImageChef.Checksums bool FailedECC_Q = CheckECC(address, data2, 52, 43, 86, 88, ecc_q); if (FailedECC_P) - //if (MainClass.isDebug) - Console.WriteLine("DEBUG (CDChecksums): Mode 1 sector at address: {0:X2}:{1:X2}:{2:X2}, fails ECC P check", channel[0x00C], channel[0x00D], channel[0x00E]); + DicConsole.DebugWriteLine("CD checksums", "Mode 1 sector at address: {0:X2}:{1:X2}:{2:X2}, fails ECC P check", channel[0x00C], channel[0x00D], channel[0x00E]); if (FailedECC_Q) - //if (MainClass.isDebug) - Console.WriteLine("DEBUG (CDChecksums): Mode 1 sector at address: {0:X2}:{1:X2}:{2:X2}, fails ECC Q check", channel[0x00C], channel[0x00D], channel[0x00E]); + DicConsole.DebugWriteLine("CD checksums", "Mode 1 sector at address: {0:X2}:{1:X2}:{2:X2}, fails ECC Q check", channel[0x00C], channel[0x00D], channel[0x00E]); if (FailedECC_P || FailedECC_Q) return false; @@ -234,8 +228,7 @@ namespace DiscImageChef.Checksums if (CalculatedEDC != StoredEDC) { - //if (MainClass.isDebug) - Console.WriteLine("DEBUG (CDChecksums): Mode 1 sector at address: {0:X2}:{1:X2}:{2:X2}, got CRC 0x{3:X8} expected 0x{4:X8}", channel[0x00C], channel[0x00D], channel[0x00E], CalculatedEDC, StoredEDC); + DicConsole.DebugWriteLine("CD checksums", "Mode 1 sector at address: {0:X2}:{1:X2}:{2:X2}, got CRC 0x{3:X8} expected 0x{4:X8}", channel[0x00C], channel[0x00D], channel[0x00E], CalculatedEDC, StoredEDC); return false; } @@ -243,15 +236,13 @@ namespace DiscImageChef.Checksums } else if (channel[0x00F] == 0x02) // mode (1 byte) { - //if (MainClass.isDebug) - Console.WriteLine("DEBUG (CDChecksums): Mode 2 sector at address {0:X2}:{1:X2}:{2:X2}", channel[0x00C], channel[0x00D], channel[0x00E]); + DicConsole.DebugWriteLine("CD checksums", "Mode 2 sector at address {0:X2}:{1:X2}:{2:X2}", channel[0x00C], channel[0x00D], channel[0x00E]); if ((channel[0x012] & 0x20) == 0x20) // mode 2 form 2 { if (channel[0x010] != channel[0x014] || channel[0x011] != channel[0x015] || channel[0x012] != channel[0x016] || channel[0x013] != channel[0x017]) { - //if (MainClass.isDebug) - Console.WriteLine("DEBUG (CDChecksums): Subheader copies differ in mode 2 form 2 sector at address: {0:X2}:{1:X2}:{2:X2}", channel[0x00C], channel[0x00D], channel[0x00E]); + DicConsole.DebugWriteLine("CD checksums", "Subheader copies differ in mode 2 form 2 sector at address: {0:X2}:{1:X2}:{2:X2}", channel[0x00C], channel[0x00D], channel[0x00E]); } byte[] SectorForCheck = new byte[0x91C]; @@ -263,8 +254,7 @@ namespace DiscImageChef.Checksums if (CalculatedEDC != StoredEDC && StoredEDC != 0x00000000) { - //if (MainClass.isDebug) - Console.WriteLine("DEBUG (CDChecksums): Mode 2 form 2 sector at address: {0:X2}:{1:X2}:{2:X2}, got CRC 0x{3:X8} expected 0x{4:X8}", channel[0x00C], channel[0x00D], channel[0x00E], CalculatedEDC, StoredEDC); + DicConsole.DebugWriteLine("CD checksums", "Mode 2 form 2 sector at address: {0:X2}:{1:X2}:{2:X2}, got CRC 0x{3:X8} expected 0x{4:X8}", channel[0x00C], channel[0x00D], channel[0x00E], CalculatedEDC, StoredEDC); return false; } } @@ -272,8 +262,7 @@ namespace DiscImageChef.Checksums { if (channel[0x010] != channel[0x014] || channel[0x011] != channel[0x015] || channel[0x012] != channel[0x016] || channel[0x013] != channel[0x017]) { - //if (MainClass.isDebug) - Console.WriteLine("DEBUG (CDChecksums): Subheader copies differ in mode 2 form 1 sector at address: {0:X2}:{1:X2}:{2:X2}", channel[0x00C], channel[0x00D], channel[0x00E]); + DicConsole.DebugWriteLine("CD checksums", "Subheader copies differ in mode 2 form 1 sector at address: {0:X2}:{1:X2}:{2:X2}", channel[0x00C], channel[0x00D], channel[0x00E]); } byte[] address = new byte[4]; @@ -295,11 +284,9 @@ namespace DiscImageChef.Checksums bool FailedECC_Q = CheckECC(address, data2, 52, 43, 86, 88, ecc_q); if (FailedECC_P) - //if (MainClass.isDebug) - Console.WriteLine("DEBUG (CDChecksums): Mode 2 form 1 sector at address: {0:X2}:{1:X2}:{2:X2}, fails ECC P check", channel[0x00C], channel[0x00D], channel[0x00E]); + DicConsole.DebugWriteLine("CD checksums", "Mode 2 form 1 sector at address: {0:X2}:{1:X2}:{2:X2}, fails ECC P check", channel[0x00C], channel[0x00D], channel[0x00E]); if (FailedECC_Q) - //if (MainClass.isDebug) - Console.WriteLine("DEBUG (CDChecksums): Mode 2 form 1 sector at address: {0:X2}:{1:X2}:{2:X2}, fails ECC Q check", channel[0x00F], channel[0x00C], channel[0x00D], channel[0x00E]); + DicConsole.DebugWriteLine("CD checksums", "Mode 2 form 1 sector at address: {0:X2}:{1:X2}:{2:X2}, fails ECC Q check", channel[0x00F], channel[0x00C], channel[0x00D], channel[0x00E]); if (FailedECC_P || FailedECC_Q) return false; @@ -313,8 +300,7 @@ namespace DiscImageChef.Checksums if (CalculatedEDC != StoredEDC) { - //if (MainClass.isDebug) - Console.WriteLine("DEBUG (CDChecksums): Mode 2 form 1 sector at address: {0:X2}:{1:X2}:{2:X2}, got CRC 0x{3:X8} expected 0x{4:X8}", channel[0x00C], channel[0x00D], channel[0x00E], CalculatedEDC, StoredEDC); + DicConsole.DebugWriteLine("CD checksums", "Mode 2 form 1 sector at address: {0:X2}:{1:X2}:{2:X2}, got CRC 0x{3:X8} expected 0x{4:X8}", channel[0x00C], channel[0x00D], channel[0x00E], CalculatedEDC, StoredEDC); return false; } } @@ -323,8 +309,7 @@ namespace DiscImageChef.Checksums } else { - //if (MainClass.isDebug) - Console.WriteLine("DEBUG (CDChecksums): Unknown mode {0} sector at address: {1:X2}:{2:X2}:{3:X2}", channel[0x00F], channel[0x00C], channel[0x00D], channel[0x00E]); + DicConsole.DebugWriteLine("CD checksums", "Unknown mode {0} sector at address: {1:X2}:{2:X2}:{3:X2}", channel[0x00F], channel[0x00C], channel[0x00D], channel[0x00E]); return null; } } @@ -454,36 +439,33 @@ namespace DiscImageChef.Checksums CDSubRWPack4[j] = (byte)(subchannel[i++] & 0x3F); } - //if(MainClass.isDebug) - //{ - switch(CDSubRWPack1[0]) - { - case 0x00: - Console.WriteLine("Detected Zero Pack in subchannel"); - break; - case 0x08: - Console.WriteLine("Detected Line Graphics Pack in subchannel"); - break; - case 0x09: - Console.WriteLine("Detected CD+G Pack in subchannel"); - break; - case 0x0A: - Console.WriteLine("Detected CD+EG Pack in subchannel"); - break; - case 0x14: - Console.WriteLine("Detected CD-TEXT Pack in subchannel"); - break; - case 0x18: - Console.WriteLine("Detected CD+MIDI Pack in subchannel"); - break; - case 0x38: - Console.WriteLine("Detected User Pack in subchannel"); - break; - default: - Console.WriteLine("Detected unknown Pack type in subchannel: mode {0}, item {1}", Convert.ToString(CDSubRWPack1[0] & 0x38, 2), Convert.ToString(CDSubRWPack1[0] & 0x07, 2)); - break; - } - //} + switch (CDSubRWPack1[0]) + { + case 0x00: + DicConsole.DebugWriteLine("CD checksums", "Detected Zero Pack in subchannel"); + break; + case 0x08: + DicConsole.DebugWriteLine("CD checksums", "Detected Line Graphics Pack in subchannel"); + break; + case 0x09: + DicConsole.DebugWriteLine("CD checksums", "Detected CD+G Pack in subchannel"); + break; + case 0x0A: + DicConsole.DebugWriteLine("CD checksums", "Detected CD+EG Pack in subchannel"); + break; + case 0x14: + DicConsole.DebugWriteLine("CD checksums", "Detected CD-TEXT Pack in subchannel"); + break; + case 0x18: + DicConsole.DebugWriteLine("CD checksums", "Detected CD+MIDI Pack in subchannel"); + break; + case 0x38: + DicConsole.DebugWriteLine("CD checksums", "Detected User Pack in subchannel"); + break; + default: + DicConsole.DebugWriteLine("CD checksums", "Detected unknown Pack type in subchannel: mode {0}, item {1}", Convert.ToString(CDSubRWPack1[0] & 0x38, 2), Convert.ToString(CDSubRWPack1[0] & 0x07, 2)); + break; + } BigEndianBitConverter.IsLittleEndian = true; @@ -494,8 +476,7 @@ namespace DiscImageChef.Checksums if (QSubChannelCRC != CalculatedQCRC) { - //if (MainClass.isDebug) - Console.WriteLine("DEBUG (CDChecksums): Q subchannel CRC 0x{0:X4}, expected 0x{1:X4}", CalculatedQCRC, QSubChannelCRC); + DicConsole.DebugWriteLine("CD checksums", "Q subchannel CRC 0x{0:X4}, expected 0x{1:X4}", CalculatedQCRC, QSubChannelCRC); status = false; } @@ -508,9 +489,8 @@ namespace DiscImageChef.Checksums if (CDTextPack1CRC != CalculatedCDTP1CRC && CDTextPack1CRC != 0) { - //if (MainClass.isDebug) - Console.WriteLine("DEBUG (CDChecksums): CD-Text Pack 1 CRC 0x{0:X4}, expected 0x{1:X4}", CDTextPack1CRC, CalculatedCDTP1CRC); - status = false; + DicConsole.DebugWriteLine("CD checksums", "CD-Text Pack 1 CRC 0x{0:X4}, expected 0x{1:X4}", CDTextPack1CRC, CalculatedCDTP1CRC); + status = false; } } @@ -520,12 +500,11 @@ namespace DiscImageChef.Checksums byte[] CDTextPack2ForCRC = new byte[16]; Array.Copy(CDTextPack2, 0, CDTextPack2ForCRC, 0, 16); UInt16 CalculatedCDTP2CRC = CalculateCCITT_CRC16(CDTextPack2ForCRC); - Console.WriteLine("Cyclic CDTP2 0x{0:X4}, Calc CDTP2 0x{1:X4}", CDTextPack2CRC, CalculatedCDTP2CRC); + DicConsole.DebugWriteLine("CD checksums", "Cyclic CDTP2 0x{0:X4}, Calc CDTP2 0x{1:X4}", CDTextPack2CRC, CalculatedCDTP2CRC); if (CDTextPack2CRC != CalculatedCDTP2CRC && CDTextPack2CRC != 0) { - //if (MainClass.isDebug) - Console.WriteLine("DEBUG (CDChecksums): CD-Text Pack 2 CRC 0x{0:X4}, expected 0x{1:X4}", CDTextPack2CRC, CalculatedCDTP2CRC); + DicConsole.DebugWriteLine("CD checksums", "CD-Text Pack 2 CRC 0x{0:X4}, expected 0x{1:X4}", CDTextPack2CRC, CalculatedCDTP2CRC); status = false; } } @@ -536,12 +515,11 @@ namespace DiscImageChef.Checksums byte[] CDTextPack3ForCRC = new byte[16]; Array.Copy(CDTextPack3, 0, CDTextPack3ForCRC, 0, 16); UInt16 CalculatedCDTP3CRC = CalculateCCITT_CRC16(CDTextPack3ForCRC); - Console.WriteLine("Cyclic CDTP3 0x{0:X4}, Calc CDTP3 0x{1:X4}", CDTextPack3CRC, CalculatedCDTP3CRC); + DicConsole.DebugWriteLine("CD checksums", "Cyclic CDTP3 0x{0:X4}, Calc CDTP3 0x{1:X4}", CDTextPack3CRC, CalculatedCDTP3CRC); if (CDTextPack3CRC != CalculatedCDTP3CRC && CDTextPack3CRC != 0) { - //if (MainClass.isDebug) - Console.WriteLine("DEBUG (CDChecksums): CD-Text Pack 3 CRC 0x{0:X4}, expected 0x{1:X4}", CDTextPack3CRC, CalculatedCDTP3CRC); + DicConsole.DebugWriteLine("CD checksums", "CD-Text Pack 3 CRC 0x{0:X4}, expected 0x{1:X4}", CDTextPack3CRC, CalculatedCDTP3CRC); status = false; } } @@ -552,12 +530,11 @@ namespace DiscImageChef.Checksums byte[] CDTextPack4ForCRC = new byte[16]; Array.Copy(CDTextPack4, 0, CDTextPack4ForCRC, 0, 16); UInt16 CalculatedCDTP4CRC = CalculateCCITT_CRC16(CDTextPack4ForCRC); - Console.WriteLine("Cyclic CDTP4 0x{0:X4}, Calc CDTP4 0x{1:X4}", CDTextPack4CRC, CalculatedCDTP4CRC); + DicConsole.DebugWriteLine("CD checksums", "Cyclic CDTP4 0x{0:X4}, Calc CDTP4 0x{1:X4}", CDTextPack4CRC, CalculatedCDTP4CRC); if (CDTextPack4CRC != CalculatedCDTP4CRC && CDTextPack4CRC != 0) { - //if (MainClass.isDebug) - Console.WriteLine("DEBUG (CDChecksums): CD-Text Pack 4 CRC 0x{0:X4}, expected 0x{1:X4}", CDTextPack4CRC, CalculatedCDTP4CRC); + DicConsole.DebugWriteLine("CD checksums", "CD-Text Pack 4 CRC 0x{0:X4}, expected 0x{1:X4}", CDTextPack4CRC, CalculatedCDTP4CRC); status = false; } } @@ -565,7 +542,8 @@ namespace DiscImageChef.Checksums return status; } - static readonly ushort[] CCITT_CRC16Table = { + static readonly ushort[] CCITT_CRC16Table = + { 0x0000, 0x1021, 0x2042, 0x3063, 0x4084, 0x50a5, 0x60c6, 0x70e7, 0x8108, 0x9129, 0xa14a, 0xb16b, 0xc18c, 0xd1ad, 0xe1ce, 0xf1ef, 0x1231, 0x0210, 0x3273, 0x2252, 0x52b5, 0x4294, 0x72f7, 0x62d6, @@ -602,8 +580,9 @@ namespace DiscImageChef.Checksums static ushort CalculateCCITT_CRC16(byte[] buffer) { - UInt16 CRC16=0; - for (int i = 0; i < buffer.Length; i++) { + UInt16 CRC16 = 0; + for (int i = 0; i < buffer.Length; i++) + { CRC16 = (ushort)(CCITT_CRC16Table[(CRC16 >> 8) ^ buffer[i]] ^ (CRC16 << 8)); } CRC16 = (ushort)~CRC16; diff --git a/ChangeLog b/ChangeLog index 40ed9581e..6d093402a 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,11 @@ +2015-10-18 Natalia Portillo + + * CDChecksums.cs: + * ReedSolomon.cs: + * DiscImageChef.Checksums.csproj: + Added specific console handling for standard, verbose, debug + and error outputs. + 2015-10-05 Natalia Portillo * MD5Context.cs: diff --git a/DiscImageChef.Checksums.csproj b/DiscImageChef.Checksums.csproj index 61ed63bba..60b3b5ee4 100644 --- a/DiscImageChef.Checksums.csproj +++ b/DiscImageChef.Checksums.csproj @@ -56,5 +56,9 @@ {F8BDF57B-1571-4CD0-84B3-B422088D359A} DiscImageChef.Helpers + + {CCAA7AFE-C094-4D82-A66D-630DE8A3F545} + DiscImageChef.Console + \ No newline at end of file diff --git a/ReedSolomon.cs b/ReedSolomon.cs index f10e4346a..009b6ebe3 100644 --- a/ReedSolomon.cs +++ b/ReedSolomon.cs @@ -64,6 +64,7 @@ Copyright (C) 1995 Hari Thirumoorthy */ using System; +using DiscImageChef.Console; namespace DiscImageChef.Checksums { @@ -443,42 +444,42 @@ namespace DiscImageChef.Checksums lambda[j] ^= Alpha_to[modnn(u + tmp)]; } } - //if (MainClass.isDebug) + + #if DEBUG + /* find roots of the erasure location polynomial */ + for (i = 1; i <= no_eras; i++) + reg[i] = Index_of[lambda[i]]; + count = 0; + for (i = 1; i <= NN; i++) { - /* find roots of the erasure location polynomial */ - for (i = 1; i <= no_eras; i++) - reg[i] = Index_of[lambda[i]]; - count = 0; - for (i = 1; i <= NN; i++) - { - q = 1; - for (j = 1; j <= no_eras; j++) - if (reg[j] != A0) - { - reg[j] = modnn(reg[j] + j); - q ^= Alpha_to[reg[j]]; - } - if (q == 0) + q = 1; + for (j = 1; j <= no_eras; j++) + if (reg[j] != A0) { - /* store root and error location + reg[j] = modnn(reg[j] + j); + q ^= Alpha_to[reg[j]]; + } + if (q == 0) + { + /* store root and error location * number indices */ - root[count] = i; - loc[count] = NN - i; - count++; - } + root[count] = i; + loc[count] = NN - i; + count++; } - if (count != no_eras) - { - Console.WriteLine("\n lambda(x) is WRONG\n"); - return -1; - } - - Console.WriteLine("\n Erasure positions as determined by roots of Eras Loc Poly:\n"); - for (i = 0; i < count; i++) - Console.WriteLine("{0} ", loc[i]); - Console.WriteLine("\n"); } + if (count != no_eras) + { + DicConsole.DebugWriteLine("Reed Solomon", "\n lambda(x) is WRONG\n"); + return -1; + } + + DicConsole.DebugWriteLine("Reed Solomon", "\n Erasure positions as determined by roots of Eras Loc Poly:\n"); + for (i = 0; i < count; i++) + DicConsole.DebugWriteLine("Reed Solomon", "{0} ", loc[i]); + DicConsole.DebugWriteLine("Reed Solomon", "\n"); + #endif } for (i = 0; i < NN - KK + 1; i++) b[i] = Index_of[lambda[i]]; @@ -572,13 +573,13 @@ namespace DiscImageChef.Checksums } } - //if (MainClass.isDebug) - { - Console.WriteLine("\n Final error positions:\t"); - for (i = 0; i < count; i++) - Console.WriteLine("{0} ", loc[i]); - Console.WriteLine("\n"); - } + #if DEBUG + DicConsole.DebugWriteLine("Reed Solomon", "\n Final error positions:\t"); + for (i = 0; i < count; i++) + DicConsole.DebugWriteLine("Reed Solomon", "{0} ", loc[i]); + DicConsole.DebugWriteLine("Reed Solomon", "\n"); + #endif + if (deg_lambda != count) { /* @@ -630,10 +631,7 @@ namespace DiscImageChef.Checksums } if (den == 0) { - //if (MainClass.isDebug) - { - Console.WriteLine("\n ERROR: denominator = 0\n"); - } + DicConsole.DebugWriteLine("Reed Solomon", "\n ERROR: denominator = 0\n"); return -1; } /* Apply error to data */