[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

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

View File

@@ -30,6 +30,8 @@
// Copyright © 2011-2025 Natalia Portillo
// ****************************************************************************/
using System.Text.RegularExpressions;
namespace Aaru.Images;
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_MAP = @"^\s*LANGUAGE_MAP\s*\{";
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
{
imageFilter.GetDataForkStream().Seek(0, SeekOrigin.Begin);
byte[] testArray = new byte[512];
var testArray = new byte[512];
imageFilter.GetDataForkStream().EnsureRead(testArray, 0, 512);
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
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;
@@ -75,8 +75,8 @@ public sealed partial class Cdrdao
_tocStream = new StreamReader(imageFilter.GetDataForkStream());
var cr = new Regex(REGEX_COMMENT);
var dr = new Regex(REGEX_DISCTYPE);
Regex cr = CommentRegex();
Regex dr = DiscTypeRegex();
while(_tocStream.Peek() >= 0)
{

View File

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

View File

@@ -30,6 +30,8 @@
// Copyright © 2011-2025 Natalia Portillo
// ****************************************************************************/
using System.Text.RegularExpressions;
namespace Aaru.Images;
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_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+)$";
[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
{
imageFilter.GetDataForkStream().Seek(0, SeekOrigin.Begin);
byte[] testArray = new byte[512];
var testArray = new byte[512];
imageFilter.GetDataForkStream().EnsureRead(testArray, 0, 512);
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
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;
@@ -82,11 +82,11 @@ public sealed partial class CdrWin
{
string line = _cueStream.ReadLine();
var sr = new Regex(REGEX_SESSION);
var rr = new Regex(REGEX_COMMENT);
var cr = new Regex(REGEX_MCN);
var fr = new Regex(REGEX_FILE);
var tr = new Regex(REGEX_CDTEXT);
Regex sr = SessionRegex();
Regex rr = CommentRegex();
Regex cr = McnRegex();
Regex fr = FileRegex();
Regex tr = CdtextRegex();
// First line must be SESSION, REM, CATALOG, FILE or CDTEXTFILE.
Match sm = sr.Match(line ?? "");

View File

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

View File

@@ -31,6 +31,7 @@
// ****************************************************************************/
using System.Diagnostics.CodeAnalysis;
using System.Text.RegularExpressions;
namespace Aaru.Images;
@@ -92,4 +93,16 @@ public sealed partial class Chd
const string TRACK_TYPE_AUDIO = "AUDIO";
// 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);
var gdddRegEx = new Regex(REGEX_METADATA_HDD);
Regex gdddRegEx = MetadataHddRegex();
Match gdddMatch = gdddRegEx.Match(gddd);
if(gdddMatch.Success)
@@ -671,7 +671,7 @@ public sealed partial class Chd
}
string chtr = StringHandlers.CToString(meta);
var chtrRegEx = new Regex(REGEX_METADATA_CDROM);
Regex chtrRegEx = MetadataCdromRegex();
Match chtrMatch = chtrRegEx.Match(chtr);
if(chtrMatch.Success)
@@ -816,7 +816,7 @@ public sealed partial class Chd
}
string cht2 = StringHandlers.CToString(meta);
var cht2RegEx = new Regex(REGEX_METADATA_CDROM2);
Regex cht2RegEx = MetadataCdrom2Regex();
Match cht2Match = cht2RegEx.Match(cht2);
if(cht2Match.Success)
@@ -1001,7 +1001,7 @@ public sealed partial class Chd
}
string chgd = StringHandlers.CToString(meta);
var chgdRegEx = new Regex(REGEX_METADATA_GDROM);
Regex chgdRegEx = MetadataGdromRegex();
Match chgdMatch = chgdRegEx.Match(chgd);
if(chgdMatch.Success)

View File

@@ -30,6 +30,8 @@
// Copyright © 2011-2025 Natalia Portillo
// ****************************************************************************/
using System.Text.RegularExpressions;
namespace Aaru.Images;
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 TRACK_MODE = @"^\s*MODE\s*=\s*(?<value>\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
{
imageFilter.GetDataForkStream().Seek(0, SeekOrigin.Begin);
byte[] testArray = new byte[512];
var testArray = new byte[512];
imageFilter.GetDataForkStream().EnsureRead(testArray, 0, 512);
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
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;
@@ -79,7 +79,7 @@ public sealed partial class CloneCd
string line = _cueStream.ReadLine();
var hdr = new Regex(CCD_IDENTIFIER);
Regex hdr = CcdIdentifierRegex();
Match hdm = hdr.Match(line ?? "");

View File

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

View File

@@ -30,6 +30,8 @@
// Copyright © 2011-2025 Natalia Portillo
// ****************************************************************************/
using System.Text.RegularExpressions;
namespace Aaru.Images;
public sealed partial class CopyTape
@@ -38,4 +40,16 @@ public sealed partial class CopyTape
const string PARTIAL_BLOCK_REGEX = @"^CPTP:BLK $";
const string FILEMARK_REGEX = @"^CPTP:MRK\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);
var blockRx = new Regex(BLOCK_REGEX);
Regex blockRx = BlockRegex();
Match blockMt = blockRx.Match(mark);
if(!blockMt.Success) return false;

View File

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

View File

@@ -31,6 +31,7 @@
// ****************************************************************************/
using System.Diagnostics.CodeAnalysis;
using System.Text.RegularExpressions;
namespace Aaru.Images;
@@ -77,4 +78,7 @@ public sealed partial class Dart
const string DART_REGEX =
@"(?<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]),
Encoding.GetEncoding("macintosh"));
var dArtEx = new Regex(DART_REGEX);
Regex dArtEx = DartRegex();
Match dArtMatch = dArtEx.Match(dArt);
if(dArtMatch.Success)

View File

@@ -32,6 +32,8 @@
// ReSharper disable InconsistentNaming
using System.Text.RegularExpressions;
namespace Aaru.Images;
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>
const byte kMacOSXFmtByte = 0x00;
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]),
Encoding.GetEncoding("macintosh"));
var dCpyEx = new Regex(REGEX_DCPY);
Regex dCpyEx = DcpyRegex();
Match dCpyMatch = dCpyEx.Match(dCpy);
if(dCpyMatch.Success)

View File

@@ -30,9 +30,14 @@
// Copyright © 2011-2025 Natalia Portillo
// ****************************************************************************/
using System.Text.RegularExpressions;
namespace Aaru.Images;
public sealed partial class DriDiskCopy
{
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;
byte[] buffer = new byte[Marshal.SizeOf<Footer>()];
var buffer = new byte[Marshal.SizeOf<Footer>()];
stream.Seek(-buffer.Length, SeekOrigin.End);
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.sectors = {0}", tmpFooter.bpb.sectors);
AaruLogging.Debug(MODULE_NAME,
"tmp_footer.bpb.media_descriptor = {0}",
tmpFooter.bpb.media_descriptor);
AaruLogging.Debug(MODULE_NAME, "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.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,
"ArrayHelpers.ArrayIsNullOrEmpty(tmp_footer.bpb.unknown5) = {0}",
ArrayHelpers.ArrayIsNullOrEmpty(tmpFooter.bpb.unknown5));
"ArrayHelpers.ArrayIsNullOrEmpty(tmp_footer.bpb.unknown5) = {0}",
ArrayHelpers.ArrayIsNullOrEmpty(tmpFooter.bpb.unknown5));
var regexSignature = new Regex(REGEX_DRI);
Regex regexSignature = DriRegex();
Match matchSignature = regexSignature.Match(sig);
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);
var regexSignature = new Regex(REGEX_DRI);
Regex regexSignature = DriRegex();
Match matchSignature = regexSignature.Match(sig);
if(!matchSignature.Success) return ErrorNumber.InvalidArgument;

View File

@@ -31,6 +31,7 @@
// ****************************************************************************/
using System.Diagnostics.CodeAnalysis;
using System.Text.RegularExpressions;
namespace Aaru.Images;
@@ -39,4 +40,7 @@ public sealed partial class Gdi
{
const string REGEX_TRACK =
@"\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
{
imageFilter.GetDataForkStream().Seek(0, SeekOrigin.Begin);
byte[] testArray = new byte[512];
var testArray = new byte[512];
imageFilter.GetDataForkStream().EnsureRead(testArray, 0, 512);
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
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;
@@ -77,9 +77,9 @@ public sealed partial class Gdi
}
_gdiStream = new StreamReader(imageFilter.GetDataForkStream());
int lineNumber = 0;
int tracksFound = 0;
int tracks = 0;
var lineNumber = 0;
var tracksFound = 0;
var tracks = 0;
while(_gdiStream.Peek() >= 0)
{
@@ -92,7 +92,7 @@ public sealed partial class Gdi
}
else
{
var regexTrack = new Regex(REGEX_TRACK);
Regex regexTrack = TrackRegex();
Match trackMatch = regexTrack.Match(line ?? "");

View File

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

View File

@@ -31,6 +31,7 @@
// ****************************************************************************/
using System.Diagnostics.CodeAnalysis;
using System.Text.RegularExpressions;
namespace Aaru.Images;
@@ -48,4 +49,13 @@ public sealed partial class Imd
// ReSharper disable once InconsistentNaming
const string REGEX_Z88DK =
@"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);
// IMD for DOS
Match imd = new Regex(REGEX_HEADER).Match(hdrStr);
Match imd = HeaderRegex().Match(hdrStr);
// SAMdisk
Match sam = new Regex(REGEX_SAMDISK).Match(hdrStr);
Match sam = SamdiskRegex().Match(hdrStr);
// z88dk
Match z88dk = new Regex(REGEX_Z88DK).Match(hdrStr);
Match z88dk = Z88dkRegex().Match(hdrStr);
return imd.Success || sam.Success || z88dk.Success;
}

View File

@@ -30,10 +30,15 @@
// Copyright © 2011-2025 Natalia Portillo
// ****************************************************************************/
using System.Text.RegularExpressions;
namespace Aaru.Images;
public sealed partial class RayDim
{
const string REGEX_SIGNATURE =
@"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;
byte[] buffer = new byte[Marshal.SizeOf<Header>()];
var buffer = new byte[Marshal.SizeOf<Header>()];
stream.Seek(0, SeekOrigin.Begin);
stream.EnsureRead(buffer, 0, buffer.Length);
@@ -65,7 +65,7 @@ public sealed partial class RayDim
AaruLogging.Debug(MODULE_NAME, "header.sectorsPerTrack = {0}", header.sectorsPerTrack);
var sx = new Regex(REGEX_SIGNATURE);
Regex sx = SignatureRegex();
Match sm = sx.Match(signature);
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);
var sx = new Regex(REGEX_SIGNATURE);
Regex sx = SignatureRegex();
Match sm = sx.Match(signature);
if(!sm.Success) return ErrorNumber.InvalidArgument;

View File

@@ -31,6 +31,7 @@
// ****************************************************************************/
using System.Diagnostics.CodeAnalysis;
using System.Text.RegularExpressions;
namespace Aaru.Images;
@@ -81,4 +82,31 @@ public sealed partial class VMware
const uint SECTOR_SIZE = 512;
const uint MAX_CACHED_SECTORS = MAX_CACHE_SIZE / SECTOR_SIZE;
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);
var regexVersion = new Regex(REGEX_VERSION);
var regexCid = new Regex(REGEX_CID);
var regexParentCid = new Regex(REGEX_CID_PARENT);
var regexType = new Regex(REGEX_TYPE);
var regexExtent = new Regex(REGEX_EXTENT);
var regexParent = new Regex(PARENT_REGEX);
var regexCylinders = new Regex(REGEX_DDB_CYLINDERS);
var regexHeads = new Regex(REGEX_DDB_HEADS);
var regexSectors = new Regex(REGEX_DDB_SECTORS);
Regex regexVersion = VersionRegex();
Regex regexCid = CidRegex();
Regex regexParentCid = CidParentRegex();
Regex regexType = TypeRegex();
Regex regexExtent = ExtentRegex();
Regex regexParent = ParentRegex();
Regex regexCylinders = DdbCylindersRegex();
Regex regexHeads = DdbHeadsRegex();
Regex regexSectors = DdbSectorsRegex();
var ddfStreamRdr = new StreamReader(ddfStream);