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 13229159Sadrian/* Uncomment as needed to enable BCJ filter decoders. */ 14229159Sadrian/* #define XZ_DEC_X86 */ 15229159Sadrian/* #define XZ_DEC_POWERPC */ 16229159Sadrian/* #define XZ_DEC_IA64 */ 17229159Sadrian/* #define XZ_DEC_ARM */ 18229159Sadrian/* #define XZ_DEC_ARMTHUMB */ 19229159Sadrian/* #define XZ_DEC_SPARC */ 20229159Sadrian 21229159Sadrian#include <stdbool.h> 22229159Sadrian#include <stdlib.h> 23229159Sadrian#include <string.h> 24229159Sadrian 25229159Sadrian#include "xz.h" 26229159Sadrian 27229159Sadrian#define kmalloc(size, flags) malloc(size) 28229159Sadrian#define kfree(ptr) free(ptr) 29229159Sadrian#define vmalloc(size) malloc(size) 30229159Sadrian#define vfree(ptr) free(ptr) 31229159Sadrian 32229159Sadrian#define memeq(a, b, size) (memcmp(a, b, size) == 0) 33229159Sadrian#define memzero(buf, size) memset(buf, 0, size) 34229159Sadrian 35229159Sadrian#ifndef min 36229159Sadrian# define min(x, y) ((x) < (y) ? (x) : (y)) 37229159Sadrian#endif 38229159Sadrian#define min_t(type, x, y) min(x, y) 39229159Sadrian 40229159Sadrian/* 41229159Sadrian * Some functions have been marked with __always_inline to keep the 42229159Sadrian * performance reasonable even when the compiler is optimizing for 43229159Sadrian * small code size. You may be able to save a few bytes by #defining 44229159Sadrian * __always_inline to plain inline, but don't complain if the code 45229159Sadrian * becomes slow. 46229159Sadrian * 47229159Sadrian * NOTE: System headers on GNU/Linux may #define this macro already, 48229159Sadrian * so if you want to change it, you need to #undef it first. 49229159Sadrian */ 50229159Sadrian#ifndef __always_inline 51229159Sadrian# ifdef __GNUC__ 52229159Sadrian# define __always_inline \ 53229159Sadrian inline __attribute__((__always_inline__)) 54229159Sadrian# else 55229159Sadrian# define __always_inline inline 56229159Sadrian# endif 57229159Sadrian#endif 58229159Sadrian 59229159Sadrian/* Inline functions to access unaligned unsigned 32-bit integers */ 60229159Sadrian#ifndef get_unaligned_le32 61229159Sadrianstatic inline uint32_t get_unaligned_le32(const uint8_t *buf) 62229159Sadrian{ 63229159Sadrian return (uint32_t)buf[0] 64229159Sadrian | ((uint32_t)buf[1] << 8) 65229159Sadrian | ((uint32_t)buf[2] << 16) 66229159Sadrian | ((uint32_t)buf[3] << 24); 67229159Sadrian} 68229159Sadrian#endif 69229159Sadrian 70229159Sadrian#ifndef get_unaligned_be32 71229159Sadrianstatic inline uint32_t get_unaligned_be32(const uint8_t *buf) 72229159Sadrian{ 73229159Sadrian return (uint32_t)(buf[0] << 24) 74229159Sadrian | ((uint32_t)buf[1] << 16) 75229159Sadrian | ((uint32_t)buf[2] << 8) 76229159Sadrian | (uint32_t)buf[3]; 77229159Sadrian} 78229159Sadrian#endif 79229159Sadrian 80229159Sadrian#ifndef put_unaligned_le32 81229159Sadrianstatic inline void put_unaligned_le32(uint32_t val, uint8_t *buf) 82229159Sadrian{ 83229159Sadrian buf[0] = (uint8_t)val; 84229159Sadrian buf[1] = (uint8_t)(val >> 8); 85229159Sadrian buf[2] = (uint8_t)(val >> 16); 86229159Sadrian buf[3] = (uint8_t)(val >> 24); 87229159Sadrian} 88229159Sadrian#endif 89229159Sadrian 90229159Sadrian#ifndef put_unaligned_be32 91229159Sadrianstatic inline void put_unaligned_be32(uint32_t val, uint8_t *buf) 92229159Sadrian{ 93229159Sadrian buf[0] = (uint8_t)(val >> 24); 94229159Sadrian buf[1] = (uint8_t)(val >> 16); 95229159Sadrian buf[2] = (uint8_t)(val >> 8); 96229159Sadrian buf[3] = (uint8_t)val; 97229159Sadrian} 98229159Sadrian#endif 99229159Sadrian 100229159Sadrian/* 101229159Sadrian * Use get_unaligned_le32() also for aligned access for simplicity. On 102229159Sadrian * little endian systems, #define get_le32(ptr) (*(const uint32_t *)(ptr)) 103229159Sadrian * could save a few bytes in code size. 104229159Sadrian */ 105229159Sadrian#ifndef get_le32 106229159Sadrian# define get_le32 get_unaligned_le32 107229159Sadrian#endif 108229159Sadrian 109229159Sadrian#endif 110