From d614379cf5c4a5ee173d0d2d03a0b8ea40d7e831 Mon Sep 17 00:00:00 2001 From: Matt Nadareski Date: Sat, 21 Mar 2026 13:55:42 -0400 Subject: [PATCH] Libraries This change looks dramatic, but it's just separating out the already-split namespaces into separate top-level folders. In theory, every single one could be built into their own Nuget package. `SabreTools.IO.Meta` builds the normal Nuget package that is used by all other projects and includes all namespaces. `SabreTools.IO` builds to `SabreTools.IO.Common` to avoid overwriting issues on publish. --- .../BZip2Tests.cs | 0 .../BlastTests.cs | 0 .../MSZIPTests.cs | 0 .../QuantumTests.cs | 0 .../SabreTools.IO.Compression.Test.csproj | 39 ++++ .../TestData/Subdirectory/sample.txt | 1 + .../TestData/ascii.txt | 1 + .../TestData/file-to-compress.bin | 1 + .../TestData/test-archive.bz2 | Bin 0 -> 122 bytes .../TestData/test-archive.msz | Bin 0 -> 15639 bytes .../TestData/test-archive.pk | Bin 0 -> 8 bytes .../TestData/test-archive.qtm | Bin 0 -> 20350 bytes .../TestData/utf16bebom.txt | 1 + .../TestData/utf16lebom.txt | 1 + .../TestData/utf32bom.txt | Bin 0 -> 4 bytes .../TestData/utf7bom.txt | 1 + .../TestData/utf8bom.txt | 1 + .../BZip2/BZip2.cs | 0 .../BZip2/BZip2Compressor.cs | 0 .../BZip2/BZip2InputStream.cs | 0 .../BZip2/BZip2OutputStream.cs | 0 .../BZip2/BitWriter.cs | 0 .../BZip2/CRC32.cs | 0 .../BZip2/Rand.cs | 0 .../Blast/Constants.cs | 0 .../Blast/Decompressor.cs | 0 .../Blast/Huffman.cs | 0 .../Blast/State.cs | 0 .../Deflate/Adler.cs | 0 .../Deflate/BlockState.cs | 0 .../Deflate/CRC32.cs | 0 .../Deflate/CompressionLevel.cs | 0 .../Deflate/CompressionMode.cs | 0 .../Deflate/CompressionStrategy.cs | 0 .../Deflate/DeflateFlavor.cs | 0 .../Deflate/DeflateInfo.cs | 0 .../Deflate/DeflateManager.cs | 0 .../Deflate/DeflateStream.cs | 0 .../Deflate/Enums.cs | 0 .../Deflate/FlushType.cs | 0 .../Deflate/GZipStream.cs | 0 .../Deflate/InfTree.cs | 0 .../Deflate/InflateBlocks.cs | 0 .../Deflate/InflateCodes.cs | 0 .../Deflate/InflateManager.cs | 0 .../Deflate/InflateWrapper.cs | 0 .../Deflate/InternalConstants.cs | 0 .../Deflate/InternalInflateConstants.cs | 0 .../Deflate/LICENSE.jzlib.txt | 0 .../Deflate/License.zlib.txt | 0 .../Deflate/SharedUtils.cs | 0 .../Deflate/StaticTree.cs | 0 .../Deflate/Tree.cs | 0 .../Deflate/WorkItem.cs | 0 .../Deflate/ZlibBaseStream.cs | 0 .../Deflate/ZlibCodec.cs | 0 .../Deflate/ZlibConstants.cs | 0 .../Deflate/ZlibException.cs | 0 .../Deflate/ZlibStream.cs | 0 .../Deflate/ZlibStreamFlavor.cs | 0 .../ExtensionAttribute.cs | 9 + .../LZX/AlignedOffsetBlockData.cs | 0 .../LZX/Block.cs | 0 .../LZX/BlockData.cs | 0 .../LZX/BlockHeader.cs | 0 .../LZX/Chunk.cs | 0 .../LZX/ChunkHeader.cs | 0 .../LZX/Constants.cs | 0 .../LZX/Enums.cs | 0 .../LZX/UncompressedBlockData.cs | 0 .../LZX/VerbatimBlockData.cs | 0 .../MSZIP/BlockHeader.cs | 0 .../MSZIP/Decompressor.cs | 0 .../Quantum/Constants.cs | 0 .../Quantum/Decompressor.cs | 0 .../Quantum/Enums.cs | 0 .../Quantum/Model.cs | 0 .../Quantum/ModelSymbol.cs | 0 .../README.MD | 0 .../SZDD/Decompressor.cs | 0 .../SZDD/Enums.cs | 0 .../SabreTools.IO.Compression.csproj | 41 ++++ .../zlib/Hebron.Runtime/CRuntime.cs | 0 .../zlib/Hebron.Runtime/MemoryStats.cs | 0 .../zlib/Hebron.Runtime/UnsafeArray1D.cs | 0 .../zlib/Hebron.Runtime/UnsafeArray2D.cs | 0 .../zlib/LICENSE | 0 .../zlib/README.md | 0 .../zlib/ZlibDeflateStream.cs | 0 .../zlib/ZlibInflateStream.cs | 0 .../zlib/zlib.cs | 0 .../zlib/zlibConst.cs | 0 .../BinaryReaderExtensionsTests.cs | 0 .../BinaryWriterExtensionsTests.cs | 0 .../ByteArrayExtensionsTests.cs | 0 .../ByteArrayReaderExtensionsTests.cs | 0 .../ByteArrayWriterExtensionsTests.cs | 0 .../DateTimeExtensionsTests.cs | 0 .../DictionaryExtensionsTests.cs | 0 .../EnumerableExtensionsTests.cs | 0 .../IOExtensionsTests.cs | 0 .../ParentablePathExtensionsTests.cs | 0 .../ReadOnlyBitStreamExtensionsTests.cs | 0 .../SabreTools.IO.Extensions.Test.csproj | 39 ++++ .../StreamExtensionsTests.cs | 0 .../StreamReaderExtensionsTests.cs | 0 .../StreamWriterExtensionsTests.cs | 0 .../StringExtensionsTests.cs | 0 .../TestData/Subdirectory/sample.txt | 1 + .../TestData/ascii.txt | 1 + .../TestData/file-to-compress.bin | 1 + .../TestData/test-archive.bz2 | Bin 0 -> 122 bytes .../TestData/test-archive.msz | Bin 0 -> 15639 bytes .../TestData/test-archive.pk | Bin 0 -> 8 bytes .../TestData/test-archive.qtm | Bin 0 -> 20350 bytes .../TestData/utf16bebom.txt | 1 + .../TestData/utf16lebom.txt | 1 + .../TestData/utf32bom.txt | Bin 0 -> 4 bytes .../TestData/utf7bom.txt | 1 + .../TestData/utf8bom.txt | 1 + .../TestEnum.cs | 0 .../TestStructArrays.cs | 0 .../TestStructExplicit.cs | 0 .../TestStructInheritance.cs | 0 .../TestStructSequential.cs | 0 .../TestStructStrings.cs | 0 .../XmlTextWriterExtensionsTests.cs | 0 .../BinaryReaderExtensions.cs | 0 .../BinaryWriterExtensions.cs | 0 .../ByteArrayExtensions.cs | 0 .../ByteArrayReaderExtensions.cs | 0 .../ByteArrayWriterExtensions.cs | 0 .../DateTimeExtensions.cs | 0 .../DictionaryExtensions.cs | 0 .../EnumerableExtensions.cs | 0 .../ExtensionAttribute.cs | 9 + .../IOExtensions.cs | 0 .../MarshalHelpers.cs | 0 .../NumericExtensions.cs | 0 .../ParentablePathExtensions.cs | 0 .../README.MD | 0 .../ReadOnlyBitStreamExtensions.cs | 0 .../SabreTools.IO.Extensions.csproj | 39 ++++ .../StreamExtensions.cs | 0 .../StreamReaderExtensions.cs | 0 .../StreamWriterExtensions.cs | 0 .../StringExtensions.cs | 0 .../XmlTextWriterExtensions.cs | 0 SabreTools.IO.Meta/SabreTools.IO.Meta.csproj | 62 ++++++ SabreTools.IO.Test/SabreTools.IO.Test.csproj | 2 + SabreTools.IO.sln | 196 ++++++++++++++++++ .../{SabreTools.IO => }/BufferedStream.cs | 0 SabreTools.IO/{SabreTools.IO => }/Enums.cs | 0 .../{SabreTools.IO => }/OldDotNet.cs | 0 .../{SabreTools.IO => }/ParentablePath.cs | 0 SabreTools.IO/{SabreTools.IO => }/PathTool.cs | 0 SabreTools.IO/{SabreTools.IO => }/README.MD | 0 .../{SabreTools.IO => }/ReadOnlyBitStream.cs | 0 .../ReadOnlyCompositeStream.cs | 0 SabreTools.IO/SabreTools.IO.csproj | 13 +- .../{SabreTools.IO => }/Transform.cs | 0 .../{SabreTools.IO => }/ViewStream.cs | 0 .../SabreTools.Logging.Test.csproj | 2 +- .../Converters.cs | 0 .../Enums.cs | 0 SabreTools.Logging/ExtensionAttribute.cs | 9 + .../InternalStopwatch.cs | 0 .../LogEventArgs.cs | 0 .../Logger.cs | 0 .../LoggerImpl.cs | 0 .../README.MD | 0 SabreTools.Logging/SabreTools.Logging.csproj | 32 +++ .../SabreTools.Matching.Test.csproj | 2 +- .../ContentMatch.cs | 0 .../ContentMatchSet.cs | 0 .../Delegates.cs | 0 .../FilePathMatch.cs | 0 .../IMatch.cs | 0 .../IMatchSet.cs | 0 .../MatchUtil.cs | 0 .../PathMatch.cs | 0 .../PathMatchSet.cs | 0 .../README.MD | 0 .../SabreTools.Matching.csproj | 32 +++ .../SabreTools.Numerics.Test.csproj | 2 +- .../BothEndian.cs | 0 .../BothInt16.cs | 0 .../BothInt32.cs | 0 .../BothInt64.cs | 0 .../BothInt8.cs | 0 .../BothUInt16.cs | 0 .../BothUInt32.cs | 0 .../BothUInt64.cs | 0 .../BothUInt8.cs | 0 .../Int24.cs | 0 .../Int48.cs | 0 .../README.MD | 0 .../SabreTools.Numerics.csproj | 32 +++ .../UInt24.cs | 0 .../UInt48.cs | 0 .../AESCTR.cs | 0 .../MoPaQDecrypter.cs | 0 .../README.MD | 0 .../SabreTools.Security.Cryptography.csproj | 42 ++++ .../SabreTools.Text.ClrMamePro.Test.csproj | 2 +- .../Enums.cs | 0 .../README.MD | 0 .../Reader.cs | 0 .../SabreTools.Text.ClrMamePro.csproj | 32 +++ .../Writer.cs | 0 .../SabreTools.Text.Compare.Test.csproj | 2 +- .../NaturalComparer.cs | 0 .../NaturalComparerUtil.cs | 0 .../NaturalReversedComparer.cs | 0 .../README.MD | 0 .../SabreTools.Text.Compare.csproj | 36 ++++ .../SabreTools.Text.INI.Test.csproj | 2 +- .../Enums.cs | 0 .../IniFile.cs | 0 .../README.MD | 0 .../Reader.cs | 0 .../SabreTools.Text.INI.csproj | 32 +++ .../Writer.cs | 0 ...SabreTools.Text.SeparatedValue.Test.csproj | 2 +- .../README.MD | 0 .../Reader.cs | 0 .../SabreTools.Text.SeparatedValue.csproj | 32 +++ .../Writer.cs | 0 .../SabreTools.Text.Utilities.Test.csproj | 2 +- .../ExtensionAttribute.cs | 9 + .../NumberHelper.cs | 0 .../README.MD | 0 .../SabreTools.Text.Utilities.csproj | 43 ++++ .../TextHelper.cs | 0 publish-nix.sh | 2 +- publish-win.ps1 | 2 +- 236 files changed, 794 insertions(+), 20 deletions(-) rename {SabreTools.IO.Test/Compression => SabreTools.IO.Compression.Test}/BZip2Tests.cs (100%) rename {SabreTools.IO.Test/Compression => SabreTools.IO.Compression.Test}/BlastTests.cs (100%) rename {SabreTools.IO.Test/Compression => SabreTools.IO.Compression.Test}/MSZIPTests.cs (100%) rename {SabreTools.IO.Test/Compression => SabreTools.IO.Compression.Test}/QuantumTests.cs (100%) create mode 100644 SabreTools.IO.Compression.Test/SabreTools.IO.Compression.Test.csproj create mode 100644 SabreTools.IO.Compression.Test/TestData/Subdirectory/sample.txt create mode 100644 SabreTools.IO.Compression.Test/TestData/ascii.txt create mode 100644 SabreTools.IO.Compression.Test/TestData/file-to-compress.bin create mode 100644 SabreTools.IO.Compression.Test/TestData/test-archive.bz2 create mode 100644 SabreTools.IO.Compression.Test/TestData/test-archive.msz create mode 100644 SabreTools.IO.Compression.Test/TestData/test-archive.pk create mode 100644 SabreTools.IO.Compression.Test/TestData/test-archive.qtm create mode 100644 SabreTools.IO.Compression.Test/TestData/utf16bebom.txt create mode 100644 SabreTools.IO.Compression.Test/TestData/utf16lebom.txt create mode 100644 SabreTools.IO.Compression.Test/TestData/utf32bom.txt create mode 100644 SabreTools.IO.Compression.Test/TestData/utf7bom.txt create mode 100644 SabreTools.IO.Compression.Test/TestData/utf8bom.txt rename {SabreTools.IO/SabreTools.IO.Compression => SabreTools.IO.Compression}/BZip2/BZip2.cs (100%) rename {SabreTools.IO/SabreTools.IO.Compression => SabreTools.IO.Compression}/BZip2/BZip2Compressor.cs (100%) rename {SabreTools.IO/SabreTools.IO.Compression => SabreTools.IO.Compression}/BZip2/BZip2InputStream.cs (100%) rename {SabreTools.IO/SabreTools.IO.Compression => SabreTools.IO.Compression}/BZip2/BZip2OutputStream.cs (100%) rename {SabreTools.IO/SabreTools.IO.Compression => SabreTools.IO.Compression}/BZip2/BitWriter.cs (100%) rename {SabreTools.IO/SabreTools.IO.Compression => SabreTools.IO.Compression}/BZip2/CRC32.cs (100%) rename {SabreTools.IO/SabreTools.IO.Compression => SabreTools.IO.Compression}/BZip2/Rand.cs (100%) rename {SabreTools.IO/SabreTools.IO.Compression => SabreTools.IO.Compression}/Blast/Constants.cs (100%) rename {SabreTools.IO/SabreTools.IO.Compression => SabreTools.IO.Compression}/Blast/Decompressor.cs (100%) rename {SabreTools.IO/SabreTools.IO.Compression => SabreTools.IO.Compression}/Blast/Huffman.cs (100%) rename {SabreTools.IO/SabreTools.IO.Compression => SabreTools.IO.Compression}/Blast/State.cs (100%) rename {SabreTools.IO/SabreTools.IO.Compression => SabreTools.IO.Compression}/Deflate/Adler.cs (100%) rename {SabreTools.IO/SabreTools.IO.Compression => SabreTools.IO.Compression}/Deflate/BlockState.cs (100%) rename {SabreTools.IO/SabreTools.IO.Compression => SabreTools.IO.Compression}/Deflate/CRC32.cs (100%) rename {SabreTools.IO/SabreTools.IO.Compression => SabreTools.IO.Compression}/Deflate/CompressionLevel.cs (100%) rename {SabreTools.IO/SabreTools.IO.Compression => SabreTools.IO.Compression}/Deflate/CompressionMode.cs (100%) rename {SabreTools.IO/SabreTools.IO.Compression => SabreTools.IO.Compression}/Deflate/CompressionStrategy.cs (100%) rename {SabreTools.IO/SabreTools.IO.Compression => SabreTools.IO.Compression}/Deflate/DeflateFlavor.cs (100%) rename {SabreTools.IO/SabreTools.IO.Compression => SabreTools.IO.Compression}/Deflate/DeflateInfo.cs (100%) rename {SabreTools.IO/SabreTools.IO.Compression => SabreTools.IO.Compression}/Deflate/DeflateManager.cs (100%) rename {SabreTools.IO/SabreTools.IO.Compression => SabreTools.IO.Compression}/Deflate/DeflateStream.cs (100%) rename {SabreTools.IO/SabreTools.IO.Compression => SabreTools.IO.Compression}/Deflate/Enums.cs (100%) rename {SabreTools.IO/SabreTools.IO.Compression => SabreTools.IO.Compression}/Deflate/FlushType.cs (100%) rename {SabreTools.IO/SabreTools.IO.Compression => SabreTools.IO.Compression}/Deflate/GZipStream.cs (100%) rename {SabreTools.IO/SabreTools.IO.Compression => SabreTools.IO.Compression}/Deflate/InfTree.cs (100%) rename {SabreTools.IO/SabreTools.IO.Compression => SabreTools.IO.Compression}/Deflate/InflateBlocks.cs (100%) rename {SabreTools.IO/SabreTools.IO.Compression => SabreTools.IO.Compression}/Deflate/InflateCodes.cs (100%) rename {SabreTools.IO/SabreTools.IO.Compression => SabreTools.IO.Compression}/Deflate/InflateManager.cs (100%) rename {SabreTools.IO/SabreTools.IO.Compression => SabreTools.IO.Compression}/Deflate/InflateWrapper.cs (100%) rename {SabreTools.IO/SabreTools.IO.Compression => SabreTools.IO.Compression}/Deflate/InternalConstants.cs (100%) rename {SabreTools.IO/SabreTools.IO.Compression => SabreTools.IO.Compression}/Deflate/InternalInflateConstants.cs (100%) rename {SabreTools.IO/SabreTools.IO.Compression => SabreTools.IO.Compression}/Deflate/LICENSE.jzlib.txt (100%) rename {SabreTools.IO/SabreTools.IO.Compression => SabreTools.IO.Compression}/Deflate/License.zlib.txt (100%) rename {SabreTools.IO/SabreTools.IO.Compression => SabreTools.IO.Compression}/Deflate/SharedUtils.cs (100%) rename {SabreTools.IO/SabreTools.IO.Compression => SabreTools.IO.Compression}/Deflate/StaticTree.cs (100%) rename {SabreTools.IO/SabreTools.IO.Compression => SabreTools.IO.Compression}/Deflate/Tree.cs (100%) rename {SabreTools.IO/SabreTools.IO.Compression => SabreTools.IO.Compression}/Deflate/WorkItem.cs (100%) rename {SabreTools.IO/SabreTools.IO.Compression => SabreTools.IO.Compression}/Deflate/ZlibBaseStream.cs (100%) rename {SabreTools.IO/SabreTools.IO.Compression => SabreTools.IO.Compression}/Deflate/ZlibCodec.cs (100%) rename {SabreTools.IO/SabreTools.IO.Compression => SabreTools.IO.Compression}/Deflate/ZlibConstants.cs (100%) rename {SabreTools.IO/SabreTools.IO.Compression => SabreTools.IO.Compression}/Deflate/ZlibException.cs (100%) rename {SabreTools.IO/SabreTools.IO.Compression => SabreTools.IO.Compression}/Deflate/ZlibStream.cs (100%) rename {SabreTools.IO/SabreTools.IO.Compression => SabreTools.IO.Compression}/Deflate/ZlibStreamFlavor.cs (100%) create mode 100644 SabreTools.IO.Compression/ExtensionAttribute.cs rename {SabreTools.IO/SabreTools.IO.Compression => SabreTools.IO.Compression}/LZX/AlignedOffsetBlockData.cs (100%) rename {SabreTools.IO/SabreTools.IO.Compression => SabreTools.IO.Compression}/LZX/Block.cs (100%) rename {SabreTools.IO/SabreTools.IO.Compression => SabreTools.IO.Compression}/LZX/BlockData.cs (100%) rename {SabreTools.IO/SabreTools.IO.Compression => SabreTools.IO.Compression}/LZX/BlockHeader.cs (100%) rename {SabreTools.IO/SabreTools.IO.Compression => SabreTools.IO.Compression}/LZX/Chunk.cs (100%) rename {SabreTools.IO/SabreTools.IO.Compression => SabreTools.IO.Compression}/LZX/ChunkHeader.cs (100%) rename {SabreTools.IO/SabreTools.IO.Compression => SabreTools.IO.Compression}/LZX/Constants.cs (100%) rename {SabreTools.IO/SabreTools.IO.Compression => SabreTools.IO.Compression}/LZX/Enums.cs (100%) rename {SabreTools.IO/SabreTools.IO.Compression => SabreTools.IO.Compression}/LZX/UncompressedBlockData.cs (100%) rename {SabreTools.IO/SabreTools.IO.Compression => SabreTools.IO.Compression}/LZX/VerbatimBlockData.cs (100%) rename {SabreTools.IO/SabreTools.IO.Compression => SabreTools.IO.Compression}/MSZIP/BlockHeader.cs (100%) rename {SabreTools.IO/SabreTools.IO.Compression => SabreTools.IO.Compression}/MSZIP/Decompressor.cs (100%) rename {SabreTools.IO/SabreTools.IO.Compression => SabreTools.IO.Compression}/Quantum/Constants.cs (100%) rename {SabreTools.IO/SabreTools.IO.Compression => SabreTools.IO.Compression}/Quantum/Decompressor.cs (100%) rename {SabreTools.IO/SabreTools.IO.Compression => SabreTools.IO.Compression}/Quantum/Enums.cs (100%) rename {SabreTools.IO/SabreTools.IO.Compression => SabreTools.IO.Compression}/Quantum/Model.cs (100%) rename {SabreTools.IO/SabreTools.IO.Compression => SabreTools.IO.Compression}/Quantum/ModelSymbol.cs (100%) rename {SabreTools.IO/SabreTools.IO.Compression => SabreTools.IO.Compression}/README.MD (100%) rename {SabreTools.IO/SabreTools.IO.Compression => SabreTools.IO.Compression}/SZDD/Decompressor.cs (100%) rename {SabreTools.IO/SabreTools.IO.Compression => SabreTools.IO.Compression}/SZDD/Enums.cs (100%) create mode 100644 SabreTools.IO.Compression/SabreTools.IO.Compression.csproj rename {SabreTools.IO/SabreTools.IO.Compression => SabreTools.IO.Compression}/zlib/Hebron.Runtime/CRuntime.cs (100%) rename {SabreTools.IO/SabreTools.IO.Compression => SabreTools.IO.Compression}/zlib/Hebron.Runtime/MemoryStats.cs (100%) rename {SabreTools.IO/SabreTools.IO.Compression => SabreTools.IO.Compression}/zlib/Hebron.Runtime/UnsafeArray1D.cs (100%) rename {SabreTools.IO/SabreTools.IO.Compression => SabreTools.IO.Compression}/zlib/Hebron.Runtime/UnsafeArray2D.cs (100%) rename {SabreTools.IO/SabreTools.IO.Compression => SabreTools.IO.Compression}/zlib/LICENSE (100%) rename {SabreTools.IO/SabreTools.IO.Compression => SabreTools.IO.Compression}/zlib/README.md (100%) rename {SabreTools.IO/SabreTools.IO.Compression => SabreTools.IO.Compression}/zlib/ZlibDeflateStream.cs (100%) rename {SabreTools.IO/SabreTools.IO.Compression => SabreTools.IO.Compression}/zlib/ZlibInflateStream.cs (100%) rename {SabreTools.IO/SabreTools.IO.Compression => SabreTools.IO.Compression}/zlib/zlib.cs (100%) rename {SabreTools.IO/SabreTools.IO.Compression => SabreTools.IO.Compression}/zlib/zlibConst.cs (100%) rename {SabreTools.IO.Test/Extensions => SabreTools.IO.Extensions.Test}/BinaryReaderExtensionsTests.cs (100%) rename {SabreTools.IO.Test/Extensions => SabreTools.IO.Extensions.Test}/BinaryWriterExtensionsTests.cs (100%) rename {SabreTools.IO.Test/Extensions => SabreTools.IO.Extensions.Test}/ByteArrayExtensionsTests.cs (100%) rename {SabreTools.IO.Test/Extensions => SabreTools.IO.Extensions.Test}/ByteArrayReaderExtensionsTests.cs (100%) rename {SabreTools.IO.Test/Extensions => SabreTools.IO.Extensions.Test}/ByteArrayWriterExtensionsTests.cs (100%) rename {SabreTools.IO.Test/Extensions => SabreTools.IO.Extensions.Test}/DateTimeExtensionsTests.cs (100%) rename {SabreTools.IO.Test/Extensions => SabreTools.IO.Extensions.Test}/DictionaryExtensionsTests.cs (100%) rename {SabreTools.IO.Test/Extensions => SabreTools.IO.Extensions.Test}/EnumerableExtensionsTests.cs (100%) rename {SabreTools.IO.Test/Extensions => SabreTools.IO.Extensions.Test}/IOExtensionsTests.cs (100%) rename {SabreTools.IO.Test/Extensions => SabreTools.IO.Extensions.Test}/ParentablePathExtensionsTests.cs (100%) rename {SabreTools.IO.Test/Extensions => SabreTools.IO.Extensions.Test}/ReadOnlyBitStreamExtensionsTests.cs (100%) create mode 100644 SabreTools.IO.Extensions.Test/SabreTools.IO.Extensions.Test.csproj rename {SabreTools.IO.Test/Extensions => SabreTools.IO.Extensions.Test}/StreamExtensionsTests.cs (100%) rename {SabreTools.IO.Test/Extensions => SabreTools.IO.Extensions.Test}/StreamReaderExtensionsTests.cs (100%) rename {SabreTools.IO.Test/Extensions => SabreTools.IO.Extensions.Test}/StreamWriterExtensionsTests.cs (100%) rename {SabreTools.IO.Test/Extensions => SabreTools.IO.Extensions.Test}/StringExtensionsTests.cs (100%) create mode 100644 SabreTools.IO.Extensions.Test/TestData/Subdirectory/sample.txt create mode 100644 SabreTools.IO.Extensions.Test/TestData/ascii.txt create mode 100644 SabreTools.IO.Extensions.Test/TestData/file-to-compress.bin create mode 100644 SabreTools.IO.Extensions.Test/TestData/test-archive.bz2 create mode 100644 SabreTools.IO.Extensions.Test/TestData/test-archive.msz create mode 100644 SabreTools.IO.Extensions.Test/TestData/test-archive.pk create mode 100644 SabreTools.IO.Extensions.Test/TestData/test-archive.qtm create mode 100644 SabreTools.IO.Extensions.Test/TestData/utf16bebom.txt create mode 100644 SabreTools.IO.Extensions.Test/TestData/utf16lebom.txt create mode 100644 SabreTools.IO.Extensions.Test/TestData/utf32bom.txt create mode 100644 SabreTools.IO.Extensions.Test/TestData/utf7bom.txt create mode 100644 SabreTools.IO.Extensions.Test/TestData/utf8bom.txt rename {SabreTools.IO.Test/Extensions => SabreTools.IO.Extensions.Test}/TestEnum.cs (100%) rename {SabreTools.IO.Test/Extensions => SabreTools.IO.Extensions.Test}/TestStructArrays.cs (100%) rename {SabreTools.IO.Test/Extensions => SabreTools.IO.Extensions.Test}/TestStructExplicit.cs (100%) rename {SabreTools.IO.Test/Extensions => SabreTools.IO.Extensions.Test}/TestStructInheritance.cs (100%) rename {SabreTools.IO.Test/Extensions => SabreTools.IO.Extensions.Test}/TestStructSequential.cs (100%) rename {SabreTools.IO.Test/Extensions => SabreTools.IO.Extensions.Test}/TestStructStrings.cs (100%) rename {SabreTools.IO.Test/Extensions => SabreTools.IO.Extensions.Test}/XmlTextWriterExtensionsTests.cs (100%) rename {SabreTools.IO/SabreTools.IO.Extensions => SabreTools.IO.Extensions}/BinaryReaderExtensions.cs (100%) rename {SabreTools.IO/SabreTools.IO.Extensions => SabreTools.IO.Extensions}/BinaryWriterExtensions.cs (100%) rename {SabreTools.IO/SabreTools.IO.Extensions => SabreTools.IO.Extensions}/ByteArrayExtensions.cs (100%) rename {SabreTools.IO/SabreTools.IO.Extensions => SabreTools.IO.Extensions}/ByteArrayReaderExtensions.cs (100%) rename {SabreTools.IO/SabreTools.IO.Extensions => SabreTools.IO.Extensions}/ByteArrayWriterExtensions.cs (100%) rename {SabreTools.IO/SabreTools.IO.Extensions => SabreTools.IO.Extensions}/DateTimeExtensions.cs (100%) rename {SabreTools.IO/SabreTools.IO.Extensions => SabreTools.IO.Extensions}/DictionaryExtensions.cs (100%) rename {SabreTools.IO/SabreTools.IO.Extensions => SabreTools.IO.Extensions}/EnumerableExtensions.cs (100%) create mode 100644 SabreTools.IO.Extensions/ExtensionAttribute.cs rename {SabreTools.IO/SabreTools.IO.Extensions => SabreTools.IO.Extensions}/IOExtensions.cs (100%) rename {SabreTools.IO/SabreTools.IO.Extensions => SabreTools.IO.Extensions}/MarshalHelpers.cs (100%) rename {SabreTools.IO/SabreTools.IO.Extensions => SabreTools.IO.Extensions}/NumericExtensions.cs (100%) rename {SabreTools.IO/SabreTools.IO.Extensions => SabreTools.IO.Extensions}/ParentablePathExtensions.cs (100%) rename {SabreTools.IO/SabreTools.IO.Extensions => SabreTools.IO.Extensions}/README.MD (100%) rename {SabreTools.IO/SabreTools.IO.Extensions => SabreTools.IO.Extensions}/ReadOnlyBitStreamExtensions.cs (100%) create mode 100644 SabreTools.IO.Extensions/SabreTools.IO.Extensions.csproj rename {SabreTools.IO/SabreTools.IO.Extensions => SabreTools.IO.Extensions}/StreamExtensions.cs (100%) rename {SabreTools.IO/SabreTools.IO.Extensions => SabreTools.IO.Extensions}/StreamReaderExtensions.cs (100%) rename {SabreTools.IO/SabreTools.IO.Extensions => SabreTools.IO.Extensions}/StreamWriterExtensions.cs (100%) rename {SabreTools.IO/SabreTools.IO.Extensions => SabreTools.IO.Extensions}/StringExtensions.cs (100%) rename {SabreTools.IO/SabreTools.IO.Extensions => SabreTools.IO.Extensions}/XmlTextWriterExtensions.cs (100%) create mode 100644 SabreTools.IO.Meta/SabreTools.IO.Meta.csproj rename SabreTools.IO/{SabreTools.IO => }/BufferedStream.cs (100%) rename SabreTools.IO/{SabreTools.IO => }/Enums.cs (100%) rename SabreTools.IO/{SabreTools.IO => }/OldDotNet.cs (100%) rename SabreTools.IO/{SabreTools.IO => }/ParentablePath.cs (100%) rename SabreTools.IO/{SabreTools.IO => }/PathTool.cs (100%) rename SabreTools.IO/{SabreTools.IO => }/README.MD (100%) rename SabreTools.IO/{SabreTools.IO => }/ReadOnlyBitStream.cs (100%) rename SabreTools.IO/{SabreTools.IO => }/ReadOnlyCompositeStream.cs (100%) rename SabreTools.IO/{SabreTools.IO => }/Transform.cs (100%) rename SabreTools.IO/{SabreTools.IO => }/ViewStream.cs (100%) rename {SabreTools.IO/SabreTools.Logging => SabreTools.Logging}/Converters.cs (100%) rename {SabreTools.IO/SabreTools.Logging => SabreTools.Logging}/Enums.cs (100%) create mode 100644 SabreTools.Logging/ExtensionAttribute.cs rename {SabreTools.IO/SabreTools.Logging => SabreTools.Logging}/InternalStopwatch.cs (100%) rename {SabreTools.IO/SabreTools.Logging => SabreTools.Logging}/LogEventArgs.cs (100%) rename {SabreTools.IO/SabreTools.Logging => SabreTools.Logging}/Logger.cs (100%) rename {SabreTools.IO/SabreTools.Logging => SabreTools.Logging}/LoggerImpl.cs (100%) rename {SabreTools.IO/SabreTools.Logging => SabreTools.Logging}/README.MD (100%) create mode 100644 SabreTools.Logging/SabreTools.Logging.csproj rename {SabreTools.IO/SabreTools.Matching => SabreTools.Matching}/ContentMatch.cs (100%) rename {SabreTools.IO/SabreTools.Matching => SabreTools.Matching}/ContentMatchSet.cs (100%) rename {SabreTools.IO/SabreTools.Matching => SabreTools.Matching}/Delegates.cs (100%) rename {SabreTools.IO/SabreTools.Matching => SabreTools.Matching}/FilePathMatch.cs (100%) rename {SabreTools.IO/SabreTools.Matching => SabreTools.Matching}/IMatch.cs (100%) rename {SabreTools.IO/SabreTools.Matching => SabreTools.Matching}/IMatchSet.cs (100%) rename {SabreTools.IO/SabreTools.Matching => SabreTools.Matching}/MatchUtil.cs (100%) rename {SabreTools.IO/SabreTools.Matching => SabreTools.Matching}/PathMatch.cs (100%) rename {SabreTools.IO/SabreTools.Matching => SabreTools.Matching}/PathMatchSet.cs (100%) rename {SabreTools.IO/SabreTools.Matching => SabreTools.Matching}/README.MD (100%) create mode 100644 SabreTools.Matching/SabreTools.Matching.csproj rename {SabreTools.IO/SabreTools.Numerics => SabreTools.Numerics}/BothEndian.cs (100%) rename {SabreTools.IO/SabreTools.Numerics => SabreTools.Numerics}/BothInt16.cs (100%) rename {SabreTools.IO/SabreTools.Numerics => SabreTools.Numerics}/BothInt32.cs (100%) rename {SabreTools.IO/SabreTools.Numerics => SabreTools.Numerics}/BothInt64.cs (100%) rename {SabreTools.IO/SabreTools.Numerics => SabreTools.Numerics}/BothInt8.cs (100%) rename {SabreTools.IO/SabreTools.Numerics => SabreTools.Numerics}/BothUInt16.cs (100%) rename {SabreTools.IO/SabreTools.Numerics => SabreTools.Numerics}/BothUInt32.cs (100%) rename {SabreTools.IO/SabreTools.Numerics => SabreTools.Numerics}/BothUInt64.cs (100%) rename {SabreTools.IO/SabreTools.Numerics => SabreTools.Numerics}/BothUInt8.cs (100%) rename {SabreTools.IO/SabreTools.Numerics => SabreTools.Numerics}/Int24.cs (100%) rename {SabreTools.IO/SabreTools.Numerics => SabreTools.Numerics}/Int48.cs (100%) rename {SabreTools.IO/SabreTools.Numerics => SabreTools.Numerics}/README.MD (100%) create mode 100644 SabreTools.Numerics/SabreTools.Numerics.csproj rename {SabreTools.IO/SabreTools.Numerics => SabreTools.Numerics}/UInt24.cs (100%) rename {SabreTools.IO/SabreTools.Numerics => SabreTools.Numerics}/UInt48.cs (100%) rename {SabreTools.IO/SabreTools.Security.Cryptography => SabreTools.Security.Cryptography}/AESCTR.cs (100%) rename {SabreTools.IO/SabreTools.Security.Cryptography => SabreTools.Security.Cryptography}/MoPaQDecrypter.cs (100%) rename {SabreTools.IO/SabreTools.Security.Cryptography => SabreTools.Security.Cryptography}/README.MD (100%) create mode 100644 SabreTools.Security.Cryptography/SabreTools.Security.Cryptography.csproj rename {SabreTools.IO/SabreTools.Text.ClrMamePro => SabreTools.Text.ClrMamePro}/Enums.cs (100%) rename {SabreTools.IO/SabreTools.Text.ClrMamePro => SabreTools.Text.ClrMamePro}/README.MD (100%) rename {SabreTools.IO/SabreTools.Text.ClrMamePro => SabreTools.Text.ClrMamePro}/Reader.cs (100%) create mode 100644 SabreTools.Text.ClrMamePro/SabreTools.Text.ClrMamePro.csproj rename {SabreTools.IO/SabreTools.Text.ClrMamePro => SabreTools.Text.ClrMamePro}/Writer.cs (100%) rename {SabreTools.IO/SabreTools.Text.Compare => SabreTools.Text.Compare}/NaturalComparer.cs (100%) rename {SabreTools.IO/SabreTools.Text.Compare => SabreTools.Text.Compare}/NaturalComparerUtil.cs (100%) rename {SabreTools.IO/SabreTools.Text.Compare => SabreTools.Text.Compare}/NaturalReversedComparer.cs (100%) rename {SabreTools.IO/SabreTools.Text.Compare => SabreTools.Text.Compare}/README.MD (100%) create mode 100644 SabreTools.Text.Compare/SabreTools.Text.Compare.csproj rename {SabreTools.IO/SabreTools.Text.INI => SabreTools.Text.INI}/Enums.cs (100%) rename {SabreTools.IO/SabreTools.Text.INI => SabreTools.Text.INI}/IniFile.cs (100%) rename {SabreTools.IO/SabreTools.Text.INI => SabreTools.Text.INI}/README.MD (100%) rename {SabreTools.IO/SabreTools.Text.INI => SabreTools.Text.INI}/Reader.cs (100%) create mode 100644 SabreTools.Text.INI/SabreTools.Text.INI.csproj rename {SabreTools.IO/SabreTools.Text.INI => SabreTools.Text.INI}/Writer.cs (100%) rename {SabreTools.IO/SabreTools.Text.SeparatedValue => SabreTools.Text.SeparatedValue}/README.MD (100%) rename {SabreTools.IO/SabreTools.Text.SeparatedValue => SabreTools.Text.SeparatedValue}/Reader.cs (100%) create mode 100644 SabreTools.Text.SeparatedValue/SabreTools.Text.SeparatedValue.csproj rename {SabreTools.IO/SabreTools.Text.SeparatedValue => SabreTools.Text.SeparatedValue}/Writer.cs (100%) create mode 100644 SabreTools.Text.Utilities/ExtensionAttribute.cs rename {SabreTools.IO/SabreTools.Text.Utilities => SabreTools.Text.Utilities}/NumberHelper.cs (100%) rename {SabreTools.IO/SabreTools.Text.Utilities => SabreTools.Text.Utilities}/README.MD (100%) create mode 100644 SabreTools.Text.Utilities/SabreTools.Text.Utilities.csproj rename {SabreTools.IO/SabreTools.Text.Utilities => SabreTools.Text.Utilities}/TextHelper.cs (100%) diff --git a/SabreTools.IO.Test/Compression/BZip2Tests.cs b/SabreTools.IO.Compression.Test/BZip2Tests.cs similarity index 100% rename from SabreTools.IO.Test/Compression/BZip2Tests.cs rename to SabreTools.IO.Compression.Test/BZip2Tests.cs diff --git a/SabreTools.IO.Test/Compression/BlastTests.cs b/SabreTools.IO.Compression.Test/BlastTests.cs similarity index 100% rename from SabreTools.IO.Test/Compression/BlastTests.cs rename to SabreTools.IO.Compression.Test/BlastTests.cs diff --git a/SabreTools.IO.Test/Compression/MSZIPTests.cs b/SabreTools.IO.Compression.Test/MSZIPTests.cs similarity index 100% rename from SabreTools.IO.Test/Compression/MSZIPTests.cs rename to SabreTools.IO.Compression.Test/MSZIPTests.cs diff --git a/SabreTools.IO.Test/Compression/QuantumTests.cs b/SabreTools.IO.Compression.Test/QuantumTests.cs similarity index 100% rename from SabreTools.IO.Test/Compression/QuantumTests.cs rename to SabreTools.IO.Compression.Test/QuantumTests.cs diff --git a/SabreTools.IO.Compression.Test/SabreTools.IO.Compression.Test.csproj b/SabreTools.IO.Compression.Test/SabreTools.IO.Compression.Test.csproj new file mode 100644 index 0000000..5d7054b --- /dev/null +++ b/SabreTools.IO.Compression.Test/SabreTools.IO.Compression.Test.csproj @@ -0,0 +1,39 @@ + + + + net8.0;net9.0;net10.0 + false + latest + enable + true + CS0618 + + + + + + + + + Always + + + + + + runtime; build; native; contentfiles; analyzers; buildtransitive + all + + + + + runtime; build; native; contentfiles; analyzers; buildtransitive + all + + + + + + + + \ No newline at end of file diff --git a/SabreTools.IO.Compression.Test/TestData/Subdirectory/sample.txt b/SabreTools.IO.Compression.Test/TestData/Subdirectory/sample.txt new file mode 100644 index 0000000..04277a8 --- /dev/null +++ b/SabreTools.IO.Compression.Test/TestData/Subdirectory/sample.txt @@ -0,0 +1 @@ +Sample file for subdirectories \ No newline at end of file diff --git a/SabreTools.IO.Compression.Test/TestData/ascii.txt b/SabreTools.IO.Compression.Test/TestData/ascii.txt new file mode 100644 index 0000000..690eb15 --- /dev/null +++ b/SabreTools.IO.Compression.Test/TestData/ascii.txt @@ -0,0 +1 @@ +This doesn't match anything \ No newline at end of file diff --git a/SabreTools.IO.Compression.Test/TestData/file-to-compress.bin b/SabreTools.IO.Compression.Test/TestData/file-to-compress.bin new file mode 100644 index 0000000..7724139 --- /dev/null +++ b/SabreTools.IO.Compression.Test/TestData/file-to-compress.bin @@ -0,0 +1 @@ +This is just a file that has a known set of hashes to make sure that everything with hashing is still working as anticipated. \ No newline at end of file diff --git a/SabreTools.IO.Compression.Test/TestData/test-archive.bz2 b/SabreTools.IO.Compression.Test/TestData/test-archive.bz2 new file mode 100644 index 0000000000000000000000000000000000000000..6d498cc775b610757f743281f948f255cffffd8c GIT binary patch literal 122 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 literal 0 HcmV?d00001 diff --git a/SabreTools.IO.Compression.Test/TestData/test-archive.pk b/SabreTools.IO.Compression.Test/TestData/test-archive.pk new file mode 100644 index 0000000000000000000000000000000000000000..be10b2bbb251759ffdf6da49fadd1a3f137a54c1 GIT binary patch literal 8 PcmZQzX;M+`Z>R?V2c!aC literal 0 HcmV?d00001 diff --git a/SabreTools.IO.Compression.Test/TestData/test-archive.qtm b/SabreTools.IO.Compression.Test/TestData/test-archive.qtm new file mode 100644 index 0000000000000000000000000000000000000000..474d2116ae59291903b54af53edf59834d67d2a7 GIT binary patch literal 20350 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 + + + + net20;net35;net40;net452;net462;net472;net48;netcoreapp3.1;net5.0;net6.0;net7.0;net8.0;net9.0;net10.0;netstandard2.0;netstandard2.1 + true + true + latest + CS0618 + enable + true + snupkg + true + 1.9.1 + + + Matt Nadareski + Common IO utilities by other SabreTools projects + Copyright (c) Matt Nadareski 2019-2025 + https://github.com/SabreTools/ + README.md + https://github.com/SabreTools/SabreTools.IO + git + io reading writing ini csv ssv tsv + MIT + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/SabreTools.IO/SabreTools.IO.Compression/zlib/Hebron.Runtime/CRuntime.cs b/SabreTools.IO.Compression/zlib/Hebron.Runtime/CRuntime.cs similarity index 100% rename from SabreTools.IO/SabreTools.IO.Compression/zlib/Hebron.Runtime/CRuntime.cs rename to SabreTools.IO.Compression/zlib/Hebron.Runtime/CRuntime.cs diff --git a/SabreTools.IO/SabreTools.IO.Compression/zlib/Hebron.Runtime/MemoryStats.cs b/SabreTools.IO.Compression/zlib/Hebron.Runtime/MemoryStats.cs similarity index 100% rename from SabreTools.IO/SabreTools.IO.Compression/zlib/Hebron.Runtime/MemoryStats.cs rename to SabreTools.IO.Compression/zlib/Hebron.Runtime/MemoryStats.cs diff --git a/SabreTools.IO/SabreTools.IO.Compression/zlib/Hebron.Runtime/UnsafeArray1D.cs b/SabreTools.IO.Compression/zlib/Hebron.Runtime/UnsafeArray1D.cs similarity index 100% rename from SabreTools.IO/SabreTools.IO.Compression/zlib/Hebron.Runtime/UnsafeArray1D.cs rename to SabreTools.IO.Compression/zlib/Hebron.Runtime/UnsafeArray1D.cs diff --git a/SabreTools.IO/SabreTools.IO.Compression/zlib/Hebron.Runtime/UnsafeArray2D.cs b/SabreTools.IO.Compression/zlib/Hebron.Runtime/UnsafeArray2D.cs similarity index 100% rename from SabreTools.IO/SabreTools.IO.Compression/zlib/Hebron.Runtime/UnsafeArray2D.cs rename to SabreTools.IO.Compression/zlib/Hebron.Runtime/UnsafeArray2D.cs diff --git a/SabreTools.IO/SabreTools.IO.Compression/zlib/LICENSE b/SabreTools.IO.Compression/zlib/LICENSE similarity index 100% rename from SabreTools.IO/SabreTools.IO.Compression/zlib/LICENSE rename to SabreTools.IO.Compression/zlib/LICENSE diff --git a/SabreTools.IO/SabreTools.IO.Compression/zlib/README.md b/SabreTools.IO.Compression/zlib/README.md similarity index 100% rename from SabreTools.IO/SabreTools.IO.Compression/zlib/README.md rename to SabreTools.IO.Compression/zlib/README.md diff --git a/SabreTools.IO/SabreTools.IO.Compression/zlib/ZlibDeflateStream.cs b/SabreTools.IO.Compression/zlib/ZlibDeflateStream.cs similarity index 100% rename from SabreTools.IO/SabreTools.IO.Compression/zlib/ZlibDeflateStream.cs rename to SabreTools.IO.Compression/zlib/ZlibDeflateStream.cs diff --git a/SabreTools.IO/SabreTools.IO.Compression/zlib/ZlibInflateStream.cs b/SabreTools.IO.Compression/zlib/ZlibInflateStream.cs similarity index 100% rename from SabreTools.IO/SabreTools.IO.Compression/zlib/ZlibInflateStream.cs rename to SabreTools.IO.Compression/zlib/ZlibInflateStream.cs diff --git a/SabreTools.IO/SabreTools.IO.Compression/zlib/zlib.cs b/SabreTools.IO.Compression/zlib/zlib.cs similarity index 100% rename from SabreTools.IO/SabreTools.IO.Compression/zlib/zlib.cs rename to SabreTools.IO.Compression/zlib/zlib.cs diff --git a/SabreTools.IO/SabreTools.IO.Compression/zlib/zlibConst.cs b/SabreTools.IO.Compression/zlib/zlibConst.cs similarity index 100% rename from SabreTools.IO/SabreTools.IO.Compression/zlib/zlibConst.cs rename to SabreTools.IO.Compression/zlib/zlibConst.cs diff --git a/SabreTools.IO.Test/Extensions/BinaryReaderExtensionsTests.cs b/SabreTools.IO.Extensions.Test/BinaryReaderExtensionsTests.cs similarity index 100% rename from SabreTools.IO.Test/Extensions/BinaryReaderExtensionsTests.cs rename to SabreTools.IO.Extensions.Test/BinaryReaderExtensionsTests.cs diff --git a/SabreTools.IO.Test/Extensions/BinaryWriterExtensionsTests.cs b/SabreTools.IO.Extensions.Test/BinaryWriterExtensionsTests.cs similarity index 100% rename from SabreTools.IO.Test/Extensions/BinaryWriterExtensionsTests.cs rename to SabreTools.IO.Extensions.Test/BinaryWriterExtensionsTests.cs diff --git a/SabreTools.IO.Test/Extensions/ByteArrayExtensionsTests.cs b/SabreTools.IO.Extensions.Test/ByteArrayExtensionsTests.cs similarity index 100% rename from SabreTools.IO.Test/Extensions/ByteArrayExtensionsTests.cs rename to SabreTools.IO.Extensions.Test/ByteArrayExtensionsTests.cs diff --git a/SabreTools.IO.Test/Extensions/ByteArrayReaderExtensionsTests.cs b/SabreTools.IO.Extensions.Test/ByteArrayReaderExtensionsTests.cs similarity index 100% rename from SabreTools.IO.Test/Extensions/ByteArrayReaderExtensionsTests.cs rename to SabreTools.IO.Extensions.Test/ByteArrayReaderExtensionsTests.cs diff --git a/SabreTools.IO.Test/Extensions/ByteArrayWriterExtensionsTests.cs b/SabreTools.IO.Extensions.Test/ByteArrayWriterExtensionsTests.cs similarity index 100% rename from SabreTools.IO.Test/Extensions/ByteArrayWriterExtensionsTests.cs rename to SabreTools.IO.Extensions.Test/ByteArrayWriterExtensionsTests.cs diff --git a/SabreTools.IO.Test/Extensions/DateTimeExtensionsTests.cs b/SabreTools.IO.Extensions.Test/DateTimeExtensionsTests.cs similarity index 100% rename from SabreTools.IO.Test/Extensions/DateTimeExtensionsTests.cs rename to SabreTools.IO.Extensions.Test/DateTimeExtensionsTests.cs diff --git a/SabreTools.IO.Test/Extensions/DictionaryExtensionsTests.cs b/SabreTools.IO.Extensions.Test/DictionaryExtensionsTests.cs similarity index 100% rename from SabreTools.IO.Test/Extensions/DictionaryExtensionsTests.cs rename to SabreTools.IO.Extensions.Test/DictionaryExtensionsTests.cs diff --git a/SabreTools.IO.Test/Extensions/EnumerableExtensionsTests.cs b/SabreTools.IO.Extensions.Test/EnumerableExtensionsTests.cs similarity index 100% rename from SabreTools.IO.Test/Extensions/EnumerableExtensionsTests.cs rename to SabreTools.IO.Extensions.Test/EnumerableExtensionsTests.cs diff --git a/SabreTools.IO.Test/Extensions/IOExtensionsTests.cs b/SabreTools.IO.Extensions.Test/IOExtensionsTests.cs similarity index 100% rename from SabreTools.IO.Test/Extensions/IOExtensionsTests.cs rename to SabreTools.IO.Extensions.Test/IOExtensionsTests.cs diff --git a/SabreTools.IO.Test/Extensions/ParentablePathExtensionsTests.cs b/SabreTools.IO.Extensions.Test/ParentablePathExtensionsTests.cs similarity index 100% rename from SabreTools.IO.Test/Extensions/ParentablePathExtensionsTests.cs rename to SabreTools.IO.Extensions.Test/ParentablePathExtensionsTests.cs diff --git a/SabreTools.IO.Test/Extensions/ReadOnlyBitStreamExtensionsTests.cs b/SabreTools.IO.Extensions.Test/ReadOnlyBitStreamExtensionsTests.cs similarity index 100% rename from SabreTools.IO.Test/Extensions/ReadOnlyBitStreamExtensionsTests.cs rename to SabreTools.IO.Extensions.Test/ReadOnlyBitStreamExtensionsTests.cs diff --git a/SabreTools.IO.Extensions.Test/SabreTools.IO.Extensions.Test.csproj b/SabreTools.IO.Extensions.Test/SabreTools.IO.Extensions.Test.csproj new file mode 100644 index 0000000..30a948e --- /dev/null +++ b/SabreTools.IO.Extensions.Test/SabreTools.IO.Extensions.Test.csproj @@ -0,0 +1,39 @@ + + + + net8.0;net9.0;net10.0 + false + latest + enable + true + CS0618 + + + + + + + + + Always + + + + + + runtime; build; native; contentfiles; analyzers; buildtransitive + all + + + + + runtime; build; native; contentfiles; analyzers; buildtransitive + all + + + + + + + + \ No newline at end of file diff --git a/SabreTools.IO.Test/Extensions/StreamExtensionsTests.cs b/SabreTools.IO.Extensions.Test/StreamExtensionsTests.cs similarity index 100% rename from SabreTools.IO.Test/Extensions/StreamExtensionsTests.cs rename to SabreTools.IO.Extensions.Test/StreamExtensionsTests.cs diff --git a/SabreTools.IO.Test/Extensions/StreamReaderExtensionsTests.cs b/SabreTools.IO.Extensions.Test/StreamReaderExtensionsTests.cs similarity index 100% rename from SabreTools.IO.Test/Extensions/StreamReaderExtensionsTests.cs rename to SabreTools.IO.Extensions.Test/StreamReaderExtensionsTests.cs diff --git a/SabreTools.IO.Test/Extensions/StreamWriterExtensionsTests.cs b/SabreTools.IO.Extensions.Test/StreamWriterExtensionsTests.cs similarity index 100% rename from SabreTools.IO.Test/Extensions/StreamWriterExtensionsTests.cs rename to SabreTools.IO.Extensions.Test/StreamWriterExtensionsTests.cs diff --git a/SabreTools.IO.Test/Extensions/StringExtensionsTests.cs b/SabreTools.IO.Extensions.Test/StringExtensionsTests.cs similarity index 100% rename from SabreTools.IO.Test/Extensions/StringExtensionsTests.cs rename to SabreTools.IO.Extensions.Test/StringExtensionsTests.cs diff --git a/SabreTools.IO.Extensions.Test/TestData/Subdirectory/sample.txt b/SabreTools.IO.Extensions.Test/TestData/Subdirectory/sample.txt new file mode 100644 index 0000000..04277a8 --- /dev/null +++ b/SabreTools.IO.Extensions.Test/TestData/Subdirectory/sample.txt @@ -0,0 +1 @@ +Sample file for subdirectories \ No newline at end of file diff --git a/SabreTools.IO.Extensions.Test/TestData/ascii.txt b/SabreTools.IO.Extensions.Test/TestData/ascii.txt new file mode 100644 index 0000000..690eb15 --- /dev/null +++ b/SabreTools.IO.Extensions.Test/TestData/ascii.txt @@ -0,0 +1 @@ +This doesn't match anything \ No newline at end of file diff --git a/SabreTools.IO.Extensions.Test/TestData/file-to-compress.bin b/SabreTools.IO.Extensions.Test/TestData/file-to-compress.bin new file mode 100644 index 0000000..7724139 --- /dev/null +++ b/SabreTools.IO.Extensions.Test/TestData/file-to-compress.bin @@ -0,0 +1 @@ +This is just a file that has a known set of hashes to make sure that everything with hashing is still working as anticipated. \ No newline at end of file diff --git a/SabreTools.IO.Extensions.Test/TestData/test-archive.bz2 b/SabreTools.IO.Extensions.Test/TestData/test-archive.bz2 new file mode 100644 index 0000000000000000000000000000000000000000..6d498cc775b610757f743281f948f255cffffd8c GIT binary patch literal 122 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 literal 0 HcmV?d00001 diff --git a/SabreTools.IO.Extensions.Test/TestData/test-archive.pk b/SabreTools.IO.Extensions.Test/TestData/test-archive.pk new file mode 100644 index 0000000000000000000000000000000000000000..be10b2bbb251759ffdf6da49fadd1a3f137a54c1 GIT binary patch literal 8 PcmZQzX;M+`Z>R?V2c!aC literal 0 HcmV?d00001 diff --git a/SabreTools.IO.Extensions.Test/TestData/test-archive.qtm b/SabreTools.IO.Extensions.Test/TestData/test-archive.qtm new file mode 100644 index 0000000000000000000000000000000000000000..474d2116ae59291903b54af53edf59834d67d2a7 GIT binary patch literal 20350 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 + + + + net20;net35;net40;net452;net462;net472;net48;netcoreapp3.1;net5.0;net6.0;net7.0;net8.0;net9.0;net10.0;netstandard2.0;netstandard2.1 + true + true + latest + CS0618 + enable + true + snupkg + true + 1.9.1 + + + Matt Nadareski + Common IO utilities by other SabreTools projects + Copyright (c) Matt Nadareski 2019-2025 + https://github.com/SabreTools/ + README.md + https://github.com/SabreTools/SabreTools.IO + git + io reading writing ini csv ssv tsv + MIT + + + + + + + + + + + + + + \ No newline at end of file diff --git a/SabreTools.IO/SabreTools.IO.Extensions/StreamExtensions.cs b/SabreTools.IO.Extensions/StreamExtensions.cs similarity index 100% rename from SabreTools.IO/SabreTools.IO.Extensions/StreamExtensions.cs rename to SabreTools.IO.Extensions/StreamExtensions.cs diff --git a/SabreTools.IO/SabreTools.IO.Extensions/StreamReaderExtensions.cs b/SabreTools.IO.Extensions/StreamReaderExtensions.cs similarity index 100% rename from SabreTools.IO/SabreTools.IO.Extensions/StreamReaderExtensions.cs rename to SabreTools.IO.Extensions/StreamReaderExtensions.cs diff --git a/SabreTools.IO/SabreTools.IO.Extensions/StreamWriterExtensions.cs b/SabreTools.IO.Extensions/StreamWriterExtensions.cs similarity index 100% rename from SabreTools.IO/SabreTools.IO.Extensions/StreamWriterExtensions.cs rename to SabreTools.IO.Extensions/StreamWriterExtensions.cs diff --git a/SabreTools.IO/SabreTools.IO.Extensions/StringExtensions.cs b/SabreTools.IO.Extensions/StringExtensions.cs similarity index 100% rename from SabreTools.IO/SabreTools.IO.Extensions/StringExtensions.cs rename to SabreTools.IO.Extensions/StringExtensions.cs diff --git a/SabreTools.IO/SabreTools.IO.Extensions/XmlTextWriterExtensions.cs b/SabreTools.IO.Extensions/XmlTextWriterExtensions.cs similarity index 100% rename from SabreTools.IO/SabreTools.IO.Extensions/XmlTextWriterExtensions.cs rename to SabreTools.IO.Extensions/XmlTextWriterExtensions.cs diff --git a/SabreTools.IO.Meta/SabreTools.IO.Meta.csproj b/SabreTools.IO.Meta/SabreTools.IO.Meta.csproj new file mode 100644 index 0000000..6e5a130 --- /dev/null +++ b/SabreTools.IO.Meta/SabreTools.IO.Meta.csproj @@ -0,0 +1,62 @@ + + + + + net20;net35;net40;net452;net462;net472;net48;netcoreapp3.1;net5.0;net6.0;net7.0;net8.0;net9.0;net10.0;netstandard2.0;netstandard2.1 + true + true + latest + CS0618 + enable + true + snupkg + true + 1.9.1 + + + SabreTools.IO + Matt Nadareski + Common IO utilities by other SabreTools projects + Copyright (c) Matt Nadareski 2019-2025 + https://github.com/SabreTools/ + README.md + https://github.com/SabreTools/SabreTools.IO + git + io reading writing ini csv ssv tsv + MIT + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/SabreTools.IO.Test/SabreTools.IO.Test.csproj b/SabreTools.IO.Test/SabreTools.IO.Test.csproj index ed03935..5fedbca 100644 --- a/SabreTools.IO.Test/SabreTools.IO.Test.csproj +++ b/SabreTools.IO.Test/SabreTools.IO.Test.csproj @@ -34,6 +34,8 @@ + + \ No newline at end of file diff --git a/SabreTools.IO.sln b/SabreTools.IO.sln index 8705382..150e687 100644 --- a/SabreTools.IO.sln +++ b/SabreTools.IO.sln @@ -23,6 +23,34 @@ Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "SabreTools.Text.SeparatedVa EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "SabreTools.Text.Utilities.Test", "SabreTools.Text.Utilities.Test\SabreTools.Text.Utilities.Test.csproj", "{71B85140-6468-4747-AF42-C1C0F04A4D80}" EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "SabreTools.IO.Meta", "SabreTools.IO.Meta\SabreTools.IO.Meta.csproj", "{5BCF7EB4-33AC-4139-8466-41E06FF86072}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "SabreTools.IO.Compression", "SabreTools.IO.Compression\SabreTools.IO.Compression.csproj", "{00D197D9-6F57-44FA-A399-FFEA61603B28}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "SabreTools.IO.Extensions", "SabreTools.IO.Extensions\SabreTools.IO.Extensions.csproj", "{ABC3D682-4A02-46FB-8EC3-27D0119D3042}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "SabreTools.Logging", "SabreTools.Logging\SabreTools.Logging.csproj", "{9A192B06-8970-4763-AB78-4B1C9FA854E1}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "SabreTools.Matching", "SabreTools.Matching\SabreTools.Matching.csproj", "{97265DE9-5B64-459B-A768-2B8C6311FE11}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "SabreTools.Numerics", "SabreTools.Numerics\SabreTools.Numerics.csproj", "{D00B8345-6472-4EF9-8953-CFCA8734DA6F}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "SabreTools.Security.Cryptography", "SabreTools.Security.Cryptography\SabreTools.Security.Cryptography.csproj", "{5DC86AB2-C224-49F4-8AB3-C91DC8186FD7}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "SabreTools.Text.ClrMamePro", "SabreTools.Text.ClrMamePro\SabreTools.Text.ClrMamePro.csproj", "{F152E4A8-B9B2-4AAC-A27E-760D391F2D2D}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "SabreTools.Text.Compare", "SabreTools.Text.Compare\SabreTools.Text.Compare.csproj", "{168D97AB-4D17-4015-BCFC-6CC1FA24E747}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "SabreTools.Text.INI", "SabreTools.Text.INI\SabreTools.Text.INI.csproj", "{6FB12A7F-4285-4D64-B972-A3F07E416448}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "SabreTools.Text.SeparatedValue", "SabreTools.Text.SeparatedValue\SabreTools.Text.SeparatedValue.csproj", "{E1E0B039-2714-40EE-9BF2-0864D3D3535A}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "SabreTools.Text.Utilities", "SabreTools.Text.Utilities\SabreTools.Text.Utilities.csproj", "{E8842271-ECA1-41BD-B360-E3C73505BAEC}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "SabreTools.IO.Compression.Test", "SabreTools.IO.Compression.Test\SabreTools.IO.Compression.Test.csproj", "{F3036FE7-8B03-4B47-AE6D-93E99C09FF8F}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "SabreTools.IO.Extensions.Test", "SabreTools.IO.Extensions.Test\SabreTools.IO.Extensions.Test.csproj", "{C829B479-3D3B-48EE-BDD7-5EFB40340166}" +EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Any CPU = Debug|Any CPU @@ -153,6 +181,174 @@ Global {71B85140-6468-4747-AF42-C1C0F04A4D80}.Release|x64.Build.0 = Release|Any CPU {71B85140-6468-4747-AF42-C1C0F04A4D80}.Release|x86.ActiveCfg = Release|Any CPU {71B85140-6468-4747-AF42-C1C0F04A4D80}.Release|x86.Build.0 = Release|Any CPU + {5BCF7EB4-33AC-4139-8466-41E06FF86072}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {5BCF7EB4-33AC-4139-8466-41E06FF86072}.Debug|Any CPU.Build.0 = Debug|Any CPU + {5BCF7EB4-33AC-4139-8466-41E06FF86072}.Debug|x64.ActiveCfg = Debug|Any CPU + {5BCF7EB4-33AC-4139-8466-41E06FF86072}.Debug|x64.Build.0 = Debug|Any CPU + {5BCF7EB4-33AC-4139-8466-41E06FF86072}.Debug|x86.ActiveCfg = Debug|Any CPU + {5BCF7EB4-33AC-4139-8466-41E06FF86072}.Debug|x86.Build.0 = Debug|Any CPU + {5BCF7EB4-33AC-4139-8466-41E06FF86072}.Release|Any CPU.ActiveCfg = Release|Any CPU + {5BCF7EB4-33AC-4139-8466-41E06FF86072}.Release|Any CPU.Build.0 = Release|Any CPU + {5BCF7EB4-33AC-4139-8466-41E06FF86072}.Release|x64.ActiveCfg = Release|Any CPU + {5BCF7EB4-33AC-4139-8466-41E06FF86072}.Release|x64.Build.0 = Release|Any CPU + {5BCF7EB4-33AC-4139-8466-41E06FF86072}.Release|x86.ActiveCfg = Release|Any CPU + {5BCF7EB4-33AC-4139-8466-41E06FF86072}.Release|x86.Build.0 = Release|Any CPU + {00D197D9-6F57-44FA-A399-FFEA61603B28}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {00D197D9-6F57-44FA-A399-FFEA61603B28}.Debug|Any CPU.Build.0 = Debug|Any CPU + {00D197D9-6F57-44FA-A399-FFEA61603B28}.Debug|x64.ActiveCfg = Debug|Any CPU + {00D197D9-6F57-44FA-A399-FFEA61603B28}.Debug|x64.Build.0 = Debug|Any CPU + {00D197D9-6F57-44FA-A399-FFEA61603B28}.Debug|x86.ActiveCfg = Debug|Any CPU + {00D197D9-6F57-44FA-A399-FFEA61603B28}.Debug|x86.Build.0 = Debug|Any CPU + {00D197D9-6F57-44FA-A399-FFEA61603B28}.Release|Any CPU.ActiveCfg = Release|Any CPU + {00D197D9-6F57-44FA-A399-FFEA61603B28}.Release|Any CPU.Build.0 = Release|Any CPU + {00D197D9-6F57-44FA-A399-FFEA61603B28}.Release|x64.ActiveCfg = Release|Any CPU + {00D197D9-6F57-44FA-A399-FFEA61603B28}.Release|x64.Build.0 = Release|Any CPU + {00D197D9-6F57-44FA-A399-FFEA61603B28}.Release|x86.ActiveCfg = Release|Any CPU + {00D197D9-6F57-44FA-A399-FFEA61603B28}.Release|x86.Build.0 = Release|Any CPU + {ABC3D682-4A02-46FB-8EC3-27D0119D3042}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {ABC3D682-4A02-46FB-8EC3-27D0119D3042}.Debug|Any CPU.Build.0 = Debug|Any CPU + {ABC3D682-4A02-46FB-8EC3-27D0119D3042}.Debug|x64.ActiveCfg = Debug|Any CPU + {ABC3D682-4A02-46FB-8EC3-27D0119D3042}.Debug|x64.Build.0 = Debug|Any CPU + {ABC3D682-4A02-46FB-8EC3-27D0119D3042}.Debug|x86.ActiveCfg = Debug|Any CPU + {ABC3D682-4A02-46FB-8EC3-27D0119D3042}.Debug|x86.Build.0 = Debug|Any CPU + {ABC3D682-4A02-46FB-8EC3-27D0119D3042}.Release|Any CPU.ActiveCfg = Release|Any CPU + {ABC3D682-4A02-46FB-8EC3-27D0119D3042}.Release|Any CPU.Build.0 = Release|Any CPU + {ABC3D682-4A02-46FB-8EC3-27D0119D3042}.Release|x64.ActiveCfg = Release|Any CPU + {ABC3D682-4A02-46FB-8EC3-27D0119D3042}.Release|x64.Build.0 = Release|Any CPU + {ABC3D682-4A02-46FB-8EC3-27D0119D3042}.Release|x86.ActiveCfg = Release|Any CPU + {ABC3D682-4A02-46FB-8EC3-27D0119D3042}.Release|x86.Build.0 = Release|Any CPU + {9A192B06-8970-4763-AB78-4B1C9FA854E1}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {9A192B06-8970-4763-AB78-4B1C9FA854E1}.Debug|Any CPU.Build.0 = Debug|Any CPU + {9A192B06-8970-4763-AB78-4B1C9FA854E1}.Debug|x64.ActiveCfg = Debug|Any CPU + {9A192B06-8970-4763-AB78-4B1C9FA854E1}.Debug|x64.Build.0 = Debug|Any CPU + {9A192B06-8970-4763-AB78-4B1C9FA854E1}.Debug|x86.ActiveCfg = Debug|Any CPU + {9A192B06-8970-4763-AB78-4B1C9FA854E1}.Debug|x86.Build.0 = Debug|Any CPU + {9A192B06-8970-4763-AB78-4B1C9FA854E1}.Release|Any CPU.ActiveCfg = Release|Any CPU + {9A192B06-8970-4763-AB78-4B1C9FA854E1}.Release|Any CPU.Build.0 = Release|Any CPU + {9A192B06-8970-4763-AB78-4B1C9FA854E1}.Release|x64.ActiveCfg = Release|Any CPU + {9A192B06-8970-4763-AB78-4B1C9FA854E1}.Release|x64.Build.0 = Release|Any CPU + {9A192B06-8970-4763-AB78-4B1C9FA854E1}.Release|x86.ActiveCfg = Release|Any CPU + {9A192B06-8970-4763-AB78-4B1C9FA854E1}.Release|x86.Build.0 = Release|Any CPU + {97265DE9-5B64-459B-A768-2B8C6311FE11}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {97265DE9-5B64-459B-A768-2B8C6311FE11}.Debug|Any CPU.Build.0 = Debug|Any CPU + {97265DE9-5B64-459B-A768-2B8C6311FE11}.Debug|x64.ActiveCfg = Debug|Any CPU + {97265DE9-5B64-459B-A768-2B8C6311FE11}.Debug|x64.Build.0 = Debug|Any CPU + {97265DE9-5B64-459B-A768-2B8C6311FE11}.Debug|x86.ActiveCfg = Debug|Any CPU + {97265DE9-5B64-459B-A768-2B8C6311FE11}.Debug|x86.Build.0 = Debug|Any CPU + {97265DE9-5B64-459B-A768-2B8C6311FE11}.Release|Any CPU.ActiveCfg = Release|Any CPU + {97265DE9-5B64-459B-A768-2B8C6311FE11}.Release|Any CPU.Build.0 = Release|Any CPU + {97265DE9-5B64-459B-A768-2B8C6311FE11}.Release|x64.ActiveCfg = Release|Any CPU + {97265DE9-5B64-459B-A768-2B8C6311FE11}.Release|x64.Build.0 = Release|Any CPU + {97265DE9-5B64-459B-A768-2B8C6311FE11}.Release|x86.ActiveCfg = Release|Any CPU + {97265DE9-5B64-459B-A768-2B8C6311FE11}.Release|x86.Build.0 = Release|Any CPU + {D00B8345-6472-4EF9-8953-CFCA8734DA6F}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {D00B8345-6472-4EF9-8953-CFCA8734DA6F}.Debug|Any CPU.Build.0 = Debug|Any CPU + {D00B8345-6472-4EF9-8953-CFCA8734DA6F}.Debug|x64.ActiveCfg = Debug|Any CPU + {D00B8345-6472-4EF9-8953-CFCA8734DA6F}.Debug|x64.Build.0 = Debug|Any CPU + {D00B8345-6472-4EF9-8953-CFCA8734DA6F}.Debug|x86.ActiveCfg = Debug|Any CPU + {D00B8345-6472-4EF9-8953-CFCA8734DA6F}.Debug|x86.Build.0 = Debug|Any CPU + {D00B8345-6472-4EF9-8953-CFCA8734DA6F}.Release|Any CPU.ActiveCfg = Release|Any CPU + {D00B8345-6472-4EF9-8953-CFCA8734DA6F}.Release|Any CPU.Build.0 = Release|Any CPU + {D00B8345-6472-4EF9-8953-CFCA8734DA6F}.Release|x64.ActiveCfg = Release|Any CPU + {D00B8345-6472-4EF9-8953-CFCA8734DA6F}.Release|x64.Build.0 = Release|Any CPU + {D00B8345-6472-4EF9-8953-CFCA8734DA6F}.Release|x86.ActiveCfg = Release|Any CPU + {D00B8345-6472-4EF9-8953-CFCA8734DA6F}.Release|x86.Build.0 = Release|Any CPU + {5DC86AB2-C224-49F4-8AB3-C91DC8186FD7}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {5DC86AB2-C224-49F4-8AB3-C91DC8186FD7}.Debug|Any CPU.Build.0 = Debug|Any CPU + {5DC86AB2-C224-49F4-8AB3-C91DC8186FD7}.Debug|x64.ActiveCfg = Debug|Any CPU + {5DC86AB2-C224-49F4-8AB3-C91DC8186FD7}.Debug|x64.Build.0 = Debug|Any CPU + {5DC86AB2-C224-49F4-8AB3-C91DC8186FD7}.Debug|x86.ActiveCfg = Debug|Any CPU + {5DC86AB2-C224-49F4-8AB3-C91DC8186FD7}.Debug|x86.Build.0 = Debug|Any CPU + {5DC86AB2-C224-49F4-8AB3-C91DC8186FD7}.Release|Any CPU.ActiveCfg = Release|Any CPU + {5DC86AB2-C224-49F4-8AB3-C91DC8186FD7}.Release|Any CPU.Build.0 = Release|Any CPU + {5DC86AB2-C224-49F4-8AB3-C91DC8186FD7}.Release|x64.ActiveCfg = Release|Any CPU + {5DC86AB2-C224-49F4-8AB3-C91DC8186FD7}.Release|x64.Build.0 = Release|Any CPU + {5DC86AB2-C224-49F4-8AB3-C91DC8186FD7}.Release|x86.ActiveCfg = Release|Any CPU + {5DC86AB2-C224-49F4-8AB3-C91DC8186FD7}.Release|x86.Build.0 = Release|Any CPU + {F152E4A8-B9B2-4AAC-A27E-760D391F2D2D}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {F152E4A8-B9B2-4AAC-A27E-760D391F2D2D}.Debug|Any CPU.Build.0 = Debug|Any CPU + {F152E4A8-B9B2-4AAC-A27E-760D391F2D2D}.Debug|x64.ActiveCfg = Debug|Any CPU + {F152E4A8-B9B2-4AAC-A27E-760D391F2D2D}.Debug|x64.Build.0 = Debug|Any CPU + {F152E4A8-B9B2-4AAC-A27E-760D391F2D2D}.Debug|x86.ActiveCfg = Debug|Any CPU + {F152E4A8-B9B2-4AAC-A27E-760D391F2D2D}.Debug|x86.Build.0 = Debug|Any CPU + {F152E4A8-B9B2-4AAC-A27E-760D391F2D2D}.Release|Any CPU.ActiveCfg = Release|Any CPU + {F152E4A8-B9B2-4AAC-A27E-760D391F2D2D}.Release|Any CPU.Build.0 = Release|Any CPU + {F152E4A8-B9B2-4AAC-A27E-760D391F2D2D}.Release|x64.ActiveCfg = Release|Any CPU + {F152E4A8-B9B2-4AAC-A27E-760D391F2D2D}.Release|x64.Build.0 = Release|Any CPU + {F152E4A8-B9B2-4AAC-A27E-760D391F2D2D}.Release|x86.ActiveCfg = Release|Any CPU + {F152E4A8-B9B2-4AAC-A27E-760D391F2D2D}.Release|x86.Build.0 = Release|Any CPU + {168D97AB-4D17-4015-BCFC-6CC1FA24E747}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {168D97AB-4D17-4015-BCFC-6CC1FA24E747}.Debug|Any CPU.Build.0 = Debug|Any CPU + {168D97AB-4D17-4015-BCFC-6CC1FA24E747}.Debug|x64.ActiveCfg = Debug|Any CPU + {168D97AB-4D17-4015-BCFC-6CC1FA24E747}.Debug|x64.Build.0 = Debug|Any CPU + {168D97AB-4D17-4015-BCFC-6CC1FA24E747}.Debug|x86.ActiveCfg = Debug|Any CPU + {168D97AB-4D17-4015-BCFC-6CC1FA24E747}.Debug|x86.Build.0 = Debug|Any CPU + {168D97AB-4D17-4015-BCFC-6CC1FA24E747}.Release|Any CPU.ActiveCfg = Release|Any CPU + {168D97AB-4D17-4015-BCFC-6CC1FA24E747}.Release|Any CPU.Build.0 = Release|Any CPU + {168D97AB-4D17-4015-BCFC-6CC1FA24E747}.Release|x64.ActiveCfg = Release|Any CPU + {168D97AB-4D17-4015-BCFC-6CC1FA24E747}.Release|x64.Build.0 = Release|Any CPU + {168D97AB-4D17-4015-BCFC-6CC1FA24E747}.Release|x86.ActiveCfg = Release|Any CPU + {168D97AB-4D17-4015-BCFC-6CC1FA24E747}.Release|x86.Build.0 = Release|Any CPU + {6FB12A7F-4285-4D64-B972-A3F07E416448}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {6FB12A7F-4285-4D64-B972-A3F07E416448}.Debug|Any CPU.Build.0 = Debug|Any CPU + {6FB12A7F-4285-4D64-B972-A3F07E416448}.Debug|x64.ActiveCfg = Debug|Any CPU + {6FB12A7F-4285-4D64-B972-A3F07E416448}.Debug|x64.Build.0 = Debug|Any CPU + {6FB12A7F-4285-4D64-B972-A3F07E416448}.Debug|x86.ActiveCfg = Debug|Any CPU + {6FB12A7F-4285-4D64-B972-A3F07E416448}.Debug|x86.Build.0 = Debug|Any CPU + {6FB12A7F-4285-4D64-B972-A3F07E416448}.Release|Any CPU.ActiveCfg = Release|Any CPU + {6FB12A7F-4285-4D64-B972-A3F07E416448}.Release|Any CPU.Build.0 = Release|Any CPU + {6FB12A7F-4285-4D64-B972-A3F07E416448}.Release|x64.ActiveCfg = Release|Any CPU + {6FB12A7F-4285-4D64-B972-A3F07E416448}.Release|x64.Build.0 = Release|Any CPU + {6FB12A7F-4285-4D64-B972-A3F07E416448}.Release|x86.ActiveCfg = Release|Any CPU + {6FB12A7F-4285-4D64-B972-A3F07E416448}.Release|x86.Build.0 = Release|Any CPU + {E1E0B039-2714-40EE-9BF2-0864D3D3535A}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {E1E0B039-2714-40EE-9BF2-0864D3D3535A}.Debug|Any CPU.Build.0 = Debug|Any CPU + {E1E0B039-2714-40EE-9BF2-0864D3D3535A}.Debug|x64.ActiveCfg = Debug|Any CPU + {E1E0B039-2714-40EE-9BF2-0864D3D3535A}.Debug|x64.Build.0 = Debug|Any CPU + {E1E0B039-2714-40EE-9BF2-0864D3D3535A}.Debug|x86.ActiveCfg = Debug|Any CPU + {E1E0B039-2714-40EE-9BF2-0864D3D3535A}.Debug|x86.Build.0 = Debug|Any CPU + {E1E0B039-2714-40EE-9BF2-0864D3D3535A}.Release|Any CPU.ActiveCfg = Release|Any CPU + {E1E0B039-2714-40EE-9BF2-0864D3D3535A}.Release|Any CPU.Build.0 = Release|Any CPU + {E1E0B039-2714-40EE-9BF2-0864D3D3535A}.Release|x64.ActiveCfg = Release|Any CPU + {E1E0B039-2714-40EE-9BF2-0864D3D3535A}.Release|x64.Build.0 = Release|Any CPU + {E1E0B039-2714-40EE-9BF2-0864D3D3535A}.Release|x86.ActiveCfg = Release|Any CPU + {E1E0B039-2714-40EE-9BF2-0864D3D3535A}.Release|x86.Build.0 = Release|Any CPU + {E8842271-ECA1-41BD-B360-E3C73505BAEC}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {E8842271-ECA1-41BD-B360-E3C73505BAEC}.Debug|Any CPU.Build.0 = Debug|Any CPU + {E8842271-ECA1-41BD-B360-E3C73505BAEC}.Debug|x64.ActiveCfg = Debug|Any CPU + {E8842271-ECA1-41BD-B360-E3C73505BAEC}.Debug|x64.Build.0 = Debug|Any CPU + {E8842271-ECA1-41BD-B360-E3C73505BAEC}.Debug|x86.ActiveCfg = Debug|Any CPU + {E8842271-ECA1-41BD-B360-E3C73505BAEC}.Debug|x86.Build.0 = Debug|Any CPU + {E8842271-ECA1-41BD-B360-E3C73505BAEC}.Release|Any CPU.ActiveCfg = Release|Any CPU + {E8842271-ECA1-41BD-B360-E3C73505BAEC}.Release|Any CPU.Build.0 = Release|Any CPU + {E8842271-ECA1-41BD-B360-E3C73505BAEC}.Release|x64.ActiveCfg = Release|Any CPU + {E8842271-ECA1-41BD-B360-E3C73505BAEC}.Release|x64.Build.0 = Release|Any CPU + {E8842271-ECA1-41BD-B360-E3C73505BAEC}.Release|x86.ActiveCfg = Release|Any CPU + {E8842271-ECA1-41BD-B360-E3C73505BAEC}.Release|x86.Build.0 = Release|Any CPU + {F3036FE7-8B03-4B47-AE6D-93E99C09FF8F}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {F3036FE7-8B03-4B47-AE6D-93E99C09FF8F}.Debug|Any CPU.Build.0 = Debug|Any CPU + {F3036FE7-8B03-4B47-AE6D-93E99C09FF8F}.Debug|x64.ActiveCfg = Debug|Any CPU + {F3036FE7-8B03-4B47-AE6D-93E99C09FF8F}.Debug|x64.Build.0 = Debug|Any CPU + {F3036FE7-8B03-4B47-AE6D-93E99C09FF8F}.Debug|x86.ActiveCfg = Debug|Any CPU + {F3036FE7-8B03-4B47-AE6D-93E99C09FF8F}.Debug|x86.Build.0 = Debug|Any CPU + {F3036FE7-8B03-4B47-AE6D-93E99C09FF8F}.Release|Any CPU.ActiveCfg = Release|Any CPU + {F3036FE7-8B03-4B47-AE6D-93E99C09FF8F}.Release|Any CPU.Build.0 = Release|Any CPU + {F3036FE7-8B03-4B47-AE6D-93E99C09FF8F}.Release|x64.ActiveCfg = Release|Any CPU + {F3036FE7-8B03-4B47-AE6D-93E99C09FF8F}.Release|x64.Build.0 = Release|Any CPU + {F3036FE7-8B03-4B47-AE6D-93E99C09FF8F}.Release|x86.ActiveCfg = Release|Any CPU + {F3036FE7-8B03-4B47-AE6D-93E99C09FF8F}.Release|x86.Build.0 = Release|Any CPU + {C829B479-3D3B-48EE-BDD7-5EFB40340166}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {C829B479-3D3B-48EE-BDD7-5EFB40340166}.Debug|Any CPU.Build.0 = Debug|Any CPU + {C829B479-3D3B-48EE-BDD7-5EFB40340166}.Debug|x64.ActiveCfg = Debug|Any CPU + {C829B479-3D3B-48EE-BDD7-5EFB40340166}.Debug|x64.Build.0 = Debug|Any CPU + {C829B479-3D3B-48EE-BDD7-5EFB40340166}.Debug|x86.ActiveCfg = Debug|Any CPU + {C829B479-3D3B-48EE-BDD7-5EFB40340166}.Debug|x86.Build.0 = Debug|Any CPU + {C829B479-3D3B-48EE-BDD7-5EFB40340166}.Release|Any CPU.ActiveCfg = Release|Any CPU + {C829B479-3D3B-48EE-BDD7-5EFB40340166}.Release|Any CPU.Build.0 = Release|Any CPU + {C829B479-3D3B-48EE-BDD7-5EFB40340166}.Release|x64.ActiveCfg = Release|Any CPU + {C829B479-3D3B-48EE-BDD7-5EFB40340166}.Release|x64.Build.0 = Release|Any CPU + {C829B479-3D3B-48EE-BDD7-5EFB40340166}.Release|x86.ActiveCfg = Release|Any CPU + {C829B479-3D3B-48EE-BDD7-5EFB40340166}.Release|x86.Build.0 = Release|Any CPU EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE diff --git a/SabreTools.IO/SabreTools.IO/BufferedStream.cs b/SabreTools.IO/BufferedStream.cs similarity index 100% rename from SabreTools.IO/SabreTools.IO/BufferedStream.cs rename to SabreTools.IO/BufferedStream.cs diff --git a/SabreTools.IO/SabreTools.IO/Enums.cs b/SabreTools.IO/Enums.cs similarity index 100% rename from SabreTools.IO/SabreTools.IO/Enums.cs rename to SabreTools.IO/Enums.cs diff --git a/SabreTools.IO/SabreTools.IO/OldDotNet.cs b/SabreTools.IO/OldDotNet.cs similarity index 100% rename from SabreTools.IO/SabreTools.IO/OldDotNet.cs rename to SabreTools.IO/OldDotNet.cs diff --git a/SabreTools.IO/SabreTools.IO/ParentablePath.cs b/SabreTools.IO/ParentablePath.cs similarity index 100% rename from SabreTools.IO/SabreTools.IO/ParentablePath.cs rename to SabreTools.IO/ParentablePath.cs diff --git a/SabreTools.IO/SabreTools.IO/PathTool.cs b/SabreTools.IO/PathTool.cs similarity index 100% rename from SabreTools.IO/SabreTools.IO/PathTool.cs rename to SabreTools.IO/PathTool.cs diff --git a/SabreTools.IO/SabreTools.IO/README.MD b/SabreTools.IO/README.MD similarity index 100% rename from SabreTools.IO/SabreTools.IO/README.MD rename to SabreTools.IO/README.MD diff --git a/SabreTools.IO/SabreTools.IO/ReadOnlyBitStream.cs b/SabreTools.IO/ReadOnlyBitStream.cs similarity index 100% rename from SabreTools.IO/SabreTools.IO/ReadOnlyBitStream.cs rename to SabreTools.IO/ReadOnlyBitStream.cs diff --git a/SabreTools.IO/SabreTools.IO/ReadOnlyCompositeStream.cs b/SabreTools.IO/ReadOnlyCompositeStream.cs similarity index 100% rename from SabreTools.IO/SabreTools.IO/ReadOnlyCompositeStream.cs rename to SabreTools.IO/ReadOnlyCompositeStream.cs diff --git a/SabreTools.IO/SabreTools.IO.csproj b/SabreTools.IO/SabreTools.IO.csproj index a706fa9..2847735 100644 --- a/SabreTools.IO/SabreTools.IO.csproj +++ b/SabreTools.IO/SabreTools.IO.csproj @@ -14,6 +14,7 @@ 1.9.1 + SabreTools.IO.Common Matt Nadareski Common IO utilities by other SabreTools projects Copyright (c) Matt Nadareski 2019-2025 @@ -26,19 +27,11 @@ - + - - - - - - - - - + \ No newline at end of file diff --git a/SabreTools.IO/SabreTools.IO/Transform.cs b/SabreTools.IO/Transform.cs similarity index 100% rename from SabreTools.IO/SabreTools.IO/Transform.cs rename to SabreTools.IO/Transform.cs diff --git a/SabreTools.IO/SabreTools.IO/ViewStream.cs b/SabreTools.IO/ViewStream.cs similarity index 100% rename from SabreTools.IO/SabreTools.IO/ViewStream.cs rename to SabreTools.IO/ViewStream.cs diff --git a/SabreTools.Logging.Test/SabreTools.Logging.Test.csproj b/SabreTools.Logging.Test/SabreTools.Logging.Test.csproj index 45347d9..9174315 100644 --- a/SabreTools.Logging.Test/SabreTools.Logging.Test.csproj +++ b/SabreTools.Logging.Test/SabreTools.Logging.Test.csproj @@ -23,7 +23,7 @@ - + \ No newline at end of file diff --git a/SabreTools.IO/SabreTools.Logging/Converters.cs b/SabreTools.Logging/Converters.cs similarity index 100% rename from SabreTools.IO/SabreTools.Logging/Converters.cs rename to SabreTools.Logging/Converters.cs diff --git a/SabreTools.IO/SabreTools.Logging/Enums.cs b/SabreTools.Logging/Enums.cs similarity index 100% rename from SabreTools.IO/SabreTools.Logging/Enums.cs rename to SabreTools.Logging/Enums.cs diff --git a/SabreTools.Logging/ExtensionAttribute.cs b/SabreTools.Logging/ExtensionAttribute.cs new file mode 100644 index 0000000..478ed8b --- /dev/null +++ b/SabreTools.Logging/ExtensionAttribute.cs @@ -0,0 +1,9 @@ +#if NET20 + +namespace System.Runtime.CompilerServices +{ + [AttributeUsage(AttributeTargets.Assembly | AttributeTargets.Class | AttributeTargets.Method)] + internal sealed class ExtensionAttribute : Attribute { } +} + +#endif diff --git a/SabreTools.IO/SabreTools.Logging/InternalStopwatch.cs b/SabreTools.Logging/InternalStopwatch.cs similarity index 100% rename from SabreTools.IO/SabreTools.Logging/InternalStopwatch.cs rename to SabreTools.Logging/InternalStopwatch.cs diff --git a/SabreTools.IO/SabreTools.Logging/LogEventArgs.cs b/SabreTools.Logging/LogEventArgs.cs similarity index 100% rename from SabreTools.IO/SabreTools.Logging/LogEventArgs.cs rename to SabreTools.Logging/LogEventArgs.cs diff --git a/SabreTools.IO/SabreTools.Logging/Logger.cs b/SabreTools.Logging/Logger.cs similarity index 100% rename from SabreTools.IO/SabreTools.Logging/Logger.cs rename to SabreTools.Logging/Logger.cs diff --git a/SabreTools.IO/SabreTools.Logging/LoggerImpl.cs b/SabreTools.Logging/LoggerImpl.cs similarity index 100% rename from SabreTools.IO/SabreTools.Logging/LoggerImpl.cs rename to SabreTools.Logging/LoggerImpl.cs diff --git a/SabreTools.IO/SabreTools.Logging/README.MD b/SabreTools.Logging/README.MD similarity index 100% rename from SabreTools.IO/SabreTools.Logging/README.MD rename to SabreTools.Logging/README.MD diff --git a/SabreTools.Logging/SabreTools.Logging.csproj b/SabreTools.Logging/SabreTools.Logging.csproj new file mode 100644 index 0000000..9a23c12 --- /dev/null +++ b/SabreTools.Logging/SabreTools.Logging.csproj @@ -0,0 +1,32 @@ + + + + + net20;net35;net40;net452;net462;net472;net48;netcoreapp3.1;net5.0;net6.0;net7.0;net8.0;net9.0;net10.0;netstandard2.0;netstandard2.1 + true + true + latest + CS0618 + enable + true + snupkg + true + 1.9.1 + + + Matt Nadareski + Common IO utilities by other SabreTools projects + Copyright (c) Matt Nadareski 2019-2025 + https://github.com/SabreTools/ + README.md + https://github.com/SabreTools/SabreTools.IO + git + io reading writing ini csv ssv tsv + MIT + + + + + + + \ No newline at end of file diff --git a/SabreTools.Matching.Test/SabreTools.Matching.Test.csproj b/SabreTools.Matching.Test/SabreTools.Matching.Test.csproj index 45347d9..c4ba91b 100644 --- a/SabreTools.Matching.Test/SabreTools.Matching.Test.csproj +++ b/SabreTools.Matching.Test/SabreTools.Matching.Test.csproj @@ -23,7 +23,7 @@ - + \ No newline at end of file diff --git a/SabreTools.IO/SabreTools.Matching/ContentMatch.cs b/SabreTools.Matching/ContentMatch.cs similarity index 100% rename from SabreTools.IO/SabreTools.Matching/ContentMatch.cs rename to SabreTools.Matching/ContentMatch.cs diff --git a/SabreTools.IO/SabreTools.Matching/ContentMatchSet.cs b/SabreTools.Matching/ContentMatchSet.cs similarity index 100% rename from SabreTools.IO/SabreTools.Matching/ContentMatchSet.cs rename to SabreTools.Matching/ContentMatchSet.cs diff --git a/SabreTools.IO/SabreTools.Matching/Delegates.cs b/SabreTools.Matching/Delegates.cs similarity index 100% rename from SabreTools.IO/SabreTools.Matching/Delegates.cs rename to SabreTools.Matching/Delegates.cs diff --git a/SabreTools.IO/SabreTools.Matching/FilePathMatch.cs b/SabreTools.Matching/FilePathMatch.cs similarity index 100% rename from SabreTools.IO/SabreTools.Matching/FilePathMatch.cs rename to SabreTools.Matching/FilePathMatch.cs diff --git a/SabreTools.IO/SabreTools.Matching/IMatch.cs b/SabreTools.Matching/IMatch.cs similarity index 100% rename from SabreTools.IO/SabreTools.Matching/IMatch.cs rename to SabreTools.Matching/IMatch.cs diff --git a/SabreTools.IO/SabreTools.Matching/IMatchSet.cs b/SabreTools.Matching/IMatchSet.cs similarity index 100% rename from SabreTools.IO/SabreTools.Matching/IMatchSet.cs rename to SabreTools.Matching/IMatchSet.cs diff --git a/SabreTools.IO/SabreTools.Matching/MatchUtil.cs b/SabreTools.Matching/MatchUtil.cs similarity index 100% rename from SabreTools.IO/SabreTools.Matching/MatchUtil.cs rename to SabreTools.Matching/MatchUtil.cs diff --git a/SabreTools.IO/SabreTools.Matching/PathMatch.cs b/SabreTools.Matching/PathMatch.cs similarity index 100% rename from SabreTools.IO/SabreTools.Matching/PathMatch.cs rename to SabreTools.Matching/PathMatch.cs diff --git a/SabreTools.IO/SabreTools.Matching/PathMatchSet.cs b/SabreTools.Matching/PathMatchSet.cs similarity index 100% rename from SabreTools.IO/SabreTools.Matching/PathMatchSet.cs rename to SabreTools.Matching/PathMatchSet.cs diff --git a/SabreTools.IO/SabreTools.Matching/README.MD b/SabreTools.Matching/README.MD similarity index 100% rename from SabreTools.IO/SabreTools.Matching/README.MD rename to SabreTools.Matching/README.MD diff --git a/SabreTools.Matching/SabreTools.Matching.csproj b/SabreTools.Matching/SabreTools.Matching.csproj new file mode 100644 index 0000000..9a23c12 --- /dev/null +++ b/SabreTools.Matching/SabreTools.Matching.csproj @@ -0,0 +1,32 @@ + + + + + net20;net35;net40;net452;net462;net472;net48;netcoreapp3.1;net5.0;net6.0;net7.0;net8.0;net9.0;net10.0;netstandard2.0;netstandard2.1 + true + true + latest + CS0618 + enable + true + snupkg + true + 1.9.1 + + + Matt Nadareski + Common IO utilities by other SabreTools projects + Copyright (c) Matt Nadareski 2019-2025 + https://github.com/SabreTools/ + README.md + https://github.com/SabreTools/SabreTools.IO + git + io reading writing ini csv ssv tsv + MIT + + + + + + + \ No newline at end of file diff --git a/SabreTools.Numerics.Test/SabreTools.Numerics.Test.csproj b/SabreTools.Numerics.Test/SabreTools.Numerics.Test.csproj index 45347d9..6ff2bab 100644 --- a/SabreTools.Numerics.Test/SabreTools.Numerics.Test.csproj +++ b/SabreTools.Numerics.Test/SabreTools.Numerics.Test.csproj @@ -23,7 +23,7 @@ - + \ No newline at end of file diff --git a/SabreTools.IO/SabreTools.Numerics/BothEndian.cs b/SabreTools.Numerics/BothEndian.cs similarity index 100% rename from SabreTools.IO/SabreTools.Numerics/BothEndian.cs rename to SabreTools.Numerics/BothEndian.cs diff --git a/SabreTools.IO/SabreTools.Numerics/BothInt16.cs b/SabreTools.Numerics/BothInt16.cs similarity index 100% rename from SabreTools.IO/SabreTools.Numerics/BothInt16.cs rename to SabreTools.Numerics/BothInt16.cs diff --git a/SabreTools.IO/SabreTools.Numerics/BothInt32.cs b/SabreTools.Numerics/BothInt32.cs similarity index 100% rename from SabreTools.IO/SabreTools.Numerics/BothInt32.cs rename to SabreTools.Numerics/BothInt32.cs diff --git a/SabreTools.IO/SabreTools.Numerics/BothInt64.cs b/SabreTools.Numerics/BothInt64.cs similarity index 100% rename from SabreTools.IO/SabreTools.Numerics/BothInt64.cs rename to SabreTools.Numerics/BothInt64.cs diff --git a/SabreTools.IO/SabreTools.Numerics/BothInt8.cs b/SabreTools.Numerics/BothInt8.cs similarity index 100% rename from SabreTools.IO/SabreTools.Numerics/BothInt8.cs rename to SabreTools.Numerics/BothInt8.cs diff --git a/SabreTools.IO/SabreTools.Numerics/BothUInt16.cs b/SabreTools.Numerics/BothUInt16.cs similarity index 100% rename from SabreTools.IO/SabreTools.Numerics/BothUInt16.cs rename to SabreTools.Numerics/BothUInt16.cs diff --git a/SabreTools.IO/SabreTools.Numerics/BothUInt32.cs b/SabreTools.Numerics/BothUInt32.cs similarity index 100% rename from SabreTools.IO/SabreTools.Numerics/BothUInt32.cs rename to SabreTools.Numerics/BothUInt32.cs diff --git a/SabreTools.IO/SabreTools.Numerics/BothUInt64.cs b/SabreTools.Numerics/BothUInt64.cs similarity index 100% rename from SabreTools.IO/SabreTools.Numerics/BothUInt64.cs rename to SabreTools.Numerics/BothUInt64.cs diff --git a/SabreTools.IO/SabreTools.Numerics/BothUInt8.cs b/SabreTools.Numerics/BothUInt8.cs similarity index 100% rename from SabreTools.IO/SabreTools.Numerics/BothUInt8.cs rename to SabreTools.Numerics/BothUInt8.cs diff --git a/SabreTools.IO/SabreTools.Numerics/Int24.cs b/SabreTools.Numerics/Int24.cs similarity index 100% rename from SabreTools.IO/SabreTools.Numerics/Int24.cs rename to SabreTools.Numerics/Int24.cs diff --git a/SabreTools.IO/SabreTools.Numerics/Int48.cs b/SabreTools.Numerics/Int48.cs similarity index 100% rename from SabreTools.IO/SabreTools.Numerics/Int48.cs rename to SabreTools.Numerics/Int48.cs diff --git a/SabreTools.IO/SabreTools.Numerics/README.MD b/SabreTools.Numerics/README.MD similarity index 100% rename from SabreTools.IO/SabreTools.Numerics/README.MD rename to SabreTools.Numerics/README.MD diff --git a/SabreTools.Numerics/SabreTools.Numerics.csproj b/SabreTools.Numerics/SabreTools.Numerics.csproj new file mode 100644 index 0000000..9a23c12 --- /dev/null +++ b/SabreTools.Numerics/SabreTools.Numerics.csproj @@ -0,0 +1,32 @@ + + + + + net20;net35;net40;net452;net462;net472;net48;netcoreapp3.1;net5.0;net6.0;net7.0;net8.0;net9.0;net10.0;netstandard2.0;netstandard2.1 + true + true + latest + CS0618 + enable + true + snupkg + true + 1.9.1 + + + Matt Nadareski + Common IO utilities by other SabreTools projects + Copyright (c) Matt Nadareski 2019-2025 + https://github.com/SabreTools/ + README.md + https://github.com/SabreTools/SabreTools.IO + git + io reading writing ini csv ssv tsv + MIT + + + + + + + \ No newline at end of file diff --git a/SabreTools.IO/SabreTools.Numerics/UInt24.cs b/SabreTools.Numerics/UInt24.cs similarity index 100% rename from SabreTools.IO/SabreTools.Numerics/UInt24.cs rename to SabreTools.Numerics/UInt24.cs diff --git a/SabreTools.IO/SabreTools.Numerics/UInt48.cs b/SabreTools.Numerics/UInt48.cs similarity index 100% rename from SabreTools.IO/SabreTools.Numerics/UInt48.cs rename to SabreTools.Numerics/UInt48.cs diff --git a/SabreTools.IO/SabreTools.Security.Cryptography/AESCTR.cs b/SabreTools.Security.Cryptography/AESCTR.cs similarity index 100% rename from SabreTools.IO/SabreTools.Security.Cryptography/AESCTR.cs rename to SabreTools.Security.Cryptography/AESCTR.cs diff --git a/SabreTools.IO/SabreTools.Security.Cryptography/MoPaQDecrypter.cs b/SabreTools.Security.Cryptography/MoPaQDecrypter.cs similarity index 100% rename from SabreTools.IO/SabreTools.Security.Cryptography/MoPaQDecrypter.cs rename to SabreTools.Security.Cryptography/MoPaQDecrypter.cs diff --git a/SabreTools.IO/SabreTools.Security.Cryptography/README.MD b/SabreTools.Security.Cryptography/README.MD similarity index 100% rename from SabreTools.IO/SabreTools.Security.Cryptography/README.MD rename to SabreTools.Security.Cryptography/README.MD diff --git a/SabreTools.Security.Cryptography/SabreTools.Security.Cryptography.csproj b/SabreTools.Security.Cryptography/SabreTools.Security.Cryptography.csproj new file mode 100644 index 0000000..b4a10f4 --- /dev/null +++ b/SabreTools.Security.Cryptography/SabreTools.Security.Cryptography.csproj @@ -0,0 +1,42 @@ + + + + + net20;net35;net40;net452;net462;net472;net48;netcoreapp3.1;net5.0;net6.0;net7.0;net8.0;net9.0;net10.0;netstandard2.0;netstandard2.1 + true + true + latest + CS0618 + enable + true + snupkg + true + 1.9.1 + + + Matt Nadareski + Common IO utilities by other SabreTools projects + Copyright (c) Matt Nadareski 2019-2025 + https://github.com/SabreTools/ + README.md + https://github.com/SabreTools/SabreTools.IO + git + io reading writing ini csv ssv tsv + MIT + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/SabreTools.Text.ClrMamePro.Test/SabreTools.Text.ClrMamePro.Test.csproj b/SabreTools.Text.ClrMamePro.Test/SabreTools.Text.ClrMamePro.Test.csproj index 45347d9..e2edc37 100644 --- a/SabreTools.Text.ClrMamePro.Test/SabreTools.Text.ClrMamePro.Test.csproj +++ b/SabreTools.Text.ClrMamePro.Test/SabreTools.Text.ClrMamePro.Test.csproj @@ -23,7 +23,7 @@ - + \ No newline at end of file diff --git a/SabreTools.IO/SabreTools.Text.ClrMamePro/Enums.cs b/SabreTools.Text.ClrMamePro/Enums.cs similarity index 100% rename from SabreTools.IO/SabreTools.Text.ClrMamePro/Enums.cs rename to SabreTools.Text.ClrMamePro/Enums.cs diff --git a/SabreTools.IO/SabreTools.Text.ClrMamePro/README.MD b/SabreTools.Text.ClrMamePro/README.MD similarity index 100% rename from SabreTools.IO/SabreTools.Text.ClrMamePro/README.MD rename to SabreTools.Text.ClrMamePro/README.MD diff --git a/SabreTools.IO/SabreTools.Text.ClrMamePro/Reader.cs b/SabreTools.Text.ClrMamePro/Reader.cs similarity index 100% rename from SabreTools.IO/SabreTools.Text.ClrMamePro/Reader.cs rename to SabreTools.Text.ClrMamePro/Reader.cs diff --git a/SabreTools.Text.ClrMamePro/SabreTools.Text.ClrMamePro.csproj b/SabreTools.Text.ClrMamePro/SabreTools.Text.ClrMamePro.csproj new file mode 100644 index 0000000..9a23c12 --- /dev/null +++ b/SabreTools.Text.ClrMamePro/SabreTools.Text.ClrMamePro.csproj @@ -0,0 +1,32 @@ + + + + + net20;net35;net40;net452;net462;net472;net48;netcoreapp3.1;net5.0;net6.0;net7.0;net8.0;net9.0;net10.0;netstandard2.0;netstandard2.1 + true + true + latest + CS0618 + enable + true + snupkg + true + 1.9.1 + + + Matt Nadareski + Common IO utilities by other SabreTools projects + Copyright (c) Matt Nadareski 2019-2025 + https://github.com/SabreTools/ + README.md + https://github.com/SabreTools/SabreTools.IO + git + io reading writing ini csv ssv tsv + MIT + + + + + + + \ No newline at end of file diff --git a/SabreTools.IO/SabreTools.Text.ClrMamePro/Writer.cs b/SabreTools.Text.ClrMamePro/Writer.cs similarity index 100% rename from SabreTools.IO/SabreTools.Text.ClrMamePro/Writer.cs rename to SabreTools.Text.ClrMamePro/Writer.cs diff --git a/SabreTools.Text.Compare.Test/SabreTools.Text.Compare.Test.csproj b/SabreTools.Text.Compare.Test/SabreTools.Text.Compare.Test.csproj index 45347d9..625d2ab 100644 --- a/SabreTools.Text.Compare.Test/SabreTools.Text.Compare.Test.csproj +++ b/SabreTools.Text.Compare.Test/SabreTools.Text.Compare.Test.csproj @@ -23,7 +23,7 @@ - + \ No newline at end of file diff --git a/SabreTools.IO/SabreTools.Text.Compare/NaturalComparer.cs b/SabreTools.Text.Compare/NaturalComparer.cs similarity index 100% rename from SabreTools.IO/SabreTools.Text.Compare/NaturalComparer.cs rename to SabreTools.Text.Compare/NaturalComparer.cs diff --git a/SabreTools.IO/SabreTools.Text.Compare/NaturalComparerUtil.cs b/SabreTools.Text.Compare/NaturalComparerUtil.cs similarity index 100% rename from SabreTools.IO/SabreTools.Text.Compare/NaturalComparerUtil.cs rename to SabreTools.Text.Compare/NaturalComparerUtil.cs diff --git a/SabreTools.IO/SabreTools.Text.Compare/NaturalReversedComparer.cs b/SabreTools.Text.Compare/NaturalReversedComparer.cs similarity index 100% rename from SabreTools.IO/SabreTools.Text.Compare/NaturalReversedComparer.cs rename to SabreTools.Text.Compare/NaturalReversedComparer.cs diff --git a/SabreTools.IO/SabreTools.Text.Compare/README.MD b/SabreTools.Text.Compare/README.MD similarity index 100% rename from SabreTools.IO/SabreTools.Text.Compare/README.MD rename to SabreTools.Text.Compare/README.MD diff --git a/SabreTools.Text.Compare/SabreTools.Text.Compare.csproj b/SabreTools.Text.Compare/SabreTools.Text.Compare.csproj new file mode 100644 index 0000000..e889aa9 --- /dev/null +++ b/SabreTools.Text.Compare/SabreTools.Text.Compare.csproj @@ -0,0 +1,36 @@ + + + + + net20;net35;net40;net452;net462;net472;net48;netcoreapp3.1;net5.0;net6.0;net7.0;net8.0;net9.0;net10.0;netstandard2.0;netstandard2.1 + true + true + latest + CS0618 + enable + true + snupkg + true + 1.9.1 + + + Matt Nadareski + Common IO utilities by other SabreTools projects + Copyright (c) Matt Nadareski 2019-2025 + https://github.com/SabreTools/ + README.md + https://github.com/SabreTools/SabreTools.IO + git + io reading writing ini csv ssv tsv + MIT + + + + + + + + + + + \ No newline at end of file diff --git a/SabreTools.Text.INI.Test/SabreTools.Text.INI.Test.csproj b/SabreTools.Text.INI.Test/SabreTools.Text.INI.Test.csproj index 45347d9..c785c51 100644 --- a/SabreTools.Text.INI.Test/SabreTools.Text.INI.Test.csproj +++ b/SabreTools.Text.INI.Test/SabreTools.Text.INI.Test.csproj @@ -23,7 +23,7 @@ - + \ No newline at end of file diff --git a/SabreTools.IO/SabreTools.Text.INI/Enums.cs b/SabreTools.Text.INI/Enums.cs similarity index 100% rename from SabreTools.IO/SabreTools.Text.INI/Enums.cs rename to SabreTools.Text.INI/Enums.cs diff --git a/SabreTools.IO/SabreTools.Text.INI/IniFile.cs b/SabreTools.Text.INI/IniFile.cs similarity index 100% rename from SabreTools.IO/SabreTools.Text.INI/IniFile.cs rename to SabreTools.Text.INI/IniFile.cs diff --git a/SabreTools.IO/SabreTools.Text.INI/README.MD b/SabreTools.Text.INI/README.MD similarity index 100% rename from SabreTools.IO/SabreTools.Text.INI/README.MD rename to SabreTools.Text.INI/README.MD diff --git a/SabreTools.IO/SabreTools.Text.INI/Reader.cs b/SabreTools.Text.INI/Reader.cs similarity index 100% rename from SabreTools.IO/SabreTools.Text.INI/Reader.cs rename to SabreTools.Text.INI/Reader.cs diff --git a/SabreTools.Text.INI/SabreTools.Text.INI.csproj b/SabreTools.Text.INI/SabreTools.Text.INI.csproj new file mode 100644 index 0000000..9a23c12 --- /dev/null +++ b/SabreTools.Text.INI/SabreTools.Text.INI.csproj @@ -0,0 +1,32 @@ + + + + + net20;net35;net40;net452;net462;net472;net48;netcoreapp3.1;net5.0;net6.0;net7.0;net8.0;net9.0;net10.0;netstandard2.0;netstandard2.1 + true + true + latest + CS0618 + enable + true + snupkg + true + 1.9.1 + + + Matt Nadareski + Common IO utilities by other SabreTools projects + Copyright (c) Matt Nadareski 2019-2025 + https://github.com/SabreTools/ + README.md + https://github.com/SabreTools/SabreTools.IO + git + io reading writing ini csv ssv tsv + MIT + + + + + + + \ No newline at end of file diff --git a/SabreTools.IO/SabreTools.Text.INI/Writer.cs b/SabreTools.Text.INI/Writer.cs similarity index 100% rename from SabreTools.IO/SabreTools.Text.INI/Writer.cs rename to SabreTools.Text.INI/Writer.cs diff --git a/SabreTools.Text.SeparatedValue.Test/SabreTools.Text.SeparatedValue.Test.csproj b/SabreTools.Text.SeparatedValue.Test/SabreTools.Text.SeparatedValue.Test.csproj index 45347d9..0d9f3f6 100644 --- a/SabreTools.Text.SeparatedValue.Test/SabreTools.Text.SeparatedValue.Test.csproj +++ b/SabreTools.Text.SeparatedValue.Test/SabreTools.Text.SeparatedValue.Test.csproj @@ -23,7 +23,7 @@ - + \ No newline at end of file diff --git a/SabreTools.IO/SabreTools.Text.SeparatedValue/README.MD b/SabreTools.Text.SeparatedValue/README.MD similarity index 100% rename from SabreTools.IO/SabreTools.Text.SeparatedValue/README.MD rename to SabreTools.Text.SeparatedValue/README.MD diff --git a/SabreTools.IO/SabreTools.Text.SeparatedValue/Reader.cs b/SabreTools.Text.SeparatedValue/Reader.cs similarity index 100% rename from SabreTools.IO/SabreTools.Text.SeparatedValue/Reader.cs rename to SabreTools.Text.SeparatedValue/Reader.cs diff --git a/SabreTools.Text.SeparatedValue/SabreTools.Text.SeparatedValue.csproj b/SabreTools.Text.SeparatedValue/SabreTools.Text.SeparatedValue.csproj new file mode 100644 index 0000000..9a23c12 --- /dev/null +++ b/SabreTools.Text.SeparatedValue/SabreTools.Text.SeparatedValue.csproj @@ -0,0 +1,32 @@ + + + + + net20;net35;net40;net452;net462;net472;net48;netcoreapp3.1;net5.0;net6.0;net7.0;net8.0;net9.0;net10.0;netstandard2.0;netstandard2.1 + true + true + latest + CS0618 + enable + true + snupkg + true + 1.9.1 + + + Matt Nadareski + Common IO utilities by other SabreTools projects + Copyright (c) Matt Nadareski 2019-2025 + https://github.com/SabreTools/ + README.md + https://github.com/SabreTools/SabreTools.IO + git + io reading writing ini csv ssv tsv + MIT + + + + + + + \ No newline at end of file diff --git a/SabreTools.IO/SabreTools.Text.SeparatedValue/Writer.cs b/SabreTools.Text.SeparatedValue/Writer.cs similarity index 100% rename from SabreTools.IO/SabreTools.Text.SeparatedValue/Writer.cs rename to SabreTools.Text.SeparatedValue/Writer.cs diff --git a/SabreTools.Text.Utilities.Test/SabreTools.Text.Utilities.Test.csproj b/SabreTools.Text.Utilities.Test/SabreTools.Text.Utilities.Test.csproj index 45347d9..1212344 100644 --- a/SabreTools.Text.Utilities.Test/SabreTools.Text.Utilities.Test.csproj +++ b/SabreTools.Text.Utilities.Test/SabreTools.Text.Utilities.Test.csproj @@ -23,7 +23,7 @@ - + \ No newline at end of file diff --git a/SabreTools.Text.Utilities/ExtensionAttribute.cs b/SabreTools.Text.Utilities/ExtensionAttribute.cs new file mode 100644 index 0000000..478ed8b --- /dev/null +++ b/SabreTools.Text.Utilities/ExtensionAttribute.cs @@ -0,0 +1,9 @@ +#if NET20 + +namespace System.Runtime.CompilerServices +{ + [AttributeUsage(AttributeTargets.Assembly | AttributeTargets.Class | AttributeTargets.Method)] + internal sealed class ExtensionAttribute : Attribute { } +} + +#endif diff --git a/SabreTools.IO/SabreTools.Text.Utilities/NumberHelper.cs b/SabreTools.Text.Utilities/NumberHelper.cs similarity index 100% rename from SabreTools.IO/SabreTools.Text.Utilities/NumberHelper.cs rename to SabreTools.Text.Utilities/NumberHelper.cs diff --git a/SabreTools.IO/SabreTools.Text.Utilities/README.MD b/SabreTools.Text.Utilities/README.MD similarity index 100% rename from SabreTools.IO/SabreTools.Text.Utilities/README.MD rename to SabreTools.Text.Utilities/README.MD diff --git a/SabreTools.Text.Utilities/SabreTools.Text.Utilities.csproj b/SabreTools.Text.Utilities/SabreTools.Text.Utilities.csproj new file mode 100644 index 0000000..76297ed --- /dev/null +++ b/SabreTools.Text.Utilities/SabreTools.Text.Utilities.csproj @@ -0,0 +1,43 @@ + + + + + net20;net35;net40;net452;net462;net472;net48;netcoreapp3.1;net5.0;net6.0;net7.0;net8.0;net9.0;net10.0;netstandard2.0;netstandard2.1 + true + true + latest + CS0618 + enable + true + snupkg + true + 1.9.1 + + + Matt Nadareski + Common IO utilities by other SabreTools projects + Copyright (c) Matt Nadareski 2019-2025 + https://github.com/SabreTools/ + README.md + https://github.com/SabreTools/SabreTools.IO + git + io reading writing ini csv ssv tsv + MIT + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/SabreTools.IO/SabreTools.Text.Utilities/TextHelper.cs b/SabreTools.Text.Utilities/TextHelper.cs similarity index 100% rename from SabreTools.IO/SabreTools.Text.Utilities/TextHelper.cs rename to SabreTools.Text.Utilities/TextHelper.cs diff --git a/publish-nix.sh b/publish-nix.sh index 62bc5d1..ba02507 100755 --- a/publish-nix.sh +++ b/publish-nix.sh @@ -32,5 +32,5 @@ then dotnet restore # Create Nuget Package - dotnet pack SabreTools.IO/SabreTools.IO.csproj --output $BUILD_FOLDER + dotnet pack SabreTools.IO.Meta/SabreTools.IO.Meta.csproj --output $BUILD_FOLDER fi \ No newline at end of file diff --git a/publish-win.ps1 b/publish-win.ps1 index 8d338b3..638fadd 100644 --- a/publish-win.ps1 +++ b/publish-win.ps1 @@ -22,5 +22,5 @@ if (!$NO_BUILD.IsPresent) dotnet restore # Create Nuget Package - dotnet pack SabreTools.IO\SabreTools.IO.csproj --output $BUILD_FOLDER + dotnet pack SabreTools.IO.Meta\SabreTools.IO.Meta.csproj --output $BUILD_FOLDER }