Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
24 changes: 15 additions & 9 deletions CpkTools/Endian/EndianReader.cs
Original file line number Diff line number Diff line change
@@ -1,3 +1,4 @@
using System.Buffers;
using System.Buffers.Binary;
using CommunityToolkit.HighPerformance;

Expand Down Expand Up @@ -147,20 +148,25 @@ public int ReadStreamInto(Stream dest, int length) {
return 0;
}

var buffer = new byte[80 * 1024];
var buffer = ArrayPool<byte>.Shared.Rent(80 * 1024);
var remaining = length;
var totalRead = 0;

while (remaining > 0) {
var toRead = Math.Min(buffer.Length, remaining);
var read = BaseStream.Read(buffer, 0, toRead);
try {
while (remaining > 0) {
var toRead = Math.Min(buffer.Length, remaining);
var read = BaseStream.Read(buffer, 0, toRead);

if (read == 0) // EOF
break;
if (read == 0) // EOF
break;

dest.Write(buffer, 0, read);
totalRead += read;
remaining -= read;
dest.Write(buffer, 0, read);
totalRead += read;
remaining -= read;
}
}
finally {
ArrayPool<byte>.Shared.Return(buffer);
}

return totalRead;
Expand Down
18 changes: 3 additions & 15 deletions CpkTools/Model/Cpk.cs
Original file line number Diff line number Diff line change
@@ -1,4 +1,3 @@
using System.Buffers.Binary;
using System.Numerics;
using System.Text;
using CpkTools.Comparers;
Expand Down Expand Up @@ -61,14 +60,6 @@ public bool ReadCpk(string path) {
return false;
}

/*try {
for (var i = 0; i < _utf.Columns.Count; i++) {
_cpkData.Add(_utf.Columns[i].Name, _utf.Rows[0][i].GetValue()!);
}
} catch (Exception ex) {
Console.WriteLine(ex);
}*/

ContentOffset = TryGetColumnData<ulong>(_utf, 0, "ContentOffset", out var content) ? content.Value : ulong.MaxValue;

var newEntry = CreateFileEntry("CONTENT_OFFSET", ContentOffset, content.Position, "CPK", "CONTENT", false);
Expand Down Expand Up @@ -273,7 +264,7 @@ public void WriteGtoc(EndianWriter writer) {
}

private static void WritePacket(EndianWriter writer, string id, ulong position, Memory<byte> packet) {
if (position == 0xffffffffffffffff)
if (position == ulong.MaxValue)
return;

writer.Seek((long)position, SeekOrigin.Begin);
Expand Down Expand Up @@ -576,17 +567,14 @@ private static bool TryGetColumnData<T>(Utf utf, int rowIndex, string columnName

private static ColumnData<T> GetColumnData<T>(Utf utf, int rowIndex, string columnName) {
try {
var columnIndex = utf.Columns!.FindIndex(c => c.Name == columnName);

if (columnIndex == -1) {
if (!utf.ColumnIndex!.TryGetValue(columnName, out var columnIndex))
return new ColumnData<T>(default!, -1, null);
}

var row = utf.Rows![rowIndex][columnIndex];

var cell = row.GetValue();
var position = row.Position;
var type = row.GetType();
var type = row.GetValueType();

if (cell is T value)
return new ColumnData<T>(value, position, type);
Expand Down
2 changes: 1 addition & 1 deletion CpkTools/Model/Row.cs
Original file line number Diff line number Diff line change
Expand Up @@ -25,7 +25,7 @@ public record struct Row() {
};
}

public new Type? GetType() {
public Type? GetValueType() {
return Type switch {
0 or 1 => UInt8.GetType(),
2 or 3 => UInt16.GetType(),
Expand Down
17 changes: 11 additions & 6 deletions CpkTools/Model/Utf.cs
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,8 @@
namespace CpkTools.Model;

public class Utf {
public List<Column>? Columns { get; private set; }
public Dictionary<string, int>? ColumnIndex { get; private set; }
public Column[]? Columns { get; private set; }
public Row[][]? Rows { get; private set; }

private int _tableSize;
Expand All @@ -16,19 +17,19 @@ public class Utf {
private int _numRows;

public bool ReadUtf(Memory<byte> data) {
var reader = new EndianReader(data);
using var reader = new EndianReader(data);

return ReadUtf(reader);
}

public bool ReadUtf(byte[] data) {
var reader = new EndianReader(data);
using var reader = new EndianReader(data);

return ReadUtf(reader);
}

public bool ReadUtf(Stream stream) {
var reader = new EndianReader(stream);
using var reader = new EndianReader(stream);

return ReadUtf(reader);
}
Expand All @@ -54,9 +55,11 @@ private bool ReadUtf(EndianReader reader, bool leaveOpen = false) {
_rowLength = reader.ReadInt16();
_numRows = reader.ReadInt32();

Columns = new List<Column>(_numColumns);
Columns = new Column[_numColumns];
Rows = new Row[_numRows][];

ColumnIndex = new Dictionary<string, int>(_numColumns, StringComparer.Ordinal);

// Read Columns
for (var i = 0; i < _numColumns; i ++) {
var column = new Column {
Expand All @@ -69,7 +72,9 @@ private bool ReadUtf(EndianReader reader, bool leaveOpen = false) {
}

column.Name = Tools.ReadCString(reader, -1, reader.ReadInt32() + _stringsOffset);
Columns.Add(column);
Columns[i] = column;

ColumnIndex[column.Name] = i;
}

const int storageMask = (int)StorageFlags.StorageMask;
Expand Down
10 changes: 4 additions & 6 deletions CpkTools/Tools.cs
Original file line number Diff line number Diff line change
Expand Up @@ -4,12 +4,15 @@
namespace CpkTools;

public static class Tools {
private static readonly Encoding SjisEncoding;

static Tools() {
Encoding.RegisterProvider(CodePagesEncodingProvider.Instance);
SjisEncoding = Encoding.GetEncoding(932);
}

public static string ReadCString(EndianReader reader, int maxLength = -1, long lOffset = -1, Encoding? enc = null) {
enc ??= Encoding.GetEncoding(932);
enc ??= SjisEncoding;

var max = maxLength == -1 ? 255 : maxLength;
var fTemp = reader.Position;
Expand Down Expand Up @@ -41,11 +44,6 @@ public static string ReadCString(EndianReader reader, int maxLength = -1, long l
return enc.GetString(bytes);
}

public static void DeleteFileIfExists(string sPath) {
if (File.Exists(sPath))
File.Delete(sPath);
}

public static string GetPath(string input) {
return Path.GetDirectoryName(input) + Path.DirectorySeparatorChar + Path.GetFileNameWithoutExtension(input);
}
Expand Down