/***********************************************************************
 *  This file is part of SpaceChart.
 *  Copyright (C) 2001 Miguel Coca <e970095@zipi.fi.upm.es>
 *
 *  This program is free software; you can redistribute it and/or modify
 *  it under the terms of the GNU General Public License as published by
 *  the Free Software Foundation; either version 2 of the License, or
 *  (at your option) any later version.
 *
 *  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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
 ***********************************************************************/

%{
#include "../include/starmap.h"
#include "../include/star.h"
#include "../include/star_selection.h"
#include "rcparser_y.h"

static void is_in_list( char class, const char *list, int *is );

%}

%option yylineno

%%

#.*\n

[ \t\r]+

\\\n

	/* Keybinding stuff */

\'.\'	{ yylval.key_press.mods = 0; yylval.key_press.key = yytext[1]; return KEY; }

Ctrl { yylval.key_press.mods = GDK_CONTROL_MASK; return KEY_MOD; }

Alt { yylval.key_press.mods = GDK_MOD1_MASK; return KEY_MOD; }

Shift { yylval.key_press.mods = GDK_SHIFT_MASK; return KEY_MOD; }

Escape { yylval.key_press.mods = 0; yylval.key_press.key = GDK_Escape; return KEY; }
F1 { yylval.key_press.mods = 0; yylval.key_press.key = GDK_F1; return KEY; }
F2 { yylval.key_press.mods = 0; yylval.key_press.key = GDK_F2; return KEY; }
F3 { yylval.key_press.mods = 0; yylval.key_press.key = GDK_F3; return KEY; }
F4 { yylval.key_press.mods = 0; yylval.key_press.key = GDK_F4; return KEY; }
F5 { yylval.key_press.mods = 0; yylval.key_press.key = GDK_F5; return KEY; }
F6 { yylval.key_press.mods = 0; yylval.key_press.key = GDK_F6; return KEY; }
F7 { yylval.key_press.mods = 0; yylval.key_press.key = GDK_F7; return KEY; }
F8 { yylval.key_press.mods = 0; yylval.key_press.key = GDK_F8; return KEY; }
F9 { yylval.key_press.mods = 0; yylval.key_press.key = GDK_F9; return KEY; }
F10 { yylval.key_press.mods = 0; yylval.key_press.key = GDK_F10; return KEY; }
F11 { yylval.key_press.mods = 0; yylval.key_press.key = GDK_F11; return KEY; }
F12 { yylval.key_press.mods = 0; yylval.key_press.key = GDK_F12; return KEY; }
Return { yylval.key_press.mods = 0; yylval.key_press.key = GDK_Return; return KEY; }
Page_Up { yylval.key_press.mods = 0; yylval.key_press.key = GDK_Page_Up; return KEY; }
Page_Down { yylval.key_press.mods = 0; yylval.key_press.key = GDK_Page_Down; return KEY; }
Insert { yylval.key_press.mods = 0; yylval.key_press.key = GDK_Insert; return KEY; }
Home { yylval.key_press.mods = 0; yylval.key_press.key = GDK_Home; return KEY; }
End { yylval.key_press.mods = 0; yylval.key_press.key = GDK_End; return KEY; }

MoveUp { yylval.key_name = KEY_MOVE_UP; return KEYNAME; }
MoveDown { yylval.key_name = KEY_MOVE_DOWN; return KEYNAME; }
MoveLeft { yylval.key_name = KEY_MOVE_LEFT; return KEYNAME; }
MoveRight { yylval.key_name =  KEY_MOVE_RIGHT; return KEYNAME; }
MoveFront { yylval.key_name =  KEY_MOVE_FRONT; return KEYNAME; }
MoveRear { yylval.key_name =  KEY_MOVE_REAR; return KEYNAME; }
LoadSettings { yylval.key_name = KEY_LOAD_SETTINGS; return KEYNAME; }
SaveSettings { yylval.key_name =  KEY_SAVE_SETTINGS; return KEYNAME; }
RotateUp { yylval.key_name = KEY_ROT_UP; return KEYNAME; }
RotateDown { yylval.key_name = KEY_ROT_DOWN; return KEYNAME; }
RotateLeft { yylval.key_name = KEY_ROT_LEFT; return KEYNAME; }
RotateRight { yylval.key_name = KEY_ROT_RIGHT; return KEYNAME; }
OpenSettings { yylval.key_name =  KEY_SETTINGS; return KEYNAME; }
OpenStarSelection { yylval.key_name =  KEY_STAR_SEL; return KEYNAME; }
ToggleLinks { yylval.key_name =  KEY_TOGGLE_LINKS; return KEYNAME; }
ToggleLinkLabels { yylval.key_name =  KEY_TOGGLE_LINK_LABELS; return KEYNAME; }
ToggleStarLabels { yylval.key_name =  KEY_TOGGLE_STAR_LABELS; return KEYNAME; }
ReloadSettings { yylval.key_name =  KEY_RELOAD_SETTINGS; return KEYNAME; }

	/* Everything else */

catalog return CATALOG;

user_coords return USER_COORDS;

north return NORTH;

center return CENTER;

view_radius return VIEW_RADIUS;

max_link return MAX_LINK;

show_links return SHOW_LINKS;

show_link_labels return SHOW_LINK_LABELS;

show_star_labels return SHOW_STAR_LABELS;

labels_color return LABELS_COLOR;

labels_font return LABELS_FONT;

distance_unit return DISTANCE_UNIT;

star_selection return STAR_SELECTION;

star_rules return STAR_RULES;

link_rules return LINK_RULES;

pc { yylval.unit = DISTANCE_PARSECS; return UNIT; }

ly { yylval.unit = DISTANCE_LIGHT_YEARS; return UNIT; }

solid { yylval.style = GDK_LINE_SOLID; return STYLE; }

dashed { yylval.style = GDK_LINE_DOUBLE_DASH; return STYLE; }

[0-9]+|[0-9]*\.[0-9]+ { 
				char *locale;
				locale = setlocale( LC_NUMERIC, "C" );
				yylval.number = atof(yytext); 
				setlocale( LC_NUMERIC, locale );
				return NUM;
		      }

true { yylval.bool = 1; return BOOL; }

false { yylval.bool = 0; return BOOL; }

\[[OBAFGKMW]+\] {
        is_in_list( 'O', yytext, &(yylval.spectral_class_list.O) );
        is_in_list( 'B', yytext, &(yylval.spectral_class_list.B) );
        is_in_list( 'A', yytext, &(yylval.spectral_class_list.A) );
        is_in_list( 'F', yytext, &(yylval.spectral_class_list.F) );
        is_in_list( 'G', yytext, &(yylval.spectral_class_list.G) );
        is_in_list( 'K', yytext, &(yylval.spectral_class_list.K) );
        is_in_list( 'M', yytext, &(yylval.spectral_class_list.M) );
        is_in_list( 'W', yytext, &(yylval.spectral_class_list.W) );
        return SPECTRAL_CLASS_LIST;
}

\".*\" {
        int length;
        length = strlen(yytext);
        yylval.string = malloc( length-1 );
        strncpy( yylval.string, yytext+1, length-2 );
        yylval.string[length-2] = '\0';
        return STRING;
}

\n return '\n';

. return yytext[0];

%%

int yywrap( void )
{
        return 1;
}

int rcparser_init_lex( const char *filename )
{
        return (int) (yyin = fopen( filename, "r" ));
}

void is_in_list( char class, const char *list, int *is )
{
        int i;
        *is = 0;
        for( i = 0; list[i]; i++ )
                if( list[i] == class )
                        *is = 1;
}


syntax highlighted by Code2HTML, v. 0.9.1