diff --git a/InfoPrint/InfoPrint.csproj b/InfoPrint/InfoPrint.csproj index 2efabcc5..34ee2962 100644 --- a/InfoPrint/InfoPrint.csproj +++ b/InfoPrint/InfoPrint.csproj @@ -1,4 +1,4 @@ - + net20;net35;net40;net452;net462;net472;net48;netcoreapp3.1;net5.0;net6.0;net7.0;net8.0;net9.0 @@ -31,7 +31,7 @@ - + \ No newline at end of file diff --git a/SabreTools.Serialization/Deserializers/CueSheet.cs b/SabreTools.Serialization/Deserializers/CueSheet.cs index 9643b07f..8ad0b4dc 100644 --- a/SabreTools.Serialization/Deserializers/CueSheet.cs +++ b/SabreTools.Serialization/Deserializers/CueSheet.cs @@ -1,6 +1,7 @@ using System; using System.Collections.Generic; using System.IO; +using System.Text; using System.Text.RegularExpressions; using SabreTools.IO.Extensions; using SabreTools.Models.CueSheets; @@ -31,7 +32,7 @@ namespace SabreTools.Serialization.Deserializers string? lastLine = null; while (true) { - string? line = lastLine ?? data.ReadQuotedString(); + string? line = lastLine ?? ReadUntilNewline(data); lastLine = null; // If we have a null line, break from the loop @@ -141,7 +142,7 @@ namespace SabreTools.Serialization.Deserializers while (true) { - string? line = lastLine ?? data.ReadQuotedString(); + string? line = lastLine ?? ReadUntilNewline(data); lastLine = null; // If we have a null line, break from the loop @@ -228,7 +229,7 @@ namespace SabreTools.Serialization.Deserializers while (true) { - string? line = lastLine ?? data.ReadQuotedString(); + string? line = lastLine ?? ReadUntilNewline(data); lastLine = null; // If we have a null line, break from the loop @@ -592,6 +593,52 @@ namespace SabreTools.Serialization.Deserializers return flag; } + /// + /// Read a string until a newline value is found + /// + /// Stream to pull from + /// The next line from the data on success, null on error + private static string? ReadUntilNewline(Stream data) + { + // Validate the input + if (data.Length == 0 || data.Position < 0 || data.Position >= data.Length) + return null; + + // Read characters either until a newline or end of file + var lineBuilder = new StringBuilder(); + while (data.Position < data.Length) + { + char c = data.ReadChar(); + + // Handle Windows and old Mac line endings + if (c == '\r') + { + // Handle premature end of stream + if (data.Position >= data.Length) + break; + + // Handle Windows line endings + c = data.ReadChar(); + if (c == '\n') + break; + + // Seek backward if we had old Mac line endings instead + data.Seek(-1, SeekOrigin.Current); + break; + } + + // Handle standard line endings + if (c == '\n') + break; + + // Handle all other characters + lineBuilder.Append(c); + } + + // Return the line without trailing newline + return lineBuilder.ToString(); + } + #endregion } } diff --git a/SabreTools.Serialization/SabreTools.Serialization.csproj b/SabreTools.Serialization/SabreTools.Serialization.csproj index 059d79d5..82212936 100644 --- a/SabreTools.Serialization/SabreTools.Serialization.csproj +++ b/SabreTools.Serialization/SabreTools.Serialization.csproj @@ -30,9 +30,9 @@ - + - + diff --git a/SabreTools.Serialization/Serializers/AttractMode.cs b/SabreTools.Serialization/Serializers/AttractMode.cs index 7f42cb18..955e4030 100644 --- a/SabreTools.Serialization/Serializers/AttractMode.cs +++ b/SabreTools.Serialization/Serializers/AttractMode.cs @@ -150,7 +150,6 @@ namespace SabreTools.Serialization.Serializers // Write the header writer.WriteValues(longHeader ? HeaderArrayWithRomname : HeaderArrayWithoutRomname); - writer.WriteLine(); // Write out the rows, if they exist WriteRows(obj.Row, writer, longHeader);