You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
124 lines
2.9 KiB
124 lines
2.9 KiB
/* |
|
* Private includes and definitions for userspace use of XZ Embedded |
|
* |
|
* Author: Lasse Collin <lasse.collin@tukaani.org> |
|
* |
|
* This file has been put into the public domain. |
|
* You can do whatever you want with this file. |
|
*/ |
|
|
|
#ifndef XZ_CONFIG_H |
|
#define XZ_CONFIG_H |
|
|
|
/* Uncomment to enable CRC64 support. */ |
|
/* #define XZ_USE_CRC64 */ |
|
|
|
/* Uncomment as needed to enable BCJ filter decoders. */ |
|
/* #define XZ_DEC_X86 */ |
|
/* #define XZ_DEC_POWERPC */ |
|
/* #define XZ_DEC_IA64 */ |
|
/* #define XZ_DEC_ARM */ |
|
/* #define XZ_DEC_ARMTHUMB */ |
|
/* #define XZ_DEC_SPARC */ |
|
|
|
/* |
|
* MSVC doesn't support modern C but XZ Embedded is mostly C89 |
|
* so these are enough. |
|
*/ |
|
#ifdef _MSC_VER |
|
typedef unsigned char bool; |
|
# define true 1 |
|
# define false 0 |
|
# define inline __inline |
|
#else |
|
# include <stdbool.h> |
|
#endif |
|
|
|
#include <stdlib.h> |
|
#include <string.h> |
|
|
|
#include "xz.h" |
|
|
|
#define kmalloc(size, flags) malloc(size) |
|
#define kfree(ptr) free(ptr) |
|
#define vmalloc(size) malloc(size) |
|
#define vfree(ptr) free(ptr) |
|
|
|
#define memeq(a, b, size) (memcmp(a, b, size) == 0) |
|
#define memzero(buf, size) memset(buf, 0, size) |
|
|
|
#ifndef min |
|
# define min(x, y) ((x) < (y) ? (x) : (y)) |
|
#endif |
|
#define min_t(type, x, y) min(x, y) |
|
|
|
/* |
|
* Some functions have been marked with __always_inline to keep the |
|
* performance reasonable even when the compiler is optimizing for |
|
* small code size. You may be able to save a few bytes by #defining |
|
* __always_inline to plain inline, but don't complain if the code |
|
* becomes slow. |
|
* |
|
* NOTE: System headers on GNU/Linux may #define this macro already, |
|
* so if you want to change it, you need to #undef it first. |
|
*/ |
|
#ifndef __always_inline |
|
# ifdef __GNUC__ |
|
# define __always_inline \ |
|
inline __attribute__((__always_inline__)) |
|
# else |
|
# define __always_inline inline |
|
# endif |
|
#endif |
|
|
|
/* Inline functions to access unaligned unsigned 32-bit integers */ |
|
#ifndef get_unaligned_le32 |
|
static inline uint32_t get_unaligned_le32(const uint8_t *buf) |
|
{ |
|
return (uint32_t)buf[0] |
|
| ((uint32_t)buf[1] << 8) |
|
| ((uint32_t)buf[2] << 16) |
|
| ((uint32_t)buf[3] << 24); |
|
} |
|
#endif |
|
|
|
#ifndef get_unaligned_be32 |
|
static inline uint32_t get_unaligned_be32(const uint8_t *buf) |
|
{ |
|
return (uint32_t)(buf[0] << 24) |
|
| ((uint32_t)buf[1] << 16) |
|
| ((uint32_t)buf[2] << 8) |
|
| (uint32_t)buf[3]; |
|
} |
|
#endif |
|
|
|
#ifndef put_unaligned_le32 |
|
static inline void put_unaligned_le32(uint32_t val, uint8_t *buf) |
|
{ |
|
buf[0] = (uint8_t)val; |
|
buf[1] = (uint8_t)(val >> 8); |
|
buf[2] = (uint8_t)(val >> 16); |
|
buf[3] = (uint8_t)(val >> 24); |
|
} |
|
#endif |
|
|
|
#ifndef put_unaligned_be32 |
|
static inline void put_unaligned_be32(uint32_t val, uint8_t *buf) |
|
{ |
|
buf[0] = (uint8_t)(val >> 24); |
|
buf[1] = (uint8_t)(val >> 16); |
|
buf[2] = (uint8_t)(val >> 8); |
|
buf[3] = (uint8_t)val; |
|
} |
|
#endif |
|
|
|
/* |
|
* Use get_unaligned_le32() also for aligned access for simplicity. On |
|
* little endian systems, #define get_le32(ptr) (*(const uint32_t *)(ptr)) |
|
* could save a few bytes in code size. |
|
*/ |
|
#ifndef get_le32 |
|
# define get_le32 get_unaligned_le32 |
|
#endif |
|
|
|
#endif
|
|
|