1 1.1 christos %{ 2 1.6 matt /* $NetBSD: tokenizer.l,v 1.6 2012/03/20 20:34:58 matt Exp $ */ 3 1.1 christos /* $OpenBSD: tokenizer.l,v 1.6 2008/08/21 21:00:14 espie Exp $ */ 4 1.1 christos /* 5 1.1 christos * Copyright (c) 2004 Marc Espie <espie (at) cvs.openbsd.org> 6 1.1 christos * 7 1.1 christos * Permission to use, copy, modify, and distribute this software for any 8 1.1 christos * purpose with or without fee is hereby granted, provided that the above 9 1.1 christos * copyright notice and this permission notice appear in all copies. 10 1.1 christos * 11 1.1 christos * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES 12 1.1 christos * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF 13 1.1 christos * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR 14 1.1 christos * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES 15 1.1 christos * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN 16 1.1 christos * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF 17 1.1 christos * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. 18 1.1 christos */ 19 1.2 christos #if HAVE_NBTOOL_CONFIG_H 20 1.2 christos #include "nbtool_config.h" 21 1.2 christos #endif 22 1.1 christos #include "parser.h" 23 1.6 matt __RCSID("$NetBSD: tokenizer.l,v 1.6 2012/03/20 20:34:58 matt Exp $"); 24 1.1 christos #include <stdlib.h> 25 1.1 christos #include <errno.h> 26 1.1 christos #include <stdint.h> 27 1.1 christos #include <limits.h> 28 1.1 christos 29 1.1 christos extern int mimic_gnu; 30 1.1 christos extern int32_t yylval; 31 1.2 christos extern int yylex(void); 32 1.2 christos extern int yywrap(void); 33 1.1 christos 34 1.1 christos int32_t number(void); 35 1.1 christos int32_t parse_radix(void); 36 1.3 christos 37 1.1 christos %} 38 1.1 christos 39 1.4 christos %option nounput 40 1.5 joerg %option noinput 41 1.4 christos 42 1.1 christos delim [ \t\n] 43 1.1 christos ws {delim}+ 44 1.1 christos hex 0[xX][0-9a-fA-F]+ 45 1.1 christos oct 0[0-7]* 46 1.1 christos dec [1-9][0-9]* 47 1.1 christos radix 0[rR][0-9]+:[0-9a-zA-Z]+ 48 1.1 christos 49 1.1 christos %% 50 1.1 christos {ws} {/* just skip it */} 51 1.1 christos {hex}|{oct}|{dec} { yylval = number(); return(NUMBER); } 52 1.1 christos {radix} { if (mimic_gnu) { 53 1.1 christos yylval = parse_radix(); return(NUMBER); 54 1.1 christos } else { 55 1.1 christos return(ERROR); 56 1.1 christos } 57 1.1 christos } 58 1.1 christos "<=" { return(LE); } 59 1.1 christos ">=" { return(GE); } 60 1.1 christos "<<" { return(LSHIFT); } 61 1.1 christos ">>" { return(RSHIFT); } 62 1.1 christos "==" { return(EQ); } 63 1.1 christos "!=" { return(NE); } 64 1.1 christos "&&" { return(LAND); } 65 1.1 christos "||" { return(LOR); } 66 1.1 christos . { return yytext[0]; } 67 1.1 christos %% 68 1.1 christos 69 1.1 christos int32_t 70 1.6 matt number(void) 71 1.1 christos { 72 1.1 christos long l; 73 1.1 christos 74 1.1 christos errno = 0; 75 1.1 christos l = strtol(yytext, NULL, 0); 76 1.1 christos if (((l == LONG_MAX || l == LONG_MIN) && errno == ERANGE) || 77 1.1 christos l > INT32_MAX || l < INT32_MIN) { 78 1.1 christos fprintf(stderr, "m4: numeric overflow in expr: %s\n", yytext); 79 1.1 christos } 80 1.1 christos return l; 81 1.1 christos } 82 1.1 christos 83 1.1 christos int32_t 84 1.6 matt parse_radix(void) 85 1.1 christos { 86 1.1 christos long base; 87 1.1 christos char *next; 88 1.1 christos long l; 89 1.1 christos 90 1.1 christos l = 0; 91 1.1 christos base = strtol(yytext+2, &next, 0); 92 1.1 christos if (base > 36 || next == NULL) { 93 1.1 christos fprintf(stderr, "m4: error in number %s\n", yytext); 94 1.1 christos } else { 95 1.1 christos next++; 96 1.1 christos while (*next != 0) { 97 1.1 christos if (*next >= '0' && *next <= '9') 98 1.1 christos l = base * l + *next - '0'; 99 1.1 christos else if (*next >= 'a' && *next <= 'z') 100 1.1 christos l = base * l + *next - 'a' + 10; 101 1.1 christos else if (*next >= 'A' && *next <= 'Z') 102 1.1 christos l = base * l + *next - 'A' + 10; 103 1.1 christos next++; 104 1.1 christos } 105 1.1 christos } 106 1.1 christos return l; 107 1.1 christos } 108 1.1 christos 109