git-svn-id: https://svn.code.sf.net/p/flaim/code/trunk@934 0109f412-320b-0410-ab79-c3e0c5ffbbe6
7056 lines
187 KiB
C++
7056 lines
187 KiB
C++
//------------------------------------------------------------------------------
|
|
// Desc: FLAIM's cross-platform toolkit public definitions and interfaces
|
|
//
|
|
// Tabs: 3
|
|
//
|
|
// Copyright (c) 2003-2006 Novell, Inc. All Rights Reserved.
|
|
//
|
|
// This program is free software; you can redistribute it and/or
|
|
// modify it under the terms of version 2 of the GNU General Public
|
|
// License as published by the Free Software Foundation.
|
|
//
|
|
// 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, contact Novell, Inc.
|
|
//
|
|
// To contact Novell about this file by physical or electronic mail,
|
|
// you may find current contact information at www.novell.com
|
|
//
|
|
// $Id$
|
|
//------------------------------------------------------------------------------
|
|
|
|
/// \file
|
|
|
|
#ifndef FTK_H
|
|
#define FTK_H
|
|
|
|
/// \defgroup retcodes Return Codes
|
|
|
|
#ifndef FLM_PLATFORM_CONFIGURED
|
|
#define FLM_PLATFORM_CONFIGURED
|
|
|
|
// Determine the build platform
|
|
|
|
#undef FLM_WIN
|
|
#undef FLM_NLM
|
|
#undef FLM_UNIX
|
|
#undef FLM_AIX
|
|
#undef FLM_LINUX
|
|
#undef FLM_SOLARIS
|
|
#undef FLM_HPUX
|
|
#undef FLM_OSX
|
|
#undef FLM_S390
|
|
#undef FLM_IA64
|
|
#undef FLM_PPC
|
|
#undef FLM_SPARC
|
|
#undef FLM_SPARC_PLUS
|
|
#undef FLM_X86
|
|
#undef FLM_BIG_ENDIAN
|
|
#undef FLM_STRICT_ALIGNMENT
|
|
#undef FLM_GNUC
|
|
#undef FLM_HAS_ASYNC_IO
|
|
#undef FLM_HAS_DIRECT_IO
|
|
|
|
#if defined( __GNUC__)
|
|
#define FLM_GNUC
|
|
#if defined( __arch64__)
|
|
#if !defined( FLM_64BIT)
|
|
#define FLM_64BIT
|
|
#endif
|
|
#endif
|
|
#endif
|
|
|
|
#if defined( __NETWARE__) || defined( NLM) || defined( N_PLAT_NLM)
|
|
#if defined( __WATCOMC__) && defined( __386__)
|
|
#define FLM_X86
|
|
#else
|
|
#error Platform architecture not supported
|
|
#endif
|
|
#define FLM_NLM
|
|
#if !defined( FLM_RING_ZERO_NLM) && !defined( FLM_LIBC_NLM)
|
|
#define FLM_RING_ZERO_NLM
|
|
#endif
|
|
#define FLM_OSTYPE_STR "NetWare"
|
|
#if defined( __WATCOMC__)
|
|
#define FLM_WATCOM_NLM
|
|
#elif defined( __MWERKS__)
|
|
#define FLM_MWERKS_NLM
|
|
#endif
|
|
#if defined( FLM_RING_ZERO_NLM)
|
|
#define FLM_HAS_ASYNC_IO
|
|
#define FLM_HAS_DIRECT_IO
|
|
#endif
|
|
#elif defined( _WIN64)
|
|
#if defined( _M_IX6) || defined( _M_X64)
|
|
#define FLM_X86
|
|
#endif
|
|
#define FLM_WIN
|
|
#define FLM_OSTYPE_STR "Windows"
|
|
#ifndef FLM_64BIT
|
|
#define FLM_64BIT
|
|
#endif
|
|
#define FLM_STRICT_ALIGNMENT
|
|
#define FLM_HAS_ASYNC_IO
|
|
#define FLM_HAS_DIRECT_IO
|
|
#elif defined( _WIN32)
|
|
#if defined( _M_IX86) || defined( _M_X64)
|
|
#define FLM_X86
|
|
#else
|
|
#error Platform architecture not supported
|
|
#endif
|
|
#define FLM_WIN
|
|
#define FLM_OSTYPE_STR "Windows"
|
|
#define FLM_HAS_ASYNC_IO
|
|
#define FLM_HAS_DIRECT_IO
|
|
#elif defined( _AIX)
|
|
#define FLM_AIX
|
|
#define FLM_OSTYPE_STR "AIX"
|
|
#define FLM_UNIX
|
|
#define FLM_BIG_ENDIAN
|
|
#define FLM_STRICT_ALIGNMENT
|
|
#elif defined( linux)
|
|
#define FLM_LINUX
|
|
#define FLM_OSTYPE_STR "Linux"
|
|
#define FLM_UNIX
|
|
#if defined( __PPC__) || defined( __ppc__)
|
|
#define FLM_PPC
|
|
#define FLM_BIG_ENDIAN
|
|
#define FLM_STRICT_ALIGNMENT
|
|
#elif defined( __s390__)
|
|
#define FLM_S390
|
|
#define FLM_BIG_ENDIAN
|
|
#define FLM_STRICT_ALIGNMENT
|
|
#elif defined( __s390x__)
|
|
#define FLM_S390
|
|
#ifndef FLM_64BIT
|
|
#define FLM_64BIT
|
|
#endif
|
|
#define FLM_BIG_ENDIAN
|
|
#define FLM_STRICT_ALIGNMENT
|
|
#elif defined( __ia64__)
|
|
#define FLM_IA64
|
|
#ifndef FLM_64BIT
|
|
#define FLM_64BIT
|
|
#endif
|
|
#define FLM_STRICT_ALIGNMENT
|
|
#elif defined( sparc) || defined( __sparc) || defined( __sparc__)
|
|
#define FLM_SPARC
|
|
#define FLM_BIG_ENDIAN
|
|
#define FLM_STRICT_ALIGNMENT
|
|
#if !defined ( FLM_SPARC_GENERIC)
|
|
#if defined( __sparcv8plus) || defined( __sparcv9) || defined( __sparcv9__) || \
|
|
defined( __sparc_v8__) || defined( __sparc_v9__) || defined( __arch64__)
|
|
#define FLM_SPARC_PLUS
|
|
#endif
|
|
#endif
|
|
#elif defined( __x86__) || defined( __i386__) || defined( __x86_64__)
|
|
#define FLM_X86
|
|
#else
|
|
#error Platform architecture not supported
|
|
#endif
|
|
#define FLM_HAS_ASYNC_IO
|
|
#define FLM_HAS_DIRECT_IO
|
|
#elif defined( sun)
|
|
#define FLM_SOLARIS
|
|
#define FLM_OSTYPE_STR "Solaris"
|
|
#define FLM_UNIX
|
|
#define FLM_STRICT_ALIGNMENT
|
|
#if defined( sparc) || defined( __sparc) || defined( __sparc__)
|
|
#define FLM_SPARC
|
|
#define FLM_BIG_ENDIAN
|
|
#if !defined ( FLM_SPARC_GENERIC)
|
|
#if defined( __sparcv8plus) || defined( __sparcv9)
|
|
#define FLM_SPARC_PLUS
|
|
#endif
|
|
#endif
|
|
#elif defined( i386) || defined( _i386)
|
|
#define FLM_X86
|
|
#else
|
|
#error Platform architecture not supported
|
|
#endif
|
|
#define FLM_HAS_ASYNC_IO
|
|
#define FLM_HAS_DIRECT_IO
|
|
#elif defined( __hpux) || defined( hpux)
|
|
#define FLM_HPUX
|
|
#define FLM_OSTYPE_STR "HPUX"
|
|
#define FLM_UNIX
|
|
#define FLM_BIG_ENDIAN
|
|
#define FLM_STRICT_ALIGNMENT
|
|
#define FLM_HAS_ASYNC_IO
|
|
#define FLM_HAS_DIRECT_IO
|
|
#elif defined( __APPLE__)
|
|
#define FLM_OSX
|
|
#define FLM_OSTYPE_STR "OSX"
|
|
#define FLM_UNIX
|
|
#if (defined( __ppc__) || defined( __ppc64__))
|
|
#define FLM_PPC
|
|
#define FLM_BIG_ENDIAN
|
|
#define FLM_STRICT_ALIGNMENT
|
|
#elif defined( __x86__) || defined( __x86_64__)
|
|
#define FLM_X86
|
|
#else
|
|
#error Platform architecture not supported
|
|
#endif
|
|
#define FLM_HAS_ASYNC_IO
|
|
#define FLM_HAS_DIRECT_IO
|
|
#else
|
|
#error Platform architecture is undefined.
|
|
#endif
|
|
|
|
#if !defined( FLM_64BIT) && !defined( FLM_32BIT)
|
|
#if defined( FLM_UNIX)
|
|
#if defined( __x86_64__) || defined( _M_X64) || \
|
|
defined( _LP64) || defined( __LP64__) || \
|
|
defined ( __64BIT__) || defined( __arch64__) || \
|
|
defined( __sparcv9) || defined( __sparcv9__)
|
|
#define FLM_64BIT
|
|
#endif
|
|
#endif
|
|
#endif
|
|
|
|
#if !defined( FLM_64BIT)
|
|
#define FLM_32BIT
|
|
#elif defined( FLM_32BIT)
|
|
#error Cannot define both FLM_32BIT and FLM_64BIT
|
|
#endif
|
|
|
|
#if defined( __x86_64__) || defined( _M_X64) || \
|
|
defined( _LP64) || defined( __LP64__) || \
|
|
defined ( __64BIT__) || defined( __arch64__) || \
|
|
defined( __sparcv9) || defined( __sparcv9__)
|
|
#if !defined( FLM_64BIT)
|
|
#error Platform word size is incorrect
|
|
#endif
|
|
#else
|
|
#if !defined( FLM_32BIT)
|
|
#error Platform word size is incorrect
|
|
#endif
|
|
#endif
|
|
|
|
#ifdef FLM_NLM
|
|
#define FSTATIC
|
|
#else
|
|
#define FSTATIC static
|
|
#endif
|
|
|
|
// Debug or release build?
|
|
|
|
#ifndef FLM_DEBUG
|
|
#if defined( DEBUG) || (defined( PRECHECKIN) && PRECHECKIN != 0)
|
|
#define FLM_DEBUG
|
|
#endif
|
|
#endif
|
|
|
|
// Alignment
|
|
|
|
#if defined( FLM_UNIX) || defined( FLM_64BIT)
|
|
#define FLM_ALLOC_ALIGN 0x0007
|
|
#define FLM_ALIGN_SIZE 8
|
|
#elif defined( FLM_WIN) || defined( FLM_NLM)
|
|
#define FLM_ALLOC_ALIGN 0x0003
|
|
#define FLM_ALIGN_SIZE 4
|
|
#else
|
|
#error Platform not supported
|
|
#endif
|
|
|
|
// Basic type definitions
|
|
|
|
#if defined( FLM_UNIX)
|
|
typedef unsigned long FLMUINT;
|
|
typedef long FLMINT;
|
|
typedef unsigned char FLMBYTE;
|
|
typedef unsigned short FLMUNICODE;
|
|
|
|
typedef unsigned long long FLMUINT64;
|
|
typedef unsigned int FLMUINT32;
|
|
typedef unsigned short FLMUINT16;
|
|
typedef unsigned char FLMUINT8;
|
|
typedef long long FLMINT64;
|
|
typedef int FLMINT32;
|
|
typedef short FLMINT16;
|
|
typedef signed char FLMINT8;
|
|
|
|
#if defined( FLM_64BIT) || defined( FLM_OSX) || \
|
|
defined( FLM_S390) || defined( FLM_HPUX) || defined( FLM_AIX)
|
|
typedef unsigned long FLMSIZET;
|
|
#else
|
|
typedef unsigned FLMSIZET;
|
|
#endif
|
|
#else
|
|
|
|
#if defined( FLM_WIN)
|
|
|
|
#if defined( FLM_64BIT)
|
|
typedef unsigned __int64 FLMUINT;
|
|
typedef __int64 FLMINT;
|
|
typedef unsigned __int64 FLMSIZET;
|
|
typedef unsigned int FLMUINT32;
|
|
#elif _MSC_VER >= 1300
|
|
typedef unsigned long __w64 FLMUINT;
|
|
typedef long __w64 FLMINT;
|
|
typedef __w64 unsigned int FLMUINT32;
|
|
typedef __w64 unsigned int FLMSIZET;
|
|
#else
|
|
typedef unsigned long FLMUINT;
|
|
typedef long FLMINT;
|
|
typedef unsigned int FLMUINT32;
|
|
typedef unsigned int FLMSIZET;
|
|
#endif
|
|
#elif defined( FLM_NLM)
|
|
|
|
typedef unsigned long int FLMUINT;
|
|
typedef long int FLMINT;
|
|
typedef unsigned long int FLMUINT32;
|
|
typedef unsigned FLMSIZET;
|
|
#else
|
|
#error Platform not supported
|
|
#endif
|
|
|
|
typedef unsigned char FLMBYTE;
|
|
typedef unsigned short int FLMUNICODE;
|
|
|
|
typedef unsigned short int FLMUINT16;
|
|
typedef unsigned char FLMUINT8;
|
|
typedef signed int FLMINT32;
|
|
typedef signed short int FLMINT16;
|
|
typedef signed char FLMINT8;
|
|
|
|
#if defined( __MWERKS__)
|
|
typedef unsigned long long FLMUINT64;
|
|
typedef long long FLMINT64;
|
|
#else
|
|
typedef unsigned __int64 FLMUINT64;
|
|
typedef __int64 FLMINT64;
|
|
#endif
|
|
|
|
#endif
|
|
|
|
#if defined( FLM_WIN) || defined( FLM_NLM)
|
|
#define FLMATOMIC volatile long
|
|
#else
|
|
#define FLMATOMIC volatile int
|
|
#endif
|
|
|
|
/// \addtogroup retcodes
|
|
/// @{
|
|
typedef FLMINT32 RCODE; ///< Return code
|
|
/// @}
|
|
typedef FLMINT32 FLMBOOL;
|
|
|
|
#define F_FILENAME_SIZE 256
|
|
#define F_PATH_MAX_SIZE 256
|
|
#define F_WAITFOREVER (0xFFFFFFFF)
|
|
|
|
#define FLM_MAX_UINT ((FLMUINT)(-1L))
|
|
#define FLM_MAX_INT ((FLMINT)(((FLMUINT)(-1L)) >> 1))
|
|
#define FLM_MIN_INT ((FLMINT)((((FLMUINT)(-1L)) >> 1) + 1))
|
|
#define FLM_MAX_UINT32 ((FLMUINT32)(0xFFFFFFFFL))
|
|
#define FLM_MAX_INT32 ((FLMINT32)(0x7FFFFFFFL))
|
|
#define FLM_MIN_INT32 ((FLMINT32)(0x80000000L))
|
|
#define FLM_MAX_UINT16 ((FLMUINT16)(0xFFFF))
|
|
#define FLM_MAX_INT16 ((FLMINT16)(0x7FFF))
|
|
#define FLM_MIN_INT16 ((FLMINT16)(0x8000))
|
|
#define FLM_MAX_UINT8 ((FLMUINT8)0xFF)
|
|
|
|
#if ((_MSC_VER >= 1200) && (_MSC_VER < 1300)) || defined( FLM_NLM)
|
|
#define FLM_MAX_UINT64 ((FLMUINT64)(0xFFFFFFFFFFFFFFFFL))
|
|
#define FLM_MAX_INT64 ((FLMINT64)(0x7FFFFFFFFFFFFFFFL))
|
|
#define FLM_MIN_INT64 ((FLMINT64)(0x8000000000000000L))
|
|
#else
|
|
#define FLM_MAX_UINT64 ((FLMUINT64)(0xFFFFFFFFFFFFFFFFLL))
|
|
#define FLM_MAX_INT64 ((FLMINT64)(0x7FFFFFFFFFFFFFFFLL))
|
|
#define FLM_MIN_INT64 ((FLMINT64)(0x8000000000000000LL))
|
|
#endif
|
|
|
|
#endif
|
|
|
|
// xpcselany keeps MS compilers from complaining about multiple definitions
|
|
|
|
#if defined(_MSC_VER)
|
|
#define xpcselany __declspec(selectany)
|
|
#else
|
|
#define xpcselany
|
|
#endif
|
|
|
|
typedef struct
|
|
{
|
|
FLMUINT32 l;
|
|
FLMUINT16 w1;
|
|
FLMUINT16 w2;
|
|
FLMUINT8 b[ 8];
|
|
} FLM_GUID;
|
|
|
|
#define RFLMIID const FLM_GUID &
|
|
#define RFLMCLSID const FLM_GUID &
|
|
#define FLMGUID FLM_GUID
|
|
#define FLMCLSID FLM_GUID
|
|
|
|
// FLM_DEFINE_GUID may be used to define or declare a GUID
|
|
// #define FLM_INIT_GUID before including this header file when
|
|
// you want to define the guid, all other inclusions will only declare
|
|
// the guid, not define it.
|
|
|
|
#if !defined( PCOM_INIT_GUID)
|
|
#define FLM_DEFINE_GUID( name, l, w1, w2, b1, b2, b3, b4, b5, b6, b7, b8) \
|
|
extern const FLMGUID name
|
|
#else
|
|
#define FLM_DEFINE_GUID( name, l, w1, w2, b1, b2, b3, b4, b5, b6, b7, b8) \
|
|
extern const xpcselany FLMGUID name \
|
|
= { l, w1, w2, { b1, b2, b3, b4, b5, b6, b7, b8 } }
|
|
#endif
|
|
|
|
#define FLMEXTC extern "C"
|
|
|
|
#if defined( FLM_WIN)
|
|
#define FLMAPI __stdcall
|
|
#define FLMEXP __declspec(dllexport)
|
|
#ifdef FLM_DEBUG
|
|
#define FINLINE inline
|
|
#else
|
|
#define FINLINE __forceinline
|
|
#endif
|
|
#elif defined( FLM_NLM)
|
|
#define FLMAPI __stdcall
|
|
#define FLMEXP
|
|
#define FINLINE inline
|
|
#elif defined( FLM_UNIX)
|
|
#define FLMAPI
|
|
#define FLMEXP
|
|
#define FINLINE inline
|
|
#else
|
|
#error Platform not supported
|
|
#endif
|
|
|
|
/****************************************************************************
|
|
Desc: Argument lists
|
|
****************************************************************************/
|
|
|
|
#define f_alignedsize(n) \
|
|
((sizeof(n) + FLM_ALIGN_SIZE - 1) & ~(FLM_ALIGN_SIZE - 1) )
|
|
|
|
#if defined( FLM_RING_ZERO_NLM)
|
|
#define f_argsize(x) \
|
|
((sizeof(x)+sizeof(int)-1) & ~(sizeof(int)-1))
|
|
|
|
typedef unsigned long f_va_list;
|
|
|
|
#define f_va_start(ap, parmN) \
|
|
((void)((ap) = (unsigned long)&(parmN) + f_argsize(parmN)))
|
|
|
|
#define f_va_arg(ap, type) \
|
|
(*(type *)(((ap) += f_argsize(type)) - (f_argsize(type))))
|
|
|
|
#define f_va_end(ap) ((void)0)
|
|
#else
|
|
#include <stdarg.h>
|
|
#define f_va_list va_list
|
|
#define f_va_start va_start
|
|
#define f_va_arg va_arg
|
|
#define f_va_end va_end
|
|
#endif
|
|
|
|
// flmnovtbl keeps MS compilers from generating vtables for interfaces
|
|
|
|
#ifdef _MSC_VER
|
|
#define flmnovtbl __declspec( novtable)
|
|
#else
|
|
#define flmnovtbl
|
|
#endif
|
|
|
|
#define flminterface struct flmnovtbl
|
|
|
|
/****************************************************************************
|
|
Desc: General errors
|
|
****************************************************************************/
|
|
/// \addtogroup retcodes
|
|
/// @{
|
|
|
|
#define NE_FLM_OK 0 ///< 0 - Operation was successful.
|
|
|
|
// Error codes that need to be the same as they were for FLAIM
|
|
|
|
#define NE_FLM_BOF_HIT 0xC001 ///< 0xC001 - Beginning of results encountered.
|
|
#define NE_FLM_EOF_HIT 0xC002 ///< 0xC002 - End of results encountered.
|
|
#define NE_FLM_EXISTS 0xC004 ///< 0xC004 - Object already exists.
|
|
#define NE_FLM_FAILURE 0xC005 ///< 0xC005 - Internal failure.
|
|
#define NE_FLM_NOT_FOUND 0xC006 ///< 0xC006 - An object was not found.
|
|
#define NE_FLM_BTREE_ERROR 0xC012 ///< 0xC012 - Corruption found in b-tree.
|
|
#define NE_FLM_BTREE_FULL 0xC013 ///< 0xC013 - B-tree cannot grow beyond current size.
|
|
#define NE_FLM_CONV_DEST_OVERFLOW 0xC01C ///< 0xC01C - Destination buffer not large enough to hold data.
|
|
#define NE_FLM_CONV_ILLEGAL 0xC01D ///< 0xC01D - Attempt to convert between data types is an unsupported conversion.
|
|
#define NE_FLM_CONV_NUM_OVERFLOW 0xC020 ///< 0xC020 - Numeric overflow (> upper bound) converting to numeric type.
|
|
#define NE_FLM_DATA_ERROR 0xC022 ///< 0xC022 - Corruption found in b-tree.
|
|
#define NE_FLM_ILLEGAL_OP 0xC026 ///< 0xC026 - Illegal operation
|
|
#define NE_FLM_MEM 0xC037 ///< 0xC037 - Attempt to allocate memory failed.
|
|
#define NE_FLM_NOT_UNIQUE 0xC03E ///< 0xC03E - Non-unique key.
|
|
#define NE_FLM_SYNTAX 0xC045 ///< 0xC045 - Syntax error while parsing.
|
|
#define NE_FLM_NOT_IMPLEMENTED 0xC05F ///< 0xC05F - Attempt was made to use a feature that is not implemented.
|
|
#define NE_FLM_INVALID_PARM 0xC08B ///< 0xC08B - Invalid parameter passed into a function.
|
|
|
|
// I/O Errors - Must be the same as they were for FLAIM.
|
|
|
|
#define NE_FLM_IO_ACCESS_DENIED 0xC201 ///< 0xC201 - Access to file is denied.\ Caller is not allowed access to a file.
|
|
#define NE_FLM_IO_BAD_FILE_HANDLE 0xC202 ///< 0xC202 - Bad file handle or file descriptor.
|
|
#define NE_FLM_IO_COPY_ERR 0xC203 ///< 0xC203 - Error occurred while copying a file.
|
|
#define NE_FLM_IO_DISK_FULL 0xC204 ///< 0xC204 - Disk full.
|
|
#define NE_FLM_IO_END_OF_FILE 0xC205 ///< 0xC205 - End of file reached while reading from the file.
|
|
#define NE_FLM_IO_OPEN_ERR 0xC206 ///< 0xC206 - Error while opening the file.
|
|
#define NE_FLM_IO_SEEK_ERR 0xC207 ///< 0xC207 - Error occurred while positioning (seeking) within a file.
|
|
#define NE_FLM_IO_DIRECTORY_ERR 0xC208 ///< 0xC208 - Error occurred while accessing or deleting a directory.
|
|
#define NE_FLM_IO_PATH_NOT_FOUND 0xC209 ///< 0xC209 - File not found.
|
|
#define NE_FLM_IO_TOO_MANY_OPEN_FILES 0xC20A ///< 0xC20A - Too many files open.
|
|
#define NE_FLM_IO_PATH_TOO_LONG 0xC20B ///< 0xC20B - File name too long.
|
|
#define NE_FLM_IO_NO_MORE_FILES 0xC20C ///< 0xC20C - No more files in directory.
|
|
#define NE_FLM_IO_DELETING_FILE 0xC20D ///< 0xC20D - Error occurred while deleting a file.
|
|
#define NE_FLM_IO_FILE_LOCK_ERR 0xC20E ///< 0xC20E - Error attempting to acquire a byte-range lock on a file.
|
|
#define NE_FLM_IO_FILE_UNLOCK_ERR 0xC20F ///< 0xC20F - Error attempting to release a byte-range lock on a file.
|
|
#define NE_FLM_IO_PATH_CREATE_FAILURE 0xC210 ///< 0xC210 - Error occurred while attempting to create a directory or sub-directory.
|
|
#define NE_FLM_IO_RENAME_FAILURE 0xC211 ///< 0xC211 - Error occurred while renaming a file.
|
|
#define NE_FLM_IO_INVALID_PASSWORD 0xC212 ///< 0xC212 - Invalid file password.
|
|
#define NE_FLM_SETTING_UP_FOR_READ 0xC213 ///< 0xC213 - Error occurred while setting up to perform a file read operation.
|
|
#define NE_FLM_SETTING_UP_FOR_WRITE 0xC214 ///< 0xC214 - Error occurred while setting up to perform a file write operation.
|
|
#define NE_FLM_IO_CANNOT_REDUCE_PATH 0xC215 ///< 0xC215 - Cannot reduce file name into more components.
|
|
#define NE_FLM_INITIALIZING_IO_SYSTEM 0xC216 ///< 0xC216 - Error occurred while setting up to access the file system.
|
|
#define NE_FLM_FLUSHING_FILE 0xC217 ///< 0xC217 - Error occurred while flushing file data buffers to disk.
|
|
#define NE_FLM_IO_INVALID_FILENAME 0xC218 ///< 0xC218 - Invalid file name.
|
|
#define NE_FLM_IO_CONNECT_ERROR 0xC219 ///< 0xC219 - Error connecting to a remote network resource.
|
|
#define NE_FLM_OPENING_FILE 0xC21A ///< 0xC21A - Unexpected error occurred while opening a file.
|
|
#define NE_FLM_DIRECT_OPENING_FILE 0xC21B ///< 0xC21B - Unexpected error occurred while opening a file in direct access mode.
|
|
#define NE_FLM_CREATING_FILE 0xC21C ///< 0xC21C - Unexpected error occurred while creating a file.
|
|
#define NE_FLM_DIRECT_CREATING_FILE 0xC21D ///< 0xC21D - Unexpected error occurred while creating a file in direct access mode.
|
|
#define NE_FLM_READING_FILE 0xC21E ///< 0xC21E - Unexpected error occurred while reading a file.
|
|
#define NE_FLM_DIRECT_READING_FILE 0xC21F ///< 0xC21F - Unexpected error occurred while reading a file in direct access mode.
|
|
#define NE_FLM_WRITING_FILE 0xC220 ///< 0xC220 - Unexpected error occurred while writing to a file.
|
|
#define NE_FLM_DIRECT_WRITING_FILE 0xC221 ///< 0xC221 - Unexpected error occurred while writing a file in direct access mode.
|
|
#define NE_FLM_POSITIONING_IN_FILE 0xC222 ///< 0xC222 - Unexpected error occurred while positioning within a file.
|
|
#define NE_FLM_GETTING_FILE_SIZE 0xC223 ///< 0xC223 - Unexpected error occurred while getting a file's size.
|
|
#define NE_FLM_TRUNCATING_FILE 0xC224 ///< 0xC224 - Unexpected error occurred while truncating a file.
|
|
#define NE_FLM_PARSING_FILE_NAME 0xC225 ///< 0xC225 - Unexpected error occurred while parsing a file's name.
|
|
#define NE_FLM_CLOSING_FILE 0xC226 ///< 0xC226 - Unexpected error occurred while closing a file.
|
|
#define NE_FLM_GETTING_FILE_INFO 0xC227 ///< 0xC227 - Unexpected error occurred while getting information about a file.
|
|
#define NE_FLM_EXPANDING_FILE 0xC228 ///< 0xC228 - Unexpected error occurred while expanding a file.
|
|
#define NE_FLM_GETTING_FREE_BLOCKS 0xC229 ///< 0xC229 - Unexpected error getting free blocks from file system.
|
|
#define NE_FLM_CHECKING_FILE_EXISTENCE 0xC22A ///< 0xC22A - Unexpected error occurred while checking to see if a file exists.
|
|
#define NE_FLM_RENAMING_FILE 0xC22B ///< 0xC22B - Unexpected error occurred while renaming a file.
|
|
#define NE_FLM_SETTING_FILE_INFO 0xC22C ///< 0xC22C - Unexpected error occurred while setting a file's information.
|
|
#define NE_FLM_IO_PENDING 0xC22D ///< 0xC22D - I/O has not yet completed
|
|
#define NE_FLM_ASYNC_FAILED 0xC22E ///< 0xC22E - An async I/O operation failed
|
|
#define NE_FLM_MISALIGNED_IO 0xC22F ///< 0xC22F - Misaligned buffer or offset encountered during I/O request
|
|
|
|
// Stream Errors - These are new
|
|
|
|
#define NE_FLM_STREAM_DECOMPRESS_ERROR 0xC400 ///< 0xC400 - Error decompressing data stream.
|
|
#define NE_FLM_STREAM_NOT_COMPRESSED 0xC401 ///< 0xC401 - Attempting to decompress a data stream that is not compressed.
|
|
#define NE_FLM_STREAM_TOO_MANY_FILES 0xC402 ///< 0xC402 - Too many files in input stream.
|
|
|
|
// Miscellaneous new toolkit errors
|
|
|
|
#define NE_FLM_COULD_NOT_CREATE_SEMAPHORE 0xC500 ///< 0xC500 - Could not create a semaphore.
|
|
#define NE_FLM_BAD_UTF8 0xC501 ///< 0xC501 - An invalid byte sequence was found in a UTF-8 string
|
|
#define NE_FLM_ERROR_WAITING_ON_SEMAPHORE 0xC502 ///< 0xC502 - Error occurred while waiting on a sempahore.
|
|
#define NE_FLM_BAD_SEN 0xC503 ///< 0xC503 - Invalid simple encoded number.
|
|
#define NE_FLM_COULD_NOT_START_THREAD 0xC504 ///< 0xC504 - Problem starting a new thread.
|
|
#define NE_FLM_BAD_BASE64_ENCODING 0xC505 ///< 0xC505 - Invalid base64 sequence encountered.
|
|
#define NE_FLM_STREAM_EXISTS 0xC506 ///< 0xC506 - Stream file already exists.
|
|
#define NE_FLM_MULTIPLE_MATCHES 0xC507 ///< 0xC507 - Multiple items matched but only one match was expected.
|
|
#define NE_FLM_BTREE_KEY_SIZE 0xC508 ///< 0xC508 - Invalid b-tree key size.
|
|
#define NE_FLM_BTREE_BAD_STATE 0xC509 ///< 0xC509 - B-tree operation cannot be completed.
|
|
#define NE_FLM_COULD_NOT_CREATE_MUTEX 0xC50A ///< 0xC50A - Error occurred while creating or initializing a mutex.
|
|
#define NE_FLM_BAD_PLATFORM_FORMAT 0xC50B ///< 0xC50B - In-memory alignment of disk structures is incorrect
|
|
#define NE_FLM_LOCK_REQ_TIMEOUT 0xC50C ///< 0xC50C - Timeout while waiting for a lock object
|
|
#define NE_FLM_WAIT_TIMEOUT 0xC50D ///< 0xC50D - Timeout while waiting on a semaphore, condition variable, or reader/writer lock
|
|
|
|
// Network Errors - Must be the same as they were for FLAIM
|
|
|
|
#define NE_FLM_NOIP_ADDR 0xC900 ///< 0xC900 - IP address not found
|
|
#define NE_FLM_SOCKET_FAIL 0xC901 ///< 0xC901 - IP socket failure
|
|
#define NE_FLM_CONNECT_FAIL 0xC902 ///< 0xC902 - TCP/IP connection failure
|
|
#define NE_FLM_BIND_FAIL 0xC903 ///< 0xC903 - The TCP/IP services on your system may not be configured or installed.
|
|
#define NE_FLM_LISTEN_FAIL 0xC904 ///< 0xC904 - TCP/IP listen failed
|
|
#define NE_FLM_ACCEPT_FAIL 0xC905 ///< 0xC905 - TCP/IP accept failed
|
|
#define NE_FLM_SELECT_ERR 0xC906 ///< 0xC906 - TCP/IP select failed
|
|
#define NE_FLM_SOCKET_SET_OPT_FAIL 0xC907 ///< 0xC907 - TCP/IP socket operation failed
|
|
#define NE_FLM_SOCKET_DISCONNECT 0xC908 ///< 0xC908 - TCP/IP disconnected
|
|
#define NE_FLM_SOCKET_READ_FAIL 0xC909 ///< 0xC909 - TCP/IP read failed
|
|
#define NE_FLM_SOCKET_WRITE_FAIL 0xC90A ///< 0xC90A - TCP/IP write failed
|
|
#define NE_FLM_SOCKET_READ_TIMEOUT 0xC90B ///< 0xC90B - TCP/IP read timeout
|
|
#define NE_FLM_SOCKET_WRITE_TIMEOUT 0xC90C ///< 0xC90C - TCP/IP write timeout
|
|
#define NE_FLM_SOCKET_ALREADY_CLOSED 0xC90D ///< 0xC90D - Connection already closed
|
|
|
|
/// @}
|
|
|
|
/****************************************************************************
|
|
Desc: Return code functions and macros
|
|
****************************************************************************/
|
|
|
|
#ifndef RC_OK
|
|
#define RC_OK( rc) ((rc) == NE_FLM_OK)
|
|
#endif
|
|
|
|
#ifndef RC_BAD
|
|
#define RC_BAD( rc) ((rc) != NE_FLM_OK)
|
|
#endif
|
|
|
|
RCODE FLMAPI f_mapPlatformError(
|
|
FLMINT iError,
|
|
RCODE defaultRc);
|
|
|
|
/****************************************************************************
|
|
Desc: Forward References
|
|
****************************************************************************/
|
|
|
|
flminterface IF_DirHdl;
|
|
flminterface IF_FileHdl;
|
|
flminterface IF_FileSystem;
|
|
flminterface IF_FileHdlCache;
|
|
flminterface IF_IStream;
|
|
flminterface IF_PosIStream;
|
|
flminterface IF_ResultSet;
|
|
flminterface IF_ThreadInfo;
|
|
flminterface IF_OStream;
|
|
flminterface IF_IOStream;
|
|
flminterface IF_LogMessageClient;
|
|
flminterface IF_Thread;
|
|
flminterface IF_IOBuffer;
|
|
flminterface IF_AsyncClient;
|
|
flminterface IF_Block;
|
|
|
|
class F_Pool;
|
|
class F_DynaBuf;
|
|
class F_ListItem;
|
|
class F_ListManager;
|
|
|
|
/****************************************************************************
|
|
Desc: Cross-platform definitions
|
|
****************************************************************************/
|
|
|
|
#ifndef NULL
|
|
#define NULL 0
|
|
#endif
|
|
|
|
#ifndef TRUE
|
|
#define TRUE 1
|
|
#endif
|
|
|
|
#ifndef FALSE
|
|
#define FALSE 0
|
|
#endif
|
|
|
|
#define f_offsetof(s,m) \
|
|
(((FLMSIZET)&((s *)1)->m) - 1)
|
|
|
|
/****************************************************************************
|
|
Desc: Language constants
|
|
IMPORTANT NOTE: If langes are added or changed, the corresponding definitions
|
|
in java and C# must also be updated.
|
|
****************************************************************************/
|
|
|
|
/// \addtogroup flm_languages
|
|
/// @{
|
|
#define FLM_US_LANG 0 ///< English, United States
|
|
#define FLM_AF_LANG 1 ///< Afrikaans
|
|
#define FLM_AR_LANG 2 ///< Arabic
|
|
#define FLM_CA_LANG 3 ///< Catalan
|
|
#define FLM_HR_LANG 4 ///< Croatian
|
|
#define FLM_CZ_LANG 5 ///< Czech
|
|
#define FLM_DK_LANG 6 ///< Danish
|
|
#define FLM_NL_LANG 7 ///< Dutch
|
|
#define FLM_OZ_LANG 8 ///< English, Australia
|
|
#define FLM_CE_LANG 9 ///< English, Canada
|
|
#define FLM_UK_LANG 10 ///< English, United Kingdom
|
|
#define FLM_FA_LANG 11 ///< Farsi
|
|
#define FLM_SU_LANG 12 ///< Finnish
|
|
#define FLM_CF_LANG 13 ///< French, Canada
|
|
#define FLM_FR_LANG 14 ///< French, France
|
|
#define FLM_GA_LANG 15 ///< Galician
|
|
#define FLM_DE_LANG 16 ///< German, Germany
|
|
#define FLM_SD_LANG 17 ///< German, Switzerland
|
|
#define FLM_GR_LANG 18 ///< Greek
|
|
#define FLM_HE_LANG 19 ///< Hebrew
|
|
#define FLM_HU_LANG 20 ///< Hungarian
|
|
#define FLM_IS_LANG 21 ///< Icelandic
|
|
#define FLM_IT_LANG 22 ///< Italian
|
|
#define FLM_NO_LANG 23 ///< Norwegian
|
|
#define FLM_PL_LANG 24 ///< Polish
|
|
#define FLM_BR_LANG 25 ///< Portuguese, Brazil
|
|
#define FLM_PO_LANG 26 ///< Portuguese, Portugal
|
|
#define FLM_RU_LANG 27 ///< Russian
|
|
#define FLM_SL_LANG 28 ///< Slovak
|
|
#define FLM_ES_LANG 29 ///< Spanish
|
|
#define FLM_SV_LANG 30 ///< Swedish
|
|
#define FLM_YK_LANG 31 ///< Ukrainian
|
|
#define FLM_UR_LANG 32 ///< Urdu
|
|
#define FLM_TK_LANG 33 ///< Turkey
|
|
#define FLM_JP_LANG 34 ///< Japanese
|
|
#define FLM_KO_LANG 35 ///< Korean
|
|
#define FLM_CT_LANG 36 ///< Chinese-Traditional
|
|
#define FLM_CS_LANG 37 ///< Chinese-Simplified
|
|
#define FLM_LA_LANG 38 ///< another Asian language
|
|
/// @}
|
|
|
|
#define FLM_LAST_LANG (FLM_LA_LANG + 1)
|
|
#define FLM_FIRST_DBCS_LANG (FLM_JP_LANG)
|
|
#define FLM_LAST_DBCS_LANG (FLM_LA_LANG)
|
|
|
|
/****************************************************************************
|
|
Desc: Collation flags and constants
|
|
****************************************************************************/
|
|
|
|
#define F_HAD_SUB_COLLATION 0x01 // Set if had sub-collating values-diacritics
|
|
#define F_HAD_LOWER_CASE 0x02 // Set if you hit a lowercase character
|
|
#define F_COLL_FIRST_SUBSTRING 0x03 // First substring marker
|
|
#define F_COLL_MARKER 0x04 // Marks place of sub-collation
|
|
|
|
#define F_SC_LOWER 0x00 // Only lowercase characters exist
|
|
#define F_SC_MIXED 0x01 // Lower/uppercase flags follow in next byte
|
|
#define F_SC_UPPER 0x02 // Only upper characters exist
|
|
#define F_SC_SUB_COL 0x03 // Sub-collation follows (diacritics|extCh)
|
|
|
|
#define F_COLL_TRUNCATED 0x0C // This key piece has been truncated from original
|
|
#define F_MAX_COL_OPCODE F_COLL_TRUNCATED
|
|
|
|
#define F_CHSASCI 0 // ASCII
|
|
#define F_CHSMUL1 1 // Multinational 1
|
|
#define F_CHSMUL2 2 // Multinational 2
|
|
#define F_CHSBOXD 3 // Box drawing
|
|
#define F_CHSSYM1 4 // Typographic Symbols
|
|
#define F_CHSSYM2 5 // Iconic Symbols
|
|
#define F_CHSMATH 6 // Math
|
|
#define F_CHMATHX 7 // Math Extension
|
|
#define F_CHSGREK 8 // Greek
|
|
#define F_CHSHEB 9 // Hebrew
|
|
#define F_CHSCYR 10 // Cyrillic
|
|
#define F_CHSKANA 11 // Japanese Kana
|
|
#define F_CHSUSER 12 // User-defined
|
|
#define F_CHSARB1 13 // Arabic
|
|
#define F_CHSARB2 14 // Arabic script
|
|
|
|
#define F_NCHSETS 15 // # of character sets (excluding asian)
|
|
#define F_ACHSETS 0x0E0 // maximum character set value - asian
|
|
#define F_ACHSMIN 0x024 // minimum character set value - asian
|
|
#define F_ACHCMAX 0x0FE // maxmimum character value in asian sets
|
|
|
|
/****************************************************************************
|
|
Desc: Diacritics
|
|
****************************************************************************/
|
|
|
|
#define F_GRAVE 0
|
|
#define F_CENTERD 1
|
|
#define F_TILDE 2
|
|
#define F_CIRCUM 3
|
|
#define F_CROSSB 4
|
|
#define F_SLASH 5
|
|
#define F_ACUTE 6
|
|
#define F_UMLAUT 7
|
|
#define F_MACRON 8
|
|
|
|
#define F_APOSAB 9
|
|
#define F_APOSBES 10
|
|
#define F_APOSBA 11
|
|
|
|
#define F_RING 14
|
|
#define F_DOTA 15
|
|
#define F_DACUTE 16
|
|
#define F_CEDILLA 17
|
|
#define F_OGONEK 18
|
|
#define F_CARON 19
|
|
#define F_STROKE 20
|
|
|
|
#define F_BREVE 22
|
|
#define F_DOTLESI 239
|
|
#define F_DOTLESJ 25
|
|
|
|
#define F_GACUTE 83 // greek acute
|
|
#define F_GDIA 84 // greek diaeresis
|
|
#define F_GACTDIA 85 // acute diaeresis
|
|
#define F_GGRVDIA 86 // grave diaeresis
|
|
#define F_GGRAVE 87 // greek grave
|
|
#define F_GCIRCM 88 // greek circumflex
|
|
#define F_GSMOOTH 89 // smooth breathing
|
|
#define F_GROUGH 90 // rough breathing
|
|
#define F_GIOTA 91 // iota subscript
|
|
#define F_GSMACT 92 // smooth breathing acute
|
|
#define F_GRGACT 93 // rough breathing acute
|
|
#define F_GSMGRV 94 // smooth breathing grave
|
|
#define F_GRGGRV 95 // rough breathing grave
|
|
#define F_GSMCIR 96 // smooth breathing circumflex
|
|
#define F_GRGCIR 97 // rough breathing circumflex
|
|
#define F_GACTIO 98 // acute iota
|
|
#define F_GGRVIO 99 // grave iota
|
|
#define F_GCIRIO 100 // circumflex iota
|
|
#define F_GSMIO 101 // smooth iota
|
|
#define F_GRGIO 102 // rough iota
|
|
#define F_GSMAIO 103 // smooth acute iota
|
|
#define F_GRGAIO 104 // rough acute iota
|
|
#define F_GSMGVIO 105 // smooth grave iota
|
|
#define F_GRGGVIO 106 // rough grave iota
|
|
#define F_GSMCIO 107 // smooth circumflex iota
|
|
#define F_GRGCIO 108 // rough circumflex iota
|
|
#define F_GHPRIME 81 // high prime
|
|
#define F_GLPRIME 82 // low prime
|
|
|
|
#define F_RACUTE 200 // russian acute
|
|
#define F_RGRAVE 201 // russian grave
|
|
#define F_RRTDESC 204 // russian right descender
|
|
#define F_ROGONEK 205 // russian ogonek
|
|
#define F_RMACRON 206 // russian macron
|
|
|
|
/****************************************************************************
|
|
Desc: I/O Flags
|
|
****************************************************************************/
|
|
#define FLM_IO_CURRENT_POS FLM_MAX_UINT64
|
|
|
|
#define FLM_IO_RDONLY 0x0001
|
|
#define FLM_IO_RDWR 0x0002
|
|
#define FLM_IO_EXCL 0x0004
|
|
#define FLM_IO_CREATE_DIR 0x0008
|
|
#define FLM_IO_SH_DENYRW 0x0010
|
|
#define FLM_IO_SH_DENYWR 0x0020
|
|
#define FLM_IO_SH_DENYNONE 0x0040
|
|
#define FLM_IO_DIRECT 0x0080
|
|
#define FLM_IO_DELETE_ON_RELEASE 0x0100
|
|
#define FLM_IO_NO_MISALIGNED 0x0200
|
|
|
|
// File Positioning Definitions
|
|
|
|
#define FLM_IO_SEEK_SET 0 // Beginning of File
|
|
#define FLM_IO_SEEK_CUR 1 // Current File Pointer Position
|
|
#define FLM_IO_SEEK_END 2 // End of File
|
|
|
|
// Maximum file size
|
|
|
|
#define FLM_MAXIMUM_FILE_SIZE 0xFFFC0000
|
|
|
|
// Maximum SEN (compressed number) length
|
|
|
|
#define FLM_MAX_SEN_LEN 9
|
|
|
|
// Retrieval flags
|
|
|
|
#define FLM_INCL 0x0010
|
|
#define FLM_EXCL 0x0020
|
|
#define FLM_EXACT 0x0040
|
|
#define FLM_KEY_EXACT 0x0080
|
|
#define FLM_FIRST 0x0100
|
|
#define FLM_LAST 0x0200
|
|
|
|
/****************************************************************************
|
|
Desc: Comparison flags for strings
|
|
IMPORTANT NOTE: If changes are made to these, corresponding changes need to
|
|
be made in the java and C# code where they are defined.
|
|
****************************************************************************/
|
|
/// \addtogroup compare_rules
|
|
/// @{
|
|
#define FLM_COMP_CASE_INSENSITIVE 0x0001 ///< 0x0001 = Do case sensitive comparison.
|
|
#define FLM_COMP_COMPRESS_WHITESPACE 0x0002 ///< 0x0002 = Compare multiple whitespace characters as a single space.
|
|
#define FLM_COMP_NO_WHITESPACE 0x0004 ///< 0x0004 = Ignore all whitespace during comparison.
|
|
#define FLM_COMP_NO_UNDERSCORES 0x0008 ///< 0x0008 = Ignore all underscore characters during comparison.
|
|
#define FLM_COMP_NO_DASHES 0x0010 ///< 0x0010 = Ignore all dash characters during comparison.
|
|
#define FLM_COMP_WHITESPACE_AS_SPACE 0x0020 ///< 0x0020 = Treat newlines and tabs as spaces during comparison.
|
|
#define FLM_COMP_IGNORE_LEADING_SPACE 0x0040 ///< 0x0040 = Ignore leading space characters during comparison.
|
|
#define FLM_COMP_IGNORE_TRAILING_SPACE 0x0080 ///< 0x0080 = Ignore trailing space characters during comparison.
|
|
#define FLM_COMP_WILD 0x0100
|
|
/// @}
|
|
|
|
/****************************************************************************
|
|
Desc: Colors
|
|
****************************************************************************/
|
|
/// Colors used for logging messages
|
|
typedef enum
|
|
{
|
|
FLM_BLACK = 0, ///< 0 = Black
|
|
FLM_BLUE, ///< 1 = Blue
|
|
FLM_GREEN, ///< 2 = Green
|
|
FLM_CYAN, ///< 3 = Cyan
|
|
FLM_RED, ///< 4 = Red
|
|
FLM_MAGENTA, ///< 5 = Magenta
|
|
FLM_BROWN, ///< 6 = Brown
|
|
FLM_LIGHTGRAY, ///< 7 = Light Gray
|
|
FLM_DARKGRAY, ///< 8 = Dark Gray
|
|
FLM_LIGHTBLUE, ///< 9 = Light Blue
|
|
FLM_LIGHTGREEN, ///< 10 = Light Green
|
|
FLM_LIGHTCYAN, ///< 11 = Light Cyan
|
|
FLM_LIGHTRED, ///< 12 = Light Red
|
|
FLM_LIGHTMAGENTA, ///< 13 = Light Magenta
|
|
FLM_YELLOW, ///< 14 = Light Yellow
|
|
FLM_WHITE, ///< 15 = White
|
|
FLM_NUM_COLORS,
|
|
FLM_CURRENT_COLOR
|
|
} eColorType;
|
|
|
|
#define F_FOREBLACK "%0F"
|
|
#define F_FOREBLUE "%1F"
|
|
#define F_FOREGREEN "%2F"
|
|
#define F_FORECYAN "%3F"
|
|
#define F_FORERED "%4F"
|
|
#define F_FOREMAGENTA "%5F"
|
|
#define F_FOREBROWN "%6F"
|
|
#define F_FORELIGHTGRAY "%7F"
|
|
#define F_FOREDARKGRAY "%8F"
|
|
#define F_FORELIGHTBLUE "%9F"
|
|
#define F_FORELIGHTGREEN "%10F"
|
|
#define F_FORELIGHTCYAN "%11F"
|
|
#define F_FORELIGHTRED "%12F"
|
|
#define F_FORELIGHTMAGENTA "%13F"
|
|
#define F_FOREYELLOW "%14F"
|
|
#define F_FOREWHITE "%15F"
|
|
|
|
#define F_BACKBLACK "%0B"
|
|
#define F_BACKBLUE "%1B"
|
|
#define F_BACKGREEN "%2B"
|
|
#define F_BACKCYAN "%3B"
|
|
#define F_BACKRED "%4B"
|
|
#define F_BACKMAGENTA "%5B"
|
|
#define F_BACKBROWN "%6B"
|
|
#define F_BACKLIGHTGRAY "%7B"
|
|
#define F_BACKDARKGRAY "%8B"
|
|
#define F_BACKLIGHTBLUE "%9B"
|
|
#define F_BACKLIGHTGREEN "%10B"
|
|
#define F_BACKLIGHTCYAN "%11B"
|
|
#define F_BACKLIGHTRED "%12B"
|
|
#define F_BACKLIGHTMAGENTA "%13B"
|
|
#define F_BACKYELLOW "%14B"
|
|
#define F_BACKWHITE "%15B"
|
|
|
|
#define F_PUSH_FORECOLOR "%+F"
|
|
#define F_POP_FORECOLOR "%-F"
|
|
|
|
#define F_PUSH_BACKCOLOR "%+B"
|
|
#define F_POP_BACKCOLOR "%-B"
|
|
|
|
#define F_PUSHCOLOR F_PUSH_FORECOLOR F_PUSH_BACKCOLOR
|
|
#define F_POPCOLOR F_POP_FORECOLOR F_POP_BACKCOLOR
|
|
|
|
// IMPORTANT NOTE: This structure needs to be kept in sync with corresponding
|
|
// structures and classes in java and C#.
|
|
/****************************************************************************
|
|
/// Structure for reporting slab usage information in cache.
|
|
****************************************************************************/
|
|
typedef struct
|
|
{
|
|
FLMUINT64 ui64Slabs; ///< Total slabs currently allocated.
|
|
FLMUINT64 ui64SlabBytes; ///< Total bytes currently allocated in slabs.
|
|
FLMUINT64 ui64AllocatedCells; ///< Total cells allocated within slabs.
|
|
FLMUINT64 ui64FreeCells; ///< Total cells that are free within slabs.
|
|
} FLM_SLAB_USAGE;
|
|
|
|
/****************************************************************************
|
|
/// Structure returned from FlmGetThreadInfo() - contains information about a thread.
|
|
****************************************************************************/
|
|
typedef struct
|
|
{
|
|
FLMUINT uiThreadId; ///< Operating system thread ID.
|
|
FLMUINT uiThreadGroup; ///< Thread group this thread belongs to.
|
|
FLMUINT uiAppId; ///< Application ID that was assigned to the thread when it was started.
|
|
FLMUINT uiStartTime; ///< Time the thread was started.
|
|
char * pszThreadName; ///< Name of the thread.
|
|
char * pszThreadStatus; ///< String indicating the last action the thread reported it was performing.
|
|
} F_THREAD_INFO;
|
|
|
|
typedef enum
|
|
{
|
|
FLM_THREAD_STATUS_UNKNOWN = 0,
|
|
FLM_THREAD_STATUS_INITIALIZING,
|
|
FLM_THREAD_STATUS_RUNNING,
|
|
FLM_THREAD_STATUS_SLEEPING,
|
|
FLM_THREAD_STATUS_TERMINATING
|
|
} eThreadStatus;
|
|
|
|
#define F_THREAD_MIN_STACK_SIZE (16 * 1024)
|
|
#define F_THREAD_DEFAULT_STACK_SIZE (16 * 1024)
|
|
|
|
#define F_DEFAULT_THREAD_GROUP 0
|
|
#define F_INVALID_THREAD_GROUP 0xFFFFFFFF
|
|
|
|
typedef RCODE (FLMAPI * F_THREAD_FUNC)(IF_Thread *);
|
|
|
|
/****************************************************************************
|
|
Desc: Startup and shutdown
|
|
****************************************************************************/
|
|
|
|
RCODE FLMAPI ftkStartup( void);
|
|
|
|
void FLMAPI ftkShutdown( void);
|
|
|
|
/****************************************************************************
|
|
Desc: Global data
|
|
****************************************************************************/
|
|
|
|
extern FLMUINT16 * gv_pui16USCollationTable;
|
|
|
|
/****************************************************************************
|
|
/// This is a pure virtual base class that other classes inherit from.\ It
|
|
/// provides methods for reference counting (AddRef, Release).
|
|
****************************************************************************/
|
|
flminterface FLMEXP IF_Object
|
|
{
|
|
virtual ~IF_Object()
|
|
{
|
|
}
|
|
|
|
virtual FLMINT FLMAPI AddRef( void) = 0;
|
|
|
|
virtual FLMINT FLMAPI Release( void) = 0;
|
|
|
|
virtual FLMINT FLMAPI getRefCount( void) = 0;
|
|
};
|
|
|
|
/****************************************************************************
|
|
/// This is the base class that all other classes inherit from.\ It
|
|
/// provides methods for reference counting (AddRef, Release) as well as
|
|
/// methods for overloading new and delete operators.
|
|
****************************************************************************/
|
|
class FLMEXP F_Object : public IF_Object
|
|
{
|
|
public:
|
|
|
|
F_Object()
|
|
{
|
|
m_refCnt = 1;
|
|
}
|
|
|
|
virtual ~F_Object()
|
|
{
|
|
}
|
|
|
|
/// Increment the reference count for this object.
|
|
/// The reference count is the number of pointers that are referencing this object.
|
|
/// Return value is the incremented reference count.
|
|
virtual FLMINT FLMAPI AddRef( void);
|
|
|
|
/// Decrement the reference count for this object.
|
|
/// The reference count is the number of pointers that are referencing this object.
|
|
/// Return value is the decremented reference count. If the reference count goes to
|
|
/// zero, the object will be deleted.
|
|
virtual FLMINT FLMAPI Release( void);
|
|
|
|
/// Return the current reference count on the object.
|
|
virtual FLMINT FLMAPI getRefCount( void);
|
|
|
|
/// Overloaded new operator for objects of this class.
|
|
void * FLMAPI operator new(
|
|
FLMSIZET uiSize, ///< Number of bytes to allocate - should be sizeof( ThisClass).
|
|
const char * pszFile, ///< Name of source file where this allocation is made.
|
|
int iLine) ///< Line number in source file where this allocation request is made.
|
|
#ifndef FLM_WATCOM_NLM
|
|
throw()
|
|
#endif
|
|
;
|
|
|
|
/// Overloaded new operator for objects of this class.
|
|
void * FLMAPI operator new(
|
|
FLMSIZET uiSize) ///< Number of bytes to allocate - should be sizeof( ThisClass).
|
|
#ifndef FLM_WATCOM_NLM
|
|
throw()
|
|
#endif
|
|
;
|
|
|
|
/// Overloaded new operator (array) for objects of this class (with source file and line number).
|
|
/// This new operator is called when an array of objects of this class are allocated.
|
|
/// This new operator passes in the current file and line number. This information is
|
|
/// useful in tracking memory allocations to determine where memory leaks are coming from.
|
|
void * FLMAPI operator new[](
|
|
FLMSIZET uiSize, ///< Number of bytes to allocate - should be sizeof( ThisClass).
|
|
const char * pszFile, ///< Name of source file where this allocation is made.
|
|
int iLine) ///< Line number in source file where this allocation request is made.
|
|
#ifndef FLM_WATCOM_NLM
|
|
throw()
|
|
#endif
|
|
;
|
|
|
|
/// Overloaded new operator (array) for objects of this class.
|
|
/// This new operator is called when an array of objects of this class are allocated.
|
|
void * FLMAPI operator new[](
|
|
FLMSIZET uiSize) ///< Number of bytes to allocate - should be sizeof( ThisClass).
|
|
#ifndef FLM_WATCOM_NLM
|
|
throw()
|
|
#endif
|
|
;
|
|
|
|
/// Overloaded delete operator for objects of this class.
|
|
void FLMAPI operator delete(
|
|
void * ptr); ///< Pointer to object being freed.
|
|
|
|
/// Overloaded delete operator (array) for objects of this class.
|
|
void FLMAPI operator delete[](
|
|
void * ptr); ///< Pointer to array of objects being freed.
|
|
|
|
#ifndef FLM_WATCOM_NLM
|
|
/// Overloaded delete operator for objects of this class (with source file and line number).
|
|
/// This delete operator passes in the current file and line number. This information is
|
|
/// useful in tracking memory allocations to determine where memory leaks are coming from.
|
|
void FLMAPI operator delete(
|
|
void * ptr, ///< Pointer to object being freed.
|
|
const char * file, ///< Name of source file where this delete occurs.
|
|
int line); ///< Line number in source file where this delete occurs.
|
|
#endif
|
|
|
|
#ifndef FLM_WATCOM_NLM
|
|
/// Overloaded delete operator (array) for objects of this class (with source file and line number).
|
|
/// This delete operator is called when an array of objects of this class is freed.
|
|
/// This delete operator passes in the current file and line number. This information is
|
|
/// useful in tracking memory allocations to determine where memory leaks are coming from.
|
|
void FLMAPI operator delete[](
|
|
void * ptr, ///< Pointer to object being freed.
|
|
const char * file, ///< Name of source file where this delete occurs.
|
|
int line); ///< Line number in source file where this delete occurs.
|
|
#endif
|
|
|
|
protected:
|
|
|
|
FLMATOMIC m_refCnt;
|
|
};
|
|
|
|
/****************************************************************************
|
|
Desc: Internal base class
|
|
****************************************************************************/
|
|
class FLMEXP F_OSBase
|
|
{
|
|
public:
|
|
|
|
F_OSBase()
|
|
{
|
|
m_refCnt = 1;
|
|
}
|
|
|
|
virtual ~F_OSBase()
|
|
{
|
|
}
|
|
|
|
void * operator new(
|
|
FLMSIZET uiSize,
|
|
const char * pszFile,
|
|
int iLine)
|
|
#ifndef FLM_WATCOM_NLM
|
|
throw()
|
|
#endif
|
|
;
|
|
|
|
void * operator new[](
|
|
FLMSIZET uiSize,
|
|
const char * pszFile,
|
|
int iLine)
|
|
#ifndef FLM_WATCOM_NLM
|
|
throw()
|
|
#endif
|
|
;
|
|
|
|
void operator delete(
|
|
void * ptr);
|
|
|
|
void operator delete[](
|
|
void * ptr);
|
|
|
|
#ifndef FLM_WATCOM_NLM
|
|
void operator delete(
|
|
void * ptr,
|
|
const char * file,
|
|
int line);
|
|
#endif
|
|
|
|
#ifndef FLM_WATCOM_NLM
|
|
void operator delete[](
|
|
void * ptr,
|
|
const char * file,
|
|
int line);
|
|
#endif
|
|
|
|
virtual FINLINE FLMINT FLMAPI AddRef( void)
|
|
{
|
|
return( ++m_refCnt);
|
|
}
|
|
|
|
virtual FINLINE FLMINT FLMAPI Release( void)
|
|
{
|
|
FLMINT iRefCnt = --m_refCnt;
|
|
|
|
if( !iRefCnt)
|
|
{
|
|
delete this;
|
|
}
|
|
|
|
return( iRefCnt);
|
|
}
|
|
|
|
virtual FINLINE FLMINT FLMAPI getRefCount( void)
|
|
{
|
|
return( m_refCnt);
|
|
}
|
|
|
|
protected:
|
|
|
|
FLMATOMIC m_refCnt;
|
|
};
|
|
|
|
/****************************************************************************
|
|
Desc: Errors
|
|
****************************************************************************/
|
|
#ifdef FLM_DEBUG
|
|
RCODE FLMAPI f_makeErr(
|
|
RCODE rc,
|
|
const char * pszFile,
|
|
int iLine,
|
|
FLMBOOL bAssert);
|
|
|
|
FLMINT FLMAPI f_enterDebugger(
|
|
const char * pszFile,
|
|
int iLine);
|
|
|
|
#define RC_SET( rc) \
|
|
f_makeErr( rc, __FILE__, __LINE__, FALSE)
|
|
|
|
#define RC_SET_AND_ASSERT( rc) \
|
|
f_makeErr( rc, __FILE__, __LINE__, TRUE)
|
|
|
|
#define RC_UNEXPECTED_ASSERT( rc) \
|
|
f_makeErr( rc, __FILE__, __LINE__, TRUE)
|
|
|
|
#define f_assert( c) \
|
|
(void)((c) ? 0 : f_enterDebugger( __FILE__, __LINE__))
|
|
|
|
#define flmAssert( c) \
|
|
f_assert( c)
|
|
#else
|
|
#define RC_SET( rc) (rc)
|
|
#define RC_SET_AND_ASSERT( rc) (rc)
|
|
#define RC_UNEXPECTED_ASSERT( rc)
|
|
#define f_assert(c)
|
|
#define flmAssert(c)
|
|
#endif
|
|
|
|
/****************************************************************************
|
|
Desc: Memory
|
|
****************************************************************************/
|
|
|
|
RCODE FLMAPI f_allocImp(
|
|
FLMUINT uiSize,
|
|
void ** ppvPtr,
|
|
FLMBOOL bFromNewOp,
|
|
const char * pszFile,
|
|
int iLine);
|
|
|
|
#define f_alloc(s,p) \
|
|
f_allocImp( (s), (void **)(p), FALSE, __FILE__, __LINE__)
|
|
|
|
RCODE FLMAPI f_callocImp(
|
|
FLMUINT uiSize,
|
|
void ** ppvPtr,
|
|
const char * pszFile,
|
|
int iLine);
|
|
|
|
#define f_calloc(s,p) \
|
|
f_callocImp( (s), (void **)(p), __FILE__, __LINE__)
|
|
|
|
RCODE FLMAPI f_reallocImp(
|
|
FLMUINT uiSize,
|
|
void ** ppvPtr,
|
|
const char * pszFile,
|
|
int iLine);
|
|
|
|
#define f_realloc(s,p) \
|
|
f_reallocImp( (s), (void **)(p), __FILE__, __LINE__)
|
|
|
|
RCODE FLMAPI f_recallocImp(
|
|
FLMUINT uiSize,
|
|
void ** ppvPtr,
|
|
const char * pszFile,
|
|
int iLine);
|
|
|
|
#define f_recalloc(s,p) \
|
|
f_recallocImp( (s), (void **)(p), __FILE__, __LINE__)
|
|
|
|
#define f_new \
|
|
new( __FILE__, __LINE__)
|
|
|
|
void FLMAPI f_freeImp(
|
|
void ** ppvPtr,
|
|
FLMBOOL bFromDelOp);
|
|
|
|
#define f_free(p) \
|
|
f_freeImp( (void **)(p), FALSE)
|
|
|
|
void f_resetStackInfoImp(
|
|
void * pvPtr,
|
|
const char * pszFileName,
|
|
int iLineNumber);
|
|
|
|
#define f_resetStackInfo(p) \
|
|
f_resetStackInfoImp( (p), __FILE__, __LINE__)
|
|
|
|
FLMUINT f_msize(
|
|
void * pvPtr);
|
|
|
|
RCODE FLMAPI f_allocAlignedBufferImp(
|
|
FLMUINT uiMinSize,
|
|
void ** ppvAlloc);
|
|
|
|
#define f_allocAlignedBuffer(s,p) \
|
|
f_allocAlignedBufferImp( (s), (void **)(p))
|
|
|
|
void FLMAPI f_freeAlignedBufferImp(
|
|
void ** ppvAlloc);
|
|
|
|
#define f_freeAlignedBuffer(p) \
|
|
f_freeAlignedBufferImp( (void **)(p))
|
|
|
|
RCODE FLMAPI f_getMemoryInfo(
|
|
FLMUINT64 * pui64TotalPhysMem,
|
|
FLMUINT64 * pui64AvailPhysMem);
|
|
|
|
FLMBOOL FLMAPI f_canGetMemoryInfo( void);
|
|
|
|
/****************************************************************************
|
|
Desc:
|
|
****************************************************************************/
|
|
flminterface FLMEXP IF_ThreadInfo : public F_Object
|
|
{
|
|
virtual FLMUINT FLMAPI getNumThreads( void) = 0;
|
|
|
|
virtual void FLMAPI getThreadInfo(
|
|
FLMUINT uiThreadNum,
|
|
FLMUINT * puiThreadId,
|
|
FLMUINT * puiThreadGroup,
|
|
FLMUINT * puiAppId,
|
|
FLMUINT * puiStartTime,
|
|
const char ** ppszThreadName,
|
|
const char ** ppszThreadStatus) = 0;
|
|
};
|
|
|
|
RCODE FLMAPI FlmGetThreadInfo(
|
|
IF_ThreadInfo ** ppThreadInfo);
|
|
|
|
/****************************************************************************
|
|
Desc:
|
|
****************************************************************************/
|
|
flminterface FLMEXP IF_IStream : public F_Object
|
|
{
|
|
virtual RCODE FLMAPI read(
|
|
void * pvBuffer,
|
|
FLMUINT uiBytesToRead,
|
|
FLMUINT * puiBytesRead = NULL) = 0;
|
|
|
|
virtual RCODE FLMAPI closeStream( void) = 0;
|
|
};
|
|
|
|
/****************************************************************************
|
|
Desc:
|
|
****************************************************************************/
|
|
flminterface FLMEXP IF_PosIStream : public IF_IStream
|
|
{
|
|
virtual FLMUINT64 FLMAPI totalSize( void) = 0;
|
|
|
|
virtual FLMUINT64 FLMAPI remainingSize( void) = 0;
|
|
|
|
virtual RCODE FLMAPI positionTo(
|
|
FLMUINT64 ui64Position) = 0;
|
|
|
|
virtual FLMUINT64 FLMAPI getCurrPosition( void) = 0;
|
|
};
|
|
|
|
/****************************************************************************
|
|
Desc:
|
|
****************************************************************************/
|
|
flminterface FLMEXP IF_BufferIStream : public IF_PosIStream
|
|
{
|
|
virtual RCODE FLMAPI openStream(
|
|
const char * pucBuffer,
|
|
FLMUINT uiLength,
|
|
char ** ppucAllocatedBuffer = NULL) = 0;
|
|
|
|
virtual FLMUINT64 FLMAPI totalSize( void) = 0;
|
|
|
|
virtual FLMUINT64 FLMAPI remainingSize( void) = 0;
|
|
|
|
virtual RCODE FLMAPI closeStream( void) = 0;
|
|
|
|
virtual RCODE FLMAPI positionTo(
|
|
FLMUINT64 ui64Position) = 0;
|
|
|
|
virtual FLMUINT64 FLMAPI getCurrPosition( void) = 0;
|
|
|
|
virtual void FLMAPI truncateStream(
|
|
FLMUINT64 ui64Offset = 0) = 0;
|
|
|
|
virtual RCODE FLMAPI read(
|
|
void * pvBuffer,
|
|
FLMUINT uiBytesToRead,
|
|
FLMUINT * puiBytesRead) = 0;
|
|
|
|
virtual const FLMBYTE * FLMAPI getBufferAtCurrentOffset( void) = 0;
|
|
};
|
|
|
|
RCODE FLMAPI FlmAllocBufferIStream(
|
|
IF_BufferIStream ** ppIStream);
|
|
|
|
RCODE FLMAPI FlmOpenBufferIStream(
|
|
const char * pucBuffer,
|
|
FLMUINT uiLength,
|
|
IF_PosIStream ** ppIStream);
|
|
|
|
RCODE FLMAPI FlmOpenBase64EncoderIStream(
|
|
IF_IStream * pSourceIStream,
|
|
FLMBOOL bLineBreaks,
|
|
IF_IStream ** ppIStream);
|
|
|
|
RCODE FLMAPI FlmOpenBase64DecoderIStream(
|
|
IF_IStream * pSourceIStream,
|
|
IF_IStream ** ppIStream);
|
|
|
|
RCODE FLMAPI FlmOpenFileIStream(
|
|
const char * pszPath,
|
|
IF_PosIStream ** ppIStream);
|
|
|
|
RCODE FLMAPI FlmOpenMultiFileIStream(
|
|
const char * pszDirectory,
|
|
const char * pszBaseName,
|
|
IF_IStream ** ppIStream);
|
|
|
|
RCODE FLMAPI FlmOpenBufferedIStream(
|
|
IF_IStream * pSourceIStream,
|
|
FLMUINT uiBufferSize,
|
|
IF_IStream ** ppIStream);
|
|
|
|
RCODE FLMAPI FlmOpenUncompressingIStream(
|
|
IF_IStream * pIStream,
|
|
IF_IStream ** ppIStream);
|
|
|
|
RCODE FLMAPI FlmOpenFileOStream(
|
|
const char * pszFileName,
|
|
FLMBOOL bTruncateIfExists,
|
|
IF_OStream ** ppOStream);
|
|
|
|
RCODE FLMAPI FlmOpenMultiFileOStream(
|
|
const char * pszDirectory,
|
|
const char * pszBaseName,
|
|
FLMUINT uiMaxFileSize,
|
|
FLMBOOL bOkToOverwrite,
|
|
IF_OStream ** ppStream);
|
|
|
|
RCODE FLMAPI FlmOpenBufferedOStream(
|
|
IF_OStream * pOStream,
|
|
FLMUINT uiBufferSize,
|
|
IF_OStream ** ppOStream);
|
|
|
|
RCODE FLMAPI FlmOpenCompressingOStream(
|
|
IF_OStream * pOStream,
|
|
IF_OStream ** ppOStream);
|
|
|
|
RCODE FLMAPI FlmRemoveMultiFileStream(
|
|
const char * pszDirectory,
|
|
const char * pszBaseName);
|
|
|
|
RCODE FLMAPI FlmWriteToOStream(
|
|
IF_IStream * pIStream,
|
|
IF_OStream * pOStream);
|
|
|
|
/****************************************************************************
|
|
Desc:
|
|
****************************************************************************/
|
|
|
|
typedef struct
|
|
{
|
|
FLMUINT64 ui64Position;
|
|
FLMUNICODE uNextChar;
|
|
} F_CollStreamPos;
|
|
|
|
flminterface FLMEXP IF_CollIStream : public IF_PosIStream
|
|
{
|
|
virtual RCODE FLMAPI openStream(
|
|
IF_PosIStream * pIStream,
|
|
FLMBOOL bUnicodeStream,
|
|
FLMUINT uiLanguage,
|
|
FLMUINT uiCompareRules,
|
|
FLMBOOL bMayHaveWildCards) = 0;
|
|
|
|
virtual RCODE FLMAPI closeStream( void) = 0;
|
|
|
|
virtual RCODE FLMAPI read(
|
|
void * pvBuffer,
|
|
FLMUINT uiBytesToRead,
|
|
FLMUINT * puiBytesRead) = 0;
|
|
|
|
virtual RCODE FLMAPI read(
|
|
FLMBOOL bAllowTwoIntoOne,
|
|
FLMUNICODE * puChar,
|
|
FLMBOOL * pbCharIsWild,
|
|
FLMUINT16 * pui16Col,
|
|
FLMUINT16 * pui16SubCol,
|
|
FLMBYTE * pucCase) = 0;
|
|
|
|
virtual FLMUINT64 FLMAPI totalSize( void) = 0;
|
|
|
|
virtual FLMUINT64 FLMAPI remainingSize( void) = 0;
|
|
|
|
virtual RCODE FLMAPI positionTo(
|
|
FLMUINT64 ui64Position) = 0;
|
|
|
|
virtual FLMUINT64 FLMAPI getCurrPosition( void) = 0;
|
|
|
|
virtual RCODE FLMAPI positionTo(
|
|
F_CollStreamPos * pPos) = 0;
|
|
|
|
virtual void FLMAPI getCurrPosition(
|
|
F_CollStreamPos * pPos) = 0;
|
|
};
|
|
|
|
/****************************************************************************
|
|
Desc:
|
|
****************************************************************************/
|
|
flminterface FLMEXP IF_OStream : public F_Object
|
|
{
|
|
virtual RCODE FLMAPI write(
|
|
const void * pvBuffer,
|
|
FLMUINT uiBytesToWrite,
|
|
FLMUINT * puiBytesWritten = NULL) = 0;
|
|
|
|
virtual RCODE FLMAPI closeStream( void) = 0;
|
|
};
|
|
|
|
/****************************************************************************
|
|
Desc:
|
|
****************************************************************************/
|
|
flminterface FLMEXP IF_IOStream : public IF_IStream, public IF_OStream
|
|
{
|
|
#if defined( FLM_WIN) && _MSC_VER < 1300
|
|
using IF_IStream::operator delete;
|
|
#endif
|
|
};
|
|
|
|
/****************************************************************************
|
|
****************************************************************************/
|
|
/// Message severity.
|
|
typedef enum
|
|
{
|
|
F_FATAL_MESSAGE = 0, ///< Indicates that a fatal error occurred - the kind that would normally
|
|
///< require a shutdown or other corrective action by an administrator.
|
|
F_WARN_MESSAGE, ///< Warning message.
|
|
F_ERR_MESSAGE, ///< Non-fatal error message.
|
|
F_INFO_MESSAGE, ///< Information-only message.
|
|
F_DEBUG_MESSAGE ///< Debug message.
|
|
} eLogMessageSeverity;
|
|
|
|
/****************************************************************************
|
|
Desc: Logging
|
|
****************************************************************************/
|
|
|
|
IF_LogMessageClient * FLMAPI f_beginLogMessage(
|
|
FLMUINT uiMsgType,
|
|
eLogMessageSeverity eMsgSeverity);
|
|
|
|
void FLMAPI f_logPrintf(
|
|
IF_LogMessageClient * pLogMessage,
|
|
const char * pszFormatStr, ...);
|
|
|
|
void FLMAPI f_logVPrintf(
|
|
IF_LogMessageClient * pLogMessage,
|
|
const char * szFormatStr,
|
|
f_va_list * args);
|
|
|
|
void FLMAPI f_endLogMessage(
|
|
IF_LogMessageClient ** ppLogMessage);
|
|
|
|
/****************************************************************************
|
|
Desc:
|
|
****************************************************************************/
|
|
flminterface FLMEXP IF_LoggerClient : public F_Object
|
|
{
|
|
virtual IF_LogMessageClient * FLMAPI beginMessage(
|
|
FLMUINT uiMsgType,
|
|
eLogMessageSeverity eMsgSeverity = F_DEBUG_MESSAGE) = 0;
|
|
};
|
|
|
|
void f_setLoggerClient(
|
|
IF_LoggerClient * pLogger);
|
|
|
|
/****************************************************************************
|
|
/// This is an abstract base class that allows an application to catch
|
|
/// messages. The application must create an implementation for this class
|
|
/// and then return an object of that class when the
|
|
/// IF_LoggerClient::beginMessage() method is called.
|
|
****************************************************************************/
|
|
flminterface FLMEXP IF_LogMessageClient : public F_Object
|
|
{
|
|
/// Set the current foreground and background colors for the message.
|
|
virtual void FLMAPI changeColor(
|
|
eColorType eForeColor,
|
|
eColorType eBackColor) = 0;
|
|
|
|
/// Append a string to the message. This method may be called
|
|
/// multiple times by to format a complete message. The message is not
|
|
/// complete until the ::endMessage() method is called.
|
|
virtual void FLMAPI appendString(
|
|
const char * pszStr) = 0;
|
|
|
|
/// Append a newline to the message. This method is called when a
|
|
/// multi-line message is being created. Rather than embedding a
|
|
/// newline character, this method is used. This allows an application
|
|
/// to recognize the fact that there are multiple lines in the message
|
|
/// and to log, display, store, etc. (whatever) them accordingly.
|
|
virtual void FLMAPI newline( void) = 0;
|
|
|
|
/// End the current message. The application should finish logging,
|
|
/// displaying, storing, etc. (whatever) the message. The object
|
|
/// should be reset in case a new message is subsequently started.
|
|
virtual void FLMAPI endMessage( void) = 0;
|
|
|
|
virtual void FLMAPI pushForegroundColor( void) = 0;
|
|
|
|
virtual void FLMAPI popForegroundColor( void) = 0;
|
|
|
|
virtual void FLMAPI pushBackgroundColor( void) = 0;
|
|
|
|
virtual void FLMAPI popBackgroundColor( void) = 0;
|
|
};
|
|
|
|
/****************************************************************************
|
|
Desc:
|
|
****************************************************************************/
|
|
flminterface FLMEXP IF_FileSystem : public F_Object
|
|
{
|
|
virtual RCODE FLMAPI createFile(
|
|
const char * pszFileName,
|
|
FLMUINT uiIoFlags,
|
|
IF_FileHdl ** ppFile) = 0;
|
|
|
|
virtual RCODE FLMAPI createUniqueFile(
|
|
char * pszPath,
|
|
const char * pszFileExtension,
|
|
FLMUINT uiIoFlags,
|
|
IF_FileHdl ** ppFile) = 0;
|
|
|
|
virtual RCODE FLMAPI createLockFile(
|
|
const char * pszPath,
|
|
IF_FileHdl ** ppLockFileHdl) = 0;
|
|
|
|
virtual RCODE FLMAPI openFile(
|
|
const char * pszFileName,
|
|
FLMUINT uiIoFlags,
|
|
IF_FileHdl ** ppFile) = 0;
|
|
|
|
virtual RCODE FLMAPI openDir(
|
|
const char * pszDirName,
|
|
const char * pszPattern,
|
|
IF_DirHdl ** ppDir) = 0;
|
|
|
|
virtual RCODE FLMAPI createDir(
|
|
const char * pszDirName) = 0;
|
|
|
|
virtual RCODE FLMAPI removeDir(
|
|
const char * pszDirName,
|
|
FLMBOOL bClear = FALSE) = 0;
|
|
|
|
virtual RCODE FLMAPI doesFileExist(
|
|
const char * pszFileName) = 0;
|
|
|
|
virtual FLMBOOL FLMAPI isDir(
|
|
const char * pszFileName) = 0;
|
|
|
|
virtual RCODE FLMAPI getFileTimeStamp(
|
|
const char * pszFileName,
|
|
FLMUINT * puiTimeStamp) = 0;
|
|
|
|
virtual RCODE FLMAPI getFileSize(
|
|
const char * pszFileName,
|
|
FLMUINT64 * pui64FileSize) = 0;
|
|
|
|
virtual RCODE FLMAPI deleteFile(
|
|
const char * pszFileName) = 0;
|
|
|
|
virtual RCODE FLMAPI deleteMultiFileStream(
|
|
const char * pszDirectory,
|
|
const char * pszBaseName) = 0;
|
|
|
|
virtual RCODE FLMAPI copyFile(
|
|
const char * pszSrcFileName,
|
|
const char * pszDestFileName,
|
|
FLMBOOL bOverwrite,
|
|
FLMUINT64 * pui64BytesCopied) = 0;
|
|
|
|
virtual RCODE FLMAPI copyPartialFile(
|
|
IF_FileHdl * pSrcFileHdl,
|
|
FLMUINT64 ui64SrcOffset,
|
|
FLMUINT64 ui64SrcSize,
|
|
IF_FileHdl * pDestFileHdl,
|
|
FLMUINT64 ui64DestOffset,
|
|
FLMUINT64 * pui64BytesCopiedRV) = 0;
|
|
|
|
virtual RCODE FLMAPI renameFile(
|
|
const char * pszFileName,
|
|
const char * pszNewFileName) = 0;
|
|
|
|
virtual RCODE FLMAPI setReadOnly(
|
|
const char * pszFileName,
|
|
FLMBOOL bReadOnly) = 0;
|
|
|
|
virtual RCODE FLMAPI getSectorSize(
|
|
const char * pszFileName,
|
|
FLMUINT * puiSectorSize) = 0;
|
|
|
|
virtual void FLMAPI pathCreateUniqueName(
|
|
FLMUINT * puiTime,
|
|
char * pFileName,
|
|
const char * pFileExt,
|
|
FLMBYTE * pHighChars,
|
|
FLMBOOL bModext) = 0;
|
|
|
|
virtual void FLMAPI pathParse(
|
|
const char * pszPath,
|
|
char * pszServer,
|
|
char * pszVolume,
|
|
char * pszDirPath,
|
|
char * pszFileName) = 0;
|
|
|
|
virtual RCODE FLMAPI pathReduce(
|
|
const char * pszSourcePath,
|
|
char * pszDestPath,
|
|
char * pszString) = 0;
|
|
|
|
virtual RCODE FLMAPI pathAppend(
|
|
char * pszPath,
|
|
const char * pszPathComponent) = 0;
|
|
|
|
virtual RCODE FLMAPI pathToStorageString(
|
|
const char * pPath,
|
|
char * pszString) = 0;
|
|
|
|
virtual FLMBOOL FLMAPI doesFileMatch(
|
|
const char * pszFileName,
|
|
const char * pszTemplate) = 0;
|
|
|
|
virtual FLMBOOL FLMAPI canDoAsync( void) = 0;
|
|
|
|
virtual RCODE FLMAPI allocIOBuffer(
|
|
FLMUINT uiMinSize,
|
|
IF_IOBuffer ** ppIOBuffer) = 0;
|
|
|
|
virtual RCODE FLMAPI allocFileHandleCache(
|
|
FLMUINT uiMaxCachedFiles,
|
|
FLMUINT uiIdleTimeoutSecs,
|
|
IF_FileHdlCache ** ppFileHdlCache) = 0;
|
|
};
|
|
|
|
RCODE FLMAPI FlmGetFileSystem(
|
|
IF_FileSystem ** ppFileSystem);
|
|
|
|
IF_FileSystem * FLMAPI f_getFileSysPtr( void);
|
|
|
|
FLMUINT FLMAPI f_getOpenFileCount( void);
|
|
|
|
RCODE FLMAPI f_chdir(
|
|
const char * pszDir);
|
|
|
|
RCODE FLMAPI f_getcwd(
|
|
char * pszDir);
|
|
|
|
RCODE FLMAPI f_pathReduce(
|
|
const char * pszSourcePath,
|
|
char * pszDestPath,
|
|
char * pszString);
|
|
|
|
RCODE FLMAPI f_pathAppend(
|
|
char * pszPath,
|
|
const char * pszPathComponent);
|
|
|
|
/****************************************************************************
|
|
Desc:
|
|
****************************************************************************/
|
|
flminterface FLMEXP IF_FileHdl : virtual public F_Object
|
|
{
|
|
virtual RCODE FLMAPI flush( void) = 0;
|
|
|
|
virtual RCODE FLMAPI read(
|
|
FLMUINT64 ui64Offset,
|
|
FLMUINT uiLength,
|
|
void * pvBuffer,
|
|
FLMUINT * puiBytesRead = NULL) = 0;
|
|
|
|
virtual RCODE FLMAPI read(
|
|
FLMUINT64 ui64ReadOffset,
|
|
FLMUINT uiBytesToRead,
|
|
IF_IOBuffer * pIOBuffer) = 0;
|
|
|
|
virtual RCODE FLMAPI write(
|
|
FLMUINT64 ui64Offset,
|
|
FLMUINT uiLength,
|
|
const void * pvBuffer,
|
|
FLMUINT * puiBytesWritten = NULL) = 0;
|
|
|
|
virtual RCODE FLMAPI write(
|
|
FLMUINT64 ui64WriteOffset,
|
|
FLMUINT uiBytesToWrite,
|
|
IF_IOBuffer * pIOBuffer) = 0;
|
|
|
|
virtual RCODE FLMAPI seek(
|
|
FLMUINT64 ui64Offset,
|
|
FLMINT iWhence,
|
|
FLMUINT64 * pui64NewOffset = NULL) = 0;
|
|
|
|
virtual RCODE FLMAPI size(
|
|
FLMUINT64 * pui64Size) = 0;
|
|
|
|
virtual RCODE FLMAPI tell(
|
|
FLMUINT64 * pui64Offset) = 0;
|
|
|
|
virtual RCODE FLMAPI extendFile(
|
|
FLMUINT64 ui64FileSize) = 0;
|
|
|
|
virtual RCODE FLMAPI truncateFile(
|
|
FLMUINT64 ui64FileSize = 0) = 0;
|
|
|
|
virtual RCODE FLMAPI closeFile( void) = 0;
|
|
|
|
virtual FLMBOOL FLMAPI canDoAsync( void) = 0;
|
|
|
|
virtual FLMBOOL FLMAPI canDoDirectIO( void) = 0;
|
|
|
|
virtual void FLMAPI setExtendSize(
|
|
FLMUINT uiExtendSize) = 0;
|
|
|
|
virtual void FLMAPI setMaxAutoExtendSize(
|
|
FLMUINT uiMaxAutoExtendSize) = 0;
|
|
|
|
virtual FLMUINT FLMAPI getSectorSize( void) = 0;
|
|
|
|
virtual FLMBOOL FLMAPI isReadOnly( void) = 0;
|
|
|
|
virtual FLMBOOL FLMAPI isOpen( void) = 0;
|
|
|
|
virtual RCODE FLMAPI lock( void) = 0;
|
|
|
|
virtual RCODE FLMAPI unlock( void) = 0;
|
|
};
|
|
|
|
/****************************************************************************
|
|
Desc:
|
|
****************************************************************************/
|
|
flminterface FLMEXP IF_FileHdlCache : public F_Object
|
|
{
|
|
virtual RCODE FLMAPI openFile(
|
|
const char * pszFileName,
|
|
FLMUINT uiIoFlags,
|
|
IF_FileHdl ** ppFile) = 0;
|
|
|
|
virtual RCODE FLMAPI createFile(
|
|
const char * pszFileName,
|
|
FLMUINT uiIoFlags,
|
|
IF_FileHdl ** ppFile) = 0;
|
|
|
|
virtual void FLMAPI closeUnusedFiles(
|
|
FLMUINT uiUnusedTime = 0) = 0;
|
|
|
|
virtual FLMUINT FLMAPI getOpenThreshold( void) = 0;
|
|
|
|
virtual RCODE FLMAPI setOpenThreshold(
|
|
FLMUINT uiMaxOpenFiles) = 0;
|
|
};
|
|
|
|
/****************************************************************************
|
|
Desc:
|
|
****************************************************************************/
|
|
flminterface FLMEXP IF_MultiFileHdl : public F_Object
|
|
{
|
|
virtual RCODE FLMAPI createFile(
|
|
const char * pszPath) = 0;
|
|
|
|
virtual RCODE FLMAPI createUniqueFile(
|
|
const char * pszPath,
|
|
const char * pszFileExtension) = 0;
|
|
|
|
virtual RCODE FLMAPI openFile(
|
|
const char * pszPath) = 0;
|
|
|
|
virtual RCODE FLMAPI deleteMultiFile(
|
|
const char * pszPath) = 0;
|
|
|
|
virtual RCODE FLMAPI flush( void) = 0;
|
|
|
|
virtual RCODE FLMAPI read(
|
|
FLMUINT64 ui64Offset,
|
|
FLMUINT uiLength,
|
|
void * pvBuffer,
|
|
FLMUINT * puiBytesRead = NULL) = 0;
|
|
|
|
virtual RCODE FLMAPI write(
|
|
FLMUINT64 ui64Offset,
|
|
FLMUINT uiLength,
|
|
void * pvBuffer,
|
|
FLMUINT * puiBytesWritten = NULL) = 0;
|
|
|
|
virtual RCODE FLMAPI getPath(
|
|
char * pszFilePath) = 0;
|
|
|
|
virtual RCODE FLMAPI size(
|
|
FLMUINT64 * pui64FileSize) = 0;
|
|
|
|
virtual RCODE FLMAPI truncateFile(
|
|
FLMUINT64 ui64Offset = 0) = 0;
|
|
|
|
virtual void FLMAPI closeFile(
|
|
FLMBOOL bDelete = FALSE) = 0;
|
|
};
|
|
|
|
RCODE FLMAPI FlmAllocMultiFileHdl(
|
|
IF_MultiFileHdl ** ppFileHdl);
|
|
|
|
/****************************************************************************
|
|
Desc:
|
|
****************************************************************************/
|
|
flminterface FLMEXP IF_SuperFileClient : public F_Object
|
|
{
|
|
virtual FLMUINT FLMAPI getFileNumber(
|
|
FLMUINT uiBlockAddr) = 0;
|
|
|
|
virtual FLMUINT FLMAPI getFileOffset(
|
|
FLMUINT uiBlockAddr) = 0;
|
|
|
|
virtual FLMUINT FLMAPI getBlockAddress(
|
|
FLMUINT uiFileNumber,
|
|
FLMUINT uiFileOffset) = 0;
|
|
|
|
virtual RCODE FLMAPI getFilePath(
|
|
FLMUINT uiFileNumber,
|
|
char * pszPath) = 0;
|
|
|
|
virtual FLMUINT64 FLMAPI getMaxFileSize( void) = 0;
|
|
};
|
|
|
|
/****************************************************************************
|
|
Desc:
|
|
****************************************************************************/
|
|
class F_SuperFileHdl : public F_Object
|
|
{
|
|
public:
|
|
|
|
F_SuperFileHdl();
|
|
|
|
virtual ~F_SuperFileHdl();
|
|
|
|
RCODE FLMAPI setup(
|
|
IF_SuperFileClient * pSuperFileClient,
|
|
IF_FileHdlCache * pFileHdlCache,
|
|
FLMUINT uiFileOpenFlags,
|
|
FLMUINT uiFileCreateFlags);
|
|
|
|
RCODE FLMAPI createFile(
|
|
FLMUINT uiFileNumber,
|
|
IF_FileHdl ** ppFileHdl = NULL);
|
|
|
|
RCODE FLMAPI getFileHdl(
|
|
FLMUINT uiFileNumber,
|
|
FLMBOOL bGetForUpdate,
|
|
IF_FileHdl ** ppFileHdlRV);
|
|
|
|
RCODE FLMAPI readBlock(
|
|
FLMUINT uiBlkAddress,
|
|
FLMUINT uiBytesToRead,
|
|
void * pvBuffer,
|
|
FLMUINT * puiBytesRead);
|
|
|
|
RCODE FLMAPI writeBlock(
|
|
FLMUINT uiBlkAddress,
|
|
FLMUINT uiBytesToWrite,
|
|
const void * pvBuffer,
|
|
FLMUINT * puiBytesWritten);
|
|
|
|
RCODE FLMAPI writeBlock(
|
|
FLMUINT uiBlkAddress,
|
|
FLMUINT uiBytesToWrite,
|
|
IF_IOBuffer * pIOBuffer);
|
|
|
|
RCODE FLMAPI getFilePath(
|
|
FLMUINT uiFileNumber,
|
|
char * pszPath);
|
|
|
|
RCODE FLMAPI getFileSize(
|
|
FLMUINT uiFileNumber,
|
|
FLMUINT64 * pui64FileSize);
|
|
|
|
RCODE FLMAPI releaseFiles( void);
|
|
|
|
RCODE FLMAPI allocateBlocks(
|
|
FLMUINT uiStartAddress,
|
|
FLMUINT uiEndAddress);
|
|
|
|
RCODE FLMAPI truncateFile(
|
|
FLMUINT uiEOFBlkAddress);
|
|
|
|
RCODE FLMAPI truncateFile(
|
|
FLMUINT uiFileNumber,
|
|
FLMUINT uiOffset);
|
|
|
|
void FLMAPI truncateFiles(
|
|
FLMUINT uiStartFileNum,
|
|
FLMUINT uiEndFileNum);
|
|
|
|
RCODE FLMAPI flush( void);
|
|
|
|
FINLINE void FLMAPI setExtendSize(
|
|
FLMUINT uiExtendSize)
|
|
{
|
|
m_uiExtendSize = uiExtendSize;
|
|
}
|
|
|
|
FINLINE void FLMAPI setMaxAutoExtendSize(
|
|
FLMUINT uiMaxAutoExtendSize)
|
|
{
|
|
m_uiMaxAutoExtendSize = uiMaxAutoExtendSize;
|
|
}
|
|
|
|
FLMBOOL FLMAPI canDoAsync( void);
|
|
|
|
FLMBOOL FLMAPI canDoDirectIO( void);
|
|
|
|
private:
|
|
|
|
IF_SuperFileClient * m_pSuperFileClient;
|
|
IF_FileHdlCache * m_pFileHdlCache;
|
|
IF_FileHdl * m_pCFileHdl;
|
|
IF_FileHdl * m_pBlockFileHdl;
|
|
FLMBOOL m_bCFileDirty;
|
|
FLMBOOL m_bBlockFileDirty;
|
|
FLMUINT m_uiBlockFileNum;
|
|
FLMUINT m_uiMaxFileSize;
|
|
FLMUINT m_uiExtendSize;
|
|
FLMUINT m_uiMaxAutoExtendSize;
|
|
FLMUINT m_uiFileOpenFlags;
|
|
FLMUINT m_uiFileCreateFlags;
|
|
};
|
|
|
|
/****************************************************************************
|
|
Desc:
|
|
****************************************************************************/
|
|
flminterface FLMEXP IF_AsyncClient : virtual public F_Object
|
|
{
|
|
virtual RCODE FLMAPI waitToComplete( void) = 0;
|
|
|
|
virtual RCODE FLMAPI getCompletionCode( void) = 0;
|
|
|
|
virtual FLMUINT FLMAPI getElapsedTime( void) = 0;
|
|
};
|
|
|
|
/****************************************************************************
|
|
Desc:
|
|
****************************************************************************/
|
|
typedef void (FLMAPI * F_BUFFER_COMPLETION_FUNC)(IF_IOBuffer *, void *);
|
|
|
|
/****************************************************************************
|
|
Desc:
|
|
****************************************************************************/
|
|
flminterface FLMEXP IF_IOBuffer : virtual public F_Object
|
|
{
|
|
virtual FLMBYTE * FLMAPI getBufferPtr( void) = 0;
|
|
|
|
virtual FLMUINT FLMAPI getBufferSize( void) = 0;
|
|
|
|
virtual void FLMAPI setCompletionCallback(
|
|
F_BUFFER_COMPLETION_FUNC fnCompletion,
|
|
void * pvData) = 0;
|
|
|
|
virtual RCODE FLMAPI addCallbackData(
|
|
void * pvData) = 0;
|
|
|
|
virtual void * FLMAPI getCallbackData(
|
|
FLMUINT uiSlot) = 0;
|
|
|
|
virtual FLMUINT FLMAPI getCallbackDataCount( void) = 0;
|
|
|
|
virtual void FLMAPI setAsyncClient(
|
|
IF_AsyncClient * pAsyncClient) = 0;
|
|
|
|
virtual void FLMAPI notifyComplete(
|
|
RCODE completionRc) = 0;
|
|
|
|
virtual void FLMAPI setPending( void) = 0;
|
|
|
|
virtual void FLMAPI clearPending( void) = 0;
|
|
|
|
virtual FLMBOOL FLMAPI isPending( void) = 0;
|
|
|
|
virtual FLMBOOL FLMAPI isComplete( void) = 0;
|
|
|
|
virtual RCODE FLMAPI waitToComplete( void) = 0;
|
|
|
|
virtual RCODE FLMAPI getCompletionCode( void) = 0;
|
|
|
|
virtual FLMUINT FLMAPI getElapsedTime( void) = 0;
|
|
};
|
|
|
|
/****************************************************************************
|
|
Desc:
|
|
****************************************************************************/
|
|
flminterface FLMEXP IF_IOBufferMgr : public F_Object
|
|
{
|
|
virtual RCODE FLMAPI getBuffer(
|
|
FLMUINT uiBufferSize,
|
|
IF_IOBuffer ** ppIOBuffer) = 0;
|
|
|
|
virtual FLMBOOL FLMAPI isIOPending( void) = 0;
|
|
|
|
virtual RCODE FLMAPI waitForAllPendingIO( void) = 0;
|
|
};
|
|
|
|
RCODE FLMAPI FlmAllocIOBufferMgr(
|
|
FLMUINT uiMaxBuffers,
|
|
FLMUINT uiMaxBytes,
|
|
FLMBOOL bReuseBuffers,
|
|
IF_IOBufferMgr ** ppIOBufferMgr);
|
|
|
|
/****************************************************************************
|
|
Desc:
|
|
****************************************************************************/
|
|
flminterface FLMEXP IF_DirHdl : public F_Object
|
|
{
|
|
virtual RCODE FLMAPI next( void) = 0;
|
|
|
|
virtual const char * FLMAPI currentItemName( void) = 0;
|
|
|
|
virtual void FLMAPI currentItemPath(
|
|
char * pszPath) = 0;
|
|
|
|
virtual FLMUINT64 FLMAPI currentItemSize( void) = 0;
|
|
|
|
virtual FLMBOOL FLMAPI currentItemIsDir( void) = 0;
|
|
};
|
|
|
|
/****************************************************************************
|
|
Desc:
|
|
****************************************************************************/
|
|
flminterface FLMEXP IF_ResultSetCompare : public F_Object
|
|
{
|
|
virtual RCODE FLMAPI compare(
|
|
const void * pvData1,
|
|
FLMUINT uiLength1,
|
|
const void * pvData2,
|
|
FLMUINT uiLength2,
|
|
FLMINT * piCompare) = 0;
|
|
};
|
|
|
|
/****************************************************************************
|
|
Desc:
|
|
****************************************************************************/
|
|
flminterface FLMEXP IF_ResultSetSortStatus : public F_Object
|
|
{
|
|
virtual RCODE FLMAPI reportSortStatus(
|
|
FLMUINT64 ui64EstTotalUnits,
|
|
FLMUINT64 ui64UnitsDone) = 0;
|
|
};
|
|
|
|
#define RS_POSITION_NOT_SET FLM_MAX_UINT64
|
|
|
|
/****************************************************************************
|
|
Desc:
|
|
****************************************************************************/
|
|
flminterface FLMEXP IF_ResultSet : public F_Object
|
|
{
|
|
virtual RCODE FLMAPI setupResultSet(
|
|
const char * pszPath,
|
|
IF_ResultSetCompare * pCompare,
|
|
FLMUINT uiEntrySize,
|
|
FLMBOOL bDropDuplicates = TRUE,
|
|
FLMBOOL bEntriesInOrder = FALSE,
|
|
const char * pszFileName = NULL) = 0;
|
|
|
|
virtual FLMUINT64 FLMAPI getTotalEntries( void) = 0;
|
|
|
|
virtual RCODE FLMAPI addEntry(
|
|
const void * pvEntry,
|
|
FLMUINT uiEntryLength = 0) = 0;
|
|
|
|
virtual RCODE FLMAPI finalizeResultSet(
|
|
IF_ResultSetSortStatus * pSortStatus = NULL,
|
|
FLMUINT64 * pui64TotalEntries = NULL) = 0;
|
|
|
|
virtual RCODE FLMAPI getFirst(
|
|
void * pvEntryBuffer,
|
|
FLMUINT uiBufferLength = 0,
|
|
FLMUINT * puiEntryLength = NULL) = 0;
|
|
|
|
virtual RCODE FLMAPI getNext(
|
|
void * pvEntryBuffer,
|
|
FLMUINT uiBufferLength = 0,
|
|
FLMUINT * puiEntryLength = NULL) = 0;
|
|
|
|
virtual RCODE FLMAPI getLast(
|
|
void * pvEntryBuffer,
|
|
FLMUINT uiBufferLength = 0,
|
|
FLMUINT * puiEntryLength = NULL) = 0;
|
|
|
|
virtual RCODE FLMAPI getPrev(
|
|
void * pvEntryBuffer,
|
|
FLMUINT uiBufferLength = 0,
|
|
FLMUINT * puiEntryLength = NULL) = 0;
|
|
|
|
virtual RCODE FLMAPI getCurrent(
|
|
void * pvEntryBuffer,
|
|
FLMUINT uiBufferLength = 0,
|
|
FLMUINT * puiEntryLength = NULL) = 0;
|
|
|
|
virtual RCODE FLMAPI findMatch(
|
|
const void * pvMatchEntry,
|
|
void * pvFoundEntry) = 0;
|
|
|
|
virtual RCODE FLMAPI findMatch(
|
|
const void * pvMatchEntry,
|
|
FLMUINT uiMatchEntryLength,
|
|
void * pvFoundEntry,
|
|
FLMUINT * puiFoundEntryLength) = 0;
|
|
|
|
virtual RCODE FLMAPI modifyCurrent(
|
|
const void * pvEntry,
|
|
FLMUINT uiEntryLength = 0) = 0;
|
|
|
|
virtual FLMUINT64 FLMAPI getPosition( void) = 0;
|
|
|
|
virtual RCODE FLMAPI setPosition(
|
|
FLMUINT64 ui64Position) = 0;
|
|
|
|
virtual RCODE FLMAPI resetResultSet(
|
|
FLMBOOL bDelete = TRUE) = 0;
|
|
|
|
virtual RCODE FLMAPI flushToFile( void) = 0;
|
|
|
|
};
|
|
|
|
RCODE FLMAPI FlmAllocResultSet(
|
|
IF_ResultSet ** ppResultSet);
|
|
|
|
/*****************************************************************************
|
|
Desc:
|
|
*****************************************************************************/
|
|
flminterface FLMEXP IF_BTreeResultSet : public F_Object
|
|
{
|
|
virtual RCODE FLMAPI addEntry(
|
|
FLMBYTE * pucKey,
|
|
FLMUINT uiKeyLength,
|
|
FLMBYTE * pucEntry,
|
|
FLMUINT uiEntryLength) = 0;
|
|
|
|
virtual RCODE FLMAPI modifyEntry(
|
|
FLMBYTE * pucKey,
|
|
FLMUINT uiKeyLength,
|
|
FLMBYTE * pucEntry,
|
|
FLMUINT uiEntryLength) = 0;
|
|
|
|
virtual RCODE FLMAPI getCurrent(
|
|
FLMBYTE * pucKey,
|
|
FLMUINT uiKeyLength,
|
|
FLMBYTE * pucEntry,
|
|
FLMUINT uiEntryLength,
|
|
FLMUINT * puiReturnLength) = 0;
|
|
|
|
virtual RCODE FLMAPI getNext(
|
|
FLMBYTE * pucKey,
|
|
FLMUINT uiKeyBufLen,
|
|
FLMUINT * puiKeylen,
|
|
FLMBYTE * pucBuffer,
|
|
FLMUINT uiBufferLength,
|
|
FLMUINT * puiReturnLength) = 0;
|
|
|
|
virtual RCODE FLMAPI getPrev(
|
|
FLMBYTE * pucKey,
|
|
FLMUINT uiKeyBufLen,
|
|
FLMUINT * puiKeylen,
|
|
FLMBYTE * pucBuffer,
|
|
FLMUINT uiBufferLength,
|
|
FLMUINT * puiReturnLength) = 0;
|
|
|
|
virtual RCODE FLMAPI getFirst(
|
|
FLMBYTE * pucKey,
|
|
FLMUINT uiKeyBufLen,
|
|
FLMUINT * puiKeylen,
|
|
FLMBYTE * pucBuffer,
|
|
FLMUINT uiBufferLength,
|
|
FLMUINT * puiReturnLength) = 0;
|
|
|
|
virtual RCODE FLMAPI getLast(
|
|
FLMBYTE * pucKey,
|
|
FLMUINT uiKeyBufLen,
|
|
FLMUINT * puiKeylen,
|
|
FLMBYTE * pucBuffer,
|
|
FLMUINT uiBufferLength,
|
|
FLMUINT * puiReturnLength) = 0;
|
|
|
|
virtual RCODE FLMAPI findEntry(
|
|
FLMBYTE * pucKey,
|
|
FLMUINT uiKeyBufLen,
|
|
FLMUINT * puiKeylen,
|
|
FLMBYTE * pucBuffer,
|
|
FLMUINT uiBufferLength,
|
|
FLMUINT * puiReturnLength) = 0;
|
|
|
|
virtual RCODE FLMAPI deleteEntry(
|
|
FLMBYTE * pucKey,
|
|
FLMUINT uiKeyLength) = 0;
|
|
};
|
|
|
|
/****************************************************************************
|
|
Desc: Random numbers
|
|
****************************************************************************/
|
|
|
|
#define FLM_MAX_RANDOM ((FLMUINT32)2147483646)
|
|
|
|
flminterface FLMEXP IF_RandomGenerator : public F_Object
|
|
{
|
|
virtual void FLMAPI randomize( void) = 0;
|
|
|
|
virtual void FLMAPI setSeed(
|
|
FLMUINT32 ui32seed) = 0;
|
|
|
|
virtual FLMUINT32 FLMAPI getSeed( void) = 0;
|
|
|
|
virtual FLMUINT32 FLMAPI getUINT32(
|
|
FLMUINT32 ui32Low = 0,
|
|
FLMUINT32 ui32High = FLM_MAX_RANDOM) = 0;
|
|
|
|
virtual FLMBOOL FLMAPI getBoolean( void) = 0;
|
|
};
|
|
|
|
RCODE FLMAPI FlmAllocRandomGenerator(
|
|
IF_RandomGenerator ** ppRandomGenerator);
|
|
|
|
FLMUINT32 FLMAPI f_getRandomUINT32(
|
|
FLMUINT32 ui32Low = 0,
|
|
FLMUINT32 ui32High = FLM_MAX_RANDOM);
|
|
|
|
FLMBYTE FLMAPI f_getRandomByte( void);
|
|
|
|
/**********************************************************************
|
|
Desc: Atomic operations
|
|
**********************************************************************/
|
|
FLMINT32 FLMAPI f_atomicInc(
|
|
FLMATOMIC * piTarget);
|
|
|
|
FLMINT32 FLMAPI f_atomicDec(
|
|
FLMATOMIC * piTarget);
|
|
|
|
FLMINT32 FLMAPI f_atomicExchange(
|
|
FLMATOMIC * piTarget,
|
|
FLMINT32 i32NewVal);
|
|
|
|
/****************************************************************************
|
|
Desc: Mutexes
|
|
****************************************************************************/
|
|
typedef void * F_MUTEX;
|
|
#define F_MUTEX_NULL NULL
|
|
|
|
RCODE FLMAPI f_mutexCreate(
|
|
F_MUTEX * phMutex);
|
|
|
|
void FLMAPI f_mutexDestroy(
|
|
F_MUTEX * phMutex);
|
|
|
|
void FLMAPI f_mutexLock(
|
|
F_MUTEX hMutex);
|
|
|
|
void FLMAPI f_mutexUnlock(
|
|
F_MUTEX hMutex);
|
|
|
|
#ifdef FLM_DEBUG
|
|
void FLMAPI f_assertMutexLocked(
|
|
F_MUTEX hMutex);
|
|
#else
|
|
#define f_assertMutexLocked( h) (void)(h)
|
|
#endif
|
|
|
|
#ifdef FLM_DEBUG
|
|
void FLMAPI f_assertMutexNotLocked(
|
|
F_MUTEX hMutex);
|
|
#else
|
|
#define f_assertMutexNotLocked( h) (void)(h)
|
|
#endif
|
|
|
|
/****************************************************************************
|
|
Desc: Semaphores
|
|
****************************************************************************/
|
|
typedef void * F_SEM;
|
|
#define F_SEM_NULL NULL
|
|
|
|
RCODE FLMAPI f_semCreate(
|
|
F_SEM * phSem);
|
|
|
|
void FLMAPI f_semDestroy(
|
|
F_SEM * phSem);
|
|
|
|
RCODE FLMAPI f_semWait(
|
|
F_SEM hSem,
|
|
FLMUINT uiTimeout);
|
|
|
|
void FLMAPI f_semSignal(
|
|
F_SEM hSem);
|
|
|
|
FLMUINT FLMAPI f_semGetSignalCount(
|
|
F_SEM hSem);
|
|
|
|
/****************************************************************************
|
|
Desc: Notify Lists
|
|
****************************************************************************/
|
|
|
|
typedef struct F_NOTIFY_LIST_ITEM
|
|
{
|
|
F_NOTIFY_LIST_ITEM * pNext; ///< Pointer to next F_NOTIFY_LIST_ITEM structure in list.
|
|
FLMUINT uiThreadId; ///< ID of thread requesting the notify
|
|
RCODE * pRc; ///< Pointer to a return code variable that is to
|
|
///< be filled in when the operation is completed.
|
|
///< The thread requesting notification supplies
|
|
///< the return code variable to be filled in.
|
|
void * pvData; ///< Data that is passed through to a custom
|
|
///< notify routine
|
|
F_SEM hSem; ///< Semaphore that will be signaled when the
|
|
///< operation is complete.
|
|
} F_NOTIFY_LIST_ITEM;
|
|
|
|
RCODE FLMAPI f_notifyWait(
|
|
F_MUTEX hMutex,
|
|
F_SEM hSem,
|
|
void * pvData,
|
|
F_NOTIFY_LIST_ITEM ** ppNotifyList);
|
|
|
|
void FLMAPI f_notifySignal(
|
|
F_NOTIFY_LIST_ITEM * pNotifyList,
|
|
RCODE notifyRc);
|
|
|
|
/****************************************************************************
|
|
Desc: Reader / Writer Locks
|
|
****************************************************************************/
|
|
typedef void * F_RWLOCK;
|
|
#define F_RWLOCK_NULL NULL
|
|
|
|
RCODE FLMAPI f_rwlockCreate(
|
|
F_RWLOCK * phReadWriteLock);
|
|
|
|
void FLMAPI f_rwlockDestroy(
|
|
F_RWLOCK * phReadWriteLock);
|
|
|
|
RCODE FLMAPI f_rwlockAcquire(
|
|
F_RWLOCK hReadWriteLock,
|
|
F_SEM hSem,
|
|
FLMBOOL bWriter);
|
|
|
|
RCODE FLMAPI f_rwlockPromote(
|
|
F_RWLOCK hReadWriteLock,
|
|
F_SEM hSem);
|
|
|
|
RCODE FLMAPI f_rwlockRelease(
|
|
F_RWLOCK hReadWriteLock);
|
|
|
|
/****************************************************************************
|
|
Desc: Thread manager
|
|
****************************************************************************/
|
|
flminterface FLMEXP IF_ThreadMgr : public F_Object
|
|
{
|
|
virtual RCODE FLMAPI setupThreadMgr( void) = 0;
|
|
|
|
virtual RCODE FLMAPI createThread(
|
|
IF_Thread ** ppThread,
|
|
F_THREAD_FUNC fnThread,
|
|
const char * pszThreadName = NULL,
|
|
FLMUINT uiThreadGroup = 0,
|
|
FLMUINT uiAppId = 0,
|
|
void * pvParm1 = NULL,
|
|
void * pvParm2 = NULL,
|
|
FLMUINT uiStackSize = F_THREAD_DEFAULT_STACK_SIZE) = 0;
|
|
|
|
virtual void FLMAPI shutdownThreadGroup(
|
|
FLMUINT uiThreadGroup) = 0;
|
|
|
|
virtual void FLMAPI setThreadShutdownFlag(
|
|
FLMUINT uiThreadId) = 0;
|
|
|
|
virtual RCODE FLMAPI findThread(
|
|
IF_Thread ** ppThread,
|
|
FLMUINT uiThreadGroup,
|
|
FLMUINT uiAppId = 0,
|
|
FLMBOOL bOkToFindMe = TRUE) = 0;
|
|
|
|
virtual RCODE FLMAPI getNextGroupThread(
|
|
IF_Thread ** ppThread,
|
|
FLMUINT uiThreadGroup,
|
|
FLMUINT * puiThreadId) = 0;
|
|
|
|
virtual RCODE FLMAPI getThreadInfo(
|
|
F_Pool * pPool,
|
|
F_THREAD_INFO ** ppThreadInfo,
|
|
FLMUINT * puiNumThreads) = 0;
|
|
|
|
virtual RCODE FLMAPI getThreadName(
|
|
FLMUINT uiThreadId,
|
|
char * pszThreadName,
|
|
FLMUINT * puiLength) = 0;
|
|
|
|
virtual FLMUINT FLMAPI getThreadGroupCount(
|
|
FLMUINT uiThreadGroup) = 0;
|
|
|
|
virtual FLMUINT FLMAPI allocGroupId( void) = 0;
|
|
};
|
|
|
|
RCODE FLMAPI FlmGetThreadMgr(
|
|
IF_ThreadMgr ** ppThreadMgr);
|
|
|
|
/****************************************************************************
|
|
Desc: Thread
|
|
****************************************************************************/
|
|
flminterface FLMEXP IF_Thread : public F_Object
|
|
{
|
|
virtual RCODE FLMAPI startThread(
|
|
F_THREAD_FUNC fnThread,
|
|
const char * pszThreadName = NULL,
|
|
FLMUINT uiThreadGroup = F_DEFAULT_THREAD_GROUP,
|
|
FLMUINT uiAppId = 0,
|
|
void * pvParm1 = NULL,
|
|
void * pvParm2 = NULL,
|
|
FLMUINT uiStackSize = F_THREAD_DEFAULT_STACK_SIZE) = 0;
|
|
|
|
virtual void FLMAPI stopThread( void) = 0;
|
|
|
|
virtual FLMUINT FLMAPI getThreadId( void) = 0;
|
|
|
|
virtual FLMBOOL FLMAPI getShutdownFlag( void) = 0;
|
|
|
|
virtual RCODE FLMAPI getExitCode( void) = 0;
|
|
|
|
virtual void * FLMAPI getParm1( void) = 0;
|
|
|
|
virtual void FLMAPI setParm1(
|
|
void * pvParm) = 0;
|
|
|
|
virtual void * FLMAPI getParm2( void) = 0;
|
|
|
|
virtual void FLMAPI setParm2(
|
|
void * pvParm) = 0;
|
|
|
|
virtual void FLMAPI setShutdownFlag( void) = 0;
|
|
|
|
virtual FLMBOOL FLMAPI isThreadRunning( void) = 0;
|
|
|
|
virtual void FLMAPI setThreadStatusStr(
|
|
const char * pszStatus) = 0;
|
|
|
|
virtual void FLMAPI setThreadStatus(
|
|
const char * pszBuffer, ...) = 0;
|
|
|
|
virtual void FLMAPI setThreadStatus(
|
|
eThreadStatus genericStatus) = 0;
|
|
|
|
virtual void FLMAPI setThreadAppId(
|
|
FLMUINT uiAppId) = 0;
|
|
|
|
virtual FLMUINT FLMAPI getThreadAppId( void) = 0;
|
|
|
|
virtual FLMUINT FLMAPI getThreadGroup( void) = 0;
|
|
|
|
virtual void FLMAPI cleanupThread( void) = 0;
|
|
|
|
virtual void FLMAPI sleep(
|
|
FLMUINT uiMilliseconds) = 0;
|
|
|
|
virtual void FLMAPI waitToComplete( void) = 0;
|
|
};
|
|
|
|
RCODE FLMAPI f_threadCreate(
|
|
IF_Thread ** ppThread,
|
|
F_THREAD_FUNC fnThread,
|
|
const char * pszThreadName = NULL,
|
|
FLMUINT uiThreadGroup = F_DEFAULT_THREAD_GROUP,
|
|
FLMUINT uiAppId = 0,
|
|
void * pvParm1 = NULL,
|
|
void * pvParm2 = NULL,
|
|
FLMUINT uiStackSize = F_THREAD_DEFAULT_STACK_SIZE);
|
|
|
|
void FLMAPI f_threadDestroy(
|
|
IF_Thread ** ppThread);
|
|
|
|
FLMUINT FLMAPI f_threadId( void);
|
|
|
|
/****************************************************************************
|
|
Desc:
|
|
****************************************************************************/
|
|
flminterface FLMEXP IF_IniFile : public F_Object
|
|
{
|
|
virtual RCODE FLMAPI read(
|
|
const char * pszFileName) = 0;
|
|
|
|
virtual RCODE FLMAPI write( void) = 0;
|
|
|
|
virtual FLMBOOL FLMAPI getParam(
|
|
const char * pszParamName,
|
|
FLMUINT * puiParamVal) = 0;
|
|
|
|
virtual FLMBOOL FLMAPI getParam(
|
|
const char * pszParamName,
|
|
FLMBOOL * pbParamVal) = 0;
|
|
|
|
virtual FLMBOOL FLMAPI getParam(
|
|
const char * pszParamName,
|
|
char ** ppszParamVal) = 0;
|
|
|
|
virtual RCODE FLMAPI setParam(
|
|
const char * pszParamName,
|
|
FLMUINT uiParamVal) = 0;
|
|
|
|
virtual RCODE FLMAPI setParam(
|
|
const char * pszParamName,
|
|
FLMBOOL bParamVal) = 0;
|
|
|
|
virtual RCODE FLMAPI setParam(
|
|
const char * pszParamName,
|
|
const char * pszParamVal) = 0;
|
|
|
|
virtual FLMBOOL FLMAPI testParam(
|
|
const char * pszParamName) = 0;
|
|
};
|
|
|
|
RCODE FLMAPI FlmAllocIniFile(
|
|
IF_IniFile ** ppIniFile);
|
|
|
|
/****************************************************************************
|
|
Desc: Serial numbers
|
|
****************************************************************************/
|
|
RCODE FLMAPI f_createSerialNumber(
|
|
FLMBYTE * pszSerialNumber);
|
|
|
|
#define F_SERIAL_NUM_SIZE 16
|
|
|
|
/****************************************************************************
|
|
Desc: Checksum
|
|
****************************************************************************/
|
|
void FLMAPI f_updateCRC(
|
|
const void * pvBuffer,
|
|
FLMUINT uiLength,
|
|
FLMUINT32 * pui32CRC);
|
|
|
|
FLMUINT32 FLMAPI f_calcFastChecksum(
|
|
const void * pvBuffer,
|
|
FLMUINT uiLength,
|
|
FLMUINT * puiSum = NULL,
|
|
FLMUINT * puiXOR = NULL);
|
|
|
|
FLMBYTE FLMAPI f_calcPacketChecksum(
|
|
const void * pvPacket,
|
|
FLMUINT uiBytesToChecksum);
|
|
|
|
/****************************************************************************
|
|
Desc:
|
|
****************************************************************************/
|
|
char * FLMAPI f_uwtoa(
|
|
FLMUINT16 value,
|
|
char * ptr);
|
|
|
|
char * FLMAPI f_udtoa(
|
|
FLMUINT value,
|
|
char * ptr);
|
|
|
|
char * FLMAPI f_wtoa(
|
|
FLMINT16 value,
|
|
char * ptr);
|
|
|
|
char * FLMAPI f_dtoa(
|
|
FLMINT value,
|
|
char * ptr);
|
|
|
|
char * FLMAPI f_ui64toa(
|
|
FLMUINT64 value,
|
|
char * ptr);
|
|
|
|
char * FLMAPI f_i64toa(
|
|
FLMINT64 value,
|
|
char * ptr);
|
|
|
|
FLMINT FLMAPI f_atoi(
|
|
const char * ptr);
|
|
|
|
FLMINT FLMAPI f_atol(
|
|
const char * ptr);
|
|
|
|
FLMINT FLMAPI f_atod(
|
|
const char * ptr);
|
|
|
|
FLMUINT FLMAPI f_atoud(
|
|
const char * ptr,
|
|
FLMBOOL bAllowUnprefixedHex = FALSE);
|
|
|
|
FLMUINT64 FLMAPI f_atou64(
|
|
const char * pszBuf);
|
|
|
|
FLMUINT FLMAPI f_unilen(
|
|
const FLMUNICODE * puzStr);
|
|
|
|
FLMUNICODE * FLMAPI f_unicpy(
|
|
FLMUNICODE * puzDestStr,
|
|
const FLMUNICODE * puzSrcStr);
|
|
|
|
FLMBOOL FLMAPI f_uniIsUpper(
|
|
FLMUNICODE uChar);
|
|
|
|
FLMBOOL FLMAPI f_uniIsLower(
|
|
FLMUNICODE uChar);
|
|
|
|
FLMBOOL FLMAPI f_uniIsAlpha(
|
|
FLMUNICODE uChar);
|
|
|
|
FLMBOOL FLMAPI f_uniIsDecimalDigit(
|
|
FLMUNICODE uChar);
|
|
|
|
FLMUNICODE FLMAPI f_uniToLower(
|
|
FLMUNICODE uChar);
|
|
|
|
FLMINT FLMAPI f_unicmp(
|
|
const FLMUNICODE * puzStr1,
|
|
const FLMUNICODE * puzStr2);
|
|
|
|
FLMINT FLMAPI f_uniicmp(
|
|
const FLMUNICODE * puzStr1,
|
|
const FLMUNICODE * puzStr2);
|
|
|
|
FLMINT FLMAPI f_uninativecmp(
|
|
const FLMUNICODE * puzStr1,
|
|
const char * pszStr2);
|
|
|
|
FLMINT FLMAPI f_uninativencmp(
|
|
const FLMUNICODE * puzStr1,
|
|
const char * pszStr2,
|
|
FLMUINT uiCount);
|
|
|
|
RCODE FLMAPI f_nextUCS2Char(
|
|
const FLMBYTE ** ppszUTF8,
|
|
const FLMBYTE * pszEndOfUTF8String,
|
|
FLMUNICODE * puzChar);
|
|
|
|
RCODE FLMAPI f_numUCS2Chars(
|
|
const FLMBYTE * pszUTF8,
|
|
FLMUINT * puiNumChars);
|
|
|
|
FLMBOOL FLMAPI f_isWhitespace(
|
|
FLMUNICODE ucChar);
|
|
|
|
FLMUNICODE FLMAPI f_convertChar(
|
|
FLMUNICODE uzChar,
|
|
FLMUINT uiCompareRules);
|
|
|
|
RCODE FLMAPI f_wpToUnicode(
|
|
FLMUINT16 ui16WPChar,
|
|
FLMUNICODE * puUniChar);
|
|
|
|
FLMBOOL FLMAPI f_unicodeToWP(
|
|
FLMUNICODE uUniChar,
|
|
FLMUINT16 * pui16WPChar);
|
|
|
|
FLMBOOL FLMAPI f_depricatedUnicodeToWP(
|
|
FLMUNICODE uUniChar,
|
|
FLMUINT16 * pui16WPChar);
|
|
|
|
FLMUINT16 FLMAPI f_wpUpper(
|
|
FLMUINT16 ui16WpChar);
|
|
|
|
FLMBOOL FLMAPI f_wpIsUpper(
|
|
FLMUINT16 ui16WpChar);
|
|
|
|
FLMUINT16 FLMAPI f_wpLower(
|
|
FLMUINT16 ui16WpChar);
|
|
|
|
FLMBOOL FLMAPI f_breakWPChar(
|
|
FLMUINT16 ui16WpChar,
|
|
FLMUINT16 * pui16BaseChar,
|
|
FLMUINT16 * pui16DiacriticChar);
|
|
|
|
FLMBOOL FLMAPI f_combineWPChar(
|
|
FLMUINT16 * pui16WpChar,
|
|
FLMUINT16 ui16BaseChar,
|
|
FLMINT16 ui16DiacriticChar);
|
|
|
|
FLMUINT16 FLMAPI f_wpGetCollationImp(
|
|
FLMUINT16 ui16WpChar,
|
|
FLMUINT uiLanguage);
|
|
|
|
FINLINE FLMUINT16 FLMAPI f_wpGetCollation(
|
|
FLMUINT16 ui16WpChar,
|
|
FLMUINT uiLanguage)
|
|
{
|
|
if( uiLanguage == FLM_US_LANG)
|
|
{
|
|
return( gv_pui16USCollationTable[ ui16WpChar]);
|
|
}
|
|
|
|
return( f_wpGetCollationImp( ui16WpChar, uiLanguage));
|
|
}
|
|
|
|
RCODE FLMAPI f_wpCheckDoubleCollation(
|
|
IF_PosIStream * pIStream,
|
|
FLMBOOL bUnicodeStream,
|
|
FLMBOOL bAllowTwoIntoOne,
|
|
FLMUNICODE * puzChar,
|
|
FLMUNICODE * puzChar2,
|
|
FLMBOOL * pbTwoIntoOne,
|
|
FLMUINT uiLanguage);
|
|
|
|
FLMUINT16 FLMAPI f_wpCheckDoubleCollation(
|
|
FLMUINT16 * pui16WpChar,
|
|
FLMBOOL * pbTwoIntoOne,
|
|
const FLMBYTE ** ppucInputStr,
|
|
FLMUINT uiLanguage);
|
|
|
|
FLMUINT16 FLMAPI f_wpHanToZenkaku(
|
|
FLMUINT16 ui16WpChar,
|
|
FLMUINT16 ui16NextWpChar,
|
|
FLMUINT16 * pui16Zenkaku);
|
|
|
|
FLMUINT16 FLMAPI f_wpZenToHankaku(
|
|
FLMUINT16 ui16WpChar,
|
|
FLMUINT16 * pui16DakutenOrHandakuten);
|
|
|
|
FLMUINT FLMAPI f_wpToMixed(
|
|
FLMBYTE * pucWPStr,
|
|
FLMUINT uiWPStrLen,
|
|
const FLMBYTE * pucLowUpBitStr,
|
|
FLMUINT uiLang);
|
|
|
|
RCODE FLMAPI f_asiaParseSubCol(
|
|
FLMBYTE * pucWPStr,
|
|
FLMUINT * puiWPStrLen,
|
|
FLMUINT uiMaxWPBytes,
|
|
const FLMBYTE * pucSubColBuf,
|
|
FLMUINT * puiSubColBitPos);
|
|
|
|
RCODE FLMAPI f_asiaColStr2WPStr(
|
|
const FLMBYTE * pucColStr,
|
|
FLMUINT uiColStrLen,
|
|
FLMBYTE * pucWPStr,
|
|
FLMUINT * puiWPStrLen,
|
|
FLMUINT * puiUnconvChars,
|
|
FLMBOOL * pbDataTruncated,
|
|
FLMBOOL * pbFirstSubstring);
|
|
|
|
RCODE FLMAPI f_colStr2WPStr(
|
|
const FLMBYTE * pucColStr,
|
|
FLMUINT uiColStrLen,
|
|
FLMBYTE * pucWPStr,
|
|
FLMUINT * puiWPStrLen,
|
|
FLMUINT uiLang,
|
|
FLMUINT * puiUnconvChars,
|
|
FLMBOOL * pbDataTruncated,
|
|
FLMBOOL * pbFirstSubstring);
|
|
|
|
RCODE FLMAPI f_asiaUTF8ToColText(
|
|
IF_PosIStream * pIStream,
|
|
FLMBYTE * pucColStr,
|
|
FLMUINT * puiColStrLen,
|
|
FLMBOOL bCaseInsensitive,
|
|
FLMUINT * puiCollationLen,
|
|
FLMUINT * puiCaseLen,
|
|
FLMUINT uiCharLimit,
|
|
FLMBOOL bFirstSubstring,
|
|
FLMBOOL bDataTruncated,
|
|
FLMBOOL * pbDataTruncated);
|
|
|
|
RCODE FLMAPI f_compareUTF8Strings(
|
|
const FLMBYTE * pucLString,
|
|
FLMUINT uiLStrBytes,
|
|
FLMBOOL bLeftWild,
|
|
const FLMBYTE * pucRString,
|
|
FLMUINT uiRStrBytes,
|
|
FLMBOOL bRightWild,
|
|
FLMUINT uiCompareRules,
|
|
FLMUINT uiLanguage,
|
|
FLMINT * piResult);
|
|
|
|
RCODE FLMAPI f_compareUTF8Streams(
|
|
IF_PosIStream * pLStream,
|
|
FLMBOOL bLeftWild,
|
|
IF_PosIStream * pRStream,
|
|
FLMBOOL bRightWild,
|
|
FLMUINT uiCompareRules,
|
|
FLMUINT uiLanguage,
|
|
FLMINT * piResult);
|
|
|
|
RCODE FLMAPI f_compareUnicodeStrings(
|
|
const FLMUNICODE * puzLString,
|
|
FLMUINT uiLStrBytes,
|
|
FLMBOOL bLeftWild,
|
|
const FLMUNICODE * puzRString,
|
|
FLMUINT uiRStrBytes,
|
|
FLMBOOL bRightWild,
|
|
FLMUINT uiCompareRules,
|
|
FLMUINT uiLanguage,
|
|
FLMINT * piResult);
|
|
|
|
RCODE FLMAPI f_compareUnicodeStreams(
|
|
IF_PosIStream * pLStream,
|
|
FLMBOOL bLeftWild,
|
|
IF_PosIStream * pRStream,
|
|
FLMBOOL bRightWild,
|
|
FLMUINT uiCompareRules,
|
|
FLMUINT uiLanguage,
|
|
FLMINT * piResult);
|
|
|
|
RCODE FLMAPI f_compareCollStreams(
|
|
IF_CollIStream * pLStream,
|
|
IF_CollIStream * pRStream,
|
|
FLMBOOL bOpIsMatch,
|
|
FLMUINT uiLanguage,
|
|
FLMINT * piResult);
|
|
|
|
RCODE FLMAPI f_utf8IsSubStr(
|
|
const FLMBYTE * pszString,
|
|
const FLMBYTE * pszSubString,
|
|
FLMUINT uiCompareRules,
|
|
FLMUINT uiLanguage,
|
|
FLMBOOL * pbExists);
|
|
|
|
RCODE FLMAPI f_readUTF8CharAsUnicode(
|
|
IF_IStream * pStream,
|
|
FLMUNICODE * puChar);
|
|
|
|
RCODE FLMAPI f_readUTF8CharAsUTF8(
|
|
IF_IStream * pIStream,
|
|
FLMBYTE * pucBuf,
|
|
FLMUINT * puiLen);
|
|
|
|
RCODE FLMAPI f_formatUTF8Text(
|
|
IF_PosIStream * pIStream,
|
|
FLMBOOL bAllowEscapes,
|
|
FLMUINT uiCompareRules,
|
|
F_DynaBuf * pDynaBuf);
|
|
|
|
RCODE FLMAPI f_getNextMetaphone(
|
|
IF_IStream * pIStream,
|
|
FLMUINT * puiMetaphone,
|
|
FLMUINT * puiAltMetaphone = NULL);
|
|
|
|
FLMUINT FLMAPI f_getSENLength(
|
|
FLMBYTE ucByte);
|
|
|
|
FLMUINT FLMAPI f_getSENByteCount(
|
|
FLMUINT64 ui64Num);
|
|
|
|
FLMUINT FLMAPI f_encodeSEN(
|
|
FLMUINT64 ui64Value,
|
|
FLMBYTE ** ppucBuffer,
|
|
FLMUINT uiBytesWanted = 0);
|
|
|
|
RCODE FLMAPI f_encodeSEN(
|
|
FLMUINT64 ui64Value,
|
|
FLMBYTE ** ppucBuffer,
|
|
FLMBYTE * pucEnd);
|
|
|
|
FLMUINT FLMAPI f_encodeSENKnownLength(
|
|
FLMUINT64 ui64Value,
|
|
FLMUINT uiSenLen,
|
|
FLMBYTE ** ppucBuffer);
|
|
|
|
RCODE FLMAPI f_decodeSEN(
|
|
const FLMBYTE ** ppucBuffer,
|
|
const FLMBYTE * pucEnd,
|
|
FLMUINT * puiValue);
|
|
|
|
RCODE FLMAPI f_decodeSEN64(
|
|
const FLMBYTE ** ppucBuffer,
|
|
const FLMBYTE * pucEnd,
|
|
FLMUINT64 * pui64Value);
|
|
|
|
RCODE FLMAPI f_readSEN(
|
|
IF_IStream * pIStream,
|
|
FLMUINT * puiValue,
|
|
FLMUINT * puiLength = NULL);
|
|
|
|
RCODE FLMAPI f_readSEN64(
|
|
IF_IStream * pIStream,
|
|
FLMUINT64 * pui64Value,
|
|
FLMUINT * puiLength = NULL);
|
|
|
|
/// Get the language string from a language code
|
|
/// \ingroup language
|
|
FLMUINT FLMAPI f_languageToNum(
|
|
const char * pszLanguage);
|
|
|
|
/// Convert a language string to the appropriate language code.
|
|
/// \ingroup language
|
|
void FLMAPI f_languageToStr(
|
|
FLMINT iLangNum,
|
|
char * pszLanguage ///< Language string that is to be converted to a code.
|
|
);
|
|
|
|
/****************************************************************************
|
|
Desc: ASCII character constants and macros
|
|
****************************************************************************/
|
|
|
|
#define ASCII_TAB 0x09
|
|
#define ASCII_NEWLINE 0x0A
|
|
#define ASCII_CR 0x0D
|
|
#define ASCII_CTRLZ 0x1A
|
|
#define ASCII_SPACE 0x20
|
|
#define ASCII_DQUOTE 0x22
|
|
#define ASCII_POUND 0x23
|
|
#define ASCII_DOLLAR 0x24
|
|
#define ASCII_SQUOTE 0x27
|
|
#define ASCII_WILDCARD 0x2A
|
|
#define ASCII_PLUS 0x2B
|
|
#define ASCII_COMMA 0x2C
|
|
#define ASCII_DASH 0x2D
|
|
#define ASCII_MINUS 0x2D
|
|
#define ASCII_DOT 0x2E
|
|
#define ASCII_SLASH 0x2F
|
|
#define ASCII_COLON 0x3A
|
|
#define ASCII_SEMICOLON 0x3B
|
|
#define ASCII_EQUAL 0x3D
|
|
#define ASCII_QUESTIONMARK 0x3F
|
|
#define ASCII_AT 0x40
|
|
#define ASCII_BACKSLASH 0x5C
|
|
#define ASCII_CARAT 0x5E
|
|
#define ASCII_UNDERSCORE 0x5F
|
|
#define ASCII_TILDE 0x7E
|
|
#define ASCII_AMP 0x26
|
|
|
|
#define ASCII_UPPER_A 0x41
|
|
#define ASCII_UPPER_B 0x42
|
|
#define ASCII_UPPER_C 0x43
|
|
#define ASCII_UPPER_D 0x44
|
|
#define ASCII_UPPER_E 0x45
|
|
#define ASCII_UPPER_F 0x46
|
|
#define ASCII_UPPER_G 0x47
|
|
#define ASCII_UPPER_H 0x48
|
|
#define ASCII_UPPER_I 0x49
|
|
#define ASCII_UPPER_J 0x4A
|
|
#define ASCII_UPPER_K 0x4B
|
|
#define ASCII_UPPER_L 0x4C
|
|
#define ASCII_UPPER_M 0x4D
|
|
#define ASCII_UPPER_N 0x4E
|
|
#define ASCII_UPPER_O 0x4F
|
|
#define ASCII_UPPER_P 0x50
|
|
#define ASCII_UPPER_Q 0x51
|
|
#define ASCII_UPPER_R 0x52
|
|
#define ASCII_UPPER_S 0x53
|
|
#define ASCII_UPPER_T 0x54
|
|
#define ASCII_UPPER_U 0x55
|
|
#define ASCII_UPPER_V 0x56
|
|
#define ASCII_UPPER_W 0x57
|
|
#define ASCII_UPPER_X 0x58
|
|
#define ASCII_UPPER_Y 0x59
|
|
#define ASCII_UPPER_Z 0x5A
|
|
|
|
#define ASCII_LOWER_A 0x61
|
|
#define ASCII_LOWER_B 0x62
|
|
#define ASCII_LOWER_C 0x63
|
|
#define ASCII_LOWER_D 0x64
|
|
#define ASCII_LOWER_E 0x65
|
|
#define ASCII_LOWER_F 0x66
|
|
#define ASCII_LOWER_G 0x67
|
|
#define ASCII_LOWER_H 0x68
|
|
#define ASCII_LOWER_I 0x69
|
|
#define ASCII_LOWER_J 0x6A
|
|
#define ASCII_LOWER_K 0x6B
|
|
#define ASCII_LOWER_L 0x6C
|
|
#define ASCII_LOWER_M 0x6D
|
|
#define ASCII_LOWER_N 0x6E
|
|
#define ASCII_LOWER_O 0x6F
|
|
#define ASCII_LOWER_P 0x70
|
|
#define ASCII_LOWER_Q 0x71
|
|
#define ASCII_LOWER_R 0x72
|
|
#define ASCII_LOWER_S 0x73
|
|
#define ASCII_LOWER_T 0x74
|
|
#define ASCII_LOWER_U 0x75
|
|
#define ASCII_LOWER_V 0x76
|
|
#define ASCII_LOWER_W 0x77
|
|
#define ASCII_LOWER_X 0x78
|
|
#define ASCII_LOWER_Y 0x79
|
|
#define ASCII_LOWER_Z 0x7A
|
|
|
|
#define ASCII_ZERO 0x30
|
|
#define ASCII_ONE 0x31
|
|
#define ASCII_TWO 0x32
|
|
#define ASCII_THREE 0x33
|
|
#define ASCII_FOUR 0x34
|
|
#define ASCII_FIVE 0x35
|
|
#define ASCII_SIX 0x36
|
|
#define ASCII_SEVEN 0x37
|
|
#define ASCII_EIGHT 0x38
|
|
#define ASCII_NINE 0x39
|
|
|
|
/****************************************************************************
|
|
Desc: Native character constants and macros
|
|
****************************************************************************/
|
|
|
|
#define NATIVE_SPACE ' '
|
|
#define NATIVE_DOT '.'
|
|
#define NATIVE_PLUS '+'
|
|
#define NATIVE_MINUS '-'
|
|
#define NATIVE_WILDCARD '*'
|
|
#define NATIVE_QUESTIONMARK '?'
|
|
|
|
#define NATIVE_UPPER_A 'A'
|
|
#define NATIVE_UPPER_F 'F'
|
|
#define NATIVE_UPPER_X 'X'
|
|
#define NATIVE_UPPER_Z 'Z'
|
|
#define NATIVE_LOWER_A 'a'
|
|
#define NATIVE_LOWER_F 'f'
|
|
#define NATIVE_LOWER_X 'x'
|
|
#define NATIVE_LOWER_Z 'z'
|
|
#define NATIVE_ZERO '0'
|
|
#define NATIVE_NINE '9'
|
|
|
|
#define f_stringToAscii( str)
|
|
|
|
#define f_toascii( native) \
|
|
(native)
|
|
|
|
#define f_tonative( ascii) \
|
|
(ascii)
|
|
|
|
#define f_toupper( native) \
|
|
(((native) >= 'a' && (native) <= 'z') \
|
|
? (native) - 'a' + 'A' \
|
|
: (native))
|
|
|
|
#define f_tolower( native) \
|
|
(((native) >= 'A' && (native) <= 'Z') \
|
|
? (native) - 'A' + 'a' \
|
|
: (native))
|
|
|
|
#define f_islower( native) \
|
|
((native) >= 'a' && (native) <= 'z')
|
|
|
|
#ifndef FLM_ASCII_PLATFORM
|
|
#define FLM_ASCII_PLATFORM
|
|
#endif
|
|
|
|
/****************************************************************************
|
|
Desc: Unicode character constants and macros
|
|
****************************************************************************/
|
|
|
|
#define FLM_UNICODE_LINEFEED ((FLMUNICODE)10)
|
|
#define FLM_UNICODE_SPACE ((FLMUNICODE)32)
|
|
#define FLM_UNICODE_BANG ((FLMUNICODE)33)
|
|
#define FLM_UNICODE_QUOTE ((FLMUNICODE)34)
|
|
#define FLM_UNICODE_POUND ((FLMUNICODE)35)
|
|
#define FLM_UNICODE_DOLLAR ((FLMUNICODE)36)
|
|
#define FLM_UNICODE_PERCENT ((FLMUNICODE)37)
|
|
#define FLM_UNICODE_AMP ((FLMUNICODE)38)
|
|
#define FLM_UNICODE_APOS ((FLMUNICODE)39)
|
|
#define FLM_UNICODE_LPAREN ((FLMUNICODE)40)
|
|
#define FLM_UNICODE_RPAREN ((FLMUNICODE)41)
|
|
#define FLM_UNICODE_ASTERISK ((FLMUNICODE)42)
|
|
#define FLM_UNICODE_PLUS ((FLMUNICODE)43)
|
|
#define FLM_UNICODE_COMMA ((FLMUNICODE)44)
|
|
#define FLM_UNICODE_HYPHEN ((FLMUNICODE)45)
|
|
#define FLM_UNICODE_PERIOD ((FLMUNICODE)46)
|
|
#define FLM_UNICODE_FSLASH ((FLMUNICODE)47)
|
|
|
|
#define FLM_UNICODE_0 ((FLMUNICODE)48)
|
|
#define FLM_UNICODE_1 ((FLMUNICODE)49)
|
|
#define FLM_UNICODE_2 ((FLMUNICODE)50)
|
|
#define FLM_UNICODE_3 ((FLMUNICODE)51)
|
|
#define FLM_UNICODE_4 ((FLMUNICODE)52)
|
|
#define FLM_UNICODE_5 ((FLMUNICODE)53)
|
|
#define FLM_UNICODE_6 ((FLMUNICODE)54)
|
|
#define FLM_UNICODE_7 ((FLMUNICODE)55)
|
|
#define FLM_UNICODE_8 ((FLMUNICODE)56)
|
|
#define FLM_UNICODE_9 ((FLMUNICODE)57)
|
|
|
|
#define FLM_UNICODE_COLON ((FLMUNICODE)58)
|
|
#define FLM_UNICODE_SEMI ((FLMUNICODE)59)
|
|
#define FLM_UNICODE_LT ((FLMUNICODE)60)
|
|
#define FLM_UNICODE_EQ ((FLMUNICODE)61)
|
|
#define FLM_UNICODE_GT ((FLMUNICODE)62)
|
|
#define FLM_UNICODE_QUEST ((FLMUNICODE)63)
|
|
#define FLM_UNICODE_ATSIGN ((FLMUNICODE)64)
|
|
|
|
#define FLM_UNICODE_A ((FLMUNICODE)65)
|
|
#define FLM_UNICODE_B ((FLMUNICODE)66)
|
|
#define FLM_UNICODE_C ((FLMUNICODE)67)
|
|
#define FLM_UNICODE_D ((FLMUNICODE)68)
|
|
#define FLM_UNICODE_E ((FLMUNICODE)69)
|
|
#define FLM_UNICODE_F ((FLMUNICODE)70)
|
|
#define FLM_UNICODE_G ((FLMUNICODE)71)
|
|
#define FLM_UNICODE_H ((FLMUNICODE)72)
|
|
#define FLM_UNICODE_I ((FLMUNICODE)73)
|
|
#define FLM_UNICODE_J ((FLMUNICODE)74)
|
|
#define FLM_UNICODE_K ((FLMUNICODE)75)
|
|
#define FLM_UNICODE_L ((FLMUNICODE)76)
|
|
#define FLM_UNICODE_M ((FLMUNICODE)77)
|
|
#define FLM_UNICODE_N ((FLMUNICODE)78)
|
|
#define FLM_UNICODE_O ((FLMUNICODE)79)
|
|
#define FLM_UNICODE_P ((FLMUNICODE)80)
|
|
#define FLM_UNICODE_Q ((FLMUNICODE)81)
|
|
#define FLM_UNICODE_R ((FLMUNICODE)82)
|
|
#define FLM_UNICODE_S ((FLMUNICODE)83)
|
|
#define FLM_UNICODE_T ((FLMUNICODE)84)
|
|
#define FLM_UNICODE_U ((FLMUNICODE)85)
|
|
#define FLM_UNICODE_V ((FLMUNICODE)86)
|
|
#define FLM_UNICODE_W ((FLMUNICODE)87)
|
|
#define FLM_UNICODE_X ((FLMUNICODE)88)
|
|
#define FLM_UNICODE_Y ((FLMUNICODE)89)
|
|
#define FLM_UNICODE_Z ((FLMUNICODE)90)
|
|
|
|
#define FLM_UNICODE_LBRACKET ((FLMUNICODE)91)
|
|
#define FLM_UNICODE_BACKSLASH ((FLMUNICODE)92)
|
|
#define FLM_UNICODE_RBRACKET ((FLMUNICODE)93)
|
|
#define FLM_UNICODE_UNDERSCORE ((FLMUNICODE)95)
|
|
|
|
#define FLM_UNICODE_a ((FLMUNICODE)97)
|
|
#define FLM_UNICODE_b ((FLMUNICODE)98)
|
|
#define FLM_UNICODE_c ((FLMUNICODE)99)
|
|
#define FLM_UNICODE_d ((FLMUNICODE)100)
|
|
#define FLM_UNICODE_e ((FLMUNICODE)101)
|
|
#define FLM_UNICODE_f ((FLMUNICODE)102)
|
|
#define FLM_UNICODE_g ((FLMUNICODE)103)
|
|
#define FLM_UNICODE_h ((FLMUNICODE)104)
|
|
#define FLM_UNICODE_i ((FLMUNICODE)105)
|
|
#define FLM_UNICODE_j ((FLMUNICODE)106)
|
|
#define FLM_UNICODE_k ((FLMUNICODE)107)
|
|
#define FLM_UNICODE_l ((FLMUNICODE)108)
|
|
#define FLM_UNICODE_m ((FLMUNICODE)109)
|
|
#define FLM_UNICODE_n ((FLMUNICODE)110)
|
|
#define FLM_UNICODE_o ((FLMUNICODE)111)
|
|
#define FLM_UNICODE_p ((FLMUNICODE)112)
|
|
#define FLM_UNICODE_q ((FLMUNICODE)113)
|
|
#define FLM_UNICODE_r ((FLMUNICODE)114)
|
|
#define FLM_UNICODE_s ((FLMUNICODE)115)
|
|
#define FLM_UNICODE_t ((FLMUNICODE)116)
|
|
#define FLM_UNICODE_u ((FLMUNICODE)117)
|
|
#define FLM_UNICODE_v ((FLMUNICODE)118)
|
|
#define FLM_UNICODE_w ((FLMUNICODE)119)
|
|
#define FLM_UNICODE_x ((FLMUNICODE)120)
|
|
#define FLM_UNICODE_y ((FLMUNICODE)121)
|
|
#define FLM_UNICODE_z ((FLMUNICODE)122)
|
|
|
|
#define FLM_UNICODE_LBRACE ((FLMUNICODE)123)
|
|
#define FLM_UNICODE_PIPE ((FLMUNICODE)124)
|
|
#define FLM_UNICODE_RBRACE ((FLMUNICODE)125)
|
|
#define FLM_UNICODE_TILDE ((FLMUNICODE)126)
|
|
#define FLM_UNICODE_C_CEDILLA ((FLMUNICODE)199)
|
|
#define FLM_UNICODE_N_TILDE ((FLMUNICODE)209)
|
|
#define FLM_UNICODE_c_CEDILLA ((FLMUNICODE)231)
|
|
#define FLM_UNICODE_n_TILDE ((FLMUNICODE)241)
|
|
|
|
FINLINE FLMBOOL f_isvowel(
|
|
FLMUNICODE uChar)
|
|
{
|
|
uChar = f_uniToLower( uChar);
|
|
|
|
if( uChar == FLM_UNICODE_a ||
|
|
uChar == FLM_UNICODE_e ||
|
|
uChar == FLM_UNICODE_i ||
|
|
uChar == FLM_UNICODE_o ||
|
|
uChar == FLM_UNICODE_u ||
|
|
uChar == FLM_UNICODE_y)
|
|
{
|
|
return( TRUE);
|
|
}
|
|
|
|
return( FALSE);
|
|
}
|
|
|
|
/****************************************************************************
|
|
Desc: Endian macros
|
|
****************************************************************************/
|
|
|
|
FINLINE FLMUINT16 f_littleEndianToUINT16(
|
|
const FLMBYTE * pucBuf)
|
|
{
|
|
FLMUINT16 ui16Val = 0;
|
|
|
|
ui16Val |= ((FLMUINT16)pucBuf[ 1]) << 8;
|
|
ui16Val |= ((FLMUINT16)pucBuf[ 0]);
|
|
|
|
return( ui16Val);
|
|
}
|
|
|
|
FINLINE FLMUINT32 f_littleEndianToUINT32(
|
|
const FLMBYTE * pucBuf)
|
|
{
|
|
FLMUINT32 ui32Val = 0;
|
|
|
|
ui32Val |= ((FLMUINT32)pucBuf[ 3]) << 24;
|
|
ui32Val |= ((FLMUINT32)pucBuf[ 2]) << 16;
|
|
ui32Val |= ((FLMUINT32)pucBuf[ 1]) << 8;
|
|
ui32Val |= ((FLMUINT32)pucBuf[ 0]);
|
|
|
|
return( ui32Val);
|
|
}
|
|
|
|
FINLINE FLMUINT64 f_littleEndianToUINT64(
|
|
const FLMBYTE * pucBuf)
|
|
{
|
|
FLMUINT64 ui64Val = 0;
|
|
|
|
ui64Val |= ((FLMUINT64)pucBuf[ 7]) << 56;
|
|
ui64Val |= ((FLMUINT64)pucBuf[ 6]) << 48;
|
|
ui64Val |= ((FLMUINT64)pucBuf[ 5]) << 40;
|
|
ui64Val |= ((FLMUINT64)pucBuf[ 4]) << 32;
|
|
ui64Val |= ((FLMUINT64)pucBuf[ 3]) << 24;
|
|
ui64Val |= ((FLMUINT64)pucBuf[ 2]) << 16;
|
|
ui64Val |= ((FLMUINT64)pucBuf[ 1]) << 8;
|
|
ui64Val |= ((FLMUINT64)pucBuf[ 0]);
|
|
|
|
return( ui64Val);
|
|
}
|
|
|
|
FINLINE void f_UINT16ToLittleEndian(
|
|
FLMUINT16 ui16Num,
|
|
FLMBYTE * pucBuf)
|
|
{
|
|
pucBuf[ 1] = (FLMBYTE) (ui16Num >> 8);
|
|
pucBuf[ 0] = (FLMBYTE) (ui16Num);
|
|
}
|
|
|
|
FINLINE void f_UINT32ToLittleEndian(
|
|
FLMUINT32 ui32Num,
|
|
FLMBYTE * pucBuf)
|
|
{
|
|
pucBuf[ 3] = (FLMBYTE) (ui32Num >> 24);
|
|
pucBuf[ 2] = (FLMBYTE) (ui32Num >> 16);
|
|
pucBuf[ 1] = (FLMBYTE) (ui32Num >> 8);
|
|
pucBuf[ 0] = (FLMBYTE) (ui32Num);
|
|
}
|
|
|
|
FINLINE void f_UINT64ToLittleEndian(
|
|
FLMUINT64 ui64Num,
|
|
FLMBYTE * pucBuf)
|
|
{
|
|
pucBuf[ 7] = (FLMBYTE) (ui64Num >> 56);
|
|
pucBuf[ 6] = (FLMBYTE) (ui64Num >> 48);
|
|
pucBuf[ 5] = (FLMBYTE) (ui64Num >> 40);
|
|
pucBuf[ 4] = (FLMBYTE) (ui64Num >> 32);
|
|
pucBuf[ 3] = (FLMBYTE) (ui64Num >> 24);
|
|
pucBuf[ 2] = (FLMBYTE) (ui64Num >> 16);
|
|
pucBuf[ 1] = (FLMBYTE) (ui64Num >> 8);
|
|
pucBuf[ 0] = (FLMBYTE) (ui64Num);
|
|
}
|
|
|
|
FINLINE FLMUINT16 f_bigEndianToUINT16(
|
|
const FLMBYTE * pucBuf)
|
|
{
|
|
FLMUINT16 ui16Val = 0;
|
|
|
|
ui16Val |= ((FLMUINT16)pucBuf[ 0]) << 8;
|
|
ui16Val |= ((FLMUINT16)pucBuf[ 1]);
|
|
|
|
return( ui16Val);
|
|
}
|
|
|
|
FINLINE FLMUINT32 f_bigEndianToUINT32(
|
|
const FLMBYTE * pucBuf)
|
|
{
|
|
FLMUINT32 ui32Val = 0;
|
|
|
|
ui32Val |= ((FLMUINT32)pucBuf[ 0]) << 24;
|
|
ui32Val |= ((FLMUINT32)pucBuf[ 1]) << 16;
|
|
ui32Val |= ((FLMUINT32)pucBuf[ 2]) << 8;
|
|
ui32Val |= ((FLMUINT32)pucBuf[ 3]);
|
|
|
|
return( ui32Val);
|
|
}
|
|
|
|
FINLINE FLMUINT64 f_bigEndianToUINT64(
|
|
const FLMBYTE * pucBuf)
|
|
{
|
|
FLMUINT64 ui64Val = 0;
|
|
|
|
ui64Val |= ((FLMUINT64)pucBuf[ 0]) << 56;
|
|
ui64Val |= ((FLMUINT64)pucBuf[ 1]) << 48;
|
|
ui64Val |= ((FLMUINT64)pucBuf[ 2]) << 40;
|
|
ui64Val |= ((FLMUINT64)pucBuf[ 3]) << 32;
|
|
ui64Val |= ((FLMUINT64)pucBuf[ 4]) << 24;
|
|
ui64Val |= ((FLMUINT64)pucBuf[ 5]) << 16;
|
|
ui64Val |= ((FLMUINT64)pucBuf[ 6]) << 8;
|
|
ui64Val |= ((FLMUINT64)pucBuf[ 7]);
|
|
|
|
return( ui64Val);
|
|
}
|
|
|
|
FINLINE FLMINT16 f_bigEndianToINT16(
|
|
const FLMBYTE * pucBuf)
|
|
{
|
|
FLMINT16 i16Val = 0;
|
|
|
|
i16Val |= ((FLMINT16)pucBuf[ 0]) << 8;
|
|
i16Val |= ((FLMINT16)pucBuf[ 1]);
|
|
|
|
return( i16Val);
|
|
}
|
|
|
|
FINLINE FLMINT32 f_bigEndianToINT32(
|
|
const FLMBYTE * pucBuf)
|
|
{
|
|
FLMINT32 i32Val = 0;
|
|
|
|
i32Val |= ((FLMINT32)pucBuf[ 0]) << 24;
|
|
i32Val |= ((FLMINT32)pucBuf[ 1]) << 16;
|
|
i32Val |= ((FLMINT32)pucBuf[ 2]) << 8;
|
|
i32Val |= ((FLMINT32)pucBuf[ 3]);
|
|
|
|
return( i32Val);
|
|
}
|
|
|
|
FINLINE FLMINT64 f_bigEndianToINT64(
|
|
const FLMBYTE * pucBuf)
|
|
{
|
|
FLMINT64 i64Val = 0;
|
|
|
|
i64Val |= ((FLMINT64)pucBuf[ 0]) << 56;
|
|
i64Val |= ((FLMINT64)pucBuf[ 1]) << 48;
|
|
i64Val |= ((FLMINT64)pucBuf[ 2]) << 40;
|
|
i64Val |= ((FLMINT64)pucBuf[ 3]) << 32;
|
|
i64Val |= ((FLMINT64)pucBuf[ 4]) << 24;
|
|
i64Val |= ((FLMINT64)pucBuf[ 5]) << 16;
|
|
i64Val |= ((FLMINT64)pucBuf[ 6]) << 8;
|
|
i64Val |= ((FLMINT64)pucBuf[ 7]);
|
|
|
|
return( i64Val);
|
|
}
|
|
|
|
FINLINE void f_UINT32ToBigEndian(
|
|
FLMUINT32 ui32Num,
|
|
FLMBYTE * pucBuf)
|
|
{
|
|
pucBuf[ 0] = (FLMBYTE) (ui32Num >> 24);
|
|
pucBuf[ 1] = (FLMBYTE) (ui32Num >> 16);
|
|
pucBuf[ 2] = (FLMBYTE) (ui32Num >> 8);
|
|
pucBuf[ 3] = (FLMBYTE) (ui32Num);
|
|
}
|
|
|
|
FINLINE void f_INT32ToBigEndian(
|
|
FLMINT32 i32Num,
|
|
FLMBYTE * pucBuf)
|
|
{
|
|
pucBuf[ 0] = (FLMBYTE) (i32Num >> 24);
|
|
pucBuf[ 1] = (FLMBYTE) (i32Num >> 16);
|
|
pucBuf[ 2] = (FLMBYTE) (i32Num >> 8);
|
|
pucBuf[ 3] = (FLMBYTE) (i32Num);
|
|
}
|
|
|
|
FINLINE void f_INT64ToBigEndian(
|
|
FLMINT64 i64Num,
|
|
FLMBYTE * pucBuf)
|
|
{
|
|
pucBuf[ 0] = (FLMBYTE) (i64Num >> 56);
|
|
pucBuf[ 1] = (FLMBYTE) (i64Num >> 48);
|
|
pucBuf[ 2] = (FLMBYTE) (i64Num >> 40);
|
|
pucBuf[ 3] = (FLMBYTE) (i64Num >> 32);
|
|
pucBuf[ 4] = (FLMBYTE) (i64Num >> 24);
|
|
pucBuf[ 5] = (FLMBYTE) (i64Num >> 16);
|
|
pucBuf[ 6] = (FLMBYTE) (i64Num >> 8);
|
|
pucBuf[ 7] = (FLMBYTE) (i64Num);
|
|
}
|
|
|
|
FINLINE void f_UINT64ToBigEndian(
|
|
FLMUINT64 ui64Num,
|
|
FLMBYTE * pucBuf)
|
|
{
|
|
pucBuf[ 0] = (FLMBYTE) (ui64Num >> 56);
|
|
pucBuf[ 1] = (FLMBYTE) (ui64Num >> 48);
|
|
pucBuf[ 2] = (FLMBYTE) (ui64Num >> 40);
|
|
pucBuf[ 3] = (FLMBYTE) (ui64Num >> 32);
|
|
pucBuf[ 4] = (FLMBYTE) (ui64Num >> 24);
|
|
pucBuf[ 5] = (FLMBYTE) (ui64Num >> 16);
|
|
pucBuf[ 6] = (FLMBYTE) (ui64Num >> 8);
|
|
pucBuf[ 7] = (FLMBYTE) (ui64Num);
|
|
}
|
|
|
|
FINLINE void f_INT16ToBigEndian(
|
|
FLMINT16 i16Num,
|
|
FLMBYTE * pucBuf)
|
|
{
|
|
pucBuf[ 0] = (FLMBYTE) (i16Num >> 8);
|
|
pucBuf[ 1] = (FLMBYTE) (i16Num);
|
|
}
|
|
|
|
FINLINE void f_UINT16ToBigEndian(
|
|
FLMUINT16 ui16Num,
|
|
FLMBYTE * pucBuf)
|
|
{
|
|
pucBuf[ 0] = (FLMBYTE) (ui16Num >> 8);
|
|
pucBuf[ 1] = (FLMBYTE) (ui16Num);
|
|
}
|
|
|
|
#if defined( FLM_STRICT_ALIGNMENT) || defined( FLM_BIG_ENDIAN)
|
|
|
|
FINLINE FLMUINT16 FB2UW(
|
|
const FLMBYTE * pucBuf)
|
|
{
|
|
FLMUINT16 ui16Val = 0;
|
|
|
|
ui16Val |= ((FLMUINT16)pucBuf[ 1]) << 8;
|
|
ui16Val |= ((FLMUINT16)pucBuf[ 0]);
|
|
|
|
return( ui16Val);
|
|
}
|
|
|
|
FINLINE FLMUINT32 FB2UD(
|
|
const FLMBYTE * pucBuf)
|
|
{
|
|
FLMUINT32 ui32Val = 0;
|
|
|
|
ui32Val |= ((FLMUINT32)pucBuf[ 3]) << 24;
|
|
ui32Val |= ((FLMUINT32)pucBuf[ 2]) << 16;
|
|
ui32Val |= ((FLMUINT32)pucBuf[ 1]) << 8;
|
|
ui32Val |= ((FLMUINT32)pucBuf[ 0]);
|
|
|
|
return( ui32Val);
|
|
}
|
|
|
|
FINLINE FLMUINT64 FB2U64(
|
|
const FLMBYTE * pucBuf)
|
|
{
|
|
FLMUINT64 ui64Val = 0;
|
|
|
|
ui64Val |= ((FLMUINT64)pucBuf[ 7]) << 56;
|
|
ui64Val |= ((FLMUINT64)pucBuf[ 6]) << 48;
|
|
ui64Val |= ((FLMUINT64)pucBuf[ 5]) << 40;
|
|
ui64Val |= ((FLMUINT64)pucBuf[ 4]) << 32;
|
|
ui64Val |= ((FLMUINT64)pucBuf[ 3]) << 24;
|
|
ui64Val |= ((FLMUINT64)pucBuf[ 2]) << 16;
|
|
ui64Val |= ((FLMUINT64)pucBuf[ 1]) << 8;
|
|
ui64Val |= ((FLMUINT64)pucBuf[ 0]);
|
|
|
|
return( ui64Val);
|
|
}
|
|
|
|
FINLINE void UW2FBA(
|
|
FLMUINT uiNum,
|
|
FLMBYTE * pucBuf)
|
|
{
|
|
f_assert( uiNum <= FLM_MAX_UINT16);
|
|
|
|
pucBuf[ 1] = (FLMBYTE) (uiNum >> 8);
|
|
pucBuf[ 0] = (FLMBYTE) (uiNum);
|
|
}
|
|
|
|
FINLINE void UD2FBA(
|
|
FLMUINT uiNum,
|
|
FLMBYTE * pucBuf)
|
|
{
|
|
f_assert( uiNum <= FLM_MAX_UINT32);
|
|
|
|
pucBuf[ 3] = (FLMBYTE) (uiNum >> 24);
|
|
pucBuf[ 2] = (FLMBYTE) (uiNum >> 16);
|
|
pucBuf[ 1] = (FLMBYTE) (uiNum >> 8);
|
|
pucBuf[ 0] = (FLMBYTE) (uiNum);
|
|
}
|
|
|
|
FINLINE void U642FBA(
|
|
FLMUINT64 ui64Num,
|
|
FLMBYTE * pucBuf)
|
|
{
|
|
pucBuf[ 7] = (FLMBYTE) (ui64Num >> 56);
|
|
pucBuf[ 6] = (FLMBYTE) (ui64Num >> 48);
|
|
pucBuf[ 5] = (FLMBYTE) (ui64Num >> 40);
|
|
pucBuf[ 4] = (FLMBYTE) (ui64Num >> 32);
|
|
pucBuf[ 3] = (FLMBYTE) (ui64Num >> 24);
|
|
pucBuf[ 2] = (FLMBYTE) (ui64Num >> 16);
|
|
pucBuf[ 1] = (FLMBYTE) (ui64Num >> 8);
|
|
pucBuf[ 0] = (FLMBYTE) (ui64Num);
|
|
}
|
|
|
|
#else
|
|
|
|
#define FB2UW( fbp) \
|
|
(*((FLMUINT16 *)(fbp)))
|
|
|
|
#define FB2UD( fbp) \
|
|
(*((FLMUINT32 *)(fbp)))
|
|
|
|
#define FB2U64( fbp) \
|
|
(*((FLMUINT64 *)(fbp)))
|
|
|
|
#define UW2FBA( uw, fbp) \
|
|
(*((FLMUINT16 *)(fbp)) = ((FLMUINT16) (uw)))
|
|
|
|
#define UD2FBA( uw, fbp) \
|
|
(*((FLMUINT32 *)(fbp)) = ((FLMUINT32) (uw)))
|
|
|
|
#define U642FBA( uw, fbp) \
|
|
(*((FLMUINT64 *)(fbp)) = ((FLMUINT64) (uw)))
|
|
|
|
#endif
|
|
|
|
#ifdef FLM_BIG_ENDIAN
|
|
#define LO( wrd) \
|
|
(*((FLMUINT8 *)&wrd + 1))
|
|
|
|
#define HI( wrd) \
|
|
(*(FLMUINT8 *)&wrd)
|
|
#else
|
|
#define LO(wrd) \
|
|
(*(FLMUINT8 *)&wrd)
|
|
|
|
#define HI(wrd) \
|
|
(*((FLMUINT8 *)&wrd + 1))
|
|
#endif
|
|
|
|
/****************************************************************************
|
|
Desc: File path functions and macros
|
|
****************************************************************************/
|
|
|
|
#if defined( FLM_WIN) || defined( FLM_NLM)
|
|
#define FWSLASH '/'
|
|
#define SLASH '\\'
|
|
#define SSLASH "\\"
|
|
#define COLON ':'
|
|
#define PERIOD '.'
|
|
#define PARENT_DIR ".."
|
|
#define CURRENT_DIR "."
|
|
#else
|
|
#ifndef FWSLASH
|
|
#define FWSLASH '/'
|
|
#endif
|
|
|
|
#ifndef SLASH
|
|
#define SLASH '/'
|
|
#endif
|
|
|
|
#ifndef SSLASH
|
|
#define SSLASH "/"
|
|
#endif
|
|
|
|
#ifndef COLON
|
|
#define COLON ':'
|
|
#endif
|
|
|
|
#ifndef PERIOD
|
|
#define PERIOD '.'
|
|
#endif
|
|
|
|
#ifndef PARENT_DIR
|
|
#define PARENT_DIR ".."
|
|
#endif
|
|
|
|
#ifndef CURRENT_DIR
|
|
#define CURRENT_DIR "."
|
|
#endif
|
|
#endif
|
|
|
|
FLMUINT FLMAPI f_getMaxFileSize( void);
|
|
|
|
/****************************************************************************
|
|
Desc: CPU release and sleep functions
|
|
****************************************************************************/
|
|
|
|
void FLMAPI f_yieldCPU( void);
|
|
|
|
void FLMAPI f_sleep(
|
|
FLMUINT uiMilliseconds);
|
|
|
|
/****************************************************************************
|
|
Desc: Time, date, timestamp functions
|
|
****************************************************************************/
|
|
|
|
typedef struct
|
|
{
|
|
FLMUINT16 year;
|
|
FLMBYTE month;
|
|
FLMBYTE day;
|
|
} F_DATE;
|
|
|
|
typedef struct
|
|
{
|
|
FLMBYTE hour;
|
|
FLMBYTE minute;
|
|
FLMBYTE second;
|
|
FLMBYTE hundredth;
|
|
} F_TIME;
|
|
|
|
typedef struct
|
|
{
|
|
FLMUINT16 year;
|
|
FLMBYTE month;
|
|
FLMBYTE day;
|
|
FLMBYTE hour;
|
|
FLMBYTE minute;
|
|
FLMBYTE second;
|
|
FLMBYTE hundredth;
|
|
} F_TMSTAMP;
|
|
|
|
#define f_timeIsLeapYear(year) \
|
|
((((year) & 0x03) == 0) && (((year) % 100) != 0) || (((year) % 400) == 0))
|
|
|
|
void f_timeGetSeconds(
|
|
FLMUINT * puiSeconds);
|
|
|
|
void f_timeGetTimeStamp(
|
|
F_TMSTAMP * pTimeStamp);
|
|
|
|
FLMINT f_timeGetLocalOffset( void);
|
|
|
|
void f_timeSecondsToDate(
|
|
FLMUINT uiSeconds,
|
|
F_TMSTAMP * pTimeStamp);
|
|
|
|
void f_timeDateToSeconds(
|
|
F_TMSTAMP * pTimeStamp,
|
|
FLMUINT * puiSeconds);
|
|
|
|
FLMINT f_timeCompareTimeStamps(
|
|
F_TMSTAMP * pTimeStamp1,
|
|
F_TMSTAMP * pTimeStamp2,
|
|
FLMUINT flag);
|
|
|
|
FINLINE FLMUINT f_localTimeToUTC(
|
|
FLMUINT uiSeconds)
|
|
{
|
|
return( uiSeconds + f_timeGetLocalOffset());
|
|
}
|
|
|
|
FLMUINT FLMAPI FLM_GET_TIMER( void);
|
|
|
|
FLMUINT FLMAPI FLM_ELAPSED_TIME(
|
|
FLMUINT uiLaterTime,
|
|
FLMUINT uiEarlierTime);
|
|
|
|
FLMUINT FLMAPI FLM_SECS_TO_TIMER_UNITS(
|
|
FLMUINT uiSeconds);
|
|
|
|
FLMUINT FLMAPI FLM_TIMER_UNITS_TO_SECS(
|
|
FLMUINT uiTU);
|
|
|
|
FLMUINT FLM_TIMER_UNITS_TO_MILLI(
|
|
FLMUINT uiTU);
|
|
|
|
FLMUINT FLM_MILLI_TO_TIMER_UNITS(
|
|
FLMUINT uiMilliSeconds);
|
|
|
|
void FLMAPI f_addElapsedTime(
|
|
F_TMSTAMP * pStartTime,
|
|
FLMUINT64 * pui64ElapMilli);
|
|
|
|
/****************************************************************************
|
|
Desc: Quick sort
|
|
****************************************************************************/
|
|
|
|
typedef FLMINT (FLMAPI * F_SORT_COMPARE_FUNC)(
|
|
void * pvBuffer,
|
|
FLMUINT uiPos1,
|
|
FLMUINT uiPos2);
|
|
|
|
typedef void (FLMAPI * F_SORT_SWAP_FUNC)(
|
|
void * pvBuffer,
|
|
FLMUINT uiPos1,
|
|
FLMUINT uiPos2);
|
|
|
|
FLMINT FLMAPI f_qsortUINTCompare(
|
|
void * pvBuffer,
|
|
FLMUINT uiPos1,
|
|
FLMUINT uiPos2);
|
|
|
|
void FLMAPI f_qsortUINTSwap(
|
|
void * pvBuffer,
|
|
FLMUINT uiPos1,
|
|
FLMUINT uiPos2);
|
|
|
|
void FLMAPI f_qsort(
|
|
void * pvBuffer,
|
|
FLMUINT uiLowerBounds,
|
|
FLMUINT uiUpperBounds,
|
|
F_SORT_COMPARE_FUNC fnCompare,
|
|
F_SORT_SWAP_FUNC fnSwap);
|
|
|
|
/****************************************************************************
|
|
Desc: Environment
|
|
****************************************************************************/
|
|
|
|
void FLMAPI f_getenv(
|
|
const char * pszKey,
|
|
FLMBYTE * pszBuffer,
|
|
FLMUINT uiBufferSize,
|
|
FLMUINT * puiValueLen = NULL);
|
|
|
|
/****************************************************************************
|
|
Desc: f_sprintf
|
|
****************************************************************************/
|
|
|
|
FLMINT FLMAPI f_vsprintf(
|
|
char * pszDestStr,
|
|
const char * pszFormat,
|
|
f_va_list * args);
|
|
|
|
FLMINT FLMAPI f_sprintf(
|
|
char * pszDestStr,
|
|
const char * pszFormat,
|
|
...);
|
|
|
|
FLMINT FLMAPI f_printf(
|
|
const char * pszFormat,
|
|
...);
|
|
|
|
/****************************************************************************
|
|
Desc: Memory copying, moving, setting
|
|
****************************************************************************/
|
|
|
|
void * FLMAPI f_memcpy(
|
|
void * pvDest,
|
|
const void * pvSrc,
|
|
FLMSIZET uiLength);
|
|
|
|
void * FLMAPI f_memmove(
|
|
void * pvDest,
|
|
const void * pvSrc,
|
|
FLMSIZET uiLength);
|
|
|
|
void * FLMAPI f_memset(
|
|
void * pvDest,
|
|
unsigned char ucByte,
|
|
FLMSIZET uiLength);
|
|
|
|
FLMINT FLMAPI f_memcmp(
|
|
const void * pvStr1,
|
|
const void * pvStr2,
|
|
FLMSIZET uiLength);
|
|
|
|
char * FLMAPI f_strcat(
|
|
char * pszDest,
|
|
const char * pszSrc);
|
|
|
|
char * FLMAPI f_strncat(
|
|
char * pszDest,
|
|
const char * pszSrc,
|
|
FLMSIZET uiLength);
|
|
|
|
char * FLMAPI f_strchr(
|
|
const char * pszStr,
|
|
unsigned char ucByte);
|
|
|
|
char * FLMAPI f_strrchr(
|
|
const char * pszStr,
|
|
unsigned char ucByte);
|
|
|
|
char * FLMAPI f_strstr(
|
|
const char * pszStr,
|
|
const char * pszSearch);
|
|
|
|
char * FLMAPI f_strupr(
|
|
char * pszStr);
|
|
|
|
FLMINT FLMAPI f_strcmp(
|
|
const char * pszStr1,
|
|
const char * pszStr2);
|
|
|
|
FLMINT FLMAPI f_strncmp(
|
|
const char * pszStr1,
|
|
const char * pszStr2,
|
|
FLMSIZET uiLength);
|
|
|
|
FLMINT FLMAPI f_stricmp(
|
|
const char * pszStr1,
|
|
const char * pszStr2);
|
|
|
|
FLMINT FLMAPI f_strnicmp(
|
|
const char * pszStr1,
|
|
const char * pszStr2,
|
|
FLMSIZET uiLength);
|
|
|
|
char * FLMAPI f_strcpy(
|
|
char * pszDest,
|
|
const char * pszSrc);
|
|
|
|
char * FLMAPI f_strncpy(
|
|
char * pszDest,
|
|
const char * pszSrc,
|
|
FLMSIZET uiLength);
|
|
|
|
FLMUINT FLMAPI f_strlen(
|
|
const char * pszStr);
|
|
|
|
RCODE FLMAPI f_strdup(
|
|
const char * pszSrc,
|
|
char ** ppszDup);
|
|
|
|
RCODE FLMAPI f_getCharFromUTF8Buf(
|
|
const FLMBYTE ** ppucBuf,
|
|
const FLMBYTE * pucEnd,
|
|
FLMUNICODE * puChar);
|
|
|
|
RCODE FLMAPI f_uni2UTF8(
|
|
FLMUNICODE uChar,
|
|
FLMBYTE * pucBuf,
|
|
FLMUINT * puiBufSize);
|
|
|
|
RCODE FLMAPI f_getUTF8Length(
|
|
const FLMBYTE * pucBuf,
|
|
FLMUINT uiBufLen,
|
|
FLMUINT * puiBytes,
|
|
FLMUINT * puiChars);
|
|
|
|
RCODE FLMAPI f_getUTF8CharFromUTF8Buf(
|
|
FLMBYTE ** ppucBuf,
|
|
FLMBYTE * pucEnd,
|
|
FLMBYTE * pucDestBuf,
|
|
FLMUINT * puiLen);
|
|
|
|
RCODE FLMAPI f_unicode2UTF8(
|
|
FLMUNICODE * puzStr,
|
|
FLMUINT uiStrLen,
|
|
FLMBYTE * pucBuf,
|
|
FLMUINT * puiBufLength);
|
|
|
|
FLMBYTE FLMAPI f_getBase24DigitChar(
|
|
FLMBYTE ucValue);
|
|
|
|
#define shiftN(data,size,distance) \
|
|
f_memmove((FLMBYTE *)(data) + (FLMINT)(distance), \
|
|
(FLMBYTE *)(data), (unsigned)(size))
|
|
|
|
/***************************************************************************
|
|
Desc:
|
|
***************************************************************************/
|
|
class FLMEXP F_Printf : public F_Object
|
|
{
|
|
public:
|
|
|
|
#define MAX_LOG_BUF_CHARS 255
|
|
|
|
F_Printf()
|
|
{
|
|
}
|
|
|
|
virtual ~F_Printf()
|
|
{
|
|
}
|
|
|
|
FLMINT FLMAPI strvPrintf(
|
|
char * pszDestStr,
|
|
const char * pszFormat,
|
|
f_va_list * args);
|
|
|
|
FLMINT FLMAPI strPrintf(
|
|
char * pszDestStr,
|
|
const char * pszFormat,
|
|
...);
|
|
|
|
FLMINT FLMAPI logvPrintf(
|
|
IF_LogMessageClient * pLogMsg,
|
|
const char * pszFormat,
|
|
f_va_list * args);
|
|
|
|
FLMINT FLMAPI logPrintf(
|
|
IF_LogMessageClient * pLogMsg,
|
|
const char * pszFormat,
|
|
...);
|
|
|
|
private:
|
|
|
|
void processFieldInfo(
|
|
const char ** ppszFormat,
|
|
FLMUINT * puiWidth,
|
|
FLMUINT * puiPrecision,
|
|
FLMUINT * puiFlags,
|
|
f_va_list * args);
|
|
|
|
void stringFormatter(
|
|
char cFormatChar,
|
|
FLMUINT uiWidth,
|
|
FLMUINT uiPrecision,
|
|
FLMUINT uiFlags,
|
|
f_va_list * args);
|
|
|
|
void colorFormatter(
|
|
char cFormatChar,
|
|
eColorType eColor,
|
|
FLMUINT uiFlags);
|
|
|
|
void charFormatter(
|
|
char cFormatChar,
|
|
f_va_list * args);
|
|
|
|
void errorFormatter(
|
|
f_va_list * args);
|
|
|
|
void notHandledFormatter( void);
|
|
|
|
void numberFormatter(
|
|
char cFormatChar,
|
|
FLMUINT uiWidth,
|
|
FLMUINT uiPrecision,
|
|
FLMUINT uiFlags,
|
|
f_va_list * args);
|
|
|
|
void parseArgs(
|
|
const char * pszFormat,
|
|
f_va_list * args);
|
|
|
|
void processFormatString(
|
|
FLMUINT uiLen,
|
|
...);
|
|
|
|
FLMUINT printNumber(
|
|
FLMUINT64 ui64Val,
|
|
FLMUINT uiBase,
|
|
FLMBOOL bUpperCase,
|
|
FLMBOOL bCommas,
|
|
char * pszBuf);
|
|
|
|
void outputLogBuffer( void);
|
|
|
|
FINLINE void outputChar(
|
|
char cChar)
|
|
{
|
|
if (!m_pLogMsg)
|
|
{
|
|
*m_pszDestStr++ = cChar;
|
|
}
|
|
else
|
|
{
|
|
m_szLogBuf [m_uiCharOffset++] = cChar;
|
|
m_uiNumLogChars++;
|
|
if (m_uiCharOffset == MAX_LOG_BUF_CHARS)
|
|
{
|
|
outputLogBuffer();
|
|
}
|
|
}
|
|
}
|
|
|
|
FINLINE void memsetChar(
|
|
char cChar,
|
|
FLMUINT uiCount)
|
|
{
|
|
if (!m_pLogMsg)
|
|
{
|
|
f_memset( m_pszDestStr, cChar, uiCount);
|
|
m_pszDestStr += uiCount;
|
|
}
|
|
else
|
|
{
|
|
FLMUINT uiTmpCount;
|
|
|
|
while (uiCount)
|
|
{
|
|
uiTmpCount = uiCount;
|
|
if (m_uiCharOffset + uiTmpCount > MAX_LOG_BUF_CHARS)
|
|
{
|
|
uiTmpCount = MAX_LOG_BUF_CHARS - m_uiCharOffset;
|
|
}
|
|
f_memset( &m_szLogBuf [m_uiCharOffset], cChar, uiTmpCount);
|
|
m_uiCharOffset += uiTmpCount;
|
|
m_uiNumLogChars += uiTmpCount;
|
|
uiCount -= uiTmpCount;
|
|
if (m_uiCharOffset == MAX_LOG_BUF_CHARS)
|
|
{
|
|
outputLogBuffer();
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
FINLINE void outputStr(
|
|
const char * pszStr,
|
|
FLMUINT uiLen)
|
|
{
|
|
if (!m_pLogMsg)
|
|
{
|
|
f_memcpy( m_pszDestStr, pszStr, uiLen);
|
|
m_pszDestStr += uiLen;
|
|
}
|
|
else
|
|
{
|
|
FLMUINT uiTmpLen;
|
|
|
|
while (uiLen)
|
|
{
|
|
uiTmpLen = uiLen;
|
|
if (m_uiCharOffset + uiTmpLen > MAX_LOG_BUF_CHARS)
|
|
{
|
|
uiTmpLen = MAX_LOG_BUF_CHARS - m_uiCharOffset;
|
|
}
|
|
f_memcpy( &m_szLogBuf [m_uiCharOffset], pszStr, uiTmpLen);
|
|
m_uiCharOffset += uiTmpLen;
|
|
m_uiNumLogChars += uiTmpLen;
|
|
uiLen -= uiTmpLen;
|
|
pszStr += uiTmpLen;
|
|
if (m_uiCharOffset == MAX_LOG_BUF_CHARS)
|
|
{
|
|
outputLogBuffer();
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
// Variables used to do the printf stuff
|
|
|
|
char m_szLogBuf [MAX_LOG_BUF_CHARS + 1];
|
|
FLMUINT m_uiNumLogChars;
|
|
FLMUINT m_uiCharOffset;
|
|
char * m_pszDestStr;
|
|
IF_LogMessageClient * m_pLogMsg;
|
|
eColorType m_eCurrentForeColor;
|
|
eColorType m_eCurrentBackColor;
|
|
};
|
|
|
|
/****************************************************************************
|
|
Desc: XML
|
|
****************************************************************************/
|
|
flminterface FLMEXP IF_XML : public F_Object
|
|
{
|
|
public:
|
|
|
|
virtual FLMBOOL FLMAPI isPubidChar(
|
|
FLMUNICODE uChar) = 0;
|
|
|
|
virtual FLMBOOL FLMAPI isQuoteChar(
|
|
FLMUNICODE uChar) = 0;
|
|
|
|
virtual FLMBOOL FLMAPI isWhitespace(
|
|
FLMUNICODE uChar) = 0;
|
|
|
|
virtual FLMBOOL FLMAPI isExtender(
|
|
FLMUNICODE uChar) = 0;
|
|
|
|
virtual FLMBOOL FLMAPI isCombiningChar(
|
|
FLMUNICODE uChar) = 0;
|
|
|
|
virtual FLMBOOL FLMAPI isNameChar(
|
|
FLMUNICODE uChar) = 0;
|
|
|
|
virtual FLMBOOL FLMAPI isNCNameChar(
|
|
FLMUNICODE uChar) = 0;
|
|
|
|
virtual FLMBOOL FLMAPI isIdeographic(
|
|
FLMUNICODE uChar) = 0;
|
|
|
|
virtual FLMBOOL FLMAPI isBaseChar(
|
|
FLMUNICODE uChar) = 0;
|
|
|
|
virtual FLMBOOL FLMAPI isDigit(
|
|
FLMUNICODE uChar) = 0;
|
|
|
|
virtual FLMBOOL FLMAPI isLetter(
|
|
FLMUNICODE uChar) = 0;
|
|
|
|
virtual FLMBOOL FLMAPI isNameValid(
|
|
FLMUNICODE * puzName,
|
|
FLMBYTE * pszName) = 0;
|
|
};
|
|
|
|
RCODE FLMAPI FlmGetXMLObject(
|
|
IF_XML ** ppXmlObject);
|
|
|
|
/****************************************************************************
|
|
Desc: Name table
|
|
****************************************************************************/
|
|
flminterface FLMEXP IF_NameTable : public F_Object
|
|
{
|
|
virtual void FLMAPI clearTable(
|
|
FLMUINT uiPoolBlockSize) = 0;
|
|
|
|
virtual RCODE FLMAPI getNextTagTypeAndNumOrder(
|
|
FLMUINT uiType,
|
|
FLMUINT * puiNextPos,
|
|
FLMUNICODE * puzTagName = NULL,
|
|
char * pszTagName = NULL,
|
|
FLMUINT uiNameBufSize = 0,
|
|
FLMUINT * puiTagNum = NULL,
|
|
FLMUINT * puiDataType = NULL,
|
|
FLMUNICODE * puzNamespace = NULL,
|
|
FLMUINT uiNamespaceBufSize = 0,
|
|
FLMBOOL bTruncatedNamesOk = TRUE) = 0;
|
|
|
|
virtual RCODE FLMAPI getNextTagTypeAndNameOrder(
|
|
FLMUINT uiType,
|
|
FLMUINT * puiNextPos,
|
|
FLMUNICODE * puzTagName = NULL,
|
|
char * pszTagName = NULL,
|
|
FLMUINT uiNameBufSize = 0,
|
|
FLMUINT * puiTagNum = NULL,
|
|
FLMUINT * puiDataType = NULL,
|
|
FLMUNICODE * puzNamespace = NULL,
|
|
FLMUINT uiNamespaceBufSize = 0,
|
|
FLMBOOL bTruncatedNamesOk = TRUE) = 0;
|
|
|
|
virtual RCODE FLMAPI getFromTagTypeAndName(
|
|
FLMUINT uiType,
|
|
const FLMUNICODE * puzTagName,
|
|
const char * pszTagName,
|
|
FLMBOOL bMatchNamespace,
|
|
const FLMUNICODE * puzNamespace = NULL,
|
|
FLMUINT * puiTagNum = NULL,
|
|
FLMUINT * puiDataType = NULL) = 0;
|
|
|
|
virtual RCODE FLMAPI getFromTagTypeAndNum(
|
|
FLMUINT uiType,
|
|
FLMUINT uiTagNum,
|
|
FLMUNICODE * puzTagName = NULL,
|
|
char * pszTagName = NULL,
|
|
FLMUINT * puiNameBufSize = NULL,
|
|
FLMUINT * puiDataType = NULL,
|
|
FLMUNICODE * puzNamespace = NULL,
|
|
char * pszNamespace = NULL,
|
|
FLMUINT * puiNamespaceBufSize = NULL,
|
|
FLMBOOL bTruncatedNamesOk = TRUE) = 0;
|
|
|
|
virtual RCODE FLMAPI addTag(
|
|
FLMUINT uiType,
|
|
FLMUNICODE * puzTagName,
|
|
const char * pszTagName,
|
|
FLMUINT uiTagNum,
|
|
FLMUINT uiDataType = 0,
|
|
FLMUNICODE * puzNamespace = NULL,
|
|
FLMBOOL bCheckDuplicates = TRUE) = 0;
|
|
|
|
virtual void FLMAPI removeTag(
|
|
FLMUINT uiType,
|
|
FLMUINT uiTagNum) = 0;
|
|
|
|
virtual RCODE FLMAPI cloneNameTable(
|
|
IF_NameTable ** ppNewNameTable) = 0;
|
|
};
|
|
|
|
/****************************************************************************
|
|
Desc:
|
|
****************************************************************************/
|
|
flminterface FLMEXP IF_DeleteStatus : public F_Object
|
|
{
|
|
virtual RCODE FLMAPI reportDelete(
|
|
FLMUINT uiBlocksDeleted,
|
|
FLMUINT uiBlockSize) = 0;
|
|
};
|
|
|
|
/****************************************************************************
|
|
Desc:
|
|
****************************************************************************/
|
|
flminterface FLMEXP IF_Relocator : public F_Object
|
|
{
|
|
virtual void FLMAPI relocate(
|
|
void * pvOldAlloc,
|
|
void * pvNewAlloc) = 0;
|
|
|
|
virtual FLMBOOL FLMAPI canRelocate(
|
|
void * pvOldAlloc) = 0;
|
|
};
|
|
|
|
/****************************************************************************
|
|
Desc:
|
|
****************************************************************************/
|
|
typedef void (FLMAPI * F_ALLOC_INIT_FUNC)(
|
|
void * pvAlloc,
|
|
FLMUINT uiSize);
|
|
|
|
/****************************************************************************
|
|
Desc:
|
|
****************************************************************************/
|
|
flminterface FLMEXP IF_SlabManager : public F_Object
|
|
{
|
|
virtual RCODE FLMAPI setup(
|
|
FLMUINT uiPreallocSize) = 0;
|
|
|
|
virtual RCODE FLMAPI allocSlab(
|
|
void ** ppSlab) = 0;
|
|
|
|
virtual void FLMAPI freeSlab(
|
|
void ** ppSlab) = 0;
|
|
|
|
virtual RCODE FLMAPI resize(
|
|
FLMUINT uiNumBytes,
|
|
FLMBOOL bPreallocate,
|
|
FLMUINT * puiActualSize = NULL) = 0;
|
|
|
|
virtual void FLMAPI incrementTotalBytesAllocated(
|
|
FLMUINT uiCount) = 0;
|
|
|
|
virtual void FLMAPI decrementTotalBytesAllocated(
|
|
FLMUINT uiCount) = 0;
|
|
|
|
virtual FLMUINT FLMAPI getSlabSize( void) = 0;
|
|
|
|
virtual FLMUINT FLMAPI getTotalSlabs( void) = 0;
|
|
|
|
virtual FLMUINT FLMAPI totalBytesAllocated( void) = 0;
|
|
|
|
virtual FLMUINT FLMAPI getTotalSlabBytesAllocated( void) = 0;
|
|
|
|
virtual FLMUINT FLMAPI availSlabs( void) = 0;
|
|
};
|
|
|
|
RCODE FLMAPI FlmAllocSlabManager(
|
|
IF_SlabManager ** ppSlabManager);
|
|
|
|
/****************************************************************************
|
|
Desc: Class to provide an efficient means of providing many allocations
|
|
of a fixed size.
|
|
****************************************************************************/
|
|
flminterface FLMEXP IF_FixedAlloc : public F_Object
|
|
{
|
|
virtual RCODE FLMAPI setup(
|
|
FLMBOOL bMultiThreaded,
|
|
IF_SlabManager * pSlabManager,
|
|
IF_Relocator * pDefaultRelocator,
|
|
FLMUINT uiCellSize,
|
|
FLM_SLAB_USAGE * pUsageStats,
|
|
FLMUINT * puiTotalBytesAllocated) = 0;
|
|
|
|
virtual void * FLMAPI allocCell(
|
|
IF_Relocator * pRelocator,
|
|
void * pvInitialData,
|
|
FLMUINT uiDataSize) = 0;
|
|
|
|
virtual void * FLMAPI allocCell(
|
|
IF_Relocator * pRelocator,
|
|
F_ALLOC_INIT_FUNC fnAllocInit) = 0;
|
|
|
|
virtual void FLMAPI freeCell(
|
|
void * ptr) = 0;
|
|
|
|
virtual void FLMAPI freeUnused( void) = 0;
|
|
|
|
virtual void FLMAPI freeAll( void) = 0;
|
|
|
|
virtual FLMUINT FLMAPI getCellSize( void) = 0;
|
|
|
|
virtual void FLMAPI defragmentMemory( void) = 0;
|
|
};
|
|
|
|
RCODE FLMAPI FlmAllocFixedAllocator(
|
|
IF_FixedAlloc ** ppFixedAllocator);
|
|
|
|
/****************************************************************************
|
|
Desc:
|
|
****************************************************************************/
|
|
flminterface IF_BlockAlloc : public F_Object
|
|
{
|
|
virtual RCODE FLMAPI setup(
|
|
FLMBOOL bMultiThreaded,
|
|
IF_SlabManager * pSlabManager,
|
|
IF_Relocator * pRelocator,
|
|
FLMUINT uiBlockSize,
|
|
FLM_SLAB_USAGE * pUsageStats,
|
|
FLMUINT * puiTotalBytesAllocated) = 0;
|
|
|
|
virtual RCODE FLMAPI allocBlock(
|
|
void ** ppvBlock) = 0;
|
|
|
|
virtual void FLMAPI freeBlock(
|
|
void ** ppvBlock) = 0;
|
|
|
|
virtual void FLMAPI freeUnused( void) = 0;
|
|
|
|
virtual void FLMAPI freeAll( void) = 0;
|
|
|
|
virtual void FLMAPI defragmentMemory( void) = 0;
|
|
};
|
|
|
|
RCODE FLMAPI FlmAllocBlockAllocator(
|
|
IF_BlockAlloc ** ppBlockAllocator);
|
|
|
|
/****************************************************************************
|
|
Desc:
|
|
****************************************************************************/
|
|
flminterface FLMEXP IF_BufferAlloc : public F_Object
|
|
{
|
|
virtual RCODE FLMAPI setup(
|
|
FLMBOOL bMultiThreaded,
|
|
IF_SlabManager * pSlabManager,
|
|
IF_Relocator * pDefaultRelocator,
|
|
FLM_SLAB_USAGE * pUsageStats,
|
|
FLMUINT * puiTotalBytesAllocated) = 0;
|
|
|
|
virtual RCODE FLMAPI allocBuf(
|
|
IF_Relocator * pRelocator,
|
|
FLMUINT uiSize,
|
|
void * pvInitialData,
|
|
FLMUINT uiDataSize,
|
|
FLMBYTE ** ppucBuffer,
|
|
FLMBOOL * pbAllocatedOnHeap = NULL) = 0;
|
|
|
|
virtual RCODE FLMAPI allocBuf(
|
|
IF_Relocator * pRelocator,
|
|
FLMUINT uiSize,
|
|
F_ALLOC_INIT_FUNC fnAllocInit,
|
|
FLMBYTE ** ppucBuffer,
|
|
FLMBOOL * pbAllocatedOnHeap = NULL) = 0;
|
|
|
|
virtual RCODE FLMAPI reallocBuf(
|
|
IF_Relocator * pRelocator,
|
|
FLMUINT uiOldSize,
|
|
FLMUINT uiNewSize,
|
|
void * pvInitialData,
|
|
FLMUINT uiDataSize,
|
|
FLMBYTE ** ppucBuffer,
|
|
FLMBOOL * pbAllocatedOnHeap = NULL) = 0;
|
|
|
|
virtual void FLMAPI freeBuf(
|
|
FLMUINT uiSize,
|
|
FLMBYTE ** ppucBuffer) = 0;
|
|
|
|
virtual FLMUINT FLMAPI getTrueSize(
|
|
FLMUINT uiSize,
|
|
FLMBYTE * pucBuffer) = 0;
|
|
|
|
virtual FLMUINT FLMAPI getMaxCellSize( void) = 0;
|
|
|
|
virtual void FLMAPI defragmentMemory( void) = 0;
|
|
};
|
|
|
|
RCODE FLMAPI FlmAllocBufferAllocator(
|
|
IF_BufferAlloc ** ppBufferAllocator);
|
|
|
|
/****************************************************************************
|
|
Desc:
|
|
****************************************************************************/
|
|
flminterface FLMEXP IF_MultiAlloc : public F_Object
|
|
{
|
|
virtual RCODE FLMAPI setup(
|
|
FLMBOOL bMultiThreaded,
|
|
IF_SlabManager * pSlabManager,
|
|
IF_Relocator * pDefaultRelocator,
|
|
FLMUINT * puiCellSizes,
|
|
FLM_SLAB_USAGE * pUsageStats,
|
|
FLMUINT * puiTotalBytesAllocated) = 0;
|
|
|
|
virtual RCODE FLMAPI allocBuf(
|
|
IF_Relocator * pRelocator,
|
|
FLMUINT uiSize,
|
|
FLMBYTE ** ppucBuffer) = 0;
|
|
|
|
virtual RCODE FLMAPI allocBuf(
|
|
IF_Relocator * pRelocator,
|
|
FLMUINT uiSize,
|
|
F_ALLOC_INIT_FUNC fnAllocInit,
|
|
FLMBYTE ** ppucBuffer) = 0;
|
|
|
|
virtual RCODE FLMAPI reallocBuf(
|
|
IF_Relocator * pRelocator,
|
|
FLMUINT uiNewSize,
|
|
FLMBYTE ** ppucBuffer) = 0;
|
|
|
|
virtual void FLMAPI freeBuf(
|
|
FLMBYTE ** ppucBuffer) = 0;
|
|
|
|
virtual void FLMAPI defragmentMemory( void) = 0;
|
|
|
|
virtual FLMUINT FLMAPI getTrueSize(
|
|
FLMBYTE * pucBuffer) = 0;
|
|
};
|
|
|
|
RCODE FLMAPI FlmAllocMultiAllocator(
|
|
IF_MultiAlloc ** ppMultiAllocator);
|
|
|
|
/****************************************************************************
|
|
Desc: Block
|
|
****************************************************************************/
|
|
flminterface FLMEXP IF_Block : public F_Object
|
|
{
|
|
};
|
|
|
|
/****************************************************************************
|
|
Desc: Block manager
|
|
****************************************************************************/
|
|
flminterface FLMEXP IF_BlockMgr : public F_Object
|
|
{
|
|
virtual FLMUINT FLMAPI getBlockSize( void) = 0;
|
|
|
|
virtual RCODE FLMAPI getBlock(
|
|
FLMUINT32 ui32BlockId,
|
|
IF_Block ** ppBlock,
|
|
FLMBYTE ** ppucBlock) = 0;
|
|
|
|
virtual RCODE FLMAPI createBlock(
|
|
IF_Block ** ppBlock,
|
|
FLMBYTE ** ppucBlock,
|
|
FLMUINT32 * pui32BlockId) = 0;
|
|
|
|
virtual RCODE FLMAPI freeBlock(
|
|
IF_Block ** ppBlock,
|
|
FLMBYTE ** ppucBlock) = 0;
|
|
|
|
virtual RCODE FLMAPI prepareForUpdate(
|
|
IF_Block ** ppBlock,
|
|
FLMBYTE ** ppucBlock) = 0;
|
|
};
|
|
|
|
RCODE FLMAPI FlmAllocBlockMgr(
|
|
FLMUINT uiBlockSize,
|
|
IF_BlockMgr ** ppBlockMgr);
|
|
|
|
/****************************************************************************
|
|
Desc: B-Tree
|
|
****************************************************************************/
|
|
flminterface FLMEXP IF_BTree : public F_Object
|
|
{
|
|
virtual RCODE FLMAPI btCreate(
|
|
FLMUINT16 ui16BtreeId,
|
|
FLMBOOL bCounts,
|
|
FLMBOOL bData,
|
|
FLMUINT32 * pui32RootBlockId) = 0;
|
|
|
|
virtual RCODE FLMAPI btOpen(
|
|
FLMUINT32 ui32RootBlockId,
|
|
FLMBOOL bCounts,
|
|
FLMBOOL bData,
|
|
IF_ResultSetCompare * pCompare = NULL) = 0;
|
|
|
|
virtual void FLMAPI btClose( void) = 0;
|
|
|
|
virtual RCODE FLMAPI btDeleteTree(
|
|
IF_DeleteStatus * ifpDeleteStatus = NULL) = 0;
|
|
|
|
virtual RCODE FLMAPI btGetBlockChains(
|
|
FLMUINT * puiBlockChains,
|
|
FLMUINT * puiNumLevels) = 0;
|
|
|
|
virtual RCODE FLMAPI btRemoveEntry(
|
|
const FLMBYTE * pucKey,
|
|
FLMUINT uiKeyBufSize,
|
|
FLMUINT uiKeyLen) = 0;
|
|
|
|
virtual RCODE FLMAPI btInsertEntry(
|
|
const FLMBYTE * pucKey,
|
|
FLMUINT uiKeyBufSize,
|
|
FLMUINT uiKeyLen,
|
|
const FLMBYTE * pucData,
|
|
FLMUINT uiDataLen,
|
|
FLMBOOL bFirst,
|
|
FLMBOOL bLast,
|
|
FLMUINT32 * pui32BlockId = NULL,
|
|
FLMUINT * puiOffsetIndex = NULL) = 0;
|
|
|
|
virtual RCODE FLMAPI btReplaceEntry(
|
|
const FLMBYTE * pucKey,
|
|
FLMUINT uiKeyBufSize,
|
|
FLMUINT uiKeyLen,
|
|
const FLMBYTE * pucData,
|
|
FLMUINT uiDataLen,
|
|
FLMBOOL bFirst,
|
|
FLMBOOL bLast,
|
|
FLMBOOL bTruncate = TRUE,
|
|
FLMUINT32 * pui32BlockId = NULL,
|
|
FLMUINT * puiOffsetIndex = NULL) = 0;
|
|
|
|
virtual RCODE FLMAPI btLocateEntry(
|
|
FLMBYTE * pucKey,
|
|
FLMUINT uiKeyBufSize,
|
|
FLMUINT * puiKeyLen,
|
|
FLMUINT uiMatch,
|
|
FLMUINT * puiPosition = NULL,
|
|
FLMUINT * puiDataLength = NULL,
|
|
FLMUINT32 * pui32BlockId = NULL,
|
|
FLMUINT * puiOffsetIndex = NULL) = 0;
|
|
|
|
virtual RCODE FLMAPI btGetEntry(
|
|
FLMBYTE * pucKey,
|
|
FLMUINT uiKeyLen,
|
|
FLMBYTE * pucData,
|
|
FLMUINT uiDataBufSize,
|
|
FLMUINT * puiDataLen) = 0;
|
|
|
|
virtual RCODE FLMAPI btNextEntry(
|
|
FLMBYTE * pucKey,
|
|
FLMUINT uiKeyBufSize,
|
|
FLMUINT * puiKeyLen,
|
|
FLMUINT * puiDataLength = NULL,
|
|
FLMUINT32 * pui32BlockId = NULL,
|
|
FLMUINT * puiOffsetIndex = NULL) = 0;
|
|
|
|
virtual RCODE FLMAPI btPrevEntry(
|
|
FLMBYTE * pucKey,
|
|
FLMUINT uiKeyBufSize,
|
|
FLMUINT * puiKeyLen,
|
|
FLMUINT * puiDataLength = NULL,
|
|
FLMUINT32 * pui32BlockId = NULL,
|
|
FLMUINT * puiOffsetIndex = NULL) = 0;
|
|
|
|
virtual RCODE FLMAPI btFirstEntry(
|
|
FLMBYTE * pucKey,
|
|
FLMUINT uiKeyBufSize,
|
|
FLMUINT * puiKeyLen,
|
|
FLMUINT * puiDataLength = NULL,
|
|
FLMUINT32 * pui32BlockId = NULL,
|
|
FLMUINT * puiOffsetIndex = NULL) = 0;
|
|
|
|
virtual RCODE FLMAPI btLastEntry(
|
|
FLMBYTE * pucKey,
|
|
FLMUINT uiKeyBufSize,
|
|
FLMUINT * puiKeyLen,
|
|
FLMUINT * puiDataLength = NULL,
|
|
FLMUINT32 * pui32BlockId = NULL,
|
|
FLMUINT * puiOffsetIndex = NULL) = 0;
|
|
|
|
virtual RCODE FLMAPI btSetReadPosition(
|
|
FLMBYTE * pucKey,
|
|
FLMUINT uiKeyLen,
|
|
FLMUINT uiPosition) = 0;
|
|
|
|
virtual RCODE FLMAPI btGetReadPosition(
|
|
FLMUINT * puiPosition) = 0;
|
|
|
|
virtual RCODE FLMAPI btPositionTo(
|
|
FLMUINT uiPosition,
|
|
FLMBYTE * pucKey,
|
|
FLMUINT uiKeyBufSize,
|
|
FLMUINT * puiKeyLen) = 0;
|
|
|
|
virtual RCODE FLMAPI btGetPosition(
|
|
FLMUINT * puiPosition) = 0;
|
|
|
|
virtual RCODE FLMAPI btRewind( void) = 0;
|
|
|
|
// virtual RCODE FLMAPI btComputeCounts(
|
|
// IF_BTree * pUntilBtree,
|
|
// FLMUINT * puiBlockCount,
|
|
// FLMUINT * puiKeyCount,
|
|
// FLMBOOL * pbTotalsEstimated,
|
|
// FLMUINT uiAvgBlockFullness) = 0;
|
|
|
|
virtual FLMBOOL FLMAPI btHasCounts( void) = 0;
|
|
|
|
virtual FLMBOOL FLMAPI btHasData( void) = 0;
|
|
|
|
virtual void FLMAPI btResetBtree( void) = 0;
|
|
|
|
virtual FLMUINT32 FLMAPI getRootBlockId( void) = 0;
|
|
};
|
|
|
|
RCODE FLMAPI FlmAllocBTree(
|
|
IF_BlockMgr * pBlockMgr,
|
|
IF_BTree ** ppBtree);
|
|
|
|
/****************************************************************************
|
|
Desc: This class is used to do pool memory allocations.
|
|
****************************************************************************/
|
|
|
|
/// Header for blocks in a memory pool. This structure is at the head of each block that belongs to a pool of
|
|
/// memory.
|
|
typedef struct PoolMemoryBlock
|
|
{
|
|
PoolMemoryBlock * pPrevBlock; ///< Points to the previous memory block in the memory pool.
|
|
FLMUINT uiBlockSize; ///< Total size of the memory block.
|
|
FLMUINT uiFreeOffset; ///< Offset in block where next allocation should be made.
|
|
FLMUINT uiFreeSize; ///< Amount of free memory left in block - from uiFreeOfs.
|
|
} PoolMemoryBlock;
|
|
|
|
/// Pool memory manager. This structure is used to keep track of a pool
|
|
/// of memory blocks that are used for pool memory allocation.
|
|
typedef struct
|
|
{
|
|
FLMUINT uiAllocBytes; ///< Total number of bytes requested from
|
|
///< GedPoolAlloc and GedPoolCalloc calls
|
|
FLMUINT uiCount; ///< Number of frees and resets performed on
|
|
///< the pool
|
|
} POOL_STATS;
|
|
|
|
class FLMEXP F_Pool : public F_Object
|
|
{
|
|
public:
|
|
|
|
F_Pool()
|
|
{
|
|
m_uiBytesAllocated = 0;
|
|
m_pLastBlock = NULL;
|
|
m_pPoolStats = NULL;
|
|
m_uiBlockSize = 0;
|
|
}
|
|
|
|
virtual ~F_Pool();
|
|
|
|
/// Initialize memory pool.
|
|
/// \ingroup pool
|
|
FINLINE void FLMAPI poolInit(
|
|
FLMUINT uiBlockSize ///< Default block size for the memory pool.
|
|
)
|
|
{
|
|
m_uiBlockSize = uiBlockSize;
|
|
}
|
|
|
|
void smartPoolInit(
|
|
POOL_STATS * pPoolStats);
|
|
|
|
/// Allocate memory from a memory pool.
|
|
/// \ingroup pool
|
|
RCODE FLMAPI poolAlloc(
|
|
FLMUINT uiSize, ///< Requested allocation size (in bytes).
|
|
void ** ppvPtr ///< Pointer to the allocation
|
|
);
|
|
|
|
/// Allocate memory from a memory pool and initialize memory to zeroes.
|
|
/// \ingroup pool
|
|
RCODE FLMAPI poolCalloc(
|
|
FLMUINT uiSize, ///< Requested allocation size (in bytes).
|
|
void ** ppvPtr); ///< Pointer to the allocation
|
|
|
|
/// Free all memory blocks in a memory pool.
|
|
/// \ingroup pool
|
|
void FLMAPI poolFree( void);
|
|
|
|
/// Reset a memory pool back to a mark.\ Free all memory blocks allocated after the mark.
|
|
/// \ingroup pool
|
|
void FLMAPI poolReset(
|
|
void * pvMark = NULL, ///< Mark that was obtained from GedPoolMark().
|
|
FLMBOOL bReduceFirstBlock = FALSE);
|
|
|
|
/// Obtain a mark in a memory pool.\ Returned mark remembers a location in the
|
|
/// pool which can later be passed to poolReset() to free all memory that was
|
|
/// allocated after the mark.
|
|
/// \ingroup pool
|
|
FINLINE void * FLMAPI poolMark( void)
|
|
{
|
|
return (void *)(m_pLastBlock
|
|
? (FLMBYTE *)m_pLastBlock + m_pLastBlock->uiFreeOffset
|
|
: NULL);
|
|
}
|
|
|
|
FINLINE FLMUINT FLMAPI getBlockSize( void)
|
|
{
|
|
return( m_uiBlockSize);
|
|
}
|
|
|
|
FINLINE FLMUINT FLMAPI getBytesAllocated( void)
|
|
{
|
|
return( m_uiBytesAllocated);
|
|
}
|
|
|
|
private:
|
|
|
|
FINLINE void updateSmartPoolStats( void)
|
|
{
|
|
if (m_uiBytesAllocated)
|
|
{
|
|
if( (m_pPoolStats->uiAllocBytes + m_uiBytesAllocated) >= 0xFFFF0000)
|
|
{
|
|
m_pPoolStats->uiAllocBytes =
|
|
(m_pPoolStats->uiAllocBytes / m_pPoolStats->uiCount) * 100;
|
|
m_pPoolStats->uiCount = 100;
|
|
}
|
|
else
|
|
{
|
|
m_pPoolStats->uiAllocBytes += m_uiBytesAllocated;
|
|
m_pPoolStats->uiCount++;
|
|
}
|
|
m_uiBytesAllocated = 0;
|
|
}
|
|
}
|
|
|
|
FINLINE void setInitialSmartPoolBlockSize( void)
|
|
{
|
|
// Determine starting block size:
|
|
// 1) average of bytes allocated / # of frees/resets (average size needed)
|
|
// 2) add 10% - to minimize extra allocs
|
|
|
|
m_uiBlockSize = (m_pPoolStats->uiAllocBytes / m_pPoolStats->uiCount);
|
|
m_uiBlockSize += (m_uiBlockSize / 10);
|
|
|
|
if (m_uiBlockSize < 512)
|
|
{
|
|
m_uiBlockSize = 512;
|
|
}
|
|
}
|
|
|
|
void freeToMark(
|
|
void * pvMark);
|
|
|
|
PoolMemoryBlock * m_pLastBlock;
|
|
FLMUINT m_uiBlockSize;
|
|
FLMUINT m_uiBytesAllocated;
|
|
POOL_STATS * m_pPoolStats;
|
|
};
|
|
|
|
/****************************************************************************
|
|
Desc:
|
|
*****************************************************************************/
|
|
class FLMEXP F_DynaBuf : public F_Object
|
|
{
|
|
public:
|
|
|
|
F_DynaBuf(
|
|
FLMBYTE * pucBuffer = NULL,
|
|
FLMUINT uiBufferSize = 0)
|
|
{
|
|
m_pucBuffer = pucBuffer;
|
|
m_uiBufferSize = uiBufferSize;
|
|
m_uiOffset = 0;
|
|
m_bAllocatedBuffer = FALSE;
|
|
}
|
|
|
|
virtual ~F_DynaBuf()
|
|
{
|
|
if( m_bAllocatedBuffer)
|
|
{
|
|
f_free( &m_pucBuffer);
|
|
}
|
|
}
|
|
|
|
FINLINE void FLMAPI truncateData(
|
|
FLMUINT uiSize)
|
|
{
|
|
if( uiSize < m_uiOffset)
|
|
{
|
|
m_uiOffset = uiSize;
|
|
}
|
|
}
|
|
|
|
FINLINE RCODE FLMAPI allocSpace(
|
|
FLMUINT uiSize,
|
|
void ** ppvPtr)
|
|
{
|
|
RCODE rc = NE_FLM_OK;
|
|
|
|
if( m_uiOffset + uiSize >= m_uiBufferSize)
|
|
{
|
|
if( RC_BAD( rc = resizeBuffer( m_uiOffset + uiSize + 512)))
|
|
{
|
|
goto Exit;
|
|
}
|
|
}
|
|
|
|
*ppvPtr = &m_pucBuffer[ m_uiOffset];
|
|
m_uiOffset += uiSize;
|
|
|
|
Exit:
|
|
|
|
return( rc);
|
|
}
|
|
|
|
FINLINE RCODE FLMAPI appendByte(
|
|
FLMBYTE ucChar)
|
|
{
|
|
RCODE rc = NE_FLM_OK;
|
|
FLMBYTE * pucTmp = NULL;
|
|
|
|
if( RC_BAD( rc = allocSpace( 1, (void **)&pucTmp)))
|
|
{
|
|
goto Exit;
|
|
}
|
|
|
|
*pucTmp = ucChar;
|
|
|
|
Exit:
|
|
|
|
return( rc);
|
|
}
|
|
|
|
FINLINE RCODE FLMAPI appendUniChar(
|
|
FLMUNICODE uChar)
|
|
{
|
|
RCODE rc = NE_FLM_OK;
|
|
FLMUNICODE * puTmp = NULL;
|
|
|
|
if( RC_BAD( rc = allocSpace( sizeof( FLMUNICODE), (void **)&puTmp)))
|
|
{
|
|
goto Exit;
|
|
}
|
|
|
|
*puTmp = uChar;
|
|
|
|
Exit:
|
|
|
|
return( rc);
|
|
}
|
|
|
|
FINLINE RCODE FLMAPI appendData(
|
|
const void * pvData,
|
|
FLMUINT uiSize)
|
|
{
|
|
RCODE rc = NE_FLM_OK;
|
|
void * pvTmp = NULL;
|
|
|
|
if( RC_BAD( rc = allocSpace( uiSize, &pvTmp)))
|
|
{
|
|
goto Exit;
|
|
}
|
|
|
|
if( uiSize == 1)
|
|
{
|
|
*((FLMBYTE *)pvTmp) = *((FLMBYTE *)pvData);
|
|
}
|
|
else
|
|
{
|
|
f_memcpy( pvTmp, pvData, uiSize);
|
|
}
|
|
|
|
Exit:
|
|
|
|
return( rc);
|
|
}
|
|
|
|
FINLINE RCODE FLMAPI appendString(
|
|
const char * pszString)
|
|
{
|
|
RCODE rc = NE_FLM_OK;
|
|
void * pvTmp = NULL;
|
|
FLMUINT uiSize = f_strlen( pszString);
|
|
|
|
if( RC_BAD( rc = allocSpace( uiSize, &pvTmp)))
|
|
{
|
|
goto Exit;
|
|
}
|
|
|
|
f_memcpy( pvTmp, pszString, uiSize);
|
|
|
|
Exit:
|
|
|
|
return( rc);
|
|
}
|
|
|
|
FINLINE FLMBYTE * FLMAPI getBufferPtr( void)
|
|
{
|
|
return( m_pucBuffer);
|
|
}
|
|
|
|
FINLINE FLMUNICODE * FLMAPI getUnicodePtr( void)
|
|
{
|
|
if( m_uiOffset >= sizeof( FLMUNICODE))
|
|
{
|
|
return( (FLMUNICODE *)m_pucBuffer);
|
|
}
|
|
|
|
return( NULL);
|
|
}
|
|
|
|
FINLINE FLMUINT FLMAPI getUnicodeLength( void)
|
|
{
|
|
if( m_uiOffset <= sizeof( FLMUNICODE))
|
|
{
|
|
return( 0);
|
|
}
|
|
|
|
return( (m_uiOffset >> 1) - 1);
|
|
}
|
|
|
|
FINLINE FLMUINT FLMAPI getDataLength( void)
|
|
{
|
|
return( m_uiOffset);
|
|
}
|
|
|
|
FINLINE RCODE FLMAPI copyFromBuffer(
|
|
F_DynaBuf * pSource)
|
|
{
|
|
RCODE rc = NE_FLM_OK;
|
|
|
|
if( RC_BAD( rc = resizeBuffer( pSource->m_uiBufferSize)))
|
|
{
|
|
goto Exit;
|
|
}
|
|
|
|
if( (m_uiOffset = pSource->m_uiOffset) != 0)
|
|
{
|
|
f_memcpy( m_pucBuffer, pSource->m_pucBuffer, pSource->m_uiOffset);
|
|
}
|
|
|
|
Exit:
|
|
|
|
return( rc);
|
|
}
|
|
|
|
private:
|
|
|
|
FINLINE RCODE resizeBuffer(
|
|
FLMUINT uiNewSize)
|
|
{
|
|
RCODE rc = NE_FLM_OK;
|
|
|
|
if( !m_bAllocatedBuffer)
|
|
{
|
|
if( uiNewSize > m_uiBufferSize)
|
|
{
|
|
FLMBYTE * pucOriginalBuf = m_pucBuffer;
|
|
|
|
if( RC_BAD( rc = f_alloc( uiNewSize, &m_pucBuffer)))
|
|
{
|
|
m_pucBuffer = pucOriginalBuf;
|
|
goto Exit;
|
|
}
|
|
|
|
m_bAllocatedBuffer = TRUE;
|
|
|
|
if( m_uiOffset)
|
|
{
|
|
f_memcpy( m_pucBuffer, pucOriginalBuf, m_uiOffset);
|
|
}
|
|
}
|
|
}
|
|
else
|
|
{
|
|
if( RC_BAD( rc = f_realloc( uiNewSize, &m_pucBuffer)))
|
|
{
|
|
goto Exit;
|
|
}
|
|
|
|
if( uiNewSize < m_uiOffset)
|
|
{
|
|
m_uiOffset = uiNewSize;
|
|
}
|
|
}
|
|
|
|
m_uiBufferSize = uiNewSize;
|
|
|
|
Exit:
|
|
|
|
return( rc);
|
|
}
|
|
|
|
FLMBOOL m_bAllocatedBuffer;
|
|
FLMBYTE * m_pucBuffer;
|
|
FLMUINT m_uiBufferSize;
|
|
FLMUINT m_uiOffset;
|
|
};
|
|
|
|
/****************************************************************************
|
|
Desc:
|
|
****************************************************************************/
|
|
typedef struct
|
|
{
|
|
F_ListItem * pPrevItem;
|
|
F_ListItem * pNextItem;
|
|
FLMUINT uiListCount;
|
|
} F_ListNode;
|
|
|
|
#define FLM_ALL_LISTS 0xFFFF
|
|
|
|
/****************************************************************************
|
|
Desc:
|
|
****************************************************************************/
|
|
class FLMEXP F_ListItem : public F_Object
|
|
{
|
|
public:
|
|
|
|
F_ListItem()
|
|
{
|
|
m_pListManager = NULL;
|
|
m_pListNodes = NULL;
|
|
m_uiListNodeCnt = 0;
|
|
m_bInList = FALSE;
|
|
}
|
|
|
|
virtual ~F_ListItem();
|
|
|
|
void setup(
|
|
F_ListManager * pListMgr,
|
|
F_ListNode * pListNodes,
|
|
FLMUINT uiListNodeCnt);
|
|
|
|
void removeFromList(
|
|
FLMUINT uiList = 0);
|
|
|
|
FINLINE F_ListItem * getNextListItem(
|
|
FLMUINT uiList = 0)
|
|
{
|
|
return( m_pListNodes[ uiList].pNextItem);
|
|
}
|
|
|
|
FINLINE F_ListItem * getPrevListItem(
|
|
FLMUINT uiList = 0)
|
|
{
|
|
return( m_pListNodes[ uiList].pPrevItem);
|
|
}
|
|
|
|
FINLINE F_ListItem * setNextListItem(
|
|
FLMUINT uiList,
|
|
F_ListItem * pNewNext)
|
|
{
|
|
F_ListNode * pListNode;
|
|
|
|
pListNode = &m_pListNodes[ uiList];
|
|
pListNode->pNextItem = pNewNext;
|
|
|
|
return( pNewNext);
|
|
}
|
|
|
|
FINLINE F_ListItem * setPrevListItem(
|
|
FLMUINT uiList,
|
|
F_ListItem * pNewPrev)
|
|
{
|
|
F_ListNode * pListNode;
|
|
|
|
pListNode = &m_pListNodes[ uiList];
|
|
pListNode->pPrevItem = pNewPrev;
|
|
|
|
return( pNewPrev);
|
|
}
|
|
|
|
private:
|
|
|
|
F_ListManager * m_pListManager;
|
|
FLMUINT m_uiListNodeCnt;
|
|
F_ListNode * m_pListNodes;
|
|
FLMBOOL m_bInList;
|
|
|
|
friend class F_ListManager;
|
|
};
|
|
|
|
/****************************************************************************
|
|
Desc:
|
|
****************************************************************************/
|
|
class F_ListManager : public F_Object
|
|
{
|
|
public:
|
|
|
|
F_ListManager(
|
|
F_ListNode * pListNodes,
|
|
FLMUINT uiListNodeCnt)
|
|
{
|
|
flmAssert( pListNodes && uiListNodeCnt );
|
|
|
|
m_uiListNodeCnt = uiListNodeCnt;
|
|
m_pListNodes = pListNodes;
|
|
f_memset( pListNodes, 0, sizeof( F_ListNode) * uiListNodeCnt );
|
|
}
|
|
|
|
virtual ~F_ListManager()
|
|
{
|
|
clearList( FLM_ALL_LISTS);
|
|
}
|
|
|
|
void insertFirst(
|
|
FLMUINT uiList,
|
|
F_ListItem * pNewFirstItem);
|
|
|
|
void insertLast(
|
|
FLMUINT uiList,
|
|
F_ListItem * pNewLastItem);
|
|
|
|
F_ListItem * getItem(
|
|
FLMUINT uiList,
|
|
FLMUINT nth);
|
|
|
|
void removeItem(
|
|
FLMUINT uiList,
|
|
F_ListItem * pItem);
|
|
|
|
FINLINE FLMUINT getListCount( void)
|
|
{
|
|
return( m_uiListNodeCnt);
|
|
}
|
|
|
|
FLMUINT getItemCount(
|
|
FLMUINT uiList);
|
|
|
|
void clearList(
|
|
FLMUINT uiList = 0);
|
|
|
|
private:
|
|
|
|
FLMUINT m_uiListNodeCnt;
|
|
F_ListNode * m_pListNodes;
|
|
};
|
|
|
|
// IMPORTANT NOTE: If these are changed, corresonding changes
|
|
// should be made in java and C# code as well.
|
|
/// Types of locks that may be requested.
|
|
typedef enum
|
|
{
|
|
FLM_LOCK_NONE = 0,
|
|
FLM_LOCK_EXCLUSIVE, ///< 1 = Exclusive lock.
|
|
FLM_LOCK_SHARED ///< 2 = Shared lock.
|
|
} eLockType;
|
|
|
|
/****************************************************************************
|
|
/// Abstract base class to get lock information. The application must
|
|
/// implement this class. A pointer to an object of this class is passed
|
|
/// into IF_LockObject::getLockInfo().
|
|
****************************************************************************/
|
|
flminterface IF_LockInfoClient : public F_Object
|
|
{
|
|
/// Return the lock count. This method is called by to tell the
|
|
/// application how many lock holders plus lock waiters there are. This
|
|
/// gives the application an opportunity to allocate memory to hold the
|
|
/// information that will be returned via the
|
|
/// IF_LockInfoClient::addLockInfo() method. The application should
|
|
/// return TRUE from this method in order to continue, FALSE if it wants
|
|
/// to stop and return from the IF_LockObject::getLockInfo() function.
|
|
virtual FLMBOOL FLMAPI setLockCount(
|
|
FLMUINT uiTotalLocks ///< Total number of lock holders plus lock waiters.
|
|
) = 0;
|
|
|
|
/// Return lock information for a lock holder or waiter. This method
|
|
/// is called for each thread that is either holding the lock or waiting
|
|
/// to obtain the lock. The application should return TRUE from this
|
|
/// method in order to continue, FALSE if it wants to stop and return
|
|
/// from the IF_LockObject::getLockInfo() function.
|
|
virtual FLMBOOL FLMAPI addLockInfo(
|
|
FLMUINT uiLockNum, ///< Position in queue (0 = lock holder, 1..n = lock waiter).
|
|
FLMUINT uiThreadID, ///< Thread ID of the lock holder/waiter.
|
|
FLMUINT uiTime ///< For the lock holder, this is the amount of time the lock has been
|
|
///< held.\ For a lock waiter, this is the amount of time the thread
|
|
///< has been waiting to obtain the lock.\ Both times are milliseconds.
|
|
) = 0;
|
|
};
|
|
|
|
// IMPORTANT NOTE: This structure needs to stay in sync with
|
|
// corresponding structures in java and C# code.
|
|
/**************************************************************************
|
|
/// Structure used in gathering statistics to hold an operation count and an elapsed time.
|
|
**************************************************************************/
|
|
typedef struct
|
|
{
|
|
FLMUINT64 ui64Count; ///< Number of times operation was performed
|
|
FLMUINT64 ui64ElapMilli; ///< Total elapsed time (milliseconds) for the operations.
|
|
} F_COUNT_TIME_STAT;
|
|
|
|
// IMPORTANT NOTE: This structure needs to stay in sync with
|
|
// corresponding structures in java and C# code.
|
|
/**************************************************************************
|
|
/// Structure for returning lock statistics.
|
|
**************************************************************************/
|
|
typedef struct
|
|
{
|
|
F_COUNT_TIME_STAT NoLocks; ///< Statistics on times when nobody was holding a lock on the database.
|
|
F_COUNT_TIME_STAT WaitingForLock; ///< Statistics on times threads were waiting to obtain a database lock.
|
|
F_COUNT_TIME_STAT HeldLock; ///< Statistics on times when a thread was holding a lock on the database.
|
|
} F_LOCK_STATS;
|
|
|
|
/****************************************************************************
|
|
/// Structure that gives information on threads that are either waiting to
|
|
/// obtain a lock or have obtained a lock.
|
|
****************************************************************************/
|
|
typedef struct
|
|
{
|
|
FLMUINT uiThreadId; ///< Thread id of thread that is waiting to obtain a lock or holds a lock.
|
|
FLMUINT uiTime; ///< For lock holder, this is the time the lock was obtained.
|
|
///< For the lock waiter, this is the time he started waiting for the lock.
|
|
} F_LOCK_USER;
|
|
|
|
/****************************************************************************
|
|
Desc:
|
|
****************************************************************************/
|
|
flminterface IF_LockObject : public F_Object
|
|
{
|
|
virtual RCODE FLMAPI lock(
|
|
F_SEM hWaitSem,
|
|
FLMBOOL bExclLock,
|
|
FLMUINT uiMaxWaitSecs,
|
|
FLMINT iPriority,
|
|
F_LOCK_STATS * pLockStats = NULL) = 0;
|
|
|
|
virtual RCODE FLMAPI unlock(
|
|
F_LOCK_STATS * pLockStats = NULL) = 0;
|
|
|
|
virtual FLMUINT FLMAPI getLockCount( void) = 0;
|
|
|
|
virtual FLMUINT FLMAPI getWaiterCount( void) = 0;
|
|
|
|
virtual RCODE FLMAPI getLockInfo(
|
|
FLMINT iPriority,
|
|
eLockType * peCurrLockType,
|
|
FLMUINT * puiThreadId,
|
|
FLMUINT * puiLockHeldTime = NULL,
|
|
FLMUINT * puiNumExclQueued = NULL,
|
|
FLMUINT * puiNumSharedQueued = NULL,
|
|
FLMUINT * puiPriorityCount = NULL) = 0;
|
|
|
|
virtual RCODE FLMAPI getLockInfo(
|
|
IF_LockInfoClient * pLockInfo) = 0;
|
|
|
|
virtual RCODE FLMAPI getLockQueue(
|
|
F_LOCK_USER ** ppLockUsers) = 0;
|
|
|
|
virtual FLMBOOL FLMAPI haveHigherPriorityWaiter(
|
|
FLMINT iPriority) = 0;
|
|
|
|
virtual void FLMAPI timeoutLockWaiter(
|
|
FLMUINT uiThreadId) = 0;
|
|
|
|
virtual void FLMAPI timeoutAllWaiters( void) = 0;
|
|
};
|
|
|
|
RCODE FLMAPI FlmAllocLockObject(
|
|
IF_LockObject ** ppLockObject);
|
|
|
|
/****************************************************************************
|
|
Desc: Misc.
|
|
****************************************************************************/
|
|
#define F_UNREFERENCED_PARM( parm) \
|
|
(void)parm
|
|
|
|
#define f_min(a, b) \
|
|
((a) < (b) ? (a) : (b))
|
|
|
|
#define f_max(a, b) \
|
|
((a) < (b) ? (b) : (a))
|
|
|
|
#define f_swap( a, b, tmp) \
|
|
((tmp) = (a), (a) = (b), (b) = (tmp))
|
|
|
|
FINLINE FLMBOOL f_isHexChar(
|
|
FLMBYTE ucChar)
|
|
{
|
|
if( (ucChar >= '0' && ucChar <= '9') ||
|
|
(ucChar >= 'A' && ucChar <= 'F') ||
|
|
(ucChar >= 'a' && ucChar <= 'f'))
|
|
{
|
|
return( TRUE);
|
|
}
|
|
|
|
return( FALSE);
|
|
}
|
|
|
|
FINLINE FLMBOOL f_isHexChar(
|
|
FLMUNICODE uChar)
|
|
{
|
|
if( uChar > 127)
|
|
{
|
|
return( FALSE);
|
|
}
|
|
|
|
return( f_isHexChar( f_tonative( (FLMBYTE)uChar)));
|
|
}
|
|
|
|
FINLINE FLMBYTE f_getHexVal(
|
|
FLMBYTE ucChar)
|
|
{
|
|
if( ucChar >= '0' && ucChar <= '9')
|
|
{
|
|
return( (FLMBYTE)(ucChar - '0'));
|
|
}
|
|
else if( ucChar >= 'A' && ucChar <= 'F')
|
|
{
|
|
return( (FLMBYTE)((ucChar - 'A') + 10));
|
|
}
|
|
else if( ucChar >= 'a' && ucChar <= 'f')
|
|
{
|
|
return( (FLMBYTE)((ucChar - 'a') + 10));
|
|
}
|
|
|
|
return( 0);
|
|
}
|
|
|
|
FINLINE FLMBYTE f_getHexVal(
|
|
FLMUNICODE uChar)
|
|
{
|
|
return( f_getHexVal( f_tonative( (FLMBYTE)uChar)));
|
|
}
|
|
|
|
FINLINE FLMBOOL f_isValidHexNum(
|
|
const FLMBYTE * pszString)
|
|
{
|
|
if( *pszString == 0)
|
|
{
|
|
return( FALSE);
|
|
}
|
|
|
|
while( *pszString)
|
|
{
|
|
if( !f_isHexChar( *pszString))
|
|
{
|
|
return( TRUE);
|
|
}
|
|
|
|
pszString++;
|
|
}
|
|
|
|
return( TRUE);
|
|
}
|
|
|
|
FINLINE FLMUINT64 f_roundUp(
|
|
FLMUINT64 ui64ValueToRound,
|
|
FLMUINT64 ui64Boundary)
|
|
{
|
|
FLMUINT64 ui64RetVal;
|
|
|
|
ui64RetVal = ((ui64ValueToRound / ui64Boundary) * ui64Boundary);
|
|
|
|
if( ui64RetVal < ui64ValueToRound)
|
|
{
|
|
ui64RetVal += ui64Boundary;
|
|
}
|
|
|
|
return( ui64RetVal);
|
|
}
|
|
|
|
FINLINE void f_setBit(
|
|
FLMBYTE * pucBuffer,
|
|
FLMUINT uiBit)
|
|
{
|
|
pucBuffer[ uiBit >> 3] |= (FLMBYTE)(0x01 << (uiBit & 0x07));
|
|
}
|
|
|
|
FINLINE void f_clearBit(
|
|
FLMBYTE * pucBuffer,
|
|
FLMUINT uiBit)
|
|
{
|
|
pucBuffer[ uiBit >> 3] &= ~((FLMBYTE)(0x01 << (uiBit & 0x07)));
|
|
}
|
|
|
|
FINLINE FLMBOOL f_isBitSet(
|
|
FLMBYTE * pucBuffer,
|
|
FLMUINT uiBit)
|
|
{
|
|
return( (pucBuffer[ uiBit >> 3] & (FLMBYTE)(0x01 << (uiBit & 0x07)))
|
|
? TRUE
|
|
: FALSE);
|
|
}
|
|
|
|
RCODE FLMAPI f_filecpy(
|
|
const char * pszSourceFile,
|
|
const char * pszData);
|
|
|
|
RCODE FLMAPI f_filecat(
|
|
const char * pszSourceFile,
|
|
const char * pszData);
|
|
|
|
RCODE FLMAPI f_filetobuf(
|
|
const char * pszSourceFile,
|
|
char ** ppszBuffer);
|
|
|
|
/****************************************************************************
|
|
Desc: FTX
|
|
****************************************************************************/
|
|
|
|
#define FKB_ESCAPE 0xE01B
|
|
#define FKB_ESC FKB_ESCAPE
|
|
#define FKB_SPACE 0x20
|
|
|
|
#define FKB_HOME 0xE008
|
|
#define FKB_UP 0xE017
|
|
#define FKB_PGUP 0xE059
|
|
#define FKB_LEFT 0xE019
|
|
#define FKB_RIGHT 0xE018
|
|
#define FKB_END 0xE055
|
|
#define FKB_DOWN 0xE01A
|
|
#define FKB_PGDN 0xE05A
|
|
#define FKB_PLUS 0x002B
|
|
#define FKB_MINUS 0x002D
|
|
|
|
#define FKB_INSERT 0xE05D
|
|
#define FKB_DELETE 0xE051
|
|
#define FKB_BACKSPACE 0xE050
|
|
#define FKB_TAB 0xE009
|
|
|
|
#define FKB_ENTER 0xE00A
|
|
#define FKB_F1 0xE020
|
|
#define FKB_F2 0xE021
|
|
#define FKB_F3 0xE022
|
|
#define FKB_F4 0xE023
|
|
#define FKB_F5 0xE024
|
|
#define FKB_F6 0xE025
|
|
#define FKB_F7 0xE026
|
|
#define FKB_F8 0xE027
|
|
#define FKB_F9 0xE028
|
|
#define FKB_F10 0xE029
|
|
#define FKB_F11 0xE03A
|
|
#define FKB_F12 0xE03B
|
|
|
|
#define FKB_STAB 0xE05E
|
|
|
|
#define FKB_SF1 0xE02C
|
|
#define FKB_SF2 0xE02D
|
|
#define FKB_SF3 0xE02E
|
|
#define FKB_SF4 0xE02F
|
|
#define FKB_SF5 0xE030
|
|
#define FKB_SF6 0xE031
|
|
#define FKB_SF7 0xE032
|
|
#define FKB_SF8 0xE033
|
|
#define FKB_SF9 0xE034
|
|
#define FKB_SF10 0xE035
|
|
#define FKB_SF11 0xE036
|
|
#define FKB_SF12 0xE037
|
|
|
|
#define FKB_ALT_A 0xFDDC
|
|
#define FKB_ALT_B 0xFDDD
|
|
#define FKB_ALT_C 0xFDDE
|
|
#define FKB_ALT_D 0xFDDF
|
|
#define FKB_ALT_E 0xFDE0
|
|
#define FKB_ALT_F 0xFDE1
|
|
#define FKB_ALT_G 0xFDE2
|
|
#define FKB_ALT_H 0xFDE3
|
|
#define FKB_ALT_I 0xFDE4
|
|
#define FKB_ALT_J 0xFDE5
|
|
#define FKB_ALT_K 0xFDE6
|
|
#define FKB_ALT_L 0xFDE7
|
|
#define FKB_ALT_M 0xFDE8
|
|
#define FKB_ALT_N 0xFDE9
|
|
#define FKB_ALT_O 0xFDEA
|
|
#define FKB_ALT_P 0xFDEB
|
|
#define FKB_ALT_Q 0xFDEC
|
|
#define FKB_ALT_R 0xFDED
|
|
#define FKB_ALT_S 0xFDEE
|
|
#define FKB_ALT_T 0xFDEF
|
|
#define FKB_ALT_U 0xFDF0
|
|
#define FKB_ALT_V 0xFDF1
|
|
#define FKB_ALT_W 0xFDF2
|
|
#define FKB_ALT_X 0xFDF3
|
|
#define FKB_ALT_Y 0xFDF4
|
|
#define FKB_ALT_Z 0xFDF5
|
|
|
|
#define FKB_ALT_1 0xFDF7
|
|
#define FKB_ALT_2 0xFDF8
|
|
#define FKB_ALT_3 0xFDF9
|
|
#define FKB_ALT_4 0xFDFA
|
|
#define FKB_ALT_5 0xFDFB
|
|
#define FKB_ALT_6 0xFDFC
|
|
#define FKB_ALT_7 0xFDFD
|
|
#define FKB_ALT_8 0xFDFE
|
|
#define FKB_ALT_9 0xFDFF
|
|
#define FKB_ALT_0 0xFDF6
|
|
|
|
#define FKB_ALT_MINUS 0xE061
|
|
#define FKB_ALT_EQUAL 0xE06B
|
|
|
|
#define FKB_ALT_F1 0xE038
|
|
#define FKB_ALT_F2 0xE039
|
|
#define FKB_ALT_F3 0xE03A
|
|
#define FKB_ALT_F4 0xE03B
|
|
#define FKB_ALT_F5 0xE03C
|
|
#define FKB_ALT_F6 0xE03D
|
|
#define FKB_ALT_F7 0xE03E
|
|
#define FKB_ALT_F8 0xE03F
|
|
#define FKB_ALT_F9 0xE040
|
|
#define FKB_ALT_F10 0xE041
|
|
|
|
#define FKB_GOTO 0xE058
|
|
#define FKB_CTRL_HOME 0xE058
|
|
#define FKB_CTRL_UP 0xE063
|
|
#define FKB_CTRL_PGUP 0xE057
|
|
|
|
#define FKB_CTRL_LEFT 0xE054
|
|
#define FKB_CTRL_RIGHT 0xE053
|
|
|
|
#define FKB_CTRL_END 0xE00B
|
|
#define FKB_CTRL_DOWN 0xE064
|
|
#define FKB_CTRL_PGDN 0xE00C
|
|
#define FKB_CTRL_INSERT 0xE06E
|
|
#define FKB_CTRL_DELETE 0xE06D
|
|
|
|
#define FKB_CTRL_ENTER 0xE05F
|
|
|
|
#define FKB_CTRL_A 0xE07C
|
|
#define FKB_CTRL_B 0xE07D
|
|
#define FKB_CTRL_C 0xE07E
|
|
#define FKB_CTRL_D 0xE07F
|
|
#define FKB_CTRL_E 0xE080
|
|
#define FKB_CTRL_F 0xE081
|
|
#define FKB_CTRL_G 0xE082
|
|
#define FKB_CTRL_H 0xE083
|
|
#define FKB_CTRL_I 0xE084
|
|
#define FKB_CTRL_J 0xE085
|
|
#define FKB_CTRL_K 0xE086
|
|
#define FKB_CTRL_L 0xE087
|
|
#define FKB_CTRL_M 0xE088
|
|
#define FKB_CTRL_N 0xE089
|
|
#define FKB_CTRL_O 0xE08A
|
|
#define FKB_CTRL_P 0xE08B
|
|
#define FKB_CTRL_Q 0xE08C
|
|
#define FKB_CTRL_R 0xE08D
|
|
#define FKB_CTRL_S 0xE08E
|
|
#define FKB_CTRL_T 0xE08F
|
|
#define FKB_CTRL_U 0xE090
|
|
#define FKB_CTRL_V 0xE091
|
|
#define FKB_CTRL_W 0xE092
|
|
#define FKB_CTRL_X 0xE093
|
|
#define FKB_CTRL_Y 0xE094
|
|
#define FKB_CTRL_Z 0xE095
|
|
|
|
#define FKB_CTRL_1 0xE06B
|
|
#define FKB_CTRL_2 0xE06C
|
|
#define FKB_CTRL_3 0xE06D
|
|
#define FKB_CTRL_4 0xE06E
|
|
#define FKB_CTRL_5 0xE06F
|
|
#define FKB_CTRL_6 0xE070
|
|
#define FKB_CTRL_7 0xE071
|
|
#define FKB_CTRL_8 0xE072
|
|
#define FKB_CTRL_9 0xE073
|
|
#define FKB_CTRL_0 0xE074
|
|
|
|
#define FKB_CTRL_MINUS 0xE060
|
|
#define FKB_CTRL_EQUAL 0xE061
|
|
|
|
#define FKB_CTRL_F1 0xE038
|
|
#define FKB_CTRL_F2 0xE039
|
|
#define FKB_CTRL_F3 0xE03A
|
|
#define FKB_CTRL_F4 0xE03B
|
|
#define FKB_CTRL_F5 0xE03C
|
|
#define FKB_CTRL_F6 0xE03D
|
|
#define FKB_CTRL_F7 0xE03E
|
|
#define FKB_CTRL_F8 0xE03F
|
|
#define FKB_CTRL_F9 0xE040
|
|
#define FKB_CTRL_F10 0xE041
|
|
|
|
#define FLM_CURSOR_BLOCK 0x01
|
|
#define FLM_CURSOR_UNDERLINE 0x02
|
|
#define FLM_CURSOR_INVISIBLE 0x04
|
|
#define FLM_CURSOR_VISIBLE 0x08
|
|
|
|
typedef struct FTX_SCREEN FTX_SCREEN;
|
|
|
|
typedef struct FTX_WINDOW FTX_WINDOW;
|
|
|
|
typedef FLMBOOL (FLMAPI * KEY_HANDLER)(
|
|
FLMUINT uiKeyIn,
|
|
FLMUINT * puiKeyOut,
|
|
void * pvAppData);
|
|
|
|
RCODE FLMAPI FTXInit(
|
|
const char * pszAppName = NULL,
|
|
FLMUINT uiCols = 0,
|
|
FLMUINT uiRows = 0,
|
|
eColorType backgroundColor = FLM_BLUE,
|
|
eColorType foregroundColor = FLM_WHITE,
|
|
KEY_HANDLER pKeyHandler = NULL,
|
|
void * pvKeyHandlerData = NULL);
|
|
|
|
void FLMAPI FTXExit( void);
|
|
|
|
void FLMAPI FTXCycleScreensNext( void);
|
|
|
|
void FLMAPI FTXCycleScreensPrev( void);
|
|
|
|
void FLMAPI FTXRefreshCursor( void);
|
|
|
|
void FLMAPI FTXInvalidate( void);
|
|
|
|
void FLMAPI FTXSetShutdownFlag(
|
|
FLMBOOL * pbShutdownFlag);
|
|
|
|
RCODE FLMAPI FTXScreenInit(
|
|
const char * pszName,
|
|
FTX_SCREEN ** ppScreen);
|
|
|
|
RCODE FLMAPI FTXCaptureScreen(
|
|
FLMBYTE * pText,
|
|
FLMBYTE * pForeAttrib,
|
|
FLMBYTE * pBackAttrib);
|
|
|
|
void FLMAPI FTXRefresh( void);
|
|
|
|
void FLMAPI FTXSetRefreshState(
|
|
FLMBOOL bDisable);
|
|
|
|
FLMBOOL FLMAPI FTXRefreshDisabled( void);
|
|
|
|
RCODE FLMAPI FTXAddKey(
|
|
FLMUINT uiKey);
|
|
|
|
RCODE FLMAPI FTXWinInit(
|
|
FTX_SCREEN * pScreen,
|
|
FLMUINT uiCols,
|
|
FLMUINT uiRows,
|
|
FTX_WINDOW ** ppWindow);
|
|
|
|
void FLMAPI FTXWinFree(
|
|
FTX_WINDOW ** ppWindow);
|
|
|
|
RCODE FLMAPI FTXWinOpen(
|
|
FTX_WINDOW * pWindow);
|
|
|
|
RCODE FLMAPI FTXWinSetName(
|
|
FTX_WINDOW * pWindow,
|
|
char * pszName);
|
|
|
|
void FLMAPI FTXWinClose(
|
|
FTX_WINDOW * pWindow);
|
|
|
|
void FLMAPI FTXWinSetFocus(
|
|
FTX_WINDOW * pWindow);
|
|
|
|
void FLMAPI FTXWinPrintChar(
|
|
FTX_WINDOW * pWindow,
|
|
FLMUINT uiChar);
|
|
|
|
void FLMAPI FTXWinPrintStr(
|
|
FTX_WINDOW * pWindow,
|
|
const char * pszString);
|
|
|
|
void FLMAPI FTXWinPrintf(
|
|
FTX_WINDOW * pWindow,
|
|
const char * pszFormat, ...);
|
|
|
|
void FLMAPI FTXWinCPrintf(
|
|
FTX_WINDOW * pWindow,
|
|
eColorType backgroundColor,
|
|
eColorType foregroundColor,
|
|
const char * pszFormat, ...);
|
|
|
|
void FLMAPI FTXWinPrintStrXY(
|
|
FTX_WINDOW * pWindow,
|
|
const char * pszString,
|
|
FLMUINT uiCol,
|
|
FLMUINT uiRow);
|
|
|
|
void FLMAPI FTXWinMove(
|
|
FTX_WINDOW * pWindow,
|
|
FLMUINT uiCol,
|
|
FLMUINT uiRow);
|
|
|
|
void FLMAPI FTXWinPaintBackground(
|
|
FTX_WINDOW * pWindow,
|
|
eColorType backgroundColor);
|
|
|
|
void FLMAPI FTXWinPaintForeground(
|
|
FTX_WINDOW * pWindow,
|
|
eColorType foregroundColor);
|
|
|
|
void FLMAPI FTXWinPaintRow(
|
|
FTX_WINDOW * pWindow,
|
|
eColorType * pBackgroundColor,
|
|
eColorType * pForegroundColor,
|
|
FLMUINT uiRow);
|
|
|
|
void FLMAPI FTXWinSetChar(
|
|
FTX_WINDOW * pWindow,
|
|
FLMUINT uiChar);
|
|
|
|
void FLMAPI FTXWinPaintRowForeground(
|
|
FTX_WINDOW * pWindow,
|
|
eColorType foregroundColor,
|
|
FLMUINT uiRow);
|
|
|
|
void FLMAPI FTXWinPaintRowBackground(
|
|
FTX_WINDOW * pWindow,
|
|
eColorType backgroundColor,
|
|
FLMUINT uiRow);
|
|
|
|
void FLMAPI FTXWinSetBackFore(
|
|
FTX_WINDOW * pWindow,
|
|
eColorType backgroundColor,
|
|
eColorType foregroundColor);
|
|
|
|
void FLMAPI FTXWinGetCanvasSize(
|
|
FTX_WINDOW * pWindow,
|
|
FLMUINT * puiNumCols,
|
|
FLMUINT * puiNumRows);
|
|
|
|
void FLMAPI FTXWinGetSize(
|
|
FTX_WINDOW * pWindow,
|
|
FLMUINT * puiNumCols,
|
|
FLMUINT * puiNumRows);
|
|
|
|
FLMUINT FLMAPI FTXWinGetCurrRow(
|
|
FTX_WINDOW * pWindow);
|
|
|
|
FLMUINT FLMAPI FTXWinGetCurrCol(
|
|
FTX_WINDOW * pWindow);
|
|
|
|
void FLMAPI FTXWinGetBackFore(
|
|
FTX_WINDOW * pWindow,
|
|
eColorType * pBackgroundColor,
|
|
eColorType * pForegroundColor);
|
|
|
|
void FLMAPI FTXWinDrawBorder(
|
|
FTX_WINDOW * pWindow);
|
|
|
|
void FLMAPI FTXWinSetTitle(
|
|
FTX_WINDOW * pWindow,
|
|
const char * pszTitle,
|
|
eColorType backgroundColor,
|
|
eColorType foregroundColor);
|
|
|
|
void FLMAPI FTXWinSetHelp(
|
|
FTX_WINDOW * pWindow,
|
|
const char * pszHelp,
|
|
eColorType backgroundColor,
|
|
eColorType foregroundColor);
|
|
|
|
RCODE FLMAPI FTXLineEdit(
|
|
FTX_WINDOW * pWindow,
|
|
char * pszBuffer,
|
|
FLMUINT uiBufSize,
|
|
FLMUINT uiMaxWidth,
|
|
FLMUINT * puiCharCount,
|
|
FLMUINT * puiTermChar);
|
|
|
|
FLMUINT FLMAPI FTXLineEd(
|
|
FTX_WINDOW * pWindow,
|
|
char * pszBuffer,
|
|
FLMUINT uiBufSize);
|
|
|
|
void FLMAPI FTXWinSetCursorPos(
|
|
FTX_WINDOW * pWindow,
|
|
FLMUINT uiCol,
|
|
FLMUINT uiRow);
|
|
|
|
void FLMAPI FTXWinGetCursorPos(
|
|
FTX_WINDOW * pWindow,
|
|
FLMUINT * puiCol,
|
|
FLMUINT * puiRow);
|
|
|
|
void FLMAPI FTXWinClear(
|
|
FTX_WINDOW * pWindow);
|
|
|
|
void FLMAPI FTXWinClearXY(
|
|
FTX_WINDOW * pWindow,
|
|
FLMUINT uiCol,
|
|
FLMUINT uiRow);
|
|
|
|
void FLMAPI FTXWinClearLine(
|
|
FTX_WINDOW * pWindow,
|
|
FLMUINT uiCol,
|
|
FLMUINT uiRow);
|
|
|
|
void FLMAPI FTXWinClearToEOL(
|
|
FTX_WINDOW * pWindow);
|
|
|
|
void FLMAPI FTXWinSetCursorType(
|
|
FTX_WINDOW * pWindow,
|
|
FLMUINT uiType);
|
|
|
|
FLMUINT FLMAPI FTXWinGetCursorType(
|
|
FTX_WINDOW * pWindow);
|
|
|
|
RCODE FLMAPI FTXWinInputChar(
|
|
FTX_WINDOW * pWindow,
|
|
FLMUINT * puiChar);
|
|
|
|
RCODE FLMAPI FTXWinTestKB(
|
|
FTX_WINDOW * pWindow);
|
|
|
|
void FLMAPI FTXWinSetScroll(
|
|
FTX_WINDOW * pWindow,
|
|
FLMBOOL bScroll);
|
|
|
|
void FLMAPI FTXWinSetLineWrap(
|
|
FTX_WINDOW * pWindow,
|
|
FLMBOOL bLineWrap);
|
|
|
|
void FLMAPI FTXWinGetScroll(
|
|
FTX_WINDOW * pWindow,
|
|
FLMBOOL * pbScroll);
|
|
|
|
RCODE FLMAPI FTXWinGetScreen(
|
|
FTX_WINDOW * pWindow,
|
|
FTX_SCREEN ** ppScreen);
|
|
|
|
RCODE FLMAPI FTXWinGetPosition(
|
|
FTX_WINDOW * pWindow,
|
|
FLMUINT * puiCol,
|
|
FLMUINT * puiRow);
|
|
|
|
void FLMAPI FTXScreenFree(
|
|
FTX_SCREEN ** ppScreen);
|
|
|
|
RCODE FLMAPI FTXScreenInitStandardWindows(
|
|
FTX_SCREEN * pScreen,
|
|
eColorType titleBackColor,
|
|
eColorType titleForeColor,
|
|
eColorType mainBackColor,
|
|
eColorType mainForeColor,
|
|
FLMBOOL bBorder,
|
|
FLMBOOL bBackFill,
|
|
const char * pszTitle,
|
|
FTX_WINDOW ** ppTitleWin,
|
|
FTX_WINDOW ** ppMainWin);
|
|
|
|
void FLMAPI FTXScreenSetShutdownFlag(
|
|
FTX_SCREEN * pScreen,
|
|
FLMBOOL * pbShutdownFlag);
|
|
|
|
RCODE FLMAPI FTXScreenDisplay(
|
|
FTX_SCREEN * pScreen);
|
|
|
|
RCODE FLMAPI FTXScreenGetSize(
|
|
FTX_SCREEN * pScreen,
|
|
FLMUINT * puiNumCols,
|
|
FLMUINT * puiNumRows);
|
|
|
|
RCODE FLMAPI FTXMessageWindow(
|
|
FTX_SCREEN * pScreen,
|
|
eColorType backgroundColor,
|
|
eColorType foregroundColor,
|
|
const char * pszMessage1,
|
|
const char * pszMessage2,
|
|
FTX_WINDOW ** ppWindow);
|
|
|
|
RCODE FLMAPI FTXDisplayMessage(
|
|
FTX_SCREEN * pScreen,
|
|
eColorType backgroundColor,
|
|
eColorType foregroundColor,
|
|
const char * pszMessage1,
|
|
const char * pszMessage2,
|
|
FLMUINT * puiTermChar);
|
|
|
|
RCODE FLMAPI FTXDisplayScrollWindow(
|
|
FTX_SCREEN * pScreen,
|
|
const char * pszTitle,
|
|
const char * pszMessage,
|
|
FLMUINT uiCols,
|
|
FLMUINT uiRows);
|
|
|
|
RCODE FLMAPI FTXGetInput(
|
|
FTX_SCREEN * pScreen,
|
|
const char * pszMessage,
|
|
char * pszResponse,
|
|
FLMUINT uiMaxRespLen,
|
|
FLMUINT * puiTermChar);
|
|
|
|
void FLMAPI FTXBeep( void);
|
|
|
|
RCODE FLMAPI f_conInit(
|
|
FLMUINT uiRows,
|
|
FLMUINT uiCols,
|
|
const char * pszTitle);
|
|
|
|
void FLMAPI f_conExit( void);
|
|
|
|
void FLMAPI f_conGetScreenSize(
|
|
FLMUINT * puiNumColsRV,
|
|
FLMUINT * puiNumRowsRV);
|
|
|
|
void FLMAPI f_conDrawBorder( void);
|
|
|
|
void FLMAPI f_conStrOut(
|
|
const char * pszString);
|
|
|
|
void FLMAPI f_conStrOutXY(
|
|
const char * pszString,
|
|
FLMUINT uiCol,
|
|
FLMUINT uiRow);
|
|
|
|
void FLMAPI f_conPrintf(
|
|
const char * pszFormat, ...);
|
|
|
|
void FLMAPI f_conCPrintf(
|
|
eColorType back,
|
|
eColorType fore,
|
|
const char * pszFormat, ...);
|
|
|
|
void FLMAPI f_conClearScreen(
|
|
FLMUINT uiCol,
|
|
FLMUINT uiRow);
|
|
|
|
void FLMAPI f_conClearLine(
|
|
FLMUINT uiCol,
|
|
FLMUINT uiRow);
|
|
|
|
void FLMAPI f_conSetBackFore(
|
|
eColorType backColor,
|
|
eColorType foreColor);
|
|
|
|
FLMUINT FLMAPI f_conGetCursorColumn( void);
|
|
|
|
FLMUINT FLMAPI f_conGetCursorRow( void);
|
|
|
|
void FLMAPI f_conSetCursorType(
|
|
FLMUINT uiType);
|
|
|
|
void FLMAPI f_conSetCursorPos(
|
|
FLMUINT uiCol,
|
|
FLMUINT uiRow);
|
|
|
|
FLMUINT FLMAPI f_conGetKey( void);
|
|
|
|
FLMBOOL FLMAPI f_conHaveKey( void);
|
|
|
|
FLMUINT FLMAPI f_conLineEdit(
|
|
char * pszString,
|
|
FLMUINT uiMaxLen);
|
|
|
|
/****************************************************************************
|
|
Desc:
|
|
****************************************************************************/
|
|
class FLMEXP F_BufferIStream : public IF_BufferIStream
|
|
{
|
|
public:
|
|
|
|
F_BufferIStream()
|
|
{
|
|
m_pucBuffer = NULL;
|
|
m_uiBufferLen = 0;
|
|
m_uiOffset = 0;
|
|
m_bAllocatedBuffer = FALSE;
|
|
m_bIsOpen = FALSE;
|
|
}
|
|
|
|
virtual ~F_BufferIStream();
|
|
|
|
RCODE FLMAPI openStream(
|
|
const char * pucBuffer,
|
|
FLMUINT uiLength,
|
|
char ** ppucAllocatedBuffer = NULL);
|
|
|
|
FINLINE FLMUINT64 FLMAPI totalSize( void)
|
|
{
|
|
f_assert( m_bIsOpen);
|
|
return( m_uiBufferLen);
|
|
}
|
|
|
|
FINLINE FLMUINT64 FLMAPI remainingSize( void)
|
|
{
|
|
f_assert( m_bIsOpen);
|
|
return( m_uiBufferLen - m_uiOffset);
|
|
}
|
|
|
|
RCODE FLMAPI closeStream( void);
|
|
|
|
FINLINE RCODE FLMAPI positionTo(
|
|
FLMUINT64 ui64Position)
|
|
{
|
|
f_assert( m_bIsOpen);
|
|
|
|
if( ui64Position < m_uiBufferLen)
|
|
{
|
|
m_uiOffset = (FLMUINT)ui64Position;
|
|
}
|
|
else
|
|
{
|
|
m_uiOffset = m_uiBufferLen;
|
|
}
|
|
|
|
return( NE_FLM_OK);
|
|
}
|
|
|
|
FINLINE FLMUINT64 FLMAPI getCurrPosition( void)
|
|
{
|
|
f_assert( m_bIsOpen);
|
|
return( m_uiOffset);
|
|
}
|
|
|
|
FINLINE void FLMAPI truncateStream(
|
|
FLMUINT64 ui64Offset = 0)
|
|
{
|
|
f_assert( m_bIsOpen);
|
|
f_assert( ui64Offset >= m_uiOffset);
|
|
f_assert( ui64Offset <= m_uiBufferLen);
|
|
|
|
m_uiBufferLen = (FLMUINT)ui64Offset;
|
|
}
|
|
|
|
RCODE FLMAPI read(
|
|
void * pvBuffer,
|
|
FLMUINT uiBytesToRead,
|
|
FLMUINT * puiBytesRead);
|
|
|
|
FINLINE const FLMBYTE * getBuffer( void)
|
|
{
|
|
f_assert( m_bIsOpen);
|
|
return( m_pucBuffer);
|
|
}
|
|
|
|
FINLINE const FLMBYTE * FLMAPI getBufferAtCurrentOffset( void)
|
|
{
|
|
f_assert( m_bIsOpen);
|
|
return( m_pucBuffer ? &m_pucBuffer[ m_uiOffset] : NULL);
|
|
}
|
|
|
|
FINLINE FLMBOOL isOpen( void)
|
|
{
|
|
return( m_bIsOpen);
|
|
}
|
|
|
|
private:
|
|
|
|
const FLMBYTE * m_pucBuffer;
|
|
FLMUINT m_uiBufferLen;
|
|
FLMUINT m_uiOffset;
|
|
FLMBOOL m_bAllocatedBuffer;
|
|
FLMBOOL m_bIsOpen;
|
|
};
|
|
|
|
/****************************************************************************
|
|
Desc:
|
|
****************************************************************************/
|
|
class FLMEXP F_FileIStream : public IF_PosIStream
|
|
{
|
|
public:
|
|
|
|
F_FileIStream()
|
|
{
|
|
m_pFileHdl = NULL;
|
|
m_ui64FileOffset = 0;
|
|
}
|
|
|
|
virtual ~F_FileIStream()
|
|
{
|
|
if( m_pFileHdl)
|
|
{
|
|
m_pFileHdl->Release();
|
|
}
|
|
}
|
|
|
|
RCODE FLMAPI openStream(
|
|
const char * pszPath);
|
|
|
|
RCODE FLMAPI closeStream( void);
|
|
|
|
RCODE FLMAPI positionTo(
|
|
FLMUINT64 ui64Position);
|
|
|
|
FLMUINT64 FLMAPI totalSize( void);
|
|
|
|
FLMUINT64 FLMAPI remainingSize( void);
|
|
|
|
FLMUINT64 FLMAPI getCurrPosition( void);
|
|
|
|
RCODE FLMAPI read(
|
|
void * pvBuffer,
|
|
FLMUINT uiBytesToRead,
|
|
FLMUINT * puiBytesRead);
|
|
|
|
private:
|
|
|
|
IF_FileHdl * m_pFileHdl;
|
|
FLMUINT64 m_ui64FileOffset;
|
|
};
|
|
|
|
/****************************************************************************
|
|
Desc:
|
|
****************************************************************************/
|
|
class FLMEXP F_BufferedIStream : public IF_PosIStream
|
|
{
|
|
public:
|
|
|
|
F_BufferedIStream()
|
|
{
|
|
m_pIStream = NULL;
|
|
m_pucBuffer = NULL;
|
|
}
|
|
|
|
virtual ~F_BufferedIStream()
|
|
{
|
|
closeStream();
|
|
}
|
|
|
|
RCODE FLMAPI openStream(
|
|
IF_IStream * pIStream,
|
|
FLMUINT uiBufferSize);
|
|
|
|
RCODE FLMAPI read(
|
|
void * pvBuffer,
|
|
FLMUINT uiBytesToRead,
|
|
FLMUINT * puiBytesRead);
|
|
|
|
RCODE FLMAPI closeStream( void);
|
|
|
|
FINLINE FLMUINT64 FLMAPI totalSize( void)
|
|
{
|
|
if (!m_pIStream)
|
|
{
|
|
f_assert( 0);
|
|
return( 0);
|
|
}
|
|
|
|
return( m_uiBytesAvail);
|
|
}
|
|
|
|
FINLINE FLMUINT64 FLMAPI remainingSize( void)
|
|
{
|
|
if( !m_pIStream)
|
|
{
|
|
f_assert( 0);
|
|
return( 0);
|
|
}
|
|
|
|
return( m_uiBytesAvail - m_uiBufferOffset);
|
|
}
|
|
|
|
FINLINE RCODE FLMAPI positionTo(
|
|
FLMUINT64 ui64Position)
|
|
{
|
|
if( !m_pIStream)
|
|
{
|
|
f_assert( 0);
|
|
return( RC_SET( NE_FLM_ILLEGAL_OP));
|
|
}
|
|
|
|
if( ui64Position < m_uiBytesAvail)
|
|
{
|
|
m_uiBufferOffset = (FLMUINT)ui64Position;
|
|
}
|
|
else
|
|
{
|
|
m_uiBufferOffset = m_uiBytesAvail;
|
|
}
|
|
|
|
return( NE_FLM_OK);
|
|
}
|
|
|
|
FINLINE FLMUINT64 FLMAPI getCurrPosition( void)
|
|
{
|
|
if( !m_pIStream)
|
|
{
|
|
f_assert( 0);
|
|
return( 0);
|
|
}
|
|
|
|
return( m_uiBufferOffset);
|
|
}
|
|
|
|
private:
|
|
|
|
IF_IStream * m_pIStream;
|
|
FLMBYTE * m_pucBuffer;
|
|
FLMUINT m_uiBufferSize;
|
|
FLMUINT m_uiBufferOffset;
|
|
FLMUINT m_uiBytesAvail;
|
|
};
|
|
|
|
/****************************************************************************
|
|
Desc:
|
|
****************************************************************************/
|
|
class FLMEXP F_BufferedOStream : public IF_OStream
|
|
{
|
|
public:
|
|
|
|
F_BufferedOStream()
|
|
{
|
|
m_pOStream = NULL;
|
|
m_pucBuffer = NULL;
|
|
}
|
|
|
|
virtual ~F_BufferedOStream()
|
|
{
|
|
closeStream();
|
|
}
|
|
|
|
RCODE FLMAPI openStream(
|
|
IF_OStream * pOStream,
|
|
FLMUINT uiBufferSize);
|
|
|
|
RCODE FLMAPI write(
|
|
const void * pvBuffer,
|
|
FLMUINT uiBytesToWrite,
|
|
FLMUINT * puiBytesWritten);
|
|
|
|
RCODE FLMAPI closeStream( void);
|
|
|
|
RCODE FLMAPI flush( void);
|
|
|
|
private:
|
|
|
|
IF_OStream * m_pOStream;
|
|
FLMBYTE * m_pucBuffer;
|
|
FLMUINT m_uiBufferSize;
|
|
FLMUINT m_uiBufferOffset;
|
|
};
|
|
|
|
/****************************************************************************
|
|
Desc:
|
|
****************************************************************************/
|
|
class FLMEXP F_FileOStream : public IF_OStream
|
|
{
|
|
public:
|
|
|
|
F_FileOStream()
|
|
{
|
|
m_pFileHdl = NULL;
|
|
}
|
|
|
|
virtual ~F_FileOStream()
|
|
{
|
|
closeStream();
|
|
}
|
|
|
|
RCODE FLMAPI openStream(
|
|
const char * pszFilePath,
|
|
FLMBOOL bTruncateIfExists);
|
|
|
|
RCODE FLMAPI write(
|
|
const void * pvBuffer,
|
|
FLMUINT uiBytesToWrite,
|
|
FLMUINT * puiBytesWritten);
|
|
|
|
RCODE FLMAPI closeStream( void);
|
|
|
|
private:
|
|
|
|
IF_FileHdl * m_pFileHdl;
|
|
FLMUINT64 m_ui64FileOffset;
|
|
};
|
|
|
|
/****************************************************************************
|
|
Desc:
|
|
****************************************************************************/
|
|
class FLMEXP F_MultiFileIStream : public IF_IStream
|
|
{
|
|
public:
|
|
|
|
F_MultiFileIStream()
|
|
{
|
|
m_pIStream = NULL;
|
|
m_bOpen = FALSE;
|
|
}
|
|
|
|
virtual ~F_MultiFileIStream()
|
|
{
|
|
closeStream();
|
|
}
|
|
|
|
RCODE FLMAPI openStream(
|
|
const char * pszDirectory,
|
|
const char * pszBaseName);
|
|
|
|
RCODE FLMAPI read(
|
|
void * pvBuffer,
|
|
FLMUINT uiBytesToRead,
|
|
FLMUINT * puiBytesRead);
|
|
|
|
RCODE FLMAPI closeStream( void);
|
|
|
|
private:
|
|
|
|
RCODE rollToNextFile( void);
|
|
|
|
IF_IStream * m_pIStream;
|
|
FLMBOOL m_bOpen;
|
|
FLMBOOL m_bEndOfStream;
|
|
FLMUINT m_uiFileNum;
|
|
FLMUINT64 m_ui64FileOffset;
|
|
char m_szDirectory[ F_PATH_MAX_SIZE + 1];
|
|
char m_szBaseName[ F_PATH_MAX_SIZE + 1];
|
|
};
|
|
|
|
/****************************************************************************
|
|
Desc:
|
|
****************************************************************************/
|
|
class FLMEXP F_MultiFileOStream : public IF_OStream
|
|
{
|
|
public:
|
|
|
|
F_MultiFileOStream()
|
|
{
|
|
m_pOStream = NULL;
|
|
m_bOpen = FALSE;
|
|
}
|
|
|
|
virtual ~F_MultiFileOStream()
|
|
{
|
|
closeStream();
|
|
}
|
|
|
|
RCODE createStream(
|
|
const char * pszDirectory,
|
|
const char * pszBaseName,
|
|
FLMUINT uiMaxFileSize,
|
|
FLMBOOL bOkToOverwrite);
|
|
|
|
RCODE FLMAPI write(
|
|
const void * pvBuffer,
|
|
FLMUINT uiBytesToWrite,
|
|
FLMUINT * puiBytesWritten);
|
|
|
|
RCODE FLMAPI closeStream( void);
|
|
|
|
RCODE processDirectory(
|
|
const char * pszDirectory,
|
|
const char * pszBaseName,
|
|
FLMBOOL bOkToDelete);
|
|
|
|
private:
|
|
|
|
RCODE rollToNextFile( void);
|
|
|
|
IF_OStream * m_pOStream;
|
|
FLMBOOL m_bOpen;
|
|
FLMUINT m_uiFileNum;
|
|
FLMUINT64 m_ui64MaxFileSize;
|
|
FLMUINT64 m_ui64FileOffset;
|
|
char m_szDirectory[ F_PATH_MAX_SIZE + 1];
|
|
char m_szBaseName[ F_PATH_MAX_SIZE + 1];
|
|
};
|
|
|
|
/****************************************************************************
|
|
Desc:
|
|
****************************************************************************/
|
|
class FLMEXP F_CollIStream : public IF_CollIStream
|
|
{
|
|
public:
|
|
|
|
F_CollIStream()
|
|
{
|
|
m_pIStream = NULL;
|
|
m_uiLanguage = 0;
|
|
m_bMayHaveWildCards = FALSE;
|
|
m_bUnicodeStream = FALSE;
|
|
m_uNextChar = 0;
|
|
}
|
|
|
|
virtual ~F_CollIStream()
|
|
{
|
|
if( m_pIStream)
|
|
{
|
|
m_pIStream->Release();
|
|
}
|
|
}
|
|
|
|
RCODE FLMAPI openStream(
|
|
IF_PosIStream * pIStream,
|
|
FLMBOOL bUnicodeStream,
|
|
FLMUINT uiLanguage,
|
|
FLMUINT uiCompareRules,
|
|
FLMBOOL bMayHaveWildCards)
|
|
{
|
|
if( m_pIStream)
|
|
{
|
|
m_pIStream->Release();
|
|
}
|
|
|
|
m_pIStream = pIStream;
|
|
m_pIStream->AddRef();
|
|
m_uiLanguage = uiLanguage;
|
|
m_uiCompareRules = uiCompareRules;
|
|
m_bCaseSensitive = (uiCompareRules & FLM_COMP_CASE_INSENSITIVE)
|
|
? FALSE
|
|
: TRUE;
|
|
m_bMayHaveWildCards = bMayHaveWildCards;
|
|
m_bUnicodeStream = bUnicodeStream;
|
|
m_ui64EndOfLeadingSpacesPos = 0;
|
|
return( NE_FLM_OK);
|
|
}
|
|
|
|
RCODE FLMAPI closeStream( void)
|
|
{
|
|
if( m_pIStream)
|
|
{
|
|
m_pIStream->Release();
|
|
m_pIStream = NULL;
|
|
}
|
|
|
|
return( NE_FLM_OK);
|
|
}
|
|
|
|
RCODE FLMAPI read(
|
|
void * pvBuffer,
|
|
FLMUINT uiBytesToRead,
|
|
FLMUINT * puiBytesRead)
|
|
{
|
|
RCODE rc = NE_FLM_OK;
|
|
|
|
if( RC_BAD( rc = m_pIStream->read( pvBuffer,
|
|
uiBytesToRead, puiBytesRead)))
|
|
{
|
|
goto Exit;
|
|
}
|
|
|
|
Exit:
|
|
|
|
return( rc);
|
|
}
|
|
|
|
RCODE FLMAPI read(
|
|
FLMBOOL bAllowTwoIntoOne,
|
|
FLMUNICODE * puChar,
|
|
FLMBOOL * pbCharIsWild,
|
|
FLMUINT16 * pui16Col,
|
|
FLMUINT16 * pui16SubCol,
|
|
FLMBYTE * pucCase);
|
|
|
|
FINLINE FLMUINT64 FLMAPI totalSize( void)
|
|
{
|
|
if( m_pIStream)
|
|
{
|
|
return( m_pIStream->totalSize());
|
|
}
|
|
|
|
return( 0);
|
|
}
|
|
|
|
FINLINE FLMUINT64 FLMAPI remainingSize( void)
|
|
{
|
|
if( m_pIStream)
|
|
{
|
|
return( m_pIStream->remainingSize());
|
|
}
|
|
|
|
return( 0);
|
|
}
|
|
|
|
FINLINE RCODE FLMAPI positionTo(
|
|
FLMUINT64)
|
|
{
|
|
return( RC_SET_AND_ASSERT( NE_FLM_NOT_IMPLEMENTED));
|
|
}
|
|
|
|
FINLINE RCODE FLMAPI positionTo(
|
|
F_CollStreamPos * pPos)
|
|
{
|
|
|
|
// Should never be able to position back to before the
|
|
// leading spaces.
|
|
|
|
m_uNextChar = pPos->uNextChar;
|
|
flmAssert( pPos->ui64Position >= m_ui64EndOfLeadingSpacesPos);
|
|
return( m_pIStream->positionTo( pPos->ui64Position));
|
|
}
|
|
|
|
FINLINE FLMUINT64 FLMAPI getCurrPosition( void)
|
|
{
|
|
flmAssert( 0);
|
|
return( 0);
|
|
}
|
|
|
|
void FLMAPI getCurrPosition(
|
|
F_CollStreamPos * pPos);
|
|
|
|
private:
|
|
|
|
FINLINE RCODE readCharFromStream(
|
|
FLMUNICODE * puChar)
|
|
{
|
|
RCODE rc = NE_FLM_OK;
|
|
|
|
if( m_bUnicodeStream)
|
|
{
|
|
if( RC_BAD( rc = m_pIStream->read( puChar, sizeof( FLMUNICODE), NULL)))
|
|
{
|
|
goto Exit;
|
|
}
|
|
}
|
|
else
|
|
{
|
|
if( RC_BAD( rc = f_readUTF8CharAsUnicode(
|
|
m_pIStream, puChar)))
|
|
{
|
|
goto Exit;
|
|
}
|
|
}
|
|
|
|
Exit:
|
|
|
|
return( rc);
|
|
}
|
|
|
|
IF_PosIStream * m_pIStream;
|
|
FLMUINT m_uiLanguage;
|
|
FLMBOOL m_bCaseSensitive;
|
|
FLMUINT m_uiCompareRules;
|
|
FLMUINT64 m_ui64EndOfLeadingSpacesPos;
|
|
FLMBOOL m_bMayHaveWildCards;
|
|
FLMBOOL m_bUnicodeStream;
|
|
FLMUNICODE m_uNextChar;
|
|
};
|
|
|
|
/****************************************************************************
|
|
Desc: Decodes an ASCII base64 stream to binary
|
|
****************************************************************************/
|
|
class FLMEXP F_Base64DecoderIStream : public IF_IStream
|
|
{
|
|
public:
|
|
|
|
F_Base64DecoderIStream()
|
|
{
|
|
m_pIStream = NULL;
|
|
m_uiBufOffset = 0;
|
|
m_uiAvailBytes = 0;
|
|
}
|
|
|
|
virtual ~F_Base64DecoderIStream()
|
|
{
|
|
closeStream();
|
|
}
|
|
|
|
RCODE FLMAPI openStream(
|
|
IF_IStream * pIStream);
|
|
|
|
RCODE FLMAPI read(
|
|
void * pvBuffer,
|
|
FLMUINT uiBytesToRead,
|
|
FLMUINT * puiBytesRead);
|
|
|
|
FINLINE RCODE FLMAPI closeStream( void)
|
|
{
|
|
RCODE rc = NE_FLM_OK;
|
|
|
|
if( m_pIStream)
|
|
{
|
|
if( m_pIStream->getRefCount() == 1)
|
|
{
|
|
rc = m_pIStream->closeStream();
|
|
}
|
|
|
|
m_pIStream->Release();
|
|
m_pIStream = NULL;
|
|
}
|
|
|
|
m_uiAvailBytes = 0;
|
|
m_uiBufOffset = 0;
|
|
|
|
return( rc);
|
|
}
|
|
|
|
private:
|
|
|
|
IF_IStream * m_pIStream;
|
|
FLMUINT m_uiBufOffset;
|
|
FLMUINT m_uiAvailBytes;
|
|
FLMBYTE m_ucBuffer[ 8];
|
|
};
|
|
|
|
/****************************************************************************
|
|
Desc: Encodes a binary input stream into ASCII base64.
|
|
****************************************************************************/
|
|
class FLMEXP F_Base64EncoderIStream : public IF_IStream
|
|
{
|
|
public:
|
|
|
|
F_Base64EncoderIStream()
|
|
{
|
|
m_pIStream = NULL;
|
|
}
|
|
|
|
virtual ~F_Base64EncoderIStream()
|
|
{
|
|
closeStream();
|
|
}
|
|
|
|
RCODE FLMAPI openStream(
|
|
IF_IStream * pIStream,
|
|
FLMBOOL bLineBreaks);
|
|
|
|
RCODE FLMAPI read(
|
|
void * pvBuffer,
|
|
FLMUINT uiBytesToRead,
|
|
FLMUINT * puiBytesRead);
|
|
|
|
FINLINE RCODE FLMAPI closeStream( void)
|
|
{
|
|
RCODE rc = NE_FLM_OK;
|
|
|
|
if( m_pIStream)
|
|
{
|
|
if( m_pIStream->getRefCount() == 1)
|
|
{
|
|
rc = m_pIStream->closeStream();
|
|
}
|
|
|
|
m_pIStream->Release();
|
|
m_pIStream = NULL;
|
|
}
|
|
|
|
return( rc);
|
|
}
|
|
|
|
private:
|
|
|
|
IF_IStream * m_pIStream;
|
|
FLMBOOL m_bInputExhausted;
|
|
FLMBOOL m_bLineBreaks;
|
|
FLMBOOL m_bPriorLineEnd;
|
|
FLMUINT m_uiBase64Count;
|
|
FLMUINT m_uiBufOffset;
|
|
FLMUINT m_uiAvailBytes;
|
|
FLMBYTE m_ucBuffer[ 8];
|
|
};
|
|
|
|
/****************************************************************************
|
|
Desc:
|
|
****************************************************************************/
|
|
typedef struct LZWODictItem
|
|
{
|
|
LZWODictItem * pNext;
|
|
FLMUINT16 ui16Code;
|
|
FLMUINT16 ui16ParentCode;
|
|
FLMBYTE ucChar;
|
|
} LZWODictItem;
|
|
|
|
/****************************************************************************
|
|
Desc:
|
|
****************************************************************************/
|
|
class FLMEXP F_CompressingOStream : public IF_OStream
|
|
{
|
|
public:
|
|
|
|
F_CompressingOStream()
|
|
{
|
|
m_pool.poolInit( 64 * 1024);
|
|
m_pOStream = NULL;
|
|
m_ppHashTbl = NULL;
|
|
}
|
|
|
|
virtual ~F_CompressingOStream()
|
|
{
|
|
closeStream();
|
|
}
|
|
|
|
RCODE FLMAPI openStream(
|
|
IF_OStream * pOStream);
|
|
|
|
RCODE FLMAPI write(
|
|
const void * pvBuffer,
|
|
FLMUINT uiBytesToWrite,
|
|
FLMUINT * puiBytesWritten);
|
|
|
|
RCODE FLMAPI closeStream( void);
|
|
|
|
private:
|
|
|
|
FINLINE FLMUINT getHashBucket(
|
|
FLMUINT16 ui16CurrentCode,
|
|
FLMBYTE ucChar)
|
|
{
|
|
return( ((((FLMUINT)ui16CurrentCode) << 8) |
|
|
((FLMUINT)ucChar)) % m_uiHashTblSize);
|
|
}
|
|
|
|
LZWODictItem * findDictEntry(
|
|
FLMUINT16 ui16CurrentCode,
|
|
FLMBYTE ucChar);
|
|
|
|
F_Pool m_pool;
|
|
IF_OStream * m_pOStream;
|
|
LZWODictItem ** m_ppHashTbl;
|
|
FLMUINT m_uiHashTblSize;
|
|
FLMUINT m_uiLastRatio;
|
|
FLMUINT m_uiBestRatio;
|
|
FLMUINT m_uiCurrentBytesIn;
|
|
FLMUINT m_uiTotalBytesIn;
|
|
FLMUINT m_uiCurrentBytesOut;
|
|
FLMUINT m_uiTotalBytesOut;
|
|
FLMBOOL m_bStopCompression;
|
|
FLMUINT16 m_ui16CurrentCode;
|
|
FLMUINT16 m_ui16FreeCode;
|
|
};
|
|
|
|
typedef struct LZWIDictItem
|
|
{
|
|
LZWODictItem * pNext;
|
|
FLMUINT16 ui16ParentCode;
|
|
FLMBYTE ucChar;
|
|
} LZWIDictItem;
|
|
|
|
/****************************************************************************
|
|
Desc:
|
|
****************************************************************************/
|
|
class FLMEXP F_UncompressingIStream : public IF_IStream
|
|
{
|
|
public:
|
|
|
|
F_UncompressingIStream()
|
|
{
|
|
m_pIStream = NULL;
|
|
m_pDict = NULL;
|
|
m_pucDecodeBuffer = NULL;
|
|
}
|
|
|
|
virtual ~F_UncompressingIStream()
|
|
{
|
|
closeStream();
|
|
}
|
|
|
|
RCODE FLMAPI openStream(
|
|
IF_IStream * pIStream);
|
|
|
|
RCODE FLMAPI read(
|
|
void * pvBuffer,
|
|
FLMUINT uiBytesToRead,
|
|
FLMUINT * puiBytesRead);
|
|
|
|
RCODE FLMAPI closeStream( void);
|
|
|
|
private:
|
|
|
|
RCODE readCode(
|
|
FLMUINT16 * pui16Code);
|
|
|
|
RCODE decodeToBuffer(
|
|
FLMUINT16 ui16Code);
|
|
|
|
IF_IStream * m_pIStream;
|
|
LZWIDictItem * m_pDict;
|
|
FLMBYTE * m_pucDecodeBuffer;
|
|
FLMUINT m_uiDecodeBufferSize;
|
|
FLMUINT m_uiDecodeBufferOffset;
|
|
FLMUINT16 m_ui16FreeCode;
|
|
FLMUINT16 m_ui16LastCode;
|
|
FLMBOOL m_bStopCompression;
|
|
FLMBOOL m_bEndOfStream;
|
|
};
|
|
|
|
/***************************************************************************
|
|
Desc: Dynamic result sets
|
|
***************************************************************************/
|
|
|
|
typedef int (* F_DYNSET_COMPARE_FUNC)(
|
|
void * pvData1,
|
|
void * pvData2,
|
|
void * pvUserData);
|
|
|
|
typedef enum
|
|
{
|
|
ACCESS_HASH,
|
|
ACCESS_BTREE_LEAF,
|
|
ACCESS_BTREE_ROOT,
|
|
ACCESS_BTREE_NON_LEAF
|
|
} eDynRSetBlkTypes;
|
|
|
|
class F_FixedBlk : public F_Object
|
|
{
|
|
public:
|
|
|
|
F_FixedBlk();
|
|
|
|
virtual ~F_FixedBlk()
|
|
{
|
|
}
|
|
|
|
eDynRSetBlkTypes blkType()
|
|
{
|
|
return m_eBlkType;
|
|
}
|
|
|
|
virtual RCODE getCurrent(
|
|
void * pvEntryBuffer) = 0;
|
|
|
|
virtual RCODE getFirst(
|
|
void * pvEntryBuffer) = 0;
|
|
|
|
virtual RCODE getLast(
|
|
void * pvEntryBuffer) = 0;
|
|
|
|
virtual RCODE getNext(
|
|
void * pvEntryBuffer) = 0;
|
|
|
|
virtual FLMUINT getTotalEntries() = 0;
|
|
|
|
virtual RCODE insert(
|
|
void * pvEntry) = 0;
|
|
|
|
FINLINE FLMBOOL isDirty( void)
|
|
{
|
|
return( m_bDirty);
|
|
}
|
|
|
|
virtual RCODE search(
|
|
void * pvEntry,
|
|
void * pvFoundEntry = NULL) = 0;
|
|
|
|
void setCompareFunc(
|
|
F_DYNSET_COMPARE_FUNC fnCompare,
|
|
void * pvUserData)
|
|
{
|
|
m_fnCompare = fnCompare;
|
|
m_pvUserData = pvUserData;
|
|
}
|
|
|
|
protected:
|
|
|
|
F_DYNSET_COMPARE_FUNC m_fnCompare;
|
|
void * m_pvUserData;
|
|
eDynRSetBlkTypes m_eBlkType;
|
|
FLMUINT m_uiEntrySize;
|
|
FLMUINT m_uiNumSlots;
|
|
FLMUINT m_uiPosition;
|
|
FLMBOOL m_bDirty;
|
|
FLMBYTE * m_pucBlkBuf;
|
|
};
|
|
|
|
class FLMEXP F_DynSearchSet : public F_Object
|
|
{
|
|
|
|
public:
|
|
|
|
F_DynSearchSet()
|
|
{
|
|
m_fnCompare = NULL;
|
|
m_pvUserData = NULL;
|
|
m_uiEntrySize = 0;
|
|
m_pAccess = NULL;
|
|
}
|
|
|
|
virtual ~F_DynSearchSet()
|
|
{
|
|
if( m_pAccess)
|
|
{
|
|
m_pAccess->Release();
|
|
}
|
|
}
|
|
|
|
RCODE FLMAPI setup(
|
|
char * pszTmpDir,
|
|
FLMUINT uiEntrySize);
|
|
|
|
FINLINE void FLMAPI setCompareFunc(
|
|
F_DYNSET_COMPARE_FUNC fnCompare,
|
|
void * pvUserData)
|
|
{
|
|
m_fnCompare = fnCompare;
|
|
m_pvUserData = pvUserData;
|
|
m_pAccess->setCompareFunc( fnCompare, pvUserData);
|
|
}
|
|
|
|
RCODE FLMAPI addEntry(
|
|
void * pvEntry);
|
|
|
|
FINLINE RCODE FLMAPI findMatch(
|
|
void * pvMatchEntry,
|
|
void * pvFoundEntry)
|
|
{
|
|
return m_pAccess->search( pvMatchEntry, pvFoundEntry);
|
|
}
|
|
|
|
FINLINE FLMUINT FLMAPI getEntrySize( void)
|
|
{
|
|
return m_uiEntrySize;
|
|
}
|
|
|
|
FINLINE FLMUINT FLMAPI getTotalEntries( void)
|
|
{
|
|
return( m_pAccess->getTotalEntries());
|
|
}
|
|
|
|
private:
|
|
|
|
F_DYNSET_COMPARE_FUNC m_fnCompare;
|
|
void * m_pvUserData;
|
|
FLMUINT m_uiEntrySize;
|
|
F_FixedBlk * m_pAccess;
|
|
char m_szFileName[ F_PATH_MAX_SIZE];
|
|
};
|
|
|
|
/***************************************************************************
|
|
Desc: Hash tables
|
|
***************************************************************************/
|
|
|
|
typedef struct
|
|
{
|
|
void * pFirstInBucket;
|
|
FLMUINT uiHashValue;
|
|
} F_BUCKET;
|
|
|
|
RCODE FLMAPI f_allocHashTable(
|
|
FLMUINT uiHashTblSize,
|
|
F_BUCKET ** ppHashTblRV);
|
|
|
|
FLMUINT FLMAPI f_strHashBucket(
|
|
char * pszStr,
|
|
F_BUCKET * pHashTbl,
|
|
FLMUINT uiNumBuckets);
|
|
|
|
FLMUINT FLMAPI f_binHashBucket(
|
|
void * pBuf,
|
|
FLMUINT uiBufLen,
|
|
F_BUCKET * pHashTbl,
|
|
FLMUINT uiNumBuckets);
|
|
|
|
/***************************************************************************
|
|
Desc:
|
|
***************************************************************************/
|
|
class F_HashObject : virtual public F_Object
|
|
{
|
|
public:
|
|
|
|
#define F_INVALID_HASH_BUCKET (~((FLMUINT)0))
|
|
|
|
F_HashObject()
|
|
{
|
|
m_pNextInBucket = NULL;
|
|
m_pPrevInBucket = NULL;
|
|
m_pNextInGlobal = NULL;
|
|
m_pPrevInGlobal = NULL;
|
|
m_uiHashBucket = F_INVALID_HASH_BUCKET;
|
|
m_ui32KeyCRC = 0;
|
|
m_uiTimeAdded = 0;
|
|
}
|
|
|
|
virtual ~F_HashObject()
|
|
{
|
|
flmAssert( !m_pNextInBucket);
|
|
flmAssert( !m_pPrevInBucket);
|
|
flmAssert( !m_pNextInGlobal);
|
|
flmAssert( !m_pPrevInGlobal);
|
|
flmAssert( !getRefCount());
|
|
}
|
|
|
|
virtual const void * FLMAPI getKey( void) = 0;
|
|
|
|
virtual FLMUINT FLMAPI getKeyLength( void) = 0;
|
|
|
|
FINLINE FLMUINT FLMAPI getKeyCRC( void)
|
|
{
|
|
return( m_ui32KeyCRC);
|
|
}
|
|
|
|
FINLINE FLMUINT FLMAPI getHashBucket( void)
|
|
{
|
|
return( m_uiHashBucket);
|
|
}
|
|
|
|
FINLINE F_HashObject * FLMAPI getNextInGlobal( void)
|
|
{
|
|
return( m_pNextInGlobal);
|
|
}
|
|
|
|
FINLINE F_HashObject * FLMAPI getNextInBucket( void)
|
|
{
|
|
return( m_pNextInBucket);
|
|
}
|
|
|
|
virtual FLMUINT FLMAPI getObjectType( void) = 0;
|
|
|
|
protected:
|
|
|
|
void setHashBucket(
|
|
FLMUINT uiHashBucket)
|
|
{
|
|
m_uiHashBucket = uiHashBucket;
|
|
}
|
|
|
|
F_HashObject * m_pNextInBucket;
|
|
F_HashObject * m_pPrevInBucket;
|
|
F_HashObject * m_pNextInGlobal;
|
|
F_HashObject * m_pPrevInGlobal;
|
|
FLMUINT m_uiHashBucket;
|
|
FLMUINT m_uiTimeAdded;
|
|
FLMUINT32 m_ui32KeyCRC;
|
|
|
|
friend class F_HashTable;
|
|
};
|
|
|
|
/***************************************************************************
|
|
Desc: Hash tables
|
|
***************************************************************************/
|
|
class F_HashTable : public F_Object
|
|
{
|
|
public:
|
|
|
|
F_HashTable();
|
|
|
|
virtual ~F_HashTable();
|
|
|
|
RCODE FLMAPI setupHashTable(
|
|
FLMBOOL bMultithreaded,
|
|
FLMUINT uiNumBuckets,
|
|
FLMUINT uiMaxObjects);
|
|
|
|
RCODE FLMAPI addObject(
|
|
F_HashObject * pObject,
|
|
FLMBOOL bAllowDuplicates = FALSE);
|
|
|
|
RCODE FLMAPI getNextObjectInGlobal(
|
|
F_HashObject ** ppObject);
|
|
|
|
RCODE FLMAPI getNextObjectInBucket(
|
|
F_HashObject ** ppObject);
|
|
|
|
RCODE FLMAPI getObject(
|
|
const void * pvKey,
|
|
FLMUINT uiKeyLen,
|
|
F_HashObject ** ppObject,
|
|
FLMBOOL bRemove = FALSE);
|
|
|
|
RCODE FLMAPI removeObject(
|
|
void * pvKey,
|
|
FLMUINT uiKeyLen);
|
|
|
|
RCODE FLMAPI removeObject(
|
|
F_HashObject * pObject);
|
|
|
|
void FLMAPI removeAllObjects( void);
|
|
|
|
void FLMAPI removeAgedObjects(
|
|
FLMUINT uiMaxAge);
|
|
|
|
FLMUINT FLMAPI getMaxObjects( void);
|
|
|
|
RCODE FLMAPI setMaxObjects(
|
|
FLMUINT uiMaxObjects);
|
|
|
|
private:
|
|
|
|
FLMUINT getHashBucket(
|
|
const void * pvKey,
|
|
FLMUINT uiLen,
|
|
FLMUINT32 * pui32KeyCRC = NULL);
|
|
|
|
void linkObject(
|
|
F_HashObject * pObject,
|
|
FLMUINT uiBucket);
|
|
|
|
void unlinkObject(
|
|
F_HashObject * pObject);
|
|
|
|
RCODE findObject(
|
|
const void * pvKey,
|
|
FLMUINT uiKeyLen,
|
|
F_HashObject ** ppObject);
|
|
|
|
F_MUTEX m_hMutex;
|
|
F_HashObject * m_pMRUObject;
|
|
F_HashObject * m_pLRUObject;
|
|
F_HashObject ** m_ppHashTable;
|
|
FLMUINT m_uiBuckets;
|
|
FLMUINT m_uiObjects;
|
|
FLMUINT m_uiMaxObjects;
|
|
};
|
|
|
|
/****************************************************************************
|
|
Desc: Process ID Functions
|
|
****************************************************************************/
|
|
|
|
FLMUINT f_getpid( void);
|
|
|
|
#endif // FTK_H
|