diff options
Diffstat (limited to 'usr.bin/window')
106 files changed, 16397 insertions, 0 deletions
diff --git a/usr.bin/window/:tt b/usr.bin/window/:tt new file mode 100644 index 0000000..7ec4352 --- /dev/null +++ b/usr.bin/window/:tt @@ -0,0 +1,11 @@ +./"init"16t"end"n2p ++/"move"16t"insline"16t"delline"16t"delchar"n4p ++/"write"16t"putc"16tn2p ++/"clreol"16t"clreos"16t"clear"n3p ++/"scroll_down"16t"scroll_up"16t"setscroll"n3p ++/"setinsert"16t"setmodes"n2p ++/"modes"8t"nmodes"8t"insert"8t"ninsert"n4b ++/"row"16t"col"16t"scrtop"16t"sclbot"n4D ++/"nrow"16t"ncol"16t"hasins"8t"avlmods"8t"wrap"8t"retain"n2D4b ++/"frame" +*./16b diff --git a/usr.bin/window/:tty b/usr.bin/window/:tty new file mode 100644 index 0000000..2eb61ef --- /dev/null +++ b/usr.bin/window/:tty @@ -0,0 +1,6 @@ +./"sgttyb:"8t"ispeed"8t"ospeed"8t"erase"8t"kill"8t"flags"n8tbbC8tC8tx ++/"tchars:"8t"intrc"8t"quitc"8t"startc"8t"stopc"8t"eofc"8t"brkc" ++/8tC8tC8tC8tC8tC8tC ++/"ltchars:suspc"8t"dsuspc"8t"rprntc"8t"flushc"8t"werasc"8t"lnextc" ++/8tC8tC8tC8tC8tC8tC2+ ++/"lmode"16t"ldisc"16t"fflags"nXDX diff --git a/usr.bin/window/:var b/usr.bin/window/:var new file mode 100644 index 0000000..ff3de6b --- /dev/null +++ b/usr.bin/window/:var @@ -0,0 +1,2 @@ +./"left"16t"right"16t"v_type"8t"v_val"npp4+b3+x +*(.+8)/"name: "S diff --git a/usr.bin/window/:ww b/usr.bin/window/:ww new file mode 100644 index 0000000..0e99f0a --- /dev/null +++ b/usr.bin/window/:ww @@ -0,0 +1,19 @@ +./"state"8t"oflags"nbb++ ++/"forw"16t"back"16t"index"8t"order"nppbb++ ++/"w.nr"16t"w.nc"nDD ++/"w.t"16t"w.b"16t"w.l"16t"w.r"nDDDD ++/"b.nr"16t"b.nc"nDD ++/"b.t"16t"b.b"16t"b.l"16t"b.r"nDDDD ++/"i.nr"16t"i.nc"nDD ++/"i.t"16t"i.b"16t"i.l"16t"i.r"nDDDD ++/"cur.r"16t"cur.c"nDD ++/"win"16t"buf"16t"fmap"16t"nvis"npppp ++/"wstate"8t"modes"8t"insert"8t"mapnl"8t"noupd"n5b ++/"unctrl"8t"nointr"8t"hascurs"8t"hasframe"n4b ++/"ispty"8t"stopped"8t"pty"16t"socket"16t"pid"nbb+3D ++/"ttyname"n11C+ ++/"ob"16t"obe"16t"obp"16t"obq"n4p ++/"center"8t"id"8t"label"nbb++p ++/"alt.nr"16t"alt.nc"nDD ++/"alt.t"16t"alt.b"16t"alt.l"16t"alt.r"nDDDD ++/t diff --git a/usr.bin/window/Makefile b/usr.bin/window/Makefile new file mode 100644 index 0000000..53ab6da --- /dev/null +++ b/usr.bin/window/Makefile @@ -0,0 +1,22 @@ +# @(#)Makefile 8.1 (Berkeley) 6/6/93 + +PROG= window +CFLAGS+=-R -DVMIN_BUG +SRCS= char.c cmd.c cmd1.c cmd2.c cmd3.c cmd4.c cmd5.c cmd6.c cmd7.c \ + context.c error.c lcmd.c lcmd1.c lcmd2.c main.c mloop.c parser1.c \ + parser2.c parser3.c parser4.c parser5.c scanner.c startup.c string.c \ + ttf100.c ttgeneric.c tth19.c tth29.c ttinit.c ttoutput.c tttermcap.c \ + tttvi925.c ttwyse60.c ttwyse75.c ttzapple.c ttzentec.c var.c win.c \ + wwadd.c wwalloc.c wwbox.c wwchild.c wwclose.c wwclreol.c wwclreos.c \ + wwcursor.c wwdata.c wwdelchar.c wwdelete.c wwdelline.c wwdump.c \ + wwend.c wwenviron.c wwerror.c wwflush.c wwframe.c wwgets.c wwinit.c \ + wwinschar.c wwinsline.c wwiomux.c wwlabel.c wwmisc.c wwmove.c \ + wwopen.c wwprintf.c wwpty.c wwputc.c wwputs.c wwredraw.c \ + wwredrawwin.c wwrint.c wwscroll.c wwsize.c wwspawn.c wwsuspend.c \ + wwterminfo.c wwtty.c wwunframe.c wwupdate.c wwwrite.c xx.c xxflush.c \ + compress.c +MAN= window.0 +DPADD= ${LIBTERMCAP} +LDADD= -ltermcap + +.include <bsd.prog.mk> diff --git a/usr.bin/window/README b/usr.bin/window/README new file mode 100644 index 0000000..42d45b3 --- /dev/null +++ b/usr.bin/window/README @@ -0,0 +1,199 @@ +/*- + * Copyright (c) 1990, 1993 + * The Regents of the University of California. All rights reserved. + * + * This code is derived from software contributed to Berkeley by + * Edward Wang at The University of California, Berkeley. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. All advertising materials mentioning features or use of this software + * must display the following acknowledgement: + * This product includes software developed by the University of + * California, Berkeley and its contributors. + * 4. Neither the name of the University nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * @(#)README 8.1 (Berkeley) 6/6/93 + */ + +Compilation notes: + + Compiler options: + + BYTE_ORDER (used only in ww.h) + It should already be defined in machine/endian.h. + The code knows about BIG_ENDIAN, LITTLE_ENDIAN, and PDP_ENDIAN. + It only cares about byte order in words, so PDP_ENDIAN + is the same as LITTLE_ENDIAN. + OLD_TTY + If you don't have Posix termios, then define this. + VMIN_BUG + Even if you have Posix termios, define this if the MIN and TIME + feature in noncanonical mode doesn't work correctly. + + Ok, there's another one, STR_DEBUG. It turns on consistency checks + in the string allocator. It's been left on since performace doesn't + seem to suffer. There's an abort() somewhere when an inconsistency + is found. It hasn't happened in years. + + The file local.h contains locally tunable constants. + + The makefile used to be updated with mkmf; it has been changed +at various times to use cpp -M and, currently, mkdep. The only library +it needs is termcap. + + Window, as is, only runs on 4.3 (or later) machines. + + On 4.2 machines, at least these modifications must be done: + + delete uses of window size ioctls: TIOCGWINSZ, TIOCSWINSZ, + struct winsize + add to ww.h + typedef int fd_set; + #define FD_ZERO(s) (*(s) = 0) + #define FD_SET(b, s) (*(s) |= 1 << (b)) + #define FD_ISSET(b, s) (*(s) & 1 << (b)) + add to ww.h + #define sigmask(s) (1 << (s) - 1) + + +A few notes about the internals: + + The window package. Windows are opened by calling wwopen(). +Wwwrite() is the primitive for writing to windows. Wwputc(), wwputs(), +and wwprintf() are also supported. Some of the outputs to windows are +delayed. Wwupdate() updates the terminal to match the internal screen +buffer. Wwspawn() spawns a child process on the other end of a window, +with its environment tailored to the window. Visible windows are +doubly linked in the order of their overlap. Wwadd() inserts a window +into the list at a given place. Wwdelete() deletes it. Windows not in +the list are not visible, though wwwrite() still works. Window was +written before the days of X and Sunview, so some of the terminology +is not standard. + + Most functions return -1 on error. Wwopen() returns the null +pointer. An error number is saved in wwerrno. Wwerror() returns an +error string based on wwerrno suitable for printing. + + The terminal drivers perform all output to the physical terminal, +including special functions like character and line insertion and +deletion. The window package keeps a list of known terminals. At +initialization time, the terminal type is matched against the list to +find the right terminal driver to use. The last driver, the generic +driver, matches all terminals and uses the termcap database. The +interface between the window package the terminal driver is the `tt' +structure. It contains pointers to functions to perform special +functions and terminal output, as well as flags about the +characteristics of the terminal. Most of these ideas are borrowed +from the Maryland window package, which in turn is based on Goslin's +Emacs. + + The IO system is semi-synchronous. Terminal input is signal +driven, and everything else is done synchronously with a single +select(). It is roughly event-driven, though not in a clean way. + + Normally, in both conversation mode and command mode, window +sleeps in a select() in wwiomux() waiting for data from the +pseudo-terminals. At the same time, terminal input causes SIGIO which +is caught by wwrint(). The select() returns when at least one of the +pseudo-terminals becomes ready for reading. + + Wwrint() is the interrupt handler for tty input. It reads input +into a linear buffer accessed through four pointers: + + +-------+--------------+----------------+ + | empty | data | empty | + +-------+--------------+----------------+ + ^ ^ ^ ^ + | | | | + wwib wwibp wwibq wwibe + +Wwrint() appends characters at the end and increments wwibq (*wwibq++ += c), and characters are taken off the buffer at wwibp using the +wwgetc() and wwpeekc() macros. As is the convention in C, wwibq +and wwibe point to one position beyond the end. In addition, +wwrint() will do a longjmp(wwjmpbuf) if wwsetjmp is true. This is +used by wwiomux() to interrupt the select() which would otherwise +resume after the interrupt. (Actually, I hear this is not true, +but the longjmp feature is used to avoid a race condition as well. +Anyway, it means I didn't have to depend on a feature in a +daily-changing kernel, but that's another story.) The macro +wwinterrupt() returns true if the input buffer is non-empty. +Wwupdate(), wwwrite(), and wwiomux() check this condition and will +return at the first convenient opportunity when it becomes true. +In the case of wwwrite(), the flag ww_nointr in the window structure +overrides this. This feature allows the user to interrupt lengthy +outputs safely. The structure of the input buffer is designed to +avoid race conditions without blocking interrupts. + + Actually, wwsetjmp and wwinterrupt() are part of a software +interrupt scheme used by the two interrupt catchers wwrint() and +wwchild(). Asserting the interrupt lets the synchronous parts of +the program know that there's an interesting asynchronous condition +(i.e., got a keyboard character, or a child process died) that they +might want to process before anything else. The synchronous routines +can check for this condition with wwinterrupt() or by arranging +that a longjmp() be done. + + Wwiomux() copies pseudo-terminal output into their corresponding +windows. Without anything to do, it blocks in a select(), waiting for +read ready on pseudo-terminals. Reads are done into per-window buffers +in the window structures. When there is at least one buffer non-empty, +wwiomux() finds the top most of these windows and writes it using +wwwrite(). Then the process is repeated. A non-blocking select() is +done after a wwwrite() to pick up any output that may have come in +during the write, which may take a long time. Specifically, we use +this to stop output or flush buffer when a pseudo-terminal tells us to +(we use pty packet mode). The select() blocks only when all of the +windows' buffers are empty. A wwupdate() is done prior to this, which +is the only time the screen is guaranteed to be completely up to date. +Wwiomux() loops until wwinterrupt() becomes true. + + The top level routine for all this is mloop(). In conversation +mode, it simply calls wwiomux(), which only returns when input is +available. The input buffer is then written to the pseudo-terminal of +the current window. If the escape character is found in the input, +command mode is entered. Otherwise, the process is repeated. In +command mode, control is transferred to docmd() which returns only when +conversation mode is reentered. Docmd() and other command processing +routines typically wait for input in a loop: + + while (wwpeekc() < 0) + wwiomux(); + +When the loop terminates, wwgetc() is used to read the input buffer. + + Output to the physical terminal is handled by the lowest level +routines of the window package, in the files ttoutput.c and tt.h. The +standard IO package is not used, to get better control over buffering +and to use non-blocking reads in wwrint(). The buffer size is set to +approximately one second of output time, based on the baudrate. + + The result of all this complexity is faster response time, +especially in output stopping and flushing. Wwwrite() checks +wwinterrupt() after every line. It also calls wwupdate() for each line +it writes. The output buffer is limited to one second of output time. +Thus, there is usually only a delay of one to two lines plus one second +after a ^C or ^S. Also, commands that produce lengthy output can be +aborted without actually showing all of it on the terminal. (Try the +'?' command followed by escape immediately.) diff --git a/usr.bin/window/alias.h b/usr.bin/window/alias.h new file mode 100644 index 0000000..ea63b49 --- /dev/null +++ b/usr.bin/window/alias.h @@ -0,0 +1,52 @@ +/* + * Copyright (c) 1983, 1993 + * The Regents of the University of California. All rights reserved. + * + * This code is derived from software contributed to Berkeley by + * Edward Wang at The University of California, Berkeley. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. All advertising materials mentioning features or use of this software + * must display the following acknowledgement: + * This product includes software developed by the University of + * California, Berkeley and its contributors. + * 4. Neither the name of the University nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * @(#)alias.h 8.1 (Berkeley) 6/6/93 + */ + +#define alias var +#define a_name r_name +#define a_buf r_val.v_str +#define a_flags r_val.v_type + + /* a_flags bits, must not interfere with v_type values */ +#define A_INUSE 0x010 /* already inuse */ + +#define alias_set(n, s) var_setstr1(&alias_head, n, s) +#define alias_walk(f, a) var_walk1(alias_head, f, a) +#define alias_unset(n) var_unset1(&alias_head, n) +#define alias_lookup(n) (*var_lookup1(&alias_head, n)) + +struct var *alias_head; diff --git a/usr.bin/window/char.c b/usr.bin/window/char.c new file mode 100644 index 0000000..34bea59 --- /dev/null +++ b/usr.bin/window/char.c @@ -0,0 +1,150 @@ +/* + * Copyright (c) 1983, 1993 + * The Regents of the University of California. All rights reserved. + * + * This code is derived from software contributed to Berkeley by + * Edward Wang at The University of California, Berkeley. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. All advertising materials mentioning features or use of this software + * must display the following acknowledgement: + * This product includes software developed by the University of + * California, Berkeley and its contributors. + * 4. Neither the name of the University nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + */ + +#ifndef lint +static char sccsid[] = "@(#)char.c 8.1 (Berkeley) 6/6/93"; +#endif /* not lint */ + +#include "char.h" + +char _cmap[] = { + _C|_U, _C|_U, _C|_U, _C|_U, /* ^@ - ^C */ + _C|_U, _C|_U, _C|_U, _C|_U, /* ^D - ^G */ + _C, _C|_P, _C, _C|_U, /* ^H - ^K */ + _C|_U, _C, _C|_U, _C|_U, /* ^L - ^O */ + _C|_U, _C|_U, _C|_U, _C|_U, /* ^P - ^S */ + _C|_U, _C|_U, _C|_U, _C|_U, /* ^T - ^W */ + _C|_U, _C|_U, _C|_U, _C|_U, /* ^U - ^[ */ + _C|_U, _C|_U, _C|_U, _C|_U, /* ^\ - ^_ */ + + _P|_U, _P|_U, _P|_U, _P|_U, + _P|_U, _P|_U, _P|_U, _P|_U, + _P|_U, _P|_U, _P|_U, _P|_U, + _P|_U, _P|_U, _P|_U, _P|_U, + _P|_U, _P|_U, _P|_U, _P|_U, + _P|_U, _P|_U, _P|_U, _P|_U, + _P|_U, _P|_U, _P|_U, _P|_U, + _P|_U, _P|_U, _P|_U, _P|_U, + + _P|_U, _P|_U, _P|_U, _P|_U, + _P|_U, _P|_U, _P|_U, _P|_U, + _P|_U, _P|_U, _P|_U, _P|_U, + _P|_U, _P|_U, _P|_U, _P|_U, + _P|_U, _P|_U, _P|_U, _P|_U, + _P|_U, _P|_U, _P|_U, _P|_U, + _P|_U, _P|_U, _P|_U, _P|_U, + _P|_U, _P|_U, _P|_U, _P|_U, + + _P|_U, _P|_U, _P|_U, _P|_U, + _P|_U, _P|_U, _P|_U, _P|_U, + _P|_U, _P|_U, _P|_U, _P|_U, + _P|_U, _P|_U, _P|_U, _P|_U, + _P|_U, _P|_U, _P|_U, _P|_U, + _P|_U, _P|_U, _P|_U, _P|_U, + _P|_U, _P|_U, _P|_U, _P|_U, + _P|_U, _P|_U, _P|_U, _C|_U, + + _C|_U, _C|_U, _C|_U, _C|_U, + _C|_U, _C|_U, _C|_U, _C|_U, + _C|_U, _C|_U, _C|_U, _C|_U, + _C|_U, _C|_U, _C|_U, _C|_U, + _C|_U, _C|_U, _C|_U, _C|_U, + _C|_U, _C|_U, _C|_U, _C|_U, + _C|_U, _C|_U, _C|_U, _C|_U, + _C|_U, _C|_U, _C|_U, _C|_U, + + _C|_U, _C|_U, _C|_U, _C|_U, + _C|_U, _C|_U, _C|_U, _C|_U, + _C|_U, _C|_U, _C|_U, _C|_U, + _C|_U, _C|_U, _C|_U, _C|_U, + _C|_U, _C|_U, _C|_U, _C|_U, + _C|_U, _C|_U, _C|_U, _C|_U, + _C|_U, _C|_U, _C|_U, _C|_U, + _C|_U, _C|_U, _C|_U, _C|_U, + + _C|_U, _C|_U, _C|_U, _C|_U, + _C|_U, _C|_U, _C|_U, _C|_U, + _C|_U, _C|_U, _C|_U, _C|_U, + _C|_U, _C|_U, _C|_U, _C|_U, + _C|_U, _C|_U, _C|_U, _C|_U, + _C|_U, _C|_U, _C|_U, _C|_U, + _C|_U, _C|_U, _C|_U, _C|_U, + _C|_U, _C|_U, _C|_U, _C|_U, + + _C|_U, _C|_U, _C|_U, _C|_U, + _C|_U, _C|_U, _C|_U, _C|_U, + _C|_U, _C|_U, _C|_U, _C|_U, + _C|_U, _C|_U, _C|_U, _C|_U, + _C|_U, _C|_U, _C|_U, _C|_U, + _C|_U, _C|_U, _C|_U, _C|_U, + _C|_U, _C|_U, _C|_U, _C|_U, + _C|_U, _C|_U, _C|_U, _C|_U +}; + +char *_unctrl[] = { + "^@", "^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", "{", "|", "}", "~", "^?", + "\\200","\\201","\\202","\\203","\\204","\\205","\\206","\\207", + "\\210","\\211","\\212","\\213","\\214","\\215","\\216","\\217", + "\\220","\\221","\\222","\\223","\\224","\\225","\\226","\\227", + "\\230","\\231","\\232","\\233","\\234","\\235","\\236","\\237", + "\\240","\\241","\\242","\\243","\\244","\\245","\\246","\\247", + "\\250","\\251","\\252","\\253","\\254","\\255","\\256","\\257", + "\\260","\\261","\\262","\\263","\\264","\\265","\\266","\\267", + "\\270","\\271","\\272","\\273","\\274","\\275","\\276","\\277", + "\\300","\\301","\\302","\\303","\\304","\\305","\\306","\\307", + "\\310","\\311","\\312","\\313","\\314","\\315","\\316","\\317", + "\\320","\\321","\\322","\\323","\\324","\\325","\\326","\\327", + "\\330","\\331","\\332","\\333","\\334","\\335","\\336","\\337", + "\\340","\\341","\\342","\\343","\\344","\\345","\\346","\\347", + "\\350","\\351","\\352","\\353","\\354","\\355","\\356","\\357", + "\\360","\\361","\\362","\\363","\\364","\\365","\\366","\\367", + "\\370","\\371","\\372","\\373","\\374","\\375","\\376","\\377" +}; diff --git a/usr.bin/window/char.h b/usr.bin/window/char.h new file mode 100644 index 0000000..eb4774f --- /dev/null +++ b/usr.bin/window/char.h @@ -0,0 +1,61 @@ +/* + * Copyright (c) 1983, 1993 + * The Regents of the University of California. All rights reserved. + * + * This code is derived from software contributed to Berkeley by + * Edward Wang at The University of California, Berkeley. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. All advertising materials mentioning features or use of this software + * must display the following acknowledgement: + * This product includes software developed by the University of + * California, Berkeley and its contributors. + * 4. Neither the name of the University nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * @(#)char.h 8.1 (Berkeley) 6/6/93 + */ + +/* + * Macros and things to deal with control characters. + * + * Unctrl() is just like the standard function, except we don't want + * to include curses. + * Isctrl() returns true for all characters less than space and + * greater than or equal to delete. + * Isprt() is tab and all characters not isctrl(). It's used + * by wwwrite(). + * Isunctrl() includes all characters that should be expanded + * using unctrl() by wwwrite() if ww_unctrl is set. + */ + +extern char *_unctrl[]; +extern char _cmap[]; +#define ctrl(c) (c & 0x1f) +#define unctrl(c) (_unctrl[(unsigned char) (c)]) +#define _C 0x01 +#define _P 0x02 +#define _U 0x04 +#define isctrl(c) (_cmap[(unsigned char) (c)] & _C) +#define isprt(c) (_cmap[(unsigned char) (c)] & _P) +#define isunctrl(c) (_cmap[(unsigned char) (c)] & _U) diff --git a/usr.bin/window/cmd.c b/usr.bin/window/cmd.c new file mode 100644 index 0000000..cd105ea --- /dev/null +++ b/usr.bin/window/cmd.c @@ -0,0 +1,300 @@ +/* + * Copyright (c) 1983, 1993 + * The Regents of the University of California. All rights reserved. + * + * This code is derived from software contributed to Berkeley by + * Edward Wang at The University of California, Berkeley. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. All advertising materials mentioning features or use of this software + * must display the following acknowledgement: + * This product includes software developed by the University of + * California, Berkeley and its contributors. + * 4. Neither the name of the University nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + */ + +#ifndef lint +static char sccsid[] = "@(#)cmd.c 8.1 (Berkeley) 6/6/93"; +#endif /* not lint */ + +#include "defs.h" +#include "char.h" + +docmd() +{ + register char c; + register struct ww *w; + char out = 0; + + while (!out && !quit) { + if ((c = wwgetc()) < 0) { + if (terse) + wwsetcursor(0, 0); + else { + wwputs("Command: ", cmdwin); + wwcurtowin(cmdwin); + } + do + wwiomux(); + while ((c = wwgetc()) < 0); + } + if (!terse) + wwputc('\n', cmdwin); + switch (c) { + default: + if (c != escapec) + break; + case 'h': case 'j': case 'k': case 'l': + case 'y': case 'p': + case ctrl('y'): + case ctrl('e'): + case ctrl('u'): + case ctrl('d'): + case ctrl('b'): + case ctrl('f'): + case ctrl('s'): + case ctrl('q'): + case ctrl('['): + if (selwin == 0) { + error("No window."); + continue; + } + } + switch (c) { + case '1': case '2': case '3': case '4': case '5': + case '6': case '7': case '8': case '9': + if ((w = window[c - '1']) == 0) { + error("%c: No such window.", c); + break; + } + setselwin(w); + if (checkproc(selwin) >= 0) + out = 1; + break; + case '%': + if ((w = getwin()) != 0) + setselwin(w); + break; + case ctrl('^'): + if (lastselwin != 0) { + setselwin(lastselwin); + if (checkproc(selwin) >= 0) + out = 1; + } else + error("No previous window."); + break; + case 'c': + if ((w = getwin()) != 0) + closewin(w); + break; + case 'w': + c_window(); + break; + case 'm': + if ((w = getwin()) != 0) + c_move(w); + break; + case 'M': + if ((w = getwin()) != 0) + movewin(w, w->ww_alt.t, w->ww_alt.l); + break; + case 's': + if ((w = getwin()) != 0) + c_size(w); + break; + case 'S': + if ((w = getwin()) != 0) + sizewin(w, w->ww_alt.nr, w->ww_alt.nc); + break; + case 'y': + c_yank(); + break; + case 'p': + c_put(); + break; + case ':': + c_colon(); + break; + case 'h': + (void) wwwrite(selwin, "\b", 1); + break; + case 'j': + (void) wwwrite(selwin, "\n", 1); + break; + case 'k': + (void) wwwrite(selwin, "\033A", 2); + break; + case 'l': + (void) wwwrite(selwin, "\033C", 2); + break; + case ctrl('e'): + wwscroll(selwin, 1); + break; + case ctrl('y'): + wwscroll(selwin, -1); + break; + case ctrl('d'): + wwscroll(selwin, selwin->ww_w.nr / 2); + break; + case ctrl('u'): + wwscroll(selwin, - selwin->ww_w.nr / 2); + break; + case ctrl('f'): + wwscroll(selwin, selwin->ww_w.nr); + break; + case ctrl('b'): + wwscroll(selwin, - selwin->ww_w.nr); + break; + case ctrl('s'): + stopwin(selwin); + break; + case ctrl('q'): + startwin(selwin); + break; + case ctrl('l'): + wwredraw(); + break; + case '?': + c_help(); + break; + case ctrl('['): + if (checkproc(selwin) >= 0) + out = 1; + break; + case ctrl('z'): + wwsuspend(); + break; + case 'q': + c_quit(); + break; + /* debugging stuff */ + case '&': + if (debug) { + c_debug(); + break; + } + default: + if (c == escapec) { + if (checkproc(selwin) >= 0) { + (void) write(selwin->ww_pty, + &escapec, 1); + out = 1; + } + } else { + if (!terse) + wwbell(); + error("Type ? for help."); + } + } + } + if (!quit) + setcmd(0); +} + +struct ww * +getwin() +{ + register int c; + struct ww *w = 0; + + if (!terse) + wwputs("Which window? ", cmdwin); + wwcurtowin(cmdwin); + while ((c = wwgetc()) < 0) + wwiomux(); + if (debug && c == 'c') + w = cmdwin; + else if (debug && c == 'f') + w = framewin; + else if (debug && c == 'b') + w = boxwin; + else if (c >= '1' && c < NWINDOW + '1') + w = window[c - '1']; + else if (c == '+') + w = selwin; + else if (c == '-') + w = lastselwin; + if (w == 0) + wwbell(); + if (!terse) + wwputc('\n', cmdwin); + return w; +} + +checkproc(w) +struct ww *w; +{ + if (w->ww_state != WWS_HASPROC) { + error("No process in window."); + return -1; + } + return 0; +} + +setcmd(new) +char new; +{ + if (new && !incmd) { + if (!terse) + wwadd(cmdwin, &wwhead); + if (selwin != 0) + wwcursor(selwin, 1); + wwcurwin = 0; + } else if (!new && incmd) { + if (!terse) { + wwdelete(cmdwin); + reframe(); + } + if (selwin != 0) + wwcursor(selwin, 0); + wwcurwin = selwin; + } + incmd = new; +} + +setterse(new) +char new; +{ + if (incmd) + if (new && !terse) { + wwdelete(cmdwin); + reframe(); + } else if (!new && terse) + wwadd(cmdwin, &wwhead); + terse = new; +} + +/* + * Set the current window. + */ +setselwin(w) +struct ww *w; +{ + if (selwin == w) + return; + if (selwin != 0) + lastselwin = selwin; + if ((selwin = w) != 0) + front(selwin, 1); +} diff --git a/usr.bin/window/cmd1.c b/usr.bin/window/cmd1.c new file mode 100644 index 0000000..df6deb9 --- /dev/null +++ b/usr.bin/window/cmd1.c @@ -0,0 +1,172 @@ +/* + * Copyright (c) 1983, 1993 + * The Regents of the University of California. All rights reserved. + * + * This code is derived from software contributed to Berkeley by + * Edward Wang at The University of California, Berkeley. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. All advertising materials mentioning features or use of this software + * must display the following acknowledgement: + * This product includes software developed by the University of + * California, Berkeley and its contributors. + * 4. Neither the name of the University nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + */ + +#ifndef lint +static char sccsid[] = "@(#)cmd1.c 8.1 (Berkeley) 6/6/93"; +#endif /* not lint */ + +#include "defs.h" +#include "char.h" + +c_window() +{ + int col, row, xcol, xrow; + int id; + + if ((id = findid()) < 0) + return; + if (!terse) + wwputs("New window (upper left corner): ", cmdwin); + col = 0; + row = 1; + wwadd(boxwin, framewin->ww_back); + for (;;) { + wwbox(boxwin, row - 1, col - 1, 3, 3); + wwsetcursor(row, col); + while (wwpeekc() < 0) + wwiomux(); + switch (getpos(&row, &col, row > 1, 0, + wwnrow - 1, wwncol - 1)) { + case 3: + wwunbox(boxwin); + wwdelete(boxwin); + return; + case 2: + wwunbox(boxwin); + break; + case 1: + wwunbox(boxwin); + case 0: + continue; + } + break; + } + if (!terse) + wwputs("\nNew window (lower right corner): ", cmdwin); + xcol = col; + xrow = row; + for (;;) { + wwbox(boxwin, row - 1, col - 1, + xrow - row + 3, xcol - col + 3); + wwsetcursor(xrow, xcol); + while (wwpeekc() < 0) + wwiomux(); + switch (getpos(&xrow, &xcol, row, col, wwnrow - 1, wwncol - 1)) + { + case 3: + wwunbox(boxwin); + wwdelete(boxwin); + return; + case 2: + wwunbox(boxwin); + break; + case 1: + wwunbox(boxwin); + case 0: + continue; + } + break; + } + wwdelete(boxwin); + if (!terse) + wwputc('\n', cmdwin); + wwcurtowin(cmdwin); + (void) openwin(id, row, col, xrow-row+1, xcol-col+1, default_nline, + (char *) 0, 1, 1, default_shellfile, default_shell); +} + +getpos(row, col, minrow, mincol, maxrow, maxcol) +register int *row, *col; +int minrow, mincol; +int maxrow, maxcol; +{ + static int scount; + int count; + char c; + int oldrow = *row, oldcol = *col; + + while ((c = wwgetc()) >= 0) { + switch (c) { + case '0': case '1': case '2': case '3': case '4': + case '5': case '6': case '7': case '8': case '9': + scount = scount * 10 + c - '0'; + continue; + } + count = scount ? scount : 1; + scount = 0; + switch (c) { + case 'h': + if ((*col -= count) < mincol) + *col = mincol; + break; + case 'H': + *col = mincol; + break; + case 'l': + if ((*col += count) > maxcol) + *col = maxcol; + break; + case 'L': + *col = maxcol; + break; + case 'j': + if ((*row += count) > maxrow) + *row = maxrow; + break; + case 'J': + *row = maxrow; + break; + case 'k': + if ((*row -= count) < minrow) + *row = minrow; + break; + case 'K': + *row = minrow; + break; + case ctrl('['): + if (!terse) + wwputs("\nCancelled. ", cmdwin); + return 3; + case '\r': + return 2; + default: + if (!terse) + wwputs("\nType [hjklHJKL] to move, return to enter position, escape to cancel.", cmdwin); + wwbell(); + } + } + return oldrow != *row || oldcol != *col; +} diff --git a/usr.bin/window/cmd2.c b/usr.bin/window/cmd2.c new file mode 100644 index 0000000..f6239e9 --- /dev/null +++ b/usr.bin/window/cmd2.c @@ -0,0 +1,154 @@ +/* + * Copyright (c) 1983, 1993 + * The Regents of the University of California. All rights reserved. + * + * This code is derived from software contributed to Berkeley by + * Edward Wang at The University of California, Berkeley. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. All advertising materials mentioning features or use of this software + * must display the following acknowledgement: + * This product includes software developed by the University of + * California, Berkeley and its contributors. + * 4. Neither the name of the University nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + */ + +#ifndef lint +static char sccsid[] = "@(#)cmd2.c 8.1 (Berkeley) 6/6/93"; +#endif /* not lint */ + +#include "defs.h" + +char *help_shortcmd[] = { + "# Select window # and return to conversation mode", + "%# Select window # but stay in command mode", + "escape Return to conversation mode without changing window", + "^^ Return to conversation mode and change to previous window", + "c# Close window #", + "w Open a new window", + "m# Move window #", + "M# Move window # to its previous position", + "s# Change the size of window #", + "S# Change window # to its previous size", + "^Y Scroll up one line", + "^E Scroll down one line", + "^U Scroll up half a window", + "^D Scroll down half a window", + "^B Scroll up a full window", + "^F Scroll down a full window", + "h Move cursor left", + "j Move cursor down", + "k Move cursor up", + "l Move cursor right", + "y Yank", + "p Put", + "^S Stop output in current window", + "^Q Restart output in current window", + "^L Redraw screen", + "^Z Suspend", + "q Quit", + ": Enter a long command", + 0 +}; +char *help_longcmd[] = { + ":alias name string ... Make `name' an alias for `string ...'", + ":alias Show all aliases", + ":close # ... Close windows", + ":close all Close all windows", + ":cursor modes Set the cursor modes", + ":echo # string ... Print `string ...' in window #", + ":escape c Set escape character to `c'", + ":foreground # flag Make # a foreground window, if `flag' is true", + ":label # string Set label of window # to `string'", + ":list List all open windows", + ":default_nline lines Set default window buffer size to `lines'", + ":default_shell string ...", + " Set default shell to `string ...'", + ":default_smooth flag Set default smooth scroll flag", + ":select # Select window #", + ":smooth # flag Set window # to smooth scroll mode", + ":source filename Execute commands in `filename'", + ":terse flag Set terse mode", + ":unalias name Undefine `name' as an alias", + ":unset variable Deallocate `variable'", + ":variable List all variables", + ":window [row col nrow ncol nline label pty frame mapnl keepopen smooth shell]", + " Open a window at `row', `col' of size `nrow', `ncol',", + " with `nline' lines in the buffer, and `label'", + ":write # string ... Write `string ...' to window # as input", + 0 +}; + +c_help() +{ + register struct ww *w; + + if ((w = openiwin(wwnrow - 3, "Help")) == 0) { + error("Can't open help window: %s.", wwerror()); + return; + } + wwprintf(w, "The escape character is %c.\n", escapec); + wwprintf(w, "(# represents one of the digits from 1 to 9.)\n\n"); + if (help_print(w, "Short commands", help_shortcmd) >= 0) + (void) help_print(w, "Long commands", help_longcmd); + closeiwin(w); +} + +help_print(w, name, list) +register struct ww *w; +char *name; +register char **list; +{ + wwprintf(w, "%s:\n\n", name); + while (*list) + switch (more(w, 0)) { + case 0: + wwputs(*list++, w); + wwputc('\n', w); + break; + case 1: + wwprintf(w, "%s: (continued)\n\n", name); + break; + case 2: + return -1; + } + return more(w, 1) == 2 ? -1 : 0; +} + +c_quit() +{ + char oldterse = terse; + + setterse(0); + wwputs("Really quit [yn]? ", cmdwin); + wwcurtowin(cmdwin); + while (wwpeekc() < 0) + wwiomux(); + if (wwgetc() == 'y') { + wwputs("Yes", cmdwin); + quit++; + } else + wwputc('\n', cmdwin); + setterse(!quit && oldterse); +} diff --git a/usr.bin/window/cmd3.c b/usr.bin/window/cmd3.c new file mode 100644 index 0000000..950ddf6 --- /dev/null +++ b/usr.bin/window/cmd3.c @@ -0,0 +1,65 @@ +/* + * Copyright (c) 1983, 1993 + * The Regents of the University of California. All rights reserved. + * + * This code is derived from software contributed to Berkeley by + * Edward Wang at The University of California, Berkeley. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. All advertising materials mentioning features or use of this software + * must display the following acknowledgement: + * This product includes software developed by the University of + * California, Berkeley and its contributors. + * 4. Neither the name of the University nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + */ + +#ifndef lint +static char sccsid[] = "@(#)cmd3.c 8.1 (Berkeley) 6/6/93"; +#endif /* not lint */ + +#include "defs.h" +#include "string.h" + +setescape(esc) +register char *esc; +{ + if (*esc == '^') { + if (esc[1] != 0) + escapec = esc[1] & 0x1f; + else + escapec = '^'; + } else + escapec = *esc; +} + +setlabel(w, label) +register struct ww *w; +char *label; +{ + if (w->ww_label != 0) + str_free(w->ww_label); + if ((w->ww_label = str_cpy(label)) == 0) + return -1; + return 0; +} diff --git a/usr.bin/window/cmd4.c b/usr.bin/window/cmd4.c new file mode 100644 index 0000000..5dca8f8 --- /dev/null +++ b/usr.bin/window/cmd4.c @@ -0,0 +1,56 @@ +/* + * Copyright (c) 1983, 1993 + * The Regents of the University of California. All rights reserved. + * + * This code is derived from software contributed to Berkeley by + * Edward Wang at The University of California, Berkeley. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. All advertising materials mentioning features or use of this software + * must display the following acknowledgement: + * This product includes software developed by the University of + * California, Berkeley and its contributors. + * 4. Neither the name of the University nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + */ + +#ifndef lint +static char sccsid[] = "@(#)cmd4.c 8.1 (Berkeley) 6/6/93"; +#endif /* not lint */ + +#include "defs.h" + +c_colon() +{ + char oldterse = terse; + char buf[512]; + + setterse(0); + wwputc(':', cmdwin); + wwgets(buf, wwncol - 3, cmdwin); + wwputc('\n', cmdwin); + wwcurtowin(cmdwin); + setterse(oldterse); + if (dolongcmd(buf, (struct value *)0, 0) < 0) + error("Out of memory."); +} diff --git a/usr.bin/window/cmd5.c b/usr.bin/window/cmd5.c new file mode 100644 index 0000000..456fdb9 --- /dev/null +++ b/usr.bin/window/cmd5.c @@ -0,0 +1,129 @@ +/* + * Copyright (c) 1983, 1993 + * The Regents of the University of California. All rights reserved. + * + * This code is derived from software contributed to Berkeley by + * Edward Wang at The University of California, Berkeley. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. All advertising materials mentioning features or use of this software + * must display the following acknowledgement: + * This product includes software developed by the University of + * California, Berkeley and its contributors. + * 4. Neither the name of the University nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + */ + +#ifndef lint +static char sccsid[] = "@(#)cmd5.c 8.1 (Berkeley) 6/6/93"; +#endif /* not lint */ + +#include "defs.h" + +/* + * Window movement. + */ + +c_move(w) +register struct ww *w; +{ + int col, row; + int mincol, minrow; + int maxcol, maxrow; + int curcol, currow; + + if (!terse) + wwputs("New window position: ", cmdwin); + col = w->ww_w.l; + row = w->ww_w.t; + wwadd(boxwin, framewin->ww_back); + for (;;) { + wwbox(boxwin, row - 1, col - 1, w->ww_w.nr + 2, w->ww_w.nc + 2); + getminmax(row, w->ww_w.nr, 1, wwnrow, + &currow, &minrow, &maxrow); + getminmax(col, w->ww_w.nc, 0, wwncol, + &curcol, &mincol, &maxcol); + wwsetcursor(currow, curcol); + while (wwpeekc() < 0) + wwiomux(); + switch (getpos(&row, &col, minrow, mincol, maxrow, maxcol)) { + case 3: + wwunbox(boxwin); + wwdelete(boxwin); + return; + case 2: + wwunbox(boxwin); + break; + case 1: + wwunbox(boxwin); + case 0: + continue; + } + break; + } + wwdelete(boxwin); + if (!terse) + wwputc('\n', cmdwin); + wwcurtowin(cmdwin); + movewin(w, row, col); +} + +movewin(w, row, col) +register struct ww *w; +{ + struct ww *back = w->ww_back; + + w->ww_alt.t = w->ww_w.t; + w->ww_alt.l = w->ww_w.l; + wwdelete(w); + wwmove(w, row, col); + wwadd(w, back); + reframe(); +} + +/* + * Weird stufff, don't ask. + */ +getminmax(x, n, a, b, curx, minx, maxx) +register x, n, a, b; +int *curx, *minx, *maxx; +{ + if (x < 0) + *curx = x + n - 1; + else + *curx = x; + + if (x <= a) + *minx = 1 - n; + else if (x <= b - n) + *minx = a; + else + *minx = b - n; + + if (x >= b - n) + *maxx = b - 1; + else if (x >= a) + *maxx = b - n; + else + *maxx = a; +} diff --git a/usr.bin/window/cmd6.c b/usr.bin/window/cmd6.c new file mode 100644 index 0000000..fc85485 --- /dev/null +++ b/usr.bin/window/cmd6.c @@ -0,0 +1,110 @@ +/* + * Copyright (c) 1983, 1993 + * The Regents of the University of California. All rights reserved. + * + * This code is derived from software contributed to Berkeley by + * Edward Wang at The University of California, Berkeley. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. All advertising materials mentioning features or use of this software + * must display the following acknowledgement: + * This product includes software developed by the University of + * California, Berkeley and its contributors. + * 4. Neither the name of the University nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + */ + +#ifndef lint +static char sccsid[] = "@(#)cmd6.c 8.1 (Berkeley) 6/6/93"; +#endif /* not lint */ + +#include "defs.h" +#include "string.h" +#include "char.h" + +/* + * Debugging commands. + */ + +c_debug() +{ + register struct ww *w; + + if (!terse) + wwputs("[m(smap) n(ns) o(os) s(string) v(nvis) w(win)]? ", cmdwin); + wwcurtowin(cmdwin); + while (wwpeekc() < 0) + wwiomux(); + if (!terse) + wwputc('\n', cmdwin); + switch (wwgetc()) { + case 'm': + wwdumpsmap(); + break; + case 'n': + wwdumpns(); + break; + case 'o': + wwdumpos(); + break; + case 's': + debug_str(); + break; + case 'v': + if ((w = getwin()) != 0) + wwdumpnvis(w); + break; + case 'w': + if ((w = getwin()) != 0) + wwdumpwin(w); + break; + default: + wwbell(); + } +} + +#ifdef STR_DEBUG +debug_str() +{ + register struct ww *w; + struct string *s; + + if ((w = openiwin(wwnrow - 3, "Allocated Strings")) == 0) { + error("Can't open string window: %s.", wwerror()); + return; + } + for (s = str_head.s_forw; s != &str_head; s = s->s_forw) { + if (more(w, 0) == 2) + goto out; + wwprintf(w, "(0x%x)\t\"%s\"\n", s->s_data, s->s_data); + } + waitnl(w); +out: + closeiwin(w); +} +#else +debug_str() +{ + error("No string debugging."); +} +#endif diff --git a/usr.bin/window/cmd7.c b/usr.bin/window/cmd7.c new file mode 100644 index 0000000..6bd4c4e --- /dev/null +++ b/usr.bin/window/cmd7.c @@ -0,0 +1,271 @@ +/* + * Copyright (c) 1983, 1993 + * The Regents of the University of California. All rights reserved. + * + * This code is derived from software contributed to Berkeley by + * Edward Wang at The University of California, Berkeley. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. All advertising materials mentioning features or use of this software + * must display the following acknowledgement: + * This product includes software developed by the University of + * California, Berkeley and its contributors. + * 4. Neither the name of the University nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + */ + +#ifndef lint +static char sccsid[] = "@(#)cmd7.c 8.1 (Berkeley) 6/6/93"; +#endif /* not lint */ + +#include "defs.h" +#include "string.h" + +/* + * Window size. + */ + +c_size(w) +register struct ww *w; +{ + int col, row; + + if (!terse) + wwputs("New window size (lower right corner): ", cmdwin); + col = MIN(w->ww_w.r, wwncol) - 1; + row = MIN(w->ww_w.b, wwnrow) - 1; + wwadd(boxwin, framewin->ww_back); + for (;;) { + wwbox(boxwin, w->ww_w.t - 1, w->ww_w.l - 1, + row - w->ww_w.t + 3, col - w->ww_w.l + 3); + wwsetcursor(row, col); + while (wwpeekc() < 0) + wwiomux(); + switch (getpos(&row, &col, w->ww_w.t, w->ww_w.l, + wwnrow - 1, wwncol - 1)) { + case 3: + wwunbox(boxwin); + wwdelete(boxwin); + return; + case 2: + wwunbox(boxwin); + break; + case 1: + wwunbox(boxwin); + case 0: + continue; + } + break; + } + wwdelete(boxwin); + if (!terse) + wwputc('\n', cmdwin); + wwcurtowin(cmdwin); + sizewin(w, row - w->ww_w.t + 1, col - w->ww_w.l + 1); +} + +/* + * Yank and put + */ + +struct yb { + char *line; + int length; + struct yb *link; +}; +struct yb *yb_head, *yb_tail; + +c_yank() +{ + struct ww *w = selwin; + int col1, row1; + int col2, row2; + int r, c; + + if (!terse) + wwputs("Yank starting position: ", cmdwin); + wwcursor(w, 0); + row1 = w->ww_cur.r; + col1 = w->ww_cur.c; + for (;;) { + wwsetcursor(row1, col1); + while (wwpeekc() < 0) + wwiomux(); + switch (getpos(&row1, &col1, w->ww_i.t, w->ww_i.l, + w->ww_i.b - 1, w->ww_i.r - 1)) { + case 3: + goto out; + case 2: + break; + case 1: + case 0: + continue; + } + break; + } + if (!terse) + wwputs("\nYank ending position: ", cmdwin); + row2 = row1; + col2 = col1; + for (;;) { + wwsetcursor(row2, col2); + while (wwpeekc() < 0) + wwiomux(); + r = row2; + c = col2; + switch (getpos(&row2, &col2, w->ww_i.t, w->ww_i.l, + w->ww_i.b - 1, w->ww_i.r - 1)) { + case 3: + yank_highlight(row1, col1, r, c); + goto out; + case 2: + break; + case 1: + yank_highlight(row1, col1, r, c); + yank_highlight(row1, col1, row2, col2); + case 0: + continue; + } + break; + } + if (row2 < row1 || row2 == row1 && col2 < col1) { + r = row1; + c = col1; + row1 = row2; + col1 = col2; + row2 = r; + col2 = c; + } + unyank(); + c = col1; + for (r = row1; r < row2; r++) { + yank_line(r, c, w->ww_b.r); + c = w->ww_b.l; + } + yank_line(r, c, col2); + yank_highlight(row1, col1, row2, col2); + if (!terse) + wwputc('\n', cmdwin); +out: + wwcursor(w, 1); +} + +yank_highlight(row1, col1, row2, col2) +{ + struct ww *w = selwin; + int r, c; + + if ((wwavailmodes & WWM_REV) == 0) + return; + if (row2 < row1 || row2 == row1 && col2 < col1) { + r = row1; + c = col1; + row1 = row2; + col1 = col2; + row2 = r; + col2 = c; + } + c = col1; + for (r = row1; r < row2; r++) { + yank_highlight_line(r, c, w->ww_b.r); + c = w->ww_b.l; + } + yank_highlight_line(r, c, col2); +} + +yank_highlight_line(r, c, cend) +{ + struct ww *w = selwin; + char *win; + + if (r < w->ww_i.t || r >= w->ww_i.b) + return; + if (c < w->ww_i.l) + c = w->ww_i.l; + if (cend >= w->ww_i.r) + cend = w->ww_i.r; + for (win = w->ww_win[r] + c; c < cend; c++, win++) { + *win ^= WWM_REV; + if (wwsmap[r][c] == w->ww_index) { + if (*win == 0) + w->ww_nvis[r]++; + else if (*win == WWM_REV) + w->ww_nvis[r]--; + wwns[r][c].c_m ^= WWM_REV; + wwtouched[r] |= WWU_TOUCHED; + } + } +} + +unyank() +{ + struct yb *yp, *yq; + + for (yp = yb_head; yp; yp = yq) { + yq = yp->link; + str_free(yp->line); + free((char *) yp); + } + yb_head = yb_tail = 0; +} + +yank_line(r, c, cend) +{ + struct yb *yp; + int nl = 0; + int n; + union ww_char *bp; + char *cp; + + if (c == cend) + return; + if ((yp = (struct yb *) malloc(sizeof *yp)) == 0) + return; + yp->link = 0; + nl = cend == selwin->ww_b.r; + bp = selwin->ww_buf[r]; + for (cend--; cend >= c; cend--) + if (bp[cend].c_c != ' ') + break; + yp->length = n = cend - c + 1; + if (nl) + yp->length++; + yp->line = str_alloc(yp->length + 1); + for (bp += c, cp = yp->line; --n >= 0;) + *cp++ = bp++->c_c; + if (nl) + *cp++ = '\n'; + *cp = 0; + if (yb_head) + yb_tail = yb_tail->link = yp; + else + yb_head = yb_tail = yp; +} + +c_put() +{ + struct yb *yp; + + for (yp = yb_head; yp; yp = yp->link) + (void) write(selwin->ww_pty, yp->line, yp->length); +} diff --git a/usr.bin/window/compress.c b/usr.bin/window/compress.c new file mode 100644 index 0000000..ccac095 --- /dev/null +++ b/usr.bin/window/compress.c @@ -0,0 +1,899 @@ +/* + * Copyright (c) 1989, 1993 + * The Regents of the University of California. All rights reserved. + * + * This code is derived from software contributed to Berkeley by + * Edward Wang at The University of California, Berkeley. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. All advertising materials mentioning features or use of this software + * must display the following acknowledgement: + * This product includes software developed by the University of + * California, Berkeley and its contributors. + * 4. Neither the name of the University nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + */ + +#ifndef lint +static char sccsid[] = "@(#)compress.c 8.1 (Berkeley) 6/6/93"; +#endif /* not lint */ + +#include "ww.h" +#include "tt.h" + + /* special */ +#include <stdio.h> +#include <fcntl.h> +int cc_trace = 0; +FILE *cc_trace_fp; + + /* tunable parameters */ + +int cc_reverse = 1; +int cc_sort = 0; +int cc_chop = 0; + +int cc_token_max = 8; /* <= TOKEN_MAX */ +int cc_token_min = 2; /* > tt.tt_put_token_cost */ +int cc_npass0 = 1; +int cc_npass1 = 1; + +int cc_bufsize = 1024 * 3; /* XXX, or 80 * 24 * 2 */ + +int cc_ntoken = 8192; + +#define cc_weight XXX +#ifndef cc_weight +int cc_weight = 0; +#endif + +#define TOKEN_MAX 16 + +struct cc { + char string[TOKEN_MAX]; + char length; + char flag; +#ifndef cc_weight + short weight; +#endif + long time; /* time last seen */ + short bcount; /* count in this buffer */ + short ccount; /* count in compression */ + short places; /* places in the buffer */ + short code; /* token code */ + struct cc *qforw, *qback; + struct cc *hforw, **hback; +}; + +short cc_thresholds[TOKEN_MAX + 1]; +#define thresh(length) (cc_thresholds[length]) +#define threshp(code, count, length) \ + ((code) >= 0 || (short) (count) >= cc_thresholds[length]) + +#ifndef cc_weight +short cc_wthresholds[TOKEN_MAX + 1]; +#define wthresh(length) (cc_wthresholds[length]) +#define wthreshp(weight, length) ((short) (weight) >= cc_wthresholds[length]) +#else +#define wthreshp(weight, length) (0) +#endif + +#ifndef cc_weight +short cc_wlimits[TOKEN_MAX + 1]; +#define wlimit(length) (cc_wlimits[length]) +#endif + +#define put_token_score(length) ((length) - tt.tt_put_token_cost) + +int cc_score_adjustments[TOKEN_MAX + 1][8]; /* XXX, 8 > max of cc_thresholds */ +#define score_adjust(score, p) \ + do { \ + int length = (p)->length; \ + int ccount = (p)->ccount; \ + if (threshp((p)->code, ccount, length) || \ + wthreshp((p)->weight, length)) /* XXX */ \ + (score) -= length - tt.tt_put_token_cost; \ + else \ + (score) += cc_score_adjustments[length][ccount]; \ + } while (0) + +int cc_initial_scores[TOKEN_MAX + 1][8]; /* XXX, 8 > max of cc_thresholds */ + +struct cc cc_q0a, cc_q0b, cc_q1a, cc_q1b; + +#define qinsert(p1, p2) \ + do { \ + register struct cc *forw = (p1)->qforw; \ + register struct cc *back = (p1)->qback; \ + back->qforw = forw; \ + forw->qback = back; \ + forw = (p2)->qforw; \ + (p1)->qforw = forw; \ + forw->qback = (p1); \ + (p2)->qforw = (p1); \ + (p1)->qback = (p2); \ + } while (0) + +#define qinsertq(q, p) \ + ((q)->qforw == (q) ? 0 : \ + ((q)->qback->qforw = (p)->qforw, \ + (p)->qforw->qback = (q)->qback, \ + (q)->qforw->qback = (p), \ + (p)->qforw = (q)->qforw, \ + (q)->qforw = (q), \ + (q)->qback = (q))) + +#define H (14) +#define HSIZE (1 << H) +#define hash(h, c) ((((h) >> H - 8 | (h) << 8) ^ (c)) & HSIZE - 1) + +char *cc_buffer; +struct cc **cc_output; /* the output array */ +short *cc_places[TOKEN_MAX + 1]; +short *cc_hashcodes; /* for computing hashcodes */ +struct cc **cc_htab; /* the hash table */ +struct cc **cc_tokens; /* holds all the active tokens */ +struct cc_undo { + struct cc **pos; + struct cc *val; +} *cc_undo; + +long cc_time, cc_time0; + +char *cc_tt_ob, *cc_tt_obe; + +ccinit() +{ + register i, j; + register struct cc *p; + + if (tt.tt_token_max > cc_token_max) + tt.tt_token_max = cc_token_max; + if (tt.tt_token_min < cc_token_min) + tt.tt_token_min = cc_token_min; + if (tt.tt_token_min > tt.tt_token_max) { + tt.tt_ntoken = 0; + return 0; + } + if (tt.tt_ntoken > cc_ntoken / 2) /* not likely */ + tt.tt_ntoken = cc_ntoken / 2; +#define C(x) (sizeof (x) / sizeof *(x)) + for (i = 0; i < C(cc_thresholds); i++) { + int h = i - tt.tt_put_token_cost; + if (h > 0) + cc_thresholds[i] = + (tt.tt_set_token_cost + 1 + h - 1) / h + 1; + else + cc_thresholds[i] = 0; + } + for (i = 0; i < C(cc_score_adjustments); i++) { + int t = cc_thresholds[i]; + for (j = 0; j < C(*cc_score_adjustments); j++) { + if (j >= t) + cc_score_adjustments[i][j] = + - (i - tt.tt_put_token_cost); + else if (j < t - 1) + cc_score_adjustments[i][j] = 0; + else + /* + * cost now is + * length * (ccount + 1) a + * cost before was + * set-token-cost + length + + * ccount * put-token-cost b + * the score adjustment is (b - a) + */ + cc_score_adjustments[i][j] = + tt.tt_set_token_cost + i + + j * tt.tt_put_token_cost - + i * (j + 1); + if (j >= t) + cc_initial_scores[i][j] = 0; + else + /* + * - (set-token-cost + + * (length - put-token-cost) - + * (length - put-token-cost) * ccount) + */ + cc_initial_scores[i][j] = + - (tt.tt_set_token_cost + + (i - tt.tt_put_token_cost) - + (i - tt.tt_put_token_cost) * j); + } + } +#ifndef cc_weight + for (i = 1; i < C(cc_wthresholds); i++) { + cc_wthresholds[i] = + ((tt.tt_set_token_cost + tt.tt_put_token_cost) / i + + i / 5 + 1) * + cc_weight + 1; + cc_wlimits[i] = cc_wthresholds[i] + cc_weight; + } +#endif +#undef C + if ((cc_output = (struct cc **) + malloc((unsigned) cc_bufsize * sizeof *cc_output)) == 0) + goto nomem; + if ((cc_hashcodes = (short *) + malloc((unsigned) cc_bufsize * sizeof *cc_hashcodes)) == 0) + goto nomem; + if ((cc_htab = (struct cc **) malloc(HSIZE * sizeof *cc_htab)) == 0) + goto nomem; + if ((cc_tokens = (struct cc **) + malloc((unsigned) + (cc_ntoken + tt.tt_token_max - tt.tt_token_min + 1) * + sizeof *cc_tokens)) == 0) + goto nomem; + if ((cc_undo = (struct cc_undo *) + malloc((unsigned) cc_bufsize * sizeof *cc_undo)) == 0) + goto nomem; + for (i = tt.tt_token_min; i <= tt.tt_token_max; i++) + if ((cc_places[i] = (short *) + malloc((unsigned) cc_bufsize * sizeof **cc_places)) == 0) + goto nomem; + cc_q0a.qforw = cc_q0a.qback = &cc_q0a; + cc_q0b.qforw = cc_q0b.qback = &cc_q0b; + cc_q1a.qforw = cc_q1a.qback = &cc_q1a; + cc_q1b.qforw = cc_q1b.qback = &cc_q1b; + if ((p = (struct cc *) malloc((unsigned) cc_ntoken * sizeof *p)) == 0) + goto nomem; + for (i = 0; i < tt.tt_ntoken; i++) { + p->code = i; + p->time = -1; + p->qback = cc_q0a.qback; + p->qforw = &cc_q0a; + p->qback->qforw = p; + cc_q0a.qback = p; + p++; + } + for (; i < cc_ntoken; i++) { + p->code = -1; + p->time = -1; + p->qback = cc_q1a.qback; + p->qforw = &cc_q1a; + p->qback->qforw = p; + cc_q1a.qback = p; + p++; + } + cc_tt_ob = tt_ob; + cc_tt_obe = tt_obe; + if ((cc_buffer = malloc((unsigned) cc_bufsize)) == 0) + goto nomem; + return 0; +nomem: + wwerrno = WWE_NOMEM; + return -1; +} + +ccstart() +{ + int ccflush(); + + ttflush(); + tt_obp = tt_ob = cc_buffer; + tt_obe = tt_ob + cc_bufsize; + tt.tt_flush = ccflush; + if (cc_trace) { + cc_trace_fp = fopen("window-trace", "a"); + (void) fcntl(fileno(cc_trace_fp), F_SETFD, 1); + } + ccreset(); +} + +ccreset() +{ + register struct cc *p; + + bzero((char *) cc_htab, HSIZE * sizeof *cc_htab); + for (p = cc_q0a.qforw; p != &cc_q0a; p = p->qforw) + p->hback = 0; + for (p = cc_q1a.qforw; p != &cc_q1a; p = p->qforw) + p->hback = 0; +} + +ccend() +{ + + ttflush(); + tt_obp = tt_ob = cc_tt_ob; + tt_obe = cc_tt_obe; + tt.tt_flush = 0; + if (cc_trace_fp != NULL) { + (void) fclose(cc_trace_fp); + cc_trace_fp = NULL; + } +} + +ccflush() +{ + int bufsize = tt_obp - tt_ob; + int n; + + if (tt_ob != cc_buffer) + abort(); + if (cc_trace_fp != NULL) { + (void) fwrite(tt_ob, 1, bufsize, cc_trace_fp); + (void) putc(-1, cc_trace_fp); + } + tt.tt_flush = 0; + (*tt.tt_compress)(1); + if (bufsize < tt.tt_token_min) { + ttflush(); + goto out; + } + tt_obp = tt_ob = cc_tt_ob; + tt_obe = cc_tt_obe; + cc_time0 = cc_time; + cc_time += bufsize; + n = cc_sweep_phase(cc_buffer, bufsize, cc_tokens); + cc_compress_phase(cc_output, bufsize, cc_tokens, n); + cc_output_phase(cc_buffer, cc_output, bufsize); + ttflush(); + tt_obp = tt_ob = cc_buffer; + tt_obe = cc_buffer + cc_bufsize; +out: + (*tt.tt_compress)(0); + tt.tt_flush = ccflush; +} + +cc_sweep_phase(buffer, bufsize, tokens) + char *buffer; + struct cc **tokens; +{ + register struct cc **pp = tokens; + register i, n; +#ifdef STATS + int nn, ii; +#endif + +#ifdef STATS + if (verbose >= 0) + time_begin(); + if (verbose > 0) + printf("Sweep:"); +#endif + cc_sweep0(buffer, bufsize, tt.tt_token_min - 1); +#ifdef STATS + ntoken_stat = 0; + nn = 0; + ii = 0; +#endif + for (i = tt.tt_token_min; i <= tt.tt_token_max; i++) { +#ifdef STATS + if (verbose > 0) { + if (ii > 7) { + printf("\n "); + ii = 0; + } + ii++; + printf(" (%d", i); + (void) fflush(stdout); + } +#endif + n = cc_sweep(buffer, bufsize, pp, i); + pp += n; +#ifdef STATS + if (verbose > 0) { + if (--n > 0) { + printf(" %d", n); + nn += n; + } + putchar(')'); + } +#endif + } + qinsertq(&cc_q1b, &cc_q1a); +#ifdef STATS + if (verbose > 0) + printf("\n %d tokens, %d candidates\n", + ntoken_stat, nn); + if (verbose >= 0) + time_end(); +#endif + return pp - tokens; +} + +cc_sweep0(buffer, n, length) + char *buffer; +{ + register char *p; + register short *hc; + register i; + register short c; + register short pc = tt.tt_padc; + + /* n and length are at least 1 */ + p = buffer++; + hc = cc_hashcodes; + i = n; + do { + if ((*hc++ = *p++) == pc) + hc[-1] = -1; + } while (--i); + while (--length) { + p = buffer++; + hc = cc_hashcodes; + for (i = n--; --i;) { + if ((c = *p++) == pc || *hc < 0) + c = -1; + else + c = hash(*hc, c); + *hc++ = c; + } + } +} + +cc_sweep(buffer, bufsize, tokens, length) + char *buffer; + struct cc **tokens; + register length; +{ + register struct cc *p; + register char *cp; + register i; + short *hc; + short *places = cc_places[length]; + struct cc **pp = tokens; + short threshold = thresh(length); +#ifndef cc_weight + short wthreshold = wthresh(length); + short limit = wlimit(length); +#endif + int time; + short pc = tt.tt_padc; + + i = length - 1; + bufsize -= i; + cp = buffer + i; + hc = cc_hashcodes; + time = cc_time0; + for (i = 0; i < bufsize; i++, time++) { + struct cc **h; + + { + register short *hc1 = hc; + register short c = *cp++; + register short hh; + if ((hh = *hc1) < 0 || c == pc) { + *hc1++ = -1; + hc = hc1; + continue; + } + h = cc_htab + (*hc1++ = hash(hh, c)); + hc = hc1; + } + for (p = *h; p != 0; p = p->hforw) + if (p->length == (char) length) { + register char *p1 = p->string; + register char *p2 = cp - length; + register n = length; + do + if (*p1++ != *p2++) + goto fail; + while (--n); + break; + fail:; + } + if (p == 0) { + p = cc_q1a.qback; + if (p == &cc_q1a || + p->time >= cc_time0 && p->length == (char) length) + continue; + if (p->hback != 0) + if ((*p->hback = p->hforw) != 0) + p->hforw->hback = p->hback; + { + register char *p1 = p->string; + register char *p2 = cp - length; + register n = length; + do + *p1++ = *p2++; + while (--n); + } + p->length = length; +#ifndef cc_weight + p->weight = cc_weight; +#endif + p->time = time; + p->bcount = 1; + p->ccount = 0; + p->flag = 0; + if ((p->hforw = *h) != 0) + p->hforw->hback = &p->hforw; + *h = p; + p->hback = h; + qinsert(p, &cc_q1a); + places[i] = -1; + p->places = i; +#ifdef STATS + ntoken_stat++; +#endif + } else if (p->time < cc_time0) { +#ifndef cc_weight + if ((p->weight += p->time - time) < 0) + p->weight = cc_weight; + else if ((p->weight += cc_weight) > limit) + p->weight = limit; +#endif + p->time = time; + p->bcount = 1; + p->ccount = 0; + if (p->code >= 0) { + p->flag = 1; + *pp++ = p; + } else +#ifndef cc_weight + if (p->weight >= wthreshold) { + p->flag = 1; + *pp++ = p; + qinsert(p, &cc_q1b); + } else +#endif + { + p->flag = 0; + qinsert(p, &cc_q1a); + } + places[i] = -1; + p->places = i; +#ifdef STATS + ntoken_stat++; +#endif + } else if (p->time + length > time) { + /* + * overlapping token, don't count as two and + * don't update time, but do adjust weight to offset + * the difference + */ +#ifndef cc_weight + if (cc_weight != 0) { /* XXX */ + p->weight += time - p->time; + if (!p->flag && p->weight >= wthreshold) { + p->flag = 1; + *pp++ = p; + qinsert(p, &cc_q1b); + } + } +#endif + places[i] = p->places; + p->places = i; + } else { +#ifndef cc_weight + if ((p->weight += p->time - time) < 0) + p->weight = cc_weight; + else if ((p->weight += cc_weight) > limit) + p->weight = limit; +#endif + p->time = time; + p->bcount++; + if (!p->flag && + /* code must be < 0 if flag false here */ + (p->bcount >= threshold +#ifndef cc_weight + || p->weight >= wthreshold +#endif + )) { + p->flag = 1; + *pp++ = p; + qinsert(p, &cc_q1b); + } + places[i] = p->places; + p->places = i; + } + } + if ((i = pp - tokens) > 0) { + *pp = 0; + if (cc_reverse) + cc_sweep_reverse(tokens, places); + if (cc_sort && i > 1) { + int cc_token_compare(); + qsort((char *) tokens, i, sizeof *tokens, + cc_token_compare); + } + if (cc_chop) { + if ((i = i * cc_chop / 100) == 0) + i = 1; + tokens[i] = 0; + } + i++; + } + return i; +} + +cc_sweep_reverse(pp, places) + register struct cc **pp; + register short *places; +{ + register struct cc *p; + register short front, back, t; + + while ((p = *pp++) != 0) { + back = -1; + t = p->places; + /* the list is never empty */ + do { + front = places[t]; + places[t] = back; + back = t; + } while ((t = front) >= 0); + p->places = back; + } +} + +cc_compress_phase(output, bufsize, tokens, ntoken) + struct cc **output; + struct cc **tokens; +{ + register i; + + bzero((char *) output, bufsize * sizeof *output); + for (i = 0; i < cc_npass0; i++) + cc_compress_phase1(output, tokens, ntoken, 0); + for (i = 0; i < cc_npass1; i++) + cc_compress_phase1(output, tokens, ntoken, 1); + cc_compress_cleanup(output, bufsize); +} + +cc_compress_phase1(output, tokens, ntoken, flag) + register struct cc **output; + struct cc **tokens; +{ + register struct cc **pp; +#ifdef STATS + register int i = 0; + int nt = 0, cc = 0, nc = 0; +#endif + +#ifdef STATS + if (verbose >= 0) + time_begin(); + if (verbose > 0) + printf("Compress:"); +#endif + pp = tokens; + while (pp < tokens + ntoken) { +#ifdef STATS + if (verbose > 0) { + ntoken_stat = 0; + ccount_stat = 0; + ncover_stat = 0; + if (i > 2) { + printf("\n "); + i = 0; + } + i++; + printf(" (%d", (*pp)->length); + (void) fflush(stdout); + } +#endif + pp += cc_compress(output, pp, flag); +#ifdef STATS + if (verbose > 0) { + printf(" %dt %du %dc)", ntoken_stat, ccount_stat, + ncover_stat); + nt += ntoken_stat; + cc += ccount_stat; + nc += ncover_stat; + } +#endif + } +#ifdef STATS + if (verbose > 0) + printf("\n total: (%dt %du %dc)\n", nt, cc, nc); + if (verbose >= 0) + time_end(); +#endif +} + +cc_compress_cleanup(output, bufsize) + register struct cc **output; +{ + register struct cc **end; + + /* the previous output phase may have been interrupted */ + qinsertq(&cc_q0b, &cc_q0a); + for (end = output + bufsize; output < end;) { + register struct cc *p; + register length; + if ((p = *output) == 0) { + output++; + continue; + } + length = p->length; + if (!p->flag) { + } else if (p->code >= 0) { + qinsert(p, &cc_q0b); + p->flag = 0; + } else if (p->ccount == 0) { + *output = 0; + } else if (p->ccount >= thresh(length) +#ifndef cc_weight + || wthreshp(p->weight, length) +#endif + ) { + p->flag = 0; + } else { + p->ccount = 0; + *output = 0; + } + output += length; + } +} + +cc_compress(output, tokens, flag) + struct cc **output; + struct cc **tokens; + char flag; +{ + struct cc **pp = tokens; + register struct cc *p = *pp++; + int length = p->length; + int threshold = thresh(length); +#ifndef cc_weight + short wthreshold = wthresh(length); +#endif + short *places = cc_places[length]; + int *initial_scores = cc_initial_scores[length]; + int initial_score0 = put_token_score(length); + + do { + int score; + register struct cc_undo *undop; + int ccount; +#ifdef STATS + int ncover; +#endif + int i; + + ccount = p->ccount; + if ((short) ccount >= p->bcount) + continue; + if (p->code >= 0 || ccount >= threshold) + score = 0; +#ifndef cc_weight + else if (p->weight >= wthreshold) + /* allow one fewer match than normal */ + /* XXX, should adjust for ccount */ + score = - tt.tt_set_token_cost; +#endif + else + score = initial_scores[ccount]; + undop = cc_undo; +#ifdef STATS + ncover = 0; +#endif + for (i = p->places; i >= 0; i = places[i]) { + register struct cc **jp; + register struct cc *x; + register struct cc **ip = output + i; + register score0 = initial_score0; + struct cc **iip = ip + length; + struct cc_undo *undop1 = undop; + + if ((x = *(jp = ip)) != 0) + goto z; + while (--jp >= output) + if ((x = *jp) != 0) { + if (jp + x->length > ip) + goto z; + break; + } + jp = ip + 1; + while (jp < iip) { + if ((x = *jp) == 0) { + jp++; + continue; + } + z: + if (x == p) + goto undo; +#ifdef STATS + ncover++; +#endif + undop->pos = jp; + undop->val = x; + undop++; + *jp = 0; + x->ccount--; + score_adjust(score0, x); + if (score0 < 0 && flag) + goto undo; + jp += x->length; + } + undop->pos = ip; + undop->val = 0; + undop++; + *ip = p; + ccount++; + score += score0; + continue; + undo: + while (--undop >= undop1) + if (*undop->pos = x = undop->val) + x->ccount++; + undop++; + } + if (score > 0) { +#ifdef STATS + ccount_stat += ccount - p->ccount; + ntoken_stat++; + ncover_stat += ncover; +#endif + p->ccount = ccount; + } else { + register struct cc_undo *u = cc_undo; + while (--undop >= u) { + register struct cc *x; + if (*undop->pos = x = undop->val) + x->ccount++; + } + } + } while ((p = *pp++) != 0); + return pp - tokens; +} + +cc_output_phase(buffer, output, bufsize) + register char *buffer; + register struct cc **output; + register bufsize; +{ + register i; + register struct cc *p, *p1; + + for (i = 0; i < bufsize;) { + if ((p = output[i]) == 0) { + ttputc(buffer[i]); + i++; + } else if (p->code >= 0) { + if (--p->ccount == 0) + qinsert(p, &cc_q0a); + (*tt.tt_put_token)(p->code, p->string, p->length); + wwntokuse++; + wwntoksave += put_token_score(p->length); + i += p->length; + } else if ((p1 = cc_q0a.qback) != &cc_q0a) { + p->code = p1->code; + p1->code = -1; + qinsert(p1, &cc_q1a); + if (--p->ccount == 0) + qinsert(p, &cc_q0a); + else + qinsert(p, &cc_q0b); + (*tt.tt_set_token)(p->code, p->string, p->length); + wwntokdef++; + wwntoksave -= tt.tt_set_token_cost; + i += p->length; + } else { + p->ccount--; + ttwrite(p->string, p->length); + wwntokbad++; + i += p->length; + } + } + wwntokc += bufsize; +} + +cc_token_compare(p1, p2) + struct cc **p1, **p2; +{ + return (*p2)->bcount - (*p1)->bcount; +} diff --git a/usr.bin/window/context.c b/usr.bin/window/context.c new file mode 100644 index 0000000..cd43cdb --- /dev/null +++ b/usr.bin/window/context.c @@ -0,0 +1,131 @@ +/* + * Copyright (c) 1983, 1993 + * The Regents of the University of California. All rights reserved. + * + * This code is derived from software contributed to Berkeley by + * Edward Wang at The University of California, Berkeley. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. All advertising materials mentioning features or use of this software + * must display the following acknowledgement: + * This product includes software developed by the University of + * California, Berkeley and its contributors. + * 4. Neither the name of the University nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + */ + +#ifndef lint +static char sccsid[] = "@(#)context.c 8.1 (Berkeley) 6/6/93"; +#endif /* not lint */ + +#include "value.h" +#include "string.h" +#include "context.h" +#include <fcntl.h> + +/* + * Context push/pop for nested command files. + */ + +char *malloc(); + +cx_alloc() +{ + register struct context *xp; + + if (cx.x_type != 0) { + xp = (struct context *) + malloc((unsigned) sizeof (struct context)); + if (xp == 0) + return -1; + *xp = cx; + cx.x_link = xp; + cx.x_type = 0; + } + cx.x_erred = 0; + cx.x_synerred = 0; + cx.x_abort = 0; + return 0; +} + +cx_free() +{ + struct context *xp; + + if ((xp = cx.x_link) != 0) { + cx = *xp; + free((char *)xp); + } else + cx.x_type = 0; +} + +cx_beginfile(filename) +char *filename; +{ + if (cx_alloc() < 0) + return -1; + cx.x_type = X_FILE; + if ((cx.x_filename = str_cpy(filename)) == 0) + goto bad; + cx.x_fp = fopen(filename, "r"); + if (cx.x_fp == 0) + goto bad; + (void) fcntl(fileno(cx.x_fp), F_SETFD, 1); + cx.x_bol = 1; + cx.x_lineno = 0; + cx.x_errwin = 0; + cx.x_noerr = 0; + return 0; +bad: + if (cx.x_filename != 0) + str_free(cx.x_filename); + cx_free(); + return -1; +} + +cx_beginbuf(buf, arg, narg) +char *buf; +struct value *arg; +int narg; +{ + if (cx_alloc() < 0) + return -1; + cx.x_type = X_BUF; + cx.x_bufp = cx.x_buf = buf; + cx.x_arg = arg; + cx.x_narg = narg; + return 0; +} + +cx_end() +{ + switch (cx.x_type) { + case X_BUF: + break; + case X_FILE: + (void) fclose(cx.x_fp); + str_free(cx.x_filename); + break; + } + cx_free(); +} diff --git a/usr.bin/window/context.h b/usr.bin/window/context.h new file mode 100644 index 0000000..4863abe --- /dev/null +++ b/usr.bin/window/context.h @@ -0,0 +1,83 @@ +/* + * Copyright (c) 1983, 1993 + * The Regents of the University of California. All rights reserved. + * + * This code is derived from software contributed to Berkeley by + * Edward Wang at The University of California, Berkeley. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. All advertising materials mentioning features or use of this software + * must display the following acknowledgement: + * This product includes software developed by the University of + * California, Berkeley and its contributors. + * 4. Neither the name of the University nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * @(#)context.h 8.1 (Berkeley) 6/6/93 + */ + +#include <stdio.h> + +struct context { + struct context *x_link; /* nested contexts */ + char x_type; /* tag for union */ + union { + struct { /* input is a file */ + char *X_filename; /* input file name */ + FILE *X_fp; /* input stream */ + short X_lineno; /* current line number */ + char X_bol; /* at beginning of line */ + char X_noerr; /* don't report errors */ + struct ww *X_errwin; /* error window */ + } x_f; + struct { /* input is a buffer */ + char *X_buf; /* input buffer */ + char *X_bufp; /* current position in buf */ + struct value *X_arg; /* argument for alias */ + int X_narg; /* number of arguments */ + } x_b; + } x_un; + /* holding place for current token */ + int x_token; /* the token */ + struct value x_val; /* values associated with token */ + /* parser error flags */ + unsigned x_erred :1; /* had an error */ + unsigned x_synerred :1; /* had syntax error */ + unsigned x_abort :1; /* fatal error */ +}; +#define x_buf x_un.x_b.X_buf +#define x_bufp x_un.x_b.X_bufp +#define x_arg x_un.x_b.X_arg +#define x_narg x_un.x_b.X_narg +#define x_filename x_un.x_f.X_filename +#define x_fp x_un.x_f.X_fp +#define x_lineno x_un.x_f.X_lineno +#define x_bol x_un.x_f.X_bol +#define x_errwin x_un.x_f.X_errwin +#define x_noerr x_un.x_f.X_noerr + + /* x_type values, 0 is reserved */ +#define X_FILE 1 /* input is a file */ +#define X_BUF 2 /* input is a buffer */ + +struct context cx; /* the current context */ diff --git a/usr.bin/window/defs.h b/usr.bin/window/defs.h new file mode 100644 index 0000000..59eb729 --- /dev/null +++ b/usr.bin/window/defs.h @@ -0,0 +1,71 @@ +/* + * Copyright (c) 1983, 1993 + * The Regents of the University of California. All rights reserved. + * + * This code is derived from software contributed to Berkeley by + * Edward Wang at The University of California, Berkeley. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. All advertising materials mentioning features or use of this software + * must display the following acknowledgement: + * This product includes software developed by the University of + * California, Berkeley and its contributors. + * 4. Neither the name of the University nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * @(#)defs.h 8.1 (Berkeley) 6/6/93 + */ + +#include "ww.h" +#include <sys/time.h> + +#define NWINDOW 9 + +struct timeval starttime; + +struct ww *window[NWINDOW]; /* the windows */ +struct ww *selwin; /* the selected window */ +struct ww *lastselwin; /* the last selected window */ +struct ww *cmdwin; /* the command window */ +struct ww *framewin; /* the window for framing */ +struct ww *boxwin; /* the window for the box */ +struct ww *fgwin; /* the last foreground window */ + +#define isfg(w) ((w)->ww_order <= fgwin->ww_order) + +char *default_shell[128]; /* default shell argv */ +char *default_shellfile; /* default shell program */ +int default_nline; /* default buffer size for new windows */ +int default_smooth; /* default "smooth" parameter */ +char escapec; /* the escape character */ + + /* flags */ +char quit; /* quit command issued */ +char terse; /* terse mode */ +char debug; /* debug mode */ +char incmd; /* in command mode */ + +struct ww *getwin(); +struct ww *openwin(); +struct ww *vtowin(); +struct ww *openiwin(); diff --git a/usr.bin/window/error.c b/usr.bin/window/error.c new file mode 100644 index 0000000..63e0614 --- /dev/null +++ b/usr.bin/window/error.c @@ -0,0 +1,95 @@ +/* + * Copyright (c) 1983, 1993 + * The Regents of the University of California. All rights reserved. + * + * This code is derived from software contributed to Berkeley by + * Edward Wang at The University of California, Berkeley. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. All advertising materials mentioning features or use of this software + * must display the following acknowledgement: + * This product includes software developed by the University of + * California, Berkeley and its contributors. + * 4. Neither the name of the University nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + */ + +#ifndef lint +static char sccsid[] = "@(#)error.c 8.1 (Berkeley) 6/6/93"; +#endif /* not lint */ + +#include "defs.h" +#include "value.h" +#include "context.h" +#include "char.h" + +#define ERRLINES 10 /* number of lines for errwin */ + +/*VARARGS1*/ +error(fmt, a, b, c, d, e, f, g, h) +char *fmt; +{ + register struct context *x; + register struct ww *w; + + for (x = &cx; x != 0 && x->x_type != X_FILE; x = x->x_link) + ; + if (x == 0) { + if (terse) + wwbell(); + else { + wwprintf(cmdwin, fmt, a, b, c, d, e, f, g, h); + wwputs(" ", cmdwin); + } + return; + } + if (x->x_noerr) + return; + if ((w = x->x_errwin) == 0) { + char buf[512]; + + (void) sprintf(buf, "Errors from %s", x->x_filename); + if ((w = x->x_errwin = openiwin(ERRLINES, buf)) == 0) { + wwputs("Can't open error window. ", cmdwin); + x->x_noerr = 1; + return; + } + } + if (more(w, 0) == 2) { + x->x_noerr = 1; + return; + } + wwprintf(w, "line %d: ", x->x_lineno); + wwprintf(w, fmt, a, b, c, d, e, f, g, h); + wwputc('\n', w); +} + +err_end() +{ + if (cx.x_type == X_FILE && cx.x_errwin != 0) { + if (!cx.x_noerr) + waitnl(cx.x_errwin); + closeiwin(cx.x_errwin); + cx.x_errwin = 0; + } +} diff --git a/usr.bin/window/lcmd.c b/usr.bin/window/lcmd.c new file mode 100644 index 0000000..3938aa7 --- /dev/null +++ b/usr.bin/window/lcmd.c @@ -0,0 +1,154 @@ +/* + * Copyright (c) 1983, 1993 + * The Regents of the University of California. All rights reserved. + * + * This code is derived from software contributed to Berkeley by + * Edward Wang at The University of California, Berkeley. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. All advertising materials mentioning features or use of this software + * must display the following acknowledgement: + * This product includes software developed by the University of + * California, Berkeley and its contributors. + * 4. Neither the name of the University nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + */ + +#ifndef lint +static char sccsid[] = "@(#)lcmd.c 8.1 (Berkeley) 6/6/93"; +#endif /* not lint */ + +#include "defs.h" +#include "value.h" +#include "lcmd.h" + +int l_alias(); +int l_close(); +int l_cursormodes(); +int l_debug(); +int l_def_nline(); +int l_def_shell(); +int l_def_smooth(); +int l_echo(); +int l_escape(); +int l_foreground(); +int l_iostat(); +int l_label(); +int l_list(); +int l_select(); +int l_smooth(); +int l_source(); +int l_terse(); +int l_time(); +int l_unalias(); +int l_unset(); +int l_variable(); +int l_window(); +int l_write(); + +extern struct lcmd_arg arg_alias[]; +extern struct lcmd_arg arg_cursormodes[]; +extern struct lcmd_arg arg_debug[]; +extern struct lcmd_arg arg_echo[]; +extern struct lcmd_arg arg_escape[]; +extern struct lcmd_arg arg_foreground[]; +extern struct lcmd_arg arg_label[]; +extern struct lcmd_arg arg_def_nline[]; +extern struct lcmd_arg arg_def_shell[]; +extern struct lcmd_arg arg_def_smooth[]; +extern struct lcmd_arg arg_close[]; +extern struct lcmd_arg arg_select[]; +extern struct lcmd_arg arg_smooth[]; +extern struct lcmd_arg arg_source[]; +extern struct lcmd_arg arg_terse[]; +extern struct lcmd_arg arg_time[]; +extern struct lcmd_arg arg_unalias[]; +extern struct lcmd_arg arg_unset[]; +extern struct lcmd_arg arg_window[]; +extern struct lcmd_arg arg_write[]; +struct lcmd_arg arg_null[1] = { { 0 } }; + +struct lcmd_tab lcmd_tab[] = { + "alias", 1, l_alias, arg_alias, + "close", 2, l_close, arg_close, + "cursormodes", 2, l_cursormodes, arg_cursormodes, + "debug", 1, l_debug, arg_debug, + "default_nlines", 9, l_def_nline, arg_def_nline, + "default_shell", 10, l_def_shell, arg_def_shell, + "default_smooth", 10, l_def_smooth, arg_def_smooth, + "echo", 2, l_echo, arg_echo, + "escape", 2, l_escape, arg_escape, + "foreground", 1, l_foreground, arg_foreground, + "iostat", 1, l_iostat, arg_null, + "label", 2, l_label, arg_label, + "list", 2, l_list, arg_null, + "nlines", 1, l_def_nline, arg_def_nline, + "select", 2, l_select, arg_select, + "shell", 2, l_def_shell, arg_def_shell, + "smooth", 2, l_smooth, arg_smooth, + "source", 2, l_source, arg_source, + "terse", 2, l_terse, arg_terse, + "time", 2, l_time, arg_time, + "unalias", 3, l_unalias, arg_unalias, + "unset", 3, l_unset, arg_unset, + "variable", 1, l_variable, arg_null, + "window", 2, l_window, arg_window, + "write", 2, l_write, arg_write, + 0 +}; + +struct lcmd_tab * +lcmd_lookup(name) +char *name; +{ + register struct lcmd_tab *p; + + for (p = lcmd_tab; p->lc_name != 0; p++) + if (str_match(name, p->lc_name, p->lc_minlen)) + return p; + return 0; +} + +dosource(filename) +char *filename; +{ + if (cx_beginfile(filename) < 0) + return -1; + p_start(); + err_end(); + cx_end(); + return 0; +} + +dolongcmd(buffer, arg, narg) +char *buffer; +struct value *arg; +int narg; +{ + if (cx_beginbuf(buffer, arg, narg) < 0) + return -1; + p_start(); + err_end(); + cx_end(); + return 0; +} diff --git a/usr.bin/window/lcmd.h b/usr.bin/window/lcmd.h new file mode 100644 index 0000000..b3d1394 --- /dev/null +++ b/usr.bin/window/lcmd.h @@ -0,0 +1,61 @@ +/* + * Copyright (c) 1983, 1993 + * The Regents of the University of California. All rights reserved. + * + * This code is derived from software contributed to Berkeley by + * Edward Wang at The University of California, Berkeley. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. All advertising materials mentioning features or use of this software + * must display the following acknowledgement: + * This product includes software developed by the University of + * California, Berkeley and its contributors. + * 4. Neither the name of the University nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * @(#)lcmd.h 8.1 (Berkeley) 6/6/93 + */ + +#define LCMD_NARG 20 /* maximum number of arguments */ + +struct lcmd_tab { + char *lc_name; + int lc_minlen; + int (*lc_func)(); + struct lcmd_arg *lc_arg; +}; + +struct lcmd_arg { + char *arg_name; + int arg_minlen; + int arg_flags; +}; + + /* arg_flags bits */ +#define ARG_TYPE 0x0f /* type of arg */ +#define ARG_ANY 0x00 /* any type */ +#define ARG_NUM 0x01 /* must be a number */ +#define ARG_STR 0x02 /* must be a string */ +#define ARG_LIST 0x10 /* this arg can be a list */ + +struct lcmd_tab *lcmd_lookup(); diff --git a/usr.bin/window/lcmd1.c b/usr.bin/window/lcmd1.c new file mode 100644 index 0000000..ff96cac --- /dev/null +++ b/usr.bin/window/lcmd1.c @@ -0,0 +1,429 @@ +/* + * Copyright (c) 1983, 1993 + * The Regents of the University of California. All rights reserved. + * + * This code is derived from software contributed to Berkeley by + * Edward Wang at The University of California, Berkeley. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. All advertising materials mentioning features or use of this software + * must display the following acknowledgement: + * This product includes software developed by the University of + * California, Berkeley and its contributors. + * 4. Neither the name of the University nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + */ + +#ifndef lint +static char sccsid[] = "@(#)lcmd1.c 8.1 (Berkeley) 6/6/93"; +#endif /* not lint */ + +#include "defs.h" +#include "string.h" +#include "value.h" +#include "lcmd.h" +#include "var.h" + +struct lcmd_arg arg_window[] = { + { "row", 1, ARG_NUM }, + { "column", 1, ARG_NUM }, + { "nrows", 2, ARG_NUM }, + { "ncols", 2, ARG_NUM }, + { "nlines", 2, ARG_NUM }, + { "label", 1, ARG_STR }, + { "pty", 1, ARG_ANY }, + { "frame", 1, ARG_ANY }, + { "mapnl", 1, ARG_ANY }, + { "keepopen", 1, ARG_ANY }, + { "smooth", 1, ARG_ANY }, + { "shell", 1, ARG_STR|ARG_LIST }, + 0 +}; + +l_window(v, a) +struct value *v; +register struct value *a; +{ + struct ww *w; + int col, row, ncol, nrow, id, nline; + char *label; + char haspty, hasframe, mapnl, keepopen, smooth; + char *shf, **sh; + char *argv[sizeof default_shell / sizeof *default_shell]; + register char **pp; + + if ((id = findid()) < 0) + return; + row = a->v_type == V_ERR ? 1 : a->v_num; + a++; + col = a->v_type == V_ERR ? 0 : a->v_num; + a++; + nrow = a->v_type == V_ERR ? wwnrow - row : a->v_num; + a++; + ncol = a->v_type == V_ERR ? wwncol - col : a->v_num; + a++; + nline = a->v_type == V_ERR ? default_nline : a->v_num; + a++; + label = a->v_type == V_ERR ? 0 : a->v_str; + if ((haspty = vtobool(++a, 1, -1)) < 0) + return; + if ((hasframe = vtobool(++a, 1, -1)) < 0) + return; + if ((mapnl = vtobool(++a, !haspty, -1)) < 0) + return; + if ((keepopen = vtobool(++a, 0, -1)) < 0) + return; + if ((smooth = vtobool(++a, default_smooth, -1)) < 0) + return; + if ((++a)->v_type != V_ERR) { + for (pp = argv; a->v_type != V_ERR && + pp < &argv[sizeof argv/sizeof *argv-1]; pp++, a++) + *pp = a->v_str; + *pp = 0; + shf = *(sh = argv); + if (*sh = rindex(shf, '/')) + (*sh)++; + else + *sh = shf; + } else { + sh = default_shell; + shf = default_shellfile; + } + if ((w = openwin(id, row, col, nrow, ncol, nline, label, haspty, + hasframe, shf, sh)) == 0) + return; + w->ww_mapnl = mapnl; + w->ww_keepopen = keepopen; + w->ww_noupdate = !smooth; + v->v_type = V_NUM; + v->v_num = id + 1; +} + +struct lcmd_arg arg_def_nline[] = { + { "nlines", 1, ARG_NUM }, + 0 +}; + +l_def_nline(v, a) +register struct value *v, *a; +{ + v->v_num = default_nline; + v->v_type = V_NUM; + if (a->v_type != V_ERR) + default_nline = a->v_num; +} + +struct lcmd_arg arg_smooth[] = { + { "window", 1, ARG_NUM }, + { "flag", 1, ARG_ANY }, + 0 +}; + +l_smooth(v, a) +register struct value *v, *a; +{ + struct ww *w; + + v->v_type = V_NUM; + v->v_num = 0; + if ((w = vtowin(a++, selwin)) == 0) + return; + v->v_num = !w->ww_noupdate; + w->ww_noupdate = !vtobool(a, v->v_num, v->v_num); +} + +struct lcmd_arg arg_def_smooth[] = { + { "flag", 1, ARG_ANY }, + 0 +}; + +l_def_smooth(v, a) +register struct value *v, *a; +{ + v->v_type = V_NUM; + v->v_num = default_smooth; + default_smooth = vtobool(a, v->v_num, v->v_num); +} + +struct lcmd_arg arg_select[] = { + { "window", 1, ARG_NUM }, + 0 +}; + +l_select(v, a) +register struct value *v, *a; +{ + struct ww *w; + + v->v_type = V_NUM; + v->v_num = selwin ? selwin->ww_id + 1 : -1; + if (a->v_type == V_ERR) + return; + if ((w = vtowin(a, (struct ww *)0)) == 0) + return; + setselwin(w); +} + +struct lcmd_arg arg_debug[] = { + { "flag", 1, ARG_ANY }, + 0 +}; + +l_debug(v, a) +register struct value *v, *a; +{ + v->v_type = V_NUM; + v->v_num = debug; + debug = vtobool(a, debug, debug); +} + +struct lcmd_arg arg_escape[] = { + { "escapec", 1, ARG_STR }, + 0 +}; + +l_escape(v, a) +register struct value *v, *a; +{ + char buf[2]; + + buf[0] = escapec; + buf[1] = 0; + if ((v->v_str = str_cpy(buf)) == 0) { + error("Out of memory."); + return; + } + v->v_type = V_STR; + if (a->v_type != V_ERR) + setescape(a->v_str); +} + +struct lcmd_arg arg_label[] = { + { "window", 1, ARG_NUM }, + { "label", 1, ARG_STR }, + 0 +}; + +/*ARGSUSED*/ +l_label(v, a) +struct value *v; +register struct value *a; +{ + struct ww *w; + + if ((w = vtowin(a, selwin)) == 0) + return; + if ((++a)->v_type != V_ERR && setlabel(w, a->v_str) < 0) + error("Out of memory."); + reframe(); +} + +struct lcmd_arg arg_foreground[] = { + { "window", 1, ARG_NUM }, + { "flag", 1, ARG_ANY }, + 0 +}; + +l_foreground(v, a) +register struct value *v, *a; +{ + struct ww *w; + char flag; + + if ((w = vtowin(a, selwin)) == 0) + return; + v->v_type = V_NUM; + v->v_num = isfg(w); + flag = vtobool(++a, v->v_num, v->v_num); + if (flag == v->v_num) + return; + deletewin(w); + addwin(w, flag); + reframe(); +} + +struct lcmd_arg arg_terse[] = { + { "flag", 1, ARG_ANY }, + 0 +}; + +l_terse(v, a) +register struct value *v, *a; +{ + v->v_type = V_NUM; + v->v_num = terse; + setterse(vtobool(a, terse, terse)); +} + +struct lcmd_arg arg_source[] = { + { "filename", 1, ARG_STR }, + 0 +}; + +l_source(v, a) +register struct value *v, *a; +{ + v->v_type = V_NUM; + if (a->v_type != V_ERR && dosource(a->v_str) < 0) { + error("Can't open %s.", a->v_str); + v->v_num = -1; + } else + v->v_num = 0; +} + +struct lcmd_arg arg_write[] = { + { "window", 1, ARG_NUM }, + { "", 0, ARG_ANY|ARG_LIST }, + 0 +}; + +/*ARGSUSED*/ +l_write(v, a) +struct value *v; +register struct value *a; +{ + char buf[20]; + struct ww *w; + + if ((w = vtowin(a++, selwin)) == 0) + return; + while (a->v_type != V_ERR) { + if (a->v_type == V_NUM) { + (void) sprintf(buf, "%d", a->v_num); + (void) write(w->ww_pty, buf, strlen(buf)); + } else + (void) write(w->ww_pty, a->v_str, strlen(a->v_str)); + if ((++a)->v_type != V_ERR) + (void) write(w->ww_pty, " ", 1); + } +} + +struct lcmd_arg arg_close[] = { + { "window", 1, ARG_ANY|ARG_LIST }, + 0 +}; + +/*ARGSUSED*/ +l_close(v, a) +struct value *v; +register struct value *a; +{ + struct ww *w; + + if (a->v_type == V_STR && str_match(a->v_str, "all", 3)) + closewin((struct ww *)0); + else + for (; a->v_type != V_ERR; a++) + if ((w = vtowin(a, (struct ww *)0)) != 0) + closewin(w); +} + +struct lcmd_arg arg_cursormodes[] = { + { "modes", 1, ARG_NUM }, + 0 +}; + +l_cursormodes(v, a) +register struct value *v, *a; +{ + + v->v_type = V_NUM; + v->v_num = wwcursormodes; + if (a->v_type != V_ERR) + wwsetcursormodes(a->v_num); +} + +struct lcmd_arg arg_unset[] = { + { "variable", 1, ARG_ANY }, + 0 +}; + +l_unset(v, a) +register struct value *v, *a; +{ + v->v_type = V_NUM; + switch (a->v_type) { + case V_ERR: + v->v_num = -1; + return; + case V_NUM: + if ((a->v_str = str_itoa(a->v_num)) == 0) { + error("Out of memory."); + v->v_num = -1; + return; + } + a->v_type = V_STR; + break; + } + v->v_num = var_unset(a->v_str); +} + +struct ww * +vtowin(v, w) +register struct value *v; +struct ww *w; +{ + switch (v->v_type) { + case V_ERR: + if (w != 0) + return w; + error("No window specified."); + return 0; + case V_STR: + error("%s: No such window.", v->v_str); + return 0; + } + if (v->v_num < 1 || v->v_num > NWINDOW + || (w = window[v->v_num - 1]) == 0) { + error("%d: No such window.", v->v_num); + return 0; + } + return w; +} + +vtobool(v, def, err) +register struct value *v; +char def, err; +{ + switch (v->v_type) { + case V_NUM: + return v->v_num != 0; + case V_STR: + if (str_match(v->v_str, "true", 1) + || str_match(v->v_str, "on", 2) + || str_match(v->v_str, "yes", 1)) + return 1; + else if (str_match(v->v_str, "false", 1) + || str_match(v->v_str, "off", 2) + || str_match(v->v_str, "no", 1)) + return 0; + else { + error("%s: Illegal boolean value.", v->v_str); + return err; + } + /*NOTREACHED*/ + case V_ERR: + return def; + } + /*NOTREACHED*/ +} diff --git a/usr.bin/window/lcmd2.c b/usr.bin/window/lcmd2.c new file mode 100644 index 0000000..599cc98 --- /dev/null +++ b/usr.bin/window/lcmd2.c @@ -0,0 +1,397 @@ +/* + * Copyright (c) 1983, 1993 + * The Regents of the University of California. All rights reserved. + * + * This code is derived from software contributed to Berkeley by + * Edward Wang at The University of California, Berkeley. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. All advertising materials mentioning features or use of this software + * must display the following acknowledgement: + * This product includes software developed by the University of + * California, Berkeley and its contributors. + * 4. Neither the name of the University nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + */ + +#ifndef lint +static char sccsid[] = "@(#)lcmd2.c 8.1 (Berkeley) 6/6/93"; +#endif /* not lint */ + +#include "defs.h" +#include "string.h" +#include "value.h" +#include "var.h" +#include "lcmd.h" +#include "alias.h" +#include <sys/types.h> +#include <sys/resource.h> + +/*ARGSUSED*/ +l_iostat(v, a) +struct value *v, *a; +{ + register struct ww *w; + + if ((w = openiwin(16, "IO Statistics")) == 0) { + error("Can't open statistics window: %s.", wwerror()); + return; + } + wwprintf(w, "ttflush\twrite\terror\tzero\tchar\n"); + wwprintf(w, "%d\t%d\t%d\t%d\t%d\n", + wwnflush, wwnwr, wwnwre, wwnwrz, wwnwrc); + wwprintf(w, "token\tuse\tbad\tsaving\ttotal\tbaud\n"); + wwprintf(w, "%d\t%d\t%d\t%d\t%d\t%d/%d (%.1f/%.1f)\n", + wwntokdef, wwntokuse, wwntokbad, wwntoksave, wwntokc, + wwntokc - wwntoksave ? + (int) ((float) wwbaud * wwntokc / + (wwntokc - wwntoksave)) : + wwbaud, + wwnwrc ? (int) ((float) wwbaud * (wwnwrc + wwntoksave) / + wwnwrc) : + wwbaud, + wwntokc - wwntoksave ? + (float) wwntokc / (wwntokc - wwntoksave) : 1.0, + wwnwrc ? (float) (wwnwrc + wwntoksave) / wwnwrc : 1.0); + wwprintf(w, "wwwrite\tattempt\tchar\n"); + wwprintf(w, "%d\t%d\t%d\n", + wwnwwr, wwnwwra, wwnwwrc); + wwprintf(w, "wwupdat\tline\tmiss\tscan\tclreol\tclreos\tmiss\tline\n"); + wwprintf(w, "%d\t%d\t%d\t%d\t%d\t%d\t%d\t%d\n", + wwnupdate, wwnupdline, wwnupdmiss, wwnupdscan, wwnupdclreol, + wwnupdclreos, wwnupdclreosmiss, wwnupdclreosline); + wwprintf(w, "select\terror\tzero\n"); + wwprintf(w, "%d\t%d\t%d\n", + wwnselect, wwnselecte, wwnselectz); + wwprintf(w, "read\terror\tzero\tchar\tack\tnack\tstat\terrorc\n"); + wwprintf(w, "%d\t%d\t%d\t%d\t%d\t%d\t%d\t%d\n", + wwnread, wwnreade, wwnreadz, wwnreadc, wwnreadack, wwnreadnack, + wwnreadstat, wwnreadec); + wwprintf(w, "ptyread\terror\tzero\tcontrol\tdata\tchar\n"); + wwprintf(w, "%d\t%d\t%d\t%d\t%d\t%d\n", + wwnwread, wwnwreade, wwnwreadz, + wwnwreadp, wwnwreadd, wwnwreadc); + waitnl(w); + closeiwin(w); +} + +struct lcmd_arg arg_time[] = { + { "who", 1, ARG_STR }, + 0 +}; + +/*ARGSUSED*/ +l_time(v, a) +struct value *v; +register struct value *a; +{ + register struct ww *w; + struct rusage rusage; + struct timeval timeval; + char *strtime(); + + if ((w = openiwin(8, "Timing and Resource Usage")) == 0) { + error("Can't open time window: %s.", wwerror()); + return; + } + + (void) gettimeofday(&timeval, (struct timezone *)0); + timeval.tv_sec -= starttime.tv_sec; + if ((timeval.tv_usec -= starttime.tv_usec) < 0) { + timeval.tv_sec--; + timeval.tv_usec += 1000000; + } + (void) getrusage(a->v_type == V_STR + && str_match(a->v_str, "children", 1) + ? RUSAGE_CHILDREN : RUSAGE_SELF, &rusage); + + wwprintf(w, "%-15s %-15s %-15s\n", + "time", "utime", "stime"); + wwprintf(w, "%-15s ", strtime(&timeval)); + wwprintf(w, "%-15s ", strtime(&rusage.ru_utime)); + wwprintf(w, "%-15s\n", strtime(&rusage.ru_stime)); + wwprintf(w, "%-15s %-15s %-15s %-15s\n", + "maxrss", "ixrss", "idrss", "isrss"); + wwprintf(w, "%-15ld %-15ld %-15ld %-15ld\n", + rusage.ru_maxrss, rusage.ru_ixrss, + rusage.ru_idrss, rusage.ru_isrss); + wwprintf(w, "%-7s %-7s %-7s %-7s %-7s %-7s %-7s %-7s %-7s %-7s\n", + "minflt", "majflt", "nswap", "inblk", "oublk", + "msgsnd", "msgrcv", "nsigs", "nvcsw", "nivcsw"); + wwprintf(w, "%-7ld %-7ld %-7ld %-7ld %-7ld %-7ld %-7ld %-7ld %-7ld %-7ld\n", + rusage.ru_minflt, rusage.ru_majflt, rusage.ru_nswap, + rusage.ru_inblock, rusage.ru_oublock, + rusage.ru_msgsnd, rusage.ru_msgrcv, rusage.ru_nsignals, + rusage.ru_nvcsw, rusage.ru_nivcsw); + + waitnl(w); + closeiwin(w); +} + +char * +strtime(t) +register struct timeval *t; +{ + char fill = 0; + static char buf[20]; + register char *p = buf; + + if (t->tv_sec > 60*60) { + (void) sprintf(p, "%ld:", t->tv_sec / (60*60)); + while (*p++) + ; + p--; + t->tv_sec %= 60*60; + fill++; + } + if (t->tv_sec > 60) { + (void) sprintf(p, fill ? "%02ld:" : "%ld:", t->tv_sec / 60); + while (*p++) + ; + p--; + t->tv_sec %= 60; + fill++; + } + (void) sprintf(p, fill ? "%02ld.%02d" : "%ld.%02ld", + t->tv_sec, t->tv_usec / 10000); + return buf; +} + +/*ARGSUSED*/ +l_list(v, a) +struct value *v, *a; +{ + register struct ww *w, *wp; + register i; + int n; + + for (n = 0, i = 0; i < NWINDOW; i++) + if (window[i] != 0) + n++; + if (n == 0) { + error("No windows."); + return; + } + if ((w = openiwin(n + 2, "Windows")) == 0) { + error("Can't open listing window: %s.", wwerror()); + return; + } + for (i = 0; i < NWINDOW; i++) { + if ((wp = window[i]) == 0) + continue; + wwprintf(w, "%c %c %-13s %-.*s\n", + wp == selwin ? '+' : (wp == lastselwin ? '-' : ' '), + i + '1', + wp->ww_state == WWS_HASPROC ? "" : "(No process)", + wwncol - 20, + wp->ww_label ? wp->ww_label : "(No label)"); + } + waitnl(w); + closeiwin(w); +} + +/*ARGSUSED*/ +l_variable(v, a) +struct value *v, *a; +{ + register struct ww *w; + int printvar(); + + if ((w = openiwin(wwnrow - 3, "Variables")) == 0) { + error("Can't open variable window: %s.", wwerror()); + return; + } + if (var_walk(printvar, (int)w) >= 0) + waitnl(w); + closeiwin(w); +} + +printvar(w, r) +register struct ww *w; +register struct var *r; +{ + if (more(w, 0) == 2) + return -1; + wwprintf(w, "%16s ", r->r_name); + switch (r->r_val.v_type) { + case V_STR: + wwprintf(w, "%s\n", r->r_val.v_str); + break; + case V_NUM: + wwprintf(w, "%d\n", r->r_val.v_num); + break; + case V_ERR: + wwprintf(w, "ERROR\n"); + break; + } + return 0; +} + +struct lcmd_arg arg_def_shell[] = { + { "", 0, ARG_ANY|ARG_LIST }, + 0 +}; + +l_def_shell(v, a) + struct value *v, *a; +{ + register char **pp; + register struct value *vp; + + if (a->v_type == V_ERR) { + if ((v->v_str = str_cpy(default_shellfile)) != 0) + v->v_type = V_STR; + return; + } + if (v->v_str = default_shellfile) { + v->v_type = V_STR; + for (pp = default_shell + 1; *pp; pp++) { + str_free(*pp); + *pp = 0; + } + } + for (pp = default_shell, vp = a; + vp->v_type != V_ERR && + pp < &default_shell[sizeof default_shell/sizeof *default_shell-1]; + pp++, vp++) + if ((*pp = vp->v_type == V_STR ? + str_cpy(vp->v_str) : str_itoa(vp->v_num)) == 0) { + /* just leave default_shell[] the way it is */ + p_memerror(); + break; + } + if (default_shellfile = *default_shell) + if (*default_shell = rindex(default_shellfile, '/')) + (*default_shell)++; + else + *default_shell = default_shellfile; +} + +struct lcmd_arg arg_alias[] = { + { "", 0, ARG_STR }, + { "", 0, ARG_STR|ARG_LIST }, + 0 +}; + +l_alias(v, a) + struct value *v, *a; +{ + if (a->v_type == V_ERR) { + register struct ww *w; + int printalias(); + + if ((w = openiwin(wwnrow - 3, "Aliases")) == 0) { + error("Can't open alias window: %s.", wwerror()); + return; + } + if (alias_walk(printalias, (int)w) >= 0) + waitnl(w); + closeiwin(w); + } else { + register struct alias *ap = 0; + + if (ap = alias_lookup(a->v_str)) { + if ((v->v_str = str_cpy(ap->a_buf)) == 0) { + p_memerror(); + return; + } + v->v_type = V_STR; + } + if (a[1].v_type == V_STR) { + register struct value *vp; + register char *p, *q; + char *str; + register n; + + for (n = 0, vp = a + 1; vp->v_type != V_ERR; vp++, n++) + for (p = vp->v_str; *p; p++, n++) + ; + if ((str = str_alloc(n)) == 0) { + p_memerror(); + return; + } + for (q = str, vp = a + 1; vp->v_type != V_ERR; + vp++, q[-1] = ' ') + for (p = vp->v_str; *q++ = *p++;) + ; + q[-1] = 0; + if ((ap = alias_set(a[0].v_str, (char *)0)) == 0) { + p_memerror(); + str_free(str); + return; + } + ap->a_buf = str; + } + } +} + +printalias(w, a) +register struct ww *w; +register struct alias *a; +{ + if (more(w, 0) == 2) + return -1; + wwprintf(w, "%16s %s\n", a->a_name, a->a_buf); + return 0; +} + +struct lcmd_arg arg_unalias[] = { + { "alias", 1, ARG_STR }, + 0 +}; + +l_unalias(v, a) +struct value *v, *a; +{ + if (a->v_type == ARG_STR) + v->v_num = alias_unset(a->v_str); + v->v_type = V_NUM; +} + +struct lcmd_arg arg_echo[] = { + { "window", 1, ARG_NUM }, + { "", 0, ARG_ANY|ARG_LIST }, + 0 +}; + +/*ARGSUSED*/ +l_echo(v, a) +struct value *v; +register struct value *a; +{ + char buf[20]; + struct ww *w; + + if ((w = vtowin(a++, selwin)) == 0) + return; + while (a->v_type != V_ERR) { + if (a->v_type == V_NUM) { + (void) sprintf(buf, "%d", a->v_num); + (void) wwwrite(w, buf, strlen(buf)); + } else + (void) wwwrite(w, a->v_str, strlen(a->v_str)); + if ((++a)->v_type != V_ERR) + (void) wwwrite(w, " ", 1); + } + (void) wwwrite(w, "\r\n", 2); +} diff --git a/usr.bin/window/local.h b/usr.bin/window/local.h new file mode 100644 index 0000000..90378d8 --- /dev/null +++ b/usr.bin/window/local.h @@ -0,0 +1,51 @@ +/* + * Copyright (c) 1983, 1993 + * The Regents of the University of California. All rights reserved. + * + * This code is derived from software contributed to Berkeley by + * Edward Wang at The University of California, Berkeley. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. All advertising materials mentioning features or use of this software + * must display the following acknowledgement: + * This product includes software developed by the University of + * California, Berkeley and its contributors. + * 4. Neither the name of the University nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * @(#)local.h 8.1 (Berkeley) 6/6/93 + */ + +/* + * Things of local interest. + */ + +#define RUNCOM ".windowrc" +#define ESCAPEC ctrl('p') +#define NLINE 48 /* default text buffer size */ + +#ifdef TERMINFO +#define _PATH_CAPTOINFO "/usr/5bin/captoinfo" +#define _PATH_TIC "/usr/5bin/tic" +#define _PATH_RM "/bin/rm" +#endif diff --git a/usr.bin/window/main.c b/usr.bin/window/main.c new file mode 100644 index 0000000..15de840 --- /dev/null +++ b/usr.bin/window/main.c @@ -0,0 +1,202 @@ +/* + * Copyright (c) 1983, 1993 + * The Regents of the University of California. All rights reserved. + * + * This code is derived from software contributed to Berkeley by + * Edward Wang at The University of California, Berkeley. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. All advertising materials mentioning features or use of this software + * must display the following acknowledgement: + * This product includes software developed by the University of + * California, Berkeley and its contributors. + * 4. Neither the name of the University nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + */ + +#ifndef lint +char copyright[] = +"@(#) Copyright (c) 1983, 1993\n\ + The Regents of the University of California. All rights reserved.\n"; +#endif /* not lint */ + +#ifndef lint +static char sccsid[] = "@(#)main.c 8.2 (Berkeley) 4/2/94"; +#endif /* not lint */ + +#include "defs.h" +#include <paths.h> +#include <stdio.h> +#include "string.h" +#include "char.h" +#include "local.h" + +#define next(a) (*++*(a) ? *(a) : (*++(a) ? *(a) : (char *)usage())) + +/*ARGSUSED*/ +main(argc, argv) +char **argv; +{ + register char *p; + char fflag = 0; + char dflag = 0; + char xflag = 0; + char *cmd = 0; + char tflag = 0; + + escapec = ESCAPEC; + if (p = rindex(*argv, '/')) + p++; + else + p = *argv; + debug = strcmp(p, "a.out") == 0; + while (*++argv) { + if (**argv == '-') { + switch (*++*argv) { + case 'f': + fflag++; + break; + case 'c': + if (cmd != 0) { + (void) fprintf(stderr, + "Only one -c allowed.\n"); + (void) usage(); + } + cmd = next(argv); + break; + case 'e': + setescape(next(argv)); + break; + case 't': + tflag++; + break; + case 'd': + dflag++; + break; + case 'D': + debug = !debug; + break; + case 'x': + xflag++; + break; + default: + (void) usage(); + } + } else + (void) usage(); + } + if ((p = getenv("SHELL")) == 0) + p = _PATH_BSHELL; + if ((default_shellfile = str_cpy(p)) == 0) { + (void) fprintf(stderr, "Out of memory.\n"); + exit(1); + } + if (p = rindex(default_shellfile, '/')) + p++; + else + p = default_shellfile; + default_shell[0] = p; + default_shell[1] = 0; + default_nline = NLINE; + default_smooth = 1; + (void) gettimeofday(&starttime, (struct timezone *)0); + if (wwinit() < 0) { + (void) fprintf(stderr, "%s.\n", wwerror()); + exit(1); + } + +#ifdef OLD_TTY + if (debug) + wwnewtty.ww_tchars.t_quitc = wwoldtty.ww_tchars.t_quitc; + if (xflag) { + wwnewtty.ww_tchars.t_stopc = wwoldtty.ww_tchars.t_stopc; + wwnewtty.ww_tchars.t_startc = wwoldtty.ww_tchars.t_startc; + } +#else + if (debug) { + wwnewtty.ww_termios.c_cc[VQUIT] = + wwoldtty.ww_termios.c_cc[VQUIT]; + wwnewtty.ww_termios.c_lflag |= ISIG; + } + if (xflag) { + wwnewtty.ww_termios.c_cc[VSTOP] = + wwoldtty.ww_termios.c_cc[VSTOP]; + wwnewtty.ww_termios.c_cc[VSTART] = + wwoldtty.ww_termios.c_cc[VSTART]; + wwnewtty.ww_termios.c_iflag |= IXON; + } +#endif + if (debug || xflag) + (void) wwsettty(0, &wwnewtty); + + if ((cmdwin = wwopen(wwbaud > 2400 ? WWO_REVERSE : 0, 1, wwncol, + 0, 0, 0)) == 0) { + wwflush(); + (void) fprintf(stderr, "%s.\r\n", wwerror()); + goto bad; + } + cmdwin->ww_mapnl = 1; + cmdwin->ww_nointr = 1; + cmdwin->ww_noupdate = 1; + cmdwin->ww_unctrl = 1; + if ((framewin = wwopen(WWO_GLASS|WWO_FRAME, wwnrow, wwncol, 0, 0, 0)) + == 0) { + wwflush(); + (void) fprintf(stderr, "%s.\r\n", wwerror()); + goto bad; + } + wwadd(framewin, &wwhead); + if ((boxwin = wwopen(WWO_GLASS, wwnrow, wwncol, 0, 0, 0)) == 0) { + wwflush(); + (void) fprintf(stderr, "%s.\r\n", wwerror()); + goto bad; + } + fgwin = framewin; + + wwupdate(); + wwflush(); + setvars(); + + setterse(tflag); + setcmd(1); + if (cmd != 0) + (void) dolongcmd(cmd, (struct value *)0, 0); + if (!fflag) + if (dflag || doconfig() < 0) + dodefault(); + if (selwin != 0) + setcmd(0); + + mloop(); + +bad: + wwend(1); + return 0; +} + +usage() +{ + (void) fprintf(stderr, "Usage: window [-e escape-char] [-c command] [-t] [-f] [-d]\n"); + exit(1); + return 0; /* for lint */ +} diff --git a/usr.bin/window/mloop.c b/usr.bin/window/mloop.c new file mode 100644 index 0000000..68584e7 --- /dev/null +++ b/usr.bin/window/mloop.c @@ -0,0 +1,84 @@ +/* + * Copyright (c) 1983, 1993 + * The Regents of the University of California. All rights reserved. + * + * This code is derived from software contributed to Berkeley by + * Edward Wang at The University of California, Berkeley. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. All advertising materials mentioning features or use of this software + * must display the following acknowledgement: + * This product includes software developed by the University of + * California, Berkeley and its contributors. + * 4. Neither the name of the University nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + */ + +#ifndef lint +static char sccsid[] = "@(#)mloop.c 8.1 (Berkeley) 6/6/93"; +#endif /* not lint */ + +#include <sys/param.h> +#include "defs.h" + +mloop() +{ + while (!quit) { + if (incmd) { + docmd(); + } else if (wwcurwin->ww_state != WWS_HASPROC) { + if (!wwcurwin->ww_keepopen) + closewin(wwcurwin); + setcmd(1); + if (wwpeekc() == escapec) + (void) wwgetc(); + error("Process died."); + } else { + register struct ww *w = wwcurwin; + register char *p; + register n; + + if (wwibp >= wwibq) + wwiomux(); + for (p = wwibp; p < wwibq && wwmaskc(*p) != escapec; + p++) + ; + if ((n = p - wwibp) > 0) { + if (!w->ww_ispty && w->ww_stopped) + startwin(w); +#if defined(sun) && !defined(BSD) + /* workaround for SunOS pty bug */ + while (--n >= 0) + (void) write(w->ww_pty, wwibp++, 1); +#else + (void) write(w->ww_pty, wwibp, n); + wwibp = p; +#endif + } + if (wwpeekc() == escapec) { + (void) wwgetc(); + setcmd(1); + } + } + } +} diff --git a/usr.bin/window/parser.h b/usr.bin/window/parser.h new file mode 100644 index 0000000..747ae4b --- /dev/null +++ b/usr.bin/window/parser.h @@ -0,0 +1,47 @@ +/* + * Copyright (c) 1983, 1993 + * The Regents of the University of California. All rights reserved. + * + * This code is derived from software contributed to Berkeley by + * Edward Wang at The University of California, Berkeley. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. All advertising materials mentioning features or use of this software + * must display the following acknowledgement: + * This product includes software developed by the University of + * California, Berkeley and its contributors. + * 4. Neither the name of the University nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * @(#)parser.h 8.1 (Berkeley) 6/6/93 + */ + +#include "value.h" +#include "context.h" +#include "token.h" +#include "string.h" + +#define p_erred() (cx.x_erred) +#define p_synerred() (cx.x_synerred) +#define p_clearerr() (cx.x_erred = cx.x_synerred = 0) +#define p_abort() (cx.x_abort) diff --git a/usr.bin/window/parser1.c b/usr.bin/window/parser1.c new file mode 100644 index 0000000..9cc9790 --- /dev/null +++ b/usr.bin/window/parser1.c @@ -0,0 +1,222 @@ +/* + * Copyright (c) 1983, 1993 + * The Regents of the University of California. All rights reserved. + * + * This code is derived from software contributed to Berkeley by + * Edward Wang at The University of California, Berkeley. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. All advertising materials mentioning features or use of this software + * must display the following acknowledgement: + * This product includes software developed by the University of + * California, Berkeley and its contributors. + * 4. Neither the name of the University nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + */ + +#ifndef lint +static char sccsid[] = "@(#)parser1.c 8.1 (Berkeley) 6/6/93"; +#endif /* not lint */ + +#include "parser.h" + +p_start() +{ + char flag = 1; + + (void) s_gettok(); + for (;;) { + p_statementlist(flag); + if (token == T_EOF || p_abort()) + break; + flag = 0; + p_synerror(); + while (token != T_EOL && token != T_EOF) { + if (token == T_STR) + str_free(token_str); + (void) s_gettok(); + } + if (token == T_EOL) + (void) s_gettok(); + p_clearerr(); + } +} + +p_statementlist(flag) +char flag; +{ + for (; p_statement(flag) >= 0; p_clearerr()) + ; +} + +p_statement(flag) +char flag; +{ + switch (token) { + case T_EOL: + (void) s_gettok(); + return 0; + case T_IF: + return p_if(flag); + default: + return p_expression(flag); + } +} + +p_if(flag) +char flag; +{ + struct value t; + char true = 0; + +top: + (void) s_gettok(); + + if (p_expr(&t, flag) < 0) { + p_synerror(); + return -1; + } + switch (t.v_type) { + case V_NUM: + true = !true && t.v_num != 0; + break; + case V_STR: + p_error("if: Numeric value required."); + str_free(t.v_str); + case V_ERR: + flag = 0; + break; + } + + if (token != T_THEN) { + p_synerror(); + return -1; + } + + (void) s_gettok(); + p_statementlist(flag && true); + if (p_erred()) + return -1; + + if (token == T_ELSIF) + goto top; + + if (token == T_ELSE) { + (void) s_gettok(); + p_statementlist(flag && !true); + if (p_erred()) + return -1; + } + + if (token == T_ENDIF) { + (void) s_gettok(); + return 0; + } + + p_synerror(); + return -1; +} + +p_expression(flag) +char flag; +{ + struct value t; + char *cmd; + int p_function(), p_assign(); + + switch (token) { + case T_NUM: + t.v_type = V_NUM; + t.v_num = token_num; + (void) s_gettok(); + break; + case T_STR: + t.v_type = V_STR; + t.v_str = token_str; + (void) s_gettok(); + break; + default: + if (p_expr(&t, flag) < 0) + return -1; + if (token == T_EOF) { + val_free(t); + return 0; + } + } + if (token != T_ASSIGN && p_convstr(&t) < 0) + return -1; + cmd = t.v_type == V_STR ? t.v_str : 0; + if ((*(token == T_ASSIGN ? p_assign : p_function))(cmd, &t, flag) < 0) { + if (cmd) + str_free(cmd); + return -1; + } + if (cmd) + str_free(cmd); + val_free(t); + if (token == T_EOL) + (void) s_gettok(); + else if (token != T_EOF) { + p_synerror(); + return -1; + } + return 0; +} + +p_convstr(v) +register struct value *v; +{ + if (v->v_type != V_NUM) + return 0; + if ((v->v_str = str_itoa(v->v_num)) == 0) { + p_memerror(); + v->v_type = V_ERR; + return -1; + } + v->v_type = V_STR; + return 0; +} + +p_synerror() +{ + if (!cx.x_synerred) { + cx.x_synerred = cx.x_erred = 1; + error("Syntax error."); + } +} + +/*VARARGS1*/ +p_error(msg, a, b, c) +char *msg; +{ + if (!cx.x_erred) { + cx.x_erred = 1; + error(msg, a, b, c); + } +} + +p_memerror() +{ + cx.x_erred = cx.x_abort = 1; + error("Out of memory."); +} diff --git a/usr.bin/window/parser2.c b/usr.bin/window/parser2.c new file mode 100644 index 0000000..e9b2f55 --- /dev/null +++ b/usr.bin/window/parser2.c @@ -0,0 +1,231 @@ +/* + * Copyright (c) 1983, 1993 + * The Regents of the University of California. All rights reserved. + * + * This code is derived from software contributed to Berkeley by + * Edward Wang at The University of California, Berkeley. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. All advertising materials mentioning features or use of this software + * must display the following acknowledgement: + * This product includes software developed by the University of + * California, Berkeley and its contributors. + * 4. Neither the name of the University nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + */ + +#ifndef lint +static char sccsid[] = "@(#)parser2.c 8.1 (Berkeley) 6/6/93"; +#endif /* not lint */ + +#include "parser.h" +#include "var.h" +#include "lcmd.h" +#include "alias.h" + +/* + * name == 0 means we don't have a function name but + * want to parse the arguments anyway. flag == 0 in this case. + */ +p_function(name, v, flag) +char *name; +register struct value *v; +{ + struct value t; + register struct lcmd_tab *c = 0; + register struct alias *a = 0; + register struct lcmd_arg *ap; /* this arg */ + struct lcmd_arg *lp = 0; /* list arg */ + register i; + struct value av[LCMD_NARG + 1]; + register struct value *vp; + + if (name != 0) + if (c = lcmd_lookup(name)) + name = c->lc_name; + else if (a = alias_lookup(name)) + name = a->a_name; + else { + p_error("%s: No such command or alias.", name); + flag = 0; + } + + for (vp = av; vp < &av[LCMD_NARG + 1]; vp++) + vp->v_type = V_ERR; + + if (token == T_LP) + (void) s_gettok(); + i = 0; + for (;;) { + ap = 0; + vp = 0; + if (token == T_COMMA) /* null argument */ + t.v_type = V_ERR; + else { + if (p_expr0(&t, flag) < 0) + break; + if (t.v_type == V_ERR) + flag = 0; + } + if (token != T_ASSIGN) { + if (i >= LCMD_NARG || + c != 0 && (ap = lp) == 0 && + (ap = c->lc_arg + i)->arg_name == 0) { + p_error("%s: Too many arguments.", name); + flag = 0; + } else + vp = &av[i++]; + } else { + char *tmp; + if (p_convstr(&t) < 0) + goto abort; + tmp = t.v_type == V_STR ? t.v_str : 0; + (void) s_gettok(); + if (p_expr(&t, flag) < 0) { + if (tmp) + str_free(tmp); + p_synerror(); + goto abort; + } + if (t.v_type == V_ERR) + flag = 0; + if (tmp) { + if (c == 0) { + /* an aliase */ + p_error("%s: Bad alias syntax.", name); + flag = 0; + } else { + for (ap = c->lc_arg, vp = av; + ap != 0 && ap->arg_name != 0 && + (*ap->arg_name == '\0' || + !str_match(tmp, ap->arg_name, + ap->arg_minlen)); + ap++, vp++) + ; + if (ap == 0 || ap->arg_name == 0) { + p_error("%s: Unknown argument \"%s\".", + name, tmp); + flag = 0; + ap = 0; + vp = 0; + } + } + str_free(tmp); + } + } + if (ap != 0) { + if (ap->arg_flags & ARG_LIST) { + i = vp - av + 1; + lp = ap; + } + if (vp->v_type != V_ERR) { + if (*ap->arg_name) + p_error("%s: Argument %d (%s) duplicated.", + name, vp - av + 1, + ap->arg_name); + else + p_error("%s: Argument %d duplicated.", + name, vp - av + 1); + flag = 0; + vp = 0; + } else if (t.v_type == V_ERR) { + /* do nothing */ + } else if ((ap->arg_flags&ARG_TYPE) == ARG_NUM && + t.v_type != V_NUM || + (ap->arg_flags&ARG_TYPE) == ARG_STR && + t.v_type != V_STR) { + if (*ap->arg_name) + p_error("%s: Argument %d (%s) type mismatch.", + name, vp - av + 1, + ap->arg_name); + else + p_error("%s: Argument %d type mismatch.", + name, vp - av + 1); + flag = 0; + vp = 0; + } + } + if (vp != 0) + *vp = t; + else + val_free(t); + if (token == T_COMMA) + (void) s_gettok(); + } + + if (p_erred()) + flag = 0; + if (token == T_RP) + (void) s_gettok(); + else if (token != T_EOL && token != T_EOF) + flag = 0; /* look for legal follow set */ + v->v_type = V_ERR; + if (flag) + if (c != 0) + (*c->lc_func)(v, av); + else + if (a->a_flags & A_INUSE) + p_error("%s: Recursive alias.", a->a_name); + else { + a->a_flags |= A_INUSE; + if (dolongcmd(a->a_buf, av, i) < 0) + p_memerror(); + a->a_flags &= ~A_INUSE; + } + if (p_abort()) { + val_free(*v); + v->v_type = V_ERR; + goto abort; + } + for (vp = av; vp < &av[LCMD_NARG]; vp++) + val_free(*vp); + return 0; +abort: + for (vp = av; vp < &av[LCMD_NARG]; vp++) + val_free(*vp); + return -1; +} + +p_assign(name, v, flag) +char *name; +struct value *v; +char flag; +{ + (void) s_gettok(); + + if (p_expr(v, flag) < 0) { + p_synerror(); + return -1; + } + switch (v->v_type) { + case V_STR: + case V_NUM: + if (flag && var_set(name, v) == 0) { + p_memerror(); + val_free(*v); + return -1; + } + break; + } + return 0; +} diff --git a/usr.bin/window/parser3.c b/usr.bin/window/parser3.c new file mode 100644 index 0000000..d4aa80d --- /dev/null +++ b/usr.bin/window/parser3.c @@ -0,0 +1,191 @@ +/* + * Copyright (c) 1983, 1993 + * The Regents of the University of California. All rights reserved. + * + * This code is derived from software contributed to Berkeley by + * Edward Wang at The University of California, Berkeley. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. All advertising materials mentioning features or use of this software + * must display the following acknowledgement: + * This product includes software developed by the University of + * California, Berkeley and its contributors. + * 4. Neither the name of the University nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + */ + +#ifndef lint +static char sccsid[] = "@(#)parser3.c 8.1 (Berkeley) 6/6/93"; +#endif /* not lint */ + +#include "parser.h" + +/* + * = + * ? : + * || + * && + * | + * ^ + * & + * == != + * <= >= + * << >> + * + - + * * / % + * unary - + ~ ! + */ +p_expr(v, flag) +register struct value *v; +char flag; +{ + struct value t; + int ret; + + if (p_expr0(&t, flag) < 0) + return -1; + + if (token != T_ASSIGN) { + *v = t; + return 0; + } + switch (t.v_type) { + case V_NUM: + p_error("%d: Not a variable.", t.v_num); + case V_ERR: + t.v_str = 0; + break; + } + ret = p_assign(t.v_str, v, flag); + if (t.v_str != 0) + str_free(t.v_str); + return ret; +} + +/* + * ? : + */ +p_expr0(v, flag) +register struct value *v; +char flag; +{ + struct value t; + char true; + + if (p_expr1(v, flag) < 0) + return -1; + if (token != T_QUEST) + return 0; + switch (v->v_type) { + case V_NUM: + true = v->v_num != 0; + break; + case V_STR: + p_error("?: Numeric left operand required."); + str_free(v->v_str); + v->v_type = V_ERR; + case V_ERR: + flag = 0; + break; + } + (void) s_gettok(); + v->v_type = V_ERR; + if ((flag && true ? p_expr1(v, 1) : p_expr1(&t, 0)) < 0) + return -1; + if (token != T_COLON) { + val_free(*v); + p_synerror(); + return -1; + } + (void) s_gettok(); + return flag && !true ? p_expr1(v, 1) : p_expr1(&t, 0); +} + +/* + * || + */ +p_expr1(v, flag) +register struct value *v; +char flag; +{ + char true = 0; + + if (p_expr2(v, flag) < 0) + return -1; + if (token != T_OROR) + return 0; + for (;;) { + switch (v->v_type) { + case V_NUM: + v->v_num = true = true || v->v_num != 0; + break; + case V_STR: + p_error("||: Numeric operands required."); + str_free(v->v_str); + v->v_type = V_ERR; + case V_ERR: + flag = 0; + break; + } + if (token != T_OROR) + return 0; + (void) s_gettok(); + if (p_expr2(v, flag && !true) < 0) + return -1; + } +} + +/* + * && + */ +p_expr2(v, flag) +register struct value *v; +char flag; +{ + char true = 1; + + if (p_expr3_10(3, v, flag) < 0) + return -1; + if (token != T_ANDAND) + return 0; + for (;;) { + switch (v->v_type) { + case V_NUM: + v->v_num = true = true && v->v_num != 0; + break; + case V_STR: + p_error("&&: Numeric operands required."); + str_free(v->v_str); + v->v_type = V_ERR; + case V_ERR: + flag = 0; + break; + } + if (token != T_ANDAND) + return 0; + (void) s_gettok(); + if (p_expr3_10(3, v, flag && true) < 0) + return -1; + } + /*NOTREACHED*/ +} diff --git a/usr.bin/window/parser4.c b/usr.bin/window/parser4.c new file mode 100644 index 0000000..16ffb0c --- /dev/null +++ b/usr.bin/window/parser4.c @@ -0,0 +1,296 @@ +/* + * Copyright (c) 1983, 1993 + * The Regents of the University of California. All rights reserved. + * + * This code is derived from software contributed to Berkeley by + * Edward Wang at The University of California, Berkeley. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. All advertising materials mentioning features or use of this software + * must display the following acknowledgement: + * This product includes software developed by the University of + * California, Berkeley and its contributors. + * 4. Neither the name of the University nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + */ + +#ifndef lint +static char sccsid[] = "@(#)parser4.c 8.1 (Berkeley) 6/6/93"; +#endif /* not lint */ + +#include "parser.h" + +/* + * | 3 + * ^ 4 + * & 5 + * == != 6 + * < <= > >= 7 + * << >> 8 + * + - 9 + * * / % 10 + */ +p_expr3_10(level, v, flag) +register struct value *v; +char flag; +{ + struct value l, r; + int op; + char *opname; + + if ((level == 10 ? p_expr11(v, flag) + : p_expr3_10(level + 1, v, flag)) < 0) + return -1; + for (;;) { + switch (level) { + case 3: + if (token != T_OR) + return 0; + opname = "|"; + break; + case 4: + if (token != T_XOR) + return 0; + opname = "^"; + break; + case 5: + if (token != T_AND) + return 0; + opname = "&"; + break; + case 6: + if (token == T_EQ) + opname = "=="; + else if (token == T_NE) + opname = "!="; + else + return 0; + break; + case 7: + switch (token) { + case T_LT: + opname = "<"; + break; + case T_LE: + opname = "<="; + break; + case T_GT: + opname = ">"; + break; + case T_GE: + opname = ">="; + break; + default: + return 0; + } + break; + case 8: + if (token == T_LS) + opname = "<<"; + else if (token == T_RS) + opname = ">>"; + else + return 0; + break; + case 9: + if (token == T_PLUS) + opname = "+"; + else if (token == T_MINUS) + opname = "-"; + else + return 0; + break; + case 10: + switch (token) { + case T_MUL: + opname = "*"; + break; + case T_DIV: + opname = "/"; + break; + case T_MOD: + opname = "%"; + break; + default: + return 0; + } + break; + } + l = *v; + if (l.v_type == V_ERR) + flag = 0; + + op = token; + (void) s_gettok(); + if ((level == 10 ? p_expr11(&r, flag) + : p_expr3_10(level + 1, &r, flag)) < 0) { + p_synerror(); + val_free(l); + return -1; + } + + if (r.v_type == V_ERR) + flag = 0; + else switch (op) { + case T_EQ: + case T_NE: + case T_LT: + case T_LE: + case T_GT: + case T_GE: + case T_PLUS: + if (l.v_type == V_STR) { + if (r.v_type == V_NUM) + if (p_convstr(&r) < 0) + flag = 0; + } else + if (r.v_type == V_STR) + if (p_convstr(&l) < 0) + flag = 0; + break; + case T_LS: + case T_RS: + if (r.v_type == V_STR) { + char *p = r.v_str; + r.v_type = V_NUM; + r.v_num = strlen(p); + str_free(p); + } + break; + case T_OR: + case T_XOR: + case T_AND: + case T_MINUS: + case T_MUL: + case T_DIV: + case T_MOD: + default: + if (l.v_type == V_STR || r.v_type == V_STR) { + p_error("%s: Numeric operands required.", + opname); + flag = 0; + } + } + if (!flag) { + val_free(l); + val_free(r); + v->v_type = V_ERR; + if (p_abort()) + return -1; + continue; + } + + v->v_type = V_NUM; + switch (op) { + case T_EQ: + case T_NE: + case T_LT: + case T_LE: + case T_GT: + case T_GE: + if (l.v_type == V_STR) { + int tmp = strcmp(l.v_str, r.v_str); + str_free(l.v_str); + str_free(r.v_str); + l.v_type = V_NUM; + l.v_num = tmp; + r.v_type = V_NUM; + r.v_num = 0; + } + break; + } + switch (op) { + case T_OR: + v->v_num = l.v_num | r.v_num; + break; + case T_XOR: + v->v_num = l.v_num ^ r.v_num; + break; + case T_AND: + v->v_num = l.v_num & r.v_num; + break; + case T_EQ: + v->v_num = l.v_num == r.v_num; + break; + case T_NE: + v->v_num = l.v_num != r.v_num; + break; + case T_LT: + v->v_num = l.v_num < r.v_num; + break; + case T_LE: + v->v_num = l.v_num <= r.v_num; + break; + case T_GT: + v->v_num = l.v_num > r.v_num; + break; + case T_GE: + v->v_num = l.v_num >= r.v_num; + break; + case T_LS: + if (l.v_type == V_STR) { + int i; + if ((i = strlen(l.v_str)) > r.v_num) + i = r.v_num; + v->v_str = str_ncpy(l.v_str, i); + v->v_type = V_STR; + } else + v->v_num = l.v_num << r.v_num; + break; + case T_RS: + if (l.v_type == V_STR) { + int i; + if ((i = strlen(l.v_str)) > r.v_num) + i -= r.v_num; + else + i = 0; + v->v_str = str_cpy(l.v_str + i); + v->v_type = V_STR; + } else + v->v_num = l.v_num >> r.v_num; + break; + case T_PLUS: + if (l.v_type == V_STR) { + v->v_str = str_cat(l.v_str, r.v_str); + v->v_type = V_STR; + } else + v->v_num = l.v_num + r.v_num; + break; + case T_MINUS: + v->v_num = l.v_num - r.v_num; + break; + case T_MUL: + v->v_num = l.v_num * r.v_num; + break; + case T_DIV: + v->v_num = l.v_num / r.v_num; + break; + case T_MOD: + v->v_num = l.v_num % r.v_num; + break; + } + val_free(l); + val_free(r); + } + /*NOTREACHED*/ +} diff --git a/usr.bin/window/parser5.c b/usr.bin/window/parser5.c new file mode 100644 index 0000000..b179756 --- /dev/null +++ b/usr.bin/window/parser5.c @@ -0,0 +1,201 @@ +/* + * Copyright (c) 1983, 1993 + * The Regents of the University of California. All rights reserved. + * + * This code is derived from software contributed to Berkeley by + * Edward Wang at The University of California, Berkeley. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. All advertising materials mentioning features or use of this software + * must display the following acknowledgement: + * This product includes software developed by the University of + * California, Berkeley and its contributors. + * 4. Neither the name of the University nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + */ + +#ifndef lint +static char sccsid[] = "@(#)parser5.c 8.1 (Berkeley) 6/6/93"; +#endif /* not lint */ + +#include "parser.h" +#include "var.h" + +/* + * unary $ $? + - ! ~ + */ +p_expr11(v, flag) +register struct value *v; +char flag; +{ + int op; + char *opname; + + switch (token) { + case T_DOLLAR: + opname = "$"; + break; + case T_DQ: + opname = "$?"; + break; + case T_PLUS: + opname = "unary +"; + break; + case T_MINUS: + opname = "unary -"; + break; + case T_NOT: + opname = "!"; + break; + case T_COMP: + opname = "~"; + break; + default: + return p_expr12(v, flag); + } + op = token; + (void) s_gettok(); + if (p_expr11(v, flag) < 0) + return -1; + switch (v->v_type) { + case V_NUM: + break; + case V_STR: + switch (op) { + case T_MINUS: + case T_NOT: + case T_COMP: + p_error("%s: Numeric operand required.", opname); + str_free(v->v_str); + v->v_type = V_ERR; + return 0; + } + break; + case V_ERR: + return 0; + } + switch (op) { + case T_DOLLAR: + case T_DQ: + if (v->v_type == V_NUM) { + int tmp = cx.x_type == X_BUF && cx.x_arg != 0 && + v->v_num > 0 && v->v_num <= cx.x_narg; + if (op == T_DQ) + v->v_num = tmp; + else if (tmp) + *v = cx.x_arg[v->v_num - 1]; + else { + p_error("%d: No such argument.", v->v_num); + v->v_type = V_ERR; + } + } else { + char *name = v->v_str; + struct var *r = var_lookup(name); + if (op == T_DQ) { + v->v_type = V_NUM; + v->v_num = r != 0; + } else if (r != 0) + *v = r->r_val; + else { + p_error("%s: Undefined variable.", name); + v->v_type = V_ERR; + } + str_free(name); + } + if (v->v_type == V_STR && (v->v_str = str_cpy(v->v_str)) == 0) { + p_memerror(); + return -1; + } + break; + case T_MINUS: + v->v_num = - v->v_num; + break; + case T_NOT: + v->v_num = ! v->v_num; + break; + case T_COMP: + v->v_num = ~ v->v_num; + break; + } + return 0; +} + +/* + * string, number, ( expr ) + * Plus function calls. + * + * Always return v_type == V_ERR when flag == 0. + */ +p_expr12(v, flag) +register struct value *v; +char flag; +{ + v->v_type = V_ERR; + switch (token) { + case T_NUM: + if (flag) { + v->v_type = V_NUM; + v->v_num = token_num; + } + (void) s_gettok(); + break; + case T_STR: + if (flag) { + v->v_type = V_STR; + v->v_str = token_str; + } else + str_free(token_str); + (void) s_gettok(); + break; + case T_LP: + (void) s_gettok(); + if (p_expr(v, flag) < 0) { + p_synerror(); + return -1; + } + if (token != T_RP) { + p_synerror(); + val_free(*v); + return -1; + } + (void) s_gettok(); + break; + default: + return -1; + } + while (token == T_LP) { + char *cmd; + + if (p_convstr(v) < 0) + return -1; + cmd = v->v_type == V_STR ? v->v_str : 0; + if (p_function(cmd, v, flag) < 0) { + if (cmd) + str_free(cmd); + return -1; + } + if (cmd) + str_free(cmd); + } + return 0; +} diff --git a/usr.bin/window/scanner.c b/usr.bin/window/scanner.c new file mode 100644 index 0000000..d10719c --- /dev/null +++ b/usr.bin/window/scanner.c @@ -0,0 +1,572 @@ +/* + * Copyright (c) 1983, 1993 + * The Regents of the University of California. All rights reserved. + * + * This code is derived from software contributed to Berkeley by + * Edward Wang at The University of California, Berkeley. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. All advertising materials mentioning features or use of this software + * must display the following acknowledgement: + * This product includes software developed by the University of + * California, Berkeley and its contributors. + * 4. Neither the name of the University nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + */ + +#ifndef lint +static char sccsid[] = "@(#)scanner.c 8.1 (Berkeley) 6/6/93"; +#endif /* not lint */ + +#include "value.h" +#include "token.h" +#include "context.h" +#include "string.h" + +s_getc() +{ + register c; + + switch (cx.x_type) { + case X_FILE: + c = getc(cx.x_fp); + if (cx.x_bol && c != EOF) { + cx.x_bol = 0; + cx.x_lineno++; + } + if (c == '\n') + cx.x_bol = 1; + return c; + case X_BUF: + if (*cx.x_bufp != 0) + return *cx.x_bufp++ & 0xff; + else + return EOF; + } + /*NOTREACHED*/ +} + +s_ungetc(c) +{ + if (c == EOF) + return EOF; + switch (cx.x_type) { + case X_FILE: + cx.x_bol = 0; + return ungetc(c, cx.x_fp); + case X_BUF: + if (cx.x_bufp > cx.x_buf) + return *--cx.x_bufp = c; + else + return EOF; + } + /*NOTREACHED*/ +} + +s_gettok() +{ + char buf[100]; + register char *p = buf; + register c; + register state = 0; + +loop: + c = s_getc(); + switch (state) { + case 0: + switch (c) { + case ' ': + case '\t': + break; + case '\n': + case ';': + cx.x_token = T_EOL; + state = -1; + break; + case '#': + state = 1; + break; + case EOF: + cx.x_token = T_EOF; + state = -1; + break; + case 'a': case 'b': case 'c': case 'd': case 'e': + case 'f': case 'g': case 'h': case 'i': case 'j': + case 'k': case 'l': case 'm': case 'n': case 'o': + case 'p': case 'q': case 'r': case 's': case 't': + case 'u': case 'v': case 'w': case 'x': case 'y': + case 'z': + case 'A': case 'B': case 'C': case 'D': case 'E': + case 'F': case 'G': case 'H': case 'I': case 'J': + case 'K': case 'L': case 'M': case 'N': case 'O': + case 'P': case 'Q': case 'R': case 'S': case 'T': + case 'U': case 'V': case 'W': case 'X': case 'Y': + case 'Z': + case '_': case '.': + *p++ = c; + state = 2; + break; + case '"': + state = 3; + break; + case '\'': + state = 4; + break; + case '\\': + switch (c = s_gettok1()) { + case -1: + break; + case -2: + state = 0; + break; + default: + *p++ = c; + state = 2; + } + break; + case '0': + cx.x_val.v_num = 0; + state = 10; + break; + case '1': case '2': case '3': case '4': + case '5': case '6': case '7': case '8': case '9': + cx.x_val.v_num = c - '0'; + state = 11; + break; + case '>': + state = 20; + break; + case '<': + state = 21; + break; + case '=': + state = 22; + break; + case '!': + state = 23; + break; + case '&': + state = 24; + break; + case '|': + state = 25; + break; + case '$': + state = 26; + break; + case '~': + cx.x_token = T_COMP; + state = -1; + break; + case '+': + cx.x_token = T_PLUS; + state = -1; + break; + case '-': + cx.x_token = T_MINUS; + state = -1; + break; + case '*': + cx.x_token = T_MUL; + state = -1; + break; + case '/': + cx.x_token = T_DIV; + state = -1; + break; + case '%': + cx.x_token = T_MOD; + state = -1; + break; + case '^': + cx.x_token = T_XOR; + state = -1; + break; + case '(': + cx.x_token = T_LP; + state = -1; + break; + case ')': + cx.x_token = T_RP; + state = -1; + break; + case ',': + cx.x_token = T_COMMA; + state = -1; + break; + case '?': + cx.x_token = T_QUEST; + state = -1; + break; + case ':': + cx.x_token = T_COLON; + state = -1; + break; + case '[': + cx.x_token = T_LB; + state = -1; + break; + case ']': + cx.x_token = T_RB; + state = -1; + break; + default: + cx.x_val.v_num = c; + cx.x_token = T_CHAR; + state = -1; + break; + } + break; + case 1: /* got # */ + if (c == '\n' || c == EOF) { + (void) s_ungetc(c); + state = 0; + } + break; + case 2: /* unquoted string */ + switch (c) { + case 'a': case 'b': case 'c': case 'd': case 'e': + case 'f': case 'g': case 'h': case 'i': case 'j': + case 'k': case 'l': case 'm': case 'n': case 'o': + case 'p': case 'q': case 'r': case 's': case 't': + case 'u': case 'v': case 'w': case 'x': case 'y': + case 'z': + case 'A': case 'B': case 'C': case 'D': case 'E': + case 'F': case 'G': case 'H': case 'I': case 'J': + case 'K': case 'L': case 'M': case 'N': case 'O': + case 'P': case 'Q': case 'R': case 'S': case 'T': + case 'U': case 'V': case 'W': case 'X': case 'Y': + case 'Z': + case '_': case '.': + case '0': case '1': case '2': case '3': case '4': + case '5': case '6': case '7': case '8': case '9': + if (p < buf + sizeof buf - 1) + *p++ = c; + break; + case '"': + state = 3; + break; + case '\'': + state = 4; + break; + case '\\': + switch (c = s_gettok1()) { + case -2: + (void) s_ungetc(' '); + case -1: + break; + default: + if (p < buf + sizeof buf - 1) + *p++ = c; + } + break; + default: + (void) s_ungetc(c); + case EOF: + *p = 0; + cx.x_token = T_STR; + switch (*buf) { + case 'i': + if (buf[1] == 'f' && buf[2] == 0) + cx.x_token = T_IF; + break; + case 't': + if (buf[1] == 'h' && buf[2] == 'e' + && buf[3] == 'n' && buf[4] == 0) + cx.x_token = T_THEN; + break; + case 'e': + if (buf[1] == 'n' && buf[2] == 'd' + && buf[3] == 'i' && buf[4] == 'f' + && buf[5] == 0) + cx.x_token = T_ENDIF; + else if (buf[1] == 'l' && buf[2] == 's') + if (buf[3] == 'i' && buf[4] == 'f' + && buf[5] == 0) + cx.x_token = T_ELSIF; + else if (buf[3] == 'e' && buf[4] == 0) + cx.x_token = T_ELSE; + break; + } + if (cx.x_token == T_STR + && (cx.x_val.v_str = str_cpy(buf)) == 0) { + p_memerror(); + cx.x_token = T_EOF; + } + state = -1; + break; + } + break; + case 3: /* " quoted string */ + switch (c) { + case '\n': + (void) s_ungetc(c); + case EOF: + case '"': + state = 2; + break; + case '\\': + switch (c = s_gettok1()) { + case -1: + case -2: /* newlines are invisible */ + break; + default: + if (p < buf + sizeof buf - 1) + *p++ = c; + } + break; + default: + if (p < buf + sizeof buf - 1) + *p++ = c; + break; + } + break; + case 4: /* ' quoted string */ + switch (c) { + case '\n': + (void) s_ungetc(c); + case EOF: + case '\'': + state = 2; + break; + case '\\': + switch (c = s_gettok1()) { + case -1: + case -2: /* newlines are invisible */ + break; + default: + if (p < buf + sizeof buf - 1) + *p++ = c; + } + break; + default: + if (p < buf + sizeof buf - 1) + *p++ = c; + break; + } + break; + case 10: /* got 0 */ + switch (c) { + case 'x': + case 'X': + cx.x_val.v_num = 0; + state = 12; + break; + case '0': case '1': case '2': case '3': case '4': + case '5': case '6': case '7': + cx.x_val.v_num = c - '0'; + state = 13; + break; + case '8': case '9': + cx.x_val.v_num = c - '0'; + state = 11; + break; + default: + (void) s_ungetc(c); + state = -1; + cx.x_token = T_NUM; + } + break; + case 11: /* decimal number */ + switch (c) { + case '0': case '1': case '2': case '3': case '4': + case '5': case '6': case '7': case '8': case '9': + cx.x_val.v_num = cx.x_val.v_num * 10 + c - '0'; + break; + default: + (void) s_ungetc(c); + state = -1; + cx.x_token = T_NUM; + } + break; + case 12: /* hex number */ + switch (c) { + case '0': case '1': case '2': case '3': case '4': + case '5': case '6': case '7': case '8': case '9': + cx.x_val.v_num = cx.x_val.v_num * 16 + c - '0'; + break; + case 'a': case 'b': case 'c': case 'd': case 'e': case 'f': + cx.x_val.v_num = cx.x_val.v_num * 16 + c - 'a' + 10; + break; + case 'A': case 'B': case 'C': case 'D': case 'E': case 'F': + cx.x_val.v_num = cx.x_val.v_num * 16 + c - 'A' + 10; + break; + default: + (void) s_ungetc(c); + state = -1; + cx.x_token = T_NUM; + } + break; + case 13: /* octal number */ + switch (c) { + case '0': case '1': case '2': case '3': case '4': + case '5': case '6': case '7': + cx.x_val.v_num = cx.x_val.v_num * 8 + c - '0'; + break; + default: + (void) s_ungetc(c); + state = -1; + cx.x_token = T_NUM; + } + break; + case 20: /* got > */ + switch (c) { + case '=': + cx.x_token = T_GE; + state = -1; + break; + case '>': + cx.x_token = T_RS; + state = -1; + break; + default: + (void) s_ungetc(c); + cx.x_token = T_GT; + state = -1; + } + break; + case 21: /* got < */ + switch (c) { + case '=': + cx.x_token = T_LE; + state = -1; + break; + case '<': + cx.x_token = T_LS; + state = -1; + break; + default: + (void) s_ungetc(c); + cx.x_token = T_LT; + state = -1; + } + break; + case 22: /* got = */ + switch (c) { + case '=': + cx.x_token = T_EQ; + state = -1; + break; + default: + (void) s_ungetc(c); + cx.x_token = T_ASSIGN; + state = -1; + } + break; + case 23: /* got ! */ + switch (c) { + case '=': + cx.x_token = T_NE; + state = -1; + break; + default: + (void) s_ungetc(c); + cx.x_token = T_NOT; + state = -1; + } + break; + case 24: /* got & */ + switch (c) { + case '&': + cx.x_token = T_ANDAND; + state = -1; + break; + default: + (void) s_ungetc(c); + cx.x_token = T_AND; + state = -1; + } + break; + case 25: /* got | */ + switch (c) { + case '|': + cx.x_token = T_OROR; + state = -1; + break; + default: + (void) s_ungetc(c); + cx.x_token = T_OR; + state = -1; + } + break; + case 26: /* got $ */ + switch (c) { + case '?': + cx.x_token = T_DQ; + state = -1; + break; + default: + (void) s_ungetc(c); + cx.x_token = T_DOLLAR; + state = -1; + } + break; + default: + abort(); + } + if (state >= 0) + goto loop; + return cx.x_token; +} + +s_gettok1() +{ + register c; + register n; + + c = s_getc(); /* got \ */ + switch (c) { + case EOF: + return -1; + case '\n': + return -2; + case 'b': + return '\b'; + case 'f': + return '\f'; + case 'n': + return '\n'; + case 'r': + return '\r'; + case 't': + return '\t'; + default: + return c; + case '0': case '1': case '2': case '3': case '4': + case '5': case '6': case '7': + break; + } + n = c - '0'; + c = s_getc(); /* got \[0-7] */ + if (c < '0' || c > '7') { + (void) s_ungetc(c); + return n; + } + n = n * 8 + c - '0'; + c = s_getc(); /* got \[0-7][0-7] */ + if (c < '0' || c > '7') { + (void) s_ungetc(c); + return n; + } + return n * 8 + c - '0'; +} diff --git a/usr.bin/window/startup.c b/usr.bin/window/startup.c new file mode 100644 index 0000000..d0926c0 --- /dev/null +++ b/usr.bin/window/startup.c @@ -0,0 +1,92 @@ +/* + * Copyright (c) 1983, 1993 + * The Regents of the University of California. All rights reserved. + * + * This code is derived from software contributed to Berkeley by + * Edward Wang at The University of California, Berkeley. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. All advertising materials mentioning features or use of this software + * must display the following acknowledgement: + * This product includes software developed by the University of + * California, Berkeley and its contributors. + * 4. Neither the name of the University nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + */ + +#ifndef lint +static char sccsid[] = "@(#)startup.c 8.1 (Berkeley) 6/6/93"; +#endif /* not lint */ + +#include "defs.h" +#include "value.h" +#include "var.h" +#include "char.h" +#include "local.h" + +doconfig() +{ + char buf[100]; + char *home; + static char runcom[] = RUNCOM; + + if ((home = getenv("HOME")) == 0) + home = "."; + (void) sprintf(buf, "%.*s/%s", + (sizeof buf - sizeof runcom) / sizeof (char) - 1, + home, runcom); + return dosource(buf); +} + +/* + * The default is two windows of equal size. + */ +dodefault() +{ + struct ww *w; + register r = wwnrow / 2 - 1; + + if (openwin(1, r + 2, 0, wwnrow - r - 2, wwncol, default_nline, + (char *) 0, 1, 1, default_shellfile, default_shell) == 0) + return; + if ((w = openwin(0, 1, 0, r, wwncol, default_nline, + (char *) 0, 1, 1, default_shellfile, default_shell)) == 0) + return; + wwprintf(w, "Escape character is %s.\r\n", unctrl(escapec)); +} + +setvars() +{ + /* try to use a random ordering to balance the tree */ + (void) var_setnum("nrow", wwnrow); + (void) var_setnum("ncol", wwncol); + (void) var_setnum("baud", wwbaud); + (void) var_setnum("m_rev", WWM_REV); + (void) var_setnum("m_blk", WWM_BLK); + (void) var_setnum("m_ul", WWM_UL); + (void) var_setnum("m_grp", WWM_GRP); + (void) var_setnum("m_dim", WWM_DIM); + (void) var_setnum("m_usr", WWM_USR); + (void) var_setstr("term", wwterm); + (void) var_setnum("modes", wwavailmodes); +} diff --git a/usr.bin/window/string.c b/usr.bin/window/string.c new file mode 100644 index 0000000..a01f04f --- /dev/null +++ b/usr.bin/window/string.c @@ -0,0 +1,153 @@ +/* + * Copyright (c) 1983, 1993 + * The Regents of the University of California. All rights reserved. + * + * This code is derived from software contributed to Berkeley by + * Edward Wang at The University of California, Berkeley. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. All advertising materials mentioning features or use of this software + * must display the following acknowledgement: + * This product includes software developed by the University of + * California, Berkeley and its contributors. + * 4. Neither the name of the University nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + */ + +#ifndef lint +static char sccsid[] = "@(#)string.c 8.1 (Berkeley) 6/6/93"; +#endif /* not lint */ + +#include "string.h" + +char *malloc(); + +char * +str_cpy(s) +register char *s; +{ + char *str; + register char *p; + + str = p = str_alloc(strlen(s) + 1); + if (p == 0) + return 0; + while (*p++ = *s++) + ; + return str; +} + +char * +str_ncpy(s, n) +register char *s; +register n; +{ + int l = strlen(s); + char *str; + register char *p; + + if (n > l) + n = l; + str = p = str_alloc(n + 1); + if (p == 0) + return 0; + while (--n >= 0) + *p++ = *s++; + *p = 0; + return str; +} + +char * +str_itoa(i) +int i; +{ + char buf[30]; + + (void) sprintf(buf, "%d", i); + return str_cpy(buf); +} + +char * +str_cat(s1, s2) +char *s1, *s2; +{ + char *str; + register char *p, *q; + + str = p = str_alloc(strlen(s1) + strlen(s2) + 1); + if (p == 0) + return 0; + for (q = s1; *p++ = *q++;) + ; + for (q = s2, p--; *p++ = *q++;) + ; + return str; +} + +/* + * match s against p. + * s can be a prefix of p with at least min characters. + */ +str_match(s, p, min) +register char *s, *p; +register min; +{ + for (; *s && *p && *s == *p; s++, p++, min--) + ; + return *s == *p || *s == 0 && min <= 0; +} + +#ifdef STR_DEBUG +char * +str_alloc(l) +int l; +{ + register struct string *s; + + s = (struct string *) malloc((unsigned)l + str_offset); + if (s == 0) + return 0; + if (str_head.s_forw == 0) + str_head.s_forw = str_head.s_back = &str_head; + s->s_forw = str_head.s_forw; + s->s_back = &str_head; + str_head.s_forw = s; + s->s_forw->s_back = s; + return s->s_data; +} + +str_free(str) +char *str; +{ + register struct string *s; + + for (s = str_head.s_forw; s != &str_head && s->s_data != str; + s = s->s_forw) + ; + if (s == &str_head) + abort(); + s->s_back->s_forw = s->s_forw; + s->s_forw->s_back = s->s_back; + free((char *)s); +} +#endif diff --git a/usr.bin/window/string.h b/usr.bin/window/string.h new file mode 100644 index 0000000..08cae56 --- /dev/null +++ b/usr.bin/window/string.h @@ -0,0 +1,65 @@ +/* + * Copyright (c) 1983, 1993 + * The Regents of the University of California. All rights reserved. + * + * This code is derived from software contributed to Berkeley by + * Edward Wang at The University of California, Berkeley. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. All advertising materials mentioning features or use of this software + * must display the following acknowledgement: + * This product includes software developed by the University of + * California, Berkeley and its contributors. + * 4. Neither the name of the University nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * @(#)string.h 8.1 (Berkeley) 6/6/93 + */ + +#define STR_DEBUG + +char *str_cpy(); +char *str_ncpy(); +char *str_cat(); +char *str_itoa(); + +#define str_cmp(a, b) strcmp(a, b) + +#ifdef STR_DEBUG +struct string { + struct string *s_forw; + struct string *s_back; + char s_data[1]; +}; + +struct string str_head; + +#define str_offset ((unsigned)str_head.s_data - (unsigned)&str_head) +#define str_stos(s) ((struct string *)((unsigned)(s) - str_offset)) + +char *str_alloc(); +int str_free(); +#else +#define str_free(s) free(s) +#define str_alloc(s) malloc(s) +#endif diff --git a/usr.bin/window/token.h b/usr.bin/window/token.h new file mode 100644 index 0000000..a37b23b --- /dev/null +++ b/usr.bin/window/token.h @@ -0,0 +1,83 @@ +/* + * Copyright (c) 1983, 1993 + * The Regents of the University of California. All rights reserved. + * + * This code is derived from software contributed to Berkeley by + * Edward Wang at The University of California, Berkeley. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. All advertising materials mentioning features or use of this software + * must display the following acknowledgement: + * This product includes software developed by the University of + * California, Berkeley and its contributors. + * 4. Neither the name of the University nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * @(#)token.h 8.1 (Berkeley) 6/6/93 + */ + +#define token (cx.x_token) +#define token_num (cx.x_val.v_num) +#define token_str (cx.x_val.v_str) + +#define T_EOL 1 +#define T_EOF 2 +#define T_COMP 3 +#define T_PLUS 4 +#define T_MINUS 5 +#define T_MUL 6 +#define T_DIV 7 +#define T_LP 8 +#define T_RP 9 +#define T_LB 10 +#define T_RB 11 +#define T_DOLLAR 12 +#define T_COMMA 13 +#define T_QUEST 14 +#define T_COLON 15 +#define T_CHAR 16 +#define T_STR 17 +#define T_NUM 18 +#define T_MOD 19 +#define T_XOR 20 +#define T_DQ 21 /* $? */ +#define T_GE 22 +#define T_RS 23 +#define T_GT 24 +#define T_LE 25 +#define T_LS 26 +#define T_LT 27 +#define T_EQ 28 +#define T_ASSIGN 29 +#define T_NE 30 +#define T_NOT 31 +#define T_ANDAND 32 +#define T_AND 33 +#define T_OROR 34 +#define T_OR 35 + +#define T_IF 40 +#define T_THEN 41 +#define T_ELSIF 42 +#define T_ELSE 43 +#define T_ENDIF 44 diff --git a/usr.bin/window/tt.h b/usr.bin/window/tt.h new file mode 100644 index 0000000..bd19bb3 --- /dev/null +++ b/usr.bin/window/tt.h @@ -0,0 +1,153 @@ +/* + * Copyright (c) 1983, 1993 + * The Regents of the University of California. All rights reserved. + * + * This code is derived from software contributed to Berkeley by + * Edward Wang at The University of California, Berkeley. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. All advertising materials mentioning features or use of this software + * must display the following acknowledgement: + * This product includes software developed by the University of + * California, Berkeley and its contributors. + * 4. Neither the name of the University nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * @(#)tt.h 8.1 (Berkeley) 6/6/93 + */ + +/* + * Interface structure for the terminal drivers. + */ +struct tt { + /* startup and cleanup */ + int (*tt_start)(); + int (*tt_reset)(); + int (*tt_end)(); + + /* terminal functions */ + int (*tt_move)(); + int (*tt_insline)(); + int (*tt_delline)(); + int (*tt_inschar)(); + int (*tt_insspace)(); + int (*tt_delchar)(); + int (*tt_write)(); /* write a whole block */ + int (*tt_putc)(); /* write one character */ + int (*tt_clreol)(); + int (*tt_clreos)(); + int (*tt_clear)(); + int (*tt_scroll_down)(); + int (*tt_scroll_up)(); + int (*tt_setscroll)(); /* set scrolling region */ + int (*tt_setmodes)(); /* set display modes */ + int (*tt_set_token)(); /* define a token */ + int (*tt_put_token)(); /* refer to a defined token */ + int (*tt_compress)(); /* begin, end compression */ + int (*tt_checksum)(); /* compute checksum */ + int (*tt_checkpoint)(); /* checkpoint protocol */ + int (*tt_rint)(); /* input processing */ + + /* internal variables */ + char tt_modes; /* the current display modes */ + char tt_nmodes; /* the new modes for next write */ + char tt_insert; /* currently in insert mode */ + int tt_row; /* cursor row */ + int tt_col; /* cursor column */ + int tt_scroll_top; /* top of scrolling region */ + int tt_scroll_bot; /* bottom of scrolling region */ + + /* terminal info */ + int tt_nrow; /* number of display rows */ + int tt_ncol; /* number of display columns */ + char tt_availmodes; /* the display modes supported */ + char tt_wrap; /* has auto wrap around */ + char tt_retain; /* can retain below (db flag) */ + short tt_padc; /* the pad character */ + int tt_ntoken; /* number of compression tokens */ + int tt_token_min; /* minimun token size */ + int tt_token_max; /* maximum token size */ + int tt_set_token_cost; /* cost in addition to string */ + int tt_put_token_cost; /* constant cost */ + int tt_ack; /* checkpoint ack-nack flag */ + + /* the frame characters */ + short *tt_frame; + + /* ttflush() hook */ + int (*tt_flush)(); +}; +struct tt tt; + +/* + * tt_padc is used by the compression routine. + * It is a short to allow the driver to indicate that there is no padding. + */ +#define TT_PADC_NONE 0x100 + +/* + * List of terminal drivers. + */ +struct tt_tab { + char *tt_name; + int tt_len; + int (*tt_func)(); +}; +extern struct tt_tab tt_tab[]; + +/* + * Clean interface to termcap routines. + * Too may t's. + */ +char tt_strings[1024]; /* string buffer */ +char *tt_strp; /* pointer for it */ + +struct tt_str { + char *ts_str; + int ts_n; +}; + +struct tt_str *tttgetstr(); +struct tt_str *ttxgetstr(); /* tgetstr() and expand delays */ + +int tttputc(); +#define tttputs(s, n) tputs((s)->ts_str, (n), tttputc) +#define ttxputs(s) ttwrite((s)->ts_str, (s)->ts_n) + +/* + * Buffered output without stdio. + * These variables have different meanings from the ww_ob* variables. + * But I'm too lazy to think up different names. + */ +char *tt_ob; +char *tt_obp; +char *tt_obe; +#define ttputc(c) (tt_obp < tt_obe ? (*tt_obp++ = (c)) \ + : (ttflush(), *tt_obp++ = (c))) + +/* + * Convenience macros for the drivers + * They require char.h + */ +#define ttctrl(c) ttputc(ctrl(c)) +#define ttesc(c) (ttctrl('['), ttputc(c)) diff --git a/usr.bin/window/ttf100.c b/usr.bin/window/ttf100.c new file mode 100644 index 0000000..2b152f2 --- /dev/null +++ b/usr.bin/window/ttf100.c @@ -0,0 +1,69 @@ +/* + * Copyright (c) 1983, 1993 + * The Regents of the University of California. All rights reserved. + * + * This code is derived from software contributed to Berkeley by + * Edward Wang at The University of California, Berkeley. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. All advertising materials mentioning features or use of this software + * must display the following acknowledgement: + * This product includes software developed by the University of + * California, Berkeley and its contributors. + * 4. Neither the name of the University nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + */ + +#ifndef lint +static char sccsid[] = "@(#)ttf100.c 8.1 (Berkeley) 6/6/93"; +#endif /* not lint */ + +#include "ww.h" +#include "tt.h" + +/* + * Freedom 100 + */ + +#define G (WWM_GRP << WWC_MSHIFT) +short f100_frame[16] = { + ' ', 'J'|G, 'K'|G, 'A'|G, + 'J'|G, 'J'|G, 'B'|G, 'M'|G, + 'K'|G, 'D'|G, 'K'|G, 'O'|G, + 'C'|G, 'L'|G, 'N'|G, 'I'|G +}; +extern struct tt_str *gen_AE, *gen_AS; + +tt_f100() +{ + static struct tt_str ae = { "\033%", 2 }; + static struct tt_str as = { "\033$", 2 }; + + if (tt_generic() < 0) + return -1; + tt.tt_frame = f100_frame; + tt.tt_availmodes |= WWM_GRP; + gen_AS = &as; + gen_AE = &ae; + return 0; +} diff --git a/usr.bin/window/ttgeneric.c b/usr.bin/window/ttgeneric.c new file mode 100644 index 0000000..4dddd21 --- /dev/null +++ b/usr.bin/window/ttgeneric.c @@ -0,0 +1,549 @@ +/* + * Copyright (c) 1983, 1993 + * The Regents of the University of California. All rights reserved. + * + * This code is derived from software contributed to Berkeley by + * Edward Wang at The University of California, Berkeley. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. All advertising materials mentioning features or use of this software + * must display the following acknowledgement: + * This product includes software developed by the University of + * California, Berkeley and its contributors. + * 4. Neither the name of the University nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + */ + +#ifndef lint +static char sccsid[] = "@(#)ttgeneric.c 8.1 (Berkeley) 6/6/93"; +#endif /* not lint */ + +#include "ww.h" +#include "tt.h" + +char PC, *BC, *UP; +short ospeed; + + /* normal frame */ +short gen_frame[16] = { + ' ', '|', '-', '+', + '|', '|', '+', '+', + '-', '+', '-', '+', + '+', '+', '+', '+' +}; + + /* ANSI graphics frame */ +#define G (WWM_GRP << WWC_MSHIFT) +short ansi_frame[16] = { + ' ', 'x'|G, 'Q'|G, 'm'|G, + 'x'|G, 'x'|G, 'l'|G, 't'|G, + 'q'|G, 'j'|G, 'q'|G, 'v'|G, + 'k'|G, 'u'|G, 'w'|G, 'n'|G +}; +struct tt_str ansi_AS = { + "\033(0", 3 +}; + +struct tt_str *gen_PC; +struct tt_str *gen_CM; +struct tt_str *gen_IM; +struct tt_str *gen_IC; +struct tt_str *gen_ICn; +struct tt_str *gen_IP; +struct tt_str *gen_EI; +struct tt_str *gen_DC; +struct tt_str *gen_DCn; +struct tt_str *gen_AL; +struct tt_str *gen_ALn; +struct tt_str *gen_DL; +struct tt_str *gen_DLn; +struct tt_str *gen_CE; +struct tt_str *gen_CD; +struct tt_str *gen_CL; +struct tt_str *gen_VS; +struct tt_str *gen_VE; +struct tt_str *gen_TI; +struct tt_str *gen_TE; +struct tt_str *gen_SO; +struct tt_str *gen_SE; +struct tt_str *gen_US; +struct tt_str *gen_UE; +struct tt_str *gen_LE; +struct tt_str *gen_ND; +struct tt_str *gen_UP; +struct tt_str *gen_DO; +struct tt_str *gen_BC; +struct tt_str *gen_NL; +struct tt_str *gen_CR; +struct tt_str *gen_HO; +struct tt_str *gen_AS; +struct tt_str *gen_AE; +struct tt_str *gen_XS; +struct tt_str *gen_XE; +struct tt_str *gen_SF; +struct tt_str *gen_SFn; +struct tt_str *gen_SR; +struct tt_str *gen_SRn; +struct tt_str *gen_CS; +char gen_MI; +char gen_MS; +char gen_AM; +char gen_OS; +char gen_BS; +char gen_DA; +char gen_DB; +char gen_NS; +char gen_XN; +int gen_CO; +int gen_LI; +int gen_UG; +int gen_SG; + +gen_setinsert(new) +char new; +{ + if (new) { + if (gen_IM) + ttxputs(gen_IM); + } else + if (gen_EI) + ttxputs(gen_EI); + tt.tt_insert = new; +} + +gen_setmodes(new) +register new; +{ + register diff; + + diff = new ^ tt.tt_modes; + if (diff & WWM_REV) { + if (new & WWM_REV) { + if (gen_SO) + ttxputs(gen_SO); + } else + if (gen_SE) + ttxputs(gen_SE); + } + if (diff & WWM_UL) { + if (new & WWM_UL) { + if (gen_US) + ttxputs(gen_US); + } else + if (gen_UE) + ttxputs(gen_UE); + } + if (diff & WWM_GRP) { + if (new & WWM_GRP) { + if (gen_AS) + ttxputs(gen_AS); + } else + if (gen_AE) + ttxputs(gen_AE); + } + if (diff & WWM_USR) { + if (new & WWM_USR) { + if (gen_XS) + ttxputs(gen_XS); + } else + if (gen_XE) + ttxputs(gen_XE); + } + tt.tt_modes = new; +} + +gen_insline(n) +{ + if (tt.tt_modes) /* for concept 100 */ + gen_setmodes(0); + if (gen_ALn) + ttpgoto(gen_ALn, 0, n, gen_LI - tt.tt_row); + else + while (--n >= 0) + tttputs(gen_AL, gen_LI - tt.tt_row); +} + +gen_delline(n) +{ + if (tt.tt_modes) /* for concept 100 */ + gen_setmodes(0); + if (gen_DLn) + ttpgoto(gen_DLn, 0, n, gen_LI - tt.tt_row); + else + while (--n >= 0) + tttputs(gen_DL, gen_LI - tt.tt_row); +} + +gen_putc(c) +register char c; +{ + if (tt.tt_insert) + gen_setinsert(0); + if (tt.tt_nmodes != tt.tt_modes) + gen_setmodes(tt.tt_nmodes); + ttputc(c); + if (++tt.tt_col == gen_CO) + if (gen_XN) + tt.tt_col = tt.tt_row = -10; + else if (gen_AM) + tt.tt_col = 0, tt.tt_row++; + else + tt.tt_col--; +} + +gen_write(p, n) + register char *p; + register n; +{ + if (tt.tt_insert) + gen_setinsert(0); + if (tt.tt_nmodes != tt.tt_modes) + gen_setmodes(tt.tt_nmodes); + ttwrite(p, n); + tt.tt_col += n; + if (tt.tt_col == gen_CO) + if (gen_XN) + tt.tt_col = tt.tt_row = -10; + else if (gen_AM) + tt.tt_col = 0, tt.tt_row++; + else + tt.tt_col--; +} + +gen_move(row, col) +register int row, col; +{ + if (tt.tt_row == row && tt.tt_col == col) + return; + if (!gen_MI && tt.tt_insert) + gen_setinsert(0); + if (!gen_MS && tt.tt_modes) + gen_setmodes(0); + if (row < tt.tt_scroll_top || row > tt.tt_scroll_bot) + gen_setscroll(0, tt.tt_nrow - 1); + if (tt.tt_row == row) { + if (col == 0) { + ttxputs(gen_CR); + goto out; + } + if (tt.tt_col == col - 1) { + if (gen_ND) { + ttxputs(gen_ND); + goto out; + } + } else if (tt.tt_col == col + 1) { + if (gen_LE) { + ttxputs(gen_LE); + goto out; + } + } + } + if (tt.tt_col == col) { + if (tt.tt_row == row + 1) { + if (gen_UP) { + ttxputs(gen_UP); + goto out; + } + } else if (tt.tt_row == row - 1) { + ttxputs(gen_DO); + goto out; + } + } + if (gen_HO && col == 0 && row == 0) { + ttxputs(gen_HO); + goto out; + } + tttgoto(gen_CM, col, row); +out: + tt.tt_col = col; + tt.tt_row = row; +} + +gen_start() +{ + if (gen_VS) + ttxputs(gen_VS); + if (gen_TI) + ttxputs(gen_TI); + ttxputs(gen_CL); + tt.tt_col = tt.tt_row = 0; + tt.tt_insert = 0; + tt.tt_nmodes = tt.tt_modes = 0; +} + +gen_end() +{ + if (tt.tt_insert) + gen_setinsert(0); + if (gen_TE) + ttxputs(gen_TE); + if (gen_VE) + ttxputs(gen_VE); +} + +gen_clreol() +{ + if (tt.tt_modes) /* for concept 100 */ + gen_setmodes(0); + tttputs(gen_CE, gen_CO - tt.tt_col); +} + +gen_clreos() +{ + if (tt.tt_modes) /* for concept 100 */ + gen_setmodes(0); + tttputs(gen_CD, gen_LI - tt.tt_row); +} + +gen_clear() +{ + if (tt.tt_modes) /* for concept 100 */ + gen_setmodes(0); + ttxputs(gen_CL); +} + +gen_inschar(c) +register char c; +{ + if (!tt.tt_insert) + gen_setinsert(1); + if (tt.tt_nmodes != tt.tt_modes) + gen_setmodes(tt.tt_nmodes); + if (gen_IC) + tttputs(gen_IC, gen_CO - tt.tt_col); + ttputc(c); + if (gen_IP) + tttputs(gen_IP, gen_CO - tt.tt_col); + if (++tt.tt_col == gen_CO) + if (gen_XN) + tt.tt_col = tt.tt_row = -10; + else if (gen_AM) + tt.tt_col = 0, tt.tt_row++; + else + tt.tt_col--; +} + +gen_insspace(n) +{ + if (gen_ICn) + ttpgoto(gen_ICn, 0, n, gen_CO - tt.tt_col); + else + while (--n >= 0) + tttputs(gen_IC, gen_CO - tt.tt_col); +} + +gen_delchar(n) +{ + if (gen_DCn) + ttpgoto(gen_DCn, 0, n, gen_CO - tt.tt_col); + else + while (--n >= 0) + tttputs(gen_DC, gen_CO - tt.tt_col); +} + +gen_scroll_down(n) +{ + gen_move(tt.tt_scroll_bot, 0); + if (gen_SFn) + ttpgoto(gen_SFn, 0, n, n); + else + while (--n >= 0) + ttxputs(gen_SF); +} + +gen_scroll_up(n) +{ + gen_move(tt.tt_scroll_top, 0); + if (gen_SRn) + ttpgoto(gen_SRn, 0, n, n); + else + while (--n >= 0) + ttxputs(gen_SR); +} + +gen_setscroll(top, bot) +{ + tttgoto(gen_CS, bot, top); + tt.tt_scroll_top = top; + tt.tt_scroll_bot = bot; + tt.tt_row = tt.tt_col = -10; +} + +tt_generic() +{ + gen_PC = tttgetstr("pc"); + PC = gen_PC ? *gen_PC->ts_str : 0; + ospeed = wwospeed; + + gen_CM = ttxgetstr("cm"); /* may not work */ + gen_IM = ttxgetstr("im"); + gen_IC = tttgetstr("ic"); + gen_ICn = tttgetstr("IC"); + gen_IP = tttgetstr("ip"); + gen_EI = ttxgetstr("ei"); + gen_DC = tttgetstr("dc"); + gen_DCn = tttgetstr("DC"); + gen_AL = tttgetstr("al"); + gen_ALn = tttgetstr("AL"); + gen_DL = tttgetstr("dl"); + gen_DLn = tttgetstr("DL"); + gen_CE = tttgetstr("ce"); + gen_CD = tttgetstr("cd"); + gen_CL = ttxgetstr("cl"); + gen_VS = ttxgetstr("vs"); + gen_VE = ttxgetstr("ve"); + gen_TI = ttxgetstr("ti"); + gen_TE = ttxgetstr("te"); + gen_SO = ttxgetstr("so"); + gen_SE = ttxgetstr("se"); + gen_US = ttxgetstr("us"); + gen_UE = ttxgetstr("ue"); + gen_LE = ttxgetstr("le"); + gen_ND = ttxgetstr("nd"); + gen_UP = ttxgetstr("up"); + gen_DO = ttxgetstr("do"); + gen_BC = ttxgetstr("bc"); + gen_NL = ttxgetstr("nl"); + gen_CR = ttxgetstr("cr"); + gen_HO = ttxgetstr("ho"); + gen_AS = ttxgetstr("as"); + gen_AE = ttxgetstr("ae"); + gen_XS = ttxgetstr("XS"); + gen_XE = ttxgetstr("XE"); + gen_SF = ttxgetstr("sf"); + gen_SFn = ttxgetstr("SF"); + gen_SR = ttxgetstr("sr"); + gen_SRn = ttxgetstr("SR"); + gen_CS = ttxgetstr("cs"); + gen_MI = tgetflag("mi"); + gen_MS = tgetflag("ms"); + gen_AM = tgetflag("am"); + gen_OS = tgetflag("os"); + gen_BS = tgetflag("bs"); + gen_DA = tgetflag("da"); + gen_DB = tgetflag("db"); + gen_NS = tgetflag("ns"); + gen_XN = tgetflag("xn"); + gen_CO = tgetnum("co"); + gen_LI = tgetnum("li"); + gen_UG = tgetnum("ug"); + gen_SG = tgetnum("sg"); + if (gen_CL == 0 || gen_OS || gen_CM == 0) + return -1; + + /* + * Deal with obsolete termcap fields. + */ + if (gen_LE == 0) + if (gen_BC) + gen_LE = gen_BC; + else if (gen_BS) { + static struct tt_str bc = { "\b", 1 }; + gen_BC = &bc; + } + if (gen_NL == 0) { + static struct tt_str nl = { "\n", 1 }; + gen_NL = &nl; + } + if (gen_DO == 0) + gen_DO = gen_NL; + if (gen_CR == 0) { + static struct tt_str cr = { "\r", 1 }; + gen_CR = &cr; + } + /* + * Most terminal will scroll with "nl", but very few specify "sf". + * We shouldn't use "do" here. + */ + if (gen_SF == 0 && !gen_NS) + gen_SF = gen_NL; + BC = gen_LE ? gen_LE->ts_str : 0; + UP = gen_UP ? gen_UP->ts_str : 0; + /* + * Fix up display attributes that we can't handle, or don't + * really exist. + */ + if (gen_SG > 0) + gen_SO = 0; + if (gen_UG > 0 || gen_US && gen_SO && ttstrcmp(gen_US, gen_SO) == 0) + gen_US = 0; + + if (gen_IM && gen_IM->ts_n == 0) { + free((char *) gen_IM); + gen_IM = 0; + } + if (gen_EI && gen_EI->ts_n == 0) { + free((char *) gen_EI); + gen_EI = 0; + } + if (gen_IC && gen_IC->ts_n == 0) { + free((char *) gen_IC); + gen_IC = 0; + } + if (gen_IM) + tt.tt_inschar = gen_inschar; + else if (gen_IC) + tt.tt_insspace = gen_insspace; + if (gen_DC) + tt.tt_delchar = gen_delchar; + if (gen_AL) + tt.tt_insline = gen_insline; + if (gen_DL) + tt.tt_delline = gen_delline; + if (gen_CE) + tt.tt_clreol = gen_clreol; + if (gen_CD) + tt.tt_clreos = gen_clreos; + if (gen_SF) + tt.tt_scroll_down = gen_scroll_down; + /* + * Don't allow scroll_up if da or db but not cs. + * See comment in wwscroll.c. + */ + if (gen_SR && (gen_CS || !gen_DA && !gen_DB)) + tt.tt_scroll_up = gen_scroll_up; + if (gen_CS) + tt.tt_setscroll = gen_setscroll; + if (gen_SO) + tt.tt_availmodes |= WWM_REV; + if (gen_US) + tt.tt_availmodes |= WWM_UL; + if (gen_AS) + tt.tt_availmodes |= WWM_GRP; + if (gen_XS) + tt.tt_availmodes |= WWM_USR; + tt.tt_wrap = gen_AM; + tt.tt_retain = gen_DB; + tt.tt_ncol = gen_CO; + tt.tt_nrow = gen_LI; + tt.tt_start = gen_start; + tt.tt_end = gen_end; + tt.tt_write = gen_write; + tt.tt_putc = gen_putc; + tt.tt_move = gen_move; + tt.tt_clear = gen_clear; + tt.tt_setmodes = gen_setmodes; + tt.tt_frame = gen_AS && ttstrcmp(gen_AS, &ansi_AS) == 0 ? + ansi_frame : gen_frame; + return 0; +} diff --git a/usr.bin/window/tth19.c b/usr.bin/window/tth19.c new file mode 100644 index 0000000..b6dbcfe --- /dev/null +++ b/usr.bin/window/tth19.c @@ -0,0 +1,278 @@ +/* + * Copyright (c) 1983, 1993 + * The Regents of the University of California. All rights reserved. + * + * This code is derived from software contributed to Berkeley by + * Edward Wang at The University of California, Berkeley. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. All advertising materials mentioning features or use of this software + * must display the following acknowledgement: + * This product includes software developed by the University of + * California, Berkeley and its contributors. + * 4. Neither the name of the University nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + */ + +#ifndef lint +static char sccsid[] = "@(#)tth19.c 8.1 (Berkeley) 6/6/93"; +#endif /* not lint */ + +#include "ww.h" +#include "tt.h" +#include "char.h" + +/* +kb|h19|heath|h19-b|h19b|heathkit|heath-19|z19|zenith: + cr=^M:nl=^J:bl=^G:al=1*\EL:am:le=^H:bs:cd=\EJ:ce=\EK: + cl=\EE:cm=\EY%+ %+ :co#80:dc=\EN:dl=1*\EM:do=\EB: + ei=\EO:ho=\EH:im=\E@:li#24:mi:nd=\EC:as=\EF:ae=\EG:ms: + ta=^I:pt:sr=\EI:se=\Eq:so=\Ep:up=\EA:vs=\Ex4:ve=\Ey4: + kb=^h:ku=\EA:kd=\EB:kl=\ED:kr=\EC:kh=\EH: + kn#8:k1=\ES:k2=\ET:k3=\EU:k4=\EV:k5=\EW: + l6=blue:l7=red:l8=white:k6=\EP:k7=\EQ:k8=\ER: + es:hs:ts=\Ej\Ex5\Ex1\EY8%+ \Eo:fs=\Ek\Ey5:ds=\Ey1: +*/ + +#define NCOL 80 +#define NROW 24 + +#define G (WWM_GRP << WWC_MSHIFT) +short h19_frame[16] = { + ' ', '`'|G, 'a'|G, 'e'|G, + '`'|G, '`'|G, 'f'|G, 'v'|G, + 'a'|G, 'd'|G, 'a'|G, 'u'|G, + 'c'|G, 't'|G, 's'|G, 'b'|G +}; + +extern struct tt_str *gen_VS; +extern struct tt_str *gen_VE; + +int h19_msp10c; + +#define PAD(ms10) { \ + register i; \ + for (i = ((ms10) + 5) / h19_msp10c; --i >= 0;) \ + ttputc('\0'); \ +} +#define ICPAD() PAD((NCOL - tt.tt_col) * 1) /* 0.1 ms per char */ +#define ILPAD() PAD((NROW - tt.tt_row) * 10) /* 1 ms per char */ + +#define H19_SETINSERT(m) ttesc((tt.tt_insert = (m)) ? '@' : 'O') + +h19_setmodes(new) +register new; +{ + register diff; + + diff = new ^ tt.tt_modes; + if (diff & WWM_REV) + ttesc(new & WWM_REV ? 'p' : 'q'); + if (diff & WWM_GRP) + ttesc(new & WWM_REV ? 'F' : 'G'); + tt.tt_modes = new; +} + +h19_insline(n) +{ + while (--n >= 0) { + ttesc('L'); + ILPAD(); + } +} + +h19_delline(n) +{ + while (--n >= 0) { + ttesc('M'); + ILPAD(); + } +} + +h19_putc(c) +register char c; +{ + if (tt.tt_nmodes != tt.tt_modes) + (*tt.tt_setmodes)(tt.tt_nmodes); + if (tt.tt_insert) + H19_SETINSERT(0); + ttputc(c); + if (++tt.tt_col == NCOL) + tt.tt_col = NCOL - 1; +} + +h19_write(p, n) +register char *p; +register n; +{ + if (tt.tt_nmodes != tt.tt_modes) + (*tt.tt_setmodes)(tt.tt_nmodes); + if (tt.tt_insert) + H19_SETINSERT(0); + ttwrite(p, n); + tt.tt_col += n; + if (tt.tt_col == NCOL) + tt.tt_col = NCOL - 1; +} + +h19_move(row, col) +register char row, col; +{ + if (tt.tt_row == row) { + if (tt.tt_col == col) + return; + if (col == 0) { + ttctrl('m'); + goto out; + } + if (tt.tt_col == col - 1) { + ttesc('C'); + goto out; + } + if (tt.tt_col == col + 1) { + ttctrl('h'); + goto out; + } + } + if (tt.tt_col == col) { + if (tt.tt_row == row + 1) { + ttesc('A'); + goto out; + } + if (tt.tt_row == row - 1) { + ttctrl('j'); + goto out; + } + } + if (col == 0 && row == 0) { + ttesc('H'); + goto out; + } + ttesc('Y'); + ttputc(' ' + row); + ttputc(' ' + col); +out: + tt.tt_col = col; + tt.tt_row = row; +} + +h19_start() +{ + if (gen_VS) + ttxputs(gen_VS); + ttesc('w'); + ttesc('E'); + tt.tt_col = tt.tt_row = 0; + tt.tt_insert = 0; + tt.tt_nmodes = tt.tt_modes = 0; +} + +h19_end() +{ + if (tt.tt_insert) + H19_SETINSERT(0); + if (gen_VE) + ttxputs(gen_VE); + ttesc('v'); +} + +h19_clreol() +{ + ttesc('K'); +} + +h19_clreos() +{ + ttesc('J'); +} + +h19_clear() +{ + ttesc('E'); +} + +h19_inschar(c) +register char c; +{ + if (tt.tt_nmodes != tt.tt_modes) + (*tt.tt_setmodes)(tt.tt_nmodes); + if (!tt.tt_insert) + H19_SETINSERT(1); + ttputc(c); + if (tt.tt_insert) + ICPAD(); + if (++tt.tt_col == NCOL) + tt.tt_col = NCOL - 1; +} + +h19_delchar(n) +{ + while (--n >= 0) + ttesc('N'); +} + +h19_scroll_down(n) +{ + h19_move(NROW - 1, 0); + while (--n >= 0) + ttctrl('j'); +} + +h19_scroll_up(n) +{ + h19_move(0, 0); + while (--n >= 0) + ttesc('I'); +} + +tt_h19() +{ + float cpms = (float) wwbaud / 10000; /* char per ms */ + + h19_msp10c = 10 / cpms; /* ms per 10 char */ + gen_VS = ttxgetstr("vs"); + gen_VE = ttxgetstr("ve"); + + tt.tt_start = h19_start; + tt.tt_end = h19_end; + + tt.tt_insline = h19_insline; + tt.tt_delline = h19_delline; + tt.tt_inschar = h19_inschar; + tt.tt_delchar = h19_delchar; + tt.tt_clreol = h19_clreol; + tt.tt_clreos = h19_clreos; + tt.tt_clear = h19_clear; + tt.tt_move = h19_move; + tt.tt_write = h19_write; + tt.tt_putc = h19_putc; + tt.tt_scroll_down = h19_scroll_down; + tt.tt_scroll_up = h19_scroll_up; + tt.tt_setmodes = h19_setmodes; + + tt.tt_ncol = NCOL; + tt.tt_nrow = NROW; + tt.tt_availmodes = WWM_REV|WWM_GRP; + tt.tt_frame = h19_frame; + return 0; +} diff --git a/usr.bin/window/tth29.c b/usr.bin/window/tth29.c new file mode 100644 index 0000000..2482abf --- /dev/null +++ b/usr.bin/window/tth29.c @@ -0,0 +1,94 @@ +/* + * Copyright (c) 1983, 1993 + * The Regents of the University of California. All rights reserved. + * + * This code is derived from software contributed to Berkeley by + * Edward Wang at The University of California, Berkeley. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. All advertising materials mentioning features or use of this software + * must display the following acknowledgement: + * This product includes software developed by the University of + * California, Berkeley and its contributors. + * 4. Neither the name of the University nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + */ + +#ifndef lint +static char sccsid[] = "@(#)tth29.c 8.1 (Berkeley) 6/6/93"; +#endif /* not lint */ + +#include "ww.h" +#include "tt.h" +#include "char.h" + +/* + * H29 Driver + * + * WWM_USR mode is alternate character set. + * +kC|h29|heath-29|z29|zenith-29:\ + :am:bc=\ED:bt=\E-:cr=^M:do=^J:nl=^J:bl=^G:\ + :al=\EL:le=^H:bs:cd=\EJ:ce=\EK:cl=\EE:cm=\EY%+ %+ :co#80:dc=\EN:\ + :dl=1*\EM:do=\EB:ei=\EO:ho=\EH:im=\E@:li#24:mi:nd=\EC:as=\EF:ae=\EG:\ + :ms:ta=^I:pt:sr=\EI:se=\Eq:so=\Ep:up=\EA:vs=\Ex4:ve=\Ey4:\ + :kb=^H:ku=\EA:kd=\EB:kl=\ED:kr=\EC:kh=\EH:kn#1:k0=\E~:l0=HOME:\ + :k1=\ES:k2=\ET:k3=\EU:k4=\EV:k5=\EW:k6=\EP:k7=\EQ:k8=\ER:k9=\E01:\ + :es:hs:ts=\Ej\Ex5\Ex1\EY8%+ \Eo:fs=\Ek\Ey5:ds=\Ey1:us=\Es8:ue=\Es0: + * + */ + +h29_setmodes(new) +register new; +{ + register modes = '0'; + + if (new & WWM_REV) + modes += 0x01; + if (new & WWM_BLK) + modes += 0x02; + if (new & WWM_DIM) + modes += 0x04; + if (new & WWM_UL) + modes += 0x08; + if (new & WWM_USR) + modes += 0x10; + ttesc('s'); + ttputc(modes); + if (new & WWM_GRP) { + if ((tt.tt_modes & WWM_GRP) == 0) + ttesc('F'); + } else + if (tt.tt_modes & WWM_GRP) + ttesc('G'); + tt.tt_modes = new; +} + +tt_h29() +{ + if (tt_h19() < 0) + return -1; + tt.tt_setmodes = h29_setmodes; + tt.tt_availmodes |= WWM_BLK|WWM_UL|WWM_DIM|WWM_USR; + return 0; +} diff --git a/usr.bin/window/ttinit.c b/usr.bin/window/ttinit.c new file mode 100644 index 0000000..8b82872 --- /dev/null +++ b/usr.bin/window/ttinit.c @@ -0,0 +1,119 @@ +/* + * Copyright (c) 1983, 1993 + * The Regents of the University of California. All rights reserved. + * + * This code is derived from software contributed to Berkeley by + * Edward Wang at The University of California, Berkeley. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. All advertising materials mentioning features or use of this software + * must display the following acknowledgement: + * This product includes software developed by the University of + * California, Berkeley and its contributors. + * 4. Neither the name of the University nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + */ + +#ifndef lint +static char sccsid[] = "@(#)ttinit.c 8.1 (Berkeley) 6/6/93"; +#endif /* not lint */ + +#include "ww.h" +#include "tt.h" + +int tt_h19(); +int tt_h29(); +int tt_f100(); +int tt_tvi925(); +int tt_wyse75(); +int tt_wyse60(); +int tt_zapple(); +int tt_zentec(); +int tt_generic(); +struct tt_tab tt_tab[] = { + { "h19", 3, tt_h19 }, + { "h29", 3, tt_h29 }, + { "f100", 4, tt_f100 }, + { "tvi925", 6, tt_tvi925 }, + { "wyse75", 6, tt_wyse75 }, + { "wyse60", 6, tt_wyse60 }, + { "w60", 3, tt_wyse60 }, + { "zapple", 6, tt_zapple }, + { "zentec", 6, tt_zentec }, + { "generic", 0, tt_generic }, + 0 +}; + +ttinit() +{ + int i; + register struct tt_tab *tp; + register char *p, *q; + register char *t; + + tt_strp = tt_strings; + + /* + * Set output buffer size to about 1 second of output time. + */ + i = MIN(wwbaud/10, 512); + if ((tt_ob = malloc((unsigned) i)) == 0) { + wwerrno = WWE_NOMEM; + return -1; + } + tt_obp = tt_ob; + tt_obe = tt_ob + i; + + /* + * Use the standard name of the terminal (i.e. the second + * name in termcap). + */ + for (p = wwtermcap; *p && *p != '|' && *p != ':'; p++) + ; + if (*p == '|') + p++; + for (q = p; *q && *q != '|' && *q != ':'; q++) + ; + if (q != p && (t = malloc((unsigned) (q - p + 1))) != 0) { + wwterm = t; + while (p < q) + *t++ = *p++; + *t = 0; + } + for (tp = tt_tab; tp->tt_name != 0; tp++) + if (strncmp(tp->tt_name, wwterm, tp->tt_len) == 0) + break; + if (tp->tt_name == 0) { + wwerrno = WWE_BADTERM; + return -1; + } + if ((*tp->tt_func)() < 0) { + wwerrno = WWE_CANTDO; + return -1; + } + if (wwgetttysize(0, &tt.tt_nrow, &tt.tt_ncol) < 0) + return -1; + tt.tt_scroll_top = 0; + tt.tt_scroll_bot = tt.tt_nrow - 1; + return 0; +} diff --git a/usr.bin/window/ttoutput.c b/usr.bin/window/ttoutput.c new file mode 100644 index 0000000..5c582d6 --- /dev/null +++ b/usr.bin/window/ttoutput.c @@ -0,0 +1,146 @@ +/* + * Copyright (c) 1983, 1993 + * The Regents of the University of California. All rights reserved. + * + * This code is derived from software contributed to Berkeley by + * Edward Wang at The University of California, Berkeley. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. All advertising materials mentioning features or use of this software + * must display the following acknowledgement: + * This product includes software developed by the University of + * California, Berkeley and its contributors. + * 4. Neither the name of the University nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + */ + +#ifndef lint +static char sccsid[] = "@(#)ttoutput.c 8.1 (Berkeley) 6/6/93"; +#endif /* not lint */ + +#include "ww.h" +#include "tt.h" +#include <sys/errno.h> + +/* + * Buffered output package. + * We need this because stdio fails on non-blocking writes. + */ + +ttflush() +{ + register char *p; + register n = tt_obp - tt_ob; + extern errno; + + if (n == 0) + return; + if (tt.tt_checksum) + (*tt.tt_checksum)(tt_ob, n); + if (tt.tt_flush) { + (*tt.tt_flush)(); + return; + } + wwnflush++; + for (p = tt_ob; p < tt_obp;) { + wwnwr++; + n = write(1, p, tt_obp - p); + if (n < 0) { + wwnwre++; + if (errno != EWOULDBLOCK) { + /* can't deal with this */ + p = tt_obp; + } + } else if (n == 0) { + /* what to do? */ + wwnwrz++; + } else { + wwnwrc += n; + p += n; + } + } + tt_obp = tt_ob; +} + +ttputs(s) +register char *s; +{ + while (*s) + ttputc(*s++); +} + +ttwrite(s, n) + register char *s; + register n; +{ + switch (n) { + case 0: + break; + case 1: + ttputc(*s); + break; + case 2: + if (tt_obe - tt_obp < 2) + ttflush(); + *tt_obp++ = *s++; + *tt_obp++ = *s; + break; + case 3: + if (tt_obe - tt_obp < 3) + ttflush(); + *tt_obp++ = *s++; + *tt_obp++ = *s++; + *tt_obp++ = *s; + break; + case 4: + if (tt_obe - tt_obp < 4) + ttflush(); + *tt_obp++ = *s++; + *tt_obp++ = *s++; + *tt_obp++ = *s++; + *tt_obp++ = *s; + break; + case 5: + if (tt_obe - tt_obp < 5) + ttflush(); + *tt_obp++ = *s++; + *tt_obp++ = *s++; + *tt_obp++ = *s++; + *tt_obp++ = *s++; + *tt_obp++ = *s; + break; + default: + while (n > 0) { + register m; + + while ((m = tt_obe - tt_obp) == 0) + ttflush(); + if ((m = tt_obe - tt_obp) > n) + m = n; + bcopy(s, tt_obp, m); + tt_obp += m; + s += m; + n -= m; + } + } +} diff --git a/usr.bin/window/tttermcap.c b/usr.bin/window/tttermcap.c new file mode 100644 index 0000000..a1e8508 --- /dev/null +++ b/usr.bin/window/tttermcap.c @@ -0,0 +1,117 @@ +/* + * Copyright (c) 1983, 1993 + * The Regents of the University of California. All rights reserved. + * + * This code is derived from software contributed to Berkeley by + * Edward Wang at The University of California, Berkeley. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. All advertising materials mentioning features or use of this software + * must display the following acknowledgement: + * This product includes software developed by the University of + * California, Berkeley and its contributors. + * 4. Neither the name of the University nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + */ + +#ifndef lint +static char sccsid[] = "@(#)tttermcap.c 8.1 (Berkeley) 6/6/93"; +#endif /* not lint */ + +#include "tt.h" + +char *tgetstr(); +char *tgoto(); +char *malloc(); + +tttputc(c) +{ + ttputc(c); +} + +ttxputc(c) +{ + *tt_strp++ = c; +} + +struct tt_str * +tttgetstr(str) + char *str; +{ + register struct tt_str *s; + + if ((str = tgetstr(str, &tt_strp)) == 0) + return 0; + if ((s = (struct tt_str *) malloc(sizeof *s)) == 0) + return 0; + s->ts_str = str; + s->ts_n = tt_strp - s->ts_str - 1; + return s; +} + +struct tt_str * +ttxgetstr(str) + char *str; +{ + register struct tt_str *s; + char buf[100]; + char *bufp = buf; + + if (tgetstr(str, &bufp) == 0) + return 0; + if ((s = (struct tt_str *) malloc(sizeof *s)) == 0) + return 0; + s->ts_str = tt_strp; + tputs(buf, 1, ttxputc); + s->ts_n = tt_strp - s->ts_str; + *tt_strp++ = 0; + return s; +} + +tttgoto(s, col, row) + struct tt_str *s; +{ + register char *p = s->ts_str; + + ttputs(tgoto(p, col, row)); + for (p += s->ts_n; *--p == 0;) + ttputc(0); +} + +ttpgoto(s, col, row, n) + struct tt_str *s; +{ + + tputs(tgoto(s->ts_str, col, row), n, tttputc); +} + +ttstrcmp(a, b) + register struct tt_str *a, *b; +{ + int n, r; + + if (r = bcmp(a->ts_str, b->ts_str, + (n = a->ts_n - b->ts_n) < 0 ? a->ts_n : b->ts_n)) + return r; + return n; +} diff --git a/usr.bin/window/tttvi925.c b/usr.bin/window/tttvi925.c new file mode 100644 index 0000000..4f9ae2f --- /dev/null +++ b/usr.bin/window/tttvi925.c @@ -0,0 +1,64 @@ +/* + * Copyright (c) 1983, 1993 + * The Regents of the University of California. All rights reserved. + * + * This code is derived from software contributed to Berkeley by + * David Barto at Celerity Computer Corp. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. All advertising materials mentioning features or use of this software + * must display the following acknowledgement: + * This product includes software developed by the University of + * California, Berkeley and its contributors. + * 4. Neither the name of the University nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + */ + +#ifndef lint +static char sccsid[] = "@(#)tttvi925.c 8.1 (Berkeley) 6/6/93"; +#endif /* not lint */ + +#include "ww.h" +#include "tt.h" + +/* + * Televideo 925 as emulated by Microterm. + */ + +#define G (WWM_GRP << WWC_MSHIFT) +short tvi925_frame[16] = { + ' ', '~'|G, '|'|G, 'c'|G, + '~'|G, '~'|G, '`'|G, 'e'|G, + '|'|G, 'a'|G, '|'|G, 'g'|G, + 'b'|G, 'f'|G, 'h'|G, 'd'|G +}; + +tt_tvi925() +{ + + if (tt_generic() < 0) + return -1; + tt.tt_availmodes |= WWM_GRP; + tt.tt_frame = tvi925_frame; + return 0; +} diff --git a/usr.bin/window/ttwyse60.c b/usr.bin/window/ttwyse60.c new file mode 100644 index 0000000..8efff55 --- /dev/null +++ b/usr.bin/window/ttwyse60.c @@ -0,0 +1,76 @@ +/* + * Copyright 1987 by David C. Elliott, MIPS Computer Systems. + * + * Unlimited redistribution allowed as long as this notice + * is kept intact. + */ + +/* + * Copyright (c) 1988, 1993 + * The Regents of the University of California. All rights reserved. + * + * This code is derived from software contributed to Berkeley by + * David C. Elliott, of MIPS Computer Systems. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. All advertising materials mentioning features or use of this software + * must display the following acknowledgement: + * This product includes software developed by the University of + * California, Berkeley and its contributors. + * 4. Neither the name of the University nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + */ + +#ifndef lint +static char sccsid[] = "@(#)ttwyse60.c 8.1 (Berkeley) 6/6/93"; +#endif /* not lint */ + +#include "ww.h" +#include "tt.h" + +#define G (WWM_GRP << WWC_MSHIFT) +short wyse60_frame[16] = { + ' ', '6'|G, ':'|G, '1'|G, + '6'|G, '6'|G, '2'|G, '4'|G, + ':'|G, '5'|G, ':'|G, '='|G, + '3'|G, '9'|G, '0'|G, '0'|G +}; + +extern struct tt_str *gen_AS; +extern struct tt_str *gen_AE; + +tt_wyse60() +{ + static struct tt_str ae = { "\033H\003", 3 }; + static struct tt_str as = { "\033H\002", 3 }; + + if (tt_generic() < 0) + return -1; + tt.tt_availmodes |= WWM_GRP; + tt.tt_frame = wyse60_frame; + if (gen_AS == 0) + gen_AS = &as; + if (gen_AE == 0) + gen_AE = &ae; + return 0; +} diff --git a/usr.bin/window/ttwyse75.c b/usr.bin/window/ttwyse75.c new file mode 100644 index 0000000..8424d0d --- /dev/null +++ b/usr.bin/window/ttwyse75.c @@ -0,0 +1,76 @@ +/* + * Copyright 1987 by David C. Elliott, MIPS Computer Systems. + * + * Unlimited redistribution allowed as long as this notice + * is kept intact. + */ + +/* + * Copyright (c) 1988, 1993 + * The Regents of the University of California. All rights reserved. + * + * This code is derived from software contributed to Berkeley by + * David C. Elliott, of MIPS Computer Systems. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. All advertising materials mentioning features or use of this software + * must display the following acknowledgement: + * This product includes software developed by the University of + * California, Berkeley and its contributors. + * 4. Neither the name of the University nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + */ + +#ifndef lint +static char sccsid[] = "@(#)ttwyse75.c 8.1 (Berkeley) 6/6/93"; +#endif /* not lint */ + +#include "ww.h" +#include "tt.h" + +#define G (WWM_GRP << WWC_MSHIFT) +short wyse75_frame[16] = { + ' ', 'x'|G, 'q'|G, 'm'|G, + 'x'|G, 'x'|G, 'l'|G, 't'|G, + 'q'|G, 'j'|G, 'q'|G, 'v'|G, + 'k'|G, 'u'|G, 'w'|G, 'v'|G +}; + +extern struct tt_str *gen_AS; +extern struct tt_str *gen_AE; + +tt_wyse75() +{ + static struct tt_str ae = { "\033(B", 3 }; + static struct tt_str as = { "\033(0", 3 }; + + if (tt_generic() < 0) + return -1; + tt.tt_availmodes |= WWM_GRP; + tt.tt_frame = wyse75_frame; + if (gen_AS == 0) + gen_AS = &as; + if (gen_AE == 0) + gen_AE = &ae; + return 0; +} diff --git a/usr.bin/window/ttzapple.c b/usr.bin/window/ttzapple.c new file mode 100644 index 0000000..a285712 --- /dev/null +++ b/usr.bin/window/ttzapple.c @@ -0,0 +1,483 @@ +/* + * Copyright (c) 1989, 1993 + * The Regents of the University of California. All rights reserved. + * + * This code is derived from software contributed to Berkeley by + * Edward Wang at The University of California, Berkeley. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. All advertising materials mentioning features or use of this software + * must display the following acknowledgement: + * This product includes software developed by the University of + * California, Berkeley and its contributors. + * 4. Neither the name of the University nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + */ + +#ifndef lint +static char sccsid[] = "@(#)ttzapple.c 8.1 (Berkeley) 6/6/93"; +#endif /* not lint */ + +#include "ww.h" +#include "tt.h" +#include "char.h" + +/* +zz|zapple|perfect apple:\ + :am:pt:co#80:li#24:le=^H:nd=^F:up=^K:do=^J:\ + :ho=\E0:ll=\E1:cm=\E=%+ %+ :ch=\E<%+ :cv=\E>%+ :\ + :cl=\E4:ce=\E2:cd=\E3:rp=\E@%.%+ :\ + :so=\E+:se=\E-:\ + :dc=\Ec:DC=\EC%+ :ic=\Ei:IC=\EI%+ :\ + :al=\Ea:AL=\EA%+ :dl=\Ed:DL=\ED%+ :\ + :sf=\Ef:SF=\EF%+ :sr=\Er:SR=\ER%+ :cs=\E?%+ %+ :\ + :is=\E-\ET : +*/ + +#define NCOL 80 +#define NROW 24 +#define TOKEN_MAX 32 + +extern short gen_frame[]; + + /* for error correction */ +int zz_ecc; +int zz_lastc; + + /* for checkpointing */ +int zz_sum; + +zz_setmodes(new) +{ + if (new & WWM_REV) { + if ((tt.tt_modes & WWM_REV) == 0) + ttesc('+'); + } else + if (tt.tt_modes & WWM_REV) + ttesc('-'); + tt.tt_modes = new; +} + +zz_insline(n) +{ + if (n == 1) + ttesc('a'); + else { + ttesc('A'); + ttputc(n + ' '); + } +} + +zz_delline(n) +{ + if (n == 1) + ttesc('d'); + else { + ttesc('D'); + ttputc(n + ' '); + } +} + +zz_putc(c) + char c; +{ + if (tt.tt_nmodes != tt.tt_modes) + zz_setmodes(tt.tt_nmodes); + ttputc(c); + if (++tt.tt_col == NCOL) + tt.tt_col = 0, tt.tt_row++; +} + +zz_write(p, n) + register char *p; + register n; +{ + if (tt.tt_nmodes != tt.tt_modes) + zz_setmodes(tt.tt_nmodes); + ttwrite(p, n); + tt.tt_col += n; + if (tt.tt_col == NCOL) + tt.tt_col = 0, tt.tt_row++; +} + +zz_move(row, col) + register row, col; +{ + register x; + + if (tt.tt_row == row) { +same_row: + if ((x = col - tt.tt_col) == 0) + return; + if (col == 0) { + ttctrl('m'); + goto out; + } + switch (x) { + case 2: + ttctrl('f'); + case 1: + ttctrl('f'); + goto out; + case -2: + ttctrl('h'); + case -1: + ttctrl('h'); + goto out; + } + if ((col & 7) == 0 && x > 0 && x <= 16) { + ttctrl('i'); + if (x > 8) + ttctrl('i'); + goto out; + } + ttesc('<'); + ttputc(col + ' '); + goto out; + } + if (tt.tt_col == col) { + switch (row - tt.tt_row) { + case 2: + ttctrl('j'); + case 1: + ttctrl('j'); + goto out; + case -2: + ttctrl('k'); + case -1: + ttctrl('k'); + goto out; + } + if (col == 0) { + if (row == 0) + goto home; + if (row == NROW - 1) + goto ll; + } + ttesc('>'); + ttputc(row + ' '); + goto out; + } + if (col == 0) { + if (row == 0) { +home: + ttesc('0'); + goto out; + } + if (row == tt.tt_row + 1) { + /* + * Do newline first to match the sequence + * for scroll down and return + */ + ttctrl('j'); + ttctrl('m'); + goto out; + } + if (row == NROW - 1) { +ll: + ttesc('1'); + goto out; + } + } + /* favor local motion for better compression */ + if (row == tt.tt_row + 1) { + ttctrl('j'); + goto same_row; + } + if (row == tt.tt_row - 1) { + ttctrl('k'); + goto same_row; + } + ttesc('='); + ttputc(' ' + row); + ttputc(' ' + col); +out: + tt.tt_col = col; + tt.tt_row = row; +} + +zz_start() +{ + ttesc('T'); + ttputc(TOKEN_MAX + ' '); + ttesc('U'); + ttputc('!'); + zz_ecc = 1; + zz_lastc = -1; + ttesc('v'); + ttflush(); + zz_sum = 0; + zz_setscroll(0, NROW - 1); + zz_clear(); + zz_setmodes(0); +} + +zz_reset() +{ + zz_setscroll(0, NROW - 1); + tt.tt_modes = WWM_REV; + zz_setmodes(0); + tt.tt_col = tt.tt_row = -10; +} + +zz_end() +{ + ttesc('T'); + ttputc(' '); + ttesc('U'); + ttputc(' '); + zz_ecc = 0; +} + +zz_clreol() +{ + ttesc('2'); +} + +zz_clreos() +{ + ttesc('3'); +} + +zz_clear() +{ + ttesc('4'); + tt.tt_col = tt.tt_row = 0; +} + +zz_insspace(n) +{ + if (n == 1) + ttesc('i'); + else { + ttesc('I'); + ttputc(n + ' '); + } +} + +zz_delchar(n) +{ + if (n == 1) + ttesc('c'); + else { + ttesc('C'); + ttputc(n + ' '); + } +} + +zz_scroll_down(n) +{ + if (n == 1) + if (tt.tt_row == NROW - 1) + ttctrl('j'); + else + ttesc('f'); + else { + ttesc('F'); + ttputc(n + ' '); + } +} + +zz_scroll_up(n) +{ + if (n == 1) + ttesc('r'); + else { + ttesc('R'); + ttputc(n + ' '); + } +} + +zz_setscroll(top, bot) +{ + ttesc('?'); + ttputc(top + ' '); + ttputc(bot + ' '); + tt.tt_scroll_top = top; + tt.tt_scroll_bot = bot; +} + +int zz_debug = 0; + +zz_set_token(t, s, n) + char *s; +{ + if (tt.tt_nmodes != tt.tt_modes) + zz_setmodes(tt.tt_nmodes); + if (zz_debug) { + char buf[100]; + zz_setmodes(WWM_REV); + (void) sprintf(buf, "%02x=", t); + ttputs(buf); + tt.tt_col += 3; + } + ttputc(0x80); + ttputc(t + 1); + s[n - 1] |= 0x80; + ttwrite(s, n); + s[n - 1] &= ~0x80; +} + +/*ARGSUSED*/ +zz_put_token(t, s, n) + char *s; +{ + if (tt.tt_nmodes != tt.tt_modes) + zz_setmodes(tt.tt_nmodes); + if (zz_debug) { + char buf[100]; + zz_setmodes(WWM_REV); + (void) sprintf(buf, "%02x>", t); + ttputs(buf); + tt.tt_col += 3; + } + ttputc(t + 0x81); +} + +zz_rint(p, n) + char *p; +{ + register i; + register char *q; + + if (!zz_ecc) + return n; + for (i = n, q = p; --i >= 0;) { + register c = (unsigned char) *p++; + + if (zz_lastc == 0) { + switch (c) { + case 0: + *q++ = 0; + zz_lastc = -1; + break; + case 1: /* start input ecc */ + zz_ecc = 2; + zz_lastc = -1; + wwnreadstat++; + break; + case 2: /* ack checkpoint */ + tt.tt_ack = 1; + zz_lastc = -1; + wwnreadack++; + break; + case 3: /* nack checkpoint */ + tt.tt_ack = -1; + zz_lastc = -1; + wwnreadnack++; + break; + default: + zz_lastc = c; + wwnreadec++; + } + } else if (zz_ecc == 1) { + if (c) + *q++ = c; + else + zz_lastc = 0; + } else { + if (zz_lastc < 0) { + zz_lastc = c; + } else if (zz_lastc == c) { + *q++ = zz_lastc; + zz_lastc = -1; + } else { + wwnreadec++; + zz_lastc = c; + } + } + } + return q - (p - n); +} + +zz_checksum(p, n) + register char *p; + register n; +{ + while (--n >= 0) { + register c = *p++ & 0x7f; + c ^= zz_sum; + zz_sum = c << 1 | c >> 11 & 1; + } +} + +zz_compress(flag) +{ + if (flag) + tt.tt_checksum = 0; + else + tt.tt_checksum = zz_checksum; +} + +zz_checkpoint() +{ + static char x[] = { ctrl('['), 'V', 0, 0 }; + + zz_checksum(x, sizeof x); + ttesc('V'); + ttputc(' ' + (zz_sum & 0x3f)); + ttputc(' ' + (zz_sum >> 6 & 0x3f)); + ttflush(); + zz_sum = 0; +} + +tt_zapple() +{ + tt.tt_insspace = zz_insspace; + tt.tt_delchar = zz_delchar; + tt.tt_insline = zz_insline; + tt.tt_delline = zz_delline; + tt.tt_clreol = zz_clreol; + tt.tt_clreos = zz_clreos; + tt.tt_scroll_down = zz_scroll_down; + tt.tt_scroll_up = zz_scroll_up; + tt.tt_setscroll = zz_setscroll; + tt.tt_availmodes = WWM_REV; + tt.tt_wrap = 1; + tt.tt_retain = 0; + tt.tt_ncol = NCOL; + tt.tt_nrow = NROW; + tt.tt_start = zz_start; + tt.tt_reset = zz_reset; + tt.tt_end = zz_end; + tt.tt_write = zz_write; + tt.tt_putc = zz_putc; + tt.tt_move = zz_move; + tt.tt_clear = zz_clear; + tt.tt_setmodes = zz_setmodes; + tt.tt_frame = gen_frame; + tt.tt_padc = TT_PADC_NONE; + tt.tt_ntoken = 127; + tt.tt_set_token = zz_set_token; + tt.tt_put_token = zz_put_token; + tt.tt_token_min = 1; + tt.tt_token_max = TOKEN_MAX; + tt.tt_set_token_cost = 2; + tt.tt_put_token_cost = 1; + tt.tt_compress = zz_compress; + tt.tt_checksum = zz_checksum; + tt.tt_checkpoint = zz_checkpoint; + tt.tt_reset = zz_reset; + tt.tt_rint = zz_rint; + return 0; +} diff --git a/usr.bin/window/ttzentec.c b/usr.bin/window/ttzentec.c new file mode 100644 index 0000000..97fbb07 --- /dev/null +++ b/usr.bin/window/ttzentec.c @@ -0,0 +1,66 @@ +/* + * Copyright (c) 1983, 1993 + * The Regents of the University of California. All rights reserved. + * + * This code is derived from software contributed to Berkeley by + * Edward Wang at The University of California, Berkeley. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. All advertising materials mentioning features or use of this software + * must display the following acknowledgement: + * This product includes software developed by the University of + * California, Berkeley and its contributors. + * 4. Neither the name of the University nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + */ + +#ifndef lint +static char sccsid[] = "@(#)ttzentec.c 8.1 (Berkeley) 6/6/93"; +#endif /* not lint */ + +#include "ww.h" +#include "tt.h" + +/* + * Zentec 1021 + * + * We let the termcap entry specify how to enter and exit graphics mode, + * since it varies with what the terminal is emulating. + */ + +#define G (WWM_GRP << WWC_MSHIFT) +short zentec_frame[16] = { + ' ', 'x'|G, 'q'|G, 'm'|G, + 'x'|G, 'x'|G, 'l'|G, 't'|G, + 'q'|G, 'j'|G, 'q'|G, 'v'|G, + 'k'|G, 'u'|G, 'w'|G, 'n'|G +}; + +tt_zentec() +{ + if (tt_generic() < 0) + return -1; + if (tt.tt_availmodes | WWM_GRP) + tt.tt_frame = zentec_frame; + return 0; +} diff --git a/usr.bin/window/value.h b/usr.bin/window/value.h new file mode 100644 index 0000000..28a1162 --- /dev/null +++ b/usr.bin/window/value.h @@ -0,0 +1,53 @@ +/* + * Copyright (c) 1983, 1993 + * The Regents of the University of California. All rights reserved. + * + * This code is derived from software contributed to Berkeley by + * Edward Wang at The University of California, Berkeley. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. All advertising materials mentioning features or use of this software + * must display the following acknowledgement: + * This product includes software developed by the University of + * California, Berkeley and its contributors. + * 4. Neither the name of the University nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * @(#)value.h 8.1 (Berkeley) 6/6/93 + */ + +struct value { + char v_type; + union { + int V_num; + char *V_str; + } v_un; +}; +#define v_num v_un.V_num +#define v_str v_un.V_str + +#define V_NUM 1 +#define V_STR 2 +#define V_ERR 3 + +#define val_free(v) ((v).v_type == V_STR ? str_free((v).v_str) : 0) diff --git a/usr.bin/window/var.c b/usr.bin/window/var.c new file mode 100644 index 0000000..638dc95 --- /dev/null +++ b/usr.bin/window/var.c @@ -0,0 +1,157 @@ +/* + * Copyright (c) 1983, 1993 + * The Regents of the University of California. All rights reserved. + * + * This code is derived from software contributed to Berkeley by + * Edward Wang at The University of California, Berkeley. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. All advertising materials mentioning features or use of this software + * must display the following acknowledgement: + * This product includes software developed by the University of + * California, Berkeley and its contributors. + * 4. Neither the name of the University nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + */ + +#ifndef lint +static char sccsid[] = "@(#)var.c 8.1 (Berkeley) 6/6/93"; +#endif /* not lint */ + +#include "value.h" +#include "var.h" +#include "string.h" + +char *malloc(); + +struct var * +var_set1(head, name, v) +struct var **head; +char *name; +struct value *v; +{ + register struct var **p; + register struct var *r; + struct value val; + + /* do this first, easier to recover */ + val = *v; + if (val.v_type == V_STR && val.v_str != 0 && + (val.v_str = str_cpy(val.v_str)) == 0) + return 0; + if (*(p = var_lookup1(head, name)) == 0) { + r = (struct var *) malloc(sizeof (struct var)); + if (r == 0) { + val_free(val); + return 0; + } + if ((r->r_name = str_cpy(name)) == 0) { + val_free(val); + free((char *) r); + return 0; + } + r->r_left = r->r_right = 0; + *p = r; + } else { + r = *p; + val_free(r->r_val); + } + r->r_val = val; + return r; +} + +struct var * +var_setstr1(head, name, str) +struct var **head; +char *name; +char *str; +{ + struct value v; + + v.v_type = V_STR; + v.v_str = str; + return var_set1(head, name, &v); +} + +struct var * +var_setnum1(head, name, num) +struct var **head; +char *name; +int num; +{ + struct value v; + + v.v_type = V_NUM; + v.v_num = num; + return var_set1(head, name, &v); +} + +var_unset1(head, name) +struct var **head; +char *name; +{ + register struct var **p; + register struct var *r; + + if (*(p = var_lookup1(head, name)) == 0) + return -1; + r = *p; + *p = r->r_left; + while (*p != 0) + p = &(*p)->r_right; + *p = r->r_right; + val_free(r->r_val); + str_free(r->r_name); + free((char *) r); + return 0; +} + +struct var ** +var_lookup1(p, name) +register struct var **p; +register char *name; +{ + register cmp; + + while (*p != 0) { + if ((cmp = strcmp(name, (*p)->r_name)) < 0) + p = &(*p)->r_left; + else if (cmp > 0) + p = &(*p)->r_right; + else + break; + } + return p; +} + +var_walk1(r, func, a) +register struct var *r; +int (*func)(); +{ + if (r == 0) + return 0; + if (var_walk1(r->r_left, func, a) < 0 || (*func)(a, r) < 0 + || var_walk1(r->r_right, func, a) < 0) + return -1; + return 0; +} diff --git a/usr.bin/window/var.h b/usr.bin/window/var.h new file mode 100644 index 0000000..95fd611 --- /dev/null +++ b/usr.bin/window/var.h @@ -0,0 +1,58 @@ +/* + * Copyright (c) 1983, 1993 + * The Regents of the University of California. All rights reserved. + * + * This code is derived from software contributed to Berkeley by + * Edward Wang at The University of California, Berkeley. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. All advertising materials mentioning features or use of this software + * must display the following acknowledgement: + * This product includes software developed by the University of + * California, Berkeley and its contributors. + * 4. Neither the name of the University nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * @(#)var.h 8.1 (Berkeley) 6/6/93 + */ + +struct var { + struct var *r_left; + struct var *r_right; + char *r_name; + struct value r_val; +}; + +struct var *var_set1(); +struct var *var_setstr1(); +struct var *var_setnum1(); +struct var **var_lookup1(); + +#define var_set(n, v) var_set1(&var_head, n, v) +#define var_setstr(n, s) var_setstr1(&var_head, n, s) +#define var_setnum(n, i) var_setnum1(&var_head, n, i) +#define var_unset(n) var_unset1(&var_head, n) +#define var_lookup(n) (*var_lookup1(&var_head, n)) +#define var_walk(f, a) var_walk1(var_head, f, a) + +struct var *var_head; /* secret, shhh */ diff --git a/usr.bin/window/win.c b/usr.bin/window/win.c new file mode 100644 index 0000000..7eabf23 --- /dev/null +++ b/usr.bin/window/win.c @@ -0,0 +1,370 @@ +/* + * Copyright (c) 1983, 1993 + * The Regents of the University of California. All rights reserved. + * + * This code is derived from software contributed to Berkeley by + * Edward Wang at The University of California, Berkeley. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. All advertising materials mentioning features or use of this software + * must display the following acknowledgement: + * This product includes software developed by the University of + * California, Berkeley and its contributors. + * 4. Neither the name of the University nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + */ + +#ifndef lint +static char sccsid[] = "@(#)win.c 8.1 (Berkeley) 6/6/93"; +#endif /* not lint */ + +#include "defs.h" +#include "char.h" + +/* + * Higher level routines for dealing with windows. + * + * There are two types of windows: user window, and information window. + * User windows are the ones with a pty and shell. Information windows + * are for displaying error messages, and other information. + * + * The windows are doubly linked in overlapping order and divided into + * two groups: foreground and normal. Information + * windows are always foreground. User windows can be either. + * Addwin() adds a window to the list at the top of one of the two groups. + * Deletewin() deletes a window. Front() moves a window to the front + * of its group. Wwopen(), wwadd(), and wwdelete() should never be called + * directly. + */ + +/* + * Open a user window. + */ +struct ww * +openwin(id, row, col, nrow, ncol, nline, label, haspty, hasframe, shf, sh) +char *label; +char haspty, hasframe; +char *shf, **sh; +{ + register struct ww *w; + + if (id < 0 && (id = findid()) < 0) + return 0; + if (row + nrow <= 0 || row > wwnrow - 1 + || col + ncol <= 0 || col > wwncol - 1) { + error("Illegal window position."); + return 0; + } + w = wwopen(haspty ? WWO_PTY : WWO_SOCKET, nrow, ncol, row, col, nline); + if (w == 0) { + error("Can't open window: %s.", wwerror()); + return 0; + } + w->ww_id = id; + window[id] = w; + w->ww_hasframe = hasframe; + w->ww_alt = w->ww_w; + if (label != 0 && setlabel(w, label) < 0) + error("No memory for label."); + wwcursor(w, 1); + /* + * We have to do this little maneuver to make sure + * addwin() puts w at the top, so we don't waste an + * insert and delete operation. + */ + setselwin((struct ww *)0); + addwin(w, 0); + setselwin(w); + if (wwspawn(w, shf, sh) < 0) { + error("Can't execute %s: %s.", shf, wwerror()); + closewin(w); + return 0; + } + return w; +} + +findid() +{ + register i; + + for (i = 0; i < NWINDOW && window[i] != 0; i++) + ; + if (i >= NWINDOW) { + error("Too many windows."); + return -1; + } + return i; +} + +struct ww * +findselwin() +{ + register struct ww *w, *s = 0; + register i; + + for (i = 0; i < NWINDOW; i++) + if ((w = window[i]) != 0 && w != selwin && + (s == 0 || + !isfg(w) && (w->ww_order < s->ww_order || isfg(s)))) + s = w; + return s; +} + +/* + * Close a user window. Close all if w == 0. + */ +closewin(w) +register struct ww *w; +{ + char didit = 0; + register i; + + if (w != 0) { + closewin1(w); + didit++; + } else + for (i = 0; i < NWINDOW; i++) { + if ((w = window[i]) == 0) + continue; + closewin1(w); + didit++; + } + if (didit) { + if (selwin == 0) + if (lastselwin != 0) { + setselwin(lastselwin); + lastselwin = 0; + } else if (w = findselwin()) + setselwin(w); + if (lastselwin == 0 && selwin) + if (w = findselwin()) + lastselwin = w; + reframe(); + } +} + +/* + * Open an information (display) window. + */ +struct ww * +openiwin(nrow, label) +char *label; +{ + register struct ww *w; + + if ((w = wwopen(0, nrow, wwncol, 2, 0, 0)) == 0) + return 0; + w->ww_mapnl = 1; + w->ww_hasframe = 1; + w->ww_nointr = 1; + w->ww_noupdate = 1; + w->ww_unctrl = 1; + w->ww_id = -1; + w->ww_center = 1; + (void) setlabel(w, label); + addwin(w, 1); + reframe(); + return w; +} + +/* + * Close an information window. + */ +closeiwin(w) +struct ww *w; +{ + closewin1(w); + reframe(); +} + +closewin1(w) +register struct ww *w; +{ + if (w == selwin) + selwin = 0; + if (w == lastselwin) + lastselwin = 0; + if (w->ww_id >= 0 && w->ww_id < NWINDOW) + window[w->ww_id] = 0; + if (w->ww_label) + str_free(w->ww_label); + deletewin(w); + wwclose(w); +} + +/* + * Move the window to the top of its group. + * Don't do it if already fully visible. + * Wwvisible() doesn't work for tinted windows. + * But anything to make it faster. + * Always reframe() if doreframe is true. + */ +front(w, doreframe) +register struct ww *w; +char doreframe; +{ + if (w->ww_back != (isfg(w) ? framewin : fgwin) && !wwvisible(w)) { + deletewin(w); + addwin(w, isfg(w)); + doreframe = 1; + } + if (doreframe) + reframe(); +} + +/* + * Add a window at the top of normal windows or foreground windows. + * For normal windows, we put it behind the current window. + */ +addwin(w, fg) +register struct ww *w; +char fg; +{ + if (fg) { + wwadd(w, framewin); + if (fgwin == framewin) + fgwin = w; + } else + wwadd(w, selwin != 0 && selwin != w && !isfg(selwin) + ? selwin : fgwin); +} + +/* + * Delete a window. + */ +deletewin(w) +register struct ww *w; +{ + if (fgwin == w) + fgwin = w->ww_back; + wwdelete(w); +} + +reframe() +{ + register struct ww *w; + + wwunframe(framewin); + for (w = wwhead.ww_back; w != &wwhead; w = w->ww_back) + if (w->ww_hasframe) { + wwframe(w, framewin); + labelwin(w); + } +} + +labelwin(w) +register struct ww *w; +{ + int mode = w == selwin ? WWM_REV : 0; + + if (!w->ww_hasframe) + return; + if (w->ww_id >= 0) { + char buf[2]; + + buf[0] = w->ww_id + '1'; + buf[1] = 0; + wwlabel(w, framewin, 1, buf, mode); + } + if (w->ww_label) { + int col; + + if (w->ww_center) { + col = (w->ww_w.nc - strlen(w->ww_label)) / 2; + col = MAX(3, col); + } else + col = 3; + wwlabel(w, framewin, col, w->ww_label, mode); + } +} + +stopwin(w) + register struct ww *w; +{ + if (w->ww_pty >= 0 && w->ww_ispty && wwstoptty(w->ww_pty) < 0) + error("Can't stop output: %s.", wwerror()); + else + w->ww_stopped = 1; +} + +startwin(w) + register struct ww *w; +{ + if (w->ww_pty >= 0 && w->ww_ispty && wwstarttty(w->ww_pty) < 0) + error("Can't start output: %s.", wwerror()); + else + w->ww_stopped = 0; +} + +sizewin(w, nrow, ncol) +register struct ww *w; +{ + struct ww *back = w->ww_back; + + w->ww_alt.nr = w->ww_w.nr; + w->ww_alt.nc = w->ww_w.nc; + wwdelete(w); + if (wwsize(w, nrow, ncol) < 0) + error("Can't resize window: %s.", wwerror()); + wwadd(w, back); + reframe(); +} + +waitnl(w) +struct ww *w; +{ + (void) waitnl1(w, "[Type any key to continue]"); +} + +more(w, always) +register struct ww *w; +char always; +{ + int c; + char uc = w->ww_unctrl; + + if (!always && w->ww_cur.r < w->ww_w.b - 2) + return 0; + c = waitnl1(w, "[Type escape to abort, any other key to continue]"); + w->ww_unctrl = 0; + wwputs("\033E", w); + w->ww_unctrl = uc; + return c == ctrl('[') ? 2 : 1; +} + +waitnl1(w, prompt) +register struct ww *w; +char *prompt; +{ + char uc = w->ww_unctrl; + + w->ww_unctrl = 0; + front(w, 0); + wwprintf(w, "\033Y%c%c\033sA%s\033rA ", + w->ww_w.nr - 1 + ' ', ' ', prompt); /* print on last line */ + wwcurtowin(w); + while (wwpeekc() < 0) + wwiomux(); + w->ww_unctrl = uc; + return wwgetc(); +} diff --git a/usr.bin/window/window.1 b/usr.bin/window/window.1 new file mode 100644 index 0000000..425cce0 --- /dev/null +++ b/usr.bin/window/window.1 @@ -0,0 +1,947 @@ +.\" Copyright (c) 1985, 1990, 1993 +.\" The Regents of the University of California. All rights reserved. +.\" +.\" This code is derived from software contributed to Berkeley by +.\" Edward Wang at The University of California, Berkeley. +.\" +.\" Redistribution and use in source and binary forms, with or without +.\" modification, are permitted provided that the following conditions +.\" are met: +.\" 1. Redistributions of source code must retain the above copyright +.\" notice, this list of conditions and the following disclaimer. +.\" 2. Redistributions in binary form must reproduce the above copyright +.\" notice, this list of conditions and the following disclaimer in the +.\" documentation and/or other materials provided with the distribution. +.\" 3. All advertising materials mentioning features or use of this software +.\" must display the following acknowledgement: +.\" This product includes software developed by the University of +.\" California, Berkeley and its contributors. +.\" 4. Neither the name of the University nor the names of its contributors +.\" may be used to endorse or promote products derived from this software +.\" without specific prior written permission. +.\" +.\" THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND +.\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +.\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +.\" ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE +.\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS +.\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) +.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT +.\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY +.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF +.\" SUCH DAMAGE. +.\" +.\" @(#)window.1 8.2 (Berkeley) 12/30/93 +.\" +.Dd December 30, 1993 +.Dt WINDOW 1 +.Os BSD 4.3 +.Sh NAME +.Nm window +.Nd window environment +.Sh SYNOPSIS +.Nm window +.Op Fl t +.Op Fl f +.Op Fl d +.Op Fl e Ar escape-char +.Op Fl c Ar command +.Sh DESCRIPTION +.Nm Window +implements a window environment on +.Tn ASCII +terminals. +.Pp +A window is a rectangular portion of the physical terminal +screen associated with a set of processes. Its size and +position can be changed by the user at any time. Processes +communicate with their window in the same way they normally +interact with a terminal\-through their standard input, output, +and diagnostic file descriptors. The window program handles the +details of redirecting input and output to and from the +windows. At any one time, only one window can receive +input from the keyboard, but all windows can simultaneously send output +to the display. +.Pp +When +.Nm window +starts up, the commands (see long commands below) +contained in the file +.Pa .windowrc +in the user's home directory are +executed. If it does not exist, two equal sized windows spanning +the terminal screen are created by default. +.Pp +The command line options are +.Bl -tag -width Fl +.It Fl t +Turn on terse mode (see +.Ic terse +command below). +.It Fl f +Fast. Don't perform any startup action. +.It Fl d +Ignore +.Pa .windowrc +and create the two default +windows instead. +.It Fl e Ar escape-char +Set the escape character to +.Ar escape-char . +.Ar Escape-char +can be a single character, or in the form +.Ic ^X +where +.Ar X +is any character, meaning +.No control\- Ns Ar X . +.It Fl c Ar command +Execute the string +.Ar command +as a long command (see below) +before doing anything else. +.El +.Pp +Windows can overlap and are framed as necessary. Each window +is named by one of the digits ``1'' to ``9''. This one-character +identifier, as well as a user definable label string, are displayed +with the window on the top edge of its frame. A window can be +designated to be in the +.Ar foreground , +in which case it will always be +on top of all normal, non-foreground windows, and can be covered +only by other foreground windows. A window need not be completely +within the edges of the terminal screen. Thus a large window +(possibly larger than the screen) may be positioned to show only +a portion of its full size. +.Pp +Each window has a cursor and a set of control functions. Most intelligent +terminal operations such as line and +character deletion and insertion are supported. Display modes +such as underlining and reverse video are available if they are +supported by the terminal. In addition, +similar to terminals with multiple pages of memory, +each window has a text buffer which can have more lines than the window +itself. +.Ss Process Environment +With each newly created window, a shell program is spawned with its +process environment tailored to that window. Its standard input, +output, and diagnostic file descriptors are bound to one end of either +a pseudo-terminal +.Xr (pty 4 ) +or a +.Ux +domain socket +.Xr (socketpair 4 ) . +If a pseudo-terminal is used, then its special +characters and modes (see +.Xr stty 1 ) +are copied from the physical +terminal. A +.Xr termcap 5 +entry tailored to this window is created +and passed as environment +.Xr (environ 5 ) +variable +.Ev TERMCAP . +The termcap entry contains the window's size and +characteristics as well as information from the physical terminal, +such as the existence of underline, reverse video, and other display +modes, and the codes produced by the terminal's function keys, +if any. In addition, the window size attributes of the pseudo-terminal +are set to reflect the size of this window, and updated whenever +it is changed by the user. In particular, the editor +.Xr vi 1 +uses +this information to redraw its display. +.Ss Operation +During normal execution, +.Nm window +can be in one of two states: +conversation mode and command mode. In conversation mode, the +terminal's real cursor is placed at the cursor position of a particular +window--called the current window--and input from the keyboard is sent +to the process in that window. The current window is always +on top of all other windows, except those in foreground. In addition, +it is set apart by highlighting its identifier and label in reverse video. +.Pp +Typing +.Nm window Ns 's +escape character (normally +.Ic ^P ) +in conversation +mode switches it into command mode. In command mode, the top line of +the terminal screen becomes the command prompt window, and +.Nm window +interprets input from the keyboard as commands to manipulate windows. +.Pp +There are two types of commands: short commands are usually one or two +key strokes; long commands are strings either typed by the user in the +command window (see the +.Dq Ic \&: +command below), or read from a file (see +.Ic source +below). +.Ss Short Commands +Below, +.Ar \&# +represents one of the digits ``1'' to ``9'' +corresponding to the windows 1 to 9. +.Ic ^X +means +.No control\- Ns Ar X , +where +.Ar X +is any character. In particular, +.Ic ^^ +is +.Li control\-^. +.Ar Escape +is the escape key, or +.Ic ^\&[ . +.Bl -tag -width Ds +.It Ar # +Select window +.Ar # +as the current window +and return to conversation mode. +.It Ic \&% Ns Ar # +Select window +.Ar # +but stay in command mode. +.It Ic ^^ +Select the previous window and return to conversation +mode. This is useful for toggling between two windows. +.It Ic escape +Return to conversation mode. +.It Ic ^P +Return to conversation mode and write +.Ic ^P +to the +current window. Thus, typing two +.Ic ^P Ns 's +in conversation +mode sends one to the current window. If the +.Nm window +escape is changed to some other character, that +character takes the place of +.Ic ^P +here. +.It Ic ? +List a short summary of commands. +.It Ic ^L +Refresh the screen. +.It Ic q +Exit +.Nm window . +Confirmation is requested. +.It Ic ^Z +Suspend +.Nm window . +.It Ic w +Create a new window. The user is prompted for the positions +of the upper left and lower right corners of the window. +The cursor is placed on the screen and the keys ``h'', ``j'', +``k'', and ``l'' +move the cursor left, down, up, and right, respectively. +The keys ``H'', ``J'', ``K'', and ``L'' move the cursor to the respective +limits of the screen. Typing a number before the movement keys +repeats the movement that number of times. Return enters the cursor position +as the upper left corner of the window. The lower right corner +is entered in the same manner. During this process, +the placement of the new window is indicated by a rectangular +box drawn on the screen, corresponding to where the new window +will be framed. Typing escape at any point +cancels this command. +.Pp +This window becomes the current window, +and is given the first available ID. The default buffer size +is used (see +.Ar default_nline +command below). +.Pp +Only fully visible windows can be created this way. +.It Ic c Ns Ar # +Close window +.Ar # . +The process in the window is sent +the hangup signal (see +.Xr kill 1 ) . +.Xr Csh 1 +should +handle this signal correctly and cause no problems. +.It Ic m Ns Ar # +Move window +.Ar # +to another location. A box in the shape +of the window is drawn on +the screen to indicate the new position of the window, and the same keys as +those for the +.Ic w +command are used to position the box. The +window can be moved partially off-screen. +.It Ic M Ns Ar # +Move window +.Ar # +to its previous position. +.It Ic s Ns Ar # +Change the size of window +.Ar # . +The user is prompted +to enter the new lower right corner of the window. A box +is drawn to indicate the new window size. The same +keys used in +.Ic w +and +.Ic m +are used to enter the position. +.It Ic S Ns Ar # +Change window +.Ar # +to its previous size. +.It Ic ^Y +Scroll the current window up by one line. +.It Ic ^E +Scroll the current window down by one line. +.It Ic ^U +Scroll the current window up by half the window size. +.It Ic ^D +Scroll the current window down by half the window size. +.It Ic ^B +Scroll the current window up by the full window size. +.It Ic ^F +Scroll the current window down by the full window size. +.It Ic h +Move the cursor of the current window left by one column. +.It Ic j +Move the cursor of the current window down by one line. +.It Ic k +Move the cursor of the current window up by one line. +.It Ic l +Move the cursor of the current window right by one column. +.It Ic y +Yank. The user is prompted to enter two points within the current +window. Then the content of the current window between those two points +is saved in the yank buffer. +.It Ic p +Put. The content of the yank buffer is written to the current +window as input. +.It Ic ^S +Stop output in the current window. +.It Ic ^Q +Start output in the current window. +.It Ic : +Enter a line to be executed as long commands. +Normal line +editing characters (erase character, erase word, erase line) +are supported. +.El +.Ss Long Commands +Long commands are a sequence of statements +parsed much like a programming language, with a syntax +similar to that of C. Numeric and string expressions and variables +are supported, as well as conditional statements. +.Pp +There are two data types: string and number. A string is a sequence +of letters or digits beginning with a letter. ``_'' and ``.'' are +considered letters. Alternately, non-alphanumeric characters can +be included in strings by quoting them in ``"'' or escaping them +with ``\\''. In addition, the ``\\'' sequences of C are supported, +both inside and outside quotes (e.g., ``\\n'' is a new line, +``\\r'' a carriage return). For example, these are legal strings: +abcde01234, "&#$^*&#", ab"$#"cd, ab\\$\\#cd, "/usr/ucb/window". +.Pp +A number is an integer value in one of three forms: +a decimal number, an octal number preceded by ``0'', +or a hexadecimal number preceded by ``0x'' or ``0X''. The natural +machine integer size is used (i.e., the signed integer type +of the C compiler). As in C, a non-zero number represents +a boolean true. +.Pp +The character ``#'' begins a comment which terminates at the +end of the line. +.Pp +A statement is either a conditional or an expression. Expression +statements are terminated with a new line or ``;''. To continue +an expression on the next line, terminate the first line with ``\\''. +.Ss Conditional Statement +.Nm Window +has a single control structure: +the fully bracketed if statement in the form +.Pp +.Bd -literal -offset indent -compact +if <expr> then +\t<statement> +\t... +elsif <expr> then +\t<statement> +\t... +else +\t<statement> +\t... +endif +.Ed +.Pp +The +.Ic else +and +.Ic elsif +parts are optional, and the latter can +be repeated any number of times. +<Expr> +must be numeric. +.Ss Expressions +Expressions in +.Nm window +are similar to those in the +C language, with most C operators supported on numeric +operands. In addition, some are overloaded to operate on strings. +.Pp +When an expression is used as a statement, its value is discarded +after evaluation. Therefore, only expressions with side +effects (assignments and function calls) are useful as statements. +.Pp +Single valued (no arrays) variables are supported, of both +numeric and string values. Some variables are predefined. They +are listed below. +.Pp +The operators in order of increasing precedence: +.Bl -tag -width Fl +.It Xo +.Aq Va expr1 +.Ic = +.Aq Va expr2 +.Xc +Assignment. The variable of name +.Aq Va expr1 , +which must be string valued, +is assigned the result of +.Aq Va expr2 . +Returns the value of +.Aq Va expr2 . +.It Xo +.Aq Va expr1 +.Ic ? +.Aq Va expr2 +.Ic : +.Aq Va expr3 +.Xc +Returns the value of +.Aq Va expr2 +if +.Aq Va expr1 +evaluates true +(non-zero numeric value); returns the value of +.Aq Va expr3 +otherwise. Only +one of +.Aq Va expr2 +and +.Aq Va expr3 +is evaluated. +.Aq Va Expr1 +must +be numeric. +.It Xo +.Aq Va expr1 +.Ic \&|\&| +.Aq Va expr2 +.Xc +Logical or. Numeric values only. Short circuit evaluation is supported +(i.e., if +.Aq Va expr1 +evaluates true, then +.Aq Va expr2 +is not evaluated). +.It Xo +.Aq Va expr1 +.Ic \&&\&& +.Aq Va expr2 +.Xc +Logical and with short circuit evaluation. Numeric values only. +.It Xo +.Aq Va expr1 +.Ic \&| +.Aq Va expr2 +.Xc +Bitwise or. Numeric values only. +.It Xo +.Aq Va expr1 +.Ic ^ +.Aq Va expr2 +.Xc +Bitwise exclusive or. Numeric values only. +.It Xo +.Aq Va expr1 +.Ic \&& +.Aq Va expr2 +.Xc +Bitwise and. Numeric values only. +.It Xo +.Aq Va expr1 +.Ic == +.Aq Va expr2 , +.Aq Va expr1 +.Ic != +.Aq expr2 +.Xc +Comparison (equal and not equal, respectively). The boolean +result (either 1 or 0) of the comparison is returned. The +operands can be numeric or string valued. One string operand +forces the other to be converted to a string in necessary. +.It Xo +.Aq Va expr1 +.Ic < +.Aq Va expr2 , +.Aq Va expr1 +.Ic > +.Aq Va expr2 , +.Aq Va expr1 +.Ic <= +.Aq Va expr2 , +.Xc +Less than, greater than, less than or equal to, +greater than or equal to. Both numeric and string values, with +automatic conversion as above. +.It Xo +.Aq Va expr1 +.Ic << +.Aq Va expr2 , +.Aq Va expr1 +.Ic >> +.Aq Va expr2 +.Xc +If both operands are numbers, +.Aq Va expr1 +is bit +shifted left (or right) by +.Aq Va expr2 +bits. If +.Aq Va expr1 +is +a string, then its first (or last) +.Aq Va expr2 +characters are +returns (if +.Aq Va expr2 +is also a string, then its length is used +in place of its value). +.It Xo +.Aq Va expr1 +.Ic + +.Aq Va expr2 , +.Aq Va expr1 +.Ic - +.Aq Va expr2 +.Xc +Addition and subtraction on numbers. For ``+'', if one +argument is a string, then the other is converted to a string, +and the result is the concatenation of the two strings. +.It Xo +.Aq Va expr1 +.Ic \&* +.Aq Va expr2 , +.Aq Va expr1 +.Ic \&/ +.Aq Va expr2 , +.Aq Va expr1 +.Ic \&% +.Aq Va expr2 +.Xc +Multiplication, division, modulo. Numbers only. +.It Xo +.Ic \- Ns Aq Va expr , +.Ic ~ Ns Aq Va expr , +.Ic \&! Ns Aq Va expr , +.Ic \&$ Ns Aq Va expr , +.Ic \&$? Ns Aq Va expr +.Xc +The first three are unary minus, bitwise complement and logical complement +on numbers only. The operator, ``$'', takes +.Aq Va expr +and returns +the value of the variable of that name. If +.Aq Va expr +is numeric +with value +.Ar n +and it appears within an alias macro (see below), +then it refers to the nth argument of the alias invocation. ``$?'' +tests for the existence of the variable +.Aq Va expr , +and returns 1 +if it exists or 0 otherwise. +.It Xo +.Ao Va expr Ac Ns Pq Aq Ar arglist +.Xc +Function call. +.Aq Va Expr +must be a string that is the unique +prefix of the name of a builtin +.Nm window +function +or the full name of a user defined alias macro. In the case of a builtin +function, +.Aq Ar arglist +can be in one of two forms: +.Bd -literal -offset indent +<expr1>, <expr2>, ... +argname1 = <expr1>, argname2 = <expr2>, ... +.Ed +.Pp +The two forms can in fact be intermixed, but the result is +unpredictable. Most arguments can be omitted; default values will +be supplied for them. The +.Ar argnames +can be unique prefixes +of the argument names. The commas separating +arguments are used only to disambiguate, and can usually be omitted. +.Pp +Only the first argument form is valid for user defined aliases. Aliases +are defined using the +.Ic alias +builtin function (see below). Arguments +are accessed via a variant of the variable mechanism (see ``$'' operator +above). +.Pp +Most functions return value, but some are used for side effect +only and so must be used as statements. When a function or an alias is used +as a statement, the parentheses surrounding +the argument list may be omitted. Aliases return no value. +.El +.Ss Builtin Functions +The arguments are listed by name in their natural +order. Optional arguments are in square brackets +.Sq Op . +Arguments +that have no names are in angle brackets +.Sq <> . +An argument meant to be a boolean flag (often named +.Ar flag ) +can be one of +.Ar on , +.Ar off , +.Ar yes , +.Ar no , +.Ar true , +or +.Ar false , +with +obvious meanings, or it can be a numeric expression, +in which case a non-zero value is true. +.Bl -tag -width Fl +.It Xo +.Ic alias Ns Po Bq Aq Ar string , +.Bq Aq Ar string\-list Pc +.Xc +If no argument is given, all currently defined alias macros are +listed. Otherwise, +.Aq Ar string +is defined as an alias, +with expansion +.Aq Ar string\-list > . +The previous definition of +.Aq Ar string , +if any, is returned. Default for +.Aq Ar string\-list +is no change. +.It Ic close Ns Pq Aq Ar window\-list +Close the windows specified in +.Aq Ar window\-list . +If +.Aq Ar window\-list +is the word +.Ar all , +than all windows are closed. No value is returned. +.It Ic cursormodes Ns Pq Bq Ar modes +Set the window cursor to +.Ar modes . +.Ar Modes +is the bitwise +or of the mode bits defined as the variables +.Ar m_ul +(underline), +.Ar m_rev +(reverse video), +.Ar m_blk +(blinking), +and +.Ar m_grp +(graphics, terminal dependent). Return +value is the previous modes. Default is no change. +For example, +.Li cursor($m_rev$m_blk) +sets the window cursors to blinking +reverse video. +.It Ic default_nline Ns Pq Bq Ar nline +Set the default buffer size to +.Ar nline . +Initially, it is +48 lines. Returns the old default buffer size. Default is +no change. Using a very large buffer can slow the program down +considerably. +.It Ic default_shell Ns Pq Bq Aq Ar string\-list +Set the default window shell program to +.Aq Ar string\-list . +Returns +the first string in the old shell setting. Default is no change. Initially, +the default shell is taken from the environment variable +.Ev SHELL . +.It Ic default_smooth Ns Pq Bq Ar flag +Set the default value of the +.Ar smooth +argument +to the command +.Nm window +(see below). The argument +is a boolean flag (one of +.Ar on , +.Ar off , +.Ar yes , +.Ar no , +.Ar true , +.Ar false , +or a number, +as described above). Default is no change. +The old value (as a number) is returned. +The initial value is 1 (true). +.It Xo +.Ic echo Ns ( Op Ar window , +.Bq Aq Ar string\-list ) +.Xc +Write the list of strings, +.Aq Ar string-list , +to +.Nm window , +separated +by spaces and terminated with a new line. The strings are only +displayed in the window, the processes in the window are not +involved (see +.Ic write +below). No value is returned. Default +is the current window. +.It Ic escape Ns Pq Bq Ar escapec +Set the escape character to +.Ar escape-char . +Returns the old +escape character as a one-character string. Default is no +change. +.Ar Escapec +can be a string of a single character, or +in the form +.Fl ^X , +meaning +.No control\- Ns Ar X . +.It Xo +.Ic foreground Ns ( Bq Ar window , +.Bq Ar flag ) +.Xc +Move +.Nm window +in or out of foreground. +.Ar Flag +is a boolean value. The old foreground flag +is returned. Default for +.Nm window +is the current window, +default for +.Ar flag +is no change. +.It Xo +.Ic label Ns ( Bq Ar window , +.Bq Ar label ) +.Xc +Set the label of +.Nm window +to +.Ar label . +Returns the old +label as a string. Default for +.Nm window +is the current +window, default for +.Ar label +is no change. To turn +off a label, set it to an empty string (""). +.It Ic list Ns Pq +No arguments. List the identifiers and labels of all windows. No +value is returned. +.It Ic select Ns Pq Bq Ar window +Make +.Nm window +the current window. The previous current window +is returned. Default is no change. +.It Ic source Ns Pq Ar filename +Read and execute the long commands in +.Ar filename . +Returns \-1 if the file cannot be read, 0 otherwise. +.It Ic terse Ns Pq Bq flag +Set terse mode to +.Ar flag . +In terse mode, the command window +stays hidden even in command mode, and errors are reported by +sounding the terminal's bell. +.Ar Flag +can take on the same +values as in +.Ar foreground +above. Returns the old terse flag. +Default is no change. +.It Ic unalias Ns Pq Ar alias +Undefine +.Ar alias . +Returns -1 if +.Ar alias +does not exist, +0 otherwise. +.It Ic unset Ns Pq Ar variable +Undefine +.Ar variable . +Returns -1 if +.Ar variable +does not exist, +0 otherwise. +.It Ic variables Ns Pq +No arguments. List all variables. No value is returned. +.It Xo +.Ic window Ns ( Bq Ar row , +.Bq Ar column , +.Bq Ar nrow , +.Bq Ar ncol , +.Bq Ar nline , +.Bq Ar label , +.Bq Ar pty , +.Bq Ar frame , +.Bq Ar mapnl , +.Bq Ar keepopen , +.Bq Ar smooth , +.Bq Ar shell ) . +.Xc +Open a window with upper left corner at +.Ar row , +.Ar column +and size +.Ar nrow , +.Ar ncol . +If +.Ar nline +is specified, +then that many lines are allocated for the text buffer. Otherwise, +the default buffer size is used. Default values for +.Ar row , +.Ar column , +.Ar nrow , +and +.Ar ncol +are, respectively, +the upper, left-most, lower, or right-most extremes of the +screen. +.Ar Label +is the label string. +.Ar Frame , +.Ar pty , +and +.Ar mapnl +are flag values +interpreted in the same way as the argument to +.Ar foreground +(see above); +they mean, respectively, put a frame around this window (default true), +allocate pseudo-terminal for this window rather than socketpair (default +true), and map new line characters in this window to carriage return +and line feed (default true if socketpair is used, false otherwise). +Normally, a window is automatically closed when its process +exits. Setting +.Ar keepopen +to true (default false) prevents this +action. When +.Ar smooth +is true, the screen is updated more frequently +(for this window) to produce a more terminal-like behavior. +The default value of +.Ar smooth +is set by the +.Ar default_smooth +command (see above). +.Ar Shell +is a list of strings that will be used as the shell +program to place in the window (default is the program specified +by +.Ar default_shell , +see above). The created window's identifier +is returned as a number. +.It Xo +.Ic write Ns ( Bq Ar window , +.Bq Aq Ar string\-list ) +.Xc +Send the list of strings, +.Aq Ar string-list , +to +.Nm window , +separated +by spaces but not terminated with a new line. The strings are actually +given to the window as input. No value is returned. Default +is the current window. +.El +.Ss Predefined Variables +These variables are for information only. Redefining them does +not affect the internal operation of +.Nm window . +.Bl -tag -width modes +.It Ar baud +The baud rate as a number between 50 and 38400. +.It Ar modes +The display modes (reverse video, underline, blinking, graphics) +supported by the physical terminal. The value of +.Ar modes +is the bitwise or of some of the one bit values, +.Ar m_blk , +.Ar m_grp , +.Ar m_rev , +and +.Ar m_ul +(see below). +These values are useful +in setting the window cursors' modes (see +.Ar cursormodes +above). +.It Ar m_blk +The blinking mode bit. +.It Ar m_grp +The graphics mode bit (not very useful). +.It Ar m_rev +The reverse video mode bit. +.It Ar m_ul +The underline mode bit. +.It Ar ncol +The number of columns on the physical screen. +.It Ar nrow +The number of rows on the physical screen. +.It Ar term +The terminal type. The standard name, found in the second name +field of the terminal's +.Ev TERMCAP +entry, is used. +.Sh ENVIRONMENT +.Nm Window +utilizes these environment variables: +.Ev HOME , +.Ev SHELL , +.Ev TERM , +.Ev TERMCAP , +.Ev WINDOW_ID . +.Sh FILES +.Bl -tag -width /dev/[pt]ty[pq]? -compact +.It Pa ~/.windowrc +startup command file. +.It Pa /dev/[pt]ty[pq]? +pseudo-terminal devices. +.El +.Sh HISTORY +The +.Nm window +command appeared in +.Bx 4.3 . +.Sh DIAGNOSTICS +Should be self explanatory. diff --git a/usr.bin/window/windowrc b/usr.bin/window/windowrc new file mode 100644 index 0000000..57c695a --- /dev/null +++ b/usr.bin/window/windowrc @@ -0,0 +1,85 @@ +# Copyright (c) 1983, 1993 +# The Regents of the University of California. All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions +# are met: +# 1. Redistributions of source code must retain the above copyright +# notice, this list of conditions and the following disclaimer. +# 2. Redistributions in binary form must reproduce the above copyright +# notice, this list of conditions and the following disclaimer in the +# documentation and/or other materials provided with the distribution. +# 3. All advertising materials mentioning features or use of this software +# must display the following acknowledgement: +# This product includes software developed by the University of +# California, Berkeley and its contributors. +# 4. Neither the name of the University nor the names of its contributors +# may be used to endorse or promote products derived from this software +# without specific prior written permission. +# +# THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND +# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +# ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE +# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS +# OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) +# HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT +# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY +# OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF +# SUCH DAMAGE. +# +# @(#)windowrc 8.1 (Berkeley) 6/6/93 +# + +# Configuration file example for window manager +# To be installed in ~/.windowrc +# +# Create two unequal sized windows of full screen width, +# and set up some useful aliases. +# + +# +# Optional settings +# +# terse on # set terse mode +# escape "^A" # set escape character +# nline 100 # set default buffer size + # initially, this is 48 + +# +# Make two windows +# The bottom one is MIN(24, total lines * 3 / 4) lines +# The top one is the rest of the screen. +# +three_fourth = $nrow - ((_ = $nrow * 3 / 4) > 24 ? 24 : $_) +unset _ +window row = 0, nrow = $three_fourth - 1, label = "Top" +window row = $three_fourth, label = "Local" + +# +# Useful aliases +# +# +# Standard window +# +alias std "window r = $three_fourth, l = $?1 ? $1 : ''" +# +# Sysline, add your own options +# +alias sysline "_ = select();" \ + "foreground window(r = 0, nr = 1, nc = $ncol + 1, nl = 0," \ + "l = sysline, pty = no, frame = no, sh = sysline \\-w), 1;" \ + "select $_; unset _" +# +# Rlogin +# +alias rlogin "window r = $three_fourth, l = $1, pty = no, mapnl = no," \ + "sh = sh \\-c 'echo $TERMCAP | rsh ' + $1 + ' \\'cat > .TERMCAP\\' ;" \ + "exec rlogin ' + $1" +alias rl rlogin \$1 +# +# Two equal windows +# +alias two "window r = 1, nr = $nrow / 2 - 1, l = top;" \ + "window r = $nrow / 2 + 1, l = bottom" diff --git a/usr.bin/window/ww.h b/usr.bin/window/ww.h new file mode 100644 index 0000000..9241492 --- /dev/null +++ b/usr.bin/window/ww.h @@ -0,0 +1,321 @@ +/* + * Copyright (c) 1983, 1993 + * The Regents of the University of California. All rights reserved. + * + * This code is derived from software contributed to Berkeley by + * Edward Wang at The University of California, Berkeley. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. All advertising materials mentioning features or use of this software + * must display the following acknowledgement: + * This product includes software developed by the University of + * California, Berkeley and its contributors. + * 4. Neither the name of the University nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * @(#)ww.h 8.1 (Berkeley) 6/6/93 + */ + +#ifdef OLD_TTY +#include <sgtty.h> +#else +#include <termios.h> +#endif +#include <setjmp.h> +#include <machine/endian.h> + +#define NWW 30 /* maximum number of windows */ + + /* a rectangle */ +struct ww_dim { + int nr; /* number of rows */ + int nc; /* number of columns */ + int t, b; /* top, bottom */ + int l, r; /* left, right */ +}; + + /* a coordinate */ +struct ww_pos { + int r; /* row */ + int c; /* column */ +}; + + /* the window structure */ +struct ww { + /* general flags and states */ + char ww_state; /* state of window */ + char ww_oflags; /* wwopen flags */ + + /* information for overlap */ + struct ww *ww_forw; /* doubly linked list, for overlapping info */ + struct ww *ww_back; + char ww_index; /* the window index, for wwindex[] */ + char ww_order; /* the overlapping order */ + + /* sizes and positions */ + struct ww_dim ww_w; /* window size and pos */ + struct ww_dim ww_b; /* buffer size and pos */ + struct ww_dim ww_i; /* the part inside the screen */ + struct ww_pos ww_cur; /* the cursor position, relative to ww_w */ + + /* arrays */ + char **ww_win; /* the window */ + union ww_char **ww_buf; /* the buffer */ + char **ww_fmap; /* map for frame and box windows */ + short *ww_nvis; /* how many ww_buf chars are visible per row */ + + /* information for wwwrite() and company */ + char ww_wstate; /* state for outputting characters */ + char ww_modes; /* current display modes */ + char ww_insert; /* insert mode */ + char ww_mapnl; /* map \n to \r\n */ + char ww_noupdate; /* don't do updates in wwwrite() */ + char ww_unctrl; /* expand control characters */ + char ww_nointr; /* wwwrite() not interruptable */ + char ww_hascursor; /* has fake cursor */ + + /* things for the window process and io */ + char ww_ispty; /* ww_pty is really a pty, not socket pair */ + char ww_stopped; /* output stopped */ + int ww_pty; /* file descriptor of pty or socket pair */ + int ww_socket; /* other end of socket pair */ + int ww_pid; /* pid of process, if WWS_HASPROC true */ + char ww_ttyname[11]; /* "/dev/ttyp?" */ + char *ww_ob; /* output buffer */ + char *ww_obe; /* end of ww_ob */ + char *ww_obp; /* current read position in ww_ob */ + char *ww_obq; /* current write position in ww_ob */ + + /* things for the user, they really don't belong here */ + char ww_id; /* the user window id */ + char ww_center; /* center the label */ + char ww_hasframe; /* frame it */ + char ww_keepopen; /* keep it open after the process dies */ + char *ww_label; /* the user supplied label */ + struct ww_dim ww_alt; /* alternate position and size */ +}; + + /* state of a tty */ +struct ww_tty { +#ifdef OLD_TTY + struct sgttyb ww_sgttyb; + struct tchars ww_tchars; + struct ltchars ww_ltchars; + int ww_lmode; + int ww_ldisc; +#else + struct termios ww_termios; +#endif + int ww_fflags; +}; + +union ww_char { + short c_w; /* as a word */ + struct { +#if BYTE_ORDER == LITTLE_ENDIAN || BYTE_ORDER == PDP_ENDIAN + char C_c; /* the character part */ + char C_m; /* the mode part */ +#endif +#if BYTE_ORDER == BIG_ENDIAN + char C_m; /* the mode part */ + char C_c; /* the character part */ +#endif + } c_un; +}; +#define c_c c_un.C_c +#define c_m c_un.C_m + + /* for display update */ +struct ww_update { + int best_gain; + int best_col; + int gain; +}; + + /* parts of ww_char */ +#define WWC_CMASK 0x00ff +#define WWC_MMASK 0xff00 +#define WWC_MSHIFT 8 + + /* c_m bits */ +#define WWM_REV 0x01 /* reverse video */ +#define WWM_BLK 0x02 /* blinking */ +#define WWM_UL 0x04 /* underlined */ +#define WWM_GRP 0x08 /* graphics */ +#define WWM_DIM 0x10 /* half intensity */ +#define WWM_USR 0x20 /* user specified mode */ +#define WWM_GLS 0x40 /* window only, glass, i.e., transparent */ + + /* ww_state values */ +#define WWS_INITIAL 0 /* just opened */ +#define WWS_HASPROC 1 /* has process on pty */ +#define WWS_DEAD 3 /* child died */ + + /* flags for ww_fmap */ +#define WWF_U 0x01 +#define WWF_R 0x02 +#define WWF_D 0x04 +#define WWF_L 0x08 +#define WWF_MASK (WWF_U|WWF_R|WWF_D|WWF_L) +#define WWF_LABEL 0x40 +#define WWF_TOP 0x80 + + /* flags to wwopen() */ +#define WWO_PTY 0x01 /* want pty */ +#define WWO_SOCKET 0x02 /* want socket pair */ +#define WWO_REVERSE 0x04 /* make it all reverse video */ +#define WWO_GLASS 0x08 /* make it all glass */ +#define WWO_FRAME 0x10 /* this is a frame window */ + + /* special ww_index value */ +#define WWX_NOBODY NWW + + /* error codes */ +#define WWE_NOERR 0 +#define WWE_SYS 1 /* system error */ +#define WWE_NOMEM 2 /* out of memory */ +#define WWE_TOOMANY 3 /* too many windows */ +#define WWE_NOPTY 4 /* no more ptys */ +#define WWE_SIZE 5 /* bad window size */ +#define WWE_BADTERM 6 /* bad terminal type */ +#define WWE_CANTDO 7 /* dumb terminal */ + + /* wwtouched[] bits, there used to be more than one */ +#define WWU_TOUCHED 0x01 /* touched */ + + /* the window structures */ +struct ww wwhead; +struct ww *wwindex[NWW + 1]; /* last location is for wwnobody */ +struct ww wwnobody; + + /* tty things */ +struct ww_tty wwoldtty; /* the old (saved) terminal settings */ +struct ww_tty wwnewtty; /* the new (current) terminal settings */ +struct ww_tty wwwintty; /* the terminal settings for windows */ +char *wwterm; /* the terminal name */ +char wwtermcap[1024]; /* place for the termcap */ + + /* generally useful variables */ +int wwnrow, wwncol; /* the screen size */ +char wwavailmodes; /* actually supported modes */ +char wwcursormodes; /* the modes for the fake cursor */ +char wwwrap; /* terminal has auto wrap around */ +int wwdtablesize; /* result of getdtablesize() call */ +char **wwsmap; /* the screen map */ +union ww_char **wwos; /* the old (current) screen */ +union ww_char **wwns; /* the new (desired) screen */ +union ww_char **wwcs; /* the checkpointed screen */ +char *wwtouched; /* wwns changed flags */ +struct ww_update *wwupd; /* for display update */ +int wwospeed; /* output baud rate, copied from wwoldtty */ +int wwbaud; /* wwospeed converted into actual number */ +int wwcursorrow, wwcursorcol; /* where we want the cursor to be */ +int wwerrno; /* error number */ + + /* statistics */ +int wwnflush, wwnwr, wwnwre, wwnwrz, wwnwrc; +int wwnwwr, wwnwwra, wwnwwrc; +int wwntokdef, wwntokuse, wwntokbad, wwntoksave, wwntokc; +int wwnupdate, wwnupdline, wwnupdmiss; +int wwnupdscan, wwnupdclreol, wwnupdclreos, wwnupdclreosmiss, wwnupdclreosline; +int wwnread, wwnreade, wwnreadz; +int wwnreadc, wwnreadack, wwnreadnack, wwnreadstat, wwnreadec; +int wwnwread, wwnwreade, wwnwreadz, wwnwreadd, wwnwreadc, wwnwreadp; +int wwnselect, wwnselecte, wwnselectz; + + /* quicky macros */ +#define wwsetcursor(r,c) (wwcursorrow = (r), wwcursorcol = (c)) +#define wwcurtowin(w) wwsetcursor((w)->ww_cur.r, (w)->ww_cur.c) +#define wwunbox(w) wwunframe(w) +#define wwclreol(w,r,c) wwclreol1((w), (r), (c), 0) +#define wwredrawwin(w) wwredrawwin1((w), (w)->ww_i.t, (w)->ww_i.b, 0) +#define wwupdate() wwupdate1(0, wwnrow); + + /* things for handling input */ +void wwrint(); /* interrupt handler */ +struct ww *wwcurwin; /* window to copy input into */ +char *wwib; /* input (keyboard) buffer */ +char *wwibe; /* wwib + sizeof buffer */ +char *wwibp; /* current read position in buffer */ +char *wwibq; /* current write position in buffer */ +#define wwmaskc(c) ((c) & 0x7f) +#define wwgetc() (wwibp < wwibq ? wwmaskc(*wwibp++) : -1) +#define wwpeekc() (wwibp < wwibq ? wwmaskc(*wwibp) : -1) +#define wwungetc(c) (wwibp > wwib ? *--wwibp = (c) : -1) + + /* things for short circuiting wwiomux() */ +char wwintr; /* interrupting */ +char wwsetjmp; /* want a longjmp() from wwrint() and wwchild() */ +jmp_buf wwjmpbuf; /* jmpbuf for above */ +#define wwinterrupt() wwintr +#define wwsetintr() do { wwintr = 1; if (wwsetjmp) longjmp(wwjmpbuf, 1); } \ + while (0) +#define wwclrintr() (wwintr = 0) + + /* checkpointing */ +int wwdocheckpoint; + + /* the window virtual terminal */ +#define WWT_TERM "window-v2" +#define WWT_TERMCAP "WW|window-v2|window program version 2:\ + :am:bs:da:db:ms:pt:cr=^M:nl=^J:bl=^G:ta=^I:\ + :cm=\\EY%+ %+ :le=^H:nd=\\EC:up=\\EA:do=\\EB:ho=\\EH:\ + :cd=\\EJ:ce=\\EK:cl=\\EE:me=\\Er^?:" +#define WWT_REV "se=\\ErA:so=\\EsA:mr=\\EsA:" +#define WWT_BLK "BE=\\ErB:BS=\\EsB:mb=\\EsB:" +#define WWT_UL "ue=\\ErD:us=\\EsD:" +#define WWT_GRP "ae=\\ErH:as=\\EsH:" +#define WWT_DIM "HE=\\ErP:HS=\\EsP:mh=\\EsP:" +#define WWT_USR "XE=\\Er`:XS=\\Es`:" +#define WWT_ALDL "al=\\EL:dl=\\EM:" +#define WWT_IMEI "im=\\E@:ei=\\EO:ic=:mi:" /* XXX, ic for emacs bug */ +#define WWT_IC "ic=\\EP:" +#define WWT_DC "dc=\\EN:" +char wwwintermcap[1024]; /* terminal-specific but window-independent + part of the window termcap */ +#ifdef TERMINFO + /* where to put the temporary terminfo directory */ +char wwterminfopath[1024]; +#endif + + /* our functions */ +struct ww *wwopen(); +void wwchild(); +void wwalarm(); +void wwquit(); +char **wwalloc(); +char *wwerror(); + + /* c library functions */ +char *malloc(); +char *calloc(); +char *getenv(); +char *tgetstr(); +char *rindex(); +char *strcpy(); +char *strcat(); + +#undef MIN +#undef MAX +#define MIN(x, y) ((x) > (y) ? (y) : (x)) +#define MAX(x, y) ((x) > (y) ? (x) : (y)) diff --git a/usr.bin/window/wwadd.c b/usr.bin/window/wwadd.c new file mode 100644 index 0000000..377464a --- /dev/null +++ b/usr.bin/window/wwadd.c @@ -0,0 +1,88 @@ +/* + * Copyright (c) 1983, 1993 + * The Regents of the University of California. All rights reserved. + * + * This code is derived from software contributed to Berkeley by + * Edward Wang at The University of California, Berkeley. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. All advertising materials mentioning features or use of this software + * must display the following acknowledgement: + * This product includes software developed by the University of + * California, Berkeley and its contributors. + * 4. Neither the name of the University nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + */ + +#ifndef lint +static char sccsid[] = "@(#)wwadd.c 8.1 (Berkeley) 6/6/93"; +#endif /* not lint */ + +#include "ww.h" + +/* + * Stick w1 behind w2. + */ +wwadd(w1, w2) +register struct ww *w1; +struct ww *w2; +{ + register i; + register struct ww *w; + + w1->ww_order = w2->ww_order + 1; + w1->ww_back = w2; + w1->ww_forw = w2->ww_forw; + w2->ww_forw->ww_back = w1; + w2->ww_forw = w1; + + for (w = w1->ww_forw; w != &wwhead; w = w->ww_forw) + w->ww_order++; + for (i = w1->ww_i.t; i < w1->ww_i.b; i++) { + register j; + register char *smap = wwsmap[i]; + register char *win = w1->ww_win[i]; + union ww_char *ns = wwns[i]; + union ww_char *buf = w1->ww_buf[i]; + int nvis = 0; + int nchanged = 0; + + for (j = w1->ww_i.l; j < w1->ww_i.r; j++) { + w = wwindex[smap[j]]; + if (w1->ww_order > w->ww_order) + continue; + if (win[j] & WWM_GLS) + continue; + if (w != &wwnobody && w->ww_win[i][j] == 0) + w->ww_nvis[i]--; + smap[j] = w1->ww_index; + if (win[j] == 0) + nvis++; + ns[j].c_w = buf[j].c_w ^ win[j] << WWC_MSHIFT; + nchanged++; + } + if (nchanged > 0) + wwtouched[i] |= WWU_TOUCHED; + w1->ww_nvis[i] = nvis; + } +} diff --git a/usr.bin/window/wwalloc.c b/usr.bin/window/wwalloc.c new file mode 100644 index 0000000..009bf12 --- /dev/null +++ b/usr.bin/window/wwalloc.c @@ -0,0 +1,71 @@ +/* + * Copyright (c) 1983, 1993 + * The Regents of the University of California. All rights reserved. + * + * This code is derived from software contributed to Berkeley by + * Edward Wang at The University of California, Berkeley. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. All advertising materials mentioning features or use of this software + * must display the following acknowledgement: + * This product includes software developed by the University of + * California, Berkeley and its contributors. + * 4. Neither the name of the University nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + */ + +#ifndef lint +static char sccsid[] = "@(#)wwalloc.c 8.1 (Berkeley) 6/6/93"; +#endif /* not lint */ + +#include "ww.h" + +char ** +wwalloc(row, col, nrow, ncol, size) +{ + register char *p, **pp; + register int i; + + /* fast, call malloc only once */ + pp = (char **) + malloc((unsigned) sizeof (char **) * nrow + size * nrow * ncol); + if (pp == 0) { + wwerrno = WWE_NOMEM; + return 0; + } + p = (char *)&pp[nrow]; + col *= size; + size /= sizeof (char); /* paranoid */ + size *= ncol; + for (i = 0; i < nrow; i++) { + pp[i] = p - col; + p += size; + } + return pp - row; +} + +wwfree(p, row) +register char **p; +{ + free((char *)(p + row)); +} diff --git a/usr.bin/window/wwbox.c b/usr.bin/window/wwbox.c new file mode 100644 index 0000000..f4dd52b --- /dev/null +++ b/usr.bin/window/wwbox.c @@ -0,0 +1,66 @@ +/* + * Copyright (c) 1983, 1993 + * The Regents of the University of California. All rights reserved. + * + * This code is derived from software contributed to Berkeley by + * Edward Wang at The University of California, Berkeley. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. All advertising materials mentioning features or use of this software + * must display the following acknowledgement: + * This product includes software developed by the University of + * California, Berkeley and its contributors. + * 4. Neither the name of the University nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + */ + +#ifndef lint +static char sccsid[] = "@(#)wwbox.c 8.1 (Berkeley) 6/6/93"; +#endif /* not lint */ + +#include "ww.h" +#include "tt.h" + +wwbox(w, r, c, nr, nc) +register struct ww *w; +register r, c; +int nr, nc; +{ + register r1, c1; + register i; + + r1 = r + nr - 1; + c1 = c + nc - 1; + wwframec(w, r, c, WWF_D|WWF_R); + for (i = c + 1; i < c1; i++) + wwframec(w, r, i, WWF_L|WWF_R); + wwframec(w, r, i, WWF_L|WWF_D); + for (i = r + 1; i < r1; i++) + wwframec(w, i, c1, WWF_U|WWF_D); + wwframec(w, i, c1, WWF_U|WWF_L); + for (i = c1 - 1; i > c; i--) + wwframec(w, r1, i, WWF_R|WWF_L); + wwframec(w, r1, i, WWF_R|WWF_U); + for (i = r1 - 1; i > r; i--) + wwframec(w, i, c, WWF_D|WWF_U); +} diff --git a/usr.bin/window/wwchild.c b/usr.bin/window/wwchild.c new file mode 100644 index 0000000..944bdd9 --- /dev/null +++ b/usr.bin/window/wwchild.c @@ -0,0 +1,71 @@ +/* + * Copyright (c) 1983, 1993 + * The Regents of the University of California. All rights reserved. + * + * This code is derived from software contributed to Berkeley by + * Edward Wang at The University of California, Berkeley. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. All advertising materials mentioning features or use of this software + * must display the following acknowledgement: + * This product includes software developed by the University of + * California, Berkeley and its contributors. + * 4. Neither the name of the University nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + */ + +#ifndef lint +static char sccsid[] = "@(#)wwchild.c 8.1 (Berkeley) 6/6/93"; +#endif /* not lint */ + +#include "ww.h" +#include <sys/types.h> +#include <sys/wait.h> + +void +wwchild() +{ + extern errno; + int olderrno; + register struct ww **wp; + union wait w; + int pid; + char collected = 0; + + olderrno = errno; + while ((pid = + wait3((int *)&w, WNOHANG|WUNTRACED, (struct rusage *)0)) > 0) { + for (wp = wwindex; wp < &wwindex[NWW]; wp++) { + if (*wp && (*wp)->ww_state == WWS_HASPROC + && (*wp)->ww_pid == pid) { + (*wp)->ww_state = WWS_DEAD; + collected = 1; + break; + } + } + } + errno = olderrno; + /* jump out of wwiomux when somebody dies */ + if (collected) + wwsetintr(); +} diff --git a/usr.bin/window/wwclose.c b/usr.bin/window/wwclose.c new file mode 100644 index 0000000..a27aed9 --- /dev/null +++ b/usr.bin/window/wwclose.c @@ -0,0 +1,59 @@ +/* + * Copyright (c) 1983, 1993 + * The Regents of the University of California. All rights reserved. + * + * This code is derived from software contributed to Berkeley by + * Edward Wang at The University of California, Berkeley. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. All advertising materials mentioning features or use of this software + * must display the following acknowledgement: + * This product includes software developed by the University of + * California, Berkeley and its contributors. + * 4. Neither the name of the University nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + */ + +#ifndef lint +static char sccsid[] = "@(#)wwclose.c 8.1 (Berkeley) 6/6/93"; +#endif /* not lint */ + +#include "ww.h" + +wwclose(w) +register struct ww *w; +{ + wwindex[w->ww_index] = 0; + if (w->ww_pty >= 0) + (void) close(w->ww_pty); + if (w->ww_socket >= 0) + (void) close(w->ww_socket); + wwfree((char **)w->ww_win, w->ww_w.t); + wwfree((char **)w->ww_buf, w->ww_b.t); + if (w->ww_fmap != 0) + wwfree((char **)w->ww_fmap, w->ww_w.t); + free((char *)(w->ww_nvis + w->ww_w.t)); + if (w->ww_ob != 0) + free(w->ww_ob); + free((char *)w); +} diff --git a/usr.bin/window/wwclreol.c b/usr.bin/window/wwclreol.c new file mode 100644 index 0000000..d827f67 --- /dev/null +++ b/usr.bin/window/wwclreol.c @@ -0,0 +1,95 @@ +/* + * Copyright (c) 1983, 1993 + * The Regents of the University of California. All rights reserved. + * + * This code is derived from software contributed to Berkeley by + * Edward Wang at The University of California, Berkeley. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. All advertising materials mentioning features or use of this software + * must display the following acknowledgement: + * This product includes software developed by the University of + * California, Berkeley and its contributors. + * 4. Neither the name of the University nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + */ + +#ifndef lint +static char sccsid[] = "@(#)wwclreol.c 8.1 (Berkeley) 6/6/93"; +#endif /* not lint */ + +#include "ww.h" +#include "tt.h" + +/* + * Clear w to the end of line. + * If cleared is true, then the screen line has already been cleared. + */ +wwclreol1(w, row, col, cleared) +register struct ww *w; +int row, col; +char cleared; +{ + register i; + + /* + * Clear the buffer right off + */ + { + register union ww_char *buf; + + buf = &w->ww_buf[row][col]; + for (i = w->ww_b.r - col; --i >= 0;) + buf++->c_w = ' '; + } + + /* + * If can't see it, just return. + */ + if (row < w->ww_i.t || row >= w->ww_i.b + || w->ww_i.r <= 0 || w->ww_i.r <= col) + return; + + if (col < w->ww_i.l) + col = w->ww_i.l; + + /* + * Now fix wwns. + */ + { + register union ww_char *s; + register char *smap, *win; + + i = col; + smap = &wwsmap[row][i]; + s = &wwns[row][i]; + win = &w->ww_win[row][i]; + for (i = w->ww_i.r - i; --i >= 0;) + if (*smap++ == w->ww_index) + s++->c_w = ' ' | *win++ << WWC_MSHIFT; + else + s++, win++; + } + if (!cleared) + wwtouched[row] |= WWU_TOUCHED; +} diff --git a/usr.bin/window/wwclreos.c b/usr.bin/window/wwclreos.c new file mode 100644 index 0000000..f3d462c --- /dev/null +++ b/usr.bin/window/wwclreos.c @@ -0,0 +1,55 @@ +/* + * Copyright (c) 1983, 1993 + * The Regents of the University of California. All rights reserved. + * + * This code is derived from software contributed to Berkeley by + * Edward Wang at The University of California, Berkeley. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. All advertising materials mentioning features or use of this software + * must display the following acknowledgement: + * This product includes software developed by the University of + * California, Berkeley and its contributors. + * 4. Neither the name of the University nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + */ + +#ifndef lint +static char sccsid[] = "@(#)wwclreos.c 8.1 (Berkeley) 6/6/93"; +#endif /* not lint */ + +#include "ww.h" +#include "tt.h" + +wwclreos(w, row, col) +register struct ww *w; +{ + register i; + + wwclreol(w, row, col); + for (i = row + 1; i < w->ww_b.b; i++) + wwclreol(w, i, w->ww_b.l); + /* XXX */ + if (!w->ww_noupdate) + wwupdate1(w->ww_i.t, w->ww_i.b); +} diff --git a/usr.bin/window/wwcursor.c b/usr.bin/window/wwcursor.c new file mode 100644 index 0000000..cd9cdba --- /dev/null +++ b/usr.bin/window/wwcursor.c @@ -0,0 +1,92 @@ +/* + * Copyright (c) 1983, 1993 + * The Regents of the University of California. All rights reserved. + * + * This code is derived from software contributed to Berkeley by + * Edward Wang at The University of California, Berkeley. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. All advertising materials mentioning features or use of this software + * must display the following acknowledgement: + * This product includes software developed by the University of + * California, Berkeley and its contributors. + * 4. Neither the name of the University nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + */ + +#ifndef lint +static char sccsid[] = "@(#)wwcursor.c 8.1 (Berkeley) 6/6/93"; +#endif /* not lint */ + +#include "ww.h" + +wwcursor(w, on) +register struct ww *w; +{ + register char *win; + + if (on) { + if (w->ww_hascursor) + return; + w->ww_hascursor = 1; + } else { + if (!w->ww_hascursor) + return; + w->ww_hascursor = 0; + } + if (wwcursormodes != 0) { + win = &w->ww_win[w->ww_cur.r][w->ww_cur.c]; + *win ^= wwcursormodes; + if (w->ww_cur.r < w->ww_i.t || w->ww_cur.r >= w->ww_i.b + || w->ww_cur.c < w->ww_i.l || w->ww_cur.c >= w->ww_i.r) + return; + if (wwsmap[w->ww_cur.r][w->ww_cur.c] == w->ww_index) { + if (*win == 0) + w->ww_nvis[w->ww_cur.r]++; + else if (*win == wwcursormodes) + w->ww_nvis[w->ww_cur.r]--; + wwns[w->ww_cur.r][w->ww_cur.c].c_m ^= wwcursormodes; + wwtouched[w->ww_cur.r] |= WWU_TOUCHED; + } + } +} + +wwsetcursormodes(new) +register new; +{ + register i; + register struct ww *w; + register old = wwcursormodes; + + new &= wwavailmodes; + if (new == wwcursormodes) + return; + for (i = 0; i < NWW; i++) + if (wwindex[i] != 0 && (w = wwindex[i])->ww_hascursor) { + wwcursor(w, 0); + wwcursormodes = new; + wwcursor(w, 1); + wwcursormodes = old; + } + wwcursormodes = new; +} diff --git a/usr.bin/window/wwdata.c b/usr.bin/window/wwdata.c new file mode 100644 index 0000000..1280589 --- /dev/null +++ b/usr.bin/window/wwdata.c @@ -0,0 +1,39 @@ +/* + * Copyright (c) 1983, 1993 + * The Regents of the University of California. All rights reserved. + * + * This code is derived from software contributed to Berkeley by + * Edward Wang at The University of California, Berkeley. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. All advertising materials mentioning features or use of this software + * must display the following acknowledgement: + * This product includes software developed by the University of + * California, Berkeley and its contributors. + * 4. Neither the name of the University nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + */ + +#ifndef lint +static char sccsid[] = "@(#)wwdata.c 8.1 (Berkeley) 6/6/93"; +#endif /* not lint */ diff --git a/usr.bin/window/wwdelchar.c b/usr.bin/window/wwdelchar.c new file mode 100644 index 0000000..cd58833 --- /dev/null +++ b/usr.bin/window/wwdelchar.c @@ -0,0 +1,123 @@ +/* + * Copyright (c) 1983, 1993 + * The Regents of the University of California. All rights reserved. + * + * This code is derived from software contributed to Berkeley by + * Edward Wang at The University of California, Berkeley. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. All advertising materials mentioning features or use of this software + * must display the following acknowledgement: + * This product includes software developed by the University of + * California, Berkeley and its contributors. + * 4. Neither the name of the University nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + */ + +#ifndef lint +static char sccsid[] = "@(#)wwdelchar.c 8.1 (Berkeley) 6/6/93"; +#endif /* not lint */ + +#include "ww.h" +#include "tt.h" + +wwdelchar(w, row, col) +register struct ww *w; +{ + register i; + int nvis; + + /* + * First, shift the line. + */ + { + register union ww_char *p, *q; + + p = &w->ww_buf[row][col]; + q = p + 1; + for (i = w->ww_b.r - col; --i > 0;) + *p++ = *q++; + p->c_w = ' '; + } + + /* + * If can't see it, just return. + */ + if (row < w->ww_i.t || row >= w->ww_i.b + || w->ww_i.r <= 0 || w->ww_i.r <= col) + return; + + if (col < w->ww_i.l) + col = w->ww_i.l; + + /* + * Now find out how much is actually changed, and fix wwns. + */ + { + register union ww_char *buf; + register char *win; + register union ww_char *ns; + register char *smap; + char touched; + + nvis = 0; + smap = &wwsmap[row][col]; + for (i = col; i < w->ww_i.r && *smap++ != w->ww_index; i++) + ; + if (i >= w->ww_i.r) + return; + col = i; + buf = w->ww_buf[row]; + win = w->ww_win[row]; + ns = wwns[row]; + smap = &wwsmap[row][i]; + touched = wwtouched[row]; + for (; i < w->ww_i.r; i++) { + if (*smap++ != w->ww_index) + continue; + touched |= WWU_TOUCHED; + if (win[i]) + ns[i].c_w = + buf[i].c_w ^ win[i] << WWC_MSHIFT; + else { + nvis++; + ns[i] = buf[i]; + } + } + wwtouched[row] = touched; + } + + /* + * Can/Should we use delete character? + */ + if (tt.tt_delchar != 0 && nvis > (wwncol - col) / 2) { + register union ww_char *p, *q; + + xxdelchar(row, col); + p = &wwos[row][col]; + q = p + 1; + for (i = wwncol - col; --i > 0;) + *p++ = *q++; + p->c_w = ' '; + } +} diff --git a/usr.bin/window/wwdelete.c b/usr.bin/window/wwdelete.c new file mode 100644 index 0000000..f659736 --- /dev/null +++ b/usr.bin/window/wwdelete.c @@ -0,0 +1,139 @@ +/* + * Copyright (c) 1983, 1993 + * The Regents of the University of California. All rights reserved. + * + * This code is derived from software contributed to Berkeley by + * Edward Wang at The University of California, Berkeley. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. All advertising materials mentioning features or use of this software + * must display the following acknowledgement: + * This product includes software developed by the University of + * California, Berkeley and its contributors. + * 4. Neither the name of the University nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + */ + +#ifndef lint +static char sccsid[] = "@(#)wwdelete.c 8.1 (Berkeley) 6/6/93"; +#endif /* not lint */ + +#include "ww.h" + +/* + * Pull w free from the cover list. + */ +wwdelete(w) +register struct ww *w; +{ + register i; + + for (i = w->ww_i.t; i < w->ww_i.b; i++) { + register j; + register char *smap = wwsmap[i]; + register union ww_char *ns = wwns[i]; + register int nchanged = 0; + + for (j = w->ww_i.l; j < w->ww_i.r; j++) + if (smap[j] == w->ww_index) { + smap[j] = WWX_NOBODY; + ns[j].c_w = ' '; + nchanged++; + } + if (nchanged > 0) + wwtouched[i] |= WWU_TOUCHED; + } + + { + register struct ww *wp; + + for (wp = w->ww_forw; wp != &wwhead; wp = wp->ww_forw) + wp->ww_order--; + } + + if (w->ww_forw != &wwhead) + wwdelete1(w->ww_forw, + w->ww_i.t, w->ww_i.b, w->ww_i.l, w->ww_i.r); + + w->ww_back->ww_forw = w->ww_forw; + w->ww_forw->ww_back = w->ww_back; + w->ww_forw = w->ww_back = 0; +} + +wwdelete1(w, t, b, l, r) +register struct ww *w; +{ + int i; + int tt, bb, ll, rr; + char hasglass; + +again: + hasglass = 0; + tt = MAX(t, w->ww_i.t); + bb = MIN(b, w->ww_i.b); + ll = MAX(l, w->ww_i.l); + rr = MIN(r, w->ww_i.r); + if (tt >= bb || ll >= rr) { + if ((w = w->ww_forw) == &wwhead) + return; + goto again; + } + for (i = tt; i < bb; i++) { + register j; + register char *smap = wwsmap[i]; + register union ww_char *ns = wwns[i]; + register char *win = w->ww_win[i]; + register union ww_char *buf = w->ww_buf[i]; + int nvis = w->ww_nvis[i]; + int nchanged = 0; + + for (j = ll; j < rr; j++) { + if (smap[j] != WWX_NOBODY) + continue; + if (win[j] & WWM_GLS) { + hasglass = 1; + continue; + } + smap[j] = w->ww_index; + ns[j].c_w = buf[j].c_w ^ win[j] << WWC_MSHIFT; + nchanged++; + if (win[j] == 0) + nvis++; + } + if (nchanged > 0) + wwtouched[i] |= WWU_TOUCHED; + w->ww_nvis[i] = nvis; + } + if ((w = w->ww_forw) == &wwhead) + return; + if (hasglass) + goto again; + if (tt > t) + wwdelete1(w, t, tt, l, r); + if (bb < b) + wwdelete1(w, bb, b, l, r); + if (ll > l) + wwdelete1(w, tt, bb, l, ll); + if (rr < r) + wwdelete1(w, tt, bb, rr, r); +} diff --git a/usr.bin/window/wwdelline.c b/usr.bin/window/wwdelline.c new file mode 100644 index 0000000..f2aef72 --- /dev/null +++ b/usr.bin/window/wwdelline.c @@ -0,0 +1,88 @@ +/* + * Copyright (c) 1983, 1993 + * The Regents of the University of California. All rights reserved. + * + * This code is derived from software contributed to Berkeley by + * Edward Wang at The University of California, Berkeley. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. All advertising materials mentioning features or use of this software + * must display the following acknowledgement: + * This product includes software developed by the University of + * California, Berkeley and its contributors. + * 4. Neither the name of the University nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + */ + +#ifndef lint +static char sccsid[] = "@(#)wwdelline.c 8.1 (Berkeley) 6/6/93"; +#endif /* not lint */ + +#include "ww.h" + +wwdelline(w, row) +register struct ww *w; +int row; +{ + register i; + register union ww_char **cpp, **cqq; + register union ww_char *cp; + int row1, row2; + char deleted; + int visible; + + /* + * Scroll first. + */ + if ((row1 = row) < w->ww_i.t) { + row1 = w->ww_i.t; + } + if ((row2 = w->ww_b.b) > w->ww_i.b) { + row2 = w->ww_i.b; + visible = 0; + } else + visible = 1; + deleted = wwscroll1(w, row1, row2, 1, visible); + + /* + * Fix the buffer. + * But leave clearing the last line for wwclreol(). + */ + cpp = &w->ww_buf[row]; + cqq = cpp + 1; + cp = *cpp; + for (i = w->ww_b.b - row; --i > 0;) + *cpp++ = *cqq++; + *cpp = cp; + + /* + * Now clear the last line. + */ + if (visible) + wwclreol1(w, w->ww_b.b - 1, w->ww_b.l, deleted); + else { + cp += w->ww_b.l; + for (i = w->ww_b.nc; --i >= 0;) + cp++->c_w = ' '; + } +} diff --git a/usr.bin/window/wwdump.c b/usr.bin/window/wwdump.c new file mode 100644 index 0000000..8f60d4e --- /dev/null +++ b/usr.bin/window/wwdump.c @@ -0,0 +1,114 @@ +/* + * Copyright (c) 1983, 1993 + * The Regents of the University of California. All rights reserved. + * + * This code is derived from software contributed to Berkeley by + * Edward Wang at The University of California, Berkeley. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. All advertising materials mentioning features or use of this software + * must display the following acknowledgement: + * This product includes software developed by the University of + * California, Berkeley and its contributors. + * 4. Neither the name of the University nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + */ + +#ifndef lint +static char sccsid[] = "@(#)wwdump.c 8.1 (Berkeley) 6/6/93"; +#endif /* not lint */ + +#include "ww.h" +#include "tt.h" + +static char cmap[] = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"; + +wwdumpwin(w) +register struct ww *w; +{ + register i, j; + + tt.tt_nmodes = 0; + (*tt.tt_clear)(); + for (i = w->ww_i.t; i < w->ww_i.b; i++) { + (*tt.tt_move)(i, w->ww_i.l); + for (j = w->ww_i.l; j < w->ww_i.r; j++) + (*tt.tt_putc)(w->ww_win[i][j] & WWM_GLS ? 'G' : ' '); + } +} + +wwdumpnvis(w) +register struct ww *w; +{ + register i; + char buf[20]; + + tt.tt_nmodes = 0; + (*tt.tt_clear)(); + for (i = w->ww_i.t; i < w->ww_i.b; i++) { + (*tt.tt_move)(i, w->ww_i.l); + (void) sprintf(buf, "%d", w->ww_nvis[i]); + (*tt.tt_write)(buf, strlen(buf)); + } +} + +wwdumpsmap() +{ + register i, j; + + tt.tt_nmodes = 0; + (*tt.tt_clear)(); + for (i = 0; i < wwnrow; i++) { + (*tt.tt_move)(i, 0); + for (j = 0; j < wwncol; j++) + (*tt.tt_putc)(cmap[wwsmap[i][j]]); + } +} + +wwdumpns() +{ + register i, j; + + (*tt.tt_clear)(); + for (i = 0; i < wwnrow; i++) { + (*tt.tt_move)(i, 0); + for (j = 0; j < wwncol; j++) { + tt.tt_nmodes = wwns[i][j].c_m & tt.tt_availmodes; + (*tt.tt_putc)(wwns[i][j].c_c); + } + } +} + +wwdumpos() +{ + register i, j; + + (*tt.tt_clear)(); + for (i = 0; i < wwnrow; i++) { + (*tt.tt_move)(i, 0); + for (j = 0; j < wwncol; j++) { + tt.tt_nmodes = wwos[i][j].c_m & tt.tt_availmodes; + (*tt.tt_putc)(wwns[i][j].c_c); + } + } +} diff --git a/usr.bin/window/wwend.c b/usr.bin/window/wwend.c new file mode 100644 index 0000000..9586f14 --- /dev/null +++ b/usr.bin/window/wwend.c @@ -0,0 +1,64 @@ +/* + * Copyright (c) 1983, 1993 + * The Regents of the University of California. All rights reserved. + * + * This code is derived from software contributed to Berkeley by + * Edward Wang at The University of California, Berkeley. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. All advertising materials mentioning features or use of this software + * must display the following acknowledgement: + * This product includes software developed by the University of + * California, Berkeley and its contributors. + * 4. Neither the name of the University nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + */ + +#ifndef lint +static char sccsid[] = "@(#)wwend.c 8.1 (Berkeley) 6/6/93"; +#endif /* not lint */ + +#include "ww.h" +#include "tt.h" + +/*ARGSUSED*/ +wwend(exit) +{ + if (tt.tt_checkpoint) { + (void) alarm(0); + wwdocheckpoint = 0; + } + xxend(); + (void) wwsettty(0, &wwoldtty); +#ifdef TERMINFO + if (exit) + wwterminfoend(); +#endif +} + +void +wwquit() +{ + wwend(1); + exit(1); +} diff --git a/usr.bin/window/wwenviron.c b/usr.bin/window/wwenviron.c new file mode 100644 index 0000000..2b5d82c --- /dev/null +++ b/usr.bin/window/wwenviron.c @@ -0,0 +1,102 @@ +/* + * Copyright (c) 1983, 1993 + * The Regents of the University of California. All rights reserved. + * + * This code is derived from software contributed to Berkeley by + * Edward Wang at The University of California, Berkeley. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. All advertising materials mentioning features or use of this software + * must display the following acknowledgement: + * This product includes software developed by the University of + * California, Berkeley and its contributors. + * 4. Neither the name of the University nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + */ + +#ifndef lint +static char sccsid[] = "@(#)wwenviron.c 8.1 (Berkeley) 6/6/93"; +#endif /* not lint */ + +#include "ww.h" +#if !defined(OLD_TTY) && !defined(TIOCSCTTY) && !defined(TIOCNOTTY) +#include <sys/ioctl.h> +#endif +#include <sys/signal.h> + +/* + * Set up the environment of this process to run in window 'wp'. + */ +wwenviron(wp) +register struct ww *wp; +{ + register i; +#ifndef TIOCSCTTY + int pgrp = getpid(); +#endif + char buf[1024]; + +#ifndef TIOCSCTTY + if ((i = open("/dev/tty", 0)) < 0) + goto bad; + if (ioctl(i, TIOCNOTTY, (char *)0) < 0) + goto bad; + (void) close(i); +#endif + if ((i = wp->ww_socket) < 0) { + if ((i = open(wp->ww_ttyname, 2)) < 0) + goto bad; + if (wwsettty(i, &wwwintty) < 0) + goto bad; + if (wwsetttysize(i, wp->ww_w.nr, wp->ww_w.nc) < 0) + goto bad; + } + (void) dup2(i, 0); + (void) dup2(i, 1); + (void) dup2(i, 2); + (void) close(i); +#ifdef TIOCSCTTY + (void) setsid(); + (void) ioctl(0, TIOCSCTTY, 0); +#else + (void) ioctl(0, TIOCSPGRP, (char *)&pgrp); + (void) setpgrp(pgrp, pgrp); +#endif + /* SIGPIPE is the only one we ignore */ + (void) signal(SIGPIPE, SIG_DFL); + (void) sigsetmask(0); + /* + * Two conditions that make destructive setenv ok: + * 1. setenv() copies the string, + * 2. we've already called tgetent which copies the termcap entry. + */ + (void) sprintf(buf, "%sco#%d:li#%d:%s", + WWT_TERMCAP, wp->ww_w.nc, wp->ww_w.nr, wwwintermcap); + (void) setenv("TERMCAP", buf, 1); + (void) sprintf(buf, "%d", wp->ww_id + 1); + (void) setenv("WINDOW_ID", buf, 1); + return 0; +bad: + wwerrno = WWE_SYS; + return -1; +} diff --git a/usr.bin/window/wwerror.c b/usr.bin/window/wwerror.c new file mode 100644 index 0000000..0bba6f5 --- /dev/null +++ b/usr.bin/window/wwerror.c @@ -0,0 +1,69 @@ +/* + * Copyright (c) 1983, 1993 + * The Regents of the University of California. All rights reserved. + * + * This code is derived from software contributed to Berkeley by + * Edward Wang at The University of California, Berkeley. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. All advertising materials mentioning features or use of this software + * must display the following acknowledgement: + * This product includes software developed by the University of + * California, Berkeley and its contributors. + * 4. Neither the name of the University nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + */ + +#ifndef lint +static char sccsid[] = "@(#)wwerror.c 8.1 (Berkeley) 6/6/93"; +#endif /* not lint */ + +#include "ww.h" + +char * +wwerror() +{ + extern int errno; + char *strerror(); + + switch (wwerrno) { + case WWE_NOERR: + return "No error"; + case WWE_SYS: + return strerror(errno); + case WWE_NOMEM: + return "Out of memory"; + case WWE_TOOMANY: + return "Too many windows"; + case WWE_NOPTY: + return "Out of pseudo-terminals"; + case WWE_SIZE: + return "Bad window size"; + case WWE_BADTERM: + return "Unknown terminal type"; + case WWE_CANTDO: + return "Can't run window on this terminal"; + default: + return "Unknown error"; + } +} diff --git a/usr.bin/window/wwflush.c b/usr.bin/window/wwflush.c new file mode 100644 index 0000000..1346e56 --- /dev/null +++ b/usr.bin/window/wwflush.c @@ -0,0 +1,108 @@ +/* + * Copyright (c) 1983, 1993 + * The Regents of the University of California. All rights reserved. + * + * This code is derived from software contributed to Berkeley by + * Edward Wang at The University of California, Berkeley. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. All advertising materials mentioning features or use of this software + * must display the following acknowledgement: + * This product includes software developed by the University of + * California, Berkeley and its contributors. + * 4. Neither the name of the University nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + */ + +#ifndef lint +static char sccsid[] = "@(#)wwflush.c 8.1 (Berkeley) 6/6/93"; +#endif /* not lint */ + +#include "ww.h" +#include "tt.h" +#include <sys/signal.h> + +wwflush() +{ + register row, col; + + if ((row = wwcursorrow) < 0) + row = 0; + else if (row >= wwnrow) + row = wwnrow - 1; + if ((col = wwcursorcol) < 0) + col = 0; + else if (col >= wwncol) + col = wwncol - 1; + xxmove(row, col); + if (wwdocheckpoint) { + xxflush(0); + wwcheckpoint(); + } else + xxflush(1); +} + +wwcheckpoint() +{ + int s = sigblock(sigmask(SIGALRM) | sigmask(SIGIO)); + + tt.tt_ack = 0; + do { + (*tt.tt_checkpoint)(); +#ifndef OLD_TTY + (void) tcdrain(1); +#endif + (void) alarm(3); + for (wwdocheckpoint = 0; !wwdocheckpoint && tt.tt_ack == 0;) + (void) sigpause(s); + } while (tt.tt_ack == 0); + (void) alarm(0); + wwdocheckpoint = 0; + if (tt.tt_ack < 0) { + wwcopyscreen(wwcs, wwos); + (void) alarm(1); + wwreset(); + wwupdate(); + wwflush(); + } else { + wwcopyscreen(wwos, wwcs); + (void) alarm(3); + } + (void) sigsetmask(s); +} + +wwcopyscreen(s1, s2) + register union ww_char **s1, **s2; +{ + register i; + register s = wwncol * sizeof **s1; + + for (i = wwnrow; --i >= 0;) + bcopy((char *) *s1++, (char *) *s2++, s); +} + +void +wwalarm() +{ + wwdocheckpoint = 1; +} diff --git a/usr.bin/window/wwframe.c b/usr.bin/window/wwframe.c new file mode 100644 index 0000000..bb0badd --- /dev/null +++ b/usr.bin/window/wwframe.c @@ -0,0 +1,249 @@ +/* + * Copyright (c) 1983, 1993 + * The Regents of the University of California. All rights reserved. + * + * This code is derived from software contributed to Berkeley by + * Edward Wang at The University of California, Berkeley. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. All advertising materials mentioning features or use of this software + * must display the following acknowledgement: + * This product includes software developed by the University of + * California, Berkeley and its contributors. + * 4. Neither the name of the University nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + */ + +#ifndef lint +static char sccsid[] = "@(#)wwframe.c 8.1 (Berkeley) 6/6/93"; +#endif /* not lint */ + +#include "ww.h" +#include "tt.h" + +#define frameok(w, r, c) (w1 = wwindex[wwsmap[r][c]], \ + w1->ww_fmap || w1->ww_order > (w)->ww_order) + +wwframe(w, wframe) +register struct ww *w; +struct ww *wframe; +{ + register r, c; + char a1, a2, a3; + char b1, b2, b3; + register char *smap; + register code; + register struct ww *w1; + + if (w->ww_w.t > 0) { + r = w->ww_w.t - 1; + c = w->ww_i.l - 1; + smap = &wwsmap[r + 1][c + 1]; + a1 = 0; + a2 = 0; + b1 = 0; + b2 = c < 0 || frameok(w, r, c); + + for (; c < w->ww_i.r; c++) { + if (c + 1 >= wwncol) { + a3 = 1; + b3 = 1; + } else { + a3 = w->ww_index == *smap++; + b3 = frameok(w, r, c + 1); + } + if (b2) { + code = 0; + if ((a1 || a2) && b1) + code |= WWF_L; + if ((a2 || a3) && b3) + code |= WWF_R; + if (code) + wwframec(wframe, r, c, code|WWF_TOP); + } + a1 = a2; + a2 = a3; + b1 = b2; + b2 = b3; + } + if ((a1 || a2) && b1 && b2) + wwframec(wframe, r, c, WWF_L|WWF_TOP); + } + + if (w->ww_w.b < wwnrow) { + r = w->ww_w.b; + c = w->ww_i.l - 1; + smap = &wwsmap[r - 1][c + 1]; + a1 = 0; + a2 = 0; + b1 = 0; + b2 = c < 0 || frameok(w, r, c); + + for (; c < w->ww_i.r; c++) { + if (c + 1 >= wwncol) { + a3 = 1; + b3 = 1; + } else { + a3 = w->ww_index == *smap++; + b3 = frameok(w, r, c + 1); + } + if (b2) { + code = 0; + if ((a1 || a2) && b1) + code |= WWF_L; + if ((a2 || a3) && b3) + code |= WWF_R; + if (code) + wwframec(wframe, r, c, code); + } + a1 = a2; + a2 = a3; + b1 = b2; + b2 = b3; + } + if ((a1 || a2) && b1 && b2) + wwframec(wframe, r, c, WWF_L); + } + + if (w->ww_w.l > 0) { + r = w->ww_i.t - 1; + c = w->ww_w.l - 1; + a1 = 0; + a2 = 0; + b1 = 0; + b2 = r < 0 || frameok(w, r, c); + + for (; r < w->ww_i.b; r++) { + if (r + 1 >= wwnrow) { + a3 = 1; + b3 = 1; + } else { + a3 = w->ww_index == wwsmap[r + 1][c + 1]; + b3 = frameok(w, r + 1, c); + } + if (b2) { + code = 0; + if ((a1 || a2) && b1) + code |= WWF_U; + if ((a2 || a3) && b3) + code |= WWF_D; + if (code) + wwframec(wframe, r, c, code); + } + a1 = a2; + a2 = a3; + b1 = b2; + b2 = b3; + } + if ((a1 || a2) && b1 && b2) + wwframec(wframe, r, c, WWF_U); + } + + if (w->ww_w.r < wwncol) { + r = w->ww_i.t - 1; + c = w->ww_w.r; + a1 = 0; + a2 = 0; + b1 = 0; + b2 = r < 0 || frameok(w, r, c); + + for (; r < w->ww_i.b; r++) { + if (r + 1 >= wwnrow) { + a3 = 1; + b3 = 1; + } else { + a3 = w->ww_index == wwsmap[r + 1][c - 1]; + b3 = frameok(w, r + 1, c); + } + if (b2) { + code = 0; + if ((a1 || a2) && b1) + code |= WWF_U; + if ((a2 || a3) && b3) + code |= WWF_D; + if (code) + wwframec(wframe, r, c, code); + } + a1 = a2; + a2 = a3; + b1 = b2; + b2 = b3; + } + if ((a1 || a2) && b1 && b2) + wwframec(wframe, r, c, WWF_U); + } +} + +wwframec(f, r, c, code) +register struct ww *f; +register r, c; +char code; +{ + char oldcode; + register char *smap; + + if (r < f->ww_i.t || r >= f->ww_i.b || c < f->ww_i.l || c >= f->ww_i.r) + return; + + smap = &wwsmap[r][c]; + + { + register struct ww *w; + + w = wwindex[*smap]; + if (w->ww_order > f->ww_order) { + if (w != &wwnobody && w->ww_win[r][c] == 0) + w->ww_nvis[r]--; + *smap = f->ww_index; + } + } + + if (f->ww_fmap != 0) { + register char *fmap; + + fmap = &f->ww_fmap[r][c]; + oldcode = *fmap; + *fmap |= code; + if (code & WWF_TOP) + *fmap &= ~WWF_LABEL; + code = *fmap; + } else + oldcode = 0; + { + register char *win = &f->ww_win[r][c]; + + if (*win == WWM_GLS && *smap == f->ww_index) + f->ww_nvis[r]++; + *win &= ~WWM_GLS; + } + if (oldcode != code && (code & WWF_LABEL) == 0) { + register short frame; + + frame = tt.tt_frame[code & WWF_MASK]; + f->ww_buf[r][c].c_w = frame; + if (wwsmap[r][c] == f->ww_index) { + wwtouched[r] |= WWU_TOUCHED; + wwns[r][c].c_w = frame; + } + } +} diff --git a/usr.bin/window/wwgets.c b/usr.bin/window/wwgets.c new file mode 100644 index 0000000..1f69fa5 --- /dev/null +++ b/usr.bin/window/wwgets.c @@ -0,0 +1,109 @@ +/* + * Copyright (c) 1983, 1993 + * The Regents of the University of California. All rights reserved. + * + * This code is derived from software contributed to Berkeley by + * Edward Wang at The University of California, Berkeley. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. All advertising materials mentioning features or use of this software + * must display the following acknowledgement: + * This product includes software developed by the University of + * California, Berkeley and its contributors. + * 4. Neither the name of the University nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + */ + +#ifndef lint +static char sccsid[] = "@(#)wwgets.c 8.1 (Berkeley) 6/6/93"; +#endif /* not lint */ + +#include "ww.h" +#include "char.h" + +wwgets(buf, n, w) +char *buf; +int n; +register struct ww *w; +{ + register char *p = buf; + register char c; + char uc = w->ww_unctrl; + static void rub(); + + w->ww_unctrl = 0; + for (;;) { + wwcurtowin(w); + while ((c = wwgetc()) < 0) + wwiomux(); +#ifdef OLD_TTY + if (c == wwoldtty.ww_sgttyb.sg_erase) +#else + if (c == wwoldtty.ww_termios.c_cc[VERASE]) +#endif + { + if (p > buf) + rub(*--p, w); + } else +#ifdef OLD_TTY + if (c == wwoldtty.ww_sgttyb.sg_kill) +#else + if (c == wwoldtty.ww_termios.c_cc[VKILL]) +#endif + { + while (p > buf) + rub(*--p, w); + } else +#ifdef OLD_TTY + if (c == wwoldtty.ww_ltchars.t_werasc) +#else + if (c == wwoldtty.ww_termios.c_cc[VWERASE]) +#endif + { + while (--p >= buf && (*p == ' ' || *p == '\t')) + rub(*p, w); + while (p >= buf && *p != ' ' && *p != '\t') + rub(*p--, w); + p++; + } else if (c == '\r' || c == '\n') { + break; + } else { + if (p >= buf + n - 1) + wwputc(ctrl('g'), w); + else + wwputs(unctrl(*p++ = c), w); + } + } + *p = 0; + w->ww_unctrl = uc; +} + +static void +rub(c, w) +struct ww *w; +{ + register i; + + for (i = strlen(unctrl(c)); --i >= 0;) + (void) wwwrite(w, "\b \b", 3); +} diff --git a/usr.bin/window/wwinit.c b/usr.bin/window/wwinit.c new file mode 100644 index 0000000..0581126 --- /dev/null +++ b/usr.bin/window/wwinit.c @@ -0,0 +1,388 @@ +/* + * Copyright (c) 1983, 1993 + * The Regents of the University of California. All rights reserved. + * + * This code is derived from software contributed to Berkeley by + * Edward Wang at The University of California, Berkeley. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. All advertising materials mentioning features or use of this software + * must display the following acknowledgement: + * This product includes software developed by the University of + * California, Berkeley and its contributors. + * 4. Neither the name of the University nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + */ + +#ifndef lint +static char sccsid[] = "@(#)wwinit.c 8.1 (Berkeley) 6/6/93"; +#endif /* not lint */ + +#include "ww.h" +#include "tt.h" +#include <sys/signal.h> +#include <fcntl.h> +#include "char.h" + +wwinit() +{ + register i, j; + char *kp; + int s; + + wwdtablesize = getdtablesize(); + wwhead.ww_forw = &wwhead; + wwhead.ww_back = &wwhead; + + s = sigblock(sigmask(SIGIO) | sigmask(SIGCHLD) | sigmask(SIGALRM) | + sigmask(SIGHUP) | sigmask(SIGTERM)); + if (signal(SIGIO, wwrint) == BADSIG || + signal(SIGCHLD, wwchild) == BADSIG || + signal(SIGHUP, wwquit) == BADSIG || + signal(SIGTERM, wwquit) == BADSIG || + signal(SIGPIPE, SIG_IGN) == BADSIG) { + wwerrno = WWE_SYS; + return -1; + } + + if (wwgettty(0, &wwoldtty) < 0) + return -1; + wwwintty = wwoldtty; +#ifdef OLD_TTY + wwwintty.ww_sgttyb.sg_flags &= ~XTABS; + wwnewtty.ww_sgttyb = wwoldtty.ww_sgttyb; + wwnewtty.ww_sgttyb.sg_erase = -1; + wwnewtty.ww_sgttyb.sg_kill = -1; + wwnewtty.ww_sgttyb.sg_flags |= CBREAK; + wwnewtty.ww_sgttyb.sg_flags &= ~(ECHO|CRMOD); + wwnewtty.ww_tchars.t_intrc = -1; + wwnewtty.ww_tchars.t_quitc = -1; + wwnewtty.ww_tchars.t_startc = -1; + wwnewtty.ww_tchars.t_stopc = -1; + wwnewtty.ww_tchars.t_eofc = -1; + wwnewtty.ww_tchars.t_brkc = -1; + wwnewtty.ww_ltchars.t_suspc = -1; + wwnewtty.ww_ltchars.t_dsuspc = -1; + wwnewtty.ww_ltchars.t_rprntc = -1; + wwnewtty.ww_ltchars.t_flushc = -1; + wwnewtty.ww_ltchars.t_werasc = -1; + wwnewtty.ww_ltchars.t_lnextc = -1; + wwnewtty.ww_lmode = wwoldtty.ww_lmode | LLITOUT; + wwnewtty.ww_ldisc = wwoldtty.ww_ldisc; +#else +#ifndef OXTABS +#define OXTABS XTABS +#endif +#ifndef _POSIX_VDISABLE +#define _POSIX_VDISABLE -1 +#endif + wwwintty.ww_termios.c_oflag &= ~OXTABS; + wwnewtty.ww_termios = wwoldtty.ww_termios; + wwnewtty.ww_termios.c_iflag &= + ~(ISTRIP | INLCR | IGNCR | ICRNL | IXON | IXOFF | IMAXBEL); + wwnewtty.ww_termios.c_oflag = 0; + wwnewtty.ww_termios.c_cflag &= ~(CSIZE | PARENB); + wwnewtty.ww_termios.c_cflag |= CS8; + wwnewtty.ww_termios.c_lflag = 0; + for (i = 0; i < NCCS; i++) + wwnewtty.ww_termios.c_cc[i] = _POSIX_VDISABLE; + wwnewtty.ww_termios.c_cc[VMIN] = 0; + wwnewtty.ww_termios.c_cc[VTIME] = 0; +#endif + wwnewtty.ww_fflags = wwoldtty.ww_fflags | FASYNC; + if (wwsettty(0, &wwnewtty) < 0) + goto bad; + + if ((wwterm = getenv("TERM")) == 0) { + wwerrno = WWE_BADTERM; + goto bad; + } + if (tgetent(wwtermcap, wwterm) != 1) { + wwerrno = WWE_BADTERM; + goto bad; + } +#ifdef OLD_TTY + wwospeed = wwoldtty.ww_sgttyb.sg_ospeed; +#else + wwospeed = cfgetospeed(&wwoldtty.ww_termios); +#endif + switch (wwospeed) { + default: + case B0: + wwbaud = 0; + break; + case B50: + wwbaud = 50; + break; + case B75: + wwbaud = 75; + break; + case B110: + wwbaud = 110; + break; + case B134: + wwbaud = 134; + break; + case B150: + wwbaud = 150; + break; + case B200: + wwbaud = 200; + break; + case B300: + wwbaud = 300; + break; + case B600: + wwbaud = 600; + break; + case B1200: + wwbaud = 1200; + break; + case B1800: + wwbaud = 1800; + break; + case B2400: + wwbaud = 2400; + break; + case B4800: + wwbaud = 4800; + break; + case B9600: + wwbaud = 9600; + break; +#ifdef B19200 + case B19200: +#else + case EXTA: +#endif + wwbaud = 19200; + break; +#ifdef B38400 + case B38400: +#else + case EXTB: +#endif + wwbaud = 38400; + break; + } + + if (xxinit() < 0) + goto bad; + wwnrow = tt.tt_nrow; + wwncol = tt.tt_ncol; + wwavailmodes = tt.tt_availmodes; + wwwrap = tt.tt_wrap; + + if (wwavailmodes & WWM_REV) + wwcursormodes = WWM_REV | wwavailmodes & WWM_BLK; + else if (wwavailmodes & WWM_UL) + wwcursormodes = WWM_UL; + + if ((wwib = malloc((unsigned) 512)) == 0) + goto bad; + wwibe = wwib + 512; + wwibq = wwibp = wwib; + + if ((wwsmap = wwalloc(0, 0, wwnrow, wwncol, sizeof (char))) == 0) + goto bad; + for (i = 0; i < wwnrow; i++) + for (j = 0; j < wwncol; j++) + wwsmap[i][j] = WWX_NOBODY; + + wwos = (union ww_char **) + wwalloc(0, 0, wwnrow, wwncol, sizeof (union ww_char)); + if (wwos == 0) + goto bad; + /* wwos is cleared in wwstart1() */ + wwns = (union ww_char **) + wwalloc(0, 0, wwnrow, wwncol, sizeof (union ww_char)); + if (wwns == 0) + goto bad; + for (i = 0; i < wwnrow; i++) + for (j = 0; j < wwncol; j++) + wwns[i][j].c_w = ' '; + if (tt.tt_checkpoint) { + /* wwcs is also cleared in wwstart1() */ + wwcs = (union ww_char **) + wwalloc(0, 0, wwnrow, wwncol, sizeof (union ww_char)); + if (wwcs == 0) + goto bad; + } + + wwtouched = malloc((unsigned) wwnrow); + if (wwtouched == 0) { + wwerrno = WWE_NOMEM; + goto bad; + } + for (i = 0; i < wwnrow; i++) + wwtouched[i] = 0; + + wwupd = (struct ww_update *) malloc((unsigned) wwnrow * sizeof *wwupd); + if (wwupd == 0) { + wwerrno = WWE_NOMEM; + goto bad; + } + + wwindex[WWX_NOBODY] = &wwnobody; + wwnobody.ww_order = NWW; + + kp = wwwintermcap; + if (wwavailmodes & WWM_REV) + wwaddcap1(WWT_REV, &kp); + if (wwavailmodes & WWM_BLK) + wwaddcap1(WWT_BLK, &kp); + if (wwavailmodes & WWM_UL) + wwaddcap1(WWT_UL, &kp); + if (wwavailmodes & WWM_GRP) + wwaddcap1(WWT_GRP, &kp); + if (wwavailmodes & WWM_DIM) + wwaddcap1(WWT_DIM, &kp); + if (wwavailmodes & WWM_USR) + wwaddcap1(WWT_USR, &kp); + if (tt.tt_insline && tt.tt_delline || tt.tt_setscroll) + wwaddcap1(WWT_ALDL, &kp); + if (tt.tt_inschar) + wwaddcap1(WWT_IMEI, &kp); + if (tt.tt_insspace) + wwaddcap1(WWT_IC, &kp); + if (tt.tt_delchar) + wwaddcap1(WWT_DC, &kp); + wwaddcap("kb", &kp); + wwaddcap("ku", &kp); + wwaddcap("kd", &kp); + wwaddcap("kl", &kp); + wwaddcap("kr", &kp); + wwaddcap("kh", &kp); + if ((j = tgetnum("kn")) >= 0) { + char cap[32]; + + (void) sprintf(kp, "kn#%d:", j); + for (; *kp; kp++) + ; + for (i = 1; i <= j; i++) { + (void) sprintf(cap, "k%d", i); + wwaddcap(cap, &kp); + cap[0] = 'l'; + wwaddcap(cap, &kp); + } + } + /* + * It's ok to do this here even if setenv() is destructive + * since tt_init() has already made its own copy of it and + * wwterm now points to the copy. + */ + (void) setenv("TERM", WWT_TERM, 1); +#ifdef TERMINFO + if (wwterminfoinit() < 0) + goto bad; +#endif + + if (tt.tt_checkpoint) + if (signal(SIGALRM, wwalarm) == BADSIG) { + wwerrno = WWE_SYS; + goto bad; + } + /* catch typeahead before ASYNC was set */ + (void) kill(getpid(), SIGIO); + wwstart1(); + (void) sigsetmask(s); + return 0; +bad: + /* + * Don't bother to free storage. We're supposed + * to exit when wwinit fails anyway. + */ + (void) wwsettty(0, &wwoldtty); + (void) signal(SIGIO, SIG_DFL); + (void) sigsetmask(s); + return -1; +} + +wwaddcap(cap, kp) + register char *cap; + register char **kp; +{ + char tbuf[512]; + char *tp = tbuf; + register char *str, *p; + + if ((str = tgetstr(cap, &tp)) != 0) { + while (*(*kp)++ = *cap++) + ; + (*kp)[-1] = '='; + while (*str) { + for (p = unctrl(*str++); *(*kp)++ = *p++;) + ; + (*kp)--; + } + *(*kp)++ = ':'; + **kp = 0; + } +} + +wwaddcap1(cap, kp) + register char *cap; + register char **kp; +{ + while (*(*kp)++ = *cap++) + ; + (*kp)--; +} + +wwstart() +{ + register i; + + (void) wwsettty(0, &wwnewtty); + for (i = 0; i < wwnrow; i++) + wwtouched[i] = WWU_TOUCHED; + wwstart1(); +} + +wwstart1() +{ + register i, j; + + for (i = 0; i < wwnrow; i++) + for (j = 0; j < wwncol; j++) { + wwos[i][j].c_w = ' '; + if (tt.tt_checkpoint) + wwcs[i][j].c_w = ' '; + } + xxstart(); + if (tt.tt_checkpoint) + wwdocheckpoint = 1; +} + +/* + * Reset data structures and terminal from an unknown state. + * Restoring wwos has been taken care of elsewhere. + */ +wwreset() +{ + register i; + + xxreset(); + for (i = 0; i < wwnrow; i++) + wwtouched[i] = WWU_TOUCHED; +} diff --git a/usr.bin/window/wwinschar.c b/usr.bin/window/wwinschar.c new file mode 100644 index 0000000..d055fcd --- /dev/null +++ b/usr.bin/window/wwinschar.c @@ -0,0 +1,130 @@ +/* + * Copyright (c) 1983, 1993 + * The Regents of the University of California. All rights reserved. + * + * This code is derived from software contributed to Berkeley by + * Edward Wang at The University of California, Berkeley. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. All advertising materials mentioning features or use of this software + * must display the following acknowledgement: + * This product includes software developed by the University of + * California, Berkeley and its contributors. + * 4. Neither the name of the University nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + */ + +#ifndef lint +static char sccsid[] = "@(#)wwinschar.c 8.1 (Berkeley) 6/6/93"; +#endif /* not lint */ + +#include "ww.h" +#include "tt.h" + +wwinschar(w, row, col, c, m) +register struct ww *w; +char c, m; +{ + register i; + int nvis; + short x = c | m << WWC_MSHIFT; + + /* + * First, shift the line. + */ + { + register union ww_char *p, *q; + + p = &w->ww_buf[row][w->ww_b.r]; + q = p - 1; + for (i = w->ww_b.r - col; --i > 0;) + *--p = *--q; + q->c_w = x; + } + + /* + * If can't see it, just return. + */ + if (row < w->ww_i.t || row >= w->ww_i.b + || w->ww_i.r <= 0 || w->ww_i.r <= col) + return; + + if (col < w->ww_i.l) + col = w->ww_i.l; + + /* + * Now find out how much is actually changed, and fix wwns. + */ + { + register union ww_char *buf; + register char *win; + register union ww_char *ns; + register char *smap; + char touched; + + nvis = 0; + smap = &wwsmap[row][col]; + for (i = col; i < w->ww_i.r && *smap++ != w->ww_index; i++) + ; + if (i >= w->ww_i.r) + return; + col = i; + buf = w->ww_buf[row]; + win = w->ww_win[row]; + ns = wwns[row]; + smap = &wwsmap[row][i]; + touched = wwtouched[row]; + for (; i < w->ww_i.r; i++) { + if (*smap++ != w->ww_index) + continue; + touched |= WWU_TOUCHED; + if (win[i]) + ns[i].c_w = + buf[i].c_w ^ win[i] << WWC_MSHIFT; + else { + nvis++; + ns[i] = buf[i]; + } + } + wwtouched[row] = touched; + } + + /* + * Can/Should we use delete character? + */ + if ((tt.tt_inschar || tt.tt_insspace) && nvis > (wwncol - col) / 2) { + register union ww_char *p, *q; + + if (tt.tt_inschar) + xxinschar(row, col, c, m); + else { + xxinsspace(row, col); + x = ' '; + } + p = &wwos[row][wwncol]; + q = p - 1; + for (i = wwncol - col; --i > 0;) + *--p = *--q; + q->c_w = x; + } +} diff --git a/usr.bin/window/wwinsline.c b/usr.bin/window/wwinsline.c new file mode 100644 index 0000000..acdeb26 --- /dev/null +++ b/usr.bin/window/wwinsline.c @@ -0,0 +1,88 @@ +/* + * Copyright (c) 1983, 1993 + * The Regents of the University of California. All rights reserved. + * + * This code is derived from software contributed to Berkeley by + * Edward Wang at The University of California, Berkeley. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. All advertising materials mentioning features or use of this software + * must display the following acknowledgement: + * This product includes software developed by the University of + * California, Berkeley and its contributors. + * 4. Neither the name of the University nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + */ + +#ifndef lint +static char sccsid[] = "@(#)wwinsline.c 8.1 (Berkeley) 6/6/93"; +#endif /* not lint */ + +#include "ww.h" + +wwinsline(w, row) +register struct ww *w; +int row; +{ + register i; + register union ww_char **cpp, **cqq; + register union ww_char *cp; + int row1, row2; + char deleted; + int visible; + + /* + * Scroll first. + */ + if ((row1 = row) < w->ww_i.t) { + row1 = w->ww_i.t; + visible = 0; + } else + visible = 1; + if ((row2 = w->ww_b.b) > w->ww_i.b) { + row2 = w->ww_i.b; + } + deleted = wwscroll1(w, row1, row2, -1, visible); + + /* + * Fix the buffer. + * But leave clearing the last line for wwclreol(). + */ + cpp = &w->ww_buf[w->ww_b.b]; + cqq = cpp - 1; + cp = *cqq; + for (i = w->ww_b.b - row; --i > 0;) + *--cpp = *--cqq; + *cqq = cp; + + /* + * Now clear the last line. + */ + if (visible) + wwclreol1(w, row, w->ww_b.l, deleted); + else { + cp += w->ww_b.l; + for (i = w->ww_b.nc; --i >= 0;) + cp++->c_w = ' '; + } +} diff --git a/usr.bin/window/wwiomux.c b/usr.bin/window/wwiomux.c new file mode 100644 index 0000000..ce6978b --- /dev/null +++ b/usr.bin/window/wwiomux.c @@ -0,0 +1,203 @@ +/* + * Copyright (c) 1983, 1993 + * The Regents of the University of California. All rights reserved. + * + * This code is derived from software contributed to Berkeley by + * Edward Wang at The University of California, Berkeley. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. All advertising materials mentioning features or use of this software + * must display the following acknowledgement: + * This product includes software developed by the University of + * California, Berkeley and its contributors. + * 4. Neither the name of the University nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + */ + +#ifndef lint +static char sccsid[] = "@(#)wwiomux.c 8.1 (Berkeley) 6/6/93"; +#endif /* not lint */ + +#include "ww.h" +#include <sys/time.h> +#include <sys/types.h> +#if !defined(OLD_TTY) && !defined(TIOCPKT_DATA) +#include <sys/ioctl.h> +#endif +#include <fcntl.h> + +/* + * Multiple window output handler. + * The idea is to copy window outputs to the terminal, via the + * display package. We try to give wwcurwin highest priority. + * The only return conditions are when there is keyboard input + * and when a child process dies, which are serviced by signal + * catchers (wwrint() and wwchild()). + * When there's nothing to do, we sleep in a select(). + * This can be done better with interrupt driven io. But that's + * not supported on ptys, yet. + * The history of this routine is interesting. + */ +wwiomux() +{ + register struct ww *w; + fd_set imask; + register n; + register char *p; + char c; + struct timeval tv; + char noblock = 0; + + for (;;) { + if (wwinterrupt()) { + wwclrintr(); + return; + } + + FD_ZERO(&imask); + n = -1; + for (w = wwhead.ww_forw; w != &wwhead; w = w->ww_forw) { + if (w->ww_pty < 0) + continue; + if (w->ww_obq < w->ww_obe) { + if (w->ww_pty > n) + n = w->ww_pty; + FD_SET(w->ww_pty, &imask); + } + if (w->ww_obq > w->ww_obp && !w->ww_stopped) + noblock = 1; + } + + if (!noblock) { + if (wwcurwin != 0) + wwcurtowin(wwcurwin); + wwupdate(); + wwflush(); + (void) setjmp(wwjmpbuf); + wwsetjmp = 1; + if (wwinterrupt()) { + wwsetjmp = 0; + wwclrintr(); + return; + } + /* + * Defensive code. If somebody else (for example, + * wall) clears the ASYNC flag on us, we will block + * forever. So we need a finite timeout and set + * the flag again. Anything more clever will probably + * need even more system calls. (This is a bug + * in the kernel.) + * I don't like this one bit. + */ + (void) fcntl(0, F_SETFL, wwnewtty.ww_fflags); + tv.tv_sec = 30; + tv.tv_usec = 0; + } else { + tv.tv_sec = 0; + tv.tv_usec = 10000; + } + wwnselect++; + n = select(n + 1, &imask, (fd_set *)0, (fd_set *)0, &tv); + wwsetjmp = 0; + noblock = 0; + + if (n < 0) + wwnselecte++; + else if (n == 0) + wwnselectz++; + else + for (w = wwhead.ww_forw; w != &wwhead; w = w->ww_forw) { + if (w->ww_pty < 0 || + !FD_ISSET(w->ww_pty, &imask)) + continue; + wwnwread++; + p = w->ww_obq; + if (w->ww_ispty) { + if (p == w->ww_ob) { + w->ww_obp++; + w->ww_obq++; + } else + p--; + c = *p; + } + n = read(w->ww_pty, p, w->ww_obe - p); + if (n < 0) { + wwnwreade++; + (void) close(w->ww_pty); + w->ww_pty = -1; + } else if (n == 0) { + wwnwreadz++; + (void) close(w->ww_pty); + w->ww_pty = -1; + } else if (!w->ww_ispty) { + wwnwreadd++; + wwnwreadc += n; + w->ww_obq += n; + } else if (*p == TIOCPKT_DATA) { + n--; + wwnwreadd++; + wwnwreadc += n; + w->ww_obq += n; + } else { + wwnwreadp++; + if (*p & TIOCPKT_STOP) + w->ww_stopped = 1; + if (*p & TIOCPKT_START) + w->ww_stopped = 0; + if (*p & TIOCPKT_FLUSHWRITE) { + w->ww_stopped = 0; + w->ww_obq = w->ww_obp = + w->ww_ob; + } + } + if (w->ww_ispty) + *p = c; + } + /* + * Try the current window first, if there is output + * then process it and go back to the top to try again. + * This can lead to starvation of the other windows, + * but presumably that what we want. + * Update will eventually happen when output from wwcurwin + * dies down. + */ + if ((w = wwcurwin) != 0 && w->ww_pty >= 0 && + w->ww_obq > w->ww_obp && !w->ww_stopped) { + n = wwwrite(w, w->ww_obp, w->ww_obq - w->ww_obp); + if ((w->ww_obp += n) == w->ww_obq) + w->ww_obq = w->ww_obp = w->ww_ob; + noblock = 1; + continue; + } + for (w = wwhead.ww_forw; w != &wwhead; w = w->ww_forw) + if (w->ww_pty >= 0 && w->ww_obq > w->ww_obp && + !w->ww_stopped) { + n = wwwrite(w, w->ww_obp, + w->ww_obq - w->ww_obp); + if ((w->ww_obp += n) == w->ww_obq) + w->ww_obq = w->ww_obp = w->ww_ob; + if (wwinterrupt()) + break; + } + } +} diff --git a/usr.bin/window/wwlabel.c b/usr.bin/window/wwlabel.c new file mode 100644 index 0000000..d78e1f2 --- /dev/null +++ b/usr.bin/window/wwlabel.c @@ -0,0 +1,96 @@ +/* + * Copyright (c) 1983, 1993 + * The Regents of the University of California. All rights reserved. + * + * This code is derived from software contributed to Berkeley by + * Edward Wang at The University of California, Berkeley. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. All advertising materials mentioning features or use of this software + * must display the following acknowledgement: + * This product includes software developed by the University of + * California, Berkeley and its contributors. + * 4. Neither the name of the University nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + */ + +#ifndef lint +static char sccsid[] = "@(#)wwlabel.c 8.1 (Berkeley) 6/6/93"; +#endif /* not lint */ + +#include "ww.h" +#include "char.h" + +/* + * Label window w on f, + * at 1 line above w and 'where' columns from it's left edge. + * Gross, but it works. + */ +wwlabel(w, f, where, l, mode) +struct ww *w; +struct ww *f; +char *l; +{ + int row; + register j; + int jj; + register char *win; + register union ww_char *buf; + register union ww_char *ns; + register char *fmap; + register char *smap; + char touched; + char *p; + + if (f->ww_fmap == 0) + return; + + row = w->ww_w.t - 1; + if (row < f->ww_i.t || row >= f->ww_i.b) + return; + win = f->ww_win[row]; + buf = f->ww_buf[row]; + fmap = f->ww_fmap[row]; + ns = wwns[row]; + smap = wwsmap[row]; + touched = wwtouched[row]; + mode <<= WWC_MSHIFT; + + jj = MIN(w->ww_i.r, f->ww_i.r); + j = w->ww_i.l + where; + while (j < jj && *l) + for (p = unctrl(*l++); j < jj && *p; j++, p++) { + /* can't label if not already framed */ + if (win[j] & WWM_GLS) + continue; + if (smap[j] != f->ww_index) + buf[j].c_w = mode | *p; + else { + ns[j].c_w = (buf[j].c_w = mode | *p) + ^ win[j] << WWC_MSHIFT; + touched |= WWU_TOUCHED; + } + fmap[j] |= WWF_LABEL; + } + wwtouched[row] = touched; +} diff --git a/usr.bin/window/wwmisc.c b/usr.bin/window/wwmisc.c new file mode 100644 index 0000000..3fca477 --- /dev/null +++ b/usr.bin/window/wwmisc.c @@ -0,0 +1,67 @@ +/* + * Copyright (c) 1983, 1993 + * The Regents of the University of California. All rights reserved. + * + * This code is derived from software contributed to Berkeley by + * Edward Wang at The University of California, Berkeley. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. All advertising materials mentioning features or use of this software + * must display the following acknowledgement: + * This product includes software developed by the University of + * California, Berkeley and its contributors. + * 4. Neither the name of the University nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + */ + +#ifndef lint +static char sccsid[] = "@(#)wwmisc.c 8.1 (Berkeley) 6/6/93"; +#endif /* not lint */ + +#include "ww.h" +#include "tt.h" +#include "char.h" + +/* + * Sufficient but not necessary test for total visibility. + */ +wwvisible(w) +register struct ww *w; +{ + register i; + register nvis = 0; + + for (i = w->ww_i.t; i < w->ww_i.b; i++) + nvis += w->ww_nvis[i]; + if (w->ww_hascursor + && w->ww_cur.r >= w->ww_i.t && w->ww_cur.r < w->ww_i.b + && w->ww_cur.c >= w->ww_i.l && w->ww_cur.c < w->ww_i.r + && wwsmap[w->ww_cur.r][w->ww_cur.c] == w->ww_index) + nvis++; + return nvis == w->ww_i.nr * w->ww_i.nc; +} + +wwbell() +{ + ttputc(ctrl('g')); +} diff --git a/usr.bin/window/wwmove.c b/usr.bin/window/wwmove.c new file mode 100644 index 0000000..65440d1 --- /dev/null +++ b/usr.bin/window/wwmove.c @@ -0,0 +1,98 @@ +/* + * Copyright (c) 1983, 1993 + * The Regents of the University of California. All rights reserved. + * + * This code is derived from software contributed to Berkeley by + * Edward Wang at The University of California, Berkeley. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. All advertising materials mentioning features or use of this software + * must display the following acknowledgement: + * This product includes software developed by the University of + * California, Berkeley and its contributors. + * 4. Neither the name of the University nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + */ + +#ifndef lint +static char sccsid[] = "@(#)wwmove.c 8.1 (Berkeley) 6/6/93"; +#endif /* not lint */ + +#include "ww.h" + +/* + * Move a window. Should be unattached. + */ +wwmove(w, row, col) +register struct ww *w; +{ + register dr, dc; + register i; + + dr = row - w->ww_w.t; + dc = col - w->ww_w.l; + + w->ww_w.t += dr; + w->ww_w.b += dr; + w->ww_w.l += dc; + w->ww_w.r += dc; + + w->ww_b.t += dr; + w->ww_b.b += dr; + w->ww_b.l += dc; + w->ww_b.r += dc; + + w->ww_i.t = MAX(w->ww_w.t, 0); + w->ww_i.b = MIN(w->ww_w.b, wwnrow); + w->ww_i.nr = w->ww_i.b - w->ww_i.t; + w->ww_i.l = MAX(w->ww_w.l, 0); + w->ww_i.r = MIN(w->ww_w.r, wwncol); + w->ww_i.nc = w->ww_i.r - w->ww_i.l; + + w->ww_cur.r += dr; + w->ww_cur.c += dc; + + w->ww_win -= dr; + for (i = w->ww_w.t; i < w->ww_w.b; i++) + w->ww_win[i] -= dc; + if (w->ww_fmap != 0) { + w->ww_fmap -= dr; + for (i = w->ww_w.t; i < w->ww_w.b; i++) + w->ww_fmap[i] -= dc; + } + w->ww_nvis -= dr; + for (i = w->ww_i.t; i < w->ww_i.b; i++) { + register j = w->ww_i.l; + register char *win = &w->ww_win[i][j]; + register char *smap = &wwsmap[i][j]; + int nvis = 0; + + for (; j < w->ww_i.r; j++, win++, smap++) + if (*win == 0 && *smap == w->ww_index) + nvis++; + w->ww_nvis[i] = nvis; + } + w->ww_buf -= dr; + for (i = w->ww_b.t; i < w->ww_b.b; i++) + w->ww_buf[i] -= dc; +} diff --git a/usr.bin/window/wwopen.c b/usr.bin/window/wwopen.c new file mode 100644 index 0000000..c4fc96b --- /dev/null +++ b/usr.bin/window/wwopen.c @@ -0,0 +1,188 @@ +/* + * Copyright (c) 1983, 1993 + * The Regents of the University of California. All rights reserved. + * + * This code is derived from software contributed to Berkeley by + * Edward Wang at The University of California, Berkeley. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. All advertising materials mentioning features or use of this software + * must display the following acknowledgement: + * This product includes software developed by the University of + * California, Berkeley and its contributors. + * 4. Neither the name of the University nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + */ + +#ifndef lint +static char sccsid[] = "@(#)wwopen.c 8.1 (Berkeley) 6/6/93"; +#endif /* not lint */ + +#include "ww.h" +#include <sys/types.h> +#include <sys/socket.h> +#include <fcntl.h> + +struct ww * +wwopen(flags, nrow, ncol, row, col, nline) +{ + register struct ww *w; + register i, j; + char m; + short nvis; + + w = (struct ww *)calloc(sizeof (struct ww), 1); + if (w == 0) { + wwerrno = WWE_NOMEM; + goto bad; + } + w->ww_pty = -1; + w->ww_socket = -1; + + for (i = 0; i < NWW && wwindex[i] != 0; i++) + ; + if (i >= NWW) { + wwerrno = WWE_TOOMANY; + goto bad; + } + w->ww_index = i; + + if (nline < nrow) + nline = nrow; + + w->ww_w.t = row; + w->ww_w.b = row + nrow; + w->ww_w.l = col; + w->ww_w.r = col + ncol; + w->ww_w.nr = nrow; + w->ww_w.nc = ncol; + + w->ww_b.t = row; + w->ww_b.b = row + nline; + w->ww_b.l = col; + w->ww_b.r = col + ncol; + w->ww_b.nr = nline; + w->ww_b.nc = ncol; + + w->ww_i.t = MAX(w->ww_w.t, 0); + w->ww_i.b = MIN(w->ww_w.b, wwnrow); + w->ww_i.l = MAX(w->ww_w.l, 0); + w->ww_i.r = MIN(w->ww_w.r, wwncol); + w->ww_i.nr = w->ww_i.b - w->ww_i.t; + w->ww_i.nc = w->ww_i.r - w->ww_i.l; + + w->ww_cur.r = w->ww_w.t; + w->ww_cur.c = w->ww_w.l; + + if (flags & WWO_PTY) { + if (wwgetpty(w) < 0) + goto bad; + w->ww_ispty = 1; + } else if (flags & WWO_SOCKET) { + int d[2]; + if (socketpair(AF_UNIX, SOCK_STREAM, PF_UNSPEC, d) < 0) { + wwerrno = WWE_SYS; + goto bad; + } + (void) fcntl(d[0], F_SETFD, 1); + (void) fcntl(d[1], F_SETFD, 1); + w->ww_pty = d[0]; + w->ww_socket = d[1]; + } + if (flags & (WWO_PTY|WWO_SOCKET)) { + if ((w->ww_ob = malloc(512)) == 0) { + wwerrno = WWE_NOMEM; + goto bad; + } + w->ww_obe = w->ww_ob + 512; + w->ww_obp = w->ww_obq = w->ww_ob; + } + + w->ww_win = wwalloc(w->ww_w.t, w->ww_w.l, + w->ww_w.nr, w->ww_w.nc, sizeof (char)); + if (w->ww_win == 0) + goto bad; + m = 0; + if (flags & WWO_GLASS) + m |= WWM_GLS; + if (flags & WWO_REVERSE) + if (wwavailmodes & WWM_REV) + m |= WWM_REV; + else + flags &= ~WWO_REVERSE; + for (i = w->ww_w.t; i < w->ww_w.b; i++) + for (j = w->ww_w.l; j < w->ww_w.r; j++) + w->ww_win[i][j] = m; + + if (flags & WWO_FRAME) { + w->ww_fmap = wwalloc(w->ww_w.t, w->ww_w.l, + w->ww_w.nr, w->ww_w.nc, sizeof (char)); + if (w->ww_fmap == 0) + goto bad; + for (i = w->ww_w.t; i < w->ww_w.b; i++) + for (j = w->ww_w.l; j < w->ww_w.r; j++) + w->ww_fmap[i][j] = 0; + } + + w->ww_buf = (union ww_char **) + wwalloc(w->ww_b.t, w->ww_b.l, + w->ww_b.nr, w->ww_b.nc, sizeof (union ww_char)); + if (w->ww_buf == 0) + goto bad; + for (i = w->ww_b.t; i < w->ww_b.b; i++) + for (j = w->ww_b.l; j < w->ww_b.r; j++) + w->ww_buf[i][j].c_w = ' '; + + w->ww_nvis = (short *)malloc((unsigned) w->ww_w.nr * sizeof (short)); + if (w->ww_nvis == 0) { + wwerrno = WWE_NOMEM; + goto bad; + } + w->ww_nvis -= w->ww_w.t; + nvis = m ? 0 : w->ww_w.nc; + for (i = w->ww_w.t; i < w->ww_w.b; i++) + w->ww_nvis[i] = nvis; + + w->ww_state = WWS_INITIAL; + w->ww_oflags = flags; + return wwindex[w->ww_index] = w; +bad: + if (w != 0) { + if (w->ww_win != 0) + wwfree(w->ww_win, w->ww_w.t); + if (w->ww_fmap != 0) + wwfree(w->ww_fmap, w->ww_w.t); + if (w->ww_buf != 0) + wwfree((char **)w->ww_buf, w->ww_b.t); + if (w->ww_nvis != 0) + free((char *)(w->ww_nvis + w->ww_w.t)); + if (w->ww_ob != 0) + free(w->ww_ob); + if (w->ww_pty >= 0) + (void) close(w->ww_pty); + if (w->ww_socket >= 0) + (void) close(w->ww_socket); + free((char *)w); + } + return 0; +} diff --git a/usr.bin/window/wwprintf.c b/usr.bin/window/wwprintf.c new file mode 100644 index 0000000..8df9d13 --- /dev/null +++ b/usr.bin/window/wwprintf.c @@ -0,0 +1,57 @@ +/* + * Copyright (c) 1983, 1993 + * The Regents of the University of California. All rights reserved. + * + * This code is derived from software contributed to Berkeley by + * Edward Wang at The University of California, Berkeley. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. All advertising materials mentioning features or use of this software + * must display the following acknowledgement: + * This product includes software developed by the University of + * California, Berkeley and its contributors. + * 4. Neither the name of the University nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + */ + +#ifndef lint +static char sccsid[] = "@(#)wwprintf.c 8.1 (Berkeley) 6/6/93"; +#endif /* not lint */ + +#include "ww.h" +#include <varargs.h> + +/*VARARGS2*/ +wwprintf(w, fmt, va_alist) +struct ww *w; +char *fmt; +va_dcl +{ + char buf[1024]; + va_list ap; + + va_start(ap); + /* buffer can overflow */ + (void) wwwrite(w, buf, vsprintf(buf, fmt, ap)); + va_end(ap); +} diff --git a/usr.bin/window/wwpty.c b/usr.bin/window/wwpty.c new file mode 100644 index 0000000..1d82ff9 --- /dev/null +++ b/usr.bin/window/wwpty.c @@ -0,0 +1,87 @@ +/* + * Copyright (c) 1983, 1993 + * The Regents of the University of California. All rights reserved. + * + * This code is derived from software contributed to Berkeley by + * Edward Wang at The University of California, Berkeley. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. All advertising materials mentioning features or use of this software + * must display the following acknowledgement: + * This product includes software developed by the University of + * California, Berkeley and its contributors. + * 4. Neither the name of the University nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + */ + +#ifndef lint +static char sccsid[] = "@(#)wwpty.c 8.1 (Berkeley) 6/6/93"; +#endif /* not lint */ + +#include "ww.h" +#include <fcntl.h> +#if !defined(OLD_TTY) && !defined(TIOCPKT) +#include <sys/ioctl.h> +#endif + +wwgetpty(w) +register struct ww *w; +{ + register char c, *p; + int tty; + int on = 1; +#define PTY "/dev/XtyXX" +#define _PT 5 +#define _PQRS 8 +#define _0_9 9 + + (void) strcpy(w->ww_ttyname, PTY); + for (c = 'p'; c <= 'u'; c++) { + w->ww_ttyname[_PT] = 'p'; + w->ww_ttyname[_PQRS] = c; + w->ww_ttyname[_0_9] = '0'; + if (access(w->ww_ttyname, 0) < 0) + break; + for (p = "0123456789abcdef"; *p; p++) { + w->ww_ttyname[_PT] = 'p'; + w->ww_ttyname[_0_9] = *p; + if ((w->ww_pty = open(w->ww_ttyname, 2)) < 0) + continue; + w->ww_ttyname[_PT] = 't'; + if ((tty = open(w->ww_ttyname, 2)) < 0) { + (void) close(w->ww_pty); + continue; + } + (void) close(tty); + if (ioctl(w->ww_pty, TIOCPKT, (char *)&on) < 0) { + (void) close(w->ww_pty); + continue; + } + (void) fcntl(w->ww_pty, F_SETFD, 1); + return 0; + } + } + w->ww_pty = -1; + wwerrno = WWE_NOPTY; + return -1; +} diff --git a/usr.bin/window/wwputc.c b/usr.bin/window/wwputc.c new file mode 100644 index 0000000..af614b2 --- /dev/null +++ b/usr.bin/window/wwputc.c @@ -0,0 +1,48 @@ +/* + * Copyright (c) 1983, 1993 + * The Regents of the University of California. All rights reserved. + * + * This code is derived from software contributed to Berkeley by + * Edward Wang at The University of California, Berkeley. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. All advertising materials mentioning features or use of this software + * must display the following acknowledgement: + * This product includes software developed by the University of + * California, Berkeley and its contributors. + * 4. Neither the name of the University nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + */ + +#ifndef lint +static char sccsid[] = "@(#)wwputc.c 8.1 (Berkeley) 6/6/93"; +#endif /* not lint */ + +#include "ww.h" + +wwputc(c, w) +char c; +struct ww *w; +{ + (void) wwwrite(w, &c, sizeof c); +} diff --git a/usr.bin/window/wwputs.c b/usr.bin/window/wwputs.c new file mode 100644 index 0000000..2584da2 --- /dev/null +++ b/usr.bin/window/wwputs.c @@ -0,0 +1,52 @@ +/* + * Copyright (c) 1983, 1993 + * The Regents of the University of California. All rights reserved. + * + * This code is derived from software contributed to Berkeley by + * Edward Wang at The University of California, Berkeley. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. All advertising materials mentioning features or use of this software + * must display the following acknowledgement: + * This product includes software developed by the University of + * California, Berkeley and its contributors. + * 4. Neither the name of the University nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + */ + +#ifndef lint +static char sccsid[] = "@(#)wwputs.c 8.1 (Berkeley) 6/6/93"; +#endif /* not lint */ + +#include "ww.h" + +wwputs(s, w) +register char *s; +struct ww *w; +{ + register char *p = s; + + while (*p++) + ; + (void) wwwrite(w, s, p - s - 1); +} diff --git a/usr.bin/window/wwredraw.c b/usr.bin/window/wwredraw.c new file mode 100644 index 0000000..2a98012 --- /dev/null +++ b/usr.bin/window/wwredraw.c @@ -0,0 +1,56 @@ +/* + * Copyright (c) 1983, 1993 + * The Regents of the University of California. All rights reserved. + * + * This code is derived from software contributed to Berkeley by + * Edward Wang at The University of California, Berkeley. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. All advertising materials mentioning features or use of this software + * must display the following acknowledgement: + * This product includes software developed by the University of + * California, Berkeley and its contributors. + * 4. Neither the name of the University nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + */ + +#ifndef lint +static char sccsid[] = "@(#)wwredraw.c 8.1 (Berkeley) 6/6/93"; +#endif /* not lint */ + +#include "ww.h" +#include "tt.h" + +wwredraw() +{ + register i, j; + register union ww_char *os; + + xxclear(); + for (i = 0; i < wwnrow; i++) { + wwtouched[i] = WWU_TOUCHED; + os = wwos[i]; + for (j = wwncol; --j >= 0;) + (os++)->c_w = ' '; + } +} diff --git a/usr.bin/window/wwredrawwin.c b/usr.bin/window/wwredrawwin.c new file mode 100644 index 0000000..36590df --- /dev/null +++ b/usr.bin/window/wwredrawwin.c @@ -0,0 +1,73 @@ +/* + * Copyright (c) 1983, 1993 + * The Regents of the University of California. All rights reserved. + * + * This code is derived from software contributed to Berkeley by + * Edward Wang at The University of California, Berkeley. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. All advertising materials mentioning features or use of this software + * must display the following acknowledgement: + * This product includes software developed by the University of + * California, Berkeley and its contributors. + * 4. Neither the name of the University nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + */ + +#ifndef lint +static char sccsid[] = "@(#)wwredrawwin.c 8.1 (Berkeley) 6/6/93"; +#endif /* not lint */ + +#include "ww.h" + +wwredrawwin1(w, row1, row2, offset) +register struct ww *w; +int row1, row2, offset; +{ + int row; + register col; + register char *smap; + register union ww_char *buf; + register char *win; + register union ww_char *ns; + int x; + int nchanged; + + for (row = row1; row < row2; row++) { + col = w->ww_i.l; + ns = wwns[row]; + smap = &wwsmap[row][col]; + buf = w->ww_buf[row + offset]; + win = w->ww_win[row]; + nchanged = 0; + for (; col < w->ww_i.r; col++) + if (*smap++ == w->ww_index && + ns[col].c_w != + (x = buf[col].c_w ^ win[col] << WWC_MSHIFT)) { + nchanged++; + ns[col].c_w = x; + } + if (nchanged > 0) + wwtouched[row] |= WWU_TOUCHED; + } +} diff --git a/usr.bin/window/wwrint.c b/usr.bin/window/wwrint.c new file mode 100644 index 0000000..0cd0901 --- /dev/null +++ b/usr.bin/window/wwrint.c @@ -0,0 +1,91 @@ +/* + * Copyright (c) 1983, 1993 + * The Regents of the University of California. All rights reserved. + * + * This code is derived from software contributed to Berkeley by + * Edward Wang at The University of California, Berkeley. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. All advertising materials mentioning features or use of this software + * must display the following acknowledgement: + * This product includes software developed by the University of + * California, Berkeley and its contributors. + * 4. Neither the name of the University nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + */ + +#ifndef lint +static char sccsid[] = "@(#)wwrint.c 8.1 (Berkeley) 6/6/93"; +#endif /* not lint */ + +#include "ww.h" +#include "tt.h" +#if defined(OLD_TTY) || defined(VMIN_BUG) +#include <fcntl.h> +#endif + +/* + * Tty input interrupt handler. + * (1) Read input into buffer (wwib*). + * (2) Set the interrupt flag if anything is read. + * Currently, the last is used to get out of the blocking + * select() in wwiomux(). + * To avoid race conditions, we only modify wwibq in here, except + * when the buffer is empty; and everywhere else, we only change wwibp. + * It should be completely safe. + */ +void +wwrint() +{ + register n; + + if (wwibp == wwibq) + wwibp = wwibq = wwib; + wwnread++; +#if defined(OLD_TTY) || defined(VMIN_BUG) + /* we have set c_cc[VMIN] to 0 */ + (void) fcntl(0, F_SETFL, O_NONBLOCK|wwnewtty.ww_fflags); +#endif + n = read(0, wwibq, wwibe - wwibq); +#if defined(OLD_TTY) || defined(VMIN_BUG) + (void) fcntl(0, F_SETFL, wwnewtty.ww_fflags); +#endif + if (n > 0) { + if (tt.tt_rint) + n = (*tt.tt_rint)(wwibq, n); + if (n > 0) { + wwibq += n; + wwnreadc += n; + /* + * Hasten or delay the next checkpoint, + * as the case may be. + */ + if (tt.tt_checkpoint && !wwdocheckpoint) + (void) alarm(1); + wwsetintr(); + } + } else if (n == 0) + wwnreadz++; + else + wwnreade++; +} diff --git a/usr.bin/window/wwscroll.c b/usr.bin/window/wwscroll.c new file mode 100644 index 0000000..806e398 --- /dev/null +++ b/usr.bin/window/wwscroll.c @@ -0,0 +1,234 @@ +/* + * Copyright (c) 1983, 1993 + * The Regents of the University of California. All rights reserved. + * + * This code is derived from software contributed to Berkeley by + * Edward Wang at The University of California, Berkeley. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. All advertising materials mentioning features or use of this software + * must display the following acknowledgement: + * This product includes software developed by the University of + * California, Berkeley and its contributors. + * 4. Neither the name of the University nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + */ + +#ifndef lint +static char sccsid[] = "@(#)wwscroll.c 8.1 (Berkeley) 6/6/93"; +#endif /* not lint */ + +#include "ww.h" +#include "tt.h" + +wwscroll(w, n) +register struct ww *w; +int n; +{ + register dir; + register top; + + if (n == 0) + return; + dir = n < 0 ? -1 : 1; + top = w->ww_b.t - n; + if (top > w->ww_w.t) + top = w->ww_w.t; + else if (top + w->ww_b.nr < w->ww_w.b) + top = w->ww_w.b - w->ww_b.nr; + n = abs(top - w->ww_b.t); + if (n < w->ww_i.nr) { + while (--n >= 0) { + (void) wwscroll1(w, w->ww_i.t, w->ww_i.b, dir, 0); + w->ww_buf += dir; + w->ww_b.t -= dir; + w->ww_b.b -= dir; + } + } else { + w->ww_buf -= top - w->ww_b.t; + w->ww_b.t = top; + w->ww_b.b = top + w->ww_b.nr; + wwredrawwin(w); + } +} + +/* + * Scroll one line, between 'row1' and 'row2', in direction 'dir'. + * Don't adjust ww_scroll. + * And don't redraw 'leaveit' lines. + */ +wwscroll1(w, row1, row2, dir, leaveit) +register struct ww *w; +int row1, row2, dir; +int leaveit; +{ + register i; + int row1x, row2x; + int nvis; + int nvismax; + int scrolled = 0; + + /* + * See how many lines on the screen are affected. + * And calculate row1x, row2x, and left at the same time. + */ + for (i = row1; i < row2 && w->ww_nvis[i] == 0; i++) + ; + if (i >= row2) /* can't do any fancy stuff */ + goto out; + row1x = i; + for (i = row2 - 1; i >= row1 && w->ww_nvis[i] == 0; i--) + ; + if (i <= row1x) + goto out; /* just one line is easy */ + row2x = i + 1; + + /* + * See how much of this window is visible. + */ + nvismax = wwncol * (row2x - row1x); + nvis = 0; + for (i = row1x; i < row2x; i++) + nvis += w->ww_nvis[i]; + + /* + * If it's a good idea to scroll and the terminal can, then do it. + */ + if (nvis < nvismax / 2) + goto no_scroll; /* not worth it */ + if ((dir > 0 ? tt.tt_scroll_down == 0 : tt.tt_scroll_up == 0) || + (tt.tt_scroll_top != row1x || tt.tt_scroll_bot != row2x - 1) && + tt.tt_setscroll == 0) + if (tt.tt_delline == 0 || tt.tt_insline == 0) + goto no_scroll; + xxscroll(dir, row1x, row2x); + scrolled = 1; + /* + * Fix up the old screen. + */ + { + register union ww_char *tmp; + register union ww_char **cpp, **cqq; + + if (dir > 0) { + cpp = &wwos[row1x]; + cqq = cpp + 1; + tmp = *cpp; + for (i = row2x - row1x; --i > 0;) + *cpp++ = *cqq++; + *cpp = tmp; + } else { + cpp = &wwos[row2x]; + cqq = cpp - 1; + tmp = *cqq; + for (i = row2x - row1x; --i > 0;) + *--cpp = *--cqq; + *cqq = tmp; + } + for (i = wwncol; --i >= 0;) + tmp++->c_w = ' '; + } + +no_scroll: + /* + * Fix the new screen. + */ + if (nvis == nvismax) { + /* + * Can shift whole lines. + */ + if (dir > 0) { + { + register union ww_char *tmp; + register union ww_char **cpp, **cqq; + + cpp = &wwns[row1x]; + cqq = cpp + 1; + tmp = *cpp; + for (i = row2x - row1x; --i > 0;) + *cpp++ = *cqq++; + *cpp = tmp; + } + if (scrolled) { + register char *p, *q; + + p = &wwtouched[row1x]; + q = p + 1; + for (i = row2x - row1x; --i > 0;) + *p++ = *q++; + *p |= WWU_TOUCHED; + } else { + register char *p; + + p = &wwtouched[row1x]; + for (i = row2x - row1x; --i >= 0;) + *p++ |= WWU_TOUCHED; + } + wwredrawwin1(w, row1, row1x, dir); + wwredrawwin1(w, row2x - 1, row2 - leaveit, dir); + } else { + { + register union ww_char *tmp; + register union ww_char **cpp, **cqq; + + cpp = &wwns[row2x]; + cqq = cpp - 1; + tmp = *cqq; + for (i = row2x - row1x; --i > 0;) + *--cpp = *--cqq; + *cqq = tmp; + } + if (scrolled) { + register char *p, *q; + + p = &wwtouched[row2x]; + q = p - 1; + for (i = row2x - row1x; --i > 0;) + *--p = *--q; + *q |= WWU_TOUCHED; + } else { + register char *p; + + p = &wwtouched[row1x]; + for (i = row2x - row1x; --i >= 0;) + *p++ |= WWU_TOUCHED; + } + wwredrawwin1(w, row1 + leaveit, row1x + 1, dir); + wwredrawwin1(w, row2x, row2, dir); + } + } else { + if (scrolled) { + register char *p; + + p = &wwtouched[row1x]; + for (i = row2x - row1x; --i >= 0;) + *p++ |= WWU_TOUCHED; + } +out: + if (dir > 0) + wwredrawwin1(w, row1, row2 - leaveit, dir); + else + wwredrawwin1(w, row1 + leaveit, row2, dir); + } + return scrolled; +} diff --git a/usr.bin/window/wwsize.c b/usr.bin/window/wwsize.c new file mode 100644 index 0000000..7dee857 --- /dev/null +++ b/usr.bin/window/wwsize.c @@ -0,0 +1,191 @@ +/* + * Copyright (c) 1983, 1993 + * The Regents of the University of California. All rights reserved. + * + * This code is derived from software contributed to Berkeley by + * Edward Wang at The University of California, Berkeley. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. All advertising materials mentioning features or use of this software + * must display the following acknowledgement: + * This product includes software developed by the University of + * California, Berkeley and its contributors. + * 4. Neither the name of the University nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + */ + +#ifndef lint +static char sccsid[] = "@(#)wwsize.c 8.1 (Berkeley) 6/6/93"; +#endif /* not lint */ + +#include "ww.h" + +/* + * Resize a window. Should be unattached. + */ +wwsize(w, nrow, ncol) +register struct ww *w; +{ + register i, j; + int nline; + union ww_char **buf = 0; + char **win = 0; + short *nvis = 0; + char **fmap = 0; + char m; + + /* + * First allocate new buffers. + */ + win = wwalloc(w->ww_w.t, w->ww_w.l, nrow, ncol, sizeof (char)); + if (win == 0) + goto bad; + if (w->ww_fmap != 0) { + fmap = wwalloc(w->ww_w.t, w->ww_w.l, nrow, ncol, sizeof (char)); + if (fmap == 0) + goto bad; + } + if (nrow > w->ww_b.nr || ncol > w->ww_b.nc) { + nline = MAX(w->ww_b.nr, nrow); + buf = (union ww_char **) wwalloc(w->ww_b.t, w->ww_b.l, + nline, ncol, sizeof (union ww_char)); + if (buf == 0) + goto bad; + } + nvis = (short *)malloc((unsigned) nrow * sizeof (short)); + if (nvis == 0) { + wwerrno = WWE_NOMEM; + goto bad; + } + nvis -= w->ww_w.t; + /* + * Copy text buffer. + */ + if (buf != 0) { + int b, r; + + b = w->ww_b.t + nline; + r = w->ww_b.l + ncol; + if (ncol < w->ww_b.nc) + for (i = w->ww_b.t; i < w->ww_b.b; i++) + for (j = w->ww_b.l; j < r; j++) + buf[i][j] = w->ww_buf[i][j]; + else + for (i = w->ww_b.t; i < w->ww_b.b; i++) { + for (j = w->ww_b.l; j < w->ww_b.r; j++) + buf[i][j] = w->ww_buf[i][j]; + for (; j < r; j++) + buf[i][j].c_w = ' '; + } + for (; i < b; i++) + for (j = w->ww_b.l; j < r; j++) + buf[i][j].c_w = ' '; + } + /* + * Now free the old stuff. + */ + wwfree((char **)w->ww_win, w->ww_w.t); + w->ww_win = win; + if (buf != 0) { + wwfree((char **)w->ww_buf, w->ww_b.t); + w->ww_buf = buf; + } + if (w->ww_fmap != 0) { + wwfree((char **)w->ww_fmap, w->ww_w.t); + w->ww_fmap = fmap; + } + free((char *)(w->ww_nvis + w->ww_w.t)); + w->ww_nvis = nvis; + /* + * Set new sizes. + */ + /* window */ + w->ww_w.b = w->ww_w.t + nrow; + w->ww_w.r = w->ww_w.l + ncol; + w->ww_w.nr = nrow; + w->ww_w.nc = ncol; + /* text buffer */ + if (buf != 0) { + w->ww_b.b = w->ww_b.t + nline; + w->ww_b.r = w->ww_b.l + ncol; + w->ww_b.nr = nline; + w->ww_b.nc = ncol; + } + /* scroll */ + if ((i = w->ww_b.b - w->ww_w.b) < 0 || + (i = w->ww_cur.r - w->ww_w.b + 1) > 0) { + w->ww_buf += i; + w->ww_b.t -= i; + w->ww_b.b -= i; + w->ww_cur.r -= i; + } + /* interior */ + w->ww_i.b = MIN(w->ww_w.b, wwnrow); + w->ww_i.r = MIN(w->ww_w.r, wwncol); + w->ww_i.nr = w->ww_i.b - w->ww_i.t; + w->ww_i.nc = w->ww_i.r - w->ww_i.l; + /* + * Initialize new buffers. + */ + /* window */ + m = 0; + if (w->ww_oflags & WWO_GLASS) + m |= WWM_GLS; + if (w->ww_oflags & WWO_REVERSE) + m |= WWM_REV; + for (i = w->ww_w.t; i < w->ww_w.b; i++) + for (j = w->ww_w.l; j < w->ww_w.r; j++) + w->ww_win[i][j] = m; + /* frame map */ + if (fmap != 0) + for (i = w->ww_w.t; i < w->ww_w.b; i++) + for (j = w->ww_w.l; j < w->ww_w.r; j++) + w->ww_fmap[i][j] = 0; + /* visibility */ + j = m ? 0 : w->ww_w.nc; + for (i = w->ww_w.t; i < w->ww_w.b; i++) + w->ww_nvis[i] = j; + /* + * Put cursor back. + */ + if (w->ww_hascursor) { + w->ww_hascursor = 0; + wwcursor(w, 1); + } + /* + * Fool with pty. + */ + if (w->ww_ispty && w->ww_pty >= 0) + (void) wwsetttysize(w->ww_pty, nrow, ncol); + return 0; +bad: + if (win != 0) + wwfree(win, w->ww_w.t); + if (fmap != 0) + wwfree(fmap, w->ww_w.t); + if (buf != 0) + wwfree((char **)buf, w->ww_b.t); + if (nvis != 0) + free((char *)(nvis + w->ww_w.t)); + return -1; +} diff --git a/usr.bin/window/wwspawn.c b/usr.bin/window/wwspawn.c new file mode 100644 index 0000000..7c3c12b --- /dev/null +++ b/usr.bin/window/wwspawn.c @@ -0,0 +1,85 @@ +/* + * Copyright (c) 1983, 1993 + * The Regents of the University of California. All rights reserved. + * + * This code is derived from software contributed to Berkeley by + * Edward Wang at The University of California, Berkeley. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. All advertising materials mentioning features or use of this software + * must display the following acknowledgement: + * This product includes software developed by the University of + * California, Berkeley and its contributors. + * 4. Neither the name of the University nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + */ + +#ifndef lint +static char sccsid[] = "@(#)wwspawn.c 8.1 (Berkeley) 6/6/93"; +#endif /* not lint */ + +#include "ww.h" +#include <sys/signal.h> + +/* + * There is a dead lock with vfork and closing of pseudo-ports. + * So we have to be sneaky about error reporting. + */ +wwspawn(wp, file, argv) +register struct ww *wp; +char *file; +char **argv; +{ + int pid; + int ret; + char erred = 0; + int s; + + s = sigblock(sigmask(SIGCHLD)); + switch (pid = vfork()) { + case -1: + wwerrno = WWE_SYS; + ret = -1; + break; + case 0: + if (wwenviron(wp) >= 0) + execvp(file, argv); + erred = 1; + _exit(1); + default: + if (erred) { + wwerrno = WWE_SYS; + ret = -1; + } else { + wp->ww_pid = pid; + wp->ww_state = WWS_HASPROC; + ret = pid; + } + } + (void) sigsetmask(s); + if (wp->ww_socket >= 0) { + (void) close(wp->ww_socket); + wp->ww_socket = -1; + } + return ret; +} diff --git a/usr.bin/window/wwsuspend.c b/usr.bin/window/wwsuspend.c new file mode 100644 index 0000000..a67a130 --- /dev/null +++ b/usr.bin/window/wwsuspend.c @@ -0,0 +1,56 @@ +/* + * Copyright (c) 1983, 1993 + * The Regents of the University of California. All rights reserved. + * + * This code is derived from software contributed to Berkeley by + * Edward Wang at The University of California, Berkeley. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. All advertising materials mentioning features or use of this software + * must display the following acknowledgement: + * This product includes software developed by the University of + * California, Berkeley and its contributors. + * 4. Neither the name of the University nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + */ + +#ifndef lint +static char sccsid[] = "@(#)wwsuspend.c 8.1 (Berkeley) 6/6/93"; +#endif /* not lint */ + +#include "ww.h" +#include "tt.h" +#include <sys/signal.h> + +wwsuspend() +{ + sig_t oldsig; + + oldsig = signal(SIGTSTP, SIG_IGN); + wwend(0); + (void) signal(SIGTSTP, SIG_DFL); + (void) kill(0, SIGTSTP); + (void) signal(SIGTSTP, SIG_IGN); + wwstart(); + (void) signal(SIGTSTP, oldsig); +} diff --git a/usr.bin/window/wwterminfo.c b/usr.bin/window/wwterminfo.c new file mode 100644 index 0000000..8039b1e --- /dev/null +++ b/usr.bin/window/wwterminfo.c @@ -0,0 +1,107 @@ +/* + * Copyright (c) 1982, 1993 + * The Regents of the University of California. All rights reserved. + * + * This code is derived from software contributed to Berkeley by + * Edward Wang at The University of California, Berkeley. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. All advertising materials mentioning features or use of this software + * must display the following acknowledgement: + * This product includes software developed by the University of + * California, Berkeley and its contributors. + * 4. Neither the name of the University nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + */ + +#ifndef lint +static char sccsid[] = "@(#)wwterminfo.c 8.1 (Berkeley) 6/6/93"; +#endif /* not lint */ + +#ifdef TERMINFO + +#include "ww.h" +#include <stdio.h> +#include <paths.h> +#include "local.h" + +/* + * Terminfo support + * + * Written by Brian Buhrow + * + * Subsequently modified by Edward Wang + */ + +/* + * Initialize the working terminfo directory + */ +wwterminfoinit() +{ + FILE *fp; + char buf[2048]; + + /* make the directory */ + (void) sprintf(wwterminfopath, "%swwinXXXXXX", _PATH_TMP); + mktemp(wwterminfopath); + if (mkdir(wwterminfopath, 0755) < 0 || + chmod(wwterminfopath, 00755) < 0) { + wwerrno = WWE_SYS; + return -1; + } + (void) setenv("TERMINFO", wwterminfopath, 1); + /* make a termcap entry and turn it into terminfo */ + (void) sprintf(buf, "%s/cap", wwterminfopath); + if ((fp = fopen(buf, "w")) == NULL) { + wwerrno = WWE_SYS; + return -1; + } + (void) fprintf(fp, "%sco#%d:li#%d:%s\n", + WWT_TERMCAP, wwncol, wwnrow, wwwintermcap); + (void) fclose(fp); + (void) sprintf(buf, + "cd %s; %s cap >info 2>/dev/null; %s info >/dev/null 2>&1", + wwterminfopath, _PATH_CAPTOINFO, _PATH_TIC); + (void) system(buf); + return 0; +} + +/* + * Delete the working terminfo directory at shutdown + */ +wwterminfoend() +{ + + switch (vfork()) { + case -1: + /* can't really do (or say) anything about errors */ + return -1; + case 0: + execl(_PATH_RM, _PATH_RM, "-rf", wwterminfopath, 0); + return -1; + default: + return 0; + } +} + +#endif /* TERMINFO */ diff --git a/usr.bin/window/wwtty.c b/usr.bin/window/wwtty.c new file mode 100644 index 0000000..2440389 --- /dev/null +++ b/usr.bin/window/wwtty.c @@ -0,0 +1,180 @@ +/* + * Copyright (c) 1983, 1993 + * The Regents of the University of California. All rights reserved. + * + * This code is derived from software contributed to Berkeley by + * Edward Wang at The University of California, Berkeley. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. All advertising materials mentioning features or use of this software + * must display the following acknowledgement: + * This product includes software developed by the University of + * California, Berkeley and its contributors. + * 4. Neither the name of the University nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + */ + +#ifndef lint +static char sccsid[] = "@(#)wwtty.c 8.1 (Berkeley) 6/6/93"; +#endif /* not lint */ + +#include "ww.h" +#include <sys/types.h> +#include <fcntl.h> +#if !defined(OLD_TTY) && !defined(TIOCGWINSZ) +#include <sys/ioctl.h> +#endif + +wwgettty(d, t) +register struct ww_tty *t; +{ +#ifdef OLD_TTY + if (ioctl(d, TIOCGETP, (char *)&t->ww_sgttyb) < 0) + goto bad; + if (ioctl(d, TIOCGETC, (char *)&t->ww_tchars) < 0) + goto bad; + if (ioctl(d, TIOCGLTC, (char *)&t->ww_ltchars) < 0) + goto bad; + if (ioctl(d, TIOCLGET, (char *)&t->ww_lmode) < 0) + goto bad; + if (ioctl(d, TIOCGETD, (char *)&t->ww_ldisc) < 0) + goto bad; +#else + if (tcgetattr(d, &t->ww_termios) < 0) + goto bad; +#endif + if ((t->ww_fflags = fcntl(d, F_GETFL, 0)) < 0) + goto bad; + return 0; +bad: + wwerrno = WWE_SYS; + return -1; +} + +/* + * Set the modes of tty 'd' to 't' + * 'o' is the current modes. We set the line discipline only if + * it changes, to avoid unnecessary flushing of typeahead. + */ +wwsettty(d, t) +register struct ww_tty *t; +{ +#ifdef OLD_TTY + int i; + + /* XXX, for buggy tty drivers that don't wait for output to drain */ + while (ioctl(d, TIOCOUTQ, &i) >= 0 && i > 0) + usleep(100000); + if (ioctl(d, TIOCSETN, (char *)&t->ww_sgttyb) < 0) + goto bad; + if (ioctl(d, TIOCSETC, (char *)&t->ww_tchars) < 0) + goto bad; + if (ioctl(d, TIOCSLTC, (char *)&t->ww_ltchars) < 0) + goto bad; + if (ioctl(d, TIOCLSET, (char *)&t->ww_lmode) < 0) + goto bad; + if (ioctl(d, TIOCGETD, (char *)&i) < 0) + goto bad; + if (t->ww_ldisc != i && + ioctl(d, TIOCSETD, (char *)&t->ww_ldisc) < 0) + goto bad; +#else +#ifdef sun + /* XXX, for buggy tty drivers that don't wait for output to drain */ + (void) tcdrain(d); +#endif + if (tcsetattr(d, TCSADRAIN, &t->ww_termios) < 0) + goto bad; +#endif + if (fcntl(d, F_SETFL, t->ww_fflags) < 0) + goto bad; + return 0; +bad: + wwerrno = WWE_SYS; + return -1; +} + +/* + * The ttysize and stop-start routines must also work + * on the control side of pseudoterminals. + */ + +wwgetttysize(d, r, c) + int *r, *c; +{ + struct winsize winsize; + + if (ioctl(d, TIOCGWINSZ, (char *)&winsize) < 0) { + wwerrno = WWE_SYS; + return -1; + } + if (winsize.ws_row != 0) + *r = winsize.ws_row; + if (winsize.ws_col != 0) + *c = winsize.ws_col; + return 0; +} + +wwsetttysize(d, r, c) +{ + struct winsize winsize; + + winsize.ws_row = r; + winsize.ws_col = c; + winsize.ws_xpixel = winsize.ws_ypixel = 0; + if (ioctl(d, TIOCSWINSZ, (char *)&winsize) < 0) { + wwerrno = WWE_SYS; + return -1; + } + return 0; +} + +wwstoptty(d) +{ +#if !defined(OLD_TTY) && defined(TCOOFF) + /* not guaranteed to work on the pty side */ + if (tcflow(d, TCOOFF) < 0) +#else + if (ioctl(d, TIOCSTOP, (char *)0) < 0) +#endif + { + wwerrno = WWE_SYS; + return -1; + } + return 0; +} + +wwstarttty(d) +{ +#if !defined(OLD_TTY) && defined(TCOON) + /* not guaranteed to work on the pty side */ + if (tcflow(d, TCOON) < 0) +#else + if (ioctl(d, TIOCSTART, (char *)0) < 0) +#endif + { + wwerrno = WWE_SYS; + return -1; + } + return 0; +} diff --git a/usr.bin/window/wwunframe.c b/usr.bin/window/wwunframe.c new file mode 100644 index 0000000..6945ffa --- /dev/null +++ b/usr.bin/window/wwunframe.c @@ -0,0 +1,76 @@ +/* + * Copyright (c) 1983, 1993 + * The Regents of the University of California. All rights reserved. + * + * This code is derived from software contributed to Berkeley by + * Edward Wang at The University of California, Berkeley. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. All advertising materials mentioning features or use of this software + * must display the following acknowledgement: + * This product includes software developed by the University of + * California, Berkeley and its contributors. + * 4. Neither the name of the University nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + */ + +#ifndef lint +static char sccsid[] = "@(#)wwunframe.c 8.1 (Berkeley) 6/6/93"; +#endif /* not lint */ + +#include "ww.h" + +wwunframe(w) +register struct ww *w; +{ + int i; + + for (i = w->ww_i.t; i < w->ww_i.b; i++) { + register j; + register char *win = w->ww_win[i]; + register char *fmap = w->ww_fmap ? w->ww_fmap[i] : 0; + register char *smap = wwsmap[i]; + register union ww_char *ns = wwns[i]; + int nchanged = 0; + + for (j = w->ww_i.l; j < w->ww_i.r; j++) { + if (win[j] & WWM_GLS) + continue; + win[j] |= WWM_GLS; + if (fmap != 0) + fmap[j] = 0; + if (smap[j] == w->ww_index) { + smap[j] = WWX_NOBODY; + ns[j].c_w = ' '; + nchanged++; + } + } + if (nchanged > 0) + wwtouched[i] |= WWU_TOUCHED; + w->ww_nvis[i] = 0; + } + + if (w->ww_forw != &wwhead) + wwdelete1(w->ww_forw, + w->ww_i.t, w->ww_i.b, w->ww_i.l, w->ww_i.r); +} diff --git a/usr.bin/window/wwupdate.c b/usr.bin/window/wwupdate.c new file mode 100644 index 0000000..f13453d --- /dev/null +++ b/usr.bin/window/wwupdate.c @@ -0,0 +1,271 @@ +/* + * Copyright (c) 1983, 1993 + * The Regents of the University of California. All rights reserved. + * + * This code is derived from software contributed to Berkeley by + * Edward Wang at The University of California, Berkeley. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. All advertising materials mentioning features or use of this software + * must display the following acknowledgement: + * This product includes software developed by the University of + * California, Berkeley and its contributors. + * 4. Neither the name of the University nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + */ + +#ifndef lint +static char sccsid[] = "@(#)wwupdate.c 8.1 (Berkeley) 6/6/93"; +#endif /* not lint */ + +#include "ww.h" +#include "tt.h" + +wwupdate1(top, bot) +{ + int i; + register j; + char *touched; + struct ww_update *upd; + char check_clreos = 0; + int scan_top, scan_bot; + + wwnupdate++; + { + register char *t1 = wwtouched + top, *t2 = wwtouched + bot; + register n; + + while (!*t1++) + if (t1 == t2) + return; + while (!*--t2) + ; + scan_top = top = t1 - wwtouched - 1; + scan_bot = bot = t2 - wwtouched + 1; + if (scan_bot - scan_top > 1 && + (tt.tt_clreos != 0 || tt.tt_clear != 0)) { + int st = tt.tt_clreos != 0 ? scan_top : 0; + + /* + * t1 is one past the first touched row, + * t2 is on the last touched row. + */ + for (t1--, n = 1; t1 < t2;) + if (*t1++) + n++; + /* + * If we can't clreos then we try for clearing + * the whole screen. + */ + if (check_clreos = n * 10 > (wwnrow - st) * 9) { + scan_top = st; + scan_bot = wwnrow; + } + } + } + if (tt.tt_clreol == 0 && !check_clreos) + goto simple; + for (i = scan_top, touched = &wwtouched[i], upd = &wwupd[i]; + i < scan_bot; + i++, touched++, upd++) { + register gain = 0; + register best_gain = 0; + register best_col; + register union ww_char *ns, *os; + + if (wwinterrupt()) + return; + if (!check_clreos && !*touched) + continue; + wwnupdscan++; + j = wwncol; + ns = &wwns[i][j]; + os = &wwos[i][j]; + while (--j >= 0) { + /* + * The cost of clearing is: + * ncol - nblank + X + * The cost of straight update is, more or less: + * ncol - nsame + * We clear if nblank - nsame > X + * X is the clreol overhead. + * So we make gain = nblank - nsame. + */ + if ((--ns)->c_w == (--os)->c_w) + gain--; + else + best_gain--; + if (ns->c_w == ' ') + gain++; + if (gain > best_gain) { + best_col = j; + best_gain = gain; + } + } + upd->best_gain = best_gain; + upd->best_col = best_col; + upd->gain = gain; + } + if (check_clreos) { + register struct ww_update *u; + register gain = 0; + register best_gain = 0; + int best_row; + register simple_gain = 0; + char didit = 0; + + /* + * gain is the advantage of clearing all the lines. + * best_gain is the advantage of clearing to eos + * at best_row and u->best_col. + * simple_gain is the advantage of using only clreol. + * We use g > best_gain because u->best_col can be + * undefined when u->best_gain is 0 so we can't use it. + */ + for (j = scan_bot - 1, u = wwupd + j; j >= top; j--, u--) { + register g = gain + u->best_gain; + + if (g > best_gain) { + best_gain = g; + best_row = j; + } + gain += u->gain; + if (tt.tt_clreol != 0 && u->best_gain > 4) + simple_gain += u->best_gain - 4; + } + if (tt.tt_clreos == 0) { + if (gain > simple_gain && gain > 4) { + xxclear(); + i = top = scan_top; + bot = scan_bot; + j = 0; + didit = 1; + } + } else + if (best_gain > simple_gain && best_gain > 4) { + i = best_row; + xxclreos(i, j = wwupd[i].best_col); + bot = scan_bot; + didit = 1; + } + if (didit) { + wwnupdclreos++; + wwnupdclreosline += wwnrow - i; + u = wwupd + i; + while (i < scan_bot) { + register union ww_char *os = &wwos[i][j]; + + for (j = wwncol - j; --j >= 0;) + os++->c_w = ' '; + wwtouched[i++] |= WWU_TOUCHED; + u++->best_gain = 0; + j = 0; + } + } else + wwnupdclreosmiss++; + } +simple: + for (i = top, touched = &wwtouched[i], upd = &wwupd[i]; i < bot; + i++, touched++, upd++) { + register union ww_char *os, *ns; + char didit; + + if (!*touched) + continue; + *touched = 0; + wwnupdline++; + didit = 0; + if (tt.tt_clreol != 0 && upd->best_gain > 4) { + wwnupdclreol++; + xxclreol(i, j = upd->best_col); + for (os = &wwos[i][j], j = wwncol - j; --j >= 0;) + os++->c_w = ' '; + didit = 1; + } + ns = wwns[i]; + os = wwos[i]; + for (j = 0; j < wwncol;) { + register char *p, *q; + char m; + int c; + register n; + char buf[512]; /* > wwncol */ + union ww_char lastc; + + for (; j++ < wwncol && ns++->c_w == os++->c_w;) + ; + if (j > wwncol) + break; + p = buf; + m = ns[-1].c_m; + c = j - 1; + os[-1] = ns[-1]; + *p++ = ns[-1].c_c; + n = 5; + q = p; + while (j < wwncol && ns->c_m == m) { + *p++ = ns->c_c; + if (ns->c_w == os->c_w) { + if (--n <= 0) + break; + os++; + ns++; + } else { + n = 5; + q = p; + lastc = *os; + *os++ = *ns++; + } + j++; + } + n = q - buf; + if (!wwwrap || i != wwnrow - 1 || c + n != wwncol) + xxwrite(i, c, buf, n, m); + else if (tt.tt_inschar || tt.tt_insspace) { + if (n > 1) { + q[-2] = q[-1]; + n--; + } else + c--; + xxwrite(i, c, buf, n, m); + c += n - 1; + if (tt.tt_inschar) + xxinschar(i, c, ns[-2].c_c, + ns[-2].c_m); + else { + xxinsspace(i, c); + xxwrite(i, c, &ns[-2].c_c, 1, + ns[-2].c_m); + } + } else { + if (--n) + xxwrite(i, c, buf, n, m); + os[-1] = lastc; + *touched = WWU_TOUCHED; + } + didit = 1; + } + if (!didit) + wwnupdmiss++; + } +} diff --git a/usr.bin/window/wwwrite.c b/usr.bin/window/wwwrite.c new file mode 100644 index 0000000..d406cbc --- /dev/null +++ b/usr.bin/window/wwwrite.c @@ -0,0 +1,298 @@ +/* + * Copyright (c) 1983, 1993 + * The Regents of the University of California. All rights reserved. + * + * This code is derived from software contributed to Berkeley by + * Edward Wang at The University of California, Berkeley. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. All advertising materials mentioning features or use of this software + * must display the following acknowledgement: + * This product includes software developed by the University of + * California, Berkeley and its contributors. + * 4. Neither the name of the University nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + */ + +#ifndef lint +static char sccsid[] = "@(#)wwwrite.c 8.1 (Berkeley) 6/6/93"; +#endif /* not lint */ + +#include "ww.h" +#include "tt.h" +#include "char.h" + +#define UPDATE() \ + if (!w->ww_noupdate && w->ww_cur.r >= 0 && w->ww_cur.r < wwnrow && \ + wwtouched[w->ww_cur.r]) \ + wwupdate1(w->ww_cur.r, w->ww_cur.r + 1) + +/* + * To support control character expansion, we save the old + * p and q values in r and s, and point p at the beginning + * of the expanded string, and q at some safe place beyond it + * (p + 10). At strategic points in the loops, we check + * for (r && !*p) and restore the saved values back into + * p and q. Essentially, we implement a stack of depth 2, + * to avoid recursion, which might be a better idea. + */ +wwwrite(w, p, n) +register struct ww *w; +register char *p; +int n; +{ + char hascursor; + char *savep = p; + char *q = p + n; + char *r = 0; + char *s; + +#ifdef lint + s = 0; /* define it before possible use */ +#endif + if (hascursor = w->ww_hascursor) + wwcursor(w, 0); + while (p < q && !w->ww_stopped && (!wwinterrupt() || w->ww_nointr)) { + if (r && !*p) { + p = r; + q = s; + r = 0; + continue; + } + if (w->ww_wstate == 0 && + (isprt(*p) || w->ww_unctrl && isunctrl(*p))) { + register i; + register union ww_char *bp; + int col, col1; + + if (w->ww_insert) { /* this is very slow */ + if (*p == '\t') { + p++; + w->ww_cur.c += 8 - + (w->ww_cur.c - w->ww_w.l & 7); + goto chklf; + } + if (!isprt(*p)) { + r = p + 1; + s = q; + p = unctrl(*p); + q = p + 10; + } + wwinschar(w, w->ww_cur.r, w->ww_cur.c, + *p++, w->ww_modes); + goto right; + } + + bp = &w->ww_buf[w->ww_cur.r][w->ww_cur.c]; + i = w->ww_cur.c; + while (i < w->ww_w.r && p < q) + if (!*p && r) { + p = r; + q = s; + r = 0; + } else if (*p == '\t') { + register tmp = 8 - (i - w->ww_w.l & 7); + p++; + i += tmp; + bp += tmp; + } else if (isprt(*p)) { + bp++->c_w = *p++ + | w->ww_modes << WWC_MSHIFT; + i++; + } else if (w->ww_unctrl && isunctrl(*p)) { + r = p + 1; + s = q; + p = unctrl(*p); + q = p + 10; + } else + break; + col = MAX(w->ww_cur.c, w->ww_i.l); + col1 = MIN(i, w->ww_i.r); + w->ww_cur.c = i; + if (w->ww_cur.r >= w->ww_i.t + && w->ww_cur.r < w->ww_i.b) { + register union ww_char *ns = wwns[w->ww_cur.r]; + register char *smap = &wwsmap[w->ww_cur.r][col]; + register char *win = w->ww_win[w->ww_cur.r]; + int nchanged = 0; + + bp = w->ww_buf[w->ww_cur.r]; + for (i = col; i < col1; i++) + if (*smap++ == w->ww_index) { + nchanged++; + ns[i].c_w = bp[i].c_w + ^ win[i] << WWC_MSHIFT; + } + if (nchanged > 0) + wwtouched[w->ww_cur.r] |= WWU_TOUCHED; + } + chklf: + if (w->ww_cur.c >= w->ww_w.r) + goto crlf; + } else switch (w->ww_wstate) { + case 0: + switch (*p++) { + case '\n': + if (w->ww_mapnl) + crlf: + w->ww_cur.c = w->ww_w.l; + lf: + UPDATE(); + if (++w->ww_cur.r >= w->ww_w.b) { + w->ww_cur.r = w->ww_w.b - 1; + if (w->ww_w.b < w->ww_b.b) { + (void) wwscroll1(w, w->ww_i.t, + w->ww_i.b, 1, 0); + w->ww_buf++; + w->ww_b.t--; + w->ww_b.b--; + } else + wwdelline(w, w->ww_b.t); + } + break; + case '\b': + if (--w->ww_cur.c < w->ww_w.l) { + w->ww_cur.c = w->ww_w.r - 1; + goto up; + } + break; + case '\r': + w->ww_cur.c = w->ww_w.l; + break; + case ctrl('g'): + ttputc(ctrl('g')); + break; + case ctrl('['): + w->ww_wstate = 1; + break; + } + break; + case 1: + w->ww_wstate = 0; + switch (*p++) { + case '@': + w->ww_insert = 1; + break; + case 'A': + up: + UPDATE(); + if (--w->ww_cur.r < w->ww_w.t) { + w->ww_cur.r = w->ww_w.t; + if (w->ww_w.t > w->ww_b.t) { + (void) wwscroll1(w, w->ww_i.t, + w->ww_i.b, -1, 0); + w->ww_buf--; + w->ww_b.t++; + w->ww_b.b++; + } else + wwinsline(w, w->ww_b.t); + } + break; + case 'B': + goto lf; + case 'C': + right: + w->ww_cur.c++; + goto chklf; + case 'E': + w->ww_buf -= w->ww_w.t - w->ww_b.t; + w->ww_b.t = w->ww_w.t; + w->ww_b.b = w->ww_b.t + w->ww_b.nr; + w->ww_cur.r = w->ww_w.t; + w->ww_cur.c = w->ww_w.l; + wwclreos(w, w->ww_w.t, w->ww_w.l); + break; + case 'H': + UPDATE(); + w->ww_cur.r = w->ww_w.t; + w->ww_cur.c = w->ww_w.l; + break; + case 'J': + wwclreos(w, w->ww_cur.r, w->ww_cur.c); + break; + case 'K': + wwclreol(w, w->ww_cur.r, w->ww_cur.c); + break; + case 'L': + UPDATE(); + wwinsline(w, w->ww_cur.r); + break; + case 'M': + wwdelline(w, w->ww_cur.r); + break; + case 'N': + wwdelchar(w, w->ww_cur.r, w->ww_cur.c); + break; + case 'O': + w->ww_insert = 0; + break; + case 'P': + wwinschar(w, w->ww_cur.r, w->ww_cur.c, ' ', 0); + break; + case 'X': + wwupdate(); + break; + case 'Y': + UPDATE(); + w->ww_wstate = 2; + break; + case 'Z': + wwupdate(); + xxflush(0); + break; + case 's': + w->ww_wstate = 4; + break; + case 'r': + w->ww_wstate = 5; + break; + } + break; + case 2: + w->ww_cur.r = w->ww_w.t + + (unsigned)(*p++ - ' ') % w->ww_w.nr; + w->ww_wstate = 3; + break; + case 3: + w->ww_cur.c = w->ww_w.l + + (unsigned)(*p++ - ' ') % w->ww_w.nc; + w->ww_wstate = 0; + break; + case 4: + w->ww_modes |= *p++ & wwavailmodes; + w->ww_wstate = 0; + break; + case 5: + w->ww_modes &= ~*p++; + w->ww_wstate = 0; + break; + } + } + if (hascursor) + wwcursor(w, 1); + wwnwwr++; + wwnwwra += n; + n = p - savep; + wwnwwrc += n; + return n; +} diff --git a/usr.bin/window/xx.c b/usr.bin/window/xx.c new file mode 100644 index 0000000..9b68b96 --- /dev/null +++ b/usr.bin/window/xx.c @@ -0,0 +1,252 @@ +/* + * Copyright (c) 1989, 1993 + * The Regents of the University of California. All rights reserved. + * + * This code is derived from software contributed to Berkeley by + * Edward Wang at The University of California, Berkeley. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. All advertising materials mentioning features or use of this software + * must display the following acknowledgement: + * This product includes software developed by the University of + * California, Berkeley and its contributors. + * 4. Neither the name of the University nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + */ + +#ifndef lint +static char sccsid[] = "@(#)xx.c 8.1 (Berkeley) 6/6/93"; +#endif /* not lint */ + +#include "ww.h" +#include "xx.h" +#include "tt.h" + +xxinit() +{ + if (ttinit() < 0) + return -1; + xxbufsize = tt.tt_nrow * tt.tt_ncol * 2; + /* ccinit may choose to change xxbufsize */ + if (tt.tt_ntoken > 0 && ccinit() < 0) + return -1; + xxbuf = malloc((unsigned) xxbufsize * sizeof *xxbuf); + if (xxbuf == 0) { + wwerrno = WWE_NOMEM; + return -1; + } + xxbufp = xxbuf; + xxbufe = xxbuf + xxbufsize; + return 0; +} + +xxstart() +{ + (*tt.tt_start)(); + if (tt.tt_ntoken > 0) + ccstart(); + xxreset1(); /* might be a restart */ +} + +xxreset() +{ + if (tt.tt_ntoken > 0) + ccreset(); + xxreset1(); + (*tt.tt_reset)(); +} + +xxreset1() +{ + register struct xx *xp, *xq; + + for (xp = xx_head; xp != 0; xp = xq) { + xq = xp->link; + xxfree(xp); + } + xx_tail = xx_head = 0; + xxbufp = xxbuf; +} + +xxend() +{ + if (tt.tt_scroll_top != 0 || tt.tt_scroll_bot != tt.tt_nrow - 1) + /* tt.tt_setscroll is known to be defined */ + (*tt.tt_setscroll)(0, tt.tt_nrow - 1); + if (tt.tt_modes) + (*tt.tt_setmodes)(0); + if (tt.tt_scroll_down) + (*tt.tt_scroll_down)(1); + (*tt.tt_move)(tt.tt_nrow - 1, 0); + if (tt.tt_ntoken > 0) + ccend(); + (*tt.tt_end)(); + ttflush(); +} + +struct xx * +xxalloc() +{ + register struct xx *xp; + + if (xxbufp > xxbufe) + abort(); + if ((xp = xx_freelist) == 0) + /* XXX can't deal with failure */ + xp = (struct xx *) malloc((unsigned) sizeof *xp); + else + xx_freelist = xp->link; + if (xx_head == 0) + xx_head = xp; + else + xx_tail->link = xp; + xx_tail = xp; + xp->link = 0; + return xp; +} + +xxfree(xp) + register struct xx *xp; +{ + xp->link = xx_freelist; + xx_freelist = xp; +} + +xxmove(row, col) +{ + register struct xx *xp = xx_tail; + + if (xp == 0 || xp->cmd != xc_move) { + xp = xxalloc(); + xp->cmd = xc_move; + } + xp->arg0 = row; + xp->arg1 = col; +} + +xxscroll(dir, top, bot) +{ + register struct xx *xp = xx_tail; + + if (xp != 0 && xp->cmd == xc_scroll && + xp->arg1 == top && xp->arg2 == bot && + (xp->arg0 < 0 && dir < 0 || xp->arg0 > 0 && dir > 0)) { + xp->arg0 += dir; + return; + } + xp = xxalloc(); + xp->cmd = xc_scroll; + xp->arg0 = dir; + xp->arg1 = top; + xp->arg2 = bot; +} + +xxinschar(row, col, c, m) +{ + register struct xx *xp; + + xp = xxalloc(); + xp->cmd = xc_inschar; + xp->arg0 = row; + xp->arg1 = col; + xp->arg2 = c; + xp->arg3 = m; +} + +xxinsspace(row, col) +{ + register struct xx *xp = xx_tail; + + if (xp != 0 && xp->cmd == xc_insspace && xp->arg0 == row && + col >= xp->arg1 && col <= xp->arg1 + xp->arg2) { + xp->arg2++; + return; + } + xp = xxalloc(); + xp->cmd = xc_insspace; + xp->arg0 = row; + xp->arg1 = col; + xp->arg2 = 1; +} + +xxdelchar(row, col) +{ + register struct xx *xp = xx_tail; + + if (xp != 0 && xp->cmd == xc_delchar && + xp->arg0 == row && xp->arg1 == col) { + xp->arg2++; + return; + } + xp = xxalloc(); + xp->cmd = xc_delchar; + xp->arg0 = row; + xp->arg1 = col; + xp->arg2 = 1; +} + +xxclear() +{ + register struct xx *xp; + + xxreset1(); + xp = xxalloc(); + xp->cmd = xc_clear; +} + +xxclreos(row, col) +{ + register struct xx *xp = xxalloc(); + + xp->cmd = xc_clreos; + xp->arg0 = row; + xp->arg1 = col; +} + +xxclreol(row, col) +{ + register struct xx *xp = xxalloc(); + + xp->cmd = xc_clreol; + xp->arg0 = row; + xp->arg1 = col; +} + +xxwrite(row, col, p, n, m) + char *p; +{ + register struct xx *xp; + + if (xxbufp + n + 1 > xxbufe) + xxflush(0); + xp = xxalloc(); + xp->cmd = xc_write; + xp->arg0 = row; + xp->arg1 = col; + xp->arg2 = n; + xp->arg3 = m; + xp->buf = xxbufp; + bcopy(p, xxbufp, n); + xxbufp += n; + *xxbufp++ = char_sep; +} diff --git a/usr.bin/window/xx.h b/usr.bin/window/xx.h new file mode 100644 index 0000000..2c54589 --- /dev/null +++ b/usr.bin/window/xx.h @@ -0,0 +1,58 @@ +/* + * Copyright (c) 1989, 1993 + * The Regents of the University of California. All rights reserved. + * + * This code is derived from software contributed to Berkeley by + * Edward Wang at The University of California, Berkeley. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. All advertising materials mentioning features or use of this software + * must display the following acknowledgement: + * This product includes software developed by the University of + * California, Berkeley and its contributors. + * 4. Neither the name of the University nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * @(#)xx.h 8.1 (Berkeley) 6/6/93 + */ + +struct xx { + enum { xc_move, xc_scroll, xc_inschar, xc_insspace, xc_delchar, + xc_clear, xc_clreos, xc_clreol, xc_write } cmd; + int arg0; + int arg1; + int arg2; + int arg3; + char *buf; + struct xx *link; +}; + +struct xx *xxalloc(); + +struct xx *xx_head, *xx_tail; +struct xx *xx_freelist; + +char *xxbuf, *xxbufp, *xxbufe; +int xxbufsize; + +#define char_sep '\0' diff --git a/usr.bin/window/xxflush.c b/usr.bin/window/xxflush.c new file mode 100644 index 0000000..5b09579 --- /dev/null +++ b/usr.bin/window/xxflush.c @@ -0,0 +1,196 @@ +/* + * Copyright (c) 1989, 1993 + * The Regents of the University of California. All rights reserved. + * + * This code is derived from software contributed to Berkeley by + * Edward Wang at The University of California, Berkeley. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. All advertising materials mentioning features or use of this software + * must display the following acknowledgement: + * This product includes software developed by the University of + * California, Berkeley and its contributors. + * 4. Neither the name of the University nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + */ + +#ifndef lint +static char sccsid[] = "@(#)xxflush.c 8.1 (Berkeley) 6/6/93"; +#endif /* not lint */ + +#include "ww.h" +#include "xx.h" +#include "tt.h" + +xxflush(intr) + register intr; +{ + register struct xx *xp, *xq; + + for (xp = xx_head; xp != 0 && !(intr && wwinterrupt()); xp = xq) { + switch (xp->cmd) { + case xc_move: + if (xp->link == 0) + (*tt.tt_move)(xp->arg0, xp->arg1); + break; + case xc_scroll: + xxflush_scroll(xp); + break; + case xc_inschar: + (*tt.tt_move)(xp->arg0, xp->arg1); + tt.tt_nmodes = xp->arg3; + (*tt.tt_inschar)(xp->arg2); + break; + case xc_insspace: + (*tt.tt_move)(xp->arg0, xp->arg1); + (*tt.tt_insspace)(xp->arg2); + break; + case xc_delchar: + (*tt.tt_move)(xp->arg0, xp->arg1); + (*tt.tt_delchar)(xp->arg2); + break; + case xc_clear: + (*tt.tt_clear)(); + break; + case xc_clreos: + (*tt.tt_move)(xp->arg0, xp->arg1); + (*tt.tt_clreos)(); + break; + case xc_clreol: + (*tt.tt_move)(xp->arg0, xp->arg1); + (*tt.tt_clreol)(); + break; + case xc_write: + (*tt.tt_move)(xp->arg0, xp->arg1); + tt.tt_nmodes = xp->arg3; + (*tt.tt_write)(xp->buf, xp->arg2); + break; + } + xq = xp->link; + xxfree(xp); + } + if ((xx_head = xp) == 0) { + xx_tail = 0; + xxbufp = xxbuf; + } + ttflush(); +} + +xxflush_scroll(xp) + register struct xx *xp; +{ + register struct xx *xq; + + top: + if (xp->arg0 == 0) + return; + /* + * We handle retain (da and db) by putting the burden on scrolling up, + * which is the less common operation. It must ensure that + * text is not pushed below the screen, so scrolling down doesn't + * have to worry about it. + * + * Try scrolling region (or scrolling the whole screen) first. + * Can we assume "sr" doesn't push text below the screen + * so we don't have to worry about retain below? + * What about scrolling down with a newline? It probably does + * push text above (with da). Scrolling up would then have + * to take care of that. + * It's easy to be fool proof, but that slows things down. + * The current solution is to disallow tt_scroll_up if da or db is true + * but cs (scrolling region) is not. Again, we sacrifice scrolling + * up in favor of scrolling down. The idea is having scrolling regions + * probably means we can scroll (even the whole screen) with impunity. + * This lets us work efficiently on simple terminals (use newline + * on the bottom to scroll), on any terminal without retain, and + * on vt100 style scrolling regions (I think). + */ + if (xp->arg0 > 0) { + if ((xq = xp->link) != 0 && xq->cmd == xc_scroll && + xp->arg2 == xq->arg2 && xq->arg0 < 0) { + if (xp->arg1 < xq->arg1) { + if (xp->arg2 - xp->arg0 <= xq->arg1) { + xq->arg0 = xp->arg0; + xq->arg1 = xp->arg1; + xq->arg2 = xp->arg2; + return; + } + xp->arg2 = xq->arg1 + xp->arg0; + xq->arg0 += xp->arg0; + xq->arg1 = xp->arg2; + if (xq->arg0 > 0) + xq->arg1 -= xq->arg0; + goto top; + } else { + if (xp->arg1 - xq->arg0 >= xp->arg2) + return; + xq->arg2 = xp->arg1 - xq->arg0; + xp->arg0 += xq->arg0; + xp->arg1 = xq->arg2; + if (xp->arg0 < 0) + xp->arg1 += xp->arg0; + goto top; + } + } + if (xp->arg0 > xp->arg2 - xp->arg1) + xp->arg0 = xp->arg2 - xp->arg1; + if (tt.tt_scroll_down) { + if (tt.tt_scroll_top != xp->arg1 || + tt.tt_scroll_bot != xp->arg2 - 1) { + if (tt.tt_setscroll == 0) + goto down; + (*tt.tt_setscroll)(xp->arg1, xp->arg2 - 1); + } + tt.tt_scroll_down(xp->arg0); + } else { + down: + (*tt.tt_move)(xp->arg1, 0); + (*tt.tt_delline)(xp->arg0); + if (xp->arg2 < tt.tt_nrow) { + (*tt.tt_move)(xp->arg2 - xp->arg0, 0); + (*tt.tt_insline)(xp->arg0); + } + } + } else { + xp->arg0 = - xp->arg0; + if (xp->arg0 > xp->arg2 - xp->arg1) + xp->arg0 = xp->arg2 - xp->arg1; + if (tt.tt_scroll_up) { + if (tt.tt_scroll_top != xp->arg1 || + tt.tt_scroll_bot != xp->arg2 - 1) { + if (tt.tt_setscroll == 0) + goto up; + (*tt.tt_setscroll)(xp->arg1, xp->arg2 - 1); + } + tt.tt_scroll_up(xp->arg0); + } else { + up: + if (tt.tt_retain || xp->arg2 != tt.tt_nrow) { + (*tt.tt_move)(xp->arg2 - xp->arg0, 0); + (*tt.tt_delline)(xp->arg0); + } + (*tt.tt_move)(xp->arg1, 0); + (*tt.tt_insline)(xp->arg0); + } + } +} |