00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035
00036
00037
00038
00039
00040
00041
00042
00043
00044 #include "config.h"
00045
00046 #include "chattr.h"
00047 #include <stdlib.h>
00048 #include <stdio.h>
00049 #include <ctype.h>
00050
00051 static void zeroTables(void);
00052 static void markString(attr_t macro, char const* s);
00053 static void unMarkString(attr_t macro, char const* s);
00054 static void markRange(attr_t macro, char from, char to);
00055 static void moveMacro(attr_t from, attr_t to);
00056 static void setLowHi(char const firstlow, char const lastlow, char const firsthi);
00057
00058 char NTL_tolower_tab[1 + CHAR_MAX - CHAR_MIN];
00059 char NTL_toupper_tab[1 + CHAR_MAX - CHAR_MIN];
00060 attr_t NTL_char_attrib[1 + CHAR_MAX - CHAR_MIN];
00061
00062
00063
00064
00065
00066
00067 static void makeTables(void)
00068 {
00069 zeroTables();
00070
00071 markString(pgn_blank, "\011\013\014\040");
00072
00073 markString(pgn_eol, "\r\n");
00074
00075 markRange(pgn_file, 'a', 'h');
00076
00077 markRange(pgn_rank, '1', '8');
00078
00079 markString(pgn_piece, "RNBQK");
00080
00081 markString(pgn_check, "+#");
00082
00083 markString(pgn_punctuation_junk, ",;");
00084
00085 markRange(pgn_digit, '0', '9');
00086
00087 markString(pgn_alpha, "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ");
00088
00089 moveMacro(pgn_alnum, pgn_tagname_continuation);
00090 markString(pgn_tagname_continuation, "_");
00091
00092 markString(pgn_tag_separator_junk, ":=");
00093
00094 markRange(pgn_printable_string, -96, -1);
00095 markRange(pgn_printable_string, 35, 91);
00096 markRange(pgn_printable_string, 93, 126);
00097 markString(pgn_printable_string, " !");
00098
00099 moveMacro(pgn_eol, pgn_quote_or_eol);
00100 markString(pgn_quote_or_eol, "\"");
00101
00102 markString(pgn_comment_start, "{;");
00103
00104 markRange(pgn_printable_comment, -96, -1);
00105 markRange(pgn_printable_comment, 32, 124);
00106 moveMacro(pgn_white_space, pgn_printable_comment);
00107 markString(pgn_printable_comment, "~");
00108
00109 markRange(pgn_printable, -96, -1);
00110 markRange(pgn_printable, 32, 126);
00111
00112
00113
00114 setLowHi('a', 'z', 'A');
00115 setLowHi('\xe0', '\xf6', '\xc0');
00116 setLowHi('\xf8', '\xfe', '\xd8');
00117 }
00118
00119
00120
00121
00122
00123
00124 static void dumphw(attr_t* p, int beg);
00125 static void dumphb(char* p, int beg);
00126
00127 int main(void)
00128 {
00129 int i;
00130
00131
00132 makeTables();
00133
00134
00135 printf("/*\n * Automatically Generated Tables - DO NOT EDIT\n* /\n");
00136 printf("#include <limits.h>\n#include \"chattr.h\"\n");
00137
00138
00139 printf("char const ToLowerTab_8859_1[] = {\n");
00140 printf("#if (CHAR_MIN<0)\n");
00141 i = (int)((char)SCHAR_MIN);
00142 dumphb(NTL_tolower_tab, i);
00143 printf(" ,\n");
00144 printf("#endif /* (CHAR_MIN<0)* /\n");
00145 i = 0;
00146 dumphb(NTL_tolower_tab, i);
00147 printf("#if (!(CHAR_MIN<0))\n");
00148 printf(" ,\n");
00149 i = (int)((char)SCHAR_MIN);
00150 dumphb(NTL_tolower_tab, i);
00151 printf("#endif /* (!(CHAR_MIN<0))* /\n");
00152 printf(" };\n\n");
00153
00154
00155 printf("char const ToUpperTab_8859_1[] = {\n");
00156 printf("#if (CHAR_MIN<0)\n");
00157 i = (int)((char)SCHAR_MIN);
00158 dumphb(NTL_toupper_tab, i);
00159 printf(" ,\n");
00160 printf("#endif /* (CHAR_MIN<0)* /\n");
00161 i = 0;
00162 dumphb(NTL_toupper_tab, i);
00163 printf("#if (!(CHAR_MIN<0))\n");
00164 printf(" ,\n");
00165 i = (int)((char)SCHAR_MIN);
00166 dumphb(NTL_toupper_tab, i);
00167 printf("#endif /* (!(CHAR_MIN<0))* /\n");
00168 printf(" };\n\n");
00169
00170
00171 printf("attr_t const PGN_CharAttrTab[] = {\n");
00172 printf("#if (CHAR_MIN<0)\n");
00173 i = (int)((char)SCHAR_MIN);
00174 dumphw(NTL_char_attrib, i);
00175 printf(" ,\n");
00176 printf("#endif /* (CHAR_MIN<0)* /\n");
00177 i = 0;
00178 dumphw(NTL_char_attrib, i);
00179 printf("#if (!(CHAR_MIN<0))\n");
00180 printf(" ,\n");
00181 i = (int)((char)SCHAR_MIN);
00182 dumphw(NTL_char_attrib, i);
00183 printf("#endif /* (!(CHAR_MIN<0))* /\n");
00184 printf(" };\n\n");
00185 }
00186
00187
00188
00189 static void zeroTables(void)
00190 {
00191 for (int i = CHAR_MIN; i <= CHAR_MAX; ++i)
00192 {
00193 NTL_tolower_tab[i - CHAR_MIN] = (char)i;
00194 NTL_toupper_tab[i - CHAR_MIN] = (char)i;
00195 NTL_char_attrib[i - CHAR_MIN] = 0x0000;
00196 }
00197 }
00198
00199 static void markString(attr_t macro, char const* s)
00200 {
00201 while (*s)
00202 NTL_char_attrib[*(s++) - CHAR_MIN] |= macro;
00203 }
00204
00205 static void unMarkString(attr_t macro, char const* s)
00206 {
00207 while (*s)
00208 NTL_char_attrib[*(s++) - CHAR_MIN]& = ~macro;
00209 }
00210
00211 static void markRange(attr_t macro, char from, char to)
00212 {
00213 for (int i = CHAR_MIN; i <= CHAR_MAX; ++i)
00214 if (((unsigned char)i >= (unsigned char)from)
00215 && ((unsigned char)i <= (unsigned char)to))
00216 NTL_char_attrib[(char)i - CHAR_MIN] |= macro;
00217 }
00218
00219 static void moveMacro(attr_t from, attr_t to)
00220 {
00221 for (int i = CHAR_MIN; i <= CHAR_MAX; ++i)
00222 if (NTL_char_attrib[i - CHAR_MIN] & from)
00223 NTL_char_attrib[i - CHAR_MIN] |= to;
00224 }
00225
00226 static void setLowHi(char const firstlow, char const lastlow, char const firsthi)
00227 {
00228 for (int i = CHAR_MIN; i <= CHAR_MAX; ++i)
00229 if (((unsigned char)i >= (unsigned char)firstlow)
00230 && ((unsigned char)i <= (unsigned char)lastlow))
00231 {
00232 int j = ((int)((char)(i + (int)(firsthi - firstlow))));
00233 NTL_tolower_tab[((char)j) - CHAR_MIN] = (char)i;
00234 NTL_toupper_tab[((char)i) - CHAR_MIN] = (char)j;
00235 }
00236 }
00237
00238
00239
00240
00241 #define ROWSIZE 8
00242
00243 static void dumphb(char* tbl, int beg)
00244 {
00245 int i, j, k;
00246 char* p =& tbl[beg - CHAR_MIN];
00247 unsigned char c;
00248 for (i = 0; i <= SCHAR_MAX; i += ROWSIZE)
00249 {
00250 k = i + ROWSIZE - 1;
00251 if (k > SCHAR_MAX)
00252 k = SCHAR_MAX;
00253
00254 c = (unsigned char)(beg + i);
00255 printf("/*");
00256 if ((c > 0) && (c < SCHAR_MAX) && (isprint(c)) && (c != '\\')
00257 && (c != '\''))
00258 printf(" '%c'", c);
00259 else
00260 printf(" x%02x", ((int)c));
00261
00262 c = (unsigned char)(beg + k);
00263 printf("-");
00264 if ((c > 0) && (c < SCHAR_MAX) && (isprint(c)) && (c != '\\')
00265 && (c != '\''))
00266 printf("'%c'", c);
00267 else
00268 printf("x%02x", ((int)c));
00269 printf("* /");
00270
00271 for (j = i; j <= k; j++)
00272 {
00273 c = p[j];
00274 if ((c > 0) && (c < SCHAR_MAX) && (isprint(c)) && (c != '\\')
00275 && (c != '\''))
00276 printf(" '%c'", c);
00277 else
00278 printf(" '\\x%02x'", ((int)c));
00279 if (j < SCHAR_MAX)
00280 printf(",");
00281 }
00282 printf("\n");
00283 }
00284 }
00285
00286 static void dumphw(attr_t* tbl, int beg)
00287 {
00288 int i, j, k;
00289 attr_t* p =& tbl[beg - CHAR_MIN];
00290 unsigned char c;
00291 for (i = 0; i <= SCHAR_MAX; i += ROWSIZE)
00292 {
00293 k = i + ROWSIZE - 1;
00294 if (k > SCHAR_MAX)
00295 k = SCHAR_MAX;
00296
00297 c = (unsigned char)(beg + i);
00298 printf("/*");
00299 if ((c > 0) && (c < SCHAR_MAX) && (isprint(c)) && (c != '\\')
00300 && (c != '\''))
00301 printf(" '%c'", c);
00302 else
00303 printf(" x%02x", ((int)c));
00304
00305 c = (unsigned char)(beg + k);
00306 printf("-");
00307 if ((c > 0) && (c < SCHAR_MAX) && (isprint(c)) && (c != '\\')
00308 && (c != '\''))
00309 printf("'%c'", c);
00310 else
00311 printf("x%02x", ((int)c));
00312 printf("* /");
00313
00314 for (j = i; j <= k; j++)
00315 {
00316 printf(" 0x%04x", p[j] & 0xffffffff);
00317 if (j < SCHAR_MAX)
00318 printf(",");
00319 }
00320 printf("\n");
00321 }
00322 }
00323