Home | History | Annotate | Download | only in libfat
      1 /* ----------------------------------------------------------------------- *
      2  *
      3  *   Copyright 2001-2008 H. Peter Anvin - All Rights Reserved
      4  *
      5  *   This program is free software; you can redistribute it and/or modify
      6  *   it under the terms of the GNU General Public License as published by
      7  *   the Free Software Foundation, Inc., 675 Mass Ave, Cambridge MA 02139,
      8  *   USA; either version 2 of the License, or (at your option) any later
      9  *   version; incorporated herein by reference.
     10  *
     11  * ----------------------------------------------------------------------- */
     12 
     13 /*
     14  * ulint.h
     15  *
     16  * Basic operations on unaligned, littleendian integers
     17  */
     18 
     19 #ifndef ULINT_H
     20 #define ULINT_H
     21 
     22 #include <inttypes.h>
     23 
     24 /* These are unaligned, littleendian integer types */
     25 
     26 typedef uint8_t le8_t;		/*  8-bit byte */
     27 typedef uint8_t le16_t[2];	/* 16-bit word */
     28 typedef uint8_t le32_t[4];	/* 32-bit dword */
     29 
     30 /* Read/write these quantities */
     31 
     32 static inline unsigned char read8(le8_t * _p)
     33 {
     34     return *_p;
     35 }
     36 
     37 static inline void write8(le8_t * _p, uint8_t _v)
     38 {
     39     *_p = _v;
     40 }
     41 
     42 #if defined(__i386__) || defined(__x86_64__)
     43 
     44 /* Littleendian architectures which support unaligned memory accesses */
     45 
     46 static inline unsigned short read16(le16_t * _p)
     47 {
     48     return *((const uint16_t *)_p);
     49 }
     50 
     51 static inline void write16(le16_t * _p, unsigned short _v)
     52 {
     53     *((uint16_t *) _p) = _v;
     54 }
     55 
     56 static inline unsigned int read32(le32_t * _p)
     57 {
     58     return *((const uint32_t *)_p);
     59 }
     60 
     61 static inline void write32(le32_t * _p, uint32_t _v)
     62 {
     63     *((uint32_t *) _p) = _v;
     64 }
     65 
     66 #else
     67 
     68 /* Generic, mostly portable versions */
     69 
     70 static inline unsigned short read16(le16_t * _pp)
     71 {
     72     uint8_t *_p = *_pp;
     73     uint16_t _v;
     74 
     75     _v = _p[0];
     76     _v |= _p[1] << 8;
     77     return _v;
     78 }
     79 
     80 static inline void write16(le16_t * _pp, uint16_t _v)
     81 {
     82     uint8_t *_p = *_pp;
     83 
     84     _p[0] = _v & 0xFF;
     85     _p[1] = (_v >> 8) & 0xFF;
     86 }
     87 
     88 static inline unsigned int read32(le32_t * _pp)
     89 {
     90     uint8_t *_p = *_pp;
     91     uint32_t _v;
     92 
     93     _v = _p[0];
     94     _v |= _p[1] << 8;
     95     _v |= _p[2] << 16;
     96     _v |= _p[3] << 24;
     97     return _v;
     98 }
     99 
    100 static inline void write32(le32_t * _pp, uint32_t _v)
    101 {
    102     uint8_t *_p = *_pp;
    103 
    104     _p[0] = _v & 0xFF;
    105     _p[1] = (_v >> 8) & 0xFF;
    106     _p[2] = (_v >> 16) & 0xFF;
    107     _p[3] = (_v >> 24) & 0xFF;
    108 }
    109 
    110 #endif
    111 
    112 #endif /* ULINT_H */
    113