📄 endianrw.h
字号:
/** * \file endianrw.h * \author Wei Yongming <ymwei@minigui.org> * \date 2002/01/06 * * This file includes functions for reading and writing data * from general sources, such as file, memory, etc., and also * includes functions for reading and writing endian-specific * values. * \verbatim Copyright (C) 2002-2005 Feynman Software. Copyright (C) 1998-2002 Wei Yongming. This file is part of MiniGUI, a compact cross-platform Graphics User Interface (GUI) support system for real-time embedded systems. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA If you are using MiniGUI for developing commercial, proprietary, or other software not covered by the GPL terms, you must have a commercial license for MiniGUI. Please see http://www.minigui.com/product/index.html for how to obtain this. If you are interested in the commercial MiniGUI licensing, please write to sales@minigui.com. \endverbatim *//* * $Id: endianrw.h,v 1.24 2005/02/15 05:00:07 weiym Exp $ * * MiniGUI for Linux/uClinux, eCos, uC/OS-II, VxWorks, * and ThreadX version 1.6.x * Copyright (C) 2002-2005 Feynman Software. * Copyright (C) 1998-2002 Wei Yongming. * * The idea and most code come from * LGPL'ed SDL by (Sam Lantinga, slouken@devolution.com). * Copyright (C) 1997-2001 Sam Lantinga */#ifndef _MGUI_ENDIAN_RW_H#define _MGUI_ENDIAN_RW_H/* Set up for C function definitions, even when using C++ */#ifdef __cplusplusextern "C" {#endif/************************** General RW operations ****************************/ /** * \addtogroup fns Functions * @{ */ /** * \addtogroup global_fns Global/general functions * @{ */ /** * \defgroup general_rw_fns General read/write operations * * MiniGUI's general read/write operation provides a general interface * to read from and write to various data source, such as files, memory, * and so on. * * @{ */#define RWAREA_TYPE_UNKNOWN 0#define RWAREA_TYPE_STDIO 1#define RWAREA_TYPE_MEM 2/** * The read/write operation structure. */typedef struct MG_RWops { /** * Seek to \a offset relative to whence, one of stdio's whence values:\n * SEEK_SET, SEEK_CUR, SEEK_END\n * Returns the final offset in the data source. */ int (*seek)(struct MG_RWops *context, int offset, int whence); /** * Read up to \a num objects each of size \a objsize from the data * source to the area pointed at by \a ptr. * Returns the number of objects read, or -1 if the read failed. */ int (*read)(struct MG_RWops *context, void *ptr, int objsize, int num); /** * Write exactly \a num objects each of size \a objsize from the area * pointed at by \a ptr to data source. * Returns \a num, or -1 if the write failed. */ int (*write)(struct MG_RWops *context, const void *ptr, int objsize, int num);#ifdef _USE_OWN_STDIO /* */ int (*ungetc)(struct MG_RWops *context, unsigned char c);#endif /* * Close and free an allocated MG_RWops structure. */ int (*close)(struct MG_RWops *context); /** * Test the end-of-file indicator. */ int (*eof)(struct MG_RWops *context); /** * Indicates the type of data source. * can be one of the following values: * - RWAREA_TYPE_UNKNOWN\n * A unknown (uninitialized) data source type. * - RWAREA_TYPE_STDIO\n * Stdio stream data source. * - RWAREA_TYPE_MEM\n * Memory data source. */ Uint32 type; union { struct { int autoclose; FILE *fp; } stdio; struct { Uint8 *base; Uint8 *here; Uint8 *stop; } mem; struct { void *data1; } unknown; } hidden;} MG_RWops;/** * \fn MG_RWops* MGUI_RWFromFile(const char *file, const char *mode) * \brief Creates an MG_RWops object from a file. * * This function uses the mode specified by \a mode and opens the file \a file * by using stdio function \a fopen. If success, this function creates a MG_RWops * object and returns it. * * \param file The file name. * \param mode The mode will be passed to \a fopen. * \return The pointer to created MG_RWops structure, NULL indicates error. * * \sa MG_RWops, MGUI_RWFromFP, MGUI_FreeRW, fopen(3) */MG_RWops* MGUI_RWFromFile(const char *file, const char *mode);/** * \fn MG_RWops* MGUI_RWFromFP(FILE *fp, int autoclose) * \brief Creates an MG_RWops object from an opened stdio FILE object. * * This function uses an opened stdio FILE object \a fp to create a MG_RWops object. * * \param fp The opened stdio FILE object. * \param autoclose Indicates whether to close the FILE object when \a close method is called. * \return The pointer to created MG_RWops structure, NULL indicates error. * * \sa MG_RWops, MGUI_RWFromFile, MGUI_FreeRW */MG_RWops* MGUI_RWFromFP(FILE *fp, int autoclose);/** * \fn MG_RWops* MGUI_RWFromMem(void *mem, int size) * \brief Creates an MG_RWops object from a block of memory. * * This function creates an MG_RWops object from a block of memory pointed to by \a mem, * which is \a size bytes long. * * \param mem The pointer to the memory block. * \param size The size of the memory block. * * \return The pointer to created MG_RWops structure, NULL indicates error. * * \sa MG_RWops, MGUI_FreeRW */MG_RWops* MGUI_RWFromMem(void *mem, int size);/** * \fn void MGUI_InitMemRW (MG_RWops* area, , void *mem, int size) * \brief Initialize an MG_RWops object from a block of memory. * * This function initializes an MG_RWops object pointed to by \a area * from a block of memory pointed to by \a mem, which is \a size bytes long. * * \param area The pointer to the MG_RWops object. * \param mem The pointer to the memory block. * \param size The size of the memory block. * * \return none. * * \sa MG_RWops, MGUI_FreeRW, MGUI_RWFromMem */void MGUI_InitMemRW (MG_RWops* area, void *mem, int size);/** * \fn MG_RWops* MGUI_AllocRW(void) * \brief Allocates an uninitialized MG_RWops object. * * This function allocates an uninitialized MG_RWops object. You can specify the * fields of the structure, and implemente a customized MG_RWops object. * * \return The pointer to allocated MG_RWops structure, NULL indicates error. * * \sa MG_RWops */MG_RWops* MGUI_AllocRW(void);/** * \fn void MGUI_FreeRW(MG_RWops *area) * \brief Frees an MG_RWops object. * * This function frees the MG_RWops object pointed to by \a area. * * \param area The pointer to the MG_RWops object. * * \sa MGUI_RWFromFile, MGUI_RWFromFP, MGUI_RWFromMem */void MGUI_FreeRW(MG_RWops *area);/* Macros to easily read and write from an MG_RWops structure *//** * \def MGUI_RWseek(ctx, offset, whence) * \brief Seeks an MG_RWops object. * * This macro seeks to \a offset relative to \a whence. * * \param ctx The pointer to the MG_RWops object. * \param offset The offset relative to \a whence. * \param whence One of stdio's \a whence values: * * - SEEK_SET\n * the offset is relative to the start of the file. * - SEEK_CUR\n * the offset is relative to the current position indicator. * - SEEK_END\n * the offset is relative to the end of the file. * * \return The final offset in the data source. * \sa MGUI_RWtell */#define MGUI_RWseek(ctx, offset, whence) (ctx)->seek(ctx, offset, whence)/** * \def MGUI_RWtell(ctx) * \brief Obtains the current value of the position indicator for a data source. * * This macro obtains the current value of the position indicator for the data source * pointed to by \a ctx. * * \param ctx The pointer to the MG_RWops object. * \return the current value of the position indicator. * * \sa MGUI_RWseek */#define MGUI_RWtell(ctx) (ctx)->seek(ctx, 0, SEEK_CUR)/** * \def MGUI_RWread(ctx, ptr, size, n) * \brief Reads data blocks from a data source. * * This macro reads up to \a n objects each of size \a size from the data * source \a ctx to the area pointed to by \a ptr. * * \param ctx The pointer to the MG_RWops object. * \param ptr The buffer will save the data read. * \param size The size of each object. * \param n The number of objects to be read. * \return The number of objects read, or -1 if the read failed. * * \sa MGUI_RWwrite */#define MGUI_RWread(ctx, ptr, size, n) (ctx)->read(ctx, ptr, size, n)/** * \def MGUI_RWwrite(ctx, ptr, size, n) * \brief Writes data blocks to a data source. * * This macro writes exactly \a n objects each of size \a size from the area * pointed to by \a ptr to the data source \a ctx. * * \param ctx The pointer to the MG_RWops object. * \param ptr The buffer contains the data to be written. * \param size The size of each object. * \param n The number of objects to be written. * \return The number written, or -1 if the write failed. * * \sa MGUI_RWread */#define MGUI_RWwrite(ctx, ptr, size, n) (ctx)->write(ctx, ptr, size, n)/** * \def MGUI_RWclose(ctx) * \brief Closes an MG_RWops object. * * This macro close the MG_RWops object pointed to by \a ctx. * * \param ctx The pointer to the MG_RWops object. * \return Upon successful completion 0 is returned, otherwise non-zero on error. * * \sa MGUI_RWread */#define MGUI_RWclose(ctx) (ctx)->close(ctx)/** * \def MGUI_RWeof(ctx) * \brief Tests the end-of-file indicator for an data source. * * This macro tests the end-of-file indicator for the data source pointed to by \a ctx. * * \param ctx The pointer to the MG_RWops object. * \return Non-zero if end-of-file indicator is set. * * \sa MGUI_RWtell */#define MGUI_RWeof(ctx) (ctx)->eof(ctx)/** * \fn int MGUI_RWgetc (MG_RWops* area) * \brief Reads the next character from an data source. * * This function reads the next character from the data source pointed to by \a area, * and returns it as an \a unsigned char cast to an \a int, or \a EOF on end of file * or error. * * \param area The pointer to the MG_RWops object. * \return The character read, \a EOF indicates end-of-file or error. * * \sa MGUI_RWread */int MGUI_RWgetc (MG_RWops* area); /** @} end of general_rw_fns *//****************** Endian specific read/write interfaces *********************/ /** * \defgroup endian_rw_fns Endian specific read/write interfaces * * The endian specific read/write functions read and write data * of the specified endianness, dynamically translating to * the host machine endianness. * * e.g.: If you want to read a 16 bit value on big-endian machine from * an opened file containing little endian values, you would use: * * \code * value = MGUI_ReadLE16(rp); * \endcode * * \sa general_rw_fns * * Example: * * \include endianness.c * @{ *//* The macros used to swap values *//* Try to use superfast macros on systems that support them */#ifdef linux#include <endian.h>#ifdef __arch__swab16#define ArchSwap16 __arch__swab16
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -