code wiki / _hdl_build / nx_sovgit_packprobe.nx
nx_sovgit_packprobe.nx source
↩ module page · 54 lines · 2329 B
1// nx_sovgit_packprobe.nx -- diagnostic: walk a git packfile exactly like the daemon's unpack_into
2// and print per-entry typ/size/err/out/consumed. license_tier: ORIGINAL
3import "nx_sovgit_obj.nx"
4const K_MAGIC_65536: i64 = 65536
5
6func pp_w(s: *u8) -> i64 { var n: i64 = 0; while s[n] != (0 as u8) { n = n + 1 } sys_write(1, s, n); return 0 }
7func pp_n(v: i64) -> i64 {
8 let b: *u8 = sys_mmap(32)
9 var x: i64 = v
10 var neg: i64 = 0
11 if x < 0 { neg = 1; x = 0 - x }
12 var i: i64 = 31
13 if x == 0 { b[i] = 48 as u8; i = i - 1 }
14 while x > 0 { b[i] = (48 + x % 10) as u8; x = x / 10; i = i - 1 }
15 if neg == 1 { b[i] = 45 as u8; i = i - 1 }
16 sys_write(1, (b as i64 + i + 1) as *u8, 31 - i)
17 return 0
18}
19func main(argc: i64, argv: *i64) -> i64 {
20 if argc < 2 { pp_w("usage: packprobe <packfile>\n" as *u8); return 2 }
21 let szp: *i64 = sys_mmap(16) as *i64
22 let pack: *u8 = sys_read_file(argv[1] as *u8, szp)
23 if (pack as i64) == 0 { pp_w("read fail\n" as *u8); return 1 }
24 let plen: i64 = szp[0]
25 let count: i64 = ((pack[8] as i64) << 24) | ((pack[9] as i64) << 16) | ((pack[10] as i64) << 8) | (pack[11] as i64)
26 pp_w("plen=" as *u8); pp_n(plen)
27 pp_w(" count=" as *u8); pp_n(count)
28 pp_w("\n" as *u8)
29 var pos: i64 = 12
30 var i: i64 = 0
31 while i < count {
32 var byte: i64 = pack[pos] as i64; pos = pos + 1
33 let typ: i64 = (byte >> 4) & 7
34 var osz: i64 = byte & 15
35 var shift: i64 = 4
36 while (byte & 128) != 0 { byte = pack[pos] as i64; pos = pos + 1; osz = osz + ((byte & 127) << shift); shift = shift + 7 }
37 var icap: i64 = osz + K_MAGIC_65536
38 if icap > (1 << 26) { icap = 1 << 26 }
39 let r: *NxZlibResult = nx_zlib_inflate((pack as i64 + pos) as *u8, plen - pos, icap)
40 pp_w("entry " as *u8); pp_n(i)
41 pp_w(" typ=" as *u8); pp_n(typ)
42 pp_w(" osz=" as *u8); pp_n(osz)
43 pp_w(" err=" as *u8); pp_n(r.error_code)
44 pp_w(" out=" as *u8); pp_n(r.output_size)
45 pp_w(" consumed=" as *u8); pp_n(r.bytes_consumed)
46 pp_w("\n" as *u8)
47 if r.error_code != 0 { pp_w("STOP on err\n" as *u8); return 1 }
48 pos = pos + r.bytes_consumed
49 i = i + 1
50 }
51 pp_w("tail=" as *u8); pp_n(plen - pos)
52 pp_w(" (expect 32 = sha256 trailer)\n" as *u8)
53 return 0
54}