192
173
UseCache: boolean): string;
193
174
function GetLineInfo(Addr: Pointer; UseCache: boolean): string;
195
procedure DebugLn(Args: array of const);
196
procedure DebugLn(const S: String; Args: array of const);// similar to Format(s,Args)
198
procedure DebugLn(const s: string);
199
procedure DebugLn(const s1,s2: string);
200
procedure DebugLn(const s1,s2,s3: string);
201
procedure DebugLn(const s1,s2,s3,s4: string);
202
procedure DebugLn(const s1,s2,s3,s4,s5: string);
203
procedure DebugLn(const s1,s2,s3,s4,s5,s6: string);
204
procedure DebugLn(const s1,s2,s3,s4,s5,s6,s7: string);
205
procedure DebugLn(const s1,s2,s3,s4,s5,s6,s7,s8: string);
206
procedure DebugLn(const s1,s2,s3,s4,s5,s6,s7,s8,s9: string);
207
procedure DebugLn(const s1,s2,s3,s4,s5,s6,s7,s8,s9,s10: string);
208
procedure DebugLn(const s1,s2,s3,s4,s5,s6,s7,s8,s9,s10,s11: string);
209
procedure DebugLn(const s1,s2,s3,s4,s5,s6,s7,s8,s9,s10,s11,s12: string);
210
procedure DebugLn(const s1,s2,s3,s4,s5,s6,s7,s8,s9,s10,s11,s12,s13: string);
211
procedure DebugLn(const s1,s2,s3,s4,s5,s6,s7,s8,s9,s10,s11,s12,s13,s14: string);
212
procedure DebugLn(const s1,s2,s3,s4,s5,s6,s7,s8,s9,s10,s11,s12,s13,s14,s15: string);
213
procedure DebugLn(const s1,s2,s3,s4,s5,s6,s7,s8,s9,s10,s11,s12,s13,s14,s15,s16: string);
215
procedure DebugLnEnter(const s: string = nil);
216
procedure DebugLnEnter(Args: array of const);
217
procedure DebugLnEnter(s: string; Args: array of const);
218
procedure DebugLnEnter(const s1, s2: string; const s3: string = nil;
219
const s4: string = nil; const s5: string = nil; const s6: string = nil;
220
const s7: string = nil; const s8: string = nil; const s9: string = nil;
221
const s10: string = nil; const s11: string = nil; const s12: string = nil;
222
const s13: string = nil; const s14: string = nil; const s15: string = nil;
223
const s16: string = nil; const s17: string = nil; const s18: string = nil);
224
procedure DebugLnExit(const s: string = nil);
225
procedure DebugLnExit(Args: array of const);
226
procedure DebugLnExit(s: string; Args: array of const);
227
procedure DebugLnExit (const s1, s2: string; const s3: string = nil;
228
const s4: string = nil; const s5: string = nil; const s6: string = nil;
229
const s7: string = nil; const s8: string = nil; const s9: string = nil;
230
const s10: string = nil; const s11: string = nil; const s12: string = nil;
231
const s13: string = nil; const s14: string = nil; const s15: string = nil;
232
const s16: string = nil; const s17: string = nil; const s18: string = nil);
234
function ConvertLineEndings(const s: string): string;
236
procedure DbgOut(const S: String; Args: array of const);
237
procedure DbgOut(const s: string);
238
procedure DbgOut(const s1,s2: string);
239
procedure DbgOut(const s1,s2,s3: string);
240
procedure DbgOut(const s1,s2,s3,s4: string);
241
procedure DbgOut(const s1,s2,s3,s4,s5: string);
242
procedure DbgOut(const s1,s2,s3,s4,s5,s6: string);
243
procedure DbgOut(const s1,s2,s3,s4,s5,s6,s7: string);
244
procedure DbgOut(const s1,s2,s3,s4,s5,s6,s7,s8: string);
245
procedure DbgOut(const s1,s2,s3,s4,s5,s6,s7,s8,s9: string);
246
procedure DbgOut(const s1,s2,s3,s4,s5,s6,s7,s8,s9,s10: string);
247
procedure DbgOut(const s1,s2,s3,s4,s5,s6,s7,s8,s9,s10,s11: string);
248
procedure DbgOut(const s1,s2,s3,s4,s5,s6,s7,s8,s9,s10,s11,s12: string);
250
function DbgS(const c: cardinal): string; overload;
251
function DbgS(const i: longint): string; overload;
252
function DbgS(const i: int64): string; overload;
253
function DbgS(const q: qword): string; overload;
254
function DbgS(const r: TRect): string; overload;
255
function DbgS(const p: TPoint): string; overload;
256
function DbgS(const p: pointer): string; overload;
257
function DbgS(const e: extended; MaxDecimals: integer = 999): string; overload;
258
function DbgS(const b: boolean): string; overload;
259
function DbgS(const s: TComponentState): string; overload;
260
function DbgS(const m: TMethod): string; overload;
261
function DbgSName(const p: TObject): string; overload;
262
function DbgSName(const p: TClass): string; overload;
263
function DbgStr(const StringWithSpecialChars: string): string; overload;
264
function DbgWideStr(const StringWithSpecialChars: widestring): string; overload;
265
function dbgMemRange(P: PByte; Count: integer; Width: integer = 0): string; overload;
266
function dbgMemStream(MemStream: TCustomMemoryStream; Count: integer): string; overload;
267
function dbgObjMem(AnObject: TObject): string; overload;
268
function dbghex(i: Int64): string; overload;
176
{$IFnDEF WithOldDebugln}
177
procedure DbgOut(const s: string = ''); inline; overload;
178
procedure DbgOut(Args: array of const); {inline;} overload;
179
procedure DbgOut(const S: String; Args: array of const); {inline;} overload;// similar to Format(s,Args)
180
procedure DbgOut(const s1, s2: string; const s3: string = '';
181
const s4: string = ''; const s5: string = ''; const s6: string = '';
182
const s7: string = ''; const s8: string = ''; const s9: string = '';
183
const s10: string = ''; const s11: string = ''; const s12: string = '';
184
const s13: string = ''; const s14: string = ''; const s15: string = '';
185
const s16: string = ''; const s17: string = ''; const s18: string = ''); inline; overload;
187
procedure DebugLn(const s: string = ''); inline; overload;
188
procedure DebugLn(Args: array of const); {inline;} overload;
189
procedure DebugLn(const S: String; Args: array of const); {inline;} overload;// similar to Format(s,Args)
190
procedure DebugLn(const s1, s2: string; const s3: string = '';
191
const s4: string = ''; const s5: string = ''; const s6: string = '';
192
const s7: string = ''; const s8: string = ''; const s9: string = '';
193
const s10: string = ''; const s11: string = ''; const s12: string = '';
194
const s13: string = ''; const s14: string = ''; const s15: string = '';
195
const s16: string = ''; const s17: string = ''; const s18: string = ''); inline; overload;
197
procedure DebugLnEnter(const s: string = ''); inline; overload;
198
procedure DebugLnEnter(Args: array of const); {inline;} overload;
199
procedure DebugLnEnter(s: string; Args: array of const); {inline;} overload;
200
procedure DebugLnEnter(const s1, s2: string; const s3: string = '';
201
const s4: string = ''; const s5: string = ''; const s6: string = '';
202
const s7: string = ''; const s8: string = ''; const s9: string = '';
203
const s10: string = ''; const s11: string = ''; const s12: string = '';
204
const s13: string = ''; const s14: string = ''; const s15: string = '';
205
const s16: string = ''; const s17: string = ''; const s18: string = ''); inline; overload;
207
procedure DebugLnExit(const s: string = ''); inline; overload;
208
procedure DebugLnExit(Args: array of const); {inline;} overload;
209
procedure DebugLnExit(s: string; Args: array of const); {inline;} overload;
210
procedure DebugLnExit (const s1, s2: string; const s3: string = '';
211
const s4: string = ''; const s5: string = ''; const s6: string = '';
212
const s7: string = ''; const s8: string = ''; const s9: string = '';
213
const s10: string = ''; const s11: string = ''; const s12: string = '';
214
const s13: string = ''; const s14: string = ''; const s15: string = '';
215
const s16: string = ''; const s17: string = ''; const s18: string = ''); inline; overload;
217
procedure CloseDebugOutput;
219
procedure DebugLn(Args: array of const); overload;
220
procedure DebugLn(const S: String; Args: array of const); overload;// similar to Format(s,Args)
221
procedure DebugLn; overload;
222
procedure DebugLn(const s: string); overload;
223
procedure DebugLn(const s1,s2: string); overload;
224
procedure DebugLn(const s1,s2,s3: string); overload;
225
procedure DebugLn(const s1,s2,s3,s4: string); overload;
226
procedure DebugLn(const s1,s2,s3,s4,s5: string); overload;
227
procedure DebugLn(const s1,s2,s3,s4,s5,s6: string); overload;
228
procedure DebugLn(const s1,s2,s3,s4,s5,s6,s7: string); overload;
229
procedure DebugLn(const s1,s2,s3,s4,s5,s6,s7,s8: string); overload;
230
procedure DebugLn(const s1,s2,s3,s4,s5,s6,s7,s8,s9: string); overload;
231
procedure DebugLn(const s1,s2,s3,s4,s5,s6,s7,s8,s9,s10: string); overload;
232
procedure DebugLn(const s1,s2,s3,s4,s5,s6,s7,s8,s9,s10,s11: string); overload;
233
procedure DebugLn(const s1,s2,s3,s4,s5,s6,s7,s8,s9,s10,s11,s12: string); overload;
234
procedure DebugLn(const s1,s2,s3,s4,s5,s6,s7,s8,s9,s10,s11,s12,s13: string); overload;
235
procedure DebugLn(const s1,s2,s3,s4,s5,s6,s7,s8,s9,s10,s11,s12,s13,s14: string); overload;
236
procedure DebugLn(const s1,s2,s3,s4,s5,s6,s7,s8,s9,s10,s11,s12,s13,s14,s15: string); overload;
237
procedure DebugLn(const s1,s2,s3,s4,s5,s6,s7,s8,s9,s10,s11,s12,s13,s14,s15,s16: string); overload;
239
procedure DebugLnEnter(const s: string = ''); overload;
240
procedure DebugLnEnter(Args: array of const); overload;
241
procedure DebugLnEnter(s: string; Args: array of const); overload;
242
procedure DebugLnEnter(const s1, s2: string; const s3: string = '';
243
const s4: string = ''; const s5: string = ''; const s6: string = '';
244
const s7: string = ''; const s8: string = ''; const s9: string = '';
245
const s10: string = ''; const s11: string = ''; const s12: string = '';
246
const s13: string = ''; const s14: string = ''; const s15: string = '';
247
const s16: string = ''; const s17: string = ''; const s18: string = ''); overload;
248
procedure DebugLnExit(const s: string = ''); overload;
249
procedure DebugLnExit(Args: array of const); overload;
250
procedure DebugLnExit(s: string; Args: array of const); overload;
251
procedure DebugLnExit (const s1, s2: string; const s3: string = '';
252
const s4: string = ''; const s5: string = ''; const s6: string = '';
253
const s7: string = ''; const s8: string = ''; const s9: string = '';
254
const s10: string = ''; const s11: string = ''; const s12: string = '';
255
const s13: string = ''; const s14: string = ''; const s15: string = '';
256
const s16: string = ''; const s17: string = ''; const s18: string = ''); overload;
258
procedure DbgOut(const S: String; Args: array of const); overload;
259
procedure DbgOut(const s: string); overload;
260
procedure DbgOut(const s1,s2: string); overload;
261
procedure DbgOut(const s1,s2,s3: string); overload;
262
procedure DbgOut(const s1,s2,s3,s4: string); overload;
263
procedure DbgOut(const s1,s2,s3,s4,s5: string); overload;
264
procedure DbgOut(const s1,s2,s3,s4,s5,s6: string); overload;
265
procedure DbgOut(const s1,s2,s3,s4,s5,s6,s7: string); overload;
266
procedure DbgOut(const s1,s2,s3,s4,s5,s6,s7,s8: string); overload;
267
procedure DbgOut(const s1,s2,s3,s4,s5,s6,s7,s8,s9: string); overload;
268
procedure DbgOut(const s1,s2,s3,s4,s5,s6,s7,s8,s9,s10: string); overload;
269
procedure DbgOut(const s1,s2,s3,s4,s5,s6,s7,s8,s9,s10,s11: string); overload;
270
procedure DbgOut(const s1,s2,s3,s4,s5,s6,s7,s8,s9,s10,s11,s12: string); overload;
272
procedure CloseDebugOutput;
275
function ConvertLineEndings(const s: string): string; inline;
276
function DbgS(const c: cardinal): string; overload; inline;
277
function DbgS(const i: longint): string; overload; inline;
278
function DbgS(const i: int64): string; overload; inline;
279
function DbgS(const q: qword): string; overload; inline;
280
function DbgS(const r: TRect): string; overload; inline;
281
function DbgS(const p: TPoint): string; overload; inline;
282
function DbgS(const p: pointer): string; overload; inline;
283
function DbgS(const e: extended; MaxDecimals: integer = 999): string; overload; inline;
284
function DbgS(const b: boolean): string; overload; inline;
285
function DbgS(const s: TComponentState): string; overload; inline;
286
function DbgS(const m: TMethod): string; overload; inline;
287
function DbgSName(const p: TObject): string; overload; inline;
288
function DbgSName(const p: TClass): string; overload; inline;
289
function DbgStr(const StringWithSpecialChars: string): string; overload; inline;
290
function DbgWideStr(const StringWithSpecialChars: widestring): string; overload; inline;
291
function dbgMemRange(P: PByte; Count: integer; Width: integer = 0): string; overload; inline;
292
function dbgMemStream(MemStream: TCustomMemoryStream; Count: integer): string; overload; inline;
293
function dbgObjMem(AnObject: TObject): string; overload; inline;
294
function dbgHex(i: Int64): string; overload; inline;
269
295
function DbgSWindowPosFlags(Flags: UInt): String;
271
function DbgS(const i1,i2,i3,i4: integer): string; overload;
272
function DbgS(const Shift: TShiftState): string; overload;
297
function DbgS(const i1,i2,i3,i4: integer): string; overload; inline;
298
function DbgS(const Shift: TShiftState): string; overload; inline;
273
299
function DbgsVKCode(c: word): string;
275
function DbgS(const ASize: TSize): string; overload;
301
function DbgS(const ASize: TSize): string; overload; inline;
276
302
function DbgS(const ATM: TTextMetric): string; overload;
277
303
function DbgS(const AScrollInfo: TScrollInfo): string; overload;
376
403
function CreateFirstIdentifier(const Identifier: string): string;
377
404
function CreateNextIdentifier(const Identifier: string): string;
406
{$IFDEF WithOldDebugln}
408
TDebugLnProc = procedure (s: string) of object;
380
411
DebugLnMaxNestPrefixLen: Integer = 15;
381
412
DebugLnNestLvlIndent: Integer = 2;
415
DebugLnProc: TDebugLnProc = nil;
416
DebugOutProc: TDebugLnProc = nil;
424
{$IFDEF WithOldDebugln}
388
425
Str_LCL_Debug_File = 'lcldebug.log';
427
UNKNOWN_VK_PREFIX = 'Word(''';
428
UNKNOWN_VK_POSTFIX = ''')';
391
431
InterfaceInitializationHandlers: TFPList = nil;
392
432
InterfaceFinalizationHandlers: TFPList = nil;
433
{$IFDEF WithOldDebugln}
393
434
DebugTextAllocated: boolean;
395
435
DebugNestLvl: Integer = 0;
396
436
DebugNestPrefix: PChar = nil;
397
437
DebugNestAtBOL: Boolean;
398
439
LineInfoCache: TAvgLvlTree = nil;
400
{$ifdef NewLowerCase}
402
UnicodeLower00C0_00DE: array[$00C0..$00DE] of word;
403
UnicodeLower0100_024E: array[$0100..$024E] of word;
404
UnicodeLower0386_03AB: array[$0386..$03AB] of word;
405
UnicodeLower03D8_042F: array[$03D8..$042F] of word;
406
UnicodeLower0460_0512: array[$0460..$0512] of word;
407
UnicodeLower1E00_1FFC: array[$1E00..$1FFC] of word;
408
UnicodeLower2126_2183: array[$2126..$2183] of word;
409
UnicodeLower2C60_2CE2: array[$2C60..$2CE2] of word;
411
procedure InitUnicodeTables;
415
for i:=Low(UnicodeLower00C0_00DE) to High(UnicodeLower00C0_00DE) do
416
UnicodeLower00C0_00DE[i]:=i+32;
417
UnicodeLower00C0_00DE[$00D7]:=$00D7;
419
for i:=Low(UnicodeLower0100_024E) to High(UnicodeLower0100_024E) do
420
UnicodeLower0100_024E[i]:=i;
421
UnicodeLower0100_024E[$0100]:=$0101;
422
UnicodeLower0100_024E[$0102]:=$0103;
423
UnicodeLower0100_024E[$0104]:=$0105;
424
UnicodeLower0100_024E[$0106]:=$0107;
425
UnicodeLower0100_024E[$0108]:=$0109;
426
UnicodeLower0100_024E[$010A]:=$010B;
427
UnicodeLower0100_024E[$010C]:=$010D;
428
UnicodeLower0100_024E[$010E]:=$010F;
429
UnicodeLower0100_024E[$0110]:=$0111;
430
UnicodeLower0100_024E[$0112]:=$0113;
431
UnicodeLower0100_024E[$0114]:=$0115;
432
UnicodeLower0100_024E[$0116]:=$0117;
433
UnicodeLower0100_024E[$0118]:=$0119;
434
UnicodeLower0100_024E[$011A]:=$011B;
435
UnicodeLower0100_024E[$011C]:=$011D;
436
UnicodeLower0100_024E[$011E]:=$011F;
437
UnicodeLower0100_024E[$0120]:=$0121;
438
UnicodeLower0100_024E[$0122]:=$0123;
439
UnicodeLower0100_024E[$0124]:=$0125;
440
UnicodeLower0100_024E[$0126]:=$0127;
441
UnicodeLower0100_024E[$0128]:=$0129;
442
UnicodeLower0100_024E[$012A]:=$012B;
443
UnicodeLower0100_024E[$012C]:=$012D;
444
UnicodeLower0100_024E[$012E]:=$012F;
445
UnicodeLower0100_024E[$0130]:=$0069;
446
UnicodeLower0100_024E[$0132]:=$0133;
447
UnicodeLower0100_024E[$0134]:=$0135;
448
UnicodeLower0100_024E[$0136]:=$0137;
449
UnicodeLower0100_024E[$0139]:=$013A;
450
UnicodeLower0100_024E[$013B]:=$013C;
451
UnicodeLower0100_024E[$013D]:=$013E;
452
UnicodeLower0100_024E[$013F]:=$0140;
453
UnicodeLower0100_024E[$0141]:=$0142;
454
UnicodeLower0100_024E[$0143]:=$0144;
455
UnicodeLower0100_024E[$0145]:=$0146;
456
UnicodeLower0100_024E[$0147]:=$0148;
457
UnicodeLower0100_024E[$014A]:=$014B;
458
UnicodeLower0100_024E[$014C]:=$014D;
459
UnicodeLower0100_024E[$014E]:=$014F;
460
UnicodeLower0100_024E[$0150]:=$0151;
461
UnicodeLower0100_024E[$0152]:=$0153;
462
UnicodeLower0100_024E[$0154]:=$0155;
463
UnicodeLower0100_024E[$0156]:=$0157;
464
UnicodeLower0100_024E[$0158]:=$0159;
465
UnicodeLower0100_024E[$015A]:=$015B;
466
UnicodeLower0100_024E[$015C]:=$015D;
467
UnicodeLower0100_024E[$015E]:=$015F;
468
UnicodeLower0100_024E[$0160]:=$0161;
469
UnicodeLower0100_024E[$0162]:=$0163;
470
UnicodeLower0100_024E[$0164]:=$0165;
471
UnicodeLower0100_024E[$0166]:=$0167;
472
UnicodeLower0100_024E[$0168]:=$0169;
473
UnicodeLower0100_024E[$016A]:=$016B;
474
UnicodeLower0100_024E[$016C]:=$016D;
475
UnicodeLower0100_024E[$016E]:=$016F;
476
UnicodeLower0100_024E[$0170]:=$0171;
477
UnicodeLower0100_024E[$0172]:=$0173;
478
UnicodeLower0100_024E[$0174]:=$0175;
479
UnicodeLower0100_024E[$0176]:=$0177;
480
UnicodeLower0100_024E[$0178]:=$00FF;
481
UnicodeLower0100_024E[$0179]:=$017A;
482
UnicodeLower0100_024E[$017B]:=$017C;
483
UnicodeLower0100_024E[$017D]:=$017E;
484
UnicodeLower0100_024E[$0181]:=$0253;
485
UnicodeLower0100_024E[$0182]:=$0183;
486
UnicodeLower0100_024E[$0184]:=$0185;
487
UnicodeLower0100_024E[$0186]:=$0254;
488
UnicodeLower0100_024E[$0187]:=$0188;
489
UnicodeLower0100_024E[$0189]:=$0256;
490
UnicodeLower0100_024E[$018A]:=$0257;
491
UnicodeLower0100_024E[$018B]:=$018C;
492
UnicodeLower0100_024E[$018E]:=$01DD;
493
UnicodeLower0100_024E[$018F]:=$0259;
494
UnicodeLower0100_024E[$0190]:=$025B;
495
UnicodeLower0100_024E[$0191]:=$0192;
496
UnicodeLower0100_024E[$0193]:=$0260;
497
UnicodeLower0100_024E[$0194]:=$0263;
498
UnicodeLower0100_024E[$0196]:=$0269;
499
UnicodeLower0100_024E[$0197]:=$0268;
500
UnicodeLower0100_024E[$0198]:=$0199;
501
UnicodeLower0100_024E[$019C]:=$026F;
502
UnicodeLower0100_024E[$019D]:=$0272;
503
UnicodeLower0100_024E[$019F]:=$0275;
504
UnicodeLower0100_024E[$01A0]:=$01A1;
505
UnicodeLower0100_024E[$01A2]:=$01A3;
506
UnicodeLower0100_024E[$01A4]:=$01A5;
507
UnicodeLower0100_024E[$01A6]:=$0280;
508
UnicodeLower0100_024E[$01A7]:=$01A8;
509
UnicodeLower0100_024E[$01A9]:=$0283;
510
UnicodeLower0100_024E[$01AC]:=$01AD;
511
UnicodeLower0100_024E[$01AE]:=$0288;
512
UnicodeLower0100_024E[$01AF]:=$01B0;
513
UnicodeLower0100_024E[$01B1]:=$028A;
514
UnicodeLower0100_024E[$01B2]:=$028B;
515
UnicodeLower0100_024E[$01B3]:=$01B4;
516
UnicodeLower0100_024E[$01B5]:=$01B6;
517
UnicodeLower0100_024E[$01B7]:=$0292;
518
UnicodeLower0100_024E[$01B8]:=$01B9;
519
UnicodeLower0100_024E[$01BC]:=$01BD;
520
UnicodeLower0100_024E[$01C4]:=$01C6;
521
UnicodeLower0100_024E[$01C5]:=$01C6;
522
UnicodeLower0100_024E[$01C7]:=$01C9;
523
UnicodeLower0100_024E[$01C8]:=$01C9;
524
UnicodeLower0100_024E[$01CA]:=$01CC;
525
UnicodeLower0100_024E[$01CB]:=$01CC;
526
UnicodeLower0100_024E[$01CD]:=$01CE;
527
UnicodeLower0100_024E[$01CF]:=$01D0;
528
UnicodeLower0100_024E[$01D1]:=$01D2;
529
UnicodeLower0100_024E[$01D3]:=$01D4;
530
UnicodeLower0100_024E[$01D5]:=$01D6;
531
UnicodeLower0100_024E[$01D7]:=$01D8;
532
UnicodeLower0100_024E[$01D9]:=$01DA;
533
UnicodeLower0100_024E[$01DB]:=$01DC;
534
UnicodeLower0100_024E[$01DE]:=$01DF;
535
UnicodeLower0100_024E[$01E0]:=$01E1;
536
UnicodeLower0100_024E[$01E2]:=$01E3;
537
UnicodeLower0100_024E[$01E4]:=$01E5;
538
UnicodeLower0100_024E[$01E6]:=$01E7;
539
UnicodeLower0100_024E[$01E8]:=$01E9;
540
UnicodeLower0100_024E[$01EA]:=$01EB;
541
UnicodeLower0100_024E[$01EC]:=$01ED;
542
UnicodeLower0100_024E[$01EE]:=$01EF;
543
UnicodeLower0100_024E[$01F1]:=$01F3;
544
UnicodeLower0100_024E[$01F2]:=$01F3;
545
UnicodeLower0100_024E[$01F4]:=$01F5;
546
UnicodeLower0100_024E[$01F6]:=$0195;
547
UnicodeLower0100_024E[$01F7]:=$01BF;
548
UnicodeLower0100_024E[$01F8]:=$01F9;
549
UnicodeLower0100_024E[$01FA]:=$01FB;
550
UnicodeLower0100_024E[$01FC]:=$01FD;
551
UnicodeLower0100_024E[$01FE]:=$01FF;
552
UnicodeLower0100_024E[$0200]:=$0201;
553
UnicodeLower0100_024E[$0202]:=$0203;
554
UnicodeLower0100_024E[$0204]:=$0205;
555
UnicodeLower0100_024E[$0206]:=$0207;
556
UnicodeLower0100_024E[$0208]:=$0209;
557
UnicodeLower0100_024E[$020A]:=$020B;
558
UnicodeLower0100_024E[$020C]:=$020D;
559
UnicodeLower0100_024E[$020E]:=$020F;
560
UnicodeLower0100_024E[$0210]:=$0211;
561
UnicodeLower0100_024E[$0212]:=$0213;
562
UnicodeLower0100_024E[$0214]:=$0215;
563
UnicodeLower0100_024E[$0216]:=$0217;
564
UnicodeLower0100_024E[$0218]:=$0219;
565
UnicodeLower0100_024E[$021A]:=$021B;
566
UnicodeLower0100_024E[$021C]:=$021D;
567
UnicodeLower0100_024E[$021E]:=$021F;
568
UnicodeLower0100_024E[$0220]:=$019E;
569
UnicodeLower0100_024E[$0222]:=$0223;
570
UnicodeLower0100_024E[$0224]:=$0225;
571
UnicodeLower0100_024E[$0226]:=$0227;
572
UnicodeLower0100_024E[$0228]:=$0229;
573
UnicodeLower0100_024E[$022A]:=$022B;
574
UnicodeLower0100_024E[$022C]:=$022D;
575
UnicodeLower0100_024E[$022E]:=$022F;
576
UnicodeLower0100_024E[$0230]:=$0231;
577
UnicodeLower0100_024E[$0232]:=$0233;
578
UnicodeLower0100_024E[$023A]:=$2C65;
579
UnicodeLower0100_024E[$023B]:=$023C;
580
UnicodeLower0100_024E[$023D]:=$019A;
581
UnicodeLower0100_024E[$023E]:=$2C66;
582
UnicodeLower0100_024E[$0241]:=$0242;
583
UnicodeLower0100_024E[$0243]:=$0180;
584
UnicodeLower0100_024E[$0244]:=$0289;
585
UnicodeLower0100_024E[$0245]:=$028C;
586
UnicodeLower0100_024E[$0246]:=$0247;
587
UnicodeLower0100_024E[$0248]:=$0249;
588
UnicodeLower0100_024E[$024A]:=$024B;
589
UnicodeLower0100_024E[$024C]:=$024D;
590
UnicodeLower0100_024E[$024E]:=$024F;
592
for i:=Low(UnicodeLower0386_03AB) to High(UnicodeLower0386_03AB) do
593
UnicodeLower0386_03AB[i]:=i;
594
UnicodeLower0386_03AB[$0386]:=$03AC;
595
UnicodeLower0386_03AB[$0388]:=$03AD;
596
UnicodeLower0386_03AB[$0389]:=$03AE;
597
UnicodeLower0386_03AB[$038A]:=$03AF;
598
UnicodeLower0386_03AB[$038C]:=$03CC;
599
UnicodeLower0386_03AB[$038E]:=$03CD;
600
UnicodeLower0386_03AB[$038F]:=$03CE;
601
UnicodeLower0386_03AB[$0391]:=$03B1;
602
UnicodeLower0386_03AB[$0392]:=$03B2;
603
UnicodeLower0386_03AB[$0393]:=$03B3;
604
UnicodeLower0386_03AB[$0394]:=$03B4;
605
UnicodeLower0386_03AB[$0395]:=$03B5;
606
UnicodeLower0386_03AB[$0396]:=$03B6;
607
UnicodeLower0386_03AB[$0397]:=$03B7;
608
UnicodeLower0386_03AB[$0398]:=$03B8;
609
UnicodeLower0386_03AB[$0399]:=$03B9;
610
UnicodeLower0386_03AB[$039A]:=$03BA;
611
UnicodeLower0386_03AB[$039B]:=$03BB;
612
UnicodeLower0386_03AB[$039C]:=$03BC;
613
UnicodeLower0386_03AB[$039D]:=$03BD;
614
UnicodeLower0386_03AB[$039E]:=$03BE;
615
UnicodeLower0386_03AB[$039F]:=$03BF;
616
UnicodeLower0386_03AB[$03A0]:=$03C0;
617
UnicodeLower0386_03AB[$03A1]:=$03C1;
618
UnicodeLower0386_03AB[$03A3]:=$03C3;
619
UnicodeLower0386_03AB[$03A4]:=$03C4;
620
UnicodeLower0386_03AB[$03A5]:=$03C5;
621
UnicodeLower0386_03AB[$03A6]:=$03C6;
622
UnicodeLower0386_03AB[$03A7]:=$03C7;
623
UnicodeLower0386_03AB[$03A8]:=$03C8;
624
UnicodeLower0386_03AB[$03A9]:=$03C9;
625
UnicodeLower0386_03AB[$03AA]:=$03CA;
626
UnicodeLower0386_03AB[$03AB]:=$03CB;
628
for i:=Low(UnicodeLower03D8_042F) to High(UnicodeLower03D8_042F) do
629
UnicodeLower03D8_042F[i]:=i;
630
UnicodeLower03D8_042F[$03D8]:=$03D9;
631
UnicodeLower03D8_042F[$03DA]:=$03DB;
632
UnicodeLower03D8_042F[$03DC]:=$03DD;
633
UnicodeLower03D8_042F[$03DE]:=$03DF;
634
UnicodeLower03D8_042F[$03E0]:=$03E1;
635
UnicodeLower03D8_042F[$03E2]:=$03E3;
636
UnicodeLower03D8_042F[$03E4]:=$03E5;
637
UnicodeLower03D8_042F[$03E6]:=$03E7;
638
UnicodeLower03D8_042F[$03E8]:=$03E9;
639
UnicodeLower03D8_042F[$03EA]:=$03EB;
640
UnicodeLower03D8_042F[$03EC]:=$03ED;
641
UnicodeLower03D8_042F[$03EE]:=$03EF;
642
UnicodeLower03D8_042F[$03F4]:=$03B8;
643
UnicodeLower03D8_042F[$03F7]:=$03F8;
644
UnicodeLower03D8_042F[$03F9]:=$03F2;
645
UnicodeLower03D8_042F[$03FA]:=$03FB;
646
UnicodeLower03D8_042F[$03FD]:=$037B;
647
UnicodeLower03D8_042F[$03FE]:=$037C;
648
UnicodeLower03D8_042F[$03FF]:=$037D;
649
UnicodeLower03D8_042F[$0400]:=$0450;
650
UnicodeLower03D8_042F[$0401]:=$0451;
651
UnicodeLower03D8_042F[$0402]:=$0452;
652
UnicodeLower03D8_042F[$0403]:=$0453;
653
UnicodeLower03D8_042F[$0404]:=$0454;
654
UnicodeLower03D8_042F[$0405]:=$0455;
655
UnicodeLower03D8_042F[$0406]:=$0456;
656
UnicodeLower03D8_042F[$0407]:=$0457;
657
UnicodeLower03D8_042F[$0408]:=$0458;
658
UnicodeLower03D8_042F[$0409]:=$0459;
659
UnicodeLower03D8_042F[$040A]:=$045A;
660
UnicodeLower03D8_042F[$040B]:=$045B;
661
UnicodeLower03D8_042F[$040C]:=$045C;
662
UnicodeLower03D8_042F[$040D]:=$045D;
663
UnicodeLower03D8_042F[$040E]:=$045E;
664
UnicodeLower03D8_042F[$040F]:=$045F;
665
UnicodeLower03D8_042F[$0410]:=$0430;
666
UnicodeLower03D8_042F[$0411]:=$0431;
667
UnicodeLower03D8_042F[$0412]:=$0432;
668
UnicodeLower03D8_042F[$0413]:=$0433;
669
UnicodeLower03D8_042F[$0414]:=$0434;
670
UnicodeLower03D8_042F[$0415]:=$0435;
671
UnicodeLower03D8_042F[$0416]:=$0436;
672
UnicodeLower03D8_042F[$0417]:=$0437;
673
UnicodeLower03D8_042F[$0418]:=$0438;
674
UnicodeLower03D8_042F[$0419]:=$0439;
675
UnicodeLower03D8_042F[$041A]:=$043A;
676
UnicodeLower03D8_042F[$041B]:=$043B;
677
UnicodeLower03D8_042F[$041C]:=$043C;
678
UnicodeLower03D8_042F[$041D]:=$043D;
679
UnicodeLower03D8_042F[$041E]:=$043E;
680
UnicodeLower03D8_042F[$041F]:=$043F;
681
UnicodeLower03D8_042F[$0420]:=$0440;
682
UnicodeLower03D8_042F[$0421]:=$0441;
683
UnicodeLower03D8_042F[$0422]:=$0442;
684
UnicodeLower03D8_042F[$0423]:=$0443;
685
UnicodeLower03D8_042F[$0424]:=$0444;
686
UnicodeLower03D8_042F[$0425]:=$0445;
687
UnicodeLower03D8_042F[$0426]:=$0446;
688
UnicodeLower03D8_042F[$0427]:=$0447;
689
UnicodeLower03D8_042F[$0428]:=$0448;
690
UnicodeLower03D8_042F[$0429]:=$0449;
691
UnicodeLower03D8_042F[$042A]:=$044A;
692
UnicodeLower03D8_042F[$042B]:=$044B;
693
UnicodeLower03D8_042F[$042C]:=$044C;
694
UnicodeLower03D8_042F[$042D]:=$044D;
695
UnicodeLower03D8_042F[$042E]:=$044E;
696
UnicodeLower03D8_042F[$042F]:=$044F;
698
for i:=Low(UnicodeLower0460_0512) to High(UnicodeLower0460_0512) do
699
UnicodeLower0460_0512[i]:=i;
700
UnicodeLower0460_0512[$0460]:=$0461;
701
UnicodeLower0460_0512[$0462]:=$0463;
702
UnicodeLower0460_0512[$0464]:=$0465;
703
UnicodeLower0460_0512[$0466]:=$0467;
704
UnicodeLower0460_0512[$0468]:=$0469;
705
UnicodeLower0460_0512[$046A]:=$046B;
706
UnicodeLower0460_0512[$046C]:=$046D;
707
UnicodeLower0460_0512[$046E]:=$046F;
708
UnicodeLower0460_0512[$0470]:=$0471;
709
UnicodeLower0460_0512[$0472]:=$0473;
710
UnicodeLower0460_0512[$0474]:=$0475;
711
UnicodeLower0460_0512[$0476]:=$0477;
712
UnicodeLower0460_0512[$0478]:=$0479;
713
UnicodeLower0460_0512[$047A]:=$047B;
714
UnicodeLower0460_0512[$047C]:=$047D;
715
UnicodeLower0460_0512[$047E]:=$047F;
716
UnicodeLower0460_0512[$0480]:=$0481;
717
UnicodeLower0460_0512[$048A]:=$048B;
718
UnicodeLower0460_0512[$048C]:=$048D;
719
UnicodeLower0460_0512[$048E]:=$048F;
720
UnicodeLower0460_0512[$0490]:=$0491;
721
UnicodeLower0460_0512[$0492]:=$0493;
722
UnicodeLower0460_0512[$0494]:=$0495;
723
UnicodeLower0460_0512[$0496]:=$0497;
724
UnicodeLower0460_0512[$0498]:=$0499;
725
UnicodeLower0460_0512[$049A]:=$049B;
726
UnicodeLower0460_0512[$049C]:=$049D;
727
UnicodeLower0460_0512[$049E]:=$049F;
728
UnicodeLower0460_0512[$04A0]:=$04A1;
729
UnicodeLower0460_0512[$04A2]:=$04A3;
730
UnicodeLower0460_0512[$04A4]:=$04A5;
731
UnicodeLower0460_0512[$04A6]:=$04A7;
732
UnicodeLower0460_0512[$04A8]:=$04A9;
733
UnicodeLower0460_0512[$04AA]:=$04AB;
734
UnicodeLower0460_0512[$04AC]:=$04AD;
735
UnicodeLower0460_0512[$04AE]:=$04AF;
736
UnicodeLower0460_0512[$04B0]:=$04B1;
737
UnicodeLower0460_0512[$04B2]:=$04B3;
738
UnicodeLower0460_0512[$04B4]:=$04B5;
739
UnicodeLower0460_0512[$04B6]:=$04B7;
740
UnicodeLower0460_0512[$04B8]:=$04B9;
741
UnicodeLower0460_0512[$04BA]:=$04BB;
742
UnicodeLower0460_0512[$04BC]:=$04BD;
743
UnicodeLower0460_0512[$04BE]:=$04BF;
744
UnicodeLower0460_0512[$04C0]:=$04CF;
745
UnicodeLower0460_0512[$04C1]:=$04C2;
746
UnicodeLower0460_0512[$04C3]:=$04C4;
747
UnicodeLower0460_0512[$04C5]:=$04C6;
748
UnicodeLower0460_0512[$04C7]:=$04C8;
749
UnicodeLower0460_0512[$04C9]:=$04CA;
750
UnicodeLower0460_0512[$04CB]:=$04CC;
751
UnicodeLower0460_0512[$04CD]:=$04CE;
752
UnicodeLower0460_0512[$04D0]:=$04D1;
753
UnicodeLower0460_0512[$04D2]:=$04D3;
754
UnicodeLower0460_0512[$04D4]:=$04D5;
755
UnicodeLower0460_0512[$04D6]:=$04D7;
756
UnicodeLower0460_0512[$04D8]:=$04D9;
757
UnicodeLower0460_0512[$04DA]:=$04DB;
758
UnicodeLower0460_0512[$04DC]:=$04DD;
759
UnicodeLower0460_0512[$04DE]:=$04DF;
760
UnicodeLower0460_0512[$04E0]:=$04E1;
761
UnicodeLower0460_0512[$04E2]:=$04E3;
762
UnicodeLower0460_0512[$04E4]:=$04E5;
763
UnicodeLower0460_0512[$04E6]:=$04E7;
764
UnicodeLower0460_0512[$04E8]:=$04E9;
765
UnicodeLower0460_0512[$04EA]:=$04EB;
766
UnicodeLower0460_0512[$04EC]:=$04ED;
767
UnicodeLower0460_0512[$04EE]:=$04EF;
768
UnicodeLower0460_0512[$04F0]:=$04F1;
769
UnicodeLower0460_0512[$04F2]:=$04F3;
770
UnicodeLower0460_0512[$04F4]:=$04F5;
771
UnicodeLower0460_0512[$04F6]:=$04F7;
772
UnicodeLower0460_0512[$04F8]:=$04F9;
773
UnicodeLower0460_0512[$04FA]:=$04FB;
774
UnicodeLower0460_0512[$04FC]:=$04FD;
775
UnicodeLower0460_0512[$04FE]:=$04FF;
776
UnicodeLower0460_0512[$0500]:=$0501;
777
UnicodeLower0460_0512[$0502]:=$0503;
778
UnicodeLower0460_0512[$0504]:=$0505;
779
UnicodeLower0460_0512[$0506]:=$0507;
780
UnicodeLower0460_0512[$0508]:=$0509;
781
UnicodeLower0460_0512[$050A]:=$050B;
782
UnicodeLower0460_0512[$050C]:=$050D;
783
UnicodeLower0460_0512[$050E]:=$050F;
784
UnicodeLower0460_0512[$0510]:=$0511;
785
UnicodeLower0460_0512[$0512]:=$0513;
787
for i:=Low(UnicodeLower1E00_1FFC) to High(UnicodeLower1E00_1FFC) do
788
UnicodeLower1E00_1FFC[i]:=i;
789
UnicodeLower1E00_1FFC[$1E00]:=$1E01;
790
UnicodeLower1E00_1FFC[$1E02]:=$1E03;
791
UnicodeLower1E00_1FFC[$1E04]:=$1E05;
792
UnicodeLower1E00_1FFC[$1E06]:=$1E07;
793
UnicodeLower1E00_1FFC[$1E08]:=$1E09;
794
UnicodeLower1E00_1FFC[$1E0A]:=$1E0B;
795
UnicodeLower1E00_1FFC[$1E0C]:=$1E0D;
796
UnicodeLower1E00_1FFC[$1E0E]:=$1E0F;
797
UnicodeLower1E00_1FFC[$1E10]:=$1E11;
798
UnicodeLower1E00_1FFC[$1E12]:=$1E13;
799
UnicodeLower1E00_1FFC[$1E14]:=$1E15;
800
UnicodeLower1E00_1FFC[$1E16]:=$1E17;
801
UnicodeLower1E00_1FFC[$1E18]:=$1E19;
802
UnicodeLower1E00_1FFC[$1E1A]:=$1E1B;
803
UnicodeLower1E00_1FFC[$1E1C]:=$1E1D;
804
UnicodeLower1E00_1FFC[$1E1E]:=$1E1F;
805
UnicodeLower1E00_1FFC[$1E20]:=$1E21;
806
UnicodeLower1E00_1FFC[$1E22]:=$1E23;
807
UnicodeLower1E00_1FFC[$1E24]:=$1E25;
808
UnicodeLower1E00_1FFC[$1E26]:=$1E27;
809
UnicodeLower1E00_1FFC[$1E28]:=$1E29;
810
UnicodeLower1E00_1FFC[$1E2A]:=$1E2B;
811
UnicodeLower1E00_1FFC[$1E2C]:=$1E2D;
812
UnicodeLower1E00_1FFC[$1E2E]:=$1E2F;
813
UnicodeLower1E00_1FFC[$1E30]:=$1E31;
814
UnicodeLower1E00_1FFC[$1E32]:=$1E33;
815
UnicodeLower1E00_1FFC[$1E34]:=$1E35;
816
UnicodeLower1E00_1FFC[$1E36]:=$1E37;
817
UnicodeLower1E00_1FFC[$1E38]:=$1E39;
818
UnicodeLower1E00_1FFC[$1E3A]:=$1E3B;
819
UnicodeLower1E00_1FFC[$1E3C]:=$1E3D;
820
UnicodeLower1E00_1FFC[$1E3E]:=$1E3F;
821
UnicodeLower1E00_1FFC[$1E40]:=$1E41;
822
UnicodeLower1E00_1FFC[$1E42]:=$1E43;
823
UnicodeLower1E00_1FFC[$1E44]:=$1E45;
824
UnicodeLower1E00_1FFC[$1E46]:=$1E47;
825
UnicodeLower1E00_1FFC[$1E48]:=$1E49;
826
UnicodeLower1E00_1FFC[$1E4A]:=$1E4B;
827
UnicodeLower1E00_1FFC[$1E4C]:=$1E4D;
828
UnicodeLower1E00_1FFC[$1E4E]:=$1E4F;
829
UnicodeLower1E00_1FFC[$1E50]:=$1E51;
830
UnicodeLower1E00_1FFC[$1E52]:=$1E53;
831
UnicodeLower1E00_1FFC[$1E54]:=$1E55;
832
UnicodeLower1E00_1FFC[$1E56]:=$1E57;
833
UnicodeLower1E00_1FFC[$1E58]:=$1E59;
834
UnicodeLower1E00_1FFC[$1E5A]:=$1E5B;
835
UnicodeLower1E00_1FFC[$1E5C]:=$1E5D;
836
UnicodeLower1E00_1FFC[$1E5E]:=$1E5F;
837
UnicodeLower1E00_1FFC[$1E60]:=$1E61;
838
UnicodeLower1E00_1FFC[$1E62]:=$1E63;
839
UnicodeLower1E00_1FFC[$1E64]:=$1E65;
840
UnicodeLower1E00_1FFC[$1E66]:=$1E67;
841
UnicodeLower1E00_1FFC[$1E68]:=$1E69;
842
UnicodeLower1E00_1FFC[$1E6A]:=$1E6B;
843
UnicodeLower1E00_1FFC[$1E6C]:=$1E6D;
844
UnicodeLower1E00_1FFC[$1E6E]:=$1E6F;
845
UnicodeLower1E00_1FFC[$1E70]:=$1E71;
846
UnicodeLower1E00_1FFC[$1E72]:=$1E73;
847
UnicodeLower1E00_1FFC[$1E74]:=$1E75;
848
UnicodeLower1E00_1FFC[$1E76]:=$1E77;
849
UnicodeLower1E00_1FFC[$1E78]:=$1E79;
850
UnicodeLower1E00_1FFC[$1E7A]:=$1E7B;
851
UnicodeLower1E00_1FFC[$1E7C]:=$1E7D;
852
UnicodeLower1E00_1FFC[$1E7E]:=$1E7F;
853
UnicodeLower1E00_1FFC[$1E80]:=$1E81;
854
UnicodeLower1E00_1FFC[$1E82]:=$1E83;
855
UnicodeLower1E00_1FFC[$1E84]:=$1E85;
856
UnicodeLower1E00_1FFC[$1E86]:=$1E87;
857
UnicodeLower1E00_1FFC[$1E88]:=$1E89;
858
UnicodeLower1E00_1FFC[$1E8A]:=$1E8B;
859
UnicodeLower1E00_1FFC[$1E8C]:=$1E8D;
860
UnicodeLower1E00_1FFC[$1E8E]:=$1E8F;
861
UnicodeLower1E00_1FFC[$1E90]:=$1E91;
862
UnicodeLower1E00_1FFC[$1E92]:=$1E93;
863
UnicodeLower1E00_1FFC[$1E94]:=$1E95;
864
UnicodeLower1E00_1FFC[$1EA0]:=$1EA1;
865
UnicodeLower1E00_1FFC[$1EA2]:=$1EA3;
866
UnicodeLower1E00_1FFC[$1EA4]:=$1EA5;
867
UnicodeLower1E00_1FFC[$1EA6]:=$1EA7;
868
UnicodeLower1E00_1FFC[$1EA8]:=$1EA9;
869
UnicodeLower1E00_1FFC[$1EAA]:=$1EAB;
870
UnicodeLower1E00_1FFC[$1EAC]:=$1EAD;
871
UnicodeLower1E00_1FFC[$1EAE]:=$1EAF;
872
UnicodeLower1E00_1FFC[$1EB0]:=$1EB1;
873
UnicodeLower1E00_1FFC[$1EB2]:=$1EB3;
874
UnicodeLower1E00_1FFC[$1EB4]:=$1EB5;
875
UnicodeLower1E00_1FFC[$1EB6]:=$1EB7;
876
UnicodeLower1E00_1FFC[$1EB8]:=$1EB9;
877
UnicodeLower1E00_1FFC[$1EBA]:=$1EBB;
878
UnicodeLower1E00_1FFC[$1EBC]:=$1EBD;
879
UnicodeLower1E00_1FFC[$1EBE]:=$1EBF;
880
UnicodeLower1E00_1FFC[$1EC0]:=$1EC1;
881
UnicodeLower1E00_1FFC[$1EC2]:=$1EC3;
882
UnicodeLower1E00_1FFC[$1EC4]:=$1EC5;
883
UnicodeLower1E00_1FFC[$1EC6]:=$1EC7;
884
UnicodeLower1E00_1FFC[$1EC8]:=$1EC9;
885
UnicodeLower1E00_1FFC[$1ECA]:=$1ECB;
886
UnicodeLower1E00_1FFC[$1ECC]:=$1ECD;
887
UnicodeLower1E00_1FFC[$1ECE]:=$1ECF;
888
UnicodeLower1E00_1FFC[$1ED0]:=$1ED1;
889
UnicodeLower1E00_1FFC[$1ED2]:=$1ED3;
890
UnicodeLower1E00_1FFC[$1ED4]:=$1ED5;
891
UnicodeLower1E00_1FFC[$1ED6]:=$1ED7;
892
UnicodeLower1E00_1FFC[$1ED8]:=$1ED9;
893
UnicodeLower1E00_1FFC[$1EDA]:=$1EDB;
894
UnicodeLower1E00_1FFC[$1EDC]:=$1EDD;
895
UnicodeLower1E00_1FFC[$1EDE]:=$1EDF;
896
UnicodeLower1E00_1FFC[$1EE0]:=$1EE1;
897
UnicodeLower1E00_1FFC[$1EE2]:=$1EE3;
898
UnicodeLower1E00_1FFC[$1EE4]:=$1EE5;
899
UnicodeLower1E00_1FFC[$1EE6]:=$1EE7;
900
UnicodeLower1E00_1FFC[$1EE8]:=$1EE9;
901
UnicodeLower1E00_1FFC[$1EEA]:=$1EEB;
902
UnicodeLower1E00_1FFC[$1EEC]:=$1EED;
903
UnicodeLower1E00_1FFC[$1EEE]:=$1EEF;
904
UnicodeLower1E00_1FFC[$1EF0]:=$1EF1;
905
UnicodeLower1E00_1FFC[$1EF2]:=$1EF3;
906
UnicodeLower1E00_1FFC[$1EF4]:=$1EF5;
907
UnicodeLower1E00_1FFC[$1EF6]:=$1EF7;
908
UnicodeLower1E00_1FFC[$1EF8]:=$1EF9;
909
UnicodeLower1E00_1FFC[$1F08]:=$1F00;
910
UnicodeLower1E00_1FFC[$1F09]:=$1F01;
911
UnicodeLower1E00_1FFC[$1F0A]:=$1F02;
912
UnicodeLower1E00_1FFC[$1F0B]:=$1F03;
913
UnicodeLower1E00_1FFC[$1F0C]:=$1F04;
914
UnicodeLower1E00_1FFC[$1F0D]:=$1F05;
915
UnicodeLower1E00_1FFC[$1F0E]:=$1F06;
916
UnicodeLower1E00_1FFC[$1F0F]:=$1F07;
917
UnicodeLower1E00_1FFC[$1F18]:=$1F10;
918
UnicodeLower1E00_1FFC[$1F19]:=$1F11;
919
UnicodeLower1E00_1FFC[$1F1A]:=$1F12;
920
UnicodeLower1E00_1FFC[$1F1B]:=$1F13;
921
UnicodeLower1E00_1FFC[$1F1C]:=$1F14;
922
UnicodeLower1E00_1FFC[$1F1D]:=$1F15;
923
UnicodeLower1E00_1FFC[$1F28]:=$1F20;
924
UnicodeLower1E00_1FFC[$1F29]:=$1F21;
925
UnicodeLower1E00_1FFC[$1F2A]:=$1F22;
926
UnicodeLower1E00_1FFC[$1F2B]:=$1F23;
927
UnicodeLower1E00_1FFC[$1F2C]:=$1F24;
928
UnicodeLower1E00_1FFC[$1F2D]:=$1F25;
929
UnicodeLower1E00_1FFC[$1F2E]:=$1F26;
930
UnicodeLower1E00_1FFC[$1F2F]:=$1F27;
931
UnicodeLower1E00_1FFC[$1F38]:=$1F30;
932
UnicodeLower1E00_1FFC[$1F39]:=$1F31;
933
UnicodeLower1E00_1FFC[$1F3A]:=$1F32;
934
UnicodeLower1E00_1FFC[$1F3B]:=$1F33;
935
UnicodeLower1E00_1FFC[$1F3C]:=$1F34;
936
UnicodeLower1E00_1FFC[$1F3D]:=$1F35;
937
UnicodeLower1E00_1FFC[$1F3E]:=$1F36;
938
UnicodeLower1E00_1FFC[$1F3F]:=$1F37;
939
UnicodeLower1E00_1FFC[$1F48]:=$1F40;
940
UnicodeLower1E00_1FFC[$1F49]:=$1F41;
941
UnicodeLower1E00_1FFC[$1F4A]:=$1F42;
942
UnicodeLower1E00_1FFC[$1F4B]:=$1F43;
943
UnicodeLower1E00_1FFC[$1F4C]:=$1F44;
944
UnicodeLower1E00_1FFC[$1F4D]:=$1F45;
945
UnicodeLower1E00_1FFC[$1F59]:=$1F51;
946
UnicodeLower1E00_1FFC[$1F5B]:=$1F53;
947
UnicodeLower1E00_1FFC[$1F5D]:=$1F55;
948
UnicodeLower1E00_1FFC[$1F5F]:=$1F57;
949
UnicodeLower1E00_1FFC[$1F68]:=$1F60;
950
UnicodeLower1E00_1FFC[$1F69]:=$1F61;
951
UnicodeLower1E00_1FFC[$1F6A]:=$1F62;
952
UnicodeLower1E00_1FFC[$1F6B]:=$1F63;
953
UnicodeLower1E00_1FFC[$1F6C]:=$1F64;
954
UnicodeLower1E00_1FFC[$1F6D]:=$1F65;
955
UnicodeLower1E00_1FFC[$1F6E]:=$1F66;
956
UnicodeLower1E00_1FFC[$1F6F]:=$1F67;
957
UnicodeLower1E00_1FFC[$1F88]:=$1F80;
958
UnicodeLower1E00_1FFC[$1F89]:=$1F81;
959
UnicodeLower1E00_1FFC[$1F8A]:=$1F82;
960
UnicodeLower1E00_1FFC[$1F8B]:=$1F83;
961
UnicodeLower1E00_1FFC[$1F8C]:=$1F84;
962
UnicodeLower1E00_1FFC[$1F8D]:=$1F85;
963
UnicodeLower1E00_1FFC[$1F8E]:=$1F86;
964
UnicodeLower1E00_1FFC[$1F8F]:=$1F87;
965
UnicodeLower1E00_1FFC[$1F98]:=$1F90;
966
UnicodeLower1E00_1FFC[$1F99]:=$1F91;
967
UnicodeLower1E00_1FFC[$1F9A]:=$1F92;
968
UnicodeLower1E00_1FFC[$1F9B]:=$1F93;
969
UnicodeLower1E00_1FFC[$1F9C]:=$1F94;
970
UnicodeLower1E00_1FFC[$1F9D]:=$1F95;
971
UnicodeLower1E00_1FFC[$1F9E]:=$1F96;
972
UnicodeLower1E00_1FFC[$1F9F]:=$1F97;
973
UnicodeLower1E00_1FFC[$1FA8]:=$1FA0;
974
UnicodeLower1E00_1FFC[$1FA9]:=$1FA1;
975
UnicodeLower1E00_1FFC[$1FAA]:=$1FA2;
976
UnicodeLower1E00_1FFC[$1FAB]:=$1FA3;
977
UnicodeLower1E00_1FFC[$1FAC]:=$1FA4;
978
UnicodeLower1E00_1FFC[$1FAD]:=$1FA5;
979
UnicodeLower1E00_1FFC[$1FAE]:=$1FA6;
980
UnicodeLower1E00_1FFC[$1FAF]:=$1FA7;
981
UnicodeLower1E00_1FFC[$1FB8]:=$1FB0;
982
UnicodeLower1E00_1FFC[$1FB9]:=$1FB1;
983
UnicodeLower1E00_1FFC[$1FBA]:=$1F70;
984
UnicodeLower1E00_1FFC[$1FBB]:=$1F71;
985
UnicodeLower1E00_1FFC[$1FBC]:=$1FB3;
986
UnicodeLower1E00_1FFC[$1FC8]:=$1F72;
987
UnicodeLower1E00_1FFC[$1FC9]:=$1F73;
988
UnicodeLower1E00_1FFC[$1FCA]:=$1F74;
989
UnicodeLower1E00_1FFC[$1FCB]:=$1F75;
990
UnicodeLower1E00_1FFC[$1FCC]:=$1FC3;
991
UnicodeLower1E00_1FFC[$1FD8]:=$1FD0;
992
UnicodeLower1E00_1FFC[$1FD9]:=$1FD1;
993
UnicodeLower1E00_1FFC[$1FDA]:=$1F76;
994
UnicodeLower1E00_1FFC[$1FDB]:=$1F77;
995
UnicodeLower1E00_1FFC[$1FE8]:=$1FE0;
996
UnicodeLower1E00_1FFC[$1FE9]:=$1FE1;
997
UnicodeLower1E00_1FFC[$1FEA]:=$1F7A;
998
UnicodeLower1E00_1FFC[$1FEB]:=$1F7B;
999
UnicodeLower1E00_1FFC[$1FEC]:=$1FE5;
1000
UnicodeLower1E00_1FFC[$1FF8]:=$1F78;
1001
UnicodeLower1E00_1FFC[$1FF9]:=$1F79;
1002
UnicodeLower1E00_1FFC[$1FFA]:=$1F7C;
1003
UnicodeLower1E00_1FFC[$1FFB]:=$1F7D;
1004
UnicodeLower1E00_1FFC[$1FFC]:=$1FF3;
1006
for i:=Low(UnicodeLower2126_2183) to High(UnicodeLower2126_2183) do
1007
UnicodeLower2126_2183[i]:=i;
1008
UnicodeLower2126_2183[$2126]:=$03C9;
1009
UnicodeLower2126_2183[$212A]:=$006B;
1010
UnicodeLower2126_2183[$212B]:=$00E5;
1011
UnicodeLower2126_2183[$2132]:=$214E;
1012
UnicodeLower2126_2183[$2160]:=$2170;
1013
UnicodeLower2126_2183[$2161]:=$2171;
1014
UnicodeLower2126_2183[$2162]:=$2172;
1015
UnicodeLower2126_2183[$2163]:=$2173;
1016
UnicodeLower2126_2183[$2164]:=$2174;
1017
UnicodeLower2126_2183[$2165]:=$2175;
1018
UnicodeLower2126_2183[$2166]:=$2176;
1019
UnicodeLower2126_2183[$2167]:=$2177;
1020
UnicodeLower2126_2183[$2168]:=$2178;
1021
UnicodeLower2126_2183[$2169]:=$2179;
1022
UnicodeLower2126_2183[$216A]:=$217A;
1023
UnicodeLower2126_2183[$216B]:=$217B;
1024
UnicodeLower2126_2183[$216C]:=$217C;
1025
UnicodeLower2126_2183[$216D]:=$217D;
1026
UnicodeLower2126_2183[$216E]:=$217E;
1027
UnicodeLower2126_2183[$216F]:=$217F;
1028
UnicodeLower2126_2183[$2183]:=$2184;
1030
for i:=Low(UnicodeLower2C60_2CE2) to High(UnicodeLower2C60_2CE2) do
1031
UnicodeLower2C60_2CE2[i]:=i;
1032
UnicodeLower2C60_2CE2[$2C60]:=$2C61;
1033
UnicodeLower2C60_2CE2[$2C62]:=$026B;
1034
UnicodeLower2C60_2CE2[$2C63]:=$1D7D;
1035
UnicodeLower2C60_2CE2[$2C64]:=$027D;
1036
UnicodeLower2C60_2CE2[$2C67]:=$2C68;
1037
UnicodeLower2C60_2CE2[$2C69]:=$2C6A;
1038
UnicodeLower2C60_2CE2[$2C6B]:=$2C6C;
1039
UnicodeLower2C60_2CE2[$2C75]:=$2C76;
1040
UnicodeLower2C60_2CE2[$2C80]:=$2C81;
1041
UnicodeLower2C60_2CE2[$2C82]:=$2C83;
1042
UnicodeLower2C60_2CE2[$2C84]:=$2C85;
1043
UnicodeLower2C60_2CE2[$2C86]:=$2C87;
1044
UnicodeLower2C60_2CE2[$2C88]:=$2C89;
1045
UnicodeLower2C60_2CE2[$2C8A]:=$2C8B;
1046
UnicodeLower2C60_2CE2[$2C8C]:=$2C8D;
1047
UnicodeLower2C60_2CE2[$2C8E]:=$2C8F;
1048
UnicodeLower2C60_2CE2[$2C90]:=$2C91;
1049
UnicodeLower2C60_2CE2[$2C92]:=$2C93;
1050
UnicodeLower2C60_2CE2[$2C94]:=$2C95;
1051
UnicodeLower2C60_2CE2[$2C96]:=$2C97;
1052
UnicodeLower2C60_2CE2[$2C98]:=$2C99;
1053
UnicodeLower2C60_2CE2[$2C9A]:=$2C9B;
1054
UnicodeLower2C60_2CE2[$2C9C]:=$2C9D;
1055
UnicodeLower2C60_2CE2[$2C9E]:=$2C9F;
1056
UnicodeLower2C60_2CE2[$2CA0]:=$2CA1;
1057
UnicodeLower2C60_2CE2[$2CA2]:=$2CA3;
1058
UnicodeLower2C60_2CE2[$2CA4]:=$2CA5;
1059
UnicodeLower2C60_2CE2[$2CA6]:=$2CA7;
1060
UnicodeLower2C60_2CE2[$2CA8]:=$2CA9;
1061
UnicodeLower2C60_2CE2[$2CAA]:=$2CAB;
1062
UnicodeLower2C60_2CE2[$2CAC]:=$2CAD;
1063
UnicodeLower2C60_2CE2[$2CAE]:=$2CAF;
1064
UnicodeLower2C60_2CE2[$2CB0]:=$2CB1;
1065
UnicodeLower2C60_2CE2[$2CB2]:=$2CB3;
1066
UnicodeLower2C60_2CE2[$2CB4]:=$2CB5;
1067
UnicodeLower2C60_2CE2[$2CB6]:=$2CB7;
1068
UnicodeLower2C60_2CE2[$2CB8]:=$2CB9;
1069
UnicodeLower2C60_2CE2[$2CBA]:=$2CBB;
1070
UnicodeLower2C60_2CE2[$2CBC]:=$2CBD;
1071
UnicodeLower2C60_2CE2[$2CBE]:=$2CBF;
1072
UnicodeLower2C60_2CE2[$2CC0]:=$2CC1;
1073
UnicodeLower2C60_2CE2[$2CC2]:=$2CC3;
1074
UnicodeLower2C60_2CE2[$2CC4]:=$2CC5;
1075
UnicodeLower2C60_2CE2[$2CC6]:=$2CC7;
1076
UnicodeLower2C60_2CE2[$2CC8]:=$2CC9;
1077
UnicodeLower2C60_2CE2[$2CCA]:=$2CCB;
1078
UnicodeLower2C60_2CE2[$2CCC]:=$2CCD;
1079
UnicodeLower2C60_2CE2[$2CCE]:=$2CCF;
1080
UnicodeLower2C60_2CE2[$2CD0]:=$2CD1;
1081
UnicodeLower2C60_2CE2[$2CD2]:=$2CD3;
1082
UnicodeLower2C60_2CE2[$2CD4]:=$2CD5;
1083
UnicodeLower2C60_2CE2[$2CD6]:=$2CD7;
1084
UnicodeLower2C60_2CE2[$2CD8]:=$2CD9;
1085
UnicodeLower2C60_2CE2[$2CDA]:=$2CDB;
1086
UnicodeLower2C60_2CE2[$2CDC]:=$2CDD;
1087
UnicodeLower2C60_2CE2[$2CDE]:=$2CDF;
1088
UnicodeLower2C60_2CE2[$2CE0]:=$2CE1;
1089
UnicodeLower2C60_2CE2[$2CE2]:=$2CE3;
1091
{$endif NewLowerCase}
1093
441
function DeleteAmpersands(var Str : String) : Longint;
1094
442
// Replace all &x with x
1095
443
// and return the position of the first ampersand letter in the resulting Str.
3520
2676
This function is similar to UTF8FindNearestCharStart
3522
2678
function UTF8CharStart(UTF8Str: PChar; Len, CharIndex: PtrInt): PChar;
3527
if Result<>nil then begin
3528
while (CharIndex>0) and (Len>0) do begin
3529
CharLen:=UTF8CharacterLength(Result);
3532
inc(Result,CharLen);
3534
if (CharIndex>0) or (Len<0) then
2680
Result := LazUTF8.UTF8CharStart(UTF8Str, Len, CharIndex);
3539
2683
function UTF8CharToByteIndex(UTF8Str: PChar; Len, CharIndex: PtrInt): PtrInt;
3543
p := UTF8CharStart(UTF8Str, Len, CharIndex);
3546
else Result := p - UTF8Str;
2685
Result := LazUTF8.UTF8CharToByteIndex(UTF8Str, Len, CharIndex);
3549
2688
{ fix any broken UTF8 sequences with spaces }
3550
2689
procedure UTF8FixBroken(P: PChar);
3553
while p^<>#0 do begin
3554
if ord(p^)<%10000000 then begin
3555
// regular single byte character
3558
else if ord(p^)<%11000000 then begin
3563
else if ((ord(p^) and %11100000) = %11000000) then begin
3564
// should be 2 byte character
3565
if (ord(p[1]) and %11000000) = %10000000 then
3567
else if p[1]<>#0 then
3570
else if ((ord(p^) and %11110000) = %11100000) then begin
3571
// should be 3 byte character
3572
if ((ord(p[1]) and %11000000) = %10000000)
3573
and ((ord(p[2]) and %11000000) = %10000000) then
3578
else if ((ord(p^) and %11111000) = %11110000) then begin
3579
// should be 4 byte character
3580
if ((ord(p[1]) and %11000000) = %10000000)
3581
and ((ord(p[2]) and %11000000) = %10000000)
3582
and ((ord(p[3]) and %11000000) = %10000000) then
2691
LazUTF8.UTF8FixBroken(P);
3594
2694
function UTF8CharacterStrictLength(P: PChar): integer;
3596
if p=nil then exit(0);
3597
if ord(p^)<%10000000 then begin
3598
// regular single byte character
3601
else if ord(p^)<%11000000 then begin
3602
// invalid single byte character
3605
else if ((ord(p^) and %11100000) = %11000000) then begin
3606
// should be 2 byte character
3607
if (ord(p[1]) and %11000000) = %10000000 then
3612
else if ((ord(p^) and %11110000) = %11100000) then begin
3613
// should be 3 byte character
3614
if ((ord(p[1]) and %11000000) = %10000000)
3615
and ((ord(p[2]) and %11000000) = %10000000) then
3620
else if ((ord(p^) and %11111000) = %11110000) then begin
3621
// should be 4 byte character
3622
if ((ord(p[1]) and %11000000) = %10000000)
3623
and ((ord(p[2]) and %11000000) = %10000000)
3624
and ((ord(p[3]) and %11000000) = %10000000) then
2696
Result := LazUTF8.UTF8CharacterStrictLength(P);
3632
2699
function UTF8CStringToUTF8String(SourceStart: PChar; SourceLen: PtrInt) : string;
3638
SourceCopied: PChar;
3640
// Copies from SourceStart till Source to Dest and updates Dest
3641
procedure CopyPart; inline;
3643
CopyLength: SizeInt;
3645
CopyLength := Source - SourceCopied;
3646
if CopyLength=0 then exit;
3647
System.move(SourceCopied^ , Dest^, CopyLength);
3648
SourceCopied:=Source;
3649
inc(Dest, CopyLength);
3653
SetLength(Result, SourceLen);
3654
if SourceLen=0 then exit;
3655
SourceCopied:=SourceStart;
3656
Source:=SourceStart;
3657
Dest:=PChar(Result);
3658
SourceEnd := Source + SourceLen;
3659
while Source<SourceEnd do begin
3660
CharLen := UTF8CharacterLength(Source);
3661
if (CharLen=1) and (Source^='\') then begin
3664
if Source^ in ['t', 'n', '"', '\'] then begin
3670
// fpc 2.1.1 stores string constants as array of char so maybe this
3671
// will work for without ifdef (once available in 2.0.x too):
3672
// move(lineending, dest^, sizeof(LineEnding));
3675
move(lineending[1], dest^, length(LineEnding));
3676
inc(dest, length(LineEnding)-1);
3679
Dest^ := LineEnding;
3685
SourceCopied := Source;
3688
Inc(Source, CharLen);
3691
SetLength(Result, Dest - PChar(Result));
2701
Result := LazUTF8.UTF8CStringToUTF8String(SourceStart, SourceLen);
3694
2704
function UTF8Pos(const SearchForText, SearchInText: string): PtrInt;
3695
// returns the character index, where the SearchForText starts in SearchInText
3699
p:=System.Pos(SearchForText,SearchInText);
3701
Result:=UTF8Length(PChar(SearchInText),p-1)+1
2706
Result := LazUTF8.UTF8Pos(SearchForText, SearchInText);
3706
2709
function UTF8Copy(const s: string; StartCharIndex, CharCount: PtrInt): string;
3707
// returns substring
3709
StartBytePos: PChar;
3713
StartBytePos:=UTF8CharStart(PChar(s),length(s),StartCharIndex-1);
3714
if StartBytePos=nil then
3717
MaxBytes:=PtrInt(PChar(s)+length(s)-StartBytePos);
3718
EndBytePos:=UTF8CharStart(StartBytePos,MaxBytes,CharCount);
3719
if EndBytePos=nil then
3720
Result:=copy(s,StartBytePos-PChar(s)+1,MaxBytes)
3722
Result:=copy(s,StartBytePos-PChar(s)+1,EndBytePos-StartBytePos);
2711
Result := LazUTF8.UTF8Copy(s, StartCharIndex, CharCount);
3726
2714
procedure UTF8Delete(var s: String; StartCharIndex, CharCount: PtrInt);
3728
StartBytePos: PChar;
3732
StartBytePos:=UTF8CharStart(PChar(s),length(s),StartCharIndex-1);
3733
if StartBytePos <> nil then
3735
MaxBytes:=PtrInt(PChar(s)+length(s)-StartBytePos);
3736
EndBytePos:=UTF8CharStart(StartBytePos,MaxBytes,CharCount);
3737
if EndBytePos=nil then
3738
Delete(s,StartBytePos-PChar(s)+1,MaxBytes)
3740
Delete(s,StartBytePos-PChar(s)+1,EndBytePos-StartBytePos);
2716
LazUTF8.UTF8Delete(s, StartCharIndex, CharCount);
3744
2719
procedure UTF8Insert(const source: String; var s: string; StartCharIndex: PtrInt);
3746
StartBytePos: PChar;
3748
StartBytePos:=UTF8CharStart(PChar(s),length(s),StartCharIndex-1);
3749
if StartBytePos <> nil then
3750
Insert(source, s, StartBytePos-PChar(s)+1);
2721
LazUTF8.UTF8Insert(source, s, StartCharIndex);
3753
2724
function UTF8LowerCase(const s: String): String;
3755
Result := UTF8Encode(WideLowerCase(UTF8Decode(s)));
2726
Result := LazUTF8.UTF8LowerCase(S);
3758
2729
function UTF8UpperCase(const s: String): String;
3760
Result := UTF8Encode(WideUpperCase(UTF8Decode(s)));
3763
{$ifdef NewLowerCase}
3764
function UnicodeLowercase(u: cardinal): cardinal;
3766
if u<$00C0 then begin
3768
if (u>=$0041) and (u<=$0061) then
3774
$00C0..$00DE: Result:=UnicodeLower00C0_00DE[u];
3775
$0100..$024E: Result:=UnicodeLower0100_024E[u];
3776
$0386..$03AB: Result:=UnicodeLower0386_03AB[u];
3777
$03D8..$042F: Result:=UnicodeLower03D8_042F[u];
3778
$0460..$0512: Result:=UnicodeLower0460_0512[u];
3779
$0531..$0556: Result:=u+48;
3780
$10A0..$10C5: Result:=u+7264;
3781
$1E00..$1FFC: Result:=UnicodeLower1E00_1FFC[u];
3782
$2126..$2183: Result:=UnicodeLower2126_2183[u];
3783
$24B6..$24CF: Result:=u+26;
3784
$2C00..$2C2E: Result:=u+48;
3785
$2C60..$2CE2: Result:=UnicodeLower2C60_2CE2[u];
3786
$FF21..$FF3A: Result:=u+32;
3791
function UTF8LowercaseDynLength(const s: string): string;
3800
// first compute needed length
3803
while SrcPos<=length(s) do begin
3807
OldCode:=UTF8CharacterToUnicode(@s[SrcPos],CharLen);
3808
NewCode:=UnicodeLowercase(OldCode);
3809
if NewCode=OldCode then begin
3810
inc(DstPos,CharLen);
3812
inc(DstPos,UnicodeToUTF8(NewCode,@Buf[1]));
3814
inc(SrcPos,CharLen);
3821
SetLength(Result,DstPos-1);
3822
if Result='' then exit;
3823
// create the new string
3826
while SrcPos<=length(s) do begin
3830
OldCode:=UTF8CharacterToUnicode(@s[SrcPos],CharLen);
3831
NewCode:=UnicodeLowercase(OldCode);
3832
if NewCode=OldCode then begin
3833
System.Move(s[SrcPos],Result[DstPos],CharLen);
3834
inc(DstPos,CharLen);
3836
inc(DstPos,UnicodeToUTF8(NewCode,@Result[DstPos]));
3838
inc(SrcPos,CharLen);
3841
Result[DstPos]:=s[SrcPos];
3848
function UTF8LowerCaseNew(const s: string): string;
3854
NewCharLen: integer;
3858
while i<=length(Result) do begin
3860
{ First ASCII chars }
3863
Result[i]:=chr(ord(Result[i])+32);
3866
{ Now chars with multiple bytes }
3869
OldCode:=UTF8CharacterToUnicode(@Result[i],CharLen);
3870
NewCode:=UnicodeLowercase(OldCode);
3871
if NewCode=OldCode then begin
3874
UniqueString(Result);
3875
NewCharLen:=UnicodeToUTF8(NewCode,@Result[i]);
3876
if CharLen=NewCharLen then begin
3879
// string size changed => use slower function
3880
Result:=UTF8LowercaseDynLength(s);
3890
{$endif NewLowerCase}
2731
Result := LazUTF8.UTF8UpperCase(s);
3892
2734
function FindInvalidUTF8Character(p: PChar; Count: PtrInt;
3893
2735
StopOnNonASCII: Boolean): PtrInt;
3894
2736
// return -1 if ok
3898
if (p<>nil) then begin
3900
while Result<Count do begin
3901
if ord(p^)<128 then begin
3902
// regular single byte ASCII character (#0 is a character, this is pascal ;)
3905
else if ord(p^)<%11000000 then begin
3906
// regular single byte character
3907
if StopOnNonASCII then
3911
else if ((ord(p^) and %11100000) = %11000000) then begin
3912
// could be 2 byte character
3913
if (Result<Count-1) and ((ord(p[1]) and %11000000) = %10000000) then
3916
exit; // missing following bytes
3918
else if ((ord(p^) and %11110000) = %11100000) then begin
3919
// could be 3 byte character
3920
if (Result<Count-2) and ((ord(p[1]) and %11000000) = %10000000)
3921
and ((ord(p[2]) and %11000000) = %10000000) then
3924
exit; // missing following bytes
3926
else if ((ord(p^) and %11111000) = %11110000) then begin
3927
// could be 4 byte character
3928
if (Result<Count-3) and ((ord(p[1]) and %11000000) = %10000000)
3929
and ((ord(p[2]) and %11000000) = %10000000)
3930
and ((ord(p[3]) and %11000000) = %10000000) then
3933
exit; // missing following bytes
3936
if StopOnNonASCII then
3940
inc(Result,CharLen);
3942
if Result>Count then begin
3943
dec(Result,CharLen);
3944
exit; // missing following bytes
2738
Result := LazUTF8.FindInvalidUTF8Character(p, Count, StopOnNonASCII);
3952
2741
function ValidUTF8String(const s: String): String;
3958
if FindInvalidUTF8Character(PChar(s), Length(s)) <> -1 then
3961
GetMem(p, Length(s) + 1);
3975
l := UTF8CharacterLength(cur);
3976
if (l = 1) and (cur^ < #32) then
3977
Result := Result + '#' + IntToStr(Ord(cur^))
3980
lr := Length(Result);
3981
SetLength(Result, lr + l);
3982
System.Move(cur^, Result[lr + 1], l);
2743
Result := LazUTF8.ValidUTF8String(s);
3991
2746
procedure AssignUTF8ListToAnsi(UTF8List, AnsiList: TStrings);
3996
if UTF8List=nil then exit;
3997
for i:=0 to UTF8List.Count-1 do
3998
AnsiList.Add(UTF8ToSys(UTF8List[i]));
2748
LazUTF8.AssignUTF8ListToAnsi(UTF8List, AnsiList);
4001
2751
function UTF16CharacterLength(p: PWideChar): integer;