⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 sltoken.c

📁 一个C格式的脚本处理函数库源代码,可让你的C程序具有执行C格式的脚本文件
💻 C
字号:
/* Copyright (c) 1998, 1999, 2001, 2002, 2003 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 256static 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 SLCONST 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 SLCONST 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 },	/* 

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -