sources@genrad.UUCP (12/16/84)
This is part of a distribution of a public domain version of terminfo/curses It is a rather large distribution, so I have broken it up into 11 modules (each less than 64K long.) Each module should end with the line "exit". This code is completely public domain, originally written by Pavel Curtis of Cornell University. This version has some small improvements and bug fixes. This unit contains: doc/Installation - installation guide doc/changes.ms - changes to curses doc/compile.1 - compile the terminfo database doc/dump.1 - dump a compiled terminfo data module Part 2 and 3 will be the rest of the documentation ----------------- cut here ---------------- : Run this shell script with "sh" not "csh" PATH=:/bin:/usr/bin:/usr/ucb export PATH if test ! -d =doc then echo 'Making directory "=doc"' mkdir =doc fi echo 'x - =doc/Installation' sed 's/^X//' <<'//go.sysin dd *' >=doc/Installation How to install Curses/Terminfo on your system (Beta-one test release) --------------------------------------------------------------------- Assumptions: You have unpacked the tar-file into an empty directory. You found this file in a subdirectory of that one called '=doc'. There are three other subdirectories, called '=src', '=test', and '=data'. [ Actually, if you recieved this file as part of the mod.sources distribution, you got this distribution as eleven shar format archive files, which (when passed through "sh" to unbundle them) create the exact same source heirarchy - John Nelson (mod.sources)] If any of these assumptions is false, I make no claims for the correctness of the following instructions. 1. Decide where you want to put the object files and source files of terminal descriptions. On our system (and I recommend it for you), the directory /etc/term is used. If you really can't stand the idea (remember, this is not where the C language source code to the library will go; this is where the actual terminal descriptions and their object files will go), you'll need to do these steps (skip these if you're being reasonable or lazy): a. Keep in mind that this directory should probably be in your root filesystem so that programs which use terminfo can be used even when the system is only up single-user. b. Change the value of the variable SRCDIR in =src/Makefile to the name of the directory you've chosen. c. Change the man pages in =doc to reflect the name-change. 2. Copy everything in the subdirectory =data into the directory chosen in step 1. 3. Change to the subdirectory =src and type 'make'. Absolutely no error-messages should be produced. This should compile the library (two versions, normal and debugging), the terminfo compiler and the dump program. Then type 'make install' to copy the header files into /usr/include, copy the compiler and dump programs into the directory chosen in step 1, and copy the versions of the library into /usr/lib. You will probably need to be super-user to do this. 4. Change to the directory chosen in step 1 and type 'make'. This should compile the database. Again, no error-messages of any sort should be produced. 5. Change to the subdirectory =test and type 'make'. This should compile all of the test programs in the release. Once again, there should be no errors. 6. You may want to install the test programs, make copies of the documentation, etc. NOTES: This release of terminfo/curses will not work on any PDP-11 UNIX systems I know of because the Pre-processor to the C compiler can't hack the number of #define's in term.h. If you get this up on an eleven, let me know. Real systems hackers can probably find a nice constant to change in their cpp code, but I hesitate to try to tell you where to find it. The library is stored in /usr/lib/libncurses.a, unless you changed the Makefile. Note the 'n'!! Programs wishing to use the new package should say "-lncurses" on their 'cc' command while those wanting the old package should still say '-lcurses'. Similarly, the curses header file should be included using #include <ncurses.h> The header file <terminfo.h> has been included so that programs which work only at the terminfo-level need not worry about name conflicts with the rest of the package. By including <terminfo.h> instead of <ncurses.h>, they will get everything needed for the terminfo-level routines. You, dear reader, are truly a guinea pig. If there's anything wrong with this package, these instructions, etc., you're supposed to tell me about it. I'm going to be very depressed if I send this out and get no response at all. So, save me the agony of loneliness and write to me your impressions/complaints/ suggestions! [ actually, this is being posted two years after the original distribution. Most of the bugs should be out, but of course, there are no guarantees - John Nelson (mod.sources) ] Oh, yes. Thank you. Pavel Curtis Computer Science Dept. 405 Upson Hall Cornell University Ithaca, NY 14853 Ph- (607) 256-4934 decvax!cornell!pavel (UUCP) Pavel.Cornell@Udel-Relay (ARPA) //go.sysin dd * echo 'x - =doc/changes.ms' sed 's/^X//' <<'//go.sysin dd *' >=doc/changes.ms X.po +.5i X.TL New Features in Curses and Terminfo X.AU Pavel Curtis X.NH Introduction X.PP This document describes new features that are being added to the Berkeley \fBcurses\fP subroutine package. It also describes the new \fBterminfo\fP database, which replaces the Berkeley \fBtermcap\fP database. The emphasis is on the new features. X.NH New Features in Curses X.PP This section describes the enhancements to curses. Briefly, the enhancements are: X.de Np X.IP \\n+(l%. X.. X.nr l% 0 1 X.af l% a X.Np Curses is smarter. It can take advantage of insert/delete line/character. (By default, it will not use insert/delete line. See \fIidlok()\fR.) X.Np Curses uses the new \fBterminfo\fP data base, as described in the next section. X.Np Curses works on more terminals. X.Np It is possible to use more than one terminal at a time. X.Np Video attributes can be displayed in any combination. X.Np Curses handles terminals with the ``magic cookie'' video attribute glitch. X.Np The function and arrow keys on terminals can be input as though they were a single character. X.Np There is a user accessible scrolling region, like the DEC VT100. X.Np If the programmer restricts his code to a subset of the full curses, the \fBMINICURSES\fP version can be used, which is smaller and faster. X.Np Two routines are provided for setting the tty bits to the proper state for shell escapes and control-Z suspensions. X.Np On systems that support it (currently only 4.1BSD), if the user types something during an update, the update will stop, pending a future update. This is useful when the user hits several keys, each of which causes a good deal of output. X.Np The routine \fBgetstr()\fP is smarter - it handles the users erase and kill characters, and echos its input. X.Np The function \fBlongname()\fP is now useful and actually works. X.Np Nodelay mode allows ``real time'' programs to be written with the same interface on both systems. Setting the flag causes \fBgetch\fP to return -1 if no input is waiting. X.Np Several useful routines are provided to enhance portability. X.NH 2 Curses is Smarter X.PP The algorithm used by curses has been replaced with an algorithm that takes into account insert and delete line and character functions, if available, in the terminal. By default, curses will not use insert/delete line. This was not done for performance reasons, since there is no speed penalty involved. Rather, it was found that some programs do not need this facility, and that if curses uses insert/delete line, the result on the screen can be visually annoying. Since most simple programs using curses do not need this, and since the old curses did not use it, the default is to avoid insert/delete line. Call the routine X.DS \fBidlok(stdscr, TRUE);\fP X.DE to enable insert/delete line, if your application needs it. Insert/delete character is always considered. X.NH 2 Additional Terminals X.PP Curses works on a larger class of terminals than the previous version. Terminfo is able to address the cursor on more kinds of terminals. Curses will work even if absolute cursor addressing is not possible, as long as the cursor can be moved from any location to any other location. It considers local motions, parameterized motions, home, and carriage return. X.PP Curses is still aimed at full duplex, alphanumeric, video terminals. No attempt is made to handle half-duplex, synchronous, hard copy, or bitmapped terminals. X.PP Curses handles terminals with the ``magic cookie glitch'' in their video attributes.\u*\d X.FS \u*\dThis feature is not supported in the current test release. It will be implemented in the official distribution. X.FE This glitch means that a change in video attributes is implemented by storing a ``magic cookie'' in a location on the screen. This ``cookie'' takes up a space, preventing an exact implementation of what the programmer wanted. Curses takes the extra space into account, and moves part of the line to the right, as necessary. In some cases, this will unavoidably result in losing text from the right hand edge of the screen. Existing spaces are taken advantage of. X.NH 2 Multiple Terminals X.PP Some applications need to display text on more than one terminal, controlled by the same process. Even if the terminals are different, the new curses can handle this. X.PP All information about the current terminal is kept in a global variable X.DS \fBstruct screen\fP *SP; X.DE Although the screen structure is hidden from the user, the C compiler will accept declarations of variables which are pointers. The user program should declare one screen pointer variable for each terminal it wishes to handle. The routine X.DS \fBstruct screen * \fInewterm\fR(type, fd) \fBchar\fP *type; XFILE *fp; X.DE will set up a new terminal of the given terminal type which does output on file pointer fp. A call to \fIinitscr()\fP is essentially \fInewterm\fP(\fIgetenv\fP(``TERM''), \fBstdout\fR). A program wishing to use more than one terminal should use \fInewterm()\fP for each terminal and save the value returned as a reference to that terminal. X.PP To switch to a different terminal, call X.DS \fBstruct screen\fP * \fIset_term\fP(term) \fBstruct screen\fP *term; X.DE The old value of SP will be returned. You should not assign directly to SP because certain other global variables must also be changed. X.PP All curses routines always affect the current terminal. To handle several terminals, switch to each one in turn with \fIset_term()\fP, and then access it. Each terminal must be set up with \fInewterm()\fP, and closed down with \fIendwin()\fP. X.NH 2 Video Attributes X.PP Video attributes can be displayed in any combination on terminals with this capability. They are treated as an extension of the standout capability, which is still present. X.PP Each character position on the screen has 16 bits of information associated with it. 7 of these bits are the character to be displayed, leaving separate bits for 9 video attributes. These bits are used for standout, underline, reverse video, blink, dim, bold, blank, protect, and alternate character set. Standout is taken to be whatever highlighting works best on the terminal, and should be used by any program that does not need specific or combined attributes. Underlining, reverse video, blink, dim, and bold are the usual video attributes. Blank means that the character is displayed as a space, for security reasons. Protected and alternate character set are dependent on the particular terminal. The use of these last three bits is subject to change and not recommended. X.PP The routines to use these attributes include X.DS X.ta 2i \fIattrset\fP(attrs) \fIwattrset\fP(attrs) \fIattron\fP(attrs) \fIwattron\fP(attrs) \fIattroff\fP(attrs) \fIwattroff\fP(attrs) \fIstandout\fP() \fIwstandout\fP() \fIstandend\fP() \fIwstandend\fP() X.DE X.PP Attributes, if given, can be any combination of A_STANDOUT, A_UNDERLINE, A_REVERSE, A_BLINK, A_DIM, A_BOLD, A_INVIS, A_PROTECT, and A_ALTCHARSET. These constants, defined in curses.h, can be combined with the C | (or) operator to get multiple attributes. \fIAttrset()\fP sets the current attributes to the given \fIattr\fP; \fIattron()\fP turns on the given \fIattrs\fP in addition to any attributes that are already on; \fIattroff()\fP turns off the given attributes, without affecting any others. \fIstandout()\fP and \fIstandend()\fP are equivalent to \fIattron\fP(A_STANDOUT) and \fIattroff\fP(A_STANDOUT). X.PP Since standout is stored in the 8th bit of the text byte, it is possible to recompile curses so that only 8 bits are stored for each character, making a smaller curses, and still be able to use standout. Also, programs that restrict themselves to the routines \fIstandout()\fP and \fIstandend()\fP will work with both the new and old curses. X.PP If the particular terminal does not have the particular attribute or combination requested, curses will attempt to use some other attribute in its place. If the terminal has no highlighting at all, all attributes will be ignored. X.NH 2 XFunction Keys X.PP Many terminals have special keys, such as arrow keys, keys to erase the screen, insert or delete text, and keys intended for user functions. The particular sequences these terminals send differs from terminal to terminal. Curses allows the programmer to handle these keys. X.PP A program using function keys should turn on the keypad by calling X.DS \fIkeypad\fP(\fBstdscr\fP, TRUE) X.DE at initialization. This will cause special characters to be passed through to the program by the function \fIgetch()\fP. These keys have constants which are defined in curses.h. They have values starting at 0401, so they should not be stored in a \fBchar\fP variable, as significant bits will be lost. X.PP A program using function keys should avoid using the \s-2ESCAPE\s0 key, since most sequences start with escape, creating an ambiguity. Curses will set a one second alarm to deal with this ambiguity, which will cause delayed response to the escape key. It is a good idea to avoid escape in any case, since there is eventually pressure for nearly \fIany\fP screen oriented program to accept arrow key input. X.NH 2 Scrolling Region X.PP There is a user accessible scrolling region, like the DEC VT100. Normally, it is set to the entire window, but the calls X.DS \fIsetscrreg\fP(top, bot) \fIwsetscrreg\fP(win, top, bot) X.DE set the scrolling region for \fBstdscr\fP or the given window to any combination of top and bottom margins. If scrolling has been enabled with \fIscrollok\fP, scrolling will take place only within that window. See the \fICurses Reference Manual\fP for the detailed semantics of this construct. X.NH 2 Mini-Curses\u*\d X.FS \u*\dThis feature is not supported in the current test release. It will be implemented in the official distribution. X.FE X.PP The new curses is bigger than the old one, and has to copy from the current window to an internal screen image for every call to \fIrefresh()\fP. If the programmer is only interested in screen output optimization, and does not want the windowing or input functions, an interface to the lower level routines is available. This will make the program somewhat smaller and faster. The interface is a subset of full curses, so that conversion between the levels is not necessary to switch from mini-curses to full curses. X.PP The subset mainly requires you to avoid use of more than the one window \fBstdscr\fP. Thus, all functions beginning with ``w'' are generally undefined. Certain high level functions that are convenient but not essential are also not available, including \fIprintw()\fP and \fIscanw()\fP Also, the input routine \fIgetch()\fP cannot be used with mini-curses. Features implemented at a low level, such as use of hardware insert/delete line and video attributes, are available in both versions. Also, mode setting routines such as \fIcbreak()\fP and \fInoecho()\fP are allowed. See the manual page for the exact list of routines allowed with mini-curses. X.PP To access mini-curses, add \fB-DMINICURSES\fP to the CFLAGS in your makefile. If you ask for routines that are not in the subset, the loader will print error messages such as X.DS Undefined: no_getch no_waddch X.DE to tell you that the routines \fIgetch()\fP and \fIwaddch()\fP were used but are not available in the subset. Since the preprocessor is involved in the implementation of mini-curses, you must recompile the entire program if you change from one version to the other. Similarly, programs compiled with the old curses must be recompiled for the new curses. X.NH 2 TTY Mode Functions X.PP In addition to the save/restore routines \fIsavetty()\fP and \fIresetty()\fP, standard routines are available for going into and out of normal tty mode. These routines are \fIresetterm()\fP, which puts the terminal back in the mode it was in when curses was started, and \fIfixterm()\fP, which undoes the effects of \fIresetterm()\fP, that is, restores the ``current curses mode''. \fIendwin()\fP automatically calls \fIresetterm()\fP, and the routine to handle control-Z (on 4.1BSD systems with process control) also uses \fIresetterm()\fP and \fIfixterm()\fP. The programmer should use these routines before and after shell escapes, and also if he writes his own routine to handle control-Z. These routines are also available at the \fIterminfo\fP level. X.NH 2 Typeahead Check\u*\d X.FS \u*\dThis feature is not supported in the current test release. It will be implemented in the official distribution. X.FE X.PP On systems that support it (current only 4.1BSD), if the user types something during an update, the update will stop, pending a future update. This is useful when the user rapidly hits several keys, each of which causes a good deal of output. This feature is automatic and cannot be disabled. X.NH 2 Getstr() X.PP The routine \fIgetstr()\fP is smarter. The semantics are slightly different from the old \fIgetstr()\fP, but no incompatibilities are anticipated. No matter what the setting of \fIecho\fP is, strings typed in here are echoed at the current cursor location. The users erase and kill characters are understood and handled. This makes it unnecessary for an interactive program to deal with erase, kill, and echoing when the user is typing a line of text. X.NH 2 Longname() X.PP The function \fIlongname()\fP is now useful and actually works. The previous version required the programmer to call \fItgetent()\fP directly and pass the resulting string, along with a buffer, to \fIlongname()\fP. The string actually returned was the second alias for the terminal, not the long name. X.PP The new \fIlongname()\fP function does not take any arguments. It returns a pointer to a static area containing the actual long name of the terminal. No call to \fItgetent()\fP is needed, in fact, that routine no longer exists. X.NH 2 Nodelay Mode X.PP The call X.DS \fInodelay\fP(\fBstdscr\fP, TRUE) X.DE will put the terminal in ``nodelay mode''. While in this mode, any call to \fIgetch()\fP will return -1 if there is nothing waiting to be read immediately. This is useful for writing programs requiring ``real time'' behavior where the user watches action on the screen and presses a key when he wants something to happen. For example, the cursor can be moving across the screen, and the user can press an arrow key to change direction. This mode is especially useful for games such as PacMan and Space Invaders. X.NH 2 Portability X.PP Several useful routines are provided to enhance portability. While these routines do not directly relate to terminal handling, their implementation is different from system to system, and the differences can be isolated from the user program by including them in curses. X.PP XFunctions \fIerasechar()\fP and \fIkillchar()\fP return the characters which erase one character, and kill the entire input line, respectively. The function \fIbaudrate()\fP will return the current baud rate, as an integer. (For example, at 9600 baud, the integer 9600 will be returned, not the value B9600 from <sgtty.h>.) The routine \fIflushinp()\fP will cause all typeahead to be thrown away. X.NH 2 XFeatures No Longer Supported X.PP In general, an effort has been made to support old features where possible. However, there are some features of the old curses that cannot be supported, due to the change to terminfo, or due to other miscelaneous causes. X.PP The old curses defined a number of two letter variables, such as CM, containing termcap capabilities. These variables are no longer accessible to the user. In general, their semantics are different, as are their names. A program using primarily these variables is really written at the termcap level. Also unavailable are the related variables NONL, GT, and UPPERCASE. X.PP Such programs should be recoded to avoid these capabilities, if at all possible, instead using the higher level curses functions. If this is not possible, recode at the terminfo level. A program making only light use can probably be easily changed to avoid these variables completely. A program at the terminfo level that only needs motion optimization should probably still be recoded to use the high level routines, in order to work on more terminals. If this is not possible, recode at the terminfo level, continuing to use \fImvcur()\fP, which is still supported. It is not necessary to call \fImvcur()\fP to move to the lower left corner of the screen before calling \fIendwin()\fP. X.PP Some programs (notably rogue) use varibles in <curses.h> which begin with an underline. Use of these variables and fields is to be avoided. Most of the internal structures used by curses are hidden from the user. The variables _tty and _tty_ch are no longer accessible. (Since _tty was a version 7 dependent structure, it was not portable to use it anyway.) Useful fields, such as the erase and kill characters, and the baud rate, can be discovered using the portable functions described above. X.NH Termlib-Level Changes X.PP The termcap(3) (termlib) library has been consolidated with the curses(3) library to form a new curses(3) library. The termlib level is very different in the new version. The routines \fItgetent()\fP, \fItgetnum()\fP, \fItgetstr()\fP, and \fItgetflag()\fP are gone. Initialization is instead done by calling X.DS \fIsetupterm\fP(termtype, filedes, errret) \fBchar\fP *termtype; \fBint\fP filedes; \fBint\fP *errret; X.DE This routine takes care of all reading in of capabilities, and any other system dependent initialization. The terminal type can be passed as 0, causing \fIsetupterm()\fP to use \fIgetenv\fP(``TERM'') as a default. \fIerrret\fP is a pointer to an integer used to return a status value. The value returned is 0 if there is no such terminal type, 1 if all went well, or -1 for some trouble. A null pointer can be passed for this value, telling \fIsetupterm()\fP to print an error message and exit if the terminal cannot be found. X.PP When exiting, or calling a shell escape, the user program should call \fIresetterm()\fP to restore the tty modes. After the shell escape, \fIfixterm()\fP can be called to set the tty modes back to their internal settings. These calls are now \fBrequired\fP, since they perform system dependent processing. They do not output the \fBenter_ca_mode\fP and \fBexit_ca_mode\fP strings (\fBti\fP and \fBte\fP in termcap) but should be called at the same times. \fISetupterm()\fP calls \fIfixterm()\fP. X.PP \fItgoto()\fP has been replaced by \fItparm()\fP, which is a more powerful parameterized string mechanism. The \fItgoto()\fP routine is still available for compatibility. \fItputs()\fP is unchanged. X.PP The external variables \fBUP\fP, \fBBC\fP, \fBPC\fP, and \fBospeed\fP no longer exist. The programmer need not worry about these, as their function is now handled internally. X.NH Changes from Termcap to Terminfo X.PP This section describes the extensions in terminfo that were not present in termcap, and the incompatible changes that were made. It is intended for a programmer or termcap author who is familiar with termcap and wishes to become familiar with terminfo. The emphasis is on the database, not on the programmer interface. X.NH 2 Syntax X.PP The first thing you will notice upon scanning terminfo is that it looks cosmetically different from termcap. All the backslashes are gone from ends of lines. Fields are separated with commas instead of colons, and white space after the commas makes them more readable. Continuation lines are now defined as lines beginning with a blank or tab, not lines following a backslash. These changes make terminfo easier to read and to modify. X.NH 2 Names X.PP The names of the capabilities are no longer limited to two letters. There is no longer a hard limit to the names, but an informal limit of 5 characters is used. Since the two letter limit is gone, many of the capabilities have been renamed. They now correspond as closely as possible the the ANSI standard XX3.64. While learning the new set of names will be tricky at first, eventually life will be simpler, since most new terminals use the ANSI abbreviations. X.NH 2 Defaults X.PP A change that is perhaps not so obvious is that certain defaults are no longer implied. In termcap, \er was assumed to be a carriage return unless \fBnc\fP was present, indicating that it did not work, or \fBcr\fP was present, indicating an alternative. In terminfo, if \fBcr\fP is present, the string so given works, otherwise it should be assumed \fInot\fP to work. The \fBbs\fP and \fBbc\fP capabilities are replaced by \fBcub\fP and \fBcub1\fP. (The former takes a parameter, moving left that many spaces. The latter is probably more common in terminals and moves left one space.) \fBnl\fP (linefeed) has been split into two functions: \fBcud1\fP (moves the cursor down one line) and \fBind\fP (scroll forward). \fBcud1\fP applies when the cursor is not on the bottom line, \fBind\fP applies when it is on the bottom line. The bell capability is now explicitly given as \fBbel\fP. X.NH 2 Compilation X.PP The terminfo database is compiled, unlike termcap. This means that a terminfo source file (describing some set of terminals) is processed by the terminfo compiler, producing a binary description of the terminal in a file under /etc/term. The setupterm routine reads in this file. X.PP The advantage to compilation is that starting up a program using terminfo is faster. It is no longer necessary to carry around the variable TERMCAP in the environment. It is actually faster to start up a compiled terminfo \fIwithout\fP the environment variable, than it is to start up an uncompiled termcap \fIwith\fP the environment variable. The increase in speed comes partly from not having to skip past other terminal descriptions, and partly from the compiler having sorted the capabilities into order so that a linear scan can read them in. (The termcap initialization algorithm is quadratic on the size of the capability. The more capabilities you are interested in, the worse this gets. It had gotten to the point where it took 2 CPU seconds on a VAX 11/750 to start up a process using an uncompiled terminfo!) X.PP There exists an environment variable TERMINFO which is taken by the compiler to be the destination directory of the new object files. It is also used by \fIsetupterm()\fP to find an entry for a given terminal. First it looks in the directory given in TERMINFO and, if not found there, checks /etc/term. \fBNote\fP, however, that, unlike the old TERMCAP variable, you may not put the source for an entry in the TERMINFO variable. \fIAll\fP terminfo entries must be compiled. X.NH 2 Parameterised Strings X.PP The old \fItgoto()\fP mechanism, which was designed for cursor addressing only, has been replaced by a more general parameter mechanism, accessed through the function \fItparm()\fP. Since the parameters are not compatible in the terminfo database, a termcap \fBcm\fI description must be converted manually to terminfo. X.PP The new mechanism is based on a stack. % operations are used to push parameters and constants onto the stack, do arithmetic and other operations on the top of the stack, and print out values in various formats. This makes it possible to handle a larger class of terminals, such as the AED 512, which addresses the cursor in terms of pixels, not character positions, and the TEC scope, which numbers the rows and columns from the lower right hand corner of the screen. Any number of parameters from 1 to 9 is possible, whereas \fItgoto()\fP allowed only two parameters. If-then-else testing is possible, as is storage in a limited number of variables. There is no provision for loops or printing strings in any format other than %s. The full details are described in terminfo(5). X.PP A few brief examples are included here to show common conversions. For more examples, compare the termcap \fBcm\fP and terminfo \fBcup\fP entries for your favorite terminal. ``%+ '' (add space and print as a character) would be treated as ``%p1%' '%+%c'', that is, push the first parameter, push space, add the top two numbers on the stack, and output the top item on the stack using character (%c) format. (Of course, for the second parameter, the %p1 must be changed to %p2.) ``%.'' (print as a character) would be ``%p1%c''. ``%d'' (print in decimal) would be ``%p1%d''. As with \fItgoto()\fP, characters standing by themselves (no % sign) are output as is. X.NH 2 More Capabilities X.PP There are a number of new capabilities. The set of new capabilities may vary, depending on the version of termcap you are used to. It is probably worthwhile to read terminfo(5) for a complete list. This section describes capabilities new to terminfo that were never put in termcap. X.PP There are provisions for dealing with more video attributes. Termcap had strings to turn on and off standout and underline modes. Terminfo has these and several more. There are strings to turn on bold, inverse video, blinking, dim, protected, and blanking. Rather than have separate string for turning off each of these, a single capability: \fBsgr0\fP, turns them all off. X.PP The effect of turning on more than one attribute at a time with the separate strings is undefined. A parameterized string, \fBsgr\fP, can be used to turn them on in combination. X.PP More function keys are defined now. There are provisions for f0 through f10 as well as keys such as erase, insert mode, insert line, delete line, delete character, print, and so on. All of these keys can be accessed through curses as if they were single characters. Also, \fBvi\fP version 3.8 has default meanings for many of them. X.PP Several new uses are made of parameterized strings. For example, capabilities exist to move the cursor to a particular column in the current row, a particular row in the current column, and to move left, right, up, or down a given number of spaces. These capabilities make a big difference on some terminals, such as the Tektronix 4025. Also, column addressing is useful for filters that do not know what row they are in, or as a shorter form of cursor addressing when the target is in the same row. X.PP There are now capabilities to turn on and off a local printer, and to print the current page. Also, there are provisions for moving the cursor to and from a status line. These capabilities can be used by a background status program, such as \fIsysline\fP, to keep status information in the status line without bothering foreground processes. This only works on terminals with a writable status line, such as the h19 or tvi950, or on terminals where one can be simulated, such as the hp2626, vt100, or ambassador, by allocating one of the ordinary screen lines for a status line. X.NH 2 How to Convert from Termcap to Terminfo X.PP This section is intended for programmers who need to convert programs that use termcap to the new terminfo database. It describes the steps needed for the conversion. X.PP If you must make the conversion, you are strongly urged to convert to curses, rather than converting to terminfo. The curses interface is higher level and will probably do a better job of optimizing your output. Your program will work on a wider range of terminals if you use curses. It will also become more portable. The effort to convert to curses is probably about the same as to convert to terminfo. X.PP There are some programs for which curses is not a possibility. Curses takes over the CRT screen, and this implies initially clearing the screen. For some programs, such as filters, this may not make sense. Also, if you are writing a special purpose program which uses some terminfo capability that curses does not use, it will probably be necessary to use the terminfo level interface. X.NH 2 Conversion X.PP The first step is to include the headers <curses.h> and <term.h> (in that order). These headers will bring into existence a set of ``variables'' (actually macros) that contain values of capabilities. For example, the macro \fBcursor_address\fP will be defined, replacing the termcap \fBcm\fP capability. You should remove the declarations for all variables you use for capabilities returned by \fItgetflag()\fP, \fItgetnum()\fP, and \fItgetstr()\fP. X.PP The most difficult step is that all variables removed in the previous step must be renamed the standard names. For example, if you stored \fBcm\fP in the variable CM, you would change \fItputs\fP(\fItgoto\fP(\fBCM\fP, i, j), 1, outch) to \fItputs\fP(\fItgoto\fP(\fBcursor_address\fP, i, j), 1, outch). Consult terminfo(5) for a list of standard names. A \fBsed\fP script is often useful for this step. Care must be taken to avoid mention of the variable as part of a longer word (a version of \fBsed\fP supporting the \fBex\fP \<word\> convention is useful here.) Also, you should proofread the results, since sometimes comments and strings get substituted that shouldn't have been. X.PP Remove all your termcap initialization code. This code typically calls \fItgetent()\fP, \fItgetstr()\fP, \fItgetflag()\fP, and \fItgetnum()\fP. You can also remove declarations used only for this initialization, usually including buffers for the entry and string values. Replace it with a single call to \fIsetupterm\fP(0, 1, 0). This call will never return if something goes wrong, that is, if there is no $TERM in the environment or there is no such terminal, the routine will print an error and exit. If you need an error indication passed back for more sophisticated error recovery, pass an integer variable in the third parameter, i.e. setupterm(0, 1, &i). The value returned in \fBi\fP will be the same as that previously returned by \fItgetent()\fP. Other more sophisticated calls to \fIsetupterm()\fP are possible, see the documentation if some terminal other than $TERM or some file descriptor other than \fBstdout\fP are involved. X.PP Before the program exits, insert a call to \fIresetterm()\fP. This will restore the tty modes to their state before setupterm was called, and do any other system dependent exit processing. This routine can also be called before a shell escape, you should call \fIfixterm()\fP after the shell escape to restore the tty modes to those needed by terminfo. (Currently \fIsetupterm()\fP will turn off the XXTABS bit in the tty driver, since some terminals need to send control I for escape sequences. You should be sure to expand any tabs in your software if necessary.) X.PP XFrom the programmers viewpoint, the routine \fItputs()\fP is exactly as in termcap. The padding syntax in the capability is different, but this only affects the capabilities in the terminfo database. No change to a program will be needed for \fItputs()\fP. X.PP The \fItgoto()\fP routine is kept around for upward compatibility, but you should probably replace calls to \fItgoto()\fP by calls to \fItparm()\fP. The call \fItgoto\fP(cap, y, x) will call \fItparm\fP(cap, x, y). Note that the order of the last two arguments is reversed - it was backwards in \fItgoto()\fP from what it probably should have been. In addition to the capability, \fItparm()\fP can now take up to nine parameters, or as few as one. X.PP If you use certain capabilities, there are a few convention changes you should be aware of. These do not affect very many programs, but will require some minor recoding of a few programs. In termcap, the cursor is moved left by control-H if \fBbs\fP is present, otherwise, if \fBbc\fP is present, that character is used. In terminfo, the cursor is moved left with \fBcub1\fP, if present, or by \fBcub\fP, if present. If neither is there, there is no implied control-H. Similarly, termcap assumed that control-M was carriage return unless \fBnc\fP or \fBcr\fP was specified. In terminfo, carriage return is always the string specified by \fBcr\fP, and if not present, there is no carriage return capability. In termcap, linefeed is assumed to both move the cursor down (if it is not on the bottom line) and to scroll one line (if it is on the bottom line), unless \fBns\fP is present. \fBsf\fP and \fBdo\fP capabilities were present but little used, and some software assumed that \fBsf\fP worked with the cursor anywhere on the screen. In terminfo, there is no implied linefeed - moving the cursor down is done with \fBcud1\fP or \fBcud\fP and scrolling is done with \fBind\fP. \fBind\fP is only defined when the cursor is at the bottom of the screen. Finally, the implied control G used to ring the bell unless \fBvb\fP was present has been replaced with an explicit \fBbel\fP. X.PP Replace references in your makefile from -ltermcap or -ltermlib with references to -lcurses. X.PP Now recompile your program. It should run properly using terminfo. X.NH 2 Space Conditions X.PP The expansion of a macro name into a structure reference will probably make your program a bit bigger. If space is a problem, one thing you can do is add \fB-DSINGLE\fP to the CFLAGS in your makefile. This causes the macros to expand to a static reference instead of a dynamic reference, resulting in smaller code. It cannot be used if you intend to involve more than one terminal from a single process. Since very few programs talk to two terminals at once, it is almost always safe to define SINGLE. X.PP If your program was pushing the limit on a small machine, it may not fit with terminfo unless you trim it down some. While the startup routines are faster, they tend to generate larger code than those of termcap. Also, \fItputs()\fP and \fItparm()\fP are more sophisticated and larger. //go.sysin dd * echo 'x - =doc/compile.1' sed 's/^X//' <<'//go.sysin dd *' >=doc/compile.1 X.TH COMPILE 1 Terminfo/Curses X.SH NAME compile \- Compile the terminfo database X.SH SYNOPSIS X.B /etc/term/compile [\fB-v\fR[\fIn\fR]] source-file X.SH DESCRIPTION X.I Compile is the program which translates the source files in the terminfo terminal capability database into their object format. The given X.I file is expected to contain one or more terminfo entries, as described in X.IR terminfo (5). This file is expected to be self-contained, i.e., it may not contain ``\fBuse\fP'' entries which refer to terminals not described fully in the same file. X.PP The object files are normally placed in subdirectories of the directory X/etc/term (see X.IR term (5)), but if the environment variable TERMINFO is defined, it is taken to be the name of an alternate directory to use. X.PP Debugging and tracing information may be obtained by use of the X.B -v flag. The number after the flag controls the amount of debugging information given, according to the following table: X.IP 1 Names of files created and linked X.IP 2 Information related to the ``\fBuse\fR'' facility X.IP 3 Statistics from the hashing algorithm X.IP 5 String-table memory allocations X.IP 7 Entries into the string-table X.IP 8 List of tokens encountered by scanner X.IP 9 All values computed in construction of the hash table X.in -0.5i X.sp If \fIn\fP is not given, it is taken to be one. X.SH FILES X/etc/term/* Default location of object files X.SH SEE ALSO terminfo(5), term(5), dump(1). X.SH AUTHOR Pavel Curtis, Cornell University X.br (decvax!cornell!pavel or Pavel.Cornell@Udel-Relay) X.SH BUGS You tell me. //go.sysin dd * echo 'x - =doc/dump.1' sed 's/^X//' <<'//go.sysin dd *' >=doc/dump.1 X.TH DUMP 1 Terminfo/Curses X.SH NAME dump \- Print the contents of a compiled terminfo file in human-readable form X.SH SYNOPSIS X.B /etc/term/dump file ... X.SH DESCRIPTION X.I Dump reads the given files and decodes their contents to derive a reasonable representation of the terminfo entry which produced the file originally. It should be noted, in case of emergency, that the output of X.I dump is perfectly usable as the input to X.IR compile (1). X.SH SEE ALSO compile(1), term(5), terminfo(5) X.SH AUTHOR Pavel Curtis, Cornell University X.br (decvax!cornell!pavel or Pavel.Cornell@Udel-Relay) //go.sysin dd * exit
sources@genrad.UUCP (12/16/84)
This is part of a distribution of a public domain version of terminfo/curses It is a rather large distribution, so I have broken it up into 11 modules (each less than 64K long.) This code is completely public domain, originally written by Pavel Curtis of Cornell University. This version has some small improvements and bug fixes. This unit contains: doc/manual.tbl.ms - curses documentaion (tbl | nroff -ms) doc/ncurses.3 - curses man page Part 3 will contain the terminfo documentation ----------------- cut here ---------------- : Run this shell script with "sh" not "csh" PATH=:/bin:/usr/bin:/usr/ucb export PATH if test ! -d =doc then echo 'Making directory "=doc"' mkdir =doc fi echo 'x - =doc/manual.tbl.ms' sed 's/^X//' <<'//go.sysin dd *' >=doc/manual.tbl.ms X.po +.5i X.TL The Curses Reference Manual X.AU Pavel Curtis X.NH Introduction X.LP Terminfo is a database describing many capabilities of over 150 different terminals. Curses is a subroutine package which presents a high level screen model to the programmer, while dealing with issues such as terminal differences and optimization of output to change one screenfull of text into another. X.LP Terminfo is based on Berkeley's termcap database, but contains a number of improvements and extensions. Parameterized strings are introduced, making it possible to describe such capabilities as video attributes, and to handle far more unusual terminals than possible with termcap. X.LP Curses is also based on Berkeley's curses package, with many improvements. The package makes use of the insert and delete line and character features of terminals so equipped, and determines how to optimally use these features with no help from the programmer. It allows arbitrary combinations of video attributes to be displayed, even on terminals that leave ``magic cookies'' on the screen to mark changes in attributes. X.NH An Overview of the Package X.NH 2 Terminology X.PP In this document, the following terminology is kept to with reasonable consistency: X.IP \fIwindow\fP 10 An internal representation containing an image of what a section of the terminal screen may look like at some point in time. This subsection can either encompass the entire terminal screen, or any smaller portion down to a single character within that screen. X.IP \fIterminal\fP 10 Sometimes called \fIterminal screen\fP. The package's idea of what the terminal's screen currently looks like, i.e., what the user sees now. This is a special \fIscreen\fP: X.IP \fIscreen\fP 10 This is a subset of windows which are as large as the terminal screen, i.e., they start at the upper left hand corner and encompass the lower right hand corner. One of these, \fIstdscr\fP, is automatically provided for the programmer. X.NH 2 Compiling Programs using the Package X.PP In order to use the library, it is necessary to have certain types and variables defined. Therefore, the programmer must have a line: X.DS X.B "#include <ncurses.h>" X.DE at the top of the program source. The header file X.B <ncurses.h> needs to include X.B <sgtty.h> , so the one should not do so oneself.\u*\d X.FS \u*\dThe screen package also uses the Standard I/O library, so \fB<ncurses.h>\fP includes \fB<stdio.h>\fP. It is redundant (but harmless) for the programmer to do it, too. X.FE Also, compilations should have the following form: X.DS \fBcc\fR [ \fIflags\fR ] file ... \fB\-lbcurses\fR X.DE X.NH 2 Updating the Screen X.PP In order to update the screen optimally, it is necessary for the routines to know what the screen currently looks like and what the programmer wants it to look like next. XFor this purpose, a data type (structure) named \fIWINDOW\fP is defined which describes a window image to the routines, including its starting position on the screen (the (y, x) coordinates of the upper left hand corner) and its size. One of these (called \fIcurscr\fP, for \fIcurrent screen\fP) is a screen image of what the terminal currently looks like. Another screen (called \fIstdscr\fP, for \fIstandard screen\fP) is provided by default to make changes on. X.PP A window is a purely internal representation. It is used to build and store a potential image of a portion of the terminal. It doesn't bear any necessary relation to what is really on the terminal screen. It is more like an array of characters on which to make changes. X.PP When one has a window which describes what some part of the terminal screen should look like, the routine \fIrefresh()\fP (or \fIwrefresh()\fP if the window is not \fIstdscr\fP) is called. \fIRefresh()\fP in the area covered by the window, look like that window. Note, therefore, that changing something on a window \fIdoes not change the terminal\fP. Actual updates to the terminal screen are made only by calling \fIrefresh()\fP or \fIwrefresh()\fP. This allows the programmer to maintain several different ideas of what a portion of the terminal screen should look like. Also, changes can be made to windows in any order, without regard to motion efficiency. Then, at will, the programmer can effectively say ``make it look like this,'' and let the package worry about the best way to do this. X.NH 2 Naming Conventions X.PP As hinted above, the routines can use several windows, but two are automatically given: \fIcurscr\fP, which knows what the terminal looks like, and \fIstdscr\fP, which is what the programmer wants the terminal to look like next. The user should never really access \fIcurscr\fP directly. Changes should be made to the appropriate screen, and then the routine \fIrefresh()\fP (or \fIwrefresh()\fP) should be called. X.PP Many functions are set up to deal with \fIstdscr\fP as a default screen. XFor example, to add a character to \fIstdscr\fP, one calls \fIaddch()\fP with the desired character. If a different window is to be used, the routine \fIwaddch()\fP (for `w'indow-specific \fIaddch()\fP) is provided.\u*\d X.FS \u*\dActually, \fIaddch()\fP is really a ``#define'' macro with arguments, as are most of the ``functions'' which deal with \fIstdscr\fP as a default. X.FE This convention of prepending function names with a ``w'' when they are to be applied to specific windows is consistent. The only routines which do \fInot\fP do this are those to which a window must always be specified. X.PP In order to move the current (y, x) coordinates from one point to another, the routines \fImove()\fP and \fIwmove()\fP are provided. However, it is often desirable to first move and then perform some I/O operation. In order to avoid clumsyness, most I/O routines can be preceded by the prefix ``mv'' and the desired (y, x) coordinates then can be added to the arguments to the function. XFor example, the calls X.DS move(y, x); addch(ch); X.DE can be replaced by X.DS mvaddch(y, x, ch); X.DE and X.DS wmove(win, y, x); waddch(win, ch); X.DE can be replaced by X.DS mvwaddch(win, y, x, ch); X.DE Note that the window description pointer (\fIwin\fP) comes before the added (y, x) coordinates. If such pointers are need, they are always the first parameters passed. X.NH 1 Variables X.PP Many variables which are used to describe the terminal environment are available to the programmer. They are: X.TS expand; lw(6m) lw(8n) lw(50n). type name description _ WINDOW * curscr T{ X.fi current version of the screen (terminal screen). T} WINDOW * stdscr T{ standard screen. Most updates are usually done here. T} int LINES T{ number of lines on the terminal T} int COLS T{ number of columns on the terminal T} int ERR T{ error flag returned by routines on a fail. T} int OK T{ error flag returned by routines when things go right. T} X.TE X.LP There are also several ``#define'' constants and types which are of general usefulness: X.ta 11n X.DS L bool boolean type, actually a ``char'' (e.g., \fIbool doneit;\fR\|) TRUE boolean ``true'' flag (1). XFALSE boolean ``false'' flag (0). X.DE X.NH 1 Usage X.PP This is a description of how to actually use the screen package. In it, we assume all updating, reading, etc. is applied to \fIstdscr\fP. All instructions will work on any window, with changing the function name and parameters as mentioned above. X.NH 2 Starting up X.PP In order to use the screen package, the routines must know about terminal characteristics, and the space for \fIcurscr\fP and \fIstdscr\fP must be allocated. These functions are performed by \fIinitscr()\fP. Since it must allocate space for the windows, it can overflow core when attempting to do so. On this rather rare occasion, \fIinitscr()\fP returns ERR. \fIinitscr()\fP must \fIalways\fP be called before any of the routines which affect windows are used. If it is not, the program will core dump as soon as either \fIcurscr\fP or \fIstdscr\fP are referenced. However, it is usually best to wait to call it until after you are sure you will need it, like after checking for startup errors. Terminal status changing routines like \fInl()\fP and \fIcbreak()\fP should be called after \fIinitscr()\fP. X.PP Now that the screen windows have been allocated, you can set them up for the run. If you want to, say, allow the window to scroll, use \fIscrollok()\fP. If you want the cursor to be left after the last change, use \fIleaveok()\fP. If this isn't done, \fIrefresh()\fP will move the cursor to the window's current (y, x) coordinates after updating it. New windows of your own can be created, too, by using the functions \fInewwin()\fP and \fIsubwin()\fP. \fIdelwin()\fP will allow you to get rid of old windows. X.NH 2 Output X.PP Now that we have set things up, we will want to actually update the terminal. The basic functions used to change what will go on a window are \fIaddch()\fP and \fImove()\fP. \fIaddch()\fP adds a character at the current (y, x) coordinates, returning ERR if it would cause the window to illegally scroll, i.e., printing a character in the lower right-hand corner of a terminal which automatically scrolls if scrolling is not allowed. \fImove()\fP changes the current (y, x) coordinates to whatever you want them to be. It returns ERR if you try to move off the window. As mentioned above, you can combine the two into \fImvaddch()\fP to do both things at once. X.PP The other output functions, such as \fIaddstr()\fP and \fIprintw()\fP, all call \fIaddch()\fP to add characters to the window. X.PP After you have put on the window what you want there, when you want the portion of the terminal covered by the window to be made to look like it, you must call \fIrefresh()\fP. In order to optimize finding changes, \fIrefresh()\fP assumes that any part of the window not changed since the last \fIrefresh()\fP of that window has not been changed on the terminal, i.e., that you have not refreshed a portion of the terminal with an overlapping window. If this is not the case, the routine \fItouchwin()\fP is provided to make it look like the entire window has been changed, thus making \fIrefresh()\fP check the whole subsection of the terminal for changes. X.PP If you call \fIwrefresh()\fP with \fIcurscr()\fP, it will make the screen look like \fIcurscr\fP thinks it looks like. This is useful for implementing a command which would redraw the screen in case it get messed up. X.NH 2 Input X.PP Input is essentially a mirror image of output. The complementary function to \fIaddch()\fP is \fIgetch()\fP which, if echo is set, will call \fIaddch()\fP to echo the character. Since the screen package needs to know what is on the terminal at all times, if characters are to be echoed, the tty must be in raw or cbreak mode. If it is not, \fIgetch()\fP sets it to be cbreak, reads in the character, and then sets it back the way it was. X.NH 2 Miscellaneous X.PP A plethora of other functions exist for maintaining and changing information about the windows. XFor the most part, the descriptions in section 5 should suffice. X.NH 2 XFinishing Up X.PP In order to do certain optimizations, and, on some terminals, to work at all, some things must be done before the screen routines start up. In order to clean up after the routines, the routine \fIendwin()\fP is provided. It restores tty modes to what they were when \fIinitscr()\fP was first called, moves the cursor down to the lower-left corner, etc. Thus, anytime after the call to initscr, \fIendwin()\fP should be called before exiting. X.NH Descriptions of the Functions X.de Lp X.sp X.LP X.. X.LP This section describes all the functions available to the programmer in the curses package. For an alphabetical list, see the manual page \fIncurses\fP(3). X.NH 2 Initialization X.LP These functions are called when initializing a program. X.Lp \fBinitscr\fP() X.br The first function called should always be \fBinitscr\fP. This will determine the terminal type and initialize curses data structures. \fBinitscr\fP also arranges that the first call to \fBrefresh\fP will clear the screen. X.Lp \fBendwin\fP() X.br A program should always call \fBendwin\fP before exiting. This function will restore tty modes, move the cursor to the lower left corner of the screen, reset the terminal into the proper nonvisual mode. X.Lp \fBnewterm\fP(type, fp) X.br A program which outputs to more than one terminal should use \fBnewterm\fP instead of \fBinitscr\fP. \fBnewterm\fP should be called once for each terminal. It returns a variable of type \fBstruct\fP \fBscreen\fP \fB*\fP which should be saved as a reference to that terminal. The arguments are the type of the terminal (a string) and a stdio FILE pointer for output to the terminal. The FILE pointer should be open for both reading and writing, if input from the terminal is desired. The program should also call \fBendwin\fP for each terminal being used. X.Lp \fBset_term\fP(new) X.br This function is used to switch to a different terminal. The screen reference for the new terminal is passed as the parameter. The previous terminal is returned by the function. All other calls affect only the current terminal. X.Lp \fBlongname\fP() X.br This function returns a pointer to a static area containing a verbose description of the current terminal. It is defined only after a call to \fBinitscr\fP or \fBnewterm\fP. X.NH 2 Option Setting X.LP These functions set options within curses. In each case, \fIwin\fP is the window affected, and \fIbf\fP is a boolean flag with value \fBTRUE\fP or \fBFALSE\fP indicating whether to enable or disable the option. All options are initially \fBFALSE.\fP It is not necessary to turn these options off before calling \fBendwin\fP. X.Lp \fBclearok\fP(win,bf) X.br If set, the next call to \fBwrefresh\fP with this window will clear the screen and redraw the entire screen. If \fIwin\fP is \fBcurscr\fP, the next call to \fIwrefresh\fP with any window will cause the screen to be cleared. This is useful when the contents of the screen are uncertain, or in some cases for a more pleasing visual effect. X.Lp \fBidlok\fP(win,bf) X.br If enabled, curses will consider using the hardware insert/delete line feature of terminals so equipped. If disabled, curses will never use this feature. The insert/delete character feature is always considered. Enable this option only if your application needs insert/delete line, for example, for a screen editor. It is disabled by default because insert/delete line is visually annoying when used in applications where it isn't really needed. X.Lp \fBkeypad\fP(win,bf) X.br This option enables the keypad of the users terminal. If enabled, the user can press a function key (such as an arrow key) and \fBgetch\fP will return a single value representing the function key. If disabled, curses will not treat function keys specially. If the keypad in the terminal can be turned on (made to transmit) and off (made to work locally), turning on this option will turn on the terminal keypad. X.Lp \fBleaveok\fP(win,bf) X.br Normally, the hardware cursor is left at the location of the window cursor being refreshed. This option allows the cursor to be left wherever the update happens to leave it. It is useful for applications where the cursor is not used, since it saves cursor motions. If possible, the cursor is made invisible when this option is enabled. X.Lp \fBmeta\fP(win,bf) X.br If enabled, characters returned by \fBgetch\fP are transmitted with all 8 bits, instead of stripping the highest bit. It is useful for extending the non-text command set in applications where the terminal has a meta shift key, such as EMACS. \fINOTE\fP: This function is currently unsupported, due to lack of support in current teletype drivers for 8 bit input in non-raw mode. X.Lp \fBnodelay\fP(win,bf) X.br This option causes \fBgetch\fP to be a non-blocking call. If no input is ready, \fBgetch\fP will return -1. If disabled, \fBgetch\fP will hang until a key is pressed. X.Lp \fBscrollok\fP(win,bf) X.br This option controls what happens when the cursor of a window is moved off the edge of the window, either from a newline on the bottom line, or typing the last character of the last line. If disabled, the cursor is left on the bottom line. If enabled, \fBwrefresh\fP is called on the window, and then the physical terminal and window are scrolled up one line. X.Lp \fBsetscrreg\fP(t,b) X.br \fBwsetscrreg\fP(win,t,b) X.br These functions allow the user to set a software scrolling region in a window \fIwin\fP or \fBstdscr\fP. \fIt\fP and \fIb\fP are the line numbers of the top and bottom margin of the scrolling region. (Line 0 is the top line of the screen.) If this option and \fBscrollok\fP are enabled, an attempt to move off the bottom margin line will cause all lines in the scrolling region to scroll up one line. Note that this has nothing to do with use of a physical scrolling region capability in the terminal, like that in the VT100. Only the text of the window is scrolled. X.LP The scrolling region really acts as a sort of barrier, limiting the area of a window over which changes take place. For this reason, an attempt to create a scrolling region in an area of the screen which does not contain the current (y, x) coordinates for that window is an error. Similarly, attempts to move the (y, x) coordinates out of the region will also fail with an ERR return. X.LP When a scrolling region is in place, all changes are limited to the region. XFor example, \fIerase()\fP will only erase the area inside the region; \fIinsertln()\fP will only shift lines down to the bottom of the region, etc. It is anticipated that this method of controlling the area of change will prove quite handy in a number of applications. X.LP To disable the scrolling region, once defined, simply redefine it to be the whole window. For example, to disable the scrolling region on \fIstdscr\fP, the following call would be used: X.DS \fBsetscrreg(0, LINES - 1)\fP X.DE XFor other windows, the height of the window should be used instead of (LINES - 1). X.NH 2 Terminal Mode Setting X.LP These functions are used to set modes in the tty driver. The initial mode usually depends on the setting when the program was called: the initial modes documented here represenet the normal situation. X.Lp \fBcbreak\fP() X.br \fBnocbreak\fP() X.br \fBcrmode\fP() X.br \fBnocrmode\fP() X.br These functions put the terminal into and out of \fBCBREAK\fP mode. In this mode, characters typed by the user are immediately available to the program. When out of this mode, the teletype driver will buffer characters typed until newline is typed. Interrupt and flow control characters are unaffected by this mode. Initially the terminal is not in \fBCBREAK\fP mode. Most interactive programs using curses will set this mode. X.LP The functions \fBcrmode\fP() and \fBnocrmode\fP() are the result of an accident in the first version of curses and are retained solely for upward compatibility. \fBcrmode\fP() is the same as \fBcbreak\fP() and \fBnocrmode\fP() is the same as \fBnocbreak\fP(). X.Lp \fBraw\fP() X.br \fBnoraw\fP() X.br These functions put the terminal into and out of \fBRAW\fP mode. \fBRAW\fP mode is just like \fBCBREAK\fP mode except that \fIno\fP special character processing is done (e.g. the interrupt character will be passed through to the program, uninterpreted, as will the kill character, etc.) and all 8 bits of the input character are retained; in \fBCBREAK\fP mode, the eighth bit is stripped off before it is given to the program. Because of the lack of interpretation of special characters, it is not recommended that programs use this mode. X.Lp \fBecho\fP() X.br \fBnoecho\fP() X.br These functions control whether characters typed by the user are echoed as typed. Initially, characters typed are echoed by the teletype driver. Authors of most interactive programs prefer to do their own echoing in a controlled area of the screen, or not to echo at all, so they disable echoing. X.Lp \fBnl\fP() X.br \fBnonl\fP() X.br These functions control whether newline is translated into carriage return and linefeed on output, and whether return is translated into newline on input. Initially, the translations do occur. By disabling these translations, curses is able to make better use of the linefeed capability, resulting in faster cursor motion. X.Lp \fBresetty\fP() X.br \fBsavetty\fP() X.br These functions save and restore the state of the tty modes. \fBsavetty\fP saves the current state in a buffer, \fBresetty\fP restores the state to what it was at the last call to \fBsavetty\fP. X.NH 2 Window Manipulation X.LP \fBnewwin\fP(num_lines, num_cols, begy, begx) X.br Create a new window with the given number of lines and columns. The upper left corner of the window is at line \fBbegy\fP column \fBbegx\fP. If either \fInum_lines\fP or \fInum_cols\fP is zero, they will be defaulted to \fBLINES\fP-\fIbegy\fP and \fBCOLS\fP-\fIbegx\fP. A new full-screen window is created by calling \fBnewwin\fP(0,0,0,0). X.Lp \fBsubwin\fP(orig, num_lines, num_cols, begy, begx) X.br Create a new window with the given number of lines and columns. The window is at position (\fIbegy\fP, \fIbegx\fP) on the screen. (It is relative to the screen, not \fIorig\fP.) The window is made in the middle of the window \fIorig\fP, so that changes made to one window will affect both windows. When using this function, often it will be necessary to call \fItouchwin\fP before calling \fIwrefresh\fP. X.Lp \fBdelwin\fP(win) X.br Deletes the named window, freeing up all memory associated with it. In the case of sub-windows, they should be deleted before the main window. X.Lp \fBmvwin\fP(win, by, bx) X.br Move the window so that the upper left corner will be at position (\fIby\fP, \fIbx\fP). If the move would cause the window to be off the screen, it is an error and the window is not moved. X.Lp \fBtouchwin\fP(win) X.br Throw away all optimization information about which parts of the window have been touched, by pretending the entire window has been drawn on. This is sometimes necessary when using overlapping windows, since a change to one window will affect the other window, but the optimization records of the other window will not reflect the change. X.Lp \fBoverlay\fP(win1, win2) X.br \fBoverwrite\fP(win1, win2) X.br These functions overlay \fIwin1\fP on top of \fIwin2\fP, that is, all text in \fIwin1\fP is copied into \fIwin2\fP, after lining up the two windows' origins. The difference between the functions is that \fBoverlay\fP is nondestructive (blanks are not copied) while \fBoverwrite\fP is destructive. X.NH 2 Causing Output to the Terminal X.LP \fBrefresh\fP() X.br \fBwrefresh\fP(win) X.br These functions must be called to actually get any output on the terminal, as other routines merely manipulate data structures. \fBwrefresh\fP copies the named window to the physical terminal screen, taking into account what is already there in order to do optimizations. \fBrefresh\fP is the same, using \fBstdscr\fP as a default screen. Unless \fBleaveok\fP has been enabled, the physical cursor of the terminal is left at the location of the window's cursor. X.Lp \fBdoupdate\fP() X.br \fBwnoutrefresh\fP(win) X.br These two functions allow multiple updates with more efficiency than \fBwrefresh.\fP To use them, it is important to understand how curses works. In addition to all the window structures, curses keeps two data structures representing the terminal screen: a \fIphysical\fP screen, describing what is actually on the screen, and a \fIvirtual\fP screen, describing what the programmer \fIwants\fP to have on the screen. \fBwrefresh\fP works by first copying the named window to the virtual screen (\fBwnoutrefresh\fP), and then calling the routine to update the screen (\fBdoupdate\fP). If the programmer wishes to output several windows at once, a series of calls to \fBwrefresh\fP will result in alternating calls to \fBwnoutrefresh\fP and \fBdoupdate\fP, causing several bursts of output to the screen. By calling \fBwnoutrefresh\fP for each window, it is then possible to call \fBdoupdate\fP once, resulting in only one burst of output, with probably fewer total characters transmitted. X.NH 2 Writing on Window Structures X.LP These routines are used to ``draw'' text on windows. In all cases, a missing \fIwin\fP is taken to be \fBstdscr\fP. \fIy\fP and \fIx\fP are the row and column, respectively. The upper left corner is always (0, 0) not (1, 1). The \fBmv\fP functions imply a call to \fBmove\fP before the call to the other function. X.NH 3 Moving the Cursor X.LP \fBmove\fP(y, x) X.br \fBwmove\fP(win, y, x) X.br The cursor associated with the window is moved to the given location. This does not move the physical cursor of the terminal until \fBrefresh\fP is called. X.NH 3 Writing One Character X.LP \fBaddch\fP(ch) X.br \fBwaddch\fP(win, ch) X.br \fBmvaddch\fP(y, x, ch) X.br \fBmvwaddch\fP(win, y, x, ch) X.br The character \fIch\fP is put in the window at the current cursor position of the window. If \fIch\fP is a tab, newline, or backspace, the cursor will be moved appropriately in the window. If \fIch\fP is a different control character, it will be drawn in the ^X notation. The position of the window cursor is advanced. At the right margin, an automatic newline is performed. At the bottom of the scrolling region, if \fBscrollok\fP is enabled, the scrolling region will be scrolled up one line. X.NH 3 Writing a String X.LP \fBaddstr\fP(str) X.br \fBwaddstr\fP(win,str) X.br \fBmvaddstr\fP(y,x,str) X.br \fBmvwaddstr\fP(win,y,x,str) X.br These functions write all the characters of the null terminated character string \fIstr\fP on the given window. They are identical to a series of calls to \fBaddch\fP. X.NH 3 Clearing Areas of the Screen X.LP \fBerase\fP() X.br \fBwerase\fP(win) X.br These functions copy blanks to every position in the window. X.Lp \fBclear\fP() X.br \fBwclear\fP(win) X.br These functions are like \fBerase\fP and \fBwerase\fP but they also call \fBclearok\fP, arranging that the screen will be cleared on the next \fBrefresh\fP. X.Lp \fBclrtobot\fP() X.br \fBwclrtobot\fP(win) X.br All lines below the cursor in this window are erased. Also, the current line to the right of the cursor is erased. X.Lp \fBclrtoeol\fP() X.br \fBwclrtoeol\fP(win) X.br The current line to the right of the cursor is erased. X.NH 3 Inserting and Deleting Text X.LP \fBdelch\fP() X.br \fBwdelch\fP(win) X.br \fBmvdelch\fP(y,x) X.br \fBmvwdelch\fP(win,y,x) X.br The character under the cursor in the window is deleted. All characters to the right on the same line are moved to the left one position. This does not imply use of the hardware delete character feature. X.Lp \fBdeleteln\fP() X.br \fBwdeleteln\fP(win) X.br The line under the cursor in the window is deleted. All lines below the current line are moved up one line. The bottom line of the window is cleared. This does not imply use of the hardware delete line feature. X.Lp \fBinsch\fP(c) X.br \fBwinsch\fP(win, c) X.br \fBmvinsch\fP(y,x,c) X.br \fBmvwinsch\fP(win,y,x,c) X.br The character \fIc\fP is inserted before the character under the cursor. All characters to the right are moved one space to the right, possibly losing the rightmost character on the line. This does not imply use of the hardware insert character feature. X.Lp \fBinsertln\fP() X.br \fBwinsertln\fP(win) X.br A blank line is inserted above the current line. The bottom line is lost. This does not imply use of the hardware insert line feature. X.NH 3 XFormatted Output X.LP \fBprintw\fP(fmt, args) X.br \fBwprintw\fP(win, fmt, args) X.br \fBmvprintw\fP(y, x, fmt, args) X.br \fBmvwprintw\fP(win, y, x, fmt, args) X.br These functions correspond to \fIprintf\fP. The characters which would be output by \fIprintf\fP are instead output using \fIwaddch\fP on the given window. X.NH 3 Miscelaneous X.LP \fBbox\fP(win, vert, hor) X.br A box is drawn around the edge of the window. \fIvert\fP and \fIhor\fP are the characters the box is to be drawn with. X.Lp \fBscroll\fP(win) X.br The window is scrolled up one line. This involves moving the lines in the window data structure. X.NH 2 Querying the Contents of a Window X.LP \fBgetyx\fP(win,y,x) X.br The cursor position of the window is placed in the two integer variables \fIy\fP and \fIx\fP. Since this is a macro, no & is necessary. X.Lp \fBinch\fP() X.br \fBwinch\fP(win) X.br \fBmvinch\fP(y,x) X.br \fBmvwinch\fP(win,y,x) X.br The character at the current position in the named window is returned. X.NH 2 Input from the Terminal X.LP \fBgetch\fP() X.br \fBwgetch\fP(win) X.br \fBmvgetch\fP(y,x) X.br \fBmvwgetch\fP(win,y,x) X.br A character is read from the terminal associated with the window. In nodelay mode, if there is no input waiting, the value -1 is returned. In delay mode, the program will hang until a character is typed. X.Lp If \fIkeypad\fP mode is enabled, and a function key is pressed, the code for that function key will be returned instead of the raw characters. Possible function keys are defined with integers beginning with 0401, whose names begin with KEY_, defined in <ncurses.h>. If a character is received that could be the beginning of a function key (such as escape), curses will set a one second timer. If the remainder of the sequence does not come in within one second, the character will be passed through, otherwise the function key value will be returned. For this reason, on many terminals, there will be a one second delay after a user presses the escape key. (Use by a programmer of the escape key for a single character function is discouraged.) X.Lp \fBgetstr\fP(str) X.br \fBwgetstr\fP(win,str) X.br \fBmvgetstr\fP(y,x,str) X.br \fBmvwgetstr\fP(win,y,x,str) X.br A series of calls to \fIgetch\fP is made, until a newline is received. The resulting value is placed in the area pointed at by the character pointer \fIstr\fP. The users erase and kill characters are interpreted, and the string is echoed. X.Lp \fBscanw\fP(fmt, args) X.br \fBwscanw\fP(win, fmt, args) X.br \fBmvscanw\fP(y, x, fmt, args) X.br \fBmvwscanw\fP(win, y, x, fmt, args) X.br This function corresponds to \fIscanf\fP. \fIwgetstr\fP is called on the window, and the resulting line is used as input for the scan. X.NH 2 Video Attributes X.LP \fBattroff\fP(at) X.br \fBwattroff\fP(win, attrs) X.br \fBattron\fP(at) X.br \fBwattron\fP(win, attrs) X.br \fBattrset\fP(at) X.br \fBwattrset\fP(win, attrs) X.br \fBstandout\fP() X.br \fBstandend\fP() X.br \fBwstandout\fP(win) X.br \fBwstandend\fP(win) X.br These functions set the \fIcurrent\fP \fIattributes\fP of the named window. These attributes can be any combination of \fBA_STANDOUT\fP, \fBA_REVERSE\fP, \fBA_BOLD\fP, \fBA_DIM\fP, \fBA_BLINK\fP, \fBA_BLANK\fP, \fBA_UNDERLINE\fP, \fBA_PROTECT\fP, and \fBA_ALTCHARSET\fP. These constants are defined in <ncurses.h> and can be combined with the C | (or) operator. X.LP The current attributes of a window are applied to all characters that are written into the window. Attributes are a property of the character, and move with the character through any scrolling and insert/delete line/character operations. To the extent possible on the particular terminal, they will be displayed as the graphic rendition of characters put on the screen. X.LP \fIattrset\fP(at) sets the current attributes of the given window to \fIat\fP. \fIattroff\fP(at) turns off the named attributes without affecting any other attributes. \fIattron\fP(at) turns on the named attributes without affecting any others. \fIstandout\fP is the same as \fIattrset\fP(A_STANDOUT) \fIstandend\fP is the same as \fIattrset\fP(0), that is, it turns off all attributes. X.NH 2 Bells and Flashing Lights X.LP \fBbeep\fP() X.br \fBflash\fP() X.br These functions are used to signal the programmer. \fIbeep\fP will sound the audible alarm on the terminal, if possible, and if not, will flash the screen (visible bell), if that is possible. \fIflash\fP will flash the screen, and if that is not possible, will sound the audible signal. If neither signal is possible, nothing will happen. Nearly all terminals have an audible signal (bell or beep) but only some can flash the screen. X.NH 2 Portability Functions X.LP These functions do not have anything to do with terminal dependent character output, but tend to be needed by programs that use curses. Unfortunately, their implemention varies from one version of UNIX\u*\d to another. They have been included here to enhance the portability of programs using curses. X.FS \u*\d UNIX is a trademark of Bell Laboratories. X.FE X.Lp \fBbaudrate\fP() X.br \fIbaudrate\fP returns the output speed of the terminal. The number returned is the integer baud rate, for example, 9600, rather than a table index such as \fBB9600\fP. X.Lp \fBerasechar\fP() X.br The erase character chosen by the user is returned. This is the character typed by the user to erase the character just typed. X.Lp \fBkillchar\fP() X.br The line kill character chosen by the user is returned. This is the character typed by the user to forget the entire line being typed. X.Lp \fBflushinp\fP() X.br \fIflushinp\fP throws away any typeahead that has been typed by the user and has not yet been read by the program. X.NH 2 Debugging X.LP These functions are useful when debugging a program with curses. X.Lp \fBunctrl\fP(ch) X.br This macro expands to a character string which is a printable representation of the character \fIch\fP. The program must include the file <unctrl.h>. Control characters are displayed in the ^x notation. Printing characters are displayed as is. X.Lp \fBtraceoff\fP() X.br \fBtraceon\fP() X.br It is possible to compile a debugging version of curses with tracing turned on, and with the -g option for sdb. This library may be available on your system as -ldcurses. When using this version, the file ``trace'' will be created each time the program is run, containing verbose information showing each step done by curses. This output is useful for finding bugs in curses, and may be useful for finding bugs in user programs. Since the output is so verbose, with any bug that cannot be easily and quickly reproduced, it may be necessary to turn the debugging output off in some parts of the program. These functions can be used to turn tracing off and back on. When \fIinitscr\fP is first called, tracing is automatically turned on. X.NH 2 Lower Level Functions X.LP These functions are provided for programs not needing the screen optimization capabilities of curses. Programs are discouraged from working at this level, since they must handle various glitches in certain terminals. However, a program can be smaller if it only brings in the low level routines. X.NH 3 Cursor Motion X.Lp \fBgettmode\fP() X.br \fBsetterm\fP(type) X.br These two initialization routines are provided for upward compatibility with the old curses. \fIgettmode\fP does nothing. \fIsetterm\fP results in a call to \fIsetupterm\fP with appropriate arguments. X.Lp \fBmvcur\fP(oldrow, oldcol, newrow, newcol) X.br This routine optimally moves the cursor from (oldrow, oldcol) to (newrow, newcol). The user program is expected to keep track of the current cursor position. Note that unless a full screen image is kept, curses will have to make pessimistic assumptions, sometimes resulting in less than optimal cursor motion. For example, moving the cursor a few spaces to the right can be done by transmitting the characters being moved over, but if curses does not have access to the screen image, it doesn't know what these characters are. X.LP If either of oldcol or oldrow are negative, \fImvcur()\fP will refrain from using any relative motions. This is handy for occasions when a program is unsure as to the current cursor location. X.NH 3 Terminfo Level X.LP These routines are called by low level programs that need access to specific capabilities of terminfo. A program working at this level should include both <ncurses.h> and <term.h>. After a call to \fIsetupterm\fP, the capabilities will be available with macro names defined in <term.h>. See \fBterminfo\fP(5) for a detailed description of the capabilies. If the program only needs to handle one terminal, the definition \fB-DSINGLE\fP can be passed to the C compiler, resulting in static references to capabilities instead of dynamic references. This can result in smaller code, but prevents use of more than one terminal at a time. Very few programs use more than one terminal, so almost all programs can use this flag. X.Lp \fBsetupterm\fP(term, filenum, errret) X.br This routine is called to initialize a terminal. \fIterm\fP is the character string representing the name of the terminal being used. \fIfilenum\fP is the UNIX file descriptor of the terminal being used for output. \fIerrret\fP is a pointer to an integer, in which a success or failure indication is returned. The values returned can be 1 (all is well), 0 (no such terminal), or -1 (some problem locating the terminfo database). X.LP The value of \fIterm\fP can be given as 0, which will cause the value of TERM in the environment to be used. The \fIerrret\fP pointer can also be given as 0, meaning no error code is wanted. If \fIerrret\fP is defaulted, and something goes wrong, \fIsetupterm\fP will print an appropriate error message and exit, rather than returning. Thus, a simple program can call \fIsetupterm\fP(0, 1, 0) and not worry about initialization errors. X.LP \fIsetupterm\fP will check the tty driver mode bits, and change any that might prevent the correct operation of other low level routines. Currently, the mode that expands tabs into spaces is disabled, because the tab character is sometimes used for different functions by different terminals. (Some terminals use it to move right one space. Others use it to address the cursor to row or column 9.) If the system is expanding tabs, \fIsetupterm\fP will remove the definition of the \fBtab\fP and \fBbacktab\fP functions, assuming that since the user is not using hardware tabs, they may not be properly set in the terminal. X.LP After the call to \fIsetupterm\fP, the global variable \fIcur_term\fP is set to point to the current structure of terminal capabilities. By calling \fIsetupterm\fP for each terminal, and saving and restoring \fIcur_term\fP, it is possible for a program to use two or more terminals at once. \fISetupterm\fP also stores the names section of the terminal description in the global character array \fIttytype[]\fP. Subsequent calls to \fIsetupterm\fP will overwrite this array, so you'll have to save it yourself if need be. X.LP The mode that turns newlines into CRLF on output is not disabled. Programs that use \fBcud1\fP or \fBind\fP should avoid these capabilities if their value is linefeed unless they disable this mode. \fIsetupterm\fP calls \fIfixterm\fP after any changes it makes. X.Lp \fBfixterm\fP() X.br \fBresetterm\fP() X.br \fBsaveterm\fP() X.br These routines can be used to change the tty modes between the two states: \fInormal\fP (the mode they were in before the program was started) and \fIprogram\fP (the mode needed by the program). \fIfixterm\fP puts the terminal into program mode, and \fIresetterm\fP puts the terminal into normal mode. These functions are useful for shell escapes and control-Z suspensions. In addition, all programs must call \fIresetterm\fP before they exit. X.LP The routine \fBsaveterm\fP saves the current state of the tty modes so that the next time \fBfixterm\fP is called, the same modes will be used. This is useful for programs which use some of the functions described in section 2.3 to tailor the modes. X.LP Normal mode is stored in \fIcur_term\fP->\fIOttyb\fP, and program mode is in \fIcur_term\fP->\fINttyb\fP. These structures are both of type SGTTYB (which varies depending on the system). Currently the only possible type is \fBstruct\fP \fBsgttyb\fP. X.Lp \fBvidattr\fP(newmode) X.br \fBvidputs\fP(newmode, outc) X.br \fInewmode\fP is any combination of attributes, defined in <ncurses.h>. The proper string to put the terminal in the given video mode is output. The routine \fBvidattr\fP() sends the output characters to \fBputchar\fP; \fBvidputs\fP sends them to the given routine \fIoutc\fP, one character at a time. That routine should therefore expect one \fBchar\fP parameter. The previous mode is remembered by this routine. X.Lp \fBtparm\fP(instring, p1, p2, p3, p4, p5, p6, p7, p8, p9) X.br \fItparm\fP is used to instantiate a parameterized string. The character string returned is suitable for \fItputs\fP. Up to 9 parameters can be passed, in addition to the parameterized string. X.Lp \fBtputs\fP(cp, affcnt, outc) X.br A string capability, possibly containing padding information, is processed. Enough padding characters to delay for the specified time replace the padding specification, and the resulting string is passed, one character at a time, to the routine \fIoutc\fP, which should expect one character parameter. (This routine often just calls \fIputchar\fP.) \fIcp\fP is the capability string. \fIaffcnt\fP is the number of units affected by the capability, which varies with the particular capability. (For example, the \fIaffcnt\fP for \fIinsert_line\fP is the number of lines below the inserted line on the screen, that is, the number of lines that will have to be moved by the terminal.) \fIaffcnt\fP is used by the padding information of some terminals as a multiplication factor. If the capability does not have a factor, the value 1 should be passed. X.Lp \fBputp\fP(str) X.br This is a convenient function to output a capability with no \fIaffcnt\fP. The string is output to \fIputchar\fP with an \fIaffcnt\fP of 1. It can be used in simple applications that do not need to process the output of \fItputs\fP. //go.sysin dd * echo 'x - =doc/ncurses.3' sed 's/^X//' <<'//go.sysin dd *' >=doc/ncurses.3 X.TH NCURSES 3 X.UC 4 X.SH NAME ncurses \- terminal-independent screen management package X.SH SYNOPSIS #include <ncurses.h> X.sp X.B cc [ flags ] files X.B \-lncurses [ libraries ] X.SH DESCRIPTION These routines give the user a method of updating screens with reasonable optimization and terminal independence. They keep an image of the current screen, and the user sets up an image of a new one. Then the X.I refresh() call tells the routines to make the current screen look like the new one. In order to initialize the routines, the routine X.I initscr() must be called before any of the other routines that deal with windows and screens are used. The routine X.I endwin() should be called before exiting. X.SH SEE ALSO X.I "The Curses Reference Manual", Curtis X.br terminfo(5) X.SH AUTHOR Pavel Curtis X.SH FUNCTIONS X.nf X.ds w \fIwin\fR X.ds s \fIstdscr\fR X.ta 3i addch(ch) add a character to \*s addstr(str) add a string to \*s attroff(at) turn off video attributes on \*s attron(at) turn on video attributes on \*s attrset(at) set video attributes on \*s baudrate() return baudrate of current terminal beep() sound audible bell box(win,vert,hor) draw a box around a window cbreak() set cbreak mode crmode() set cbreak mode clear() clear \*s clearok(scr,boolf) set clear flag for \fIscr\fR clrtobot() clear to bottom on \*s clrtoeol() clear to end of line on \*s delch() delete a character deleteln() delete a line delwin(win) delete \*w doupdate() update the physical screen echo() set echo mode endwin() end window modes erase() erase \*s erasechar() return erase character of current terminal fixterm() set terminal into program mode flash() execute visible bell flushinp() flush outstanding input on current terminal getch() get a char through \*s getcap(name) get terminal capability \fIname\fR getstr(str) get a string through \*s gettmode() no-op getyx(win,y,x) get (y,x) coordinates idlok(win,flag) enable insert/delete lines operations inch() get char at current (y,x) coordinates initscr() initialize screens insch(c) insert a char insertln() insert a line keypad(win,flag) enable keypad-sequence mapping killchar() return kill character of current terminal leaveok(win,boolf) set leave flag for \*w longname(termbuf,name) get long name from \fItermbuf\fR meta(win,flag) enable use of the `meta' key move(y,x) move to (y,x) on \*s mvcur(lasty,lastx,newy,newx) actually move cursor newterm(type,fp) initialise a new terminal newwin(lines,cols,begin_y,begin_x)\ create a new window nl() set newline mapping nocbreak() unset cbreak mode nocrmode() unset cbreak mode nodelay(win,flag) make getch() non-blocking noecho() unset echo mode nonl() unset newline mapping noraw() unset raw mode overlay(win1,win2) overlay win1 on win2 overwrite(win1,win2) overwrite win1 on top of win2 printw(fmt,arg1,arg2,...) printf on \*s putp(string) tputs() with affcnt=1 and outc=putchar raw() set raw mode refresh() make current screen look like \*s resetterm() set terminal into normal mode resetty() reset tty flags to stored value savetty() store current tty flags saveterm() save current state of tty scanw(fmt,arg1,arg2,...) scanf through \*s scroll(win) scroll \*w one line scrollok(win,boolf) set scroll flag setscrreg(top,bottom) set up scrolling region on \*s setterm(name) set term variables for name set_term(new) change current terminal setupterm(term,fd,errret) initialise terminal capabilities standend() end standout mode standout() start standout mode subwin(win,lines,cols,begin_y,begin_x)\ create a subwindow touchwin(win) \*(lqchange\*(rq all of \*w tparm(string,p1..p9) instantiate a parameterised string tputs(string,affcnt,outc) process a capability string traceoff() turn off debugging output traceon() turn on debugging output unctrl(ch) printable version of \fIch\fR vidattr(newmode) set terminal's video attributes vidputs(newmode,outc) set video attributes into a function waddch(win,ch) add char to \*w waddstr(win,str) add string to \*w wattroff(win,at) turn off video attributes on \*w wattron(win,at) turn on video attributes on \*w wattrset(win,at) set video attributes on \*w wclear(win) clear \*w wclrtobot(win) clear to bottom of \*w wclrtoeol(win) clear to end of line on \*w wdelch(win,c) delete char from \*w wdeleteln(win) delete line from \*w werase(win) erase \*w wgetch(win) get a char through \*w wgetstr(win,str) get a string through \*w winch(win) get char at current (y,x) in \*w winsch(win,c) insert char into \*w winsertln(win) insert line into \*w wmove(win,y,x) set current (y,x) co-ordinates on \*w wnoutrefresh(win) copy \*w to virtual screen wprintw(win,fmt,arg1,arg2,...)\ printf on \*w wrefresh(win) make screen look like \*w wscanw(win,fmt,arg1,arg2,...)\ scanf through \*w wsetscrreg(win,top,bottom) set up scrolling region on \*w wstandend(win) end standout mode on \*w wstandout(win) start standout mode on \*w //go.sysin dd * exit
sources@genrad.UUCP (12/17/84)
This is part of a distribution of a public domain version of terminfo/curses It is a rather large distribution, so I have broken it up into 11 modules (each less than 64K long.) Each shar format module should end with the line "exit". This code is completely public domain, originally written by Pavel Curtis of Cornell University. This version has some small improvements and bug fixes. This unit contains: doc/term.5 - compiled terminfo data format doc/terminfo.5 - terminfo data base documentation Part 4 will be the first installment of the sources - the terminfo data compiler. ----------------- cut here ---------------- : Run this shell script with "sh" not "csh" PATH=:/bin:/usr/bin:/usr/ucb export PATH if test ! -d =doc then echo 'Making directory "=doc"' mkdir =doc fi echo 'x - =doc/term.5' sed 's/^X//' <<'//go.sysin dd *' >=doc/term.5 X.TH TERM 5 X.SH NAME term \- format of compiled term file. X.SH SYNOPSIS X.B term X.SH DESCRIPTION X.PP Compiled terminfo descriptions are placed under the directory /etc/term. In order to avoid a linear search of a huge UNIX directory, a two level scheme is used: /etc/term/c/name where X.B name is the name of the terminal, and X.B c is the first character of X.BR name . Thus, X.B act4 can be found in the file ``/etc/term/a/act4''. Synonyms for the same terminal are implemented by multiple links to the same compiled file. X.PP The format has been chosen so that it will be the same on all hardware. An 8 or more bit byte is assumed, but no assumptions about byte ordering or sign extension are made. X.PP The compiled file is created with the X.I compile program, and read by the routine X.IR setupterm . Both of these pieces of software are part of X.IR curses (3). The file is divided into six parts: the header, terminal names, boolean flags, numbers, strings, and string table. X.PP The header section begins the file. This section contains six short integers in the format described below. These integers are (1) the magic number (octal 0432); (2) the size, in bytes, of the names section; (3) the number of bytes in the boolean section; (4) the number of short integers in the numbers section; (5) the number of offsets (short integers) in the strings section; (6) the size, in bytes, of the string table. X.PP Short integers are stored in two 8 bit bytes. The first byte contains the least significant 8 bits of the value, and the second byte contains the most significant 8 bits. (Thus, the value represented is 256*second+first.) The value \-1 is represented by 0377, 0377, other negative value are illegal. \-1 generally means that a capability is missing from this terminal. Note that this format corresponds to the hardware of the VAX and PDP-11. Machines where this does not correspond to the hardware read the integers as two bytes and compute the result. X.PP The terminal names section comes next. It contains the first line of the terminfo description, listing the various names for the terminal, separated by the `|' character. The section is terminated with an ASCII NUL character. X.PP The boolean flags have one byte for each flag. This byte is either 0 or 1 as the flag is present or absent. The capabilities are in the same order as the file <term.h>. X.PP Between the boolean section and the number section, a null byte will be inserted, if necessary, to ensure that the number section begins on an even byte. All short integers are aligned on a short word boundary. X.PP The numbers section is similar to the flags section. Each capability takes up two bytes, and is stored as a short integer. If the value represented is \-1, the capability is taken to be missing. X.PP The strings section is also similar. Each capability is stored as a short integer, in the format above. A value of \-1 means the capability is missing. Otherwise, the value is taken as an offset from the beginning of the string table. Special characters in ^X or \ec notation are stored in their interpreted form, not the printing representation. Padding information $<nn> and parameter information %x are stored intact in uninterpreted form. X.PP The final section is the string table. It contains all the values of string capabilities referenced in the string section. Each string is null terminated. X.PP Note that it is possible for X.I setupterm to expect a different set of capabilities than are actually present in the file. Either the database may have been updated since X.I setupterm has been recompiled (resulting in extra unrecognized entries in the file) or the program may have been recompiled more recently than the database was updated (resulting in missing entries). X.I setupterm must be prepared for both possibilities \- this is why the numbers and sizes are included. Also, new capabilities must always be added at the end of the lists of boolean, number, and string capabilities. X.PP As an example, an octal dump of the description for the Microterm ACT 4 is included: X.nf X.sp microterm|act4|microterm act iv, cr=^M, cud1=^J, ind=^J, bel=^G, am, cub1=^H, ed=^_, el=^^, clear=^L, cup=^T%p1%c%p2%c, cols#80, lines#24, cuf1=^X, cuu1=^Z, home=^], X.sp X.in 0 X.ft CW 000 032 001 \e0 025 \e0 \eb \e0 212 \e0 " \e0 m i c r 020 o t e r m | a c t 4 | m i c r o 040 t e r m a c t i v \e0 \e0 001 \e0 \e0 060 \e0 \e0 \e0 \e0 \e0 \e0 \e0 \e0 \e0 \e0 \e0 \e0 \e0 \e0 \e0 \e0 100 \e0 \e0 P \e0 377 377 030 \e0 377 377 377 377 377 377 377 377 120 377 377 377 377 \e0 \e0 002 \e0 377 377 377 377 004 \e0 006 \e0 140 \eb \e0 377 377 377 377 \en \e0 026 \e0 030 \e0 377 377 032 \e0 160 377 377 377 377 034 \e0 377 377 036 \e0 377 377 377 377 377 377 200 377 377 377 377 377 377 377 377 377 377 377 377 377 377 377 377 * 520 377 377 377 377 \e0 377 377 377 377 377 377 377 377 377 377 540 377 377 377 377 377 377 007 \e0 \er \e0 \ef \e0 036 \e0 037 \e0 560 024 % p 1 % c % p 2 % c \e0 \en \e0 035 \e0 600 \eb \e0 030 \e0 032 \e0 \en \e0 X.ft R X.fi X.PP Some limitations: total compiled entries cannot exceed 4096 bytes. The name field cannot exceed 128 bytes. X.SH FILES X/etc/term/*/* compiled terminal capability data base X.SH "SEE ALSO" terminfo(5), curses(3) //go.sysin dd * echo 'x - =doc/terminfo.5' sed 's/^X//' <<'//go.sysin dd *' >=doc/terminfo.5 X.tr || X.TH TERMINFO 5 8/16/82 X.UC 4 X.SH NAME terminfo \- terminal capability data base X.SH SYNOPSIS X/etc/terminfo X.SH DESCRIPTION X.I Terminfo is a data base describing terminals. It is used, for example, by X.IR vi (1) and X.IR curses (3). Terminals are described in X.I terminfo by giving a set of capabilities which they have and by describing how operations are performed. Padding requirements and initialization sequences are included in X.I terminfo. X.PP Entries in X.I terminfo consist of a number of comma-separated fields. White space after each comma is ignored. The first entry for each terminal gives the names which are known for the terminal, separated by `|' characters. The first name given is the most common abbreviation for the terminal, the last name given should be a long name fully identifying the terminal, and all others are understood as synonyms for the terminal name. All names but the last should be in lower case and contain no blanks; the last name may well contain upper case and blanks for readability. X.PP Terminal names (except for the last, verbose entry) should be chosen using the following conventions. The particular piece of hardware making up the terminal should have a root name chosen, thus ``hp2621''. This name should not contain hyphens, except that synonyms may be chosen that do not conflict with other names. Modes that the hardware can be in, or user preferences, should be indicated by appending a hyphen and an indicator of the mode. Thus, a vt100 in 132 column mode would be vt100-w. The following suffixes should be used where possible: X.LP X.nf X.ta 1i 5i \fBSuffix Meaning Example\fP -w Wide mode (more than 80 columns) vt100-w -am With auto. margins (usually default) vt100-am -nam Without automatic margins vt100-nam -\fIn\fP Number of lines on the screen aaa-60 -na No arrow keys (leave them in local) c100-na -\fIn\fPp Number of pages of memory c100-4p -rv Reverse video c100-rv X.fi X.SH CAPABILITIES The variable is the name by which the programmer (at the terminfo level) accesses the capability. The capname is the short name used in the text of the database, and is used by a person updating the database. X.P Capability names have no hard length limit, but an informal limit of 5 characters has been adopted to keep them short. Whenever possible, names are chosen to be the same as or similar to the ANSI X3.64-1979 standard. Semantics are also intended to match those of the specification. X.LP X.nf (P) indicates padding may be specified (G) indicates that the string is passed through tparm with parms as given (#\fIi\fP). (*) indicates that padding may be based on the number of lines affected (#\fIi\fP) indicates the \fIi\fP\uth\d parameter. X.ta \w'enter_alt_charset_mode 'u +\w'Capname 'u \fBVariable Capname Description\fR X.I Booleans: auto_left_margin, bw cub1 wraps from column 0 to last column auto_right_margin, am Terminal has automatic margins beehive_glitch, xsb Beehive (f1=escape, f2=ctrl C) ceol_standout_glitch, xhp Standout not erased by overwriting (hp) eat_newline_glitch, xenl newline ignored after 80 cols (Concept) erase_overstrike, eo Can erase overstrikes with a blank generic_type, gn Generic line type (e.g. dialup, switch). hard_copy, hc Hardcopy terminal has_meta_key, km Has a meta key (shift, sets parity bit) has_status_line, hs Has extra ``status line'' insert_null_glitch, in Insert mode distinguishes nulls memory_above, da Display may be retained above the screen memory_below, db Display may be retained below the screen move_insert_mode, mir Safe to move while in insert mode move_standout_mode, msgr Safe to move in standout modes over_strike, os Terminal overstrikes status_line_esc_ok, eslok Escape can be used on the status line teleray_glitch, xt Tabs destructive, magic so char (Teleray 1061) tilde_glitch, hz Hazeltine; can't print ~'s transparent_underline, ul underline character overstrikes xon_xoff, xon Terminal uses xon/xoff handshaking X.I Numbers: columns, cols Number of columns in a line init_tabs, it Tabs initially every # spaces lines, lines Number of lines on screen or page lines_of_memory, lm Lines of memory if > lines. 0 means varies magic_cookie_glitch, xmc Number of blank chars left by smso or rmso padding_baud_rate, pb Lowest baud rate where cr/nl padding is needed virtual_terminal, vt Virtual terminal number (CB/Unix) width_status_line, wsl No. columns in status line X.I Strings: back_tab, cbt Back tab (P) bell, bel Audible signal (bell) (P) carriage_return, cr Carriage return (P*) change_scroll_region, csr change to lines #1 through #2 (vt100) (PG) clear_all_tabs, tbc Clear all tab stops. (P) clear_screen, clear Clear screen (P*) clr_eol, el Clear to end of line (P) clr_eos, ed Clear to end of display (P*) column_address, hpa Set cursor column (PG) command_character, CC Term. settable cmd char in prototype cursor_address, cup Screen relative cursor motion to row #1 col #2 (PG) cursor_down, cud1 Down one line cursor_home, home Home cursor (if no cup) cursor_invisible, civis Make cursor invisible cursor_left, cub1 Move cursor left one space. cursor_mem_address, mrcup Memory relative cursor addressing cursor_normal, cnorm Make cursor appear normal (undo vs/vi) cursor_right, cuf1 Non-destructive space (cursor right) cursor_to_ll, ll Last line, first column (if no cup) cursor_up, cuu1 Upline (cursor up) cursor_visible, cvvis Make cursor very visible delete_character, dch1 Delete character (P*) delete_line, dl1 Delete line (P*) dis_status_line, dsl Disable status line down_half_line, hd Half-line down (forward 1/2 linefeed) enter_alt_charset_mode, smacs Start alternate character set (P) enter_blink_mode, blink Turn on blinking enter_bold_mode, bold Turn on bold (extra bright) mode enter_ca_mode, smcup String to begin programs that use cup enter_delete_mode, smdc Delete mode (enter) enter_dim_mode, dim Turn on half-bright mode enter_insert_mode, smir Insert mode (enter); enter_protected_mode, prot Turn on protected mode enter_reverse_mode, rev Turn on reverse video mode enter_secure_mode, invis Turn on blank mode (chars invisible) enter_standout_mode, smso Begin stand out mode enter_underline_mode, smul Start underscore mode erase_chars ech Erase #1 characters (PG) exit_alt_charset_mode, rmacs End alternate character set (P) exit_attribute_mode, sgr0 Turn off all attributes exit_ca_mode, rmcup String to end programs that use cup exit_delete_mode, rmdc End delete mode exit_insert_mode, rmir End insert mode exit_standout_mode, rmso End stand out mode exit_underline_mode, rmul End underscore mode flash_screen, flash Visible bell (may not move cursor) form_feed, ff Hardcopy terminal page eject (P*) from_status_line, fsl Return from status line init_1string, is1 Terminal initialization string init_2string, is2 Terminal initialization string init_3string, is3 Terminal initialization string init_file, if Name of file containing is insert_character, ich1 Insert character (P) insert_line, il1 Add new blank line (P*) insert_padding, ip Insert pad after character inserted (P*) key_backspace, kbs Sent by backspace key key_catab, ktbc Sent by clear-all-tabs key. key_clear, kclr Sent by clear screen or erase key. key_ctab, kctab Sent by clear-tab key key_dc, kdch1 Sent by delete character key. key_dl, kdl1 Sent by delete line key. key_down, kcud1 Sent by terminal down arrow key key_eic, krmir Sent by rmir or smir in insert mode. key_eol, kel Sent by clear-to-end-of-line key. key_eos, ked Sent by clear-to-end-of-screen key. key_f0, kf0 Sent by function key f0. key_f1, kf1 Sent by function key f1. key_f10, kf10 Sent by function key f10. key_f2, kf2 Sent by function key f2. key_f3, kf3 Sent by function key f3. key_f4, kf4 Sent by function key f4. key_f5, kf5 Sent by function key f5. key_f6, kf6 Sent by function key f6. key_f7, kf7 Sent by function key f7. key_f8, kf8 Sent by function key f8. key_f9, kf9 Sent by function key f9. key_home, khome Sent by home key. key_ic, kich1 Sent by ins char/enter ins mode key. key_il, kil1 Sent by insert line. key_left, kcub1 Sent by terminal left arrow key key_npage, knp Sent by next-page key key_ppage, kpp Sent by previous-page key key_right, kcuf1 Sent by terminal right arrow key key_sf, kind Sent by scroll-forward/down key key_sr, kri Sent by scroll-backward/up key key_stab, khts Sent by set-tab key key_up, kcuu1 Sent by terminal up arrow key keypad_local, rmkx Out of "keypad transmit" mode keypad_xmit, smkx Put terminal in "keypad transmit" mode label_f0, lf0 Labels on function key f0 if not f0 label_f1, lf1 Labels on function key f1 if not f1 label_f10, lf10 Labels on function key f10 if not f10 label_f2, lf2 Labels on function key f2 if not f2 label_f3, lf3 Labels on function key f3 if not f3 label_f4, lf4 Labels on function key f4 if not f4 label_f5, lf5 Labels on function key f5 if not f5 label_f6, lf6 Labels on function key f6 if not f6 label_f7, lf7 Labels on function key f7 if not f7 label_f8, lf8 Labels on function key f8 if not f8 label_f9, lf9 Labels on function key f9 if not f9 meta_on, smm Turn on "meta mode" (8th bit) meta_off, rmm Turn off "meta mode" newline, nel Newline (behaves like cr followed by lf) pad_char, pad Pad character (rather than null) parm_dch, dch Delete #1 chars (PG*) parm_delete_line, dl Delete #1 lines (PG*) parm_down_cursor, cud Move cursor down #1 lines. (PG*) parm_ich, ich Insert #1 blank chars (PG*) parm_index, indn Scroll forward #1 lines (PG) parm_insert_line, il Add #1 new blank lines (PG*) parm_left_cursor, cub Move cursor left #1 spaces (PG) parm_right_cursor, cuf Move cursor right #1 spaces. (PG*) parm_rindex, rin Scroll backward #1 lines (PG) parm_up_cursor, cuu Move cursor up #1 lines. (PG*) pkey_key, pfkey Prog funct key #1 to type string #2 pkey_local, pfloc Prog funct key #1 to execute string #2 pkey_xmit, pfx Prog funct key #1 to xmit string #2 print_screen, mc0 Print contents of the screen prtr_off, mc4 Turn off the printer prtr_on, mc5 Turn on the printer repeat_char, rep Repeat char #1 #2 times. (PG*) reset_1string, rs1 Reset terminal completely to sane modes. reset_2string, rs2 Reset terminal completely to sane modes. reset_3string, rs3 Reset terminal completely to sane modes. reset_file, rf Name of file containing reset string. restore_cursor, rc Restore cursor to position of last sc. row_address, vpa Vertical position absolute (set row). (PG) save_cursor, sc Save cursor position. (P) scroll_forward, ind Scroll text up (P) scroll_reverse, ri Scroll text down (P) set_attributes, sgr Define the video attributes (PG9) set_tab, hts Set a tab in all rows, current column. set_window, wind Current window is lines #1-#2 cols #3-#4 tab, ht Tab to next 8 space hardware tab stop. to_status_line, tsl Go to status line, column #1 underline_char, uc Underscore one char and move past it up_half_line, hu Half-line up (reverse 1/2 linefeed) X.fi X.PP X.B A Sample Entry X.PP The following entry, which describes the Concept\-100, is among the more complex entries in the X.I terminfo file as of this writing. X.PP X.nf X.ta .3i concept100\||\|c100|\|\|concept\||\|c104\||\|c100-4p\||\|concept 100, is2=\eEU\eEf\eE7\eE5\eE8\eEl\eENH\eEK\eE\e200\eEo&\e200\eEo\e47\eE, cr=^M, cud1=^J, ind=^J, bel=^G, smcup=\eEU\eEv 8p\eEp\er, rmcup=\eEv $<6>\eEp\er\en, il1=\eE^R$<3*>, am, cub1=^H, ed=\eE^C$<16*>, el=\eE^U$<16>, clear=^L$<2*>, cup=\eEa%p1%' '%+%c%p2%' '%+%c, cols#80, dch1=\eE^A$<16*>, dl1=\eE^B$<3*>, rmir=\eE\e200, eo, smir=\eE^P, in, ip=$<16*>, lines#24, mir, cuf1=\eE=, ht=\et$<8>, kbs=^h, ul, cuu1=\eE;, db, smul=\eEG, rmul=\eEg, xenl, cvvis=\eEW, cnorm=\eEw, flash=\eEk$<20>\eEK, pb#9600, vt#8, smul=\eEG, rmul=\eEg, smso=\eEE\eED, rmso=\eEd\eEe, dim=\eEE, rev=\eED, blink=\eEC, prot=\eEI, invis=\eEH, sgr0=\eEN\e200, rep=\eEr%p1%c%p2%' '%+%c$<.2*>, smkx=\eEX, rmkx=\eEx, kcuu1=\eE;, kcud1=\eE<, kcub1=\eE>, kcuf1=\eE=, khome=\eE?, kf1=\eE5, kf2=\eE6, kf3=\eE7, X.fi X.PP Entries may continue onto multiple lines by placing white space at the beginning of each line except the first. Comments may be included on lines beginning with ``#''. Capabilities in X.I terminfo are of three types: Boolean capabilities which indicate that the terminal has some particular feature, numeric capabilities giving the size of the terminal or the size of particular delays, and string capabilities, which give a sequence which can be used to perform particular terminal operations. X.PP X.B Types of Capabilities X.PP All capabilities have short codes. For instance, the fact that the Concept has \*(lqautomatic margins\*(rq (i.e. an automatic return and linefeed when the end of a line is reached) is indicated by the capability \fBam\fR. Hence the description of the Concept includes \fBam\fR. Numeric capabilities are followed by the character `#' and then the value. Thus \fBcols\fR which indicates the number of columns the terminal has gives the value `80' for the Concept. X.PP XFinally, string valued capabilities, such as \fBel\fR (clear to end of line sequence) are given by the two character code, an `=', and then a string ending at the next following `,'. A delay in milliseconds may appear anywhere in such a capability, enclosed in $<..> brackets, as in \fBel\fP=\eEK$<3>, and padding characters are supplied by X.I tputs to provide this delay. The delay can be either a number, e.g. `20', or a number followed by an `*', i.e. `3*'. A `*' indicates that the padding required is proportional to the number of lines affected by the operation, and the amount given is the per-affected-unit padding required. (In the case of insert character, the factor is still the number of X.IR lines affected. This is always one unless the terminal has \fBxenl\fP and the software uses it.) When a `*' is specified, it is sometimes useful to give a delay of the form `3.5' to specify a delay per unit to tenths of milliseconds. (Only one decimal place is allowed.) X.PP A number of escape sequences are provided in the string valued capabilities for easy encoding of characters there. A \fB\eE\fR (or \fB\ee\fP) maps to an \s-2ESCAPE\s0 character, \fB^x\fR maps to a control-x for any appropriate x, and the sequences \fB\en \er \et \eb \ef \es\fR give a newline, return, tab, backspace, formfeed and space, respectively. XFinally, characters may be given as three octal digits after a \fB\e\fR, and the characters \fB^\fR, \fB\e\fR and comma may be given as \fB\e^\fR, \fB\e\e\fR and \fB\e,\fR. X.PP XFor convenience when testing entries, individual capabilities may be easily commented out by directly preceding the name of the capability by a period. Thus the entry X.DT X.nf 33\||\|tty33\||\|tty\||\|model 33 teletype, cr=^M, cud1=^J, .ind=^J, bel=^G, cols#72, hc, os, X.fi X.ad is equivalent to the entry X.DT X.nf 33\||\|tty33\||\|tty\||\|model 33 teletype, cr=^M, cud1=^J, bel=^G, cols#72, hc, os, X.fi X.ad the \fBind\fP capability having been 'commented out'. X.br X.ne 5 X.PP X.B Preparing Descriptions X.PP We now outline how to prepare descriptions of terminals. The most effective way to prepare a terminal description is by imitating the description of a similar terminal in X.I terminfo and to build up a description gradually, using partial descriptions with X.I vi to check that they are correct. Be aware that a very unusual terminal may expose deficiencies in the ability of the X.I terminfo file to describe it or bugs in X.I vi. To easily test a new terminal description you can set the environment variable TERMINFO to a pathname of a file containing the description you are working on and the editor will look there rather than in X.I /etc/terminfo. To get the padding for insert line right (if the terminal manufacturer did not document it) a severe test is to edit /etc/passwd at 9600 baud, delete 16 or so lines from the middle of the screen, then hit the `u' key several times quickly. If the terminal messes up, more padding is usually needed. A similar test can be used for insert character. X.PP X.B Basic capabilities X.PP The number of columns on each line for the terminal is given by the \fBcols\fR numeric capability. If the terminal is a \s-2CRT\s0, then the number of lines on the screen is given by the \fBlines\fR capability. If the terminal wraps around to the beginning of the next line when it reaches the right margin, then it should have the \fBam\fR capability. If the terminal can clear its screen, then this is given by the \fBclear\fR string capability. If the terminal overstrikes (rather than clearing a position when a character is struck over) then it should have the \fBos\fR capability. If the terminal is a printing terminal, with no soft copy unit, give it both X.B hc and X.BR os . X.RB ( os applies to storage scope terminals, such as Tektronix 4010 series, as well as hard copy and APL terminals.) If there is a code to move the cursor to the left edge of the current row, give this as X.BR cr . (Normally this will be carriage return, control M.) If there is a code to produce an audible signal (bell, beep, etc) give this as X.BR bel . X.PP If there is a code to move the cursor one position to the left (such as backspace) that capability should be given as X.BR cub1 . Similarly, codes to move forward, up, and down should be given as X.BR cuf1 , X.BR cuu1 , and X.BR cud1 . These local cursor motions should not alter the text they pass over, for example, you would not normally use `\fBcuf1\fP=\es' because the space would erase the character moved over. X.PP A very important point here is that the local cursor motions encoded in X.I terminfo are undefined at the left and top edges of a \s-2CRT\s0 terminal. Programs should never attempt to backspace around the left edge, unless X.B bw is given, and never attempt to go up locally off the top. In order to scroll text up, a program will go to the bottom of the screen and send the X.B ind (index) string. X.PP To scroll text down, a program goes to the top of the screen and sends the X.B ri (reverse index) string. The strings X.B ind and X.B ri are undefined when not on their respective edges of the screen. X.PP The \fBam\fR capability tells whether the cursor sticks at the right edge of the screen when text is output, but this does not necessarily apply to a X.B cuf1 from the last column. The only local motion which is defined from the left edge is if X.B bw is given, then a X.B cub1 from the left edge will move to the right edge of the previous row. If X.B bw is not given, the effect is undefined. This is useful for drawing a box around the edge of the screen, for example. If the terminal has switch selectable automatic margins, the X.I terminfo file usually assumes that this is on, i.e. \fBam\fR. If the terminal has a command which moves to the first column of the next line, that command can be given as X.B nel (newline). It does not matter if the command clears the remainder of the current line, so if the terminal has no X.B cr and X.B lf it may still be possible to craft a working X.B nel out of one or both of them. X.PP These capabilities suffice to describe hardcopy and \*(lqglass-tty\*(rq terminals. Thus the model 33 teletype is described as X.PP X.DT X.nf 33\||\|tty33\||\|tty\||\|model 33 teletype, cr=^M, cud1=^J, ind=^J, bel=^G, cols#72, hc, os, X.PP while the Lear Siegler \s-2ADM\-3\s0 is described as X.PP X.DT X.nf adm3\||\|3\||\|lsi adm3, cr=^M, cud1=^J, ind=^J, bel=^G, am, cub1=^H, clear=^Z, lines#24, cols#80, X.fi X.PP X.B Parameterized Strings X.PP Cursor addressing and other strings requiring parameters in the terminal are described by a parameterized string capability, with X.IR printf (3s) like escapes \fB%x\fR in it. XFor example, to address the cursor, the X.B cup capability is given, using two parameters: the row and column to address to. (Rows and columns are numbered from zero and refer to the physical screen visible to the user, not to any unseen memory.) If the terminal has memory relative cursor addressing, that can be indicated by X.BR mrcup . X.PP The parameter mechanism uses a stack and special \fB%\fP codes to manipulate it. Typically a sequence will push one of the parameters onto the stack and then print it in some format. Often more complex operations are necessary. X.PP The \fB%\fR encodings have the following meanings: X.PP X.DT X.nf X.ta .5i 1.5i %% outputs `%' %d print pop() as in printf %2d print pop() like %2d %02d print pop() like %02d %3d print pop() like %3d %03d print pop() like %03d %c print pop() like %c %s print pop() like %s %p[1-9] push ith parm %P[a-z] set variable [a-z] to pop() %g[a-z] get variable [a-z] and push it %'c' char constant c %{nn} integer constant nn %+ %- %* %/ %m arithmetic (%m is mod): push(pop() op pop()) %& %| %^ bit operations: push(pop() op pop()) %= %> %< logical operations: push(pop() op pop()) %! %~ unary operations push(op pop()) %i add 1 to first two parms (for ANSI terminals) %? expr %t thenpart %e elsepart %; if-then-else, %e elsepart is optional. else-if's are possible ala Algol 68: %? c1 %t %e c2 %t %e c3 %t %e c4 %t %e %; X.fi X.PP It should be noted that the binary operators above (e.g. %+, %-, %m, etc.) all work in the usual fashion, i.e. X.ce %gx %gy %m yields \fBx mod y\fR not \fBy mod x\fR. X.PP Consider the HP2645, which, to get to row 3 and column 12, needs to be sent \eE&a12c03Y padded for 6 milliseconds. Note that the order of the rows and columns is inverted here, and that the row and column are printed as two digits. Thus its \fBcup\fR capability is \*(lqcup=\eE&%p2%2dc%p1%2dY$<6>\*(rq. X.PP The Microterm \s-2ACT-IV\s0 needs the current row and column sent preceded by a \fB^T\fR, with the row and column simply encoded in binary, \*(lqcup=^T%p1%c%p2%c\*(rq. Terminals which use \*(lq%c\*(rq need to be able to backspace the cursor (\fBcub1\fR), and to move the cursor up one line on the screen (\fBcuu1\fR). This is necessary because it is not always safe to transmit \fB\en\fR, \fB^D\fR and \fB\er\fR, as the system may change or discard them. (The library routines dealing with terminfo set tty modes so that tabs are never expanded, so \et is safe to send. This turns out to be essential for the Ann Arbor 4080.) X.PP A final example is the \s-2LSI ADM\s0-3a, which uses row and column offset by a blank character, thus \*(lqcup=\eE=%p1%' '%+%c%p2%' '%+%c\*(rq. After sending `\eE=', this pushes the first parameter, pushes the ASCII value for a space (32), adds them (pushing the sum on the stack in place of the two previous values) and outputs that value as a character. Then the same is done for the second parameter. More complex arithmetic is possible using the stack. X.PP If the terminal has row or column absolute cursor addressing, these can be given as single parameter capabilities X.B hpa (horizontal position absolute) and X.B vpa (vertical position absolute). Sometimes these are shorter than the more general two parameter sequence (as with the hp2645) and can be used in preference to X.B cup . If there are parameterized local motions (e.g. move X.I n spaces to the right) these can be given as X.BR cud , X.BR cub , X.BR cuf , and X.BR cuu with a single parameter indicating how many spaces to move. These are primarily useful if the terminal does not have X.BR cup , such as the Tektronix 4025. X.PP X.B Cursor motions X.PP If the terminal has a fast way to home the cursor (to very upper left corner of screen) then this can be given as \fBhome\fR; similarly a fast way of getting to the lower left hand corner can be given as \fBll\fR; this may involve going up with \fBcuu1\fR from the home position, but a program should never do this itself (unless \fBll\fR does) because it can make no assumption about the effect of moving up from the home position. Note that the home position is the same as addressing to (0,0): to the top left corner of the screen, not of memory. (Thus, the \eEH sequence on HP terminals cannot be used for X.BR home .) X.PP X.B Area clears X.PP If the terminal can clear from the current position to the end of the line, leaving the cursor where it is, this should be given as \fBel\fR. If the terminal can clear from the current position to the end of the display, then this should be given as \fBed\fR. \fBed\fR is only defined from the first column of a line. (Thus, it can be simulated by a request to delete a large number of lines, if a true X.B ed is not available.) X.PP X.B Insert/delete line X.PP If the terminal can open a new blank line before the line where the cursor is, this should be given as \fBil1\fR; this is done only from the first position of a line. The cursor must then appear on the newly blank line. If the terminal can delete the line which the cursor is on, then this should be given as \fBdl1\fR; this is done only from the first position on the line to be deleted. Versions of X.B il1 and X.B dl1 which take a single parameter and insert or delete that many lines can be given as X.B il and X.BR dl . If the terminal has a settable scrolling region (like the vt100) the command to set this can be described with the X.B csr capability, which takes two parameters: the top and bottom lines of the scrolling region. The cursor position is, alas, undefined after using this command. It is possible to get the effect of insert or delete line using this command \- the X.B sc and X.B rc (save and restore cursor) commands are also useful. Inserting lines at the top or bottom of the screen can also be done using X.B ri or X.B ind on many terminals without true insert/delete line, and are often faster even on terminals with those features. X.PP If the terminal has the ability to define a window as part of memory, which all commands affect, it should be given as the parameterized string X.BR wind . The four parameters are the starting and ending lines in memory and the starting and ending columns in memory, in that order. X.PP If the terminal can retain display memory above then the \fBda\fR capability should be given; if display memory can be retained below then \fBdb\fR should be given. These indicate that deleting a line or scrolling may bring non-blank lines up from below or that scrolling back with \fBri\fR may bring down non-blank lines. X.PP X.B Insert/delete character X.PP There are two basic kinds of intelligent terminals with respect to insert/delete character which can be described using X.I terminfo. The most common insert/delete character operations affect only the characters on the current line and shift characters off the end of the line rigidly. Other terminals, such as the Concept 100 and the Perkin Elmer Owl, make a distinction between typed and untyped blanks on the screen, shifting upon an insert or delete only to an untyped blank on the screen which is either eliminated, or expanded to two untyped blanks. You can find out which kind of terminal you have by clearing the screen and then typing text separated by cursor motions. Type \*(lqabc\ \ \ \ def\*(rq using local cursor motions (not spaces) between the \*(lqabc\*(rq and the \*(lqdef\*(rq. Then position the cursor before the \*(lqabc\*(rq and put the terminal in insert mode. If typing characters causes the rest of the line to shift rigidly and characters to fall off the end, then your terminal does not distinguish between blanks and untyped positions. If the \*(lqabc\*(rq shifts over to the \*(lqdef\*(rq which then move together around the end of the current line and onto the next as you insert, you have the second type of terminal, and should give the capability \fBin\fR, which stands for \*(lqinsert null\*(rq. While these are two logically separate attributes (one line vs. multi line insert mode, and special treatment of untyped spaces) we have seen no terminals whose insert mode cannot be described with the single attribute. X.PP Termcap can describe both terminals which have an insert mode, and terminals which send a simple sequence to open a blank position on the current line. Give as \fBsmir\fR the sequence to get into insert mode. Give as \fBrmir\fR the sequence to leave insert mode. Now give as \fBich1\fR any sequence needed to be sent just before sending the character to be inserted. Most terminals with a true insert mode will not give \fBich1\fR, terminals which send a sequence to open a screen position should give it here. (Insert mode is usually preferable to the sequence to open a position on the screen if your terminal has both.) If post insert padding is needed, give this as a number of milliseconds in \fBip\fR (a string option). Any other sequence which may need to be sent after an insert of a single character may also be given in \fBip\fR. If your terminal needs both to be placed into an `insert mode' and a special code to precede each inserted character, then both X.BR smir / rmir and X.B ich1 can be given, and both will be used. The X.B ich capability, with one parameter, X.IR n , will repeat the effects of X.B ich1 X.I n times. X.PP It is occasionally necessary to move around while in insert mode to delete characters on the same line (e.g. if there is a tab after the insertion position). If your terminal allows motion while in insert mode you can give the capability \fBmir\fR to speed up inserting in this case. Omitting \fBmir\fR will affect only speed. Some terminals (notably Datamedia's) must not have \fBmir\fR because of the way their insert mode works. X.PP XFinally, you can specify X.B dch1 to delete a single character, X.B dch with one parameter, X.IR n , to delete X.I n characters, and delete mode by giving \fBsmdc\fR and \fBrmdc\fR to enter and exit delete mode (any mode the terminal needs to be placed in for X.B dch1 to work). X.PP A command to erase X.I n characters (equivalent to outputting X.I n blanks without moving the cursor) can be given as X.B ech with one parameter. X.PP X.B "Highlighting, underlining, and visible bells" X.PP If your terminal has one or more kinds of display attributes, these can be represented in a number of different ways. You should choose one display form as X.I standout mode , representing a good, high contrast, easy on the eyes, format for highlighting error messages and other attention getters. (If you have a choice, reverse video plus half bright is good, or reverse video alone.) The sequences to enter and exit standout mode are given as \fBsmso\fR and \fBrmso\fR respectively. If the code to change into or out of standout mode leaves one or even two blank spaces on the screen, as the TVI 912 and Teleray 1061 do, then \fBxmc\fR should be given to tell how many spaces are left. X.PP Codes to begin underlining and end underlining can be given as \fBsmul\fR and \fBrmul\fR respectively. If the terminal has a code to underline the current character and move the cursor one space to the right, such as the Microterm Mime, this can be given as \fBuc\fR. X.PP Other capabilities to enter various highlighting modes include X.B blink (blinking) X.B bold (bold or extra bright) X.B dim (dim or half bright) X.B invis (blanking or invisible text) X.B prot (protected) X.B rev (reverse video) X.B sgr0 (turn off X.I all attribute modes) X.B smacs (enter alternate character set mode) and X.B rmacs (exit alternate character set mode). Turning on any of these modes singly may or may not turn off other modes. X.PP If there is a sequence to set arbitrary combinations of modes, this should be given as X.B sgr (set attributes), taking 9 parameters. Each parameter is either 0 or 1, as the corresponding attribute is on or off. The 9 parameters are, in order: standout, underline, reverse, blink, dim, bold, invis, protect, alternate character set. Not all modes need be supported by X.BR sgr , only those for which corresponding separate attribute commands exist. X.PP Terminals with the ``magic cookie'' glitch X.RB ( xmc ) deposit special ``cookies'' when they receive mode setting sequences, which affect the display algorithm, rather than having extra bits for each character. Some terminals, such as the HP 2621, automatically leave standout mode when they move to a new line or the cursor is addressed. Programs using standout mode should exit standout mode before moving the cursor or sending a newline, unless the X.B msgr capability, asserting that it is safe to move in standout mode, is present. X.PP If the terminal has a way of flashing the screen to indicate an error quietly (a bell replacement) then this can be given as \fBflash\fR; it must not move the cursor. X.PP If the cursor needs to be made more visible than normal when it is not on the bottom line (to make, for example, a non-blinking underline into an easier to find block or blinking underline) give this sequence as X.BR cvvis . If there is a way to make the cursor completely invisible, give that as X.BR civis . The capability X.BR cnorm should be given which undoes the effects of both of these modes. X.PP If the terminal needs to be in a special mode when running a program that uses these capbilities, the codes to enter and exit this mode can be given as \fBsmcup\fR and \fBrmcup\fR. This arises, for example, from terminals like the Concept with more than one page of memory. If the terminal has only memory relative cursor addressing and not screen relative cursor addressing, a one screen-sized window must be fixed into the terminal for cursor addressing to work properly. This is also used for the Tektronix 4025, where X.B smcup sets the command character to be the one used by terminfo. X.PP If your terminal correctly generates underlined characters (with no special codes needed) even though it does not overstrike, then you should give the capability \fBul\fR. If overstrikes are erasable with a blank, then this should be indicated by giving \fBeo\fR. X.PP X.B Keypad X.PP If the terminal has a keypad that transmits codes when the keys are pressed, this information can be given. Note that it is not possible to handle terminals where the keypad only works in local (this applies, for example, to the unshifted HP 2621 keys). If the keypad can be set to transmit or not transmit, give these codes as \fBsmkx\fR and \fBrmkx\fR. Otherwise the keypad is assumed to always transmit. The codes sent by the left arrow, right arrow, up arrow, down arrow, and home keys can be given as \fBkcub1, kcuf1, kcuu1, kcud1, \fRand\fB khome\fR respectively. If there are function keys such as f0, f1, ..., f10, the codes they send can be given as \fBkf0, kf1, ..., kf10\fR. If these keys have labels other than the default f0 through f10, the labels can be given as \fBlf0, lf1, ..., lf10\fR. The codes transmitted by certain other special keys can be given: X.B kbs (backspace), X.B ktbc (clear all tabs), X.B kctab (clear the tab stop in this column), X.B kclr (clear screen or erase key), X.B kdch1 (delete character), X.B kdl1 (delete line), X.B krmir (exit insert mode), X.B kel (clear to end of line), X.B ked (clear to end of screen), X.B kich1 (insert character or enter insert mode), X.B kil1 (insert line), X.B knp (next page), X.B kpp (previous page), X.B kind (scroll forward/down), X.B kri (scroll backward/up), X.B khts (set a tab stop in this column). X.PP X.B Tabs and Initialization X.PP If the terminal has hardware tabs, the command to advance to the next tab stop can be given as X.B ht (usually control I). A ``backtab'' command which moves leftward to the next tab stop can be given as X.BR cbt . By convention, if the teletype modes indicate that tabs are being expanded by the computer rather than being sent to the terminal, programs should not use X.B ht or X.B cbt even if they are present, since the user may not have the tab stops properly set. If the terminal has hardware tabs activated by control I, then X.B tabs is given, in addition to X.BR ht . This is normally used by the X.IR tset (1) command to determine whether to set the mode for hardware tab expansion. X.PP Other capabilities include X.BR is1 , X.BR is2 , and X.BR is3 , initialization strings for the terminal, and \fBif\fR, the name of a file containing long initialization strings. These strings are expected to set the terminal into modes consistent with the rest of the terminfo description. They are normally sent to the terminal, by the X.IR tset (1) program, each time the user logs in. They will be printed in the following order: X.BR is1 ; X.BR is2 ; setting tabs using X.B tbc and X.BR hts ; X.BR if ; and finally X.BR is3 . Most initialization is done with X.B is2 . Special terminal modes can be set up without duplicating strings by putting the common sequences in X.B is2 and special cases in X.B is1 and X.BR is3 . A pair of sequences that does a harder reset from a totally unknown state can be analogously given as X.BR rs1 , X.BR rs2 , X.BR rf , and X.BR rs3 , analogous to X.B is2 and X.BR if . These strings are output by the X.IR reset (1) program, which is used when the terminal gets into a wedged state. Commands are normally placed in X.B rs2 and X.B rf only if they produce annoying effects on the screen and are not necessary when logging in. XFor example, the command to set the vt100 into 80 column mode would normally be part of X.BR is2 , but it causes an annoying glitch of the screen and is not normally needed since the terminal is usually already in 80 column mode. X.PP If there are commands to set and clear tab stops, they can be given as X.B tbc (clear all tab stops) and X.B hts (set a tab stop in the current column of every row). If a more complex sequence is needed to set the tabs than can be described by this, the sequence can be placed in X.B is2 or X.BR if . X.PP X.B Delays X.PP Certain capabilities control padding in the teletype driver. These are primarily needed by hard copy terminals, and are used by the X.IR tset (1) program to set teletype modes appropriately. Delays embedded in the capabilities X.B cr , X.B ind , X.B cub1 , X.B ff , and X.B tab will cause the appropriate delay bits to be set in the teletype driver. If X.B pb (padding baud rate) is given, these values can be ignored at baud rates below the value of X.B pb . X.PP X.B Miscellaneous X.PP If the terminal requires other than a null (zero) character as a pad, then this can be given as \fBpad\fR. Only the first character of the X.B pad string is used. X.PP If the terminal has an extra ``status line'' that is not normally used by software, this fact can be indicated. If the status line is viewed as an extra line below the bottom line, into which one can cursor address normally, (such as the Heathkit h19's 25th line, or the 24th line of a vt100 which is set to a 23 line scrolling region) the capability X.B hs should be given. Special strings to go to the beginning of the status line and to return from the status line can be given as X.B tsl and X.BR fsl . X.RB ( fsl must leave the cursor position in the same place it was before X.BR tsl .) X.B tsl takes one parameter, which is the column number of the status line the cursor is to be moved to. If escape sequences and other special commands, such as tab, work while in the status line, the flag X.B eslok can be given. A string which turns off the status line (or otherwise erases its contents) should be given as X.B dsl . If the terminal has commands to save and restore the position of the cursor, give them as X.B sc and X.BR rc . The status line is normally assumed to be the same width as the rest of the screen, e.g. X.B cols . If the status line is a different width (possibly because the terminal does not allow an entire line to be loaded) the width, in columns, can be indicated with the numeric parameter X.B wsl . X.PP If the terminal can move up or down half a line, this can be indicated with X.B hu (half line up) and X.B hd (half line down). This is primarily useful for superscripts and subscripts on hardcopy terminals. If a hardcopy terminal can eject to the next page (form feed), give this as X.B ff (usually control L). X.PP If there is a command to repeat a given character a given number of times (to save time transmitting a large number of identical characters) this can be indicated with the parameterized string X.BR rep . The first parameter is the character to be repeated and the second is the number of times to repeat it. Thus, tparm(repeat_char, 'x', 10) is the same as `xxxxxxxxxx'. X.PP If the terminal has a settable command character, such as the Tektronix 4025, this can be indicated with X.BR CC . A prototype command character is chosen which is used in all capabilities. This character is given in the X.B CC capability to identify it. The following convention is supported on some UNIX systems: The environment is to be searched for a X.B CC variable, and if found, all occurrances of the prototype character are replaced with the character in the environment variable. X.PP Terminal descriptions that do not represent a specific kind of known terminal, such as X.IR switch , X.IR dialup , X.IR patch , and X.IR network , should include the X.B gn (generic) capability so that programs can complain that they don't know how to talk to the terminal. (This capability does not apply to X.I virtual terminal descriptions for which the escape sequences are known.) X.PP If the terminal uses xon/xoff handshaking for flow control, give X.BR xon . Padding information should still be included so that routines can make better decisions about costs, but actual pad characters may not be transmitted. X.PP If the terminal has a ``meta key'' which acts as a shift key, setting the 8th bit of any character transmitted, this fact can be indicated with X.BR km . Otherwise, software will assume that the 8th bit is parity and it will usually be cleared. If strings exist to turn this ``meta mode'' on and off, they can be given as X.B smm and X.BR rmm . X.PP If the terminal has more lines of memory than will fit on the screen at once, the number of lines of memory can be indicated with X.BR lm . A value of 0 indicates that the number of lines is not fixed, but that there is still more memory than fits on the screen. X.PP If the terminal is one of those supported by the CB-UNIX virtual terminal protocol, the terminal number can be given as X.BR vt . X.PP Media copy strings which control an auxillary printer connected to the terminal can be given as X.BR mc0 : print the contents of the screen, X.BR mc4 : turn on the printer, and X.BR mc5 : turn off the printer. When the printer is on, all text sent to the terminal will be sent to the printer. It is undefined whether the text is also displayed on the terminal screen when the printer is on. X.PP Strings to program function keys can be given as X.BR pfkey , X.BR pfloc , and X.BR pfx . Each of these strings takes two parameters: the function key number to program (from 0 to 10) and the string to program it with. XFunction key numbers out of this range may program undefined keys in a terminal dependent manner. The difference between the capabilities is that X.B pfkey causes pressing the given key to be the same as the user typing the given string, X.B pfloc causes the string to be executed by the terminal in local, and X.B pfx causes the string to be transmitted to the computer. X.PP X.B Glitches and Braindamage X.PP Hazeltine terminals, which don't allow `~' characters to be displayed should indicate \fBhz\fR. X.PP Terminals which ignore a linefeed immediately after an \fBam\fR wrap, such as the Concept and vt100, should indicate \fBxenl\fR. X.PP If X.B el is required to get rid of standout (instead of merely writing normal text on top of it), \fBxhp\fP should be given. X.PP Teleray terminals, where tabs turn all characters moved over to blanks, should indicate \fBxt\fR (destructive tabs). This glitch is also taken to mean that it is not possible to position the cursor on top of a ``magic cookie'', that to erase standout mode it is instead necessary to use delete and insert line. X.PP The Beehive Superbee, which is unable to correctly transmit the escape or control C characters, has X.BR xsb , indicating that the f1 key is used for escape and f2 for control C. (Only certain superbees have this problem, depending on the ROM.) X.PP Other specific terminal problems may be corrected by adding more capabilities of the form \fBx\fIx\fR. X.PP X.B Similar Terminals X.PP If there are two very similar terminals, one can be defined as being just like the other with certain exceptions. The string capability \fBuse\fR can be given with the name of the similar terminal. The capabilities given before X.B use override those in the terminal type invoked by X.BR use . A capability can be cancelled with \fBxx@\fR where xx is the capability. XFor example, the entry X.PP 2621-nl, smkx@, rmkx@, use=2621, X.PP defines a 2621-nl that does not have the \fBsmkx\fR or \fBrmkx\fR capabilities, and hence does not turn on the function key labels when in visual mode. This is useful for different modes for a terminal, or for different user preferences. An terminal may have as many \fBuse\fR entries as needed. They are handled in the order given in the description, that is, later X.BR use 's will not overwrite capabilities defined earlier in the entry. X.SH FILES X.DT X/etc/terminfo file containing terminal descriptions X.br X/etc/term/?/* directories containing compiled descriptions X.SH SEE ALSO ex(1), curses(3), tset(1), vi(1), ul(1), more(1) X.SH AUTHOR Pavel Curtis //go.sysin dd * exit
sources@genrad.UUCP (12/17/84)
This is part of a distribution of a public domain version of terminfo/curses It is a rather large distribution, so I have broken it up into 11 modules (each less than 64K long.) Each shar format module should end with the line "exit". This code is completely public domain, originally written by Pavel Curtis of Cornell University. This version has some small improvements and bug fixes. This unit contains: The terminfo compiler (actually two header files are missing - they will be supplied in the next module). Part 5 will contain the rest of the headers, the Makefile, and some awk scripts for transforming the sources when the Caps file changes. ----------------- cut here ---------------- : Run this shell script with "sh" not "csh" PATH=:/bin:/usr/bin:/usr/ucb export PATH if test ! -d =src then echo 'Making directory "=src"' mkdir =src fi echo 'x - =src/comp_captab.c' sed 's/^X//' <<'//go.sysin dd *' >=src/comp_captab.c X/* * comp_captab.c -- The names of the capabilities in a form ready for * the making of a hash table for the compiler. * */ #include "compiler.h" #include "term.h" struct name_table_entry cap_table[] = { 0, "bw", BOOLEAN, 0, 0, "am", BOOLEAN, 1, 0, "xsb", BOOLEAN, 2, 0, "xhp", BOOLEAN, 3, 0, "xenl", BOOLEAN, 4, 0, "eo", BOOLEAN, 5, 0, "gn", BOOLEAN, 6, 0, "hc", BOOLEAN, 7, 0, "km", BOOLEAN, 8, 0, "hs", BOOLEAN, 9, 0, "in", BOOLEAN, 10, 0, "da", BOOLEAN, 11, 0, "db", BOOLEAN, 12, 0, "mir", BOOLEAN, 13, 0, "msgr", BOOLEAN, 14, 0, "os", BOOLEAN, 15, 0, "eslok", BOOLEAN, 16, 0, "xt", BOOLEAN, 17, 0, "hz", BOOLEAN, 18, 0, "ul", BOOLEAN, 19, 0, "xon", BOOLEAN, 20, 0, "cols", NUMBER, 0, 0, "it", NUMBER, 1, 0, "lines", NUMBER, 2, 0, "lm", NUMBER, 3, 0, "xmc", NUMBER, 4, 0, "pb", NUMBER, 5, 0, "vt", NUMBER, 6, 0, "wsl", NUMBER, 7, 0, "nlab", NUMBER, 8, 0, "lh", NUMBER, 9, 0, "lw", NUMBER, 10, 0, "cbt", STRING, 0, 0, "bel", STRING, 1, 0, "cr", STRING, 2, 0, "csr", STRING, 3, 0, "tbc", STRING, 4, 0, "clear", STRING, 5, 0, "el", STRING, 6, 0, "ed", STRING, 7, 0, "hpa", STRING, 8, 0, "CC", STRING, 9, 0, "cup", STRING, 10, 0, "cud1", STRING, 11, 0, "home", STRING, 12, 0, "civis", STRING, 13, 0, "cub1", STRING, 14, 0, "mrcup", STRING, 15, 0, "cnorm", STRING, 16, 0, "cuf1", STRING, 17, 0, "ll", STRING, 18, 0, "cuu1", STRING, 19, 0, "cvvis", STRING, 20, 0, "dch1", STRING, 21, 0, "dl1", STRING, 22, 0, "dsl", STRING, 23, 0, "hd", STRING, 24, 0, "smacs", STRING, 25, 0, "blink", STRING, 26, 0, "bold", STRING, 27, 0, "smcup", STRING, 28, 0, "smdc", STRING, 29, 0, "dim", STRING, 30, 0, "smir", STRING, 31, 0, "invis", STRING, 32, 0, "prot", STRING, 33, 0, "rev", STRING, 34, 0, "smso", STRING, 35, 0, "smul", STRING, 36, 0, "ech", STRING, 37, 0, "rmacs", STRING, 38, 0, "sgr0", STRING, 39, 0, "rmcup", STRING, 40, 0, "rmdc", STRING, 41, 0, "rmir", STRING, 42, 0, "rmso", STRING, 43, 0, "rmul", STRING, 44, 0, "flash", STRING, 45, 0, "ff", STRING, 46, 0, "fsl", STRING, 47, 0, "is1", STRING, 48, 0, "is2", STRING, 49, 0, "is3", STRING, 50, 0, "if", STRING, 51, 0, "ich1", STRING, 52, 0, "il1", STRING, 53, 0, "ip", STRING, 54, 0, "kbs", STRING, 55, 0, "ktbc", STRING, 56, 0, "kclr", STRING, 57, 0, "kctab", STRING, 58, 0, "kdch1", STRING, 59, 0, "kdl1", STRING, 60, 0, "kcud1", STRING, 61, 0, "krmir", STRING, 62, 0, "kel", STRING, 63, 0, "ked", STRING, 64, 0, "kf0", STRING, 65, 0, "kf1", STRING, 66, 0, "kf10", STRING, 67, 0, "kf2", STRING, 68, 0, "kf3", STRING, 69, 0, "kf4", STRING, 70, 0, "kf5", STRING, 71, 0, "kf6", STRING, 72, 0, "kf7", STRING, 73, 0, "kf8", STRING, 74, 0, "kf9", STRING, 75, 0, "khome", STRING, 76, 0, "kich1", STRING, 77, 0, "kil1", STRING, 78, 0, "kcub1", STRING, 79, 0, "kll", STRING, 80, 0, "knp", STRING, 81, 0, "kpp", STRING, 82, 0, "kcuf1", STRING, 83, 0, "kind", STRING, 84, 0, "kri", STRING, 85, 0, "khts", STRING, 86, 0, "kcuu1", STRING, 87, 0, "rmkx", STRING, 88, 0, "smkx", STRING, 89, 0, "lf0", STRING, 90, 0, "lf1", STRING, 91, 0, "lf10", STRING, 92, 0, "lf2", STRING, 93, 0, "lf3", STRING, 94, 0, "lf4", STRING, 95, 0, "lf5", STRING, 96, 0, "lf6", STRING, 97, 0, "lf7", STRING, 98, 0, "lf8", STRING, 99, 0, "lf9", STRING, 100, 0, "rmm", STRING, 101, 0, "smm", STRING, 102, 0, "nel", STRING, 103, 0, "pad", STRING, 104, 0, "dch", STRING, 105, 0, "dl", STRING, 106, 0, "cud", STRING, 107, 0, "ich", STRING, 108, 0, "indn", STRING, 109, 0, "il", STRING, 110, 0, "cub", STRING, 111, 0, "cuf", STRING, 112, 0, "rin", STRING, 113, 0, "cuu", STRING, 114, 0, "pfkey", STRING, 115, 0, "pfloc", STRING, 116, 0, "pfx", STRING, 117, 0, "mc0", STRING, 118, 0, "mc4", STRING, 119, 0, "mc5", STRING, 120, 0, "rep", STRING, 121, 0, "rs1", STRING, 122, 0, "rs2", STRING, 123, 0, "rs3", STRING, 124, 0, "rf", STRING, 125, 0, "rc", STRING, 126, 0, "vpa", STRING, 127, 0, "sc", STRING, 128, 0, "ind", STRING, 129, 0, "ri", STRING, 130, 0, "sgr", STRING, 131, 0, "hts", STRING, 132, 0, "wind", STRING, 133, 0, "ht", STRING, 134, 0, "tsl", STRING, 135, 0, "uc", STRING, 136, 0, "hu", STRING, 137, 0, "iprog", STRING, 138, 0, "ka1", STRING, 139, 0, "ka3", STRING, 140, 0, "kb2", STRING, 141, 0, "kc1", STRING, 142, 0, "kc3", STRING, 143, 0, "mc5p", STRING, 144, 0, "rmp", STRING, 145, 0, "acsc", STRING, 146, 0, "pln", STRING, 147, }; struct name_table_entry *cap_hash_table[360]; int Hashtabsize = 360; int Captabsize = 180; #if (BOOLCOUNT!=21)||(NUMCOUNT!=11)||(STRCOUNT!=148) --> term.h and comp_captab.c disagree about the <-- --> numbers of booleans, numbers and/or strings <-- #endif //go.sysin dd * echo 'x - =src/comp_error.c' sed 's/^X//' <<'//go.sysin dd *' >=src/comp_error.c X/********************************************************************* * COPYRIGHT NOTICE * ********************************************************************** * This software is copyright (C) 1982 by Pavel Curtis * * * * Permission is granted to reproduce and distribute * * this file by any means so long as no fee is charged * * above a nominal handling fee and so long as this * * notice is always included in the copies. * * * * Other rights are reserved except as explicitly granted * * by written permission of the author. * * Pavel Curtis * * Computer Science Dept. * * 405 Upson Hall * * Cornell University * * Ithaca, NY 14853 * * * * Ph- (607) 256-4934 * * * * Pavel.Cornell@Udel-Relay (ARPAnet) * * decvax!cornell!pavel (UUCPnet) * *********************************************************************/ X/* * comp_error.c -- Error message routines * * $Log: RCS/comp_error.v $ * Revision 2.1 82/10/25 14:45:31 pavel * Added Copyright Notice * * Revision 2.0 82/10/24 15:16:32 pavel * Beta-one Test Release * * Revision 1.3 82/08/23 22:29:31 pavel * The REAL Alpha-one Release Version * * Revision 1.2 82/08/19 19:09:44 pavel * Alpha Test Release One * * Revision 1.1 82/08/12 18:36:02 pavel * Initial revision * * */ static char RCSid[] = "$Header: RCS/comp_error.v Revision 2.1 82/10/25 14:45:31 pavel Exp$"; #include "compiler.h" extern char *string_table; extern short term_names; warning(fmt, a1, a2, a3, a4, a5, a6) char *fmt, *a1, *a2, *a3, *a4, *a5, *a6; { fprintf (stderr, "compile: Warning: near line %d: ", curr_line); fprintf (stderr, "terminal '%s', ", string_table+term_names); fprintf (stderr, fmt, a1, a2, a3, a4, a5, a6); fprintf (stderr, "\n"); } err_abort(fmt, a1, a2, a3, a4, a5, a6) char *fmt, *a1, *a2, *a3, *a4, *a5, *a6; { fprintf (stderr, "compile: Line %d: ", curr_line); fprintf (stderr, "terminal '%s', ", string_table+term_names); fprintf (stderr, fmt, a1, a2, a3, a4, a5, a6); fprintf (stderr, "\n"); exit(1); } syserr_abort(fmt, a1, a2, a3, a4, a5, a6) char *fmt, *a1, *a2, *a3, *a4, *a5, *a6; { fprintf (stderr, "PROGRAM ERROR: Line %d: ", curr_line); fprintf (stderr, "terminal '%s', ", string_table+term_names); fprintf (stderr, fmt, a1, a2, a3, a4, a5, a6); fprintf (stderr, "\n"); abort(); } //go.sysin dd * echo 'x - =src/comp_hash.c' sed 's/^X//' <<'//go.sysin dd *' >=src/comp_hash.c X/********************************************************************* * COPYRIGHT NOTICE * ********************************************************************** * This software is copyright (C) 1982 by Pavel Curtis * * * * Permission is granted to reproduce and distribute * * this file by any means so long as no fee is charged * * above a nominal handling fee and so long as this * * notice is always included in the copies. * * * * Other rights are reserved except as explicitly granted * * by written permission of the author. * * Pavel Curtis * * Computer Science Dept. * * 405 Upson Hall * * Cornell University * * Ithaca, NY 14853 * * * * Ph- (607) 256-4934 * * * * Pavel.Cornell@Udel-Relay (ARPAnet) * * decvax!cornell!pavel (UUCPnet) * *********************************************************************/ X/* * comp_hash.c --- Routines to deal with the hashtable of capability * names. * * $Log: RCS/comp_hash.v $ * Revision 2.1 82/10/25 14:45:34 pavel * Added Copyright Notice * * Revision 2.0 82/10/24 15:16:34 pavel * Beta-one Test Release * * Revision 1.3 82/08/23 22:29:33 pavel * The REAL Alpha-one Release Version * * Revision 1.2 82/08/19 19:09:46 pavel * Alpha Test Release One * * Revision 1.1 82/08/12 18:36:23 pavel * Initial revision * * */ static char RCSid[] = "$Header: RCS/comp_hash.v Revision 2.1 82/10/25 14:45:34 pavel Exp$"; #include "compiler.h" #include "term.h" X/* * make_hash_table() * * Takes the entries in cap_table[] and hashes them into cap_hash_table[] * by name. There are Captabsize entries in cap_table[] and Hashtabsize * slots in cap_hash_table[]. * */ make_hash_table() { int i; int hashvalue; int collisions = 0; for (i=0; i < Captabsize; i++) { hashvalue = hash_function(cap_table[i].nte_name); DEBUG(9, "%d\n", hashvalue); if (cap_hash_table[hashvalue] != (struct name_table_entry *) 0) collisions++; cap_table[i].nte_link = cap_hash_table[hashvalue]; cap_hash_table[hashvalue] = &cap_table[i]; } DEBUG(3, "Hash table complete\n%d collisions ", collisions); DEBUG(3, "out of %d entries\n", Captabsize); } X/* * int hash_function(string) * * Computes the hashing function on the given string. * * The current hash function is the sum of each consectutive pair * of characters, taken as two-byte integers, mod Hashtabsize. * */ static int hash_function(string) char *string; { long sum = 0; while (*string) { sum += *string + (*(string + 1) << 8); string++; } return (sum % Hashtabsize); } X/* * struct name_table_entry * * find_entry(string) * * Finds the entry for the given string in the hash table if present. * Returns a pointer to the entry in the table or 0 if not found. * */ struct name_table_entry * find_entry(string) char *string; { int hashvalue; struct name_table_entry *ptr; hashvalue = hash_function(string); ptr = cap_hash_table[hashvalue]; while (ptr != (struct name_table_entry *) 0 && strcmp(ptr->nte_name, string) != 0) ptr = ptr->nte_link; return (ptr); } //go.sysin dd * echo 'x - =src/comp_main.c' sed 's/^X//' <<'//go.sysin dd *' >=src/comp_main.c X/********************************************************************* * COPYRIGHT NOTICE * ********************************************************************** * This software is copyright (C) 1982 by Pavel Curtis * * * * Permission is granted to reproduce and distribute * * this file by any means so long as no fee is charged * * above a nominal handling fee and so long as this * * notice is always included in the copies. * * * * Other rights are reserved except as explicitly granted * * by written permission of the author. * * Pavel Curtis * * Computer Science Dept. * * 405 Upson Hall * * Cornell University * * Ithaca, NY 14853 * * * * Ph- (607) 256-4934 * * * * Pavel.Cornell@Udel-Relay (ARPAnet) * * decvax!cornell!pavel (UUCPnet) * *********************************************************************/ X/* * comp_main.c --- Main program for terminfo compiler * * $Log: RCS/comp_main.v $ * Revision 2.1 82/10/25 14:45:37 pavel * Added Copyright Notice * * Revision 2.0 82/10/24 15:16:37 pavel * Beta-one Test Release * * Revision 1.3 82/08/23 22:29:36 pavel * The REAL Alpha-one Release Version * * Revision 1.2 82/08/19 19:09:49 pavel * Alpha Test Release One * * Revision 1.1 82/08/12 18:36:55 pavel * Initial revision * * */ static char RCSid[] = "$Header: RCS/comp_main.v Revision 2.1 82/10/25 14:45:37 pavel Exp$"; #include <sys/types.h> #include <sys/stat.h> #include "compiler.h" char *source_file = "/etc/terminfo"; char *destination = SRCDIR; char *usage_string = "\tcompile [-v[n]] source-file\n"; char check_only = 0; main (argc, argv) int argc; char *argv[]; { int i; int argflag = FALSE; debug_level = 0; for (i=1; i < argc; i++) { if (argv[i][0] == '-') { switch (argv[i][1]) { case 'c': check_only = 1; break; case 'v': debug_level = argv[i][2] ? atoi(&argv[i][2]) : 1; break; default: fprintf(stderr, "%s: Unknown option. Usage is:\n\t%s\n", argv[0], usage_string); exit(1); } } else if (argflag) { fprintf(stderr, "%s: Too many file names. Usage is:\n\t%s\n", argv[0], usage_string); exit(1); } else { argflag = TRUE; source_file = argv[i]; } } init(argv[0]); make_hash_table(); compile(); exit(0); } X/* * init(progname) * * Miscelaneous initialisations * * Open source file as standard input * Check for access rights to destination directories * Create any directories which don't exist. * */ init(progname) char *progname; { struct stat statbuf; char *dirnames = "abcdefghijklmnopqrstuvwxyz0123456789"; char *getenv(); char dir[2]; start_time = time(0); curr_line = 0; if (freopen(source_file, "r", stdin) == NULL) { fprintf(stderr, "%s: Can't open %s\n", progname, source_file); exit(1); } if (getenv("TERMINFO") != NULL) destination = getenv("TERMINFO"); if (access(destination, 7) < 0) { fprintf(stderr, "%s: %s non-existant or permission denied\n", progname, destination); exit(1); } if (chdir(destination) < 0) { fprintf(stderr, "%s: %s is not a directory\n", progname, destination); exit(1); } dir[1] = '\0'; for (dir[0] = *dirnames; *dirnames != '\0'; dir[0] = *(++dirnames)) { if (stat(dir, &statbuf) < 0) { mkdir(dir); chmod(dir, 0755); } else if (access(dir, 7) < 0) { fprintf(stderr, "%s: %s/%s: Permission denied\n", progname, destination, dir); exit(1); } else if ((statbuf.st_mode & S_IFMT) != S_IFDIR) { fprintf(stderr, "%s: %s/%s: Not a directory\n", progname, destination, dir); exit(1); } } } X/* * mkdir(dirname) * * forks and execs the mkdir program to create the given directory * */ mkdir(dirname) char *dirname; { int fork_rtn; int status; fork_rtn = fork(); switch (fork_rtn) { case 0: /* Child */ execl("/bin/mkdir", "mkdir", dirname, 0); exit(1); case -1: /* Error */ fprintf(stderr, "compile: SYSTEM ERROR!! Fork failed!!!\n"); abort(); default: wait(&status); if (status != 0) syserr_abort("mkdir returned bad status"); break; } } //go.sysin dd * echo 'x - =src/comp_parse.c' sed 's/^X//' <<'//go.sysin dd *' >=src/comp_parse.c X/********************************************************************* * COPYRIGHT NOTICE * ********************************************************************** * This software is copyright (C) 1982 by Pavel Curtis * * * * Permission is granted to reproduce and distribute * * this file by any means so long as no fee is charged * * above a nominal handling fee and so long as this * * notice is always included in the copies. * * * * Other rights are reserved except as explicitly granted * * by written permission of the author. * * Pavel Curtis * * Computer Science Dept. * * 405 Upson Hall * * Cornell University * * Ithaca, NY 14853 * * * * Ph- (607) 256-4934 * * * * Pavel.Cornell@Udel-Relay (ARPAnet) * * decvax!cornell!pavel (UUCPnet) * *********************************************************************/ X/* * comp_parse.c -- The high-level (ha!) parts of the compiler, * that is, the routines which drive the scanner, * etc. * * $Log: comp_parse.c,v $ * Revision 3.1 84/12/13 11:19:32 john * Revisions by Mark Horton * * Revision 2.1 82/10/25 14:45:43 pavel * Added Copyright Notice * * Revision 2.0 82/10/24 15:16:39 pavel * Beta-one Test Release * * Revision 1.3 82/08/23 22:29:39 pavel * The REAL Alpha-one Release Version * * Revision 1.2 82/08/19 19:09:53 pavel * Alpha Test Release One * * Revision 1.1 82/08/12 18:37:12 pavel * Initial revision * * */ static char RCSid[] = "$Header: comp_parse.c,v 3.1 84/12/13 11:19:32 john Exp $"; #include <sys/types.h> #include <sys/stat.h> #include <stdio.h> #include <ctype.h> #include "compiler.h" #include "term.h" #include "object.h" char *string_table; int next_free; /* next free character in string_table */ int table_size = 0; /* current string_table size */ short term_names; /* string table offset - current terminal */ int part2 = 0; /* set to allow old compiled defns to be used */ int complete = 0; /* 1 if entry done with no forward uses */ struct use_item { long offset; struct use_item *fptr, *bptr; }; struct use_header { struct use_item *head, *tail; }; struct use_header use_list = {NULL, NULL}; int use_count = 0; X/* * The use_list is a doubly-linked list with NULLs terminating the lists: * * use_item use_item use_item * --------- --------- --------- * | | | | | | offset * |-------| |-------| |-------| * | ----+-->| ----+-->| NULL | fptr * |-------| |-------| |-------| * | NULL |<--+---- |<--+---- | bptr * --------- --------- --------- * ^ ^ * | ------------------ | * | | | | | * +--+---- | ----+---+ * | | | * ------------------ * head tail * use_list * */ X/* * compile() * * Main loop of the compiler. * * get_token() * if curr_token != NAMES * err_abort() * while (not at end of file) * do an entry * */ compile() { char line[1024]; int token_type; struct use_item *ptr; int old_use_count; token_type = get_token(); if (token_type != NAMES) err_abort("File does not start with terminal names in column one"); while (token_type != EOF) token_type = do_entry(NULL); DEBUG(2, "Starting handling of forward USE's\n", ""); for (part2=0; part2<2; part2++) { old_use_count = -1; DEBUG(2, "\n\nPART %d\n\n", part2); while (use_list.head != NULL && old_use_count != use_count) { old_use_count = use_count; for (ptr = use_list.tail; ptr != NULL; ptr = ptr->bptr) { fseek(stdin, ptr->offset, 0); reset_input(); if ((token_type = get_token()) != NAMES) syserr_abort("Token after a seek not NAMES"); (void) do_entry(ptr); if (complete) dequeue(ptr); } for (ptr = use_list.head; ptr != NULL; ptr = ptr->fptr) { fseek(stdin, ptr->offset, 0); reset_input(); if ((token_type = get_token()) != NAMES) syserr_abort("Token after a seek not NAMES"); (void) do_entry(ptr); if (complete) dequeue(ptr); } DEBUG(2, "Finished a pass through enqueued forward USE's\n", ""); } } if (use_list.head != NULL) { fprintf(stderr, "\nError in following up use-links. Either there is\n"); fprintf(stderr, "a loop in the links or they reference non-existant\n"); fprintf(stderr, "terminals. The following is a list of the entries\n"); fprintf(stderr, "involved:\n\n"); for (ptr = use_list.head; ptr != NULL; ptr = ptr->fptr) { fseek(stdin, ptr->offset, 0); fgets(line, 1024, stdin); fprintf(stderr, "%s", line); } exit(1); } } dump_list(str) char *str; { struct use_item *ptr; char line[512]; fprintf(stderr, "dump_list %s\n", str); for (ptr = use_list.head; ptr != NULL; ptr = ptr->fptr) { fseek(stdin, ptr->offset, 0); fgets(line, 1024, stdin); fprintf(stderr, "ptr %x off %d bptr %x fptr %x str %s", ptr, ptr->offset, ptr->bptr, ptr->fptr, line); } fprintf(stderr, "\n"); } X/* * int * do_entry(item_ptr) * * Compile one entry. During the first pass, item_ptr is NULL. In pass * two, item_ptr points to the current entry in the use_list. * * found-forward-use = FALSE * re-initialise internal arrays * save names in string_table * get_token() * while (not EOF and not NAMES) * if found-forward-use * do nothing * else if 'use' * if handle_use() < 0 * found-forward-use = TRUE * else * check for existance and type-correctness * enter cap into structure * if STRING * save string in string_table * get_token() * if ! found-forward-use * clear CANCELS out of the structure * dump compiled entry into filesystem * */ int do_entry(item_ptr) struct use_item *item_ptr; { long entry_offset; int i; register int token_type; register struct name_table_entry *entry_ptr; int found_forward_use = FALSE; char Booleans[BOOLCOUNT]; short Numbers[NUMCOUNT], Strings[STRCOUNT]; init_structure(Booleans, Numbers, Strings); complete = 0; term_names = save_str(curr_token.tk_name); DEBUG(2, "Starting '%s'\n", curr_token.tk_name); entry_offset = curr_file_pos; for (token_type = get_token(); token_type != EOF && token_type != NAMES; token_type = get_token()) { if (found_forward_use) /* do nothing */ ; else if (strcmp(curr_token.tk_name, "use") == 0) { if (handle_use(item_ptr, entry_offset, Booleans, Numbers, Strings) < 0) found_forward_use = TRUE; } else { entry_ptr = find_entry(curr_token.tk_name); if (entry_ptr == NOTFOUND) { warning("Unknown Capability - '%s'", curr_token.tk_name); continue; } if (token_type != CANCEL && entry_ptr->nte_type != token_type) warning("Wrong type used for capability '%s'", curr_token.tk_name); switch (token_type) { case CANCEL: switch (entry_ptr->nte_type) { case BOOLEAN: Booleans[entry_ptr->nte_index] = -2; break; case NUMBER: Numbers[entry_ptr->nte_index] = -2; break; case STRING: Strings[entry_ptr->nte_index] = -2; break; } break; case BOOLEAN: Booleans[entry_ptr->nte_index] = TRUE; break; case NUMBER: Numbers[entry_ptr->nte_index] = curr_token.tk_valnumber; break; case STRING: Strings[entry_ptr->nte_index] = save_str(curr_token.tk_valstring); break; default: warning("Unknown token type"); panic_mode(','); continue; } } /* end else cur_token.name != "use" */ } /* endwhile (not EOF and not NAMES) */ if (found_forward_use) return(token_type); for (i=0; i < BOOLCOUNT; i++) { if (Booleans[i] == -2) Booleans[i] = FALSE; } for (i=0; i < NUMCOUNT; i++) { if (Numbers[i] == -2) Numbers[i] = -1; } for (i=0; i < STRCOUNT; i++) { if (Strings[i] == -2) Strings[i] = -1; } dump_structure(term_names, Booleans, Numbers, Strings); complete = 1; return(token_type); } X/* * enqueue(offset) * * Put a record of the given offset onto the use-list. * */ enqueue(offset) long offset; { struct use_item *item; char *malloc(); item = (struct use_item *) malloc(sizeof(struct use_item)); if (item == NULL) syserr_abort("Not enough memory for use_list element"); item->offset = offset; if (use_list.head != NULL) { item->bptr = use_list.tail; use_list.tail->fptr = item; item->fptr = NULL; use_list.tail = item; } else { use_list.tail = use_list.head = item; item->fptr = item->bptr = NULL; } use_count ++; } X/* * dequeue(ptr) * * remove the pointed-to item from the use_list * */ dequeue(ptr) struct use_item *ptr; { if (ptr->fptr == NULL) use_list.tail = ptr->bptr; else (ptr->fptr)->bptr = ptr->bptr; if (ptr->bptr == NULL) use_list.head = ptr->fptr; else (ptr->bptr)->fptr = ptr->fptr; use_count --; } X/* * dump_structure() * * Save the compiled version of a description in the filesystem. * * make a copy of the name-list * break it up into first-name and all-but-last-name * creat(first-name) * write object information to first-name * close(first-name) * for each name in all-but-last-name * link to first-name * */ dump_structure(term_names, Booleans, Numbers, Strings) short term_names; char Booleans[]; short Numbers[]; short Strings[]; { struct stat statbuf; FILE *fp; char name_list[1024]; register char *first_name, *other_names; register char *ptr; char filename[50]; char linkname[50]; extern char check_only; strcpy(name_list, term_names + string_table); DEBUG(7, "Name list = '%s'\n", name_list); first_name = name_list; ptr = &name_list[strlen(name_list) - 1]; other_names = ptr + 1; while (ptr > name_list && *ptr != '|') ptr--; if (ptr != name_list) { *ptr = '\0'; for (ptr = name_list; *ptr != '\0' && *ptr != '|'; ptr++) ; if (*ptr == '\0') other_names = ptr; else { *ptr = '\0'; other_names = ptr + 1; } } if (check_only) { DEBUG(1, "Checked %s\n", first_name); return; } DEBUG(7, "First name = '%s'\n", first_name); DEBUG(7, "Other names = '%s'\n", other_names); if (strlen(first_name) > 100) warning("'%s': terminal name too long.", first_name); check_name(first_name); sprintf(filename, "%c/%s", first_name[0], first_name); if (stat(filename, &statbuf) >= 0 && statbuf.st_mtime >= start_time) { warning("'%s' defined in more than one entry.", first_name); fprintf(stderr, "Entry being used is '%s'.\n", (unsigned) term_names + string_table); } unlink(filename); fp = fopen(filename, "w"); if (fp == NULL) { perror(filename); syserr_abort("Can't open %s/%s\n", destination, filename); } DEBUG(1, "Created %s\n", filename); if (write_object(fp, term_names, Booleans, Numbers, Strings) < 0) { syserr_abort("Error in writing %s/%s", destination, filename); } fclose(fp); while (*other_names != '\0') { ptr = other_names++; while (*other_names != '|' && *other_names != '\0') other_names++; if (*other_names != '\0') *(other_names++) = '\0'; if (strlen(ptr) > 100) { warning("'%s': terminal name too long.", ptr); continue; } sprintf(linkname, "%c/%s", ptr[0], ptr); if (strcmp(filename, linkname) == 0) { warning("Terminal name '%s' synonym for itself", first_name); } else if (stat(linkname, &statbuf) >= 0 && statbuf.st_mtime >= start_time) { warning("'%s' defined in more than one entry.", ptr); fprintf(stderr, "Entry being used is '%s'.\n", (unsigned) term_names + string_table); } else { unlink(linkname); if (link(filename, linkname) < 0) syserr_abort("Can't link %s to %s", filename, linkname); DEBUG(1, "Linked %s\n", linkname); } } } X/* * int * write_object(fp, term_names, Booleans, Numbers, Strings) * * Write out the compiled entry to the given file. * Return 0 if OK or -1 if not. * */ #define swap(x) (((x >> 8) & 0377) + 256 * (x & 0377)) #define might_swap(x) (must_swap() ? swap(x) : (x)) int write_object(fp, term_names, Booleans, Numbers, Strings) XFILE *fp; short term_names; char Booleans[]; short Numbers[]; short Strings[]; { struct header header; char *namelist; short namelen; char zero = '\0'; int i; namelist = term_names + string_table; namelen = strlen(namelist) + 1; if (must_swap()) { header.magic = swap(MAGIC); header.name_size = swap(namelen); header.bool_count = swap(BOOLCOUNT); header.num_count = swap(NUMCOUNT); header.str_count = swap(STRCOUNT); header.str_size = swap(next_free); } else { header.magic = MAGIC; header.name_size = namelen; header.bool_count = BOOLCOUNT; header.num_count = NUMCOUNT; header.str_count = STRCOUNT; header.str_size = next_free; } if (fwrite(&header, sizeof(header), 1, fp) != 1 || fwrite(namelist, sizeof(char), namelen, fp) != namelen || fwrite(Booleans, sizeof(char), BOOLCOUNT, fp) != BOOLCOUNT) return(-1); if ((namelen+BOOLCOUNT) % 2 != 0 && fwrite(&zero, sizeof(char), 1, fp) != 1) return(-1); if (must_swap()) { for (i=0; i < NUMCOUNT; i++) Numbers[i] = swap(Numbers[i]); for (i=0; i < STRCOUNT; i++) Strings[i] = swap(Strings[i]); } if (fwrite(Numbers, sizeof(short), NUMCOUNT, fp) != NUMCOUNT || fwrite(Strings, sizeof(short), STRCOUNT, fp) != STRCOUNT || fwrite(string_table, sizeof(char), next_free, fp) != next_free) return(-1); } X/* * check_name(name) * * Generate an error message if given name does not begin with a * digit or lower-case letter. * */ check_name(name) char *name; { if (! isdigit(name[0]) && ! islower(name[0])) { fprintf(stderr, "compile: Line %d: Illegal terminal name - '%s'\n", curr_line, name); fprintf(stderr, "Terminal names must start with lowercase or digit\n"); exit(1); } } X/* * int * save_str(string) * * copy string into next free part of string_table, doing a realloc() * if necessary. return offset of beginning of string from start of * string_table. * */ int save_str(string) char *string; { char *malloc(), *realloc(); int old_next_free = next_free; if (table_size == 0) { if ((string_table = malloc(1024)) == NULL) syserr_abort("Out of memory"); table_size = 1024; DEBUG(5, "Made initial string table allocation. Size is %d\n", table_size); } while (table_size < next_free + strlen(string)) { if ((string_table = realloc(string_table, table_size + 1024)) == NULL) syserr_abort("Out of memory"); table_size += 1024; DEBUG(5, "Extended string table. Size now %d\n", table_size); } strcpy(&string_table[next_free], string); DEBUG(7, "Saved string '%s' ", string); DEBUG(7, "at location %d\n", next_free); next_free += strlen(string) + 1; return(old_next_free); } X/* * init_structure(Booleans, Numbers, Strings) * * Initialise the given arrays * Reset the next_free counter to zero. * */ init_structure(Booleans, Numbers, Strings) char Booleans[]; short Numbers[], Strings[]; { int i; for (i=0; i < BOOLCOUNT; i++) Booleans[i] = FALSE; for (i=0; i < NUMCOUNT; i++) Numbers[i] = -1; for (i=0; i < STRCOUNT; i++) Strings[i] = -1; next_free = 0; } X/* ** int ** handle_use(item_ptr, entry_offset, Booleans, Numbers, Strings) ** ** Merge the compiled file whose name is in cur_token.valstring ** with the current entry. ** ** if it's a forward use-link ** if item_ptr == NULL ** queue it up for later handling ** else ** ignore it (we're already going through the queue) ** else it's a backward use-link ** read in the object file for that terminal ** merge contents with current structure ** ** Returned value is 0 if it was a backward link and we ** successfully read it in, -1 if a forward link. */ int handle_use(item_ptr, entry_offset, Booleans, Numbers, Strings) long entry_offset; struct use_item *item_ptr; char Booleans[]; short Numbers[]; short Strings[]; { struct term use_term; struct stat statbuf; char filename[50]; int i; check_name(curr_token.tk_valstring); sprintf(filename, "%c/%s", curr_token.tk_valstring[0], curr_token.tk_valstring); if (stat(filename, &statbuf) < 0 || part2==0 && statbuf.st_mtime < start_time) { DEBUG(2, "Forward USE to %s", curr_token.tk_valstring); if (item_ptr == NULL) { DEBUG(2, " (enqueued)\n", ""); enqueue(entry_offset); } else DEBUG(2, " (skipped)\n", ""); return(-1); } else { DEBUG(2, "Backward USE to %s\n", curr_token.tk_valstring); if (read_entry(filename, &use_term) < 0) syserr_abort("Error in re-reading compiled file %s", filename); for (i=0; i < BOOLCOUNT; i++) { if (Booleans[i] == FALSE && use_term.Booleans[i] == TRUE) Booleans[i] = TRUE; } for (i=0; i < NUMCOUNT; i++) { if (Numbers[i] == -1 && use_term.Numbers[i] != -1) Numbers[i] = use_term.Numbers[i]; } for (i=0; i < STRCOUNT; i++) { if (Strings[i] == -1 && use_term.Strings[i] != (char *) 0) Strings[i] = save_str(use_term.Strings[i]); } } } //go.sysin dd * echo 'x - =src/comp_scan.c' sed 's/^X//' <<'//go.sysin dd *' >=src/comp_scan.c X/********************************************************************* * COPYRIGHT NOTICE * ********************************************************************** * This software is copyright (C) 1982 by Pavel Curtis * * * * Permission is granted to reproduce and distribute * * this file by any means so long as no fee is charged * * above a nominal handling fee and so long as this * * notice is always included in the copies. * * * * Other rights are reserved except as explicitly granted * * by written permission of the author. * * Pavel Curtis * * Computer Science Dept. * * 405 Upson Hall * * Cornell University * * Ithaca, NY 14853 * * * * Ph- (607) 256-4934 * * * * Pavel.Cornell@Udel-Relay (ARPAnet) * * decvax!cornell!pavel (UUCPnet) * *********************************************************************/ X/* * comp_scan.c --- Lexical scanner for terminfo compiler. * * $Log: RCS/comp_scan.v $ * Revision 2.1 82/10/25 14:45:55 pavel * Added Copyright Notice * * Revision 2.0 82/10/24 15:17:12 pavel * Beta-one Test Release * * Revision 1.3 82/08/23 22:30:03 pavel * The REAL Alpha-one Release Version * * Revision 1.2 82/08/19 19:10:06 pavel * Alpha Test Release One * * Revision 1.1 82/08/12 18:37:46 pavel * Initial revision * * */ static char RCSid[] = "$Header: RCS/comp_scan.v Revision 2.1 82/10/25 14:45:55 pavel Exp$"; #include <stdio.h> #include <ctype.h> #include "compiler.h" #define iswhite(ch) (ch == ' ' || ch == '\t') static int first_column; /* See 'next_char()' below */ X/* * int * get_token() * * Scans the input for the next token, storing the specifics in the * global structure 'curr_token' and returning one of the following: * * NAMES A line beginning in column 1. 'name' * will be set to point to everything up to * but not including the first comma on the line. * BOOLEAN An entry consisting of a name followed by * a comma. 'name' will be set to point to the * name of the capability. * NUMBER An entry of the form * name#digits, * 'name' will be set to point to the capability * name and 'valnumber' to the number given. * STRING An entry of the form * name=characters, * 'name' is set to the capability name and * 'valstring' to the string of characters, with * input translations done. * CANCEL An entry of the form * name@, * 'name' is set to the capability name and * 'valnumber' to -1. * EOF The end of the file has been reached. * */ int get_token() { long number; int type; register char ch; static char buffer[1024]; register char *ptr; int dot_flag = FALSE; while ((ch = next_char()) == '\n' || iswhite(ch)) ; if (ch == EOF) type = EOF; else { if (ch == '.') { dot_flag = TRUE; while ((ch = next_char()) == ' ' || ch == '\t') ; } if (! isalnum(ch)) { warning("Illegal character - '%c'", ch); panic_mode(','); } ptr = buffer; *(ptr++) = ch; if (first_column) { while ((ch = next_char()) != ',' && ch != '\n' && ch != EOF) *(ptr++) = ch; if (ch == EOF) err_abort("Premature EOF"); else if (ch == '\n') { warning("Newline in middle of terminal name"); panic_mode(','); } *ptr = '\0'; curr_token.tk_name = buffer; type = NAMES; } else { ch = next_char(); while (isalnum(ch)) { *(ptr++) = ch; ch = next_char(); } *ptr++ = '\0'; switch (ch) { case ',': curr_token.tk_name = buffer; type = BOOLEAN; break; case '@': if (next_char() != ',') warning("Missing comma"); curr_token.tk_name = buffer; type = CANCEL; break; case '#': number = 0; while (isdigit(ch = next_char())) number = number * 10 + ch - '0'; if (ch != ',') warning("Missing comma"); curr_token.tk_name = buffer; curr_token.tk_valnumber = number; type = NUMBER; break; case '=': ch = trans_string(ptr); if (ch != ',') warning("Missing comma"); curr_token.tk_name = buffer; curr_token.tk_valstring = ptr; type = STRING; break; default: warning("Illegal character - '%c'", ch); } } /* end else (first_column == FALSE) */ } /* end else (ch != EOF) */ if (dot_flag == TRUE) DEBUG(8, "Commented out ", ""); if (debug_level >= 8) { fprintf(stderr, "Token: "); switch (type) { case BOOLEAN: fprintf(stderr, "Boolean; name='%s'\n", curr_token.tk_name); break; case NUMBER: fprintf(stderr, "Number; name='%s', value=%d\n", curr_token.tk_name, curr_token.tk_valnumber); break; case STRING: fprintf(stderr, "String; name='%s', value='%s'\n", curr_token.tk_name, curr_token.tk_valstring); break; case CANCEL: fprintf(stderr, "Cancel; name='%s'\n", curr_token.tk_name); break; case NAMES: fprintf(stderr, "Names; value='%s'\n", curr_token.tk_name); break; case EOF: fprintf(stderr, "End of file\n"); break; default: warning("Bad token type"); } } if (dot_flag == TRUE) /* if commented out, use the next one */ type = get_token(); return(type); } X/* * char * next_char() * * Returns the next character in the input stream. Comments and leading * white space are stripped. The global state variable 'firstcolumn' is * set TRUE if the character returned is from the first column of the input * line. The global variable curr_line is incremented for each new line. * The global variable curr_file_pos is set to the file offset of the * beginning of each line. * */ int curr_column = -1; char line[1024]; char next_char() { char *rtn_value; long ftell(); if (curr_column < 0 || curr_column > 1023 || line[curr_column] == '\0') { do { curr_file_pos = ftell(stdin); if ((rtn_value = fgets(line, 1024, stdin)) != NULL) curr_line++; } while (rtn_value != NULL && line[0] == '#'); if (rtn_value == NULL) return (EOF); curr_column = 0; while (iswhite(line[curr_column])) curr_column++; } if (curr_column == 0 && line[0] != '\n') first_column = TRUE; else first_column = FALSE; return (line[curr_column++]); } backspace() { curr_column--; if (curr_column < 0) syserr_abort("Backspaced off beginning of line"); } X/* * reset_input() * * Resets the input-reading routines. Used after a seek has been done. * */ reset_input() { curr_column = -1; } X/* * char * trans_string(ptr) * * Reads characters using next_char() until encountering a comma, newline * or end-of-file. The returned value is the character which caused * reading to stop. The following translations are done on the input: * * ^X goes to ctrl-X (i.e. X & 037) * {\E,\n,\r,\b,\t,\f} go to * {ESCAPE,newline,carriage-return,backspace,tab,formfeed} * {\^,\\} go to {carat,backslash} * \ddd (for ddd = up to three octal digits) goes to * the character ddd * * \e == \E * \0 == \200 * */ char trans_string(ptr) char *ptr; { register int count = 0; int number; int i; char ch; while ((ch = next_char()) != ',' && ch != EOF) { if (ch == '^') { ch = next_char(); if (ch == EOF) err_abort("Premature EOF"); if (! isprint(ch)) { warning("Illegal ^ character - '%c'", ch); } *(ptr++) = ch & 037; } else if (ch == '\\') { ch = next_char(); if (ch == EOF) err_abort("Premature EOF"); if (ch >= '0' && ch <= '7') { number = ch - '0'; for (i=0; i < 2; i++) { ch = next_char(); if (ch == EOF) err_abort("Premature EOF"); if (ch < '0' || ch > '7') { backspace(); break; } number = number * 8 + ch - '0'; } if (number == 0) number = 0200; *(ptr++) = (char) number; } else { switch (ch) { case 'E': case 'e': *(ptr++) = '\033'; break; case 'l': case 'n': *(ptr++) = '\n'; break; case 'r': *(ptr++) = '\r'; break; case 'b': *(ptr++) = '\008'; break; case 's': *(ptr++) = ' '; break; case 'f': *(ptr++) = '\014'; break; case 't': *(ptr++) = '\t'; break; case '\\': *(ptr++) = '\\'; break; case '^': *(ptr++) = '^'; break; case ',': *(ptr++) = ','; break; case ':': *(ptr++) = ':'; break; default: warning("Illegal character in \\ sequence"); *(ptr++) = ch; } /* endswitch (ch) */ } /* endelse (ch < '0' || ch > '7') */ } /* end else if (ch == '\\') */ else { *(ptr++) = ch; } count ++; if (count > 500) warning("Very long string found. Missing comma?"); } /* end while */ *ptr = '\0'; return(ch); } X/* * Panic mode error recovery - skip everything until a "ch" is found. */ panic_mode(ch) char ch; { int c; for (;;) { c = next_char(); if (c == ch) return; if (c == EOF); return; } } //go.sysin dd * echo 'x - =src/compiler.h' sed 's/^X//' <<'//go.sysin dd *' >=src/compiler.h X/********************************************************************* * COPYRIGHT NOTICE * ********************************************************************** * This software is copyright (C) 1982 by Pavel Curtis * * * * Permission is granted to reproduce and distribute * * this file by any means so long as no fee is charged * * above a nominal handling fee and so long as this * * notice is always included in the copies. * * * * Other rights are reserved except as explicitly granted * * by written permission of the author. * * Pavel Curtis * * Computer Science Dept. * * 405 Upson Hall * * Cornell University * * Ithaca, NY 14853 * * * * Ph- (607) 256-4934 * * * * Pavel.Cornell@Udel-Relay (ARPAnet) * * decvax!cornell!pavel (UUCPnet) * *********************************************************************/ X/* * compiler.h - Global variables and structures for the terminfo * compiler. * * $Header: RCS/compiler.v Revision 2.1 82/10/25 14:46:04 pavel Exp$ * * $Log: RCS/compiler.v $ Revision 2.1 82/10/25 14:46:04 pavel Added Copyright Notice Revision 2.0 82/10/24 15:17:20 pavel Beta-one Test Release Revision 1.3 82/08/23 22:30:09 pavel The REAL Alpha-one Release Version Revision 1.2 82/08/19 19:10:10 pavel Alpha Test Release One Revision 1.1 82/08/12 18:38:11 pavel Initial revision * */ #include <stdio.h> #ifndef TRUE #define TRUE 1 #define FALSE 0 #endif #define SINGLE /* only one terminal (actually none) */ char *destination; /* destination directory for object files */ long start_time; /* time at start of compilation */ long time(); int curr_line; /* current line # in input */ long curr_file_pos; /* file offset of current line */ int debug_level; /* level of debugging output */ #define DEBUG(level, fmt, a1) \ if (debug_level >= level)\ fprintf(stderr, fmt, a1); /* * These are the types of tokens returned by the scanner. * The first three are also used in the hash table of capability * names. The scanner returns one of these values after loading * the specifics into the global structure curr_token. * */ #define BOOLEAN 0 /* Boolean capability */ #define NUMBER 1 /* Numeric capability */ #define STRING 2 /* String-valued capability */ #define CANCEL 3 /* Capability to be cancelled in following tc's */ #define NAMES 4 /* The names for a terminal type */ /* * The global structure in which the specific parts of a * scanned token are returned. * */ struct token { char *tk_name; /* name of capability */ int tk_valnumber; /* value of capability (if a number) */ char *tk_valstring; /* value of capability (if a string) */ }; struct token curr_token; /* * The file comp_captab.c contains an array of these structures, * one per possible capability. These are then made into a hash * table array of the same structures for use by the parser. * */ struct name_table_entry { struct name_table_entry *nte_link; char *nte_name; /* name to hash on */ int nte_type; /* BOOLEAN, NUMBER or STRING */ short nte_index; /* index of associated variable in its array */ }; extern struct name_table_entry cap_table[]; extern struct name_table_entry *cap_hash_table[]; extern int Captabsize; extern int Hashtabsize; #define NOTFOUND ((struct name_table_entry *) 0) /* * Function types * */ struct name_table_entry *find_entry(); /* look up entry in hash table */ char next_char(); char trans_string(); //go.sysin dd * exit
sources@genrad.UUCP (12/18/84)
This is part of a distribution of a public domain version of terminfo/curses It is a rather large distribution, so I have broken it up into 11 modules (each less than 64K long.) Each shar format module should end with the line "exit". This code is completely public domain, originally written by Pavel Curtis of Cornell University. This version has some small improvements and bug fixes. This unit contains: The Makefile, the rest of the header files, and awk scripts for when the Caps file is modified. Part 6 will be the Caps file, dump.c, and the first installation of the library modules. ----------------- cut here ---------------- : Run this shell script with "sh" not "csh" PATH=:/bin:/usr/bin:/usr/ucb export PATH if test ! -d =src then echo 'Making directory "=src"' mkdir =src fi echo 'x - =src/MKcaptab.awk' sed 's/^X//' <<'//go.sysin dd *' >=src/MKcaptab.awk #********************************************************************* # COPYRIGHT NOTICE * #********************************************************************* # This software is copyright (C) 1982 by Pavel Curtis * # * # Permission is granted to reproduce and distribute * # this file by any means so long as no fee is charged * # above a nominal handling fee and so long as this * # notice is always included in the copies. * # * # Other rights are reserved except as explicitly granted * # by written permission of the author. * # Pavel Curtis * # Computer Science Dept. * # 405 Upson Hall * # Cornell University * # Ithaca, NY 14853 * # * # Ph- (607) 256-4934 * # * # Pavel.Cornell@Udel-Relay (ARPAnet) * # decvax!cornell!pavel (UUCPnet) * #********************************************************************/ # # $Header: RCS/MKcaptab.v Revision 2.1 82/10/25 14:45:02 pavel Exp$ # BEGIN { print "/*" print " * comp_captab.c -- The names of the capabilities in a form ready for" print " * the making of a hash table for the compiler." print " *" print " */" print "" print "" print "#include \"compiler.h\"" print "#include \"term.h\"" print "" print "" print "struct name_table_entry cap_table[] =" print "{" } $3 == "bool" { printf "\t0,%15s,\tBOOLEAN,\t%3d,\n", $2, BoolCount++ } $3 == "number" { printf "\t0,%15s,\tNUMBER,\t\t%3d,\n", $2, NumCount++ } $3 == "str" { printf "\t0,%15s,\tSTRING,\t\t%3d,\n", $2, StrCount++ } END { print "};" print "" printf "struct name_table_entry *cap_hash_table[%d];\n",\ (BoolCount + NumCount + StrCount) * 2 print "" printf "int Hashtabsize = %d;\n",\ (BoolCount + NumCount + StrCount) * 2 printf "int Captabsize = %d;\n", BoolCount + NumCount + StrCount print "" print "" printf "#if (BOOLCOUNT!=%d)||(NUMCOUNT!=%d)||(STRCOUNT!=%d)\n",\ BoolCount, NumCount, StrCount print " --> term.h and comp_captab.c disagree about the <--" print " --> numbers of booleans, numbers and/or strings <--" print "#endif" } //go.sysin dd * echo 'x - =src/MKnames.awk' sed 's/^X//' <<'//go.sysin dd *' >=src/MKnames.awk #********************************************************************* # COPYRIGHT NOTICE * #********************************************************************* # This software is copyright (C) 1982 by Pavel Curtis * # * # Permission is granted to reproduce and distribute * # this file by any means so long as no fee is charged * # above a nominal handling fee and so long as this * # notice is always included in the copies. * # * # Other rights are reserved except as explicitly granted * # by written permission of the author. * # Pavel Curtis * # Computer Science Dept. * # 405 Upson Hall * # Cornell University * # Ithaca, NY 14853 * # * # Ph- (607) 256-4934 * # * # Pavel.Cornell@Udel-Relay (ARPAnet) * # decvax!cornell!pavel (UUCPnet) * #********************************************************************/ # # $Header: RCS/MKnames.v Revision 2.1 82/10/25 14:45:06 pavel Exp$ # BEGIN { print "/*" > "boolnames" print " * dump_names.c - Arrays of capability names for use by the" > "boolnames" print " * dump program." > "boolnames" print " *" > "boolnames" print " */" > "boolnames" print "" > "boolnames" print "" > "boolnames" print "char *BoolNames[] = {" > "boolnames" print "char *NumNames[] = {" > "numnames" print "char *StrNames[] = {" > "strnames" } $3 == "bool" { printf "\t\t%s,\n", $2 > "boolnames" } $3 == "number" { printf "\t\t%s,\n", $2 > "numnames" } $3 == "str" { printf "\t\t%s,\n", $2 > "strnames" } END { print "};" > "boolnames" print "" > "boolnames" print "};" > "numnames" print "" > "numnames" print "};" > "strnames" } //go.sysin dd * echo 'x - =src/MKterm.h.awk' sed 's/^X//' <<'//go.sysin dd *' >=src/MKterm.h.awk #********************************************************************* # COPYRIGHT NOTICE * #********************************************************************* # This software is copyright (C) 1982 by Pavel Curtis * # * # Permission is granted to reproduce and distribute * # this file by any means so long as no fee is charged * # above a nominal handling fee and so long as this * # notice is always included in the copies. * # * # Other rights are reserved except as explicitly granted * # by written permission of the author. * # Pavel Curtis * # Computer Science Dept. * # 405 Upson Hall * # Cornell University * # Ithaca, NY 14853 * # * # Ph- (607) 256-4934 * # * # Pavel.Cornell@Udel-Relay (ARPAnet) * # decvax!cornell!pavel (UUCPnet) * #********************************************************************/ # # $Header: RCS/MKterm.h.v Revision 2.1 82/10/25 14:45:11 pavel Exp$ # BEGIN { print "/*" print "** term.h -- Definition of struct term" print "*/" print "" print "#ifndef SGTTY" print "# include \"curses.h\"" print "#endif" print "" print "#ifdef SINGLE" print "# define CUR _first_term." print "#else" print "# define CUR cur_term->" print "#endif" print "" print "" } $3 == "bool" { printf "#define %-30s CUR Booleans[%d]\n", $1, BoolCount++ } $3 == "number" { printf "#define %-30s CUR Numbers[%d]\n", $1, NumberCount++ } $3 == "str" { printf "#define %-30s CUR Strings[%d]\n", $1, StringCount++ } END { print "" print "" print "struct term" print "{" print " char *term_names; /* offset in str_table of terminal names */" print " char *str_table; /* pointer to string table */" print " short Filedes; /* file description being written to */" print " SGTTY Ottyb, /* original state of the terminal */" print " Nttyb; /* current state of the terminal */" print "" printf " char Booleans[%d];\n", BoolCount printf " short Numbers[%d];\n", NumberCount printf " char *Strings[%d];\n", StringCount print "};" print "" print "struct term _first_term;" print "struct term *cur_term;" print "" printf "#define BOOLCOUNT %d\n", BoolCount printf "#define NUMCOUNT %d\n", NumberCount printf "#define STRCOUNT %d\n", StringCount } //go.sysin dd * echo 'x - =src/Makefile' sed 's/^X//' <<'//go.sysin dd *' >=src/Makefile #********************************************************************* # COPYRIGHT NOTICE * #********************************************************************* # This software is copyright (C) 1982 by Pavel Curtis * # * # Permission is granted to reproduce and distribute * # this file by any means so long as no fee is charged * # above a nominal handling fee and so long as this * # notice is always included in the copies. * # * # Other rights are reserved except as explicitly granted * # by written permission of the author. * # Pavel Curtis * # Computer Science Dept. * # 405 Upson Hall * # Cornell University * # Ithaca, NY 14853 * # * # Ph- (607) 256-4934 * # * # Pavel.Cornell@Udel-Relay (ARPAnet) * # decvax!cornell!pavel (UUCPnet) * #********************************************************************/ # RCSid: $Header: RCS/Makefile.v Revision 2.2 82/10/25 15:28:23 pavel Exp$ SRCDIR= /etc/term CFLAGS= -O -DSRCDIR='"$(SRCDIR)"' DFLAGS= -g -DTRACE -DSRCDIR='"$(SRCDIR)"' SRCS= comp_main.c comp_hash.c comp_captab.c comp_scan.c comp_error.c \ comp_parse.c read_entry.c \ dump.c dump_names.c \ lib_setup.c lib_fixterm.c lib_tparm.c lib_tputs.c \ lib_unctrl.c lib_raw.c lib_vidattr.c lib_trace.c lib_data.c \ lib_beep.c lib_doupdate.c lib_refresh.c lib_initscr.c lib_newwin.c \ lib_addch.c lib_addstr.c lib_scroll.c lib_clreol.c lib_touchwin.c \ lib_mvcur.c lib_delwin.c lib_endwin.c lib_clrbot.c lib_move.c \ lib_printw.c lib_scanw.c lib_erase.c lib_getch.c lib_options.c \ lib_box.c lib_clear.c lib_delch.c lib_deleteln.c lib_insch.c \ lib_insertln.c lib_getstr.c lib_mvwin.c lib_longname.c lib_tstp.c \ lib_newterm.c lib_set_term.c lib_overlay.c lib_scrreg.c # # Normal, optimised object files # LIBOBJS= lib_setup.o lib_fixterm.o lib_tparm.o read_entry.o lib_tputs.o \ lib_unctrl.o lib_raw.o lib_vidattr.o lib_trace.o lib_data.o lib_beep.o \ lib_doupdate.o lib_refresh.o lib_initscr.o lib_newwin.o lib_addch.o \ lib_addstr.o lib_scroll.o lib_clreol.o lib_touchwin.o lib_mvcur.o \ lib_delwin.o lib_endwin.o lib_clrbot.o lib_move.o lib_printw.o \ lib_scanw.o lib_erase.o lib_getch.o lib_options.o \ lib_box.o lib_clear.o lib_delch.o lib_deleteln.o lib_insch.o \ lib_insertln.o lib_getstr.o lib_mvwin.o lib_longname.o lib_tstp.o \ lib_newterm.o lib_set_term.o lib_overlay.o lib_scrreg.o # # Debugging (tracing) object files # DLIBOBJS= lib_setup.d lib_fixterm.d lib_tparm.d read_entry.d lib_tputs.d \ lib_unctrl.d lib_raw.d lib_vidattr.d lib_trace.d lib_data.d lib_beep.d \ lib_doupdate.d lib_refresh.d lib_initscr.d lib_newwin.d lib_addch.d \ lib_addstr.d lib_scroll.d lib_clreol.d lib_touchwin.d lib_mvcur.d \ lib_delwin.d lib_endwin.d lib_clrbot.d lib_move.d lib_printw.d \ lib_scanw.d lib_erase.d lib_getch.d lib_options.d \ lib_box.d lib_clear.d lib_delch.d lib_deleteln.d lib_insch.d \ lib_insertln.d lib_getstr.d lib_mvwin.d lib_longname.d lib_tstp.d \ lib_newterm.d lib_set_term.d lib_overlay.d lib_scrreg.d # # Profiled Optimised object files # PLIBOBJS= lib_setup.p lib_fixterm.p lib_tparm.p read_entry.p lib_tputs.p \ lib_unctrl.p lib_raw.p lib_vidattr.p lib_trace.p lib_data.p lib_beep.p \ lib_doupdate.p lib_refresh.p lib_initscr.p lib_newwin.p lib_addch.p \ lib_addstr.p lib_scroll.p lib_clreol.p lib_touchwin.p lib_mvcur.p \ lib_delwin.p lib_endwin.p lib_clrbot.p lib_move.p lib_printw.p \ lib_scanw.p lib_erase.p lib_getch.p lib_options.p \ lib_box.p lib_clear.p lib_delch.p lib_deleteln.p lib_insch.p \ lib_insertln.p lib_getstr.p lib_mvwin.p lib_longname.p lib_tstp.p \ lib_newterm.p lib_set_term.p lib_overlay.p lib_scrreg.p COMPOBJS= comp_main.o comp_hash.o comp_captab.o comp_scan.o comp_error.o \ comp_parse.o read_entry.o X.SUFFIXES: .d .p X.c.d: -mv $*.o $*.O cc -c $(DFLAGS) $*.c mv $*.o $*.d -mv $*.O $*.o X.c.p: -mv $*.o $*.O cc -pg -c $(CFLAGS) $*.c mv $*.o $*.p -mv $*.O $*.o all: compile dump lib dlib install: all sed -e 's/clude *"curses.h" *$$/clude <ncurses.h>/' term.h > /usr/include/term.h sed -e 's/^#include *"terminfo.h" *$$/#include <terminfo.h>/' curses.h > /usr/include/ncurses.h cp terminfo.h /usr/include/terminfo.h cp unctrl.h /usr/include/unctrl.h cp compile $(SRCDIR)/compile cp dump $(SRCDIR)/dump cp libcurses.a /usr/lib/libncurses.a cp libdcurses.a /usr/lib/libdcurses.a ranlib /usr/lib/libncurses.a ranlib /usr/lib/libdcurses.a lib: libcurses.a libcurses.a: ${LIBOBJS} ar rv libcurses.a ${LIBOBJS} ranlib libcurses.a dlib: libdcurses.a libdcurses.a: ${DLIBOBJS} ar rv libdcurses.a ${DLIBOBJS} ranlib libdcurses.a plib: libpcurses.a libpcurses.a: ${PLIBOBJS} ar rv libpcurses.a ${PLIBOBJS} ranlib libpcurses.a compile: ${COMPOBJS} cc -o compile ${COMPOBJS} dump: dump.o dump_names.o read_entry.o cc -o dump dump.o dump_names.o read_entry.o lint: ${SRCS} lint ${DFLAGS} ${SRCS} > lint.out term.h: Caps MKterm.h.awk awk -f MKterm.h.awk Caps > term.h comp_captab.c: Caps MKcaptab.awk awk -f MKcaptab.awk Caps > comp_captab.c dump.o: dump.c term.h compiler.h dump_names.c: Caps MKnames.awk awk -f MKnames.awk Caps cat boolnames numnames strnames > dump_names.c -rm -f boolnames numnames strnames clean: -rm -f *.[od] term.h comp_captab.c tags dump_names.c tags: *.c *.h ctags *.c *.h depend: ${SRCS} grep "^#include" ${SRCS} \ | sed 's/\([^:]*\).c:[^"]*"\([^"]*\)".*/\1.o: \2/' \ | sed '/#include/d' > makedep echo '/^# DO NOT DELETE THIS LINE/+2,$$d' > eddep echo '$$r makedep' >> eddep echo '/^# DO NOT DELETE THIS LINE/+2,$$s/\.o/.d/' >> eddep echo '$$r makedep' >> eddep echo 'w' >> eddep cp Makefile Makefile.bak ex - Makefile < eddep rm makedep eddep echo >> Makefile echo "# DEPENDENCIES MUST END AT END OF FILE" >> Makefile echo "# IF YOU PUT STUFF HERE, IT WILL GO AWAY" >> Makefile echo "# See make depend, above" >> Makefile # DO NOT DELETE THIS LINE - make depend needs it comp_main.d: compiler.h comp_hash.d: compiler.h comp_hash.d: term.h comp_captab.d: compiler.h comp_captab.d: term.h comp_scan.d: compiler.h comp_error.d: compiler.h comp_parse.d: compiler.h comp_parse.d: term.h comp_parse.d: object.h read_entry.d: term.h read_entry.d: object.h dump.d: compiler.h dump.d: term.h lib_setup.d: curses.h lib_setup.d: curses.priv.h lib_setup.d: term.h lib_fixterm.d: curses.h lib_fixterm.d: curses.priv.h lib_fixterm.d: term.h lib_tparm.d: curses.h lib_tparm.d: curses.priv.h lib_tparm.d: term.h lib_tputs.d: curses.h lib_tputs.d: curses.priv.h lib_tputs.d: term.h lib_raw.d: curses.h lib_raw.d: curses.priv.h lib_raw.d: term.h lib_vidattr.d: curses.h lib_vidattr.d: curses.priv.h lib_vidattr.d: term.h lib_trace.d: term.h lib_trace.d: curses.h lib_trace.d: curses.priv.h lib_data.d: curses.priv.h lib_data.d: curses.h lib_data.d: term.h lib_beep.d: curses.h lib_beep.d: curses.priv.h lib_beep.d: term.h lib_doupdate.d: curses.h lib_doupdate.d: curses.priv.h lib_doupdate.d: term.h lib_refresh.d: curses.h lib_refresh.d: curses.priv.h lib_initscr.d: curses.h lib_initscr.d: curses.priv.h lib_newwin.d: term.h lib_newwin.d: curses.h lib_newwin.d: curses.priv.h lib_addch.d: curses.h lib_addch.d: curses.priv.h lib_addch.d: unctrl.h lib_addstr.d: curses.h lib_addstr.d: curses.priv.h lib_scroll.d: curses.h lib_scroll.d: curses.priv.h lib_clreol.d: curses.h lib_clreol.d: curses.priv.h lib_touchwin.d: curses.h lib_touchwin.d: curses.priv.h lib_mvcur.d: term.h lib_mvcur.d: curses.h lib_mvcur.d: curses.priv.h lib_delwin.d: curses.h lib_delwin.d: curses.priv.h lib_endwin.d: term.h lib_endwin.d: curses.h lib_endwin.d: curses.priv.h lib_clrbot.d: curses.h lib_clrbot.d: curses.priv.h lib_move.d: curses.h lib_move.d: curses.priv.h lib_printw.d: curses.h lib_printw.d: curses.priv.h lib_scanw.d: curses.h lib_scanw.d: curses.priv.h lib_erase.d: curses.h lib_erase.d: curses.priv.h lib_getch.d: curses.h lib_getch.d: curses.priv.h lib_options.d: term.h lib_options.d: curses.h lib_options.d: curses.priv.h lib_box.d: curses.h lib_box.d: curses.priv.h lib_clear.d: curses.h lib_clear.d: curses.priv.h lib_delch.d: curses.h lib_delch.d: curses.priv.h lib_delch.d: term.h lib_deleteln.d: curses.h lib_deleteln.d: curses.priv.h lib_insch.d: curses.h lib_insch.d: curses.priv.h lib_insertln.d: curses.h lib_insertln.d: curses.priv.h lib_getstr.d: curses.h lib_getstr.d: curses.priv.h lib_getstr.d: unctrl.h lib_mvwin.d: curses.h lib_mvwin.d: curses.priv.h lib_longname.d: curses.h lib_longname.d: curses.priv.h lib_tstp.d: term.h lib_tstp.d: curses.h lib_tstp.d: curses.priv.h lib_newterm.d: curses.h lib_newterm.d: term.h lib_newterm.d: curses.priv.h lib_set_term.d: curses.h lib_set_term.d: curses.priv.h lib_set_term.d: term.h lib_overlay.d: curses.h lib_overlay.d: curses.priv.h lib_scrreg.d: curses.h lib_scrreg.d: curses.priv.h comp_main.o: compiler.h comp_hash.o: compiler.h comp_hash.o: term.h comp_captab.o: compiler.h comp_captab.o: term.h comp_scan.o: compiler.h comp_error.o: compiler.h comp_parse.o: compiler.h comp_parse.o: term.h comp_parse.o: object.h read_entry.o: term.h read_entry.o: object.h dump.o: compiler.h dump.o: term.h lib_setup.o: curses.h lib_setup.o: curses.priv.h lib_setup.o: term.h lib_fixterm.o: curses.h lib_fixterm.o: curses.priv.h lib_fixterm.o: term.h lib_tparm.o: curses.h lib_tparm.o: curses.priv.h lib_tparm.o: term.h lib_tputs.o: curses.h lib_tputs.o: curses.priv.h lib_tputs.o: term.h lib_raw.o: curses.h lib_raw.o: curses.priv.h lib_raw.o: term.h lib_vidattr.o: curses.h lib_vidattr.o: curses.priv.h lib_vidattr.o: term.h lib_trace.o: term.h lib_trace.o: curses.h lib_trace.o: curses.priv.h lib_data.o: curses.priv.h lib_data.o: curses.h lib_data.o: term.h lib_beep.o: curses.h lib_beep.o: curses.priv.h lib_beep.o: term.h lib_doupdate.o: curses.h lib_doupdate.o: curses.priv.h lib_doupdate.o: term.h lib_refresh.o: curses.h lib_refresh.o: curses.priv.h lib_initscr.o: curses.h lib_initscr.o: curses.priv.h lib_newwin.o: term.h lib_newwin.o: curses.h lib_newwin.o: curses.priv.h lib_addch.o: curses.h lib_addch.o: curses.priv.h lib_addch.o: unctrl.h lib_addstr.o: curses.h lib_addstr.o: curses.priv.h lib_scroll.o: curses.h lib_scroll.o: curses.priv.h lib_clreol.o: curses.h lib_clreol.o: curses.priv.h lib_touchwin.o: curses.h lib_touchwin.o: curses.priv.h lib_mvcur.o: term.h lib_mvcur.o: curses.h lib_mvcur.o: curses.priv.h lib_delwin.o: curses.h lib_delwin.o: curses.priv.h lib_endwin.o: term.h lib_endwin.o: curses.h lib_endwin.o: curses.priv.h lib_clrbot.o: curses.h lib_clrbot.o: curses.priv.h lib_move.o: curses.h lib_move.o: curses.priv.h lib_printw.o: curses.h lib_printw.o: curses.priv.h lib_scanw.o: curses.h lib_scanw.o: curses.priv.h lib_erase.o: curses.h lib_erase.o: curses.priv.h lib_getch.o: curses.h lib_getch.o: curses.priv.h lib_options.o: term.h lib_options.o: curses.h lib_options.o: curses.priv.h lib_box.o: curses.h lib_box.o: curses.priv.h lib_clear.o: curses.h lib_clear.o: curses.priv.h lib_delch.o: curses.h lib_delch.o: curses.priv.h lib_delch.o: term.h lib_deleteln.o: curses.h lib_deleteln.o: curses.priv.h lib_insch.o: curses.h lib_insch.o: curses.priv.h lib_insertln.o: curses.h lib_insertln.o: curses.priv.h lib_getstr.o: curses.h lib_getstr.o: curses.priv.h lib_getstr.o: unctrl.h lib_mvwin.o: curses.h lib_mvwin.o: curses.priv.h lib_longname.o: curses.h lib_longname.o: curses.priv.h lib_tstp.o: term.h lib_tstp.o: curses.h lib_tstp.o: curses.priv.h lib_newterm.o: curses.h lib_newterm.o: term.h lib_newterm.o: curses.priv.h lib_set_term.o: curses.h lib_set_term.o: curses.priv.h lib_set_term.o: term.h lib_overlay.o: curses.h lib_overlay.o: curses.priv.h lib_scrreg.o: curses.h lib_scrreg.o: curses.priv.h # DEPENDENCIES MUST END AT END OF FILE # IF YOU PUT STUFF HERE, IT WILL GO AWAY # See make depend, above //go.sysin dd * echo 'x - =src/curses.h' sed 's/^X//' <<'//go.sysin dd *' >=src/curses.h X/********************************************************************* * COPYRIGHT NOTICE * ********************************************************************** * This software is copyright (C) 1982 by Pavel Curtis * * * * Permission is granted to reproduce and distribute * * this file by any means so long as no fee is charged * * above a nominal handling fee and so long as this * * notice is always included in the copies. * * * * Other rights are reserved except as explicitly granted * * by written permission of the author. * * Pavel Curtis * * Computer Science Dept. * * 405 Upson Hall * * Cornell University * * Ithaca, NY 14853 * * * * Ph- (607) 256-4934 * * * * Pavel.Cornell@Udel-Relay (ARPAnet) * * decvax!cornell!pavel (UUCPnet) * *********************************************************************/ X/* * curses.h - Main header file for the curses package * * $Header: RCS/curses.v Revision 2.1 82/10/25 14:46:08 pavel Exp$ * * $Log: RCS/curses.v $ Revision 2.1 82/10/25 14:46:08 pavel Added Copyright Notice Revision 2.0 82/10/24 15:17:22 pavel Beta-one Test Release Revision 1.4 82/08/23 22:30:13 pavel The REAL Alpha-one Release Version Revision 1.3 82/08/20 16:52:46 pavel XFixed <terminfo.h> bug Revision 1.2 82/08/19 19:10:13 pavel Alpha Test Release One Revision 1.1 82/08/12 18:38:57 pavel Initial revision * */ #ifndef WINDOW #include "terminfo.h" #define bool char #ifndef MINICURSES typedef unsigned short chtype; #else typedef unsigned char chtype; #endif MINICURSES #ifndef TRUE # define TRUE (1) # define FALSE (0) #endif #define ERR (0) #define OK (1) #define _SUBWIN 01 #define _ENDLINE 02 #define _FULLWIN 04 #define _SCROLLWIN 010 #define _NOCHANGE -1 struct _win_st { short _cury, _curx; short _maxy, _maxx; short _begy, _begx; short _flags; chtype _attrs; bool _clear; bool _leave; bool _scroll; bool _idlok; bool _use_keypad; /* 0=no, 1=yes, 2=yes/timeout */ bool _use_meta; /* T=use the meta key */ bool _nodelay; /* T=don't wait for tty input */ chtype **_line; short *_firstchar; /* First changed character in the line */ short *_lastchar; /* Last changed character in the line */ short *_numchngd; /* Number of changes made in the line */ short _regtop; /* Top and bottom of scrolling region */ short _regbottom; }; #define WINDOW struct _win_st WINDOW *stdscr, *curscr; int LINES, COLS; WINDOW *initscr(), *newwin(), *subwin(); char *longname(); struct screen *newterm(), *set_term(); X/* * psuedo functions */ #define getyx(win,y,x) (y = (win)->_cury, x = (win)->_curx) #define inch() winch(stdscr) #define standout() wstandout(stdscr) #define standend() wstandend(stdscr) #define attron(at) wattron(stdscr,at) #define attroff(at) wattroff(stdscr,at) #define attrset(at) wattrset(stdscr,at) #define winch(win) ((win)->_line[(win)->_cury][(win)->_curx]) #define wstandout(win) (wattrset(win,A_STANDOUT)) #define wstandend(win) (wattrset(win,A_NORMAL)) #define wattron(win,at) ((win)->_attrs |= (at)) #define wattroff(win,at) ((win)->_attrs &= ~(at)) #define wattrset(win,at) ((win)->_attrs = (at)) #ifndef MINICURSES /* * psuedo functions for standard screen */ # define addch(ch) waddch(stdscr, ch) # define getch() wgetch(stdscr) # define addstr(str) waddstr(stdscr, str) # define getstr(str) wgetstr(stdscr, str) # define move(y, x) wmove(stdscr, y, x) # define clear() wclear(stdscr) # define erase() werase(stdscr) # define clrtobot() wclrtobot(stdscr) # define clrtoeol() wclrtoeol(stdscr) # define insertln() winsertln(stdscr) # define deleteln() wdeleteln(stdscr) # define refresh() wrefresh(stdscr) # define insch(c) winsch(stdscr,c) # define delch() wdelch(stdscr) # define setscrreg(t,b) wsetscrreg(stdscr,t,b) /* * mv functions */ # define mvwaddch(win,y,x,ch) (wmove(win,y,x) == ERR ? ERR : waddch(win,ch)) # define mvwgetch(win,y,x) (wmove(win,y,x) == ERR ? ERR : wgetch(win)) # define mvwaddstr(win,y,x,str) (wmove(win,y,x) == ERR ? ERR \ : waddstr(win,str)) # define mvwgetstr(win,y,x) (wmove(win,y,x) == ERR ? ERR : wgetstr(win)) # define mvwinch(win,y,x) (wmove(win,y,x) == ERR ? ERR : winch(win)) # define mvwdelch(win,y,x) (wmove(win,y,x) == ERR ? ERR : wdelch(win)) # define mvwinsch(win,y,x,c) (wmove(win,y,x) == ERR ? ERR : winsch(win,c)) # define mvaddch(y,x,ch) mvwaddch(stdscr,y,x,ch) # define mvgetch(y,x) mvwgetch(stdscr,y,x) # define mvaddstr(y,x,str) mvwaddstr(stdscr,y,x,str) # define mvgetstr(y,x) mvwgetstr(stdscr,y,x) # define mvinch(y,x) mvwinch(stdscr,y,x) # define mvdelch(y,x) mvwdelch(stdscr,y,x) # define mvinsch(y,x,c) mvwinsch(stdscr,y,x,c) #else MINICURSES # define addch m_addch # define addstr m_addstr # define erase m_erase # define clear m_clear # define refresh m_refresh # define initscr m_initscr # define newterm m_newterm # define mvaddch(y,x,ch) (move(y,x) == ERR ? ERR : addch(ch)) # define mvaddstr(y,x,str) (move(y,x) == ERR ? ERR : addstr(str)) X/* * These functions don't exist in minicurses, so we define them * to nonexistent functions to help the user catch the error. */ # define box no_box # define clrtobot no_clrtobot # define clrtoeol no_clrtoeol # define delch no_delch # define deleteln no_deleteln # define delwin no_delwin # define getch no_getch # define getstr no_getstr # define insch no_insch # define insertln no_insertln # define longname no_longname # define mvprintw no_mvprintw # define mvscanw no_mvscanw # define mvwin no_mvwin # define mvwprintw no_mvwprintw # define mvwscanw no_mvwscanw # define newwin no_newwin # define overlay no_overlay # define overwrite no_overwrite # define printw no_printw # define putp no_putp # define scanw no_scanw # define scroll no_scroll # define setscrreg no_setscrreg # define subwin no_subwin # define touchwin no_touchwin # define tstp no_tstp # define vidattr no_vidattr # define waddch no_waddch # define waddstr no_waddstr # define wclear no_wclear # define wclrtobot no_wclrtobot # define wclrtoeol no_wclrtoeol # define wdelch no_wdelch # define wdeleteln no_wdeleteln # define werase no_werase # define wgetch no_wgetch # define wgetstr no_wgetstr # define winsch no_winsch # define winsertln no_winsertln # define wmove no_wmove # define wprintw no_wprintw # define wrefresh no_wrefresh # define wscanw no_wscanw # define wsetscrreg no_wsetscrreg X/* mv functions that aren't valid */ # define mvdelch no_mvwdelch # define mvgetch no_mvwgetch # define mvgetstr no_mvwgetstr # define mvinch no_mvwinch # define mvinsch no_mvwinsch # define mvwaddch no_mvwaddch # define mvwaddstr no_mvaddstr # define mvwdelch no_mvwdelch # define mvwgetch no_mvwgetch # define mvwgetstr no_mvwgetstr # define mvwinch no_mvwinch # define mvwinsch no_mvwinsch #endif MINICURSES #ifndef MINICURSES X/* Funny "characters" enabled for various special function keys for input */ #define KEY_BREAK 0401 /* break key (unreliable) */ #define KEY_DOWN 0402 /* The four arrow keys ... */ #define KEY_UP 0403 #define KEY_LEFT 0404 #define KEY_RIGHT 0405 /* ... */ #define KEY_HOME 0406 /* Home key (upward+left arrow) */ #define KEY_BACKSPACE 0407 /* backspace (unreliable) */ #define KEY_F0 0410 /* Function keys. Space for 64 */ #define KEY_F(n) (KEY_F0+(n)) /* keys is reserved. */ #define KEY_DL 0510 /* Delete line */ #define KEY_IL 0511 /* Insert line */ #define KEY_DC 0512 /* Delete character */ #define KEY_IC 0513 /* Insert char or enter insert mode */ #define KEY_EIC 0514 /* Exit insert char mode */ #define KEY_CLEAR 0515 /* Clear screen */ #define KEY_EOS 0516 /* Clear to end of screen */ #define KEY_EOL 0517 /* Clear to end of line */ #define KEY_SF 0520 /* Scroll 1 line forward */ #define KEY_SR 0521 /* Scroll 1 line backwards (reverse) */ #define KEY_NPAGE 0522 /* Next page */ #define KEY_PPAGE 0523 /* Previous page */ #define KEY_STAB 0524 /* Set tab */ #define KEY_CTAB 0525 /* Clear tab */ #define KEY_CATAB 0526 /* Clear all tabs */ #define KEY_ENTER 0527 /* Enter or send (unreliable) */ #define KEY_SRESET 0530 /* soft (partial) reset (unreliable) */ #define KEY_RESET 0531 /* reset or hard reset (unreliable) */ #define KEY_PRINT 0532 /* print or copy */ #define KEY_LL 0533 /* home down or bottom (lower left) */ #endif MINICURSES #endif WINDOW //go.sysin dd * echo 'x - =src/curses.priv.h' sed 's/^X//' <<'//go.sysin dd *' >=src/curses.priv.h X/********************************************************************* * COPYRIGHT NOTICE * ********************************************************************** * This software is copyright (C) 1982 by Pavel Curtis * * * * Permission is granted to reproduce and distribute * * this file by any means so long as no fee is charged * * above a nominal handling fee and so long as this * * notice is always included in the copies. * * * * Other rights are reserved except as explicitly granted * * by written permission of the author. * * Pavel Curtis * * Computer Science Dept. * * 405 Upson Hall * * Cornell University * * Ithaca, NY 14853 * * * * Ph- (607) 256-4934 * * * * Pavel.Cornell@Udel-Relay (ARPAnet) * * decvax!cornell!pavel (UUCPnet) * *********************************************************************/ X/* * curses.priv.h * * Header file for curses library objects which are private to * the library. * * $Log: RCS/curses.priv.v $ Revision 2.1 82/10/25 14:46:17 pavel Added Copyright Notice Revision 2.0 82/10/25 13:50:25 pavel Beta-one Test Release * */ #include <stdio.h> #include "curses.h" #define min(a,b) ((a) > (b) ? (b) : (a)) #define max(a,b) ((a) < (b) ? (b) : (a)) #define CHANGED -1 WINDOW *newscr; extern int _tracing; struct try { struct try *child; /* ptr to child. NULL if none */ struct try *sibling; /* ptr to sibling. NULL if none */ char ch; /* character at this node */ short value; /* code of string so far. NULL if none */ }; struct screen { FILE *_ifp; /* input file ptr for this terminal */ FILE *_ofp; /* output file ptr for this terminal */ struct term *_term; /* used by terminfo stuff */ WINDOW *_curscr; /* windows specific to a given terminal */ WINDOW *_newscr; struct try *_keytry; /* "Try" for use with keypad mode */ char _backbuf[10]; /* Buffer for pushed back characters */ int _backcnt; /* How many characters in _backbuf? */ int _cursrow; /* Row and column of physical cursor */ int _curscol; bool _nl; /* True if terminal has CRMOD bit on */ bool _raw; /* True if in raw mode */ bool _cbreak; /* True if in cbreak mode */ bool _echo; /* True if echo on */ bool _nlmapping; /* True if terminal is really doing */ /* NL mapping (fn of raw and nl) */ int _costs[9]; /* costs of cursor movements for mvcur */ int _costinit; /* set if _costs[] is initialized */ }; struct screen *SP; #define MAXCOLUMNS 135 #define MAXLINES 66 #define UNINITIALISED ((struct try * ) -1) //go.sysin dd * echo 'x - =src/object.h' sed 's/^X//' <<'//go.sysin dd *' >=src/object.h X/********************************************************************* * COPYRIGHT NOTICE * ********************************************************************** * This software is copyright (C) 1982 by Pavel Curtis * * * * Permission is granted to reproduce and distribute * * this file by any means so long as no fee is charged * * above a nominal handling fee and so long as this * * notice is always included in the copies. * * * * Other rights are reserved except as explicitly granted * * by written permission of the author. * * Pavel Curtis * * Computer Science Dept. * * 405 Upson Hall * * Cornell University * * Ithaca, NY 14853 * * * * Ph- (607) 256-4934 * * * * Pavel.Cornell@Udel-Relay (ARPAnet) * * decvax!cornell!pavel (UUCPnet) * *********************************************************************/ X/* ** $Header: RCS/object.v Revision 2.1 82/10/25 14:49:50 pavel Exp$ ** ** object.h - Format of compiled terminfo files ** ** Header (12 bytes), containing information given below ** Names Section, containing the names of the terminal ** Boolean Section, containing the values of all of the ** boolean capabilities ** A null byte may be inserted here to make ** sure that the Number Section begins on an ** even word boundary. ** Number Section, containing the values of all of the numeric ** capabilities, each as a short integer ** String Section, containing short integer offsets into the ** String Table, one per string capability ** String Table, containing the actual characters of the string ** capabilities. ** ** NOTE that all short integers in the file are stored using VAX/PDP-style ** byte-swapping, i.e., least-significant byte first. The code in ** read_entry() automatically fixes this up on machines which don't use ** this system (I hope). ** ** $Log: RCS/object.v $ Revision 2.1 82/10/25 14:49:50 pavel Added Copyright Notice Revision 2.0 82/10/24 15:18:19 pavel Beta-one Test Release Revision 1.3 82/08/23 22:31:12 pavel The REAL Alpha-one Release Version Revision 1.2 82/08/19 19:10:18 pavel Alpha Test Release One Revision 1.1 82/08/12 18:48:55 pavel Initial revision ** */ #define MAGIC 0432 struct header { short magic; /* Magic Number (0432) */ short name_size; /* Size of names section */ short bool_count; /* Number of booleans */ short num_count; /* Number of numbers */ short str_count; /* Number of strings */ short str_size; /* Size of string table */ }; //go.sysin dd * echo 'x - =src/term.h' sed 's/^X//' <<'//go.sysin dd *' >=src/term.h X/* ** term.h -- Definition of struct term */ #ifndef SGTTY # include "curses.h" #endif #ifdef SINGLE # define CUR _first_term. #else # define CUR cur_term-> #endif #define auto_left_margin CUR Booleans[0] #define auto_right_margin CUR Booleans[1] #define beehive_glitch CUR Booleans[2] #define ceol_standout_glitch CUR Booleans[3] #define eat_newline_glitch CUR Booleans[4] #define erase_overstrike CUR Booleans[5] #define generic_type CUR Booleans[6] #define hard_copy CUR Booleans[7] #define has_meta_key CUR Booleans[8] #define has_status_line CUR Booleans[9] #define insert_null_glitch CUR Booleans[10] #define memory_above CUR Booleans[11] #define memory_below CUR Booleans[12] #define move_insert_mode CUR Booleans[13] #define move_standout_mode CUR Booleans[14] #define over_strike CUR Booleans[15] #define status_line_esc_ok CUR Booleans[16] #define teleray_glitch CUR Booleans[17] #define tilde_glitch CUR Booleans[18] #define transparent_underline CUR Booleans[19] #define xon_xoff CUR Booleans[20] #define columns CUR Numbers[0] #define init_tabs CUR Numbers[1] #define lines CUR Numbers[2] #define lines_of_memory CUR Numbers[3] #define magic_cookie_glitch CUR Numbers[4] #define padding_baud_rate CUR Numbers[5] #define virtual_terminal CUR Numbers[6] #define width_status_line CUR Numbers[7] #define num_labels CUR Numbers[8] #define label_height CUR Numbers[9] #define label_width CUR Numbers[10] #define back_tab CUR Strings[0] #define bell CUR Strings[1] #define carriage_return CUR Strings[2] #define change_scroll_region CUR Strings[3] #define clear_all_tabs CUR Strings[4] #define clear_screen CUR Strings[5] #define clr_eol CUR Strings[6] #define clr_eos CUR Strings[7] #define column_address CUR Strings[8] #define command_character CUR Strings[9] #define cursor_address CUR Strings[10] #define cursor_down CUR Strings[11] #define cursor_home CUR Strings[12] #define cursor_invisible CUR Strings[13] #define cursor_left CUR Strings[14] #define cursor_mem_address CUR Strings[15] #define cursor_normal CUR Strings[16] #define cursor_right CUR Strings[17] #define cursor_to_ll CUR Strings[18] #define cursor_up CUR Strings[19] #define cursor_visible CUR Strings[20] #define delete_character CUR Strings[21] #define delete_line CUR Strings[22] #define dis_status_line CUR Strings[23] #define down_half_line CUR Strings[24] #define enter_alt_charset_mode CUR Strings[25] #define enter_blink_mode CUR Strings[26] #define enter_bold_mode CUR Strings[27] #define enter_ca_mode CUR Strings[28] #define enter_delete_mode CUR Strings[29] #define enter_dim_mode CUR Strings[30] #define enter_insert_mode CUR Strings[31] #define enter_secure_mode CUR Strings[32] #define enter_protected_mode CUR Strings[33] #define enter_reverse_mode CUR Strings[34] #define enter_standout_mode CUR Strings[35] #define enter_underline_mode CUR Strings[36] #define erase_chars CUR Strings[37] #define exit_alt_charset_mode CUR Strings[38] #define exit_attribute_mode CUR Strings[39] #define exit_ca_mode CUR Strings[40] #define exit_delete_mode CUR Strings[41] #define exit_insert_mode CUR Strings[42] #define exit_standout_mode CUR Strings[43] #define exit_underline_mode CUR Strings[44] #define flash_screen CUR Strings[45] #define form_feed CUR Strings[46] #define from_status_line CUR Strings[47] #define init_1string CUR Strings[48] #define init_2string CUR Strings[49] #define init_3string CUR Strings[50] #define init_file CUR Strings[51] #define insert_character CUR Strings[52] #define insert_line CUR Strings[53] #define insert_padding CUR Strings[54] #define key_backspace CUR Strings[55] #define key_catab CUR Strings[56] #define key_clear CUR Strings[57] #define key_ctab CUR Strings[58] #define key_dc CUR Strings[59] #define key_dl CUR Strings[60] #define key_down CUR Strings[61] #define key_eic CUR Strings[62] #define key_eol CUR Strings[63] #define key_eos CUR Strings[64] #define key_f0 CUR Strings[65] #define key_f1 CUR Strings[66] #define key_f10 CUR Strings[67] #define key_f2 CUR Strings[68] #define key_f3 CUR Strings[69] #define key_f4 CUR Strings[70] #define key_f5 CUR Strings[71] #define key_f6 CUR Strings[72] #define key_f7 CUR Strings[73] #define key_f8 CUR Strings[74] #define key_f9 CUR Strings[75] #define key_home CUR Strings[76] #define key_ic CUR Strings[77] #define key_il CUR Strings[78] #define key_left CUR Strings[79] #define key_ll CUR Strings[80] #define key_npage CUR Strings[81] #define key_ppage CUR Strings[82] #define key_right CUR Strings[83] #define key_sf CUR Strings[84] #define key_sr CUR Strings[85] #define key_stab CUR Strings[86] #define key_up CUR Strings[87] #define keypad_local CUR Strings[88] #define keypad_xmit CUR Strings[89] #define lab_f0 CUR Strings[90] #define lab_f1 CUR Strings[91] #define lab_f10 CUR Strings[92] #define lab_f2 CUR Strings[93] #define lab_f3 CUR Strings[94] #define lab_f4 CUR Strings[95] #define lab_f5 CUR Strings[96] #define lab_f6 CUR Strings[97] #define lab_f7 CUR Strings[98] #define lab_f8 CUR Strings[99] #define lab_f9 CUR Strings[100] #define meta_off CUR Strings[101] #define meta_on CUR Strings[102] #define newline CUR Strings[103] #define pad_char CUR Strings[104] #define parm_dch CUR Strings[105] #define parm_delete_line CUR Strings[106] #define parm_down_cursor CUR Strings[107] #define parm_ich CUR Strings[108] #define parm_index CUR Strings[109] #define parm_insert_line CUR Strings[110] #define parm_left_cursor CUR Strings[111] #define parm_right_cursor CUR Strings[112] #define parm_rindex CUR Strings[113] #define parm_up_cursor CUR Strings[114] #define pkey_key CUR Strings[115] #define pkey_local CUR Strings[116] #define pkey_xmit CUR Strings[117] #define print_screen CUR Strings[118] #define prtr_off CUR Strings[119] #define prtr_on CUR Strings[120] #define repeat_char CUR Strings[121] #define reset_1string CUR Strings[122] #define reset_2string CUR Strings[123] #define reset_3string CUR Strings[124] #define reset_file CUR Strings[125] #define restore_cursor CUR Strings[126] #define row_address CUR Strings[127] #define save_cursor CUR Strings[128] #define scroll_forward CUR Strings[129] #define scroll_reverse CUR Strings[130] #define set_attributes CUR Strings[131] #define set_tab CUR Strings[132] #define set_window CUR Strings[133] #define tab CUR Strings[134] #define to_status_line CUR Strings[135] #define underline_char CUR Strings[136] #define up_half_line CUR Strings[137] #define init_prog CUR Strings[138] #define key_a1 CUR Strings[139] #define key_a3 CUR Strings[140] #define key_b2 CUR Strings[141] #define key_c1 CUR Strings[142] #define key_c3 CUR Strings[143] #define prtr_non CUR Strings[144] #define char_padding CUR Strings[145] #define acs_chars CUR Strings[146] #define plab_norm CUR Strings[147] struct term { char *term_names; /* offset in str_table of terminal names */ char *str_table; /* pointer to string table */ short Filedes; /* file description being written to */ SGTTY Ottyb, /* original state of the terminal */ Nttyb; /* current state of the terminal */ char Booleans[21]; short Numbers[11]; char *Strings[148]; }; struct term _first_term; struct term *cur_term; #define BOOLCOUNT 21 #define NUMCOUNT 11 #define STRCOUNT 148 //go.sysin dd * echo 'x - =src/terminfo.h' sed 's/^X//' <<'//go.sysin dd *' >=src/terminfo.h X/********************************************************************* * COPYRIGHT NOTICE * ********************************************************************** * This software is copyright (C) 1982 by Pavel Curtis * * * * Permission is granted to reproduce and distribute * * this file by any means so long as no fee is charged * * above a nominal handling fee and so long as this * * notice is always included in the copies. * * * * Other rights are reserved except as explicitly granted * * by written permission of the author. * * Pavel Curtis * * Computer Science Dept. * * 405 Upson Hall * * Cornell University * * Ithaca, NY 14853 * * * * Ph- (607) 256-4934 * * * * Pavel.Cornell@Udel-Relay (ARPAnet) * * decvax!cornell!pavel (UUCPnet) * *********************************************************************/ X/* * $Header: RCS/terminfo.v Revision 2.1 82/10/25 14:49:59 pavel Exp$ * * terminfo.h - those things needed for programs runnning at the * terminfo level. * * $Log: RCS/terminfo.v $ Revision 2.1 82/10/25 14:49:59 pavel Added Copyright Notice Revision 2.0 82/10/24 15:18:26 pavel Beta-one Test Release Revision 1.4 82/08/23 22:31:21 pavel The REAL Alpha-one Release Version Revision 1.3 82/08/19 19:24:11 pavel Alpha Test Release One Revision 1.2 82/08/19 19:10:56 pavel Alpha Test Release One Revision 1.1 82/08/15 16:42:20 pavel Initial revision * */ #ifndef A_STANDOUT #include <stdio.h> #include <sgtty.h> #define SGTTY struct sgttyb /* Video attributes */ #define A_NORMAL 0000000 #define A_ATTRIBUTES 0377600 #define A_CHARTEXT 0000177 #define A_STANDOUT 0000200 #define A_UNDERLINE 0000400 #ifndef MINICURSES # define A_REVERSE 0001000 # define A_BLINK 0002000 # define A_DIM 0004000 # define A_BOLD 0010000 # define A_INVIS 0020000 # define A_PROTECT 0040000 # define A_ALTCHARSET 0100000 #endif MINICURSES extern char ttytype[]; #define NAMESIZE 256 #endif //go.sysin dd * echo 'x - =src/unctrl.h' sed 's/^X//' <<'//go.sysin dd *' >=src/unctrl.h X/********************************************************************* * COPYRIGHT NOTICE * ********************************************************************** * This software is copyright (C) 1982 by Pavel Curtis * * * * Permission is granted to reproduce and distribute * * this file by any means so long as no fee is charged * * above a nominal handling fee and so long as this * * notice is always included in the copies. * * * * Other rights are reserved except as explicitly granted * * by written permission of the author. * * Pavel Curtis * * Computer Science Dept. * * 405 Upson Hall * * Cornell University * * Ithaca, NY 14853 * * * * Ph- (607) 256-4934 * * * * Pavel.Cornell@Udel-Relay (ARPAnet) * * decvax!cornell!pavel (UUCPnet) * *********************************************************************/ X/* * unctrl.h * * $Header: RCS/unctrl.v Revision 2.1 82/10/25 14:50:04 pavel Exp$ * * $Log: RCS/unctrl.v $ Revision 2.1 82/10/25 14:50:04 pavel Added Copyright Notice Revision 2.0 82/10/24 15:18:28 pavel Beta-one Test Release Revision 1.3 82/08/23 22:31:24 pavel The REAL Alpha-one Release Version Revision 1.2 82/08/19 19:10:59 pavel Alpha Test Release One Revision 1.1 82/08/19 19:04:26 pavel Initial revision */ extern char *_unctrl[]; # define unctrl(ch) (_unctrl[(unsigned) ch]) //go.sysin dd * exit
sources@genrad.UUCP (12/19/84)
This is part of a distribution of a public domain version of terminfo/curses It is a rather large distribution, so I have broken it up into 11 modules (each less than 64K long.) Each shar format module should end with the line "exit". This code is completely public domain, originally written by Pavel Curtis of Cornell University. This version has some small improvements and bug fixes. This unit contains: The Caps file (the capability database master file) dump.c the first installation of the lib files. Parts 7, 8 and 9 will be the rest of the library sources. ----------------- cut here ---------------- : Run this shell script with "sh" not "csh" PATH=:/bin:/usr/bin:/usr/ucb export PATH if test ! -d =src then echo 'Making directory "=src"' mkdir =src fi echo 'x - =src/Caps' sed 's/^X//' <<'//go.sysin dd *' >=src/Caps #********************************************************************* # COPYRIGHT NOTICE * #********************************************************************* # This software is copyright (C) 1982 by Pavel Curtis * # * # Permission is granted to reproduce and distribute * # this file by any means so long as no fee is charged * # above a nominal handling fee and so long as this * # notice is always included in the copies. * # * # Other rights are reserved except as explicitly granted * # by written permission of the author. * # Pavel Curtis * # Computer Science Dept. * # 405 Upson Hall * # Cornell University * # Ithaca, NY 14853 * # * # Ph- (607) 256-4934 * # * # Pavel.Cornell@Udel-Relay (ARPAnet) * # decvax!cornell!pavel (UUCPnet) * #********************************************************************/ # $Header: RCS/Caps.v Revision 2.1 82/10/25 14:45:23 pavel Exp$ # # Format for the Caps file: # variable_name "capname" type Comment # # where variable_name is the name of the variable used by a # programmer capname is the name used inside the /etc/terminfo # file type is one of bool, number or str and Comment is the text # of the comment which will go in term.h. # # All blank lines and lines beginning with '#' are ignored. # # >> NOTE!!! New capabilities \must/ be placed at the end of # >>>> the appropriate list (e.g. bools, numbers, strings). # >>>> This allows previous versions of programs to still function # >> \without/ recompilation. # auto_left_margin "bw" bool cub1 wraps from column 0 to last column auto_right_margin "am" bool Terminal has automatic margins beehive_glitch "xsb" bool Beehive (f1=escape, f2=ctrl C) ceol_standout_glitch "xhp" bool Standout not erased by overwriting (hp) eat_newline_glitch "xenl" bool newline ignored after 80 cols (Concept) erase_overstrike "eo" bool Can erase overstrikes with a blank generic_type "gn" bool Generic line type (e.g. dialup, switch). hard_copy "hc" bool Hardcopy terminal has_meta_key "km" bool Has a meta key (shift, sets parity bit) has_status_line "hs" bool Has extra "status line" insert_null_glitch "in" bool Insert mode distinguishes nulls memory_above "da" bool Display may be retained above the screen memory_below "db" bool Display may be retained below the screen move_insert_mode "mir" bool Safe to move while in insert mode move_standout_mode "msgr" bool Safe to move in standout modes over_strike "os" bool Terminal overstrikes status_line_esc_ok "eslok" bool Escape can be used on the status line teleray_glitch "xt" bool Tabs destructive, magic so char (Teleray 1061) tilde_glitch "hz" bool Hazeltine; can't print ~'s transparent_underline "ul" bool underline character overstrikes xon_xoff "xon" bool Terminal uses xon/xoff handshaking columns "cols" number Number of columns in a line init_tabs "it" number Tabs initially every # spaces lines "lines" number Number of lines on screen or page lines_of_memory "lm" number Lines of memory if > lines. 0 means varies magic_cookie_glitch "xmc" number Number of blank chars left by smso or rmso padding_baud_rate "pb" number Lowest baud rate where cr/nl padding needed virtual_terminal "vt" number Virtual terminal number (CB/Unix) width_status_line "wsl" number No. columns in status line num_labels "nlab" number No. of labels on screen (start at 1) label_height "lh" number No. rows in each label label_width "lw" number No. cols in each label back_tab "cbt" str Back tab (P) bell "bel" str Audible signal (bell) (P) carriage_return "cr" str Carriage return (P*) change_scroll_region "csr" str change to lines #1 through #2 (vt100) (PG) clear_all_tabs "tbc" str Clear all tab stops. (P) clear_screen "clear" str Clear screen (P*) clr_eol "el" str Clear to end of line (P) clr_eos "ed" str Clear to end of display (P*) column_address "hpa" str Set cursor column (PG) command_character "CC" str Term. settable cmd char in prototype cursor_address "cup" str Cursor motion to row #1 col #2 (PG) cursor_down "cud1" str Down one line cursor_home "home" str Home cursor (if no cup) cursor_invisible "civis" str Make cursor invisible cursor_left "cub1" str Move cursor left one space. cursor_mem_address "mrcup" str Memory relative cursor addressing. cursor_normal "cnorm" str Make cursor appear normal (undo vs/vi) cursor_right "cuf1" str Non-destructive space (cursor right) cursor_to_ll "ll" str Last line, first column (if no cup) cursor_up "cuu1" str Upline (cursor up) cursor_visible "cvvis" str Make cursor very visible delete_character "dch1" str Delete character (P*) delete_line "dl1" str Delete line (P*) dis_status_line "dsl" str Disable status line down_half_line "hd" str Half-line down (forward 1/2 linefeed) enter_alt_charset_mode "smacs" str Start alternate character set (P) enter_blink_mode "blink" str Turn on blinking enter_bold_mode "bold" str Turn on bold (extra bright) mode enter_ca_mode "smcup" str String to end programs that use cup enter_delete_mode "smdc" str Delete mode (enter) enter_dim_mode "dim" str Turn on half-bright mode enter_insert_mode "smir" str Insert mode (enter); enter_secure_mode "invis" str Turn on blank mode (chars invisible) enter_protected_mode "prot" str Turn on protected mode enter_reverse_mode "rev" str Turn on reverse video mode enter_standout_mode "smso" str Begin stand out mode enter_underline_mode "smul" str Start underscore mode erase_chars "ech" str Erase #1 characters (PG) exit_alt_charset_mode "rmacs" str End alternate character set (P) exit_attribute_mode "sgr0" str Turn off all attributes exit_ca_mode "rmcup" str String to begin programs that use cup exit_delete_mode "rmdc" str End delete mode exit_insert_mode "rmir" str End insert mode; exit_standout_mode "rmso" str End stand out mode exit_underline_mode "rmul" str End underscore mode flash_screen "flash" str Visible bell (may not move cursor) form_feed "ff" str Hardcopy terminal page eject (P*) from_status_line "fsl" str Return from status line init_1string "is1" str Terminal initialization string init_2string "is2" str Terminal initialization string init_3string "is3" str Terminal initialization string init_file "if" str Name of file containing is insert_character "ich1" str Insert character (P) insert_line "il1" str Add new blank line (P*) insert_padding "ip" str Insert pad after character inserted (P*) key_backspace "kbs" str Sent by backspace key key_catab "ktbc" str Sent by clear-all-tabs key. key_clear "kclr" str Sent by clear screen or erase key. key_ctab "kctab" str Sent by clear-tab key key_dc "kdch1" str Sent by delete character key. key_dl "kdl1" str Sent by delete line key. key_down "kcud1" str Sent by terminal down arrow key key_eic "krmir" str Sent by rmir or smir in insert mode. key_eol "kel" str Sent by clear-to-end-of-line key. key_eos "ked" str Sent by clear-to-end-of-screen key. key_f0 "kf0" str Sent by function key f0. key_f1 "kf1" str Sent by function key f1. key_f10 "kf10" str Sent by function key f10. key_f2 "kf2" str Sent by function key f2. key_f3 "kf3" str Sent by function key f3. key_f4 "kf4" str Sent by function key f4. key_f5 "kf5" str Sent by function key f5. key_f6 "kf6" str Sent by function key f6. key_f7 "kf7" str Sent by function key f7. key_f8 "kf8" str Sent by function key f8. key_f9 "kf9" str Sent by function key f9. key_home "khome" str Sent by home key. key_ic "kich1" str Sent by ins char/enter ins mode key. key_il "kil1" str Sent by insert line. key_left "kcub1" str Sent by terminal left arrow key key_ll "kll" str Sent by "home down" key (lower left) key_npage "knp" str Sent by next-page key key_ppage "kpp" str Sent by previous-page key key_right "kcuf1" str Sent by terminal right arrow key key_sf "kind" str Sent by scroll-forward/down key key_sr "kri" str Sent by scroll-backward/up key key_stab "khts" str Sent by set-tab key key_up "kcuu1" str Sent by terminal up arrow key keypad_local "rmkx" str Out of "keypad transmit" mode keypad_xmit "smkx" str Put terminal in "keypad transmit" mode lab_f0 "lf0" str Labels on function key f0 if not f0 lab_f1 "lf1" str Labels on function key f1 if not f1 lab_f10 "lf10" str Labels on function key f10 if not f10 lab_f2 "lf2" str Labels on function key f2 if not f2 lab_f3 "lf3" str Labels on function key f3 if not f3 lab_f4 "lf4" str Labels on function key f4 if not f4 lab_f5 "lf5" str Labels on function key f5 if not f5 lab_f6 "lf6" str Labels on function key f6 if not f6 lab_f7 "lf7" str Labels on function key f7 if not f7 lab_f8 "lf8" str Labels on function key f8 if not f8 lab_f9 "lf9" str Labels on function key f9 if not f9 meta_off "rmm" str Turn off "meta mode" meta_on "smm" str Turn on "meta mode" (8th bit) newline "nel" str Newline (behaves like cr followed by lf) pad_char "pad" str Pad character (rather than null) parm_dch "dch" str Delete #1 chars (PG*) parm_delete_line "dl" str Delete #1 lines (PG*) parm_down_cursor "cud" str Move cursor down #1 lines. (PG*) parm_ich "ich" str Insert #1 blank chars (PG*) parm_index "indn" str Scroll forward #1 lines (PG) parm_insert_line "il" str Add #1 new blank lines (PG*) parm_left_cursor "cub" str Move cursor left #1 spaces (PG) parm_right_cursor "cuf" str Move cursor right #1 spaces. (PG*) parm_rindex "rin" str Scroll backward #1 lines (PG) parm_up_cursor "cuu" str Move cursor up #1 lines. (PG*) pkey_key "pfkey" str Prog funct key #1 to type string #2 pkey_local "pfloc" str Prog funct key #1 to execute string #2 pkey_xmit "pfx" str Prog funct key #1 to xmit string #2 print_screen "mc0" str Print contents of the screen prtr_off "mc4" str Turn off the printer prtr_on "mc5" str Turn on the printer repeat_char "rep" str Repeat char #1 #2 times. (PG*) reset_1string "rs1" str Reset terminal completely to sane modes. reset_2string "rs2" str Reset terminal completely to sane modes. reset_3string "rs3" str Reset terminal completely to sane modes. reset_file "rf" str Name of file containing reset string. restore_cursor "rc" str Restore cursor to position of last sc. row_address "vpa" str Like hpa but sets row. (PG) save_cursor "sc" str Save cursor position. (P) scroll_forward "ind" str Scroll text up (P) scroll_reverse "ri" str Scroll text down (P) set_attributes "sgr" str Define the video attributes (PG9) set_tab "hts" str Set a tab in all rows, current column. set_window "wind" str Current window is lines #1-#2 cols #3-#4 tab "ht" str Tab to next 8 space hardware tab stop. to_status_line "tsl" str Go to status line underline_char "uc" str Underscore one char and move past it up_half_line "hu" str Half-line up (reverse 1/2 linefeed) init_prog "iprog" str Path name of program for init key_a1 "ka1" str Upper left of keypad key_a3 "ka3" str Upper right of keypad key_b2 "kb2" str Center of keypad key_c1 "kc1" str Lower left of keypad key_c3 "kc3" str Lower right of keypad prtr_non "mc5p" str Turn on the printer for #1 bytes. char_padding "rmp" str Like ip but when in replace mode acs_chars "acsc" str Graphics char set pairs aAbBcC - defn=vt100 plab_norm "pln" str Prog label #1 to show string #2 //go.sysin dd * echo 'x - =src/dump.c' sed 's/^X//' <<'//go.sysin dd *' >=src/dump.c X/********************************************************************* * COPYRIGHT NOTICE * ********************************************************************** * This software is copyright (C) 1982 by Pavel Curtis * * * * Permission is granted to reproduce and distribute * * this file by any means so long as no fee is charged * * above a nominal handling fee and so long as this * * notice is always included in the copies. * * * * Other rights are reserved except as explicitly granted * * by written permission of the author. * * Pavel Curtis * * Computer Science Dept. * * 405 Upson Hall * * Cornell University * * Ithaca, NY 14853 * * * * Ph- (607) 256-4934 * * * * Pavel.Cornell@Udel-Relay (ARPAnet) * * decvax!cornell!pavel (UUCPnet) * *********************************************************************/ X/* * dump.c - dump the contents of a compiled terminfo file in a * human-readable format. * * $Log: RCS/dump.v $ * Revision 2.1 82/10/25 14:46:20 pavel * Added Copyright Notice * * Revision 2.0 82/10/24 15:17:29 pavel * Beta-one Test Release * * Revision 1.3 82/08/23 22:30:18 pavel * The REAL Alpha-one Release Version * * Revision 1.2 82/08/19 19:12:50 pavel * Alpha Test Release One * * Revision 1.1 82/08/12 18:39:19 pavel * Initial revision * * */ static char RCSid[] = "$Header: RCS/dump.v Revision 2.1 82/10/25 14:46:20 pavel Exp$"; #include "compiler.h" #include "term.h" char *BoolNames[], *NumNames[], *StrNames[]; main(argc, argv) int argc; char *argv[]; { int i, j; int cur_column; char buffer[1024]; for (j=1; j < argc; j++) { if (read_entry(argv[j], &_first_term) < 0) { fprintf(stderr, "read_entry bombed on %s\n", argv[j]); abort(); } printf("%s,\n", _first_term.term_names); putchar('\t'); cur_column = 9; for (i=0; i < BOOLCOUNT; i++) { if (_first_term.Booleans[i] == TRUE) { if (cur_column > 9 && cur_column + strlen(BoolNames[i]) + 2 > 79) { printf("\n\t"); cur_column = 9; } printf("%s, ", BoolNames[i]); cur_column += strlen(BoolNames[i]) + 2; } } for (i=0; i < NUMCOUNT; i++) { if (_first_term.Numbers[i] != -1) { if (cur_column > 9 && cur_column + strlen(NumNames[i]) + 5 > 79) { printf("\n\t"); cur_column = 9; } printf("%s#%d, ", NumNames[i], _first_term.Numbers[i]); cur_column += strlen(NumNames[i]) + 5; } } for (i=0; i < STRCOUNT; i++) { if (_first_term.Strings[i]) { sprintf(buffer, "%s=%s, ", StrNames[i], _first_term.Strings[i]); expand(buffer); if (cur_column > 9 && cur_column + strlen(buffer) > 79) { printf("\n\t"); cur_column = 9; } printf("%s", buffer); cur_column += strlen(buffer); } } putchar('\n'); } } typedef unsigned char uchar; expand(str) uchar *str; { char buffer[1024]; int bufp; uchar *ptr; bufp = 0; ptr = str; while (*str) { if (*str < ' ') { buffer[bufp++] = '^'; buffer[bufp++] = *str + '@'; } else if (*str < '\177') buffer[bufp++] = *str; else { sprintf(&buffer[bufp], "\\%03o", *str); bufp += 4; } str++; } buffer[bufp] = '\0'; strcpy(ptr, buffer); } //go.sysin dd * echo 'x - =src/lib_addch.c' sed 's/^X//' <<'//go.sysin dd *' >=src/lib_addch.c X/********************************************************************* * COPYRIGHT NOTICE * ********************************************************************** * This software is copyright (C) 1982 by Pavel Curtis * * * * Permission is granted to reproduce and distribute * * this file by any means so long as no fee is charged * * above a nominal handling fee and so long as this * * notice is always included in the copies. * * * * Other rights are reserved except as explicitly granted * * by written permission of the author. * * Pavel Curtis * * Computer Science Dept. * * 405 Upson Hall * * Cornell University * * Ithaca, NY 14853 * * * * Ph- (607) 256-4934 * * * * Pavel.Cornell@Udel-Relay (ARPAnet) * * decvax!cornell!pavel (UUCPnet) * *********************************************************************/ X/* ** lib_addch.c ** ** The routine waddch(). ** ** $Log: RCS/lib_addch.v $ * Revision 2.1 82/10/25 14:46:23 pavel * Added Copyright Notice * * Revision 2.0 82/10/24 15:19:46 pavel * Beta-one Test Release * ** */ static char RCSid[] = "$Header: RCS/lib_addch.v Revision 2.1 82/10/25 14:46:23 pavel Exp$"; #include "curses.h" #include "curses.priv.h" #include "unctrl.h" waddch(win, c) WINDOW *win; char c; { int x, y; int newx; chtype ch = c; #ifdef UNDEFINED if (_tracing) _tracef("waddch(%o,%c) called", win, ch); #endif x = win->_curx; y = win->_cury; if (y > win->_maxy || x > win->_maxx || y < 0 || x < 0) return(ERR); switch (ch) { case '\t': for (newx = x + (8 - (x & 07)); x < newx; x++) if (waddch(win, ' ') == ERR) return(ERR); return(OK); case '\n': wclrtoeol(win); if (SP->_nl) x = 0; goto newline; case '\r': x = 0; break; case '\b': if (--x < 0) x = 0; break; default: if (ch < ' ') return(waddstr(win, unctrl(ch))); ch |= win->_attrs; if (win->_line[y][x] != ch) { if (win->_firstchar[y] == _NOCHANGE) win->_firstchar[y] = win->_lastchar[y] = x; else if (x < win->_firstchar[y]) win->_firstchar[y] = x; else if (x > win->_lastchar[y]) win->_lastchar[y] = x; win->_numchngd[y]++; } win->_line[y][x++] = ch; if (x > win->_maxx) { x = 0; newline: y++; if (y > win->_regbottom) { y--; if (win->_scroll) scroll(win); else return ERR; } } break; } win->_curx = x; win->_cury = y; return(OK); } //go.sysin dd * echo 'x - =src/lib_addstr.c' sed 's/^X//' <<'//go.sysin dd *' >=src/lib_addstr.c X/********************************************************************* * COPYRIGHT NOTICE * ********************************************************************** * This software is copyright (C) 1982 by Pavel Curtis * * * * Permission is granted to reproduce and distribute * * this file by any means so long as no fee is charged * * above a nominal handling fee and so long as this * * notice is always included in the copies. * * * * Other rights are reserved except as explicitly granted * * by written permission of the author. * * Pavel Curtis * * Computer Science Dept. * * 405 Upson Hall * * Cornell University * * Ithaca, NY 14853 * * * * Ph- (607) 256-4934 * * * * Pavel.Cornell@Udel-Relay (ARPAnet) * * decvax!cornell!pavel (UUCPnet) * *********************************************************************/ X/* ** lib_addstr.c * ** The routine waddstr(). ** ** $Log: RCS/lib_addstr.v $ * Revision 2.1 82/10/25 14:46:26 pavel * Added Copyright Notice * * Revision 2.0 82/10/24 15:19:59 pavel * Beta-one Test Release * ** */ static char RCSid[] = "$Header: RCS/lib_addstr.v Revision 2.1 82/10/25 14:46:26 pavel Exp$"; #include "curses.h" #include "curses.priv.h" waddstr(win, str) WINDOW *win; char *str; { #ifdef TRACE if (_tracing) _tracef("waddstr(%o,%o) called", win, str); #endif while (*str) { if (waddch(win, *str++) == ERR) return(ERR); } return(OK); } //go.sysin dd * echo 'x - =src/lib_beep.c' sed 's/^X//' <<'//go.sysin dd *' >=src/lib_beep.c X/********************************************************************* * COPYRIGHT NOTICE * ********************************************************************** * This software is copyright (C) 1982 by Pavel Curtis * * * * Permission is granted to reproduce and distribute * * this file by any means so long as no fee is charged * * above a nominal handling fee and so long as this * * notice is always included in the copies. * * * * Other rights are reserved except as explicitly granted * * by written permission of the author. * * Pavel Curtis * * Computer Science Dept. * * 405 Upson Hall * * Cornell University * * Ithaca, NY 14853 * * * * Ph- (607) 256-4934 * * * * Pavel.Cornell@Udel-Relay (ARPAnet) * * decvax!cornell!pavel (UUCPnet) * *********************************************************************/ X/* * beep.c * * Routines beep() and flash() * * $Log: RCS/lib_beep.v $ * Revision 2.1 82/10/25 14:46:29 pavel * Added Copyright Notice * * Revision 2.0 82/10/24 15:17:31 pavel * Beta-one Test Release * * Revision 1.3 82/08/23 22:30:22 pavel * The REAL Alpha-one Release Version * * Revision 1.2 82/08/19 19:11:02 pavel * Alpha Test Release One * * Revision 1.1 82/08/12 18:40:14 pavel * Initial revision * * */ static char RCSid[] = "$Header: RCS/lib_beep.v Revision 2.1 82/10/25 14:46:29 pavel Exp$"; #include "curses.h" #include "curses.priv.h" #include "term.h" static outc(ch) char ch; { putc(ch, SP->_ofp); } X/* * beep() * * Sound the current terminal's audible bell if it has one. If not, * flash the screen if possible. * */ beep() { #ifdef TRACE if (_tracing) _tracef("beep() called"); #endif if (bell) tputs(bell, 1, outc); else if (flash_screen) tputs(flash_screen, 1, outc); } X/* * flash() * * Flash the current terminal's screen if possible. If not, * sound the audible bell if one exists. * */ flash() { #ifdef TRACE if (_tracing) _tracef("flash() called"); #endif if (flash_screen) tputs(flash_screen, 1, outc); else if (bell) tputs(bell, 1, outc); } //go.sysin dd * echo 'x - =src/lib_box.c' sed 's/^X//' <<'//go.sysin dd *' >=src/lib_box.c X/********************************************************************* * COPYRIGHT NOTICE * ********************************************************************** * This software is copyright (C) 1982 by Pavel Curtis * * * * Permission is granted to reproduce and distribute * * this file by any means so long as no fee is charged * * above a nominal handling fee and so long as this * * notice is always included in the copies. * * * * Other rights are reserved except as explicitly granted * * by written permission of the author. * * Pavel Curtis * * Computer Science Dept. * * 405 Upson Hall * * Cornell University * * Ithaca, NY 14853 * * * * Ph- (607) 256-4934 * * * * Pavel.Cornell@Udel-Relay (ARPAnet) * * decvax!cornell!pavel (UUCPnet) * *********************************************************************/ X/* ** lib_box.c ** ** The routine box(). ** ** $Log: RCS/lib_box.v $ * Revision 2.1 82/10/25 14:46:31 pavel * Added Copyright Notice * * Revision 2.0 82/10/24 15:20:07 pavel * Beta-one Test Release * ** */ static char RCSid[] = "$Header: RCS/lib_box.v Revision 2.1 82/10/25 14:46:31 pavel Exp$"; #include "curses.h" #include "curses.priv.h" box(win, vert, hor) WINDOW *win; char vert, hor; { int i; int endy, endx; chtype *fp, *lp; #ifdef TRACE if (_tracing) _tracef("box(%o,%c,%c) called", win, vert, hor); #endif endx = win->_maxx; endy = win->_maxy; fp = win->_line[0]; lp = win->_line[endy]; for (i = 0; i <= endx; i++) fp[i] = lp[i] = hor; for (i = 0; i <= endy; i++) { win->_line[i][0] = (win->_line[i][endx] = vert); win->_firstchar[i] = 0; win->_lastchar[i] = endx; win->_numchngd[i] += 2; } win->_numchngd[0] = win->_numchngd[endy] = endx; if (! win->_scroll && (win->_flags & _SCROLLWIN)) fp[0] = fp[endx] = lp[0] = lp[endx] = ' '; } //go.sysin dd * echo 'x - =src/lib_clear.c' sed 's/^X//' <<'//go.sysin dd *' >=src/lib_clear.c X/********************************************************************* * COPYRIGHT NOTICE * ********************************************************************** * This software is copyright (C) 1982 by Pavel Curtis * * * * Permission is granted to reproduce and distribute * * this file by any means so long as no fee is charged * * above a nominal handling fee and so long as this * * notice is always included in the copies. * * * * Other rights are reserved except as explicitly granted * * by written permission of the author. * * Pavel Curtis * * Computer Science Dept. * * 405 Upson Hall * * Cornell University * * Ithaca, NY 14853 * * * * Ph- (607) 256-4934 * * * * Pavel.Cornell@Udel-Relay (ARPAnet) * * decvax!cornell!pavel (UUCPnet) * *********************************************************************/ X/* ** lib_clear.c ** ** The routine wclear(). ** ** $Log: RCS/lib_clear.v $ * Revision 2.1 82/10/25 14:46:34 pavel * Added Copyright Notice * * Revision 2.0 82/10/24 15:20:17 pavel * Beta-one Test Release * ** */ static char RCSid[] = "$Header: RCS/lib_clear.v Revision 2.1 82/10/25 14:46:34 pavel Exp$"; #include "curses.h" #include "curses.priv.h" wclear(win) WINDOW *win; { #ifdef TRACE if (_tracing) _tracef("wclear(%o) called", win); #endif werase(win); win->_clear = TRUE; return; } //go.sysin dd * echo 'x - =src/lib_clrbot.c' sed 's/^X//' <<'//go.sysin dd *' >=src/lib_clrbot.c X/********************************************************************* * COPYRIGHT NOTICE * ********************************************************************** * This software is copyright (C) 1982 by Pavel Curtis * * * * Permission is granted to reproduce and distribute * * this file by any means so long as no fee is charged * * above a nominal handling fee and so long as this * * notice is always included in the copies. * * * * Other rights are reserved except as explicitly granted * * by written permission of the author. * * Pavel Curtis * * Computer Science Dept. * * 405 Upson Hall * * Cornell University * * Ithaca, NY 14853 * * * * Ph- (607) 256-4934 * * * * Pavel.Cornell@Udel-Relay (ARPAnet) * * decvax!cornell!pavel (UUCPnet) * *********************************************************************/ X/* ** lib_clrbot.c ** ** The routine wclrtobot(). ** ** $Log: RCS/lib_clrbot.v $ * Revision 2.1 82/10/25 14:46:37 pavel * Added Copyright Notice * * Revision 2.0 82/10/24 15:20:24 pavel * Beta-one Test Release * ** */ static char RCSid[] = "$Header: RCS/lib_clrbot.v Revision 2.1 82/10/25 14:46:37 pavel Exp$"; #include "curses.h" #include "curses.priv.h" wclrtobot(win) WINDOW *win; { chtype *ptr, *end, *maxx; int y, startx, minx; chtype blank = ' ' | win->_attrs; #ifdef TRACE if (_tracing) _tracef("wclrtobot(%o) called", win); #endif startx = win->_curx; for (y = win->_cury; y <= win->_regbottom; y++) { minx = _NOCHANGE; end = &win->_line[y][win->_maxx]; for (ptr = &win->_line[y][startx]; ptr <= end; ptr++) { if (*ptr != blank) { maxx = ptr; if (minx == _NOCHANGE) minx = ptr - win->_line[y]; *ptr = blank; } } if (minx != _NOCHANGE) { if (win->_firstchar[y] > minx || win->_firstchar[y] == _NOCHANGE) win->_firstchar[y] = minx; if (win->_lastchar[y] < maxx - win->_line[y]) win->_lastchar[y] = maxx - win->_line[y]; } startx = 0; } } //go.sysin dd * echo 'x - =src/lib_clreol.c' sed 's/^X//' <<'//go.sysin dd *' >=src/lib_clreol.c X/********************************************************************* * COPYRIGHT NOTICE * ********************************************************************** * This software is copyright (C) 1982 by Pavel Curtis * * * * Permission is granted to reproduce and distribute * * this file by any means so long as no fee is charged * * above a nominal handling fee and so long as this * * notice is always included in the copies. * * * * Other rights are reserved except as explicitly granted * * by written permission of the author. * * Pavel Curtis * * Computer Science Dept. * * 405 Upson Hall * * Cornell University * * Ithaca, NY 14853 * * * * Ph- (607) 256-4934 * * * * Pavel.Cornell@Udel-Relay (ARPAnet) * * decvax!cornell!pavel (UUCPnet) * *********************************************************************/ X/* ** lib_clreol.c ** ** The routine wclrtoeol(). ** ** $Log: RCS/lib_clreol.v $ * Revision 2.1 82/10/25 14:46:42 pavel * Added Copyright Notice * * Revision 2.0 82/10/24 15:20:38 pavel * Beta-one Test Release * ** */ static char RCSid[] = "$Header: RCS/lib_clreol.v Revision 2.1 82/10/25 14:46:42 pavel Exp$"; #include "curses.h" #include "curses.priv.h" wclrtoeol(win) WINDOW *win; { chtype *maxx, *ptr, *end; int y, x, minx; chtype blank = ' ' | win->_attrs; #ifdef TRACE if (_tracing) _tracef("wclrtoeol(%o) called", win); #endif y = win->_cury; x = win->_curx; end = &win->_line[y][win->_maxx]; minx = _NOCHANGE; maxx = &win->_line[y][x]; for (ptr = maxx; ptr < end; ptr++) { if (*ptr != blank) { maxx = ptr; if (minx == _NOCHANGE) minx = ptr - win->_line[y]; *ptr = blank; win->_numchngd[y] += 1; } } if (minx != _NOCHANGE) { if (win->_firstchar[y] > minx || win->_firstchar[y] == _NOCHANGE) win->_firstchar[y] = minx; if (win->_lastchar[y] < maxx - win->_line[y]) win->_lastchar[y] = maxx - win->_line[y]; } } //go.sysin dd * echo 'x - =src/lib_data.c' sed 's/^X//' <<'//go.sysin dd *' >=src/lib_data.c X/********************************************************************* * COPYRIGHT NOTICE * ********************************************************************** * This software is copyright (C) 1982 by Pavel Curtis * * * * Permission is granted to reproduce and distribute * * this file by any means so long as no fee is charged * * above a nominal handling fee and so long as this * * notice is always included in the copies. * * * * Other rights are reserved except as explicitly granted * * by written permission of the author. * * Pavel Curtis * * Computer Science Dept. * * 405 Upson Hall * * Cornell University * * Ithaca, NY 14853 * * * * Ph- (607) 256-4934 * * * * Pavel.Cornell@Udel-Relay (ARPAnet) * * decvax!cornell!pavel (UUCPnet) * *********************************************************************/ X/* * lib_data.c - Global data definitions and initialisations * */ #include "curses.priv.h" #include "curses.h" #include "term.h" char ttytype[NAMESIZE]; #ifdef TRACE int _tracing = 1; #else int _tracing = 0; #endif struct screen *SP = 0; //go.sysin dd * echo 'x - =src/lib_delch.c' sed 's/^X//' <<'//go.sysin dd *' >=src/lib_delch.c X/********************************************************************* * COPYRIGHT NOTICE * ********************************************************************** * This software is copyright (C) 1982 by Pavel Curtis * * * * Permission is granted to reproduce and distribute * * this file by any means so long as no fee is charged * * above a nominal handling fee and so long as this * * notice is always included in the copies. * * * * Other rights are reserved except as explicitly granted * * by written permission of the author. * * Pavel Curtis * * Computer Science Dept. * * 405 Upson Hall * * Cornell University * * Ithaca, NY 14853 * * * * Ph- (607) 256-4934 * * * * Pavel.Cornell@Udel-Relay (ARPAnet) * * decvax!cornell!pavel (UUCPnet) * *********************************************************************/ X/* ** lib_delch.c ** ** The routine wdelch(). ** ** $Log: RCS/lib_delch.v $ * Revision 2.1 82/10/25 14:46:52 pavel * Added Copyright Notice * * Revision 2.0 82/10/24 15:20:47 pavel * Beta-one Test Release * ** */ static char RCSid[] = "$Header: RCS/lib_delch.v Revision 2.1 82/10/25 14:46:52 pavel Exp$"; #include "curses.h" #include "curses.priv.h" #include "term.h" wdelch(win) WINDOW *win; { chtype *temp1, *temp2; chtype *end; #ifdef TRACE if (_tracing) _tracef("wdelch(%o) called", win); #endif end = &win->_line[win->_cury][win->_maxx]; temp2 = &win->_line[win->_cury][win->_curx + 1]; temp1 = temp2 - 1; while (temp1 < end) *temp1++ = *temp2++; *temp1 = ' ' | win->_attrs; win->_lastchar[win->_cury] = win->_maxx; if (win->_firstchar[win->_cury] == _NOCHANGE || win->_firstchar[win->_cury] > win->_curx) win->_firstchar[win->_cury] = win->_curx; if (delete_character) win->_numchngd += 1; else win->_numchngd += win->_maxx - win->_curx + 1; } //go.sysin dd * echo 'x - =src/lib_deleteln.c' sed 's/^X//' <<'//go.sysin dd *' >=src/lib_deleteln.c X/********************************************************************* * COPYRIGHT NOTICE * ********************************************************************** * This software is copyright (C) 1982 by Pavel Curtis * * * * Permission is granted to reproduce and distribute * * this file by any means so long as no fee is charged * * above a nominal handling fee and so long as this * * notice is always included in the copies. * * * * Other rights are reserved except as explicitly granted * * by written permission of the author. * * Pavel Curtis * * Computer Science Dept. * * 405 Upson Hall * * Cornell University * * Ithaca, NY 14853 * * * * Ph- (607) 256-4934 * * * * Pavel.Cornell@Udel-Relay (ARPAnet) * * decvax!cornell!pavel (UUCPnet) * *********************************************************************/ X/* ** lib_deleteln.c ** ** The routine wdeleteln(). ** ** $Log: RCS/lib_deleteln.v $ * Revision 2.1 82/10/25 14:46:55 pavel * Added Copyright Notice * * Revision 2.0 82/10/25 13:44:03 pavel * Beta-one Test Release * ** */ static char RCSid[] = "$Header: RCS/lib_deleteln.v Revision 2.1 82/10/25 14:46:55 pavel Exp$"; #include "curses.h" #include "curses.priv.h" wdeleteln(win) WINDOW *win; { chtype *end, *temp; int y; #ifdef TRACE if (_tracing) _tracef("wdeleteln(%o) called", win); #endif temp = win->_line[win->_cury]; for (y = win->_cury; y < win->_regbottom; y++) { win->_line[y] = win->_line[y+1]; win->_firstchar[y] = 0; win->_lastchar[y] = win->_maxx; win->_numchngd[y] = win->_maxx; } win->_line[win->_regbottom] = temp; for (end = &(temp[win->_maxx]); temp <= end; ) *temp++ = ' ' | win->_attrs; } //go.sysin dd * echo 'x - =src/lib_delwin.c' sed 's/^X//' <<'//go.sysin dd *' >=src/lib_delwin.c X/********************************************************************* * COPYRIGHT NOTICE * ********************************************************************** * This software is copyright (C) 1982 by Pavel Curtis * * * * Permission is granted to reproduce and distribute * * this file by any means so long as no fee is charged * * above a nominal handling fee and so long as this * * notice is always included in the copies. * * * * Other rights are reserved except as explicitly granted * * by written permission of the author. * * Pavel Curtis * * Computer Science Dept. * * 405 Upson Hall * * Cornell University * * Ithaca, NY 14853 * * * * Ph- (607) 256-4934 * * * * Pavel.Cornell@Udel-Relay (ARPAnet) * * decvax!cornell!pavel (UUCPnet) * *********************************************************************/ X/* ** lib_delwin.c ** ** The routine delwin(). ** ** $Log: RCS/lib_delwin.v $ * Revision 2.1 82/10/25 14:47:01 pavel * Added Copyright Notice * * Revision 2.0 82/10/25 13:44:21 pavel * Beta-one Test Release * ** */ static char RCSid[] = "$Header: RCS/lib_delwin.v Revision 2.1 82/10/25 14:47:01 pavel Exp$"; #include "curses.h" #include "curses.priv.h" delwin(win) WINDOW *win; { int i; #ifdef TRACE if (_tracing) _tracef("delwin(%o) called", win); #endif if (! (win->_flags & _SUBWIN)) { for (i = 0; i <= win->_maxy && win->_line[i]; i++) cfree(win->_line[i]); } cfree(win->_numchngd); cfree(win->_firstchar); cfree(win->_lastchar); cfree(win->_line); cfree(win); } //go.sysin dd * echo 'x - =src/lib_endwin.c' sed 's/^X//' <<'//go.sysin dd *' >=src/lib_endwin.c X/********************************************************************* * COPYRIGHT NOTICE * ********************************************************************** * This software is copyright (C) 1982 by Pavel Curtis * * * * Permission is granted to reproduce and distribute * * this file by any means so long as no fee is charged * * above a nominal handling fee and so long as this * * notice is always included in the copies. * * * * Other rights are reserved except as explicitly granted * * by written permission of the author. * * Pavel Curtis * * Computer Science Dept. * * 405 Upson Hall * * Cornell University * * Ithaca, NY 14853 * * * * Ph- (607) 256-4934 * * * * Pavel.Cornell@Udel-Relay (ARPAnet) * * decvax!cornell!pavel (UUCPnet) * *********************************************************************/ X/* ** lib_endwin.c ** ** The routine endwin(). ** ** $Log: RCS/lib_endwin.v $ * Revision 2.1 82/10/25 14:47:13 pavel * Added Copyright Notice * * Revision 2.0 82/10/25 13:45:05 pavel * Beta-one Test Release * ** */ static char RCSid[] = "$Header: RCS/lib_endwin.v Revision 2.1 82/10/25 14:47:13 pavel Exp$"; #include "term.h" #include "curses.h" #include "curses.priv.h" static outc(ch) char ch; { putc(ch, SP->_ofp); } endwin() { #ifdef TRACE if (_tracing) _tracef("endwin() called"); #endif resetterm(); mvcur(-1, -1, LINES - 1, 0); if (exit_ca_mode) tputs(exit_ca_mode, 1, outc); if (curscr && (curscr->_attrs != A_NORMAL)) { vidputs(A_NORMAL, outc); curscr->_attrs = A_NORMAL; } fflush(SP->_ofp); } //go.sysin dd * echo 'x - =src/lib_erase.c' sed 's/^X//' <<'//go.sysin dd *' >=src/lib_erase.c X/********************************************************************* * COPYRIGHT NOTICE * ********************************************************************** * This software is copyright (C) 1982 by Pavel Curtis * * * * Permission is granted to reproduce and distribute * * this file by any means so long as no fee is charged * * above a nominal handling fee and so long as this * * notice is always included in the copies. * * * * Other rights are reserved except as explicitly granted * * by written permission of the author. * * Pavel Curtis * * Computer Science Dept. * * 405 Upson Hall * * Cornell University * * Ithaca, NY 14853 * * * * Ph- (607) 256-4934 * * * * Pavel.Cornell@Udel-Relay (ARPAnet) * * decvax!cornell!pavel (UUCPnet) * *********************************************************************/ X/* ** lib_erase.c ** ** The routine werase(). ** ** $Log: RCS/lib_erase.v $ * Revision 2.2 82/11/03 12:27:41 pavel * Fixed off-by-one error... If only I had used an invariant... * * Revision 2.1 82/10/25 14:47:17 pavel * Added Copyright Notice * * Revision 2.0 82/10/25 13:45:12 pavel * Beta-one Test Release * ** */ static char RCSid[] = "$Header: RCS/lib_erase.v Revision 2.2 82/11/03 12:27:41 pavel Exp$"; #include "curses.h" #include "curses.priv.h" werase(win) WINDOW *win; { int y; chtype *sp, *end, *start, *maxx; int minx; chtype blank = ' ' | win->_attrs; #ifdef TRACE if (_tracing) _tracef("werase(%o) called", win); #endif for (y = win->_regtop; y <= win->_regbottom; y++) { minx = _NOCHANGE; start = win->_line[y]; end = &start[win->_maxx]; for (sp = start; sp <= end; sp++) { if (*sp != blank) { maxx = sp; if (minx == _NOCHANGE) minx = sp - start; *sp = blank; win->_numchngd[y] += 1; } } if (minx != _NOCHANGE) { if (win->_firstchar[y] > minx || win->_firstchar[y] == _NOCHANGE) win->_firstchar[y] = minx; if (win->_lastchar[y] < maxx - win->_line[y]) win->_lastchar[y] = maxx - win->_line[y]; } } win->_curx = win->_cury = 0; } //go.sysin dd * echo 'x - =src/lib_fixterm.c' sed 's/^X//' <<'//go.sysin dd *' >=src/lib_fixterm.c X/********************************************************************* * COPYRIGHT NOTICE * ********************************************************************** * This software is copyright (C) 1982 by Pavel Curtis * * * * Permission is granted to reproduce and distribute * * this file by any means so long as no fee is charged * * above a nominal handling fee and so long as this * * notice is always included in the copies. * * * * Other rights are reserved except as explicitly granted * * by written permission of the author. * * Pavel Curtis * * Computer Science Dept. * * 405 Upson Hall * * Cornell University * * Ithaca, NY 14853 * * * * Ph- (607) 256-4934 * * * * Pavel.Cornell@Udel-Relay (ARPAnet) * * decvax!cornell!pavel (UUCPnet) * *********************************************************************/ X/* * fixterm.c * * Routines: * fixterm() * resetterm() * saveterm() * gettmode() * setterm() * baudrate() * erasechar() * killchar() * flushinp() * savetty() * resetty() * * $Log: RCS/lib_fixterm.v $ * Revision 2.1 82/10/25 14:47:22 pavel * Added Copyright Notice * * Revision 2.0 82/10/24 15:17:36 pavel * Beta-one Test Release * * Revision 1.3 82/08/23 22:30:27 pavel * The REAL Alpha-one Release Version * * Revision 1.2 82/08/19 19:11:21 pavel * Alpha Test Release One * * Revision 1.1 82/08/12 18:40:30 pavel * Initial revision * * */ static char RCSid[] = "$Header: RCS/lib_fixterm.v Revision 2.1 82/10/25 14:47:22 pavel Exp$"; #include <sys/ioctl.h> #include "curses.h" #include "curses.priv.h" #include "term.h" X/* * fixterm() * resetterm() * * fixterm() establishes the tty modes contained in cur_term->Nttyb. * resetterm() establishes those in cur_term->Ottyb. * */ fixterm() { #ifdef TRACE if (_tracing) _tracef("fixterm() called"); #endif stty(cur_term->Filedes, &cur_term->Nttyb); } resetterm() { #ifdef TRACE if (_tracing) _tracef("resetterm() called"); #endif stty(cur_term->Filedes, &cur_term->Ottyb); } saveterm() { #ifdef TRACE if (_tracing) _tracef("saveterm() called"); #endif gtty(cur_term->Filedes, &cur_term->Nttyb); } X/* * gettmode() * setterm(type) * * These are kept around for backward compatibilty. gettmode() does * nothing. setterm() results in a proper call to setupterm() * */ gettmode() { #ifdef TRACE if (_tracing) _tracef("gettmode() called"); #endif } setterm(type) char *type; { #ifdef TRACE if (_tracing) _tracef("setterm() called"); #endif setupterm(type, 1, 0); } X/* * erasechar() * * Return erase character as given in cur_term->Ottyb. * */ char erasechar() { #ifdef TRACE if (_tracing) _tracef("erasechar() called"); #endif return(cur_term->Ottyb.sg_erase); } X/* * killchar() * * Return kill character as given in cur_term->Ottyb. * */ char killchar() { #ifdef TRACE if (_tracing) _tracef("killchar() called"); #endif return(cur_term->Ottyb.sg_kill); } X/* * flushinp() * * Flush any input on cur_term->Filedes * */ flushinp() { #ifdef TRACE if (_tracing) _tracef("flushinp() called"); #endif ioctl(cur_term->Filedes, TIOCFLUSH, 0); if (SP) SP->_backcnt = 0; } X/* * int * baudrate() * * Returns the current terminal's baud rate. * */ static int speeds[] = { 0, 50, 75, 110, 134, 150, 200, 300, 600, 1200, 1800, 2400, 4800, 9600, 19200, 38400 }; int baudrate() { #ifdef UNDEFINED if (_tracing) _tracef("baudrate() called"); #endif return(speeds[cur_term->Nttyb.sg_ospeed]); } X/* ** savetty() and resetty() ** ** Kept around for compatibility. ** */ static struct sgttyb sgbuf; savetty() { #ifdef TRACE if (_tracing) _tracef("savetty() called"); #endif gtty(cur_term->Filedes, &sgbuf); } resetty() { #ifdef TRACE if (_tracing) _tracef("resetty() called"); #endif stty(cur_term->Filedes, &sgbuf); } //go.sysin dd * exit
sources@genrad.UUCP (12/20/84)
This is part of a distribution of a public domain version of terminfo/curses It is a rather large distribution, so I have broken it up into 11 modules (each less than 64K long.) Each shar format module should end with the line "exit". This code is completely public domain, originally written by Pavel Curtis of Cornell University. This version has some small improvements and bug fixes. This unit contains: more source units of the library. Part 8 will be more source units of the library. ----------------- cut here ---------------- : Run this shell script with "sh" not "csh" PATH=:/bin:/usr/bin:/usr/ucb export PATH if test ! -d =src then echo 'Making directory "=src"' mkdir =src fi echo 'x - =src/lib_getch.c' sed 's/^X//' <<'//go.sysin dd *' >=src/lib_getch.c X/********************************************************************* * COPYRIGHT NOTICE * ********************************************************************** * This software is copyright (C) 1982 by Pavel Curtis * * * * Permission is granted to reproduce and distribute * * this file by any means so long as no fee is charged * * above a nominal handling fee and so long as this * * notice is always included in the copies. * * * * Other rights are reserved except as explicitly granted * * by written permission of the author. * * Pavel Curtis * * Computer Science Dept. * * 405 Upson Hall * * Cornell University * * Ithaca, NY 14853 * * * * Ph- (607) 256-4934 * * * * Pavel.Cornell@Udel-Relay (ARPAnet) * * decvax!cornell!pavel (UUCPnet) * *********************************************************************/ X/* ** lib_getch.c ** ** The routine getch(). ** ** $Log: RCS/lib_getch.v $ * Revision 2.1 82/10/25 14:47:29 pavel * Added Copyright Notice * * Revision 2.0 82/10/25 13:45:19 pavel * Beta-one Test Release * ** */ static char RCSid[] = "$Header: RCS/lib_getch.v Revision 2.1 82/10/25 14:47:29 pavel Exp$"; #include <signal.h> #include "curses.h" #include "curses.priv.h" #define nextc() (SP->_backcnt > 0 ? SP->_backbuf[--SP->_backcnt] \ : getc(SP->_ifp)) #define putback(ch) SP->_backbuf[SP->_backcnt++] = ch wgetch(win) WINDOW *win; { bool setHere = FALSE; /* cbreak mode was set here */ short ch; /* 'short' because of keypad codes */ short kgetch(); #ifdef TRACE if (_tracing) _tracef("wgetch(%o) called", win); #endif if (! win->_scroll && (win->_flags & _FULLWIN) && win->_curx == win->_maxx && win->_cury == win->_maxy) return(ERR); #ifdef FIONREAD if (win->_nodelay) { long count; ioctl(fileno(SP->_ifp), FIONREAD, &count); if (! count) return(-1); } #endif if (SP->_echo && ! (SP->_raw || SP->_cbreak)) { cbreak(); setHere = TRUE; } if (win->_use_keypad) ch = kgetch(); else ch = nextc(); if (SP->_echo && ch < 0400) /* ch < 0400 => not a keypad key */ { mvwaddch(curscr, win->_begy + win->_cury, win->_begx + win->_curx, ch | win->_attrs); waddch(win, ch | win->_attrs); } if (setHere) nocbreak(); return(ch); } X/* ** short ** kgetch() ** ** Get an input character, but take care of keypad sequences, returning ** an appropriate code when one matches the input. After each character ** is received, set a one-second alarm call. If no more of the sequence ** is received by the time the alarm goes off, pass through the sequence ** gotten so far. ** */ static bool alarmed; static short kgetch() { struct try *ptr; char ch; char buffer[10]; /* Assume no sequences longer than 10 */ char *bufp = buffer; int (*oldsig)(); int sigalrm(); ptr = SP->_keytry; oldsig = signal(SIGALRM, sigalrm); alarmed = FALSE; do { ch = nextc(); if (ch != EOF) /* getc() returns EOF on error, too */ *(bufp++) = ch; if (alarmed) break; while (ptr != NULL && ptr->ch != ch) ptr = ptr->sibling; if (ptr != NULL) { if (ptr->value != NULL) { alarm(0); signal(SIGALRM, oldsig); return(ptr->value); } else { ptr = ptr->child; alarm(1); } } } while (ptr != NULL); alarm(0); signal(SIGALRM, oldsig); while (--bufp > buffer) putback(*bufp); return(*bufp); } static sigalrm() { alarmed = TRUE; signal(SIGALRM, sigalrm); } //go.sysin dd * echo 'x - =src/lib_getstr.c' sed 's/^X//' <<'//go.sysin dd *' >=src/lib_getstr.c X/********************************************************************* * COPYRIGHT NOTICE * ********************************************************************** * This software is copyright (C) 1982 by Pavel Curtis * * * * Permission is granted to reproduce and distribute * * this file by any means so long as no fee is charged * * above a nominal handling fee and so long as this * * notice is always included in the copies. * * * * Other rights are reserved except as explicitly granted * * by written permission of the author. * * Pavel Curtis * * Computer Science Dept. * * 405 Upson Hall * * Cornell University * * Ithaca, NY 14853 * * * * Ph- (607) 256-4934 * * * * Pavel.Cornell@Udel-Relay (ARPAnet) * * decvax!cornell!pavel (UUCPnet) * *********************************************************************/ X/* ** lib_getstr.c ** ** The routine wgetstr(). ** ** $Log: RCS/lib_getstr.v $ * Revision 2.1 82/10/25 14:47:33 pavel * Added Copyright Notice * * Revision 2.0 82/10/25 13:45:39 pavel * Beta-one Test Release * ** */ static char RCSid[] = "$Header: RCS/lib_getstr.v Revision 2.1 82/10/25 14:47:33 pavel Exp$"; #include "curses.h" #include "curses.priv.h" #include "unctrl.h" #define backspace() { \ mvwaddstr(curscr, win->_begy + win->_cury, \ win->_begx + win->_curx, "\b \b");\ waddstr(win, "\b \b"); \ fputs("\b \b", SP->_ofp); \ fflush(SP->_ofp); \ } wgetstr(win,str) WINDOW *win; char *str; { bool oldnl, oldecho, oldraw, oldcbreak; char erasec; char killc; char *oldstr; #ifdef TRACE if (_tracing) _tracef("wgetstr(%o,%o) called", win, str); #endif oldnl = SP->_nl; oldecho = SP->_echo; oldraw = SP->_raw; oldcbreak = SP->_cbreak; nl(); noecho(); noraw(); cbreak(); erasec = erasechar(); killc = killchar(); oldstr = str; while ((*str = getc(SP->_ifp)) != ERR && *str != '\n') { if (*str == erasec) { if (str > oldstr) { str--; backspace(); if (*str < ' ' || *str == '\177') backspace(); } } else if (*str == killc) { while (str > oldstr) { str--; backspace(); if (*str < ' ' || *str == '\177') backspace(); } } else { mvwaddstr(curscr, win->_begy + win->_cury, win->_begx + win->_curx, unctrl(*str)); waddstr(win, unctrl(*str)); fputs(unctrl(*str), SP->_ofp); fflush(SP->_ofp); str++; } } if (! oldnl) nonl(); if (oldecho) echo(); if (oldraw) raw(); if (! oldcbreak) nocbreak(); if (*str == ERR) { *str = '\0'; return(ERR); } *str = '\0'; #ifdef TRACE if (_tracing) _tracef("\twgetstr returns %s", oldstr); #endif return(OK); } //go.sysin dd * echo 'x - =src/lib_initscr.c' sed 's/^X//' <<'//go.sysin dd *' >=src/lib_initscr.c X/********************************************************************* * COPYRIGHT NOTICE * ********************************************************************** * This software is copyright (C) 1982 by Pavel Curtis * * * * Permission is granted to reproduce and distribute * * this file by any means so long as no fee is charged * * above a nominal handling fee and so long as this * * notice is always included in the copies. * * * * Other rights are reserved except as explicitly granted * * by written permission of the author. * * Pavel Curtis * * Computer Science Dept. * * 405 Upson Hall * * Cornell University * * Ithaca, NY 14853 * * * * Ph- (607) 256-4934 * * * * Pavel.Cornell@Udel-Relay (ARPAnet) * * decvax!cornell!pavel (UUCPnet) * *********************************************************************/ X/* ** lib_initscr.c ** ** The routine initscr(). ** ** $Log: RCS/lib_initscr.v $ * Revision 2.1 82/10/25 14:47:36 pavel * Added Copyright Notice * * Revision 2.0 82/10/25 13:45:54 pavel * Beta-one Test Release * ** */ static char RCSid[] = "$Header: RCS/lib_initscr.v Revision 2.1 82/10/25 14:47:36 pavel Exp$"; #include "curses.h" #include "curses.priv.h" WINDOW * initscr() { #ifdef TRACE _init_trace(); if (_tracing) _tracef("initscr() called"); #endif if (newterm(getenv("TERM"), stdout) == ERR) return(ERR); else return(stdscr); } //go.sysin dd * echo 'x - =src/lib_insch.c' sed 's/^X//' <<'//go.sysin dd *' >=src/lib_insch.c X/********************************************************************* * COPYRIGHT NOTICE * ********************************************************************** * This software is copyright (C) 1982 by Pavel Curtis * * * * Permission is granted to reproduce and distribute * * this file by any means so long as no fee is charged * * above a nominal handling fee and so long as this * * notice is always included in the copies. * * * * Other rights are reserved except as explicitly granted * * by written permission of the author. * * Pavel Curtis * * Computer Science Dept. * * 405 Upson Hall * * Cornell University * * Ithaca, NY 14853 * * * * Ph- (607) 256-4934 * * * * Pavel.Cornell@Udel-Relay (ARPAnet) * * decvax!cornell!pavel (UUCPnet) * *********************************************************************/ X/* ** lib_insch.c ** ** The routine winsch(). ** ** $Log: RCS/lib_insch.v $ * Revision 2.1 82/10/25 14:47:39 pavel * Added Copyright Notice * * Revision 2.0 82/10/25 13:46:02 pavel * Beta-one Test Release * ** */ static char RCSid[] = "$Header: RCS/lib_insch.v Revision 2.1 82/10/25 14:47:39 pavel Exp$"; #include "curses.h" #include "curses.priv.h" winsch(win, c) WINDOW *win; char c; { chtype *temp1, *temp2; chtype *end; #ifdef TRACE if (_tracing) _tracef("winsch(%o,'%c') called", win, c); #endif end = &win->_line[win->_cury][win->_curx]; temp1 = &win->_line[win->_cury][win->_maxx]; temp2 = temp1 - 1; while (temp1 > end) *temp1-- = *temp2--; *temp1 = c | win->_attrs; win->_lastchar[win->_cury] = win->_maxx; if (win->_firstchar[win->_cury] == _NOCHANGE || win->_firstchar[win->_cury] > win->_curx) win->_firstchar[win->_cury] = win->_curx; } //go.sysin dd * echo 'x - =src/lib_insertln.c' sed 's/^X//' <<'//go.sysin dd *' >=src/lib_insertln.c X/********************************************************************* * COPYRIGHT NOTICE * ********************************************************************** * This software is copyright (C) 1982 by Pavel Curtis * * * * Permission is granted to reproduce and distribute * * this file by any means so long as no fee is charged * * above a nominal handling fee and so long as this * * notice is always included in the copies. * * * * Other rights are reserved except as explicitly granted * * by written permission of the author. * * Pavel Curtis * * Computer Science Dept. * * 405 Upson Hall * * Cornell University * * Ithaca, NY 14853 * * * * Ph- (607) 256-4934 * * * * Pavel.Cornell@Udel-Relay (ARPAnet) * * decvax!cornell!pavel (UUCPnet) * *********************************************************************/ X/* ** lib_insertln.c ** ** The routine winsertln(). ** ** $Log: RCS/lib_insertln.v $ * Revision 2.1 82/10/25 14:47:44 pavel * Added Copyright Notice * * Revision 2.0 82/10/25 13:46:12 pavel * Beta-one Test Release * ** */ static char RCSid[] = "$Header: RCS/lib_insertln.v Revision 2.1 82/10/25 14:47:44 pavel Exp$"; #include "curses.h" #include "curses.priv.h" winsertln(win) WINDOW *win; { chtype *temp, *end; int y; #ifdef TRACE if (_tracing) _tracef("winsertln(%o) called", win); #endif temp = win->_line[win->_regbottom]; win->_firstchar[win->_cury] = 0; win->_lastchar[win->_cury] = win->_maxx; for (y = win->_regbottom; y > win->_cury; y--) { win->_line[y] = win->_line[y-1]; win->_firstchar[y] = 0; win->_lastchar[y] = win->_maxx; } win->_line[win->_cury] = temp; for (end = &temp[win->_maxx]; temp <= end; temp++) *temp = ' ' | win->_attrs; } //go.sysin dd * echo 'x - =src/lib_longname.c' sed 's/^X//' <<'//go.sysin dd *' >=src/lib_longname.c X/********************************************************************* * COPYRIGHT NOTICE * ********************************************************************** * This software is copyright (C) 1982 by Pavel Curtis * * * * Permission is granted to reproduce and distribute * * this file by any means so long as no fee is charged * * above a nominal handling fee and so long as this * * notice is always included in the copies. * * * * Other rights are reserved except as explicitly granted * * by written permission of the author. * * Pavel Curtis * * Computer Science Dept. * * 405 Upson Hall * * Cornell University * * Ithaca, NY 14853 * * * * Ph- (607) 256-4934 * * * * Pavel.Cornell@Udel-Relay (ARPAnet) * * decvax!cornell!pavel (UUCPnet) * *********************************************************************/ X/* ** lib_longname.c ** ** The routine longname(). ** ** $Log: RCS/lib_longname.v $ * Revision 2.1 82/10/25 14:47:49 pavel * Added Copyright Notice * * Revision 2.0 82/10/25 13:46:21 pavel * Beta-one Test Release * ** */ static char RCSid[] = "$Header: RCS/lib_longname.v Revision 2.1 82/10/25 14:47:49 pavel Exp$"; #include "curses.h" #include "curses.priv.h" char * longname() { char *ptr; #ifdef TRACE if (_tracing) _tracef("longname() called"); #endif for (ptr = ttytype + strlen(ttytype); ptr > ttytype; ptr--) if (*ptr == '|') return(ptr + 1); return(ttytype); } //go.sysin dd * echo 'x - =src/lib_move.c' sed 's/^X//' <<'//go.sysin dd *' >=src/lib_move.c X/********************************************************************* * COPYRIGHT NOTICE * ********************************************************************** * This software is copyright (C) 1982 by Pavel Curtis * * * * Permission is granted to reproduce and distribute * * this file by any means so long as no fee is charged * * above a nominal handling fee and so long as this * * notice is always included in the copies. * * * * Other rights are reserved except as explicitly granted * * by written permission of the author. * * Pavel Curtis * * Computer Science Dept. * * 405 Upson Hall * * Cornell University * * Ithaca, NY 14853 * * * * Ph- (607) 256-4934 * * * * Pavel.Cornell@Udel-Relay (ARPAnet) * * decvax!cornell!pavel (UUCPnet) * *********************************************************************/ X/* ** lib_move.c ** ** The routine wmove(). ** ** $Log: RCS/lib_move.v $ * Revision 2.1 82/10/25 14:47:51 pavel * Added Copyright Notice * * Revision 2.0 82/10/25 13:46:31 pavel * Beta-one Test Release * ** */ static char RCSid[] = "$Header: RCS/lib_move.v Revision 2.1 82/10/25 14:47:51 pavel Exp$"; #include "curses.h" #include "curses.priv.h" wmove(win, y, x) WINDOW *win; int y, x; { #ifdef TRACE if (_tracing) _tracef("wmove(%o,%d,%d) called", win, y, x); #endif if (0 <= x && x <= win->_maxx && win->_regtop <= y && y <= win->_regbottom) { win->_curx = x; win->_cury = y; return(OK); } else return(ERR); } //go.sysin dd * echo 'x - =src/lib_mvcur.c' sed 's/^X//' <<'//go.sysin dd *' >=src/lib_mvcur.c X/********************************************************************* * COPYRIGHT NOTICE * ********************************************************************** * This software is copyright (C) 1982 by Pavel Curtis * * * * Permission is granted to reproduce and distribute * * this file by any means so long as no fee is charged * * above a nominal handling fee and so long as this * * notice is always included in the copies. * * * * Other rights are reserved except as explicitly granted * * by written permission of the author. * * Pavel Curtis * * Computer Science Dept. * * 405 Upson Hall * * Cornell University * * Ithaca, NY 14853 * * * * Ph- (607) 256-4934 * * * * Pavel.Cornell@Udel-Relay (ARPAnet) * * decvax!cornell!pavel (UUCPnet) * *********************************************************************/ X/* ** ** lib_mvcur.c ** ** mvcur() and its subroutines ** ** $Log: RCS/lib_mvcur.v $ * Revision 2.1 82/10/25 14:47:54 pavel * Added Copyright Notice * * Revision 2.0 82/10/25 13:46:40 pavel * Beta-one Test Release * ** ** Revisions needed: ** implement c_save instead of multiple tputs() calls ** routine revisions */ static char RCSid[] = "$Header: RCS/lib_mvcur.v Revision 2.1 82/10/25 14:47:54 pavel Exp$"; #include "term.h" #include "curses.h" #include "curses.priv.h" #define BUFSIZE 128 /* size of strategy buffer */ struct Sequence { int vec[BUFSIZE], /* vector of operations */ *end, /* end of vector */ cost; /* cost of vector */ }; X/* ** #define ** Make_seq_best(s1, s2) ** ** Make_seq_best() swaps the values ** of the pointers if s1->cost > s2->cost. */ #define Make_seq_best(s1, s2) \ if (s1->cost > s2->cost) \ { \ struct Sequence *temp; \ \ temp = s1; \ s1 = s2; \ s2 = temp; \ } XFILE *out_file; /* pointer to output file */ static int c_count; /* used for counting tputs output */ X/*rev c_save not yet used static char *c_save; /* used for saving tputs output */ #define INFINITY 1000 /* biggest, impossible sequence cost */ #define NUM_OPS 16 /* num. term. control sequences */ #define NUM_NPARM 9 /* num. ops wo/ parameters */ /* operator indexes into op_info */ #define CARRIAGE_RETURN 0 /* watch out for nl mapping */ #define CURS_DOWN 1 #define CURS_HOME 2 #define CURS_LEFT 3 #define CURS_RIGHT 4 #define CURS_TO_LL 5 #define CURS_UP 6 #define TAB 7 #define BACK_TAB 8 #define ROW_ADDR 9 #define COL_ADDR 10 #define P_DOWN_CURS 11 #define P_LEFT_CURS 12 #define P_RIGHT_CURS 13 #define P_UP_CURS 14 #define CURS_ADDR 15 static bool loc_init = FALSE; /* set if op_info is init'ed */ static bool rel_ok; /* set if we really know where we are */ X/* * op_info[NUM_OPS] * * op_info[] contains for operations with no parameters * the cost of the operation. These ops should be first in the array. * For operations with parameters, op_info[] contains * the negative of the number of parameters. */ static int op_info[NUM_OPS] = { 0, /* carriage_return */ 0, /* cursor_down */ 0, /* cursor_home */ 0, /* cursor_left */ 0, /* cursor_right */ 0, /* cursor_to_ll */ 0, /* cursor_up */ 0, /* tab */ 0, /* back_tab */ -1, /* row_address */ -1, /* column_address */ -1, /* parm_down_cursor */ -1, /* parm_left_cursor */ -1, /* parm_right_cursor */ -1, /* parm_up_cursor */ -2 /* cursor_address */ }; X/* ** ** mvcur(oldrow, oldcol, newrow, newcol) ** ** mvcur() optimally moves the cursor from the position ** specified by (oldrow, oldcol) to (newrow, newcol). If ** (oldrow, oldcol) == (-1, -1), mvcur() does not use relative ** cursor motions. If the coordinates are otherwise ** out of bounds, it mods them into range. ** ** Revisions needed: ** eat_newline_glitch, auto_right_margin */ mvcur(oldrow, oldcol, newrow, newcol) int oldrow, oldcol, newrow, newcol; { struct Sequence seqA, seqB, /* allocate work structures */ col0seq, /* sequence to get from col0 to nc */ *best, /* best sequence so far */ *try; /* next try */ #ifdef TRACE if (_tracing) _tracef("mvcur(%d,%d,%d,%d) called", oldrow, oldcol, newrow, newcol); #endif update_ops(); /* make sure op_info[] is current */ if (oldrow < 0 || oldcol < 0) rel_ok = FALSE; /* relative ops ok? */ else { rel_ok = TRUE; oldrow %= lines; /* mod values into range */ oldcol %= columns; } newrow %= lines; newcol %= columns; best = &seqA; try = &seqB; /* try out direct cursor addressing */ zero_seq(best); add_op(best, CURS_ADDR, newrow, newcol); /* try out independent row/column addressing */ if (rel_ok) { zero_seq(try); row(try, oldrow, newrow); column(try, oldcol, newcol); Make_seq_best(best, try); } zero_seq(&col0seq); /* store seq. to get from c0 to nc */ column(&col0seq, 0, newcol); if(col0seq.cost < INFINITY) /* can get from col0 to newcol */ { /* try out homing and then row/column */ if (! rel_ok || newcol < oldcol || newrow < oldrow) { zero_seq(try); add_op(try, CURS_HOME, 1); row(try, 0, newrow); add_seq(try, &col0seq); Make_seq_best(best, try); } /* try out homing to last line and then row/column */ if (! rel_ok || newcol < oldcol || newrow > oldrow) { zero_seq(try); add_op(try, CURS_TO_LL, 1); row(try, lines - 1, newrow); add_seq(try, &col0seq); Make_seq_best(best, try); } } #ifdef TRACE if (_tracing) _tracef("\tmvcur: result follows"); #endif out_seq(best); #ifdef TRACE if (_tracing) _tracef("\tmvcur: end of result"); #endif } X/* ** row(outseq, oldrow, newrow) ** ** row() adds the best sequence for moving ** the cursor from oldrow to newrow to seq. ** row() considers row_address, parm_up/down_cursor ** and cursor_up/down. */ static row(outseq, orow, nrow) int orow, nrow; /* old, new cursor locations */ struct Sequence *outseq; /* where to put the output */ { struct Sequence seqA, seqB, *best, /* best sequence so far */ *try; /* next try */ int parm_cursor, one_step; best = &seqA; try = &seqB; if (nrow == orow) return; if (nrow < orow) { parm_cursor = P_UP_CURS; one_step = CURS_UP; } else { parm_cursor = P_DOWN_CURS; one_step = CURS_DOWN; } /* try out direct row addressing */ zero_seq(best); add_op(best, ROW_ADDR, nrow); /* try out paramaterized up or down motion */ if (rel_ok) { zero_seq(try); add_op(try, parm_cursor, abs(orow - nrow)); Make_seq_best(best, try); } /* try getting there one step at a time... */ if (rel_ok) { zero_seq(try); add_op(try, one_step, abs(orow-nrow)); Make_seq_best(best, try); } add_seq(outseq, best); } X/* ** column(outseq, oldcol, newcol) ** ** column() adds the best sequence for moving ** the cursor from oldcol to newcol to outseq. ** column() considers column_address, parm_left/right_cursor, ** simp_col(), and carriage_return followed by simp_col(). */ static column(outseq, ocol, ncol) struct Sequence *outseq; /* where to put the output */ int ocol, ncol; /* old, new cursor column */ { struct Sequence seqA, seqB, *best, *try; int parm_cursor; /* set to either parm_up/down_cursor */ best = &seqA; try = &seqB; if (ncol == ocol) return; if (ncol < ocol) parm_cursor = P_LEFT_CURS; else parm_cursor = P_RIGHT_CURS; /* try out direct column addressing */ zero_seq(best); add_op(best, COL_ADDR, ncol); /* try carriage_return then simp_col() */ if (! rel_ok || (ncol < ocol)) { zero_seq(try); add_op(try, CARRIAGE_RETURN, 1); simp_col(try, 0, ncol); Make_seq_best(best, try); } if (rel_ok) { /* try out paramaterized left or right motion */ zero_seq(try); add_op(try, parm_cursor, abs(ocol - ncol)); Make_seq_best(best, try); /* try getting there with simp_col() */ zero_seq(try); simp_col(try, ocol, ncol); Make_seq_best(best, try); } add_seq(outseq, best); } X/* ** simp_col(outseq, oldcol, newcol) ** ** simp_col() adds the best simple sequence for getting ** from oldcol to newcol to outseq. ** simp_col() considers (back_)tab and cursor_left/right. ** ** Revisions needed: ** Simp_col asssumes that the cost of a (back_)tab ** is less then the cost of one-stepping to get to the same column. ** Should sometimes use overprinting instead of cursor_right. */ static simp_col(outseq, oc, nc) struct Sequence *outseq; /* place to put sequence */ int oc, nc; /* old column, new column */ { struct Sequence seqA, seqB, tabseq, *best, *try; int mytab, tabs, onepast, one_step, opp_step; if (! rel_ok) { outseq->cost = INFINITY; return; } if (oc == nc) return; best = &seqA; try = &seqB; if (oc < nc) { mytab = TAB; if (init_tabs > 0 && op_info[TAB] < INFINITY) { tabs = nc / init_tabs - oc / init_tabs; onepast = ((nc / init_tabs) + 1) * init_tabs; if (tabs) oc = onepast - init_tabs; /* consider it done */ } else tabs = 0; one_step = CURS_RIGHT; opp_step = CURS_LEFT; } else { mytab = BACK_TAB; if (init_tabs > 0 && op_info[BACK_TAB] < INFINITY) { tabs = oc / init_tabs - nc / init_tabs; onepast = ((nc - 1) / init_tabs) * init_tabs; if (tabs) oc = onepast + init_tabs; /* consider it done */ } else tabs = 0; one_step = CURS_LEFT; opp_step = CURS_RIGHT; } /* tab as close as possible to nc */ zero_seq(&tabseq); add_op(&tabseq, mytab, tabs); /* try extra tab and backing up */ zero_seq(best); if (onepast >= 0 && onepast < columns) { add_op(best, mytab, 1); add_op(best, opp_step, abs(onepast - nc)); } else best->cost = INFINITY; /* make sure of next swap */ /* try stepping to nc */ zero_seq(try); add_op(try, one_step, abs(nc - oc)); Make_seq_best(best, try); if (tabseq.cost < INFINITY) add_seq(outseq, &tabseq); add_seq(outseq, best); } X/* ** zero_seq(seq) ** add_seq(seq1, seq2) ** out_seq(seq) ** ** zero_seq() empties seq. ** add_seq() adds seq1 to seq2. ** out_seq() outputs a sequence. */ static zero_seq(seq) struct Sequence *seq; { seq->end = seq->vec; seq->cost = 0; } static add_seq(seq1, seq2) struct Sequence *seq1, *seq2; { int *vptr; if(seq1->cost >= INFINITY || seq2->cost >= INFINITY) seq1->cost = INFINITY; else { vptr = seq2->vec; while (vptr != seq2->end) *(seq1->end++) = *(vptr++); seq1->cost += seq2->cost; } } static out_seq(seq) struct Sequence *seq; { int *opptr, prm[9], ps, p, op, outc(); int count; char *sequence(); if (seq->cost >= INFINITY) return; for (opptr = seq->vec; opptr < seq->end; opptr++) { op = *opptr; /* grab operator */ ps = -op_info[op]; if(ps > 0) /* parameterized */ { for (p = 0; p < ps; p++) /* fill in needed parms */ prm[p] = *(++opptr); tputs(tparm(sequence(op), prm[0], prm[1], prm[2], prm[3], prm[4], prm[5], prm[6], prm[7], prm[8]), 1, outc); } else { count = *(++opptr); /*rev should save tputs output instead of mult calls */ while (count--) /* do count times */ tputs(sequence(op), 1, outc); } } } X/* ** update_ops() ** ** update_ops() makes sure that ** the op_info[] array is updated and initializes ** the cost array for SP if needed. */ static update_ops() { if (SP) /* SP structure exists */ { int op; out_file = SP->_ofp; /* set output file pointer */ if (! SP->_costinit) /* this term not yet assigned costs */ { loc_init = FALSE; /* if !SP in the future, new term */ init_costs(SP->_costs); /* fill term costs */ SP->_costinit = TRUE; } for (op = 0; op < NUM_NPARM; op++) op_info[op] = SP->_costs[op]; /* set up op_info */ /* check for newline that might be mapped... */ if (SP->_nlmapping && index(sequence(CURS_DOWN), '\n')) op_info[CURS_DOWN] = INFINITY; } else { out_file = stdout; if (! loc_init) /* using local costs */ { loc_init = TRUE; init_costs(op_info); /* set up op_info */ } /* check for newline that might be mapped... */ if (index(sequence(CURS_DOWN), '\n')) op_info[CURS_DOWN] = INFINITY; } } X/* ** init_costs(costs) ** ** init_costs() fills the array costs[NUM_NPARM] ** with costs calculated by doing tputs() calls. */ static init_costs(costs) int costs[]; { int i, countc(); for (i = 0; i < NUM_NPARM; i++) if(sequence(i) != (char *) 0) { #ifdef UNDEFINED if (_tracing) _tracef("\tinit_costs: pricing %d: '%s'", i, sequence(i)); #endif c_count = 0; tputs(sequence(i), 1, countc); costs[i] = c_count; } else costs[i] = INFINITY; } X/* ** countc() ** outc(c) ** savec(c) ** ** countc() increments global var c_count. ** outc() outputs a single character. ** savec() saves c in *c_save and increments c_save and c_count. */ static countc() { c_count++; } static outc(c) char c; { fputc(c, out_file); } X/*rev not yet needed static savec(c) char c; { *(c_save++) = c; c_count++; } */ X/* ** add_op(seq, op, p0, p1, ... , p8) ** ** add_op() adds the operator op and the appropriate ** number of paramaters to seq. It also increases the ** cost appropriately. ** if op has no parameters, p0 is taken to be a count. */ static add_op(seq, op, p0, p1, p2, p3, p4, p5, p6, p7, p8) struct Sequence *seq; int op, p0, p1, p2, p3, p4, p5, p6, p7, p8; { int num_ps, p; #ifdef UNDEFINED if (_tracing) _tracef("\tadd_op(%o,%d,%d,%d) called", seq, op, p0, p1); #endif num_ps = - op_info[op]; /* get parms or -cost */ *(seq->end++) = op; if (num_ps == (- INFINITY) || sequence(op) == (char *) 0) seq->cost = INFINITY; else if (num_ps <= 0) /* no parms, -cost */ { seq->cost -= p0 * num_ps; /* ADD count * cost */ *(seq->end++) = p0; } else { int pms[9]; pms[0] = p0; pms[1] = p1; pms[2] = p2; pms[3] = p3; pms[4] = p4; pms[5] = p5; pms[6] = p6; pms[7] = p7; pms[8] = p8; for(p = 0; p < num_ps; p++) *(seq->end++) = pms[p]; c_count = 0; tputs(tparm(sequence(op), p0, p1, p2, p3, p4, p5, p6, p7, p8), 1, countc); seq->cost += c_count; } } X/* ** char * ** sequence(op) ** ** sequence() returns a pointer to the op's ** terminal control sequence. */ static char * sequence(op) int op; { switch(op) { case CARRIAGE_RETURN: return (carriage_return); case CURS_DOWN: return (cursor_down); case CURS_HOME: return (cursor_home); case CURS_LEFT: return (cursor_left); case CURS_RIGHT: return (cursor_right); case CURS_TO_LL: return (cursor_to_ll); case CURS_UP: return (cursor_up); case TAB: return (tab); case BACK_TAB: return (back_tab); case ROW_ADDR: return (row_address); case COL_ADDR: return (column_address); case P_DOWN_CURS: return (parm_down_cursor); case P_LEFT_CURS: return (parm_left_cursor); case P_RIGHT_CURS: return (parm_right_cursor); case P_UP_CURS: return (parm_up_cursor); case CURS_ADDR: return (cursor_address); default: return ((char *) 0); } } //go.sysin dd * echo 'x - =src/lib_mvwin.c' sed 's/^X//' <<'//go.sysin dd *' >=src/lib_mvwin.c X/********************************************************************* * COPYRIGHT NOTICE * ********************************************************************** * This software is copyright (C) 1982 by Pavel Curtis * * * * Permission is granted to reproduce and distribute * * this file by any means so long as no fee is charged * * above a nominal handling fee and so long as this * * notice is always included in the copies. * * * * Other rights are reserved except as explicitly granted * * by written permission of the author. * * Pavel Curtis * * Computer Science Dept. * * 405 Upson Hall * * Cornell University * * Ithaca, NY 14853 * * * * Ph- (607) 256-4934 * * * * Pavel.Cornell@Udel-Relay (ARPAnet) * * decvax!cornell!pavel (UUCPnet) * *********************************************************************/ X/* ** lib_mvwin.c ** ** The routine mvwin(). ** ** $Log: RCS/lib_mvwin.v $ * Revision 2.1 82/10/25 14:48:10 pavel * Added Copyright Notice * * Revision 2.0 82/10/25 13:47:03 pavel * Beta-one Test Release * ** */ static char RCSid[] = "$Header: RCS/lib_mvwin.v Revision 2.1 82/10/25 14:48:10 pavel Exp$"; #include "curses.h" #include "curses.priv.h" mvwin(win, by, bx) WINDOW *win; int by, bx; { #ifdef TRACE if (_tracing) _tracef("mvwin(%o,%d,%d) called", win, by, bx); #endif if (by + win->_maxy > LINES -1 || bx + win->_maxx > COLS - 1) return(ERR); win->_begy = by; win->_begx = bx; touchwin(win); return(OK); } //go.sysin dd * echo 'x - =src/lib_newterm.c' sed 's/^X//' <<'//go.sysin dd *' >=src/lib_newterm.c X/********************************************************************* * COPYRIGHT NOTICE * ********************************************************************** * This software is copyright (C) 1982 by Pavel Curtis * * * * Permission is granted to reproduce and distribute * * this file by any means so long as no fee is charged * * above a nominal handling fee and so long as this * * notice is always included in the copies. * * * * Other rights are reserved except as explicitly granted * * by written permission of the author. * * Pavel Curtis * * Computer Science Dept. * * 405 Upson Hall * * Cornell University * * Ithaca, NY 14853 * * * * Ph- (607) 256-4934 * * * * Pavel.Cornell@Udel-Relay (ARPAnet) * * decvax!cornell!pavel (UUCPnet) * *********************************************************************/ X/* ** lib_newterm.c ** ** The newterm() function. ** ** $Log: RCS/lib_newterm.v $ * Revision 2.1 82/10/25 14:48:14 pavel * Added Copyright Notice * * Revision 2.0 82/10/25 13:47:11 pavel * Beta-one Test Release * ** */ static char RCSid[] = "$Header: RCS/lib_newterm.v Revision 2.1 82/10/25 14:48:14 pavel Exp$"; #include <signal.h> #include <stdio.h> #include "curses.h" #include "term.h" #include "curses.priv.h" struct screen * newterm(term, fp) char *term; XFILE *fp; { int errret; int tstp(); #ifdef TRACE _init_trace(); if (_tracing) _tracef("newterm(%s,%o) called", term, fp); #endif if (setupterm(term, fileno(fp), &errret) != 1) return(ERR); if ((SP = (struct screen *) malloc(sizeof *SP)) == NULL) return(ERR); if (fp == stdout) { SP->_ofp = stdout; SP->_ifp = stdin; } else { SP->_ofp = fp; SP->_ifp = fp; } SP->_term = cur_term; SP->_cursrow = -1; SP->_curscol = -1; SP->_keytry = UNINITIALISED; SP->_nl = TRUE; SP->_raw = FALSE; SP->_cbreak = FALSE; SP->_echo = TRUE; SP->_nlmapping = TRUE; SP->_costinit = FALSE; LINES = lines; COLS = columns; if (enter_ca_mode) putp(enter_ca_mode); if ((newscr = newwin(lines, columns, 0, 0)) == ERR) return(ERR); if ((curscr = newwin(lines, columns, 0, 0)) == ERR) return(ERR); SP->_newscr = newscr; SP->_curscr = curscr; newscr->_clear = TRUE; curscr->_clear = FALSE; signal(SIGTSTP, tstp); if (stdscr == NULL) if ((stdscr = newwin(lines, columns, 0, 0)) == ERR) return(ERR); #ifdef TRACE if (_tracing) _tracef("\tnewterm returns %o", SP); #endif return(SP); } //go.sysin dd * echo 'x - =src/lib_newwin.c' sed 's/^X//' <<'//go.sysin dd *' >=src/lib_newwin.c X/********************************************************************* * COPYRIGHT NOTICE * ********************************************************************** * This software is copyright (C) 1982 by Pavel Curtis * * * * Permission is granted to reproduce and distribute * * this file by any means so long as no fee is charged * * above a nominal handling fee and so long as this * * notice is always included in the copies. * * * * Other rights are reserved except as explicitly granted * * by written permission of the author. * * Pavel Curtis * * Computer Science Dept. * * 405 Upson Hall * * Cornell University * * Ithaca, NY 14853 * * * * Ph- (607) 256-4934 * * * * Pavel.Cornell@Udel-Relay (ARPAnet) * * decvax!cornell!pavel (UUCPnet) * *********************************************************************/ X/* ** lib_newwin.c ** ** The routines newwin(), subwin() and their dependent ** ** $Log: RCS/lib_newwin.v $ * Revision 2.1 82/10/25 14:48:18 pavel * Added Copyright Notice * * Revision 2.0 82/10/25 13:47:18 pavel * Beta-one Test Release * ** */ #include "term.h" #include "curses.h" #include "curses.priv.h" short *calloc(); WINDOW *malloc(); static WINDOW *makenew(); WINDOW * newwin(num_lines, num_columns, begy, begx) int num_lines, num_columns, begy, begx; { WINDOW *win; chtype *ptr; int i, j; #ifdef TRACE if (_tracing) _tracef("newwin(%d,%d,%d,%d) called", num_lines, num_columns, begy, begx); #endif if (num_lines == 0) num_lines = lines - begy; if (num_columns == 0) num_columns = columns - begx; if ((win = makenew(num_lines, num_columns, begy, begx)) == ERR) return(ERR); for (i = 0; i < num_lines; i++) { if ((win->_line[i] = (chtype *) calloc(num_columns, sizeof(chtype))) == NULL) { for (j = 0; j < i; j++) cfree(win->_line[j]); cfree(win->_firstchar); cfree(win->_lastchar); cfree(win->_line); cfree(win); return(ERR); } else for (ptr = win->_line[i]; ptr < win->_line[i] + num_columns; ) *ptr++ = ' '; } #ifdef TRACE if (_tracing) _tracef("\tnewwin: returned window is %o", win); #endif return(win); } WINDOW * subwin(orig, num_lines, num_columns, begy, begx) WINDOW *orig; int num_lines, num_columns, begy, begx; { WINDOW *win; int i, j, k; #ifdef TRACE if (_tracing) _tracef("subwin(%d,%d,%d,%d) called", num_lines, num_columns, begy, begx); #endif /* ** make sure window fits inside the original one */ if (begy < orig->_begy || begx < orig->_begx || begy + num_lines > orig->_maxy || begx + num_columns > orig->_maxx) return(ERR); if (num_lines == 0) num_lines = orig->_maxy - orig->_begy - begy; if (num_columns == 0) num_columns = orig->_maxx - orig->_begx - begx; if ((win = makenew(num_lines, num_columns, begy, begx)) == ERR) return(ERR); j = orig->_begy + begy; k = orig->_begx + begx; for (i = 0; i < num_lines; i++) win->_line[i] = &orig->_line[j++][k]; win->_flags = _SUBWIN; #ifdef TRACE if (_tracing) _tracef("\tsubwin: returned window is %o", win); #endif return(win); } static WINDOW * makenew(num_lines, num_columns, begy, begx) int num_lines, num_columns, begy, begx; { int i; WINDOW *win; if ((win = (WINDOW *) malloc(sizeof(WINDOW))) == NULL) return ERR; if ((win->_line = (chtype **) calloc(num_lines, sizeof (chtype *))) == NULL) { cfree(win); return(ERR); } if ((win->_firstchar = calloc(num_lines, sizeof(short))) == NULL) { cfree(win); cfree(win->_line); return(ERR); } if ((win->_lastchar = calloc(num_lines, sizeof(short))) == NULL) { cfree(win); cfree(win->_line); cfree(win->_firstchar); return(ERR); } if ((win->_numchngd = calloc(num_lines, sizeof(short))) == NULL) { cfree(win); cfree(win->_line); cfree(win->_firstchar); cfree(win->_lastchar); return(ERR); } win->_curx = 0; win->_cury = 0; win->_maxy = num_lines - 1; win->_maxx = num_columns - 1; win->_begy = begy; win->_begx = begx; win->_flags = 0; win->_attrs = A_NORMAL; win->_clear = (num_lines == lines && num_columns == columns); win->_scroll = FALSE; win->_leave = FALSE; win->_use_keypad = FALSE; win->_use_meta = FALSE; win->_nodelay = FALSE; win->_regtop = 0; win->_regbottom = num_lines - 1; for (i = 0; i < num_lines; i++) { win->_firstchar[i] = win->_lastchar[i] = _NOCHANGE; win->_numchngd[i] = 0; } if (begx + num_columns == columns) { win->_flags |= _ENDLINE; if (begx == 0 && num_lines == lines && begy == 0) win->_flags |= _FULLWIN; if (begy + num_lines == lines) win->_flags |= _SCROLLWIN; } return(win); } //go.sysin dd * echo 'x - =src/lib_options.c' sed 's/^X//' <<'//go.sysin dd *' >=src/lib_options.c X/********************************************************************* * COPYRIGHT NOTICE * ********************************************************************** * This software is copyright (C) 1982 by Pavel Curtis * * * * Permission is granted to reproduce and distribute * * this file by any means so long as no fee is charged * * above a nominal handling fee and so long as this * * notice is always included in the copies. * * * * Other rights are reserved except as explicitly granted * * by written permission of the author. * * Pavel Curtis * * Computer Science Dept. * * 405 Upson Hall * * Cornell University * * Ithaca, NY 14853 * * * * Ph- (607) 256-4934 * * * * Pavel.Cornell@Udel-Relay (ARPAnet) * * decvax!cornell!pavel (UUCPnet) * *********************************************************************/ X/* ** lib_options.c ** ** The routines to handle option setting. ** ** $Log: RCS/lib_options.v $ * Revision 2.1 82/10/25 14:48:24 pavel * Added Copyright Notice * * Revision 2.0 82/10/25 13:47:45 pavel * Beta-one Test Release * ** */ static char RCSid[] = "$Header: RCS/lib_options.v Revision 2.1 82/10/25 14:48:24 pavel Exp$"; #include "term.h" #include "curses.h" #include "curses.priv.h" static outc(ch) char ch; { putc(ch, SP->_ofp); } idlok(win, flag) WINDOW *win; int flag; { #ifdef TRACE if (_tracing) _tracef("idlok(%o,%d) called", win, flag); #endif if ((insert_line && delete_line) #ifdef UNIMPLEMENTED || (change_scroll_region) #endif ) curscr->_idlok = flag; } clearok(win, flag) WINDOW *win; int flag; { #ifdef TRACE if (_tracing) _tracef("clearok(%o,%d) called", win, flag); #endif if (win == curscr) newscr->_clear = flag; else win->_clear = flag; } leaveok(win, flag) WINDOW *win; int flag; { #ifdef TRACE if (_tracing) _tracef("leaveok(%o,%d) called", win, flag); #endif win->_leave = flag; } scrollok(win, flag) WINDOW *win; int flag; { #ifdef TRACE if (_tracing) _tracef("scrollok(%o,%d) called", win, flag); #endif win->_scroll = flag; } nodelay(win, flag) WINDOW *win; int flag; { #ifdef TRACE if (_tracing) _tracef("nodelay(%o,%d) called", win, flag); #endif win->_nodelay = flag; } keypad(win, flag) WINDOW *win; int flag; { #ifdef TRACE if (_tracing) _tracef("keypad(%o,%d) called", win, flag); #endif win->_use_keypad = flag; if (flag && keypad_xmit) tputs(keypad_xmit, 1, outc); else if (! flag && keypad_local) tputs(keypad_local, 1, outc); if (SP->_keytry == UNINITIALISED) init_keytry(); } meta(win, flag) WINDOW *win; int flag; { #ifdef TRACE if (_tracing) _tracef("meta(%o,%d) called", win, flag); #endif win->_use_meta = flag; if (flag && meta_on) tputs(meta_on, 1, outc); else if (! flag && meta_off) tputs(meta_off, 1, outc); } X/* ** init_keytry() ** ** Construct the try for the current terminal's keypad keys. ** */ static struct try *newtry; static init_keytry() { newtry = NULL; add_to_try(key_backspace, KEY_BACKSPACE); add_to_try(key_catab, KEY_CATAB); add_to_try(key_clear, KEY_CLEAR); add_to_try(key_ctab, KEY_CTAB); add_to_try(key_dc, KEY_DC); add_to_try(key_dl, KEY_DL); add_to_try(key_down, KEY_DOWN); add_to_try(key_eic, KEY_EIC); add_to_try(key_eol, KEY_EOL); add_to_try(key_eos, KEY_EOS); add_to_try(key_f0, KEY_F(0)); add_to_try(key_f1, KEY_F(1)); add_to_try(key_f2, KEY_F(2)); add_to_try(key_f3, KEY_F(3)); add_to_try(key_f4, KEY_F(4)); add_to_try(key_f5, KEY_F(5)); add_to_try(key_f6, KEY_F(6)); add_to_try(key_f7, KEY_F(7)); add_to_try(key_f8, KEY_F(8)); add_to_try(key_f9, KEY_F(9)); add_to_try(key_f10, KEY_F(10)); add_to_try(key_home, KEY_HOME); add_to_try(key_ic, KEY_IC); add_to_try(key_il, KEY_IL); add_to_try(key_left, KEY_LEFT); add_to_try(key_npage, KEY_NPAGE); add_to_try(key_ppage, KEY_PPAGE); add_to_try(key_right, KEY_RIGHT); add_to_try(key_sf, KEY_SF); add_to_try(key_sr, KEY_SR); add_to_try(key_stab, KEY_STAB); add_to_try(key_up, KEY_UP); SP->_keytry = newtry; } add_to_try(str, code) char *str; short code; { static bool out_of_memory = FALSE; struct try *ptr, *savedptr; struct try *malloc(); if (! str || out_of_memory) return; if (newtry != NULL) { ptr = newtry; for (;;) { while (ptr->ch != *str && ptr->sibling != NULL) ptr = ptr->sibling; if (ptr->ch == *str) { if (*(++str)) { if (ptr->child != NULL) ptr = ptr->child; else break; } else { ptr->value = code; return; } } else { if ((ptr->sibling = malloc(sizeof *ptr)) == NULL) { out_of_memory = TRUE; return; } savedptr = ptr = ptr->sibling; ptr->child = ptr->sibling = NULL; ptr->ch = *str++; ptr->value = NULL; break; } } /* end for (;;) */ } else /* newtry == NULL :: First sequence to be added */ { savedptr = ptr = newtry = malloc(sizeof *ptr); if (ptr == NULL) { out_of_memory = TRUE; return; } ptr->child = ptr->sibling = NULL; ptr->ch = *(str++); ptr->value = NULL; } /* at this point, we are adding to the try. ptr->child == NULL */ while (*str) { ptr->child = malloc(sizeof *ptr); ptr = ptr->child; if (ptr == NULL) { out_of_memory = TRUE; ptr = savedptr; while (ptr != NULL) { savedptr = ptr->child; free(ptr); ptr = savedptr; } return; } ptr->child = ptr->sibling = NULL; ptr->ch = *(str++); ptr->value = NULL; } ptr->value = code; return; } //go.sysin dd * exit
sources@genrad.UUCP (12/20/84)
This is part of a distribution of a public domain version of terminfo/curses It is a rather large distribution, so I have broken it up into 11 modules (each less than 64K long.) Each shar format module should end with the line "exit". This code is completely public domain, originally written by Pavel Curtis of Cornell University. This version has some small improvements and bug fixes. This unit contains: more library modules Part 9 will be the last of the library, and the start of the terminal data files. ----------------- cut here ---------------- : Run this shell script with "sh" not "csh" PATH=:/bin:/usr/bin:/usr/ucb export PATH if test ! -d =src then echo 'Making directory "=src"' mkdir =src fi echo 'x - =src/lib_doupdate.c' sed 's/^X//' <<'//go.sysin dd *' >=src/lib_doupdate.c X/********************************************************************* * COPYRIGHT NOTICE * ********************************************************************** * This software is copyright (C) 1982 by Pavel Curtis * * * * Permission is granted to reproduce and distribute * * this file by any means so long as no fee is charged * * above a nominal handling fee and so long as this * * notice is always included in the copies. * * * * Other rights are reserved except as explicitly granted * * by written permission of the author. * * Pavel Curtis * * Computer Science Dept. * * 405 Upson Hall * * Cornell University * * Ithaca, NY 14853 * * * * Ph- (607) 256-4934 * * * * Pavel.Cornell@Udel-Relay (ARPAnet) * * decvax!cornell!pavel (UUCPnet) * *********************************************************************/ X/* * lib_doupdate.c * * The routine doupdate() and its dependents * * $Log: lib_doupdate.c,v $ * Revision 3.1 84/12/13 11:20:28 john * Revisions by Mark Horton * * Revision 2.1 82/10/25 14:47:05 pavel * Added Copyright Notice * * Revision 2.0 82/10/25 13:44:33 pavel * Beta-one Test Release * * */ static char RCSid[] = "$Header: lib_doupdate.c,v 3.1 84/12/13 11:20:28 john Exp $"; #include <signal.h> #include "curses.h" #include "curses.priv.h" #include "term.h" #define GoTo(row,col) mvcur(SP->_cursrow, SP->_curscol, row, col); \ SP->_cursrow = row; \ SP->_curscol = col; #define PutAttrChar(ch) if (curscr->_attrs != (ch & A_ATTRIBUTES)) \ { \ curscr->_attrs = ch & A_ATTRIBUTES; \ vidputs(curscr->_attrs, outc); \ } \ putc(ch & A_CHARTEXT, SP->_ofp); #define PutChar(ch) if (!auto_right_margin || \ SP->_cursrow != lines - 1 || \ SP->_curscol != columns - 1) \ { \ PutAttrChar(ch); \ SP->_curscol++; \ if (SP->_curscol >= columns) \ if (auto_right_margin) \ { \ SP->_curscol = 0; \ SP->_cursrow++; \ } \ else \ SP->_curscol--; \ } outc(ch) char ch; { putc(ch, SP->_ofp); } doupdate() { int i; int (*oldsig)(); #ifdef TRACE if (_tracing) _tracef("doupdate() called"); #endif oldsig = signal(SIGTSTP, SIG_IGN); if (curscr->_clear) { ClrUpdate(curscr); curscr->_clear = FALSE; GoTo(curscr->_cury, curscr->_curx); } else { if (newscr->_clear) { ClrUpdate(newscr); newscr->_clear = FALSE; } else if (curscr->_idlok) IdlUpdate(); else NoIdlUpdate(); for (i = 0; i < lines; i++) { newscr->_firstchar[i] = _NOCHANGE; newscr->_lastchar[i] = _NOCHANGE; newscr->_numchngd[i] = 0; } curscr->_curx = newscr->_curx; curscr->_cury = newscr->_cury; GoTo(curscr->_cury, curscr->_curx); } fflush(SP->_ofp); signal(SIGTSTP, oldsig); } X/* ** ClrUpdate(scr) ** ** Update by clearing and redrawing the entire screen. ** */ static ClrUpdate(scr) WINDOW *scr; { int i, j; int lastNonBlank; ClearScreen(); for (i=0; i < lines; i++) { lastNonBlank = columns - 1; while (scr->_line[i][lastNonBlank] == ' ') lastNonBlank--; if (i == lines && lastNonBlank == columns - 1) lastNonBlank--; for (j=0; j <= lastNonBlank; j++) { PutAttrChar(scr->_line[i][j]); } if (! auto_right_margin || lastNonBlank < columns - 1) { SP->_cursrow = i; SP->_curscol = lastNonBlank < 0 ? 0 : lastNonBlank; GoTo(i + 1, 0); } } if (scr != curscr) { for (i=0; i < LINES; i++) for (j=0; j < COLS; j++) curscr->_line[i][j] = scr->_line[i][j]; } } X/* ** NoIdlUpdate() ** ** Update screen without using Insert/Delete Line capabilities ** */ static NoIdlUpdate() { int i; #ifdef TRACE if (_tracing) _tracef("NoIdlUpdate() called"); #endif for (i=0; i < lines; i++) if (newscr->_numchngd[i]) TransformLine(i); } X/* ** IdlUpdate() ** ** Update screen using Insert/Delete Line capabilities ** */ #define UNCHANGED(n) (newscr->_numchngd[n] <= columns/10 \ || newscr->_lastchar[n] \ - newscr->_firstchar[n] <= columns/10) static IdlUpdate() { int firstLine, lastLine, thisLine; #ifdef TRACE if (_tracing) _tracef("IdlUpdate() called"); #endif firstLine = -1; for (thisLine = 0; thisLine < lines; thisLine++) { if (UNCHANGED(thisLine)) { if (firstLine != -1) { lastLine = thisLine - 1; Gosling(firstLine, lastLine); firstLine = -1; } if (newscr->_firstchar[thisLine] != _NOCHANGE) TransformLine(thisLine); } else if (firstLine == -1) firstLine = thisLine; } if (firstLine != -1) Gosling(firstLine, lines - 1); } X/* ** TransformLine(lineno) ** ** Call either IDcTransformLine or NoIDcTransformLine to do the ** update, depending upon availability of insert/delete character. */ static TransformLine(lineno) int lineno; { if ( (insert_character || (enter_insert_mode && exit_insert_mode)) && delete_character) IDcTransformLine(lineno); else NoIDcTransformLine(lineno); } X/* ** NoIDcTransformLine(lineno) ** ** Transform the given line in curscr to the one in newscr, without ** using Insert/Delete Character. ** ** firstChar = position of first different character in line ** lastChar = position of last different character in line ** ** overwrite all characters between firstChar and lastChar. ** */ static NoIDcTransformLine(lineno) int lineno; { register int firstChar, lastChar; register chtype *newLine = newscr->_line[lineno]; register chtype *oldLine = curscr->_line[lineno]; register int k; #ifdef TRACE if (_tracing) _tracef("NoIDcTransformLine(%d) called", lineno); #endif firstChar = 0; while (firstChar < columns && newLine[firstChar] == oldLine[firstChar]) firstChar++; if (firstChar >= columns) return; lastChar = columns - 1; while (lastChar > firstChar && newLine[lastChar] == oldLine[lastChar]) lastChar--; GoTo(lineno, firstChar); for (k=firstChar; k <= lastChar; k++) { PutChar(newLine[k]); oldLine[k] = newLine[k]; } } X/* ** IDcTransformLine(lineno) ** ** Transform the given line in curscr to the one in newscr, using ** Insert/Delete Character. ** ** firstChar = position of first different character in line ** oLastChar = position of last different character in old line ** nLastChar = position of last different character in new line ** ** move to firstChar ** overwrite chars up to min(oLastChar, nLastChar) ** if oLastChar < nLastChar ** insert newLine[oLastChar+1..nLastChar] ** else ** delete oLastChar - nLastChar spaces */ static IDcTransformLine(lineno) int lineno; { int firstChar, oLastChar, nLastChar; chtype *newLine = newscr->_line[lineno]; chtype *oldLine = curscr->_line[lineno]; int k, n; #ifdef TRACE if (_tracing) _tracef("IDcTransformLine(%d) called", lineno); #endif firstChar = 0; while (firstChar < columns && newLine[firstChar] == oldLine[firstChar]) firstChar++; if (firstChar >= columns) return; oLastChar = columns - 1; while (oLastChar > firstChar && oldLine[oLastChar] == ' ') oLastChar--; nLastChar = columns - 1; while (nLastChar > firstChar && newLine[nLastChar] == ' ') nLastChar--; while (newLine[nLastChar] == oldLine[oLastChar]) { nLastChar--; oLastChar--; } n = min(oLastChar, nLastChar); GoTo(lineno, firstChar); for (k=firstChar; k <= n; k++) PutChar(newLine[k]); if (oLastChar < nLastChar) InsStr(&newLine[k], nLastChar - oLastChar); else if (oLastChar > nLastChar) DelChar(oLastChar - nLastChar); for (k=firstChar; k < columns; k++) oldLine[k] = newLine[k]; } X/* ** Gosling(firstLine, lastLine) ** ** Change the given range of lines on curscr into the same lines ** on newscr, using Gosling's Algorithm. */ static short lineCost[MAXLINES][MAXLINES]; static short lineOps[MAXLINES][MAXLINES]; static short lineDels[MAXLINES]; static short lineIRs[MAXLINES]; #define INSERT 1 #define DELETE 2 #define REPLACE 3 static Gosling(firstLine, lastLine) int firstLine, lastLine; { int i, count; #ifdef TRACE if (_tracing) _tracef("Gosling(%d,%d) called", firstLine, lastLine); #endif Goscost(firstLine, lastLine - firstLine + 1); for (i=0; i <= lastLine - firstLine + 1; i++) lineDels[i] = lineIRs[i] = 0; Gosdraw(lastLine - firstLine + 1, lastLine - firstLine + 1); count = 0; for (i = lastLine - firstLine + 1; i > 0; i--) { if (lineDels[i] == DELETE) count++; else if (count) { DelLine(count, firstLine + i, lastLine); count = 0; } } if (count) DelLine(count, firstLine, lastLine); for (i = 1; i <= lastLine - firstLine + 1; i++) { switch (lineIRs[i]) { case REPLACE: TransformLine(firstLine + i - 1); break; case INSERT: InsLine(firstLine + i - 1, lastLine); break; default: /* do nothing */ break; } } } #define RPLCOST(old,new) (oHash[old] == nHash[new] ? 0 : columns) static Goscost(lineno, length) int lineno, length; { int i, j, cost; int ILcost, DLcost; long nHash[MAXLINES], oHash[MAXLINES]; long HashFn(); #ifdef TRACE if (_tracing) _tracef("Goscost(lineno=%d,length=%d) called", lineno, length); #endif ILcost = (insert_line ? strlen(insert_line) : 9999) + columns; DLcost = (delete_line ? strlen(delete_line) : 9999); for (i=1; i <= length; i++) { nHash[i] = HashFn(newscr->_line[lineno + i - 1]); oHash[i] = HashFn(curscr->_line[lineno + i - 1]); } lineCost[0][0] = 0; for (i=1; i <= length; i++) { lineCost[i][0] = lineCost[i-1][0] + DLcost; lineOps[i][0] = DELETE; lineCost[0][i] = lineCost[0][i-1] + ILcost; lineOps[0][i] = INSERT; } for (i=1; i <= length; i++) { for (j=1; j <= length; j++) { lineCost[i][j] = lineCost[i-1][j-1] + RPLCOST(i, j); lineOps[i][j] = REPLACE; cost = lineCost[i][j-1] + ILcost; if (cost < lineCost[i][j]) { lineCost[i][j] = cost; lineOps[i][j] = INSERT; } cost = lineCost[i-1][j] + DLcost; if (cost < lineCost[i][j]) { lineCost[i][j] = cost; lineOps[i][j] = DELETE; } } } return(lineCost[columns][columns]); } X/* ** _PrintCosts(length) ** ** Print out the cost matrix. Called only from sdb. ** ** ** _DumpNewscr(first, last) ** ** Print the specified range of lines from newscr. Called only from sdb. ** ** ** _DumpCurscr(first, last) ** ** Print the specified range of lines from curscr. Called only from sdb. ** */ _PrintCosts(length) int length; { int i, j; for (i=0; i <= length; i++) { for (j=0; j <= length; j++) { printf("%5d/%d", lineCost[i][j], lineOps[i][j]); } putchar('\n'); } fflush(stdout); } _DumpNewscr(first, last) int first, last; { int i, j; for (i=first; i <= last; i++) { for (j=0; j < columns; j++) putchar(newscr->_line[i][j]); putchar('\n'); } } _DumpCurscr(first, last) int first, last; { int i, j; for (i=first; i <= last; i++) { for (j=0; j < columns; j++) putchar(curscr->_line[i][j]); putchar('\n'); } } long HashFn(line) chtype *line; { int i = 0; long hash = 0; while(i < columns && (line[i] | A_CHARTEXT) == ' ') i++; for (; i+1 < columns; i += 2) hash += (line[i] << 8) + line[i+1]; return (hash); } static Gosdraw(i, j) int i, j; { if (i == 0 && j == 0) return; switch (lineOps[i][j]) { case INSERT: Gosdraw(i, j-1); lineIRs[j] = INSERT; break; case DELETE: lineDels[i] = DELETE; Gosdraw(i-1, j); break; case REPLACE: Gosdraw(i-1, j-1); lineIRs[j] = REPLACE; break; } } X/* ** ClearScreen() ** ** Clear the physical screen and put cursor at home ** */ static ClearScreen() { if (clear_screen) { tputs(clear_screen, 1, outc); SP->_cursrow = SP->_curscol = 0; } else if (clr_eos) { SP->_cursrow = SP->_curscol = -1; GoTo(0,0); tputs(clr_eos, 1, outc); } else if (clr_eol) { SP->_cursrow = SP->_curscol = -1; while (SP->_cursrow < lines) { GoTo(SP->_cursrow, 0); tputs(clr_eol, 1, outc); } GoTo(0,0); } } X/* ** InsStr(line, count) ** ** Insert the count characters pointed to by line. ** */ InsStr(line, count) chtype *line; int count; { #ifdef TRACE if (_tracing) _tracef("InsStr(%o,%d) called", line, count); #endif if (enter_insert_mode && exit_insert_mode) { tputs(enter_insert_mode, 1, outc); while (count) { PutChar(*line); line++; count--; } tputs(exit_insert_mode, 1, outc); } else if (parm_ich) { tputs(tparm(parm_ich, count), 1, outc); while (count) { PutChar(*line); line++; count--; } } else { while (count) { tputs(insert_character, 1, outc); PutChar(*line); line++; count--; } } } X/* ** DelChar(count) ** ** Delete count characters at current position ** */ DelChar(count) int count; { #ifdef TRACE if (_tracing) _tracef("DelChar(%d) called", count); #endif if (parm_dch) { tputs(tparm(parm_dch, count), 1, outc); } else { while (count--) tputs(delete_character, 1, outc); } } X/* ** InsLine(lineno, lastLine) ** ** Insert line number lineno, affecting up to lastLine ** */ InsLine(lineno, lastLine) int lineno, lastLine; { int i, j, k; chtype *temp; chtype *line = newscr->_line[lineno]; #ifdef TRACE if (_tracing) _tracef("InsLine(%d,%d) called", lineno, lastLine); #endif GoTo(lineno, 0); tputs(insert_line, 1, outc); for (i=0; i < columns; i++) PutChar(line[i]); temp = curscr->_line[lastLine]; for (k = lastLine; k > lineno; k--) curscr->_line[k] = curscr->_line[k - 1]; curscr->_line[k] = temp; for (j=0; j < columns; j++) curscr->_line[k][j] = newscr->_line[k][j]; } X/* ** DelLine(count, lineno, lastLine) ** ** Delete count lines at lineno, affecting up to lastLine ** */ DelLine(count, lineno, lastLine) int count, lineno, lastLine; { int j, k; chtype *temp; #ifdef TRACE if (_tracing) _tracef("DelLine(%d,%d,%d) called", count, lineno, lastLine); #endif GoTo(lineno, 0); if (parm_delete_line) { tputs(tparm(parm_delete_line, count), 1, outc); } else { while (count--) tputs(delete_line, 1, outc); } for (k = lineno; k + count <= lastLine; k++) { temp = curscr->_line[k]; curscr->_line[k] = curscr->_line[k + count]; curscr->_line[k + count] = temp; } for (; k <= lastLine; k++) for (j=0; j < columns; j++) curscr->_line[k][j] = ' '; } //go.sysin dd * echo 'x - =src/lib_overlay.c' sed 's/^X//' <<'//go.sysin dd *' >=src/lib_overlay.c X/********************************************************************* * COPYRIGHT NOTICE * ********************************************************************** * This software is copyright (C) 1982 by Pavel Curtis * * * * Permission is granted to reproduce and distribute * * this file by any means so long as no fee is charged * * above a nominal handling fee and so long as this * * notice is always included in the copies. * * * * Other rights are reserved except as explicitly granted * * by written permission of the author. * * Pavel Curtis * * Computer Science Dept. * * 405 Upson Hall * * Cornell University * * Ithaca, NY 14853 * * * * Ph- (607) 256-4934 * * * * Pavel.Cornell@Udel-Relay (ARPAnet) * * decvax!cornell!pavel (UUCPnet) * *********************************************************************/ X/* ** lib_overlay.c ** ** The routines overlay() and overwrite(). ** ** $Log: RCS/lib_overlay.v $ * Revision 2.2 82/10/28 18:10:11 pavel * Fixed confusion about which direction the copy was supposed to go and * also added updates to win2->_{first,last}char. * * Revision 2.1 82/10/25 14:48:35 pavel * Added Copyright Notice * * Revision 2.0 82/10/25 13:48:09 pavel * Beta-one Test Release * ** */ static char RCSid[] = "$Header: RCS/lib_overlay.v Revision 2.2 82/10/28 18:10:11 pavel Exp$"; #include "curses.h" #include "curses.priv.h" X/* ** ** overlay(win1, win2) ** ** ** overlay() writes win1 on win2 non-destructively. ** **/ overlay(win1, win2) WINDOW *win1, *win2; { int col, line, last_line, last_col; short *firstchar, *lastchar; chtype *w1ptr, *w2ptr, attrs; #ifdef TRACE if (_tracing) _tracef("overlay(%o, %o) called", win1, win2); #endif last_col = min(win1->_maxx, win2->_maxx); last_line = min(win1->_maxy, win2->_maxy); attrs = win2->_attrs; firstchar = win2->_firstchar; lastchar = win2->_lastchar; for(line = 0; line <= last_line; line++) { short fc, lc; w1ptr = win1->_line[line]; w2ptr = win2->_line[line]; fc = _NOCHANGE; for(col = 0; col <= last_col; col++) { if ((*w1ptr & A_CHARTEXT) != ' ') { *w2ptr = (*w1ptr & A_CHARTEXT) | attrs; if (fc == _NOCHANGE) fc = col; lc = col; } w1ptr++; w2ptr++; } if (*firstchar == _NOCHANGE) { *firstchar = fc; *lastchar = lc; } else if (fc != _NOCHANGE) { if (fc < *firstchar) *firstchar = fc; if (lc > *lastchar) *lastchar = lc; } firstchar++; lastchar++; } } X/* ** ** overwrite(win1, win2) ** ** ** overwrite() writes win1 on win2 destructively. ** **/ overwrite(win1, win2) WINDOW *win1, *win2; { int col, line, last_line, last_col; short *firstchar, *lastchar; chtype *w1ptr, *w2ptr, attrs; #ifdef TRACE if (_tracing) _tracef("overwrite(%o, %o) called", win1, win2); #endif last_col = min(win1->_maxx, win2->_maxx); last_line = min(win1->_maxy, win2->_maxy); attrs = win2->_attrs; firstchar = win2->_firstchar; lastchar = win2->_lastchar; for(line = 0; line <= last_line; line++) { short fc, lc; w1ptr = win1->_line[line]; w2ptr = win2->_line[line]; fc = _NOCHANGE; for(col = 0; col <= last_col; col++) { if ((*w1ptr & A_CHARTEXT) != (*w2ptr & A_CHARTEXT)) { *w2ptr = (*w1ptr & A_CHARTEXT) | attrs; if (fc == _NOCHANGE) fc = col; lc = col; } w1ptr++; w2ptr++; } if (*firstchar == _NOCHANGE) { *firstchar = fc; *lastchar = lc; } else if (fc != _NOCHANGE) { if (fc < *firstchar) *firstchar = fc; if (lc > *lastchar) *lastchar = lc; } firstchar++; lastchar++; } } //go.sysin dd * echo 'x - =src/lib_printw.c' sed 's/^X//' <<'//go.sysin dd *' >=src/lib_printw.c X/********************************************************************* * COPYRIGHT NOTICE * ********************************************************************** * This software is copyright (C) 1982 by Pavel Curtis * * * * Permission is granted to reproduce and distribute * * this file by any means so long as no fee is charged * * above a nominal handling fee and so long as this * * notice is always included in the copies. * * * * Other rights are reserved except as explicitly granted * * by written permission of the author. * * Pavel Curtis * * Computer Science Dept. * * 405 Upson Hall * * Cornell University * * Ithaca, NY 14853 * * * * Ph- (607) 256-4934 * * * * Pavel.Cornell@Udel-Relay (ARPAnet) * * decvax!cornell!pavel (UUCPnet) * *********************************************************************/ X/* ** lib_printw.c ** ** The routines printw(), wprintw() and friend. ** ** $Log: RCS/lib_printw.v $ * Revision 2.1 82/10/25 14:48:38 pavel * Added Copyright Notice * * Revision 2.0 82/10/25 13:48:22 pavel * Beta-one Test Release * ** */ static char RCSid[] = "$Header: RCS/lib_printw.v Revision 2.1 82/10/25 14:48:38 pavel Exp$"; #include "curses.h" #include "curses.priv.h" printw(fmt, args) char *fmt; int args; { #ifdef TRACE if (_tracing) _tracef("printw(%s,...) called", fmt); #endif return(sprintw(stdscr, fmt, &args)); } wprintw(win, fmt, args) WINDOW *win; char *fmt; int args; { #ifdef TRACE if (_tracing) _tracef("wprintw(%o,%s,...) called", win, fmt); #endif return(sprintw(win, fmt, &args)); } mvprintw(y, x, fmt, args) int y, x; char *fmt; int args; { return(move(y, x) == OK ? sprintw(stdscr, fmt, &args) : ERR); } mvwprintw(win, y, x, fmt, args) WINDOW *win; int y, x; char *fmt; int args; { return(wmove(win, y, x) == OK ? sprintw(win, fmt, &args) : ERR); } X/* ** This routine actually executes the printf and adds it to the window ** ** This is really a modified version of "sprintf". As such, ** it assumes that sprintf interfaces with the other printf functions ** in a certain way. If this is not how your system works, you ** will have to modify this routine to use the interface that your ** "sprintf" uses. */ static sprintw(win, fmt, args) WINDOW *win; char *fmt; int *args; { FILE junk; char buf[512]; junk._flag = _IOWRT + _IOSTRG; junk._ptr = buf; junk._cnt = 32767; _doprnt(fmt, args, &junk); putc('\0', &junk); return(waddstr(win, buf)); } //go.sysin dd * echo 'x - =src/lib_raw.c' sed 's/^X//' <<'//go.sysin dd *' >=src/lib_raw.c X/********************************************************************* * COPYRIGHT NOTICE * ********************************************************************** * This software is copyright (C) 1982 by Pavel Curtis * * * * Permission is granted to reproduce and distribute * * this file by any means so long as no fee is charged * * above a nominal handling fee and so long as this * * notice is always included in the copies. * * * * Other rights are reserved except as explicitly granted * * by written permission of the author. * * Pavel Curtis * * Computer Science Dept. * * 405 Upson Hall * * Cornell University * * Ithaca, NY 14853 * * * * Ph- (607) 256-4934 * * * * Pavel.Cornell@Udel-Relay (ARPAnet) * * decvax!cornell!pavel (UUCPnet) * *********************************************************************/ X/* * raw.c * * Routines: * raw() * echo() * nl() * cbreak() * crmode() * noraw() * noecho() * nonl() * nocbreak() * nocrmode() * * cbreak() == crmode() * nocbreak() == crmode() * * $Log: RCS/lib_raw.v $ * Revision 2.1 82/10/25 14:48:42 pavel * Added Copyright Notice * * Revision 2.0 82/10/24 15:17:40 pavel * Beta-one Test Release * * Revision 1.3 82/08/23 22:30:32 pavel * The REAL Alpha-one Release Version * * Revision 1.2 82/08/19 19:11:25 pavel * Alpha Test Release One * * Revision 1.1 82/08/12 18:43:18 pavel * Initial revision * * */ static char RCSid[] = "$Header: RCS/lib_raw.v Revision 2.1 82/10/25 14:48:42 pavel Exp$"; #include "curses.h" #include "curses.priv.h" #include "term.h" raw() { #ifdef UNDEFINED if (_tracing) _tracef("raw() called"); #endif cur_term->Nttyb.sg_flags |= RAW; stty(cur_term->Filedes, &cur_term->Nttyb); SP->_raw = TRUE; SP->_nlmapping = TRUE; } cbreak() { #ifdef UNDEFINED if (_tracing) _tracef("cbreak() called"); #endif cur_term->Nttyb.sg_flags |= CBREAK; stty(cur_term->Filedes, &cur_term->Nttyb); SP->_cbreak = TRUE; } crmode() { #ifdef UNDEFINED if (_tracing) _tracef("crmode() called"); #endif cbreak(); } echo() { #ifdef UNDEFINED if (_tracing) _tracef("echo() called"); #endif cur_term->Nttyb.sg_flags |= ECHO; stty(cur_term->Filedes, &cur_term->Nttyb); SP->_echo = TRUE; } nl() { #ifdef UNDEFINED if (_tracing) _tracef("nl() called"); #endif cur_term->Nttyb.sg_flags |= CRMOD; stty(cur_term->Filedes, &cur_term->Nttyb); SP->_nl = TRUE; SP->_nlmapping = ! SP->_raw; } noraw() { #ifdef UNDEFINED if (_tracing) _tracef("noraw() called"); #endif cur_term->Nttyb.sg_flags &= ~RAW; stty(cur_term->Filedes, &cur_term->Nttyb); SP->_raw = FALSE; SP->_nlmapping = SP->_nl; } nocbreak() { #ifdef UNDEFINED if (_tracing) _tracef("nocbreak() called"); #endif cur_term->Nttyb.sg_flags &= ~CBREAK; stty(cur_term->Filedes, &cur_term->Nttyb); SP->_cbreak = FALSE; } nocrmode() { #ifdef UNDEFINED if (_tracing) _tracef("nocrmode() called"); #endif nocbreak(); } noecho() { #ifdef UNDEFINED if (_tracing) _tracef("noecho() called"); #endif cur_term->Nttyb.sg_flags &= ~ECHO; stty(cur_term->Filedes, &cur_term->Nttyb); SP->_echo = FALSE; } nonl() { #ifdef UNDEFINED if (_tracing) _tracef("nonl() called"); #endif cur_term->Nttyb.sg_flags &= ~CRMOD; stty(cur_term->Filedes, &cur_term->Nttyb); SP->_nl = FALSE; SP->_nlmapping = FALSE; } //go.sysin dd * echo 'x - =src/lib_refresh.c' sed 's/^X//' <<'//go.sysin dd *' >=src/lib_refresh.c X/********************************************************************* * COPYRIGHT NOTICE * ********************************************************************** * This software is copyright (C) 1982 by Pavel Curtis * * * * Permission is granted to reproduce and distribute * * this file by any means so long as no fee is charged * * above a nominal handling fee and so long as this * * notice is always included in the copies. * * * * Other rights are reserved except as explicitly granted * * by written permission of the author. * * Pavel Curtis * * Computer Science Dept. * * 405 Upson Hall * * Cornell University * * Ithaca, NY 14853 * * * * Ph- (607) 256-4934 * * * * Pavel.Cornell@Udel-Relay (ARPAnet) * * decvax!cornell!pavel (UUCPnet) * *********************************************************************/ X/* * lib_refresh.c * * The routines wrefresh() and wnoutrefresh(). * * $Log: lib_refresh.c,v $ * Revision 3.1 84/12/13 11:20:51 john * Revisions by Mark Horton * * Revision 2.1 82/10/25 14:48:45 pavel * Added Copyright Notice * * Revision 2.0 82/10/25 13:48:47 pavel * Beta-one Test Release * * */ static char RCSid[] = "$Header: lib_refresh.c,v 3.1 84/12/13 11:20:51 john Exp $"; #include "curses.h" #include "curses.priv.h" wrefresh(win) WINDOW *win; { #ifdef TRACE if (_tracing) _tracef("wrefresh(%o) called", win); #endif if (win == curscr) { curscr->_clear = TRUE; doupdate(); } else { wnoutrefresh(win); doupdate(); } } wnoutrefresh(win) WINDOW *win; { int i, j; int begx = win->_begx; int begy = win->_begy; int m, n; #ifdef TRACE if (_tracing) _tracef("wnoutrefresh(%o) called", win); #endif for (i=0, m=begy; i <= win->_maxy; i++, m++) { #ifdef TRACE if (_tracing) { _tracef("win->_firstchar[%d]= %d\t_lastchar= %d\t_numchngd= %d", i, win->_firstchar[i], win->_lastchar[i], win->_numchngd[i]); } #endif if (win->_numchngd[i]) { j = win->_firstchar[i]; n = j + begx; for (; j <= win->_lastchar[i]; j++, n++) { if (win->_line[i][j] != newscr->_line[m][n]) { newscr->_line[m][n] = win->_line[i][j]; newscr->_numchngd[m] += 1; if (newscr->_firstchar[m] == _NOCHANGE) newscr->_firstchar[m] = newscr->_lastchar[m] = n; else if (n < newscr->_firstchar[m]) newscr->_firstchar[m] = n; else if (n > newscr->_lastchar[m]) newscr->_lastchar[m] = n; } } } win->_numchngd[i] = 0; win->_firstchar[i] = win->_lastchar[i] = _NOCHANGE; } if (win->_clear) { win->_clear = FALSE; newscr->_clear = TRUE; } if (! win->_leave) { newscr->_cury = win->_cury + win->_begy; newscr->_curx = win->_curx + win->_begx; } } //go.sysin dd * echo 'x - =src/lib_scanw.c' sed 's/^X//' <<'//go.sysin dd *' >=src/lib_scanw.c X/********************************************************************* * COPYRIGHT NOTICE * ********************************************************************** * This software is copyright (C) 1982 by Pavel Curtis * * * * Permission is granted to reproduce and distribute * * this file by any means so long as no fee is charged * * above a nominal handling fee and so long as this * * notice is always included in the copies. * * * * Other rights are reserved except as explicitly granted * * by written permission of the author. * * Pavel Curtis * * Computer Science Dept. * * 405 Upson Hall * * Cornell University * * Ithaca, NY 14853 * * * * Ph- (607) 256-4934 * * * * Pavel.Cornell@Udel-Relay (ARPAnet) * * decvax!cornell!pavel (UUCPnet) * *********************************************************************/ X/* ** lib_scanw.c ** ** The routines scanw(), wscanw() and friend. ** ** $Log: RCS/lib_scanw.v $ * Revision 2.1 82/10/25 14:48:51 pavel * Added Copyright Notice * * Revision 2.0 82/10/25 13:49:07 pavel * Beta-one Test Release * ** */ static char RCSid[] = "$Header: RCS/lib_scanw.v Revision 2.1 82/10/25 14:48:51 pavel Exp$"; #include "curses.h" #include "curses.priv.h" scanw(fmt, args) char *fmt; int args; { #ifdef TRACE if (_tracing) _tracef("scanw(%s,...) called", fmt); #endif return(sscans(stdscr, fmt, &args)); } wscanw(win, fmt, args) WINDOW *win; char *fmt; int args; { #ifdef TRACE if (_tracing) _tracef("wscanw(%o,%s,...) called", win, fmt); #endif return(sscans(win, fmt, &args)); } mvscanw(y, x, fmt, args) int y, x; char *fmt; int args; { return(move(y, x) == OK ? sscanw(stdscr, fmt, &args) : ERR); } mvwscanw(win, y, x, fmt, args) WINDOW *win; int y, x; char *fmt; int args; { return(wmove(win, y, x) == OK ? sscanw(win, fmt, &args) : ERR); } X/* ** This routine actually executes the scanf from the window. ** ** This is really a modified version of "sscanf". As such, ** it assumes that sscanf interfaces with the other scanf functions ** in a certain way. If this is not how your system works, you ** will have to modify this routine to use the interface that your ** "sscanf" uses. */ static sscans(win, fmt, args) WINDOW *win; char *fmt; int *args; { char buf[100]; FILE junk; junk._flag = _IOREAD|_IOSTRG; junk._base = junk._ptr = buf; if (wgetstr(win, buf) == ERR) return(ERR); junk._cnt = strlen(buf); return(_doscan(&junk, fmt, args)); } //go.sysin dd * echo 'x - =src/lib_scroll.c' sed 's/^X//' <<'//go.sysin dd *' >=src/lib_scroll.c X/********************************************************************* * COPYRIGHT NOTICE * ********************************************************************** * This software is copyright (C) 1982 by Pavel Curtis * * * * Permission is granted to reproduce and distribute * * this file by any means so long as no fee is charged * * above a nominal handling fee and so long as this * * notice is always included in the copies. * * * * Other rights are reserved except as explicitly granted * * by written permission of the author. * * Pavel Curtis * * Computer Science Dept. * * 405 Upson Hall * * Cornell University * * Ithaca, NY 14853 * * * * Ph- (607) 256-4934 * * * * Pavel.Cornell@Udel-Relay (ARPAnet) * * decvax!cornell!pavel (UUCPnet) * *********************************************************************/ X/* ** lib_scroll.c ** ** The routine scroll(). ** ** $Log: RCS/lib_scroll.v $ * Revision 2.1 82/10/25 14:48:54 pavel * Added Copyright Notice * * Revision 2.0 82/10/25 13:49:22 pavel * Beta-one Test Release * ** */ static char RCSid[] = "$Header: RCS/lib_scroll.v Revision 2.1 82/10/25 14:48:54 pavel Exp$"; #include "curses.h" #include "curses.priv.h" scroll(win) WINDOW *win; { int i; chtype *ptr, *temp; chtype blank = ' ' | win->_attrs; #ifdef TRACE if (_tracing) _tracef("scroll(%o) called", win); #endif if (! win->_scroll) return; temp = win->_line[0]; for (i = 0; i < win->_regbottom; i++) win->_line[i] = win->_line[i+1]; for (ptr = temp; ptr - temp <= win->_maxx; ptr++) *ptr = blank; win->_line[win->_regbottom] = temp; win->_cury--; } //go.sysin dd * echo 'x - =src/lib_scrreg.c' sed 's/^X//' <<'//go.sysin dd *' >=src/lib_scrreg.c X/********************************************************************* * COPYRIGHT NOTICE * ********************************************************************** * This software is copyright (C) 1982 by Pavel Curtis * * * * Permission is granted to reproduce and distribute * * this file by any means so long as no fee is charged * * above a nominal handling fee and so long as this * * notice is always included in the copies. * * * * Other rights are reserved except as explicitly granted * * by written permission of the author. * * Pavel Curtis * * Computer Science Dept. * * 405 Upson Hall * * Cornell University * * Ithaca, NY 14853 * * * * Ph- (607) 256-4934 * * * * Pavel.Cornell@Udel-Relay (ARPAnet) * * decvax!cornell!pavel (UUCPnet) * *********************************************************************/ X/* ** lib_scrreg.c ** ** The routine wsetscrreg(). ** ** $Log: RCS/lib_scrreg.v $ * Revision 2.1 82/10/25 14:49:00 pavel * Added Copyright Notice * * Revision 2.0 82/10/25 13:49:29 pavel * Beta-one Test Release * ** */ static char RCSid[] = "$Header: RCS/lib_scrreg.v Revision 2.1 82/10/25 14:49:00 pavel Exp$"; #include "curses.h" #include "curses.priv.h" wsetscrreg(win, top, bottom) WINDOW *win; int top, bottom; { #ifdef TRACE if (_tracing) _tracef("wsetscrreg(%o,%d,%d) called", win, top, bottom); #endif if (0 <= top && top <= win->_cury && win->_cury <= bottom && bottom <= win->_maxy) { win->_regtop = top; win->_regbottom = bottom; return(OK); } else return(ERR); } //go.sysin dd * echo 'x - =src/lib_set_term.c' sed 's/^X//' <<'//go.sysin dd *' >=src/lib_set_term.c X/********************************************************************* * COPYRIGHT NOTICE * ********************************************************************** * This software is copyright (C) 1982 by Pavel Curtis * * * * Permission is granted to reproduce and distribute * * this file by any means so long as no fee is charged * * above a nominal handling fee and so long as this * * notice is always included in the copies. * * * * Other rights are reserved except as explicitly granted * * by written permission of the author. * * Pavel Curtis * * Computer Science Dept. * * 405 Upson Hall * * Cornell University * * Ithaca, NY 14853 * * * * Ph- (607) 256-4934 * * * * Pavel.Cornell@Udel-Relay (ARPAnet) * * decvax!cornell!pavel (UUCPnet) * *********************************************************************/ X/* ** lib_set_term.c ** ** The routine set_term(). ** ** $Log: RCS/lib_set_term.v $ * Revision 2.1 82/10/25 14:49:06 pavel * Added Copyright Notice * * Revision 2.0 82/10/25 13:49:42 pavel * Beta-one Test Release * ** */ static char RCSid[] = "$Header: RCS/lib_set_term.v Revision 2.1 82/10/25 14:49:06 pavel Exp$"; #include "curses.h" #include "curses.priv.h" #include "term.h" struct screen * set_term(screen) struct screen *screen; { struct screen *oldSP; #ifdef TRACE if (_tracing) _tracef("set_term(%o) called", screen); #endif oldSP = SP; SP = screen; cur_term = SP->_term; curscr = SP->_curscr; newscr = SP->_newscr; return(oldSP); } //go.sysin dd * echo 'x - =src/lib_setup.c' sed 's/^X//' <<'//go.sysin dd *' >=src/lib_setup.c X/********************************************************************* * COPYRIGHT NOTICE * ********************************************************************** * This software is copyright (C) 1982 by Pavel Curtis * * * * Permission is granted to reproduce and distribute * * this file by any means so long as no fee is charged * * above a nominal handling fee and so long as this * * notice is always included in the copies. * * * * Other rights are reserved except as explicitly granted * * by written permission of the author. * * Pavel Curtis * * Computer Science Dept. * * 405 Upson Hall * * Cornell University * * Ithaca, NY 14853 * * * * Ph- (607) 256-4934 * * * * Pavel.Cornell@Udel-Relay (ARPAnet) * * decvax!cornell!pavel (UUCPnet) * *********************************************************************/ X/* * setupterm(termname, filedes, errret) * * Find and read the appropriate object file for the terminal * Make cur_term point to the structure. * Turn off the XTABS bit in the tty structure if it was on * If XTABS was on, remove the tab and backtab capabilities. * * $Log: RCS/lib_setup.v $ * Revision 2.1 82/10/25 14:49:09 pavel * Added Copyright Notice * * Revision 2.0 82/10/24 15:17:46 pavel * Beta-one Test Release * * Revision 1.5 82/08/23 22:30:35 pavel * The REAL Alpha-one Release Version * * Revision 1.4 82/08/20 15:12:24 pavel * Fixed use of un-initialised cur_term. * * Revision 1.3 82/08/19 19:22:09 pavel * Alpha Test Release One * * Revision 1.2 82/08/19 19:11:28 pavel * Alpha Test Release One * * Revision 1.1 82/08/12 18:45:07 pavel * Initial revision * * */ static char RCSid[] = "$Header: RCS/lib_setup.v Revision 2.1 82/10/25 14:49:09 pavel Exp$"; #include <stdio.h> #include "curses.h" #include "curses.priv.h" #include "term.h" #define ret_error(code, fmt, arg) if (errret)\ {\ *errret = code;\ return(code);\ }\ else\ {\ fprintf(stderr, fmt, arg);\ exit(1);\ } setupterm(termname, filedes, errret) char *termname; int filedes; int *errret; { char filename1[1024]; char filename2[1024]; char *directory = SRCDIR; char *malloc(), *getenv(); char *terminfo; struct term *term_ptr; #ifdef TRACE _init_trace(); if (_tracing) _tracef("setupterm(%s,%d,%o) called", termname, filedes, errret); #endif if (termname == NULL) { termname = getenv("TERM"); if (termname == NULL) ret_error(-1, "TERM environment variable not set.\n", ""); } if (cur_term == 0) term_ptr = &_first_term; else { term_ptr = (struct term *) malloc(sizeof(struct term)); if (term_ptr == NULL) ret_error(-1, "Not enough memory to create terminal structure.\n", ""); } if ((terminfo = getenv("TERMINFO")) != NULL) directory = terminfo; sprintf(filename1, "%s/%c/%s", directory, termname[0], termname); sprintf(filename2, "%s/%c/%s", SRCDIR, termname[0], termname); if (read_entry(filename1, term_ptr) < 0 && read_entry(filename2, term_ptr) < 0) ret_error(0, "'%s': Unknown terminal type.\n", termname); if (command_character && getenv("CC")) do_prototype(); cur_term = term_ptr; strncpy(ttytype, cur_term->term_names, NAMESIZE - 1); ttytype[NAMESIZE - 1] = '\0'; cur_term->Filedes = filedes; gtty(filedes, &cur_term->Ottyb); if (cur_term->Ottyb.sg_flags & XTABS) tab = back_tab = NULL; cur_term->Nttyb = cur_term->Ottyb; cur_term->Nttyb.sg_flags &= ~XTABS; fixterm(); if (errret) *errret = 1; return(1); } X/* ** do_prototype() ** ** Take the real command character out of the CC environment variable ** and substitute it in for the prototype given in 'command_character'. ** */ static do_prototype() { int i, j; char CC; char proto; CC = *getenv("CC"); proto = *command_character; for (i=0; i < STRCOUNT; i++) { j = 0; while (cur_term->Strings[i][j]) { if (cur_term->Strings[i][j] == proto) cur_term->Strings[i][j] = CC; j++; } } } //go.sysin dd * echo 'x - =src/lib_touchwin.c' sed 's/^X//' <<'//go.sysin dd *' >=src/lib_touchwin.c X/********************************************************************* * COPYRIGHT NOTICE * ********************************************************************** * This software is copyright (C) 1982 by Pavel Curtis * * * * Permission is granted to reproduce and distribute * * this file by any means so long as no fee is charged * * above a nominal handling fee and so long as this * * notice is always included in the copies. * * * * Other rights are reserved except as explicitly granted * * by written permission of the author. * * Pavel Curtis * * Computer Science Dept. * * 405 Upson Hall * * Cornell University * * Ithaca, NY 14853 * * * * Ph- (607) 256-4934 * * * * Pavel.Cornell@Udel-Relay (ARPAnet) * * decvax!cornell!pavel (UUCPnet) * *********************************************************************/ X/* ** lib_touchwin.c ** ** The routine touchwin(). ** ** $Log: RCS/lib_touchwin.v $ * Revision 2.1 82/10/25 14:49:13 pavel * Added Copyright Notice * * Revision 2.0 82/10/25 13:49:52 pavel * Beta-one Test Release * ** */ static char RCSid[] = "$Header: RCS/lib_touchwin.v Revision 2.1 82/10/25 14:49:13 pavel Exp$"; #include "curses.h" #include "curses.priv.h" touchwin(win) WINDOW *win; { int y, maxy, maxx; #ifdef TRACE if (_tracing) _tracef("touchwin(%o) called", win); #endif maxy = win->_maxy; maxx = win->_maxx; for (y = 0; y <= maxy; y++) { win->_firstchar[y] = 0; win->_lastchar[y] = maxx; win->_numchngd[y] = maxx; } } //go.sysin dd * echo 'x - =src/lib_tparm.c' sed 's/^X//' <<'//go.sysin dd *' >=src/lib_tparm.c X/********************************************************************* * COPYRIGHT NOTICE * ********************************************************************** * This software is copyright (C) 1982 by Pavel Curtis * * * * Permission is granted to reproduce and distribute * * this file by any means so long as no fee is charged * * above a nominal handling fee and so long as this * * notice is always included in the copies. * * * * Other rights are reserved except as explicitly granted * * by written permission of the author. * * Pavel Curtis * * Computer Science Dept. * * 405 Upson Hall * * Cornell University * * Ithaca, NY 14853 * * * * Ph- (607) 256-4934 * * * * Pavel.Cornell@Udel-Relay (ARPAnet) * * decvax!cornell!pavel (UUCPnet) * *********************************************************************/ X/* * tparm.c * * $Log: RCS/lib_tparm.v $ * Revision 2.1 82/10/25 14:49:19 pavel * Added Copyright Notice * * Revision 2.0 82/10/24 15:17:53 pavel * Beta-one Test Release * * Revision 1.3 82/08/23 22:30:38 pavel * The REAL Alpha-one Release Version * * Revision 1.2 82/08/19 19:11:33 pavel * Alpha Test Release One * * Revision 1.1 82/08/12 18:45:33 pavel * Initial revision * * */ static char RCSid[] = "$Header: RCS/lib_tparm.v Revision 2.1 82/10/25 14:49:19 pavel Exp$"; #include "curses.h" #include "curses.priv.h" #include "term.h" X/* * char * * tparm(string, parms) * * Substitute the given parameters into the given string by the following * rules (taken from terminfo(5)): * * Cursor addressing and other strings requiring parame- * ters in the terminal are described by a parameterized string * capability, with like escapes %x in it. For example, to * address the cursor, the cup capability is given, using two * parameters: the row and column to address to. (Rows and * columns are numbered from zero and refer to the physical * screen visible to the user, not to any unseen memory.) If * the terminal has memory relative cursor addressing, that can * be indicated by * * The parameter mechanism uses a stack and special % * codes to manipulate it. Typically a sequence will push one * of the parameters onto the stack and then print it in some * format. Often more complex operations are necessary. * * The % encodings have the following meanings: * * %% outputs `%' * %d print pop() like %d in printf() * %2d print pop() like %2d in printf() * %02d print pop() like %02d in printf() * %3d print pop() like %3d in printf() * %03d print pop() like %03d in printf() * %c print pop() like %c in printf() * %s print pop() like %s in printf() * * %p[1-9] push ith parm * %P[a-z] set variable [a-z] to pop() * %g[a-z] get variable [a-z] and push it * %'c' push char constant c * %{nn} push integer constant nn * * %+ %- %* %/ %m * arithmetic (%m is mod): push(pop() op pop()) * %& %| %^ bit operations: push(pop() op pop()) * %= %> %< logical operations: push(pop() op pop()) * %! %~ unary operations push(op pop()) * %i add 1 to first two parms (for ANSI terminals) * * %? expr %t thenpart %e elsepart %; * if-then-else, %e elsepart is optional. * else-if's are possible ala Algol 68: * %? c1 %t b1 %e c2 %t b2 %e c3 %t b3 %e c4 %t b4 %e b5 %; * * For those of the above operators which are binary and not commutative, * the stack works in the usual way, with * %gx %gy %m * resulting in x mod y, not the reverse. */ #define STACKSIZE 20 #define npush(x) if (stack_ptr < STACKSIZE) {stack[stack_ptr].num = x;\ stack_ptr++;\ } #define npop() (stack_ptr > 0 ? stack[--stack_ptr].num : 0) #define spop() (stack_ptr > 0 ? stack[--stack_ptr].str : (char *) 0) typedef union { unsigned int num; char *str; } stack_frame; stack_frame stack[STACKSIZE]; static int stack_ptr; static char buffer[256]; static int *param; static char *bufptr; static int variable[26]; static char *do_tparm(); char * tparm(string, parms) char *string; int parms; { char len; int number; int level; int x, y; param = &parms; #ifdef UNDEFINED if (_tracing) _tracef("tparm(%s,%d,%d,%d,%d,%d,%d,%d,%d,%d) called", string, param[0], param[1], param[2], param[3], param[4], param[5], param[6], param[7], param[8]); #endif stack_ptr = 0; bufptr = buffer; while (*string) { if (*string != '%') *(bufptr++) = *string; else { string++; switch (*string) { default: break; case '%': *(bufptr++) = '%'; break; case 'd': sprintf(bufptr, "%d", npop()); bufptr += strlen(bufptr); break; case '0': string++; len = *string; if ((len == '2' || len == '3') && *++string == 'd') { if (len == '2') sprintf(bufptr, "%02d", npop()); else sprintf(bufptr, "%03d", npop()); bufptr += strlen(bufptr); } break; case '2': string++; if (*string == 'd') { sprintf(bufptr, "%2d", npop()); bufptr += strlen(bufptr); } break; case '3': string++; if (*string == 'd') { sprintf(bufptr, "%3d", npop()); bufptr += strlen(bufptr); } break; case 'c': *(bufptr++) = (char) npop(); break; case 's': strcpy(bufptr, spop()); bufptr += strlen(bufptr); break; case 'p': string++; if (*string >= '1' && *string <= '9') npush(param[*string - '1']); break; case 'P': string++; if (*string >= 'a' && *string <= 'z') variable[*string - 'a'] = npop(); break; case 'g': string++; if (*string >= 'a' && *string <= 'z') npush(variable[*string - 'a']); break; case '\'': string++; npush(*string); string++; break; case '{': number = 0; string++; while (*string >= '0' && *string <= '9') { number = number * 10 + *string - '0'; string++; } npush(number); break; case '+': npush(npop() + npop()); break; case '-': y = npop(); x = npop(); npush(x - y); break; case '*': npush(npop() * npop()); break; case '/': y = npop(); x = npop(); npush(x / y); break; case 'm': y = npop(); x = npop(); npush(x % y); break; case '&': npush(npop() & npop()); break; case '|': npush(npop() | npop()); break; case '^': npush(npop() ^ npop()); break; case '=': y = npop(); x = npop(); npush(x == y); break; case '<': y = npop(); x = npop(); npush(x < y); break; case '>': y = npop(); x = npop(); npush(x > y); break; case '!': npush(! npop()); break; case '~': npush(~ npop()); break; case 'i': param[0]++; param[1]++; break; case '?': break; case 't': x = npop(); if (x) { /* do nothing; keep executing */ } else { /* scan forward for %e or %; at level zero */ string++; level = 0; while (*string) { if (*string == '%') { string++; if (*string == '?') level++; else if (*string == ';') { if (level > 0) level--; else break; } else if (*string == 'e' && level == 0) break; } if (*string) string++; } } break; case 'e': /* scan forward for a %; at level zero */ string++; level = 0; while (*string) { if (*string == '%') { string++; if (*string == '?') level++; else if (*string == ';') { if (level > 0) level--; else break; } } if (*string) string++; } break; case ';': break; } /* endswitch (*string) */ } /* endelse (*string == '%') */ if (*string == '\0') break; string++; } /* endwhile (*string) */ *bufptr = '\0'; return(buffer); } X/* * char * * tgoto(string, x, y) * * Retained solely for upward compatibility. Note the intentional * reversing of the last two arguments. * */ char * tgoto(string, x, y) char *string; int x, y; { return(tparm(string, y, x)); } //go.sysin dd * exit
sources@genrad.UUCP (12/21/84)
This is part of a distribution of a public domain version of terminfo/curses It is a rather large distribution, so I have broken it up into 11 modules (each less than 64K long.) Each shar format module should end with the line "exit". This code is completely public domain, originally written by Pavel Curtis of Cornell University. This version has some small improvements and bug fixes. This unit contains: The last of the library, and the start of the terminal data. Part 10 will be The end of the terminfo terminal data base. ----------------- cut here ---------------- : Run this shell script with "sh" not "csh" PATH=:/bin:/usr/bin:/usr/ucb export PATH if test ! -d =src then echo 'Making directory "=src"' mkdir =src fi echo 'x - =src/lib_tputs.c' sed 's/^X//' <<'//go.sysin dd *' >=src/lib_tputs.c X/********************************************************************* * COPYRIGHT NOTICE * ********************************************************************** * This software is copyright (C) 1982 by Pavel Curtis * * * * Permission is granted to reproduce and distribute * * this file by any means so long as no fee is charged * * above a nominal handling fee and so long as this * * notice is always included in the copies. * * * * Other rights are reserved except as explicitly granted * * by written permission of the author. * * Pavel Curtis * * Computer Science Dept. * * 405 Upson Hall * * Cornell University * * Ithaca, NY 14853 * * * * Ph- (607) 256-4934 * * * * Pavel.Cornell@Udel-Relay (ARPAnet) * * decvax!cornell!pavel (UUCPnet) * *********************************************************************/ X/* * tputs.c * * $Log: lib_tputs.c,v $ * Revision 3.1 84/12/13 11:21:03 john * Revisions by Mark Horton * * Revision 2.1 82/10/25 14:49:31 pavel * Added Copyright Notice * * Revision 2.0 82/10/24 15:18:06 pavel * Beta-one Test Release * * Revision 1.3 82/08/23 22:30:52 pavel * The REAL Alpha-one Release Version * * Revision 1.2 82/08/19 19:11:38 pavel * Alpha Test Release One * * Revision 1.1 82/08/12 18:46:00 pavel * Initial revision * * */ static char RCSid[] = "$Header: lib_tputs.c,v 3.1 84/12/13 11:21:03 john Exp $"; #include <ctype.h> #include <stdio.h> #include "curses.h" #include "curses.priv.h" #include "term.h" tputs(string, affcnt, outc) char *string; int affcnt; int (*outc)(); { float number; int baud = baudrate(); char null = '\0'; int i; #ifdef TRACE if (_tracing) _tracef("tputs(%s,%d,%o) called", string, affcnt, outc); #endif if (pad_char) null = pad_char[0]; while (*string) { if (*string != '$') (*outc)(*string); else { string++; if (*string != '<') { (*outc)('$'); (*outc)(*string); } else { number = 0; string++; if (!isdigit(*string) && *string != '.' || !index(string, '>')) { (*outc)('$'); (*outc)('<'); continue; } while (isdigit(*string)) { number = number * 10 + *string - '0'; string++; } if (*string == '.') { string++; if (isdigit(*string)) { number += (float) (*string - '0') / 10.; string++; } } if (*string == '*') { number *= affcnt; string++; } if (padding_baud_rate && baud >= padding_baud_rate && !xon_xoff) { number = ((baud / 10.) * number) / 1000.; for (i=0; i < number; i++) (*outc)(null); } } /* endelse (*string == '<') */ } /* endelse (*string == '$') */ if (*string == '\0') break; string++; } } void _outc(ch) { putchar(ch); } putp(string) { #ifdef TRACE if (_tracing) _tracef("putp(%s) called", string); #endif tputs(string, 1, _outc); } //go.sysin dd * echo 'x - =src/lib_trace.c' sed 's/^X//' <<'//go.sysin dd *' >=src/lib_trace.c X/********************************************************************* * COPYRIGHT NOTICE * ********************************************************************** * This software is copyright (C) 1982 by Pavel Curtis * * * * Permission is granted to reproduce and distribute * * this file by any means so long as no fee is charged * * above a nominal handling fee and so long as this * * notice is always included in the copies. * * * * Other rights are reserved except as explicitly granted * * by written permission of the author. * * Pavel Curtis * * Computer Science Dept. * * 405 Upson Hall * * Cornell University * * Ithaca, NY 14853 * * * * Ph- (607) 256-4934 * * * * Pavel.Cornell@Udel-Relay (ARPAnet) * * decvax!cornell!pavel (UUCPnet) * *********************************************************************/ X/* * lib_trace.c - Tracing/Debugging routines * * $Log: RCS/lib_trace.v $ * Revision 2.1 82/10/25 14:49:35 pavel * Added Copyright Notice * * Revision 2.0 82/10/24 15:18:09 pavel * Beta-one Test Release * * Revision 1.3 82/08/23 22:30:57 pavel * The REAL Alpha-one Release Version * * Revision 1.2 82/08/19 19:11:41 pavel * Alpha Test Release One * * Revision 1.1 82/08/15 17:59:45 pavel * Initial revision * * */ static char RCSid[] = "$Header: RCS/lib_trace.v Revision 2.1 82/10/25 14:49:35 pavel Exp$"; #include "term.h" #include "curses.h" #include "curses.priv.h" static int tracefd; _init_trace() { static int been_here = 0; extern int errno; extern char *sys_errlist[]; if (! been_here) { been_here = 1; if ((tracefd = creat("trace", 0644)) < 0) { write(2, "curses: Can't open 'trace' file: ", 33); write(2, sys_errlist[errno], strlen(sys_errlist[errno])); write(2, "\n", 1); exit(1); } } } traceon() { _tracef("traceon() called"); _tracing = 1; } traceoff() { _tracef("traceoff() called"); _tracing = 0; } _tracef(fmt, args) char *fmt; int args; { int *parm = &args; char buffer[256]; char *bufp = buffer; while (*fmt) { if (*fmt == '%') { fmt++; switch (*fmt) { case 'd': addnum(&bufp, *(parm++), 10); break; case 'o': addnum(&bufp, *(parm++), 8); break; case 'c': *(bufp++) = *(parm++); break; case 's': if (*parm) { *(bufp++) = '"'; strcpy(bufp, *parm); bufp += strlen(*parm); *(bufp++) = '"'; } else { strcpy(bufp, "NULL"); bufp += 4; } parm++; break; } } else *(bufp++) = *fmt; fmt++; } *(bufp++) = '\n'; *bufp = '\0'; write(tracefd, buffer, strlen(buffer)); } static addnum(bufp, num, base) char **bufp; int num, base; { int a; if (num < 0) { num = -num; *((*bufp)++) = '-'; } if ((a = num / base) != 0) addnum(bufp, a, base); *((*bufp)++) = '0' + (num % base); } //go.sysin dd * echo 'x - =src/lib_tstp.c' sed 's/^X//' <<'//go.sysin dd *' >=src/lib_tstp.c X/********************************************************************* * COPYRIGHT NOTICE * ********************************************************************** * This software is copyright (C) 1982 by Pavel Curtis * * * * Permission is granted to reproduce and distribute * * this file by any means so long as no fee is charged * * above a nominal handling fee and so long as this * * notice is always included in the copies. * * * * Other rights are reserved except as explicitly granted * * by written permission of the author. * * Pavel Curtis * * Computer Science Dept. * * 405 Upson Hall * * Cornell University * * Ithaca, NY 14853 * * * * Ph- (607) 256-4934 * * * * Pavel.Cornell@Udel-Relay (ARPAnet) * * decvax!cornell!pavel (UUCPnet) * *********************************************************************/ X/* ** lib_tstp.c ** ** The routine tstp(). ** ** $Log: RCS/lib_tstp.v $ * Revision 2.1 82/10/25 14:49:39 pavel * Added Copyright Notice * * Revision 2.0 82/10/25 13:50:01 pavel * Beta-one Test Release * ** */ static char RCSid[] = "$Header: RCS/lib_tstp.v Revision 2.1 82/10/25 14:49:39 pavel Exp$"; #include "term.h" #include "curses.h" #include "curses.priv.h" #include <signal.h> static outc(ch) char ch; { putc(ch, SP->_ofp); } tstp() { #ifdef TRACE if (_tracing) _tracef("tstp() called"); #endif endwin(); kill(0, SIGTSTP); signal(SIGTSTP, tstp); fixterm(); flushinp(); tputs(enter_ca_mode, 1, outc); wrefresh(curscr); } //go.sysin dd * echo 'x - =src/lib_unctrl.c' sed 's/^X//' <<'//go.sysin dd *' >=src/lib_unctrl.c X/********************************************************************* * COPYRIGHT NOTICE * ********************************************************************** * This software is copyright (C) 1982 by Pavel Curtis * * * * Permission is granted to reproduce and distribute * * this file by any means so long as no fee is charged * * above a nominal handling fee and so long as this * * notice is always included in the copies. * * * * Other rights are reserved except as explicitly granted * * by written permission of the author. * * Pavel Curtis * * Computer Science Dept. * * 405 Upson Hall * * Cornell University * * Ithaca, NY 14853 * * * * Ph- (607) 256-4934 * * * * Pavel.Cornell@Udel-Relay (ARPAnet) * * decvax!cornell!pavel (UUCPnet) * *********************************************************************/ X/* * define unctrl codes for each character * * $Log: RCS/lib_unctrl.v $ * Revision 2.1 82/10/25 14:49:42 pavel * Added Copyright Notice * * Revision 2.0 82/10/24 15:18:12 pavel * Beta-one Test Release * * Revision 1.3 82/08/23 22:31:04 pavel * The REAL Alpha-one Release Version * * Revision 1.2 82/08/19 19:11:43 pavel * Alpha Test Release One * * Revision 1.1 82/08/12 18:46:42 pavel * Initial revision * * */ static char RCSid[] = "$Header: RCS/lib_unctrl.v Revision 2.1 82/10/25 14:49:42 pavel Exp$"; X/* LINTLIBRARY */ char *_unctrl[] = { /* unctrl codes for ttys */ "^@", "^A", "^B", "^C", "^D", "^E", "^F", "^G", "^H", "^I", "^J", "^K", "^L", "^M", "^N", "^O", "^P", "^Q", "^R", "^S", "^T", "^U", "^V", "^W", "^X", "^Y", "^Z", "^[", "^\\", "^]", "^~", "^_", " ", "!", "\"", "#", "$", "%", "&", "'", "(", ")", "*", "+", ",", "-", ".", "/", "0", "1", "2", "3", "4", "5", "6", "7", "8", "9", ":", ";", "<", "=", ">", "?", "@", "A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L", "M", "N", "O", "P", "Q", "R", "S", "T", "U", "V", "W", "X", "Y", "Z", "[", "\\", "]", "^", "_", "`", "a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k", "l", "m", "n", "o", "p", "q", "r", "s", "t", "u", "v", "w", "x", "y", "z", "{", "|", "}", "~", "^?" }; //go.sysin dd * echo 'x - =src/lib_vidattr.c' sed 's/^X//' <<'//go.sysin dd *' >=src/lib_vidattr.c X/********************************************************************* * COPYRIGHT NOTICE * ********************************************************************** * This software is copyright (C) 1982 by Pavel Curtis * * * * Permission is granted to reproduce and distribute * * this file by any means so long as no fee is charged * * above a nominal handling fee and so long as this * * notice is always included in the copies. * * * * Other rights are reserved except as explicitly granted * * by written permission of the author. * * Pavel Curtis * * Computer Science Dept. * * 405 Upson Hall * * Cornell University * * Ithaca, NY 14853 * * * * Ph- (607) 256-4934 * * * * Pavel.Cornell@Udel-Relay (ARPAnet) * * decvax!cornell!pavel (UUCPnet) * *********************************************************************/ X/* * vidputs(newmode, outc) * * newmode is taken to be the logical 'or' of the symbols in curses.h * representing graphic renditions. The teminal is set to be in all of * the given modes, if possible. * * if set-attributes exists * use it to set exactly what you want * else * if exit-attribute-mode exists * turn off everything * else * turn off those which can be turned off and aren't in * newmode. * turn on each mode which should be on and isn't, one by one * * NOTE that this algorithm won't achieve the desired mix of attributes * in some cases, but those are probably just those cases in which it is * actually impossible, anyway, so... * * $Log: RCS/lib_vidattr.v $ * Revision 2.1 82/10/25 14:49:45 pavel * Added Copyright Notice * * Revision 2.0 82/10/24 15:18:15 pavel * Beta-one Test Release * * Revision 1.3 82/08/23 22:31:08 pavel * The REAL Alpha-one Release Version * * Revision 1.2 82/08/19 19:11:46 pavel * Alpha Test Release One * * Revision 1.1 82/08/12 18:48:23 pavel * Initial revision * * */ static char RCSid[] = "$Header: RCS/lib_vidattr.v Revision 2.1 82/10/25 14:49:45 pavel Exp$"; #include "curses.h" #include "curses.priv.h" #include "term.h" vidputs(newmode, outc) unsigned newmode; int (*outc)(); { static unsigned previous_attr = 0; unsigned turn_off, turn_on; #ifdef TRACE if (_tracing) _tracef("vidputs(%o,%o) called", newmode, outc); #endif if (set_attributes) { tputs(tparm(set_attributes, (newmode & A_STANDOUT) != 0, (newmode & A_UNDERLINE) != 0, (newmode & A_REVERSE) != 0, (newmode & A_BLINK) != 0, (newmode & A_DIM) != 0, (newmode & A_BOLD) != 0, (newmode & A_INVIS) != 0, (newmode & A_PROTECT) != 0, (newmode & A_ALTCHARSET) != 0), 1, outc); } else { if (exit_attribute_mode) tputs(exit_attribute_mode, 1, outc); else { turn_off = ~newmode & previous_attr; if ((turn_off & A_UNDERLINE) && exit_underline_mode) tputs(exit_underline_mode, 1, outc); if ((turn_off & A_STANDOUT) && exit_standout_mode) tputs(exit_standout_mode, 1, outc); if ((turn_off & A_ALTCHARSET) && exit_alt_charset_mode) tputs(exit_alt_charset_mode, 1, outc); } turn_on = newmode & ~previous_attr; if ((turn_on & A_ALTCHARSET) && enter_alt_charset_mode) tputs(enter_alt_charset_mode, 1, outc); if ((turn_on & A_BLINK) && enter_blink_mode) tputs(enter_blink_mode, 1, outc); if ((turn_on & A_BOLD) && enter_bold_mode) tputs(enter_bold_mode, 1, outc); if ((turn_on & A_INVIS) && enter_secure_mode) tputs(enter_secure_mode, 1, outc); if ((turn_on & A_DIM) && enter_dim_mode) tputs(enter_dim_mode, 1, outc); if ((turn_on & A_PROTECT) && enter_protected_mode) tputs(enter_protected_mode, 1, outc); if ((turn_on & A_REVERSE) && enter_reverse_mode) tputs(enter_reverse_mode, 1, outc); if ((turn_on & A_STANDOUT) && enter_standout_mode) tputs(enter_standout_mode, 1, outc); if ((turn_on & A_UNDERLINE) && enter_underline_mode) tputs(enter_underline_mode, 1, outc); } previous_attr = newmode; } vidattr(newmode) unsigned newmode; { void _outc(); #ifdef TRACE if (_tracing) _tracef("vidattr(%o) called", newmode); #endif vidputs(newmode, _outc); } //go.sysin dd * echo 'x - =src/read_entry.c' sed 's/^X//' <<'//go.sysin dd *' >=src/read_entry.c X/********************************************************************* * COPYRIGHT NOTICE * ********************************************************************** * This software is copyright (C) 1982 by Pavel Curtis * * * * Permission is granted to reproduce and distribute * * this file by any means so long as no fee is charged * * above a nominal handling fee and so long as this * * notice is always included in the copies. * * * * Other rights are reserved except as explicitly granted * * by written permission of the author. * * Pavel Curtis * * Computer Science Dept. * * 405 Upson Hall * * Cornell University * * Ithaca, NY 14853 * * * * Ph- (607) 256-4934 * * * * Pavel.Cornell@Udel-Relay (ARPAnet) * * decvax!cornell!pavel (UUCPnet) * *********************************************************************/ X/* * read_entry.c -- Routine for reading in a compiled terminfo file * * $Log: read_entry.c,v $ * Revision 3.1 84/12/13 11:21:14 john * Revisions by Mark Horton * * Revision 2.1 82/10/25 14:49:55 pavel * Added Copyright Notice * * Revision 2.0 82/10/24 15:18:22 pavel * Beta-one Test Release * * Revision 1.3 82/08/23 22:31:15 pavel * The REAL Alpha-one Release Version * * Revision 1.2 82/08/19 19:11:49 pavel * Alpha Test Release One * * Revision 1.1 82/08/12 22:25:13 pavel * Initial revision * * */ static char RCSid[] = "$Header: read_entry.c,v 3.1 84/12/13 11:21:14 john Exp $"; #include <sys/types.h> #include <sys/stat.h> #include "term.h" #include "object.h" #define OFFSET_BUFSIZE 100 #define min(a, b) ((a) > (b) ? (b) : (a)) X/* * int * read_entry(filename, ptr) * * Read the compiled terminfo entry in the given file into the * structure pointed to by ptr, allocating space for the string * table and placing its address in ptr->str_table. * */ #define swap(x) (((x >> 8) & 0377) + 256 * (x & 0377)) static char TermNames[128]; /* Buffer for terminal names for first term */ static char StringTable[1024]; /* String table for first terminal */ int read_entry(filename, ptr) char *filename; struct term *ptr; { struct stat statbuf; int fd; int numread; int num_strings; int cur_string; char *malloc(); int i; struct header header; unsigned char bytebuf[2]; char ch; union { unsigned char byte[2]; short number; } offset_buf[OFFSET_BUFSIZE]; fd = open(filename, 0); if (fd < 0) return(-1); read(fd, &header, sizeof(header)); if (must_swap()) { header.magic = swap(header.magic); header.name_size = swap(header.name_size); header.bool_count = swap(header.bool_count); header.num_count = swap(header.num_count); header.str_count = swap(header.str_count); header.str_size = swap(header.str_size); } if (header.magic != MAGIC) { close(fd); return(-1); } read(fd, TermNames, min(127, header.name_size)); TermNames[127] = '\0'; ptr->term_names = TermNames; if (header.name_size > 127) lseek(fd, (long) (header.name_size - 127), 1); read(fd, ptr->Booleans, min(BOOLCOUNT, header.bool_count)); if (header.bool_count > BOOLCOUNT) lseek(fd, (long) (header.bool_count - BOOLCOUNT), 1); else for (i=header.bool_count; i < BOOLCOUNT; i++) ptr->Booleans[i] = 0; if ((header.name_size + header.bool_count) % 2 != 0) read(fd, &ch, 1); if (must_swap()) read(fd, ptr->Numbers, min(NUMCOUNT, header.num_count * 2)); else { for (i=0; i < min(header.num_count, NUMCOUNT); i++) { read(fd, bytebuf, 2); if (bytebuf[0] == 0377 && bytebuf[1] == 0377) ptr->Numbers[i] = -1; else ptr->Numbers[i] = bytebuf[0] + 256 * bytebuf[1]; } } if (header.num_count > NUMCOUNT) lseek(fd, (long) (2 * (header.num_count - NUMCOUNT)), 1); else for (i=header.num_count; i < NUMCOUNT; i++) ptr->Numbers[i] = -1; if (cur_term) /* cur_term is non-zero only if we've been called */ { ptr->str_table = malloc(header.str_size); if (ptr->str_table == NULL) { close(fd); return (-1); } } else ptr->str_table = StringTable; num_strings = min(STRCOUNT, header.str_count); cur_string = 0; while (num_strings > 0) { numread = read(fd, offset_buf, 2*min(num_strings, OFFSET_BUFSIZE)); if (numread <= 0) { close(fd); return(-1); } if (must_swap()) { for (i = 0; i < numread / 2; i++) { ptr->Strings[i + cur_string] = (offset_buf[i].byte[0] == 0377 && offset_buf[i].byte[1] == 0377) ? 0 : ((offset_buf[i].byte[0] + 256*offset_buf[i].byte[1]) + ptr->str_table); } } else { for (i = 0; i < numread / 2; i++) { ptr->Strings[i + cur_string] = (offset_buf[i].number == -1) ? 0 : offset_buf[i].number + ptr->str_table; } } cur_string += numread / 2; num_strings -= numread / 2; } if (header.str_count > STRCOUNT) lseek(fd, (long) (2 * (header.str_count - STRCOUNT)), 1); else for (i=header.str_count; i < STRCOUNT; i++) ptr->Strings[i] = 0; numread = read(fd, ptr->str_table, header.str_size); close(fd); if (numread != header.str_size) return(-1); return(0); } X/* * int * must_swap() * * Test whether this machine will need byte-swapping * */ int must_swap() { union { short num; char byte[2]; } test; test.num = 1; return(test.byte[1]); } //go.sysin dd * echo 'x - =src/xx.ti' sed 's/^X//' <<'//go.sysin dd *' >=src/xx.ti xaa-a|foobar a, cud1=ctrlK, cub1=ctrlH, cuf1=esc[C, cuu1=esc[A, use=ansi+local, clear=esc[Hesc[J$<156>, el=esc[K$<5>, ed=esc[J, xaa-b, is1=esc[7mesc7esc[Hesc9esc8, xaa-c|foobar c, is2=\r\nesc[Aesc7esc[60;1;0;30pesc8, lines#29, use=xaa-a, xaa-d|foobar d, use=xaa-b, use=xaa-c, xaa-e|foobar e, smcup=esc[30;1Hesc[Kesc[30;1;0;30p, use=xaa-d, xaa-f, cup=esc[%i%p1%d;%p2%dH, home=esc[H, bold=esc[1m, //go.sysin dd * if test ! -d =data then echo 'Making directory "=data"' mkdir =data fi echo 'x - =data/misc' sed 's/^X//' <<'//go.sysin dd *' >=data/misc # # -------------------------------- # @(#)misc 1.8 5/20/82 # # misc: MISCELLANEOUS TERMINALS # # ---------------------------------------------------------------- # # BB&N BitGraph # The function keys kf0-kf9 are the codes generated by the keypad keys 0-9 # NOTE that this means that PF1-PF4 are not represented here at all. bg|bitg|bitgraph|BBN BitGraph, msgr, xon, cols#85, lines#64, bel=^G, cr=^M, tbc=\E[g, clear=\E[H\E[J, el=\E[K, ed=\E[J, cup=\E[%i%p1%d;%p2%dH, home=\E[H, cub=\E[%p1%dD, cub1=\E[D, cuf=\E[%p1%dC, cuf1=\E[C, cud=\E[%p1%dB, cud1=\E[B, cuu=\E[%p1%dA, cuu1=\E[A, dl=\E[%p1%dM, dl1=\E[M, il=\E[%p1%dL, il1=\E[L, # dch=\E[%p1%dP, dch1=\E[P, ich=\E[%p1%d@, ich1=\E[@, smso=\E[4m, rmso=\E[m, smul=\E[4m, rmul=\E[m, bold=\E[m, rev=\E[7m, sgr0=\E[m, sgr=\E[%?%p1%t7;%;%?%p2%t4;%;%?%p3%t7;%;%?%p4%t5;%;%?%p6%t1;%;m, is2=\E:e\E[m\E(B^O\E[1;64r\E[H\E[J\E[20l\E[?1;6l\E[?5;7;50;52h\E=, kbs=^H, kcud1=\E[B, kcub1=\E[D, kcuf1=\E[C, kcuu1=\E[A, kf0=\EOp, kf1=\EOq, kf2=\EOr, kf3=\EOs, kf4=\EOt, kf5=\EOu, kf6=\EOv, kf7=\EOw, kf8=\EOx, kf9=\EOy, sc=\E7, rc=\E8, ind=\ED, ri=\EM, nel=\EE, hts=\EH, ht=^I, # # Vanilla ANSI terminal. This is assumed to implement all the normal # ANSI stuff with no extensions. It assumes insert/delete line/char # is there, so it won't work with vt100 clones. It assumes video # attributes for bold, blink, underline, and reverse, which won't # matter much if the terminal can't do some of those. Padding is # assumed to be zero, which shouldn't hurt since xon/xoff is assumed. # This entry is based on the Ann Arbor Ambassador. ansi|generic ansi standard terminal, cr=^M, cud1=^J, ind=^J, bel=^G, il1=\E[L, am, cub1=^H, ed=\E[J, el=\E[K, clear=\E[H\E[J, cup=\E[%i%p1%d;%p2%dH, cols#80, lines#24, dch1=\E[P, dl1=\E[M, home=\E[H, ich=\E[%p1%d@, ich1=\E[@, smir=\E6, rmir=\E6, bold=\E[1m, rev=\E[7m, blink=\E[5m, invis=\E[8m, sgr0=\E[0m, sgr=\E[%?%p1%t7;%;%?%p2%t4;%;%?%p3%t7;%;%?%p4%t5;%;%?%p6%t1;%;m, kcuu1=\E[A, kcud1=\E[B, kcub1=\E[D, kcuf1=\E[C, khome=\E[H, kbs=^H, cuf1=\E[C, ht=^I, cuu1=\E[A, xon, rep=%p1%c\E[%p2%{1}%-%db, rmul=\E[m, smul=\E[4m, rmso=\E[m, smso=\E[7m, # The tab 132 uses xon/xoff, so no padding needed. # smkx/rmkx have nothing to do with arrow keys. # is2 sets 80 col mode, normal video, autowrap on (for am). # Seems to be no way to get rid of status line. tab132|tab|tab 132/15, is2=\E[?7h\E[?3l\E[?5l, smkx@, rmkx@, cr=^M, cud1=^J, ind=^J, bel=^G, lm#96, da, db, il1=\E[L, dl1=\E[M, dch1=\E[P, rmir=\E[4l, smir=\E[4h, cup=\E[%i%p1%d;%p2%dH, kcuu1=\E[A, kcud1=\E[B, kcub1=\E[D, use=vt100, tab132w, cols#132, is2=\E[?7h\E[?3h\E[?5l, use=tab132, tab132rv, is2=\E[?7h\E[?3l\E[?5h, use=tab132, tab132wrv, is2=\E[?7h\E[?3h\E[?5h, use=tab132w, # This used to say "de#001202" which presumably refers to the stty bits # that need to be set for some version of Unix. We need the real delay # requirements here. mw2|Multiwriter 2, cr=^M, cud1=^J, ind=^J, bel=^G, cols#132, hc, os, trs80|trs-80|Radio Shack TRS-80 model I, cr=^M, cud1=^J, ind=^J, bel=^G, am, cub1=^H, cols#64, lines#16, # I think the direct is supposed to be vt100 compatible, so all this # should probably be replaced by a use=vt100, but I can't test it. d800|direct|direct800|Direct 800/A, cr=^M, cud1=^J, ind=^J, bel=^G, cols#80, lines#24, am, clear=\E[1;1H\E[2J, cub1=^H, cup=\E[%i%p1%d;%p2%dH, cuf1=\E[C, cuu1=\E[A, el=\E[K, ed=\E[J, smso=\E[7m, rmso=\E[0m, smul=\E[4m, rmul=\E[0m, xhp, cvvis=\E[>12l, cnorm=\E[>12h, ind=\ED, ri=\EM, da, db, rmacs=\E[1m, smacs=\E[0m, msgr, ht=^I, kcub1=\E[D, kcuf1=\E[C, kcuu1=\E[A, kcud1=\E[B, kf1=\EOP, kf2=\EOQ, kf3=\EOR, kf4=\EOS, kf5=\EOT, kf6=\EOU, kf7=\EOV, kf8=\EOW, vc404|volker-craig 404, cr=^M, cud1=^J, ind=^J, bel=^G, am, cub1=^H, ed=^W$<40>, el=^V$<20>, clear=^X$<40>, cup=^P%p1%' '%+%c%p2%' '%+%c, cols#80, home=^Y$<40>, kcud1=^J, kcub1=^H, kcuf1=^U, kcuu1=^Z, lines#24, cuf1=^U, cuu1=^Z, vc404s|volker-craig 404 w/standout mode, cr=^M, cud1=^J, ind=^J, bel=^G, rmso=^O, smso=^N, use=vc404, vc404na|volker-craig 404 w/no arrow keys, kcuf1@, kcuu1@, use=vc404, vc404sna|volker-craig 404 w/standout mode and no arrow keys, rmso=^O, smso=^N, use=vc404na, # missing in vc303a and vc303 descriptions: they scroll 2 lines at a time # every other linefeed. vc303a|vc403a|volker-craig 303a, cr=^M, cud1=^J, bel=^G, am, cub1=^H, el=^V$<20>, clear=^X$<40>, cols#80, home=^Y$<40>, kcud1=^J, kcub1=^H, kcuf1=^U, kcuu1=^Z, lines#24, ll=^P^@W, cuf1=^U, cuu1=^Z, vc303|vc103|vc203|volker-craig 303, cr=^M, cud1=^J, bel=^G, am, cub1=^H, clear=^L$<40>, cols#80, home=^K$<40>, kcud1=^J, kcub1=^H, kcuf1=^I, kcuu1=^N, lines#24, ll=^O$<1>W, cuf1=^I, cuu1=^N, # From cbosg!ucbvax!SRC:george Fri Sep 11 22:38:32 1981 ampex|d80|dialogue|dialogue80|ampex dialogue 80, tbc=\E3, hts=\E1, cr=^M, cud1=^J, ind=^J, bel=^G, is2=\EA, smul=\El, rmul=\Em, am, cub1=^H, ht=^I, clear=\E*$<75>, cup=\E=%p1%' '%+%c%p2%' '%+%c, il1=\EE$<5*>, cbt=\EI, ich1=\EQ, dl1=\ER$<5*>, dch1=\EW, el=\Et, ed=\Ey, smso=\Ej, rmso=\Ek, lines#24, cols#80, cuf1=^L, cuu1=^K, d132|datagraphix|datagraphix 132a, cr=^M, cud1=^J, ind=^J, bel=^G, cols#80, lines#30, clear=^l, home=\Et, da, db, ind=\Ev, ri=\Ew, cuu1=\Ek, cuf1=\El, cvvis=\Ex, cnorm=\Em\En, il1=\E3, ich1=\E5, dch1=\E6, in, ich1=\E5, soroc|Soroc 120, cr=^M, cud1=^J, ind=^J, bel=^G, ed=\EY, el=\ET, clear=\E*$<2>, kcub1=^H, kcuu1=^K, kcuf1=^L, kcud1=^J, use=adm3a, # tec is2 untested, and taken from CB/Unix virtual terminal driver. # Upper case terminal, uses lower case for control sequences!!! # The driver shows the C ~ operator used on CM coordinates. tec400|tec scope, cr=^M, cud1=^J, ind=^J, bel=^G, cup=l%p2%~%c%p1%~%c, cuu1=x, cud1=h, cuf1=g, cub1=w, home=i, smso={, rmso=|, xmc#1, clear=f, il1=e, dl1=u, ich1=d, dch1=t, el=c, ed=s, # From ucbvax!geoff Mon Sep 21 21:15:45 1981 # This entry has been tested. tec500|tec 500, cr=^M, cud1=^J, ind=^J, bel=^G, am, cub1=^H, cup=\E=%p1%' '%+%c%p2%' '%+%c, clear=^Z$<20>, cols#80, home=^^, lines#24, cuf1=^L, cuu1=^K, smso=^], rmso=^\, # I would appreciate more information on this terminal, such as the # manufacturer and the model number. There are too many 'tecs' in here. tec, lines#24, cols#80, clear=^l, cuu1=^k, cuf1=\037, am, cub1=^H, home=\036, cr=^M, cud1=^J, ind=^J, bel=^G, teletec|Teletec Datascreen, cr=^M, cud1=^J, ind=^J, bel=^G, am, cub1=^H, cols#80, clear=^l, home=^^, lines#24, cuf1=^_, cuu1=^k, aed512|aed|AED 512, if=/usr/lib/tabset/aed, cr=^M, cud1=^J, bel=^G, cols#64, lines#40, clear=^L, cub1=^H, cuf1=\Ei0800\001, cnorm=\E\072004=000200??\001, flash=\EK0001??0000K0001202080\001, smso=\E\07200>8000140[80C00\001, rmso=\E[00C80\001, smul=\E\07200>8000140\001, rmul=\E\07200>8000100\001, uc=\Ei???>l0800i0102\001, smcup=\E\07200>8000140{<04<0??00001010L<0\072004=0002??00\001, rmcup=\E\07200>8000100{804<0??00001000L80\072004=000200??\001, ind=\E;1100\072004=000200??;1300\047\200\001\n\E\072004=0002??00;1200\001\n, cuu1=^K, .cup=\E;1300%p1%c%p2%c\001, digilog|333|digilog 333, cub1=^H, cols#80, el=\030, home=^n, lines#16, cuf1=^i, cuu1=^o, cr=^M, cud1=^J, ind=^J, bel=^G, ep48|ep4080|execuport 4080, am, cub1=^H, os, cols#80, hu=\036, hd=\034, cr=^M, cud1=^J, ind=^J, bel=^G, ep40|ep4000|execuport 4000, am, cub1=^H, os, cols#136, hu=\036, hd=\034, cr=^M, cud1=^J, ind=^J, bel=^G, terminet1200|terminet300|tn1200|tn300|terminet|ge terminet 1200, cols#120, hc, os, cr=^M, cud1=^J, ind=^J, bel=^G, datapoint|dp3|dp3360|datapoint 3360, cr=^M, cud1=^J, ind=^J, bel=^G, am, cub1=^H, ed=^_, el=^^, clear=^]^_, cols#82, home=^], lines#25, cuf1=^x, cuu1=^z, dg|dg6053|data general 6053, cr=^M, cud1=^J, ind=^J, bel=^G, am, cub1=^H, cup=^P%p2%c%p1%c, clear=^L, home=^H, cuf1=^S, cuu1=^W, el=^K, cols#80, lines#24, cdi|cdi1203, am, cub1=^H, hc, os, cols#80, cr=^M$<200>, cud1=^J, ind=^J, bel=^G, # ^S is an arrow key! Boy is this guy in for a surprise on v7! sol, cr=^M, cud1=^J, ind=^J, bel=^G, am, cub1=^H, cup=\E^1%p1%c\E^2%p2%c, clear=^K, home=^N, cols#64, lines#16, cuf1=^S, cuu1=^W, kcub1=^A, kcuf1=^S, kcuu1=^W, kcud1=^Z, xl83|cybernex XL-83, cr=^M, cud1=^J, ind=^J, bel=^G, am, cub1=^H, ed=^P$<62>, el=^O$<3>, clear=^L$<62>, cup=^W%p1%' '%+%c%p2%' '%+%c, cols#80, home=^K, kcud1=^J, kcub1=^H, kcuu1=^N, lines#24, cuu1=^N, cuf1=^I, omron|Omron 8025AG, cr=^M, cud1=^J, ind=^J, bel=^G, il1=\EL, am, cub1=^H, ed=\ER, cols#80, el=\EK, clear=\EJ, da, db, dch1=\EP, dl1=\EM, home=\EH, lines#24, cuf1=\EC, rmso=\E4, ind=\ES, smso=\Ef, ri=\ET, cuu1=\EA, cnorm=, cvvis=\EN, plasma|plasma panel, am, cub1=^H, clear=^L, cols#85, home=^^, lines#45, cuf1=\030, cuu1=\026, cr=^M, cud1=^J, ind=^J, bel=^G, swtp|ct82|Southwest Technical Products CT82, cr=^M, cud1=^J, ind=^J, bel=^G, am, cub1=^H, il1=^\^y, ed=^v, el=^F, clear=^L, cup=^k%p2%c%p1%c, cols#82, lines#20, dl1=^z, cuf1=^s, cuu1=^a, smso=^^^v, rmso=^^^F, dch1=^\^h, ich1=^\^x, home=^p, ind=^n, ri=^o, ll=^c, is2=^\^r^^^s^^^d^]^w^i^s^^^]^^^o^]^w^r^i, terak|Terak emulating Datamedia 1520, use=dm1520, remote|virtual remote terminal, cols#79, am@, use=virtual, virtual|CB-UNIX virtual terminal, cr=^M, cud1=^J, ind=^J, bel=^G, cols#80, lines#24, am, clear=\E\112, cub1=^H, cup=\E\107%p2%c%p1%c, cuf1=\E\103, cuu1=\E\101, el=\E\113, ed=\E\114, il1=\E\120, dl1=\E\116, ich1=\E\117, lm#0, da, db, kcub1=\E\104, kcuf1=\E\103, kcuu1=\E\101, kcud1=\E\102, khome=\E\105, smso=\E\141\004, rmso=\E\142\004, smul=\E\141\001, rmul=\E\142\001, # This is untested. The cup sequence is hairy enough that it probably # needs work. The idea is ctrl(O), dd(row), dd(col), where dd(x) # is x - 2*(x%16) + '9' delta|dd5000|delta data 5000, cud1=^J, ind=^J, bel=^G, am, cub1=^H, clear=^NR, cup=^O%p1%p1%{16}%m%{2}%*%-%'9'%+%c%p2%p2%{16}%m%{2}%*%-%'9'%+%c, cols#80, lines#27, home=^NQ, cuf1=^Y, cuu1=^Z, el=^NU, dch1=^NV, mdl110|cybernex mdl-110, cup=^P%p1%' '%+%c%p2%' '%+%c, cols#80, lines#24, am, clear=^X$<70>, cub1=^H, cr=^M, cud1=^J, ind=^J, bel=^G, cuf1=^U, cuu1=^Z, home=^Y, el=^N@^V$<145>, ed=^NA^W$<145>, il1=^NA^N^]$<65>, dl1=^NA^N^^$<40>, ich1=^NA^]$<3.5>, smdc=, rmdc=, dch1=^NA^^$<3.5>, smso=^NF, rmso=^NG, ht=\t$<43>, ed=^N@^V$<6>, zen30|z30|zentec 30, cr=^M, cud1=^J, ind=^J, bel=^G, mir, cols#80, lines#24, ul, il1=\EE$<1.5*>, cub1=^H, el=\ET$<1.0*>, cup=\E=%p1%' '%+%c%p2%' '%+%c, clear=\E*, home=^^, cuf1=^L, rmso=\EG0, smso=\EG6, cuu1=^K, smir=\Eq, rmir=\Er, am, dch1=\EW, dl1=\ER$<1.5*>, ed=\EY, # Test version for Falco ts-1. See "arpavax.hickman@ucb" for info falco|ts1|ts-1|falco ts-1, cr=^M, cud1=^J, ind=^J, bel=^G, cols#80, lines#24, ht=^I, is2=\Eu\E3, il1=\EE, am, el=\ET\EG0^H, cup=\E=%p1%' '%+%c%p2%' '%+%c, clear=\E*, ed=\EY, dch1=\EW, cub1=^H, dl1=\ER, rmir=\Er, smir=\Eq, home=^^, kf0=^A0\r, kcud1=^J, kcub1=^H, kcuf1=^L, kcuu1=^K, cuf1=^L, rmso=\Eg0, smso=\Eg1, cuu1=^K, smul=\Eg1, rmul=\Eg0, //go.sysin dd * echo 'x - =data/perkinelmer' sed 's/^X//' <<'//go.sysin dd *' >=data/perkinelmer # # -------------------------------- # @(#)perkinelmer 1.4 5/19/82 # # perkinelmer: PERKIN ELMER # bantam|pe550|perkin elmer 550, cr=^M, cud1=^J, ind=^J, bel=^G, cub1=^H, cols#80, el=\EI$<20>, clear=\EK$<20>, cup=\EX%p1%' '%+%c\EY%p2%' '%+%c, home=\EH, lines#24, ll=\EH\EA, cuf1=\EC, cuu1=\EA, ed=^N@^V$<6>, fox|perkin elmer 1100, tbc=\E3, hts=\E1, cr=^M, cud1=^J, ind=^J, bel=^G, am, cub1=^H, ed=\EJ$<5.5*>, el=\EI, clear=\EH\EJ$<132>, cols#80, home=\EH, lines#24, ll=\EH\EA, cuf1=\EC, cup=\EX%p1%' '%+%c\EY%p2%' '%+%c, cuu1=\EA, flash=^P^B^P^C, owl|perkin elmer 1200, tbc=\E3, hts=\E1, cr=^M, cud1=^J, ind=^J, bel=^G, il1=\EL$<5.5*>, am, cub1=^H, ed=\EJ$<5.5*>, el=\EI$<5.5>, clear=\EH\EJ$<132>, home=\EH, ll=\EH\EA, cup=\EX%p1%' '%+%c\EY%p2%' '%+%c, cols#80, dch1=\EO$<5.5*>, dl1=\EM$<5.5*>, ich1=\EN, ip=$<5.5*>, kbs=^h, in, lines#24, cuf1=\EC, cuu1=\EA, rmso=\E!\200, smso=\E!^H, flash=^P^B^P^C, kf1=\ERA, kf2=\ERB, kf3=\ERC, kf4=\ERD, kf5=\ERE, kf6=\ERF, kf7=\ERG, kf8=\ERH, kf9=\ERI, kf0=\ERJ, //go.sysin dd * echo 'x - =data/print' sed 's/^X//' <<'//go.sysin dd *' >=data/print # # -------------------------------- # @(#)print 1.1 print 5/19/82 # # print: PRINTERS # # Generic line printer. We assume it can backspace, since even those # line printers that can't have this hidden by UNIX lpr driver. lpr|lp|printer|print|printing|line printer, cr=^M, cud1=^J, ff=^L, bel=^G, cub1=^H, cols#132, hc, os, citoh|ci8510|8510|c.itoh 8510a, cols#80, ri=\Er, bold=\E!, smul=\EX, rmul=\EY, sgr0=\E"\EY, is2=\E(009\054017\054025\054033\054041\054049\054057\054065\054073., rep=\ER%p2%3d%p1%c, use=lpr, //go.sysin dd * echo 'x - =data/special' sed 's/^X//' <<'//go.sysin dd *' >=data/special # # -------------------------------- # @(#)special 1.5 5/19/82 # # special: SPECIALS # # Generic "terminals". These are used to label tty lines when you don't # know what kind of terminal is on it. The characteristics of an unknown # terminal are the lowest common denominator - they look about like a ti 700. arpanet|network, use=unknown, bussiplexer, use=unknown, dialup, use=unknown, ethernet|network, use=unknown, plugboard|patch|patchboard, use=unknown, dumb, am, bel=^G, cols#80, cr=^M, cud1=^J, ind=^J, unknown, gn, use=dumb, switch|intelligent switch, use=unknown, //go.sysin dd * echo 'x - =data/tektronix' sed 's/^X//' <<'//go.sysin dd *' >=data/tektronix # # -------------------------------- # @(#)tektronix 1.5 5/20/82 # # tektronix: TEKTRONIX # tek|tek4012|4012|tektronix 4012, cr=^M, cud1=^J, bel=^G, ff=^L$<1000>, is2=\E^O, cub1=^H, clear=\E^L$<1000>, cols#75, lines#35, os, tek4013|4013|tektronix 4013, rmacs=\E^N, smacs=\E^O, use=4012, tek4014|4014|tektronix 4014, is2=\E^O\E9, cols#81, lines#38, use=tek4012, tek4015|4015|tektronix 4015, rmacs=\E^N, smacs=\E^O, use=4014, tek4014-sm|4014-sm|tektronix 4014 in small font, is2=\E^O\E\072, cols#121, lines#58, use=tek4014, tek4015-sm|4015-sm|tektronix 4015 in small font, rmacs=\E^N, smacs=\E^O, use=4014-sm, tek4023|4023|tex|tektronix 4023, cr=^M, cud1=^J, ind=^J, bel=^G, smso=^_P, rmso=^_@, cup=\034%p2%' '%+%c%p1%' '%+%c, cuf1=\t, cub1=^H, clear=\E^L$<4>, cols#80, lines#24, am, vt#4, # Can't use cursor motion because it's memory relative, and because # it only works in the workspace, not the monitor. Same for home. # Likewise, standout only works in the workspace. # el was commented out since vi and rogue seem to work better simulating # it with lots of spaces! 4025|4027|4024|tek4025|tek4027|tek4024|4025cu|4027cu|tektronix 4024/4025/4027, cr=^M, ind=^F^J, cud1=^F^J, bel=^G, am, da, db, ht=^I, cub1=^H, lm#0, lines#34, cols#80, clear=^_era\r\n\n, is2=\41com 31\r\n^_sto 9 17 25 33 41 49 57 65 73\r, smkx=^_lea p4 /h/\r^_lea p8 /k/\r^_lea p6 / /\r^_lea p2 /j/\r^_lea f5 /H/\r, rmkx=^_lea p2\r^_lea p4\r^_lea p6\r^_lea p8\r^_lea f5\r, cuu1=^K, cuf1=^_rig\r, il1=^_up\r^_ili\r$<145>, dl1=^_dli\r^F, dch1=^_dch\r, smir=^_ich\r, rmir=^F^_dow\r^K, .el=^_dch 80\r, ed=^_dli 50\r, CC=^_, il=^_up\r^_ili %p1%d\r$<145>, dl1=^_dli %p1%d\r^F, cuu=^_up %p1%d\r, cud=^_dow %p1%d\r, cub=^_lef %p1%d\r, cuf=^_rig %p1%d\r, 4025-17|4027-17|tek 4025 17 line window, lines#17, use=4025, 4025-17ws|4027-17ws|tek 4025 17 line window in workspace, is2=\41com 31\r\n^_sto 9 17 25 33 41 49 57 65 73\r^_wor 17\r^_mon 17\r, smcup=^_wor h\r, rmcup=^_mon h\r, smso=^_att e\r, rmso=^_att s\r, use=4025-17, 4025ex|4027ex|tek 4025 w/!, smcup=\41com 31\r, rmcup=^_com 33\r, is2=^_com 33\r\n\41sto 9 17 25 33 41 49 57 65 73\r, use=4025, # The 4110 series may be a wonderful graphics series, but they make the 4025 # look good for screen editing. In the dialog area, you can't move the cursor # off the bottom line. Out of the dialog area, ^K moves it up, but there # is no way to scroll. Note that there is a floppy for free from Tek that # makes the 4112 emulate the vt52 (use the vt52 termcap). There is also # an expected enhancement that will use ANSI standard sequences. 4112|4113|4114|tek4112|tektronix 4110 series, cub1=^H, cr=^M, cud1=^J, bel=^G, am, clear=\ELZ, lines#34, cols#80, # 4112 in non-dialog area pretending to scroll. It really wraps but vi is # said to work (more or less) in this mode. 4112-fs, ind=^J, ri=^K, 4112-nd|4112 not in dialog area, cuu1=^K, use=4112, 4112-5|4112 in 5 line dialog area, lines#5, use=4112, //go.sysin dd * echo 'x - =data/teleray' sed 's/^X//' <<'//go.sysin dd *' >=data/teleray # # -------------------------------- # @(#)teleray 1.4 5/19/82 # # teleray: TELERAY # # Note two things called "teleray". Reorder should move the common one # to the front if you have either. A dumb teleray with the cursor stuck # on the bottom and no obvious model number is probably a 3700. t3700|teleray|dumb teleray 3700, cr=^M, cud1=^J, ind=^J, bel=^G, cub1=^H, clear=^L, cols#80, lines#24, t3800|teleray 3800 series, cr=^M, cud1=^J, ind=^J, bel=^G, cub1=^H, ed=\EJ, el=\EK, clear=^L, cup=\EY%p1%' '%+%c%p2%' '%+%c, cols#80, cud1=\n, home=\EH, lines#24, ll=\EY7 , cuf1=\EC, ht=^I, cuu1=^K, t1061|t10|teleray 1061, tbc=\EG, hts=\EF, cr=^M, cud1=^J, ind=^J, bel=^G, il1=\EL$<2*>, am, cub1=^H, ed=\EJ$<1>, el=\EK, clear=^L$<1>, cup=\EY%p1%' '%+%c%p2%' '%+%c, cols#80, dch1=\EQ, dl1=\EM$<2*>, home=\EH, ich1=\EP, ip=$<0.4*>, kf1=^Z1, kf2=^Z2, kf3=^Z3, kf4=^Z4, kf5=^Z5, kf6=^Z6, kf7=^Z7, kf8=^Z8, lines#24, cuf1=\EC, ht=^I, rmso=\ER@, smso= \ERD, km, is2=\Ee\EU01^Z1\EV\EU02^Z2\EV\EU03^Z3\EV\EU04^Z4\EV\EU05^Z5\EV\EU06^Z6\EV\EU07^Z7\EV\EU08^Z8\EV\Ef, cuu1=\EA, smul=\ERH, rmul=\ER@, xhp, xt, xmc#1, t1061f|teleray 1061 with fast PROMs, il1=\EL, ip@, dl1=\EM, use=t1061, //go.sysin dd * echo 'x - =data/teletype' sed 's/^X//' <<'//go.sysin dd *' >=data/teletype # # -------------------------------- # @(#)teletype 1.7 5/19/82 # # teletype: TELETYPE # # This works on the default blit, except that output is by exclusive or, # and insert line leaves 1/2 line at the bottom of the screen. blit|jerq, cr=^M, cud1=^J, ind=^J, bel=^G, cols#88, lines#72, ht=^I, am, ul, eo, mir, il=\Ef%p1%' '%+%c, dl=\Ee%p1%' '%+%c, dl1=\EE, rmir=\ER, smir=\EQ, dch1=\EO, cub1=\ED, da, db, il1=\EF, ed=\EJ, el=\EK, clear=^L, cup=\EY%p2%' '%+%c%p1%' '%+%c, cuf1=\EC, cuu1=\EA, kcuu1=\EA, kcud1=\EB, kcuf1=\EC, kcub1=\ED, flash=\E^G, smso=\EU!, rmso=\EV!, smul=\EU", rmul=\EV", blitlayer|layer|vitty, cr=^M, cud1=^J, ind=^J, bel=^G, cols#80, lines#24, ht=^I, am, clear=^L, cup=\EY%p2%' '%+%c%p1%' '%+%c, el=\EK, il=\EI, dl=\ED, 33|tty33|tty|model 33 teletype, cr=^M, cud1=^J, ind=^J, bel=^G, cols#72, hc, os, # The Dataspeed 40's have lots of braindamage, such as xmc (?) and printing # a visible newline indicator after each newline. The 40-1 is a half duplex # terminal and is hopeless. The 40-2 is braindamaged but has hope and is # described here. The 40-4 is a 3270 lookalike and beyond hope. # The terminal has blinking standout. It also has visible bell but I don't # know it - it's null here to prevent it from showing the BL character. # I am not sure if the 40 has xmc or not, it looked like it didn't. # Note also that the control characters have been randomly rearranged, # for example, to get escape you type control-P! 40|tty40|ds40|ds40-2|dataspeed40|teletype dataspeed 40/2, clear=\ER$<160>, ed=\EJ$<160>, il1=\EL$<160>, dl1=\EM$<160>, dch1=\EP$<50>, ich1=\E\^$<50>, cuf1=\EC, cuu1=\E7, cub1=^H, cr=\EG, ind=^J, cud1=\EB, cols#80, lines#24, flash=, smso=\E3, rmso=\E4, 43|tty43|model 43 teletype, cr=^M, cud1=^J, ind=^J, bel=^G, kbs=^h, am, cub1=^H, hc, os, cols#132, 37|tty37|model 37 teletype, cr=^M, cud1=^J, ind=^J, bel=^G, cub1=^H, hc, hu=\E8, hd=\E9, cuu1=\E7, os, # From jwb Wed Mar 31 13:25:09 1982 remote from ihuxp # This description seems to avoid line 1 - I don't know why. # It looks a lot like a vt100 with ins/del line/char. # But the insert char is not ANSI standard! 4424|tty4424|teletype 4424m, il1=\EL, da, db, ip=$<2>, ich1=\E^, dch1=\EP, dl1=\EM, cols#80, lines#23, am, clear=\E[2;H\E[J, cub1=^H, cup=\E[%i%p1%2d;%p2%2dH\E[B, cuf1=\E[C, cuu1=\E[A, mir, ri=\ET, el=\E[K, smso=\E[7m, rmso=\E[m, smul=\E[4m, rmul=\E[m, is2=\E[m\E[2;24r, kcud1=\E[B, kcub1=\E[D, kcuu1=\E[A, kcuf1=\E[C, khome=\E[H, kf1=\EOP, kf2=\EOQ, kf3=\EOR, kf4=\EOS, //go.sysin dd * echo 'x - =data/televideo' sed 's/^X//' <<'//go.sysin dd *' >=data/televideo # # -------------------------------- # @(#)televideo 1.4 5/19/82 # # televideo: TELEVIDEO # # There are some tvi's that require incredible amounts of padding and # some that don't. I'm assuming 912 and 920 are the old slow ones, # and 912b, 912c, 920b, 920c are the new ones that don't need padding. tvi912|912|920|tvi920|old televideo, tbc=\E3, hts=\E1, cr=^M, cud1=^J, ind=^J, bel=^G, il1=\EE$<33*>, am, cub1=^H, el=\ET, cup=\E=%p1%' '%+%c%p2%' '%+%c, clear=^Z, cols#80, dch1=\EW, dl1=\ER$<33*>, kbs=^h, kcuu1=^K, kcud1=^J, kcub1=^H, kcuf1=^L, kf0=^A@\r, kf1=^AA\r, kf2=^AB\r, kf3=^AC\r, kf4=^AD\r, kf5=^AE\r, kf6=^AF\r, kf7=^AG\r, kf8=^AH\r, kf9=^AI\r, home=^^, ich1=\EQ, lines#24, cuf1=^L, ht=^I, rmso=\Ek, smso=\Ej, cuu1=^K, smul=\El, rmul=\Em, xmc#1, # the 912 has a <funct> key that's like shift: <funct>8 xmits "^A8\r". # The 920 has this plus real function keys that xmit different things. # Terminfo makes you use the funct key on the 912 but the real keys on the 920. 912b|912c|tvi912b|tvi912c|tvi|new televideo 912, il1=\EE$<5*>, dl1=\ER$<5*>, use=tvi912, 920b|920c|tvi920b|tvi920c|new televideo 920, kf0=^A@\r, kf1=^AA\r, kf2=^AB\r, kf3=^AC\r, kf4=^AD\r, kf5=^AE\r, kf6=^AF\r, kf7=^AG\r, kf8=^AH\r, kf9=^AI\r, use=tvi912b, # Two page TVI 912/920. # set to page 1 when entering ex (\E-17 ) # reset to page 0 when exiting ex (\E-07 ) tvi912-2p|tvi920-2p|912-2p|920-2p|tvi-2p|televideo w/2 pages, smcup=\E-17 , rmcup=\E-07 , use=tvi912, tvi950-ap|tvi 950 w/alt pages, is2=\E\\1, smcup=\E-06 , rmcup=\E-16 , use=tvi950, tvi950-b|bare tvi950 no is2, is2@, smkx=\El, rmkx=\Ek, use=tvi950, tvi950-ns|tvi950 w/no standout, smso@, rmso@, smul@, rmul@, use=tvi950, # The following tvi descriptions from B:pjphar # Now that we have is1, is2, and is3, these should be factored. # # is2 for all 950's. It sets the following attributes: # full duplex (\EDF) write protect off (\E() # conversation mode (\EC) graphics mode off (\E%) # white on black (\Ed) auto page flip off (\Ew) # turn off status line (\Eg) clear status line (\Ef\r) # normal video (\E0) monitor mode off (\EX or \Eu) # edit mode (\Er) load blank char to space (\Ee\040) # line edit mode (\EO) enable buffer control (^O) # protect mode off (\E\047) local edit keys (\Ek) # program unshifted send key to send line all (\E016) # program shifted send key to send line unprotected (\E004) # set the following to nulls: # field delimiter (\Ex0\0\0) # line delimiter (\Ex1\0\0) # start-protected field delimiter (\Ex2\0\0) # end-protected field delimiter (\Ex3\0\0) # set end of text delimiter to carriage return/null (\Ex4\r\0) # # tvi950 sets duplex (send) edit keys (\El) when entering vi # sets local (no send) edit keys (\Ek) when exiting vi # tvi950|950|televideo950, tbc=\E3, hts=\E1, cr=^M, cud1=^J, ind=^J, bel=^G, is2=\EDF\EC\Ed\EG0\Eg\Er\EO\E\047\E(\E%\Ew\EX\Ee ^O \Ek\E016\E004\Ex0\0\0\Ex1\0\0\Ex2\0\0 \Ex3\0\0\Ex4\r\0\Ef\r\El, il1=\EE, am, cub1=^H, cbt=\EI, ed=\Ey, el=\Et, clear=\E*, cup=\E=%p1%' '%+%c%p2%' '%+%c, cols#80, dch1=\EW, dl1=\ER, cud1=^V, rmir=\Er, home=^^, smir=\Eq, kf0=^A0\r, kf1=^A@\r, kf2=^AA\r, kf3=^AB\r, kf4=^AC\r, kf5=^AD\r, kf6=^AE\r, kf7=^AF\r, kf8=^AG\r, kf9=^AH\r, kbs=^H, kcud1=^V, khome=^^, kcub1=^H, kcuf1=^L, kcuu1=^K, lines#24, mir, msgr, cuf1=^L, ht=^I, rmso=\EG0, xmc#1, smso=\EG4, ri=\Ej, rmul=\EG0, cuu1=^K, smul=\EG8, flash=\Eb$<20>\Ed, cnorm=\Ek, cvvis=\El, xenl, hs, tsl=\Eg\Ef, fsl=\r, # # is2 for 950 with two pages adds the following: # set 48 line page (\E\\2) # place cursor at page 0, line 24, column 1 (\E-07 ) # # two page 950 adds the following: # when entering ex, set 24 line page (\E\\1) # when exiting ex, reset 48 line page (\E\\2) # place cursor at 0,24,1 (\E-07 ) # tvi950-2p|950-2p|televideo950 w/2 pages, is2=\EDF\EC\Ed\EG0\Eg\Er\EO\E\047\E(\E%\Ew\EX\Ee ^O \Ek\E016\E004\Ex0\0\0\Ex1\0\0\Ex2\0\0 \Ex3\0\0\Ex4\r\0\E\\2\E-07 rmcup=\E\\2\E-07 , smcup=\E\\1\E-07 , use=tvi950, # # is2 for 950 with four pages adds the following: # set 96 line page (\E\\3) # place cursor at page 0, line 24, column 1 (\E-07 ) # # four page 950 adds the following: # when entering ex, set 24 line page (\E\\1) # when exiting ex, reset 96 line page (\E\\3) # place cursor at 0,24,1 (\E-07 ) # tvi950-4p|950-4p|televideo950 w/4 pages, is2=\EDF\EC\Ed\EG0\Eg\Er\EO\E\047\E(\E%\Ew\EX\Ee ^O \Ek\E016\E004\Ex0\0\0\Ex1\0\0\Ex2\0\0 \Ex3\0\0\Ex4\r\0\E\\3\E-07 rmcup=\E\\3\E-07 , smcup=\E\\1\E-07 , use=tvi950, # # is2 for reverse video 950 changes the following: # set reverse video (\Ed) # # set flash accordingly (\Eb ...nulls... \Ed) # tvi950-rv|950-rv|televideo950 rev video, tbc=\E3, hts=\E1, is2=\EDF\EC\Eb\EG0\Eg\Er\EO\E\047\E(\E%\Ew\EX\Ee ^O \Ek\E016\E004\Ex0\0\0\Ex1\0\0\Ex2\0\0 \Ex3\0\0\Ex4\r\0, flash=\Ed$<20>\Eb, use=tvi950, # # uses the appropriate entries from 9502p and 950rv # tvi950-rv2p|950-rv2p|televideo950 rev video w/2 pages, is2=\EDF\EC\Eb\EG0\Eg\Er\EO\E\047\E(\E%\Ew\EX\Ee ^O \Ek\E016\E004\Ex0\0\0\Ex1\0\0\Ex2\0\0 \Ex3\0\0\Ex4\r\0\E\\2\E-07 rmcup=\E\\2\E-07 , smcup=\E\\1\E-07 , use=tvi950rv, # # uses the appropriate entries from 9504p and 950rv # tvi950-rv4p|950-rv4p|televideo950 rev video w/4 pages, is2=\EDF\EC\Eb\EG0\Er\EO\E\047\E(\E%\Ew\EX\Ee ^O \Ek\E016\E004\Ex0\0\0\Ex1\0\0\Ex2\0\0 \Ex3\0\0\Ex4\r\0\E\\3\E-07 rmcup=\E\\3\E-07 , smcup=\E\\1\E-07 , use=tvi950rv, //go.sysin dd * echo 'x - =data/ti' sed 's/^X//' <<'//go.sysin dd *' >=data/ti # # -------------------------------- # @(#)ti 1.4 5/20/82 # # ti: TEXAS INSTRUMENTS # ti700|ti733|735|ti735|ti silent 700, cr=^M$<162>, use=ti745, ti|ti745|745|743|ti silent 745, cr=^M, cud1=^J, ind=^J, bel=^G, cub1=^H, cols#80, hc, os, ti800|ti omni 800, cols#132, use=ti745, //go.sysin dd * echo 'x - =data/trailer' sed 's/^X//' <<'//go.sysin dd *' >=data/trailer # # ------------------------ # # The following have been included for upward compatibility with previous # names. They are considered obsolete and the new name (which typically # contains an extra dash) should be used instead. These names will go # away eventually (read: "soon") so you should start converting! # aaa20, use=aaa-20, aaa20rev, use=aaa-20-rv, aaa30, use=aaa-30, aaa30rev, use=aaa-30-rv, aaa40, use=aaa-40, aaa40rev, use=aaa-40-rv, aaa48, use=aaa-48, aaa48rev, use=aaa-48-rv, aaarev, use=aaa-48-rv, aaa60, use=aaa-60, aaa60rev, use=aaa-60-rv, vt100-np, use=vt100, aaa-29-np, use=aaa-29, hp2621nl|2621nl, use=2621-nl, hp2621nt|2621nt, use=2621-nt, hp2621wl|2621wl, use=2621-wl, 9122p, use=912-2p, 9202p, use=920-2p, 9502p, use=950-2p, 9504p, use=950-4p, 950rv, use=950-rv, 950rv2p, use=950-rv2p, 950rv4p, use=950-rv4p, aaadb, use=aaa-db, c1004p, use=c100-4p, c100rv, use=c100-rv, c100rv4p, use=c100-rv4p, c100rv4pna, use=c100-rv4pna, c100rv4ppp, use=c100-rv4ppp, c100rvna, use=c100-rvna, c100rvpp, use=c100-rvpp, c100rvs, use=c100-rvs, c100s, use=c100-s, c108-4, use=c108-4p, c108-8, use=c108-8p, c100-s|concept-s|concept100-s, use=c100, c100-rvs|concept-rvs|concept100-rvs, use=c100-rv, h19a|h19A, use=h19-a, h19b, use=h19-b, h19bs, use=h19-bs, h19u, use=h19-u, mime2as, use=mime2a-s, mime2av, use=mime2a-v, mimefb, use=mime-fb, mimehb, use=mime-hb, tvi2p, use=tvi-2p, tvi9122p, use=tvi912-2p, tvi9202p, use=tvi920-2p, tvi9502p, use=tvi950-2p, tvi9504p, use=tvi950-4p, tvi950b, use=tvi950-b, tvi950ns, use=tvi950-ns, tvi950rv, use=tvi950-rv, tvi950rv2p, use=tvi950-rv2p, tvi950rv4p, use=tvi950-rv4p, vt100am, use=vt100-am, vt100nam, use=vt100-nam, vt100s, use=vt100-s, vt100w, use=vt100-w, # # END OF TERMINFO # ------------------------ //go.sysin dd * echo 'x - =data/visual' sed 's/^X//' <<'//go.sysin dd *' >=data/visual # # -------------------------------- # @(#)visual 1.4 5/20/82 # # visual: VISUAL # # The Visual 200 beeps when you type a character in insert mode. # This is a horribly obnoxious misfeature, and some of the entries # below try to get around the problem by ignoring the feature or # turning it off when inputting a character. They are said not to # work well at 300 baud. (You could always cut the wire to the bell!) vi200|visual 200 with function keys, cr=^M, cud1=^J, ind=^J, bel=^G, lines#24, cols#80, il1=\EL, am, cub1=^H, ed=\Ey, el=\Ex$<4*>, clear=\Ev, cup=\EY%p1%' '%+%c%p2%' '%+%c, dch1=\EO$<4*>, dl1=\EM$<4*>, home=\EH, ich1=\Ei \b\Ej, is2=\E3\Eb\Ej\E\\\El\EG\Ed\Ek, kf0=\EP, kf1=\EQ, kf2=\ER, kf3=\E , kf4=\E!, kf5=\E", kf6=\E#, kf7=\E$, kf8=\E%, kf9=\E&, kcub1=\ED, kcuf1=\EC, kcuu1=\EA, kcud1=\EB, khome=\EH, cuf1=\EC, ht=^I, ri=\EI, cuu1=\EA, cvvis=\Ed, cnorm=\Ec, vi200-rv-ic|visual 200 reverse video using insert char, rmir=\Ej, smir=\Ei, ich1@, use=vi200-rv, # The older Visuals didn't come with function keys. This entry uses # smkx and rmkx so that the keypad keys can be used as function keys. # If your version of vi doesn't support function keys you may want # to use vi200-f. vi200-f|visual|visual 200 no function keys, cr=^M, cud1=^J, ind=^J, bel=^G, cols#80, lines#24, il1=\EL, am, cub1=^H, ed=\Ey, el=\Ex$<4*>, clear=\Ev, cup=\EY%p1%' '%+%c%p2%' '%+%c, dch1=\EO$<4*>, dl1=\EM$<4*>, home=\EH, ich1=\Ei \b\Ej, is2=\E3\Eb\Ej\E\\\El\EG\Ed\Ek, smkx=\E=, rmkx=\E>, kf0=\E?p, kf1=\E?q, kf2=\E?r, kf3=\E?s, kf4=\E?t, kf5=\E?u, kf6=\E?v, kf7=\E?w, kf8=\E?x, kf9=\E?y, kcub1=\ED, kcuf1=\EC, kcuu1=\EA, kcud1=\EB, khome=\EH, cuf1=\EC, ht=^I, ri=\EI, cuu1=\EA, cvvis=\Ed, cnorm=\Ec, vi200-rv|visual 200 reverse video, smso=\E4, rmso=\E3, ri@, cvvis@, cnorm@, use=vi200, vi200-ic|visual 200 using insert char, rmir=\Ej, smir=\Ei, ich1@, use=vi200, //go.sysin dd * exit
sources@genrad.UUCP (12/21/84)
This is part of a distribution of a public domain version of terminfo/curses It is a rather large distribution, so I have broken it up into 11 modules (each less than 64K long.) Each shar format module should end with the line "exit". This code is completely public domain, originally written by Pavel Curtis of Cornell University. This version has some small improvements and bug fixes. This unit contains: the last of the terminal data files Part 11 will be a demo program that uses the new curses ----------------- cut here ---------------- : Run this shell script with "sh" not "csh" PATH=:/bin:/usr/bin:/usr/ucb export PATH if test ! -d =data then echo 'Making directory "=data"' mkdir =data fi echo 'x - =data/Makefile' sed 's/^X//' <<'//go.sysin dd *' >=data/Makefile PARTS= header adds annarbor beehive cdc concept datamedia dec diablo general \ hazeltine heath homebrew hp ibm lsi microterm misc perkinelmer \ print special tektronix teleray teletype televideo ti visual trailer compiled: source time compile source source: ${PARTS} cat ${PARTS} > source -rm -f /etc/terminfo ln source /etc/terminfo clean: rm -r ? source changes: vi ${PARTS} //go.sysin dd * echo 'x - =data/adds' sed 's/^X//' <<'//go.sysin dd *' >=data/adds # # -------------------------------- # @(#)adds 1.3 3/22/82 # # adds: ADDS # # Regent: lowest common denominator, works on all regents. regent|adds regent series, cr=^M, cud1=^J, ind=^J, bel=^G, am, cub1=^H, clear=^L, cup=^K%p1%' '%+%c^P%p1%{10}%/%{16}%*%p1%{10}%m%+%c, cols#80, home=^A, lines#24, ll=^A^Z, cuf1=^F, cuu1=^Z, # Regent 100 has a bug where if computer sends escape when user is holding # down shift key it gets confused, so we avoid escape. regent100|adds regent 100, cup=^K%p1%' '%+%c^P%p1%{10}%/%{16}%*%p1%{10}%m%+%c, kf1=^B1\r, kf2=^B2\r, kf3=^B3\r, kf4=^B4\r, kf5=^B5\r, kf6=^B6\r, kf7=^B7\r, kf8=^B8\r, khome=^A, kcub1=^U, kcuf1=^F, kcuu1=^Z, kcud1=^J, use=regent, # Regent 20, untested regent20|adds regent 20, ed=\Ek, el=\EK, cup=\EY%p1%' '%+%c%p2%' '%+%c, use=regent, regent25|adds regent 25, kf0=^B0\r, kf1=^B1\r, kf2=^B2\r, kf3=^B3\r, kf4=^B4\r, kf5=^B5\r, kf6=^B6\r, kf7=^B7\r, kf8=^B8\r, kf9=^B9\r, khome=^A, kcub1=^U, kcuf1=^F, kcuu1=^Z, kcud1=^J, use=regent20, # Regent 40: untested regent40|adds regent 40, il1=\EM, dl1=\El, is2=\EB, rmso=\E0@, smso=\E0P, rmul=\E0@, smul=\E0`, flash=\ED\Ed, use=regent25, # If you have standout problem with regent 200, try smso=\ER\EOP,rmso=\E0@\EV, regent60|regent200|adds Regent 60, dch1=\EE, rmir=\EF, smir=\EF, is2=\EV\EB, use=regent40, regent60na|regent 60 w/no arrow keys, kcub1@, kcuf1@, kcuu1@, kcud1@, use=regent60, # Note: if return acts weird on a980, check internal switch #2 # on the top chip on the CONTROL pad board. a980|adds consul 980, cr=^M, cud1=^J, ind=^J, bel=^G, il1=\E^N$<13>, am, cub1=^H, clear=^L$<1>^K@, cup=^K%p1%'@'%+%c\E^E%p1%2d, cols#80, dl1=\E^O$<13>, kf0=\E0, kf1=\E1, kf2=\E2, kf3=\E3, kf4=\E4, kf5=\E5, kf6=\E6, kf7=\E7, kf8=\E8, kf9=\E9, lines#24, cuf1=\E^E01, smso=^Y^^^N, rmso=^O, cuu1=$<9>, # From Onyx:edward Thu Jul 9 09:27:33 1981 viewpoint|addsviewpoint|adds viewpoint, cr=^M, cud1=^J, ind=^J, bel=^G, am, cub1=^H, lines#24, cols#80, cup=\EY%p1%' '%+%c%p2%' '%+%c, ed=\Ek, el=\EK, cuf1=^F, cuu1=^Z, clear=^L, ll=^A, kcub1=^U, kcuf1=^F, kcud1=^J, kcuu1=^Z, khome=^A, smso=^N, rmso=^O, smul=^N, rmul=^O, is2=^O\E0`, cvvis=^O\E0P, cnorm=^O\E0`, //go.sysin dd * echo 'x - =data/annarbor' sed 's/^X//' <<'//go.sysin dd *' >=data/annarbor # # -------------------------------- # @(#)annarbor 1.8 5/19/82 # # annarbor: ANN ARBOR # aa|annarbor|4080|ann arbor 4080, cr=^M, cud1=^J, ind=^J, bel=^G, tbc=^\^P^P, hts=^]^P1, cup=^O%p2%{10}%/%{16}%*%p2%{10}%m%+%c%p1%?%p1%{19}%>%t%{12}%+%;%'@'%+%c, cols#80, lines#40, cub1=^H, clear=^L$<2>, cuu1=^N, cuf1=^_, home=^K, am, kbs=^^, kcud1=^J, kcuu1=^N, kcub1=^H, kcuf1=^_, khome=^K, # From cbosg!chico!randvax!day Aug 1981 # alias aaa 'setenv TERM aaa-\!^; tset -e^H -Q; alias clr echo "^[\[2J^[\[H"' # Be sure to change ^[ to escape in above alias. Needs function keys added. # The ann arbor ambassador entries are merged from Mike O'Brien@Rand # and Howard Katseff at Bell Labs, and are not thoroughly tested. # Highly modified 6/22 by Mike O'Brien. # split out into several for the various screen sizes by dave-yost@rand # Many changes by Mark Horton 3/82 aaa-unk|ann arbor ambassador (internal - don't use this directly), am, km, mir, xon, cols#80, it#8, cr=^M, ht=^I, cbt=\E[Z, bel=^G, ind=^J, ri=\EM, cuu1=\E[A, cuf1=\E[C, cud1=^J, cub1=^H, cuu=\E[%p1%dA, cuf=\E[%p1%dC, cud=\E[%p1%dB, cub=\E[%p1%dD, ed=\E[J, el=\E[K$<5>, clear=\E[H\E[J$<156>, home=\E[H, cup=\E[%i%p1%d;%p2%dH, hpa=\E[%p1%{1}%+%d`, vpa=\E[%p1%{1}%+%dd, dl=\E[%p1%dM, dl1=\E[M, il=\E[%p1%dL$<3*>, il1=\E[L$<3>, dch=\E[%p1%dP, dch1=\E[P, .ich=\E[%p1%d@$<4*>, .ich1=\E[@$<4>, smir=\E[>4h, rmir=\E[>4l, smul=\E[4m, rmul=\E[m, smso=\E[1m, rmso=\E[m, bold=\E[1m, rev=\E[7m, blink=\E[5m, invis=\E[8m, sgr0=\E[0m, sgr=\E[%?%p1%t1;%;%?%p2%t4;%;%?%p3%t7;%;%?%p4%t5;%;%?%p6%t1;%;%?%p7%t8;%;m, kcuu1=\E[A, kcud1=\E[B, kcub1=\E[D, kcuf1=\E[C, khome=\E[H, kbs=^H, kich1=\E[@, krmir=\E6, kil1=\E[L, kclr=\E[J, kdch1=\E[P, kdl1=\E[M, kf1=\EOA, kf2=\EOB, kf3=\EOC, kf4=\EOD, kf5=\EOE, kf6=\EOF, kf7=\EOG, kf8=\EOH, kf9=\EOI, kf10=\EOJ, rep=%p1%c\E[%p2%{1}%-%db, sc=\E7, rc=\E8, flash=\E7\E[H\E[4m\E9$<20>\E[m\E9\E8, is1=\E[m\E7\E[H\E9\E8, is3=\E[1Q\E[>20;30l, smm=\E[>52h, rmm=\E[>52l, .mc0=\E[0i, .mc5=\E[v, .mc4=^C, aaa-unk-stat|Ann Arbor Ambassadors with status lines, tsl=\E[>51h\E[1;%p1%dH\E[2K, fsl=\E[>51l, hs, eslok, .dsl=\E7\E[60;0;0;30p\E[60;1H\E[K\E[H\E8, aaa-unk-rv|Ann Arbor Ambassadors in reverse-video mode, bold=\E[1;7m, rev=\E[m, blink=\E[5;7m, invis=\E[7;8m, sgr0=\E[7m, rmul=\E[7m, smul=\E[4;7m, rmso=\E[7m, smso=\E[m, rs1=\E[H\E[7m\E[J, sgr=\E[%?%p1%!%t7;%;%?%p2%t4;%;%?%p3%t7;%;%?%p4%t5;%;%?%p6%t1;%;%?%p7%t8;%;m, flash=\E7\E[H\E[7;4m\E9$<20>\E[7m\E9\E8, is1=\E[7m\E7\E[H\E9\E8, aaa-18|ann arbor ambassador/18 lines, smcup=\E[18;0;0;18p, rmcup=\E[60;0;0;18p\E[60;1H\E[K, is2=\E7\E[60;0;0;18p\E8, lines#18, use=aaa-unk, aaa-18-rv|ann arbor ambassador/18 lines+reverse video, use=aaa-unk-rv, use=aaa-18, aaa-20|ann arbor ambassador/20 lines, smcup=\E[20;0;0;20p, rmcup=\E[60;0;0;20p\E[60;1H\E[K, is2=\E7\E[60;0;0;20p\E8, lines#20, use=aaa-unk, aaa-20-rv|ann arbor ambassador/20 lines+reverse video, use=aaa-unk-rv, use=aaa-20, aaa-22|ann arbor ambassador/22 lines, smcup=\E[22;0;0;22p, rmcup=\E[60;0;0;22p\E[60;1H\E[K, is2=\E7\E[60;0;0;22p\E8, lines#22, use=aaa-unk, aaa-22-rv|ann arbor ambassador/22 lines+reverse video, use=aaa-unk-rv, use=aaa-22, aaa-24|ann arbor ambassador/24 lines, smcup=\E[24;0;0;24p, rmcup=\E[60;0;0;24p\E[60;1H\E[K, is2=\E7\E[60;0;0;24p\E8, lines#24, use=aaa-unk, aaa-24-rv|ann arbor ambassador/24 lines+reverse video, use=aaa-unk-rv, use=aaa-24, aaa-26|ann arbor ambassador/26 lines, smcup=\E[26;0;0;26p, rmcup=\E[60;0;0;26p\E[60;1H\E[K, is2=\E7\E[60;0;0;26p\E8, lines#26, use=aaa-unk, aaa-26-rv|ann arbor ambassador/26 lines+reverse video, use=aaa-unk-rv, use=aaa-26, aaa-28|ann arbor ambassador/28 lines, smcup=\E[28;0;0;28p, rmcup=\E[60;0;0;28p\E[60;1H\E[K, is2=\E7\E[60;0;0;28p\E8, lines#28, use=aaa-unk, aaa-28-rv|ann arbor ambassador/28 lines+reverse video, use=aaa-unk-rv, use=aaa-28, aaa-29|ann arbor ambassador/29 lines plus status line, smcup=\E[30;1;0;30p, rmcup=\E[60;1;0;30p\E[60;1H\E[K, is2=\E7\E[H\E[K\E[60;1;0;30p\E8\E[>51h\E[H\E[>51l, lines#29, use=aaa-unk-stat, use=aaa-unk, aaa-29-rv|ann arbor ambassador/29 lines+status line+reverse video, use=aaa-unk-rv, use=aaa-29, aaa-30|ambassador|ann arbor ambassador/30 lines, smcup=\E[30;0;0;30p, rmcup=\E[60;0;0;30p\E[60;1H\E[K, is2=\E7\E[60;0;0;30p\E8, lines#30, use=aaa-unk, aaa-30-rv|ann arbor ambassador/30 lines in reverse video, use=aaa-unk-rv, use=aaa-30, aaa-36|ann arbor ambassador/36 lines, smcup=\E[36;0;0;36p, rmcup=\E[60;0;0;36p\E[60;1H\E[K, is2=\E7\E[60;0;0;36p\E8, lines#36, use=aaa-unk, aaa-36-rv|ann arbor ambassador/36 lines+reverse video, use=aaa-unk-rv, use=aaa-36, aaa-40|ann arbor ambassador/40 lines, smcup=\E[40;0;0;40p, rmcup=\E[60;0;0;40p\E[60;1H\E[K, is2=\E7\E[60;0;0;40p\E8, lines#40, use=aaa-unk, aaa-40-rv|ann arbor ambassador/40 lines+reverse video, use=aaa-unk-rv, use=aaa-40, aaa-47|ann arbor ambassador/48 lines+status line, smcup=\E[48;1;0;48p, rmcup=\E[60;1;0;48p\E[60;1H\E[K, is2=\E7\E[H\E[K\E[60;1;0;48p\E8\E[>51h\E[H\E[>51l, lines#47, use=aaa-unk-stat, use=aaa-unk, aaa-47-rv|ann arbor ambassador/48 lines+status line+reverse video, use=aaa-unk-rv, use=aaa-47, aaa|ambas|aaa-48|ann arbor ambassador/48 lines, smcup=\E[48;0;0;48p, rmcup=\E[60;0;0;48p\E[60;1H\E[K, is2=\E7\E[60;0;0;48p\E8, lines#48, use=aaa-unk, aaa-rv|aaa-48-rv|ann arbor ambassador/48 lines+reverse video, use=aaa-unk-rv, use=aaa-48, aaa-59|ann arbor ambassador/59 lines plus status line, is2=\E7\E[H\E[K\E[60;1;0;60p\E8\E[>51h\E[H\E[>51l, lines#59, use=aaa-unk-stat, use=aaa-unk, aaa-59-rv|ann arbor ambassador/59 lines+status line+reverse video, use=aaa-unk-rv, use=aaa-59, aaa-60|ann arbor ambassador/60 lines, is2=\E7\E[60;0;0;60p\E[1Q\E[m\E[>20;30l\E8, lines#60, use=aaa-unk, aaa-60-rv|ann arbor ambassador/60 lines+reverse video, use=aaa-unk-rv, use=aaa-60, aaa-db|aaa-30-db|ann arbor ambassador 30 lines/destructive backspace, cub1=\E[D, is3=\E[1Q\E[m\E[>20l\E[>30h, use=aaa-30, //go.sysin dd * echo 'x - =data/beehive' sed 's/^X//' <<'//go.sysin dd *' >=data/beehive # # -------------------------------- # @(#)beehive 1.5 5/20/82 # # beehive: BEEHIVE # # Reports are that most of these Beehive entries (except superbee) have not been # tested and do not work right. rmso is a trouble spot. Be warned. # set tab is ^F, clear (one) tab is ^V, no way to clear all tabs. # Superbee - f1=escape, f2=^C. # Note: there are at least 3 kinds of superbees in the world. The sb1 # holds onto escapes and botches ^C's. The sb2 is the best of the 3. # The sb3 puts garbage on the bottom of the screen when you scroll with # the switch in the back set to CRLF instead of AEP. This description # is tested on the sb2 but should work on all with either switch setting. # The f1/f2 business is for the sb1 and the xsb can be taken out for # the other two if you want to try to hit that tiny escape key. # This description is tricky: being able to use cup depends on there being # 2048 bytes of memory and the hairy ind string. # Now that we have separate ind and cud1, I imagine this could be improved. sb1|superbee|superb|beehive super bee, tbc=\E3, hts=\E1, is2=\EE, cud1=^J, cr=^M$<10>, ind=\n$<3>\n$<3>\EA\EK$<3>\ET\ET, bel=^G, am, cub1=^H, ed=\EJ$<3>, el=\EK$<3>, clear=\EH\EJ$<3>, cols#80, cup=\EF%p2%3d%p1%3d, cr=\r$<1000>, lm#25, da, db, xsb, dch1=\EP$<3>, dl1=\EM$<100>, smso=\E_1, rmso=\E_0, lines#25, cuf1=\EC, ht=^I, cuu1=\EA, home=\EH, cnorm=\n, kf1=\Ep, kf2=\Eq, kf3=\Er, kf4=\Es, kf5=\Et, kf6=\Eu, kf7=\Ev, kf8=\Ew, kcud1=\EB, khome=\EH, kcub1=\ED, kcuf1=\EC, kcuu1=\EA, # This loses on lines > 80 chars long, use at your own risk superbeeic|super bee with insert char, ich1=, smir=\EQ, rmir=\ER, use=superbee, sb2|sb3|fixed superbee, xsb@, use=superbee, # good grief - does this entry make xmc when it doesn't have to? # look at those spaces in rmso/smso. Seems strange to me. # However, not having one to test changes on, I'll just leave it be... bh3m|beehiveIIIm, if=/usr/lib/tabset/beehive, cr=^M, cud1=^J, ind=^J, bel=^G, il1=^S$<160>, am, cub1=^H, ed=^R, el=^P, clear=^E^R, cols#80, dl1=^Q$<350>, home=^E, lines#20, ll=^E^K, cuf1=^L, ht=^I, rmso= ^_, smso=^] , cuu1=^K, microb|microbee|micro bee series, cr=^M, cud1=^J, ind=^J, bel=^G, am, cub1=^H, ed=\EJ, el=\EK, clear=\EE, cols#80, cup=\EF%p1%' '%+%c%p2%' '%+%c, kf1=\Ep, kf2=\Eq, kf3=\Er, kf4=\Es, kf5=\Et, kf6=\Eu, kf7=\Ev, kf8=\Ew, kf9=\Ex, kcud1=\EB, khome=\EH, kcub1=\ED, kcuf1=\EC, kcuu1=\EA, lines#24, cuf1=\EC, ht=^I, cuu1=\EA, rmso=\Ed@ , smso= \EdP, rmul=\Ed@, smul=\Ed`, //go.sysin dd * echo 'x - =data/cdc' sed 's/^X//' <<'//go.sysin dd *' >=data/cdc # # -------------------------------- # @(#)cdc 1.3 3/22/82 # # cdc: CONTROL DATA # cdc456|cdc, cr=^M, cud1=^J, ind=^J, bel=^G, lines#24, cols#80, clear=^Y^X, cuf1=^L, cuu1=^Z, cub1=^H, cup=\E1%p1%' '%+%c%p2%' '%+%c, home=^Y, il1=\E\114, dl1=\E\112, el=^V, ed=^X, am, cdc456tst, cr=^M, cud1=^J, ind=^J, bel=^G, lines#24, cols#80, clear=^y^x, cub1=^H, cup=\E1%p1%' '%+%c%p2%' '%+%c, am, //go.sysin dd * echo 'x - =data/concept' sed 's/^X//' <<'//go.sysin dd *' >=data/concept # # -------------------------------- # @(#)concept 1.6 5/20/82 # # concept: (HUMAN DESIGNED SYSTEMS) # # From vax135!hpk Sat Jun 27 07:41:20 1981 # Extensive changes to c108 by arpavax:eric Feb 1982 # # There seem to be a number of different versions of the C108 PROMS # (with bug fixes in its Z-80 program). # The first one that we had would lock out the keyboard of you # sent lots of short lines (like /usr/dict/words) at 9600 baud. # Try that on your C108 and see if it sends a ^S when you type it. # If so, you have an old version of the PROMs. # The old one also messed up running in with a 132-character line-length. # You should configure the C108 to send ^S/^Q before running this. # It is much faster (at 9600 baud) than the c100 because the delays # are not fixed. # Old cursor addressing that didn't understand > 95: # cup=\Ea%p1%' '%+%c%p2%' '%+%c, c108|c108-8p|concept108-8p|concept 108 w/8 pages, rmcup=\Ev ^B p\Ep\r\n, use=c108-4p, c108-4p|concept108-4p|concept 108 w/4 pages, cr=^M, cud1=^J, ind=^J, bel=^G, is2=\EU\E F\Ef\E7\E5\E8\El\ENH\EK\E\200\Eo&\200\Eo\47\E\E!, smcup=\EU\Ev 8p\Ep\r, rmcup=\Ev ^A p\Ep\r\n, il1=\E^R, cub1=^H, ed=\E^C, el=\E^S, clear=\E?\E^E, cols#80, cup=\Ea%p1%?%p1%{95}%>%t^A%c%{96}%-%;%' '%+%c%p2%?%p2%{95}%>%t^A%c%{96}%-%;%' '%+%c, dch1=\E^A, dl1=\E^B, rmir=\E\200, eo, smir=\E^P, lines#24, mir, cuf1=\E=, kbs=^h, ul, cuu1=\E;, db, smul=\EG, rmul=\Eg, cvvis=\EW, cnorm=\Ew, in, am, xenl, flash=\Ek$<50>\EK, smkx=\EX, rmkx=\Ex, kcuu1=\E;, kcud1=\E<, kcub1=\E>, kcuf1=\E=, khome=\E?, kf1=\E5, kf2=\E6, kf3=\E7, kf4=\E8, kf5=\E9, kf6=\E:, smso=\ED, rmso=\Ed, dim=\EE, bold=\ED, rev=\ED, sgr0=\Ee\Ed\Eg\Ec, c108-rv-8p|concept 108 w/8 pages in reverse video, smcup=\EU\Ev 8p\Ep\r, rmcup=\Ev ^B p\Ep\r\n, use=c108-rv-4p, c108-rv-4p|concept 108 w/4 pages in reverse video, flash=\EK\200\200\200\200\200\200\200\200\200\200\200\200\200\200\Ek, is2=\EU\E F\Ef\E7\E5\E8\El\ENH\Ek\E\200\Eo&\200\Eo\47\E\E!, use=c108-4p, c108-na|c108-na-8p|concept 108 w/8 pages no arrows, smkx@, rmkx@, kf7=\E;, kf8=\E<, kf9=\E=, use=c108-8p, c108-rv-na|c108-rv-na-8p|concept 108 w/8 pages no arrows in rev video, smkx@, rmkx@, kf7=\E;, kf8=\E<, kf9=\E=, use=c108-rv-8p, # this needs new frotz in the cup capability for 2-char addrs when > 95.... c108-w|c108-w-8p|concept 108 w/8 pages in wide mode, is2=\EU\E F\Ef\E7\E5\E8\El\ENH\EK\E\200\Eo&\200\Eo\47\E\E", smcup=\EU\Ev 8^AD\Ep\r, rmcup=\Ev ^A0^AD\Ep\r\n, cup=\Ea%p1%?%p1%{95}%>%t^A%c%{96}%-%;%' '%+%c%p2%?%p2%{95}%>%t^A%c%{96}%-%;%' '%+%c, cols#132, use=c108-8p, # Concepts have only window relative cursor addressing, not screen relative. # To get it to work right here, smcup/rmcup (which were invented for the # concept) lock you into a one page window for screen style programs. # To get out of the one page window, we use a clever trick: # we set the window size to zero ("\Ev " in rmcup) which the terminal # recognizes as an error and resets the window to all of memory. # This trick works on c100 but does not on c108, sigh. # # Some tty drivers use cr3 for concept, others use nl3, hence the delays on # cr and ind below. This padding is only needed at 9600 baud. # One or the other is commented out depending on local conventions. # 2 nulls padding on rmcup isn't always enough. 6 works fine. Maybe less # than 6 but more than 2 will work. concept100|c100|concept|c104|c100-4p|concept 100, is2=\EU\Ef\E7\E5\E8\El\ENH\EK\E\200\Eo&\200\Eo\47\E, cr=$<9>^M, ind=^J, # cr=^M, ind=^J$<9>, bel=^G, cud1=^J, smcup=\EU\Ev 8p\Ep\r, rmcup=\Ev $<6>\Ep\r\n, il1=\E^R$<3*>, am, cub1=^H, ed=\E^C$<16*>, el=\E^U$<16>, clear=^L$<2*>, cup=\Ea%p1%' '%+%c%p2%' '%+%c, cols#80, dch1=\E^A$<16*>, dl1=\E^B$<3*>, rmir=\E\200, eo, smir=\E^P, in, ip=$<16*>, lines#24, mir, cuf1=\E=, ht=\t$<8>, kbs=^h, ul, cuu1=\E;, db, smul=\EG, rmul=\Eg, xenl, cvvis=\EW, cnorm=\Ew, flash=\Ek$<20>\EK, pb#9600, vt#8, smul=\EG, rmul=\Eg, smso=\EE\ED, rmso=\Ed\Ee, dim=\EE, rev=\ED, blink=\EC, prot=\EI, invis=\EH, sgr0=\EN\200, rep=\Er%p1%c%p2%' '%+%c$<.2*>, smkx=\EX, rmkx=\Ex, kcuu1=\E;, kcud1=\E<, kcub1=\E>, kcuf1=\E=, khome=\E?, kf1=\E5, kf2=\E6, kf3=\E7, c100-rvpp|c100-rv4ppp|c100 with printer port, is2=\EU\Ef\E7\E5\E8\El\ENH\Ek\E\200\Eo&\200\Eo!\200\EQ"\EY(^W\Eo\47\E, use=c100-rv, c100-rvna|c100-rv4pna|c100 with no arrows, smkx@, rmkx@, use=c100-rv, c100-rv|c100-rv4p|concept100-rv|c100 rev video, is2=\EU\Ef\E7\E5\E8\El\ENH\Ek\E\200\Eo&\200\Eo\47\E, flash=\EK$<20>\Ek, cvvis@, cnorm@, smso=\EE, rmso=\Ee, use=c100, //go.sysin dd * echo 'x - =data/datamedia' sed 's/^X//' <<'//go.sysin dd *' >=data/datamedia # # -------------------------------- # @(#)datamedia 1.4 5/19/82 # # datamedia: DATAMEDIA # dm1520|dm1521|1521|1520|datamedia 1520, cr=^M, cud1=^J, ind=^J, bel=^G, am, cub1=^H, ed=^K, el=^], clear=^L, cup=^^%p2%' '%+%c%p1%' '%+%c, cols#80, home=^Y, kcuu1=^_, kcud1=^J, kcub1=^H, kcuf1=^\, khome=^Y, lines#24, cuf1=^\, cuu1=^_, xenl, ht=^I, dm2500|datamedia2500|2500|datamedia 2500, cud1=^J, ind=^J, bel=^G, il1=^P\n^X^]^X^]$<15>, cub1=^H, el=^W, clear=^^^^\177, cup=^L%p2%'`'%^%c%p1%'`'%^%c, cols#80, dch1=^P\b^X^]$<10*>, dl1=^P^Z^X^]$<10*>, smdc=^P, rmdc=^X^], rmir=\377\377^X^]$<10>, home=^B, ich1=^P^\^X^]$<10*>, smir=^P, lines#24, cuf1=^\, pad=\377, smso=^N, rmso=^X^], cuu1=^Z, dm3025|datamedia 3025a, is2=\EQ\EU\EV, cr=^M, cud1=^J, ind=^J, bel=^G, il1=\EP\n\EQ$<130>, cub1=^H, ed=\EJ$<2>, el=\EK, clear=\EM$<2>, cup=\EY%p2%' '%+%c%p1%' '%+%c, cols#80, dch1=\b$<6>, dl1=\EP\EA\EQ$<130>, smdc=\EP, rmdc=\EQ, rmir=\EQ, home=\EH, smir=\EP, ip=, lines#24, cuf1=\EC, ht=^I, smso=\EOA, rmso=\EO@, cuu1=\EA, 3045|dm3045|datamedia 3045a, is2=\EU\EV, cr=^M, cud1=^J, ind=^J, bel=^G, am, cub1=^H, ed=\EJ$<2>, el=\EK, clear=\EM$<2>, cup=\EY%p2%' '%+%c%p1%' '%+%c, cols#80, dch1=\EB$<6>, smdc=, rmdc=, rmir=\EP, home=\EH, ich1=, smir=\EP, ip=$<6>, kf0=\Ey\r, kf1=\Ep\r, kf2=\Eq\r, kf3=\Er\r, kf4=\Es\r, kf5=\Et\r, kf6=\Eu\r, kf7=\Ev\r, kf8=\Ew\r, kf9=\Ex\r, khome=\EH, kcuu1=\EA, kcuf1=\EC, lines#24, cuf1=\EC, pad=\177, ht=^I, eo, ul, cuu1=\EA, xenl, # dt80/1 is2 a vt100 lookalike, but it doesn't seem to need any padding. dt80|dmdt80|dm80|datamedia dt80/1, cr=^M, cud1=^J, ind=^J, bel=^G, ed=\E[J, el=\E[K, clear=\E[2J\E[H, cup=\E[%i%p1%d;%p2%dH, home=\E[H, cuf1=\E[C, ri=\EM, smso=\E[7m, rmso=\E[m, cuu1=\E[A, smul=\E[4m, rmul=\E[m, use=vt100, # except in 132 column mode, where it needs a little padding. # This is2 still less padding than the vt100, and you can always turn on # the ^S/^Q handshaking, smso you can use vt100 flavors for things like # reverse video. dt80-w|dmdt80-w|dm80-w|datamedia dt80/1 in 132 char mode, cr=^M, cud1=^J, ind=^J, bel=^G, ed=\E[0J$<20>, cols#132, el=\E[0K$<20>, cup=\E[%i%p1%d;%p2%dH$<5>, clear=\E[H\E[2J$<50>, cuu1=\E[A$<5>, use=dmdt80, //go.sysin dd * echo 'x - =data/dec' sed 's/^X//' <<'//go.sysin dd *' >=data/dec # # -------------------------------- # @(#)dec 1.7 5/20/82 # # dec: DEC (DIGITAL EQUIPMENT CORPORATION) # # Note that xenl glitch in vt100 is not quite the same as concept, # since the cursor is left in a different position while in the # weird state (concept at beginning of next line, vt100 at end # of this line) so all versions of vi before 3.7 don't handle # xenl right on vt100. # I assume you have smooth scroll off or are at a slow enough baud # rate that it doesn't matter (1200? or less). Also this assumes # that you set auto-nl to "on", if you set it off use vt100-nam below. # # Since there are two things here called vt100, the installer can make # a local decision to make either one standard "vt100" by including # it in the list of terminals in reorder, since the first vt100 in # /etc/terminfo is the one that it will find. The choice is between # nam (no automatic margins) and am (automatic margins), as determined # by the wrapline switch (group 3 #2). I presonally recommend turning # on the bit and using vt100-am, since having stuff hammer on the right # margin is sort of hard to read. However, the xenl glitch does not occur # if you turn the bit off. # # I am unsure about the padding requirements listed here. I have heard # a claim that the vt100 needs no padding. It's possible that it needs # padding only if the xon/xoff switch is off. For UNIX, this switch # should probably be on. # # The vt100 uses rs2 and rf rather than is2/tbc/hts because the tab settings # are in non-volatile memory and don't need to be reset upon login. # Also setting the number of columns glitches the screen annoyingly. # You can type "reset" to get them set. vt100-mc|vt100 without advanced video option, sgr@, smso=\E[7m , rmso=\E[m , xmc#1, smul@, rmul@, bold@, rev@, blink@, sgr0@, use=vt100, vt100|vt100-am|dec vt100, cr=^M, cud1=^J, ind=^J, bel=^G, cols#80, lines#24, clear=\E[;H\E[2J$<50>, cub1=^H, am, cup=\E[%i%p1%d;%p2%dH$<5>, cuf1=\E[C$<2>, cuu1=\E[A$<2>, el=\E[K$<3>, ed=\E[J$<50>, smso=\E[7m$<2>, rmso=\E[m$<2>, smul=\E[4m$<2>, rmul=\E[m$<2>, bold=\E[1m$<2>, rev=\E[7m$<2>, blink=\E[5m$<2>, sgr0=\E[m$<2>, sgr=\E[%?%p1%t;7%;%?%p2%t;4%;%?%p3%t;7%;%?%p4%t;5%;%?%p6%t;1%;m, rs2=\E>\E[?3l\E[?4l\E[?5l\E[?7h\E[?8h, smkx=\E[?1h\E=, rmkx=\E[?1l\E>, rf=/usr/lib/tabset/vt100, home=\E[H, kcuu1=\EOA, kcud1=\EOB, kcuf1=\EOC, kcub1=\EOD, kbs=^H, kf1=\EOP, kf2=\EOQ, kf3=\EOR, kf4=\EOS, ht=^I, ri=\EM$<5>, vt#3, xenl, xon, sc=\E7, rc=\E8, csr=\E[%i%p1%d;%p2%dr, vt100-nam|vt100 w/no am, am@, xenl@, use=vt100-am, vt100-23|vt100 for use with sysline, lines#23, is2=\E[1;23r\E[23;1H, hs, eslok, tsl=\E7\E[24;%p1%dH\E[1K, fsl=\E8, use=vt100-am, gt42|dec gt42, cr=^M, cud1=^J, bel=^G, cub1=^H, cols#72, lines#40, os, vt132|vt132, il1=\E[L$<99>, dl1=\E[M$<99>, ip=$<7>, dch1=\E[P$<7>, rmir=\E[4l, smir=\E[4h, xenl, ind=^J$<30>, use=vt100, gt40|dec gt40, cr=^M, cud1=^J, bel=^G, cub1=^H, cols#72, lines#30, os, vt50|dec vt50, cr=^M, cud1=^J, ind=^J, bel=^G, cub1=^H, ed=\EJ, el=\EK, clear=\EH\EJ, cols#80, lines#12, cuf1=\EC, ht=^I, cuu1=\EA, dw1|decwriter I, cr=^M, cud1=^J, ind=^J, bel=^G, cub1=^H, cols#72, hc, os, vt50h|dec vt50h, cr=^M, cud1=^J, ind=^J, bel=^G, cub1=^H, ed=\EJ, el=\EK, clear=\EH\EJ, cup=\EY%p1%' '%+%c%p2%' '%+%c, cols#80, lines#12, cuf1=\EC, ht=^I, ri=\EI, cuu1=\EA, vt100-s|dec vt100 132 cols 14 lines (w/o advanced video option), lines#14, use=vt100-w, vt100-w|vt100-w-am|dec vt100 132 cols (w/advanced video), cols#132, lines#24, rs2=\E>\E[?3h\E[?4l\E[?5l\E[?8h, use=vt100-am, vt100-w-nam|dec vt100 132 cols (w/advanced video), cols#132, lines#24, rs2=\E>\E[?3h\E[?4l\E[?5l\E[?8h, vt@, use=vt100-nam, vt52|dec vt52, cr=^M, cud1=^J, ind=^J, bel=^G, cub1=^H, ed=\EJ, el=\EK, clear=\EH\EJ, cup=\EY%p1%' '%+%c%p2%' '%+%c, cols#80, lines#24, cuf1=\EC, ht=^I, ri=\EI, cuu1=\EA, kcuu1=\EA, kcud1=\EB, kcuf1=\EC, kcub1=\ED, kbs=^H, # The dw3 (and dw4?) supposedly have some fancy stuff, like settable tabs # and column addressing. But I don't know the details, and nobody seems # to use them except for consoles so it has never really mattered. dw2|dw3|decwriter|dw|decwriter II, cr=^M, cud1=^J, ind=^J, bel=^G, kbs=^h, cub1=^H, cols#132, hc, os, # From cbosg!ucbvax!G:tut Thu Sep 24 22:10:46 1981 dw4|decwriter IV, cr=^M, cud1=^J, ind=^J, bel=^G, cub1=^H, cols#132, hc, os, am, ht=^I, is2=\Ec, kf0=\EOP, kf1=\EOQ, kf2=\EOR, kf3=\EOS, kbs=^H, //go.sysin dd * echo 'x - =data/diablo' sed 's/^X//' <<'//go.sysin dd *' >=data/diablo # # -------------------------------- # @(#)diablo 1.4 5/19/82 # # diablo: DAISY WHEEL PRINTERS # # The A manufacturer represents Diablo, DTC, Xerox, Qume, and other Daisy # wheel terminals until such time as terminfo distinguishes between them # enough to justify separate codes. 1620|1640|450|diablo 1620, cr=^M, cud1=^J, ind=^J, bel=^G, tbc=\E2, hts=\E1, hpa=\E\t%i%p1%c, kbs=^H, cub1=^H, cols#132, ff=^L, hc, hu=\EU, hd=\ED, os, ht=^I, cuu1=\E\n, 1620-m8|1640-m8|diablo 1620 w/8 column left margin, cr=^M, cud1=^J, ind=^J, bel=^G, cols#124, is2=\r \E9, use=1620, # DTC 382 with VDU. Has no ed so we fake it with el. Standout works but # won't go away without dynamite. The terminal has tabs, but I'm getting # tired of fighting the braindamage. If no tab is set or the terminal's # in a bad mood, it glitches the screen around all of memory. Note that # return puts a blank ("a return character") in the space the cursor was # at, so we use ^P return (and thus ^P newline for newline). Note also # that if you turn off tabs and let Unix expand tabs, curses won't work # (current version) because it doesn't turn off this bit, and cursor # addressing sends a tab for row/column 9. What a losing terminal! I # have been unable to get tabs set in all 96 lines - it always leaves at # least one line with no tabs in it, and once you tab through that line, # it completely weirds out. dtc|mc0|dtc382|382, .if=/usr/lib/tabset/dtcvdu, bel=^G, cud1=^J, ind=^J, il1=^P^Z, am, cub1=^H, cols#80, el=^P^U, clear=^P^]$<20>, cup=^P^Q%p2%c%p1%c, dch1=^X, dl1=^P^S, rmir=^Pi, home=^P^R, smir=^PI, cnorm=^Pb, cvvis=^PB, pad=\177, rmcup=^P^]$<20>, lines#24, cuf1=^PR, .rmso=^P \200, .smso=^P \002^PF, smul=^P \020, rmul=^P \200, cuu1=^P^L, xhp, lm#96, da, db, cr=^P^M, ed=^P^U^P^S^P^S, dtc300s|300|300s|dtc 300s, tbc=\E3, hts=\E1, cr=^M, cud1=^J, ind=^J, bel=^G, kbs=^h, cub1=^H, cols#132, ff=^L, hc, hu=\EH, hd=\Eh, os, ht=^I, cuu1=^Z, gsi, cub1=^H, cols#132, hc, hd=\Eh, hu=\EH, os, ht=^I, cuu1=^Z, cr=^M, cud1=^J, ind=^J, bel=^G, aj830|aj832|aj|anderson jacobson, cr=^M, cud1=^J, ind=^J, bel=^G, cub1=^H, hc, hd=\E9, hu=\E8, os, cuu1=\E7, # From cbosg!ucbvax!pur-ee!cincy!chris Thu Aug 20 09:09:18 1981 # This is incomplete, but it's a start. 5520|nec|spinwriter|nec 5520|, tbc=\E3, hts=\E1, cr=^M, cud1=^J, ind=^J, bel=^G, kbs=^h, cub1=^H, cols#132, ff=^L, hc, hu=\E]s\E9\E]W, hd=\E]s\n\E]W, os, ht=^I, cuu1=\E9, qume5|qume|Qume Sprint 5, tbc=\E3, hts=\E1, cr=^M, cud1=^J, ind=^J, bel=^G, kbs=^h, cub1=^H, cols#80, ff=^L, hc, hu=\EH, hd=\Eh, os, ht=^I, cuu1=^Z, # I suspect the xerox1720 is the same as the diablo 1620. x1720|x1700|1700|x1750|xerox 1720, cols#132, cub1=^H, ff=^L, hc, os, ht=^I, cr=^M, cud1=^J, ind=^J, bel=^G, tbc=\E2, hts=\E1, //go.sysin dd * echo 'x - =data/general' sed 's/^X//' <<'//go.sysin dd *' >=data/general # # -------------------------------- # @(#)general 1.4 5/19/82 # # general: GENERAL TERMINAL (formerly INFOTON) # # Infoton is now called General Terminal Corp. # gt100 sounds like something DEC would come out with. Lets hope they don't. i100|gt100|gt100a|General Terminal 100A (formerly Infoton 100), cr=^M, cud1=^J, ind=^J, bel=^G, clear=^L, ed=\EJ, el=\EK, lines#24, cols#80, il1=\EL, dl1=\EM, cuu1=\EA, cuf1=\EC, home=\EH, cup=\Ef%p2%' '%+%c%p1%' '%+%c, flash=\Eb\Ea, am, cub1=^H, smso=\Eb, rmso=\Ea, # Looks like an ANSI terminal, but what a kludge for dch1! I bet smdc/rmdc # could be used even if the terminal is really that braindamaged. # But you would think being ANSI they would do \E[P right. Hmm. i400|400|infoton 400, cr=^M, cud1=^J, ind=^J, bel=^G, if=/usr/lib/tabset/infoton_tabs, il1=\E[L, am, cub1=^H, el=\E[N, clear=\E[2J, cup=\E[%i%p1%3d;%p2%3dH, cols#80, dl1=\E[M, lines#25, cuf1=\E[C, cuu1=\E[A, smir=\E[4h\E[2Q, rmir=\E[4l\E[0Q, dch1=\E[4h\E[2Q\E[P\E[4l\E[0Q, addrinfo, cr=^M, cud1=^J, ind=^J, bel=^G, lines#24, cols#80, clear=^L, home=^H, cuf1=^Y, ed=^K, cuu1=^\, am, cub1=^Z, cup=\037%i%p1%{1}%-%c%p2%{1}%-%c, ll=^H^\, # No, I don't know what this is. But KAS happens to be Kurt Shoens initials. infotonKAS, cr=^M, cud1=^J, ind=^J, bel=^G, am, cub1=^Z, ed=^K, clear=^L, cols#80, lines#24, cuf1=^Y, cuu1=^\, ll=^H^\, //go.sysin dd * echo 'x - =data/hazeltine' sed 's/^X//' <<'//go.sysin dd *' >=data/hazeltine # # -------------------------------- # @(#)hazeltine 1.4 5/19/82 # # hazeltine: HAZELTINE # # Since cuf1 is blank, when you want to erase something you # are out of luck. You will have to do ^L's a lot to # redraw the screen. h1000 is untested. It doesn't work in # vi - this terminal is too dumb for even vi. (The code is # there but it isn't debugged for this case.) h1000|hazeltine 1000, cub1=^H, home=^K, clear=^L, cuf1= , cols#80, lines#12, cr=^M, cud1=^J, ind=^J, bel=^G, # Note: the h1552 appears to be the first Hazeltine terminal which # is not braindamaged. It has tildes and backprimes and everything! # Be sure the auto lf/cr switch is set to cr. h1552|hazeltine 1552, cr=^M, cud1=^J, ind=^J, bel=^G, il1=\EE, dl1=\EO, kf1=\EP, lf1=blue, kf2=\EQ, lf2=red, kf3=\ER, lf3=green, use=vt52, h1552rv|hazeltine 1552 reverse video, cr=^M, cud1=^J, ind=^J, bel=^G, smso=\ES, rmso=\ET, use=h1552, # From cbosg!ucbvax!pur-ee!cincy!chris Thu Aug 20 09:09:18 1981 h1420|hazeltine 1420, cr=^M, cud1=^J, ind=^J, bel=^G, cub1=^H, am, lines#24, cols#80, il1=\E^Z, dl1=\E^S, ed=\E^X, clear=\E\034, cuu1=\E^L, cuf1=^P, el=\E^O, ht=^N, cup=\E^Q%p2%c%p1%' '%+%c, smso=\E\037, rmso=\E^Y, h1500|hazeltine 1500, cr=^M, cud1=^J, ind=^J, bel=^G, il1=~^Z$<40>, am, cub1=^H, ed=~^X$<10>, el=~^O, clear=~^\, cup=~^Q%p2%c%p1%c, cols#80, dl1=~^S$<40>, cud1=~^K, lines#24, cuf1=^P, .rmso=~^_, .smso=~^Y, cuu1=~^L, # h1510 assumed to be in sane escape mode. Else use h1500. h1510|hazeltine 1510, cr=^M, cud1=^J, ind=^J, bel=^G, il1=\E^Z, am, cub1=^H, ed=\E^X, el=\E^O, clear=\E^\, cup=\E^Q%p2%c%p1%c, cols#80, dl1=\E^S, cud1=\E^K, lines#24, cuf1=^P, .rmso=\E^_, .smso=\E^Y, cuu1=\E^L, h1520|hazeltine 1520, cr=^M, cud1=^J, ind=^J, bel=^G, il1=~^Z, am, cub1=^H, ed=~^X, el=~^O, clear=~\034, cup=~^Q%p2%c%p1%c$<1>, cols#80, dl1=~^S, cud1=~^K, hz, lines#24, cuf1=^P, rmso=~^Y, smso=~\037, cuu1=~^L, home=~^R, # Note: h2000 won't work well because of a clash between upper case and ~'s. h2000|hazeltine 2000, cud1=^J, ind=^J, bel=^G, il1=~^z$<6>, am, cub1=^H, clear=~^\$<6>, cup=~^q%p2%c%p1%c, cols#74, dl1=~^s$<6>, home=~^r, lines#27, pad=\177, //go.sysin dd * echo 'x - =data/header' sed 's/^X//' <<'//go.sysin dd *' >=data/header # ------------------------ # # Terminfo source file %W% (CBOSGD) %G% # Mark Horton, U.C. Berkeley, Bell Telephone Laboratories # # This file describes capabilities of various terminals, as needed by # software such as screen editors. It does not attempt to describe # printing terminals very well, nor graphics terminals. Someday. # See terminfo(5) in the Unix Programmers Manual for documentation. # # Conventions: First entry is two chars, first char is manufacturer, # second char is canonical name for model or mode. # Third entry is the one the editor will print with "set" command. # Last entry is verbose description. # Others are mnemonic synonyms for the terminal. # # Terminal naming conventions: # Terminal names look like <manufacturer> <model> - <modes/options> # Certain abbreviations (e.g. c100 for concept100) are also allowed # for upward compatibility. The part to the left of the dash, if a # dash is present, describes the particular hardware of the terminal. # The part to the right can be used for flags indicating special ROM's, # extra memory, particular terminal modes, or user preferences. # All names are always in lower case, for consistency in typing. # Because of file naming restrictions, terminal names should not contain # period or slash, in fact, entirely alphanumeric characters plus dash are # highly recommended. These restrictions do not apply to the verbose name. # # The following are conventionally used flags: # rv Terminal in reverse video mode (black on white) # 2p Has two pages of memory. Likewise 4p, 8p, etc. # w Wide - in 132 column mode. # pp Has a printer port which is used. # na No arrow keys - terminfo ignores arrow keys which are # actually there on the terminal, so the user can use # the arrow keys locally. # # There are some cases where the same name is used for two different # terminals, e.g. "teleray" or "2621" or "vt100". In these cases, # if a site has one of these, they should choose a local default and # bring that terminal to the front in the reorder script. This works # because tgetent picks the first match in /etc/terminfo. # The list of names intentionally duplicated is: # 2621, c108, dtc, hp2621, teleray, tvi, vt100. # # If you absolutely MUST check for a specific terminal (this is discouraged) # check for the 2nd entry (the canonical form) since all other codes are # subject to change. The two letter codes are there for version 6 and are # EXTREMELY subject to change, or even to go away if version 6 becomes for # all practical purposes obsolete. We would much rather put in special # capabilities to describe your terminal rather than having you key on the # name. # # Special manufacturer codes: # A: hardcopy daisy wheel terminals # M: Misc. (with only a few terminals) # q: Homemade # s: special (dialup, etc.) # # Comments in this file begin with # - they cannot appear in the middle # of a terminfo entry. Individual entries are commented out by # placing a period between the colon and the capability name. # # This file is to be installed with an editor script (reorder) # that moves the most common terminals to the front of the file. # If the source is not available, it can be constructed by sorting # the above entries by the 2 char initial code. //go.sysin dd * echo 'x - =data/heath' sed 's/^X//' <<'//go.sysin dd *' >=data/heath # # -------------------------------- # @(#)heath 1.4 5/19/82 # # heath: HEATHKIT (ZENITH) # h19-a|heath-ansi|heathkit-a|heathkit h19 ansi mode, cr=^M, cud1=^J, ind=^J, bel=^G, il1=\E[1L$<1*>, am, cub1=^H, ed=\E[J, el=\E[K, clear=\E[2J, cup=\E[%i%p1%2d;%p2%2dH, cols#80, dch1=\E[1P, dl1=\E[1M$<1*>, cud1=\E[1B, rmir=\E[4l, home=\E[H, smir=\E[4h, lines#24, mir, cuf1=\E[1C, rmacs=\E[10m, smacs=\E[11m, msgr, ht=^I, rmso=\E[0m, smso=\E[7m, cuu1=\E[1A, cvvis=\E[>4h, cnorm=\E[>4l, kbs=^h, kcuu1=\E[1A, kcud1=\E[1B, kcub1=\E[1D, kcuf1=\E[1C, khome=\E[H, kf1=\EOS, kf2=\EOT, kf3=\EOU, kf4=\EOV, kf5=\EOW, lf6=blue, lf7=red, lf8=white, kf6=\EOP, kf7=\EOQ, kf8=\EOR, ri=\EM, is2=\E<\E[>1;2;3;4;5;6;7;8;9l\E[0m\E[11m\E[?7h, h19-bs|heathkit w/keypad shifted, smkx=\Et, rmkx=\Eu, use=h19-b, h19-smul|heathkit w/keypad shifted/underscore cursor, smkx=\Et, rmkx=\Eu, use=h19-u, h19|heath|h19-b|heathkit|heath-19|z19|zenith|heathkit h19, cr=^M, cud1=^J, ind=^J, bel=^G, il1=\EL$<1*>, am, cub1=^H, ed=\EJ, el=\EK, clear=\EE, cup=\EY%p1%' '%+%c%p2%' '%+%c, cols#80, dch1=\EN, dl1=\EM$<1*>, cud1=\EB, rmir=\EO, home=\EH, smir=\E@, lines#24, mir, cuf1=\EC, rmacs=\EF, smacs=\EG, msgr, ht=^I, ri=\EI, rmso=\Eq, smso=\Ep, cuu1=\EA, cvvis=\Ex4, cnorm=\Ey4, kbs=^h, kcuu1=\EA, kcud1=\EB, kcub1=\ED, kcuf1=\EC, khome=\EH, kf1=\ES, kf2=\ET, kf3=\EU, kf4=\EV, kf5=\EW, lf6=blue, lf7=red, lf8=white, kf6=\EP, kf7=\EQ, kf8=\ER, hs, eslok, tsl=\Ej\Ex5\EY8%p1%' '%+%c\Eo\Eo, fsl=\Ek\Ey5, h19-u|heathkit with underscore cursor, cvvis@, cnorm@, use=h19-b, # This still doesn't work right - something funny is going on with return # and linefeed in the reach program. reach|h89|h89 running reach, cr@, cud1=\EB, is2=\Ey3\Ev, use=h19-b, //go.sysin dd * echo 'x - =data/homebrew' sed 's/^X//' <<'//go.sysin dd *' >=data/homebrew # # -------------------------------- # @(#)homebrew 1.4 5/19/82 # # homebrew: HOME MADE TERMINALS # bc|bill croft homebrew, cr=^M, cud1=^J, ind=^J, bel=^G, am, cub1=^H, cup=\E=%p1%' '%+%c%p2%' '%+%c, clear=^Z, cols#96, home=^^, lines#72, cuf1=^L, cuu1=^K, flash=, nucterm|rayterm|nuc|NUC homebrew, cr=^M, cud1=^J, ind=^J, bel=^G, am, cub1=^H, clear=^L$<1>, lines#24, cols#80, cuf1=^C, cuu1=^N, home=^B, ll=^K, el=^A, ed=^E, carlock|klc, cr=^M, cud1=^J, ind=^J, bel=^G, il1=^E, am, el=^U, clear=^Z$<100>, cup=\E=%p1%' '%+%c%p2%' '%+%c, cols#80, dch1=\177, dl1=^D, ed=, rmir=^T, home=^^, smir=^T, lines#24, cuf1=^L, rmso=^V, smso=^V, cuu1=^K, flash=\EV\EV, ex3000, cr=^M, cud1=^J, ind=^J, bel=^G, lines#24, cols#80, home=^Q, exidy|exidy2500|exidy sorcerer rmacs dm2500, cr=^M, cud1=^J, ind=^J, bel=^G, il1=^P^J^X, am, cub1=^H, el=^W, clear=^^, cup=^L%p2%'`'%^%c%p1%'`'%^%c, cols#64, dch1=\b, dl1=^P^Z^X, smdc=^P, ed=^X, rmir=^X, home=^B, ich1=^\, smir=^P, lines#30, cuf1=^\, ht=^I, smso=^N, rmso=^X, cuu1=^Z, # This came from the comp ctr who got it from some user. Smart indeed! sexidy|exidy smart, cr=^M, cud1=^J, ind=^J, bel=^G, lines#24, cols#64, clear=^L, home=^Q, cuf1=^S, cuu1=^W, cub1=^H, cub1=^A, kcud1=^S, # netx and xitex are almost identical, except for the padding # on clear screen. Hmm. netx|netronics, cr=^M, cud1=^J, ind=^J, bel=^G, cub1=^H, ed=^F^E$<2000>, el=^E$<1600>, clear=^L$<466>, cup=\E=%p1%'@'%+%c%p2%'@'%+%c, cols#64, home=^D, lines#16, cuf1=\E+@A, pad=\200, ri=\E=@@^K, cuu1=^K, xitex|xitex sct-100, cr=^M, cud1=^J, ind=^J, bel=^G, cub1=^H, ed=^F^E$<2000>, el=^E$<1600>, clear=^L$<400>, cup=\E=%p1%'@'%+%c%p2%'@'%+%c, cols#64, home=^D, lines#16, cuf1=\E+@A, pad=\200, ri=\E=@@^K, cuu1=^K, ubell|ubellchar, if=/usr/lib/tabset/ubell, cr=^M, cud1=^J, ind=^J, bel=^G, am, cub1=^H, ht=^I, el=\Ed, clear=^Z, cup=\E=%p1%' '%+%c%p2%' '%+%c, cols#80, lines#24, cuf1=^L, cuu1=^K, home=^^, ttywilliams, cr=^M, cud1=^J, ind=^J, bel=^G, cols#80, lines#12, cub1=^Y, cud1=^K, cuu1=^Z, clear=^^, el=^_, am, home=^], cuf1=^X, //go.sysin dd * echo 'x - =data/hp' sed 's/^X//' <<'//go.sysin dd *' >=data/hp # # -------------------------------- # @(#)hp 1.7 5/20/82 # # hp: HEWLETT PACKARD # # Note: no "home" on HP's since that homes to top of memory, not screen. # Due to severe 2621 braindamage, the only way to get the arrow keys to # transmit anything at all is to turn on the function key labels # (f1-f8) with smkx, and even then the poor user has to hold down shift! # The default 2621 turns off the labels except when it has to to enable # the function keys. If your installation prefers labels on all the time, # or off all the time (at the "expense" of the function keys) move the # 2621-nl or 2621-wl labels to the front using reorder. # Note: there are newer ROM's for 2621's that allow you to set strap A # so the regular arrow keys xmit \EA, etc, as with the 2645. However, # even with this strap set, the terminal stops xmitting if you reset it, # until you unset and reset the strap! Since there is no way to set/unset # the strap with an escape sequence, we don't use it in the default. # If you like, you can use 2621-ba (braindamaged arrow keys). hp2621-ba|2621-ba|2621 w/new rom and strap A set, smkx@, rmkx@, kcuu1=\EA, kcud1=\EB, kcub1=\ED, kcuf1=\EC, khome=\Eh, use=hp2621, # 2621 with labels on all the time - normal outside vi, function inside vi. hp2621-wl|2621-wl|hp 2621 w/labels, is2=\E&jA\r, rmkx=\E&jA, use=hp2621-fl, # 2621 with function labels. Most of the time they are off, # but inside vi, the function key labels appear. You have to # hold down shift to get them to xmit. hp2621-fl|2621|hp2621|hp2621a|hp2621p|2621a|2621p|2621-fl|2621A|2621P|hp 2621, is2=\E&j@\r, cbt=\Ei, cup=\E&a%p2%dc%p1%dY, dch1=\EP$<2>, ip=$<2>, pb#19200, smso=\E&dD, rmso=\E&d@, smul=\E&dD, rmul=\E&d@, sgr0=\E&d@, xhp@, khome=\Ep\r, kcuu1=\Et\r, kcub1=\Eu\r, kcuf1=\Ev\r, kcud1=\Ew\r, kf1=\Ep\r, kf2=\Eq\r, kf3=\Er\r, kf4=\Es\r, kf5=\Et\r, kf6=\Eu\r, kf7=\Ev\r, kf8=\Ew\r, smkx=\E&jB, rmkx=\E&j@, ht=^I$<2>, xon, use=hp, # 2621k45: untested 2621k45|hp2621k45|k45|hp 2621 with 45 keyboard, kbs=^H, kcuu1=\EA, kcud1=\EB, kcub1=\ED, kcuf1=\EC, khome=\Eh, smkx=\E&s1A, rmkx=\E&s0A, use=2621, # This terminal should be used at 4800 baud or less. It needs padding for # plain characters at 9600, I guessed at an appropriate cr delay. # It really wants ^E/^F handshaking, but that doesn't work well even if # you write software to support it. 2645|hp2645|hp45|hp 264x series, dim=\E&dH, rev=\E&dB, smul=\E&dD, blink=\E&dA, sgr0=\E&d@, sgr=\E&d%'@'%?%p1%t%'B'%|%;%?%p2%t%'D'%|%;%?%p3%t%'B'%|%;%?%p4%t%'A'%|%;%?%p5%t%'H'%|%;%?%p6%t%'B'%|%;%c, kcuu1=\EA, kcud1=\EB, kcub1=\ED, kcuf1=\EC, khome=\Eh, smkx=\E&s1A, rmkx=\E&s0A, knp=\EU, kpp=\EV, kri=\ET, kind=\ES, kil1=\EL, kdl1=\EM, kich1=\EQ, kdch1=\EP, kel=\EK, ked=\EJ, krmir=\ER, pb#9600, cr=^M$<20>, use=hp, hp|hewlett-packard, tbc=\E3, hts=\E1, cr=^M, cud1=^J, ind=^J, bel=^G, il1=\EL, am, cub1=^H, ed=\EJ, el=\EK, hpa=\E&a%p1%dC, clear=\EH\EJ, cup=\E&a%p2%dc%p1%dY$<6>, cols#80, vpa=\E&a%p1%dY, lm#0, da, db, dch1=\EP, dl1=\EM, rmir=\ER, smir=\EQ, kbs=^H, lines#24, mir, cuf1=\EC, ht=^I, rmso=\E&d@, smso=\E&dJ, smul=\E&dD, rmul=\E&d@, cuu1=\EA, xhp, vt#6, hp-0|hewlett-packard for testing of curses and the like, cr=^M, cud1=^J, ind=^J, bel=^G, am, cuf1=\EC, cub1=^H, clear=\EH\EJ, home=\E&a0c0Y, cols#80, lines#24, hp-1, ht=^I, cuu1=\EA, use=hp-0, hp-2, cup=\E&a%p2%dc%p1%dY$<6>, use=hp-1, hp-3, ed=\EJ, el=\EK, use=hp-2, # This entry does not use any of the fancy windowing stuff of the 2626. # Indeed, terminfo does not yet handle such stuff. Since changing any window # clears memory, it is probably not possible to use this for screen opt. # ed is incredibly slow most of the time - I am guessing at the exact padding. # Since the terminal uses xoff/xon this is intended only for cost computation, # so that the terminal will prefer el or even dl1 which is probably faster! hp2626|hp2626a|hp2626p|2626|2626a|2626p|2626A|2626P|hp 2626, dch1=\EP$<2>, ip=$<2>, rmso=\E&d@, smso=\E&dB, ed=\EJ$<500>, rev=\E&dB, smul=\E&dD, blink=\E&dA, invis=\E&dS, sgr0=\E&d@, rmul=\E&d@, sgr=\E&d%'@'%?%p1%t%'B'%|%;%?%p2%t%'D'%|%;%?%p3%t%'B'%|%;%?%p4%t%'A'%|%;%c, khome=\Eh, kcuu1=\EA, kcub1=\ED, kcuf1=\EC, kcud1=\EB, smkx=\E&s1A, rmkx=\E&s0A, knp=\EU, kpp=\EV, kri=\ET, kind=\ES, kil1=\EL, kdl1=\EM, kich1=\EQ, kdch1=\EP, kel=\EK, ked=\EJ, krmir=\ER, ind=\ES, ht=^I$<2>, xhp, use=2621, # This entry is for sysline. It allocates a 23 line window with a 115 line # workspace for regular use, and a 1 line window for the status line. # This assumes port 2 is being used. # Turn off horizontal line, Create ws #1 with 115 lines, # Create ws #2 with 1 line, Create window #1 lines 1-23, # Create window #2 lines 24-24, Attach cursor to workspace #1. # Note that this clears the tabs so it must be done by tset before # it sets the tabs. 2626-23|hp 2626 using only 23 lines, tsl=\E&w7f2p2I\E&w4f2I\r\EK\E&a%p1%dC, fsl=\E&d@\E&w7f2p1I\E&w4f1I, eslok, hs, is1=\E&q3t0{0H \E&w0f115n1I \E&w0f1n2I \E&w2f1i0d0u22l0S \E&w2f2i0d23u23l0S \E&w7f2p1I \r, lines#23, use=2626, # Force terminal back to 24 lines after being 23. 2626-24|hp 2626 using all 24 lines, is1=\E&q3t0{0H \E&w0f118n1I \E&w0f1n2I \E&w2f1i0d0u23l0S \E&w3f2I \E&w7f2p1I \r, use=2626, # Various entries useful for small windows on 2626. 2626-12, lines#12, use=2626, 2626-12x40, cols#40, lines#12, use=2626, 2626-x40, cols#40, use=2626, 2626-11, lines#11, use=2626-23, # cD is a pain - but it only screws up at 9600 baud. # You should use this terminal at 4800 baud or less. hp2648|hp2648a|2648a|2648A|2648|HP 2648a graphics terminal, clear=\EH\EJ$<50>, cup=\E&a%p2%dc%p1%dY$<20>, dch1=\EP$<7>, ip=$<5>, use=2645, # 2640a doesn't have the Y cursor addressing feature, and C is memory relative # instead of screen relative, as we need. 2640|hp2640a|2640a|hp 2640a, cup@, smkx@, rmkx@, use=2645, 2640b|hp2640b|2644a|hp2644a|hp 264x series, smkx@, rmkx@, use=2645, # 2621 using all 48 lines of memory, only 24 visible at any time. Untested. 2621-48|48 line 2621, lines#48, home=\EH, cup=\E&a%p2%dc%p1%dR, use=2621, # 2621 with no labels ever. Also prevents vi delays on escape. hp2621-nl|2621-nl|hp 2621 with no labels, smkx@, rmkx@, khome@, kcuu1@, kcub1@, kcuf1@, kcud1@, use=hp2621-fl, # Needed for UCB ARPAVAX console, since lsi-11 expands tabs (wrong). hp2621-nt|2621-nt|hp 2621 w/no tabs, ht@, use=hp2621, //go.sysin dd * echo 'x - =data/ibm' sed 's/^X//' <<'//go.sysin dd *' >=data/ibm # # -------------------------------- # @(#)ibm 1.4 5/19/82 # # ibm: IBM, INTERACTIVE SYSTEMS, and INTECOLOR # # Some of these should go in the misc category, IBM, ISC, and intecolor can't # all have I. I will wait to see who comes out with more terminals. # These compucolors appear similar, but they at least have different # sized screens. I don't know what's going on here. # There is further confusion since intecolor seems to call themselves isc too. 8001|isc8001|compucolor|intecolor, cr=^M, cud1=^J, ind=^J, bel=^G, il1=\EU, am, cub1=^Z, clear=^L$<3*>, cup=^C%p2%c%p1%c, cols#80, rmdc=\EQ, smdc=\EQ, ed=\EF, dch1=\177, dl1=\EV, rmir=\EF, smir=\EQ, lines#40, cuf1=^Y$<1>, ht=\t$<8>, cuu1=^\, home=^H$<1>, compucolor2|compucolorii, cr=^M, cud1=^J, ind=^J, bel=^G, ht=^I, am, cup=^C%p2%c%p1%c, cub1=^Z, lines#32, cols#64, clear=^L, home=^H, cuf1=^Y, cuu1=^\, # From cithep!eric Wed Sep 16 08:06:44 1981 intext|Interactive Systems Corporation modified owl 1200, cr=^M, cud1=^J, ind=^J, bel=^G, il1=\020$<5.5*>, am, cub1=^_, cub1=^H, cbt=^Y, ed=\026J$<5.5*>, el=^K\160^R, clear=\014$<132>, cup=\017%p1%' '%+%c%p2%' '%+%c, cols#80, dch1=\022$<5.5*>, dl1=\021$<5.5*>, rmir=\026\074, smir=\026\073, ip=$<5.5*>, lines#24, cuf1=\036, ht=^I, cuu1=\034, rmso=^V# , xmc#1, smso=^V$\054, kcub1=^_, kcud1=^J, kcuf1=^^, kcuu1=\034, kbs=^H, khome=^Z, kf1=^VA\r, kf2=^VB\r, kf3=^VC\r, kf4=^VD\r, kf5=^VE\r, kf6=^VF\r, kf7=^VG\r, kf8=^VH\r, kf9=^VI\r, kf0=^VJ\r, ibm|ibm3101|3101|i3101|IBM 3101-10, .if=/usr/lib/tabset/3101, cr=^M, cud1=^J, ind=^J, bel=^G, tbc=\EH, hts=\E0, am, cub1=^H, clear=\EK, lines#24, cols#80, cuf1=\EC, cuu1=\EA, ed=\EJ, el=\EI, kcud1=\EB, kcub1=\ED, kcuf1=\EC, kcuu1=\EA, home=\EH, cup=\EY%p1%' '%+%c%p2%' '%+%c, ht=^I, //go.sysin dd * echo 'x - =data/lsi' sed 's/^X//' <<'//go.sysin dd *' >=data/lsi # # -------------------------------- # @(#)lsi 1.4 5/19/82 # # lsi: LEAR SIEGLER (ADM) # # If the adm31 gives you trouble with standout mode, check the DIP switch # in position 6, bank @c11, 25% from back end of pad. Should be OFF. # If there is no such switch, you have an old adm31 and must use oadm31 adm31|31|lsi adm31, is2=\Eu\E0, cr=^M, cud1=^J, ind=^J, bel=^G, il1=\EE, am, cub1=^H, el=\ET, cup=\E=%p1%' '%+%c%p2%' '%+%c, clear=\E*, ed=\EY, cols#80, dch1=\EW, dl1=\ER, rmir=\Er, home=^^, smir=\Eq, kf0=^A0\r, kf1=^A1\r, kf2=^A2\r, kf3=^A3\r, kf4=^A4\r, kf5=^A5\r, kf6=^A6\r, kf7=^A7\r, kf8=^A8\r, kf9=^A9\r, kcud1=^J, kcub1=^H, kcuf1=^L, kcuu1=^K, lines#24, mir, cuf1=^L, rmso=\EG0, smso=\EG1, cuu1=^K, smul=\EG1, rmul=\EG0, adm2|lsi adm2, cr=^M, cud1=^J, ind=^J, bel=^G, il1=\EE, am, cub1=^H, ed=\EY, el=\ET, clear=\E;, cup=\E=%p1%' '%+%c%p2%' '%+%c, cols#80, dch1=\EW, dl1=\ER, home=^^, ich1=\EQ, kcud1=^J, khome=^^, kcub1=^H, kcuf1=^L, kcuu1=^K, lines#24, cuf1=^L, cuu1=^K, adm3|lsi adm3, cr=^M, cud1=^J, ind=^J, bel=^G, am, cub1=^H, clear=^Z, lines#24, cols#80, adm42|42|lsi adm42, cvvis=\EC\E3 \E3(, cr=^M, cud1=^J, ind=^J, bel=^G, il1=\EE$<270>, am, cub1=^H, ed=\EY, el=\ET, clear=\E;, cup=\E=%p1%' '%+%c%p2%' '%+%c, cols#80, dch1=\EW, dl1=\ER, rmir=\Er, smir=\Eq, ip=$<6*>, lines#24, cbt=\EI, cuf1=^L, rmso=\EG0, smso=\EG4, ht=\t, cuu1=^k, pad=\177, adm5|lsi adm5, cr=^M, cud1=^J, ind=^J, bel=^G, ed=\EY, el=\ET, cud1=^J, kbs=^H, khome=^^, rmso=\EG, xmc#1, smso=\EG, use=adm3aplus, adm3a|3a|lsi adm3a, cr=^M, cud1=^J, ind=^J, bel=^G, am, cub1=^H, cup=\E=%p1%' '%+%c%p2%' '%+%c, clear=^Z$<1>, cols#80, home=^^, lines#24, cuf1=^L, cuu1=^K, adm3a+|3a+|adm3aplus|lsi adm3a+, kcub1=^H, kcud1=^J, kcuu1=^K, kcuf1=^L, use=adm3a, oadm31|o31|old adm31, smso=\EG4, smul@, rmul@, use=adm31, //go.sysin dd * echo 'x - =data/microterm' sed 's/^X//' <<'//go.sysin dd *' >=data/microterm # # -------------------------------- # @(#)microterm 1.4 5/19/82 # # microterm: MICROTERM # microterm|act4|microterm act iv, cr=^M, cud1=^J, ind=^J, bel=^G, am, cub1=^H, ed=^_, el=^^, clear=^L, cup=^T%p1%c%p2%c, cols#80, lines#24, cuf1=^X, cuu1=^Z, home=^], # The padding on cuf1 for act5 and mime is a guess and not final. # The act5 has hardware tabs, but in cols 8, 16, 24, 32, 41 (!), 49, ... microterm5|act5|microterm act v, uc=\EA, ri=\EH$<3>, kcuu1=^Z, kcud1=^K, kcub1=^H, kcuf1=^X, use=act4, # Act V in split screen mode. act5s is not tested and said not to work. # Could have been because of the funny tabs - it might work now. act5s|skinny act5, smcup=\EP, rmcup=\EQ, lines#48, cols#39, use=act5, # These mime1 entries refer to the Microterm Mime I or Mime II. # The default mime is assumed to be in enhanced act iv mode. # There is a ^Q in is2 to unwedge any lines that wedge on ^S. mime|mime1|mime2|mimei|mimeii|microterm mime1, cup=^T%p1%{24}%+%c%p2%?%p2%{32}%>%t%{48}%+%;%{80}%+%c, cols#80, cr=^M, cud1=^J, ind=^J, bel=^G, il1=^A$<80>, am, cub1=^H, ed=^_, el=^^, clear=\035^C, dl1=^W$<80>, ht=^I, lines#24, cuf1=^X, uc=^U, cuu1=^z, home=\035, cud1=^K, is2=\E^S^Q, kcuu1=^Z, kcud1=^K, kcub1=^H, kcuf1=^X, ri=^R$<3>, vt#9, mime-3a|mime-adm3a|mime1 emulating adm3a, am@, kcuu1=^Z, kcud1=^K, kcub1=^H, kcuf1=^X, use=adm3a, mime-3ax|mime-adm3ax|mime1 emulating enhanced adm3a, il1=^A$<80>, dl1=^W$<80>, ht=^I$<3>, el=^X, ed=^_, use=mime-3a, # Mimes using brightness for standout. Half bright is very dim unless # you turn up the brightness so far that lines show up on the screen. mime-fb|full bright mime1, smso=^Y, rmso=^S, is2=^S\E^Q, use=mime, mime-hb|half bright mime1, smso=^S, rmso=^Y, is2=^Y\E, use=mime, # These entries (for mime 2a) put the terminal in low intensity mode # since high intensity mode is so obnoxious. # This is the preferred mode (but ^X can't be used as a kill character (?)) mime2a|mime2a-v|microterm mime2a (emulating an enhanced vt52), cr=^M, cud1=^J, ind=^J, bel=^G, il1=^A$<20*>, cub1=^H, ed=\EQ$<20*>, cols#80, el=\EP, clear=\EL, cup=\EY%p1%' '%+%c%p2%' '%+%c, is2=^Y, dch1=^N, dl1=^W$<20*>, ip=$<2>, rmir=^Z, home=\EH, smir=^O, cuu1=\EA, ri=\EA, kcud1=\EB, kcub1=\ED, kcuf1=\EC, kcuu1=\EA, lines#24, cuf1=\EC, ht=^I, rmso=\E9, smso=\E8, smul=\E4, rmul=\E5, mime2a-s|microterm mime2a (emulating an enhanced soroc iq120), cr=^M, cud1=^J, ind=^J, bel=^G, il1=^A$<20*>, am, cub1=^H, ed=\EJ$<20*>, el=\EK, clear=\EL, cup=\E=%p1%' '%+%c%p2%' '%+%c, cols#80, dch1=\ED, dl1=^W$<20*>, kcub1=^H, kcuf1=^L, kcuu1=^K, kcud1=^J, home=^^, is2=\E), ri=\EI, smir=\EE, rmir=^Z, ip=$<2>, lines#24, cuf1=^L, cuu1=\EI, smso=\E:, rmso=\E;, smul=\E6, rmul=\E7, //go.sysin dd * exit
sources@genrad.UUCP (12/22/84)
This is part of a distribution of a public domain version of terminfo/curses It is a rather large distribution, so I have broken it up into 11 modules (each less than 64K long.) Each shar format module should end with the line "exit". This code is completely public domain, originally written by Pavel Curtis of Cornell University. This version has some small improvements and bug fixes. This unit contains: The demo program "mille". ----------------- cut here ---------------- : Run this shell script with "sh" not "csh" PATH=:/bin:/usr/bin:/usr/ucb export PATH echo 'Making directory "=test"' mkdir =test echo 'Making directory "=test/=mille"' mkdir =test/=mille echo 'x - =test/=mille/Makefile' sed 's/^X//' <<'//go.sysin dd *' >=test/=mille/Makefile HEADERS=mille.h CFILES= comp.c end.c extern.c init.c mille.c misc.c move.c print.c \ roll.c save.c types.c varpush.c OBJS= comp.o end.o extern.o init.o mille.o misc.o move.o print.o \ roll.o save.o types.o varpush.o POBJS= comp.po end.po extern.po init.po mille.po misc.po move.po \ roll.po print.po save.po types.po varpush.po LIBS= ../../=src/libpcurses.a CFLAGS= -O -DSTANDOUT -I../../=src X.SUFFIXES: .po .i X.c.po: rm -f x.c ; ln $*.c x.c ${CC} ${CFLAGS} -pg -c x.c mv x.o $*.po X.c.i: ${CC} ${CFLAGS} -P $*.c mille: ${OBJS} ${CC} ${CFLAGS} -n -o mille ${OBJS} ${LIBS} install: mille cp mille /usr/games pmb: ${POBJS} ${CC} ${CFLAGS} -n -pg -o pmb ${POBJS} $(LIBS) mille.po: mille.c rm -f x.c ; ln mille.c x.c ${CC} ${CFLAGS} -DPROF -p -c x.c mv x.o mille.po table: table.o extern.o ${CC} ${CFLAGS} -i -o table table.o extern.o readdump: readdump.o extern.o varpush.o ${CC} ${CFLAGS} -i -o readdump readdump.o extern.o varpush.o ctags: ctags ${HEADERS} ${CFILES} ed - tags < :ctfix sort tags -o tags lint: lint -hxb ${CFILES} > lint.out mille.ar: ar ruv mille.ar Makefile tags ${HEADERS} ${CFILES} tar: tar crvf mille.tar Makefile tags :ctfix ${HEADERS} ${CFILES} lpr: pr Makefile ${HEADERS} ${CFILES} tags | lpr ; lpq //go.sysin dd * echo 'x - =test/=mille/comp.c' sed 's/^X//' <<'//go.sysin dd *' >=test/=mille/comp.c # include "mille.h" # define V_VALUABLE 40 calcmove() { reg CARD card; reg int *value; reg PLAY *pp, *op; reg bool foundend, cango, canstop, foundlow; reg unsgn int i, count200, badcount, nummin, nummax, diff; reg int curmin, curmax; reg CARD safe, oppos; int valbuf[HAND_SZ], count[NUM_CARDS]; bool playit[HAND_SZ]; wmove(Score, ERR_Y, ERR_X); /* get rid of error messages */ wclrtoeol(Score); pp = &Player[COMP]; op = &Player[PLAYER]; safe = 0; cango = 0; canstop = FALSE; foundend = FALSE; for (i = 0; i < NUM_CARDS; i++) count[i] = 0; for (i = 0; i < HAND_SZ; i++) { card = pp->hand[i]; switch (card) { case C_STOP: case C_CRASH: case C_FLAT: case C_EMPTY: if (playit[i] = canplay(pp, op, card)) canstop = TRUE; goto norm; case C_LIMIT: if ((playit[i] = canplay(pp, op, card)) && Numseen[C_25] == Numcards[C_25] && Numseen[C_50] == Numcards[C_50]) canstop = TRUE; goto norm; case C_25: case C_50: case C_75: case C_100: case C_200: if ((playit[i] = canplay(pp, op, card)) && pp->mileage + Value[card] == End) foundend = TRUE; goto norm; default: playit[i] = canplay(pp, op, card); norm: if (playit[i]) ++cango; break; case C_GAS_SAFE: case C_DRIVE_SAFE: case C_SPARE_SAFE: case C_RIGHT_WAY: if (pp->battle == opposite(card) || (pp->speed == C_LIMIT && card == C_RIGHT_WAY)) { Movetype = M_PLAY; Card_no = i; return; } ++safe; playit[i] = TRUE; break; } ++count[card]; } if (pp->hand[0] == C_INIT && Topcard > Deck) { Movetype = M_DRAW; return; } if (Debug) fprintf(outf, "CALCMOVE: cango = %d, canstop = %d, safe = %d\n", cango, canstop, safe); if (foundend) foundend = !check_ext(TRUE); for (i = 0; safe && i < HAND_SZ; i++) { if (issafety(pp->hand[i])) { if (onecard(op) || (foundend && cango && !canstop)) { if (Debug) fprintf(outf, "CALCMOVE: onecard(op) = %d, foundend = %d\n", onecard(op), foundend); playsafe: Movetype = M_PLAY; Card_no = i; return; } oppos = opposite(pp->hand[i]); if (Numseen[oppos] == Numcards[oppos]) goto playsafe; else if (!cango && (op->can_go || !pp->can_go || Topcard < Deck)) { card = (Topcard - Deck) - roll(1, 10); if ((!pp->mileage) != (!op->mileage)) card -= 7; if (Debug) fprintf(outf, "CALCMOVE: card = %d, DECK_SZ / 4 = %d\n", card, DECK_SZ / 4); if (card < DECK_SZ / 4) goto playsafe; } safe--; playit[i] = cango; } } if (!pp->can_go && !isrepair(pp->battle)) Numneed[opposite(pp->battle)]++; redoit: foundlow = (cango || count[C_END_LIMIT] != 0 || Numseen[C_LIMIT] == Numcards[C_LIMIT] || pp->safety[S_RIGHT_WAY] != S_UNKNOWN); foundend = FALSE; count200 = pp->nummiles[C_200]; badcount = 0; curmax = -1; curmin = 101; nummin = -1; nummax = -1; value = valbuf; for (i = 0; i < HAND_SZ; i++) { card = pp->hand[i]; if (issafety(card) || playit[i] == (cango != 0)) { if (Debug) fprintf(outf, "CALCMOVE: switch(\"%s\")\n", C_name[card]); switch (card) { case C_25: case C_50: diff = End - pp->mileage; /* avoid getting too close */ if (Topcard > Deck && cango && diff <= 100 && diff / Value[card] > count[card] && (card == C_25 || diff % 50 == 0)) { if (card == C_50 && diff - 50 == 25 && count[C_25] > 0) goto okay; *value = 0; if (--cango <= 0) goto redoit; break; } okay: *value = (Value[card] >> 3); if (pp->speed == C_LIMIT) ++*value; else --*value; if (!foundlow && (card == C_50 || count[C_50] == 0)) { *value = (pp->mileage ? 10 : 20); foundlow = TRUE; } goto miles; case C_200: if (++count200 > 2) { *value = 0; break; } case C_75: case C_100: *value = (Value[card] >> 3); if (pp->speed == C_LIMIT) --*value; else ++*value; miles: if (pp->mileage + Value[card] > End) *value = (End == 700 ? card : 0); else if (pp->mileage + Value[card] == End) { *value = (foundend ? card : V_VALUABLE); foundend = TRUE; } break; case C_END_LIMIT: if (pp->safety[S_RIGHT_WAY] != S_UNKNOWN) *value = (pp->safety[S_RIGHT_WAY] == S_PLAYED ? -1 : 1); else if (pp->speed == C_LIMIT && End - pp->mileage <= 50) *value = 1; else if (pp->speed == C_LIMIT || Numseen[C_LIMIT] != Numcards[C_LIMIT]) { safe = S_RIGHT_WAY; oppos = C_LIMIT; goto repair; } else { *value = 0; --count[C_END_LIMIT]; } break; case C_REPAIRS: case C_SPARE: case C_GAS: safe = safety(card) - S_CONV; oppos = opposite(card); if (pp->safety[safe] != S_UNKNOWN) *value = (pp->safety[safe] == S_PLAYED ? -1 : 1); else if (pp->battle != oppos && (Numseen[oppos] == Numcards[oppos] || Numseen[oppos] + count[card] > Numcards[oppos])) { *value = 0; --count[card]; } else { repair: *value = Numcards[oppos] * 6; *value += (Numseen[card] - Numseen[oppos]); if (!cango) *value /= (count[card]*count[card]); count[card]--; } break; case C_GO: if (pp->safety[S_RIGHT_WAY] != S_UNKNOWN) *value = (pp->safety[S_RIGHT_WAY] == S_PLAYED ? -1 : 2); else if (pp->can_go && Numgos + count[C_GO] == Numneed[C_GO]) { *value = 0; --count[C_GO]; } else { *value = Numneed[C_GO] * 3; *value += (Numseen[C_GO] - Numgos); *value /= (count[C_GO] * count[C_GO]); count[C_GO]--; } break; case C_LIMIT: if (op->mileage + 50 >= End) { *value = (End == 700 && !cango); break; } if (canstop || (cango && !op->can_go)) *value = 1; else { *value = (pp->safety[S_RIGHT_WAY] != S_UNKNOWN ? 2 : 3); safe = S_RIGHT_WAY; oppos = C_END_LIMIT; goto normbad; } break; case C_CRASH: case C_EMPTY: case C_FLAT: safe = safety(card) - S_CONV; oppos = opposite(card); *value = (pp->safety[safe]!=S_UNKNOWN ? 3 : 4); normbad: if (op->safety[safe] == S_PLAYED) *value = -1; else { *value *= (Numneed[oppos] + Numseen[oppos] + 2); if (!pp->mileage || foundend || onecard(op)) *value += 5; if (op->mileage == 0 || onecard(op)) *value += 5; if (op->speed == C_LIMIT) *value -= 3; if (cango && pp->safety[safe] != S_UNKNOWN) *value += 3; if (!cango) *value /= ++badcount; } break; case C_STOP: if (op->safety[S_RIGHT_WAY] == S_PLAYED) *value = -1; else { *value = (pp->safety[S_RIGHT_WAY] != S_UNKNOWN ? 3 : 4); *value *= (Numcards[C_STOP] + Numseen[C_GO]); if (!pp->mileage || foundend || onecard(op)) *value += 5; if (!cango) *value /= ++badcount; if (op->mileage == 0) *value += 5; if ((card == C_LIMIT && op->speed == C_LIMIT) || (!op->can_go)) *value -= 5; if (cango && pp->safety[S_RIGHT_WAY] != S_UNKNOWN) *value += 5; } break; case C_GAS_SAFE: case C_DRIVE_SAFE: case C_SPARE_SAFE: case C_RIGHT_WAY: *value = cango ? 0 : 101; break; case C_INIT: *value = 0; } } else *value = cango ? 0 : 101; if (card != C_INIT) { if (*value >= curmax) { nummax = i; curmax = *value; } if (*value <= curmin) { nummin = i; curmin = *value; } } if (Debug) mvprintw(i+6,2,"%3d %-14s",*value,C_name[pp->hand[i]]); value++; } if (!pp->can_go && !isrepair(pp->battle)) Numneed[opposite(pp->battle)]++; if (cango) { mvaddstr(MOVE_Y + 1, MOVE_X, "PLAY\n"); if (Debug) getmove(); if (!Debug || Movetype == M_DRAW) { Movetype = M_PLAY; Card_no = nummax; } } else { mvaddstr(MOVE_Y + 1, MOVE_X, "DISCARD\n"); if (Debug) getmove(); if (!Debug || Movetype == M_DRAW) { Movetype = M_DISCARD; Card_no = nummin; } } mvprintw(MOVE_Y + 2, MOVE_X, "%16s", C_name[pp->hand[Card_no]]); } onecard(pp) reg PLAY *pp; { reg CARD bat, spd, card; bat = pp->battle; spd = pp->speed; card = -1; if (pp->can_go || ((isrepair(bat) || bat == C_STOP || spd == C_LIMIT) && Numseen[S_RIGHT_WAY] != 0) || Numseen[safety(bat)] != 0) switch (End - pp->mileage) { case 200: if (pp->nummiles[C_200] == 2) return FALSE; card = C_200; case 100: case 75: if (card == -1) card = (End - pp->mileage == 75 ? C_75 : C_100); if (spd == C_LIMIT) return Numseen[S_RIGHT_WAY] == 0; case 50: case 25: if (card == -1) card = (End - pp->mileage == 25 ? C_25 : C_50); return Numseen[card] != Numcards[card]; } return FALSE; } canplay(pp, op, card) reg PLAY *pp, *op; reg CARD card; { switch (card) { case C_200: if (pp->nummiles[C_200] == 2) break; case C_75: case C_100: if (pp->speed == C_LIMIT) break; case C_50: if (pp->mileage + Value[card] > End) break; case C_25: if (pp->can_go) return TRUE; break; case C_EMPTY: case C_FLAT: case C_CRASH: case C_STOP: if (op->can_go && op->safety[safety(card) - S_CONV] != S_PLAYED) return TRUE; break; case C_LIMIT: if (op->speed != C_LIMIT && op->safety[S_RIGHT_WAY] != S_PLAYED && op->mileage + 50 < End) return TRUE; break; case C_GAS: case C_SPARE: case C_REPAIRS: if (pp->battle == opposite(card)) return TRUE; break; case C_GO: if (!pp->can_go && (isrepair(pp->battle) || pp->battle == C_STOP)) return TRUE; break; case C_END_LIMIT: if (pp->speed == C_LIMIT) return TRUE; } return FALSE; } //go.sysin dd * echo 'x - =test/=mille/end.c' sed 's/^X//' <<'//go.sysin dd *' >=test/=mille/end.c # include "mille.h" X/* * print out the score as if it was final, and add the totals for * the end-of-games points to the user who deserves it (if any). */ finalscore(pp) reg PLAY *pp; { reg int temp, tot, num; num = pp - Player; temp = num * 6 + 21 + 3; for (tot = 5; tot <= 9; tot++) mvaddch(tot, temp, '0'); if (pp->mileage == End) { temp -= 2; mvaddstr(5, temp, "40"); tot = SC_TRIP; if (pp->nummiles[C_200] == 0) { mvaddstr(6, temp, "30"); tot = SC_TRIP + SC_SAFE; } if (Topcard <= Deck) { mvaddstr(7, temp, "30"); tot += SC_DELAY; } if (End == 1000) { mvaddstr(8, temp, "20"); tot += SC_EXTENSION; } if (Player[other(num)].mileage == 0) { mvaddstr(9, temp, "50"); tot += SC_SHUT_OUT; } pp->total += tot; pp->hand_tot += tot; } } # ifdef EXTRAP static int Last_tot[2]; /* last tot used for extrapolate */ X/* * print out the score as if it was final, and add the totals for * the end-of-games points to the user who deserves it (if any). */ extrapolate(pp) reg PLAY *pp; { reg int x, num, tot, count; num = pp - Player; tot += SC_TRIP + SC_DELAY + SC_EXT; x = num * 6 + 21 + 3; for (tot = 5; tot <= 9; tot++) mvaddch(tot, x, '0'); x -= 2; pp = &Player[other(num)]; for (count = 0, tot = 0; tot < NUM_SAFE; tot++) if (pp->safety[tot] != S_PLAYED) count += SC_SAFE; mvprintw(3, x, "%3d", count); tot += count; if (count == 400) { mvaddstr(4, x, "30"); tot += SC_ALL_SAFE; } pp = &Player[num]; for (count = 0, tot = 0; tot < NUM_SAFE; tot++) if (pp->safety[tot] != S_PLAYED) count += SC_COUP / 10; mvprintw(4, x - 1, "%3d", count); tot += count; tot += 1000 - pp->mileage; mvaddstr(5, x, "40"); mvaddstr(7, x, "30"); mvaddstr(8, x, "20"); if (pp->nummiles[C_200] == 0) { mvaddstr(6, x, "30"); tot = SC_TRIP + SC_SAFE; } if (Player[other(num)].mileage == 0) { mvaddstr(9, x, "50"); tot += SC_SHUT_OUT; } pp->total += tot; pp->hand_tot += tot; Last_tot[num] = tot; } undoex() { reg PLAY *pp; reg int i; i = 0; for (pp = Player; pp < &Player[2]; pp++) { pp->total -= Last_tot[i]; pp->hand_tot -= Last_tot[i++]; } } # endif //go.sysin dd * echo 'x - =test/=mille/extern.c' sed 's/^X//' <<'//go.sysin dd *' >=test/=mille/extern.c # include "mille.h" bool Debug, /* set if debugging code on */ Finished, /* set if current hand is finished */ Next, /* set if changing players */ On_exit, /* set if game saved on exiting */ Order, /* set if hand should be sorted */ Saved; /* set if game just saved */ char *C_fmt = "%-18.18s", /* format for printing cards */ *Fromfile = NULL, /* startup file for game */ Initstr[100], /* initial string for error field */ *_cn[NUM_CARDS] = { /* Card name buffer */ "", "25", "50", "75", "100", "200", "Out of Gas", "Flat Tire", "Accident", "Stop", "Speed Limit", "Gasoline", "Spare Tire", "Repairs", "Go", "End of Limit", "Extra Tank", "Puncture Proof", "Driving Ace", "Right of Way" }, **C_name = &_cn[1]; /* Card names */ int Card_no, /* Card number for current move */ End, /* End value for current hand */ Handstart = COMP, /* Player who starts hand */ Movetype, /* Current move type */ Play, /* Current player */ Numgos, /* Number of Go cards used by computer */ Window = W_SMALL, /* Current window wanted */ Numseen[NUM_CARDS], /* Number of cards seen in current hand */ Value[NUM_MILES] = { /* Value of mileage cards */ 25, 50, 75, 100, 200 }, Numcards[NUM_CARDS] = { /* Number of cards in deck */ 10, /* C_25 */ 10, /* C_50 */ 10, /* C_75 */ 12, /* C_100 */ 4, /* C_200 */ 2, /* C_EMPTY */ 2, /* C_FLAT */ 2, /* C_CRASH */ 4, /* C_STOP */ 3, /* C_LIMIT */ 6, /* C_GAS */ 6, /* C_SPARE */ 6, /* C_REPAIRS */ 14, /* C_GO */ 6, /* C_END_LIMIT */ 1, /* C_GAS_SAFE */ 1, /* C_SPARE_SAFE */ 1, /* C_DRIVE_SAFE */ 1, /* C_RIGHT_WAY */ 0 /* C_INIT */ }; Numneed[NUM_CARDS] = { /* number of cards needed per hand */ 0, /* C_25 */ 0, /* C_50 */ 0, /* C_75 */ 0, /* C_100 */ 0, /* C_200 */ 2, /* C_EMPTY */ 2, /* C_FLAT */ 2, /* C_CRASH */ 4, /* C_STOP */ 3, /* C_LIMIT */ 2, /* C_GAS */ 2, /* C_SPARE */ 2, /* C_REPAIRS */ 10, /* C_GO */ 3, /* C_END_LIMIT */ 1, /* C_GAS_SAFE */ 1, /* C_SPARE_SAFE */ 1, /* C_DRIVE_SAFE */ 1, /* C_RIGHT_WAY */ 0 /* C_INIT */ }; CARD Discard, /* Top of discard pile */ *Topcard, /* Pointer to next card to be picked */ Opposite[NUM_CARDS] = { /* Opposites of each card */ C_25, C_50, C_75, C_100, C_200, C_GAS, C_SPARE, C_REPAIRS, C_GO, C_END_LIMIT, C_EMPTY, C_FLAT, C_CRASH, C_STOP, C_LIMIT, C_EMPTY, C_FLAT, C_CRASH, C_STOP, C_INIT }, Deck[DECK_SZ] = { /* Current deck */ C_25, C_25, C_25, C_25, C_25, C_25, C_25, C_25, C_25, C_25, C_50, C_50, C_50, C_50, C_50, C_50, C_50, C_50, C_50, C_50, C_75, C_75, C_75, C_75, C_75, C_75, C_75, C_75, C_75, C_75, C_100, C_100, C_100, C_100, C_100, C_100, C_100, C_100, C_100, C_100, C_100, C_100, C_200, C_200, C_200, C_200, C_EMPTY, C_EMPTY, C_FLAT, C_FLAT, C_CRASH, C_CRASH, C_STOP, C_STOP, C_STOP, C_STOP, C_LIMIT, C_LIMIT, C_LIMIT, C_GAS, C_GAS, C_GAS, C_GAS, C_GAS, C_GAS, C_SPARE, C_SPARE, C_SPARE, C_SPARE, C_SPARE, C_SPARE, C_REPAIRS, C_REPAIRS, C_REPAIRS, C_REPAIRS, C_REPAIRS, C_REPAIRS, C_END_LIMIT, C_END_LIMIT, C_END_LIMIT, C_END_LIMIT, C_END_LIMIT, C_END_LIMIT, C_GO, C_GO, C_GO, C_GO, C_GO, C_GO, C_GO, C_GO, C_GO, C_GO, C_GO, C_GO, C_GO, C_GO, C_GAS_SAFE, C_SPARE_SAFE, C_DRIVE_SAFE, C_RIGHT_WAY }; XFILE *outf; PLAY Player[2]; /* Player descriptions */ WINDOW *Board, /* Playing field screen */ *Miles, /* Mileage screen */ *Score; /* Score screen */ //go.sysin dd * echo 'x - =test/=mille/init.c' sed 's/^X//' <<'//go.sysin dd *' >=test/=mille/init.c # include "mille.h" init() { reg PLAY *pp; reg int i, j; reg CARD card; for (j = 0; j < C_RIGHT_WAY; j++) Numseen[j] = 0; Numgos = 0; for (i = 0; i < 2; i++) { pp = &Player[i]; pp->hand[0] = C_INIT; for (j = 0; j < NUM_SAFE; j++) { pp->safety[j] = S_UNKNOWN; pp->coups[j] = FALSE; } for (j = 1; j < HAND_SZ; j++) { pp->hand[j] = *--Topcard; if (i == COMP) { account(card = *Topcard); if (issafety(card)) pp->safety[card - S_CONV] = S_IN_HAND; } } pp->mileage = 0; pp->hand_tot = 0; pp->safescore = 0; pp->coupscore = 0; pp->can_go = FALSE; pp->speed = C_INIT; pp->battle = C_INIT; pp->new_speed = FALSE; pp->new_battle = FALSE; for (j = 0; j < NUM_MILES; j++) pp->nummiles[j] = 0; } if (Order) sort(Player[PLAYER].hand); Discard = C_INIT; Finished = FALSE; End = 700; } shuffle() { reg int i, r; reg CARD temp; for (i = 0; i < DECK_SZ; i++) { r = roll(1, DECK_SZ) - 1; if (r < 0 || r > DECK_SZ - 1) { fprintf(stderr, "shuffle: card no. error: %d\n", r); die(); } temp = Deck[r]; Deck[r] = Deck[i]; Deck[i] = temp; } Topcard = &Deck[DECK_SZ]; } newboard() { werase(Board); werase(Score); mvaddstr(5, 0, "--HAND--"); mvaddch(6, 0, 'P'); mvaddch(7, 0, '1'); mvaddch(8, 0, '2'); mvaddch(9, 0, '3'); mvaddch(10, 0, '4'); mvaddch(11, 0, '5'); mvaddch(12, 0, '6'); mvaddstr(13, 0, "--BATTLE--"); mvaddstr(15, 0, "--SPEED--"); mvaddstr(5, 20, "--DECK--"); mvaddstr(7, 20, "--DISCARD--"); mvaddstr(13, 20, "--BATTLE--"); mvaddstr(15, 20, "--SPEED--"); wmove(Miles, 0, 0); if (winch(Miles) != '-') { werase(Miles); mvwaddstr(Miles, 0, 0, "--MILEAGE--"); mvwaddstr(Miles, 0, 41, "--MILEAGE--"); } else { wmove(Miles, 1, 0); wclrtobot(Miles); } newscore(); stdscr = Board; } newscore() { reg int i; stdscr = Score; move(0, 22); if (inch() != 'Y') { erase(); mvaddstr(0, 22, "You Comp Value"); mvaddstr(1, 2, "Milestones Played"); mvaddstr(2, 8, "Each Safety"); mvaddstr(3, 5, "All 4 Safeties"); mvaddstr(4, 3, "Each Coup Fourre"); mvaddstr(2, 37, "100"); mvaddstr(3, 37, "300"); mvaddstr(4, 37, "300"); } else { move(5, 1); clrtobot(); } for (i = 0; i < SCORE_Y; i++) mvaddch(i, 0, '|'); move(SCORE_Y - 1, 1); while (addch('_') != ERR) continue; if (Window == W_FULL || Finished) { mvaddstr(5, 5, "Trip Completed"); mvaddstr(6, 10, "Safe Trip"); mvaddstr(7, 5, "Delayed Action"); mvaddstr(8, 10, "Extension"); mvaddstr(9, 11, "Shut-Out"); mvaddstr(10, 21, "---- ---- -----"); mvaddstr(11, 9, "Hand Total"); mvaddstr(12, 20, "----- -----"); mvaddstr(13, 6, "Overall Total"); mvaddstr(14, 15, "Games"); mvaddstr(5, 37, "400"); mvaddstr(6, 37, "300"); mvaddstr(7, 37, "300"); mvaddstr(8, 37, "200"); mvaddstr(9, 37, "500"); } else { mvaddstr(5, 21, "---- ---- -----"); mvaddstr(6, 9, "Hand Total"); mvaddstr(7, 20, "----- -----"); mvaddstr(8, 6, "Overall Total"); mvaddstr(9, 15, "Games"); mvaddstr(11, 2, "p: pick"); mvaddstr(12, 2, "u: use #"); mvaddstr(13, 2, "d: discard #"); mvaddstr(14, 2, "w: toggle window"); mvaddstr(11, 21, "q: quit"); mvaddstr(12, 21, "o: order hand"); mvaddstr(13, 21, "s: save"); mvaddstr(14, 21, "r: reprint"); } stdscr = Board; } //go.sysin dd * echo 'x - =test/=mille/mille.c' sed 's/^X//' <<'//go.sysin dd *' >=test/=mille/mille.c # include "mille.h" # include <signal.h> # include <term.h> int rub(); char _sobuf[BUFSIZ]; main(ac, av) reg int ac; reg char *av[]; { reg bool restore; # if 0 if (getuid() == GURP) { printf("%s: Permission denied\n", av[0]); exit(1); } # endif if (strcmp(av[0], "a.out") == 0) { outf = fopen("q", "w"); setbuf(outf, 0); Debug = TRUE; } restore = FALSE; # ifdef pdp11 if (geteuid() != ARNOLD) maxusers(MAXUSERS, NULL); # endif switch (ac) { case 2: rest_f(av[1]); restore = TRUE; case 1: break; default: printf("usage: milles [ restore_file ]\n"); exit(-1); /* NOTREACHED */ } setbuf(stdout, _sobuf); Play = PLAYER; initscr(); if (! cursor_address) { printf("Sorry. Need cursor addressing to play mille\n"); exit(-1); } delwin(stdscr); stdscr = Board = newwin(BOARD_Y, BOARD_X, 0, 0); Score = newwin(SCORE_Y, SCORE_X, 0, 40); Miles = newwin(MILES_Y, MILES_X, 17, 0); leaveok(Score, TRUE); leaveok(Miles, TRUE); clearok(curscr, TRUE); # ifndef PROF srand(getpid()); # else srand(0); # endif crmode(); noecho(); nonl(); signal(SIGINT, rub); for (;;) { if (!restore || (Player[PLAYER].total >= 5000 || Player[COMP].total >= 5000)) { if (Player[COMP].total < Player[PLAYER].total) Player[PLAYER].games++; else if (Player[COMP].total > Player[PLAYER].total) Player[COMP].games++; Player[COMP].total = 0; Player[PLAYER].total = 0; } do { if (!restore) Handstart = Play = other(Handstart); if (!restore || On_exit) { shuffle(); init(); } newboard(); if (restore) mvwaddstr(Score, ERR_Y, ERR_X, Initstr); prboard(); do { domove(); if (Finished) newscore(); prboard(); } while (!Finished); check_more(); restore = On_exit = FALSE; } while (Player[COMP].total < 5000 && Player[PLAYER].total < 5000); } } X/* * Routine to trap rubouts, and make sure they really want to * quit. */ rub() { signal(SIGINT, 1); if (getyn("Really? ")) die(); signal(SIGINT, rub); } X/* * Time to go beddy-by */ die() { signal(SIGINT, 1); if (outf) fflush(outf); mvcur(0, COLS - 1, LINES - 1, 0); endwin(); exit(1); } //go.sysin dd * echo 'x - =test/=mille/mille.h' sed 's/^X//' <<'//go.sysin dd *' >=test/=mille/mille.h # include <ctype.h> # include <curses.h> X/* * Miscellaneous constants */ # define unsgn unsigned # define reg register # define CARD short # ifdef vax # define ARNOLD 78 /* my uid */ # else # define ARNOLD 24601 /* my uid */ # endif # define GURP 28672 /* bad uid */ # define MAXUSERS 35 /* max # of users for startup */ # define HAND_SZ 7 /* number of cards in a hand */ # define DECK_SZ 101 /* number of cards in decks */ # define NUM_SAFE 4 /* number of saftey cards */ # define NUM_MILES 5 /* number of milestones types */ # define NUM_CARDS 20 /* number of types of cards */ # define BOARD_Y 17 /* size of board screen */ # define BOARD_X 40 # define MILES_Y 7 /* size of mileage screen */ # define MILES_X 80 # define SCORE_Y 17 /* size of score screen */ # define SCORE_X 40 # define MOVE_Y 10 /* Where to print move prompt */ # define MOVE_X 20 # define ERR_Y 15 /* Where to print errors */ # define ERR_X 5 # define EXT_Y 4 /* Where to put Extension */ # define EXT_X 9 # define PLAYER 0 # define COMP 1 # define W_SMALL 0 /* Small (initial) window */ # define W_FULL 1 /* Full (final) window */ X/* * Move types */ # define M_DISCARD 0 # define M_DRAW 1 # define M_PLAY 2 # define M_ORDER 3 X/* * Scores */ # define SC_SAFETY 100 # define SC_ALL_SAFE 300 # define SC_COUP 300 # define SC_TRIP 400 # define SC_SAFE 300 # define SC_DELAY 300 # define SC_EXTENSION 200 # define SC_SHUT_OUT 500 X/* * safety descriptions */ # define S_UNKNOWN 0 /* location of safety unknown */ # define S_IN_HAND 1 /* safety in player's hand */ # define S_PLAYED 2 /* safety has been played */ # define S_GAS_SAFE 0 /* Gas safety card index */ # define S_SPARE_SAFE 1 /* Tire safety card index */ # define S_DRIVE_SAFE 2 /* Driveing safety card index */ # define S_RIGHT_WAY 3 /* Right-of-Way card index */ # define S_CONV 15 /* conversion from C_ to S_ */ X/* * card numbers */ # define C_INIT -1 # define C_25 0 # define C_50 1 # define C_75 2 # define C_100 3 # define C_200 4 # define C_EMPTY 5 # define C_FLAT 6 # define C_CRASH 7 # define C_STOP 8 # define C_LIMIT 9 # define C_GAS 10 # define C_SPARE 11 # define C_REPAIRS 12 # define C_GO 13 # define C_END_LIMIT 14 # define C_GAS_SAFE 15 # define C_SPARE_SAFE 16 # define C_DRIVE_SAFE 17 # define C_RIGHT_WAY 18 typedef struct { bool coups[NUM_SAFE]; bool can_go; bool new_battle; bool new_speed; short safety[NUM_SAFE]; short nummiles[NUM_MILES]; CARD hand[HAND_SZ]; CARD battle; CARD speed; int mileage; int hand_tot; int safescore; int coupscore; int total; int games; } PLAY; X/* * macros */ # define other(x) (1 - x) # define nextplay() (Play = other(Play)) # define nextwin(x) (1 - x) # define opposite(x) (Opposite[x]) # define issafety(x) (x >= C_GAS_SAFE) X/* * externals */ extern bool Debug, Finished, Next, On_exit, Order, Saved; extern char *C_fmt, **C_name, *Fromfile, Initstr[]; extern int Card_no, End, Handstart, Movetype, Numcards[], Numgos, Numneed[], Numseen[NUM_CARDS], Play, Value[], Window; extern CARD Deck[DECK_SZ], Discard, Opposite[NUM_CARDS], *Topcard; extern FILE *outf; extern PLAY Player[2]; extern WINDOW *Board, *Miles, *Score; X/* * functions */ CARD getcard(); //go.sysin dd * echo 'x - =test/=mille/misc.c' sed 's/^X//' <<'//go.sysin dd *' >=test/=mille/misc.c #include "mille.h" #include "unctrl.h" #define NUMSAFE 4 X/* VARARGS1 */ error(str, arg) char *str; { stdscr = Score; mvprintw(ERR_Y, ERR_X, str, arg); clrtoeol(); putchar(''); refresh(); stdscr = Board; return FALSE; } CARD getcard() { reg char c, c1; for (;;) { while ((c = getch()) == '\n' || c == '\r' || c == ' ') continue; if (islower(c)) c = toupper(c); if (c == killchar() || c == erasechar()) return -1; addstr(unctrl(c)); clrtoeol(); switch (c) { case '1': case '2': case '3': case '4': case '5': case '6': c -= '0'; break; case '0': case 'P': case 'p': c = 0; break; default: putchar(''); addch('\b'); if (!isprint(c)) addch('\b'); c = -1; break; } refresh(); if (c >= 0) { while ((c1=getch()) != '\r' && c1 != '\n' && c1 != ' ') if (c1 == killchar()) return -1; else if (c1 == erasechar()) { addch('\b'); clrtoeol(); refresh(); goto cont; } else write(0, "", 1); return c; } cont: ; } } check_ext(forcomp) reg bool forcomp; { if (End == 700) if (Play == PLAYER) { if (getyn("Extension? ")) { extend: if (!forcomp) End = 1000; return TRUE; } else { done: if (!forcomp) Finished = TRUE; return FALSE; } } else { reg PLAY *pp, *op; reg int i, safe, miles; pp = &Player[COMP]; op = &Player[PLAYER]; for (safe = 0, i = 0; i < NUMSAFE; i++) if (pp->safety[i] != S_UNKNOWN) safe++; if (safe < 2) goto done; if (op->mileage == 0 || onecard(op) || (op->can_go && op->mileage >= 500)) goto done; for (miles = 0, i = 0; i < NUMSAFE; i++) if (op->safety[i] != S_PLAYED && pp->safety[i] == S_UNKNOWN) miles++; if (miles + safe == NUMSAFE) goto extend; for (miles = 0, i = 0; i < HAND_SZ; i++) if ((safe = pp->hand[i]) <= C_200) miles += Value[safe]; if (miles + (Topcard - Deck) * 3 > 1000) goto extend; goto done; } else goto done; } X/* * Get a yes or no answer to the given question. Saves are * also allowed. Return TRUE if the answer was yes, FALSE if no. */ getyn(prompt) reg char *prompt; { reg char c; Saved = FALSE; for (;;) { leaveok(Board, FALSE); mvaddstr(MOVE_Y, MOVE_X, prompt); clrtoeol(); refresh(); switch (c = getch()) { case 'n': case 'N': addch('N'); refresh(); leaveok(Board, TRUE); return FALSE; case 'y': case 'Y': addch('Y'); refresh(); leaveok(Board, TRUE); return TRUE; case 's': case 'S': addch('S'); refresh(); Saved = save(); continue; default: addstr(unctrl(c)); refresh(); putchar(''); break; } } } X/* * Check to see if more games are desired. If not, and game * came from a saved file, make sure that they don't want to restore * it. Exit appropriately. */ check_more() { raw(); /* Flush input */ noraw(); On_exit = TRUE; if (Player[PLAYER].total >= 5000 || Player[COMP].total >= 5000) if (getyn("Another game? ")) return; else { /* * must do accounting normally done in main() */ if (Player[PLAYER].total > Player[COMP].total) Player[PLAYER].games++; else if (Player[PLAYER].total < Player[COMP].total) Player[COMP].games++; Player[COMP].total = 0; Player[PLAYER].total = 0; } else if (getyn("Another hand? ")) return; if (!Saved && getyn("Save game? ")) if (!save()) return; die(); } //go.sysin dd * echo 'x - =test/=mille/move.c' sed 's/^X//' <<'//go.sysin dd *' >=test/=mille/move.c #include "mille.h" #include "unctrl.h" #define CTRL(c) (c - 'A' + 1) char *Movenames[] = { "M_DISCARD", "M_DRAW", "M_PLAY", "M_ORDER" }; domove() { reg PLAY *pp; reg int i, j; reg bool goodplay; pp = &Player[Play]; if (Play == PLAYER) getmove(); else calcmove(); Next = FALSE; goodplay = TRUE; switch (Movetype) { case M_DISCARD: if (haspicked(pp)) { if (pp->hand[Card_no] == C_INIT) if (Card_no == 6) Finished = TRUE; else error("no card there"); else { Discard = pp->hand[Card_no]; pp->hand[Card_no] = C_INIT; Next = TRUE; if (Play == PLAYER) account(Discard); } } else error("must pick first"); break; case M_PLAY: goodplay = playcard(pp); break; case M_DRAW: Card_no = 0; if (Topcard <= Deck) error("no more cards"); else if (haspicked(pp)) error("already picked"); else { pp->hand[0] = *--Topcard; if (Debug) fprintf(outf, "DOMOVE: Draw %s\n", C_name[*Topcard]); acc: if (Play == COMP) { account(*Topcard); if (issafety(*Topcard)) pp->safety[*Topcard-S_CONV] = S_IN_HAND; } if (pp->hand[1] == C_INIT && Topcard > Deck) { Card_no = 1; pp->hand[1] = *--Topcard; if (Debug) fprintf(outf, "DOMOVE: Draw %s\n", C_name[*Topcard]); goto acc; } pp->new_battle = FALSE; pp->new_speed = FALSE; } break; case M_ORDER: break; } /* * move blank card to top by one of two methods. If the * computer's hand was sorted, the randomness for picking * between equally valued cards would be lost */ if (Order && Movetype != M_DRAW && goodplay && pp == &Player[PLAYER]) sort(pp->hand); else for (i = 1; i < HAND_SZ; i++) if (pp->hand[i] == C_INIT) { for (j = 0; pp->hand[j] == C_INIT; j++) if (j >= HAND_SZ) { j = 0; break; } pp->hand[i] = pp->hand[j]; pp->hand[j] = C_INIT; } if (Topcard <= Deck) check_go(); if (Next) nextplay(); } X/* * Check and see if either side can go. If they cannot, * the game is over */ check_go() { reg CARD card; reg PLAY *pp, *op; reg int i; for (pp = Player; pp < &Player[2]; pp++) { op = (pp == &Player[COMP] ? &Player[PLAYER] : &Player[COMP]); for (i = 0; i < HAND_SZ; i++) { card = pp->hand[i]; if (issafety(card) || canplay(pp, op, card)) { if (Debug) { fprintf(outf, "CHECK_GO: can play %s (%d), ", C_name[card], card); fprintf(outf, "issafety(card) = %d, ", issafety(card)); fprintf(outf, "canplay(pp, op, card) = %d\n", canplay(pp, op, card)); } return; } else if (Debug) fprintf(outf, "CHECK_GO: cannot play %s\n", C_name[card]); } } Finished = TRUE; } playcard(pp) reg PLAY *pp; { reg int v; reg CARD card; /* * check and see if player has picked */ switch (pp->hand[Card_no]) { default: if (!haspicked(pp)) mustpick: return error("must pick first"); case C_GAS_SAFE: case C_SPARE_SAFE: case C_DRIVE_SAFE: case C_RIGHT_WAY: break; } card = pp->hand[Card_no]; if (Debug) fprintf(outf, "PLAYCARD: Card = %s\n", C_name[card]); Next = FALSE; switch (card) { case C_200: if (pp->nummiles[C_200] == 2) return error("only two 200's per hand"); case C_100: case C_75: if (pp->speed == C_LIMIT) return error("limit of 50"); case C_50: if (pp->mileage + Value[card] > End) return error("puts you over %d", End); case C_25: if (!pp->can_go) return error("cannot move now"); pp->nummiles[card]++; v = Value[card]; pp->total += v; pp->hand_tot += v; if ((pp->mileage += v) == End) check_ext(FALSE); break; case C_GAS: case C_SPARE: case C_REPAIRS: if (pp->battle != opposite(card)) return error("can't play \"%s\"", C_name[card]); pp->battle = card; if (pp->safety[S_RIGHT_WAY] == S_PLAYED) pp->can_go = TRUE; break; case C_GO: if (pp->battle != C_INIT && pp->battle != C_STOP && !isrepair(pp->battle)) return error("cannot play \"Go\" on a \"%s\"", C_name[pp->battle]); pp->battle = C_GO; pp->can_go = TRUE; break; case C_END_LIMIT: if (pp->speed != C_LIMIT) return error("not limited"); pp->speed = C_END_LIMIT; break; case C_EMPTY: case C_FLAT: case C_CRASH: case C_STOP: pp = &Player[other(Play)]; if (!pp->can_go) return error("opponent cannot go"); else if (pp->safety[safety(card) - S_CONV] == S_PLAYED) protected: return error("opponent is protected"); pp->battle = card; pp->new_battle = TRUE; pp->can_go = FALSE; pp = &Player[Play]; break; case C_LIMIT: pp = &Player[other(Play)]; if (pp->speed == C_LIMIT) return error("opponent has limit"); if (pp->safety[S_RIGHT_WAY] == S_PLAYED) goto protected; pp->speed = C_LIMIT; pp->new_speed = TRUE; pp = &Player[Play]; break; case C_GAS_SAFE: case C_SPARE_SAFE: case C_DRIVE_SAFE: case C_RIGHT_WAY: if (pp->battle == opposite(card) || (card == C_RIGHT_WAY && pp->speed == C_LIMIT)) { if (!(card == C_RIGHT_WAY && !isrepair(pp->battle))) { pp->battle = C_GO; pp->can_go = TRUE; } if (card == C_RIGHT_WAY && pp->speed == C_LIMIT) pp->speed = C_INIT; if (pp->new_battle || (pp->new_speed && card == C_RIGHT_WAY)) { pp->coups[card - S_CONV] = TRUE; pp->total += SC_COUP; pp->hand_tot += SC_COUP; pp->coupscore += SC_COUP; } } /* * if not coup, must pick first */ else if (pp->hand[0] == C_INIT && Topcard > Deck) goto mustpick; pp->safety[card - S_CONV] = S_PLAYED; pp->total += SC_SAFETY; pp->hand_tot += SC_SAFETY; if ((pp->safescore += SC_SAFETY) == NUM_SAFE * SC_SAFETY) { pp->total += SC_ALL_SAFE; pp->hand_tot += SC_ALL_SAFE; } if (card == C_RIGHT_WAY) { if (pp->speed == C_LIMIT) pp->speed = C_INIT; if (pp->battle == C_STOP || pp->battle == C_INIT) { pp->can_go = TRUE; pp->battle = C_INIT; } if (!pp->can_go && isrepair(pp->battle)) pp->can_go = TRUE; } Next = -1; break; case C_INIT: error("no card there"); Next = -1; break; } if (pp == &Player[PLAYER]) account(card); pp->hand[Card_no] = C_INIT; Next = (Next == -1 ? FALSE : TRUE); return TRUE; } getmove() { reg char c, *sp; static char moveprompt[] = ">>:Move:"; #ifdef EXTRAP static bool last_ex = FALSE; /* set if last command was E */ if (last_ex) { undoex(); prboard(); last_ex = FALSE; } #endif for (;;) { stand(MOVE_Y, MOVE_X, moveprompt); clrtoeol(); move(MOVE_Y, MOVE_X + sizeof moveprompt); leaveok(Board, FALSE); refresh(); while ((c = getch()) == killchar() || c == erasechar()) continue; if (islower(c)) c = toupper(c); if (isprint(c) && !isspace(c)) { addch(c); refresh(); } switch (c) { case 'P': /* Pick */ Movetype = M_DRAW; goto ret; case 'U': /* Use Card */ case 'D': /* Discard Card */ if ((Card_no = getcard()) < 0) break; Movetype = (c == 'U' ? M_PLAY : M_DISCARD); goto ret; case 'O': /* Order */ Order = !Order; Movetype = M_ORDER; goto ret; case 'Q': /* Quit */ rub(); /* Same as a rubout */ break; case 'W': /* Window toggle */ Window = nextwin(Window); newscore(); prscore(TRUE); wrefresh(Score); break; case 'R': /* Redraw screen */ case CTRL('L'): clearok(curscr, TRUE); newboard(); prboard(); break; case 'S': /* Save game */ On_exit = FALSE; save(); break; case 'E': /* Extrapolate */ #ifdef EXTRAP if (last_ex) break; Finished = TRUE; if (Window != W_FULL) newscore(); prscore(FALSE); wrefresh(Score); last_ex = TRUE; Finished = FALSE; #else error("%c: command not implemented", c); #endif break; case '\r': /* Ignore RETURNs and */ case '\n': /* Line Feeds */ case ' ': /* and Spaces */ break; case 'Z': /* Debug code */ if (geteuid() == ARNOLD) { if (!Debug && outf == NULL) { char buf[40]; over: mvaddstr(MOVE_Y, MOVE_X, "file: "); clrtoeol(); leaveok(Board, FALSE); refresh(); sp = buf; while ((*sp = getch()) != '\n') { if (*sp == killchar()) goto over; else if (*sp == erasechar()) { if (--sp < buf) sp = buf; else { addch('\b'); if (*sp < ' ') addch('\b'); clrtoeol(); } } else addstr(unctrl(*sp++)); refresh(); } *sp = '\0'; leaveok(Board, TRUE); if ((outf = fopen(buf, "w")) == NULL) perror(buf); setbuf(outf, 0); } Debug = !Debug; break; } /* FALLTHROUGH */ default: error("unknown command: %s", unctrl(c)); break; } } ret: leaveok(Board, TRUE); } X/* * return whether or not the player has picked */ haspicked(pp) reg PLAY *pp; { reg int card; if (Topcard <= Deck) return TRUE; switch (pp->hand[Card_no]) { case C_GAS_SAFE: case C_SPARE_SAFE: case C_DRIVE_SAFE: case C_RIGHT_WAY: card = 1; break; default: card = 0; break; } return (pp->hand[card] != C_INIT); } account(card) reg CARD card; { reg CARD oppos; if (card == C_INIT) return; ++Numseen[card]; if (Play == COMP) switch (card) { case C_GAS_SAFE: case C_SPARE_SAFE: case C_DRIVE_SAFE: oppos = opposite(card); Numgos += Numcards[oppos] - Numseen[oppos]; break; case C_CRASH: case C_FLAT: case C_EMPTY: case C_STOP: Numgos++; break; } } sort(hand) reg CARD *hand; { reg CARD *cp, *tp; reg int j; reg CARD temp; cp = hand; hand += HAND_SZ; for ( ; cp < &hand[-1]; cp++) for (tp = cp + 1; tp < hand; tp++) if (*cp > *tp) { temp = *cp; *cp = *tp; *tp = temp; } } //go.sysin dd * echo 'x - =test/=mille/print.c' sed 's/^X//' <<'//go.sysin dd *' >=test/=mille/print.c # include "mille.h" # define COMP_STRT 20 # define CARD_STRT 2 prboard() { reg PLAY *pp; reg int i, j, k, temp; for (k = 0; k < 2; k++) { pp = &Player[k]; temp = k * COMP_STRT + CARD_STRT; for (i = 0; i < NUM_SAFE; i++) if (pp->safety[i] == S_PLAYED) { mvaddstr(i, temp, C_name[i + S_CONV]); if (pp->coups[i]) mvaddch(i, temp - CARD_STRT, '*'); } mvprintw(14, temp, C_fmt, C_name[pp->battle]); mvprintw(16, temp, C_fmt, C_name[pp->speed]); for (i = C_25; i <= C_200; ) { reg char *name; reg int end; name = C_name[i]; temp = k * 40; end = pp->nummiles[i++]; for (j = 0; j < end; j++) mvwaddstr(Miles, i, (j << 2) + temp, name); } } prscore(TRUE); temp = CARD_STRT; pp = &Player[PLAYER]; for (i = 0; i < HAND_SZ; i++) mvprintw(i + 6, temp, C_fmt, C_name[pp->hand[i]]); mvprintw(6, COMP_STRT + CARD_STRT, "%2d", Topcard - Deck); mvprintw(8, COMP_STRT + CARD_STRT, C_fmt, C_name[Discard]); if (End == 1000) { static char ext[] = "Extension"; stand(EXT_Y, EXT_X, ext); } wrefresh(Board); wrefresh(Miles); wrefresh(Score); } X/* * Put str at (y,x) in standout mode */ stand(y, x, str) reg int y, x; reg char *str; { standout(); mvaddstr(y, x, str); standend(); return TRUE; } prscore(for_real) reg bool for_real; { reg PLAY *pp; reg int x; reg char *Score_fmt = "%4d"; stdscr = Score; for (pp = Player; pp < &Player[2]; pp++) { x = (pp - Player) * 6 + 21; mvprintw(1, x, Score_fmt, pp->mileage); mvprintw(2, x, Score_fmt, pp->safescore); if (pp->safescore == 400) mvaddstr(3, x + 1, "300"); else mvaddch(3, x + 3, '0'); mvprintw(4, x, Score_fmt, pp->coupscore); if (Window == W_FULL || Finished) { #ifdef EXTRAP if (for_real) finalscore(pp); else extrapolate(pp); #else finalscore(pp); #endif mvprintw(11, x, Score_fmt, pp->hand_tot); mvprintw(13, x, Score_fmt, pp->total); mvprintw(14, x, Score_fmt, pp->games); } else { mvprintw(6, x, Score_fmt, pp->hand_tot); mvprintw(8, x, Score_fmt, pp->total); mvprintw(9, x, Score_fmt, pp->games); } } stdscr = Board; } //go.sysin dd * echo 'x - =test/=mille/roll.c' sed 's/^X//' <<'//go.sysin dd *' >=test/=mille/roll.c X/* * This routine rolls ndie nside-sided dice. */ # define reg register # ifndef vax # define MAXRAND 32767L roll(ndie, nsides) int ndie, nsides; { reg long tot; reg unsigned n, r; tot = 0; n = ndie; while (n--) tot += rand(); return (int) ((tot * (long) nsides) / ((long) MAXRAND + 1)) + ndie; } # else roll(ndie, nsides) reg int ndie, nsides; { reg int tot, r; reg double num_sides; num_sides = nsides; tot = 0; while (ndie--) tot += (r = rand()) * (num_sides / 017777777777) + 1; return tot; } # endif //go.sysin dd * echo 'x - =test/=mille/save.c' sed 's/^X//' <<'//go.sysin dd *' >=test/=mille/save.c #include "mille.h" #include "unctrl.h" #include <sys/types.h> #include <sys/stat.h> #include <time.h> typedef struct stat STAT; typedef struct tm TIME; char *ctime(); int read(), write(); X/* * This routine saves the current game for use at a later date */ extern int errno; extern char *sys_errlist[]; save() { reg char *sp; reg int outf; reg TIME *tp; char buf[80]; TIME tme; STAT junk; tp = &tme; if (Fromfile && getyn("Same file? ")) strcpy(buf, Fromfile); else { over: mvaddstr(MOVE_Y, MOVE_X, "file: "); clrtoeol(); leaveok(Board, FALSE); refresh(); #ifdef UNDEFINED sp = buf; while ((*sp = getch()) != '\n') { if (*sp == killchar()) goto over; else if (*sp == erasechar()) { if (--sp < buf) sp = buf; else { addch('\b'); /* * if the previous char was a control * char, cover up two characters. */ if (*sp < ' ') addch('\b'); clrtoeol(); } } else addstr(unctrl(*sp++)); refresh(); } *sp = '\0'; #else getstr(buf); #endif leaveok(Board, TRUE); } /* * check for existing files, and confirm overwrite if needed */ if (sp == buf || (!Fromfile && stat(buf, &junk) > -1 && getyn("Overwrite File? ") == FALSE)) return FALSE; if ((outf = creat(buf, 0644)) < 0) { error(sys_errlist[errno]); return FALSE; } mvwaddstr(Score, ERR_Y, ERR_X, buf); wrefresh(Score); time(tp); /* get current time */ strcpy(buf, ctime(tp)); for (sp = buf; *sp != '\n'; sp++) continue; *sp = '\0'; varpush(outf, write); close(outf); wprintw(Score, " [%s]", buf); wclrtoeol(Score); wrefresh(Score); return TRUE; } X/* * This does the actual restoring. It returns TRUE if the * backup was made on exiting, in which case certain things must * be cleaned up before the game starts. */ rest_f(file) reg char *file; { reg char *sp; reg int inf; char buf[80]; STAT sbuf; if ((inf = open(file, 0)) < 0) { perror(file); exit(1); } if (fstat(inf, &sbuf) < 0) { /* get file stats */ perror(file); exit(1); } varpush(inf, read); close(inf); strcpy(buf, ctime(&sbuf.st_mtime)); for (sp = buf; *sp != '\n'; sp++) continue; *sp = '\0'; /* * initialize some necessary values */ sprintf(Initstr, "%s [%s]\n", file, buf); Fromfile = file; return !On_exit; } //go.sysin dd * echo 'x - =test/=mille/table.c' sed 's/^X//' <<'//go.sysin dd *' >=test/=mille/table.c # define DEBUG # include "mille.h" main() { reg int i, j, count; printf(" %16s -> %5s %5s %4s %s\n", "Card", "cards", "count", "need", "opposite"); for (i = 0; i < NUM_CARDS - 1; i++) { for (j = 0, count = 0; j < DECK_SZ; j++) if (Deck[j] == i) count++; printf("%2d %16s -> %5d %5d %4d %s\n", i, C_name[i], Numcards[i], count, Numneed[i], C_name[opposite(i)]); } } //go.sysin dd * echo 'x - =test/=mille/types.c' sed 's/^X//' <<'//go.sysin dd *' >=test/=mille/types.c # include "mille.h" isrepair(card) reg CARD card; { return card == C_GAS || card == C_SPARE || card == C_REPAIRS || card == C_INIT; } safety(card) reg CARD card; { switch (card) { case C_EMPTY: case C_GAS: case C_GAS_SAFE: return C_GAS_SAFE; case C_FLAT: case C_SPARE: case C_SPARE_SAFE: return C_SPARE_SAFE; case C_CRASH: case C_REPAIRS: case C_DRIVE_SAFE: return C_DRIVE_SAFE; case C_GO: case C_STOP: case C_RIGHT_WAY: case C_LIMIT: case C_END_LIMIT: return C_RIGHT_WAY; } /* NOTREACHED */ } //go.sysin dd * echo 'x - =test/=mille/unctrl.h' sed 's/^X//' <<'//go.sysin dd *' >=test/=mille/unctrl.h # include <stdio.h> # define unctrl(ch) (_unctrl[ch]) extern char *_unctrl[]; //go.sysin dd * echo 'x - =test/=mille/varpush.c' sed 's/^X//' <<'//go.sysin dd *' >=test/=mille/varpush.c # include "mille.h" int read(), write(); X/* * push variables around via the routine func() on the file * channel file. func() is either read or write. */ varpush(file, func) reg int file; reg int (*func)(); { int temp; (*func)(file, &Debug, sizeof Debug); (*func)(file, &Finished, sizeof Finished); (*func)(file, &Order, sizeof Order); (*func)(file, &End, sizeof End); (*func)(file, &On_exit, sizeof On_exit); (*func)(file, &Handstart, sizeof Handstart); (*func)(file, &Numgos, sizeof Numgos); (*func)(file, Numseen, sizeof Numseen); (*func)(file, &Play, sizeof Play); (*func)(file, &Window, sizeof Window); (*func)(file, Deck, sizeof Deck); (*func)(file, &Discard, sizeof Discard); (*func)(file, Player, sizeof Player); if (func == read) { read(file, &temp, sizeof temp); Topcard = &Deck[temp]; if (Debug) { char buf[80]; over: printf("Debug file:"); gets(buf); if ((outf = fopen(buf, "w")) == NULL) { perror(buf); goto over; } if (strcmp(buf, "/dev/null") != 0) setbuf(outf, 0); } } else { temp = Topcard - Deck; write(file, &temp, sizeof temp); } } //go.sysin dd * exit