Return to BSD News archive
Received: by minnie.vk1xwt.ampr.org with NNTP id AA6783 ; Fri, 15 Jan 93 10:32:45 EST Xref: sserve comp.unix.bsd:9963 alt.sources:4987 Path: sserve!manuel.anu.edu.au!munnari.oz.au!uunet!usc!sol.ctr.columbia.edu!ira.uka.de!Germany.EU.net!hcshh!hm From: hm@hcshh.hcs.de (Hellmuth Michaelis) Newsgroups: comp.unix.bsd,alt.sources Subject: [386BSD] pcvt 2.00 - VT220 console driver (part 05/11) Summary: 386BSD 0.1 VT220 console device driver source code Keywords: 386BSD console driver VT220 Message-ID: <1621@hcshh.hcs.de> Date: 15 Jan 93 13:02:28 GMT Followup-To: comp.unix.bsd Organization: HCS GmbH, Hamburg, Europe Lines: 2439 Submitted-by: hm@hcshh.hcs.de (Hellmuth Michaelis) Archive-name: pcvt-2.00/part05 ---- Cut Here and unpack ---- #!/bin/sh # This is part 05 of pcvt-2.00 if touch 2>&1 | fgrep '[-amc]' > /dev/null then TOUCH=touch else TOUCH=true fi # ============= Support/uemacs/dot-emacsrc ============== if test ! -d 'Support/uemacs'; then echo "x - creating directory Support/uemacs" mkdir 'Support/uemacs' fi if test X"$1" != X"-c" -a -f 'Support/uemacs/dot-emacsrc'; then echo "File already exists: skipping 'Support/uemacs/dot-emacsrc'" else echo "x - extracting Support/uemacs/dot-emacsrc (Text)" sed 's/^X//' << 'SHAR_EOF' > Support/uemacs/dot-emacsrc && X;--------------------------------------------------------------------------- X; X; Startup file for MicroEMACS 3.8b, 3.10, 3.11a X; --------------------------------------------- X; X; written by Hellmuth Michaelis 1989,1990,1991,1992 X; Eggerstedtstr. 28 X; 2000 Hamburg 50 (hm@hcshh.hcs.de) X; X; updated: 18-02-89 -hm X; for os-9/68k with HP-Terminals & lookalikes X; tested with hp2624/hp150/hp2392/hp7009x/cumulus/zentec8392 X; updated: 08-12-89 -hm X; for HP-UX emacs 3.10 X; tested with cumulus terminals ( == hp 700/94 ) X; updated: 29-01-90 -hm X; last-edit-date macro X; updated: 07-10-91 -hm X; uemacs 3.11, debugging, polishing .. X; X; edit-date: [Sun Aug 16 15:56:50 1992] X; Edit-Vers: [17] X; Xset $discmd FALSE Xwrite-message "[Setting up Function-Key Menu system ....]" X; X;====== HELP SYSTEM ============================= X; enter help system X1 store-macro X set $discmd FALSE X bind-to-key execute-macro-2 FN1 X 1 label-function-key " EXIT HELP " X bind-to-key execute-macro-3 FN2 X 2 label-function-key " " X bind-to-key execute-macro-3 FN3 X 3 label-function-key " " X bind-to-key execute-macro-3 FN4 X 4 label-function-key " " X bind-to-key execute-macro-3 FN5 X 5 label-function-key " " X bind-to-key execute-macro-3 FN6 X 6 label-function-key " " X bind-to-key execute-macro-4 FN7 X 7 label-function-key " prev scrn " X bind-to-key execute-macro-5 FN8 X 8 label-function-key " next scrn " X 1 next-window X help X 8 resize-window X add-mode "red" X beginning-of-file X 2 forward-character X clear-message-line X set $discmd TRUE X!endm X X; exit help X2 store-macro X execute-macro-6 X delete-window X clear-message-line X!endm X X; macro 3 = don't allow these commands === GENERAL PURPOSE === X3 store-macro X write-message "[ KEY HAS NO FUNCTION !! ]" X!endm X X; previous help page X4 store-macro X beginning-of-line X search-reverse "=>" X 1 redraw-display X 2 forward-character X!endm X X; next help page X5 store-macro X beginning-of-line X 2 forward-character X search-forward "=>" X 1 redraw-display X!endm X;=========== MAIN MENU FUNCTION KEYS & MISC ======== X; set main function key labels X6 store-macro X set $discmd FALSE X bind-to-key execute-macro-1 FN1 X !force 1 label-function-key " HELP FILE " X bind-to-key execute-macro-7 FN2 X !force 2 label-function-key " WORD MOV/DEL" X bind-to-key execute-macro-8 FN3 X !force 3 label-function-key " HPUX SPEC " X bind-to-key execute-macro-9 FN4 X !force 4 label-function-key " WINDOW CMDS " X bind-to-key execute-macro-10 FN5 X !force 5 label-function-key " SEARCH REPLACE" X bind-to-key execute-macro-11 FN6 X !force 6 label-function-key " MISC CMDS " X bind-to-key execute-macro-12 FN7 X !force 7 label-function-key " REGION CMDS " X bind-to-key exit-emacs FN8 X !force 8 label-function-key " EXIT EMACS " X clear-message-line X set $discmd TRUE X!endm X;========= WORD FUNCTIONS ====================== X; build word-keys menu X7 store-macro X set $discmd FALSE X bind-to-key previous-word FN1 X 1 label-function-key " WORD move <--" X bind-to-key next-word FN2 X 2 label-function-key " WORD move -->" X bind-to-key delete-previous-word FN3 X 3 label-function-key " WORD del <--" X bind-to-key delete-next-word FN4 X 4 label-function-key " WORD del -->" X bind-to-key case-word-capitalize FN5 X 5 label-function-key " WORD capitalz" X bind-to-key case-word-lower FN6 X 6 label-function-key " WORD lowrcase" X bind-to-key case-word-upper FN7 X 7 label-function-key " WORD upprcase" X bind-to-key execute-macro-6 FN8 X 8 label-function-key " EXIT TO MAIN" X clear-message-line X set $discmd TRUE X!endm X;========== OP-SYS ACCESS & COMMAND EXEC ============= X8 store-macro X set $discmd FALSE X bind-to-key shell-command FN1 X 1 label-function-key " HPUX cmndline" X bind-to-key i-shell FN2 X 2 label-function-key " HPUX shell " X bind-to-key add-mode FN3 X 3 label-function-key " ADD MODE " X bind-to-key delete-mode FN4 X 4 label-function-key " DELETE MODE " X bind-to-key execute-macro-14 FN5 X 5 label-function-key " MACRO PAGE " X bind-to-key execute-named-command FN6 X 6 label-function-key " EXEC cmnd " X bind-to-key execute-file FN7 X 7 label-function-key " EXEC file " X bind-to-key execute-macro-6 FN8 X 8 label-function-key " EXIT TO MAIN" X clear-message-line X set $discmd TRUE X!endm X;========== WINDOW MANAGEMENT =========================== X9 store-macro X set $discmd FALSE X bind-to-key next-window FN1 X 1 label-function-key " NEXT window " X bind-to-key previous-window FN2 X 2 label-function-key " PREV window " X bind-to-key delete-window FN3 X 3 label-function-key " DEL cur wind" X bind-to-key delete-other-windows FN4 X 4 label-function-key " DEL oth wind" X bind-to-key split-current-window FN5 X 5 label-function-key " SPLIT window " X bind-to-key shrink-window FN6 X 6 label-function-key " SHRINK window " X bind-to-key grow-window FN7 X 7 label-function-key " ENLARGE window " X bind-to-key execute-macro-6 FN8 X 8 label-function-key " EXIT TO MAIN" X clear-message-line X set $discmd TRUE X!endm X;========== SEARCH/REPLACE ============================= X10 store-macro X set $discmd FALSE X bind-to-key search-forward FN1 X 1 label-function-key " SEARCH forward" X bind-to-key search-reverse FN2 X 2 label-function-key " SEARCH backward" X bind-to-key replace-string FN3 X 3 label-function-key " SEARCH &replace" X bind-to-key query-replace-string FN4 X 4 label-function-key "SRCHRPLC w/query" X bind-to-key hunt-forward FN5 X 5 label-function-key " REPEAT src fwd" X bind-to-key hunt-backward FN6 X 6 label-function-key " REPEAT src back" X bind-to-key execute-macro-3 FN7 X 7 label-function-key " " X bind-to-key execute-macro-6 FN8 X 8 label-function-key " EXIT TO MAIN" X clear-message-line X set $discmd TRUE X!endm X;========== MISC CMDS =================================== X11 store-macro X set $discmd FALSE X bind-to-key goto-matching-fence FN1 X 1 label-function-key " GOTO C-fence " X bind-to-key goto-line FN2 X 2 label-function-key " GOTO line " X bind-to-key set FN3 X 3 label-function-key " SET variable" X bind-to-key buffer-position FN4 X 4 label-function-key " SHOW position" X bind-to-key begin-macro FN5 X 5 label-function-key " START macro " X bind-to-key end-macro FN6 X 6 label-function-key " END macro " X bind-to-key execute-macro FN7 X 7 label-function-key " EXEC macro " X bind-to-key execute-macro-6 FN8 X 8 label-function-key " EXIT TO MAIN" X clear-message-line X set $discmd TRUE X!endm X;========== REGION CMDS =================================== X12 store-macro X set $discmd FALSE X bind-to-key set-mark FN1 X 1 label-function-key " SET mark " X bind-to-key exchange-point-and-mark FN2 X 2 label-function-key " XCHG pnt&mark" X bind-to-key kill-region FN3 X 3 label-function-key " KILL region " X bind-to-key copy-region FN4 X 4 label-function-key " COPY region " X bind-to-key case-region-lower FN5 X 5 label-function-key "LOWRCASE region " X bind-to-key case-region-upper FN6 X 6 label-function-key "UPPRCASE region " X bind-to-key execute-macro-3 FN7 X 7 label-function-key " " X bind-to-key execute-macro-6 FN8 X 8 label-function-key " EXIT TO MAIN" X clear-message-line X set $discmd TRUE X!endm X X;==================================================== X; Set up auto CMODE X;==================================================== X40 store-macro X set %rctmp &sin $cfname "." X !if &equ %rctmp 0 X !return X !endif X set %rctmp &mid $cfname &add %rctmp 1 5 X !if &or &seq %rctmp "c" &seq %rctmp "h" X add-mode "cmode" X !endif X!endm Xset $readhook execute-macro-40 X X;============================================== X; Load a new page X;============================================== X14 store-macro X !if &seq &find newpage.cmd "" X write-message "[Can not find NEWPAGE.CMD]" X !else X execute-file newpage.cmd X !endif X!endm X X;================================================= X;==== END OF SETUP, START EMACS... =============== X;================================================= Xexecute-macro-6 X; Xadd-mode EXACT Xadd-global-mode EXACT X; Xset $discmd TRUE X; X;>>> EDITDATE.CMD - adjust the edit date and edit number X; X; The edit date is the date that the file was last editted on. The X; edit number is just an incrementing number that gets bumped whenever X; the file is editted. X; X; Formats of the edit date and edit number field are: X; X; Edit-Date: [Wed Aug 01 10:05:13 199] X; Edit-Vers: [0] X; X; You should also put the two above lines at the top of your X; emacs.rc file so that whenever you edit it they wlll get X; updated! X; X; updates: X; - save current position X; - save current search string X; - reset exact mode while searching for "Edit-Date: []" X; X22 store-macro X 9 set-mark X; write-message "[Checking if buffer is in VIEW mode]" X !if &equal &band $cmode 16 0 X set %MODESAVE $cmode X set %LASTSRCH $search X set $cmode &band $cmode &bnot 8 X write-message "[Looking for Edit-Date: []]" X beginning-of-file X !force search-forward &cat "Edit-Date: " "[" X !if &seq $status TRUE X 0 set-mark X search-forward "]" X 1 backward-character X kill-region X insert-string $time X !endif X write-message "[Looking for Edit-Vers: []]" X !force search-forward &cat "Edit-Vers: " "[" X !if &seq $status TRUE X 0 set-mark X search-forward "]" X 1 backward-character X kill-region X insert-string &add $kill 1 X !endif X beginning-of-file X clear-message-line X set $cmode %MODESAVE X set $search %LASTSRCH X !endif X9 exchange-point-and-mark X!endm X; Xset $writehook execute-macro-22 SHAR_EOF $TOUCH -am 0112125693 Support/uemacs/dot-emacsrc && chmod 0640 Support/uemacs/dot-emacsrc || echo "restore of Support/uemacs/dot-emacsrc failed" set `wc -c Support/uemacs/dot-emacsrc`;Wc_c=$1 if test "$Wc_c" != "9469"; then echo original size 9469, current size $Wc_c fi fi # ============= Support/uemacs/emacs.hlp ============== if test X"$1" != X"-c" -a -f 'Support/uemacs/emacs.hlp'; then echo "File already exists: skipping 'Support/uemacs/emacs.hlp'" else echo "x - extracting Support/uemacs/emacs.hlp (Text)" sed 's/^X//' << 'SHAR_EOF' > Support/uemacs/emacs.hlp && X=> MicroEMACS 3.11 Help screens (03/19/89) X X M- means to use the <ESC> key prior to using another key X ^A means to use the control key at the same time as the A key X X^V or [Pg Dn] Scroll down M-< or <HOME> Begining of file X^Z or [Pg Up] Scroll up M-> or <END> End of file X X----------------------------------------------------------------------- X=> (1) MOVING THE CURSOR X X^F Forward character M-F Forward word Keypad arrows X^B Backward character M-B Backward word are active! X^A Front of line M-G Goto a line X^E End of line X^N Next line M-N Front of paragraph X^P Previous line M-P End of paragraph X----------------------------------------------------------------------- X=> (2) DELETING & INSERTING X X<-- Delete previous character X^D or <DELETE> Delete next character X^C or <INSERT> Insert a space XM-<-- Delete previous word XM-D Delete next word X^K Close (delete) to end of line X----------------------------------------------------------------------- X=> (2a) MORE DELETING & INSERTING X X<RETURN> Insert a newline <TAB> Advance to next tab stop X^J Insert a newline and indent M-^W Delete paragraph X^O Open (insert) line X^W Delete region between mark (set using M-<spacebar>) and cursor XM-W Copy region to kill buffer X^X^O Delete blank lines around cursor X----------------------------------------------------------------------- X=> (3) SEARCHING X X^S Search forward from cursor position. X^R Reverse search from cursor position. X^XS Forward incremental search X^XR Reverse incremental search X<ALT> S Search for the next occurence of the last string (IBM-PC only) X<ALT> R Search for the last occurence of the last string (IBM-PC only) X----------------------------------------------------------------------- X=> (4) REPLACING X XM-R Replace all instances of first typed-in string with second X typed-in string. End each string with ESC. XM-^R Replace with query. Answer with: X ^G cancel . exit to entry point X ! replace the rest Y replace & continue X ? Get a list of options N no replacement & continue X----------------------------------------------------------------------- X=> (5) CAPITALIZING & TRANSPOSING X XM-U UPPERCASE word XM-C Capitalize word ^T Transpose characters XM-L lowercase word X^X^L lowercase region X^X^U uppercase region X^Q Quote next entry, so that control codes may be entered into text X----------------------------------------------------------------------- X=> (6) REGIONS & THE KILL BUFFER X XM-<spacebar> set MARK at current position X^X^X eXchange mark and cursor X XA REGION will then be continuously-defined as the area between the mark and Xthe current cursor position. The KILL BUFFER is the text which has been Xmost recently saved or deleted. X----------------------------------------------------------------------- X=> (7) COPYING AND MOVING X X^W Delete (Wipe) region M-W copy region to KILL buffer X^Y Yankback save buffer at cursor XGenerally, the procedure for copying or moving text is: X 1) Mark a REGION using M-<spacebar> at beginning and cursor at end. X 2) Delete it (with ^W) or copy it (with M-W) into the KILL buffer. X 3) Move the cursor to the desired location and yank it back (with ^Y). X----------------------------------------------------------------------- X=> (8) MODES OF OPERATION X^XM Add mode in buffer M-M Add global mode X^X^M Delete mode in buffer M-^M Delete global mode XOVER Replaces (overwrites) rather than inserts characters XWRAP Turns on word wrap (automatic newlines) XVIEW Allows viewing file without insertion and deletion XCMODE Automatic indenting for C program entry XEXACT/MAGIC Changes how search and replace commands work (see next page) X----------------------------------------------------------------------- X=> (9) SEARCH AND REPLACE MODES X XEXACT Uppper/lower case is not ignored in searches XMAGIC Regular pattern matching characters are active X . Matches any one character X * Matches any any number of the preceding character X ^ Beginning of line [ ] Character class enclosure X $ End of line \ Quote next character X----------------------------------------------------------------------- X=> (10) ON-SCREEN FORMATTING X X^XF Set fill column XMn-<tab> Set tab spacing to n charecters between tabs stops XM-Q Format paragraph so that text lies between margins X^X= Position report -- displays line number, char count, X file size and character under cursor XM-^C Count words/lines/chars in marked region X----------------------------------------------------------------------- X=> (11) MULTIPLE WINDOWS X XMany WINDOWS may be active at once on the screen. All windows may show Xdifferent parts of the same buffer, or each may display a different one. X^X2 Split the current window in two ^XO Change to next window X^X0 delete current window ^XP Change to previous window X^X1 delete all other windows M-^V Page down next window X M-^Z Page up other window X----------------------------------------------------------------------- X=> (12) CONTROLLING WINDOWS AND THE SCREEN X X^X^ Enlarge current window M-<n> ^XW Resize window to <n> lines X^X^Z Shrink current window X^X^N Move window down X^X^P Move window up XM-^L Reposition window X^L Refresh the screen X----------------------------------------------------------------------- X=> (13) MULTIPLE BUFFERS XA BUFFER is a named area containing a document being edited. Many buffers Xmay be activated at once. X^XB Switch to another buffer. <CR> = use just-previous buffer X^XX Switch to next buffer in buffer list XM-^N Change name of current buffer X^XK Delete a non-displayed buffer. X^X^B Display buffer directory in a window X----------------------------------------------------------------------- X=> (14) READING FROM DISK X X^X^F Find file; read into a new buffer created from filename. X (This is the usual way to begin editing a new file.) X^X^R Read file into current buffer, erasing its previous contents. X No new buffer will be created. X^X^I Insert file into current buffer at cursor's location. X^X^V Find a file to make current in VIEW mode X----------------------------------------------------------------------- X=> (15) SAVING BUFFERS AND REGIONS TO DISK X X^X^S Save current buffer to disk X^X^W Write current buffer to disk X^XN Change file name of current buffer XM-Z Write out all changed buffers and exit MicroEMACS X^X< Make everything outside the current region invisable X^X> Restore invisible text X----------------------------------------------------------------------- X=> (16) ACCESSING THE OPERATING SYSTEM X X^X! Send one command to the operating system and return X^X@ Pipe DOS command results to buffer X^X# Filter buffer through DOS filter program X^XC Start a new command processor under MicroEMACS X^XD Suspend MicroEMACS into the background (UNIX BSD4.2 only) X^X^C Exit MicroEMACS X----------------------------------------------------------------------- X=> (17) KEY BINDINGS AND COMMANDS X XM-K Bind a key to a command M-A Describe a class of commands XM-^K Unbind a key from a command X^X? Describe command bound to a key XM-X Execute a named (and possibly unbound) command X{Describe-bindings} X Display a list of all commands and key bindings to a buffer X----------------------------------------------------------------------- X=> (18) COMMAND EXECUTION XCommands can be specified as command lines in the form: X <optional repeat count> {command-name} <optional arguments> X{Execute-command-line} execute a typed in command line X{Execute-buffer} executes commands lines in a buffer X{Execute-file} executes command lines from a file X{clear-message-line} clears the message line during execution X M-~ clears the modified flag for a buffer X----------------------------------------------------------------------- X=> (19) MACRO EXECUTION X X^X( Start recording keyboard macro X^X) Stop recording keyboard macro X^XE Execute keyboard macro XM-<n> {store-macro} Start recording named macro X !endm Stop recording named macro X{execute-macro-n} Execute macro n (where n is from 1 to 20) X----------------------------------------------------------------------- X=> (20) SPECIAL KEYS X X^G Cancel current command and return to top level of processing. X^U or Universal repeat. May be followed by an integer (default = 4) XM-<digit> and repeats the next command that many times. XM-X Execute a named (and possibly unbound) command X X X SHAR_EOF $TOUCH -am 0112125693 Support/uemacs/emacs.hlp && chmod 0640 Support/uemacs/emacs.hlp || echo "restore of Support/uemacs/emacs.hlp failed" set `wc -c Support/uemacs/emacs.hlp`;Wc_c=$1 if test "$Wc_c" != "8365"; then echo original size 8365, current size $Wc_c fi fi # ============= Support/uemacs/unix.c-3.11a ============== if test X"$1" != X"-c" -a -f 'Support/uemacs/unix.c-3.11a'; then echo "File already exists: skipping 'Support/uemacs/unix.c-3.11a'" else echo "x - extracting Support/uemacs/unix.c-3.11a (Text)" sed 's/^X//' << 'SHAR_EOF' > Support/uemacs/unix.c-3.11a && X/*---------------------------------------------------------------------------* X * X * Last Edit-Date: [Sun Aug 16 16:00:28 1992] X * X * HP-Terminal Handling written by X * Hellmuth Michaelis, Hamburg, Germany X * e-mail: hm@hcshh.hcs.de tel: +49-40-559030 X * X * -hm updating from emacs 3.10 to 3.11 beta X * - standout not erased by overwrite display handling X * - function key handling X * - function key labeling handling X * - keyboard open & close routines X * - function key label & contents backup store X * X * -hm updating to emacs version 3.11/3.11a X * -hm modifying termcap table X * -hm fkey-labels for 386bsd virtual ansi-2392 terminal X * X *---------------------------------------------------------------------------*/ X X/** X New features: X X 1. Timeouts waiting on a function key have been changed from X 35000 to 500000 microseconds. X X 2. Additional keymapping entries can be made from the command X language by issuing a 'set $palette xxx'. The format of X xxx is a string as follows: X "KEYMAP keybinding escape-sequence". X To add "<ESC><[><A>" as a keybinding of FNN, issue: X "KEYMAP FNN ^[[A". X Note that the escape character! It is a read escape character X and it's pretty difficult to enter. X X 3. Colors are supported. Under AIX the colors will be pulled X in automaticly. For other environments, you can either add X the termcap entries, C0 to D7. Or the colors may be defined X using the command language by issuing a 'set $palette xxx' X command. The format of xxx is a string as follows: X "CLRMAP # escape-sequence". X The number is a number from 0 to 15, where 0 to 7 is the X foreground colors, and 8 to 15 as background colors. X To add foreground color 0 for ansi terminals, issue: X "CLRMAP 0 ^[[30m". X X 'Porting notes: X X I have tried to create this file so that it should work X as well as possible without changes on your part. X X However, if something does go wrong, read the following X helpful hints: X X 1. On SUN-OS4, there is a problem trying to include both X the termio.h and ioctl.h files. I wish Sun would get their X act together. Even though you get lots of redefined messages, X it shouldn't cause any problems with the final object. X X 2. In the type-ahead detection code, the individual UNIX X system either has a FIONREAD or a FIORDCHK ioctl call. X Hopefully, your system uses one of them and this be detected X correctly without any intervention. X X 3. Also lookout for directory handling. The SCO Xenix system X is the weirdest I've seen, requiring a special load file X (see below). Some machine call the result of a readdir() call X a "struct direct" or "struct dirent". Includes files are X named differently depending of the O/S. If your system doesn't X have an opendir()/closedir()/readdir() library call, then X you should use the public domain utility "ndir". X X To compile: X Compile all files normally. X To link: X Select one of the following operating systems: X SCO Xenix: X use "-ltermcap" and "-lx"; X SUN 3 and 4: X use "-ltermcap"; X IBM-RT, IBM-AIX, ATT UNIX, Altos UNIX, Interactive: X use "-lcurses". X**/ X X/** Include files **/ X#include <stdio.h> /* Standard I/O definitions */ X#include "estruct.h" /* Emacs definitions */ X X/** Do nothing routine **/ Xint scnothing() X{ X return(0); X} X X/** Only compile for UNIX machines **/ X#if BSD || USG || SMOS || HPUX || SUN || XENIX || AVIION X X/* for 386BSD 0.0new (-hm) */ X#if BSD386 X#define USE_OLD_TTY X#endif X X/** Include files **/ X#include "eproto.h" /* Function definitions */ X#include "edef.h" /* Global variable definitions */ X#include "elang.h" /* Language definitions */ X X/** Kill predefined **/ X#undef CTRL /* Problems with CTRL */ X X/** Overall include files **/ X#include <sys/types.h> /* System type definitions */ X#include <sys/stat.h> /* File status definitions */ X#include <sys/ioctl.h> /* I/O control definitions */ X X/** Additional include files **/ X#if BSD X#include <sys/time.h> /* Timer definitions */ X#endif /* BSD */ X#if BSD || SUN || HPUX || AVIION X#include <signal.h> /* Signal definitions */ X#endif /* BSD || SUN || HPUX || AVIION */ X#if USG || SMOS || HPUX || SUN || XENIX X#include <termio.h> /* Terminal I/O definitions */ X#endif /* USG || SMOS || HPUX || SUN || XENIX */ X#if AVIION X#include <termios.h> /* Terminal I/O definitions */ X#endif /* AVIION */ X#if CURSES X#include <curses.h> /* Curses screen output */ X#undef WINDOW /* Oh no! */ X#endif /* CURSES */ X X/** Completion include files **/ X/** Directory accessing: Try and figure this out... if you can! **/ X#if BSD X#include <sys/dir.h> /* Directory entry definitions */ X#define DIRENTRY direct X#endif /* BSD */ X#if XENIX || VAT X#include <sys/ndir.h> /* Directory entry definitions */ X#define DIRENTRY direct X#endif /* XENIX */ X#if (USG && !VAT) || SMOS || HPUX || SUN || AVIION X#include <dirent.h> /* Directory entry definitions */ X#define DIRENTRY dirent X#endif /* USG || SMOS || HPUX || SUN || AVIION */ X X/** Restore predefined definitions **/ X#undef CTRL /* Restore CTRL */ X#define CTRL 0x0100 X X/** Parameters **/ X#define NKEYENT 300 /* Number of keymap entries */ X#define NINCHAR 64 /* Input buffer size */ X#define NOUTCHAR 256 /* Output buffer size */ X#if TERMCAP X#define NCAPBUF 1024 /* Termcap storage size */ X#endif /* TERMCAP */ X#define MARGIN 8 /* Margin size */ X#define SCRSIZ 64 /* Scroll for margin */ X#define NPAUSE 10 /* # times thru update to pause */ X X/** CONSTANTS **/ X#define TIMEOUT 255 /* No character available */ X X/** Type definitions **/ Xstruct keyent { /* Key mapping entry */ X struct keyent * samlvl; /* Character on same level */ X struct keyent * nxtlvl; /* Character on next level */ X unsigned char ch; /* Character */ X int code; /* Resulting keycode */ X}; X#if TERMCAP Xstruct capbind { /* Capability binding entry */ X char * name; /* Termcap name */ X char * store; /* Storage variable */ X}; Xstruct keybind { /* Keybinding entry */ X char * name; /* Termcap name */ X int value; /* Binding value */ X}; Xchar *reset = (char*) NULL; /* reset string kjc */ X#endif /* TERMCAP */ X X/** Local variables **/ X#if BSD Xstatic struct sgttyb cursgtty; /* Current modes */ Xstatic struct sgttyb oldsgtty; /* Original modes */ Xstatic struct tchars oldtchars; /* Current tchars */ Xstatic struct ltchars oldlchars; /* Current ltchars */ Xstatic char blank[6] = /* Blank out character set */ X { -1, -1, -1, -1, -1, -1 }; X#endif /* BSD */ X#if USG || SMOS || HPUX || SUN || XENIX Xstatic struct termio curterm; /* Current modes */ Xstatic struct termio oldterm; /* Original modes */ X#endif /* USG || SMOS || HPUX || SUN || XENIX */ X#if AVIION Xstatic struct termios curterm; /* Current modes */ Xstatic struct termios oldterm; /* Original modes */ X#endif /* AVIION */ X#if TERMCAP Xstatic char tcapbuf[NCAPBUF]; /* Termcap character storage */ X#define CAP_CL 0 /* Clear to end of page */ X#define CAP_CM 1 /* Cursor motion */ X#define CAP_CE 2 /* Clear to end of line */ X#define CAP_SE 3 /* Standout ends */ X#define CAP_SO 4 /* Standout (reverse video) */ X#define CAP_IS 5 /* Initialize screen */ X#define CAP_KS 6 /* Keypad mode starts */ X#define CAP_KE 7 /* Keypad mode ends */ X#define CAP_VB 8 /* Visible bell */ X#if COLOR X#define CAP_C0 9 /* Foreground color #0 */ X#define CAP_C1 10 /* Foreground color #1 */ X#define CAP_C2 11 /* Foreground color #2 */ X#define CAP_C3 12 /* Foreground color #3 */ X#define CAP_C4 13 /* Foreground color #4 */ X#define CAP_C5 14 /* Foreground color #5 */ X#define CAP_C6 15 /* Foreground color #6 */ X#define CAP_C7 16 /* Foreground color #7 */ X#define CAP_D0 17 /* Background color #0 */ X#define CAP_D1 18 /* Background color #1 */ X#define CAP_D2 19 /* Background color #2 */ X#define CAP_D3 20 /* Background color #3 */ X#define CAP_D4 21 /* Background color #4 */ X#define CAP_D5 22 /* Background color #5 */ X#define CAP_D6 23 /* Background color #6 */ X#define CAP_D7 24 /* Background color #7 */ X#endif /* COLOR */ Xstatic struct capbind capbind[] = { /* Capability binding list */ X { "cl" }, /* Clear to end of page */ X { "cm" }, /* Cursor motion */ X { "ce" }, /* Clear to end of line */ X { "se" }, /* Standout ends */ X { "so" }, /* Standout (reverse video) */ X { "is" }, /* Initialize screen */ X { "ks" }, /* Keypad mode starts */ X { "ke" }, /* Keypad mode ends */ X { "vb" }, /* Visible bell */ X#if COLOR X { "c0" }, /* Foreground color #0 */ X { "c1" }, /* Foreground color #1 */ X { "c2" }, /* Foreground color #2 */ X { "c3" }, /* Foreground color #3 */ X { "c4" }, /* Foreground color #4 */ X { "c5" }, /* Foreground color #5 */ X { "c6" }, /* Foreground color #6 */ X { "c7" }, /* Foreground color #7 */ X { "d0" }, /* Background color #0 */ X { "d1" }, /* Background color #1 */ X { "d2" }, /* Background color #2 */ X { "d3" }, /* Background color #3 */ X { "d4" }, /* Background color #4 */ X { "d5" }, /* Background color #5 */ X { "d6" }, /* Background color #6 */ X { "d7" } /* Background color #7 */ X#endif /* COLOR */ X}; X#if COLOR Xstatic int cfcolor = -1; /* Current forground color */ Xstatic int cbcolor = -1; /* Current background color */ X#endif /* COLOR */ Xstatic struct keybind keybind[] = { /* Keybinding list */ X { "bt", SHFT|CTRL|'i' }, /* Back-tab key */ X { "k1", SPEC|'1' }, /* F1 key */ X { "k2", SPEC|'2' }, /* F2 key */ X { "k3", SPEC|'3' }, /* F3 key */ X { "k4", SPEC|'4' }, /* F4 key */ X { "k5", SPEC|'5' }, /* F5 key */ X { "k6", SPEC|'6' }, /* F6 key */ X { "k7", SPEC|'7' }, /* F7 key */ X { "k8", SPEC|'8' }, /* F8 key */ X { "k9", SPEC|'9' }, /* F9 key */ X { "k0", SPEC|'0' }, /* F0 or F10 key */ X { "k;", SPEC|'0' }, /* F0 or F10 key (kjc) */ X { "kA", CTRL|'O' }, /* Insert line key */ X { "kb", CTRL|'H' }, /* Backspace key */ X { "kC", CTRL|'L' }, /* Clear screen key */ X { "kD", CTRL|'D' }, /* Delete character key */ X { "kd", CTRL|'N' }, /* Down arrow key */ X { "kE", CTRL|'K' }, /* Clear to end of line key */ X { "kF", CTLX|0x0e}, /* Scroll forward key (hm) */ X { "kH", META|'>' }, /* Home down key */ X { "@7", META|'>' }, /* Home down key (kjc) */ X { "kh", META|'<' }, /* Home key */ X { "kI", CTRL|'C' }, /* Insert character key */ X { "kL", CTRL|'K' }, /* Delete line key */ X { "kl", CTRL|'B' }, /* Left arrow key */ X { "kN", CTRL|'V' }, /* Next page key */ X { "kP", CTRL|'Z' }, /* Previous page key */ X { "kR", CTLX|0x10}, /* Scroll backward key (hm) */ X { "kr", CTRL|'F' }, /* Right arrow key */ X { "ku", CTRL|'P' } /* Up arrow key */ X}; X#endif /* TERMCAP */ Xstatic int inbuf[NINCHAR]; /* Input buffer */ Xstatic int * inbufh = /* Head of input buffer */ X inbuf; Xstatic int * inbuft = /* Tail of input buffer */ X inbuf; X#if TERMCAP Xstatic unsigned char outbuf[NOUTCHAR]; /* Output buffer */ Xstatic unsigned char * outbuft = /* Output buffer tail */ X outbuf; X#endif /* TERMCAP */ Xstatic unsigned char keyseq[256]; /* Prefix escape sequence table */ Xstatic struct keyent keymap[NKEYENT]; /* Key map */ Xstatic struct keyent * nxtkey = /* Next free key entry */ X keymap; Xstatic DIR *dirptr = NULL; /* Current directory stream */ Xstatic char path[NFILEN]; /* Path of file to find */ Xstatic char rbuf[NFILEN]; /* Return file buffer */ Xstatic char *nameptr; /* Ptr past end of path in rbuf */ X X/** Terminal definition block **/ Xint scopen(), scclose(), ttgetc(), ttputc(), ttflush(); Xint scmove(), sceeol(), sceeop(), scbeep(), screv(); Xint sckopen(), sckclos(); X#if COLOR Xint scfcol(), scbcol(); X#endif /* COLOR */ XTERM term = { X 60, /* Maximum number of rows */ X 0, /* Current number of rows */ X 132, /* Maximum number of columns */ X 0, /* Current number of columns */ X MARGIN, /* Margin for extending lines */ X SCRSIZ, /* Scroll size for extending */ X 0, 0, /* upper left corner default screen */ X NPAUSE, /* # times thru update to pause */ X scopen, /* Open terminal routine */ X scclose, /* Close terminal routine */ X sckopen, /* Open keyboard routine */ X sckclos, /* Close keyboard routine */ X ttgetc, /* Get character routine */ X ttputc, /* Put character routine */ X ttflush, /* Flush output routine */ X scmove, /* Move cursor routine */ X sceeol, /* Erase to end of line routine */ X sceeop, /* Erase to end of page routine */ X sceeop, /* Clear the desktop */ X scbeep, /* Beep! routine */ X screv, /* Set reverse video routine */ X scnothing, /* Set resolution routine */ X#if COLOR X scfcol, /* Set forground color routine */ X scbcol /* Set background color routine */ X#endif /* COLOR */ X}; X Xint hpterm; /* flag braindead hp-terminal ... */ Xint hpfkey; /* flag terminal has hp-like fkey-labels */ X X/** Open terminal device **/ Xint ttopen() X{ X#if BSD X /* Get tty modes */ X if (ioctl(0, TIOCGETP, &oldsgtty) || X ioctl(0, TIOCGETC, &oldtchars) || X ioctl(0, TIOCGLTC, &oldlchars)) X return(-1); X X /* Save to original mode variables */ X cursgtty = oldsgtty; X X /* Set new modes */ X cursgtty.sg_flags |= CBREAK; X cursgtty.sg_flags &= ~(ECHO|CRMOD); X X /* Set tty modes */ X if (ioctl(0, TIOCSETP, &cursgtty) || X ioctl(0, TIOCSETC, blank) || X ioctl(0, TIOCSLTC, blank)) X return(-1); X#endif /* BSD */ X#if USG || SMOS || HPUX || SUN || XENIX X X#if SMOS X /* Extended settings; 890619mhs A3 */ X set_parm(0,-1,-1); X#endif /* SMOS */ X X /* Get modes */ X if (ioctl(0, TCGETA, &oldterm)) { X perror("Cannot TCGETA"); X return(-1); X } X X /* Save to original mode variable */ X curterm = oldterm; X X /* Set new modes */ X/* curterm.c_iflag &= ~(INLCR|ICRNL|IGNCR); /* no ^S and ^Q possible !*/ X curterm.c_iflag &= ~(INLCR|ICRNL|IGNCR|IXON|IXOFF); X curterm.c_lflag &= ~(ICANON|ISIG|ECHO); X curterm.c_cc[VMIN] = 1; X curterm.c_cc[VTIME] = 0; X X#if SMOS X /****THIS IS A BIG GUESS ON MY PART... the code changed X too much between versions for me to be sure this will work - DML */ X X /* Allow multiple (dual) sessions if already enabled */ X curterm.c_lflag = oldterm.c_lflag & ISIG; X X /* Use old SWTCH char if necessary */ X if (curterm.c_lflag != 0) X curterm.c_cc[VSWTCH] = oldterm.c_cc[VSWTCH]; X X /* Copy VTI settings */ X curterm.c_cc[VTBIT] = oldterm.c_cc[VTBIT]; X X /* Extended settings; 890619mhs A3 */ X set_parm(0,-1,-1); X#endif /* SMOS */ X X /* Set tty mode */ X if (ioctl(0, TCSETA, &curterm)) { X perror("Cannot TCSETA"); X return(-1); X } X#endif /* USG || SMOS || HPUX || SUN || XENIX */ X#if AVIION X /* Get modes */ X if (tcgetattr(0, &oldterm)) { X perror("Cannot tcgetattr"); X return(-1); X } X X /* Save to original mode variable */ X curterm = oldterm; X X /* Set new modes */ X curterm.c_iflag &= ~(INLCR|ICRNL|IGNCR); X curterm.c_lflag &= ~(ICANON|ISIG|ECHO); X curterm.c_cc[VMIN] = 1; X curterm.c_cc[VTIME] = 0; X X#if AVIION X /* Set line discipline for Data General */ X curterm.c_line = 0; X#endif /* AVIION */ X X /* Set tty mode */ X if (tcsetattr(0, TCSANOW, &curterm)) { X perror("Cannot tcsetattr"); X return(-1); X } X#endif /* AVIION */ X X /* Success */ X return(0); X} X X/** Close terminal device **/ Xint ttclose() X{ X /* Restore original terminal modes */ X if (reset != (char*)NULL) X write(1, reset, strlen(reset)); X X#if BSD X if (ioctl(0, TIOCSETP, &oldsgtty) || X ioctl(0, TIOCSETC, &oldtchars) || X ioctl(0, TIOCSLTC, &oldlchars)) X return(-1); X#endif /* BSD */ X X#if USG || SMOS || HPUX || SUN || XENIX X#if SMOS X /* Extended settings; 890619mhs A3 */ X set_parm(0,-1,-1); X#endif /* SMOS */ X if (ioctl(0, TCSETA, &oldterm)) X return(-1); X#endif /* USG || SMOS || HPUX || SUN || XENIX */ X X#if AVIION X /* Set tty mode */ X if (tcsetattr(0, TCSANOW, &oldterm)) X return(-1); X#endif /* AVIION */ X X /* Success */ X return(0); X} X X/** Flush output buffer to display **/ Xint ttflush() X{ X#if TERMCAP X int len; X X /* Compute length of write */ X len = outbuft - outbuf; X if (len == 0) X return(0); X X /* Reset buffer position */ X outbuft = outbuf; X X /* Perform write to screen */ X return(write(1, outbuf, len) != len); X#endif /* TERMCAP */ X X#if CURSES X refresh(); X#endif /* CURSES */ X X#ifndef TERMCAP /* otherwise we get a "statement not reached" .. */ X return(0); X#endif X} X X/** Put character onto display **/ Xint ttputc(ch) Xchar ch; /* Character to display */ X{ X#if TERMCAP X /* Check for buffer full */ X if (outbuft == &outbuf[sizeof(outbuf)]) X ttflush(); X X /* Add to buffer */ X *outbuft++ = ch; X#endif /* TERMCAP */ X X#if CURSES X /* Put character on screen */ X addch(ch); X#endif /* CURSES */ X X return(0); X} X X/** Add character sequence to keycode entry **/ Xvoid addkey(seq, fn) Xunsigned char * seq; /* Character sequence */ Xint fn; /* Resulting keycode */ X{ X int first; X struct keyent * cur, * nxtcur; X X /* Skip on null sequences */ X if (!seq) X return; X X /* Skip single character sequences */ X if (strlen(seq) < 2) X return; X X /* If no keys defined, go directly to insert mode */ X first = 1; X if (nxtkey != keymap) { X X /* Start at top of key map */ X cur = keymap; X X /* Loop until matches exhast */ X while (*seq) { X X /* Do we match current character */ X if (*seq == cur->ch) { X X /* Advance to next level */ X seq++; X cur = cur->nxtlvl; X first = 0; X } else { X X /* Try next character on same level */ X nxtcur = cur->samlvl; X X /* Stop if no more */ X if (nxtcur) X cur = nxtcur; X else X break; X } X } X } X X /* Check for room in keymap */ X if (strlen(seq) > NKEYENT - (nxtkey - keymap)) X return; X X /* If first character in sequence is inserted, add to prefix table */ X if (first) X keyseq[*seq] = 1; X X /* If characters are left over, insert them into list */ X for (first = 1; *seq; first = 0) { X X /* Make new entry */ X nxtkey->ch = *seq++; X nxtkey->code = fn; X X /* If root, nothing to do */ X if (nxtkey != keymap) { X X /* Set first to samlvl, others to nxtlvl */ X if (first) X cur->samlvl = nxtkey; X else X cur->nxtlvl = nxtkey; X } X X /* Advance to next key */ X cur = nxtkey++; X } X} X X/** Grab input characters, with wait **/ Xunsigned char grabwait() X{ X#if BSD X unsigned char ch; X X /* Perform read */ X if (read(0, &ch, 1) != 1) { X puts("** Horrible read error occured **"); X exit(1); X } X return(ch); X#endif /* BSD */ X#if USG || SMOS || HPUX || SUN || XENIX || AVIION X unsigned char ch; X X /* Change mode, if necessary */ X if (curterm.c_cc[VTIME]) { X curterm.c_cc[VMIN] = 1; X curterm.c_cc[VTIME] = 0; X#if USG || SMOS || HPUX || SUN || XENIX X ioctl(0, TCSETA, &curterm); X#endif /* USG || SMOS || HPUX || SUN || XENIX */ X#if AVIION X tcsetattr(0, TCSANOW, &curterm); X#endif /* AVIION */ X } X X /* Perform read */ X if (read(0, &ch, 1) != 1) { X puts("** Horrible read error occured **"); X exit(1); X } X X /* Return new character */ X return(ch); X#endif /* USG || SMOS || HPUX || SUN || XENIX || AVIION */ X} X X/** Grab input characters, short wait **/ Xunsigned char grabnowait() X{ X#if BSD X static struct timeval timout = { 0, 500000L }; X int count, r; X X /* Select input */ X r = 1; X count = select(1, &r, NULL, NULL, &timout); X if (count == 0) X return(TIMEOUT); X if (count < 0) { X puts("** Horrible select error occured **"); X exit(1); X } X X /* Perform read */ X return(grabwait()); X#endif /* BSD */ X#if USG || SMOS || HPUX || SUN || XENIX || AVIION X int count; X unsigned char ch; X X /* Change mode, if necessary */ X if (curterm.c_cc[VTIME] == 0) { X curterm.c_cc[VMIN] = 0; X curterm.c_cc[VTIME] = 5; X#if USG || SMOS || HPUX || SUN || XENIX X ioctl(0, TCSETA, &curterm); X#endif /* USG || SMOS || HPUX || SUN || XENIX */ X#if AVIION X tcsetattr(0, TCSANOW, &curterm); X#endif /* AVIION */ X } X X /* Perform read */ X count = read(0, &ch, 1); X if (count < 0) { X puts("** Horrible read error occured **"); X exit(1); X } X if (count == 0) X return(TIMEOUT); X X /* Return new character */ X return(ch); X#endif /* USG || SMOS || HPUX || SUN || XENIX || AVIION */ X} X X/** Queue input character **/ Xvoid qin(ch) Xint ch; /* Character to add */ X{ X /* Check for overflow */ X if (inbuft == &inbuf[sizeof(inbuf)]) { X X /* Annoy user */ X scbeep(); X return; X } X X /* Add character */ X *inbuft++ = ch; X} X X/** Cook input characters **/ Xvoid cook() X{ X unsigned char ch; X struct keyent * cur; X X /* Get first character untimed */ X ch = grabwait(); X qin(ch); X X /* Skip if the key isn't a special leading escape sequence */ X if (keyseq[ch] == 0) X return; X X /* Start at root of keymap */ X cur = keymap; X X /* Loop until keymap exhasts */ X while (cur) { X X /* Did we find a matching character */ X if (cur->ch == ch) { X X /* Is this the end */ X if (cur->nxtlvl == NULL) { X X /* Replace all character with new sequence */ X inbuft = inbuf; X qin(cur->code); X return; X } else { X /* Advance to next level */ X cur = cur->nxtlvl; X X /* Get next character, timed */ X ch = grabnowait(); X if (ch == TIMEOUT) X return; X X /* Queue character */ X qin(ch); X } X } else X /* Try next character on same level */ X cur = cur->samlvl; X } X} X X/** Return cooked characters **/ Xint ttgetc() X{ X int ch; X X /* Loop until character found */ X while (1) { X X /* Get input from buffer, if available */ X if (inbufh != inbuft) { X ch = *inbufh++; X if (inbufh == inbuft) X inbufh = inbuft = inbuf; X break; X } else X X /* Fill input buffer */ X cook(); X } X X /* Return next character */ X return(ch); X} X X#if TYPEAH Xint typahead() X{ X int count; X X /* See if internal buffer is non-empty */ X if (inbufh != inbuft) X return(1); X X /* Now check with system */ X#ifdef FIONREAD /* Watch out! This could bite you! */ X /* Get number of pending characters */ X if (ioctl(0, FIONREAD, &count)) X return(0); X return(count); X#else /* not FIONREAD */ X#ifdef VAT X return(0); X#else /* not VAT */ X /* Ask hardware for count */ X count = ioctl(0, FIORDCHK, 0); X if (count < 0) X return(0); X return(count); X#endif /* VAT */ X#endif /* FIONREAD */ X} X#endif /* TYPEAH */ X X#if TERMCAP X/** Put out sequence, with padding **/ Xvoid putpad(seq) Xchar * seq; /* Character sequence */ X{ X /* Check for null */ X if (!seq) X return; X X /* Call on termcap to send sequence */ X tputs(seq, 1, ttputc); X} X#endif /* TERMCAP */ X X/** Initialize screen package **/ Xint scopen() X{ X#if TERMCAP X char * cp, tcbuf[1024]; X int status; X struct capbind * cb; X struct keybind * kp; X X char * getenv(), * tgetstr(); X X#ifndef VAT X#define TGETSTR(a,b) tgetstr((a), (b)) X#else X#define TGETSTR(a,b) tgetstr((a), *(b)) X#endif X X#if HPUX || VAT X /* HP-UX doesn't seem to have these in the termcap library */ X char PC, * UP; X short ospeed; X#else /* not HPUX */ X extern char PC, * UP; X extern short ospeed; X#endif /* HPUX */ X X /* Get terminal type */ X cp = getenv("TERM"); X if (!cp) { X puts("Environment variable \"TERM\" not define!"); X exit(1); X } X X /* Try to load termcap */ X status = tgetent(tcbuf, cp); X if (status == -1) { X puts("Cannot open termcap file"); X exit(1); X } X if (status == 0) { X printf("No entry for terminal type \"%s\"\n", cp); X exit(1); X } X X /* Get size from termcap */ X term.t_nrow = tgetnum("li") - 1; X term.t_ncol = tgetnum("co"); X if (term.t_nrow < 3 || term.t_ncol < 3) { X puts("Screen size is too small!"); X exit(1); X } X X /* Start grabbing termcap commands */ X cp = tcapbuf; X X /* Get the reset string */ X reset = TGETSTR("is", &cp); X X /* Get the pad character */ X if (tgetstr("pc", &cp)) X PC = tcapbuf[0]; X X /* Get up line capability */ X UP = TGETSTR("up", &cp); X X /* Get other capabilities */ X cb = capbind; X while (cb < &capbind[sizeof(capbind)/sizeof(*capbind)]) { X cb->store = TGETSTR(cb->name, &cp); X cb++; X } X X /* Check for minimum */ X if (!capbind[CAP_CL].store && (!capbind[CAP_CM].store || !UP)) { X puts("This terminal doesn't have enough power to run microEmacs!"); X exit(1); X } X X /* Set reverse video and erase to end of line */ X if (capbind[CAP_SO].store && capbind[CAP_SE].store) X revexist = TRUE; X if (!capbind[CAP_CE].store) X eolexist = FALSE; X X /* Get keybindings */ X kp = keybind; X while (kp < &keybind[sizeof(keybind)/sizeof(*keybind)]) { X addkey(TGETSTR(kp->name, &cp), kp->value); X kp++; X } X X hpterm = tgetflag("xs"); /* working on HP-Terminal ??? -hm */ X hpfkey = tgetflag("Xs"); /* hp-like fkey-labels */ X X /* Open terminal device */ X if (ttopen()) { X puts("Cannot open terminal"); X exit(1); X } X X /* Set speed for padding sequences */ X#if BSD X ospeed = cursgtty.sg_ospeed; X#endif /* BSD */ X#if USG || SMOS || HPUX || SUN || XENIX X ospeed = curterm.c_cflag & CBAUD; X#endif /* USG || SMOS || HPUX || SUN || XENIX */ X#if AVIION X ospeed = cfgetospeed(&curterm); X#endif /* AVIION */ X X /* Send out initialization sequences */ X putpad(capbind[CAP_IS].store); X/* putpad(capbind[CAP_KS].store); /* -hm */ X sckopen(); /* -hm */ X#endif /* TERMCAP */ X X#if CURSES X /* Initialize screen */ X initscr(); X X /* Set size of screen */ X term.t_nrow = LINES - 1; X term.t_ncol = COLS; X X /* Open terminal device */ X if (ttopen()) { X puts("Cannot open terminal"); X exit(1); X } X#endif /* CURSES */ X X /* Success */ X return(0); X} X X/** Close screen package **/ Xint scclose() X{ X#if TERMCAP X /* Turn off keypad mode */ X/* putpad(capbind[CAP_KE].store); /* -hm */ X sckclos(); /* -hm */ X /* Close terminal device */ X ttclose(); X#endif /* TERMCAP */ X X#if CURSES X /* Turn off curses */ X endwin(); X X /* Close terminal device */ X ttclose(); X#endif /* CURSES */ X /* Success */ X return(0); X} X X/* open keyboard -hm */ Xint sckopen() X{ X#ifdef TERMCAP X putpad(capbind[CAP_KS].store); X ttflush(); X dis_ufk(); X#endif X} X X/* close keyboard -hm */ Xint sckclos() X{ X#ifdef TERMCAP X putpad(capbind[CAP_KE].store); X ttflush(); X dis_sfk(); X#endif X} X X/** Move cursor **/ Xint scmove(row, col) Xint row; /* Row number */ Xint col; /* Column number */ X{ X char *tgoto(); X#if TERMCAP X /* Call on termcap to create move sequence */ X putpad(tgoto(capbind[CAP_CM].store, col, row)); X#endif /* TERMCAP */ X X#if CURSES X move(row, col); X#endif /* CURSES */ X X /* Success */ X return(0); X} X X/** Erase to end of line **/ Xint sceeol() X{ X#if TERMCAP X /* Send erase sequence */ X putpad(capbind[CAP_CE].store); X#endif /* TERMCAP */ X X#if CURSES X clrtoeol(); X#endif /* CURSES */ X X /* Success */ X return(0); X} X X/** Clear screen **/ Xint sceeop() X{ X#if TERMCAP X#if COLOR X scfcol(gfcolor); X scbcol(gbcolor); X#endif /* COLOR */ X /* Send clear sequence */ X putpad(capbind[CAP_CL].store); X#endif /* TERMCAP */ X X#if CURSES X erase(); X#endif /* CURSES */ X X X /* Success */ X return(0); X} X X/** Set reverse video state **/ Xint screv(state) Xint state; /* New state */ X{ X#if TERMCAP X#if COLOR X int ftmp, btmp; /* temporaries for colors */ X#endif /* COLOR */ X X /* Set reverse video state */ X putpad(state ? capbind[CAP_SO].store : capbind[CAP_SE].store); X X#if COLOR X if (state == FALSE) { X ftmp = cfcolor; X btmp = cbcolor; X cfcolor = -1; X cbcolor = -1; X scfcol(ftmp); X scbcol(btmp); X } X#endif /* COLOR */ X#endif /* TERMCAP */ X X#if CURSES X if (state) X standout(); X else X standend(); X#endif /* CURSES */ X X /* Success */ X return(0); X} X X/** Beep **/ Xscbeep() X{ X#if TERMCAP X#if !NOISY X /* Send out visible bell, if it exists */ X if (capbind[CAP_VB].store) X putpad(capbind[CAP_VB].store); X else X#endif /* not NOISY */ X /* The old standby method */ X ttputc('\7'); X#endif /* TERMCAP */ X X#if CURSES X addch('\7'); /* FIX THIS! beep() and flash comes up undefined */ X#endif /* CURSES */ X X /* Success */ X return(0); X} X X#if COLOR X/** Set foreground color **/ Xint scfcol(color) Xint color; /* Color to set */ X{ X#if TERMCAP X /* Skip if already the correct color */ X if (color == cfcolor) X return(0); X X /* Skip if color isn't defined */ X if (!capbind[CAP_C0].store) X return(0); X X /* Send out color sequence */ X putpad(capbind[CAP_C0 + (color & 7)].store); X X /* Set current color */ X cfcolor = color; X#endif /* TERMCAP */ X X#if CURSES X /* ? */ X#endif /* CURSES */ X return(0); X} X X/** Set background color **/ Xint scbcol(color) Xint color; /* Color to set */ X{ X#if TERMCAP X /* Skip if already the correct color */ X if (color == cbcolor) X return(0); X X /* Skip if color isn't defined */ X if (!capbind[CAP_C0].store) X return(0); X X /* Send out color sequence */ X putpad(capbind[CAP_D0 + (color & 7)].store); X X /* Set current color */ X cbcolor = color; X#endif /* TERMCAP */ X X#if CURSES X /* ? */ X#endif /* CURSES */ X return(0); X} X#endif /* COLOR */ X X/** Set palette **/ Xint spal(cmd) Xchar * cmd; /* Palette command */ X{ X int code, dokeymap; X char * cp; X X /* Check for keymapping command */ X if (strncmp(cmd, "KEYMAP ", 7) == 0) X dokeymap = 1; X else X#if TERMCAP X#if COLOR X if (strncmp(cmd, "CLRMAP ", 7) == 0) X dokeymap = 0; X else X#endif /* COLOR */ X#endif /* TERMCAP */ X return(0); X cmd += 7; X X /* Look for space */ X for (cp = cmd; *cp != '\0'; cp++) X if (*cp == ' ') { X *cp++ = '\0'; X break; X } X if (*cp == '\0') X return(1); X X /* Perform operation */ X if (dokeymap) { X X /* Convert to keycode */ X code = stock(cmd); X X /* Add to tree */ X addkey(cp, code); X } X#if TERMCAP X#if COLOR X else { X X /* Convert to color number */ X code = atoi(cmd); X if (code < 0 || code > 15) X return(1); X X /* Move color code to capability structure */ X capbind[CAP_C0 + code].store = malloc(strlen(cp) + 1); X if (capbind[CAP_C0 + code].store) X strcpy(capbind[CAP_C0 + code].store, cp); X } X#endif /* COLOR */ X#endif /* TERMCAP */ X return(0); X} X X#if BSD || SUN || HPUX || AVIION X/* Surely more than just BSD systems do this */ X X/** Perform a stop signal **/ Xint bktoshell(f, n) X{ X /* Reset the terminal and go to the last line */ X vttidy(); X X /* Okay, stop... */ X kill(getpid(), SIGTSTP); X X /* We should now be back here after resuming */ X X /* Reopen the screen and redraw */ X scopen(); X curwp->w_flag = WFHARD; X sgarbf = TRUE; X X /* Success */ X return(0); X} X X#endif /* BSD || SUN || HPUX || AVIION */ X X/** Get time of day **/ Xchar * timeset() X{ X long int buf; /* Should be time_t */ X char * sp, * cp; X X char * ctime(); X X /* Get system time */ X time(&buf); X X /* Pass system time to converter */ X sp = ctime(&buf); X X /* Eat newline character */ X for (cp = sp; *cp; cp++) X if (*cp == '\n') { X *cp = '\0'; X break; X } X return(sp); X} X X#if USG || SMOS || HPUX || XENIX X/** Rename a file **/ Xint rename(file1, file2) Xchar * file1; /* Old file name */ Xchar * file2; /* New file name */ X{ X struct stat buf1; X struct stat buf2; X X /* No good if source file doesn't exist */ X if (stat(file1, &buf1)) X return(-1); X X /* Check for target */ X if (stat(file2, &buf2) == 0) { X X /* See if file is the same */ X if (buf1.st_dev == buf2.st_dev && X buf1.st_ino == buf2.st_ino) X X /* Not necessary to rename file */ X return(0); X } X X /* Get rid of target */ X unlink(file2); X X /* Link two files together */ X if (link(file1, file2)) X return(-1); X X /* Unlink original file */ X return(unlink(file1)); X} X#endif /* USG || SMOS || HPUX || XENIX */ X X/** Callout to system to perform command **/ Xint callout(cmd) Xchar * cmd; /* Command to execute */ X{ X int status; X X /* Close down */ X scmove(term.t_nrow, 0); X ttflush(); X sckclos(); /* -hm */ X ttclose(); X X /* Do command */ X status = system(cmd) == 0; X X /* Restart system */ X sgarbf = TRUE; X sckopen(); /* -hm */ X if (ttopen()) { X puts("** Error reopening terminal device **"); X exit(1); X } X X /* Success */ X return(status); X} X X/** Create subshell **/ Xint spawncli(f, n) Xint f; /* Flags */ Xint n; /* Argument count */ X{ X char * sh; X X char * getenv(); X X /* Don't allow this command if restricted */ X if (restflag) X return(resterr()); X X /* Get shell path */ X sh = getenv("SHELL"); X if (!sh) X#if BSD || SUN X sh = "/bin/csh"; X#endif /* BSD || SUN */ X#if USG || SMOS || HPUX || XENIX || AVIION X sh = "/bin/sh"; X#endif /* USG || SMOS || HPUX || XENIX || AVIION */ X X /* Do shell */ X return(callout(sh)); X} X X/** Spawn a command **/ Xint spawn(f, n) Xint f; /* Flags */ Xint n; /* Argument count */ X{ X char line[NLINE]; X int s; X X /* Don't allow this command if restricted */ X if (restflag) X return(resterr()); X X /* Get command line */ X s = mlreply("!", line, NLINE); X if (!s) X return(s); X X /* Perform the command */ X s = callout(line); X X /* if we are interactive, pause here */ X if (clexec == FALSE) { X mlwrite("[End]"); X ttflush(); X ttgetc(); X } X return(s); X} X X/** Execute program **/ Xint execprg(f, n) Xint f; /* Flags */ Xint n; /* Argument count */ X{ X /* Same as spawn */ X return(spawn(f, n)); X} X X/** Pipe output of program to buffer **/ Xint pipecmd(f, n) Xint f; /* Flags */ Xint n; /* Argument count */ X{ X char line[NLINE]; X int s; X BUFFER * bp; X WINDOW * wp; X static char filnam[] = "command"; X X /* Don't allow this command if restricted */ X if (restflag) X return(resterr()); X X /* Get pipe-in command */ X s = mlreply("@", line, NLINE); X if (!s) X return(s); X X /* Get rid of the command output buffer if it exists */ X bp = bfind(filnam, FALSE, 0); X if (bp) { X /* Try to make sure we are off screen */ X wp = wheadp; X while (wp) { X if (wp->w_bufp == bp) { X onlywind(FALSE, 1); X break; X } X wp = wp->w_wndp; X } X if (!zotbuf(bp)) X return(0); X } X X /* Add output specification */ X strcat(line, ">"); X strcat(line, filnam); X X /* Do command */ X s = callout(line); X if (!s) X return(s); X X /* Split the current window to make room for the command output */ X if (!splitwind(FALSE, 1)) X return(0); X X /* ...and read the stuff in */ X if (!getfile(filnam, FALSE)) X return(0); X X /* Make this window in VIEW mode, update all mode lines */ X curwp->w_bufp->b_mode |= MDVIEW; X wp = wheadp; X while (wp) { X wp->w_flag |= WFMODE; X wp = wp->w_wndp; X } X X /* ...and get rid of the temporary file */ X unlink(filnam); X return(1); X} X X/** Filter buffer through command **/ Xint filter(f, n) Xint f; /* Flags */ Xint n; /* Argument count */ X{ X char line[NLINE], tmpnam[NFILEN]; X int s; X BUFFER * bp; X static char bname1[] = "fltinp"; X static char filnam1[] = "fltinp"; X static char filnam2[] = "fltout"; X X /* Don't allow this command if restricted */ X if (restflag) X return(resterr()); X X /* Don't allow filtering of VIEW mode buffer */ X if (curbp->b_mode & MDVIEW) X return(rdonly()); X X /* Get the filter name and its args */ X s = mlreply("#", line, NLINE); X if (!s) X return(s); X X /* Setup the proper file names */ X bp = curbp; X strcpy(tmpnam, bp->b_fname); /* Save the original name */ X strcpy(bp->b_fname, bname1); /* Set it to our new one */ X X /* Write it out, checking for errors */ X if (!writeout(filnam1, "w")) { X mlwrite("[Cannot write filter file]"); X strcpy(bp->b_fname, tmpnam); X return(0); X } X X /* Setup input and output */ X strcat(line," <fltinp >fltout"); X X /* Perform command */ X s = callout(line); X X /* If successful, read in file */ X if (s) { X s = readin(filnam2, FALSE); X if (s) X /* Mark buffer as changed */ X bp->b_flag |= BFCHG; X } X X X /* Reset file name */ X strcpy(bp->b_fname, tmpnam); X X /* and get rid of the temporary file */ X unlink(filnam1); X unlink(filnam2); X X /* Show status */ X if (!s) X mlwrite("[Execution failed]"); X return(s); X} X X/** Get first filename from pattern **/ Xchar *getffile(fspec) Xchar *fspec; /* Filename specification */ X{ X int index, point, extflag; X X /* First parse the file path off the file spec */ X strcpy(path, fspec); X index = strlen(path) - 1; X while (index >= 0 && (path[index] != '/' && X path[index] != '\\' && path[index] != ':')) X --index; X path[index+1] = '\0'; X X X /* Check for an extension */ X point = strlen(fspec) - 1; X extflag = FALSE; X while (point >= 0) { X if (fspec[point] == '.') { X extflag = TRUE; X break; X } X point--; X } X X /* Open the directory pointer */ X if (dirptr) { X closedir(dirptr); X dirptr = NULL; X } X X dirptr = opendir((path[0] == '\0') ? "./" : path); X X if (!dirptr) X return(NULL); X X strcpy(rbuf, path); X nameptr = &rbuf[strlen(rbuf)]; X X /* ...and call for the first file */ X return(getnfile()); X} X X/** Get next filename from pattern **/ Xchar *getnfile() X{ X int index; X struct DIRENTRY * dp; X struct stat fstat; X X /* ...and call for the next file */ X do { X dp = readdir(dirptr); X if (!dp) X return(NULL); X X /* Check to make sure we skip all weird entries except directories */ X strcpy(nameptr, dp->d_name); X X } while (stat(rbuf, &fstat) && X ((fstat.st_mode & S_IFMT) && (S_IFREG || S_IFDIR)) == 0); X X /* if this entry is a directory name, say so */ X if ((fstat.st_mode & S_IFMT) == S_IFDIR) X strcat(rbuf, DIRSEPSTR); X X /* Return the next file name! */ X return(rbuf); X} X X#if FLABEL X/*---------------------------------------------------------------------------* X X handle the function keys and function key labels on HP-Terminals X ----------------------------------------------------------------- X X Hellmuth Michaelis 1989,1990,1991 X Eggerstedtstr. 28 X 2000 Hamburg 50 X Germany e-mail: hm@hcshh.hcs.de X X *---------------------------------------------------------------------------*/ X Xstatic unsigned char flabstor[8][50]; /* label & xmit backup store */ Xstatic char flabstof[8] = {0,0,0,0,0,0,0,0}; /* filled flag */ X Xint fnclabel(f, n) /* label a function key */ Xint f; /* argument supplied ?? */ Xint n; /* function key number 1...8 on hp-terminals */ X{ X char lbl[20]; /* label string buffer */ X char xmit[5]; /* transmitted string ( ESC 'p'...'w' ) */ X char buf[80]; /* writeout buffer */ X int i; /* general purpose index */ X int status; /* return status */ X X if(!hpterm && !hpfkey)/* check if we are connected to an hp-terminal */ X return(FALSE); X X if (f == FALSE) X { X mlwrite("%Need function key number"); X return(FALSE); X } X X /* and it must be a legal key number */ X X if (n < 1 || n > 8) X { X mlwrite("%Function key number out of range"); X return(FALSE); X } X X /* get the string to send */ X X lbl[0] = '\0'; /* we don't now the label yet */ X X if((status = mlreply("Enter Label String: ", lbl, 19)) != TRUE) X return(status); X X lbl[16] = '\0'; X X if((i = strlen(lbl)) > 16) X i = 16; X X xmit[0] = 0x1b; X xmit[1] = 'o' + n; X xmit[2] = '\0'; X X sprintf(flabstor[n-1],"%c&f0a%dk%dd2L%s%s",(char)0x1b,n,i,lbl,xmit); X write(1,flabstor[n-1],strlen(flabstor[n-1])); X flabstof[n-1] = 1; X X sprintf(buf,"%c&jB",(char)0x1b); X write(1,buf,strlen(buf)); X X return(TRUE); X} X X/* display user function key labels */ Xstatic dis_ufk() X{ X int i = 0; X char buf[16]; X X if(!hpterm && !hpfkey) X return; X X do X { X if(flabstof[i]) X write(1,flabstor[i],strlen(flabstor[i])); X } X while(i++ < 8); X sprintf(buf,"%c&jB",(char)0x1b); X write(1,buf,strlen(buf)); X} X X/* display system function key labels */ Xstatic dis_sfk() X{ X char buf[16]; X X if(!hpterm && !hpfkey) X return; X sprintf(buf,"%c&jA",(char)0x1b); X write(1,buf,strlen(buf)); X} X#endif /* FLABEL */ X X X#if XENIX && FILOCK Xint mkdir(name, mode) Xchar *name; /* name of directory to create */ Xint mode; /* umask for creation (which we blissfully ignore...) */ X{ X char buf[80]; X X strcpy(buf, "mkdir "); X strcat(buf, name); X strcat(buf, " > /dev/null 2>&1"); X return(system(buf)); X} X Xint rmdir(name) Xchar *name; /* name of directory to delete */ X{ X char buf[80]; X X strcpy(buf,"rmdir "); X strcat(buf, name); X strcat(buf, " > /dev/null 2>&1"); X return(system(buf)); X} X#endif /* XENIX & FILOCK */ X X#endif /* BSD || USG || SMOS || HPUX || SUN || XENIX || AVIION */ SHAR_EOF $TOUCH -am 0112125693 Support/uemacs/unix.c-3.11a && chmod 0640 Support/uemacs/unix.c-3.11a || echo "restore of Support/uemacs/unix.c-3.11a failed" set `wc -c Support/uemacs/unix.c-3.11a`;Wc_c=$1 if test "$Wc_c" != "38978"; then echo original size 38978, current size $Wc_c fi fi # ============= Support/fonts/vt100pc.814.uu ============== if test ! -d 'Support/fonts'; then echo "x - creating directory Support/fonts" mkdir 'Support/fonts' fi if test X"$1" != X"-c" -a -f 'Support/fonts/vt100pc.814.uu'; then echo "File already exists: skipping 'Support/fonts/vt100pc.814.uu'" else echo "x - extracting Support/fonts/vt100pc.814.uu (Text)" sed 's/^X//' << 'SHAR_EOF' > Support/fonts/vt100pc.814.uu && Xbegin 660 vt100pc.814 XM`$1D5$Q$`"`@("`^````/$`X!'@`(B(^(B(````\0#@$>``B%`@4(@```'Q` XM>$!\`"(4"!0B````?$!X0'P`/@@("`@```!\0'A`?``<(B(J'`(``#A$?$1$ XM`"0H,"@D````>$1X1'@`("`@(#X```!X1'A$>``>(!P"/````$1$?$1$`#X( XM"`@(````0$!`0'P`/B`\("````!$1$0H$``^"`@("````'Q`>$!``#X@/"`@ XM````/$!`0#P`/"(\)"(````\0#@$>``<(B(B'````#Q`.`1X`!P("`@<```` XM>$1$1'@`("`@(#X```!X1$1$>``$#`0$#@```'A$1$1X`!PB#!`^````>$1$ XM1'@`'`(,`AP```!X1$1$>``$"!(^`@```$1D5$Q$`"(D."0B````/$`X!'@` XM(A0("`@```!\0'A`?``\(CPB/````#Q`0$`\`"(R*B8B````?$!X0'P`(C8J XM(B(````\0#@$>``B(B(B'````'Q`>$!\`!X@("`>````?$!X0$``'B`<`CP` XM```\0$Q$/``>(!P"/````'A$>$A$`!X@'`(\````1$1$1#@`'B`<`CP````` XM```````````````````8/#P\&!@`&!@`````8V-C(@``````````````-C9_ XM-C8V?S8V````#`P^8V%@/@-#8SX,#```````86,&#!@S8P``````'#8V'#MN XM9F8[`````#`P,&````````````````P8,#`P,#`8#```````&`P&!@8&!@P8 XM`````````&8\_SQF```````````8&!C_&!@8````````````````&!@8,``` XM````````_P`````````````````````8&````````0,&#!@P8$`````````^ XM8V=O>W-C8SX```````P</`P,#`P,/P``````/F,#!@P8,&-_```````^8P,# XM'@,#8SX```````8.'C9F?P8&#P``````?V!@8'X#`V,^```````<,&!@?F-C XM8SX``````']C`P8,&!@8&```````/F-C8SYC8V,^```````^8V-C/P,#!CP` XM```````8&````!@8`````````!@8````&!@P```````&#!@P8#`8#`8````` XM`````'X``'X`````````8#`8#`8,&#!@```````^8V,&#`P`#`P``````#YC XM8V]O;VY@/@``````"!PV8V-_8V-C``````!^,S,S/C,S,WX``````!XS86!@ XM8&$S'@``````?#8S,S,S,S9\``````!_,3$T/#0Q,7\``````'\Q,30\-#`P XM>```````'C-A8&!O8S,=``````!C8V-C?V-C8V,``````#P8&!@8&!@8/``` XM````#P8&!@8&9F8\``````!S,S8V/#8V,W,``````'@P,#`P,#$Q?P`````` XMP^?_V\/#P\/#``````!C<WM_;V=C8V,``````!PV8V-C8V,V'```````?C,S XM,SXP,#!X```````^8V-C8VMO/@8'`````'XS,S,^-C,S<P``````/F-C,!P& XM8V,^``````#_F9D8&!@8&#P``````&-C8V-C8V-C/@``````P\/#P\/#9CP8 XM``````##P\/#V]O_9F8``````,/#9CP8/&;#PP``````P\/#9CP8&!@\```` XM``#_@X8,&#!AP?\``````#PP,#`P,#`P/```````0&!P.!P.!P,!```````\ XM#`P,#`P,##P````('#9C`````````````````````````````/\`&!@,```` XM`````````````````#P&/F9F.P``````<#`P/#8S,S-N```````````^8V!@ XM8SX```````X&!AXV9F9F.P``````````/F-_8&,^```````<-C(P?#`P,'@` XM`````````#MF9F8^!F8\````<#`P-CLS,S-S```````,#``<#`P,#!X````` XM``8&``X&!@8&9F8\````<#`P,S8\-C-S```````<#`P,#`P,#!X````````` XM`.;_V]O;VP``````````;C,S,S,S```````````^8V-C8SX``````````&XS XM,S,^,#!X````````.V9F9CX&!@\```````!N.S,P,'@``````````#YC.`YC XM/@``````"!@8?A@8&!L.``````````!F9F9F9CL``````````,/#PV8\&``` XM````````P\/;V_]F``````````!C-AP<-F,``````````&-C8V,_`P8\```` XM````?V8,&#-_```````.&!@8<!@8&`X``````!@8&!@`&!@8&```````<!@8 XM&`X8&!AP```````[;@``````````````J@"J`*H`J@"J`*H`J@``/&;"P,#" XM9CP,!GP```#,S`#,S,S,S'8`````#!@P`'S&_L#&?``````0.&P`>`Q\S,QV XM``````#,S`!X#'S,S'8`````8#`8`'@,?,S,=@`````X;#@`>`Q\S,QV```` XM`````'C,P,QX&`QX````$#AL`'S&_L#&?```````S,P`?,;^P,9\`````&`P XM&`!\QO[`QGP``````,S,`'`P,#`P>``````P>,P`<#`P,#!X`````,!@,`!P XM,#`P,'@`````QL80.&S&QO[&Q@```#AL.``X;,;&_L;&````&#!@`/YB8'Q@ XM8OX`````````;+H2?I"8?@``````/FS,S/[,S,S.`````!`X;`!\QL;&QGP` XM`````,;&`'S&QL;&?`````!@,!@`?,;&QL9\`````#!XS`#,S,S,S'8````` XM8#`8`,S,S,S,=@``````QL8`QL;&QGX&#'@``,;&.&S&QL;&;#@`````QL8` XMQL;&QL;&?``````("'[(R,C(?@@(`````#AL9&#P8&!@YOP``````,9L.!#^ XM$/X0$`````#XS,SXQ,S>S,SF`````!PT,#`P_#`P,#"PX```&#!@`'@,?,S, XM=@`````,&#``.!@8&!@\`````!@P8`!\QL;&QGP`````&#!@`,S,S,S,=@`` XM````=MP`W&9F9F9F````=MP`QN;V_M[.QL8`````/&QL/@!^```````````X XM;&PX`'P````````````P,``P,&#&QGP```````````!_8&!@```````````` XM`'\!`0$``````,#`QLS8,&#<A@P8/@``P,#&S-@P9LZ:/@8&````&!@`&!@\ XM/#P8`````````#9LV&PV````````````V&PV;-@``````"*((H@BB"*((H@B XMB"*(JE2J5*I4JE2J5*I4JE2Z[KKNNNZZ[KKNNNZZ[A@8&!@8&!@8&!@8&!@8 XM&!@8&!@8&/@8&!@8&!@8&!@8&/@8^!@8&!@8V-C8V-C;V-C8V-C8V```` XM`````/XV-C8V-C8``````/@8^!@8&!@8V-C8V]@;V-C8V-C8V-C8V-C8V XM-C8V-C8V-C8``````/X&]C8V-C8V-C8V-C8V]@;^````````-C8V-C8V-OX` XM```````8&!@8&/@8^`````````````````#X&!@8&!@8&!@8&!@8&!\````` XM```8&!@8&!@8_P````````````````#_&!@8&!@8&!@8&!@8&!\8&!@8&!@` XM````````_P```````!@8&!@8&!C_&!@8&!@8&!@8&!@?&!\8&!@8&!@V-C8V XM-C8V-S8V-C8V-C8V-C8V-S`_```````````````_,#<V-C8V-C8V-C8V-O<` XM_P``````````````_P#W-C8V-C8V-C8V-C8W,#<V-C8V-C8``````/\`_P`` XM`````#8V-C8V]P#W-C8V-C8V&!@8&!C_`/\````````V-C8V-C8V_P`````` XM````````_P#_&!@8&!@8`````````/\V-C8V-C8V-C8V-C8V/P```````!@8 XM&!@8'Q@?```````````````?&!\8&!@8&!@`````````/S8V-C8V-C8V-C8V XM-C;_-C8V-C8V&!@8&!C_&/\8&!@8&!@8&!@8&!@8^``````````````````? XM&!@8&!@8__________________\`````````__________#P\/#P\/#P\/#P XM\/#P#P\/#P\/#P\/#P\/#P__________````````````````=MS8V-QV```` XM`````'S&_,;&_,#`0````/[&QL#`P,#`P`````````#^;&QL;&QL``````#^ XMQF`P&#!@QOX``````````'[8V-C8<`````````!F9F9F?&!@P````````';< XM&!@8&!@``````/PP>,S,S'@P_```````.&S&QO[&QFPX```````X;,;&QFQL XM;.X``````#Q@,!A\S,S,>```````````?-;6?``````````&#'S.UN9\8,`` XM`````#A@P,#XP,!@.````````'S&QL;&QL;&````````_@``_@``_@`````` XM`#`P,/PP,#``_```````8#`8#!@P8`#\```````8,&#`8#`8`/P```````X: XM&A@8&!@8&!@8&!@8&!@8&!@86%AP```````P,```_```,#``````````=MP` XM=MP```````!PV-AP````````````````````&!@`````````````````&``` XM```````>&!@8&!C8V'@X`````-AL;&QL;```````````<-@P8,CX```````` X=```````^/CX^/CX````````````````````````` X` Xend SHAR_EOF $TOUCH -am 0112125693 Support/fonts/vt100pc.814.uu && chmod 0640 Support/fonts/vt100pc.814.uu || echo "restore of Support/fonts/vt100pc.814.uu failed" set `wc -c Support/fonts/vt100pc.814.uu`;Wc_c=$1 if test "$Wc_c" != "4968"; then echo original size 4968, current size $Wc_c fi fi echo "End of part 5, continue with part 6" exit 0 -- hellmuth michaelis HCS Hanseatischer Computerservice GmbH hamburg, europe hm@hcshh.hcs.de tel: +49/40/55903-170 fax: +49/40/5591486