1%{ 2/* 3 * Copyright (c) 2004-2006 Voltaire, Inc. All rights reserved. 4 * Copyright (c) 2002-2005 Mellanox Technologies LTD. All rights reserved. 5 * Copyright (c) 1996-2003 Intel Corporation. All rights reserved. 6 * 7 * This software is available to you under a choice of one of two 8 * licenses. You may choose to be licensed under the terms of the GNU 9 * General Public License (GPL) Version 2, available from the file 10 * COPYING in the main directory of this source tree, or the 11 * OpenIB.org BSD license below: 12 * 13 * Redistribution and use in source and binary forms, with or 14 * without modification, are permitted provided that the following 15 * conditions are met: 16 * 17 * - Redistributions of source code must retain the above 18 * copyright notice, this list of conditions and the following 19 * disclaimer. 20 * 21 * - Redistributions in binary form must reproduce the above 22 * copyright notice, this list of conditions and the following 23 * disclaimer in the documentation and/or other materials 24 * provided with the distribution. 25 * 26 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, 27 * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF 28 * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND 29 * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS 30 * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN 31 * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN 32 * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 33 * SOFTWARE. 34 * 35 */ 36 37/* 38 * Abstract: 39 * Lexer of OSM QoS parser. 40 * 41 * Environment: 42 * Linux User Mode 43 * 44 * Author: 45 * Yevgeny Kliteynik, Mellanox 46 */ 47 48#include <opensm/osm_qos_policy.h> 49#include "osm_qos_parser_y.h" 50 51#define HANDLE_IF_IN_DESCRIPTION if (in_description) { yylval = strdup(yytext); return TK_TEXT; } 52 53#define SAVE_POS save_pos() 54static void save_pos(); 55 56extern int column_num; 57extern int line_num; 58extern FILE * yyin; 59extern YYSTYPE yylval; 60 61boolean_t in_description = FALSE; 62boolean_t in_list_of_hex_num_ranges = FALSE; 63boolean_t in_node_type = FALSE; 64boolean_t in_list_of_numbers = FALSE; 65boolean_t in_list_of_strings = FALSE; 66boolean_t in_list_of_num_pairs = FALSE; 67boolean_t in_asterisk_or_list_of_numbers = FALSE; 68boolean_t in_list_of_num_ranges = FALSE; 69boolean_t in_single_string = FALSE; 70boolean_t in_single_number = FALSE; 71 72static void reset_new_line_flags(); 73#define RESET_NEW_LINE_FLAGS reset_new_line_flags() 74 75#define START_USE {in_description = TRUE;} /* list of strings including whitespace (description) */ 76#define START_PORT_GUID {in_list_of_hex_num_ranges = TRUE;} /* comma-separated list of hex num ranges */ 77#define START_PORT_NAME {in_list_of_strings = TRUE;} /* comma-separated list of following strings: ../../.. */ 78#define START_PARTITION {in_single_string = TRUE;} /* single string w/o whitespaces (partition name) */ 79#define START_NAME {in_single_string = TRUE;} /* single string w/o whitespaces (port group name) */ 80#define START_QOS_LEVEL_NAME {in_single_string = TRUE;} /* single string w/o whitespaces (qos level name in match rule) */ 81 82#define START_NODE_TYPE {in_node_type = TRUE;} /* comma-separated list of node types (ROUTER,CA,...) */ 83#define START_SL2VL_TABLE {in_list_of_numbers = TRUE;} /* comma-separated list of hex or dec numbers */ 84 85#define START_GROUP {in_list_of_strings = TRUE;} /* list of strings w/o whitespaces (group names) */ 86#define START_ACROSS {in_list_of_strings = TRUE;} /* list of strings w/o whitespaces (group names) */ 87#define START_ACROSS_TO {in_list_of_strings = TRUE;} /* list of strings w/o whitespaces (group names) */ 88#define START_ACROSS_FROM {in_list_of_strings = TRUE;} /* list of strings w/o whitespaces (group names) */ 89#define START_SOURCE {in_list_of_strings = TRUE;} /* list of strings w/o whitespaces (group names) */ 90#define START_DESTINATION {in_list_of_strings = TRUE;} /* list of strings w/o whitespaces (group names) */ 91 92#define START_VLARB_HIGH {in_list_of_num_pairs = TRUE;} /* comma-separated list of hex or dec num pairs: "num1:num2" */ 93#define START_VLARB_LOW {in_list_of_num_pairs = TRUE;} /* comma-separated list of hex or dec num pairs: "num1:num2" */ 94 95#define START_TO {in_asterisk_or_list_of_numbers = TRUE;} /* (asterisk) or (comma-separated list of hex or dec numbers) */ 96#define START_FROM {in_asterisk_or_list_of_numbers = TRUE;} /* (asterisk) or (comma-separated list of hex or dec numbers) */ 97 98#define START_PATH_BITS {in_list_of_num_ranges = TRUE;} /* comma-separated list of hex or dec num ranges */ 99#define START_QOS_CLASS {in_list_of_num_ranges = TRUE;} /* comma-separated list of hex or dec num ranges */ 100#define START_SERVICE_ID {in_list_of_num_ranges = TRUE;} /* comma-separated list of hex or dec num ranges */ 101#define START_PKEY {in_list_of_num_ranges = TRUE;} /* comma-separated list of hex or dec num ranges */ 102 103#define START_SL {in_single_number = TRUE;} /* single number */ 104#define START_VLARB_HIGH_LIMIT {in_single_number = TRUE;} /* single number */ 105#define START_MTU_LIMIT {in_single_number = TRUE;} /* single number */ 106#define START_RATE_LIMIT {in_single_number = TRUE;} /* single number */ 107#define START_PACKET_LIFE {in_single_number = TRUE;} /* single number */ 108 109#define START_ULP_DEFAULT {in_single_number = TRUE;} /* single number */ 110#define START_ULP_ANY {in_list_of_num_ranges = TRUE;} /* comma-separated list of hex or dec num ranges */ 111#define START_ULP_SDP_DEFAULT {in_single_number = TRUE;} /* single number */ 112#define START_ULP_SDP_PORT {in_list_of_num_ranges = TRUE;} /* comma-separated list of hex or dec num ranges */ 113#define START_ULP_RDS_DEFAULT {in_single_number = TRUE;} /* single number */ 114#define START_ULP_RDS_PORT {in_list_of_num_ranges = TRUE;} /* comma-separated list of hex or dec num ranges */ 115#define START_ULP_ISER_DEFAULT {in_single_number = TRUE;} /* single number */ 116#define START_ULP_ISER_PORT {in_list_of_num_ranges = TRUE;} /* comma-separated list of hex or dec num ranges */ 117#define START_ULP_SRP_GUID {in_list_of_num_ranges = TRUE;} /* comma-separated list of hex or dec num ranges */ 118#define START_ULP_IPOIB_DEFAULT {in_single_number = TRUE;} /* single number */ 119#define START_ULP_IPOIB_PKEY {in_list_of_num_ranges = TRUE;} /* comma-separated list of hex or dec num ranges */ 120 121 122%} 123 124%option nounput noinput 125 126QOS_ULPS_START qos\-ulps 127QOS_ULPS_END end\-qos\-ulps 128PORT_GROUPS_START port\-groups 129PORT_GROUPS_END end\-port\-groups 130PORT_GROUP_START port\-group 131PORT_GROUP_END end\-port\-group 132PORT_NUM port\-num 133NAME name 134USE use 135PORT_GUID port\-guid 136TARGET_PORT_GUID target\-port\-guid 137PORT_NAME port\-name 138PARTITION partition 139NODE_TYPE node\-type 140QOS_SETUP_START qos\-setup 141QOS_SETUP_END end\-qos\-setup 142VLARB_TABLES_START vlarb\-tables 143VLARB_TABLES_END end\-vlarb\-tables 144VLARB_SCOPE_START vlarb\-scope 145VLARB_SCOPE_END end\-vlarb\-scope 146GROUP group 147ACROSS across 148VLARB_HIGH vlarb\-high 149VLARB_LOW vlarb\-low 150VLARB_HIGH_LIMIT vl\-high\-limit 151SL2VL_TABLES_START sl2vl\-tables 152SL2VL_TABLES_END end\-sl2vl\-tables 153SL2VL_SCOPE_START sl2vl\-scope 154SL2VL_SCOPE_END end\-sl2vl\-scope 155TO to 156FROM from 157ACROSS_TO across\-to 158ACROSS_FROM across\-from 159SL2VL_TABLE sl2vl\-table 160QOS_LEVELS_START qos\-levels 161QOS_LEVELS_END end\-qos\-levels 162QOS_LEVEL_START qos\-level 163QOS_LEVEL_END end\-qos\-level 164SL sl 165MTU_LIMIT mtu\-limit 166RATE_LIMIT rate\-limit 167PACKET_LIFE packet\-life 168PATH_BITS path\-bits 169QOS_MATCH_RULES_START qos\-match\-rules 170QOS_MATCH_RULES_END end\-qos\-match\-rules 171QOS_MATCH_RULE_START qos\-match\-rule 172QOS_MATCH_RULE_END end\-qos\-match\-rule 173QOS_CLASS qos\-class 174SOURCE source 175DESTINATION destination 176SERVICE_ID service\-id 177PKEY pkey 178QOS_LEVEL_NAME qos\-level\-name 179 180ROUTER [Rr][Oo][Uu][Tt][Ee][Rr] 181CA [Cc][Aa] 182SWITCH [Ss][Ww][Ii][Tt][Cc][Hh] 183SELF [Ss][Ee][Ll][Ff] 184ALL [Aa][Ll][Ll] 185 186ULP_SDP [Ss][Dd][Pp] 187ULP_SRP [Ss][Rr][Pp] 188ULP_RDS [Rr][Dd][Ss] 189ULP_IPOIB [Ii][Pp][Oo][Ii][Bb] 190ULP_ISER [Ii][Ss][Ee][Rr] 191ULP_ANY [Aa][Nn][Yy] 192ULP_DEFAULT [Dd][Ee][Ff][Aa][Uu][Ll][Tt] 193 194WHITE [ \t]+ 195NEW_LINE \n 196COMMENT \#.*\n 197WHITE_DOTDOT_WHITE [ \t]*:[ \t]* 198WHITE_COMMA_WHITE [ \t]*,[ \t]* 199QUOTED_TEXT \"[^\"]*\" 200 201%% 202 203 204{COMMENT} { SAVE_POS; RESET_NEW_LINE_FLAGS; } /* swallow comment */ 205{WHITE}{NEW_LINE} { SAVE_POS; RESET_NEW_LINE_FLAGS; } /* trailing blanks with new line */ 206{WHITE} { SAVE_POS; HANDLE_IF_IN_DESCRIPTION; } 207{NEW_LINE} { SAVE_POS; RESET_NEW_LINE_FLAGS; } 208 209{QOS_ULPS_START} { SAVE_POS; HANDLE_IF_IN_DESCRIPTION; return TK_QOS_ULPS_START; } 210{QOS_ULPS_END} { SAVE_POS; HANDLE_IF_IN_DESCRIPTION; return TK_QOS_ULPS_END; } 211 212{PORT_GROUPS_START} { SAVE_POS; HANDLE_IF_IN_DESCRIPTION; return TK_PORT_GROUPS_START; } 213{PORT_GROUPS_END} { SAVE_POS; HANDLE_IF_IN_DESCRIPTION; return TK_PORT_GROUPS_END; } 214{PORT_GROUP_START} { SAVE_POS; HANDLE_IF_IN_DESCRIPTION; return TK_PORT_GROUP_START; } 215{PORT_GROUP_END} { SAVE_POS; HANDLE_IF_IN_DESCRIPTION; return TK_PORT_GROUP_END; } 216 217{QOS_SETUP_START} { SAVE_POS; HANDLE_IF_IN_DESCRIPTION; return TK_QOS_SETUP_START; } 218{QOS_SETUP_END} { SAVE_POS; HANDLE_IF_IN_DESCRIPTION; return TK_QOS_SETUP_END; } 219{VLARB_TABLES_START} { SAVE_POS; HANDLE_IF_IN_DESCRIPTION; return TK_VLARB_TABLES_START; } 220{VLARB_TABLES_END} { SAVE_POS; HANDLE_IF_IN_DESCRIPTION; return TK_VLARB_TABLES_END; } 221{VLARB_SCOPE_START} { SAVE_POS; HANDLE_IF_IN_DESCRIPTION; return TK_VLARB_SCOPE_START; } 222{VLARB_SCOPE_END} { SAVE_POS; HANDLE_IF_IN_DESCRIPTION; return TK_VLARB_SCOPE_END; } 223 224{SL2VL_TABLES_START} { SAVE_POS; HANDLE_IF_IN_DESCRIPTION; return TK_SL2VL_TABLES_START; } 225{SL2VL_TABLES_END} { SAVE_POS; HANDLE_IF_IN_DESCRIPTION; return TK_SL2VL_TABLES_END; } 226{SL2VL_SCOPE_START} { SAVE_POS; HANDLE_IF_IN_DESCRIPTION; return TK_SL2VL_SCOPE_START; } 227{SL2VL_SCOPE_END} { SAVE_POS; HANDLE_IF_IN_DESCRIPTION; return TK_SL2VL_SCOPE_END; } 228 229{QOS_LEVELS_START} { SAVE_POS; HANDLE_IF_IN_DESCRIPTION; return TK_QOS_LEVELS_START; } 230{QOS_LEVELS_END} { SAVE_POS; HANDLE_IF_IN_DESCRIPTION; return TK_QOS_LEVELS_END; } 231{QOS_LEVEL_START} { SAVE_POS; HANDLE_IF_IN_DESCRIPTION; return TK_QOS_LEVEL_START; } 232{QOS_LEVEL_END} { SAVE_POS; HANDLE_IF_IN_DESCRIPTION; return TK_QOS_LEVEL_END; } 233 234{QOS_MATCH_RULES_START} { SAVE_POS; HANDLE_IF_IN_DESCRIPTION; return TK_QOS_MATCH_RULES_START; } 235{QOS_MATCH_RULES_END} { SAVE_POS; HANDLE_IF_IN_DESCRIPTION; return TK_QOS_MATCH_RULES_END; } 236{QOS_MATCH_RULE_START} { SAVE_POS; HANDLE_IF_IN_DESCRIPTION; return TK_QOS_MATCH_RULE_START; } 237{QOS_MATCH_RULE_END} { SAVE_POS; HANDLE_IF_IN_DESCRIPTION; return TK_QOS_MATCH_RULE_END; } 238 239{PORT_GUID}{WHITE_DOTDOT_WHITE} { SAVE_POS; HANDLE_IF_IN_DESCRIPTION; START_PORT_GUID; return TK_PORT_GUID; } 240{PORT_NAME}{WHITE_DOTDOT_WHITE} { SAVE_POS; HANDLE_IF_IN_DESCRIPTION; START_PORT_NAME; return TK_PORT_NAME; } 241{PARTITION}{WHITE_DOTDOT_WHITE} { SAVE_POS; HANDLE_IF_IN_DESCRIPTION; START_PARTITION; return TK_PARTITION; } 242{NODE_TYPE}{WHITE_DOTDOT_WHITE} { SAVE_POS; HANDLE_IF_IN_DESCRIPTION; START_NODE_TYPE; return TK_NODE_TYPE; } 243{NAME}{WHITE_DOTDOT_WHITE} { SAVE_POS; HANDLE_IF_IN_DESCRIPTION; START_NAME; return TK_NAME; } 244{USE}{WHITE_DOTDOT_WHITE} { SAVE_POS; HANDLE_IF_IN_DESCRIPTION; START_USE; return TK_USE; } 245{GROUP}{WHITE_DOTDOT_WHITE} { SAVE_POS; HANDLE_IF_IN_DESCRIPTION; START_GROUP; return TK_GROUP; } 246{VLARB_HIGH}{WHITE_DOTDOT_WHITE} { SAVE_POS; HANDLE_IF_IN_DESCRIPTION; START_VLARB_HIGH; return TK_VLARB_HIGH; } 247{VLARB_LOW}{WHITE_DOTDOT_WHITE} { SAVE_POS; HANDLE_IF_IN_DESCRIPTION; START_VLARB_LOW; return TK_VLARB_LOW; } 248{VLARB_HIGH_LIMIT}{WHITE_DOTDOT_WHITE} { SAVE_POS; HANDLE_IF_IN_DESCRIPTION; START_VLARB_HIGH_LIMIT; return TK_VLARB_HIGH_LIMIT;} 249{TO}{WHITE_DOTDOT_WHITE} { SAVE_POS; HANDLE_IF_IN_DESCRIPTION; START_TO; return TK_TO; } 250{FROM}{WHITE_DOTDOT_WHITE} { SAVE_POS; HANDLE_IF_IN_DESCRIPTION; START_FROM; return TK_FROM; } 251{ACROSS_TO}{WHITE_DOTDOT_WHITE} { SAVE_POS; HANDLE_IF_IN_DESCRIPTION; START_ACROSS_TO; return TK_ACROSS_TO; } 252{ACROSS_FROM}{WHITE_DOTDOT_WHITE} { SAVE_POS; HANDLE_IF_IN_DESCRIPTION; START_ACROSS_FROM; return TK_ACROSS_FROM;} 253{ACROSS}{WHITE_DOTDOT_WHITE} { SAVE_POS; HANDLE_IF_IN_DESCRIPTION; START_ACROSS; return TK_ACROSS; } 254{SL2VL_TABLE}{WHITE_DOTDOT_WHITE} { SAVE_POS; HANDLE_IF_IN_DESCRIPTION; START_SL2VL_TABLE; return TK_SL2VL_TABLE;} 255{SL}{WHITE_DOTDOT_WHITE} { SAVE_POS; HANDLE_IF_IN_DESCRIPTION; START_SL; return TK_SL; } 256{MTU_LIMIT}{WHITE_DOTDOT_WHITE} { SAVE_POS; HANDLE_IF_IN_DESCRIPTION; START_MTU_LIMIT; return TK_MTU_LIMIT; } 257{RATE_LIMIT}{WHITE_DOTDOT_WHITE} { SAVE_POS; HANDLE_IF_IN_DESCRIPTION; START_RATE_LIMIT; return TK_RATE_LIMIT; } 258{PACKET_LIFE}{WHITE_DOTDOT_WHITE} { SAVE_POS; HANDLE_IF_IN_DESCRIPTION; START_PACKET_LIFE; return TK_PACKET_LIFE;} 259{PATH_BITS}{WHITE_DOTDOT_WHITE} { SAVE_POS; HANDLE_IF_IN_DESCRIPTION; START_PATH_BITS; return TK_PATH_BITS; } 260{QOS_CLASS}{WHITE_DOTDOT_WHITE} { SAVE_POS; HANDLE_IF_IN_DESCRIPTION; START_QOS_CLASS; return TK_QOS_CLASS; } 261{SOURCE}{WHITE_DOTDOT_WHITE} { SAVE_POS; HANDLE_IF_IN_DESCRIPTION; START_SOURCE; return TK_SOURCE; } 262{DESTINATION}{WHITE_DOTDOT_WHITE} { SAVE_POS; HANDLE_IF_IN_DESCRIPTION; START_DESTINATION; return TK_DESTINATION;} 263{SERVICE_ID}{WHITE_DOTDOT_WHITE} { SAVE_POS; HANDLE_IF_IN_DESCRIPTION; START_SERVICE_ID; return TK_SERVICE_ID; } 264{PKEY}{WHITE_DOTDOT_WHITE} { SAVE_POS; HANDLE_IF_IN_DESCRIPTION; START_PKEY; return TK_PKEY; } 265{QOS_LEVEL_NAME}{WHITE_DOTDOT_WHITE} { SAVE_POS; HANDLE_IF_IN_DESCRIPTION; START_QOS_LEVEL_NAME; return TK_QOS_LEVEL_NAME;} 266 267{ROUTER} { SAVE_POS; if (in_node_type) return TK_NODE_TYPE_ROUTER; yylval = strdup(yytext); return TK_TEXT; } 268{CA} { SAVE_POS; if (in_node_type) return TK_NODE_TYPE_CA; yylval = strdup(yytext); return TK_TEXT; } 269{SWITCH} { SAVE_POS; if (in_node_type) return TK_NODE_TYPE_SWITCH; yylval = strdup(yytext); return TK_TEXT; } 270{SELF} { SAVE_POS; if (in_node_type) return TK_NODE_TYPE_SELF; yylval = strdup(yytext); return TK_TEXT; } 271{ALL} { SAVE_POS; if (in_node_type) return TK_NODE_TYPE_ALL; yylval = strdup(yytext); return TK_TEXT; } 272 273{ULP_DEFAULT}{WHITE_DOTDOT_WHITE} { SAVE_POS; HANDLE_IF_IN_DESCRIPTION; START_ULP_DEFAULT; return TK_ULP_DEFAULT; } 274{ULP_ANY}{WHITE_COMMA_WHITE}{SERVICE_ID} { SAVE_POS; HANDLE_IF_IN_DESCRIPTION; START_ULP_ANY; return TK_ULP_ANY_SERVICE_ID; } 275{ULP_ANY}{WHITE_COMMA_WHITE}{PKEY} { SAVE_POS; HANDLE_IF_IN_DESCRIPTION; START_ULP_ANY; return TK_ULP_ANY_PKEY; } 276{ULP_ANY}{WHITE_COMMA_WHITE}{TARGET_PORT_GUID} { SAVE_POS; HANDLE_IF_IN_DESCRIPTION; START_ULP_ANY; return TK_ULP_ANY_TARGET_PORT_GUID; } 277 278{ULP_SDP}{WHITE_DOTDOT_WHITE} { SAVE_POS; HANDLE_IF_IN_DESCRIPTION; START_ULP_SDP_DEFAULT; return TK_ULP_SDP_DEFAULT; } 279{ULP_SDP}{WHITE_COMMA_WHITE}{PORT_NUM} { SAVE_POS; HANDLE_IF_IN_DESCRIPTION; START_ULP_SDP_PORT; return TK_ULP_SDP_PORT; } 280 281{ULP_RDS}{WHITE_DOTDOT_WHITE} { SAVE_POS; HANDLE_IF_IN_DESCRIPTION; START_ULP_RDS_DEFAULT; return TK_ULP_RDS_DEFAULT; } 282{ULP_RDS}{WHITE_COMMA_WHITE}{PORT_NUM} { SAVE_POS; HANDLE_IF_IN_DESCRIPTION; START_ULP_RDS_PORT; return TK_ULP_RDS_PORT; } 283 284{ULP_ISER}{WHITE_DOTDOT_WHITE} { SAVE_POS; HANDLE_IF_IN_DESCRIPTION; START_ULP_SDP_DEFAULT; return TK_ULP_ISER_DEFAULT; } 285{ULP_ISER}{WHITE_COMMA_WHITE}{PORT_NUM} { SAVE_POS; HANDLE_IF_IN_DESCRIPTION; START_ULP_SDP_PORT; return TK_ULP_ISER_PORT; } 286 287{ULP_SRP}{WHITE_COMMA_WHITE}{TARGET_PORT_GUID} { SAVE_POS; HANDLE_IF_IN_DESCRIPTION; START_ULP_SRP_GUID; return TK_ULP_SRP_GUID; } 288 289{ULP_IPOIB}{WHITE_DOTDOT_WHITE} { SAVE_POS; HANDLE_IF_IN_DESCRIPTION; START_ULP_IPOIB_DEFAULT; return TK_ULP_IPOIB_DEFAULT; } 290{ULP_IPOIB}{WHITE_COMMA_WHITE}{PKEY} { SAVE_POS; HANDLE_IF_IN_DESCRIPTION; START_ULP_IPOIB_PKEY; return TK_ULP_IPOIB_PKEY; } 291 2920[xX][0-9a-fA-F]+ { 293 SAVE_POS; 294 yylval = strdup(yytext); 295 if (in_description || in_list_of_strings || in_single_string) 296 return TK_TEXT; 297 return TK_NUMBER; 298 } 299 300[0-9]+ { 301 SAVE_POS; 302 yylval = strdup(yytext); 303 if (in_description || in_list_of_strings || in_single_string) 304 return TK_TEXT; 305 return TK_NUMBER; 306 } 307 308 309- { 310 SAVE_POS; 311 if (in_description || in_list_of_strings || in_single_string) 312 { 313 yylval = strdup(yytext); 314 return TK_TEXT; 315 } 316 return TK_DASH; 317 } 318 319: { 320 SAVE_POS; 321 if (in_description || in_list_of_strings || in_single_string) 322 { 323 yylval = strdup(yytext); 324 return TK_TEXT; 325 } 326 return TK_DOTDOT; 327 } 328 329, { 330 SAVE_POS; 331 if (in_description) 332 { 333 yylval = strdup(yytext); 334 return TK_TEXT; 335 } 336 return TK_COMMA; 337 } 338 339\* { 340 SAVE_POS; 341 if (in_description || in_list_of_strings || in_single_string) 342 { 343 yylval = strdup(yytext); 344 return TK_TEXT; 345 } 346 return TK_ASTERISK; 347 } 348 349{QUOTED_TEXT} { 350 SAVE_POS; 351 yylval = strdup(&yytext[1]); 352 yylval[strlen(yylval)-1] = '\0'; 353 return TK_TEXT; 354 } 355 356. { SAVE_POS; yylval = strdup(yytext); return TK_TEXT;} 357 358%% 359 360 361/********************************************* 362 *********************************************/ 363 364static void save_pos() 365{ 366 int i; 367 for (i = 0; i < yyleng; i++) 368 { 369 if (yytext[i] == '\n') 370 { 371 line_num ++; 372 column_num = 1; 373 } 374 else 375 column_num ++; 376 } 377} 378 379/********************************************* 380 *********************************************/ 381 382static void reset_new_line_flags() 383{ 384 in_description = FALSE; 385 in_list_of_hex_num_ranges = FALSE; 386 in_node_type = FALSE; 387 in_list_of_numbers = FALSE; 388 in_list_of_strings = FALSE; 389 in_list_of_num_pairs = FALSE; 390 in_asterisk_or_list_of_numbers = FALSE; 391 in_list_of_num_ranges = FALSE; 392 in_single_string = FALSE; 393 in_single_number = FALSE; 394} 395