]> git.eshelyaron.com Git - emacs.git/commitdiff
(tgetst1): Scan for "%pN"; if all
authorThien-Thi Nguyen <ttn@gnuvola.org>
Sun, 2 May 2004 14:17:11 +0000 (14:17 +0000)
committerThien-Thi Nguyen <ttn@gnuvola.org>
Sun, 2 May 2004 14:17:11 +0000 (14:17 +0000)
N are continuous in [1,9], remove all "%pN".

src/ChangeLog
src/termcap.c

index 21c28c8a90f53f037e762daf84a6d897119150d4..c63ca8ea6a75930baa1a21bc8a45a4146badd3c8 100644 (file)
@@ -1,3 +1,11 @@
+2004-05-02  Thien-Thi Nguyen  <ttn@gnu.org>
+
+       * tparam.c (tparam1): Add handling for `%pN', which
+       means use param N for the next substitution.
+
+       * termcap.c (tgetst1): Scan for "%pN"; if all
+       N are continuous in [1,9], remove all "%pN".
+
 2004-05-01  Thien-Thi Nguyen  <ttn@gnu.org>
 
        * alloc.c (PURE_BEF_ATTRS, PURE_AFT_ATTRS): New macros, by default empty.
index b99ae473315d7133d210c38931c2b37bd70c9772..eda4f3044b1d23a7df2a8c96fc729ee0db3b90ef 100644 (file)
@@ -280,6 +280,52 @@ tgetst1 (ptr, area)
        }
       *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)
@@ -622,7 +668,7 @@ scan_file (str, fd, bufp)
       end = NULL;
       do
        {
-         /* if it is continued, append another line to it,
+         /* If it is continued, append another line to it,
             until a non-continued line ends.  */
          end = gobble_line (fd, bufp, end);
        }
@@ -802,3 +848,5 @@ tprint (cap)
 }
 
 #endif /* TEST */
+
+/* termcap.c ends here */