%{
/*
 * Help Viewer
 *
 * Copyright 1996 Ulrich Schmid
 */

#include "macro.h"

static int   skip = 0;
static LPSTR filename;
static LPSTR windowname;

%}
%union
  {
    BOOL    bool;
    LONG    integer;
    LPSTR   string;
    BOOL    (*bool_function_void)(VOID);
    BOOL    (*bool_function_string)(LPCSTR);
    VOID    (*void_function_void)(VOID);
    VOID    (*void_function_uint)(LONG);
    VOID    (*void_function_string)(LPCSTR);
    VOID    (*void_function_2int_3uint_string)(LONG,LONG,LONG,LONG,LONG,LPCSTR);
    VOID    (*void_function_2string)(LPCSTR,LPCSTR);
    VOID    (*void_function_2string_2uint_2string)(LPCSTR,LPCSTR,LONG,LONG,LPCSTR,LPCSTR);
    VOID    (*void_function_2string_uint)(LPCSTR,LPCSTR,LONG);
    VOID    (*void_function_2string_uint_string)(LPCSTR,LPCSTR,LONG,LPCSTR);
    VOID    (*void_function_2string_wparam_lparam_string)(LPCSTR,LPCSTR,WPARAM,LPARAM,LPCSTR);
    VOID    (*void_function_2uint)(LONG,LONG);
    VOID    (*void_function_2uint_string)(LONG,LONG,LPCSTR);
    VOID    (*void_function_3string)(LPCSTR,LPCSTR,LPCSTR);
    VOID    (*void_function_3string_2uint)(LPCSTR,LPCSTR,LPCSTR,LONG,LONG);
    VOID    (*void_function_3uint)(LONG,LONG,LONG);
    VOID    (*void_function_4string)(LPCSTR,LPCSTR,LPCSTR,LPCSTR);
    VOID    (*void_function_4string_2uint)(LPCSTR,LPCSTR,LPCSTR,LPCSTR,LONG,LONG);
    VOID    (*void_function_4string_uint)(LPCSTR,LPCSTR,LPCSTR,LPCSTR,LONG);
    VOID    (*void_function_string_uint)(LPCSTR,LONG);
    VOID    (*void_function_string_uint_2string)(LPCSTR,LONG,LPCSTR,LPCSTR);
    VOID    (*void_function_string_uint_string)(LPCSTR,LONG,LPCSTR);
    VOID    (*void_function_string_wparam_lparam)(LPCSTR,WPARAM,LPARAM);
  }
%token							NOT
%token 							IF_THEN
%token 							IF_THEN_ELSE
%token <string>	 					STRING
%token <integer> 					INTEGER
%token <bool_function_string>				BOOL_FUNCTION_STRING
%token <bool_function_void>				BOOL_FUNCTION_VOID
%token <void_function_2int_3uint_string>		VOID_FUNCTION_2INT_3UINT_STRING
%token <void_function_2string>				VOID_FUNCTION_2STRING
%token <void_function_2string_2uint_2string>		VOID_FUNCTION_2STRING_2UINT_2STRING
%token <void_function_2string_uint>			VOID_FUNCTION_2STRING_UINT
%token <void_function_2string_uint_string>		VOID_FUNCTION_2STRING_UINT_STRING
%token <void_function_2string_wparam_lparam_string>	VOID_FUNCTION_2STRING_WPARAM_LPARAM_STRING
%token <void_function_2uint>				VOID_FUNCTION_2UINT
%token <void_function_2uint_string>			VOID_FUNCTION_2UINT_STRING
%token <void_function_3string>				VOID_FUNCTION_3STRING
%token <void_function_3string_2uint>			VOID_FUNCTION_3STRING_2UINT
%token <void_function_3uint>				VOID_FUNCTION_3UINT
%token <void_function_4string>				VOID_FUNCTION_4STRING
%token <void_function_4string_2uint>			VOID_FUNCTION_4STRING_2UINT
%token <void_function_4string_uint>			VOID_FUNCTION_4STRING_UINT
%token <void_function_string>				VOID_FUNCTION_STRING
%token <void_function_string_uint>			VOID_FUNCTION_STRING_UINT
%token <void_function_string_uint_2string>		VOID_FUNCTION_STRING_UINT_2STRING
%token <void_function_string_uint_string>		VOID_FUNCTION_STRING_UINT_STRING
%token <void_function_string_wparam_lparam>		VOID_FUNCTION_STRING_WPARAM_LPARAM
%token <void_function_uint>				VOID_FUNCTION_UINT
%token <void_function_void>				VOID_FUNCTION_VOID
%token <void_function_2string>				VOID_FUNCTION_FILE_WIN
%token <void_function_3string>				VOID_FUNCTION_FILE_WIN_STRING
%token <void_function_2string_uint>			VOID_FUNCTION_FILE_WIN_UINT
%type  <bool> bool_macro
%%

macrostring:	macro |
		macro macrosep macrostring ;

macrosep:	';' |
		':' ;

macro:		/* Empty */ |
		IF_THEN      '(' bool_macro ','  {if (! $3) skip++;}
                                 macrostring ')' {if (! $3) skip--;} |
		IF_THEN_ELSE '(' bool_macro ','  {if (! $3) skip++;}
                                 macrostring ',' {if (! $3) skip--; else skip++;}
                                 macrostring ')' {if (  $3) skip--;} |
		VOID_FUNCTION_VOID
			'(' ')'
			{if (! skip) (*$1)();} |
		VOID_FUNCTION_STRING
			'(' STRING ')'
			{if (! skip) (*$1)($3);} |
		VOID_FUNCTION_2STRING
			'(' STRING ',' STRING ')'
			{if (! skip) (*$1)($3, $5);} |
		VOID_FUNCTION_2STRING_UINT
			'(' STRING ',' STRING ',' INTEGER ')'
			{if (! skip) (*$1)($3, $5, $7);} |
		VOID_FUNCTION_2STRING_UINT_STRING
			'(' STRING ',' STRING ',' INTEGER ',' STRING ')'
			{if (! skip) (*$1)($3, $5, $7, $9);} |
		VOID_FUNCTION_2STRING_2UINT_2STRING
			'(' STRING ',' STRING ',' INTEGER ',' INTEGER ',' STRING ',' STRING ')'
			{if (! skip) (*$1)($3, $5, $7, $9, $11, $13);} |
		VOID_FUNCTION_2STRING_WPARAM_LPARAM_STRING
			'(' STRING ',' STRING ',' INTEGER ',' INTEGER ',' STRING ')'
			{if (! skip) (*$1)($3, $5, $7, $9, $11);} |
		VOID_FUNCTION_3STRING
			'(' STRING ',' STRING ',' STRING ')'
			{if (! skip) (*$1)($3, $5, $7);} |
		VOID_FUNCTION_3STRING_2UINT
			'(' STRING ',' STRING ',' STRING ',' INTEGER ',' INTEGER ')'
			{if (! skip) (*$1)($3, $5, $7, $9, $11);} |
		VOID_FUNCTION_4STRING
			'(' STRING ',' STRING ',' STRING ',' STRING ')'
			{if (! skip) (*$1)($3, $5, $7, $9);} |
		VOID_FUNCTION_4STRING_UINT
			'(' STRING ',' STRING ',' STRING ',' STRING ',' INTEGER')'
			{if (! skip) (*$1)($3, $5, $7, $9, $11);} |
		VOID_FUNCTION_4STRING_2UINT
			'(' STRING ',' STRING ',' STRING ',' STRING ',' INTEGER ',' INTEGER')'
			{if (! skip) (*$1)($3, $5, $7, $9, $11, $13);} |
		VOID_FUNCTION_STRING_UINT
			'(' STRING ',' INTEGER ')'
			{if (! skip) (*$1)($3, $5);} |
		VOID_FUNCTION_STRING_UINT_STRING
			'(' STRING ',' INTEGER ',' STRING ')'
			{if (! skip) (*$1)($3, $5, $7);} |
		VOID_FUNCTION_STRING_UINT_2STRING
			'(' STRING ',' INTEGER ',' STRING ',' STRING ')'
			{if (! skip) (*$1)($3, $5, $7, $9);} |
		VOID_FUNCTION_STRING_WPARAM_LPARAM
			'(' STRING ',' INTEGER ',' INTEGER ')'
			{if (! skip) (*$1)($3, $5, $7);} |
		VOID_FUNCTION_UINT
			'(' INTEGER ')'
			{if (! skip) (*$1)($3);} |
		VOID_FUNCTION_2UINT
			'(' INTEGER ',' INTEGER ')'
			{if (! skip) (*$1)($3, $5);} |
		VOID_FUNCTION_2UINT_STRING
			'(' INTEGER ',' INTEGER ',' STRING ')'
			{if (! skip) (*$1)($3, $5, $7);} |
		VOID_FUNCTION_3UINT
			'(' INTEGER ',' INTEGER ',' INTEGER ')'
			{if (! skip) (*$1)($3, $5, $7);} |
		VOID_FUNCTION_2INT_3UINT_STRING
			'(' INTEGER ',' INTEGER ',' INTEGER ',' INTEGER ',' INTEGER ',' STRING ')'
			{if (! skip) (*$1)($3, $5, $7, $9, $11, $13);} |
		VOID_FUNCTION_FILE_WIN
			'(' file_win ')'
			{if (! skip) (*$1)(filename, windowname);} |
		VOID_FUNCTION_FILE_WIN_STRING
			'(' file_win ',' STRING ')'
			{if (! skip) (*$1)(filename, windowname, $5);} |
		VOID_FUNCTION_FILE_WIN_UINT
			'(' file_win ',' INTEGER ')'
			{if (! skip) (*$1)(filename, windowname, $5);} ;

file_win:	STRING
                {
		  filename = windowname = $1;
		  while (*windowname && *windowname != '>') windowname++;
		  if (*windowname) *windowname++ = 0;
		} ;

bool_macro:     NOT '(' bool_macro ')' {$$ = ! $3;} |
		STRING {$$ = MACRO_IsMark($1);} |
		BOOL_FUNCTION_VOID '(' ')' {$$ = (*$1)();} |
		BOOL_FUNCTION_STRING '(' STRING ')' {$$ = (*$1)($3);} ;
