home *** CD-ROM | disk | FTP | other *** search
/ Source Code 1992 March / Source_Code_CD-ROM_Walnut_Creek_March_1992.iso / usenet / altsrcs / 1 / 1135 < prev    next >
Internet Message Format  |  1990-12-28  |  36KB

  1. From: howard@hasse.ericsson.se (Howard Gayle)
  2. Newsgroups: alt.sources
  3. Subject: GNU Emacs 8-bit mods part 08 of 12
  4. Message-ID: <1990Apr5.134005.9052@ericsson.se>
  5. Date: 5 Apr 90 13:40:05 GMT
  6.  
  7. *** ../18.55/src/search.c    Thu Aug  3 08:05:06 1989
  8. --- src/search.c    Thu Apr  5 09:16:19 1990
  9. ***************
  10. *** 1,5 ****
  11.   /* String search routines for GNU Emacs.
  12. !    Copyright (C) 1985, 1986, 1987 Free Software Foundation, Inc.
  13.   
  14.   This file is part of GNU Emacs.
  15.   
  16. --- 1,5 ----
  17.   /* String search routines for GNU Emacs.
  18. !    Copyright (C) 1985, 1986, 1987, 1990 Free Software Foundation, Inc.
  19.   
  20.   This file is part of GNU Emacs.
  21.   
  22. ***************
  23. *** 19,60 ****
  24.   and this notice must be preserved on all copies.  */
  25.   
  26.   
  27.   #include "config.h"
  28.   #include "lisp.h"
  29.   #include "syntax.h"
  30.   #include "buffer.h"
  31.   #include "commands.h"
  32.   #include "regex.h"
  33.   
  34.   #define max(a, b) ((a) > (b) ? (a) : (b))
  35.   #define min(a, b) ((a) < (b) ? (a) : (b))
  36.   
  37. - unsigned char downcase_table[01000] = {0};    /* folds upper to lower case */
  38. -           /* A WHEEL WILL FALL OFF IF, IN A trt, CHARACTER A */
  39. -           /* TRANSLATES INTO CHARACTER B AND CHARACTER B DOES NOT */
  40. -           /* ALSO TRANSLATE INTO CHARACTER B. */ 
  41. - /* If that constraint is met, compute_trt_inverse will follow a */
  42. -  /* translation table with its inverse.  The inverse of a table */
  43. -  /* follows the table at table[0400].  The form of this is that if */
  44. -  /* table[a]=b then the chain starting at table[0400+b], linked by */
  45. -  /* link(x)=table[0400+x] and ended by b must include a. */
  46. - /* At present compute_trt_inverse is blinded and the inverse for this */
  47. -  /* particular table is created by a single-purpose loop. */
  48. -  /* compute_trt_inverse has been tested on the following cases: */
  49. -  /* trt[x]=x, trt[x]=(+ 3 (logand x, 0370)), trt[x]='a', and the */
  50. -  /* downcase table. */
  51.   /* We compile regexps into this buffer and then use it for searching. */
  52.   
  53.   struct re_pattern_buffer searchbuf;
  54.   
  55. ! char search_fastmap[0400];
  56.   
  57.   /* Last regexp we compiled */
  58.   Lisp_Object last_regexp;
  59.   
  60.   /* Every call to re_match, etc., must pass &search_regs as the regs argument
  61.    unless you can show it is unnecessary (i.e., if re_match is certainly going
  62.    to be called again before region-around-match can be called).  */
  63. --- 19,51 ----
  64.   and this notice must be preserved on all copies.  */
  65.   
  66.   
  67. + /* Modified 1990 for 8-bit character support by Howard Gayle.
  68. +  *  See chartab.c for details. */
  69.   #include "config.h"
  70.   #include "lisp.h"
  71.   #include "syntax.h"
  72.   #include "buffer.h"
  73. + #include "casetab.h"
  74. + #include "chartab.h"
  75.   #include "commands.h"
  76.   #include "regex.h"
  77. + #include "sorttab.h"
  78.   
  79.   #define max(a, b) ((a) > (b) ? (a) : (b))
  80.   #define min(a, b) ((a) < (b) ? (a) : (b))
  81.   
  82.   /* We compile regexps into this buffer and then use it for searching. */
  83.   
  84.   struct re_pattern_buffer searchbuf;
  85.   
  86. ! char_t search_fastmap[0400];
  87.   
  88.   /* Last regexp we compiled */
  89.   Lisp_Object last_regexp;
  90.   
  91.   /* Every call to re_match, etc., must pass &search_regs as the regs argument
  92.    unless you can show it is unnecessary (i.e., if re_match is certainly going
  93.    to be called again before region-around-match can be called).  */
  94. ***************
  95. *** 67,88 ****
  96.   
  97.   /* Compile a regexp and signal a Lisp error if anything goes wrong.  */
  98.   
  99. ! compile_pattern (pattern, bufp, translate)
  100.        Lisp_Object pattern;
  101.        struct re_pattern_buffer *bufp;
  102. !      char *translate;
  103.   {
  104.     char *val;
  105.     Lisp_Object dummy;
  106.   
  107.     if (EQ (pattern, last_regexp)
  108. !       && translate == bufp->translate)
  109.       return;
  110.     last_regexp = Qnil;
  111. !   bufp->translate = translate;
  112. !   val = re_compile_pattern (XSTRING (pattern)->data,
  113. !                 XSTRING (pattern)->size,
  114. !                 bufp);
  115.     if (val)
  116.       {
  117.         dummy = build_string (val);
  118. --- 58,81 ----
  119.   
  120.   /* Compile a regexp and signal a Lisp error if anything goes wrong.  */
  121.   
  122. ! compile_pattern (pattern, bufp, sorttab)
  123.        Lisp_Object pattern;
  124.        struct re_pattern_buffer *bufp;
  125. !      struct Lisp_Sorttab *sorttab;
  126.   {
  127.     char *val;
  128.     Lisp_Object dummy;
  129.   
  130. +   /* Sort table used for last regexp compilation: */
  131. +   static struct Lisp_Sorttab *last_sort_table;
  132.     if (EQ (pattern, last_regexp)
  133. !       && (sorttab == last_sort_table))
  134.       return;
  135.     last_regexp = Qnil;
  136. !   val = re_compile_pattern_sort (XSTRING (pattern)->data,
  137. !                      XSTRING (pattern)->size,
  138. !                      bufp, sorttab);
  139.     if (val)
  140.       {
  141.         dummy = build_string (val);
  142. ***************
  143. *** 90,95 ****
  144. --- 83,89 ----
  145.       Fsignal (Qinvalid_regexp, Fcons (dummy, Qnil));
  146.       }
  147.     last_regexp = pattern;
  148. +   last_sort_table = sorttab;
  149.     return;
  150.   }
  151.   
  152. ***************
  153. *** 115,122 ****
  154.     register int i;
  155.   
  156.     CHECK_STRING (string, 0);
  157. !   compile_pattern (string, &searchbuf,
  158. !            !NULL (bf_cur->case_fold_search) ? (char *) downcase_table : 0);
  159.   
  160.     immediate_quit = 1;
  161.     QUIT;            /* Do a pending quit right away, to avoid paradoxical behavior */
  162. --- 109,115 ----
  163.     register int i;
  164.   
  165.     CHECK_STRING (string, 0);
  166. !   compile_pattern (string, &searchbuf, current_sort_table ());
  167.   
  168.     immediate_quit = 1;
  169.     QUIT;            /* Do a pending quit right away, to avoid paradoxical behavior */
  170. ***************
  171. *** 183,190 ****
  172.       args_out_of_range (string, start);
  173.       }
  174.   
  175. !   compile_pattern (regexp, &searchbuf,
  176. !            !NULL (bf_cur->case_fold_search) ? (char *) downcase_table : 0);
  177.     immediate_quit = 1;
  178.     val = re_search (&searchbuf, XSTRING (string)->data, XSTRING (string)->size,
  179.                      s, XSTRING (string)->size - s, &search_regs);
  180. --- 176,182 ----
  181.       args_out_of_range (string, start);
  182.       }
  183.   
  184. !   compile_pattern (regexp, &searchbuf, current_sort_table ());
  185.     immediate_quit = 1;
  186.     val = re_search (&searchbuf, XSTRING (string)->data, XSTRING (string)->size,
  187.                      s, XSTRING (string)->size - s, &search_regs);
  188. ***************
  189. *** 273,279 ****
  190.   find_next_newline (from, cnt)
  191.        register int from, cnt;
  192.   {
  193. !   return (scan_buffer ('\n', from, cnt, (int *) 0));
  194.   }
  195.   
  196.   DEFUN ("skip-chars-forward", Fskip_chars_forward, Sskip_chars_forward, 1, 2, 0,
  197. --- 265,271 ----
  198.   find_next_newline (from, cnt)
  199.        register int from, cnt;
  200.   {
  201. !   return (scan_buffer (NEWLINE, from, cnt, (int *) 0));
  202.   }
  203.   
  204.   DEFUN ("skip-chars-forward", Fskip_chars_forward, Sskip_chars_forward, 1, 2, 0,
  205. ***************
  206. *** 403,410 ****
  207.       lim = FirstCharacter;
  208.       }
  209.   
  210. !   np = search_buffer (string, point, lim, n, RE,
  211. !               !NULL (bf_cur->case_fold_search) ? downcase_table : 0);
  212.     if (np <= 0)
  213.       {
  214.         if (NULL (noerror))
  215. --- 395,401 ----
  216.       lim = FirstCharacter;
  217.       }
  218.   
  219. !   np = search_buffer (string, point, lim, n, RE);
  220.     if (np <= 0)
  221.       {
  222.         if (NULL (noerror))
  223. ***************
  224. *** 441,454 ****
  225.   /* INTERFACE CHANGE ALERT!!!!  search_buffer now returns -x if only */
  226.   /* n-x occurences are found. */
  227.   
  228. ! search_buffer (string, pos, lim, n, RE, trt)
  229.        Lisp_Object string;
  230.        int pos;
  231.        int lim;
  232.        int n;
  233.        int RE;
  234. -      register unsigned char *trt;
  235.   {
  236.     int len = XSTRING (string)->size;
  237.     unsigned char *base_pat = XSTRING (string)->data;
  238.     register int *BM_tab;
  239. --- 432,446 ----
  240.   /* INTERFACE CHANGE ALERT!!!!  search_buffer now returns -x if only */
  241.   /* n-x occurences are found. */
  242.   
  243. ! search_buffer (string, pos, lim, n, RE)
  244.        Lisp_Object string;
  245.        int pos;
  246.        int lim;
  247.        int n;
  248.        int RE;
  249.   {
  250. +   struct Lisp_Sorttab *sorttab;
  251. +   register char_t *trt; /* Equivalence class table. */
  252.     int len = XSTRING (string)->size;
  253.     unsigned char *base_pat = XSTRING (string)->data;
  254.     register int *BM_tab;
  255. ***************
  256. *** 465,472 ****
  257.     if (!len)
  258.       return (0);
  259.   
  260.     if (RE)
  261. !     compile_pattern (string, &searchbuf, (char *) trt);
  262.     
  263.     if (RE            /* Here we detect whether the */
  264.                   /* generality of an RE search is */
  265. --- 457,466 ----
  266.     if (!len)
  267.       return (0);
  268.   
  269. +   sorttab = current_sort_table ();
  270. +   trt = current_equiv_class_table ();
  271.     if (RE)
  272. !     compile_pattern (string, &searchbuf, sorttab);
  273.     
  274.     if (RE            /* Here we detect whether the */
  275.                   /* generality of an RE search is */
  276. ***************
  277. *** 476,482 ****
  278.       {
  279.         RE = 0;            /* can do straight (non RE) search */
  280.         pat = (base_pat = (unsigned char *) searchbuf.buffer + 2);
  281. !                 /* trt already applied */
  282.         len = searchbuf.used - 2;
  283.       }
  284.     else if (!RE)
  285. --- 470,476 ----
  286.       {
  287.         RE = 0;            /* can do straight (non RE) search */
  288.         pat = (base_pat = (unsigned char *) searchbuf.buffer + 2);
  289. !                 /* sorttab already applied */
  290.         len = searchbuf.used - 2;
  291.       }
  292.     else if (!RE)
  293. ***************
  294. *** 483,490 ****
  295.       {
  296.         pat = (unsigned char *) alloca (len);
  297.   
  298. !       for (i = len; i--;)        /* Copy the pattern; apply trt */
  299. !     *pat++ = (((int) trt) ? trt [*base_pat++] : *base_pat++);
  300.         pat -= len; base_pat = pat;
  301.       }
  302.   
  303. --- 477,484 ----
  304.       {
  305.         pat = (unsigned char *) alloca (len);
  306.   
  307. !       for (i = len; i--;)        /* Copy the pattern; apply sorttab */
  308. !     *pat++ = (trt ? trt[*base_pat++] : *base_pat++);
  309.         pat -= len; base_pat = pat;
  310.       }
  311.   
  312. ***************
  313. *** 596,602 ****
  314.         /* is determined only by the last character of the putative match. */
  315.         /* If that character does not match, we will stride the proper */
  316.         /* distance to propose a match that superimposes it on the last */
  317. !       /* instance of a character that matches it (per trt), or misses */
  318.         /* it entirely if there is none. */  
  319.   
  320.         dirlen = len * direction;
  321. --- 590,596 ----
  322.         /* is determined only by the last character of the putative match. */
  323.         /* If that character does not match, we will stride the proper */
  324.         /* distance to propose a match that superimposes it on the last */
  325. !       /* instance of a character that matches it (per sorttab), or misses */
  326.         /* it entirely if there is none. */  
  327.   
  328.         dirlen = len * direction;
  329. ***************
  330. *** 620,642 ****
  331.       {
  332.         j = pat[i]; i += direction;
  333.         if (i == dirlen) i = infinity;
  334. !       if ((int) trt)
  335.           {
  336. -           k = (j = trt[j]);
  337.             if (i == infinity)
  338.           stride_for_teases = BM_tab[j];
  339.             BM_tab[j] = dirlen - i;
  340. -           /* A translation table is followed by its inverse -- see */
  341. -           /* comment following downcase_table for details */ 
  342. -           while ((j = trt[0400+j]) != k)
  343. -         BM_tab[j] = dirlen - i;
  344.           }
  345.         else
  346.           {
  347.             if (i == infinity)
  348. !         stride_for_teases = BM_tab[j];
  349. !           BM_tab[j] = dirlen - i;
  350.           }
  351.         /* stride_for_teases tells how much to stride if we get a */
  352.         /* match on the far character but are subsequently */
  353. --- 614,635 ----
  354.       {
  355.         j = pat[i]; i += direction;
  356.         if (i == dirlen) i = infinity;
  357. !       if (sorttab == NULL_SORT_TABLE)
  358.           {
  359.             if (i == infinity)
  360.           stride_for_teases = BM_tab[j];
  361.             BM_tab[j] = dirlen - i;
  362.           }
  363.         else
  364.           {
  365. +           /* We now want to set BM_tab[x] = dirlen - 1 for
  366. +           all characters x in equivalence class j. */
  367. +           k = sorttab->srt_dope[j].ec_lo;
  368.             if (i == infinity)
  369. !         stride_for_teases = BM_tab[sorttab->srt_chars[k]];
  370. !           do
  371. !             BM_tab[sorttab->srt_chars[k++]] = dirlen - i;
  372. !           while (k <= sorttab->srt_dope[j].ec_hi);
  373.           }
  374.         /* stride_for_teases tells how much to stride if we get a */
  375.         /* match on the far character but are subsequently */
  376. ***************
  377. *** 706,712 ****
  378.               break;    /* a small overrun is genuine */
  379.             cursor -= infinity; /* large overrun = hit */
  380.             i = dirlen - direction;
  381. !           if ((int) trt)
  382.               {
  383.                 while ((i -= direction) + direction != 0)
  384.               if (pat[i] != trt[*(cursor -= direction)])
  385. --- 699,705 ----
  386.               break;    /* a small overrun is genuine */
  387.             cursor -= infinity; /* large overrun = hit */
  388.             i = dirlen - direction;
  389. !           if (trt)
  390.               {
  391.                 while ((i -= direction) + direction != 0)
  392.               if (pat[i] != trt[*(cursor -= direction)])
  393. ***************
  394. *** 768,776 ****
  395.             while ((i -= direction) + direction != 0)
  396.               {
  397.                 pos -= direction;
  398. !               if (pat[i] != (((int) trt)
  399. !                      ? trt[CharAt(pos)]
  400. !                      : CharAt (pos)))
  401.               break;
  402.               }
  403.             /* Above loop has moved POS part or all the way
  404. --- 761,767 ----
  405.             while ((i -= direction) + direction != 0)
  406.               {
  407.                 pos -= direction;
  408. !               if (pat[i] != (trt ? trt[CharAt(pos)] : CharAt (pos)))
  409.               break;
  410.               }
  411.             /* Above loop has moved POS part or all the way
  412. ***************
  413. *** 977,983 ****
  414.         /* Decide how to casify by examining the matched text. */
  415.   
  416.         last = search_regs.end[0];
  417. !       prevc = '\n';
  418.         case_action = all_caps;
  419.   
  420.         /* some_multiletter_word is set nonzero if any original word
  421. --- 968,974 ----
  422.         /* Decide how to casify by examining the matched text. */
  423.   
  424.         last = search_regs.end[0];
  425. !       prevc = NEWLINE;
  426.         case_action = all_caps;
  427.   
  428.         /* some_multiletter_word is set nonzero if any original word
  429. ***************
  430. *** 987,1014 ****
  431.         for (pos = search_regs.start[0]; pos < last; pos++)
  432.       {
  433.         c = CharAt (pos);
  434. !       if (LOWERCASEP (c))
  435. !         {
  436. !           /* Cannot be all caps if any original char is lower case */
  437. !           case_action = cap_initial;
  438. !           if (SYNTAX (prevc) != Sword)
  439. !         {
  440. !           /* Cannot even be cap initials
  441. !              if some original initial is lower case */
  442. !           case_action = nochange;
  443. !           break;
  444. !         }
  445. !           else
  446. !         some_multiletter_word = 1;
  447. !         }
  448. !       else if (!NOCASEP (c))
  449.           {
  450. !           some_letter = 1;
  451. !           if (!some_multiletter_word && SYNTAX (prevc) == Sword)
  452. !         some_multiletter_word = 1;
  453.           }
  454.         prevc = c;
  455.       }
  456.   
  457. --- 978,1004 ----
  458.         for (pos = search_regs.start[0]; pos < last; pos++)
  459.       {
  460.         c = CharAt (pos);
  461. !       switch (LOCAL_CASE (c))
  462.           {
  463. !           case lowercase_e:
  464. !             /* Cannot be all caps if any original char is lower case */
  465. !             case_action = cap_initial;
  466. !             if (SYNTAX (prevc) != Sword)
  467. !           {
  468. !             /* Cannot even be cap initials
  469. !                if some original initial is lower case */
  470. !             case_action = nochange;
  471. !             break;
  472. !           }
  473. !             else
  474. !           some_multiletter_word = 1;
  475. !         break;
  476. !           case uppercase_e:
  477. !             some_letter = 1;
  478. !             if (!some_multiletter_word && SYNTAX (prevc) == Sword)
  479. !           some_multiletter_word = 1;
  480. !         break;
  481.           }
  482.         prevc = c;
  483.       }
  484.   
  485. ***************
  486. *** 1216,1268 ****
  487.       }
  488.     return ostr;
  489.   }
  490. ! /* This code should be unzapped when there comes to be multiple */
  491. !  /* translation tables.  It has been certified on various cases. */
  492. ! /*
  493. ! void
  494. ! compute_trt_inverse (trt)
  495. !      register unsigned char *trt;
  496. ! {
  497. !   register int i = 0400;
  498. !   register unsigned char c, q;
  499. !   while (i--)
  500. !     trt[0400+i] = i;
  501. !   i = 0400;
  502. !   while (i--)
  503. !     {
  504. !       if ((q = trt[i]) != (unsigned char) i)
  505. !     {
  506. !       c = trt[q + 0400];
  507. !       trt[q + 0400] = i;
  508. !       trt[0400 + i] = c;
  509. !     }
  510. !     }
  511.   }
  512. - */
  513.      
  514.   syms_of_search ()
  515.   {
  516. -   register int i;
  517. -   for (i = 0; i < 0400; i++)
  518. -     {
  519. -       downcase_table[i] = (i >= 'A' && i <= 'Z') ? i + 040 : i;
  520. - /* We do this instead of using compute_trt_inverse to save space. */
  521. -  /* Does it? */
  522. -       downcase_table[0400+i]
  523. -     = ((i >= 'A' && i <= 'Z')
  524. -        ? i + ('a' - 'A')
  525. -        : ((i >= 'a' && i <= 'z')
  526. -           ? i + ('A' - 'a')
  527. -           : i));
  528. -     }
  529. - /* Use this instead when there come to be multiple translation tables. 
  530. -   compute_trt_inverse (downcase_table);    */
  531.     searchbuf.allocated = 100;
  532. !   searchbuf.buffer = (char *) malloc (searchbuf.allocated);
  533.     searchbuf.fastmap = search_fastmap;
  534.   
  535.     Qsearch_failed = intern ("search-failed");
  536. --- 1206,1228 ----
  537.       }
  538.     return ostr;
  539.   }
  540. ! DEFUN ("compile-regexp", Fcompile_regexp, Scompile_regexp, 1, 1, 0,
  541. !    "Compile regular expression.")
  542. ! (re)
  543. ! Lisp_Object re;
  544. ! {
  545. ! CHECK_STRING (re, 0);
  546. ! compile_pattern (re, &searchbuf, current_sort_table ());
  547. ! re_compile_fastmap (&searchbuf);
  548. ! return (Fcons (make_string (searchbuf.buffer, searchbuf.used),
  549. !                  make_string (search_fastmap, 256)));
  550.   }
  551.      
  552.   syms_of_search ()
  553.   {
  554.     searchbuf.allocated = 100;
  555. !   searchbuf.buffer = (char_t *) malloc (searchbuf.allocated);
  556.     searchbuf.fastmap = search_fastmap;
  557.   
  558.     Qsearch_failed = intern ("search-failed");
  559. ***************
  560. *** 1299,1302 ****
  561. --- 1259,1263 ----
  562.     defsubr (&Smatch_data);
  563.     defsubr (&Sstore_match_data);
  564.     defsubr (&Sregexp_quote);
  565. +   defsubr (&Scompile_regexp);
  566.   }
  567. *** ../18.55/src/term.c    Wed Mar 29 17:49:32 1989
  568. --- src/term.c    Wed Mar  7 09:53:29 1990
  569. ***************
  570. *** 1,5 ****
  571.   /* terminal control module for terminals described by TERMCAP
  572. !    Copyright (C) 1985, 1986, 1987 Free Software Foundation, Inc.
  573.   
  574.   This file is part of GNU Emacs.
  575.   
  576. --- 1,5 ----
  577.   /* terminal control module for terminals described by TERMCAP
  578. !    Copyright (C) 1985, 1986, 1987, 1990 Free Software Foundation, Inc.
  579.   
  580.   This file is part of GNU Emacs.
  581.   
  582. ***************
  583. *** 20,27 ****
  584. --- 20,30 ----
  585.   
  586.   
  587.   #include <stdio.h>
  588. + #undef NULL
  589.   #include <ctype.h>
  590.   #include "config.h"
  591. + #include "lisp.h"
  592. + #include "chartab.h"
  593.   #include "termhooks.h"
  594.   #include "termchar.h"
  595.   #include "termopts.h"
  596. ***************
  597. *** 60,72 ****
  598.      where one page is used for Emacs and another for all else. */
  599.   int no_redraw_on_reenter;
  600.   
  601. - /* DCICcost[n] is cost of inserting N characters.
  602. -    DCICcost[-n] is cost of deleting N characters. */
  603. - #define DCICcost (&DC_ICcost[MScreenWidth])
  604. - int DC_ICcost[1 + 2 * MScreenWidth];
  605.   /* Hook functions that you can set to snap out the functions in this file.
  606.      These are all extern'd in termhooks.h  */
  607.   
  608. --- 63,68 ----
  609. ***************
  610. *** 82,90 ****
  611.   int (*change_line_highlight_hook) ();
  612.   int (*reassert_line_highlight_hook) ();
  613.   
  614. ! int (*insert_chars_hook) ();
  615. ! int (*write_chars_hook) ();
  616. ! int (*delete_chars_hook) ();
  617.   
  618.   int (*ring_bell_hook) ();
  619.   
  620. --- 78,86 ----
  621.   int (*change_line_highlight_hook) ();
  622.   int (*reassert_line_highlight_hook) ();
  623.   
  624. ! int (*insert_glyfs_hook) ();
  625. ! int (*write_glyfs_hook) ();
  626. ! int (*delete_glyfs_hook) ();
  627.   
  628.   int (*ring_bell_hook) ();
  629.   
  630. ***************
  631. *** 520,527 ****
  632.   clear_end_of_line (first_unused_hpos)
  633.        int first_unused_hpos;
  634.   {
  635.     if (TN_standout_width == 0 && curX == 0 && chars_wasted[curY] != 0)
  636. !     write_chars (" ", 1);
  637.     clear_end_of_line_raw (first_unused_hpos);
  638.   }
  639.   
  640. --- 516,525 ----
  641.   clear_end_of_line (first_unused_hpos)
  642.        int first_unused_hpos;
  643.   {
  644. +   static glyf_t sg = SPACEGLYF;
  645.     if (TN_standout_width == 0 && curX == 0 && chars_wasted[curY] != 0)
  646. !     write_glyfs (&sg, 1);
  647.     clear_end_of_line_raw (first_unused_hpos);
  648.   }
  649.   
  650. ***************
  651. *** 564,660 ****
  652.       }
  653.   }
  654.   
  655. ! write_chars (start, len)
  656. !      register char *start;
  657. !      int len;
  658.   {
  659. !   register char *p;
  660. !   register int n;
  661. !   register char *buf;
  662. !   register int c;
  663. !   char *first_check;
  664. !   if (write_chars_hook)
  665. !     {
  666. !       (*write_chars_hook) (start, len);
  667. !       return;
  668. !     }
  669. !   highlight_if_desired ();
  670. !   turn_off_insert ();
  671. !   /* Don't dare write in last column of bottom line, if AutoWrap,
  672. !      since that would scroll the whole screen on some terminals.  */
  673. !   if (AutoWrap && curY + 1 == screen_height
  674. !       && curX + len - (chars_wasted[curY] & 077) == screen_width)
  675. !     len --;
  676. !   cmplus (len);
  677. !   first_check = start;
  678. !   if (RPov > len && !TF_underscore && !TF_hazeltine)
  679. !     {
  680. !       fwrite (start, 1, len, stdout);
  681. !       if (ferror (stdout))
  682. !     clearerr (stdout);
  683. !       if (termscript)
  684. !     fwrite (start, 1, len, termscript);
  685. !     }
  686. !   else
  687. !     while (--len >= 0)
  688.         {
  689. !     if (RPov + 1 < len && start >= first_check && *start == start[1])
  690. !       {
  691. !         p = start + 2;
  692. !         /* Now, len is number of chars left starting at p */
  693. !         while (*p++ == *start);
  694. !         --p;
  695. !         /* n is number of identical chars in this run */
  696. !         n = p - start;
  697. !         if (n > RPov)
  698. !           {
  699. !         buf = tparam (TS_repeat, 0, 0, *start, n);
  700. !         tputs (buf, n, cmputc);
  701. !         free (buf);
  702. !         start = p;
  703. !         len -= n - 1;
  704. !         continue;
  705. !           }
  706. !         else
  707. !           /* If all N identical chars are too few,
  708. !          don't even consider the last N-1, the last N-2,...  */
  709. !           first_check = p;
  710. !       }
  711. !     c = *start++;
  712. !     if (c == '_' && TF_underscore)
  713. !       {
  714. !         if (termscript)
  715. !           fputc (' ', termscript);
  716. !         putchar (' ');
  717. !         OUTPUT (Left);
  718. !       }
  719. !     if (TF_hazeltine && c == '~')
  720. !       c = '`';
  721. !     if (termscript)
  722. !       fputc (c, termscript);
  723. !     putchar (c);
  724.         }
  725.   }
  726.   
  727. ! /* If start is zero, insert blanks instead of a string at start */
  728.   
  729. - insert_chars (start, len)
  730. -      register char *start;
  731. -      int len;
  732. - {
  733. -   register char *buf;
  734. -   register int c;
  735.   
  736. !   if (insert_chars_hook)
  737.       {
  738. !       (*insert_chars_hook) (start, len);
  739.         return;
  740.       }
  741.     highlight_if_desired ();
  742. --- 562,654 ----
  743.       }
  744.   }
  745.   
  746. ! write_glyfs (start, len)
  747. ! register glyf_t *start;
  748. ! register int len;
  749.   {
  750. ! register glyf_t g;
  751. ! if (write_glyfs_hook)
  752. !    {
  753. !    (*write_glyfs_hook) (start, len);
  754. !    return;
  755. !    }
  756. ! highlight_if_desired ();
  757. ! turn_off_insert ();
  758. ! /* Don't dare write in last column of bottom line, if AutoWrap,
  759. ! since that would scroll the whole screen on some terminals.  */
  760. ! if (AutoWrap && curY + 1 == screen_height
  761. !    && curX + len == screen_width)
  762. !    len--;
  763. ! cmplus (len);
  764. ! while (--len >= 0)
  765. !    {
  766. !    g = *start++;
  767. !    if (g)
  768.         {
  769. !       fwrite (glyf_str (g), 1, glyf_len (g), stdout);
  770. !       if (ferror (stdout)) clearerr (stdout);
  771. !       if (termscript) fwrite (glyf_str (g), 1, glyf_len (g), termscript);
  772.         }
  773. +    }
  774.   }
  775.   
  776. ! insert_glyfs (start, len)
  777. ! register glyf_t *start;
  778. ! register int len;
  779. ! {
  780. ! register glyf_t g;
  781. ! register int l;
  782. ! register unsigned char *cp;
  783. ! register char_t c;
  784. ! highlight_if_desired ();
  785. ! turn_on_insert ();
  786. ! cmplus (len);
  787. ! if (TS_pad_inserted_char == 0 && TS_ins_char == 0)
  788. !    {
  789. !    while (--len >= 0)
  790. !       {
  791. !       g = *start++;
  792. !       if (g)
  793. !          {
  794. !          fwrite (glyf_str (g), 1, glyf_len (g), stdout);
  795. !          if (ferror (stdout)) clearerr (stdout);
  796. !          if (termscript) fwrite (glyf_str (g), 1, glyf_len (g), termscript);
  797. !          }
  798. !       }
  799. !    }
  800. ! else
  801. !    {
  802. !    while (--len >= 0)
  803. !       {
  804. !       g = *start++;
  805. !       if (g)
  806. !          {
  807. !          cp = glyf_str (g);
  808. !          for (l = glyf_len (g); 0 != l; --l)
  809. !             {
  810. !             OUTPUT1_IF (TS_ins_char);
  811. !             c = *cp++;
  812. !             if (termscript) fputc (c, termscript);
  813. !             putchar (c);
  814. !             OUTPUT1_IF (TS_pad_inserted_char);
  815. !             }
  816. !          }
  817. !       }
  818. !    }
  819. ! }
  820.   
  821.   
  822. ! insert_spaces (len)
  823. ! int len;
  824. ! {
  825. !   register char_t *buf;
  826. !   if (insert_glyfs_hook)
  827.       {
  828. !       (*insert_glyfs_hook) ((glyf_t *) 0, len);
  829.         return;
  830.       }
  831.     highlight_if_desired ();
  832. ***************
  833. *** 661,671 ****
  834.   
  835.     if (TS_ins_multi_chars)
  836.       {
  837. !       buf = tparam (TS_ins_multi_chars, 0, 0, len);
  838.         OUTPUT1 (buf);
  839.         free (buf);
  840. -       if (start)
  841. -     write_chars (start, len);
  842.         return;
  843.       }
  844.   
  845. --- 655,663 ----
  846.   
  847.     if (TS_ins_multi_chars)
  848.       {
  849. !       buf = (char_t *) tparam (TS_ins_multi_chars, 0, 0, len);
  850.         OUTPUT1 (buf);
  851.         free (buf);
  852.         return;
  853.       }
  854.   
  855. ***************
  856. *** 672,712 ****
  857.     turn_on_insert ();
  858.     cmplus (len);
  859.   
  860. !   if (!TF_underscore && !TF_hazeltine && start
  861. !       && TS_pad_inserted_char == 0 && TS_ins_char == 0)
  862.       {
  863. !       fwrite (start, 1, len, stdout);
  864.         if (termscript)
  865. !     fwrite (start, 1, len, termscript);
  866.       }
  867. -   else
  868. -     while (--len >= 0)
  869. -       {
  870. -     OUTPUT1_IF (TS_ins_char);
  871. -     if (!start)
  872. -       c = ' ';
  873. -     else
  874. -       {
  875. -         c = *start++;
  876. -         if (TF_hazeltine && c == '~')
  877. -           c = '`';
  878. -       }
  879. -     if (termscript)
  880. -       fputc (c, termscript);
  881. -     putchar (c);
  882. -     OUTPUT1_IF (TS_pad_inserted_char);
  883. -     }
  884.   }
  885.   
  886. ! delete_chars (n)
  887. !      register int n;
  888.   {
  889.     char *buf;
  890.     register int i;
  891.   
  892. !   if (delete_chars_hook)
  893.       {
  894. !       (*delete_chars_hook) (n);
  895.         return;
  896.       }
  897.   
  898. --- 664,688 ----
  899.     turn_on_insert ();
  900.     cmplus (len);
  901.   
  902. !   while (--len >= 0)
  903.       {
  904. !       OUTPUT1_IF (TS_ins_char);
  905.         if (termscript)
  906. !     fputc (' ', termscript);
  907. !       putchar (' ');
  908. !       OUTPUT1_IF (TS_pad_inserted_char);
  909.       }
  910.   }
  911.   
  912. ! delete_glyfs (n)
  913. ! register int n;
  914.   {
  915.     char *buf;
  916.     register int i;
  917.   
  918. !   if (delete_glyfs_hook)
  919.       {
  920. !       (*delete_glyfs_hook) (n);
  921.         return;
  922.       }
  923.   
  924. ***************
  925. *** 854,867 ****
  926.     return cost;
  927.   }
  928.   
  929.   /* ARGSUSED */
  930.   calculate_ins_del_char_costs ()
  931.   {
  932. -   int ins_startup_cost, del_startup_cost;
  933. -   int ins_cost_per_char, del_cost_per_char;
  934. -   register int i;
  935. -   register int *p;
  936.     if (TS_ins_multi_chars)
  937.       {
  938.         ins_cost_per_char = 0;
  939. --- 830,843 ----
  940.     return cost;
  941.   }
  942.   
  943. + static int ins_startup_cost;
  944. + static int del_startup_cost;
  945. + static int ins_cost_per_char;
  946. + static int del_cost_per_char;
  947.   /* ARGSUSED */
  948.   calculate_ins_del_char_costs ()
  949.   {
  950.     if (TS_ins_multi_chars)
  951.       {
  952.         ins_cost_per_char = 0;
  953. ***************
  954. *** 898,916 ****
  955.         del_startup_cost = 9999;
  956.         del_cost_per_char = 0;
  957.       }
  958. !   /* Delete costs are at negative offsets */
  959. !   p = &DCICcost[0];
  960. !   for (i = screen_width; --i >= 0;)
  961. !     *--p = (del_startup_cost += del_cost_per_char);
  962. !   /* Doing nothing is free */
  963. !   p = &DCICcost[0];
  964. !   *p++ = 0;
  965. !   /* Insert costs are at positive offsets */
  966. !   for (i = screen_width; --i >= 0;)
  967. !     *p++ = (ins_startup_cost += ins_cost_per_char);
  968.   }
  969.   
  970.   calculate_costs ()
  971. --- 874,886 ----
  972.         del_startup_cost = 9999;
  973.         del_cost_per_char = 0;
  974.       }
  975. ! }
  976. ! int DCICcost (n)
  977. ! register int n;
  978. ! {
  979. ! if (n > 0) return (ins_startup_cost + n * ins_cost_per_char);
  980. ! else if (n == 0) return (0);
  981. ! else return (del_startup_cost - n * del_cost_per_char);
  982.   }
  983.   
  984.   calculate_costs ()
  985. *** ../18.55/src/termchar.h    Mon Sep 29 23:45:22 1986
  986. --- src/termchar.h    Thu Apr  5 09:16:33 1990
  987. ***************
  988. *** 1,5 ****
  989.   /* Flags and parameters describing terminal's characteristics.
  990. !    Copyright (C) 1985, 1986 Free Software Foundation, Inc.
  991.   
  992.   This file is part of GNU Emacs.
  993.   
  994. --- 1,5 ----
  995.   /* Flags and parameters describing terminal's characteristics.
  996. !    Copyright (C) 1985, 1986, 1990 Free Software Foundation, Inc.
  997.   
  998.   This file is part of GNU Emacs.
  999.   
  1000. ***************
  1001. *** 19,24 ****
  1002. --- 19,28 ----
  1003.   and this notice must be preserved on all copies.  */
  1004.   
  1005.   
  1006. + /* Modified 1990 for 8-bit character support by Howard Gayle.
  1007. +  *  See chartab.c for details. */
  1008.   extern int baud_rate;        /* Output speed in baud */
  1009.   extern int screen_width;    /* Number of usable columns */
  1010.   extern int screen_height;    /* Number of lines */
  1011. ***************
  1012. *** 42,49 ****
  1013.      where one page is used for Emacs and another for all else. */
  1014.   extern int no_redraw_on_reenter;
  1015.   
  1016. ! /* DCICcost[n] is cost of inserting N characters.
  1017. !    DCICcost[-n] is cost of deleting N characters. */
  1018. ! #define DCICcost (&DC_ICcost[MScreenWidth])
  1019. ! extern int DC_ICcost[1 + 2 * MScreenWidth];
  1020. --- 46,51 ----
  1021.      where one page is used for Emacs and another for all else. */
  1022.   extern int no_redraw_on_reenter;
  1023.   
  1024. ! /* DCICcost(n) is cost of inserting N characters.
  1025. !    DCICcost(-n) is cost of deleting N characters. */
  1026. ! int DCICcost ();
  1027. *** ../18.55/src/termhooks.h    Mon Sep 29 23:45:32 1986
  1028. --- src/termhooks.h    Thu Apr  5 09:16:48 1990
  1029. ***************
  1030. *** 1,6 ****
  1031.   /* Hooks by which low level terminal operations
  1032.      can be made to call other routines.
  1033. !    Copyright (C) 1985, 1986 Free Software Foundation, Inc.
  1034.   
  1035.   This file is part of GNU Emacs.
  1036.   
  1037. --- 1,6 ----
  1038.   /* Hooks by which low level terminal operations
  1039.      can be made to call other routines.
  1040. !    Copyright (C) 1985, 1986, 1990 Free Software Foundation, Inc.
  1041.   
  1042.   This file is part of GNU Emacs.
  1043.   
  1044. ***************
  1045. *** 20,25 ****
  1046. --- 20,29 ----
  1047.   and this notice must be preserved on all copies.  */
  1048.   
  1049.   
  1050. + /* Modified 1990 for 8-bit character support by Howard Gayle.
  1051. +  *  See chartab.c for details. */
  1052.   extern int (*topos_hook) ();
  1053.   extern int (*raw_topos_hook) ();
  1054.   
  1055. ***************
  1056. *** 32,40 ****
  1057.   extern int (*change_line_highlight_hook) ();
  1058.   extern int (*reassert_line_highlight_hook) ();
  1059.   
  1060. ! extern int (*insert_chars_hook) ();
  1061. ! extern int (*write_chars_hook) ();
  1062. ! extern int (*delete_chars_hook) ();
  1063.   
  1064.   extern int (*ring_bell_hook) ();
  1065.   
  1066. --- 36,44 ----
  1067.   extern int (*change_line_highlight_hook) ();
  1068.   extern int (*reassert_line_highlight_hook) ();
  1069.   
  1070. ! extern int (*insert_glyfs_hook) ();
  1071. ! extern int (*write_glyfs_hook) ();
  1072. ! extern int (*delete_glyfs_hook) ();
  1073.   
  1074.   extern int (*ring_bell_hook) ();
  1075.   
  1076. *** ../18.55/src/window.c    Fri Jun 10 15:07:24 1988
  1077. --- src/window.c    Thu Apr  5 09:17:01 1990
  1078. ***************
  1079. *** 1,6 ****
  1080.   /* Window creation, deletion and examination for GNU Emacs.
  1081.      Does not include redisplay.
  1082. !    Copyright (C) 1985, 1986, 1987 Free Software Foundation, Inc.
  1083.   
  1084.   This file is part of GNU Emacs.
  1085.   
  1086. --- 1,6 ----
  1087.   /* Window creation, deletion and examination for GNU Emacs.
  1088.      Does not include redisplay.
  1089. !    Copyright (C) 1985, 1986, 1987, 1990 Free Software Foundation, Inc.
  1090.   
  1091.   This file is part of GNU Emacs.
  1092.   
  1093. ***************
  1094. *** 20,28 ****
  1095. --- 20,33 ----
  1096.   and this notice must be preserved on all copies.  */
  1097.   
  1098.   
  1099. + /* Modified 1990 for 8-bit character support by Howard Gayle.
  1100. +  *  See chartab.c for details. */
  1101.   #include "config.h"
  1102.   #include "lisp.h"
  1103.   #include "buffer.h"
  1104. + #include "chartab.h"
  1105.   #include "window.h"
  1106.   #include "commands.h"
  1107.   #include "indent.h"
  1108. ***************
  1109. *** 107,112 ****
  1110. --- 112,121 ----
  1111.     p->start = Fmake_marker ();
  1112.     p->pointm = Fmake_marker ();
  1113.     XFASTINT (p->use_time) = 0;
  1114. +   p->window_char_table =
  1115. +     (XTYPE (buffer_defaults.buffer_char_table) == Lisp_Chartab)
  1116. +       ? buffer_defaults.buffer_char_table
  1117. +       : Vctl_arrow_char_table;
  1118.     return val;
  1119.   }
  1120.   
  1121. ***************
  1122. *** 204,209 ****
  1123. --- 213,243 ----
  1124.     return decode_window (window)->buffer;
  1125.   }
  1126.   
  1127. + DEFUN ("window-char-table", Fwindow_char_table, Swindow_char_table, 0, 1, 0,
  1128. +   "Return the char table that WINDOW is using.")
  1129. +   (window)
  1130. +      Lisp_Object window;
  1131. + {
  1132. +   return decode_window (window)->window_char_table;
  1133. + }
  1134. + DEFUN ("set-window-char-table",
  1135. +    Fset_window_char_table, Sset_window_char_table, 1, 2, 0,
  1136. +    "Use TABLE as the char table in WINDOW (default selected\n\
  1137. + window).  Returns the old char table.")
  1138. + (table, window)
  1139. + register Lisp_Object table, window;
  1140. + {
  1141. + register struct window *w;
  1142. + register Lisp_Object z; /* Return. */
  1143. + table = check_char_table (table);
  1144. + w = decode_window (window);
  1145. + z = w->window_char_table;
  1146. + w->window_char_table = table;
  1147. + return (z);
  1148. + }
  1149.   DEFUN ("window-height", Fwindow_height, Swindow_height, 0, 1, 0,
  1150.     "Return the number of lines in WINDOW (including its mode line).")
  1151.     (window)
  1152. ***************
  1153. *** 835,845 ****
  1154.   {
  1155.     register Lisp_Object tem;
  1156.     register struct window *w = decode_window (window);
  1157.   
  1158.     buffer = Fget_buffer (buffer);
  1159.     CHECK_BUFFER (buffer, 1);
  1160.   
  1161. !   if (NULL (XBUFFER (buffer)->name))
  1162.       error ("Attempt to display deleted buffer");
  1163.   
  1164.     tem = w->buffer;
  1165. --- 869,881 ----
  1166.   {
  1167.     register Lisp_Object tem;
  1168.     register struct window *w = decode_window (window);
  1169. +   register struct buffer *bp;
  1170.   
  1171.     buffer = Fget_buffer (buffer);
  1172.     CHECK_BUFFER (buffer, 1);
  1173. +   bp = XBUFFER (buffer);
  1174.   
  1175. !   if (NULL (bp->name))
  1176.       error ("Attempt to display deleted buffer");
  1177.   
  1178.     tem = w->buffer;
  1179. ***************
  1180. *** 848,860 ****
  1181.   
  1182.     w->buffer = buffer;
  1183.     Fset_marker (w->pointm,
  1184. !            make_number (XBUFFER (buffer) == bf_cur
  1185. !                 ? point : XBUFFER (buffer)->text.pointloc),
  1186.              buffer);
  1187. !   Fset_marker (w->start, make_number (XBUFFER (buffer)->last_window_start),
  1188.              buffer);
  1189.     w->start_at_line_beg = Qnil;
  1190.     XFASTINT (w->last_modified) = 0;
  1191.     windows_or_buffers_changed++;
  1192.     if (EQ (window, selected_window))
  1193.       Fset_buffer (buffer);
  1194. --- 884,902 ----
  1195.   
  1196.     w->buffer = buffer;
  1197.     Fset_marker (w->pointm,
  1198. !            make_number (bp == bf_cur
  1199. !                 ? point : bp->text.pointloc),
  1200.              buffer);
  1201. !   Fset_marker (w->start, make_number (bp->last_window_start),
  1202.              buffer);
  1203.     w->start_at_line_beg = Qnil;
  1204.     XFASTINT (w->last_modified) = 0;
  1205. +   if (XTYPE (bp->buffer_char_table) == Lisp_Chartab)
  1206. +      w->window_char_table = bp->buffer_char_table;
  1207. +   else if (XTYPE (buffer_defaults.buffer_char_table) == Lisp_Chartab)
  1208. +      w->window_char_table = buffer_defaults.buffer_char_table;
  1209. +   else
  1210. +      w->window_char_table = Vctl_arrow_char_table;
  1211.     windows_or_buffers_changed++;
  1212.     if (EQ (window, selected_window))
  1213.       Fset_buffer (buffer);
  1214. ***************
  1215. *** 1593,1600 ****
  1216.       Lisp_Object left, top, width, height, hscroll;
  1217.       Lisp_Object parent, prev;
  1218.       Lisp_Object start_at_line_beg;
  1219.     };
  1220. ! #define SAVED_WINDOW_VECTOR_SIZE 13 /* Arg to Fmake_vector */
  1221.   
  1222.   #define SAVED_WINDOW_N(swv,n) \
  1223.     ((struct saved_window *) (XVECTOR ((swv)->contents[(n)])))
  1224. --- 1635,1643 ----
  1225.       Lisp_Object left, top, width, height, hscroll;
  1226.       Lisp_Object parent, prev;
  1227.       Lisp_Object start_at_line_beg;
  1228. +     Lisp_Object saved_char_table;
  1229.     };
  1230. ! #define SAVED_WINDOW_VECTOR_SIZE 14 /* Arg to Fmake_vector */
  1231.   
  1232.   #define SAVED_WINDOW_N(swv,n) \
  1233.     ((struct saved_window *) (XVECTOR ((swv)->contents[(n)])))
  1234. ***************
  1235. *** 1684,1689 ****
  1236. --- 1727,1733 ----
  1237.         w->height = p->height;
  1238.         w->hscroll = p->hscroll;
  1239.         XFASTINT (w->last_modified) = 0;
  1240. +       w->window_char_table = p->saved_char_table;
  1241.   
  1242.         /* Reinstall the saved buffer and pointers into it.  */
  1243.         if (NULL (p->buffer))
  1244. ***************
  1245. *** 1846,1851 ****
  1246. --- 1890,1897 ----
  1247.         else
  1248.       p->parent = XWINDOW (w->parent)->temslot;
  1249.   
  1250. +       p->saved_char_table = w->window_char_table;
  1251.         if (NULL (w->prev))
  1252.       p->prev = Qnil;
  1253.         else
  1254. ***************
  1255. *** 1950,1955 ****
  1256. --- 1996,2003 ----
  1257.     defsubr (&Swindowp);
  1258.     defsubr (&Spos_visible_in_window_p);
  1259.     defsubr (&Swindow_buffer);
  1260. +   defsubr (&Swindow_char_table);
  1261. +   defsubr (&Sset_window_char_table);
  1262.     defsubr (&Swindow_height);
  1263.     defsubr (&Swindow_width);
  1264.     defsubr (&Swindow_hscroll);
  1265. *** ../18.55/src/window.h    Thu Feb 19 21:47:01 1987
  1266. --- src/window.h    Thu Apr  5 09:17:13 1990
  1267. ***************
  1268. *** 1,5 ****
  1269.   /* Window definitions for GNU Emacs.
  1270. !    Copyright (C) 1985, 1986 Free Software Foundation, Inc.
  1271.   
  1272.   This file is part of GNU Emacs.
  1273.   
  1274. --- 1,5 ----
  1275.   /* Window definitions for GNU Emacs.
  1276. !    Copyright (C) 1985, 1986, 1990 Free Software Foundation, Inc.
  1277.   
  1278.   This file is part of GNU Emacs.
  1279.   
  1280. ***************
  1281. *** 19,24 ****
  1282. --- 19,28 ----
  1283.   and this notice must be preserved on all copies.  */
  1284.   
  1285.   
  1286. + /* Modified 1990 for 8-bit character support by Howard Gayle.
  1287. +  *  See chartab.c for details. */
  1288.   /* Windows are allocated as if they were vectors, but then the
  1289.   Lisp data type is changed to Lisp_Window.  They are garbage
  1290.   collected along with the vectors.
  1291. ***************
  1292. *** 118,123 ****
  1293. --- 122,129 ----
  1294.       Lisp_Object last_modified;
  1295.       /* Value of point at that time */
  1296.       Lisp_Object last_point;
  1297. +     /* The char table to use for display. */
  1298. +     Lisp_Object window_char_table;
  1299.   /* The rest are currently not used or only half used */
  1300.       /* Screen coords of point at that time */
  1301.       Lisp_Object last_point_x;
  1302.