code wiki / _hdl_build / nx_sovgit_rtprobe.nx
nx_sovgit_rtprobe.nx source
↩ module page · 68 lines · 2558 B
1// nx_sovgit_rtprobe.nx -- diagnostic: dfe_compress -> nx_zlib_inflate round-trip over generated data.
2// argv[1] = size, argv[2] = mode (0=LCG random, 1=zeros, 2=repeating 64B pattern).
3// Prints zlen/err/out and the FIRST divergence offset (-1 = byte-exact). license_tier: ORIGINAL
4import "nx_sovgit_obj.nx"
5const K_MAGIC_88172645463325252: i64 = 88172645463325252
6const K_MAGIC_4096: i64 = 4096
7const K_MAGIC_65536: i64 = 65536
8
9func rt_w(s: *u8) -> i64 { var n: i64 = 0; while s[n] != (0 as u8) { n = n + 1 } sys_write(1, s, n); return 0 }
10func rt_n(v: i64) -> i64 {
11 let b: *u8 = sys_mmap(32)
12 var x: i64 = v
13 var neg: i64 = 0
14 if x < 0 { neg = 1; x = 0 - x }
15 var i: i64 = 31
16 if x == 0 { b[i] = 48 as u8; i = i - 1 }
17 while x > 0 { b[i] = (48 + x % 10) as u8; x = x / 10; i = i - 1 }
18 if neg == 1 { b[i] = 45 as u8; i = i - 1 }
19 sys_write(1, (b as i64 + i + 1) as *u8, 31 - i)
20 return 0
21}
22func rt_atoi(s: *u8) -> i64 {
23 var v: i64 = 0
24 var i: i64 = 0
25 while s[i] != (0 as u8) { v = v * 10 + ((s[i] as i64) - 48); i = i + 1 }
26 return v
27}
28func main(argc: i64, argv: *i64) -> i64 {
29 if argc < 3 { rt_w("usage: rtprobe <size> <mode>\n" as *u8); return 2 }
30 let n: i64 = rt_atoi(argv[1] as *u8)
31 let mode: i64 = rt_atoi(argv[2] as *u8)
32 let src: *u8 = sys_mmap(n + 64)
33 var i: i64 = 0
34 var seed: i64 = K_MAGIC_88172645463325252
35 while i < n {
36 if mode == 0 {
37 seed = seed ^ (seed << 13)
38 seed = seed ^ (seed >> 7)
39 seed = seed ^ (seed << 17)
40 src[i] = (seed & 255) as u8
41 } else { if mode == 1 { src[i] = 0 as u8 } else { src[i] = ((i * 7 + i / 64) & 255) as u8 } }
42 i = i + 1
43 }
44 let z: *u8 = sys_mmap(n + (n >> 1) + K_MAGIC_4096)
45 let zlen: i64 = sg_zwrap(src, n, z)
46 let r: *NxZlibResult = nx_zlib_inflate(z, zlen, n + K_MAGIC_65536)
47 rt_w("n=" as *u8); rt_n(n)
48 rt_w(" mode=" as *u8); rt_n(mode)
49 rt_w(" zlen=" as *u8); rt_n(zlen)
50 rt_w(" err=" as *u8); rt_n(r.error_code)
51 rt_w(" out=" as *u8); rt_n(r.output_size)
52 var diff: i64 = 0 - 1
53 if r.output_size > 0 {
54 var j: i64 = 0
55 var lim: i64 = r.output_size
56 if n < lim { lim = n }
57 var go: i64 = 1
58 while go == 1 {
59 if j >= lim { go = 0 } else {
60 let a: *u8 = (r.output_data as i64 + j) as *u8
61 if a[0] != src[j] { diff = j; go = 0 } else { j = j + 1 }
62 }
63 }
64 }
65 rt_w(" firstdiff=" as *u8); rt_n(diff)
66 rt_w("\n" as *u8)
67 return 0
68}