1 /*
2  * Private includes and definitions for userspace use of XZ Embedded
3  *
4  * Author: Lasse Collin <lasse.collin@tukaani.org>
5  *
6  * This file has been put into the public domain.
7  * You can do whatever you want with this file.
8  */
9 
10 #ifndef XZ_CONFIG_H
11 #define XZ_CONFIG_H
12 
13 /* Uncomment to enable building of xz_dec_catrun(). */
14 /* #define XZ_DEC_CONCATENATED */
15 
16 /* Uncomment to enable CRC64 support. */
17 /* #define XZ_USE_CRC64 */
18 
19 /* Uncomment as needed to enable BCJ filter decoders. */
20 /* #define XZ_DEC_X86 */
21 /* #define XZ_DEC_POWERPC */
22 /* #define XZ_DEC_IA64 */
23 /* #define XZ_DEC_ARM */
24 /* #define XZ_DEC_ARMTHUMB */
25 /* #define XZ_DEC_SPARC */
26 
27 /*
28  * MSVC doesn't support modern C but XZ Embedded is mostly C89
29  * so these are enough.
30  */
31 #ifdef _MSC_VER
32 typedef unsigned char bool;
33 #	define true 1
34 #	define false 0
35 #	define inline __inline
36 #else
37 #	include <stdbool.h>
38 #endif
39 
40 #include <stdlib.h>
41 #include <string.h>
42 
43 #include "xz.h"
44 
45 #define kmalloc(size, flags) malloc(size)
46 #define kfree(ptr) free(ptr)
47 #define vmalloc(size) malloc(size)
48 #define vfree(ptr) free(ptr)
49 
50 #define memeq(a, b, size) (memcmp(a, b, size) == 0)
51 #define memzero(buf, size) memset(buf, 0, size)
52 
53 #ifndef min
54 #	define min(x, y) ((x) < (y) ? (x) : (y))
55 #endif
56 #define min_t(type, x, y) min(x, y)
57 
58 /*
59  * Some functions have been marked with __always_inline to keep the
60  * performance reasonable even when the compiler is optimizing for
61  * small code size. You may be able to save a few bytes by #defining
62  * __always_inline to plain inline, but don't complain if the code
63  * becomes slow.
64  *
65  * NOTE: System headers on GNU/Linux may #define this macro already,
66  * so if you want to change it, you need to #undef it first.
67  */
68 #ifndef __always_inline
69 #	ifdef __GNUC__
70 #		define __always_inline \
71 			inline __attribute__((__always_inline__))
72 #	else
73 #		define __always_inline inline
74 #	endif
75 #endif
76 
77 /* Inline functions to access unaligned unsigned 32-bit integers */
78 #ifndef get_unaligned_le32
79 static inline uint32_t get_unaligned_le32(const uint8_t *buf)
80 {
81 	return (uint32_t)buf[0]
82 			| ((uint32_t)buf[1] << 8)
83 			| ((uint32_t)buf[2] << 16)
84 			| ((uint32_t)buf[3] << 24);
85 }
86 #endif
87 
88 #ifndef get_unaligned_be32
89 static inline uint32_t get_unaligned_be32(const uint8_t *buf)
90 {
91 	return (uint32_t)(buf[0] << 24)
92 			| ((uint32_t)buf[1] << 16)
93 			| ((uint32_t)buf[2] << 8)
94 			| (uint32_t)buf[3];
95 }
96 #endif
97 
98 #ifndef put_unaligned_le32
99 static inline void put_unaligned_le32(uint32_t val, uint8_t *buf)
100 {
101 	buf[0] = (uint8_t)val;
102 	buf[1] = (uint8_t)(val >> 8);
103 	buf[2] = (uint8_t)(val >> 16);
104 	buf[3] = (uint8_t)(val >> 24);
105 }
106 #endif
107 
108 #ifndef put_unaligned_be32
109 static inline void put_unaligned_be32(uint32_t val, uint8_t *buf)
110 {
111 	buf[0] = (uint8_t)(val >> 24);
112 	buf[1] = (uint8_t)(val >> 16);
113 	buf[2] = (uint8_t)(val >> 8);
114 	buf[3] = (uint8_t)val;
115 }
116 #endif
117 
118 /*
119  * Use get_unaligned_le32() also for aligned access for simplicity. On
120  * little endian systems, #define get_le32(ptr) (*(const uint32_t *)(ptr))
121  * could save a few bytes in code size.
122  */
123 #ifndef get_le32
124 #	define get_le32 get_unaligned_le32
125 #endif
126 
127 #endif
128