/* * Copyright (c) 2003-2008 Hypertriton, Inc. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE FOR * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL * DAMAGES (INCLUDING BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE * USE OF THIS SOFTWARE EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ /* * Serialization of integers. */ #ifndef _AGAR_CORE_LOAD_INTEGRAL_H_ #define _AGAR_CORE_LOAD_INTEGRAL_H_ #include #include __BEGIN_DECLS #define AG_ReadSint8(ds) ((Sint8)AG_ReadUint8(ds)) #define AG_ReadSint8v(ds,v) AG_ReadUint8v(ds, (Sint8 *)(v)) #define AG_WriteSint8(ds,v) AG_WriteUint8((ds),(Uint8)(v)) #define AG_WriteSint8v(ds,v) AG_WriteUint8v((ds),(Uint8 *)(v)) #define AG_WriteSint8At(ds,v,o) AG_WriteUint8At((ds),(Uint8)(v),(o)) #define AG_ReadSint16(ds) ((Sint16)AG_ReadUint16(ds)) #define AG_ReadSint16v(ds,v) AG_ReadUint16v(ds, (Sint16 *)(v)) #define AG_WriteSint16(ds,v) AG_WriteUint16((ds),(Uint16)(v)) #define AG_WriteSint16v(ds,v) AG_WriteUint16v((ds),(Uint16 *)(v)) #define AG_WriteSint16At(ds,v,o) AG_WriteUint16At((ds),(Uint16)(v),(o)) #define AG_ReadSint32(ds) ((Sint32)AG_ReadUint32(ds)) #define AG_ReadSint32v(ds,v) AG_ReadUint32v(ds, (Sint32 *)(v)) #define AG_WriteSint32(ds,v) AG_WriteUint32((ds),(Uint32)(v)) #define AG_WriteSint32v(ds,v) AG_WriteUint32v((ds),(Uint32 *)(v)) #define AG_WriteSint32At(ds,v,o) AG_WriteUint32At((ds),(Uint32)(v),(o)) #ifdef HAVE_64BIT # define AG_ReadSint64(ds) ((Sint64)AG_ReadUint64(ds)) # define AG_ReadSint64v(ds,v) AG_ReadUint64v(ds, (Sint64 *)(v)) # define AG_WriteSint64(ds,v) AG_WriteUint64((ds),(Uint64)(v)) # define AG_WriteSint64v(ds,v) AG_WriteUint64v((ds),(Uint64 *)(v)) # define AG_WriteSint64At(ds,v,o) AG_WriteUint64At((ds),(Uint64)(v),(o)) #endif /* * 8-bit integers */ static __inline__ Uint8 AG_ReadUint8(AG_DataSource *ds) { Uint8 i; AG_CHECK_TYPE(ds, AG_SOURCE_UINT8, 0); if (AG_Read(ds, &i, sizeof(i), 1) != 0) { AG_DataSourceError(ds, NULL); return (0); } return (i); } static __inline__ int AG_ReadUint8v(AG_DataSource *ds, Uint8 *v) { Uint8 i; if (AG_CheckTypev(ds, AG_SOURCE_UINT8) == -1 || AG_Read(ds, &i, sizeof(i), 1) != 0) { return (-1); } *v = i; return (0); } static __inline__ void AG_WriteUint8(AG_DataSource *ds, Uint8 i) { AG_WriteType(ds, AG_SOURCE_UINT8); if (AG_Write(ds, &i, sizeof(i), 1) != 0) AG_DataSourceError(ds, NULL); } static __inline__ int AG_WriteUint8v(AG_DataSource *ds, const Uint8 *i) { if (AG_WriteTypev(ds, AG_SOURCE_UINT8) == -1) { return (-1); } return AG_Write(ds, i, sizeof(Uint8), 1); } static __inline__ void AG_WriteUint8At(AG_DataSource *ds, Uint8 i, off_t pos) { AG_WriteTypeAt(ds, AG_SOURCE_UINT8, pos); if (AG_WriteAt(ds, &i, sizeof(i), 1, AG_TYPE_OFFSET(ds,pos)) != 0) AG_DataSourceError(ds, NULL); } /* * 16-bit integers */ static __inline__ Uint16 AG_ReadUint16(AG_DataSource *ds) { Uint16 i; AG_CHECK_TYPE(ds, AG_SOURCE_UINT16, 0); if (AG_Read(ds, &i, sizeof(i), 1) != 0) { AG_DataSourceError(ds, NULL); return (0); } return (ds->byte_order == AG_BYTEORDER_BE) ? AG_SwapBE16(i) : AG_SwapLE16(i); } static __inline__ int AG_ReadUint16v(AG_DataSource *ds, Uint16 *v) { Uint16 i; if (AG_CheckTypev(ds, AG_SOURCE_UINT16) == -1 || AG_Read(ds, &i, sizeof(i), 1) != 0) { return (-1); } *v = (ds->byte_order == AG_BYTEORDER_BE) ? AG_SwapBE16(i) : AG_SwapLE16(i); return (0); } static __inline__ void AG_WriteUint16(AG_DataSource *ds, Uint16 u16) { Uint16 i = (ds->byte_order == AG_BYTEORDER_BE) ? AG_SwapBE16(u16) : AG_SwapLE16(u16); AG_WriteType(ds, AG_SOURCE_UINT16); if (AG_Write(ds, &i, sizeof(i), 1) != 0) AG_DataSourceError(ds, NULL); } static __inline__ int AG_WriteUint16v(AG_DataSource *ds, const Uint16 *u16) { Uint16 i = (ds->byte_order == AG_BYTEORDER_BE) ? AG_SwapBE16(*u16) : AG_SwapLE16(*u16); if (AG_WriteTypev(ds, AG_SOURCE_UINT16) == -1) { return (-1); } return AG_Write(ds, &i, sizeof(i), 1); } static __inline__ void AG_WriteUint16At(AG_DataSource *ds, Uint16 u16, off_t pos) { Uint16 i = (ds->byte_order == AG_BYTEORDER_BE) ? AG_SwapBE16(u16) : AG_SwapLE16(u16); AG_WriteTypeAt(ds, AG_SOURCE_UINT16, pos); if (AG_WriteAt(ds, &i, sizeof(i), 1, AG_TYPE_OFFSET(ds,pos)) != 0) AG_DataSourceError(ds, NULL); } /* * 32-bit integers */ static __inline__ Uint32 AG_ReadUint32(AG_DataSource *ds) { Uint32 i; AG_CHECK_TYPE(ds, AG_SOURCE_UINT32, 0); if (AG_Read(ds, &i, sizeof(i), 1) != 0) { AG_DataSourceError(ds, NULL); return (0); } return ((ds->byte_order == AG_BYTEORDER_BE) ? AG_SwapBE32(i) : AG_SwapLE32(i)); } static __inline__ int AG_ReadUint32v(AG_DataSource *ds, Uint32 *v) { Uint32 i; if (AG_CheckTypev(ds, AG_SOURCE_UINT32) == -1 || AG_Read(ds, &i, sizeof(i), 1) != 0) { return (-1); } *v = (ds->byte_order == AG_BYTEORDER_BE) ? AG_SwapBE32(i) : AG_SwapLE32(i); return (0); } static __inline__ void AG_WriteUint32(AG_DataSource *ds, Uint32 u32) { Uint32 i = (ds->byte_order == AG_BYTEORDER_BE) ? AG_SwapBE32(u32) : AG_SwapLE32(u32); AG_WriteType(ds, AG_SOURCE_UINT32); if (AG_Write(ds, &i, sizeof(i), 1) != 0) AG_DataSourceError(ds, NULL); } static __inline__ int AG_WriteUint32v(AG_DataSource *ds, const Uint32 *u32) { Uint32 i = (ds->byte_order == AG_BYTEORDER_BE) ? AG_SwapBE32(*u32) : AG_SwapLE32(*u32); if (AG_WriteTypev(ds, AG_SOURCE_UINT32) == -1) { return (-1); } return AG_Write(ds, &i, sizeof(i), 1); } static __inline__ void AG_WriteUint32At(AG_DataSource *ds, Uint32 u32, off_t pos) { Uint32 i = (ds->byte_order == AG_BYTEORDER_BE) ? AG_SwapBE32(u32) : AG_SwapLE32(u32); AG_WriteTypeAt(ds, AG_SOURCE_UINT32, pos); if (AG_WriteAt(ds, &i, sizeof(i), 1, AG_TYPE_OFFSET(ds,pos)) != 0) AG_DataSourceError(ds, NULL); } #ifdef HAVE_64BIT /* * 64-bit integers */ static __inline__ Uint64 AG_ReadUint64(AG_DataSource *ds) { Uint64 i; AG_CHECK_TYPE(ds, AG_SOURCE_UINT64, 0); if (AG_Read(ds, &i, sizeof(i), 1) != 0) { AG_DataSourceError(ds, NULL); return (0); } return ((ds->byte_order == AG_BYTEORDER_BE) ? AG_SwapBE64(i) : AG_SwapLE64(i)); } static __inline__ int AG_ReadUint64v(AG_DataSource *ds, Uint64 *v) { Uint64 i; if (AG_CheckTypev(ds, AG_SOURCE_UINT64) == -1 || AG_Read(ds, &i, sizeof(i), 1) != 0) { return (-1); } *v = (ds->byte_order == AG_BYTEORDER_BE) ? AG_SwapBE64(i) : AG_SwapLE64(i); return (0); } static __inline__ void AG_WriteUint64(AG_DataSource *ds, Uint64 u64) { Uint64 i = (ds->byte_order == AG_BYTEORDER_BE) ? AG_SwapBE64(u64) : AG_SwapLE64(u64); AG_WriteType(ds, AG_SOURCE_UINT64); if (AG_Write(ds, &i, sizeof(i), 1) != 0) AG_DataSourceError(ds, NULL); } static __inline__ int AG_WriteUint64v(AG_DataSource *ds, const Uint64 *u64) { Uint64 i = (ds->byte_order == AG_BYTEORDER_BE) ? AG_SwapBE64(*u64) : AG_SwapLE64(*u64); if (AG_WriteTypev(ds, AG_SOURCE_UINT64) == -1) { return (-1); } return AG_Write(ds, &i, sizeof(i), 1); } static __inline__ void AG_WriteUint64At(AG_DataSource *ds, Uint64 u64, off_t pos) { Uint64 i = (ds->byte_order == AG_BYTEORDER_BE) ? AG_SwapBE64(u64) : AG_SwapLE64(u64); AG_WriteTypeAt(ds, AG_SOURCE_UINT64, pos); if (AG_WriteAt(ds, &i, sizeof(i), 1, AG_TYPE_OFFSET(ds,pos)) != 0) AG_DataSourceError(ds, NULL); } #endif /* HAVE_64BIT */ __END_DECLS #include #endif /* _AGAR_CORE_LOAD_INTEGRAL_H_ */