home *** CD-ROM | disk | FTP | other *** search
- From: howard@hasse.ericsson.se (Howard Gayle)
- Newsgroups: alt.sources
- Subject: GNU Emacs 8-bit mods part 08 of 12
- Message-ID: <1990Apr5.134005.9052@ericsson.se>
- Date: 5 Apr 90 13:40:05 GMT
-
- *** ../18.55/src/search.c Thu Aug 3 08:05:06 1989
- --- src/search.c Thu Apr 5 09:16:19 1990
- ***************
- *** 1,5 ****
- /* String search routines for GNU Emacs.
- ! Copyright (C) 1985, 1986, 1987 Free Software Foundation, Inc.
-
- This file is part of GNU Emacs.
-
- --- 1,5 ----
- /* String search routines for GNU Emacs.
- ! Copyright (C) 1985, 1986, 1987, 1990 Free Software Foundation, Inc.
-
- This file is part of GNU Emacs.
-
- ***************
- *** 19,60 ****
- and this notice must be preserved on all copies. */
-
-
- #include "config.h"
- #include "lisp.h"
- #include "syntax.h"
- #include "buffer.h"
- #include "commands.h"
- #include "regex.h"
-
- #define max(a, b) ((a) > (b) ? (a) : (b))
- #define min(a, b) ((a) < (b) ? (a) : (b))
-
- - unsigned char downcase_table[01000] = {0}; /* folds upper to lower case */
- - /* A WHEEL WILL FALL OFF IF, IN A trt, CHARACTER A */
- - /* TRANSLATES INTO CHARACTER B AND CHARACTER B DOES NOT */
- - /* ALSO TRANSLATE INTO CHARACTER B. */
- - /* If that constraint is met, compute_trt_inverse will follow a */
- - /* translation table with its inverse. The inverse of a table */
- - /* follows the table at table[0400]. The form of this is that if */
- - /* table[a]=b then the chain starting at table[0400+b], linked by */
- - /* link(x)=table[0400+x] and ended by b must include a. */
- -
- - /* At present compute_trt_inverse is blinded and the inverse for this */
- - /* particular table is created by a single-purpose loop. */
- - /* compute_trt_inverse has been tested on the following cases: */
- - /* trt[x]=x, trt[x]=(+ 3 (logand x, 0370)), trt[x]='a', and the */
- - /* downcase table. */
- -
- /* We compile regexps into this buffer and then use it for searching. */
-
- struct re_pattern_buffer searchbuf;
-
- ! char search_fastmap[0400];
-
- /* Last regexp we compiled */
- -
- Lisp_Object last_regexp;
-
- /* Every call to re_match, etc., must pass &search_regs as the regs argument
- unless you can show it is unnecessary (i.e., if re_match is certainly going
- to be called again before region-around-match can be called). */
- --- 19,51 ----
- and this notice must be preserved on all copies. */
-
-
- + /* Modified 1990 for 8-bit character support by Howard Gayle.
- + * See chartab.c for details. */
- +
- +
- #include "config.h"
- #include "lisp.h"
- #include "syntax.h"
- #include "buffer.h"
- + #include "casetab.h"
- + #include "chartab.h"
- #include "commands.h"
- #include "regex.h"
- + #include "sorttab.h"
-
- #define max(a, b) ((a) > (b) ? (a) : (b))
- #define min(a, b) ((a) < (b) ? (a) : (b))
-
- /* We compile regexps into this buffer and then use it for searching. */
-
- struct re_pattern_buffer searchbuf;
-
- ! char_t search_fastmap[0400];
-
- /* Last regexp we compiled */
- Lisp_Object last_regexp;
-
- +
- /* Every call to re_match, etc., must pass &search_regs as the regs argument
- unless you can show it is unnecessary (i.e., if re_match is certainly going
- to be called again before region-around-match can be called). */
- ***************
- *** 67,88 ****
-
- /* Compile a regexp and signal a Lisp error if anything goes wrong. */
-
- ! compile_pattern (pattern, bufp, translate)
- Lisp_Object pattern;
- struct re_pattern_buffer *bufp;
- ! char *translate;
- {
- char *val;
- Lisp_Object dummy;
-
- if (EQ (pattern, last_regexp)
- ! && translate == bufp->translate)
- return;
- last_regexp = Qnil;
- ! bufp->translate = translate;
- ! val = re_compile_pattern (XSTRING (pattern)->data,
- ! XSTRING (pattern)->size,
- ! bufp);
- if (val)
- {
- dummy = build_string (val);
- --- 58,81 ----
-
- /* Compile a regexp and signal a Lisp error if anything goes wrong. */
-
- ! compile_pattern (pattern, bufp, sorttab)
- Lisp_Object pattern;
- struct re_pattern_buffer *bufp;
- ! struct Lisp_Sorttab *sorttab;
- {
- char *val;
- Lisp_Object dummy;
-
- + /* Sort table used for last regexp compilation: */
- + static struct Lisp_Sorttab *last_sort_table;
- +
- if (EQ (pattern, last_regexp)
- ! && (sorttab == last_sort_table))
- return;
- last_regexp = Qnil;
- ! val = re_compile_pattern_sort (XSTRING (pattern)->data,
- ! XSTRING (pattern)->size,
- ! bufp, sorttab);
- if (val)
- {
- dummy = build_string (val);
- ***************
- *** 90,95 ****
- --- 83,89 ----
- Fsignal (Qinvalid_regexp, Fcons (dummy, Qnil));
- }
- last_regexp = pattern;
- + last_sort_table = sorttab;
- return;
- }
-
- ***************
- *** 115,122 ****
- register int i;
-
- CHECK_STRING (string, 0);
- ! compile_pattern (string, &searchbuf,
- ! !NULL (bf_cur->case_fold_search) ? (char *) downcase_table : 0);
-
- immediate_quit = 1;
- QUIT; /* Do a pending quit right away, to avoid paradoxical behavior */
- --- 109,115 ----
- register int i;
-
- CHECK_STRING (string, 0);
- ! compile_pattern (string, &searchbuf, current_sort_table ());
-
- immediate_quit = 1;
- QUIT; /* Do a pending quit right away, to avoid paradoxical behavior */
- ***************
- *** 183,190 ****
- args_out_of_range (string, start);
- }
-
- ! compile_pattern (regexp, &searchbuf,
- ! !NULL (bf_cur->case_fold_search) ? (char *) downcase_table : 0);
- immediate_quit = 1;
- val = re_search (&searchbuf, XSTRING (string)->data, XSTRING (string)->size,
- s, XSTRING (string)->size - s, &search_regs);
- --- 176,182 ----
- args_out_of_range (string, start);
- }
-
- ! compile_pattern (regexp, &searchbuf, current_sort_table ());
- immediate_quit = 1;
- val = re_search (&searchbuf, XSTRING (string)->data, XSTRING (string)->size,
- s, XSTRING (string)->size - s, &search_regs);
- ***************
- *** 273,279 ****
- find_next_newline (from, cnt)
- register int from, cnt;
- {
- ! return (scan_buffer ('\n', from, cnt, (int *) 0));
- }
-
- DEFUN ("skip-chars-forward", Fskip_chars_forward, Sskip_chars_forward, 1, 2, 0,
- --- 265,271 ----
- find_next_newline (from, cnt)
- register int from, cnt;
- {
- ! return (scan_buffer (NEWLINE, from, cnt, (int *) 0));
- }
-
- DEFUN ("skip-chars-forward", Fskip_chars_forward, Sskip_chars_forward, 1, 2, 0,
- ***************
- *** 403,410 ****
- lim = FirstCharacter;
- }
-
- ! np = search_buffer (string, point, lim, n, RE,
- ! !NULL (bf_cur->case_fold_search) ? downcase_table : 0);
- if (np <= 0)
- {
- if (NULL (noerror))
- --- 395,401 ----
- lim = FirstCharacter;
- }
-
- ! np = search_buffer (string, point, lim, n, RE);
- if (np <= 0)
- {
- if (NULL (noerror))
- ***************
- *** 441,454 ****
- /* INTERFACE CHANGE ALERT!!!! search_buffer now returns -x if only */
- /* n-x occurences are found. */
-
- ! search_buffer (string, pos, lim, n, RE, trt)
- Lisp_Object string;
- int pos;
- int lim;
- int n;
- int RE;
- - register unsigned char *trt;
- {
- int len = XSTRING (string)->size;
- unsigned char *base_pat = XSTRING (string)->data;
- register int *BM_tab;
- --- 432,446 ----
- /* INTERFACE CHANGE ALERT!!!! search_buffer now returns -x if only */
- /* n-x occurences are found. */
-
- ! search_buffer (string, pos, lim, n, RE)
- Lisp_Object string;
- int pos;
- int lim;
- int n;
- int RE;
- {
- + struct Lisp_Sorttab *sorttab;
- + register char_t *trt; /* Equivalence class table. */
- int len = XSTRING (string)->size;
- unsigned char *base_pat = XSTRING (string)->data;
- register int *BM_tab;
- ***************
- *** 465,472 ****
- if (!len)
- return (0);
-
- if (RE)
- ! compile_pattern (string, &searchbuf, (char *) trt);
-
- if (RE /* Here we detect whether the */
- /* generality of an RE search is */
- --- 457,466 ----
- if (!len)
- return (0);
-
- + sorttab = current_sort_table ();
- + trt = current_equiv_class_table ();
- if (RE)
- ! compile_pattern (string, &searchbuf, sorttab);
-
- if (RE /* Here we detect whether the */
- /* generality of an RE search is */
- ***************
- *** 476,482 ****
- {
- RE = 0; /* can do straight (non RE) search */
- pat = (base_pat = (unsigned char *) searchbuf.buffer + 2);
- ! /* trt already applied */
- len = searchbuf.used - 2;
- }
- else if (!RE)
- --- 470,476 ----
- {
- RE = 0; /* can do straight (non RE) search */
- pat = (base_pat = (unsigned char *) searchbuf.buffer + 2);
- ! /* sorttab already applied */
- len = searchbuf.used - 2;
- }
- else if (!RE)
- ***************
- *** 483,490 ****
- {
- pat = (unsigned char *) alloca (len);
-
- ! for (i = len; i--;) /* Copy the pattern; apply trt */
- ! *pat++ = (((int) trt) ? trt [*base_pat++] : *base_pat++);
- pat -= len; base_pat = pat;
- }
-
- --- 477,484 ----
- {
- pat = (unsigned char *) alloca (len);
-
- ! for (i = len; i--;) /* Copy the pattern; apply sorttab */
- ! *pat++ = (trt ? trt[*base_pat++] : *base_pat++);
- pat -= len; base_pat = pat;
- }
-
- ***************
- *** 596,602 ****
- /* is determined only by the last character of the putative match. */
- /* If that character does not match, we will stride the proper */
- /* distance to propose a match that superimposes it on the last */
- ! /* instance of a character that matches it (per trt), or misses */
- /* it entirely if there is none. */
-
- dirlen = len * direction;
- --- 590,596 ----
- /* is determined only by the last character of the putative match. */
- /* If that character does not match, we will stride the proper */
- /* distance to propose a match that superimposes it on the last */
- ! /* instance of a character that matches it (per sorttab), or misses */
- /* it entirely if there is none. */
-
- dirlen = len * direction;
- ***************
- *** 620,642 ****
- {
- j = pat[i]; i += direction;
- if (i == dirlen) i = infinity;
- ! if ((int) trt)
- {
- - k = (j = trt[j]);
- if (i == infinity)
- stride_for_teases = BM_tab[j];
- BM_tab[j] = dirlen - i;
- - /* A translation table is followed by its inverse -- see */
- - /* comment following downcase_table for details */
- -
- - while ((j = trt[0400+j]) != k)
- - BM_tab[j] = dirlen - i;
- }
- else
- {
- if (i == infinity)
- ! stride_for_teases = BM_tab[j];
- ! BM_tab[j] = dirlen - i;
- }
- /* stride_for_teases tells how much to stride if we get a */
- /* match on the far character but are subsequently */
- --- 614,635 ----
- {
- j = pat[i]; i += direction;
- if (i == dirlen) i = infinity;
- ! if (sorttab == NULL_SORT_TABLE)
- {
- if (i == infinity)
- stride_for_teases = BM_tab[j];
- BM_tab[j] = dirlen - i;
- }
- else
- {
- + /* We now want to set BM_tab[x] = dirlen - 1 for
- + all characters x in equivalence class j. */
- + k = sorttab->srt_dope[j].ec_lo;
- if (i == infinity)
- ! stride_for_teases = BM_tab[sorttab->srt_chars[k]];
- ! do
- ! BM_tab[sorttab->srt_chars[k++]] = dirlen - i;
- ! while (k <= sorttab->srt_dope[j].ec_hi);
- }
- /* stride_for_teases tells how much to stride if we get a */
- /* match on the far character but are subsequently */
- ***************
- *** 706,712 ****
- break; /* a small overrun is genuine */
- cursor -= infinity; /* large overrun = hit */
- i = dirlen - direction;
- ! if ((int) trt)
- {
- while ((i -= direction) + direction != 0)
- if (pat[i] != trt[*(cursor -= direction)])
- --- 699,705 ----
- break; /* a small overrun is genuine */
- cursor -= infinity; /* large overrun = hit */
- i = dirlen - direction;
- ! if (trt)
- {
- while ((i -= direction) + direction != 0)
- if (pat[i] != trt[*(cursor -= direction)])
- ***************
- *** 768,776 ****
- while ((i -= direction) + direction != 0)
- {
- pos -= direction;
- ! if (pat[i] != (((int) trt)
- ! ? trt[CharAt(pos)]
- ! : CharAt (pos)))
- break;
- }
- /* Above loop has moved POS part or all the way
- --- 761,767 ----
- while ((i -= direction) + direction != 0)
- {
- pos -= direction;
- ! if (pat[i] != (trt ? trt[CharAt(pos)] : CharAt (pos)))
- break;
- }
- /* Above loop has moved POS part or all the way
- ***************
- *** 977,983 ****
- /* Decide how to casify by examining the matched text. */
-
- last = search_regs.end[0];
- ! prevc = '\n';
- case_action = all_caps;
-
- /* some_multiletter_word is set nonzero if any original word
- --- 968,974 ----
- /* Decide how to casify by examining the matched text. */
-
- last = search_regs.end[0];
- ! prevc = NEWLINE;
- case_action = all_caps;
-
- /* some_multiletter_word is set nonzero if any original word
- ***************
- *** 987,1014 ****
- for (pos = search_regs.start[0]; pos < last; pos++)
- {
- c = CharAt (pos);
- ! if (LOWERCASEP (c))
- ! {
- ! /* Cannot be all caps if any original char is lower case */
- !
- ! case_action = cap_initial;
- ! if (SYNTAX (prevc) != Sword)
- ! {
- ! /* Cannot even be cap initials
- ! if some original initial is lower case */
- ! case_action = nochange;
- ! break;
- ! }
- ! else
- ! some_multiletter_word = 1;
- ! }
- ! else if (!NOCASEP (c))
- {
- ! some_letter = 1;
- ! if (!some_multiletter_word && SYNTAX (prevc) == Sword)
- ! some_multiletter_word = 1;
- }
- -
- prevc = c;
- }
-
- --- 978,1004 ----
- for (pos = search_regs.start[0]; pos < last; pos++)
- {
- c = CharAt (pos);
- ! switch (LOCAL_CASE (c))
- {
- ! case lowercase_e:
- ! /* Cannot be all caps if any original char is lower case */
- ! case_action = cap_initial;
- ! if (SYNTAX (prevc) != Sword)
- ! {
- ! /* Cannot even be cap initials
- ! if some original initial is lower case */
- ! case_action = nochange;
- ! break;
- ! }
- ! else
- ! some_multiletter_word = 1;
- ! break;
- ! case uppercase_e:
- ! some_letter = 1;
- ! if (!some_multiletter_word && SYNTAX (prevc) == Sword)
- ! some_multiletter_word = 1;
- ! break;
- }
- prevc = c;
- }
-
- ***************
- *** 1216,1268 ****
- }
- return ostr;
- }
- !
- ! /* This code should be unzapped when there comes to be multiple */
- ! /* translation tables. It has been certified on various cases. */
- ! /*
- ! void
- ! compute_trt_inverse (trt)
- ! register unsigned char *trt;
- ! {
- ! register int i = 0400;
- ! register unsigned char c, q;
- !
- ! while (i--)
- ! trt[0400+i] = i;
- ! i = 0400;
- ! while (i--)
- ! {
- ! if ((q = trt[i]) != (unsigned char) i)
- ! {
- ! c = trt[q + 0400];
- ! trt[q + 0400] = i;
- ! trt[0400 + i] = c;
- ! }
- ! }
- }
- - */
-
- syms_of_search ()
- {
- - register int i;
- -
- - for (i = 0; i < 0400; i++)
- - {
- - downcase_table[i] = (i >= 'A' && i <= 'Z') ? i + 040 : i;
- - /* We do this instead of using compute_trt_inverse to save space. */
- - /* Does it? */
- - downcase_table[0400+i]
- - = ((i >= 'A' && i <= 'Z')
- - ? i + ('a' - 'A')
- - : ((i >= 'a' && i <= 'z')
- - ? i + ('A' - 'a')
- - : i));
- - }
- - /* Use this instead when there come to be multiple translation tables.
- - compute_trt_inverse (downcase_table); */
- -
- searchbuf.allocated = 100;
- ! searchbuf.buffer = (char *) malloc (searchbuf.allocated);
- searchbuf.fastmap = search_fastmap;
-
- Qsearch_failed = intern ("search-failed");
- --- 1206,1228 ----
- }
- return ostr;
- }
- !
- ! DEFUN ("compile-regexp", Fcompile_regexp, Scompile_regexp, 1, 1, 0,
- ! "Compile regular expression.")
- ! (re)
- ! Lisp_Object re;
- ! {
- ! CHECK_STRING (re, 0);
- ! compile_pattern (re, &searchbuf, current_sort_table ());
- ! re_compile_fastmap (&searchbuf);
- ! return (Fcons (make_string (searchbuf.buffer, searchbuf.used),
- ! make_string (search_fastmap, 256)));
- }
-
- syms_of_search ()
- {
- searchbuf.allocated = 100;
- ! searchbuf.buffer = (char_t *) malloc (searchbuf.allocated);
- searchbuf.fastmap = search_fastmap;
-
- Qsearch_failed = intern ("search-failed");
- ***************
- *** 1299,1302 ****
- --- 1259,1263 ----
- defsubr (&Smatch_data);
- defsubr (&Sstore_match_data);
- defsubr (&Sregexp_quote);
- + defsubr (&Scompile_regexp);
- }
- *** ../18.55/src/term.c Wed Mar 29 17:49:32 1989
- --- src/term.c Wed Mar 7 09:53:29 1990
- ***************
- *** 1,5 ****
- /* terminal control module for terminals described by TERMCAP
- ! Copyright (C) 1985, 1986, 1987 Free Software Foundation, Inc.
-
- This file is part of GNU Emacs.
-
- --- 1,5 ----
- /* terminal control module for terminals described by TERMCAP
- ! Copyright (C) 1985, 1986, 1987, 1990 Free Software Foundation, Inc.
-
- This file is part of GNU Emacs.
-
- ***************
- *** 20,27 ****
- --- 20,30 ----
-
-
- #include <stdio.h>
- + #undef NULL
- #include <ctype.h>
- #include "config.h"
- + #include "lisp.h"
- + #include "chartab.h"
- #include "termhooks.h"
- #include "termchar.h"
- #include "termopts.h"
- ***************
- *** 60,72 ****
- where one page is used for Emacs and another for all else. */
- int no_redraw_on_reenter;
-
- - /* DCICcost[n] is cost of inserting N characters.
- - DCICcost[-n] is cost of deleting N characters. */
- -
- - #define DCICcost (&DC_ICcost[MScreenWidth])
- - int DC_ICcost[1 + 2 * MScreenWidth];
- -
- -
- /* Hook functions that you can set to snap out the functions in this file.
- These are all extern'd in termhooks.h */
-
- --- 63,68 ----
- ***************
- *** 82,90 ****
- int (*change_line_highlight_hook) ();
- int (*reassert_line_highlight_hook) ();
-
- ! int (*insert_chars_hook) ();
- ! int (*write_chars_hook) ();
- ! int (*delete_chars_hook) ();
-
- int (*ring_bell_hook) ();
-
- --- 78,86 ----
- int (*change_line_highlight_hook) ();
- int (*reassert_line_highlight_hook) ();
-
- ! int (*insert_glyfs_hook) ();
- ! int (*write_glyfs_hook) ();
- ! int (*delete_glyfs_hook) ();
-
- int (*ring_bell_hook) ();
-
- ***************
- *** 520,527 ****
- clear_end_of_line (first_unused_hpos)
- int first_unused_hpos;
- {
- if (TN_standout_width == 0 && curX == 0 && chars_wasted[curY] != 0)
- ! write_chars (" ", 1);
- clear_end_of_line_raw (first_unused_hpos);
- }
-
- --- 516,525 ----
- clear_end_of_line (first_unused_hpos)
- int first_unused_hpos;
- {
- + static glyf_t sg = SPACEGLYF;
- +
- if (TN_standout_width == 0 && curX == 0 && chars_wasted[curY] != 0)
- ! write_glyfs (&sg, 1);
- clear_end_of_line_raw (first_unused_hpos);
- }
-
- ***************
- *** 564,660 ****
- }
- }
-
- ! write_chars (start, len)
- ! register char *start;
- ! int len;
- {
- ! register char *p;
- ! register int n;
- ! register char *buf;
- ! register int c;
- ! char *first_check;
- !
- ! if (write_chars_hook)
- ! {
- ! (*write_chars_hook) (start, len);
- ! return;
- ! }
- ! highlight_if_desired ();
- ! turn_off_insert ();
- !
- ! /* Don't dare write in last column of bottom line, if AutoWrap,
- ! since that would scroll the whole screen on some terminals. */
- !
- ! if (AutoWrap && curY + 1 == screen_height
- ! && curX + len - (chars_wasted[curY] & 077) == screen_width)
- ! len --;
- !
- ! cmplus (len);
- !
- ! first_check = start;
- !
- ! if (RPov > len && !TF_underscore && !TF_hazeltine)
- ! {
- ! fwrite (start, 1, len, stdout);
- ! if (ferror (stdout))
- ! clearerr (stdout);
- ! if (termscript)
- ! fwrite (start, 1, len, termscript);
- ! }
- ! else
- ! while (--len >= 0)
- {
- ! if (RPov + 1 < len && start >= first_check && *start == start[1])
- ! {
- ! p = start + 2;
- !
- ! /* Now, len is number of chars left starting at p */
- ! while (*p++ == *start);
- ! --p;
- ! /* n is number of identical chars in this run */
- ! n = p - start;
- ! if (n > RPov)
- ! {
- ! buf = tparam (TS_repeat, 0, 0, *start, n);
- ! tputs (buf, n, cmputc);
- ! free (buf);
- ! start = p;
- ! len -= n - 1;
- ! continue;
- ! }
- ! else
- ! /* If all N identical chars are too few,
- ! don't even consider the last N-1, the last N-2,... */
- ! first_check = p;
- ! }
- ! c = *start++;
- ! if (c == '_' && TF_underscore)
- ! {
- ! if (termscript)
- ! fputc (' ', termscript);
- ! putchar (' ');
- ! OUTPUT (Left);
- ! }
- ! if (TF_hazeltine && c == '~')
- ! c = '`';
- ! if (termscript)
- ! fputc (c, termscript);
- ! putchar (c);
- }
- }
-
- ! /* If start is zero, insert blanks instead of a string at start */
-
- - insert_chars (start, len)
- - register char *start;
- - int len;
- - {
- - register char *buf;
- - register int c;
-
- ! if (insert_chars_hook)
- {
- ! (*insert_chars_hook) (start, len);
- return;
- }
- highlight_if_desired ();
- --- 562,654 ----
- }
- }
-
- ! write_glyfs (start, len)
- ! register glyf_t *start;
- ! register int len;
- {
- ! register glyf_t g;
- !
- ! if (write_glyfs_hook)
- ! {
- ! (*write_glyfs_hook) (start, len);
- ! return;
- ! }
- ! highlight_if_desired ();
- ! turn_off_insert ();
- !
- ! /* Don't dare write in last column of bottom line, if AutoWrap,
- ! since that would scroll the whole screen on some terminals. */
- ! if (AutoWrap && curY + 1 == screen_height
- ! && curX + len == screen_width)
- ! len--;
- ! cmplus (len);
- ! while (--len >= 0)
- ! {
- ! g = *start++;
- ! if (g)
- {
- ! fwrite (glyf_str (g), 1, glyf_len (g), stdout);
- ! if (ferror (stdout)) clearerr (stdout);
- ! if (termscript) fwrite (glyf_str (g), 1, glyf_len (g), termscript);
- }
- + }
- }
-
- ! insert_glyfs (start, len)
- ! register glyf_t *start;
- ! register int len;
- ! {
- ! register glyf_t g;
- ! register int l;
- ! register unsigned char *cp;
- ! register char_t c;
- !
- ! highlight_if_desired ();
- ! turn_on_insert ();
- ! cmplus (len);
- ! if (TS_pad_inserted_char == 0 && TS_ins_char == 0)
- ! {
- ! while (--len >= 0)
- ! {
- ! g = *start++;
- ! if (g)
- ! {
- ! fwrite (glyf_str (g), 1, glyf_len (g), stdout);
- ! if (ferror (stdout)) clearerr (stdout);
- ! if (termscript) fwrite (glyf_str (g), 1, glyf_len (g), termscript);
- ! }
- ! }
- ! }
- ! else
- ! {
- ! while (--len >= 0)
- ! {
- ! g = *start++;
- ! if (g)
- ! {
- ! cp = glyf_str (g);
- ! for (l = glyf_len (g); 0 != l; --l)
- ! {
- ! OUTPUT1_IF (TS_ins_char);
- ! c = *cp++;
- ! if (termscript) fputc (c, termscript);
- ! putchar (c);
- ! OUTPUT1_IF (TS_pad_inserted_char);
- ! }
- ! }
- ! }
- ! }
- ! }
-
-
- ! insert_spaces (len)
- ! int len;
- ! {
- ! register char_t *buf;
- !
- ! if (insert_glyfs_hook)
- {
- ! (*insert_glyfs_hook) ((glyf_t *) 0, len);
- return;
- }
- highlight_if_desired ();
- ***************
- *** 661,671 ****
-
- if (TS_ins_multi_chars)
- {
- ! buf = tparam (TS_ins_multi_chars, 0, 0, len);
- OUTPUT1 (buf);
- free (buf);
- - if (start)
- - write_chars (start, len);
- return;
- }
-
- --- 655,663 ----
-
- if (TS_ins_multi_chars)
- {
- ! buf = (char_t *) tparam (TS_ins_multi_chars, 0, 0, len);
- OUTPUT1 (buf);
- free (buf);
- return;
- }
-
- ***************
- *** 672,712 ****
- turn_on_insert ();
- cmplus (len);
-
- ! if (!TF_underscore && !TF_hazeltine && start
- ! && TS_pad_inserted_char == 0 && TS_ins_char == 0)
- {
- ! fwrite (start, 1, len, stdout);
- if (termscript)
- ! fwrite (start, 1, len, termscript);
- }
- - else
- - while (--len >= 0)
- - {
- - OUTPUT1_IF (TS_ins_char);
- - if (!start)
- - c = ' ';
- - else
- - {
- - c = *start++;
- - if (TF_hazeltine && c == '~')
- - c = '`';
- - }
- - if (termscript)
- - fputc (c, termscript);
- - putchar (c);
- - OUTPUT1_IF (TS_pad_inserted_char);
- - }
- }
-
- ! delete_chars (n)
- ! register int n;
- {
- char *buf;
- register int i;
-
- ! if (delete_chars_hook)
- {
- ! (*delete_chars_hook) (n);
- return;
- }
-
- --- 664,688 ----
- turn_on_insert ();
- cmplus (len);
-
- ! while (--len >= 0)
- {
- ! OUTPUT1_IF (TS_ins_char);
- if (termscript)
- ! fputc (' ', termscript);
- ! putchar (' ');
- ! OUTPUT1_IF (TS_pad_inserted_char);
- }
- }
-
- ! delete_glyfs (n)
- ! register int n;
- {
- char *buf;
- register int i;
-
- ! if (delete_glyfs_hook)
- {
- ! (*delete_glyfs_hook) (n);
- return;
- }
-
- ***************
- *** 854,867 ****
- return cost;
- }
-
- /* ARGSUSED */
- calculate_ins_del_char_costs ()
- {
- - int ins_startup_cost, del_startup_cost;
- - int ins_cost_per_char, del_cost_per_char;
- - register int i;
- - register int *p;
- -
- if (TS_ins_multi_chars)
- {
- ins_cost_per_char = 0;
- --- 830,843 ----
- return cost;
- }
-
- + static int ins_startup_cost;
- + static int del_startup_cost;
- + static int ins_cost_per_char;
- + static int del_cost_per_char;
- +
- /* ARGSUSED */
- calculate_ins_del_char_costs ()
- {
- if (TS_ins_multi_chars)
- {
- ins_cost_per_char = 0;
- ***************
- *** 898,916 ****
- del_startup_cost = 9999;
- del_cost_per_char = 0;
- }
- !
- ! /* Delete costs are at negative offsets */
- ! p = &DCICcost[0];
- ! for (i = screen_width; --i >= 0;)
- ! *--p = (del_startup_cost += del_cost_per_char);
- !
- ! /* Doing nothing is free */
- ! p = &DCICcost[0];
- ! *p++ = 0;
- !
- ! /* Insert costs are at positive offsets */
- ! for (i = screen_width; --i >= 0;)
- ! *p++ = (ins_startup_cost += ins_cost_per_char);
- }
-
- calculate_costs ()
- --- 874,886 ----
- del_startup_cost = 9999;
- del_cost_per_char = 0;
- }
- ! }
- ! int DCICcost (n)
- ! register int n;
- ! {
- ! if (n > 0) return (ins_startup_cost + n * ins_cost_per_char);
- ! else if (n == 0) return (0);
- ! else return (del_startup_cost - n * del_cost_per_char);
- }
-
- calculate_costs ()
- *** ../18.55/src/termchar.h Mon Sep 29 23:45:22 1986
- --- src/termchar.h Thu Apr 5 09:16:33 1990
- ***************
- *** 1,5 ****
- /* Flags and parameters describing terminal's characteristics.
- ! Copyright (C) 1985, 1986 Free Software Foundation, Inc.
-
- This file is part of GNU Emacs.
-
- --- 1,5 ----
- /* Flags and parameters describing terminal's characteristics.
- ! Copyright (C) 1985, 1986, 1990 Free Software Foundation, Inc.
-
- This file is part of GNU Emacs.
-
- ***************
- *** 19,24 ****
- --- 19,28 ----
- and this notice must be preserved on all copies. */
-
-
- + /* Modified 1990 for 8-bit character support by Howard Gayle.
- + * See chartab.c for details. */
- +
- +
- extern int baud_rate; /* Output speed in baud */
- extern int screen_width; /* Number of usable columns */
- extern int screen_height; /* Number of lines */
- ***************
- *** 42,49 ****
- where one page is used for Emacs and another for all else. */
- extern int no_redraw_on_reenter;
-
- ! /* DCICcost[n] is cost of inserting N characters.
- ! DCICcost[-n] is cost of deleting N characters. */
- !
- ! #define DCICcost (&DC_ICcost[MScreenWidth])
- ! extern int DC_ICcost[1 + 2 * MScreenWidth];
- --- 46,51 ----
- where one page is used for Emacs and another for all else. */
- extern int no_redraw_on_reenter;
-
- ! /* DCICcost(n) is cost of inserting N characters.
- ! DCICcost(-n) is cost of deleting N characters. */
- ! int DCICcost ();
- *** ../18.55/src/termhooks.h Mon Sep 29 23:45:32 1986
- --- src/termhooks.h Thu Apr 5 09:16:48 1990
- ***************
- *** 1,6 ****
- /* Hooks by which low level terminal operations
- can be made to call other routines.
- ! Copyright (C) 1985, 1986 Free Software Foundation, Inc.
-
- This file is part of GNU Emacs.
-
- --- 1,6 ----
- /* Hooks by which low level terminal operations
- can be made to call other routines.
- ! Copyright (C) 1985, 1986, 1990 Free Software Foundation, Inc.
-
- This file is part of GNU Emacs.
-
- ***************
- *** 20,25 ****
- --- 20,29 ----
- and this notice must be preserved on all copies. */
-
-
- + /* Modified 1990 for 8-bit character support by Howard Gayle.
- + * See chartab.c for details. */
- +
- +
- extern int (*topos_hook) ();
- extern int (*raw_topos_hook) ();
-
- ***************
- *** 32,40 ****
- extern int (*change_line_highlight_hook) ();
- extern int (*reassert_line_highlight_hook) ();
-
- ! extern int (*insert_chars_hook) ();
- ! extern int (*write_chars_hook) ();
- ! extern int (*delete_chars_hook) ();
-
- extern int (*ring_bell_hook) ();
-
- --- 36,44 ----
- extern int (*change_line_highlight_hook) ();
- extern int (*reassert_line_highlight_hook) ();
-
- ! extern int (*insert_glyfs_hook) ();
- ! extern int (*write_glyfs_hook) ();
- ! extern int (*delete_glyfs_hook) ();
-
- extern int (*ring_bell_hook) ();
-
- *** ../18.55/src/window.c Fri Jun 10 15:07:24 1988
- --- src/window.c Thu Apr 5 09:17:01 1990
- ***************
- *** 1,6 ****
- /* Window creation, deletion and examination for GNU Emacs.
- Does not include redisplay.
- ! Copyright (C) 1985, 1986, 1987 Free Software Foundation, Inc.
-
- This file is part of GNU Emacs.
-
- --- 1,6 ----
- /* Window creation, deletion and examination for GNU Emacs.
- Does not include redisplay.
- ! Copyright (C) 1985, 1986, 1987, 1990 Free Software Foundation, Inc.
-
- This file is part of GNU Emacs.
-
- ***************
- *** 20,28 ****
- --- 20,33 ----
- and this notice must be preserved on all copies. */
-
-
- + /* Modified 1990 for 8-bit character support by Howard Gayle.
- + * See chartab.c for details. */
- +
- +
- #include "config.h"
- #include "lisp.h"
- #include "buffer.h"
- + #include "chartab.h"
- #include "window.h"
- #include "commands.h"
- #include "indent.h"
- ***************
- *** 107,112 ****
- --- 112,121 ----
- p->start = Fmake_marker ();
- p->pointm = Fmake_marker ();
- XFASTINT (p->use_time) = 0;
- + p->window_char_table =
- + (XTYPE (buffer_defaults.buffer_char_table) == Lisp_Chartab)
- + ? buffer_defaults.buffer_char_table
- + : Vctl_arrow_char_table;
- return val;
- }
-
- ***************
- *** 204,209 ****
- --- 213,243 ----
- return decode_window (window)->buffer;
- }
-
- + DEFUN ("window-char-table", Fwindow_char_table, Swindow_char_table, 0, 1, 0,
- + "Return the char table that WINDOW is using.")
- + (window)
- + Lisp_Object window;
- + {
- + return decode_window (window)->window_char_table;
- + }
- +
- + DEFUN ("set-window-char-table",
- + Fset_window_char_table, Sset_window_char_table, 1, 2, 0,
- + "Use TABLE as the char table in WINDOW (default selected\n\
- + window). Returns the old char table.")
- + (table, window)
- + register Lisp_Object table, window;
- + {
- + register struct window *w;
- + register Lisp_Object z; /* Return. */
- +
- + table = check_char_table (table);
- + w = decode_window (window);
- + z = w->window_char_table;
- + w->window_char_table = table;
- + return (z);
- + }
- +
- DEFUN ("window-height", Fwindow_height, Swindow_height, 0, 1, 0,
- "Return the number of lines in WINDOW (including its mode line).")
- (window)
- ***************
- *** 835,845 ****
- {
- register Lisp_Object tem;
- register struct window *w = decode_window (window);
-
- buffer = Fget_buffer (buffer);
- CHECK_BUFFER (buffer, 1);
-
- ! if (NULL (XBUFFER (buffer)->name))
- error ("Attempt to display deleted buffer");
-
- tem = w->buffer;
- --- 869,881 ----
- {
- register Lisp_Object tem;
- register struct window *w = decode_window (window);
- + register struct buffer *bp;
-
- buffer = Fget_buffer (buffer);
- CHECK_BUFFER (buffer, 1);
- + bp = XBUFFER (buffer);
-
- ! if (NULL (bp->name))
- error ("Attempt to display deleted buffer");
-
- tem = w->buffer;
- ***************
- *** 848,860 ****
-
- w->buffer = buffer;
- Fset_marker (w->pointm,
- ! make_number (XBUFFER (buffer) == bf_cur
- ! ? point : XBUFFER (buffer)->text.pointloc),
- buffer);
- ! Fset_marker (w->start, make_number (XBUFFER (buffer)->last_window_start),
- buffer);
- w->start_at_line_beg = Qnil;
- XFASTINT (w->last_modified) = 0;
- windows_or_buffers_changed++;
- if (EQ (window, selected_window))
- Fset_buffer (buffer);
- --- 884,902 ----
-
- w->buffer = buffer;
- Fset_marker (w->pointm,
- ! make_number (bp == bf_cur
- ! ? point : bp->text.pointloc),
- buffer);
- ! Fset_marker (w->start, make_number (bp->last_window_start),
- buffer);
- w->start_at_line_beg = Qnil;
- XFASTINT (w->last_modified) = 0;
- + if (XTYPE (bp->buffer_char_table) == Lisp_Chartab)
- + w->window_char_table = bp->buffer_char_table;
- + else if (XTYPE (buffer_defaults.buffer_char_table) == Lisp_Chartab)
- + w->window_char_table = buffer_defaults.buffer_char_table;
- + else
- + w->window_char_table = Vctl_arrow_char_table;
- windows_or_buffers_changed++;
- if (EQ (window, selected_window))
- Fset_buffer (buffer);
- ***************
- *** 1593,1600 ****
- Lisp_Object left, top, width, height, hscroll;
- Lisp_Object parent, prev;
- Lisp_Object start_at_line_beg;
- };
- ! #define SAVED_WINDOW_VECTOR_SIZE 13 /* Arg to Fmake_vector */
-
- #define SAVED_WINDOW_N(swv,n) \
- ((struct saved_window *) (XVECTOR ((swv)->contents[(n)])))
- --- 1635,1643 ----
- Lisp_Object left, top, width, height, hscroll;
- Lisp_Object parent, prev;
- Lisp_Object start_at_line_beg;
- + Lisp_Object saved_char_table;
- };
- ! #define SAVED_WINDOW_VECTOR_SIZE 14 /* Arg to Fmake_vector */
-
- #define SAVED_WINDOW_N(swv,n) \
- ((struct saved_window *) (XVECTOR ((swv)->contents[(n)])))
- ***************
- *** 1684,1689 ****
- --- 1727,1733 ----
- w->height = p->height;
- w->hscroll = p->hscroll;
- XFASTINT (w->last_modified) = 0;
- + w->window_char_table = p->saved_char_table;
-
- /* Reinstall the saved buffer and pointers into it. */
- if (NULL (p->buffer))
- ***************
- *** 1846,1851 ****
- --- 1890,1897 ----
- else
- p->parent = XWINDOW (w->parent)->temslot;
-
- + p->saved_char_table = w->window_char_table;
- +
- if (NULL (w->prev))
- p->prev = Qnil;
- else
- ***************
- *** 1950,1955 ****
- --- 1996,2003 ----
- defsubr (&Swindowp);
- defsubr (&Spos_visible_in_window_p);
- defsubr (&Swindow_buffer);
- + defsubr (&Swindow_char_table);
- + defsubr (&Sset_window_char_table);
- defsubr (&Swindow_height);
- defsubr (&Swindow_width);
- defsubr (&Swindow_hscroll);
- *** ../18.55/src/window.h Thu Feb 19 21:47:01 1987
- --- src/window.h Thu Apr 5 09:17:13 1990
- ***************
- *** 1,5 ****
- /* Window definitions for GNU Emacs.
- ! Copyright (C) 1985, 1986 Free Software Foundation, Inc.
-
- This file is part of GNU Emacs.
-
- --- 1,5 ----
- /* Window definitions for GNU Emacs.
- ! Copyright (C) 1985, 1986, 1990 Free Software Foundation, Inc.
-
- This file is part of GNU Emacs.
-
- ***************
- *** 19,24 ****
- --- 19,28 ----
- and this notice must be preserved on all copies. */
-
-
- + /* Modified 1990 for 8-bit character support by Howard Gayle.
- + * See chartab.c for details. */
- +
- +
- /* Windows are allocated as if they were vectors, but then the
- Lisp data type is changed to Lisp_Window. They are garbage
- collected along with the vectors.
- ***************
- *** 118,123 ****
- --- 122,129 ----
- Lisp_Object last_modified;
- /* Value of point at that time */
- Lisp_Object last_point;
- + /* The char table to use for display. */
- + Lisp_Object window_char_table;
- /* The rest are currently not used or only half used */
- /* Screen coords of point at that time */
- Lisp_Object last_point_x;
-