1229159Sadrian/*
2229159Sadrian * Private includes and definitions for userspace use of XZ Embedded
3229159Sadrian *
4229159Sadrian * Author: Lasse Collin <lasse.collin@tukaani.org>
5229159Sadrian *
6229159Sadrian * This file has been put into the public domain.
7229159Sadrian * You can do whatever you want with this file.
8229159Sadrian */
9229159Sadrian
10229159Sadrian#ifndef XZ_CONFIG_H
11229159Sadrian#define XZ_CONFIG_H
12229159Sadrian
13262764Sdelphij/* Uncomment to enable CRC64 support. */
14262764Sdelphij/* #define XZ_USE_CRC64 */
15262764Sdelphij
16229159Sadrian/* Uncomment as needed to enable BCJ filter decoders. */
17229159Sadrian/* #define XZ_DEC_X86 */
18229159Sadrian/* #define XZ_DEC_POWERPC */
19229159Sadrian/* #define XZ_DEC_IA64 */
20229159Sadrian/* #define XZ_DEC_ARM */
21229159Sadrian/* #define XZ_DEC_ARMTHUMB */
22229159Sadrian/* #define XZ_DEC_SPARC */
23229159Sadrian
24262764Sdelphij/*
25262764Sdelphij * MSVC doesn't support modern C but XZ Embedded is mostly C89
26262764Sdelphij * so these are enough.
27262764Sdelphij */
28262764Sdelphij#ifdef _MSC_VER
29262764Sdelphijtypedef unsigned char bool;
30262764Sdelphij#	define true 1
31262764Sdelphij#	define false 0
32262764Sdelphij#	define inline __inline
33262764Sdelphij#else
34262764Sdelphij#	include <stdbool.h>
35262764Sdelphij#endif
36262764Sdelphij
37229159Sadrian#include <stdlib.h>
38229159Sadrian#include <string.h>
39229159Sadrian
40229159Sadrian#include "xz.h"
41229159Sadrian
42229159Sadrian#define kmalloc(size, flags) malloc(size)
43229159Sadrian#define kfree(ptr) free(ptr)
44229159Sadrian#define vmalloc(size) malloc(size)
45229159Sadrian#define vfree(ptr) free(ptr)
46229159Sadrian
47229159Sadrian#define memeq(a, b, size) (memcmp(a, b, size) == 0)
48229159Sadrian#define memzero(buf, size) memset(buf, 0, size)
49229159Sadrian
50229159Sadrian#ifndef min
51229159Sadrian#	define min(x, y) ((x) < (y) ? (x) : (y))
52229159Sadrian#endif
53229159Sadrian#define min_t(type, x, y) min(x, y)
54229159Sadrian
55229159Sadrian/*
56229159Sadrian * Some functions have been marked with __always_inline to keep the
57229159Sadrian * performance reasonable even when the compiler is optimizing for
58229159Sadrian * small code size. You may be able to save a few bytes by #defining
59229159Sadrian * __always_inline to plain inline, but don't complain if the code
60229159Sadrian * becomes slow.
61229159Sadrian *
62229159Sadrian * NOTE: System headers on GNU/Linux may #define this macro already,
63229159Sadrian * so if you want to change it, you need to #undef it first.
64229159Sadrian */
65229159Sadrian#ifndef __always_inline
66229159Sadrian#	ifdef __GNUC__
67229159Sadrian#		define __always_inline \
68229159Sadrian			inline __attribute__((__always_inline__))
69229159Sadrian#	else
70229159Sadrian#		define __always_inline inline
71229159Sadrian#	endif
72229159Sadrian#endif
73229159Sadrian
74229159Sadrian/* Inline functions to access unaligned unsigned 32-bit integers */
75229159Sadrian#ifndef get_unaligned_le32
76229159Sadrianstatic inline uint32_t get_unaligned_le32(const uint8_t *buf)
77229159Sadrian{
78229159Sadrian	return (uint32_t)buf[0]
79229159Sadrian			| ((uint32_t)buf[1] << 8)
80229159Sadrian			| ((uint32_t)buf[2] << 16)
81229159Sadrian			| ((uint32_t)buf[3] << 24);
82229159Sadrian}
83229159Sadrian#endif
84229159Sadrian
85229159Sadrian#ifndef get_unaligned_be32
86229159Sadrianstatic inline uint32_t get_unaligned_be32(const uint8_t *buf)
87229159Sadrian{
88229159Sadrian	return (uint32_t)(buf[0] << 24)
89229159Sadrian			| ((uint32_t)buf[1] << 16)
90229159Sadrian			| ((uint32_t)buf[2] << 8)
91229159Sadrian			| (uint32_t)buf[3];
92229159Sadrian}
93229159Sadrian#endif
94229159Sadrian
95229159Sadrian#ifndef put_unaligned_le32
96229159Sadrianstatic inline void put_unaligned_le32(uint32_t val, uint8_t *buf)
97229159Sadrian{
98229159Sadrian	buf[0] = (uint8_t)val;
99229159Sadrian	buf[1] = (uint8_t)(val >> 8);
100229159Sadrian	buf[2] = (uint8_t)(val >> 16);
101229159Sadrian	buf[3] = (uint8_t)(val >> 24);
102229159Sadrian}
103229159Sadrian#endif
104229159Sadrian
105229159Sadrian#ifndef put_unaligned_be32
106229159Sadrianstatic inline void put_unaligned_be32(uint32_t val, uint8_t *buf)
107229159Sadrian{
108229159Sadrian	buf[0] = (uint8_t)(val >> 24);
109229159Sadrian	buf[1] = (uint8_t)(val >> 16);
110229159Sadrian	buf[2] = (uint8_t)(val >> 8);
111229159Sadrian	buf[3] = (uint8_t)val;
112229159Sadrian}
113229159Sadrian#endif
114229159Sadrian
115229159Sadrian/*
116229159Sadrian * Use get_unaligned_le32() also for aligned access for simplicity. On
117229159Sadrian * little endian systems, #define get_le32(ptr) (*(const uint32_t *)(ptr))
118229159Sadrian * could save a few bytes in code size.
119229159Sadrian */
120229159Sadrian#ifndef get_le32
121229159Sadrian#	define get_le32 get_unaligned_le32
122229159Sadrian#endif
123229159Sadrian
124229159Sadrian#endif
125