Added support for collation.

git-svn-id: https://svn.code.sf.net/p/flaim/code/trunk@374 0109f412-320b-0410-ab79-c3e0c5ffbbe6
This commit is contained in:
ahodgkinson
2006-05-05 23:18:22 +00:00
parent 86bbf5f33d
commit 77111e2f97
5 changed files with 1471 additions and 290 deletions

View File

@@ -387,7 +387,6 @@
/****************************************************************************
Forward References
****************************************************************************/
flminterface IF_DataVector;
flminterface IF_DirHdl;
flminterface IF_FileHdl;
flminterface IF_FileSystem;
@@ -404,7 +403,7 @@
flminterface IF_IOBuffer;
/****************************************************************************
CROSS PLATFORM DEFINITIONS
Desc: Cross-platform definitions
****************************************************************************/
#ifndef NULL
@@ -418,10 +417,13 @@
#ifndef FALSE
#define FALSE 0
#endif
#define f_offsetof(s,m) \
(FLMSIZET)(FLMUINT)&(((s *)0)->m)
// Language definitions - to get rid of testing "US" or multiple bytes
// will define needed languages as a number with backward conversions.
// Keep these defines synchronized with the table in wps6cmpc.c
/****************************************************************************
Desc: Language constants
****************************************************************************/
#define FLM_US_LANG 0 // English, United States
#define FLM_AF_LANG 1 // Afrikaans
@@ -467,6 +469,23 @@
#define FLM_FIRST_DBCS_LANG (FLM_JP_LANG)
#define FLM_LAST_DBCS_LANG (FLM_LA_LANG)
/****************************************************************************
Desc: Collation flags and constants
****************************************************************************/
#define HAD_SUB_COLLATION 0x01 // Set if had sub-collating values-diacritics
#define HAD_LOWER_CASE 0x02 // Set if you hit a lowercase character
#define COLL_FIRST_SUBSTRING 0x03 // First substring marker
#define COLL_MARKER 0x04 // Marks place of sub-collation
#define SC_LOWER 0x00 // Only lowercase characters exist
#define SC_MIXED 0x01 // Lower/uppercase flags follow in next byte
#define SC_UPPER 0x02 // Only upper characters exist
#define SC_SUB_COL 0x03 // Sub-collation follows (diacritics|extCh)
#define COLL_TRUNCATED 0x0C // This key piece has been truncated from original
#define MAX_COL_OPCODE COLL_TRUNCATED
/****************************************************************************
Desc: I/O Flags
****************************************************************************/
@@ -492,6 +511,10 @@
#define FLM_MAXIMUM_FILE_SIZE 0xFFFC0000
// Maximum SEN (compressed number) length
#define FLM_MAX_SEN_LEN 9
// Retrieval flags
#define FLM_INCL 0x0010
@@ -932,6 +955,56 @@
IF_IStream * pIStream,
IF_OStream * pOStream);
/****************************************************************************
Desc:
****************************************************************************/
typedef struct
{
FLMUINT64 ui64Position;
FLMUNICODE uNextChar;
} F_CollStreamPos;
flminterface IF_CollIStream : public IF_PosIStream
{
virtual RCODE FLMAPI open(
IF_PosIStream * pIStream,
FLMBOOL bUnicodeStream,
FLMUINT uiLanguage,
FLMUINT uiCompareRules,
FLMBOOL bMayHaveWildCards) = 0;
virtual RCODE FLMAPI close( void) = 0;
virtual RCODE FLMAPI read(
void * pvBuffer,
FLMUINT uiBytesToRead,
FLMUINT * puiBytesRead) = 0;
virtual RCODE FLMAPI read(
FLMBOOL bAllowTwoIntoOne,
FLMUNICODE * puChar,
FLMBOOL * pbCharIsWild,
FLMUINT16 * pui16Col,
FLMUINT16 * pui16SubCol,
FLMBYTE * pucCase) = 0;
virtual FLMUINT64 FLMAPI totalSize( void) = 0;
virtual FLMUINT64 FLMAPI remainingSize( void) = 0;
virtual RCODE FLMAPI positionTo(
FLMUINT64 ui64Position) = 0;
virtual FLMUINT64 FLMAPI getCurrPosition( void) = 0;
virtual RCODE FLMAPI positionTo(
F_CollStreamPos * pPos) = 0;
virtual void FLMAPI getCurrPosition(
F_CollStreamPos * pPos) = 0;
};
/****************************************************************************
Desc:
****************************************************************************/
@@ -1888,16 +1961,183 @@
const FLMBYTE * pszUTF8,
FLMUINT * puiNumChars);
FLMBOOL FLMAPI f_isWhitespace(
FLMUNICODE ucChar);
FLMUNICODE FLMAPI f_convertChar(
FLMUNICODE uzChar,
FLMUINT uiCompareRules);
RCODE FLMAPI f_wpToUnicode(
FLMUINT16 ui16WPChar,
FLMUNICODE * puUniChar);
FLMBOOL FLMAPI f_unicodeToWP(
FLMUNICODE uUniChar,
FLMUINT16 * pui16WPChar);
RCODE FLMAPI f_wpCheckDoubleCollation(
IF_PosIStream * pIStream,
FLMBOOL bUnicodeStream,
FLMBOOL bAllowTwoIntoOne,
FLMUNICODE * puzChar,
FLMUNICODE * puzChar2,
FLMBOOL * pbTwoIntoOne,
FLMUINT uiLanguage);
RCODE FLMAPI f_asiaColStr2WPStr(
const FLMBYTE * pucColStr,
FLMUINT uiColStrLen,
FLMBYTE * pucWPStr,
FLMUINT * puiWPStrLen,
FLMUINT * puiUnconvChars,
FLMBOOL * pbDataTruncated,
FLMBOOL * pbFirstSubstring);
RCODE FLMAPI f_colStr2WPStr(
const FLMBYTE * pucColStr,
FLMUINT uiColStrLen,
FLMBYTE * pucWPStr,
FLMUINT * puiWPStrLen,
FLMUINT uiLang,
FLMUINT * puiUnconvChars,
FLMBOOL * pbDataTruncated,
FLMBOOL * pbFirstSubstring);
RCODE FLMAPI f_asiaUTF8ToColText(
IF_PosIStream * pIStream,
FLMBYTE * pucColStr,
FLMUINT * puiColStrLen,
FLMBOOL bCaseInsensitive,
FLMUINT * puiCollationLen,
FLMUINT * puiCaseLen,
FLMUINT uiCharLimit,
FLMBOOL bFirstSubstring,
FLMBOOL bDataTruncated,
FLMBOOL * pbDataTruncated);
RCODE FLMAPI f_compareUTF8Strings(
const FLMBYTE * pucLString,
FLMUINT uiLStrBytes,
FLMBOOL bLeftWild,
const FLMBYTE * pucRString,
FLMUINT uiRStrBytes,
FLMBOOL bRightWild,
FLMUINT uiCompareRules,
FLMUINT uiLanguage,
FLMINT * piResult);
RCODE FLMAPI f_compareUTF8Streams(
IF_PosIStream * pLStream,
FLMBOOL bLeftWild,
IF_PosIStream * pRStream,
FLMBOOL bRightWild,
FLMUINT uiCompareRules,
FLMUINT uiLanguage,
FLMINT * piResult);
RCODE FLMAPI f_compareUnicodeStrings(
const FLMUNICODE * puzLString,
FLMUINT uiLStrBytes,
FLMBOOL bLeftWild,
const FLMUNICODE * puzRString,
FLMUINT uiRStrBytes,
FLMBOOL bRightWild,
FLMUINT uiCompareRules,
FLMUINT uiLanguage,
FLMINT * piResult);
RCODE FLMAPI f_compareUnicodeStreams(
IF_PosIStream * pLStream,
FLMBOOL bLeftWild,
IF_PosIStream * pRStream,
FLMBOOL bRightWild,
FLMUINT uiCompareRules,
FLMUINT uiLanguage,
FLMINT * piResult);
RCODE FLMAPI f_compareCollStreams(
IF_CollIStream * pLStream,
IF_CollIStream * pRStream,
FLMBOOL bOpIsMatch,
FLMUINT uiLanguage,
FLMINT * piResult);
RCODE FLMAPI f_utf8IsSubStr(
const FLMBYTE * pszString,
const FLMBYTE * pszSubString,
FLMUINT uiCompareRules,
FLMUINT uiLanguage,
FLMBOOL * pbExists);
RCODE FLMAPI f_readUTF8CharAsUnicode(
IF_IStream * pStream,
FLMUNICODE * puChar);
RCODE FLMAPI f_readUTF8CharAsUTF8(
IF_IStream * pIStream,
FLMBYTE * pucBuf,
FLMUINT * puiLen);
RCODE FLMAPI f_formatUTF8Text(
IF_PosIStream * pIStream,
FLMBOOL bAllowEscapes,
FLMUINT uiCompareRules,
IF_DynaBuf * pDynaBuf);
RCODE FLMAPI f_getNextMetaphone(
IF_IStream * pIStream,
FLMUINT * puiMetaphone,
FLMUINT * puiAltMetaphone = NULL);
FLMUINT FLMAPI f_getSENLength(
FLMBYTE ucByte);
FLMUINT FLMAPI f_getSENByteCount(
FLMUINT64 ui64Num);
FLMUINT FLMAPI f_encodeSEN(
FLMUINT64 ui64Value,
FLMBYTE ** ppucBuffer,
FLMUINT uiBytesWanted = 0);
RCODE FLMAPI f_encodeSEN(
FLMUINT64 ui64Value,
FLMBYTE ** ppucBuffer,
FLMBYTE * pucEnd);
FLMUINT FLMAPI f_encodeSENKnownLength(
FLMUINT64 ui64Value,
FLMUINT uiSenLen,
FLMBYTE ** ppucBuffer);
RCODE FLMAPI f_decodeSEN(
const FLMBYTE ** ppucBuffer,
const FLMBYTE * pucEnd,
FLMUINT * puiValue);
RCODE FLMAPI f_decodeSEN64(
const FLMBYTE ** ppucBuffer,
const FLMBYTE * pucEnd,
FLMUINT64 * pui64Value);
RCODE FLMAPI f_readSEN(
IF_IStream * pIStream,
FLMUINT * puiValue,
FLMUINT * puiLength = NULL);
RCODE FLMAPI f_readSEN64(
IF_IStream * pIStream,
FLMUINT64 * pui64Value,
FLMUINT * puiLength = NULL);
FLMUINT FLMAPI f_languageToNum(
const char * pszLanguage);
void FLMAPI f_languageToStr(
FLMINT iLangNum,
char * pszLanguage);
/****************************************************************************
Desc: ASCII character constants and macros
****************************************************************************/
@@ -2736,8 +2976,6 @@
{
public:
virtual RCODE FLMAPI setup( void) = 0;
virtual FLMBOOL FLMAPI isPubidChar(
FLMUNICODE uChar) = 0;
@@ -2775,6 +3013,9 @@
FLMUNICODE * puzName,
FLMBYTE * pszName) = 0;
};
RCODE FLMAPI FlmGetXMLObject(
IF_XML ** ppXmlObject);
/****************************************************************************
Desc: Name table
@@ -3139,189 +3380,186 @@
const char * FLMAPI f_errorString(
RCODE rc);
/****************************************************************************
Desc: Key definitions
****************************************************************************/
#define FKB_ESCAPE 0xE01B /* Escape (ESC) */
#define FKB_ESC FKB_ESCAPE
#define FKB_SPACE 0x20
#define FKB_HOME 0xE008 /* HOME key */
#define FKB_UP 0xE017 /* Up arrow */
#define FKB_PGUP 0xE059 /* Page Up */
#define FKB_LEFT 0xE019 /* Left arrow */
#define FKB_RIGHT 0xE018 /* Right arrow */
#define FKB_END 0xE055 /* END key */
#define FKB_DOWN 0xE01A /* Down arrow */
#define FKB_PGDN 0xE05A /* Page Down */
#define FKB_PLUS 0x002B /* Plus (+) */
#define FKB_MINUS 0x002D /* Minus (-) */
#define FKB_INSERT 0xE05D /* Insert key */
#define FKB_DELETE 0xE051 /* Delete key */
#define FKB_BACKSPACE 0xE050 /* Backspace */
#define FKB_TAB 0xE009 /* TAB */
#define FKB_ENTER 0xE00a /* Enter */
#define FKB_F1 0xE020 /* F1 */
#define FKB_F2 0xE021 /* F2 */
#define FKB_F3 0xE022 /* F3 */
#define FKB_F4 0xE023 /* F4 */
#define FKB_F5 0xE024 /* F5 */
#define FKB_F6 0xE025 /* F6 */
#define FKB_F7 0xE026 /* F7 */
#define FKB_F8 0xE027 /* F8 */
#define FKB_F9 0xE028 /* F9 */
#define FKB_F10 0xE029 /* F10 */
#define FKB_F11 0xE03A /* F10 */
#define FKB_F12 0xE03B /* F10 */
#define FKB_STAB 0xE05E /* Shift TAB */
#define FKB_SF1 0xE02C /* F1 */
#define FKB_SF2 0xE02D /* F2 */
#define FKB_SF3 0xE02E /* F3 */
#define FKB_SF4 0xE02F /* F4 */
#define FKB_SF5 0xE030 /* F5 */
#define FKB_SF6 0xE031 /* F6 */
#define FKB_SF7 0xE032 /* F7 */
#define FKB_SF8 0xE033 /* F8 */
#define FKB_SF9 0xE034 /* F9 */
#define FKB_SF10 0xE035 /* F10 */
#define FKB_SF11 0xE036 /* F10 */
#define FKB_SF12 0xE037 /* F10 */
#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 /* ALT 1 */
#define FKB_ALT_2 0xFDF8 /* ALT 2 */
#define FKB_ALT_3 0xFDF9 /* ALT 3 */
#define FKB_ALT_4 0xFDFA /* ALT 4 */
#define FKB_ALT_5 0xFDFB /* ALT 5 */
#define FKB_ALT_6 0xFDFC /* ALT 6 */
#define FKB_ALT_7 0xFDFD /* ALT 7 */
#define FKB_ALT_8 0xFDFE /* ALT 8 */
#define FKB_ALT_9 0xFDFF /* ALT 9 */
#define FKB_ALT_0 0xFDF6 /* ALT 0 */
#define FKB_ALT_MINUS 0xE061 /* ALT MINUS */
#define FKB_ALT_EQUAL 0xE06B /* ALT EQUAL */
#define FKB_ALT_F1 0xE038 /* ALT F1 */
#define FKB_ALT_F2 0xE039 /* ALT F2 */
#define FKB_ALT_F3 0xE03A /* ALT F3 */
#define FKB_ALT_F4 0xE03B /* ALT F4 */
#define FKB_ALT_F5 0xE03C /* ALT F5 */
#define FKB_ALT_F6 0xE03D /* ALT F6 */
#define FKB_ALT_F7 0xE03E /* ALT F7 */
#define FKB_ALT_F8 0xE03F /* ALT F8 */
#define FKB_ALT_F9 0xE040 /* ALT F9 */
#define FKB_ALT_F10 0xE041 /* ALT F10 -F11,F12 NOT SUPPORTED*/
#define FKB_GOTO 0xE058 /* GOTO cntl-home */
#define FKB_CTRL_HOME 0xE058 /* CTRL Home */
#define FKB_CTRL_UP 0xE063 /* CTRL Up arrow */
#define FKB_CTRL_PGUP 0xE057 /* CTRL Page Up */
#define FKB_CTRL_LEFT 0xE054 /* CTRL Left arrow */
#define FKB_CTRL_RIGHT 0xE053 /* CTRL Right arrow */
#define FKB_CTRL_END 0xE00B /* CTRL END */
#define FKB_CTRL_DOWN 0xE064 /* CTRL Down arrow */
#define FKB_CTRL_PGDN 0xE00C /* CTRL Page Down */
#define FKB_CTRL_INSERT 0xE06E /* CTRL Insert */
#define FKB_CTRL_DELETE 0xE06D /* CTRL Delete */
#define FKB_CTRL_ENTER 0xE05F /* CTRL Enter */
#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 /* F1 - NOT SUPPORTED IN WP TO F10*/
#define FKB_CTRL_2 0xE06C /* F2 */
#define FKB_CTRL_3 0xE06D /* F3 */
#define FKB_CTRL_4 0xE06E /* F4 */
#define FKB_CTRL_5 0xE06F /* F5 */
#define FKB_CTRL_6 0xE070 /* F6 */
#define FKB_CTRL_7 0xE071 /* F7 */
#define FKB_CTRL_8 0xE072 /* F8 */
#define FKB_CTRL_9 0xE073 /* F9 */
#define FKB_CTRL_0 0xE074 /* F10 */
#define FKB_CTRL_MINUS 0xE060 /* MINUS */
#define FKB_CTRL_EQUAL 0xE061 /* EQUAL - NOT SUPPORTED IN WP */
#define FKB_CTRL_F1 0xE038 /* F1 */
#define FKB_CTRL_F2 0xE039 /* F2 */
#define FKB_CTRL_F3 0xE03A /* F3 */
#define FKB_CTRL_F4 0xE03B /* F4 */
#define FKB_CTRL_F5 0xE03C /* F5 */
#define FKB_CTRL_F6 0xE03D /* F6 */
#define FKB_CTRL_F7 0xE03E /* F7 */
#define FKB_CTRL_F8 0xE03F /* F8 */
#define FKB_CTRL_F9 0xE040 /* F9 */
#define FKB_CTRL_F10 0xE041 /* F10 */
/****************************************************************************
Desc: FTX
****************************************************************************/
#define FLM_CURSOR_BLOCK 0x01
#define FLM_CURSOR_UNDERLINE 0x02
#define FLM_CURSOR_INVISIBLE 0x04
#define FLM_CURSOR_VISIBLE 0x08
#define FKB_ESCAPE 0xE01B
#define FKB_ESC FKB_ESCAPE
#define FKB_SPACE 0x20
#define FKB_HOME 0xE008
#define FKB_UP 0xE017
#define FKB_PGUP 0xE059
#define FKB_LEFT 0xE019
#define FKB_RIGHT 0xE018
#define FKB_END 0xE055
#define FKB_DOWN 0xE01A
#define FKB_PGDN 0xE05A
#define FKB_PLUS 0x002B
#define FKB_MINUS 0x002D
#define FKB_INSERT 0xE05D
#define FKB_DELETE 0xE051
#define FKB_BACKSPACE 0xE050
#define FKB_TAB 0xE009
#define FKB_ENTER 0xE00A
#define FKB_F1 0xE020
#define FKB_F2 0xE021
#define FKB_F3 0xE022
#define FKB_F4 0xE023
#define FKB_F5 0xE024
#define FKB_F6 0xE025
#define FKB_F7 0xE026
#define FKB_F8 0xE027
#define FKB_F9 0xE028
#define FKB_F10 0xE029
#define FKB_F11 0xE03A
#define FKB_F12 0xE03B
#define FKB_STAB 0xE05E
#define FKB_SF1 0xE02C
#define FKB_SF2 0xE02D
#define FKB_SF3 0xE02E
#define FKB_SF4 0xE02F
#define FKB_SF5 0xE030
#define FKB_SF6 0xE031
#define FKB_SF7 0xE032
#define FKB_SF8 0xE033
#define FKB_SF9 0xE034
#define FKB_SF10 0xE035
#define FKB_SF11 0xE036
#define FKB_SF12 0xE037
#define FKB_ALT_A 0xFDDC
#define FKB_ALT_B 0xFDDD
#define FKB_ALT_C 0xFDDE
#define FKB_ALT_D 0xFDDF
#define FKB_ALT_E 0xFDE0
#define FKB_ALT_F 0xFDE1
#define FKB_ALT_G 0xFDE2
#define FKB_ALT_H 0xFDE3
#define FKB_ALT_I 0xFDE4
#define FKB_ALT_J 0xFDE5
#define FKB_ALT_K 0xFDE6
#define FKB_ALT_L 0xFDE7
#define FKB_ALT_M 0xFDE8
#define FKB_ALT_N 0xFDE9
#define FKB_ALT_O 0xFDEA
#define FKB_ALT_P 0xFDEB
#define FKB_ALT_Q 0xFDEC
#define FKB_ALT_R 0xFDED
#define FKB_ALT_S 0xFDEE
#define FKB_ALT_T 0xFDEF
#define FKB_ALT_U 0xFDF0
#define FKB_ALT_V 0xFDF1
#define FKB_ALT_W 0xFDF2
#define FKB_ALT_X 0xFDF3
#define FKB_ALT_Y 0xFDF4
#define FKB_ALT_Z 0xFDF5
#define FKB_ALT_1 0xFDF7
#define FKB_ALT_2 0xFDF8
#define FKB_ALT_3 0xFDF9
#define FKB_ALT_4 0xFDFA
#define FKB_ALT_5 0xFDFB
#define FKB_ALT_6 0xFDFC
#define FKB_ALT_7 0xFDFD
#define FKB_ALT_8 0xFDFE
#define FKB_ALT_9 0xFDFF
#define FKB_ALT_0 0xFDF6
#define FKB_ALT_MINUS 0xE061
#define FKB_ALT_EQUAL 0xE06B
#define FKB_ALT_F1 0xE038
#define FKB_ALT_F2 0xE039
#define FKB_ALT_F3 0xE03A
#define FKB_ALT_F4 0xE03B
#define FKB_ALT_F5 0xE03C
#define FKB_ALT_F6 0xE03D
#define FKB_ALT_F7 0xE03E
#define FKB_ALT_F8 0xE03F
#define FKB_ALT_F9 0xE040
#define FKB_ALT_F10 0xE041
#define FKB_GOTO 0xE058
#define FKB_CTRL_HOME 0xE058
#define FKB_CTRL_UP 0xE063
#define FKB_CTRL_PGUP 0xE057
#define FKB_CTRL_LEFT 0xE054
#define FKB_CTRL_RIGHT 0xE053
#define FKB_CTRL_END 0xE00B
#define FKB_CTRL_DOWN 0xE064
#define FKB_CTRL_PGDN 0xE00C
#define FKB_CTRL_INSERT 0xE06E
#define FKB_CTRL_DELETE 0xE06D
#define FKB_CTRL_ENTER 0xE05F
#define FKB_CTRL_A 0xE07C
#define FKB_CTRL_B 0xE07D
#define FKB_CTRL_C 0xE07E
#define FKB_CTRL_D 0xE07F
#define FKB_CTRL_E 0xE080
#define FKB_CTRL_F 0xE081
#define FKB_CTRL_G 0xE082
#define FKB_CTRL_H 0xE083
#define FKB_CTRL_I 0xE084
#define FKB_CTRL_J 0xE085
#define FKB_CTRL_K 0xE086
#define FKB_CTRL_L 0xE087
#define FKB_CTRL_M 0xE088
#define FKB_CTRL_N 0xE089
#define FKB_CTRL_O 0xE08A
#define FKB_CTRL_P 0xE08B
#define FKB_CTRL_Q 0xE08C
#define FKB_CTRL_R 0xE08D
#define FKB_CTRL_S 0xE08E
#define FKB_CTRL_T 0xE08F
#define FKB_CTRL_U 0xE090
#define FKB_CTRL_V 0xE091
#define FKB_CTRL_W 0xE092
#define FKB_CTRL_X 0xE093
#define FKB_CTRL_Y 0xE094
#define FKB_CTRL_Z 0xE095
#define FKB_CTRL_1 0xE06B
#define FKB_CTRL_2 0xE06C
#define FKB_CTRL_3 0xE06D
#define FKB_CTRL_4 0xE06E
#define FKB_CTRL_5 0xE06F
#define FKB_CTRL_6 0xE070
#define FKB_CTRL_7 0xE071
#define FKB_CTRL_8 0xE072
#define FKB_CTRL_9 0xE073
#define FKB_CTRL_0 0xE074
#define FKB_CTRL_MINUS 0xE060
#define FKB_CTRL_EQUAL 0xE061
#define FKB_CTRL_F1 0xE038
#define FKB_CTRL_F2 0xE039
#define FKB_CTRL_F3 0xE03A
#define FKB_CTRL_F4 0xE03B
#define FKB_CTRL_F5 0xE03C
#define FKB_CTRL_F6 0xE03D
#define FKB_CTRL_F7 0xE03E
#define FKB_CTRL_F8 0xE03F
#define FKB_CTRL_F9 0xE040
#define FKB_CTRL_F10 0xE041
#define FLM_CURSOR_BLOCK 0x01
#define FLM_CURSOR_UNDERLINE 0x02
#define FLM_CURSOR_INVISIBLE 0x04
#define FLM_CURSOR_VISIBLE 0x08
typedef struct FTX_SCREEN FTX_SCREEN;
typedef struct FTX_WINDOW FTX_WINDOW;
typedef FLMBOOL (FLMAPI * KEY_HANDLER)(

View File

@@ -33,6 +33,7 @@ static FLMUINT32 * gv_pui32CRCTbl = NULL;
static IF_ThreadMgr * gv_pThreadMgr = NULL;
static IF_FileSystem * gv_pFileSystem = NULL;
static FLMUINT gv_uiMaxFileSize = FLM_MAXIMUM_FILE_SIZE;
static F_XML * gv_pXml = NULL;
FSTATIC RCODE f_initSerialNumberGenerator( void);
@@ -50,6 +51,46 @@ FSTATIC RCODE f_initCRCTable(
#endif
#endif
/****************************************************************************
Desc:
****************************************************************************/
static FLMBYTE gv_ucSENLengthArray[] =
{
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // 0 - 15
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // 16 - 31
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // 32 - 47
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // 48 - 63
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // 64 - 79
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // 80 - 95
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // 96 - 111
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // 112 - 127
2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, // 128 - 143
2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, // 144 - 159
2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, // 160 - 175
2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, // 176 - 191
3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, // 192 - 207
3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, // 208 - 223
4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, // 224 - 239
5, 5, 5, 5, 5, 5, 5, 5, 6, 6, 6, 6, 7, 7, 8, 9 // 240 - 255
};
/****************************************************************************
Desc:
****************************************************************************/
static FLMBYTE ucSENPrefixArray[] =
{
0,
0,
0x80,
0xC0,
0xE0,
0xF0,
0xF8,
0xFC,
0xFE,
0xFF
};
/****************************************************************************
Desc:
****************************************************************************/
@@ -64,6 +105,11 @@ RCODE FLMAPI ftkStartup( void)
f_memoryInit();
if( RC_BAD( rc = f_initCharMappingTables()))
{
goto Exit;
}
if( RC_BAD( rc = f_allocFileSystem( &gv_pFileSystem)))
{
goto Exit;
@@ -84,11 +130,29 @@ RCODE FLMAPI ftkStartup( void)
goto Exit;
}
if( (gv_pXml = f_new F_XML) == NULL)
{
rc = RC_SET( NE_FLM_MEM);
goto Exit;
}
if( RC_BAD( rc = gv_pXml->setup()))
{
goto Exit;
}
if( RC_BAD( rc = f_checkErrorCodeTables()))
{
goto Exit;
}
#ifdef FLM_DEBUG
if( RC_BAD( rc = f_verifyMetaphoneRoutines()))
{
goto Exit;
}
#endif
#if defined( FLM_LINUX)
f_setupLinuxKernelVersion();
gv_uiMaxFileSize = f_getLinuxMaxFileSize();
@@ -144,7 +208,13 @@ void FLMAPI ftkShutdown( void)
f_free( &gv_pui32CRCTbl);
}
if( gv_pXml)
{
gv_pXml->Release();
}
f_freeSerialNumberGenerator();
f_freeCharMappingTables();
f_memoryCleanup();
}
@@ -1020,3 +1090,404 @@ FLMUINT64 FLMAPI f_getMaxFileSize( void)
{
return( gv_uiMaxFileSize);
}
/*****************************************************************************
Desc:
******************************************************************************/
RCODE FLMAPI f_readSEN(
IF_IStream * pIStream,
FLMUINT * puiValue,
FLMUINT * puiLength)
{
RCODE rc;
FLMUINT64 ui64Tmp;
if( RC_BAD( rc = f_readSEN64( pIStream, &ui64Tmp, puiLength)))
{
goto Exit;
}
if( ui64Tmp > ~((FLMUINT)0))
{
rc = RC_SET_AND_ASSERT( NE_FLM_CONV_DEST_OVERFLOW);
goto Exit;
}
if( puiValue)
{
*puiValue = (FLMUINT)ui64Tmp;
}
Exit:
return( rc);
}
/*****************************************************************************
Desc:
******************************************************************************/
RCODE FLMAPI f_readSEN64(
IF_IStream * pIStream,
FLMUINT64 * pui64Value,
FLMUINT * puiLength)
{
RCODE rc = NE_FLM_OK;
FLMUINT uiLen;
FLMUINT uiSENLength;
FLMBYTE ucBuffer[ 16];
const FLMBYTE * pucBuffer;
uiLen = 1;
if( RC_BAD( rc = pIStream->read(
(char *)&ucBuffer[ 0], uiLen, &uiLen)))
{
goto Exit;
}
uiSENLength = gv_ucSENLengthArray[ ucBuffer[ 0]];
uiLen = uiSENLength - 1;
if( puiLength)
{
*puiLength = uiSENLength;
}
if( pui64Value)
{
pucBuffer = &ucBuffer[ 1];
}
else
{
pucBuffer = NULL;
}
if( uiLen)
{
if( RC_BAD( rc = pIStream->read(
(char *)pucBuffer, uiLen, &uiLen)))
{
goto Exit;
}
}
if( pui64Value)
{
pucBuffer = &ucBuffer[ 0];
if( RC_BAD( rc = f_decodeSEN64( &pucBuffer,
&ucBuffer[ sizeof( ucBuffer)], pui64Value)))
{
goto Exit;
}
}
Exit:
return( rc);
}
/*****************************************************************************
Desc:
******************************************************************************/
FLMUINT FLMAPI f_getSENLength(
FLMBYTE ucByte)
{
return( gv_ucSENLengthArray[ ucByte]);
}
/****************************************************************************
Desc:
****************************************************************************/
RCODE FLMAPI f_decodeSEN64(
const FLMBYTE ** ppucBuffer,
const FLMBYTE * pucEnd,
FLMUINT64 * pui64Value)
{
RCODE rc = NE_FLM_OK;
FLMUINT uiSENLength;
const FLMBYTE * pucBuffer = *ppucBuffer;
uiSENLength = gv_ucSENLengthArray[ *pucBuffer];
if( pucBuffer + uiSENLength > pucEnd)
{
if (pui64Value)
{
*pui64Value = 0;
}
rc = RC_SET( NE_FLM_BAD_SEN);
goto Exit;
}
if (pui64Value)
{
switch( uiSENLength)
{
case 1:
*pui64Value = *pucBuffer;
break;
case 2:
*pui64Value = (((FLMUINT64)(*pucBuffer & 0x3F)) << 8) + pucBuffer[ 1];
break;
case 3:
*pui64Value = (((FLMUINT64)(*pucBuffer & 0x1F)) << 16) +
(((FLMUINT64)pucBuffer[ 1]) << 8) + pucBuffer[ 2];
break;
case 4:
*pui64Value = (((FLMUINT64)(*pucBuffer & 0x0F)) << 24) +
(((FLMUINT64)pucBuffer[ 1]) << 16) +
(((FLMUINT64)pucBuffer[ 2]) << 8) + pucBuffer[ 3];
break;
case 5:
*pui64Value = (((FLMUINT64)(*pucBuffer & 0x07)) << 32) +
(((FLMUINT64)pucBuffer[ 1]) << 24) +
(((FLMUINT64)pucBuffer[ 2]) << 16) +
(((FLMUINT64)pucBuffer[ 3]) << 8) + pucBuffer[ 4];
break;
case 6:
*pui64Value = (((FLMUINT64)(*pucBuffer & 0x03)) << 40) +
(((FLMUINT64)pucBuffer[ 1]) << 32) +
(((FLMUINT64)pucBuffer[ 2]) << 24) +
(((FLMUINT64)pucBuffer[ 3]) << 16) +
(((FLMUINT64)pucBuffer[ 4]) << 8) + pucBuffer[ 5];
break;
case 7:
*pui64Value = (((FLMUINT64)(*pucBuffer & 0x01)) << 48) +
(((FLMUINT64)pucBuffer[ 1]) << 40) +
(((FLMUINT64)pucBuffer[ 2]) << 32) +
(((FLMUINT64)pucBuffer[ 3]) << 24) +
(((FLMUINT64)pucBuffer[ 4]) << 16) +
(((FLMUINT64)pucBuffer[ 5]) << 8) + pucBuffer[ 6];
break;
case 8:
*pui64Value = (((FLMUINT64)pucBuffer[ 1]) << 48) +
(((FLMUINT64)pucBuffer[ 2]) << 40) +
(((FLMUINT64)pucBuffer[ 3]) << 32) +
(((FLMUINT64)pucBuffer[ 4]) << 24) +
(((FLMUINT64)pucBuffer[ 5]) << 16) +
(((FLMUINT64)pucBuffer[ 6]) << 8) + pucBuffer[ 7];
break;
case 9:
*pui64Value = (((FLMUINT64)pucBuffer[ 1]) << 56) +
(((FLMUINT64)pucBuffer[ 2]) << 48) +
(((FLMUINT64)pucBuffer[ 3]) << 40) +
(((FLMUINT64)pucBuffer[ 4]) << 32) +
(((FLMUINT64)pucBuffer[ 5]) << 24) +
(((FLMUINT64)pucBuffer[ 6]) << 16) +
(((FLMUINT64)pucBuffer[ 7]) << 8) + pucBuffer[ 8];
break;
default:
*pui64Value = 0;
flmAssert( 0);
break;
}
}
Exit:
*ppucBuffer = pucBuffer + uiSENLength;
return( rc);
}
/****************************************************************************
Desc:
****************************************************************************/
RCODE FLMAPI f_decodeSEN(
const FLMBYTE ** ppucBuffer,
const FLMBYTE * pucEnd,
FLMUINT * puiValue)
{
RCODE rc = NE_FLM_OK;
FLMUINT64 ui64Value;
if( RC_BAD( rc = f_decodeSEN64( ppucBuffer, pucEnd, &ui64Value)))
{
return( rc);
}
if( ui64Value > FLM_MAX_UINT)
{
return( RC_SET_AND_ASSERT( NE_FLM_CONV_NUM_OVERFLOW));
}
if( puiValue)
{
*puiValue = (FLMUINT)ui64Value;
}
return( rc);
}
/****************************************************************************
Desc:
****************************************************************************/
FINLINE FLMBYTE f_shiftRightRetByte(
FLMUINT64 ui64Num,
FLMBYTE ucBits)
{
return( ucBits < 64 ? (FLMBYTE)(ui64Num >> ucBits) : 0);
}
/****************************************************************************
Desc:
****************************************************************************/
FLMUINT FLMAPI f_getSENByteCount(
FLMUINT64 ui64Num)
{
FLMUINT uiCount = 0;
if( ui64Num < 0x80)
{
return( 1);
}
while( ui64Num)
{
uiCount++;
ui64Num >>= 7;
}
// If the high bit is set, the counter will be incremented 1 beyond
// the actual number of bytes need to represent the SEN. We will need
// to re-visit this if we ever go beyond 64-bits.
return( uiCount < FLM_MAX_SEN_LEN ? uiCount : FLM_MAX_SEN_LEN);
}
/****************************************************************************
Desc: Encodes a number as a SEN
****************************************************************************/
FLMUINT FLMAPI f_encodeSEN(
FLMUINT64 ui64Value,
FLMBYTE ** ppucBuffer,
FLMUINT uiSizeWanted)
{
FLMBYTE * pucBuffer = *ppucBuffer;
FLMUINT uiSenLen = f_getSENByteCount( ui64Value);
flmAssert( uiSizeWanted <= FLM_MAX_SEN_LEN &&
(!uiSizeWanted || uiSizeWanted >= uiSenLen));
uiSenLen = uiSizeWanted > uiSenLen ? uiSizeWanted : uiSenLen;
if( uiSenLen == 1)
{
*pucBuffer++ = (FLMBYTE)ui64Value;
}
else
{
FLMUINT uiTmp = (uiSenLen - 1) << 3;
*pucBuffer++ = ucSENPrefixArray[ uiSenLen] +
f_shiftRightRetByte( ui64Value, (FLMBYTE)uiTmp);
while( uiTmp)
{
uiTmp -= 8;
*pucBuffer++ = f_shiftRightRetByte( ui64Value, (FLMBYTE)uiTmp);
}
}
*ppucBuffer = pucBuffer;
return( uiSenLen);
}
/****************************************************************************
Desc: Encodes a number as a SEN
****************************************************************************/
RCODE FLMAPI f_encodeSEN(
FLMUINT64 ui64Value,
FLMBYTE ** ppucBuffer,
FLMBYTE * pucEnd)
{
RCODE rc = NE_FLM_OK;
FLMBYTE * pucBuffer = *ppucBuffer;
FLMUINT uiSenLen = f_getSENByteCount( ui64Value);
if( *ppucBuffer + uiSenLen > pucEnd)
{
rc = RC_SET_AND_ASSERT( NE_FLM_CONV_DEST_OVERFLOW);
goto Exit;
}
if( uiSenLen == 1)
{
*pucBuffer++ = (FLMBYTE)ui64Value;
}
else
{
FLMUINT uiTmp = (uiSenLen - 1) << 3;
*pucBuffer++ = ucSENPrefixArray[ uiSenLen] +
f_shiftRightRetByte( ui64Value, (FLMBYTE)uiTmp);
while( uiTmp)
{
uiTmp -= 8;
*pucBuffer++ = f_shiftRightRetByte( ui64Value, (FLMBYTE)uiTmp);
}
}
*ppucBuffer = pucBuffer;
Exit:
return( rc);
}
/****************************************************************************
Desc: Encodes a number as a SEN
****************************************************************************/
FLMUINT FLMAPI f_encodeSENKnownLength(
FLMUINT64 ui64Value,
FLMUINT uiSenLen,
FLMBYTE ** ppucBuffer)
{
FLMBYTE * pucBuffer = *ppucBuffer;
if( uiSenLen == 1)
{
*pucBuffer++ = (FLMBYTE)ui64Value;
}
else
{
FLMUINT uiTmp = (uiSenLen - 1) << 3;
*pucBuffer++ = ucSENPrefixArray[ uiSenLen] +
f_shiftRightRetByte( ui64Value, (FLMBYTE)uiTmp);
while( uiTmp)
{
uiTmp -= 8;
*pucBuffer++ = f_shiftRightRetByte( ui64Value, (FLMBYTE)uiTmp);
}
}
*ppucBuffer = pucBuffer;
return( uiSenLen);
}
/****************************************************************************
Desc:
****************************************************************************/
RCODE FLMAPI FlmGetXMLObject(
IF_XML ** ppXmlObject)
{
*ppXmlObject = gv_pXml;
(*ppXmlObject)->AddRef();
return( NE_FLM_OK);
}
/****************************************************************************
Desc:
****************************************************************************/
IF_XML * f_getXmlObjPtr( void)
{
return( gv_pXml);
}

View File

@@ -1901,6 +1901,243 @@
friend class F_FileSystem;
};
/****************************************************************************
Desc:
****************************************************************************/
class 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 open(
IF_PosIStream * pIStream,
FLMBOOL bUnicodeStream,
FLMUINT uiLanguage,
FLMUINT uiCompareRules,
FLMBOOL bMayHaveWildCards)
{
if( m_pIStream)
{
m_pIStream->Release();
}
m_pIStream = pIStream;
m_pIStream->AddRef();
m_uiLanguage = uiLanguage;
m_uiCompareRules = uiCompareRules;
m_bCaseSensitive = (uiCompareRules & FLM_COMP_CASE_INSENSITIVE)
? FALSE
: TRUE;
m_bMayHaveWildCards = bMayHaveWildCards;
m_bUnicodeStream = bUnicodeStream;
m_ui64EndOfLeadingSpacesPos = 0;
return( NE_FLM_OK);
}
RCODE FLMAPI close( void)
{
if( m_pIStream)
{
m_pIStream->Release();
m_pIStream = NULL;
}
return( NE_FLM_OK);
}
RCODE FLMAPI read(
void * pvBuffer,
FLMUINT uiBytesToRead,
FLMUINT * puiBytesRead)
{
RCODE rc = NE_FLM_OK;
if( RC_BAD( rc = m_pIStream->read( pvBuffer,
uiBytesToRead, puiBytesRead)))
{
goto Exit;
}
Exit:
return( rc);
}
RCODE FLMAPI read(
FLMBOOL bAllowTwoIntoOne,
FLMUNICODE * puChar,
FLMBOOL * pbCharIsWild,
FLMUINT16 * pui16Col,
FLMUINT16 * pui16SubCol,
FLMBYTE * pucCase);
FINLINE FLMUINT64 FLMAPI totalSize( void)
{
if( m_pIStream)
{
return( m_pIStream->totalSize());
}
return( 0);
}
FINLINE FLMUINT64 FLMAPI remainingSize( void)
{
if( m_pIStream)
{
return( m_pIStream->remainingSize());
}
return( 0);
}
FINLINE RCODE FLMAPI positionTo(
FLMUINT64)
{
return( RC_SET_AND_ASSERT( NE_FLM_NOT_IMPLEMENTED));
}
FINLINE RCODE FLMAPI positionTo(
F_CollStreamPos * pPos)
{
// Should never be able to position back to before the
// leading spaces.
m_uNextChar = pPos->uNextChar;
flmAssert( pPos->ui64Position >= m_ui64EndOfLeadingSpacesPos);
return( m_pIStream->positionTo( pPos->ui64Position));
}
FINLINE FLMUINT64 FLMAPI getCurrPosition( void)
{
flmAssert( 0);
return( 0);
}
void FLMAPI getCurrPosition(
F_CollStreamPos * pPos);
private:
FINLINE RCODE readCharFromStream(
FLMUNICODE * puChar)
{
RCODE rc = NE_FLM_OK;
if( m_bUnicodeStream)
{
if( RC_BAD( rc = m_pIStream->read( puChar, sizeof( FLMUNICODE), NULL)))
{
goto Exit;
}
}
else
{
if( RC_BAD( rc = f_readUTF8CharAsUnicode(
m_pIStream, puChar)))
{
goto Exit;
}
}
Exit:
return( rc);
}
IF_PosIStream * m_pIStream;
FLMUINT m_uiLanguage;
FLMBOOL m_bCaseSensitive;
FLMUINT m_uiCompareRules;
FLMUINT64 m_ui64EndOfLeadingSpacesPos;
FLMBOOL m_bMayHaveWildCards;
FLMBOOL m_bUnicodeStream;
FLMUNICODE m_uNextChar;
};
/****************************************************************************
Desc: XML
****************************************************************************/
typedef struct xmlChar
{
FLMBYTE ucFlags;
} XMLCHAR;
class F_XML : public IF_XML
{
public:
F_XML();
virtual ~F_XML();
RCODE FLMAPI setup( void);
FLMBOOL FLMAPI isPubidChar(
FLMUNICODE uChar);
FLMBOOL FLMAPI isQuoteChar(
FLMUNICODE uChar);
FLMBOOL FLMAPI isWhitespace(
FLMUNICODE uChar);
FLMBOOL FLMAPI isExtender(
FLMUNICODE uChar);
FLMBOOL FLMAPI isCombiningChar(
FLMUNICODE uChar);
FLMBOOL FLMAPI isNameChar(
FLMUNICODE uChar);
FLMBOOL FLMAPI isNCNameChar(
FLMUNICODE uChar);
FLMBOOL FLMAPI isIdeographic(
FLMUNICODE uChar);
FLMBOOL FLMAPI isBaseChar(
FLMUNICODE uChar);
FLMBOOL FLMAPI isDigit(
FLMUNICODE uChar);
FLMBOOL FLMAPI isLetter(
FLMUNICODE uChar);
FLMBOOL FLMAPI isNameValid(
FLMUNICODE * puzName,
FLMBYTE * pszName);
private:
void setCharFlag(
FLMUNICODE uLowChar,
FLMUNICODE uHighChar,
FLMUINT16 ui16Flag);
XMLCHAR * m_pCharTable;
};
/****************************************************************************
Desc: Logging
****************************************************************************/
@@ -1953,4 +2190,12 @@
IF_ThreadMgr * f_getThreadMgrPtr( void);
RCODE f_verifyMetaphoneRoutines( void);
RCODE f_initCharMappingTables( void);
void f_freeCharMappingTables( void);
IF_XML * f_getXmlObjPtr( void);
#endif // FTKSYS_H

View File

@@ -2199,40 +2199,10 @@ const unsigned char UnicodeProperties[ 32768] =
/****************************************************************************
Desc:
****************************************************************************/
FINLINE FLMBOOL f_isWhitespace(
FLMBOOL FLMAPI f_isWhitespace(
FLMUNICODE uzChar)
{
return( (uzChar == ' ' || uzChar == '\t' ||
uzChar == '\n' || uzChar == '\r') ? TRUE : FALSE);
}
/****************************************************************************
Desc:
****************************************************************************/
FINLINE FLMUNICODE f_convertChar(
FLMUNICODE uzChar,
FLMUINT uiCompareRules)
{
if (uzChar == ASCII_SPACE ||
(uzChar == ASCII_UNDERSCORE &&
(uiCompareRules & FLM_COMP_NO_UNDERSCORES)) ||
(f_isWhitespace( uzChar) &&
(uiCompareRules & FLM_COMP_WHITESPACE_AS_SPACE)))
{
return( (FLMUNICODE)((uiCompareRules &
(FLM_COMP_NO_WHITESPACE |
FLM_COMP_IGNORE_LEADING_SPACE))
? (FLMUNICODE)0
: (FLMUNICODE)ASCII_SPACE));
}
else if (uzChar == ASCII_DASH && (uiCompareRules & FLM_COMP_NO_DASHES))
{
return( (FLMUNICODE)0);
}
else
{
return( uzChar);
}
return( f_getXmlObjPtr()->isWhitespace( uzChar));
}
/****************************************************************************
@@ -7287,3 +7257,334 @@ Exit:
return( rc);
}
#endif
/*****************************************************************************
Desc:
Notes: pucBuf must be able to contain at least 3 bytes
******************************************************************************/
RCODE FLMAPI f_readUTF8CharAsUTF8(
IF_IStream * pIStream,
FLMBYTE * pucBuf,
FLMUINT * puiLen)
{
RCODE rc = NE_FLM_OK;
FLMUINT uiLen;
if( *puiLen == 0)
{
rc = RC_SET_AND_ASSERT( NE_FLM_CONV_DEST_OVERFLOW);
goto Exit;
}
uiLen = 1;
if( RC_BAD( rc = pIStream->read( pucBuf, uiLen, &uiLen)))
{
goto Exit;
}
if( pucBuf[ 0] <= 0x7F)
{
if( !pucBuf[ 0])
{
rc = RC_SET( NE_FLM_EOF_HIT);
goto Exit;
}
*puiLen = 1;
goto Exit;
}
if( *puiLen < 2)
{
rc = RC_SET_AND_ASSERT( NE_FLM_CONV_DEST_OVERFLOW);
goto Exit;
}
uiLen = 1;
if( RC_BAD( rc = pIStream->read( &pucBuf[ 1], uiLen, &uiLen)))
{
if( rc == NE_FLM_EOF_HIT)
{
rc = RC_SET_AND_ASSERT( NE_FLM_BAD_UTF8);
}
goto Exit;
}
if( (pucBuf[ 1] >> 6) != 0x02)
{
rc = RC_SET_AND_ASSERT( NE_FLM_BAD_UTF8);
goto Exit;
}
if( (pucBuf[ 0] >> 5) == 0x06)
{
*puiLen = 2;
goto Exit;
}
if( *puiLen < 3)
{
rc = RC_SET_AND_ASSERT( NE_FLM_CONV_DEST_OVERFLOW);
goto Exit;
}
uiLen = 1;
if( RC_BAD( rc = pIStream->read( &pucBuf[ 2], uiLen, &uiLen)))
{
if( rc == NE_FLM_EOF_HIT)
{
rc = RC_SET_AND_ASSERT( NE_FLM_BAD_UTF8);
}
goto Exit;
}
if( (pucBuf[ 0] >> 4) != 0x0E || (pucBuf[ 2] >> 6) != 0x02)
{
rc = RC_SET_AND_ASSERT( NE_FLM_BAD_UTF8);
goto Exit;
}
*puiLen = 3;
Exit:
return( rc);
}
/***************************************************************************
Desc:
****************************************************************************/
RCODE FLMAPI f_compareUnicodeStrings(
const FLMUNICODE * puzLString,
FLMUINT uiLStrBytes,
FLMBOOL bLeftWild,
const FLMUNICODE * puzRString,
FLMUINT uiRStrBytes,
FLMBOOL bRightWild,
FLMUINT uiCompareRules,
FLMUINT uiLanguage,
FLMINT * piResult)
{
RCODE rc = NE_FLM_OK;
F_BufferIStream bufferLStream;
F_BufferIStream bufferRStream;
F_CollIStream lStream;
F_CollIStream rStream;
if( RC_BAD( rc = bufferLStream.open(
(const char *)puzLString, uiLStrBytes)))
{
goto Exit;
}
if( RC_BAD( rc = bufferRStream.open(
(const char *)puzRString, uiRStrBytes)))
{
goto Exit;
}
if( RC_BAD( rc = lStream.open( &bufferLStream, TRUE, uiLanguage,
uiCompareRules, bLeftWild)))
{
goto Exit;
}
if( RC_BAD( rc = rStream.open( &bufferRStream, TRUE, uiLanguage,
uiCompareRules, bRightWild)))
{
goto Exit;
}
if( RC_BAD( rc = f_compareCollStreams(
(IF_CollIStream *)&lStream, (IF_CollIStream *)&rStream,
(bLeftWild || bRightWild) ? TRUE : FALSE, uiLanguage, piResult)))
{
goto Exit;
}
Exit:
return( rc);
}
/***************************************************************************
Desc:
****************************************************************************/
RCODE FLMAPI f_compareUTF8Strings(
const FLMBYTE * pucLString,
FLMUINT uiLStrBytes,
FLMBOOL bLeftWild,
const FLMBYTE * pucRString,
FLMUINT uiRStrBytes,
FLMBOOL bRightWild,
FLMUINT uiCompareRules,
FLMUINT uiLanguage,
FLMINT * piResult)
{
RCODE rc = NE_FLM_OK;
F_BufferIStream bufferLStream;
F_BufferIStream bufferRStream;
F_CollIStream lStream;
F_CollIStream rStream;
if (RC_BAD( rc = bufferLStream.open(
(const char *)pucLString, uiLStrBytes)))
{
goto Exit;
}
if( RC_BAD( rc = bufferRStream.open(
(const char *)pucRString, uiRStrBytes)))
{
goto Exit;
}
if( RC_BAD( rc = lStream.open( &bufferLStream, FALSE, uiLanguage,
uiCompareRules, bLeftWild)))
{
goto Exit;
}
if( RC_BAD( rc = rStream.open( &bufferRStream, FALSE, uiLanguage,
uiCompareRules, bRightWild)))
{
goto Exit;
}
if( RC_BAD( rc = f_compareCollStreams(
(IF_CollIStream *)&lStream, (IF_CollIStream *)&rStream,
(bLeftWild || bRightWild) ? TRUE : FALSE,
uiLanguage, piResult)))
{
goto Exit;
}
Exit:
return( rc);
}
/***************************************************************************
Desc:
****************************************************************************/
RCODE FLMAPI f_compareUTF8Streams(
IF_PosIStream * pLStream,
FLMBOOL bLeftWild,
IF_PosIStream * pRStream,
FLMBOOL bRightWild,
FLMUINT uiCompareRules,
FLMUINT uiLanguage,
FLMINT * piResult)
{
RCODE rc = NE_FLM_OK;
F_CollIStream lStream;
F_CollIStream rStream;
if( RC_BAD( rc = lStream.open( pLStream, FALSE, uiLanguage,
uiCompareRules, bLeftWild)))
{
goto Exit;
}
if( RC_BAD( rc = rStream.open( pRStream, FALSE, uiLanguage,
uiCompareRules, bRightWild)))
{
goto Exit;
}
if( RC_BAD( rc = f_compareCollStreams(
&lStream, &rStream, (bLeftWild || bRightWild) ? TRUE : FALSE,
uiLanguage, piResult)))
{
goto Exit;
}
Exit:
return( rc);
}
/***************************************************************************
Desc:
****************************************************************************/
RCODE FLMAPI f_compareUnicodeStreams(
IF_PosIStream * pLStream,
FLMBOOL bLeftWild,
IF_PosIStream * pRStream,
FLMBOOL bRightWild,
FLMUINT uiCompareRules,
FLMUINT uiLanguage,
FLMINT * piResult)
{
RCODE rc = NE_FLM_OK;
F_CollIStream lStream;
F_CollIStream rStream;
if( RC_BAD( rc = lStream.open( pLStream, TRUE, uiLanguage,
uiCompareRules, bLeftWild)))
{
goto Exit;
}
if( RC_BAD( rc = rStream.open( pRStream, TRUE, uiLanguage,
uiCompareRules, bRightWild)))
{
goto Exit;
}
if( RC_BAD( rc = f_compareCollStreams(
&lStream, &rStream, (bLeftWild || bRightWild) ? TRUE : FALSE,
uiLanguage, piResult)))
{
goto Exit;
}
Exit:
return( rc);
}
/***************************************************************************
Desc:
****************************************************************************/
RCODE FLMAPI f_utf8IsSubStr(
const FLMBYTE * pszString,
const FLMBYTE * pszSubString,
FLMUINT uiCompareRules,
FLMUINT uiLanguage,
FLMBOOL * pbExists)
{
RCODE rc = NE_FLM_OK;
FLMINT iResult = 0;
FLMBYTE * pszSearch = NULL;
FLMUINT uiSubStringLen = f_strlen( (const char *)pszSubString);
if( RC_BAD( rc = f_alloc( uiSubStringLen + 3, &pszSearch)))
{
goto Exit;
}
pszSearch[0] = '*';
f_memcpy( &pszSearch[ 1], pszSubString, uiSubStringLen);
pszSearch[ uiSubStringLen + 1] = '*';
pszSearch[ uiSubStringLen + 2] = '\0';
if( RC_BAD( rc = f_compareUTF8Strings(
pszString, f_strlen( (const char *)pszString), FALSE, pszSearch,
uiSubStringLen + 2, TRUE, uiCompareRules, uiLanguage, &iResult)))
{
goto Exit;
}
*pbExists = (iResult)?FALSE:TRUE;
Exit:
if( pszSearch)
{
f_free( &pszSearch);
}
return( rc);
}

View File

@@ -24,7 +24,6 @@
//------------------------------------------------------------------------------
#include "ftksys.h"
#if 0
#define FLM_XML_BASE_CHAR 0x01
#define FLM_XML_IDEOGRAPHIC 0x02
@@ -33,11 +32,6 @@
#define FLM_XML_EXTENDER 0x10
#define FLM_XML_WHITESPACE 0x20
typedef struct xmlChar
{
FLMBYTE ucFlags;
} XMLCHAR;
typedef struct
{
char * pszEntity;
@@ -391,73 +385,6 @@ static CHAR_TBL charTbl[] =
{ 0, 0, 0}
};
//FSTATIC RCODE exportUniValue(
// IF_OStream * pOStream,
// FLMUNICODE * puzStr,
// FLMUINT uiStrChars,
// FLMBOOL bEncodeSpecialChars,
// FLMUINT uiIndentCount);
/****************************************************************************
Desc: XML
****************************************************************************/
class F_XML : public IF_XML
{
public:
F_XML();
virtual ~F_XML();
RCODE FLMAPI setup( void);
FLMBOOL FLMAPI isPubidChar(
FLMUNICODE uChar);
FLMBOOL FLMAPI isQuoteChar(
FLMUNICODE uChar);
FLMBOOL FLMAPI isWhitespace(
FLMUNICODE uChar);
FLMBOOL FLMAPI isExtender(
FLMUNICODE uChar);
FLMBOOL FLMAPI isCombiningChar(
FLMUNICODE uChar);
FLMBOOL FLMAPI isNameChar(
FLMUNICODE uChar);
FLMBOOL FLMAPI isNCNameChar(
FLMUNICODE uChar);
FLMBOOL FLMAPI isIdeographic(
FLMUNICODE uChar);
FLMBOOL FLMAPI isBaseChar(
FLMUNICODE uChar);
FLMBOOL FLMAPI isDigit(
FLMUNICODE uChar);
FLMBOOL FLMAPI isLetter(
FLMUNICODE uChar);
FLMBOOL FLMAPI isNameValid(
FLMUNICODE * puzName,
FLMBYTE * pszName);
private:
void setCharFlag(
FLMUNICODE uLowChar,
FLMUNICODE uHighChar,
FLMUINT16 ui16Flag);
XMLCHAR * m_pCharTable;
};
/****************************************************************************
Desc:
****************************************************************************/
@@ -764,4 +691,3 @@ Exit:
return( bValid);
}
#endif