%{
#include "fd2gcc.tab.h"

#define YY_USER_INIT BEGIN FD

extern int      yylineno;
extern char    *identifyer;
%}

%START FD FDCMT PROTO PROTOCMT

WHITE	[ \t]
NUMBER	[0-9]
LETTER	[A-Za-z_]
ALFNUM	[A-Za-z_0-9]
REGCHAR	[dDaA]
REGNUM	[0-7]

CMTSTART	"/*"
CMTEND		"*/"

PTR			"*"
BUILTIN		"char"|"int"|"long"|"float"|"double"|"void"|"BYTE"|"UBYTE"|"WORD"|"UWORD"|"LONG"|"ULONG"|"FLOAT"|"DOUBLE"|"VOID"|"BOOL"|"APTR"|"BPTR"|"CPTR"|"STRPTR"
OTHER		"Tag"|"CxObj"|"IX"|"CxMsg"|"PLANEPTR"|"DisplayInfoHandle"|"Msg"
UNSIGNED	"unsigned"

%%

{WHITE}+	{
		}

<FD>^"*".*"\n"	{
	yylineno++;
	return(COMMENT);
		}
<FD>^"##private"	{
	return(PRIVATE);
		}
<FD>^"##public"	{
	return(PUBLIC);
		}
<FD>^"##base"	{
	return(BASE);
		}
<FD>^"##bias"	{
	return(BIAS);
		}
<FD>^"##end"	{
	return(END);
		}
<FD>{NUMBER}+	{
	return(NUMBER);
		}
<FD>{REGCHAR}{REGNUM}	{
	return(REGISTER);
		}
<FD>{LETTER}+{ALFNUM}*	{
	strcpy(identifyer, yytext);
	return(IDENTIFYER);
		}
<FD>"("		{
	return(OPEN);
		}
<FD>")"		{
	return(CLOSE);
		}
<FD>","		{
	return(ARGSEP);
		}
<FD>"/"		{
	return(REGSEP);
		}

<FD>{CMTSTART}	{
	BEGIN FDCMT;
		}

<FDCMT>{CMTEND}	{
	BEGIN FD;
	}
<FDCMT>"\n"		{
	yylineno++;
	}
<FDCMT>.			{
	}

<FD>"#ifndef".*"\n"	{
	yylineno++;
	BEGIN	PROTO;
		}

<PROTO>"struct"	{
	return(STRUCT);
		}

<PROTO>{UNSIGNED}{WHITE}+({BUILTIN}|{OTHER})	{
	return(BUILTIN);
		}

<PROTO>({BUILTIN}|{OTHER})	{
	return(BUILTIN);
		}

<PROTO>{LETTER}+{ALFNUM}*	{
	strcpy(identifyer, yytext);
	return(IDENTIFYER);
		}

<PROTO>"..."	{
	return(VARARGS);
		}

<PROTO>({PTR}{WHITE}*)+	{
	return(PTR);
		}

<PROTO>"("		{
	return(OPEN);
		}
<PROTO>")"		{
	return(CLOSE);
		}
<PROTO>","		{
	return(ARGSEP);
		}

<PROTO>";"	{
	return(SEMICOL);
		}

<PROTO>{CMTSTART}	{
	BEGIN PROTOCMT;
		}

<PROTOCMT>{CMTEND}	{
	BEGIN PROTO;
	}
<PROTOCMT>"\n"		{
	yylineno++;
	}
<PROTOCMT>.			{
	}

<PROTO>"#ifndef".*"\n"	{
	yylineno++;
		}
<PROTO>"#define".*"\n"	{
	yylineno++;
		}
<PROTO>"#endif".*"\n"	{
	yylineno++;
		}
<PROTO>"#include".*"\n"	{
	yylineno++;
		}

<PROTO>"\n"	{
	yylineno++;
		}

<PROTO>.	{
		}


"\n"	{
	yylineno++;
	return(NEWLINE);
		}

.		{
	return(yytext[0]);
		}

%%

/* lexical part of .fd file parsing	 */

int             yylineno = 0;
