[Refactor] Replace regex with source generation.

This commit is contained in:
2025-11-24 11:27:56 +00:00
parent 98f52803c9
commit 0fa91c34e1
33 changed files with 585 additions and 188 deletions

View File

@@ -49,7 +49,7 @@ namespace Aaru.Decoders.SCSI;
[SuppressMessage("ReSharper", "NotAccessedField.Global")] [SuppressMessage("ReSharper", "NotAccessedField.Global")]
[SuppressMessage("ReSharper", "UnassignedField.Global")] [SuppressMessage("ReSharper", "UnassignedField.Global")]
[SuppressMessage("ReSharper", "UnusedMember.Global")] [SuppressMessage("ReSharper", "UnusedMember.Global")]
public static class EVPD public static partial class EVPD
{ {
/// <summary>Decodes VPD page 0x00: Supported VPD pages</summary> /// <summary>Decodes VPD page 0x00: Supported VPD pages</summary>
/// <returns>A byte array containing all supported VPD pages.</returns> /// <returns>A byte array containing all supported VPD pages.</returns>
@@ -60,7 +60,7 @@ public static class EVPD
if(page.Length != page[3] + 4) return null; if(page.Length != page[3] + 4) return null;
byte[] decoded = new byte[page.Length - 4]; var decoded = new byte[page.Length - 4];
Array.Copy(page, 4, decoded, 0, page.Length - 4); Array.Copy(page, 4, decoded, 0, page.Length - 4);
@@ -78,7 +78,7 @@ public static class EVPD
if(page.Length != page[3] + 4) return null; if(page.Length != page[3] + 4) return null;
byte[] ascii = new byte[page[4]]; var ascii = new byte[page[4]];
Array.Copy(page, 5, ascii, 0, page[4]); Array.Copy(page, 5, ascii, 0, page[4]);
@@ -94,11 +94,11 @@ public static class EVPD
if(page.Length != page[3] + 4) return null; if(page.Length != page[3] + 4) return null;
byte[] ascii = new byte[page.Length - 4]; var ascii = new byte[page.Length - 4];
Array.Copy(page, 4, ascii, 0, page.Length - 4); Array.Copy(page, 4, ascii, 0, page.Length - 4);
for(int i = 0; i < ascii.Length - 1; i++) for(var i = 0; i < ascii.Length - 1; i++)
{ {
if(ascii[i] == 0x00) break; if(ascii[i] == 0x00) break;
@@ -117,7 +117,7 @@ public static class EVPD
if(page.Length != page[3] + 4) return null; if(page.Length != page[3] + 4) return null;
byte[] ascii = new byte[page.Length - 4]; var ascii = new byte[page.Length - 4];
Array.Copy(page, 4, ascii, 0, page.Length - 4); Array.Copy(page, 4, ascii, 0, page.Length - 4);
@@ -132,7 +132,7 @@ public static class EVPD
if(page.Length != page[3] + 4) return null; if(page.Length != page[3] + 4) return null;
byte[] ascii = new byte[page.Length - 4]; var ascii = new byte[page.Length - 4];
Array.Copy(page, 4, ascii, 0, page.Length - 4); Array.Copy(page, 4, ascii, 0, page.Length - 4);
@@ -149,7 +149,7 @@ public static class EVPD
if(page.Length != 12) return 0; if(page.Length != 12) return 0;
byte[] bitmap = new byte[8]; var bitmap = new byte[8];
Array.Copy(page, 4, bitmap, 0, 8); Array.Copy(page, 4, bitmap, 0, 8);
@@ -166,7 +166,7 @@ public static class EVPD
if(page.Length != page[3] + 4) return null; if(page.Length != page[3] + 4) return null;
byte[] ascii = new byte[page.Length - 4]; var ascii = new byte[page.Length - 4];
Array.Copy(page, 4, ascii, 0, page.Length - 4); Array.Copy(page, 4, ascii, 0, page.Length - 4);
@@ -183,8 +183,8 @@ public static class EVPD
if(page.Length != page[3] + 4) return null; if(page.Length != page[3] + 4) return null;
byte[] element = new byte[page.Length - 4]; var element = new byte[page.Length - 4];
var sb = new StringBuilder(); var sb = new StringBuilder();
foreach(byte b in element) sb.Append($"{b:X2}"); foreach(byte b in element) sb.Append($"{b:X2}");
@@ -231,7 +231,7 @@ public static class EVPD
Default = (ScsiDefinitions)(pageResponse[5] & 0x7F) Default = (ScsiDefinitions)(pageResponse[5] & 0x7F)
}; };
int position = 6; var position = 6;
List<ScsiDefinitions> definitions = []; List<ScsiDefinitions> definitions = [];
while(position < pageResponse.Length) while(position < pageResponse.Length)
@@ -387,7 +387,7 @@ public static class EVPD
PageLength = (byte)(pageResponse[3] + 4) PageLength = (byte)(pageResponse[3] + 4)
}; };
int position = 4; var position = 4;
List<IdentificatonDescriptor> descriptors = []; List<IdentificatonDescriptor> descriptors = [];
while(position < pageResponse.Length) while(position < pageResponse.Length)
@@ -565,7 +565,7 @@ public static class EVPD
sb.AppendFormat($"\t[slateblue1]{Localization.IEEE_EUI_64_0_X2}", sb.AppendFormat($"\t[slateblue1]{Localization.IEEE_EUI_64_0_X2}",
$"[teal]{descriptor.Binary[0]}"); $"[teal]{descriptor.Binary[0]}");
for(int i = 1; i < descriptor.Binary.Length; i++) sb.Append($":{descriptor.Binary[i]:X2}"); for(var i = 1; i < descriptor.Binary.Length; i++) sb.Append($":{descriptor.Binary[i]:X2}");
sb.AppendLine("[/][/]"); sb.AppendLine("[/][/]");
} }
@@ -582,7 +582,7 @@ public static class EVPD
{ {
sb.AppendFormat($"\t[slateblue1]{Localization.NAA_0_X2}", $"[teal]{descriptor.Binary[0]}"); sb.AppendFormat($"\t[slateblue1]{Localization.NAA_0_X2}", $"[teal]{descriptor.Binary[0]}");
for(int i = 1; i < descriptor.Binary.Length; i++) sb.Append($":{descriptor.Binary[i]:X2}"); for(var i = 1; i < descriptor.Binary.Length; i++) sb.Append($":{descriptor.Binary[i]:X2}");
sb.AppendLine("[/][/]"); sb.AppendLine("[/][/]");
} }
@@ -646,7 +646,7 @@ public static class EVPD
sb.AppendFormat($"\t[slateblue1]{Localization.MD5_logical_unit_identifier_0_x2}", sb.AppendFormat($"\t[slateblue1]{Localization.MD5_logical_unit_identifier_0_x2}",
$"[teal]{descriptor.Binary[0]}"); $"[teal]{descriptor.Binary[0]}");
for(int i = 1; i < descriptor.Binary.Length; i++) sb.Append($"{descriptor.Binary[i]:x2}"); for(var i = 1; i < descriptor.Binary.Length; i++) sb.Append($"{descriptor.Binary[i]:x2}");
sb.AppendLine("[/][/]"); sb.AppendLine("[/][/]");
} }
@@ -866,7 +866,7 @@ public static class EVPD
PageLength = (byte)(pageResponse[3] + 4) PageLength = (byte)(pageResponse[3] + 4)
}; };
int position = 4; var position = 4;
List<SoftwareIdentifier> identifiers = []; List<SoftwareIdentifier> identifiers = [];
while(position < pageResponse.Length) while(position < pageResponse.Length)
@@ -908,7 +908,7 @@ public static class EVPD
{ {
sb.AppendFormat("\t" + "{0:X2}", identifier.Identifier[0]); sb.AppendFormat("\t" + "{0:X2}", identifier.Identifier[0]);
for(int i = 1; i < identifier.Identifier.Length; i++) sb.Append($":{identifier.Identifier[i]:X2}"); for(var i = 1; i < identifier.Identifier.Length; i++) sb.Append($":{identifier.Identifier[i]:X2}");
sb.AppendLine(); sb.AppendLine();
} }
@@ -975,7 +975,7 @@ public static class EVPD
PageLength = (ushort)((pageResponse[2] << 8) + pageResponse[3] + 4) PageLength = (ushort)((pageResponse[2] << 8) + pageResponse[3] + 4)
}; };
int position = 4; var position = 4;
List<NetworkDescriptor> descriptors = []; List<NetworkDescriptor> descriptors = [];
while(position < pageResponse.Length) while(position < pageResponse.Length)
@@ -1796,7 +1796,7 @@ public static class EVPD
CartridgeSerialNumber = new byte[32] CartridgeSerialNumber = new byte[32]
}; };
byte[] buf = new byte[8]; var buf = new byte[8];
Array.Copy(pageResponse, 24, buf, 0, 8); Array.Copy(pageResponse, 24, buf, 0, 8);
decoded.InitiatorID = BitConverter.ToUInt64(buf.Reverse().ToArray(), 0); decoded.InitiatorID = BitConverter.ToUInt64(buf.Reverse().ToArray(), 0);
Array.Copy(pageResponse, 32, decoded.CartridgeSerialNumber, 0, 32); Array.Copy(pageResponse, 32, decoded.CartridgeSerialNumber, 0, 32);
@@ -2205,15 +2205,11 @@ public static class EVPD
List<byte> array = []; List<byte> array = [];
const string fwRegExStr = @"Firmware Rev\s+=\s+(?<fw>\d+\.\d+)\s+Build date\s+=\s+(?<date>(\w|\d|\s*.)*)\s*$"; Regex fwRegEx = HpFirmwareRegex();
Regex fwcRegEx = HpFirmwareConfigurationRegex();
Regex servoRegEx = HpServoRevisionRegex();
const string fwcRegExStr = @"FW_CONF\s+=\s+(?<value>0x[0-9A-Fa-f]{8})\s*$"; for(var pos = 5; pos < pageResponse.Length; pos++)
const string servoRegExStr = @"Servo\s+Rev\s+=\s+(?<version>\d+\.\d+)\s*$";
var fwRegEx = new Regex(fwRegExStr);
var fwcRegEx = new Regex(fwcRegExStr);
var servoRegEx = new Regex(servoRegExStr);
for(int pos = 5; pos < pageResponse.Length; pos++)
{ {
if(pageResponse[pos] == 0x00) if(pageResponse[pos] == 0x00)
{ {
@@ -2383,5 +2379,14 @@ public static class EVPD
return sb.ToString(); return sb.ToString();
} }
[GeneratedRegex(@"Firmware Rev\s+=\s+(?<fw>\d+\.\d+)\s+Build date\s+=\s+(?<date>(\w|\d|\s*.)*)\s*$")]
private static partial Regex HpFirmwareRegex();
[GeneratedRegex(@"FW_CONF\s+=\s+(?<value>0x[0-9A-Fa-f]{8})\s*$")]
private static partial Regex HpFirmwareConfigurationRegex();
[GeneratedRegex(@"Servo\s+Rev\s+=\s+(?<version>\d+\.\d+)\s*$")]
private static partial Regex HpServoRevisionRegex();
#endregion EVPD Page 0xC0 (Seagate): Firmware numbers page #endregion EVPD Page 0xC0 (Seagate): Firmware numbers page
} }

View File

@@ -19,7 +19,7 @@ using Aaru.Logging;
namespace Aaru.Images; namespace Aaru.Images;
[SuppressMessage("ReSharper", "UnusedType.Global")] [SuppressMessage("ReSharper", "UnusedType.Global")]
public class Nes : IByteAddressableImage public partial class Nes : IByteAddressableImage
{ {
int _chrLen; int _chrLen;
int _chrNvramLen; int _chrNvramLen;
@@ -740,7 +740,7 @@ public class Nes : IByteAddressableImage
break; break;
case LinearMemoryType.Mapper when !foundMapper: case LinearMemoryType.Mapper when !foundMapper:
regex = new Regex(@"NES Mapper ?(<mapper>\d+)"); regex = MapperRegex();
match = regex.Match(map.Description); match = regex.Match(map.Description);
if(match.Success) if(match.Success)
@@ -758,7 +758,7 @@ public class Nes : IByteAddressableImage
break; break;
case LinearMemoryType.Mapper when !foundSubMapper: case LinearMemoryType.Mapper when !foundSubMapper:
regex = new Regex(@"NES Sub-Mapper ?(<mapper>\d+)"); regex = SubmapperRegex();
match = regex.Match(map.Description); match = regex.Match(map.Description);
if(match.Success) if(match.Success)
@@ -869,5 +869,11 @@ public class Nes : IByteAddressableImage
return ErrorNumber.NoError; return ErrorNumber.NoError;
} }
[GeneratedRegex(@"NES Mapper ?(<mapper>\d+)")]
private static partial Regex MapperRegex();
[GeneratedRegex(@"NES Sub-Mapper ?(<mapper>\d+)")]
private static partial Regex SubmapperRegex();
#endregion #endregion
} }

View File

@@ -30,6 +30,8 @@
// Copyright © 2011-2025 Natalia Portillo // Copyright © 2011-2025 Natalia Portillo
// ****************************************************************************/ // ****************************************************************************/
using System.Text.RegularExpressions;
namespace Aaru.Images; namespace Aaru.Images;
public sealed partial class Cdrdao public sealed partial class Cdrdao
@@ -106,4 +108,88 @@ public sealed partial class Cdrdao
const string REGEX_LANGUAGE = @"^\s*LANGUAGE\s*(?<code>\d+)\s*\{"; const string REGEX_LANGUAGE = @"^\s*LANGUAGE\s*(?<code>\d+)\s*\{";
const string REGEX_LANGUAGE_MAP = @"^\s*LANGUAGE_MAP\s*\{"; const string REGEX_LANGUAGE_MAP = @"^\s*LANGUAGE_MAP\s*\{";
const string REGEX_LANGUAGE_MAPPING = @"^\s*(?<code>\d+)\s?\:\s?(?<language>\d+|\w+)"; const string REGEX_LANGUAGE_MAPPING = @"^\s*(?<code>\d+)\s?\:\s?(?<language>\d+|\w+)";
[GeneratedRegex(REGEX_COMMENT)]
private static partial Regex CommentRegex();
[GeneratedRegex(REGEX_DISCTYPE)]
private static partial Regex DiscTypeRegex();
[GeneratedRegex(REGEX_MCN)]
private static partial Regex McnRegex();
[GeneratedRegex(REGEX_TRACK)]
private static partial Regex TrackRegex();
[GeneratedRegex(REGEX_COPY)]
private static partial Regex CopyRegex();
[GeneratedRegex(REGEX_EMPHASIS)]
private static partial Regex EmphasisRegex();
[GeneratedRegex(REGEX_STEREO)]
private static partial Regex StereoRegex();
[GeneratedRegex(REGEX_ISRC)]
private static partial Regex IsrcRegex();
[GeneratedRegex(REGEX_INDEX)]
private static partial Regex IndexRegex();
[GeneratedRegex(REGEX_PREGAP)]
private static partial Regex PregapRegex();
[GeneratedRegex(REGEX_ZERO_PREGAP)]
private static partial Regex ZeroPregapRegex();
[GeneratedRegex(REGEX_ZERO_DATA)]
private static partial Regex ZeroDataRegex();
[GeneratedRegex(REGEX_ZERO_AUDIO)]
private static partial Regex ZeroAudioRegex();
[GeneratedRegex(REGEX_FILE_AUDIO)]
private static partial Regex FileAudioRegex();
[GeneratedRegex(REGEX_FILE_DATA)]
private static partial Regex FileDataRegex();
[GeneratedRegex(REGEX_TITLE)]
private static partial Regex TitleRegex();
[GeneratedRegex(REGEX_PERFORMER)]
private static partial Regex PerformerRegex();
[GeneratedRegex(REGEX_SONGWRITER)]
private static partial Regex SongwriterRegex();
[GeneratedRegex(REGEX_COMPOSER)]
private static partial Regex ComposerRegex();
[GeneratedRegex(REGEX_ARRANGER)]
private static partial Regex ArrangerRegex();
[GeneratedRegex(REGEX_MESSAGE)]
private static partial Regex MessageRegex();
[GeneratedRegex(REGEX_DISC_ID)]
private static partial Regex DiscIdRegex();
[GeneratedRegex(REGEX_UPC)]
private static partial Regex UpcRegex();
[GeneratedRegex(REGEX_CD_TEXT)]
private static partial Regex CdTextRegex();
[GeneratedRegex(REGEX_LANGUAGE)]
private static partial Regex LanguageRegex();
[GeneratedRegex(REGEX_CLOSURE)]
private static partial Regex ClosureRegex();
[GeneratedRegex(REGEX_LANGUAGE_MAP)]
private static partial Regex LanguageMapRegex();
[GeneratedRegex(REGEX_LANGUAGE_MAPPING)]
private static partial Regex LanguageMappingRegex();
} }

View File

@@ -49,14 +49,14 @@ public sealed partial class Cdrdao
try try
{ {
imageFilter.GetDataForkStream().Seek(0, SeekOrigin.Begin); imageFilter.GetDataForkStream().Seek(0, SeekOrigin.Begin);
byte[] testArray = new byte[512]; var testArray = new byte[512];
imageFilter.GetDataForkStream().EnsureRead(testArray, 0, 512); imageFilter.GetDataForkStream().EnsureRead(testArray, 0, 512);
imageFilter.GetDataForkStream().Seek(0, SeekOrigin.Begin); imageFilter.GetDataForkStream().Seek(0, SeekOrigin.Begin);
// Check for unexpected control characters that shouldn't be present in a text file and can crash this plugin // Check for unexpected control characters that shouldn't be present in a text file and can crash this plugin
bool twoConsecutiveNulls = false; var twoConsecutiveNulls = false;
for(int i = 0; i < 512; i++) for(var i = 0; i < 512; i++)
{ {
if(i >= imageFilter.GetDataForkStream().Length) break; if(i >= imageFilter.GetDataForkStream().Length) break;
@@ -75,8 +75,8 @@ public sealed partial class Cdrdao
_tocStream = new StreamReader(imageFilter.GetDataForkStream()); _tocStream = new StreamReader(imageFilter.GetDataForkStream());
var cr = new Regex(REGEX_COMMENT); Regex cr = CommentRegex();
var dr = new Regex(REGEX_DISCTYPE); Regex dr = DiscTypeRegex();
while(_tocStream.Peek() >= 0) while(_tocStream.Peek() >= 0)
{ {

View File

@@ -64,34 +64,34 @@ public sealed partial class Cdrdao
var inTrack = false; var inTrack = false;
// Initialize all RegExs // Initialize all RegExs
var regexComment = new Regex(REGEX_COMMENT); Regex regexComment = CommentRegex();
var regexDiskType = new Regex(REGEX_DISCTYPE); Regex regexDiskType = DiscTypeRegex();
var regexMcn = new Regex(REGEX_MCN); Regex regexMcn = McnRegex();
var regexTrack = new Regex(REGEX_TRACK); Regex regexTrack = TrackRegex();
var regexCopy = new Regex(REGEX_COPY); Regex regexCopy = CopyRegex();
var regexEmphasis = new Regex(REGEX_EMPHASIS); Regex regexEmphasis = EmphasisRegex();
var regexStereo = new Regex(REGEX_STEREO); Regex regexStereo = StereoRegex();
var regexIsrc = new Regex(REGEX_ISRC); Regex regexIsrc = IsrcRegex();
var regexIndex = new Regex(REGEX_INDEX); Regex regexIndex = IndexRegex();
var regexPregap = new Regex(REGEX_PREGAP); Regex regexPregap = PregapRegex();
var regexZeroPregap = new Regex(REGEX_ZERO_PREGAP); Regex regexZeroPregap = ZeroPregapRegex();
var regexZeroData = new Regex(REGEX_ZERO_DATA); Regex regexZeroData = ZeroDataRegex();
var regexZeroAudio = new Regex(REGEX_ZERO_AUDIO); Regex regexZeroAudio = ZeroAudioRegex();
var regexAudioFile = new Regex(REGEX_FILE_AUDIO); Regex regexAudioFile = FileAudioRegex();
var regexFile = new Regex(REGEX_FILE_DATA); Regex regexFile = FileDataRegex();
var regexTitle = new Regex(REGEX_TITLE); Regex regexTitle = TitleRegex();
var regexPerformer = new Regex(REGEX_PERFORMER); Regex regexPerformer = PerformerRegex();
var regexSongwriter = new Regex(REGEX_SONGWRITER); Regex regexSongwriter = SongwriterRegex();
var regexComposer = new Regex(REGEX_COMPOSER); Regex regexComposer = ComposerRegex();
var regexArranger = new Regex(REGEX_ARRANGER); Regex regexArranger = ArrangerRegex();
var regexMessage = new Regex(REGEX_MESSAGE); Regex regexMessage = MessageRegex();
var regexDiscId = new Regex(REGEX_DISC_ID); Regex regexDiscId = DiscIdRegex();
var regexUpc = new Regex(REGEX_UPC); Regex regexUpc = UpcRegex();
var regexCdText = new Regex(REGEX_CD_TEXT); Regex regexCdText = CdTextRegex();
var regexLanguage = new Regex(REGEX_LANGUAGE); Regex regexLanguage = LanguageRegex();
var regexClosure = new Regex(REGEX_CLOSURE); Regex regexClosure = ClosureRegex();
var regexLanguageMap = new Regex(REGEX_LANGUAGE_MAP); Regex regexLanguageMap = LanguageMapRegex();
var regexLanguageMapping = new Regex(REGEX_LANGUAGE_MAPPING); Regex regexLanguageMapping = LanguageMappingRegex();
// Initialize all RegEx matches // Initialize all RegEx matches
Match matchComment; Match matchComment;

View File

@@ -30,6 +30,8 @@
// Copyright © 2011-2025 Natalia Portillo // Copyright © 2011-2025 Natalia Portillo
// ****************************************************************************/ // ****************************************************************************/
using System.Text.RegularExpressions;
namespace Aaru.Images; namespace Aaru.Images;
public sealed partial class CdrWin public sealed partial class CdrWin
@@ -181,4 +183,118 @@ public sealed partial class CdrWin
const string REGEX_APPLICATION_VERSION = @"\bREM\s+Ripping Tool Version:\s+(?<application>.+)$"; const string REGEX_APPLICATION_VERSION = @"\bREM\s+Ripping Tool Version:\s+(?<application>.+)$";
const string REGEX_DUMP_EXTENT = const string REGEX_DUMP_EXTENT =
@"\bREM\s+METADATA DUMP EXTENT:\s+(?<application>.+)\s+\|\s+(?<version>.+)\s+\|\s+(?<os>.+)\s+\|\s+(?<manufacturer>.+)\s+\|\s+(?<model>.+)\s+\|\s+(?<firmware>.+)\s+\|\s+(?<serial>.+)\s+\|\s+(?<start>\d+):(?<end>\d+)$"; @"\bREM\s+METADATA DUMP EXTENT:\s+(?<application>.+)\s+\|\s+(?<version>.+)\s+\|\s+(?<os>.+)\s+\|\s+(?<manufacturer>.+)\s+\|\s+(?<model>.+)\s+\|\s+(?<firmware>.+)\s+\|\s+(?<serial>.+)\s+\|\s+(?<start>\d+):(?<end>\d+)$";
[GeneratedRegex(REGEX_SESSION)]
private static partial Regex SessionRegex();
[GeneratedRegex(REGEX_COMMENT)]
private static partial Regex CommentRegex();
[GeneratedRegex(REGEX_MCN)]
private static partial Regex McnRegex();
[GeneratedRegex(REGEX_FILE)]
private static partial Regex FileRegex();
[GeneratedRegex(REGEX_CDTEXT)]
private static partial Regex CdtextRegex();
[GeneratedRegex(REGEX_MEDIA_TYPE)]
private static partial Regex MediaTypeRegex();
[GeneratedRegex(REGEX_LEAD_OUT)]
private static partial Regex LeadOutRegex();
[GeneratedRegex(REGEX_LBA)]
private static partial Regex LbaRegex();
[GeneratedRegex(REGEX_DISC_ID)]
private static partial Regex DiscIdRegex();
[GeneratedRegex(REGEX_BARCODE)]
private static partial Regex BarcodeRegex();
[GeneratedRegex(REGEX_TITLE)]
private static partial Regex TitleRegex();
[GeneratedRegex(REGEX_GENRE)]
private static partial Regex GenreRegex();
[GeneratedRegex(REGEX_ARRANGER)]
private static partial Regex ArrangerRegex();
[GeneratedRegex(REGEX_COMPOSER)]
private static partial Regex ComposerRegex();
[GeneratedRegex(REGEX_PERFORMER)]
private static partial Regex PerformerRegex();
[GeneratedRegex(REGEX_SONGWRITER)]
private static partial Regex SongwriterRegex();
[GeneratedRegex(REGEX_TRACK)]
private static partial Regex TrackRegex();
[GeneratedRegex(REGEX_ISRC)]
private static partial Regex IsrcRegex();
[GeneratedRegex(REGEX_INDEX)]
private static partial Regex IndexRegex();
[GeneratedRegex(REGEX_PREGAP)]
private static partial Regex PregapRegex();
[GeneratedRegex(REGEX_POSTGAP)]
private static partial Regex PostgapRegex();
[GeneratedRegex(REGEX_FLAGS)]
private static partial Regex FlagsRegex();
[GeneratedRegex(REGEX_APPLICATION)]
private static partial Regex ApplicationRegex();
[GeneratedRegex(REGEX_TRURIP_DISC_HASHES)]
private static partial Regex TruripDiscHashesRegex();
[GeneratedRegex(REGEX_TRURIP_DISC_CRC32)]
private static partial Regex TruripDiscCrc32Regex();
[GeneratedRegex(REGEX_TRURIP_DISC_MD5)]
private static partial Regex TruripDiscMd5Regex();
[GeneratedRegex(REGEX_TRURIP_DISC_SHA1)]
private static partial Regex TruripDiscSha1Regex();
[GeneratedRegex(REGEX_TRURIP_TRACK_METHOD)]
private static partial Regex TruripTrackMethodRegex();
[GeneratedRegex(REGEX_TRURIP_TRACK_CRC32)]
private static partial Regex TruripTrackCrc32Regex();
[GeneratedRegex(REGEX_TRURIP_TRACK_MD5)]
private static partial Regex TruripTrackMd5Regex();
[GeneratedRegex(REGEX_TRURIP_TRACK_SHA1)]
private static partial Regex TruripTrackSha1Regex();
[GeneratedRegex(REGEX_TRURIP_TRACK_UNKNOWN)]
private static partial Regex TruripTrackUnknownRegex();
[GeneratedRegex(REGEX_DIC_MEDIA_TYPE)]
private static partial Regex DicMediaTypeRegex();
[GeneratedRegex(REGEX_APPLICATION_VERSION)]
private static partial Regex ApplicationVersionRegex();
[GeneratedRegex(REGEX_DUMP_EXTENT)]
private static partial Regex DumpExtentRegex();
[GeneratedRegex(REGEX_AARU_MEDIA_TYPE)]
private static partial Regex AaruMediaTypeRegex();
[GeneratedRegex(REGEX_REDUMP_SD_AREA)]
private static partial Regex RedumpSdAreaRegex();
[GeneratedRegex(REGEX_REDUMP_HD_AREA)]
private static partial Regex RedumpHdAreaRegex();
} }

View File

@@ -52,14 +52,14 @@ public sealed partial class CdrWin
try try
{ {
imageFilter.GetDataForkStream().Seek(0, SeekOrigin.Begin); imageFilter.GetDataForkStream().Seek(0, SeekOrigin.Begin);
byte[] testArray = new byte[512]; var testArray = new byte[512];
imageFilter.GetDataForkStream().EnsureRead(testArray, 0, 512); imageFilter.GetDataForkStream().EnsureRead(testArray, 0, 512);
imageFilter.GetDataForkStream().Seek(0, SeekOrigin.Begin); imageFilter.GetDataForkStream().Seek(0, SeekOrigin.Begin);
// Check for unexpected control characters that shouldn't be present in a text file and can crash this plugin // Check for unexpected control characters that shouldn't be present in a text file and can crash this plugin
bool twoConsecutiveNulls = false; var twoConsecutiveNulls = false;
for(int i = 0; i < 512; i++) for(var i = 0; i < 512; i++)
{ {
if(i >= imageFilter.GetDataForkStream().Length) break; if(i >= imageFilter.GetDataForkStream().Length) break;
@@ -82,11 +82,11 @@ public sealed partial class CdrWin
{ {
string line = _cueStream.ReadLine(); string line = _cueStream.ReadLine();
var sr = new Regex(REGEX_SESSION); Regex sr = SessionRegex();
var rr = new Regex(REGEX_COMMENT); Regex rr = CommentRegex();
var cr = new Regex(REGEX_MCN); Regex cr = McnRegex();
var fr = new Regex(REGEX_FILE); Regex fr = FileRegex();
var tr = new Regex(REGEX_CDTEXT); Regex tr = CdtextRegex();
// First line must be SESSION, REM, CATALOG, FILE or CDTEXTFILE. // First line must be SESSION, REM, CATALOG, FILE or CDTEXTFILE.
Match sm = sr.Match(line ?? ""); Match sm = sr.Match(line ?? "");

View File

@@ -70,44 +70,44 @@ public sealed partial class CdrWin
byte currentSession = 1; byte currentSession = 1;
// Initialize all RegExs // Initialize all RegExs
var regexSession = new Regex(REGEX_SESSION); Regex regexSession = SessionRegex();
var regexDiskType = new Regex(REGEX_MEDIA_TYPE); Regex regexDiskType = MediaTypeRegex();
var regexLeadOut = new Regex(REGEX_LEAD_OUT); Regex regexLeadOut = LeadOutRegex();
var regexLba = new Regex(REGEX_LBA); Regex regexLba = LbaRegex();
var regexDiskId = new Regex(REGEX_DISC_ID); Regex regexDiskId = DiscIdRegex();
var regexBarCode = new Regex(REGEX_BARCODE); Regex regexBarCode = BarcodeRegex();
var regexComment = new Regex(REGEX_COMMENT); Regex regexComment = CommentRegex();
var regexCdText = new Regex(REGEX_CDTEXT); Regex regexCdText = CdtextRegex();
var regexMcn = new Regex(REGEX_MCN); Regex regexMcn = McnRegex();
var regexTitle = new Regex(REGEX_TITLE); Regex regexTitle = TitleRegex();
var regexGenre = new Regex(REGEX_GENRE); Regex regexGenre = GenreRegex();
var regexArranger = new Regex(REGEX_ARRANGER); Regex regexArranger = ArrangerRegex();
var regexComposer = new Regex(REGEX_COMPOSER); Regex regexComposer = ComposerRegex();
var regexPerformer = new Regex(REGEX_PERFORMER); Regex regexPerformer = PerformerRegex();
var regexSongWriter = new Regex(REGEX_SONGWRITER); Regex regexSongWriter = SongwriterRegex();
var regexFile = new Regex(REGEX_FILE); Regex regexFile = FileRegex();
var regexTrack = new Regex(REGEX_TRACK); Regex regexTrack = TrackRegex();
var regexIsrc = new Regex(REGEX_ISRC); Regex regexIsrc = IsrcRegex();
var regexIndex = new Regex(REGEX_INDEX); Regex regexIndex = IndexRegex();
var regexPregap = new Regex(REGEX_PREGAP); Regex regexPregap = PregapRegex();
var regexPostgap = new Regex(REGEX_POSTGAP); Regex regexPostgap = PostgapRegex();
var regexFlags = new Regex(REGEX_FLAGS); Regex regexFlags = FlagsRegex();
var regexApplication = new Regex(REGEX_APPLICATION); Regex regexApplication = ApplicationRegex();
var regexTruripDisc = new Regex(REGEX_TRURIP_DISC_HASHES); Regex regexTruripDisc = TruripDiscHashesRegex();
var regexTruripDiscCrc32 = new Regex(REGEX_TRURIP_DISC_CRC32); Regex regexTruripDiscCrc32 = TruripDiscCrc32Regex();
var regexTruripDiscMd5 = new Regex(REGEX_TRURIP_DISC_MD5); Regex regexTruripDiscMd5 = TruripDiscMd5Regex();
var regexTruripDiscSha1 = new Regex(REGEX_TRURIP_DISC_SHA1); Regex regexTruripDiscSha1 = TruripDiscSha1Regex();
var regexTruripTrack = new Regex(REGEX_TRURIP_TRACK_METHOD); Regex regexTruripTrack = TruripTrackMethodRegex();
var regexTruripTrackCrc32 = new Regex(REGEX_TRURIP_TRACK_CRC32); Regex regexTruripTrackCrc32 = TruripTrackCrc32Regex();
var regexTruripTrackMd5 = new Regex(REGEX_TRURIP_TRACK_MD5); Regex regexTruripTrackMd5 = TruripTrackMd5Regex();
var regexTruripTrackSha1 = new Regex(REGEX_TRURIP_TRACK_SHA1); Regex regexTruripTrackSha1 = TruripTrackSha1Regex();
var regexTruripTrackUnknownHash = new Regex(REGEX_TRURIP_TRACK_UNKNOWN); Regex regexTruripTrackUnknownHash = TruripTrackUnknownRegex();
var regexDicMediaType = new Regex(REGEX_DIC_MEDIA_TYPE); Regex regexDicMediaType = DicMediaTypeRegex();
var regexApplicationVersion = new Regex(REGEX_APPLICATION_VERSION); Regex regexApplicationVersion = ApplicationVersionRegex();
var regexDumpExtent = new Regex(REGEX_DUMP_EXTENT); Regex regexDumpExtent = DumpExtentRegex();
var regexAaruMediaType = new Regex(REGEX_AARU_MEDIA_TYPE); Regex regexAaruMediaType = AaruMediaTypeRegex();
var regexRedumpSdArea = new Regex(REGEX_REDUMP_SD_AREA); Regex regexRedumpSdArea = RedumpSdAreaRegex();
var regexRedumpHdArea = new Regex(REGEX_REDUMP_HD_AREA); Regex regexRedumpHdArea = RedumpHdAreaRegex();
// Initialize all RegEx matches // Initialize all RegEx matches
Match matchTrack; Match matchTrack;

View File

@@ -31,6 +31,7 @@
// ****************************************************************************/ // ****************************************************************************/
using System.Diagnostics.CodeAnalysis; using System.Diagnostics.CodeAnalysis;
using System.Text.RegularExpressions;
namespace Aaru.Images; namespace Aaru.Images;
@@ -92,4 +93,16 @@ public sealed partial class Chd
const string TRACK_TYPE_AUDIO = "AUDIO"; const string TRACK_TYPE_AUDIO = "AUDIO";
// ReSharper restore InconsistentNaming // ReSharper restore InconsistentNaming
[GeneratedRegex(REGEX_METADATA_HDD)]
private static partial Regex MetadataHddRegex();
[GeneratedRegex(REGEX_METADATA_CDROM)]
private static partial Regex MetadataCdromRegex();
[GeneratedRegex(REGEX_METADATA_CDROM2)]
private static partial Regex MetadataCdrom2Regex();
[GeneratedRegex(REGEX_METADATA_GDROM)]
private static partial Regex MetadataGdromRegex();
} }

View File

@@ -498,7 +498,7 @@ public sealed partial class Chd
} }
string gddd = StringHandlers.CToString(meta); string gddd = StringHandlers.CToString(meta);
var gdddRegEx = new Regex(REGEX_METADATA_HDD); Regex gdddRegEx = MetadataHddRegex();
Match gdddMatch = gdddRegEx.Match(gddd); Match gdddMatch = gdddRegEx.Match(gddd);
if(gdddMatch.Success) if(gdddMatch.Success)
@@ -671,7 +671,7 @@ public sealed partial class Chd
} }
string chtr = StringHandlers.CToString(meta); string chtr = StringHandlers.CToString(meta);
var chtrRegEx = new Regex(REGEX_METADATA_CDROM); Regex chtrRegEx = MetadataCdromRegex();
Match chtrMatch = chtrRegEx.Match(chtr); Match chtrMatch = chtrRegEx.Match(chtr);
if(chtrMatch.Success) if(chtrMatch.Success)
@@ -816,7 +816,7 @@ public sealed partial class Chd
} }
string cht2 = StringHandlers.CToString(meta); string cht2 = StringHandlers.CToString(meta);
var cht2RegEx = new Regex(REGEX_METADATA_CDROM2); Regex cht2RegEx = MetadataCdrom2Regex();
Match cht2Match = cht2RegEx.Match(cht2); Match cht2Match = cht2RegEx.Match(cht2);
if(cht2Match.Success) if(cht2Match.Success)
@@ -1001,7 +1001,7 @@ public sealed partial class Chd
} }
string chgd = StringHandlers.CToString(meta); string chgd = StringHandlers.CToString(meta);
var chgdRegEx = new Regex(REGEX_METADATA_GDROM); Regex chgdRegEx = MetadataGdromRegex();
Match chgdMatch = chgdRegEx.Match(chgd); Match chgdMatch = chgdRegEx.Match(chgd);
if(chgdMatch.Success) if(chgdMatch.Success)

View File

@@ -30,6 +30,8 @@
// Copyright © 2011-2025 Natalia Portillo // Copyright © 2011-2025 Natalia Portillo
// ****************************************************************************/ // ****************************************************************************/
using System.Text.RegularExpressions;
namespace Aaru.Images; namespace Aaru.Images;
public sealed partial class CloneCd public sealed partial class CloneCd
@@ -66,4 +68,100 @@ public sealed partial class CloneCd
const string CDTEXT_ENTRY = @"^\s*Entry\s*(?<number>\d+)\s*=\s*(?<value>([0-9a-fA-F]+\s*)+)"; const string CDTEXT_ENTRY = @"^\s*Entry\s*(?<number>\d+)\s*=\s*(?<value>([0-9a-fA-F]+\s*)+)";
const string TRACK_MODE = @"^\s*MODE\s*=\s*(?<value>\d+)"; const string TRACK_MODE = @"^\s*MODE\s*=\s*(?<value>\d+)";
const string TRACK_INDEX = @"^\s*INDEX\s*(?<index>\d+)\s*=\s*(?<lba>\d+)"; const string TRACK_INDEX = @"^\s*INDEX\s*(?<index>\d+)\s*=\s*(?<lba>\d+)";
[GeneratedRegex(CCD_IDENTIFIER)]
private static partial Regex CcdIdentifierRegex();
[GeneratedRegex(DISC_IDENTIFIER)]
private static partial Regex DiscIdentifierRegex();
[GeneratedRegex(SESSION_IDENTIFIER)]
private static partial Regex SessionIdentifierRegex();
[GeneratedRegex(ENTRY_IDENTIFIER)]
private static partial Regex EntryIdentifierRegex();
[GeneratedRegex(TRACK_IDENTIFIER)]
private static partial Regex TrackIdentifierRegex();
[GeneratedRegex(CDTEXT_IDENTIFIER)]
private static partial Regex CdtextIdentifierRegex();
[GeneratedRegex(CCD_VERSION)]
private static partial Regex CcdVersionRegex();
[GeneratedRegex(DISC_ENTRIES)]
private static partial Regex DiscEntriesRegex();
[GeneratedRegex(DISC_SESSIONS)]
private static partial Regex DiscSessionsRegex();
[GeneratedRegex(DISC_SCRAMBLED)]
private static partial Regex DiscScrambledRegex();
[GeneratedRegex(CDTEXT_LENGTH)]
private static partial Regex CdtextLengthRegex();
[GeneratedRegex(DISC_CATALOG)]
private static partial Regex DiscCatalogRegex();
[GeneratedRegex(SESSION_PREGAP)]
private static partial Regex SesionPregapRegex();
[GeneratedRegex(SESSION_SUBCHANNEL)]
private static partial Regex SessionSubchannelRegex();
[GeneratedRegex(ENTRY_SESSION)]
private static partial Regex EntrySessionRegex();
[GeneratedRegex(ENTRY_POINT)]
private static partial Regex EntryPointRegex();
[GeneratedRegex(ENTRY_ADR)]
private static partial Regex EntryAdrRegex();
[GeneratedRegex(ENTRY_CONTROL)]
private static partial Regex EntryControlRegex();
[GeneratedRegex(ENTRY_TRACKNO)]
private static partial Regex EntryTracknoRegex();
[GeneratedRegex(ENTRY_AMIN)]
private static partial Regex EntryAminRegex();
[GeneratedRegex(ENTRY_ASEC)]
private static partial Regex EntryAsecRegex();
[GeneratedRegex(ENTRY_AFRAME)]
private static partial Regex EntryAframeRegex();
[GeneratedRegex(ENTRY_ALBA)]
private static partial Regex EntryAlbaRegex();
[GeneratedRegex(ENTRY_ZERO)]
private static partial Regex EntryZeroRegex();
[GeneratedRegex(ENTRY_PMIN)]
private static partial Regex EntryPminRegex();
[GeneratedRegex(ENTRY_PSEC)]
private static partial Regex EntryPsecRegex();
[GeneratedRegex(ENTRY_PFRAME)]
private static partial Regex EntryPframeRegex();
[GeneratedRegex(ENTRY_PLBA)]
private static partial Regex EntryPlbaRegex();
[GeneratedRegex(CDTEXT_ENTRIES)]
private static partial Regex CdtextEntriesRegex();
[GeneratedRegex(CDTEXT_ENTRY)]
private static partial Regex CdtextEntryRegex();
[GeneratedRegex(TRACK_MODE)]
private static partial Regex TrackModeRegex();
[GeneratedRegex(TRACK_INDEX)]
private static partial Regex TrackIndexRegex();
} }

View File

@@ -51,14 +51,14 @@ public sealed partial class CloneCd
try try
{ {
imageFilter.GetDataForkStream().Seek(0, SeekOrigin.Begin); imageFilter.GetDataForkStream().Seek(0, SeekOrigin.Begin);
byte[] testArray = new byte[512]; var testArray = new byte[512];
imageFilter.GetDataForkStream().EnsureRead(testArray, 0, 512); imageFilter.GetDataForkStream().EnsureRead(testArray, 0, 512);
imageFilter.GetDataForkStream().Seek(0, SeekOrigin.Begin); imageFilter.GetDataForkStream().Seek(0, SeekOrigin.Begin);
// Check for unexpected control characters that shouldn't be present in a text file and can crash this plugin // Check for unexpected control characters that shouldn't be present in a text file and can crash this plugin
bool twoConsecutiveNulls = false; var twoConsecutiveNulls = false;
for(int i = 0; i < 512; i++) for(var i = 0; i < 512; i++)
{ {
if(i >= imageFilter.GetDataForkStream().Length) break; if(i >= imageFilter.GetDataForkStream().Length) break;
@@ -79,7 +79,7 @@ public sealed partial class CloneCd
string line = _cueStream.ReadLine(); string line = _cueStream.ReadLine();
var hdr = new Regex(CCD_IDENTIFIER); Regex hdr = CcdIdentifierRegex();
Match hdm = hdr.Match(line ?? ""); Match hdm = hdr.Match(line ?? "");

View File

@@ -64,38 +64,38 @@ public sealed partial class CloneCd
_cueStream = new StreamReader(imageFilter.GetDataForkStream()); _cueStream = new StreamReader(imageFilter.GetDataForkStream());
var lineNumber = 0; var lineNumber = 0;
var ccdIdRegex = new Regex(CCD_IDENTIFIER); Regex ccdIdRegex = CcdIdentifierRegex();
var discIdRegex = new Regex(DISC_IDENTIFIER); Regex discIdRegex = DiscIdentifierRegex();
var sessIdRegex = new Regex(SESSION_IDENTIFIER); Regex sessIdRegex = SessionIdentifierRegex();
var entryIdRegex = new Regex(ENTRY_IDENTIFIER); Regex entryIdRegex = EntryIdentifierRegex();
var trackIdRegex = new Regex(TRACK_IDENTIFIER); Regex trackIdRegex = TrackIdentifierRegex();
var cdtIdRegex = new Regex(CDTEXT_IDENTIFIER); Regex cdtIdRegex = CdtextIdentifierRegex();
var ccdVerRegex = new Regex(CCD_VERSION); Regex ccdVerRegex = CcdVersionRegex();
var discEntRegex = new Regex(DISC_ENTRIES); Regex discEntRegex = DiscEntriesRegex();
var discSessRegex = new Regex(DISC_SESSIONS); Regex discSessRegex = DiscSessionsRegex();
var discScrRegex = new Regex(DISC_SCRAMBLED); Regex discScrRegex = DiscScrambledRegex();
var cdtLenRegex = new Regex(CDTEXT_LENGTH); Regex cdtLenRegex = CdtextLengthRegex();
var discCatRegex = new Regex(DISC_CATALOG); Regex discCatRegex = DiscCatalogRegex();
var sessPregRegex = new Regex(SESSION_PREGAP); Regex sessPregRegex = SesionPregapRegex();
var sessSubcRegex = new Regex(SESSION_SUBCHANNEL); Regex sessSubcRegex = SessionSubchannelRegex();
var entSessRegex = new Regex(ENTRY_SESSION); Regex entSessRegex = EntrySessionRegex();
var entPointRegex = new Regex(ENTRY_POINT); Regex entPointRegex = EntryPointRegex();
var entAdrRegex = new Regex(ENTRY_ADR); Regex entAdrRegex = EntryAdrRegex();
var entCtrlRegex = new Regex(ENTRY_CONTROL); Regex entCtrlRegex = EntryControlRegex();
var entTnoRegex = new Regex(ENTRY_TRACKNO); Regex entTnoRegex = EntryTracknoRegex();
var entAMinRegex = new Regex(ENTRY_AMIN); Regex entAMinRegex = EntryAminRegex();
var entASecRegex = new Regex(ENTRY_ASEC); Regex entASecRegex = EntryAsecRegex();
var entAFrameRegex = new Regex(ENTRY_AFRAME); Regex entAFrameRegex = EntryAframeRegex();
var entAlbaRegex = new Regex(ENTRY_ALBA); Regex entAlbaRegex = EntryAlbaRegex();
var entZeroRegex = new Regex(ENTRY_ZERO); Regex entZeroRegex = EntryZeroRegex();
var entPMinRegex = new Regex(ENTRY_PMIN); Regex entPMinRegex = EntryPminRegex();
var entPSecRegex = new Regex(ENTRY_PSEC); Regex entPSecRegex = EntryPsecRegex();
var entPFrameRegex = new Regex(ENTRY_PFRAME); Regex entPFrameRegex = EntryPframeRegex();
var entPlbaRegex = new Regex(ENTRY_PLBA); Regex entPlbaRegex = EntryPlbaRegex();
var cdtEntsRegex = new Regex(CDTEXT_ENTRIES); Regex cdtEntsRegex = CdtextEntriesRegex();
var cdtEntRegex = new Regex(CDTEXT_ENTRY); Regex cdtEntRegex = CdtextEntryRegex();
var trkModeRegex = new Regex(TRACK_MODE); Regex trkModeRegex = TrackModeRegex();
var trkIndexRegex = new Regex(TRACK_INDEX); Regex trkIndexRegex = TrackIndexRegex();
var inCcd = false; var inCcd = false;
var inDisk = false; var inDisk = false;

View File

@@ -30,6 +30,8 @@
// Copyright © 2011-2025 Natalia Portillo // Copyright © 2011-2025 Natalia Portillo
// ****************************************************************************/ // ****************************************************************************/
using System.Text.RegularExpressions;
namespace Aaru.Images; namespace Aaru.Images;
public sealed partial class CopyTape public sealed partial class CopyTape
@@ -38,4 +40,16 @@ public sealed partial class CopyTape
const string PARTIAL_BLOCK_REGEX = @"^CPTP:BLK $"; const string PARTIAL_BLOCK_REGEX = @"^CPTP:BLK $";
const string FILEMARK_REGEX = @"^CPTP:MRK\n$"; const string FILEMARK_REGEX = @"^CPTP:MRK\n$";
const string END_OF_TAPE_REGEX = @"^CPTP:EOT\n$"; const string END_OF_TAPE_REGEX = @"^CPTP:EOT\n$";
[GeneratedRegex(BLOCK_REGEX)]
private static partial Regex BlockRegex();
[GeneratedRegex(PARTIAL_BLOCK_REGEX)]
private static partial Regex PartialBlockRegex();
[GeneratedRegex(FILEMARK_REGEX)]
private static partial Regex FilemarkRegex();
[GeneratedRegex(END_OF_TAPE_REGEX)]
private static partial Regex EndOfTapeRegex();
} }

View File

@@ -55,7 +55,7 @@ public sealed partial class CopyTape
string mark = Encoding.ASCII.GetString(header); string mark = Encoding.ASCII.GetString(header);
var blockRx = new Regex(BLOCK_REGEX); Regex blockRx = BlockRegex();
Match blockMt = blockRx.Match(mark); Match blockMt = blockRx.Match(mark);
if(!blockMt.Success) return false; if(!blockMt.Success) return false;

View File

@@ -51,10 +51,10 @@ public sealed partial class CopyTape
public ErrorNumber Open(IFilter imageFilter) public ErrorNumber Open(IFilter imageFilter)
{ {
List<long> blockPositions = []; List<long> blockPositions = [];
var partialBlockRx = new Regex(PARTIAL_BLOCK_REGEX); Regex partialBlockRx = PartialBlockRegex();
var blockRx = new Regex(BLOCK_REGEX); Regex blockRx = BlockRegex();
var filemarkRx = new Regex(FILEMARK_REGEX); Regex filemarkRx = FilemarkRegex();
var eotRx = new Regex(END_OF_TAPE_REGEX); Regex eotRx = EndOfTapeRegex();
if(imageFilter.DataForkLength <= 16) return ErrorNumber.InvalidArgument; if(imageFilter.DataForkLength <= 16) return ErrorNumber.InvalidArgument;

View File

@@ -31,6 +31,7 @@
// ****************************************************************************/ // ****************************************************************************/
using System.Diagnostics.CodeAnalysis; using System.Diagnostics.CodeAnalysis;
using System.Text.RegularExpressions;
namespace Aaru.Images; namespace Aaru.Images;
@@ -77,4 +78,7 @@ public sealed partial class Dart
const string DART_REGEX = const string DART_REGEX =
@"(?<version>\S+), tag checksum=\$(?<tagchk>[0123456789ABCDEF]{8}), data checksum=\$(?<datachk>[0123456789ABCDEF]{8})$"; @"(?<version>\S+), tag checksum=\$(?<tagchk>[0123456789ABCDEF]{8}), data checksum=\$(?<datachk>[0123456789ABCDEF]{8})$";
[GeneratedRegex(DART_REGEX)]
private static partial Regex DartRegex();
} }

View File

@@ -216,7 +216,7 @@ public sealed partial class Dart
string dArt = StringHandlers.PascalToString(dartRsrc.GetResource(dartRsrc.GetIds()[0]), string dArt = StringHandlers.PascalToString(dartRsrc.GetResource(dartRsrc.GetIds()[0]),
Encoding.GetEncoding("macintosh")); Encoding.GetEncoding("macintosh"));
var dArtEx = new Regex(DART_REGEX); Regex dArtEx = DartRegex();
Match dArtMatch = dArtEx.Match(dArt); Match dArtMatch = dArtEx.Match(dArt);
if(dArtMatch.Success) if(dArtMatch.Success)

View File

@@ -32,6 +32,8 @@
// ReSharper disable InconsistentNaming // ReSharper disable InconsistentNaming
using System.Text.RegularExpressions;
namespace Aaru.Images; namespace Aaru.Images;
public sealed partial class DiskCopy42 public sealed partial class DiskCopy42
@@ -82,4 +84,7 @@ public sealed partial class DiskCopy42
/// <summary>Used incorrectly by Mac OS X with certaing disk images</summary> /// <summary>Used incorrectly by Mac OS X with certaing disk images</summary>
const byte kMacOSXFmtByte = 0x00; const byte kMacOSXFmtByte = 0x00;
const string REGEX_DCPY = @"(?<application>\S+)\s(?<version>\S+)\rData checksum=\$(?<checksum>\S+)$"; const string REGEX_DCPY = @"(?<application>\S+)\s(?<version>\S+)\rData checksum=\$(?<checksum>\S+)$";
[GeneratedRegex(REGEX_DCPY)]
private static partial Regex DcpyRegex();
} }

View File

@@ -305,7 +305,7 @@ public sealed partial class DiskCopy42
string dCpy = StringHandlers.PascalToString(dCpyRsrc.GetResource(dCpyRsrc.GetIds()[0]), string dCpy = StringHandlers.PascalToString(dCpyRsrc.GetResource(dCpyRsrc.GetIds()[0]),
Encoding.GetEncoding("macintosh")); Encoding.GetEncoding("macintosh"));
var dCpyEx = new Regex(REGEX_DCPY); Regex dCpyEx = DcpyRegex();
Match dCpyMatch = dCpyEx.Match(dCpy); Match dCpyMatch = dCpyEx.Match(dCpy);
if(dCpyMatch.Success) if(dCpyMatch.Success)

View File

@@ -30,9 +30,14 @@
// Copyright © 2011-2025 Natalia Portillo // Copyright © 2011-2025 Natalia Portillo
// ****************************************************************************/ // ****************************************************************************/
using System.Text.RegularExpressions;
namespace Aaru.Images; namespace Aaru.Images;
public sealed partial class DriDiskCopy public sealed partial class DriDiskCopy
{ {
const string REGEX_DRI = @"DiskImage\s(?<version>\d+.\d+)\s\(C\)\s\d+\,*\d*\s+Digital Research Inc"; const string REGEX_DRI = @"DiskImage\s(?<version>\d+.\d+)\s\(C\)\s\d+\,*\d*\s+Digital Research Inc";
[GeneratedRegex(REGEX_DRI)]
private static partial Regex DriRegex();
} }

View File

@@ -49,7 +49,7 @@ public sealed partial class DriDiskCopy
if((stream.Length - Marshal.SizeOf<Footer>()) % 512 != 0) return false; if((stream.Length - Marshal.SizeOf<Footer>()) % 512 != 0) return false;
byte[] buffer = new byte[Marshal.SizeOf<Footer>()]; var buffer = new byte[Marshal.SizeOf<Footer>()];
stream.Seek(-buffer.Length, SeekOrigin.End); stream.Seek(-buffer.Length, SeekOrigin.End);
stream.EnsureRead(buffer, 0, buffer.Length); stream.EnsureRead(buffer, 0, buffer.Length);
@@ -73,9 +73,7 @@ public sealed partial class DriDiskCopy
AaruLogging.Debug(MODULE_NAME, "tmp_footer.bpb.fats_no = {0}", tmpFooter.bpb.fats_no); AaruLogging.Debug(MODULE_NAME, "tmp_footer.bpb.fats_no = {0}", tmpFooter.bpb.fats_no);
AaruLogging.Debug(MODULE_NAME, "tmp_footer.bpb.sectors = {0}", tmpFooter.bpb.sectors); AaruLogging.Debug(MODULE_NAME, "tmp_footer.bpb.sectors = {0}", tmpFooter.bpb.sectors);
AaruLogging.Debug(MODULE_NAME, AaruLogging.Debug(MODULE_NAME, "tmp_footer.bpb.media_descriptor = {0}", tmpFooter.bpb.media_descriptor);
"tmp_footer.bpb.media_descriptor = {0}",
tmpFooter.bpb.media_descriptor);
AaruLogging.Debug(MODULE_NAME, "tmp_footer.bpb.spfat = {0}", tmpFooter.bpb.spfat); AaruLogging.Debug(MODULE_NAME, "tmp_footer.bpb.spfat = {0}", tmpFooter.bpb.spfat);
AaruLogging.Debug(MODULE_NAME, "tmp_footer.bpb.sptrack = {0}", tmpFooter.bpb.sptrack); AaruLogging.Debug(MODULE_NAME, "tmp_footer.bpb.sptrack = {0}", tmpFooter.bpb.sptrack);
@@ -87,10 +85,10 @@ public sealed partial class DriDiskCopy
AaruLogging.Debug(MODULE_NAME, "tmp_footer.bpb.sptrack2 = {0}", tmpFooter.bpb.sptrack2); AaruLogging.Debug(MODULE_NAME, "tmp_footer.bpb.sptrack2 = {0}", tmpFooter.bpb.sptrack2);
AaruLogging.Debug(MODULE_NAME, AaruLogging.Debug(MODULE_NAME,
"ArrayHelpers.ArrayIsNullOrEmpty(tmp_footer.bpb.unknown5) = {0}", "ArrayHelpers.ArrayIsNullOrEmpty(tmp_footer.bpb.unknown5) = {0}",
ArrayHelpers.ArrayIsNullOrEmpty(tmpFooter.bpb.unknown5)); ArrayHelpers.ArrayIsNullOrEmpty(tmpFooter.bpb.unknown5));
var regexSignature = new Regex(REGEX_DRI); Regex regexSignature = DriRegex();
Match matchSignature = regexSignature.Match(sig); Match matchSignature = regexSignature.Match(sig);
AaruLogging.Debug(MODULE_NAME, "MatchSignature.Success? = {0}", matchSignature.Success); AaruLogging.Debug(MODULE_NAME, "MatchSignature.Success? = {0}", matchSignature.Success);

View File

@@ -60,7 +60,7 @@ public sealed partial class DriDiskCopy
string sig = StringHandlers.CToString(_footer.signature); string sig = StringHandlers.CToString(_footer.signature);
var regexSignature = new Regex(REGEX_DRI); Regex regexSignature = DriRegex();
Match matchSignature = regexSignature.Match(sig); Match matchSignature = regexSignature.Match(sig);
if(!matchSignature.Success) return ErrorNumber.InvalidArgument; if(!matchSignature.Success) return ErrorNumber.InvalidArgument;

View File

@@ -31,6 +31,7 @@
// ****************************************************************************/ // ****************************************************************************/
using System.Diagnostics.CodeAnalysis; using System.Diagnostics.CodeAnalysis;
using System.Text.RegularExpressions;
namespace Aaru.Images; namespace Aaru.Images;
@@ -39,4 +40,7 @@ public sealed partial class Gdi
{ {
const string REGEX_TRACK = const string REGEX_TRACK =
@"\s?(?<track>\d+)\s+(?<start>\d+)\s(?<flags>\d)\s(?<type>2352|2048)\s(?<filename>.+)\s(?<offset>\d+)$"; @"\s?(?<track>\d+)\s+(?<start>\d+)\s(?<flags>\d)\s(?<type>2352|2048)\s(?<filename>.+)\s(?<offset>\d+)$";
[GeneratedRegex(REGEX_TRACK)]
private static partial Regex TrackRegex();
} }

View File

@@ -52,14 +52,14 @@ public sealed partial class Gdi
try try
{ {
imageFilter.GetDataForkStream().Seek(0, SeekOrigin.Begin); imageFilter.GetDataForkStream().Seek(0, SeekOrigin.Begin);
byte[] testArray = new byte[512]; var testArray = new byte[512];
imageFilter.GetDataForkStream().EnsureRead(testArray, 0, 512); imageFilter.GetDataForkStream().EnsureRead(testArray, 0, 512);
imageFilter.GetDataForkStream().Seek(0, SeekOrigin.Begin); imageFilter.GetDataForkStream().Seek(0, SeekOrigin.Begin);
// Check for unexpected control characters that shouldn't be present in a text file and can crash this plugin // Check for unexpected control characters that shouldn't be present in a text file and can crash this plugin
bool twoConsecutiveNulls = false; var twoConsecutiveNulls = false;
for(int i = 0; i < 512; i++) for(var i = 0; i < 512; i++)
{ {
if(i >= imageFilter.GetDataForkStream().Length) break; if(i >= imageFilter.GetDataForkStream().Length) break;
@@ -77,9 +77,9 @@ public sealed partial class Gdi
} }
_gdiStream = new StreamReader(imageFilter.GetDataForkStream()); _gdiStream = new StreamReader(imageFilter.GetDataForkStream());
int lineNumber = 0; var lineNumber = 0;
int tracksFound = 0; var tracksFound = 0;
int tracks = 0; var tracks = 0;
while(_gdiStream.Peek() >= 0) while(_gdiStream.Peek() >= 0)
{ {
@@ -92,7 +92,7 @@ public sealed partial class Gdi
} }
else else
{ {
var regexTrack = new Regex(REGEX_TRACK); Regex regexTrack = TrackRegex();
Match trackMatch = regexTrack.Match(line ?? ""); Match trackMatch = regexTrack.Match(line ?? "");

View File

@@ -64,7 +64,7 @@ public sealed partial class Gdi
var highDensity = false; var highDensity = false;
// Initialize all RegExs // Initialize all RegExs
var regexTrack = new Regex(REGEX_TRACK); Regex regexTrack = TrackRegex();
// Initialize all RegEx matches // Initialize all RegEx matches

View File

@@ -31,6 +31,7 @@
// ****************************************************************************/ // ****************************************************************************/
using System.Diagnostics.CodeAnalysis; using System.Diagnostics.CodeAnalysis;
using System.Text.RegularExpressions;
namespace Aaru.Images; namespace Aaru.Images;
@@ -48,4 +49,13 @@ public sealed partial class Imd
// ReSharper disable once InconsistentNaming // ReSharper disable once InconsistentNaming
const string REGEX_Z88DK = const string REGEX_Z88DK =
@"IMD z88dk:\s+(?<day>\d+)\/\s*(?<month>\d+)\/(?<year>\d+)\s+(?<hour>\d+):\s*(?<minute>\d+):(?<second>\d+)\r\n"; @"IMD z88dk:\s+(?<day>\d+)\/\s*(?<month>\d+)\/(?<year>\d+)\s+(?<hour>\d+):\s*(?<minute>\d+):(?<second>\d+)\r\n";
[GeneratedRegex(REGEX_HEADER)]
private static partial Regex HeaderRegex();
[GeneratedRegex(REGEX_SAMDISK)]
private static partial Regex SamdiskRegex();
[GeneratedRegex(REGEX_Z88DK)]
private static partial Regex Z88dkRegex();
} }

View File

@@ -56,13 +56,13 @@ public sealed partial class Imd
string hdrStr = StringHandlers.CToString(hdr, Encoding.ASCII); string hdrStr = StringHandlers.CToString(hdr, Encoding.ASCII);
// IMD for DOS // IMD for DOS
Match imd = new Regex(REGEX_HEADER).Match(hdrStr); Match imd = HeaderRegex().Match(hdrStr);
// SAMdisk // SAMdisk
Match sam = new Regex(REGEX_SAMDISK).Match(hdrStr); Match sam = SamdiskRegex().Match(hdrStr);
// z88dk // z88dk
Match z88dk = new Regex(REGEX_Z88DK).Match(hdrStr); Match z88dk = Z88dkRegex().Match(hdrStr);
return imd.Success || sam.Success || z88dk.Success; return imd.Success || sam.Success || z88dk.Success;
} }

View File

@@ -30,10 +30,15 @@
// Copyright © 2011-2025 Natalia Portillo // Copyright © 2011-2025 Natalia Portillo
// ****************************************************************************/ // ****************************************************************************/
using System.Text.RegularExpressions;
namespace Aaru.Images; namespace Aaru.Images;
public sealed partial class RayDim public sealed partial class RayDim
{ {
const string REGEX_SIGNATURE = const string REGEX_SIGNATURE =
@"Disk IMage VER (?<major>\d).(?<minor>\d) Copyright \(C\) (?<year>\d{4}) Ray Arachelian, All Rights Reserved\."; @"Disk IMage VER (?<major>\d).(?<minor>\d) Copyright \(C\) (?<year>\d{4}) Ray Arachelian, All Rights Reserved\.";
[GeneratedRegex(REGEX_SIGNATURE)]
private static partial Regex SignatureRegex();
} }

View File

@@ -49,7 +49,7 @@ public sealed partial class RayDim
if(stream.Length < Marshal.SizeOf<Header>()) return false; if(stream.Length < Marshal.SizeOf<Header>()) return false;
byte[] buffer = new byte[Marshal.SizeOf<Header>()]; var buffer = new byte[Marshal.SizeOf<Header>()];
stream.Seek(0, SeekOrigin.Begin); stream.Seek(0, SeekOrigin.Begin);
stream.EnsureRead(buffer, 0, buffer.Length); stream.EnsureRead(buffer, 0, buffer.Length);
@@ -65,7 +65,7 @@ public sealed partial class RayDim
AaruLogging.Debug(MODULE_NAME, "header.sectorsPerTrack = {0}", header.sectorsPerTrack); AaruLogging.Debug(MODULE_NAME, "header.sectorsPerTrack = {0}", header.sectorsPerTrack);
var sx = new Regex(REGEX_SIGNATURE); Regex sx = SignatureRegex();
Match sm = sx.Match(signature); Match sm = sx.Match(signature);
AaruLogging.Debug(MODULE_NAME, "header.signature matches? = {0}", sm.Success); AaruLogging.Debug(MODULE_NAME, "header.signature matches? = {0}", sm.Success);

View File

@@ -59,7 +59,7 @@ public sealed partial class RayDim
string signature = StringHandlers.CToString(header.signature); string signature = StringHandlers.CToString(header.signature);
var sx = new Regex(REGEX_SIGNATURE); Regex sx = SignatureRegex();
Match sm = sx.Match(signature); Match sm = sx.Match(signature);
if(!sm.Success) return ErrorNumber.InvalidArgument; if(!sm.Success) return ErrorNumber.InvalidArgument;

View File

@@ -31,6 +31,7 @@
// ****************************************************************************/ // ****************************************************************************/
using System.Diagnostics.CodeAnalysis; using System.Diagnostics.CodeAnalysis;
using System.Text.RegularExpressions;
namespace Aaru.Images; namespace Aaru.Images;
@@ -81,4 +82,31 @@ public sealed partial class VMware
const uint SECTOR_SIZE = 512; const uint SECTOR_SIZE = 512;
const uint MAX_CACHED_SECTORS = MAX_CACHE_SIZE / SECTOR_SIZE; const uint MAX_CACHED_SECTORS = MAX_CACHE_SIZE / SECTOR_SIZE;
readonly byte[] _ddfMagicBytes = "# Disk DescriptorFile"u8.ToArray(); readonly byte[] _ddfMagicBytes = "# Disk DescriptorFile"u8.ToArray();
[GeneratedRegex(REGEX_VERSION)]
private static partial Regex VersionRegex();
[GeneratedRegex(REGEX_CID)]
private static partial Regex CidRegex();
[GeneratedRegex(REGEX_CID_PARENT)]
private static partial Regex CidParentRegex();
[GeneratedRegex(REGEX_TYPE)]
private static partial Regex TypeRegex();
[GeneratedRegex(REGEX_EXTENT)]
private static partial Regex ExtentRegex();
[GeneratedRegex(PARENT_REGEX)]
private static partial Regex ParentRegex();
[GeneratedRegex(REGEX_DDB_CYLINDERS)]
private static partial Regex DdbCylindersRegex();
[GeneratedRegex(REGEX_DDB_HEADS)]
private static partial Regex DdbHeadsRegex();
[GeneratedRegex(REGEX_DDB_SECTORS)]
private static partial Regex DdbSectorsRegex();
} }

View File

@@ -188,15 +188,15 @@ public sealed partial class VMware
{ {
ddfStream.Seek(0, SeekOrigin.Begin); ddfStream.Seek(0, SeekOrigin.Begin);
var regexVersion = new Regex(REGEX_VERSION); Regex regexVersion = VersionRegex();
var regexCid = new Regex(REGEX_CID); Regex regexCid = CidRegex();
var regexParentCid = new Regex(REGEX_CID_PARENT); Regex regexParentCid = CidParentRegex();
var regexType = new Regex(REGEX_TYPE); Regex regexType = TypeRegex();
var regexExtent = new Regex(REGEX_EXTENT); Regex regexExtent = ExtentRegex();
var regexParent = new Regex(PARENT_REGEX); Regex regexParent = ParentRegex();
var regexCylinders = new Regex(REGEX_DDB_CYLINDERS); Regex regexCylinders = DdbCylindersRegex();
var regexHeads = new Regex(REGEX_DDB_HEADS); Regex regexHeads = DdbHeadsRegex();
var regexSectors = new Regex(REGEX_DDB_SECTORS); Regex regexSectors = DdbSectorsRegex();
var ddfStreamRdr = new StreamReader(ddfStream); var ddfStreamRdr = new StreamReader(ddfStream);