X-Git-Url: https://code.delx.au/gnu-emacs/blobdiff_plain/c70c27055d0cd10097196099b5429af2e9638d08..4d8ae757b2662eca9e0d49c3fb27e69fb85cab85:/src/termcap.c diff --git a/src/termcap.c b/src/termcap.c index 595fc425c1..b99ae47331 100644 --- a/src/termcap.c +++ b/src/termcap.c @@ -1,5 +1,6 @@ /* Work-alike for termcap, plus extra features. - Copyright (C) 1985, 86, 93, 94, 95 Free Software Foundation, Inc. + Copyright (C) 1985, 86, 93, 94, 95, 2000, 2001 + 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 @@ -13,7 +14,8 @@ GNU General Public License for more details. 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, 675 Mass Ave, Cambridge, MA 02139, USA. */ +the Free Software Foundation, Inc., 59 Temple Place - Suite 330, +Boston, MA 02111-1307, USA. */ /* Emacs config.h may rename various library functions such as malloc. */ #ifdef HAVE_CONFIG_H @@ -22,11 +24,15 @@ the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. */ #ifdef emacs +#include /* xmalloc is here */ /* Get the O_* definitions for open et al. */ #include -#ifdef USG5 +#ifdef HAVE_FCNTL_H #include #endif +#ifdef HAVE_UNISTD_H +#include +#endif #else /* not emacs */ @@ -172,6 +178,17 @@ tgetstr (cap, area) return tgetst1 (ptr, area); } +#ifdef IS_EBCDIC_HOST +/* Table, indexed by a character in range 0200 to 0300 with 0200 subtracted, + gives meaning of character following \, or a space if no special meaning. + Sixteen characters per line within the string. */ + +static char esctab[] + = " \057\026 \047\014 \ + \025 \015 \ + \005 \013 \ + "; +#else /* Table, indexed by a character in range 0100 to 0140 with 0100 subtracted, gives meaning of character following \, or a space if no special meaning. Eight characters per line within the string. */ @@ -181,6 +198,7 @@ static char esctab[] \012 \ \015 \011 \013 \ "; +#endif /* PTR points to a string value inside a termcap entry. Copy that value, processing \ and ^ abbreviations, @@ -244,12 +262,21 @@ tgetst1 (ptr, area) p++; } } +#ifdef IS_EBCDIC_HOST + else if (c >= 0200 && c < 0360) + { + c1 = esctab[(c & ~0100) - 0200]; + if (c1 != ' ') + c = c1; + } +#else else if (c >= 0100 && c < 0200) { c1 = esctab[(c & ~040) - 0100]; if (c1 != ' ') c = c1; } +#endif } *r++ = c; } @@ -262,11 +289,12 @@ tgetst1 (ptr, area) /* Outputting a string with padding. */ -short ospeed; /* If OSPEED is 0, we use this as the actual baud rate. */ int tputs_baud_rate; char PC; +#if 0 /* Doesn't seem to be used anymore. */ + /* Actual baud rate if positive; - baud rate / 100 if negative. */ @@ -281,6 +309,8 @@ static int speeds[] = #endif /* not VMS */ }; +#endif /* 0 */ + void tputs (str, nlines, outfun) register char *str; @@ -290,19 +320,12 @@ tputs (str, nlines, outfun) register int padcount = 0; register int speed; -#ifdef emacs - extern baud_rate; + extern int baud_rate; speed = baud_rate; /* For quite high speeds, convert to the smaller units to avoid overflow. */ if (speed > 10000) speed = - speed / 100; -#else - if (ospeed == 0) - speed = tputs_baud_rate; - else - speed = speeds[ospeed]; -#endif if (!str) return; @@ -346,7 +369,7 @@ tputs (str, nlines, outfun) /* Finding the termcap entry in the termcap data base. */ -struct buffer +struct termcap_buffer { char *beg; int size; @@ -419,13 +442,13 @@ tgetent (bp, name) { register char *termcap_name; register int fd; - struct buffer buf; + struct termcap_buffer buf; register char *bp1; - char *bp2; + char *tc_search_point; char *term; int malloc_size = 0; register int c; - char *tcenv; /* TERMCAP value, if it contains :tc=. */ + char *tcenv = NULL; /* TERMCAP value, if it contains :tc=. */ char *indirect = NULL; /* Terminal type in :tc= in TERMCAP value. */ int filep; @@ -509,7 +532,7 @@ tgetent (bp, name) malloc_size = indirect ? strlen (tcenv) + 1 : buf.size; bp = (char *) xmalloc (malloc_size); } - bp1 = bp; + tc_search_point = bp1 = bp; if (indirect) /* Copy the data from the environment variable. */ @@ -537,14 +560,13 @@ tgetent (bp, name) /* If BP is malloc'd by us, make sure it is big enough. */ if (malloc_size) { - malloc_size = bp1 - bp + buf.size; - termcap_name = (char *) xrealloc (bp, malloc_size); - bp1 += termcap_name - bp; - bp = termcap_name; + int offset1 = bp1 - bp, offset2 = tc_search_point - bp; + malloc_size = offset1 + buf.size; + bp = termcap_name = (char *) xrealloc (bp, malloc_size); + bp1 = termcap_name + offset1; + tc_search_point = termcap_name + offset2; } - bp2 = bp1; - /* Copy the line of the entry from buf into bp. */ termcap_name = buf.ptr; while ((*bp1++ = c = *termcap_name++) && c != '\n') @@ -558,7 +580,8 @@ tgetent (bp, name) /* Does this entry refer to another terminal type's entry? If something is found, copy it into heap and null-terminate it. */ - term = tgetst1 (find_capability (bp2, "tc"), (char **) 0); + tc_search_point = find_capability (tc_search_point, "tc"); + term = tgetst1 (tc_search_point, (char **) 0); } close (fd); @@ -582,7 +605,7 @@ static int scan_file (str, fd, bufp) char *str; int fd; - register struct buffer *bufp; + register struct termcap_buffer *bufp; { register char *end; @@ -678,7 +701,7 @@ compare_contin (str1, str2) static char * gobble_line (fd, bufp, append_end) int fd; - register struct buffer *bufp; + register struct termcap_buffer *bufp; char *append_end; { register char *end; @@ -779,4 +802,3 @@ tprint (cap) } #endif /* TEST */ -