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