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
  */
 
  * - 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
 
 /*
  * Flips the text buffer, according to max level, and
  */
 void flipThisRun(bidi_char *from, unsigned char *level, int max, int count)
 {
  */
 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;
     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++;
        }
        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
  */
  * 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++) {
     /* 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;
        }
            yes = 1;
            break;
        }
@@ -291,8 +631,8 @@ int do_bidi(bidi_char *line, int count)
        return L;
 
     /* Initialize types, levels */
        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
 
     /* 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++) {
      */
     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;
            paragraphLevel = 1;
            break;
-       } else if (getType(line[i].wc) == L)
+       } else if (type == L)
            break;
     }
 
            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.
      */
      * process, then the ordering of the marks and the base character must
      * be reversed.
      */
-    free(types);
-    free(levels);
+    sfree(types);
+    sfree(levels);
     return R;
 }
 
     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},
-};