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