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