annotate src/termcap.c @ 111107:f3721a6253a8

Fix mouse highlight in bidi-reordered continued lines. xdisp.c (row_containing_pos): Don't return too early when CHARPOS is in a bidi-reordered continued line. Return immediately when the first hit is found in a line that is not continued, or when an exact match for CHARPOS is found. (mouse_face_from_buffer_pos): Rewrite to not assume that START_CHARPOS is always in mouse_face_beg_row. If necessary, swap mouse_face_beg_row and mouse_face_end_row so that the former is always above the latter or identical to it. Continued lines that begin or end outside of the visible region still don't work.
author Eli Zaretskii <eliz@gnu.org>
date Sat, 02 Oct 2010 17:05:20 +0200
parents 76e072dbe342
children 72f46bad930c
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.
64770
a0d1312ede66 Update years in copyright notice; nfc.
Thien-Thi Nguyen <ttn@gnuvola.org>
parents: 64084
diff changeset
2 Copyright (C) 1985, 1986, 1993, 1994, 1995, 2000, 2001, 2002, 2003,
100960
69177b934405 Revert copyright year changes for files that are not part of Emacs.
Glenn Morris <rgm@gnu.org>
parents: 100951
diff changeset
3 2004, 2005, 2006, 2007, 2008 Free Software Foundation, Inc.
7306
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
4
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
5 This program is free software; you can redistribute it and/or modify
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
6 it under the terms of the GNU General Public License as published by
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
7 the Free Software Foundation; either version 2, or (at your option)
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
8 any later version.
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
9
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
10 This program is distributed in the hope that it will be useful,
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
11 but WITHOUT ANY WARRANTY; without even the implied warranty of
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
12 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
13 GNU General Public License for more details.
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
14
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
15 You should have received a copy of the GNU General Public License
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
16 along with this program; see the file COPYING. If not, write to
64084
a8fa7c632ee4 Update FSF's address.
Lute Kamstra <lute@gnu.org>
parents: 62654
diff changeset
17 the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
a8fa7c632ee4 Update FSF's address.
Lute Kamstra <lute@gnu.org>
parents: 62654
diff changeset
18 Boston, MA 02110-1301, USA. */
7306
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
19
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
20 /* Emacs config.h may rename various library functions such as malloc. */
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>
105669
68dd71358159 * alloc.c: Do not define struct catchtag.
Dan Nicolaescu <dann@ics.uci.edu>
parents: 100960
diff changeset
22 #include <setjmp.h>
29804
d8776351a540 [emacs] Test HAVE_FCNTL_H, not USG5. Include lisp.h and unistd.h.
Dave Love <fx@gnu.org>
parents: 23071
diff changeset
23 #include <lisp.h> /* xmalloc is here */
7785
8a5a170b8646 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents: 7685
diff changeset
24 /* Get the O_* definitions for open et al. */
8a5a170b8646 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents: 7685
diff changeset
25 #include <sys/file.h>
29804
d8776351a540 [emacs] Test HAVE_FCNTL_H, not USG5. Include lisp.h and unistd.h.
Dave Love <fx@gnu.org>
parents: 23071
diff changeset
26 #ifdef HAVE_FCNTL_H
7785
8a5a170b8646 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents: 7685
diff changeset
27 #include <fcntl.h>
8a5a170b8646 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents: 7685
diff changeset
28 #endif
29804
d8776351a540 [emacs] Test HAVE_FCNTL_H, not USG5. Include lisp.h and unistd.h.
Dave Love <fx@gnu.org>
parents: 23071
diff changeset
29 #ifdef HAVE_UNISTD_H
d8776351a540 [emacs] Test HAVE_FCNTL_H, not USG5. Include lisp.h and unistd.h.
Dave Love <fx@gnu.org>
parents: 23071
diff changeset
30 #include <unistd.h>
d8776351a540 [emacs] Test HAVE_FCNTL_H, not USG5. Include lisp.h and unistd.h.
Dave Love <fx@gnu.org>
parents: 23071
diff changeset
31 #endif
7785
8a5a170b8646 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents: 7685
diff changeset
32
7306
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
33 #ifndef NULL
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
34 #define NULL (char *) 0
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
35 #endif
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
36
7685
5fbc009f3dc3 *** empty log message ***
Roland McGrath <roland@gnu.org>
parents: 7306
diff changeset
37 #ifndef O_RDONLY
5fbc009f3dc3 *** empty log message ***
Roland McGrath <roland@gnu.org>
parents: 7306
diff changeset
38 #define O_RDONLY 0
5fbc009f3dc3 *** empty log message ***
Roland McGrath <roland@gnu.org>
parents: 7306
diff changeset
39 #endif
5fbc009f3dc3 *** empty log message ***
Roland McGrath <roland@gnu.org>
parents: 7306
diff changeset
40
7306
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
41 /* BUFSIZE is the initial size allocated for the buffer
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
42 for reading the termcap file.
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
43 It is not a limit.
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
44 Make it large normally for speed.
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
45 Make it variable when debugging, so can exercise
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
46 increasing the space dynamically. */
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
47
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
48 #ifndef BUFSIZE
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
49 #ifdef DEBUG
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
50 #define BUFSIZE bufsize
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
51
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
52 int bufsize = 128;
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
53 #else
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
54 #define BUFSIZE 2048
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
55 #endif
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
56 #endif
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
57
12679
a14b26e55f25 TERMCAP_NAME -> TERMCAP_FILE.
David J. MacKenzie <djm@gnu.org>
parents: 12675
diff changeset
58 #ifndef TERMCAP_FILE
a14b26e55f25 TERMCAP_NAME -> TERMCAP_FILE.
David J. MacKenzie <djm@gnu.org>
parents: 12675
diff changeset
59 #define TERMCAP_FILE "/etc/termcap"
7306
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
60 #endif
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
61
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
62
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
63 /* Looking up capabilities in the entry already found. */
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
64
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
65 /* The pointer to the data made by tgetent is left here
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
66 for tgetnum, tgetflag and tgetstr to find. */
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
67 static char *term_entry;
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
68
109126
aec1143e8d85 Convert (most) functions in src to standard C.
Dan Nicolaescu <dann@ics.uci.edu>
parents: 105959
diff changeset
69 static char *tgetst1 (char *ptr, char **area);
7306
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
70
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
71 /* Search entry BP for capability CAP.
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
72 Return a pointer to the capability (in BP) if found,
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
73 0 if not found. */
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
74
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
75 static char *
109126
aec1143e8d85 Convert (most) functions in src to standard C.
Dan Nicolaescu <dann@ics.uci.edu>
parents: 105959
diff changeset
76 find_capability (register char *bp, register char *cap)
7306
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
77 {
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
78 for (; *bp; bp++)
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
79 if (bp[0] == ':'
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
80 && bp[1] == cap[0]
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
81 && bp[2] == cap[1])
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
82 return &bp[4];
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
83 return NULL;
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
84 }
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
85
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
86 int
109126
aec1143e8d85 Convert (most) functions in src to standard C.
Dan Nicolaescu <dann@ics.uci.edu>
parents: 105959
diff changeset
87 tgetnum (char *cap)
7306
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
88 {
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
89 register char *ptr = find_capability (term_entry, cap);
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
90 if (!ptr || ptr[-1] != '#')
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
91 return -1;
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
92 return atoi (ptr);
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
93 }
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
94
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
95 int
109126
aec1143e8d85 Convert (most) functions in src to standard C.
Dan Nicolaescu <dann@ics.uci.edu>
parents: 105959
diff changeset
96 tgetflag (char *cap)
7306
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 *ptr = find_capability (term_entry, cap);
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
99 return ptr && ptr[-1] == ':';
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
100 }
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
101
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
102 /* Look up a string-valued capability CAP.
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
103 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
104 to store the string. That pointer is advanced over the space used.
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
105 If AREA is null, space is allocated with `malloc'. */
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
106
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
107 char *
109126
aec1143e8d85 Convert (most) functions in src to standard C.
Dan Nicolaescu <dann@ics.uci.edu>
parents: 105959
diff changeset
108 tgetstr (char *cap, char **area)
7306
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 *ptr = find_capability (term_entry, cap);
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
111 if (!ptr || (ptr[-1] != '=' && ptr[-1] != '~'))
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
112 return NULL;
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
113 return tgetst1 (ptr, area);
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
114 }
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
115
23071
3790e185acc0 (tgetst1): Supprt EBCDIC systems.
Richard M. Stallman <rms@gnu.org>
parents: 22066
diff changeset
116 #ifdef IS_EBCDIC_HOST
3790e185acc0 (tgetst1): Supprt EBCDIC systems.
Richard M. Stallman <rms@gnu.org>
parents: 22066
diff changeset
117 /* Table, indexed by a character in range 0200 to 0300 with 0200 subtracted,
3790e185acc0 (tgetst1): Supprt EBCDIC systems.
Richard M. Stallman <rms@gnu.org>
parents: 22066
diff changeset
118 gives meaning of character following \, or a space if no special meaning.
3790e185acc0 (tgetst1): Supprt EBCDIC systems.
Richard M. Stallman <rms@gnu.org>
parents: 22066
diff changeset
119 Sixteen characters per line within the string. */
3790e185acc0 (tgetst1): Supprt EBCDIC systems.
Richard M. Stallman <rms@gnu.org>
parents: 22066
diff changeset
120
105959
ba3ffbd9c422 * process.c (ifflag_def): Make flag_sym constant.
Dan Nicolaescu <dann@ics.uci.edu>
parents: 105669
diff changeset
121 static const char esctab[]
23071
3790e185acc0 (tgetst1): Supprt EBCDIC systems.
Richard M. Stallman <rms@gnu.org>
parents: 22066
diff changeset
122 = " \057\026 \047\014 \
3790e185acc0 (tgetst1): Supprt EBCDIC systems.
Richard M. Stallman <rms@gnu.org>
parents: 22066
diff changeset
123 \025 \015 \
3790e185acc0 (tgetst1): Supprt EBCDIC systems.
Richard M. Stallman <rms@gnu.org>
parents: 22066
diff changeset
124 \005 \013 \
3790e185acc0 (tgetst1): Supprt EBCDIC systems.
Richard M. Stallman <rms@gnu.org>
parents: 22066
diff changeset
125 ";
3790e185acc0 (tgetst1): Supprt EBCDIC systems.
Richard M. Stallman <rms@gnu.org>
parents: 22066
diff changeset
126 #else
7306
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
127 /* Table, indexed by a character in range 0100 to 0140 with 0100 subtracted,
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
128 gives meaning of character following \, or a space if no special meaning.
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
129 Eight characters per line within the string. */
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
130
105959
ba3ffbd9c422 * process.c (ifflag_def): Make flag_sym constant.
Dan Nicolaescu <dann@ics.uci.edu>
parents: 105669
diff changeset
131 static const char esctab[]
7306
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
132 = " \007\010 \033\014 \
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
133 \012 \
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
134 \015 \011 \013 \
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
135 ";
23071
3790e185acc0 (tgetst1): Supprt EBCDIC systems.
Richard M. Stallman <rms@gnu.org>
parents: 22066
diff changeset
136 #endif
7306
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
137
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
138 /* PTR points to a string value inside a termcap entry.
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
139 Copy that value, processing \ and ^ abbreviations,
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
140 into the block that *AREA points to,
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
141 or to newly allocated storage if AREA is NULL.
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
142 Return the address to which we copied the value,
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
143 or NULL if PTR is NULL. */
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
144
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
145 static char *
109126
aec1143e8d85 Convert (most) functions in src to standard C.
Dan Nicolaescu <dann@ics.uci.edu>
parents: 105959
diff changeset
146 tgetst1 (char *ptr, char **area)
7306
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
147 {
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
148 register char *p, *r;
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
149 register int c;
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
150 register int size;
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
151 char *ret;
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
152 register int c1;
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
153
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
154 if (!ptr)
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
155 return NULL;
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
156
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
157 /* `ret' gets address of where to store the string. */
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
158 if (!area)
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
159 {
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
160 /* Compute size of block needed (may overestimate). */
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
161 p = ptr;
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
162 while ((c = *p++) && c != ':' && c != '\n')
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
163 ;
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
164 ret = (char *) xmalloc (p - ptr + 1);
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
165 }
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
166 else
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
167 ret = *area;
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
168
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
169 /* Copy the string value, stopping at null or colon.
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
170 Also process ^ and \ abbreviations. */
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
171 p = ptr;
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
172 r = ret;
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
173 while ((c = *p++) && c != ':' && c != '\n')
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
174 {
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
175 if (c == '^')
10186
af0b61d21a8f (tgetst1): Let ^? stand for DEL character.
Richard M. Stallman <rms@gnu.org>
parents: 7785
diff changeset
176 {
af0b61d21a8f (tgetst1): Let ^? stand for DEL character.
Richard M. Stallman <rms@gnu.org>
parents: 7785
diff changeset
177 c = *p++;
af0b61d21a8f (tgetst1): Let ^? stand for DEL character.
Richard M. Stallman <rms@gnu.org>
parents: 7785
diff changeset
178 if (c == '?')
af0b61d21a8f (tgetst1): Let ^? stand for DEL character.
Richard M. Stallman <rms@gnu.org>
parents: 7785
diff changeset
179 c = 0177;
af0b61d21a8f (tgetst1): Let ^? stand for DEL character.
Richard M. Stallman <rms@gnu.org>
parents: 7785
diff changeset
180 else
af0b61d21a8f (tgetst1): Let ^? stand for DEL character.
Richard M. Stallman <rms@gnu.org>
parents: 7785
diff changeset
181 c &= 037;
af0b61d21a8f (tgetst1): Let ^? stand for DEL character.
Richard M. Stallman <rms@gnu.org>
parents: 7785
diff changeset
182 }
7306
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
183 else if (c == '\\')
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
184 {
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
185 c = *p++;
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
186 if (c >= '0' && c <= '7')
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
187 {
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
188 c -= '0';
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
189 size = 0;
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
190
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
191 while (++size < 3 && (c1 = *p) >= '0' && c1 <= '7')
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
192 {
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
193 c *= 8;
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
194 c += c1 - '0';
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
195 p++;
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
196 }
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
197 }
23071
3790e185acc0 (tgetst1): Supprt EBCDIC systems.
Richard M. Stallman <rms@gnu.org>
parents: 22066
diff changeset
198 #ifdef IS_EBCDIC_HOST
3790e185acc0 (tgetst1): Supprt EBCDIC systems.
Richard M. Stallman <rms@gnu.org>
parents: 22066
diff changeset
199 else if (c >= 0200 && c < 0360)
3790e185acc0 (tgetst1): Supprt EBCDIC systems.
Richard M. Stallman <rms@gnu.org>
parents: 22066
diff changeset
200 {
3790e185acc0 (tgetst1): Supprt EBCDIC systems.
Richard M. Stallman <rms@gnu.org>
parents: 22066
diff changeset
201 c1 = esctab[(c & ~0100) - 0200];
3790e185acc0 (tgetst1): Supprt EBCDIC systems.
Richard M. Stallman <rms@gnu.org>
parents: 22066
diff changeset
202 if (c1 != ' ')
3790e185acc0 (tgetst1): Supprt EBCDIC systems.
Richard M. Stallman <rms@gnu.org>
parents: 22066
diff changeset
203 c = c1;
3790e185acc0 (tgetst1): Supprt EBCDIC systems.
Richard M. Stallman <rms@gnu.org>
parents: 22066
diff changeset
204 }
3790e185acc0 (tgetst1): Supprt EBCDIC systems.
Richard M. Stallman <rms@gnu.org>
parents: 22066
diff changeset
205 #else
7306
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
206 else if (c >= 0100 && c < 0200)
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
207 {
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
208 c1 = esctab[(c & ~040) - 0100];
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
209 if (c1 != ' ')
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
210 c = c1;
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
211 }
23071
3790e185acc0 (tgetst1): Supprt EBCDIC systems.
Richard M. Stallman <rms@gnu.org>
parents: 22066
diff changeset
212 #endif
7306
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
213 }
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
214 *r++ = c;
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
215 }
53306
9e78a65be39a (tgetst1): Scan for "%pN"; if all
Thien-Thi Nguyen <ttn@gnuvola.org>
parents: 52401
diff changeset
216
9e78a65be39a (tgetst1): Scan for "%pN"; if all
Thien-Thi Nguyen <ttn@gnuvola.org>
parents: 52401
diff changeset
217 /* Sometimes entries have "%pN" which means use parameter N in the
9e78a65be39a (tgetst1): Scan for "%pN"; if all
Thien-Thi Nguyen <ttn@gnuvola.org>
parents: 52401
diff changeset
218 next %-substitution. If all such N are continuous in the range
9e78a65be39a (tgetst1): Scan for "%pN"; if all
Thien-Thi Nguyen <ttn@gnuvola.org>
parents: 52401
diff changeset
219 [1,9] we can remove each "%pN" because they are redundant, thus
9e78a65be39a (tgetst1): Scan for "%pN"; if all
Thien-Thi Nguyen <ttn@gnuvola.org>
parents: 52401
diff changeset
220 reducing bandwidth requirements. True, Emacs is well beyond the
9e78a65be39a (tgetst1): Scan for "%pN"; if all
Thien-Thi Nguyen <ttn@gnuvola.org>
parents: 52401
diff changeset
221 days of 150baud teletypes, but some of its users aren't much so.
9e78a65be39a (tgetst1): Scan for "%pN"; if all
Thien-Thi Nguyen <ttn@gnuvola.org>
parents: 52401
diff changeset
222
9e78a65be39a (tgetst1): Scan for "%pN"; if all
Thien-Thi Nguyen <ttn@gnuvola.org>
parents: 52401
diff changeset
223 This pass could probably be integrated into the one above but
9e78a65be39a (tgetst1): Scan for "%pN"; if all
Thien-Thi Nguyen <ttn@gnuvola.org>
parents: 52401
diff changeset
224 abbreviation expansion makes that effort a little more hairy than
9e78a65be39a (tgetst1): Scan for "%pN"; if all
Thien-Thi Nguyen <ttn@gnuvola.org>
parents: 52401
diff changeset
225 its worth; this is cleaner. */
9e78a65be39a (tgetst1): Scan for "%pN"; if all
Thien-Thi Nguyen <ttn@gnuvola.org>
parents: 52401
diff changeset
226 {
9e78a65be39a (tgetst1): Scan for "%pN"; if all
Thien-Thi Nguyen <ttn@gnuvola.org>
parents: 52401
diff changeset
227 register int last_p_param = 0;
9e78a65be39a (tgetst1): Scan for "%pN"; if all
Thien-Thi Nguyen <ttn@gnuvola.org>
parents: 52401
diff changeset
228 int remove_p_params = 1;
9e78a65be39a (tgetst1): Scan for "%pN"; if all
Thien-Thi Nguyen <ttn@gnuvola.org>
parents: 52401
diff changeset
229 struct { char *beg; int len; } cut[11];
9e78a65be39a (tgetst1): Scan for "%pN"; if all
Thien-Thi Nguyen <ttn@gnuvola.org>
parents: 52401
diff changeset
230
9e78a65be39a (tgetst1): Scan for "%pN"; if all
Thien-Thi Nguyen <ttn@gnuvola.org>
parents: 52401
diff changeset
231 for (cut[0].beg = p = ret; p < r - 3; p++)
9e78a65be39a (tgetst1): Scan for "%pN"; if all
Thien-Thi Nguyen <ttn@gnuvola.org>
parents: 52401
diff changeset
232 {
9e78a65be39a (tgetst1): Scan for "%pN"; if all
Thien-Thi Nguyen <ttn@gnuvola.org>
parents: 52401
diff changeset
233 if (!remove_p_params)
9e78a65be39a (tgetst1): Scan for "%pN"; if all
Thien-Thi Nguyen <ttn@gnuvola.org>
parents: 52401
diff changeset
234 break;
9e78a65be39a (tgetst1): Scan for "%pN"; if all
Thien-Thi Nguyen <ttn@gnuvola.org>
parents: 52401
diff changeset
235 if (*p == '%' && *(p + 1) == 'p')
9e78a65be39a (tgetst1): Scan for "%pN"; if all
Thien-Thi Nguyen <ttn@gnuvola.org>
parents: 52401
diff changeset
236 {
9e78a65be39a (tgetst1): Scan for "%pN"; if all
Thien-Thi Nguyen <ttn@gnuvola.org>
parents: 52401
diff changeset
237 if (*(p + 2) - '0' == 1 + last_p_param)
9e78a65be39a (tgetst1): Scan for "%pN"; if all
Thien-Thi Nguyen <ttn@gnuvola.org>
parents: 52401
diff changeset
238 {
9e78a65be39a (tgetst1): Scan for "%pN"; if all
Thien-Thi Nguyen <ttn@gnuvola.org>
parents: 52401
diff changeset
239 cut[last_p_param].len = p - cut[last_p_param].beg;
9e78a65be39a (tgetst1): Scan for "%pN"; if all
Thien-Thi Nguyen <ttn@gnuvola.org>
parents: 52401
diff changeset
240 last_p_param++;
9e78a65be39a (tgetst1): Scan for "%pN"; if all
Thien-Thi Nguyen <ttn@gnuvola.org>
parents: 52401
diff changeset
241 p += 3;
9e78a65be39a (tgetst1): Scan for "%pN"; if all
Thien-Thi Nguyen <ttn@gnuvola.org>
parents: 52401
diff changeset
242 cut[last_p_param].beg = p;
9e78a65be39a (tgetst1): Scan for "%pN"; if all
Thien-Thi Nguyen <ttn@gnuvola.org>
parents: 52401
diff changeset
243 }
9e78a65be39a (tgetst1): Scan for "%pN"; if all
Thien-Thi Nguyen <ttn@gnuvola.org>
parents: 52401
diff changeset
244 else /* not continuous: bail */
9e78a65be39a (tgetst1): Scan for "%pN"; if all
Thien-Thi Nguyen <ttn@gnuvola.org>
parents: 52401
diff changeset
245 remove_p_params = 0;
9e78a65be39a (tgetst1): Scan for "%pN"; if all
Thien-Thi Nguyen <ttn@gnuvola.org>
parents: 52401
diff changeset
246 if (last_p_param > 10) /* too many: bail */
9e78a65be39a (tgetst1): Scan for "%pN"; if all
Thien-Thi Nguyen <ttn@gnuvola.org>
parents: 52401
diff changeset
247 remove_p_params = 0;
9e78a65be39a (tgetst1): Scan for "%pN"; if all
Thien-Thi Nguyen <ttn@gnuvola.org>
parents: 52401
diff changeset
248 }
9e78a65be39a (tgetst1): Scan for "%pN"; if all
Thien-Thi Nguyen <ttn@gnuvola.org>
parents: 52401
diff changeset
249 }
9e78a65be39a (tgetst1): Scan for "%pN"; if all
Thien-Thi Nguyen <ttn@gnuvola.org>
parents: 52401
diff changeset
250 if (remove_p_params && last_p_param)
9e78a65be39a (tgetst1): Scan for "%pN"; if all
Thien-Thi Nguyen <ttn@gnuvola.org>
parents: 52401
diff changeset
251 {
9e78a65be39a (tgetst1): Scan for "%pN"; if all
Thien-Thi Nguyen <ttn@gnuvola.org>
parents: 52401
diff changeset
252 register int i;
9e78a65be39a (tgetst1): Scan for "%pN"; if all
Thien-Thi Nguyen <ttn@gnuvola.org>
parents: 52401
diff changeset
253 char *wp;
9e78a65be39a (tgetst1): Scan for "%pN"; if all
Thien-Thi Nguyen <ttn@gnuvola.org>
parents: 52401
diff changeset
254
9e78a65be39a (tgetst1): Scan for "%pN"; if all
Thien-Thi Nguyen <ttn@gnuvola.org>
parents: 52401
diff changeset
255 cut[last_p_param].len = r - cut[last_p_param].beg;
9e78a65be39a (tgetst1): Scan for "%pN"; if all
Thien-Thi Nguyen <ttn@gnuvola.org>
parents: 52401
diff changeset
256 for (i = 0, wp = ret; i <= last_p_param; wp += cut[i++].len)
109165
750db9f3e6d8 Replace bcopy, bzero, bcmp by memcpy, memmove, memset, memcmp
Andreas Schwab <schwab@linux-m68k.org>
parents: 109126
diff changeset
257 memcpy (wp, cut[i].beg, cut[i].len);
53306
9e78a65be39a (tgetst1): Scan for "%pN"; if all
Thien-Thi Nguyen <ttn@gnuvola.org>
parents: 52401
diff changeset
258 r = wp;
9e78a65be39a (tgetst1): Scan for "%pN"; if all
Thien-Thi Nguyen <ttn@gnuvola.org>
parents: 52401
diff changeset
259 }
9e78a65be39a (tgetst1): Scan for "%pN"; if all
Thien-Thi Nguyen <ttn@gnuvola.org>
parents: 52401
diff changeset
260 }
9e78a65be39a (tgetst1): Scan for "%pN"; if all
Thien-Thi Nguyen <ttn@gnuvola.org>
parents: 52401
diff changeset
261
7306
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
262 *r = '\0';
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
263 /* Update *AREA. */
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
264 if (area)
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
265 *area = r + 1;
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
266 return ret;
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
267 }
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
268
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
269 /* Outputting a string with padding. */
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
270
43674
53deca397c95 [!emacs]: Replace ospeed for building standalone
Richard M. Stallman <rms@gnu.org>
parents: 37864
diff changeset
271 #ifndef emacs
53deca397c95 [!emacs]: Replace ospeed for building standalone
Richard M. Stallman <rms@gnu.org>
parents: 37864
diff changeset
272 short ospeed;
7306
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
273 /* If OSPEED is 0, we use this as the actual baud rate. */
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
274 int tputs_baud_rate;
43674
53deca397c95 [!emacs]: Replace ospeed for building standalone
Richard M. Stallman <rms@gnu.org>
parents: 37864
diff changeset
275 #endif
44890
01b93e5e53a7 Patch for building Emacs on Mac OS X. April 26, 2002. See ChangeLog,
Andrew Choi <akochoi@shaw.ca>
parents: 43713
diff changeset
276
7306
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
277 char PC;
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
278
43674
53deca397c95 [!emacs]: Replace ospeed for building standalone
Richard M. Stallman <rms@gnu.org>
parents: 37864
diff changeset
279 #ifndef emacs
7306
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
280 /* Actual baud rate if positive;
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
281 - baud rate / 100 if negative. */
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
282
105959
ba3ffbd9c422 * process.c (ifflag_def): Make flag_sym constant.
Dan Nicolaescu <dann@ics.uci.edu>
parents: 105669
diff changeset
283 static const int speeds[] =
7306
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
284 {
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
285 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
286 -18, -24, -48, -96, -192, -288, -384, -576, -1152
7306
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
287 };
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
288
43674
53deca397c95 [!emacs]: Replace ospeed for building standalone
Richard M. Stallman <rms@gnu.org>
parents: 37864
diff changeset
289 #endif /* not emacs */
37864
db3e294b4ce2 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents: 34358
diff changeset
290
7306
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
291 void
109126
aec1143e8d85 Convert (most) functions in src to standard C.
Dan Nicolaescu <dann@ics.uci.edu>
parents: 105959
diff changeset
292 tputs (register char *str, int nlines, register int (*outfun) (/* ??? */))
7306
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
293 {
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
294 register int padcount = 0;
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
295 register int speed;
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
296
43674
53deca397c95 [!emacs]: Replace ospeed for building standalone
Richard M. Stallman <rms@gnu.org>
parents: 37864
diff changeset
297 #ifdef emacs
43713
f92c4d87863a Change defvar_int def and vars to use EMACS_INT instead of just int.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 43674
diff changeset
298 extern EMACS_INT baud_rate;
7306
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
299 speed = baud_rate;
10739
97096cdf6e55 (speeds): Make it ints. Add some higher speeds.
Richard M. Stallman <rms@gnu.org>
parents: 10186
diff changeset
300 /* 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
301 units to avoid overflow. */
97096cdf6e55 (speeds): Make it ints. Add some higher speeds.
Richard M. Stallman <rms@gnu.org>
parents: 10186
diff changeset
302 if (speed > 10000)
97096cdf6e55 (speeds): Make it ints. Add some higher speeds.
Richard M. Stallman <rms@gnu.org>
parents: 10186
diff changeset
303 speed = - speed / 100;
43674
53deca397c95 [!emacs]: Replace ospeed for building standalone
Richard M. Stallman <rms@gnu.org>
parents: 37864
diff changeset
304 #else
53deca397c95 [!emacs]: Replace ospeed for building standalone
Richard M. Stallman <rms@gnu.org>
parents: 37864
diff changeset
305 if (ospeed == 0)
53deca397c95 [!emacs]: Replace ospeed for building standalone
Richard M. Stallman <rms@gnu.org>
parents: 37864
diff changeset
306 speed = tputs_baud_rate;
53deca397c95 [!emacs]: Replace ospeed for building standalone
Richard M. Stallman <rms@gnu.org>
parents: 37864
diff changeset
307 else
53deca397c95 [!emacs]: Replace ospeed for building standalone
Richard M. Stallman <rms@gnu.org>
parents: 37864
diff changeset
308 speed = speeds[ospeed];
53deca397c95 [!emacs]: Replace ospeed for building standalone
Richard M. Stallman <rms@gnu.org>
parents: 37864
diff changeset
309 #endif
7306
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
310
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
311 if (!str)
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
312 return;
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
313
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
314 while (*str >= '0' && *str <= '9')
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
315 {
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
316 padcount += *str++ - '0';
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
317 padcount *= 10;
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
318 }
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
319 if (*str == '.')
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
320 {
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
321 str++;
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
322 padcount += *str++ - '0';
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
323 }
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
324 if (*str == '*')
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
325 {
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
326 str++;
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
327 padcount *= nlines;
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
328 }
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
329 while (*str)
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
330 (*outfun) (*str++);
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
331
10739
97096cdf6e55 (speeds): Make it ints. Add some higher speeds.
Richard M. Stallman <rms@gnu.org>
parents: 10186
diff changeset
332 /* PADCOUNT is now in units of tenths of msec.
10753
e0de204ec865 Comment changed.
Richard M. Stallman <rms@gnu.org>
parents: 10739
diff changeset
333 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
334 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
335 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
336 padcount *= speed;
7306
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
337 padcount += 500;
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
338 padcount /= 1000;
10739
97096cdf6e55 (speeds): Make it ints. Add some higher speeds.
Richard M. Stallman <rms@gnu.org>
parents: 10186
diff changeset
339 if (speed < 0)
7306
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
340 padcount = -padcount;
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
341 else
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
342 {
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
343 padcount += 50;
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
344 padcount /= 100;
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
345 }
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
346
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
347 while (padcount-- > 0)
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
348 (*outfun) (PC);
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
349 }
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
350
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
351 /* Finding the termcap entry in the termcap data base. */
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
352
22066
a09f2b697d0a Renamed "struct buffer" to "struct termcap_buffer" to
Richard M. Stallman <rms@gnu.org>
parents: 14414
diff changeset
353 struct termcap_buffer
7306
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
354 {
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
355 char *beg;
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
356 int size;
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
357 char *ptr;
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
358 int ateof;
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
359 int full;
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
360 };
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
361
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
362 /* Forward declarations of static functions. */
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
363
109126
aec1143e8d85 Convert (most) functions in src to standard C.
Dan Nicolaescu <dann@ics.uci.edu>
parents: 105959
diff changeset
364 static int scan_file (char *str, int fd, register struct termcap_buffer *bufp);
aec1143e8d85 Convert (most) functions in src to standard C.
Dan Nicolaescu <dann@ics.uci.edu>
parents: 105959
diff changeset
365 static char *gobble_line (int fd, register struct termcap_buffer *bufp, char *append_end);
aec1143e8d85 Convert (most) functions in src to standard C.
Dan Nicolaescu <dann@ics.uci.edu>
parents: 105959
diff changeset
366 static int compare_contin (register char *str1, register char *str2);
aec1143e8d85 Convert (most) functions in src to standard C.
Dan Nicolaescu <dann@ics.uci.edu>
parents: 105959
diff changeset
367 static int name_match (char *line, char *name);
7306
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
368
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
369 #ifdef MSDOS /* MW, May 1993 */
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
370 static int
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
371 valid_filename_p (fn)
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
372 char *fn;
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
373 {
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
374 return *fn == '/' || fn[1] == ':';
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
375 }
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
376 #else
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
377 #define valid_filename_p(fn) (*(fn) == '/')
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
378 #endif
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
379
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
380 /* Find the termcap entry data for terminal type NAME
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
381 and store it in the block that BP points to.
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
382 Record its address for future use.
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
383
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
384 If BP is null, space is dynamically allocated.
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
385
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
386 Return -1 if there is some difficulty accessing the data base
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
387 of terminal types,
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
388 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
389 in it, and some other value otherwise. */
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
390
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
391 int
109126
aec1143e8d85 Convert (most) functions in src to standard C.
Dan Nicolaescu <dann@ics.uci.edu>
parents: 105959
diff changeset
392 tgetent (char *bp, char *name)
7306
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
393 {
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
394 register char *termcap_name;
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
395 register int fd;
22066
a09f2b697d0a Renamed "struct buffer" to "struct termcap_buffer" to
Richard M. Stallman <rms@gnu.org>
parents: 14414
diff changeset
396 struct termcap_buffer buf;
7306
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
397 register char *bp1;
14132
85063feb159b (tgetent): Find all the tc caps that there are.
Karl Heuer <kwzh@gnu.org>
parents: 13677
diff changeset
398 char *tc_search_point;
7306
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
399 char *term;
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
400 int malloc_size = 0;
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
401 register int c;
33616
f7e2e0758251 (ospeed): Remove.
Gerd Moellmann <gerd@gnu.org>
parents: 29804
diff changeset
402 char *tcenv = NULL; /* TERMCAP value, if it contains :tc=. */
7306
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
403 char *indirect = NULL; /* Terminal type in :tc= in TERMCAP value. */
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
404 int filep;
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
405
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
406 #ifdef INTERNAL_TERMINAL
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
407 /* For the internal terminal we don't want to read any termcap file,
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
408 so fake it. */
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
409 if (!strcmp (name, "internal"))
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
410 {
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
411 term = INTERNAL_TERMINAL;
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
412 if (!bp)
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
413 {
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
414 malloc_size = 1 + strlen (term);
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
415 bp = (char *) xmalloc (malloc_size);
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
416 }
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
417 strcpy (bp, term);
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
418 goto ret;
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
419 }
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
420 #endif /* INTERNAL_TERMINAL */
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
421
12907
6cae53a06172 default to user-supplied buffer.
David J. MacKenzie <djm@gnu.org>
parents: 12679
diff changeset
422 /* 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
423 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
424 if (bp)
6cae53a06172 default to user-supplied buffer.
David J. MacKenzie <djm@gnu.org>
parents: 12679
diff changeset
425 term_entry = bp;
6cae53a06172 default to user-supplied buffer.
David J. MacKenzie <djm@gnu.org>
parents: 12679
diff changeset
426
7306
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
427 termcap_name = getenv ("TERMCAP");
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
428 if (termcap_name && *termcap_name == '\0')
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
429 termcap_name = NULL;
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
430 #if defined (MSDOS) && !defined (TEST)
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
431 if (termcap_name && (*termcap_name == '\\'
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
432 || *termcap_name == '/'
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
433 || termcap_name[1] == ':'))
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
434 dostounix_filename(termcap_name);
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
435 #endif
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
436
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
437 filep = termcap_name && valid_filename_p (termcap_name);
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
438
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
439 /* 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
440 it is a file name to use instead of /etc/termcap.
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
441 If it is non-null and does not start with /,
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
442 it is the entry itself, but only if
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
443 the name the caller requested matches the TERM variable. */
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
444
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
445 if (termcap_name && !filep && !strcmp (name, getenv ("TERM")))
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
446 {
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
447 indirect = tgetst1 (find_capability (termcap_name, "tc"), (char **) 0);
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
448 if (!indirect)
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
449 {
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
450 if (!bp)
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
451 bp = termcap_name;
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
452 else
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
453 strcpy (bp, termcap_name);
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
454 goto ret;
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
455 }
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
456 else
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
457 { /* It has tc=. Need to read /etc/termcap. */
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
458 tcenv = termcap_name;
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
459 termcap_name = NULL;
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
460 }
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
461 }
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
462
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
463 if (!termcap_name || !filep)
12679
a14b26e55f25 TERMCAP_NAME -> TERMCAP_FILE.
David J. MacKenzie <djm@gnu.org>
parents: 12675
diff changeset
464 termcap_name = TERMCAP_FILE;
7306
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
465
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
466 /* 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
467
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
468 #ifdef MSDOS
7685
5fbc009f3dc3 *** empty log message ***
Roland McGrath <roland@gnu.org>
parents: 7306
diff changeset
469 fd = open (termcap_name, O_RDONLY|O_TEXT, 0);
7306
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
470 #else
7685
5fbc009f3dc3 *** empty log message ***
Roland McGrath <roland@gnu.org>
parents: 7306
diff changeset
471 fd = open (termcap_name, O_RDONLY, 0);
7306
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
472 #endif
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
473 if (fd < 0)
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
474 return -1;
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
475
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
476 buf.size = BUFSIZE;
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
477 /* Add 1 to size to ensure room for terminating null. */
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
478 buf.beg = (char *) xmalloc (buf.size + 1);
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
479 term = indirect ? indirect : name;
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
480
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
481 if (!bp)
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
482 {
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
483 malloc_size = indirect ? strlen (tcenv) + 1 : buf.size;
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
484 bp = (char *) xmalloc (malloc_size);
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
485 }
14132
85063feb159b (tgetent): Find all the tc caps that there are.
Karl Heuer <kwzh@gnu.org>
parents: 13677
diff changeset
486 tc_search_point = bp1 = bp;
7306
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
487
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
488 if (indirect)
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
489 /* Copy the data from the environment variable. */
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
490 {
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
491 strcpy (bp, tcenv);
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
492 bp1 += strlen (tcenv);
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
493 }
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
494
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
495 while (term)
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
496 {
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
497 /* Scan the file, reading it via buf, till find start of main entry. */
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
498 if (scan_file (term, fd, &buf) == 0)
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
499 {
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
500 close (fd);
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
501 free (buf.beg);
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
502 if (malloc_size)
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
503 free (bp);
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
504 return 0;
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
505 }
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
506
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
507 /* Free old `term' if appropriate. */
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
508 if (term != name)
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
509 free (term);
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
510
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
511 /* If BP is malloc'd by us, make sure it is big enough. */
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
512 if (malloc_size)
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
513 {
34358
aa3b69684dbf (tgetent): Change the way buffers are reallocated to
Gerd Moellmann <gerd@gnu.org>
parents: 33616
diff changeset
514 int offset1 = bp1 - bp, offset2 = tc_search_point - bp;
aa3b69684dbf (tgetent): Change the way buffers are reallocated to
Gerd Moellmann <gerd@gnu.org>
parents: 33616
diff changeset
515 malloc_size = offset1 + buf.size;
aa3b69684dbf (tgetent): Change the way buffers are reallocated to
Gerd Moellmann <gerd@gnu.org>
parents: 33616
diff changeset
516 bp = termcap_name = (char *) xrealloc (bp, malloc_size);
aa3b69684dbf (tgetent): Change the way buffers are reallocated to
Gerd Moellmann <gerd@gnu.org>
parents: 33616
diff changeset
517 bp1 = termcap_name + offset1;
aa3b69684dbf (tgetent): Change the way buffers are reallocated to
Gerd Moellmann <gerd@gnu.org>
parents: 33616
diff changeset
518 tc_search_point = termcap_name + offset2;
7306
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
519 }
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
520
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
521 /* Copy the line of the entry from buf into bp. */
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
522 termcap_name = buf.ptr;
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
523 while ((*bp1++ = c = *termcap_name++) && c != '\n')
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
524 /* Drop out any \ newline sequence. */
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
525 if (c == '\\' && *termcap_name == '\n')
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
526 {
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
527 bp1--;
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
528 termcap_name++;
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
529 }
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
530 *bp1 = '\0';
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
531
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
532 /* Does this entry refer to another terminal type's entry?
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
533 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
534 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
535 term = tgetst1 (tc_search_point, (char **) 0);
7306
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
536 }
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
537
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
538 close (fd);
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
539 free (buf.beg);
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
540
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 bp = (char *) xrealloc (bp, bp1 - bp + 1);
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
543
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
544 ret:
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
545 term_entry = bp;
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
546 return 1;
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
547 }
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
548
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
549 /* Given file open on FD and buffer BUFP,
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
550 scan the file from the beginning until a line is found
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
551 that starts the entry for terminal type STR.
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
552 Return 1 if successful, with that line in BUFP,
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
553 or 0 if no entry is found in the file. */
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
554
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
555 static int
109126
aec1143e8d85 Convert (most) functions in src to standard C.
Dan Nicolaescu <dann@ics.uci.edu>
parents: 105959
diff changeset
556 scan_file (char *str, int fd, register struct termcap_buffer *bufp)
7306
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
557 {
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
558 register char *end;
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
559
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
560 bufp->ptr = bufp->beg;
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
561 bufp->full = 0;
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
562 bufp->ateof = 0;
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
563 *bufp->ptr = '\0';
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
564
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
565 lseek (fd, 0L, 0);
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
566
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
567 while (!bufp->ateof)
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
568 {
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
569 /* Read a line into the buffer. */
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
570 end = NULL;
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
571 do
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
572 {
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
573 /* if it is continued, append another line to it,
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
574 until a non-continued line ends. */
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
575 end = gobble_line (fd, bufp, end);
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
576 }
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
577 while (!bufp->ateof && end[-2] == '\\');
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
578
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
579 if (*bufp->ptr != '#'
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
580 && name_match (bufp->ptr, str))
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
581 return 1;
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
582
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
583 /* Discard the line just processed. */
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
584 bufp->ptr = end;
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
585 }
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
586 return 0;
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
587 }
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
588
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
589 /* Return nonzero if NAME is one of the names specified
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
590 by termcap entry LINE. */
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
591
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
592 static int
109126
aec1143e8d85 Convert (most) functions in src to standard C.
Dan Nicolaescu <dann@ics.uci.edu>
parents: 105959
diff changeset
593 name_match (char *line, char *name)
7306
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
594 {
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
595 register char *tem;
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
596
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
597 if (!compare_contin (line, name))
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
598 return 1;
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
599 /* This line starts an entry. Is it the right one? */
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
600 for (tem = line; *tem && *tem != '\n' && *tem != ':'; tem++)
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
601 if (*tem == '|' && !compare_contin (tem + 1, name))
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
602 return 1;
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
603
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
604 return 0;
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
605 }
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
606
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
607 static int
109126
aec1143e8d85 Convert (most) functions in src to standard C.
Dan Nicolaescu <dann@ics.uci.edu>
parents: 105959
diff changeset
608 compare_contin (register char *str1, register char *str2)
7306
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
609 {
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
610 register int c1, c2;
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
611 while (1)
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
612 {
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
613 c1 = *str1++;
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
614 c2 = *str2++;
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
615 while (c1 == '\\' && *str1 == '\n')
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
616 {
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
617 str1++;
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
618 while ((c1 = *str1++) == ' ' || c1 == '\t');
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
619 }
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
620 if (c2 == '\0')
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
621 {
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
622 /* End of type being looked up. */
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
623 if (c1 == '|' || c1 == ':')
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
624 /* If end of name in data base, we win. */
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
625 return 0;
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
626 else
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
627 return 1;
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
628 }
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
629 else if (c1 != c2)
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
630 return 1;
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
631 }
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
632 }
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
633
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
634 /* Make sure that the buffer <- BUFP contains a full line
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
635 of the file open on FD, starting at the place BUFP->ptr
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
636 points to. Can read more of the file, discard stuff before
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
637 BUFP->ptr, or make the buffer bigger.
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
638
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
639 Return the pointer to after the newline ending the line,
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
640 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
641
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
642 Can also merge on continuation lines. If APPEND_END is
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
643 non-null, it points past the newline of a line that is
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
644 continued; we add another line onto it and regard the whole
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
645 thing as one line. The caller decides when a line is continued. */
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
646
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
647 static char *
109126
aec1143e8d85 Convert (most) functions in src to standard C.
Dan Nicolaescu <dann@ics.uci.edu>
parents: 105959
diff changeset
648 gobble_line (int fd, register struct termcap_buffer *bufp, char *append_end)
7306
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
649 {
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
650 register char *end;
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
651 register int nread;
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
652 register char *buf = bufp->beg;
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
653 register char *tem;
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
654
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
655 if (!append_end)
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
656 append_end = bufp->ptr;
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
657
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
658 while (1)
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
659 {
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
660 end = append_end;
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
661 while (*end && *end != '\n') end++;
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
662 if (*end)
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
663 break;
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
664 if (bufp->ateof)
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
665 return buf + bufp->full;
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
666 if (bufp->ptr == buf)
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
667 {
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
668 if (bufp->full == bufp->size)
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
669 {
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
670 bufp->size *= 2;
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
671 /* Add 1 to size to ensure room for terminating null. */
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
672 tem = (char *) xrealloc (buf, bufp->size + 1);
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
673 bufp->ptr = (bufp->ptr - buf) + tem;
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
674 append_end = (append_end - buf) + tem;
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
675 bufp->beg = buf = tem;
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
676 }
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
677 }
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
678 else
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
679 {
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
680 append_end -= bufp->ptr - buf;
109165
750db9f3e6d8 Replace bcopy, bzero, bcmp by memcpy, memmove, memset, memcmp
Andreas Schwab <schwab@linux-m68k.org>
parents: 109126
diff changeset
681 memcpy (buf, bufp->ptr, bufp->full -= bufp->ptr - buf);
7306
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
682 bufp->ptr = buf;
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
683 }
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
684 if (!(nread = read (fd, buf + bufp->full, bufp->size - bufp->full)))
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
685 bufp->ateof = 1;
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
686 bufp->full += nread;
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
687 buf[bufp->full] = '\0';
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
688 }
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
689 return end + 1;
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
690 }
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
691
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
692 #ifdef TEST
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
693
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
694 #ifdef NULL
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
695 #undef NULL
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
696 #endif
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
697
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
698 #include <stdio.h>
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
699
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
700 main (argc, argv)
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
701 int argc;
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
702 char **argv;
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
703 {
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
704 char *term;
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
705 char *buf;
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
706
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
707 term = argv[1];
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
708 printf ("TERM: %s\n", term);
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
709
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
710 buf = (char *) tgetent (0, term);
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
711 if ((int) buf <= 0)
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
712 {
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
713 printf ("No entry.\n");
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
714 return 0;
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
715 }
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
716
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
717 printf ("Entry: %s\n", buf);
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
718
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
719 tprint ("cm");
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
720 tprint ("AL");
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
721
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
722 printf ("co: %d\n", tgetnum ("co"));
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
723 printf ("am: %d\n", tgetflag ("am"));
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
724 }
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
725
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
726 tprint (cap)
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
727 char *cap;
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
728 {
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
729 char *x = tgetstr (cap, 0);
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
730 register char *y;
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
731
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
732 printf ("%s: ", cap);
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
733 if (x)
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
734 {
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
735 for (y = x; *y; y++)
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
736 if (*y <= ' ' || *y == 0177)
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
737 printf ("\\%0o", *y);
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
738 else
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
739 putchar (*y);
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
740 free (x);
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
741 }
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
742 else
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
743 printf ("none");
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
744 putchar ('\n');
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
745 }
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
746
1f2f6bb3690f Initial revision
Roland McGrath <roland@gnu.org>
parents:
diff changeset
747 #endif /* TEST */
52401
695cf19ef79e Add arch taglines
Miles Bader <miles@gnu.org>
parents: 51400
diff changeset
748
695cf19ef79e Add arch taglines
Miles Bader <miles@gnu.org>
parents: 51400
diff changeset
749 /* arch-tag: c2e8d427-2271-4fac-95fe-411857238b80
695cf19ef79e Add arch taglines
Miles Bader <miles@gnu.org>
parents: 51400
diff changeset
750 (do not change this comment) */