nx_zlib_real_test.nx source
↩ module page · 95 lines · 2846 B
1// nx_zlib_real_test.nx -- expose the exact nx_zlib_inflate error code
2// when handed the real 67-byte zlib stream from a 50x50 PNG's IDAT.
3
4import "nx_syscalls.nx"
5import "nx_runtime.nx"
6import "nx_zlib_wrap.nx"
7
8func main() -> nx_int {
9 // 67-byte zlib stream from PNG IDAT (zlib.compress(raw_50x50, 6)):
10 // 2-byte header (0x78 0x9c)
11 // 61 bytes raw deflate (dynamic Huffman)
12 // 4-byte adler32 trailer (0xac 0x61 0xd7 0x3e)
13 let zin: *u8 = (sys_mmap(72)) as *u8
14 zin[0] = 0x78 as u8
15 zin[1] = 0x9c as u8
16 zin[2] = 0xed as u8
17 zin[3] = 0xce as u8
18 zin[4] = 0x41 as u8
19 zin[5] = 0x0d as u8
20 zin[6] = 0x00 as u8
21 zin[7] = 0x20 as u8
22 zin[8] = 0x0c as u8
23 zin[9] = 0x00 as u8
24 zin[10] = 0xb1 as u8
25 zin[11] = 0xf9 as u8
26 zin[12] = 0x17 as u8
27 zin[13] = 0x80 as u8
28 zin[14] = 0x08 as u8
29 zin[15] = 0x94 as u8
30 zin[16] = 0x4c as u8
31 zin[17] = 0x16 as u8
32 zin[18] = 0x32 as u8
33 zin[19] = 0xb8 as u8
34 zin[20] = 0x47 as u8
35 zin[21] = 0x93 as u8
36 zin[22] = 0x0a as u8
37 zin[23] = 0xe8 as u8
38 zin[24] = 0xec as u8
39 zin[25] = 0x3d as u8
40 zin[26] = 0x41 as u8
41 zin[27] = 0xf3 as u8
42 zin[28] = 0x7d as u8
43 zin[29] = 0xa0 as u8
44 zin[30] = 0xa5 as u8
45 zin[31] = 0xa5 as u8
46 zin[32] = 0xa5 as u8
47 zin[33] = 0xa5 as u8
48 zin[34] = 0xa5 as u8
49 zin[35] = 0xd5 as u8
50 zin[36] = 0xa0 as u8
51 zin[37] = 0xa5 as u8
52 zin[38] = 0xa5 as u8
53 zin[39] = 0x55 as u8
54 zin[40] = 0xa0 as u8
55 zin[41] = 0xa5 as u8
56 zin[42] = 0xa5 as u8
57 zin[43] = 0x55 as u8
58 zin[44] = 0xa0 as u8
59 zin[45] = 0xa5 as u8
60 zin[46] = 0xa5 as u8
61 zin[47] = 0x55 as u8
62 zin[48] = 0xa0 as u8
63 zin[49] = 0xa5 as u8
64 zin[50] = 0xa5 as u8
65 zin[51] = 0x55 as u8
66 zin[52] = 0xa0 as u8
67 zin[53] = 0xa5 as u8
68 zin[54] = 0xa5 as u8
69 zin[55] = 0x55 as u8
70 zin[56] = 0xa0 as u8
71 zin[57] = 0xa5 as u8
72 zin[58] = 0xa5 as u8
73 zin[59] = 0x55 as u8
74 zin[60] = 0x10 as u8
75 zin[61] = 0x6d as u8
76 zin[62] = 0x3d as u8
77 zin[63] = 0xac as u8
78 zin[64] = 0x61 as u8
79 zin[65] = 0xd7 as u8
80 zin[66] = 0x3e as u8
81
82 // Same max_output the PNG decoder would use: 50*(1+50*3)+64 = 7614.
83 let r: *NxZlibResult = nx_zlib_inflate(zin, 67, 7614)
84 if r == (0 as *NxZlibResult) { return 1 }
85 // Surface exact zlib error code (+ 10 to disambiguate from above)
86 if r.error_code != NX_ZLIB_OK { return 10 + r.error_code }
87 if r.output_size != 7550 { return 2 }
88 // First 4 bytes of output: filter(0x00) + RGB(c8 aa 96)
89 if (r.output_data[0] as nx_int) & 255 != 0x00 { return 3 }
90 if (r.output_data[1] as nx_int) & 255 != 0xc8 { return 4 }
91 if (r.output_data[2] as nx_int) & 255 != 0xaa { return 5 }
92 if (r.output_data[3] as nx_int) & 255 != 0x96 { return 6 }
93
94 return 0
95}