endianrw.h
上传用户:sdaoma
上传日期:2013-08-07
资源大小:3838k
文件大小:24k
源码类别:

GPS编程

开发平台:

C/C++

  1. /**
  2.  * file endianrw.h
  3.  * author Wei Yongming <ymwei@minigui.org>
  4.  * date 2002/01/06
  5.  * 
  6.  *  This file includes functions for reading and writing data 
  7.  *  from general sources, such as file, memory, etc., and also
  8.  *  includes functions for reading and writing endian-specific 
  9.  *  values.
  10.  *
  11.  verbatim
  12.     Copyright (C) 1998-2002 Wei Yongming.
  13.     Copyright (C) 2002-2004 Feynman Software.
  14.     This file is part of MiniGUI, a compact cross-platform Graphics 
  15.     User Interface (GUI) support system for real-time embedded systems.
  16.     This program is free software; you can redistribute it and/or modify
  17.     it under the terms of the GNU General Public License as published by
  18.     the Free Software Foundation; either version 2 of the License, or
  19.     (at your option) any later version.
  20.     This program is distributed in the hope that it will be useful,
  21.     but WITHOUT ANY WARRANTY; without even the implied warranty of
  22.     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  23.     GNU General Public License for more details.
  24.     You should have received a copy of the GNU General Public License
  25.     along with this program; if not, write to the Free Software
  26.     Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
  27.  endverbatim
  28.  */
  29. /*
  30.  * $Id: endianrw.h,v 1.21 2004/06/26 08:41:44 weiym Exp $
  31.  * 
  32.  *             MiniGUI for Linux/uClinux, eCos, uC/OS-II, VxWorks version 1.6.x
  33.  *             Copyright (C) 1998-2002 Wei Yongming.
  34.  *             Copyright (C) 2002-2004 Feynman Software.
  35.  *
  36.  *             The idea and most code come from
  37.  *             LGPL'ed SDL by (Sam Lantinga, slouken@devolution.com).
  38.  *             Copyright (C) 1997-2001 Sam Lantinga
  39.  */
  40. #ifndef _MGUI_ENDIAN_RW_H
  41. #define _MGUI_ENDIAN_RW_H
  42. /* Set up for C function definitions, even when using C++ */
  43. #ifdef __cplusplus
  44. extern "C" {
  45. #endif
  46. /************************** General RW operations ****************************/
  47.     /**
  48.      * addtogroup fns Functions
  49.      * @{
  50.      */
  51.     /**
  52.      * addtogroup global_fns Global/general functions
  53.      * @{
  54.      */
  55.     /**
  56.      * defgroup general_rw_fns General read/write operations
  57.      *
  58.      * MiniGUI's general read/write operation provides a general interface 
  59.      * to read from and write to various data source, such as files, memory, 
  60.      * and so on.
  61.      *
  62.      * @{
  63.      */
  64. #define RWAREA_TYPE_UNKNOWN 0
  65. #define RWAREA_TYPE_STDIO   1
  66. #define RWAREA_TYPE_MEM     2
  67. /**
  68.  * The read/write operation structure.
  69.  */
  70. typedef struct MG_RWops {
  71.     /**
  72.      * Seek to a offset relative to whence, one of stdio's whence values:n
  73.      *      SEEK_SET, SEEK_CUR, SEEK_ENDn
  74.      * Returns the final offset in the data source.
  75.      */
  76.     int (*seek)(struct MG_RWops *context, int offset, int whence);
  77.     /**
  78.      * Read up to a num objects each of size a objsize from the data
  79.      * source to the area pointed at by a ptr.
  80.      * Returns the number of objects read, or -1 if the read failed.
  81.      */
  82.     int (*read)(struct MG_RWops *context, void *ptr, int objsize, int num);
  83.     /**
  84.      * Write exactly a num objects each of size a objsize from the area
  85.      * pointed at by a ptr to data source.
  86.      * Returns a num, or -1 if the write failed.
  87.      */
  88.     int (*write)(struct MG_RWops *context, const void *ptr, int objsize, int num);
  89. #ifdef _USE_OWN_STDIO
  90.     /* */
  91.     int (*ungetc)(struct MG_RWops *context, unsigned char c);
  92. #endif
  93.     /*
  94.      * Close and free an allocated MG_RWops structure.
  95.      */
  96.     int (*close)(struct MG_RWops *context);
  97.     /**
  98.      * Test the end-of-file indicator.
  99.      */
  100.     int (*eof)(struct MG_RWops *context);
  101.     /**
  102.      * Indicates the type of data source.
  103.      *  can be one of the following values:
  104.      *  - RWAREA_TYPE_UNKNOWNn
  105.      *      A unknown (uninitialized) data source type.
  106.      *  - RWAREA_TYPE_STDIOn
  107.      *      Stdio stream data source.
  108.      *  - RWAREA_TYPE_MEMn
  109.      *      Memory data source.
  110.      */
  111.     Uint32 type;
  112.     union {
  113.         struct {
  114.             int autoclose;
  115.             FILE *fp;
  116.         } stdio;
  117.         struct {
  118.             Uint8 *base;
  119.             Uint8 *here;
  120.             Uint8 *stop;
  121.         } mem;
  122.         struct {
  123.             void *data1;
  124.         } unknown;
  125.     } hidden;
  126. } MG_RWops;
  127. /**
  128.  * fn MG_RWops* MGUI_RWFromFile(const char *file, const char *mode)
  129.  * brief Creates an MG_RWops object from a file.
  130.  *
  131.  * This function uses the mode specified by a mode and opens the file a file
  132.  * by using stdio function a fopen. If success, this function creates a MG_RWops
  133.  * object and returns it.
  134.  *
  135.  * param file The file name.
  136.  * param mode The mode will be passed to a fopen.
  137.  * return The pointer to created MG_RWops structure, NULL indicates error.
  138.  *
  139.  * sa MG_RWops, MGUI_RWFromFP, MGUI_FreeRW, fopen(3)
  140.  */
  141. MG_RWops* MGUI_RWFromFile(const char *file, const char *mode);
  142. /**
  143.  * fn MG_RWops* MGUI_RWFromFP(FILE *fp, int autoclose)
  144.  * brief Creates an MG_RWops object from an opened stdio FILE object.
  145.  *
  146.  * This function uses an opened stdio FILE object a fp to create a MG_RWops object.
  147.  *
  148.  * param fp The opened stdio FILE object.
  149.  * param autoclose Indicates whether to close the FILE object when a close method is called.
  150.  * return The pointer to created MG_RWops structure, NULL indicates error.
  151.  *
  152.  * sa MG_RWops, MGUI_RWFromFile, MGUI_FreeRW
  153.  */
  154. MG_RWops* MGUI_RWFromFP(FILE *fp, int autoclose);
  155. /**
  156.  * fn MG_RWops* MGUI_RWFromMem(void *mem, int size)
  157.  * brief Creates an MG_RWops object from a block of memory.
  158.  *
  159.  * This function creates an MG_RWops object from a block of memory pointed to by a mem,
  160.  * which is a size bytes long.
  161.  *
  162.  * param mem The pointer to the memory block.
  163.  * param size The size of the memory block.
  164.  *
  165.  * return The pointer to created MG_RWops structure, NULL indicates error.
  166.  *
  167.  * sa MG_RWops, MGUI_FreeRW
  168.  */
  169. MG_RWops* MGUI_RWFromMem(void *mem, int size);
  170. /**
  171.  * fn void MGUI_InitMemRW (MG_RWops* area, , void *mem, int size)
  172.  * brief Initialize an MG_RWops object from a block of memory.
  173.  *
  174.  * This function initializes an MG_RWops object pointed to by a area 
  175.  * from a block of memory pointed to by a mem, which is a size bytes long.
  176.  *
  177.  * param area The pointer to the MG_RWops object.
  178.  * param mem The pointer to the memory block.
  179.  * param size The size of the memory block.
  180.  *
  181.  * return none.
  182.  *
  183.  * sa MG_RWops, MGUI_FreeRW, MGUI_RWFromMem
  184.  */
  185. void MGUI_InitMemRW (MG_RWops* area, void *mem, int size);
  186. /**
  187.  * fn MG_RWops* MGUI_AllocRW(void)
  188.  * brief Allocates an uninitialized MG_RWops object.
  189.  *
  190.  * This function allocates an uninitialized MG_RWops object. You can specify the 
  191.  * fields of the structure, and implemente a customized MG_RWops object.
  192.  *
  193.  * return The pointer to allocated MG_RWops structure, NULL indicates error.
  194.  *
  195.  * sa MG_RWops
  196.  */
  197. MG_RWops* MGUI_AllocRW(void);
  198. /**
  199.  * fn void MGUI_FreeRW(MG_RWops *area)
  200.  * brief Frees an MG_RWops object.
  201.  *
  202.  * This function frees the MG_RWops object pointed to by a area.
  203.  *
  204.  * param area The pointer to the MG_RWops object.
  205.  *
  206.  * sa MGUI_RWFromFile, MGUI_RWFromFP, MGUI_RWFromMem
  207.  */
  208. void MGUI_FreeRW(MG_RWops *area);
  209. /* Macros to easily read and write from an MG_RWops structure */
  210. /**
  211.  * def MGUI_RWseek(ctx, offset, whence)
  212.  * brief Seeks an MG_RWops object.
  213.  *
  214.  * This macro seeks to a offset relative to a whence.
  215.  *
  216.  * param ctx The pointer to the MG_RWops object.
  217.  * param offset The offset relative to a whence.
  218.  * param whence One of stdio's a whence values:
  219.  *
  220.  *      - SEEK_SETn
  221.  *        the offset is relative to the start of the file.
  222.  *      - SEEK_CURn
  223.  *        the offset is relative to the current position indicator.
  224.  *      - SEEK_ENDn
  225.  *        the offset is relative to the end of the file.
  226.  *
  227.  * return The final offset in the data source.
  228.  * sa MGUI_RWtell
  229.  */
  230. #define MGUI_RWseek(ctx, offset, whence)    (ctx)->seek(ctx, offset, whence)
  231. /**
  232.  * def MGUI_RWtell(ctx)
  233.  * brief Obtains the current value of the position indicator for a data source.
  234.  *
  235.  * This macro obtains the current value of the position indicator for the data source
  236.  * pointed to by a ctx.
  237.  *
  238.  * param ctx The pointer to the MG_RWops object.
  239.  * return the current value of the position indicator.
  240.  *
  241.  * sa MGUI_RWseek
  242.  */
  243. #define MGUI_RWtell(ctx)                    (ctx)->seek(ctx, 0, SEEK_CUR)
  244. /**
  245.  * def MGUI_RWread(ctx, ptr, size, n)
  246.  * brief Reads data blocks from a data source.
  247.  *
  248.  * This macro reads up to a n objects each of size a size from the data
  249.  * source a ctx to the area pointed to by a ptr.
  250.  *
  251.  * param ctx The pointer to the MG_RWops object.
  252.  * param ptr The buffer will save the data read.
  253.  * param size The size of each object.
  254.  * param n The number of objects to be read.
  255.  * return The number of objects read, or -1 if the read failed.
  256.  *
  257.  * sa MGUI_RWwrite
  258.  */
  259. #define MGUI_RWread(ctx, ptr, size, n)      (ctx)->read(ctx, ptr, size, n)
  260. /**
  261.  * def MGUI_RWwrite(ctx, ptr, size, n)
  262.  * brief Writes data blocks to a data source.
  263.  *
  264.  * This macro writes exactly a n objects each of size a size from the area
  265.  * pointed to by a ptr to the data source a ctx.
  266.  *
  267.  * param ctx The pointer to the MG_RWops object.
  268.  * param ptr The buffer contains the data to be written.
  269.  * param size The size of each object.
  270.  * param n The number of objects to be written.
  271.  * return The number written, or -1 if the write failed.
  272.  *
  273.  * sa MGUI_RWread
  274.  */
  275. #define MGUI_RWwrite(ctx, ptr, size, n)     (ctx)->write(ctx, ptr, size, n)
  276. /**
  277.  * def MGUI_RWclose(ctx)
  278.  * brief Closes an MG_RWops object.
  279.  *
  280.  * This macro close the MG_RWops object pointed to by a ctx.
  281.  *
  282.  * param ctx The pointer to the MG_RWops object.
  283.  * return Upon successful completion 0 is returned, otherwise non-zero on error.
  284.  *
  285.  * sa MGUI_RWread
  286.  */
  287. #define MGUI_RWclose(ctx)                   (ctx)->close(ctx)
  288. /**
  289.  * def MGUI_RWeof(ctx)
  290.  * brief Tests the end-of-file indicator for an data source.
  291.  *
  292.  * This macro tests the end-of-file indicator for the data source pointed to by a ctx.
  293.  *
  294.  * param ctx The pointer to the MG_RWops object.
  295.  * return Non-zero if end-of-file indicator is set.
  296.  *
  297.  * sa MGUI_RWtell
  298.  */
  299. #define MGUI_RWeof(ctx)                     (ctx)->eof(ctx)
  300. /**
  301.  * fn int MGUI_RWgetc (MG_RWops* area)
  302.  * brief Reads the next character from an data source.
  303.  *
  304.  * This function reads the next character from the data source pointed to by a area,
  305.  * and returns it as an a unsigned char cast to an a int, or a EOF on end of file
  306.  * or error.
  307.  *
  308.  * param area The pointer to the MG_RWops object.
  309.  * return The character read, a EOF indicates end-of-file or error.
  310.  *
  311.  * sa MGUI_RWread
  312.  */
  313. int MGUI_RWgetc (MG_RWops* area);
  314.     /** @} end of general_rw_fns */
  315. /****************** Endian specific read/write interfaces *********************/
  316.     /**
  317.      * defgroup endian_rw_fns Endian specific read/write interfaces
  318.      *
  319.      * The endian specific read/write functions read and write data
  320.      * of the specified endianness, dynamically translating to 
  321.      * the host machine endianness.
  322.      *
  323.      * e.g.: If you want to read a 16 bit value on big-endian machine from
  324.      * an opened file containing little endian values, you would use:
  325.      *
  326.      * code
  327.      *  value = MGUI_ReadLE16(rp);
  328.      * endcode
  329.      *
  330.      * sa general_rw_fns
  331.      *
  332.      * Example:
  333.      *
  334.      * include endianness.c
  335.      * @{
  336.      */
  337. /* The macros used to swap values */
  338. /* Try to use superfast macros on systems that support them */
  339. #ifdef linux
  340. #include <endian.h>
  341. #ifdef __arch__swab16
  342. #define ArchSwap16  __arch__swab16
  343. #endif
  344. #ifdef __arch__swab32
  345. #define ArchSwap32  __arch__swab32
  346. #endif
  347. #endif /* linux */
  348. /* Use inline functions for compilers that support them, and static
  349.    functions for those that do not.  Because these functions become
  350.    static for compilers that do not support inline functions, this
  351.    header should only be included in files that actually use them.
  352. */
  353. #ifndef ArchSwap16
  354. static inline Uint16 ArchSwap16(Uint16 D) {
  355.         return((D<<8)|(D>>8));
  356. }
  357. #endif
  358. #ifndef ArchSwap32
  359. static inline Uint32 ArchSwap32(Uint32 D) {
  360.         return((D<<24)|((D<<8)&0x00FF0000)|((D>>8)&0x0000FF00)|(D>>24));
  361. }
  362. #endif
  363. #ifdef MGUI_HAS_64BIT_TYPE
  364. #ifndef ArchSwap64
  365. static inline Uint64 ArchSwap64(Uint64 val) {
  366.         Uint32 hi, lo;
  367.         /* Separate into high and low 32-bit values and swap them */
  368.         lo = (Uint32)(val&0xFFFFFFFF);
  369.         val >>= 32;
  370.         hi = (Uint32)(val&0xFFFFFFFF);
  371.         val = ArchSwap32(lo);
  372.         val <<= 32;
  373.         val |= ArchSwap32(hi);
  374.         return(val);
  375. }
  376. #endif
  377. #else
  378. #ifndef ArchSwap64
  379. /* This is mainly to keep compilers from complaining in MGUI code.
  380.    If there is no real 64-bit datatype, then compilers will complain about
  381.    the fake 64-bit datatype that MGUI provides when it compiles user code.
  382. */
  383. #define ArchSwap64(X)        (X)
  384. #endif
  385. #endif /* MGUI_HAS_64BIT_TYPE */
  386. /* Byteswap item from the specified endianness to the native endianness */
  387. #if MGUI_BYTEORDER == MGUI_LIL_ENDIAN
  388. /** Swaps a 16-bit little endian integer to the native endianness. */
  389. #define ArchSwapLE16(X)        (X)
  390. /** Swaps a 32-bit little endian integer to the native endianness. */
  391. #define ArchSwapLE32(X)        (X)
  392. /** Swaps a 64-bit little endian integer to the native endianness. */
  393. #define ArchSwapLE64(X)        (X)
  394. /** Swaps a 16-bit big endian integer to the native endianness. */
  395. #define ArchSwapBE16(X)        ArchSwap16(X)
  396. /** Swaps a 32-bit big endian integer to the native endianness. */
  397. #define ArchSwapBE32(X)        ArchSwap32(X)
  398. /** Swaps a 64-bit big endian integer to the native endianness. */
  399. #define ArchSwapBE64(X)        ArchSwap64(X)
  400. #else
  401. #define ArchSwapLE16(X)        ArchSwap16(X)
  402. #define ArchSwapLE32(X)        ArchSwap32(X)
  403. #define ArchSwapLE64(X)        ArchSwap64(X)
  404. #define ArchSwapBE16(X)        (X)
  405. #define ArchSwapBE32(X)        (X)
  406. #define ArchSwapBE64(X)        (X)
  407. #endif
  408. /**
  409.  * fn Uint16 MGUI_ReadLE16(MG_RWops *src)
  410.  * brief Reads a 16-bit little endian integer from a MG_RWops object.
  411.  *
  412.  * This function reads a 16-bit little endian integer from the data source
  413.  * pointed to by a src, and return it in native format.
  414.  *
  415.  * param src The pointer to the MG_RWops object.
  416.  * return The integer in native endianness.
  417.  *
  418.  * sa MGUI_WriteLE16
  419.  */
  420. extern Uint16 MGUI_ReadLE16(MG_RWops *src);
  421. /**
  422.  * fn Uint16 MGUI_ReadBE16(MG_RWops *src)
  423.  * brief Reads a 16-bit big endian integer from a MG_RWops object.
  424.  *
  425.  * This function reads a 16-bit big endian integer from the data source
  426.  * pointed to by a src, and return it in native format.
  427.  *
  428.  * param src The pointer to the MG_RWops object.
  429.  * return The integer in native endianness.
  430.  *
  431.  * sa MGUI_WriteBE16
  432.  */
  433. extern Uint16 MGUI_ReadBE16(MG_RWops *src);
  434. /**
  435.  * fn Uint32 MGUI_ReadLE32(MG_RWops *src)
  436.  * brief Reads a 32-bit little endian integer from a MG_RWops object.
  437.  *
  438.  * This function reads a 32-bit little endian integer from the data source
  439.  * pointed to by a src, and return it in native format.
  440.  *
  441.  * param src The pointer to the MG_RWops object.
  442.  * return The integer in native endianness.
  443.  *
  444.  * sa MGUI_WriteLE32
  445.  */
  446. extern Uint32 MGUI_ReadLE32(MG_RWops *src);
  447. /**
  448.  * fn Uint32 MGUI_ReadBE32(MG_RWops *src)
  449.  * brief Reads a 32-bit big endian integer from a MG_RWops object.
  450.  *
  451.  * This function reads a 32-bit big endian integer from the data source
  452.  * pointed to by a src, and return it in native format.
  453.  *
  454.  * param src The pointer to the MG_RWops object.
  455.  * return The integer in native endianness.
  456.  *
  457.  * sa MGUI_WriteBE32
  458.  */
  459. extern Uint32 MGUI_ReadBE32(MG_RWops *src);
  460. /**
  461.  * fn Uint64 MGUI_ReadLE64(MG_RWops *src)
  462.  * brief Reads a 64-bit little endian integer from a MG_RWops object.
  463.  *
  464.  * This function reads a 64-bit little endian integer from the data source
  465.  * pointed to by a src, and return it in native format.
  466.  *
  467.  * param src The pointer to the MG_RWops object.
  468.  * return The integer in native endianness.
  469.  *
  470.  * sa MGUI_WriteLE64
  471.  */
  472. extern Uint64 MGUI_ReadLE64(MG_RWops *src);
  473. /**
  474.  * fn Uint64 MGUI_ReadBE64(MG_RWops *src)
  475.  * brief Reads a 64-bit big endian integer from a MG_RWops object.
  476.  *
  477.  * This function reads a 64-bit big endian integer from the data source
  478.  * pointed to by a src, and return it in native format.
  479.  *
  480.  * param src The pointer to the MG_RWops object.
  481.  * return The integer in native endianness.
  482.  *
  483.  * sa MGUI_WriteBE64
  484.  */
  485. extern Uint64 MGUI_ReadBE64(MG_RWops *src);
  486. /**
  487.  * fn int MGUI_WriteLE16(MG_RWops *src, Uint16 value)
  488.  * brief Writes an 16-bit integer of native format to a MG_RWops object in littlen endianness.
  489.  *
  490.  * This function writes a 16-bit integer of native format to the data source
  491.  * pointed to by a src in littlen endiannes.
  492.  *
  493.  * param src The pointer to the MG_RWops object.
  494.  * param value The 16-bit integer in native endianness.
  495.  * return Returns 1 on success, else indicates an error.
  496.  *
  497.  * sa MGUI_ReadLE16
  498.  */
  499. extern int MGUI_WriteLE16(MG_RWops *dst, Uint16 value);
  500. /**
  501.  * fn int MGUI_WriteBE16(MG_RWops *src, Uint16 value)
  502.  * brief Writes an 16-bit integer of native format to a MG_RWops object in big endianness.
  503.  *
  504.  * This function writes a 16-bit integer of native format to the data source
  505.  * pointed to by a src in big endiannes.
  506.  *
  507.  * param src The pointer to the MG_RWops object.
  508.  * param value The 16-bit integer in native endianness.
  509.  * return Returns 1 on success, else indicates an error.
  510.  *
  511.  * sa MGUI_ReadLE16
  512.  */
  513. extern int MGUI_WriteBE16(MG_RWops *dst, Uint16 value);
  514. /**
  515.  * fn int MGUI_WriteLE32(MG_RWops *src, Uint32 value)
  516.  * brief Writes an 32-bit integer of native format to a MG_RWops object in littlen endianness.
  517.  *
  518.  * This function writes a 32-bit integer of native format to the data source
  519.  * pointed to by a src in littlen endiannes.
  520.  *
  521.  * param src The pointer to the MG_RWops object.
  522.  * param value The 32-bit integer in native endianness.
  523.  * return Returns 1 on success, else indicates an error.
  524.  *
  525.  * sa MGUI_ReadLE32
  526.  */
  527. extern int MGUI_WriteLE32(MG_RWops *dst, Uint32 value);
  528. /**
  529.  * fn int MGUI_WriteBE32(MG_RWops *src, Uint32 value)
  530.  * brief Writes an 32-bit integer of native format to a MG_RWops object in big endianness.
  531.  *
  532.  * This function writes a 32-bit integer of native format to the data source
  533.  * pointed to by a src in big endiannes.
  534.  *
  535.  * param src The pointer to the MG_RWops object.
  536.  * param value The 32-bit integer in native endianness.
  537.  * return Returns 1 on success, else indicates an error.
  538.  *
  539.  * sa MGUI_ReadLE32
  540.  */
  541. extern int MGUI_WriteBE32(MG_RWops *dst, Uint32 value);
  542. /**
  543.  * fn int MGUI_WriteLE64(MG_RWops *src, Uint64 value)
  544.  * brief Writes an 64-bit integer of native format to a MG_RWops object in littlen endianness.
  545.  *
  546.  * This function writes a 64-bit integer of native format to the data source
  547.  * pointed to by a src in littlen endiannes.
  548.  *
  549.  * param src The pointer to the MG_RWops object.
  550.  * param value The 64-bit integer in native endianness.
  551.  * return Returns 1 on success, else indicates an error.
  552.  *
  553.  * sa MGUI_ReadLE64
  554.  */
  555. extern int MGUI_WriteLE64(MG_RWops *dst, Uint64 value);
  556. /**
  557.  * fn int MGUI_WriteBE64(MG_RWops *src, Uint64 value)
  558.  * brief Writes an 64-bit integer of native format to a MG_RWops object in big endianness.
  559.  *
  560.  * This function writes a 64-bit integer of native format to the data source
  561.  * pointed to by a src in big endiannes.
  562.  *
  563.  * param src The pointer to the MG_RWops object.
  564.  * param value The 64-bit integer in native endianness.
  565.  * return Returns 1 on success, else indicates an error.
  566.  *
  567.  * sa MGUI_ReadLE64
  568.  */
  569. extern int MGUI_WriteBE64(MG_RWops *dst, Uint64 value);
  570. /**
  571.  * fn Uint16 MGUI_ReadLE16FP(FILE *src)
  572.  * brief Reads a 16-bit little endian integer from a stdio FILE object.
  573.  *
  574.  * This function reads a 16-bit little endian integer from the stdio FILE object
  575.  * pointed to by a src, and return it in native format.
  576.  *
  577.  * param src The pointer to the stdio FILE object.
  578.  * return The integer in native endianness.
  579.  *
  580.  * sa MGUI_WriteLE16FP, MGUI_ReadLE16
  581.  */
  582. extern Uint16 MGUI_ReadLE16FP(FILE *src);
  583. /**
  584.  * fn Uint32 MGUI_ReadLE32FP(FILE *src)
  585.  * brief Reads a 32-bit little endian integer from a stdio FILE object.
  586.  *
  587.  * This function reads a 32-bit little endian integer from the stdio FILE object
  588.  * pointed to by a src, and return it in native format.
  589.  *
  590.  * param src The pointer to the stdio FILE object.
  591.  * return The integer in native endianness.
  592.  *
  593.  * sa MGUI_WriteLE32FP, MGUI_ReadLE32
  594.  */
  595. extern Uint32 MGUI_ReadLE32FP(FILE *src);
  596. /**
  597.  * fn int MGUI_WriteLE16FP(FILE *dst, Uint16 value)
  598.  * brief Writes an 16-bit integer of native format to a stdio FILE object in littlen endianness.
  599.  *
  600.  * This function writes a 16-bit integer of native format to the stdio FILE object
  601.  * pointed to by a src in littlen endiannes.
  602.  *
  603.  * param dst The pointer to the MG_RWops object.
  604.  * param value The 16-bit integer in native endianness.
  605.  * return Returns 1 on success, else indicates an error.
  606.  *
  607.  * sa MGUI_ReadLE16FP, MGUI_WriteLE16
  608.  */
  609. extern int MGUI_WriteLE16FP(FILE *dst, Uint16 value);
  610. /**
  611.  * fn int MGUI_WriteLE32FP(FILE *dst, Uint32 value)
  612.  * brief Writes an 32-bit integer of native format to a stdio FILE object in littlen endianness.
  613.  *
  614.  * This function writes a 32-bit integer of native format to the stdio FILE object
  615.  * pointed to by a src in littlen endiannes.
  616.  *
  617.  * param dst The pointer to the MG_RWops object.
  618.  * param value The 32-bit integer in native endianness.
  619.  * return Returns 1 on success, else indicates an error.
  620.  *
  621.  * sa MGUI_ReadLE32FP, MGUI_WriteLE32
  622.  */
  623. extern int MGUI_WriteLE32FP(FILE *dst, Uint32 value);
  624. static inline Uint16 MGUI_ReadLE16Mem (const Uint8** data)
  625. {
  626. #if 1
  627.     Uint16 h1, h2;
  628.     h1 = *(*data); (*data)++;
  629.     h2 = *(*data); (*data)++;
  630.     return ((h2<<8)|h1);
  631. #else
  632.     Uint16 u;
  633.     memcpy (&u, *data, sizeof (Uint16));
  634.     u = ArchSwapLE16 (u);
  635.     *data += sizeof (Uint16);
  636.     return u;
  637. #endif
  638. }
  639. static inline Uint32 MGUI_ReadLE32Mem (const Uint8** data)
  640. {
  641. #if 1
  642.     Uint32 q1, q2, q3, q4;
  643.     q1 = *(*data); (*data)++;
  644.     q2 = *(*data); (*data)++;
  645.     q3 = *(*data); (*data)++;
  646.     q4 = *(*data); (*data)++;
  647.     return ((q4<<24)|(q3<<16)|(q2<<8)|(q1));
  648. #else
  649.     Uint32 u;
  650.     memcpy (&u, *data, sizeof (Uint32));
  651.     u = ArchSwapLE32 (u);
  652.     *data += sizeof (Uint32);
  653.     return u;
  654. #endif
  655. }
  656. static inline Uint16 MGUI_ReadBE16Mem (const Uint8** data)
  657. {
  658. #if 1
  659.     Uint16 h1, h2;
  660.     h1 = *(*data); (*data)++;
  661.     h2 = *(*data); (*data)++;
  662.     return ((h1<<8)|h2);
  663. #else
  664.     Uint16 u;
  665.     memcpy (&u, *data, sizeof (Uint16));
  666.     u = ArchSwapBE16 (u);
  667.     *data += sizeof (Uint16);
  668.     return u;
  669. #endif
  670. }
  671. static inline Uint32 MGUI_ReadBE32Mem (const Uint8** data)
  672. {
  673. #if 1
  674.     Uint32 q1, q2, q3, q4;
  675.     q1 = *(*data); (*data)++;
  676.     q2 = *(*data); (*data)++;
  677.     q3 = *(*data); (*data)++;
  678.     q4 = *(*data); (*data)++;
  679.     return ((q1<<24)|(q2<<16)|(q3<<8)|(q4));
  680. #else
  681.     Uint32 u;
  682.     memcpy (&u, *data, sizeof (Uint32));
  683.     u = ArchSwapBE32 (u);
  684.     *data += sizeof (Uint32);
  685.     return u;
  686. #endif
  687. }
  688.     /** @} end of endian_rw_fns */
  689.     /** @} end of global_fns */
  690.     /** @} end of fns */
  691. /* Ends C function definitions when using C++ */
  692. #ifdef __cplusplus
  693. }
  694. #endif
  695. #endif /* _MGUI_ENDIAN_RW_H */