texinfo-commits
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

texinfo/info window.c


From: Sergey Poznyakoff
Subject: texinfo/info window.c
Date: Wed, 06 Apr 2011 21:19:02 +0000

CVSROOT:        /cvsroot/texinfo
Module name:    texinfo
Changes by:     Sergey Poznyakoff <gray>        11/04/06 21:19:02

Modified files:
        info           : window.c 

Log message:
        (free_echo_area): Remove static qualifier.
        (vwindow_message_in_echo_area): New function.
        (window_message_in_echo_area): Rewrite as a variadic function.
        (message_in_echo_area): Likewise.
        (message_buffer_size, message_buffer_index): Change type to size_t.
        (message_buffer_resize): Remove.
        (build_message_buffer): Rewrite from scratch, using vsnprintf.
        (printf_to_message_buffer): Rewrite as a variadic function.
        (message_buffer_length_this_line): Rewrite via strrchr.

CVSWeb URLs:
http://cvs.savannah.gnu.org/viewcvs/texinfo/info/window.c?cvsroot=texinfo&r1=1.21&r2=1.22

Patches:
Index: window.c
===================================================================
RCS file: /cvsroot/texinfo/texinfo/info/window.c,v
retrieving revision 1.21
retrieving revision 1.22
diff -u -b -r1.21 -r1.22
--- window.c    5 Feb 2011 19:01:54 -0000       1.21
+++ window.c    6 Apr 2011 21:19:02 -0000       1.22
@@ -1,5 +1,5 @@
 /* window.c -- windows in Info.
-   $Id: window.c,v 1.21 2011/02/05 19:01:54 karl Exp $
+   $Id: window.c,v 1.22 2011/04/06 21:19:02 gray Exp $
 
    Copyright (C) 1993, 1997, 1998, 2001, 2002, 2003, 2004, 2007, 2008, 2011
    Free Software Foundation, Inc.
@@ -1124,7 +1124,7 @@
 static NODE *echo_area_node = NULL;
 
 /* Make the node of the_echo_area be an empty one. */
-static void
+void
 free_echo_area (void)
 {
   if (echo_area_node)
@@ -1146,17 +1146,27 @@
   display_update_one_window (the_echo_area);
 }
 
+void
+vwindow_message_in_echo_area (const char *format, va_list ap)
+{
+  free_echo_area ();
+  echo_area_node = build_message_node (format, ap);
+  window_set_node_of_window (the_echo_area, echo_area_node);
+  display_update_one_window (the_echo_area);
+}
+
 /* Make a message appear in the echo area, built from FORMAT, ARG1 and ARG2.
    The arguments are treated similar to printf () arguments, but not all of
    printf () hair is present.  The message appears immediately.  If there was
    already a message appearing in the echo area, it is removed. */
 void
-window_message_in_echo_area (const char *format, void *arg1, void *arg2)
+window_message_in_echo_area (const char *format, ...)
 {
-  free_echo_area ();
-  echo_area_node = build_message_node (format, arg1, arg2);
-  window_set_node_of_window (the_echo_area, echo_area_node);
-  display_update_one_window (the_echo_area);
+  va_list ap;
+  
+  va_start (ap, format);
+  vwindow_message_in_echo_area (format, ap);
+  va_end (ap);
 }
 
 /* Place a temporary message in the echo area built from FORMAT, ARG1
@@ -1168,8 +1178,10 @@
 static int old_echo_area_nodes_slots = 0;
 
 void
-message_in_echo_area (const char *format, void *arg1, void *arg2)
+message_in_echo_area (const char *format, ...)
 {
+  va_list ap;
+  
   if (echo_area_node)
     {
       add_pointer_to_array (echo_area_node, old_echo_area_nodes_index,
@@ -1177,7 +1189,9 @@
                             4, NODE *);
     }
   echo_area_node = NULL;
-  window_message_in_echo_area (format, arg1, arg2);
+  va_start (ap, format);
+  vwindow_message_in_echo_area (format, ap);
+  va_end (ap);
 }
 
 void
@@ -1194,185 +1208,87 @@
 
 /* A place to build a message. */
 static char *message_buffer = NULL;
-static int message_buffer_index = 0;
-static int message_buffer_size = 0;
+static size_t message_buffer_size = 0;
+static size_t message_buffer_index = 0;
 
-/* Ensure that there is enough space to stuff LENGTH characters into
-   MESSAGE_BUFFER. */
+/* Format MESSAGE_BUFFER with the results of printing FORMAT with ARG1 and
+   ARG2. */
 static void
-message_buffer_resize (int length)
+build_message_buffer (const char *format, va_list ap)
 {
   if (!message_buffer)
     {
-      message_buffer_size = length + 1;
+      if (message_buffer_size == 0)
+       message_buffer_size = 512; /* Initial allocation */
+      
       message_buffer = xmalloc (message_buffer_size);
-      message_buffer_index = 0;
     }
 
-  while (message_buffer_size <= message_buffer_index + length)
-    message_buffer = (char *)
-      xrealloc (message_buffer,
-                message_buffer_size += 100 + (2 * length));
-}
-
-/* Format MESSAGE_BUFFER with the results of printing FORMAT with ARG1 and
-   ARG2. */
-static void
-build_message_buffer (const char *format, void *arg1, void *arg2, void *arg3)
-{
-  register int i, len;
-  void *args[3];
-  int arg_index = 0;
-
-  args[0] = arg1;
-  args[1] = arg2;
-  args[2] = arg3;
-
-  len = strlen (format);
-
-  message_buffer_resize (len);
-
-  for (i = 0; format[i]; i++)
+  for (;;)
     {
-      if (format[i] != '%')
+      ssize_t n = vsnprintf (message_buffer + message_buffer_index,
+                            message_buffer_size - message_buffer_index,
+                            format, ap);
+      if (n < 0 || message_buffer_index + n >= message_buffer_size ||
+         !memchr (message_buffer + message_buffer_index, '\0',
+                  message_buffer_size - message_buffer_index + 1))
         {
-          message_buffer[message_buffer_index++] = format[i];
-          len--;
+         char *newbuf;
+         size_t newlen = message_buffer_size * 2;
+         if (newlen < message_buffer_size)
+           xalloc_die ();
+         message_buffer_size = newlen;
+         message_buffer = xrealloc (message_buffer, message_buffer_size);
         }
       else
         {
-          char c;
-          const char *fmt_start = format + i;
-          char *fmt;
-          int fmt_len, formatted_len;
-         int paramed = 0;
-
-       format_again:
-          i++;
-          while (format[i] && strchr ("-. +0123456789", format[i]))
-            i++;
-          c = format[i];
-
-          if (c == '\0')
-            abort ();
-
-         if (c == '$') {
-           /* position parameter parameter */
-           /* better to use bprintf from bfox's metahtml? */
-           arg_index = atoi(fmt_start + 1) - 1;
-           if (arg_index < 0)
-             arg_index = 0;
-           if (arg_index >= 2)
-             arg_index = 1;
-           paramed = 1;
-           goto format_again;
-         }
-
-          fmt_len = format + i - fmt_start + 1;
-          fmt = xmalloc (fmt_len + 1);
-          strncpy (fmt, fmt_start, fmt_len);
-          fmt[fmt_len] = '\0';
-
-         if (paramed) {
-           /* removed positioned parameter */
-           char *p;
-           for (p = fmt + 1; *p && *p != '$'; p++) {
-             ;
-           }
-           strcpy(fmt + 1, p + 1);
-         }
-
-          /* If we have "%-98s", maybe 98 calls for a longer string.  */
-          if (fmt_len > 2)
-            {
-              int j;
-
-              for (j = fmt_len - 2; j >= 0; j--)
-                if (isdigit (fmt[j]) || fmt[j] == '$')
+         message_buffer_index += n;
                   break;
-
-              formatted_len = atoi (fmt + j);
             }
-          else
-            formatted_len = c == 's' ? 0 : 1; /* %s can produce empty string */
-
-          switch (c)
-            {
-            case '%':           /* Insert a percent sign. */
-              message_buffer_resize (len + formatted_len);
-              sprintf
-                (message_buffer + message_buffer_index, fmt, "%");
-              message_buffer_index += formatted_len;
-              break;
-
-            case 's':           /* Insert the current arg as a string. */
-              {
-                char *string;
-                int string_len;
-
-                string = (char *)args[arg_index++];
-                string_len = strlen (string);
-
-                if (formatted_len > string_len)
-                  string_len = formatted_len;
-                message_buffer_resize (len + string_len);
-                sprintf
-                  (message_buffer + message_buffer_index, fmt, string);
-                message_buffer_index += string_len;
               }
-              break;
-
-            case 'd':           /* Insert the current arg as an integer. */
-              {
-                long long_val;
-                int integer;
-
-                long_val = (long)args[arg_index++];
-                integer = (int)long_val;
+}
 
-                message_buffer_resize (len + formatted_len > 32
-                                       ? formatted_len : 32);
-                sprintf
-                  (message_buffer + message_buffer_index, fmt, integer);
-                message_buffer_index = strlen (message_buffer);
-              }
-              break;
+/* Build a new node which has FORMAT printed with ARG1 and ARG2 as the
+   contents. */
+NODE *
+build_message_node (const char *format, va_list ap)
+{
+  NODE *node;
 
-            case 'c':           /* Insert the current arg as a character. */
-              {
-                long long_val;
-                int character;
+  initialize_message_buffer ();
+  build_message_buffer (format, ap);
 
-                long_val = (long)args[arg_index++];
-                character = (int)long_val;
+  node = message_buffer_to_node ();
+  return node;
+}
 
-                message_buffer_resize (len + formatted_len);
-                sprintf
-                  (message_buffer + message_buffer_index, fmt, character);
-                message_buffer_index += formatted_len;
-              }
-              break;
+NODE *
+format_message_node (const char *format, ...)
+{
+  NODE *node;
+  va_list ap;
 
-            default:
-              abort ();
-            }
-          free (fmt);
-        }
-    }
-  message_buffer[message_buffer_index] = '\0';
+  va_start (ap, format);
+  node = build_message_node (format, ap);
+  va_end (ap);
+  return node;
 }
 
-/* Build a new node which has FORMAT printed with ARG1 and ARG2 as the
-   contents. */
 NODE *
-build_message_node (const char *format, void *arg1, void *arg2)
+string_to_node (char *contents)
 {
   NODE *node;
 
-  message_buffer_index = 0;
-  build_message_buffer (format, arg1, arg2, 0);
+  node = xmalloc (sizeof (NODE));
+  node->filename = NULL;
+  node->parent = NULL;
+  node->nodename = NULL;
+  node->flags = 0;
+  node->display_pos =0;
 
-  node = message_buffer_to_node ();
+  /* Make sure that this buffer ends with a newline. */
+  node->nodelen = 1 + strlen (contents);
+  node->contents = contents;
   return node;
 }
 
@@ -1382,7 +1298,7 @@
 {
   NODE *node;
 
-  node = xmalloc (sizeof (NODE));
+  node = xzalloc (sizeof (NODE));
   node->filename = NULL;
   node->parent = NULL;
   node->nodename = NULL;
@@ -1405,11 +1321,16 @@
   message_buffer_index = 0;
 }
 
-/* Print FORMAT with ARG1,2 to the end of the current message buffer. */
+/* Print supplied arguments using FORMAT to the end of the current message
+   buffer. */
 void
-printf_to_message_buffer (const char *format, void *arg1, void *arg2, void 
*arg3)
+printf_to_message_buffer (const char *format, ...)
 {
-  build_message_buffer (format, arg1, arg2, arg3);
+  va_list ap;
+
+  va_start (ap, format);
+  build_message_buffer (format, ap);
+  va_end (ap);
 }
 
 /* Return the current horizontal position of the "cursor" on the most
@@ -1417,14 +1338,15 @@
 int
 message_buffer_length_this_line (void)
 {
-  register int i;
+  char *p;
 
-  if (!message_buffer_index)
+  if (!message_buffer || !*message_buffer)
     return 0;
 
-  for (i = message_buffer_index; i && message_buffer[i - 1] != '\n'; i--);
-
-  return string_width (message_buffer + i, 0);
+  p = strrchr (message_buffer, '\n');
+  if (!p)
+    p = message_buffer;
+  return string_width (p, 0);
 }
 
 /* Pad STRING to COUNT characters by inserting blanks. */



reply via email to

[Prev in Thread] Current Thread [Next in Thread]