1 -*- Autoconf -*- 2 3 # C M4 Macros for Bison. 4 5 # Copyright (C) 2002, 2004-2012 Free Software Foundation, Inc. 6 7 # This program is free software: you can redistribute it and/or modify 8 # it under the terms of the GNU General Public License as published by 9 # the Free Software Foundation, either version 3 of the License, or 10 # (at your option) any later version. 11 # 12 # This program is distributed in the hope that it will be useful, 13 # but WITHOUT ANY WARRANTY; without even the implied warranty of 14 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 15 # GNU General Public License for more details. 16 # 17 # You should have received a copy of the GNU General Public License 18 # along with this program. If not, see <http://www.gnu.org/licenses/>. 19 20 m4_include(b4_pkgdatadir/[c-like.m4]) 21 22 # b4_tocpp(STRING) 23 # ---------------- 24 # Convert STRING into a valid C macro name. 25 m4_define([b4_tocpp], 26 [m4_toupper(m4_bpatsubst(m4_quote($1), [[^a-zA-Z0-9]+], [_]))]) 27 28 29 # b4_cpp_guard(FILE) 30 # ------------------ 31 # A valid C macro name to use as a CPP header guard for FILE. 32 m4_define([b4_cpp_guard], 33 [[YY_]b4_tocpp(m4_defn([b4_prefix])/[$1])[_INCLUDED]]) 34 35 36 # b4_cpp_guard_open(FILE) 37 # b4_cpp_guard_close(FILE) 38 # ------------------------ 39 # If FILE does not expand to nothing, open/close CPP inclusion guards for FILE. 40 m4_define([b4_cpp_guard_open], 41 [m4_ifval(m4_quote($1), 42 [#ifndef b4_cpp_guard([$1]) 43 # define b4_cpp_guard([$1])])]) 44 45 m4_define([b4_cpp_guard_close], 46 [m4_ifval(m4_quote($1), 47 [#endif b4_comment([!b4_cpp_guard([$1])])])]) 48 49 50 ## ---------------- ## 51 ## Identification. ## 52 ## ---------------- ## 53 54 # b4_comment(TEXT) 55 # ---------------- 56 m4_define([b4_comment], [/* m4_bpatsubst([$1], [ 57 ], [ 58 ]) */]) 59 60 # b4_identification 61 # ----------------- 62 # Depends on individual skeletons to define b4_pure_flag, b4_push_flag, or 63 # b4_pull_flag if they use the values of the %define variables api.pure or 64 # api.push-pull. 65 m4_define([b4_identification], 66 [[/* Identify Bison output. */ 67 #define YYBISON 1 68 69 /* Bison version. */ 70 #define YYBISON_VERSION "]b4_version[" 71 72 /* Skeleton name. */ 73 #define YYSKELETON_NAME ]b4_skeleton[]m4_ifdef([b4_pure_flag], [[ 74 75 /* Pure parsers. */ 76 #define YYPURE ]b4_pure_flag])[]m4_ifdef([b4_push_flag], [[ 77 78 /* Push parsers. */ 79 #define YYPUSH ]b4_push_flag])[]m4_ifdef([b4_pull_flag], [[ 80 81 /* Pull parsers. */ 82 #define YYPULL ]b4_pull_flag])[ 83 ]]) 84 85 86 ## ---------------- ## 87 ## Default values. ## 88 ## ---------------- ## 89 90 # b4_api_prefix, b4_api_PREFIX 91 # ---------------------------- 92 # Corresponds to %define api.prefix 93 b4_percent_define_default([[api.prefix]], [[yy]]) 94 m4_define([b4_api_prefix], 95 [b4_percent_define_get([[api.prefix]])]) 96 m4_define([b4_api_PREFIX], 97 [m4_toupper(b4_api_prefix)]) 98 99 100 # b4_prefix 101 # --------- 102 # If the %name-prefix is not given, it is api.prefix. 103 m4_define_default([b4_prefix], [b4_api_prefix]) 104 105 # If the %union is not named, its name is YYSTYPE. 106 m4_define_default([b4_union_name], [b4_api_PREFIX[]STYPE]) 107 108 109 ## ------------------------ ## 110 ## Pure/impure interfaces. ## 111 ## ------------------------ ## 112 113 # b4_user_args 114 # ------------ 115 m4_define([b4_user_args], 116 [m4_ifset([b4_parse_param], [, b4_c_args(b4_parse_param)])]) 117 118 119 # b4_parse_param 120 # -------------- 121 # If defined, b4_parse_param arrives double quoted, but below we prefer 122 # it to be single quoted. 123 m4_define([b4_parse_param], 124 b4_parse_param) 125 126 127 # b4_parse_param_for(DECL, FORMAL, BODY) 128 # --------------------------------------- 129 # Iterate over the user parameters, binding the declaration to DECL, 130 # the formal name to FORMAL, and evaluating the BODY. 131 m4_define([b4_parse_param_for], 132 [m4_foreach([$1_$2], m4_defn([b4_parse_param]), 133 [m4_pushdef([$1], m4_unquote(m4_car($1_$2)))dnl 134 m4_pushdef([$2], m4_shift($1_$2))dnl 135 $3[]dnl 136 m4_popdef([$2])dnl 137 m4_popdef([$1])dnl 138 ])]) 139 140 # b4_parse_param_use 141 # ------------------ 142 # `YYUSE' all the parse-params. 143 m4_define([b4_parse_param_use], 144 [b4_parse_param_for([Decl], [Formal], [ YYUSE (Formal); 145 ])dnl 146 ]) 147 148 149 ## ------------ ## 150 ## Data Types. ## 151 ## ------------ ## 152 153 # b4_int_type(MIN, MAX) 154 # --------------------- 155 # Return the smallest int type able to handle numbers ranging from 156 # MIN to MAX (included). 157 m4_define([b4_int_type], 158 [m4_if(b4_ints_in($@, [0], [255]), [1], [unsigned char], 159 b4_ints_in($@, [-128], [127]), [1], [signed char], 160 161 b4_ints_in($@, [0], [65535]), [1], [unsigned short int], 162 b4_ints_in($@, [-32768], [32767]), [1], [short int], 163 164 m4_eval([0 <= $1]), [1], [unsigned int], 165 166 [int])]) 167 168 169 # b4_int_type_for(NAME) 170 # --------------------- 171 # Return the smallest int type able to handle numbers ranging from 172 # `NAME_min' to `NAME_max' (included). 173 m4_define([b4_int_type_for], 174 [b4_int_type($1_min, $1_max)]) 175 176 177 # b4_table_value_equals(TABLE, VALUE, LITERAL) 178 # -------------------------------------------- 179 # Without inducing a comparison warning from the compiler, check if the 180 # literal value LITERAL equals VALUE from table TABLE, which must have 181 # TABLE_min and TABLE_max defined. YYID must be defined as an identity 182 # function that suppresses warnings about constant conditions. 183 m4_define([b4_table_value_equals], 184 [m4_if(m4_eval($3 < m4_indir([b4_]$1[_min]) 185 || m4_indir([b4_]$1[_max]) < $3), [1], 186 [[YYID (0)]], 187 [(!!(($2) == ($3)))])]) 188 189 190 ## ---------## 191 ## Values. ## 192 ## ---------## 193 194 195 # b4_null_define 196 # -------------- 197 # Portability issues: define a YY_NULL appropriate for the current 198 # language (C, C++98, or C++11). 199 m4_define([b4_null_define], 200 [# ifndef YY_NULL 201 # if defined __cplusplus && 201103L <= __cplusplus 202 # define YY_NULL nullptr 203 # else 204 # define YY_NULL 0 205 # endif 206 # endif[]dnl 207 ]) 208 209 210 # b4_null 211 # ------- 212 # Return a null pointer constant. 213 m4_define([b4_null], [YY_NULL]) 214 215 216 217 ## ------------------------- ## 218 ## Assigning token numbers. ## 219 ## ------------------------- ## 220 221 # b4_token_define(TOKEN-NAME, TOKEN-NUMBER) 222 # ----------------------------------------- 223 # Output the definition of this token as #define. 224 m4_define([b4_token_define], 225 [#define $1 $2 226 ]) 227 228 229 # b4_token_defines(LIST-OF-PAIRS-TOKEN-NAME-TOKEN-NUMBER) 230 # ------------------------------------------------------- 231 # Output the definition of the tokens (if there are) as #defines. 232 m4_define([b4_token_defines], 233 [m4_if([$#$1], [1], [], 234 [/* Tokens. */ 235 m4_map([b4_token_define], [$@])]) 236 ]) 237 238 239 # b4_token_enum(TOKEN-NAME, TOKEN-NUMBER) 240 # --------------------------------------- 241 # Output the definition of this token as an enum. 242 m4_define([b4_token_enum], 243 [$1 = $2]) 244 245 246 # b4_token_enums(LIST-OF-PAIRS-TOKEN-NAME-TOKEN-NUMBER) 247 # ----------------------------------------------------- 248 # Output the definition of the tokens (if there are) as enums. 249 m4_define([b4_token_enums], 250 [m4_if([$#$1], [1], [], 251 [[/* Tokens. */ 252 #ifndef ]b4_api_PREFIX[TOKENTYPE 253 # define ]b4_api_PREFIX[TOKENTYPE 254 /* Put the tokens into the symbol table, so that GDB and other debuggers 255 know about them. */ 256 enum ]b4_api_prefix[tokentype { 257 ]m4_map_sep([ b4_token_enum], [, 258 ], 259 [$@])[ 260 }; 261 #endif 262 ]])]) 263 264 265 # b4_token_enums_defines(LIST-OF-PAIRS-TOKEN-NAME-TOKEN-NUMBER) 266 # ------------------------------------------------------------- 267 # Output the definition of the tokens (if there are any) as enums and, if POSIX 268 # Yacc is enabled, as #defines. 269 m4_define([b4_token_enums_defines], 270 [b4_token_enums($@)b4_yacc_if([b4_token_defines($@)], []) 271 ]) 272 273 274 275 ## --------------------------------------------- ## 276 ## Defining C functions in both K&R and ANSI-C. ## 277 ## --------------------------------------------- ## 278 279 280 # b4_modern_c 281 # ----------- 282 # A predicate useful in #if to determine whether C is ancient or modern. 283 # 284 # If __STDC__ is defined, the compiler is modern. IBM xlc 7.0 when run 285 # as 'cc' doesn't define __STDC__ (or __STDC_VERSION__) for pedantic 286 # reasons, but it defines __C99__FUNC__ so check that as well. 287 # Microsoft C normally doesn't define these macros, but it defines _MSC_VER. 288 # Consider a C++ compiler to be modern if it defines __cplusplus. 289 # 290 m4_define([b4_c_modern], 291 [[(defined __STDC__ || defined __C99__FUNC__ \ 292 || defined __cplusplus || defined _MSC_VER)]]) 293 294 # b4_c_function_def(NAME, RETURN-VALUE, [DECL1, NAME1], ...) 295 # ---------------------------------------------------------- 296 # Declare the function NAME. 297 m4_define([b4_c_function_def], 298 [#if b4_c_modern 299 b4_c_ansi_function_def($@) 300 #else 301 $2 302 $1 (b4_c_knr_formal_names(m4_shift2($@))) 303 b4_c_knr_formal_decls(m4_shift2($@)) 304 #endif[]dnl 305 ]) 306 307 308 # b4_c_ansi_function_def(NAME, RETURN-VALUE, [DECL1, NAME1], ...) 309 # --------------------------------------------------------------- 310 # Declare the function NAME in ANSI. 311 m4_define([b4_c_ansi_function_def], 312 [$2 313 $1 (b4_c_ansi_formals(m4_shift2($@)))[]dnl 314 ]) 315 316 317 # b4_c_ansi_formals([DECL1, NAME1], ...) 318 # -------------------------------------- 319 # Output the arguments ANSI-C definition. 320 m4_define([b4_c_ansi_formals], 321 [m4_if([$#], [0], [void], 322 [$#$1], [1], [void], 323 [m4_map_sep([b4_c_ansi_formal], [, ], [$@])])]) 324 325 m4_define([b4_c_ansi_formal], 326 [$1]) 327 328 329 # b4_c_knr_formal_names([DECL1, NAME1], ...) 330 # ------------------------------------------ 331 # Output the argument names. 332 m4_define([b4_c_knr_formal_names], 333 [m4_map_sep([b4_c_knr_formal_name], [, ], [$@])]) 334 335 m4_define([b4_c_knr_formal_name], 336 [$2]) 337 338 339 # b4_c_knr_formal_decls([DECL1, NAME1], ...) 340 # ------------------------------------------ 341 # Output the K&R argument declarations. 342 m4_define([b4_c_knr_formal_decls], 343 [m4_map_sep([b4_c_knr_formal_decl], 344 [ 345 ], 346 [$@])]) 347 348 m4_define([b4_c_knr_formal_decl], 349 [ $1;]) 350 351 352 353 ## ------------------------------------------------------------ ## 354 ## Declaring (prototyping) C functions in both K&R and ANSI-C. ## 355 ## ------------------------------------------------------------ ## 356 357 358 # b4_c_ansi_function_decl(NAME, RETURN-VALUE, [DECL1, NAME1], ...) 359 # ---------------------------------------------------------------- 360 # Declare the function NAME ANSI C style. 361 m4_define([b4_c_ansi_function_decl], 362 [$2 $1 (b4_c_ansi_formals(m4_shift2($@)));[]dnl 363 ]) 364 365 366 367 # b4_c_function_decl(NAME, RETURN-VALUE, [DECL1, NAME1], ...) 368 # ----------------------------------------------------------- 369 # Declare the function NAME in both K&R and ANSI C. 370 m4_define([b4_c_function_decl], 371 [#if defined __STDC__ || defined __cplusplus 372 b4_c_ansi_function_decl($@) 373 #else 374 $2 $1 (); 375 #endif[]dnl 376 ]) 377 378 379 380 ## --------------------- ## 381 ## Calling C functions. ## 382 ## --------------------- ## 383 384 385 # b4_c_function_call(NAME, RETURN-VALUE, [DECL1, NAME1], ...) 386 # ----------------------------------------------------------- 387 # Call the function NAME with arguments NAME1, NAME2 etc. 388 m4_define([b4_c_function_call], 389 [$1 (b4_c_args(m4_shift2($@)))[]dnl 390 ]) 391 392 393 # b4_c_args([DECL1, NAME1], ...) 394 # ------------------------------ 395 # Output the arguments NAME1, NAME2... 396 m4_define([b4_c_args], 397 [m4_map_sep([b4_c_arg], [, ], [$@])]) 398 399 m4_define([b4_c_arg], 400 [$2]) 401 402 403 ## ----------- ## 404 ## Synclines. ## 405 ## ----------- ## 406 407 # b4_sync_start(LINE, FILE) 408 # ----------------------- 409 m4_define([b4_sync_start], [[#]line $1 $2]) 410 411 412 ## -------------- ## 413 ## User actions. ## 414 ## -------------- ## 415 416 # b4_case(LABEL, STATEMENTS) 417 # -------------------------- 418 m4_define([b4_case], 419 [ case $1: 420 $2 421 break;]) 422 423 # b4_symbol_actions(FILENAME, LINENO, 424 # SYMBOL-TAG, SYMBOL-NUM, 425 # SYMBOL-ACTION, SYMBOL-TYPENAME) 426 # ------------------------------------------------- 427 # Issue the code for a symbol action (e.g., %printer). 428 # 429 # Define b4_dollar_dollar([TYPE-NAME]), and b4_at_dollar, which are 430 # invoked where $<TYPE-NAME>$ and @$ were specified by the user. 431 m4_define([b4_symbol_actions], 432 [b4_dollar_pushdef([(*yyvaluep)], [$6], [(*yylocationp)])dnl 433 case $4: /* $3 */ 434 b4_syncline([$2], [$1]) 435 $5; 436 b4_syncline([@oline@], [@ofile@]) 437 break; 438 b4_dollar_popdef[]dnl 439 ]) 440 441 442 # b4_yydestruct_generate(FUNCTION-DECLARATOR) 443 # ------------------------------------------- 444 # Generate the "yydestruct" function, which declaration is issued using 445 # FUNCTION-DECLARATOR, which may be "b4_c_ansi_function_def" for ISO C 446 # or "b4_c_function_def" for K&R. 447 m4_define_default([b4_yydestruct_generate], 448 [[/*-----------------------------------------------. 449 | Release the memory associated to this symbol. | 450 `-----------------------------------------------*/ 451 452 /*ARGSUSED*/ 453 ]$1([yydestruct], 454 [static void], 455 [[const char *yymsg], [yymsg]], 456 [[int yytype], [yytype]], 457 [[YYSTYPE *yyvaluep], [yyvaluep]][]dnl 458 b4_locations_if( [, [[YYLTYPE *yylocationp], [yylocationp]]])[]dnl 459 m4_ifset([b4_parse_param], [, b4_parse_param]))[ 460 { 461 YYUSE (yyvaluep); 462 ]b4_locations_if([ YYUSE (yylocationp); 463 ])dnl 464 b4_parse_param_use[]dnl 465 [ 466 if (!yymsg) 467 yymsg = "Deleting"; 468 YY_SYMBOL_PRINT (yymsg, yytype, yyvaluep, yylocationp); 469 470 switch (yytype) 471 { 472 ]m4_map([b4_symbol_actions], m4_defn([b4_symbol_destructors]))[ 473 default: 474 break; 475 } 476 }]dnl 477 ]) 478 479 480 # b4_yy_symbol_print_generate(FUNCTION-DECLARATOR) 481 # ------------------------------------------------ 482 # Generate the "yy_symbol_print" function, which declaration is issued using 483 # FUNCTION-DECLARATOR, which may be "b4_c_ansi_function_def" for ISO C 484 # or "b4_c_function_def" for K&R. 485 m4_define_default([b4_yy_symbol_print_generate], 486 [[ 487 /*--------------------------------. 488 | Print this symbol on YYOUTPUT. | 489 `--------------------------------*/ 490 491 /*ARGSUSED*/ 492 ]$1([yy_symbol_value_print], 493 [static void], 494 [[FILE *yyoutput], [yyoutput]], 495 [[int yytype], [yytype]], 496 [[YYSTYPE const * const yyvaluep], [yyvaluep]][]dnl 497 b4_locations_if([, [[YYLTYPE const * const yylocationp], [yylocationp]]])[]dnl 498 m4_ifset([b4_parse_param], [, b4_parse_param]))[ 499 { 500 FILE *yyo = yyoutput; 501 YYUSE (yyo); 502 if (!yyvaluep) 503 return; 504 ]b4_locations_if([ YYUSE (yylocationp); 505 ])dnl 506 b4_parse_param_use[]dnl 507 [# ifdef YYPRINT 508 if (yytype < YYNTOKENS) 509 YYPRINT (yyoutput, yytoknum[yytype], *yyvaluep); 510 # else 511 YYUSE (yyoutput); 512 # endif 513 switch (yytype) 514 { 515 ]m4_map([b4_symbol_actions], m4_defn([b4_symbol_printers]))dnl 516 [ default: 517 break; 518 } 519 } 520 521 522 /*--------------------------------. 523 | Print this symbol on YYOUTPUT. | 524 `--------------------------------*/ 525 526 ]$1([yy_symbol_print], 527 [static void], 528 [[FILE *yyoutput], [yyoutput]], 529 [[int yytype], [yytype]], 530 [[YYSTYPE const * const yyvaluep], [yyvaluep]][]dnl 531 b4_locations_if([, [[YYLTYPE const * const yylocationp], [yylocationp]]])[]dnl 532 m4_ifset([b4_parse_param], [, b4_parse_param]))[ 533 { 534 if (yytype < YYNTOKENS) 535 YYFPRINTF (yyoutput, "token %s (", yytname[yytype]); 536 else 537 YYFPRINTF (yyoutput, "nterm %s (", yytname[yytype]); 538 539 ]b4_locations_if([ YY_LOCATION_PRINT (yyoutput, *yylocationp); 540 YYFPRINTF (yyoutput, ": "); 541 ])dnl 542 [ yy_symbol_value_print (yyoutput, yytype, yyvaluep]dnl 543 b4_locations_if([, yylocationp])[]b4_user_args[); 544 YYFPRINTF (yyoutput, ")"); 545 }]dnl 546 ]) 547 548 ## -------------- ## 549 ## Declarations. ## 550 ## -------------- ## 551 552 # b4_declare_yylstype 553 # ------------------- 554 # Declarations that might either go into the header (if --defines) or 555 # in the parser body. Declare YYSTYPE/YYLTYPE, and yylval/yylloc. 556 m4_define([b4_declare_yylstype], 557 [[#if ! defined ]b4_api_PREFIX[STYPE && ! defined ]b4_api_PREFIX[STYPE_IS_DECLARED 558 ]m4_ifdef([b4_stype], 559 [[typedef union ]b4_union_name[ 560 { 561 ]b4_user_stype[ 562 } ]b4_api_PREFIX[STYPE; 563 # define ]b4_api_PREFIX[STYPE_IS_TRIVIAL 1]], 564 [m4_if(b4_tag_seen_flag, 0, 565 [[typedef int ]b4_api_PREFIX[STYPE; 566 # define ]b4_api_PREFIX[STYPE_IS_TRIVIAL 1]])])[ 567 # define ]b4_api_prefix[stype ]b4_api_PREFIX[STYPE /* obsolescent; will be withdrawn */ 568 # define ]b4_api_PREFIX[STYPE_IS_DECLARED 1 569 #endif]b4_locations_if([[ 570 571 #if ! defined ]b4_api_PREFIX[LTYPE && ! defined ]b4_api_PREFIX[LTYPE_IS_DECLARED 572 typedef struct ]b4_api_PREFIX[LTYPE 573 { 574 int first_line; 575 int first_column; 576 int last_line; 577 int last_column; 578 } ]b4_api_PREFIX[LTYPE; 579 # define ]b4_api_prefix[ltype ]b4_api_PREFIX[LTYPE /* obsolescent; will be withdrawn */ 580 # define ]b4_api_PREFIX[LTYPE_IS_DECLARED 1 581 # define ]b4_api_PREFIX[LTYPE_IS_TRIVIAL 1 582 #endif]]) 583 584 b4_pure_if([], [[extern ]b4_api_PREFIX[STYPE ]b4_prefix[lval; 585 ]b4_locations_if([[extern ]b4_api_PREFIX[LTYPE ]b4_prefix[lloc;]])])[]dnl 586 ]) 587 588 # b4_YYDEBUG_define 589 # ------------------ 590 m4_define([b4_YYDEBUG_define], 591 [[/* Enabling traces. */ 592 ]m4_if(b4_api_prefix, [yy], 593 [[#ifndef YYDEBUG 594 # define YYDEBUG ]b4_debug_flag[ 595 #endif]], 596 [[#ifndef ]b4_api_PREFIX[DEBUG 597 # if defined YYDEBUG 598 # if YYDEBUG 599 # define ]b4_api_PREFIX[DEBUG 1 600 # else 601 # define ]b4_api_PREFIX[DEBUG 0 602 # endif 603 # else /* ! defined YYDEBUG */ 604 # define ]b4_api_PREFIX[DEBUG ]b4_debug_flag[ 605 # endif /* ! defined YYDEBUG */ 606 #endif /* ! defined ]b4_api_PREFIX[DEBUG */]])[]dnl 607 ]) 608 609 # b4_declare_yydebug 610 # ------------------ 611 m4_define([b4_declare_yydebug], 612 [b4_YYDEBUG_define[ 613 #if ]b4_api_PREFIX[DEBUG 614 extern int ]b4_prefix[debug; 615 #endif][]dnl 616 ]) 617 618 # b4_yylloc_default_define 619 # ------------------------ 620 # Define YYLLOC_DEFAULT. 621 m4_define([b4_yylloc_default_define], 622 [[/* YYLLOC_DEFAULT -- Set CURRENT to span from RHS[1] to RHS[N]. 623 If N is 0, then set CURRENT to the empty location which ends 624 the previous symbol: RHS[0] (always defined). */ 625 626 #ifndef YYLLOC_DEFAULT 627 # define YYLLOC_DEFAULT(Current, Rhs, N) \ 628 do \ 629 if (YYID (N)) \ 630 { \ 631 (Current).first_line = YYRHSLOC (Rhs, 1).first_line; \ 632 (Current).first_column = YYRHSLOC (Rhs, 1).first_column; \ 633 (Current).last_line = YYRHSLOC (Rhs, N).last_line; \ 634 (Current).last_column = YYRHSLOC (Rhs, N).last_column; \ 635 } \ 636 else \ 637 { \ 638 (Current).first_line = (Current).last_line = \ 639 YYRHSLOC (Rhs, 0).last_line; \ 640 (Current).first_column = (Current).last_column = \ 641 YYRHSLOC (Rhs, 0).last_column; \ 642 } \ 643 while (YYID (0)) 644 #endif 645 ]]) 646 647 # b4_yy_location_print_define 648 # --------------------------- 649 # Define YY_LOCATION_PRINT. 650 m4_define([b4_yy_location_print_define], 651 [b4_locations_if([[ 652 /* YY_LOCATION_PRINT -- Print the location on the stream. 653 This macro was not mandated originally: define only if we know 654 we won't break user code: when these are the locations we know. */ 655 656 #ifndef YY_LOCATION_PRINT 657 # if defined ]b4_api_PREFIX[LTYPE_IS_TRIVIAL && ]b4_api_PREFIX[LTYPE_IS_TRIVIAL 658 659 /* Print *YYLOCP on YYO. Private, do not rely on its existence. */ 660 661 __attribute__((__unused__)) 662 ]b4_c_function_def([yy_location_print_], 663 [static unsigned], 664 [[FILE *yyo], [yyo]], 665 [[YYLTYPE const * const yylocp], [yylocp]])[ 666 { 667 unsigned res = 0; 668 int end_col = 0 != yylocp->last_column ? yylocp->last_column - 1 : 0; 669 if (0 <= yylocp->first_line) 670 { 671 res += fprintf (yyo, "%d", yylocp->first_line); 672 if (0 <= yylocp->first_column) 673 res += fprintf (yyo, ".%d", yylocp->first_column); 674 } 675 if (0 <= yylocp->last_line) 676 { 677 if (yylocp->first_line < yylocp->last_line) 678 { 679 res += fprintf (yyo, "-%d", yylocp->last_line); 680 if (0 <= end_col) 681 res += fprintf (yyo, ".%d", end_col); 682 } 683 else if (0 <= end_col && yylocp->first_column < end_col) 684 res += fprintf (yyo, "-%d", end_col); 685 } 686 return res; 687 } 688 689 # define YY_LOCATION_PRINT(File, Loc) \ 690 yy_location_print_ (File, &(Loc)) 691 692 # else 693 # define YY_LOCATION_PRINT(File, Loc) ((void) 0) 694 # endif 695 #endif]], 696 [[/* This macro is provided for backward compatibility. */ 697 #ifndef YY_LOCATION_PRINT 698 # define YY_LOCATION_PRINT(File, Loc) ((void) 0) 699 #endif]]) 700 ]) 701 702 # b4_yyloc_default 703 # ---------------- 704 # Expand to a possible default value for yylloc. 705 m4_define([b4_yyloc_default], 706 [[ 707 # if defined ]b4_api_PREFIX[LTYPE_IS_TRIVIAL && ]b4_api_PREFIX[LTYPE_IS_TRIVIAL 708 = { ]m4_join([, ], 709 m4_defn([b4_location_initial_line]), 710 m4_defn([b4_location_initial_column]), 711 m4_defn([b4_location_initial_line]), 712 m4_defn([b4_location_initial_column]))[ } 713 # endif 714 ]]) 715