%{
/****************************************************************************/
/* Copyright (c) 2000 MBARI                                                 */
/* MBARI Proprietary Information. All rights reserved.                      */
/****************************************************************************/
/* Summary  :                                                               */
/* Filename : idl.l                                                         */
/* Author   : Tom O'Reilly                                                  */
/* Project  :                                                               */
/* Version  : 1.0                                                           */
/* Created  : 02/07/2000                                                    */
/* Modified :                                                               */
/* Archived :                                                               */
/****************************************************************************/
/* Modification History:                                                    */
/****************************************************************************/
#include <stdio.h>
#include <string.h>
#ifdef _QNX
# include "idl.tab.h"
#else
# include "idl.tab.cc.h"
#endif

int _lineNo = 1;
int _starting = 0;


/* ***************
#undef yywrap

int yywrap() 
{
  int ret;
  if (_starting) {
    ret = 0;
    _starting = 0;
  }
  else
    ret = 1;

  return ret; 
}
*********** */

void restartLexer()
{
  _lineNo = 1;
  _starting = 1;
}


int idlFileLineNo() {
  return _lineNo;
}

#ifndef _QNX
extern "C" { int yywrap(); };

int yywrap()
{
  return 1;
}
#endif


%}

%x COMMENT


%%

"//".*            { yylval.string = strdup(yytext); return CommentString; }
"/*".*"*/"        { yylval.string = strdup(yytext); return CommentString; }

"/*"              { BEGIN COMMENT; yylval.string = strdup(yytext); return CommentString; }
<COMMENT>"*/"     { yylval.string = strdup(yytext); BEGIN INITIAL; return CommentString; }

<COMMENT>^.*    { yylval.string = strdup(yytext); return CommentString; }

<COMMENT>^[ \t]*\n       { _lineNo++; yylval.string = strdup(yytext); return CommentString; }

#line.*           { ; /* Ignore pre-compiler stuff */ }
[ \t]+            { ; /* Eat extra whitespace */ }
interface         { return InterfaceTag; }
struct            { return StructTag; }
enum              { return EnumerationTag; }
in                { return InTag; }
out               { return OutTag; }
inout             { return InOutTag; }
float             { return FloatTag; }
double            { return DoubleTag; }
long              { return LongTag; }
short             { return ShortTag; }
boolean           { return BooleanTag; }
char              { return CharTag; }
"unsigned char"   { return UnsignedCharTag; }
"unsigned short"  { return UnsignedShortTag; }
"unsigned long"   { return UnsignedLongTag; }
void              { return VoidTag; }
string            { return StringTag; }
typedef           { return TypedefTag; }
sequence          { return SequenceTag; }
"<"               { return StartBoundTag; }
">"               { return EndBoundTag; }
"#[ \t]*include"  { return IncludeTag; }
::                { return ContextDelimiterTag; }
[a-zA-Z]+[a-zA-Z0-9_\.\-]*   { yylval.string = strdup(yytext); return Name; }
[\+\-]*[0-9]+     { yylval.integer = atoi(yytext); return Integer; }
\{                { return '{'; }
\}                { return '}'; }
=                 { return '='; }
\;                { return ';'; }
,                 { return ','; }
\n                { _lineNo++; }
.                 { return yytext[0]; }
%%


