flaim.h   flaim.h 
skipping to change at line 152 skipping to change at line 152
#define FERR_BAD_HDL 0xC00D ///< 0xC00D - Request contained bad db handle. #define FERR_BAD_HDL 0xC00D ///< 0xC00D - Request contained bad db handle.
#define FERR_BAD_IX 0xC00E ///< 0xC00E - Invalid index number. #define FERR_BAD_IX 0xC00E ///< 0xC00E - Invalid index number.
#define FERR_BACKUP_ACTIVE 0xC0 0F ///< 0x C00F - Operation could not be completed - a backup is being performed. #define FERR_BACKUP_ACTIVE 0xC0 0F ///< 0x C00F - Operation could not be completed - a backup is being performed.
#define FERR_SERIAL_NUM_MISMATCH 0xC010 ///< 0xC010 - C omparison of serial numbers failed. #define FERR_SERIAL_NUM_MISMATCH 0xC010 ///< 0xC010 - C omparison of serial numbers failed.
#define FERR_BAD_RFL_DB_SERIAL_NUM 0xC011 ///< 0xC011 - Bad datab ase serial number in RFL file header. #define FERR_BAD_RFL_DB_SERIAL_NUM 0xC011 ///< 0xC011 - Bad datab ase serial number in RFL file header.
#define FERR_BTREE_ERROR NE_F LM_BTREE_ERROR ///< 0xC012 - A corrupt ion was found in an index or container b-tree. #define FERR_BTREE_ERROR NE_F LM_BTREE_ERROR ///< 0xC012 - A corrupt ion was found in an index or container b-tree.
#define FERR_BTREE_FULL NE_F LM_BTREE_FULL ///< 0xC013 - A n index or container b-tree is full. #define FERR_BTREE_FULL NE_F LM_BTREE_FULL ///< 0xC013 - A n index or container b-tree is full.
#define FERR_BAD_RFL_FILE_NUMBER 0xC014 ///< 0xC014 - B ad RFL file number in RFL file header. #define FERR_BAD_RFL_FILE_NUMBER 0xC014 ///< 0xC014 - B ad RFL file number in RFL file header.
#define FERR_CANNOT_DEL_ITEM 0xC015 ///< 0xC015 - C annot delete field definitions. #define FERR_CANNOT_DEL_ITEM 0xC015 ///< 0xC015 - C annot delete field definitions.
#define FERR_CANNOT_MOD_FIELD_TYPE 0xC016 ///< 0xC016 - Cannot mo dify a field's type. #define FERR_CANNOT_MOD_FIELD_TYPE 0xC016 ///< 0xC016 - Cannot mo dify a field's type.
#define FERR_NOT_USED_C017 0xC0 17 ///< 0x C017 - Not used #define FERR_64BIT_NUMS_NOT_SUPPORTED 0xC017 ///< 0xC017 - 64 bit numbers no t supported for databases whose revision is less than 462
#define FERR_CONV_BAD_DEST_TYPE 0xC018 ///< 0xC018 - Bad desti nation type specified for conversion. #define FERR_CONV_BAD_DEST_TYPE 0xC018 ///< 0xC018 - Bad desti nation type specified for conversion.
#define FERR_CONV_BAD_DIGIT 0xC019 ///< 0xC019 - N on-numeric digit found in text to numeric conversion. #define FERR_CONV_BAD_DIGIT 0xC019 ///< 0xC019 - N on-numeric digit found in text to numeric conversion.
#define FERR_CONV_BAD_SRC_TYPE 0xC01A ///< 0xC01A - Bad sourc e type specified for conversion. #define FERR_CONV_BAD_SRC_TYPE 0xC01A ///< 0xC01A - Bad sourc e type specified for conversion.
#define FERR_RFL_FILE_NOT_FOUND 0xC01B ///< 0xC01B - Could not open an RFL file. #define FERR_RFL_FILE_NOT_FOUND 0xC01B ///< 0xC01B - Could not open an RFL file.
#define FERR_CONV_DEST_OVERFLOW NE_FLM_CONV_DEST_OVE RFLOW ///< 0xC01C - Destination buffer not large enou gh to hold converted data. #define FERR_CONV_DEST_OVERFLOW NE_FLM_CONV_DEST_OVE RFLOW ///< 0xC01C - Destination buffer not large enou gh to hold converted data.
#define FERR_CONV_ILLEGAL NE_F LM_CONV_ILLEGAL ///< 0xC01D - Illegal c onversion -- not supported. #define FERR_CONV_ILLEGAL NE_F LM_CONV_ILLEGAL ///< 0xC01D - Illegal c onversion -- not supported.
#define FERR_CONV_NULL_SRC 0xC0 1E ///< 0x C01E - Source cannot be a NULL pointer in conversion. #define FERR_CONV_NULL_SRC 0xC0 1E ///< 0x C01E - Source cannot be a NULL pointer in conversion.
#define FERR_CONV_NULL_DEST 0xC01F ///< 0xC01F - D estination cannot be a NULL pointer in conversion. #define FERR_CONV_NULL_DEST 0xC01F ///< 0xC01F - D estination cannot be a NULL pointer in conversion.
#define FERR_CONV_NUM_OVERFLOW NE_FLM_CONV_NUM_OVER FLOW ///< 0xC020 - Numeric overflow (GT upper bound) converting to numeric type. #define FERR_CONV_NUM_OVERFLOW NE_FLM_CONV_NUM_OVER FLOW ///< 0xC020 - Numeric overflow (GT upper bound) converting to numeric type.
#define FERR_CONV_NUM_UNDERFLOW 0xC021 ///< 0xC021 - Numeric u nderflow (LT lower bound) converting to numeric type. #define FERR_CONV_NUM_UNDERFLOW 0xC021 ///< 0xC021 - Numeric u nderflow (LT lower bound) converting to numeric type.
skipping to change at line 420 skipping to change at line 420
#define FLM_FILE_FORMAT_VER_3_02 302 #define FLM_FILE_FORMAT_VER_3_02 302
#define FLM_FILE_FORMAT_VER_3_10 310 #define FLM_FILE_FORMAT_VER_3_10 310
#define FLM_FILE_FORMAT_VER_4_0 400 #define FLM_FILE_FORMAT_VER_4_0 400
#define FLM_FILE_FORMAT_VER_4_3 430 #define FLM_FILE_FORMAT_VER_4_3 430
#define FLM_FILE_FORMAT_VER_4_31 431 // Added last committed trans ID to the log header #define FLM_FILE_FORMAT_VER_4_31 431 // Added last committed trans ID to the log header
#define FLM_FILE_FORMAT_VER_4_50 450 // Added ability to create cross-container indexes. #define FLM_FILE_FORMAT_VER_4_50 450 // Added ability to create cross-container indexes.
#define FLM_FILE_FORMAT_VER_4_51 451 // Added ability to permanently suspend indexes #define FLM_FILE_FORMAT_VER_4_51 451 // Added ability to permanently suspend indexes
#define FLM_FILE_FORMAT_VER_4_52 452 // Added ability to delete indexes in the background #define FLM_FILE_FORMAT_VER_4_52 452 // Added ability to delete indexes in the background
#define FLM_FILE_FORMAT_VER_4_60 460 // Added support for encrypted attributes #define FLM_FILE_FORMAT_VER_4_60 460 // Added support for encrypted attributes
#define FLM_FILE_FORMAT_VER_4_61 461 // Added support for RFL disk usage limits, large field values, and async I/O on Linux and Solaris #define FLM_FILE_FORMAT_VER_4_61 461 // Added support for RFL disk usage limits, large field values, and async I/O on Linux and Solaris
#define FLM_CUR_FILE_FORMAT_VER_NUM FLM_ #define FLM_FILE_FORMAT_VER_4_62
FILE_FORMAT_VER_4_61 462 // Added support for 64 bit numbers
#define FLM_CUR_FILE_FORMAT_VER_STR "4.6 #define FLM_CUR_FILE_FORMAT_VER_NUM FLM_
1" FILE_FORMAT_VER_4_62
#define FLM_CUR_FILE_FORMAT_VER_STR "4.6
2"
FLMUINT uiMinRflFileSize; ///< Minimum bytes per RFL file. FLMUINT uiMinRflFileSize; ///< Minimum bytes per RFL file.
#define DEFAULT_MIN_RFL_FILE_SIZE ((FLMUINT)100 * (FLMUINT)102 4 * (FLMUINT)1024) #define DEFAULT_MIN_RFL_FILE_SIZE ((FLMUINT)100 * (FLMUINT)102 4 * (FLMUINT)1024)
FLMUINT uiMaxRflFileSize; ///< Maximum bytes per RFL file. FLMUINT uiMaxRflFileSize; ///< Maximum bytes per RFL file.
#define DEFAULT_MAX_RFL_FILE_SIZE FLM_MAXIMUM_FILE_SIZE #define DEFAULT_MAX_RFL_FILE_SIZE FLM_MAXIMUM_FILE_SIZE
FLMBOOL bKeepRflFiles; ///< Keep RFL files? FLMBOOL bKeepRflFiles; ///< Keep RFL files?
#define DEFAULT_KEEP_RFL_FILES_FLAG FALSE #define DEFAULT_KEEP_RFL_FILES_FLAG FALSE
FLMBOOL bLogAbortedTransToRfl; ///< Log abo rted transactions to RFL? FLMBOOL bLogAbortedTransToRfl; ///< Log abo rted transactions to RFL?
#define DEFAULT_LOG_ABORTED_TRANS_FLAG FALSE #define DEFAULT_LOG_ABORTED_TRANS_FLAG FALSE
skipping to change at line 615 skipping to change at line 616
FLMUINT uiTagNum, FLMUINT uiTagNum,
FLMUINT * puiInsertPos = NULL); FLMUINT * puiInsertPos = NULL);
FLM_TAG_INFO * findTagByTypeAndName( FLM_TAG_INFO * findTagByTypeAndName(
const FLMUNICODE * puzTagName, const FLMUNICODE * puzTagName,
const char * pszTagName, const char * pszTagName,
FLMUINT uiType, FLMUINT uiType,
FLMUINT * puiInsertPos = NULL); FLMUINT * puiInsertPos = NULL);
RCODE insertTagInTables( RCODE insertTagInTables(
FLM_TAG_INFO * pTagInfo, FLM_TAG_INFO * pTagInfo,
FLMUINT uiTagNameTblInsertPos, FLMUINT uiTagNameTbl
FLMUINT uiTagTypeAndNameTblInsertPos InsertPos,
, FLMUINT uiTagTypeAnd
FLMUINT uiTagNumTblInsertPos); NameTblInsertPos,
FLMUINT uiTagNumTblI
nsertPos);
F_Pool m_pool; F_Pool m_pool;
FLM_TAG_INFO ** m_ppSortedByTagName; FLM_TAG_INFO ** m_ppSortedByTagName;
FLM_TAG_INFO ** m_ppSortedByTagNum; FLM_TAG_INFO ** m_ppSortedByTagNum;
FLM_TAG_INFO ** m_ppSortedByTagTypeAndName; FLM_TAG_INFO ** m_ppSortedByTagTypeAndName;
FLMUINT m_uiTblSize; FLMUINT m_uiTblSize;
FLMUINT m_uiNumTags; FLMUINT m_uiNumTags;
FLMBOOL m_bTablesSorted; FLMBOOL m_bTablesSor
ted;
}; };
#define RECID_UNDEFINED 0xFFFFFFFF #define RECID_UNDEFINED 0xFFFFFFFF
/// Structure returned from FlmIndexStatus() to report current statu s of an index. /// Structure returned from FlmIndexStatus() to report current statu s of an index.
typedef struct typedef struct
{ {
FLMUINT uiIndexNum; ///< Index number. FLMUINT uiIndexNum; ///< Index number.
FLMBOOL bSuspended; ///< If TRUE, index is suspended. FLMBOOL bSuspended; ///< If TRUE, index is suspended.
FLMUINT uiStartTime; ///< Time (GMT) that the background indexing thread started - if zero, no background thread is running. FLMUINT uiStartTime; ///< Time (GMT) that the background indexing thread started - if zero, no background thread is running.
skipping to change at line 1202 skipping to change at line 1203
NO_TYPE = 0, // 0 (internal use o nly) NO_TYPE = 0, // 0 (internal use o nly)
// WARNING: Don't renumber below _VAL enums without // WARNING: Don't renumber below _VAL enums without
// redoing gv_DoValAndDictTypesMatch table // redoing gv_DoValAndDictTypesMatch table
FLM_BOOL_VAL = 1, ///< 1 - Boolean val ue. FLM_BOOL_VAL = 1, ///< 1 - Boolean val ue.
FLM_UINT32_VAL, ///< 2 - 32 bit unsigned int eger value. FLM_UINT32_VAL, ///< 2 - 32 bit unsigned int eger value.
FLM_INT32_VAL, ///< 3 - 32 bit sign ed integer value. FLM_INT32_VAL, ///< 3 - 32 bit sign ed integer value.
FLM_REAL_VAL, ///< 4 - Real number value.\ NOTE: Not currently supported. FLM_REAL_VAL, ///< 4 - Real number value.\ NOTE: Not currently supported.
FLM_REC_PTR_VAL, ///< 5 - DRN value. FLM_REC_PTR_VAL, ///< 5 - DRN value.
FLM_UINT64_VAL, ///< 6 - 64 bit unsigned int
eger value.
FLM_INT64_VAL, ///< 7 - 64 bit sign
ed integer value.
FLM_BINARY_VAL = 9, ///< 9 - Binary value. FLM_BINARY_VAL = 9, ///< 9 - Binary value.
FLM_STRING_VAL, ///< 10 - ASCII string value . FLM_STRING_VAL, ///< 10 - ASCII string value .
FLM_UNICODE_VAL, ///< 11 - Unicode st ring value. FLM_UNICODE_VAL, ///< 11 - Unicode st ring value.
FLM_TEXT_VAL, ///< 12 - Internal F LAIM string value. FLM_TEXT_VAL, ///< 12 - Internal F LAIM string value.
// Enums for internal use // Enums for internal use
FIRST_VALUE = FLM_BOOL_VAL, FIRST_VALUE = FLM_BOOL_VAL,
LAST_VALUE = FLM_TEXT_VAL, LAST_VALUE = FLM_TEXT_VAL,
FLM_FLD_PATH = 25, // 25 FLM_FLD_PATH = 25, // 25
skipping to change at line 1760 skipping to change at line 1763
/// FlmGetConfig().\ Get whether dynamic cache limits are supported.\ \n /// FlmGetConfig().\ Get whether dynamic cache limits are supported.\ \n
/// Output: pvValue is (FLMBOOL *), TRUE if dynamic cache li mits are supported, FALSE if not. /// Output: pvValue is (FLMBOOL *), TRUE if dynamic cache li mits are supported, FALSE if not.
FLM_DYNA_CACHE_SUPPORTED, FLM_DYNA_CACHE_SUPPORTED,
/// FlmConfig().\ Set maximum query stratify iterations and query stratify time limit.\ \n /// FlmConfig().\ Set maximum query stratify iterations and query stratify time limit.\ \n
/// Input: pvValue1 is (FLMUINT), maximum query stratify ite rations.\ \n /// Input: pvValue1 is (FLMUINT), maximum query stratify ite rations.\ \n
/// Input: pvValue2 is (FLMUINT), query stratify time limit (seconds).\ \n /// Input: pvValue2 is (FLMUINT), query stratify time limit (seconds).\ \n
/// FlmGetConfig().\ Get maximum query stratify iterations .\ \n /// FlmGetConfig().\ Get maximum query stratify iterations .\ \n
/// Output: pvValue is (FLMUINT *), maximum query stratify i terations. /// Output: pvValue is (FLMUINT *), maximum query stratify i terations.
FLM_QUERY_STRATIFY_LIMITS FLM_QUERY_STRATIFY_LIMITS,
/// FlmConfig().\ Enable or disable direct I/O.\ \n
/// Input: pvValue1 is (FLMBOOL), TRUE = enable, FALSE = dis
able.\ \n
/// FlmGetConfig().\ Get direct I/O state.\ \n
/// Output: pvValue is (FLMBOOL *), TRUE = enabled, FALSE =
disabled.
FLM_DIRECT_IO_STATE
} eFlmConfigTypes; } eFlmConfigTypes;
// Defaults for certain settable items // Defaults for certain settable items
#define DEFAULT_MAX_CP_INTERVAL 180 #define DEFAULT_MAX_CP_INTERVAL 180
#define DEFAULT_MAX_TRANS_SECS 2400 #define DEFAULT_MAX_TRANS_SECS 2400
#define DEFAULT_MAX_TRANS_INACTIVE_SECS 30 #define DEFAULT_MAX_TRANS_INACTIVE_SECS 30
#define DEFAULT_CACHE_ADJUST_PERCENT 70 #define DEFAULT_CACHE_ADJUST_PERCENT 70
#define DEFAULT_CACHE_ADJUST_MIN (16 * 1024 * 1024) #define DEFAULT_CACHE_ADJUST_MIN (16 * 1024 * 1024)
#define DEFAULT_CACHE_ADJUST_MAX 0xE0 000000 #define DEFAULT_CACHE_ADJUST_MAX 0xE0 000000
#define DEFAULT_CACHE_ADJUST_MIN_TO_LEAVE 0 #define DEFAULT_CACHE_ADJUST_MIN_TO_LEAVE 0
#define DEFAULT_CACHE_ADJUST_INTERVAL 15 #define DEFAULT_CACHE_ADJUST_INTERVAL 15
#define DEFAULT_CACHE_CLEANUP_INTERVAL 15 #define DEFAULT_CACHE_CLEANUP_INTERVAL 15
#define DEFAULT_UNUSED_CLEANUP_INTERVAL 2 #define DEFAULT_UNUSED_CLEANUP_INTERVAL 2
#define DEFAULT_MAX_UNUSED_TIME 120 #define DEFAULT_MAX_UNUSED_TIME 120
#define DEFAULT_BLOCK_CACHE_PERCENTAGE 50 #define DEFAULT_BLOCK_CACHE_PERCENTAGE 50
#define DEFAULT_FILE_EXTEND_SIZE (819 2 * 1024) #define DEFAULT_FILE_EXTEND_SIZE (819 2 * 1024)
#define DEFAULT_RFL_FOOTPRINT_SIZE (100 * 1024
* 1024)
#define DEFAULT_RBL_FOOTPRINT_SIZE (100 * 1024
* 1024)
#define DEFAULT_MAX_STRATIFY_ITERATIONS 10000 #define DEFAULT_MAX_STRATIFY_ITERATIONS 10000
#define DEFAULT_MAX_STRATIFY_TIME 10 #define DEFAULT_MAX_STRATIFY_TIME 10
// Levels for block sanity checks. // Levels for block sanity checks.
#define FLM_NO_CHECK 1 #define FLM_NO_CHECK 1
#define FLM_BASIC_CHECK 2 #define FLM_BASIC_CHECK 2
#define FLM_INTERMEDIATE_CHECK 3 #define FLM_INTERMEDIATE_CHECK 3
#define FLM_EXTENSIVE_CHECK 4 #define FLM_EXTENSIVE_CHECK 4
skipping to change at line 2059 skipping to change at line 2070
/// Typedef for function that is passed into FlmRegisterForEvent(). /// Typedef for function that is passed into FlmRegisterForEvent().
typedef void (* FEVENT_CB)( typedef void (* FEVENT_CB)(
FEventType eEventType, ///< Type of event that occurred. FEventType eEventType, ///< Type of event that occurred.
void * pvAppData, ///< Applica tion data that was originally passed into FlmRegisterForEvent(). void * pvAppData, ///< Applica tion data that was originally passed into FlmRegisterForEvent().
void * pvEventData1, ///< Event specific data. See documentation for ::FEventType for information one what is retur ned in this parameter. void * pvEventData1, ///< Event specific data. See documentation for ::FEventType for information one what is retur ned in this parameter.
void * pvEventData2 ///< Event specific data. See documentation for ::FEventType for information one what is retur ned in this parameter. void * pvEventData2 ///< Event specific data. See documentation for ::FEventType for information one what is retur ned in this parameter.
); );
/// Register to catch events from the database system. /// Register to catch events from the database system.
/// \ingroup Event /// \ingroup event
FLMEXP RCODE FLMAPI FlmRegisterForEvent( FLMEXP RCODE FLMAPI FlmRegisterForEvent(
FEventCategory eCategory, ///< Category of eve nts to be caught. FEventCategory eCategory, ///< Category of eve nts to be caught.
FEVENT_CB fnEventCB, ///< Functio n to be called when events of the specified category happen. FEVENT_CB fnEventCB, ///< Functio n to be called when events of the specified category happen.
void * pvAppData, ///< Applica tion supplied data that is to be passed to the registered function whenever it is called. void * pvAppData, ///< Applica tion supplied data that is to be passed to the registered function whenever it is called.
HFEVENT * phEventRV ///< Event h andle. This handle should be passed to FlmDeregisterForEvent() to deregist er event handling. HFEVENT * phEventRV ///< Event h andle. This handle should be passed to FlmDeregisterForEvent() to deregist er event handling.
); );
/// Deregister event handling function. /// Deregister event handling function.
/// \ingroup Event /// \ingroup event
FLMEXP void FLMAPI FlmDeregisterForEvent( FLMEXP void FLMAPI FlmDeregisterForEvent(
HFEVENT * phEventRV ///< Event h andle that was returned by FlmRegisterForEvent(). HFEVENT * phEventRV ///< Event h andle that was returned by FlmRegisterForEvent().
); );
/// Function prototype for the commit function that can be set by ca lling FlmDbConfig() using the /// Function prototype for the commit function that can be set by ca lling FlmDbConfig() using the
/// eDbConfigType::FDB_SET_COMMIT_CALLBACK option. /// eDbConfigType::FDB_SET_COMMIT_CALLBACK option.
typedef void (* COMMIT_FUNC)( typedef void (* COMMIT_FUNC)(
HFDB hDb, ///< Database handle passed into function when it is called. HFDB hDb, ///< Database handle passed into function when it is called.
void * pvUserData ///< Application data passed into function when it is called.\ This pointer is the data pointer void * pvUserData ///< Application data passed into function when it is called.\ This pointer is the data pointer
///< that was passed into FlmDbConfig() when it was called with the ///< that was passed into FlmDbConfig() when it was called with the
skipping to change at line 2241 skipping to change at line 2252
FDB_SET_COMMIT_CALLBACK, ///< Set a callback function that is to be called whenever this database handle commits an FDB_SET_COMMIT_CALLBACK, ///< Set a callback function that is to be called whenever this database handle commits an
///< update transaction.\ pvValue1 is a pointer to the callback ///< update transaction.\ pvValue1 is a pointer to the callback
///< function - a ::COMMIT_FUNC.\ pvV alue2 is a pointer to application data that will be passed into the ///< function - a ::COMMIT_FUNC.\ pvV alue2 is a pointer to application data that will be passed into the
///< function whenever it is called. ///< function whenever it is called.
FDB_ENABLE_FIELD_ID_TABLE, ///< Enable the creating of a field ID table for level-one fields in cached rec ords for a specific FDB_ENABLE_FIELD_ID_TABLE, ///< Enable the creating of a field ID table for level-one fields in cached rec ords for a specific
///< container.\ pvValue1 is a FLMUINT that holds the container number.\ pvValue2 is a FLMBOOL indicating ///< container.\ pvValue1 is a FLMUINT that holds the container number.\ pvValue2 is a FLMBOOL indicating
///< whether the field id table is to b e enabled or disabled. ///< whether the field id table is to b e enabled or disabled.
FDB_SET_RFL_SIZE_THRESHOLD, ///< Sets th e RFL size threshold (in K bytes). If registered to receive RFL size event s, an event will FDB_SET_RFL_SIZE_THRESHOLD, ///< Sets th e RFL size threshold (in K bytes). If registered to receive RFL size event s, an event will
///< be reported when the on-disk size of the RFL exceeds this value.\ pvValue1 is a FLMUINT which ///< be reported when the on-disk size of the RFL exceeds this value.\ pvValue1 is a FLMUINT which
///< specifies the threshold value in K bytes. ///< specifies the threshold value in K bytes.
FDB_SET_RFL_SIZE_EVENT_INTERVALS ///< Sets th e criteria for determining how often to report RFL size events once the RFL exceeds the FDB_SET_RFL_SIZE_EVENT_INTERVALS, ///< Sets the criter ia for determining how often to report RFL size events once the RFL exceeds the
///< size threshold.\ pvValue1 is a FL MUINT which specifies the minimum number of seconds between ///< size threshold.\ pvValue1 is a FL MUINT which specifies the minimum number of seconds between
///< events.\ pvValue2 is a FLMUINT w hich specifies the minimum increase in K bytes of the RFL ///< events.\ pvValue2 is a FLMUINT w hich specifies the minimum increase in K bytes of the RFL
///< between events. ///< between events.
FDB_RFL_FOOTPRINT_SIZE, ///<
Set the footprint size of the RFL when files are not being kept.\ pvValue
1 is a FLMUINT
///< which specifies the footprint size
(in bytes).
FDB_RBL_FOOTPRINT_SIZE ///<
Set the footprint size of the roll-back log.\ pvValue1 is a FLMUINT
///< which specifies the footprint size
(in bytes).
} eDbConfigType; } eDbConfigType;
/// Options for FlmDbGetConfig(). /// Options for FlmDbGetConfig().
typedef enum typedef enum
{ {
FDB_GET_VERSION = 1, ///< Get the FLAIM database version.\ pvValue1 is a FLMUINT * that ret urns database version. FDB_GET_VERSION = 1, ///< Get the FLAIM database version.\ pvValue1 is a FLMUINT * that ret urns database version.
FDB_GET_BLKSIZ, ///< Get the database block size.\ pvValue1 is a FLMUINT * that return s database block size. FDB_GET_BLKSIZ, ///< Get the database block size.\ pvValue1 is a FLMUINT * that return s database block size.
FDB_GET_DEFAULT_LANG, ///< Get the default language for the database.\ pvValue1 is a FLMUINT * that returns the language. FDB_GET_DEFAULT_LANG, ///< Get the default language for the database.\ pvValue1 is a FLMUINT * that returns the language.
FDB_GET_PATH = 17, ///< Get the database file name.\ pvValue1 is a char * that points to a buffer where the FDB_GET_PATH = 17, ///< Get the database file name.\ pvValue1 is a char * that points to a buffer where the
///< file name is to be returned.\ Buf fer should be large enough to hold the largest possible file name. ///< file name is to be returned.\ Buf fer should be large enough to hold the largest possible file name.
skipping to change at line 2305 skipping to change at line 2320
///< data files.\ pvValue2 is a FLMUIN T64 * which returns the total size of all rollback ///< data files.\ pvValue2 is a FLMUIN T64 * which returns the total size of all rollback
///< files.\ pvValue3 is a FLMUINT64 * which returns the total size of all roll-forward log files. ///< files.\ pvValue3 is a FLMUINT64 * which returns the total size of all roll-forward log files.
FDB_GET_FILE_EXTEND_SIZE, ///< Get the database file extend size.\ pvValue1 is a FLMUINT * which returns the file extend size.\ NOTE: FDB_GET_FILE_EXTEND_SIZE, ///< Get the database file extend size.\ pvValue1 is a FLMUINT * which returns the file extend size.\ NOTE:
///< This size may be set by calling Fl mDbConfig() using the eDbConfigType::FDB_FILE_EXTEND_SIZE option. ///< This size may be set by calling Fl mDbConfig() using the eDbConfigType::FDB_FILE_EXTEND_SIZE option.
FDB_GET_APP_DATA, ///< Get the application data pointer that was set using the eD bConfigType::FDB_SET_APP_DATA option FDB_GET_APP_DATA, ///< Get the application data pointer that was set using the eD bConfigType::FDB_SET_APP_DATA option
///< in FlmDbConfig().\ pvValue1 is a void ** which returns the pointer. ///< in FlmDbConfig().\ pvValue1 is a void ** which returns the pointer.
FDB_GET_NEXT_INC_BACKUP_SEQ_NUM, ///< Get the next incremental backup sequence number for the database.\ pvValue1 is a FLMUINT * that FDB_GET_NEXT_INC_BACKUP_SEQ_NUM, ///< Get the next incremental backup sequence number for the database.\ pvValue1 is a FLMUINT * that
///< returns the sequence number. ///< returns the sequence number.
FDB_GET_DICT_SEQ_NUM, ///< Get the dictionary sequence number.\ pvValue1 is a FLMUINT * that return s the sequence number. FDB_GET_DICT_SEQ_NUM, ///< Get the dictionary sequence number.\ pvValue1 is a FLMUINT * that return s the sequence number.
FDB_GET_FFILE_ID, ///< Get the database's unique ID number.\ pvValue1 is a FLMU INT * that returns the number. FDB_GET_FFILE_ID, ///< Get the database's unique ID number.\ pvValue1 is a FLMU INT * that returns the number.
FDB_GET_MUST_CLOSE_RC ///< Get the ::RCODE that caused the "must close" flag to be set on the databas e.\ pvValue1 is FDB_GET_MUST_CLOSE_RC, ///< Get the ::RCODE that caused the "must close" flag to be set on the databas e.\ pvValue1 is
///< an ::RCODE * that returns the ::RC ODE. ///< an ::RCODE * that returns the ::RC ODE.
FDB_GET_RFL_FOOTPRINT_SIZE, ///< Get the
RFL footprint size.\ pvValue1 is a FLMUINT * which returns the RFL footpr
int size.\ NOTE:
///< This size may be set by calling Fl
mDbConfig() using the eDbConfigType::FDB_RFL_FOOTPRINT_SIZE option.
FDB_GET_RBL_FOOTPRINT_SIZE ///<
Get the roll-back log footprint size.\ pvValue1 is a FLMUINT * which retu
rns the RBL footprint size.\ NOTE:
///< This size may be set by calling Fl
mDbConfig() using the eDbConfigType::FDB_RBL_FOOTPRINT_SIZE option.
} eDbGetConfigType; } eDbGetConfigType;
/// Create a new database. /// Create a new database.
/// \ingroup dbcreateopen /// \ingroup dbcreateopen
FLMEXP RCODE FLMAPI FlmDbCreate( FLMEXP RCODE FLMAPI FlmDbCreate(
const char * pszDbFileName, ///< Name of database to be created.\ May be full path name or partial path na me. const char * pszDbFileName, ///< Name of database to be created.\ May be full path name or partial path na me.
const char * pszDataDir, ///< Name of directory where data files are to be created.\ If NULL, d ata files will be const char * pszDataDir, ///< Name of directory where data files are to be created.\ If NULL, d ata files will be
///< in the same directory as t he main database file - pszDbFileName. ///< in the same directory as t he main database file - pszDbFileName.
const char * pszRflDir, ///< Name of the directory where RFL files are to be created.\ If NULL , RFL files will be const char * pszRflDir, ///< Name of the directory where RFL files are to be created.\ If NULL , RFL files will be
///< in the same directory as t he main database file - pszDbFileName. ///< in the same directory as t he main database file - pszDbFileName.
skipping to change at line 3189 skipping to change at line 3208
typedef enum typedef enum
{ {
FLM_QUERY_MESSAGE, ///< Query informati on is logged using this message type. FLM_QUERY_MESSAGE, ///< Query informati on is logged using this message type.
FLM_TRANSACTION_MESSAGE, ///< Transactional messages, including updates. FLM_TRANSACTION_MESSAGE, ///< Transactional messages, including updates.
FLM_GENERAL_MESSAGE, ///< General categor y of messages - anything not belonging to the FLM_GENERAL_MESSAGE, ///< General categor y of messages - anything not belonging to the
///< other message categories. ///< other message categories.
FLM_NUM_MESSAGE_TYPES FLM_NUM_MESSAGE_TYPES
} FlmLogMessageType; } FlmLogMessageType;
#define F_MAX_NUM_BUF 12 #define F_MAX_NUM_BUF 12
#define F_MAX_NUM64_BUF 24
/// Convert a FLMUINT value to FLAIM's internal storage format for n umbers. /// Convert a FLMUINT value to FLAIM's internal storage format for n umbers.
/// \ingroup storageconversion /// \ingroup storageconversion
FLMEXP RCODE FLMAPI FlmUINT2Storage( FLMEXP RCODE FLMAPI FlmUINT2Storage(
FLMUINT uiNum, ///< Number to convert. FLMUINT uiNum, ///< Number to convert.
FLMUINT * puiStorageLen, ///< On input, *puiS torageLen is the size of pucStorageBuf.\ It must be atleast F_MAX_NUM_BUF FLMUINT * puiStorageLen, ///< On input, *puiS torageLen is the size of pucStorageBuf.\ It must be atleast F_MAX_NUM_BUF
///< bytes.\ On output *puiStorageLen is set to the nu mber of bytes used in pucStorageBuf. ///< bytes.\ On output *puiStorageLen is set to the nu mber of bytes used in pucStorageBuf.
FLMBYTE * pucStorageBuf ///< Number converte d to FLAIM's internal storage format is returned here. FLMBYTE * pucStorageBuf ///< Number converte d to FLAIM's internal storage format is returned here.
); );
/// Convert a FLMUINT64 value to FLAIM's internal storage format for
numbers.
/// \ingroup storageconversion
FLMEXP RCODE FLMAPI FlmUINT64ToStorage(
FLMUINT64 ui64Num, ///<
Number to convert.
FLMUINT * puiStorageLen, ///< On input, *puiS
torageLen is the size of pucStorageBuf.\ It must be atleast F_MAX_NUM64_BU
F
///< bytes.\ On output *puiStorageLen is set to the nu
mber of bytes used in pucStorageBuf.
FLMBYTE * pucStorageBuf ///< Number converte
d to FLAIM's internal storage format is returned here.
);
/// Convert a FLMINT value to FLAIM's internal storage format for nu mbers. /// Convert a FLMINT value to FLAIM's internal storage format for nu mbers.
/// \ingroup storageconversion /// \ingroup storageconversion
FLMEXP RCODE FLMAPI FlmINT2Storage( FLMEXP RCODE FLMAPI FlmINT2Storage(
FLMINT iNum, ///< Number to convert. FLMINT iNum, ///< Number to convert.
FLMUINT * puiStorageLen, ///< On input, *puiS torageLen is the size of pucStorageBuf.\ It must be atleast F_MAX_NUM_BUF FLMUINT * puiStorageLen, ///< On input, *puiS torageLen is the size of pucStorageBuf.\ It must be atleast F_MAX_NUM_BUF
///< bytes.\ On output *puiStorageLen is set to the nu mber of bytes used in pucStorageBuf. ///< bytes.\ On output *puiStorageLen is set to the nu mber of bytes used in pucStorageBuf.
FLMBYTE * pucStorageBuf ///< Number converte d to FLAIM's internal storage format is returned here. FLMBYTE * pucStorageBuf ///< Number converte d to FLAIM's internal storage format is returned here.
); );
/// Convert a FLMINT64 value to FLAIM's internal storage format for
numbers.
/// \ingroup storageconversion
FLMEXP RCODE FLMAPI FlmINT64ToStorage(
FLMINT64 i64Num, ///<
Number to convert.
FLMUINT * puiStorageLen, ///< On input, *puiS
torageLen is the size of pucStorageBuf.\ It must be atleast F_MAX_NUM64_BU
F
///< bytes.\ On output *puiStorageLen is set to the nu
mber of bytes used in pucStorageBuf.
FLMBYTE * pucStorageBuf ///< Number converte
d to FLAIM's internal storage format is returned here.
);
/// Convert a value from FLAIM's internal format to a FLMUINT. Note that the value may be a FLM_NUMBER_TYPE, /// Convert a value from FLAIM's internal format to a FLMUINT. Note that the value may be a FLM_NUMBER_TYPE,
/// FLM_TEXT_TYPE, or FLM_CONTEXT_TYPE. /// FLM_TEXT_TYPE, or FLM_CONTEXT_TYPE.
/// \ingroup storageconversion /// \ingroup storageconversion
FLMEXP RCODE FLMAPI FlmStorage2UINT( FLMEXP RCODE FLMAPI FlmStorage2UINT(
FLMUINT uiValueType, ///< Data ty pe of value being converted.\ May be FLM_NUMBER_TYPE, FLM_TEXT_TYPE, or FLMUINT uiValueType, ///< Data ty pe of value being converted.\ May be FLM_NUMBER_TYPE, FLM_TEXT_TYPE, or
///< FLM_CONTEXT_TYPE. ///< FLM_CONTEXT_TYPE.
FLMUINT uiValueLength, ///< Length of value to be converted (in bytes). FLMUINT uiValueLength, ///< Length of value to be converted (in bytes).
const FLMBYTE * pucValue, ///< Value to be con verted.\ Data is expected to be in FLAIM's internal format. const FLMBYTE * pucValue, ///< Value to be con verted.\ Data is expected to be in FLAIM's internal format.
FLMUINT * puiNum ///< Converted number is returned here. FLMUINT * puiNum ///< Converted number is returned here.
); );
skipping to change at line 3230 skipping to change at line 3268
/// FLM_TEXT_TYPE, or FLM_CONTEXT_TYPE. /// FLM_TEXT_TYPE, or FLM_CONTEXT_TYPE.
/// \ingroup storageconversion /// \ingroup storageconversion
FLMEXP RCODE FLMAPI FlmStorage2UINT32( FLMEXP RCODE FLMAPI FlmStorage2UINT32(
FLMUINT uiValueType, ///< Data ty pe of value being converted.\ May be FLM_NUMBER_TYPE, FLM_TEXT_TYPE, or FLMUINT uiValueType, ///< Data ty pe of value being converted.\ May be FLM_NUMBER_TYPE, FLM_TEXT_TYPE, or
///< FLM_CONTEXT_TYPE. ///< FLM_CONTEXT_TYPE.
FLMUINT uiValueLength, ///< Length of value to be converted (in bytes). FLMUINT uiValueLength, ///< Length of value to be converted (in bytes).
const FLMBYTE * pucValue, ///< Value to be con verted.\ Data is expected to be in FLAIM's internal format. const FLMBYTE * pucValue, ///< Value to be con verted.\ Data is expected to be in FLAIM's internal format.
FLMUINT32 * pui32Num ///< Converted number is returned here. FLMUINT32 * pui32Num ///< Converted number is returned here.
); );
/// Convert a value from FLAIM's internal format to a FLMUINT64. No
te that the value may be a FLM_NUMBER_TYPE,
/// FLM_TEXT_TYPE, or FLM_CONTEXT_TYPE.
/// \ingroup storageconversion
FLMEXP RCODE FLMAPI FlmStorage2UINT64(
FLMUINT uiValueType, ///< Data ty
pe of value being converted.\ May be FLM_NUMBER_TYPE, FLM_TEXT_TYPE, or
///< FLM_CONTEXT_TYPE.
FLMUINT uiValueLength, ///<
Length of value to be converted (in bytes).
const FLMBYTE * pucValue, ///< Value to be con
verted.\ Data is expected to be in FLAIM's internal format.
FLMUINT64 * pui64Num
///< Converted number is returned here.
);
/// Convert a value from FLAIM's internal format to a FLMINT. Note that the value may be a FLM_NUMBER_TYPE, /// Convert a value from FLAIM's internal format to a FLMINT. Note that the value may be a FLM_NUMBER_TYPE,
/// FLM_TEXT_TYPE, or FLM_CONTEXT_TYPE. /// FLM_TEXT_TYPE, or FLM_CONTEXT_TYPE.
/// \ingroup storageconversion /// \ingroup storageconversion
FLMEXP RCODE FLMAPI FlmStorage2INT( FLMEXP RCODE FLMAPI FlmStorage2INT(
FLMUINT uiValueType, ///< Data ty pe of value being converted.\ May be FLM_NUMBER_TYPE, FLM_TEXT_TYPE, or FLMUINT uiValueType, ///< Data ty pe of value being converted.\ May be FLM_NUMBER_TYPE, FLM_TEXT_TYPE, or
///< FLM_CONTEXT_TYPE. ///< FLM_CONTEXT_TYPE.
FLMUINT uiValueLength, ///< Length of value to be converted (in bytes). FLMUINT uiValueLength, ///< Length of value to be converted (in bytes).
const FLMBYTE * pucValue, ///< Value to be con verted.\ Data is expected to be in FLAIM's internal format. const FLMBYTE * pucValue, ///< Value to be con verted.\ Data is expected to be in FLAIM's internal format.
FLMINT * puiNum ///< Converted number is returned here. FLMINT * puiNum ///< Converted number is returned here.
); );
/// Convert a value from FLAIM's internal format to a FLMINT32. Not
e that the value may be a FLM_NUMBER_TYPE,
/// FLM_TEXT_TYPE, or FLM_CONTEXT_TYPE.
/// \ingroup storageconversion
FLMEXP RCODE FLMAPI FlmStorage2INT32(
FLMUINT uiValueType, ///< Data ty
pe of value being converted.\ May be FLM_NUMBER_TYPE, FLM_TEXT_TYPE, or
///< FLM_CONTEXT_TYPE.
FLMUINT uiValueLength, ///<
Length of value to be converted (in bytes).
const FLMBYTE * pucValue, ///< Value to be con
verted.\ Data is expected to be in FLAIM's internal format.
FLMINT32 * pui32Num
///< Converted number is returned here.
);
/// Convert a value from FLAIM's internal format to a FLMINT64. Not
e that the value may be a FLM_NUMBER_TYPE,
/// FLM_TEXT_TYPE, or FLM_CONTEXT_TYPE.
/// \ingroup storageconversion
FLMEXP RCODE FLMAPI FlmStorage2INT64(
FLMUINT uiValueType, ///< Data ty
pe of value being converted.\ May be FLM_NUMBER_TYPE, FLM_TEXT_TYPE, or
///< FLM_CONTEXT_TYPE.
FLMUINT uiValueLength, ///<
Length of value to be converted (in bytes).
const FLMBYTE * pucValue, ///< Value to be con
verted.\ Data is expected to be in FLAIM's internal format.
FLMINT64 * pui64Num
///< Converted number is returned here.
);
/// Convert a unicode string to FLAIM's internal storage format. /// Convert a unicode string to FLAIM's internal storage format.
/// \ingroup storageconversion /// \ingroup storageconversion
FLMEXP RCODE FLMAPI FlmUnicode2Storage( FLMEXP RCODE FLMAPI FlmUnicode2Storage(
const FLMUNICODE * puzStr, ///< Unicode string that is to be converted.\ FLAIM expects the string const FLMUNICODE * puzStr, ///< Unicode string that is to be converted.\ FLAIM expects the string
///< to be null-terminated. ///< to be null-terminated.
FLMUINT * puiStorageLen, ///< On input, *puiStorageLen is length (in bytes) of pucStorageBuf.\ On outpu t, *puiStorageLen FLMUINT * puiStorageLen, ///< On input, *puiStorageLen is length (in bytes) of pucStorageBuf.\ On outpu t, *puiStorageLen
///< contains number of bytes returned. ///< contains number of bytes returned.
FLMBYTE * pucStorageBuf ///< Converted string, in FLAIM's internal storage format, is returned here. FLMBYTE * pucStorageBuf ///< Converted string, in FLAIM's internal storage format, is returned here.
); );
skipping to change at line 3517 skipping to change at line 3588
dictionary objects and their structure. dictionary objects and their structure.
******************************************************************** ********/ ******************************************************************** ********/
/* /*
Field Definition Field Definition
Desc: The below syntax is used to define a field within a database d ictionary Desc: The below syntax is used to define a field within a database d ictionary
container. container.
0 [@<ID>@] field <name> # FLM_FIELD_TAG 0 [@<ID>@] field <name> # FLM_FIELD_TAG
| 1 type <below> # FLM_TYPE_TAG | 1 type <below> # FLM_TYPE_TAG
{context|number|text|binary|real|date|time|tmstamp|b lob}] {context|number|text|binary|blob}]
[ 1 state <below> # FLM_STATE_TAG - what is the state of the field [ 1 state <below> # FLM_STATE_TAG - what is the state of the field
{ *active # The field is active (b eing used). { *active # The field is active (b eing used).
| checking # User request to determ ine if field is used. | checking # User request to determ ine if field is used.
# This is done by calling FlmDbSweep. # This is done by calling FlmDbSweep.
| unused # Result of 'checking'. Field is not used and | unused # Result of 'checking'. Field is not used and
# maybe deleted. Note: a field in this state # maybe deleted. Note: a field in this state
# may still have other dictionary item that # may still have other dictionary item that
# are referencing it. # are referencing it.
| purge}] # Remove all fld occuran ces, and delete def. | purge}] # Remove all fld occuran ces, and delete def.
*/ */
skipping to change at line 3546 skipping to change at line 3617
/* /*
Container Definition Container Definition
Desc: The below syntax is used to define a container within a databa se dictionary Desc: The below syntax is used to define a container within a databa se dictionary
container. container.
0 [@<ID>@] container <name> # FLM_CONTAINER_TAG 0 [@<ID>@] container <name> # FLM_CONTAINER_TAG
*/ */
/* /*
Area Definition
Desc: An area allows the application to define a logical location th
at
blob files can be placed.
0 [@<ID>@] area <name> # FLM_AREA_TAG
[{1 base* 0* | <ID>} # FLM_BASE_TAG - 0 = same area a DB
location
[ 2 subdirectory <string>] # FLM_SUBDIRECTORY_TAG
3 subd ...
|{1 machine pc|mac|unix}... # FLM_MACHINE_TAG
[ 2 order <driver>[;<driver>]...] # FLM_ORDER_TAG
2 driver .* | <tag> # FLM_DRIVER_TAG
[ 3 directory <string>] # FLM_DIRECTORY_TAG
]
[ 1 blob] # FLM_BLOB_TAG
[ 2 options compress,encrypt,checksum] # FLM_OPTIONS_TAG
[ 2 threshold 1* | <#>] # FLM_THRESHOLD_TAG - k-bytes befor
e moved to
# external file
[ 1 subname] # FLM_SUBNAME_TAG - create/use subd
ir named:
[ 2 prefix* "SDIR_"* | <str> # FLM_PREFIX_TAG - 1-5 character pr
efix
[ 2 suffix* 1* | <#> # FLM_SUFFIX_TAG - max < 4k, dir su
ffix
*/
/*
Reserved Dictionary Record
Desc: Allows user to reserve a typeless ID in a dictionary.
0 [@<ID>@] reserved <name> # FLM_RESERVED_TAG
*/
/*
Index Definition Index Definition
Desc: Below is the syntax that is used to define a FLAIM index. Desc: Below is the syntax that is used to define a FLAIM index.
0 [@<ID>@] index <psName> # FLM_INDEX_TAG 0 [@<ID>@] index <psName> # FLM_INDEX_TAG
[ 1 area** 0** | <ID> ] # FLM_AREA_TAG - QF files area, 0 = "same as DB"
[ 1 container* DEFAULT* | <ID> ] # FLM_CONTAINER_TAG - indexes span only one container [ 1 container* DEFAULT* | <ID> ] # FLM_CONTAINER_TAG - indexes span only one container
[ 1 count KEYS &| REFS* ] # FLM_COUNT_TAG - key count of keys and/or refs [ 1 count KEYS &| REFS* ] # FLM_COUNT_TAG - key count of keys and/or refs
[ 1 language* US* | <language> ] # FLM_LANGUAGE_TAG - for full-text parsing and/or sorting [ 1 language* US* | <language> ] # FLM_LANGUAGE_TAG - for full-text parsing and/or sorting
1 key [EACHWORD] # FLM_KEY_TA G - 'use' defaults based on type 1 key [EACHWORD] # FLM_KEY_TA G - 'use' defaults based on type
[ 2 base <ID>] # FLM_BASE_TAG - base rec/field for
fields below
[ 2 combinations* # FLM_COMBINATIONS_TAG - how to han
dle repeating fields
ALL | NORMALIZED* ]
[ 2 post] # FLM_POST_TAG - case-flags post-pe nded to key [ 2 post] # FLM_POST_TAG - case-flags post-pe nded to key
[ 2 required*] # FLM_REQUIRED_TAG - key value is r equired [ 2 required*] # FLM_REQUIRED_TAG - key value is r equired
[ 2 unique] # FLM_UNIQUE_TAG - key has only 1 r eference [ 2 unique] # FLM_UNIQUE_TAG - key has only 1 r eference
{ 2 <field> }... # FLM_FIELD_TAG - compound key if 2 or more { 2 <field> }... # FLM_FIELD_TAG - compound key if 2 or more
[ 3 case* mixed* | upper] # FLM_CASE_TAG - text-only, de fine chars case [ 3 case* mixed* | upper] # FLM_CASE_TAG - text-only, de fine chars case
[ 3 <field>]... # FLM_FIELD_TAG - alternate fi eld(s) [ 3 <field>]... # FLM_FIELD_TAG - alternate fi eld(s)
[ 3 paired** ] # FLM_PAIRED_TAG - add field I D to key
[ 3 optional* # FLM_OPTIONAL_TAG - component 's value is optional [ 3 optional* # FLM_OPTIONAL_TAG - component 's value is optional
|3 required ] # FLM_REQUIRED_TAG - component 's value is required |3 required ] # FLM_REQUIRED_TAG - component 's value is required
{[ 3 use* eachword**|value*|field]} # FLM_USE_TAG {[ 3 use* eachword**|value*|field|substring]} # FLM_USE_TAG
{[ 3 filter minspace|nodash|nounderscore|minspaces]} # FLM_F {[ 3 filter minspace|nodash|nounderscore|nospace]} # FLM_FIL
ILTER_TAG TER_TAG
[ 3 limit {256 | limit}] [ 3 limit {256 | limit}]
<field> == <field> ==
n field <field path> # path identifies field -- maybe " based" n field <field path> # path identifies field -- maybe " based"
[ m type <data type>] # FLM_TYPE_TAG - only for ixing unr egistered fields [ m type <data type>] # FLM_TYPE_TAG - only for ixing unr egistered fields
*/ */
/******************************************************************* ********* /******************************************************************* *********
NON-Dictionary Record Definitions - the following record definitions are for NON-Dictionary Record Definitions - the following record definitions are for
skipping to change at line 3865 skipping to change at line 3901
FLMBOOL bReleaseMemory = FALSE ///< If TRUE, free the memory buffer used to hold field data.\ If FALSE, FLMBOOL bReleaseMemory = FALSE ///< If TRUE, free the memory buffer used to hold field data.\ If FALSE,
///< the memory buffer will be cleared without freeing it. ///< the memory buffer will be cleared without freeing it.
); );
/// Get a field's value as a FLMINT. Data conversions will be done if the field is a FLM_CONTEXT_TYPE or FLM_TEXT_TYPE. /// Get a field's value as a FLMINT. Data conversions will be done if the field is a FLM_CONTEXT_TYPE or FLM_TEXT_TYPE.
RCODE getINT( RCODE getINT(
void * pvField, ///< Field whose value is to be retrieved (and converted if necessary). void * pvField, ///< Field whose value is to be retrieved (and converted if necessary).
FLMINT * piNumber ///< Number is returned here. FLMINT * piNumber ///< Number is returned here.
); );
/// Get a field's value as a FLMINT32. Data conversions wil
l be done if the field is a FLM_CONTEXT_TYPE or FLM_TEXT_TYPE.
RCODE getINT32(
void * pvField, ///<
Field whose value is to be retrieved (and converted if necessary).
FLMINT32 * pi32Number ///< Number
is returned here.
);
/// Get a field's value as a FLMINT64. Data conversions wil
l be done if the field is a FLM_CONTEXT_TYPE or FLM_TEXT_TYPE.
RCODE getINT64(
void * pvField, ///<
Field whose value is to be retrieved (and converted if necessary).
FLMINT64 * pi64Number ///< Number
is returned here.
);
/// Get a field's value as a FLMUINT. Data conversions will be done if the field is a FLM_CONTEXT_TYPE or FLM_TEXT_TYPE. /// Get a field's value as a FLMUINT. Data conversions will be done if the field is a FLM_CONTEXT_TYPE or FLM_TEXT_TYPE.
RCODE getUINT( RCODE getUINT(
void * pvField, ///< Field whose value is to be retrieved (and converted if necessary). void * pvField, ///< Field whose value is to be retrieved (and converted if necessary).
FLMUINT * puiNumber ///< Number is returned here. FLMUINT * puiNumber ///< Number is returned here.
); );
/// Get a field's value as a FLMUINT32. Data conversions wi ll be done if the field is a FLM_CONTEXT_TYPE or FLM_TEXT_TYPE. /// Get a field's value as a FLMUINT32. Data conversions wi ll be done if the field is a FLM_CONTEXT_TYPE or FLM_TEXT_TYPE.
RCODE getUINT32( RCODE getUINT32(
void * pvField, ///< Field whose value is to be retrieved (and converted if necessary). void * pvField, ///< Field whose value is to be retrieved (and converted if necessary).
FLMUINT32 * pui32Number ///< Number is returned here. FLMUINT32 * pui32Number ///< Number is returned here.
); );
/// Get a field's value as a FLMUINT64. Data conversions wi
ll be done if the field is a FLM_CONTEXT_TYPE or FLM_TEXT_TYPE.
RCODE getUINT64(
void * pvField,
///< Field whose value is to be retrieved (and converted if necessary).
FLMUINT64 * pui64Number ///<
Number is returned here.
);
/// Get the number of bytes needed to retrieve a field's val ue as a unicode string. The value may be either /// Get the number of bytes needed to retrieve a field's val ue as a unicode string. The value may be either
/// a FLM_NUMBER_TYPE or a FLM_TEXT_TYPE. The length return ed does NOT account for null-termination, so if the application is /// a FLM_NUMBER_TYPE or a FLM_TEXT_TYPE. The length return ed does NOT account for null-termination, so if the application is
/// calling this routine to determine how big of a buffer to allocate, it should add 2 to the size returned from this routine. /// calling this routine to determine how big of a buffer to allocate, it should add 2 to the size returned from this routine.
FINLINE RCODE getUnicodeLength( FINLINE RCODE getUnicodeLength(
void * pvField, ///< Field containing the value whose unicode string length is to be de termined. void * pvField, ///< Field containing the value whose unicode string length is to be de termined.
FLMUINT * puiLength ///< Unicode length is returned (in bytes).\ The length does not include what it would take FLMUINT * puiLength ///< Unicode length is returned (in bytes).\ The length does not include what it would take
///< for null-termination. ///< for null-termination.
) )
{ {
if( pvField) if( pvField)
skipping to change at line 4009 skipping to change at line 4063
/// Set a field's value to a FLMINT value. The resulting da ta type for the field will be FLM_NUMBER_TYPE. /// Set a field's value to a FLMINT value. The resulting da ta type for the field will be FLM_NUMBER_TYPE.
RCODE setINT( RCODE setINT(
void * pvField, ///< Field whose value is to be set. void * pvField, ///< Field whose value is to be set.
FLMINT iNumber, ///< Value to set. FLMINT iNumber, ///< Value to set.
FLMUINT uiEncId = 0 ///< Encrypt ion ID.\ If zero, the value will not be encrypted.\ If non-zero, the numb er FLMUINT uiEncId = 0 ///< Encrypt ion ID.\ If zero, the value will not be encrypted.\ If non-zero, the numb er
///< should be the ID of an encryption definition recor d in the data dictionary.\ The ///< should be the ID of an encryption definition recor d in the data dictionary.\ The
///< encryption key for that encryption definition will be used to encrypt this value. ///< encryption key for that encryption definition will be used to encrypt this value.
); );
/// Set a field's value to a FLMINT64 value. The resulting
data type for the field will be FLM_NUMBER_TYPE.
RCODE setINT64(
void * pvField, ///<
Field whose value is to be set.
FLMINT64 i64Number, ///<
Value to set.
FLMUINT uiEncId = 0 ///< Encrypt
ion ID.\ If zero, the value will not be encrypted.\ If non-zero, the numb
er
///< should be the ID of an encryption definition recor
d in the data dictionary.\ The
///< encryption key for that encryption definition will
be used to encrypt this value.
);
/// Set a field's value to a FLMUINT value. The resulting d ata type for the field will be FLM_NUMBER_TYPE. /// Set a field's value to a FLMUINT value. The resulting d ata type for the field will be FLM_NUMBER_TYPE.
RCODE setUINT( RCODE setUINT(
void * pvField, ///< Field whose value is to be set. void * pvField, ///< Field whose value is to be set.
FLMUINT uiNumber, ///< Value t o set. FLMUINT uiNumber, ///< Value t o set.
FLMUINT uiEncId = 0 ///< Encrypt ion ID.\ If zero, the value will not be encrypted.\ If non-zero, the numb er FLMUINT uiEncId = 0 ///< Encrypt ion ID.\ If zero, the value will not be encrypted.\ If non-zero, the numb er
///< should be the ID of an encryption definition recor d in the data dictionary.\ The ///< should be the ID of an encryption definition recor d in the data dictionary.\ The
///< encryption key for that encryption definition will be used to encrypt this value. ///< encryption key for that encryption definition will be used to encrypt this value.
); );
/// Set a field's value to a FLMUINT64 value. The resulting
data type for the field will be FLM_NUMBER_TYPE.
RCODE setUINT64(
void * pvField, ///<
Field whose value is to be set.
FLMUINT64 ui64Number, ///< Value t
o set.
FLMUINT uiEncId = 0 ///< Encrypt
ion ID.\ If zero, the value will not be encrypted.\ If non-zero, the numb
er
///< should be the ID of an encryption definition recor
d in the data dictionary.\ The
///< encryption key for that encryption definition will
be used to encrypt this value.
);
/// Set a field's value to a FLMUINT value. The resulting d ata type for the field will be FLM_CONTEXT_TYPE. /// Set a field's value to a FLMUINT value. The resulting d ata type for the field will be FLM_CONTEXT_TYPE.
RCODE setRecPointer( RCODE setRecPointer(
void * pvField, ///< Field whose value is to be set. void * pvField, ///< Field whose value is to be set.
FLMUINT uiRecPointer, ///< Value t o set. FLMUINT uiRecPointer, ///< Value t o set.
FLMUINT uiEncId = 0 ///< Encryption ID.\ If zero, the value will not be encrypted.\ If non-zero, the number FLMUINT uiEncId = 0 ///< Encryption ID.\ If zero, the value will not be encrypted.\ If non-zero, the number
///< should be the ID of an encryption definiti on record in the data dictionary.\ The ///< should be the ID of an encryption definiti on record in the data dictionary.\ The
///< encryption key for that encryption definit ion will be used to encrypt this value. ///< encryption key for that encryption definit ion will be used to encrypt this value.
); );
/// Set a field's value to a Unicode string value. The resu lting data type for the field will be FLM_TEXT_TYPE. /// Set a field's value to a Unicode string value. The resu lting data type for the field will be FLM_TEXT_TYPE.
skipping to change at line 4578 skipping to change at line 4650
{ {
return m_pucFieldIdTable; return m_pucFieldIdTable;
} }
RCODE truncateFieldIdTable( void); RCODE truncateFieldIdTable( void);
void sortFieldIdTable( void); void sortFieldIdTable( void);
/// Find a level one field ID in a record. /// Find a level one field ID in a record.
void * findLevelOneField( void * findLevelOneField(
FLMUINT uiFieldID, ///< Field n FLMUINT uiFieldID, ///<
umber of field to be found. Field number of field to be found.
FLMBOOL bFindInclusive ///< OK to find next FLMBOOL bFindInclusive, ///< OK to find next
field after uiFieldID? field after uiFieldID?
FLMUINT * puiFieldPos ///<
Field position in field ID table is returned here.
); );
/// Find a level one field ID in a record. /// Determine if the level one field at the specified positi
on in the field ID table
/// matches the passed in field ID.\ If so, return that fie
ld pointer.
void * getLevelOneField(
FLMUINT uiFieldId, ///<
Field id to be matched.
FLMUINT uiLevelOnePosition ///< Level one field
position to be checked.
);
/// Get the next level one field after the position specifie
d.\ Make sure
/// that the next field has the same field ID as the current
field.
void * nextLevelOneField( void * nextLevelOneField(
void * pvLastLevelOneField ///< Last le FLMUINT * puiFieldPos, ///<
vel one field that was found. Current level one field position.\ Returns
///< the next level one field position.
FLMBOOL bFieldIdsMustMatch ///< Specifi
es whether the field ID of the next
///< field in the field ID table must m
atch the
///< field ID of the current field posi
tion.
);
/// Get the field ID of the field that is in the specified p
osition in the
/// field ID table.
FLMUINT getLevelOneFieldId(
FLMUINT uiLevelOnePosition ///< Level o
ne field position whose field ID is to
///< be returned.
); );
void * locateFieldByPosition( void * locateFieldByPosition(
FLMUINT uiPosition); FLMUINT uiPosition);
RCODE checkRecord( void);
RCODE checkField( RCODE checkField(
FlmField * pFld); FlmField * pFld);
#define FLD_HAVE_ENCRYPTED_DATA 0x01 #define FLD_HAVE_ENCRYPTED_DATA 0x01
#define FLD_HAVE_DECRYPTED_DATA 0x02 #define FLD_HAVE_DECRYPTED_DATA 0x02
#define FLD_PICKET_FENCE_SIZE 8 // Only used in debug builds in encrypted fields #define FLD_PICKET_FENCE_SIZE 8 // Only used in debug builds in encrypted fields
// Represents the size of two picket fe nces. // Represents the size of two picket fe nces.
#define FLD_RAW_FENCE "RAWD" #define FLD_RAW_FENCE "RAWD"
#define FLD_ENC_FENCE "ENCD" #define FLD_ENC_FENCE "ENCD"
private: private:
FLMINT Release( FLMINT Release(
FLMBOOL bMutexLocked); FLMBOOL bMutexLocked);
static void objectAllocInit( static void FLMAPI objectAllocInit(
void * pvAlloc); void * pvAlloc,
FLMUINT uiSize);
void * parent( void * parent(
FlmField * pField); FlmField * pField);
FINLINE FLMUINT getFieldLevel( FINLINE FLMUINT getFieldLevel(
FlmField * pField) FlmField * pField)
{ {
return( (pField->ui8TypeAndLevel & 0xE0) >> 5); return( (pField->ui8TypeAndLevel & 0xE0) >> 5);
} }
skipping to change at line 4849 skipping to change at line 4940
FLMEXP RCODE FLMAPI flmCurPerformRead( FLMEXP RCODE FLMAPI flmCurPerformRead(
eFlmFuncs eFlmFuncId, eFlmFuncs eFlmFuncId,
HFCURSOR hCursor, HFCURSOR hCursor,
FLMBOOL bReadForward, FLMBOOL bReadForward,
FLMBOOL bSetFirst, FLMBOOL bSetFirst,
FLMUINT * puiSkipCount, FLMUINT * puiSkipCount,
FlmRecord ** ppRecord, FlmRecord ** ppRecord,
FLMUINT * puiDrn ); FLMUINT * puiDrn );
/// Positions to and retrieves the first record in the query result set. /// Positions to and retrieves the first record in the query result set.
/// \ingroup queryset /// \ingroup queryret
FINLINE RCODE FlmCursorFirst( FINLINE RCODE FlmCursorFirst(
HFCURSOR hCursor, ///< Handle to query object. HFCURSOR hCursor, ///< Handle to query object.
FlmRecord ** ppRecord ///< Pointer to found record, if any, is returned here.\ NULL is returned if n o record was found. FlmRecord ** ppRecord ///< Pointer to found record, if any, is returned here.\ NULL is returned if n o record was found.
) )
{ {
return flmCurPerformRead( FLM_CURSOR_FIRST, return flmCurPerformRead( FLM_CURSOR_FIRST,
hCursor, TRUE, TRUE, NULL, ppRecord, NULL); hCursor, TRUE, TRUE, NULL, ppRecord, NULL);
} }
/// Positions to and retrieves the last record in the query result s et. /// Positions to and retrieves the last record in the query result s et.
/// \ingroup queryset /// \ingroup queryret
FINLINE RCODE FlmCursorLast( FINLINE RCODE FlmCursorLast(
HFCURSOR hCursor, ///< Handle to query object. HFCURSOR hCursor, ///< Handle to query object.
FlmRecord ** ppRecord ///< Pointer to found record, if any, is returned here.\ NULL is returned if n o record was found. FlmRecord ** ppRecord ///< Pointer to found record, if any, is returned here.\ NULL is returned if n o record was found.
) )
{ {
return flmCurPerformRead( FLM_CURSOR_LAST, hCursor, return flmCurPerformRead( FLM_CURSOR_LAST, hCursor,
FALSE, TRUE, NULL, ppRecord, NULL); FALSE, TRUE, NULL, ppRecord, NULL);
} }
/// Positions to and retrieves the next record in the query result s et. /// Positions to and retrieves the next record in the query result s et.
/// \ingroup queryset /// \ingroup queryret
FINLINE RCODE FlmCursorNext( FINLINE RCODE FlmCursorNext(
HFCURSOR hCursor, ///< Handle to query object. HFCURSOR hCursor, ///< Handle to query object.
FlmRecord ** ppRecord ///< Pointer to found record, if any, is returned here.\ NULL is returned if n o record was found. FlmRecord ** ppRecord ///< Pointer to found record, if any, is returned here.\ NULL is returned if n o record was found.
) )
{ {
return flmCurPerformRead( FLM_CURSOR_NEXT, hCursor, return flmCurPerformRead( FLM_CURSOR_NEXT, hCursor,
TRUE, FALSE, NULL, ppRecord, NULL); TRUE, FALSE, NULL, ppRecord, NULL);
} }
/// Positions to and retrieves the previous record in the query resu lt set. /// Positions to and retrieves the previous record in the query resu lt set.
/// \ingroup queryset /// \ingroup queryret
FINLINE RCODE FlmCursorPrev( FINLINE RCODE FlmCursorPrev(
HFCURSOR hCursor, ///< Handle to query object. HFCURSOR hCursor, ///< Handle to query object.
FlmRecord ** ppRecord ///< Pointer to found record, if any, is returned here.\ NULL is returned if n o record was found. FlmRecord ** ppRecord ///< Pointer to found record, if any, is returned here.\ NULL is returned if n o record was found.
) )
{ {
return flmCurPerformRead( FLM_CURSOR_PREV, hCursor, return flmCurPerformRead( FLM_CURSOR_PREV, hCursor,
FALSE, FALSE, NULL, ppRecord, NULL); FALSE, FALSE, NULL, ppRecord, NULL);
} }
/// Positions to the first record in the query result set and retrie ves the record's DRN. /// Positions to the first record in the query result set and retrie ves the record's DRN.
/// \ingroup queryset /// \ingroup queryret
FINLINE RCODE FlmCursorFirstDRN( FINLINE RCODE FlmCursorFirstDRN(
HFCURSOR hCursor, ///< Handle to query object. HFCURSOR hCursor, ///< Handle to query object.
FLMUINT * puiDrn ///< DRN is returned here. FLMUINT * puiDrn ///< DRN is returned here.
) )
{ {
return flmCurPerformRead( FLM_CURSOR_FIRST_DRN, hCursor, return flmCurPerformRead( FLM_CURSOR_FIRST_DRN, hCursor,
TRUE, TRUE, NULL, NULL, puiDrn); TRUE, TRUE, NULL, NULL, puiDrn);
} }
/// Positions to the last record in the query result set and retriev es the record's DRN. /// Positions to the last record in the query result set and retriev es the record's DRN.
/// \ingroup queryset /// \ingroup queryret
FINLINE RCODE FlmCursorLastDRN( FINLINE RCODE FlmCursorLastDRN(
HFCURSOR hCursor, ///< Handle to query object. HFCURSOR hCursor, ///< Handle to query object.
FLMUINT * puiDrn ///< DRN is returned here. FLMUINT * puiDrn ///< DRN is returned here.
) )
{ {
return flmCurPerformRead( FLM_CURSOR_LAST_DRN, hCursor, return flmCurPerformRead( FLM_CURSOR_LAST_DRN, hCursor,
FALSE, TRUE, NULL, NULL, puiDrn); FALSE, TRUE, NULL, NULL, puiDrn);
} }
/// Positions to the next record in the query result set and retriev es the record's DRN. /// Positions to the next record in the query result set and retriev es the record's DRN.
/// \ingroup queryset /// \ingroup queryret
FINLINE RCODE FlmCursorNextDRN( FINLINE RCODE FlmCursorNextDRN(
HFCURSOR hCursor, ///< Handle to query object. HFCURSOR hCursor, ///< Handle to query object.
FLMUINT * puiDrn ///< DRN is returned here. FLMUINT * puiDrn ///< DRN is returned here.
) )
{ {
return flmCurPerformRead( FLM_CURSOR_NEXT_DRN, hCursor, return flmCurPerformRead( FLM_CURSOR_NEXT_DRN, hCursor,
TRUE, FALSE, NULL, NULL, puiDrn); TRUE, FALSE, NULL, NULL, puiDrn);
} }
/// Positions to the previous record in the query result set and ret rieves the record's DRN. /// Positions to the previous record in the query result set and ret rieves the record's DRN.
/// \ingroup queryset /// \ingroup queryret
FINLINE RCODE FlmCursorPrevDRN( FINLINE RCODE FlmCursorPrevDRN(
HFCURSOR hCursor, ///< Handle to query object. HFCURSOR hCursor, ///< Handle to query object.
FLMUINT * puiDrn ///< DRN is returned here. FLMUINT * puiDrn ///< DRN is returned here.
) )
{ {
return flmCurPerformRead( FLM_CURSOR_PREV_DRN, hCursor, return flmCurPerformRead( FLM_CURSOR_PREV_DRN, hCursor,
FALSE, FALSE, NULL, NULL, puiDrn); FALSE, FALSE, NULL, NULL, puiDrn);
} }
/// Retrieve current record from query result set. /// Retrieve current record from query result set.
/// \ingroup queryset /// \ingroup queryret
FLMEXP RCODE FLMAPI FlmCursorCurrent( FLMEXP RCODE FLMAPI FlmCursorCurrent(
HFCURSOR hCursor, ///< Handle to query object. HFCURSOR hCursor, ///< Handle to query object.
FlmRecord ** ppRecord ///< Pointer to found record, if any, is returned here.\ NULL is returned if n o record was found. FlmRecord ** ppRecord ///< Pointer to found record, if any, is returned here.\ NULL is returned if n o record was found.
); );
/// Retrieve the DRN of the current recrord in query result set. /// Retrieve the DRN of the current recrord in query result set.
/// \ingroup queryset /// \ingroup queryret
FLMEXP RCODE FLMAPI FlmCursorCurrentDRN( FLMEXP RCODE FLMAPI FlmCursorCurrentDRN(
HFCURSOR hCursor, ///< Handle to query object. HFCURSOR hCursor, ///< Handle to query object.
FLMUINT * puiDrn ///< DRN is returned here. FLMUINT * puiDrn ///< DRN is returned here.
); );
/// Position relative to the current record (forward or backward) in the query result set /// Position relative to the current record (forward or backward) in the query result set
/// and retrieve the record positioned to. /// and retrieve the record positioned to.
/// \ingroup queryset /// \ingroup queryret
FLMEXP RCODE FLMAPI FlmCursorMoveRelative( FLMEXP RCODE FLMAPI FlmCursorMoveRelative(
HFCURSOR hCursor, ///< Handle to query object. HFCURSOR hCursor, ///< Handle to query object.
FLMINT * piPosition, ///< On input *piPosition indicates the relative position to move withi n the FLMINT * piPosition, ///< On input *piPosition indicates the relative position to move withi n the
///< query result set.\ A negative value will move the position back ///< query result set.\ A negative value will move the position back
///< *piPosition records and a positive value w ill move the position ///< *piPosition records and a positive value w ill move the position
///< forward *piPosition records.\ On output, *piPosition will return ///< forward *piPosition records.\ On output, *piPosition will return
///< the relative position after the move.\ Th is should always equal ///< the relative position after the move.\ Th is should always equal
///< the input position unless an error is retu rned. ///< the input position unless an error is retu rned.
FlmRecord ** ppRecord ///< Pointer to found record, if any, is returned here.\ NULL is returned if n o record was found. FlmRecord ** ppRecord ///< Pointer to found record, if any, is returned here.\ NULL is returned if n o record was found.
); );
/// Get record count for a query result set. NOTE: This function ge nerates the query result set, counting the /// Get record count for a query result set. NOTE: This function ge nerates the query result set, counting the
/// records as it goes. Therefore, it may take a long time to compu te, depending on the size of the result /// records as it goes. Therefore, it may take a long time to compu te, depending on the size of the result
/// set and whether or not indexes can be used to optimize the query . /// set and whether or not indexes can be used to optimize the query .
/// \ingroup queryset /// \ingroup queryret
FLMEXP RCODE FLMAPI FlmCursorRecCount( FLMEXP RCODE FLMAPI FlmCursorRecCount(
HFCURSOR hCursor, ///< Handle to query object. HFCURSOR hCursor, ///< Handle to query object.
FLMUINT * puiCount ///< Count of records in the query result set is returned here. FLMUINT * puiCount ///< Count of records in the query result set is returned here.
); );
/// Determine the relative position of two records in a query's resu lt set. This only makes sense if the /// Determine the relative position of two records in a query's resu lt set. This only makes sense if the
/// query is optimized using an index. The function does the follow ing:\n /// query is optimized using an index. The function does the follow ing:\n
/// -# Reads the two records from the database /// -# Reads the two records from the database
/// -# Uses the query's index to get the index keys contained in the two records /// -# Uses the query's index to get the index keys contained in the two records
/// -# Compares the keys to determine which is greater /// -# Compares the keys to determine which is greater
 End of changes. 45 change blocks. 
93 lines changed or deleted 275 lines changed or added


 flaimtk.h   flaimtk.h 
//------------------------------------------------------------------------- ----- //------------------------------------------------------------------------- -----
// Desc: Placeholder for FLAIM's cross-platform toolkit public defini // Desc: FLAIM's cross-platform toolkit public definitions and interf
tions aces
// and interfaces
// //
// Tabs: 3 // Tabs: 3
// //
// Copyright (c) 2006 Novell, Inc. All Rights Reserved. // Copyright (c) 2003-2006 Novell, Inc. All Rights Reserved.
// //
// This program is free software; you can redistribute it and/o r // This program is free software; you can redistribute it and/o r
// modify it under the terms of version 2 of the GNU General Pu blic // modify it under the terms of version 2 of the GNU General Pu blic
// License as published by the Free Software Foundation. // License as published by the Free Software Foundation.
// //
// This program is distributed in the hope that it will be usef ul, // This program is distributed in the hope that it will be usef ul,
// but WITHOUT ANY WARRANTY; without even the implied warranty of // but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU General Public License for more details. // GNU General Public License for more details.
// //
// You should have received a copy of the GNU General Public Li cense // You should have received a copy of the GNU General Public Li cense
// along with this program; if not, contact Novell, Inc. // along with this program; if not, contact Novell, Inc.
// //
// To contact Novell about this file by physical or electronic mail, // To contact Novell about this file by physical or electronic mail,
// you may find current contact information at www.novell.com // you may find current contact information at www.novell.com
// //
// $Id$ // $Id$
//------------------------------------------------------------------------- ----- //------------------------------------------------------------------------- -----
#include "ftk.h" /// \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_PLA
T_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_LI
BC_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) || define
d( __sparc__)
#define FLM_SPARC
#define FLM_BIG_ENDIAN
#define FLM_STRICT_ALIGNMENT
#if !defined ( FLM_SPARC_GENERIC)
#if defined( __sparcv8plus) || defin
ed( __sparcv9) || defined( __sparcv9__) || \
defined( __sparc_v8__) || d
efined( __sparc_v9__) || defined( __arch64__)
#define FLM_SPARC_PLUS
#endif
#endif
#elif defined( __x86__) || defined( __i386__) || def
ined( __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) || defin
ed( __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( __s
parcv9__)
#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) && PREC
HECKIN != 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 FLMU
INT;
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 FLMINT
RCODE; ///< Return code
/// @}
typedef FLMINT
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( FL
M_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 defi
nitions
#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 decla
re
// 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(p
armN)))
#define f_va_arg(ap, type) \
(*(type *)(((ap) += f_argsize(type)) - (f_argsize(ty
pe))))
#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 interfac
es
#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 re
sults encountered.
#define NE_FLM_EXISTS
0xC004 ///< 0xC004 - Object al
ready 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 - Corruptio
n found in b-tree.
#define NE_FLM_BTREE_FULL
0xC013 ///< 0xC013 - B-tree ca
nnot grow beyond current size.
#define NE_FLM_CONV_DEST_OVERFLOW
0xC01C ///< 0xC01C - Destination buffer not la
rge enough to hold data.
#define NE_FLM_CONV_ILLEGAL
0xC01D ///< 0xC01D - Attempt to conver
t 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 - Corruptio
n found in b-tree.
#define NE_FLM_ILLEGAL_OP
0xC026 ///< 0xC026 - Illegal o
peration
#define NE_FLM_MEM
0xC037 ///< 0xC037 - A
ttempt to allocate memory failed.
#define NE_FLM_NOT_UNIQUE
0xC03E ///< 0xC03E - Non-uniqu
e key.
#define NE_FLM_SYNTAX
0xC045 ///< 0xC045 - Syntax er
ror 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 d
escriptor.
#define NE_FLM_IO_COPY_ERR
0xC203 ///< 0xC203 - Error occ
urred 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 reach
ed while reading from the file.
#define NE_FLM_IO_OPEN_ERR
0xC206 ///< 0xC206 - Error whi
le opening the file.
#define NE_FLM_IO_SEEK_ERR
0xC207 ///< 0xC207 - Error occ
urred while positioning (seeking) within a file.
#define NE_FLM_IO_DIRECTORY_ERR
0xC208 ///< 0xC208 - Error occurred while acce
ssing 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 director
y.
#define NE_FLM_IO_DELETING_FILE
0xC20D ///< 0xC20D - Error occurred while dele
ting a file.
#define NE_FLM_IO_FILE_LOCK_ERR
0xC20E ///< 0xC20E - Error attempting to acqui
re a byte-range lock on a file.
#define NE_FLM_IO_FILE_UNLOCK_ERR
0xC20F ///< 0xC20F - Error attempting to relea
se a byte-range lock on a file.
#define NE_FLM_IO_PATH_CREATE_FAILURE
0xC210 ///< 0xC210 - Error occurred while attempting t
o create a directory or sub-directory.
#define NE_FLM_IO_RENAME_FAILURE
0xC211 ///< 0xC211 - Error occurred wh
ile 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 sett
ing up to perform a file read operation.
#define NE_FLM_SETTING_UP_FOR_WRITE
0xC214 ///< 0xC214 - Error occurred while sett
ing 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 t
o access the file system.
#define NE_FLM_FLUSHING_FILE
0xC217 ///< 0xC217 - Error occurred wh
ile 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 rem
ote 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 c
hecking 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 n
ot yet completed
#define NE_FLM_ASYNC_FAILED
0xC22E ///< 0xC22E - An async I/O oper
ation 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 s
tream 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 invali
d 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 s
imple 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 e
ncountered.
#define NE_FLM_STREAM_EXISTS
0xC506 ///< 0xC506 - Stream file alrea
dy exists.
#define NE_FLM_MULTIPLE_MATCHES
0xC507 ///< 0xC507 - Multiple items matched bu
t only one match was expected.
#define NE_FLM_BTREE_KEY_SIZE
0xC508 ///< 0xC508 - Invalid b-tree ke
y size.
#define NE_FLM_BTREE_BAD_STATE
0xC509 ///< 0xC509 - B-tree operation cannot b
e 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 o
f 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 wai
ting 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 addres
s 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/I
P services on your system may not be configured or installed.
#define NE_FLM_LISTEN_FAIL
0xC904 ///< 0xC904 - TCP/IP li
sten failed
#define NE_FLM_ACCEPT_FAIL
0xC905 ///< 0xC905 - TCP/IP ac
cept failed
#define NE_FLM_SELECT_ERR
0xC906 ///< 0xC906 - TCP/IP se
lect failed
#define NE_FLM_SOCKET_SET_OPT_FAIL
0xC907 ///< 0xC907 - TCP/IP socket operation f
ailed
#define NE_FLM_SOCKET_DISCONNECT
0xC908 ///< 0xC908 - TCP/IP disconnect
ed
#define NE_FLM_SOCKET_READ_FAIL
0xC909 ///< 0xC909 - TCP/IP read failed
#define NE_FLM_SOCKET_WRITE_FAIL
0xC90A ///< 0xC90A - TCP/IP write fail
ed
#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 defa
ultRc);
/*******************************************************************
*********
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
********************************************************************
********/
/// \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|ex
tCh)
#define F_COLL_TRUNCATED
0x0C // This key piece has been truncated from origi
nal
#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 diaere
sis
#define F_GACTDIA
85 // acute diaere
sis
#define F_GGRVDIA
86 // grave diaere
sis
#define F_GGRAVE
87 // greek grave
#define F_GCIRCM
88 // greek circum
flex
#define F_GSMOOTH
89 // smooth breat
hing
#define F_GROUGH
90 // rough breath
ing
#define F_GIOTA
91 // iota subscript
#define F_GSMACT
92 // smooth breat
hing acute
#define F_GRGACT
93 // rough breath
ing acute
#define F_GSMGRV
94 // smooth breat
hing grave
#define F_GRGGRV
95 // rough breath
ing grave
#define F_GSMCIR
96 // smooth breat
hing circumflex
#define F_GRGCIR
97 // rough breath
ing 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 io
ta
#define F_GRGCIO
108 // rough circumflex iot
a
#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 descen
der
#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 0x01
00
#define FLM_IO_NO_MISALIGNED 0x02
00
// 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 0xFF
FC0000
// 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
********************************************************************
********/
/// \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 compari
son.
#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 = Bla
ck
FLM_BLUE, ///<
1 = Blue
FLM_GREEN, ///<
2 = Green
FLM_CYAN, ///<
3 = Cyan
FLM_RED,
///< 4 = Red
FLM_MAGENTA, ///< 5 = Mag
enta
FLM_BROWN, ///<
6 = Brown
FLM_LIGHTGRAY, ///< 7 = Lig
ht Gray
FLM_DARKGRAY, ///< 8 = Dar
k Gray
FLM_LIGHTBLUE, ///< 9 = Lig
ht Blue
FLM_LIGHTGREEN, ///< 10 = Light Gree
n
FLM_LIGHTCYAN, ///< 11 = Li
ght Cyan
FLM_LIGHTRED, ///< 12 = Li
ght Red
FLM_LIGHTMAGENTA, ///< 13 = Li
ght 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_BACK
COLOR
#define F_POPCOLOR F_POP_FORECOLOR F_POP_BACKCO
LOR
/*******************************************************************
*********
/// 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 informatio
n 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 th
e 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 fro
m.\ 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.\ I
t
/// provides methods for reference counting (AddRef, Release) as wel
l 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 r
eferencing 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 r
eferencing 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 i
s 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 clas
s (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 nu
mber. 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 i
s made.
#ifndef FLM_WATCOM_NLM
throw()
#endif
;
/// Overloaded new operator (array) for objects of this clas
s.
/// 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 c
lass.
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 (wi
th 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 c
lass (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 * puiThreadGro
up,
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 uiBytesToRea
d,
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 ** ppucAllocate
dBuffer = 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 uiBytesToRea
d,
FLMUINT * puiBytesRead
) = 0;
virtual const FLMBYTE * FLMAPI getBufferAtCurrentOffset( voi
d) = 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 bTruncateIfE
xists,
IF_OStream ** ppOStream);
RCODE FLMAPI FlmOpenMultiFileOStream(
const char * pszDirectory,
const char * pszBaseName,
FLMUINT uiMaxFileSiz
e,
FLMBOOL bOkToOverwri
te,
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 bUnicodeStre
am,
FLMUINT uiLanguage,
FLMUINT uiCompareRul
es,
FLMBOOL bMayHaveWild
Cards) = 0;
virtual RCODE FLMAPI closeStream( void) = 0;
virtual RCODE FLMAPI read(
void * pvBuffer,
FLMUINT uiBytesToRea
d,
FLMUINT * puiBytesRead
) = 0;
virtual RCODE FLMAPI read(
FLMBOOL bAllowTwoInt
oOne,
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 uiBytesToWri
te,
FLMUINT * puiBytesWrit
ten = NULL) = 0;
virtual RCODE FLMAPI closeStream( void) = 0;
};
/*******************************************************************
*********
Desc:
********************************************************************
********/
flminterface FLMEXP IF_IOStream : public IF_IStream, public IF_OStre
am
{
#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 admini
strator.
F_WARN_MESSAGE, ///< Warning message
.
F_ERR_MESSAGE, ///< Non-fat
al error message.
F_INFO_MESSAGE, ///< Information-onl
y 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_MESSA
GE) = 0;
};
void f_setLoggerClient(
IF_LoggerClient * pLogger);
/*******************************************************************
*********
/// This is an abstract base class that allows an application to cat
ch
/// messages. The application must create an implementation for thi
s 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 call
ed
/// multiple times by to format a complete message. The mes
sage 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 embedd
ing a
/// newline character, this method is used. This allows an
application
/// to recognize the fact that there are multiple lines in t
he message
/// and to log, display, store, etc. (whatever) them accordi
ngly.
virtual void FLMAPI newline( void) = 0;
/// End the current message. The application should finish
logging,
/// displaying, storing, etc. (whatever) the message. The o
bject
/// should be reset in case a new message is subsequently st
arted.
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 = FAL
SE) = 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 * pui64FileSiz
e) = 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 * pui64BytesCo
pied) = 0;
virtual RCODE FLMAPI copyPartialFile(
IF_FileHdl * pSrcFileHdl,
FLMUINT64 ui64SrcOffse
t,
FLMUINT64 ui64SrcSize,
IF_FileHdl * pDestFileHdl,
FLMUINT64 ui64DestOffs
et,
FLMUINT64 * pui64BytesCo
piedRV) = 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 * puiSectorSiz
e) = 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 uiMaxCachedF
iles,
FLMUINT uiIdleTimeou
tSecs,
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 ui64ReadOffs
et,
FLMUINT uiBytesToRea
d,
IF_IOBuffer * pIOBuffer) = 0;
virtual RCODE FLMAPI write(
FLMUINT64 ui64Offset,
FLMUINT uiLength,
const void * pvBuffer,
FLMUINT * puiBytesWrit
ten = NULL) = 0;
virtual RCODE FLMAPI write(
FLMUINT64 ui64WriteOff
set,
FLMUINT uiBytesToWri
te,
IF_IOBuffer * pIOBuffer) = 0;
virtual RCODE FLMAPI seek(
FLMUINT64 ui64Offset,
FLMINT iWhence,
FLMUINT64 * pui64NewOffs
et = 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 uiMaxAutoExt
endSize) = 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 uiMaxOpenFil
es) = 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 * puiBytesWrit
ten = NULL) = 0;
virtual RCODE FLMAPI getPath(
char * pszFilePath)
= 0;
virtual RCODE FLMAPI size(
FLMUINT64 * pui64FileSiz
e) = 0;
virtual RCODE FLMAPI truncateFile(
FLMUINT64 ui64Offset =
0) = 0;
virtual void FLMAPI closeFile(
FLMBOOL bDelete = FA
LSE) = 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 * pFileHdlCach
e,
FLMUINT uiFi
leOpenFlags,
FLMUINT uiFi
leCreateFlags);
RCODE FLMAPI createFile(
FLMUINT uiFileNumber
,
IF_FileHdl ** ppFileHdl = NULL);
RCODE FLMAPI getFileHdl(
FLMUINT uiFileNumber
,
FLMBOOL bGetForUpdat
e,
IF_FileHdl ** ppFileHdlRV);
RCODE FLMAPI readBlock(
FLMUINT uiBlkAddress
,
FLMUINT uiBytesToRea
d,
void * pvBuffer,
FLMUINT * puiBytesRead
);
RCODE FLMAPI writeBlock(
FLMUINT uiBlkAddress
,
FLMUINT uiBytesToWri
te,
const void * pvBuffer,
FLMUINT * puiBytesWrit
ten);
RCODE FLMAPI writeBlock(
FLMUINT uiBlkAddress
,
FLMUINT uiBytesToWri
te,
IF_IOBuffer * pIOBuffer);
RCODE FLMAPI getFilePath(
FLMUINT uiFileNumber
,
char * pszPath);
RCODE FLMAPI getFileSize(
FLMUINT uiFileNumber
,
FLMUINT64 * pui64FileSiz
e);
RCODE FLMAPI releaseFiles( void);
RCODE FLMAPI allocateBlocks(
FLMUINT uiStartAddre
ss,
FLMUINT uiEndAddress
);
RCODE FLMAPI truncateFile(
FLMUINT uiEOFBlkAddr
ess);
RCODE FLMAPI truncateFile(
FLMUINT uiFileNumber
,
FLMUINT uiOffset);
void FLMAPI truncateFiles(
FLMUINT uiStartFileN
um,
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_bCFileDirt
y;
FLMBOOL m_bBlockFile
Dirty;
FLMUINT m_uiBlockFil
eNum;
FLMUINT m_uiMaxFileS
ize;
FLMUINT m_uiExtendSi
ze;
FLMUINT m_uiMaxAutoE
xtendSize;
FLMUINT m_uiFileOpen
Flags;
FLMUINT m_uiFileCrea
teFlags;
};
/*******************************************************************
*********
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 * pAsy
ncClient) = 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 * piCo
mpare) = 0;
};
/*******************************************************************
*********
Desc:
********************************************************************
********/
flminterface FLMEXP IF_ResultSetSortStatus : public F_Object
{
virtual RCODE FLMAPI reportSortStatus(
FLMUINT64 ui64EstTotal
Units,
FLMUINT64 ui64UnitsDon
e) = 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 uiEn
trySize,
FLMBOOL bDro
pDuplicates = TRUE,
FLMBOOL bEnt
riesInOrder = FALSE,
const char * pszFileName
= NULL) = 0;
virtual FLMUINT64 FLMAPI getTotalEntries( void) = 0;
virtual RCODE FLMAPI addEntry(
const void * pvEntry,
FLMUINT uiEntryLengt
h = 0) = 0;
virtual RCODE FLMAPI finalizeResultSet(
IF_ResultSetSortStatus * pSortStatus = NULL,
FLMUINT64 *
pui64TotalEntries = NULL) = 0;
virtual RCODE FLMAPI getFirst(
void * pvEntryBuffe
r,
FLMUINT uiBufferLeng
th = 0,
FLMUINT * puiEntryLeng
th = NULL) = 0;
virtual RCODE FLMAPI getNext(
void * pvEntryBuffe
r,
FLMUINT uiBufferLeng
th = 0,
FLMUINT * puiEntryLeng
th = NULL) = 0;
virtual RCODE FLMAPI getLast(
void * pvEntryBuffe
r,
FLMUINT uiBufferLeng
th = 0,
FLMUINT * puiEntryLeng
th = NULL) = 0;
virtual RCODE FLMAPI getPrev(
void * pvEntryBuffe
r,
FLMUINT uiBufferLeng
th = 0,
FLMUINT * puiEntryLeng
th = NULL) = 0;
virtual RCODE FLMAPI getCurrent(
void * pvEntryBuffe
r,
FLMUINT uiBufferLeng
th = 0,
FLMUINT * puiEntryLeng
th = NULL) = 0;
virtual RCODE FLMAPI findMatch(
const void * pvMatchEntry,
void * pvFoundEntry
) = 0;
virtual RCODE FLMAPI findMatch(
const void * pvMatchEntry,
FLMUINT uiMatchEntry
Length,
void * pvFoundEntry
,
FLMUINT * puiFoundEntr
yLength) = 0;
virtual RCODE FLMAPI modifyCurrent(
const void * pvEntry,
FLMUINT uiEntryLengt
h = 0) = 0;
virtual FLMUINT64 FLMAPI getPosition( void) = 0;
virtual RCODE FLMAPI setPosition(
FLMUINT64 ui64Position
) = 0;
virtual RCODE FLMAPI resetResultSet(
FLMBOOL bDelete = TR
UE) = 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 uiEntryLengt
h) = 0;
virtual RCODE FLMAPI modifyEntry(
FLMBYTE * pucKey,
FLMUINT uiKeyLength,
FLMBYTE * pucEntry,
FLMUINT uiEntryLengt
h) = 0;
virtual RCODE FLMAPI getCurrent(
FLMBYTE * pucKey,
FLMUINT uiKeyLength,
FLMBYTE * pucEntry,
FLMUINT uiEntryLengt
h,
FLMUINT * puiReturnLen
gth) = 0;
virtual RCODE FLMAPI getNext(
FLMBYTE * pucKey,
FLMUINT uiKeyBufLen,
FLMUINT * puiKeylen,
FLMBYTE * pucBuffer,
FLMUINT uiBufferLeng
th,
FLMUINT * puiReturnLen
gth) = 0;
virtual RCODE FLMAPI getPrev(
FLMBYTE * pucKey,
FLMUINT uiKeyBufLen,
FLMUINT * puiKeylen,
FLMBYTE * pucBuffer,
FLMUINT uiBufferLeng
th,
FLMUINT * puiReturnLen
gth) = 0;
virtual RCODE FLMAPI getFirst(
FLMBYTE * pucKey,
FLMUINT uiKeyBufLen,
FLMUINT * puiKeylen,
FLMBYTE * pucBuffer,
FLMUINT uiBufferLeng
th,
FLMUINT * puiReturnLen
gth) = 0;
virtual RCODE FLMAPI getLast(
FLMBYTE * pucKey,
FLMUINT uiKeyBufLen,
FLMUINT * puiKeylen,
FLMBYTE * pucBuffer,
FLMUINT uiBufferLeng
th,
FLMUINT * puiReturnLen
gth) = 0;
virtual RCODE FLMAPI findEntry(
FLMBYTE * pucKey,
FLMUINT uiKeyBufLen,
FLMUINT * puiKeylen,
FLMBYTE * pucBuffer,
FLMUINT uiBufferLeng
th,
FLMUINT * puiReturnLen
gth) = 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 = F
LM_MAX_RANDOM) = 0;
virtual FLMBOOL FLMAPI getBoolean( void) = 0;
};
RCODE FLMAPI FlmAllocRandomGenerator(
IF_RandomGenerator ** ppRandomGenerator);
FLMUINT32 FLMAPI f_getRandomUINT32(
FLMUINT32 ui32Low = 0,
FLMUINT32 ui32High = F
LM_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 i32N
ewVal);
/*******************************************************************
*********
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 fil
led 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 noti
fyRc);
/*******************************************************************
*********
Desc: Reader / Writer Locks
********************************************************************
********/
typedef void * F_RWLOCK;
#define F_RWLOCK_NULL NULL
RCODE FLMAPI f_rwlockCreate(
F_RWLOCK * phReadWriteL
ock);
void FLMAPI f_rwlockDestroy(
F_RWLOCK * phReadWriteL
ock);
RCODE FLMAPI f_rwlockAcquire(
F_RWLOCK hRea
dWriteLock,
F_SEM hSem
,
FLMBOOL bWriter);
RCODE FLMAPI f_rwlockPromote(
F_RWLOCK hRea
dWriteLock,
F_SEM hSem
);
RCODE FLMAPI f_rwlockRelease(
F_RWLOCK hRea
dWriteLock);
/*******************************************************************
*********
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 uiThreadGrou
p = 0,
FLMUINT uiAppId = 0,
void * pvParm1 = NU
LL,
void * pvParm2 = NU
LL,
FLMUINT uiStackSize
= F_THREAD_DEFAULT_STACK_SIZE) = 0;
virtual void FLMAPI shutdownThreadGroup(
FLMUINT uiThreadGrou
p) = 0;
virtual void FLMAPI setThreadShutdownFlag(
FLMUINT uiThreadId)
= 0;
virtual RCODE FLMAPI findThread(
IF_Thread ** ppThread,
FLMUINT uiThreadGrou
p,
FLMUINT uiAppId = 0,
FLMBOOL bOkToFindMe
= TRUE) = 0;
virtual RCODE FLMAPI getNextGroupThread(
IF_Thread ** ppThread,
FLMUINT uiThreadGrou
p,
FLMUINT * puiThreadId)
= 0;
virtual RCODE FLMAPI getThreadInfo(
F_Pool * pPoo
l,
F_THREAD_INFO ** ppThreadInfo,
FLMUINT * puiNumThread
s) = 0;
virtual RCODE FLMAPI getThreadName(
FLMUINT uiThreadId,
char * pszThreadNam
e,
FLMUINT * puiLength) =
0;
virtual FLMUINT FLMAPI getThreadGroupCount(
FLMUINT uiThreadGrou
p) = 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 uiThreadGrou
p = F_DEFAULT_THREAD_GROUP,
FLMUINT uiAppId = 0,
void * pvParm1 = NU
LL,
void * pvParm2 = NU
LL,
FLMUINT uiStackSize = F_THREAD_DEFAU
LT_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 uiMillisecon
ds) = 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_DE
FAULT_THREAD_GROUP,
FLMUINT uiAppId = 0,
void * pvParm1 = NULL,
void * pvParm2 = NULL,
FLMUINT uiStackSize = F_THRE
AD_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 uiPa
ramVal) = 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 * pszSerialNum
ber);
#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 = NUL
L,
FLMUINT * puiXOR = NUL
L);
FLMBYTE FLMAPI f_calcPacketChecksum(
const void * pvPacket,
FLMUINT uiBytesToChe
cksum);
/*******************************************************************
*********
Desc:
********************************************************************
********/
char * FLMAPI f_uwtoa(
FLMUINT16 value,
char * ptr);
char * FLMAPI f_udtoa(
FLMUINT value,
char * ptr);
char * FLMAPI f_wtoa(
FLMINT16 valu
e,
char * ptr);
char * FLMAPI f_dtoa(
FLMINT value,
char * ptr);
char * FLMAPI f_ui64toa(
FLMUINT64 value,
char * ptr);
char * FLMAPI f_i64toa(
FLMINT64 valu
e,
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 bAllowUnpref
ixedHex = 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 uiCompareRul
es);
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 * pui16BaseCha
r,
FLMUINT16 * pui16Diacrit
icChar);
FLMBOOL FLMAPI f_combineWPChar(
FLMUINT16 * pui16WpChar,
FLMUINT16 ui16BaseChar
,
FLMINT16 ui16
DiacriticChar);
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 bUnicodeStre
am,
FLMBOOL bAllowTwoInt
oOne,
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 ui16NextWpCh
ar,
FLMUINT16 * pui16Zenkaku
);
FLMUINT16 FLMAPI f_wpZenToHankaku(
FLMUINT16 ui16WpChar,
FLMUINT16 * pui16DakutenOrHandak
uten);
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 * puiUnconvCha
rs,
FLMBOOL * pbDataTrunca
ted,
FLMBOOL * pbFirstSubst
ring);
RCODE FLMAPI f_colStr2WPStr(
const FLMBYTE * pucColStr,
FLMUINT uiColStrLen,
FLMBYTE * pucWPStr,
FLMUINT * puiWPStrLen,
FLMUINT uiLang,
FLMUINT * puiUnconvCha
rs,
FLMBOOL * pbDataTrunca
ted,
FLMBOOL * pbFirstSubst
ring);
RCODE FLMAPI f_asiaUTF8ToColText(
IF_PosIStream * pIStream,
FLMBYTE * pucColStr,
FLMUINT * puiColStrLen
,
FLMBOOL bCaseInsensi
tive,
FLMUINT * puiCollation
Len,
FLMUINT * puiCaseLen,
FLMUINT uiCharLimit,
FLMBOOL bFirstSubstr
ing,
FLMBOOL bDataTruncat
ed,
FLMBOOL * pbDataTrunca
ted);
RCODE FLMAPI f_compareUTF8Strings(
const FLMBYTE * pucLString,
FLMUINT uiLStrBytes,
FLMBOOL bLeftWild,
const FLMBYTE * pucRString,
FLMUINT uiRStrBytes,
FLMBOOL bRightWild,
FLMUINT uiCompareRul
es,
FLMUINT uiLanguage,
FLMINT * piRe
sult);
RCODE FLMAPI f_compareUTF8Streams(
IF_PosIStream * pLStream,
FLMBOOL bLeftWild,
IF_PosIStream * pRStream,
FLMBOOL bRightWild,
FLMUINT uiCompareRul
es,
FLMUINT uiLanguage,
FLMINT * piRe
sult);
RCODE FLMAPI f_compareUnicodeStrings(
const FLMUNICODE * puzLString,
FLMUINT uiLStrBytes,
FLMBOOL bLeftWild,
const FLMUNICODE * puzRString,
FLMUINT uiRStrBytes,
FLMBOOL bRightWild,
FLMUINT uiCompareRul
es,
FLMUINT uiLanguage,
FLMINT * piRe
sult);
RCODE FLMAPI f_compareUnicodeStreams(
IF_PosIStream * pLStream,
FLMBOOL bLeftWild,
IF_PosIStream * pRStream,
FLMBOOL bRightWild,
FLMUINT uiCompareRul
es,
FLMUINT uiLanguage,
FLMINT * piRe
sult);
RCODE FLMAPI f_compareCollStreams(
IF_CollIStream * pLStream,
IF_CollIStream * pRStream,
FLMBOOL bOpIsMatch,
FLMUINT uiLanguage,
FLMINT * piRe
sult);
RCODE FLMAPI f_utf8IsSubStr(
const FLMBYTE * pszString,
const FLMBYTE * pszSubString,
FLMUINT uiCompareRul
es,
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 bAllowEscape
s,
FLMUINT uiCompareRul
es,
F_DynaBuf * pDynaBuf);
RCODE FLMAPI f_getNextMetaphone(
IF_IStream * pIStream,
FLMUINT * puiMetaphone
,
FLMUINT * puiAltMetaph
one = NULL);
FLMUINT FLMAPI f_getSENLength(
FLMBYTE ucBy
te);
FLMUINT FLMAPI f_getSENByteCount(
FLMUINT64 ui64Num);
FLMUINT FLMAPI f_encodeSEN(
FLMUINT64 ui64Value,
FLMBYTE ** ppucBuffer,
FLMUINT uiBytesWante
d = 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 > MA
X_LOG_BUF_CHARS)
{
uiTmpCount = MAX_LOG_BUF_CHA
RS - m_uiCharOffset;
}
f_memset( &m_szLogBuf [m_uiCharOffse
t], cChar, uiTmpCount);
m_uiCharOffset += uiTmpCount;
m_uiNumLogChars += uiTmpCount;
uiCount -= uiTmpCount;
if (m_uiCharOffset == MAX_LOG_BUF_CH
ARS)
{
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_uiCharOffse
t], pszStr, uiTmpLen);
m_uiCharOffset += uiTmpLen;
m_uiNumLogChars += uiTmpLen;
uiLen -= uiTmpLen;
pszStr += uiTmpLen;
if (m_uiCharOffset == MAX_LOG_BUF_CH
ARS)
{
outputLogBuffer();
}
}
}
}
// Variables used to do the printf stuff
char m_sz
LogBuf [MAX_LOG_BUF_CHARS + 1];
FLMUINT m_uiNumLogCh
ars;
FLMUINT m_uiCharOffs
et;
char * m_pszDestStr
;
IF_LogMessageClient * m_pLogMsg;
eColorType m_eCurrentFo
reColor;
eColorType m_eCurrentBa
ckColor;
};
/*******************************************************************
*********
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 uiPoolBlockS
ize) = 0;
virtual RCODE FLMAPI getNextTagTypeAndNumOrder(
FLMUINT uiType,
FLMUINT * puiNextPos,
FLMUNICODE * puzTagName = NULL,
char * pszTagName =
NULL,
FLMUINT uiNameBufSiz
e = 0,
FLMUINT * puiTagNum =
NULL,
FLMUINT * puiDataType
= NULL,
FLMUNICODE * puzNamespace = NULL,
FLMUINT uiNamespaceB
ufSize = 0,
FLMBOOL bTruncatedNa
mesOk = TRUE) = 0;
virtual RCODE FLMAPI getNextTagTypeAndNameOrder(
FLMUINT uiType,
FLMUINT * puiNextPos,
FLMUNICODE * puzTagName = NULL,
char * pszTagName =
NULL,
FLMUINT uiNameBufSiz
e = 0,
FLMUINT * puiTagNum =
NULL,
FLMUINT * puiDataType
= NULL,
FLMUNICODE * puzNamespace = NULL,
FLMUINT uiNamespaceB
ufSize = 0,
FLMBOOL bTruncatedNa
mesOk = TRUE) = 0;
virtual RCODE FLMAPI getFromTagTypeAndName(
FLMUINT uiType,
const FLMUNICODE * puzTagName,
const char * pszTagName,
FLMBOOL bMatchNamesp
ace,
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 * puiNameBufSi
ze = NULL,
FLMUINT * puiDataType
= NULL,
FLMUNICODE * puzNamespace = NULL,
char * pszNamespace
= NULL,
FLMUINT * puiNamespace
BufSize = NULL,
FLMBOOL bTruncatedNa
mesOk = TRUE) = 0;
virtual RCODE FLMAPI addTag(
FLMUINT uiType,
FLMUNICODE * puzTagName,
const char * pszTagName,
FLMUINT uiTagNum,
FLMUINT uiDataType =
0,
FLMUNICODE * puzNamespace = NULL,
FLMBOOL bCheckDuplic
ates = 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 uiBlocksDele
ted,
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 uiPr
eallocSize) = 0;
virtual RCODE FLMAPI allocSlab(
void ** ppSlab) = 0;
virtual void FLMAPI freeSlab(
void ** ppSlab) = 0;
virtual RCODE FLMAPI resize(
FLMUINT uiNu
mBytes,
FLMBOOL bPreallocate
,
FLMUINT * puiActualSiz
e = 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 alloca
tions
of a fixed size.
********************************************************************
********/
flminterface FLMEXP IF_FixedAlloc : public F_Object
{
virtual RCODE FLMAPI setup(
FLMBOOL bMultiThread
ed,
IF_SlabManager * pSlabManager,
IF_Relocator * pDefaultRelocator,
FLMUINT uiCellSize,
FLM_SLAB_USAGE * pUsageStats,
FLMUINT * puiTotalByte
sAllocated) = 0;
virtual void * FLMAPI allocCell(
IF_Relocator * pRelocator,
void * pvInitialDat
a,
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 bMultiThread
ed,
IF_SlabManager * pSlabManager,
IF_Relocator * pRelocator,
FLMUINT uiBlockSize,
FLM_SLAB_USAGE * pUsageStats,
FLMUINT * puiTotalByte
sAllocated) = 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 bMultiThread
ed,
IF_SlabManager * pSlabManager,
IF_Relocator * pDefaultRelocator,
FLM_SLAB_USAGE * pUsageStats,
FLMUINT * puiTotalByte
sAllocated) = 0;
virtual RCODE FLMAPI allocBuf(
IF_Relocator * pRelocator,
FLMUINT uiSize,
void * pvInitialDat
a,
FLMUINT uiDataSize,
FLMBYTE ** ppucBuffer,
FLMBOOL * pbAllocatedO
nHeap = NULL) = 0;
virtual RCODE FLMAPI allocBuf(
IF_Relocator * pRelocator,
FLMUINT uiSize,
F_ALLOC_INIT_FUNC fnAllocInit,
FLMBYTE ** ppucBuffer,
FLMBOOL * pbAllocatedO
nHeap = NULL) = 0;
virtual RCODE FLMAPI reallocBuf(
IF_Relocator * pRelocator,
FLMUINT uiOldSize,
FLMUINT uiNewSize,
void * pvInitialDat
a,
FLMUINT uiDataSize,
FLMBYTE ** ppucBuffer,
FLMBOOL * pbAllocatedO
nHeap = 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 bMultiThread
ed,
IF_SlabManager * pSlabManager,
IF_Relocator * pDefaultRelocator,
FLMUINT * puiCellSizes
,
FLM_SLAB_USAGE * pUsageStats,
FLMUINT * puiTotalByte
sAllocated) = 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 ui16
BtreeId,
FLMBOOL bCou
nts,
FLMBOOL bDat
a,
FLMUINT32 * pui3
2RootBlockId) = 0;
virtual RCODE FLMAPI btOpen(
FLMUINT32 ui32
RootBlockId,
FLMBOOL bCou
nts,
FLMBOOL bDat
a,
IF_ResultSetCompare * pCompare = NULL) = 0;
virtual void FLMAPI btClose( void) = 0;
virtual RCODE FLMAPI btDeleteTree(
IF_DeleteStatus * ifpDeleteSta
tus = NULL) = 0;
virtual RCODE FLMAPI btGetBlockChains(
FLMUINT * puiB
lockChains,
FLMUINT * puiN
umLevels) = 0;
virtual RCODE FLMAPI btRemoveEntry(
const FLMBYTE * pucKey,
FLMUINT uiKe
yBufSize,
FLMUINT uiKe
yLen) = 0;
virtual RCODE FLMAPI btInsertEntry(
const FLMBYTE * pucKey,
FLMUINT uiKe
yBufSize,
FLMUINT uiKe
yLen,
const FLMBYTE * pucData,
FLMUINT uiDa
taLen,
FLMBOOL bFir
st,
FLMBOOL bLas
t,
FLMUINT32 * pui3
2BlockId = NULL,
FLMUINT * puiO
ffsetIndex = NULL) = 0;
virtual RCODE FLMAPI btReplaceEntry(
const FLMBYTE * pucKey,
FLMUINT uiKe
yBufSize,
FLMUINT uiKe
yLen,
const FLMBYTE * pucData,
FLMUINT uiDa
taLen,
FLMBOOL bFir
st,
FLMBOOL bLas
t,
FLMBOOL bTru
ncate = TRUE,
FLMUINT32 * pui3
2BlockId = NULL,
FLMUINT * puiO
ffsetIndex = NULL) = 0;
virtual RCODE FLMAPI btLocateEntry(
FLMBYTE * pucK
ey,
FLMUINT uiKe
yBufSize,
FLMUINT * puiK
eyLen,
FLMUINT uiMa
tch,
FLMUINT * puiP
osition = NULL,
FLMUINT * puiD
ataLength = NULL,
FLMUINT32 * pui3
2BlockId = NULL,
FLMUINT * puiO
ffsetIndex = NULL) = 0;
virtual RCODE FLMAPI btGetEntry(
FLMBYTE * pucK
ey,
FLMUINT uiKe
yLen,
FLMBYTE * pucD
ata,
FLMUINT uiDa
taBufSize,
FLMUINT * puiD
ataLen) = 0;
virtual RCODE FLMAPI btNextEntry(
FLMBYTE * pucK
ey,
FLMUINT uiKe
yBufSize,
FLMUINT * puiK
eyLen,
FLMUINT * puiD
ataLength = NULL,
FLMUINT32 * pui3
2BlockId = NULL,
FLMUINT * puiO
ffsetIndex = NULL) = 0;
virtual RCODE FLMAPI btPrevEntry(
FLMBYTE * pucK
ey,
FLMUINT uiKe
yBufSize,
FLMUINT * puiK
eyLen,
FLMUINT * puiD
ataLength = NULL,
FLMUINT32 * pui3
2BlockId = NULL,
FLMUINT * puiO
ffsetIndex = NULL) = 0;
virtual RCODE FLMAPI btFirstEntry(
FLMBYTE * pucK
ey,
FLMUINT uiKe
yBufSize,
FLMUINT * puiK
eyLen,
FLMUINT * puiD
ataLength = NULL,
FLMUINT32 * pui3
2BlockId = NULL,
FLMUINT * puiO
ffsetIndex = NULL) = 0;
virtual RCODE FLMAPI btLastEntry(
FLMBYTE * pucK
ey,
FLMUINT uiKe
yBufSize,
FLMUINT * puiK
eyLen,
FLMUINT * puiD
ataLength = NULL,
FLMUINT32 * pui3
2BlockId = NULL,
FLMUINT * puiO
ffsetIndex = NULL) = 0;
virtual RCODE FLMAPI btSetReadPosition(
FLMBYTE * pucK
ey,
FLMUINT uiKe
yLen,
FLMUINT uiPo
sition) = 0;
virtual RCODE FLMAPI btGetReadPosition(
FLMUINT * puiP
osition) = 0;
virtual RCODE FLMAPI btPositionTo(
FLMUINT uiPo
sition,
FLMBYTE * pucK
ey,
FLMUINT uiKe
yBufSize,
FLMUINT * puiK
eyLen) = 0;
virtual RCODE FLMAPI btGetPosition(
FLMUINT * puiP
osition) = 0;
virtual RCODE FLMAPI btRewind( void) = 0;
// virtual RCODE FLMAPI btComputeCounts(
// IF_BTree * pUnt
ilBtree,
// FLMUINT * puiB
lockCount,
// FLMUINT * puiK
eyCount,
// FLMBOOL * pbTo
talsEstimated,
// FLMUINT uiAv
gBlockFullness) = 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 ** ppBt
ree);
/*******************************************************************
*********
Desc: This class is used to do pool memory allocations.
********************************************************************
********/
/// Header for blocks in a memory pool. This structure is at the he
ad 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 s
ize 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 n
umber 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 b
locks 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 remembe
rs a location in the
/// pool which can later be passed to poolReset() to free al
l 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_uiBytesA
llocated) >= 0xFFFF0000)
{
m_pPoolStats->uiAllocBytes =
(m_pPoolStats->uiAllocBytes
/ m_pPoolStats->uiCount) * 100;
m_pPoolStats->uiCount = 100;
}
else
{
m_pPoolStats->uiAllocBytes += m_uiBy
tesAllocated;
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_pPoo
lStats->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), (v
oid **)&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_uiBufferSi
ze)))
{
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 * pucOriginalB
uf = 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, pucOr
iginalBuf, m_uiOffset);
}
}
}
else
{
if( RC_BAD( rc = f_realloc( uiNewSize, &m_pu
cBuffer)))
{
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 uiListNodeCn
t);
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_uiListNode
Cnt;
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) * uiLis
tNodeCnt );
}
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;
};
/// 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 mu
st
/// implement this class. A pointer to an object of this class is p
assed
/// 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 ther
e 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 applicatio
n 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. Th
is method
/// is called for each thread that is either holding the loc
k or waiting
/// to obtain the lock. The application should return TRUE
from this
/// method in order to continue, FALSE if it wants to stop a
nd 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 am
ount of time the thread
///< has been waiting to obtain the lock.\ Bot
h times are milliseconds.
) = 0;
};
/*******************************************************************
*******
/// Structure used in gathering statistics to hold an operation coun
t 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;
/*******************************************************************
*******
/// 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 th
e database.
} F_LOCK_STATS;
/*******************************************************************
*********
/// Structure that gives information on threads that are either wait
ing to
/// obtain a lock or have obtained a lock.
********************************************************************
********/
typedef struct
{
FLMUINT uiThreadId;
///< Thread id of thread that is waiting to obtain a lo
ck or holds a lock.
FLMUINT uiTime;
///< For lock holder, this is the time the lock was obt
ained.
///< For the lock waite
r, 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 hWai
tSem,
FLMBOOL bExclLock,
FLMUINT uiMaxWaitSec
s,
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 * peCurrLockTy
pe,
FLMUINT * puiThreadId,
FLMUINT * puiLockHeldT
ime = NULL,
FLMUINT * puiNumExclQu
eued = NULL,
FLMUINT * puiNumShared
Queued = NULL,
FLMUINT * puiPriorityC
ount = 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) * ui64Bounda
ry);
if( ui64RetVal < ui64ValueToRound)
{
ui64RetVal += ui64Boundary;
}
return( ui64RetVal);
}
FINLINE void f_setBit(
FLMBYTE * pucBuffer,
FLMUINT uiBit)
{
pucBuffer[ uiBit >> 3] |= (0x01 << (uiBit & 0x07));
}
FINLINE void f_clearBit(
FLMBYTE * pucBuffer,
FLMUINT uiBit)
{
pucBuffer[ uiBit >> 3] &= ~(0x01 << (uiBit & 0x07));
}
FINLINE FLMBOOL f_isBitSet(
FLMBYTE * pucBuffer,
FLMUINT uiBit)
{
return( (pucBuffer[ uiBit >> 3] & (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 0x00
2B
#define FKB_MINUS 0x00
2D
#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( voi
d)
{
f_assert( m_bIsOpen);
return( m_pucBuffer ? &m_pucBuffer[ m_uiOffset] : NU
LL);
}
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_PAT
H_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_SI
ZE + 1];
char m_szBaseName[ F_PATH_MAX_SIZ
E + 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_I
NSENSITIVE)
?
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 t
he
// leading spaces.
m_uNextChar = pPos->uNextChar;
flmAssert( pPos->ui64Position >= m_ui64EndOfLeadingS
pacesPos);
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, s
izeof( 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 * pvUs
erData)
{
m_fnCompare = fnCompare;
m_pvUserData = pvUserData;
}
protected:
F_DYNSET_COMPARE_FUNC m_fnCompare;
void * m_pvUserData
;
eDynRSetBlkTypes m_eBlkType;
FLMUINT m_uiEntrySiz
e;
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 * pszT
mpDir,
FLMUINT uiEn
trySize);
FINLINE void FLMAPI setCompareFunc(
F_DYNSET_COMPARE_FUNC fnCompare,
void * pvUs
erData)
{
m_fnCompare = fnCompare;
m_pvUserData = pvUserData;
m_pAccess->setCompareFunc( fnCompare, pvUserData);
}
RCODE FLMAPI addEntry(
void * pvEn
try);
FINLINE RCODE FLMAPI findMatch(
void * pvMa
tchEntry,
void * pvFo
undEntry)
{
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_uiEntrySiz
e;
F_FixedBlk * m_pAccess;
char m_sz
FileName[ 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 = F
ALSE);
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
 End of changes. 3 change blocks. 
4 lines changed or deleted 3 lines changed or added

This html diff was produced by rfcdiff 1.41. The latest version is available from http://tools.ietf.org/tools/rfcdiff/