package main import "core:bytes" import "core:fmt" import "core:io" import "core:os" import "core:time" main :: proc() { if len(os.args) < 2 { panic("no file") } filepath := os.args[1] file, err := os.open(filepath) if err != os.ERROR_NONE { panic("could not open file") } defer os.close(file) fmt.printf("%s\n", filepath) reader: io.Reader seeker: io.Seeker ok: bool reader, ok = io.to_reader(os.stream_from_handle(file)) if !ok { panic("could not reader") } seeker, ok = io.to_seeker(os.stream_from_handle(file)) if !ok { panic("could not seeker") } body_length: u32 { io.read_ptr(reader, &body_length, 4) fmt.printf("body_length: %d\n", body_length) } file_length: u32 { io.read_ptr(reader, &file_length, 4) fmt.printf("file_length: %d\n", file_length) } index_length := file_length - body_length fmt.printf("index_length: %d\n", index_length) content_marks := make([]u32, index_length) for i in 0 ..< index_length { io.read_ptr(reader, &content_marks[i], 4) } // fmt.printf("%v#%d\n", content_marks, len(content_marks)) fmt.printf("#%d marks\n", len(content_marks)) content_offset := 8 + (index_length * 4) io.seek(seeker, i64(content_offset), .Start) buffer: [4096]byte prev_mark: u32 for mark in content_marks { length := mark - prev_mark line := buffer[:length] fmt.printf("\nblock %d-%d\n", prev_mark, mark) io.read_full(reader, line) /*for c in line { fmt.printf("%c", c) } fmt.printf("\n")*/ buffer: bytes.Buffer bytes.buffer_init(&buffer, line) defer bytes.buffer_destroy(&buffer) { timestamp: u32 bytes.buffer_read_ptr(&buffer, ×tamp, 4) filter, _ := bytes.buffer_read_byte(&buffer) channel, _ := bytes.buffer_read_byte(&buffer) unix_time := time.unix(i64(timestamp), 0) fmt.printf( "%d - %d/%02d/%02d@%02d:%02d:%02d - %x %x\n", timestamp, time.date(unix_time), time.clock_from_time(unix_time), filter, channel, ) } for bytes.buffer_length(&buffer) > 0 { b, _ := bytes.buffer_read_byte(&buffer) if b == 0x02 { fmt.printf("[") kind, _ := bytes.buffer_read_byte(&buffer) fmt.printf("0x%02x=", kind) size, _ := bytes.buffer_read_byte(&buffer) fmt.printf("%d, ", size) for _ in 0 ..< size { b, _ = bytes.buffer_read_byte(&buffer) if b >= 32 && b <= 126 { fmt.printf("%c", b) } else { if b == 0x03 { fmt.printf("]") } else { fmt.printf("0x%02x ", b) } } } } else { // fmt.printf("(0x%02x) %c ", b, b) fmt.printf("%c", b) } } fmt.printf("\n") prev_mark = mark } }