1 /* $Header: /src/pub/tcsh/vms.termcap.c,v 1.6 2000/06/10 23:32:42 kim Exp $ */
3 * termcap.c 1.1 20/7/87 agc Joypace Ltd
5 * Copyright Joypace Ltd, London, UK, 1987. All rights reserved.
6 * This file may be freely distributed provided that this notice
9 * A public domain implementation of the termcap(3) routines.
12 RCSID("$Id: vms.termcap.c,v 1.6 2000/06/10 23:32:42 kim Exp $")
13 #if defined(_VMS_POSIX) || defined(_OSD_POSIX)
16 - Correct when TERM != name and TERMCAP is defined [tgetent]
17 - Correct the comparison for the terminal name [tgetent]
18 - Correct the value of ^x escapes [tgetstr]
19 - Added %r to reverse row/column [tgoto]
21 Paul Gillingwater <paul@actrix.gen.nz> July 1992
22 - Modified to allow terminal aliases in termcap file
23 - Uses TERMCAP environment variable for file only
31 #define ISSPACE(c) ((c) == ' ' || (c) == '\t' || (c) == '\r' || (c) == '\n')
32 #define ISDIGIT(x) ((x) >= '0' && (x) <= '9')
34 char *capab
; /* the capability itself */
36 extern char *getenv(); /* new, improved getenv */
37 extern FILE *fopen(); /* old fopen */
40 * tgetent - get the termcap entry for terminal name, and put it
41 * in bp (which must be an array of 1024 chars). Returns 1 if
42 * termcap entry found, 0 if not found, and -1 if file not found.
53 *ptr
, /* temporary pointer */
54 tmp
[1024]; /* buffer for terminal name */
55 short len
= strlen(name
);
59 /* Use TERMCAP to override default. */
61 termfile
= getenv("TERMCAP");
62 if (termfile
== NULL
) termfile
= "/etc/termcap";
64 if ((fp
= fopen(termfile
, "r")) == (FILE *) NULL
) {
65 fprintf(stderr
, CGETS(31, 1,
66 "Can't open TERMCAP: [%s]\n"), termfile
);
67 fprintf(stderr
, CGETS(31, 2, "Can't open %s.\n"), termfile
);
72 while (fgets(bp
, 1024, fp
) != NULL
) {
73 /* Any line starting with # or NL is skipped as a comment */
74 if ((*bp
== '#') || (*bp
== '\n')) continue;
76 /* Look for lines which end with two backslashes,
77 and then append the next line. */
78 while (*(cp
= &bp
[strlen(bp
) - 2]) == '\\')
81 /* Skip over any spaces or tabs */
82 for (++cp
; ISSPACE(*cp
) ; cp
++);
84 /* Make sure "name" matches exactly (efth) */
86 /* Here we might want to look at any aliases as well. We'll use
87 sscanf to look at aliases. These are delimited by '|'. */
89 sscanf(bp
,"%[^|]",tmp
);
90 if (strncmp(name
, tmp
, len
) == 0) {
93 fprintf(stderr
, CGETS(31, 3, "Found %s in %s.\n"), name
, termfile
);
99 while ((ptr
= strchr(ptr
,'|')) != NULL
) {
101 if (strchr(ptr
,'|') == NULL
) break;
102 sscanf(ptr
,"%[^|]",tmp
);
103 if (strncmp(name
, tmp
, len
) == 0) {
106 fprintf(stderr
,CGETS(31, 3, "Found %s in %s.\n"), name
, termfile
);
113 /* If we get here, then we haven't found a match. */
116 fprintf(stderr
,CGETS(31, 4, "No match found for %s in file %s\n"),
125 * tgetnum - get the numeric terminal capability corresponding
126 * to id. Returns the value, -1 if invalid.
135 if ((cp
= capab
) == NULL
|| id
== NULL
)
139 for (++cp
; *cp
; cp
++) {
142 if (strncmp(cp
, id
, CAPABLEN
) == 0) {
143 while (*cp
&& *cp
!= ':' && *cp
!= '#')
147 for (ret
= 0, cp
++ ; *cp
&& ISDIGIT(*cp
) ; cp
++)
148 ret
= ret
* 10 + *cp
- '0';
151 while (*cp
&& *cp
!= ':')
158 * tgetflag - get the boolean flag corresponding to id. Returns -1
159 * if invalid, 0 if the flag is not in termcap entry, or 1 if it is
168 if ((cp
= capab
) == NULL
|| id
== NULL
)
172 for (++cp
; *cp
; cp
++) {
175 if (strncmp(cp
, id
, CAPABLEN
) == 0)
177 while (*cp
&& *cp
!= ':')
184 * tgetstr - get the string capability corresponding to id and place
185 * it in area (advancing area at same time). Expand escape sequences
186 * etc. Returns the string, or NULL if it can't do it.
197 if ((cp
= capab
) == NULL
|| id
== NULL
)
201 for (++cp
; *cp
; cp
++) {
204 if (strncmp(cp
, id
, CAPABLEN
) == 0) {
205 while (*cp
&& *cp
!= ':' && *cp
!= '=')
209 for (ret
= *area
, cp
++; *cp
&& *cp
!= ':' ;
213 **area
= *++cp
- '@'; /* fix (efth)*/
218 **area
= CTL_ESC('\033');
239 for (i
=0 ; *cp
&& ISDIGIT(*cp
) ;
241 i
= i
* 8 + *cp
- '0';
257 while (*cp
&& *cp
!= ':')
264 * tgoto - given the cursor motion string cm, make up the string
265 * for the cursor to go to (destcol, destline), and return the string.
266 * Returns "OOPS" if something's gone wrong, or the string otherwise.
269 tgoto(cm
, destcol
, destline
)
277 int argno
= 0, numval
;
279 for (rp
= ret
; *cm
; cm
++) {
284 numval
= (argno
== 0 ? destline
: destcol
);
286 *rp
++ = numval
+ incr
+ *++cm
;
298 numval
= (argno
== 0 ? destline
: destcol
);
301 *rp
++ = '0' + (numval
/10);
302 *rp
++ = '0' + (numval
%10);
320 * tputs - put the string cp out onto the terminal, using the function
321 * outc. This should do padding for the terminal, but I can't find a
322 * terminal that needs padding at the moment...
325 tputs(cp
, affcnt
, outc
)
332 /* do any padding interpretation - left null for MINIX just now */
337 #endif /* _VMS_POSIX || _OSD_POSIX */