mirror of
https://git.FreeBSD.org/src.git
synced 2025-01-04 12:52:15 +00:00
Moved from ports + several enhacmenets
This commit is contained in:
parent
f3dd526d3f
commit
abc4e99233
Notes:
svn2git
2020-12-20 02:59:44 +00:00
svn path=/cvs2svn/branches/ross_ridge/; revision=3400
104
lib/libmytinfo/EXAMPLES/terminfo.src
Normal file
104
lib/libmytinfo/EXAMPLES/terminfo.src
Normal file
@ -0,0 +1,104 @@
|
||||
#
|
||||
# terminfo.src
|
||||
#
|
||||
# By Ross Ridge
|
||||
# Public Domain
|
||||
# 92/02/01 07:30:32
|
||||
#
|
||||
# Some sample terminfo definitions
|
||||
#
|
||||
# @(#) mytinfo terminfo.src 3.2 92/02/01 public domain, By Ross Ridge
|
||||
#
|
||||
#
|
||||
dumb|dumb terminal, gn, co#80,
|
||||
#
|
||||
# Note not all ANSI terminals will support all of these capabilities.
|
||||
# This doesn't define any real terminal, and probably wouldn't work
|
||||
# with any real terminal either.
|
||||
#
|
||||
ansi-all|ANS X3.64-1979 terminal,
|
||||
cr=^M, cud1=^J, ind=^J, nel=^M^J, bell=^G, cub1=^H,
|
||||
cuu1=\EM, ff=^L, ht=^I,
|
||||
.ind=\ED, .nel=\EE, hts=\EH, hd=\EK, hu=\EL, ri=\EM,
|
||||
.ich1=\E[@, .ich=\E[%p1%d@, .cuu1=\E[A, cuu=\E[%p1%dA,
|
||||
cud1=\E[B, .cud=\E[%p1%dB, cuf1=\E[C, cuf=\E[%p1%dC,
|
||||
.cub1=\E[D, cub=\E[%p1%dD, .cnl=\E[%p1%dE, .cpl=\E[%p1%dF,
|
||||
.hpa=\E[%i%p1%dG, cup=\E[%i%p1%d;%p2%dH, .cht=\E[%p1%dI,
|
||||
ed=\E[J, el=\E[K, el1=\E[1K, il1=\E[L, il=\E[%p1%dL,
|
||||
dl1=\E[M, dl=\E[%p1%dM, .ef=\E[N, .ea=\E[O,
|
||||
dch1=\E[P, dch=\E[%p1%dP, .sem=\E[%p1%dQ,
|
||||
.cpr=\E[%i%p1%d;%p2%dR, indn=\E[%p1%dS, .ind=\E[S,
|
||||
rin=\E[%p1%dT, .ri=\E[T, .np=\E[%p1%dU, .pp=\E[%p1%dU,
|
||||
.ctc=\E[%p1%dW, ech=\E[%p1%dX, .cvt=\E[%p1%dY,
|
||||
cbt=\E[Z, hpa=\E[%i%p1%d`, .hpr=\E[%p1%da,
|
||||
rep=%p1%c%?%p2%{1}%>%t\E[%p2%{1}%-%db%;,
|
||||
.da=\E[c, vpa=\E[%i%p1%dd, .vpr=\E[%p1%e,
|
||||
.hvp=\E[%i%p1%d;%p2%df, tbc=\E[3g,
|
||||
mc=\E[0i, mc4=\E[4i, mc5=\E[5i,
|
||||
sgr=\E[%?%p6%t;1%;%?%p5%p1%|%t;2%;%?%p2%t;4%;%?%p4%t;6%;%?%p3%p1%|%t;7%;%?%p7%t;8%;m,
|
||||
smso=\E[1;7m, rmso=\E[m, smul=\E[4m, rmul=\E[m,
|
||||
blink=\E[6m, bold=\E[1m, invis=\E[8m, rev=\E[7m,
|
||||
sgr0=\E[m, .dsr=\E[%p1%dn, .daq=\E[%p1%do,
|
||||
.sl=\E[%p1%d\s@, .sr=\E[%p1%d\sA, clear=\E[H\EJ, home=\E[H,
|
||||
smir=\E[4h, rmir=\E[4l,
|
||||
is2=\E[1Q\E[1;2;3;4;5;7;10;11;13;14;16;15;17;18;19;20l\E[6;12h\E[m,
|
||||
rs2=\Ec\E[1Q\E[1;2;3;4;5;7;10;11;13;14;16;15;17;18;19;20l\E[6;12h\E[m\E[H\EJ,
|
||||
ansi-all-8|ANS X3.64-1979 terminal (8 bit),
|
||||
cr=^M, cud1=^J, ind=^J, nel=^M^J, bell=^G, cub1=^H,
|
||||
cuu1=\215, ff=^L, ht=^I,
|
||||
.ind=\204, .nel=\205, hts=\207, hd=\213, hu=\214, ri=\215,
|
||||
.ich1=\233@, .ich=\E%p1%d@, .cuu1=\233A, cuu=\233%p1%dA,
|
||||
cud1=\233B, .cud=\233%p1%dB, cuf1=\233C, cuf=\233%p1%dC,
|
||||
.cub1=\233D, cub=\233%p1%dD, .cnl=\233%p1%dE, .cpl=\233%p1%dF,
|
||||
.hpa=\233%i%p1%dG, cup=\233%i%p1%d;%p2%dH, .cht=\233%p1%dI,
|
||||
ed=\233J, el=\233K, el1=\2331K, il1=\233L, il=\233%p1%dL,
|
||||
dl1=\233M, dl=\233%p1%dM, .ef=\233N, .ea=\233O,
|
||||
dch1=\233P, dch=\233%p1%dP, .sem=\233%p1%dQ,
|
||||
.cpr=\233%i%p1%d;%p2%dR, indn=\233%p1%dS, .ind=\233S,
|
||||
rin=\233%p1%dT, .ri=\233T, .np=\233%p1%dU, .pp=\233%p1%dU,
|
||||
.ctc=\233%p1%dW, ech=\233%p1%dX, .cvt=\233%p1%dY,
|
||||
cbt=\233Z, hpa=\233%i%p1%d`, .hpr=\233%p1%da,
|
||||
rep=%p1%c%?%p2%{1}%>%t\233%p2%{1}%-%db%;,
|
||||
.da=\233c, vpa=\233%i%p1%dd, .vpr=\233%p1%e,
|
||||
.hvp=\233%i%p1%d;%p2%df, tbc=\2333g,
|
||||
mc=\2330i, mc4=\2334i, mc5=\2334i,
|
||||
sgr=\233%?%p6%t;1%;%?%p5%p1%|%t;2%;%?%p2%t;4%;%?%p4%t;6%;%?%p3%p1%|%t;7%;%?%p7%t;8%;m,
|
||||
smso=\2331;7m, rmso=\233m, smul=\2334m, rmul=\233m,
|
||||
blink=\2336m, bold=\2331m, invis=\2338m, rev=\2337m,
|
||||
sgr0=\233m, .dsr=\233%p1%dn, .daq=\233%p1%do,
|
||||
.sl=\233%p1%d\s@, .sr=\233%p1%d\sA, clear=\233H\EJ, home=\233H,
|
||||
smir=\2334h, rmir=\2334l,
|
||||
is2=\2331Q\2331;2;3;4;5;7;10;11;13;14;16;15;17;18;19;20l\2336;12h\233m,
|
||||
rs2=\Ec\2331Q\2331;2;3;4;5;7;10;11;13;14;16;15;17;18;19;20l\2336;12h\233m\233H\EJ,
|
||||
#
|
||||
# Not tested...
|
||||
#
|
||||
vt100|dec vt100,
|
||||
xon, UWxc, msgr,
|
||||
cols#80, lines#24, it#8, vt#3,
|
||||
cr=\r, csr=^[[%i%p1%d;%p2%dr, tbc=^[[3g, clear=^[[;H^[[2J$<100>,
|
||||
el=^[[K$<3>, ed=^[[J$<50>, cup=^[[%i%p1%d;%p2%dH$<5>, cud1=^[[B,
|
||||
home=^[[H, cub1=^[[D, cuf1=^[[C$<2>, cuu1=^[[A$<2>, blink=^[[5m$<2>,
|
||||
bold=^[[1m$<2>, rev=^[[7m$<2>, smso=^[[7m$<2>, smul=^[[4m$<2>,
|
||||
sgr0=^[[m^N$<2>, rmso=^[[m$<2>, rmul=^[[m$<2>, hts=^[H, ht=^I,
|
||||
is2=^[[1;24r^[[?1l^[[?3l^[[30h^[[?7h^[>, bell=^G,
|
||||
kbs=\b, kcud1=^[[B, kf0=^[OP, kf1=^[OQ, kf2=^[OR, kf3=^[OS,
|
||||
kcub1=^[[D, kcuf1=^[[C, kcuu1=^[[A, lf0=PF1, lf1=PF2,
|
||||
lf2=PF3, lf3=PF4, nel=\r^[D, cud=^[[%p1%dB, cub=^[[%p1%dD,
|
||||
cuf=^[[%p1%dC, cuu=^[[%p1%dA, rc=^[8, sc=^[7, ind=^[D, ri=^[M$<5>,
|
||||
sgr=^[[0;%?%p4%t;5%;%?%p6%t;1%;%?%p3%p1%|%t;7%;%?%p2%t;4%;m%?%p1%t^N%e^O%;$<2>,
|
||||
smacs=^O, rmacs=^N,
|
||||
vt100-am|vt100 with automatic margins,
|
||||
am, xenl, @el, @ed,
|
||||
use=vt100,
|
||||
vt102|dec vt102,
|
||||
is=\E<\E[1;24r\E[?1l\E[?3l\E[?5l\E[?7h\E>,
|
||||
il=\E[%p1%dL, dch=\E[%p1%dP, dl=\E[%p1%dM,
|
||||
il1=\E[L, dch1=\E[P, dl1=\E[M,
|
||||
mir, rmir=\E[4l, smir=\E[4h,
|
||||
use=vt100,
|
||||
vt200|vt220|vt200-js|vt220-js|dec vt200 series with jump scroll,
|
||||
clear=\E[H\E[J, rmso=\E[27m, rmul=\E[24m,
|
||||
is2=\E>\E[?3l\E[?4l\E[?5l\E[?7h\E[?8h\E[1;24r\E[24;1H,
|
||||
rs2=\E>\E[?3l\E[?4l\E[?5l\E[?7h\E[?8h,
|
||||
use=vt102,
|
211
lib/libmytinfo/INSTALL
Normal file
211
lib/libmytinfo/INSTALL
Normal file
@ -0,0 +1,211 @@
|
||||
Compiling this package requires a fair bit of knowledge about your system.
|
||||
There are no automatic configuration programmes or prepared configuration
|
||||
files for different type of systems. You will need to edit the Makefile
|
||||
to specify things like which compiler to use and any options it needs.
|
||||
The file config.h needs to be edited to reflect the system you are
|
||||
using and to enable and/or disable certain features.
|
||||
|
||||
Defines in config.h
|
||||
===================
|
||||
|
||||
USE_ANSIC
|
||||
|
||||
Normally this will be defined automaticly if __STDC__ is defined, but
|
||||
if your compile isn't truly ANSI C compliant you may need to undefine this.
|
||||
|
||||
USE_TERMIO
|
||||
|
||||
Define this if your system uses the termio tty driver. System III and
|
||||
System V use termio.
|
||||
|
||||
USE_SGTTY
|
||||
|
||||
Define this if your system uses the "sgtty" tty driver. V7 Unix and BSD
|
||||
use sgtty.
|
||||
|
||||
USE_WINSZ
|
||||
|
||||
If you defined USE_SGTTY you can define this if your system supports
|
||||
SIGWINSZ and the accompaning ioctls. If this is defined the library
|
||||
will get number of columns and lines from the tty driver not the
|
||||
terminal description. BSD 4.3 supports SIGWINSZ. This will also work
|
||||
if USE_TERMIO is defined on some hybrid System V machines such as Release 4.
|
||||
|
||||
Do not define both USE_TERMIO and USE_SGTTY. If your system supports both
|
||||
you'd probably be better of defining USE_TERMIO. If your system supports
|
||||
neither termio or sgtty you can leave USE_TERMIO and USE_SGTTY undefined,
|
||||
but this is only recommended for use with micomputers.
|
||||
|
||||
USE_STRINGS
|
||||
|
||||
If you define this then the header file <strings.h> will be included
|
||||
and BSD type string library assumed (index instead of strchr), otherwise
|
||||
<string.h> will included. If you have a BSD type system define this.
|
||||
If you have an ANSI C, System III, or System V type of system leave it
|
||||
undefined.
|
||||
|
||||
USE_MYBSEARCH
|
||||
|
||||
If your system's C library doesn't include bsearch, define this.
|
||||
Most System V systems have bsearch. However even your C library has this
|
||||
function you still may want to define USE_MYBSEARCH, see USE_SHORT_BSEARCH
|
||||
below. ("MYBSEARCH" is misnomer, I didn't write this routine.)
|
||||
|
||||
USE_SHORT_BSEARCH
|
||||
|
||||
If you define USE_MYBSEARCH you can define this so that the bsearch
|
||||
routine that library uses the type short instead of size_t (usually long)
|
||||
for it's arguments. This results a large speedup on 68000 based machines
|
||||
and possibly a significant speedup on others as well. However on some CPU's
|
||||
defining this will only make things slower.
|
||||
|
||||
USE_MYSTRTOK
|
||||
|
||||
If your system's C library doesn't include strtok, define this.
|
||||
Most ANSI C, System III, and System V systems have this.
|
||||
|
||||
USE_MYQSORT
|
||||
|
||||
If your system's C library doesn't include qsort, define this.
|
||||
All most all systems should have this function, if it doesn't complain
|
||||
to your vendor. The qsort routine comes from the GNU Emacs distribution.
|
||||
|
||||
USE_MYMKDIR
|
||||
|
||||
Define this if your system doesn't have the mkdir library function call.
|
||||
My routine simply calls the system command mkdir, you may have to
|
||||
edit mkdir.c if the pathname of that command isn't "/bin/mkdir".
|
||||
|
||||
USE_MEMORY
|
||||
|
||||
If your system has a <memory.h> header define this. If USE_MEMORY
|
||||
is not defined bcopy will used instead of memcpy.
|
||||
|
||||
USE_SMALLMEM
|
||||
|
||||
Use you can define use this to save some memory, but it doesn't
|
||||
save much at moment, and will only slow the library down.
|
||||
|
||||
USE_FAKE_STDIO
|
||||
|
||||
If you define this then the library won't use the real stdio but a
|
||||
fake one instead. This is for compatiblity with termcap and vi which
|
||||
don't use stdio.
|
||||
|
||||
USE_DOPRNT
|
||||
|
||||
If you don't have a vfprintf function, but you have a _doprnt function
|
||||
define this. If you don't have either than you can compile the library
|
||||
but not the support programmes. System V has vfprintf and most Unixes
|
||||
have a _doprnt (but probably not documented). BSD has released a freely
|
||||
distributable vfprintf for BSD Unixes.
|
||||
|
||||
USE_UPBC_KLUDGE
|
||||
|
||||
Define this if you want the library's tgoto to work like termcap's tgoto
|
||||
and avoid putting ^D, and \n into an output string by using the cursor up
|
||||
and backspace strings.
|
||||
|
||||
USE_EXTERN_UPBC
|
||||
|
||||
If you defined USE_UPBC_KLUDGE you can define this so tgoto will,
|
||||
like termcap's tgoto, get the cursor up and backspace strings from the
|
||||
externs UP and BC instead from the library's internal record.
|
||||
|
||||
USE_LITOUT_KLUDGE
|
||||
|
||||
Don't define this. It's another kludge for tgoto.
|
||||
|
||||
If neither USE_UPBC_KLUDGE or USE_LITOUT_KLUDGE is defined then tgoto
|
||||
won't worry about putting ^D, and \n in a string.
|
||||
|
||||
USE_PROTOTYPES
|
||||
|
||||
Define this if your compiler supports ANSI C style prototypes.
|
||||
|
||||
USE_STDLIB
|
||||
|
||||
Define this if your system has an <stdlib.h> header.
|
||||
|
||||
USE_STDARG
|
||||
|
||||
Define this if your system has an <stdarg.h> header. If this isn't
|
||||
defined <varargs.h> will be included instead.
|
||||
|
||||
USE_STDDEF
|
||||
|
||||
Define this if your system has an <stddef.h> header. If this isn't
|
||||
defined <sys/types.h> will be included instead.
|
||||
|
||||
typedef char *anyptr;
|
||||
|
||||
You should change the typedef to a type that any pointer can be assigned
|
||||
to or from. ANSI C compilers can use "typedef void *anyptr", most
|
||||
other compilers should use "typedef char *anyptr".
|
||||
|
||||
#define mysize_t unsigned
|
||||
|
||||
"mysize_t" needs to defined as the type of the size of an object, or
|
||||
the type of the sizeof operator. Traditional usage is "unsigned", for
|
||||
ANSI C you should define mysize_t as "size_t".
|
||||
|
||||
TERMCAPFILE
|
||||
|
||||
Define this to a string containing the default termcap file(s) to look
|
||||
for terminal descriptions in. Multiple filenames should be seperated
|
||||
by spaces and environment variables can be specfied by prefixing them
|
||||
with dolar signs ($). eg:
|
||||
#define TERMCAPFILE "$TERMCAPFILE $HOME/.termcap /etc/termcap"
|
||||
|
||||
TERMINFOSRC
|
||||
|
||||
Define this to a string containing the default terminfo source file to
|
||||
look for terminal descriptions in.
|
||||
|
||||
TERMINFODIR
|
||||
|
||||
Define this as the directory containing the default terminfo database,
|
||||
usually "/usr/lib/terminfo".
|
||||
|
||||
Any of TERMCAPFILE, TERMINFOSRC or TERMINFODIR can be left undefined.
|
||||
|
||||
|
||||
defs.h
|
||||
======
|
||||
|
||||
You may also need to edit defs.h and change the definitions of MAX_BUF,
|
||||
MAX_LINE, and MAX_NAME. Unless you are seriously starved for memory I
|
||||
don't recomend making them smaller.
|
||||
|
||||
|
||||
cap_list
|
||||
========
|
||||
|
||||
You can add new capabilities to the file cap_list. You must provide
|
||||
a type, terminfo variable name, terminfo capname, and termcap name for
|
||||
all capabilities and you must make sure they are all unique.
|
||||
|
||||
|
||||
Making in the library
|
||||
=====================
|
||||
|
||||
Once you've configured the package you can just type "make" and it
|
||||
will build the library and the "term.h" header. You can enter
|
||||
"make all" to make the library and the support programmes, tconv,
|
||||
cap2info, tic, clear, tput and tset. If you want a profiled library
|
||||
you can enter "make profiled". You can remove all the intermediate
|
||||
files with "make clean". "make spotless" will remove the target
|
||||
files as well.
|
||||
|
||||
|
||||
Installing the library
|
||||
======================
|
||||
|
||||
As for installing it, that's up to you. Depending on how much you
|
||||
plan to use the libraries and whether or not you have termcap and/or
|
||||
terminfo already you can install them "standard" places (ie. /usr/lib,
|
||||
/usr/include, /usr/bin), in local directories, or just leave them in
|
||||
the source directory. However if you are compiling programmes that
|
||||
use terminfo and linking it with this library you must make sure that
|
||||
this library's term.h file is included in your programme and not the
|
||||
system supplied one.
|
75
lib/libmytinfo/Makefile
Normal file
75
lib/libmytinfo/Makefile
Normal file
@ -0,0 +1,75 @@
|
||||
LIB= mytinfo
|
||||
BINDIR= /usr/bin
|
||||
SRCS= addstr.c binorder.c buildpath.c caplist.c capsort.c compar.c\
|
||||
fillterm.c findcap.c findterm.c getother.c gettbin.c\
|
||||
gettcap.c gettinfo.c tcapconv.c tcapvars.c termcap.c\
|
||||
terminfo.c tgoto.c tiget.c tmatch.c tparm.c tputs.c tty.c version.c
|
||||
MAN1= tconv.1
|
||||
MLINKS= tconv.1 tic.1 tconv.1 captoinfo.1
|
||||
CLEANFILES+= binorder.c caplist.c capsort.c mkbinorder mkcaplist \
|
||||
mkcapsort mktermhead mkversion readcaps.o term.h* \
|
||||
version.c quit.o tconv clear.t* *.test caps tput \
|
||||
tset ttest
|
||||
|
||||
CFLAGS+=-Wall
|
||||
|
||||
CAPS= 1000
|
||||
|
||||
all: $${_LIBS} tconv caps
|
||||
|
||||
beforeinstall: term.h
|
||||
-cmp -s term.h ${DESTDIR}/usr/include/term.h > \
|
||||
/dev/null 2>&1 || \
|
||||
$(INSTALL) $(COPY) -o ${BINOWN} -g ${BINGRP} -m 444 term.h \
|
||||
${DESTDIR}/usr/include
|
||||
|
||||
afterinstall:
|
||||
$(INSTALL) $(COPY) $(STRIP) -o $(BINOWN) -g $(BINGRP) -m $(BINMODE) \
|
||||
tconv caps ${DESTDIR}${BINDIR}
|
||||
rm -f ${DESTDIR}${BINDIR}/tic
|
||||
ln ${DESTDIR}${BINDIR}/tconv ${DESTDIR}${BINDIR}/tic
|
||||
rm -f ${DESTDIR}${BINDIR}/captoinfo
|
||||
ln ${DESTDIR}${BINDIR}/tconv ${DESTDIR}${BINDIR}/captoinfo
|
||||
|
||||
capsort.c: mkcapsort
|
||||
./mkcapsort > capsort.c
|
||||
|
||||
mkcapsort: mkcapsort.c caplist.o compar.o
|
||||
$(CC) $(CFLAGS) $(LDFLAGS) -o mkcapsort ${.CURDIR}/mkcapsort.c caplist.o compar.o
|
||||
|
||||
binorder.c: mkbinorder ${.CURDIR}/bin_order
|
||||
./mkbinorder ${.CURDIR}/bin_order > binorder.c
|
||||
|
||||
mkbinorder: mkbinorder.c capsort.o caplist.o compar.o findcap.o
|
||||
$(CC) $(CFLAGS) $(LDFLAGS) -o mkbinorder ${.CURDIR}/mkbinorder.c capsort.o \
|
||||
caplist.o compar.o findcap.o
|
||||
|
||||
version.c: mkversion
|
||||
./mkversion > version.c
|
||||
|
||||
mkversion: mkversion.c
|
||||
$(CC) $(CFLAGS) $(LDFLAGS) -o mkversion ${.CURDIR}/mkversion.c
|
||||
|
||||
term.h: term.head ${.CURDIR}/term.tail
|
||||
cat term.head ${.CURDIR}/term.tail > term.h
|
||||
|
||||
term.head: mktermhead ${.CURDIR}/cap_list
|
||||
./mktermhead -n $(CAPS) ${.CURDIR}/cap_list > term.head
|
||||
|
||||
caplist.c: mkcaplist ${.CURDIR}/cap_list
|
||||
./mkcaplist -n $(CAPS) ${.CURDIR}/cap_list > caplist.c
|
||||
|
||||
mktermhead: mktermhead.c readcaps.o
|
||||
$(CC) $(CFLAGS) $(LDFLAGS) -o mktermhead ${.CURDIR}/mktermhead.c readcaps.o
|
||||
|
||||
mkcaplist: mkcaplist.c readcaps.o
|
||||
$(CC) $(CFLAGS) $(LDFLAGS) -o mkcaplist ${.CURDIR}/mkcaplist.c readcaps.o
|
||||
|
||||
tconv: tconv.c quit.o version.o $${_LIBS}
|
||||
$(CC) ${CFLAGS} $(LDFLAGS) -L. -o tconv ${.CURDIR}/tconv.c quit.o version.o -l$(LIB)
|
||||
|
||||
caps: caps.c quit.o version.o $${_LIBS}
|
||||
$(CC) $(CFLAGS) -o caps $(LDFLAGS) -L. ${.CURDIR}/caps.c quit.o version.o -l$(LIB)
|
||||
|
||||
.include <bsd.lib.mk>
|
||||
|
75
lib/libmytinfo/README
Normal file
75
lib/libmytinfo/README
Normal file
@ -0,0 +1,75 @@
|
||||
Mytinfo is Public Domain and comes with no guarantees.
|
||||
By Ross Ridge (ross@zooid.guild.org).
|
||||
|
||||
Mytinfo is a single library that combines the functionality of the
|
||||
standard Unix termcap and terminfo libraries. It has the special
|
||||
ability of being able to fetch terminal descriptions from both
|
||||
termcap and terminfo databases regardless of which set of functions,
|
||||
termcap or terminfo, are used. It can even read terminal descriptions
|
||||
from terminfo source files.
|
||||
|
||||
You should be able to compile this library on almost all versions of Unix.
|
||||
Much of it's development was done on '386 Xenix, but I've sucessfuly built
|
||||
mytinfo under BSD 4.3, HP-UX 2.1 (System III), SunOS 3.5, and Amix
|
||||
(System V R4). There hasn't been a large amount of testing of the support
|
||||
programmes that come with the library, but the library itself has been in
|
||||
use on a couple of public access Unix sites for over two years. It has
|
||||
successfully linked and run with many programmes such as rn, vi and nethack.
|
||||
|
||||
Included in the package is tconv, an "all-in-one" programme that will
|
||||
compile terminfo sources to binary format and also translate termcap to
|
||||
either terminfo source or binary. tic and cap2info are just links
|
||||
to the tconv programme. I've also written replacement for tset,
|
||||
that uses the mytinfo library, in case tset doesn't come with your
|
||||
system or if you aren't too pleased with the one that did. Since this
|
||||
is the newest part of the package it probably still has a few bugs.
|
||||
You'll also find tput, as well two versions of clear, one that uses
|
||||
termcap and the other that uses terminfo.
|
||||
|
||||
The environment variables TERMCAP and TERMINFO can have multiple
|
||||
filenames separated by a space, a feature not in terminfo and not in
|
||||
most termcaps. This is very handy for users that maintain their own
|
||||
private databases, as they don't have to have a copy the entire
|
||||
database. Eg:
|
||||
TERMCAP="$HOME/.termcap /etc/termcap"
|
||||
TERMINFO="$HOME/terminfo /usr/lib/terminfo"
|
||||
export TERMCAP TERMINFO
|
||||
The library will also check compiled-in default locations for terminal
|
||||
descriptions. Like most termcaps, the TERMCAP variable can also
|
||||
contain the complete termcap terminal description, usually supplied
|
||||
from tset at login. The TERMINFO variable can also contain a complete
|
||||
terminfo description, but there is no programme like tset to supply it.
|
||||
|
||||
Unlike termcap, this library can only use capabilities that it knows about.
|
||||
However it does knows about all the standard ones, and you can easily
|
||||
add your own to it's list. Included in the list are all terminfo
|
||||
capabilities to Release 4 of System V, obsolete termcap capabilities, a
|
||||
few caps used from the University of Waterloo (UW), a couple from GNU Emacs,
|
||||
and a few I made up myself. Two extensions to the standard termcap % codes
|
||||
are supported, GNU's %a, %m, %b, and %f, and UW's %-, %a, and %s.
|
||||
|
||||
Termcap and terminfo source descriptions can be mixed in one file, but
|
||||
because of this termcap databases must be in a certain style. All
|
||||
continuation lines of a termcap entry must be indented from the left
|
||||
margin by white space. This shouldn't be a problem with most sites
|
||||
since this is the style that most termcap files are distributed, but local
|
||||
additions may not adhere to this style. Another possible problem is
|
||||
that termcap entries should end with a colon (:), but in most
|
||||
distributed termcaps there are entries that don't. If a one line
|
||||
termcap entry doesn't end with a colon, it will be ignored. A quick
|
||||
way to find these is "tconv -c /etc/termcap > /dev/null".
|
||||
|
||||
See the file INSTALL for instructions on configuring and installing
|
||||
this library. The file README.doc lists the functions supported by the
|
||||
library, and gives short description of the tconv programme. tconv.1 is
|
||||
a simple man page for tconv. terminfo.src contains a few sample
|
||||
terminal descriptions in terminfo source format. TODO is a list of
|
||||
possible enhancements too the library, your comments and additions
|
||||
are welcome.
|
||||
|
||||
Please let me know of any bugs you find, as well as any ideas you have
|
||||
for improvement.
|
||||
|
||||
Ross Ridge
|
||||
|
||||
ross@zooid.guild.org
|
125
lib/libmytinfo/README.doc
Normal file
125
lib/libmytinfo/README.doc
Normal file
@ -0,0 +1,125 @@
|
||||
----------------------------------------------------------------------------
|
||||
tconv [-b] [-c [-OUGd]] [-i] [-B [-D dir]] [-I] [-k] [-t term] [file]
|
||||
tic [file]
|
||||
cap2info [-t term] [-OUGdk] [file]
|
||||
|
||||
-c convert from termcap
|
||||
-i convert from terminfo source
|
||||
-b convert from terminfo binary
|
||||
-B convert to terminfo binary
|
||||
-I convert to terminfo source
|
||||
|
||||
The following switches are available when converting from termcap:
|
||||
-d don't supply any defaults for missing capabilities
|
||||
-O include obsolete termcap capabilities
|
||||
-G include GNU capabilities
|
||||
-U include UW capabilities
|
||||
|
||||
-k keep comments
|
||||
-D dir directory to put terminfo binaries in
|
||||
|
||||
-t term name of terminal to translate
|
||||
file filename of termcap/terminfo database to use
|
||||
|
||||
If a file is specifed and no terminal is given the entire file we be translated.
|
||||
If no terminal and no file is specified then the terminal name will be taken
|
||||
from the environment varible TERM. Unless compiling to a terminfo binary,
|
||||
output is to stdout.
|
||||
----------------------------------------------------------------------------
|
||||
|
||||
char *tparm(char *str, ...); /* up to nine parameters */
|
||||
char *tgoto(char *str, int column, int row);
|
||||
|
||||
tparm and tgoto support the following termcap and terminfo % 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
|
||||
|
||||
(GNU) used by GNU Emacs termcap libraries
|
||||
(UW) used by the University of Waterloo (MFCF) termcap libraries
|
||||
|
||||
Note the two definitions of %a, the GNU defintion is used if the characters
|
||||
after the 'a' are valid for it, otherwise the UW definition is used.
|
||||
----------------------------------------------------------------------------
|
||||
|
||||
int setupterm(char *term; int fd; int *err);
|
||||
int set_curterm(TERMINAL *new);
|
||||
int del_curterm(TERMINAL *old);
|
||||
char *tparm(char *str, ...); /* see above */
|
||||
int tputs(char *str, int count, int (*putc)());
|
||||
int putp(str);
|
||||
int tigetflag(char *cap);
|
||||
int tigetnum(char *cap);
|
||||
char *tigetstr(char *cap);
|
||||
int def_prog_mode();
|
||||
int def_shell_mode();
|
||||
int reset_prog_mode();
|
||||
int reset_shell_mode();
|
||||
char *boolnames[], *boolcodes[], *boolfnames[];
|
||||
char *numnames[], *numcodes[], *numfnames[];
|
||||
char *strnames[], *strcodes[], *strfnames[];
|
||||
|
||||
These functions work just like the terminfo functions. Note restartterm(),
|
||||
vidputs(), vidattr(), and mvcur() are not available.
|
||||
----------------------------------------------------------------------------
|
||||
|
||||
int tgetent(char *buf, char *term);
|
||||
int tgetflag(char *cap);
|
||||
int tgetnum(char *cap);
|
||||
char *tgetstr(char *cap, char **area);
|
||||
char *tgoto(char *cap, int column, int row);
|
||||
int tputs(char *str, int count, int (*putc)());
|
||||
|
||||
These functions work just like termcap functions.
|
||||
----------------------------------------------------------------------------
|
88
lib/libmytinfo/addstr.c
Normal file
88
lib/libmytinfo/addstr.c
Normal file
@ -0,0 +1,88 @@
|
||||
/*
|
||||
* addstr.c
|
||||
*
|
||||
* By Ross Ridge
|
||||
* Public Domain
|
||||
* 92/02/01 07:34:01
|
||||
*
|
||||
*/
|
||||
|
||||
#include "defs.h"
|
||||
#include <term.h>
|
||||
|
||||
#include <ctype.h>
|
||||
|
||||
#ifdef USE_SCCS_IDS
|
||||
static char const SCCSid[] = "@(#) mytinfo addstr.c 3.2 92/02/01 public domain, By Ross Ridge";
|
||||
#endif
|
||||
/*
|
||||
* I think this routine could be improved, as it is now it searches a
|
||||
* linked list of strbufs for one that has enough room left for the
|
||||
* string. The only thing else I can think of doing would be to
|
||||
* expand a buffer by realloc and then fix the string pointers if it
|
||||
* moves.
|
||||
*/
|
||||
|
||||
static struct strbuf *strbuf = NULL;
|
||||
|
||||
struct strbuf *
|
||||
_endstr() {
|
||||
register struct strbuf *p;
|
||||
|
||||
p = strbuf;
|
||||
strbuf = NULL;
|
||||
return p;
|
||||
}
|
||||
|
||||
char *
|
||||
_addstr(s)
|
||||
register char *s; {
|
||||
register struct strbuf *p;
|
||||
register int l;
|
||||
|
||||
if (s == NULL) {
|
||||
strbuf = NULL;
|
||||
return NULL;
|
||||
}
|
||||
|
||||
if (strbuf == NULL) {
|
||||
strbuf = (struct strbuf *) malloc(sizeof(struct strbuf));
|
||||
if (strbuf == NULL)
|
||||
return NULL;
|
||||
strbuf->len = 0;
|
||||
strbuf->next = NULL;
|
||||
}
|
||||
l = strlen(s) + 1;
|
||||
if (l > MAX_CHUNK)
|
||||
return NULL;
|
||||
p = strbuf;
|
||||
while (l + p->len > MAX_CHUNK) {
|
||||
if (p->next == NULL) {
|
||||
p->next = (struct strbuf *)
|
||||
malloc(sizeof(struct strbuf));
|
||||
p = p->next;
|
||||
if (p == NULL)
|
||||
return NULL;
|
||||
p->len = 0;
|
||||
p->next = NULL;
|
||||
break;
|
||||
}
|
||||
p = p->next;
|
||||
}
|
||||
s = strcpy(p->buf + p->len, s);
|
||||
p->len += l;
|
||||
return s;
|
||||
}
|
||||
|
||||
void
|
||||
_del_strs(p)
|
||||
TERMINAL *p; {
|
||||
struct strbuf *q;
|
||||
|
||||
q = p->strbuf;
|
||||
while(q != NULL) {
|
||||
p->strbuf = q->next;
|
||||
free((anyptr) q);
|
||||
q = p->strbuf;
|
||||
}
|
||||
}
|
48
lib/libmytinfo/bin_order
Normal file
48
lib/libmytinfo/bin_order
Normal file
@ -0,0 +1,48 @@
|
||||
bin_order
|
||||
|
||||
By Ross Ridge
|
||||
Public Domain
|
||||
92/02/01 07:29:39
|
||||
|
||||
Order of entries in a terminfo binary
|
||||
|
||||
@(#) mytinfo bin_order 3.2 92/02/01 public domain, By Ross Ridge
|
||||
|
||||
|
||||
!
|
||||
bw am xsb xhp xenl eo gn hc km hs in da db mir msgr os eslok xt hz ul
|
||||
xon nxon mc5i chts nrrmc npc ndscr ccc bce hls xhpa crxm daisy xvpa sam
|
||||
cpix lpix
|
||||
|
||||
#
|
||||
cols it lines lm xmc pb vt wsl nlab lh lw ma wnum colors pairs ncv bufsz
|
||||
spinv spinh maddr mjump mcs mls npins orc orl orhi orvi cps widcs btns
|
||||
bitwin bitype
|
||||
|
||||
$
|
||||
cbt bel cr csr tbc clear el ed hpa cmdch cup cud1 home civis cub1 mrcup cnorm
|
||||
cuf1 ll cuu1 cvvis dch1 dl1 dsl hd smacs blink bold smcup smdc dim smir invis
|
||||
prot rev smso smul ech rmacs sgr0 rmcup rmdc rmir rmso rmul flash ff fsl is1
|
||||
is2 is3 if ich1 il1 ip kbs ktbc kclr kctab kdch1 kdl1 kcud1 krmir kel ked
|
||||
kf0 kf1 kf10 kf2 kf3 kf4 kf5 kf6 kf7 kf8 kf9 khome kich1 kil1 kcub1 kll
|
||||
knp kpp kcuf1 kind kri khts kcuu1 rmkx smkx lf0 lf1 lf10 lf2 lf3 lf4 lf5
|
||||
lf6 lf7 lf8 lf9 rmm smm nel pad dch dl cud ich indn il cub cuf rin cuu pfkey
|
||||
pfloc pfx mc0 mc4 mc5 rep rs1 rs2 rs3 rf rc vpa sc ind ri sgr hts wind ht
|
||||
tsl uc hu iprog ka1 ka3 kb2 kc1 kc3 mc5p rmp acsc pln kcbt smxon rmxon
|
||||
smam rmam xonc xoffc enacs smln rmln kbeg kcan kclo kcmd kcpy kcrt kend
|
||||
kent kext kfnd khlp kmrk kmsg kmov knxt kopn kopt kprv kprt krdo kref
|
||||
krfr krpl krst kres ksav kspd kund kBEG kCAN kCMD kCPY kCRT kDC kDL kslt
|
||||
kEND kEOL kEXT kFND kHLP kHOM kIC kLFT kMSG kMOV kNXT kOPT kPRV kPRT kRDO
|
||||
kRPL kRIT kRES kSAV kSPD kUND rfi kf11 kf12 kf13 kf14 kf15 kf16 kf17 kf18
|
||||
kf19 kf20 kf21 kf22 kf23 kf24 kf25 kf26 kf27 kf28 kf29 kf30 kf31 kf32
|
||||
kf33 kf34 kf35 kf36 kf37 kf38 kf39 kf40 kf41 kf42 kf43 kf44 kf45 kf46 kf47
|
||||
kf48 kf49 kf50 kf51 kf52 kf53 kf54 kf55 kf56 kf57 kf58 kf59 kf60 kf61 kf62
|
||||
kf63 el1 mgc smgl smgr fln sclk dclk rmclk cwin wingo hup dial qdial tone
|
||||
pulse hook pause wait u0 u1 u2 u3 u4 u5 u6 u7 u8 u9 op oc initc initp scp
|
||||
setf setb cpi lpi chr cvr defc swidm sdrfq sitm slm smicm snlq snrmq sshm
|
||||
ssubm ssupm sum rwidm ritm rlm rmicm rshm rsubm rsupm rum mhpa mcud1 mcub1
|
||||
mcuf1 mvpa mcuu1 porder mcud mcub mcuf mcuu scs smgb smgbp smglp smgrp smgt
|
||||
smgtp sbim scsd rbim rcsd subcs supcs docr zerom csnm kmous minfo reqmp
|
||||
getm setaf setab pfxl devt csin s0ds s1ds s2ds s3ds smglr smgtb birep binel
|
||||
bicr colornm defbi endbi setcolor slines dispc smpch rmpch smsc rmsc pctrm
|
||||
scesc scesa
|
97
lib/libmytinfo/bsearch.c
Normal file
97
lib/libmytinfo/bsearch.c
Normal file
@ -0,0 +1,97 @@
|
||||
/*
|
||||
* bsearch.c
|
||||
*
|
||||
* This is something I found on watmath. I've made some minor changes for use
|
||||
* in this package.
|
||||
*
|
||||
* 92/06/04 11:35:15
|
||||
*/
|
||||
|
||||
#if 0
|
||||
#ifndef lint
|
||||
static char *RCSid = "$OHeader: /usr/mfcf/src/accounts/libuw/RCS/bsearch.c,v 1.1 88/06/11 20:41:48 root Exp $";
|
||||
#endif
|
||||
#endif
|
||||
|
||||
#include "defs.h"
|
||||
|
||||
#ifdef USE_MYBSEARCH
|
||||
|
||||
#ifdef USE_SCCS_IDS
|
||||
static char const SCCSid[] = "@(#) mytinfo bsearch.c 3.4 92/06/04 public domain, By Ross Ridge";
|
||||
#endif
|
||||
|
||||
#ifdef USE_SHORT_BSEARCH
|
||||
#define fast_int short
|
||||
#else
|
||||
#define fast_int mysize_t
|
||||
#endif
|
||||
|
||||
/*
|
||||
* bsearch - find an element of a sorted vector
|
||||
*
|
||||
* found = bsearch(key, array, dimension, width, compare)
|
||||
* returns a pointer to the specified element in the array,
|
||||
* or (char*)0 if the element can't be found.
|
||||
* key
|
||||
* pointer to the element to be searched for in the array
|
||||
* array
|
||||
* address of an array of elements
|
||||
* dimension
|
||||
* number of elements in the array
|
||||
* width
|
||||
* sizeof(type) of each element
|
||||
* compare
|
||||
* pointer to a function taking (char *) pointers to two elements
|
||||
* and returning <0, 0, or >0 as the first element comes before,
|
||||
* at, or after the second element. A compare function is provided
|
||||
* for comparing strings.
|
||||
*/
|
||||
#if 0
|
||||
/*
|
||||
* $OLog: bsearch.c,v $
|
||||
* Revision 1.1 88/06/11 20:41:48 root
|
||||
* Initial revision
|
||||
*
|
||||
*/
|
||||
#endif
|
||||
|
||||
static anyptr
|
||||
bsearch(key, array, dimension, iwidth, compare)
|
||||
anyptr key;
|
||||
anyptr array;
|
||||
int dimension;
|
||||
mysize_t iwidth;
|
||||
compar_fn compare;
|
||||
{
|
||||
register fast_int start; /* offset to start of current interval */
|
||||
register fast_int end; /* offset to end+1 of current interval */
|
||||
register fast_int middle; /* offset to middle of current interval */
|
||||
auto int status;
|
||||
register fast_int width;
|
||||
|
||||
width = iwidth / sizeof(char);
|
||||
|
||||
start = 0;
|
||||
middle = 0;
|
||||
end = dimension;
|
||||
|
||||
while (start < end) {
|
||||
|
||||
middle = (start + end) / 2;
|
||||
|
||||
status = (*compare)(key, ((char *)array + middle*width));
|
||||
|
||||
if (status < 0)
|
||||
end = middle;
|
||||
|
||||
else if (status > 0)
|
||||
start = middle + 1;
|
||||
|
||||
else return (anyptr)(((char *)array) + middle*width);
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
#endif /* USE_MYBSEARCH */
|
203
lib/libmytinfo/buildpath.c
Normal file
203
lib/libmytinfo/buildpath.c
Normal file
@ -0,0 +1,203 @@
|
||||
/*
|
||||
* buildpath.c
|
||||
*
|
||||
* By Ross Ridge
|
||||
* Public Domain
|
||||
* 92/02/01 07:29:42
|
||||
*
|
||||
* _buildpath builds a list of file names and terminal descriprions extracted
|
||||
* from its arguments. It returns a pointer to a structure that is used by
|
||||
* other routines as the list of file names to search for terminal
|
||||
* descriptions. It is passed a variable number of arguments consisting
|
||||
* of file name and type pairs. The file name can actually be a list of
|
||||
* file names seperated by spaces and any environment variables specified
|
||||
* by a dollar sign ($) followed by its name are substituted in. A type
|
||||
* of 1 indicates that the file name may actually be termcap description
|
||||
* and a type of 2 indicates it may be a terminfo description. A type of 0
|
||||
* indicates that the file name can only be a file name (or list of them).
|
||||
*
|
||||
*/
|
||||
|
||||
#include "defs.h"
|
||||
|
||||
#include <ctype.h>
|
||||
|
||||
#ifndef __FreeBSD__
|
||||
#include "strtok.c"
|
||||
#endif
|
||||
|
||||
#ifdef USE_SCCS_IDS
|
||||
static const char SCCSid[] = "@(#) mytinfo buildpath.c 3.2 92/02/01 public domain, By Ross Ridge";
|
||||
#endif
|
||||
|
||||
/* more memory is allocated for file names every HUNK file names */
|
||||
#define HUNK 32
|
||||
|
||||
/* characters that seperate file names in a list */
|
||||
#define SEPERATORS " :"
|
||||
|
||||
static struct term_path *path = NULL; /* the list of files */
|
||||
static int files = 0; /* # of files in the list */
|
||||
static int size = 0; /* # of files there is space for */
|
||||
|
||||
/* add a file name, type pair to the list */
|
||||
static int
|
||||
addfile(file, type)
|
||||
char *file;
|
||||
int type; {
|
||||
int l;
|
||||
char *s;
|
||||
|
||||
if (file == NULL) {
|
||||
if (type != -1)
|
||||
return -1;
|
||||
} else if (file[0] == '\0')
|
||||
return -1;
|
||||
|
||||
#ifdef DEBUG
|
||||
if (file != NULL)
|
||||
printf("addfile: %s\n", file);
|
||||
#endif
|
||||
|
||||
if (files >= size) {
|
||||
size += HUNK;
|
||||
if (path == NULL)
|
||||
path = (struct term_path *)
|
||||
malloc(size * sizeof(struct term_path));
|
||||
else
|
||||
path = (struct term_path *)
|
||||
realloc((anyptr) path,
|
||||
size * sizeof(struct term_path));
|
||||
if (path == NULL)
|
||||
return 0;
|
||||
}
|
||||
if (file == NULL) {
|
||||
path[files].file = file;
|
||||
} else {
|
||||
l = strlen(file) + 1;
|
||||
s = (char *) malloc(l * sizeof(char));
|
||||
if (s == NULL)
|
||||
return 0;
|
||||
path[files].file = strcpy(s, file);
|
||||
}
|
||||
path[files].type = type;
|
||||
|
||||
return ++files;
|
||||
}
|
||||
|
||||
/* deallocate space used by the path list */
|
||||
void
|
||||
_delpath(ppath)
|
||||
struct term_path *ppath; {
|
||||
struct term_path *p;
|
||||
|
||||
p = ppath;
|
||||
while(p->file != NULL) {
|
||||
free((anyptr)p->file);
|
||||
p++;
|
||||
}
|
||||
|
||||
free((anyptr)ppath);
|
||||
}
|
||||
|
||||
/* build a list of paths. see above */
|
||||
#ifdef lint
|
||||
/*VARARGS2*/
|
||||
struct term_path *
|
||||
_buildpath(file, type)
|
||||
char *file;
|
||||
int type;
|
||||
#else
|
||||
#ifdef USE_STDARG
|
||||
#ifdef USE_PROTOTYPES
|
||||
struct term_path *_buildpath(char *file, int type, ...)
|
||||
#else
|
||||
struct term_path *_buildpath(file, type)
|
||||
char *file;
|
||||
int type;
|
||||
#endif /* USE_PROTOTYPES */
|
||||
#else /* USE_STDARG */
|
||||
struct term_path *_buildpath(va_alist)
|
||||
va_dcl
|
||||
#endif /* USE_STDARG */
|
||||
#endif /* lint */
|
||||
{
|
||||
#ifndef lint
|
||||
#ifndef USE_STDARG
|
||||
char *file;
|
||||
int type;
|
||||
#endif
|
||||
#endif
|
||||
va_list ap;
|
||||
register char *s, *d, *e;
|
||||
char line[MAX_BUF+1];
|
||||
char name[MAX_NAME+1];
|
||||
int i,j;
|
||||
|
||||
size = 0;
|
||||
files = 0;
|
||||
path = NULL;
|
||||
|
||||
#ifdef lint
|
||||
ap = NULL;
|
||||
#else
|
||||
#ifdef USE_STDARG
|
||||
va_start(ap, type);
|
||||
#else
|
||||
va_start(ap);
|
||||
file = va_arg(ap, char *);
|
||||
type = va_arg(ap, int);
|
||||
#endif
|
||||
#endif
|
||||
|
||||
while (type >= 0 && type <= 2) {
|
||||
s = file;
|
||||
d = line;
|
||||
i = 0;
|
||||
while(*s != '\0') {
|
||||
if (*s == '$') {
|
||||
s++;
|
||||
j = 0;
|
||||
while(*s != '\0' && (*s == '_' || isalnum(*s)))
|
||||
if (j < MAX_NAME) {
|
||||
name[j] = *s++;
|
||||
j++;
|
||||
} else
|
||||
break;
|
||||
name[j] = '\0';
|
||||
e = getenv(name);
|
||||
if (e != NULL) {
|
||||
while(*e != '\0') {
|
||||
if (i < MAX_BUF) {
|
||||
*d++ = *e++;
|
||||
i++;
|
||||
} else
|
||||
break;
|
||||
}
|
||||
} else if (*s == '/')
|
||||
s++;
|
||||
} else {
|
||||
if (i < MAX_BUF) {
|
||||
*d++ = *s++;
|
||||
i++;
|
||||
} else
|
||||
break;
|
||||
}
|
||||
}
|
||||
*d = '\0';
|
||||
if (type == 0 || line[0] == '/') {
|
||||
s = strtok(line, SEPERATORS);
|
||||
while(s != NULL) {
|
||||
if (addfile(s, 0) == 0)
|
||||
return NULL;
|
||||
s = strtok(NULL, SEPERATORS);
|
||||
}
|
||||
} else
|
||||
if (addfile(line, type) == 0)
|
||||
return NULL;
|
||||
file = va_arg(ap, char *);
|
||||
type = va_arg(ap, int);
|
||||
}
|
||||
addfile(NULL, -1);
|
||||
return path;
|
||||
}
|
529
lib/libmytinfo/cap_list
Normal file
529
lib/libmytinfo/cap_list
Normal file
@ -0,0 +1,529 @@
|
||||
cap_list
|
||||
|
||||
By Ross Ridge
|
||||
Public Domain
|
||||
92/02/01 07:29:44
|
||||
|
||||
@(#) mytinfo cap_list 3.2 92/02/01 public domain, By Ross Ridge
|
||||
|
||||
types: ! = boolean, # = number, $ = string, $G = string with parameters,
|
||||
$K = string that never is outputed (with tputs).
|
||||
|
||||
type variable capname termcap
|
||||
|
||||
Standard terminfo capabilities:
|
||||
|
||||
! auto_left_margin bw bw
|
||||
! auto_right_margin am am
|
||||
! ceol_standout_glitch xhp xs
|
||||
! dest_tabs_magic_smso xt xt
|
||||
! eat_newline_glitch xenl xn
|
||||
! erase_overstrike eo eo
|
||||
! generic_type gn gn
|
||||
! hard_copy hc hc
|
||||
! hard_cursor chts HC
|
||||
! has_meta_key km km
|
||||
! has_status_line hs hs
|
||||
! insert_null_glitch in in
|
||||
! memory_above da da
|
||||
! memory_below db db
|
||||
! move_insert_mode mir mi
|
||||
! move_standout_mode msgr ms
|
||||
! needs_xon_xoff nxon nx
|
||||
! no_esc_ctlc xsb xb
|
||||
! no_pad_char npc NP
|
||||
! non_rev_rmcup nrrmc NR
|
||||
! over_strike os os
|
||||
! prtr_silent mc5i 5i
|
||||
! status_line_esc_ok eslok es
|
||||
! tilde_glitch hz hz
|
||||
! transparent_underline ul ul
|
||||
! xon_xoff xon xo
|
||||
# columns cols co
|
||||
# init_tabs it it
|
||||
# label_height lh lh
|
||||
# label_width lw lw
|
||||
# lines lines li
|
||||
# lines_of_memory lm lm
|
||||
# magic_cookie_glitch xmc sg
|
||||
# num_labels nlab Nl
|
||||
# padding_baud_rate pb pb
|
||||
# virtual_terminal vt vt
|
||||
# width_status_line wsl ws
|
||||
$K acs_chars acsc ac
|
||||
$ back_tab cbt bt
|
||||
$ bell bel bl
|
||||
$ carriage_return cr cr
|
||||
$G change_scroll_region csr cs
|
||||
$ char_padding rmp rP
|
||||
$ clear_all_tabs tbc ct
|
||||
$ clear_margins mgc MC
|
||||
$ clear_screen clear cl
|
||||
$ clr_bol el1 cb
|
||||
$ clr_eol el ce
|
||||
$ clr_eos ed cd
|
||||
$G column_address hpa ch
|
||||
$K command_character cmdch CC
|
||||
$G cursor_address cup cm
|
||||
$ cursor_down cud1 do
|
||||
$ cursor_home home ho
|
||||
$ cursor_invisible civis vi
|
||||
$ cursor_left cub1 le
|
||||
$G cursor_mem_address mrcup CM
|
||||
$ cursor_normal cnorm ve
|
||||
$ cursor_right cuf1 nd
|
||||
$ cursor_to_ll ll ll
|
||||
$ cursor_up cuu1 up
|
||||
$ cursor_visible cvvis vs
|
||||
$ delete_character dch1 dc
|
||||
$ delete_line dl1 dl
|
||||
$ dis_status_line dsl ds
|
||||
$ down_half_line hd hd
|
||||
$ ena_acs enacs eA
|
||||
$ enter_alt_charset_mode smacs as
|
||||
$ enter_am_mode smam SA
|
||||
$ enter_blink_mode blink mb
|
||||
$ enter_bold_mode bold md
|
||||
$ enter_ca_mode smcup ti
|
||||
$ enter_delete_mode smdc dm
|
||||
$ enter_dim_mode dim mh
|
||||
$ enter_insert_mode smir im
|
||||
$ enter_protected_mode prot mp
|
||||
$ enter_reverse_mode rev mr
|
||||
$ enter_secure_mode invis mk
|
||||
$ enter_standout_mode smso so
|
||||
$ enter_underline_mode smul us
|
||||
$ enter_xon_mode smxon SX
|
||||
$G erase_chars ech ec
|
||||
$ exit_alt_charset_mode rmacs ae
|
||||
$ exit_am_mode rmam RA
|
||||
$ exit_attribute_mode sgr0 me
|
||||
$ exit_ca_mode rmcup te
|
||||
$ exit_delete_mode rmdc ed
|
||||
$ exit_insert_mode rmir ei
|
||||
$ exit_standout_mode rmso se
|
||||
$ exit_underline_mode rmul ue
|
||||
$ exit_xon_mode rmxon RX
|
||||
$ flash_screen flash vb
|
||||
$ form_feed ff ff
|
||||
$ from_status_line fsl fs
|
||||
$ init_1string is1 i1
|
||||
$ init_2string is2 is
|
||||
$ init_3string is3 i3
|
||||
$K init_file if if
|
||||
$K init_prog iprog iP
|
||||
$ insert_character ich1 ic
|
||||
$ insert_line il1 al
|
||||
$ insert_padding ip ip
|
||||
$K key_a1 ka1 K1
|
||||
$K key_a3 ka3 K3
|
||||
$K key_b2 kb2 K2
|
||||
$K key_backspace kbs kb
|
||||
$K key_beg kbeg @1
|
||||
$K key_btab kcbt kB
|
||||
$K key_c1 kc1 K4
|
||||
$K key_c3 kc3 K5
|
||||
$K key_cancel kcan @2
|
||||
$K key_catab ktbc ka
|
||||
$K key_clear kclr kC
|
||||
$K key_close kclo @3
|
||||
$K key_command kcmd @4
|
||||
$K key_copy kcpy @5
|
||||
$K key_create kcrt @6
|
||||
$K key_ctab kctab kt
|
||||
$K key_dc kdch1 kD
|
||||
$K key_dl kdl1 kL
|
||||
$K key_down kcud1 kd
|
||||
$K key_eic krmir kM
|
||||
$K key_end kend @7
|
||||
$K key_enter kent @8
|
||||
$K key_eol kel kE
|
||||
$K key_eos ked kS
|
||||
$K key_exit kext @9
|
||||
$K key_f0 kf0 k0
|
||||
$K key_f1 kf1 k1
|
||||
$K key_f10 kf10 k;
|
||||
$K key_f11 kf11 F1
|
||||
$K key_f12 kf12 F2
|
||||
$K key_f13 kf13 F3
|
||||
$K key_f14 kf14 F4
|
||||
$K key_f15 kf15 F5
|
||||
$K key_f16 kf16 F6
|
||||
$K key_f17 kf17 F7
|
||||
$K key_f18 kf18 F8
|
||||
$K key_f19 kf19 F9
|
||||
$K key_f2 kf2 k2
|
||||
$K key_f20 kf20 FA
|
||||
$K key_f21 kf21 FB
|
||||
$K key_f22 kf22 FC
|
||||
$K key_f23 kf23 FD
|
||||
$K key_f24 kf24 FE
|
||||
$K key_f25 kf25 FF
|
||||
$K key_f26 kf26 FG
|
||||
$K key_f27 kf27 FH
|
||||
$K key_f28 kf28 FI
|
||||
$K key_f29 kf29 FJ
|
||||
$K key_f3 kf3 k3
|
||||
$K key_f30 kf30 FK
|
||||
$K key_f31 kf31 FL
|
||||
$K key_f32 kf32 FM
|
||||
$K key_f33 kf33 FN
|
||||
$K key_f34 kf34 FO
|
||||
$K key_f35 kf35 FP
|
||||
$K key_f36 kf36 FQ
|
||||
$K key_f37 kf37 FR
|
||||
$K key_f38 kf38 FS
|
||||
$K key_f39 kf39 FT
|
||||
$K key_f4 kf4 k4
|
||||
$K key_f40 kf40 FU
|
||||
$K key_f41 kf41 FV
|
||||
$K key_f42 kf42 FW
|
||||
$K key_f43 kf43 FX
|
||||
$K key_f44 kf44 FY
|
||||
$K key_f45 kf45 FZ
|
||||
$K key_f46 kf46 Fa
|
||||
$K key_f47 kf47 Fb
|
||||
$K key_f48 kf48 Fc
|
||||
$K key_f49 kf49 Fd
|
||||
$K key_f5 kf5 k5
|
||||
$K key_f50 kf50 Fe
|
||||
$K key_f51 kf51 Ff
|
||||
$K key_f52 kf52 Fg
|
||||
$K key_f53 kf53 Fh
|
||||
$K key_f54 kf54 Fi
|
||||
$K key_f55 kf55 Fj
|
||||
$K key_f56 kf56 Fk
|
||||
$K key_f57 kf57 Fl
|
||||
$K key_f58 kf58 Fm
|
||||
$K key_f59 kf59 Fn
|
||||
$K key_f6 kf6 k6
|
||||
$K key_f60 kf60 Fo
|
||||
$K key_f61 kf61 Fp
|
||||
$K key_f62 kf62 Fq
|
||||
$K key_f63 kf63 Fr
|
||||
$K key_f7 kf7 k7
|
||||
$K key_f8 kf8 k8
|
||||
$K key_f9 kf9 k9
|
||||
$K key_find kfnd @0
|
||||
$K key_help khlp %1
|
||||
$K key_home khome kh
|
||||
$K key_ic kich1 kI
|
||||
$K key_il kil1 kA
|
||||
$K key_left kcub1 kl
|
||||
$K key_ll kll kH
|
||||
$K key_mark kmrk %2
|
||||
$K key_message kmsg %3
|
||||
$K key_move kmov %4
|
||||
$K key_next knxt %5
|
||||
$K key_npage knp kN
|
||||
$K key_open kopn %6
|
||||
$K key_options kopt %7
|
||||
$K key_ppage kpp kP
|
||||
$K key_previous kprv %8
|
||||
$K key_print kprt %9
|
||||
$K key_redo krdo %0
|
||||
$K key_reference kref &1
|
||||
$K key_refresh krfr &2
|
||||
$K key_replace krpl &3
|
||||
$K key_restart krst &4
|
||||
$K key_resume kres &5
|
||||
$K key_right kcuf1 kr
|
||||
$K key_save ksav &6
|
||||
$K key_sbeg kBEG &9
|
||||
$K key_scancel kCAN &0
|
||||
$K key_scommand kCMD *1
|
||||
$K key_scopy kCPY *2
|
||||
$K key_screate kCRT *3
|
||||
$K key_sdc kDC *4
|
||||
$K key_sdl kDL *5
|
||||
$K key_select kslt *6
|
||||
$K key_send kEND *7
|
||||
$K key_seol kEOL *8
|
||||
$K key_sexit kEXT *9
|
||||
$K key_sf kind kF
|
||||
$K key_sfind kFND *0
|
||||
$K key_shelp kHLP #1
|
||||
$K key_shome kHOM #2
|
||||
$K key_sic kIC #3
|
||||
$K key_sleft kLFT #4
|
||||
$K key_smessage kMSG %a
|
||||
$K key_smove kMOV %b
|
||||
$K key_snext kNXT %c
|
||||
$K key_soptions kOPT %d
|
||||
$K key_sprevious kPRV %e
|
||||
$K key_sprint kPRT %f
|
||||
$K key_sr kri kR
|
||||
$K key_sredo kRDO %g
|
||||
$K key_sreplace kRPL %h
|
||||
$K key_sright kRIT %i
|
||||
$K key_srsume kRES %j
|
||||
$K key_ssave kSAV !1
|
||||
$K key_ssuspend kSPD !2
|
||||
$K key_stab khts kT
|
||||
$K key_sundo kUND !3
|
||||
$K key_suspend kspd &7
|
||||
$K key_undo kund &8
|
||||
$K key_up kcuu1 ku
|
||||
$ keypad_local rmkx ke
|
||||
$ keypad_xmit smkx ks
|
||||
$K lab_f0 lf0 l0
|
||||
$K lab_f1 lf1 l1
|
||||
$K lab_f10 lf10 la
|
||||
$K lab_f2 lf2 l2
|
||||
$K lab_f3 lf3 l3
|
||||
$K lab_f4 lf4 l4
|
||||
$K lab_f5 lf5 l5
|
||||
$K lab_f6 lf6 l6
|
||||
$K lab_f7 lf7 l7
|
||||
$K lab_f8 lf8 l8
|
||||
$K lab_f9 lf9 l9
|
||||
$ label_off rmln LF
|
||||
$ label_on smln LO
|
||||
$ meta_off rmm mo
|
||||
$ meta_on smm mm
|
||||
$ newline nel nw
|
||||
$K pad_char pad pc
|
||||
$G parm_dch dch DC
|
||||
$G parm_delete_line dl DL
|
||||
$G parm_down_cursor cud DO
|
||||
$G parm_ich ich IC
|
||||
$G parm_index indn SF
|
||||
$G parm_insert_line il AL
|
||||
$G parm_left_cursor cub LE
|
||||
$G parm_right_cursor cuf RI
|
||||
$G parm_rindex rin SR
|
||||
$G parm_up_cursor cuu UP
|
||||
$G pkey_key pfkey pk
|
||||
$G pkey_local pfloc pl
|
||||
$G pkey_xmit pfx px
|
||||
$G plab_norm pln pn
|
||||
$ print_screen mc0 ps
|
||||
$G prtr_non mc5p pO
|
||||
$ prtr_off mc4 pf
|
||||
$ prtr_on mc5 po
|
||||
$G repeat_char rep rp
|
||||
$ req_for_input rfi RF
|
||||
$ reset_1string rs1 r1
|
||||
$ reset_2string rs2 r2
|
||||
$ reset_3string rs3 r3
|
||||
$K reset_file rf rf
|
||||
$ restore_cursor rc rc
|
||||
$G row_address vpa cv
|
||||
$ save_cursor sc sc
|
||||
$ scroll_forward ind sf
|
||||
$ scroll_reverse ri sr
|
||||
$G set_attributes sgr sa
|
||||
$ set_left_margin smgl ML
|
||||
$ set_right_margin smgr MR
|
||||
$ set_tab hts st
|
||||
$G set_window wind wi
|
||||
$ tab ht ta
|
||||
$G to_status_line tsl ts
|
||||
$ underline_char uc uc
|
||||
$ up_half_line hu hu
|
||||
$ xoff_character xoffc XF
|
||||
$ xon_character xonc XN
|
||||
|
||||
Release 3.2 and 4 capabilities (AMIX)
|
||||
(some of the string attributes are guesses...)
|
||||
|
||||
! back_color_erase bce ut
|
||||
! can_change ccc cc
|
||||
! col_addr_glitch xhpa YA
|
||||
! cpi_changes_res cpix YF
|
||||
! cr_cancels_micro_mode crxm YB
|
||||
! has_print_wheel daisy YC
|
||||
! hue_lightness_saturation hls hl
|
||||
! lpi_changes_res lpix YG
|
||||
! non_dest_scroll_region ndscr ND
|
||||
! row_addr_glitch xvpa YD
|
||||
! semi_auto_right_margin sam YE
|
||||
# bit_image_entwining bitwin Yo
|
||||
# bit_image_type bitype Yp
|
||||
# buffer_capacity bufsz Ya
|
||||
# buttons btns BT
|
||||
# dot_horz_spacing spinh Yc
|
||||
# dot_vert_spacing spinv Yb
|
||||
# max_attributes ma ma
|
||||
# max_colors colors Co
|
||||
# max_micro_address maddr Yd
|
||||
# max_micro_jump mjump Ye
|
||||
# max_pairs pairs pa
|
||||
# maximum_windows wnum MW
|
||||
# micro_char_size mcs Yf
|
||||
# micro_line_size mls Yg
|
||||
# no_color_video ncv NC
|
||||
# number_of_pins npins Yh
|
||||
# output_res_char orc Yi
|
||||
# output_res_horz_inch orhi Yk
|
||||
# output_res_line orl Yj
|
||||
# output_res_vert_inch orvi Yl
|
||||
# print_rate cps Ym
|
||||
# wide_char_size widcs Yn
|
||||
$ alt_scancode_esc scesa S8
|
||||
$G bit_image_carriage_return bicr Yv
|
||||
$G bit_image_newline binel Zz
|
||||
$G bit_image_repeat birep Xy
|
||||
$G change_char_pitch cpi ZA
|
||||
$G change_line_pitch lpi ZB
|
||||
$G change_res_horz chr ZC
|
||||
$G change_res_vert cvr ZD
|
||||
$G char_set_names csnm Zy
|
||||
$ code_set_init csin ci
|
||||
$G color_names colornm Yw
|
||||
$G create_window cwin CW
|
||||
$G define_bit_image_region defbi Yx
|
||||
$G define_char defc ZE
|
||||
$ device_type devt dv
|
||||
$G dial_phone dial DI
|
||||
$ display_clock dclk DK
|
||||
$ display_pc_char dispc S1
|
||||
$ end_bit_image_region endbi Yy
|
||||
$ enter_doublewide_mode swidm ZF
|
||||
$ enter_draft_quality sdrfq ZG
|
||||
$ enter_italics_mode sitm ZH
|
||||
$ enter_leftward_mode slm ZI
|
||||
$ enter_micro_mode smicm ZJ
|
||||
$ enter_near_letter_quality snlq ZK
|
||||
$ enter_normal_quality snrmq ZL
|
||||
$ enter_pc_charset_mode smpch S2
|
||||
$ enter_scancode_mode smsc S4
|
||||
$ enter_shadow_mode sshm ZM
|
||||
$ enter_subscript_mode ssubm ZN
|
||||
$ enter_superscript_mode ssupm ZO
|
||||
$ enter_upward_mode sum ZP
|
||||
$ exit_doublewide_mode rwidm ZQ
|
||||
$ exit_italics_mode ritm ZR
|
||||
$ exit_leftward_mode rlm ZS
|
||||
$ exit_micro_mode rmicm ZT
|
||||
$ exit_pc_charset_mode rmpch S3
|
||||
$ exit_scancode_mode rmsc S5
|
||||
$ exit_shadow_mode rshm ZU
|
||||
$ exit_subscript_mode rsubm ZV
|
||||
$ exit_superscript_mode rsupm ZW
|
||||
$ exit_upward_mode rum ZX
|
||||
$ fixed_pause pause PA
|
||||
$ flash_hook hook fh
|
||||
$ get_mouse getm Gm
|
||||
$G goto_window wingo WG
|
||||
$ hangup hup HU
|
||||
$G initialize_color initc Ic
|
||||
$G initialize_pair initp Ip
|
||||
$ key_mouse kmous Km
|
||||
$ label_format fln Lf
|
||||
$G micro_column_address mhpa ZY
|
||||
$ micro_down mcud1 ZZ
|
||||
$ micro_left mcub1 Za
|
||||
$ micro_right mcuf1 Zb
|
||||
$G micro_row_address mvpa Zc
|
||||
$ micro_up mcuu1 Zd
|
||||
$ mouse_info minfo Mi
|
||||
$K order_of_pins porder Ze
|
||||
$ orig_colors oc oc
|
||||
$ orig_pair op op
|
||||
$G parm_down_micro mcud Zf
|
||||
$G parm_left_micro mcub Zg
|
||||
$G parm_right_micro mcuf Zh
|
||||
$G parm_up_micro mcuu Zi
|
||||
$ pc_term_options pctrm S6
|
||||
$G pkey_plab pfxl xl
|
||||
$ pulse pulse PU
|
||||
$ quick_dial qdial QD
|
||||
$ remove_clock rmclk RC
|
||||
$ req_mouse_pos reqmp RQ
|
||||
$ scancode_escape scesc S7
|
||||
$G select_char_set scs Zj
|
||||
$ set0_des_seq s0ds s0
|
||||
$ set1_des_seq s1ds s1
|
||||
$ set2_des_seq s2ds s2
|
||||
$ set3_des_seq s3ds s3
|
||||
$G set_a_background setab AB
|
||||
$G set_a_foreground setaf AF
|
||||
$G set_background setb Sb
|
||||
$ set_bottom_margin smgb Zk
|
||||
$G set_bottom_margin_parm smgbp Zl
|
||||
$G set_clock sclk SC
|
||||
$G set_color_band setcolor Yz
|
||||
$G set_color_pair scp sp
|
||||
$G set_foreground setf Sf
|
||||
$G set_left_margin_parm smglp Zm
|
||||
$G set_lr_margin smglr ML
|
||||
$G set_page_length slines YZ
|
||||
$G set_right_margin_parm smgrp Zn
|
||||
$G set_tb_margin smgtb MT
|
||||
$ set_top_margin smgt Zo
|
||||
$G set_top_margin_parm smgtp Zp
|
||||
$G start_bit_image sbim Zq
|
||||
$G start_char_set_def scsd Zr
|
||||
$ stop_bit_image rbim Zs
|
||||
$G stop_char_set_def rcsd Zt
|
||||
$K subscript_characters subcs Zu
|
||||
$K superscript_characters supcs Zv
|
||||
$K these_cause_cr docr Zw
|
||||
$ tone tone TO
|
||||
$ user0 u0 u0
|
||||
$ user1 u1 u1
|
||||
$ user2 u2 u2
|
||||
$ user3 u3 u3
|
||||
$ user4 u4 u4
|
||||
$ user5 u5 u5
|
||||
$ user6 u6 u6
|
||||
$ user7 u7 u7
|
||||
$ user8 u8 u8
|
||||
$ user9 u9 u9
|
||||
$ wait_tone wait WA
|
||||
$ zero_motion zerom Zx
|
||||
|
||||
"Obsolete" termcap capabilities (variable and terminfo names are mine)
|
||||
|
||||
$ backspace_if_not_bs OTbc bc
|
||||
! backspaces_with_bs OTbs bs
|
||||
# backspace_delay OTdB dB
|
||||
# carriage_return_delay OTdC dC
|
||||
# form_feed_delay OTdF dF
|
||||
# new_line_delay OTdN dN
|
||||
# horizontal_tab_delay OTdT dT
|
||||
# vertical_tab_delay OTdV dV
|
||||
! even_parity OTEP EP
|
||||
! half_duplex OTHD HD
|
||||
# number_of_function_keys OTkn kn
|
||||
$K other_non_function_keys OTko ko
|
||||
! lower_case_only OTLC LC
|
||||
$K arrow_key_map OTma ma
|
||||
$ memory_lock_above OTml ml
|
||||
$ memory_unlock OTmu mu
|
||||
! no_correctly_working_cr OTnc nc
|
||||
! linefeed_is_newline OTNL NL
|
||||
$ linefeed_if_not_lf OTnl nl
|
||||
! crt_without_scrolling OTns ns
|
||||
! odd_parity OTOP OP
|
||||
! has_hardware_tabs OTpt pt
|
||||
! uppercase_only OTUC UC
|
||||
! return_does_clr_eol OTxr xr
|
||||
! tek_4025_insert_line OTxx xx
|
||||
# magic_cookie_glitch_ul OTug ug
|
||||
|
||||
Caps used by the University of Waterloo (variable and terminfo names are mine)
|
||||
|
||||
$K key_interrupt_char UWki ki
|
||||
$K key_kill_char UWkk kk
|
||||
$K key_suspend_char UWkz kz
|
||||
! initialization_messy UWxc xc
|
||||
! index_at_bottom_does_cr UWxl xl
|
||||
|
||||
! rind_only_at_top OTxq xq
|
||||
|
||||
Different names for existing terminfo caps used by GNU Emacs:
|
||||
! GNU_has_meta_key GNUMT MT
|
||||
# GNU_tab_width GNUtw tw
|
||||
|
||||
Non standard capabilities:
|
||||
|
||||
$ scroll_left sl1 Sl
|
||||
$ scroll_right sr1 Sr
|
||||
$G parm_scroll_left sl SL
|
||||
$G parm_scroll_right sr SR
|
||||
|
||||
Dummy (must be present and last):
|
||||
|
||||
$K _get_other use tc
|
173
lib/libmytinfo/caps.c
Normal file
173
lib/libmytinfo/caps.c
Normal file
@ -0,0 +1,173 @@
|
||||
/*
|
||||
* caps.c
|
||||
*
|
||||
* By Ross Ridge
|
||||
* Public Domain
|
||||
* 92/02/01 07:29:45
|
||||
*
|
||||
* caps [-c | -t] [term]
|
||||
*
|
||||
* -c use termcap names instead of terminfo variable names
|
||||
* -t use terminfo capnames instead of variables names
|
||||
* term name of terminal to use
|
||||
*
|
||||
* prints out all the capabilities given the specified terminal. If no
|
||||
* terminal is given, it is taken from the environment variable TERM.
|
||||
*
|
||||
*/
|
||||
|
||||
#define NOTLIB
|
||||
#include "defs.h"
|
||||
#include <term.h>
|
||||
|
||||
const char SCCSid[] = "@(#) mytinfo caps.c 3.2 92/02/01 public domain, By Ross Ridge";
|
||||
|
||||
/* output a string in a human readable format */
|
||||
void
|
||||
putstr(s)
|
||||
char *s; {
|
||||
while(*s != '\0') {
|
||||
switch(*s) {
|
||||
case '\n': printf("\\n"); break;
|
||||
case '\b': printf("\\b"); break;
|
||||
case '\t': printf("\\t"); break;
|
||||
case '\r': printf("\\r"); break;
|
||||
case '\f': printf("\\f"); break;
|
||||
case ' ': printf("\\s"); break;
|
||||
case '\177': printf("^?"); break;
|
||||
case '\200': printf("\\0"); break;
|
||||
default:
|
||||
if (*s > 0 && *s < 32)
|
||||
printf("^%c", *s + 64);
|
||||
else if (*s < 0)
|
||||
printf("\\%03o", *s & 0xff);
|
||||
else
|
||||
putchar(*s);
|
||||
break;
|
||||
}
|
||||
s++;
|
||||
}
|
||||
}
|
||||
|
||||
void
|
||||
do_cleanup(e)
|
||||
int e; {
|
||||
fprintf(stderr, "usage: %s [-c | -t ] [terminal]\n", prg_name);
|
||||
return;
|
||||
}
|
||||
|
||||
int
|
||||
main(argc, argv)
|
||||
int argc;
|
||||
char **argv; {
|
||||
int names = 0;
|
||||
register int i;
|
||||
int flag, num;
|
||||
char *str;
|
||||
|
||||
prg_name = argv[0];
|
||||
cleanup = do_cleanup;
|
||||
|
||||
if (argc > 3)
|
||||
quit(-1, "argument count");
|
||||
|
||||
if (argc == 1)
|
||||
setupterm(NULL, 2, (int *) 0);
|
||||
else if (argc == 2) {
|
||||
if (argv[1][0] != '-')
|
||||
setupterm(argv[1], 2, (int *) 0);
|
||||
else {
|
||||
if (argv[1][1] == 'c')
|
||||
names = 2;
|
||||
else if (argv[1][1] == 't')
|
||||
names = 1;
|
||||
else
|
||||
quit(-1, "unknown switch '%c'", argv[1][1]);
|
||||
setupterm(NULL, 2, (int *) 0);
|
||||
}
|
||||
} else {
|
||||
if (argv[1][0] != '-')
|
||||
quit(-1, "bad switch");
|
||||
if (argv[1][1] == 'c')
|
||||
names = 2;
|
||||
else if (argv[1][1] == 't')
|
||||
names = 1;
|
||||
else
|
||||
quit(-1, "unknown switch '%c'", argv[1][1]);
|
||||
setupterm(argv[2], 2, (int *) 0);
|
||||
|
||||
}
|
||||
|
||||
fflush(stderr);
|
||||
fflush(stdout);
|
||||
printf("\n");
|
||||
#ifdef _CUR_TERM
|
||||
printf("%s: %s\n", cur_term->name, cur_term->name_all);
|
||||
printf("pad: %d xon: %d termcap: %d\n",
|
||||
cur_term->pad, cur_term->xon, cur_term->termcap);
|
||||
printf("true_columns: %d true_lines: %d baudrate: %lu\n",
|
||||
cur_term->true_columns, cur_term->true_lines,
|
||||
(unsigned long) cur_term->baudrate);
|
||||
printf("\n");
|
||||
#endif
|
||||
|
||||
printf("Booleans:\n");
|
||||
for(i = 0; boolnames[i] != NULL; i++) {
|
||||
#ifdef _CUR_TERM
|
||||
flag = cur_term->bools[i];
|
||||
#else
|
||||
flag = tigetflag(boolnames[i]);
|
||||
#endif
|
||||
if (flag != -1 && flag != 0) {
|
||||
switch(names) {
|
||||
case 0:
|
||||
printf(" %s\n", boolfnames[i]);
|
||||
break;
|
||||
case 1:
|
||||
printf(" %s\n", boolnames[i]);
|
||||
break;
|
||||
case 2:
|
||||
printf(" %s\n", boolcodes[i]);
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
printf("\nNumerics:\n");
|
||||
for(i = 0; numnames[i] != NULL; i++) {
|
||||
num = tigetnum(numnames[i]);
|
||||
if (num != -2 && num != -1) {
|
||||
switch(names) {
|
||||
case 0:
|
||||
printf(" %-32s: %d\n", numfnames[i], num);
|
||||
break;
|
||||
case 1:
|
||||
printf(" %-5s: %d\n", numnames[i], num);
|
||||
break;
|
||||
case 2:
|
||||
printf(" %-2s: %d\n", numcodes[i], num);
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
printf("\nStrings:\n");
|
||||
for(i = 0; strnames[i] != NULL; i++) {
|
||||
str = tigetstr(strnames[i]);
|
||||
if (str != (char *) -1 && str != (char *) 0) {
|
||||
switch(names) {
|
||||
case 0:
|
||||
printf(" %-32s: ", strfnames[i]);
|
||||
break;
|
||||
case 1:
|
||||
printf(" %-5s: ", strnames[i]);
|
||||
break;
|
||||
case 2:
|
||||
printf(" %-2s: ", strcodes[i]);
|
||||
break;
|
||||
}
|
||||
putstr(str);
|
||||
putchar('\n');
|
||||
}
|
||||
}
|
||||
return 0;
|
||||
}
|
40
lib/libmytinfo/compar.c
Normal file
40
lib/libmytinfo/compar.c
Normal file
@ -0,0 +1,40 @@
|
||||
/*
|
||||
* compar.c
|
||||
*
|
||||
* By Ross Ridge
|
||||
* Public Domain
|
||||
* 92/06/04 11:36:24
|
||||
*
|
||||
*/
|
||||
|
||||
#include "defs.h"
|
||||
|
||||
#ifdef USE_SCCS_IDS
|
||||
static const char SCCSid[] = "@(#) mytinfo compar.c 3.3 92/06/04 public domain, By Ross Ridge";
|
||||
#endif
|
||||
|
||||
/* compare two elements a sorted list of pointers to strings */
|
||||
int
|
||||
_compar(a, b)
|
||||
#ifdef USE_ANSIC
|
||||
void const *a;
|
||||
void const *b; {
|
||||
#else
|
||||
anyptr a, b; {
|
||||
#endif
|
||||
register char *aa = **(char ***)a;
|
||||
register char *bb = **(char ***)b;
|
||||
|
||||
/* An optimization trick from C News, compare the first
|
||||
* two chars of the string here to avoid a the overhead of a
|
||||
* call to strcmp.
|
||||
*/
|
||||
|
||||
#ifdef __GNUC__
|
||||
return ((*aa - *bb) ? : strcmp(aa, bb));
|
||||
#else
|
||||
if (*aa != *bb)
|
||||
return *aa - *bb;
|
||||
return strcmp(aa, bb);
|
||||
#endif
|
||||
}
|
89
lib/libmytinfo/config.h
Normal file
89
lib/libmytinfo/config.h
Normal file
@ -0,0 +1,89 @@
|
||||
/*
|
||||
* config.h
|
||||
*
|
||||
* By Ross Ridge
|
||||
* Public Domain
|
||||
* 92/02/19 18:56:28
|
||||
*
|
||||
* @(#) mytinfo config.h 3.3 92/02/19 public domain, By Ross Ridge
|
||||
*
|
||||
* Read the file INSTALL for more information on configuring mytinfo
|
||||
*
|
||||
*/
|
||||
|
||||
#ifndef _CONFIG_H_
|
||||
#define _CONFIG_H_
|
||||
|
||||
#ifdef __STDC__
|
||||
#define USE_ANSIC /* undefine this if your compiler lies */
|
||||
#endif
|
||||
|
||||
#define USE_TERMIOS /* use POSIX termios */
|
||||
#undef USE_TERMIO /* use termio (SysIII, SysV) */
|
||||
#undef USE_SGTTY /* use sgtty (v7, BSD) */
|
||||
#define USE_WINSZ /* get window size from the tty driver */
|
||||
#undef USE_STRINGS /* include <strings.h> instead of <string.h> */
|
||||
#undef USE_MYBSEARCH /* your library doesn't have bsearch */
|
||||
#undef USE_MYSTRTOK /* your library doesn't have strtok */
|
||||
#undef USE_MYQSORT /* your library doesn't have qsort */
|
||||
#undef USE_MYMKDIR /* your library doesn't have mkdir */
|
||||
#define USE_MEMORY /* you have an <memory.h> header */
|
||||
#undef USE_FAKE_STDIO /* don't use real stdio */
|
||||
#undef USE_DOPRNT /* no vfprintf, use _doprnt */
|
||||
#undef USE_TERMINFO /* look in terminfo dirs for entry */
|
||||
#define USE_TERMCAP /* look in termcap dirs for entry */
|
||||
|
||||
#undef USE_SHORT_BSEARCH /* speeds up MYBSEARCH on most machines */
|
||||
|
||||
#undef USE_SMALLMEM /* save some memory */
|
||||
|
||||
#undef USE_UPBC_KLUDGE /* do tgoto like real togo */
|
||||
#undef USE_EXTERN_UPBC /* get cuu1 and cub1 from externs UP and BC */
|
||||
#undef USE_LITOUT_KLUDGE /* an alternate tgoto kludge, not recommened */
|
||||
|
||||
|
||||
#ifndef USE_ANSIC
|
||||
|
||||
#undef USE_PROTOTYPES /* use ANSI C prototypes */
|
||||
#undef USE_STDLIB /* you have a <stdlib.h> */
|
||||
#undef USE_STDARG /* you have a <stdarg.h> */
|
||||
#undef USE_STDDEF /* you have a <stddef.h> */
|
||||
|
||||
#define const
|
||||
#define volatile
|
||||
#define noreturn /* a function that doesn't return */
|
||||
|
||||
typedef char *anyptr; /* a type that any pointer can be assigned to */
|
||||
|
||||
#define mysize_t unsigned /* size_t, the size of an object */
|
||||
|
||||
#else /* USE_ANSIC */
|
||||
|
||||
#define USE_PROTOTYPES
|
||||
#define USE_STDLIB
|
||||
#define USE_STDARG
|
||||
#define USE_STDDEF
|
||||
|
||||
typedef void *anyptr;
|
||||
|
||||
#define mysize_t size_t
|
||||
|
||||
#ifdef __GNUC__
|
||||
#define noreturn volatile
|
||||
#else
|
||||
#define noreturn
|
||||
#endif
|
||||
|
||||
#endif /* USE_ANSIC */
|
||||
|
||||
#ifdef __FreeBSD__
|
||||
#define TERMCAPFILE "$TERMCAPFILE $HOME/.termcap /usr/share/misc/termcap"
|
||||
#else
|
||||
#define TERMCAPFILE "$TERMCAPFILE $HOME/.termcap /etc/termcap"
|
||||
#endif
|
||||
|
||||
#define TERMINFOSRC "/usr/lib/terminfo/terminfo.src"
|
||||
|
||||
#define TERMINFODIR "/usr/lib/terminfo"
|
||||
|
||||
#endif
|
198
lib/libmytinfo/defs.h
Normal file
198
lib/libmytinfo/defs.h
Normal file
@ -0,0 +1,198 @@
|
||||
/*
|
||||
* defs.h
|
||||
*
|
||||
* By Ross Ridge
|
||||
* Public Domain
|
||||
* 92/06/04 11:37:02
|
||||
*
|
||||
* @(#) mytinfo defs.h 3.3 92/06/04 public domain, By Ross Ridge
|
||||
*/
|
||||
|
||||
#ifndef _DEFS_H_
|
||||
#define _DEFS_H_
|
||||
|
||||
#ifdef TEST
|
||||
#undef NOTLIB
|
||||
#define NOTLIB
|
||||
#endif
|
||||
|
||||
#include "config.h"
|
||||
|
||||
#ifdef NOTLIB
|
||||
#undef USE_FAKE_STDIO
|
||||
#endif
|
||||
|
||||
#ifdef USE_STDDEF
|
||||
#include <stddef.h>
|
||||
#else
|
||||
#include <sys/types.h>
|
||||
#endif
|
||||
|
||||
#ifdef USE_STDLIB
|
||||
#include <stdlib.h>
|
||||
#else
|
||||
#ifdef USE_PROTOTYPES
|
||||
anyptr malloc(mysize_t);
|
||||
anyptr realloc(anyptr, mysize_t);
|
||||
char *getenv(char const *);
|
||||
#else
|
||||
anyptr malloc();
|
||||
anyptr realloc();
|
||||
char *getenv();
|
||||
#endif
|
||||
#endif
|
||||
|
||||
#ifdef USE_STDARG
|
||||
#include <stdarg.h>
|
||||
#else
|
||||
#include <varargs.h>
|
||||
#endif
|
||||
|
||||
#ifndef _VA_LIST
|
||||
#define _VA_LIST
|
||||
#endif
|
||||
|
||||
#ifdef USE_FAKE_STDIO
|
||||
#include "fake_stdio.h"
|
||||
#define sprintf _fake_sprintf
|
||||
#ifdef USE_PROTOTYPES
|
||||
int sprintf(char *, char *, ...);
|
||||
#else
|
||||
int sprintf();
|
||||
#endif
|
||||
#else /* USE_FAKE_STDIO */
|
||||
#if 0
|
||||
#include <stdio.h>
|
||||
#else
|
||||
#undef NULL
|
||||
#include <stdio.h>
|
||||
#endif
|
||||
#endif /* !USE_FAKE_STDIO */
|
||||
|
||||
#ifdef USE_STRINGS
|
||||
#include <strings.h>
|
||||
#define strchr(s, c) index(s, c)
|
||||
#define strrchr(s, c) rindex(s, c)
|
||||
#ifndef USE_MYSTRTOK
|
||||
#ifdef USE_PROTOTYPES
|
||||
char *strtok(char *, char *);
|
||||
#else
|
||||
char *strtok();
|
||||
#endif
|
||||
#endif
|
||||
#else
|
||||
#include <string.h>
|
||||
#endif
|
||||
|
||||
#ifdef USE_MEMORY
|
||||
#include <memory.h>
|
||||
#else
|
||||
#define memcpy(b, a, n) bcopy(a, b, n)
|
||||
#endif
|
||||
|
||||
#include <errno.h>
|
||||
|
||||
#define MAX_BUF 4096
|
||||
#define MAX_LINE 640
|
||||
#define MAX_NAME 128
|
||||
|
||||
#define MAX_CHUNK MAX_LINE
|
||||
|
||||
#define MAX_DEPTH 32
|
||||
|
||||
#define MAX_VARNAME 32
|
||||
#define MAX_TINFONAME 5
|
||||
#define MAX_TCAPNAME 2
|
||||
|
||||
struct caplist {
|
||||
char type;
|
||||
char flag;
|
||||
char var[MAX_VARNAME + 1];
|
||||
char tinfo[MAX_TINFONAME + 1];
|
||||
char tcap[MAX_TCAPNAME + 1];
|
||||
};
|
||||
|
||||
struct term_path {
|
||||
char *file;
|
||||
int type; /* 0 = file, 1 = TERMCAP env, 2 = TERMINFO env */
|
||||
};
|
||||
|
||||
struct _terminal;
|
||||
|
||||
#ifdef USE_PROTOTYPES
|
||||
|
||||
int _gettcap(char *, struct _terminal *, struct term_path *);
|
||||
int _gettinfo(char *, struct _terminal *, struct term_path *);
|
||||
int _fillterm(char *, struct term_path *, char *);
|
||||
int _findterm(char *, struct term_path *, char *);
|
||||
int _init_tty(void), _lit_output(void), _check_tty(void);
|
||||
void _figure_termcap(void);
|
||||
int _tmatch(char *, char *);
|
||||
void _norm_output(void);
|
||||
int readcaps(FILE *, struct caplist *, int);
|
||||
noreturn void quit(int, char *, ...);
|
||||
#ifdef lint
|
||||
extern void (*cleanup)();
|
||||
#else
|
||||
extern void (*cleanup)(int);
|
||||
#endif
|
||||
struct term_path *_buildpath(char *, int, ...);
|
||||
void _delpath(struct term_path *);
|
||||
char *_addstr(char *);
|
||||
struct strbuf *_endstr(void);
|
||||
void _del_strs(struct _terminal *);
|
||||
void _tcapconv(void);
|
||||
void _tcapdefault(void);
|
||||
int _getother(char *, struct term_path *, struct _terminal *);
|
||||
int _gettbin(char *, struct _terminal *);
|
||||
int _findboolcode(char *), _findnumcode(char *), _findstrcode(char *);
|
||||
int _findboolname(char *), _findnumname(char *), _findstrname(char *);
|
||||
int _findboolfname(char *), _findnumfname(char *), _findstrfname(char *);
|
||||
|
||||
#ifdef USE_ANSIC
|
||||
int _compar(void const *, void const *);
|
||||
typedef int (*compar_fn)(void const *, void const *);
|
||||
#else
|
||||
int _compar(anyptr, anyptr);
|
||||
typedef int (*compar_fn)(anyptr, anyptr);
|
||||
#endif
|
||||
|
||||
#else /* USE_PROTOTYPES */
|
||||
|
||||
int _gettcap(), _gettinfo(), _fillterm(), _findterm(), _init_tty();
|
||||
int _lit_output(), _check_tty();
|
||||
void _figure_termcap();
|
||||
int _tmatch();
|
||||
void _norm_output();
|
||||
int readcaps();
|
||||
noreturn void /* GOTO */ quit(/*FORMAT2*/);
|
||||
extern void (*cleanup)();
|
||||
struct term_path *_buildpath();
|
||||
void _delpath();
|
||||
char *_addstr();
|
||||
struct strbuf *_endstr();
|
||||
void _del_strs();
|
||||
void _tcapconv();
|
||||
void _tcapdefault();
|
||||
int _getother();
|
||||
int _gettbin();
|
||||
int _findboolcode(), _findnumcode(), _findstrcode();
|
||||
int _findboolname(), _findnumname(), _findstrname();
|
||||
int _findboolfname(), _findnumfname(), _findstrfname();
|
||||
int _compar();
|
||||
typedef int (*compar_fn)();
|
||||
|
||||
#endif /* USE_PROTOTYPES */
|
||||
|
||||
extern char _strflags[];
|
||||
|
||||
extern char _mytinfo_version[];
|
||||
|
||||
/* for quit.c */
|
||||
extern int sys_nerr;
|
||||
#if __FreeBSD__ != 2
|
||||
extern char *sys_errlist[];
|
||||
#endif
|
||||
extern char *prg_name;
|
||||
|
||||
#endif /* _DEFS_H_ */
|
81
lib/libmytinfo/fillterm.c
Normal file
81
lib/libmytinfo/fillterm.c
Normal file
@ -0,0 +1,81 @@
|
||||
/*
|
||||
* fillterm.c
|
||||
*
|
||||
* By Ross Ridge
|
||||
* Public Domain
|
||||
* 92/02/01 07:29:54
|
||||
*
|
||||
*/
|
||||
|
||||
#include "defs.h"
|
||||
#include <term.h>
|
||||
|
||||
#ifdef USE_SCCS_IDS
|
||||
static const char SCCSid[] = "@(#) mytinfo fillterm.c 3.2 92/02/01 public domain, By Ross Ridge";
|
||||
#endif
|
||||
|
||||
TERMINAL _term_buf;
|
||||
TERMINAL *cur_term;
|
||||
|
||||
int
|
||||
_fillterm(name, path, buf)
|
||||
char *name, *buf;
|
||||
struct term_path *path; {
|
||||
register int i, r;
|
||||
|
||||
r = -1;
|
||||
|
||||
for(i = NUM_OF_BOOLS; i;)
|
||||
_term_buf.bools[--i] = -1;
|
||||
for(i = NUM_OF_NUMS; i;)
|
||||
_term_buf.nums[--i] = -2;
|
||||
for(i = NUM_OF_STRS; i;)
|
||||
_term_buf.strs[--i] = (char *) -1;
|
||||
|
||||
_term_buf.name_all = NULL;
|
||||
|
||||
r = _findterm(name, path, buf);
|
||||
switch(r) {
|
||||
case 1:
|
||||
if (_gettcap(buf, &_term_buf, path) != 0)
|
||||
return -3;
|
||||
_tcapconv();
|
||||
_tcapdefault();
|
||||
break;
|
||||
case 2:
|
||||
if (_gettinfo(buf, &_term_buf, path) != 0)
|
||||
return -3;
|
||||
break;
|
||||
case 3:
|
||||
if (_gettbin(buf, &_term_buf) != 0)
|
||||
return -3;
|
||||
break;
|
||||
default:
|
||||
return r;
|
||||
}
|
||||
|
||||
if ((_term_buf.name = _addstr(name)) == NULL)
|
||||
return -3;
|
||||
|
||||
for(i = NUM_OF_BOOLS; i;)
|
||||
if (_term_buf.bools[--i] == -1)
|
||||
_term_buf.bools[i] = 0;
|
||||
for(i = NUM_OF_NUMS; i;)
|
||||
if (_term_buf.nums[--i] == -2)
|
||||
_term_buf.nums[i] = -1;
|
||||
for(i = NUM_OF_STRS; i;)
|
||||
if (_term_buf.strs[--i] == (char *) -1)
|
||||
_term_buf.strs[i] = NULL;
|
||||
|
||||
_term_buf.fd = 1;
|
||||
_term_buf.pad = 1;
|
||||
_term_buf.baudrate = 0;
|
||||
_term_buf.strbuf = _endstr();
|
||||
|
||||
cur_term = (TERMINAL *) malloc(sizeof(_term_buf));
|
||||
if (cur_term == NULL)
|
||||
return -3;
|
||||
memcpy((anyptr)cur_term, (anyptr)&_term_buf, sizeof(_term_buf));
|
||||
|
||||
return r;
|
||||
}
|
149
lib/libmytinfo/findcap.c
Normal file
149
lib/libmytinfo/findcap.c
Normal file
@ -0,0 +1,149 @@
|
||||
/*
|
||||
* findcap.c
|
||||
*
|
||||
* By Ross Ridge
|
||||
* Public Domain
|
||||
* 92/02/01 07:29:55
|
||||
*
|
||||
*/
|
||||
|
||||
#include "defs.h"
|
||||
#include <term.h>
|
||||
|
||||
#include "bsearch.c"
|
||||
|
||||
#ifdef USE_SCCS_IDS
|
||||
static const char SCCSid[] = "@(#) mytinfo findcap.c 3.2 92/02/01 public domain, By Ross Ridge";
|
||||
#endif
|
||||
|
||||
extern char **_sboolcodes[], **_snumcodes[], **_sstrcodes[];
|
||||
extern char **_sboolnames[], **_snumnames[], **_sstrnames[];
|
||||
extern char **_sboolfnames[], **_snumfnames[], **_sstrfnames[];
|
||||
|
||||
static char **p2p2c;
|
||||
|
||||
int
|
||||
_findboolcode(s)
|
||||
char *s; {
|
||||
char ***match;
|
||||
|
||||
p2p2c = &s;
|
||||
|
||||
match = (char ***) bsearch((anyptr) &p2p2c, (anyptr) _sboolcodes,
|
||||
NUM_OF_BOOLS, sizeof(p2p2c), _compar);
|
||||
if (match == NULL)
|
||||
return -1;
|
||||
return *match - boolcodes;
|
||||
}
|
||||
|
||||
int
|
||||
_findboolname(s)
|
||||
char *s; {
|
||||
char ***match;
|
||||
|
||||
p2p2c = &s;
|
||||
|
||||
match = (char ***) bsearch((anyptr) &p2p2c, (anyptr) _sboolnames,
|
||||
NUM_OF_BOOLS, sizeof(p2p2c), _compar);
|
||||
if (match == NULL)
|
||||
return -1;
|
||||
return *match - boolnames;
|
||||
}
|
||||
|
||||
int
|
||||
_findboolfname(s)
|
||||
char *s; {
|
||||
char ***match;
|
||||
|
||||
p2p2c = &s;
|
||||
|
||||
match = (char ***) bsearch((anyptr) &p2p2c, (anyptr) _sboolfnames,
|
||||
NUM_OF_BOOLS, sizeof(p2p2c), _compar);
|
||||
if (match == NULL)
|
||||
return -1;
|
||||
return *match - boolfnames;
|
||||
}
|
||||
|
||||
int
|
||||
_findnumcode(s)
|
||||
char *s; {
|
||||
char ***match;
|
||||
|
||||
p2p2c = &s;
|
||||
|
||||
match = (char ***) bsearch((anyptr) &p2p2c, (anyptr) _snumcodes,
|
||||
NUM_OF_NUMS, sizeof(p2p2c), _compar);
|
||||
if (match == NULL)
|
||||
return -1;
|
||||
return *match - numcodes;
|
||||
}
|
||||
|
||||
int
|
||||
_findnumname(s)
|
||||
char *s; {
|
||||
char ***match;
|
||||
|
||||
p2p2c = &s;
|
||||
|
||||
match = (char ***) bsearch((anyptr) &p2p2c, (anyptr) _snumnames,
|
||||
NUM_OF_NUMS, sizeof(p2p2c), _compar);
|
||||
if (match == NULL)
|
||||
return -1;
|
||||
return *match - numnames;
|
||||
}
|
||||
|
||||
int
|
||||
_findnumfname(s)
|
||||
char *s; {
|
||||
char ***match;
|
||||
|
||||
p2p2c = &s;
|
||||
|
||||
match = (char ***) bsearch((anyptr) &p2p2c, (anyptr) _snumfnames,
|
||||
NUM_OF_NUMS, sizeof(p2p2c), _compar);
|
||||
if (match == NULL)
|
||||
return -1;
|
||||
return *match - numfnames;
|
||||
}
|
||||
|
||||
int
|
||||
_findstrcode(s)
|
||||
char *s; {
|
||||
char ***match;
|
||||
|
||||
p2p2c = &s;
|
||||
|
||||
match = (char ***) bsearch((anyptr) &p2p2c, (anyptr) _sstrcodes,
|
||||
NUM_OF_STRS, sizeof(p2p2c), _compar);
|
||||
if (match == NULL)
|
||||
return -1;
|
||||
return *match - strcodes;
|
||||
}
|
||||
|
||||
int
|
||||
_findstrname(s)
|
||||
char *s; {
|
||||
char ***match;
|
||||
|
||||
p2p2c = &s;
|
||||
|
||||
match = (char ***) bsearch((anyptr) &p2p2c, (anyptr) _sstrnames,
|
||||
NUM_OF_STRS, sizeof(p2p2c), _compar);
|
||||
if (match == NULL)
|
||||
return -1;
|
||||
return *match - strnames;
|
||||
}
|
||||
|
||||
int
|
||||
_findstrfname(s)
|
||||
char *s; {
|
||||
char ***match;
|
||||
|
||||
p2p2c = &s;
|
||||
|
||||
match = (char ***) bsearch((anyptr) &p2p2c, (anyptr) _sstrfnames,
|
||||
NUM_OF_STRS, sizeof(p2p2c), _compar);
|
||||
if (match == NULL)
|
||||
return -1;
|
||||
return *match - strfnames;
|
||||
}
|
286
lib/libmytinfo/findterm.c
Normal file
286
lib/libmytinfo/findterm.c
Normal file
@ -0,0 +1,286 @@
|
||||
/* findterm.c
|
||||
*
|
||||
* By Ross Ridge
|
||||
* Public Domain
|
||||
* 92/02/01 07:29:56
|
||||
*
|
||||
*/
|
||||
|
||||
#include "defs.h"
|
||||
|
||||
#include <ctype.h>
|
||||
#include <fcntl.h>
|
||||
#ifdef USE_STDDEF
|
||||
#include <sys/types.h>
|
||||
#endif
|
||||
#include <sys/stat.h>
|
||||
#ifdef __FreeBSD__
|
||||
#include <unistd.h>
|
||||
#endif
|
||||
|
||||
#ifdef USE_SCCS_IDS
|
||||
static const char SCCSid[] = "@(#) mytinfo findterm.c 3.2 92/02/01 public domain, By Ross Ridge";
|
||||
#endif
|
||||
static int linecnt;
|
||||
|
||||
static int
|
||||
getln(f, buf, len)
|
||||
FILE *f;
|
||||
register char *buf;
|
||||
int len; {
|
||||
register int c, i = 0;
|
||||
|
||||
while((c = getc(f)) == '#') {
|
||||
linecnt++;
|
||||
while((c = getc(f)) != '\n')
|
||||
if (c == EOF)
|
||||
return -1;
|
||||
}
|
||||
|
||||
while(c != '\n') {
|
||||
if (c == EOF)
|
||||
return -1;
|
||||
if (i < len) {
|
||||
i++;
|
||||
*buf++ = c;
|
||||
}
|
||||
c = getc(f);
|
||||
}
|
||||
|
||||
while(isspace(*(buf-1))) {
|
||||
buf--;
|
||||
i--;
|
||||
}
|
||||
|
||||
*buf = '\0';
|
||||
return i;
|
||||
}
|
||||
|
||||
static int
|
||||
_findterm2(name, file, buf)
|
||||
char *name, *buf;
|
||||
char *file; {
|
||||
char line[MAX_LINE];
|
||||
FILE *f;
|
||||
register char *sp, *dp;
|
||||
int c;
|
||||
int l;
|
||||
int cont;
|
||||
int fd;
|
||||
struct stat st;
|
||||
|
||||
linecnt = 0;
|
||||
|
||||
#ifdef DEBUG
|
||||
printf("open: %s\n", file);
|
||||
#endif
|
||||
fd = open(file, O_RDONLY);
|
||||
if (fd == -1)
|
||||
return -1;
|
||||
if (fstat(fd, &st) == -1) {
|
||||
close(fd);
|
||||
return -1;
|
||||
}
|
||||
if ((st.st_mode & 0170000) == 0040000) {
|
||||
sprintf(buf, "%s/%c/%s", file, name[0], name);
|
||||
close(fd);
|
||||
fd = open(buf, O_RDONLY);
|
||||
if (fd == -1)
|
||||
return -1;
|
||||
if (read(fd, buf, MAX_BUF) < 12
|
||||
|| buf[0] != 032 || buf[1] != 1) {
|
||||
close(fd);
|
||||
return -1;
|
||||
}
|
||||
close(fd);
|
||||
return 3;
|
||||
}
|
||||
f = fdopen(fd, "r");
|
||||
if (f == NULL) {
|
||||
close(fd);
|
||||
return -1;
|
||||
}
|
||||
|
||||
while ((l = getln(f, buf, MAX_LINE)) != -1) {
|
||||
linecnt++;
|
||||
if (!isspace(buf[0]) && l != 0) {
|
||||
sp = buf + l - 1;
|
||||
cont = 0;
|
||||
switch(*sp) {
|
||||
case '\\':
|
||||
cont = 1;
|
||||
*sp = '\0';
|
||||
/* FALLTHROUGH */
|
||||
case ':':
|
||||
sp = buf;
|
||||
dp = line;
|
||||
while (*sp != ':') {
|
||||
if (*sp == '\0' && cont &&
|
||||
(l = getln(f, buf, MAX_LINE))
|
||||
!= -1) {
|
||||
linecnt++;
|
||||
sp = buf;
|
||||
if (l > 0 && buf[l-1] == '\\')
|
||||
cont = 1;
|
||||
else
|
||||
cont = 0;
|
||||
continue;
|
||||
}
|
||||
if (*sp == '\0') {
|
||||
#ifdef DEBUG
|
||||
printf("bad line (%d)\n",
|
||||
linecnt);
|
||||
fclose(f);
|
||||
return -2;
|
||||
#else
|
||||
goto err;
|
||||
#endif
|
||||
}
|
||||
*dp++ = *sp++;
|
||||
}
|
||||
*dp = '\0';
|
||||
if (!_tmatch(line, name))
|
||||
break;
|
||||
if (!cont) {
|
||||
fclose(f);
|
||||
return 1;
|
||||
}
|
||||
l = strlen(buf);
|
||||
dp = buf + l;
|
||||
while((c = getc(f)) != EOF && l < MAX_BUF) {
|
||||
if (c == '\n')
|
||||
break;
|
||||
if (c == '\\') {
|
||||
c = getc(f);
|
||||
if (c == EOF)
|
||||
break;
|
||||
if (c == '\n') {
|
||||
c = getc(f);
|
||||
if (c == EOF)
|
||||
break;
|
||||
if (c == '#') {
|
||||
while((c = getc(f)) != EOF && c != '\n');
|
||||
if (c == EOF)
|
||||
break;
|
||||
continue;
|
||||
}
|
||||
*dp++ = c;
|
||||
continue;
|
||||
}
|
||||
*dp++ = '\\';
|
||||
*dp++ = c;
|
||||
continue;
|
||||
}
|
||||
*dp++ = c;
|
||||
}
|
||||
*dp = '\0';
|
||||
fclose(f);
|
||||
return 1;
|
||||
case ',':
|
||||
sp = buf;
|
||||
dp = line;
|
||||
while(*sp != ',')
|
||||
*dp++ = *sp++;
|
||||
*dp = '\0';
|
||||
if (!_tmatch(line, name))
|
||||
break;
|
||||
dp = buf + l;
|
||||
while ((c = getc(f)) != EOF && l < MAX_BUF) {
|
||||
if (c == '\n') {
|
||||
c = getc(f);
|
||||
if (isspace(c))
|
||||
continue;
|
||||
if (c == '\n') {
|
||||
ungetc(c, f);
|
||||
continue;
|
||||
}
|
||||
if (c == '#') {
|
||||
while((c = getc(f)) != EOF)
|
||||
if (c == '\n')
|
||||
break;
|
||||
if (c == EOF)
|
||||
break;
|
||||
ungetc(c, f);
|
||||
continue;
|
||||
}
|
||||
break;
|
||||
}
|
||||
*dp++ = c;
|
||||
l++;
|
||||
}
|
||||
*dp = '\0';
|
||||
fclose(f);
|
||||
return 2;
|
||||
default:
|
||||
err:
|
||||
#ifdef DEBUG
|
||||
printf("strange line (%d)\n", linecnt);
|
||||
#endif
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
fclose(f);
|
||||
return 0;
|
||||
}
|
||||
|
||||
int
|
||||
_findterm(name, path, buf)
|
||||
char *name;
|
||||
struct term_path *path;
|
||||
char *buf; {
|
||||
register char *s, *d;
|
||||
int r = 0;
|
||||
while(path->file != NULL) {
|
||||
switch(path->type) {
|
||||
case 0:
|
||||
r = _findterm2(name, path->file, buf);
|
||||
break;
|
||||
case 1:
|
||||
if (path->file[0] == '/') {
|
||||
r = _findterm2(name, path->file, buf);
|
||||
} else {
|
||||
s = path->file;
|
||||
d = buf;
|
||||
while(*s != '\0' && *s != ':')
|
||||
*d++ = *s++;
|
||||
*d = '\0';
|
||||
if (_tmatch(buf, name)) {
|
||||
while(*s != '\0')
|
||||
*d++ = *s++;
|
||||
return 1;
|
||||
}
|
||||
r = 0;
|
||||
}
|
||||
break;
|
||||
case 2:
|
||||
if (path->file[0] == '/') {
|
||||
r = _findterm2(name, path->file, buf);
|
||||
} else {
|
||||
s = path->file;
|
||||
d = buf;
|
||||
while(*s != '\0' && *s != ',')
|
||||
*d++ = *s++;
|
||||
*d = '\0';
|
||||
if (_tmatch(buf, name)) {
|
||||
while(*s != '\0')
|
||||
*d++ = *s++;
|
||||
return 2;
|
||||
}
|
||||
r = 0;
|
||||
}
|
||||
break;
|
||||
default:
|
||||
r = 0;
|
||||
break;
|
||||
}
|
||||
if (r == 1 || r == 2 || r == 3) {
|
||||
#ifdef DEBUG
|
||||
printf("found in %s\n", path->file);
|
||||
#endif
|
||||
break;
|
||||
}
|
||||
path++;
|
||||
}
|
||||
return r;
|
||||
}
|
49
lib/libmytinfo/getother.c
Normal file
49
lib/libmytinfo/getother.c
Normal file
@ -0,0 +1,49 @@
|
||||
/*
|
||||
* getother.c
|
||||
*
|
||||
* By Ross Ridge
|
||||
* Public Domain
|
||||
* 92/02/01 07:29:58
|
||||
*
|
||||
*/
|
||||
|
||||
#include "defs.h"
|
||||
#include <term.h>
|
||||
|
||||
#ifdef USE_SCCS_IDS
|
||||
static const char SCCSid[] = "@(#) mytinfo getother.c 3.2 92/02/01 public domain, By Ross Ridge";
|
||||
#endif
|
||||
|
||||
int
|
||||
_getother(name, path, ct)
|
||||
char *name;
|
||||
struct term_path *path;
|
||||
TERMINAL *ct; {
|
||||
static int depth = 0;
|
||||
int r;
|
||||
char buf[MAX_BUF];
|
||||
|
||||
if (depth >= MAX_DEPTH)
|
||||
return 1; /* infinite loop */
|
||||
|
||||
#ifdef DEBUG
|
||||
printf("\ngetother: %s\n", name);
|
||||
#endif
|
||||
|
||||
switch(_findterm(name, path, buf)) {
|
||||
case -3:
|
||||
return 1;
|
||||
case 1:
|
||||
depth++;
|
||||
r = _gettcap(buf, ct, path);
|
||||
break;
|
||||
case 2:
|
||||
depth++;
|
||||
r = _gettinfo(buf, ct, path);
|
||||
break;
|
||||
default:
|
||||
return 0;
|
||||
}
|
||||
depth--;
|
||||
return r;
|
||||
}
|
127
lib/libmytinfo/gettbin.c
Normal file
127
lib/libmytinfo/gettbin.c
Normal file
@ -0,0 +1,127 @@
|
||||
/*
|
||||
* gettbin.c
|
||||
*
|
||||
* By Ross Ridge
|
||||
* Public Domain
|
||||
* 92/02/01 07:29:59
|
||||
*
|
||||
* Get a terminfo binary entry
|
||||
*
|
||||
*/
|
||||
|
||||
#include "defs.h"
|
||||
#include <term.h>
|
||||
|
||||
#ifdef USE_SCCS_IDS
|
||||
static const char SCCSid[] = "@(#) mytinfo gettbin.c 3.2 92/02/01 public domain, By Ross Ridge";
|
||||
#endif
|
||||
|
||||
extern int _boolorder[], _numorder[], _strorder[];
|
||||
|
||||
#ifdef TRUE_BYTE_ORDERING
|
||||
/* 8 bit char, 16 bit short, lsb first, twos complement */
|
||||
#define convshort(s) (*(short *)(s))
|
||||
|
||||
#else
|
||||
|
||||
#ifdef TWOS_COPLEMENT
|
||||
/* 8 bit char, 16 bit short, lsb last, twos complement */
|
||||
#define convshort(s) ((short)(((s[0] & 0377) << 8) | (s[1] & 0377)))
|
||||
|
||||
#else
|
||||
|
||||
/* anything else... */
|
||||
|
||||
static short
|
||||
convshort(s)
|
||||
char *s; {
|
||||
register int a,b;
|
||||
|
||||
a = (int) s[0] & 0377;
|
||||
b = (int) s[1] & 0377;
|
||||
|
||||
if (a == 0377 && b == 0377)
|
||||
return -1;
|
||||
if (a == 0376 && b == 0377)
|
||||
return -2;
|
||||
|
||||
return a + b * 256;
|
||||
}
|
||||
#endif
|
||||
#endif
|
||||
|
||||
int
|
||||
_gettbin(buf, cur)
|
||||
char *buf;
|
||||
TERMINAL *cur; {
|
||||
register char *s;
|
||||
int i;
|
||||
int sz_names, sz_bools, sz_nums, sz_offs, sz_strs;
|
||||
int n_bools, n_nums, n_strs;
|
||||
char *strtbl;
|
||||
|
||||
buf[MAX_BUF-1] = '\0';
|
||||
s = buf;
|
||||
|
||||
if (convshort(s) != 0432)
|
||||
return 1;
|
||||
sz_names = convshort(s + 2);
|
||||
sz_bools = convshort(s + 4);
|
||||
n_nums = convshort(s + 6);
|
||||
n_strs = convshort(s + 8);
|
||||
sz_strs = convshort(s + 10);
|
||||
|
||||
n_bools = sz_bools;
|
||||
sz_nums = n_nums * 2;
|
||||
sz_offs = n_strs * 2;
|
||||
|
||||
if ((sz_names + sz_bools) & 1)
|
||||
sz_bools++;
|
||||
|
||||
if (12 + sz_names + sz_bools + sz_nums + sz_offs + sz_strs >= MAX_BUF)
|
||||
return 1;
|
||||
|
||||
s += 12;
|
||||
if ((cur->name_all = _addstr(s)) == NULL)
|
||||
return 1;
|
||||
s += sz_names;
|
||||
while(--s >= buf + 12) {
|
||||
if (*s == '|') {
|
||||
if ((cur->name_long = _addstr(s + 1)) == NULL)
|
||||
return 1;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
s = buf + 12 + sz_names;
|
||||
for(i = 0; i < n_bools && _boolorder[i] != -1; i++, s++) {
|
||||
if (cur->bools[_boolorder[i]] == -1 && *s == 1)
|
||||
cur->bools[_boolorder[i]] = 1;
|
||||
}
|
||||
|
||||
s = buf + 12 + sz_names + sz_bools;
|
||||
for(i = 0; i < n_nums && _numorder[i] != -1; i++, s += 2) {
|
||||
if (convshort(s) == -2)
|
||||
cur->nums[_numorder[i]] = -1;
|
||||
else if (cur->nums[_numorder[i]] == -2 && convshort(s) != -1)
|
||||
cur->nums[_numorder[i]] = convshort(s);
|
||||
}
|
||||
|
||||
s = buf + 12 + sz_names + sz_bools + sz_nums;
|
||||
strtbl = s + sz_offs;
|
||||
for(i = 0; i < n_strs && _strorder[i] != -1; i++, s += 2) {
|
||||
if (convshort(s) == -2)
|
||||
cur->strs[_strorder[i]] = NULL;
|
||||
else if (cur->strs[_strorder[i]] == (char *) -1
|
||||
&& convshort(s) != -1) {
|
||||
#ifdef DEBUG
|
||||
printf("$%s ", strnames[_strorder[i]]);
|
||||
#endif
|
||||
if ((cur->strs[_strorder[i]]
|
||||
= _addstr(strtbl + convshort(s))) == NULL)
|
||||
return 1;
|
||||
}
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
273
lib/libmytinfo/gettcap.c
Normal file
273
lib/libmytinfo/gettcap.c
Normal file
@ -0,0 +1,273 @@
|
||||
/*
|
||||
* gettcap.c
|
||||
*
|
||||
* By Ross Ridge
|
||||
* Public Domain
|
||||
* 92/02/01 07:30:00
|
||||
*
|
||||
*/
|
||||
|
||||
#include "defs.h"
|
||||
#include <term.h>
|
||||
|
||||
#include <ctype.h>
|
||||
|
||||
#ifdef USE_SCCS_IDS
|
||||
static const char SCCSid[] = "@(#) mytinfo gettcap.c 3.2 92/02/01 public domain, By Ross Ridge";
|
||||
#endif
|
||||
|
||||
int
|
||||
_gettcap(sp, cur, path)
|
||||
register char *sp;
|
||||
TERMINAL *cur;
|
||||
struct term_path *path; {
|
||||
static char name[MAX_NAME];
|
||||
static char entry[MAX_LINE];
|
||||
register char *dp;
|
||||
register TERMINAL *ct = cur;
|
||||
int i, pad, fract, mul = 0, ind;
|
||||
char c, flag;
|
||||
|
||||
dp = entry;
|
||||
while(*sp != ':' && *sp != '\0')
|
||||
*dp++ = *sp++;
|
||||
if (ct->name_all == NULL) {
|
||||
*dp = '\0';
|
||||
if ((ct->name_all = _addstr(entry)) == NULL)
|
||||
return 1;
|
||||
while(dp > entry && *--dp != '|');
|
||||
ct->name_long = ct->name_all + (dp - entry) + 1;
|
||||
}
|
||||
|
||||
while(*sp != '\0') {
|
||||
while(*sp == ':')
|
||||
sp++;
|
||||
while(isspace(*sp))
|
||||
sp++;
|
||||
if (*sp == ':')
|
||||
continue;
|
||||
if (*sp == '\0')
|
||||
break;
|
||||
dp = name;
|
||||
while (*sp != ':' && *sp != '#' && *sp != '=' &&
|
||||
!isspace(*sp) && *sp != '\0')
|
||||
*dp++ = *sp++;
|
||||
*dp = '\0';
|
||||
#ifdef DEBUG
|
||||
printf(" %s", name);
|
||||
#endif
|
||||
switch(*sp) {
|
||||
case '=':
|
||||
#ifdef DEBUG
|
||||
putchar('$');
|
||||
#endif
|
||||
ind = _findstrcode(name);
|
||||
if (ind != -1)
|
||||
flag = _strflags[ind];
|
||||
else
|
||||
flag = 'K';
|
||||
dp = entry;
|
||||
fract = pad = 0;
|
||||
sp++;
|
||||
if (isdigit(*sp) && flag != 'K') {
|
||||
pad = *sp++ - '0';
|
||||
while(isdigit(*sp))
|
||||
pad = pad * 10 + (*sp++ - '0');
|
||||
if (*sp == '.' && isdigit(sp[1])) {
|
||||
sp++;
|
||||
fract = (*sp++ - '0');
|
||||
}
|
||||
if (*sp == '*') {
|
||||
mul = 1;
|
||||
sp++;
|
||||
} else
|
||||
mul = 0;
|
||||
|
||||
}
|
||||
while(*sp != '\0' && *sp != ':') {
|
||||
switch(*sp) {
|
||||
case '\\':
|
||||
switch(*++sp) {
|
||||
case 'e':
|
||||
case 'E': *dp++ = '\033'; break;
|
||||
case 'l': *dp++ = '\012'; break;
|
||||
case 'n': *dp++ = '\n'; break;
|
||||
case 'r': *dp++ = '\r'; break;
|
||||
case 't': *dp++ = '\t'; break;
|
||||
case 'b': *dp++ = '\b'; break;
|
||||
case 'f': *dp++ = '\f'; break;
|
||||
case 's': *dp++ = ' '; break;
|
||||
|
||||
case '^':
|
||||
case '\\':
|
||||
case ',':
|
||||
case ':':
|
||||
*dp++ = *sp;
|
||||
break;
|
||||
|
||||
case '0':
|
||||
if (!isdigit(*(sp + 1))) {
|
||||
*dp++ = '\200';
|
||||
break;
|
||||
}
|
||||
;/* FALLTHROUGH */
|
||||
case '1':
|
||||
case '2':
|
||||
case '3':
|
||||
case '4':
|
||||
case '5':
|
||||
case '6':
|
||||
case '7':
|
||||
c = *sp - '0';
|
||||
if (sp[1] >= '0'
|
||||
&& sp[1] <= '8')
|
||||
c = c * 8
|
||||
+ (*++sp - '0');
|
||||
if (sp[1] >= '0'
|
||||
&& sp[1] <= '8')
|
||||
c = c * 8
|
||||
+ (*++sp - '0');
|
||||
switch((char)c) {
|
||||
case 0:
|
||||
if (flag == 'K')
|
||||
*dp++ = '\200';
|
||||
else {
|
||||
*dp++ = '\\';
|
||||
*dp++ = '0';
|
||||
*dp++ = '0';
|
||||
*dp++ = '0';
|
||||
}
|
||||
break;
|
||||
case '$':
|
||||
case '\'':
|
||||
case '\\':
|
||||
if (flag != 'K')
|
||||
*dp++ = '\\';
|
||||
/* FALLTHROUGH */
|
||||
default:
|
||||
if (flag == 'G'
|
||||
&& c == '%')
|
||||
*dp++ = '\\';
|
||||
*dp++ = c;
|
||||
break;
|
||||
}
|
||||
break;
|
||||
default:
|
||||
*dp++ = '\\';
|
||||
*dp++ = *sp;
|
||||
break;
|
||||
}
|
||||
sp++;
|
||||
break;
|
||||
case '^':
|
||||
if (*++sp >= 'A' && *sp <= '_') {
|
||||
*dp++ = *sp++ - '@';
|
||||
} else if (*sp >= 'a' && *sp <= 'z') {
|
||||
*dp++ = *sp++ - 'a' + 1;
|
||||
} else if (*sp == '@') {
|
||||
if (flag == 'K')
|
||||
*dp++ = '\200';
|
||||
else {
|
||||
*dp++ = '\\';
|
||||
*dp++ = '0';
|
||||
*dp++ = '0';
|
||||
*dp++ = '0';
|
||||
}
|
||||
sp++;
|
||||
} else
|
||||
*dp++ = '^';
|
||||
break;
|
||||
case '$':
|
||||
if (flag != 'K')
|
||||
*dp++ = '\\';
|
||||
/* FALLTHROUGH */
|
||||
default:
|
||||
*dp++ = *sp++;
|
||||
break;
|
||||
}
|
||||
}
|
||||
if (pad != 0 || fract != 0) {
|
||||
if (fract == 0)
|
||||
sprintf(dp, "$<%d", pad);
|
||||
else
|
||||
sprintf(dp, "$<%d.%d", pad, fract);
|
||||
dp += strlen(dp);
|
||||
if (mul)
|
||||
*dp++ = '*';
|
||||
*dp++ = '>';
|
||||
}
|
||||
*dp++ = '\0';
|
||||
if(name[0] == 't' && name[1] == 'c' && name[2] == '\0'){
|
||||
if (_getother(entry, path, ct))
|
||||
return 1;
|
||||
break;
|
||||
}
|
||||
if (ind == -1)
|
||||
break;
|
||||
if (ct->strs[ind] != (char *) -1)
|
||||
break;
|
||||
if ((ct->strs[ind] = _addstr(entry)) == NULL)
|
||||
return 1;
|
||||
break;
|
||||
case '#':
|
||||
#ifdef DEBUG
|
||||
putchar('#');
|
||||
#endif
|
||||
i = atoi(++sp);
|
||||
while(*sp != '\0' && *sp++ != ':');
|
||||
ind = _findnumcode(name);
|
||||
if (ind == -1)
|
||||
break;
|
||||
if (ct->nums[ind] != -2)
|
||||
break;
|
||||
ct->nums[ind] = i;
|
||||
break;
|
||||
default:
|
||||
while(*sp != '\0' && *sp++ != ':');
|
||||
if (*(dp - 1) == '@') {
|
||||
#ifdef DEBUG
|
||||
putchar('@');
|
||||
#endif
|
||||
*(dp - 1) = '\0';
|
||||
ind = _findboolcode(name);
|
||||
if (ind != -1) {
|
||||
#ifdef DEBUG
|
||||
putchar('!');
|
||||
#endif
|
||||
if (ct->bools[ind] == -1)
|
||||
ct->bools[ind] = 0;
|
||||
break;
|
||||
}
|
||||
ind = _findnumcode(name);
|
||||
if (ind != -1) {
|
||||
#ifdef DEBUG
|
||||
putchar('#');
|
||||
#endif
|
||||
if (ct->nums[ind] == -2)
|
||||
ct->nums[ind] = -1;
|
||||
break;
|
||||
}
|
||||
ind = _findstrcode(name);
|
||||
if (ind != -1) {
|
||||
#ifdef DEBUG
|
||||
putchar('$');
|
||||
#endif
|
||||
if (ct->strs[ind] == (char *) -1)
|
||||
ct->strs[ind] = NULL;
|
||||
break;
|
||||
}
|
||||
break;
|
||||
}
|
||||
#ifdef DEBUG
|
||||
putchar('!');
|
||||
#endif
|
||||
ind = _findboolcode(name);
|
||||
if (ind == -1)
|
||||
break;
|
||||
if (ct->bools[ind] != -1)
|
||||
break;
|
||||
ct->bools[ind] = 1;
|
||||
}
|
||||
}
|
||||
return 0;
|
||||
}
|
303
lib/libmytinfo/gettinfo.c
Normal file
303
lib/libmytinfo/gettinfo.c
Normal file
@ -0,0 +1,303 @@
|
||||
/*
|
||||
* gettinfo.c
|
||||
*
|
||||
* By Ross Ridge
|
||||
* Public Domain
|
||||
* 92/02/01 07:30:02
|
||||
*
|
||||
*/
|
||||
|
||||
#include "defs.h"
|
||||
#include <term.h>
|
||||
|
||||
#include <ctype.h>
|
||||
|
||||
#ifdef USE_SCCS_IDS
|
||||
static const char SCCSid[] = "@(#) mytinfo gettinfo.c 3.2 92/02/01 public domain, By Ross Ridge";
|
||||
#endif
|
||||
|
||||
int _gettinfo(sp, cur, path)
|
||||
register char *sp;
|
||||
struct term_path *path;
|
||||
TERMINAL *cur; {
|
||||
static char name[MAX_NAME];
|
||||
static char entry[MAX_LINE];
|
||||
register char *dp;
|
||||
register TERMINAL *ct = cur;
|
||||
int ind, i, base;
|
||||
char c, flag;
|
||||
|
||||
dp = entry;
|
||||
while(*sp != ',' && *sp != '\0')
|
||||
*dp++ = *sp++;
|
||||
if (ct->name_all == NULL) {
|
||||
*dp = '\0';
|
||||
if ((ct->name_all = _addstr(entry)) == NULL)
|
||||
return 1;
|
||||
while(dp > entry && *--dp != '|');
|
||||
ct->name_long = ct->name_all + (dp - entry) + 1;
|
||||
}
|
||||
|
||||
while(*sp != '\0') {
|
||||
while(*sp == ',')
|
||||
sp++;
|
||||
while(isspace(*sp))
|
||||
sp++;
|
||||
if (*sp == ',')
|
||||
continue;
|
||||
if (*sp == '\0')
|
||||
break;
|
||||
dp = name;
|
||||
while (*sp != ',' && *sp != '#' && *sp != '=' && !isspace(*sp) && *sp != '\0')
|
||||
*dp++ = *sp++;
|
||||
*dp = '\0';
|
||||
#ifdef DEBUG
|
||||
printf(" %s", name);
|
||||
#endif
|
||||
switch(*sp) {
|
||||
case '=':
|
||||
#ifdef DEBUG
|
||||
putchar('$');
|
||||
#endif
|
||||
dp = entry;
|
||||
sp++;
|
||||
ind = _findstrname(name);
|
||||
if (ind != -1)
|
||||
flag = _strflags[ind];
|
||||
else {
|
||||
ind = _findstrfname(name);
|
||||
if (ind != -1)
|
||||
flag = _strflags[ind];
|
||||
else
|
||||
flag = 'K';
|
||||
}
|
||||
while(*sp != '\0' && *sp != ',') {
|
||||
switch(*sp) {
|
||||
case '%':
|
||||
*dp++ = *sp++;
|
||||
if (*sp == '^' && flag == 'G')
|
||||
*dp++ = *sp++;
|
||||
break;
|
||||
case '\\':
|
||||
switch(*++sp) {
|
||||
case 'e':
|
||||
case 'E': *dp++ = '\033'; break;
|
||||
case 'l': *dp++ = '\012'; break;
|
||||
case 'n': *dp++ = '\n'; break;
|
||||
case 'r': *dp++ = '\r'; break;
|
||||
case 't': *dp++ = '\t'; break;
|
||||
case 'b': *dp++ = '\b'; break;
|
||||
case 'f': *dp++ = '\f'; break;
|
||||
case 's': *dp++ = ' '; break;
|
||||
|
||||
case '^':
|
||||
case '\\':
|
||||
case ',':
|
||||
case ':':
|
||||
*dp++ = *sp; break;
|
||||
|
||||
case '0':
|
||||
if (!isdigit(*(sp + 1))) {
|
||||
*dp++ = '\200';
|
||||
break;
|
||||
}
|
||||
/* FALLTHROUGH */
|
||||
case '1':
|
||||
case '2':
|
||||
case '3':
|
||||
case '4':
|
||||
case '5':
|
||||
case '6':
|
||||
case '7':
|
||||
c = *sp - '0';
|
||||
if (isdigit(sp[1]))
|
||||
c = c * 8 + (*++sp-'0');
|
||||
if (isdigit(sp[1]))
|
||||
c = c * 8 + (*++sp-'0');
|
||||
switch((char)c) {
|
||||
case 0:
|
||||
if (flag == 'K')
|
||||
*dp++ = '\200';
|
||||
else {
|
||||
*dp++ = '\\';
|
||||
*dp++ = '0';
|
||||
*dp++ = '0';
|
||||
*dp++ = '0';
|
||||
}
|
||||
break;
|
||||
case '$':
|
||||
case '\'':
|
||||
case '\\':
|
||||
if (flag != 'K')
|
||||
*dp++ = '\\';
|
||||
/* FALLTHROUGH */
|
||||
default:
|
||||
if (flag == 'G'
|
||||
&& c == '%')
|
||||
*dp++ = '\\';
|
||||
*dp++ = c;
|
||||
break;
|
||||
}
|
||||
break;
|
||||
default:
|
||||
*dp++ = '\\';
|
||||
*dp++ = *sp;
|
||||
break;
|
||||
}
|
||||
sp++;
|
||||
break;
|
||||
case '^':
|
||||
if (*++sp >= 'A' && *sp <= '_') {
|
||||
*dp++ = *sp++ - '@';
|
||||
} else if (*sp >= 'a' && *sp <= 'z') {
|
||||
*dp++ = *sp++ - 'a' + 1;
|
||||
} else if (*sp == '@') {
|
||||
if (flag == 'K')
|
||||
*dp++ = '\200';
|
||||
else {
|
||||
*dp++ = '\\';
|
||||
*dp++ = '0';
|
||||
*dp++ = '0';
|
||||
*dp++ = '0';
|
||||
}
|
||||
sp++;
|
||||
} else
|
||||
*dp++ = '^';
|
||||
break;
|
||||
default:
|
||||
*dp++ = *sp++;
|
||||
break;
|
||||
}
|
||||
}
|
||||
*dp++ = '\0';
|
||||
if (strcmp(name, "use") == 0) {
|
||||
if (_getother(entry, path, ct))
|
||||
return 1;
|
||||
break;
|
||||
}
|
||||
if (ind == -1)
|
||||
break;
|
||||
if (ct->strs[ind] != (char *) -1)
|
||||
break;
|
||||
if ((ct->strs[ind] = _addstr(entry)) == NULL)
|
||||
return 1;
|
||||
break;
|
||||
case '#':
|
||||
#ifdef DEBUG
|
||||
putchar('#');
|
||||
#endif
|
||||
#if 0
|
||||
i = atoi(++sp);
|
||||
#else
|
||||
sp++;
|
||||
if (*sp == '0') {
|
||||
sp++;
|
||||
if (*sp == 'x' || *sp == 'X') {
|
||||
sp++;
|
||||
base = 16;
|
||||
} else
|
||||
base = 8;
|
||||
} else
|
||||
base = 10;
|
||||
i = 0;
|
||||
while(1) {
|
||||
if (isdigit(*sp))
|
||||
i = i * base + *sp - '0';
|
||||
else if (base == 16 && isxdigit(*sp))
|
||||
i = i * base + tolower(*sp) - 'a' + 10;
|
||||
else
|
||||
break;
|
||||
sp++;
|
||||
}
|
||||
#endif
|
||||
while(*sp != '\0' && *sp != ',')
|
||||
sp++;
|
||||
|
||||
ind = _findnumname(name);
|
||||
if (ind != -1) {
|
||||
if (ct->nums[ind] != -2)
|
||||
break;
|
||||
ct->nums[ind] = i;
|
||||
} else {
|
||||
ind = _findnumfname(name);
|
||||
if (ind != -1) {
|
||||
if (ct->nums[ind] != -2)
|
||||
break;
|
||||
ct->nums[ind] = i;
|
||||
}
|
||||
}
|
||||
break;
|
||||
default:
|
||||
while(*sp != '\0' && *sp++ != ',');
|
||||
if (*(dp - 1) == '@') {
|
||||
#ifdef DEBUG
|
||||
putchar('@');
|
||||
#endif
|
||||
*(dp - 1) = '\0';
|
||||
ind = _findboolname(name);
|
||||
if (ind != -1) {
|
||||
#ifdef DEBUG
|
||||
putchar('!');
|
||||
#endif
|
||||
ct->bools[ind] = 0;
|
||||
break;
|
||||
}
|
||||
ind = _findnumname(name);
|
||||
if (ind != -1) {
|
||||
#ifdef DEBUG
|
||||
putchar('#');
|
||||
#endif
|
||||
ct->nums[ind] = -1;
|
||||
break;
|
||||
}
|
||||
ind = _findstrname(name);
|
||||
if (ind != -1) {
|
||||
#ifdef DEBUG
|
||||
putchar('$');
|
||||
#endif
|
||||
ct->strs[ind] = NULL;
|
||||
break;
|
||||
}
|
||||
ind = _findboolfname(name);
|
||||
if (ind != -1) {
|
||||
#ifdef DEBUG
|
||||
putchar('!');
|
||||
#endif
|
||||
ct->bools[ind] = 0;
|
||||
break;
|
||||
}
|
||||
ind = _findnumfname(name);
|
||||
if (ind != -1) {
|
||||
#ifdef DEBUG
|
||||
putchar('#');
|
||||
#endif
|
||||
ct->nums[ind] = -1;
|
||||
break;
|
||||
}
|
||||
ind = _findstrfname(name);
|
||||
if (ind != -1) {
|
||||
#ifdef DEBUG
|
||||
putchar('$');
|
||||
#endif
|
||||
ct->strs[ind] = NULL;
|
||||
break;
|
||||
}
|
||||
break;
|
||||
}
|
||||
#ifdef DEBUG
|
||||
putchar('!');
|
||||
#endif
|
||||
ind = _findboolname(name);
|
||||
if (ind == -1) {
|
||||
ind = _findboolfname(name);
|
||||
if (ind == -1)
|
||||
break;
|
||||
}
|
||||
if (ct->bools[ind] != -1)
|
||||
break;
|
||||
ct->bools[ind] = 1;
|
||||
break;
|
||||
}
|
||||
}
|
||||
return 0;
|
||||
}
|
116
lib/libmytinfo/mkbinorder.c
Normal file
116
lib/libmytinfo/mkbinorder.c
Normal file
@ -0,0 +1,116 @@
|
||||
/*
|
||||
* mkbinorder.c
|
||||
*
|
||||
* By Ross Ridge
|
||||
* Public Domain
|
||||
* 92/02/01 07:30:04
|
||||
*
|
||||
*/
|
||||
|
||||
#define NOTLIB
|
||||
#include "defs.h"
|
||||
#include <term.h>
|
||||
|
||||
const char SCCSid[] = "@(#) mytinfo mkbinorder.c 3.2 92/02/01 public domain, By Ross Ridge";
|
||||
|
||||
char cap[MAX_NAME];
|
||||
char *p2c = cap;
|
||||
char **p2p2c = &p2c;
|
||||
|
||||
int
|
||||
main(argc, argv)
|
||||
int argc;
|
||||
char **argv; {
|
||||
int r;
|
||||
int ind;
|
||||
FILE *f;
|
||||
|
||||
if (argc == 1)
|
||||
f = stdin;
|
||||
else if (argc == 2) {
|
||||
f = fopen(argv[1], "r");
|
||||
if (f == NULL) {
|
||||
fprintf(stderr, "can't open %s\n", argv[1]);
|
||||
exit(1);
|
||||
}
|
||||
} else {
|
||||
fprintf(stderr, "argument count\n");
|
||||
exit(1);
|
||||
}
|
||||
|
||||
do {
|
||||
r = fscanf(f, "%s", cap);
|
||||
} while(r == 1 && strcmp(cap, "!") != 0);
|
||||
if (r != 1) {
|
||||
fprintf(stderr, "expected '!'\n");
|
||||
exit(1);
|
||||
}
|
||||
|
||||
puts("/*");
|
||||
puts(" * binorder.c");
|
||||
puts(" *");
|
||||
puts(" * This file was generated automatically");
|
||||
puts(" *");
|
||||
puts(" */\n");
|
||||
|
||||
puts("int _boolorder[] = {");
|
||||
|
||||
while(1) {
|
||||
r = fscanf(f, "%s", cap);
|
||||
cap[MAX_TINFONAME] = '\0';
|
||||
if (r != 1) {
|
||||
fprintf(stderr, "unexpected EOF\n");
|
||||
exit(1);
|
||||
}
|
||||
if (strcmp(cap, "#") == 0)
|
||||
break;
|
||||
ind = _findboolname(cap);
|
||||
if (ind == -1) {
|
||||
fprintf(stderr, "unknown bool name '%s'\n", cap);
|
||||
continue;
|
||||
}
|
||||
printf("\t%d,\n", ind);
|
||||
}
|
||||
puts("\t-1");
|
||||
puts("};\n");
|
||||
|
||||
puts("int _numorder[] = {");
|
||||
|
||||
while(1) {
|
||||
r = fscanf(f, "%s", cap);
|
||||
cap[MAX_TINFONAME] = '\0';
|
||||
if (r != 1) {
|
||||
fprintf(stderr, "unexpected EOF\n");
|
||||
exit(1);
|
||||
}
|
||||
if (strcmp(cap, "$") == 0)
|
||||
break;
|
||||
ind = _findnumname(cap);
|
||||
if (ind == -1) {
|
||||
fprintf(stderr, "unknown num name '%s'\n", cap);
|
||||
continue;
|
||||
}
|
||||
printf("\t%d,\n", ind);
|
||||
}
|
||||
puts("\t-1");
|
||||
puts("};\n");
|
||||
|
||||
puts("int _strorder[] = {");
|
||||
|
||||
while(1) {
|
||||
r = fscanf(f, "%s", cap);
|
||||
cap[MAX_TINFONAME] = '\0';
|
||||
if (r != 1)
|
||||
break;
|
||||
ind = _findstrname(cap);
|
||||
if (ind == -1) {
|
||||
fprintf(stderr, "unknown str name '%s'\n", cap);
|
||||
continue;
|
||||
}
|
||||
printf("\t%d,\n", ind);
|
||||
}
|
||||
puts("\t-1");
|
||||
puts("};\n");
|
||||
|
||||
return 0;
|
||||
}
|
166
lib/libmytinfo/mkcaplist.c
Normal file
166
lib/libmytinfo/mkcaplist.c
Normal file
@ -0,0 +1,166 @@
|
||||
/*
|
||||
* mkcaplist.c
|
||||
*
|
||||
* By Ross Ridge
|
||||
* Public Domain
|
||||
* 92/02/01 07:30:05
|
||||
*
|
||||
* mkcaplist [-n caps] [file]
|
||||
*
|
||||
* makes caplist.c from the cap_list file
|
||||
*
|
||||
*/
|
||||
|
||||
#define NOTLIB
|
||||
#include "defs.h"
|
||||
|
||||
const char SCCSid[] = "@(#) mytinfo mkcaplist.c 3.2 92/02/01 public domain, By Ross Ridge";
|
||||
|
||||
#define DEFAULT_CAPS 1000
|
||||
|
||||
struct caplist *list;
|
||||
|
||||
int
|
||||
main(argc, argv)
|
||||
int argc;
|
||||
char **argv; {
|
||||
FILE *f;
|
||||
int caps = DEFAULT_CAPS;
|
||||
int n;
|
||||
register int i;
|
||||
|
||||
if (argc > 2 && argv[1][0] == '-' && argv[1][1] == 'n') {
|
||||
caps = atoi(argv[2]);
|
||||
argv += 2;
|
||||
argc -= 2;
|
||||
}
|
||||
|
||||
if (argc == 1) {
|
||||
f = stdin;
|
||||
} else if (argc == 2) {
|
||||
f = fopen(argv[1], "r");
|
||||
if (f == NULL) {
|
||||
fprintf(stderr, "%s: can't open '%s'\n", argv[0],
|
||||
argv[1]);
|
||||
return 1;
|
||||
}
|
||||
} else {
|
||||
fprintf(stderr, "%s: too many arguments\n", argv[0]);
|
||||
fprintf(stderr, "usage: %s [-n caps] [file]\n", argv[0]);
|
||||
return 1;
|
||||
}
|
||||
|
||||
list = (struct caplist *) malloc(caps * sizeof(struct caplist));
|
||||
if (list == NULL) {
|
||||
fprintf(stderr, "%s: malloc failed.\n", argv[0]);
|
||||
return 1;
|
||||
}
|
||||
|
||||
n = readcaps(f, list, caps);
|
||||
if (n > caps) {
|
||||
fprintf(stderr, "%s: too many caps, use -n.\n", argv[0]);
|
||||
return 1;
|
||||
}
|
||||
if (n == 0) {
|
||||
fprintf(stderr, "%s: no caps in file.\n", argv[0]);
|
||||
return 1;
|
||||
}
|
||||
if (n == -1) {
|
||||
fprintf(stderr, "%s: bad caps line.\n", argv[0]);
|
||||
return 1;
|
||||
}
|
||||
if (n == -2) {
|
||||
fprintf(stderr, "%s: unexpected EOF.\n", argv[0]);
|
||||
return 1;
|
||||
}
|
||||
|
||||
puts("/*");
|
||||
puts(" * caplist.c ");
|
||||
puts(" *");
|
||||
puts(" * This file was generated automatically.");
|
||||
puts(" *");
|
||||
puts(" */");
|
||||
putchar('\n');
|
||||
|
||||
puts("char *boolnames[] = {");
|
||||
for (i = 0; i < n; i++)
|
||||
if (list[i].type == '!')
|
||||
printf("\t\"%s\",\n", list[i].tinfo);
|
||||
puts("\t(char *)0");
|
||||
puts("};");
|
||||
putchar('\n');
|
||||
|
||||
puts("char *boolcodes[] = {");
|
||||
for (i = 0; i < n; i++)
|
||||
if (list[i].type == '!')
|
||||
printf("\t\"%s\",\n", list[i].tcap);
|
||||
puts("\t(char *)0");
|
||||
puts("};");
|
||||
putchar('\n');
|
||||
|
||||
puts("char *boolfnames[] = {");
|
||||
for (i = 0; i < n; i++)
|
||||
if (list[i].type == '!')
|
||||
printf("\t\"%s\",\n", list[i].var);
|
||||
puts("\t(char *)0");
|
||||
puts("};");
|
||||
putchar('\n');
|
||||
|
||||
puts("char *numnames[] = {");
|
||||
for (i = 0; i < n; i++)
|
||||
if (list[i].type == '#')
|
||||
printf("\t\"%s\",\n", list[i].tinfo);
|
||||
puts("\t(char *)0");
|
||||
puts("};");
|
||||
putchar('\n');
|
||||
|
||||
puts("char *numcodes[] = {");
|
||||
for (i = 0; i < n; i++)
|
||||
if (list[i].type == '#')
|
||||
printf("\t\"%s\",\n", list[i].tcap);
|
||||
puts("\t(char *)0");
|
||||
puts("};");
|
||||
putchar('\n');
|
||||
|
||||
puts("char *numfnames[] = {");
|
||||
for (i = 0; i < n; i++)
|
||||
if (list[i].type == '#')
|
||||
printf("\t\"%s\",\n", list[i].var);
|
||||
puts("\t(char *)0");
|
||||
puts("};");
|
||||
putchar('\n');
|
||||
|
||||
puts("char *strnames[] = {");
|
||||
for (i = 0; i < n; i++)
|
||||
if (list[i].type == '$')
|
||||
printf("\t\"%s\",\n", list[i].tinfo);
|
||||
puts("\t(char *)0");
|
||||
puts("};");
|
||||
putchar('\n');
|
||||
|
||||
puts("char *strcodes[] = {");
|
||||
for (i = 0; i < n; i++)
|
||||
if (list[i].type == '$')
|
||||
printf("\t\"%s\",\n", list[i].tcap);
|
||||
puts("\t(char *)0");
|
||||
puts("};");
|
||||
putchar('\n');
|
||||
|
||||
puts("char *strfnames[] = {");
|
||||
for (i = 0; i < n; i++)
|
||||
if (list[i].type == '$')
|
||||
printf("\t\"%s\",\n", list[i].var);
|
||||
puts("\t(char *)0");
|
||||
puts("};");
|
||||
putchar('\n');
|
||||
|
||||
puts("char _strflags[] = {");
|
||||
for (i = 0; i < n; i++)
|
||||
if (list[i].type == '$')
|
||||
printf("\t'%c',\n", list[i].flag);
|
||||
puts("\t'\\0'");
|
||||
puts("};");
|
||||
putchar('\n');
|
||||
|
||||
return 0;
|
||||
}
|
134
lib/libmytinfo/mkcapsort.c
Normal file
134
lib/libmytinfo/mkcapsort.c
Normal file
@ -0,0 +1,134 @@
|
||||
/*
|
||||
* mkcapsort.c
|
||||
*
|
||||
* By Ross Ridge
|
||||
* Public Domain
|
||||
* 92/06/04 11:38:02
|
||||
*
|
||||
* mkcapsort
|
||||
*
|
||||
* make the sorted lists of pointers to strins
|
||||
*
|
||||
*/
|
||||
|
||||
#define NOTLIB
|
||||
#include "defs.h"
|
||||
#include <term.h>
|
||||
|
||||
#ifdef USE_MYQSORT
|
||||
#include "qsort.c"
|
||||
#endif
|
||||
|
||||
const char SCCSid[] = "@(#) mytinfo mkcapsort.c 3.3 92/06/04 public domain, By Ross Ridge";
|
||||
|
||||
char **sboolnames[NUM_OF_BOOLS], **sboolcodes[NUM_OF_BOOLS], **sboolfnames[NUM_OF_BOOLS];
|
||||
char **snumnames[NUM_OF_NUMS], **snumcodes[NUM_OF_NUMS], **snumfnames[NUM_OF_NUMS];
|
||||
char **sstrnames[NUM_OF_STRS], **sstrcodes[NUM_OF_STRS], **sstrfnames[NUM_OF_STRS];
|
||||
|
||||
|
||||
int
|
||||
main() {
|
||||
register int i;
|
||||
|
||||
i = NUM_OF_BOOLS;
|
||||
while(i) {
|
||||
i--;
|
||||
sboolnames[i] = &boolnames[i];
|
||||
sboolcodes[i] = &boolcodes[i];
|
||||
sboolfnames[i] = &boolfnames[i];
|
||||
}
|
||||
|
||||
i = NUM_OF_NUMS;
|
||||
while(i) {
|
||||
i--;
|
||||
snumnames[i] = &numnames[i];
|
||||
snumcodes[i] = &numcodes[i];
|
||||
snumfnames[i] = &numfnames[i];
|
||||
}
|
||||
|
||||
i = NUM_OF_STRS;
|
||||
while(i) {
|
||||
i--;
|
||||
sstrnames[i] = &strnames[i];
|
||||
sstrcodes[i] = &strcodes[i];
|
||||
sstrfnames[i] = &strfnames[i];
|
||||
}
|
||||
|
||||
qsort((anyptr) sboolnames, NUM_OF_BOOLS, sizeof(*sboolnames), _compar);
|
||||
qsort((anyptr) sboolcodes, NUM_OF_BOOLS, sizeof(*sboolcodes), _compar);
|
||||
qsort((anyptr) sboolfnames, NUM_OF_BOOLS, sizeof(*sboolfnames),_compar);
|
||||
qsort((anyptr) snumnames, NUM_OF_NUMS, sizeof(*snumnames), _compar);
|
||||
qsort((anyptr) snumcodes, NUM_OF_NUMS, sizeof(*snumcodes), _compar);
|
||||
qsort((anyptr) snumfnames, NUM_OF_NUMS, sizeof(*snumfnames), _compar);
|
||||
qsort((anyptr) sstrnames, NUM_OF_STRS, sizeof(*sstrnames), _compar);
|
||||
qsort((anyptr) sstrcodes, NUM_OF_STRS, sizeof(*sstrcodes), _compar);
|
||||
qsort((anyptr) sstrfnames, NUM_OF_STRS, sizeof(*sstrfnames), _compar);
|
||||
|
||||
printf("/*\n");
|
||||
printf(" * capsort.c\n");
|
||||
printf(" *\n");
|
||||
printf(" * This file was generated automatically.\n");
|
||||
printf(" *\n");
|
||||
printf(" */\n\n");
|
||||
|
||||
puts("extern char *boolnames[], *boolcodes[], *boolfnames[];");
|
||||
puts("extern char *numnames[], *numcodes[], *numfnames[];");
|
||||
puts("extern char *strnames[], *strcodes[], *strfnames[];");
|
||||
putchar('\n');
|
||||
|
||||
printf("char **_sboolnames[] = {\n");
|
||||
for(i = 0; i < NUM_OF_BOOLS; i++)
|
||||
printf("\tboolnames + %d,\n", sboolnames[i] - boolnames);
|
||||
printf(" (char **) 0\n");
|
||||
printf("};\n\n");
|
||||
|
||||
printf("char **_sboolcodes[] = {\n");
|
||||
for(i = 0; i < NUM_OF_BOOLS; i++)
|
||||
printf("\tboolcodes + %d,\n", sboolcodes[i] - boolcodes);
|
||||
printf(" (char **) 0\n");
|
||||
printf("};\n\n");
|
||||
|
||||
printf("char **_sboolfnames[] = {\n");
|
||||
for(i = 0; i < NUM_OF_BOOLS; i++)
|
||||
printf("\tboolfnames + %d,\n", sboolfnames[i] - boolfnames);
|
||||
printf(" (char **) 0\n");
|
||||
printf("};\n\n");
|
||||
|
||||
printf("char **_snumnames[] = {\n");
|
||||
for(i = 0; i < NUM_OF_NUMS; i++)
|
||||
printf("\tnumnames + %d,\n", snumnames[i] - numnames);
|
||||
printf(" (char **) 0\n");
|
||||
printf("};\n\n");
|
||||
|
||||
printf("char **_snumcodes[] = {\n");
|
||||
for(i = 0; i < NUM_OF_NUMS; i++)
|
||||
printf("\tnumcodes + %d,\n", snumcodes[i] - numcodes);
|
||||
printf(" (char **) 0\n");
|
||||
printf("};\n\n");
|
||||
|
||||
printf("char **_snumfnames[] = {\n");
|
||||
for(i = 0; i < NUM_OF_NUMS; i++)
|
||||
printf("\tnumfnames + %d,\n", snumfnames[i] - numfnames);
|
||||
printf(" (char **) 0\n");
|
||||
printf("};\n\n");
|
||||
|
||||
printf("char **_sstrnames[] = {\n");
|
||||
for(i = 0; i < NUM_OF_STRS; i++)
|
||||
printf("\tstrnames + %d,\n", sstrnames[i] - strnames);
|
||||
printf(" (char **) 0\n");
|
||||
printf("};\n\n");
|
||||
|
||||
printf("char **_sstrcodes[] = {\n");
|
||||
for(i = 0; i < NUM_OF_STRS; i++)
|
||||
printf("\tstrcodes + %d,\n", sstrcodes[i] - strcodes);
|
||||
printf(" (char **) 0\n");
|
||||
printf("};\n\n");
|
||||
|
||||
printf("char **_sstrfnames[] = {\n");
|
||||
for(i = 0; i < NUM_OF_STRS; i++)
|
||||
printf("\tstrfnames + %d,\n", sstrfnames[i] - strfnames);
|
||||
printf(" (char **) 0\n");
|
||||
printf("};\n\n");
|
||||
|
||||
return 0;
|
||||
}
|
160
lib/libmytinfo/mktermhead.c
Normal file
160
lib/libmytinfo/mktermhead.c
Normal file
@ -0,0 +1,160 @@
|
||||
/*
|
||||
* mktermhead.c
|
||||
*
|
||||
* By Ross Ridge
|
||||
* Public Domain
|
||||
* 92/06/04 11:38:57
|
||||
*
|
||||
* mktermhead [-n caps] file
|
||||
*
|
||||
* generates term.head
|
||||
*
|
||||
*/
|
||||
|
||||
#define NOTLIB
|
||||
#include "defs.h"
|
||||
|
||||
const char SCCSid[] = "@(#) mytinfo mktermhead.c 3.3 92/06/04 public domain, By Ross Ridge";
|
||||
|
||||
#define DEFAULT_CAPS 1000
|
||||
|
||||
|
||||
int
|
||||
main(argc, argv)
|
||||
int argc;
|
||||
char **argv; {
|
||||
FILE *f;
|
||||
int caps = DEFAULT_CAPS;
|
||||
int n;
|
||||
register int i;
|
||||
int nb, ns, nn;
|
||||
struct caplist *list;
|
||||
|
||||
if (argc > 2 && argv[1][0] == '-' && argv[1][1] == 'n') {
|
||||
caps = atoi(argv[2]);
|
||||
argv += 2;
|
||||
argc -= 2;
|
||||
}
|
||||
|
||||
if (argc == 1) {
|
||||
f = stdin;
|
||||
} else if (argc == 2) {
|
||||
f = fopen(argv[1], "r");
|
||||
if (f == NULL) {
|
||||
fprintf(stderr, "%s: can't open '%s'\n", argv[0],
|
||||
argv[1]);
|
||||
return 1;
|
||||
}
|
||||
} else {
|
||||
fprintf(stderr, "%s: too many arguments\n", argv[0]);
|
||||
fprintf(stderr, "usage: %s [-n caps] [file]\n", argv[0]);
|
||||
return 1;
|
||||
}
|
||||
|
||||
list = (struct caplist *) malloc(caps * sizeof(struct caplist));
|
||||
if (list == NULL) {
|
||||
fprintf(stderr, "%s: malloc failed.\n", argv[0]);
|
||||
return 1;
|
||||
}
|
||||
|
||||
n = readcaps(f, list, caps);
|
||||
if (n > caps) {
|
||||
fprintf(stderr, "%s: too many caps, use -n.\n", argv[0]);
|
||||
return 1;
|
||||
}
|
||||
switch(n) {
|
||||
case 0:
|
||||
fprintf(stderr, "%s: no caps in file.\n", argv[0]);
|
||||
return 1;
|
||||
case -1:
|
||||
fprintf(stderr, "%s: bad caps line.\n", argv[0]);
|
||||
return 1;
|
||||
case -2:
|
||||
fprintf(stderr, "%s: unexpected EOF.\n", argv[0]);
|
||||
return 1;
|
||||
}
|
||||
|
||||
puts("/*");
|
||||
puts(" * term.h ");
|
||||
puts(" *");
|
||||
puts(" * This file was generated automatically.");
|
||||
puts(" *");
|
||||
puts(" */");
|
||||
putchar('\n');
|
||||
puts("#ifndef _TERM_H_");
|
||||
puts("#define _TERM_H_");
|
||||
putchar('\n');
|
||||
nb = 0;
|
||||
for (i = 0; i < n; i++) {
|
||||
if (list[i].type == '!') {
|
||||
printf("#define %-*s (_CUR_TERM.bools[%d])\n",
|
||||
MAX_VARNAME, list[i].var, nb);
|
||||
nb++;
|
||||
}
|
||||
}
|
||||
|
||||
nn = 0;
|
||||
for (i = 0; i < n; i++) {
|
||||
if (list[i].type == '#') {
|
||||
printf("#define %-*s (_CUR_TERM.nums[%d])\n",
|
||||
MAX_VARNAME, list[i].var, nn);
|
||||
nn++;
|
||||
}
|
||||
}
|
||||
|
||||
ns = 0;
|
||||
for (i = 0; i < n; i++) {
|
||||
if (list[i].type == '$') {
|
||||
printf("#define %-*s (_CUR_TERM.strs[%d])\n",
|
||||
MAX_VARNAME, list[i].var, ns);
|
||||
ns++;
|
||||
}
|
||||
}
|
||||
|
||||
putchar('\n');
|
||||
|
||||
printf ("#define NUM_OF_BOOLS\t%d\n", nb);
|
||||
printf ("#define NUM_OF_NUMS\t%d\n", nn);
|
||||
printf ("#define NUM_OF_STRS\t%d\n", ns);
|
||||
|
||||
putchar('\n');
|
||||
puts("#ifndef OVERRIDE");
|
||||
puts("#undef _USE_SGTTY");
|
||||
#ifdef USE_SGTTY
|
||||
puts("#define _USE_SGTTY");
|
||||
#endif
|
||||
puts("#undef _USE_TERMIO");
|
||||
#ifdef USE_TERMIO
|
||||
puts("#define _USE_TERMIO");
|
||||
#endif
|
||||
puts("#undef _USE_TERMIOS");
|
||||
#ifdef USE_TERMIOS
|
||||
puts("#define _USE_TERMIOS");
|
||||
#endif
|
||||
puts("#undef _USE_SMALLMEM");
|
||||
#ifdef USE_SMALLMEM
|
||||
puts("#define _USE_SMALLMEM");
|
||||
#endif
|
||||
puts("#undef _USE_PROTOTYPES");
|
||||
#ifdef USE_PROTOTYPES
|
||||
puts("#define _USE_PROTOTYPES");
|
||||
#endif
|
||||
puts("#undef _USE_WINSZ");
|
||||
#ifdef USE_WINSZ
|
||||
puts("#define _USE_WINSZ");
|
||||
#endif
|
||||
puts("#undef _USE_TERMINFO");
|
||||
#ifdef USE_TERMINFO
|
||||
puts("#define _USE_TERMINFO");
|
||||
#endif
|
||||
puts("#undef _USE_TERMCAP");
|
||||
#ifdef USE_TERMCAP
|
||||
puts("#define _USE_TERMCAP");
|
||||
#endif
|
||||
puts("#undef _MAX_CHUNK");
|
||||
printf("#define _MAX_CHUNK %d\n", MAX_CHUNK);
|
||||
puts("#endif /* OVERRIDE */");
|
||||
putchar('\n');
|
||||
|
||||
return 0;
|
||||
}
|
35
lib/libmytinfo/mkversion.c
Normal file
35
lib/libmytinfo/mkversion.c
Normal file
@ -0,0 +1,35 @@
|
||||
/*
|
||||
* mkversion.c
|
||||
*
|
||||
* By Ross Ridge
|
||||
* Public Domain
|
||||
* 92/02/01 07:30:09
|
||||
*
|
||||
* generates version.c
|
||||
*
|
||||
*/
|
||||
|
||||
#define NOTLIB
|
||||
#include "defs.h"
|
||||
|
||||
#include "version.h"
|
||||
|
||||
const char SCCSid[] = "@(#) mytinfo mkversion.c 3.2 92/02/01 public domain, By Ross Ridge";
|
||||
|
||||
int
|
||||
main(argc, argv)
|
||||
int argc;
|
||||
char **argv; {
|
||||
puts("/*");
|
||||
puts(" * version.c ");
|
||||
puts(" *");
|
||||
puts(" * This file was generated automatically.");
|
||||
puts(" *");
|
||||
puts(" */");
|
||||
putchar('\n');
|
||||
|
||||
printf("char _mytinfo_version[] = \"@(#) mytinfo: Release %d, Patchlevel %d (ache).\";\n",
|
||||
RELEASE, PATCHLEVEL);
|
||||
|
||||
return 0;
|
||||
}
|
72
lib/libmytinfo/quit.c
Normal file
72
lib/libmytinfo/quit.c
Normal file
@ -0,0 +1,72 @@
|
||||
/*
|
||||
* quit.c
|
||||
*
|
||||
* By Ross Ridge
|
||||
* Public Domain
|
||||
* 92/02/01 07:30:14
|
||||
*
|
||||
* quit with a diagnostic message printed on stderr
|
||||
*
|
||||
*/
|
||||
|
||||
#define NOTLIB
|
||||
#include "defs.h"
|
||||
|
||||
#ifdef USE_SCCS_IDS
|
||||
static const char SCCSid[] = "@(#) mytinfo quit.c 3.2 92/02/01 public domain, By Ross Ridge";
|
||||
#endif
|
||||
|
||||
char *prg_name;
|
||||
|
||||
#if defined(USE_PROTOTYPES) && !defined(lint)
|
||||
void (*cleanup)(int);
|
||||
#else
|
||||
void (*cleanup)();
|
||||
#endif
|
||||
|
||||
/* PRINTFLIKE2 */
|
||||
noreturn
|
||||
#ifdef USE_STDARG
|
||||
#ifdef USE_PROTOTYPES
|
||||
void
|
||||
quit(int e, char *fmt, ...)
|
||||
#else
|
||||
void quit(e, fmt)
|
||||
int e;
|
||||
char *fmt;
|
||||
#endif
|
||||
#else
|
||||
void quit(va_alist)
|
||||
va_dcl
|
||||
#endif
|
||||
{
|
||||
#ifndef USE_STDARG
|
||||
int e;
|
||||
char *fmt;
|
||||
#endif
|
||||
va_list ap;
|
||||
|
||||
#ifdef USE_STDARG
|
||||
va_start(ap, fmt);
|
||||
#else
|
||||
va_start(ap);
|
||||
e = va_arg(ap, int);
|
||||
fmt = va_arg(ap, char *);
|
||||
#endif
|
||||
|
||||
(*cleanup)(e);
|
||||
|
||||
if (e != 0)
|
||||
fprintf(stderr, "%s: ", prg_name);
|
||||
#ifdef USE_DOPRNT
|
||||
_doprnt(fmt, ap, stderr);
|
||||
#else
|
||||
vfprintf(stderr, fmt, ap);
|
||||
#endif
|
||||
putc('\n', stderr);
|
||||
if (e > 0 && e < sys_nerr) {
|
||||
fprintf(stderr, "%d - %s\n", e, sys_errlist[e]);
|
||||
}
|
||||
fflush(stderr);
|
||||
exit(e);
|
||||
}
|
151
lib/libmytinfo/readcaps.c
Normal file
151
lib/libmytinfo/readcaps.c
Normal file
@ -0,0 +1,151 @@
|
||||
/*
|
||||
* readcaps.c
|
||||
*
|
||||
* By Ross Ridge
|
||||
* Public Domain
|
||||
* 92/02/01 07:30:15
|
||||
*
|
||||
* Read in the cap_list file
|
||||
*
|
||||
*/
|
||||
|
||||
#define NOTLIB
|
||||
#include "defs.h"
|
||||
|
||||
#include <ctype.h>
|
||||
|
||||
#ifdef USE_SCCS_IDS
|
||||
static const char SCCSid[] = "@(#) mytinfo readcaps.c 3.2 92/02/01 public domain, By Ross Ridge";
|
||||
#endif
|
||||
|
||||
#ifdef __GNUC__
|
||||
__inline__
|
||||
#endif
|
||||
static int
|
||||
skipline(f)
|
||||
register FILE *f; {
|
||||
register int c;
|
||||
|
||||
do {
|
||||
c = getc(f);
|
||||
if (c == EOF)
|
||||
return EOF;
|
||||
#ifdef TEST
|
||||
putchar(c);
|
||||
#endif
|
||||
} while (c != '\n');
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
#ifdef __GNUC__
|
||||
__inline__
|
||||
#endif
|
||||
static int
|
||||
getfield(f, s, len)
|
||||
register FILE *f;
|
||||
register char *s;
|
||||
int len; {
|
||||
register int c;
|
||||
int i;
|
||||
#ifdef TEST
|
||||
char *start = s;
|
||||
#endif
|
||||
|
||||
do {
|
||||
c = getc(f);
|
||||
if (c == EOF)
|
||||
return EOF;
|
||||
} while (c != '\n' && isspace(c));
|
||||
if (c == '\n')
|
||||
return 0;
|
||||
|
||||
i = 0;
|
||||
while(!isspace(c)) {
|
||||
if (i++ < len)
|
||||
*s++ = c;
|
||||
c = getc(f);
|
||||
if (c == EOF)
|
||||
return EOF;
|
||||
|
||||
}
|
||||
*s = '\0';
|
||||
#ifdef TEST
|
||||
printf(" %s", start);
|
||||
#endif
|
||||
return c;
|
||||
}
|
||||
|
||||
int
|
||||
readcaps(f, buf, max)
|
||||
FILE *f;
|
||||
register struct caplist *buf;
|
||||
int max; {
|
||||
int type;
|
||||
register int count;
|
||||
int c;
|
||||
static char dummy;
|
||||
|
||||
count = 0;
|
||||
type = getc(f);
|
||||
while(type != EOF) {
|
||||
if (type == '$' || type == '!' || type == '#') {
|
||||
if (count >= max)
|
||||
return count + 1;
|
||||
#ifdef TEST
|
||||
putchar(type);
|
||||
#endif
|
||||
buf[count].type = type;
|
||||
|
||||
if (type == '$') {
|
||||
c = getc(f);
|
||||
if (c == EOF)
|
||||
break;
|
||||
if (c == 'G')
|
||||
buf[count].flag = 'G';
|
||||
else if (c == 'K')
|
||||
buf[count].flag = 'K';
|
||||
else
|
||||
buf[count].flag = ' ';
|
||||
}
|
||||
|
||||
c = getfield(f, buf[count].var, MAX_VARNAME);
|
||||
if (c == EOF || c == '\n' || c == 0)
|
||||
return -1;
|
||||
c = getfield(f, buf[count].tinfo, MAX_TINFONAME);
|
||||
if (c == EOF || c == '\n' || c == 0)
|
||||
return -1;
|
||||
c = getfield(f, buf[count].tcap, MAX_TCAPNAME);
|
||||
if (c == EOF || c == 0)
|
||||
return -1;
|
||||
if (c != '\n')
|
||||
if (getfield(f, &dummy, 1) != 0)
|
||||
return -1;
|
||||
count++;
|
||||
#ifdef TEST
|
||||
putchar('\n');
|
||||
#endif
|
||||
} else {
|
||||
#ifdef TEST
|
||||
putchar(type);
|
||||
#endif
|
||||
if (type != '\n' && skipline(f) == EOF)
|
||||
return -1;
|
||||
}
|
||||
type = getc(f);
|
||||
}
|
||||
return count;
|
||||
}
|
||||
|
||||
#ifdef TEST
|
||||
struct caplist list[1000];
|
||||
|
||||
int
|
||||
main() {
|
||||
int ret;
|
||||
|
||||
ret = readcaps(stdin, list, 1000);
|
||||
printf("ret = %d\n", ret);
|
||||
return 0;
|
||||
}
|
||||
#endif
|
194
lib/libmytinfo/tcapconv.c
Normal file
194
lib/libmytinfo/tcapconv.c
Normal file
@ -0,0 +1,194 @@
|
||||
/*
|
||||
* tcapconv.c
|
||||
*
|
||||
* By Ross Ridge
|
||||
* Public Domain
|
||||
* 92/02/01 07:30:20
|
||||
*
|
||||
*/
|
||||
|
||||
#include "defs.h"
|
||||
#define SINGLE
|
||||
#include <term.h>
|
||||
|
||||
#ifdef USE_SCCS_IDS
|
||||
static const char SCCSid[] = "@(#) mytinfo tcapconv.c 3.2 92/02/01 public domain, By Ross Ridge";
|
||||
#endif
|
||||
|
||||
extern char **_sstrcodes[], **_sstrnames[];
|
||||
|
||||
static char *C_CR = "\r";
|
||||
static char *C_LF = "\n";
|
||||
static char *C_BS = "\b";
|
||||
/* static char *C_FF = "\f"; */
|
||||
static char *C_HT = "\t";
|
||||
/* static char *C_VT = "\013"; */
|
||||
/* static char *C_NL = "\r\n"; */
|
||||
|
||||
#define DEF(s) ((s) != (char *) -1 && (s) != NULL)
|
||||
#define NOTSET(s) ((s) == (char *) -1)
|
||||
|
||||
/*
|
||||
* This routine fills in caps that either had defaults under termcap or
|
||||
* can be manufactured from obsolete termcap capabilities.
|
||||
*/
|
||||
|
||||
void
|
||||
_tcapdefault() {
|
||||
char buf[MAX_LINE * 2 + 2];
|
||||
int set_scroll_forward_to_lf;
|
||||
|
||||
if (NOTSET(carriage_return)) {
|
||||
if (carriage_return_delay > 0) {
|
||||
sprintf(buf, "%s$<%d>", C_CR, carriage_return_delay);
|
||||
carriage_return = _addstr(buf);
|
||||
} else
|
||||
carriage_return = _addstr(C_CR);
|
||||
}
|
||||
if (NOTSET(cursor_left)) {
|
||||
if (backspace_delay > 0) {
|
||||
sprintf(buf, "%s$<%d>", C_BS, backspace_delay);
|
||||
cursor_left = _addstr(buf);
|
||||
} else if (backspaces_with_bs == 1)
|
||||
cursor_left = _addstr(C_BS);
|
||||
else if (DEF(backspace_if_not_bs))
|
||||
cursor_left = _addstr(backspace_if_not_bs);
|
||||
}
|
||||
/* vi doesn't use "do", but it does seems to use nl (or '\n') instead */
|
||||
if (NOTSET(cursor_down)) {
|
||||
if (DEF(linefeed_if_not_lf))
|
||||
cursor_down = _addstr(linefeed_if_not_lf);
|
||||
else if (linefeed_is_newline != 1) {
|
||||
if (new_line_delay > 0) {
|
||||
sprintf(buf, "%s$<%d>", C_LF, new_line_delay);
|
||||
cursor_down = _addstr(buf);
|
||||
} else
|
||||
cursor_down = _addstr(C_LF);
|
||||
}
|
||||
}
|
||||
set_scroll_forward_to_lf = 0;
|
||||
if (NOTSET(scroll_forward) && crt_without_scrolling != 1) {
|
||||
set_scroll_forward_to_lf = 1;
|
||||
if (DEF(linefeed_if_not_lf))
|
||||
scroll_forward = _addstr(linefeed_if_not_lf);
|
||||
else if (linefeed_is_newline != 1) {
|
||||
if (new_line_delay > 0) {
|
||||
sprintf(buf, "%s$<%d>", C_LF, new_line_delay);
|
||||
scroll_forward = _addstr(buf);
|
||||
} else
|
||||
scroll_forward = _addstr(C_LF);
|
||||
}
|
||||
}
|
||||
if (NOTSET(newline)) {
|
||||
if (linefeed_is_newline == 1) {
|
||||
if (new_line_delay > 0) {
|
||||
sprintf(buf, "%s$<%d>", C_LF, new_line_delay);
|
||||
newline = _addstr(buf);
|
||||
} else
|
||||
newline = _addstr(C_LF);
|
||||
} else if (DEF(carriage_return) && carriage_return_delay <= 0) {
|
||||
if (set_scroll_forward_to_lf) {
|
||||
strncpy(buf, carriage_return, MAX_LINE-2);
|
||||
buf[MAX_LINE-1] = '\0';
|
||||
strncat(buf, scroll_forward, MAX_LINE-strlen(buf)-1);
|
||||
} else if (DEF(linefeed_if_not_lf)) {
|
||||
strncpy(buf, carriage_return, MAX_LINE-2);
|
||||
buf[MAX_LINE-1] = '\0';
|
||||
strncat(buf, linefeed_if_not_lf, MAX_LINE-strlen(buf)-1);
|
||||
}
|
||||
else if (new_line_delay > 0)
|
||||
sprintf(buf, "%s%s$<%d>", carriage_return, C_LF, new_line_delay);
|
||||
else {
|
||||
strncpy(buf, carriage_return, MAX_LINE-2);
|
||||
buf[MAX_LINE-1] = '\0';
|
||||
strncat(buf, C_LF, MAX_LINE-strlen(buf)-1);
|
||||
}
|
||||
buf[MAX_LINE-1] = '\0';
|
||||
newline = _addstr(buf);
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
* We wait until know to decide if we've got a working cr because even
|
||||
* one that doesn't work can be used for newline. Unfortunately the
|
||||
* space allocated for it is wasted.
|
||||
*/
|
||||
if (return_does_clr_eol == 1 || no_correctly_working_cr == 1)
|
||||
carriage_return = NULL;
|
||||
|
||||
/*
|
||||
* supposedly most termcap entries have ta now and '\t' is no longer a
|
||||
* default, but it doesn't seem to be true...
|
||||
*/
|
||||
if (NOTSET(tab)) {
|
||||
if (horizontal_tab_delay > 0) {
|
||||
sprintf(buf, "%s$<%d>", C_HT, horizontal_tab_delay);
|
||||
tab = _addstr(buf);
|
||||
} else
|
||||
tab = _addstr(C_HT);
|
||||
}
|
||||
#if 0
|
||||
/* probably not needed and might confuse some programmes */
|
||||
if (NOTSET(form_feed)) {
|
||||
if (form_feed_delay > 0) {
|
||||
sprintf(buf, "%s$<%d>", C_FF, form_feed_delay);
|
||||
form_feed = _addstr(buf);
|
||||
} else
|
||||
form_feed = _addstr(C_FF);
|
||||
}
|
||||
#endif
|
||||
if (init_tabs == -1 && has_hardware_tabs == 1)
|
||||
init_tabs = 8;
|
||||
|
||||
if (NOTSET(key_backspace))
|
||||
key_backspace = _addstr(C_BS);
|
||||
if (NOTSET(key_left))
|
||||
key_left = _addstr(C_BS);
|
||||
if (NOTSET(key_down))
|
||||
key_down = _addstr(C_LF);
|
||||
}
|
||||
|
||||
void
|
||||
_tcapconv() {
|
||||
char buf[MAX_LINE+1];
|
||||
|
||||
if (GNU_tab_width > 0 && init_tabs == -1)
|
||||
init_tabs = GNU_tab_width;
|
||||
|
||||
if (GNU_has_meta_key == 1 && has_meta_key == -1)
|
||||
has_meta_key = 1;
|
||||
|
||||
/*
|
||||
* this is some what a kludge, but should work unless someone breaks
|
||||
* conventions.
|
||||
*/
|
||||
if (DEF(other_non_function_keys)) {
|
||||
register char *s;
|
||||
static char *o;
|
||||
static char name[MAX_NAME] = "k";
|
||||
char *str;
|
||||
int ind;
|
||||
|
||||
s = strcpy(buf, other_non_function_keys);
|
||||
while(*s != '\0') {
|
||||
o = s;
|
||||
while(*s != ',' && *s != '\0')
|
||||
s++;
|
||||
if (*s != '\0')
|
||||
*s++ = '\0';
|
||||
ind = _findstrcode(o);
|
||||
if (ind == -1)
|
||||
continue;
|
||||
str = _term_buf.strs[ind];
|
||||
if (!DEF(str))
|
||||
continue;
|
||||
strncpy(name + 1, strnames[ind], MAX_NAME - 2);
|
||||
ind = _findstrname(name);
|
||||
if (ind == -1)
|
||||
continue;
|
||||
if (!NOTSET(_term_buf.strs[ind]))
|
||||
continue;
|
||||
_term_buf.strs[ind] = _addstr(str);
|
||||
}
|
||||
}
|
||||
}
|
36
lib/libmytinfo/tcapvars.c
Normal file
36
lib/libmytinfo/tcapvars.c
Normal file
@ -0,0 +1,36 @@
|
||||
/*
|
||||
* tcapvars.c
|
||||
*
|
||||
* By Ross Ridge
|
||||
* Public Domain
|
||||
* 92/02/01 07:30:21
|
||||
*
|
||||
*/
|
||||
|
||||
#include "defs.h"
|
||||
#include <term.h>
|
||||
|
||||
#ifdef USE_SCCS_IDS
|
||||
static const char SCCSid[] = "@(#) mytinfo tcapvars.c 3.2 92/02/01 public domain, By Ross Ridge";
|
||||
#endif
|
||||
|
||||
char PC;
|
||||
short ospeed;
|
||||
char *UP, *BC;
|
||||
|
||||
void
|
||||
_figure_termcap() {
|
||||
#if defined(USE_SGTTY) || defined(USE_TERMIO) || defined(USE_TERMIOS)
|
||||
#ifdef USE_TERMIOS
|
||||
extern speed_t _baud_tbl[];
|
||||
#else
|
||||
#ifdef USE_SMALLMEM
|
||||
extern unsigned short _baud_tbl[];
|
||||
#else
|
||||
extern long _baud_tbl[];
|
||||
#endif
|
||||
#endif
|
||||
cur_term->padch = PC;
|
||||
cur_term->baudrate = _baud_tbl[ospeed];
|
||||
#endif
|
||||
}
|
180
lib/libmytinfo/tconv.1
Normal file
180
lib/libmytinfo/tconv.1
Normal file
@ -0,0 +1,180 @@
|
||||
.\" @(#) mytinfo tconv.1 3.2 92/02/01 public domain, By Ross Ridge
|
||||
.TH TCONV 1 "92/02/01" "mytinfo"
|
||||
.SH NAME
|
||||
tconv \- convert between termcap, terminfo source and terminfo binary
|
||||
.SH SYNOPSIS
|
||||
.B tconv
|
||||
[\fB\-b\fR]
|
||||
[\fB\-c\fR\ [\fB\-OUGd\fR]]
|
||||
[\fB\-i\fR]
|
||||
[\fB\-B\fR\ [\fB\-D\fR\ dir]]
|
||||
[\fB\-I\fR]
|
||||
[\fB\-k\fR]
|
||||
[\fB\-V\fR]
|
||||
[\fB\-t\fR\ term]
|
||||
[file]
|
||||
.br
|
||||
.B tic
|
||||
[file]
|
||||
.br
|
||||
.B captoinfo
|
||||
[\fB\-t\fR\ term]
|
||||
[\fB\-OUGdk\fR]]
|
||||
[file]
|
||||
.SH DESCRIPTION
|
||||
.I tconv
|
||||
converts between the three terminal descriptions,
|
||||
termcap, terminfo source, and terminfo binary,
|
||||
that the
|
||||
.I tinfo
|
||||
library uses.
|
||||
It performs the same functions of
|
||||
.IR captoinfo (1M)
|
||||
and
|
||||
.IR tic (1M)
|
||||
of System V.
|
||||
It also can be used to generate a terminfo source listing from a terminfo
|
||||
binary, one of the functions of System V's
|
||||
.IR infocmp (1M).
|
||||
.SS Translation Options
|
||||
.PD 0
|
||||
.TP
|
||||
.B \-c
|
||||
convert from termcap
|
||||
.TP
|
||||
.B \-i
|
||||
convert from terminfo source
|
||||
.TP
|
||||
.B \-b
|
||||
convert from terminfo binary
|
||||
.TP
|
||||
.B \-B
|
||||
convert to terminfo binary
|
||||
.TP
|
||||
.B \-I
|
||||
convert to terminfo source
|
||||
.PD
|
||||
.PP
|
||||
If a file is specified, one of
|
||||
.B \-c
|
||||
or
|
||||
.B \-i
|
||||
must specified and the whole file while be translated.
|
||||
If no file is specified then the input options will only restrict looking
|
||||
for the terminal to be translated in places likely have descriptions
|
||||
of the desired type
|
||||
(ie. with the
|
||||
.B -c
|
||||
option in the
|
||||
.B TERMCAP
|
||||
environment variable, and in
|
||||
.IR /etc/termcap ,
|
||||
with the
|
||||
.B -i
|
||||
option in the
|
||||
.B TERMINFO
|
||||
environment variable, and in
|
||||
.IR /usr/lib/terminfo ),
|
||||
otherwise
|
||||
.I tconv
|
||||
will look in all available databases.
|
||||
If neither
|
||||
.B \-I
|
||||
or
|
||||
.B \-B
|
||||
are given the
|
||||
.B \-I
|
||||
option will be assumed.
|
||||
If the
|
||||
.B \-B
|
||||
option is used, the compiled output will be put in the the
|
||||
terminfo database, otherwise standard output is used.
|
||||
.PP
|
||||
You cannot translate from terminfo binary to terminfo binary.
|
||||
Translating from terminfo source to terminfo source is possible,
|
||||
but not of much use in most cases, as
|
||||
.B use=
|
||||
fields will be followed and incorporated into the output terminal
|
||||
description.
|
||||
.PP
|
||||
.I tconv
|
||||
should be able translate all standard termcap parameterized strings
|
||||
terminfo format, but complex strings using GNU's %a code may be
|
||||
too hard to translate.
|
||||
If
|
||||
.I tconv
|
||||
thinks a termcap string is already in terminfo format (if a %p
|
||||
code appears in the string), it won't try to translate it.
|
||||
String capabilities that don't take parameters won't be translated.
|
||||
.PP
|
||||
.B
|
||||
.SS Termcap options
|
||||
The following options are available when translating termcap entries
|
||||
(\fB\-c\fR options is used).
|
||||
.PP
|
||||
.PD 0
|
||||
.TP
|
||||
.B \-d
|
||||
don't supply any defaults for missing capabilities
|
||||
.TP
|
||||
.B \-O
|
||||
include obsolete termcap capabilities
|
||||
.TP
|
||||
.B \-G
|
||||
include GNU capabilities
|
||||
.TP
|
||||
.B \-U
|
||||
include UW capabilities
|
||||
.PD
|
||||
.SS Other Options
|
||||
.PD 0
|
||||
.TP
|
||||
.B \-k
|
||||
keep comments when translating a file
|
||||
.TP
|
||||
.B \-V
|
||||
print version information and exit
|
||||
.TP
|
||||
.BI \-D " " dir
|
||||
directory to put terminfo binaries in
|
||||
.TP
|
||||
.BI \-t " " term
|
||||
terminal name to translate
|
||||
.PD
|
||||
.PP
|
||||
If no terminal specified with the
|
||||
.B \-t
|
||||
option, then the terminal name to to translate will be taken from the
|
||||
environment variable
|
||||
.BR TERM .
|
||||
.SH FILES
|
||||
.PD 0
|
||||
.TP 2i
|
||||
.B /usr/lib/terminfo
|
||||
The default location to get and put terminfo binaries.
|
||||
.TP
|
||||
.B /usr/lib/terminfo/terminfo.src
|
||||
The default filename of the terminfo source file.
|
||||
.TP
|
||||
.B /etc/termcap
|
||||
The default filename of the termcap database.
|
||||
.PD
|
||||
.SH "SEE ALSO"
|
||||
captoinfo(1M),
|
||||
tic(1M),
|
||||
infocmp(1M),
|
||||
termcap(3),
|
||||
curses(3X),
|
||||
term(4),
|
||||
termcap(4),
|
||||
terminfo(4).
|
||||
.SH DIAGNOSTICS
|
||||
The line number of a warning message when translating a file
|
||||
may refer to the last line of an entry instead of the line in the entry
|
||||
that generated the warning.
|
||||
.SH BUGS
|
||||
More warning messages could be generated.
|
||||
.I tconv
|
||||
can't translate to termcap. Binaries generated will have cancelled
|
||||
capabilities marked as cancelled, which is incompatible with
|
||||
System V Release 2.0 terminfo.
|
1384
lib/libmytinfo/tconv.c
Normal file
1384
lib/libmytinfo/tconv.c
Normal file
File diff suppressed because it is too large
Load Diff
131
lib/libmytinfo/term.tail
Normal file
131
lib/libmytinfo/term.tail
Normal file
@ -0,0 +1,131 @@
|
||||
/*
|
||||
* 92/02/01 07:30:28
|
||||
* @(#) mytinfo term.tail 3.2 92/02/01 public domain, By Ross Ridge
|
||||
*
|
||||
*/
|
||||
|
||||
#if defined(_USE_TERMIO) || defined(_USE_TERMIOS)
|
||||
#ifndef ICANON
|
||||
#ifdef _USE_TERMIO
|
||||
#include <termio.h>
|
||||
#else
|
||||
#include <termios.h>
|
||||
#endif
|
||||
#endif
|
||||
#if defined(_USE_WINSZ) && defined(__FreeBSD__)
|
||||
#include <sys/ioctl.h>
|
||||
#endif
|
||||
#if defined(_USE_WINSZ) && defined(xenix)
|
||||
#include <sys/stream.h>
|
||||
#include <sys/ptem.h>
|
||||
#endif
|
||||
#endif
|
||||
|
||||
#ifdef _USE_SGTTY
|
||||
#ifndef CBREAK
|
||||
#include <sgtty.h>
|
||||
#endif
|
||||
#endif
|
||||
|
||||
typedef struct _terminal {
|
||||
int fd;
|
||||
#ifdef _USE_SMALLMEM
|
||||
#ifdef _USE_TERMIOS
|
||||
speed_t baudrate;
|
||||
#else
|
||||
unsigned short baudrate;
|
||||
#endif
|
||||
unsigned pad:1, xon:1, termcap:1;
|
||||
#else
|
||||
int pad;
|
||||
int xon;
|
||||
int termcap;
|
||||
#ifdef _USE_TERMIOS
|
||||
speed_t baudrate;
|
||||
#else
|
||||
long baudrate;
|
||||
#endif
|
||||
#endif
|
||||
char padch;
|
||||
short true_lines, true_columns;
|
||||
struct strbuf {
|
||||
struct strbuf *next;
|
||||
#ifdef _USE_SMALLMEM
|
||||
short len;
|
||||
#else
|
||||
int len;
|
||||
#endif
|
||||
char buf[_MAX_CHUNK];
|
||||
} *strbuf;
|
||||
char *name, *name_long, *name_all;
|
||||
#ifdef _USE_SGTTY
|
||||
struct sgtty_str {
|
||||
struct sgttyb v6;
|
||||
#ifdef TIOCGETC
|
||||
struct tchars v7;
|
||||
#endif
|
||||
#ifdef TIOCLGET
|
||||
int bsd;
|
||||
#endif
|
||||
#ifdef TIOCGLTC
|
||||
struct ltchars bsd_new;
|
||||
#endif
|
||||
} prog_mode, shell_mode;
|
||||
#else /* _USE_SGTTY */
|
||||
#ifdef _USE_TERMIOS
|
||||
struct termios prog_mode, shell_mode;
|
||||
#else
|
||||
#ifdef _USE_TERMIO
|
||||
struct termio prog_mode, shell_mode;
|
||||
#endif
|
||||
#endif
|
||||
#endif /* else _USE_SGTTY */
|
||||
#ifdef _USE_WINSZ
|
||||
#ifdef TIOCGWINSZ
|
||||
struct winsize prog_winsz, shell_winsz;
|
||||
#endif
|
||||
#endif
|
||||
char bools[NUM_OF_BOOLS];
|
||||
short nums[NUM_OF_NUMS];
|
||||
char *strs[NUM_OF_STRS];
|
||||
} TERMINAL;
|
||||
|
||||
#ifndef _CUR_TERM
|
||||
#ifdef SINGLE
|
||||
#define _CUR_TERM _term_buf
|
||||
#else
|
||||
#define _CUR_TERM (*cur_term)
|
||||
#endif
|
||||
#endif
|
||||
|
||||
extern TERMINAL *cur_term;
|
||||
extern TERMINAL _term_buf;
|
||||
|
||||
#ifndef __P
|
||||
#if defined(_USE_PROTOTYPES) && (defined(__STDC__) || defined(__cplusplus))
|
||||
#define __P(protos) protos /* full-blown ANSI C */
|
||||
#else
|
||||
#define __P(protos) () /* traditional C preprocessor */
|
||||
#endif
|
||||
#endif
|
||||
|
||||
extern char *tparm __P((char *, ...));
|
||||
extern int setupterm __P((char *, int, int *)), set_curterm __P((TERMINAL *));
|
||||
extern int del_curterm __P((TERMINAL *)), tputs __P((char *, int, int (*)(char)));
|
||||
extern int putp __P((char *));
|
||||
extern int tigetflag __P((char *)), tigetnum __P((char *));
|
||||
extern char *tigetstr __P((char *));
|
||||
extern int def_prog_mode __P((void)), def_shell_mode __P((void));
|
||||
extern int reset_prog_mode __P((void)), reset_shell_mode __P((void));
|
||||
|
||||
extern char *boolnames[], *boolcodes[], *boolfnames[];
|
||||
extern char *numnames[], *numcodes[], *numfnames[];
|
||||
extern char *strnames[], *strcodes[], *strfnames[];
|
||||
|
||||
#ifndef OK
|
||||
#undef ERR
|
||||
#define OK (0)
|
||||
#define ERR (-1)
|
||||
#endif
|
||||
|
||||
#endif /* _TERM_H_ */
|
165
lib/libmytinfo/termcap.c
Normal file
165
lib/libmytinfo/termcap.c
Normal file
@ -0,0 +1,165 @@
|
||||
/*
|
||||
* termcap.c
|
||||
*
|
||||
* By Ross Ridge
|
||||
* Public Domain
|
||||
* 92/06/01 07:43:08
|
||||
*
|
||||
* termcap compatibility functions
|
||||
*
|
||||
*/
|
||||
|
||||
#include "defs.h"
|
||||
#include <term.h>
|
||||
#ifdef __FreeBSD__
|
||||
#include <unistd.h>
|
||||
#endif
|
||||
|
||||
#ifdef USE_SCCS_IDS
|
||||
static const char SCCSid[] = "@(#) mytinfo termcap.c 3.3 92/06/01 public domain, By Ross Ridge";
|
||||
#endif
|
||||
|
||||
extern char _mytinfo_version[];
|
||||
/* not static */
|
||||
char *force = _mytinfo_version;
|
||||
|
||||
int
|
||||
tgetent(buf, term)
|
||||
char *term, *buf; {
|
||||
char *s;
|
||||
struct term_path *path;
|
||||
int r = -1;
|
||||
int fd;
|
||||
|
||||
if (term == NULL)
|
||||
term = getenv("TERM");
|
||||
if (term == NULL)
|
||||
return 0;
|
||||
|
||||
path = _buildpath(
|
||||
#ifdef USE_TERMINFO
|
||||
"$MYTERMINFO", 2,
|
||||
"$TERMINFO", 2,
|
||||
#ifdef TERMINFODIR
|
||||
TERMINFODIR, 0,
|
||||
#endif
|
||||
#ifdef TERMINFOSRC
|
||||
TERMINFOSRC, 0,
|
||||
#endif
|
||||
#endif
|
||||
#ifdef USE_TERMCAP
|
||||
"$TERMCAP", 1,
|
||||
#ifdef TERMCAPFILE
|
||||
TERMCAPFILE, 0,
|
||||
#endif
|
||||
#endif
|
||||
NULL, -1);
|
||||
|
||||
if (path == NULL)
|
||||
return -1;
|
||||
|
||||
#if 1
|
||||
{
|
||||
char buf1[MAX_BUF];
|
||||
r = _fillterm(term, path, buf1);
|
||||
}
|
||||
#else
|
||||
r = _fillterm(term, path, buf);
|
||||
#endif
|
||||
|
||||
_delpath(path);
|
||||
|
||||
switch(r) {
|
||||
case -3:
|
||||
case -2:
|
||||
case -1:
|
||||
return -1;
|
||||
case 0:
|
||||
return 0;
|
||||
case 1:
|
||||
case 2:
|
||||
case 3:
|
||||
if (isatty(1))
|
||||
fd = 1;
|
||||
else if (isatty(2))
|
||||
fd = 2;
|
||||
else if (isatty(3)) /* V10 /dev/tty ?? */
|
||||
fd = 3;
|
||||
else if (isatty(0))
|
||||
fd = 0;
|
||||
else
|
||||
fd = 1;
|
||||
|
||||
cur_term->fd = fd;
|
||||
_term_buf.fd = fd;
|
||||
|
||||
if (_init_tty() == ERR)
|
||||
return 0;
|
||||
if ((s = getenv("LINES")) != NULL && atoi(s) > 0)
|
||||
lines = atoi(s);
|
||||
if ((s = getenv("COLUMNS")) != NULL && atoi(s) > 0)
|
||||
columns = atoi(s);
|
||||
cur_term->termcap = 1;
|
||||
return 1;
|
||||
default:
|
||||
return -1;
|
||||
}
|
||||
}
|
||||
|
||||
static char cap2[3];
|
||||
|
||||
int
|
||||
tgetnum(cap)
|
||||
char *cap; {
|
||||
int ind;
|
||||
|
||||
cap2[0] = cap[0];
|
||||
cap2[1] = cap[1];
|
||||
cap2[2] = '\0';
|
||||
|
||||
ind = _findnumcode(cap2);
|
||||
if (ind == -1)
|
||||
return -1;
|
||||
return cur_term->nums[ind];
|
||||
}
|
||||
|
||||
int
|
||||
tgetflag(cap)
|
||||
char *cap; {
|
||||
int ind;
|
||||
|
||||
cap2[0] = cap[0];
|
||||
cap2[1] = cap[1];
|
||||
cap2[2] = '\0';
|
||||
|
||||
ind = _findboolcode(cap2);
|
||||
if (ind == -1)
|
||||
return 0;
|
||||
return cur_term->bools[ind];
|
||||
}
|
||||
|
||||
char *
|
||||
tgetstr(cap, area)
|
||||
char *cap;
|
||||
char **area; {
|
||||
register char *sp, *dp;
|
||||
int ind;
|
||||
|
||||
cap2[0] = cap[0];
|
||||
cap2[1] = cap[1];
|
||||
cap2[2] = '\0';
|
||||
|
||||
ind = _findstrcode(cap2);
|
||||
if (ind == -1)
|
||||
return NULL;
|
||||
sp = cur_term->strs[ind];
|
||||
if (area == NULL || sp == NULL)
|
||||
return sp;
|
||||
dp = *area;
|
||||
while (*sp != '\0')
|
||||
*dp++ = *sp++;
|
||||
*dp++ = '\0';
|
||||
sp = *area;
|
||||
*area = dp;
|
||||
return sp;
|
||||
}
|
132
lib/libmytinfo/terminfo.c
Normal file
132
lib/libmytinfo/terminfo.c
Normal file
@ -0,0 +1,132 @@
|
||||
/*
|
||||
* terminfo.c
|
||||
*
|
||||
* By Ross Ridge
|
||||
* Public Domain
|
||||
* 92/02/01 07:30:30
|
||||
*
|
||||
* terminfo compatible libary functions
|
||||
*
|
||||
*/
|
||||
|
||||
#include "defs.h"
|
||||
#include <term.h>
|
||||
|
||||
#ifdef USE_SCCS_IDS
|
||||
static const char SCCSid[] = "@(#) mytinfo terminfo.c 3.2 92/02/01 public domain, By Ross Ridge";
|
||||
#endif
|
||||
|
||||
extern char _mytinfo_version[];
|
||||
/* not static */
|
||||
char *force = _mytinfo_version;
|
||||
|
||||
#ifdef USE_FAKE_STDIO
|
||||
|
||||
#ifdef __GNUC__
|
||||
__inline__
|
||||
#endif
|
||||
static int
|
||||
printerr(msg)
|
||||
char *msg; {
|
||||
return write(2, msg, strlen(msg));
|
||||
}
|
||||
|
||||
#define RETERR(e, msg) { (err == NULL ? (printerr(msg), exit(1), 0) \
|
||||
: (*err = e)); return ERR; }
|
||||
|
||||
#else
|
||||
|
||||
#define RETERR(e, msg) { (err == NULL ? (fprintf(stderr, msg), exit(1), 0) \
|
||||
: (*err = e)); return ERR; }
|
||||
|
||||
#endif
|
||||
|
||||
int
|
||||
setupterm(term, fd, err)
|
||||
char *term;
|
||||
int fd;
|
||||
int *err; {
|
||||
struct term_path *path;
|
||||
char *s;
|
||||
int r = -1;
|
||||
char buf[MAX_BUF];
|
||||
|
||||
|
||||
if (term == NULL)
|
||||
term = getenv("TERM");
|
||||
if (term == NULL)
|
||||
RETERR(0, "TERM not set\n")
|
||||
|
||||
path = _buildpath(
|
||||
#ifdef USE_TERMINFO
|
||||
"$MYTERMINFO", 2,
|
||||
"$TERMINFO", 2,
|
||||
#ifdef TERMINFODIR
|
||||
TERMINFODIR, 0,
|
||||
#endif
|
||||
#ifdef TERMINFOSRC
|
||||
TERMINFOSRC, 0,
|
||||
#endif
|
||||
#endif
|
||||
#ifdef USE_TERMCAP
|
||||
"$TERMCAP", 1,
|
||||
#ifdef TERMCAPFILE
|
||||
TERMCAPFILE, 0,
|
||||
#endif
|
||||
#endif
|
||||
NULL, -1);
|
||||
|
||||
if (path == NULL)
|
||||
RETERR(0, "malloc error\n");
|
||||
|
||||
r = _fillterm(term, path, buf);
|
||||
|
||||
_delpath(path);
|
||||
|
||||
switch(r) {
|
||||
case -3:
|
||||
RETERR(0, "malloc error\n");
|
||||
case -2:
|
||||
RETERR(-1, "bad format\n");
|
||||
case -1:
|
||||
RETERR(-1, "database not found\n");
|
||||
case 0:
|
||||
RETERR(0, "terminal not found\n");
|
||||
case 1:
|
||||
case 2:
|
||||
case 3:
|
||||
cur_term->fd = fd;
|
||||
_term_buf.fd = fd;
|
||||
if (_init_tty() == ERR)
|
||||
RETERR(0, "problem initializing tty\n");
|
||||
if ((s = getenv("LINES")) != NULL && atoi(s) > 0)
|
||||
lines = atoi(s);
|
||||
if ((s = getenv("COLUMNS")) != NULL && atoi(s) > 0)
|
||||
columns = atoi(s);
|
||||
if (err != NULL)
|
||||
*err = 1;
|
||||
return OK;
|
||||
default:
|
||||
RETERR(0, "oops...\n");
|
||||
}
|
||||
}
|
||||
|
||||
int
|
||||
set_curterm(p)
|
||||
TERMINAL *p; {
|
||||
cur_term = p;
|
||||
if (_init_tty() == ERR)
|
||||
return ERR;
|
||||
if (_check_tty() == ERR)
|
||||
return ERR;
|
||||
return OK;
|
||||
}
|
||||
|
||||
int
|
||||
del_curterm(p)
|
||||
TERMINAL *p; {
|
||||
_del_strs(p);
|
||||
free((anyptr) p);
|
||||
|
||||
return OK;
|
||||
}
|
148
lib/libmytinfo/tgoto.c
Normal file
148
lib/libmytinfo/tgoto.c
Normal file
@ -0,0 +1,148 @@
|
||||
/*
|
||||
* tgoto.c
|
||||
*
|
||||
* By Ross Ridge
|
||||
* Public Domain
|
||||
* 92/02/01 07:30:33
|
||||
*
|
||||
* A few kludged attempts to worry outputing ^D's and NL's...
|
||||
* My advice is to get a decent terminal.
|
||||
*
|
||||
*/
|
||||
|
||||
#include "defs.h"
|
||||
#include <term.h>
|
||||
|
||||
#ifdef USE_SCCS_IDS
|
||||
static const char SCCSid[] = "@(#) mytinfo tgoto.c 3.2 92/02/01 public domain, By Ross Ridge";
|
||||
#endif
|
||||
|
||||
#ifdef USE_LITOUT_KLUDGE
|
||||
|
||||
/*
|
||||
* This kludge works by telling tputs to switch the tty driver to
|
||||
* "literal output" when printing the string so we don't have worry
|
||||
* about newlines and EOTs. The problem is that ioctls used to
|
||||
* switch modes might flush buffers and cause other problems.
|
||||
*/
|
||||
|
||||
|
||||
char *
|
||||
tgoto(str, x, y)
|
||||
char *str;
|
||||
int x,y; {
|
||||
register char *sp;
|
||||
|
||||
static char buf[MAX_LINE] = {'\\', '@'};
|
||||
|
||||
sp = str = tparm(str, y, x);
|
||||
|
||||
while (*sp != '\0') {
|
||||
if (*sp == '\004' || *sp == '\n') {
|
||||
strncpy(buf + 2, str, MAX_LINE - 2);
|
||||
buf[MAX_LINE - 2] = '\0';
|
||||
return buf;
|
||||
}
|
||||
sp++;
|
||||
}
|
||||
return sp;
|
||||
}
|
||||
#else
|
||||
|
||||
#ifdef USE_UPBC_KLUDGE
|
||||
|
||||
#ifdef USE_EXTERN_UPBC
|
||||
extern char *BC, *UP;
|
||||
#else
|
||||
#define BC cursor_left
|
||||
#define UP cursor_right
|
||||
#endif
|
||||
|
||||
#ifdef __GNUC__
|
||||
__inline__
|
||||
#endif
|
||||
static int
|
||||
checkit(s)
|
||||
register char *s; {
|
||||
while(*s != '\0') {
|
||||
if (*s == '\004' || *s == '\n')
|
||||
return 1;
|
||||
s++;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
/*
|
||||
* Major kludge, basically we just change the parmeters until we get
|
||||
* a string that doesn't contain a newline or EOT.
|
||||
*/
|
||||
|
||||
char *
|
||||
tgoto(str, x, y)
|
||||
char *str;
|
||||
int x,y; {
|
||||
static char buf[MAX_LINE];
|
||||
register char *orig, *s;
|
||||
int l;
|
||||
|
||||
orig = tparm(str, y, x);
|
||||
|
||||
if (!checkit(orig))
|
||||
return orig;
|
||||
|
||||
s = tparm(str, y + 1, x);
|
||||
|
||||
if (!checkit(s)) {
|
||||
if (BC == NULL)
|
||||
return s;
|
||||
l = strlen(s);
|
||||
strncpy(buf, s, MAX_LINE - 1);
|
||||
if (l < MAX_LINE - 1)
|
||||
strncpy(buf + l, BC, MAX_LINE - 1 - l);
|
||||
return s;
|
||||
}
|
||||
|
||||
s = tparm(str, y, x + 1);
|
||||
|
||||
if (!checkit(s)) {
|
||||
if (UP == NULL)
|
||||
return s;
|
||||
l = strlen(s);
|
||||
strncpy(buf, s, MAX_LINE - 1);
|
||||
if (l < MAX_LINE - 1)
|
||||
strncpy(buf + l, UP, MAX_LINE - 1 - l);
|
||||
return s;
|
||||
}
|
||||
|
||||
s = tparm(str, y + 1, x + 1);
|
||||
|
||||
if (!checkit(s)) {
|
||||
if (UP == NULL || BC == NULL)
|
||||
return s;
|
||||
l = strlen(s);
|
||||
strncpy(buf, s, MAX_LINE - 1);
|
||||
if (l < MAX_LINE - 1)
|
||||
strncpy(buf + l, UP, MAX_LINE - 1 - l);
|
||||
l += strlen(UP);
|
||||
if (l < MAX_LINE - 1)
|
||||
strncpy(buf + l, BC, MAX_LINE - 1 - l);
|
||||
return s;
|
||||
}
|
||||
|
||||
return orig;
|
||||
}
|
||||
|
||||
#else
|
||||
|
||||
/* the simple tgoto, don't worry about any of this newline/EOT crap */
|
||||
|
||||
char *
|
||||
tgoto(str, x, y)
|
||||
char *str;
|
||||
int x,y; {
|
||||
return tparm(str, y, x);
|
||||
}
|
||||
|
||||
#endif
|
||||
|
||||
#endif
|
51
lib/libmytinfo/tiget.c
Normal file
51
lib/libmytinfo/tiget.c
Normal file
@ -0,0 +1,51 @@
|
||||
/*
|
||||
* tiget.c
|
||||
*
|
||||
* By Ross Ridge
|
||||
* Public Domain
|
||||
* 92/02/01 07:30:34
|
||||
*
|
||||
* The various tiget terminfo functions.
|
||||
*/
|
||||
|
||||
#include "defs.h"
|
||||
#include <term.h>
|
||||
|
||||
#ifdef USE_SCCS_IDS
|
||||
static const char SCCSid[] = "@(#) mytinfo tiget.c 3.2 92/02/01 public domain, By Ross Ridge";
|
||||
#endif
|
||||
|
||||
int
|
||||
tigetnum(cap)
|
||||
char *cap; {
|
||||
int ind;
|
||||
|
||||
ind = _findnumname(cap);
|
||||
if (ind == -1)
|
||||
return -2;
|
||||
return cur_term->nums[ind];
|
||||
}
|
||||
|
||||
int
|
||||
tigetflag(cap)
|
||||
char *cap; {
|
||||
int ind;
|
||||
|
||||
ind = _findboolname(cap);
|
||||
if (ind == -1)
|
||||
return -1;
|
||||
return cur_term->bools[ind];
|
||||
}
|
||||
|
||||
char *
|
||||
tigetstr(cap)
|
||||
char *cap; {
|
||||
int ind;
|
||||
|
||||
ind = _findstrname(cap);
|
||||
if (ind == -1)
|
||||
return (char *) -1;
|
||||
return cur_term->strs[ind];
|
||||
}
|
||||
|
||||
|
37
lib/libmytinfo/tmatch.c
Normal file
37
lib/libmytinfo/tmatch.c
Normal file
@ -0,0 +1,37 @@
|
||||
/*
|
||||
* tmatch.c
|
||||
*
|
||||
* By Ross Ridge
|
||||
* Public Domain
|
||||
* 92/02/01 07:30:35
|
||||
*
|
||||
* See if a terminal name matches a list of terminal names from a
|
||||
* terminal description
|
||||
*
|
||||
*/
|
||||
|
||||
#include "defs.h"
|
||||
|
||||
#ifdef USE_SCCS_IDS
|
||||
static const char SCCSid[] = "@(#) mytinfo tmatch.c 3.2 92/02/01 public domain, By Ross Ridge";
|
||||
#endif
|
||||
|
||||
int
|
||||
_tmatch(line, name)
|
||||
char *line, *name; {
|
||||
char term[MAX_LINE];
|
||||
char *sp, *dp;
|
||||
|
||||
sp = line;
|
||||
while (*sp != '\0') {
|
||||
dp = term;
|
||||
while (*sp != '\0' && *sp != '|')
|
||||
*dp++ = *sp++;
|
||||
*dp = '\0';
|
||||
if (strcmp(term, name) == 0)
|
||||
return 1;
|
||||
if (*sp == '|')
|
||||
sp++;
|
||||
}
|
||||
return 0;
|
||||
}
|
806
lib/libmytinfo/tparm.c
Normal file
806
lib/libmytinfo/tparm.c
Normal file
@ -0,0 +1,806 @@
|
||||
/*
|
||||
* tparm.c
|
||||
*
|
||||
* By Ross Ridge
|
||||
* Public Domain
|
||||
* 92/02/01 07:30:36
|
||||
*
|
||||
*/
|
||||
|
||||
#include "defs.h"
|
||||
#include <term.h>
|
||||
|
||||
#include <ctype.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
|
||||
|
||||
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
|
||||
|
||||
*/
|
||||
|
||||
#ifdef lint
|
||||
/* VARARGS1 */
|
||||
char *
|
||||
tparm(str)
|
||||
char *str; {
|
||||
#else /* lint */
|
||||
#ifdef USE_STDARG
|
||||
#ifdef USE_PROTOTYPES
|
||||
char *tparm(char *str, ...) {
|
||||
#else /* USE_PROTOTYPES */
|
||||
char *tparm(str)
|
||||
char *str; {
|
||||
#endif /* USE_PROTOTYPES */
|
||||
#else /* USE_STDARG */
|
||||
char *tparm(va_alist)
|
||||
va_dcl {
|
||||
char *str;
|
||||
#endif
|
||||
#endif
|
||||
static char OOPS[] = "OOPS";
|
||||
static char buf[MAX_LINE];
|
||||
register char *sp, *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];
|
||||
|
||||
#ifdef USE_STDARG
|
||||
va_start(tparm_args, str);
|
||||
#else
|
||||
va_start(tparm_args);
|
||||
str = (char *) va_arg(tparm_args, char *);
|
||||
#endif
|
||||
|
||||
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;
|
||||
}
|
||||
|
||||
#ifdef TEST
|
||||
|
||||
void
|
||||
putch(c)
|
||||
char c; {
|
||||
if (c < 0) {
|
||||
printf("\\%03o", c);
|
||||
} else if (c < 32) {
|
||||
printf("^%c", c + '@');
|
||||
} else if (c == 127) {
|
||||
printf("^?");
|
||||
} else {
|
||||
putchar(c);
|
||||
}
|
||||
}
|
||||
|
||||
char line[MAX_LINE];
|
||||
|
||||
int
|
||||
main(argc, argv)
|
||||
int argc;
|
||||
char **argv; {
|
||||
register char *sp;
|
||||
putchar('\n');
|
||||
|
||||
while(fgets(line, sizeof(line), stdin) != NULL) {
|
||||
line[strlen(line)-1] = '\0';
|
||||
sp = tparm(line, 1, -2, 30, 0, "bob was here");
|
||||
while(*sp)
|
||||
putch(*sp++);
|
||||
putchar('\n');
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
#endif
|
266
lib/libmytinfo/tputs.c
Normal file
266
lib/libmytinfo/tputs.c
Normal file
@ -0,0 +1,266 @@
|
||||
/*
|
||||
* tputs.c
|
||||
*
|
||||
* By Ross Ridge
|
||||
* Public Domain
|
||||
* 92/06/04 11:41:15
|
||||
*
|
||||
* Output a terminal capability string with any needed padding
|
||||
*
|
||||
*/
|
||||
|
||||
#include "defs.h"
|
||||
#include <term.h>
|
||||
|
||||
#include <ctype.h>
|
||||
|
||||
#ifdef USE_SCCS_IDS
|
||||
static const char SCCSid[] = "@(#) mytinfo tputs.c 3.3 92/06/04 public domain, By Ross Ridge";
|
||||
#endif
|
||||
|
||||
#ifdef TEST
|
||||
#define def_prog_mode() (OK)
|
||||
#define _norm_output() ((void)(0))
|
||||
#define _lit_output() (1)
|
||||
#endif
|
||||
|
||||
/*
|
||||
* BITSPERCHAR (as actually transmitted over a serial line) is usually 10
|
||||
* (not 8). 1 stop bit, 1 start bit, 7 data bits, and one parity bit.
|
||||
*/
|
||||
|
||||
#define BITSPERCHAR 10
|
||||
|
||||
#ifdef USE_FAKE_STDIO
|
||||
#undef putchar
|
||||
#endif
|
||||
|
||||
#ifdef USE_PROTOTYPES
|
||||
#define PUTCHAR(c) (outc == (int (*)(char)) 0 ? (putchar(c)):(*outc)(c))
|
||||
#else
|
||||
#define PUTCHAR(c) (outc == (int (*)()) 0 ? (putchar(c)):(*outc)(c))
|
||||
#endif
|
||||
|
||||
int
|
||||
tputs(sp, count, outc)
|
||||
register char *sp;
|
||||
int count;
|
||||
#ifdef USE_PROTOTYPES
|
||||
register int (*outc)(char);
|
||||
#else
|
||||
register int (*outc)();
|
||||
#endif
|
||||
{
|
||||
register int l;
|
||||
register long cnt;
|
||||
int must_pad, multiply_pad;
|
||||
int forced_lit = 0;
|
||||
|
||||
/* some programmes expect this behaviour from tputs */
|
||||
if (sp == NULL) {
|
||||
#ifdef DEBUG
|
||||
fprintf(stderr, "tputs: NULL\n");
|
||||
#endif
|
||||
return 0;
|
||||
}
|
||||
|
||||
if (cur_term->termcap) {
|
||||
_figure_termcap();
|
||||
}
|
||||
|
||||
while(*sp != '\0') {
|
||||
switch(*sp) {
|
||||
case '\\':
|
||||
switch(*++sp) {
|
||||
case 'n': PUTCHAR('\n'); sp++; break;
|
||||
case 'b': PUTCHAR('\b'); sp++; break;
|
||||
case 't': PUTCHAR('\t'); sp++; break;
|
||||
case 'r': PUTCHAR('\r'); sp++; break;
|
||||
case 'f': PUTCHAR('\f'); sp++; break;
|
||||
case 'l': PUTCHAR('\012'); sp++; break;
|
||||
case 's': PUTCHAR(' '); sp++; break;
|
||||
case 'e': case 'E': PUTCHAR('\033'); sp++; break;
|
||||
|
||||
case '^':
|
||||
case '\\':
|
||||
case ',':
|
||||
case ':':
|
||||
case '\'':
|
||||
case '$':
|
||||
PUTCHAR(*sp++);
|
||||
break;
|
||||
|
||||
case '0':
|
||||
if (*(sp + 1) < '0' || *(sp + 1) > '7') {
|
||||
PUTCHAR('\200'); /* I'd prefer \0 */
|
||||
sp++;
|
||||
break;
|
||||
}
|
||||
;/* FALLTHROUGH */
|
||||
case '1': case '2': case '3': case '4':
|
||||
case '5': case '6': case '7':
|
||||
l = *sp++ - '0';
|
||||
if (*sp >= '0' && *sp <= '7') {
|
||||
l = l * 8 + (*sp++ - '0');
|
||||
if (*sp >= '0' && *sp <= '7')
|
||||
l = l * 8 + (*sp++ - '0');
|
||||
}
|
||||
PUTCHAR(l);
|
||||
break;
|
||||
|
||||
case '\0':
|
||||
PUTCHAR('\\');
|
||||
break;
|
||||
|
||||
case '@':
|
||||
if (!forced_lit)
|
||||
forced_lit = _lit_output();
|
||||
sp++;
|
||||
break;
|
||||
|
||||
default:
|
||||
PUTCHAR('\\');
|
||||
PUTCHAR(*sp++);
|
||||
break;
|
||||
}
|
||||
break;
|
||||
case '^':
|
||||
if (*++sp == '\0')
|
||||
break;
|
||||
l = *sp - '@';
|
||||
if (l > 31)
|
||||
l -= 32;
|
||||
if (l < 0 || l > 31) {
|
||||
PUTCHAR('^');
|
||||
PUTCHAR(*sp++);
|
||||
} else {
|
||||
PUTCHAR(l);
|
||||
sp++;
|
||||
}
|
||||
break;
|
||||
case '$':
|
||||
if (*++sp != '<') {
|
||||
PUTCHAR('$');
|
||||
break;
|
||||
}
|
||||
must_pad = 0;
|
||||
multiply_pad = 0;
|
||||
l = 0;
|
||||
sp++;
|
||||
while (isdigit(*sp))
|
||||
l = l * 10 + (*sp++ - '0');
|
||||
l *= 10;
|
||||
if (*sp == '.') {
|
||||
sp++;
|
||||
if (isdigit(*sp))
|
||||
l += *sp++ - '0';
|
||||
}
|
||||
if (*sp == '/') {
|
||||
must_pad = 1;
|
||||
if (*++sp == '*') {
|
||||
multiply_pad = 1;
|
||||
sp++;
|
||||
}
|
||||
} else if (*sp == '*') {
|
||||
multiply_pad = 1;
|
||||
if (*++sp == '/') {
|
||||
must_pad = 1;
|
||||
sp++;
|
||||
}
|
||||
}
|
||||
if (*sp != '>') {
|
||||
PUTCHAR('p');
|
||||
PUTCHAR('a');
|
||||
PUTCHAR('d');
|
||||
PUTCHAR('?');
|
||||
break;
|
||||
}
|
||||
sp++;
|
||||
#ifdef TEST
|
||||
printf("\nl = %d", l);
|
||||
#endif
|
||||
if (cur_term->pad || must_pad) {
|
||||
cnt = ((long) l * cur_term->baudrate
|
||||
* (multiply_pad ? count : 1)
|
||||
+ (10000L * BITSPERCHAR / 2L))
|
||||
/ (10000L * BITSPERCHAR);
|
||||
#ifdef TEST
|
||||
printf("; cnt = %ld\n", cnt);
|
||||
#endif
|
||||
while(cnt--)
|
||||
PUTCHAR(cur_term->padch);
|
||||
}
|
||||
#ifdef TEST
|
||||
printf("\n");
|
||||
#endif
|
||||
break;
|
||||
default:
|
||||
PUTCHAR(*sp++);
|
||||
}
|
||||
}
|
||||
if (forced_lit)
|
||||
_norm_output();
|
||||
return OK;
|
||||
}
|
||||
|
||||
int
|
||||
putp(str)
|
||||
char *str; {
|
||||
#ifdef USE_PROTOTYPES
|
||||
return(tputs(str, 1,(int (*)(char)) 0));
|
||||
#else
|
||||
return(tputs(str, 1,(int (*)()) 0));
|
||||
#endif
|
||||
}
|
||||
|
||||
#ifdef TEST
|
||||
|
||||
TERMINAL test_term, *cur_term = &test_term;
|
||||
|
||||
int
|
||||
#ifdef USE_PROTOTYPES
|
||||
putch(char c)
|
||||
#else
|
||||
putch(c)
|
||||
char c;
|
||||
#endif
|
||||
{
|
||||
if (c & 0x80) {
|
||||
printf("\\%03o", c);
|
||||
} else if (c < 32) {
|
||||
printf("^%c", c + '@');
|
||||
} else if (c == 127) {
|
||||
printf("^?");
|
||||
} else {
|
||||
putchar(c);
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
char line[MAX_LINE];
|
||||
|
||||
int
|
||||
main(argc, argv)
|
||||
int argc;
|
||||
char **argv; {
|
||||
test_term.termcap = 0;
|
||||
test_term.baudrate = 1200;
|
||||
test_term.pad = 0;
|
||||
test_term.padch = 0;
|
||||
if (argc > 1)
|
||||
test_term.baudrate = atoi(argv[1]);
|
||||
if (argc > 2)
|
||||
test_term.padch = argv[2][0];
|
||||
if (argc > 3)
|
||||
test_term.pad = 1;
|
||||
|
||||
putchar('\n');
|
||||
|
||||
while(fgets(line, sizeof(line), stdin) != NULL) {
|
||||
line[strlen(line)-1] = '\0';
|
||||
tputs(line, 7, putch);
|
||||
putchar('\n');
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
#endif
|
446
lib/libmytinfo/tty.c
Normal file
446
lib/libmytinfo/tty.c
Normal file
@ -0,0 +1,446 @@
|
||||
/*
|
||||
* tty.c
|
||||
*
|
||||
* By Ross Ridge
|
||||
* Public Domain
|
||||
* 92/02/01 07:30:49
|
||||
*
|
||||
* Do some tty related things
|
||||
*
|
||||
*/
|
||||
|
||||
#include "defs.h"
|
||||
#include <term.h>
|
||||
|
||||
#ifdef USE_SCCS_IDS
|
||||
static const char SCCSid[] = "@(#) mytinfo tty.c 3.2 92/02/01 public domain, By Ross Ridge";
|
||||
#endif
|
||||
#ifndef EXTA_IS
|
||||
#define EXTA_IS 19200
|
||||
#endif
|
||||
|
||||
#ifndef EXTB_IS
|
||||
#define EXTB_IS 38400
|
||||
#endif
|
||||
|
||||
#ifdef lint
|
||||
#define ioctl _ioctl
|
||||
/* shutup lint */
|
||||
/* ARGSUSED */
|
||||
/* VARARGS1 */
|
||||
static int ioctl(a, b, p) int a; long b; anyptr *p; { return 0; }
|
||||
#endif
|
||||
|
||||
#if defined(USE_TERMIO) || defined(USE_TERMIOS)
|
||||
|
||||
#ifdef USE_TERMIOS
|
||||
speed_t _baud_tbl[] = {0, 50, 75, 110, 134, 150, 200, 300, 600, 1200, 1800,
|
||||
2400, 4800, 9600, EXTA_IS, EXTB_IS
|
||||
#ifdef B57600
|
||||
,57600
|
||||
#endif
|
||||
#ifdef B115200
|
||||
,115200
|
||||
#endif
|
||||
};
|
||||
#else
|
||||
#ifdef USE_SMALLMEM
|
||||
unsigned short _baud_tbl[] = {0, 50, 75, 110, 134, 150, 200, 300, 600, 1200,
|
||||
1800, 2400, 4800, 9600, EXTA_IS, EXTB_IS};
|
||||
#else
|
||||
long _baud_tbl[] = {0, 50, 75, 110, 134, 150, 200, 300, 600, 1200, 1800,
|
||||
2400, 4800, 9600, EXTA_IS, EXTB_IS};
|
||||
#endif
|
||||
#endif
|
||||
|
||||
#ifdef USE_TERMIO
|
||||
static struct termio old;
|
||||
#else
|
||||
static struct termios old;
|
||||
#endif
|
||||
|
||||
int
|
||||
_lit_output() {
|
||||
#ifdef USE_TERMIO
|
||||
struct termio tmp;
|
||||
if (ioctl(cur_term->fd, TCGETA, &old) == -1)
|
||||
return 0;
|
||||
#else
|
||||
struct termios tmp;
|
||||
if (tcgetattr(cur_term->fd, &old) == -1)
|
||||
return 0;
|
||||
#endif
|
||||
if (!(old.c_oflag & OPOST) || !(old.c_oflag & ONLCR))
|
||||
return 0;
|
||||
memcpy((anyptr)&tmp, (anyptr)&old, sizeof(old));
|
||||
tmp.c_oflag &= ~OPOST;
|
||||
#ifdef USE_TERMIO
|
||||
ioctl(cur_term->fd, TCSETA, &tmp);
|
||||
#else
|
||||
tcsetattr(cur_term->fd, TCSADRAIN, &tmp);
|
||||
#endif
|
||||
return 1;
|
||||
}
|
||||
|
||||
void
|
||||
_norm_output() {
|
||||
#ifdef USE_TERMIO
|
||||
ioctl(cur_term->fd, TCSETA, &old);
|
||||
#else
|
||||
tcsetattr(cur_term->fd, TCSADRAIN, &old);
|
||||
#endif
|
||||
}
|
||||
|
||||
int
|
||||
_check_tty() {
|
||||
if ((cur_term->prog_mode.c_iflag & IXON) && cur_term->xon)
|
||||
cur_term->pad = 0;
|
||||
else
|
||||
cur_term->pad = 1;
|
||||
#ifdef USE_TERMIO
|
||||
cur_term->baudrate = _baud_tbl[cur_term->prog_mode.c_cflag & CBAUD];
|
||||
#else
|
||||
cur_term->baudrate = cfgetospeed(&cur_term->prog_mode);
|
||||
#endif
|
||||
return OK;
|
||||
}
|
||||
|
||||
int
|
||||
def_prog_mode() {
|
||||
#ifdef USE_WINSZ
|
||||
#ifdef TIOCGWINSZ
|
||||
if (ioctl(cur_term->fd, TIOCGWINSZ, &cur_term->prog_winsz) < 0)
|
||||
return ERR;
|
||||
#endif
|
||||
#endif
|
||||
#ifdef USE_TERMIO
|
||||
if (ioctl(cur_term->fd, TCGETA, &cur_term->prog_mode) == 0
|
||||
#else
|
||||
if (tcgetattr(cur_term->fd, &cur_term->prog_mode) == 0
|
||||
#endif
|
||||
&& _check_tty() == OK)
|
||||
return OK;
|
||||
return ERR;
|
||||
}
|
||||
|
||||
int
|
||||
def_shell_mode() {
|
||||
cur_term->termcap = 0;
|
||||
#ifdef USE_WINSZ
|
||||
#ifdef TIOCGWINSZ
|
||||
if (ioctl(cur_term->fd, TIOCGWINSZ, &cur_term->shell_winsz) < 0)
|
||||
return ERR;
|
||||
#endif
|
||||
#endif
|
||||
#ifdef USE_TERMIO
|
||||
return ioctl(cur_term->fd, TCGETA, &cur_term->shell_mode)==0 ? OK : ERR;
|
||||
#else
|
||||
return tcgetattr(cur_term->fd, &cur_term->shell_mode)==0 ? OK : ERR;
|
||||
#endif
|
||||
}
|
||||
|
||||
int
|
||||
reset_prog_mode() {
|
||||
#ifdef USE_TERMIO
|
||||
return ioctl(cur_term->fd, TCSETA, &cur_term->prog_mode)==0 ? OK : ERR;
|
||||
#else
|
||||
return tcsetattr(cur_term->fd, TCSADRAIN, &cur_term->prog_mode)==0 ? OK : ERR;
|
||||
#endif
|
||||
}
|
||||
|
||||
int
|
||||
reset_shell_mode() {
|
||||
#ifdef USE_TERMIO
|
||||
return ioctl(cur_term->fd, TCSETA, &cur_term->shell_mode)==0 ? OK : ERR;
|
||||
#else
|
||||
return tcsetattr(cur_term->fd, TCSADRAIN, &cur_term->shell_mode)==0 ? OK : ERR;
|
||||
#endif
|
||||
}
|
||||
|
||||
int
|
||||
_init_tty() {
|
||||
cur_term->true_lines = lines;
|
||||
cur_term->true_columns = columns;
|
||||
if (pad_char == NULL)
|
||||
cur_term->padch = '\000';
|
||||
else
|
||||
cur_term->padch = pad_char[0];
|
||||
if (def_shell_mode() == ERR || def_prog_mode() == ERR) {
|
||||
cur_term->pad = 0;
|
||||
cur_term->baudrate = 1;
|
||||
cur_term->xon = 0;
|
||||
return OK;
|
||||
}
|
||||
cur_term->xon = (xoff_character == NULL || xoff_character[0] == '\021')
|
||||
&& (xon_character == NULL || xon_character[0] == '\023')
|
||||
&& xon_xoff;
|
||||
#ifdef USE_WINSZ
|
||||
#ifdef TIOCGWINSZ
|
||||
if (cur_term->prog_winsz.ws_row != 0
|
||||
&& cur_term->prog_winsz.ws_col != 0) {
|
||||
lines = cur_term->prog_winsz.ws_row;
|
||||
columns = cur_term->prog_winsz.ws_col;
|
||||
}
|
||||
#endif
|
||||
#endif
|
||||
return OK;
|
||||
}
|
||||
|
||||
#else
|
||||
|
||||
#ifdef USE_SGTTY
|
||||
|
||||
#ifdef USE_SMALLMEM
|
||||
unsigned short _baud_tbl[] = {0, 50, 75, 110, 134, 150, 200, 300, 600, 1200,
|
||||
1800, 2400, 4800, 9600, EXTA_IS, EXTB_IS};
|
||||
#else
|
||||
long _baud_tbl[] = {0, 50, 75, 110, 134, 150, 200, 300, 600, 1200,
|
||||
1800, 2400, 4800, 9600, EXTA_IS, EXTB_IS};
|
||||
#endif
|
||||
|
||||
|
||||
#ifdef TIOCLGET
|
||||
|
||||
static int old;
|
||||
|
||||
int
|
||||
_lit_output() {
|
||||
struct sgttyb buf;
|
||||
int tmp;
|
||||
|
||||
ioctl(cur_term->fd, TIOCGETP, &buf);
|
||||
if (buf.sg_flags & RAW)
|
||||
return 0;
|
||||
ioctl(cur_term->fd, TIOCLGET, &old);
|
||||
if (old & LLITOUT)
|
||||
return 0;
|
||||
tmp = old | LLITOUT;
|
||||
ioctl(cur_term->fd, TIOCLSET, &tmp);
|
||||
return 1;
|
||||
}
|
||||
|
||||
void
|
||||
_norm_output() {
|
||||
ioctl(cur_term->fd, TIOCLSET, &old);
|
||||
}
|
||||
|
||||
#else
|
||||
|
||||
static struct sgttyb old;
|
||||
|
||||
int
|
||||
_lit_output() {
|
||||
struct sgttyb tmp;
|
||||
ioctl(cur_term->fd, TIOCGETP, &old);
|
||||
if (old.sg_flags & RAW)
|
||||
return 0;
|
||||
memcpy((anyptr)&tmp, (anyptr)&old, sizeof(old));
|
||||
tmp.sg_flags |= RAW;
|
||||
ioctl(cur_term->fd, TIOCSETP, &tmp);
|
||||
return 1;
|
||||
}
|
||||
|
||||
void
|
||||
_norm_output() {
|
||||
ioctl(cur_term->fd, TIOCSETP, &old);
|
||||
}
|
||||
|
||||
#endif
|
||||
|
||||
int
|
||||
_check_tty() {
|
||||
if (!(cur_term->prog_mode.v6.sg_flags & RAW) && cur_term->xon)
|
||||
cur_term->pad = 0;
|
||||
else
|
||||
cur_term->pad = 1;
|
||||
cur_term->baudrate = _baud_tbl[cur_term->prog_mode.v6.sg_ospeed & 0xf];
|
||||
return OK;
|
||||
}
|
||||
|
||||
int
|
||||
def_shell_mode() {
|
||||
if (ioctl(cur_term->fd, TIOCGETP, &cur_term->shell_mode.v6) < 0)
|
||||
return ERR;
|
||||
#ifdef TIOCGETC
|
||||
if (ioctl(cur_term->fd, TIOCGETC, &cur_term->shell_mode.v7) < 0)
|
||||
return ERR;
|
||||
#endif
|
||||
#ifdef TIOCLGET
|
||||
if (ioctl(cur_term->fd, TIOCLGET, &cur_term->shell_mode.bsd) < 0)
|
||||
return ERR;
|
||||
#endif
|
||||
#ifdef TIOCGLTC
|
||||
if (ioctl(cur_term->fd, TIOCGLTC, &cur_term->shell_mode.bsd_new) < 0)
|
||||
return ERR;
|
||||
#endif
|
||||
#ifdef USE_WINSZ
|
||||
#ifdef TIOCGWINSZ
|
||||
if (ioctl(cur_term->fd, TIOCGWINSZ, &cur_term->shell_winsz)<0)
|
||||
return ERR;
|
||||
#endif
|
||||
#endif
|
||||
cur_term->termcap = 0;
|
||||
return OK;
|
||||
}
|
||||
|
||||
int
|
||||
def_prog_mode() {
|
||||
if (ioctl(cur_term->fd, TIOCGETP, &cur_term->prog_mode.v6) < 0)
|
||||
return ERR;
|
||||
#ifdef TIOCGETC
|
||||
if (ioctl(cur_term->fd, TIOCGETC, &cur_term->prog_mode.v7) < 0)
|
||||
return ERR;
|
||||
#endif
|
||||
#ifdef TIOCLGET
|
||||
if (ioctl(cur_term->fd, TIOCLGET, &cur_term->prog_mode.bsd) < 0)
|
||||
return ERR;
|
||||
#endif
|
||||
#ifdef TIOCGLTC
|
||||
if (ioctl(cur_term->fd, TIOCGLTC, &cur_term->prog_mode.bsd_new) < 0)
|
||||
return ERR;
|
||||
#endif
|
||||
#ifdef USE_WINSZ
|
||||
#ifdef TIOCGWINSZ
|
||||
if (ioctl(cur_term->fd, TIOCGWINSZ, &cur_term->prog_winsz)<0)
|
||||
return ERR;
|
||||
#endif
|
||||
#endif
|
||||
return _check_tty();
|
||||
}
|
||||
|
||||
int
|
||||
reset_shell_mode() {
|
||||
if (ioctl(cur_term->fd, TIOCSETP, &cur_term->shell_mode.v6) < 0)
|
||||
return ERR;
|
||||
#ifdef TIOCGETC
|
||||
if (ioctl(cur_term->fd, TIOCSETC, &cur_term->shell_mode.v7) < 0)
|
||||
return ERR;
|
||||
#endif
|
||||
#ifdef TIOCLGET
|
||||
if (ioctl(cur_term->fd, TIOCLSET, &cur_term->shell_mode.bsd) < 0)
|
||||
return ERR;
|
||||
#endif
|
||||
#ifdef TIOCGLTC
|
||||
if (ioctl(cur_term->fd, TIOCSLTC, &cur_term->shell_mode.bsd_new) < 0)
|
||||
return ERR;
|
||||
#endif
|
||||
return OK;
|
||||
}
|
||||
|
||||
int
|
||||
reset_prog_mode() {
|
||||
if (ioctl(cur_term->fd, TIOCSETP, &cur_term->prog_mode.v6) < 0)
|
||||
return ERR;
|
||||
#ifdef TIOCGETC
|
||||
if (ioctl(cur_term->fd, TIOCSETC, &cur_term->prog_mode.v7) < 0)
|
||||
return ERR;
|
||||
#endif
|
||||
#ifdef TIOCLGET
|
||||
if (ioctl(cur_term->fd, TIOCLSET, &cur_term->prog_mode.bsd) < 0)
|
||||
return ERR;
|
||||
#endif
|
||||
#ifdef TIOCGLTC
|
||||
if (ioctl(cur_term->fd, TIOCSLTC, &cur_term->prog_mode.bsd_new) < 0)
|
||||
return ERR;
|
||||
#endif
|
||||
return OK;
|
||||
}
|
||||
|
||||
int
|
||||
_init_tty() {
|
||||
cur_term->true_lines = lines;
|
||||
cur_term->true_columns = columns;
|
||||
if (pad_char == NULL)
|
||||
cur_term->padch = '\000';
|
||||
else
|
||||
cur_term->padch = pad_char[0];
|
||||
if (def_shell_mode() == ERR || def_prog_mode() == ERR) {
|
||||
cur_term->pad = 0;
|
||||
cur_term->baudrate = 1;
|
||||
cur_term->xon = 0;
|
||||
return OK;
|
||||
}
|
||||
#ifndef TIOCGETC
|
||||
cur_term->xon = (xoff_character == NULL || xoff_character[0] == '\021')
|
||||
&& (xon_character == NULL || xon_character[0] == '\023')
|
||||
&& xon_xoff;
|
||||
#else
|
||||
if (xon_xoff) {
|
||||
if (xon_character != NULL) {
|
||||
cur_term->prog_mode.v7.t_startc = xon_character[0];
|
||||
if (ioctl(cur_term->fd, TIOCSETC,
|
||||
&cur_term->prog_mode.v7) < 0)
|
||||
return ERR;
|
||||
}
|
||||
if (xoff_character != NULL) {
|
||||
cur_term->prog_mode.v7.t_stopc = xoff_character[0];
|
||||
if (ioctl(cur_term->fd, TIOCSETC,
|
||||
&cur_term->prog_mode.v7) < 0)
|
||||
return ERR;
|
||||
}
|
||||
}
|
||||
cur_term->xon = xon_xoff;
|
||||
#endif
|
||||
#ifdef USE_WINSZ
|
||||
#ifdef TIOCGWINSZ
|
||||
if (cur_term->prog_winsz.ws_row != 0
|
||||
&& cur_term->prog_winsz.ws_col != 0) {
|
||||
lines = cur_term->prog_winsz.ws_row;
|
||||
columns = cur_term->prog_winsz.ws_col;
|
||||
}
|
||||
#endif
|
||||
#endif
|
||||
return OK;
|
||||
}
|
||||
|
||||
#else
|
||||
|
||||
int
|
||||
_lit_output() {
|
||||
return 0;
|
||||
}
|
||||
|
||||
void
|
||||
_norm_output() {
|
||||
return;
|
||||
}
|
||||
|
||||
int
|
||||
_check_tty() {
|
||||
return OK;
|
||||
}
|
||||
|
||||
int
|
||||
def_prog_mode() {
|
||||
return OK;
|
||||
}
|
||||
|
||||
int
|
||||
reset_prog_mode() {
|
||||
return OK;
|
||||
}
|
||||
|
||||
int
|
||||
def_shell_mode() {
|
||||
return OK;
|
||||
}
|
||||
|
||||
int
|
||||
reset_shell_mode() {
|
||||
return OK;
|
||||
}
|
||||
|
||||
int
|
||||
_init_tty() {
|
||||
cur_term->pad = 1;
|
||||
cur_term->padch = 0;
|
||||
cur_term->baudrate = 1200;
|
||||
cur_term->xon = 0;
|
||||
cur_term->termcap = 0;
|
||||
cur_term->true_lines = lines;
|
||||
cur_term->true_columns = columns;
|
||||
}
|
||||
|
||||
#endif
|
||||
|
||||
#endif
|
10
lib/libmytinfo/version.h
Normal file
10
lib/libmytinfo/version.h
Normal file
@ -0,0 +1,10 @@
|
||||
/*
|
||||
* version.h
|
||||
*
|
||||
* By Ross Ridge
|
||||
* Public Domain
|
||||
*
|
||||
*/
|
||||
|
||||
#define RELEASE 3
|
||||
#define PATCHLEVEL 0
|
Loading…
Reference in New Issue
Block a user