From 31626f30dc54d636d17cc68560d5118ab23a6078 Mon Sep 17 00:00:00 2001 From: simon Date: Wed, 8 Dec 2004 19:07:05 +0000 Subject: [PATCH] Further clarity and speed cleanups of minibidi: - rewrote the reversal loop in flipThisRun to be considerably clearer - rewrote leastGreaterOdd and leastGreaterEven as bit-twiddling macros - replaced malloc/free with snewn/sfree - lost some gratuitous repeat calls of getType on the same character And most noticeably: - got rid of minibidi.h, since it was entirely full of minibidi.c internals (including constant data definitions!) and wasn't used to provide an external interface at all. Everything in it has been folded into minibidi.c. git-svn-id: svn://svn.tartarus.org/sgt/putty@4963 cda61777-01e9-0310-a592-d414129be87e --- minibidi.c | 415 +++++++++++++++++++++++++++++++++++++++++++++++++++++++------ minibidi.h | 394 --------------------------------------------------------- 2 files changed, 378 insertions(+), 431 deletions(-) delete mode 100644 minibidi.h diff --git a/minibidi.c b/minibidi.c index 54703d6d..26a8419a 100644 --- a/minibidi.c +++ b/minibidi.c @@ -29,9 +29,371 @@ * - Ligatures */ -#include "minibidi.h" +#include /* definition of wchar_t*/ -#define lenof(x) ( sizeof((x)) / sizeof(*(x)) ) +#include "misc.h" + +#define LMASK 0x3F /* Embedding Level mask */ +#define OMASK 0xC0 /* Override mask */ +#define OISL 0x80 /* Override is L */ +#define OISR 0x40 /* Override is R */ + +/* Shaping Helpers */ +#define STYPE(xh) ((((xh) >= SHAPE_FIRST) && ((xh) <= SHAPE_LAST)) ? \ +shapetypes[(xh)-SHAPE_FIRST].type : SU) /*))*/ +#define SISOLATED(xh) (shapetypes[(xh)-SHAPE_FIRST].form_b) +#define SFINAL(xh) ((xh)+1) +#define SINITIAL(xh) ((xh)+2) +#define SMEDIAL(ch) ((ch)+3) + +#define leastGreaterOdd(x) ( ((x)+1) | 1 ) +#define leastGreaterEven(x) ( ((x)+2) &~ 1 ) + +typedef struct bidi_char { + wchar_t origwc, wc; + unsigned short index; +} bidi_char; + +/* function declarations */ +void flipThisRun(bidi_char *from, unsigned char* level, int max, int count); +int findIndexOfRun(unsigned char* level , int start, int count, int tlevel); +unsigned char getType(wchar_t ch); +unsigned char setOverrideBits(unsigned char level, unsigned char override); +int getPreviousLevel(unsigned char* level, int from); +unsigned char getRLE(wchar_t ch); +int do_shape(bidi_char *line, bidi_char *to, int count); +int do_bidi(bidi_char *line, int count); +void doMirror(wchar_t* ch); + +/* character types */ +enum { + L, + LRE, + LRO, + R, + AL, + RLE, + RLO, + PDF, + EN, + ES, + ET, + AN, + CS, + NSM, + BN, + B, + S, + WS, + ON, +}; + +/* Shaping Types */ +enum { + SL, /* Left-Joining, doesnt exist in U+0600 - U+06FF */ + SR, /* Right-Joining, ie has Isolated, Final */ + SD, /* Dual-Joining, ie has Isolated, Final, Initial, Medial */ + SU, /* Non-Joining */ + SC /* Join-Causing, like U+0640 (TATWEEL) */ +}; + +typedef struct { + char type; + wchar_t form_b; +} shape_node; + +/* Kept near the actual table, for verification. */ +#define SHAPE_FIRST 0x621 +#define SHAPE_LAST 0x64A + +const shape_node shapetypes[] = { + /* index, Typ, Iso, Ligature Index*/ + /* 621 */ {SU, 0xFE80}, + /* 622 */ {SR, 0xFE81}, + /* 623 */ {SR, 0xFE83}, + /* 624 */ {SR, 0xFE85}, + /* 625 */ {SR, 0xFE87}, + /* 626 */ {SD, 0xFE89}, + /* 627 */ {SR, 0xFE8D}, + /* 628 */ {SD, 0xFE8F}, + /* 629 */ {SR, 0xFE93}, + /* 62A */ {SD, 0xFE95}, + /* 62B */ {SD, 0xFE99}, + /* 62C */ {SD, 0xFE9D}, + /* 62D */ {SD, 0xFEA1}, + /* 62E */ {SD, 0xFEA5}, + /* 62F */ {SR, 0xFEA9}, + /* 630 */ {SR, 0xFEAB}, + /* 631 */ {SR, 0xFEAD}, + /* 632 */ {SR, 0xFEAF}, + /* 633 */ {SD, 0xFEB1}, + /* 634 */ {SD, 0xFEB5}, + /* 635 */ {SD, 0xFEB9}, + /* 636 */ {SD, 0xFEBD}, + /* 637 */ {SD, 0xFEC1}, + /* 638 */ {SD, 0xFEC5}, + /* 639 */ {SD, 0xFEC9}, + /* 63A */ {SD, 0xFECD}, + /* 63B */ {SU, 0x0}, + /* 63C */ {SU, 0x0}, + /* 63D */ {SU, 0x0}, + /* 63E */ {SU, 0x0}, + /* 63F */ {SU, 0x0}, + /* 640 */ {SC, 0x0}, + /* 641 */ {SD, 0xFED1}, + /* 642 */ {SD, 0xFED5}, + /* 643 */ {SD, 0xFED9}, + /* 644 */ {SD, 0xFEDD}, + /* 645 */ {SD, 0xFEE1}, + /* 646 */ {SD, 0xFEE5}, + /* 647 */ {SD, 0xFEE9}, + /* 648 */ {SR, 0xFEED}, + /* 649 */ {SR, 0xFEEF}, /* SD */ + /* 64A */ {SD, 0xFEF1}, +}; + +/* + * This describes the data byte and its frequency + */ +typedef struct { + unsigned char d; + unsigned char f; +} RLENode; + + +/* This is an array of RLENodes, which is the + * Compressed unicode types table + */ +const RLENode RLE_table[] = { + { BN, 9}, { S, 1}, { B, 1}, { S, 1}, { WS, 1}, + { B, 1}, { BN, 14}, { B, 3}, { S, 1}, { WS, 1}, + { ON, 2}, { ET, 3}, { ON, 5}, { ET, 1}, { CS, 1}, + { ET, 1}, { CS, 1}, { ES, 1}, { EN, 10}, { CS, 1}, + { ON, 6}, { L, 26}, { ON, 6}, { L, 26}, { ON, 4}, + { BN, 6}, { B, 1}, { BN, 26}, { CS, 1}, { ON, 1}, + { ET, 4}, { ON, 4}, { L, 1}, { ON, 5}, { ET, 2}, + { EN, 2}, { ON, 1}, { L, 1}, { ON, 3}, { EN, 1}, + { L, 1}, { ON, 5}, { L, 23}, { ON, 1}, { L, 31}, + { ON, 1}, { L, 255}, { L, 42}, { ON, 1}, { L, 18}, + { ON, 28}, { L, 94}, { ON, 2}, { L, 9}, { ON, 2}, + { L, 7}, { ON, 14}, { L, 2}, { ON, 14}, { L, 5}, + { ON, 9}, { L, 1}, { ON, 17}, {NSM, 80}, { ON, 16}, + {NSM, 16}, { ON, 10}, { L, 1}, { ON, 11}, { L, 1}, + { ON, 1}, { L, 3}, { ON, 1}, { L, 1}, { ON, 1}, + { L, 20}, { ON, 1}, { L, 44}, { ON, 1}, { L, 38}, + { ON, 10}, { L, 131}, {NSM, 4}, { ON, 1}, {NSM, 2}, + { L, 69}, { ON, 1}, { L, 38}, { ON, 2}, { L, 2}, + { ON, 6}, { L, 16}, { ON, 33}, { L, 38}, { ON, 2}, + { L, 7}, { ON, 1}, { L, 39}, { ON, 1}, { L, 1}, + { ON, 7}, {NSM, 17}, { ON, 1}, {NSM, 23}, { ON, 1}, + {NSM, 3}, { R, 1}, {NSM, 1}, { R, 1}, {NSM, 2}, + { R, 1}, {NSM, 1}, { ON, 11}, { R, 27}, { ON, 5}, + { R, 5}, { ON, 23}, { CS, 1}, { ON, 14}, { AL, 1}, + { ON, 3}, { AL, 1}, { ON, 1}, { AL, 26}, { ON, 5}, + { AL, 11}, {NSM, 11}, { ON, 10}, { AN, 10}, { ET, 1}, + { AN, 2}, { AL, 3}, {NSM, 1}, { AL, 101}, {NSM, 7}, + { AL, 1}, {NSM, 7}, { AL, 2}, {NSM, 2}, { ON, 1}, + {NSM, 4}, { ON, 2}, { EN, 10}, { AL, 5}, { ON, 1}, + { AL, 14}, { ON, 1}, { BN, 1}, { AL, 1}, {NSM, 1}, + { AL, 27}, { ON, 3}, {NSM, 27}, { ON, 53}, { AL, 38}, + {NSM, 11}, { AL, 1}, { ON, 255}, { ON, 80}, {NSM, 2}, + { L, 1}, { ON, 1}, { L, 53}, { ON, 2}, {NSM, 1}, + { L, 4}, {NSM, 8}, { L, 4}, {NSM, 1}, { ON, 2}, + { L, 1}, {NSM, 4}, { ON, 3}, { L, 10}, {NSM, 2}, + { L, 13}, { ON, 16}, {NSM, 1}, { L, 2}, { ON, 1}, + { L, 8}, { ON, 2}, { L, 2}, { ON, 2}, { L, 22}, + { ON, 1}, { L, 7}, { ON, 1}, { L, 1}, { ON, 3}, + { L, 4}, { ON, 2}, {NSM, 1}, { ON, 1}, { L, 3}, + {NSM, 4}, { ON, 2}, { L, 2}, { ON, 2}, { L, 2}, + {NSM, 1}, { ON, 9}, { L, 1}, { ON, 4}, { L, 2}, + { ON, 1}, { L, 3}, {NSM, 2}, { ON, 2}, { L, 12}, + { ET, 2}, { L, 7}, { ON, 7}, {NSM, 1}, { ON, 2}, + { L, 6}, { ON, 4}, { L, 2}, { ON, 2}, { L, 22}, + { ON, 1}, { L, 7}, { ON, 1}, { L, 2}, { ON, 1}, + { L, 2}, { ON, 1}, { L, 2}, { ON, 2}, {NSM, 1}, + { ON, 1}, { L, 3}, {NSM, 2}, { ON, 4}, {NSM, 2}, + { ON, 2}, {NSM, 3}, { ON, 11}, { L, 4}, { ON, 1}, + { L, 1}, { ON, 7}, { L, 10}, {NSM, 2}, { L, 3}, + { ON, 12}, {NSM, 2}, { L, 1}, { ON, 1}, { L, 7}, + { ON, 1}, { L, 1}, { ON, 1}, { L, 3}, { ON, 1}, + { L, 22}, { ON, 1}, { L, 7}, { ON, 1}, { L, 2}, + { ON, 1}, { L, 5}, { ON, 2}, {NSM, 1}, { L, 4}, + {NSM, 5}, { ON, 1}, {NSM, 2}, { L, 1}, { ON, 1}, + { L, 2}, {NSM, 1}, { ON, 2}, { L, 1}, { ON, 15}, + { L, 1}, { ON, 5}, { L, 10}, { ON, 17}, {NSM, 1}, + { L, 2}, { ON, 1}, { L, 8}, { ON, 2}, { L, 2}, + { ON, 2}, { L, 22}, { ON, 1}, { L, 7}, { ON, 1}, + { L, 2}, { ON, 2}, { L, 4}, { ON, 2}, {NSM, 1}, + { L, 2}, {NSM, 1}, { L, 1}, {NSM, 3}, { ON, 3}, + { L, 2}, { ON, 2}, { L, 2}, {NSM, 1}, { ON, 8}, + {NSM, 1}, { L, 1}, { ON, 4}, { L, 2}, { ON, 1}, + { L, 3}, { ON, 4}, { L, 11}, { ON, 17}, {NSM, 1}, + { L, 1}, { ON, 1}, { L, 6}, { ON, 3}, { L, 3}, + { ON, 1}, { L, 4}, { ON, 3}, { L, 2}, { ON, 1}, + { L, 1}, { ON, 1}, { L, 2}, { ON, 3}, { L, 2}, + { ON, 3}, { L, 3}, { ON, 3}, { L, 8}, { ON, 1}, + { L, 3}, { ON, 4}, { L, 2}, {NSM, 1}, { L, 2}, + { ON, 3}, { L, 3}, { ON, 1}, { L, 3}, {NSM, 1}, + { ON, 9}, { L, 1}, { ON, 15}, { L, 12}, { ON, 14}, + { L, 3}, { ON, 1}, { L, 8}, { ON, 1}, { L, 3}, + { ON, 1}, { L, 23}, { ON, 1}, { L, 10}, { ON, 1}, + { L, 5}, { ON, 4}, {NSM, 3}, { L, 4}, { ON, 1}, + {NSM, 3}, { ON, 1}, {NSM, 4}, { ON, 7}, {NSM, 2}, + { ON, 9}, { L, 2}, { ON, 4}, { L, 10}, { ON, 18}, + { L, 2}, { ON, 1}, { L, 8}, { ON, 1}, { L, 3}, + { ON, 1}, { L, 23}, { ON, 1}, { L, 10}, { ON, 1}, + { L, 5}, { ON, 4}, { L, 1}, {NSM, 1}, { L, 5}, + { ON, 1}, {NSM, 1}, { L, 2}, { ON, 1}, { L, 2}, + {NSM, 2}, { ON, 7}, { L, 2}, { ON, 7}, { L, 1}, + { ON, 1}, { L, 2}, { ON, 4}, { L, 10}, { ON, 18}, + { L, 2}, { ON, 1}, { L, 8}, { ON, 1}, { L, 3}, + { ON, 1}, { L, 23}, { ON, 1}, { L, 16}, { ON, 4}, + { L, 3}, {NSM, 3}, { ON, 2}, { L, 3}, { ON, 1}, + { L, 3}, {NSM, 1}, { ON, 9}, { L, 1}, { ON, 8}, + { L, 2}, { ON, 4}, { L, 10}, { ON, 18}, { L, 2}, + { ON, 1}, { L, 18}, { ON, 3}, { L, 24}, { ON, 1}, + { L, 9}, { ON, 1}, { L, 1}, { ON, 2}, { L, 7}, + { ON, 3}, {NSM, 1}, { ON, 4}, { L, 3}, {NSM, 3}, + { ON, 1}, {NSM, 1}, { ON, 1}, { L, 8}, { ON, 18}, + { L, 3}, { ON, 12}, { L, 48}, {NSM, 1}, { L, 2}, + {NSM, 7}, { ON, 4}, { ET, 1}, { L, 7}, {NSM, 8}, + { L, 13}, { ON, 37}, { L, 2}, { ON, 1}, { L, 1}, + { ON, 2}, { L, 2}, { ON, 1}, { L, 1}, { ON, 2}, + { L, 1}, { ON, 6}, { L, 4}, { ON, 1}, { L, 7}, + { ON, 1}, { L, 3}, { ON, 1}, { L, 1}, { ON, 1}, + { L, 1}, { ON, 2}, { L, 2}, { ON, 1}, { L, 4}, + {NSM, 1}, { L, 2}, {NSM, 6}, { ON, 1}, {NSM, 2}, + { L, 1}, { ON, 2}, { L, 5}, { ON, 1}, { L, 1}, + { ON, 1}, {NSM, 6}, { ON, 2}, { L, 10}, { ON, 2}, + { L, 2}, { ON, 34}, { L, 24}, {NSM, 2}, { L, 27}, + {NSM, 1}, { L, 1}, {NSM, 1}, { L, 1}, {NSM, 1}, + { ON, 4}, { L, 10}, { ON, 1}, { L, 34}, { ON, 6}, + {NSM, 14}, { L, 1}, {NSM, 5}, { L, 1}, {NSM, 2}, + { L, 4}, { ON, 4}, {NSM, 8}, { ON, 1}, {NSM, 36}, + { ON, 1}, { L, 8}, {NSM, 1}, { L, 6}, { ON, 2}, + { L, 1}, { ON, 48}, { L, 34}, { ON, 1}, { L, 5}, + { ON, 1}, { L, 2}, { ON, 1}, { L, 1}, {NSM, 4}, + { L, 1}, {NSM, 1}, { ON, 3}, {NSM, 2}, { L, 1}, + {NSM, 1}, { ON, 6}, { L, 24}, {NSM, 2}, { ON, 70}, + { L, 38}, { ON, 10}, { L, 41}, { ON, 2}, { L, 1}, + { ON, 4}, { L, 90}, { ON, 5}, { L, 68}, { ON, 5}, + { L, 82}, { ON, 6}, { L, 7}, { ON, 1}, { L, 63}, + { ON, 1}, { L, 1}, { ON, 1}, { L, 4}, { ON, 2}, + { L, 7}, { ON, 1}, { L, 1}, { ON, 1}, { L, 4}, + { ON, 2}, { L, 39}, { ON, 1}, { L, 1}, { ON, 1}, + { L, 4}, { ON, 2}, { L, 31}, { ON, 1}, { L, 1}, + { ON, 1}, { L, 4}, { ON, 2}, { L, 7}, { ON, 1}, + { L, 1}, { ON, 1}, { L, 4}, { ON, 2}, { L, 7}, + { ON, 1}, { L, 7}, { ON, 1}, { L, 23}, { ON, 1}, + { L, 31}, { ON, 1}, { L, 1}, { ON, 1}, { L, 4}, + { ON, 2}, { L, 7}, { ON, 1}, { L, 39}, { ON, 1}, + { L, 19}, { ON, 6}, { L, 28}, { ON, 35}, { L, 85}, + { ON, 12}, { L, 255}, { L, 255}, { L, 120}, { ON, 9}, + { WS, 1}, { L, 26}, { ON, 5}, { L, 81}, { ON, 15}, + { L, 13}, { ON, 1}, { L, 4}, {NSM, 3}, { ON, 11}, + { L, 18}, {NSM, 3}, { L, 2}, { ON, 9}, { L, 18}, + {NSM, 2}, { ON, 12}, { L, 13}, { ON, 1}, { L, 3}, + { ON, 1}, {NSM, 2}, { ON, 12}, { L, 55}, {NSM, 7}, + { L, 8}, {NSM, 1}, { L, 2}, {NSM, 11}, { L, 7}, + { ET, 1}, { L, 1}, { ON, 3}, { L, 10}, { ON, 33}, + {NSM, 3}, { BN, 1}, { ON, 1}, { L, 10}, { ON, 6}, + { L, 88}, { ON, 8}, { L, 41}, {NSM, 1}, { ON, 255}, + { ON, 255}, { ON, 255}, { ON, 255}, { ON, 255}, { ON, 91}, + { L, 156}, { ON, 4}, { L, 90}, { ON, 6}, { L, 22}, + { ON, 2}, { L, 6}, { ON, 2}, { L, 38}, { ON, 2}, + { L, 6}, { ON, 2}, { L, 8}, { ON, 1}, { L, 1}, + { ON, 1}, { L, 1}, { ON, 1}, { L, 1}, { ON, 1}, + { L, 31}, { ON, 2}, { L, 53}, { ON, 1}, { L, 7}, + { ON, 1}, { L, 1}, { ON, 3}, { L, 3}, { ON, 1}, + { L, 7}, { ON, 3}, { L, 4}, { ON, 2}, { L, 6}, + { ON, 4}, { L, 13}, { ON, 5}, { L, 3}, { ON, 1}, + { L, 7}, { ON, 3}, { WS, 11}, { BN, 3}, { L, 1}, + { R, 1}, { ON, 24}, { WS, 1}, { B, 1}, {LRE, 1}, + {RLE, 1}, {PDF, 1}, {LRO, 1}, {RLO, 1}, { WS, 1}, + { ET, 5}, { ON, 42}, { WS, 1}, { BN, 4}, { ON, 6}, + { BN, 6}, { EN, 1}, { L, 1}, { ON, 2}, { EN, 6}, + { ET, 2}, { ON, 3}, { L, 1}, { EN, 10}, { ET, 2}, + { ON, 20}, { ET, 18}, { ON, 30}, {NSM, 27}, { ON, 23}, + { L, 1}, { ON, 4}, { L, 1}, { ON, 2}, { L, 10}, + { ON, 1}, { L, 1}, { ON, 3}, { L, 5}, { ON, 6}, + { L, 1}, { ON, 1}, { L, 1}, { ON, 1}, { L, 1}, + { ON, 1}, { L, 4}, { ET, 1}, { L, 3}, { ON, 1}, + { L, 7}, { ON, 3}, { L, 3}, { ON, 5}, { L, 5}, + { ON, 22}, { L, 36}, { ON, 142}, { ET, 2}, { ON, 255}, + { ON, 35}, { L, 69}, { ON, 26}, { L, 1}, { ON, 202}, + { EN, 60}, { L, 78}, { EN, 1}, { ON, 255}, { ON, 255}, + { ON, 255}, { ON, 255}, { ON, 255}, { ON, 255}, { ON, 255}, + { ON, 255}, { ON, 255}, { ON, 255}, { ON, 255}, { ON, 32}, + { WS, 1}, { ON, 4}, { L, 3}, { ON, 25}, { L, 9}, + {NSM, 6}, { ON, 1}, { L, 5}, { ON, 2}, { L, 5}, + { ON, 4}, { L, 86}, { ON, 2}, {NSM, 2}, { ON, 2}, + { L, 3}, { ON, 1}, { L, 90}, { ON, 1}, { L, 4}, + { ON, 5}, { L, 40}, { ON, 4}, { L, 94}, { ON, 1}, + { L, 40}, { ON, 56}, { L, 45}, { ON, 3}, { L, 36}, + { ON, 28}, { L, 28}, { ON, 3}, { L, 50}, { ON, 15}, + { L, 12}, { ON, 4}, { L, 47}, { ON, 1}, { L, 119}, + { ON, 4}, { L, 99}, { ON, 2}, { L, 31}, { ON, 1}, + { L, 1}, { ON, 255}, { ON, 255}, { ON, 255}, { ON, 255}, + { ON, 255}, { ON, 255}, { ON, 255}, { ON, 255}, { ON, 255}, + { ON, 255}, { ON, 255}, { ON, 255}, { ON, 255}, { ON, 255}, + { ON, 255}, { ON, 255}, { ON, 255}, { ON, 255}, { ON, 255}, + { ON, 255}, { ON, 255}, { ON, 255}, { ON, 255}, { ON, 255}, + { ON, 255}, { ON, 205}, { L, 1}, { ON, 74}, { L, 1}, + { ON, 255}, { ON, 255}, { ON, 255}, { ON, 255}, { ON, 255}, + { ON, 255}, { ON, 255}, { ON, 255}, { ON, 255}, { ON, 255}, + { ON, 255}, { ON, 255}, { ON, 255}, { ON, 255}, { ON, 255}, + { ON, 255}, { ON, 255}, { ON, 255}, { ON, 255}, { ON, 255}, + { ON, 255}, { ON, 255}, { ON, 255}, { ON, 255}, { ON, 255}, + { ON, 255}, { ON, 255}, { ON, 255}, { ON, 255}, { ON, 255}, + { ON, 255}, { ON, 255}, { ON, 255}, { ON, 255}, { ON, 255}, + { ON, 255}, { ON, 255}, { ON, 255}, { ON, 255}, { ON, 255}, + { ON, 255}, { ON, 255}, { ON, 255}, { ON, 255}, { ON, 255}, + { ON, 255}, { ON, 255}, { ON, 255}, { ON, 255}, { ON, 255}, + { ON, 255}, { ON, 255}, { ON, 255}, { ON, 255}, { ON, 255}, + { ON, 255}, { ON, 255}, { ON, 255}, { ON, 255}, { ON, 255}, + { ON, 255}, { ON, 255}, { ON, 255}, { ON, 255}, { ON, 255}, + { ON, 255}, { ON, 255}, { ON, 255}, { ON, 255}, { ON, 255}, + { ON, 255}, { ON, 255}, { ON, 255}, { ON, 255}, { ON, 255}, + { ON, 255}, { ON, 255}, { ON, 255}, { ON, 255}, { ON, 255}, + { ON, 255}, { ON, 245}, { L, 1}, { ON, 90}, { L, 255}, + { L, 255}, { L, 255}, { L, 255}, { L, 145}, { ON, 255}, + { ON, 255}, { ON, 255}, { ON, 255}, { ON, 255}, { ON, 255}, + { ON, 255}, { ON, 122}, { L, 1}, { ON, 255}, { ON, 255}, + { ON, 255}, { ON, 255}, { ON, 255}, { ON, 255}, { ON, 255}, + { ON, 255}, { ON, 255}, { ON, 255}, { ON, 255}, { ON, 255}, + { ON, 255}, { ON, 255}, { ON, 255}, { ON, 255}, { ON, 255}, + { ON, 255}, { ON, 255}, { ON, 255}, { ON, 255}, { ON, 255}, + { ON, 255}, { ON, 255}, { ON, 255}, { ON, 255}, { ON, 255}, + { ON, 255}, { ON, 255}, { ON, 255}, { ON, 255}, { ON, 255}, + { ON, 255}, { ON, 255}, { ON, 255}, { ON, 255}, { ON, 255}, + { ON, 255}, { ON, 255}, { ON, 255}, { ON, 255}, { ON, 255}, + { ON, 255}, { ON, 205}, { L, 1}, { ON, 92}, { L, 1}, + { ON, 255}, { ON, 255}, { ON, 255}, { ON, 129}, { L, 2}, + { ON, 126}, { L, 2}, { ON, 255}, { ON, 255}, { ON, 255}, + { ON, 255}, { ON, 2}, { L, 2}, { ON, 255}, { ON, 255}, + { ON, 255}, { ON, 255}, { ON, 255}, { ON, 255}, { ON, 255}, + { ON, 255}, { ON, 255}, { ON, 255}, { ON, 255}, { ON, 255}, + { ON, 255}, { ON, 255}, { ON, 255}, { ON, 255}, { ON, 255}, + { ON, 255}, { ON, 255}, { ON, 255}, { ON, 255}, { ON, 255}, + { ON, 255}, { ON, 255}, { ON, 255}, { ON, 23}, { L, 255}, + { L, 48}, { ON, 2}, { L, 59}, { ON, 149}, { L, 7}, + { ON, 12}, { L, 5}, { ON, 5}, { R, 1}, {NSM, 1}, + { R, 10}, { ET, 1}, { R, 13}, { ON, 1}, { R, 5}, + { ON, 1}, { R, 1}, { ON, 1}, { R, 2}, { ON, 1}, + { R, 2}, { ON, 1}, { R, 10}, { AL, 98}, { ON, 33}, + { AL, 255}, { AL, 108}, { ON, 18}, { AL, 64}, { ON, 2}, + { AL, 54}, { ON, 40}, { AL, 13}, { ON, 3}, {NSM, 16}, + { ON, 16}, {NSM, 4}, { ON, 44}, { CS, 1}, { ON, 1}, + { CS, 1}, { ON, 2}, { CS, 1}, { ON, 9}, { ET, 1}, + { ON, 2}, { ET, 2}, { ON, 5}, { ET, 2}, { ON, 5}, + { AL, 5}, { ON, 1}, { AL, 135}, { ON, 2}, { BN, 1}, + { ON, 3}, { ET, 3}, { ON, 5}, { ET, 1}, { CS, 1}, + { ET, 1}, { CS, 1}, { ES, 1}, { EN, 10}, { CS, 1}, + { ON, 6}, { L, 26}, { ON, 6}, { L, 26}, { ON, 11}, + { L, 89}, { ON, 3}, { L, 6}, { ON, 2}, { L, 6}, + { ON, 2}, { L, 6}, { ON, 2}, { L, 3}, { ON, 3}, + { ET, 2}, { ON, 3}, { ET, 2}, { ON, 9}, { L, 14}, +}; /* * Flips the text buffer, according to max level, and @@ -45,7 +407,7 @@ */ void flipThisRun(bidi_char *from, unsigned char *level, int max, int count) { - int i, j, rcount, tlevel; + int i, j, k, tlevel; bidi_char temp; j = i = 0; @@ -58,11 +420,10 @@ void flipThisRun(bidi_char *from, unsigned char *level, int max, int count) while (i((i-j)/2); rcount--) { - temp = from[j+rcount-1]; - from[j+rcount-1] = from[i-rcount]; - from[i-rcount] = temp; + for (k = i - 1; k > j; k--, j++) { + temp = from[k]; + from[k] = from[j]; + from[j] = temp; } } } @@ -129,28 +490,6 @@ int getPreviousLevel(unsigned char* level, int from) } /* - * Returns the first odd value greater than x - */ -unsigned char leastGreaterOdd(unsigned char x) -{ - if ((x % 2) == 0) - return x+1; - else - return x+2; -} - -/* - * Returns the first even value greater than x - */ -unsigned char leastGreaterEven(unsigned char x) -{ - if ((x % 2) == 0) - return x+2; - else - return x+1; -} - -/* * Loops over the RLE_table array looking for the * type of ch */ @@ -282,7 +621,8 @@ int do_bidi(bidi_char *line, int count) /* Check the presence of R or AL types as optimization */ yes = 0; for (i=0; i /* definition of wchar_t*/ - -#define LMASK 0x3F /* Embedding Level mask */ -#define OMASK 0xC0 /* Override mask */ -#define OISL 0x80 /* Override is L */ -#define OISR 0x40 /* Override is R */ - -/* Shaping Helpers */ -#define STYPE(xh) ((((xh) >= SHAPE_FIRST) && ((xh) <= SHAPE_LAST)) ? \ -shapetypes[(xh)-SHAPE_FIRST].type : SU) /*))*/ -#define SISOLATED(xh) (shapetypes[(xh)-SHAPE_FIRST].form_b) -#define SFINAL(xh) ((xh)+1) -#define SINITIAL(xh) ((xh)+2) -#define SMEDIAL(ch) ((ch)+3) - -typedef struct bidi_char { - wchar_t origwc, wc; - unsigned short index; -} bidi_char; - -/* function declarations */ -void flipThisRun(bidi_char *from, unsigned char* level, int max, int count); -int findIndexOfRun(unsigned char* level , int start, int count, int tlevel); -unsigned char getType(wchar_t ch); -unsigned char setOverrideBits(unsigned char level, unsigned char override); -int getPreviousLevel(unsigned char* level, int from); -unsigned char leastGreaterOdd(unsigned char x); -unsigned char leastGreaterEven(unsigned char x); -unsigned char getRLE(wchar_t ch); -int do_shape(bidi_char *line, bidi_char *to, int count); -int do_bidi(bidi_char *line, int count); -void doMirror(wchar_t* ch); - -/* character types */ -enum { - L, - LRE, - LRO, - R, - AL, - RLE, - RLO, - PDF, - EN, - ES, - ET, - AN, - CS, - NSM, - BN, - B, - S, - WS, - ON, -}; - -/* Shaping Types */ -enum { - SL, /* Left-Joining, doesnt exist in U+0600 - U+06FF */ - SR, /* Right-Joining, ie has Isolated, Final */ - SD, /* Dual-Joining, ie has Isolated, Final, Initial, Medial */ - SU, /* Non-Joining */ - SC /* Join-Causing, like U+0640 (TATWEEL) */ -}; - -typedef struct { - char type; - wchar_t form_b; -} shape_node; - -/* Kept near the actual table, for verification. */ -#define SHAPE_FIRST 0x621 -#define SHAPE_LAST 0x64A - -const shape_node shapetypes[] = { - /* index, Typ, Iso, Ligature Index*/ - /* 621 */ {SU, 0xFE80}, - /* 622 */ {SR, 0xFE81}, - /* 623 */ {SR, 0xFE83}, - /* 624 */ {SR, 0xFE85}, - /* 625 */ {SR, 0xFE87}, - /* 626 */ {SD, 0xFE89}, - /* 627 */ {SR, 0xFE8D}, - /* 628 */ {SD, 0xFE8F}, - /* 629 */ {SR, 0xFE93}, - /* 62A */ {SD, 0xFE95}, - /* 62B */ {SD, 0xFE99}, - /* 62C */ {SD, 0xFE9D}, - /* 62D */ {SD, 0xFEA1}, - /* 62E */ {SD, 0xFEA5}, - /* 62F */ {SR, 0xFEA9}, - /* 630 */ {SR, 0xFEAB}, - /* 631 */ {SR, 0xFEAD}, - /* 632 */ {SR, 0xFEAF}, - /* 633 */ {SD, 0xFEB1}, - /* 634 */ {SD, 0xFEB5}, - /* 635 */ {SD, 0xFEB9}, - /* 636 */ {SD, 0xFEBD}, - /* 637 */ {SD, 0xFEC1}, - /* 638 */ {SD, 0xFEC5}, - /* 639 */ {SD, 0xFEC9}, - /* 63A */ {SD, 0xFECD}, - /* 63B */ {SU, 0x0}, - /* 63C */ {SU, 0x0}, - /* 63D */ {SU, 0x0}, - /* 63E */ {SU, 0x0}, - /* 63F */ {SU, 0x0}, - /* 640 */ {SC, 0x0}, - /* 641 */ {SD, 0xFED1}, - /* 642 */ {SD, 0xFED5}, - /* 643 */ {SD, 0xFED9}, - /* 644 */ {SD, 0xFEDD}, - /* 645 */ {SD, 0xFEE1}, - /* 646 */ {SD, 0xFEE5}, - /* 647 */ {SD, 0xFEE9}, - /* 648 */ {SR, 0xFEED}, - /* 649 */ {SR, 0xFEEF}, /* SD */ - /* 64A */ {SD, 0xFEF1}, -}; - -/* - * This describes the data byte and its frequency - */ -typedef struct { - unsigned char d; - unsigned char f; -} RLENode; - - -/* This is an array of RLENodes, which is the - * Compressed unicode types table - */ -const RLENode RLE_table[] = { - { BN, 9}, { S, 1}, { B, 1}, { S, 1}, { WS, 1}, - { B, 1}, { BN, 14}, { B, 3}, { S, 1}, { WS, 1}, - { ON, 2}, { ET, 3}, { ON, 5}, { ET, 1}, { CS, 1}, - { ET, 1}, { CS, 1}, { ES, 1}, { EN, 10}, { CS, 1}, - { ON, 6}, { L, 26}, { ON, 6}, { L, 26}, { ON, 4}, - { BN, 6}, { B, 1}, { BN, 26}, { CS, 1}, { ON, 1}, - { ET, 4}, { ON, 4}, { L, 1}, { ON, 5}, { ET, 2}, - { EN, 2}, { ON, 1}, { L, 1}, { ON, 3}, { EN, 1}, - { L, 1}, { ON, 5}, { L, 23}, { ON, 1}, { L, 31}, - { ON, 1}, { L, 255}, { L, 42}, { ON, 1}, { L, 18}, - { ON, 28}, { L, 94}, { ON, 2}, { L, 9}, { ON, 2}, - { L, 7}, { ON, 14}, { L, 2}, { ON, 14}, { L, 5}, - { ON, 9}, { L, 1}, { ON, 17}, {NSM, 80}, { ON, 16}, - {NSM, 16}, { ON, 10}, { L, 1}, { ON, 11}, { L, 1}, - { ON, 1}, { L, 3}, { ON, 1}, { L, 1}, { ON, 1}, - { L, 20}, { ON, 1}, { L, 44}, { ON, 1}, { L, 38}, - { ON, 10}, { L, 131}, {NSM, 4}, { ON, 1}, {NSM, 2}, - { L, 69}, { ON, 1}, { L, 38}, { ON, 2}, { L, 2}, - { ON, 6}, { L, 16}, { ON, 33}, { L, 38}, { ON, 2}, - { L, 7}, { ON, 1}, { L, 39}, { ON, 1}, { L, 1}, - { ON, 7}, {NSM, 17}, { ON, 1}, {NSM, 23}, { ON, 1}, - {NSM, 3}, { R, 1}, {NSM, 1}, { R, 1}, {NSM, 2}, - { R, 1}, {NSM, 1}, { ON, 11}, { R, 27}, { ON, 5}, - { R, 5}, { ON, 23}, { CS, 1}, { ON, 14}, { AL, 1}, - { ON, 3}, { AL, 1}, { ON, 1}, { AL, 26}, { ON, 5}, - { AL, 11}, {NSM, 11}, { ON, 10}, { AN, 10}, { ET, 1}, - { AN, 2}, { AL, 3}, {NSM, 1}, { AL, 101}, {NSM, 7}, - { AL, 1}, {NSM, 7}, { AL, 2}, {NSM, 2}, { ON, 1}, - {NSM, 4}, { ON, 2}, { EN, 10}, { AL, 5}, { ON, 1}, - { AL, 14}, { ON, 1}, { BN, 1}, { AL, 1}, {NSM, 1}, - { AL, 27}, { ON, 3}, {NSM, 27}, { ON, 53}, { AL, 38}, - {NSM, 11}, { AL, 1}, { ON, 255}, { ON, 80}, {NSM, 2}, - { L, 1}, { ON, 1}, { L, 53}, { ON, 2}, {NSM, 1}, - { L, 4}, {NSM, 8}, { L, 4}, {NSM, 1}, { ON, 2}, - { L, 1}, {NSM, 4}, { ON, 3}, { L, 10}, {NSM, 2}, - { L, 13}, { ON, 16}, {NSM, 1}, { L, 2}, { ON, 1}, - { L, 8}, { ON, 2}, { L, 2}, { ON, 2}, { L, 22}, - { ON, 1}, { L, 7}, { ON, 1}, { L, 1}, { ON, 3}, - { L, 4}, { ON, 2}, {NSM, 1}, { ON, 1}, { L, 3}, - {NSM, 4}, { ON, 2}, { L, 2}, { ON, 2}, { L, 2}, - {NSM, 1}, { ON, 9}, { L, 1}, { ON, 4}, { L, 2}, - { ON, 1}, { L, 3}, {NSM, 2}, { ON, 2}, { L, 12}, - { ET, 2}, { L, 7}, { ON, 7}, {NSM, 1}, { ON, 2}, - { L, 6}, { ON, 4}, { L, 2}, { ON, 2}, { L, 22}, - { ON, 1}, { L, 7}, { ON, 1}, { L, 2}, { ON, 1}, - { L, 2}, { ON, 1}, { L, 2}, { ON, 2}, {NSM, 1}, - { ON, 1}, { L, 3}, {NSM, 2}, { ON, 4}, {NSM, 2}, - { ON, 2}, {NSM, 3}, { ON, 11}, { L, 4}, { ON, 1}, - { L, 1}, { ON, 7}, { L, 10}, {NSM, 2}, { L, 3}, - { ON, 12}, {NSM, 2}, { L, 1}, { ON, 1}, { L, 7}, - { ON, 1}, { L, 1}, { ON, 1}, { L, 3}, { ON, 1}, - { L, 22}, { ON, 1}, { L, 7}, { ON, 1}, { L, 2}, - { ON, 1}, { L, 5}, { ON, 2}, {NSM, 1}, { L, 4}, - {NSM, 5}, { ON, 1}, {NSM, 2}, { L, 1}, { ON, 1}, - { L, 2}, {NSM, 1}, { ON, 2}, { L, 1}, { ON, 15}, - { L, 1}, { ON, 5}, { L, 10}, { ON, 17}, {NSM, 1}, - { L, 2}, { ON, 1}, { L, 8}, { ON, 2}, { L, 2}, - { ON, 2}, { L, 22}, { ON, 1}, { L, 7}, { ON, 1}, - { L, 2}, { ON, 2}, { L, 4}, { ON, 2}, {NSM, 1}, - { L, 2}, {NSM, 1}, { L, 1}, {NSM, 3}, { ON, 3}, - { L, 2}, { ON, 2}, { L, 2}, {NSM, 1}, { ON, 8}, - {NSM, 1}, { L, 1}, { ON, 4}, { L, 2}, { ON, 1}, - { L, 3}, { ON, 4}, { L, 11}, { ON, 17}, {NSM, 1}, - { L, 1}, { ON, 1}, { L, 6}, { ON, 3}, { L, 3}, - { ON, 1}, { L, 4}, { ON, 3}, { L, 2}, { ON, 1}, - { L, 1}, { ON, 1}, { L, 2}, { ON, 3}, { L, 2}, - { ON, 3}, { L, 3}, { ON, 3}, { L, 8}, { ON, 1}, - { L, 3}, { ON, 4}, { L, 2}, {NSM, 1}, { L, 2}, - { ON, 3}, { L, 3}, { ON, 1}, { L, 3}, {NSM, 1}, - { ON, 9}, { L, 1}, { ON, 15}, { L, 12}, { ON, 14}, - { L, 3}, { ON, 1}, { L, 8}, { ON, 1}, { L, 3}, - { ON, 1}, { L, 23}, { ON, 1}, { L, 10}, { ON, 1}, - { L, 5}, { ON, 4}, {NSM, 3}, { L, 4}, { ON, 1}, - {NSM, 3}, { ON, 1}, {NSM, 4}, { ON, 7}, {NSM, 2}, - { ON, 9}, { L, 2}, { ON, 4}, { L, 10}, { ON, 18}, - { L, 2}, { ON, 1}, { L, 8}, { ON, 1}, { L, 3}, - { ON, 1}, { L, 23}, { ON, 1}, { L, 10}, { ON, 1}, - { L, 5}, { ON, 4}, { L, 1}, {NSM, 1}, { L, 5}, - { ON, 1}, {NSM, 1}, { L, 2}, { ON, 1}, { L, 2}, - {NSM, 2}, { ON, 7}, { L, 2}, { ON, 7}, { L, 1}, - { ON, 1}, { L, 2}, { ON, 4}, { L, 10}, { ON, 18}, - { L, 2}, { ON, 1}, { L, 8}, { ON, 1}, { L, 3}, - { ON, 1}, { L, 23}, { ON, 1}, { L, 16}, { ON, 4}, - { L, 3}, {NSM, 3}, { ON, 2}, { L, 3}, { ON, 1}, - { L, 3}, {NSM, 1}, { ON, 9}, { L, 1}, { ON, 8}, - { L, 2}, { ON, 4}, { L, 10}, { ON, 18}, { L, 2}, - { ON, 1}, { L, 18}, { ON, 3}, { L, 24}, { ON, 1}, - { L, 9}, { ON, 1}, { L, 1}, { ON, 2}, { L, 7}, - { ON, 3}, {NSM, 1}, { ON, 4}, { L, 3}, {NSM, 3}, - { ON, 1}, {NSM, 1}, { ON, 1}, { L, 8}, { ON, 18}, - { L, 3}, { ON, 12}, { L, 48}, {NSM, 1}, { L, 2}, - {NSM, 7}, { ON, 4}, { ET, 1}, { L, 7}, {NSM, 8}, - { L, 13}, { ON, 37}, { L, 2}, { ON, 1}, { L, 1}, - { ON, 2}, { L, 2}, { ON, 1}, { L, 1}, { ON, 2}, - { L, 1}, { ON, 6}, { L, 4}, { ON, 1}, { L, 7}, - { ON, 1}, { L, 3}, { ON, 1}, { L, 1}, { ON, 1}, - { L, 1}, { ON, 2}, { L, 2}, { ON, 1}, { L, 4}, - {NSM, 1}, { L, 2}, {NSM, 6}, { ON, 1}, {NSM, 2}, - { L, 1}, { ON, 2}, { L, 5}, { ON, 1}, { L, 1}, - { ON, 1}, {NSM, 6}, { ON, 2}, { L, 10}, { ON, 2}, - { L, 2}, { ON, 34}, { L, 24}, {NSM, 2}, { L, 27}, - {NSM, 1}, { L, 1}, {NSM, 1}, { L, 1}, {NSM, 1}, - { ON, 4}, { L, 10}, { ON, 1}, { L, 34}, { ON, 6}, - {NSM, 14}, { L, 1}, {NSM, 5}, { L, 1}, {NSM, 2}, - { L, 4}, { ON, 4}, {NSM, 8}, { ON, 1}, {NSM, 36}, - { ON, 1}, { L, 8}, {NSM, 1}, { L, 6}, { ON, 2}, - { L, 1}, { ON, 48}, { L, 34}, { ON, 1}, { L, 5}, - { ON, 1}, { L, 2}, { ON, 1}, { L, 1}, {NSM, 4}, - { L, 1}, {NSM, 1}, { ON, 3}, {NSM, 2}, { L, 1}, - {NSM, 1}, { ON, 6}, { L, 24}, {NSM, 2}, { ON, 70}, - { L, 38}, { ON, 10}, { L, 41}, { ON, 2}, { L, 1}, - { ON, 4}, { L, 90}, { ON, 5}, { L, 68}, { ON, 5}, - { L, 82}, { ON, 6}, { L, 7}, { ON, 1}, { L, 63}, - { ON, 1}, { L, 1}, { ON, 1}, { L, 4}, { ON, 2}, - { L, 7}, { ON, 1}, { L, 1}, { ON, 1}, { L, 4}, - { ON, 2}, { L, 39}, { ON, 1}, { L, 1}, { ON, 1}, - { L, 4}, { ON, 2}, { L, 31}, { ON, 1}, { L, 1}, - { ON, 1}, { L, 4}, { ON, 2}, { L, 7}, { ON, 1}, - { L, 1}, { ON, 1}, { L, 4}, { ON, 2}, { L, 7}, - { ON, 1}, { L, 7}, { ON, 1}, { L, 23}, { ON, 1}, - { L, 31}, { ON, 1}, { L, 1}, { ON, 1}, { L, 4}, - { ON, 2}, { L, 7}, { ON, 1}, { L, 39}, { ON, 1}, - { L, 19}, { ON, 6}, { L, 28}, { ON, 35}, { L, 85}, - { ON, 12}, { L, 255}, { L, 255}, { L, 120}, { ON, 9}, - { WS, 1}, { L, 26}, { ON, 5}, { L, 81}, { ON, 15}, - { L, 13}, { ON, 1}, { L, 4}, {NSM, 3}, { ON, 11}, - { L, 18}, {NSM, 3}, { L, 2}, { ON, 9}, { L, 18}, - {NSM, 2}, { ON, 12}, { L, 13}, { ON, 1}, { L, 3}, - { ON, 1}, {NSM, 2}, { ON, 12}, { L, 55}, {NSM, 7}, - { L, 8}, {NSM, 1}, { L, 2}, {NSM, 11}, { L, 7}, - { ET, 1}, { L, 1}, { ON, 3}, { L, 10}, { ON, 33}, - {NSM, 3}, { BN, 1}, { ON, 1}, { L, 10}, { ON, 6}, - { L, 88}, { ON, 8}, { L, 41}, {NSM, 1}, { ON, 255}, - { ON, 255}, { ON, 255}, { ON, 255}, { ON, 255}, { ON, 91}, - { L, 156}, { ON, 4}, { L, 90}, { ON, 6}, { L, 22}, - { ON, 2}, { L, 6}, { ON, 2}, { L, 38}, { ON, 2}, - { L, 6}, { ON, 2}, { L, 8}, { ON, 1}, { L, 1}, - { ON, 1}, { L, 1}, { ON, 1}, { L, 1}, { ON, 1}, - { L, 31}, { ON, 2}, { L, 53}, { ON, 1}, { L, 7}, - { ON, 1}, { L, 1}, { ON, 3}, { L, 3}, { ON, 1}, - { L, 7}, { ON, 3}, { L, 4}, { ON, 2}, { L, 6}, - { ON, 4}, { L, 13}, { ON, 5}, { L, 3}, { ON, 1}, - { L, 7}, { ON, 3}, { WS, 11}, { BN, 3}, { L, 1}, - { R, 1}, { ON, 24}, { WS, 1}, { B, 1}, {LRE, 1}, - {RLE, 1}, {PDF, 1}, {LRO, 1}, {RLO, 1}, { WS, 1}, - { ET, 5}, { ON, 42}, { WS, 1}, { BN, 4}, { ON, 6}, - { BN, 6}, { EN, 1}, { L, 1}, { ON, 2}, { EN, 6}, - { ET, 2}, { ON, 3}, { L, 1}, { EN, 10}, { ET, 2}, - { ON, 20}, { ET, 18}, { ON, 30}, {NSM, 27}, { ON, 23}, - { L, 1}, { ON, 4}, { L, 1}, { ON, 2}, { L, 10}, - { ON, 1}, { L, 1}, { ON, 3}, { L, 5}, { ON, 6}, - { L, 1}, { ON, 1}, { L, 1}, { ON, 1}, { L, 1}, - { ON, 1}, { L, 4}, { ET, 1}, { L, 3}, { ON, 1}, - { L, 7}, { ON, 3}, { L, 3}, { ON, 5}, { L, 5}, - { ON, 22}, { L, 36}, { ON, 142}, { ET, 2}, { ON, 255}, - { ON, 35}, { L, 69}, { ON, 26}, { L, 1}, { ON, 202}, - { EN, 60}, { L, 78}, { EN, 1}, { ON, 255}, { ON, 255}, - { ON, 255}, { ON, 255}, { ON, 255}, { ON, 255}, { ON, 255}, - { ON, 255}, { ON, 255}, { ON, 255}, { ON, 255}, { ON, 32}, - { WS, 1}, { ON, 4}, { L, 3}, { ON, 25}, { L, 9}, - {NSM, 6}, { ON, 1}, { L, 5}, { ON, 2}, { L, 5}, - { ON, 4}, { L, 86}, { ON, 2}, {NSM, 2}, { ON, 2}, - { L, 3}, { ON, 1}, { L, 90}, { ON, 1}, { L, 4}, - { ON, 5}, { L, 40}, { ON, 4}, { L, 94}, { ON, 1}, - { L, 40}, { ON, 56}, { L, 45}, { ON, 3}, { L, 36}, - { ON, 28}, { L, 28}, { ON, 3}, { L, 50}, { ON, 15}, - { L, 12}, { ON, 4}, { L, 47}, { ON, 1}, { L, 119}, - { ON, 4}, { L, 99}, { ON, 2}, { L, 31}, { ON, 1}, - { L, 1}, { ON, 255}, { ON, 255}, { ON, 255}, { ON, 255}, - { ON, 255}, { ON, 255}, { ON, 255}, { ON, 255}, { ON, 255}, - { ON, 255}, { ON, 255}, { ON, 255}, { ON, 255}, { ON, 255}, - { ON, 255}, { ON, 255}, { ON, 255}, { ON, 255}, { ON, 255}, - { ON, 255}, { ON, 255}, { ON, 255}, { ON, 255}, { ON, 255}, - { ON, 255}, { ON, 205}, { L, 1}, { ON, 74}, { L, 1}, - { ON, 255}, { ON, 255}, { ON, 255}, { ON, 255}, { ON, 255}, - { ON, 255}, { ON, 255}, { ON, 255}, { ON, 255}, { ON, 255}, - { ON, 255}, { ON, 255}, { ON, 255}, { ON, 255}, { ON, 255}, - { ON, 255}, { ON, 255}, { ON, 255}, { ON, 255}, { ON, 255}, - { ON, 255}, { ON, 255}, { ON, 255}, { ON, 255}, { ON, 255}, - { ON, 255}, { ON, 255}, { ON, 255}, { ON, 255}, { ON, 255}, - { ON, 255}, { ON, 255}, { ON, 255}, { ON, 255}, { ON, 255}, - { ON, 255}, { ON, 255}, { ON, 255}, { ON, 255}, { ON, 255}, - { ON, 255}, { ON, 255}, { ON, 255}, { ON, 255}, { ON, 255}, - { ON, 255}, { ON, 255}, { ON, 255}, { ON, 255}, { ON, 255}, - { ON, 255}, { ON, 255}, { ON, 255}, { ON, 255}, { ON, 255}, - { ON, 255}, { ON, 255}, { ON, 255}, { ON, 255}, { ON, 255}, - { ON, 255}, { ON, 255}, { ON, 255}, { ON, 255}, { ON, 255}, - { ON, 255}, { ON, 255}, { ON, 255}, { ON, 255}, { ON, 255}, - { ON, 255}, { ON, 255}, { ON, 255}, { ON, 255}, { ON, 255}, - { ON, 255}, { ON, 255}, { ON, 255}, { ON, 255}, { ON, 255}, - { ON, 255}, { ON, 245}, { L, 1}, { ON, 90}, { L, 255}, - { L, 255}, { L, 255}, { L, 255}, { L, 145}, { ON, 255}, - { ON, 255}, { ON, 255}, { ON, 255}, { ON, 255}, { ON, 255}, - { ON, 255}, { ON, 122}, { L, 1}, { ON, 255}, { ON, 255}, - { ON, 255}, { ON, 255}, { ON, 255}, { ON, 255}, { ON, 255}, - { ON, 255}, { ON, 255}, { ON, 255}, { ON, 255}, { ON, 255}, - { ON, 255}, { ON, 255}, { ON, 255}, { ON, 255}, { ON, 255}, - { ON, 255}, { ON, 255}, { ON, 255}, { ON, 255}, { ON, 255}, - { ON, 255}, { ON, 255}, { ON, 255}, { ON, 255}, { ON, 255}, - { ON, 255}, { ON, 255}, { ON, 255}, { ON, 255}, { ON, 255}, - { ON, 255}, { ON, 255}, { ON, 255}, { ON, 255}, { ON, 255}, - { ON, 255}, { ON, 255}, { ON, 255}, { ON, 255}, { ON, 255}, - { ON, 255}, { ON, 205}, { L, 1}, { ON, 92}, { L, 1}, - { ON, 255}, { ON, 255}, { ON, 255}, { ON, 129}, { L, 2}, - { ON, 126}, { L, 2}, { ON, 255}, { ON, 255}, { ON, 255}, - { ON, 255}, { ON, 2}, { L, 2}, { ON, 255}, { ON, 255}, - { ON, 255}, { ON, 255}, { ON, 255}, { ON, 255}, { ON, 255}, - { ON, 255}, { ON, 255}, { ON, 255}, { ON, 255}, { ON, 255}, - { ON, 255}, { ON, 255}, { ON, 255}, { ON, 255}, { ON, 255}, - { ON, 255}, { ON, 255}, { ON, 255}, { ON, 255}, { ON, 255}, - { ON, 255}, { ON, 255}, { ON, 255}, { ON, 23}, { L, 255}, - { L, 48}, { ON, 2}, { L, 59}, { ON, 149}, { L, 7}, - { ON, 12}, { L, 5}, { ON, 5}, { R, 1}, {NSM, 1}, - { R, 10}, { ET, 1}, { R, 13}, { ON, 1}, { R, 5}, - { ON, 1}, { R, 1}, { ON, 1}, { R, 2}, { ON, 1}, - { R, 2}, { ON, 1}, { R, 10}, { AL, 98}, { ON, 33}, - { AL, 255}, { AL, 108}, { ON, 18}, { AL, 64}, { ON, 2}, - { AL, 54}, { ON, 40}, { AL, 13}, { ON, 3}, {NSM, 16}, - { ON, 16}, {NSM, 4}, { ON, 44}, { CS, 1}, { ON, 1}, - { CS, 1}, { ON, 2}, { CS, 1}, { ON, 9}, { ET, 1}, - { ON, 2}, { ET, 2}, { ON, 5}, { ET, 2}, { ON, 5}, - { AL, 5}, { ON, 1}, { AL, 135}, { ON, 2}, { BN, 1}, - { ON, 3}, { ET, 3}, { ON, 5}, { ET, 1}, { CS, 1}, - { ET, 1}, { CS, 1}, { ES, 1}, { EN, 10}, { CS, 1}, - { ON, 6}, { L, 26}, { ON, 6}, { L, 26}, { ON, 11}, - { L, 89}, { ON, 3}, { L, 6}, { ON, 2}, { L, 6}, - { ON, 2}, { L, 6}, { ON, 2}, { L, 3}, { ON, 3}, - { ET, 2}, { ON, 3}, { ET, 2}, { ON, 9}, { L, 14}, -}; -- 2.11.0