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 #include "xsb_config.h"
00027
00028 #include <stdio.h>
00029 #include <stdlib.h>
00030 #include <math.h>
00031
00032 #include "auxlry.h"
00033 #include "cell_xsb.h"
00034 #include "context.h"
00035 #include "token_xsb.h"
00036 #include "psc_xsb.h"
00037 #include "subp.h"
00038 #include "register.h"
00039 #include "error_xsb.h"
00040 #include "memory_xsb.h"
00041
00042 #define exit_if_null(x) {\
00043 if(x == NULL){\
00044 xsb_exit("Malloc Failed !\n");\
00045 }\
00046 }
00047
00048 #define Char unsigned char
00049 #define AlphabetSize 256
00050
00051 #define InRange(X,L,U) ((unsigned)((X)-(L)) <= (unsigned)((U)-(L)))
00052 #define IsLayout(X) InRange(InType(X), SPACE, EOLN)
00053
00054
00055
00056
00057
00058
00059
00060
00061
00062 #define InType(c) (intab.chtype+1)[c]
00063 #define DigVal(c) (digval+1)[c]
00064
00065
00066
00067 struct CHARS
00068 {
00069 int eolcom;
00070 int endeol;
00071 int begcom;
00072 int astcom;
00073 int endcom;
00074 int radix;
00075 int dpoint;
00076 int escape;
00077 int termin;
00078 char chtype[AlphabetSize+1];
00079 };
00080
00081 struct CHARS intab =
00082 {
00083 '%',
00084 -1,
00085 '/',
00086 '*',
00087 '/',
00088 '\'',
00089 '.',
00090 '\\',
00091 '.',
00092 {
00093 EOFCH,
00094
00095 SPACE, SPACE, SPACE, SPACE, SPACE, SPACE, SPACE, SPACE,
00096
00097 SPACE, SPACE, EOLN, SPACE, EOLN, SPACE, SPACE, SPACE,
00098
00099 SPACE, SPACE, SPACE, SPACE, SPACE, SPACE, SPACE, SPACE,
00100
00101 SPACE, SPACE, SPACE, SPACE, SPACE, SPACE, SPACE, SPACE,
00102
00103 SPACE, NOBLE, LISQT, SIGN, SIGN, PUNCT, SIGN, ATMQT,
00104
00105 PUNCT, PUNCT, SIGN, SIGN, PUNCT, SIGN, SIGN, SIGN,
00106
00107 DIGIT, DIGIT, DIGIT, DIGIT, DIGIT, DIGIT, DIGIT, DIGIT,
00108
00109 DIGIT, DIGIT, SIGN, PUNCT, SIGN, SIGN, SIGN, SIGN,
00110
00111 SIGN, UPPER, UPPER, UPPER, UPPER, UPPER, UPPER, UPPER,
00112
00113 UPPER, UPPER, UPPER, UPPER, UPPER, UPPER, UPPER, UPPER,
00114
00115 UPPER, UPPER, UPPER, UPPER, UPPER, UPPER, UPPER, UPPER,
00116
00117 UPPER, UPPER, UPPER, PUNCT, SIGN, PUNCT, SIGN, BREAK,
00118
00119 SIGN, LOWER, LOWER, LOWER, LOWER, LOWER, LOWER, LOWER,
00120
00121 LOWER, LOWER, LOWER, LOWER, LOWER, LOWER, LOWER, LOWER,
00122
00123 LOWER, LOWER, LOWER, LOWER, LOWER, LOWER, LOWER, LOWER,
00124
00125 LOWER, LOWER, LOWER, PUNCT, PUNCT, PUNCT, SIGN, SPACE,
00126
00127 SPACE, SPACE, SPACE, SPACE, SPACE, SPACE, SPACE, SPACE,
00128
00129 SPACE, SPACE, SPACE, SPACE, SPACE, SPACE, SPACE, SPACE,
00130
00131 SPACE, SPACE, SPACE, SPACE, SPACE, SPACE, SPACE, SPACE,
00132
00133 SPACE, SPACE, SPACE, SPACE, SPACE, SPACE, SPACE, SPACE,
00134
00135 SPACE, SIGN, SIGN, SIGN, SIGN, SIGN, SIGN, SIGN,
00136
00137 SIGN, SIGN, LOWER, SIGN, SIGN, SIGN, SIGN, SIGN,
00138
00139 SIGN, SIGN, LOWER, LOWER, SIGN, SIGN, SIGN, SIGN,
00140
00141 SIGN, LOWER, LOWER, SIGN, SIGN, SIGN, SIGN, SIGN,
00142
00143 UPPER, UPPER, UPPER, UPPER, UPPER, UPPER, UPPER, UPPER,
00144
00145 UPPER, UPPER, UPPER, UPPER, UPPER, UPPER, UPPER, UPPER,
00146
00147 UPPER, UPPER, UPPER, UPPER, UPPER, UPPER, UPPER, SIGN,
00148
00149 UPPER, UPPER, UPPER, UPPER, UPPER, UPPER, UPPER, LOWER,
00150
00151 LOWER, LOWER, LOWER, LOWER, LOWER, LOWER, LOWER, LOWER,
00152
00153 LOWER, LOWER, LOWER, LOWER, LOWER, LOWER, LOWER, LOWER,
00154
00155 #ifdef vms
00156 LOWER, LOWER, LOWER, LOWER, LOWER, LOWER, LOWER, LOWER,
00157 #else
00158 LOWER, LOWER, LOWER, LOWER, LOWER, LOWER, LOWER, SIGN,
00159 #endif
00160
00161 #ifdef vms
00162 LOWER, LOWER, LOWER, LOWER, LOWER, LOWER, LOWER, SPACE
00163 #else
00164 LOWER, LOWER, LOWER, LOWER, LOWER, LOWER, LOWER, LOWER
00165 #endif
00166 }};
00167
00168 char digval[AlphabetSize+1] =
00169 {
00170 99,
00171
00172 99, 99, 99, 99, 99, 99, 99, 99,
00173
00174 99, 99, 99, 99, 99, 99, 99, 99,
00175
00176 99, 99, 99, 99, 99, 99, 99, 99,
00177
00178 99, 99, 99, 99, 99, 99, 99, 99,
00179
00180 99, 99, 99, 99, 99, 99, 99, 99,
00181
00182 99, 99, 99, 99, 99, 99, 99, 99,
00183
00184 0, 1, 2, 3, 4, 5, 6, 7,
00185
00186 8, 9, 99, 99, 99, 99, 99, 99,
00187
00188 99, 10, 11, 12, 13, 14, 15, 16,
00189
00190 17, 18, 19, 20, 21, 22, 23, 24,
00191
00192 25, 26, 27, 28, 29, 30, 31, 32,
00193
00194 33, 34, 35, 99, 99, 99, 99, 0,
00195
00196 99, 10, 11, 12, 13, 14, 15, 16,
00197
00198 17, 18, 19, 20, 21, 22, 23, 24,
00199
00200 25, 26, 27, 28, 29, 30, 31, 32,
00201
00202 33, 34, 35, 99, 99, 99, 99, 99,
00203
00204 99, 99, 99, 99, 99, 99, 99, 99,
00205
00206 99, 99, 99, 99, 99, 99, 99, 99,
00207
00208 99, 99, 99, 99, 99, 99, 99, 99,
00209
00210 99, 99, 99, 99, 99, 99, 99, 99,
00211
00212 99, 99, 99, 99, 99, 99, 99, 99,
00213
00214 99, 99, 99, 99, 99, 99, 99, 99,
00215
00216 99, 99, 2, 3, 99, 99, 99, 99,
00217
00218 99, 1, 99, 99, 99, 99, 99, 99,
00219
00220 99, 99, 99, 99, 99, 99, 99, 99,
00221
00222 99, 99, 99, 99, 99, 99, 99, 99,
00223
00224 99, 99, 99, 99, 99, 99, 99, 99,
00225
00226 99, 99, 99, 99, 99, 99, 99, 99,
00227
00228 99, 99, 99, 99, 99, 99, 99, 99,
00229
00230 99, 99, 99, 99, 99, 99, 99, 99,
00231
00232 99, 99, 99, 99, 99, 99, 99, 99,
00233
00234 99, 99, 99, 99, 99, 99, 99, 99
00235 };
00236
00237 int intype(int c)
00238 {
00239 return (intab.chtype+1)[c];
00240 }
00241
00242 static void SyntaxError(char *description)
00243 {
00244 xsb_abort("[TOKENIZER] Syntax error: %s", description);
00245 }
00246
00247
00248 void unGetC(int d, FILE *card, STRFILE *instr)
00249 {
00250 if (instr) {
00251 (instr)->strcnt++;
00252 (instr)->strptr--;
00253 }
00254 else ungetc(d, card);
00255 }
00256
00257
00258
00259
00260
00261
00262
00263
00264
00265
00266
00267
00268
00269
00270
00271
00272
00273
00274
00275
00276
00277
00278
00279
00280
00281
00282
00283
00284
00285
00286
00287
00288
00289
00290
00291
00292
00293
00294
00295
00296
00297
00298
00299
00300
00301
00302 #ifndef MULTI_THREAD
00303 struct token_t res_str;
00304 struct token_t *token = &res_str;
00305
00306 int lastc = ' ';
00307 char* strbuff = NULL;
00308
00309 int strbuff_len = InitStrLen;
00310
00311
00312 double double_v;
00313 long rad_int;
00314 #endif
00315
00316 char tok2long[] = "token too long";
00317 char eofinrem[] = "end of file in comment";
00318 char badexpt[] = "bad exponent";
00319 char badradix[] = "radix not 0 or 2..36";
00320
00321
00322
00323
00324
00325
00326
00327
00328
00329
00330
00331
00332
00333
00334
00335
00336
00337
00338
00339 static int read_character(CTXTdeclc register FILE *card,
00340 register STRFILE *instr,
00341 register int q)
00342 {
00343 register int c;
00344
00345 c = GetC(card,instr);
00346 BACK: if (c < 0) {
00347 if (c == EOF)
00348 READ_ERROR: if (q < 0) {
00349 SyntaxError("end of file in character constant");
00350
00351 } else {
00352 char message[80];
00353 sprintf(message, "end of file in %cquoted%c constant", q, q);
00354 SyntaxError(message);
00355
00356 }
00357 else c = c & 0xff;
00358 }
00359 if (c == q) {
00360 c = GetC(card,instr);
00361 if (c == q) return c;
00362 lastc = c;
00363 return -1;
00364 } else
00365 if (c != intab.escape) {
00366 return c;
00367 }
00368
00369 c = GetC(card,instr);
00370 switch (c) {
00371 case EOF:
00372 clearerr(card);
00373 goto READ_ERROR;
00374 case 'a':
00375 return '\a';
00376 case 'b':
00377 return '\b';
00378 case 'f':
00379 return '\f';
00380 case '\n':
00381 while (IsLayout(c = GetC(card,instr)));
00382 goto BACK;
00383 case 'n':
00384 return '\n';
00385 case 'r':
00386 return '\r';
00387 case 't':
00388 return '\t';
00389 case 'v':
00390 return '\v';
00391 case 'x':
00392 { int i, n;
00393 for (n = 0, i = 2; --i >= 0; n = (n<<4) + DigVal(c))
00394 if (DigVal(c = GetC(card,instr)) >= 16) {
00395 if (c < 0) goto READ_ERROR;
00396 (void)unGetC(c, card, instr);
00397 break;
00398 }
00399 return n & 255;
00400 }
00401 case '0': case '1': case '2': case '3':
00402 case '4': case '5': case '6': case '7':
00403 { int i, n;
00404 for (n = c-'0', i = 2; --i >= 0; n = (n<<3) + DigVal(c))
00405 if (DigVal(c = GetC(card,instr)) >= 8) {
00406 if (c < 0) goto READ_ERROR;
00407 (void) unGetC(c, card, instr);
00408 break;
00409 }
00410 return n & 255;
00411 }
00412 case '\\':
00413 return '\\';
00414
00415
00416
00417
00418 case '"':
00419 return '"';
00420 case '`':
00421 return '`';
00422 default:
00423 (void) unGetC(c, card, instr);
00424 return '\\';
00425 }
00426 }
00427
00428
00429
00430
00431
00432
00433
00434
00435
00436
00437
00438
00439
00440
00441
00442
00443
00444
00445
00446
00447
00448 static int com0plain(register FILE *card,
00449 register STRFILE *instr,
00450 register int endeol)
00451 {
00452 register int c;
00453
00454 while ((c = GetC(card,instr)) >= 0 && c != '\n' && c != endeol) ;
00455 if (c >= 0) c = GetC(card,instr);
00456 return c;
00457 }
00458
00459
00460
00461
00462
00463
00464
00465
00466
00467
00468
00469
00470
00471
00472
00473
00474
00475
00476
00477
00478
00479
00480
00481
00482
00483
00484
00485 static int com2plain(register FILE *card,
00486 register STRFILE *instr,
00487 int astcom,
00488 int endcom)
00489 {
00490 register int c;
00491 register int state;
00492
00493 for (state = 0; (c = GetC(card,instr)) >= 0; ) {
00494 if (c == endcom && state) break;
00495 state = c == astcom;
00496 }
00497 if (c < 0) return 1;
00498 else return 0;
00499 }
00500
00501 #ifndef MULTI_THREAD
00502 int token_too_long_warning = 1;
00503 #endif
00504
00505 void realloc_strbuff(CTXTdeclc char **pstrbuff, char **ps, int *pn)
00506
00507
00508
00509
00510
00511
00512 {
00513 char *newbuff;
00514
00515 newbuff = (char *)realloc(*pstrbuff, strbuff_len * 2);
00516 exit_if_null(newbuff);
00517 if (token_too_long_warning) {
00518 xsb_warn("Extra-long token. Runaway string?");
00519 token_too_long_warning = 0;
00520 }
00521
00522 if (*pstrbuff != newbuff) {
00523
00524 *ps += newbuff - *pstrbuff;
00525 }
00526 *pstrbuff = newbuff;
00527 *pn += strbuff_len;
00528 strbuff_len *= 2;
00529 return;
00530 }
00531
00532 struct token_t *GetToken(CTXTdeclc FILE *card, STRFILE *instr, int prevch)
00533 {
00534 char *s;
00535 register int c, d = 0;
00536 long oldv = 0, newv = 0;
00537 int n;
00538
00539 if (strbuff == NULL)
00540 {
00541
00542 strbuff = (char *)mem_alloc(strbuff_len,OTHER_SPACE);
00543 exit_if_null(strbuff);
00544 }
00545 s = strbuff;
00546 n = strbuff_len;
00547
00548 c = prevch;
00549 START:
00550 switch (InType(c)) {
00551
00552 case DIGIT:
00553
00554
00555
00556
00557
00558
00559
00560 do {
00561 if (c != '_') *s++ = c;
00562 c = GetC(card,instr);
00563 } while (InType(c) <= BREAK);
00564 if (c == intab.radix) {
00565 *s = 0;
00566 for (d = 0, s = strbuff; (c = *s++);) {
00567 d = d*10-'0'+c;
00568 }
00569 if (d == 1 || d > 36) {
00570 SyntaxError(badradix);
00571
00572
00573 }
00574 if (d == 0) {
00575
00576 d = read_character(CTXTc card, instr, -1);
00577
00578 rad_int = d;
00579 d = GetC(card,instr);
00580
00581 token->nextch = d == intab.radix ? GetC(card,instr):d;
00582 token->value = (char *)(&rad_int);
00583 token->type = TK_INT;
00584 return token;
00585 }
00586
00587 NONZERO_RADIX: while (c = GetC(card,instr), DigVal(c) < d)
00588 if (c != '_') {
00589 oldv = newv;
00590 newv = newv*d + DigVal(c);
00591 if (newv < oldv || newv > MY_MAXINT) {
00592 xsb_error("Overflow in radix notation, returning float");
00593 double_v = oldv*1.0*d + DigVal(c);
00594 while (c = GetC(card,instr), DigVal(c) < 99)
00595 if (c != '_')
00596 double_v = double_v*d + DigVal(c);
00597 if (c == intab.radix)
00598 c = GetC(card,instr);
00599 token->nextch = c;
00600 token->value = (char *)(&double_v);
00601 if (c == '(')
00602 token->type = TK_REALFUNC;
00603 else
00604 token->type = TK_REAL;
00605 return token;
00606 }
00607 }
00608 rad_int = newv;
00609 if (c == intab.radix)
00610 c = GetC(card,instr);
00611 token->nextch = c;
00612 token->value = (char *)(&rad_int);
00613 if (c == '(')
00614 token->type = TK_INTFUNC;
00615 else
00616 token->type = TK_INT;
00617 return token;
00618 }
00619 else if (c == intab.dpoint) {
00620 d = GetC(card,instr);
00621 if (InType(d) == DIGIT) {
00622 LAB_DECIMAL: *s++ = '.';
00623 do {
00624 if (d != '_') *s++ = d;
00625 d = GetC(card,instr);
00626 } while (InType(d) <= BREAK);
00627 if ((d | 32) == 'e') {
00628 *s++ = 'E';
00629 d = GetC(card,instr);
00630 if (d == '-') *s++ = d, d = GetC(card,instr);
00631 else if (d == '+') d = GetC(card,instr);
00632 if (InType(d) > BREAK) {
00633 SyntaxError(badexpt);
00634
00635
00636 }
00637 do {
00638 if (d != '_') *s++ = d;
00639 d = GetC(card,instr);
00640 } while (InType(d) <= BREAK);
00641 }
00642 c = d;
00643 *s = 0;
00644 sscanf(strbuff, "%lf", &double_v);
00645 token->nextch = c;
00646 token->value = (char *)(&double_v);
00647 if (c == '(')
00648 token->type = TK_REALFUNC;
00649 else
00650 token->type = TK_REAL;
00651 return token;
00652 } else {
00653 unGetC(d, card, instr);
00654
00655 }
00656 }
00657 else if (c == 'b' || c == 'o' || c == 'x') {
00658 int oc = c;
00659 *s = 0;
00660 for (d = 0, s = strbuff; (oc = *s++);)
00661 d = d*10-'0'+oc;
00662 if (d == 0) {
00663 if (c == 'b') d = 2;
00664 else if (c == 'o') d = 8;
00665 else d = 16;
00666 } else {
00667 token->nextch = c;
00668 rad_int = d;
00669 token->value = (char *)(&rad_int);
00670 token->type = TK_INT;
00671 return token;
00672 }
00673 goto NONZERO_RADIX;
00674 }
00675 token->nextch = c;
00676 *s = 0;
00677 for (rad_int = 0, s = strbuff; (c = *s++);) {
00678 d = rad_int;
00679 rad_int = rad_int*10-'0'+c;
00680 if (rad_int < d || rad_int > MY_MAXINT) {
00681 xsb_error("Overflow in integer, returning MAX_INT");
00682 rad_int = MY_MAXINT;
00683 break;
00684 }
00685 }
00686
00687 token->value = (char *)(&rad_int);
00688 if (c == '(')
00689 token->type = TK_INTFUNC;
00690 else
00691 token->type = TK_INT;
00692 return token;
00693
00694 case BREAK:
00695 do {
00696 if (--n < 0) {
00697 realloc_strbuff(CTXTc &strbuff, &s, &n);
00698 }
00699 *s++ = c, c = GetC(card,instr);
00700 } while (InType(c) <= LOWER);
00701 *s = 0;
00702 if (c == '(') {
00703 token->nextch = c;
00704 token->value = strbuff;
00705 token->type = TK_VVARFUNC;
00706 return token;
00707 } else {
00708 token->nextch = c;
00709 token->value = strbuff;
00710 token->type = TK_VVAR;
00711 return token;
00712 }
00713
00714 case UPPER:
00715 do {
00716 if (--n < 0) {
00717 realloc_strbuff(CTXTc &strbuff, &s, &n);
00718 }
00719 *s++ = c, c = GetC(card,instr);
00720 } while (InType(c) <= LOWER);
00721 *s = 0;
00722 if (c == '(') {
00723 token->nextch = c;
00724 token->value = strbuff;
00725 token->type = TK_VARFUNC;
00726 return token;
00727 } else {
00728 token->nextch = c;
00729 token->value = strbuff;
00730 token->type = TK_VAR;
00731 return token;
00732 }
00733
00734 case LOWER:
00735 do {
00736 if (--n < 0) {
00737 realloc_strbuff(CTXTc &strbuff, &s, &n);
00738 }
00739 *s++ = c, c = GetC(card,instr);
00740 } while (InType(c) <= LOWER);
00741 *s = 0;
00742 SYMBOL: if (c == '(') {
00743 token->nextch = c;
00744 token->value = strbuff;
00745 token->type = TK_FUNC;
00746 return token;
00747 } else {
00748 token->nextch = c;
00749 token->value = strbuff;
00750 token->type = TK_ATOM;
00751 return token;
00752 }
00753
00754 case SIGN:
00755 *s = c, d = GetC(card,instr);
00756 if (c == intab.begcom && d == intab.astcom) {
00757 ASTCOM: if (com2plain(card, instr, d, intab.endcom)) {
00758 SyntaxError(eofinrem);
00759
00760
00761 }
00762 c = GetC(card,instr);
00763 goto START;
00764 } else
00765 if (c == intab.dpoint && InType(d) == DIGIT) {
00766 *s++ = '0';
00767 goto LAB_DECIMAL;
00768 }
00769 while (InType(d) == SIGN) {
00770 if (--n == 0) {
00771 realloc_strbuff(CTXTc &strbuff, &s, &n);
00772 }
00773 *++s = d, d = GetC(card,instr);
00774 }
00775 *++s = 0;
00776 if (InType(d)>=SPACE && c==intab.termin && strbuff[1]==0) {
00777 token->nextch = d;
00778 token->value = 0;
00779 token->type = TK_EOC;
00780 return token;
00781 }
00782 c = d;
00783 goto SYMBOL;
00784
00785 case NOBLE:
00786 if (c == intab.termin) {
00787 *s = 0;
00788 token->nextch = ' ';
00789 token->value = 0;
00790 token->type = TK_EOC;
00791 return token;
00792 } else
00793 if (c == intab.eolcom) {
00794 c = com0plain(card, instr, intab.endeol);
00795 goto START;
00796 }
00797 *s++ = c, *s = 0;
00798 c = GetC(card,instr);
00799 goto SYMBOL;
00800
00801 case PUNCT:
00802 if (c == intab.termin) {
00803 *s = 0;
00804 token->nextch = ' ';
00805 token->value = 0;
00806 token->type = TK_EOC;
00807 return token;
00808 } else
00809 if (c == intab.eolcom) {
00810 c = com0plain(card, instr, intab.endeol);
00811 goto START;
00812 }
00813 d = GetC(card,instr);
00814 if (c == intab.begcom && d == intab.astcom) goto ASTCOM;
00815
00816
00817
00818
00819
00820
00821
00822
00823 *s++ = c, *s = 0;
00824 token->nextch = d;
00825 token->value = strbuff;
00826
00827
00828
00829
00830
00831
00832
00833
00834 if (c == ')' && d == '(')
00835 token->type = TK_HPUNC;
00836 else
00837 token->type = TK_PUNC;
00838 return token;
00839
00840 case CHRQT:
00841
00842
00843
00844
00845
00846
00847
00848 d = read_character(CTXTc card, instr, -1);
00849 sprintf(strbuff, "%d", d);
00850 d = GetC(card,instr);
00851 rad_int = atoi(strbuff);
00852 token->nextch = d == c ? GetC(card,instr) : d;
00853 token->value = (char *)(&rad_int);
00854 token->type = TK_INT;
00855 return token;
00856
00857 case ATMQT:
00858 while ((d = read_character(CTXTc card, instr, c)) >= 0) {
00859 if (--n < 0) {
00860 realloc_strbuff(CTXTc &strbuff, &s, &n);
00861 }
00862 *s++ = d;
00863 }
00864 *s = 0;
00865 c = lastc;
00866 goto SYMBOL;
00867
00868
00869
00870
00871
00872
00873
00874
00875
00876
00877
00878
00879
00880
00881
00882
00883 case LISQT:
00884 while ((d = read_character(CTXTc card, instr, c)) >= 0) {
00885 if (--n < 0) {
00886 realloc_strbuff(CTXTc &strbuff, &s, &n);
00887 }
00888 *s++ = d;
00889 }
00890 *s = 0;
00891 token->nextch = lastc;
00892 token->value = strbuff;
00893 token->type = TK_LIST;
00894 return token;
00895
00896 case EOLN:
00897 case SPACE:
00898 c = GetC(card,instr);
00899 goto START;
00900
00901 case EOFCH:
00902 if (!instr) clearerr(card);
00903 token->nextch = ' ';
00904 token->value = 0;
00905 token->type = TK_EOF;
00906 return token;
00907
00908 }
00909
00910 xsb_abort("[Internal error] InType(%d)==%d\n", c, InType(c));
00911
00912 return FALSE;
00913 }
00914
00915
00916
00917
00918
00919
00920
00921
00922
00923
00924
00925
00926
00927
00928
00929
00930
00931
00932
00933
00934
00935
00936
00937
00938
00939
00940
00941
00942
00943
00944
00945
00946
00947
00948
00949
00950
00951
00952
00953