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}