deps: Upgrade Lexilla 5.4.5 to 5.4.6 (clean re-application)

- Updated include/SciLexer.h and LexicalStyles.iface
- Updated lexlib/CharacterCategory.cxx (optimization)
- Updated 14 lexers: AU3, AVS, CoffeeScript, CPP, CSS, D, Inno, Matlab, Python, Registry, Ruby, Rust, TCL, VHDL
- Preserved StyleContext.h NP3 patches (MatchNext)
- Preserved Lexilla.cxx custom catalogue
This commit is contained in:
Derick Payne 2026-01-18 00:31:41 +02:00
parent 94170de0f2
commit fad17c52f4
18 changed files with 222 additions and 77 deletions

View File

@ -149,6 +149,7 @@ val SCLEX_TROFF=137
val SCLEX_DART=138
val SCLEX_ZIG=139
val SCLEX_NIX=140
val SCLEX_SINEX=141
# When a lexer specifies its language as SCLEX_AUTOMATIC it receives a
# value assigned in sequence from SCLEX_AUTOMATIC+1.
@ -1769,7 +1770,6 @@ val SCE_MARKDOWN_LINK=18
val SCE_MARKDOWN_CODE=19
val SCE_MARKDOWN_CODE2=20
val SCE_MARKDOWN_CODEBK=21
val SCE_MARKDOWN_HDRTEXT=22
# Lexical state for SCLEX_TXT2TAGS
lex Txt2tags=SCLEX_TXT2TAGS SCE_TXT2TAGS_
val SCE_TXT2TAGS_DEFAULT=0
@ -2451,3 +2451,11 @@ val SCE_NIX_KEYWORD2=13
val SCE_NIX_KEYWORD3=14
val SCE_NIX_KEYWORD4=15
val SCE_NIX_STRINGEOL=16
# Lexical states for SCLEX_SINEX
lex Sinex=SCLEX_SINEX SCE_SINEX_
val SCE_SINEX_DEFAULT=0
val SCE_SINEX_COMMENTLINE=1
val SCE_SINEX_BLOCK_START=2
val SCE_SINEX_BLOCK_END=3
val SCE_SINEX_DATE=4
val SCE_SINEX_NUMBER=5

View File

@ -1,19 +1,20 @@
/* Scintilla source code edit control */
/** @file SciLexer.h
** Interface to the added lexer functions in the SciLexer version of the edit control.
** Interface to the lexer functions in Lexilla.
** File called SciLexer.h ro retain compatibility with client code.
**/
/* Copyright 1998-2002 by Neil Hodgson <neilh@scintilla.org>
* The License.txt file describes the conditions under which this software may be distributed. */
/* Most of this file is automatically generated from the Scintilla.iface interface definition
* file which contains any comments about the definitions. HFacer.py does the generation. */
/* Most of this file is automatically generated from the LexicalStyles.iface interface definition
* file. LexFacer.py does the generation. */
#ifndef SCILEXER_H
#define SCILEXER_H
/* SciLexer features - not in standard Scintilla */
/* Lexilla features */
/* ++Autogenerated -- start of section automatically generated from Scintilla.iface */
/* ++Autogenerated -- start of section automatically generated from LexicalStyles.iface */
#define SCLEX_CONTAINER 0
#define SCLEX_NULL 1
#define SCLEX_PYTHON 2
@ -153,6 +154,7 @@
#define SCLEX_DART 138
#define SCLEX_ZIG 139
#define SCLEX_NIX 140
#define SCLEX_SINEX 141
#define SCLEX_AUTOMATIC 1000
#define SCE_P_DEFAULT 0
#define SCE_P_COMMENTLINE 1
@ -1578,7 +1580,6 @@
#define SCE_MARKDOWN_CODE 19
#define SCE_MARKDOWN_CODE2 20
#define SCE_MARKDOWN_CODEBK 21
#define SCE_MARKDOWN_HDRTEXT 22
#define SCE_TXT2TAGS_DEFAULT 0
#define SCE_TXT2TAGS_LINE_BEGIN 1
#define SCE_TXT2TAGS_STRONG1 2
@ -2189,6 +2190,12 @@
#define SCE_NIX_KEYWORD3 14
#define SCE_NIX_KEYWORD4 15
#define SCE_NIX_STRINGEOL 16
/* --Autogenerated -- end of section automatically generated from Scintilla.iface */
#define SCE_SINEX_DEFAULT 0
#define SCE_SINEX_COMMENTLINE 1
#define SCE_SINEX_BLOCK_START 2
#define SCE_SINEX_BLOCK_END 3
#define SCE_SINEX_DATE 4
#define SCE_SINEX_NUMBER 5
/* --Autogenerated -- end of section automatically generated from LexicalStyles.iface */
#endif

View File

@ -79,12 +79,12 @@ static inline bool IsTypeCharacter(const int ch)
}
static inline bool IsAWordChar(const int ch)
{
return ((IsASCII(ch) && isalnum(ch)) || ch == '_');
return (ch < 0x80) && (isalnum(ch) || ch == '_');
}
static inline bool IsAWordStart(const int ch)
{
return ((IsASCII(ch) && isalnum(ch)) || ch == '_' || ch == '@' || ch == '#' || ch == '$' || ch == '.');
return (ch < 0x80) && (isalnum(ch) || ch == '_' || ch == '@' || ch == '#' || ch == '$' || ch == '.');
}
static inline bool IsAOperator(char ch) {
@ -143,7 +143,7 @@ static int GetSendKey(const char *szLine, char *szKey)
// Save second portion into var...
szSpecial[nSpecPos++] = cTemp;
// check if Second portion is all numbers for repeat fuction
if (isdigit(cTemp & 0xFF) == false) {nSpecNum = 0;}
if (isdigit(cTemp) == false) {nSpecNum = 0;}
}
}
nPos++; // skip to next char

View File

@ -30,17 +30,18 @@
using namespace Lexilla;
static inline bool IsAWordChar(const int ch) {
return IsASCII(ch) && (isalnum(ch) || ch == '_');
return (ch < 0x80) && (isalnum(ch) || ch == '_');
}
static inline bool IsAWordStart(int ch) {
return isalpha(ch & 0xFF) || (ch != ' ' && ch != '\n' && ch != '(' && ch != '.' && ch != ',');
return isalpha(ch) || (ch != ' ' && ch != '\n' && ch != '(' && ch != '.' && ch != ',');
}
static inline bool IsANumberChar(int ch) {
// Not exactly following number definition (several dots are seen as OK, etc.)
// but probably enough in most cases.
return IsASCII(ch) && (isdigit(ch) || ch == '.' || ch == '-' || ch == '+');
return (ch < 0x80) &&
(isdigit(ch) || ch == '.' || ch == '-' || ch == '+');
}
static void ColouriseAvsDoc(

View File

@ -528,7 +528,7 @@ const LexicalClass lexicalClasses[] = {
27, "SCE_C_ESCAPESEQUENCE", "literal string escapesequence", "Escape sequence",
};
constexpr int sizeLexicalClasses{ static_cast<int>(std::size(lexicalClasses)) };
constexpr int sizeLexicalClasses = static_cast<int>(std::size(lexicalClasses));
}

View File

@ -44,11 +44,11 @@ static inline bool IsAWordChar(const unsigned int ch) {
* Unfortunately, we are only getting string bytes here, and not full unicode characters. We cannot guarantee
* that our byte is between U+0080 - U+00A0 (to return false), so we have to allow all characters U+0080 and higher
*/
return ch >= 0x80 || isalnum(ch & 0xFF) || ch == '-' || ch == '_';
return ch >= 0x80 || isalnum(ch) || ch == '-' || ch == '_';
}
inline bool IsCssOperator(const int ch) {
if (!(IsASCII(ch) && isalnum(ch)) &&
if (!((ch < 0x80) && isalnum(ch)) &&
(ch == '{' || ch == '}' || ch == ':' || ch == ',' || ch == ';' ||
ch == '.' || ch == '#' || ch == '!' || ch == '@' ||
/* CSS2 */

View File

@ -249,7 +249,7 @@ static void ColouriseCoffeeScriptDoc(Sci_PositionU startPos, Sci_Position length
sc.SetState(SCE_COFFEESCRIPT_DEFAULT);
} else if (sc.ch == '/') {
sc.Forward();
while (IsASCII(sc.ch) && islower(sc.ch))
while ((sc.ch < 0x80) && islower(sc.ch))
sc.Forward(); // gobble regex flags
sc.SetState(SCE_COFFEESCRIPT_DEFAULT);
} else if (sc.ch == '\\') {

View File

@ -234,7 +234,10 @@ Sci_Position SCI_METHOD LexerD::WordListSet(int n, const char *wl) {
}
Sci_Position firstModification = -1;
if (wordListN) {
if (wordListN->Set(wl)) {
WordList wlNew;
wlNew.Set(wl);
if (*wordListN != wlNew) {
wordListN->Set(wl);
firstModification = 0;
}
}

View File

@ -89,6 +89,7 @@ static void ColouriseInnoDoc(Sci_PositionU startPos, Sci_Position length, int, W
// using the hand-written state machine shown below
styler.StartAt(startPos);
styler.StartSegment(startPos);
for (Sci_Position i = startPos; i < lengthDoc; i++) {
chPrev = ch;
ch = chNext;

View File

@ -242,7 +242,7 @@ static void ColouriseMatlabOctaveDoc(
sc.SetState(SCE_MATLAB_DEFAULT);
}
} else if (sc.state == SCE_MATLAB_KEYWORD) {
if (!isalnum(sc.ch & 0xFF) && sc.ch != '_') {
if (!isalnum(sc.ch) && sc.ch != '_') {
char s[100];
sc.GetCurrent(s, sizeof(s));
bool notKeyword = false;
@ -302,7 +302,7 @@ static void ColouriseMatlabOctaveDoc(
styler.SetLineState(curLine, ComposeLineState(
commentDepth, foldingLevel, expectingArgumentsBlock, inClassScope, inArgumentsScope));
} else if (sc.state == SCE_MATLAB_NUMBER) {
if (!isdigit(sc.ch & 0xFF) && sc.ch != '.'
if (!isdigit(sc.ch) && sc.ch != '.'
&& !(sc.ch == 'e' || sc.ch == 'E')
&& !((sc.ch == '+' || sc.ch == '-') && (sc.chPrev == 'e' || sc.chPrev == 'E'))
&& !(((sc.ch == 'x' || sc.ch == 'X') && sc.chPrev == '0') || (sc.ch >= 'a' && sc.ch <= 'f') || (sc.ch >= 'A' && sc.ch <= 'F'))
@ -394,9 +394,9 @@ static void ColouriseMatlabOctaveDoc(
}
} else if (sc.ch == '"') {
sc.SetState(SCE_MATLAB_DOUBLEQUOTESTRING);
} else if (isdigit(sc.ch & 0xFF) || (sc.ch == '.' && isdigit(sc.chNext & 0xFF))) {
} else if (isdigit(sc.ch) || (sc.ch == '.' && isdigit(sc.chNext))) {
sc.SetState(SCE_MATLAB_NUMBER);
} else if (isalpha(sc.ch & 0xFF)) {
} else if (isalpha(sc.ch)) {
sc.SetState(SCE_MATLAB_KEYWORD);
} else if (isoperator(static_cast<char>(sc.ch)) || sc.ch == '@' || sc.ch == '\\') {
if (sc.ch == '(' || sc.ch == '[' || sc.ch == '{') {

View File

@ -54,6 +54,9 @@ namespace {
The PEP for f-strings is at https://www.python.org/dev/peps/pep-0498/
*/
/* t-string are lexed identically to f-strings and use the stack of state values
and the lexer states for f-strings
*/
struct SingleFStringExpState {
int state;
int nestingCount;
@ -62,7 +65,7 @@ struct SingleFStringExpState {
/* kwCDef, kwCTypeName only used for Cython */
enum kwType { kwOther, kwClass, kwDef, kwImport, kwCDef, kwCTypeName, kwCPDef };
enum literalsAllowed { litNone = 0, litU = 1, litB = 2, litF = 4 };
enum literalsAllowed { litNone = 0, litU = 1, litB = 2, litF = 4, litT = 8 };
constexpr int indicatorWhitespace = 1;
@ -74,7 +77,8 @@ constexpr bool IsPyStringTypeChar(int ch, literalsAllowed allowed) noexcept {
return
((allowed & litB) && (ch == 'b' || ch == 'B')) ||
((allowed & litU) && (ch == 'u' || ch == 'U')) ||
((allowed & litF) && (ch == 'f' || ch == 'F'));
((allowed & litF) && (ch == 'f' || ch == 'F')) ||
((allowed & litT) && (ch == 't' || ch == 'T'));
}
constexpr bool IsQuote(int ch) {
@ -88,7 +92,7 @@ constexpr bool IsRawPrefix(int ch) {
bool IsPyStringStart(int ch, int chNext, int chNext2, literalsAllowed allowed) noexcept {
// To cover both python2 and python3 lex character prefixes as --
// ur'' is a string, but ru'' is not
// fr'', rf'', br'', rb'' are all strings
// fr'', rf'', br'', rb'', tr'', rt'' are all strings
if (IsQuote(ch))
return true;
if (IsPyStringTypeChar(ch, allowed)) {
@ -163,14 +167,14 @@ int GetPyStringState(Accessor &styler, Sci_Position i, Sci_PositionU *nextIndex,
if (IsRawPrefix(ch)) {
i++;
if (IsPyStringTypeChar(chNext, allowed)) {
if (AnyOf(chNext, 'f', 'F'))
if (AnyOf(chNext, 'f', 'F', 't', 'T'))
isFString = true;
i++;
}
ch = styler.SafeGetCharAt(i);
chNext = styler.SafeGetCharAt(i + 1);
} else if (IsPyStringTypeChar(ch, allowed)) {
if (AnyOf(ch, 'f', 'F'))
if (AnyOf(ch, 'f', 'F', 't', 'T'))
isFString = true;
if (IsRawPrefix(chNext))
i += 2;
@ -291,6 +295,7 @@ struct OptionsPython {
bool stringsU = true;
bool stringsB = true;
bool stringsF = true;
bool stringsT = true;
bool stringsOverNewline = false;
bool keywords2NoSubIdentifiers = false;
bool fold = false;
@ -307,6 +312,8 @@ struct OptionsPython {
allowedLiterals = static_cast<literalsAllowed>(allowedLiterals | litB);
if (stringsF)
allowedLiterals = static_cast<literalsAllowed>(allowedLiterals | litF);
if (stringsT)
allowedLiterals = static_cast<literalsAllowed>(allowedLiterals | litT);
return allowedLiterals;
}
};
@ -343,6 +350,9 @@ struct OptionSetPython : public OptionSet<OptionsPython> {
DefineProperty("lexer.python.strings.f.pep.701", &OptionsPython::pep701StringsF,
"Set to 0 to use pre-PEP 701 / Python 3.12 f-string lexing.");
DefineProperty("lexer.python.strings.t", &OptionsPython::stringsT,
"Set to 0 to not recognise Python 3.14 t-string literals t\"var={var}\".");
DefineProperty("lexer.python.strings.over.newline", &OptionsPython::stringsOverNewline,
"Set to 1 to allow strings to span newline characters.");

View File

@ -36,7 +36,7 @@ using namespace Scintilla;
using namespace Lexilla;
static const char *const RegistryWordListDesc[] = {
nullptr
0
};
struct OptionsRegistry {
@ -250,7 +250,7 @@ void SCI_METHOD LexerRegistry::Lex(Sci_PositionU startPos,
}
if (context.state == SCE_REG_STRING &&
context.ch == '%' &&
(isdigit(context.chNext & 0xFF) || context.chNext == '*')) {
(isdigit(context.chNext) || context.chNext == '*')) {
context.SetState(SCE_REG_PARAMETER);
}
}
@ -337,7 +337,7 @@ void SCI_METHOD LexerRegistry::Lex(Sci_PositionU startPos,
afterEqualSign = true;
highlight = true;
} else if (afterEqualSign) {
bool wordStart = isalpha(context.ch & 0xFF) && !isalpha(context.chPrev & 0xFF);
bool wordStart = isalpha(context.ch) && !isalpha(context.chPrev);
if (wordStart && AtValueType(styler, currPos)) {
context.SetState(SCE_REG_VALUETYPE);
}

View File

@ -75,7 +75,7 @@ bool isSafeWordcharOrHigh(char ch) noexcept {
// Error: scintilla's KeyWords.h includes '.' as a word-char
// we want to separate things that can take methods from the
// methods.
return isHighBitChar(ch) || isalnum(ch & 0xFF) || ch == '_';
return isHighBitChar(ch) || isalnum(ch) || ch == '_';
}
constexpr bool isWhiteSpace(char ch) noexcept {

View File

@ -7,12 +7,12 @@
// Copyright 1998-2005 by Neil Hodgson <neilh@scintilla.org>
// The License.txt file describes the conditions under which this software may be distributed.
#include <stdlib.h>
#include <string.h>
#include <stdio.h>
#include <stdarg.h>
#include <assert.h>
#include <ctype.h>
#include <cstdlib>
#include <cassert>
#include <cstring>
#include <cctype>
#include <cstdio>
#include <cstdarg>
#include <string>
#include <string_view>
@ -93,7 +93,7 @@ static const char * const rustWordLists[NUM_RUST_KEYWORD_LISTS + 1] = {
"Keywords 5",
"Keywords 6",
"Keywords 7",
0,
nullptr,
};
struct OptionSetRust : public OptionSet<OptionsRust> {
@ -131,12 +131,42 @@ struct OptionSetRust : public OptionSet<OptionsRust> {
}
};
const LexicalClass lexicalClasses[] = {
// Lexer rust SCLEX_RUST SCE_RUST_:
0, "SCE_RUST_DEFAULT", "default", "White space",
1, "SCE_RUST_COMMENTBLOCK", "comment", "Comment",
2, "SCE_RUST_COMMENTLINE", "comment line", "Line comment",
3, "SCE_RUST_COMMENTBLOCKDOC", "comment documentation", "Doc comment",
4, "SCE_RUST_COMMENTLINEDOC", "comment documentation line", "Doc comment line",
5, "SCE_RUST_NUMBER", "literal numeric", "Number",
6, "SCE_RUST_WORD", "keyword", "Keywords",
7, "SCE_RUST_WORD2", "identifier", "Keywords 2",
8, "SCE_RUST_WORD3", "identifier", "Keywords 3",
9, "SCE_RUST_WORD4", "identifier", "Keywords 4",
10, "SCE_RUST_WORD5", "identifier", "Keywords 5",
11, "SCE_RUST_WORD6", "identifier", "Keywords 6",
12, "SCE_RUST_WORD7", "identifier", "Keywords 7",
13, "SCE_RUST_STRING", "literal string", "Regular string",
14, "SCE_RUST_STRINGR", "literal string raw", "Raw string",
15, "SCE_RUST_CHARACTER", "literal string character", "Character",
16, "SCE_RUST_OPERATOR", "operator", "Operator",
17, "SCE_RUST_IDENTIFIER", "identifier", "Identifier",
18, "SCE_RUST_LIFETIME", "annotation", "Lifetime",
19, "SCE_RUST_MACRO", "macro preprocessor", "Macro",
20, "SCE_RUST_LEXERROR", "error", "Lexical error",
21, "SCE_RUST_BYTESTRING", "literal string", "Byte string",
22, "SCE_RUST_BYTESTRINGR", "literal string raw", "Raw byte string",
23, "SCE_RUST_BYTECHARACTER", "literal string character", "Byte character",
24, "SCE_RUST_CSTRING", "literal string", "C string",
25, "SCE_RUST_CSTRINGR", "literal string raw", "Raw C string",
};
class LexerRust : public DefaultLexer {
WordList keywords[NUM_RUST_KEYWORD_LISTS];
OptionsRust options;
OptionSetRust osRust;
public:
LexerRust() : DefaultLexer("rust", SCLEX_RUST) {
LexerRust() : DefaultLexer("rust", SCLEX_RUST, lexicalClasses, std::size(lexicalClasses)) {
}
virtual ~LexerRust() {
}
@ -166,7 +196,7 @@ public:
void SCI_METHOD Lex(Sci_PositionU startPos, Sci_Position length, int initStyle, IDocument *pAccess) override;
void SCI_METHOD Fold(Sci_PositionU startPos, Sci_Position length, int initStyle, IDocument *pAccess) override;
void * SCI_METHOD PrivateCall(int, void *) override {
return 0;
return nullptr;
}
static ILexer5 *LexerFactoryRust() {
return new LexerRust();

View File

@ -31,11 +31,11 @@ using namespace Lexilla;
// Extended to accept accented characters
static inline bool IsAWordChar(int ch) {
return ch >= 0x80 ||
(isalnum(ch & 0xFF) || ch == '_' || ch ==':' || ch=='.'); // : name space separator
(isalnum(ch) || ch == '_' || ch ==':' || ch=='.'); // : name space separator
}
static inline bool IsAWordStart(int ch) {
return ch >= 0x80 || (ch ==':' || isalpha(ch & 0xFF) || ch == '_');
return ch >= 0x80 || (ch ==':' || isalpha(ch) || ch == '_');
}
static inline bool IsANumberChar(int ch) {
@ -48,7 +48,6 @@ static inline bool IsANumberChar(int ch) {
static void ColouriseTCLDoc(Sci_PositionU startPos, Sci_Position length, int , WordList *keywordlists[], Accessor &styler) {
#define isComment(s) (s==SCE_TCL_COMMENT || s==SCE_TCL_COMMENTLINE || s==SCE_TCL_COMMENT_BOX || s==SCE_TCL_BLOCK_COMMENT)
const bool fold = (styler.GetPropertyInt("fold") != 0);
const bool foldComment = styler.GetPropertyInt("fold.comment") != 0;
const bool foldCompact = styler.GetPropertyInt("fold.compact", 1) != 0;
bool commentLevel = false;
@ -86,8 +85,7 @@ static void ColouriseTCLDoc(Sci_PositionU startPos, Sci_Position length, int , W
currentLevel = styler.LevelAt(currentLine - 1) >> 17;
commentLevel = (styler.LevelAt(currentLine - 1) >> 16) & 1;
} else
if (fold) { styler.SetLevel(0, SC_FOLDLEVELBASE | SC_FOLDLEVELHEADERFLAG); }
styler.SetLevel(0, SC_FOLDLEVELBASE | SC_FOLDLEVELHEADERFLAG);
bool visibleChars = false;
int previousLevel = currentLevel;
@ -209,10 +207,8 @@ next:
flag = SC_FOLDLEVELWHITEFLAG;
if (currentLevel > previousLevel)
flag = SC_FOLDLEVELHEADERFLAG;
if (fold) {
styler.SetLevel(currentLine, flag + previousLevel + SC_FOLDLEVELBASE + (currentLevel << 17) + (commentLevel << 16));
}
styler.SetLevel(currentLine, flag + previousLevel + SC_FOLDLEVELBASE + (currentLevel << 17) + (commentLevel << 16));
// Update the line state, so it can be seen by next line
if (sc.state == SCE_TCL_IN_QUOTE) {
lineState = LS_OPEN_DOUBLE_QUOTE;

View File

@ -43,12 +43,12 @@ static void ColouriseVHDLDoc(
/***************************************/
static inline bool IsAWordChar(const int ch) {
return IsASCII(ch) && (isalnum(ch) || ch == '.' || ch == '_' );
return (ch < 0x80) && (isalnum(ch) || ch == '.' || ch == '_' );
}
/***************************************/
static inline bool IsAWordStart(const int ch) {
return IsASCII(ch) && (isalnum(ch) || ch == '_');
return (ch < 0x80) && (isalnum(ch) || ch == '_');
}
/***************************************/
@ -235,9 +235,8 @@ static void FoldNoBoxVHDLDoc(
// Decided it would be smarter to have the lexer have all keywords included. Therefore I
// don't check if the style for the keywords that I use to adjust the levels.
char words[] =
"architecture begin block case component configuration context else elsif end entity for function "
"generate if loop package procedure process protected record then units view when";
"architecture begin block case component else elsif end entity for generate loop package process record then "
"procedure protected function when units";
WordList keywords;
keywords.Set(words);

View File

@ -20,7 +20,7 @@ namespace {
const int catRanges[] = {
//++Autogenerated -- start of section automatically generated
// Created with Python 3.13.0, Unicode 15.1.0
// Created with Python 3.14.0, Unicode 16.0.0
25,
1046,
1073,
@ -754,7 +754,7 @@ const int catRanges[] = {
70141,
70170,
70237,
70405,
70373,
70660,
71971,
72005,
@ -1425,13 +1425,13 @@ const int catRanges[] = {
223334,
223396,
223677,
223697,
223752,
224081,
224309,
224613,
224917,
225201,
225277,
225285,
225350,
225380,
@ -1469,7 +1469,9 @@ const int catRanges[] = {
233219,
233425,
233473,
233789,
233760,
233793,
233853,
233984,
235389,
235424,
@ -1948,7 +1950,7 @@ const int catRanges[] = {
292501,
293778,
293973,
296189,
296285,
296981,
297341,
297994,
@ -2317,7 +2319,7 @@ const int catRanges[] = {
406229,
406532,
407573,
408733,
408797,
409077,
409092,
409621,
@ -2586,7 +2588,9 @@ const int catRanges[] = {
1374465,
1374496,
1374529,
1374589,
1374560,
1374625,
1374685,
1374720,
1374753,
1374813,
@ -2597,7 +2601,10 @@ const int catRanges[] = {
1374945,
1374976,
1375009,
1375069,
1375040,
1375073,
1375104,
1375165,
1375811,
1375904,
1375937,
@ -3003,6 +3010,8 @@ const int catRanges[] = {
2144093,
2144097,
2144189,
2144260,
2145949,
2146308,
2156285,
2156548,
@ -3116,6 +3125,19 @@ const int catRanges[] = {
2204957,
2205192,
2205533,
2205704,
2206020,
2206147,
2206180,
2206208,
2206941,
2207013,
2207180,
2207203,
2207233,
2207965,
2208210,
2208285,
2214922,
2215933,
2215940,
@ -3125,7 +3147,9 @@ const int catRanges[] = {
2217437,
2217476,
2217565,
2219941,
2218052,
2218173,
2219909,
2220036,
2220970,
2221284,
@ -3281,6 +3305,37 @@ const int catRanges[] = {
2256317,
2256389,
2256573,
2256900,
2257245,
2257252,
2257309,
2257348,
2257405,
2257412,
2258653,
2258660,
2258694,
2258789,
2259005,
2259014,
2259069,
2259110,
2259165,
2259174,
2259325,
2259334,
2259397,
2259430,
2259461,
2259492,
2259525,
2259556,
2259601,
2259677,
2259697,
2259773,
2260005,
2260093,
2260996,
2262694,
2262789,
@ -3351,9 +3406,13 @@ const int catRanges[] = {
2283357,
2283528,
2283869,
2284040,
2284701,
2285572,
2286461,
2286501,
2286534,
2286565,
2286598,
2286661,
2286790,
@ -3442,6 +3501,11 @@ const int catRanges[] = {
2318141,
2318353,
2318685,
2324484,
2325553,
2325597,
2326024,
2326365,
2326532,
2326845,
2326852,
@ -3523,7 +3587,8 @@ const int catRanges[] = {
2353221,
2353265,
2353672,
2354013,
2353989,
2354045,
2356740,
2356797,
2357258,
@ -3549,8 +3614,16 @@ const int catRanges[] = {
2525220,
2525413,
2525917,
2526212,
2654077,
2654212,
2672893,
2891780,
2892741,
2893126,
2893221,
2893320,
2893661,
2949124,
2967357,
2967556,
@ -3583,6 +3656,12 @@ const int catRanges[] = {
2977565,
2977700,
2978333,
2992131,
2992228,
2993507,
2993585,
2993672,
2994013,
3000320,
3001345,
3002378,
@ -3608,7 +3687,7 @@ const int catRanges[] = {
3211037,
3211268,
3250909,
3252228,
3252196,
3252541,
3538435,
3538589,
@ -3641,6 +3720,11 @@ const int catRanges[] = {
3642353,
3642394,
3642525,
3768341,
3776008,
3776349,
3776533,
3790493,
3792901,
3794397,
3794437,
@ -3825,6 +3909,13 @@ const int catRanges[] = {
3972485,
3972616,
3972957,
3979780,
3980741,
3980804,
3980840,
3981181,
3981297,
3981341,
3996676,
3996925,
3996932,
@ -3977,7 +4068,9 @@ const int catRanges[] = {
4133397,
4134365,
4134421,
4134493,
4134813,
4134933,
4135005,
4136981,
4147869,
4148245,
@ -3985,21 +4078,18 @@ const int catRanges[] = {
4148757,
4149181,
4149269,
4149565,
4149781,
4151261,
4151285,
4151517,
4149597,
4149749,
4151549,
4151765,
4152221,
4152341,
4152637,
4152253,
4152309,
4152669,
4152853,
4153149,
4153365,
4158077,
4158101,
4159869,
4161032,
4161373,
4194308,

View File

@ -1 +1 @@
545
546