code wiki / (root) / nx_zlib_real_test.nx

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}