xref: /aosp_15_r20/external/xz-embedded/userspace/bytetest.c (revision d2c16535d139cb185e89120452531bba6b36d3c6)
1*d2c16535SElliott Hughes // SPDX-License-Identifier: 0BSD
2*d2c16535SElliott Hughes 
3*d2c16535SElliott Hughes /*
4*d2c16535SElliott Hughes  * Lazy test for the case when the output size is known
5*d2c16535SElliott Hughes  *
6*d2c16535SElliott Hughes  * Author: Lasse Collin <[email protected]>
7*d2c16535SElliott Hughes  */
8*d2c16535SElliott Hughes 
9*d2c16535SElliott Hughes #include <stdbool.h>
10*d2c16535SElliott Hughes #include <stdio.h>
11*d2c16535SElliott Hughes #include <string.h>
12*d2c16535SElliott Hughes #include <stdlib.h>
13*d2c16535SElliott Hughes #include "xz.h"
14*d2c16535SElliott Hughes 
15*d2c16535SElliott Hughes static uint8_t in[1];
16*d2c16535SElliott Hughes static uint8_t out[BUFSIZ];
17*d2c16535SElliott Hughes 
main(int argc,char ** argv)18*d2c16535SElliott Hughes int main(int argc, char **argv)
19*d2c16535SElliott Hughes {
20*d2c16535SElliott Hughes 	struct xz_buf b;
21*d2c16535SElliott Hughes 	struct xz_dec *s;
22*d2c16535SElliott Hughes 	enum xz_ret ret;
23*d2c16535SElliott Hughes 	const char *msg;
24*d2c16535SElliott Hughes 	size_t uncomp_size;
25*d2c16535SElliott Hughes 
26*d2c16535SElliott Hughes 	if (argc != 2) {
27*d2c16535SElliott Hughes 		fputs("Give uncompressed size as the argument\n", stderr);
28*d2c16535SElliott Hughes 		return 1;
29*d2c16535SElliott Hughes 	}
30*d2c16535SElliott Hughes 
31*d2c16535SElliott Hughes 	uncomp_size = atoi(argv[1]);
32*d2c16535SElliott Hughes 
33*d2c16535SElliott Hughes 	xz_crc32_init();
34*d2c16535SElliott Hughes 
35*d2c16535SElliott Hughes 	/*
36*d2c16535SElliott Hughes 	 * Support up to 64 MiB dictionary. The actually needed memory
37*d2c16535SElliott Hughes 	 * is allocated once the headers have been parsed.
38*d2c16535SElliott Hughes 	 */
39*d2c16535SElliott Hughes 	s = xz_dec_init(XZ_DYNALLOC, 1 << 26);
40*d2c16535SElliott Hughes 	if (s == NULL) {
41*d2c16535SElliott Hughes 		msg = "Memory allocation failed\n";
42*d2c16535SElliott Hughes 		goto error;
43*d2c16535SElliott Hughes 	}
44*d2c16535SElliott Hughes 
45*d2c16535SElliott Hughes 	b.in = in;
46*d2c16535SElliott Hughes 	b.in_pos = 0;
47*d2c16535SElliott Hughes 	b.in_size = 0;
48*d2c16535SElliott Hughes 	b.out = out;
49*d2c16535SElliott Hughes 	b.out_pos = 0;
50*d2c16535SElliott Hughes 	b.out_size = uncomp_size < BUFSIZ ? uncomp_size : BUFSIZ;
51*d2c16535SElliott Hughes 
52*d2c16535SElliott Hughes 	while (true) {
53*d2c16535SElliott Hughes 		if (b.in_pos == b.in_size) {
54*d2c16535SElliott Hughes 			b.in_size = fread(in, 1, sizeof(in), stdin);
55*d2c16535SElliott Hughes 			b.in_pos = 0;
56*d2c16535SElliott Hughes 		}
57*d2c16535SElliott Hughes 
58*d2c16535SElliott Hughes 		ret = xz_dec_run(s, &b);
59*d2c16535SElliott Hughes 
60*d2c16535SElliott Hughes 		if (b.out_pos == sizeof(out)) {
61*d2c16535SElliott Hughes 			if (fwrite(out, 1, b.out_pos, stdout) != b.out_pos) {
62*d2c16535SElliott Hughes 				msg = "Write error\n";
63*d2c16535SElliott Hughes 				goto error;
64*d2c16535SElliott Hughes 			}
65*d2c16535SElliott Hughes 
66*d2c16535SElliott Hughes 			uncomp_size -= b.out_pos;
67*d2c16535SElliott Hughes 			b.out_pos = 0;
68*d2c16535SElliott Hughes 			b.out_size = uncomp_size < BUFSIZ
69*d2c16535SElliott Hughes 					? uncomp_size : BUFSIZ;
70*d2c16535SElliott Hughes 		}
71*d2c16535SElliott Hughes 
72*d2c16535SElliott Hughes 		if (ret == XZ_OK)
73*d2c16535SElliott Hughes 			continue;
74*d2c16535SElliott Hughes 
75*d2c16535SElliott Hughes #ifdef XZ_DEC_ANY_CHECK
76*d2c16535SElliott Hughes 		if (ret == XZ_UNSUPPORTED_CHECK) {
77*d2c16535SElliott Hughes 			fputs(argv[0], stderr);
78*d2c16535SElliott Hughes 			fputs(": ", stderr);
79*d2c16535SElliott Hughes 			fputs("Unsupported check; not verifying "
80*d2c16535SElliott Hughes 					"file integrity\n", stderr);
81*d2c16535SElliott Hughes 			continue;
82*d2c16535SElliott Hughes 		}
83*d2c16535SElliott Hughes #endif
84*d2c16535SElliott Hughes 
85*d2c16535SElliott Hughes 		if (uncomp_size != b.out_pos) {
86*d2c16535SElliott Hughes 			msg = "Uncompressed size doesn't match\n";
87*d2c16535SElliott Hughes 			goto error;
88*d2c16535SElliott Hughes 		}
89*d2c16535SElliott Hughes 
90*d2c16535SElliott Hughes 		if (fwrite(out, 1, b.out_pos, stdout) != b.out_pos
91*d2c16535SElliott Hughes 				|| fclose(stdout)) {
92*d2c16535SElliott Hughes 			msg = "Write error\n";
93*d2c16535SElliott Hughes 			goto error;
94*d2c16535SElliott Hughes 		}
95*d2c16535SElliott Hughes 
96*d2c16535SElliott Hughes 		switch (ret) {
97*d2c16535SElliott Hughes 		case XZ_STREAM_END:
98*d2c16535SElliott Hughes 			xz_dec_end(s);
99*d2c16535SElliott Hughes 			return 0;
100*d2c16535SElliott Hughes 
101*d2c16535SElliott Hughes 		case XZ_MEM_ERROR:
102*d2c16535SElliott Hughes 			msg = "Memory allocation failed\n";
103*d2c16535SElliott Hughes 			goto error;
104*d2c16535SElliott Hughes 
105*d2c16535SElliott Hughes 		case XZ_MEMLIMIT_ERROR:
106*d2c16535SElliott Hughes 			msg = "Memory usage limit reached\n";
107*d2c16535SElliott Hughes 			goto error;
108*d2c16535SElliott Hughes 
109*d2c16535SElliott Hughes 		case XZ_FORMAT_ERROR:
110*d2c16535SElliott Hughes 			msg = "Not a .xz file\n";
111*d2c16535SElliott Hughes 			goto error;
112*d2c16535SElliott Hughes 
113*d2c16535SElliott Hughes 		case XZ_OPTIONS_ERROR:
114*d2c16535SElliott Hughes 			msg = "Unsupported options in the .xz headers\n";
115*d2c16535SElliott Hughes 			goto error;
116*d2c16535SElliott Hughes 
117*d2c16535SElliott Hughes 		case XZ_DATA_ERROR:
118*d2c16535SElliott Hughes 		case XZ_BUF_ERROR:
119*d2c16535SElliott Hughes 			msg = "File is corrupt\n";
120*d2c16535SElliott Hughes 			goto error;
121*d2c16535SElliott Hughes 
122*d2c16535SElliott Hughes 		default:
123*d2c16535SElliott Hughes 			msg = "Bug!\n";
124*d2c16535SElliott Hughes 			goto error;
125*d2c16535SElliott Hughes 		}
126*d2c16535SElliott Hughes 	}
127*d2c16535SElliott Hughes 
128*d2c16535SElliott Hughes error:
129*d2c16535SElliott Hughes 	xz_dec_end(s);
130*d2c16535SElliott Hughes 	fputs(argv[0], stderr);
131*d2c16535SElliott Hughes 	fputs(": ", stderr);
132*d2c16535SElliott Hughes 	fputs(msg, stderr);
133*d2c16535SElliott Hughes 	return 1;
134*d2c16535SElliott Hughes }
135