1302 lines
		
	
	
		
			46 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			1302 lines
		
	
	
		
			46 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
| /*********************************************************************
 | |
| * Copyright (c) Intel Corporation 2011 - 2020
 | |
| * SPDX-License-Identifier: Apache-2.0
 | |
| **********************************************************************/
 | |
| 
 | |
| /*! \file ILibParsers.h 
 | |
| \brief MicroStack APIs for various functions and tasks
 | |
| */
 | |
| 
 | |
| #ifndef __ILibParsers__
 | |
| #define __ILibParsers__
 | |
| 
 | |
| #ifdef __cplusplus
 | |
| extern "C" {
 | |
| #endif
 | |
| 
 | |
| 	/*! \defgroup ILibParsers ILibParser Modules
 | |
| 	* @{
 | |
| 	* @}
 | |
| 	*/
 | |
| 
 | |
| 	/*! \def MAX_HEADER_LENGTH
 | |
| 	Specifies the maximum allowed length for an HTTP Header
 | |
| 	*/
 | |
| #define MAX_HEADER_LENGTH 800
 | |
| 
 | |
| #ifdef MEMORY_CHECK
 | |
| #include <assert.h>
 | |
| #define MEMCHECK(x) x
 | |
| #else
 | |
| #define MEMCHECK(x)
 | |
| #endif
 | |
| 
 | |
| #if !defined(WIN32) 
 | |
| #define HANDLE int
 | |
| #define SOCKET int
 | |
| #endif
 | |
| 
 | |
| extern char* ILibCriticalLogFilename;
 | |
| 
 | |
| 
 | |
| #ifndef WIN32
 | |
| #define REQUIRES_MEMORY_ALIGNMENT
 | |
| #endif
 | |
| 
 | |
| #if defined(WIN32) 
 | |
| #ifndef MICROSTACK_NO_STDAFX
 | |
| #include "stdafx.h"
 | |
| #endif
 | |
| struct sockaddr_in6;
 | |
| #elif defined(_POSIX)
 | |
| #include <sys/types.h>
 | |
| #include <sys/socket.h>
 | |
| #include <netinet/in.h>
 | |
| #include <arpa/inet.h>
 | |
| #include <sys/time.h>
 | |
| #include <netdb.h>
 | |
| #include <sys/ioctl.h>
 | |
| #include <net/if.h>
 | |
| #include <sys/utsname.h>
 | |
| #include <netinet/ip.h>
 | |
| #include <unistd.h>
 | |
| #include <errno.h>
 | |
| #include <semaphore.h>
 | |
| #include <malloc.h>
 | |
| #endif
 | |
| 
 | |
| #if defined(WIN32) && defined (_DEBUG) && !defined(_MINCORE)
 | |
| #define _CRTDBG_MAP_ALLOC
 | |
| #include <stdlib.h>
 | |
| #include <crtdbg.h>
 | |
| #else
 | |
| #include <stdlib.h>
 | |
| #endif
 | |
| #ifdef _POSIX
 | |
| #include <linux/limits.h>
 | |
| #endif
 | |
| 
 | |
| #include <stdio.h>
 | |
| #include <stddef.h>
 | |
| #include <string.h>
 | |
| #include <math.h>
 | |
| 
 | |
| 
 | |
| #if defined(WIN32) 
 | |
| #include <windows.h>
 | |
| #include <winioctl.h>
 | |
| #include <winbase.h>
 | |
| #include <WtsApi32.h>
 | |
| #include <UserEnv.h>
 | |
| #endif
 | |
| 
 | |
| #if defined(WIN32) 
 | |
| #include <time.h>
 | |
| #include <sys/timeb.h>
 | |
| #endif
 | |
| 
 | |
| #ifndef _MAX_PATH
 | |
| #define _MAX_PATH PATH_MAX
 | |
| #endif
 | |
| 
 | |
| #include<stdint.h>
 | |
| static inline void ignore_result(uint64_t result) { (void)result; }
 | |
| 
 | |
| int ILibGetLocalTime(char *dest, int destLen);
 | |
| long ILibGetTimeStamp();
 | |
| 
 | |
| #ifdef ILibEXPORT
 | |
| #ifdef WIN32
 | |
| #define ILibExportMethod __declspec(dllexport)
 | |
| #else
 | |
| #define ILibExportMethod
 | |
| #endif
 | |
| #else
 | |
| #define ILibExportMethod
 | |
| #endif
 | |
| 
 | |
| 
 | |
| #if defined(WIN32) 
 | |
| #ifndef FD_SETSIZE
 | |
| #define SEM_MAX_COUNT 64
 | |
| #else
 | |
| #define SEM_MAX_COUNT FD_SETSIZE
 | |
| #endif
 | |
| 	void ILibGetTimeOfDay(struct timeval *tp);
 | |
| 
 | |
| /*
 | |
| // Implemented in Windows using events.
 | |
| #define sem_t HANDLE
 | |
| #define sem_init(x,pShared,InitValue) *x=CreateSemaphore(NULL,InitValue,SEM_MAX_COUNT,NULL)
 | |
| #define sem_destroy(x) (CloseHandle(*x)==0?1:0)
 | |
| #define sem_wait(x) WaitForSingleObject(*x,INFINITE)
 | |
| #define sem_trywait(x) ((WaitForSingleObject(*x,0)==WAIT_OBJECT_0)?0:1)
 | |
| #define sem_post(x) ReleaseSemaphore(*x,1,NULL)
 | |
| */
 | |
| 
 | |
| // Implemented in Windows using critical section.
 | |
| #define sem_t CRITICAL_SECTION
 | |
| #define sem_init(x,pShared,InitValue) InitializeCriticalSection(x);
 | |
| #define sem_destroy(x) (DeleteCriticalSection(x))
 | |
| #define sem_wait(x) EnterCriticalSection(x)
 | |
| #define sem_trywait(x) TryEnterCriticalSection(x)
 | |
| #define sem_post(x) LeaveCriticalSection(x)
 | |
| 
 | |
| #define strncasecmp(x,y,z) _strnicmp(x,y,z)
 | |
| #define strcasecmp(x,y) _stricmp(x,y)
 | |
| #define gettimeofday(tp,tzp) ILibGetTimeOfDay(tp)
 | |
| 
 | |
| #define tzset() _tzset()
 | |
| #define daylight _daylight
 | |
| #define timezone _timezone
 | |
| 
 | |
| #ifndef stricmp
 | |
| #define stricmp(x,y) _stricmp(x,y)
 | |
| #endif
 | |
| 
 | |
| #ifndef strnicmp
 | |
| #define strnicmp(x,y,z) _strnicmp(x,y,z)
 | |
| #endif
 | |
| 
 | |
| #ifndef strcmpi
 | |
| #define strcmpi(x,y) _stricmp(x,y)
 | |
| #endif
 | |
| #endif
 | |
| 
 | |
| 
 | |
| #ifndef WIN32
 | |
| 	
 | |
| // Polyfills
 | |
| #ifndef memcpy_s
 | |
| 	int ILibMemory_Copy_s(void *destination, size_t destinationSize, const void *source, size_t sourceLength);
 | |
| 	#define memcpy_s(dest, destSize, source, sourceLen) ILibMemory_Copy_s(dest, destSize, source, sourceLen)
 | |
| #endif
 | |
| 
 | |
| #ifndef memmove_s
 | |
| 	int ILibMemory_Move_s(void *destination, size_t destinationSize, void *source, size_t sourceLength);
 | |
| 	#define memmove_s(dest, destSize, source, sourceLen) ILibMemory_Move_s(dest, destSize, source, sourceLen)
 | |
| #endif
 | |
| 
 | |
| #ifndef strncpy_s 
 | |
| #define strncpy_s(dest, destSize, source, count) ILibString_n_Copy_s(dest, destSize, source, count)
 | |
| #endif
 | |
| 
 | |
| #ifndef strcpy_s
 | |
| #define strcpy_s(dest, destSize, source) ILibString_Copy_s(dest, destSize, source)
 | |
| #endif
 | |
| 
 | |
| #ifndef strnlen_s
 | |
| #define strnlen_s(source, maxCount) (strlen(source) < (maxCount) ? strlen(source) : (maxCount))
 | |
| #endif
 | |
| 
 | |
| #ifndef sprintf_s
 | |
| #define ILib_need_sprintf_s
 | |
| #include <stdarg.h>
 | |
| 	int sprintf_s(void *dest, size_t destSize, const char *format, ...);
 | |
| #endif
 | |
| 
 | |
| #ifndef strnlen_s
 | |
| #define strnlen_s(source, maxLen) strnlen(source, maxLen)
 | |
| #endif
 | |
| 
 | |
| #endif
 | |
| 
 | |
| 
 | |
| 
 | |
| #if !defined(WIN32) 
 | |
| #define __fastcall
 | |
| #endif
 | |
| 
 | |
| 	typedef void (*voidfp)(void);		// Generic function pointer
 | |
| 	typedef void(*voidfp1)(void*);		// Generic function pointer
 | |
| 	extern char ILibScratchPad[4096];   // General buffer
 | |
| 	extern char ILibScratchPad2[65536]; // Often used for UDP packet processing
 | |
| 	extern char ILibScratchPad_WWWAuth1[1024]; // Used to construct WWW auth digest request
 | |
| 	extern char ILibScratchPad_WWWAuth2[4096]; // Used to construct WWW auth digest request
 | |
| 	extern void* gILibChain;			// Global Chain used for Remote Logging when a chain instance is not otherwise exposed
 | |
| 
 | |
| 	/*! \def UPnPMIN(a,b)
 | |
| 	Returns the minimum of \a a and \a b.
 | |
| 	*/
 | |
| #define UPnPMIN(a,b) (((a)<(b))?(a):(b))
 | |
| 
 | |
| /*!
 | |
| \ingroup ChainGroup
 | |
| *@{
 | |
| */
 | |
| 	extern const int ILibMemory_CHAIN_CONTAINERSIZE;
 | |
| 
 | |
| //! Determines if the specified chain is in the process of being disposed.
 | |
| /*!
 | |
| 	\param Chain Microstack Chain to query
 | |
| 	\return 0 = NO, 1 = YES
 | |
| */
 | |
| #define ILibIsChainBeingDestroyed(Chain) (*((int*)Chain))
 | |
| //!	Determines if the specified chain is running
 | |
| /*!
 | |
| 	\param Chain Microstack Chain to query
 | |
| 	\return 0 = NO, 1 = YES
 | |
| */
 | |
| #define ILibIsChainRunning(Chain) (((int*)Chain)[1])
 | |
| int ILibIsRunningOnChainThread(void* chain);
 | |
| /*! @} */
 | |
| 
 | |
| 	typedef enum ILibServerScope
 | |
| 	{
 | |
| 		ILibServerScope_All=0,
 | |
| 		ILibServerScope_LocalLoopback=1,
 | |
| 		ILibServerScope_LocalSegment=2
 | |
| 	}ILibServerScope;
 | |
| 
 | |
| 
 | |
| 	typedef	void(*ILibChain_PreSelect)(void* object, fd_set *readset, fd_set *writeset, fd_set *errorset, int* blocktime);
 | |
| 	typedef	void(*ILibChain_PostSelect)(void* object, int slct, fd_set *readset, fd_set *writeset, fd_set *errorset);
 | |
| 	typedef	void(*ILibChain_Destroy)(void* object);
 | |
| 	typedef void(*ILibChain_DestroyEvent)(void *chain, void *user);
 | |
| 	typedef void(*ILibChain_StartEvent)(void *chain, void *user);
 | |
| 	typedef void*(*ILibChain_Link_GetUserMemory)(void *ChainLinkObject, int *len);
 | |
| 	typedef void* ILibChain_EventHookToken;
 | |
| 	typedef void(*ILibChain_EventHookHandler)(void *hookedObject, ILibChain_EventHookToken token);
 | |
| 
 | |
| 	typedef struct ILibChain_Link
 | |
| 	{
 | |
| 		ILibChain_PreSelect PreSelectHandler;
 | |
| 		ILibChain_PostSelect PostSelectHandler;
 | |
| 		ILibChain_Destroy DestroyHandler;
 | |
| 		void* ParentChain;
 | |
| 		void* ExtraMemoryPtr;
 | |
| 	}ILibChain_Link;
 | |
| 
 | |
| 	ILibChain_Link* ILibChain_Link_Allocate(int structSize, int extraMemorySize);
 | |
| 	int ILibChain_Link_GetExtraMemorySize(ILibChain_Link* link);
 | |
| 
 | |
| 	void* ILibMemory_Allocate(int containerSize, int extraMemorySize, void** allocatedContainer, void **extraMemory);
 | |
| 	int ILibMemory_GetExtraMemorySize(void* extraMemory);
 | |
| 	ILibExportMethod void* ILibMemory_GetExtraMemory(void *container, int containerSize);
 | |
| 	ILibChain_EventHookToken ILibChain_SetEventHook(void* chainLinkObject, int maxTimeout, ILibChain_EventHookHandler handler);
 | |
| 	void ILibChain_UpdateEventHook(ILibChain_EventHookToken token, int maxTimeout);
 | |
| 
 | |
| 	/*!
 | |
| 		\defgroup LoggingMethods Logging Methods
 | |
| 		\ingroup ILibParsers
 | |
| 		@{
 | |
| 	*/
 | |
| #ifdef _REMOTELOGGING
 | |
| 	//! Associate an ILibRemoteLogging module with a microstack Chain
 | |
| 	/*!
 | |
| 		\param chain Microstack Chain to associate
 | |
| 		\param logger ILibRemoteLogging module to associate
 | |
| 	*/
 | |
| 	#define ILibChainSetLogger(chain, logger) ((void**)&((int*)chain)[2])[0] = logger
 | |
| 	//! Gets the associated ILibRemoteLogging module from a microstack chain
 | |
| 	/*!
 | |
| 		\paran chain Microstack chain to get the association from
 | |
| 		\return ILibRemoteLogging module associated (NULL if none associated)
 | |
| 	*/
 | |
| 	#define ILibChainGetLogger(chain) (chain!=NULL?(((void**)&((int*)chain)[2])[0]):NULL)
 | |
| 	#ifdef _REMOTELOGGINGSERVER
 | |
| 		ILibExportMethod unsigned short ILibStartDefaultLoggerEx(void* chain, unsigned short portNumber, char *path);
 | |
| 		#define ILibStartDefaultLogger(chain, portNumber) ILibStartDefaultLoggerEx(chain, portNumber, NULL)
 | |
| 	#else
 | |
| 		#define ILibStartDefaultLogger(chain, portNumber) 0
 | |
| 		#define ILibStartDefaultLoggerEx(chain, portNumber, path) 0
 | |
| 	#endif
 | |
| #else
 | |
| 	#define ILibChainSetLogger(chain, logger) ;
 | |
| 	#define ILibChainGetLogger(chain) NULL
 | |
| 	#define ILibStartDefaultLogger(chain, portNumber) 0
 | |
| 	#define ILibStartDefaultLoggerEx(chain, portNumber, path) 0
 | |
| #endif
 | |
| 	/*! @} */
 | |
| 
 | |
| 	/*!
 | |
| 		\ingroup ChainGroup
 | |
| 	*@{
 | |
| 	*/
 | |
| 	void ILibChain_OnDestroyEvent_AddHandler(void *chain, ILibChain_DestroyEvent sink, void *user);
 | |
| 	void ILibChain_OnStartEvent_AddHandler(void *chain, ILibChain_StartEvent sink, void *user);
 | |
| 	/*! @} */
 | |
| 
 | |
| #ifdef MICROSTACK_NOTLS
 | |
|         #define NONCE_SIZE        32
 | |
|         #define HALF_NONCE_SIZE   16
 | |
| 
 | |
|         char* __fastcall util_tohex(char* data, int len, char* out);
 | |
|         int __fastcall util_hexToint(char *hexString, int hexStringLength);
 | |
| 
 | |
|         // Convert hex string to int
 | |
|         int __fastcall util_hexToBuf(char *hexString, int hexStringLength, char* output);
 | |
| #endif
 | |
| 	int ILibIsLittleEndian();
 | |
| 	int ILibGetCurrentTimezoneOffset_Minutes();
 | |
| 	int ILibIsDaylightSavingsTime();
 | |
| 	int ILibTime_ParseEx(char *timeString, time_t *val);
 | |
| 	time_t ILibTime_Parse(char *timeString);
 | |
| 	char* ILibTime_Serialize(time_t timeVal);
 | |
| 	long long ILibGetUptime();
 | |
| 
 | |
| 	unsigned long long ILibHTONLL(unsigned long long v);
 | |
| 	unsigned long long ILibNTOHLL(unsigned long long v);
 | |
| 
 | |
| 	typedef void* ILibReaderWriterLock;
 | |
| 	ILibReaderWriterLock ILibReaderWriterLock_Create();
 | |
| 	ILibReaderWriterLock ILibReaderWriterLock_CreateEx(void *chain);
 | |
| 	int ILibReaderWriterLock_ReadLock(ILibReaderWriterLock rwLock);
 | |
| 	int ILibReaderWriterLock_ReadUnLock(ILibReaderWriterLock rwLock);
 | |
| 	int ILibReaderWriterLock_WriteLock(ILibReaderWriterLock rwLock);
 | |
| 	int ILibReaderWriterLock_WriteUnLock(ILibReaderWriterLock rwLock);
 | |
| 	void ILibReaderWriterLock_Destroy(ILibReaderWriterLock rwLock);
 | |
| 
 | |
| 	/*! \defgroup ILibTransport ILibTransport Abstraction
 | |
| 		\ingroup ILibParsers
 | |
| 	* @{
 | |
| 	*/
 | |
| 	//! Fetch the underlying chain from an ILibTransport object
 | |
| 	/*!
 | |
| 		\param transport ILibTransport object to query
 | |
| 		\return Microstack Chain
 | |
| 	*/
 | |
| 	#define ILibTransportChain(transport) ((ILibTransport*)transport)->ChainLink.ParentChain
 | |
| 	//! Memory Ownership of ILibTransport Data
 | |
| 	typedef enum ILibTransport_MemoryOwnership
 | |
| 	{
 | |
| 		ILibTransport_MemoryOwnership_CHAIN = 0, /*!< The Microstack will own this memory, and free it when it is done with it */
 | |
| 		ILibTransport_MemoryOwnership_STATIC = 1, /*!< This memory is static, so the Microstack will not free it, and assume it will not go away, so it won't copy it either */
 | |
| 		ILibTransport_MemoryOwnership_USER = 2 /*!< The Microstack doesn't own this memory, so if necessary the memory will be copied */
 | |
| 	}ILibTransport_MemoryOwnership;
 | |
| 	//! Operation Status
 | |
| 	typedef enum ILibTransport_DoneState
 | |
| 	{
 | |
| 		ILibTransport_DoneState_INCOMPLETE = 0,	/*!< Operation not complete [PENDING] */
 | |
| 		ILibTransport_DoneState_COMPLETE = 1,	/*!< Operation complete */
 | |
| 		ILibTransport_DoneState_ERROR	= -4	/*!< Operation failed */
 | |
| 	}ILibTransport_DoneState;
 | |
| 
 | |
| 	typedef ILibTransport_DoneState(*ILibTransport_SendPtr)(void *transport, char* buffer, int bufferLength, ILibTransport_MemoryOwnership ownership, ILibTransport_DoneState done);
 | |
| 	typedef void(*ILibTransport_ClosePtr)(void *transport);
 | |
| 	typedef unsigned int(*ILibTransport_PendingBytesToSendPtr)(void *transport);
 | |
| 
 | |
| 	ILibTransport_DoneState ILibTransport_Send(void *transport, char* buffer, int bufferLength, ILibTransport_MemoryOwnership ownership, ILibTransport_DoneState done);
 | |
| 	void ILibTransport_Close(void *transport);
 | |
| 	unsigned int ILibTransport_PendingBytesToSend(void *transport);
 | |
| 
 | |
| 	//! ILibTransport Abstraction [DO NOT MODIFY STRUCT DEFINITION]
 | |
| 	typedef	void(*ILibTransport_OnSendOK)(void* sender);
 | |
| 	typedef struct ILibTransport
 | |
| 	{
 | |
| 		ILibChain_Link ChainLink;								
 | |
| 		ILibTransport_SendPtr SendPtr;							/*!< [RESERVED: Encapsulated Send Handler] */
 | |
| 		ILibTransport_ClosePtr ClosePtr;						/*!< [RESERVED: Encapsulated Close Handler] */
 | |
| 		ILibTransport_PendingBytesToSendPtr PendingBytesPtr;	/*!< [RESERVED: Encapsulated Pending Handler] */
 | |
| 		ILibTransport_OnSendOK SendOkPtr;						/*!< [RESERVED: Encapsulated SendOK Callback] */
 | |
| 		unsigned int IdentifierFlags;							/*!< ILibTransport Type Identifier */
 | |
| 	}ILibTransport;
 | |
| 	/*! @} */
 | |
| 
 | |
| 
 | |
| 	/*! \defgroup DataStructures Data Structures
 | |
| 	\ingroup ILibParsers
 | |
| 	\{
 | |
| 	\}
 | |
| 	*/
 | |
| 
 | |
| 
 | |
| 	/*! \struct parser_result_field ILibParsers.h
 | |
| 	\brief Data Elements of \a parser_result
 | |
| 	\par
 | |
| 	This structure represents individual tokens, resulting from a call to
 | |
| 	\a ILibParseString and \a ILibParseStringAdv
 | |
| 	*/
 | |
| 	typedef struct parser_result_field
 | |
| 	{
 | |
| 		/*! \var data
 | |
| 		\brief Pointer to string
 | |
| 		*/
 | |
| 		char* data;
 | |
| 
 | |
| 		/*! \var datalength
 | |
| 		\brief Length of \a data
 | |
| 		*/
 | |
| 		int datalength;
 | |
| 
 | |
| 		/*! \var NextResult
 | |
| 		\brief Pointer to next token
 | |
| 		*/
 | |
| 		struct parser_result_field *NextResult;
 | |
| 	}parser_result_field;
 | |
| 
 | |
| 	/*! \struct parser_result ILibParsers.h
 | |
| 	\brief String Parsing Result Index
 | |
| 	\par
 | |
| 	This is returned from a successfull call to either \a ILibParseString or
 | |
| 	\a ILibParseStringAdv.
 | |
| 	*/
 | |
| 	typedef struct parser_result
 | |
| 	{
 | |
| 		/*! \var FirstResult
 | |
| 		\brief Pointer to the first token
 | |
| 		*/
 | |
| 		struct parser_result_field *FirstResult;
 | |
| 		/*! \var LastResult
 | |
| 		\brief Pointer to the last token
 | |
| 		*/
 | |
| 		struct parser_result_field *LastResult;
 | |
| 		/*! \var NumResults
 | |
| 		\brief The total number of tokens
 | |
| 		*/
 | |
| 		int NumResults;
 | |
| 	}parser_result;
 | |
| 
 | |
| 	/*! \struct packetheader_field_node ILibParsers.h
 | |
| 	\brief HTTP Headers
 | |
| 	\par
 | |
| 	This structure represents an individual header element. A list of these
 | |
| 	is referenced from a \a packetheader_field_node.
 | |
| 	*/
 | |
| 	typedef struct packetheader_field_node
 | |
| 	{
 | |
| 		/*! \var Field
 | |
| 		\brief Header Name
 | |
| 		*/
 | |
| 		char* Field;
 | |
| 		/*! \var FieldLength
 | |
| 		\brief Length of \a Field
 | |
| 		*/
 | |
| 		int FieldLength;
 | |
| 		/*! \var FieldData
 | |
| 		\brief Header Value
 | |
| 		*/
 | |
| 		char* FieldData;
 | |
| 		/*! \var FieldDataLength
 | |
| 		\brief Length of \a FieldData
 | |
| 		*/
 | |
| 		int FieldDataLength;
 | |
| 		/*! \var UserAllocStrings
 | |
| 		\brief Boolean indicating if the above strings are non-static memory
 | |
| 		*/
 | |
| 		int UserAllocStrings;
 | |
| 		/*! \var NextField
 | |
| 		\brief Pointer to the Next Header entry. NULL if this is the last one
 | |
| 		*/
 | |
| 		struct packetheader_field_node* NextField;
 | |
| 	}packetheader_field_node;
 | |
| 
 | |
| 	/*! \struct packetheader ILibParsers.h
 | |
| 	\brief Structure representing a packet formatted according to HTTP encoding rules
 | |
| 	\par
 | |
| 	This can be created manually by calling \a ILibCreateEmptyPacket(), or automatically via a call to \a ILibParsePacketHeader(...)
 | |
| 	*/
 | |
| 	typedef struct packetheader
 | |
| 	{
 | |
| 		/*! \var Directive
 | |
| 		\brief HTTP Method
 | |
| 		\par
 | |
| 		eg: \b GET /index.html HTTP/1.1
 | |
| 		*/
 | |
| 		char* Directive;
 | |
| 		/*! \var DirectiveLength
 | |
| 		\brief Length of \a Directive
 | |
| 		*/
 | |
| 		int DirectiveLength;
 | |
| 		/*! \var DirectiveObj
 | |
| 		\brief HTTP Method Path
 | |
| 		\par
 | |
| 		eg: GET \b /index.html HTTP/1.1
 | |
| 		*/
 | |
| 		char* DirectiveObj;
 | |
| 		/*! \var DirectiveObjLength
 | |
| 		\brief Length of \a DirectiveObj
 | |
| 		*/
 | |
| 
 | |
| 		void *Reserved;
 | |
| 
 | |
| 		int DirectiveObjLength;
 | |
| 		/*! \var StatusCode
 | |
| 		\brief HTTP Response Code
 | |
| 		\par
 | |
| 		eg: HTTP/1.1 \b 200 OK
 | |
| 		*/
 | |
| 		int StatusCode;
 | |
| 		/* \var StatusData
 | |
| 		\brief Status Meta Data
 | |
| 		\par
 | |
| 		eg: HTTP/1.1 200 \b OK
 | |
| 		*/
 | |
| 		char* StatusData;
 | |
| 		/*! \var StatusDataLength
 | |
| 		\brief Length of \a StatusData
 | |
| 		*/
 | |
| 		int StatusDataLength;
 | |
| 		/*! \var Version
 | |
| 		\brief HTTP Version
 | |
| 		\par
 | |
| 		eg: 1.1
 | |
| 		*/
 | |
| 		char* Version;
 | |
| 		/*! \var VersionLength
 | |
| 		\brief Length of \a Version
 | |
| 		*/
 | |
| 		int VersionLength;
 | |
| 		/*! \var Body
 | |
| 		\brief Pointer to HTTP Body
 | |
| 		*/
 | |
| 		char* Body;
 | |
| 		/*! \var BodyLength
 | |
| 		\brief Length of \a Body
 | |
| 		*/
 | |
| 		int BodyLength;
 | |
| 		/*! \var UserAllocStrings
 | |
| 		\brief Boolean indicating if Directive/Obj are non-static
 | |
| 		\par
 | |
| 		This only needs to be set, if you manually populate \a Directive and \a DirectiveObj.<br>
 | |
| 		It is \b recommended that you use \a ILibSetDirective
 | |
| 		*/
 | |
| 		int UserAllocStrings;	// Set flag if you allocate memory pointed to by Directive/Obj
 | |
| 		/*! \var UserAllocVersion
 | |
| 		\brief Boolean indicating if Version string is non-static
 | |
| 		\par
 | |
| 		This only needs to be set, if you manually populate \a Version.<br>
 | |
| 		It is \b recommended that you use \a ILibSetVersion
 | |
| 		*/	
 | |
| 		int UserAllocVersion;	// Set flag if you allocate memory pointed to by Version
 | |
| 		int ClonedPacket;
 | |
| 
 | |
| 		/*! \var FirstField
 | |
| 		\brief Pointer to the first Header field
 | |
| 		*/
 | |
| 		struct packetheader_field_node* FirstField;
 | |
| 		/*! \var LastField
 | |
| 		\brief Pointer to the last Header field
 | |
| 		*/
 | |
| 		struct packetheader_field_node* LastField;
 | |
| 
 | |
| 		/*! \var Source
 | |
| 		\brief The origin of this packet
 | |
| 		\par
 | |
| 		This is only populated if you obtain this structure from either \a ILibWebServer or
 | |
| 		\a ILibWebClient.
 | |
| 		*/
 | |
| 		char Source[30];
 | |
| 		/*! \var ReceivingAddress
 | |
| 		\brief IP address that this packet was received on
 | |
| 		\par
 | |
| 		This is only populated if you obtain this structure from either \a ILibWebServer or
 | |
| 		\a ILibWebClient.
 | |
| 		*/
 | |
| 		char ReceivingAddress[30];
 | |
| 
 | |
| 		void *HeaderTable;
 | |
| 	}ILibHTTPPacket;
 | |
| 
 | |
| 	/*! \struct ILibXMLNode
 | |
| 	\brief An XML Tree
 | |
| 	\par
 | |
| 	This is obtained via a call to \a ILibParseXML. It is \b highly \b recommended
 | |
| 	that you call \a ILibProcessXMLNodeList, so that the node pointers at the end of this
 | |
| 	structure will be populated. That will greatly simplify node traversal.<br><br>
 | |
| 	In order for namespaces to be resolved, you must call \a ILibXML_BuildNamespaceLookupTable(...)
 | |
| 	with root-most node that you would like to resolve namespaces for. It is recommended that you always use
 | |
| 	the root node, obtained from the initial call to \a ILibParseXML.<br><br>
 | |
| 	For most intents and purposes, you only need to work with the "StartElements"
 | |
| 	*/
 | |
| 	struct ILibXMLNode
 | |
| 	{
 | |
| 		/*! \var Name
 | |
| 		\brief Local Name of the current element
 | |
| 		*/
 | |
| 		char* Name;			// Element Name
 | |
| 		/*! \var NameLength
 | |
| 		\brief Length of \a Name
 | |
| 		*/
 | |
| 		int NameLength;
 | |
| 
 | |
| 		/*! \var NSTag
 | |
| 		\brief Namespace Prefix of the current element
 | |
| 		\par
 | |
| 		This can be resolved using a call to \a ILibXML_LookupNamespace(...)
 | |
| 		*/
 | |
| 		char* NSTag;		// Element Prefix
 | |
| 		/*! \var NSLength
 | |
| 		\brief Length of \a NSTag
 | |
| 		*/
 | |
| 		int NSLength;
 | |
| 
 | |
| 		/*! \var StartTag
 | |
| 		\brief boolean indicating if the current element is a start element
 | |
| 		*/
 | |
| 		int StartTag;		// Non zero if this is a StartElement
 | |
| 		/*! \var EmptyTag
 | |
| 		\brief boolean indicating if this element is an empty element
 | |
| 		*/
 | |
| 		int EmptyTag;		// Non zero if this is an EmptyElement
 | |
| 
 | |
| 		void *Reserved;		// DO NOT TOUCH
 | |
| 		void *Reserved2;	// DO NOT TOUCH
 | |
| 
 | |
| 		/*! \var Next
 | |
| 		\brief Pointer to the child of the current node
 | |
| 		*/
 | |
| 		struct ILibXMLNode *Next;			// Next Node
 | |
| 		/*! \var Parent
 | |
| 		\brief Pointer to the Parent of the current node
 | |
| 		*/
 | |
| 		struct ILibXMLNode *Parent;			// Parent Node
 | |
| 		/*! \var Peer
 | |
| 		\brief Pointer to the sibling of the current node
 | |
| 		*/
 | |
| 		struct ILibXMLNode *Peer;			// Sibling Node
 | |
| 		struct ILibXMLNode *ClosingTag;		// Pointer to closing node of this element
 | |
| 		struct ILibXMLNode *StartingTag;	// Pointer to start node of this element
 | |
| 	};
 | |
| 
 | |
| 	/*! \struct ILibXMLAttribute
 | |
| 	\brief A list of XML Attributes for a specified XML node
 | |
| 	\par
 | |
| 	This can be obtained via a call to \a ILibGetXMLAttributes(...)
 | |
| 	*/
 | |
| 	struct ILibXMLAttribute
 | |
| 	{
 | |
| 		/*! \var Name
 | |
| 		\brief Local name of Attribute
 | |
| 		*/
 | |
| 		char* Name;						// Attribute Name
 | |
| 		/*! \var NameLength
 | |
| 		\brief Length of \a Name
 | |
| 		*/
 | |
| 		int NameLength;
 | |
| 
 | |
| 		/*! \var Prefix
 | |
| 		\brief Namespace Prefix of this attribute
 | |
| 		\par
 | |
| 		This can be resolved by calling \a ILibXML_LookupNamespace(...) and passing in \a Parent as the current node
 | |
| 		*/
 | |
| 		char* Prefix;					// Attribute Namespace Prefix
 | |
| 		/*! \var PrefixLength
 | |
| 		\brief Lenth of \a Prefix
 | |
| 		*/
 | |
| 		int PrefixLength;
 | |
| 
 | |
| 		/*! \var Parent
 | |
| 		\brief Pointer to the XML Node that contains this attribute
 | |
| 		*/
 | |
| 		struct ILibXMLNode *Parent;		// The XML Node this attribute belongs to
 | |
| 
 | |
| 		/*! \var Value
 | |
| 		\brief Attribute Value
 | |
| 		*/
 | |
| 		char* Value;					// Attribute Value	
 | |
| 		/*! \var ValueLength
 | |
| 		\brief Length of \a Value
 | |
| 		*/
 | |
| 		int ValueLength;
 | |
| 		/*! \var Next
 | |
| 		\brief Pointer to the next attribute
 | |
| 		*/
 | |
| 		struct ILibXMLAttribute *Next;	// Next Attribute
 | |
| 	};
 | |
| 
 | |
| 	char *ILibReadFileFromDisk(char *FileName);
 | |
| 	int ILibReadFileFromDiskEx(char **Target, char *FileName);
 | |
| 	void ILibWriteStringToDisk(char *FileName, char *data);
 | |
| 	void ILibAppendStringToDiskEx(char *FileName, char *data, int dataLen);
 | |
| 	void ILibWriteStringToDiskEx(char *FileName, char *data, int dataLen);
 | |
| 	void ILibDeleteFileFromDisk(char *FileName);
 | |
| 	void ILibGetDiskFreeSpace(void *i64FreeBytesToCaller, void *i64TotalBytes);
 | |
| 
 | |
| 
 | |
| 	/*! \defgroup StackGroup Stack
 | |
| 	\ingroup DataStructures
 | |
| 	Stack Methods
 | |
| 	\{
 | |
| 	*/
 | |
| 	void ILibCreateStack(void **TheStack);
 | |
| 	void ILibPushStack(void **TheStack, void *data);
 | |
| 	void *ILibPopStack(void **TheStack);
 | |
| 	void *ILibPeekStack(void **TheStack);
 | |
| 	void ILibClearStack(void **TheStack);
 | |
| 	/*! \} */
 | |
| 
 | |
| 	/*! \defgroup QueueGroup Queue
 | |
| 	\ingroup DataStructures
 | |
| 	Queue Methods
 | |
| 	\{
 | |
| 	*/
 | |
| 	typedef void* ILibQueue;
 | |
| 	ILibQueue ILibQueue_Create();
 | |
| 	void ILibQueue_Destroy(ILibQueue q);
 | |
| 	int ILibQueue_IsEmpty(ILibQueue q);
 | |
| 	void ILibQueue_EnQueue(ILibQueue q, void *data);
 | |
| 	void *ILibQueue_DeQueue(ILibQueue q);
 | |
| 	#define ILibQueue_PeekTail(q) ILibLinkedList_GetDataFromNode(ILibLinkedList_GetNode_Tail(q))
 | |
| 	void *ILibQueue_PeekQueue(ILibQueue q);
 | |
| 	void ILibQueue_Lock(ILibQueue q);
 | |
| 	void ILibQueue_UnLock(ILibQueue q);
 | |
| 	long ILibQueue_GetCount(ILibQueue q);
 | |
| 	/* \} */
 | |
| 
 | |
| 
 | |
| 	/*! \defgroup XML XML Parsing Methods
 | |
| 	\ingroup ILibParsers
 | |
| 	MicroStack supplied XML Parsing Methods
 | |
| 	\par
 | |
| 	\b Note: None of the XML Parsing Methods copy or allocate memory
 | |
| 	The lifetime of any/all strings is bound to the underlying string that was
 | |
| 	parsed using ILibParseXML. If you wish to keep any of these strings for longer
 | |
| 	then the lifetime of the underlying string, you must copy the string.
 | |
| 	\{
 | |
| 	*/
 | |
| 
 | |
| 
 | |
| 	//
 | |
| 	// Parses an XML string. Returns a tree of ILibXMLNode elements.
 | |
| 	//
 | |
| 	struct ILibXMLNode *ILibParseXML(char *buffer, int offset, int length);
 | |
| 
 | |
| 	//
 | |
| 	// Preprocesses the tree of ILibXMLNode elements returned by ILibParseXML.
 | |
| 	// This method populates all the node pointers in each node for easy traversal.
 | |
| 	// In addition, this method will also determine if the given XML document was well formed.
 | |
| 	// Returns 0 if processing succeeded. Specific Error Codes are returned otherwise.
 | |
| 	//
 | |
| 	int ILibProcessXMLNodeList(struct ILibXMLNode *nodeList);
 | |
| 
 | |
| 	//
 | |
| 	// Initalizes a namespace lookup table for a given parent node. 
 | |
| 	// If you want to resolve namespaces, you must call this method exactly once
 | |
| 	//
 | |
| 	void ILibXML_BuildNamespaceLookupTable(struct ILibXMLNode *node);
 | |
| 
 | |
| 	//
 | |
| 	// Resolves a namespace prefix.
 | |
| 	//
 | |
| 	char* ILibXML_LookupNamespace(struct ILibXMLNode *currentLocation, char *prefix, int prefixLength);
 | |
| 
 | |
| 	//
 | |
| 	// Fetches all the data for an element. Returns the length of the populated data
 | |
| 	//
 | |
| 	int ILibReadInnerXML(struct ILibXMLNode *node, char **RetVal);
 | |
| 
 | |
| 	//
 | |
| 	// Returns the attributes of an XML element. Returned as a linked list of ILibXMLAttribute.
 | |
| 	//
 | |
| 	struct ILibXMLAttribute *ILibGetXMLAttributes(struct ILibXMLNode *node);
 | |
| 
 | |
| 	void ILibDestructXMLNodeList(struct ILibXMLNode *node);
 | |
| 	void ILibDestructXMLAttributeList(struct ILibXMLAttribute *attribute);
 | |
| 
 | |
| 	//
 | |
| 	// Escapes an XML string.
 | |
| 	// indata must be pre-allocated. 
 | |
| 	//
 | |
| 	int ILibXmlEscapeEx(char* outdata, const char* indata, size_t indataLen);
 | |
| 	#define ILibXmlEscape(outdata, indata) ILibXmlEscapeEx(outdata, indata, strnlen_s(indata, sizeof(ILibScratchPad2)))
 | |
| 	//
 | |
| 	// Returns the required size string necessary to escape this XML string
 | |
| 	//
 | |
| 	int ILibXmlEscapeLengthEx(const char* data, size_t dataLen);
 | |
| 	#define ILibXmlEscapeLength(data) ILibXmlEscapeLengthEx(data, strnlen_s(data, sizeof(ILibScratchPad2)))
 | |
| 	//
 | |
| 	// Unescapes an XML string.
 | |
| 	// Since Unescaped strings are always shorter than escaped strings,
 | |
| 	// the resultant string will overwrite the supplied string, to save memory
 | |
| 	//
 | |
| 	int ILibInPlaceXmlUnEscapeEx(char* data, size_t dataLen);
 | |
| 	#define ILibInPlaceXmlUnEscape(data) ILibInPlaceXmlUnEscapeEx(data, strnlen_s(data, sizeof(ILibScratchPad2)))
 | |
| 	/*! \} */
 | |
| 
 | |
| 	/*! \defgroup ChainGroup Chain Methods
 | |
| 	\ingroup ILibParsers
 | |
| 	\brief Chaining Methods
 | |
| 	\{
 | |
| 	*/
 | |
| 	ILibExportMethod void *ILibCreateChain();
 | |
| 	void *ILibCreateChainEx(int extraMemorySize);
 | |
| 	void ILibAddToChain(void *chain, void *object);
 | |
| 	void *ILibGetBaseTimer(void *chain);
 | |
| 	void ILibChain_SafeAdd(void *chain, void *object);
 | |
| 	void ILibChain_SafeRemove(void *chain, void *object);
 | |
| 	void ILibChain_SafeRemoveEx(void *chain, void *object);
 | |
| 	void ILibChain_DestroyEx(void *chain);
 | |
| 	ILibExportMethod void ILibStartChain(void *chain);
 | |
| 	ILibExportMethod void ILibStopChain(void *chain);
 | |
| 	ILibExportMethod void ILibChain_Continue(void *chain, ILibChain_Link **modules, int moduleCount, int maxTimeout);
 | |
| 	ILibExportMethod void ILibChain_EndContinue(void *chain);
 | |
| 
 | |
| 	void ILibForceUnBlockChain(void *Chain);
 | |
| 	void ILibChain_RunOnMicrostackThreadEx(void *chain, ILibChain_StartEvent handler, void *user);
 | |
| 	#define ILibChain_RunOnMicrostackThread(chain, handler, user) if(ILibIsRunningOnChainThread(chain)==0){ILibChain_RunOnMicrostackThreadEx(chain, handler, user);}else{handler(chain,user);}
 | |
| 	/* \} */
 | |
| 
 | |
| 	/*! \defgroup SparseArrayGroup Sparse Array
 | |
| 	\ingroup DataStructures
 | |
| 	Sparse Array is a compact array where most of the elements will have the default value [NULL].
 | |
| 	*@{
 | |
| 	*/
 | |
| 
 | |
| 	typedef void* ILibSparseArray;
 | |
| 	//! Event handler triggered when an index needs to be hashed into a bucket value
 | |
| 	/*!
 | |
| 		\param value Index value to be hashed
 | |
| 		\return Hashed Bucket value
 | |
| 	*/
 | |
| 	typedef int(*ILibSparseArray_Bucketizer)(int value);
 | |
| 	//! Generic Event handler
 | |
| 	/*!
 | |
| 		\param sender The Sparse Array that generated the event
 | |
| 		\param index Index Value
 | |
| 		\param value Data Value
 | |
| 		\param user Custom user state object
 | |
| 	*/
 | |
| 	typedef void(*ILibSparseArray_OnValue)(ILibSparseArray sender, int index, void *value, void *user);
 | |
| 	extern const int ILibMemory_SparseArray_CONTAINERSIZE;
 | |
| 	ILibSparseArray ILibSparseArray_CreateWithUserMemory(int numberOfBuckets, ILibSparseArray_Bucketizer bucketizer, int userMemorySize);
 | |
| 	#define ILibSparseArray_Create(numberOfBuckets, bucketizer) ILibSparseArray_CreateWithUserMemory(numberOfBuckets, bucketizer, 0)
 | |
| 	ILibSparseArray ILibSparseArray_CreateEx(ILibSparseArray source);
 | |
| 	void* ILibSparseArray_Add(ILibSparseArray sarray, int index, void *data);
 | |
| 	void* ILibSparseArray_Get(ILibSparseArray sarray, int index);
 | |
| 	void* ILibSparseArray_Remove(ILibSparseArray sarray, int index);
 | |
| 	void ILibSparseArray_Destroy(ILibSparseArray sarray);
 | |
| 	void ILibSparseArray_DestroyEx(ILibSparseArray sarray, ILibSparseArray_OnValue onDestroy, void *user);
 | |
| 	void ILibSparseArray_ClearEx2(ILibSparseArray sarray, ILibSparseArray_OnValue onClear, void *user, int nonZeroWillDelete);
 | |
| 	#define ILibSparseArray_ClearEx(sarray, onClear, user) ILibSparseArray_ClearEx2(sarray, onClear, user, 1)
 | |
| 	#define ILibSparseArray_Enumerate(sarray, onEnumerate, user) ILibSparseArray_ClearEx2(sarray, onEnumerate, user, 0)
 | |
| 	ILibSparseArray ILibSparseArray_Move(ILibSparseArray sarray);
 | |
| 
 | |
| 	void ILibSparseArray_Lock(ILibSparseArray sarray);
 | |
| 	void ILibSparseArray_UnLock(ILibSparseArray sarray);
 | |
| 
 | |
| 	/*!	
 | |
| 	*@}
 | |
| 	*/
 | |
| 
 | |
| 	/*! \defgroup AdvHashtableGroup Advanced Hashtable
 | |
| 	\ingroup DataStructures
 | |
| 	Advanced Hashtable is a customizable Hashtable data structure, that can be optimized as necessary
 | |
| 	*@{
 | |
| 	*/
 | |
| 
 | |
| 	typedef void* ILibHashtable;
 | |
| 	//! Event handler for hash requests [Key1 or Key2 or Both]
 | |
| 	/*!
 | |
| 		\param Key1 Address Key
 | |
| 		\param Key2 String Key
 | |
| 		\param Key2Len String Key Length
 | |
| 		\return Hash result
 | |
| 	*/
 | |
| 	typedef int(*ILibHashtable_Hash_Func)(void* Key1, char* Key2, int Key2Len);
 | |
| 	//! Event handler for when elements in the hashtable are freed
 | |
| 	/*!
 | |
| 		\param sender Hashtable that generated the request
 | |
| 		\param Key1 Address Key
 | |
| 		\param Key2 String Key
 | |
| 		\param Key2Len String Key Length
 | |
| 		\param Data Element Value
 | |
| 		\param user Custom User State data
 | |
| 	*/
 | |
| 	typedef void(*ILibHashtable_OnDestroy)(ILibHashtable sender, void *Key1, char* Key2, int Key2Len, void *Data, void *user);
 | |
| 
 | |
| 	ILibHashtable ILibHashtable_Create();
 | |
| 
 | |
| 	void ILibHashtable_DestroyEx(ILibHashtable table, ILibHashtable_OnDestroy onDestroy, void *user);
 | |
| 	//! Free resources associated with Advanced Hashtable
 | |
| 	/*!
 | |
| 		\param hashtable Hashtable
 | |
| 	*/
 | |
| 	#define ILibHashtable_Destroy(hashtable) ILibHashtable_DestroyEx(hashtable, NULL, NULL)
 | |
| 	void ILibHashtable_ChangeHashFunc(ILibHashtable table, ILibHashtable_Hash_Func hashFunc);
 | |
| 	void ILibHashtable_ChangeBucketizer(ILibHashtable table, int bucketCount, ILibSparseArray_Bucketizer bucketizer);
 | |
| 	void* ILibHashtable_Put(ILibHashtable table, void *Key1, char* Key2, int Key2Len, void* Data);
 | |
| 	void* ILibHashtable_Get(ILibHashtable table, void *Key1, char* Key2, int Key2Len);
 | |
| 	void* ILibHashtable_Remove(ILibHashtable table, void *Key1, char* Key2, int Key2Len);
 | |
| 	void ILibHashtable_Clear(ILibHashtable table);
 | |
| 	void ILibHashtable_ClearEx(ILibHashtable table, ILibHashtable_OnDestroy onClear, void *user);
 | |
| 	void ILibHashtable_Enumerate(ILibHashtable table, ILibHashtable_OnDestroy onEnumerate, void *user);
 | |
| 	void ILibHashtable_Lock(ILibHashtable table);
 | |
| 	void ILibHashtable_UnLock(ILibHashtable table);
 | |
| 	/*!
 | |
| 	*@}
 | |
| 	*/
 | |
| 
 | |
| 	/*! \defgroup LinkedListGroup Linked List
 | |
| 	\ingroup DataStructures
 | |
| 	*@{
 | |
| 	*/
 | |
| 
 | |
| 	typedef void* ILibLinkedList;
 | |
| 
 | |
| 	/*!
 | |
| 		\ingroup ChainGroup
 | |
| 	*@{
 | |
| 	*/
 | |
| 
 | |
| 	typedef struct ILibLinkedList_FileBacked_Root
 | |
| 	{
 | |
| 		unsigned int flags;
 | |
| 		unsigned int maxSize;
 | |
| 		unsigned int head;
 | |
| 		unsigned int tail;
 | |
| 	}ILibLinkedList_FileBacked_Root;
 | |
| #ifdef WIN32
 | |
| #pragma warning( push )
 | |
| #pragma warning( disable : 4200 )
 | |
| #endif
 | |
| 	typedef struct ILibLinkedList_FileBacked_Node
 | |
| 	{
 | |
| 		unsigned int next;
 | |
| 		unsigned int dataLen;
 | |
| 		char data[];
 | |
| 	}ILibLinkedList_FileBacked_Node;
 | |
| #ifdef WIN32
 | |
| #pragma warning( pop )
 | |
| #endif
 | |
| 	void ILibLinkedList_FileBacked_Close(ILibLinkedList_FileBacked_Root *root);
 | |
| 	int ILibLinkedList_FileBacked_IsEmpty(ILibLinkedList_FileBacked_Root *root);
 | |
| 	ILibLinkedList_FileBacked_Node* ILibLinkedList_FileBacked_ReadNext(ILibLinkedList_FileBacked_Root* root, ILibLinkedList_FileBacked_Node* current);
 | |
| 	ILibLinkedList_FileBacked_Root* ILibLinkedList_FileBacked_Create(char* path, unsigned int maxFileSize, int maxRecordSize);
 | |
| 	void ILibLinkedList_FileBacked_Reset(ILibLinkedList_FileBacked_Root *root);
 | |
| 	int ILibLinkedList_FileBacked_AddTail(ILibLinkedList_FileBacked_Root* root, char* data, unsigned int dataLen);
 | |
| 	int ILibLinkedList_FileBacked_ReloadRoot(ILibLinkedList_FileBacked_Root* root);
 | |
| 	void ILibLinkedList_FileBacked_SaveRoot(ILibLinkedList_FileBacked_Root* root);
 | |
| 
 | |
| 
 | |
| 	ILibLinkedList ILibChain_GetLinks(void *chain);
 | |
| 	ILibHashtable ILibChain_GetBaseHashtable(void* chain);
 | |
| 	#define ILibChain_Stash_Put(chain, key, value) ILibHashtable_Put(ILibChain_GetBaseHashtable(chain), NULL, key, strnlen_s(key, 255), value)
 | |
| 	#define ILibChain_Stash_Get(chain, key) ILibHashtable_Get(ILibChain_GetBaseHashtable(chain), NULL, key, strnlen_s(key, 255))
 | |
| 	/*! @} */
 | |
| 
 | |
| 
 | |
| 	void* ILibLinkedList_Create();
 | |
| 	void* ILibLinkedList_CreateEx(int userMemorySize);
 | |
| 	void ILibLinkedList_SetTag(ILibLinkedList list, void *tag);
 | |
| 	void* ILibLinkedList_GetTag(ILibLinkedList list);
 | |
| 	int ILibLinkedList_GetIndex(void *node);
 | |
| 
 | |
| 	//! Comparer delegate is called to compare two values. Mimics behavior of .NET IComparer..
 | |
| 	//! obj2 == obj1	: 0
 | |
| 	//! obj2 < obj1	: -1
 | |
| 	//! obj2 > obj1	: +1
 | |
| 	/*!
 | |
| 		\param obj1 Compare this object
 | |
| 		\param obj2 with this object
 | |
| 		\return Result [0: EQ, -1: LT, +1: GT]
 | |
| 	*/
 | |
| 	typedef int(*ILibLinkedList_Comparer)(void* obj1, void *obj2);
 | |
| 
 | |
| 	//! Chooser handler is called when a new item is to be added to Linked List. The old value is passed in as well as the new value... The return value will be the designated added node
 | |
| 	/*!
 | |
| 		\param oldObject Current Element Value [NULL if it doesn't exist]
 | |
| 		\param newObject Proposed Element Value
 | |
| 		\param user Custom user state data
 | |
| 		\return Element Value to be kept
 | |
| 	*/
 | |
| 	typedef void*(*ILibLinkedList_Chooser)(void* oldObject, void *newObject, void *user);
 | |
| 
 | |
| 	void* ILibLinkedList_SortedInsert(void* LinkedList, ILibLinkedList_Comparer comparer, void *data);
 | |
| 	void* ILibLinkedList_SortedInsertEx(void* LinkedList, ILibLinkedList_Comparer comparer, ILibLinkedList_Chooser chooser, void *data, void *user);
 | |
| 	void* ILibLinkedList_GetNode_Search(void* LinkedList, ILibLinkedList_Comparer comparer, void *matchWith);
 | |
| 
 | |
| 	void* ILibLinkedList_GetNode_Head(void *LinkedList);		// Returns Node
 | |
| 	void* ILibLinkedList_GetNode_Tail(void *LinkedList);		// Returns Node
 | |
| 	void* ILibLinkedList_GetNextNode(void *LinkedList_Node);	// Returns Node
 | |
| 	void* ILibLinkedList_GetPreviousNode(void *LinkedList_Node);// Returns Node
 | |
| 	long ILibLinkedList_GetCount(void *LinkedList);
 | |
| 	void* ILibLinkedList_ShallowCopy(void *LinkedList);
 | |
| 	void *ILibLinkedList_GetDataFromNode(void *LinkedList_Node);
 | |
| 	void* ILibLinkedList_InsertBefore(void *LinkedList_Node, void *data);
 | |
| 	void* ILibLinkedList_InsertAfter(void *LinkedList_Node, void *data);
 | |
| 	void* ILibLinkedList_Remove(void *LinkedList_Node);
 | |
| 	int ILibLinkedList_Remove_ByData(void *LinkedList, void *data);
 | |
| 	void* ILibLinkedList_AddHead(void *LinkedList, void *data);
 | |
| 	void* ILibLinkedList_AddTail(void *LinkedList, void *data);
 | |
| 	#define ILibLinkedList_Clear(LinkedList) while(ILibLinkedList_GetNode_Head(LinkedList)!=NULL){ILibLinkedList_Remove(ILibLinkedList_GetNode_Head(LinkedList));}
 | |
| 
 | |
| 	void ILibLinkedList_Lock(void *LinkedList);
 | |
| 	void ILibLinkedList_UnLock(void *LinkedList);
 | |
| 	void ILibLinkedList_Destroy(void *LinkedList);
 | |
| 	void* ILibLinkedList_GetExtendedMemory(void* LinkedList_Node);
 | |
| 	/*! 
 | |
| 	*@} 
 | |
| 	*/
 | |
| 
 | |
| 
 | |
| 
 | |
| 	/*! \defgroup HashTreeGroup Hash Table
 | |
| 	\ingroup DataStructures
 | |
| 	\b Note: Duplicate key entries will be overwritten.
 | |
| 	*@{
 | |
| 	*/
 | |
| 
 | |
| 	void* ILibInitHashTree();
 | |
| 	void* ILibInitHashTree_CaseInSensitive();
 | |
| 	void ILibDestroyHashTree(void *tree);
 | |
| 	int ILibHasEntry(void *hashtree, char* key, int keylength);
 | |
| 	void ILibAddEntry(void* hashtree, char* key, int keylength, void *value);
 | |
| 	void ILibAddEntryEx(void* hashtree, char* key, int keylength, void *value, int valueEx);
 | |
| 	void* ILibGetEntry(void *hashtree, char* key, int keylength);
 | |
| 	ILibExportMethod void ILibGetEntryEx(void *hashtree, char* key, int keylength, void **value, int *valueEx);
 | |
| 	void ILibDeleteEntry(void *hashtree, char* key, int keylength);
 | |
| 
 | |
| 	void *ILibHashTree_GetEnumerator(void *tree);
 | |
| 	void ILibHashTree_DestroyEnumerator(void *tree_enumerator);
 | |
| 	int ILibHashTree_MoveNext(void *tree_enumerator);
 | |
| 
 | |
| 	void ILibHashTree_GetValue(void *tree_enumerator, char **key, int *keyLength, void **data);
 | |
| 	void ILibHashTree_GetValueEx(void *tree_enumerator, char **key, int *keyLength, void **data, int *dataEx);
 | |
| 	void ILibHashTree_Lock(void *hashtree);
 | |
| 	void ILibHashTree_UnLock(void *hashtree);
 | |
| 
 | |
| 	/*! 
 | |
| 	*@} 
 | |
| 	*/
 | |
| 
 | |
| 	/*! \defgroup LifeTimeMonitor LifeTimeMonitor
 | |
| 	\ingroup ILibParsers
 | |
| 	\brief Timed Callback Service
 | |
| 	\par
 | |
| 	These callbacks will always be triggered on the thread that calls ILibStartChain().
 | |
| 	\{
 | |
| 	*/
 | |
| 
 | |
| 	typedef void(*ILibLifeTime_OnCallback)(void *obj);
 | |
| 
 | |
| 	//
 | |
| 	// Adds an event trigger to be called after the specified time elapses, with the
 | |
| 	// specified data object
 | |
| 	//
 | |
| #define ILibLifeTime_Add(LifetimeMonitorObject, data, seconds, Callback, Destroy) ILibLifeTime_AddEx(LifetimeMonitorObject, data, seconds * 1000, Callback, Destroy)
 | |
| 	void ILibLifeTime_AddEx(void *LifetimeMonitorObject,void *data, int milliseconds, ILibLifeTime_OnCallback Callback, ILibLifeTime_OnCallback Destroy);
 | |
| 
 | |
| 	//
 | |
| 	// Removes all event triggers that contain the specified data object.
 | |
| 	//
 | |
| 	void ILibLifeTime_Remove(void *LifeTimeToken, void *data);
 | |
| 
 | |
| 	//
 | |
| 	// Return the expiration time for an event
 | |
| 	//
 | |
| 	long long ILibLifeTime_GetExpiration(void *LifetimeMonitorObject, void *data);
 | |
| 
 | |
| 	//
 | |
| 	// Removes all events triggers
 | |
| 	//
 | |
| 	void ILibLifeTime_Flush(void *LifeTimeToken);
 | |
| 	void *ILibCreateLifeTime(void *Chain);
 | |
| 	long ILibLifeTime_Count(void* LifeTimeToken);
 | |
| 
 | |
| 	/* \} */
 | |
| 
 | |
| 
 | |
| 	/*! \defgroup StringParsing String Parsing
 | |
| 	\ingroup ILibParsers
 | |
| 	\{
 | |
| 	*/
 | |
| 
 | |
| 	int ILibFindEntryInTable(char *Entry, char **Table);
 | |
| 
 | |
| 
 | |
| 	int ILibTrimString(char **theString, int length);
 | |
| 	int ILibString_IndexOfFirstWhiteSpace(const char *inString, int inStringLength);
 | |
| 	char* ILibString_Cat(const char *inString1, int inString1Len, const char *inString2, int inString2Len);
 | |
| 	char* ILibString_Cat_s(char *destination, size_t destinationSize, char *source);
 | |
| 	char *ILibString_Copy(const char *inString, int length);
 | |
| 	int ILibString_Copy_s(char *destination, size_t destinationSize, char *source);
 | |
| 	int ILibString_n_Copy_s(char *destination, size_t destinationSize, char *source, size_t count);
 | |
| 	int ILibString_EndsWith(const char *inString, int inStringLength, const char *endWithString, int endWithStringLength);
 | |
| 	int ILibString_EndsWithEx(const char *inString, int inStringLength, const char *endWithString, int endWithStringLength, int caseSensitive);
 | |
| 	int ILibString_StartsWith(const char *inString, int inStringLength, const char *startsWithString, int startsWithStringLength);
 | |
| 	int ILibString_StartsWithEx(const char *inString, int inStringLength, const char *startsWithString, int startsWithStringLength, int caseSensitive);
 | |
| 	int ILibString_IndexOfEx(const char *inString, int inStringLength, const char *indexOf, int indexOfLength, int caseSensitive);
 | |
| 	int ILibString_IndexOf(const char *inString, int inStringLength, const char *indexOf, int indexOfLength);
 | |
| 	int ILibString_LastIndexOf(const char *inString, int inStringLength, const char *lastIndexOf, int lastIndexOfLength);
 | |
| 	int ILibString_LastIndexOfEx(const char *inString, int inStringLength, const char *lastIndexOf, int lastIndexOfLength, int caseSensitive);
 | |
| 	char *ILibString_Replace(const char *inString, int inStringLength, const char *replaceThis, int replaceThisLength, const char *replaceWithThis, int replaceWithThisLength);
 | |
| 	char *ILibString_ToUpper(const char *inString, int length);
 | |
| 	char *ILibString_ToLower(const char *inString, int length);
 | |
| 	void ILibToUpper(const char *in, int inLength, char *out);
 | |
| 	void ILibToLower(const char *in, int inLength, char *out);
 | |
| #if !defined(WIN32)
 | |
| 	#ifndef strcat_s
 | |
| 		#define strcat_s(destination, destinationSize, source) ILibString_Cat_s(destination, destinationSize, source)
 | |
| 	#endif
 | |
| 	#ifndef strcpy_s
 | |
| 		#define strcpy_s(destination, destinationSize, source) ILibString_Copy_s(destination, destinationSize, source);
 | |
| 	#endif
 | |
| #endif
 | |
| 
 | |
| 	struct parser_result* ILibParseString (char* buffer, int offset, int length, const char* Delimiter, int DelimiterLength);
 | |
| 	struct parser_result* ILibParseStringAdv (char* buffer, int offset, int length, const char* Delimiter, int DelimiterLength);
 | |
| 	parser_result_field* ILibParseString_GetResultIndex(parser_result* r, int index);
 | |
| 	void ILibDestructParserResults(struct parser_result *result);
 | |
| 
 | |
| 	typedef enum ILibParseUriResult
 | |
| 	{
 | |
| 		ILibParseUriResult_UNKNOWN_SCHEME = 0,
 | |
| 		ILibParseUriResult_NO_TLS = 1,
 | |
| 		ILibParseUriResult_TLS = 2
 | |
| 	}ILibParseUriResult;
 | |
| 
 | |
| 	ILibParseUriResult ILibParseUri(const char* URI, char** Addr, unsigned short* Port, char** Path, struct sockaddr_in6* AddrStruct);
 | |
| 
 | |
| 	int ILibGetLong(char *TestValue, int TestValueLength, long* NumericValue);
 | |
| 	int ILibGetULong(const char *TestValue, const int TestValueLength, unsigned long* NumericValue);
 | |
| 	int ILibFragmentText(char *text, int textLength, char *delimiter, int delimiterLength, int tokenLength, char **RetVal);
 | |
| 	int ILibFragmentTextLength(char *text, int textLength, char *delimiter, int delimiterLength, int tokenLength);
 | |
| 
 | |
| 
 | |
| 	/* Base64 handling methods */
 | |
| 	int ILibBase64EncodeLength(const int inputLen);
 | |
| 	int ILibBase64DecodeLength(const int inputLen);
 | |
| 	int ILibBase64Encode(unsigned char* input, const int inputlen, unsigned char** output);
 | |
| 	int ILibBase64Decode(unsigned char* input, const int inputlen, unsigned char** output);
 | |
| 
 | |
| 	/* Compression Handling Methods */
 | |
| 	char* ILibDecompressString(unsigned char* CurrentCompressed, const int bufferLength, const int DecompressedLength);
 | |
| 
 | |
| 	/* \} */
 | |
| 
 | |
| 
 | |
| 	/*! \defgroup PacketParsing Packet Parsing
 | |
| 	\ingroup ILibParsers
 | |
| 	\{
 | |
| 	*/
 | |
| 
 | |
| 	/* Packet Methods */
 | |
| 
 | |
| 	struct packetheader *ILibCreateEmptyPacket();
 | |
| 	void ILibAddHeaderLine(struct packetheader *packet, const char* FieldName, int FieldNameLength, const char* FieldData, int FieldDataLength);
 | |
| 	void ILibDeleteHeaderLine(struct packetheader *packet, char* FieldName, int FieldNameLength);
 | |
| 	void ILibHTTPPacket_Stash_Put(ILibHTTPPacket *packet, char* key, int keyLen, void *data);
 | |
| 	int ILibHTTPPacket_Stash_HasKey(ILibHTTPPacket *packet, char* key, int keyLen);
 | |
| 	void* ILibHTTPPacket_Stash_Get(ILibHTTPPacket *packet, char* key, int keyLen);
 | |
| 
 | |
| 	char* ILibUrl_GetHost(char *url, int urlLen);
 | |
| 	#define ILibGetHeaderLine(packet,  FieldName, FieldNameLength) ILibGetHeaderLineEx(packet, FieldName, FieldNameLength, NULL)
 | |
| 	char* ILibGetHeaderLineEx(struct packetheader *packet, char* FieldName, int FieldNameLength, int *len);
 | |
| 	char* ILibGetHeaderLineSP(struct packetheader *packet, char* FieldName, int FieldNameLength);
 | |
| 	char* ILibGetHeaderLineSP_Next(char* PreviousValue, char* FieldName, int FieldNameLength);
 | |
| 	void ILibSetVersion(struct packetheader *packet, char* Version, int VersionLength);
 | |
| 	void ILibSetStatusCode(struct packetheader *packet, int StatusCode, char* StatusData, int StatusDataLength);
 | |
| 	void ILibSetDirective(struct packetheader *packet, char* Directive, int DirectiveLength, char* DirectiveObj, int DirectiveObjLength);
 | |
| 	void ILibDestructPacket(struct packetheader *packet);
 | |
| 	struct packetheader* ILibParsePacketHeader(char* buffer, int offset, int length);
 | |
| 	int ILibGetRawPacket(struct packetheader *packet,char **buffer);
 | |
| 	struct packetheader* ILibClonePacket(struct packetheader *packet);
 | |
| 
 | |
| 	int ILibHTTPEscapeEx(char* outdata, const char* indata, size_t indataLen);
 | |
| 	int ILibHTTPEscapeLengthEx(const char* data, size_t dataLen);
 | |
| 	#define ILibHTTPEscape(outdata, indata) ILibHTTPEscapeEx(outdata, indata, strnlen_s(indata, sizeof(ILibScratchPad)))
 | |
| 	#define ILibHTTPEscapeLength(data) ILibHTTPEscapeLengthEx(data, strnlen_s(data, sizeof(ILibScratchPad)))
 | |
| 
 | |
| 	int ILibInPlaceHTTPUnEscapeEx(char* data, int length);
 | |
| 	#define ILibInPlaceHTTPUnEscape(data) ILibInPlaceHTTPUnEscapeEx(data, (int)strnlen_s(data, sizeof(ILibScratchPad)))
 | |
| 	/* \} */
 | |
| 
 | |
| 	void* dbg_malloc(int sz);
 | |
| 	void dbg_free(void* ptr);
 | |
| 	int dbg_GetCount();
 | |
| 
 | |
| 	/*! \defgroup NetworkHelper Network Helper
 | |
| 	\ingroup ILibParsers
 | |
| 	*@{
 | |
| 	*/
 | |
| 
 | |
| 	int ILibGetLocalIPv6IndexList(int** indexlist);
 | |
| 	int ILibGetLocalIPv6List(struct sockaddr_in6** list);
 | |
| 	int ILibGetLocalIPAddressList(int** pp_int);
 | |
| 	int ILibGetLocalIPv4AddressList(struct sockaddr_in** addresslist, int includeloopback);
 | |
| 	//int ILibGetLocalIPv6AddressList(struct sockaddr_in6** addresslist);
 | |
| 
 | |
| #if defined(WINSOCK2)
 | |
| 	int ILibGetLocalIPAddressNetMask(unsigned int address);
 | |
| #endif
 | |
| 
 | |
| 	SOCKET ILibGetSocket(struct sockaddr *localif, int type, int protocol);
 | |
| 
 | |
| 	//
 | |
| 	// IPv6 helper methods
 | |
| 	//
 | |
| 	void ILibMakeIPv6Addr(struct sockaddr *addr4, struct sockaddr_in6* addr6);
 | |
| 	int ILibMakeHttpHeaderAddr(struct sockaddr *addr, char** str);
 | |
| 	int ILibIsIPv4MappedAddr(struct sockaddr *addr);
 | |
| 	int ILibIsLoopback(struct sockaddr *addr);
 | |
| 	int ILibGetAddrBlob(struct sockaddr *addr, char** ptr);
 | |
| 	void ILibGetAddrFromBlob(char* ptr, int len, unsigned short port, struct sockaddr_in6 *addr);
 | |
| 	int ILibDetectIPv6Support();
 | |
| 	extern int g_ILibDetectIPv6Support;
 | |
| 	char* ILibInet_ntop2(struct sockaddr* addr, char *dst, size_t dstsize);
 | |
| 	char* ILibInet_ntop(int af, const void *src, char *dst, size_t dstsize);
 | |
| 	int ILibInet_pton(int af, const char *src, void *dst);
 | |
| 	int ILibInetCompare(struct sockaddr* addr1, struct sockaddr* addr2, int compare);	// Compare=1 family only, 2 family and address, 3 familly, address and port.
 | |
| 	int ILibResolve(char* hostname, char* service, struct sockaddr_in6* addr6);
 | |
| 	int ILibResolveEx(char* hostname, unsigned short port, struct sockaddr_in6* addr6);
 | |
| 	void ILib6to4(struct sockaddr* addr);
 | |
| 	#define ILibInet_StructSize(addr) ((((struct sockaddr*)(addr))->sa_family == AF_INET6)?sizeof(struct sockaddr_in6):sizeof(struct sockaddr_in))
 | |
| 	/*! @} */
 | |
| 	//
 | |
| 	// Used to log critical problems
 | |
| 	//
 | |
| 	char* ILibChain_Debug(void *chain, char* buffer, int bufferLen);
 | |
| 	void ILibChain_DebugOffset(char *buffer, int bufferLen, uint64_t addrOffset);
 | |
| 
 | |
| #if defined(WIN32)
 | |
| 	int ILib_WindowsExceptionFilter(DWORD exceptionCode, void *exceptionInfo, CONTEXT *exceptionContext);
 | |
| 	void ILib_WindowsExceptionDebug(CONTEXT *exceptionContext);
 | |
| #elif defined(_POSIX)
 | |
| 	char* ILib_POSIX_InstallCrashHandler(char *exename);
 | |
| #endif
 | |
| 
 | |
| #define ILIBCRITICALEXITMSG(code, msg) {printf("%s", ILibCriticalLog(msg, NULL, 0, 0, 0)); exit(code);}
 | |
| #if defined(WIN32)
 | |
| #define ILIBCRITICALERREXIT(ex) { ILibCriticalLog(NULL, __FILE__, __LINE__, GetLastError(), 0); exit(ex); }
 | |
| #define ILIBCRITICALEXIT(ex) {ILibCriticalLog(NULL, __FILE__, __LINE__, ex, GetLastError());printf("CRITICALEXIT, FILE: %s, LINE: %d\r\n", __FILE__, __LINE__); exit(ex);}
 | |
| #define ILIBCRITICALEXIT2(ex,u) {ILibCriticalLog(NULL, __FILE__, __LINE__, ex, u); printf("CRITICALEXIT2, FILE: %s, LINE: %d\r\n", __FILE__, __LINE__); exit(ex);}
 | |
| #define ILIBCRITICALEXIT3(ex,m,u) {ILibCriticalLog(m, __FILE__, __LINE__, ex, u); printf("CRITICALEXIT3, FILE: %s, LINE: %d\r\nMessage: %s\r\n", __FILE__, __LINE__, m); exit(ex);}
 | |
| #define ILIBMARKPOSITION(ex) {ILibCriticalLog(NULL, __FILE__, __LINE__, ex, GetLastError());}
 | |
| #define ILIBMESSAGE(m) {ILibCriticalLog(m, __FILE__, __LINE__, 0, GetLastError());printf("ILIBMSG: %s (%d).\r\n", m, (int)GetLastError());}
 | |
| #define ILIBMESSAGE2(m,u) {ILibCriticalLog(m, __FILE__, __LINE__, u, GetLastError());printf("ILIBMSG: %s (%d,%d).\r\n", m, (int)u, (int)GetLastError());}
 | |
| #else
 | |
| extern void ILib_POSIX_CrashHandler(int code);
 | |
| #define ILIBCRITICALERREXIT(ex) { ILibCriticalLog(NULL, __FILE__, __LINE__, errno, 0); fflush(stdout); exit(ex); }
 | |
| #ifdef _POSIX
 | |
| #define ILIBCRITICALEXIT(ex) ILib_POSIX_CrashHandler(ex);
 | |
| #else
 | |
| #define ILIBCRITICALEXIT(ex) {ILibCriticalLog(NULL, __FILE__, __LINE__, ex, errno); printf("CRITICALEXIT, FILE: %s, LINE: %d\r\n", __FILE__, __LINE__); fflush(stdout); exit(ex); }
 | |
| #endif
 | |
| #define ILIBCRITICALEXIT2(ex,u) {ILibCriticalLog(NULL, __FILE__, __LINE__, ex, u); printf("CRITICALEXIT2, FILE: %s, LINE: %d\r\n", __FILE__, __LINE__);fflush(stdout); exit(ex);}
 | |
| #define ILIBCRITICALEXIT3(ex,m,u) {ILibCriticalLog(m, __FILE__, __LINE__, ex, u); printf("CRITICALEXIT3, FILE: %s, LINE: %d\r\n", __FILE__, __LINE__);fflush(stdout); exit(ex);}
 | |
| #define ILIBMARKPOSITION(ex) {ILibCriticalLog(NULL, __FILE__, __LINE__, ex, errno);}
 | |
| #define ILIBMESSAGE(m) {ILibCriticalLog(m, __FILE__, __LINE__, 0, errno);printf("ILIBMSG: %s\r\n", m);fflush(stdout);}
 | |
| #define ILIBMESSAGE2(m,u) {ILibCriticalLog(m, __FILE__, __LINE__, u, errno);printf("ILIBMSG: %s (%d)\r\n", m, u);fflush(stdout);}
 | |
| #endif
 | |
| 
 | |
| 	char* ILibCriticalLog(const char* msg, const char* file, int line, int user1, int user2);
 | |
| 
 | |
| 	/*! \defgroup ThreadingHelper Threading Helper
 | |
| 	\ingroup ILibParsers
 | |
| 	*@{
 | |
| 	*/
 | |
| 	void* ILibSpawnNormalThread(voidfp1 method, void* arg);
 | |
| 	void  ILibEndThisThread();
 | |
| #ifdef WIN32
 | |
| 	void ILibHandle_DisableInherit(HANDLE *h);
 | |
| #endif
 | |
| 	/*! @} */
 | |
| 
 | |
| 
 | |
| 	/*! \defgroup ConversionGroup Conversion Utilities
 | |
| 	\ingroup ILibParsers
 | |
| 	*@{
 | |
| 	*/
 | |
| 	char* ILibToHex(char* data, int len, char* out);
 | |
| 	int ILibWhichPowerOfTwo(int number);
 | |
| #define ILibPowerOfTwo(exponent) (0x01 << exponent)
 | |
| 	/*! @} */
 | |
| #ifdef __cplusplus
 | |
| }
 | |
| #endif
 | |
| 
 | |
| /* \} */   // End of ILibParser Group
 | |
| #endif
 | |
| 
 |