Compare commits
No commits in common. "9fd405a8969fdaa8273869a46263aeb093850fda" and "1230aa1e915881757a950bc5ef6783ecff9676e9" have entirely different histories.
9fd405a896
...
1230aa1e91
|
@ -17,7 +17,7 @@ jobs:
|
||||||
os: [ubuntu-latest, windows-latest, macos-latest]
|
os: [ubuntu-latest, windows-latest, macos-latest]
|
||||||
runs-on: ${{matrix.os}}
|
runs-on: ${{matrix.os}}
|
||||||
steps:
|
steps:
|
||||||
- uses: goto-bus-stop/setup-zig@v2
|
- uses: goto-bus-stop/setup-zig@v1
|
||||||
with:
|
with:
|
||||||
version: master
|
version: master
|
||||||
- name: prepare-linux
|
- name: prepare-linux
|
||||||
|
@ -51,7 +51,7 @@ jobs:
|
||||||
- uses: actions/checkout@v3
|
- uses: actions/checkout@v3
|
||||||
with:
|
with:
|
||||||
submodules: true
|
submodules: true
|
||||||
- uses: goto-bus-stop/setup-zig@v2
|
- uses: goto-bus-stop/setup-zig@v1
|
||||||
with:
|
with:
|
||||||
version: master
|
version: master
|
||||||
- run: zig fmt src/**/*.zig
|
- run: zig fmt src/**/*.zig
|
||||||
|
|
|
@ -6,6 +6,7 @@ const Eeprom = @import("backup/eeprom.zig").Eeprom;
|
||||||
const Flash = @import("backup/Flash.zig");
|
const Flash = @import("backup/Flash.zig");
|
||||||
|
|
||||||
const escape = @import("../../util.zig").escape;
|
const escape = @import("../../util.zig").escape;
|
||||||
|
const span = @import("../../util.zig").span;
|
||||||
|
|
||||||
const Needle = struct { str: []const u8, kind: Backup.Kind };
|
const Needle = struct { str: []const u8, kind: Backup.Kind };
|
||||||
const backup_kinds = [6]Needle{
|
const backup_kinds = [6]Needle{
|
||||||
|
@ -194,7 +195,7 @@ pub const Backup = struct {
|
||||||
}
|
}
|
||||||
|
|
||||||
fn saveName(self: *const Self, allocator: Allocator) ![]const u8 {
|
fn saveName(self: *const Self, allocator: Allocator) ![]const u8 {
|
||||||
const title_str = std.mem.sliceTo(&escape(self.title), 0);
|
const title_str = span(&escape(self.title));
|
||||||
const name = if (title_str.len != 0) title_str else "untitled";
|
const name = if (title_str.len != 0) title_str else "untitled";
|
||||||
|
|
||||||
return try std.mem.concat(allocator, u8, &[_][]const u8{ name, ".sav" });
|
return try std.mem.concat(allocator, u8, &[_][]const u8{ name, ".sav" });
|
||||||
|
|
|
@ -9,6 +9,8 @@ const Arm7tdmi = @import("core/cpu.zig").Arm7tdmi;
|
||||||
const Scheduler = @import("core/scheduler.zig").Scheduler;
|
const Scheduler = @import("core/scheduler.zig").Scheduler;
|
||||||
const FpsTracker = @import("util.zig").FpsTracker;
|
const FpsTracker = @import("util.zig").FpsTracker;
|
||||||
|
|
||||||
|
const span = @import("util.zig").span;
|
||||||
|
|
||||||
const gba_width = @import("core/ppu.zig").width;
|
const gba_width = @import("core/ppu.zig").width;
|
||||||
const gba_height = @import("core/ppu.zig").height;
|
const gba_height = @import("core/ppu.zig").height;
|
||||||
|
|
||||||
|
@ -71,7 +73,7 @@ pub const Gui = struct {
|
||||||
|
|
||||||
return Self{
|
return Self{
|
||||||
.window = window,
|
.window = window,
|
||||||
.title = std.mem.sliceTo(title, 0),
|
.title = span(title),
|
||||||
.ctx = ctx,
|
.ctx = ctx,
|
||||||
.program_id = program_id,
|
.program_id = program_id,
|
||||||
.audio = Audio.init(apu),
|
.audio = Audio.init(apu),
|
||||||
|
|
51
src/util.zig
51
src/util.zig
|
@ -66,6 +66,57 @@ pub fn intToBytes(comptime T: type, value: anytype) [@sizeOf(T)]u8 {
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// The Title from the GBA Cartridge is an Uppercase ASCII string which is
|
||||||
|
/// null-padded to 12 bytes
|
||||||
|
///
|
||||||
|
/// This function returns a slice of the ASCII string without the null terminator(s)
|
||||||
|
/// (essentially, a proper Zig/Rust/Any modern language String)
|
||||||
|
pub fn span(title: *const [12]u8) []const u8 {
|
||||||
|
const end = std.mem.indexOfScalar(u8, title, '\x00');
|
||||||
|
return title[0 .. end orelse title.len];
|
||||||
|
}
|
||||||
|
|
||||||
|
test "span" {
|
||||||
|
var example: *const [12]u8 = "POKEMON_EMER";
|
||||||
|
try std.testing.expectEqualSlices(u8, "POKEMON_EMER", span(example));
|
||||||
|
|
||||||
|
example = "POKEMON_EME\x00";
|
||||||
|
try std.testing.expectEqualSlices(u8, "POKEMON_EME", span(example));
|
||||||
|
|
||||||
|
example = "POKEMON_EM\x00\x00";
|
||||||
|
try std.testing.expectEqualSlices(u8, "POKEMON_EM", span(example));
|
||||||
|
|
||||||
|
example = "POKEMON_E\x00\x00\x00";
|
||||||
|
try std.testing.expectEqualSlices(u8, "POKEMON_E", span(example));
|
||||||
|
|
||||||
|
example = "POKEMON_\x00\x00\x00\x00";
|
||||||
|
try std.testing.expectEqualSlices(u8, "POKEMON_", span(example));
|
||||||
|
|
||||||
|
example = "POKEMON\x00\x00\x00\x00\x00";
|
||||||
|
try std.testing.expectEqualSlices(u8, "POKEMON", span(example));
|
||||||
|
|
||||||
|
example = "POKEMO\x00\x00\x00\x00\x00\x00";
|
||||||
|
try std.testing.expectEqualSlices(u8, "POKEMO", span(example));
|
||||||
|
|
||||||
|
example = "POKEM\x00\x00\x00\x00\x00\x00\x00";
|
||||||
|
try std.testing.expectEqualSlices(u8, "POKEM", span(example));
|
||||||
|
|
||||||
|
example = "POKE\x00\x00\x00\x00\x00\x00\x00\x00";
|
||||||
|
try std.testing.expectEqualSlices(u8, "POKE", span(example));
|
||||||
|
|
||||||
|
example = "POK\x00\x00\x00\x00\x00\x00\x00\x00\x00";
|
||||||
|
try std.testing.expectEqualSlices(u8, "POK", span(example));
|
||||||
|
|
||||||
|
example = "PO\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00";
|
||||||
|
try std.testing.expectEqualSlices(u8, "PO", span(example));
|
||||||
|
|
||||||
|
example = "P\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00";
|
||||||
|
try std.testing.expectEqualSlices(u8, "P", span(example));
|
||||||
|
|
||||||
|
example = "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00";
|
||||||
|
try std.testing.expectEqualSlices(u8, "", span(example));
|
||||||
|
}
|
||||||
|
|
||||||
/// Creates a copy of a title with all Filesystem-invalid characters replaced
|
/// Creates a copy of a title with all Filesystem-invalid characters replaced
|
||||||
///
|
///
|
||||||
/// e.g. POKEPIN R/S to POKEPIN R_S
|
/// e.g. POKEPIN R/S to POKEPIN R_S
|
||||||
|
|
Loading…
Reference in New Issue