282 lines
		
	
	
		
			10 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
			
		
		
	
	
			282 lines
		
	
	
		
			10 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
| 
 | |
| /*
 | |
|  * $Id$
 | |
|  *
 | |
|     Copyright (c) 2014-2015 Chung, Hyung-Hwan. 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 AUTHOR "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 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.
 | |
|  */
 | |
| 
 | |
| #ifndef _STIX_CMN_H_
 | |
| #define _STIX_CMN_H_
 | |
| 
 | |
| /* WARNING: NEVER CHANGE/DELETE THE FOLLOWING STIX_HAVE_CFG_H DEFINITION. 
 | |
|  *          IT IS USED FOR DEPLOYMENT BY MAKEFILE.AM */
 | |
| /*#define STIX_HAVE_CFG_H*/
 | |
| 
 | |
| #if defined(STIX_HAVE_CFG_H)
 | |
| #	include "stix-cfg.h"
 | |
| #endif
 | |
| 
 | |
| /* =========================================================================
 | |
|  * PRIMITIVE TYPE DEFINTIONS
 | |
|  * ========================================================================= */
 | |
| /* TODO: define these types and macros using autoconf */
 | |
| typedef unsigned char      stix_uint8_t;
 | |
| typedef signed char        stix_int8_t;
 | |
| 
 | |
| typedef unsigned short int stix_uint16_t;
 | |
| typedef signed short int stix_int16_t;
 | |
| 
 | |
| #if defined(__MSDOS__)
 | |
| 	typedef unsigned long int stix_uint32_t;
 | |
| 	typedef signed long int stix_int32_t;
 | |
| #else
 | |
| 	typedef unsigned int stix_uint32_t;
 | |
| 	typedef signed int stix_int32_t;
 | |
| #endif
 | |
| 
 | |
| #if defined(_WIN64)
 | |
| 	typedef unsigned __int64  stix_uintptr_t;
 | |
| 	typedef signed __int64    stix_intptr_t;
 | |
| 	typedef unsigned __int64  stix_size_t;
 | |
| 	typedef signed __int64    stix_ssize_t;
 | |
| #else
 | |
| 	typedef unsigned long int stix_uintptr_t;
 | |
| 	typedef signed long int   stix_intptr_t;
 | |
| 	typedef unsigned long int stix_size_t;
 | |
| 	typedef signed long int   stix_ssize_t;
 | |
| #endif
 | |
| 
 | |
| typedef stix_uint8_t  stix_byte_t;
 | |
| typedef stix_uint16_t stix_uch_t; /* TODO ... wchar_t??? */
 | |
| typedef stix_int32_t  stix_uci_t;
 | |
| typedef char          stix_bch_t;
 | |
| 
 | |
| struct stix_ucs_t
 | |
| {
 | |
| 	stix_uch_t* ptr;
 | |
| 	stix_size_t len;
 | |
| };
 | |
| typedef struct stix_ucs_t stix_ucs_t;
 | |
| 
 | |
| 
 | |
| 
 | |
| /* =========================================================================
 | |
|  * PRIMITIVE MACROS
 | |
|  * ========================================================================= */
 | |
| #define STIX_UCI_EOF ((stix_uci_t)-1)
 | |
| #define STIX_UCI_NL  ((stix_uci_t)'\n')
 | |
| 
 | |
| #define STIX_SIZEOF(x) (sizeof(x))
 | |
| #define STIX_COUNTOF(x) (sizeof(x) / sizeof(x[0]))
 | |
| 
 | |
| /**
 | |
|  * The STIX_OFFSETOF() macro returns the offset of a field from the beginning
 | |
|  * of a structure.
 | |
|  */
 | |
| #define STIX_OFFSETOF(type,member) ((stix_uintptr_t)&((type*)0)->member)
 | |
| 
 | |
| /**
 | |
|  * The STIX_ALIGNOF() macro returns the alignment size of a structure.
 | |
|  * Note that this macro may not work reliably depending on the type given.
 | |
|  */
 | |
| #define STIX_ALIGNOF(type) STIX_OFFSETOF(struct { stix_uint8_t d1; type d2; }, d2)
 | |
|         /*(sizeof(struct { stix_uint8_t d1; type d2; }) - sizeof(type))*/
 | |
| 
 | |
| #if defined(__cplusplus)
 | |
| #	if (__cplusplus >= 201103L) /* C++11 */
 | |
| #		define STIX_NULL nullptr
 | |
| #	else
 | |
| #		define STIX_NULL (0)
 | |
| #	endif
 | |
| #else
 | |
| #	define STIX_NULL ((void*)0)
 | |
| #endif
 | |
| 
 | |
| /* make a low bit mask that can mask off low n bits*/
 | |
| #define STIX_LBMASK(type,n) (~(~((type)0) << (n))) 
 | |
| 
 | |
| /* get 'length' bits starting from the bit at the 'offset' */
 | |
| #define STIX_GETBITS(type,value,offset,length) \
 | |
| 	((((type)(value)) >> (offset)) & STIX_LBMASK(type,length))
 | |
| 
 | |
| #define STIX_SETBITS(type,value,offset,length,bits) \
 | |
| 	(value = (((type)(value)) | (((bits) & STIX_LBMASK(type,length)) << (offset))))
 | |
| 
 | |
| 
 | |
| /** 
 | |
|  * The STIX_BITS_MAX() macros calculates the maximum value that the 'nbits'
 | |
|  * bits of an unsigned integer of the given 'type' can hold.
 | |
|  * \code
 | |
|  * printf ("%u", STIX_BITS_MAX(unsigned int, 5));
 | |
|  * \endcode
 | |
|  */
 | |
| /*#define STIX_BITS_MAX(type,nbits) ((((type)1) << (nbits)) - 1)*/
 | |
| #define STIX_BITS_MAX(type,nbits) ((~(type)0) >> (STIX_SIZEOF(type) * 8 - (nbits)))
 | |
| 
 | |
| /* =========================================================================
 | |
|  * POINTER MANIPULATION MACROS
 | |
|  * ========================================================================= */
 | |
| 
 | |
| #if defined(__MSDOS__)
 | |
| #	define STIX_INCPTR(type,base,inc)  (((type __huge*)base) + (inc))
 | |
| #	define STIX_DECPTR(type,base,inc)  (((type __huge*)base) - (inc))
 | |
| #	define STIX_GTPTR(type,ptr1,ptr2)  (((type __huge*)ptr1) > ((type __huge*)ptr2))
 | |
| #	define STIX_GEPTR(type,ptr1,ptr2)  (((type __huge*)ptr1) >= ((type __huge*)ptr2))
 | |
| #	define STIX_LTPTR(type,ptr1,ptr2)  (((type __huge*)ptr1) < ((type __huge*)ptr2))
 | |
| #	define STIX_LEPTR(type,ptr1,ptr2)  (((type __huge*)ptr1) <= ((type __huge*)ptr2))
 | |
| #	define STIX_EQPTR(type,ptr1,ptr2)  (((type __huge*)ptr1) == ((type __huge*)ptr2))
 | |
| #	define STIX_SUBPTR(type,ptr1,ptr2) (((type __huge*)ptr1) - ((type __huge*)ptr2))
 | |
| #else
 | |
| #	define STIX_INCPTR(type,base,inc)  (((type*)base) + (inc))
 | |
| #	define STIX_DECPTR(type,base,inc)  (((type*)base) - (inc))
 | |
| #	define STIX_GTPTR(type,ptr1,ptr2)  (((type*)ptr1) > ((type*)ptr2))
 | |
| #	define STIX_GEPTR(type,ptr1,ptr2)  (((type*)ptr1) >= ((type*)ptr2))
 | |
| #	define STIX_LTPTR(type,ptr1,ptr2)  (((type*)ptr1) < ((type*)ptr2))
 | |
| #	define STIX_LEPTR(type,ptr1,ptr2)  (((type*)ptr1) <= ((type*)ptr2))
 | |
| #	define STIX_EQPTR(type,ptr1,ptr2)  (((type*)ptr1) == ((type*)ptr2))
 | |
| #	define STIX_SUBPTR(type,ptr1,ptr2) (((type*)ptr1) - ((type*)ptr2))
 | |
| #endif
 | |
| 
 | |
| /* =========================================================================
 | |
|  * MMGR
 | |
|  * ========================================================================= */
 | |
| typedef struct stix_mmgr_t stix_mmgr_t;
 | |
| 
 | |
| /** 
 | |
|  * allocate a memory chunk of the size \a n.
 | |
|  * \return pointer to a memory chunk on success, #STIX_NULL on failure.
 | |
|  */
 | |
| typedef void* (*stix_mmgr_alloc_t)   (stix_mmgr_t* mmgr, stix_size_t n);
 | |
| /** 
 | |
|  * resize a memory chunk pointed to by \a ptr to the size \a n.
 | |
|  * \return pointer to a memory chunk on success, #STIX_NULL on failure.
 | |
|  */
 | |
| typedef void* (*stix_mmgr_realloc_t) (stix_mmgr_t* mmgr, void* ptr, stix_size_t n);
 | |
| /**
 | |
|  * free a memory chunk pointed to by \a ptr.
 | |
|  */
 | |
| typedef void  (*stix_mmgr_free_t)    (stix_mmgr_t* mmgr, void* ptr);
 | |
| 
 | |
| /**
 | |
|  * The stix_mmgr_t type defines the memory management interface.
 | |
|  * As the type is merely a structure, it is just used as a single container
 | |
|  * for memory management functions with a pointer to user-defined data. 
 | |
|  * The user-defined data pointer \a ctx is passed to each memory management 
 | |
|  * function whenever it is called. You can allocate, reallocate, and free 
 | |
|  * a memory chunk.
 | |
|  *
 | |
|  * For example, a stix_xxx_open() function accepts a pointer of the stix_mmgr_t
 | |
|  * type and the xxx object uses it to manage dynamic data within the object. 
 | |
|  */
 | |
| struct stix_mmgr_t
 | |
| {
 | |
| 	stix_mmgr_alloc_t   alloc;   /**< allocation function */
 | |
| 	stix_mmgr_realloc_t realloc; /**< resizing function */
 | |
| 	stix_mmgr_free_t    free;    /**< disposal function */
 | |
| 	void*               ctx;     /**< user-defined data pointer */
 | |
| };
 | |
| 
 | |
| /**
 | |
|  * The STIX_MMGR_ALLOC() macro allocates a memory block of the \a size bytes
 | |
|  * using the \a mmgr memory manager.
 | |
|  */
 | |
| #define STIX_MMGR_ALLOC(mmgr,size) ((mmgr)->alloc(mmgr,size))
 | |
| 
 | |
| /**
 | |
|  * The STIX_MMGR_REALLOC() macro resizes a memory block pointed to by \a ptr 
 | |
|  * to the \a size bytes using the \a mmgr memory manager.
 | |
|  */
 | |
| #define STIX_MMGR_REALLOC(mmgr,ptr,size) ((mmgr)->realloc(mmgr,ptr,size))
 | |
| 
 | |
| /** 
 | |
|  * The STIX_MMGR_FREE() macro deallocates the memory block pointed to by \a ptr.
 | |
|  */
 | |
| #define STIX_MMGR_FREE(mmgr,ptr) ((mmgr)->free(mmgr,ptr))
 | |
| 
 | |
| 
 | |
| /* =========================================================================
 | |
|  * CMGR
 | |
|  * =========================================================================*/
 | |
| 
 | |
| typedef struct stix_cmgr_t stix_cmgr_t;
 | |
| 
 | |
| typedef stix_size_t (*stix_cmgr_bctouc_t) (
 | |
| 	const stix_bch_t*   mb, 
 | |
| 	stix_size_t         size,
 | |
| 	stix_uch_t*         wc
 | |
| );
 | |
| 
 | |
| typedef stix_size_t (*stix_cmgr_uctobc_t) (
 | |
| 	stix_uch_t    wc,
 | |
| 	stix_bch_t*   mb,
 | |
| 	stix_size_t   size
 | |
| );
 | |
| 
 | |
| /**
 | |
|  * The stix_cmgr_t type defines the character-level interface to 
 | |
|  * multibyte/wide-character conversion. This interface doesn't 
 | |
|  * provide any facility to store conversion state in a context
 | |
|  * independent manner. This leads to the limitation that it can
 | |
|  * handle a stateless multibyte encoding only.
 | |
|  */
 | |
| struct stix_cmgr_t
 | |
| {
 | |
| 	stix_cmgr_bctouc_t bctouc;
 | |
| 	stix_cmgr_uctobc_t uctobc;
 | |
| };
 | |
| 
 | |
| /* =========================================================================
 | |
|  * MACROS THAT CHANGES THE BEHAVIORS OF THE C COMPILER/LINKER
 | |
|  * =========================================================================*/
 | |
| 
 | |
| #if defined(_WIN32) || (defined(__WATCOMC__) && !defined(__WINDOWS_386__))
 | |
| #	define STIX_IMPORT __declspec(dllimport)
 | |
| #	define STIX_EXPORT __declspec(dllexport)
 | |
| #	define STIX_PRIVATE 
 | |
| #elif defined(__GNUC__) && (__GNUC__>=4)
 | |
| #	define STIX_IMPORT __attribute__((visibility("default")))
 | |
| #	define STIX_EXPORT __attribute__((visibility("default")))
 | |
| #	define STIX_PRIVATE __attribute__((visibility("hidden")))
 | |
| /*#	define STIX_PRIVATE __attribute__((visibility("internal")))*/
 | |
| #else
 | |
| #	define STIX_IMPORT
 | |
| #	define STIX_EXPORT
 | |
| #	define STIX_PRIVATE
 | |
| #endif
 | |
| 
 | |
| #if defined(__STDC_VERSION__) && (__STDC_VERSION__>=199901L)
 | |
| #	define STIX_INLINE inline
 | |
| #	define STIX_HAVE_INLINE
 | |
| #elif defined(__GNUC__) && defined(__GNUC_GNU_INLINE__)
 | |
| 		/* gcc disables inline when -std=c89 or -ansi is used. 
 | |
| 		 * so use __inline__ supported by gcc regardless of the options */
 | |
| #	define STIX_INLINE /*extern*/ __inline__
 | |
| #	define STIX_HAVE_INLINE
 | |
| #else
 | |
| #	define STIX_INLINE 
 | |
| #	undef STIX_HAVE_INLINE
 | |
| #endif
 | |
| 
 | |
| 
 | |
| #endif
 |