1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369137013711372137313741375137613771378137913801381138213831384138513861387138813891390139113921393139413951396139713981399140014011402140314041405140614071408140914101411141214131414141514161417141814191420142114221423142414251426142714281429143014311432143314341435143614371438143914401441144214431444144514461447144814491450145114521453145414551456145714581459146014611462146314641465146614671468146914701471147214731474147514761477147814791480148114821483148414851486148714881489149014911492149314941495149614971498149915001501150215031504150515061507150815091510151115121513151415151516151715181519152015211522152315241525152615271528152915301531153215331534153515361537153815391540154115421543154415451546154715481549155015511552155315541555155615571558155915601561156215631564156515661567156815691570157115721573157415751576157715781579158015811582158315841585158615871588158915901591159215931594159515961597159815991600160116021603160416051606160716081609161016111612161316141615161616171618161916201621162216231624162516261627162816291630163116321633163416351636163716381639164016411642164316441645164616471648164916501651165216531654165516561657165816591660166116621663166416651666166716681669167016711672167316741675167616771678167916801681168216831684168516861687168816891690169116921693169416951696169716981699170017011702170317041705170617071708170917101711171217131714171517161717171817191720172117221723172417251726172717281729173017311732173317341735173617371738173917401741174217431744174517461747174817491750175117521753175417551756175717581759176017611762176317641765176617671768176917701771177217731774177517761777177817791780178117821783178417851786178717881789179017911792179317941795179617971798179918001801180218031804180518061807180818091810181118121813181418151816181718181819182018211822182318241825182618271828182918301831183218331834183518361837183818391840184118421843184418451846184718481849185018511852185318541855185618571858185918601861186218631864186518661867186818691870187118721873187418751876187718781879188018811882188318841885188618871888188918901891189218931894189518961897189818991900190119021903190419051906190719081909191019111912191319141915191619171918191919201921192219231924192519261927192819291930193119321933193419351936193719381939194019411942194319441945194619471948194919501951195219531954195519561957195819591960196119621963196419651966196719681969197019711972197319741975197619771978197919801981198219831984198519861987198819891990199119921993199419951996199719981999200020012002200320042005200620072008200920102011201220132014201520162017201820192020202120222023202420252026202720282029203020312032203320342035203620372038203920402041204220432044204520462047204820492050205120522053205420552056205720582059206020612062206320642065206620672068206920702071207220732074207520762077207820792080208120822083208420852086208720882089209020912092209320942095209620972098209921002101210221032104210521062107210821092110211121122113211421152116211721182119212021212122212321242125212621272128212921302131213221332134213521362137213821392140214121422143214421452146214721482149215021512152215321542155215621572158215921602161216221632164216521662167216821692170217121722173217421752176217721782179218021812182218321842185218621872188218921902191219221932194219521962197219821992200220122022203220422052206220722082209221022112212221322142215221622172218221922202221222222232224222522262227222822292230223122322233223422352236223722382239224022412242224322442245224622472248224922502251225222532254225522562257 |
- /***************************************************************************
- * *
- * _____ ____ *
- * | __ \ / __ \ _ _ _____ *
- * | | \ \ / / \_\ | | | | _ \ *
- * | | \ \| | | | | | |_| | *
- * | | | || | | | | | ___/ *
- * | | / /| | __ | | | | _ \ *
- * | |__/ / \ \__/ / | |___| | |_| | *
- * |_____/ \____/ |_____|_|_____/ *
- * *
- * Wiimms source code library *
- * *
- ***************************************************************************
- * *
- * Copyright (c) 2012-2022 by Dirk Clemens <wiimm@wiimm.de> *
- * *
- ***************************************************************************
- * *
- * This library is free software; you can redistribute it and/or modify *
- * it under the terms of the GNU General Public License as published by *
- * the Free Software Foundation; either version 2 of the License, or *
- * (at your option) any later version. *
- * *
- * This library is distributed in the hope that it will be useful, *
- * but WITHOUT ANY WARRANTY; without even the implied warranty of *
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
- * GNU General Public License for more details. *
- * *
- * See file gpl-2.0.txt or http://www.gnu.org/licenses/gpl-2.0.txt *
- * *
- ***************************************************************************/
- #define _GNU_SOURCE 1
- #include <string.h>
- #include <limits.h>
- #include <arpa/inet.h>
- #include "dclib-basics.h"
- #include "dclib-debug.h"
- #include "dclib-utf8.h"
- ///////////////////////////////////////////////////////////////////////////////
- ///////////////////////////////////////////////////////////////////////////////
- #define u0 DC_UTF8_ILLEGAL
- #define u1 DC_UTF8_1CHAR
- #define u2 DC_UTF8_2CHAR
- #define u3 DC_UTF8_3CHAR
- #define u4 DC_UTF8_4CHAR
- #define uc DC_UTF8_CONT_ANY
- const unsigned short TableUTF8Mode[256] =
- {
- u1,u1,u1,u1, u1,u1,u1,u1, u1,u1,u1,u1, u1,u1,u1,u1, // 0000xxxx
- u1,u1,u1,u1, u1,u1,u1,u1, u1,u1,u1,u1, u1,u1,u1,u1, // 0001xxxx
- u1,u1,u1,u1, u1,u1,u1,u1, u1,u1,u1,u1, u1,u1,u1,u1, // 0010xxxx
- u1,u1,u1,u1, u1,u1,u1,u1, u1,u1,u1,u1, u1,u1,u1,u1, // 0011xxxx
- u1,u1,u1,u1, u1,u1,u1,u1, u1,u1,u1,u1, u1,u1,u1,u1, // 0100xxxx
- u1,u1,u1,u1, u1,u1,u1,u1, u1,u1,u1,u1, u1,u1,u1,u1, // 0101xxxx
- u1,u1,u1,u1, u1,u1,u1,u1, u1,u1,u1,u1, u1,u1,u1,u1, // 0110xxxx
- u1,u1,u1,u1, u1,u1,u1,u1, u1,u1,u1,u1, u1,u1,u1,u1, // 0111xxxx
- uc,uc,uc,uc, uc,uc,uc,uc, uc,uc,uc,uc, uc,uc,uc,uc, // 1000xxxx
- uc,uc,uc,uc, uc,uc,uc,uc, uc,uc,uc,uc, uc,uc,uc,uc, // 1001xxxx
- uc,uc,uc,uc, uc,uc,uc,uc, uc,uc,uc,uc, uc,uc,uc,uc, // 1010xxxx
- uc,uc,uc,uc, uc,uc,uc,uc, uc,uc,uc,uc, uc,uc,uc,uc, // 1011xxxx
- u2,u2,u2,u2, u2,u2,u2,u2, u2,u2,u2,u2, u2,u2,u2,u2, // 1100xxxx
- u2,u2,u2,u2, u2,u2,u2,u2, u2,u2,u2,u2, u2,u2,u2,u2, // 1101xxxx
- u3,u3,u3,u3, u3,u3,u3,u3, u3,u3,u3,u3, u3,u3,u3,u3, // 1110xxxx
- u4,u4,u4,u4, u4,u4,u4,u4, u0,u0,u0,u0, u0,u0,u0,u0 // 1111xxxx
- };
- #undef u0
- #undef u1
- #undef u2
- #undef u3
- #undef u4
- #undef uc
- ///////////////////////////////////////////////////////////////////////////////
- #define CheckUTF8Mode(ch) ((dcUTF8Mode)TableUTF8Mode[(unsigned char)(ch)])
- ///////////////////////////////////////////////////////////////////////////////
- int GetUTF8CharLength ( u32 code )
- {
- // returns the length of the char 'code'
- // 0 : illegal code
- return code <= DCLIB_UNICODE_MAX_UTF8_1
- ? 1
- : code <= DCLIB_UNICODE_MAX_UTF8_2
- ? 2
- : code <= DCLIB_UNICODE_MAX_UTF8_3
- ? 3
- : code <= DCLIB_UNICODE_MAX_UTF8_4
- ? 4
- : 0;
- }
- ///////////////////////////////////////////////////////////////////////////////
- char * NextUTF8Char ( ccp ptr )
- {
- // goto next UTF8 character
- switch (CheckUTF8Mode(*ptr))
- {
- case DC_UTF8_1CHAR:
- return *ptr ? (char*)ptr+1 : (char*)ptr;
- case DC_UTF8_4CHAR:
- if ( CheckUTF8Mode(*++ptr) != DC_UTF8_CONT_ANY )
- break;
- // fall through
- case DC_UTF8_3CHAR:
- case DC_UTF8_CONT_ANY:
- if ( CheckUTF8Mode(*++ptr) != DC_UTF8_CONT_ANY )
- break;
- // fall through
- case DC_UTF8_2CHAR:
- if ( CheckUTF8Mode(*++ptr) != DC_UTF8_CONT_ANY )
- break;
- // fall through
- default: // DC_UTF8_ILLEGAL
- return (char*)ptr+1;
- }
- return (char*)ptr;
- }
- //-----------------------------------------------------------------------------
- char * NextUTF8CharE( ccp ptr, ccp end )
- {
- // goto next UTF8 character
- if ( ptr >= end )
- return (char*)end;
- switch (CheckUTF8Mode(*ptr))
- {
- case DC_UTF8_1CHAR:
- return (char*)ptr+1;
- case DC_UTF8_4CHAR:
- if ( ++ptr >= end || CheckUTF8Mode(*ptr) != DC_UTF8_CONT_ANY )
- break;
- // fall through
- case DC_UTF8_3CHAR:
- case DC_UTF8_CONT_ANY:
- if ( ++ptr >= end || CheckUTF8Mode(*ptr) != DC_UTF8_CONT_ANY )
- break;
- // fall through
- case DC_UTF8_2CHAR:
- if ( ++ptr >= end || CheckUTF8Mode(*ptr) != DC_UTF8_CONT_ANY )
- break;
- // fall through
- default: // DC_UTF8_ILLEGAL
- return (char*)ptr+1;
- }
- return (char*)ptr;
- }
- ///////////////////////////////////////////////////////////////////////////////
- char * NextEUTF8Char ( ccp ptr )
- {
- return NextUTF8Char(SkipEscapes(ptr));
- }
- //-----------------------------------------------------------------------------
- char * NextEUTF8CharE ( ccp ptr, ccp end )
- {
- return NextUTF8CharE(SkipEscapesE(ptr,end),end);
- }
- ///////////////////////////////////////////////////////////////////////////////
- char * PrevUTF8Char ( ccp str )
- {
- // go to the previous UTC character
- // kleine Optimierung für den Standardfall
- if ( (uchar)str[-1] < (uint)DCLIB_UNICODE_MAX_UTF8_1 )
- return (char*)str-1;
- ccp ptr = str;
- int n = 0;
- dcUTF8Mode mode = CheckUTF8Mode(*--ptr);
- while ( n < 3 && mode == DC_UTF8_CONT_ANY )
- {
- n++;
- mode = CheckUTF8Mode(*--ptr);
- }
- switch (mode)
- {
- case DC_UTF8_1CHAR:
- return (char*)( n<1 ? ptr : ptr+1 );
- case DC_UTF8_2CHAR:
- return (char*)( n<2 ? ptr : ptr+2 );
- case DC_UTF8_3CHAR:
- return (char*)( n<3 ? ptr : ptr+3 );
- case DC_UTF8_4CHAR:
- return (char*)( n<4 ? ptr : ptr+4 );
- case DC_UTF8_CONT_ANY:
- return (char*)str-3;
- default:
- return (char*)str-1;
- }
- }
- //-----------------------------------------------------------------------------
- char * PrevUTF8CharB ( ccp str, ccp begin )
- {
- // go to the previous UTC character
- ccp ptr = str;
- if ( ptr <= begin )
- return (char*)begin;
- // kleine Optimierung für den Standardfall
- if ( (uchar)ptr[-1] < (uint)DCLIB_UNICODE_MAX_UTF8_1 )
- return (char*)ptr-1;
- int n = 0;
- dcUTF8Mode mode = CheckUTF8Mode(*--ptr);
- while ( ptr > begin && n < 3 && mode == DC_UTF8_CONT_ANY )
- {
- n++;
- mode = CheckUTF8Mode(*--ptr);
- }
- switch (mode)
- {
- case DC_UTF8_1CHAR:
- return (char*)( n<1 ? ptr : ptr+1 );
- case DC_UTF8_2CHAR:
- return (char*)( n<2 ? ptr : ptr+2 );
- case DC_UTF8_3CHAR:
- return (char*)( n<3 ? ptr : ptr+3 );
- case DC_UTF8_4CHAR:
- return (char*)( n<4 ? ptr : ptr+4 );
- case DC_UTF8_CONT_ANY:
- return (char*)str-3;
- default:
- return (char*)str-1;
- }
- }
- ///////////////////////////////////////////////////////////////////////////////
- char * SkipUTF8Char ( ccp str, int skip )
- {
- if (str)
- {
- if ( skip < 0 )
- skip += ScanUTF8Length(str);
- while ( skip-- > 0 )
- {
- ccp next = NextUTF8Char(str);
- if ( str == next )
- break;
- str = next;
- }
- }
- return (char*)str;
- }
- //-----------------------------------------------------------------------------
- char * SkipUTF8CharE ( ccp str, ccp end, int skip )
- {
- if (str)
- {
- if ( skip < 0 )
- skip += ScanUTF8LengthE(str,end);
- while ( skip-- > 0 )
- {
- ccp next = NextUTF8CharE(str,end);
- if ( str == next )
- break;
- str = next;
- }
- }
- return (char*)str;
- }
- //-----------------------------------------------------------------------------
- char * SkipEUTF8Char ( ccp str, int skip )
- {
- if (str)
- {
- if ( skip < 0 )
- skip += ScanEUTF8Length(str);
- while ( skip-- > 0 )
- {
- ccp next = NextEUTF8Char(str);
- if ( str == next )
- break;
- str = next;
- }
- }
- return (char*)str;
- }
- //-----------------------------------------------------------------------------
- char * SkipEUTF8CharE ( ccp str, ccp end, int skip )
- {
- if (str)
- {
- if ( skip < 0 )
- skip += ScanEUTF8LengthE(str,end);
- while ( skip-- > 0 )
- {
- ccp next = NextEUTF8CharE(str,end);
- if ( str == next )
- break;
- str = next;
- }
- }
- return (char*)str;
- }
- ///////////////////////////////////////////////////////////////////////////////
- u32 GetUTF8Char ( ccp str )
- {
- // fast scan of a UTF8 char -> ignore errors in continuation bytes
- const u32 result = (uchar)*str;
- switch (CheckUTF8Mode(result))
- {
- case DC_UTF8_1CHAR:
- return result;
- case DC_UTF8_2CHAR:
- return ( result & 0x1f ) << 6
- | ( str[1] & 0x3f );
- case DC_UTF8_3CHAR:
- return ( result & 0x0f ) << 12
- | ( str[1] & 0x3f ) << 6
- | ( str[2] & 0x3f );
- case DC_UTF8_4CHAR:
- return ( result & 0x07 ) << 18
- | ( str[1] & 0x3f ) << 12
- | ( str[2] & 0x3f ) << 6
- | ( str[3] & 0x3f );
- case DC_UTF8_CONT_ANY:
- return ( result & 0x3f ) << 12
- | ( str[1] & 0x3f ) << 6
- | ( str[2] & 0x3f );
- default: // DC_UTF8_ILLEGAL
- return result & 0x7f | S32_MIN;
- }
- }
- ///////////////////////////////////////////////////////////////////////////////
- u32 ScanUTF8Char ( ccp * p_str )
- {
- // scan a UTF8 char. Set bit LONG_MAX if an error seen.
- // *str is set to next next char if on no error.
- int n_cont;
- ccp ptr = *p_str;
- u32 result = (uchar)*ptr++;
- switch (CheckUTF8Mode(result))
- {
- case DC_UTF8_1CHAR:
- if (result)
- (*p_str)++;
- return result;
- case DC_UTF8_2CHAR:
- result &= 0x1f;
- n_cont = 1;
- break;
- case DC_UTF8_3CHAR:
- result &= 0x0f;
- n_cont = 2;
- break;
- case DC_UTF8_4CHAR:
- result &= 0x07;
- n_cont = 3;
- break;
- case DC_UTF8_CONT_ANY:
- if ( CheckUTF8Mode((uchar)*ptr) && CheckUTF8Mode((uchar)*++ptr) )
- ptr++;
- *p_str = ptr;
- return S32_MIN;
- default: // DC_UTF8_ILLEGAL
- (*p_str)++;
- return result & 0x7f | S32_MIN;
- }
- while ( n_cont-- > 0 )
- {
- if ( CheckUTF8Mode(*ptr) == DC_UTF8_CONT_ANY )
- result = result << 6 | *ptr++ & 0x3f;
- else
- {
- result |= S32_MIN;
- break;
- }
- }
- *p_str = ptr;
- return result;
- }
- //-----------------------------------------------------------------------------
- u32 ScanUTF8CharE ( ccp * p_str, ccp end )
- {
- // scan a UTF8 char. Set bit S32_MIN if an error seen
- // *str is set to next next char if on no error.
- ccp ptr = *p_str;
- if ( ptr >= end )
- return S32_MIN;
- int n_cont;
- u32 result = (uchar)*ptr++;
- switch (CheckUTF8Mode(result))
- {
- case DC_UTF8_1CHAR:
- (*p_str)++;
- return result;
- case DC_UTF8_2CHAR:
- if ( ptr >= end )
- return S32_MIN;
- result &= 0x1f;
- n_cont = 1;
- break;
- case DC_UTF8_3CHAR:
- if ( ptr+1 >= end )
- return S32_MIN;
- result &= 0x0f;
- n_cont = 2;
- break;
- case DC_UTF8_4CHAR:
- if ( ptr+2 >= end )
- return S32_MIN;
- result &= 0x07;
- n_cont = 3;
- break;
- case DC_UTF8_CONT_ANY:
- if ( ptr < end && CheckUTF8Mode((uchar)*ptr)
- && ++ptr < end && CheckUTF8Mode((uchar)*ptr) )
- ptr++;
- *p_str = ptr;
- return S32_MIN;
- default: // DC_UTF8_ILLEGAL
- (*p_str)++;
- return result & 0x7f | S32_MIN;
- }
- while ( n_cont-- > 0 )
- {
- if ( CheckUTF8Mode(*ptr) == DC_UTF8_CONT_ANY )
- result = result << 6 | *ptr++ & 0x3f;
- else
- {
- result |= S32_MIN;
- break;
- }
- }
- *p_str = ptr;
- return result;
- }
- ///////////////////////////////////////////////////////////////////////////////
- u32 ScanUTF8CharInc ( ccp * p_str )
- {
- // scan a UTF8 char. Set bit LONG_MAX if an error seen
- // *str is set to next next char => it is incremetned always!
- int n_cont;
- ccp ptr = *p_str;
- u32 result = (uchar)*ptr++;
- switch (CheckUTF8Mode(result))
- {
- case DC_UTF8_1CHAR:
- (*p_str)++;
- return result;
- case DC_UTF8_2CHAR:
- result &= 0x1f;
- n_cont = 1;
- break;
- case DC_UTF8_3CHAR:
- result &= 0x0f;
- n_cont = 2;
- break;
- case DC_UTF8_4CHAR:
- result &= 0x07;
- n_cont = 3;
- break;
- case DC_UTF8_CONT_ANY:
- if ( CheckUTF8Mode((uchar)*ptr) && CheckUTF8Mode((uchar)*++ptr) )
- ptr++;
- *p_str = ptr;
- return S32_MIN;
- default: // DC_UTF8_ILLEGAL
- (*p_str)++;
- return result & 0x7f | S32_MIN;
- }
- while ( n_cont-- > 0 )
- {
- if ( CheckUTF8Mode(*ptr) == DC_UTF8_CONT_ANY )
- result = result << 6 | *ptr++ & 0x3f;
- else
- {
- result |= S32_MIN;
- break;
- }
- }
- *p_str = ptr;
- return result;
- }
- //-----------------------------------------------------------------------------
- u32 ScanUTF8CharIncE ( ccp * p_str, ccp end )
- {
- // scan a UTF8 char. Set bit LONG_MAX if an error seen
- // *str is set to next next char => it is incremetned always!
- ccp ptr = *p_str;
- if ( ptr >= end )
- {
- (*p_str)++;
- return S32_MIN;
- }
- int n_cont = 0;
- u32 result = (uchar)*ptr++;
- switch (CheckUTF8Mode(result))
- {
- case DC_UTF8_1CHAR:
- (*p_str)++;
- return result;
- case DC_UTF8_2CHAR:
- result &= 0x1f;
- n_cont = 1;
- break;
- case DC_UTF8_3CHAR:
- result &= 0x0f;
- n_cont = 2;
- break;
- case DC_UTF8_4CHAR:
- result &= 0x07;
- n_cont = 3;
- break;
- case DC_UTF8_CONT_ANY:
- if ( ptr < end && CheckUTF8Mode((uchar)*ptr)
- && ++ptr < end && CheckUTF8Mode((uchar)*ptr) )
- ptr++;
- *p_str = ptr;
- return S32_MIN;
- default: // DC_UTF8_ILLEGAL
- (*p_str)++;
- return result & 0x7f | S32_MIN;
- }
- while ( n_cont-- > 0 )
- {
- if ( ptr < end && CheckUTF8Mode(*ptr) == DC_UTF8_CONT_ANY )
- result = result << 6 | *ptr++ & 0x3f;
- else
- {
- result |= S32_MIN;
- break;
- }
- }
- *p_str = ptr;
- return result;
- }
- //////////////////////////////////////////////////////////////////////////////
- ///////////////////////////////////////////////////////////////////////////////
- u32 GetUTF8AnsiChar ( ccp str )
- {
- // scan an UTF8 char. On error scan an ANSI char!
- const uchar * ptr = (const uchar *)str;
- u32 result = *ptr++;
- switch (CheckUTF8Mode(result))
- {
- case DC_UTF8_2CHAR:
- if ( CheckUTF8Mode(*ptr) == DC_UTF8_CONT_ANY )
- {
- return ( result & 0x1f ) << 6 | *ptr & 0x3f;
- }
- return result;
- case DC_UTF8_3CHAR:
- if ( CheckUTF8Mode(ptr[0]) == DC_UTF8_CONT_ANY
- && CheckUTF8Mode(ptr[1]) == DC_UTF8_CONT_ANY )
- {
- return (( result & 0x0f ) << 6
- | ptr[0] & 0x3f ) << 6
- | ptr[1] & 0x3f;
- }
- return result;
- case DC_UTF8_4CHAR:
- if ( CheckUTF8Mode(ptr[0]) == DC_UTF8_CONT_ANY
- && CheckUTF8Mode(ptr[1]) == DC_UTF8_CONT_ANY
- && CheckUTF8Mode(ptr[2]) == DC_UTF8_CONT_ANY )
- {
- return ((( result & 0x07 ) << 6
- | ptr[0] & 0x3f ) << 6
- | ptr[1] & 0x3f ) << 6
- | ptr[2] & 0x3f;
- }
- return result;
- default:
- return result;
- }
- }
- ///////////////////////////////////////////////////////////////////////////////
- u32 ScanUTF8AnsiChar ( ccp * p_str )
- {
- // scan an UTF8 char. On error scan an ANSI char!
- const uchar * ptr = (const uchar *)*p_str;
- u32 result = *ptr++;
- switch (CheckUTF8Mode(result))
- {
- case DC_UTF8_2CHAR:
- if ( CheckUTF8Mode(*ptr) == DC_UTF8_CONT_ANY )
- {
- result = ( result & 0x1f ) << 6 | *ptr++ & 0x3f;
- }
- break;
- case DC_UTF8_3CHAR:
- if ( CheckUTF8Mode(ptr[0]) == DC_UTF8_CONT_ANY
- && CheckUTF8Mode(ptr[1]) == DC_UTF8_CONT_ANY )
- {
- result = (( result & 0x0f ) << 6
- | ptr[0] & 0x3f ) << 6
- | ptr[1] & 0x3f;
- ptr += 2;
- }
- break;
- case DC_UTF8_4CHAR:
- if ( CheckUTF8Mode(ptr[0]) == DC_UTF8_CONT_ANY
- && CheckUTF8Mode(ptr[1]) == DC_UTF8_CONT_ANY
- && CheckUTF8Mode(ptr[2]) == DC_UTF8_CONT_ANY )
- {
- result = ((( result & 0x07 ) << 6
- | ptr[0] & 0x3f ) << 6
- | ptr[1] & 0x3f ) << 6
- | ptr[2] & 0x3f;
- ptr += 3;
- }
- break;
- default:
- break;
- }
- *p_str = (ccp)ptr;
- return result;
- }
- //-----------------------------------------------------------------------------
- u32 ScanUTF8AnsiCharE ( ccp * p_str, ccp end )
- {
- // scan an UTF8 char. On error scan an ANSI char!
- const uchar * ptr = (const uchar *)*p_str;
- if ( (ccp)ptr >= end )
- {
- (*p_str)++;
- return S32_MIN;
- }
- u32 result = *ptr++;
- switch (CheckUTF8Mode(result))
- {
- case DC_UTF8_2CHAR:
- if ( (ccp)ptr < end
- && CheckUTF8Mode(*ptr) == DC_UTF8_CONT_ANY )
- {
- result = ( result & 0x1f ) << 6 | *ptr++ & 0x3f;
- }
- break;
- case DC_UTF8_3CHAR:
- if ( (ccp)ptr+1 < end
- && CheckUTF8Mode(ptr[0]) == DC_UTF8_CONT_ANY
- && CheckUTF8Mode(ptr[1]) == DC_UTF8_CONT_ANY )
- {
- result = (( result & 0x0f ) << 6
- | ptr[0] & 0x3f ) << 6
- | ptr[1] & 0x3f;
- ptr += 2;
- }
- break;
- case DC_UTF8_4CHAR:
- if ( (ccp)ptr+2 < end
- && CheckUTF8Mode(ptr[0]) == DC_UTF8_CONT_ANY
- && CheckUTF8Mode(ptr[1]) == DC_UTF8_CONT_ANY
- && CheckUTF8Mode(ptr[2]) == DC_UTF8_CONT_ANY )
- {
- result = ((( result & 0x07 ) << 6
- | ptr[0] & 0x3f ) << 6
- | ptr[1] & 0x3f ) << 6
- | ptr[2] & 0x3f;
- ptr += 3;
- }
- break;
- default:
- break;
- }
- *p_str = (ccp)ptr;
- return result;
- }
- ///////////////////////////////////////////////////////////////////////////////
- ///////////////////////////////////////////////////////////////////////////////
- int ScanUTF8Length ( ccp str )
- {
- int count = 0;
- if (str)
- {
- ccp ptr = str;
- for(;;)
- {
- const char ch = *ptr++;
- if (!ch)
- break;
- switch (CheckUTF8Mode(ch))
- {
- case DC_UTF8_2CHAR:
- if ( CheckUTF8Mode(*ptr) == DC_UTF8_CONT_ANY )
- ptr++;
- break;
- case DC_UTF8_3CHAR:
- if ( CheckUTF8Mode(ptr[0]) == DC_UTF8_CONT_ANY
- && CheckUTF8Mode(ptr[1]) == DC_UTF8_CONT_ANY )
- ptr += 2;
- break;
- case DC_UTF8_4CHAR:
- if ( CheckUTF8Mode(ptr[0]) == DC_UTF8_CONT_ANY
- && CheckUTF8Mode(ptr[1]) == DC_UTF8_CONT_ANY
- && CheckUTF8Mode(ptr[2]) == DC_UTF8_CONT_ANY )
- ptr += 3;
- break;
- default:
- break;
- }
- count++;
- }
- }
- return count;
- }
- //-----------------------------------------------------------------------------
- int ScanUTF8LengthE ( ccp str, ccp end )
- {
- if (!end)
- return ScanUTF8Length(str);
- int count = 0;
- if (str)
- {
- ccp ptr = str;
- while ( ptr < end )
- {
- const char ch = *ptr++;
- switch (CheckUTF8Mode(ch))
- {
- case DC_UTF8_2CHAR:
- if ( CheckUTF8Mode(*ptr) == DC_UTF8_CONT_ANY )
- ptr++;
- break;
- case DC_UTF8_3CHAR:
- if ( CheckUTF8Mode(ptr[0]) == DC_UTF8_CONT_ANY
- && CheckUTF8Mode(ptr[1]) == DC_UTF8_CONT_ANY )
- ptr += 2;
- break;
- case DC_UTF8_4CHAR:
- if ( CheckUTF8Mode(ptr[0]) == DC_UTF8_CONT_ANY
- && CheckUTF8Mode(ptr[1]) == DC_UTF8_CONT_ANY
- && CheckUTF8Mode(ptr[2]) == DC_UTF8_CONT_ANY )
- ptr += 3;
- break;
- default:
- break;
- }
- count++;
- }
- }
- return count;
- }
- //-----------------------------------------------------------------------------
- int ScanEUTF8Length ( ccp str )
- {
- int count = 0;
- if (str)
- {
- ccp ptr = str;
- for(;;)
- {
- const char ch = *ptr++;
- if (!ch)
- break;
- if ( ch == '\e' )
- {
- ptr = SkipEscapes(ptr-1);
- continue;
- }
- switch (CheckUTF8Mode(ch))
- {
- case DC_UTF8_2CHAR:
- if ( CheckUTF8Mode(*ptr) == DC_UTF8_CONT_ANY )
- ptr++;
- break;
- case DC_UTF8_3CHAR:
- if ( CheckUTF8Mode(ptr[0]) == DC_UTF8_CONT_ANY
- && CheckUTF8Mode(ptr[1]) == DC_UTF8_CONT_ANY )
- ptr += 2;
- break;
- case DC_UTF8_4CHAR:
- if ( CheckUTF8Mode(ptr[0]) == DC_UTF8_CONT_ANY
- && CheckUTF8Mode(ptr[1]) == DC_UTF8_CONT_ANY
- && CheckUTF8Mode(ptr[2]) == DC_UTF8_CONT_ANY )
- ptr += 3;
- break;
- default:
- break;
- }
- count++;
- }
- }
- return count;
- }
- //-----------------------------------------------------------------------------
- int ScanEUTF8LengthE ( ccp str, ccp end )
- {
- if (!end)
- return ScanEUTF8Length(str);
- int count = 0;
- if (str)
- {
- ccp ptr = str;
- while ( ptr < end )
- {
- const char ch = *ptr++;
- if ( ch == '\e' )
- {
- ptr = SkipEscapesE(ptr-1,end);
- continue;
- }
- switch (CheckUTF8Mode(ch))
- {
- case DC_UTF8_2CHAR:
- if ( CheckUTF8Mode(*ptr) == DC_UTF8_CONT_ANY )
- ptr++;
- break;
- case DC_UTF8_3CHAR:
- if ( CheckUTF8Mode(ptr[0]) == DC_UTF8_CONT_ANY
- && CheckUTF8Mode(ptr[1]) == DC_UTF8_CONT_ANY )
- ptr += 2;
- break;
- case DC_UTF8_4CHAR:
- if ( CheckUTF8Mode(ptr[0]) == DC_UTF8_CONT_ANY
- && CheckUTF8Mode(ptr[1]) == DC_UTF8_CONT_ANY
- && CheckUTF8Mode(ptr[2]) == DC_UTF8_CONT_ANY )
- ptr += 3;
- break;
- default:
- break;
- }
- count++;
- }
- }
- return count;
- }
- ///////////////////////////////////////////////////////////////////////////////
- ///////////////////////////////////////////////////////////////////////////////
- int CalcUTF8PrintFW ( ccp str, ccp end, uint wanted_fw )
- {
- const uint bytecount = end ? end - str : strlen(str);
- const uint utf8len = ScanUTF8LengthE(str,end);
- return utf8len < wanted_fw
- ? wanted_fw - utf8len + bytecount
- : bytecount;
- }
- ///////////////////////////////////////////////////////////////////////////////
- ///////////////////////////////////////////////////////////////////////////////
- char * PrintUTF8Char ( char * buf, u32 code )
- {
- code &= DCLIB_UNICODE_CODE_MASK;
- if ( code <= DCLIB_UNICODE_MAX_UTF8_1 )
- {
- *buf++ = code;
- }
- else if ( code <= DCLIB_UNICODE_MAX_UTF8_2 )
- {
- *buf++ = code >> 6 | 0xc0;
- *buf++ = code & 0x3f | 0x80;
- }
- else if ( code <= DCLIB_UNICODE_MAX_UTF8_3 )
- {
- *buf++ = code >> 12 | 0xe0;
- *buf++ = code >> 6 & 0x3f | 0x80;
- *buf++ = code & 0x3f | 0x80;
- }
- else
- {
- *buf++ = code >> 18 & 0x07 | 0xf0;
- *buf++ = code >> 12 & 0x3f | 0x80;
- *buf++ = code >> 6 & 0x3f | 0x80;
- *buf++ = code & 0x3f | 0x80;
- }
- return buf;
- }
- ///////////////////////////////////////////////////////////////////////////////
- char * PrintUTF8CharToCircBuf ( u32 code )
- {
- char *buf;
- code &= DCLIB_UNICODE_CODE_MASK;
- if ( code <= DCLIB_UNICODE_MAX_UTF8_1 )
- {
- buf = GetCircBuf(2);
- buf[0] = code;
- buf[1] = 0;
- }
- else if ( code <= DCLIB_UNICODE_MAX_UTF8_2 )
- {
- buf = GetCircBuf(3);
- buf[0] = code >> 6 | 0xc0;
- buf[1] = code & 0x3f | 0x80;
- buf[2] = 0;
- }
- else if ( code <= DCLIB_UNICODE_MAX_UTF8_3 )
- {
- buf = GetCircBuf(4);
- buf[0] = code >> 12 | 0xe0;
- buf[1] = code >> 6 & 0x3f | 0x80;
- buf[2] = code & 0x3f | 0x80;
- buf[3] = 0;
- }
- else
- {
- buf = GetCircBuf(5);
- buf[0] = code >> 18 & 0x07 | 0xf0;
- buf[1] = code >> 12 & 0x3f | 0x80;
- buf[2] = code >> 6 & 0x3f | 0x80;
- buf[3] = code & 0x3f | 0x80;
- buf[4] = 0;
- }
- return buf;
- }
- ///////////////////////////////////////////////////////////////////////////////
- ///////////////////////////////////////////////////////////////////////////////
- exmem_t AlignUTF8 ( exmem_dest_t *dest, ccp str, int str_len, int fw, int prec )
- {
- int slen = str_len < 0
- ? ScanUTF8Length(str)
- : ScanUTF8LengthE(str,str+str_len);
- if ( prec >= 0 && slen > prec )
- slen = prec;
- const int align_left = fw < 0;
- if (align_left)
- fw = -fw;
- if ( fw < slen )
- fw = slen;
- int spaces = fw - slen;
- ccp end = SkipUTF8Char(str,slen);
- const int copy_len = end - str;
- exmem_t res = GetExmemDestBuf(dest,copy_len+spaces);
- char *buf = (char*)res.data.ptr;
- DASSERT(buf);
- if (align_left)
- {
- memcpy(buf,str,copy_len);
- memset(buf+copy_len,' ',spaces);
- }
- else
- {
- memset(buf,' ',spaces);
- memcpy(buf+spaces,str,copy_len);
- }
- return res;
- }
- ///////////////////////////////////////////////////////////////////////////////
- ccp AlignUTF8ToCircBuf ( ccp str, int fw, int prec )
- {
- uint len = ScanUTF8Length(str);
- if ( prec >= 0 && len > prec )
- len = prec;
- const int align_left = fw < 0;
- if ( align_left)
- fw = -fw;
- if ( fw < len )
- fw = len;
- int spaces = fw - len;
- ccp end = SkipUTF8Char(str,len);
- const int copy_len = end - str;
- char *buf = GetCircBuf(copy_len+spaces+1);
- DASSERT(buf);
- if (align_left)
- {
- memcpy(buf,str,copy_len);
- memset(buf+copy_len,' ',spaces);
- }
- else
- {
- memset(buf,' ',spaces);
- memcpy(buf+spaces,str,copy_len);
- }
- buf[copy_len+spaces] = 0;
- return buf;
- }
- ///////////////////////////////////////////////////////////////////////////////
- ///////////////////////////////////////////////////////////////////////////////
- exmem_t AlignEUTF8 ( exmem_dest_t *dest, ccp str, int str_len, int fw, int prec )
- {
- int slen = str_len < 0
- ? ScanUTF8Length(str)
- : ScanUTF8LengthE(str,str+str_len);
- if ( prec >= 0 && slen > prec )
- slen = prec;
- const int align_left = fw < 0;
- if (align_left)
- fw = -fw;
- if ( fw < slen )
- fw = slen;
- int spaces = fw - slen;
- ccp end = SkipEUTF8Char(str,slen);
- const int copy_len = end - str;
- exmem_t res = GetExmemDestBuf(dest,copy_len+spaces);
- char *buf = (char*)res.data.ptr;
- DASSERT(buf);
- if (align_left)
- {
- memcpy(buf,str,copy_len);
- memset(buf+copy_len,' ',spaces);
- }
- else
- {
- memset(buf,' ',spaces);
- memcpy(buf+spaces,str,copy_len);
- }
- return res;
- }
- ///////////////////////////////////////////////////////////////////////////////
- ccp AlignEUTF8ToCircBuf ( ccp str, int fw, int prec )
- {
- uint len = ScanEUTF8Length(str);
- if ( prec >= 0 && len > prec )
- len = prec;
- const int align_left = fw < 0;
- if ( align_left)
- fw = -fw;
- if ( fw < len )
- fw = len;
- int spaces = fw - len;
- ccp end = SkipEUTF8Char(str,len);
- const int copy_len = end - str;
- char *buf = GetCircBuf(copy_len+spaces+1);
- DASSERT(buf);
- if (align_left)
- {
- memcpy(buf,str,copy_len);
- memset(buf+copy_len,' ',spaces);
- }
- else
- {
- memset(buf,' ',spaces);
- memcpy(buf+spaces,str,copy_len);
- }
- buf[copy_len+spaces] = 0;
- return buf;
- }
- //
- ///////////////////////////////////////////////////////////////////////////////
- ///////////////////////////////////////////////////////////////////////////////
- // this table is directly generated from
- // http://unicode.org/Public/UNIDATA/UnicodeData.txt
- const dcUnicodeTripel TableUnicodeDecomp[] =
- {
- { 0x0000c0, 0x000041,0x000300 },
- { 0x0000c1, 0x000041,0x000301 },
- { 0x0000c2, 0x000041,0x000302 },
- { 0x0000c3, 0x000041,0x000303 },
- { 0x0000c4, 0x000041,0x000308 },
- { 0x0000c5, 0x000041,0x00030a },
- { 0x0000c7, 0x000043,0x000327 },
- { 0x0000c8, 0x000045,0x000300 },
- { 0x0000c9, 0x000045,0x000301 },
- { 0x0000ca, 0x000045,0x000302 },
- { 0x0000cb, 0x000045,0x000308 },
- { 0x0000cc, 0x000049,0x000300 },
- { 0x0000cd, 0x000049,0x000301 },
- { 0x0000ce, 0x000049,0x000302 },
- { 0x0000cf, 0x000049,0x000308 },
- { 0x0000d1, 0x00004e,0x000303 },
- { 0x0000d2, 0x00004f,0x000300 },
- { 0x0000d3, 0x00004f,0x000301 },
- { 0x0000d4, 0x00004f,0x000302 },
- { 0x0000d5, 0x00004f,0x000303 },
- { 0x0000d6, 0x00004f,0x000308 },
- { 0x0000d9, 0x000055,0x000300 },
- { 0x0000da, 0x000055,0x000301 },
- { 0x0000db, 0x000055,0x000302 },
- { 0x0000dc, 0x000055,0x000308 },
- { 0x0000dd, 0x000059,0x000301 },
- { 0x0000e0, 0x000061,0x000300 },
- { 0x0000e1, 0x000061,0x000301 },
- { 0x0000e2, 0x000061,0x000302 },
- { 0x0000e3, 0x000061,0x000303 },
- { 0x0000e4, 0x000061,0x000308 },
- { 0x0000e5, 0x000061,0x00030a },
- { 0x0000e7, 0x000063,0x000327 },
- { 0x0000e8, 0x000065,0x000300 },
- { 0x0000e9, 0x000065,0x000301 },
- { 0x0000ea, 0x000065,0x000302 },
- { 0x0000eb, 0x000065,0x000308 },
- { 0x0000ec, 0x000069,0x000300 },
- { 0x0000ed, 0x000069,0x000301 },
- { 0x0000ee, 0x000069,0x000302 },
- { 0x0000ef, 0x000069,0x000308 },
- { 0x0000f1, 0x00006e,0x000303 },
- { 0x0000f2, 0x00006f,0x000300 },
- { 0x0000f3, 0x00006f,0x000301 },
- { 0x0000f4, 0x00006f,0x000302 },
- { 0x0000f5, 0x00006f,0x000303 },
- { 0x0000f6, 0x00006f,0x000308 },
- { 0x0000f9, 0x000075,0x000300 },
- { 0x0000fa, 0x000075,0x000301 },
- { 0x0000fb, 0x000075,0x000302 },
- { 0x0000fc, 0x000075,0x000308 },
- { 0x0000fd, 0x000079,0x000301 },
- { 0x0000ff, 0x000079,0x000308 },
- { 0x000100, 0x000041,0x000304 },
- { 0x000101, 0x000061,0x000304 },
- { 0x000102, 0x000041,0x000306 },
- { 0x000103, 0x000061,0x000306 },
- { 0x000104, 0x000041,0x000328 },
- { 0x000105, 0x000061,0x000328 },
- { 0x000106, 0x000043,0x000301 },
- { 0x000107, 0x000063,0x000301 },
- { 0x000108, 0x000043,0x000302 },
- { 0x000109, 0x000063,0x000302 },
- { 0x00010a, 0x000043,0x000307 },
- { 0x00010b, 0x000063,0x000307 },
- { 0x00010c, 0x000043,0x00030c },
- { 0x00010d, 0x000063,0x00030c },
- { 0x00010e, 0x000044,0x00030c },
- { 0x00010f, 0x000064,0x00030c },
- { 0x000112, 0x000045,0x000304 },
- { 0x000113, 0x000065,0x000304 },
- { 0x000114, 0x000045,0x000306 },
- { 0x000115, 0x000065,0x000306 },
- { 0x000116, 0x000045,0x000307 },
- { 0x000117, 0x000065,0x000307 },
- { 0x000118, 0x000045,0x000328 },
- { 0x000119, 0x000065,0x000328 },
- { 0x00011a, 0x000045,0x00030c },
- { 0x00011b, 0x000065,0x00030c },
- { 0x00011c, 0x000047,0x000302 },
- { 0x00011d, 0x000067,0x000302 },
- { 0x00011e, 0x000047,0x000306 },
- { 0x00011f, 0x000067,0x000306 },
- { 0x000120, 0x000047,0x000307 },
- { 0x000121, 0x000067,0x000307 },
- { 0x000122, 0x000047,0x000327 },
- { 0x000123, 0x000067,0x000327 },
- { 0x000124, 0x000048,0x000302 },
- { 0x000125, 0x000068,0x000302 },
- { 0x000128, 0x000049,0x000303 },
- { 0x000129, 0x000069,0x000303 },
- { 0x00012a, 0x000049,0x000304 },
- { 0x00012b, 0x000069,0x000304 },
- { 0x00012c, 0x000049,0x000306 },
- { 0x00012d, 0x000069,0x000306 },
- { 0x00012e, 0x000049,0x000328 },
- { 0x00012f, 0x000069,0x000328 },
- { 0x000130, 0x000049,0x000307 },
- { 0x000134, 0x00004a,0x000302 },
- { 0x000135, 0x00006a,0x000302 },
- { 0x000136, 0x00004b,0x000327 },
- { 0x000137, 0x00006b,0x000327 },
- { 0x000139, 0x00004c,0x000301 },
- { 0x00013a, 0x00006c,0x000301 },
- { 0x00013b, 0x00004c,0x000327 },
- { 0x00013c, 0x00006c,0x000327 },
- { 0x00013d, 0x00004c,0x00030c },
- { 0x00013e, 0x00006c,0x00030c },
- { 0x000143, 0x00004e,0x000301 },
- { 0x000144, 0x00006e,0x000301 },
- { 0x000145, 0x00004e,0x000327 },
- { 0x000146, 0x00006e,0x000327 },
- { 0x000147, 0x00004e,0x00030c },
- { 0x000148, 0x00006e,0x00030c },
- { 0x00014c, 0x00004f,0x000304 },
- { 0x00014d, 0x00006f,0x000304 },
- { 0x00014e, 0x00004f,0x000306 },
- { 0x00014f, 0x00006f,0x000306 },
- { 0x000150, 0x00004f,0x00030b },
- { 0x000151, 0x00006f,0x00030b },
- { 0x000154, 0x000052,0x000301 },
- { 0x000155, 0x000072,0x000301 },
- { 0x000156, 0x000052,0x000327 },
- { 0x000157, 0x000072,0x000327 },
- { 0x000158, 0x000052,0x00030c },
- { 0x000159, 0x000072,0x00030c },
- { 0x00015a, 0x000053,0x000301 },
- { 0x00015b, 0x000073,0x000301 },
- { 0x00015c, 0x000053,0x000302 },
- { 0x00015d, 0x000073,0x000302 },
- { 0x00015e, 0x000053,0x000327 },
- { 0x00015f, 0x000073,0x000327 },
- { 0x000160, 0x000053,0x00030c },
- { 0x000161, 0x000073,0x00030c },
- { 0x000162, 0x000054,0x000327 },
- { 0x000163, 0x000074,0x000327 },
- { 0x000164, 0x000054,0x00030c },
- { 0x000165, 0x000074,0x00030c },
- { 0x000168, 0x000055,0x000303 },
- { 0x000169, 0x000075,0x000303 },
- { 0x00016a, 0x000055,0x000304 },
- { 0x00016b, 0x000075,0x000304 },
- { 0x00016c, 0x000055,0x000306 },
- { 0x00016d, 0x000075,0x000306 },
- { 0x00016e, 0x000055,0x00030a },
- { 0x00016f, 0x000075,0x00030a },
- { 0x000170, 0x000055,0x00030b },
- { 0x000171, 0x000075,0x00030b },
- { 0x000172, 0x000055,0x000328 },
- { 0x000173, 0x000075,0x000328 },
- { 0x000174, 0x000057,0x000302 },
- { 0x000175, 0x000077,0x000302 },
- { 0x000176, 0x000059,0x000302 },
- { 0x000177, 0x000079,0x000302 },
- { 0x000178, 0x000059,0x000308 },
- { 0x000179, 0x00005a,0x000301 },
- { 0x00017a, 0x00007a,0x000301 },
- { 0x00017b, 0x00005a,0x000307 },
- { 0x00017c, 0x00007a,0x000307 },
- { 0x00017d, 0x00005a,0x00030c },
- { 0x00017e, 0x00007a,0x00030c },
- { 0x0001a0, 0x00004f,0x00031b },
- { 0x0001a1, 0x00006f,0x00031b },
- { 0x0001af, 0x000055,0x00031b },
- { 0x0001b0, 0x000075,0x00031b },
- { 0x0001cd, 0x000041,0x00030c },
- { 0x0001ce, 0x000061,0x00030c },
- { 0x0001cf, 0x000049,0x00030c },
- { 0x0001d0, 0x000069,0x00030c },
- { 0x0001d1, 0x00004f,0x00030c },
- { 0x0001d2, 0x00006f,0x00030c },
- { 0x0001d3, 0x000055,0x00030c },
- { 0x0001d4, 0x000075,0x00030c },
- { 0x0001d5, 0x0000dc,0x000304 },
- { 0x0001d6, 0x0000fc,0x000304 },
- { 0x0001d7, 0x0000dc,0x000301 },
- { 0x0001d8, 0x0000fc,0x000301 },
- { 0x0001d9, 0x0000dc,0x00030c },
- { 0x0001da, 0x0000fc,0x00030c },
- { 0x0001db, 0x0000dc,0x000300 },
- { 0x0001dc, 0x0000fc,0x000300 },
- { 0x0001de, 0x0000c4,0x000304 },
- { 0x0001df, 0x0000e4,0x000304 },
- { 0x0001e0, 0x000226,0x000304 },
- { 0x0001e1, 0x000227,0x000304 },
- { 0x0001e2, 0x0000c6,0x000304 },
- { 0x0001e3, 0x0000e6,0x000304 },
- { 0x0001e6, 0x000047,0x00030c },
- { 0x0001e7, 0x000067,0x00030c },
- { 0x0001e8, 0x00004b,0x00030c },
- { 0x0001e9, 0x00006b,0x00030c },
- { 0x0001ea, 0x00004f,0x000328 },
- { 0x0001eb, 0x00006f,0x000328 },
- { 0x0001ec, 0x0001ea,0x000304 },
- { 0x0001ed, 0x0001eb,0x000304 },
- { 0x0001ee, 0x0001b7,0x00030c },
- { 0x0001ef, 0x000292,0x00030c },
- { 0x0001f0, 0x00006a,0x00030c },
- { 0x0001f4, 0x000047,0x000301 },
- { 0x0001f5, 0x000067,0x000301 },
- { 0x0001f8, 0x00004e,0x000300 },
- { 0x0001f9, 0x00006e,0x000300 },
- { 0x0001fa, 0x0000c5,0x000301 },
- { 0x0001fb, 0x0000e5,0x000301 },
- { 0x0001fc, 0x0000c6,0x000301 },
- { 0x0001fd, 0x0000e6,0x000301 },
- { 0x0001fe, 0x0000d8,0x000301 },
- { 0x0001ff, 0x0000f8,0x000301 },
- { 0x000200, 0x000041,0x00030f },
- { 0x000201, 0x000061,0x00030f },
- { 0x000202, 0x000041,0x000311 },
- { 0x000203, 0x000061,0x000311 },
- { 0x000204, 0x000045,0x00030f },
- { 0x000205, 0x000065,0x00030f },
- { 0x000206, 0x000045,0x000311 },
- { 0x000207, 0x000065,0x000311 },
- { 0x000208, 0x000049,0x00030f },
- { 0x000209, 0x000069,0x00030f },
- { 0x00020a, 0x000049,0x000311 },
- { 0x00020b, 0x000069,0x000311 },
- { 0x00020c, 0x00004f,0x00030f },
- { 0x00020d, 0x00006f,0x00030f },
- { 0x00020e, 0x00004f,0x000311 },
- { 0x00020f, 0x00006f,0x000311 },
- { 0x000210, 0x000052,0x00030f },
- { 0x000211, 0x000072,0x00030f },
- { 0x000212, 0x000052,0x000311 },
- { 0x000213, 0x000072,0x000311 },
- { 0x000214, 0x000055,0x00030f },
- { 0x000215, 0x000075,0x00030f },
- { 0x000216, 0x000055,0x000311 },
- { 0x000217, 0x000075,0x000311 },
- { 0x000218, 0x000053,0x000326 },
- { 0x000219, 0x000073,0x000326 },
- { 0x00021a, 0x000054,0x000326 },
- { 0x00021b, 0x000074,0x000326 },
- { 0x00021e, 0x000048,0x00030c },
- { 0x00021f, 0x000068,0x00030c },
- { 0x000226, 0x000041,0x000307 },
- { 0x000227, 0x000061,0x000307 },
- { 0x000228, 0x000045,0x000327 },
- { 0x000229, 0x000065,0x000327 },
- { 0x00022a, 0x0000d6,0x000304 },
- { 0x00022b, 0x0000f6,0x000304 },
- { 0x00022c, 0x0000d5,0x000304 },
- { 0x00022d, 0x0000f5,0x000304 },
- { 0x00022e, 0x00004f,0x000307 },
- { 0x00022f, 0x00006f,0x000307 },
- { 0x000230, 0x00022e,0x000304 },
- { 0x000231, 0x00022f,0x000304 },
- { 0x000232, 0x000059,0x000304 },
- { 0x000233, 0x000079,0x000304 },
- { 0x000344, 0x000308,0x000301 },
- { 0x000385, 0x0000a8,0x000301 },
- { 0x000386, 0x000391,0x000301 },
- { 0x000388, 0x000395,0x000301 },
- { 0x000389, 0x000397,0x000301 },
- { 0x00038a, 0x000399,0x000301 },
- { 0x00038c, 0x00039f,0x000301 },
- { 0x00038e, 0x0003a5,0x000301 },
- { 0x00038f, 0x0003a9,0x000301 },
- { 0x000390, 0x0003ca,0x000301 },
- { 0x0003aa, 0x000399,0x000308 },
- { 0x0003ab, 0x0003a5,0x000308 },
- { 0x0003ac, 0x0003b1,0x000301 },
- { 0x0003ad, 0x0003b5,0x000301 },
- { 0x0003ae, 0x0003b7,0x000301 },
- { 0x0003af, 0x0003b9,0x000301 },
- { 0x0003b0, 0x0003cb,0x000301 },
- { 0x0003ca, 0x0003b9,0x000308 },
- { 0x0003cb, 0x0003c5,0x000308 },
- { 0x0003cc, 0x0003bf,0x000301 },
- { 0x0003cd, 0x0003c5,0x000301 },
- { 0x0003ce, 0x0003c9,0x000301 },
- { 0x0003d3, 0x0003d2,0x000301 },
- { 0x0003d4, 0x0003d2,0x000308 },
- { 0x000400, 0x000415,0x000300 },
- { 0x000401, 0x000415,0x000308 },
- { 0x000403, 0x000413,0x000301 },
- { 0x000407, 0x000406,0x000308 },
- { 0x00040c, 0x00041a,0x000301 },
- { 0x00040d, 0x000418,0x000300 },
- { 0x00040e, 0x000423,0x000306 },
- { 0x000419, 0x000418,0x000306 },
- { 0x000439, 0x000438,0x000306 },
- { 0x000450, 0x000435,0x000300 },
- { 0x000451, 0x000435,0x000308 },
- { 0x000453, 0x000433,0x000301 },
- { 0x000457, 0x000456,0x000308 },
- { 0x00045c, 0x00043a,0x000301 },
- { 0x00045d, 0x000438,0x000300 },
- { 0x00045e, 0x000443,0x000306 },
- { 0x000476, 0x000474,0x00030f },
- { 0x000477, 0x000475,0x00030f },
- { 0x0004c1, 0x000416,0x000306 },
- { 0x0004c2, 0x000436,0x000306 },
- { 0x0004d0, 0x000410,0x000306 },
- { 0x0004d1, 0x000430,0x000306 },
- { 0x0004d2, 0x000410,0x000308 },
- { 0x0004d3, 0x000430,0x000308 },
- { 0x0004d6, 0x000415,0x000306 },
- { 0x0004d7, 0x000435,0x000306 },
- { 0x0004da, 0x0004d8,0x000308 },
- { 0x0004db, 0x0004d9,0x000308 },
- { 0x0004dc, 0x000416,0x000308 },
- { 0x0004dd, 0x000436,0x000308 },
- { 0x0004de, 0x000417,0x000308 },
- { 0x0004df, 0x000437,0x000308 },
- { 0x0004e2, 0x000418,0x000304 },
- { 0x0004e3, 0x000438,0x000304 },
- { 0x0004e4, 0x000418,0x000308 },
- { 0x0004e5, 0x000438,0x000308 },
- { 0x0004e6, 0x00041e,0x000308 },
- { 0x0004e7, 0x00043e,0x000308 },
- { 0x0004ea, 0x0004e8,0x000308 },
- { 0x0004eb, 0x0004e9,0x000308 },
- { 0x0004ec, 0x00042d,0x000308 },
- { 0x0004ed, 0x00044d,0x000308 },
- { 0x0004ee, 0x000423,0x000304 },
- { 0x0004ef, 0x000443,0x000304 },
- { 0x0004f0, 0x000423,0x000308 },
- { 0x0004f1, 0x000443,0x000308 },
- { 0x0004f2, 0x000423,0x00030b },
- { 0x0004f3, 0x000443,0x00030b },
- { 0x0004f4, 0x000427,0x000308 },
- { 0x0004f5, 0x000447,0x000308 },
- { 0x0004f8, 0x00042b,0x000308 },
- { 0x0004f9, 0x00044b,0x000308 },
- { 0x000622, 0x000627,0x000653 },
- { 0x000623, 0x000627,0x000654 },
- { 0x000624, 0x000648,0x000654 },
- { 0x000625, 0x000627,0x000655 },
- { 0x000626, 0x00064a,0x000654 },
- { 0x0006c0, 0x0006d5,0x000654 },
- { 0x0006c2, 0x0006c1,0x000654 },
- { 0x0006d3, 0x0006d2,0x000654 },
- { 0x000929, 0x000928,0x00093c },
- { 0x000931, 0x000930,0x00093c },
- { 0x000934, 0x000933,0x00093c },
- { 0x000958, 0x000915,0x00093c },
- { 0x000959, 0x000916,0x00093c },
- { 0x00095a, 0x000917,0x00093c },
- { 0x00095b, 0x00091c,0x00093c },
- { 0x00095c, 0x000921,0x00093c },
- { 0x00095d, 0x000922,0x00093c },
- { 0x00095e, 0x00092b,0x00093c },
- { 0x00095f, 0x00092f,0x00093c },
- { 0x0009cb, 0x0009c7,0x0009be },
- { 0x0009cc, 0x0009c7,0x0009d7 },
- { 0x0009dc, 0x0009a1,0x0009bc },
- { 0x0009dd, 0x0009a2,0x0009bc },
- { 0x0009df, 0x0009af,0x0009bc },
- { 0x000a33, 0x000a32,0x000a3c },
- { 0x000a36, 0x000a38,0x000a3c },
- { 0x000a59, 0x000a16,0x000a3c },
- { 0x000a5a, 0x000a17,0x000a3c },
- { 0x000a5b, 0x000a1c,0x000a3c },
- { 0x000a5e, 0x000a2b,0x000a3c },
- { 0x000b48, 0x000b47,0x000b56 },
- { 0x000b4b, 0x000b47,0x000b3e },
- { 0x000b4c, 0x000b47,0x000b57 },
- { 0x000b5c, 0x000b21,0x000b3c },
- { 0x000b5d, 0x000b22,0x000b3c },
- { 0x000b94, 0x000b92,0x000bd7 },
- { 0x000bca, 0x000bc6,0x000bbe },
- { 0x000bcb, 0x000bc7,0x000bbe },
- { 0x000bcc, 0x000bc6,0x000bd7 },
- { 0x000c48, 0x000c46,0x000c56 },
- { 0x000cc0, 0x000cbf,0x000cd5 },
- { 0x000cc7, 0x000cc6,0x000cd5 },
- { 0x000cc8, 0x000cc6,0x000cd6 },
- { 0x000cca, 0x000cc6,0x000cc2 },
- { 0x000ccb, 0x000cca,0x000cd5 },
- { 0x000d4a, 0x000d46,0x000d3e },
- { 0x000d4b, 0x000d47,0x000d3e },
- { 0x000d4c, 0x000d46,0x000d57 },
- { 0x000dda, 0x000dd9,0x000dca },
- { 0x000ddc, 0x000dd9,0x000dcf },
- { 0x000ddd, 0x000ddc,0x000dca },
- { 0x000dde, 0x000dd9,0x000ddf },
- { 0x000f43, 0x000f42,0x000fb7 },
- { 0x000f4d, 0x000f4c,0x000fb7 },
- { 0x000f52, 0x000f51,0x000fb7 },
- { 0x000f57, 0x000f56,0x000fb7 },
- { 0x000f5c, 0x000f5b,0x000fb7 },
- { 0x000f69, 0x000f40,0x000fb5 },
- { 0x000f73, 0x000f71,0x000f72 },
- { 0x000f75, 0x000f71,0x000f74 },
- { 0x000f76, 0x000fb2,0x000f80 },
- { 0x000f78, 0x000fb3,0x000f80 },
- { 0x000f81, 0x000f71,0x000f80 },
- { 0x000f93, 0x000f92,0x000fb7 },
- { 0x000f9d, 0x000f9c,0x000fb7 },
- { 0x000fa2, 0x000fa1,0x000fb7 },
- { 0x000fa7, 0x000fa6,0x000fb7 },
- { 0x000fac, 0x000fab,0x000fb7 },
- { 0x000fb9, 0x000f90,0x000fb5 },
- { 0x001026, 0x001025,0x00102e },
- { 0x001b06, 0x001b05,0x001b35 },
- { 0x001b08, 0x001b07,0x001b35 },
- { 0x001b0a, 0x001b09,0x001b35 },
- { 0x001b0c, 0x001b0b,0x001b35 },
- { 0x001b0e, 0x001b0d,0x001b35 },
- { 0x001b12, 0x001b11,0x001b35 },
- { 0x001b3b, 0x001b3a,0x001b35 },
- { 0x001b3d, 0x001b3c,0x001b35 },
- { 0x001b40, 0x001b3e,0x001b35 },
- { 0x001b41, 0x001b3f,0x001b35 },
- { 0x001b43, 0x001b42,0x001b35 },
- { 0x001e00, 0x000041,0x000325 },
- { 0x001e01, 0x000061,0x000325 },
- { 0x001e02, 0x000042,0x000307 },
- { 0x001e03, 0x000062,0x000307 },
- { 0x001e04, 0x000042,0x000323 },
- { 0x001e05, 0x000062,0x000323 },
- { 0x001e06, 0x000042,0x000331 },
- { 0x001e07, 0x000062,0x000331 },
- { 0x001e08, 0x0000c7,0x000301 },
- { 0x001e09, 0x0000e7,0x000301 },
- { 0x001e0a, 0x000044,0x000307 },
- { 0x001e0b, 0x000064,0x000307 },
- { 0x001e0c, 0x000044,0x000323 },
- { 0x001e0d, 0x000064,0x000323 },
- { 0x001e0e, 0x000044,0x000331 },
- { 0x001e0f, 0x000064,0x000331 },
- { 0x001e10, 0x000044,0x000327 },
- { 0x001e11, 0x000064,0x000327 },
- { 0x001e12, 0x000044,0x00032d },
- { 0x001e13, 0x000064,0x00032d },
- { 0x001e14, 0x000112,0x000300 },
- { 0x001e15, 0x000113,0x000300 },
- { 0x001e16, 0x000112,0x000301 },
- { 0x001e17, 0x000113,0x000301 },
- { 0x001e18, 0x000045,0x00032d },
- { 0x001e19, 0x000065,0x00032d },
- { 0x001e1a, 0x000045,0x000330 },
- { 0x001e1b, 0x000065,0x000330 },
- { 0x001e1c, 0x000228,0x000306 },
- { 0x001e1d, 0x000229,0x000306 },
- { 0x001e1e, 0x000046,0x000307 },
- { 0x001e1f, 0x000066,0x000307 },
- { 0x001e20, 0x000047,0x000304 },
- { 0x001e21, 0x000067,0x000304 },
- { 0x001e22, 0x000048,0x000307 },
- { 0x001e23, 0x000068,0x000307 },
- { 0x001e24, 0x000048,0x000323 },
- { 0x001e25, 0x000068,0x000323 },
- { 0x001e26, 0x000048,0x000308 },
- { 0x001e27, 0x000068,0x000308 },
- { 0x001e28, 0x000048,0x000327 },
- { 0x001e29, 0x000068,0x000327 },
- { 0x001e2a, 0x000048,0x00032e },
- { 0x001e2b, 0x000068,0x00032e },
- { 0x001e2c, 0x000049,0x000330 },
- { 0x001e2d, 0x000069,0x000330 },
- { 0x001e2e, 0x0000cf,0x000301 },
- { 0x001e2f, 0x0000ef,0x000301 },
- { 0x001e30, 0x00004b,0x000301 },
- { 0x001e31, 0x00006b,0x000301 },
- { 0x001e32, 0x00004b,0x000323 },
- { 0x001e33, 0x00006b,0x000323 },
- { 0x001e34, 0x00004b,0x000331 },
- { 0x001e35, 0x00006b,0x000331 },
- { 0x001e36, 0x00004c,0x000323 },
- { 0x001e37, 0x00006c,0x000323 },
- { 0x001e38, 0x001e36,0x000304 },
- { 0x001e39, 0x001e37,0x000304 },
- { 0x001e3a, 0x00004c,0x000331 },
- { 0x001e3b, 0x00006c,0x000331 },
- { 0x001e3c, 0x00004c,0x00032d },
- { 0x001e3d, 0x00006c,0x00032d },
- { 0x001e3e, 0x00004d,0x000301 },
- { 0x001e3f, 0x00006d,0x000301 },
- { 0x001e40, 0x00004d,0x000307 },
- { 0x001e41, 0x00006d,0x000307 },
- { 0x001e42, 0x00004d,0x000323 },
- { 0x001e43, 0x00006d,0x000323 },
- { 0x001e44, 0x00004e,0x000307 },
- { 0x001e45, 0x00006e,0x000307 },
- { 0x001e46, 0x00004e,0x000323 },
- { 0x001e47, 0x00006e,0x000323 },
- { 0x001e48, 0x00004e,0x000331 },
- { 0x001e49, 0x00006e,0x000331 },
- { 0x001e4a, 0x00004e,0x00032d },
- { 0x001e4b, 0x00006e,0x00032d },
- { 0x001e4c, 0x0000d5,0x000301 },
- { 0x001e4d, 0x0000f5,0x000301 },
- { 0x001e4e, 0x0000d5,0x000308 },
- { 0x001e4f, 0x0000f5,0x000308 },
- { 0x001e50, 0x00014c,0x000300 },
- { 0x001e51, 0x00014d,0x000300 },
- { 0x001e52, 0x00014c,0x000301 },
- { 0x001e53, 0x00014d,0x000301 },
- { 0x001e54, 0x000050,0x000301 },
- { 0x001e55, 0x000070,0x000301 },
- { 0x001e56, 0x000050,0x000307 },
- { 0x001e57, 0x000070,0x000307 },
- { 0x001e58, 0x000052,0x000307 },
- { 0x001e59, 0x000072,0x000307 },
- { 0x001e5a, 0x000052,0x000323 },
- { 0x001e5b, 0x000072,0x000323 },
- { 0x001e5c, 0x001e5a,0x000304 },
- { 0x001e5d, 0x001e5b,0x000304 },
- { 0x001e5e, 0x000052,0x000331 },
- { 0x001e5f, 0x000072,0x000331 },
- { 0x001e60, 0x000053,0x000307 },
- { 0x001e61, 0x000073,0x000307 },
- { 0x001e62, 0x000053,0x000323 },
- { 0x001e63, 0x000073,0x000323 },
- { 0x001e64, 0x00015a,0x000307 },
- { 0x001e65, 0x00015b,0x000307 },
- { 0x001e66, 0x000160,0x000307 },
- { 0x001e67, 0x000161,0x000307 },
- { 0x001e68, 0x001e62,0x000307 },
- { 0x001e69, 0x001e63,0x000307 },
- { 0x001e6a, 0x000054,0x000307 },
- { 0x001e6b, 0x000074,0x000307 },
- { 0x001e6c, 0x000054,0x000323 },
- { 0x001e6d, 0x000074,0x000323 },
- { 0x001e6e, 0x000054,0x000331 },
- { 0x001e6f, 0x000074,0x000331 },
- { 0x001e70, 0x000054,0x00032d },
- { 0x001e71, 0x000074,0x00032d },
- { 0x001e72, 0x000055,0x000324 },
- { 0x001e73, 0x000075,0x000324 },
- { 0x001e74, 0x000055,0x000330 },
- { 0x001e75, 0x000075,0x000330 },
- { 0x001e76, 0x000055,0x00032d },
- { 0x001e77, 0x000075,0x00032d },
- { 0x001e78, 0x000168,0x000301 },
- { 0x001e79, 0x000169,0x000301 },
- { 0x001e7a, 0x00016a,0x000308 },
- { 0x001e7b, 0x00016b,0x000308 },
- { 0x001e7c, 0x000056,0x000303 },
- { 0x001e7d, 0x000076,0x000303 },
- { 0x001e7e, 0x000056,0x000323 },
- { 0x001e7f, 0x000076,0x000323 },
- { 0x001e80, 0x000057,0x000300 },
- { 0x001e81, 0x000077,0x000300 },
- { 0x001e82, 0x000057,0x000301 },
- { 0x001e83, 0x000077,0x000301 },
- { 0x001e84, 0x000057,0x000308 },
- { 0x001e85, 0x000077,0x000308 },
- { 0x001e86, 0x000057,0x000307 },
- { 0x001e87, 0x000077,0x000307 },
- { 0x001e88, 0x000057,0x000323 },
- { 0x001e89, 0x000077,0x000323 },
- { 0x001e8a, 0x000058,0x000307 },
- { 0x001e8b, 0x000078,0x000307 },
- { 0x001e8c, 0x000058,0x000308 },
- { 0x001e8d, 0x000078,0x000308 },
- { 0x001e8e, 0x000059,0x000307 },
- { 0x001e8f, 0x000079,0x000307 },
- { 0x001e90, 0x00005a,0x000302 },
- { 0x001e91, 0x00007a,0x000302 },
- { 0x001e92, 0x00005a,0x000323 },
- { 0x001e93, 0x00007a,0x000323 },
- { 0x001e94, 0x00005a,0x000331 },
- { 0x001e95, 0x00007a,0x000331 },
- { 0x001e96, 0x000068,0x000331 },
- { 0x001e97, 0x000074,0x000308 },
- { 0x001e98, 0x000077,0x00030a },
- { 0x001e99, 0x000079,0x00030a },
- { 0x001e9b, 0x00017f,0x000307 },
- { 0x001ea0, 0x000041,0x000323 },
- { 0x001ea1, 0x000061,0x000323 },
- { 0x001ea2, 0x000041,0x000309 },
- { 0x001ea3, 0x000061,0x000309 },
- { 0x001ea4, 0x0000c2,0x000301 },
- { 0x001ea5, 0x0000e2,0x000301 },
- { 0x001ea6, 0x0000c2,0x000300 },
- { 0x001ea7, 0x0000e2,0x000300 },
- { 0x001ea8, 0x0000c2,0x000309 },
- { 0x001ea9, 0x0000e2,0x000309 },
- { 0x001eaa, 0x0000c2,0x000303 },
- { 0x001eab, 0x0000e2,0x000303 },
- { 0x001eac, 0x001ea0,0x000302 },
- { 0x001ead, 0x001ea1,0x000302 },
- { 0x001eae, 0x000102,0x000301 },
- { 0x001eaf, 0x000103,0x000301 },
- { 0x001eb0, 0x000102,0x000300 },
- { 0x001eb1, 0x000103,0x000300 },
- { 0x001eb2, 0x000102,0x000309 },
- { 0x001eb3, 0x000103,0x000309 },
- { 0x001eb4, 0x000102,0x000303 },
- { 0x001eb5, 0x000103,0x000303 },
- { 0x001eb6, 0x001ea0,0x000306 },
- { 0x001eb7, 0x001ea1,0x000306 },
- { 0x001eb8, 0x000045,0x000323 },
- { 0x001eb9, 0x000065,0x000323 },
- { 0x001eba, 0x000045,0x000309 },
- { 0x001ebb, 0x000065,0x000309 },
- { 0x001ebc, 0x000045,0x000303 },
- { 0x001ebd, 0x000065,0x000303 },
- { 0x001ebe, 0x0000ca,0x000301 },
- { 0x001ebf, 0x0000ea,0x000301 },
- { 0x001ec0, 0x0000ca,0x000300 },
- { 0x001ec1, 0x0000ea,0x000300 },
- { 0x001ec2, 0x0000ca,0x000309 },
- { 0x001ec3, 0x0000ea,0x000309 },
- { 0x001ec4, 0x0000ca,0x000303 },
- { 0x001ec5, 0x0000ea,0x000303 },
- { 0x001ec6, 0x001eb8,0x000302 },
- { 0x001ec7, 0x001eb9,0x000302 },
- { 0x001ec8, 0x000049,0x000309 },
- { 0x001ec9, 0x000069,0x000309 },
- { 0x001eca, 0x000049,0x000323 },
- { 0x001ecb, 0x000069,0x000323 },
- { 0x001ecc, 0x00004f,0x000323 },
- { 0x001ecd, 0x00006f,0x000323 },
- { 0x001ece, 0x00004f,0x000309 },
- { 0x001ecf, 0x00006f,0x000309 },
- { 0x001ed0, 0x0000d4,0x000301 },
- { 0x001ed1, 0x0000f4,0x000301 },
- { 0x001ed2, 0x0000d4,0x000300 },
- { 0x001ed3, 0x0000f4,0x000300 },
- { 0x001ed4, 0x0000d4,0x000309 },
- { 0x001ed5, 0x0000f4,0x000309 },
- { 0x001ed6, 0x0000d4,0x000303 },
- { 0x001ed7, 0x0000f4,0x000303 },
- { 0x001ed8, 0x001ecc,0x000302 },
- { 0x001ed9, 0x001ecd,0x000302 },
- { 0x001eda, 0x0001a0,0x000301 },
- { 0x001edb, 0x0001a1,0x000301 },
- { 0x001edc, 0x0001a0,0x000300 },
- { 0x001edd, 0x0001a1,0x000300 },
- { 0x001ede, 0x0001a0,0x000309 },
- { 0x001edf, 0x0001a1,0x000309 },
- { 0x001ee0, 0x0001a0,0x000303 },
- { 0x001ee1, 0x0001a1,0x000303 },
- { 0x001ee2, 0x0001a0,0x000323 },
- { 0x001ee3, 0x0001a1,0x000323 },
- { 0x001ee4, 0x000055,0x000323 },
- { 0x001ee5, 0x000075,0x000323 },
- { 0x001ee6, 0x000055,0x000309 },
- { 0x001ee7, 0x000075,0x000309 },
- { 0x001ee8, 0x0001af,0x000301 },
- { 0x001ee9, 0x0001b0,0x000301 },
- { 0x001eea, 0x0001af,0x000300 },
- { 0x001eeb, 0x0001b0,0x000300 },
- { 0x001eec, 0x0001af,0x000309 },
- { 0x001eed, 0x0001b0,0x000309 },
- { 0x001eee, 0x0001af,0x000303 },
- { 0x001eef, 0x0001b0,0x000303 },
- { 0x001ef0, 0x0001af,0x000323 },
- { 0x001ef1, 0x0001b0,0x000323 },
- { 0x001ef2, 0x000059,0x000300 },
- { 0x001ef3, 0x000079,0x000300 },
- { 0x001ef4, 0x000059,0x000323 },
- { 0x001ef5, 0x000079,0x000323 },
- { 0x001ef6, 0x000059,0x000309 },
- { 0x001ef7, 0x000079,0x000309 },
- { 0x001ef8, 0x000059,0x000303 },
- { 0x001ef9, 0x000079,0x000303 },
- { 0x001f00, 0x0003b1,0x000313 },
- { 0x001f01, 0x0003b1,0x000314 },
- { 0x001f02, 0x001f00,0x000300 },
- { 0x001f03, 0x001f01,0x000300 },
- { 0x001f04, 0x001f00,0x000301 },
- { 0x001f05, 0x001f01,0x000301 },
- { 0x001f06, 0x001f00,0x000342 },
- { 0x001f07, 0x001f01,0x000342 },
- { 0x001f08, 0x000391,0x000313 },
- { 0x001f09, 0x000391,0x000314 },
- { 0x001f0a, 0x001f08,0x000300 },
- { 0x001f0b, 0x001f09,0x000300 },
- { 0x001f0c, 0x001f08,0x000301 },
- { 0x001f0d, 0x001f09,0x000301 },
- { 0x001f0e, 0x001f08,0x000342 },
- { 0x001f0f, 0x001f09,0x000342 },
- { 0x001f10, 0x0003b5,0x000313 },
- { 0x001f11, 0x0003b5,0x000314 },
- { 0x001f12, 0x001f10,0x000300 },
- { 0x001f13, 0x001f11,0x000300 },
- { 0x001f14, 0x001f10,0x000301 },
- { 0x001f15, 0x001f11,0x000301 },
- { 0x001f18, 0x000395,0x000313 },
- { 0x001f19, 0x000395,0x000314 },
- { 0x001f1a, 0x001f18,0x000300 },
- { 0x001f1b, 0x001f19,0x000300 },
- { 0x001f1c, 0x001f18,0x000301 },
- { 0x001f1d, 0x001f19,0x000301 },
- { 0x001f20, 0x0003b7,0x000313 },
- { 0x001f21, 0x0003b7,0x000314 },
- { 0x001f22, 0x001f20,0x000300 },
- { 0x001f23, 0x001f21,0x000300 },
- { 0x001f24, 0x001f20,0x000301 },
- { 0x001f25, 0x001f21,0x000301 },
- { 0x001f26, 0x001f20,0x000342 },
- { 0x001f27, 0x001f21,0x000342 },
- { 0x001f28, 0x000397,0x000313 },
- { 0x001f29, 0x000397,0x000314 },
- { 0x001f2a, 0x001f28,0x000300 },
- { 0x001f2b, 0x001f29,0x000300 },
- { 0x001f2c, 0x001f28,0x000301 },
- { 0x001f2d, 0x001f29,0x000301 },
- { 0x001f2e, 0x001f28,0x000342 },
- { 0x001f2f, 0x001f29,0x000342 },
- { 0x001f30, 0x0003b9,0x000313 },
- { 0x001f31, 0x0003b9,0x000314 },
- { 0x001f32, 0x001f30,0x000300 },
- { 0x001f33, 0x001f31,0x000300 },
- { 0x001f34, 0x001f30,0x000301 },
- { 0x001f35, 0x001f31,0x000301 },
- { 0x001f36, 0x001f30,0x000342 },
- { 0x001f37, 0x001f31,0x000342 },
- { 0x001f38, 0x000399,0x000313 },
- { 0x001f39, 0x000399,0x000314 },
- { 0x001f3a, 0x001f38,0x000300 },
- { 0x001f3b, 0x001f39,0x000300 },
- { 0x001f3c, 0x001f38,0x000301 },
- { 0x001f3d, 0x001f39,0x000301 },
- { 0x001f3e, 0x001f38,0x000342 },
- { 0x001f3f, 0x001f39,0x000342 },
- { 0x001f40, 0x0003bf,0x000313 },
- { 0x001f41, 0x0003bf,0x000314 },
- { 0x001f42, 0x001f40,0x000300 },
- { 0x001f43, 0x001f41,0x000300 },
- { 0x001f44, 0x001f40,0x000301 },
- { 0x001f45, 0x001f41,0x000301 },
- { 0x001f48, 0x00039f,0x000313 },
- { 0x001f49, 0x00039f,0x000314 },
- { 0x001f4a, 0x001f48,0x000300 },
- { 0x001f4b, 0x001f49,0x000300 },
- { 0x001f4c, 0x001f48,0x000301 },
- { 0x001f4d, 0x001f49,0x000301 },
- { 0x001f50, 0x0003c5,0x000313 },
- { 0x001f51, 0x0003c5,0x000314 },
- { 0x001f52, 0x001f50,0x000300 },
- { 0x001f53, 0x001f51,0x000300 },
- { 0x001f54, 0x001f50,0x000301 },
- { 0x001f55, 0x001f51,0x000301 },
- { 0x001f56, 0x001f50,0x000342 },
- { 0x001f57, 0x001f51,0x000342 },
- { 0x001f59, 0x0003a5,0x000314 },
- { 0x001f5b, 0x001f59,0x000300 },
- { 0x001f5d, 0x001f59,0x000301 },
- { 0x001f5f, 0x001f59,0x000342 },
- { 0x001f60, 0x0003c9,0x000313 },
- { 0x001f61, 0x0003c9,0x000314 },
- { 0x001f62, 0x001f60,0x000300 },
- { 0x001f63, 0x001f61,0x000300 },
- { 0x001f64, 0x001f60,0x000301 },
- { 0x001f65, 0x001f61,0x000301 },
- { 0x001f66, 0x001f60,0x000342 },
- { 0x001f67, 0x001f61,0x000342 },
- { 0x001f68, 0x0003a9,0x000313 },
- { 0x001f69, 0x0003a9,0x000314 },
- { 0x001f6a, 0x001f68,0x000300 },
- { 0x001f6b, 0x001f69,0x000300 },
- { 0x001f6c, 0x001f68,0x000301 },
- { 0x001f6d, 0x001f69,0x000301 },
- { 0x001f6e, 0x001f68,0x000342 },
- { 0x001f6f, 0x001f69,0x000342 },
- { 0x001f70, 0x0003b1,0x000300 },
- { 0x001f72, 0x0003b5,0x000300 },
- { 0x001f74, 0x0003b7,0x000300 },
- { 0x001f76, 0x0003b9,0x000300 },
- { 0x001f78, 0x0003bf,0x000300 },
- { 0x001f7a, 0x0003c5,0x000300 },
- { 0x001f7c, 0x0003c9,0x000300 },
- { 0x001f80, 0x001f00,0x000345 },
- { 0x001f81, 0x001f01,0x000345 },
- { 0x001f82, 0x001f02,0x000345 },
- { 0x001f83, 0x001f03,0x000345 },
- { 0x001f84, 0x001f04,0x000345 },
- { 0x001f85, 0x001f05,0x000345 },
- { 0x001f86, 0x001f06,0x000345 },
- { 0x001f87, 0x001f07,0x000345 },
- { 0x001f88, 0x001f08,0x000345 },
- { 0x001f89, 0x001f09,0x000345 },
- { 0x001f8a, 0x001f0a,0x000345 },
- { 0x001f8b, 0x001f0b,0x000345 },
- { 0x001f8c, 0x001f0c,0x000345 },
- { 0x001f8d, 0x001f0d,0x000345 },
- { 0x001f8e, 0x001f0e,0x000345 },
- { 0x001f8f, 0x001f0f,0x000345 },
- { 0x001f90, 0x001f20,0x000345 },
- { 0x001f91, 0x001f21,0x000345 },
- { 0x001f92, 0x001f22,0x000345 },
- { 0x001f93, 0x001f23,0x000345 },
- { 0x001f94, 0x001f24,0x000345 },
- { 0x001f95, 0x001f25,0x000345 },
- { 0x001f96, 0x001f26,0x000345 },
- { 0x001f97, 0x001f27,0x000345 },
- { 0x001f98, 0x001f28,0x000345 },
- { 0x001f99, 0x001f29,0x000345 },
- { 0x001f9a, 0x001f2a,0x000345 },
- { 0x001f9b, 0x001f2b,0x000345 },
- { 0x001f9c, 0x001f2c,0x000345 },
- { 0x001f9d, 0x001f2d,0x000345 },
- { 0x001f9e, 0x001f2e,0x000345 },
- { 0x001f9f, 0x001f2f,0x000345 },
- { 0x001fa0, 0x001f60,0x000345 },
- { 0x001fa1, 0x001f61,0x000345 },
- { 0x001fa2, 0x001f62,0x000345 },
- { 0x001fa3, 0x001f63,0x000345 },
- { 0x001fa4, 0x001f64,0x000345 },
- { 0x001fa5, 0x001f65,0x000345 },
- { 0x001fa6, 0x001f66,0x000345 },
- { 0x001fa7, 0x001f67,0x000345 },
- { 0x001fa8, 0x001f68,0x000345 },
- { 0x001fa9, 0x001f69,0x000345 },
- { 0x001faa, 0x001f6a,0x000345 },
- { 0x001fab, 0x001f6b,0x000345 },
- { 0x001fac, 0x001f6c,0x000345 },
- { 0x001fad, 0x001f6d,0x000345 },
- { 0x001fae, 0x001f6e,0x000345 },
- { 0x001faf, 0x001f6f,0x000345 },
- { 0x001fb0, 0x0003b1,0x000306 },
- { 0x001fb1, 0x0003b1,0x000304 },
- { 0x001fb2, 0x001f70,0x000345 },
- { 0x001fb3, 0x0003b1,0x000345 },
- { 0x001fb4, 0x0003ac,0x000345 },
- { 0x001fb6, 0x0003b1,0x000342 },
- { 0x001fb7, 0x001fb6,0x000345 },
- { 0x001fb8, 0x000391,0x000306 },
- { 0x001fb9, 0x000391,0x000304 },
- { 0x001fba, 0x000391,0x000300 },
- { 0x001fbc, 0x000391,0x000345 },
- { 0x001fc1, 0x0000a8,0x000342 },
- { 0x001fc2, 0x001f74,0x000345 },
- { 0x001fc3, 0x0003b7,0x000345 },
- { 0x001fc4, 0x0003ae,0x000345 },
- { 0x001fc6, 0x0003b7,0x000342 },
- { 0x001fc7, 0x001fc6,0x000345 },
- { 0x001fc8, 0x000395,0x000300 },
- { 0x001fca, 0x000397,0x000300 },
- { 0x001fcc, 0x000397,0x000345 },
- { 0x001fcd, 0x001fbf,0x000300 },
- { 0x001fce, 0x001fbf,0x000301 },
- { 0x001fcf, 0x001fbf,0x000342 },
- { 0x001fd0, 0x0003b9,0x000306 },
- { 0x001fd1, 0x0003b9,0x000304 },
- { 0x001fd2, 0x0003ca,0x000300 },
- { 0x001fd6, 0x0003b9,0x000342 },
- { 0x001fd7, 0x0003ca,0x000342 },
- { 0x001fd8, 0x000399,0x000306 },
- { 0x001fd9, 0x000399,0x000304 },
- { 0x001fda, 0x000399,0x000300 },
- { 0x001fdd, 0x001ffe,0x000300 },
- { 0x001fde, 0x001ffe,0x000301 },
- { 0x001fdf, 0x001ffe,0x000342 },
- { 0x001fe0, 0x0003c5,0x000306 },
- { 0x001fe1, 0x0003c5,0x000304 },
- { 0x001fe2, 0x0003cb,0x000300 },
- { 0x001fe4, 0x0003c1,0x000313 },
- { 0x001fe5, 0x0003c1,0x000314 },
- { 0x001fe6, 0x0003c5,0x000342 },
- { 0x001fe7, 0x0003cb,0x000342 },
- { 0x001fe8, 0x0003a5,0x000306 },
- { 0x001fe9, 0x0003a5,0x000304 },
- { 0x001fea, 0x0003a5,0x000300 },
- { 0x001fec, 0x0003a1,0x000314 },
- { 0x001fed, 0x0000a8,0x000300 },
- { 0x001ff2, 0x001f7c,0x000345 },
- { 0x001ff3, 0x0003c9,0x000345 },
- { 0x001ff4, 0x0003ce,0x000345 },
- { 0x001ff6, 0x0003c9,0x000342 },
- { 0x001ff7, 0x001ff6,0x000345 },
- { 0x001ff8, 0x00039f,0x000300 },
- { 0x001ffa, 0x0003a9,0x000300 },
- { 0x001ffc, 0x0003a9,0x000345 },
- { 0x00219a, 0x002190,0x000338 },
- { 0x00219b, 0x002192,0x000338 },
- { 0x0021ae, 0x002194,0x000338 },
- { 0x0021cd, 0x0021d0,0x000338 },
- { 0x0021ce, 0x0021d4,0x000338 },
- { 0x0021cf, 0x0021d2,0x000338 },
- { 0x002204, 0x002203,0x000338 },
- { 0x002209, 0x002208,0x000338 },
- { 0x00220c, 0x00220b,0x000338 },
- { 0x002224, 0x002223,0x000338 },
- { 0x002226, 0x002225,0x000338 },
- { 0x002241, 0x00223c,0x000338 },
- { 0x002244, 0x002243,0x000338 },
- { 0x002247, 0x002245,0x000338 },
- { 0x002249, 0x002248,0x000338 },
- { 0x002260, 0x00003d,0x000338 },
- { 0x002262, 0x002261,0x000338 },
- { 0x00226d, 0x00224d,0x000338 },
- { 0x00226e, 0x00003c,0x000338 },
- { 0x00226f, 0x00003e,0x000338 },
- { 0x002270, 0x002264,0x000338 },
- { 0x002271, 0x002265,0x000338 },
- { 0x002274, 0x002272,0x000338 },
- { 0x002275, 0x002273,0x000338 },
- { 0x002278, 0x002276,0x000338 },
- { 0x002279, 0x002277,0x000338 },
- { 0x002280, 0x00227a,0x000338 },
- { 0x002281, 0x00227b,0x000338 },
- { 0x002284, 0x002282,0x000338 },
- { 0x002285, 0x002283,0x000338 },
- { 0x002288, 0x002286,0x000338 },
- { 0x002289, 0x002287,0x000338 },
- { 0x0022ac, 0x0022a2,0x000338 },
- { 0x0022ad, 0x0022a8,0x000338 },
- { 0x0022ae, 0x0022a9,0x000338 },
- { 0x0022af, 0x0022ab,0x000338 },
- { 0x0022e0, 0x00227c,0x000338 },
- { 0x0022e1, 0x00227d,0x000338 },
- { 0x0022e2, 0x002291,0x000338 },
- { 0x0022e3, 0x002292,0x000338 },
- { 0x0022ea, 0x0022b2,0x000338 },
- { 0x0022eb, 0x0022b3,0x000338 },
- { 0x0022ec, 0x0022b4,0x000338 },
- { 0x0022ed, 0x0022b5,0x000338 },
- { 0x002adc, 0x002add,0x000338 },
- { 0x00304c, 0x00304b,0x003099 },
- { 0x00304e, 0x00304d,0x003099 },
- { 0x003050, 0x00304f,0x003099 },
- { 0x003052, 0x003051,0x003099 },
- { 0x003054, 0x003053,0x003099 },
- { 0x003056, 0x003055,0x003099 },
- { 0x003058, 0x003057,0x003099 },
- { 0x00305a, 0x003059,0x003099 },
- { 0x00305c, 0x00305b,0x003099 },
- { 0x00305e, 0x00305d,0x003099 },
- { 0x003060, 0x00305f,0x003099 },
- { 0x003062, 0x003061,0x003099 },
- { 0x003065, 0x003064,0x003099 },
- { 0x003067, 0x003066,0x003099 },
- { 0x003069, 0x003068,0x003099 },
- { 0x003070, 0x00306f,0x003099 },
- { 0x003071, 0x00306f,0x00309a },
- { 0x003073, 0x003072,0x003099 },
- { 0x003074, 0x003072,0x00309a },
- { 0x003076, 0x003075,0x003099 },
- { 0x003077, 0x003075,0x00309a },
- { 0x003079, 0x003078,0x003099 },
- { 0x00307a, 0x003078,0x00309a },
- { 0x00307c, 0x00307b,0x003099 },
- { 0x00307d, 0x00307b,0x00309a },
- { 0x003094, 0x003046,0x003099 },
- { 0x00309e, 0x00309d,0x003099 },
- { 0x0030ac, 0x0030ab,0x003099 },
- { 0x0030ae, 0x0030ad,0x003099 },
- { 0x0030b0, 0x0030af,0x003099 },
- { 0x0030b2, 0x0030b1,0x003099 },
- { 0x0030b4, 0x0030b3,0x003099 },
- { 0x0030b6, 0x0030b5,0x003099 },
- { 0x0030b8, 0x0030b7,0x003099 },
- { 0x0030ba, 0x0030b9,0x003099 },
- { 0x0030bc, 0x0030bb,0x003099 },
- { 0x0030be, 0x0030bd,0x003099 },
- { 0x0030c0, 0x0030bf,0x003099 },
- { 0x0030c2, 0x0030c1,0x003099 },
- { 0x0030c5, 0x0030c4,0x003099 },
- { 0x0030c7, 0x0030c6,0x003099 },
- { 0x0030c9, 0x0030c8,0x003099 },
- { 0x0030d0, 0x0030cf,0x003099 },
- { 0x0030d1, 0x0030cf,0x00309a },
- { 0x0030d3, 0x0030d2,0x003099 },
- { 0x0030d4, 0x0030d2,0x00309a },
- { 0x0030d6, 0x0030d5,0x003099 },
- { 0x0030d7, 0x0030d5,0x00309a },
- { 0x0030d9, 0x0030d8,0x003099 },
- { 0x0030da, 0x0030d8,0x00309a },
- { 0x0030dc, 0x0030db,0x003099 },
- { 0x0030dd, 0x0030db,0x00309a },
- { 0x0030f4, 0x0030a6,0x003099 },
- { 0x0030f7, 0x0030ef,0x003099 },
- { 0x0030f8, 0x0030f0,0x003099 },
- { 0x0030f9, 0x0030f1,0x003099 },
- { 0x0030fa, 0x0030f2,0x003099 },
- { 0x0030fe, 0x0030fd,0x003099 },
- { 0x00fb1d, 0x0005d9,0x0005b4 },
- { 0x00fb1f, 0x0005f2,0x0005b7 },
- { 0x00fb2a, 0x0005e9,0x0005c1 },
- { 0x00fb2b, 0x0005e9,0x0005c2 },
- { 0x00fb2c, 0x00fb49,0x0005c1 },
- { 0x00fb2d, 0x00fb49,0x0005c2 },
- { 0x00fb2e, 0x0005d0,0x0005b7 },
- { 0x00fb2f, 0x0005d0,0x0005b8 },
- { 0x00fb30, 0x0005d0,0x0005bc },
- { 0x00fb31, 0x0005d1,0x0005bc },
- { 0x00fb32, 0x0005d2,0x0005bc },
- { 0x00fb33, 0x0005d3,0x0005bc },
- { 0x00fb34, 0x0005d4,0x0005bc },
- { 0x00fb35, 0x0005d5,0x0005bc },
- { 0x00fb36, 0x0005d6,0x0005bc },
- { 0x00fb38, 0x0005d8,0x0005bc },
- { 0x00fb39, 0x0005d9,0x0005bc },
- { 0x00fb3a, 0x0005da,0x0005bc },
- { 0x00fb3b, 0x0005db,0x0005bc },
- { 0x00fb3c, 0x0005dc,0x0005bc },
- { 0x00fb3e, 0x0005de,0x0005bc },
- { 0x00fb40, 0x0005e0,0x0005bc },
- { 0x00fb41, 0x0005e1,0x0005bc },
- { 0x00fb43, 0x0005e3,0x0005bc },
- { 0x00fb44, 0x0005e4,0x0005bc },
- { 0x00fb46, 0x0005e6,0x0005bc },
- { 0x00fb47, 0x0005e7,0x0005bc },
- { 0x00fb48, 0x0005e8,0x0005bc },
- { 0x00fb49, 0x0005e9,0x0005bc },
- { 0x00fb4a, 0x0005ea,0x0005bc },
- { 0x00fb4b, 0x0005d5,0x0005b9 },
- { 0x00fb4c, 0x0005d1,0x0005bf },
- { 0x00fb4d, 0x0005db,0x0005bf },
- { 0x00fb4e, 0x0005e4,0x0005bf },
- { 0x01d15e, 0x01d157,0x01d165 },
- { 0x01d15f, 0x01d158,0x01d165 },
- { 0x01d160, 0x01d15f,0x01d16e },
- { 0x01d161, 0x01d15f,0x01d16f },
- { 0x01d162, 0x01d15f,0x01d170 },
- { 0x01d163, 0x01d15f,0x01d171 },
- { 0x01d164, 0x01d15f,0x01d172 },
- { 0x01d1bb, 0x01d1b9,0x01d165 },
- { 0x01d1bc, 0x01d1ba,0x01d165 },
- { 0x01d1bd, 0x01d1bb,0x01d16e },
- { 0x01d1be, 0x01d1bc,0x01d16e },
- { 0x01d1bf, 0x01d1bb,0x01d16f },
- { 0x01d1c0, 0x01d1bc,0x01d16f },
- {0,0,0}
- };
- ///////////////////////////////////////////////////////////////////////////////
- const dcUnicodeTripel * DecomposeUnicode ( u32 code )
- {
- int beg = 0;
- int end = sizeof(TableUnicodeDecomp)/sizeof(*TableUnicodeDecomp) - 2;
- while ( beg <= end )
- {
- const int pos = (beg+end)/2;
- const dcUnicodeTripel * ptr = TableUnicodeDecomp+pos;
- if ( code < ptr->code1 )
- end = pos-1;
- else if ( code > ptr->code1 )
- beg = pos+1;
- else
- {
- noTRACE("DecomposeUnicode(%lx) -> %lx,%lx\n",code,ptr->code2,ptr->code3);
- return ptr;
- }
- }
- noTRACE("DecomposeUnicode(%lx) -> NONE\n",code);
- return 0;
- }
- //
- ///////////////////////////////////////////////////////////////////////////////
- /////////////// END ///////////////
- ///////////////////////////////////////////////////////////////////////////////
|