mirror of
https://github.com/GnoConsortium/gno.git
synced 2024-12-21 23:29:16 +00:00
initial checkin
This commit is contained in:
parent
d5a9505472
commit
c6b6448216
27
lib/libtermcap/Makefile
Normal file
27
lib/libtermcap/Makefile
Normal file
@ -0,0 +1,27 @@
|
|||||||
|
# @(#)Makefile 8.1 (Berkeley) 6/4/93
|
||||||
|
|
||||||
|
LIB= termcap
|
||||||
|
SHLIB_MAJOR= 2
|
||||||
|
SHLIB_MINOR= 1
|
||||||
|
CFLAGS+=-DCM_N -DCM_GT -DCM_B -DCM_D -I${.CURDIR}
|
||||||
|
SRCS= termcap.c tgoto.c tputs.c tparm.c tospeed.c
|
||||||
|
|
||||||
|
MAN3= termcap.3
|
||||||
|
MLINKS= termcap.3 tgetent.3 termcap.3 tgetflag.3 termcap.3 tgetnum.3 \
|
||||||
|
termcap.3 tgetstr.3 termcap.3 tgoto.3 termcap.3 tputs.3 \
|
||||||
|
termcap.3 tparm.3
|
||||||
|
LINKS= ${LIBDIR}/libtermcap.a ${LIBDIR}/libtermlib.a
|
||||||
|
.if !defined(NOPIC)
|
||||||
|
LINKS+= ${SHLIBDIR}/libtermcap.so.${SHLIB_MAJOR}.${SHLIB_MINOR} \
|
||||||
|
${SHLIBDIR}/libtermlib.so.${SHLIB_MAJOR}.${SHLIB_MINOR}
|
||||||
|
.endif
|
||||||
|
.if !defined(NOPROFILE)
|
||||||
|
LINKS+= ${LIBDIR}/libtermcap_p.a ${LIBDIR}/libtermlib_p.a
|
||||||
|
.endif
|
||||||
|
|
||||||
|
beforeinstall:
|
||||||
|
-cd ${.CURDIR}; cmp -s termcap.h ${DESTDIR}/usr/include/termcap.h || \
|
||||||
|
${INSTALL} -c -o ${BINOWN} -g ${BINGRP} -m 444 termcap.h \
|
||||||
|
${DESTDIR}/usr/include
|
||||||
|
|
||||||
|
.include <bsd.lib.mk>
|
63
lib/libtermcap/TEST/tc1.c
Normal file
63
lib/libtermcap/TEST/tc1.c
Normal file
@ -0,0 +1,63 @@
|
|||||||
|
/*-
|
||||||
|
* Copyright (c) 1983, 1993
|
||||||
|
* The Regents of the University of California. All rights reserved.
|
||||||
|
*
|
||||||
|
* Redistribution and use in source and binary forms, with or without
|
||||||
|
* modification, are permitted provided that the following conditions
|
||||||
|
* are met:
|
||||||
|
* 1. Redistributions of source code must retain the above copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer.
|
||||||
|
* 2. Redistributions in binary form must reproduce the above copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer in the
|
||||||
|
* documentation and/or other materials provided with the distribution.
|
||||||
|
* 3. All advertising materials mentioning features or use of this software
|
||||||
|
* must display the following acknowledgement:
|
||||||
|
* This product includes software developed by the University of
|
||||||
|
* California, Berkeley and its contributors.
|
||||||
|
* 4. Neither the name of the University nor the names of its contributors
|
||||||
|
* may be used to endorse or promote products derived from this software
|
||||||
|
* without specific prior written permission.
|
||||||
|
*
|
||||||
|
* THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
|
||||||
|
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||||
|
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||||
|
* ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
|
||||||
|
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
||||||
|
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
|
||||||
|
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
|
||||||
|
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
|
||||||
|
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
|
||||||
|
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
|
||||||
|
* SUCH DAMAGE.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef lint
|
||||||
|
static char copyright[] =
|
||||||
|
"@(#) Copyright (c) 1983, 1993\n\
|
||||||
|
The Regents of the University of California. All rights reserved.\n";
|
||||||
|
#endif /* not lint */
|
||||||
|
|
||||||
|
#ifndef lint
|
||||||
|
static char sccsid[] = "@(#)tc1.c 8.1 (Berkeley) 6/4/93";
|
||||||
|
#endif /* not lint */
|
||||||
|
|
||||||
|
/*
|
||||||
|
* tc1 [term]
|
||||||
|
* dummy program to test termlib.
|
||||||
|
* gets entry, counts it, and prints it.
|
||||||
|
*/
|
||||||
|
#include <stdio.h>
|
||||||
|
char buf[1024];
|
||||||
|
char *getenv();
|
||||||
|
|
||||||
|
main(argc, argv) char **argv; {
|
||||||
|
char *p;
|
||||||
|
int rc;
|
||||||
|
|
||||||
|
if (argc < 2)
|
||||||
|
p = getenv("TERM");
|
||||||
|
else
|
||||||
|
p = argv[1];
|
||||||
|
rc = tgetent(buf,p);
|
||||||
|
printf("tgetent returns %d, len=%d, text=\n'%s'\n",rc,strlen(buf),buf);
|
||||||
|
}
|
90
lib/libtermcap/TEST/tc2.c
Normal file
90
lib/libtermcap/TEST/tc2.c
Normal file
@ -0,0 +1,90 @@
|
|||||||
|
/*-
|
||||||
|
* Copyright (c) 1983, 1993
|
||||||
|
* The Regents of the University of California. All rights reserved.
|
||||||
|
*
|
||||||
|
* Redistribution and use in source and binary forms, with or without
|
||||||
|
* modification, are permitted provided that the following conditions
|
||||||
|
* are met:
|
||||||
|
* 1. Redistributions of source code must retain the above copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer.
|
||||||
|
* 2. Redistributions in binary form must reproduce the above copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer in the
|
||||||
|
* documentation and/or other materials provided with the distribution.
|
||||||
|
* 3. All advertising materials mentioning features or use of this software
|
||||||
|
* must display the following acknowledgement:
|
||||||
|
* This product includes software developed by the University of
|
||||||
|
* California, Berkeley and its contributors.
|
||||||
|
* 4. Neither the name of the University nor the names of its contributors
|
||||||
|
* may be used to endorse or promote products derived from this software
|
||||||
|
* without specific prior written permission.
|
||||||
|
*
|
||||||
|
* THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
|
||||||
|
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||||
|
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||||
|
* ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
|
||||||
|
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
||||||
|
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
|
||||||
|
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
|
||||||
|
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
|
||||||
|
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
|
||||||
|
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
|
||||||
|
* SUCH DAMAGE.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef lint
|
||||||
|
static char copyright[] =
|
||||||
|
"@(#) Copyright (c) 1983, 1993\n\
|
||||||
|
The Regents of the University of California. All rights reserved.\n";
|
||||||
|
#endif /* not lint */
|
||||||
|
|
||||||
|
#ifndef lint
|
||||||
|
static char sccsid[] = "@(#)tc2.c 8.1 (Berkeley) 6/4/93";
|
||||||
|
#endif /* not lint */
|
||||||
|
|
||||||
|
/*
|
||||||
|
* tc2 [term]
|
||||||
|
* Dummy program to test out termlib.
|
||||||
|
* Commands are "tcc\n" where t is type (s for string, f for flag,
|
||||||
|
* or n for number) and cc is the name of the capability.
|
||||||
|
*/
|
||||||
|
#include <stdio.h>
|
||||||
|
char buf[1024];
|
||||||
|
char *getenv(), *tgetstr();
|
||||||
|
|
||||||
|
main(argc, argv) char **argv; {
|
||||||
|
char *p, *q;
|
||||||
|
int rc;
|
||||||
|
char b[3], c;
|
||||||
|
char area[200];
|
||||||
|
|
||||||
|
if (argc < 2)
|
||||||
|
p = getenv("TERM");
|
||||||
|
else
|
||||||
|
p = argv[1];
|
||||||
|
rc = tgetent(buf,p);
|
||||||
|
for (;;) {
|
||||||
|
c = getchar();
|
||||||
|
if (c < 0)
|
||||||
|
exit(0);
|
||||||
|
b[0] = getchar();
|
||||||
|
if (b[0] < ' ')
|
||||||
|
exit(0);
|
||||||
|
b[1] = getchar();
|
||||||
|
b[2] = 0;
|
||||||
|
getchar();
|
||||||
|
switch(c) {
|
||||||
|
case 'f':
|
||||||
|
printf("%s: %d\n",b,tgetflag(b));
|
||||||
|
break;
|
||||||
|
case 'n':
|
||||||
|
printf("%s: %d\n",b,tgetnum(b));
|
||||||
|
break;
|
||||||
|
case 's':
|
||||||
|
q = area;
|
||||||
|
printf("%s: %s\n",b,tgetstr(b,&q));
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
exit(0);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
112
lib/libtermcap/TEST/tc3.c
Normal file
112
lib/libtermcap/TEST/tc3.c
Normal file
@ -0,0 +1,112 @@
|
|||||||
|
/*-
|
||||||
|
* Copyright (c) 1983, 1993
|
||||||
|
* The Regents of the University of California. All rights reserved.
|
||||||
|
*
|
||||||
|
* Redistribution and use in source and binary forms, with or without
|
||||||
|
* modification, are permitted provided that the following conditions
|
||||||
|
* are met:
|
||||||
|
* 1. Redistributions of source code must retain the above copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer.
|
||||||
|
* 2. Redistributions in binary form must reproduce the above copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer in the
|
||||||
|
* documentation and/or other materials provided with the distribution.
|
||||||
|
* 3. All advertising materials mentioning features or use of this software
|
||||||
|
* must display the following acknowledgement:
|
||||||
|
* This product includes software developed by the University of
|
||||||
|
* California, Berkeley and its contributors.
|
||||||
|
* 4. Neither the name of the University nor the names of its contributors
|
||||||
|
* may be used to endorse or promote products derived from this software
|
||||||
|
* without specific prior written permission.
|
||||||
|
*
|
||||||
|
* THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
|
||||||
|
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||||
|
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||||
|
* ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
|
||||||
|
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
||||||
|
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
|
||||||
|
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
|
||||||
|
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
|
||||||
|
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
|
||||||
|
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
|
||||||
|
* SUCH DAMAGE.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef lint
|
||||||
|
static char copyright[] =
|
||||||
|
"@(#) Copyright (c) 1983, 1993\n\
|
||||||
|
The Regents of the University of California. All rights reserved.\n";
|
||||||
|
#endif /* not lint */
|
||||||
|
|
||||||
|
#ifndef lint
|
||||||
|
static char sccsid[] = "@(#)tc3.c 8.1 (Berkeley) 6/4/93";
|
||||||
|
#endif /* not lint */
|
||||||
|
|
||||||
|
/*
|
||||||
|
* tc3 [term]
|
||||||
|
* Dummy program to test out termlib. Input two numbers (row and col)
|
||||||
|
* and it prints out the tgoto string generated.
|
||||||
|
*/
|
||||||
|
#include <stdio.h>
|
||||||
|
char buf[1024];
|
||||||
|
char *getenv(), *tgetstr();
|
||||||
|
char *rdchar();
|
||||||
|
char *tgoto();
|
||||||
|
char *CM;
|
||||||
|
char cmbuff[30];
|
||||||
|
char *x;
|
||||||
|
char *UP;
|
||||||
|
char *tgout;
|
||||||
|
|
||||||
|
main(argc, argv) char **argv; {
|
||||||
|
char *p;
|
||||||
|
int rc;
|
||||||
|
int row, col;
|
||||||
|
|
||||||
|
if (argc < 2)
|
||||||
|
p = getenv("TERM");
|
||||||
|
else
|
||||||
|
p = argv[1];
|
||||||
|
rc = tgetent(buf,p);
|
||||||
|
x = cmbuff;
|
||||||
|
UP = tgetstr("up", &x);
|
||||||
|
printf("UP = %x = ", UP); pr(UP); printf("\n");
|
||||||
|
if (UP && *UP==0)
|
||||||
|
UP = 0;
|
||||||
|
CM = tgetstr("cm", &x);
|
||||||
|
printf("CM = "); pr(CM); printf("\n");
|
||||||
|
for (;;) {
|
||||||
|
if (scanf("%d %d", &row, &col) < 2)
|
||||||
|
exit(0);
|
||||||
|
tgout = tgoto(CM, col, row);
|
||||||
|
pr(tgout);
|
||||||
|
printf("\n");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
pr(p)
|
||||||
|
register char *p;
|
||||||
|
{
|
||||||
|
for (; *p; p++)
|
||||||
|
printf("%s", rdchar(*p));
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* rdchar() returns a readable representation of an ASCII character
|
||||||
|
* using ^ for control, ' for meta.
|
||||||
|
*/
|
||||||
|
#include <ctype.h>
|
||||||
|
char *rdchar(c)
|
||||||
|
char c;
|
||||||
|
{
|
||||||
|
static char ret[4];
|
||||||
|
register char *p = ret;
|
||||||
|
|
||||||
|
if ((c&0377) > 0177)
|
||||||
|
*p++ = '\'';
|
||||||
|
c &= 0177;
|
||||||
|
if (!isprint(c))
|
||||||
|
*p++ = '^';
|
||||||
|
*p++ = (isprint(c) ? c : c^0100);
|
||||||
|
*p = 0;
|
||||||
|
return (ret);
|
||||||
|
}
|
36
lib/libtermcap/pathnames.h
Normal file
36
lib/libtermcap/pathnames.h
Normal file
@ -0,0 +1,36 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (c) 1989, 1993
|
||||||
|
* The Regents of the University of California. All rights reserved.
|
||||||
|
*
|
||||||
|
* Redistribution and use in source and binary forms, with or without
|
||||||
|
* modification, are permitted provided that the following conditions
|
||||||
|
* are met:
|
||||||
|
* 1. Redistributions of source code must retain the above copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer.
|
||||||
|
* 2. Redistributions in binary form must reproduce the above copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer in the
|
||||||
|
* documentation and/or other materials provided with the distribution.
|
||||||
|
* 3. All advertising materials mentioning features or use of this software
|
||||||
|
* must display the following acknowledgement:
|
||||||
|
* This product includes software developed by the University of
|
||||||
|
* California, Berkeley and its contributors.
|
||||||
|
* 4. Neither the name of the University nor the names of its contributors
|
||||||
|
* may be used to endorse or promote products derived from this software
|
||||||
|
* without specific prior written permission.
|
||||||
|
*
|
||||||
|
* THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
|
||||||
|
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||||
|
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||||
|
* ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
|
||||||
|
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
||||||
|
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
|
||||||
|
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
|
||||||
|
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
|
||||||
|
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
|
||||||
|
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
|
||||||
|
* SUCH DAMAGE.
|
||||||
|
*
|
||||||
|
* @(#)pathnames.h 8.1 (Berkeley) 6/4/93
|
||||||
|
*/
|
||||||
|
|
||||||
|
#define _PATH_DEF ".termcap /usr/share/misc/termcap"
|
292
lib/libtermcap/termcap.3
Normal file
292
lib/libtermcap/termcap.3
Normal file
@ -0,0 +1,292 @@
|
|||||||
|
.\" Copyright (c) 1980, 1991, 1993
|
||||||
|
.\" The Regents of the University of California. All rights reserved.
|
||||||
|
.\"
|
||||||
|
.\" Redistribution and use in source and binary forms, with or without
|
||||||
|
.\" modification, are permitted provided that the following conditions
|
||||||
|
.\" are met:
|
||||||
|
.\" 1. Redistributions of source code must retain the above copyright
|
||||||
|
.\" notice, this list of conditions and the following disclaimer.
|
||||||
|
.\" 2. Redistributions in binary form must reproduce the above copyright
|
||||||
|
.\" notice, this list of conditions and the following disclaimer in the
|
||||||
|
.\" documentation and/or other materials provided with the distribution.
|
||||||
|
.\" 3. All advertising materials mentioning features or use of this software
|
||||||
|
.\" must display the following acknowledgement:
|
||||||
|
.\" This product includes software developed by the University of
|
||||||
|
.\" California, Berkeley and its contributors.
|
||||||
|
.\" 4. Neither the name of the University nor the names of its contributors
|
||||||
|
.\" may be used to endorse or promote products derived from this software
|
||||||
|
.\" without specific prior written permission.
|
||||||
|
.\"
|
||||||
|
.\" THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
|
||||||
|
.\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||||
|
.\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||||
|
.\" ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
|
||||||
|
.\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
||||||
|
.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
|
||||||
|
.\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
|
||||||
|
.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
|
||||||
|
.\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
|
||||||
|
.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
|
||||||
|
.\" SUCH DAMAGE.
|
||||||
|
.\"
|
||||||
|
.\" @(#)termcap.3 8.2 (Berkeley) 12/11/93
|
||||||
|
.\"
|
||||||
|
.TH TERMCAP 3 "September 1997" GNO "Library Routines"
|
||||||
|
.SH NAME
|
||||||
|
.BR tgetent ,
|
||||||
|
.BR tgetnum ,
|
||||||
|
.BR tgetflag ,
|
||||||
|
.BR tgetstr ,
|
||||||
|
.BR tgoto ,
|
||||||
|
.BR tputs ,
|
||||||
|
.BR tparm ,
|
||||||
|
.BR _set_ospeed
|
||||||
|
\- terminal independent operation routines
|
||||||
|
.SH SYNOPSIS
|
||||||
|
#include <termcap.h>
|
||||||
|
.sp 1
|
||||||
|
char
|
||||||
|
.BR PC ;
|
||||||
|
.br
|
||||||
|
.RB "char *" BC ;
|
||||||
|
.br
|
||||||
|
.RB "char *" UP ;
|
||||||
|
.br
|
||||||
|
short
|
||||||
|
.BR ospeed ;
|
||||||
|
.sp 1
|
||||||
|
int \fBtgetent\fR (char *\fIbp\fR, const char *\fIname\fR);
|
||||||
|
.br
|
||||||
|
int \fBtgetnum\fR (const char *\fIid\fR);
|
||||||
|
.br
|
||||||
|
int \fBtgetflag\fR (const char *\fIid\fR);
|
||||||
|
.br
|
||||||
|
char *\fBtgetstr\fR (const char *\fIid\fR, char **\fIarea\fR);
|
||||||
|
.br
|
||||||
|
char *\fBtgoto\fR (const char *\fIcm\fR, int \fIdestcol\fR, int \fIdestline\fR);
|
||||||
|
.br
|
||||||
|
int \fBtputs\fR (const char *\fIcp\fR, int \fIaffcnt\fR, int (*\fIoutc\fR)(int));
|
||||||
|
.br
|
||||||
|
char *\fBtparm\fR (const char *\fIcp\fR, ...);
|
||||||
|
.br
|
||||||
|
void \fB_set_ospeed\fR (long \fIspeed\fR);
|
||||||
|
.SH DESCRIPTION
|
||||||
|
These functions extract and use capabilities from a terminal capability data
|
||||||
|
base, usually
|
||||||
|
.BR /usr/share/misc/termcap ,
|
||||||
|
the format of which is described in
|
||||||
|
.BR termcap (5).
|
||||||
|
These are low level routines;
|
||||||
|
see
|
||||||
|
.BR curses (3)
|
||||||
|
for a higher level package.
|
||||||
|
.LP
|
||||||
|
The
|
||||||
|
.BR tgetent
|
||||||
|
function
|
||||||
|
extracts the entry for terminal
|
||||||
|
.I name
|
||||||
|
into the buffer at
|
||||||
|
.IR bp .
|
||||||
|
The
|
||||||
|
.I bp
|
||||||
|
argument
|
||||||
|
should be a character buffer of size
|
||||||
|
1024 and must be retained through all subsequent calls to
|
||||||
|
.BR tgetnum ,
|
||||||
|
.BR tgetflag ,
|
||||||
|
and
|
||||||
|
.BR tgetstr .
|
||||||
|
The
|
||||||
|
.BR tgetent
|
||||||
|
function
|
||||||
|
returns \-1 if none of the
|
||||||
|
.BR termcap
|
||||||
|
data base files could be opened,
|
||||||
|
0 if the terminal name given does not have an entry, and 1 if all goes well.
|
||||||
|
It will look in the environment for a
|
||||||
|
.BR TERMCAP
|
||||||
|
variable.
|
||||||
|
If found, and the value does not begin with a slash,
|
||||||
|
and the terminal type
|
||||||
|
.I name
|
||||||
|
is the same as the environment string
|
||||||
|
.BR TERM ,
|
||||||
|
the
|
||||||
|
.BR TERMCAP
|
||||||
|
string is used instead of reading a
|
||||||
|
.BR termcap
|
||||||
|
file.
|
||||||
|
If it does begin with a slash, the string is used as a path name
|
||||||
|
of the
|
||||||
|
.BR termcap
|
||||||
|
file to search.
|
||||||
|
If
|
||||||
|
.BR TERMCAP
|
||||||
|
does not begin with a slash and
|
||||||
|
.I name
|
||||||
|
is different from
|
||||||
|
.BR TERM ,
|
||||||
|
.BR tgetent
|
||||||
|
searches the files
|
||||||
|
.BR $HOME/.termcap
|
||||||
|
and
|
||||||
|
.BR /usr/share/misc/termcap ,
|
||||||
|
in that order, unless the environment variable
|
||||||
|
.BR TERMPATH
|
||||||
|
exists,
|
||||||
|
in which case it specifies a list of file pathnames
|
||||||
|
(separated by spaces or colons) to be searched instead.
|
||||||
|
Whenever multiple files are searched and a
|
||||||
|
.B tc
|
||||||
|
field occurs in the requested entry, the entry it names must be found
|
||||||
|
in the same file or one of the succeeding files.
|
||||||
|
This can speed up entry into programs that call
|
||||||
|
.BR tgetent ,
|
||||||
|
as well as help debug new terminal descriptions
|
||||||
|
or make one for your terminal if you can't write the file
|
||||||
|
.BR /usr/share/misc/termcap .
|
||||||
|
.LP
|
||||||
|
The
|
||||||
|
.BR tgetnum
|
||||||
|
function
|
||||||
|
gets the numeric value of capability
|
||||||
|
.IR id ,
|
||||||
|
returning \-1 if it is not given for the terminal.
|
||||||
|
The
|
||||||
|
.BR tgetflag
|
||||||
|
function
|
||||||
|
returns 1 if the specified capability is present in
|
||||||
|
the terminal's entry, 0 if it is not.
|
||||||
|
The
|
||||||
|
.BR tgetstr
|
||||||
|
function
|
||||||
|
returns the string value of the capability
|
||||||
|
.IR id ,
|
||||||
|
places it in the buffer at
|
||||||
|
.IR area ,
|
||||||
|
and advances the
|
||||||
|
.I area
|
||||||
|
pointer.
|
||||||
|
It decodes the abbreviations for this field described in
|
||||||
|
.BR termcap (5),
|
||||||
|
except for cursor addressing and padding information.
|
||||||
|
The
|
||||||
|
.BR tgetstr
|
||||||
|
function
|
||||||
|
returns
|
||||||
|
.BR NULL
|
||||||
|
if the capability was not found.
|
||||||
|
.LP
|
||||||
|
The
|
||||||
|
.BR tgoto
|
||||||
|
function
|
||||||
|
returns a cursor addressing string decoded from
|
||||||
|
.I cm
|
||||||
|
to go to column
|
||||||
|
.I destcol
|
||||||
|
in line
|
||||||
|
.IR destline .
|
||||||
|
It uses the external variables
|
||||||
|
.B UP
|
||||||
|
(from the
|
||||||
|
.B up
|
||||||
|
capability)
|
||||||
|
and
|
||||||
|
.B BC
|
||||||
|
(if
|
||||||
|
.B bc
|
||||||
|
is given rather than
|
||||||
|
.BR bs )
|
||||||
|
if necessary to avoid placing
|
||||||
|
.B \en ,
|
||||||
|
.BR ^D
|
||||||
|
or
|
||||||
|
.BR ^@
|
||||||
|
in
|
||||||
|
the returned string.
|
||||||
|
(Programs which call
|
||||||
|
.BR tgoto
|
||||||
|
should be sure to turn off the
|
||||||
|
.BR XTABS
|
||||||
|
bit(s),
|
||||||
|
since
|
||||||
|
.BR tgoto
|
||||||
|
may now output a tab.
|
||||||
|
Note that programs using termcap should in general turn off
|
||||||
|
.BR XTABS
|
||||||
|
anyway since some terminals use control-I for other functions,
|
||||||
|
such as nondestructive space.)
|
||||||
|
If a
|
||||||
|
.BR %
|
||||||
|
sequence is given which is not understood, then
|
||||||
|
.BR tgoto
|
||||||
|
returns
|
||||||
|
.BR OOPS .
|
||||||
|
.LP
|
||||||
|
The
|
||||||
|
.BR tputs
|
||||||
|
function
|
||||||
|
decodes the leading padding information of the string
|
||||||
|
.IR cp ,
|
||||||
|
.I affcnt
|
||||||
|
gives the number of lines affected by the operation, or 1 if this is
|
||||||
|
not applicable,
|
||||||
|
.I outc
|
||||||
|
is a routine which is called with each character in turn.
|
||||||
|
The external variable
|
||||||
|
.IR ospeed
|
||||||
|
should contain the output speed of the terminal as encoded by
|
||||||
|
.BR stty (3).
|
||||||
|
The
|
||||||
|
.BR _set_ospeed
|
||||||
|
functions converts any (not exactly matched only) numeric speed to
|
||||||
|
.BR stty (3)
|
||||||
|
encoded speed and set
|
||||||
|
.IR ospeed
|
||||||
|
variable.
|
||||||
|
The external variable
|
||||||
|
.IR PC
|
||||||
|
should contain a pad character to be used (from the
|
||||||
|
.B pc
|
||||||
|
capability)
|
||||||
|
if a null
|
||||||
|
.B ^@
|
||||||
|
is inappropriate.
|
||||||
|
.LP
|
||||||
|
The
|
||||||
|
.BR tparm
|
||||||
|
function
|
||||||
|
instantiates the string
|
||||||
|
.I cp
|
||||||
|
with given parameters.
|
||||||
|
A pointer is returned which points to
|
||||||
|
the result of
|
||||||
|
.I cp
|
||||||
|
with the parameters applied.
|
||||||
|
If a
|
||||||
|
.B %
|
||||||
|
sequence is given which is not understood, then
|
||||||
|
.BR tparm
|
||||||
|
returns
|
||||||
|
.BR OOPS .
|
||||||
|
.SH FILES
|
||||||
|
.RS
|
||||||
|
.IP \fB/usr/lib/libtermcap.a\fR
|
||||||
|
The
|
||||||
|
.BR ltermcap
|
||||||
|
library (also known as
|
||||||
|
.BR ltermlib ).
|
||||||
|
.IP \fB/usr/share/misc/termcap\fR
|
||||||
|
standard terminal capability data base
|
||||||
|
.IP \fB$HOME/.termcap\fR
|
||||||
|
user's terminal capability data base
|
||||||
|
.RE
|
||||||
|
.SH SEE ALSO
|
||||||
|
.BR ex (1),
|
||||||
|
.BR curses (3),
|
||||||
|
.BR termcap (5)
|
||||||
|
.SH HISTORY
|
||||||
|
The
|
||||||
|
.BR termcap
|
||||||
|
functions appeared in 4.0BSD.
|
263
lib/libtermcap/termcap.c
Normal file
263
lib/libtermcap/termcap.c
Normal file
@ -0,0 +1,263 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (c) 1980, 1993
|
||||||
|
* The Regents of the University of California. All rights reserved.
|
||||||
|
*
|
||||||
|
* Redistribution and use in source and binary forms, with or without
|
||||||
|
* modification, are permitted provided that the following conditions
|
||||||
|
* are met:
|
||||||
|
* 1. Redistributions of source code must retain the above copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer.
|
||||||
|
* 2. Redistributions in binary form must reproduce the above copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer in the
|
||||||
|
* documentation and/or other materials provided with the distribution.
|
||||||
|
* 3. All advertising materials mentioning features or use of this software
|
||||||
|
* must display the following acknowledgement:
|
||||||
|
* This product includes software developed by the University of
|
||||||
|
* California, Berkeley and its contributors.
|
||||||
|
* 4. Neither the name of the University nor the names of its contributors
|
||||||
|
* may be used to endorse or promote products derived from this software
|
||||||
|
* without specific prior written permission.
|
||||||
|
*
|
||||||
|
* THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
|
||||||
|
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||||
|
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||||
|
* ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
|
||||||
|
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
||||||
|
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
|
||||||
|
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
|
||||||
|
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
|
||||||
|
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
|
||||||
|
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
|
||||||
|
* SUCH DAMAGE.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef lint
|
||||||
|
static char sccsid[] = "@(#)termcap.c 8.1 (Berkeley) 6/4/93";
|
||||||
|
#endif /* not lint */
|
||||||
|
|
||||||
|
#define PBUFSIZ 512 /* max length of filename path */
|
||||||
|
#define PVECSIZ 32 /* max number of names in path */
|
||||||
|
#define TBUFSIZ 1024 /* max length of tgetent buffer */
|
||||||
|
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <ctype.h>
|
||||||
|
#include <stdlib.h>
|
||||||
|
#include <string.h>
|
||||||
|
#include <unistd.h>
|
||||||
|
#include <termios.h>
|
||||||
|
#include "termcap.h"
|
||||||
|
#include "pathnames.h"
|
||||||
|
|
||||||
|
extern void __set_ospeed(speed_t speed);
|
||||||
|
|
||||||
|
/*
|
||||||
|
* termcap - routines for dealing with the terminal capability data base
|
||||||
|
*
|
||||||
|
* BUG: Should use a "last" pointer in tbuf, so that searching
|
||||||
|
* for capabilities alphabetically would not be a n**2/2
|
||||||
|
* process when large numbers of capabilities are given.
|
||||||
|
* Note: If we add a last pointer now we will screw up the
|
||||||
|
* tc capability. We really should compile termcap.
|
||||||
|
*
|
||||||
|
* Essentially all the work here is scanning and decoding escapes
|
||||||
|
* in string capabilities. We don't use stdio because the editor
|
||||||
|
* doesn't, and because living w/o it is not hard.
|
||||||
|
*/
|
||||||
|
|
||||||
|
static char *tbuf; /* termcap buffer */
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Get an entry for terminal name in buffer bp from the termcap file.
|
||||||
|
*/
|
||||||
|
int
|
||||||
|
tgetent(char *bp, const char *name)
|
||||||
|
{
|
||||||
|
register char *p;
|
||||||
|
register char *cp;
|
||||||
|
char *dummy;
|
||||||
|
char **fname;
|
||||||
|
char *home;
|
||||||
|
int i;
|
||||||
|
char pathbuf[PBUFSIZ]; /* holds raw path of filenames */
|
||||||
|
char *pathvec[PVECSIZ]; /* to point to names in pathbuf */
|
||||||
|
char **pvec; /* holds usable tail of path vector */
|
||||||
|
char *termpath;
|
||||||
|
struct termios tty;
|
||||||
|
|
||||||
|
dummy = NULL;
|
||||||
|
fname = pathvec;
|
||||||
|
pvec = pathvec;
|
||||||
|
tbuf = bp;
|
||||||
|
p = pathbuf;
|
||||||
|
cp = getenv("TERMCAP");
|
||||||
|
/*
|
||||||
|
* TERMCAP can have one of two things in it. It can be the
|
||||||
|
* name of a file to use instead of /etc/termcap. In this
|
||||||
|
* case it better start with a "/". Or it can be an entry to
|
||||||
|
* use so we don't have to read the file. In this case it
|
||||||
|
* has to already have the newlines crunched out. If TERMCAP
|
||||||
|
* does not hold a file name then a path of names is searched
|
||||||
|
* instead. The path is found in the TERMPATH variable, or
|
||||||
|
* becomes "$HOME/.termcap /etc/termcap" if no TERMPATH exists.
|
||||||
|
*/
|
||||||
|
if (!cp || *cp != '/') { /* no TERMCAP or it holds an entry */
|
||||||
|
if (termpath = getenv("TERMPATH"))
|
||||||
|
strncpy(pathbuf, termpath, PBUFSIZ);
|
||||||
|
else {
|
||||||
|
if (home = getenv("HOME")) { /* set up default */
|
||||||
|
p += strlen(home); /* path, looking in */
|
||||||
|
strcpy(pathbuf, home); /* $HOME first */
|
||||||
|
*p++ = '/';
|
||||||
|
} /* if no $HOME look in current directory */
|
||||||
|
strncpy(p, _PATH_DEF, PBUFSIZ - (p - pathbuf));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else /* user-defined name in TERMCAP */
|
||||||
|
strncpy(pathbuf, cp, PBUFSIZ); /* still can be tokenized */
|
||||||
|
|
||||||
|
*fname++ = pathbuf; /* tokenize path into vector of names */
|
||||||
|
while (*++p)
|
||||||
|
if (*p == ' ' || *p == ':') {
|
||||||
|
*p = '\0';
|
||||||
|
while (*++p)
|
||||||
|
if (*p != ' ' && *p != ':')
|
||||||
|
break;
|
||||||
|
if (*p == '\0')
|
||||||
|
break;
|
||||||
|
*fname++ = p;
|
||||||
|
if (fname >= pathvec + PVECSIZ) {
|
||||||
|
fname--;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
*fname = (char *) 0; /* mark end of vector */
|
||||||
|
if (cp && *cp && *cp != '/')
|
||||||
|
if (cgetset(cp) < 0)
|
||||||
|
return(-2);
|
||||||
|
|
||||||
|
i = cgetent(&dummy, pathvec, (char *)name);
|
||||||
|
|
||||||
|
if (i == 0) {
|
||||||
|
char *pd, *ps, *tok, *s, *tcs;
|
||||||
|
size_t len;
|
||||||
|
|
||||||
|
pd = bp;
|
||||||
|
ps = dummy;
|
||||||
|
if ((tok = strchr(ps, ':')) == NULL) {
|
||||||
|
len = strlen(ps);
|
||||||
|
if (len >= TBUFSIZ)
|
||||||
|
i = -1;
|
||||||
|
else
|
||||||
|
strcpy(pd, ps);
|
||||||
|
goto done;
|
||||||
|
}
|
||||||
|
len = tok - ps + 1;
|
||||||
|
if (pd + len + 1 - bp >= TBUFSIZ) {
|
||||||
|
i = -1;
|
||||||
|
goto done;
|
||||||
|
}
|
||||||
|
memcpy(pd, ps, len);
|
||||||
|
ps += len;
|
||||||
|
pd += len;
|
||||||
|
*pd = '\0';
|
||||||
|
tcs = pd - 1;
|
||||||
|
for (;;) {
|
||||||
|
while ((tok = strsep(&ps, ":")) != NULL &&
|
||||||
|
(*tok == '\0' || *tok == '\\' || !isgraph(*tok)))
|
||||||
|
;
|
||||||
|
if (tok == NULL)
|
||||||
|
break;
|
||||||
|
for (s = tcs; s != NULL && s[1] != '\0'; s = strchr(s, ':')) {
|
||||||
|
s++;
|
||||||
|
if (s[0] == tok[0] && s[1] == tok[1])
|
||||||
|
goto skip_it;
|
||||||
|
}
|
||||||
|
len = strlen(tok);
|
||||||
|
if (pd + len + 1 - bp >= TBUFSIZ) {
|
||||||
|
i = -1;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
memcpy(pd, tok, len);
|
||||||
|
pd += len;
|
||||||
|
*pd++ = ':';
|
||||||
|
*pd = '\0';
|
||||||
|
skip_it: ;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
done:
|
||||||
|
if ( i == 0
|
||||||
|
&& ( tcgetattr(STDERR_FILENO, &tty) != -1
|
||||||
|
|| tcgetattr(STDOUT_FILENO, &tty) != -1
|
||||||
|
)
|
||||||
|
)
|
||||||
|
__set_ospeed(cfgetospeed(&tty));
|
||||||
|
if (dummy)
|
||||||
|
free(dummy);
|
||||||
|
/* no tc reference loop return code in libterm XXX */
|
||||||
|
if (i == -3)
|
||||||
|
return(-1);
|
||||||
|
return(i + 1);
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Return the (numeric) option id.
|
||||||
|
* Numeric options look like
|
||||||
|
* li#80
|
||||||
|
* i.e. the option string is separated from the numeric value by
|
||||||
|
* a # character. If the option is not found we return -1.
|
||||||
|
* Note that we handle octal numbers beginning with 0.
|
||||||
|
*/
|
||||||
|
int
|
||||||
|
tgetnum(const char *id)
|
||||||
|
{
|
||||||
|
long num;
|
||||||
|
|
||||||
|
if (cgetnum(tbuf, (char *)id, &num) == 0)
|
||||||
|
return(num);
|
||||||
|
else
|
||||||
|
return(-1);
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Handle a flag option.
|
||||||
|
* Flag options are given "naked", i.e. followed by a : or the end
|
||||||
|
* of the buffer. Return 1 if we find the option, or 0 if it is
|
||||||
|
* not given.
|
||||||
|
*/
|
||||||
|
int
|
||||||
|
tgetflag(const char *id)
|
||||||
|
{
|
||||||
|
return(cgetcap(tbuf, (char *)id, ':') != NULL);
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Get a string valued option.
|
||||||
|
* These are given as
|
||||||
|
* cl=^Z
|
||||||
|
* Much decoding is done on the strings, and the strings are
|
||||||
|
* placed in area, which is a ref parameter which is updated.
|
||||||
|
* No checking on area overflow.
|
||||||
|
*/
|
||||||
|
char *
|
||||||
|
tgetstr(const char *id, char **area)
|
||||||
|
{
|
||||||
|
char ids[3];
|
||||||
|
char *s;
|
||||||
|
int i;
|
||||||
|
|
||||||
|
/*
|
||||||
|
* XXX
|
||||||
|
* This is for all the boneheaded programs that relied on tgetstr
|
||||||
|
* to look only at the first 2 characters of the string passed...
|
||||||
|
*/
|
||||||
|
*ids = *id;
|
||||||
|
ids[1] = id[1];
|
||||||
|
ids[2] = '\0';
|
||||||
|
|
||||||
|
if ((i = cgetstr(tbuf, ids, &s)) < 0)
|
||||||
|
return NULL;
|
||||||
|
|
||||||
|
strcpy(*area, s);
|
||||||
|
*area += i + 1;
|
||||||
|
return(s);
|
||||||
|
}
|
51
lib/libtermcap/termcap.h
Normal file
51
lib/libtermcap/termcap.h
Normal file
@ -0,0 +1,51 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (C) 1994,1995 by Andrey A. Chernov, Moscow, Russia.
|
||||||
|
* All rights reserved.
|
||||||
|
*
|
||||||
|
* Redistribution and use in source and binary forms, with or without
|
||||||
|
* modification, are permitted provided that the following conditions
|
||||||
|
* are met:
|
||||||
|
* 1. Redistributions of source code must retain the above copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer.
|
||||||
|
* 2. Redistributions in binary form must reproduce the above copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer in the
|
||||||
|
* documentation and/or other materials provided with the distribution.
|
||||||
|
*
|
||||||
|
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND
|
||||||
|
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||||
|
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||||
|
* ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE
|
||||||
|
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
||||||
|
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
|
||||||
|
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
|
||||||
|
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
|
||||||
|
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
|
||||||
|
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
|
||||||
|
* SUCH DAMAGE.
|
||||||
|
*/
|
||||||
|
|
||||||
|
/* $Id: termcap.h,v 1.1 1997/09/30 06:23:55 gdr Exp $ */
|
||||||
|
|
||||||
|
#ifndef _TERMCAP_H_
|
||||||
|
#define _TERMCAP_H_
|
||||||
|
|
||||||
|
#include <sys/cdefs.h>
|
||||||
|
|
||||||
|
__BEGIN_DECLS
|
||||||
|
|
||||||
|
extern char PC, *UP, *BC;
|
||||||
|
extern short ospeed;
|
||||||
|
|
||||||
|
extern int tgetent __P((char *, const char *));
|
||||||
|
extern int tgetflag __P((const char *));
|
||||||
|
extern int tgetnum __P((const char *));
|
||||||
|
extern char *tgetstr __P((const char *, char **));
|
||||||
|
|
||||||
|
extern int tputs __P((const char *, int, int (*)(int)));
|
||||||
|
|
||||||
|
extern char *tgoto __P((const char *, int, int));
|
||||||
|
extern char *tparm __P((const char *, ...));
|
||||||
|
|
||||||
|
__END_DECLS
|
||||||
|
|
||||||
|
#endif /* _TERMCAP_H_ */
|
207
lib/libtermcap/tgoto.c
Normal file
207
lib/libtermcap/tgoto.c
Normal file
@ -0,0 +1,207 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (c) 1980, 1993
|
||||||
|
* The Regents of the University of California. All rights reserved.
|
||||||
|
*
|
||||||
|
* Redistribution and use in source and binary forms, with or without
|
||||||
|
* modification, are permitted provided that the following conditions
|
||||||
|
* are met:
|
||||||
|
* 1. Redistributions of source code must retain the above copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer.
|
||||||
|
* 2. Redistributions in binary form must reproduce the above copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer in the
|
||||||
|
* documentation and/or other materials provided with the distribution.
|
||||||
|
* 3. All advertising materials mentioning features or use of this software
|
||||||
|
* must display the following acknowledgement:
|
||||||
|
* This product includes software developed by the University of
|
||||||
|
* California, Berkeley and its contributors.
|
||||||
|
* 4. Neither the name of the University nor the names of its contributors
|
||||||
|
* may be used to endorse or promote products derived from this software
|
||||||
|
* without specific prior written permission.
|
||||||
|
*
|
||||||
|
* THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
|
||||||
|
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||||
|
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||||
|
* ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
|
||||||
|
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
||||||
|
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
|
||||||
|
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
|
||||||
|
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
|
||||||
|
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
|
||||||
|
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
|
||||||
|
* SUCH DAMAGE.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef lint
|
||||||
|
static char sccsid[] = "@(#)tgoto.c 8.1 (Berkeley) 6/4/93";
|
||||||
|
#endif /* not lint */
|
||||||
|
|
||||||
|
#include "termcap.h"
|
||||||
|
|
||||||
|
#define CTRL(c) ((c) & 037)
|
||||||
|
|
||||||
|
#define MAXRETURNSIZE 64
|
||||||
|
|
||||||
|
char *UP;
|
||||||
|
char *BC;
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Routine to perform cursor addressing.
|
||||||
|
* CM is a string containing printf type escapes to allow
|
||||||
|
* cursor addressing. We start out ready to print the destination
|
||||||
|
* line, and switch each time we print row or column.
|
||||||
|
* The following escapes are defined for substituting row/column:
|
||||||
|
*
|
||||||
|
* %d as in printf
|
||||||
|
* %2 like %2d
|
||||||
|
* %3 like %3d
|
||||||
|
* %. gives %c hacking special case characters
|
||||||
|
* %+x like %c but adding x first
|
||||||
|
*
|
||||||
|
* The codes below affect the state but don't use up a value.
|
||||||
|
*
|
||||||
|
* %>xy if value > x add y
|
||||||
|
* %r reverses row/column
|
||||||
|
* %i increments row/column (for one origin indexing)
|
||||||
|
* %% gives %
|
||||||
|
* %B BCD (2 decimal digits encoded in one byte)
|
||||||
|
* %D Delta Data (backwards bcd)
|
||||||
|
*
|
||||||
|
* all other characters are ``self-inserting''.
|
||||||
|
*/
|
||||||
|
char *
|
||||||
|
tgoto(const char *CM, int destcol, int destline)
|
||||||
|
{
|
||||||
|
static char result[MAXRETURNSIZE];
|
||||||
|
static char added[10];
|
||||||
|
const char *cp = CM;
|
||||||
|
register char *dp = result;
|
||||||
|
register int c;
|
||||||
|
int oncol = 0;
|
||||||
|
register int which = destline;
|
||||||
|
|
||||||
|
if (cp == 0) {
|
||||||
|
toohard:
|
||||||
|
/*
|
||||||
|
* ``We don't do that under BOZO's big top''
|
||||||
|
*/
|
||||||
|
return ("OOPS");
|
||||||
|
}
|
||||||
|
added[0] = 0;
|
||||||
|
while (c = *cp++) {
|
||||||
|
if (c != '%') {
|
||||||
|
*dp++ = c;
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
switch (c = *cp++) {
|
||||||
|
|
||||||
|
#ifdef CM_N
|
||||||
|
case 'n':
|
||||||
|
destcol ^= 0140;
|
||||||
|
destline ^= 0140;
|
||||||
|
goto setwhich;
|
||||||
|
#endif
|
||||||
|
|
||||||
|
case 'd':
|
||||||
|
if (which < 10)
|
||||||
|
goto one;
|
||||||
|
if (which < 100)
|
||||||
|
goto two;
|
||||||
|
/* fall into... */
|
||||||
|
|
||||||
|
case '3':
|
||||||
|
*dp++ = (which / 100) | '0';
|
||||||
|
which %= 100;
|
||||||
|
/* fall into... */
|
||||||
|
|
||||||
|
case '2':
|
||||||
|
two:
|
||||||
|
*dp++ = which / 10 | '0';
|
||||||
|
one:
|
||||||
|
*dp++ = which % 10 | '0';
|
||||||
|
swap:
|
||||||
|
oncol = 1 - oncol;
|
||||||
|
setwhich:
|
||||||
|
which = oncol ? destcol : destline;
|
||||||
|
continue;
|
||||||
|
|
||||||
|
#ifdef CM_GT
|
||||||
|
case '>':
|
||||||
|
if (which > *cp++)
|
||||||
|
which += *cp++;
|
||||||
|
else
|
||||||
|
cp++;
|
||||||
|
continue;
|
||||||
|
#endif
|
||||||
|
|
||||||
|
case '+':
|
||||||
|
which += *cp++;
|
||||||
|
/* fall into... */
|
||||||
|
|
||||||
|
case '.':
|
||||||
|
casedot:
|
||||||
|
/*
|
||||||
|
* This code is worth scratching your head at for a
|
||||||
|
* while. The idea is that various weird things can
|
||||||
|
* happen to nulls, EOT's, tabs, and newlines by the
|
||||||
|
* tty driver, arpanet, and so on, so we don't send
|
||||||
|
* them if we can help it.
|
||||||
|
*
|
||||||
|
* Tab is taken out to get Ann Arbors to work, otherwise
|
||||||
|
* when they go to column 9 we increment which is wrong
|
||||||
|
* because bcd isn't continuous. We should take out
|
||||||
|
* the rest too, or run the thing through more than
|
||||||
|
* once until it doesn't make any of these, but that
|
||||||
|
* would make termlib (and hence pdp-11 ex) bigger,
|
||||||
|
* and also somewhat slower. This requires all
|
||||||
|
* programs which use termlib to stty tabs so they
|
||||||
|
* don't get expanded. They should do this anyway
|
||||||
|
* because some terminals use ^I for other things,
|
||||||
|
* like nondestructive space.
|
||||||
|
*/
|
||||||
|
if (which == 0 || which == CTRL('d') || /* which == '\t' || */ which == '\n') {
|
||||||
|
if (oncol || UP) /* Assumption: backspace works */
|
||||||
|
/*
|
||||||
|
* Loop needed because newline happens
|
||||||
|
* to be the successor of tab.
|
||||||
|
*/
|
||||||
|
do {
|
||||||
|
strcat(added, oncol ? (BC ? BC : "\b") : UP);
|
||||||
|
which++;
|
||||||
|
} while (which == '\n');
|
||||||
|
}
|
||||||
|
*dp++ = which;
|
||||||
|
goto swap;
|
||||||
|
|
||||||
|
case 'r':
|
||||||
|
oncol = 1;
|
||||||
|
goto setwhich;
|
||||||
|
|
||||||
|
case 'i':
|
||||||
|
destcol++;
|
||||||
|
destline++;
|
||||||
|
which++;
|
||||||
|
continue;
|
||||||
|
|
||||||
|
case '%':
|
||||||
|
*dp++ = c;
|
||||||
|
continue;
|
||||||
|
|
||||||
|
#ifdef CM_B
|
||||||
|
case 'B':
|
||||||
|
which = (which/10 << 4) + which%10;
|
||||||
|
continue;
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifdef CM_D
|
||||||
|
case 'D':
|
||||||
|
which = which - 2 * (which%16);
|
||||||
|
continue;
|
||||||
|
#endif
|
||||||
|
|
||||||
|
default:
|
||||||
|
goto toohard;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
strcpy(dp, added);
|
||||||
|
return (result);
|
||||||
|
}
|
72
lib/libtermcap/tospeed.c
Normal file
72
lib/libtermcap/tospeed.c
Normal file
@ -0,0 +1,72 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (C) 1995 by Andrey A. Chernov, Moscow, Russia.
|
||||||
|
* All rights reserved.
|
||||||
|
*
|
||||||
|
* Redistribution and use in source and binary forms, with or without
|
||||||
|
* modification, are permitted provided that the following conditions
|
||||||
|
* are met:
|
||||||
|
* 1. Redistributions of source code must retain the above copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer.
|
||||||
|
* 2. Redistributions in binary form must reproduce the above copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer in the
|
||||||
|
* documentation and/or other materials provided with the distribution.
|
||||||
|
*
|
||||||
|
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND
|
||||||
|
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||||
|
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||||
|
* ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE
|
||||||
|
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
||||||
|
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
|
||||||
|
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
|
||||||
|
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
|
||||||
|
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
|
||||||
|
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
|
||||||
|
* SUCH DAMAGE.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <termios.h>
|
||||||
|
#include "termcap.h"
|
||||||
|
|
||||||
|
static struct stable {
|
||||||
|
speed_t speed;
|
||||||
|
short code;
|
||||||
|
} table[] = {
|
||||||
|
{B115200,17},
|
||||||
|
{B57600, 16},
|
||||||
|
{B38400, 15},
|
||||||
|
{B19200, 14},
|
||||||
|
{B9600, 13},
|
||||||
|
{B4800, 12},
|
||||||
|
{B2400, 11},
|
||||||
|
{B1800, 10},
|
||||||
|
{B1200, 9},
|
||||||
|
{B600, 8},
|
||||||
|
{B300, 7},
|
||||||
|
{B200, 6},
|
||||||
|
{B150, 5},
|
||||||
|
{B134, 4},
|
||||||
|
{B110, 3},
|
||||||
|
{B75, 2},
|
||||||
|
{B50, 1},
|
||||||
|
{B0, 0},
|
||||||
|
{-1, -1}
|
||||||
|
};
|
||||||
|
|
||||||
|
void __set_ospeed(speed_t speed)
|
||||||
|
{
|
||||||
|
struct stable *stable;
|
||||||
|
|
||||||
|
if (speed == B0) {
|
||||||
|
ospeed = 0;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
for (stable = table; stable->speed > B0; stable++) {
|
||||||
|
/* nearest one, rounded down */
|
||||||
|
if (stable->speed <= speed) {
|
||||||
|
ospeed = stable->code;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
ospeed = 1; /* 50, min and not hangup */
|
||||||
|
}
|
||||||
|
|
753
lib/libtermcap/tparm.c
Normal file
753
lib/libtermcap/tparm.c
Normal file
@ -0,0 +1,753 @@
|
|||||||
|
/*
|
||||||
|
* tparm.c
|
||||||
|
*
|
||||||
|
* By Ross Ridge
|
||||||
|
* Public Domain
|
||||||
|
* 92/02/01 07:30:36
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <ctype.h>
|
||||||
|
#include <stdarg.h>
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <string.h>
|
||||||
|
#include "termcap.h"
|
||||||
|
|
||||||
|
#ifdef USE_SCCS_IDS
|
||||||
|
static const char SCCSid[] = "@(#) mytinfo tparm.c 3.2 92/02/01 public domain, By Ross Ridge";
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifndef MAX_PUSHED
|
||||||
|
#define MAX_PUSHED 32
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#define ARG 1
|
||||||
|
#define NUM 2
|
||||||
|
|
||||||
|
#define INTEGER 1
|
||||||
|
#define STRING 2
|
||||||
|
|
||||||
|
#define MAX_LINE 640
|
||||||
|
|
||||||
|
typedef void* anyptr;
|
||||||
|
|
||||||
|
typedef struct stack_str {
|
||||||
|
int type;
|
||||||
|
int argnum;
|
||||||
|
int value;
|
||||||
|
} stack;
|
||||||
|
|
||||||
|
static stack S[MAX_PUSHED];
|
||||||
|
static stack vars['z'-'a'+1];
|
||||||
|
static int pos = 0;
|
||||||
|
|
||||||
|
static struct arg_str {
|
||||||
|
int type;
|
||||||
|
int integer;
|
||||||
|
char *string;
|
||||||
|
} arg_list[10];
|
||||||
|
|
||||||
|
static int argcnt;
|
||||||
|
|
||||||
|
static va_list tparm_args;
|
||||||
|
|
||||||
|
static int
|
||||||
|
pusharg(arg)
|
||||||
|
int arg; {
|
||||||
|
if (pos == MAX_PUSHED)
|
||||||
|
return 1;
|
||||||
|
S[pos].type = ARG;
|
||||||
|
S[pos++].argnum = arg;
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
static int
|
||||||
|
pushnum(num)
|
||||||
|
int num; {
|
||||||
|
if (pos == MAX_PUSHED)
|
||||||
|
return 1;
|
||||||
|
S[pos].type = NUM;
|
||||||
|
S[pos++].value = num;
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* VARARGS2 */
|
||||||
|
static int
|
||||||
|
getarg(argnum, type, p)
|
||||||
|
int argnum, type;
|
||||||
|
anyptr p; {
|
||||||
|
while (argcnt < argnum) {
|
||||||
|
arg_list[argcnt].type = INTEGER;
|
||||||
|
arg_list[argcnt++].integer = (int) va_arg(tparm_args, int);
|
||||||
|
}
|
||||||
|
if (argcnt > argnum) {
|
||||||
|
if (arg_list[argnum].type != type)
|
||||||
|
return 1;
|
||||||
|
else if (type == STRING)
|
||||||
|
*(char **)p = arg_list[argnum].string;
|
||||||
|
else
|
||||||
|
*(int *)p = arg_list[argnum].integer;
|
||||||
|
} else {
|
||||||
|
arg_list[argcnt].type = type;
|
||||||
|
if (type == STRING)
|
||||||
|
*(char **)p = arg_list[argcnt++].string
|
||||||
|
= (char *) va_arg(tparm_args, char *);
|
||||||
|
else
|
||||||
|
*(int *)p = arg_list[argcnt++].integer = (int) va_arg(tparm_args, int);
|
||||||
|
}
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
static int
|
||||||
|
popstring(str)
|
||||||
|
char **str; {
|
||||||
|
if (pos-- == 0)
|
||||||
|
return 1;
|
||||||
|
if (S[pos].type != ARG)
|
||||||
|
return 1;
|
||||||
|
return(getarg(S[pos].argnum, STRING, (anyptr) str));
|
||||||
|
}
|
||||||
|
|
||||||
|
static int
|
||||||
|
popnum(num)
|
||||||
|
int *num; {
|
||||||
|
if (pos-- == 0)
|
||||||
|
return 1;
|
||||||
|
switch (S[pos].type) {
|
||||||
|
case ARG:
|
||||||
|
return (getarg(S[pos].argnum, INTEGER, (anyptr) num));
|
||||||
|
case NUM:
|
||||||
|
*num = S[pos].value;
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
static int
|
||||||
|
cvtchar(sp, c)
|
||||||
|
register char *sp, *c; {
|
||||||
|
switch(*sp) {
|
||||||
|
case '\\':
|
||||||
|
switch(*++sp) {
|
||||||
|
case '\'':
|
||||||
|
case '$':
|
||||||
|
case '\\':
|
||||||
|
case '%':
|
||||||
|
*c = *sp;
|
||||||
|
return 2;
|
||||||
|
case '\0':
|
||||||
|
*c = '\\';
|
||||||
|
return 1;
|
||||||
|
case '0':
|
||||||
|
if (sp[1] == '0' && sp[2] == '0') {
|
||||||
|
*c = '\0';
|
||||||
|
return 4;
|
||||||
|
}
|
||||||
|
*c = '\200'; /* '\0' ???? */
|
||||||
|
return 2;
|
||||||
|
default:
|
||||||
|
*c = *sp;
|
||||||
|
return 2;
|
||||||
|
}
|
||||||
|
default:
|
||||||
|
*c = *sp;
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
static int termcap;
|
||||||
|
|
||||||
|
/* sigh... this has got to be the ugliest code I've ever written.
|
||||||
|
Trying to handle everything has its cost, I guess.
|
||||||
|
|
||||||
|
It actually isn't to hard to figure out if a given % code is supposed
|
||||||
|
to be interpeted with its termcap or terminfo meaning since almost
|
||||||
|
all terminfo codes are invalid unless something has been pushed on
|
||||||
|
the stack and termcap strings will never push things on the stack
|
||||||
|
(%p isn't used by termcap). So where we have a choice we make the
|
||||||
|
decision by wether or not somthing has been pushed on the stack.
|
||||||
|
The static variable termcap keeps track of this; it starts out set
|
||||||
|
to 1 and is incremented as each argument processed by a termcap % code,
|
||||||
|
however if something is pushed on the stack it's set to 0 and the
|
||||||
|
rest of the % codes are interpeted as terminfo % codes. Another way
|
||||||
|
of putting it is that if termcap equals one we haven't decided either
|
||||||
|
way yet, if it equals zero we're looking for terminfo codes, and if
|
||||||
|
its greater than 1 we're looking for termcap codes.
|
||||||
|
|
||||||
|
Terminfo % codes:
|
||||||
|
|
||||||
|
%% output a '%'
|
||||||
|
%[[:][-+# ][width][.precision]][doxXs]
|
||||||
|
output pop according to the printf format
|
||||||
|
%c output pop as a char
|
||||||
|
%'c' push character constant c.
|
||||||
|
%{n} push decimal constant n.
|
||||||
|
%p[1-9] push paramter [1-9]
|
||||||
|
%g[a-z] push variable [a-z]
|
||||||
|
%P[a-z] put pop in variable [a-z]
|
||||||
|
%l push the length of pop (a string)
|
||||||
|
%+ add pop to pop and push the result
|
||||||
|
%- subtract pop from pop and push the result
|
||||||
|
%* multiply pop and pop and push the result
|
||||||
|
%& bitwise and pop and pop and push the result
|
||||||
|
%| bitwise or pop and pop and push the result
|
||||||
|
%^ bitwise xor pop and pop and push the result
|
||||||
|
%~ push the bitwise not of pop
|
||||||
|
%= compare if pop and pop are equal and push the result
|
||||||
|
%> compare if pop is less than pop and push the result
|
||||||
|
%< compare if pop is greater than pop and push the result
|
||||||
|
%A logical and pop and pop and push the result
|
||||||
|
%O logical or pop and pop and push the result
|
||||||
|
%! push the logical not of pop
|
||||||
|
%? condition %t if_true [%e if_false] %;
|
||||||
|
if condtion evaulates as true then evaluate if_true,
|
||||||
|
else evaluate if_false. elseif's can be done:
|
||||||
|
%? cond %t true [%e cond2 %t true2] ... [%e condN %t trueN] [%e false] %;
|
||||||
|
%i add one to parameters 1 and 2. (ANSI)
|
||||||
|
|
||||||
|
Termcap Codes:
|
||||||
|
|
||||||
|
%% output a %
|
||||||
|
%. output parameter as a character
|
||||||
|
%d output parameter as a decimal number
|
||||||
|
%2 output parameter in printf format %02d
|
||||||
|
%3 output parameter in printf format %03d
|
||||||
|
%+x add the character x to parameter and output it as a character
|
||||||
|
(UW) %-x subtract parameter FROM the character x and output it as a char
|
||||||
|
(UW) %ax add the character x to parameter
|
||||||
|
(GNU) %a[+*-/=][cp]x
|
||||||
|
GNU arithmetic.
|
||||||
|
(UW) %sx subtract parameter FROM the character x
|
||||||
|
%>xy if parameter > character x then add character y to parameter
|
||||||
|
%B convert to BCD (parameter = (parameter/10)*16 + parameter%16)
|
||||||
|
%D Delta Data encode (parameter = parameter - 2*(paramter%16))
|
||||||
|
%i increment the first two parameters by one
|
||||||
|
%n xor the first two parameters by 0140
|
||||||
|
(GNU) %m xor the first two parameters by 0177
|
||||||
|
%r swap the first two parameters
|
||||||
|
(GNU) %b backup to previous parameter
|
||||||
|
(GNU) %f skip this parameter
|
||||||
|
|
||||||
|
Note the two definitions of %a, the GNU defintion is used if the characters
|
||||||
|
after the 'a' are valid, otherwise the UW definition is used.
|
||||||
|
|
||||||
|
(GNU) used by GNU Emacs termcap libraries
|
||||||
|
(UW) used by the University of Waterloo (MFCF) termcap libraries
|
||||||
|
|
||||||
|
*/
|
||||||
|
|
||||||
|
char *tparm(const char *str, ...) {
|
||||||
|
static char OOPS[] = "OOPS";
|
||||||
|
static char buf[MAX_LINE];
|
||||||
|
register const char *sp;
|
||||||
|
register char *dp;
|
||||||
|
register char *fmt;
|
||||||
|
char conv_char;
|
||||||
|
char scan_for;
|
||||||
|
int scan_depth = 0, if_depth;
|
||||||
|
static int i, j;
|
||||||
|
static char *s, c;
|
||||||
|
char fmt_buf[MAX_LINE];
|
||||||
|
char sbuf[MAX_LINE];
|
||||||
|
|
||||||
|
va_start(tparm_args, str);
|
||||||
|
|
||||||
|
sp = str;
|
||||||
|
dp = buf;
|
||||||
|
scan_for = 0;
|
||||||
|
if_depth = 0;
|
||||||
|
argcnt = 0;
|
||||||
|
pos = 0;
|
||||||
|
termcap = 1;
|
||||||
|
while(*sp != '\0') {
|
||||||
|
switch(*sp) {
|
||||||
|
case '\\':
|
||||||
|
if (scan_for) {
|
||||||
|
if (*++sp != '\0')
|
||||||
|
sp++;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
*dp++ = *sp++;
|
||||||
|
if (*sp != '\0')
|
||||||
|
*dp++ = *sp++;
|
||||||
|
break;
|
||||||
|
case '%':
|
||||||
|
sp++;
|
||||||
|
if (scan_for) {
|
||||||
|
if (*sp == scan_for && if_depth == scan_depth) {
|
||||||
|
if (scan_for == ';')
|
||||||
|
if_depth--;
|
||||||
|
scan_for = 0;
|
||||||
|
} else if (*sp == '?')
|
||||||
|
if_depth++;
|
||||||
|
else if (*sp == ';') {
|
||||||
|
if (if_depth == 0)
|
||||||
|
return OOPS;
|
||||||
|
else
|
||||||
|
if_depth--;
|
||||||
|
}
|
||||||
|
sp++;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
fmt = NULL;
|
||||||
|
switch(*sp) {
|
||||||
|
case '%':
|
||||||
|
*dp++ = *sp++;
|
||||||
|
break;
|
||||||
|
case '+':
|
||||||
|
if (!termcap) {
|
||||||
|
if (popnum(&j) || popnum(&i))
|
||||||
|
return OOPS;
|
||||||
|
i += j;
|
||||||
|
if (pushnum(i))
|
||||||
|
return OOPS;
|
||||||
|
sp++;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
;/* FALLTHROUGH */
|
||||||
|
case 'C':
|
||||||
|
if (*sp == 'C') {
|
||||||
|
if (getarg(termcap - 1, INTEGER, &i))
|
||||||
|
return OOPS;
|
||||||
|
if (i >= 96) {
|
||||||
|
i /= 96;
|
||||||
|
if (i == '$')
|
||||||
|
*dp++ = '\\';
|
||||||
|
*dp++ = i;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
fmt = "%c";
|
||||||
|
/* FALLTHROUGH */
|
||||||
|
case 'a':
|
||||||
|
if (!termcap)
|
||||||
|
return OOPS;
|
||||||
|
if (getarg(termcap - 1, INTEGER, (anyptr) &i))
|
||||||
|
return OOPS;
|
||||||
|
if (*++sp == '\0')
|
||||||
|
return OOPS;
|
||||||
|
if ((sp[1] == 'p' || sp[1] == 'c')
|
||||||
|
&& sp[2] != '\0' && fmt == NULL) {
|
||||||
|
/* GNU aritmitic parameter, what they
|
||||||
|
realy need is terminfo. */
|
||||||
|
int val, lc;
|
||||||
|
if (sp[1] == 'p'
|
||||||
|
&& getarg(termcap - 1 + sp[2] - '@',
|
||||||
|
INTEGER, (anyptr) &val))
|
||||||
|
return OOPS;
|
||||||
|
if (sp[1] == 'c') {
|
||||||
|
lc = cvtchar(sp + 2, &c) + 2;
|
||||||
|
/* Mask out 8th bit so \200 can be
|
||||||
|
used for \0 as per GNU doc's */
|
||||||
|
val = c & 0177;
|
||||||
|
} else
|
||||||
|
lc = 2;
|
||||||
|
switch(sp[0]) {
|
||||||
|
case '=':
|
||||||
|
break;
|
||||||
|
case '+':
|
||||||
|
val = i + val;
|
||||||
|
break;
|
||||||
|
case '-':
|
||||||
|
val = i - val;
|
||||||
|
break;
|
||||||
|
case '*':
|
||||||
|
val = i * val;
|
||||||
|
break;
|
||||||
|
case '/':
|
||||||
|
val = i / val;
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
/* Not really GNU's %a after all... */
|
||||||
|
lc = cvtchar(sp, &c);
|
||||||
|
val = c + i;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
arg_list[termcap - 1].integer = val;
|
||||||
|
sp += lc;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
sp += cvtchar(sp, &c);
|
||||||
|
arg_list[termcap - 1].integer = c + i;
|
||||||
|
if (fmt == NULL)
|
||||||
|
break;
|
||||||
|
sp--;
|
||||||
|
/* FALLTHROUGH */
|
||||||
|
case '-':
|
||||||
|
if (!termcap) {
|
||||||
|
if (popnum(&j) || popnum(&i))
|
||||||
|
return OOPS;
|
||||||
|
i -= j;
|
||||||
|
if (pushnum(i))
|
||||||
|
return OOPS;
|
||||||
|
sp++;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
fmt = "%c";
|
||||||
|
/* FALLTHROUGH */
|
||||||
|
case 's':
|
||||||
|
if (termcap && (fmt == NULL || *sp == '-')) {
|
||||||
|
if (getarg(termcap - 1, INTEGER, &i))
|
||||||
|
return OOPS;
|
||||||
|
if (*++sp == '\0')
|
||||||
|
return OOPS;
|
||||||
|
sp += cvtchar(sp, &c);
|
||||||
|
arg_list[termcap - 1].integer = c - i;
|
||||||
|
if (fmt == NULL)
|
||||||
|
break;
|
||||||
|
sp--;
|
||||||
|
}
|
||||||
|
if (!termcap)
|
||||||
|
return OOPS;
|
||||||
|
;/* FALLTHROUGH */
|
||||||
|
case '.':
|
||||||
|
if (termcap && fmt == NULL)
|
||||||
|
fmt = "%c";
|
||||||
|
;/* FALLTHROUGH */
|
||||||
|
case 'd':
|
||||||
|
if (termcap && fmt == NULL)
|
||||||
|
fmt = "%d";
|
||||||
|
;/* FALLTHROUGH */
|
||||||
|
case '2':
|
||||||
|
if (termcap && fmt == NULL)
|
||||||
|
fmt = "%02d";
|
||||||
|
;/* FALLTHROUGH */
|
||||||
|
case '3':
|
||||||
|
if (termcap && fmt == NULL)
|
||||||
|
fmt = "%03d";
|
||||||
|
;/* FALLTHROUGH */
|
||||||
|
case ':': case ' ': case '#': case 'u':
|
||||||
|
case 'x': case 'X': case 'o': case 'c':
|
||||||
|
case '0': case '1': case '4': case '5':
|
||||||
|
case '6': case '7': case '8': case '9':
|
||||||
|
if (fmt == NULL) {
|
||||||
|
if (termcap)
|
||||||
|
return OOPS;
|
||||||
|
if (*sp == ':')
|
||||||
|
sp++;
|
||||||
|
fmt = fmt_buf;
|
||||||
|
*fmt++ = '%';
|
||||||
|
while(*sp != 's' && *sp != 'x' && *sp != 'X' && *sp != 'd' && *sp != 'o' && *sp != 'c' && *sp != 'u') {
|
||||||
|
if (*sp == '\0')
|
||||||
|
return OOPS;
|
||||||
|
*fmt++ = *sp++;
|
||||||
|
}
|
||||||
|
*fmt++ = *sp;
|
||||||
|
*fmt = '\0';
|
||||||
|
fmt = fmt_buf;
|
||||||
|
}
|
||||||
|
conv_char = fmt[strlen(fmt) - 1];
|
||||||
|
if (conv_char == 's') {
|
||||||
|
if (popstring(&s))
|
||||||
|
return OOPS;
|
||||||
|
sprintf(sbuf, fmt, s);
|
||||||
|
} else {
|
||||||
|
if (termcap) {
|
||||||
|
if (getarg(termcap++ - 1,
|
||||||
|
INTEGER, &i))
|
||||||
|
return OOPS;
|
||||||
|
} else
|
||||||
|
if (popnum(&i))
|
||||||
|
return OOPS;
|
||||||
|
if (i == 0 && conv_char == 'c')
|
||||||
|
strcpy(sbuf, "\000");
|
||||||
|
else
|
||||||
|
sprintf(sbuf, fmt, i);
|
||||||
|
}
|
||||||
|
sp++;
|
||||||
|
fmt = sbuf;
|
||||||
|
while(*fmt != '\0') {
|
||||||
|
if (*fmt == '$')
|
||||||
|
*dp++ = '\\';
|
||||||
|
*dp++ = *fmt++;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case 'r':
|
||||||
|
if (!termcap || getarg(1, INTEGER, &i))
|
||||||
|
return OOPS;
|
||||||
|
arg_list[1].integer = arg_list[0].integer;
|
||||||
|
arg_list[0].integer = i;
|
||||||
|
sp++;
|
||||||
|
break;
|
||||||
|
case 'i':
|
||||||
|
if (getarg(1, INTEGER, &i)
|
||||||
|
|| arg_list[0].type != INTEGER)
|
||||||
|
return OOPS;
|
||||||
|
arg_list[1].integer++;
|
||||||
|
arg_list[0].integer++;
|
||||||
|
sp++;
|
||||||
|
break;
|
||||||
|
case 'n':
|
||||||
|
if (!termcap || getarg(1, INTEGER, &i))
|
||||||
|
return OOPS;
|
||||||
|
arg_list[0].integer ^= 0140;
|
||||||
|
arg_list[1].integer ^= 0140;
|
||||||
|
sp++;
|
||||||
|
break;
|
||||||
|
case '>':
|
||||||
|
if (!termcap) {
|
||||||
|
if (popnum(&j) || popnum(&i))
|
||||||
|
return OOPS;
|
||||||
|
i = (i > j);
|
||||||
|
if (pushnum(i))
|
||||||
|
return OOPS;
|
||||||
|
sp++;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
if (getarg(termcap-1, INTEGER, &i))
|
||||||
|
return OOPS;
|
||||||
|
sp += cvtchar(sp, &c);
|
||||||
|
if (i > c) {
|
||||||
|
sp += cvtchar(sp, &c);
|
||||||
|
arg_list[termcap-1].integer += c;
|
||||||
|
} else
|
||||||
|
sp += cvtchar(sp, &c);
|
||||||
|
sp++;
|
||||||
|
break;
|
||||||
|
case 'B':
|
||||||
|
if (!termcap || getarg(termcap-1, INTEGER, &i))
|
||||||
|
return OOPS;
|
||||||
|
arg_list[termcap-1].integer = 16*(i/10)+i%10;
|
||||||
|
sp++;
|
||||||
|
break;
|
||||||
|
case 'D':
|
||||||
|
if (!termcap || getarg(termcap-1, INTEGER, &i))
|
||||||
|
return OOPS;
|
||||||
|
arg_list[termcap-1].integer = i - 2 * (i % 16);
|
||||||
|
sp++;
|
||||||
|
break;
|
||||||
|
case 'p':
|
||||||
|
if (termcap > 1)
|
||||||
|
return OOPS;
|
||||||
|
if (*++sp == '\0')
|
||||||
|
return OOPS;
|
||||||
|
if (*sp == '0')
|
||||||
|
i = 9;
|
||||||
|
else
|
||||||
|
i = *sp - '1';
|
||||||
|
if (i < 0 || i > 9)
|
||||||
|
return OOPS;
|
||||||
|
if (pusharg(i))
|
||||||
|
return OOPS;
|
||||||
|
termcap = 0;
|
||||||
|
sp++;
|
||||||
|
break;
|
||||||
|
case 'P':
|
||||||
|
if (termcap || *++sp == '\0')
|
||||||
|
return OOPS;
|
||||||
|
i = *sp++ - 'a';
|
||||||
|
if (i < 0 || i > 25)
|
||||||
|
return OOPS;
|
||||||
|
if (pos-- == 0)
|
||||||
|
return OOPS;
|
||||||
|
switch(vars[i].type = S[pos].type) {
|
||||||
|
case ARG:
|
||||||
|
vars[i].argnum = S[pos].argnum;
|
||||||
|
break;
|
||||||
|
case NUM:
|
||||||
|
vars[i].value = S[pos].value;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case 'g':
|
||||||
|
if (termcap || *++sp == '\0')
|
||||||
|
return OOPS;
|
||||||
|
i = *sp++ - 'a';
|
||||||
|
if (i < 0 || i > 25)
|
||||||
|
return OOPS;
|
||||||
|
switch(vars[i].type) {
|
||||||
|
case ARG:
|
||||||
|
if (pusharg(vars[i].argnum))
|
||||||
|
return OOPS;
|
||||||
|
break;
|
||||||
|
case NUM:
|
||||||
|
if (pushnum(vars[i].value))
|
||||||
|
return OOPS;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case '\'':
|
||||||
|
if (termcap > 1)
|
||||||
|
return OOPS;
|
||||||
|
if (*++sp == '\0')
|
||||||
|
return OOPS;
|
||||||
|
sp += cvtchar(sp, &c);
|
||||||
|
if (pushnum(c) || *sp++ != '\'')
|
||||||
|
return OOPS;
|
||||||
|
termcap = 0;
|
||||||
|
break;
|
||||||
|
case '{':
|
||||||
|
if (termcap > 1)
|
||||||
|
return OOPS;
|
||||||
|
i = 0;
|
||||||
|
sp++;
|
||||||
|
while(isdigit(*sp))
|
||||||
|
i = 10 * i + *sp++ - '0';
|
||||||
|
if (*sp++ != '}' || pushnum(i))
|
||||||
|
return OOPS;
|
||||||
|
termcap = 0;
|
||||||
|
break;
|
||||||
|
case 'l':
|
||||||
|
if (termcap || popstring(&s))
|
||||||
|
return OOPS;
|
||||||
|
i = strlen(s);
|
||||||
|
if (pushnum(i))
|
||||||
|
return OOPS;
|
||||||
|
sp++;
|
||||||
|
break;
|
||||||
|
case '*':
|
||||||
|
if (termcap || popnum(&j) || popnum(&i))
|
||||||
|
return OOPS;
|
||||||
|
i *= j;
|
||||||
|
if (pushnum(i))
|
||||||
|
return OOPS;
|
||||||
|
sp++;
|
||||||
|
break;
|
||||||
|
case '/':
|
||||||
|
if (termcap || popnum(&j) || popnum(&i))
|
||||||
|
return OOPS;
|
||||||
|
i /= j;
|
||||||
|
if (pushnum(i))
|
||||||
|
return OOPS;
|
||||||
|
sp++;
|
||||||
|
break;
|
||||||
|
case 'm':
|
||||||
|
if (termcap) {
|
||||||
|
if (getarg(1, INTEGER, &i))
|
||||||
|
return OOPS;
|
||||||
|
arg_list[0].integer ^= 0177;
|
||||||
|
arg_list[1].integer ^= 0177;
|
||||||
|
sp++;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
if (popnum(&j) || popnum(&i))
|
||||||
|
return OOPS;
|
||||||
|
i %= j;
|
||||||
|
if (pushnum(i))
|
||||||
|
return OOPS;
|
||||||
|
sp++;
|
||||||
|
break;
|
||||||
|
case '&':
|
||||||
|
if (popnum(&j) || popnum(&i))
|
||||||
|
return OOPS;
|
||||||
|
i &= j;
|
||||||
|
if (pushnum(i))
|
||||||
|
return OOPS;
|
||||||
|
sp++;
|
||||||
|
break;
|
||||||
|
case '|':
|
||||||
|
if (popnum(&j) || popnum(&i))
|
||||||
|
return OOPS;
|
||||||
|
i |= j;
|
||||||
|
if (pushnum(i))
|
||||||
|
return OOPS;
|
||||||
|
sp++;
|
||||||
|
break;
|
||||||
|
case '^':
|
||||||
|
if (popnum(&j) || popnum(&i))
|
||||||
|
return OOPS;
|
||||||
|
i ^= j;
|
||||||
|
if (pushnum(i))
|
||||||
|
return OOPS;
|
||||||
|
sp++;
|
||||||
|
break;
|
||||||
|
case '=':
|
||||||
|
if (popnum(&j) || popnum(&i))
|
||||||
|
return OOPS;
|
||||||
|
i = (i == j);
|
||||||
|
if (pushnum(i))
|
||||||
|
return OOPS;
|
||||||
|
sp++;
|
||||||
|
break;
|
||||||
|
case '<':
|
||||||
|
if (popnum(&j) || popnum(&i))
|
||||||
|
return OOPS;
|
||||||
|
i = (i < j);
|
||||||
|
if (pushnum(i))
|
||||||
|
return OOPS;
|
||||||
|
sp++;
|
||||||
|
break;
|
||||||
|
case 'A':
|
||||||
|
if (popnum(&j) || popnum(&i))
|
||||||
|
return OOPS;
|
||||||
|
i = (i && j);
|
||||||
|
if (pushnum(i))
|
||||||
|
return OOPS;
|
||||||
|
sp++;
|
||||||
|
break;
|
||||||
|
case 'O':
|
||||||
|
if (popnum(&j) || popnum(&i))
|
||||||
|
return OOPS;
|
||||||
|
i = (i || j);
|
||||||
|
if (pushnum(i))
|
||||||
|
return OOPS;
|
||||||
|
sp++;
|
||||||
|
break;
|
||||||
|
case '!':
|
||||||
|
if (popnum(&i))
|
||||||
|
return OOPS;
|
||||||
|
i = !i;
|
||||||
|
if (pushnum(i))
|
||||||
|
return OOPS;
|
||||||
|
sp++;
|
||||||
|
break;
|
||||||
|
case '~':
|
||||||
|
if (popnum(&i))
|
||||||
|
return OOPS;
|
||||||
|
i = ~i;
|
||||||
|
if (pushnum(i))
|
||||||
|
return OOPS;
|
||||||
|
sp++;
|
||||||
|
break;
|
||||||
|
case '?':
|
||||||
|
if (termcap > 1)
|
||||||
|
return OOPS;
|
||||||
|
termcap = 0;
|
||||||
|
if_depth++;
|
||||||
|
sp++;
|
||||||
|
break;
|
||||||
|
case 't':
|
||||||
|
if (popnum(&i) || if_depth == 0)
|
||||||
|
return OOPS;
|
||||||
|
if (!i) {
|
||||||
|
scan_for = 'e';
|
||||||
|
scan_depth = if_depth;
|
||||||
|
}
|
||||||
|
sp++;
|
||||||
|
break;
|
||||||
|
case 'e':
|
||||||
|
if (if_depth == 0)
|
||||||
|
return OOPS;
|
||||||
|
scan_for = ';';
|
||||||
|
scan_depth = if_depth;
|
||||||
|
sp++;
|
||||||
|
break;
|
||||||
|
case ';':
|
||||||
|
if (if_depth-- == 0)
|
||||||
|
return OOPS;
|
||||||
|
sp++;
|
||||||
|
break;
|
||||||
|
case 'b':
|
||||||
|
if (--termcap < 1)
|
||||||
|
return OOPS;
|
||||||
|
sp++;
|
||||||
|
break;
|
||||||
|
case 'f':
|
||||||
|
if (!termcap++)
|
||||||
|
return OOPS;
|
||||||
|
sp++;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
if (scan_for)
|
||||||
|
sp++;
|
||||||
|
else
|
||||||
|
*dp++ = *sp++;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
va_end(tparm_args);
|
||||||
|
*dp = '\0';
|
||||||
|
return buf;
|
||||||
|
}
|
121
lib/libtermcap/tputs.c
Normal file
121
lib/libtermcap/tputs.c
Normal file
@ -0,0 +1,121 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (c) 1980, 1993
|
||||||
|
* The Regents of the University of California. All rights reserved.
|
||||||
|
*
|
||||||
|
* Redistribution and use in source and binary forms, with or without
|
||||||
|
* modification, are permitted provided that the following conditions
|
||||||
|
* are met:
|
||||||
|
* 1. Redistributions of source code must retain the above copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer.
|
||||||
|
* 2. Redistributions in binary form must reproduce the above copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer in the
|
||||||
|
* documentation and/or other materials provided with the distribution.
|
||||||
|
* 3. All advertising materials mentioning features or use of this software
|
||||||
|
* must display the following acknowledgement:
|
||||||
|
* This product includes software developed by the University of
|
||||||
|
* California, Berkeley and its contributors.
|
||||||
|
* 4. Neither the name of the University nor the names of its contributors
|
||||||
|
* may be used to endorse or promote products derived from this software
|
||||||
|
* without specific prior written permission.
|
||||||
|
*
|
||||||
|
* THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
|
||||||
|
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||||
|
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||||
|
* ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
|
||||||
|
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
||||||
|
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
|
||||||
|
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
|
||||||
|
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
|
||||||
|
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
|
||||||
|
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
|
||||||
|
* SUCH DAMAGE.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef lint
|
||||||
|
static char sccsid[] = "@(#)tputs.c 8.1 (Berkeley) 6/4/93";
|
||||||
|
#endif /* not lint */
|
||||||
|
|
||||||
|
#include <ctype.h>
|
||||||
|
#include "termcap.h"
|
||||||
|
|
||||||
|
/*
|
||||||
|
* The following array gives the number of tens of milliseconds per
|
||||||
|
* character for each speed as returned by gtty. Thus since 300
|
||||||
|
* baud returns a 7, there are 33.3 milliseconds per char at 300 baud.
|
||||||
|
*/
|
||||||
|
static
|
||||||
|
short tmspc10[] = {
|
||||||
|
0, 2000, 1333, 909, 743, 666, 500, 333, 166, 83, 55, 41, 20, 10, 5,
|
||||||
|
3, 2, 1
|
||||||
|
};
|
||||||
|
|
||||||
|
short ospeed;
|
||||||
|
char PC;
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Put the character string cp out, with padding.
|
||||||
|
* The number of affected lines is affcnt, and the routine
|
||||||
|
* used to output one character is outc.
|
||||||
|
*/
|
||||||
|
tputs(const char *cp, int affcnt, int (*outc)(int))
|
||||||
|
{
|
||||||
|
register int i = 0;
|
||||||
|
register int mspc10;
|
||||||
|
|
||||||
|
if (cp == 0)
|
||||||
|
return;
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Convert the number representing the delay.
|
||||||
|
*/
|
||||||
|
if (isdigit(*cp)) {
|
||||||
|
do
|
||||||
|
i = i * 10 + *cp++ - '0';
|
||||||
|
while (isdigit(*cp));
|
||||||
|
}
|
||||||
|
i *= 10;
|
||||||
|
if (*cp == '.') {
|
||||||
|
cp++;
|
||||||
|
if (isdigit(*cp))
|
||||||
|
i += *cp - '0';
|
||||||
|
/*
|
||||||
|
* Only one digit to the right of the decimal point.
|
||||||
|
*/
|
||||||
|
while (isdigit(*cp))
|
||||||
|
cp++;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* If the delay is followed by a `*', then
|
||||||
|
* multiply by the affected lines count.
|
||||||
|
*/
|
||||||
|
if (*cp == '*')
|
||||||
|
cp++, i *= affcnt;
|
||||||
|
|
||||||
|
/*
|
||||||
|
* The guts of the string.
|
||||||
|
*/
|
||||||
|
while (*cp)
|
||||||
|
(*outc)(*cp++);
|
||||||
|
|
||||||
|
/*
|
||||||
|
* If no delay needed, or output speed is
|
||||||
|
* not comprehensible, then don't try to delay.
|
||||||
|
*/
|
||||||
|
if (i == 0)
|
||||||
|
return;
|
||||||
|
if (ospeed <= 0 || ospeed >= (sizeof tmspc10 / sizeof tmspc10[0]))
|
||||||
|
return;
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Round up by a half a character frame,
|
||||||
|
* and then do the delay.
|
||||||
|
* Too bad there are no user program accessible programmed delays.
|
||||||
|
* Transmitting pad characters slows many
|
||||||
|
* terminals down and also loads the system.
|
||||||
|
*/
|
||||||
|
mspc10 = tmspc10[ospeed];
|
||||||
|
i += mspc10 / 2;
|
||||||
|
for (i /= mspc10; i > 0; i--)
|
||||||
|
(*outc)(PC);
|
||||||
|
}
|
Loading…
Reference in New Issue
Block a user