Further clarity and speed cleanups of minibidi:
authorsimon <simon@cda61777-01e9-0310-a592-d414129be87e>
Wed, 8 Dec 2004 19:07:05 +0000 (19:07 +0000)
committersimon <simon@cda61777-01e9-0310-a592-d414129be87e>
Wed, 8 Dec 2004 19:07:05 +0000 (19:07 +0000)
 - 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
minibidi.h [deleted file]

index 54703d6..26a8419 100644 (file)
  * - Ligatures
  */
 
-#include "minibidi.h"
+#include <stdlib.h>    /* 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
  */
 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<count && tlevel <= level[i]) {
            i++;
        }
-       rcount = i-j;
-       for (; rcount>((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<count; i++) {
-       if (getType(line[i].wc) == R || getType(line[i].wc) == AL) {
+       int type = getType(line[i].wc);
+       if (type == R || type == AL) {
            yes = 1;
            break;
        }
@@ -291,8 +631,8 @@ int do_bidi(bidi_char *line, int count)
        return L;
 
     /* Initialize types, levels */
-    types = malloc(sizeof(unsigned char) * count);
-    levels = malloc(sizeof(unsigned char) * count);
+    types = snewn(count, unsigned char);
+    levels = snewn(count, unsigned char);
 
     /* Rule (P1)  NOT IMPLEMENTED
      * P1. Split the text into separate paragraphs. A paragraph separator is
@@ -307,10 +647,11 @@ int do_bidi(bidi_char *line, int count)
      */
     paragraphLevel = 0;
     for (i=0; i<count ; i++) {
-       if (getType(line[i].wc) == R || getType(line[i].wc) == AL) {
+       int type = getType(line[i].wc);
+       if (type == R || type == AL) {
            paragraphLevel = 1;
            break;
-       } else if (getType(line[i].wc) == L)
+       } else if (type == L)
            break;
     }
 
@@ -709,8 +1050,8 @@ int do_bidi(bidi_char *line, int count)
      * process, then the ordering of the marks and the base character must
      * be reversed.
      */
-    free(types);
-    free(levels);
+    sfree(types);
+    sfree(levels);
     return R;
 }
 
diff --git a/minibidi.h b/minibidi.h
deleted file mode 100644 (file)
index 5c825fb..0000000
+++ /dev/null
@@ -1,394 +0,0 @@
-/************************************************************************
- * $Id$
- *
- * ------------
- * Description:
- * ------------
- * This is an implemention of Unicode's Bidirectional Algorithm
- * (known as UAX #9).
- *
- *   http://www.unicode.org/reports/tr9/
- * 
- * Author: Ahmad Khalifa
- *
- * -----------------
- * Revision Details:    (Updated by Revision Control System)
- * -----------------
- *  $Date$
- *  $Author$
- *  $Revision$
- *
- * (www.arabeyes.org - under MIT license)
- *
- ************************************************************************/
-
-/*
- * TODO:
- * =====
- * - work almost finished
- * - Shaping Table to be expanded to include the whole range.
- * - Ligature handling
- */
-
-#include <stdlib.h>    /* 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},
-};