From 96207e80eadfe5b8718e992e0b94b6e6ac13fc70 Mon Sep 17 00:00:00 2001 From: YoshiRulz Date: Wed, 29 Jan 2025 21:49:49 +1000 Subject: [PATCH] Extract some extensions for string `OrdinalIgnoreCase` comparisons `Contains`/`Equals`/`StartsWith` refactored a few call-sites while I was at it --- src/BizHawk.Client.Common/ArgParser.cs | 3 +- src/BizHawk.Client.Common/RecentFiles.cs | 5 ++- src/BizHawk.Client.Common/RomLoader.cs | 2 +- .../config/PathEntryCollectionExtensions.cs | 2 +- .../movie/import/DsmImport.cs | 2 +- .../movie/import/Fm2Import.cs | 33 ++++++++++--------- .../movie/import/IMovieImport.cs | 7 ++-- .../movie/import/Mc2Import.cs | 19 ++++++----- .../movie/import/MovieImport.cs | 9 ++--- .../movie/import/YmvImport.cs | 13 ++++---- .../Watch/WatchList/WatchNoteComparer.cs | 16 +++------ src/BizHawk.Client.EmuHawk/EmuHawkUtil.cs | 3 +- src/BizHawk.Client.EmuHawk/Program.cs | 3 +- .../RetroAchievements.GameVerification.cs | 2 +- .../config/HotkeyConfig.cs | 3 +- src/BizHawk.Client.EmuHawk/movie/PlayMovie.cs | 9 ++--- .../tools/Lua/LuaFunctionsForm.cs | 4 +-- .../Extensions/PathExtensions.cs | 2 +- .../Extensions/StringExtensions.cs | 26 +++++++++++++-- src/BizHawk.Common/HawkFile/HawkFile.cs | 10 +++--- src/BizHawk.Common/OSTailoredCode.cs | 2 +- src/BizHawk.Common/Util.cs | 6 +++- src/BizHawk.Emulation.Common/DSKIdentifier.cs | 2 +- .../Database/Database.cs | 4 +-- src/BizHawk.Emulation.Common/IpfIdentifier.cs | 2 +- .../Arcades/MAME/MAME.cs | 18 ++-------- .../AmstradCPC/Machine/CPCBase.Media.cs | 4 +-- .../Media/Disk/CPCExtendedFloppyDisk.cs | 4 +-- .../AmstradCPC/Media/Disk/CPCFloppyDisk.cs | 4 +-- .../AmstradCPC/Media/Disk/FloppyDisk.cs | 14 +++----- .../Machine/SpectrumBase.Media.cs | 16 ++++----- .../Disk/CPCFormat/CPCExtendedFloppyDisk.cs | 4 +-- .../Media/Disk/CPCFormat/CPCFloppyDisk.cs | 4 +-- .../SinclairSpectrum/Media/Disk/FloppyDisk.cs | 14 +++----- .../Media/Disk/IPFFormat/IPFFloppyDisk.cs | 2 +- .../Consoles/Sega/gpgx64/GPGX.ISettable.cs | 5 +-- .../DiscDecoding.cs | 28 ++++------------ .../DiscFormats/CCD_format.cs | 2 +- .../DiscFormats/CUE/CUE_Parse.cs | 3 +- .../DiscFormats/CUE/CueFileResolver.cs | 5 ++- .../DiscFormats/MDS_Format.cs | 3 +- .../DiscIdentifier.cs | 2 +- 42 files changed, 155 insertions(+), 166 deletions(-) diff --git a/src/BizHawk.Client.Common/ArgParser.cs b/src/BizHawk.Client.Common/ArgParser.cs index 1352ee48bc..7e18e9e233 100644 --- a/src/BizHawk.Client.Common/ArgParser.cs +++ b/src/BizHawk.Client.Common/ArgParser.cs @@ -8,6 +8,7 @@ using System.Linq; using System.Net.Sockets; using BizHawk.Common.CollectionExtensions; +using BizHawk.Common.StringExtensions; namespace BizHawk.Client.Common { @@ -191,7 +192,7 @@ namespace BizHawk.Client.Common ? ((string?, string?)?) null // don't bother : (httpClientURIGET, httpClientURIPOST); - var audiosync = result.GetValueForOption(OptionAVDumpAudioSync)?.Equals("true", StringComparison.OrdinalIgnoreCase); + var audiosync = result.GetValueForOption(OptionAVDumpAudioSync)?.EqualsIgnoreCase("true"); List<(string Key, string Value)>? userdataUnparsedPairs = null; if (result.GetValueForOption(OptionUserdataUnparsedPairs) is string list1) diff --git a/src/BizHawk.Client.Common/RecentFiles.cs b/src/BizHawk.Client.Common/RecentFiles.cs index 5f37582d1b..5313c3c4bf 100644 --- a/src/BizHawk.Client.Common/RecentFiles.cs +++ b/src/BizHawk.Client.Common/RecentFiles.cs @@ -1,5 +1,8 @@ using System.Collections.Generic; using System.Linq; + +using BizHawk.Common.StringExtensions; + using Newtonsoft.Json; namespace BizHawk.Client.Common @@ -67,7 +70,7 @@ namespace BizHawk.Client.Common { if (!Frozen) { - return recentlist.RemoveAll(recent => string.Equals(newFile, recent, StringComparison.OrdinalIgnoreCase)) != 0; // none removed => return false + return recentlist.RemoveAll(newFile.EqualsIgnoreCase) is not 0; // none removed => return false } return false; diff --git a/src/BizHawk.Client.Common/RomLoader.cs b/src/BizHawk.Client.Common/RomLoader.cs index 2357c0762c..12712bc0e0 100644 --- a/src/BizHawk.Client.Common/RomLoader.cs +++ b/src/BizHawk.Client.Common/RomLoader.cs @@ -401,7 +401,7 @@ namespace BizHawk.Client.Common return (int)CorePriority.UserPreference; } - if (string.Equals(c.Name, dbForcedCoreName, StringComparison.OrdinalIgnoreCase)) + if (c.Name.EqualsIgnoreCase(dbForcedCoreName)) { return (int)CorePriority.GameDbPreference; } diff --git a/src/BizHawk.Client.Common/config/PathEntryCollectionExtensions.cs b/src/BizHawk.Client.Common/config/PathEntryCollectionExtensions.cs index b316a5da68..633d1c58ee 100644 --- a/src/BizHawk.Client.Common/config/PathEntryCollectionExtensions.cs +++ b/src/BizHawk.Client.Common/config/PathEntryCollectionExtensions.cs @@ -24,7 +24,7 @@ namespace BizHawk.Client.Common var globalBase = collection[PathEntryCollection.GLOBAL, "Base"].Path; // if %exe% prefixed then substitute exe path and repeat - if (globalBase.StartsWith("%exe%", StringComparison.OrdinalIgnoreCase)) + if (globalBase.StartsWithIgnoreCase("%exe%")) { globalBase = PathUtils.ExeDirectoryPath + globalBase.Substring(5); } diff --git a/src/BizHawk.Client.Common/movie/import/DsmImport.cs b/src/BizHawk.Client.Common/movie/import/DsmImport.cs index bd2a77aed3..a251895c98 100644 --- a/src/BizHawk.Client.Common/movie/import/DsmImport.cs +++ b/src/BizHawk.Client.Common/movie/import/DsmImport.cs @@ -74,7 +74,7 @@ namespace BizHawk.Client.Common { Result.Movie.Comments.Add(ParseHeader(line, "comment")); } - else if (line.StartsWith("guid", StringComparison.OrdinalIgnoreCase)) + else if (line.StartsWithIgnoreCase("guid")) { // We no longer care to keep this info } diff --git a/src/BizHawk.Client.Common/movie/import/Fm2Import.cs b/src/BizHawk.Client.Common/movie/import/Fm2Import.cs index 451f827408..44b3ffbd3a 100644 --- a/src/BizHawk.Client.Common/movie/import/Fm2Import.cs +++ b/src/BizHawk.Client.Common/movie/import/Fm2Import.cs @@ -1,5 +1,6 @@ using BizHawk.Common; using BizHawk.Common.BufferExtensions; +using BizHawk.Common.StringExtensions; using BizHawk.Emulation.Common; using BizHawk.Emulation.Cores; using BizHawk.Emulation.Cores.Nintendo.NES; @@ -41,7 +42,7 @@ namespace BizHawk.Client.Common { ImportInputFrame(line); } - else if (line.StartsWith("sub", StringComparison.OrdinalIgnoreCase)) + else if (line.StartsWithIgnoreCase("sub")) { var subtitle = ImportTextSubtitle(line); @@ -50,11 +51,11 @@ namespace BizHawk.Client.Common Result.Movie.Subtitles.AddFromString(subtitle); } } - else if (line.StartsWith("emuversion", StringComparison.OrdinalIgnoreCase)) + else if (line.StartsWithIgnoreCase("emuversion")) { Result.Movie.Comments.Add($"{EmulationOrigin} {emulator} version {ParseHeader(line, "emuVersion")}"); } - else if (line.StartsWith("version", StringComparison.OrdinalIgnoreCase)) + else if (line.StartsWithIgnoreCase("version")) { string version = ParseHeader(line, "version"); @@ -67,15 +68,15 @@ namespace BizHawk.Client.Common Result.Movie.Comments.Add($"{MovieOrigin} .fm2 version 3"); } } - else if (line.StartsWith("romfilename", StringComparison.OrdinalIgnoreCase)) + else if (line.StartsWithIgnoreCase("romfilename")) { Result.Movie.HeaderEntries[HeaderKeys.GameName] = ParseHeader(line, "romFilename"); } - else if (line.StartsWith("cdgamename", StringComparison.OrdinalIgnoreCase)) + else if (line.StartsWithIgnoreCase("cdgamename")) { Result.Movie.HeaderEntries[HeaderKeys.GameName] = ParseHeader(line, "cdGameName"); } - else if (line.StartsWith("romchecksum", StringComparison.OrdinalIgnoreCase)) + else if (line.StartsWithIgnoreCase("romchecksum")) { string blob = ParseHeader(line, "romChecksum"); byte[] md5 = DecodeBlob(blob); @@ -88,19 +89,19 @@ namespace BizHawk.Client.Common Result.Warnings.Add("Bad ROM checksum."); } } - else if (line.StartsWith("comment author", StringComparison.OrdinalIgnoreCase)) + else if (line.StartsWithIgnoreCase("comment author")) { Result.Movie.HeaderEntries[HeaderKeys.Author] = ParseHeader(line, "comment author"); } - else if (line.StartsWith("rerecordcount", StringComparison.OrdinalIgnoreCase)) + else if (line.StartsWithIgnoreCase("rerecordcount")) { Result.Movie.Rerecords = (ulong) (int.TryParse(ParseHeader(line, "rerecordCount"), out var rerecordCount) ? rerecordCount : default); } - else if (line.StartsWith("guid", StringComparison.OrdinalIgnoreCase)) + else if (line.StartsWithIgnoreCase("guid")) { // We no longer care to keep this info } - else if (line.StartsWith("startsfromsavestate", StringComparison.OrdinalIgnoreCase)) + else if (line.StartsWithIgnoreCase("startsfromsavestate")) { // If this movie starts from a savestate, we can't support it. if (ParseHeader(line, "StartsFromSavestate") == "1") @@ -109,11 +110,11 @@ namespace BizHawk.Client.Common break; } } - else if (line.StartsWith("palflag", StringComparison.OrdinalIgnoreCase)) + else if (line.StartsWithIgnoreCase("palflag")) { Result.Movie.HeaderEntries[HeaderKeys.Pal] = ParseHeader(line, "palFlag"); } - else if (line.StartsWith("port0", StringComparison.OrdinalIgnoreCase)) + else if (line.StartsWithIgnoreCase("port0")) { if (!isFourScore && ParseHeader(line, "port0") == "1") { @@ -122,7 +123,7 @@ namespace BizHawk.Client.Common _deck.ControllerDef.BuildMnemonicsCache(Result.Movie.SystemID); } } - else if (line.StartsWith("port1", StringComparison.OrdinalIgnoreCase)) + else if (line.StartsWithIgnoreCase("port1")) { if (!isFourScore && ParseHeader(line, "port1") == "1") { @@ -131,14 +132,14 @@ namespace BizHawk.Client.Common _deck.ControllerDef.BuildMnemonicsCache(Result.Movie.SystemID); } } - else if (line.StartsWith("port2", StringComparison.OrdinalIgnoreCase)) + else if (line.StartsWithIgnoreCase("port2")) { if (ParseHeader(line, "port2") == "1") { Result.Warnings.Add("Famicom port detected but not yet supported, ignoring"); } } - else if (line.StartsWith("fourscore", StringComparison.OrdinalIgnoreCase)) + else if (line.StartsWithIgnoreCase("fourscore")) { isFourScore = ParseHeader(line, "fourscore") == "1"; if (isFourScore) @@ -244,7 +245,7 @@ namespace BizHawk.Client.Common } // base64 - if (!blob.StartsWith("base64:", StringComparison.OrdinalIgnoreCase)) + if (!blob.StartsWithIgnoreCase("base64:")) { return null; } diff --git a/src/BizHawk.Client.Common/movie/import/IMovieImport.cs b/src/BizHawk.Client.Common/movie/import/IMovieImport.cs index 9f04c1fd64..a20e7cda66 100644 --- a/src/BizHawk.Client.Common/movie/import/IMovieImport.cs +++ b/src/BizHawk.Client.Common/movie/import/IMovieImport.cs @@ -4,6 +4,7 @@ using System.Linq; using System.Text.RegularExpressions; using BizHawk.Common; +using BizHawk.Common.StringExtensions; namespace BizHawk.Client.Common { @@ -52,15 +53,15 @@ namespace BizHawk.Client.Common // try to generate a matching hash from the original ROM if (Result.Movie.HeaderEntries.TryGetValue(HeaderKeys.Crc32, out string crcHash)) { - hash = PromptForRom(data => string.Equals(CRC32Checksum.ComputeDigestHex(data), crcHash, StringComparison.OrdinalIgnoreCase)); + hash = PromptForRom(data => CRC32Checksum.ComputeDigestHex(data).EqualsIgnoreCase(crcHash)); } else if (Result.Movie.HeaderEntries.TryGetValue(HeaderKeys.Md5, out string md5Hash)) { - hash = PromptForRom(data => string.Equals(MD5Checksum.ComputeDigestHex(data), md5Hash, StringComparison.OrdinalIgnoreCase)); + hash = PromptForRom(data => MD5Checksum.ComputeDigestHex(data).EqualsIgnoreCase(md5Hash)); } else if (Result.Movie.HeaderEntries.TryGetValue(HeaderKeys.Sha256, out string sha256Hash)) { - hash = PromptForRom(data => string.Equals(SHA256Checksum.ComputeDigestHex(data), sha256Hash, StringComparison.OrdinalIgnoreCase)); + hash = PromptForRom(data => SHA256Checksum.ComputeDigestHex(data).EqualsIgnoreCase(sha256Hash)); } if (hash is not null) diff --git a/src/BizHawk.Client.Common/movie/import/Mc2Import.cs b/src/BizHawk.Client.Common/movie/import/Mc2Import.cs index ca8c5a227c..becaf74815 100644 --- a/src/BizHawk.Client.Common/movie/import/Mc2Import.cs +++ b/src/BizHawk.Client.Common/movie/import/Mc2Import.cs @@ -1,3 +1,4 @@ +using BizHawk.Common.StringExtensions; using BizHawk.Emulation.Common; using BizHawk.Emulation.Cores.PCEngine; @@ -43,7 +44,7 @@ namespace BizHawk.Client.Common.movie.import { ImportTextFrame(line); } - else if (line.StartsWith("ports", StringComparison.OrdinalIgnoreCase)) + else if (line.StartsWithIgnoreCase("ports")) { var portNumStr = ParseHeader(line, "ports"); if (int.TryParse(portNumStr, out int ports)) @@ -82,32 +83,32 @@ namespace BizHawk.Client.Common.movie.import ss.Port5); } } - else if (line.StartsWith("pcecd", StringComparison.OrdinalIgnoreCase)) + else if (line.StartsWithIgnoreCase("pcecd")) { Result.Movie.HeaderEntries[HeaderKeys.Platform] = VSystemID.Raw.PCECD; } - else if (line.StartsWith("emuversion", StringComparison.OrdinalIgnoreCase)) + else if (line.StartsWithIgnoreCase("emuversion")) { Result.Movie.Comments.Add($"{EmulationOrigin} Mednafen/PCEjin version {ParseHeader(line, "emuVersion")}"); } - else if (line.StartsWith("version", StringComparison.OrdinalIgnoreCase)) + else if (line.StartsWithIgnoreCase("version")) { string version = ParseHeader(line, "version"); Result.Movie.Comments.Add($"{MovieOrigin} .mc2 version {version}"); } - else if (line.StartsWith("romfilename", StringComparison.OrdinalIgnoreCase)) + else if (line.StartsWithIgnoreCase("romfilename")) { Result.Movie.HeaderEntries[HeaderKeys.GameName] = ParseHeader(line, "romFilename"); } - else if (line.StartsWith("cdgamename", StringComparison.OrdinalIgnoreCase)) + else if (line.StartsWithIgnoreCase("cdgamename")) { Result.Movie.HeaderEntries[HeaderKeys.GameName] = ParseHeader(line, "cdGameName"); } - else if (line.StartsWith("comment author", StringComparison.OrdinalIgnoreCase)) + else if (line.StartsWithIgnoreCase("comment author")) { Result.Movie.HeaderEntries[HeaderKeys.Author] = ParseHeader(line, "comment author"); } - else if (line.StartsWith("rerecordcount", StringComparison.OrdinalIgnoreCase)) + else if (line.StartsWithIgnoreCase("rerecordcount")) { int rerecordCount; @@ -123,7 +124,7 @@ namespace BizHawk.Client.Common.movie.import Result.Movie.Rerecords = (ulong)rerecordCount; } - else if (line.StartsWith("startsfromsavestate", StringComparison.OrdinalIgnoreCase)) + else if (line.StartsWithIgnoreCase("startsfromsavestate")) { // If this movie starts from a savestate, we can't support it. if (ParseHeader(line, "StartsFromSavestate") == "1") diff --git a/src/BizHawk.Client.Common/movie/import/MovieImport.cs b/src/BizHawk.Client.Common/movie/import/MovieImport.cs index a1b2e7dfde..e291575947 100644 --- a/src/BizHawk.Client.Common/movie/import/MovieImport.cs +++ b/src/BizHawk.Client.Common/movie/import/MovieImport.cs @@ -4,6 +4,7 @@ using System.IO; using System.Reflection; using BizHawk.Common.CollectionExtensions; +using BizHawk.Common.StringExtensions; namespace BizHawk.Client.Common { @@ -18,11 +19,7 @@ namespace BizHawk.Client.Common /// Returns a value indicating whether or not there is an importer for the given extension /// public static bool IsValidMovieExtension(string extension) - { - return Importers - .Select(i => i.Value) - .Any(e => string.Equals(extension, e.Extension, StringComparison.OrdinalIgnoreCase)); - } + => Importers.Any(kvp => kvp.Value.Extension.EqualsIgnoreCase(extension)); public static readonly FilesystemFilterSet AvailableImporters = new FilesystemFilterSet( Importers.Values.OrderBy(attr => attr.Emulator) @@ -40,7 +37,7 @@ namespace BizHawk.Client.Common Config config) { string ext = Path.GetExtension(path) ?? ""; - var result = Importers.FirstOrNull(kvp => string.Equals(kvp.Value.Extension, ext, StringComparison.OrdinalIgnoreCase)); + var result = Importers.FirstOrNull(kvp => kvp.Value.Extension.EqualsIgnoreCase(ext)); // Create a new instance of the importer class using the no-argument constructor return result is { Key: var importerType } && importerType.GetConstructor(Type.EmptyTypes)?.Invoke(Array.Empty()) is IMovieImport importer diff --git a/src/BizHawk.Client.Common/movie/import/YmvImport.cs b/src/BizHawk.Client.Common/movie/import/YmvImport.cs index 1dd8cbcd42..9c7308df02 100644 --- a/src/BizHawk.Client.Common/movie/import/YmvImport.cs +++ b/src/BizHawk.Client.Common/movie/import/YmvImport.cs @@ -1,5 +1,6 @@ using System.Collections.Generic; +using BizHawk.Common.StringExtensions; using BizHawk.Emulation.Common; namespace BizHawk.Client.Common.movie.import @@ -44,20 +45,20 @@ namespace BizHawk.Client.Common.movie.import { ImportTextFrame(line); } - else if (line.StartsWith("emuversion", StringComparison.OrdinalIgnoreCase)) + else if (line.StartsWithIgnoreCase("emuversion")) { Result.Movie.Comments.Add($"{EmulationOrigin} Yabause version {ParseHeader(line, "emuVersion")}"); } - else if (line.StartsWith("version", StringComparison.OrdinalIgnoreCase)) + else if (line.StartsWithIgnoreCase("version")) { string version = ParseHeader(line, "version"); Result.Movie.Comments.Add($"{MovieOrigin} .ymv version {version}"); } - else if (line.StartsWith("cdGameName", StringComparison.OrdinalIgnoreCase)) + else if (line.StartsWithIgnoreCase("cdGameName")) { Result.Movie.HeaderEntries[HeaderKeys.GameName] = ParseHeader(line, "romFilename"); } - else if (line.StartsWith("rerecordcount", StringComparison.OrdinalIgnoreCase)) + else if (line.StartsWithIgnoreCase("rerecordcount")) { int rerecordCount; @@ -73,7 +74,7 @@ namespace BizHawk.Client.Common.movie.import Result.Movie.Rerecords = (ulong)rerecordCount; } - else if (line.StartsWith("startsfromsavestate", StringComparison.OrdinalIgnoreCase)) + else if (line.StartsWithIgnoreCase("startsfromsavestate")) { // If this movie starts from a savestate, we can't support it. if (ParseHeader(line, "StartsFromSavestate") == "1") @@ -81,7 +82,7 @@ namespace BizHawk.Client.Common.movie.import Result.Errors.Add("Movies that begin with a savestate are not supported."); } } - else if (line.StartsWith("ispal", StringComparison.OrdinalIgnoreCase)) + else if (line.StartsWithIgnoreCase("ispal")) { bool pal = ParseHeader(line, "isPal") == "1"; Result.Movie.HeaderEntries[HeaderKeys.Pal] = pal.ToString(); diff --git a/src/BizHawk.Client.Common/tools/Watch/WatchList/WatchNoteComparer.cs b/src/BizHawk.Client.Common/tools/Watch/WatchList/WatchNoteComparer.cs index 7541ab26a6..2384161bb9 100644 --- a/src/BizHawk.Client.Common/tools/Watch/WatchList/WatchNoteComparer.cs +++ b/src/BizHawk.Client.Common/tools/Watch/WatchList/WatchNoteComparer.cs @@ -30,18 +30,10 @@ namespace BizHawk.Client.Common { return 0; } - - if (string.Equals(x.Notes, y.Notes, StringComparison.OrdinalIgnoreCase)) - { - if (x.Address.Equals(y.Address)) - { - return x.Size.CompareTo(y.Size); - } - - return x.Address.CompareTo(y.Address); - } - - return string.Compare(x.Notes, y.Notes, StringComparison.OrdinalIgnoreCase); + var cmpNotes = string.Compare(x.Notes, y.Notes, StringComparison.OrdinalIgnoreCase); + if (cmpNotes is not 0) return cmpNotes; + var cmpAddr = x.Address.CompareTo(y.Address); + return cmpAddr is not 0 ? cmpAddr : x.Size.CompareTo(y.Size); } } } diff --git a/src/BizHawk.Client.EmuHawk/EmuHawkUtil.cs b/src/BizHawk.Client.EmuHawk/EmuHawkUtil.cs index 70c339dfb1..ed731e4f71 100644 --- a/src/BizHawk.Client.EmuHawk/EmuHawkUtil.cs +++ b/src/BizHawk.Client.EmuHawk/EmuHawkUtil.cs @@ -2,6 +2,7 @@ using System.IO; using System.Security.Principal; using BizHawk.Common; +using BizHawk.Common.StringExtensions; namespace BizHawk.Client.EmuHawk { @@ -15,7 +16,7 @@ namespace BizHawk.Client.EmuHawk public static string ResolveShortcut(string filename) { if (OSTailoredCode.IsUnixHost || HawkFile.PathContainsPipe(filename) - || !".lnk".Equals(Path.GetExtension(filename), StringComparison.OrdinalIgnoreCase)) + || !".lnk".EqualsIgnoreCase(Path.GetExtension(filename))) { return filename; // archive internal files are never shortcuts (and choke when analyzing any further) } diff --git a/src/BizHawk.Client.EmuHawk/Program.cs b/src/BizHawk.Client.EmuHawk/Program.cs index 2a38103026..094deac620 100644 --- a/src/BizHawk.Client.EmuHawk/Program.cs +++ b/src/BizHawk.Client.EmuHawk/Program.cs @@ -9,6 +9,7 @@ using System.Windows.Forms; using BizHawk.Bizware.Graphics; using BizHawk.Common; using BizHawk.Common.PathExtensions; +using BizHawk.Common.StringExtensions; using BizHawk.Client.Common; using BizHawk.Client.EmuHawk.CustomControls; using BizHawk.Emulation.Cores; @@ -270,7 +271,7 @@ namespace BizHawk.Client.EmuHawk } // super hacky! this needs to be done first. still not worth the trouble to make this system fully proper - if (Array.Exists(args, static arg => arg.StartsWith("--gdi", StringComparison.OrdinalIgnoreCase))) + if (Array.Exists(args, static arg => arg.StartsWithIgnoreCase("--gdi"))) { initialConfig.DispMethod = EDispMethod.GdiPlus; } diff --git a/src/BizHawk.Client.EmuHawk/RetroAchievements/RetroAchievements.GameVerification.cs b/src/BizHawk.Client.EmuHawk/RetroAchievements/RetroAchievements.GameVerification.cs index 3a66b4c476..f60fee9f7b 100644 --- a/src/BizHawk.Client.EmuHawk/RetroAchievements/RetroAchievements.GameVerification.cs +++ b/src/BizHawk.Client.EmuHawk/RetroAchievements/RetroAchievements.GameVerification.cs @@ -129,7 +129,7 @@ namespace BizHawk.Client.EmuHawk if (term == ';' || term == '\0') { var fn = Encoding.ASCII.GetString(buf2048, index + 33, filename.Length); - if (filename.Equals(fn, StringComparison.OrdinalIgnoreCase)) + if (filename.EqualsIgnoreCase(fn)) { filesize = (buf2048[index + 13] << 24) | (buf2048[index + 12] << 16) | (buf2048[index + 11] << 8) | buf2048[index + 10]; return (buf2048[index + 4] << 16) | (buf2048[index + 3] << 8) | buf2048[index + 2]; diff --git a/src/BizHawk.Client.EmuHawk/config/HotkeyConfig.cs b/src/BizHawk.Client.EmuHawk/config/HotkeyConfig.cs index ef5a729cc0..4419225eae 100644 --- a/src/BizHawk.Client.EmuHawk/config/HotkeyConfig.cs +++ b/src/BizHawk.Client.EmuHawk/config/HotkeyConfig.cs @@ -6,6 +6,7 @@ using System.Windows.Forms; using BizHawk.Client.Common; using BizHawk.Common; using BizHawk.Common.CollectionExtensions; +using BizHawk.Common.StringExtensions; namespace BizHawk.Client.EmuHawk { @@ -199,7 +200,7 @@ namespace BizHawk.Client.EmuHawk { if (e.IsPressed(Keys.Enter) || e.IsPressed(Keys.Tab)) { - var k = HotkeyInfo.AllHotkeys.FirstOrNull(kvp => string.Compare(kvp.Value.DisplayName, SearchBox.Text, StringComparison.OrdinalIgnoreCase) is 0)?.Key; + var k = HotkeyInfo.AllHotkeys.FirstOrNull(kvp => kvp.Value.DisplayName.EqualsIgnoreCase(SearchBox.Text))?.Key; // Found if (k is not null) diff --git a/src/BizHawk.Client.EmuHawk/movie/PlayMovie.cs b/src/BizHawk.Client.EmuHawk/movie/PlayMovie.cs index 2af710f43e..ef4a310762 100644 --- a/src/BizHawk.Client.EmuHawk/movie/PlayMovie.cs +++ b/src/BizHawk.Client.EmuHawk/movie/PlayMovie.cs @@ -217,13 +217,8 @@ namespace BizHawk.Client.EmuHawk var tas = new List(); for (var i = 0; i < indices.Count; i++) { - foreach (var ext in MovieService.MovieExtensions) - { - if ($".{ext}".Equals(Path.GetExtension(_movieList[indices[i]].Filename), StringComparison.OrdinalIgnoreCase)) - { - tas.Add(i); - } - } + var fileExt = Path.GetExtension(_movieList[indices[i]].Filename); + if (MovieService.MovieExtensions.Select(static s => $".{s}").Any(fileExt.EqualsIgnoreCase)) tas.Add(i); } if (tas.Count is 0) diff --git a/src/BizHawk.Client.EmuHawk/tools/Lua/LuaFunctionsForm.cs b/src/BizHawk.Client.EmuHawk/tools/Lua/LuaFunctionsForm.cs index 3de8361152..34519a3951 100644 --- a/src/BizHawk.Client.EmuHawk/tools/Lua/LuaFunctionsForm.cs +++ b/src/BizHawk.Client.EmuHawk/tools/Lua/LuaFunctionsForm.cs @@ -31,8 +31,8 @@ namespace BizHawk.Client.EmuHawk if (!string.IsNullOrWhiteSpace(FilterBox.Text)) { _filteredList = _functionList - .Where(f => $"{f.Library}.{f.Name}".Contains(FilterBox.Text, StringComparison.OrdinalIgnoreCase) - || f.Description.Contains(FilterBox.Text, StringComparison.OrdinalIgnoreCase)) + .Where(f => $"{f.Library}.{f.Name}".ContainsIgnoreCase(FilterBox.Text) + || f.Description.ContainsIgnoreCase(FilterBox.Text)) .ToList(); } else diff --git a/src/BizHawk.Common/Extensions/PathExtensions.cs b/src/BizHawk.Common/Extensions/PathExtensions.cs index 0a34231f68..15bed9e986 100644 --- a/src/BizHawk.Common/Extensions/PathExtensions.cs +++ b/src/BizHawk.Common/Extensions/PathExtensions.cs @@ -148,7 +148,7 @@ namespace BizHawk.Common.PathExtensions if (fromUri.Scheme != toUri.Scheme) return basePath; var relativePath = Uri.UnescapeDataString(fromUri.MakeRelativeUri(toUri).ToString()); - return (toUri.Scheme.Equals(Uri.UriSchemeFile, StringComparison.OrdinalIgnoreCase) + return (Uri.UriSchemeFile.EqualsIgnoreCase(toUri.Scheme) ? relativePath.Replace(Path.AltDirectorySeparatorChar, Path.DirectorySeparatorChar) : relativePath ).TrimEnd(dirSepChar); diff --git a/src/BizHawk.Common/Extensions/StringExtensions.cs b/src/BizHawk.Common/Extensions/StringExtensions.cs index 4c4af5a1ef..32cf1ea728 100644 --- a/src/BizHawk.Common/Extensions/StringExtensions.cs +++ b/src/BizHawk.Common/Extensions/StringExtensions.cs @@ -22,6 +22,11 @@ namespace BizHawk.Common.StringExtensions public static bool Contains(this string haystack, string needle, StringComparison comparisonType) => haystack.IndexOf(needle, comparisonType) != -1; + /// + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static bool ContainsIgnoreCase(this string haystack, string needle) + => haystack.Contains(needle, StringComparison.OrdinalIgnoreCase); + [MethodImpl(MethodImplOptions.AggressiveInlining)] public static bool ContainsOrdinal(this string haystack, char needle) => haystack.Contains(needle); // already ordinal @@ -39,11 +44,23 @@ namespace BizHawk.Common.StringExtensions public static bool EndsWithOrdinal(this string haystack, char needle) => haystack.EndsWith(needle); // already ordinal +#pragma warning disable RS0030 // doc comment links to banned API + /// performs a non-localised but case-insensitive comparison + /// + /// uses , + /// equivalent to str.ToUpperInvariant().SequenceEqual(other.ToUpperInvariant()) per docs; + /// whereas is different (for non-ASCII text) + /// + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static bool EqualsIgnoreCase(this string str, string other) + => str.Equals(other, StringComparison.OrdinalIgnoreCase); +#pragma warning restore RS0030 + /// /// if appears in (case-insensitive) /// - public static bool In(this string str, params string[] options) => - options.Any(opt => string.Equals(opt, str, StringComparison.OrdinalIgnoreCase)); + public static bool In(this string str, params string[] options) + => options.Any(str.EqualsIgnoreCase); /// a copy of with all characters outside [0-9A-Za-z] removed public static string OnlyAlphanumeric(this string raw) @@ -103,6 +120,11 @@ namespace BizHawk.Common.StringExtensions public static bool StartsWith(this string str, char c) => str.Length >= 1 && str[0] == c; + /// + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static bool StartsWithIgnoreCase(this string haystack, string needle) + => haystack.StartsWith(needle, StringComparison.OrdinalIgnoreCase); + /// /// the substring of after the first occurrence of , or /// the original if not found diff --git a/src/BizHawk.Common/HawkFile/HawkFile.cs b/src/BizHawk.Common/HawkFile/HawkFile.cs index fd772a900e..b6a1ff971b 100644 --- a/src/BizHawk.Common/HawkFile/HawkFile.cs +++ b/src/BizHawk.Common/HawkFile/HawkFile.cs @@ -145,13 +145,11 @@ namespace BizHawk.Common Exists = false; return; } - for (int i = 0, l = scanResults.Count; i < l; i++) + var i = scanResults.FindIndex(item => item.Name.EqualsIgnoreCase(autobind)); + if (i >= 0) { - if (string.Equals(scanResults[i].Name, autobind, StringComparison.OrdinalIgnoreCase)) - { - BindArchiveMember(i); - return; - } + BindArchiveMember(i); + return; } } diff --git a/src/BizHawk.Common/OSTailoredCode.cs b/src/BizHawk.Common/OSTailoredCode.cs index 460a613ffe..8887e38224 100644 --- a/src/BizHawk.Common/OSTailoredCode.cs +++ b/src/BizHawk.Common/OSTailoredCode.cs @@ -88,7 +88,7 @@ namespace BizHawk.Common }); private static readonly Lazy _isWSL = new(static () => IsUnixHost - && SimpleSubshell(cmd: "uname", args: "-r", noOutputMsg: "missing uname?").Contains("microsoft", StringComparison.OrdinalIgnoreCase)); + && SimpleSubshell(cmd: "uname", args: "-r", noOutputMsg: "missing uname?").ContainsIgnoreCase("microsoft")); public static (WindowsVersion Version, Version? Win10PlusVersion)? HostWindowsVersion => _HostWindowsVersion.Value; diff --git a/src/BizHawk.Common/Util.cs b/src/BizHawk.Common/Util.cs index d3e28c47b3..7e1a15deec 100644 --- a/src/BizHawk.Common/Util.cs +++ b/src/BizHawk.Common/Util.cs @@ -8,6 +8,8 @@ using System.Runtime.CompilerServices; using System.Runtime.InteropServices; using System.Threading; +using BizHawk.Common.StringExtensions; + namespace BizHawk.Common { public static unsafe class Util @@ -110,7 +112,9 @@ namespace BizHawk.Common /// all Types with the name /// adapted from https://stackoverflow.com/a/13727044/7467292 public static IList GetTypeByName(string className) => AppDomain.CurrentDomain.GetAssemblies() - .SelectMany(asm => asm.GetTypesWithoutLoadErrors().Where(type => className.Equals(type.Name, StringComparison.OrdinalIgnoreCase))).ToList(); + .SelectMany(static asm => asm.GetTypesWithoutLoadErrors()) + .Where(type => type.Name.EqualsIgnoreCase(className)) + .ToList(); /// TODO replace this with GetTypes (i.e. the try block) when VB.NET dep is properly removed public static IEnumerable GetTypesWithoutLoadErrors(this Assembly assembly) diff --git a/src/BizHawk.Emulation.Common/DSKIdentifier.cs b/src/BizHawk.Emulation.Common/DSKIdentifier.cs index 96fea2bb67..0bdab02468 100644 --- a/src/BizHawk.Emulation.Common/DSKIdentifier.cs +++ b/src/BizHawk.Emulation.Common/DSKIdentifier.cs @@ -82,7 +82,7 @@ namespace BizHawk.Emulation.Common continue; string str = Encoding.ASCII.GetString(s.SectorData, 0, s.SectorData.Length); - if (str.Contains("PLUS3DOS", StringComparison.OrdinalIgnoreCase)) + if (str.ContainsIgnoreCase("PLUS3DOS")) { IdentifiedSystem = VSystemID.Raw.ZXSpectrum; return; diff --git a/src/BizHawk.Emulation.Common/Database/Database.cs b/src/BizHawk.Emulation.Common/Database/Database.cs index f4245fb80f..d011e82b6f 100644 --- a/src/BizHawk.Emulation.Common/Database/Database.cs +++ b/src/BizHawk.Emulation.Common/Database/Database.cs @@ -44,8 +44,8 @@ namespace BizHawk.Emulation.Common private static void LoadDatabase_Escape(string line, bool inUser, bool silent) { - var isUserInclude = line.StartsWith("#includeuser", StringComparison.OrdinalIgnoreCase); - if (!isUserInclude && !line.StartsWith("#include", StringComparison.OrdinalIgnoreCase)) return; + var isUserInclude = line.StartsWithIgnoreCase("#includeuser"); + if (!isUserInclude && !line.StartsWithIgnoreCase("#include")) return; var searchUser = inUser || isUserInclude; line = line.Substring(isUserInclude ? 12 : 8).TrimStart(); diff --git a/src/BizHawk.Emulation.Common/IpfIdentifier.cs b/src/BizHawk.Emulation.Common/IpfIdentifier.cs index 09dd1ab6f3..c61fdffe2d 100644 --- a/src/BizHawk.Emulation.Common/IpfIdentifier.cs +++ b/src/BizHawk.Emulation.Common/IpfIdentifier.cs @@ -31,7 +31,7 @@ namespace BizHawk.Emulation.Common // look for standard magic string string ident = Encoding.ASCII.GetString(_data, 0, 16); - if (!ident.Contains("CAPS", StringComparison.OrdinalIgnoreCase)) + if (!ident.ContainsIgnoreCase("CAPS")) { // incorrect format return; diff --git a/src/BizHawk.Emulation.Cores/Arcades/MAME/MAME.cs b/src/BizHawk.Emulation.Cores/Arcades/MAME/MAME.cs index c5fba2de3d..f188b36c4c 100644 --- a/src/BizHawk.Emulation.Cores/Arcades/MAME/MAME.cs +++ b/src/BizHawk.Emulation.Cores/Arcades/MAME/MAME.cs @@ -48,21 +48,9 @@ namespace BizHawk.Emulation.Cores.Arcades.MAME text + (text == "" ? "" : "\r\n") + string.Join("\r\n", _romHashes.Select(static r => $"{r.Value} - {r.Key}")); - if (text.Contains("imperfect", StringComparison.OrdinalIgnoreCase)) - { - lp.Game.Status = RomStatus.Imperfect; - } - - if (text.Contains("unemulated", StringComparison.OrdinalIgnoreCase)) - { - lp.Game.Status = RomStatus.Unimplemented; - } - - if (text.Contains("doesn't work", StringComparison.OrdinalIgnoreCase)) - { - lp.Game.Status = RomStatus.NotWorking; - } - + if (text.ContainsIgnoreCase("doesn't work")) lp.Game.Status = RomStatus.NotWorking; + else if (text.ContainsIgnoreCase("unemulated")) lp.Game.Status = RomStatus.Unimplemented; + else if (text.ContainsIgnoreCase("imperfect")) lp.Game.Status = RomStatus.Imperfect; }; _exe = new(new() diff --git a/src/BizHawk.Emulation.Cores/Computers/AmstradCPC/Machine/CPCBase.Media.cs b/src/BizHawk.Emulation.Cores/Computers/AmstradCPC/Machine/CPCBase.Media.cs index 98841d815c..64895b7bdd 100644 --- a/src/BizHawk.Emulation.Cores/Computers/AmstradCPC/Machine/CPCBase.Media.cs +++ b/src/BizHawk.Emulation.Cores/Computers/AmstradCPC/Machine/CPCBase.Media.cs @@ -232,7 +232,7 @@ namespace BizHawk.Emulation.Cores.Computers.AmstradCPC string hdr = Encoding.ASCII.GetString(data.Take(16).ToArray()); // disk checking first - if (hdr.Contains("EXTENDED CPC DSK", StringComparison.OrdinalIgnoreCase) || hdr.Contains("MV - CPC", StringComparison.OrdinalIgnoreCase)) + if (hdr.ContainsIgnoreCase("MV - CPC") || hdr.ContainsIgnoreCase("EXTENDED CPC DSK")) { // amstrad .dsk disk file // check for number of sides @@ -244,7 +244,7 @@ namespace BizHawk.Emulation.Cores.Computers.AmstradCPC } // tape checking - if (hdr.StartsWith("ZXTAPE!", StringComparison.OrdinalIgnoreCase)) + if (hdr.StartsWithIgnoreCase("ZXTAPE!")) { // cdt tape file return CPCMediaType.Tape; diff --git a/src/BizHawk.Emulation.Cores/Computers/AmstradCPC/Media/Disk/CPCExtendedFloppyDisk.cs b/src/BizHawk.Emulation.Cores/Computers/AmstradCPC/Media/Disk/CPCExtendedFloppyDisk.cs index cd24f967ca..35951aeb8c 100644 --- a/src/BizHawk.Emulation.Cores/Computers/AmstradCPC/Media/Disk/CPCExtendedFloppyDisk.cs +++ b/src/BizHawk.Emulation.Cores/Computers/AmstradCPC/Media/Disk/CPCExtendedFloppyDisk.cs @@ -28,7 +28,7 @@ namespace BizHawk.Emulation.Cores.Computers.AmstradCPC // look for standard magic string string ident = Encoding.ASCII.GetString(data, 0, 16); - if (!ident.Contains("EXTENDED CPC DSK", StringComparison.OrdinalIgnoreCase)) + if (!ident.ContainsIgnoreCase("EXTENDED CPC DSK")) { // incorrect format return false; @@ -153,7 +153,7 @@ namespace BizHawk.Emulation.Cores.Computers.AmstradCPC { // look for standard magic string string ident = Encoding.ASCII.GetString(data, 0, 16); - if (!ident.Contains("EXTENDED CPC DSK", StringComparison.OrdinalIgnoreCase)) + if (!ident.ContainsIgnoreCase("EXTENDED CPC DSK")) { // incorrect format return false; diff --git a/src/BizHawk.Emulation.Cores/Computers/AmstradCPC/Media/Disk/CPCFloppyDisk.cs b/src/BizHawk.Emulation.Cores/Computers/AmstradCPC/Media/Disk/CPCFloppyDisk.cs index a28facaa1e..901ea9a350 100644 --- a/src/BizHawk.Emulation.Cores/Computers/AmstradCPC/Media/Disk/CPCFloppyDisk.cs +++ b/src/BizHawk.Emulation.Cores/Computers/AmstradCPC/Media/Disk/CPCFloppyDisk.cs @@ -28,7 +28,7 @@ namespace BizHawk.Emulation.Cores.Computers.AmstradCPC // look for standard magic string string ident = Encoding.ASCII.GetString(data, 0, 16); - if (!ident.Contains("MV - CPC", StringComparison.OrdinalIgnoreCase)) + if (!ident.ContainsIgnoreCase("MV - CPC")) { // incorrect format return false; @@ -159,7 +159,7 @@ namespace BizHawk.Emulation.Cores.Computers.AmstradCPC { // look for standard magic string string ident = Encoding.ASCII.GetString(data, 0, 16); - if (!ident.Contains("MV - CPC", StringComparison.OrdinalIgnoreCase)) + if (!ident.ContainsIgnoreCase("MV - CPC")) { // incorrect format return false; diff --git a/src/BizHawk.Emulation.Cores/Computers/AmstradCPC/Media/Disk/FloppyDisk.cs b/src/BizHawk.Emulation.Cores/Computers/AmstradCPC/Media/Disk/FloppyDisk.cs index 9e6464c017..632098877a 100644 --- a/src/BizHawk.Emulation.Cores/Computers/AmstradCPC/Media/Disk/FloppyDisk.cs +++ b/src/BizHawk.Emulation.Cores/Computers/AmstradCPC/Media/Disk/FloppyDisk.cs @@ -240,8 +240,7 @@ namespace BizHawk.Emulation.Cores.Computers.AmstradCPC // check for SPEEDLOCK ident in sector 0 string ident = Encoding.ASCII.GetString(DiskTracks[0].Sectors[0].SectorData, 0, DiskTracks[0].Sectors[0].SectorData.Length); - if (!ident.Contains("SPEEDLOCK", StringComparison.OrdinalIgnoreCase)) - return false; + if (!ident.ContainsIgnoreCase("SPEEDLOCK")) return false; // check for correct sector 0 lengths if (DiskTracks[0].Sectors[0] is not { SectorSize: 2, SectorData.Length: >= 0x200 }) return false; @@ -296,8 +295,7 @@ namespace BizHawk.Emulation.Cores.Computers.AmstradCPC // check for ALKATRAZ ident in sector 0 string ident = Encoding.ASCII.GetString(DiskTracks[0].Sectors[0].SectorData, 0, DiskTracks[0].Sectors[0].SectorData.Length); - if (!ident.Contains("ALKATRAZ PROTECTION SYSTEM", StringComparison.OrdinalIgnoreCase)) - return false; + if (!ident.ContainsIgnoreCase("ALKATRAZ PROTECTION SYSTEM")) return false; // ALKATRAZ NOTES (-asni 2018-05-01) // --------------------------------- @@ -337,8 +335,7 @@ namespace BizHawk.Emulation.Cores.Computers.AmstradCPC // check for PAUL OWENS ident in sector 2 string ident = Encoding.ASCII.GetString(DiskTracks[0].Sectors[2].SectorData, 0, DiskTracks[0].Sectors[2].SectorData.Length); - if (!ident.Contains("PAUL OWENS", StringComparison.OrdinalIgnoreCase)) - return false; + if (!ident.ContainsIgnoreCase("PAUL OWENS")) return false; // Paul Owens Disk Protection Notes (-asni 2018-05-01) // --------------------------------------------------- @@ -379,8 +376,7 @@ namespace BizHawk.Emulation.Cores.Computers.AmstradCPC // check for Hexagon ident in sector 8 string ident = Encoding.ASCII.GetString(DiskTracks[0].Sectors[8].SectorData, 0, DiskTracks[0].Sectors[8].SectorData.Length); - if (ident.Contains("GON DISK PROT", StringComparison.OrdinalIgnoreCase)) - return true; + if (ident.ContainsIgnoreCase("GON DISK PROT")) return true; // hexagon protection may not be labelled as such var track = DiskTracks[1]; @@ -414,7 +410,7 @@ namespace BizHawk.Emulation.Cores.Computers.AmstradCPC // check for speedlock copyright notice string ident = Encoding.ASCII.GetString(DiskData, 0x100, 0x1400); - if (!ident.ToUpper().Contains("SPEEDLOCK")) + if (!ident.ContainsIgnoreCase("SPEEDLOCK")) { // speedlock not found return; diff --git a/src/BizHawk.Emulation.Cores/Computers/SinclairSpectrum/Machine/SpectrumBase.Media.cs b/src/BizHawk.Emulation.Cores/Computers/SinclairSpectrum/Machine/SpectrumBase.Media.cs index bb2f80b28b..a67ccd2d25 100644 --- a/src/BizHawk.Emulation.Cores/Computers/SinclairSpectrum/Machine/SpectrumBase.Media.cs +++ b/src/BizHawk.Emulation.Cores/Computers/SinclairSpectrum/Machine/SpectrumBase.Media.cs @@ -245,7 +245,7 @@ namespace BizHawk.Emulation.Cores.Computers.SinclairSpectrum string hdr = Encoding.ASCII.GetString(data.Take(16).ToArray()); // disk checking first - if (hdr.Contains("EXTENDED CPC DSK", StringComparison.OrdinalIgnoreCase) || hdr.Contains("MV - CPC", StringComparison.OrdinalIgnoreCase)) + if (hdr.ContainsIgnoreCase("MV - CPC") || hdr.ContainsIgnoreCase("EXTENDED CPC DSK")) { // spectrum .dsk disk file // check for number of sides @@ -255,17 +255,17 @@ namespace BizHawk.Emulation.Cores.Computers.SinclairSpectrum else return SpectrumMediaType.DiskDoubleSided; } - if (hdr.StartsWith("FDI", StringComparison.OrdinalIgnoreCase)) + if (hdr.StartsWithIgnoreCase("FDI")) { // spectrum .fdi disk file return SpectrumMediaType.Disk; } - if (hdr.StartsWith("CAPS", StringComparison.OrdinalIgnoreCase)) + if (hdr.StartsWithIgnoreCase("CAPS")) { // IPF format file return SpectrumMediaType.Disk; } - if (hdr.StartsWith("UDI!", StringComparison.OrdinalIgnoreCase) && data[0x08] == 0) + if (hdr.StartsWithIgnoreCase("UDI!") && data[0x08] is 0) { // UDI v1.0 if (hdr.StartsWithOrdinal("udi!")) @@ -282,22 +282,22 @@ namespace BizHawk.Emulation.Cores.Computers.SinclairSpectrum } // tape checking - if (hdr.StartsWith("ZXTAPE!", StringComparison.OrdinalIgnoreCase)) + if (hdr.StartsWithIgnoreCase("ZXTAPE!")) { // spectrum .tzx tape file return SpectrumMediaType.Tape; } - if (hdr.StartsWith("PZXT", StringComparison.OrdinalIgnoreCase)) + if (hdr.StartsWithIgnoreCase("PZXT")) { // spectrum .tzx tape file return SpectrumMediaType.Tape; } - if (hdr.StartsWith("COMPRESSED SQ", StringComparison.OrdinalIgnoreCase)) + if (hdr.StartsWithIgnoreCase("COMPRESSED SQ")) { // spectrum .tzx tape file return SpectrumMediaType.Tape; } - if (hdr.Contains("WAVE", StringComparison.OrdinalIgnoreCase)) + if (hdr.ContainsIgnoreCase("WAVE")) { // spectrum .tzx tape file return SpectrumMediaType.Tape; diff --git a/src/BizHawk.Emulation.Cores/Computers/SinclairSpectrum/Media/Disk/CPCFormat/CPCExtendedFloppyDisk.cs b/src/BizHawk.Emulation.Cores/Computers/SinclairSpectrum/Media/Disk/CPCFormat/CPCExtendedFloppyDisk.cs index 582900802d..f2a4074dc0 100644 --- a/src/BizHawk.Emulation.Cores/Computers/SinclairSpectrum/Media/Disk/CPCFormat/CPCExtendedFloppyDisk.cs +++ b/src/BizHawk.Emulation.Cores/Computers/SinclairSpectrum/Media/Disk/CPCFormat/CPCExtendedFloppyDisk.cs @@ -28,7 +28,7 @@ namespace BizHawk.Emulation.Cores.Computers.SinclairSpectrum // look for standard magic string string ident = Encoding.ASCII.GetString(data, 0, 16); - if (!ident.Contains("EXTENDED CPC DSK", StringComparison.OrdinalIgnoreCase)) + if (!ident.ContainsIgnoreCase("EXTENDED CPC DSK")) { // incorrect format return false; @@ -153,7 +153,7 @@ namespace BizHawk.Emulation.Cores.Computers.SinclairSpectrum { // look for standard magic string string ident = Encoding.ASCII.GetString(data, 0, 16); - if (!ident.Contains("EXTENDED CPC DSK", StringComparison.OrdinalIgnoreCase)) + if (!ident.ContainsIgnoreCase("EXTENDED CPC DSK")) { // incorrect format return false; diff --git a/src/BizHawk.Emulation.Cores/Computers/SinclairSpectrum/Media/Disk/CPCFormat/CPCFloppyDisk.cs b/src/BizHawk.Emulation.Cores/Computers/SinclairSpectrum/Media/Disk/CPCFormat/CPCFloppyDisk.cs index 9f3eaae53a..0f43d036dd 100644 --- a/src/BizHawk.Emulation.Cores/Computers/SinclairSpectrum/Media/Disk/CPCFormat/CPCFloppyDisk.cs +++ b/src/BizHawk.Emulation.Cores/Computers/SinclairSpectrum/Media/Disk/CPCFormat/CPCFloppyDisk.cs @@ -28,7 +28,7 @@ namespace BizHawk.Emulation.Cores.Computers.SinclairSpectrum // look for standard magic string string ident = Encoding.ASCII.GetString(data, 0, 16); - if (!ident.Contains("MV - CPC", StringComparison.OrdinalIgnoreCase)) + if (!ident.ContainsIgnoreCase("MV - CPC")) { // incorrect format return false; @@ -158,7 +158,7 @@ namespace BizHawk.Emulation.Cores.Computers.SinclairSpectrum { // look for standard magic string string ident = Encoding.ASCII.GetString(data, 0, 16); - if (!ident.Contains("MV - CPC", StringComparison.OrdinalIgnoreCase)) + if (!ident.ContainsIgnoreCase("MV - CPC")) { // incorrect format return false; diff --git a/src/BizHawk.Emulation.Cores/Computers/SinclairSpectrum/Media/Disk/FloppyDisk.cs b/src/BizHawk.Emulation.Cores/Computers/SinclairSpectrum/Media/Disk/FloppyDisk.cs index d0234451f5..70a7ee5782 100644 --- a/src/BizHawk.Emulation.Cores/Computers/SinclairSpectrum/Media/Disk/FloppyDisk.cs +++ b/src/BizHawk.Emulation.Cores/Computers/SinclairSpectrum/Media/Disk/FloppyDisk.cs @@ -240,8 +240,7 @@ namespace BizHawk.Emulation.Cores.Computers.SinclairSpectrum // check for SPEEDLOCK ident in sector 0 string ident = Encoding.ASCII.GetString(DiskTracks[0].Sectors[0].SectorData, 0, DiskTracks[0].Sectors[0].SectorData.Length); - if (!ident.Contains("SPEEDLOCK", StringComparison.OrdinalIgnoreCase)) - return false; + if (!ident.ContainsIgnoreCase("SPEEDLOCK")) return false; // check for correct sector 0 lengths if (DiskTracks[0].Sectors[0] is not { SectorSize: 2, SectorData.Length: >= 0x200 }) return false; @@ -296,8 +295,7 @@ namespace BizHawk.Emulation.Cores.Computers.SinclairSpectrum // check for ALKATRAZ ident in sector 0 string ident = Encoding.ASCII.GetString(DiskTracks[0].Sectors[0].SectorData, 0, DiskTracks[0].Sectors[0].SectorData.Length); - if (!ident.Contains("ALKATRAZ PROTECTION SYSTEM", StringComparison.OrdinalIgnoreCase)) - return false; + if (!ident.ContainsIgnoreCase("ALKATRAZ PROTECTION SYSTEM")) return false; // ALKATRAZ NOTES (-asni 2018-05-01) // --------------------------------- @@ -337,8 +335,7 @@ namespace BizHawk.Emulation.Cores.Computers.SinclairSpectrum // check for PAUL OWENS ident in sector 2 string ident = Encoding.ASCII.GetString(DiskTracks[0].Sectors[2].SectorData, 0, DiskTracks[0].Sectors[2].SectorData.Length); - if (!ident.Contains("PAUL OWENS", StringComparison.OrdinalIgnoreCase)) - return false; + if (!ident.ContainsIgnoreCase("PAUL OWENS")) return false; // Paul Owens Disk Protection Notes (-asni 2018-05-01) // --------------------------------------------------- @@ -379,8 +376,7 @@ namespace BizHawk.Emulation.Cores.Computers.SinclairSpectrum // check for Hexagon ident in sector 8 string ident = Encoding.ASCII.GetString(DiskTracks[0].Sectors[8].SectorData, 0, DiskTracks[0].Sectors[8].SectorData.Length); - if (ident.Contains("GON DISK PROT", StringComparison.OrdinalIgnoreCase)) - return true; + if (ident.ContainsIgnoreCase("GON DISK PROT")) return true; // hexagon protection may not be labelled as such var track = DiskTracks[1]; @@ -414,7 +410,7 @@ namespace BizHawk.Emulation.Cores.Computers.SinclairSpectrum // check for speedlock copyright notice string ident = Encoding.ASCII.GetString(DiskData, 0x100, 0x1400); - if (!ident.ToUpper().Contains("SPEEDLOCK")) + if (!ident.ContainsIgnoreCase("SPEEDLOCK")) { // speedlock not found return; diff --git a/src/BizHawk.Emulation.Cores/Computers/SinclairSpectrum/Media/Disk/IPFFormat/IPFFloppyDisk.cs b/src/BizHawk.Emulation.Cores/Computers/SinclairSpectrum/Media/Disk/IPFFormat/IPFFloppyDisk.cs index a9c4eb6c4d..7d03647045 100644 --- a/src/BizHawk.Emulation.Cores/Computers/SinclairSpectrum/Media/Disk/IPFFormat/IPFFloppyDisk.cs +++ b/src/BizHawk.Emulation.Cores/Computers/SinclairSpectrum/Media/Disk/IPFFormat/IPFFloppyDisk.cs @@ -27,7 +27,7 @@ namespace BizHawk.Emulation.Cores.Computers.SinclairSpectrum // look for standard magic string string ident = Encoding.ASCII.GetString(data, 0, 16); - if (!ident.Contains("CAPS", StringComparison.OrdinalIgnoreCase)) + if (!ident.ContainsIgnoreCase("CAPS")) { // incorrect format return false; diff --git a/src/BizHawk.Emulation.Cores/Consoles/Sega/gpgx64/GPGX.ISettable.cs b/src/BizHawk.Emulation.Cores/Consoles/Sega/gpgx64/GPGX.ISettable.cs index c43a2e187c..2f39f8814a 100644 --- a/src/BizHawk.Emulation.Cores/Consoles/Sega/gpgx64/GPGX.ISettable.cs +++ b/src/BizHawk.Emulation.Cores/Consoles/Sega/gpgx64/GPGX.ISettable.cs @@ -2,6 +2,7 @@ using System.ComponentModel; using System.Globalization; using BizHawk.Common; +using BizHawk.Common.StringExtensions; using BizHawk.Emulation.Common; using Newtonsoft.Json; @@ -54,7 +55,7 @@ namespace BizHawk.Emulation.Cores.Consoles.Sega.gpgx if (value?.GetType() == typeof(string)) { var input = (string)value; - if (input.StartsWith("0x", StringComparison.OrdinalIgnoreCase)) + if (input.StartsWithIgnoreCase("0x")) { input = input[2..]; } @@ -89,7 +90,7 @@ namespace BizHawk.Emulation.Cores.Consoles.Sega.gpgx if (value?.GetType() == typeof(string)) { var input = (string)value; - if (input.StartsWith("0x", StringComparison.OrdinalIgnoreCase)) + if (input.StartsWithIgnoreCase("0x")) { input = input[2..]; } diff --git a/src/BizHawk.Emulation.DiscSystem/DiscDecoding.cs b/src/BizHawk.Emulation.DiscSystem/DiscDecoding.cs index f996c24a9b..9caaf65e0f 100644 --- a/src/BizHawk.Emulation.DiscSystem/DiscDecoding.cs +++ b/src/BizHawk.Emulation.DiscSystem/DiscDecoding.cs @@ -1,7 +1,9 @@ using System.IO; +using System.Linq; using BizHawk.Common; using BizHawk.Common.PathExtensions; +using BizHawk.Common.StringExtensions; namespace BizHawk.Emulation.DiscSystem { @@ -29,28 +31,10 @@ namespace BizHawk.Emulation.DiscSystem private string FindAudio(string audioPath) { var (dir, basePath, _) = audioPath.SplitPathToDirFileAndExt(); - //look for potential candidates - DirectoryInfo di = new(dir!); - var fis = di.GetFiles(); - //first, look for the file type we actually asked for - foreach (var fi in fis) - { - if (string.Equals(fi.FullName, audioPath, StringComparison.OrdinalIgnoreCase)) - if (CheckForAudio(fi.FullName)) - return fi.FullName; - } - //then look for any other type - foreach (var fi in fis) - { - if (string.Equals(Path.GetFileNameWithoutExtension(fi.FullName), basePath, StringComparison.OrdinalIgnoreCase)) - { - if (CheckForAudio(fi.FullName)) - { - return fi.FullName; - } - } - } - return null; + var filePaths = new DirectoryInfo(dir!).GetFiles().Select(static fi => fi.FullName).ToArray(); + return filePaths.Where(audioPath.EqualsIgnoreCase) // first, look for the file type we actually asked for... + .Concat(filePaths.Where(filePath => Path.GetFileNameWithoutExtension(filePath).EqualsIgnoreCase(basePath))) // ...then look for any other type + .FirstOrDefault(CheckForAudio); } /// could not find source audio for diff --git a/src/BizHawk.Emulation.DiscSystem/DiscFormats/CCD_format.cs b/src/BizHawk.Emulation.DiscSystem/DiscFormats/CCD_format.cs index 4f67776a51..1aa0ec90fc 100644 --- a/src/BizHawk.Emulation.DiscSystem/DiscFormats/CCD_format.cs +++ b/src/BizHawk.Emulation.DiscSystem/DiscFormats/CCD_format.cs @@ -212,7 +212,7 @@ namespace BizHawk.Emulation.DiscSystem continue; } int val; - if (parts[1].StartsWith("0x", StringComparison.OrdinalIgnoreCase)) + if (parts[1].StartsWithIgnoreCase("0x")) val = int.Parse(parts[1].Substring(2), NumberStyles.HexNumber); else val = int.Parse(parts[1]); diff --git a/src/BizHawk.Emulation.DiscSystem/DiscFormats/CUE/CUE_Parse.cs b/src/BizHawk.Emulation.DiscSystem/DiscFormats/CUE/CUE_Parse.cs index 1d3de8c1c5..222e2db463 100644 --- a/src/BizHawk.Emulation.DiscSystem/DiscFormats/CUE/CUE_Parse.cs +++ b/src/BizHawk.Emulation.DiscSystem/DiscFormats/CUE/CUE_Parse.cs @@ -312,7 +312,8 @@ namespace BizHawk.Emulation.DiscSystem.CUE // cues don't support multiple sessions themselves, but it is common for rips to put SESSION # in REM fields // so, if we have such a REM, we'll check if the comment starts with SESSION, and interpret that as a session "command" var trimmed = comment.Trim(); - if (trimmed.StartsWith("SESSION ", StringComparison.OrdinalIgnoreCase) && int.TryParse(trimmed.Substring(8), out var number) && number > 0) + if (trimmed.StartsWithIgnoreCase("SESSION ") + && int.TryParse(trimmed.Substring(8), out var number) && number > 0) { OUT_CueFile.Commands.Add(new CUE_File.Command.SESSION(number)); break; diff --git a/src/BizHawk.Emulation.DiscSystem/DiscFormats/CUE/CueFileResolver.cs b/src/BizHawk.Emulation.DiscSystem/DiscFormats/CUE/CueFileResolver.cs index 6242271dee..bc9a37249b 100644 --- a/src/BizHawk.Emulation.DiscSystem/DiscFormats/CUE/CueFileResolver.cs +++ b/src/BizHawk.Emulation.DiscSystem/DiscFormats/CUE/CueFileResolver.cs @@ -2,6 +2,8 @@ using System.IO; using System.Collections.Generic; using System.Linq; +using BizHawk.Common.StringExtensions; + namespace BizHawk.Emulation.DiscSystem.CUE { /// @@ -33,6 +35,7 @@ namespace BizHawk.Emulation.DiscSystem.CUE /// public List Resolve(string path) { + var interpretedAsRel = Path.Combine(_baseDir, path); string targetFile = Path.GetFileName(path); string targetFragment = Path.GetFileNameWithoutExtension(path); @@ -66,7 +69,7 @@ namespace BizHawk.Emulation.DiscSystem.CUE if (cmp == 0) { //take care to add an exact match at the beginning - if (string.Equals(filePath, Path.Combine(_baseDir, path), StringComparison.OrdinalIgnoreCase)) + if (filePath.EqualsIgnoreCase(interpretedAsRel)) results.Insert(0, filePath); else results.Add(filePath); diff --git a/src/BizHawk.Emulation.DiscSystem/DiscFormats/MDS_Format.cs b/src/BizHawk.Emulation.DiscSystem/DiscFormats/MDS_Format.cs index 1b35f404f6..d7f67999aa 100644 --- a/src/BizHawk.Emulation.DiscSystem/DiscFormats/MDS_Format.cs +++ b/src/BizHawk.Emulation.DiscSystem/DiscFormats/MDS_Format.cs @@ -6,6 +6,7 @@ using System.Linq; using System.Runtime.InteropServices; using BizHawk.Common.PathExtensions; +using BizHawk.Common.StringExtensions; using ISOParser; @@ -488,7 +489,7 @@ namespace BizHawk.Emulation.DiscSystem var (dir, fileNoExt, _) = aFile.MDSPath.SplitPathToDirFileAndExt(); if (f.FilenameOffset is 0 - || string.Equals(fileName, "*.mdf", StringComparison.OrdinalIgnoreCase)) + || "*.mdf".EqualsIgnoreCase(fileName)) { fileName = $@"{dir}\{fileNoExt}.mdf"; } diff --git a/src/BizHawk.Emulation.DiscSystem/DiscIdentifier.cs b/src/BizHawk.Emulation.DiscSystem/DiscIdentifier.cs index 783b367bd5..f54c792801 100644 --- a/src/BizHawk.Emulation.DiscSystem/DiscIdentifier.cs +++ b/src/BizHawk.Emulation.DiscSystem/DiscIdentifier.cs @@ -452,7 +452,7 @@ namespace BizHawk.Emulation.DiscSystem private bool SectorContains(string s, int lba = 0) { var data = ReadDataSectorCached(lba); - return data != null && Encoding.ASCII.GetString(data).Contains(s, StringComparison.OrdinalIgnoreCase); + return data is not null && Encoding.ASCII.GetString(data).ContainsIgnoreCase(s); } } }