Add header reading
This commit is contained in:
@@ -2,6 +2,7 @@ package chunks
|
|||||||
|
|
||||||
import "base:runtime"
|
import "base:runtime"
|
||||||
import "core:fmt"
|
import "core:fmt"
|
||||||
|
import "core:io"
|
||||||
import "core:os"
|
import "core:os"
|
||||||
import "core:strconv"
|
import "core:strconv"
|
||||||
import "core:strings"
|
import "core:strings"
|
||||||
@@ -42,6 +43,12 @@ Writer :: struct {
|
|||||||
asset_table: AssetTable,
|
asset_table: AssetTable,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Error :: union #shared_nil {
|
||||||
|
io.Error,
|
||||||
|
os.Error,
|
||||||
|
Read_Error,
|
||||||
|
}
|
||||||
|
|
||||||
// -----------------------------------------
|
// -----------------------------------------
|
||||||
|
|
||||||
writer_init :: proc(
|
writer_init :: proc(
|
||||||
|
|||||||
@@ -1 +1,69 @@
|
|||||||
package chunks
|
package chunks
|
||||||
|
|
||||||
|
import "base:runtime"
|
||||||
|
import "core:io"
|
||||||
|
import "core:mem"
|
||||||
|
import "core:os"
|
||||||
|
|
||||||
|
// -----------------------------------------
|
||||||
|
|
||||||
|
Reader :: struct {}
|
||||||
|
|
||||||
|
Read_Error :: enum u8 {
|
||||||
|
None = 0,
|
||||||
|
File_Not_A_Chunk = 1,
|
||||||
|
Unimplemented = 127,
|
||||||
|
Okay = None,
|
||||||
|
}
|
||||||
|
|
||||||
|
// -----------------------------------------
|
||||||
|
|
||||||
|
// read header
|
||||||
|
// file_exists() func
|
||||||
|
// read_file() -> check chunks -> check fs -> fail
|
||||||
|
|
||||||
|
read_header :: proc(
|
||||||
|
chunk1: ^os.File,
|
||||||
|
allocator := context.allocator,
|
||||||
|
) -> (
|
||||||
|
Header,
|
||||||
|
Error,
|
||||||
|
) {
|
||||||
|
return read_header_impl(chunk1, allocator)
|
||||||
|
}
|
||||||
|
|
||||||
|
read_header_by_path :: proc(
|
||||||
|
chunk1: string,
|
||||||
|
allocator := context.allocator,
|
||||||
|
) -> (
|
||||||
|
header: Header,
|
||||||
|
err: Error,
|
||||||
|
) {
|
||||||
|
chunk1_file := os.open(chunk1, {.Read}) or_return
|
||||||
|
|
||||||
|
return read_header_impl(chunk1_file, allocator)
|
||||||
|
}
|
||||||
|
|
||||||
|
@(private)
|
||||||
|
read_header_impl :: proc(
|
||||||
|
chunk1: ^os.File,
|
||||||
|
allocator: runtime.Allocator,
|
||||||
|
) -> (
|
||||||
|
header: Header,
|
||||||
|
err: Error,
|
||||||
|
) {
|
||||||
|
chunk1_stream := os.to_stream(chunk1)
|
||||||
|
|
||||||
|
header_bytes := mem.ptr_to_bytes(&header)
|
||||||
|
io.read_at(chunk1_stream, header_bytes, 0) or_return
|
||||||
|
|
||||||
|
if header.magic_string != MAGIC_STRING || header.version != 1 {
|
||||||
|
return {}, .File_Not_A_Chunk
|
||||||
|
}
|
||||||
|
|
||||||
|
if header.compression != 0 {
|
||||||
|
return {}, .Unimplemented
|
||||||
|
}
|
||||||
|
|
||||||
|
return header, nil
|
||||||
|
}
|
||||||
|
|||||||
+14
-5
@@ -2,6 +2,7 @@ package main
|
|||||||
|
|
||||||
import "core:os"
|
import "core:os"
|
||||||
|
|
||||||
|
import "src:chunks"
|
||||||
import "src:cli"
|
import "src:cli"
|
||||||
import "src:file"
|
import "src:file"
|
||||||
|
|
||||||
@@ -20,16 +21,24 @@ main :: proc() {
|
|||||||
entries := file.list_dir_recursive(opts.input, working_dir)
|
entries := file.list_dir_recursive(opts.input, working_dir)
|
||||||
defer file.delete_entries(&entries)
|
defer file.delete_entries(&entries)
|
||||||
|
|
||||||
w := file.writer_init(cast(u64)len(entries))
|
w := chunks.writer_init(cast(u64)len(entries))
|
||||||
defer file.writer_destroy(&w)
|
defer chunks.writer_destroy(&w)
|
||||||
|
|
||||||
file.write_assets(&w, opts.output, entries[:], opts.size, opts.compression)
|
chunks.write_assets(
|
||||||
|
|
||||||
file.write_metadata(
|
|
||||||
&w,
|
&w,
|
||||||
opts.output,
|
opts.output,
|
||||||
entries[:],
|
entries[:],
|
||||||
opts.size,
|
opts.size,
|
||||||
opts.compression,
|
opts.compression,
|
||||||
)
|
)
|
||||||
|
|
||||||
|
chunks.write_metadata(
|
||||||
|
&w,
|
||||||
|
opts.output,
|
||||||
|
entries[:],
|
||||||
|
opts.size,
|
||||||
|
opts.compression,
|
||||||
|
)
|
||||||
|
|
||||||
|
chunks.read_header_by_path("./build/CHUNK0")
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user