{$MACRO ON} (****************************************************************************** * * Copyright (c) 1998-2000 Palm, Inc. or its subsidiaries. * All rights reserved. * * File: TextMgr.h * * Release: Palm OS SDK 4.0 (63220) * * Description: * Header file for Text Manager. * * History: * 03/05/98 kwk Created by Ken Krugler. * 02/02/99 kwk Added charEncodingPalmLatin & charEncodingPalmSJIS, * since we've extended the CP1252 & CP932 encodings. * Added TxtUpperStr, TxtLowerStr, TxtUpperChar, and * TxtLowerChar macros. * 03/11/99 kwk Changed TxtTruncate to TxtGetTruncationOffset. * 04/24/99 kwk Moved string & character upper/lower casing macros * to IntlGlue library. * 04/28/99 kwk Changed kMaxCharSize to maxCharBytes, as per Roger's request. * 05/15/99 kwk Changed TxtIsValidChar to TxtCharIsValid. * 05/29/99 kwk Removed include of CharAttr.h. * 07/13/99 kwk Moved TxtPrepFindString into TextPrv.h * 09/22/99 kwk Added TxtParamString (OS 3.5). * 10/28/99 kwk Added the TxtCharIsVirtual macro. * 03/01/00 kwk Added the TxtConvertEncoding routine (OS 4.0), and the * txtErrUnknownEncoding and txtErrConvertOverflow errors. * 05/12/00 kwk Deprecated the TxtCharWidth routine. * 05/26/00 kwk Added TxtGetWordWrapOffset (OS 4.0). Convert CharEncodingType * to #define format versus enums. Re-ordered into logical * groups, and fixed up names to match existing convention. * 05/30/00 kwk Added txtErrTranslitUnderflow. * 06/02/00 CS Moved character encoding constants to PalmLocale.h so that * Rez has access to them. * 07/13/00 kwk Added TxtNameToEncoding (OS 4.0). * 07/23/00 kwk Updated TxtConvertEncoding to match new API. * 10/05/00 kwk Added charAttr_ as substitutes for the old * character attribute flags in CharAttr.h (e.g. _XA, _LO). * kwk Moved sizeOf7BitChar here from CharAttr.h * 11/21/00 kwk Undeprecated TxtCharWidth, in anticipation of future, * proper deprecation. * 11/24/00 kwk Reverted maxCharBytes to 3 (was 4). You only need more than * three bytes for surrogate Unicode characters, which we don't * support, as this would require a 32 bit WChar variable to * hold the result (potentially 21 bits of data). Since we * never use more than 3 bytes, it's OK to shrink this back down. * *****************************************************************************) unit textmgr; interface uses palmos, coretraps, errorbase, intlmgr; (*********************************************************************** * Public types & constants ***********************************************************************) // See PalmLocale.h for encoding constants of type CharEncodingType, and // character encoding names. type CharEncodingType = UInt8; // Transliteration operations for the TxtTransliterate call. We don't use // an enum, since each character encoding contains its own set of special // transliteration operations (which begin at translitOpCustomBase). type TranslitOpType = UInt16; // Standard transliteration operations. const translitOpStandardBase = 0; // Beginning of standard operations. translitOpUpperCase = 0; translitOpLowerCase = 1; translitOpReserved2 = 2; translitOpReserved3 = 3; // Custom transliteration operations (defined in CharXXXX.h encoding-specific // header files. translitOpCustomBase = 1000; // Beginning of char-encoding specific ops. translitOpPreprocess = $8000; // Mask for pre-process option, where // no transliteration actually is done. // Structure used to maintain state across calls to TxtConvertEncoding, for // proper handling of source or destination encodings with have modes. kTxtConvertStateSize = 32; type TxtConvertStateType = record ioSrcState: array [0..kTxtConvertStateSize - 1] of UInt8; ioDstState: array [0..kTxtConvertStateSize - 1] of UInt8; end; // Flags available in the sysFtrNumCharEncodingFlags feature attribute. const charEncodingOnlySingleByte = $00000001; charEncodingHasDoubleByte = $00000002; charEncodingHasLigatures = $00000004; charEncodingLeftToRight = $00000008; // Various byte attribute flags. Note that multiple flags can be // set, thus a byte could be both a single-byte character, or the first // byte of a multi-byte character. byteAttrFirst = $80; // First byte of multi-byte char. byteAttrLast = $40; // Last byte of multi-byte char. byteAttrMiddle = $20; // Middle byte of muli-byte char. byteAttrSingle = $01; // Single byte. // Character attribute flags. These replace the old flags defined in // CharAttr.h, but are bit-compatible. charAttr_XA = $0200; // extra alphabetic charAttr_XS = $0100; // extra space charAttr_BB = $0080; // BEL, BS, etc. charAttr_CN = $0040; // CR, FF, HT, NL, VT charAttr_DI = $0020; // '0'-'9' charAttr_LO = $0010; // 'a'-'z' and lowercase extended chars. charAttr_PU = $0008; // punctuation charAttr_SP = $0004; // space charAttr_UP = $0002; // 'A'-'Z' and uppercase extended chars. charAttr_XD = $0001; // '0'-'9', 'A'-'F', 'a'-'f' // Various sets of character attribute flags. charAttrPrint = charAttr_DI or charAttr_LO or charAttr_PU or charAttr_SP or charAttr_UP or charAttr_XA; charAttrSpace = charAttr_CN or charAttr_SP or charAttr_XS; charAttrAlNum = charAttr_DI or charAttr_LO or charAttr_UP or charAttr_XA; charAttrAlpha = charAttr_LO or charAttr_UP or charAttr_XA; charAttrCntrl = charAttr_BB or charAttr_CN; charAttrGraph = charAttr_DI or charAttr_LO or charAttr_PU or charAttr_UP or charAttr_XA; charAttrDelim = charAttr_SP or charAttr_PU; // Remember that sizeof(0x0D) == 2 because 0x0D is treated like an int. The // same is true of sizeof('a'), sizeof('\0'), and sizeof(chrNull). For this // reason it's safest to use the sizeOf7BitChar macro to document buffer size // and string length calcs. Note that this can only be used with low-ascii // characters, as anything else might be the high byte of a double-byte char. //!!! sizeOf7BitChar(c) = 1; // Maximum size a single WChar character will occupy in a text string. maxCharBytes = 3; // Text manager error codes. txtErrUknownTranslitOp = txtErrorClass or 1; txtErrTranslitOverrun = txtErrorClass or 2; txtErrTranslitOverflow = txtErrorClass or 3; txtErrConvertOverflow = txtErrorClass or 4; txtErrConvertUnderflow = txtErrorClass or 5; txtErrUnknownEncoding = txtErrorClass or 6; txtErrNoCharMapping = txtErrorClass or 7; txtErrTranslitUnderflow = txtErrorClass or 8; (*********************************************************************** * Public macros ***********************************************************************) function TxtCharIsSpace(ch: WChar): Boolean; function TxtCharIsPrint(ch: WChar): Boolean; function TxtCharIsDigit(ch: WChar): Boolean; function TxtCharIsAlNum(ch: WChar): Boolean; function TxtCharIsAlpha(ch: WChar): Boolean; function TxtCharIsCntrl(ch: WChar): Boolean; function TxtCharIsGraph(ch: WChar): Boolean; function TxtCharIsLower(ch: WChar): Boolean; function TxtCharIsPunct(ch: WChar): Boolean; function TxtCharIsUpper(ch: WChar): Boolean; function TxtCharIsHex(ch: WChar): Boolean; function TxtCharIsDelim(ch: WChar): Boolean; // is a hard key if the event modifier has the command bit set // and is either in the proper range or is the calculator character. function TxtCharIsHardKey(m, c: UInt16): Boolean; // is a virtual character if the event modifier has the command // bit set. WARNING!!! This macro is only safe to use on Palm OS 3.5 or // later. With earlier versions of the OS, use TxtGlueCharIsVirtual() // in PalmOSGlue.lib function TxtCharIsVirtual(m, c: UInt16): Boolean; function TxtPreviousCharSize(const inText: PChar; inOffset: UInt32): UInt16; function TxtNextCharSize(const inText: PChar; inOffset: UInt32): UInt16; (*********************************************************************** * Public routines ***********************************************************************) // DOLATER kwk - fix up parameter names to use i, o versus in, out // Return back byte attribute (first, last, single, middle) for . function TxtByteAttr(inByte: UInt8): UInt8; // Return back the standard attribute bits for . function TxtCharAttr(inChar: WChar): UInt16; // Return back the extended attribute bits for . function TxtCharXAttr(inChar: WChar): UInt16; // Return the size (in bytes) of the character . This represents // how many bytes would be required to store the character in a string. function TxtCharSize(inChar: WChar): UInt16; // Return the width (in pixels) of the character . You should // use FntWCharWidth or FntGlueWCharWidth instead of this routine. function TxtCharWidth(inChar: WChar): Int16; // Load the character before offset in the text. Return // back the size of the character. function TxtGetPreviousChar(const inText: PChar; inOffset: UInt32; outChar: WCharPtr): UInt16; // Load the character at offset in the text. Return // back the size of the character. function TxtGetNextChar(const inText: PChar; inOffset: UInt32; outChar: WCharPtr): UInt16; // Return the character at offset in the text. function TxtGetChar(const inText: PChar; inOffset: UInt32): WChar; // Set the character at offset in the text, and // return back the size of the character. function TxtSetNextChar(ioText: PChar; inOffset: UInt32; inChar: WChar): UInt16; // Replace the substring "^X" (where X is 0..9, as specified by ) // with the string . If is NULL then don't modify . // Make sure the resulting string doesn't contain more than bytes, // excluding the terminating null. Return back the number of occurances of // the substring found in . function TxtReplaceStr(ioStr: PChar; inMaxLen: UInt16; const inParamStr: PChar; inParamNum: UInt16): UInt16; // Allocate a handle containing the result of substituting param0...param3 // for ^0...^3 in , and return the locked result. If a parameter // is NULL, replace the corresponding substring in the template with "". function TxtParamString(const inTemplate, param0, param1, param2, param3: PChar): PChar; // Return the bounds of the character at in the // text, via the & offsets, and also return the // actual value of character at or following . function TxtCharBounds(const inText: PChar; inOffset: UInt32; var outStart: UInt32; var outEnd: UInt32): WChar; // Return the appropriate byte position for truncating such that it is // at most bytes long. function TxtGetTruncationOffset(const inText: PChar; inOffset: UInt32): UInt32; // Search for in . If found return true and pass back // the found position (byte offset) in , and the length of the matched // text in . function TxtFindString(const inSourceStr, inTargetStr: PChar; var outPos: UInt32; var outLength: UInt16): Boolean; // Find the bounds of the word that contains the character at . // Return the offsets in <*outStart> and <*outEnd>. Return true if the // word we found was not empty & not a delimiter (attribute of first char // in word not equal to space or punct). function TxtWordBounds(const inText: PChar; inLength, inOffset: UInt32; var outStart, outEnd: UInt32): Boolean; // Return the offset of the first break position (for text wrapping) that // occurs at or before in . Note that this routine will // also add trailing spaces and a trailing linefeed to the break position, // thus the result could be greater than . function TxtGetWordWrapOffset(const iTextP: PChar; iOffset: UInt32): UInt32; // Return the minimum (lowest) encoding required for . If we // don't know about the character, return encoding_Unknown. function TxtCharEncoding(inChar: WChar): CharEncodingType; // Return the minimum (lowest) encoding required to represent . // This is the maximum encoding of any character in the string, where // highest is unknown, and lowest is ascii. function TxtStrEncoding(const inStr: PChar): CharEncodingType; // Return the higher (max) encoding of and . function TxtMaxEncoding(a, b: CharEncodingType): CharEncodingType; // Return a pointer to the 'standard' name for . If the // encoding is unknown, return a pointer to an empty string. function TxtEncodingName(inEncoding: CharEncodingType): PChar; // Map from a character set name to a CharEncodingType. // If the character set name is unknown, return charEncodingUnknown. function TxtNameToEncoding(const iEncodingName: PChar): CharEncodingType; // Transliterate bytes of text found in , based // on the requested operation. Place the results in , // and set the resulting length in . On entry // must contain the maximum size of the buffer. If the // buffer isn't large enough, return an error (note that outDestText // might have been modified during the operation). Note that if // has the preprocess bit set, then is not modified, and // will contain the total space required in the destination // buffer in order to perform the operation. function TxtTransliterate(const inSrcText: PChar; inSrcLength: UInt16; outDstText: PChar; var ioDstLength: UInt16; inOp: TranslitOpType): Err; // Convert <*ioSrcBytes> of text from between the // and character encodings. If is not NULL, write // the resulting bytes to the buffer, and always return the number of // resulting bytes in <*ioDstBytes>. Update <*srcBytes> with the number of // bytes from the beginning of <*srcTextP> that were successfully converted. // When the routine is called with pointing to the beginning of // a string or text buffer, should be true; if the text is // processed in multiple chunks, either because errors occurred or due to // source/destination buffer size constraints, then subsequent calls to // this routine should pass false for . The TxtConvertStateType // record maintains state information so that if the source or destination // character encodings have state or modes (e.g. JIS), processing a single // sequence of text with multiple calls will work correctly. // When an error occurs due to an unconvertable character, the behavior of // the routine will depend on the parameter. If it is NULL, // then <*ioSrcBytes> will be set to the offset of the unconvertable character, // will be set to the number of successfully converted resulting // bytes, and , in not NULL, will contain conversion results up to // the point of the error. The routine will return an appropriate error code, // and it is up to the caller to either terminate conversion or skip over the // unconvertable character and continue the conversion process (passing false // for the parameter in subsequent calls to TxtConvertEncoding). // If is not NULL, then this string is written to the // destination buffer when an unconvertable character is encountered in the // source text, and the source character is skipped. Processing continues, though // the error code will still be returned when the routine terminates. Note that // if a more serious error occurs during processing (e.g. buffer overflow) then // that error will be returned even if there was an earlier unconvertable character. // Note that the substitution string must use the destination character encoding. function TxtConvertEncoding(newConversion: Boolean; var ioStateP: TxtConvertStateType; const srcTextP: PChar; var ioSrcBytes: UInt16; srcEncoding: CharEncodingType; dstTextP: PChar; var ioDstBytes: UInt16; dstEncoding: CharEncodingType; const substitutionStr: PChar; substitutionLen: UInt16): Err; // Return true if is a valid (drawable) character. Note that we'll // return false if it is a virtual character code. function TxtCharIsValid(inChar: WChar): Boolean; // Compare the first bytes of with the first bytes // of . Return the results of the comparison: < 0 if sorts before // , > 0 if sorts after , and 0 if they are equal. Also return // the number of bytes that matched in and // (either one of which can be NULL if the match length is not needed). // This comparison is "caseless", in the same manner as a find operation, // thus case, character size, etc. don't matter. function TxtCaselessCompare(const s1: PChar; s1Len: UInt16; var s1MatchLen: UInt16; const s2: PChar; s2Len: UInt16; var s2MatchLen: UInt16): Int16; // Compare the first bytes of with the first bytes // of . Return the results of the comparison: < 0 if sorts before // , > 0 if sorts after , and 0 if they are equal. Also return // the number of bytes that matched in and // (either one of which can be NULL if the match length is not needed). function TxtCompare(const s1: PChar; s1Len: UInt16; var s1MatchLen: UInt16; const s2: PChar; s2Len: UInt16; var s2MatchLen: UInt16): Int16; implementation uses Chars, SysEvent; function __TxtByteAttr(inByte: UInt8): UInt8; syscall sysTrapIntlDispatch; function __TxtCharAttr(inChar: WChar): UInt16; syscall sysTrapIntlDispatch; function __TxtCharXAttr(inChar: WChar): UInt16; syscall sysTrapIntlDispatch; function __TxtCharSize(inChar: WChar): UInt16; syscall sysTrapIntlDispatch; function __TxtCharWidth(inChar: WChar): Int16; syscall sysTrapIntlDispatch; function __TxtGetPreviousChar(const inText: PChar; inOffset: UInt32; outChar: WCharPtr): UInt16; syscall sysTrapIntlDispatch; function __TxtGetNextChar(const inText: PChar; inOffset: UInt32; outChar: WCharPtr): UInt16; syscall sysTrapIntlDispatch; function __TxtGetChar(const inText: PChar; inOffset: UInt32): WChar; syscall sysTrapIntlDispatch; function __TxtSetNextChar(ioText: PChar; inOffset: UInt32; inChar: WChar): UInt16; syscall sysTrapIntlDispatch; function __TxtReplaceStr(ioStr: PChar; inMaxLen: UInt16; const inParamStr: PChar; inParamNum: UInt16): UInt16; syscall sysTrapIntlDispatch; function __TxtParamString(const inTemplate, param0, param1, param2, param3: PChar): PChar; syscall sysTrapIntlDispatch; function __TxtCharBounds(const inText: PChar; inOffset: UInt32; var outStart: UInt32; var outEnd: UInt32): WChar; syscall sysTrapIntlDispatch; function __TxtGetTruncationOffset(const inText: PChar; inOffset: UInt32): UInt32; syscall sysTrapIntlDispatch; function __TxtFindString(const inSourceStr, inTargetStr: PChar; var outPos: UInt32; var outLength: UInt16): Boolean; syscall sysTrapIntlDispatch; function __TxtWordBounds(const inText: PChar; inLength, inOffset: UInt32; var outStart, outEnd: UInt32): Boolean; syscall sysTrapIntlDispatch; function __TxtGetWordWrapOffset(const iTextP: PChar; iOffset: UInt32): UInt32; syscall sysTrapIntlDispatch; function __TxtCharEncoding(inChar: WChar): CharEncodingType; syscall sysTrapIntlDispatch; function __TxtStrEncoding(const inStr: PChar): CharEncodingType; syscall sysTrapIntlDispatch; function __TxtMaxEncoding(a, b: CharEncodingType): CharEncodingType; syscall sysTrapIntlDispatch; function __TxtEncodingName(inEncoding: CharEncodingType): PChar; syscall sysTrapIntlDispatch; function __TxtNameToEncoding(const iEncodingName: PChar): CharEncodingType; syscall sysTrapIntlDispatch; function __TxtTransliterate(const inSrcText: PChar; inSrcLength: UInt16; outDstText: PChar; var ioDstLength: UInt16; inOp: TranslitOpType): Err; syscall sysTrapIntlDispatch; function __TxtConvertEncoding(newConversion: Boolean; var ioStateP: TxtConvertStateType; const srcTextP: PChar; var ioSrcBytes: UInt16; srcEncoding: CharEncodingType; dstTextP: PChar; var ioDstBytes: UInt16; dstEncoding: CharEncodingType; const substitutionStr: PChar; substitutionLen: UInt16): Err; syscall sysTrapIntlDispatch; function __TxtCharIsValid(inChar: WChar): Boolean; syscall sysTrapIntlDispatch; function __TxtCaselessCompare(const s1: PChar; s1Len: UInt16; var s1MatchLen: UInt16; const s2: PChar; s2Len: UInt16; var s2MatchLen: UInt16): Int16; syscall sysTrapIntlDispatch; function __TxtCompare(const s1: PChar; s1Len: UInt16; var s1MatchLen: UInt16; const s2: PChar; s2Len: UInt16; var s2MatchLen: UInt16): Int16; syscall sysTrapIntlDispatch; function TxtByteAttr(inByte: UInt8): UInt8; begin asm move.l #$intlTxtByteAttr, D2; end; TxtByteAttr := TxtByteAttr(inByte); end; function TxtCharAttr(inChar: WChar): UInt16; begin asm move.l #$intlTxtCharAttr, D2; end; TxtCharAttr := __TxtCharAttr(inChar); end; function TxtCharXAttr(inChar: WChar): UInt16; begin asm move.l #$intlTxtCharXAttr, D2; end; TxtCharXAttr := __TxtCharXAttr(inChar); end; function TxtCharSize(inChar: WChar): UInt16; begin asm move.l #$intlTxtCharSize, D2; end; TxtCharSize := TxtCharSize(inChar); end; function TxtCharWidth(inChar: WChar): Int16; begin asm move.l #$intlTxtCharWidth, D2; end; TxtCharWidth := TxtCharWidth(inChar); end; function TxtGetPreviousChar(const inText: PChar; inOffset: UInt32; outChar: WCharPtr): UInt16; begin asm move.l #$intlTxtGetPreviousChar, D2; end; TxtGetPreviousChar := __TxtGetPreviousChar(inText, inOffset, outChar); end; function TxtGetNextChar(const inText: PChar; inOffset: UInt32; outChar: WCharPtr): UInt16; begin asm move.l #$intlTxtGetNextChar, D2; end; TxtGetNextChar := __TxtGetNextChar(inText, inOffset, outChar); end; function TxtGetChar(const inText: PChar; inOffset: UInt32): WChar; begin asm move.l #$intlTxtGetChar, D2; end; TxtGetChar := __TxtGetChar(inText, inOffset); end; function TxtSetNextChar(ioText: PChar; inOffset: UInt32; inChar: WChar): UInt16; begin asm move.l #$intlTxtSetNextChar, D2; end; TxtSetNextChar := __TxtSetNextChar(ioText, inOffset, inChar); end; function TxtReplaceStr(ioStr: PChar; inMaxLen: UInt16; const inParamStr: PChar; inParamNum: UInt16): UInt16; begin asm move.l #$intlTxtReplaceStr, D2; end; TxtReplaceStr := __TxtReplaceStr(ioStr, inMaxLen, inParamStr, inParamNum); end; function TxtParamString(const inTemplate, param0, param1, param2, param3: PChar): PChar; begin asm move.l #$intlTxtParamString, D2; end; TxtParamString := __TxtParamString(inTemplate, param0, param1, param2, param3); end; function TxtCharBounds(const inText: PChar; inOffset: UInt32; var outStart: UInt32; var outEnd: UInt32): WChar; begin asm move.l #$intlTxtCharBounds, D2; end; TxtCharBounds := TxtCharBounds(inText, inOffset, outStart, outEnd); end; function TxtGetTruncationOffset(const inText: PChar; inOffset: UInt32): UInt32; begin asm move.l #$intlTxtGetTruncationOffset, D2; end; TxtGetTruncationOffset := __TxtGetTruncationOffset(inText, inOffset); end; function TxtFindString(const inSourceStr, inTargetStr: PChar; var outPos: UInt32; var outLength: UInt16): Boolean; begin asm move.l #$intlTxtFindString, D2; end; TxtFindString := TxtFindString(inSourceStr, inTargetStr, outPos, outLength); end; function TxtWordBounds(const inText: PChar; inLength, inOffset: UInt32; var outStart, outEnd: UInt32): Boolean; begin asm move.l #$intlTxtWordBounds, D2; end; TxtWordBounds := __TxtWordBounds(inText, inLength, inOffset, outStart, outEnd); end; function TxtGetWordWrapOffset(const iTextP: PChar; iOffset: UInt32): UInt32; begin asm move.l #$intlTxtGetWordWrapOffset, D2; end; TxtGetWordWrapOffset := __TxtGetWordWrapOffset(iTextP, iOffset); end; function TxtCharEncoding(inChar: WChar): CharEncodingType; begin asm move.l #$intlTxtCharEncoding, D2; end; TxtCharEncoding := __TxtCharEncoding(inChar); end; function TxtStrEncoding(const inStr: PChar): CharEncodingType; begin asm move.l #$intlTxtStrEncoding, D2; end; TxtStrEncoding := __TxtStrEncoding(inStr); end; function TxtMaxEncoding(a, b: CharEncodingType): CharEncodingType; begin asm move.l #$intlTxtMaxEncoding, D2; end; TxtMaxEncoding := __TxtMaxEncoding(a, b); end; function TxtEncodingName(inEncoding: CharEncodingType): PChar; begin asm move.l #$intlTxtEncodingName, D2; end; TxtEncodingName := __TxtEncodingName(inEncoding); end; function TxtNameToEncoding(const iEncodingName: PChar): CharEncodingType; begin asm move.l #$intlTxtNameToEncoding, D2; end; TxtNameToEncoding := __TxtNameToEncoding(iEncodingName); end; function TxtTransliterate(const inSrcText: PChar; inSrcLength: UInt16; outDstText: PChar; var ioDstLength: UInt16; inOp: TranslitOpType): Err; begin asm move.l #$intlTxtTransliterate, D2; end; TxtTransliterate := __TxtTransliterate(inSrcText, inSrcLength, outDstText, ioDstLength, inOp); end; function TxtConvertEncoding(newConversion: Boolean; var ioStateP: TxtConvertStateType; const srcTextP: PChar; var ioSrcBytes: UInt16; srcEncoding: CharEncodingType; dstTextP: PChar; var ioDstBytes: UInt16; dstEncoding: CharEncodingType; const substitutionStr: PChar; substitutionLen: UInt16): Err; begin asm move.l #$intlTxtConvertEncoding, D2; end; TxtConvertEncoding := __TxtConvertEncoding(newConversion, ioStateP, srcTextP, ioSrcBytes, srcEncoding, dstTextP, ioDstBytes, dstEncoding, substitutionStr, substitutionLen); end; function TxtCharIsValid(inChar: WChar): Boolean; begin asm move.l #$intlTxtCharIsValid, D2; end; TxtCharIsValid := __TxtCharIsValid(inChar); end; function TxtCaselessCompare(const s1: PChar; s1Len: UInt16; var s1MatchLen: UInt16; const s2: PChar; s2Len: UInt16; var s2MatchLen: UInt16): Int16; begin asm move.l #$intlTxtCaselessCompare, D2; end; TxtCaselessCompare := __TxtCaselessCompare(s1, s1Len, s1MatchLen, s2, s2Len, s2MatchLen); end; function TxtCompare(const s1: PChar; s1Len: UInt16; var s1MatchLen: UInt16; const s2: PChar; s2Len: UInt16; var s2MatchLen: UInt16): Int16; begin asm move.l #$intlTxtCompare, D2; end; TxtCompare := __TxtCompare(s1, s1Len, s1MatchLen, s2, s2Len, s2MatchLen); end; function TxtCharIsSpace(ch: WChar): Boolean; begin TxtCharIsSpace := (TxtCharAttr(ch) and charAttrSpace) <> 0; end; function TxtCharIsPrint(ch: WChar): Boolean; begin txtCharIsPrint := (TxtCharAttr(ch) and charAttrPrint) <> 0; end; function TxtCharIsDigit(ch: WChar): Boolean; begin TxtCharIsDigit := (TxtCharAttr(ch) and charAttr_DI) <> 0; end; function TxtCharIsAlNum(ch: WChar): Boolean; begin TxtCharIsAlNum := (TxtCharAttr(ch) and charAttrAlNum) <> 0; end; function TxtCharIsAlpha(ch: WChar): Boolean; begin TxtCharIsAlpha := (TxtCharAttr(ch) and charAttrAlpha) <> 0; end; function TxtCharIsCntrl(ch: WChar): Boolean; begin txtCharIsCntrl := (TxtCharAttr(ch) and charAttrCntrl) <> 0; end; function TxtCharIsGraph(ch: WChar): Boolean; begin TxtCharIsGraph := (TxtCharAttr(ch) and charAttrGraph) <> 0; end; function TxtCharIsLower(ch: WChar): Boolean; begin TxtCharIsLower := (TxtCharAttr(ch) and charAttr_LO) <> 0; end; function TxtCharIsPunct(ch: WChar): Boolean; begin TxtCharIsPunct := (TxtCharAttr(ch) and charAttr_PU) <> 0; end; function TxtCharIsUpper(ch: WChar): Boolean; begin TxtCharIsUpper := (TxtCharAttr(ch) and charAttr_UP) <> 0; end; function TxtCharIsHex(ch: WChar): Boolean; begin TxtCharIsHex := (TxtCharAttr(ch) and charAttr_XD) <> 0; end; function TxtCharIsDelim(ch: WChar): Boolean; begin TxtCharIsDelim := (TxtCharAttr(ch) and charAttrDelim) <> 0; end; function TxtCharIsHardKey(m, c: UInt16): Boolean; begin TxtCharIsHardKey := ((m and commandKeyMask) <> 0) and ((c >= hardKeyMin) and ((c <= hardKeyMax) or (c = calcChr))); end; function TxtCharIsVirtual(m, c: UInt16): Boolean; begin TxtCharIsVirtual := (m and commandKeyMask) <> 0; end; function TxtPreviousCharSize(const inText: PChar; inOffset: UInt32): UInt16; begin TxtPreviousCharSize := TxtGetPreviousChar(inText, inOffset, nil); end; function TxtNextCharSize(const inText: PChar; inOffset: UInt32): UInt16; begin TxtNextCharSize := TxtGetNextChar(inText, inOffset, nil); end; end.