David Reiss | ea2cba8 | 2009-03-30 21:35:00 +0000 | [diff] [blame] | 1 | /* |
| 2 | * Licensed to the Apache Software Foundation (ASF) under one |
| 3 | * or more contributor license agreements. See the NOTICE file |
| 4 | * distributed with this work for additional information |
| 5 | * regarding copyright ownership. The ASF licenses this file |
| 6 | * to you under the Apache License, Version 2.0 (the |
| 7 | * "License"); you may not use this file except in compliance |
| 8 | * with the License. You may obtain a copy of the License at |
Mark Slee | e9ce01c | 2007-05-16 02:29:53 +0000 | [diff] [blame] | 9 | * |
David Reiss | ea2cba8 | 2009-03-30 21:35:00 +0000 | [diff] [blame] | 10 | * http://www.apache.org/licenses/LICENSE-2.0 |
| 11 | * |
| 12 | * Unless required by applicable law or agreed to in writing, |
| 13 | * software distributed under the License is distributed on an |
| 14 | * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY |
| 15 | * KIND, either express or implied. See the License for the |
| 16 | * specific language governing permissions and limitations |
| 17 | * under the License. |
Mark Slee | e9ce01c | 2007-05-16 02:29:53 +0000 | [diff] [blame] | 18 | */ |
| 19 | |
| 20 | /** |
Mark Slee | 3198572 | 2006-05-24 21:45:31 +0000 | [diff] [blame] | 21 | * Thrift scanner. |
Mark Slee | 27ed6ec | 2007-08-16 01:26:31 +0000 | [diff] [blame] | 22 | * |
Mark Slee | 3198572 | 2006-05-24 21:45:31 +0000 | [diff] [blame] | 23 | * Tokenizes a thrift definition file. |
Mark Slee | 3198572 | 2006-05-24 21:45:31 +0000 | [diff] [blame] | 24 | */ |
Mark Slee | f5377b3 | 2006-10-10 01:42:59 +0000 | [diff] [blame] | 25 | |
Mark Slee | 3198572 | 2006-05-24 21:45:31 +0000 | [diff] [blame] | 26 | %{ |
| 27 | |
Christian Lavoie | af65f1b | 2010-11-24 21:58:05 +0000 | [diff] [blame] | 28 | /* This is redundant with some of the flags in Makefile.am, but it works |
| 29 | * when people override CXXFLAGS without being careful. The pragmas are |
| 30 | * the 'right' way to do it, but don't work on old-enough GCC (in particular |
| 31 | * the GCC that ship on Mac OS X 10.6.5, *counter* to what the GNU docs say) |
| 32 | * |
| 33 | * We should revert the Makefile.am changes once Apple ships a reasonable |
| 34 | * GCC. |
| 35 | */ |
Ben Craig | e957675 | 2013-10-11 08:19:16 -0500 | [diff] [blame] | 36 | #ifdef __GNUC__ |
Roger Meier | 3b771a1 | 2010-11-17 22:11:26 +0000 | [diff] [blame] | 37 | #pragma GCC diagnostic ignored "-Wunused-function" |
| 38 | #pragma GCC diagnostic ignored "-Wunused-label" |
Ben Craig | e957675 | 2013-10-11 08:19:16 -0500 | [diff] [blame] | 39 | #endif |
| 40 | |
| 41 | #ifdef _MSC_VER |
James E. King, III | 7edc8fa | 2017-01-20 10:11:41 -0500 | [diff] [blame] | 42 | #pragma warning( push ) |
| 43 | |
| 44 | // warning C4102: 'find_rule' : unreferenced label |
| 45 | #pragma warning( disable : 4102 ) |
| 46 | |
| 47 | // warning C4267: 'argument' : conversion from 'size_t' to 'int', possible loss of data |
| 48 | #pragma warning( disable : 4267 ) |
| 49 | |
| 50 | // avoid isatty redefinition |
Ben Craig | e957675 | 2013-10-11 08:19:16 -0500 | [diff] [blame] | 51 | #define YY_NEVER_INTERACTIVE 1 |
Roger Meier | 86fded2 | 2015-05-15 12:01:38 +0200 | [diff] [blame] | 52 | |
| 53 | #define YY_NO_UNISTD_H 1 |
Ben Craig | e957675 | 2013-10-11 08:19:16 -0500 | [diff] [blame] | 54 | #endif |
Roger Meier | 3b771a1 | 2010-11-17 22:11:26 +0000 | [diff] [blame] | 55 | |
Jens Geyer | 8cd3efe | 2013-09-16 22:17:52 +0200 | [diff] [blame] | 56 | #include <cassert> |
David Reiss | 82e6fc0 | 2009-03-26 23:32:36 +0000 | [diff] [blame] | 57 | #include <string> |
David Reiss | f145416 | 2008-06-30 20:45:47 +0000 | [diff] [blame] | 58 | #include <errno.h> |
Roger Meier | 9212e79 | 2012-06-12 21:01:06 +0000 | [diff] [blame] | 59 | #include <stdlib.h> |
David Reiss | f145416 | 2008-06-30 20:45:47 +0000 | [diff] [blame] | 60 | |
Ben Craig | e957675 | 2013-10-11 08:19:16 -0500 | [diff] [blame] | 61 | #ifdef _MSC_VER |
dtmuller | 052abc3 | 2016-07-26 11:58:28 +0200 | [diff] [blame] | 62 | #include "thrift/windows/config.h" |
Roger Meier | 57e6de4 | 2014-07-16 10:19:59 +0200 | [diff] [blame] | 63 | #endif |
dtmuller | 052abc3 | 2016-07-26 11:58:28 +0200 | [diff] [blame] | 64 | #include "thrift/main.h" |
| 65 | #include "thrift/common.h" |
| 66 | #include "thrift/globals.h" |
| 67 | #include "thrift/parse/t_program.h" |
Mark Slee | 3198572 | 2006-05-24 21:45:31 +0000 | [diff] [blame] | 68 | |
Mark Slee | f5377b3 | 2006-10-10 01:42:59 +0000 | [diff] [blame] | 69 | /** |
| 70 | * Must be included AFTER parse/t_program.h, but I can't remember why anymore |
| 71 | * because I wrote this a while ago. |
| 72 | */ |
jfarrell | 4f54d13 | 2014-07-10 09:23:43 -0400 | [diff] [blame] | 73 | #if defined(BISON_USE_PARSER_H_EXTENSION) |
dtmuller | 052abc3 | 2016-07-26 11:58:28 +0200 | [diff] [blame] | 74 | #include "thrift/thrifty.h" |
jfarrell | 4f54d13 | 2014-07-10 09:23:43 -0400 | [diff] [blame] | 75 | #else |
dtmuller | 052abc3 | 2016-07-26 11:58:28 +0200 | [diff] [blame] | 76 | #include "thrift/thrifty.hh" |
jfarrell | 4f54d13 | 2014-07-10 09:23:43 -0400 | [diff] [blame] | 77 | #endif |
Mark Slee | 3198572 | 2006-05-24 21:45:31 +0000 | [diff] [blame] | 78 | |
Mario Emmenlauer | 695bfb2 | 2022-09-07 11:09:27 +0200 | [diff] [blame] | 79 | void integer_overflow(const char* text) { |
David Reiss | f145416 | 2008-06-30 20:45:47 +0000 | [diff] [blame] | 80 | yyerror("This integer is too big: \"%s\"\n", text); |
| 81 | exit(1); |
| 82 | } |
| 83 | |
Mario Emmenlauer | 695bfb2 | 2022-09-07 11:09:27 +0200 | [diff] [blame] | 84 | void unexpected_token(const char* text) { |
Bryan Duxbury | 235f8b5 | 2011-08-19 18:27:47 +0000 | [diff] [blame] | 85 | yyerror("Unexpected token in input: \"%s\"\n", text); |
| 86 | exit(1); |
| 87 | } |
| 88 | |
Mario Emmenlauer | 695bfb2 | 2022-09-07 11:09:27 +0200 | [diff] [blame] | 89 | void error_no_longer_supported(const char* text, const char* replace_with) { |
Jens Geyer | 0b1eb6b | 2022-06-05 11:12:49 +0200 | [diff] [blame] | 90 | yyerror("\"%s\" is no longer supported, use \"%s\" instead. Line %d\n", text, replace_with, yylineno); |
| 91 | exit(1); |
| 92 | } |
| 93 | |
| 94 | |
Mark Slee | 3198572 | 2006-05-24 21:45:31 +0000 | [diff] [blame] | 95 | %} |
| 96 | |
Mark Slee | f5377b3 | 2006-10-10 01:42:59 +0000 | [diff] [blame] | 97 | /** |
| 98 | * Provides the yylineno global, useful for debugging output |
| 99 | */ |
Mark Slee | 27ed6ec | 2007-08-16 01:26:31 +0000 | [diff] [blame] | 100 | %option lex-compat |
Mark Slee | 3198572 | 2006-05-24 21:45:31 +0000 | [diff] [blame] | 101 | |
Mark Slee | 27ed6ec | 2007-08-16 01:26:31 +0000 | [diff] [blame] | 102 | /** |
David Reiss | 4563acd | 2010-08-31 16:51:29 +0000 | [diff] [blame] | 103 | * Our inputs are all single files, so no need for yywrap |
| 104 | */ |
| 105 | %option noyywrap |
| 106 | |
| 107 | /** |
Christian Lavoie | 77215d8 | 2010-11-07 19:42:48 +0000 | [diff] [blame] | 108 | * We don't use it, and it fires up warnings at -Wall |
| 109 | */ |
| 110 | %option nounput |
| 111 | |
| 112 | /** |
Mark Slee | f5377b3 | 2006-10-10 01:42:59 +0000 | [diff] [blame] | 113 | * Helper definitions, comments, constants, and whatnot |
| 114 | */ |
| 115 | |
Mark Slee | bd58822 | 2007-11-21 08:43:35 +0000 | [diff] [blame] | 116 | intconstant ([+-]?[0-9]+) |
Jens Geyer | 5ec2121 | 2015-04-26 15:24:59 +0200 | [diff] [blame] | 117 | hexconstant ([+-]?"0x"[0-9A-Fa-f]+) |
Mark Slee | bd58822 | 2007-11-21 08:43:35 +0000 | [diff] [blame] | 118 | dubconstant ([+-]?[0-9]*(\.[0-9]+)?([eE][+-]?[0-9]+)?) |
Carl Yeksigian | de07408 | 2013-06-04 04:28:31 -0400 | [diff] [blame] | 119 | identifier ([a-zA-Z_](\.[a-zA-Z_0-9]|[a-zA-Z_0-9])*) |
Mark Slee | bd58822 | 2007-11-21 08:43:35 +0000 | [diff] [blame] | 120 | whitespace ([ \t\r\n]*) |
| 121 | sillycomm ("/*""*"*"*/") |
Jens Geyer | 775671a | 2016-03-06 19:02:42 +0100 | [diff] [blame] | 122 | multicm_begin ("/*") |
| 123 | doctext_begin ("/**") |
Mark Slee | bd58822 | 2007-11-21 08:43:35 +0000 | [diff] [blame] | 124 | comment ("//"[^\n]*) |
| 125 | unixcomment ("#"[^\n]*) |
| 126 | symbol ([:;\,\{\}\(\)\=<>\[\]]) |
David Reiss | 82e6fc0 | 2009-03-26 23:32:36 +0000 | [diff] [blame] | 127 | literal_begin (['\"]) |
Mark Slee | 3198572 | 2006-05-24 21:45:31 +0000 | [diff] [blame] | 128 | |
| 129 | %% |
| 130 | |
Mark Slee | bd58822 | 2007-11-21 08:43:35 +0000 | [diff] [blame] | 131 | {whitespace} { /* do nothing */ } |
| 132 | {sillycomm} { /* do nothing */ } |
Jens Geyer | 775671a | 2016-03-06 19:02:42 +0100 | [diff] [blame] | 133 | |
| 134 | {doctext_begin} { |
| 135 | std::string parsed("/**"); |
| 136 | int state = 0; // 0 = normal, 1 = "*" seen, "*/" seen |
| 137 | while(state < 2) |
| 138 | { |
| 139 | int ch = yyinput(); |
| 140 | parsed.push_back(ch); |
| 141 | switch (ch) { |
| 142 | case EOF: |
| 143 | yyerror("Unexpected end of file in doc-comment at %d\n", yylineno); |
| 144 | exit(1); |
| 145 | case '*': |
| 146 | state = 1; |
| 147 | break; |
| 148 | case '/': |
| 149 | state = (state == 1) ? 2 : 0; |
| 150 | break; |
| 151 | default: |
| 152 | state = 0; |
| 153 | break; |
| 154 | } |
| 155 | } |
| 156 | pdebug("doctext = \"%s\"\n",parsed.c_str()); |
| 157 | |
| 158 | /* This does not show up in the parse tree. */ |
| 159 | /* Rather, the parser will grab it out of the global. */ |
| 160 | if (g_parse_mode == PROGRAM) { |
| 161 | clear_doctext(); |
| 162 | g_doctext = strdup(parsed.c_str() + 3); |
| 163 | assert(strlen(g_doctext) >= 2); |
| 164 | g_doctext[strlen(g_doctext) - 2] = ' '; |
| 165 | g_doctext[strlen(g_doctext) - 1] = '\0'; |
| 166 | g_doctext = clean_up_doctext(g_doctext); |
| 167 | g_doctext_lineno = yylineno; |
zeshuai007 | 26681fb | 2020-06-03 17:24:38 +0800 | [diff] [blame] | 168 | if( (g_program_doctext_candidate == nullptr) && (g_program_doctext_status == INVALID)){ |
Jens Geyer | 775671a | 2016-03-06 19:02:42 +0100 | [diff] [blame] | 169 | g_program_doctext_candidate = strdup(g_doctext); |
| 170 | g_program_doctext_lineno = g_doctext_lineno; |
| 171 | g_program_doctext_status = STILL_CANDIDATE; |
| 172 | pdebug("%s","program doctext set to STILL_CANDIDATE"); |
| 173 | } |
| 174 | } |
| 175 | } |
| 176 | |
| 177 | {multicm_begin} { /* parsed, but thrown away */ |
| 178 | std::string parsed("/*"); |
| 179 | int state = 0; // 0 = normal, 1 = "*" seen, "*/" seen |
| 180 | while(state < 2) |
| 181 | { |
| 182 | int ch = yyinput(); |
| 183 | parsed.push_back(ch); |
| 184 | switch (ch) { |
| 185 | case EOF: |
| 186 | yyerror("Unexpected end of file in multiline comment at %d\n", yylineno); |
| 187 | exit(1); |
| 188 | case '*': |
| 189 | state = 1; |
| 190 | break; |
| 191 | case '/': |
| 192 | state = (state == 1) ? 2 : 0; |
| 193 | break; |
| 194 | default: |
| 195 | state = 0; |
| 196 | break; |
| 197 | } |
| 198 | } |
| 199 | pdebug("multi_comm = \"%s\"\n",parsed.c_str()); |
| 200 | } |
| 201 | |
Mark Slee | bd58822 | 2007-11-21 08:43:35 +0000 | [diff] [blame] | 202 | {comment} { /* do nothing */ } |
| 203 | {unixcomment} { /* do nothing */ } |
Mark Slee | 3198572 | 2006-05-24 21:45:31 +0000 | [diff] [blame] | 204 | |
Mark Slee | bd58822 | 2007-11-21 08:43:35 +0000 | [diff] [blame] | 205 | {symbol} { return yytext[0]; } |
Roger Meier | 0c3c895 | 2011-08-22 21:38:16 +0000 | [diff] [blame] | 206 | "*" { return yytext[0]; } |
Mark Slee | 9cb7c61 | 2006-09-01 22:17:45 +0000 | [diff] [blame] | 207 | |
Bryan Duxbury | 6c928f3 | 2011-10-13 21:32:52 +0000 | [diff] [blame] | 208 | "false" { yylval.iconst=0; return tok_int_constant; } |
| 209 | "true" { yylval.iconst=1; return tok_int_constant; } |
| 210 | |
Mark Slee | bd58822 | 2007-11-21 08:43:35 +0000 | [diff] [blame] | 211 | "namespace" { return tok_namespace; } |
Mark Slee | bd58822 | 2007-11-21 08:43:35 +0000 | [diff] [blame] | 212 | "cpp_include" { return tok_cpp_include; } |
| 213 | "cpp_type" { return tok_cpp_type; } |
Mark Slee | bd58822 | 2007-11-21 08:43:35 +0000 | [diff] [blame] | 214 | "xsd_all" { return tok_xsd_all; } |
| 215 | "xsd_optional" { return tok_xsd_optional; } |
| 216 | "xsd_nillable" { return tok_xsd_nillable; } |
Mark Slee | bd58822 | 2007-11-21 08:43:35 +0000 | [diff] [blame] | 217 | "xsd_attrs" { return tok_xsd_attrs; } |
| 218 | "include" { return tok_include; } |
| 219 | "void" { return tok_void; } |
| 220 | "bool" { return tok_bool; } |
Jens Geyer | 154d154 | 2022-09-10 14:30:15 +0200 | [diff] [blame] | 221 | "byte" { emit_byte_type_warning(); return tok_byte; } |
Jens Geyer | 40c28d3 | 2015-10-20 23:13:02 +0200 | [diff] [blame] | 222 | "i8" { return tok_i8; } |
Mark Slee | bd58822 | 2007-11-21 08:43:35 +0000 | [diff] [blame] | 223 | "i16" { return tok_i16; } |
| 224 | "i32" { return tok_i32; } |
| 225 | "i64" { return tok_i64; } |
| 226 | "double" { return tok_double; } |
| 227 | "string" { return tok_string; } |
| 228 | "binary" { return tok_binary; } |
Jens Geyer | 62445c1 | 2022-06-29 00:00:00 +0200 | [diff] [blame] | 229 | "uuid" { return tok_uuid; } |
Mark Slee | bd58822 | 2007-11-21 08:43:35 +0000 | [diff] [blame] | 230 | "map" { return tok_map; } |
| 231 | "list" { return tok_list; } |
| 232 | "set" { return tok_set; } |
David Reiss | cecbed8 | 2009-03-24 20:02:22 +0000 | [diff] [blame] | 233 | "oneway" { return tok_oneway; } |
Mark Slee | bd58822 | 2007-11-21 08:43:35 +0000 | [diff] [blame] | 234 | "typedef" { return tok_typedef; } |
| 235 | "struct" { return tok_struct; } |
Bryan Duxbury | ab3666e | 2009-09-01 23:03:47 +0000 | [diff] [blame] | 236 | "union" { return tok_union; } |
Mark Slee | bd58822 | 2007-11-21 08:43:35 +0000 | [diff] [blame] | 237 | "exception" { return tok_xception; } |
| 238 | "extends" { return tok_extends; } |
| 239 | "throws" { return tok_throws; } |
| 240 | "service" { return tok_service; } |
| 241 | "enum" { return tok_enum; } |
| 242 | "const" { return tok_const; } |
| 243 | "required" { return tok_required; } |
| 244 | "optional" { return tok_optional; } |
David Reiss | cecbed8 | 2009-03-24 20:02:22 +0000 | [diff] [blame] | 245 | "async" { |
| 246 | pwarning(0, "\"async\" is deprecated. It is called \"oneway\" now.\n"); |
Jens Geyer | 154d154 | 2022-09-10 14:30:15 +0200 | [diff] [blame] | 247 | return tok_async; |
David Reiss | cecbed8 | 2009-03-24 20:02:22 +0000 | [diff] [blame] | 248 | } |
Jens Geyer | 885c679 | 2014-05-02 21:31:55 +0200 | [diff] [blame] | 249 | "&" { return tok_reference; } |
Mark Slee | f0712dc | 2006-10-25 19:03:57 +0000 | [diff] [blame] | 250 | |
Mark Slee | 4f8da1d | 2006-10-12 02:47:27 +0000 | [diff] [blame] | 251 | {intconstant} { |
David Reiss | f145416 | 2008-06-30 20:45:47 +0000 | [diff] [blame] | 252 | errno = 0; |
zeshuai007 | 26681fb | 2020-06-03 17:24:38 +0800 | [diff] [blame] | 253 | yylval.iconst = strtoll(yytext, nullptr, 10); |
David Reiss | f145416 | 2008-06-30 20:45:47 +0000 | [diff] [blame] | 254 | if (errno == ERANGE) { |
| 255 | integer_overflow(yytext); |
| 256 | } |
Mark Slee | 4f8da1d | 2006-10-12 02:47:27 +0000 | [diff] [blame] | 257 | return tok_int_constant; |
| 258 | } |
Mark Slee | f5377b3 | 2006-10-10 01:42:59 +0000 | [diff] [blame] | 259 | |
Mark Slee | 600cdb3 | 2006-11-29 22:06:42 +0000 | [diff] [blame] | 260 | {hexconstant} { |
David Reiss | f145416 | 2008-06-30 20:45:47 +0000 | [diff] [blame] | 261 | errno = 0; |
Jens Geyer | 5ec2121 | 2015-04-26 15:24:59 +0200 | [diff] [blame] | 262 | char sign = yytext[0]; |
| 263 | int shift = sign == '0' ? 2 : 3; |
zeshuai007 | 26681fb | 2020-06-03 17:24:38 +0800 | [diff] [blame] | 264 | yylval.iconst = strtoll(yytext+shift, nullptr, 16); |
Jens Geyer | 5ec2121 | 2015-04-26 15:24:59 +0200 | [diff] [blame] | 265 | if (sign == '-') { |
| 266 | yylval.iconst = -yylval.iconst; |
| 267 | } |
David Reiss | f145416 | 2008-06-30 20:45:47 +0000 | [diff] [blame] | 268 | if (errno == ERANGE) { |
| 269 | integer_overflow(yytext); |
| 270 | } |
Mark Slee | 600cdb3 | 2006-11-29 22:06:42 +0000 | [diff] [blame] | 271 | return tok_int_constant; |
| 272 | } |
| 273 | |
Mark Slee | 4f8da1d | 2006-10-12 02:47:27 +0000 | [diff] [blame] | 274 | {identifier} { |
| 275 | yylval.id = strdup(yytext); |
| 276 | return tok_identifier; |
| 277 | } |
| 278 | |
Jens Geyer | 5eed3a1 | 2015-12-08 01:32:12 +0100 | [diff] [blame] | 279 | {dubconstant} { |
| 280 | /* Deliberately placed after identifier, since "e10" is NOT a double literal (THRIFT-3477) */ |
| 281 | yylval.dconst = atof(yytext); |
| 282 | return tok_dub_constant; |
| 283 | } |
| 284 | |
David Reiss | 82e6fc0 | 2009-03-26 23:32:36 +0000 | [diff] [blame] | 285 | {literal_begin} { |
| 286 | char mark = yytext[0]; |
| 287 | std::string result; |
| 288 | for(;;) |
| 289 | { |
| 290 | int ch = yyinput(); |
| 291 | switch (ch) { |
| 292 | case EOF: |
| 293 | yyerror("End of file while read string at %d\n", yylineno); |
| 294 | exit(1); |
| 295 | case '\n': |
| 296 | yyerror("End of line while read string at %d\n", yylineno - 1); |
| 297 | exit(1); |
| 298 | case '\\': |
| 299 | ch = yyinput(); |
| 300 | switch (ch) { |
| 301 | case 'r': |
| 302 | result.push_back('\r'); |
| 303 | continue; |
| 304 | case 'n': |
| 305 | result.push_back('\n'); |
| 306 | continue; |
| 307 | case 't': |
| 308 | result.push_back('\t'); |
| 309 | continue; |
| 310 | case '"': |
| 311 | result.push_back('"'); |
| 312 | continue; |
| 313 | case '\'': |
| 314 | result.push_back('\''); |
| 315 | continue; |
| 316 | case '\\': |
| 317 | result.push_back('\\'); |
| 318 | continue; |
| 319 | default: |
| 320 | yyerror("Bad escape character\n"); |
| 321 | return -1; |
| 322 | } |
| 323 | break; |
| 324 | default: |
| 325 | if (ch == mark) { |
| 326 | yylval.id = strdup(result.c_str()); |
| 327 | return tok_literal; |
| 328 | } else { |
| 329 | result.push_back(ch); |
| 330 | } |
| 331 | } |
| 332 | } |
Mark Slee | 3015287 | 2006-11-28 01:24:07 +0000 | [diff] [blame] | 333 | } |
| 334 | |
Mark Slee | 3198572 | 2006-05-24 21:45:31 +0000 | [diff] [blame] | 335 | |
Bryan Duxbury | 235f8b5 | 2011-08-19 18:27:47 +0000 | [diff] [blame] | 336 | . { |
| 337 | unexpected_token(yytext); |
| 338 | } |
| 339 | |
Mark Slee | 3198572 | 2006-05-24 21:45:31 +0000 | [diff] [blame] | 340 | %% |
David Reiss | 4a05434 | 2009-03-26 23:32:27 +0000 | [diff] [blame] | 341 | |
James E. King, III | 7edc8fa | 2017-01-20 10:11:41 -0500 | [diff] [blame] | 342 | #ifdef _MSC_VER |
| 343 | #pragma warning( pop ) |
| 344 | #endif |
| 345 | |
David Reiss | 4a05434 | 2009-03-26 23:32:27 +0000 | [diff] [blame] | 346 | /* vim: filetype=lex |
| 347 | */ |