/* $Id: parse_lang.h 1520 2005-12-13 21:53:31Z mipsator $ */

/*
 * Copyright (c) 2005 Damien Couderc
 * All rights reserved.
 *
 * Redistribution and use in source and binary forms, with or without
 * modification, are permitted provided that the following conditions
 * are met:
 *
 *    - Redistributions of source code must retain the above copyright
 *      notice, this list of conditions and the following disclaimer.
 *    - Redistributions in binary form must reproduce the above
 *      copyright notice, this list of conditions and the following
 *      disclaimer in the documentation and/or other materials provided
 *      with the distribution.
 *    - Neither the name of the copyright holder(s) nor the names of its
 *      contributors may be used to endorse or promote products derived
 *      from this software without specific prior written permission.
 *
 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
 * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
 * COPYRIGHT HOLDERS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
 * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
 * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
 * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
 * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
 * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
 * POSSIBILITY OF SUCH DAMAGE.
 *
 */


#include "prseng.h"


/*#define DEBUG_PRSENG	1*/


/**********
 constants
***********************************************************************/

/* Preprocessor keywords */
#define RKW_PP_DEF	"define"
#define RKW_PP_ELIF	"elif"
#define RKW_PP_ELSE	"else"
#define RKW_PP_ENDF	"endif"
#define RKW_PP_ERR	"error"
#define RKW_PP_IF	"if"
#define RKW_PP_IFDF	"ifdef"
#define RKW_PP_IFND	"ifndef"
#define RKW_PP_INCL	"include"
#define RKW_PP_LINE	"line"
#define RKW_PP_PRGM	"pragma"
#define RKW_PP_UDEF	"undef"

/* assembler directives */
#define RKW_AS_TSEG	"text"
#define RKW_AS_DSEG	"data"

/* C keywords */
#define RKW_C_BOOL	"_Bool"			/* ISO C99 */
#define RKW_C_CMPLX	"_Complex"		/* ISO C?? *//* XXX */
#define RKW_C_IMGNR	"_Imaginary"	/* ISO C?? *//* XXX */
#define RKW_C_AUTO	"auto"			/* ISO C?? *//* XXX */
#define RKW_C_BREAK	"break"			/* ISO C90 */
#define RKW_C_CASE	"case"			/* ISO C90 */
#define RKW_C_CHAR	"char"			/* ISO C90 */
#define RKW_C_CONST	"const"			/* ISO C90 */
#define RKW_C_CONTN	"continue"		/* ISO C90 */
#define RKW_C_DFLT	"default"		/* ISO C90 */
#define RKW_C_DO	"do"			/* ISO C90 */
#define RKW_C_DBL	"double"		/* ISO C90 */
#define RKW_C_ELSE	"else"			/* ISO C90 */
#define RKW_C_ENUM	"enum"			/* ISO C90 */
#define RKW_C_EXTRN	"extern"		/* ISO C90 */
#define RKW_C_FLOAT	"float"			/* ISO C90 */
#define RKW_C_FOR	"for"			/* ISO C90 */
#define RKW_C_GOTO	"goto"			/* ISO C90 */
#define RKW_C_IF	"if"			/* ISO C90 */
#define RKW_C_INLN	"inline"		/* ISO C?? *//* XXX */
#define RKW_C_INT	"int"			/* ISO C90 */
#define RKW_C_LONG	"long"			/* ISO C90 */
#define RKW_C_RGSTR	"register"		/* ISO C90 */
#define RKW_C_RSTCT	"restrict"		/* ISO C99 *//* XXX */
#define RKW_C_RTRN	"return"		/* ISO C90 */
#define RKW_C_SHORT	"short"			/* ISO C90 */
#define RKW_C_SGND	"signed"		/* ISO C90 */
#define RKW_C_SIZOF	"sizeof"		/* ISO C90 */
#define RKW_C_STTC	"static"		/* ISO C90 */
#define RKW_C_STRCT	"struct"		/* ISO C90 */
#define RKW_C_SWTCH	"switch"		/* ISO C90 */
#define RKW_C_TPDEF	"typedef"		/* ISO C90 */
#define RKW_C_UNION	"union"			/* ISO C90 */
#define RKW_C_USGND	"unsigned"		/* ISO C90 */
#define RKW_C_VOID	"void"			/* ISO C90 */
#define RKW_C_VLTL	"volatile"		/* ISO C?? *//* XXX */
#define RKW_C_WHILE	"while"			/* ISO C90 */

/* C++ extra keywords */
#define RKW_CXX_AND		"and"				/* ISO C++98 */
#define RKW_CXX_ANDEQ	"and_eq"			/* ISO C++98 */
#define RKW_CXX_ASM		"asm"				/* ISO C++98 */
#define RKW_CXX_AUTO	"auto"				/* ISO C++98 */
#define RKW_CXX_BITAND	"bitand"			/* ISO C++98 */
#define RKW_CXX_BITOR	"bitor"				/* ISO C++98 */
#define RKW_CXX_BOOL	"bool"				/* ISO C++98 */
#define RKW_CXX_BREAK	"break"				/* ISO C++98 */
#define RKW_CXX_CASE	"case"				/* ISO C++98 */
#define RKW_CXX_CATCH	"catch"				/* ISO C++98 */
#define RKW_CXX_CHAR	"char"				/* ISO C++98 */
#define RKW_CXX_CLASS	"class"				/* ISO C++98 */
#define RKW_CXX_COMPL	"compl"				/* ISO C++98 */
#define RKW_CXX_CONST	"const"				/* ISO C++98 */
#define RKW_CXX_CNSTCST	"const_cast"		/* ISO C++98 */
#define RKW_CXX_CONTN	"continue"			/* ISO C++98 */
#define RKW_CXX_DFLT	"default"			/* ISO C++98 */
#define RKW_CXX_DELETE	"delete"			/* ISO C++98 */
#define RKW_CXX_DO		"do"				/* ISO C++98 */
#define RKW_CXX_DBL		"double"			/* ISO C++98 */
#define RKW_CXX_DYNCAST	"dynamic_cast"		/* ISO C++98 */
#define RKW_CXX_ELSE	"else"				/* ISO C++98 */
#define RKW_CXX_ENUM	"enum"				/* ISO C++98 */
#define RKW_CXX_EXPLI	"explicit"			/* ISO C++98 */
#define RKW_CXX_EXPORT	"export"			/* ISO C++98 */
#define RKW_CXX_EXTRN	"extern"			/* ISO C++98 */
#define RKW_CXX_FALSE	"false"				/* ISO C++98 */
#define RKW_CXX_FLOAT	"float"				/* ISO C++98 */
#define RKW_CXX_FOR		"for"				/* ISO C++98 */
#define RKW_CXX_FRIEND	"friend"			/* ISO C++98 */
#define RKW_CXX_GOTO	"goto"				/* ISO C++98 */
#define RKW_CXX_IF		"if"				/* ISO C++98 */
#define RKW_CXX_INLN	"inline"			/* ISO C++98 */
#define RKW_CXX_INT		"int"				/* ISO C++98 */
#define RKW_CXX_LONG	"long"				/* ISO C++98 */
#define RKW_CXX_MUTABL	"mutable"			/* ISO C++98 */
#define RKW_CXX_NSPC	"namespace"			/* ISO C++98 */
#define RKW_CXX_NEW		"new"				/* ISO C++98 */
#define RKW_CXX_NOT		"not"				/* ISO C++98 */
#define RKW_CXX_NOTEQ	"not_eq"			/* ISO C++98 */
#define RKW_CXX_OPER	"operator"			/* ISO C++98 */
#define RKW_CXX_OR		"or"				/* ISO C++98 */
#define RKW_CXX_OREQ	"or_eq"				/* ISO C++98 */
#define RKW_CXX_PRIV	"private"			/* ISO C++98 */
#define RKW_CXX_PROT	"protected"			/* ISO C++98 */
#define RKW_CXX_PUBLIC	"public"			/* ISO C++98 */
#define RKW_CXX_RGSTR	"register"			/* ISO C++98 */
#define RKW_CXX_RINTCST	"reinterpret_cast"	/* ISO C++98 */
#define RKW_CXX_RTRN	"return"			/* ISO C++98 */
#define RKW_CXX_SHORT	"short"				/* ISO C++98 */
#define RKW_CXX_SGND	"signed"			/* ISO C++98 */
#define RKW_CXX_SIZOF	"sizeof"			/* ISO C++98 */
#define RKW_CXX_STTC	"static"			/* ISO C++98 */
#define RKW_CXX_STCCST	"static_cast"		/* ISO C++98 */
#define RKW_CXX_STRCT	"struct"			/* ISO C++98 */
#define RKW_CXX_SWTCH	"switch"			/* ISO C++98 */
#define RKW_CXX_TMPLT	"template"			/* ISO C++98 */
#define RKW_CXX_THIS	"this"				/* ISO C++98 */
#define RKW_CXX_THROW	"throw"				/* ISO C++98 */
#define RKW_CXX_TRUE	"true"				/* ISO C++98 */
#define RKW_CXX_TRY		"try"				/* ISO C++98 */
#define RKW_CXX_TYPEDEF	"typedef"			/* ISO C++98 */
#define RKW_CXX_TYPEID	"typeid"			/* ISO C++98 */
#define RKW_CXX_TYPENAM	"typename"			/* ISO C++98 */
#define RKW_CXX_UNION	"union"				/* ISO C++98 */
#define RKW_CXX_USGND	"unsigned"			/* ISO C++98 */
#define RKW_CXX_USING	"using"				/* ISO C++98 */
#define RKW_CXX_VIRT	"virtual"			/* ISO C++98 */
#define RKW_CXX_VOID	"void"				/* ISO C++98 */
#define RKW_CXX_VLTL	"volatile"			/* ISO C++98 */
#define RKW_CXX_WCHART	"wchar_t"			/* ISO C++98 */
#define RKW_CXX_WHILE	"while"				/* ISO C++98 */
#define RKW_CXX_XOR		"xor"				/* ISO C++98 */
#define RKW_CXX_XOREQ	"xor_req"			/* ISO C++98 */

#define MAX_IDTF_LEN	64	/* maximum length of an identifier *//* XXX enough ??? */

enum {
	SEG_TYPE_UNKNW = 0,
	SEG_TYPE_TEXT,
	SEG_TYPE_DATA
};

#define PRS_C_IDTF_STR		"abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789_"
#define PRS_C_IDTF_FNAME	PRS_C_IDTF_STR "./"

#define PRS_C_MISC_STR	"]){}<>&|!?:;,=+-*/%.^~\\"


/*********************
 types and structures
***********************************************************************/

typedef struct {
	bool	 strict,	/* stop on errors when true */
			 (*func_ppro)(void *, char *, prseng_t *),	/* function to call on preprocessor keyword */
			 (*func_proc)(void *, char *, prseng_t *),	/* function called on procedure identifier */
			 (*func_decl)(void *, char *, prseng_t *),	/* function called on procedure declaration */
			 (*func_type)(void *, char *, prseng_t *);	/* function called on type identifier */
	void	*data;		/* data structure provided to the functions */
} prs_cmn_t;


/********************
 function prototypes
***********************************************************************/

bool	 prs_asm_file(prs_cmn_t *, FILE *);
bool	 prs_c_skip_to_char(prseng_t *, char);
bool	 prs_c_line_skip(prseng_t *);
bool	 prs_c_comment_skip(prseng_t *);
bool	 prs_c_squote_skip(prseng_t *);
bool	 prs_c_dquote_skip(prseng_t *);
bool	 prs_c_skip(prseng_t *);
bool	 prs_c_prepro(prs_cmn_t *, prseng_t *);
bool	 prs_c_is_kw(char *, char **, size_t);
bool	 prs_c_file(prs_cmn_t *, FILE *);
bool	 prs_cxx_file(prs_cmn_t *, FILE *);
bool	 prs_c_common(prs_cmn_t *, FILE *, char **, char **);



syntax highlighted by Code2HTML, v. 0.9.1