diff src/termcap.c @ 88155:d7ddb3e565de

sync with trunk
author Henrik Enberg <henrik.enberg@telia.com>
date Mon, 16 Jan 2006 00:03:54 +0000
parents 01b93e5e53a7
children
line wrap: on
line diff
--- a/src/termcap.c	Sun Jan 15 23:02:10 2006 +0000
+++ b/src/termcap.c	Mon Jan 16 00:03:54 2006 +0000
@@ -1,6 +1,6 @@
 /* Work-alike for termcap, plus extra features.
-   Copyright (C) 1985, 86, 93, 94, 95, 2000, 2001
-   Free Software Foundation, Inc.
+   Copyright (C) 1985, 1986, 1993, 1994, 1995, 2000, 2001, 2002, 2003,
+                 2004, 2005 Free Software Foundation, Inc.
 
 This program is free software; you can redistribute it and/or modify
 it under the terms of the GNU General Public License as published by
@@ -14,8 +14,8 @@
 
 You should have received a copy of the GNU General Public License
 along with this program; see the file COPYING.  If not, write to
-the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
-Boston, MA 02111-1307, USA.  */
+the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+Boston, MA 02110-1301, USA.  */
 
 /* Emacs config.h may rename various library functions such as malloc.  */
 #ifdef HAVE_CONFIG_H
@@ -53,7 +53,7 @@
 #ifdef HAVE_UNISTD_H
 #include <unistd.h>
 #endif
-#ifdef _POSIX_VERSION
+#ifdef HAVE_FCNTL_H
 #include <fcntl.h>
 #endif
 
@@ -284,6 +284,52 @@
 	}
       *r++ = c;
     }
+
+  /* Sometimes entries have "%pN" which means use parameter N in the
+     next %-substitution.  If all such N are continuous in the range
+     [1,9] we can remove each "%pN" because they are redundant, thus
+     reducing bandwidth requirements.  True, Emacs is well beyond the
+     days of 150baud teletypes, but some of its users aren't much so.
+
+     This pass could probably be integrated into the one above but
+     abbreviation expansion makes that effort a little more hairy than
+     its worth; this is cleaner.  */
+  {
+    register int last_p_param = 0;
+    int remove_p_params = 1;
+    struct { char *beg; int len; } cut[11];
+
+    for (cut[0].beg = p = ret; p < r - 3; p++)
+      {
+	if (!remove_p_params)
+	  break;
+	if (*p == '%' && *(p + 1) == 'p')
+	  {
+	    if (*(p + 2) - '0' == 1 + last_p_param)
+	      {
+		cut[last_p_param].len = p - cut[last_p_param].beg;
+		last_p_param++;
+		p += 3;
+		cut[last_p_param].beg = p;
+	      }
+	    else				/* not continuous: bail */
+	      remove_p_params = 0;
+	    if (last_p_param > 10)		/* too many: bail */
+	      remove_p_params = 0;
+	  }
+      }
+    if (remove_p_params && last_p_param)
+      {
+	register int i;
+	char *wp;
+
+	cut[last_p_param].len = r - cut[last_p_param].beg;
+	for (i = 0, wp = ret; i <= last_p_param; wp += cut[i++].len)
+	  bcopy (cut[i].beg, wp, cut[i].len);
+	r = wp;
+      }
+  }
+
   *r = '\0';
   /* Update *AREA.  */
   if (area)
@@ -412,6 +458,7 @@
 #include <rmsdef.h>
 #include <fab.h>
 #include <nam.h>
+#include <starlet.h>
 
 static int
 valid_filename_p (fn)
@@ -828,3 +875,6 @@
 }
 
 #endif /* TEST */
+
+/* arch-tag: c2e8d427-2271-4fac-95fe-411857238b80
+   (do not change this comment) */