diff options
author | Joseph Hunkeler <jhunkeler@gmail.com> | 2015-07-08 20:46:52 -0400 |
---|---|---|
committer | Joseph Hunkeler <jhunkeler@gmail.com> | 2015-07-08 20:46:52 -0400 |
commit | fa080de7afc95aa1c19a6e6fc0e0708ced2eadc4 (patch) | |
tree | bdda434976bc09c864f2e4fa6f16ba1952b1e555 /sys/etc/sttyco.x | |
download | iraf-linux-fa080de7afc95aa1c19a6e6fc0e0708ced2eadc4.tar.gz |
Initial commit
Diffstat (limited to 'sys/etc/sttyco.x')
-rw-r--r-- | sys/etc/sttyco.x | 519 |
1 files changed, 519 insertions, 0 deletions
diff --git a/sys/etc/sttyco.x b/sys/etc/sttyco.x new file mode 100644 index 00000000..54f2c5ce --- /dev/null +++ b/sys/etc/sttyco.x @@ -0,0 +1,519 @@ +# Copyright(c) 1986 Association of Universities for Research in Astronomy Inc. + +include <error.h> +include <syserr.h> +include <ctype.h> +include <ttyset.h> +include <ttset.h> + +.help sttyco +.nf --------------------------------------------------------------------------- +STTYCO -- Set/stat VOS terminal driver options via command string. This is a +high level front-end to the ttset/ttstat procedures, used to set or query the +individual terminal driver parameters. Since STTYCO is driven by a command +string it may be called either as a task or as a subroutine. When called as +a task, e.g, as the STTY task in the CL, the argument list is simply +concatenated into a long string and passed to STTYCO for processing. + +The argument list consists of zero or more argument strings, as follows: + + reset Reset default terminal settings + init Send initialization sequence to the terminal + show Show terminal settings + all Show all parameters, even if not in use + <nullarglist> Show terminal settings + <unknown> Assumed to be the termcap name of a terminal. + Set envvars `terminal', `ttyncols', and + `ttynlines' for the named terminal. + baud=N Set envvar `ttybaud=N'. + ncols=N Set envvar `ttyncols=N'. + nlines=N Set envvar `ttynlines=N'. + resize Reset the screen size parameters. + + clear Disable named driver functions. + + ucasein Map input to lower case. + ucaseout Map output to upper case. + + logio [=logiofile] Log all i/o to the terminal in a file. + login [=loginfile] Log input from terminal in a file. + logout [=logoutfile] Log output to terminal in a file. + + playback [=pbfile] Read terminal input from a logfile. + verify Pause at newline when in playback mode. + delay=N Msec delay in playback mode, verify disabled. + +Simply naming a parameter like ucasein, logio, etc., causes that function to +be enabled, or disabled if preceeded by the keyword `clear'. Any of the +sequences +, -, =yes, =no may also be appended to turn the function on or off. +The logging functions may also take a filename argument, e.g., logio=file +enables i/o logging into the named file. The default filenames are as follows: + + logio home$ttyio.log + login home$ttin.log + logout home$ttout.log + playback home$ttin.log + +If verify is disabled a delay will precede each record returned from the +input file; the default delay is quite short. Pause mode is terminated by +typing a space or carriage return to continue execution, or `q' to terminate +playback mode. +.endhelp ---------------------------------------------------------------------- + +define STTY_KEYWORDS "|reset|init|all|show|baud|ncols|nlines|resize|clear|\ + |ucasein|ucaseout|logio|login|logout|playback|verify|delay|" + +define RESET 1 # reset default terminal settings +define INIT 2 # send initialization sequence to the terminal +define ALL 3 # show all parameters +define SHOW 4 # show parameters +define BAUD 5 # set envvar `ttybaud' +define NCOLS 6 # set envvar `ttyncols' +define NLINES 7 # set envvar `ttynlines' +define RESIZE 8 # reset the screen size parameters +define CLEAR 9 # set default action to NO rather than YES +# newline 10 +define UCASEIN 11 # map input to lower case +define UCASEOUT 12 # map output to upper case +define LOGIO 13 # log all i/o in a file +define LOGIN 14 # log input in a file +define LOGOUT 15 # log output in a file +define PLAYBACK 16 # take input from a file +define VERIFY 17 # wait for user to type a key after each record +define DELAY 18 # msec delay after each record in playback mode + + +# STTYCO -- Main entry point. Input consists of an argument list of arbitrary +# length. Output is to the given file descriptor. + +procedure sttyco (args, ttin, ttout, outfd) + +char args[ARB] # argument list +int ttin, ttout # tty file descriptors +int outfd # write task output here + +pointer sp, keyw, value, tty +int startcol, ival, nargs, yesno, defact, show, all, ip +int stty_getarg(), strdic(), ctoi() +pointer ttyodes() + +string keywords STTY_KEYWORDS +errchk ttseti, ttsets, stty_ttyinit +define argerr_ 91 + +begin + call smark (sp) + call salloc (keyw, SZ_FNAME, TY_CHAR) + call salloc (value, SZ_FNAME, TY_CHAR) + + defact = YES + show = NO + all = NO + ip = 1 + + # Process successive keyword=value arguments. + + for (nargs=0; stty_getarg (args, ip, Memc[keyw], SZ_FNAME, Memc[value], + SZ_FNAME, defact, yesno) != EOF; nargs = nargs + 1) { + + switch (strdic (Memc[keyw], Memc[keyw], SZ_FNAME, keywords)) { + case RESET: + call ttseti (ttin, TT_INITIALIZE, yesno) + case INIT: + call stty_ttyinit (ttin, ttout, "terminal") + + case ALL: + all = yesno + show = YES + case SHOW: + show = yesno + case BAUD: + if (IS_DIGIT (Memc[value])) + call stty_envreset ("ttybaud", Memc[value]) + else + goto argerr_ + case NCOLS: + if (IS_DIGIT (Memc[value])) + call stty_envreset ("ttyncols", Memc[value]) + else + goto argerr_ + case NLINES: + if (IS_DIGIT (Memc[value])) + call stty_envreset ("ttynlines", Memc[value]) + else + goto argerr_ + + case RESIZE: + tty = ttyodes ("terminal") + call stty_setsize (ttin, ttout, tty) + call ttycdes (tty) + + case CLEAR: + defact = NO + + case UCASEIN: + call ttseti (ttin, TT_UCASEIN, yesno) + case UCASEOUT: + call ttseti (ttin, TT_UCASEOUT, yesno) + + case LOGIO: + if (yesno == YES && Memc[value] != EOS) + call ttsets (ttin, TT_IOFILE, Memc[value]) + call ttseti (ttin, TT_LOGIO, yesno) + case LOGIN: + if (yesno == YES && Memc[value] != EOS) + call ttsets (ttin, TT_INFILE, Memc[value]) + call ttseti (ttin, TT_LOGIN, yesno) + case LOGOUT: + if (yesno == YES && Memc[value] != EOS) + call ttsets (ttin, TT_OUTFILE, Memc[value]) + call ttseti (ttin, TT_LOGOUT, yesno) + case PLAYBACK: + if (yesno == YES && Memc[value] != EOS) + call ttsets (ttin, TT_PBFILE, Memc[value]) + call ttseti (ttin, TT_PLAYBACK, yesno) + + case VERIFY: + call ttseti (ttin, TT_PBVERIFY, yesno) + case DELAY: + startcol = 1 + if (ctoi (Memc[value], startcol, ival) > 0) + call ttseti (ttin, TT_PBDELAY, ival) + else + goto argerr_ + + default: + # If not keyword, must be a terminal name. + iferr (call stty_newterm (ttin, ttout, Memc[keyw])) + call erract (EA_WARN) + } + } + + # If the argument list was null or the SHOW flag was set, show + # the current terminal settings. + + if (nargs == 0 || show == YES) + call stty_showterm (ttin, ttout, outfd, all) + + call sfree (sp) + return + +argerr_ + call syserrs (SYS_STTYNUMARG, Memc[keyw]) + call sfree (sp) +end + + +# STTY_NEWTERM -- Configure the environment for a new type of terminal. + +procedure stty_newterm (ttin, ttout, terminal) + +int ttin, ttout # tty file descriptors +char terminal[ARB] # termcap name of new terminal + +pointer sp, vp, tty +pointer ttyodes() + +bool ttygetb() +int ttygets() +errchk ttyodes, stty_envreset, ttygsize + +begin + call smark (sp) + call salloc (vp, SZ_FNAME, TY_CHAR) + + tty = ttyodes (terminal) + + # Set the terminal parameters. + call stty_envreset ("terminal", terminal) + call stty_setsize (ttin, ttout, tty) + + # Set the stdgraph device name for this terminal, if given. + if (ttygetb (tty, "gd")) { + if (ttygets (tty, "gd", Memc[vp], SZ_FNAME) <= 0) + call strcpy (terminal, Memc[vp], SZ_FNAME) + } else + call strcpy ("none", Memc[vp], SZ_FNAME) + call stty_envreset ("stdgraph", Memc[vp]) + + call ttycdes (tty) + call sfree (sp) +end + + +# STTY_SETSIZE -- Determine the terminal screen size in characters, and set +# up the environment appropriately. + +procedure stty_setsize (ttin, ttout, tty) + +int ttin, ttout # tty file descriptors +pointer tty + +char num[4] +int ncols, nlines, n +int itoc() + +begin + call ttygsize (ttin, ttout, tty, ncols, nlines) + + n = itoc (ncols, num, 4) + call stty_envreset ("ttyncols", num) + call ttyseti (tty, TTY_NCOLS, ncols) + + n = itoc (nlines, num, 4) + call stty_envreset ("ttynlines", num) + call ttyseti (tty, TTY_NLINES, nlines) +end + + +# STTY_TTYINIT -- Output the initialization string and the contents of +# the initialization file to the terminal, if either is specified in the +# termcap entry for the device. + +procedure stty_ttyinit (ttin, ttout, terminal) + +int ttin, ttout # tty file descriptors +char terminal[ARB] # termcap name of new terminal + +pointer tty +pointer ttyodes() + +begin + tty = ttyodes (terminal) + call ttyinit (ttout, tty) + call flush (ttout) + call ttycdes (tty) +end + + +# STTY_ENVRESET -- Set the value of an environment variable in the current +# process and in all connected subprocesses. + +procedure stty_envreset (envvar, value) + +char envvar[ARB] # environment variable to be set +char value[ARB] # new value + +errchk envreset + +begin + call envreset (envvar, value) + call prenvset (0, envvar, value) +end + + +# STTY_SHOWTERM -- Show the current terminal driver status. + +procedure stty_showterm (ttin, ttout, fd, all) + +int ttin, ttout # tty file descriptors +int fd # where the output goes +int all # show all params, even if not in use + +int junk +pointer sp, val +bool ucasein, ucaseout, shift, logio, login, logout, playback, showall +int ttstati(), ttstats(), envfind() + +string unknown "[unknown]" +string on "on" +string off "off" + +begin + call smark (sp) + call salloc (val, SZ_FNAME, TY_CHAR) + + ucasein = (ttstati (ttin, TT_UCASEIN) == YES) + ucaseout = (ttstati (ttin, TT_UCASEOUT) == YES) + shift = (ttstati (ttin, TT_SHIFTLOCK) == YES) + logio = (ttstati (ttin, TT_LOGIO) == YES) + login = (ttstati (ttin, TT_LOGIN) == YES) + logout = (ttstati (ttin, TT_LOGOUT) == YES) + playback = (ttstati (ttin, TT_PLAYBACK) == YES) + showall = (all == YES) + + # Show tty environment variables. + + if (envfind ("terminal", Memc[val], SZ_FNAME) <= 0) + call strcpy ("?", Memc[val], SZ_FNAME) + call fprintf (fd, "%s ") + call pargstr (Memc[val]) + + if (envfind ("ttyncols", Memc[val], SZ_FNAME) <= 0) + call strcpy ("?", Memc[val], SZ_FNAME) + call fprintf (fd, "ncols=%s ") + call pargstr (Memc[val]) + + if (envfind ("ttynlines", Memc[val], SZ_FNAME) <= 0) + call strcpy ("?", Memc[val], SZ_FNAME) + call fprintf (fd, "nlines=%s ") + call pargstr (Memc[val]) + + if (showall || ucasein || ucaseout) { + if (envfind ("ttybaud", Memc[val], SZ_FNAME) <= 0) + call strcpy ("?", Memc[val], SZ_FNAME) + call fprintf (fd, "baudrate=%s ") + call pargstr (Memc[val]) + + call fprintf (fd, "ucasein=%b ") + call pargb (ucasein) + call fprintf (fd, "ucaseout=%b ") + call pargb (ucaseout) + call fprintf (fd, "shift=%b\n") + call pargb (shift) + } else + call fprintf (fd, "\n") + + # Show internal driver state variables in `show all' mode. + + if (showall) { + call fprintf (fd, + "kichan=%d kochan=%d lichan=%d lochan=%d pbchan=%d ") + call pargi (ttstati (ttin, TT_KINCHAN)) + call pargi (ttstati (ttin, TT_KOUTCHAN)) + call pargi (ttstati (ttin, TT_LOGINCHAN)) + call pargi (ttstati (ttin, TT_LOGOUTCHAN)) + call pargi (ttstati (ttin, TT_PBINCHAN)) + + call fprintf (fd, "raw=%b passthru=%b\n") + call pargb (ttstati (ttin, TT_RAWMODE) == YES) + call pargb (ttstati (ttin, TT_PASSTHRU) == YES) + } + + # Show the status of the logging options. + + if (logio || showall) { + junk = ttstats (ttin, TT_IOFILE, Memc[val], SZ_FNAME) + call fprintf (fd, "logio=%s [%s]\n") + call pargstr (Memc[val]) + if (logio) + call pargstr (on) + else + call pargstr (off) + } + + if (!logio || showall) { + if (login || showall) { + junk = ttstats (ttin, TT_INFILE, Memc[val], SZ_FNAME) + call fprintf (fd, "login=%s [%s]\n") + call pargstr (Memc[val]) + if (login) + call pargstr (on) + else + call pargstr (off) + } + if (logout || showall) { + junk = ttstats (ttin, TT_OUTFILE, Memc[val], SZ_FNAME) + call fprintf (fd, "logout=%s [%s]\n") + call pargstr (Memc[val]) + if (logout) + call pargstr (on) + else + call pargstr (off) + } + } + + if (playback || showall) { + junk = ttstats (ttin, TT_PBFILE, Memc[val], SZ_FNAME) + call fprintf (fd, "playback=%s [%s] ") + call pargstr (Memc[val]) + if (playback) + call pargstr (on) + else + call pargstr (off) + + call fprintf (fd, "verify=%b ") + call pargb (ttstati (ttin, TT_PBVERIFY) == YES) + call fprintf (fd, "delay=%d (msec)") + call pargi (ttstati (ttin, TT_PBDELAY)) + call fprintf (fd, "\n") + } + + if (playback) { + call fprintf (fd, "script recorded with terminal=%s, stdgraph=%s\n") + if (ttstats (ttin, TT_TDEVICE, Memc[val], SZ_FNAME) <= 0) + call pargstr (unknown) + else + call pargstr (Memc[val]) + if (ttstats (ttin, TT_GDEVICE, Memc[val], SZ_FNAME) <= 0) + call pargstr (unknown) + else + call pargstr (Memc[val]) + } + + call sfree (sp) +end + + +# STTY_GETARG -- Get the next argument from an argument list. Arguments are of +# the form keyw, keyw+, keyw-, keyw=(yes|y), keyw=(no|n), or keyw=value. +# All forms are reduced to a flag YESNO and a value string VALUE. The forms +# keyw=yes, key=no, etc., cause YESNO to be set but not VALUE. If only the +# keyword name is given YESNO is set to YES and VALUE to the null string. +# The number of characters in the keyword=value argument string is returned +# as the function value, or EOF when the argument list is exhausted. + +int procedure stty_getarg (args, ip, keyw, maxkc, value, maxvc, defact, yesno) + +char args[ARB] # argument string +int ip # index into argument string [RW] +char keyw[ARB] # receives keyword name +int maxkc # max chars in keyw string +char value[ARB] # receives value string or EOS +int maxvc # max chars in value string +int defact # default action (yes/no) if only keyword given +int yesno # boolean value of parameter + +int op +int ip_save +bool streq() + +begin + while (IS_WHITE (args[ip])) + ip = ip + 1 + + ip_save = ip + + # Get keyword name. + for (op=1; IS_ALNUM (args[ip]); ip=ip+1) { + keyw[op] = args[ip] + op = min (maxkc, op + 1) + } + keyw[op] = EOS + + while (IS_WHITE (args[ip])) + ip = ip + 1 + + value[1] = EOS + yesno = defact + + if (args[ip] == '=') { + # Extract value string. + op = 1 + for (ip=ip+1; args[ip] > ' '; ip=ip+1) { + value[op] = args[ip] + op = min (maxvc, op + 1) + } + value[op] = EOS + + # Check for keyw=[yes|no]. + if (streq (value, "yes") || streq (value, "y")) { + yesno = YES + value[1] = EOS + } else if (streq (value, "no") || streq (value, "n")) { + yesno = NO + value[1] = EOS + } + } else if (args[ip] == '+') { + yesno = YES + ip = ip + 1 + } else if (args[ip] == '-') { + yesno = NO + ip = ip + 1 + } + + if (ip <= ip_save) + return (EOF) + else + return (ip - ip_save) +end |