From fa080de7afc95aa1c19a6e6fc0e0708ced2eadc4 Mon Sep 17 00:00:00 2001 From: Joseph Hunkeler Date: Wed, 8 Jul 2015 20:46:52 -0400 Subject: Initial commit --- sys/tty/ttyodes.x | 183 ++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 183 insertions(+) create mode 100644 sys/tty/ttyodes.x (limited to 'sys/tty/ttyodes.x') diff --git a/sys/tty/ttyodes.x b/sys/tty/ttyodes.x new file mode 100644 index 00000000..a01ffdca --- /dev/null +++ b/sys/tty/ttyodes.x @@ -0,0 +1,183 @@ +# Copyright(c) 1986 Association of Universities for Research in Astronomy Inc. + +include +include +include +include +include "tty.h" + +define DEF_BAUDRATE 9600 +define DEF_TTYNLINES 24 +define DEF_TTYNCOLS 80 + +# TTYODES -- Open a TTY terminal descriptor. If ttyname is "terminal" or +# "printer", get the name of the default terminal or printer from the +# environment. If the "name" of the terminal is a filename, the first termcap +# entry in the name file is read. Otherwise, the termcap file is searched for +# an entry corresponding to the named device. +# +# The descriptor is then allocated, and the termcap entry read in. Termcap +# permits an entry to be defined in terms of another entry with the "tc" +# field; we must expand such references by rescanning the file once for each +# such reference. Finally, the termcap entry is indexed for efficient access. +# +# The form of a termcap entry is one logical line (usually extending over +# several physical lines using newline escapes), consisting of several alternate +# names for the device, followed by a list of ':' delimited capabilities: +# +# name1 '|' name2 [ '|' namen... ] ':' cap ':' [ cap ':' ... ] +# +# If the final cap in an entry is of the form ":tc=name:", the capability +# is replaced by the capability list of the named entry. + +pointer procedure ttyodes (ttyname) + +char ttyname[ARB] + +bool istty +int nchars +pointer sp, ttysource, device, devname, fname, tty + +pointer ttyopen() +extern ttyload() +bool streq(), ttygetb() +int envgets(), envgeti(), btoi() +int fnldir(), ttygeti(), ttygets() +errchk syserrs, tty_index_caps, ttygeti, ttyopen, ttygets +errchk envgets, envgeti, envindir + +string terminal "terminal" # terminal named in environment +string printer "printer" # printer named in environment +string termcap "termcap" # name of termcap file stored in env. too + +begin + call smark (sp) + call salloc (ttysource, SZ_FNAME, TY_CHAR) + call salloc (devname, SZ_FNAME, TY_CHAR) + call salloc (device, SZ_FNAME, TY_CHAR) + call salloc (fname, SZ_FNAME, TY_CHAR) + + # Resolve any indirection in the device name. + call envindir (ttyname, Memc[devname], SZ_FNAME) + + # Get device name or termcap file name. + if (streq (Memc[devname], terminal)) { + if (envgets (terminal, Memc[ttysource], SZ_FNAME) <= 0) + call syserrs (SYS_ENVNF, terminal) + } else if (streq (Memc[devname], printer)) { + if (envgets (printer, Memc[ttysource], SZ_FNAME) <= 0) + call syserrs (SYS_ENVNF, printer) + } else + call strcpy (Memc[devname], Memc[ttysource], SZ_FNAME) + + # If ttysource is a filename, we assume that it is the name of + # a termcap format file, the first entry of which (matched by the + # null device name) is the entry for the device. Otherwise, + # ttysource is the name of the desired termcap entry in the regular + # termcap file. + + if (fnldir (Memc[ttysource], Memc[fname], SZ_FNAME) > 0) { + call strcpy (Memc[ttysource], Memc[fname], SZ_FNAME) + Memc[device] = EOS + } else { + if (envgets (termcap, Memc[fname], SZ_FNAME) <= 0) + call syserrs (SYS_ENVNF, termcap) + call strcpy (Memc[ttysource], Memc[device], SZ_FNAME) + } + + # Truncate the device name if device fields are appended. + call ttydevname (Memc[device], Memc[device], SZ_FNAME) + + # Allocate and initialize the tty descriptor structure and fetch + # termcap entry from termcap file. The TTYLOAD procedure, passed + # as an argument to TTYOPEN, is searched for cached termcap entries + # before accessing the actual file. + + tty = ttyopen (Memc[fname], Memc[device], ttyload) + + # Prepare index of fields in the descriptor, so that we can more + # efficiently search for fields later. + + call tty_index_caps (tty, T_CAPCODE(tty), T_CAPINDEX(tty), + T_NCAPS(tty)) + + # Determine whether or not the terminal can backspace with BS. + if (ttygetb (tty, "bs")) + T_BSOK(tty) = YES + else + T_BSOK(tty) = NO + + # Determine whether or not the stdgraph device can expand tabs. + # If it can but it requires some long string, don't bother. + + T_HTOK(tty) = NO + T_TABCHAR(tty) = 0 + if (ttygetb (tty, "pt")) { + nchars = ttygets (tty, "ta", Memc[fname], SZ_FNAME) + if (nchars <= 0) { + T_HTOK(tty) = YES + T_TABCHAR(tty) = '\t' + } else if (nchars == 1) { + T_HTOK(tty) = YES + T_TABCHAR(tty) = Memc[fname] + } + } + + # Does the terminal autoadvance at the right margin? + T_AM(tty) = btoi (ttygetb (tty, "am")) + + # Determine the optimimum mode for handling standout mode control, + # and save in the descriptor. + + if (ttygetb (tty, "so")) { + T_SOTYPE(tty) = SOSE # use so, se + } else if (ttygetb (tty, "os")) { + if (T_BSOK(tty) == YES || ttygetb (tty, "bc")) + T_SOTYPE(tty) = BSOS # backspace, ostrike + else + T_SOTYPE(tty) = CROS # ostrike whole line + } else + T_SOTYPE(tty) = TOUP # to upper case + + # Get pad char and baud rate (used by ttyputs to generate delays) + # and put in descriptor for efficient access. Also get tty screen + # dimensions since they are fundamental and will probably prove + # useful later. + + T_PADCHAR(tty) = ttygeti (tty, "pc") # returns 0 if field not found + + # Allow environment variables to override physical screen dimensions + # if device is the standard terminal. + + istty = (streq (Memc[devname], terminal)) + + # Get nlines. + if (istty) + iferr (T_NLINES(tty) = envgeti ("ttynlines")) + T_NLINES(tty) = 0 + if (T_NLINES(tty) <= 0) + iferr (T_NLINES(tty) = ttygeti (tty, "li")) + T_NLINES(tty) = 0 + if (T_NLINES(tty) <= 0) + T_NLINES(tty) = DEF_TTYNLINES + + # Get ncols. + if (istty) + iferr (T_NCOLS(tty) = envgeti ("ttyncols")) + T_NCOLS(tty) = 0 + if (T_NCOLS(tty) <= 0) + iferr (T_NCOLS(tty) = ttygeti (tty, "co")) + T_NCOLS(tty) = 0 + if (T_NCOLS(tty) <= 0) + T_NCOLS(tty) = DEF_TTYNCOLS + + # Baud rate may not be right if device is a printer attached to the + # host, and user is working remotely. Nonetheless it is safer to pick + # up the value from the environment than to assume a default. + + iferr (T_BAUD(tty) = envgeti ("ttybaud")) + T_BAUD(tty) = DEF_BAUDRATE + + call sfree (sp) + return (tty) +end -- cgit