188b635b84d831b109f0807922449fa7a900f5dbdStephen M. Cameron%{
288b635b84d831b109f0807922449fa7a900f5dbdStephen M. Cameron
388b635b84d831b109f0807922449fa7a900f5dbdStephen M. Cameron/*
488b635b84d831b109f0807922449fa7a900f5dbdStephen M. Cameron * (C) Copyright 2014, Stephen M. Cameron.
588b635b84d831b109f0807922449fa7a900f5dbdStephen M. Cameron *
688b635b84d831b109f0807922449fa7a900f5dbdStephen M. Cameron *  This program is free software; you can redistribute it and/or modify
788b635b84d831b109f0807922449fa7a900f5dbdStephen M. Cameron *  it under the terms of the GNU General Public License version 2 as
888b635b84d831b109f0807922449fa7a900f5dbdStephen M. Cameron *  published by the Free Software Foundation.
988b635b84d831b109f0807922449fa7a900f5dbdStephen M. Cameron *
1088b635b84d831b109f0807922449fa7a900f5dbdStephen M. Cameron *  This program is distributed in the hope that it will be useful,
1188b635b84d831b109f0807922449fa7a900f5dbdStephen M. Cameron *  but WITHOUT ANY WARRANTY; without even the implied warranty of
1288b635b84d831b109f0807922449fa7a900f5dbdStephen M. Cameron *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
1388b635b84d831b109f0807922449fa7a900f5dbdStephen M. Cameron *  GNU General Public License for more details.
1488b635b84d831b109f0807922449fa7a900f5dbdStephen M. Cameron *
1588b635b84d831b109f0807922449fa7a900f5dbdStephen M. Cameron *  You should have received a copy of the GNU General Public License
1688b635b84d831b109f0807922449fa7a900f5dbdStephen M. Cameron *  along with this program; if not, write to the Free Software
1788b635b84d831b109f0807922449fa7a900f5dbdStephen M. Cameron *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
1888b635b84d831b109f0807922449fa7a900f5dbdStephen M. Cameron *
1988b635b84d831b109f0807922449fa7a900f5dbdStephen M. Cameron */
2088b635b84d831b109f0807922449fa7a900f5dbdStephen M. Cameron
2188b635b84d831b109f0807922449fa7a900f5dbdStephen M. Cameron#include <stdio.h>
2288b635b84d831b109f0807922449fa7a900f5dbdStephen M. Cameron#include <string.h>
2388b635b84d831b109f0807922449fa7a900f5dbdStephen M. Cameron#include "y.tab.h"
2488b635b84d831b109f0807922449fa7a900f5dbdStephen M. Cameron
2588b635b84d831b109f0807922449fa7a900f5dbdStephen M. Cameron#define YYSTYPE PARSER_VALUE_TYPE
2688b635b84d831b109f0807922449fa7a900f5dbdStephen M. Cameron
27e2e7032c8091c3b85c2d55df4dea6e1575280cccJens Axboeextern int lexer_input(char *buffer, unsigned int *nbytes, int buffersize);
2888b635b84d831b109f0807922449fa7a900f5dbdStephen M. Cameron
2988b635b84d831b109f0807922449fa7a900f5dbdStephen M. Cameron#undef YY_INPUT
304ce8aba2ddf28d5ae7cdf00a5942bda0d478388dJens Axboe#define YY_INPUT(buffer, bytes_read, bytes_requested)			\
314ce8aba2ddf28d5ae7cdf00a5942bda0d478388dJens Axboe({									\
324ce8aba2ddf28d5ae7cdf00a5942bda0d478388dJens Axboe	int __ret;							\
33e2e7032c8091c3b85c2d55df4dea6e1575280cccJens Axboe	unsigned int __bread = bytes_read;				\
34e34042657a56368d8515b9875b4d7e5529353425Jens Axboe	__ret = lexer_input((buffer), &__bread, (bytes_requested));	\
35e34042657a56368d8515b9875b4d7e5529353425Jens Axboe	bytes_read = __bread;						\
364ce8aba2ddf28d5ae7cdf00a5942bda0d478388dJens Axboe	__ret;								\
37e34042657a56368d8515b9875b4d7e5529353425Jens Axboe})
3888b635b84d831b109f0807922449fa7a900f5dbdStephen M. Cameron
3988b635b84d831b109f0807922449fa7a900f5dbdStephen M. Cameronextern int yyerror(long long *result, double *dresult,
40a22867a5305f5cba020d6825793de9b9aaca1ca8Stephen M. Cameron		int *has_error, int *units_specified, const char *msg);
4188b635b84d831b109f0807922449fa7a900f5dbdStephen M. Cameron
424ce8aba2ddf28d5ae7cdf00a5942bda0d478388dJens Axboestatic void __attribute__((unused)) yyunput(int c, char *buf_ptr);
4388b635b84d831b109f0807922449fa7a900f5dbdStephen M. Cameronstatic int __attribute__((unused)) input(void);
4488b635b84d831b109f0807922449fa7a900f5dbdStephen M. Cameron
4579dc914fcf76e8f6c8f8e20dc75bd424cc833d27Stephen M. Cameron/* set by parser -- this is another thing which makes the parser thread-unsafe :(. */
4679dc914fcf76e8f6c8f8e20dc75bd424cc833d27Stephen M. Cameronint lexer_value_is_time = 0; /* for determining if "m" suffix means mega- or minutes */
4779dc914fcf76e8f6c8f8e20dc75bd424cc833d27Stephen M. Cameron
48c3805eb1451972285565504e11be642f082fe7dfStephen M. Cameron#define set_suffix_value(yylval, i_val, d_val, has_d_val) \
49c3805eb1451972285565504e11be642f082fe7dfStephen M. Cameron	(yylval).v.dval = (d_val); \
50c3805eb1451972285565504e11be642f082fe7dfStephen M. Cameron	(yylval).v.ival = (i_val); \
51c3805eb1451972285565504e11be642f082fe7dfStephen M. Cameron	(yylval).v.has_dval = (has_d_val); \
52c3805eb1451972285565504e11be642f082fe7dfStephen M. Cameron	(yylval).v.has_error = 0;
53c3805eb1451972285565504e11be642f082fe7dfStephen M. Cameron
5488b635b84d831b109f0807922449fa7a900f5dbdStephen M. Cameron%}
5588b635b84d831b109f0807922449fa7a900f5dbdStephen M. Cameron
5688b635b84d831b109f0807922449fa7a900f5dbdStephen M. Cameron%%
5788b635b84d831b109f0807922449fa7a900f5dbdStephen M. Cameron
5888b635b84d831b109f0807922449fa7a900f5dbdStephen M. Cameron
59c3805eb1451972285565504e11be642f082fe7dfStephen M. Cameron[kK]|[kK][bB] 	{
60c3805eb1451972285565504e11be642f082fe7dfStephen M. Cameron			set_suffix_value(yylval, 1024, 1024.0, 0);
61c3805eb1451972285565504e11be642f082fe7dfStephen M. Cameron			return SUFFIX;
62c3805eb1451972285565504e11be642f082fe7dfStephen M. Cameron		}
6379dc914fcf76e8f6c8f8e20dc75bd424cc833d27Stephen M. Cameron[Mm][bB]	{
64c3805eb1451972285565504e11be642f082fe7dfStephen M. Cameron			set_suffix_value(yylval, 1024 * 1024, 1024.0 * 1024.0, 0);
65c3805eb1451972285565504e11be642f082fe7dfStephen M. Cameron			return SUFFIX;
66c3805eb1451972285565504e11be642f082fe7dfStephen M. Cameron		}
67c3805eb1451972285565504e11be642f082fe7dfStephen M. Cameron[mM][sS]	{
68c3805eb1451972285565504e11be642f082fe7dfStephen M. Cameron			set_suffix_value(yylval, 1000, 1000.0, 1);
69c3805eb1451972285565504e11be642f082fe7dfStephen M. Cameron			return SUFFIX;
70c3805eb1451972285565504e11be642f082fe7dfStephen M. Cameron		}
71c3805eb1451972285565504e11be642f082fe7dfStephen M. Cameron[uU][sS]	{
72c3805eb1451972285565504e11be642f082fe7dfStephen M. Cameron			set_suffix_value(yylval, 1, 1.0, 1);
73c3805eb1451972285565504e11be642f082fe7dfStephen M. Cameron			return SUFFIX;
74c3805eb1451972285565504e11be642f082fe7dfStephen M. Cameron		}
75c3805eb1451972285565504e11be642f082fe7dfStephen M. Cameron[gG]|[Gg][Bb]	{
76c3805eb1451972285565504e11be642f082fe7dfStephen M. Cameron			set_suffix_value(yylval, 1024LL * 1024 * 1024, 1024.0 * 1024.0 * 1024, 0);
77c3805eb1451972285565504e11be642f082fe7dfStephen M. Cameron			return SUFFIX;
78c3805eb1451972285565504e11be642f082fe7dfStephen M. Cameron		}
79c3805eb1451972285565504e11be642f082fe7dfStephen M. Cameron[tT]|[tT][bB]	{
80c3805eb1451972285565504e11be642f082fe7dfStephen M. Cameron			set_suffix_value(yylval, 1024LL * 1024 * 1024 * 1024,
81c3805eb1451972285565504e11be642f082fe7dfStephen M. Cameron						1024.0 * 1024.0 * 1024.0 * 1024.0 * 1024, 0);
82c3805eb1451972285565504e11be642f082fe7dfStephen M. Cameron			return SUFFIX;
83c3805eb1451972285565504e11be642f082fe7dfStephen M. Cameron		}
84c3805eb1451972285565504e11be642f082fe7dfStephen M. Cameron[pP]|[pP][bB]	{
85c3805eb1451972285565504e11be642f082fe7dfStephen M. Cameron			set_suffix_value(yylval, 1024LL * 1024 * 1024 * 1024 * 1024,
86c3805eb1451972285565504e11be642f082fe7dfStephen M. Cameron					1024.0 * 1024.0 * 1024.0 * 1024.0 * 1024.0, 0);
87c3805eb1451972285565504e11be642f082fe7dfStephen M. Cameron			return SUFFIX;
88c3805eb1451972285565504e11be642f082fe7dfStephen M. Cameron		}
89c3805eb1451972285565504e11be642f082fe7dfStephen M. Cameron[kK][iI][Bb]	{
90c3805eb1451972285565504e11be642f082fe7dfStephen M. Cameron			set_suffix_value(yylval, 1000LL, 1000.0, 0);
91c3805eb1451972285565504e11be642f082fe7dfStephen M. Cameron			return SUFFIX;
92c3805eb1451972285565504e11be642f082fe7dfStephen M. Cameron		}
93c3805eb1451972285565504e11be642f082fe7dfStephen M. Cameron[mM][Ii][bB]	{
94c3805eb1451972285565504e11be642f082fe7dfStephen M. Cameron			set_suffix_value(yylval, 1000000LL, 1000000.0 , 0);
95c3805eb1451972285565504e11be642f082fe7dfStephen M. Cameron			return SUFFIX;
96c3805eb1451972285565504e11be642f082fe7dfStephen M. Cameron		}
97c3805eb1451972285565504e11be642f082fe7dfStephen M. Cameron[gG][iI][Bb]	{
98c3805eb1451972285565504e11be642f082fe7dfStephen M. Cameron			set_suffix_value(yylval, 1000000000LL, 1000000000.0 , 0);
99c3805eb1451972285565504e11be642f082fe7dfStephen M. Cameron			return SUFFIX;
100c3805eb1451972285565504e11be642f082fe7dfStephen M. Cameron		}
101c3805eb1451972285565504e11be642f082fe7dfStephen M. Cameron[pP][iI][Bb]	{
102c3805eb1451972285565504e11be642f082fe7dfStephen M. Cameron			set_suffix_value(yylval, 1000000000000LL, 1000000000000.0 , 0);
103c3805eb1451972285565504e11be642f082fe7dfStephen M. Cameron			return SUFFIX;
104c3805eb1451972285565504e11be642f082fe7dfStephen M. Cameron		}
105c3805eb1451972285565504e11be642f082fe7dfStephen M. Cameron[sS]		{
106c3805eb1451972285565504e11be642f082fe7dfStephen M. Cameron			set_suffix_value(yylval, 1000000LL, 1000000.0 , 0);
107c3805eb1451972285565504e11be642f082fe7dfStephen M. Cameron			return SUFFIX;
108c3805eb1451972285565504e11be642f082fe7dfStephen M. Cameron		}
10979dc914fcf76e8f6c8f8e20dc75bd424cc833d27Stephen M. Cameron[mM]		{
11079dc914fcf76e8f6c8f8e20dc75bd424cc833d27Stephen M. Cameron			if (!lexer_value_is_time) {
11179dc914fcf76e8f6c8f8e20dc75bd424cc833d27Stephen M. Cameron				set_suffix_value(yylval, 1024 * 1024, 1024.0 * 1024.0, 0);
11279dc914fcf76e8f6c8f8e20dc75bd424cc833d27Stephen M. Cameron			} else {
11379dc914fcf76e8f6c8f8e20dc75bd424cc833d27Stephen M. Cameron				set_suffix_value(yylval, 60LL * 1000000LL, 60.0 * 1000000.0, 0);
11479dc914fcf76e8f6c8f8e20dc75bd424cc833d27Stephen M. Cameron			}
11579dc914fcf76e8f6c8f8e20dc75bd424cc833d27Stephen M. Cameron			return SUFFIX;
11679dc914fcf76e8f6c8f8e20dc75bd424cc833d27Stephen M. Cameron		}
117c3805eb1451972285565504e11be642f082fe7dfStephen M. Cameron[dD]		{
118c3805eb1451972285565504e11be642f082fe7dfStephen M. Cameron			set_suffix_value(yylval, 60LL * 60LL * 24LL * 1000000LL,
119c3805eb1451972285565504e11be642f082fe7dfStephen M. Cameron						60.0 * 60.0 * 24.0 * 1000000.0, 0);
120c3805eb1451972285565504e11be642f082fe7dfStephen M. Cameron			return SUFFIX;
121c3805eb1451972285565504e11be642f082fe7dfStephen M. Cameron		}
122c3805eb1451972285565504e11be642f082fe7dfStephen M. Cameron[hH]		{
123c3805eb1451972285565504e11be642f082fe7dfStephen M. Cameron			set_suffix_value(yylval, 60LL * 60LL * 1000000LL,
124c3805eb1451972285565504e11be642f082fe7dfStephen M. Cameron					60.0 * 60.0 * 1000000.0, 0);
125c3805eb1451972285565504e11be642f082fe7dfStephen M. Cameron			return SUFFIX;
126c3805eb1451972285565504e11be642f082fe7dfStephen M. Cameron		}
12788b635b84d831b109f0807922449fa7a900f5dbdStephen M. Cameron[ \t] ; /* ignore whitespace */
128303b5cad3b9191577dde666d1988c512b5e55080Stephen M. Cameron[#:,].* ; /* ignore comments, and everything after colons and commas */
1295abaf3e2bf055bcda13c51aa27fe8fa955253dc4Stephen M. Cameron[0-9]*[.][0-9]+|[0-9]*[.]?[0-9]+[eE][-+]*[0-9]+ {
13088b635b84d831b109f0807922449fa7a900f5dbdStephen M. Cameron			int rc;
13188b635b84d831b109f0807922449fa7a900f5dbdStephen M. Cameron			double dval;
13288b635b84d831b109f0807922449fa7a900f5dbdStephen M. Cameron
13388b635b84d831b109f0807922449fa7a900f5dbdStephen M. Cameron			rc = sscanf(yytext, "%lf", &dval);
13488b635b84d831b109f0807922449fa7a900f5dbdStephen M. Cameron			if (rc == 1) {
13588b635b84d831b109f0807922449fa7a900f5dbdStephen M. Cameron				yylval.v.dval = dval;
13688b635b84d831b109f0807922449fa7a900f5dbdStephen M. Cameron				yylval.v.ival = (long long) dval;
13788b635b84d831b109f0807922449fa7a900f5dbdStephen M. Cameron				yylval.v.has_dval = 1;
13888b635b84d831b109f0807922449fa7a900f5dbdStephen M. Cameron				yylval.v.has_error = 0;
13988b635b84d831b109f0807922449fa7a900f5dbdStephen M. Cameron				return NUMBER;
14088b635b84d831b109f0807922449fa7a900f5dbdStephen M. Cameron			} else {
141a22867a5305f5cba020d6825793de9b9aaca1ca8Stephen M. Cameron				yyerror(0, 0, 0, 0, "bad number\n");
14288b635b84d831b109f0807922449fa7a900f5dbdStephen M. Cameron				yylval.v.has_error = 1;
14388b635b84d831b109f0807922449fa7a900f5dbdStephen M. Cameron				return NUMBER;
14488b635b84d831b109f0807922449fa7a900f5dbdStephen M. Cameron			}
14588b635b84d831b109f0807922449fa7a900f5dbdStephen M. Cameron		}
14688b635b84d831b109f0807922449fa7a900f5dbdStephen M. Cameron0x[0-9a-fA-F]+ {
14788b635b84d831b109f0807922449fa7a900f5dbdStephen M. Cameron		int rc, intval;
14888b635b84d831b109f0807922449fa7a900f5dbdStephen M. Cameron		rc = sscanf(yytext, "%x", &intval);
14988b635b84d831b109f0807922449fa7a900f5dbdStephen M. Cameron		if (rc == 1) {
15088b635b84d831b109f0807922449fa7a900f5dbdStephen M. Cameron			yylval.v.ival = intval;
15188b635b84d831b109f0807922449fa7a900f5dbdStephen M. Cameron			yylval.v.dval = (double) intval;
15288b635b84d831b109f0807922449fa7a900f5dbdStephen M. Cameron			yylval.v.has_dval = 0;
15388b635b84d831b109f0807922449fa7a900f5dbdStephen M. Cameron			yylval.v.has_error = 0;
15488b635b84d831b109f0807922449fa7a900f5dbdStephen M. Cameron			return NUMBER;
15588b635b84d831b109f0807922449fa7a900f5dbdStephen M. Cameron		} else {
156a22867a5305f5cba020d6825793de9b9aaca1ca8Stephen M. Cameron			yyerror(0, 0, 0, 0, "bad number\n");
15788b635b84d831b109f0807922449fa7a900f5dbdStephen M. Cameron			yylval.v.has_error = 1;
15888b635b84d831b109f0807922449fa7a900f5dbdStephen M. Cameron			return NUMBER;
15988b635b84d831b109f0807922449fa7a900f5dbdStephen M. Cameron		}
16088b635b84d831b109f0807922449fa7a900f5dbdStephen M. Cameron	}
16188b635b84d831b109f0807922449fa7a900f5dbdStephen M. Cameron[0-9]+	{
16288b635b84d831b109f0807922449fa7a900f5dbdStephen M. Cameron		int rc, intval;
16388b635b84d831b109f0807922449fa7a900f5dbdStephen M. Cameron		rc = sscanf(yytext, "%d", &intval);
16488b635b84d831b109f0807922449fa7a900f5dbdStephen M. Cameron		if (rc == 1) {
16588b635b84d831b109f0807922449fa7a900f5dbdStephen M. Cameron			yylval.v.ival = intval;
16688b635b84d831b109f0807922449fa7a900f5dbdStephen M. Cameron			yylval.v.dval = (double) intval;
16788b635b84d831b109f0807922449fa7a900f5dbdStephen M. Cameron			yylval.v.has_dval = 0;
16888b635b84d831b109f0807922449fa7a900f5dbdStephen M. Cameron			yylval.v.has_error = 0;
16988b635b84d831b109f0807922449fa7a900f5dbdStephen M. Cameron			return NUMBER;
17088b635b84d831b109f0807922449fa7a900f5dbdStephen M. Cameron		} else {
171a22867a5305f5cba020d6825793de9b9aaca1ca8Stephen M. Cameron			yyerror(0, 0, 0, 0, "bad number\n");
17288b635b84d831b109f0807922449fa7a900f5dbdStephen M. Cameron			yylval.v.has_error = 1;
17388b635b84d831b109f0807922449fa7a900f5dbdStephen M. Cameron			return NUMBER;
17488b635b84d831b109f0807922449fa7a900f5dbdStephen M. Cameron		}
17588b635b84d831b109f0807922449fa7a900f5dbdStephen M. Cameron	}
17688b635b84d831b109f0807922449fa7a900f5dbdStephen M. Cameron\n	return 0;
177ded6ec28773a2071c9e958fdb02e359ff031f85dJens Axboe[+-/*()^%]	return yytext[0];
1784fe690ef0159ae0e8f287293c2ea04566a6a58d0Stephen M. Cameron
17988b635b84d831b109f0807922449fa7a900f5dbdStephen M. Cameron.	{
18088b635b84d831b109f0807922449fa7a900f5dbdStephen M. Cameron		yylval.v.has_error = 1;
18188b635b84d831b109f0807922449fa7a900f5dbdStephen M. Cameron		return NUMBER;
18288b635b84d831b109f0807922449fa7a900f5dbdStephen M. Cameron	}
18388b635b84d831b109f0807922449fa7a900f5dbdStephen M. Cameron%%
18488b635b84d831b109f0807922449fa7a900f5dbdStephen M. Cameron
185