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