Make io offsets/sizes u64 instead of usize
Decouple the concepts of address-space size and file size. Closes #637
This commit is contained in:
parent
205e501e42
commit
fbcc559cdb
10
std/io.zig
10
std/io.zig
@ -195,8 +195,8 @@ pub fn InStream(comptime ReadError: type) type {
|
|||||||
return mem.readVarInt(ReturnType, bytes, endian);
|
return mem.readVarInt(ReturnType, bytes, endian);
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn skipBytes(self: *Self, num_bytes: usize) !void {
|
pub fn skipBytes(self: *Self, num_bytes: u64) !void {
|
||||||
var i: usize = 0;
|
var i: u64 = 0;
|
||||||
while (i < num_bytes) : (i += 1) {
|
while (i < num_bytes) : (i += 1) {
|
||||||
_ = try self.readByte();
|
_ = try self.readByte();
|
||||||
}
|
}
|
||||||
@ -232,9 +232,9 @@ pub fn OutStream(comptime WriteError: type) type {
|
|||||||
return self.writeFn(self, slice);
|
return self.writeFn(self, slice);
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn writeByteNTimes(self: *Self, byte: u8, n: usize) Error!void {
|
pub fn writeByteNTimes(self: *Self, byte: u8, n: u64) Error!void {
|
||||||
const slice = (*const [1]u8)(&byte)[0..];
|
const slice = (*const [1]u8)(&byte)[0..];
|
||||||
var i: usize = 0;
|
var i: u64 = 0;
|
||||||
while (i < n) : (i += 1) {
|
while (i < n) : (i += 1) {
|
||||||
try self.writeFn(self, slice);
|
try self.writeFn(self, slice);
|
||||||
}
|
}
|
||||||
@ -743,7 +743,7 @@ pub fn CountingOutStream(comptime OutStreamError: type) type {
|
|||||||
pub const Error = OutStreamError;
|
pub const Error = OutStreamError;
|
||||||
|
|
||||||
pub stream: Stream,
|
pub stream: Stream,
|
||||||
pub bytes_written: usize,
|
pub bytes_written: u64,
|
||||||
child_stream: *Stream,
|
child_stream: *Stream,
|
||||||
|
|
||||||
pub fn init(child_stream: *Stream) Self {
|
pub fn init(child_stream: *Stream) Self {
|
||||||
|
@ -7,25 +7,25 @@ pub fn SeekableStream(comptime SeekErrorType: type, comptime GetSeekPosErrorType
|
|||||||
pub const SeekError = SeekErrorType;
|
pub const SeekError = SeekErrorType;
|
||||||
pub const GetSeekPosError = GetSeekPosErrorType;
|
pub const GetSeekPosError = GetSeekPosErrorType;
|
||||||
|
|
||||||
seekToFn: fn (self: *Self, pos: usize) SeekError!void,
|
seekToFn: fn (self: *Self, pos: u64) SeekError!void,
|
||||||
seekForwardFn: fn (self: *Self, pos: isize) SeekError!void,
|
seekForwardFn: fn (self: *Self, pos: i64) SeekError!void,
|
||||||
|
|
||||||
getPosFn: fn (self: *Self) GetSeekPosError!usize,
|
getPosFn: fn (self: *Self) GetSeekPosError!u64,
|
||||||
getEndPosFn: fn (self: *Self) GetSeekPosError!usize,
|
getEndPosFn: fn (self: *Self) GetSeekPosError!u64,
|
||||||
|
|
||||||
pub fn seekTo(self: *Self, pos: usize) SeekError!void {
|
pub fn seekTo(self: *Self, pos: u64) SeekError!void {
|
||||||
return self.seekToFn(self, pos);
|
return self.seekToFn(self, pos);
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn seekForward(self: *Self, amt: isize) SeekError!void {
|
pub fn seekForward(self: *Self, amt: i64) SeekError!void {
|
||||||
return self.seekForwardFn(self, amt);
|
return self.seekForwardFn(self, amt);
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn getEndPos(self: *Self) GetSeekPosError!usize {
|
pub fn getEndPos(self: *Self) GetSeekPosError!u64 {
|
||||||
return self.getEndPosFn(self);
|
return self.getEndPosFn(self);
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn getPos(self: *Self) GetSeekPosError!usize {
|
pub fn getPos(self: *Self) GetSeekPosError!u64 {
|
||||||
return self.getPosFn(self);
|
return self.getPosFn(self);
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
@ -235,7 +235,7 @@ pub const File = struct {
|
|||||||
Unexpected,
|
Unexpected,
|
||||||
};
|
};
|
||||||
|
|
||||||
pub fn seekForward(self: File, amount: isize) SeekError!void {
|
pub fn seekForward(self: File, amount: i64) SeekError!void {
|
||||||
switch (builtin.os) {
|
switch (builtin.os) {
|
||||||
Os.linux, Os.macosx, Os.ios, Os.freebsd, Os.netbsd => {
|
Os.linux, Os.macosx, Os.ios, Os.freebsd, Os.netbsd => {
|
||||||
const result = posix.lseek(self.handle, amount, posix.SEEK_CUR);
|
const result = posix.lseek(self.handle, amount, posix.SEEK_CUR);
|
||||||
@ -266,7 +266,7 @@ pub const File = struct {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn seekTo(self: File, pos: usize) SeekError!void {
|
pub fn seekTo(self: File, pos: u64) SeekError!void {
|
||||||
switch (builtin.os) {
|
switch (builtin.os) {
|
||||||
Os.linux, Os.macosx, Os.ios, Os.freebsd, Os.netbsd => {
|
Os.linux, Os.macosx, Os.ios, Os.freebsd, Os.netbsd => {
|
||||||
const ipos = try math.cast(isize, pos);
|
const ipos = try math.cast(isize, pos);
|
||||||
@ -307,7 +307,7 @@ pub const File = struct {
|
|||||||
Unexpected,
|
Unexpected,
|
||||||
};
|
};
|
||||||
|
|
||||||
pub fn getPos(self: File) GetSeekPosError!usize {
|
pub fn getPos(self: File) GetSeekPosError!u64 {
|
||||||
switch (builtin.os) {
|
switch (builtin.os) {
|
||||||
Os.linux, Os.macosx, Os.ios, Os.freebsd, Os.netbsd => {
|
Os.linux, Os.macosx, Os.ios, Os.freebsd, Os.netbsd => {
|
||||||
const result = posix.lseek(self.handle, 0, posix.SEEK_CUR);
|
const result = posix.lseek(self.handle, 0, posix.SEEK_CUR);
|
||||||
@ -324,7 +324,7 @@ pub const File = struct {
|
|||||||
else => os.unexpectedErrorPosix(err),
|
else => os.unexpectedErrorPosix(err),
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
return result;
|
return @intCast(u64, result);
|
||||||
},
|
},
|
||||||
Os.windows => {
|
Os.windows => {
|
||||||
var pos: windows.LARGE_INTEGER = undefined;
|
var pos: windows.LARGE_INTEGER = undefined;
|
||||||
@ -337,16 +337,16 @@ pub const File = struct {
|
|||||||
}
|
}
|
||||||
|
|
||||||
assert(pos >= 0);
|
assert(pos >= 0);
|
||||||
return math.cast(usize, pos);
|
return math.cast(u64, pos);
|
||||||
},
|
},
|
||||||
else => @compileError("unsupported OS"),
|
else => @compileError("unsupported OS"),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn getEndPos(self: File) GetSeekPosError!usize {
|
pub fn getEndPos(self: File) GetSeekPosError!u64 {
|
||||||
if (is_posix) {
|
if (is_posix) {
|
||||||
const stat = try os.posixFStat(self.handle);
|
const stat = try os.posixFStat(self.handle);
|
||||||
return @intCast(usize, stat.size);
|
return @intCast(u64, stat.size);
|
||||||
} else if (is_windows) {
|
} else if (is_windows) {
|
||||||
var file_size: windows.LARGE_INTEGER = undefined;
|
var file_size: windows.LARGE_INTEGER = undefined;
|
||||||
if (windows.GetFileSizeEx(self.handle, &file_size) == 0) {
|
if (windows.GetFileSizeEx(self.handle, &file_size) == 0) {
|
||||||
@ -357,7 +357,7 @@ pub const File = struct {
|
|||||||
}
|
}
|
||||||
if (file_size < 0)
|
if (file_size < 0)
|
||||||
return error.Overflow;
|
return error.Overflow;
|
||||||
return math.cast(usize, @intCast(u64, file_size));
|
return @intCast(u64, file_size);
|
||||||
} else {
|
} else {
|
||||||
@compileError("TODO support getEndPos on this OS");
|
@compileError("TODO support getEndPos on this OS");
|
||||||
}
|
}
|
||||||
@ -492,22 +492,22 @@ pub const File = struct {
|
|||||||
|
|
||||||
pub const Stream = io.SeekableStream(SeekError, GetSeekPosError);
|
pub const Stream = io.SeekableStream(SeekError, GetSeekPosError);
|
||||||
|
|
||||||
pub fn seekToFn(seekable_stream: *Stream, pos: usize) SeekError!void {
|
pub fn seekToFn(seekable_stream: *Stream, pos: u64) SeekError!void {
|
||||||
const self = @fieldParentPtr(SeekableStream, "stream", seekable_stream);
|
const self = @fieldParentPtr(SeekableStream, "stream", seekable_stream);
|
||||||
return self.file.seekTo(pos);
|
return self.file.seekTo(pos);
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn seekForwardFn(seekable_stream: *Stream, amt: isize) SeekError!void {
|
pub fn seekForwardFn(seekable_stream: *Stream, amt: i64) SeekError!void {
|
||||||
const self = @fieldParentPtr(SeekableStream, "stream", seekable_stream);
|
const self = @fieldParentPtr(SeekableStream, "stream", seekable_stream);
|
||||||
return self.file.seekForward(amt);
|
return self.file.seekForward(amt);
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn getEndPosFn(seekable_stream: *Stream) GetSeekPosError!usize {
|
pub fn getEndPosFn(seekable_stream: *Stream) GetSeekPosError!u64 {
|
||||||
const self = @fieldParentPtr(SeekableStream, "stream", seekable_stream);
|
const self = @fieldParentPtr(SeekableStream, "stream", seekable_stream);
|
||||||
return self.file.getEndPos();
|
return self.file.getEndPos();
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn getPosFn(seekable_stream: *Stream) GetSeekPosError!usize {
|
pub fn getPosFn(seekable_stream: *Stream) GetSeekPosError!u64 {
|
||||||
const self = @fieldParentPtr(SeekableStream, "stream", seekable_stream);
|
const self = @fieldParentPtr(SeekableStream, "stream", seekable_stream);
|
||||||
return self.file.getPos();
|
return self.file.getPos();
|
||||||
}
|
}
|
||||||
|
13
std/pdb.zig
13
std/pdb.zig
@ -588,7 +588,7 @@ const SuperBlock = packed struct {
|
|||||||
|
|
||||||
const MsfStream = struct {
|
const MsfStream = struct {
|
||||||
in_file: os.File,
|
in_file: os.File,
|
||||||
pos: usize,
|
pos: u64,
|
||||||
blocks: []u32,
|
blocks: []u32,
|
||||||
block_size: u32,
|
block_size: u32,
|
||||||
|
|
||||||
@ -598,7 +598,7 @@ const MsfStream = struct {
|
|||||||
pub const Error = @typeOf(read).ReturnType.ErrorSet;
|
pub const Error = @typeOf(read).ReturnType.ErrorSet;
|
||||||
pub const Stream = io.InStream(Error);
|
pub const Stream = io.InStream(Error);
|
||||||
|
|
||||||
fn init(block_size: u32, block_count: u32, pos: usize, file: os.File, allocator: *mem.Allocator) !MsfStream {
|
fn init(block_size: u32, block_count: u32, pos: u64, file: os.File, allocator: *mem.Allocator) !MsfStream {
|
||||||
var stream = MsfStream{
|
var stream = MsfStream{
|
||||||
.in_file = file,
|
.in_file = file,
|
||||||
.pos = 0,
|
.pos = 0,
|
||||||
@ -660,23 +660,24 @@ const MsfStream = struct {
|
|||||||
return size;
|
return size;
|
||||||
}
|
}
|
||||||
|
|
||||||
fn seekForward(self: *MsfStream, len: usize) !void {
|
// XXX: The `len` parameter should be signed
|
||||||
|
fn seekForward(self: *MsfStream, len: u64) !void {
|
||||||
self.pos += len;
|
self.pos += len;
|
||||||
if (self.pos >= self.blocks.len * self.block_size)
|
if (self.pos >= self.blocks.len * self.block_size)
|
||||||
return error.EOF;
|
return error.EOF;
|
||||||
}
|
}
|
||||||
|
|
||||||
fn seekTo(self: *MsfStream, len: usize) !void {
|
fn seekTo(self: *MsfStream, len: u64) !void {
|
||||||
self.pos = len;
|
self.pos = len;
|
||||||
if (self.pos >= self.blocks.len * self.block_size)
|
if (self.pos >= self.blocks.len * self.block_size)
|
||||||
return error.EOF;
|
return error.EOF;
|
||||||
}
|
}
|
||||||
|
|
||||||
fn getSize(self: *const MsfStream) usize {
|
fn getSize(self: *const MsfStream) u64 {
|
||||||
return self.blocks.len * self.block_size;
|
return self.blocks.len * self.block_size;
|
||||||
}
|
}
|
||||||
|
|
||||||
fn getFilePos(self: MsfStream) usize {
|
fn getFilePos(self: MsfStream) u64 {
|
||||||
const block_id = self.pos / self.block_size;
|
const block_id = self.pos / self.block_size;
|
||||||
const block = self.blocks[block_id];
|
const block = self.blocks[block_id];
|
||||||
const offset = self.pos % self.block_size;
|
const offset = self.pos % self.block_size;
|
||||||
|
Loading…
x
Reference in New Issue
Block a user