[1/4] Fix formatting of long function description in chew output

Message ID 20230217192905.3160819-2-tom@tromey.com
State Accepted
Headers
Series More fixes to chew documentation |

Checks

Context Check Description
snail/binutils-gdb-check success Github commit url

Commit Message

Tom Tromey Feb. 17, 2023, 7:29 p.m. UTC
  Currently, if a function description spans a line, the resulting info
can look like this:

 -- Function: long bfd_canonicalize_reloc
     (bfd *abfd, asection *sec, arelent **loc, asymbol **syms); Call the
     back end associated with the open BFD ABFD and translate the
     external form of the relocation information attached to SEC into
     the internal canonical form.  Place the table into memory at LOC,

That is, the function prototype runs together with the text in an ugly
way.  This patch fixes this by introducing a new primitive, so that
the generated Texinfo can be a bit nicer.  Now this output looks like:

 -- Function: long bfd_canonicalize_reloc (bfd *abfd, asection *sec,
          arelent **loc, asymbol **syms);
     Call the back end associated with the open BFD ABFD and translate
     the external form of the relocation information attached to SEC

bfd/ChangeLog
2023-02-17  Tom Tromey  <tom@tromey.com>

	* doc/doc.str (SYNOPSIS): Use collapse_whitespace.
	* doc/chew.c (collapse_whitespace): New function.
	(main): Register collapse_whitespace.
---
 bfd/ChangeLog   |  6 ++++++
 bfd/doc/chew.c  | 33 +++++++++++++++++++++++++++++++++
 bfd/doc/doc.str |  2 ++
 3 files changed, 41 insertions(+)
  

Patch

diff --git a/bfd/doc/chew.c b/bfd/doc/chew.c
index 19e3781bdda..eca9305fee0 100644
--- a/bfd/doc/chew.c
+++ b/bfd/doc/chew.c
@@ -884,6 +884,38 @@  kill_bogus_lines (void)
 
 }
 
+static void
+collapse_whitespace (void)
+{
+  int last_was_ws = 0;
+  int idx;
+
+  string_type out;
+  init_string (&out);
+
+  for (idx = 0; at (tos, idx) != 0; ++idx)
+    {
+      char c = at (tos, idx);
+      if (isspace (c))
+	{
+	  if (!last_was_ws)
+	    {
+	      catchar (&out, ' ');
+	      last_was_ws = 1;
+	    }
+	}
+      else
+	{
+	  catchar (&out, c);
+	  last_was_ws = 0;
+	}
+    }
+
+  pc++;
+  delete_string (tos);
+  *tos = out;
+}
+
 static void
 indent (void)
 {
@@ -1479,6 +1511,7 @@  main (int ac, char *av[])
   add_intrinsic ("indent", indent);
   add_intrinsic ("print_stack_level", print_stack_level);
   add_intrinsic ("strip_trailing_newlines", strip_trailing_newlines);
+  add_intrinsic ("collapse_whitespace", collapse_whitespace);
 
   internal_mode = xmalloc (sizeof (intptr_t));
   *internal_mode = 0;
diff --git a/bfd/doc/doc.str b/bfd/doc/doc.str
index 2a0953a3ece..5077ada9812 100644
--- a/bfd/doc/doc.str
+++ b/bfd/doc/doc.str
@@ -55,8 +55,10 @@  variable synopsis_seen
 	"@deftypefn {Function} " catstr
 	get_stuff_in_command  
 	kill_bogus_lines
+	collapse_whitespace
 	indent
 	catstr
+	"\n" catstr
 	;
 
 : func