Denys Vlasenko | 602ce69 | 2010-05-30 03:35:18 +0200 | [diff] [blame] | 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 | #define min(x, y) ((x) < (y) ? (x) : (y)) |
| 36 | #define min_t(type, x, y) min(x, y) |
| 37 | |
| 38 | /* |
| 39 | * Some functions have been marked with __always_inline to keep the |
| 40 | * performance reasonable even when the compiler is optimizing for |
| 41 | * small code size. You may be able to save a few bytes by #defining |
| 42 | * __always_inline to plain inline, but don't complain if the code |
| 43 | * becomes slow. |
| 44 | * |
| 45 | * NOTE: System headers on GNU/Linux may #define this macro already, |
| 46 | * so if you want to change it, it you need to #undef it first. |
| 47 | */ |
| 48 | #ifndef __always_inline |
| 49 | # ifdef __GNUC__ |
| 50 | # define __always_inline \ |
| 51 | inline __attribute__((__always_inline__)) |
| 52 | # else |
| 53 | # define __always_inline inline |
| 54 | # endif |
| 55 | #endif |
| 56 | |
| 57 | /* |
| 58 | * Some functions are marked to never be inlined to reduce stack usage. |
| 59 | * If you don't care about stack usage, you may want to modify this so |
| 60 | * that noinline_for_stack is #defined to be empty even when using GCC. |
| 61 | * Doing so may save a few bytes in binary size. |
| 62 | */ |
| 63 | #ifndef noinline_for_stack |
| 64 | # ifdef __GNUC__ |
| 65 | # define noinline_for_stack __attribute__((__noinline__)) |
| 66 | # else |
| 67 | # define noinline_for_stack |
| 68 | # endif |
| 69 | #endif |
| 70 | |
| 71 | /* Inline functions to access unaligned unsigned 32-bit integers */ |
| 72 | #ifndef get_unaligned_le32 |
| 73 | static inline uint32_t XZ_FUNC get_unaligned_le32(const uint8_t *buf) |
| 74 | { |
| 75 | return (uint32_t)buf[0] |
| 76 | | ((uint32_t)buf[1] << 8) |
| 77 | | ((uint32_t)buf[2] << 16) |
| 78 | | ((uint32_t)buf[3] << 24); |
| 79 | } |
| 80 | #endif |
| 81 | |
| 82 | #ifndef get_unaligned_be32 |
| 83 | static inline uint32_t XZ_FUNC get_unaligned_be32(const uint8_t *buf) |
| 84 | { |
| 85 | return (uint32_t)(buf[0] << 24) |
| 86 | | ((uint32_t)buf[1] << 16) |
| 87 | | ((uint32_t)buf[2] << 8) |
| 88 | | (uint32_t)buf[3]; |
| 89 | } |
| 90 | #endif |
| 91 | |
| 92 | #ifndef put_unaligned_le32 |
| 93 | static inline void XZ_FUNC put_unaligned_le32(uint32_t val, uint8_t *buf) |
| 94 | { |
| 95 | buf[0] = (uint8_t)val; |
| 96 | buf[1] = (uint8_t)(val >> 8); |
| 97 | buf[2] = (uint8_t)(val >> 16); |
| 98 | buf[3] = (uint8_t)(val >> 24); |
| 99 | } |
| 100 | #endif |
| 101 | |
| 102 | #ifndef put_unaligned_be32 |
| 103 | static inline void XZ_FUNC put_unaligned_be32(uint32_t val, uint8_t *buf) |
| 104 | { |
| 105 | buf[0] = (uint8_t)(val >> 24); |
| 106 | buf[1] = (uint8_t)(val >> 16); |
| 107 | buf[2] = (uint8_t)(val >> 8); |
| 108 | buf[3] = (uint8_t)val; |
| 109 | } |
| 110 | #endif |
| 111 | |
| 112 | /* |
| 113 | * Use get_unaligned_le32() also for aligned access for simplicity. On |
| 114 | * little endian systems, #define get_le32(ptr) (*(const uint32_t *)(ptr)) |
| 115 | * could save a few bytes in code size. |
| 116 | */ |
| 117 | #define get_le32 get_unaligned_le32 |
| 118 | |
| 119 | #endif |