1d4afb5ceSopenharmony_ci/* 2d4afb5ceSopenharmony_ci * minilex.c 3d4afb5ceSopenharmony_ci * 4d4afb5ceSopenharmony_ci * High efficiency lexical state parser 5d4afb5ceSopenharmony_ci * 6d4afb5ceSopenharmony_ci * Copyright (C)2011-2014 Andy Green <andy@warmcat.com> 7d4afb5ceSopenharmony_ci * 8d4afb5ceSopenharmony_ci * Licensed under MIT 9d4afb5ceSopenharmony_ci * 10d4afb5ceSopenharmony_ci * Usage: gcc minihuf.c -o minihuf && ./minihuf > huftable.h 11d4afb5ceSopenharmony_ci * 12d4afb5ceSopenharmony_ci * Run it twice to test parsing on the generated table on stderr 13d4afb5ceSopenharmony_ci */ 14d4afb5ceSopenharmony_ci 15d4afb5ceSopenharmony_ci#include <stdio.h> 16d4afb5ceSopenharmony_ci#include <stdlib.h> 17d4afb5ceSopenharmony_ci#include <string.h> 18d4afb5ceSopenharmony_ci 19d4afb5ceSopenharmony_ci#define LWS_ARRAY_SIZE(n) (sizeof(n) / sizeof(n[0])) 20d4afb5ceSopenharmony_ci 21d4afb5ceSopenharmony_cistruct huf { 22d4afb5ceSopenharmony_ci unsigned int code; 23d4afb5ceSopenharmony_ci unsigned char len; 24d4afb5ceSopenharmony_ci}; 25d4afb5ceSopenharmony_ci 26d4afb5ceSopenharmony_cistatic struct huf huf_literal[] = { 27d4afb5ceSopenharmony_ci /* 0x00 */ { 0x1ff8, 13 }, 28d4afb5ceSopenharmony_ci /* 0x01 */ { 0x7fffd8, 23 }, 29d4afb5ceSopenharmony_ci /* 0x02 */ { 0xfffffe2, 28 }, 30d4afb5ceSopenharmony_ci /* 0x03 */ { 0xfffffe3, 28 }, 31d4afb5ceSopenharmony_ci /* 0x04 */ { 0xfffffe4, 28 }, 32d4afb5ceSopenharmony_ci /* 0x05 */ { 0xfffffe5, 28 }, 33d4afb5ceSopenharmony_ci /* 0x06 */ { 0xfffffe6, 28 }, 34d4afb5ceSopenharmony_ci /* 0x07 */ { 0xfffffe7, 28 }, 35d4afb5ceSopenharmony_ci /* 0x08 */ { 0xfffffe8, 28 }, 36d4afb5ceSopenharmony_ci /* 0x09 */ { 0xffffea, 24 }, 37d4afb5ceSopenharmony_ci /* 0x0a */ { 0x3ffffffc, 30 }, 38d4afb5ceSopenharmony_ci /* 0x0b */ { 0xfffffe9, 28 }, 39d4afb5ceSopenharmony_ci 40d4afb5ceSopenharmony_ci /* 0x0c */ { 0xfffffea, 28 }, 41d4afb5ceSopenharmony_ci /* 0x0d */ { 0x3ffffffd, 30 }, 42d4afb5ceSopenharmony_ci /* 0x0e */ { 0xfffffeb, 28 }, 43d4afb5ceSopenharmony_ci /* 0x0f */ { 0xfffffec, 28 }, 44d4afb5ceSopenharmony_ci /* 0x10 */ { 0xfffffed, 28 }, 45d4afb5ceSopenharmony_ci /* 0x11 */ { 0xfffffee, 28 }, 46d4afb5ceSopenharmony_ci /* 0x12 */ { 0xfffffef, 28 }, 47d4afb5ceSopenharmony_ci /* 0x13 */ { 0xffffff0, 28 }, 48d4afb5ceSopenharmony_ci /* 0x14 */ { 0xffffff1, 28 }, 49d4afb5ceSopenharmony_ci /* 0x15 */ { 0xffffff2, 28 }, 50d4afb5ceSopenharmony_ci /* 0x16 */ { 0x3ffffffe, 30 }, 51d4afb5ceSopenharmony_ci /* 0x17 */ { 0xffffff3, 28 }, 52d4afb5ceSopenharmony_ci /* 0x18 */ { 0xffffff4, 28 }, 53d4afb5ceSopenharmony_ci /* 0x19 */ { 0xffffff5, 28 }, 54d4afb5ceSopenharmony_ci /* 0x1a */ { 0xffffff6, 28 }, 55d4afb5ceSopenharmony_ci /* 0x1b */ { 0xffffff7, 28 }, 56d4afb5ceSopenharmony_ci /* 0x1c */ { 0xffffff8, 28 }, 57d4afb5ceSopenharmony_ci /* 0x1d */ { 0xffffff9, 28 }, 58d4afb5ceSopenharmony_ci /* 0x1e */ { 0xffffffa, 28 }, 59d4afb5ceSopenharmony_ci /* 0x1f */ { 0xffffffb, 28 }, 60d4afb5ceSopenharmony_ci /* 0x20 */ { 0x14, 6 }, 61d4afb5ceSopenharmony_ci /* 0x21 */ { 0x3f8, 10 }, 62d4afb5ceSopenharmony_ci /* 0x22 */ { 0x3f9, 10 }, 63d4afb5ceSopenharmony_ci /* 0x23 */ { 0xffa, 12 }, 64d4afb5ceSopenharmony_ci /* 0x24 */ { 0x1ff9, 13 }, 65d4afb5ceSopenharmony_ci /* 0x25 */ { 0x15, 6 }, 66d4afb5ceSopenharmony_ci /* 0x26 */ { 0xf8, 8 }, 67d4afb5ceSopenharmony_ci /* 0x27 */ { 0x7fa, 11 }, 68d4afb5ceSopenharmony_ci /* 0x28 */ { 0x3fa, 10 }, 69d4afb5ceSopenharmony_ci /* 0x29 */ { 0x3fb, 10 }, 70d4afb5ceSopenharmony_ci /* 0x2a */ { 0xf9, 8 }, 71d4afb5ceSopenharmony_ci /* 0x2b */ { 0x7fb, 11 }, 72d4afb5ceSopenharmony_ci /* 0x2c */ { 0xfa, 8 }, 73d4afb5ceSopenharmony_ci /* 0x2d */ { 0x16, 6 }, 74d4afb5ceSopenharmony_ci /* 0x2e */ { 0x17, 6 }, 75d4afb5ceSopenharmony_ci /* 0x2f */ { 0x18, 6 }, 76d4afb5ceSopenharmony_ci /* 0x30 */ { 0x0, 5 }, 77d4afb5ceSopenharmony_ci /* 0x31 */ { 0x1, 5 }, 78d4afb5ceSopenharmony_ci /* 0x32 */ { 0x2, 5 }, 79d4afb5ceSopenharmony_ci /* 0x33 */ { 0x19, 6 }, 80d4afb5ceSopenharmony_ci /* 0x34 */ { 0x1a, 6 }, 81d4afb5ceSopenharmony_ci /* 0x35 */ { 0x1b, 6 }, 82d4afb5ceSopenharmony_ci /* 0x36 */ { 0x1c, 6 }, 83d4afb5ceSopenharmony_ci /* 0x37 */ { 0x1d, 6 }, 84d4afb5ceSopenharmony_ci /* 0x38 */ { 0x1e, 6 }, 85d4afb5ceSopenharmony_ci /* 0x39 */ { 0x1f, 6 }, 86d4afb5ceSopenharmony_ci /* 0x3a */ { 0x5c, 7 }, 87d4afb5ceSopenharmony_ci /* 0x3b */ { 0xfb, 8 }, 88d4afb5ceSopenharmony_ci 89d4afb5ceSopenharmony_ci /* 0x3c */ { 0x7ffc, 15 }, 90d4afb5ceSopenharmony_ci /* 0x3d */ { 0x20, 6 }, 91d4afb5ceSopenharmony_ci /* 0x3e */ { 0xffb, 12 }, 92d4afb5ceSopenharmony_ci /* 0x3f */ { 0x3fc, 10 }, 93d4afb5ceSopenharmony_ci /* 0x40 */ { 0x1ffa, 13 }, 94d4afb5ceSopenharmony_ci /* 0x41 */ { 0x21, 6 }, 95d4afb5ceSopenharmony_ci /* 0x42 */ { 0x5d, 7 }, 96d4afb5ceSopenharmony_ci /* 0x43 */ { 0x5e, 7 }, 97d4afb5ceSopenharmony_ci /* 0x44 */ { 0x5f, 7 }, 98d4afb5ceSopenharmony_ci /* 0x45 */ { 0x60, 7 }, 99d4afb5ceSopenharmony_ci /* 0x46 */ { 0x61, 7 }, 100d4afb5ceSopenharmony_ci /* 0x47 */ { 0x62, 7 }, 101d4afb5ceSopenharmony_ci /* 0x48 */ { 0x63, 7 }, 102d4afb5ceSopenharmony_ci /* 0x49 */ { 0x64, 7 }, 103d4afb5ceSopenharmony_ci /* 0x4a */ { 0x65, 7 }, 104d4afb5ceSopenharmony_ci /* 0x4b */ { 0x66, 7 }, 105d4afb5ceSopenharmony_ci /* 0x4c */ { 0x67, 7 }, 106d4afb5ceSopenharmony_ci /* 0x4d */ { 0x68, 7 }, 107d4afb5ceSopenharmony_ci /* 0x4e */ { 0x69, 7 }, 108d4afb5ceSopenharmony_ci /* 0x4f */ { 0x6a, 7 }, 109d4afb5ceSopenharmony_ci /* 0x50 */ { 0x6b, 7 }, 110d4afb5ceSopenharmony_ci /* 0x51 */ { 0x6c, 7 }, 111d4afb5ceSopenharmony_ci /* 0x52 */ { 0x6d, 7 }, 112d4afb5ceSopenharmony_ci /* 0x53 */ { 0x6e, 7 }, 113d4afb5ceSopenharmony_ci /* 0x54 */ { 0x6f, 7 }, 114d4afb5ceSopenharmony_ci /* 0x55 */ { 0x70, 7 }, 115d4afb5ceSopenharmony_ci /* 0x56 */ { 0x71, 7 }, 116d4afb5ceSopenharmony_ci /* 0x57 */ { 0x72, 7 }, 117d4afb5ceSopenharmony_ci /* 0x58 */ { 0xfc, 8 }, 118d4afb5ceSopenharmony_ci /* 0x59 */ { 0x73, 7 }, 119d4afb5ceSopenharmony_ci /* 0x5a */ { 0xfd, 8 }, 120d4afb5ceSopenharmony_ci /* 0x5b */ { 0x1ffb, 13 }, 121d4afb5ceSopenharmony_ci /* 0x5c */ { 0x7fff0, 19 }, 122d4afb5ceSopenharmony_ci /* 0x5d */ { 0x1ffc, 13 }, 123d4afb5ceSopenharmony_ci /* 0x5e */ { 0x3ffc, 14 }, 124d4afb5ceSopenharmony_ci /* 0x5f */ { 0x22, 6 }, 125d4afb5ceSopenharmony_ci /* 0x60 */ { 0x7ffd, 15 }, 126d4afb5ceSopenharmony_ci /* 0x61 */ { 0x3, 5 }, 127d4afb5ceSopenharmony_ci /* 0x62 */ { 0x23, 6 }, 128d4afb5ceSopenharmony_ci /* 0x63 */ { 0x4, 5 }, 129d4afb5ceSopenharmony_ci /* 0x64 */ { 0x24, 6 }, 130d4afb5ceSopenharmony_ci /* 0x65 */ { 0x5, 5 }, 131d4afb5ceSopenharmony_ci /* 0x66 */ { 0x25, 6 }, 132d4afb5ceSopenharmony_ci /* 0x67 */ { 0x26, 6 }, 133d4afb5ceSopenharmony_ci /* 0x68 */ { 0x27, 6 }, 134d4afb5ceSopenharmony_ci /* 0x69 */ { 0x6, 5 }, 135d4afb5ceSopenharmony_ci /* 0x6a */ { 0x74, 7 }, 136d4afb5ceSopenharmony_ci /* 0x6b */ { 0x75, 7 }, 137d4afb5ceSopenharmony_ci 138d4afb5ceSopenharmony_ci 139d4afb5ceSopenharmony_ci /* 0x6c */ { 0x28, 6 }, 140d4afb5ceSopenharmony_ci /* 0x6d */ { 0x29, 6 }, 141d4afb5ceSopenharmony_ci /* 0x6e */ { 0x2a, 6 }, 142d4afb5ceSopenharmony_ci /* 0x6f */ { 0x7, 5 }, 143d4afb5ceSopenharmony_ci /* 0x70 */ { 0x2b, 6 }, 144d4afb5ceSopenharmony_ci /* 0x71 */ { 0x76, 7 }, 145d4afb5ceSopenharmony_ci /* 0x72 */ { 0x2c, 6 }, 146d4afb5ceSopenharmony_ci /* 0x73 */ { 0x8, 5 }, 147d4afb5ceSopenharmony_ci /* 0x74 */ { 0x9, 5 }, 148d4afb5ceSopenharmony_ci /* 0x75 */ { 0x2d, 6 }, 149d4afb5ceSopenharmony_ci /* 0x76 */ { 0x77, 7 }, 150d4afb5ceSopenharmony_ci /* 0x77 */ { 0x78, 7 }, 151d4afb5ceSopenharmony_ci /* 0x78 */ { 0x79, 7 }, 152d4afb5ceSopenharmony_ci /* 0x79 */ { 0x7a, 7 }, 153d4afb5ceSopenharmony_ci /* 0x7a */ { 0x7b, 7 }, 154d4afb5ceSopenharmony_ci /* 0x7b */ { 0x7ffe, 15 }, 155d4afb5ceSopenharmony_ci /* 0x7c */ { 0x7fc, 11 }, 156d4afb5ceSopenharmony_ci /* 0x7d */ { 0x3ffd, 14 }, 157d4afb5ceSopenharmony_ci /* 0x7e */ { 0x1ffd, 13 }, 158d4afb5ceSopenharmony_ci /* 0x7f */ { 0xffffffc, 28 }, 159d4afb5ceSopenharmony_ci /* 0x80 */ { 0xfffe6, 20 }, 160d4afb5ceSopenharmony_ci /* 0x81 */ { 0x3fffd2, 22 }, 161d4afb5ceSopenharmony_ci /* 0x82 */ { 0xfffe7, 20 }, 162d4afb5ceSopenharmony_ci /* 0x83 */ { 0xfffe8, 20 }, 163d4afb5ceSopenharmony_ci /* 0x84 */ { 0x3fffd3, 22 }, 164d4afb5ceSopenharmony_ci /* 0x85 */ { 0x3fffd4, 22 }, 165d4afb5ceSopenharmony_ci /* 0x86 */ { 0x3fffd5, 22 }, 166d4afb5ceSopenharmony_ci /* 0x87 */ { 0x7fffd9, 23 }, 167d4afb5ceSopenharmony_ci /* 0x88 */ { 0x3fffd6, 22 }, 168d4afb5ceSopenharmony_ci /* 0x89 */ { 0x7fffda, 23 }, 169d4afb5ceSopenharmony_ci /* 0x8a */ { 0x7fffdb, 23 }, 170d4afb5ceSopenharmony_ci /* 0x8b */ { 0x7fffdc, 23 }, 171d4afb5ceSopenharmony_ci /* 0x8c */ { 0x7fffdd, 23 }, 172d4afb5ceSopenharmony_ci /* 0x8d */ { 0x7fffde, 23 }, 173d4afb5ceSopenharmony_ci /* 0x8e */ { 0xffffeb, 24 }, 174d4afb5ceSopenharmony_ci /* 0x8f */ { 0x7fffdf, 23 }, 175d4afb5ceSopenharmony_ci /* 0x90 */ { 0xffffec, 24 }, 176d4afb5ceSopenharmony_ci /* 0x91 */ { 0xffffed, 24 }, 177d4afb5ceSopenharmony_ci /* 0x92 */ { 0x3fffd7, 22 }, 178d4afb5ceSopenharmony_ci /* 0x93 */ { 0x7fffe0, 23 }, 179d4afb5ceSopenharmony_ci /* 0x94 */ { 0xffffee, 24 }, 180d4afb5ceSopenharmony_ci /* 0x95 */ { 0x7fffe1, 23 }, 181d4afb5ceSopenharmony_ci /* 0x96 */ { 0x7fffe2, 23 }, 182d4afb5ceSopenharmony_ci /* 0x97 */ { 0x7fffe3, 23 }, 183d4afb5ceSopenharmony_ci /* 0x98 */ { 0x7fffe4, 23 }, 184d4afb5ceSopenharmony_ci /* 0x99 */ { 0x1fffdc, 21 }, 185d4afb5ceSopenharmony_ci /* 0x9a */ { 0x3fffd8, 22 }, 186d4afb5ceSopenharmony_ci /* 0x9b */ { 0x7fffe5, 23 }, 187d4afb5ceSopenharmony_ci 188d4afb5ceSopenharmony_ci /* 0x9c */ { 0x3fffd9, 22 }, 189d4afb5ceSopenharmony_ci /* 0x9d */ { 0x7fffe6, 23 }, 190d4afb5ceSopenharmony_ci /* 0x9e */ { 0x7fffe7, 23 }, 191d4afb5ceSopenharmony_ci /* 0x9f */ { 0xffffef, 24 }, 192d4afb5ceSopenharmony_ci /* 0xa0 */ { 0x3fffda, 22 }, 193d4afb5ceSopenharmony_ci /* 0xa1 */ { 0x1fffdd, 21 }, 194d4afb5ceSopenharmony_ci /* 0xa2 */ { 0xfffe9, 20 }, 195d4afb5ceSopenharmony_ci /* 0xa3 */ { 0x3fffdb, 22 }, 196d4afb5ceSopenharmony_ci /* 0xa4 */ { 0x3fffdc, 22 }, 197d4afb5ceSopenharmony_ci /* 0xa5 */ { 0x7fffe8, 23 }, 198d4afb5ceSopenharmony_ci /* 0xa6 */ { 0x7fffe9, 23 }, 199d4afb5ceSopenharmony_ci /* 0xa7 */ { 0x1fffde, 21 }, 200d4afb5ceSopenharmony_ci /* 0xa8 */ { 0x7fffea, 23 }, 201d4afb5ceSopenharmony_ci /* 0xa9 */ { 0x3fffdd, 22 }, 202d4afb5ceSopenharmony_ci /* 0xaa */ { 0x3fffde, 22 }, 203d4afb5ceSopenharmony_ci /* 0xab */ { 0xfffff0, 24 }, 204d4afb5ceSopenharmony_ci /* 0xac */ { 0x1fffdf, 21 }, 205d4afb5ceSopenharmony_ci /* 0xad */ { 0x3fffdf, 22 }, 206d4afb5ceSopenharmony_ci /* 0xae */ { 0x7fffeb, 23 }, 207d4afb5ceSopenharmony_ci /* 0xaf */ { 0x7fffec, 23 }, 208d4afb5ceSopenharmony_ci /* 0xb0 */ { 0x1fffe0, 21 }, 209d4afb5ceSopenharmony_ci /* 0xb1 */ { 0x1fffe1, 21 }, 210d4afb5ceSopenharmony_ci /* 0xb2 */ { 0x3fffe0, 22 }, 211d4afb5ceSopenharmony_ci /* 0xb3 */ { 0x1fffe2, 21 }, 212d4afb5ceSopenharmony_ci /* 0xb4 */ { 0x7fffed, 23 }, 213d4afb5ceSopenharmony_ci /* 0xb5 */ { 0x3fffe1, 22 }, 214d4afb5ceSopenharmony_ci /* 0xb6 */ { 0x7fffee, 23 }, 215d4afb5ceSopenharmony_ci /* 0xb7 */ { 0x7fffef, 23 }, 216d4afb5ceSopenharmony_ci /* 0xb8 */ { 0xfffea, 20 }, 217d4afb5ceSopenharmony_ci /* 0xb9 */ { 0x3fffe2, 22 }, 218d4afb5ceSopenharmony_ci /* 0xba */ { 0x3fffe3, 22 }, 219d4afb5ceSopenharmony_ci /* 0xbb */ { 0x3fffe4, 22 }, 220d4afb5ceSopenharmony_ci /* 0xbc */ { 0x7ffff0, 23 }, 221d4afb5ceSopenharmony_ci /* 0xbd */ { 0x3fffe5, 22 }, 222d4afb5ceSopenharmony_ci /* 0xbe */ { 0x3fffe6, 22 }, 223d4afb5ceSopenharmony_ci /* 0xbf */ { 0x7ffff1, 23 }, 224d4afb5ceSopenharmony_ci /* 0xc0 */ { 0x3ffffe0, 26 }, 225d4afb5ceSopenharmony_ci /* 0xc1 */ { 0x3ffffe1, 26 }, 226d4afb5ceSopenharmony_ci /* 0xc2 */ { 0xfffeb, 20 }, 227d4afb5ceSopenharmony_ci /* 0xc3 */ { 0x7fff1, 19 }, 228d4afb5ceSopenharmony_ci /* 0xc4 */ { 0x3fffe7, 22 }, 229d4afb5ceSopenharmony_ci /* 0xc5 */ { 0x7ffff2, 23 }, 230d4afb5ceSopenharmony_ci /* 0xc6 */ { 0x3fffe8, 22 }, 231d4afb5ceSopenharmony_ci /* 0xc7 */ { 0x1ffffec, 25 }, 232d4afb5ceSopenharmony_ci /* 0xc8 */ { 0x3ffffe2, 26 }, 233d4afb5ceSopenharmony_ci /* 0xc9 */ { 0x3ffffe3, 26 }, 234d4afb5ceSopenharmony_ci /* 0xca */ { 0x3ffffe4, 26 }, 235d4afb5ceSopenharmony_ci /* 0xcb */ { 0x7ffffde, 27 }, 236d4afb5ceSopenharmony_ci 237d4afb5ceSopenharmony_ci /* 0xcc */ { 0x7ffffdf, 27 }, 238d4afb5ceSopenharmony_ci /* 0xcd */ { 0x3ffffe5, 26 }, 239d4afb5ceSopenharmony_ci /* 0xce */ { 0xfffff1, 24 }, 240d4afb5ceSopenharmony_ci /* 0xcf */ { 0x1ffffed, 25 }, 241d4afb5ceSopenharmony_ci /* 0xd0 */ { 0x7fff2, 19 }, 242d4afb5ceSopenharmony_ci /* 0xd1 */ { 0x1fffe3, 21 }, 243d4afb5ceSopenharmony_ci /* 0xd2 */ { 0x3ffffe6, 26 }, 244d4afb5ceSopenharmony_ci /* 0xd3 */ { 0x7ffffe0, 27 }, 245d4afb5ceSopenharmony_ci /* 0xd4 */ { 0x7ffffe1, 27 }, 246d4afb5ceSopenharmony_ci /* 0xd5 */ { 0x3ffffe7, 26 }, 247d4afb5ceSopenharmony_ci /* 0xd6 */ { 0x7ffffe2, 27 }, 248d4afb5ceSopenharmony_ci /* 0xd7 */ { 0xfffff2, 24 }, 249d4afb5ceSopenharmony_ci /* 0xd8 */ { 0x1fffe4, 21 }, 250d4afb5ceSopenharmony_ci /* 0xd9 */ { 0x1fffe5, 21 }, 251d4afb5ceSopenharmony_ci /* 0xda */ { 0x3ffffe8, 26 }, 252d4afb5ceSopenharmony_ci /* 0xdb */ { 0x3ffffe9, 26 }, 253d4afb5ceSopenharmony_ci /* 0xdc */ { 0xffffffd, 28 }, 254d4afb5ceSopenharmony_ci /* 0xdd */ { 0x7ffffe3, 27 }, 255d4afb5ceSopenharmony_ci /* 0xde */ { 0x7ffffe4, 27 }, 256d4afb5ceSopenharmony_ci /* 0xdf */ { 0x7ffffe5, 27 }, 257d4afb5ceSopenharmony_ci /* 0xe0 */ { 0xfffec, 20 }, 258d4afb5ceSopenharmony_ci /* 0xe1 */ { 0xfffff3, 24 }, 259d4afb5ceSopenharmony_ci /* 0xe2 */ { 0xfffed, 20 }, 260d4afb5ceSopenharmony_ci /* 0xe3 */ { 0x1fffe6, 21 }, 261d4afb5ceSopenharmony_ci /* 0xe4 */ { 0x3fffe9, 22 }, 262d4afb5ceSopenharmony_ci /* 0xe5 */ { 0x1fffe7, 21 }, 263d4afb5ceSopenharmony_ci /* 0xe6 */ { 0x1fffe8, 21 }, 264d4afb5ceSopenharmony_ci /* 0xe7 */ { 0x7ffff3, 23 }, 265d4afb5ceSopenharmony_ci /* 0xe8 */ { 0x3fffea, 22 }, 266d4afb5ceSopenharmony_ci /* 0xe9 */ { 0x3fffeb, 22 }, 267d4afb5ceSopenharmony_ci /* 0xea */ { 0x1ffffee, 25 }, 268d4afb5ceSopenharmony_ci /* 0xeb */ { 0x1ffffef, 25 }, 269d4afb5ceSopenharmony_ci /* 0xec */ { 0xfffff4, 24 }, 270d4afb5ceSopenharmony_ci /* 0xed */ { 0xfffff5, 24 }, 271d4afb5ceSopenharmony_ci /* 0xee */ { 0x3ffffea, 26 }, 272d4afb5ceSopenharmony_ci /* 0xef */ { 0x7ffff4, 23 }, 273d4afb5ceSopenharmony_ci /* 0xf0 */ { 0x3ffffeb, 26 }, 274d4afb5ceSopenharmony_ci /* 0xf1 */ { 0x7ffffe6, 27 }, 275d4afb5ceSopenharmony_ci /* 0xf2 */ { 0x3ffffec, 26 }, 276d4afb5ceSopenharmony_ci /* 0xf3 */ { 0x3ffffed, 26 }, 277d4afb5ceSopenharmony_ci /* 0xf4 */ { 0x7ffffe7, 27 }, 278d4afb5ceSopenharmony_ci /* 0xf5 */ { 0x7ffffe8, 27 }, 279d4afb5ceSopenharmony_ci /* 0xf6 */ { 0x7ffffe9, 27 }, 280d4afb5ceSopenharmony_ci /* 0xf7 */ { 0x7ffffea, 27 }, 281d4afb5ceSopenharmony_ci /* 0xf8 */ { 0x7ffffeb, 27 }, 282d4afb5ceSopenharmony_ci /* 0xf9 */ { 0xffffffe, 28 }, 283d4afb5ceSopenharmony_ci /* 0xfa */ { 0x7ffffec, 27 }, 284d4afb5ceSopenharmony_ci /* 0xfb */ { 0x7ffffed, 27 }, 285d4afb5ceSopenharmony_ci 286d4afb5ceSopenharmony_ci /* 0xfc */ { 0x7ffffee, 27 }, 287d4afb5ceSopenharmony_ci /* 0xfd */ { 0x7ffffef, 27 }, 288d4afb5ceSopenharmony_ci /* 0xfe */ { 0x7fffff0, 27 }, 289d4afb5ceSopenharmony_ci /* 0xff */ { 0x3ffffee, 26 }, 290d4afb5ceSopenharmony_ci /* 0x100 */ { 0x3fffffff, 30 }, 291d4afb5ceSopenharmony_ci}; 292d4afb5ceSopenharmony_ci 293d4afb5ceSopenharmony_ciint code_bit(int idx, int bit) 294d4afb5ceSopenharmony_ci{ 295d4afb5ceSopenharmony_ci if (bit < huf_literal[idx].len) 296d4afb5ceSopenharmony_ci return !!(huf_literal[idx].code & (1 << (huf_literal[idx].len - 1 - bit))); 297d4afb5ceSopenharmony_ci 298d4afb5ceSopenharmony_ci return -1; 299d4afb5ceSopenharmony_ci} 300d4afb5ceSopenharmony_ci 301d4afb5ceSopenharmony_ci#include "huftable.h" 302d4afb5ceSopenharmony_ci 303d4afb5ceSopenharmony_ci#define PARALLEL 2 304d4afb5ceSopenharmony_ci 305d4afb5ceSopenharmony_cistruct state { 306d4afb5ceSopenharmony_ci int terminal; 307d4afb5ceSopenharmony_ci int state[PARALLEL]; 308d4afb5ceSopenharmony_ci int bytepos; 309d4afb5ceSopenharmony_ci 310d4afb5ceSopenharmony_ci int real_pos; 311d4afb5ceSopenharmony_ci}; 312d4afb5ceSopenharmony_ci 313d4afb5ceSopenharmony_cistruct state state[2000]; 314d4afb5ceSopenharmony_ciunsigned char terms[2000]; 315d4afb5ceSopenharmony_ciint next = 1; 316d4afb5ceSopenharmony_ci 317d4afb5ceSopenharmony_ciint lextable_decode(int pos, char c) 318d4afb5ceSopenharmony_ci{ 319d4afb5ceSopenharmony_ci int q = pos + !!c; 320d4afb5ceSopenharmony_ci 321d4afb5ceSopenharmony_ci if (lextable_terms[q >> 3] & (1 << (q & 7))) /* terminal */ 322d4afb5ceSopenharmony_ci return lextable[q] | 0x8000; 323d4afb5ceSopenharmony_ci 324d4afb5ceSopenharmony_ci return pos + (lextable[q] << 1); 325d4afb5ceSopenharmony_ci} 326d4afb5ceSopenharmony_ci 327d4afb5ceSopenharmony_ciint main(void) 328d4afb5ceSopenharmony_ci{ 329d4afb5ceSopenharmony_ci int n = 0; 330d4afb5ceSopenharmony_ci int m = 0; 331d4afb5ceSopenharmony_ci int prev; 332d4afb5ceSopenharmony_ci char c; 333d4afb5ceSopenharmony_ci int walk; 334d4afb5ceSopenharmony_ci int saw; 335d4afb5ceSopenharmony_ci int y; 336d4afb5ceSopenharmony_ci int j; 337d4afb5ceSopenharmony_ci int pos = 0; 338d4afb5ceSopenharmony_ci int biggest = 0; 339d4afb5ceSopenharmony_ci int fails = 0; 340d4afb5ceSopenharmony_ci 341d4afb5ceSopenharmony_ci m = 0; 342d4afb5ceSopenharmony_ci while (m < LWS_ARRAY_SIZE(state)) { 343d4afb5ceSopenharmony_ci for (j = 0; j < PARALLEL; j++) { 344d4afb5ceSopenharmony_ci state[m].state[j] = 0xffff; 345d4afb5ceSopenharmony_ci state[m].terminal = 0; 346d4afb5ceSopenharmony_ci } 347d4afb5ceSopenharmony_ci m++; 348d4afb5ceSopenharmony_ci } 349d4afb5ceSopenharmony_ci 350d4afb5ceSopenharmony_ci while (n < LWS_ARRAY_SIZE(huf_literal)) { 351d4afb5ceSopenharmony_ci 352d4afb5ceSopenharmony_ci m = 0; 353d4afb5ceSopenharmony_ci walk = 0; 354d4afb5ceSopenharmony_ci prev = 0; 355d4afb5ceSopenharmony_ci 356d4afb5ceSopenharmony_ci while (m < huf_literal[n].len) { 357d4afb5ceSopenharmony_ci 358d4afb5ceSopenharmony_ci saw = 0; 359d4afb5ceSopenharmony_ci if (state[walk].state[code_bit(n, m)] != 0xffff) { 360d4afb5ceSopenharmony_ci /* exists -- go forward */ 361d4afb5ceSopenharmony_ci walk = state[walk].state[code_bit(n, m)]; 362d4afb5ceSopenharmony_ci goto again; 363d4afb5ceSopenharmony_ci } 364d4afb5ceSopenharmony_ci 365d4afb5ceSopenharmony_ci /* something we didn't see before */ 366d4afb5ceSopenharmony_ci 367d4afb5ceSopenharmony_ci state[walk].state[code_bit(n, m)] = next; 368d4afb5ceSopenharmony_ci walk = next++; 369d4afb5ceSopenharmony_ciagain: 370d4afb5ceSopenharmony_ci m++; 371d4afb5ceSopenharmony_ci } 372d4afb5ceSopenharmony_ci 373d4afb5ceSopenharmony_ci state[walk].terminal = n++; 374d4afb5ceSopenharmony_ci state[walk].state[0] = 0; /* terminal marker */ 375d4afb5ceSopenharmony_ci } 376d4afb5ceSopenharmony_ci 377d4afb5ceSopenharmony_ci walk = 0; 378d4afb5ceSopenharmony_ci for (n = 0; n < next; n++) { 379d4afb5ceSopenharmony_ci state[n].bytepos = walk; 380d4afb5ceSopenharmony_ci walk += (2 * 2); 381d4afb5ceSopenharmony_ci } 382d4afb5ceSopenharmony_ci 383d4afb5ceSopenharmony_ci /* compute everyone's position first */ 384d4afb5ceSopenharmony_ci 385d4afb5ceSopenharmony_ci pos = 0; 386d4afb5ceSopenharmony_ci walk = 0; 387d4afb5ceSopenharmony_ci for (n = 0; n < next; n++) { 388d4afb5ceSopenharmony_ci 389d4afb5ceSopenharmony_ci state[n].real_pos = pos; 390d4afb5ceSopenharmony_ci 391d4afb5ceSopenharmony_ci if (state[n].state[0]) /* nonterminal */ 392d4afb5ceSopenharmony_ci pos += 2; 393d4afb5ceSopenharmony_ci 394d4afb5ceSopenharmony_ci walk ++; 395d4afb5ceSopenharmony_ci } 396d4afb5ceSopenharmony_ci 397d4afb5ceSopenharmony_ci fprintf(stdout, "static unsigned char lextable[] = {\n"); 398d4afb5ceSopenharmony_ci 399d4afb5ceSopenharmony_ci#define TERMINAL_MASK 0x8000 400d4afb5ceSopenharmony_ci 401d4afb5ceSopenharmony_ci walk = 0; 402d4afb5ceSopenharmony_ci pos = 0; 403d4afb5ceSopenharmony_ci 404d4afb5ceSopenharmony_ci for (n = 0; n < next; n++) { 405d4afb5ceSopenharmony_ci for (m = 0; m < 2; m++) { 406d4afb5ceSopenharmony_ci saw = state[n].state[m]; 407d4afb5ceSopenharmony_ci 408d4afb5ceSopenharmony_ci if (saw == 0) { // c is a terminal then 409d4afb5ceSopenharmony_ci m = 2; 410d4afb5ceSopenharmony_ci continue; 411d4afb5ceSopenharmony_ci } 412d4afb5ceSopenharmony_ci if (!m) 413d4afb5ceSopenharmony_ci fprintf(stdout, "/* pos %04x: %3d */ ", 414d4afb5ceSopenharmony_ci state[n].real_pos, n); 415d4afb5ceSopenharmony_ci else 416d4afb5ceSopenharmony_ci fprintf(stdout, " "); 417d4afb5ceSopenharmony_ci 418d4afb5ceSopenharmony_ci if (saw == 0xffff) { 419d4afb5ceSopenharmony_ci fprintf(stdout, 420d4afb5ceSopenharmony_ci " 0xff, 0xff, /* 0 = fail */\n "); 421d4afb5ceSopenharmony_ci pos ++; /* fail */ 422d4afb5ceSopenharmony_ci fails++; 423d4afb5ceSopenharmony_ci continue; 424d4afb5ceSopenharmony_ci } 425d4afb5ceSopenharmony_ci 426d4afb5ceSopenharmony_ci if (state[saw].state[0] == 0) { /* points to terminal */ 427d4afb5ceSopenharmony_ci fprintf(stdout, " /* terminal %d */ 0x%02X,\n", 428d4afb5ceSopenharmony_ci state[saw].terminal, 429d4afb5ceSopenharmony_ci state[saw].terminal & 0xff); 430d4afb5ceSopenharmony_ci terms[(state[n].real_pos + m) >> 3] |= 431d4afb5ceSopenharmony_ci 1 << ((state[n].real_pos + m) & 7); 432d4afb5ceSopenharmony_ci pos++; 433d4afb5ceSopenharmony_ci walk++; 434d4afb5ceSopenharmony_ci continue; 435d4afb5ceSopenharmony_ci } 436d4afb5ceSopenharmony_ci 437d4afb5ceSopenharmony_ci j = (state[saw].real_pos - q) >> 1; 438d4afb5ceSopenharmony_ci 439d4afb5ceSopenharmony_ci if (j > biggest) 440d4afb5ceSopenharmony_ci biggest = j; 441d4afb5ceSopenharmony_ci 442d4afb5ceSopenharmony_ci if (j > 0xffff) { 443d4afb5ceSopenharmony_ci fprintf(stderr, 444d4afb5ceSopenharmony_ci "Jump > 64K bytes ahead (%d to %d)\n", 445d4afb5ceSopenharmony_ci state[n].real_pos, state[saw].real_pos); 446d4afb5ceSopenharmony_ci return 1; 447d4afb5ceSopenharmony_ci } 448d4afb5ceSopenharmony_ci 449d4afb5ceSopenharmony_ci fprintf(stdout, " /* %d */ 0x%02X " 450d4afb5ceSopenharmony_ci "/* (to 0x%04X state %3d) */,\n", 451d4afb5ceSopenharmony_ci m, 452d4afb5ceSopenharmony_ci j & 0xff, 453d4afb5ceSopenharmony_ci state[saw].real_pos, saw); 454d4afb5ceSopenharmony_ci pos++; 455d4afb5ceSopenharmony_ci 456d4afb5ceSopenharmony_ci walk++; 457d4afb5ceSopenharmony_ci } 458d4afb5ceSopenharmony_ci } 459d4afb5ceSopenharmony_ci 460d4afb5ceSopenharmony_ci fprintf(stdout, "/* total size %d bytes, biggest jump %d/256, fails=%d */\n};\n" 461d4afb5ceSopenharmony_ci "\n static unsigned char lextable_terms[] = {\n", 462d4afb5ceSopenharmony_ci pos, biggest, fails); 463d4afb5ceSopenharmony_ci 464d4afb5ceSopenharmony_ci for (n = 0; n < (walk + 7) / 8; n++) { 465d4afb5ceSopenharmony_ci if (!(n & 7)) 466d4afb5ceSopenharmony_ci fprintf(stdout, "\n\t"); 467d4afb5ceSopenharmony_ci fprintf(stdout, "0x%02x, ", terms[n]); 468d4afb5ceSopenharmony_ci } 469d4afb5ceSopenharmony_ci fprintf(stdout, "\n};\n"); 470d4afb5ceSopenharmony_ci 471d4afb5ceSopenharmony_ci /* 472d4afb5ceSopenharmony_ci * Try to parse every legal input string 473d4afb5ceSopenharmony_ci */ 474d4afb5ceSopenharmony_ci 475d4afb5ceSopenharmony_ci for (n = 0; n < LWS_ARRAY_SIZE(huf_literal); n++) { 476d4afb5ceSopenharmony_ci walk = 0; 477d4afb5ceSopenharmony_ci m = 0; 478d4afb5ceSopenharmony_ci y = -1; 479d4afb5ceSopenharmony_ci 480d4afb5ceSopenharmony_ci fprintf(stderr, " trying %d\n", n); 481d4afb5ceSopenharmony_ci 482d4afb5ceSopenharmony_ci while (m < huf_literal[n].len) { 483d4afb5ceSopenharmony_ci prev = walk; 484d4afb5ceSopenharmony_ci walk = lextable_decode(walk, code_bit(n, m)); 485d4afb5ceSopenharmony_ci 486d4afb5ceSopenharmony_ci if (walk == 0xffff) { 487d4afb5ceSopenharmony_ci fprintf(stderr, "failed\n"); 488d4afb5ceSopenharmony_ci return 3; 489d4afb5ceSopenharmony_ci } 490d4afb5ceSopenharmony_ci 491d4afb5ceSopenharmony_ci if (walk & 0x8000) { 492d4afb5ceSopenharmony_ci y = walk & 0x7fff; 493d4afb5ceSopenharmony_ci if (y == 0 && m == 29) { 494d4afb5ceSopenharmony_ci y |= 0x100; 495d4afb5ceSopenharmony_ci fprintf(stdout, 496d4afb5ceSopenharmony_ci "\n/* state that points to " 497d4afb5ceSopenharmony_ci "0x100 for disambiguation with " 498d4afb5ceSopenharmony_ci "0x0 */\n" 499d4afb5ceSopenharmony_ci "#define HUFTABLE_0x100_PREV " 500d4afb5ceSopenharmony_ci "%d\n", prev); 501d4afb5ceSopenharmony_ci } 502d4afb5ceSopenharmony_ci break; 503d4afb5ceSopenharmony_ci } 504d4afb5ceSopenharmony_ci m++; 505d4afb5ceSopenharmony_ci } 506d4afb5ceSopenharmony_ci 507d4afb5ceSopenharmony_ci if (y != n) { 508d4afb5ceSopenharmony_ci fprintf(stderr, "decode failed %d got %d (0x%x)\n", n, y, y); 509d4afb5ceSopenharmony_ci return 4; 510d4afb5ceSopenharmony_ci } 511d4afb5ceSopenharmony_ci } 512d4afb5ceSopenharmony_ci 513d4afb5ceSopenharmony_ci fprintf(stderr, "All decode OK\n"); 514d4afb5ceSopenharmony_ci 515d4afb5ceSopenharmony_ci return 0; 516d4afb5ceSopenharmony_ci} 517