1132718Skan/* Various declarations for language-independent pretty-print subroutines. 2169689Skan Copyright (C) 2003, 2004, 2005 Free Software Foundation, Inc. 3132718Skan Contributed by Gabriel Dos Reis <gdr@integrable-solutions.net> 4132718Skan 5132718SkanThis file is part of GCC. 6132718Skan 7132718SkanGCC is free software; you can redistribute it and/or modify it under 8132718Skanthe terms of the GNU General Public License as published by the Free 9132718SkanSoftware Foundation; either version 2, or (at your option) any later 10132718Skanversion. 11132718Skan 12132718SkanGCC is distributed in the hope that it will be useful, but WITHOUT ANY 13132718SkanWARRANTY; without even the implied warranty of MERCHANTABILITY or 14132718SkanFITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License 15132718Skanfor more details. 16132718Skan 17132718SkanYou should have received a copy of the GNU General Public License 18132718Skanalong with GCC; see the file COPYING. If not, write to the Free 19169689SkanSoftware Foundation, 51 Franklin Street, Fifth Floor, Boston, MA 20169689Skan02110-1301, USA. */ 21132718Skan 22132718Skan#include "config.h" 23132718Skan#undef FLOAT /* This is for hpux. They should change hpux. */ 24132718Skan#undef FFS /* Some systems define this in param.h. */ 25132718Skan#include "system.h" 26132718Skan#include "coretypes.h" 27169689Skan#include "intl.h" 28132718Skan#include "pretty-print.h" 29169689Skan#include "tree.h" 30132718Skan 31132718Skan#define obstack_chunk_alloc xmalloc 32132718Skan#define obstack_chunk_free free 33132718Skan 34132718Skan/* A pointer to the formatted diagnostic message. */ 35132718Skan#define pp_formatted_text_data(PP) \ 36169689Skan ((const char *) obstack_base (pp_base (PP)->buffer->obstack)) 37132718Skan 38132718Skan/* Format an integer given by va_arg (ARG, type-specifier T) where 39132718Skan type-specifier is a precision modifier as indicated by PREC. F is 40132718Skan a string used to construct the appropriate format-specifier. */ 41132718Skan#define pp_integer_with_precision(PP, ARG, PREC, T, F) \ 42132718Skan do \ 43132718Skan switch (PREC) \ 44132718Skan { \ 45132718Skan case 0: \ 46132718Skan pp_scalar (PP, "%" F, va_arg (ARG, T)); \ 47132718Skan break; \ 48132718Skan \ 49132718Skan case 1: \ 50132718Skan pp_scalar (PP, "%l" F, va_arg (ARG, long T)); \ 51132718Skan break; \ 52132718Skan \ 53132718Skan case 2: \ 54132718Skan pp_scalar (PP, "%ll" F, va_arg (ARG, long long T)); \ 55132718Skan break; \ 56132718Skan \ 57132718Skan default: \ 58132718Skan break; \ 59132718Skan } \ 60132718Skan while (0) 61132718Skan 62132718Skan 63132718Skan/* Subroutine of pp_set_maximum_length. Set up PRETTY-PRINTER's 64132718Skan internal maximum characters per line. */ 65132718Skanstatic void 66132718Skanpp_set_real_maximum_length (pretty_printer *pp) 67132718Skan{ 68132718Skan /* If we're told not to wrap lines then do the obvious thing. In case 69132718Skan we'll emit prefix only once per message, it is appropriate 70132718Skan not to increase unnecessarily the line-length cut-off. */ 71132718Skan if (!pp_is_wrapping_line (pp) 72132718Skan || pp_prefixing_rule (pp) == DIAGNOSTICS_SHOW_PREFIX_ONCE 73132718Skan || pp_prefixing_rule (pp) == DIAGNOSTICS_SHOW_PREFIX_NEVER) 74132718Skan pp->maximum_length = pp_line_cutoff (pp); 75132718Skan else 76132718Skan { 77132718Skan int prefix_length = pp->prefix ? strlen (pp->prefix) : 0; 78132718Skan /* If the prefix is ridiculously too long, output at least 79132718Skan 32 characters. */ 80132718Skan if (pp_line_cutoff (pp) - prefix_length < 32) 81132718Skan pp->maximum_length = pp_line_cutoff (pp) + 32; 82132718Skan else 83132718Skan pp->maximum_length = pp_line_cutoff (pp); 84132718Skan } 85132718Skan} 86132718Skan 87132718Skan/* Clear PRETTY-PRINTER's output state. */ 88132718Skanstatic inline void 89132718Skanpp_clear_state (pretty_printer *pp) 90132718Skan{ 91132718Skan pp->emitted_prefix = false; 92132718Skan pp_indentation (pp) = 0; 93132718Skan} 94132718Skan 95132718Skan/* Flush the formatted text of PRETTY-PRINTER onto the attached stream. */ 96169689Skanvoid 97132718Skanpp_write_text_to_stream (pretty_printer *pp) 98132718Skan{ 99132718Skan const char *text = pp_formatted_text (pp); 100132718Skan fputs (text, pp->buffer->stream); 101132718Skan pp_clear_output_area (pp); 102132718Skan} 103132718Skan 104132718Skan/* Wrap a text delimited by START and END into PRETTY-PRINTER. */ 105132718Skanstatic void 106132718Skanpp_wrap_text (pretty_printer *pp, const char *start, const char *end) 107132718Skan{ 108132718Skan bool wrapping_line = pp_is_wrapping_line (pp); 109132718Skan 110132718Skan while (start != end) 111132718Skan { 112132718Skan /* Dump anything bordered by whitespaces. */ 113132718Skan { 114132718Skan const char *p = start; 115132718Skan while (p != end && !ISBLANK (*p) && *p != '\n') 116132718Skan ++p; 117132718Skan if (wrapping_line 118132718Skan && p - start >= pp_remaining_character_count_for_line (pp)) 119132718Skan pp_newline (pp); 120132718Skan pp_append_text (pp, start, p); 121132718Skan start = p; 122132718Skan } 123132718Skan 124132718Skan if (start != end && ISBLANK (*start)) 125132718Skan { 126132718Skan pp_space (pp); 127132718Skan ++start; 128132718Skan } 129132718Skan if (start != end && *start == '\n') 130132718Skan { 131132718Skan pp_newline (pp); 132132718Skan ++start; 133132718Skan } 134132718Skan } 135132718Skan} 136132718Skan 137132718Skan/* Same as pp_wrap_text but wrap text only when in line-wrapping mode. */ 138132718Skanstatic inline void 139132718Skanpp_maybe_wrap_text (pretty_printer *pp, const char *start, const char *end) 140132718Skan{ 141132718Skan if (pp_is_wrapping_line (pp)) 142132718Skan pp_wrap_text (pp, start, end); 143132718Skan else 144132718Skan pp_append_text (pp, start, end); 145132718Skan} 146132718Skan 147132718Skan/* Append to the output area of PRETTY-PRINTER a string specified by its 148132718Skan STARTing character and LENGTH. */ 149132718Skanstatic inline void 150132718Skanpp_append_r (pretty_printer *pp, const char *start, int length) 151132718Skan{ 152169689Skan obstack_grow (pp->buffer->obstack, start, length); 153132718Skan pp->buffer->line_length += length; 154132718Skan} 155132718Skan 156132718Skan/* Insert enough spaces into the output area of PRETTY-PRINTER to bring 157132718Skan the column position to the current indentation level, assuming that a 158132718Skan newline has just been written to the buffer. */ 159132718Skanvoid 160132718Skanpp_base_indent (pretty_printer *pp) 161132718Skan{ 162132718Skan int n = pp_indentation (pp); 163132718Skan int i; 164132718Skan 165132718Skan for (i = 0; i < n; ++i) 166132718Skan pp_space (pp); 167132718Skan} 168132718Skan 169169689Skan/* The following format specifiers are recognized as being client independent: 170132718Skan %d, %i: (signed) integer in base ten. 171132718Skan %u: unsigned integer in base ten. 172132718Skan %o: unsigned integer in base eight. 173132718Skan %x: unsigned integer in base sixteen. 174132718Skan %ld, %li, %lo, %lu, %lx: long versions of the above. 175132718Skan %lld, %lli, %llo, %llu, %llx: long long versions. 176132718Skan %wd, %wi, %wo, %wu, %wx: HOST_WIDE_INT versions. 177132718Skan %c: character. 178132718Skan %s: string. 179132718Skan %p: pointer. 180132718Skan %m: strerror(text->err_no) - does not consume a value from args_ptr. 181169689Skan %%: '%'. 182169689Skan %<: opening quote. 183169689Skan %>: closing quote. 184169689Skan %': apostrophe (should only be used in untranslated messages; 185169689Skan translations should use appropriate punctuation directly). 186169689Skan %.*s: a substring the length of which is specified by an argument 187169689Skan integer. 188169689Skan %Ns: likewise, but length specified as constant in the format string. 189169689Skan %H: location_t. 190169689Skan %J: a decl tree, from which DECL_SOURCE_LOCATION will be recorded. 191169689Skan Flag 'q': quote formatted text (must come immediately after '%'). 192169689Skan 193169689Skan Arguments can be used sequentially, or through %N$ resp. *N$ 194169689Skan notation Nth argument after the format string. If %N$ / *N$ 195169689Skan notation is used, it must be used for all arguments, except %m, %%, 196169689Skan %<, %> and %', which may not have a number, as they do not consume 197169689Skan an argument. When %M$.*N$s is used, M must be N + 1. (This may 198169689Skan also be written %M$.*s, provided N is not otherwise used.) The 199169689Skan format string must have conversion specifiers with argument numbers 200169689Skan 1 up to highest argument; each argument may only be used once. 201169689Skan A format string can have at most 30 arguments. */ 202169689Skan 203169689Skan/* Formatting phases 1 and 2: render TEXT->format_spec plus 204169689Skan TEXT->args_ptr into a series of chunks in PP->buffer->args[]. 205169689Skan Phase 3 is in pp_base_format_text. */ 206169689Skan 207132718Skanvoid 208169689Skanpp_base_format (pretty_printer *pp, text_info *text) 209132718Skan{ 210169689Skan output_buffer *buffer = pp->buffer; 211169689Skan const char *p; 212169689Skan const char **args; 213169689Skan struct chunk_info *new_chunk_array; 214169689Skan 215169689Skan unsigned int curarg = 0, chunk = 0, argno; 216169689Skan pp_wrapping_mode_t old_wrapping_mode; 217169689Skan bool any_unnumbered = false, any_numbered = false; 218169689Skan const char **formatters[PP_NL_ARGMAX]; 219169689Skan 220169689Skan /* Allocate a new chunk structure. */ 221169689Skan new_chunk_array = XOBNEW (&buffer->chunk_obstack, struct chunk_info); 222169689Skan new_chunk_array->prev = buffer->cur_chunk_array; 223169689Skan buffer->cur_chunk_array = new_chunk_array; 224169689Skan args = new_chunk_array->args; 225169689Skan 226169689Skan /* Formatting phase 1: split up TEXT->format_spec into chunks in 227169689Skan PP->buffer->args[]. Even-numbered chunks are to be output 228169689Skan verbatim, odd-numbered chunks are format specifiers. 229169689Skan %m, %%, %<, %>, and %' are replaced with the appropriate text at 230169689Skan this point. */ 231169689Skan 232169689Skan memset (formatters, 0, sizeof formatters); 233169689Skan 234169689Skan for (p = text->format_spec; *p; ) 235132718Skan { 236169689Skan while (*p != '\0' && *p != '%') 237169689Skan { 238169689Skan obstack_1grow (&buffer->chunk_obstack, *p); 239169689Skan p++; 240169689Skan } 241169689Skan 242169689Skan if (*p == '\0') 243169689Skan break; 244169689Skan 245169689Skan switch (*++p) 246169689Skan { 247169689Skan case '\0': 248169689Skan gcc_unreachable (); 249169689Skan 250169689Skan case '%': 251169689Skan obstack_1grow (&buffer->chunk_obstack, '%'); 252169689Skan p++; 253169689Skan continue; 254169689Skan 255169689Skan case '<': 256169689Skan obstack_grow (&buffer->chunk_obstack, 257169689Skan open_quote, strlen (open_quote)); 258169689Skan p++; 259169689Skan continue; 260169689Skan 261169689Skan case '>': 262169689Skan case '\'': 263169689Skan obstack_grow (&buffer->chunk_obstack, 264169689Skan close_quote, strlen (close_quote)); 265169689Skan p++; 266169689Skan continue; 267169689Skan 268169689Skan case 'm': 269169689Skan { 270169689Skan const char *errstr = xstrerror (text->err_no); 271169689Skan obstack_grow (&buffer->chunk_obstack, errstr, strlen (errstr)); 272169689Skan } 273169689Skan p++; 274169689Skan continue; 275169689Skan 276169689Skan default: 277169689Skan /* Handled in phase 2. Terminate the plain chunk here. */ 278169689Skan obstack_1grow (&buffer->chunk_obstack, '\0'); 279169689Skan gcc_assert (chunk < PP_NL_ARGMAX * 2); 280169689Skan args[chunk++] = XOBFINISH (&buffer->chunk_obstack, const char *); 281169689Skan break; 282169689Skan } 283169689Skan 284169689Skan if (ISDIGIT (*p)) 285169689Skan { 286169689Skan char *end; 287169689Skan argno = strtoul (p, &end, 10) - 1; 288169689Skan p = end; 289169689Skan gcc_assert (*p == '$'); 290169689Skan p++; 291169689Skan 292169689Skan any_numbered = true; 293169689Skan gcc_assert (!any_unnumbered); 294169689Skan } 295169689Skan else 296169689Skan { 297169689Skan argno = curarg++; 298169689Skan any_unnumbered = true; 299169689Skan gcc_assert (!any_numbered); 300169689Skan } 301169689Skan gcc_assert (argno < PP_NL_ARGMAX); 302169689Skan gcc_assert (!formatters[argno]); 303169689Skan formatters[argno] = &args[chunk]; 304169689Skan do 305169689Skan { 306169689Skan obstack_1grow (&buffer->chunk_obstack, *p); 307169689Skan p++; 308169689Skan } 309169689Skan while (strchr ("qwl+#", p[-1])); 310169689Skan 311169689Skan if (p[-1] == '.') 312169689Skan { 313169689Skan /* We handle '%.Ns' and '%.*s' or '%M$.*N$s' 314169689Skan (where M == N + 1). */ 315169689Skan if (ISDIGIT (*p)) 316169689Skan { 317169689Skan do 318169689Skan { 319169689Skan obstack_1grow (&buffer->chunk_obstack, *p); 320169689Skan p++; 321169689Skan } 322169689Skan while (ISDIGIT (p[-1])); 323169689Skan gcc_assert (p[-1] == 's'); 324169689Skan } 325169689Skan else 326169689Skan { 327169689Skan gcc_assert (*p == '*'); 328169689Skan obstack_1grow (&buffer->chunk_obstack, '*'); 329169689Skan p++; 330169689Skan 331169689Skan if (ISDIGIT (*p)) 332169689Skan { 333169689Skan char *end; 334169689Skan unsigned int argno2 = strtoul (p, &end, 10) - 1; 335169689Skan p = end; 336169689Skan gcc_assert (argno2 == argno - 1); 337169689Skan gcc_assert (!any_unnumbered); 338169689Skan gcc_assert (*p == '$'); 339169689Skan 340169689Skan p++; 341169689Skan formatters[argno2] = formatters[argno]; 342169689Skan } 343169689Skan else 344169689Skan { 345169689Skan gcc_assert (!any_numbered); 346169689Skan formatters[argno+1] = formatters[argno]; 347169689Skan curarg++; 348169689Skan } 349169689Skan gcc_assert (*p == 's'); 350169689Skan obstack_1grow (&buffer->chunk_obstack, 's'); 351169689Skan p++; 352169689Skan } 353169689Skan } 354169689Skan if (*p == '\0') 355169689Skan break; 356169689Skan 357169689Skan obstack_1grow (&buffer->chunk_obstack, '\0'); 358169689Skan gcc_assert (chunk < PP_NL_ARGMAX * 2); 359169689Skan args[chunk++] = XOBFINISH (&buffer->chunk_obstack, const char *); 360169689Skan } 361169689Skan 362169689Skan obstack_1grow (&buffer->chunk_obstack, '\0'); 363169689Skan gcc_assert (chunk < PP_NL_ARGMAX * 2); 364169689Skan args[chunk++] = XOBFINISH (&buffer->chunk_obstack, const char *); 365169689Skan args[chunk] = 0; 366169689Skan 367169689Skan /* Set output to the argument obstack, and switch line-wrapping and 368169689Skan prefixing off. */ 369169689Skan buffer->obstack = &buffer->chunk_obstack; 370169689Skan old_wrapping_mode = pp_set_verbatim_wrapping (pp); 371169689Skan 372169689Skan /* Second phase. Replace each formatter with the formatted text it 373169689Skan corresponds to. */ 374169689Skan 375169689Skan for (argno = 0; formatters[argno]; argno++) 376169689Skan { 377132718Skan int precision = 0; 378132718Skan bool wide = false; 379169689Skan bool plus = false; 380169689Skan bool hash = false; 381169689Skan bool quote = false; 382132718Skan 383169689Skan /* We do not attempt to enforce any ordering on the modifier 384169689Skan characters. */ 385132718Skan 386169689Skan for (p = *formatters[argno];; p++) 387169689Skan { 388169689Skan switch (*p) 389169689Skan { 390169689Skan case 'q': 391169689Skan gcc_assert (!quote); 392169689Skan quote = true; 393169689Skan continue; 394132718Skan 395169689Skan case '+': 396169689Skan gcc_assert (!plus); 397169689Skan plus = true; 398169689Skan continue; 399132718Skan 400169689Skan case '#': 401169689Skan gcc_assert (!hash); 402169689Skan hash = true; 403169689Skan continue; 404132718Skan 405169689Skan case 'w': 406169689Skan gcc_assert (!wide); 407169689Skan wide = true; 408169689Skan continue; 409132718Skan 410169689Skan case 'l': 411169689Skan /* We don't support precision beyond that of "long long". */ 412169689Skan gcc_assert (precision < 2); 413169689Skan precision++; 414169689Skan continue; 415169689Skan } 416169689Skan break; 417169689Skan } 418169689Skan 419169689Skan gcc_assert (!wide || precision == 0); 420169689Skan 421169689Skan if (quote) 422169689Skan pp_string (pp, open_quote); 423169689Skan 424169689Skan switch (*p) 425132718Skan { 426132718Skan case 'c': 427132718Skan pp_character (pp, va_arg (*text->args_ptr, int)); 428132718Skan break; 429132718Skan 430132718Skan case 'd': 431132718Skan case 'i': 432169689Skan if (wide) 433169689Skan pp_wide_integer (pp, va_arg (*text->args_ptr, HOST_WIDE_INT)); 434169689Skan else 435169689Skan pp_integer_with_precision 436169689Skan (pp, *text->args_ptr, precision, int, "d"); 437132718Skan break; 438132718Skan 439132718Skan case 'o': 440169689Skan if (wide) 441169689Skan pp_scalar (pp, "%" HOST_WIDE_INT_PRINT "o", 442169689Skan va_arg (*text->args_ptr, unsigned HOST_WIDE_INT)); 443169689Skan else 444169689Skan pp_integer_with_precision 445169689Skan (pp, *text->args_ptr, precision, unsigned, "o"); 446132718Skan break; 447132718Skan 448132718Skan case 's': 449132718Skan pp_string (pp, va_arg (*text->args_ptr, const char *)); 450132718Skan break; 451132718Skan 452169689Skan case 'p': 453169689Skan pp_pointer (pp, va_arg (*text->args_ptr, void *)); 454169689Skan break; 455132718Skan 456132718Skan case 'u': 457169689Skan if (wide) 458169689Skan pp_scalar (pp, HOST_WIDE_INT_PRINT_UNSIGNED, 459169689Skan va_arg (*text->args_ptr, unsigned HOST_WIDE_INT)); 460169689Skan else 461169689Skan pp_integer_with_precision 462169689Skan (pp, *text->args_ptr, precision, unsigned, "u"); 463132718Skan break; 464132718Skan 465132718Skan case 'x': 466169689Skan if (wide) 467169689Skan pp_scalar (pp, HOST_WIDE_INT_PRINT_HEX, 468169689Skan va_arg (*text->args_ptr, unsigned HOST_WIDE_INT)); 469169689Skan else 470169689Skan pp_integer_with_precision 471169689Skan (pp, *text->args_ptr, precision, unsigned, "x"); 472132718Skan break; 473132718Skan 474169689Skan case 'H': 475169689Skan { 476169689Skan location_t *locus = va_arg (*text->args_ptr, location_t *); 477169689Skan gcc_assert (text->locus != NULL); 478169689Skan *text->locus = *locus; 479169689Skan } 480132718Skan break; 481132718Skan 482169689Skan case 'J': 483169689Skan { 484169689Skan tree t = va_arg (*text->args_ptr, tree); 485169689Skan gcc_assert (text->locus != NULL); 486169689Skan *text->locus = DECL_SOURCE_LOCATION (t); 487169689Skan } 488132718Skan break; 489132718Skan 490132718Skan case '.': 491132718Skan { 492132718Skan int n; 493132718Skan const char *s; 494169689Skan 495169689Skan /* We handle '%.Ns' and '%.*s' or '%M$.*N$s' 496169689Skan (where M == N + 1). The format string should be verified 497169689Skan already from the first phase. */ 498169689Skan p++; 499169689Skan if (ISDIGIT (*p)) 500169689Skan { 501169689Skan char *end; 502169689Skan n = strtoul (p, &end, 10); 503169689Skan p = end; 504169689Skan gcc_assert (*p == 's'); 505169689Skan } 506169689Skan else 507169689Skan { 508169689Skan gcc_assert (*p == '*'); 509169689Skan p++; 510169689Skan gcc_assert (*p == 's'); 511169689Skan n = va_arg (*text->args_ptr, int); 512169689Skan 513169689Skan /* This consumes a second entry in the formatters array. */ 514169689Skan gcc_assert (formatters[argno] == formatters[argno+1]); 515169689Skan argno++; 516169689Skan } 517169689Skan 518132718Skan s = va_arg (*text->args_ptr, const char *); 519132718Skan pp_append_text (pp, s, s + n); 520132718Skan } 521132718Skan break; 522132718Skan 523132718Skan default: 524169689Skan { 525169689Skan bool ok; 526169689Skan 527169689Skan gcc_assert (pp_format_decoder (pp)); 528169689Skan ok = pp_format_decoder (pp) (pp, text, p, 529169689Skan precision, wide, plus, hash); 530169689Skan gcc_assert (ok); 531169689Skan } 532132718Skan } 533169689Skan 534169689Skan if (quote) 535169689Skan pp_string (pp, close_quote); 536169689Skan 537169689Skan obstack_1grow (&buffer->chunk_obstack, '\0'); 538169689Skan *formatters[argno] = XOBFINISH (&buffer->chunk_obstack, const char *); 539132718Skan } 540169689Skan 541169689Skan#ifdef ENABLE_CHECKING 542169689Skan for (; argno < PP_NL_ARGMAX; argno++) 543169689Skan gcc_assert (!formatters[argno]); 544169689Skan#endif 545169689Skan 546169689Skan /* Revert to normal obstack and wrapping mode. */ 547169689Skan buffer->obstack = &buffer->formatted_obstack; 548169689Skan buffer->line_length = 0; 549169689Skan pp_wrapping_mode (pp) = old_wrapping_mode; 550169689Skan pp_clear_state (pp); 551132718Skan} 552132718Skan 553169689Skan/* Format of a message pointed to by TEXT. */ 554169689Skanvoid 555169689Skanpp_base_output_formatted_text (pretty_printer *pp) 556169689Skan{ 557169689Skan unsigned int chunk; 558169689Skan output_buffer *buffer = pp_buffer (pp); 559169689Skan struct chunk_info *chunk_array = buffer->cur_chunk_array; 560169689Skan const char **args = chunk_array->args; 561169689Skan 562169689Skan gcc_assert (buffer->obstack == &buffer->formatted_obstack); 563169689Skan gcc_assert (buffer->line_length == 0); 564169689Skan 565169689Skan /* This is a third phase, first 2 phases done in pp_base_format_args. 566169689Skan Now we actually print it. */ 567169689Skan for (chunk = 0; args[chunk]; chunk++) 568169689Skan pp_string (pp, args[chunk]); 569169689Skan 570169689Skan /* Deallocate the chunk structure and everything after it (i.e. the 571169689Skan associated series of formatted strings). */ 572169689Skan buffer->cur_chunk_array = chunk_array->prev; 573169689Skan obstack_free (&buffer->chunk_obstack, chunk_array); 574169689Skan} 575169689Skan 576132718Skan/* Helper subroutine of output_verbatim and verbatim. Do the appropriate 577132718Skan settings needed by BUFFER for a verbatim formatting. */ 578132718Skanvoid 579132718Skanpp_base_format_verbatim (pretty_printer *pp, text_info *text) 580132718Skan{ 581169689Skan /* Set verbatim mode. */ 582169689Skan pp_wrapping_mode_t oldmode = pp_set_verbatim_wrapping (pp); 583132718Skan 584132718Skan /* Do the actual formatting. */ 585169689Skan pp_format (pp, text); 586169689Skan pp_output_formatted_text (pp); 587169689Skan 588132718Skan /* Restore previous settings. */ 589169689Skan pp_wrapping_mode (pp) = oldmode; 590132718Skan} 591132718Skan 592132718Skan/* Flush the content of BUFFER onto the attached stream. */ 593132718Skanvoid 594132718Skanpp_base_flush (pretty_printer *pp) 595132718Skan{ 596132718Skan pp_write_text_to_stream (pp); 597132718Skan pp_clear_state (pp); 598132718Skan fputc ('\n', pp->buffer->stream); 599132718Skan fflush (pp->buffer->stream); 600132718Skan pp_needs_newline (pp) = false; 601132718Skan} 602132718Skan 603132718Skan/* Sets the number of maximum characters per line PRETTY-PRINTER can 604132718Skan output in line-wrapping mode. A LENGTH value 0 suppresses 605132718Skan line-wrapping. */ 606132718Skanvoid 607132718Skanpp_base_set_line_maximum_length (pretty_printer *pp, int length) 608132718Skan{ 609132718Skan pp_line_cutoff (pp) = length; 610132718Skan pp_set_real_maximum_length (pp); 611132718Skan} 612132718Skan 613132718Skan/* Clear PRETTY-PRINTER output area text info. */ 614132718Skanvoid 615132718Skanpp_base_clear_output_area (pretty_printer *pp) 616132718Skan{ 617169689Skan obstack_free (pp->buffer->obstack, obstack_base (pp->buffer->obstack)); 618132718Skan pp->buffer->line_length = 0; 619132718Skan} 620132718Skan 621132718Skan/* Set PREFIX for PRETTY-PRINTER. */ 622132718Skanvoid 623132718Skanpp_base_set_prefix (pretty_printer *pp, const char *prefix) 624132718Skan{ 625132718Skan pp->prefix = prefix; 626132718Skan pp_set_real_maximum_length (pp); 627132718Skan pp->emitted_prefix = false; 628132718Skan pp_indentation (pp) = 0; 629132718Skan} 630132718Skan 631132718Skan/* Free PRETTY-PRINTER's prefix, a previously malloc()'d string. */ 632132718Skanvoid 633132718Skanpp_base_destroy_prefix (pretty_printer *pp) 634132718Skan{ 635132718Skan if (pp->prefix != NULL) 636132718Skan { 637132718Skan free ((char *) pp->prefix); 638132718Skan pp->prefix = NULL; 639132718Skan } 640132718Skan} 641132718Skan 642132718Skan/* Write out PRETTY-PRINTER's prefix. */ 643132718Skanvoid 644132718Skanpp_base_emit_prefix (pretty_printer *pp) 645132718Skan{ 646132718Skan if (pp->prefix != NULL) 647132718Skan { 648132718Skan switch (pp_prefixing_rule (pp)) 649132718Skan { 650132718Skan default: 651132718Skan case DIAGNOSTICS_SHOW_PREFIX_NEVER: 652132718Skan break; 653132718Skan 654132718Skan case DIAGNOSTICS_SHOW_PREFIX_ONCE: 655132718Skan if (pp->emitted_prefix) 656132718Skan { 657132718Skan pp_base_indent (pp); 658132718Skan break; 659132718Skan } 660132718Skan pp_indentation (pp) += 3; 661132718Skan /* Fall through. */ 662132718Skan 663132718Skan case DIAGNOSTICS_SHOW_PREFIX_EVERY_LINE: 664132718Skan { 665132718Skan int prefix_length = strlen (pp->prefix); 666132718Skan pp_append_r (pp, pp->prefix, prefix_length); 667132718Skan pp->emitted_prefix = true; 668132718Skan } 669132718Skan break; 670132718Skan } 671132718Skan } 672132718Skan} 673132718Skan 674132718Skan/* Construct a PRETTY-PRINTER with PREFIX and of MAXIMUM_LENGTH 675132718Skan characters per line. */ 676132718Skanvoid 677132718Skanpp_construct (pretty_printer *pp, const char *prefix, int maximum_length) 678132718Skan{ 679132718Skan memset (pp, 0, sizeof (pretty_printer)); 680169689Skan pp->buffer = XCNEW (output_buffer); 681169689Skan obstack_init (&pp->buffer->chunk_obstack); 682169689Skan obstack_init (&pp->buffer->formatted_obstack); 683169689Skan pp->buffer->obstack = &pp->buffer->formatted_obstack; 684132718Skan pp->buffer->stream = stderr; 685132718Skan pp_line_cutoff (pp) = maximum_length; 686132718Skan pp_prefixing_rule (pp) = DIAGNOSTICS_SHOW_PREFIX_ONCE; 687132718Skan pp_set_prefix (pp, prefix); 688132718Skan} 689132718Skan 690132718Skan/* Append a string delimited by START and END to the output area of 691132718Skan PRETTY-PRINTER. No line wrapping is done. However, if beginning a 692132718Skan new line then emit PRETTY-PRINTER's prefix and skip any leading 693132718Skan whitespace if appropriate. The caller must ensure that it is 694132718Skan safe to do so. */ 695132718Skanvoid 696132718Skanpp_base_append_text (pretty_printer *pp, const char *start, const char *end) 697132718Skan{ 698132718Skan /* Emit prefix and skip whitespace if we're starting a new line. */ 699132718Skan if (pp->buffer->line_length == 0) 700132718Skan { 701132718Skan pp_emit_prefix (pp); 702132718Skan if (pp_is_wrapping_line (pp)) 703132718Skan while (start != end && *start == ' ') 704132718Skan ++start; 705132718Skan } 706132718Skan pp_append_r (pp, start, end - start); 707132718Skan} 708132718Skan 709132718Skan/* Finishes constructing a NULL-terminated character string representing 710132718Skan the PRETTY-PRINTED text. */ 711132718Skanconst char * 712132718Skanpp_base_formatted_text (pretty_printer *pp) 713132718Skan{ 714169689Skan obstack_1grow (pp->buffer->obstack, '\0'); 715132718Skan return pp_formatted_text_data (pp); 716132718Skan} 717132718Skan 718132718Skan/* Return a pointer to the last character emitted in PRETTY-PRINTER's 719132718Skan output area. A NULL pointer means no character available. */ 720132718Skanconst char * 721132718Skanpp_base_last_position_in_text (const pretty_printer *pp) 722132718Skan{ 723132718Skan const char *p = NULL; 724169689Skan struct obstack *text = pp->buffer->obstack; 725132718Skan 726132718Skan if (obstack_base (text) != obstack_next_free (text)) 727132718Skan p = ((const char *) obstack_next_free (text)) - 1; 728132718Skan return p; 729132718Skan} 730132718Skan 731132718Skan/* Return the amount of characters PRETTY-PRINTER can accept to 732132718Skan make a full line. Meaningful only in line-wrapping mode. */ 733132718Skanint 734132718Skanpp_base_remaining_character_count_for_line (pretty_printer *pp) 735132718Skan{ 736132718Skan return pp->maximum_length - pp->buffer->line_length; 737132718Skan} 738132718Skan 739132718Skan 740132718Skan/* Format a message into BUFFER a la printf. */ 741132718Skanvoid 742132718Skanpp_printf (pretty_printer *pp, const char *msg, ...) 743132718Skan{ 744132718Skan text_info text; 745132718Skan va_list ap; 746132718Skan 747132718Skan va_start (ap, msg); 748132718Skan text.err_no = errno; 749132718Skan text.args_ptr = ≈ 750132718Skan text.format_spec = msg; 751169689Skan text.locus = NULL; 752169689Skan pp_format (pp, &text); 753169689Skan pp_output_formatted_text (pp); 754132718Skan va_end (ap); 755132718Skan} 756132718Skan 757132718Skan 758132718Skan/* Output MESSAGE verbatim into BUFFER. */ 759132718Skanvoid 760132718Skanpp_verbatim (pretty_printer *pp, const char *msg, ...) 761132718Skan{ 762132718Skan text_info text; 763132718Skan va_list ap; 764132718Skan 765132718Skan va_start (ap, msg); 766132718Skan text.err_no = errno; 767132718Skan text.args_ptr = ≈ 768132718Skan text.format_spec = msg; 769169689Skan text.locus = NULL; 770132718Skan pp_format_verbatim (pp, &text); 771132718Skan va_end (ap); 772132718Skan} 773132718Skan 774132718Skan 775132718Skan 776132718Skan/* Have PRETTY-PRINTER start a new line. */ 777132718Skanvoid 778132718Skanpp_base_newline (pretty_printer *pp) 779132718Skan{ 780169689Skan obstack_1grow (pp->buffer->obstack, '\n'); 781132718Skan pp->buffer->line_length = 0; 782132718Skan} 783132718Skan 784132718Skan/* Have PRETTY-PRINTER add a CHARACTER. */ 785132718Skanvoid 786132718Skanpp_base_character (pretty_printer *pp, int c) 787132718Skan{ 788132718Skan if (pp_is_wrapping_line (pp) 789132718Skan && pp_remaining_character_count_for_line (pp) <= 0) 790132718Skan { 791132718Skan pp_newline (pp); 792132718Skan if (ISSPACE (c)) 793132718Skan return; 794132718Skan } 795169689Skan obstack_1grow (pp->buffer->obstack, c); 796132718Skan ++pp->buffer->line_length; 797132718Skan} 798132718Skan 799132718Skan/* Append a STRING to the output area of PRETTY-PRINTER; the STRING may 800132718Skan be line-wrapped if in appropriate mode. */ 801132718Skanvoid 802132718Skanpp_base_string (pretty_printer *pp, const char *str) 803132718Skan{ 804132718Skan pp_maybe_wrap_text (pp, str, str + (str ? strlen (str) : 0)); 805132718Skan} 806132718Skan 807169689Skan/* Maybe print out a whitespace if needed. */ 808132718Skan 809169689Skanvoid 810169689Skanpp_base_maybe_space (pretty_printer *pp) 811169689Skan{ 812169689Skan if (pp_base (pp)->padding != pp_none) 813169689Skan { 814169689Skan pp_space (pp); 815169689Skan pp_base (pp)->padding = pp_none; 816169689Skan } 817169689Skan} 818