v08i052: A program to call curses(3) functions
sources-request at mirror.UUCP
sources-request at mirror.UUCP
Tue Feb 10 04:21:18 AEST 1987
Submitted by: sdcrdcf!trwrb!ries (Marc Ries)
Mod.sources: Volume 8, Issue 52
Archive-name: kurses
[ Interested parties may also want to see tput, in Volume 7. --r$ ]
# Cut_Here-----Cut_Here-----Cut_Here---------Cut_Here
#! /bin/sh
# This is a shell archive, meaning:
# 1. Remove everything above the #! /bin/sh line.
# 2. Save the resulting text in a file.
# 3. Execute the file with /bin/sh (not csh) to create:
# README
# att_kurses.mk
# bsd_kurses.mk
# kshtest
# kurses.1
# kurses.c
# shtest
export PATH; PATH=/bin:/usr/bin:$PATH
echo shar: "extracting 'README'" '(1007 characters)'
if test -f 'README'
then
echo shar: "will not over-write existing file 'README'"
else
cat << \RiesES_PIECES > 'README'
Kurses (aka, curse) was published to the net several years ago.
With some changes, it has proved to be a powerful interpreter for
manipulating VDT screens, and (especially combined with ksh
functions) can be a "production" quality UNIX application
development tool.
The need arose to be able to drive "kurses" scripts under
terminfo, and kurses has been (quickly) ported to SYSVR3.
Compile it for pre-terminfo UNIX's via the 'bsd_kurses.mk"
makefile or for terminfo UNIX via 'att_kurses.mk'.
A man page is included (and note the origional author, Jonathan
Bowen of Oxford, England).
Your can "test" kurses on your VDT using 'shtest' for the Bourne
shell or 'kshtest' for the Korn shell. Not *all* of the options
have been thoroughly tested but the most useful ones should be
OK.
Please send bugs [features 8-{)] and fixes and improvements to
me:
Marc A. Ries
sdcrdcf!---\
ihnp4!------\----- trwrb! --- ries
ucbvax!-----/
RiesES_PIECES
fi
echo shar: "extracting 'att_kurses.mk'" '(547 characters)'
if test -f 'att_kurses.mk'
then
echo shar: "will not over-write existing file 'att_kurses.mk'"
else
cat << \RiesES_PIECES > 'att_kurses.mk'
#
# Makefile: kurses
# Created: Thursday, November 06, 1986
# By: Marc Ries (TRW Operations and Support Group)
#
CC = /bin/cc
OPTS = -O -s
# DEFS = -DBSD
DEFS = -DSYSV
CFLAGS = $(OPTS) $(DEFS)
SRCS = kurses.c
OBJS = kurses.o
# Define LIB2 if target system is Berkeley Version
# LIB2 = -ltermcap
LIBS = -lcurses $(LIB2)
all: kurses
kurses: $(OBJS)
$(CC) $(CFLAGS) -o kurses $(OBJS) $(LIBS)
clean:
rm -f $(OBJS) a.out core
shar:
shar -v kurses.[1clyh] Makefile > kurses.shr
edit:
vi $(SRCS)
kurses.o: kurses.c
RiesES_PIECES
fi
echo shar: "extracting 'bsd_kurses.mk'" '(545 characters)'
if test -f 'bsd_kurses.mk'
then
echo shar: "will not over-write existing file 'bsd_kurses.mk'"
else
cat << \RiesES_PIECES > 'bsd_kurses.mk'
#
# Makefile: kurses
# Created: Thursday, November 06, 1986
# By: Marc Ries (TRW Operations and Support Group)
#
CC = /bin/cc
OPTS = -O -s
DEFS = -DBSD
# DEFS = -DSYSV
CFLAGS = $(OPTS) $(DEFS)
SRCS = kurses.c
OBJS = kurses.o
# Define LIB2 if target system is Berkeley Version
LIB2 = -ltermcap
LIBS = -lcurses $(LIB2)
all: kurses
kurses: $(OBJS)
$(CC) $(CFLAGS) -o kurses $(OBJS) $(LIBS)
clean:
rm -f $(OBJS) a.out core
shar:
shar -v kurses.[1clyh] Makefile > kurses.shr
edit:
vi $(SRCS)
kurses.o: kurses.c
RiesES_PIECES
fi
echo shar: "extracting 'kshtest'" '(1779 characters)'
if test -f 'kshtest'
then
echo shar: "will not over-write existing file 'kshtest'"
else
cat << \RiesES_PIECES > 'kshtest'
#!/bin/ksh
trap 'kurses -cl;exit' 1 2 3 15
function main_menu
{
kurses \
-cm 0 1 \
-ce \
'*********************************** M E N U ************************************' \
-cm 0 2 -ce \
-cm 0 3 \
-ce \
' 1 Display Modules A thru P' \
-cm 0 4 \
-ce \
' 2 Display Modules Q thru Z' \
-cm 0 5 \
-ce \
' 3 Display Sub-Modules A thru Z' \
-cm 0 6 \
-ce \
' 4 Display HELP information' \
-cm 0 7 \
-ce \
' 5 Exit.' \
-cm 0 8 \
-ce \
-cm 0 9 \
-ce \
' Enter Option: ' \
-cm 0 10 \
-ce \
-cm 0 22 \
'**************************** Default is Option 1 *****************************' \
-cm 27 9
;
}
#
function help_menu
{
kurses -cm 0 11
cat <<+ENDCAT
****************************** HELP INFORMATION ******************************
Option 1 - Help information for Option 1
Option 2 - Help information for Option 2
Option 3 - Help information for Option 3
Option 5 - Exit this program.
+ENDCAT
}
#
function clrlwin
{
kurses \
-cm 0 11 \
'*****************************************' \
'***************************************' \
-cm 0 12 -ce \
-cm 0 13 -ce \
-cm 0 14 -ce \
-cm 0 15 -ce \
-cm 0 16 -ce \
-cm 0 17 -ce \
-cm 0 18 -ce \
-cm 0 19 -ce \
-cm 0 20 -ce \
-cm 0 21 -ce \
-cm 0 22 \
'*************************************************************'
;
}
#
kurses -cl
status=loop
while test $status = "loop"
do
main_menu
read response
case "$response" in
4) help_menu
status=loop
;;
5) kurses -cl
status=exit
exit
;;
*) clrlwin
kurses \
-cm 13 9 -ce \
'Enter Option: '
status=loop
;;
esac
done
RiesES_PIECES
chmod +x 'kshtest'
fi
echo shar: "extracting 'kurses.1'" '(2606 characters)'
if test -f 'kurses.1'
then
echo shar: "will not over-write existing file 'kurses.1'"
else
cat << \RiesES_PIECES > 'kurses.1'
.TH CURSE 1 "14 November 1986"
.UC 4
.SH NAME
kurses \- screen functions
.SH SYNOPSIS
.B kurses
[ options ] [ text ] ...
.SH DESCRIPTION
This command gives the user a method of updating the screen from a shell.
The options are two letter variable names from (the Berkeley version of)
.I curses.h
as detailed in Appendix A of
.I "Screen Updating and Cursor Movement Optimization: A Library Package".
All the
.I char*
type variables are included. In addition, two numeric options
(-li and -co) are recognized, so you can adapt your work to any
screen shape size.
Some commonly used options are:
.TP 6
.B -cd
Clear to end of Display.
.TP 6
.B -ce
Clear to End of line.
.TP 6
.B -cl
CLear screen.
This is exactly like the
.I clear
command.
.TP 6
.B -cm
Cursor Motion.
This takes the next two numerical arguments on the command line to be the
.I x
and
.I y
coordinates of the desired position of the cursor from the
.I home
position
.I (0,0)
at the top lefthand corner of the screen.
.TP 6
.B -ho
HOme cursor.
This moves the cursor to the top lefthand corner of the screen.
This is equivalent to
.I -cm 0 0.
.TP 6
.B -ll
Last Line.
This moves the cursor to the bottom lefthand corner of the screen.
This is equivalent to
.I -cm 0 23
on a standard 24 line screen.
.TP 6
.B -se
Standout End (may leave space).
.TP 6
.B -so
Stand Out begin (may leave space).
This normally produces reverse video but depends on the terminal\'s
capabilities.
.TP 6
.B -ue
Underline Ending sequence.
.TP 6
.B -us
Underline Starting sequence.
.TP 6
.B -xx
Prints all allowable options.
.PP
The options may be given in upper or lower case.
Letters after the first two characters are ignored
(e.g.
.B -clear
may be used instead of
.B -cl
).
Any arguments not starting with a `-' are treated as text and are
printed at the current cursor position in the current style
(e.g. standout mode).
For example, to print a message in standout mode at the center of a
standard 80 by 24 character screen and leave the cursor at the bottom
of the screen, the following sequence could be used:
.PP
.ti+8n
kurses -cl -cm 34 11 -so \'Long Live UNIX\' -se -ll
.SH SEE ALSO
.I "Screen Updating and Cursor Movement Optimization: A Library Package,"
Ken Arnold,
.br
clear(1) or tput(1),
curses(3x),
termcap(5) or terminfo(5)
.SH AUTHORS
Jonathan Bowen, PRG, Oxford, England
.br
Marc Ries, TRW, California
.SH BUGS
Some options will only work if the corresponding
.I termcap
(if compiled for curses) or
.I terminfo
(if compiled for terminfo)
entry has been set for the terminal in use (e.g. standout mode).
Cursor motion may not work on some terminals.
RiesES_PIECES
fi
echo shar: "extracting 'kurses.c'" '(9141 characters)'
if test -f 'kurses.c'
then
echo shar: "will not over-write existing file 'kurses.c'"
else
cat << \RiesES_PIECES > 'kurses.c'
/*
* File name: x %I%
* By: Marc Ries
* Latest change: Thursday, November 13, 1986
* Purpose of this file:
* Screen manipulations via a shell
*
*/
#include <curses.h>
#ifndef BSD
#include <term.h>
#endif BSD
void exit();
char *tparm();
outc (c)
int c;
{
(void) putchar(c);
}
main(argc, argv)
int argc;
char *argv[];
{
char c1, c2, *s;
char *i_xy;
int x, y, errret;
if (--argc <= 0) {
(void) fprintf(stderr,"Usage: kurses -xx ...\n");
exit(1);
}
#ifndef BSD
if ((setupterm(0,1,&errret)) == -1) {
(void) fprintf(stderr, "Unknown terminfo terminal type!\n");
exit(1);
}
#else
initscr();
#endif BSD
while (--argc >= 0) {
++argv;
if ((*argv)[0] == '-') {
c1 = (*argv)[1];
if ((c1 >= 'A') && (c1 <= 'Z')) c1 = c1+'a'-'A';
c2 = (*argv)[2];
if ((c2 >= 'A') && (c2 <= 'Z')) c2 = c2+'a'-'A';
if ((c1 == 'x') && (c2 == 'x')) {
(void) printf("Legal options are:\n");
(void) printf("al,bc,bt,cd,ce,cl,cm,dc,dl,dm,do,ed,ei,ho\n");
(void) printf("ic,im,ip,ll,ma,nd,pc,se,sf,so,sr,ta,te,ti\n");
(void) printf("uc,ue,ul,us,vb,ve,vs\n");
(void) printf("Numeric valued capabilities:\n");
(void) printf("li and co\n");
}
else if ((c1 == 'a') && (c2 == 'l')) {
#ifndef BSD
tputs(key_il, 1, outc);
#else
tputs(AL, 1, outc);
#endif BSD
}
#ifndef BSD
else if ((c1 == 'b') && (c2 == 'c')) {
(void) printf("%s",cursor_left);
}
else if ((c1 == 'b') && (c2 == 't')) {
tputs(back_tab, 1, outc);
}
#else
else if ((c1 == 'b') && (c2 == 'c')) (void) printf("%s",BC);
else if ((c1 == 'b') && (c2 == 't')) (void) printf("%s",BT);
#endif BSD
else if ((c1 == 'c') && (c2 == 'd')) {
#ifndef BSD
tputs(clr_eos, 1, outc);
#else
tputs(CD, 1, outc);
#endif BSD
}
else if ((c1 == 'c') && (c2 == 'e')) {
#ifndef BSD
putp(clr_eol);
#else
tputs(CE, 1, outc);
#endif BSD
}
else if ((c1 == 'c') && (c2 == 'l')) {
#ifndef BSD
putp(clear_screen);
#else
tputs(CL, 1, outc);
#endif BSD
}
else if ((c1 == 'c') && (c2 == 'm')) {
if ((argc -= 2) < 0) {
(void) fprintf(stderr,"Usage: kurses -cm X Y\n");
exit(1);
}
x = (char)atoi(*++argv);
y = (char)atoi(*++argv);
#ifndef BSD
i_xy = (tparm(cursor_address,y,x));
tputs(i_xy,0,outc);
#else
movecursor(x,y);
#endif BSD
}
#ifndef BSD
else if ((c1 == 'c') && (c2 == 'o')) (void) printf("%d", columns);
#else
else if ((c1 == 'c') && (c2 == 'o')) (void) printf("%d", COLS);
#endif BSD
else if ((c1 == 'd') && (c2 == 'c')) {
#ifndef BSD
tputs(parm_dch, 1, outc);
#else
tputs(DC, 1, outc);
#endif BSD
}
else if ((c1 == 'd') && (c2 == 'l')) {
#ifndef BSD
tputs(key_dl, 1, outc);
#else
tputs(DL, 1, outc);
#endif BSD
}
#ifndef BSD
else if ((c1 == 'd') && (c2 == 'm')) {
(void) printf("%s",enter_delete_mode);
#else
else if ((c1 == 'd') && (c2 == 'm')) (void) printf("%s",DM);
else if ((c1 == 'd') && (c2 == 'o')) (void) printf("%s",DO);
else if ((c1 == 'e') && (c2 == 'd')) (void) printf("%s",ED);
else if ((c1 == 'e') && (c2 == 'i')) (void) printf("%s",EI);
else if ((c1 == 'h') && (c2 == 'o')) {
if (*HO != '\0') (void) printf("%s",HO);
else movecursor(0,0);
#endif BSD
}
#ifndef BSD
else if ((c1 == 'd') && (c2 == 'o')) {
(void) printf("%s",cursor_down);
}
else if ((c1 == 'e') && (c2 == 'd')) {
(void) printf("%s",exit_delete_mode);
}
else if ((c1 == 'e') && (c2 == 'i')) {
(void) printf("%s",exit_insert_mode);
}
else if ((c1 == 'h') && (c2 == 'o')) {
putp(cursor_home);
}
#endif BSD
else if ((c1 == 'i') && (c2 == 'c')) {
#ifndef BSD
tputs(insert_character, 1, outc);
#else
tputs(IC, 1, outc);
#endif BSD
}
#ifndef BSD
else if ((c1 == 'i') && (c2 == 'm')) {
(void) printf("%s",enter_insert_mode);
}
#else
else if ((c1 == 'i') && (c2 == 'm')) (void) printf("%s",IM);
#endif BSD
else if ((c1 == 'i') && (c2 == 'p')) {
#ifndef BSD
tputs(insert_padding, 1, outc);
#else
tputs(IP, 1, outc);
#endif BSD
}
#ifndef BSD
else if ((c1 == 'l') && (c2 == 'l')) {
if (*cursor_to_ll != '\0') {
putp(cursor_to_ll);
}
i_xy = (tparm(cursor_address,lines-1,0));
tputs(i_xy,0,outc);
#else
else if ((c1 == 'l') && (c2 == 'l')) {
if (*LL != '\0') (void) printf("%s",LL);
else movecursor(0,LINES-1);
#endif BSD
}
#ifndef BSD
else if ((c1 == 'l') && (c2 == 'i')) {
(void) printf("%d", lines);
}
else if ((c1 == 'n') && (c2 == 'd')) {
(void) printf("%s",cursor_right);
}
else if ((c1 == 'p') && (c2 == 'c')) {
(void) printf("%s",pad_char);
}
else if ((c1 == 's') && (c2 == 'e')) {
tputs(exit_standout_mode, 1, outc);
}
#else
else if ((c1 == 'l') && (c2 == 'i')) (void) printf("%d", LINES);
else if ((c1 == 'm') && (c2 == 'a')) (void) printf("%s",MA);
else if ((c1 == 'n') && (c2 == 'd')) (void) printf("%s",ND);
else if ((c1 == 'p') && (c2 == 'c')) (void) printf("%s",PC);
else if ((c1 == 's') && (c2 == 'e')) (void) printf("%s",SE);
#endif BSD
else if ((c1 == 's') && (c2 == 'f')) {
#ifndef BSD
tputs(scroll_forward, 1, outc);
#else
tputs(SF, 1, outc);
#endif BSD
}
#ifndef BSD
else if ((c1 == 's') && (c2 == 'o')) {
tputs(enter_standout_mode, 1, outc);
}
else if ((c1 == 's') && (c2 == 'r')) {
#else
else if ((c1 == 's') && (c2 == 'o')) (void) printf("%s",SO);
else if ((c1 == 's') && (c2 == 'r')) {
#endif BSD
#ifndef BSD
*scroll_reverse = tputs(scroll_reverse, 1, outc);
(void) printf("%s",scroll_reverse);
#else
*SR = tputs(SR, 1, outc);
(void) printf("%s",SR);
#endif BSD
}
else if ((c1 == 't') && (c2 == 'a')) {
#ifndef BSD
tputs(tab, 1, outc);
#else
tputs(TA, 1, outc);
#endif BSD
}
#ifndef BSD
else if ((c1 == 't') && (c2 == 'e')) {
(void) printf("%s",exit_ca_mode);
}
else if ((c1 == 't') && (c2 == 'i')) {
(void) printf("%s",enter_ca_mode);
}
else if ((c1 == 'u') && (c2 == 'c')) {
tputs(underline_char, 1, outc);
}
else if ((c1 == 'u') && (c2 == 'e')) {
tputs(exit_underline_mode, 1, outc);
}
else if ((c1 == 'u') && (c2 == 'l')) {
(void) printf("%s",transparent_underline);
}
else if ((c1 == 'u') && (c2 == 's')) {
tputs(enter_underline_mode, 1, outc);
}
else if ((c1 == 'v') && (c2 == 'b')) {
tputs(flash_screen, 1, outc);
}
else if ((c1 == 'v') && (c2 == 'e')) {
tputs(cursor_normal, 1, outc);
}
else if ((c1 == 'v') && (c2 == 's')) {
tputs(cursor_visible, 1, outc);
}
#else
else if ((c1 == 't') && (c2 == 'e')) (void) printf("%s",TE);
else if ((c1 == 't') && (c2 == 'i')) (void) printf("%s",TI);
else if ((c1 == 'u') && (c2 == 'c')) (void) printf("%s",UC);
else if ((c1 == 'u') && (c2 == 'e')) (void) printf("%s",UE);
else if ((c1 == 'u') && (c2 == 'l')) (void) printf("%s",UL);
else if ((c1 == 'u') && (c2 == 's')) (void) printf("%s",US);
else if ((c1 == 'v') && (c2 == 'b')) (void) printf("%s",VB);
else if ((c1 == 'v') && (c2 == 'e')) (void) printf("%s",VE);
else if ((c1 == 'v') && (c2 == 's')) (void) printf("%s",VS);
#endif BSD
else (void) fprintf(stderr,"kurses: unknown option %s\n",*argv);
}
else for (s = argv[0]; *s != '\0'; s++) (void) putchar(*s);
}
#ifndef BSD
resetterm();
exit(0);
#else
endwin();
#endif BSD
}
#ifdef BSD
movecursor(x,y)
int x, y;
{
char n, *s;
int i = 0, rev = 0;
for (s = CM; *s != '\0'; s++) {
while (*s >= '0' && *s <= '9') *s++; /* strip padding nums */
if (*s != '%') (void) putchar(*s);
else {
switch (i) {
case 0: n = (rev?x:y);
break;
case 1: n = (rev?y:x);
break;
default: n = '\0';
}
switch(*++s) {
case 'd': (void) printf("%d",n);
i++;
break;
case '2': (void) printf("%2d",n);
i++;
break;
case '3': (void) printf("%3d",n);
i++;
break;
case '+': n += (int)*++s;
case '.': (void) printf("%c",(char)n);
i++;
break;
case '>': if (n > (int)*++s) n+=(int)*++s;
else *++s;
break;
case 'i': x++; y++;
break;
case 'n': x ^= 0140; y ^= 0140;
break;
case 'B': x = (16*(x/10))+(x%10);
y = (16*(y/10))+(y%10);
break;
case 'D': x = (x-2*(x%16));
y = (y-2*(y%16));
case 'r': rev++;
break;
default: *--s;
case '%': break;
}
}
}
}
#endif BSD
RiesES_PIECES
fi
echo shar: "extracting 'shtest'" '(1682 characters)'
if test -f 'shtest'
then
echo shar: "will not over-write existing file 'shtest'"
else
cat << \RiesES_PIECES > 'shtest'
#!/bin/sh
trap 'kurses -cl; exit' 1 2 3 15
kurses -cl \
-cm 0 1 \
-ce \
'*********************************** MENU ***************************************' \
-cm 0 2 -ce \
-cm 0 3 \
-ce \
' 1 Display Menu Subject 1.' \
-cm 0 4 \
-ce \
' 2 Display Alternate Menu Items.' \
-cm 0 5 \
-ce \
' 3 Display Page ID.' \
-cm 0 6 \
-ce \
' 4 Display HELP information.' \
-cm 0 7 \
-ce \
' 5 Exit.' \
-cm 0 8 \
-ce \
-cm 0 9 \
-ce \
' Enter Option: ' \
-cm 0 10 \
-ce \
-cm 0 22 \
'**************************** Default is Option 1 *****************************' \
-cm 27 9
#
status=loop
while test $status = "loop"
do
read response
case "$response" in
4) kurses -cm 0 11
cat <<+ENDCAT
****************************** HELP INFORMATION ******************************
Option 1 - Help information for Option 1
Option 2 - Help information for Option 2
Option 3 - Help information for Option 3
Option 5 - Exit this program.
+ENDCAT
kurses \
-cm 13 9 -ce \
'Enter Option: '
status=loop
;;
5) kurses -cl
status=exit
exit
;;
*)
kurses \
-cm 0 11 \
'*****************************************' \
'***************************************' \
-cm 0 12 -ce \
-cm 0 13 -ce \
-cm 0 14 -ce \
-cm 0 15 -ce \
-cm 0 16 -ce \
-cm 0 17 -ce \
-cm 0 18 -ce \
-cm 0 19 -ce \
-cm 0 20 -ce \
-cm 0 21 -ce \
-cm 0 22 \
'*************************************************************' \
-cm 13 9 -ce \
'Enter Option: '
status="loop"
esac
done
RiesES_PIECES
chmod +x 'shtest'
fi
exit 0
# End of shell archive
More information about the Mod.sources
mailing list