mirror of
https://github.com/Thealexbarney/LibHac.git
synced 2024-11-14 10:49:41 +01:00
Merge pull request #124 from Thealexbarney/path-fixes
Fix some path parsing
This commit is contained in:
commit
3cd53a7de3
7 changed files with 19 additions and 50 deletions
|
@ -124,13 +124,11 @@ namespace LibHacBuild.CodeGen
|
|||
{
|
||||
foreach (ModuleInfo module in modules)
|
||||
{
|
||||
var set = new HashSet<long>();
|
||||
var set = new HashSet<int>();
|
||||
|
||||
foreach (ResultInfo result in module.Results)
|
||||
{
|
||||
long description = (long)result.DescriptionStart << 32 | (uint)result.DescriptionEnd;
|
||||
|
||||
if (!set.Add(description))
|
||||
if (!set.Add(result.DescriptionStart))
|
||||
{
|
||||
throw new InvalidDataException($"Duplicate result {result.Module}-{result.DescriptionStart}-{result.DescriptionEnd}.");
|
||||
}
|
||||
|
|
|
@ -124,11 +124,12 @@ Module,DescriptionStart,DescriptionEnd,Name,Summary
|
|||
2,4748,,AesXtsFileHeaderInvalidKeysInSetSize,
|
||||
|
||||
2,4761,4769,SaveDataTransferDataCorrupted,
|
||||
|
||||
2,4771,4779,SignedSystemPartitionDataCorrupted,
|
||||
2,4781,,GameCardLogoDataCorrupted,
|
||||
|
||||
2,4791,4799,MultiCommitContextCorrupted,
|
||||
2,4791,,InvalidMultiCommitContextVersion,The version of the multi-commit context file is to high for the current MultiCommitManager implementation.
|
||||
2,4790,4799,MultiCommitContextCorrupted,
|
||||
2,4791,,InvalidMultiCommitContextVersion,The version of the multi-commit context file is too high for the current MultiCommitManager implementation.
|
||||
2,4792,,InvalidMultiCommitContextState,The multi-commit has not been provisionally committed.
|
||||
|
||||
# The range name is a guess. 4812 is currently the only result in it
|
||||
|
|
|
|
@ -256,9 +256,9 @@ namespace LibHac.Fs
|
|||
/// <summary>Error code: 2002-4781; Inner value: 0x255a02</summary>
|
||||
public static Result.Base GameCardLogoDataCorrupted => new Result.Base(ModuleFs, 4781);
|
||||
|
||||
/// <summary>Error code: 2002-4791; Range: 4791-4799; Inner value: 0x256e02</summary>
|
||||
public static Result.Base MultiCommitContextCorrupted { [MethodImpl(MethodImplOptions.AggressiveInlining)] get => new Result.Base(ModuleFs, 4791, 4799); }
|
||||
/// <summary>The version of the multi-commit context file is to high for the current MultiCommitManager implementation.<br/>Error code: 2002-4791; Inner value: 0x256e02</summary>
|
||||
/// <summary>Error code: 2002-4790; Range: 4790-4799; Inner value: 0x256c02</summary>
|
||||
public static Result.Base MultiCommitContextCorrupted { [MethodImpl(MethodImplOptions.AggressiveInlining)] get => new Result.Base(ModuleFs, 4790, 4799); }
|
||||
/// <summary>The version of the multi-commit context file is too high for the current MultiCommitManager implementation.<br/>Error code: 2002-4791; Inner value: 0x256e02</summary>
|
||||
public static Result.Base InvalidMultiCommitContextVersion => new Result.Base(ModuleFs, 4791);
|
||||
/// <summary>The multi-commit has not been provisionally committed.<br/>Error code: 2002-4792; Inner value: 0x257002</summary>
|
||||
public static Result.Base InvalidMultiCommitContextState => new Result.Base(ModuleFs, 4792);
|
||||
|
|
|
@ -27,7 +27,7 @@ namespace LibHac.FsSystem
|
|||
_path = path;
|
||||
_offset = 0;
|
||||
_length = 0;
|
||||
_finished = path.Length == 1;
|
||||
_finished = path.Length == 1 || path[1] == '\0';
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
|
@ -57,12 +57,12 @@ namespace LibHac.FsSystem
|
|||
_offset = _offset + _length + 1;
|
||||
int end = _offset;
|
||||
|
||||
while (end < _path.Length && _path[end] != '/')
|
||||
while (end < _path.Length && _path[end] != '\0' && _path[end] != '/')
|
||||
{
|
||||
end++;
|
||||
}
|
||||
|
||||
_finished = end + 1 >= _path.Length;
|
||||
_finished = end + 1 >= _path.Length || _path[end + 1] == '\0';
|
||||
_length = end - _offset;
|
||||
|
||||
return true;
|
||||
|
|
|
@ -3,6 +3,7 @@ using System.Collections.Generic;
|
|||
using System.Diagnostics;
|
||||
using System.Runtime.CompilerServices;
|
||||
using System.Runtime.InteropServices;
|
||||
using LibHac.Common;
|
||||
using LibHac.Fs;
|
||||
|
||||
namespace LibHac.FsSystem.Save
|
||||
|
@ -44,7 +45,7 @@ namespace LibHac.FsSystem.Save
|
|||
|
||||
ReadEntry(index, out entry);
|
||||
|
||||
if (entry.Parent == key.Parent && Util.StringSpansEqual(name, key.Name))
|
||||
if (entry.Parent == key.Parent && StringUtils.Compare(name, key.Name) == 0)
|
||||
{
|
||||
return (index, prevIndex);
|
||||
}
|
||||
|
|
|
@ -1,5 +1,6 @@
|
|||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.IO;
|
||||
using System.Runtime.CompilerServices;
|
||||
using System.Runtime.InteropServices;
|
||||
using LibHac.Common;
|
||||
|
@ -47,7 +48,11 @@ namespace LibHac
|
|||
foreach (ref readonly Element element in elements)
|
||||
{
|
||||
var result = new Result(element.Module, element.DescriptionStart);
|
||||
dict.Add(result, GetName(element.NameOffset).ToString());
|
||||
|
||||
if (!dict.TryAdd(result, GetName(element.NameOffset).ToString()))
|
||||
{
|
||||
throw new InvalidDataException("Invalid result name archive: Duplicate result found.");
|
||||
}
|
||||
}
|
||||
|
||||
return dict;
|
||||
|
|
|
@ -64,42 +64,6 @@ namespace LibHac
|
|||
return true;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Compares two strings stored int byte spans. For the strings to be equal,
|
||||
/// they must terminate in the same place.
|
||||
/// A string can be terminated by either a null character or the end of the span.
|
||||
/// </summary>
|
||||
/// <param name="s1">The first string to be compared.</param>
|
||||
/// <param name="s2">The first string to be compared.</param>
|
||||
/// <returns><see langword="true"/> if the strings are equal;
|
||||
/// otherwise <see langword="false"/>.</returns>
|
||||
public static bool StringSpansEqual(ReadOnlySpan<byte> s1, ReadOnlySpan<byte> s2)
|
||||
{
|
||||
// Make s1 the long string for simplicity
|
||||
if (s1.Length < s2.Length)
|
||||
{
|
||||
ReadOnlySpan<byte> tmp = s1;
|
||||
s1 = s2;
|
||||
s2 = tmp;
|
||||
}
|
||||
|
||||
int shortLength = s2.Length;
|
||||
int i;
|
||||
|
||||
for (i = 0; i < shortLength; i++)
|
||||
{
|
||||
if (s1[i] != s2[i]) return false;
|
||||
|
||||
// Both strings are null-terminated
|
||||
if (s1[i] == 0) return true;
|
||||
}
|
||||
|
||||
// The bytes in the short string equal those in the long.
|
||||
// Check if the strings are the same length or if the next
|
||||
// character in the long string is a null character
|
||||
return s1.Length == s2.Length || s1[i] == 0;
|
||||
}
|
||||
|
||||
public static ReadOnlySpan<byte> GetUtf8Bytes(string value)
|
||||
{
|
||||
return Encoding.UTF8.GetBytes(value).AsSpan();
|
||||
|
|
Loading…
Reference in a new issue