annotate src/termcap.c @ 17846:c427501449a1

(display_text_line): Move the code to fill out the line with the newline's face to the end of the newline code. Add changes (commented out) to record ellipsis positions in charstarts.
author Richard M. Stallman <rms@gnu.org>
date Fri, 16 May 1997 07:32:59 +0000
parents 6e7bb4bd5010
children a09f2b697d0a
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
7306
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
1 /* Work-alike for termcap, plus extra features.
12675
8c9369149a9d Move #define of bcopy to after #include <string.h>.
David J. MacKenzie <djm@gnu.org>
parents: 11264
diff changeset
2 Copyright (C) 1985, 86, 93, 94, 95 Free Software Foundation, Inc.
7306
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
3
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
4 This program is free software; you can redistribute it and/or modify
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
5 it under the terms of the GNU General Public License as published by
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
6 the Free Software Foundation; either version 2, or (at your option)
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
7 any later version.
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
8
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
9 This program is distributed in the hope that it will be useful,
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
10 but WITHOUT ANY WARRANTY; without even the implied warranty of
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
11 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
12 GNU General Public License for more details.
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
13
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
14 You should have received a copy of the GNU General Public License
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
15 along with this program; see the file COPYING. If not, write to
14414
6e7bb4bd5010 Update FSF address in comment.
Karl Heuer <kwzh@gnu.org>
parents: 14132
diff changeset
16 the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
6e7bb4bd5010 Update FSF address in comment.
Karl Heuer <kwzh@gnu.org>
parents: 14132
diff changeset
17 Boston, MA 02111-1307, USA. */
7306
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
18
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
19 /* Emacs config.h may rename various library functions such as malloc. */
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
20 #ifdef HAVE_CONFIG_H
12994
bd38619285f7 Don't assume that HAVE_CONFIG_H implies emacs.
David J. MacKenzie <djm@gnu.org>
parents: 12907
diff changeset
21 #include <config.h>
bd38619285f7 Don't assume that HAVE_CONFIG_H implies emacs.
David J. MacKenzie <djm@gnu.org>
parents: 12907
diff changeset
22 #endif
7785
8a5a170b8646 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents: 7685
diff changeset
23
12994
bd38619285f7 Don't assume that HAVE_CONFIG_H implies emacs.
David J. MacKenzie <djm@gnu.org>
parents: 12907
diff changeset
24 #ifdef emacs
7785
8a5a170b8646 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents: 7685
diff changeset
25
8a5a170b8646 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents: 7685
diff changeset
26 /* Get the O_* definitions for open et al. */
8a5a170b8646 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents: 7685
diff changeset
27 #include <sys/file.h>
8a5a170b8646 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents: 7685
diff changeset
28 #ifdef USG5
8a5a170b8646 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents: 7685
diff changeset
29 #include <fcntl.h>
8a5a170b8646 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents: 7685
diff changeset
30 #endif
8a5a170b8646 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents: 7685
diff changeset
31
12994
bd38619285f7 Don't assume that HAVE_CONFIG_H implies emacs.
David J. MacKenzie <djm@gnu.org>
parents: 12907
diff changeset
32 #else /* not emacs */
7306
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
33
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
34 #ifdef STDC_HEADERS
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
35 #include <stdlib.h>
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
36 #include <string.h>
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
37 #else
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
38 char *getenv ();
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
39 char *malloc ();
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
40 char *realloc ();
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
41 #endif
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
42
12675
8c9369149a9d Move #define of bcopy to after #include <string.h>.
David J. MacKenzie <djm@gnu.org>
parents: 11264
diff changeset
43 /* Do this after the include, in case string.h prototypes bcopy. */
8c9369149a9d Move #define of bcopy to after #include <string.h>.
David J. MacKenzie <djm@gnu.org>
parents: 11264
diff changeset
44 #if (defined(HAVE_STRING_H) || defined(STDC_HEADERS)) && !defined(bcopy)
8c9369149a9d Move #define of bcopy to after #include <string.h>.
David J. MacKenzie <djm@gnu.org>
parents: 11264
diff changeset
45 #define bcopy(s, d, n) memcpy ((d), (s), (n))
8c9369149a9d Move #define of bcopy to after #include <string.h>.
David J. MacKenzie <djm@gnu.org>
parents: 11264
diff changeset
46 #endif
8c9369149a9d Move #define of bcopy to after #include <string.h>.
David J. MacKenzie <djm@gnu.org>
parents: 11264
diff changeset
47
7306
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
48 #ifdef HAVE_UNISTD_H
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
49 #include <unistd.h>
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
50 #endif
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
51 #ifdef _POSIX_VERSION
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
52 #include <fcntl.h>
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
53 #endif
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
54
12994
bd38619285f7 Don't assume that HAVE_CONFIG_H implies emacs.
David J. MacKenzie <djm@gnu.org>
parents: 12907
diff changeset
55 #endif /* not emacs */
7306
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
56
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
57 #ifndef NULL
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
58 #define NULL (char *) 0
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
59 #endif
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
60
7685
5fbc009f3dc3 *** empty log message ***
Roland McGrath <roland@gnu.org>
parents: 7306
diff changeset
61 #ifndef O_RDONLY
5fbc009f3dc3 *** empty log message ***
Roland McGrath <roland@gnu.org>
parents: 7306
diff changeset
62 #define O_RDONLY 0
5fbc009f3dc3 *** empty log message ***
Roland McGrath <roland@gnu.org>
parents: 7306
diff changeset
63 #endif
5fbc009f3dc3 *** empty log message ***
Roland McGrath <roland@gnu.org>
parents: 7306
diff changeset
64
7306
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
65 /* BUFSIZE is the initial size allocated for the buffer
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
66 for reading the termcap file.
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
67 It is not a limit.
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
68 Make it large normally for speed.
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
69 Make it variable when debugging, so can exercise
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
70 increasing the space dynamically. */
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
71
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
72 #ifndef BUFSIZE
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
73 #ifdef DEBUG
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
74 #define BUFSIZE bufsize
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
75
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
76 int bufsize = 128;
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
77 #else
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
78 #define BUFSIZE 2048
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
79 #endif
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
80 #endif
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
81
12679
a14b26e55f25 TERMCAP_NAME -> TERMCAP_FILE.
David J. MacKenzie <djm@gnu.org>
parents: 12675
diff changeset
82 #ifndef TERMCAP_FILE
a14b26e55f25 TERMCAP_NAME -> TERMCAP_FILE.
David J. MacKenzie <djm@gnu.org>
parents: 12675
diff changeset
83 #define TERMCAP_FILE "/etc/termcap"
7306
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
84 #endif
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
85
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
86 #ifndef emacs
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
87 static void
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
88 memory_out ()
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
89 {
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
90 write (2, "virtual memory exhausted\n", 25);
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
91 exit (1);
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
92 }
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
93
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
94 static char *
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
95 xmalloc (size)
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
96 unsigned size;
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
97 {
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
98 register char *tem = malloc (size);
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
99
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
100 if (!tem)
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
101 memory_out ();
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
102 return tem;
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
103 }
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
104
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
105 static char *
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
106 xrealloc (ptr, size)
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
107 char *ptr;
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
108 unsigned size;
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
109 {
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
110 register char *tem = realloc (ptr, size);
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
111
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
112 if (!tem)
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
113 memory_out ();
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
114 return tem;
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
115 }
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
116 #endif /* not emacs */
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
117
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
118 /* Looking up capabilities in the entry already found. */
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
119
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
120 /* The pointer to the data made by tgetent is left here
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
121 for tgetnum, tgetflag and tgetstr to find. */
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
122 static char *term_entry;
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
123
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
124 static char *tgetst1 ();
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
125
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
126 /* Search entry BP for capability CAP.
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
127 Return a pointer to the capability (in BP) if found,
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
128 0 if not found. */
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
129
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
130 static char *
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
131 find_capability (bp, cap)
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
132 register char *bp, *cap;
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
133 {
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
134 for (; *bp; bp++)
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
135 if (bp[0] == ':'
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
136 && bp[1] == cap[0]
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
137 && bp[2] == cap[1])
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
138 return &bp[4];
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
139 return NULL;
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
140 }
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
141
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
142 int
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
143 tgetnum (cap)
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
144 char *cap;
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
145 {
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
146 register char *ptr = find_capability (term_entry, cap);
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
147 if (!ptr || ptr[-1] != '#')
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
148 return -1;
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
149 return atoi (ptr);
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
150 }
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
151
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
152 int
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
153 tgetflag (cap)
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
154 char *cap;
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
155 {
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
156 register char *ptr = find_capability (term_entry, cap);
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
157 return ptr && ptr[-1] == ':';
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
158 }
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
159
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
160 /* Look up a string-valued capability CAP.
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
161 If AREA is non-null, it points to a pointer to a block in which
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
162 to store the string. That pointer is advanced over the space used.
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
163 If AREA is null, space is allocated with `malloc'. */
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
164
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
165 char *
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
166 tgetstr (cap, area)
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
167 char *cap;
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
168 char **area;
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
169 {
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
170 register char *ptr = find_capability (term_entry, cap);
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
171 if (!ptr || (ptr[-1] != '=' && ptr[-1] != '~'))
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
172 return NULL;
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
173 return tgetst1 (ptr, area);
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
174 }
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
175
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
176 /* Table, indexed by a character in range 0100 to 0140 with 0100 subtracted,
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
177 gives meaning of character following \, or a space if no special meaning.
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
178 Eight characters per line within the string. */
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
179
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
180 static char esctab[]
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
181 = " \007\010 \033\014 \
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
182 \012 \
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
183 \015 \011 \013 \
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
184 ";
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
185
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
186 /* PTR points to a string value inside a termcap entry.
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
187 Copy that value, processing \ and ^ abbreviations,
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
188 into the block that *AREA points to,
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
189 or to newly allocated storage if AREA is NULL.
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
190 Return the address to which we copied the value,
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
191 or NULL if PTR is NULL. */
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
192
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
193 static char *
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
194 tgetst1 (ptr, area)
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
195 char *ptr;
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
196 char **area;
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
197 {
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
198 register char *p, *r;
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
199 register int c;
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
200 register int size;
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
201 char *ret;
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
202 register int c1;
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
203
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
204 if (!ptr)
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
205 return NULL;
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
206
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
207 /* `ret' gets address of where to store the string. */
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
208 if (!area)
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
209 {
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
210 /* Compute size of block needed (may overestimate). */
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
211 p = ptr;
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
212 while ((c = *p++) && c != ':' && c != '\n')
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
213 ;
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
214 ret = (char *) xmalloc (p - ptr + 1);
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
215 }
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
216 else
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
217 ret = *area;
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
218
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
219 /* Copy the string value, stopping at null or colon.
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
220 Also process ^ and \ abbreviations. */
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
221 p = ptr;
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
222 r = ret;
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
223 while ((c = *p++) && c != ':' && c != '\n')
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
224 {
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
225 if (c == '^')
10186
af0b61d21a8f (tgetst1): Let ^? stand for DEL character.
Richard M. Stallman <rms@gnu.org>
parents: 7785
diff changeset
226 {
af0b61d21a8f (tgetst1): Let ^? stand for DEL character.
Richard M. Stallman <rms@gnu.org>
parents: 7785
diff changeset
227 c = *p++;
af0b61d21a8f (tgetst1): Let ^? stand for DEL character.
Richard M. Stallman <rms@gnu.org>
parents: 7785
diff changeset
228 if (c == '?')
af0b61d21a8f (tgetst1): Let ^? stand for DEL character.
Richard M. Stallman <rms@gnu.org>
parents: 7785
diff changeset
229 c = 0177;
af0b61d21a8f (tgetst1): Let ^? stand for DEL character.
Richard M. Stallman <rms@gnu.org>
parents: 7785
diff changeset
230 else
af0b61d21a8f (tgetst1): Let ^? stand for DEL character.
Richard M. Stallman <rms@gnu.org>
parents: 7785
diff changeset
231 c &= 037;
af0b61d21a8f (tgetst1): Let ^? stand for DEL character.
Richard M. Stallman <rms@gnu.org>
parents: 7785
diff changeset
232 }
7306
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
233 else if (c == '\\')
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
234 {
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
235 c = *p++;
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
236 if (c >= '0' && c <= '7')
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
237 {
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
238 c -= '0';
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
239 size = 0;
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
240
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
241 while (++size < 3 && (c1 = *p) >= '0' && c1 <= '7')
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
242 {
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
243 c *= 8;
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
244 c += c1 - '0';
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
245 p++;
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
246 }
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
247 }
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
248 else if (c >= 0100 && c < 0200)
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
249 {
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
250 c1 = esctab[(c & ~040) - 0100];
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
251 if (c1 != ' ')
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
252 c = c1;
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
253 }
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
254 }
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
255 *r++ = c;
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
256 }
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
257 *r = '\0';
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
258 /* Update *AREA. */
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
259 if (area)
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
260 *area = r + 1;
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
261 return ret;
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
262 }
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
263
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
264 /* Outputting a string with padding. */
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
265
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
266 short ospeed;
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
267 /* If OSPEED is 0, we use this as the actual baud rate. */
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
268 int tputs_baud_rate;
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
269 char PC;
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
270
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
271 /* Actual baud rate if positive;
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
272 - baud rate / 100 if negative. */
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
273
10739
97096cdf6e55 (speeds): Make it ints. Add some higher speeds.
Richard M. Stallman <rms@gnu.org>
parents: 10186
diff changeset
274 static int speeds[] =
7306
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
275 {
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
276 #ifdef VMS
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
277 0, 50, 75, 110, 134, 150, -3, -6, -12, -18,
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
278 -20, -24, -36, -48, -72, -96, -192
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
279 #else /* not VMS */
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
280 0, 50, 75, 110, 135, 150, -2, -3, -6, -12,
10739
97096cdf6e55 (speeds): Make it ints. Add some higher speeds.
Richard M. Stallman <rms@gnu.org>
parents: 10186
diff changeset
281 -18, -24, -48, -96, -192, -288, -384, -576, -1152
7306
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
282 #endif /* not VMS */
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
283 };
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
284
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
285 void
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
286 tputs (str, nlines, outfun)
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
287 register char *str;
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
288 int nlines;
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
289 register int (*outfun) ();
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
290 {
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
291 register int padcount = 0;
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
292 register int speed;
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
293
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
294 #ifdef emacs
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
295 extern baud_rate;
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
296 speed = baud_rate;
10739
97096cdf6e55 (speeds): Make it ints. Add some higher speeds.
Richard M. Stallman <rms@gnu.org>
parents: 10186
diff changeset
297 /* For quite high speeds, convert to the smaller
97096cdf6e55 (speeds): Make it ints. Add some higher speeds.
Richard M. Stallman <rms@gnu.org>
parents: 10186
diff changeset
298 units to avoid overflow. */
97096cdf6e55 (speeds): Make it ints. Add some higher speeds.
Richard M. Stallman <rms@gnu.org>
parents: 10186
diff changeset
299 if (speed > 10000)
97096cdf6e55 (speeds): Make it ints. Add some higher speeds.
Richard M. Stallman <rms@gnu.org>
parents: 10186
diff changeset
300 speed = - speed / 100;
7306
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
301 #else
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
302 if (ospeed == 0)
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
303 speed = tputs_baud_rate;
13677
ad4eada50462 (tputs): Don't let ospeed overrun the speeds array.
David J. MacKenzie <djm@gnu.org>
parents: 12994
diff changeset
304 else if (ospeed > 0 && ospeed < (sizeof speeds / sizeof speeds[0]))
ad4eada50462 (tputs): Don't let ospeed overrun the speeds array.
David J. MacKenzie <djm@gnu.org>
parents: 12994
diff changeset
305 speed = speeds[ospeed];
7306
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
306 else
13677
ad4eada50462 (tputs): Don't let ospeed overrun the speeds array.
David J. MacKenzie <djm@gnu.org>
parents: 12994
diff changeset
307 speed = 0;
7306
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
308 #endif
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
309
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
310 if (!str)
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
311 return;
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
312
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
313 while (*str >= '0' && *str <= '9')
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
314 {
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
315 padcount += *str++ - '0';
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
316 padcount *= 10;
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
317 }
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
318 if (*str == '.')
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
319 {
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
320 str++;
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
321 padcount += *str++ - '0';
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
322 }
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
323 if (*str == '*')
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
324 {
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
325 str++;
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
326 padcount *= nlines;
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
327 }
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
328 while (*str)
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
329 (*outfun) (*str++);
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
330
10739
97096cdf6e55 (speeds): Make it ints. Add some higher speeds.
Richard M. Stallman <rms@gnu.org>
parents: 10186
diff changeset
331 /* PADCOUNT is now in units of tenths of msec.
10753
e0de204ec865 Comment changed.
Richard M. Stallman <rms@gnu.org>
parents: 10739
diff changeset
332 SPEED is measured in characters per 10 seconds
10739
97096cdf6e55 (speeds): Make it ints. Add some higher speeds.
Richard M. Stallman <rms@gnu.org>
parents: 10186
diff changeset
333 or in characters per .1 seconds (if negative).
97096cdf6e55 (speeds): Make it ints. Add some higher speeds.
Richard M. Stallman <rms@gnu.org>
parents: 10186
diff changeset
334 We use the smaller units for larger speeds to avoid overflow. */
97096cdf6e55 (speeds): Make it ints. Add some higher speeds.
Richard M. Stallman <rms@gnu.org>
parents: 10186
diff changeset
335 padcount *= speed;
7306
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
336 padcount += 500;
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
337 padcount /= 1000;
10739
97096cdf6e55 (speeds): Make it ints. Add some higher speeds.
Richard M. Stallman <rms@gnu.org>
parents: 10186
diff changeset
338 if (speed < 0)
7306
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
339 padcount = -padcount;
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
340 else
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
341 {
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
342 padcount += 50;
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
343 padcount /= 100;
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
344 }
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
345
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
346 while (padcount-- > 0)
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
347 (*outfun) (PC);
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
348 }
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
349
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
350 /* Finding the termcap entry in the termcap data base. */
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
351
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
352 struct buffer
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
353 {
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
354 char *beg;
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
355 int size;
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
356 char *ptr;
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
357 int ateof;
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
358 int full;
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
359 };
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
360
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
361 /* Forward declarations of static functions. */
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
362
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
363 static int scan_file ();
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
364 static char *gobble_line ();
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
365 static int compare_contin ();
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
366 static int name_match ();
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
367
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
368 #ifdef VMS
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
369
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
370 #include <rmsdef.h>
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
371 #include <fab.h>
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
372 #include <nam.h>
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
373
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
374 static int
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
375 valid_filename_p (fn)
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
376 char *fn;
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
377 {
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
378 struct FAB fab = cc$rms_fab;
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
379 struct NAM nam = cc$rms_nam;
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
380 char esa[NAM$C_MAXRSS];
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
381
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
382 fab.fab$l_fna = fn;
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
383 fab.fab$b_fns = strlen(fn);
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
384 fab.fab$l_nam = &nam;
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
385 fab.fab$l_fop = FAB$M_NAM;
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
386
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
387 nam.nam$l_esa = esa;
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
388 nam.nam$b_ess = sizeof esa;
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
389
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
390 return SYS$PARSE(&fab, 0, 0) == RMS$_NORMAL;
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
391 }
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
392
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
393 #else /* !VMS */
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
394
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
395 #ifdef MSDOS /* MW, May 1993 */
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
396 static int
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
397 valid_filename_p (fn)
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
398 char *fn;
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
399 {
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
400 return *fn == '/' || fn[1] == ':';
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
401 }
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
402 #else
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
403 #define valid_filename_p(fn) (*(fn) == '/')
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
404 #endif
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
405
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
406 #endif /* !VMS */
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
407
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
408 /* Find the termcap entry data for terminal type NAME
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
409 and store it in the block that BP points to.
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
410 Record its address for future use.
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
411
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
412 If BP is null, space is dynamically allocated.
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
413
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
414 Return -1 if there is some difficulty accessing the data base
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
415 of terminal types,
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
416 0 if the data base is accessible but the type NAME is not defined
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
417 in it, and some other value otherwise. */
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
418
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
419 int
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
420 tgetent (bp, name)
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
421 char *bp, *name;
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
422 {
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
423 register char *termcap_name;
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
424 register int fd;
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
425 struct buffer buf;
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
426 register char *bp1;
14132
85063feb159b (tgetent): Find all the tc caps that there are.
Karl Heuer <kwzh@gnu.org>
parents: 13677
diff changeset
427 char *tc_search_point;
7306
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
428 char *term;
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
429 int malloc_size = 0;
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
430 register int c;
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
431 char *tcenv; /* TERMCAP value, if it contains :tc=. */
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
432 char *indirect = NULL; /* Terminal type in :tc= in TERMCAP value. */
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
433 int filep;
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
434
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
435 #ifdef INTERNAL_TERMINAL
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
436 /* For the internal terminal we don't want to read any termcap file,
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
437 so fake it. */
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
438 if (!strcmp (name, "internal"))
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
439 {
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
440 term = INTERNAL_TERMINAL;
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
441 if (!bp)
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
442 {
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
443 malloc_size = 1 + strlen (term);
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
444 bp = (char *) xmalloc (malloc_size);
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
445 }
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
446 strcpy (bp, term);
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
447 goto ret;
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
448 }
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
449 #endif /* INTERNAL_TERMINAL */
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
450
12907
6cae53a06172 default to user-supplied buffer.
David J. MacKenzie <djm@gnu.org>
parents: 12679
diff changeset
451 /* For compatibility with programs like `less' that want to
6cae53a06172 default to user-supplied buffer.
David J. MacKenzie <djm@gnu.org>
parents: 12679
diff changeset
452 put data in the termcap buffer themselves as a fallback. */
6cae53a06172 default to user-supplied buffer.
David J. MacKenzie <djm@gnu.org>
parents: 12679
diff changeset
453 if (bp)
6cae53a06172 default to user-supplied buffer.
David J. MacKenzie <djm@gnu.org>
parents: 12679
diff changeset
454 term_entry = bp;
6cae53a06172 default to user-supplied buffer.
David J. MacKenzie <djm@gnu.org>
parents: 12679
diff changeset
455
7306
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
456 termcap_name = getenv ("TERMCAP");
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
457 if (termcap_name && *termcap_name == '\0')
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
458 termcap_name = NULL;
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
459 #if defined (MSDOS) && !defined (TEST)
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
460 if (termcap_name && (*termcap_name == '\\'
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
461 || *termcap_name == '/'
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
462 || termcap_name[1] == ':'))
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
463 dostounix_filename(termcap_name);
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
464 #endif
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
465
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
466 filep = termcap_name && valid_filename_p (termcap_name);
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
467
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
468 /* If termcap_name is non-null and starts with / (in the un*x case, that is),
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
469 it is a file name to use instead of /etc/termcap.
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
470 If it is non-null and does not start with /,
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
471 it is the entry itself, but only if
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
472 the name the caller requested matches the TERM variable. */
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
473
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
474 if (termcap_name && !filep && !strcmp (name, getenv ("TERM")))
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
475 {
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
476 indirect = tgetst1 (find_capability (termcap_name, "tc"), (char **) 0);
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
477 if (!indirect)
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
478 {
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
479 if (!bp)
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
480 bp = termcap_name;
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
481 else
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
482 strcpy (bp, termcap_name);
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
483 goto ret;
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
484 }
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
485 else
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
486 { /* It has tc=. Need to read /etc/termcap. */
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
487 tcenv = termcap_name;
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
488 termcap_name = NULL;
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
489 }
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
490 }
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
491
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
492 if (!termcap_name || !filep)
12679
a14b26e55f25 TERMCAP_NAME -> TERMCAP_FILE.
David J. MacKenzie <djm@gnu.org>
parents: 12675
diff changeset
493 termcap_name = TERMCAP_FILE;
7306
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
494
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
495 /* Here we know we must search a file and termcap_name has its name. */
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
496
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
497 #ifdef MSDOS
7685
5fbc009f3dc3 *** empty log message ***
Roland McGrath <roland@gnu.org>
parents: 7306
diff changeset
498 fd = open (termcap_name, O_RDONLY|O_TEXT, 0);
7306
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
499 #else
7685
5fbc009f3dc3 *** empty log message ***
Roland McGrath <roland@gnu.org>
parents: 7306
diff changeset
500 fd = open (termcap_name, O_RDONLY, 0);
7306
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
501 #endif
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
502 if (fd < 0)
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
503 return -1;
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
504
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
505 buf.size = BUFSIZE;
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
506 /* Add 1 to size to ensure room for terminating null. */
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
507 buf.beg = (char *) xmalloc (buf.size + 1);
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
508 term = indirect ? indirect : name;
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
509
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
510 if (!bp)
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
511 {
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
512 malloc_size = indirect ? strlen (tcenv) + 1 : buf.size;
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
513 bp = (char *) xmalloc (malloc_size);
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
514 }
14132
85063feb159b (tgetent): Find all the tc caps that there are.
Karl Heuer <kwzh@gnu.org>
parents: 13677
diff changeset
515 tc_search_point = bp1 = bp;
7306
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
516
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
517 if (indirect)
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
518 /* Copy the data from the environment variable. */
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
519 {
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
520 strcpy (bp, tcenv);
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
521 bp1 += strlen (tcenv);
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
522 }
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
523
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
524 while (term)
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
525 {
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
526 /* Scan the file, reading it via buf, till find start of main entry. */
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
527 if (scan_file (term, fd, &buf) == 0)
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
528 {
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
529 close (fd);
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
530 free (buf.beg);
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
531 if (malloc_size)
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
532 free (bp);
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
533 return 0;
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
534 }
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
535
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
536 /* Free old `term' if appropriate. */
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
537 if (term != name)
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
538 free (term);
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
539
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
540 /* If BP is malloc'd by us, make sure it is big enough. */
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
541 if (malloc_size)
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
542 {
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
543 malloc_size = bp1 - bp + buf.size;
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
544 termcap_name = (char *) xrealloc (bp, malloc_size);
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
545 bp1 += termcap_name - bp;
14132
85063feb159b (tgetent): Find all the tc caps that there are.
Karl Heuer <kwzh@gnu.org>
parents: 13677
diff changeset
546 tc_search_point += termcap_name - bp;
7306
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
547 bp = termcap_name;
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
548 }
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
549
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
550 /* Copy the line of the entry from buf into bp. */
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
551 termcap_name = buf.ptr;
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
552 while ((*bp1++ = c = *termcap_name++) && c != '\n')
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
553 /* Drop out any \ newline sequence. */
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
554 if (c == '\\' && *termcap_name == '\n')
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
555 {
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
556 bp1--;
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
557 termcap_name++;
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
558 }
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
559 *bp1 = '\0';
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
560
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
561 /* Does this entry refer to another terminal type's entry?
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
562 If something is found, copy it into heap and null-terminate it. */
14132
85063feb159b (tgetent): Find all the tc caps that there are.
Karl Heuer <kwzh@gnu.org>
parents: 13677
diff changeset
563 tc_search_point = find_capability (tc_search_point, "tc");
85063feb159b (tgetent): Find all the tc caps that there are.
Karl Heuer <kwzh@gnu.org>
parents: 13677
diff changeset
564 term = tgetst1 (tc_search_point, (char **) 0);
7306
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
565 }
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
566
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
567 close (fd);
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
568 free (buf.beg);
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
569
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
570 if (malloc_size)
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
571 bp = (char *) xrealloc (bp, bp1 - bp + 1);
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
572
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
573 ret:
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
574 term_entry = bp;
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
575 return 1;
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
576 }
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
577
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
578 /* Given file open on FD and buffer BUFP,
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
579 scan the file from the beginning until a line is found
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
580 that starts the entry for terminal type STR.
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
581 Return 1 if successful, with that line in BUFP,
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
582 or 0 if no entry is found in the file. */
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
583
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
584 static int
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
585 scan_file (str, fd, bufp)
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
586 char *str;
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
587 int fd;
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
588 register struct buffer *bufp;
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
589 {
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
590 register char *end;
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
591
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
592 bufp->ptr = bufp->beg;
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
593 bufp->full = 0;
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
594 bufp->ateof = 0;
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
595 *bufp->ptr = '\0';
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
596
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
597 lseek (fd, 0L, 0);
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
598
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
599 while (!bufp->ateof)
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
600 {
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
601 /* Read a line into the buffer. */
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
602 end = NULL;
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
603 do
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
604 {
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
605 /* if it is continued, append another line to it,
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
606 until a non-continued line ends. */
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
607 end = gobble_line (fd, bufp, end);
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
608 }
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
609 while (!bufp->ateof && end[-2] == '\\');
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
610
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
611 if (*bufp->ptr != '#'
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
612 && name_match (bufp->ptr, str))
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
613 return 1;
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
614
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
615 /* Discard the line just processed. */
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
616 bufp->ptr = end;
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
617 }
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
618 return 0;
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
619 }
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
620
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
621 /* Return nonzero if NAME is one of the names specified
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
622 by termcap entry LINE. */
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
623
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
624 static int
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
625 name_match (line, name)
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
626 char *line, *name;
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
627 {
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
628 register char *tem;
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
629
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
630 if (!compare_contin (line, name))
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
631 return 1;
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
632 /* This line starts an entry. Is it the right one? */
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
633 for (tem = line; *tem && *tem != '\n' && *tem != ':'; tem++)
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
634 if (*tem == '|' && !compare_contin (tem + 1, name))
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
635 return 1;
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
636
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
637 return 0;
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
638 }
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
639
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
640 static int
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
641 compare_contin (str1, str2)
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
642 register char *str1, *str2;
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
643 {
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
644 register int c1, c2;
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
645 while (1)
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
646 {
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
647 c1 = *str1++;
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
648 c2 = *str2++;
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
649 while (c1 == '\\' && *str1 == '\n')
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
650 {
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
651 str1++;
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
652 while ((c1 = *str1++) == ' ' || c1 == '\t');
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
653 }
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
654 if (c2 == '\0')
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
655 {
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
656 /* End of type being looked up. */
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
657 if (c1 == '|' || c1 == ':')
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
658 /* If end of name in data base, we win. */
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
659 return 0;
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
660 else
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
661 return 1;
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
662 }
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
663 else if (c1 != c2)
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
664 return 1;
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
665 }
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
666 }
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
667
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
668 /* Make sure that the buffer <- BUFP contains a full line
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
669 of the file open on FD, starting at the place BUFP->ptr
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
670 points to. Can read more of the file, discard stuff before
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
671 BUFP->ptr, or make the buffer bigger.
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
672
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
673 Return the pointer to after the newline ending the line,
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
674 or to the end of the file, if there is no newline to end it.
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
675
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
676 Can also merge on continuation lines. If APPEND_END is
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
677 non-null, it points past the newline of a line that is
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
678 continued; we add another line onto it and regard the whole
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
679 thing as one line. The caller decides when a line is continued. */
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
680
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
681 static char *
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
682 gobble_line (fd, bufp, append_end)
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
683 int fd;
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
684 register struct buffer *bufp;
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
685 char *append_end;
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
686 {
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
687 register char *end;
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
688 register int nread;
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
689 register char *buf = bufp->beg;
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
690 register char *tem;
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
691
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
692 if (!append_end)
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
693 append_end = bufp->ptr;
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
694
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
695 while (1)
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
696 {
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
697 end = append_end;
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
698 while (*end && *end != '\n') end++;
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
699 if (*end)
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
700 break;
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
701 if (bufp->ateof)
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
702 return buf + bufp->full;
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
703 if (bufp->ptr == buf)
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
704 {
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
705 if (bufp->full == bufp->size)
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
706 {
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
707 bufp->size *= 2;
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
708 /* Add 1 to size to ensure room for terminating null. */
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
709 tem = (char *) xrealloc (buf, bufp->size + 1);
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
710 bufp->ptr = (bufp->ptr - buf) + tem;
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
711 append_end = (append_end - buf) + tem;
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
712 bufp->beg = buf = tem;
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
713 }
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
714 }
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
715 else
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
716 {
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
717 append_end -= bufp->ptr - buf;
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
718 bcopy (bufp->ptr, buf, bufp->full -= bufp->ptr - buf);
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
719 bufp->ptr = buf;
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
720 }
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
721 if (!(nread = read (fd, buf + bufp->full, bufp->size - bufp->full)))
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
722 bufp->ateof = 1;
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
723 bufp->full += nread;
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
724 buf[bufp->full] = '\0';
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
725 }
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
726 return end + 1;
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
727 }
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
728
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
729 #ifdef TEST
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
730
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
731 #ifdef NULL
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
732 #undef NULL
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
733 #endif
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
734
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
735 #include <stdio.h>
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
736
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
737 main (argc, argv)
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
738 int argc;
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
739 char **argv;
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
740 {
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
741 char *term;
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
742 char *buf;
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
743
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
744 term = argv[1];
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
745 printf ("TERM: %s\n", term);
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
746
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
747 buf = (char *) tgetent (0, term);
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
748 if ((int) buf <= 0)
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
749 {
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
750 printf ("No entry.\n");
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
751 return 0;
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
752 }
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
753
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
754 printf ("Entry: %s\n", buf);
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
755
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
756 tprint ("cm");
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
757 tprint ("AL");
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
758
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
759 printf ("co: %d\n", tgetnum ("co"));
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
760 printf ("am: %d\n", tgetflag ("am"));
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
761 }
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
762
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
763 tprint (cap)
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
764 char *cap;
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
765 {
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
766 char *x = tgetstr (cap, 0);
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
767 register char *y;
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
768
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
769 printf ("%s: ", cap);
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
770 if (x)
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
771 {
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
772 for (y = x; *y; y++)
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
773 if (*y <= ' ' || *y == 0177)
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
774 printf ("\\%0o", *y);
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
775 else
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
776 putchar (*y);
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
777 free (x);
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
778 }
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
779 else
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
780 printf ("none");
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
781 putchar ('\n');
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
782 }
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
783
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
784 #endif /* TEST */