libclamav/jsparse/lexglobal.h
fd08e02e
 /*
  *  Javascript normalizer.
  *
  *  Copyright (C) 2008 Sourcefire, Inc.
  *
  *  Authors: Török Edvin
  *
  *  This program is free software; you can redistribute it and/or modify
  *  it under the terms of the GNU General Public License version 2 as
  *  published by the Free Software Foundation.
  *
  *  This program is distributed in the hope that it will be useful,
  *  but WITHOUT ANY WARRANTY; without even the implied warranty of
  *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  *  GNU General Public License for more details.
  *
  *  You should have received a copy of the GNU General Public License
  *  along with this program; if not, write to the Free Software
  *  Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
  *  MA 02110-1301, USA.
  */
 #ifndef YYSTYPE
 enum token_type {
 	TOK_FUTURE_RESERVED_WORD=1,
 	TOK_ERROR,
 	TOK_IDENTIFIER_NAME,
 	TOK_TRUE,
 	TOK_FALSE,
 	TOK_NULL,
 	TOK_BRACKET_OPEN,
 	TOK_BRACKET_CLOSE,
 	TOK_COMMA,
 	TOK_CURLY_BRACE_OPEN,
 	TOK_CURLY_BRACE_CLOSE,
 	TOK_PAR_OPEN,
 	TOK_PAR_CLOSE,
 	TOK_DOT,
 	TOK_SEMICOLON,
 	TOK_COLON,
 	TOK_NEW,
 	TOK_NumericInt,
 	TOK_NumericFloat,
 	TOK_StringLiteral,
 	TOK_REGULAR_EXPRESSION_LITERAL,
 	TOK_THIS,
 	TOK_PLUSPLUS,
 	TOK_MINUSMINUS,
 	TOK_DELETE,
 	TOK_VOID,
 	TOK_TYPEOF,
 	TOK_MINUS,
 	TOK_TILDE,
 	TOK_EXCLAMATION,
 	TOK_MULTIPLY,
 	TOK_DIVIDE,
 	TOK_PERCENT,
 	TOK_PLUS,
 	TOK_SHIFT_LEFT,
 	TOK_SHIFT_RIGHT,
 	TOK_DOUBLESHIFT_RIGHT,
 	TOK_LESS,
 	TOK_GREATER,
 	TOK_LESSEQUAL,
 	TOK_GREATEREQUAL,
 	TOK_INSTANCEOF,
 	TOK_IN,
 	TOK_EQUAL_EQUAL,
 	TOK_NOT_EQUAL,
 	TOK_TRIPLE_EQUAL,
 	TOK_NOT_DOUBLEEQUAL,
 	TOK_AND,
 	TOK_XOR,
 	TOK_OR,
 	TOK_AND_AND,
 	TOK_OR_OR,
 	TOK_QUESTIONMARK,
 	TOK_EQUAL,
 	TOK_ASSIGNMENT_OPERATOR_NOEQUAL,
 	TOK_VAR,
 	TOK_IF,
 	TOK_ELSE,
 	TOK_DO,
 	TOK_WHILE,
 	TOK_FOR,
 	TOK_CONTINUE,
 	TOK_BREAK,
 	TOK_RETURN,
 	TOK_WITH,
 	TOK_SWITCH,
 	TOK_CASE,
 	TOK_DEFAULT,
 	TOK_THROW,
 	TOK_TRY,
 	TOK_CATCH,
 	TOK_FINALLY,
 	TOK_FUNCTION,
 	TOK_UNNORM_IDENTIFIER
 };
 
 enum val_type {
 	vtype_undefined,
 	vtype_cstring,
 	vtype_string,
 	vtype_scope,
 	vtype_dval,
 	vtype_ival
 };
 
 typedef struct token {
 	union {
 		const char *cstring;
 		char  *string;
 		struct scope *scope;/* for function */
 		double dval;
 		long   ival;
 	} val;
 	enum token_type type;
 	enum val_type   vtype;
 } yystype;
 
 /* inline functions to access the structure to ensure type safety */
 
 #define TOKEN_SET(DST, VTYPE, VAL) do {\
 	(DST)->vtype = vtype_##VTYPE ; (DST)->val.VTYPE = (VAL); \
 } while(0);
 
 #define cstring_invalid NULL
 #define string_invalid NULL
 #define scope_invalid NULL
 /* there isn't really an invalid double, or long value, but we don't care
  * about those values anyway, so -1 will be fine here */
 #define dval_invalid -1
 #define ival_invalid -1
 
 /* compatible if same type, or if we request a const char* instead of char*,
  * but not viceversa! */
 static int vtype_compatible(enum val_type orig, enum val_type req)
 {
 	return orig == req || (orig == vtype_string && req == vtype_cstring);
 }
 
 #define TOKEN_GET(SRC, VTYPE) (vtype_compatible((SRC)->vtype, vtype_##VTYPE) ? (SRC)->val.VTYPE : VTYPE##_invalid)
 
 #define YYSTYPE yystype
 #endif