diff options
Diffstat (limited to 'mdk-stage1/slang/sltoken.c')
-rw-r--r-- | mdk-stage1/slang/sltoken.c | 1702 |
1 files changed, 0 insertions, 1702 deletions
diff --git a/mdk-stage1/slang/sltoken.c b/mdk-stage1/slang/sltoken.c deleted file mode 100644 index d08967a24..000000000 --- a/mdk-stage1/slang/sltoken.c +++ /dev/null @@ -1,1702 +0,0 @@ -/* Copyright (c) 1998, 1999, 2001 John E. Davis - * This file is part of the S-Lang library. - * - * You may distribute under the terms of either the GNU General Public - * License or the Perl Artistic License. - */ -#include "slinclud.h" - -#include "slang.h" -#include "_slang.h" - -#define MAX_TOKEN_LEN 254 -#define MAX_FILE_LINE_LEN 256 - -static char Empty_Line[1] = {0}; - -static int Default_Compile_Line_Num_Info; -static char *Input_Line = Empty_Line; -static char *Input_Line_Pointer; - -static SLPreprocess_Type *This_SLpp; - -static SLang_Load_Type *LLT; - -static char *map_token_to_string (_SLang_Token_Type *tok) -{ - char *s; - static char numbuf [32]; - unsigned char type; - s = NULL; - - if (tok != NULL) type = tok->type; - else type = 0; - - switch (type) - { - case 0: - s = "??"; - break; - - case CHAR_TOKEN: - case SHORT_TOKEN: - case INT_TOKEN: - case LONG_TOKEN: - s = numbuf; - sprintf (s, "%ld", tok->v.long_val); - break; - - case UCHAR_TOKEN: - case USHORT_TOKEN: - case UINT_TOKEN: - case ULONG_TOKEN: - s = numbuf; - sprintf (s, "%lu", (unsigned long)tok->v.long_val); - break; - - case OBRACKET_TOKEN: s = "["; break; - case CBRACKET_TOKEN: s = "]"; break; - case OPAREN_TOKEN: s = "("; break; - case CPAREN_TOKEN: s = ")"; break; - case OBRACE_TOKEN: s = "{"; break; - case CBRACE_TOKEN: s = "}"; break; - case DEREF_TOKEN: s = "@"; break; - case POUND_TOKEN: s = "#"; break; - case COMMA_TOKEN: s = ","; break; - case SEMICOLON_TOKEN: s = ";"; break; - case COLON_TOKEN: s = ":"; break; - -#if SLANG_HAS_FLOAT - case FLOAT_TOKEN: - case DOUBLE_TOKEN: - case COMPLEX_TOKEN: -#endif - case IDENT_TOKEN: - if ((tok->free_sval_flag == 0) || (tok->num_refs == 0)) - break; - /* drop */ - default: - s = tok->v.s_val; - break; - } - - if (s == NULL) - { - s = numbuf; - sprintf (s, "(0x%02X)", type); - } - - return s; -} - -static char *make_line_file_error (char *buf, unsigned int buflen, - _SLang_Token_Type *tok, char *dsc, int line, char *file) -{ -#if _SLANG_HAS_DEBUG_CODE - if (tok != NULL) line = tok->line_number; -#endif - if (file == NULL) file = "??"; - - (void) _SLsnprintf (buf, buflen, "%s: found '%s', line %d, file: %s", - dsc, map_token_to_string (tok), line, file); - - return buf; -} - -void _SLparse_error(char *str, _SLang_Token_Type *tok, int flag) -{ - char buf [1024]; - - if (str == NULL) - str = "Parse Error"; - - make_line_file_error (buf, sizeof (buf), tok, str, LLT->line_num, (char *) LLT->name); - - if ((flag == 0) && SLang_Error) - return; - - SLang_verror (SL_SYNTAX_ERROR, "%s", buf); -} - -static void do_line_file_error (int line, char *file) -{ - SLang_verror (SL_SYNTAX_ERROR, - "called from line %d, file: %s", line, file); -} - -#define ALPHA_CHAR 1 -#define DIGIT_CHAR 2 -#define EXCL_CHAR 3 -#define SEP_CHAR 4 -#define OP_CHAR 5 -#define DOT_CHAR 6 -#define BOLDOT_CHAR 7 -#define DQUOTE_CHAR 8 -#define QUOTE_CHAR 9 -#define COMMENT_CHAR 10 -#define NL_CHAR 11 -#define BAD_CHAR 12 -#define WHITE_CHAR 13 - -#define CHAR_EOF 255 - -#define CHAR_CLASS(c) (Char_Type_Table[(c)][0]) -#define CHAR_DATA(c) (Char_Type_Table[(c)][1]) - -/* In this table, if a single character can represent an operator, e.g., - * '&' (BAND_TOKEN), then it must be placed before multiple-character - * operators that begin with the same character, e.g., "&=". See - * get_op_token to see how this is exploited. - * - * The third character null terminates the operator string. This is for - * the token structure. - */ -static char Operators [29][4] = -{ -#define OFS_EXCL 0 - {'!', '=', 0, NE_TOKEN}, -#define OFS_POUND 1 - {'#', 0, 0, POUND_TOKEN}, -#define OFS_BAND 2 - {'&', 0, 0, BAND_TOKEN}, - {'&', '&', 0, EOF_TOKEN}, - {'&', '=', 0, BANDEQS_TOKEN}, -#define OFS_STAR 5 - {'*', 0, 0, TIMES_TOKEN}, - {'*', '=', 0, TIMESEQS_TOKEN}, -#define OFS_PLUS 7 - {'+', 0, 0, ADD_TOKEN}, - {'+', '+', 0, PLUSPLUS_TOKEN}, - {'+', '=', 0, PLUSEQS_TOKEN}, -#define OFS_MINUS 10 - {'-', 0, 0, SUB_TOKEN}, - {'-', '-', 0, MINUSMINUS_TOKEN}, - {'-', '=', 0, MINUSEQS_TOKEN}, - {'-', '>', 0, NAMESPACE_TOKEN}, -#define OFS_DIV 14 - {'/', 0, 0, DIV_TOKEN}, - {'/', '=', 0, DIVEQS_TOKEN}, -#define OFS_LT 16 - {'<', 0, 0, LT_TOKEN}, - {'<', '=', 0, LE_TOKEN}, -#define OFS_EQS 18 - {'=', 0, 0, ASSIGN_TOKEN}, - {'=', '=', 0, EQ_TOKEN}, -#define OFS_GT 20 - {'>', 0, 0, GT_TOKEN}, - {'>', '=', 0, GE_TOKEN}, -#define OFS_AT 22 - {'@', 0, 0, DEREF_TOKEN}, -#define OFS_POW 23 - {'^', 0, 0, POW_TOKEN}, -#define OFS_BOR 24 - {'|', 0, 0, BOR_TOKEN}, - {'|', '|', 0, EOF_TOKEN}, - {'|', '=', 0, BOREQS_TOKEN}, -#define OFS_BNOT 27 - {'~', 0, 0, BNOT_TOKEN}, - { 0, 0, 0, EOF_TOKEN} -}; - -static unsigned char Char_Type_Table[256][2] = -{ - { NL_CHAR, 0 }, /* 0x0 */ { BAD_CHAR, 0 }, /* 0x1 */ - { BAD_CHAR, 0 }, /* 0x2 */ { BAD_CHAR, 0 }, /* 0x3 */ - { BAD_CHAR, 0 }, /* 0x4 */ { BAD_CHAR, 0 }, /* 0x5 */ - { BAD_CHAR, 0 }, /* 0x6 */ { BAD_CHAR, 0 }, /* 0x7 */ - { WHITE_CHAR, 0 }, /* 0x8 */ { WHITE_CHAR, 0 }, /* 0x9 */ - { NL_CHAR, 0 }, /* \n */ { WHITE_CHAR, 0 }, /* 0xb */ - { WHITE_CHAR, 0 }, /* 0xc */ { WHITE_CHAR, 0 }, /* \r */ - { BAD_CHAR, 0 }, /* 0xe */ { BAD_CHAR, 0 }, /* 0xf */ - { BAD_CHAR, 0 }, /* 0x10 */ { BAD_CHAR, 0 }, /* 0x11 */ - { BAD_CHAR, 0 }, /* 0x12 */ { BAD_CHAR, 0 }, /* 0x13 */ - { BAD_CHAR, 0 }, /* 0x14 */ { BAD_CHAR, 0 }, /* 0x15 */ - { BAD_CHAR, 0 }, /* 0x16 */ { BAD_CHAR, 0 }, /* 0x17 */ - { BAD_CHAR, 0 }, /* 0x18 */ { BAD_CHAR, 0 }, /* 0x19 */ - { BAD_CHAR, 0 }, /* 0x1a */ { BAD_CHAR, 0 }, /* 0x1b */ - { BAD_CHAR, 0 }, /* 0x1c */ { BAD_CHAR, 0 }, /* 0x1d */ - { BAD_CHAR, 0 }, /* 0x1e */ { BAD_CHAR, 0 }, /* 0x1f */ - { WHITE_CHAR, 0 }, /* 0x20 */ { EXCL_CHAR, OFS_EXCL }, /* ! */ - { DQUOTE_CHAR, 0 }, /* " */ { OP_CHAR, OFS_POUND }, /* # */ - { ALPHA_CHAR, 0 }, /* $ */ { NL_CHAR, 0 },/* % */ - { OP_CHAR, OFS_BAND }, /* & */ { QUOTE_CHAR, 0 }, /* ' */ - { SEP_CHAR, OPAREN_TOKEN }, /* ( */ { SEP_CHAR, CPAREN_TOKEN }, /* ) */ - { OP_CHAR, OFS_STAR }, /* * */ { OP_CHAR, OFS_PLUS}, /* + */ - { SEP_CHAR, COMMA_TOKEN }, /* , */ { OP_CHAR, OFS_MINUS }, /* - */ - { DOT_CHAR, 0 }, /* . */ { OP_CHAR, OFS_DIV }, /* / */ - { DIGIT_CHAR, 0 }, /* 0 */ { DIGIT_CHAR, 0 }, /* 1 */ - { DIGIT_CHAR, 0 }, /* 2 */ { DIGIT_CHAR, 0 }, /* 3 */ - { DIGIT_CHAR, 0 }, /* 4 */ { DIGIT_CHAR, 0 }, /* 5 */ - { DIGIT_CHAR, 0 }, /* 6 */ { DIGIT_CHAR, 0 }, /* 7 */ - { DIGIT_CHAR, 0 }, /* 8 */ { DIGIT_CHAR, 0 }, /* 9 */ - { SEP_CHAR, COLON_TOKEN }, /* : */ { SEP_CHAR, SEMICOLON_TOKEN }, /* ; */ - { OP_CHAR, OFS_LT }, /* < */ { OP_CHAR, OFS_EQS }, /* = */ - { OP_CHAR, OFS_GT }, /* > */ { BAD_CHAR, 0 }, /* ? */ - { OP_CHAR, OFS_AT}, /* @ */ { ALPHA_CHAR, 0 }, /* A */ - { ALPHA_CHAR, 0 }, /* B */ { ALPHA_CHAR, 0 }, /* C */ - { ALPHA_CHAR, 0 }, /* D */ { ALPHA_CHAR, 0 }, /* E */ - { ALPHA_CHAR, 0 }, /* F */ { ALPHA_CHAR, 0 }, /* G */ - { ALPHA_CHAR, 0 }, /* H */ { ALPHA_CHAR, 0 }, /* I */ - { ALPHA_CHAR, 0 }, /* J */ { ALPHA_CHAR, 0 }, /* K */ - { ALPHA_CHAR, 0 }, /* L */ { ALPHA_CHAR, 0 }, /* M */ - { ALPHA_CHAR, 0 }, /* N */ { ALPHA_CHAR, 0 }, /* O */ - { ALPHA_CHAR, 0 }, /* P */ { ALPHA_CHAR, 0 }, /* Q */ - { ALPHA_CHAR, 0 }, /* R */ { ALPHA_CHAR, 0 }, /* S */ - { ALPHA_CHAR, 0 }, /* T */ { ALPHA_CHAR, 0 }, /* U */ - { ALPHA_CHAR, 0 }, /* V */ { ALPHA_CHAR, 0 }, /* W */ - { ALPHA_CHAR, 0 }, /* X */ { ALPHA_CHAR, 0 }, /* Y */ - { ALPHA_CHAR, 0 }, /* Z */ { SEP_CHAR, OBRACKET_TOKEN }, /* [ */ - { BAD_CHAR, 0 }, /* \ */ { SEP_CHAR, CBRACKET_TOKEN }, /* ] */ - { OP_CHAR, OFS_POW }, /* ^ */ { ALPHA_CHAR, 0 }, /* _ */ - { BAD_CHAR, 0 }, /* ` */ { ALPHA_CHAR, 0 }, /* a */ - { ALPHA_CHAR, 0 }, /* b */ { ALPHA_CHAR, 0 }, /* c */ - { ALPHA_CHAR, 0 }, /* d */ { ALPHA_CHAR, 0 }, /* e */ - { ALPHA_CHAR, 0 }, /* f */ { ALPHA_CHAR, 0 }, /* g */ - { ALPHA_CHAR, 0 }, /* h */ { ALPHA_CHAR, 0 }, /* i */ - { ALPHA_CHAR, 0 }, /* j */ { ALPHA_CHAR, 0 }, /* k */ - { ALPHA_CHAR, 0 }, /* l */ { ALPHA_CHAR, 0 }, /* m */ - { ALPHA_CHAR, 0 }, /* n */ { ALPHA_CHAR, 0 }, /* o */ - { ALPHA_CHAR, 0 }, /* p */ { ALPHA_CHAR, 0 }, /* q */ - { ALPHA_CHAR, 0 }, /* r */ { ALPHA_CHAR, 0 }, /* s */ - { ALPHA_CHAR, 0 }, /* t */ { ALPHA_CHAR, 0 }, /* u */ - { ALPHA_CHAR, 0 }, /* v */ { ALPHA_CHAR, 0 }, /* w */ - { ALPHA_CHAR, 0 }, /* x */ { ALPHA_CHAR, 0 }, /* y */ - { ALPHA_CHAR, 0 }, /* z */ { SEP_CHAR, OBRACE_TOKEN }, /* { */ - { OP_CHAR, OFS_BOR }, /* | */ { SEP_CHAR, CBRACE_TOKEN }, /* } */ - { OP_CHAR, OFS_BNOT }, /* ~ */ { BAD_CHAR, 0 }, /* 0x7f */ - - { ALPHA_CHAR, 0 }, /* */ { ALPHA_CHAR, 0 }, /* */ - { ALPHA_CHAR, 0 }, /* */ { ALPHA_CHAR, 0 }, /* */ - { ALPHA_CHAR, 0 }, /* */ { ALPHA_CHAR, 0 }, /* */ - { ALPHA_CHAR, 0 }, /* */ { ALPHA_CHAR, 0 }, /* */ - { ALPHA_CHAR, 0 }, /* */ { ALPHA_CHAR, 0 }, /* */ - { ALPHA_CHAR, 0 }, /* */ { ALPHA_CHAR, 0 }, /* */ - { ALPHA_CHAR, 0 }, /* */ { ALPHA_CHAR, 0 }, /* */ - { ALPHA_CHAR, 0 }, /* */ { ALPHA_CHAR, 0 }, /* */ - { ALPHA_CHAR, 0 }, /* */ { ALPHA_CHAR, 0 }, /* */ - { ALPHA_CHAR, 0 }, /* */ { ALPHA_CHAR, 0 }, /* */ - { ALPHA_CHAR, 0 }, /* */ { ALPHA_CHAR, 0 }, /* */ - { ALPHA_CHAR, 0 }, /* */ { ALPHA_CHAR, 0 }, /* */ - { ALPHA_CHAR, 0 }, /* */ { ALPHA_CHAR, 0 }, /* */ - { ALPHA_CHAR, 0 }, /* */ { ALPHA_CHAR, 0 }, /* */ - { ALPHA_CHAR, 0 }, /* */ { ALPHA_CHAR, 0 }, /* */ - { ALPHA_CHAR, 0 }, /* */ { ALPHA_CHAR, 0 }, /* */ - { ALPHA_CHAR, 0 }, /* */ { ALPHA_CHAR, 0 }, /* */ - { ALPHA_CHAR, 0 }, /* */ { ALPHA_CHAR, 0 }, /* */ - { ALPHA_CHAR, 0 }, /* */ { ALPHA_CHAR, 0 }, /* */ - { ALPHA_CHAR, 0 }, /* */ { ALPHA_CHAR, 0 }, /* */ - { ALPHA_CHAR, 0 }, /* */ { ALPHA_CHAR, 0 }, /* */ - { ALPHA_CHAR, 0 }, /* */ { ALPHA_CHAR, 0 }, /* */ - { ALPHA_CHAR, 0 }, /* */ { ALPHA_CHAR, 0 }, /* */ - { ALPHA_CHAR, 0 }, /* */ { ALPHA_CHAR, 0 }, /* */ - { ALPHA_CHAR, 0 }, /* */ { ALPHA_CHAR, 0 }, /* */ - { ALPHA_CHAR, 0 }, /* */ { ALPHA_CHAR, 0 }, /* */ - { ALPHA_CHAR, 0 }, /* */ { ALPHA_CHAR, 0 }, /* */ - { ALPHA_CHAR, 0 }, /* */ { ALPHA_CHAR, 0 }, /* */ - { ALPHA_CHAR, 0 }, /* */ { ALPHA_CHAR, 0 }, /* */ - { ALPHA_CHAR, 0 }, /* */ { ALPHA_CHAR, 0 }, /* */ - { ALPHA_CHAR, 0 }, /* */ { ALPHA_CHAR, 0 }, /* */ - { ALPHA_CHAR, 0 }, /* */ { ALPHA_CHAR, 0 }, /* */ - { ALPHA_CHAR, 0 }, /* */ { ALPHA_CHAR, 0 }, /* */ - { ALPHA_CHAR, 0 }, /* */ { ALPHA_CHAR, 0 }, /* */ - { ALPHA_CHAR, 0 }, /* */ { ALPHA_CHAR, 0 }, /* */ - { ALPHA_CHAR, 0 }, /* */ { ALPHA_CHAR, 0 }, /* */ - { ALPHA_CHAR, 0 }, /* */ { ALPHA_CHAR, 0 }, /* */ - { ALPHA_CHAR, 0 }, /* */ { ALPHA_CHAR, 0 }, /* */ - { ALPHA_CHAR, 0 }, /* */ { ALPHA_CHAR, 0 }, /* */ - { ALPHA_CHAR, 0 }, /* */ { ALPHA_CHAR, 0 }, /* */ - { ALPHA_CHAR, 0 }, /* */ { ALPHA_CHAR, 0 }, /* */ - { ALPHA_CHAR, 0 }, /* */ { ALPHA_CHAR, 0 }, /* */ - { ALPHA_CHAR, 0 }, /* */ { ALPHA_CHAR, 0 }, /* */ - { ALPHA_CHAR, 0 }, /* */ { ALPHA_CHAR, 0 }, /* */ - { ALPHA_CHAR, 0 }, /* */ { ALPHA_CHAR, 0 }, /* */ - { ALPHA_CHAR, 0 }, /* */ { ALPHA_CHAR, 0 }, /* */ - { ALPHA_CHAR, 0 }, /* */ { ALPHA_CHAR, 0 }, /* */ - { ALPHA_CHAR, 0 }, /* */ { ALPHA_CHAR, 0 }, /* */ - { ALPHA_CHAR, 0 }, /* */ { ALPHA_CHAR, 0 }, /* */ - { ALPHA_CHAR, 0 }, /* */ { ALPHA_CHAR, 0 }, /* */ - { ALPHA_CHAR, 0 }, /* */ { ALPHA_CHAR, 0 }, /* */ - { ALPHA_CHAR, 0 }, /* */ { ALPHA_CHAR, 0 }, /* */ - { ALPHA_CHAR, 0 }, /* */ { ALPHA_CHAR, 0 }, /* */ - { ALPHA_CHAR, 0 }, /* */ { ALPHA_CHAR, 0 }, /* */ - { ALPHA_CHAR, 0 }, /* */ { ALPHA_CHAR, 0 }, /* */ - { ALPHA_CHAR, 0 }, /* */ { ALPHA_CHAR, 0 }, /* */ - { ALPHA_CHAR, 0 }, /* */ { ALPHA_CHAR, 0 }, /* */ - { ALPHA_CHAR, 0 }, /* */ { ALPHA_CHAR, 0 }, /* */ - { ALPHA_CHAR, 0 }, /* */ { ALPHA_CHAR, 0 }, /* */ - { ALPHA_CHAR, 0 }, /* */ { ALPHA_CHAR, 0 }, /* */ - { ALPHA_CHAR, 0 }, /* */ { ALPHA_CHAR, 0 }, /* */ - { ALPHA_CHAR, 0 }, /* */ { ALPHA_CHAR, 0 }, /* */ - { ALPHA_CHAR, 0 }, /* */ { ALPHA_CHAR, 0 }, /* */ - { ALPHA_CHAR, 0 }, /* */ { ALPHA_CHAR, 0 }, /* */ -}; - -int _SLcheck_identifier_syntax (char *name) -{ - unsigned char *p; - - p = (unsigned char *) name; - if (ALPHA_CHAR == Char_Type_Table[*p][0]) while (1) - { - unsigned ch; - unsigned char type; - - ch = *++p; - - type = Char_Type_Table [ch][0]; - if ((type != ALPHA_CHAR) && (type != DIGIT_CHAR)) - { - if (ch == 0) - return 0; - break; - } - } - - SLang_verror (SL_SYNTAX_ERROR, - "Name %s contains an illegal character", name); - return -1; -} - -static unsigned char prep_get_char (void) -{ - register unsigned char ch; - - if (0 != (ch = *Input_Line_Pointer++)) - return ch; - - Input_Line_Pointer--; - return 0; -} - -static void unget_prep_char (unsigned char ch) -{ - if ((Input_Line_Pointer != Input_Line) - && (ch != 0)) - Input_Line_Pointer--; - /* *Input_Line_Pointer = ch; -- Do not modify the Input_Line */ -} - -#include "keywhash.c" - -static int get_ident_token (_SLang_Token_Type *tok, unsigned char *s, unsigned int len) -{ - unsigned char ch; - unsigned char type; - Keyword_Table_Type *table; - - while (1) - { - ch = prep_get_char (); - type = CHAR_CLASS (ch); - if ((type != ALPHA_CHAR) && (type != DIGIT_CHAR)) - { - unget_prep_char (ch); - break; - } - s [len++] = ch; - } - - s[len] = 0; - - /* check if keyword */ - table = is_keyword ((char *) s, len); - if (table != NULL) - { - tok->v.s_val = table->name; - return (tok->type = table->type); - } - - tok->v.s_val = _SLstring_make_hashed_string ((char *)s, len, &tok->hash); - tok->free_sval_flag = 1; - return (tok->type = IDENT_TOKEN); -} - -static int get_number_token (_SLang_Token_Type *tok, unsigned char *s, unsigned int len) -{ - unsigned char ch; - unsigned char type; - - /* Look for pattern [0-9.xX]*([eE][-+]?[digits])?[ijfhul]? */ - while (1) - { - ch = prep_get_char (); - - type = CHAR_CLASS (ch); - if ((type != DIGIT_CHAR) && (type != DOT_CHAR)) - { - if ((ch != 'x') && (ch != 'X')) - break; - /* It must be hex */ - do - { - if (len == (MAX_TOKEN_LEN - 1)) - goto too_long_return_error; - - s[len++] = ch; - ch = prep_get_char (); - type = CHAR_CLASS (ch); - } - while ((type == DIGIT_CHAR) || (type == ALPHA_CHAR)); - break; - } - if (len == (MAX_TOKEN_LEN - 1)) - goto too_long_return_error; - s [len++] = ch; - } - - /* At this point, type and ch are synchronized */ - - if ((ch == 'e') || (ch == 'E')) - { - if (len == (MAX_TOKEN_LEN - 1)) - goto too_long_return_error; - s[len++] = ch; - ch = prep_get_char (); - if ((ch == '+') || (ch == '-')) - { - if (len == (MAX_TOKEN_LEN - 1)) - goto too_long_return_error; - s[len++] = ch; - ch = prep_get_char (); - } - - while (DIGIT_CHAR == (type = CHAR_CLASS(ch))) - { - if (len == (MAX_TOKEN_LEN - 1)) - goto too_long_return_error; - s[len++] = ch; - ch = prep_get_char (); - } - } - - while (ALPHA_CHAR == type) - { - if (len == (MAX_TOKEN_LEN - 1)) - goto too_long_return_error; - s[len++] = ch; - ch = prep_get_char (); - type = CHAR_CLASS(ch); - } - - unget_prep_char (ch); - s[len] = 0; - - switch (SLang_guess_type ((char *) s)) - { - default: - tok->v.s_val = (char *) s; - _SLparse_error ("Not a number", tok, 0); - return (tok->type = EOF_TOKEN); - -#if SLANG_HAS_FLOAT - case SLANG_FLOAT_TYPE: - tok->v.s_val = _SLstring_make_hashed_string ((char *)s, len, &tok->hash); - tok->free_sval_flag = 1; - return (tok->type = FLOAT_TOKEN); - - case SLANG_DOUBLE_TYPE: - tok->v.s_val = _SLstring_make_hashed_string ((char *)s, len, &tok->hash); - tok->free_sval_flag = 1; - return (tok->type = DOUBLE_TOKEN); -#endif -#if SLANG_HAS_COMPLEX - case SLANG_COMPLEX_TYPE: - tok->v.s_val = _SLstring_make_hashed_string ((char *)s, len, &tok->hash); - tok->free_sval_flag = 1; - return (tok->type = COMPLEX_TOKEN); -#endif - case SLANG_CHAR_TYPE: - tok->v.long_val = (char)SLatol (s); - return tok->type = CHAR_TOKEN; - case SLANG_UCHAR_TYPE: - tok->v.long_val = (unsigned char)SLatol (s); - return tok->type = UCHAR_TOKEN; - case SLANG_SHORT_TYPE: - tok->v.long_val = (short)SLatol (s); - return tok->type = SHORT_TOKEN; - case SLANG_USHORT_TYPE: - tok->v.long_val = (unsigned short)SLatoul (s); - return tok->type = USHORT_TOKEN; - case SLANG_INT_TYPE: - tok->v.long_val = (int)SLatol (s); - return tok->type = INT_TOKEN; - case SLANG_UINT_TYPE: - tok->v.long_val = (unsigned int)SLatoul (s); - return tok->type = UINT_TOKEN; - case SLANG_LONG_TYPE: - tok->v.long_val = SLatol (s); - return tok->type = LONG_TOKEN; - case SLANG_ULONG_TYPE: - tok->v.long_val = SLatoul (s); - return tok->type = ULONG_TOKEN; - } - - too_long_return_error: - _SLparse_error ("Number too long for buffer", NULL, 0); - return (tok->type == EOF_TOKEN); -} - -static int get_op_token (_SLang_Token_Type *tok, char ch) -{ - unsigned int offset; - char second_char; - unsigned char type; - char *name; - - /* operators are: + - / * ++ -- += -= = == != > < >= <= | etc.. - * These lex to the longest valid operator token. - */ - - offset = CHAR_DATA((unsigned char) ch); - if (0 == Operators [offset][1]) - { - name = Operators [offset]; - type = name [3]; - } - else - { - type = EOF_TOKEN; - name = NULL; - } - - second_char = prep_get_char (); - do - { - if (second_char == Operators[offset][1]) - { - name = Operators [offset]; - type = name [3]; - break; - } - offset++; - } - while (ch == Operators[offset][0]); - - tok->type = type; - - if (type == EOF_TOKEN) - { - _SLparse_error ("Operator not supported", NULL, 0); - return type; - } - - tok->v.s_val = name; - - if (name[1] == 0) - unget_prep_char (second_char); - - return type; -} - -/* If this returns non-zero, then it is a binary string */ -static int expand_escaped_string (register char *s, - register char *t, register char *tmax, - unsigned int *lenp) -{ - char *s0; - int is_binary = 0; - char ch; - - s0 = s; - while (t < tmax) - { - ch = *t++; - if (ch == '\\') - { - t = _SLexpand_escaped_char (t, &ch); - if (ch == 0) is_binary = 1; - } - *s++ = ch; - } - *s = 0; - - *lenp = (unsigned char) (s - s0); - return is_binary; -} - -static int get_string_token (_SLang_Token_Type *tok, unsigned char quote_char, - unsigned char *s) -{ - unsigned char ch; - unsigned int len = 0; - int has_quote = 0; - int is_binary; - - while (1) - { - ch = prep_get_char (); - if (ch == 0) - { - _SLparse_error("Expecting quote-character", NULL, 0); - return (tok->type = EOF_TOKEN); - } - if (ch == quote_char) break; - - s[len++] = ch; - - if (len == (MAX_TOKEN_LEN - 1)) - { - _SLparse_error ("String too long for buffer", NULL, 0); - return (tok->type == EOF_TOKEN); - } - - if (ch == '\\') - { - has_quote = 1; - ch = prep_get_char (); - s[len++] = ch; - } - } - - s[len] = 0; - - if (has_quote) - is_binary = expand_escaped_string ((char *) s, (char *)s, (char *)s + len, &len); - else is_binary = 0; - - if ('"' == quote_char) - { - tok->free_sval_flag = 1; - if (is_binary) - { - tok->v.b_val = SLbstring_create (s, len); - return tok->type = BSTRING_TOKEN; - } - else - { - tok->v.s_val = _SLstring_make_hashed_string ((char *)s, - len, - &tok->hash); - tok->free_sval_flag = 1; - return (tok->type = STRING_TOKEN); - } - } - - /* else single character */ - if (s[1] != 0) - { - _SLparse_error("Single char expected", NULL, 0); - return (tok->type = EOF_TOKEN); - } - - tok->v.long_val = s[0]; - return (tok->type = UCHAR_TOKEN); -} - -static int extract_token (_SLang_Token_Type *tok, unsigned char ch, unsigned char t) -{ - unsigned char s [MAX_TOKEN_LEN]; - unsigned int slen; - - s[0] = (char) ch; - slen = 1; - - switch (t) - { - case ALPHA_CHAR: - return get_ident_token (tok, s, slen); - - case OP_CHAR: - return get_op_token (tok, ch); - - case DIGIT_CHAR: - return get_number_token (tok, s, slen); - - case EXCL_CHAR: - ch = prep_get_char (); - s [slen++] = ch; - t = CHAR_CLASS(ch); - if (t == ALPHA_CHAR) return get_ident_token (tok, s, slen); - if (t == OP_CHAR) - { - unget_prep_char (ch); - return get_op_token (tok, '!'); - } - _SLparse_error("Misplaced !", NULL, 0); - return -1; - - case DOT_CHAR: - ch = prep_get_char (); - if (DIGIT_CHAR == CHAR_CLASS(ch)) - { - s [slen++] = ch; - return get_number_token (tok, s, slen); - } - unget_prep_char (ch); - return (tok->type = DOT_TOKEN); - - case SEP_CHAR: - return (tok->type = CHAR_DATA(ch)); - - case DQUOTE_CHAR: - case QUOTE_CHAR: - return get_string_token (tok, ch, s); - - default: - _SLparse_error("Invalid character", NULL, 0); - return (tok->type = EOF_TOKEN); - } -} - -int _SLget_rpn_token (_SLang_Token_Type *tok) -{ - unsigned char ch; - - tok->v.s_val = "??"; - while ((ch = *Input_Line_Pointer) != 0) - { - unsigned char t; - - Input_Line_Pointer++; - if (WHITE_CHAR == (t = CHAR_CLASS(ch))) - continue; - - if (NL_CHAR == t) - break; - - return extract_token (tok, ch, t); - } - Input_Line_Pointer = Empty_Line; - return EOF_TOKEN; -} - -int _SLget_token (_SLang_Token_Type *tok) -{ - unsigned char ch; - unsigned char t; - - tok->num_refs = 1; - tok->free_sval_flag = 0; - tok->v.s_val = "??"; -#if _SLANG_HAS_DEBUG_CODE - tok->line_number = LLT->line_num; -#endif - if (SLang_Error || (Input_Line == NULL)) - return (tok->type = EOF_TOKEN); - - while (1) - { - ch = *Input_Line_Pointer++; - if (WHITE_CHAR == (t = CHAR_CLASS (ch))) - continue; - - if (t != NL_CHAR) - return extract_token (tok, ch, t); - - do - { - LLT->line_num++; -#if _SLANG_HAS_DEBUG_CODE - tok->line_number++; -#endif - Input_Line = LLT->read(LLT); - if ((NULL == Input_Line) || SLang_Error) - { - Input_Line_Pointer = Input_Line = NULL; - return (tok->type = EOF_TOKEN); - } - } - while (0 == SLprep_line_ok(Input_Line, This_SLpp)); - - Input_Line_Pointer = Input_Line; - if (*Input_Line_Pointer == '.') - { - Input_Line_Pointer++; - return tok->type = RPN_TOKEN; - } - } -} - -static int prep_exists_function (char *line, char comment) -{ - char buf[MAX_FILE_LINE_LEN], *b, *bmax; - unsigned char ch; - - bmax = buf + (sizeof (buf) - 1); - - while (1) - { - /* skip whitespace */ - while ((ch = (unsigned char) *line), - ch && (ch != '\n') && (ch <= ' ')) - line++; - - if ((ch <= '\n') - || (ch == (unsigned char) comment)) break; - - b = buf; - while ((ch = (unsigned char) *line) > ' ') - { - if (b < bmax) *b++ = (char) ch; - line++; - } - *b = 0; - - if (SLang_is_defined (buf)) - return 1; - } - - return 0; -} - -static int prep_eval_expr (char *expr) -{ - int ret; - - if (0 != SLang_load_string (expr)) - return -1; - if (-1 == SLang_pop_integer (&ret)) - return -1; - return (ret != 0); -} - - -int SLang_load_object (SLang_Load_Type *x) -{ - SLPreprocess_Type this_pp; - SLPreprocess_Type *save_this_pp; - SLang_Load_Type *save_llt; - char *save_input_line, *save_input_line_ptr; -#if _SLANG_HAS_DEBUG_CODE - int save_compile_line_num_info; -#endif - int save_auto_declare_variables; - - if (SLprep_exists_hook == NULL) - SLprep_exists_hook = prep_exists_function; - - if (_SLprep_eval_hook == NULL) - _SLprep_eval_hook = prep_eval_expr; - - if (-1 == SLprep_open_prep (&this_pp)) return -1; - - if (-1 == _SLcompile_push_context (x)) - return -1; - -#if _SLANG_HAS_DEBUG_CODE - save_compile_line_num_info = _SLang_Compile_Line_Num_Info; -#endif - save_this_pp = This_SLpp; - save_input_line = Input_Line; - save_input_line_ptr = Input_Line_Pointer; - save_llt = LLT; - save_auto_declare_variables = _SLang_Auto_Declare_Globals; - - This_SLpp = &this_pp; - Input_Line_Pointer = Input_Line = Empty_Line; - LLT = x; - - x->line_num = 0; - x->parse_level = 0; - _SLang_Auto_Declare_Globals = x->auto_declare_globals; - -#if _SLANG_HAS_DEBUG_CODE - _SLang_Compile_Line_Num_Info = Default_Compile_Line_Num_Info; -#endif - - _SLparse_start (x); - if (SLang_Error) - do_line_file_error (x->line_num, x->name); - - _SLang_Auto_Declare_Globals = save_auto_declare_variables; - - if (SLang_Error) SLang_restart (0); - - (void) _SLcompile_pop_context (); - - Input_Line = save_input_line; - Input_Line_Pointer = save_input_line_ptr; - LLT = save_llt; - This_SLpp = save_this_pp; - -#if _SLANG_HAS_DEBUG_CODE - _SLang_Compile_Line_Num_Info = save_compile_line_num_info; -#endif - - if (SLang_Error) return -1; - return 0; -} - -SLang_Load_Type *SLallocate_load_type (char *name) -{ - SLang_Load_Type *x; - - if (NULL == (x = (SLang_Load_Type *)SLmalloc (sizeof (SLang_Load_Type)))) - return NULL; - memset ((char *) x, 0, sizeof (SLang_Load_Type)); - - if (name == NULL) name = ""; - - x->name = SLang_create_slstring (name); - if (x->name == NULL) - { - SLfree ((char *) x); - return NULL; - } - return x; -} - -void SLdeallocate_load_type (SLang_Load_Type *x) -{ - if (x != NULL) - { - SLang_free_slstring (x->name); - SLfree ((char *) x); - } -} - -typedef struct -{ - char *string; - char *ptr; -} -String_Client_Data_Type; - -static char *read_from_string (SLang_Load_Type *x) -{ - String_Client_Data_Type *data; - char *s, *s1, ch; - - data = (String_Client_Data_Type *)x->client_data; - s1 = s = data->ptr; - - if (*s == 0) - return NULL; - - while ((ch = *s) != 0) - { - s++; - if (ch == '\n') - break; - } - - data->ptr = s; - return s1; -} - -int SLang_load_string (char *string) -{ - SLang_Load_Type *x; - String_Client_Data_Type data; - int ret; - - if (string == NULL) - return -1; - - /* Grab a private copy in case loading modifies string */ - if (NULL == (string = SLang_create_slstring (string))) - return -1; - - /* To avoid creating a static data space for every string loaded, - * all string objects will be regarded as identical. So, identify - * all of them by ***string*** - */ - if (NULL == (x = SLallocate_load_type ("***string***"))) - { - SLang_free_slstring (string); - return -1; - } - - x->client_data = (VOID_STAR) &data; - x->read = read_from_string; - - data.ptr = data.string = string; - if (-1 == (ret = SLang_load_object (x))) - SLang_verror (SLang_Error, "called from eval: %s", string); - - SLang_free_slstring (string); - SLdeallocate_load_type (x); - return ret; -} - -typedef struct -{ - char *buf; - FILE *fp; -} -File_Client_Data_Type; - -char *SLang_User_Prompt; -static char *read_from_file (SLang_Load_Type *x) -{ - FILE *fp; - File_Client_Data_Type *c; - - c = (File_Client_Data_Type *)x->client_data; - fp = c->fp; - - if ((fp == stdin) && (SLang_User_Prompt != NULL)) - { - fputs (SLang_User_Prompt, stdout); - fflush (stdout); - } - - return fgets (c->buf, MAX_FILE_LINE_LEN, c->fp); -} - -/* Note that file could be freed from Slang during run of this routine - * so get it and store it !! (e.g., autoloading) - */ -int (*SLang_Load_File_Hook) (char *); -int SLang_load_file (char *f) -{ - File_Client_Data_Type client_data; - SLang_Load_Type *x; - char *name, *buf; - FILE *fp; - - if (SLang_Load_File_Hook != NULL) - return (*SLang_Load_File_Hook) (f); - - if (f == NULL) name = "<stdin>"; else name = f; - - name = SLang_create_slstring (name); - if (name == NULL) - return -1; - - if (NULL == (x = SLallocate_load_type (name))) - { - SLang_free_slstring (name); - return -1; - } - - buf = NULL; - - if (f != NULL) - fp = fopen (f, "r"); - else - fp = stdin; - - if (fp == NULL) - SLang_verror (SL_OBJ_NOPEN, "Unable to open %s", name); - else if (NULL != (buf = SLmalloc (MAX_FILE_LINE_LEN + 1))) - { - client_data.fp = fp; - client_data.buf = buf; - x->client_data = (VOID_STAR) &client_data; - x->read = read_from_file; - - (void) SLang_load_object (x); - } - - if ((fp != NULL) && (fp != stdin)) - fclose (fp); - - SLfree (buf); - SLang_free_slstring (name); - SLdeallocate_load_type (x); - - if (SLang_Error) - return -1; - - return 0; -} - -int SLang_guess_type (char *t) -{ - char *p; - register char ch; - int modifier = 0; - - if (*t == '-') t++; - p = t; - -#if SLANG_HAS_FLOAT - if (*p != '.') - { -#endif - modifier = 0; - while ((*p >= '0') && (*p <= '9')) p++; - if (t == p) return (SLANG_STRING_TYPE); - if ((*p == 'x') && (p == t + 1)) /* 0x?? */ - { - modifier |= 8; - p++; - while (ch = *p, - ((ch >= '0') && (ch <= '9')) - || (((ch | 0x20) >= 'a') && ((ch | 0x20) <= 'f'))) p++; - } - - /* Now look for UL, LU, UH, HU, L, H modifiers */ - while ((ch = *p) != 0) - { - ch |= 0x20; - if (ch == 'h') modifier |= 1; - else if (ch == 'l') modifier |= 2; - else if (ch == 'u') modifier |= 4; - else break; - p++; - } - if ((1|2) == (modifier & (1|2))) /* hl present */ - return SLANG_STRING_TYPE; - - if (ch == 0) - { - if ((modifier & 0x7) == 0) return SLANG_INT_TYPE; - if (modifier & 4) - { - if (modifier & 1) return SLANG_USHORT_TYPE; - if (modifier & 2) return SLANG_ULONG_TYPE; - return SLANG_UINT_TYPE; - } - if (modifier & 1) return SLANG_SHORT_TYPE; - if (modifier & 2) return SLANG_LONG_TYPE; - return SLANG_INT_TYPE; - } - - if (modifier) return SLANG_STRING_TYPE; -#if SLANG_HAS_FLOAT - } - - /* now down to double case */ - if (*p == '.') - { - p++; - while ((*p >= '0') && (*p <= '9')) p++; - } - if (*p == 0) return(SLANG_DOUBLE_TYPE); - if ((*p != 'e') && (*p != 'E')) - { -# if SLANG_HAS_COMPLEX - if (((*p == 'i') || (*p == 'j')) - && (p[1] == 0)) - return SLANG_COMPLEX_TYPE; -# endif - if (((*p | 0x20) == 'f') && (p[1] == 0)) - return SLANG_FLOAT_TYPE; - - return SLANG_STRING_TYPE; - } - - p++; - if ((*p == '-') || (*p == '+')) p++; - while ((*p >= '0') && (*p <= '9')) p++; - if (*p != 0) - { -# if SLANG_HAS_COMPLEX - if (((*p == 'i') || (*p == 'j')) - && (p[1] == 0)) - return SLANG_COMPLEX_TYPE; -# endif - if (((*p | 0x20) == 'f') && (p[1] == 0)) - return SLANG_FLOAT_TYPE; - - return SLANG_STRING_TYPE; - } - return SLANG_DOUBLE_TYPE; -#else - return SLANG_STRING_TYPE; -#endif /* SLANG_HAS_FLOAT */ -} - -static int hex_atoul (unsigned char *s, unsigned long *ul) -{ - register unsigned char ch; - register unsigned long value; - register int base; - - s++; /* skip the leading 0 */ - - /* look for 'x' which indicates hex */ - if ((*s | 0x20) == 'x') - { - base = 16; - s++; - if (*s == 0) - { - SLang_Error = SL_SYNTAX_ERROR; - return -1; - } - } - else base = 8; - - value = 0; - while ((ch = *s++) != 0) - { - char ch1 = ch | 0x20; - switch (ch1) - { - default: - SLang_Error = SL_SYNTAX_ERROR; - break; - - case 'u': - case 'l': - case 'h': - *ul = value; - return 0; - - case '8': - case '9': - if (base != 16) SLang_Error = SL_SYNTAX_ERROR; - /* drop */ - case '0': - case '1': - case '2': - case '3': - case '4': - case '5': - case '6': - case '7': - ch1 -= '0'; - break; - - case 'a': - case 'b': - case 'c': - case 'd': - case 'e': - case 'f': - if (base != 16) SLang_Error = SL_SYNTAX_ERROR; - ch1 = (ch1 - 'a') + 10; - break; - } - value = value * base + ch1; - } - *ul = value; - return 0; -} - -/* Note: These routines do not check integer overflow. I would use the C - * library functions atol and atoul but some implementations check overflow - * and some do not. The following implementations provide a consistent - * behavior. - */ -unsigned long SLatoul (unsigned char *s) -{ - int sign; - unsigned long value; - - if (*s == '-') sign = -1; - else - { - sign = 1; - if (*s == '+') s++; - } - - if (*s == '0') - { - if (-1 == hex_atoul (s, &value)) - return (unsigned long) -1; - } - else - { - while (WHITE_CHAR == CHAR_CLASS(*s)) - s++; - - value = 0; - while (DIGIT_CHAR == CHAR_CLASS(*s)) - { - value = value * 10 + (unsigned long) (*s - '0'); - s++; - } - } - - if (sign == -1) - value = (unsigned long)-1L * value; - - return value; -} - -long SLatol (unsigned char *s) -{ - while (WHITE_CHAR == CHAR_CLASS(*s)) - s++; - - if (*s == '-') - { - long value = (long) SLatoul (s+1); - return -value; - } - return (long) SLatoul (s); -} - -int SLatoi (unsigned char *s) -{ - return (int) SLatol (s); -} - -static char *check_byte_compiled_token (char *buf) -{ - unsigned int len_lo, len_hi, len; - - len_lo = (unsigned char) *Input_Line_Pointer++; - if ((len_lo < 32) - || ((len_hi = (unsigned char)*Input_Line_Pointer++) < 32) - || ((len = (len_lo - 32) | ((len_hi - 32) << 7)) >= MAX_TOKEN_LEN)) - { - SLang_doerror ("Byte compiled file appears corrupt"); - return NULL; - } - - SLMEMCPY (buf, Input_Line_Pointer, len); - buf += len; - Input_Line_Pointer += len; - *buf = 0; - return buf; -} - -void _SLcompile_byte_compiled (void) -{ - unsigned char type; - _SLang_Token_Type tok; - char buf[MAX_TOKEN_LEN]; - char *ebuf; - unsigned int len; - - memset ((char *) &tok, 0, sizeof (_SLang_Token_Type)); - - while (SLang_Error == 0) - { - top_of_switch: - type = (unsigned char) *Input_Line_Pointer++; - switch (type) - { - case '\n': - case 0: - if (NULL == (Input_Line = LLT->read(LLT))) - { - Input_Line_Pointer = Input_Line = NULL; - return; - } - Input_Line_Pointer = Input_Line; - goto top_of_switch; - - case LINE_NUM_TOKEN: - case CHAR_TOKEN: - case UCHAR_TOKEN: - case SHORT_TOKEN: - case USHORT_TOKEN: - case INT_TOKEN: - case UINT_TOKEN: - case LONG_TOKEN: - case ULONG_TOKEN: - if (NULL == check_byte_compiled_token (buf)) - return; - tok.v.long_val = atol (buf); - break; - - case COMPLEX_TOKEN: - case FLOAT_TOKEN: - case DOUBLE_TOKEN: - if (NULL == check_byte_compiled_token (buf)) - return; - tok.v.s_val = buf; - break; - - case ESC_STRING_TOKEN: - if (NULL == (ebuf = check_byte_compiled_token (buf))) - return; - tok.v.s_val = buf; - if (expand_escaped_string (buf, buf, ebuf, &len)) - { - tok.hash = len; - type = _BSTRING_TOKEN; - } - else - { - tok.hash = _SLstring_hash ((unsigned char *)buf, (unsigned char *)buf + len); - type = STRING_TOKEN; - } - break; - - case TMP_TOKEN: - case DEFINE_TOKEN: - case DEFINE_STATIC_TOKEN: - case DEFINE_PRIVATE_TOKEN: - case DEFINE_PUBLIC_TOKEN: - case DOT_TOKEN: - case STRING_TOKEN: - case IDENT_TOKEN: - case _REF_TOKEN: - case _DEREF_ASSIGN_TOKEN: - case _SCALAR_ASSIGN_TOKEN: - case _SCALAR_PLUSEQS_TOKEN: - case _SCALAR_MINUSEQS_TOKEN: - case _SCALAR_TIMESEQS_TOKEN: - case _SCALAR_DIVEQS_TOKEN: - case _SCALAR_BOREQS_TOKEN: - case _SCALAR_BANDEQS_TOKEN: - case _SCALAR_PLUSPLUS_TOKEN: - case _SCALAR_POST_PLUSPLUS_TOKEN: - case _SCALAR_MINUSMINUS_TOKEN: - case _SCALAR_POST_MINUSMINUS_TOKEN: - case _STRUCT_ASSIGN_TOKEN: - case _STRUCT_PLUSEQS_TOKEN: - case _STRUCT_MINUSEQS_TOKEN: - case _STRUCT_TIMESEQS_TOKEN: - case _STRUCT_DIVEQS_TOKEN: - case _STRUCT_BOREQS_TOKEN: - case _STRUCT_BANDEQS_TOKEN: - case _STRUCT_POST_MINUSMINUS_TOKEN: - case _STRUCT_MINUSMINUS_TOKEN: - case _STRUCT_POST_PLUSPLUS_TOKEN: - case _STRUCT_PLUSPLUS_TOKEN: - if (NULL == (ebuf = check_byte_compiled_token (buf))) - return; - tok.v.s_val = buf; - tok.hash = _SLstring_hash ((unsigned char *)buf, (unsigned char *)ebuf); - break; - - default: - break; - } - tok.type = type; - - (*_SLcompile_ptr) (&tok); - } -} - -static int escape_string (unsigned char *s, unsigned char *smax, - unsigned char *buf, unsigned char *buf_max, - int *is_escaped) -{ - unsigned char ch; - - *is_escaped = 0; - while (buf < buf_max) - { - if (s == smax) - { - *buf = 0; - return 0; - } - - ch = *s++; - switch (ch) - { - default: - *buf++ = ch; - break; - - case 0: - *buf++ = '\\'; - if (buf < buf_max) *buf++ = 'x'; - if (buf < buf_max) *buf++ = '0'; - if (buf < buf_max) *buf++ = '0'; - *is_escaped = 1; - break; /* return 0; */ - - case '\n': - *buf++ = '\\'; - if (buf < buf_max) *buf++ = 'n'; - *is_escaped = 1; - break; - - case '\r': - *buf++ = '\\'; - if (buf < buf_max) *buf++ = 'r'; - *is_escaped = 1; - break; - - case 0x1A: /* ^Z */ - *buf++ = '\\'; - if (buf < buf_max) *buf++ = 'x'; - if (buf < buf_max) *buf++ = '1'; - if (buf < buf_max) *buf++ = 'A'; - *is_escaped = 1; - break; - - case '\\': - *buf++ = ch; - if (buf < buf_max) *buf++ = ch; - *is_escaped = 1; - break; - } - } - _SLparse_error ("String too long to byte-compile", NULL, 0); - return -1; -} - -static FILE *Byte_Compile_Fp; -static unsigned int Byte_Compile_Line_Len; - -static int bytecomp_write_data (char *buf, unsigned int len) -{ - char *err = "Write Error"; - - if ((Byte_Compile_Line_Len + len + 1) >= MAX_FILE_LINE_LEN) - { - if (EOF == fputs ("\n", Byte_Compile_Fp)) - { - SLang_doerror (err); - return -1; - } - Byte_Compile_Line_Len = 0; - } - - if (EOF == fputs (buf, Byte_Compile_Fp)) - { - SLang_doerror (err); - return -1; - } - Byte_Compile_Line_Len += len; - return 0; -} - -static void byte_compile_token (_SLang_Token_Type *tok) -{ - unsigned char buf [MAX_TOKEN_LEN + 4], *buf_max; - unsigned int len; - char *b3; - int is_escaped; - unsigned char *s; - - if (SLang_Error) return; - - buf [0] = (unsigned char) tok->type; - buf [1] = 0; - - buf_max = buf + sizeof(buf); - b3 = (char *) buf + 3; - - switch (tok->type) - { - case LINE_NUM_TOKEN: - case CHAR_TOKEN: - case SHORT_TOKEN: - case INT_TOKEN: - case LONG_TOKEN: - sprintf (b3, "%ld", tok->v.long_val); - break; - - case UCHAR_TOKEN: - case USHORT_TOKEN: - case UINT_TOKEN: - case ULONG_TOKEN: - sprintf (b3, "%lu", tok->v.long_val); - break; - - case _BSTRING_TOKEN: - s = (unsigned char *) tok->v.s_val; - len = (unsigned int) tok->hash; - - if (-1 == escape_string (s, s + len, - (unsigned char *)b3, buf_max, - &is_escaped)) - return; - - buf[0] = ESC_STRING_TOKEN; - break; - - case BSTRING_TOKEN: - if (NULL == (s = SLbstring_get_pointer (tok->v.b_val, &len))) - return; - - if (-1 == escape_string (s, s + len, - (unsigned char *)b3, buf_max, - &is_escaped)) - return; - buf[0] = ESC_STRING_TOKEN; - break; - - case STRING_TOKEN: - s = (unsigned char *)tok->v.s_val; - - if (-1 == escape_string (s, s + strlen ((char *)s), - (unsigned char *)b3, buf_max, - &is_escaped)) - return; - - if (is_escaped) - buf[0] = ESC_STRING_TOKEN; - break; - - /* a _SCALAR_* token is attached to an identifier. */ - case _DEREF_ASSIGN_TOKEN: - case _SCALAR_ASSIGN_TOKEN: - case _SCALAR_PLUSEQS_TOKEN: - case _SCALAR_MINUSEQS_TOKEN: - case _SCALAR_TIMESEQS_TOKEN: - case _SCALAR_DIVEQS_TOKEN: - case _SCALAR_BOREQS_TOKEN: - case _SCALAR_BANDEQS_TOKEN: - case _SCALAR_PLUSPLUS_TOKEN: - case _SCALAR_POST_PLUSPLUS_TOKEN: - case _SCALAR_MINUSMINUS_TOKEN: - case _SCALAR_POST_MINUSMINUS_TOKEN: - case DOT_TOKEN: - case TMP_TOKEN: - case DEFINE_TOKEN: - case DEFINE_STATIC_TOKEN: - case DEFINE_PRIVATE_TOKEN: - case DEFINE_PUBLIC_TOKEN: - case FLOAT_TOKEN: - case DOUBLE_TOKEN: - case COMPLEX_TOKEN: - case IDENT_TOKEN: - case _REF_TOKEN: - case _STRUCT_ASSIGN_TOKEN: - case _STRUCT_PLUSEQS_TOKEN: - case _STRUCT_MINUSEQS_TOKEN: - case _STRUCT_TIMESEQS_TOKEN: - case _STRUCT_DIVEQS_TOKEN: - case _STRUCT_BOREQS_TOKEN: - case _STRUCT_BANDEQS_TOKEN: - case _STRUCT_POST_MINUSMINUS_TOKEN: - case _STRUCT_MINUSMINUS_TOKEN: - case _STRUCT_POST_PLUSPLUS_TOKEN: - case _STRUCT_PLUSPLUS_TOKEN: - strcpy (b3, tok->v.s_val); - break; - - default: - b3 = NULL; - } - - if (b3 != NULL) - { - len = strlen (b3); - buf[1] = (unsigned char) ((len & 0x7F) + 32); - buf[2] = (unsigned char) (((len >> 7) & 0x7F) + 32); - len += 3; - } - else len = 1; - - (void) bytecomp_write_data ((char *)buf, len); -} - -int SLang_byte_compile_file (char *name, int method) -{ - char file [1024]; - - (void) method; - if (strlen (name) + 2 >= sizeof (file)) - { - SLang_verror (SL_INVALID_PARM, "Filename too long"); - return -1; - } - sprintf (file, "%sc", name); - if (NULL == (Byte_Compile_Fp = fopen (file, "w"))) - { - SLang_verror(SL_OBJ_NOPEN, "%s: unable to open", file); - return -1; - } - - Byte_Compile_Line_Len = 0; - if (-1 != bytecomp_write_data (".#", 2)) - { - _SLcompile_ptr = byte_compile_token; - (void) SLang_load_file (name); - _SLcompile_ptr = _SLcompile; - - (void) bytecomp_write_data ("\n", 1); - } - - if (EOF == fclose (Byte_Compile_Fp)) - SLang_doerror ("Write Error"); - - if (SLang_Error) - { - SLang_verror (0, "Error processing %s", name); - return -1; - } - return 0; -} - -int SLang_generate_debug_info (int x) -{ - int y = Default_Compile_Line_Num_Info; - Default_Compile_Line_Num_Info = x; - return y; -} |