summaryrefslogtreecommitdiffstats
path: root/release/picobsd/tinyware
diff options
context:
space:
mode:
authorabial <abial@FreeBSD.org>1998-10-25 03:02:56 +0000
committerabial <abial@FreeBSD.org>1998-10-25 03:02:56 +0000
commit284d59b45f630c86c6e1ff5562752dc60913cc76 (patch)
tree3c148360b296bfd2f93703332c958e9ba506ed87 /release/picobsd/tinyware
parent138aad3569cae2fd5554827209bd5bd5ca9799cb (diff)
downloadFreeBSD-src-284d59b45f630c86c6e1ff5562752dc60913cc76.zip
FreeBSD-src-284d59b45f630c86c6e1ff5562752dc60913cc76.tar.gz
With much regret, I had to remove these two programs - their license
doesn't permit us to distribute them. I think I should take some law classes... Explained by: bde
Diffstat (limited to 'release/picobsd/tinyware')
-rw-r--r--release/picobsd/tinyware/mined/LICENSE77
-rw-r--r--release/picobsd/tinyware/mined/Makefile18
-rw-r--r--release/picobsd/tinyware/mined/README23
-rw-r--r--release/picobsd/tinyware/mined/mined.h377
-rw-r--r--release/picobsd/tinyware/mined/mined1.c2025
-rw-r--r--release/picobsd/tinyware/mined/mined2.c1764
-rw-r--r--release/picobsd/tinyware/msh/LICENSE77
-rw-r--r--release/picobsd/tinyware/msh/Makefile16
-rw-r--r--release/picobsd/tinyware/msh/README16
-rw-r--r--release/picobsd/tinyware/msh/sh.1261
-rw-r--r--release/picobsd/tinyware/msh/sh.h388
-rw-r--r--release/picobsd/tinyware/msh/sh1.c953
-rw-r--r--release/picobsd/tinyware/msh/sh2.c801
-rw-r--r--release/picobsd/tinyware/msh/sh3.c1143
-rw-r--r--release/picobsd/tinyware/msh/sh4.c767
-rw-r--r--release/picobsd/tinyware/msh/sh5.c675
-rw-r--r--release/picobsd/tinyware/msh/sh6.c9
17 files changed, 0 insertions, 9390 deletions
diff --git a/release/picobsd/tinyware/mined/LICENSE b/release/picobsd/tinyware/mined/LICENSE
deleted file mode 100644
index 78e3b69..0000000
--- a/release/picobsd/tinyware/mined/LICENSE
+++ /dev/null
@@ -1,77 +0,0 @@
- LICENSE AGREEMENT AND LIMITED WARRANTY
-
- READ THE FOLLOWING TERMS AND CONDITIONS CAREFULLY BEFORE YOU
- PROCEED. THIS LEGAL DOCUMENT IS AN AGREEMENT BETWEEN YOU AND
- PRENTICE-HALL, INC. (THE "COMPANY"). BY ACCESSING THE SOFTWARE, YOU
- ARE AGREEING TO BE BOUND BY THESE TERMS AND CONDITIONS. IF YOU DO
- NOT AGREE WITH THESE TERMS AND CONDITIONS, DO NOT ACCESS TO SOFTWARE
- AND ALL ACCOMPANYING ITEMS.
-
- 1. GRANT OF LICENSE:
- In consideration of your agreement to abide by the terms and
- conditions of this Agreement, the Company grants to you a
- nonexclusive right to use, display and modify the Software being
- transmitted to you (hereinafter "the Software") for educational and
- research purposes and to include such Software as part of another
- computer program (i) for use by you; or (ii) for use by third
- parties, provided that copies to those third parties are distributed
- for educational or research purposes free of direct or indirect
- charges. If you wish to otherwise use or distribute the Software,
- you must enter into a separate agreement with the Company. To do so,
- please contact the person designated below.
-
- This license shall continue in effect so long as you comply with the
- terms of this Agreement and will automatically terminate if you fail
- to comply. The Company is and shall remain the copyright owner of
- the Software and reserves all rights not expressly granted to you
- under this Agreement. All provisions of this Agreement as to
- warranties, limitation of liability, remedies or damages and
- ownership rights shall survive termination.
-
- 2. MISCELLANEOUS:
- This Agreement shall be construed in accordance with the laws of the
- United States of America and the State of New York and shall benefit
- the Company, its affiliates and assignees.
-
- 3. LIMITED WARRANTY AND DISCLAIMER OF WARRANTY:
- Because this Software is being given to you without charge, the
- Company makes no warranties about the SOFTWARE, which is provided
- "AS-IS." THE COMPANY DISCLAIMS ALL WARRANTIES, EXPRESS OR IMPLIED,
- INCLUDING WITHOUT LIMITATION, THE IMPLIED WARRANTIES OF
- MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE COMPANY
- DOES NOT WARRANT, GUARANTEE OR MAKE ANY REPRESENTATION REGARDING THE
- USE OR THE RESULTS OF THE USE OF THE SOFTWARE. IN NO EVENT SHALL
- THE COMPANY OR ITS EMPLOYEES, AGENTS, SUPPLIERS OR CONTRACTORS BE
- LIABLE FOR ANY INCIDENTAL, INDIRECT, SPECIAL OR CONSEQUENTIAL
- DAMAGES ARISING OUT OF OR IN CONNECTION WITH THE LICENSE GRANTED
- UNDER THIS AGREEMENT INCLUDING, WITHOUT LIMITATION, LOSS OF USE,
- LOSS OF DATA, LOSS OF INCOME OR PROFIT, OR OTHER LOSSES SUSTAINED AS
- A RESULT OF INJURY TO ANY PERSON, OR LOSS OF OR DAMAGE TO PROPERTY,
- OR CLAIMS OF THIRD PARTIES, EVEN IF THE COMPANY OR AN AUTHORIZED
- REPRESENTATIVE OF THE COMPANY HAS BEEN ADVISED OF THE POSSIBILITY OF
- SUCH DAMAGES.
-
- SOME JURISDICTIONS DO NOT ALLOW THE LIMITATION OF IMPLIED WARRANTIES
- OR LIABILITY FOR INCIDENTAL, INDIRECT, SPECIAL OR CONSEQUENTIAL
- DAMAGES, SO THE ABOVE LIMITATIONS MAY NOT ALWAYS APPLY. YOU MAY HAVE
- RIGHTS WHICH VARY IN ACCORDANCE WITH LOCAL LAW.
-
-
- ACKNOWLEDGMENT
-
- YOU ACKNOWLEDGE THAT YOU HAVE READ THIS AGREEMENT, UNDERSTAND IT AND
- AGREE TO BE BOUND BY ITS TERMS AND CONDITIONS. YOU ALSO AGREE THAT
- THIS AGREEMENT IS THE COMPLETE AND EXCLUSIVE STATEMENT OF THE
- AGREEMENT BETWEEN YOU AND THE COMPANY AND SUPERSEDES ALL PROPOSALS
- OR PRIOR AGREEMENTS, ORAL OR WRITTEN, AND ANY OTHER COMMUNICATIONS
- BETWEEN YOU AND THE COMPANY OR ANY REPRESENTATIVE OF THE COMPANY
- RELATING TO THE SUBJECT MATTER OF THIS AGREEMENT.
-
- Should you have any questions concerning this agreement or if you
- wish to contact the Company for any reason, please contact
-
- Alan Apt (alan_apt@prenhall.com)
- Prentice Hall
- 2629 Redwing Rd.
- Suite #260
- Ft.Collins,CO 80526
diff --git a/release/picobsd/tinyware/mined/Makefile b/release/picobsd/tinyware/mined/Makefile
deleted file mode 100644
index 7a45bbb..0000000
--- a/release/picobsd/tinyware/mined/Makefile
+++ /dev/null
@@ -1,18 +0,0 @@
-# Makefile for mined
-
-CFLAGS = -D_POSIX_SOURCE -DASSUME_CONS25
-
-OBJ = mined1.o mined2.o
-
-all: mined
-
-mined: $(OBJ)
- $(CC) -static -o $@ $(OBJ)
-
-install: /usr/bin/mined
-
-
-$(OBJ): mined.h
-
-clean:
- rm -f mined *.o *.s core *.bak
diff --git a/release/picobsd/tinyware/mined/README b/release/picobsd/tinyware/mined/README
deleted file mode 100644
index 1142390..0000000
--- a/release/picobsd/tinyware/mined/README
+++ /dev/null
@@ -1,23 +0,0 @@
-Warsaw, 1998.10.21
-
-This is a port of Minix editor. It's small, fast and relatively
-robust. It can perform basic editing commands, block operations,
-and search and replace.
-
-The keybindings are just plain insane. I added a help screen
-(available under F1), and remapped some of the wildest keys to
-function keys. If you have some time and a bit of hacking skills,
-you're welcome to sanitize it. :-)
-
-A bit of warning: one of the reasons for its small size is that it
-doesn't use any termcap calls - it uses hardwired codes for 'cons25'
-terminal type. If you try to use it with some other terminal, you
-have to change them, or recompile with -DUNIX -ltermcap.
-
-This is a copyrighted software - see the file LICENSE. It allows
-you to use it for research and educational purposes only.
-
-Andrzej Bialecki
-<abial@FreeBSD.org>
-
-$Id: README,v 1.1 1998/10/21 17:36:16 abial Exp $
diff --git a/release/picobsd/tinyware/mined/mined.h b/release/picobsd/tinyware/mined/mined.h
deleted file mode 100644
index cb97f9a..0000000
--- a/release/picobsd/tinyware/mined/mined.h
+++ /dev/null
@@ -1,377 +0,0 @@
-/*========================================================================*
- * Mined.h *
- *========================================================================*/
-
-#include <sys/types.h>
-#include <fcntl.h>
-#include <stdlib.h>
-#include <unistd.h>
-#include <limits.h>
-
-#ifndef YMAX
-#ifdef UNIX
-#include <stdio.h>
-#undef putchar
-#undef getchar
-#undef NULL
-#undef EOF
-extern char *CE, *VS, *SO, *SE, *CL, *AL, *CM;
-#define YMAX 49
-#else
-#define YMAX 24 /* Maximum y coordinate starting at 0 */
-/* Escape sequences. */
-extern char *enter_string; /* String printed on entering mined */
-extern char *rev_video; /* String for starting reverse video */
-extern char *normal_video; /* String for leaving reverse video */
-extern char *rev_scroll; /* String for reverse scrolling */
-extern char *pos_string; /* Absolute cursor positioning */
-#define X_PLUS ' ' /* To be added to x for cursor sequence */
-#define Y_PLUS ' ' /* To be added to y for cursor sequence */
-#endif /* UNIX */
-
-#define XMAX 79 /* Maximum x coordinate starting at 0*/
-#define SCREENMAX (YMAX - 1) /* Number of lines displayed */
-#define XBREAK (XMAX - 1) /* Line shift at this coordinate */
-#define SHIFT_SIZE 25 /* Number of chars to shift */
-#define SHIFT_MARK '!' /* Char indicating line continues */
-#define MAX_CHARS 1024 /* Maximum chars on one line */
-
-/* LINE_START must be rounded up to the lowest SHIFT_SIZE */
-#define LINE_START (((-MAX_CHARS - 1) / SHIFT_SIZE) * SHIFT_SIZE \
- - SHIFT_SIZE)
-#define LINE_END (MAX_CHARS + 1) /* Highest x-coordinate for line */
-
-#define LINE_LEN (XMAX + 1) /* Number of characters on line */
-#define SCREEN_SIZE (XMAX * YMAX) /* Size of I/O buffering */
-#define BLOCK_SIZE 1024
-
-/* Return values of functions */
-#define ERRORS -1
-#define NO_LINE (ERRORS - 1) /* Must be < 0 */
-#define FINE (ERRORS + 1)
-#define NO_INPUT (ERRORS + 2)
-
-#define STD_OUT 1 /* File descriptor for terminal */
-
-#if (CHIP == INTEL)
-#define MEMORY_SIZE (50 * 1024) /* Size of data space to malloc */
-#endif
-
-#define REPORT 2 /* Report change of lines on # lines */
-
-typedef int FLAG;
-
-/* General flags */
-#define FALSE 0
-#define TRUE 1
-#define NOT_VALID 2
-#define VALID 3
-#define OFF 4
-#define ON 5
-
-/* Expression flags */
-#define FORWARD 6
-#define REVERSE 7
-
-/* Yank flags */
-#define SMALLER 8
-#define BIGGER 9
-#define SAME 10
-#define EMPTY 11
-#define NO_DELETE 12
-#define DELETE 13
-#define READ 14
-#define WRITE 15
-
-/*
- * The Line structure. Each line entry contains a pointer to the next line,
- * a pointer to the previous line, a pointer to the text and an unsigned char
- * telling at which offset of the line printing should start (usually 0).
- */
-struct Line {
- struct Line *next;
- struct Line *prev;
- char *text;
- unsigned char shift_count;
-};
-
-typedef struct Line LINE;
-
-/* Dummy line indicator */
-#define DUMMY 0x80
-#define DUMMY_MASK 0x7F
-
-/* Expression definitions */
-#define NO_MATCH 0
-#define MATCH 1
-#define REG_ERROR 2
-
-#define BEGIN_LINE (2 * REG_ERROR)
-#define END_LINE (2 * BEGIN_LINE)
-
-/*
- * The regex structure. Status can be any of 0, BEGIN_LINE or REG_ERROR. In
- * the last case, the result.err_mess field is assigned. Start_ptr and end_ptr
- * point to the match found. For more details see the documentation file.
- */
-struct regex {
- union {
- char *err_mess;
- int *expression;
- } result;
- char status;
- char *start_ptr;
- char *end_ptr;
-};
-
-typedef struct regex REGEX;
-
-/* NULL definitions */
-#define NIL_PTR ((char *) 0)
-#define NIL_LINE ((LINE *) 0)
-#define NIL_REG ((REGEX *) 0)
-#define NIL_INT ((int *) 0)
-
-/*
- * Forward declarations
- */
-extern int nlines; /* Number of lines in file */
-extern LINE *header; /* Head of line list */
-extern LINE *tail; /* Last line in line list */
-extern LINE *top_line; /* First line of screen */
-extern LINE *bot_line; /* Last line of screen */
-extern LINE *cur_line; /* Current line in use */
-extern char *cur_text; /* Pointer to char on current line in use */
-extern int last_y; /* Last y of screen. Usually SCREENMAX */
-extern int ymax;
-extern int screenmax;
-extern char screen[SCREEN_SIZE];/* Output buffer for "writes" and "reads" */
-
-extern int x, y; /* x, y coordinates on screen */
-extern FLAG modified; /* Set when file is modified */
-extern FLAG stat_visible; /* Set if status_line is visible */
-extern FLAG writable; /* Set if file cannot be written */
-extern FLAG quit; /* Set when quit character is typed */
-extern FLAG rpipe; /* Set if file should be read from stdin */
-extern int input_fd; /* Fd for command input */
-extern FLAG loading; /* Set if we're loading a file */
-extern int out_count; /* Index in output buffer */
-extern char file_name[LINE_LEN]; /* Name of file in use */
-extern char text_buffer[MAX_CHARS]; /* Buffer for modifying text */
-extern char *blank_line; /* Clear line to end */
-
-extern char yank_file[]; /* Temp file for buffer */
-extern FLAG yank_status; /* Status of yank_file */
-extern long chars_saved; /* Nr of chars saved in buffer */
-
-/*
- * Empty output buffer
- */
-#define clear_buffer() (out_count = 0)
-
-/*
- * Print character on terminal
- */
-#define putchar(c) (void) write_char(STD_OUT, (c))
-
-/*
- * Ring bell on terminal
- */
-#define ring_bell() putchar('\07')
-
-/*
- * Print string on terminal
- */
-#define string_print(str) (void) writeline(STD_OUT, (str))
-
-/*
- * Flush output buffer
- */
-#define flush() (void) flush_buffer(STD_OUT)
-
-/*
- * Convert cnt to nearest tab position
- */
-#define tab(cnt) (((cnt) + 8) & ~07)
-#define is_tab(c) ((c) == '\t')
-
-/*
- * Word defenitions
- */
-#define white_space(c) ((c) == ' ' || (c) == '\t')
-#define alpha(c) ((c) != ' ' && (c) != '\t' && (c) != '\n')
-
-/*
- * Print line on terminal at offset 0 and clear tail of line
- */
-#define line_print(line) put_line(line, 0, TRUE)
-
-/*
- * Move to coordinates and set textp. (Don't use address)
- */
-#define move_to(nx, ny) move((nx), NIL_PTR, (ny))
-
-/*
- * Move to coordinates on screen as indicated by textp.
- */
-#define move_address(address) move(0, (address), y)
-
-/*
- * Functions handling status_line. ON means in reverse video.
- */
-#define status_line(str1, str2) (void) bottom_line(ON, (str1), \
- (str2), NIL_PTR, FALSE)
-#define error(str1, str2) (void) bottom_line(ON, (str1), \
- (str2), NIL_PTR, FALSE)
-#define get_string(str1,str2, fl) bottom_line(ON, (str1), NIL_PTR, (str2), fl)
-#define clear_status() (void) bottom_line(OFF, NIL_PTR, NIL_PTR, \
- NIL_PTR, FALSE)
-
-/*
- * Print info about current file and buffer.
- */
-#define fstatus(mess, cnt) file_status((mess), (cnt), file_name, \
- nlines, writable, modified)
-
-/*
- * Get real shift value.
- */
-#define get_shift(cnt) ((cnt) & DUMMY_MASK)
-
-#endif /* YMAX */
-
-#ifdef __FreeBSD__
-#define _PROTOTYPE(x,y) x ## y
-#endif
-
-/* mined1.c */
-
-_PROTOTYPE(void FS, (void));
-_PROTOTYPE(void VI, (void));
-_PROTOTYPE(int WT, (void));
-_PROTOTYPE(void XWT, (void));
-_PROTOTYPE(void SH, (void));
-_PROTOTYPE(LINE *proceed, (LINE *line, int count ));
-_PROTOTYPE(int bottom_line, (FLAG revfl, char *s1, char *s2, char *inbuf, FLAG statfl ));
-_PROTOTYPE(int count_chars, (LINE *line ));
-_PROTOTYPE(void move, (int new_x, char *new_address, int new_y ));
-_PROTOTYPE(int find_x, (LINE *line, char *address ));
-_PROTOTYPE(char *find_address, (LINE *line, int x_coord, int *old_x ));
-_PROTOTYPE(int length_of, (char *string ));
-_PROTOTYPE(void copy_string, (char *to, char *from ));
-_PROTOTYPE(void reset, (LINE *head_line, int screen_y ));
-_PROTOTYPE(void set_cursor, (int nx, int ny ));
-_PROTOTYPE(void open_device, (void));
-_PROTOTYPE(int getchar, (void));
-_PROTOTYPE(void display, (int x_coord, int y_coord, LINE *line, int count ));
-_PROTOTYPE(int write_char, (int fd, int c ));
-_PROTOTYPE(int writeline, (int fd, char *text ));
-_PROTOTYPE(void put_line, (LINE *line, int offset, FLAG clear_line ));
-_PROTOTYPE(int flush_buffer, (int fd ));
-_PROTOTYPE(void bad_write, (int fd ));
-_PROTOTYPE(void catch, (int sig ));
-_PROTOTYPE(void abort_mined, (void));
-_PROTOTYPE(void raw_mode, (FLAG state ));
-_PROTOTYPE(void panic, (char *message ));
-_PROTOTYPE(char *alloc, (int bytes ));
-_PROTOTYPE(void free_space, (char *p ));
-/*
-#ifdef UNIX
-_PROTOTYPE(void (*key_map [128]), (void));
-#else
-_PROTOTYPE(void (*key_map [256]), (void));
-#endif
-*/
-_PROTOTYPE(void initialize, (void));
-_PROTOTYPE(char *basename, (char *path ));
-_PROTOTYPE(void load_file, (char *file ));
-_PROTOTYPE(int get_line, (int fd, char *buffer ));
-_PROTOTYPE(LINE *install_line, (char *buffer, int length ));
-_PROTOTYPE(void main, (int argc, char *argv []));
-_PROTOTYPE(void RD, (void));
-_PROTOTYPE(void I, (void));
-_PROTOTYPE(void XT, (void));
-_PROTOTYPE(void ESC, (void));
-_PROTOTYPE(int ask_save, (void));
-_PROTOTYPE(int line_number, (void));
-_PROTOTYPE(void file_status, (char *message, long count, char *file, int lines,
- FLAG writefl, FLAG changed ));
-#if __STDC__
-void build_string(char *buf, char *fmt, ...);
-#else
-void build_string();
-#endif
-_PROTOTYPE(char *num_out, (long number ));
-_PROTOTYPE(int get_number, (char *message, int *result ));
-_PROTOTYPE(int input, (char *inbuf, FLAG clearfl ));
-_PROTOTYPE(int get_file, (char *message, char *file ));
-_PROTOTYPE(int _getchar, (void));
-_PROTOTYPE(void _flush, (void));
-_PROTOTYPE(void _putchar, (int c ));
-_PROTOTYPE(void get_term, (void));
-
-/* mined2.c */
-
-_PROTOTYPE(void UP, (void));
-_PROTOTYPE(void DN, (void));
-_PROTOTYPE(void LF, (void));
-_PROTOTYPE(void RT, (void));
-_PROTOTYPE(void HIGH, (void));
-_PROTOTYPE(void LOW, (void));
-_PROTOTYPE(void BL, (void));
-_PROTOTYPE(void EL, (void));
-_PROTOTYPE(void GOTO, (void));
-_PROTOTYPE(void HLP, (void));
-_PROTOTYPE(void PD, (void));
-_PROTOTYPE(void PU, (void));
-_PROTOTYPE(void HO, (void));
-_PROTOTYPE(void EF, (void));
-_PROTOTYPE(void SU, (void));
-_PROTOTYPE(void SD, (void));
-_PROTOTYPE(int forward_scroll, (void));
-_PROTOTYPE(int reverse_scroll, (void));
-_PROTOTYPE(void MP, (void));
-_PROTOTYPE(void move_previous_word, (FLAG remove ));
-_PROTOTYPE(void MN, (void));
-_PROTOTYPE(void move_next_word, (FLAG remove ));
-_PROTOTYPE(void DCC, (void));
-_PROTOTYPE(void DPC, (void));
-_PROTOTYPE(void DLN, (void));
-_PROTOTYPE(void DNW, (void));
-_PROTOTYPE(void DPW, (void));
-_PROTOTYPE(void S, (int character ));
-_PROTOTYPE(void CTL, (void));
-_PROTOTYPE(void LIB, (void));
-_PROTOTYPE(LINE *line_insert, (LINE *line, char *string, int len ));
-_PROTOTYPE(int insert, (LINE *line, char *location, char *string ));
-_PROTOTYPE(LINE *line_delete, (LINE *line ));
-_PROTOTYPE(void delete, (LINE *start_line, char *start_textp, LINE *end_line, char *end_textp ));
-_PROTOTYPE(void PT, (void));
-_PROTOTYPE(void IF, (void));
-_PROTOTYPE(void file_insert, (int fd, FLAG old_pos ));
-_PROTOTYPE(void WB, (void));
-_PROTOTYPE(void MA, (void));
-_PROTOTYPE(void YA, (void));
-_PROTOTYPE(void DT, (void));
-_PROTOTYPE(void set_up, (FLAG remove ));
-_PROTOTYPE(FLAG checkmark, (void));
-_PROTOTYPE(int legal, (void));
-_PROTOTYPE(void yank, (LINE *start_line, char *start_textp, LINE *end_line, char *end_textp, FLAG remove ));
-_PROTOTYPE(int scratch_file, (FLAG mode ));
-_PROTOTYPE(void SF, (void));
-_PROTOTYPE(void SR, (void));
-_PROTOTYPE(REGEX *get_expression, (char *message ));
-_PROTOTYPE(void GR, (void));
-_PROTOTYPE(void LR, (void));
-_PROTOTYPE(void change, (char *message, FLAG file ));
-_PROTOTYPE(char *substitute, (LINE *line, REGEX *program, char *replacement ));
-_PROTOTYPE(void search, (char *message, FLAG method ));
-_PROTOTYPE(int find_y, (LINE *match_line ));
-_PROTOTYPE(void finished, (REGEX *program, int *last_exp ));
-_PROTOTYPE(void compile, (char *pattern, REGEX *program ));
-_PROTOTYPE(LINE *match, (REGEX *program, char *string, FLAG method ));
-_PROTOTYPE(int line_check, (REGEX *program, char *string, FLAG method ));
-_PROTOTYPE(int check_string, (REGEX *program, char *string, int *expression ));
-_PROTOTYPE(int star, (REGEX *program, char *end_position, char *string, int *expression ));
-_PROTOTYPE(int in_list, (int *list, int c, int list_length, int opcode ));
-_PROTOTYPE(void dummy_line, (void));
diff --git a/release/picobsd/tinyware/mined/mined1.c b/release/picobsd/tinyware/mined/mined1.c
deleted file mode 100644
index aff7c9c..0000000
--- a/release/picobsd/tinyware/mined/mined1.c
+++ /dev/null
@@ -1,2025 +0,0 @@
-/*
- * Part one of the mined editor.
- */
-
-/*
- * Ported to FreeBSD by Andrzej Bialecki <abial@freebsd.org>, Oct 1998
- *
- * Added a help screen, and remapped some of the wildest keybindings...
- */
-
-/*
- * Author: Michiel Huisjes.
- *
- * 1. General remarks.
- *
- * Mined is a screen editor designed for the MINIX operating system.
- * It is meant to be used on files not larger than 50K and to be fast.
- * When mined starts up, it reads the file into its memory to minimize
- * disk access. The only time that disk access is needed is when certain
- * save, write or copy commands are given.
- *
- * Mined has the style of Emacs or Jove, that means that there are no modes.
- * Each character has its own entry in an 256 pointer to function array,
- * which is called when that character is typed. Only ASCII characters are
- * connected with a function that inserts that character at the current
- * location in the file. Two execptions are <linefeed> and <tab> which are
- * inserted as well. Note that the mapping between commands and functions
- * called is implicit in the table. Changing the mapping just implies
- * changing the pointers in this table.
- *
- * The display consists of SCREENMAX + 1 lines and XMAX + 1 characters. When
- * a line is larger (or gets larger during editing) than XBREAK characters,
- * the line is either shifted SHIFT_SIZE characters to the left (which means
- * that the first SHIFT_SIZE characters are not printed) or the end of the
- * line is marked with the SHIFT_MARK character and the rest of the line is
- * not printed. A line can never exceed MAX_CHARS characters. Mined will
- * always try to keep the cursor on the same line and same (relative)
- * x-coordinate if nothing changed. So if you scroll one line up, the cursor
- * stays on the same line, or when you move one line down, the cursor will
- * move to the same place on the line as it was on the previous.
- * Every character on the line is available for editing including the
- * linefeed at the the of the line. When the linefeed is deleted, the current
- * line and the next line are joined. The last character of the file (which
- * is always a linefeed) can never be deleted.
- * The bottomline (as indicated by YMAX + 1) is used as a status line during
- * editing. This line is usually blank or contains information mined needs
- * during editing. This information (or rather questions) is displayed in
- * reverse video.
- *
- * The terminal modes are changed completely. All signals like start/stop,
- * interrupt etc. are unset. The only signal that remains is the quit signal.
- * The quit signal (^\) is the general abort signal for mined. Typing a ^\
- * during searching or when mined is asking for filenames, etc. will abort
- * the function and mined will return to the main loop. Sending a quit
- * signal during the main loop will abort the session (after confirmation)
- * and the file is not (!) saved.
- * The session will also be aborted when an unrecoverable error occurs. E.g
- * when there is no more memory available. If the file has been modified,
- * mined will ask if the file has to be saved or not.
- * If there is no more space left on the disk, mined will just give an error
- * message and continue.
- *
- * The number of system calls are minized. This is done to keep the editor
- * as fast as possible. I/O is done in SCREEN_SIZE reads/writes. Accumulated
- * output is also flushed at the end of each character typed.
- *
- * 2. Regular expressions
- *
- * Mined has a build in regular expression matcher, which is used for
- * searching and replace routines. A regular expression consists of a
- * sequence of:
- *
- * 1. A normal character matching that character.
- * 2. A . matching any character.
- * 3. A ^ matching the begin of a line.
- * 4. A $ (as last character of the pattern) mathing the end of a line.
- * 5. A \<character> matching <character>.
- * 6. A number of characters enclosed in [] pairs matching any of these
- * characters. A list of characters can be indicated by a '-'. So
- * [a-z] matches any letter of the alphabet. If the first character
- * after the '[' is a '^' then the set is negated (matching none of
- * the characters).
- * A ']', '^' or '-' can be escaped by putting a '\' in front of it.
- * Of course this means that a \ must be represented by \\.
- * 7. If one of the expressions as described in 1-6 is followed by a
- * '*' than that expressions matches a sequence of 0 or more of
- * that expression.
- *
- * Parsing of regular expression is done in two phases. In the first phase
- * the expression is compiled into a more comprehensible form. In the second
- * phase the actual matching is done. For more details see 3.6.
- *
- *
- * 3. Implementation of mined.
- *
- * 3.1 Data structures.
- *
- * The main data structures are as follows. The whole file is kept in a
- * double linked list of lines. The LINE structure looks like this:
- *
- * typedef struct Line {
- * struct Line *next;
- * struct Line *prev;
- * char *text;
- * unsigned char shift_count;
- * } LINE;
- *
- * Each line entry contains a pointer to the next line, a pointer to the
- * previous line and a pointer to the text of that line. A special field
- * shift_count contains the number of shifts (in units of SHIFT_SIZE)
- * that is performed on that line. The total size of the structure is 7
- * bytes so a file consisting of 1000 empty lines will waste a lot of
- * memory. A LINE structure is allocated for each line in the file. After
- * that the number of characters of the line is counted and sufficient
- * space is allocated to store them (including a linefeed and a '\0').
- * The resulting address is assigned to the text field in the structure.
- *
- * A special structure is allocated and its address is assigned to the
- * variable header as well as the variable tail. The text field of this
- * structure is set to NIL_PTR. The tail->prev of this structure points
- * to the last LINE of the file and the header->next to the first LINE.
- * Other LINE *variables are top_line and bot_line which point to the
- * first line resp. the last line on the screen.
- * Two other variables are important as well. First the LINE *cur_line,
- * which points to the LINE currently in use and the char *cur_text,
- * which points to the character at which the cursor stands.
- * Whenever an ASCII character is typed, a new line is build with this
- * character inserted. Then the old data space (pointed to by
- * cur_line->text) is freed, data space for the new line is allocated and
- * assigned to cur_line->text.
- *
- * Two global variables called x and y represent the x and y coordinates
- * from the cursor. The global variable nlines contains the number of
- * lines in the file. Last_y indicates the maximum y coordinate of the
- * screen (which is usually SCREENMAX).
- *
- * A few strings must be initialized by hand before compiling mined.
- * These string are enter_string, which is printed upon entering mined,
- * rev_video (turn on reverse video), normal_video, rev_scroll (perform a
- * reverse scroll) and pos_string. The last string should hold the
- * absolute position string to be printed for cursor motion. The #define
- * X_PLUS and Y_PLUS should contain the characters to be added to the
- * coordinates x and y (both starting at 0) to finish cursor positioning.
- *
- * 3.2 Starting up.
- *
- * Mined can be called with or without argument and the function
- * load_file () is called with these arguments. load_file () checks
- * if the file exists if it can be read and if it is writable and
- * sets the writable flag accordingly. If the file can be read,
- * load_file () reads a line from the file and stores this line into
- * a structure by calling install_line () and line_insert () which
- * installs the line into the double linked list, until the end of the
- * file is reached.
- * Lines are read by the function get_line (), which buffers the
- * reading in blocks of SCREEN_SIZE. Load_file () also initializes the
- * LINE *variables described above.
- *
- * 3.3 Moving around.
- *
- * Several commands are implemented for moving through the file.
- * Moving up (UP), down (DN) left (LF) and right (RT) are done by the
- * arrow keys. Moving one line below the screen scrolls the screen one
- * line up. Moving one line above the screen scrolls the screen one line
- * down. The functions forward_scroll () and reverse_scroll () take care
- * of that.
- * Several other move functions exist: move to begin of line (BL), end of
- * line (EL) top of screen (HIGH), bottom of screen (LOW), top of file
- * (HO), end of file (EF), scroll one page down (PD), scroll one page up
- * (PU), scroll one line down (SD), scroll one line up (SU) and move to a
- * certain line number (GOTO).
- * Two functions called MN () and MP () each move one word further or
- * backwards. A word is a number of non-blanks seperated by a space, a
- * tab or a linefeed.
- *
- * 3.4 Modifying text.
- *
- * The modifying commands can be separated into two modes. The first
- * being inserting text, and the other deleting text. Two functions are
- * created for these purposes: insert () and delete (). Both are capable
- * of deleting or inserting large amounts of text as well as one
- * character. Insert () must be given the line and location at which
- * the text must be inserted. Is doesn't make any difference whether this
- * text contains linefeeds or not. Delete () must be given a pointer to
- * the start line, a pointer from where deleting should start on that
- * line and the same information about the end position. The last
- * character of the file will never be deleted. Delete () will make the
- * necessary changes to the screen after deleting, but insert () won't.
- * The functions for modifying text are: insert one char (S), insert a
- * file (file_insert (fd)), insert a linefeed and put cursor back to
- * end of line (LIB), delete character under the cursor (DCC), delete
- * before cursor (even linefeed) (DPC), delete next word (DNW), delete
- * previous word (DPC) and delete to end of line (if the cursor is at
- * a linefeed delete line) (DLN).
- *
- * 3.5 Yanking.
- *
- * A few utilities are provided for yanking pieces of text. The function
- * MA () marks the current position in the file. This is done by setting
- * LINE *mark_line and char *mark_text to the current position. Yanking
- * of text can be done in two modes. The first mode just copies the text
- * from the mark to the current position (or visa versa) into a buffer
- * (YA) and the second also deletes the text (DT). Both functions call
- * the function set_up () with the delete flag on or off. Set_up ()
- * checks if the marked position is still a valid one (by using
- * check_mark () and legal ()), and then calls the function yank () with
- * a start and end position in the file. This function copies the text
- * into a scratch_file as indicated by the variable yank_file. This
- * scratch_file is made uniq by the function scratch_file (). At the end
- * of copying yank will (if necessary) delete the text. A global flag
- * called yank_status keeps track of the buffer (or file) status. It is
- * initialized on NOT_VALID and set to EMPTY (by set_up ()) or VALID (by
- * yank ()). Several things can be done with the buffer. It can be
- * inserted somewhere else in the file (PT) or it can be copied into
- * another file (WB), which will be prompted for.
- *
- * 3.6 Search and replace routines.
- *
- * Searching for strings and replacing strings are done by regular
- * expressions. For any expression the function compile () is called
- * with as argument the expression to compile. Compile () returns a
- * pointer to a structure which looks like this:
- *
- * typedef struct regex {
- * union {
- * char *err_mess;
- * int *expression;
- * } result;
- * char status;
- * char *start_ptr;
- * char *end_ptr;
- * } REGEX;
- *
- * If something went wrong during compiling (e.g. an illegal expression
- * was given), the function reg_error () is called, which sets the status
- * field to REG_ERROR and the err_mess field to the error message. If the
- * match must be anchored at the beginning of the line (end of line), the
- * status field is set to BEGIN_LINE (END_LINE). If none of these special
- * cases are true, the field is set to 0 and the function finished () is
- * called. Finished () allocates space to hold the compiled expression
- * and copies this expression into the expression field of the union
- * (bcopy ()). Matching is done by the routines match() and line_check().
- * Match () takes as argument the REGEX *program, a pointer to the
- * startposition on the current line, and a flag indicating FORWARD or
- * REVERSE search. Match () checks out the whole file until a match is
- * found. If match is found it returns a pointer to the line in which the
- * match was found else it returns a NIL_LINE. Line_check () takes the
- * same arguments, but return either MATCH or NO_MATCH.
- * During checking, the start_ptr and end_ptr fields of the REGEX
- * structure are assigned to the start and end of the match.
- * Both functions try to find a match by walking through the line
- * character by character. For each possibility, the function
- * check_string () is called with as arguments the REGEX *program and the
- * string to search in. It starts walking through the expression until
- * the end of the expression or the end of the string is reached.
- * Whenever a * is encountered, this position of the string is marked,
- * the maximum number of matches are performed and the function star ()
- * is called in order to try to find the longest match possible. Star ()
- * takes as arguments the REGEX program, the current position of the
- * string, the marked position and the current position of the expression
- * Star () walks from the current position of the string back to the
- * marked position, and calls string_check () in order to find a match.
- * It returns MATCH or NO_MATCH, just as string_check () does.
- * Searching is now easy. Both search routines (forward (SF) and
- * backwards search (SR)) call search () with an apropiate message and a
- * flag indicating FORWARD or REVERSE search. Search () will get an
- * expression from the user by calling get_expression(). Get_expression()
- * returns a pointer to a REGEX structure or NIL_REG upon errors and
- * prompts for the expression. If no expression if given, the previous is
- * used instead. After that search will call match (), and if a match is
- * found, we can move to that place in the file by the functions find_x()
- * and find_y () which will find display the match on the screen.
- * Replacing can be done in two ways. A global replace (GR) or a line
- * replace (LR). Both functions call change () with a message an a flag
- * indicating global or line replacement. Change () will prompt for the
- * expression and for the replacement. Every & in the replacement pattern
- * means substitute the match instead. An & can be escaped by a \. When
- * a match is found, the function substitute () will perform the
- * substitution.
- *
- * 3.6 Miscellaneous commands.
- *
- * A few commands haven't be discussed yet. These are redraw the screen
- * (RD) fork a shell (SH), print file status (FS), write file to disc
- * (WT), insert a file at current position (IF), leave editor (XT) and
- * visit another file (VI). The last two functions will check if the file
- * has been modified. If it has, they will ask if you want to save the
- * file by calling ask_save ().
- * The function ESC () will repeat a command n times. It will prompt for
- * the number. Aborting the loop can be done by sending the ^\ signal.
- *
- * 3.7 Utility functions.
- *
- * Several functions exists for internal use. First allocation routines:
- * alloc (bytes) and newline () will return a pointer to free data space
- * if the given size. If there is no more memory available, the function
- * panic () is called.
- * Signal handling: The only signal that can be send to mined is the
- * SIGQUIT signal. This signal, functions as a general abort command.
- * Mined will abort if the signal is given during the main loop. The
- * function abort_mined () takes care of that.
- * Panic () is a function with as argument a error message. It will print
- * the message and the error number set by the kernel (errno) and will
- * ask if the file must be saved or not. It resets the terminal
- * (raw_mode ()) and exits.
- * String handling routines like copy_string(to, from), length_of(string)
- * and build_string (buffer, format, arg1, arg2, ...). The latter takes
- * a description of the string out out the format field and puts the
- * result in the buffer. (It works like printf (3), but then into a
- * string). The functions status_line (string1, string2), error (string1,
- * string2), clear_status () and bottom_line () all print information on
- * the status line.
- * Get_string (message, buffer) reads a string and getchar () reads one
- * character from the terminal.
- * Num_out ((long) number) prints the number into a 11 digit field
- * without leading zero's. It returns a pointer to the resulting string.
- * File_status () prints all file information on the status line.
- * Set_cursor (x, y) prints the string to put the cursor at coordinates
- * x and y.
- * Output is done by four functions: writeline(fd,string), clear_buffer()
- * write_char (fd, c) and flush_buffer (fd). Three defines are provided
- * to write on filedescriptor STD_OUT (terminal) which is used normally:
- * string_print (string), putchar (c) and flush (). All these functions
- * use the global I/O buffer screen and the global index for this array
- * called out_count. In this way I/O can be buffered, so that reads or
- * writes can be done in blocks of SCREEN_SIZE size.
- * The following functions all handle internal line maintenance. The
- * function proceed (start_line, count) returns the count'th line after
- * start_line. If count is negative, the count'th line before the
- * start_line is returned. If header or tail is encountered then that
- * will be returned. Display (x, y, start_line, count) displays count
- * lines starting at coordinates [x, y] and beginning at start_line. If
- * the header or tail is encountered, empty lines are displayed instead.
- * The function reset (head_line, ny) reset top_line, last_y, bot_line,
- * cur_line and y-coordinate. This is not a neat way to do the
- * maintenance, but it sure saves a lot of code. It is usually used in
- * combination with display ().
- * Put_line(line, offset, clear_line), prints a line (skipping characters
- * according to the line->shift_size field) until XBREAK - offset
- * characters are printed or a '\n' is encountered. If clear_line is
- * TRUE, spaces are printed until XBREAK - offset characters.
- * Line_print (line) is a #define from put_line (line, 0, TRUE).
- * Moving is done by the functions move_to (x, y), move_addres (address)
- * and move (x, adress, y). This function is the most important one in
- * mined. New_y must be between 0 and last_y, new_x can be about
- * anything, address must be a pointer to an character on the current
- * line (or y). Move_to () first adjust the y coordinate together with
- * cur_line. If an address is given, it finds the corresponding
- * x-coordinate. If an new x-coordinate was given, it will try to locate
- * the corresponding character. After that it sets the shift_count field
- * of cur_line to an apropiate number according to new_x. The only thing
- * left to do now is to assign the new values to cur_line, cur_text, x
- * and y.
- *
- * 4. Summary of commands.
- *
- * CURSOR MOTION
- * up-arrow Move cursor 1 line up. At top of screen, reverse scroll
- * down-arrow Move cursor 1 line down. At bottom, scroll forward.
- * left-arrow Move cursor 1 character left or to end of previous line
- * right-arrow Move cursor 1 character right or to start of next line
- * CTRL-A Move cursor to start of current line
- * CTRL-Z Move cursor to end of current line
- * CTRL-^ Move cursor to top of screen
- * CTRL-_ Move cursor to bottom of screen
- * CTRL-F Forward to start of next word (even to next line)
- * CTRL-B Backward to first character of previous word
- *
- * SCREEN MOTION
- * Home key Move cursor to first character of file
- * End key Move cursor to last character of file
- * PgUp Scroll backward 1 page. Bottom line becomes top line
- * PgD Scroll backward 1 page. Top line becomes bottom line
- * CTRL-D Scroll screen down one line (reverse scroll)
- * CTRL-U Scroll screen up one line (forward scroll)
- *
- * MODIFYING TEXT
- * ASCII char Self insert character at cursor
- * tab Insert tab at cursor
- * backspace Delete the previous char (left of cursor), even line feed
- * Del Delete the character under the cursor
- * CTRL-N Delete next word
- * CTRL-P Delete previous word
- * CTRL-O Insert line feed at cursor and back up 1 character
- * CTRL-T Delete tail of line (cursor to end); if empty, delete line
- * CTRL-@ Set the mark (remember the current location)
- * CTRL-K Delete text from the mark to current position save on file
- * CTRL-C Save the text from the mark to the current position
- * CTRL-Y Insert the contents of the save file at current position
- * CTRL-Q Insert the contents of the save file into a new file
- * CTRL-G Insert a file at the current position
- *
- * MISCELLANEOUS
- * CTRL-E Erase and redraw the screen
- * CTRL-V Visit file (read a new file); complain if old one changed
- * CTRL-W Write the current file back to the disk
- * numeric + Search forward (prompt for regular expression)
- * numeric - Search backward (prompt for regular expression)
- * numeric 5 Print the current status of the file
- * CTRL-R (Global) Replace str1 by str2 (prompts for each string)
- * CTRL-L (Line) Replace string1 by string2
- * CTRL-S Fork off a shell and wait for it to finish
- * CTRL-X EXIT (prompt if file modified)
- * CTRL-] Go to a line. Prompts for linenumber
- * CTRL-\ Abort whatever editor was doing and start again
- * escape key Repeat a command count times; (prompts for count)
- */
-
-/* ======================================================================== *
- * Utilities *
- * ======================================================================== */
-
-#include "mined.h"
-#include <signal.h>
-#include <termios.h>
-#include <limits.h>
-#include <errno.h>
-#include <sys/wait.h>
-#include <sys/ioctl.h>
-#if __STDC__
-#include <stdarg.h>
-#else
-#include <varargs.h>
-#endif
-
-extern int errno;
-int ymax = YMAX;
-int screenmax = SCREENMAX;
-
-
-/*
- * Print file status.
- */
-void FS()
-{
- fstatus(file_name[0] ? "" : "[buffer]", -1L);
-}
-
-/*
- * Visit (edit) another file. If the file has been modified, ask the user if
- * he wants to save it.
- */
-void VI()
-{
- char new_file[LINE_LEN]; /* Buffer to hold new file name */
-
- if (modified == TRUE && ask_save() == ERRORS)
- return;
-
-/* Get new file name */
- if (get_file("Visit file:", new_file) == ERRORS)
- return;
-
-/* Free old linked list, initialize global variables and load new file */
- initialize();
-#ifdef UNIX
- tputs(CL, 0, _putchar);
-#else
- string_print (enter_string);
-#endif /* UNIX */
- load_file(new_file[0] == '\0' ? NIL_PTR : new_file);
-}
-
-/*
- * Write file in core to disc.
- */
-int WT()
-{
- register LINE *line;
- register long count = 0L; /* Nr of chars written */
- char file[LINE_LEN]; /* Buffer for new file name */
- int fd; /* Filedescriptor of file */
-
- if (modified == FALSE) {
- error ("Write not necessary.", NIL_PTR);
- return FINE;
- }
-
-/* Check if file_name is valid and if file can be written */
- if (file_name[0] == '\0' || writable == FALSE) {
- if (get_file("Enter file name:", file) != FINE)
- return ERRORS;
- copy_string(file_name, file); /* Save file name */
- }
- if ((fd = creat(file_name, 0644)) < 0) { /* Empty file */
- error("Cannot create ", file_name);
- writable = FALSE;
- return ERRORS;
- }
- else
- writable = TRUE;
-
- clear_buffer();
-
- status_line("Writing ", file_name);
- for (line = header->next; line != tail; line = line->next) {
- if (line->shift_count & DUMMY) {
- if (line->next == tail && line->text[0] == '\n')
- continue;
- }
- if (writeline(fd, line->text) == ERRORS) {
- count = -1L;
- break;
- }
- count += (long) length_of(line->text);
- }
-
- if (count > 0L && flush_buffer(fd) == ERRORS)
- count = -1L;
-
- (void) close(fd);
-
- if (count == -1L)
- return ERRORS;
-
- modified = FALSE;
- rpipe = FALSE; /* File name is now assigned */
-
-/* Display how many chars (and lines) were written */
- fstatus("Wrote", count);
- return FINE;
-}
-
-/* Call WT and discard value returned. */
-void XWT()
-{
- (void) WT();
-}
-
-
-
-/*
- * Call an interactive shell.
- */
-void SH()
-{
- register int w;
- int pid, status;
- char *shell;
-
- if ((shell = getenv("SHELL")) == NIL_PTR) shell = "/bin/sh";
-
- switch (pid = fork()) {
- case -1: /* Error */
- error("Cannot fork.", NIL_PTR);
- return;
- case 0: /* This is the child */
- set_cursor(0, ymax);
- putchar('\n');
- flush();
- raw_mode(OFF);
- if (rpipe) { /* Fix stdin */
- close (0);
- if (open("/dev/tty", 0) < 0)
- exit (126);
- }
- execl(shell, shell, (char *) 0);
- exit(127); /* Exit with 127 */
- default : /* This is the parent */
- signal(SIGINT, SIG_IGN);
- signal(SIGQUIT, SIG_IGN);
- do {
- w = wait(&status);
- } while (w != -1 && w != pid);
- }
-
- raw_mode(ON);
- RD();
-
- if ((status >> 8) == 127) /* Child died with 127 */
- error("Cannot exec ", shell);
- else if ((status >> 8) == 126)
- error("Cannot open /dev/tty as fd #0", NIL_PTR);
-}
-
-/*
- * Proceed returns the count'th line after `line'. When count is negative
- * it returns the count'th line before `line'. When the next (previous)
- * line is the tail (header) indicating EOF (tof) it stops.
- */
-LINE *proceed(line, count)
-register LINE *line;
-register int count;
-{
- if (count < 0)
- while (count++ < 0 && line != header)
- line = line->prev;
- else
- while (count-- > 0 && line != tail)
- line = line->next;
- return line;
-}
-
-/*
- * Show concatenation of s1 and s2 on the status line (bottom of screen)
- * If revfl is TRUE, turn on reverse video on both strings. Set stat_visible
- * only if bottom_line is visible.
- */
-int bottom_line(revfl, s1, s2, inbuf, statfl)
-FLAG revfl;
-char *s1, *s2;
-char *inbuf;
-FLAG statfl;
-{
- int ret = FINE;
- char buf[LINE_LEN];
- register char *p = buf;
-
- *p++ = ' ';
- if (s1 != NIL_PTR)
- while (*p = *s1++)
- p++;
- if (s2 != NIL_PTR)
- while (*p = *s2++)
- p++;
- *p++ = ' ';
- *p++ = 0;
-
- if (revfl == ON && stat_visible == TRUE)
- clear_status ();
- set_cursor(0, ymax);
- if (revfl == ON) { /* Print rev. start sequence */
-#ifdef UNIX
- tputs(SO, 0, _putchar);
-#else
- string_print(rev_video);
-#endif /* UNIX */
- stat_visible = TRUE;
- }
- else /* Used as clear_status() */
- stat_visible = FALSE;
-
- string_print(buf);
-
- if (inbuf != NIL_PTR)
- ret = input(inbuf, statfl);
-
- /* Print normal video */
-#ifdef UNIX
- tputs(SE, 0, _putchar);
- tputs(CE, 0, _putchar);
-#else
- string_print(normal_video);
- string_print(blank_line); /* Clear the rest of the line */
-#endif /* UNIX */
- if (inbuf != NIL_PTR)
- set_cursor(0, ymax);
- else
- set_cursor(x, y); /* Set cursor back to old position */
- flush(); /* Perform the actual write */
- if (ret != FINE)
- clear_status();
- return ret;
-}
-
-/*
- * Count_chars() count the number of chars that the line would occupy on the
- * screen. Counting starts at the real x-coordinate of the line.
- */
-int count_chars(line)
-LINE *line;
-{
- register int cnt = get_shift(line->shift_count) * -SHIFT_SIZE;
- register char *textp = line->text;
-
-/* Find begin of line on screen */
- while (cnt < 0) {
- if (is_tab(*textp++))
- cnt = tab(cnt);
- else
- cnt++;
- }
-
-/* Count number of chars left */
- cnt = 0;
- while (*textp != '\n') {
- if (is_tab(*textp++))
- cnt = tab(cnt);
- else
- cnt++;
- }
- return cnt;
-}
-
-/*
- * Move to coordinates nx, ny at screen. The caller must check that scrolling
- * is not needed.
- * If new_x is lower than 0 or higher than XBREAK, move_to() will check if
- * the line can be shifted. If it can it sets(or resets) the shift_count field
- * of the current line accordingly.
- * Move also sets cur_text to the right char.
- * If we're moving to the same x coordinate, try to move the the x-coordinate
- * used on the other previous call.
- */
-void move(new_x, new_address, new_y)
-register int new_x;
-int new_y;
-char *new_address;
-{
- register LINE *line = cur_line; /* For building new cur_line */
- int shift = 0; /* How many shifts to make */
- static int rel_x = 0; /* Remember relative x position */
- int tx = x;
-
-/* Check for illegal values */
- if (new_y < 0 || new_y > last_y)
- return;
-
-/* Adjust y-coordinate and cur_line */
- if (new_y < y)
- while (y != new_y) {
- if(line->shift_count>0) {
- line->shift_count=0;
- move_to(0,y);
- string_print(blank_line);
- line_print(line);
- }
- y--;
- line = line->prev;
- }
- else
- while (y != new_y) {
- if(line->shift_count>0) {
- line->shift_count=0;
- move_to(0,y);
- string_print(blank_line);
- line_print(line);
- }
- y++;
- line = line->next;
- }
-
-/* Set or unset relative x-coordinate */
- if (new_address == NIL_PTR) {
- new_address = find_address(line, (new_x == x) ? rel_x : new_x , &tx);
- if (new_x != x)
- rel_x = tx;
- new_x = tx;
- }
- else {
- rel_x = new_x = find_x(line, new_address);
- }
-
-/* Adjust shift_count if new_x lower than 0 or higher than XBREAK */
- if (new_x < 0 || new_x >= XBREAK) {
- if (new_x > XBREAK || (new_x == XBREAK && *new_address != '\n'))
- shift = (new_x - XBREAK) / SHIFT_SIZE + 1;
- else {
- shift = new_x / SHIFT_SIZE;
- if (new_x % SHIFT_SIZE)
- shift--;
- }
-
- if (shift != 0) {
- line->shift_count += shift;
- new_x = find_x(line, new_address);
- set_cursor(0, y);
- line_print(line);
- rel_x = new_x;
- }
- }
-
-/* Assign and position cursor */
- x = new_x;
- cur_text = new_address;
- cur_line = line;
- set_cursor(x, y);
-}
-
-/*
- * Find_x() returns the x coordinate belonging to address.
- * (Tabs are expanded).
- */
-int find_x(line, address)
-LINE *line;
-char *address;
-{
- register char *textp = line->text;
- register int nx = get_shift(line->shift_count) * -SHIFT_SIZE;
-
- while (textp != address && *textp != '\0') {
- if (is_tab(*textp++)) /* Expand tabs */
- nx = tab(nx);
- else
- nx++;
- }
- return nx;
-}
-
-/*
- * Find_address() returns the pointer in the line with offset x_coord.
- * (Tabs are expanded).
- */
-char *find_address(line, x_coord, old_x)
-LINE *line;
-int x_coord;
-int *old_x;
-{
- register char *textp = line->text;
- register int tx = get_shift(line->shift_count) * -SHIFT_SIZE;
-
- while (tx < x_coord && *textp != '\n') {
- if (is_tab(*textp)) {
- if (*old_x - x_coord == 1 && tab(tx) > x_coord)
- break; /* Moving left over tab */
- else
- tx = tab(tx);
- }
- else
- tx++;
- textp++;
- }
-
- *old_x = tx;
- return textp;
-}
-
-/*
- * Length_of() returns the number of characters int the string `string'
- * excluding the '\0'.
- */
-int length_of(string)
-register char *string;
-{
- register int count = 0;
-
- if (string != NIL_PTR) {
- while (*string++ != '\0')
- count++;
- }
- return count;
-}
-
-/*
- * Copy_string() copies the string `from' into the string `to'. `To' must be
- * long enough to hold `from'.
- */
-void copy_string(to, from)
-register char *to;
-register char *from;
-{
- while (*to++ = *from++)
- ;
-}
-
-/*
- * Reset assigns bot_line, top_line and cur_line according to `head_line'
- * which must be the first line of the screen, and an y-coordinate,
- * which will be the current y-coordinate (if it isn't larger than last_y)
- */
-void reset(head_line, screen_y)
-LINE *head_line;
-int screen_y;
-{
- register LINE *line;
-
- top_line = line = head_line;
-
-/* Search for bot_line (might be last line in file) */
- for (last_y = 0; last_y < nlines - 1 && last_y < screenmax
- && line->next != tail; last_y++)
- line = line->next;
-
- bot_line = line;
- y = (screen_y > last_y) ? last_y : screen_y;
-
-/* Set cur_line according to the new y value */
- cur_line = proceed(top_line, y);
-}
-
-/*
- * Set cursor at coordinates x, y.
- */
-void set_cursor(nx, ny)
-int nx, ny;
-{
-#ifdef UNIX
- extern char *tgoto();
-
- tputs(tgoto(CM, nx, ny), 0, _putchar);
-#else
- char text_buffer[10];
-
- build_string(text_buffer, pos_string, ny+1, nx+1);
- string_print(text_buffer);
-#endif /* UNIX */
-}
-
-/*
- * Routine to open terminal when mined is used in a pipeline.
- */
-void open_device()
-{
- if ((input_fd = open("/dev/tty", 0)) < 0)
- panic("Cannot open /dev/tty for read");
-}
-
-/*
- * Getchar() reads one character from the terminal. The character must be
- * masked with 0377 to avoid sign extension.
- */
-int getchar()
-{
-#ifdef UNIX
- return (_getchar() & 0377);
-#else
- char c;
-
- if (read(input_fd, &c, 1) != 1 && quit == FALSE)
- panic("Can't read one char from fd #0");
-
- return c & 0377;
-#endif /* UNIX */
-}
-
-/*
- * Display() shows count lines on the terminal starting at the given
- * coordinates. When the tail of the list is encountered it will fill the
- * rest of the screen with blank_line's.
- * When count is negative, a backwards print from `line' will be done.
- */
-void display(x_coord, y_coord, line, count)
-int x_coord, y_coord;
-register LINE *line;
-register int count;
-{
- set_cursor(x_coord, y_coord);
-
-/* Find new startline if count is negative */
- if (count < 0) {
- line = proceed(line, count);
- count = -count;
- }
-
-/* Print the lines */
- while (line != tail && count-- >= 0) {
- line->shift_count=0;
- line_print(line);
- line = line->next;
- }
-
-/* Print the blank lines (if any) */
- if (loading == FALSE) {
- while (count-- >= 0) {
-#ifdef UNIX
- tputs(CE, 0, _putchar);
-#else
- string_print(blank_line);
-#endif /* UNIX */
- putchar('\n');
- }
- }
-}
-
-/*
- * Write_char does a buffered output.
- */
-int write_char(fd, c)
-int fd;
-char c;
-{
- screen [out_count++] = c;
- if (out_count == SCREEN_SIZE) /* Flush on SCREEN_SIZE chars */
- return flush_buffer(fd);
- return FINE;
-}
-
-/*
- * Writeline writes the given string on the given filedescriptor.
- */
-int writeline(fd, text)
-register int fd;
-register char *text;
-{
- while(*text)
- if (write_char(fd, *text++) == ERRORS)
- return ERRORS;
- return FINE;
-}
-
-/*
- * Put_line print the given line on the standard output. If offset is not zero
- * printing will start at that x-coordinate. If the FLAG clear_line is TRUE,
- * then (screen) line will be cleared when the end of the line has been
- * reached.
- */
-void put_line(line, offset, clear_line)
-LINE *line; /* Line to print */
-int offset; /* Offset to start */
-FLAG clear_line; /* Clear to eoln if TRUE */
-{
- register char *textp = line->text;
- register int count = get_shift(line->shift_count) * -SHIFT_SIZE;
- int tab_count; /* Used in tab expansion */
-
-/* Skip all chars as indicated by the offset and the shift_count field */
- while (count < offset) {
- if (is_tab(*textp++))
- count = tab(count);
- else
- count++;
- }
-
- while (*textp != '\n' && count < XBREAK) {
- if (is_tab(*textp)) { /* Expand tabs to spaces */
- tab_count = tab(count);
- while (count < XBREAK && count < tab_count) {
- count++;
- putchar(' ');
- }
- textp++;
- }
- else {
- if (*textp >= '\01' && *textp <= '\037') {
-#ifdef UNIX
- tputs(SO, 0, _putchar);
-#else
- string_print (rev_video);
-#endif /* UNIX */
- putchar(*textp++ + '\100');
-#ifdef UNIX
- tputs(SE, 0, _putchar);
-#else
- string_print (normal_video);
-#endif /* UNIX */
- }
- else
- putchar(*textp++);
- count++;
- }
- }
-
-/* If line is longer than XBREAK chars, print the shift_mark */
- if (count == XBREAK && *textp != '\n')
- putchar(textp[1]=='\n' ? *textp : SHIFT_MARK);
-
-/* Clear the rest of the line is clear_line is TRUE */
- if (clear_line == TRUE) {
-#ifdef UNIX
- tputs(CE, 0, _putchar);
-#else
- string_print(blank_line);
-#endif /* UNIX */
- putchar('\n');
- }
-}
-
-/*
- * Flush the I/O buffer on filedescriptor fd.
- */
-int flush_buffer(fd)
-int fd;
-{
- if (out_count <= 0) /* There is nothing to flush */
- return FINE;
-#ifdef UNIX
- if (fd == STD_OUT) {
- printf("%.*s", out_count, screen);
- _flush();
- }
- else
-#endif /* UNIX */
- if (write(fd, screen, out_count) != out_count) {
- bad_write(fd);
- return ERRORS;
- }
- clear_buffer(); /* Empty buffer */
- return FINE;
-}
-
-/*
- * Bad_write() is called when a write failed. Notify the user.
- */
-void bad_write(fd)
-int fd;
-{
- if (fd == STD_OUT) /* Cannot write to terminal? */
- exit(1);
-
- clear_buffer();
- build_string(text_buffer, "Command aborted: %s (File incomplete)",
- (errno == ENOSPC || errno == -ENOSPC) ?
- "No space on device" : "Write error");
- error(text_buffer, NIL_PTR);
-}
-
-/*
- * Catch the SIGQUIT signal (^\) send to mined. It turns on the quitflag.
- */
-void catch(sig)
-int sig;
-{
-/* Reset the signal */
- signal(SIGQUIT, catch);
- quit = TRUE;
-}
-
-/*
- * Abort_mined() will leave mined. Confirmation is asked first.
- */
-void abort_mined()
-{
- quit = FALSE;
-
-/* Ask for confirmation */
- status_line("Really abort? ", NIL_PTR);
- if (getchar() != 'y') {
- clear_status();
- return;
- }
-
-/* Reset terminal */
- raw_mode(OFF);
- set_cursor(0, ymax);
- putchar('\n');
- flush();
-#ifdef UNIX
- abort();
-#else
- exit(1);
-#endif /* UNIX */
-}
-
-#define UNDEF _POSIX_VDISABLE
-
-/*
- * Set and reset tty into CBREAK or old mode according to argument `state'. It
- * also sets all signal characters (except for ^\) to UNDEF. ^\ is caught.
- */
-void raw_mode(state)
-FLAG state;
-{
- static struct termios old_tty;
- static struct termios new_tty;
-
- if (state == OFF) {
- tcsetattr(input_fd, TCSANOW, &old_tty);
- return;
- }
-
-/* Save old tty settings */
- tcgetattr(input_fd, &old_tty);
-
-/* Set tty to CBREAK mode */
- tcgetattr(input_fd, &new_tty);
- new_tty.c_lflag &= ~(ICANON|ECHO|ECHONL);
- new_tty.c_iflag &= ~(IXON|IXOFF);
-
-/* Unset signal chars, leave only SIGQUIT set to ^\ */
- new_tty.c_cc[VINTR] = new_tty.c_cc[VSUSP] = UNDEF;
- new_tty.c_cc[VQUIT] = '\\' & 037;
- signal(SIGQUIT, catch); /* Which is caught */
-
- tcsetattr(input_fd, TCSANOW, &new_tty);
-}
-
-/*
- * Panic() is called with an error number and a message. It is called when
- * something unrecoverable has happened.
- * It writes the message to the terminal, resets the tty and exits.
- * Ask the user if he wants to save his file.
- */
-void panic(message)
-register char *message;
-{
- extern char yank_file[];
-
-#ifdef UNIX
- tputs(CL, 0, _putchar);
- build_string(text_buffer, "%s\nError code %d\n", message, errno);
-#else
- build_string(text_buffer, "%s%s\nError code %d\n", enter_string, message, errno);
-#endif /* UNIX */
- (void) write(STD_OUT, text_buffer, length_of(text_buffer));
-
- if (loading == FALSE)
- XT(); /* Check if file can be saved */
- else
- (void) unlink(yank_file);
- raw_mode(OFF);
-
-#ifdef UNIX
- abort();
-#else
- exit(1);
-#endif /* UNIX */
-}
-
-char *alloc(bytes)
-int bytes;
-{
- char *p;
-
- p = malloc((unsigned) bytes);
- if (p == NIL_PTR) {
- if (loading == TRUE)
- panic("File too big.");
- panic("Out of memory.");
- }
- return(p);
-}
-
-void free_space(p)
-char *p;
-{
- free(p);
-}
-
-/* ======================================================================== *
- * Main loops *
- * ======================================================================== */
-
-/* The mapping between input codes and functions. */
-
-void (*key_map[256])() = { /* map ASCII characters to functions */
- /* 000-017 */ MA, BL, MP, YA, SD, RD, MN, IF, DPC, S, S, DT, LR, S, DNW,LIB,
- /* 020-037 */ DPW, WB, GR, SH, DLN, SU, VI, XWT, XT, PT, EL, ESC, I, GOTO,
- HIGH, LOW,
- /* 040-057 */ S, S, S, S, S, S, S, S, S, S, S, S, S, S, S, S,
- /* 060-077 */ S, S, S, S, S, S, S, S, S, S, S, S, S, S, S, S,
- /* 100-117 */ S, S, S, S, S, S, S, S, S, S, S, S, S, S, S, S,
- /* 120-137 */ S, S, S, S, S, S, S, S, S, S, S, S, S, S, S, S,
- /* 140-157 */ S, S, S, S, S, S, S, S, S, S, S, S, S, S, S, S,
- /* 160-177 */ S, S, S, S, S, S, S, S, S, S, S, S, S, S, S, DCC,
- /* 200-217 */ S, S, S, S, S, S, S, S, S, S, S, S, S, S, S, S,
- /* 220-237 */ S, S, S, S, S, S, S, S, S, S, S, S, S, S, S, S,
- /* 240-257 */ S, S, S, S, S, S, S, S, S, S, S, S, S, S, S, S,
- /* 260-277 */ S, S, S, S, S, S, S, S, S, S, S, S, S, S, S, S,
- /* 300-317 */ S, S, S, S, S, S, S, S, S, S, S, S, S, S, S, S,
- /* 320-337 */ S, S, S, S, S, S, S, S, S, S, S, S, S, S, S, S,
- /* 340-357 */ S, S, S, S, S, S, S, S, S, S, S, S, S, S, S, S,
- /* 360-377 */ S, S, S, S, S, S, S, S, S, S, S, S, S, S, S, S,
-};
-
-int nlines; /* Number of lines in file */
-LINE *header; /* Head of line list */
-LINE *tail; /* Last line in line list */
-LINE *cur_line; /* Current line in use */
-LINE *top_line; /* First line of screen */
-LINE *bot_line; /* Last line of screen */
-char *cur_text; /* Current char on current line in use */
-int last_y; /* Last y of screen. Usually SCREENMAX */
-char screen[SCREEN_SIZE]; /* Output buffer for "writes" and "reads" */
-
-int x, y; /* x, y coordinates on screen */
-FLAG modified = FALSE; /* Set when file is modified */
-FLAG stat_visible; /* Set if status_line is visible */
-FLAG writable; /* Set if file cannot be written */
-FLAG loading; /* Set if we are loading a file. */
-FLAG quit = FALSE; /* Set when quit character is typed */
-FLAG rpipe = FALSE; /* Set if file should be read from stdin */
-int input_fd = 0; /* Fd for command input */
-int out_count; /* Index in output buffer */
-char file_name[LINE_LEN]; /* Name of file in use */
-char text_buffer[MAX_CHARS]; /* Buffer for modifying text */
-
-/* Escape sequences. */
-#ifdef UNIX
-char *CE, *VS, *SO, *SE, *CL, *AL, *CM;
-#else
-char *enter_string = "\033[H\033[J"; /* String printed on entering mined */
-char *pos_string = "\033[%d;%dH"; /* Absolute cursor position */
-char *rev_scroll = "\033M"; /* String for reverse scrolling */
-char *rev_video = "\033[7m"; /* String for starting reverse video */
-char *normal_video = "\033[m"; /* String for leaving reverse video */
-char *blank_line = "\033[K"; /* Clear line to end */
-#endif /* UNIX */
-
-/*
- * Yank variables.
- */
-FLAG yank_status = NOT_VALID; /* Status of yank_file */
-char yank_file[] = "/tmp/mined.XXXXXX";
-long chars_saved; /* Nr of chars in buffer */
-
-/*
- * Initialize is called when a another file is edited. It free's the allocated
- * space and sets modified back to FALSE and fixes the header/tail pointer.
- */
-void initialize()
-{
- register LINE *line, *next_line;
-
-/* Delete the whole list */
- for (line = header->next; line != tail; line = next_line) {
- next_line = line->next;
- free_space(line->text);
- free_space((char*)line);
- }
-
-/* header and tail should point to itself */
- line->next = line->prev = line;
- x = y = 0;
- rpipe = modified = FALSE;
-}
-
-/*
- * Basename() finds the absolute name of the file out of a given path_name.
- */
-char *basename(path)
-char *path;
-{
- register char *ptr = path;
- register char *last = NIL_PTR;
-
- while (*ptr != '\0') {
- if (*ptr == '/')
- last = ptr;
- ptr++;
- }
- if (last == NIL_PTR)
- return path;
- if (*(last + 1) == '\0') { /* E.g. /usr/tmp/pipo/ */
- *last = '\0';
- return basename(path);/* Try again */
- }
- return last + 1;
-}
-
-/*
- * Load_file loads the file `file' into core. If file is a NIL_PTR or the file
- * couldn't be opened, just some initializations are done, and a line consisting
- * of a `\n' is installed.
- */
-void load_file(file)
-char *file;
-{
- register LINE *line = header;
- register int len;
- long nr_of_chars = 0L;
- int fd = -1; /* Filedescriptor for file */
-
- nlines = 0; /* Zero lines to start with */
-
-/* Open file */
- writable = TRUE; /* Benefit of the doubt */
- if (file == NIL_PTR) {
- if (rpipe == FALSE)
- status_line("No file.", NIL_PTR);
- else {
- fd = 0;
- file = "standard input";
- }
- file_name[0] = '\0';
- }
- else {
- copy_string(file_name, file); /* Save file name */
- if (access(file, 0) < 0) /* Cannot access file. */
- status_line("New file ", file);
- else if ((fd = open(file, 0)) < 0)
- status_line("Cannot open ", file);
- else if (access(file, 2) != 0) /* Set write flag */
- writable = FALSE;
- }
-
-/* Read file */
- loading = TRUE; /* Loading file, so set flag */
-
- if (fd >= 0) {
- status_line("Reading ", file);
- while ((len = get_line(fd, text_buffer)) != ERRORS) {
- line = line_insert(line, text_buffer, len);
- nr_of_chars += (long) len;
- }
- if (nlines == 0) /* The file was empty! */
- line = line_insert(line, "\n", 1);
- clear_buffer(); /* Clear output buffer */
- cur_line = header->next;
- fstatus("Read", nr_of_chars);
- (void) close(fd); /* Close file */
- }
- else /* Just install a "\n" */
- (void) line_insert(line, "\n", 1);
-
- reset(header->next, 0); /* Initialize pointers */
-
-/* Print screen */
- display (0, 0, header->next, last_y);
- move_to (0, 0);
- flush(); /* Flush buffer */
- loading = FALSE; /* Stop loading, reset flag */
-}
-
-
-/*
- * Get_line reads one line from filedescriptor fd. If EOF is reached on fd,
- * get_line() returns ERRORS, else it returns the length of the string.
- */
-int get_line(fd, buffer)
-int fd;
-register char *buffer;
-{
- static char *last = NIL_PTR;
- static char *current = NIL_PTR;
- static int read_chars;
- register char *cur_pos = current;
- char *begin = buffer;
-
- do {
- if (cur_pos == last) {
- if ((read_chars = read(fd, screen, SCREEN_SIZE)) <= 0)
- break;
- last = &screen[read_chars];
- cur_pos = screen;
- }
- if (*cur_pos == '\0')
- *cur_pos = ' ';
- } while ((*buffer++ = *cur_pos++) != '\n');
-
- current = cur_pos;
- if (read_chars <= 0) {
- if (buffer == begin)
- return ERRORS;
- if (*(buffer - 1) != '\n')
- if (loading == TRUE) /* Add '\n' to last line of file */
- *buffer++ = '\n';
- else {
- *buffer = '\0';
- return NO_LINE;
- }
- }
-
- *buffer = '\0';
- return buffer - begin;
-}
-
-/*
- * Install_line installs the buffer into a LINE structure It returns a pointer
- * to the allocated structure.
- */
-LINE *install_line(buffer, length)
-char *buffer;
-int length;
-{
- register LINE *new_line = (LINE *) alloc(sizeof(LINE));
-
- new_line->text = alloc(length + 1);
- new_line->shift_count = 0;
- copy_string(new_line->text, buffer);
-
- return new_line;
-}
-
-void main(argc, argv)
-int argc;
-char *argv[];
-{
-/* mined is the Minix editor. */
-
- register int index; /* Index in key table */
- struct winsize winsize;
-
-#ifdef UNIX
- get_term();
- tputs(VS, 0, _putchar);
- tputs(CL, 0, _putchar);
-#else
- string_print(enter_string); /* Hello world */
-#endif /* UNIX */
- if (ioctl(STD_OUT, TIOCGWINSZ, &winsize) == 0 && winsize.ws_row != 0) {
- ymax = winsize.ws_row - 1;
- screenmax = ymax - 1;
- }
-
- if (!isatty(0)) { /* Reading from pipe */
- if (argc != 1) {
- write(2, "Cannot find terminal.\n", 22);
- exit (1);
- }
- rpipe = TRUE;
- modified = TRUE; /* Set modified so he can write */
- open_device();
- }
-
- raw_mode(ON); /* Set tty to appropriate mode */
-
- header = tail = (LINE *) alloc(sizeof(LINE)); /* Make header of list*/
- header->text = NIL_PTR;
- header->next = tail->prev = header;
-
-/* Load the file (if any) */
- if (argc < 2)
- load_file(NIL_PTR);
- else {
- (void) get_file(NIL_PTR, argv[1]); /* Truncate filename */
- load_file(argv[1]);
- }
-
- /* Main loop of the editor. */
- for (;;) {
- index = getchar();
- if (stat_visible == TRUE)
- clear_status();
- if (quit == TRUE)
- abort_mined();
- else { /* Call the function for this key */
- (*key_map[index])(index);
- flush(); /* Flush output (if any) */
- if (quit == TRUE)
- quit = FALSE;
- }
- }
- /* NOTREACHED */
-}
-
-/* ======================================================================== *
- * Miscellaneous *
- * ======================================================================== */
-
-/*
- * Redraw the screen
- */
-void RD()
-{
-/* Clear screen */
-#ifdef UNIX
- tputs(VS, 0, _putchar);
- tputs(CL, 0, _putchar);
-#else
- string_print(enter_string);
-#endif /* UNIX */
-
-/* Print first page */
- display(0, 0, top_line, last_y);
-
-/* Clear last line */
- set_cursor(0, ymax);
-#ifdef UNIX
- tputs(CE, 0, _putchar);
-#else
- string_print(blank_line);
-#endif /* UNIX */
- move_to(x, y);
-}
-
-/*
- * Ignore this keystroke.
- */
-void I()
-{
-}
-
-/*
- * Leave editor. If the file has changed, ask if the user wants to save it.
- */
-void XT()
-{
- if (modified == TRUE && ask_save() == ERRORS)
- return;
-
- raw_mode(OFF);
- set_cursor(0, ymax);
- putchar('\n');
- flush();
- (void) unlink(yank_file); /* Might not be necessary */
- exit(0);
-}
-
-void (*escfunc(c))()
-int c;
-{
-#if (CHIP == M68000)
-#ifndef COMPAT
- int ch;
-#endif
-#endif
- if (c == '[') {
- /* Start of ASCII escape sequence. */
- c = getchar();
-#if (CHIP == M68000)
-#ifndef COMPAT
- if ((c >= '0') && (c <= '9')) ch = getchar();
- /* ch is either a tilde or a second digit */
-#endif
-#endif
- switch (c) {
- case 'H': return(HO);
- case 'A': return(UP);
- case 'B': return(DN);
- case 'C': return(RT);
- case 'D': return(LF);
-#if (CHIP == M68000)
-#ifndef COMPAT
- /* F1 = ESC [ 1 ~ */
- /* F2 = ESC [ 2 ~ */
- /* F3 = ESC [ 3 ~ */
- /* F4 = ESC [ 4 ~ */
- /* F5 = ESC [ 5 ~ */
- /* F6 = ESC [ 6 ~ */
- /* F7 = ESC [ 17 ~ */
- /* F8 = ESC [ 18 ~ */
- case '1':
- switch (ch) {
- case '~': return(SF);
- case '7': (void) getchar(); return(MA);
- case '8': (void) getchar(); return(CTL);
- }
- case '2': return(SR);
- case '3': return(PD);
- case '4': return(PU);
- case '5': return(FS);
- case '6': return(EF);
-#endif
-#endif
-#if (CHIP == INTEL)
-#ifdef ASSUME_CONS25
- case 'G': return(PD);
- case 'I': return(PU);
- case 'F': return(EF);
- /* F1 - help */
- case 'M': return(HLP);
- /* F2 - file status */
- case 'N': return(FS);
- /* F3 - search fwd */
- case 'O': return(SF);
- /* Shift-F3 - search back */
- case 'a':return(SR);
- /* F4 - global replace */
- case 'P': return(GR);
- /* Shift-F4 - line replace */
- case 'b': return(LR);
-#else
- case 'G': return(FS);
- case 'S': return(SR);
- case 'T': return(SF);
- case 'U': return(PD);
- case 'V': return(PU);
- case 'Y': return(EF);
-#endif
-#endif
- }
- return(I);
- }
-#if (CHIP == M68000)
-#ifdef COMPAT
- if (c == 'O') {
- /* Start of ASCII function key escape sequence. */
- switch (getchar()) {
- case 'P': return(SF);
- case 'Q': return(SR);
- case 'R': return(PD);
- case 'S': return(PU);
- case 'T': return(FS);
- case 'U': return(EF);
- case 'V': return(MA);
- case 'W': return(CTL);
- }
- }
-#endif
-#endif
- return(I);
-}
-
-/*
- * ESC() wants a count and a command after that. It repeats the
- * command count times. If a ^\ is given during repeating, stop looping and
- * return to main loop.
- */
-void ESC()
-{
- register int count = 0;
- register void (*func)();
- int index;
-
- index = getchar();
- while (index >= '0' && index <= '9' && quit == FALSE) {
- count *= 10;
- count += index - '0';
- index = getchar();
- }
- if (count == 0) {
- count = 1;
- func = escfunc(index);
- } else {
- func = key_map[index];
- if (func == ESC)
- func = escfunc(getchar());
- }
-
- if (func == I) { /* Function assigned? */
- clear_status();
- return;
- }
-
- while (count-- > 0 && quit == FALSE) {
- if (stat_visible == TRUE)
- clear_status();
- (*func)(index);
- flush();
- }
-
- if (quit == TRUE) /* Abort has been given */
- error("Aborted", NIL_PTR);
-}
-
-/*
- * Ask the user if he wants to save his file or not.
- */
-int ask_save()
-{
- register int c;
-
- status_line(file_name[0] ? basename(file_name) : "[buffer]" ,
- " has been modified. Save? (y/n)");
-
- while((c = getchar()) != 'y' && c != 'n' && quit == FALSE) {
- ring_bell();
- flush();
- }
-
- clear_status();
-
- if (c == 'y')
- return WT();
-
- if (c == 'n')
- return FINE;
-
- quit = FALSE; /* Abort character has been given */
- return ERRORS;
-}
-
-/*
- * Line_number() finds the line number we're on.
- */
-int line_number()
-{
- register LINE *line = header->next;
- register int count = 1;
-
- while (line != cur_line) {
- count++;
- line = line->next;
- }
-
- return count;
-}
-
-/*
- * Display a line telling how many chars and lines the file contains. Also tell
- * whether the file is readonly and/or modified.
- */
-void file_status(message, count, file, lines, writefl, changed)
-char *message;
-register long count; /* Contains number of characters in file */
-char *file;
-int lines;
-FLAG writefl, changed;
-{
- register LINE *line;
- char msg[LINE_LEN + 40];/* Buffer to hold line */
- char yank_msg[LINE_LEN];/* Buffer for msg of yank_file */
-
- if (count < 0) /* Not valid. Count chars in file */
- for (line = header->next; line != tail; line = line->next)
- count += length_of(line->text);
-
- if (yank_status != NOT_VALID) /* Append buffer info */
- build_string(yank_msg, " Buffer: %D char%s.", chars_saved,
- (chars_saved == 1L) ? "" : "s");
- else
- yank_msg[0] = '\0';
-
- build_string(msg, "%s %s%s%s %d line%s %D char%s.%s Line %d", message,
- (rpipe == TRUE && *message != '[') ? "standard input" : basename(file),
- (changed == TRUE) ? "*" : "",
- (writefl == FALSE) ? " (Readonly)" : "",
- lines, (lines == 1) ? "" : "s",
- count, (count == 1L) ? "" : "s",
- yank_msg, line_number());
-
- if (length_of(msg) + 1 > LINE_LEN - 4) {
- msg[LINE_LEN - 4] = SHIFT_MARK; /* Overflow on status line */
- msg[LINE_LEN - 3] = '\0';
- }
- status_line(msg, NIL_PTR); /* Print the information */
-}
-
-/*
- * Build_string() prints the arguments as described in fmt, into the buffer.
- * %s indicates an argument string, %d indicated an argument number.
- */
-#if __STDC__
-void build_string(char *buf, char *fmt, ...)
-{
-#else
-void build_string(buf, fmt, va_alist)
-char *buf, *fmt;
-va_dcl
-{
-#endif
- va_list argptr;
- char *scanp;
-
-#if __STDC__
- va_start(argptr, fmt);
-#else
- va_start(argptr);
-#endif
-
- while (*fmt) {
- if (*fmt == '%') {
- fmt++;
- switch (*fmt++) {
- case 's' :
- scanp = va_arg(argptr, char *);
- break;
- case 'd' :
- scanp = num_out((long) va_arg(argptr, int));
- break;
- case 'D' :
- scanp = num_out((long) va_arg(argptr, long));
- break;
- default :
- scanp = "";
- }
- while (*buf++ = *scanp++)
- ;
- buf--;
- }
- else
- *buf++ = *fmt++;
- }
- va_end(argptr);
- *buf = '\0';
-}
-
-/*
- * Output an (unsigned) long in a 10 digit field without leading zeros.
- * It returns a pointer to the first digit in the buffer.
- */
-char *num_out(number)
-long number;
-{
- static char num_buf[11]; /* Buffer to build number */
- register long digit; /* Next digit of number */
- register long pow = 1000000000L; /* Highest ten power of long */
- FLAG digit_seen = FALSE;
- int i;
-
- for (i = 0; i < 10; i++) {
- digit = number / pow; /* Get next digit */
- if (digit == 0L && digit_seen == FALSE && i != 9)
- num_buf[i] = ' ';
- else {
- num_buf[i] = '0' + (char) digit;
- number -= digit * pow; /* Erase digit */
- digit_seen = TRUE;
- }
- pow /= 10L; /* Get next digit */
- }
- for (i = 0; num_buf[i] == ' '; i++) /* Skip leading spaces */
- ;
- return (&num_buf[i]);
-}
-
-/*
- * Get_number() read a number from the terminal. The last character typed in is
- * returned. ERRORS is returned on a bad number. The resulting number is put
- * into the integer the arguments points to.
- */
-int get_number(message, result)
-char *message;
-int *result;
-{
- register int index;
- register int count = 0;
-
- status_line(message, NIL_PTR);
-
- index = getchar();
- if (quit == FALSE && (index < '0' || index > '9')) {
- error("Bad count", NIL_PTR);
- return ERRORS;
- }
-
-/* Convert input to a decimal number */
- while (index >= '0' && index <= '9' && quit == FALSE) {
- count *= 10;
- count += index - '0';
- index = getchar();
- }
-
- if (quit == TRUE) {
- clear_status();
- return ERRORS;
- }
-
- *result = count;
- return index;
-}
-
-/*
- * Input() reads a string from the terminal. When the KILL character is typed,
- * it returns ERRORS.
- */
-int input(inbuf, clearfl)
-char *inbuf;
-FLAG clearfl;
-{
- register char *ptr;
- register char c; /* Character read */
-
- ptr = inbuf;
-
- *ptr = '\0';
- while (quit == FALSE) {
- flush();
- switch (c = getchar()) {
- case '\b' : /* Erase previous char */
- if (ptr > inbuf) {
- ptr--;
-#ifdef UNIX
- tputs(SE, 0, _putchar);
-#else
- string_print(normal_video);
-#endif /* UNIX */
- if (is_tab(*ptr))
- string_print(" \b\b\b \b\b");
- else
- string_print(" \b\b \b");
-#ifdef UNIX
- tputs(SO, 0, _putchar);
-#else
- string_print(rev_video);
-#endif /* UNIX */
- string_print(" \b");
- *ptr = '\0';
- }
- else
- ring_bell();
- break;
- case '\n' : /* End of input */
- /* If inbuf is empty clear status_line */
- return (ptr == inbuf && clearfl == TRUE) ? NO_INPUT :FINE;
- default : /* Only read ASCII chars */
- if ((c >= ' ' && c <= '~') || c == '\t') {
- *ptr++ = c;
- *ptr = '\0';
- if (c == '\t')
- string_print("^I");
- else
- putchar(c);
- string_print(" \b");
- }
- else
- ring_bell();
- }
- }
- quit = FALSE;
- return ERRORS;
-}
-
-/*
- * Get_file() reads a filename from the terminal. Filenames longer than
- * FILE_LENGHT chars are truncated.
- */
-int get_file(message, file)
-char *message, *file;
-{
- char *ptr;
- int ret;
-
- if (message == NIL_PTR || (ret = get_string(message, file, TRUE)) == FINE) {
- if (length_of((ptr = basename(file))) > NAME_MAX)
- ptr[NAME_MAX] = '\0';
- }
- return ret;
-}
-
-/* ======================================================================== *
- * UNIX I/O Routines *
- * ======================================================================== */
-
-#ifdef UNIX
-#undef putchar
-
-int _getchar()
-{
- char c;
-
- if (read(input_fd, &c, 1) != 1 && quit == FALSE)
- panic ("Cannot read 1 byte from input");
- return c & 0377;
-}
-
-void _flush()
-{
- (void) fflush(stdout);
-}
-
-void _putchar(c)
-char c;
-{
- (void) write_char(STD_OUT, c);
-}
-
-void get_term()
-{
- static char termbuf[50];
- extern char *tgetstr(), *getenv();
- char *loc = termbuf;
- char entry[1024];
-
- if (tgetent(entry, getenv("TERM")) <= 0) {
- printf("Unknown terminal.\n");
- exit(1);
- }
-
- AL = tgetstr("al", &loc);
- CE = tgetstr("ce", &loc);
- VS = tgetstr("vs", &loc);
- CL = tgetstr("cl", &loc);
- SO = tgetstr("so", &loc);
- SE = tgetstr("se", &loc);
- CM = tgetstr("cm", &loc);
- ymax = tgetnum("li") - 1;
- screenmax = ymax - 1;
-
- if (!CE || !SO || !SE || !CL || !AL || !CM) {
- printf("Sorry, no mined on this type of terminal\n");
- exit(1);
- }
-}
-#endif /* UNIX */
diff --git a/release/picobsd/tinyware/mined/mined2.c b/release/picobsd/tinyware/mined/mined2.c
deleted file mode 100644
index ecaffd7..0000000
--- a/release/picobsd/tinyware/mined/mined2.c
+++ /dev/null
@@ -1,1764 +0,0 @@
-/*
- * Part 2 of the mined editor.
- */
-
-/* ======================================================================== *
- * Move Commands *
- * ======================================================================== */
-
-#include "mined.h"
-#include <string.h>
-
-/*
- * Move one line up.
- */
-void UP()
-{
- if (y == 0) { /* Top line of screen. Scroll one line */
- (void) reverse_scroll();
- move_to(x, y);
- }
- else /* Move to previous line */
- move_to(x, y - 1);
-}
-
-static char *help_string=
-" Mined (Minix Editor), FreeBSD version.\n"
-"------------------------+-------------------------------+---------------------\n"
-" CURSOR MOTION | EDITING | MISC\n"
-" Up | ^N Delete next word | ^E Erase & redraw\n"
-" Down cursor keys | ^P Delete prev. word | screen\n"
-" Left | ^T Delete to EOL | ^\\ Abort current\n"
-" Right +-------------------------------+ operation\n"
-" ^A start of line | BLOCKS | Esc repeat last\n"
-" ^Z end of line | ^@ Set mark | cmd # times\n"
-" ^^ screen top | ^K Delete mark <--> cursor | F2 file status\n"
-" ^_ screen bottom | ^C Save mark <--> cursor +=====================\n"
-" ^F word fwd. | ^Y Insert the contents of | ^X EXIT\n"
-" ^B word back | the save file at cursor | ^S run shell\n"
-"------------------------+ ^Q Insert the contents of +=====================\n"
-" SCREEN MOTION | the save file into new | SEARCH & REPLACE\n"
-" Home file top | file | F3 fwd. search\n"
-" End file bottom +-------------------------------+ SF3 bck. search\n"
-" PgUp page up | FILES | F4 Global replace\n"
-" PgD page down | ^G Insert a file at cursor | SF4 Line replace\n"
-" ^D rev. scroll | ^V Visit another file +---------------------\n"
-" ^U fwd. scroll | ^W Write current file | F1 HELP\n"
-" ^] goto line # | |\n"
-"------------------------+-------------------------------+---------------------\n"
-"Press any key to continue...";
-/*
- * Help
- */
-void HLP()
-{
- char c;
-
- string_print(enter_string);
- string_print(help_string);
- flush();
- c=getchar();
- RD();
- return;
-}
-
-/*
- * Move one line down.
- */
-void DN()
-{
- if (y == last_y) { /* Last line of screen. Scroll one line */
- if (bot_line->next == tail && bot_line->text[0] != '\n') {
- dummy_line(); /* Create new empty line */
- DN();
- return;
- }
- else {
- (void) forward_scroll();
- move_to(x, y);
- }
- }
- else /* Move to next line */
- move_to(x, y + 1);
-}
-
-/*
- * Move left one position.
- */
-void LF()
-{
- if (x == 0 && get_shift(cur_line->shift_count) == 0) {/* Begin of line */
- if (cur_line->prev != header) {
- UP(); /* Move one line up */
- move_to(LINE_END, y);
- }
- }
- else
- move_to(x - 1, y);
-}
-
-/*
- * Move right one position.
- */
-void RT()
-{
- if (*cur_text == '\n') {
- if (cur_line->next != tail) { /* Last char of file */
- DN(); /* Move one line down */
- move_to(LINE_START, y);
- }
- }
- else
- move_to(x + 1, y);
-}
-
-/*
- * Move to coordinates [0, 0] on screen.
- */
-void HIGH()
-{
- move_to(0, 0);
-}
-
-/*
- * Move to coordinates [0, YMAX] on screen.
- */
-void LOW()
-{
- move_to(0, last_y);
-}
-
-/*
- * Move to begin of line.
- */
-void BL()
-{
- move_to(LINE_START, y);
-}
-
-/*
- * Move to end of line.
- */
-void EL()
-{
- move_to(LINE_END, y);
-}
-
-/*
- * GOTO() prompts for a linenumber and moves to that line.
- */
-void GOTO()
-{
- int number;
- LINE *line;
-
- if (get_number("Please enter line number.", &number) == ERRORS)
- return;
-
- if (number <= 0 || (line = proceed(header->next, number - 1)) == tail)
- error("Illegal line number: ", num_out((long) number));
- else
- move_to(x, find_y(line));
-}
-
-/*
- * Scroll forward one page or to eof, whatever comes first. (Bot_line becomes
- * top_line of display.) Try to leave the cursor on the same line. If this is
- * not possible, leave cursor on the line halfway the page.
- */
-void PD()
-{
- register int i;
-
- for (i = 0; i < screenmax; i++)
- if (forward_scroll() == ERRORS)
- break; /* EOF reached */
- if (y - i < 0) /* Line no longer on screen */
- move_to(0, screenmax >> 1);
- else
- move_to(0, y - i);
-}
-
-
-/*
- * Scroll backwards one page or to top of file, whatever comes first. (Top_line
- * becomes bot_line of display). The very bottom line (YMAX) is always blank.
- * Try to leave the cursor on the same line. If this is not possible, leave
- * cursor on the line halfway the page.
- */
-void PU()
-{
- register int i;
-
- for (i = 0; i < screenmax; i++)
- if (reverse_scroll() == ERRORS)
- break; /* Top of file reached */
- set_cursor(0, ymax); /* Erase very bottom line */
-#ifdef UNIX
- tputs(CE, 0, _putchar);
-#else
- string_print(blank_line);
-#endif /* UNIX */
- if (y + i > screenmax) /* line no longer on screen */
- move_to(0, screenmax >> 1);
- else
- move_to(0, y + i);
-}
-
-/*
- * Go to top of file, scrolling if possible, else redrawing screen.
- */
-void HO()
-{
- if (proceed(top_line, -screenmax) == header)
- PU(); /* It fits. Let PU do it */
- else {
- reset(header->next, 0);/* Reset top_line, etc. */
- RD(); /* Display full page */
- }
- move_to(LINE_START, 0);
-}
-
-/*
- * Go to last line of file, scrolling if possible, else redrawing screen
- */
-void EF()
-{
- if (tail->prev->text[0] != '\n')
- dummy_line();
- if (proceed(bot_line, screenmax) == tail)
- PD(); /* It fits. Let PD do it */
- else {
- reset(proceed(tail->prev, -screenmax), screenmax);
- RD(); /* Display full page */
- }
- move_to(LINE_START, last_y);
-}
-
-/*
- * Scroll one line up. Leave the cursor on the same line (if possible).
- */
-void SU()
-{
- if (top_line->prev == header) /* Top of file. Can't scroll */
- return;
-
- (void) reverse_scroll();
- set_cursor(0, ymax); /* Erase very bottom line */
-#ifdef UNIX
- tputs(CE, 0, _putchar);
-#else
- string_print(blank_line);
-#endif /* UNIX */
- move_to(x, (y == screenmax) ? screenmax : y + 1);
-}
-
-/*
- * Scroll one line down. Leave the cursor on the same line (if possible).
- */
-void SD()
-{
- if (forward_scroll() != ERRORS)
- move_to(x, (y == 0) ? 0 : y - 1);
- else
- set_cursor(x, y);
-}
-
-/*
- * Perform a forward scroll. It returns ERRORS if we're at the last line of the
- * file.
- */
-int forward_scroll()
-{
- if (bot_line->next == tail) /* Last line of file. No dice */
- return ERRORS;
- top_line = top_line->next;
- bot_line = bot_line->next;
- cur_line = cur_line->next;
- set_cursor(0, ymax);
- line_print(bot_line);
-
- return FINE;
-}
-
-/*
- * Perform a backwards scroll. It returns ERRORS if we're at the first line
- * of the file.
- */
-int reverse_scroll()
-{
- if (top_line->prev == header)
- return ERRORS; /* Top of file. Can't scroll */
-
- if (last_y != screenmax) /* Reset last_y if necessary */
- last_y++;
- else
- bot_line = bot_line->prev; /* Else adjust bot_line */
- top_line = top_line->prev;
- cur_line = cur_line->prev;
-
-/* Perform the scroll */
- set_cursor(0, 0);
-#ifdef UNIX
- tputs(AL, 0, _putchar);
-#else
- string_print(rev_scroll);
-#endif /* UNIX */
- set_cursor(0, 0);
- line_print(top_line);
-
- return FINE;
-}
-
-/*
- * A word is defined as a number of non-blank characters separated by tabs
- * spaces or linefeeds.
- */
-
-/*
- * MP() moves to the start of the previous word. A word is defined as a
- * number of non-blank characters separated by tabs spaces or linefeeds.
- */
-void MP()
-{
- move_previous_word(NO_DELETE);
-}
-
-void move_previous_word(remove)
-FLAG remove;
-{
- register char *begin_line;
- register char *textp;
- char start_char = *cur_text;
- char *start_pos = cur_text;
-
-/* Fist check if we're at the beginning of line. */
- if (cur_text == cur_line->text) {
- if (cur_line->prev == header)
- return;
- start_char = '\0';
- }
-
- LF();
-
- begin_line = cur_line->text;
- textp = cur_text;
-
-/* Check if we're in the middle of a word. */
- if (!alpha(*textp) || !alpha(start_char)) {
- while (textp != begin_line && (white_space(*textp) || *textp == '\n'))
- textp--;
- }
-
-/* Now we're at the end of previous word. Skip non-blanks until a blank comes */
- while (textp != begin_line && alpha(*textp))
- textp--;
-
-/* Go to the next char if we're not at the beginning of the line */
- if (textp != begin_line && *textp != '\n')
- textp++;
-
-/* Find the x-coordinate of this address, and move to it */
- move_address(textp);
- if (remove == DELETE)
- delete(cur_line, textp, cur_line, start_pos);
-}
-
-/*
- * MN() moves to the start of the next word. A word is defined as a number of
- * non-blank characters separated by tabs spaces or linefeeds. Always keep in
- * mind that the pointer shouldn't pass the '\n'.
- */
-void MN()
-{
- move_next_word(NO_DELETE);
-}
-
-void move_next_word(remove)
-FLAG remove;
-{
- register char *textp = cur_text;
-
-/* Move to the end of the current word. */
- while (*textp != '\n' && alpha(*textp))
- textp++;
-
-/* Skip all white spaces */
- while (*textp != '\n' && white_space(*textp))
- textp++;
-/* If we're deleting. delete the text in between */
- if (remove == DELETE) {
- delete(cur_line, cur_text, cur_line, textp);
- return;
- }
-
-/* If we're at end of line. move to the first word on the next line. */
- if (*textp == '\n' && cur_line->next != tail) {
- DN();
- move_to(LINE_START, y);
- textp = cur_text;
- while (*textp != '\n' && white_space(*textp))
- textp++;
- }
- move_address(textp);
-}
-
-/* ======================================================================== *
- * Modify Commands *
- * ======================================================================== */
-
-/*
- * DCC deletes the character under the cursor. If this character is a '\n' the
- * current line is joined with the next one.
- * If this character is the only character of the line, the current line will
- * be deleted.
- */
-void DCC()
-{
- if (*cur_text == '\n')
- delete(cur_line,cur_text, cur_line->next,cur_line->next->text);
- else
- delete(cur_line, cur_text, cur_line, cur_text + 1);
-}
-
-/*
- * DPC deletes the character on the left side of the cursor. If the cursor is
- * at the beginning of the line, the last character if the previous line is
- * deleted.
- */
-void DPC()
-{
- if (x == 0 && cur_line->prev == header)
- return; /* Top of file */
-
- LF(); /* Move one left */
- DCC(); /* Delete character under cursor */
-}
-
-/*
- * DLN deletes all characters until the end of the line. If the current
- * character is a '\n', then delete that char.
- */
-void DLN()
-{
- if (*cur_text == '\n')
- DCC();
- else
- delete(cur_line, cur_text, cur_line, cur_text + length_of(cur_text) -1);
-}
-
-/*
- * DNW() deletes the next word (as described in MN())
- */
-void DNW()
-{
- if (*cur_text == '\n')
- DCC();
- else
- move_next_word(DELETE);
-}
-
-/*
- * DPW() deletes the next word (as described in MP())
- */
-void DPW()
-{
- if (cur_text == cur_line->text)
- DPC();
- else
- move_previous_word(DELETE);
-}
-
-/*
- * Insert character `character' at current location.
- */
-void S(character)
-register char character;
-{
- static char buffer[2];
-
- buffer[0] = character;
-/* Insert the character */
- if (insert(cur_line, cur_text, buffer) == ERRORS)
- return;
-
-/* Fix screen */
- if (character == '\n') {
- set_cursor(0, y);
- if (y == screenmax) { /* Can't use display */
- line_print(cur_line);
- (void) forward_scroll();
- }
- else {
- reset(top_line, y); /* Reset pointers */
- display(0, y, cur_line, last_y - y);
- }
- move_to(0, (y == screenmax) ? y : y + 1);
- }
- else if (x + 1 == XBREAK)/* If line must be shifted, just call move_to*/
- move_to(x + 1, y);
- else { /* else display rest of line */
- put_line(cur_line, x, FALSE);
- move_to(x + 1, y);
- }
-}
-
-/*
- * CTL inserts a control-char at the current location. A message that this
- * function is called is displayed at the status line.
- */
-void CTL()
-{
- register char ctrl;
-
- status_line("Enter control character.", NIL_PTR);
- if ((ctrl = getchar()) >= '\01' && ctrl <= '\037') {
- S(ctrl); /* Insert the char */
- clear_status();
- }
- else
- error ("Unknown control character", NIL_PTR);
-}
-
-/*
- * LIB insert a line at the current position and moves back to the end of
- * the previous line.
- */
-void LIB()
-{
- S('\n'); /* Insert the line */
- UP(); /* Move one line up */
- move_to(LINE_END, y); /* Move to end of this line */
-}
-
-/*
- * Line_insert() inserts a new line with text pointed to by `string'.
- * It returns the address of the new line.
- */
-LINE *line_insert(line, string, len)
-register LINE *line;
-char *string;
-int len;
-{
- register LINE *new_line;
-
-/* Allocate space for LINE structure and text */
- new_line = install_line(string, len);
-
-/* Install the line into the double linked list */
- new_line->prev = line;
- new_line->next = line->next;
- line->next = new_line;
- new_line->next->prev = new_line;
-
-/* Increment nlines */
- nlines++;
-
- return new_line;
-}
-
-/*
- * Insert() insert the string `string' at the given line and location.
- */
-int insert(line, location, string)
-register LINE *line;
-char *location, *string;
-{
- register char *bufp = text_buffer; /* Buffer for building line */
- register char *textp = line->text;
-
- if (length_of(textp) + length_of(string) >= MAX_CHARS) {
- error("Line too long", NIL_PTR);
- return ERRORS;
- }
-
- modified = TRUE; /* File has been modified */
-
-/* Copy part of line until `location' has been reached */
- while (textp != location)
- *bufp++ = *textp++;
-
-/* Insert string at this location */
- while (*string != '\0')
- *bufp++ = *string++;
- *bufp = '\0';
-
- if (*(string - 1) == '\n') /* Insert a new line */
- (void) line_insert(line, location, length_of(location));
- else /* Append last part of line */
- copy_string(bufp, location);
-
-/* Install the new text in this line */
- free_space(line->text);
- line->text = alloc(length_of(text_buffer) + 1);
- copy_string(line->text, text_buffer);
-
- return FINE;
-}
-
-/*
- * Line_delete() deletes the argument line out of the line list. The pointer to
- * the next line is returned.
- */
-LINE *line_delete(line)
-register LINE *line;
-{
- register LINE *next_line = line->next;
-
-/* Delete the line */
- line->prev->next = line->next;
- line->next->prev = line->prev;
-
-/* Free allocated space */
- free_space(line->text);
- free_space((char*)line);
-
-/* Decrement nlines */
- nlines--;
-
- return next_line;
-}
-
-/*
- * Delete() deletes all the characters (including newlines) between the
- * startposition and endposition and fixes the screen accordingly. It
- * returns the number of lines deleted.
- */
-void delete(start_line, start_textp, end_line, end_textp)
-register LINE *start_line;
-LINE *end_line;
-char *start_textp, *end_textp;
-{
- register char *textp = start_line->text;
- register char *bufp = text_buffer; /* Storage for new line->text */
- LINE *line, *stop;
- int line_cnt = 0; /* Nr of lines deleted */
- int count = 0;
- int shift = 0; /* Used in shift calculation */
- int nx = x;
-
- modified = TRUE; /* File has been modified */
-
-/* Set up new line. Copy first part of start line until start_position. */
- while (textp < start_textp) {
- *bufp++ = *textp++;
- count++;
- }
-
-/* Check if line doesn't exceed MAX_CHARS */
- if (count + length_of(end_textp) >= MAX_CHARS) {
- error("Line too long", NIL_PTR);
- return;
- }
-
-/* Copy last part of end_line if end_line is not tail */
- copy_string(bufp, (end_textp != NIL_PTR) ? end_textp : "\n");
-
-/* Delete all lines between start and end_position (including end_line) */
- line = start_line->next;
- stop = end_line->next;
- while (line != stop && line != tail) {
- line = line_delete(line);
- line_cnt++;
- }
-
-/* Check if last line of file should be deleted */
- if (end_textp == NIL_PTR && length_of(start_line->text) == 1 && nlines > 1) {
- start_line = start_line->prev;
- (void) line_delete(start_line->next);
- line_cnt++;
- }
- else { /* Install new text */
- free_space(start_line->text);
- start_line->text = alloc(length_of(text_buffer) + 1);
- copy_string(start_line->text, text_buffer);
- }
-
-/* Fix screen. First check if line is shifted. Perhaps we should shift it back*/
- if (get_shift(start_line->shift_count)) {
- shift = (XBREAK - count_chars(start_line)) / SHIFT_SIZE;
- if (shift > 0) { /* Shift line `shift' back */
- if (shift >= get_shift(start_line->shift_count))
- start_line->shift_count = 0;
- else
- start_line->shift_count -= shift;
- nx += shift * SHIFT_SIZE;/* Reset x value */
- }
- }
-
- if (line_cnt == 0) { /* Check if only one line changed */
- if (shift > 0) { /* Reprint whole line */
- set_cursor(0, y);
- line_print(start_line);
- }
- else { /* Just display last part of line */
- set_cursor(x, y);
- put_line(start_line, x, TRUE);
- }
- move_to(nx, y); /* Reset cur_text */
- return;
- }
-
- shift = last_y; /* Save value */
- reset(top_line, y);
- display(0, y, start_line, shift - y);
- move_to((line_cnt == 1) ? nx : 0, y);
-}
-
-/* ======================================================================== *
- * Yank Commands *
- * ======================================================================== */
-
-LINE *mark_line; /* For marking position. */
-char *mark_text;
-int lines_saved; /* Nr of lines in buffer */
-
-/*
- * PT() inserts the buffer at the current location.
- */
-void PT()
-{
- register int fd; /* File descriptor for buffer */
-
- if ((fd = scratch_file(READ)) == ERRORS)
- error("Buffer is empty.", NIL_PTR);
- else {
- file_insert(fd, FALSE);/* Insert the buffer */
- (void) close(fd);
- }
-}
-
-/*
- * IF() prompt for a filename and inserts the file at the current location
- * in the file.
- */
-void IF()
-{
- register int fd; /* File descriptor of file */
- char name[LINE_LEN]; /* Buffer for file name */
-
-/* Get the file name */
- if (get_file("Get and insert file:", name) != FINE)
- return;
-
- if ((fd = open(name, 0)) < 0)
- error("Cannot open ", name);
- else {
- file_insert(fd, TRUE); /* Insert the file */
- (void) close(fd);
- }
-}
-
-/*
- * File_insert() inserts a an opened file (as given by filedescriptor fd)
- * at the current location.
- */
-void file_insert(fd, old_pos)
-int fd;
-FLAG old_pos;
-{
- char line_buffer[MAX_CHARS]; /* Buffer for next line */
- register LINE *line = cur_line;
- register int line_count = nlines; /* Nr of lines inserted */
- LINE *page = cur_line;
- int ret = ERRORS;
-
-/* Get the first piece of text (might be ended with a '\n') from fd */
- if (get_line(fd, line_buffer) == ERRORS)
- return; /* Empty file */
-
-/* Insert this text at the current location. */
- if (insert(line, cur_text, line_buffer) == ERRORS)
- return;
-
-/* Repeat getting lines (and inserting lines) until EOF is reached */
- while ((ret = get_line(fd, line_buffer)) != ERRORS && ret != NO_LINE)
- line = line_insert(line, line_buffer, ret);
-
- if (ret == NO_LINE) { /* Last line read not ended by a '\n' */
- line = line->next;
- (void) insert(line, line->text, line_buffer);
- }
-
-/* Calculate nr of lines added */
- line_count = nlines - line_count;
-
-/* Fix the screen */
- if (line_count == 0) { /* Only one line changed */
- set_cursor(0, y);
- line_print(line);
- move_to((old_pos == TRUE) ? x : x + length_of(line_buffer), y);
- }
- else { /* Several lines changed */
- reset(top_line, y); /* Reset pointers */
- while (page != line && page != bot_line->next)
- page = page->next;
- if (page != bot_line->next || old_pos == TRUE)
- display(0, y, cur_line, screenmax - y);
- if (old_pos == TRUE)
- move_to(x, y);
- else if (ret == NO_LINE)
- move_to(length_of(line_buffer), find_y(line));
- else
- move_to(0, find_y(line->next));
- }
-
-/* If nr of added line >= REPORT, print the count */
- if (line_count >= REPORT)
- status_line(num_out((long) line_count), " lines added.");
-}
-
-/*
- * WB() writes the buffer (yank_file) into another file, which
- * is prompted for.
- */
-void WB()
-{
- register int new_fd; /* Filedescriptor to copy file */
- int yank_fd; /* Filedescriptor to buffer */
- register int cnt; /* Count check for read/write */
- int ret = 0; /* Error check for write */
- char file[LINE_LEN]; /* Output file */
-
-/* Checkout the buffer */
- if ((yank_fd = scratch_file(READ)) == ERRORS) {
- error("Buffer is empty.", NIL_PTR);
- return;
- }
-
-/* Get file name */
- if (get_file("Write buffer to file:", file) != FINE)
- return;
-
-/* Creat the new file */
- if ((new_fd = creat(file, 0644)) < 0) {
- error("Cannot create ", file);
- return;
- }
-
- status_line("Writing ", file);
-
-/* Copy buffer into file */
- while ((cnt = read(yank_fd, text_buffer, sizeof(text_buffer))) > 0)
- if (write(new_fd, text_buffer, cnt) != cnt) {
- bad_write(new_fd);
- ret = ERRORS;
- break;
- }
-
-/* Clean up open files and status_line */
- (void) close(new_fd);
- (void) close(yank_fd);
-
- if (ret != ERRORS) /* Bad write */
- file_status("Wrote", chars_saved, file, lines_saved, TRUE, FALSE);
-}
-
-/*
- * MA sets mark_line (mark_text) to the current line (text pointer).
- */
-void MA()
-{
- mark_line = cur_line;
- mark_text = cur_text;
- status_line("Mark set", NIL_PTR);
-}
-
-/*
- * YA() puts the text between the marked position and the current
- * in the buffer.
- */
-void YA()
-{
- set_up(NO_DELETE);
-}
-
-/*
- * DT() is essentially the same as YA(), but in DT() the text is deleted.
- */
-void DT()
-{
- set_up(DELETE);
-}
-
-/*
- * Set_up is an interface to the actual yank. It calls checkmark () to check
- * if the marked position is still valid. If it is, yank is called with the
- * arguments in the right order.
- */
-void set_up(remove)
-FLAG remove; /* DELETE if text should be deleted */
-{
- switch (checkmark()) {
- case NOT_VALID :
- error("Mark not set.", NIL_PTR);
- return;
- case SMALLER :
- yank(mark_line, mark_text, cur_line, cur_text, remove);
- break;
- case BIGGER :
- yank(cur_line, cur_text, mark_line, mark_text, remove);
- break;
- case SAME : /* Ignore stupid behaviour */
- yank_status = EMPTY;
- chars_saved = 0L;
- status_line("0 characters saved in buffer.", NIL_PTR);
- break;
- }
-}
-
-/*
- * Check_mark() checks if mark_line and mark_text are still valid pointers. If
- * they are it returns SMALLER if the marked position is before the current,
- * BIGGER if it isn't or SAME if somebody didn't get the point.
- * NOT_VALID is returned when mark_line and/or mark_text are no longer valid.
- * Legal() checks if mark_text is valid on the mark_line.
- */
-FLAG checkmark()
-{
- register LINE *line;
- FLAG cur_seen = FALSE;
-
-/* Special case: check is mark_line and cur_line are the same. */
- if (mark_line == cur_line) {
- if (mark_text == cur_text) /* Even same place */
- return SAME;
- if (legal() == ERRORS) /* mark_text out of range */
- return NOT_VALID;
- return (mark_text < cur_text) ? SMALLER : BIGGER;
- }
-
-/* Start looking for mark_line in the line structure */
- for (line = header->next; line != tail; line = line->next) {
- if (line == cur_line)
- cur_seen = TRUE;
- else if (line == mark_line)
- break;
- }
-
-/* If we found mark_line (line != tail) check for legality of mark_text */
- if (line == tail || legal() == ERRORS)
- return NOT_VALID;
-
-/* cur_seen is TRUE if cur_line is before mark_line */
- return (cur_seen == TRUE) ? BIGGER : SMALLER;
-}
-
-/*
- * Legal() checks if mark_text is still a valid pointer.
- */
-int legal()
-{
- register char *textp = mark_line->text;
-
-/* Locate mark_text on mark_line */
- while (textp != mark_text && *textp++ != '\0')
- ;
- return (*textp == '\0') ? ERRORS : FINE;
-}
-
-/*
- * Yank puts all the text between start_position and end_position into
- * the buffer.
- * The caller must check that the arguments to yank() are valid. (E.g. in
- * the right order)
- */
-void yank(start_line, start_textp, end_line, end_textp, remove)
-LINE *start_line, *end_line;
-char *start_textp, *end_textp;
-FLAG remove; /* DELETE if text should be deleted */
-{
- register LINE *line = start_line;
- register char *textp = start_textp;
- int fd;
-
-/* Creat file to hold buffer */
- if ((fd = scratch_file(WRITE)) == ERRORS)
- return;
-
- chars_saved = 0L;
- lines_saved = 0;
- status_line("Saving text.", NIL_PTR);
-
-/* Keep writing chars until the end_location is reached. */
- while (textp != end_textp) {
- if (write_char(fd, *textp) == ERRORS) {
- (void) close(fd);
- return;
- }
- if (*textp++ == '\n') { /* Move to the next line */
- line = line->next;
- textp = line->text;
- lines_saved++;
- }
- chars_saved++;
- }
-
-/* Flush the I/O buffer and close file */
- if (flush_buffer(fd) == ERRORS) {
- (void) close(fd);
- return;
- }
- (void) close(fd);
- yank_status = VALID;
-
-/*
- * Check if the text should be deleted as well. If it should, the following
- * hack is used to save a lot of code. First move back to the start_position.
- * (This might be the location we're on now!) and them delete the text.
- * It might be a bit confusing the first time somebody uses it.
- * Delete() will fix the screen.
- */
- if (remove == DELETE) {
- move_to(find_x(start_line, start_textp), find_y(start_line));
- delete(start_line, start_textp, end_line, end_textp);
- }
-
- status_line(num_out(chars_saved), " characters saved in buffer.");
-}
-
-/*
- * Scratch_file() creates a uniq file in /usr/tmp. If the file couldn't
- * be created other combinations of files are tried until a maximum
- * of MAXTRAILS times. After MAXTRAILS times, an error message is given
- * and ERRORS is returned.
- */
-
-#define MAXTRAILS 26
-
-int scratch_file(mode)
-FLAG mode; /* Can be READ or WRITE permission */
-{
- static int trials = 0; /* Keep track of trails */
- register char *y_ptr, *n_ptr;
- int fd; /* Filedescriptor to buffer */
-
-/* If yank_status == NOT_VALID, scratch_file is called for the first time */
- if (yank_status == NOT_VALID && mode == WRITE) { /* Create new file */
- /* Generate file name. */
- y_ptr = &yank_file[11];
- n_ptr = num_out((long) getpid());
- while ((*y_ptr = *n_ptr++) != '\0')
- y_ptr++;
- *y_ptr++ = 'a' + trials;
- *y_ptr = '\0';
- /* Check file existence */
- if (access(yank_file, 0) == 0 || (fd = creat(yank_file, 0644)) < 0) {
- if (trials++ >= MAXTRAILS) {
- error("Unable to creat scratchfile.", NIL_PTR);
- return ERRORS;
- }
- else
- return scratch_file(mode);/* Have another go */
- }
- }
- else if ((mode == READ && (fd = open(yank_file, 0)) < 0) ||
- (mode == WRITE && (fd = creat(yank_file, 0644)) < 0)) {
- yank_status = NOT_VALID;
- return ERRORS;
- }
-
- clear_buffer();
- return fd;
-}
-
-/* ======================================================================== *
- * Search Routines *
- * ======================================================================== */
-
-/*
- * A regular expression consists of a sequence of:
- * 1. A normal character matching that character.
- * 2. A . matching any character.
- * 3. A ^ matching the begin of a line.
- * 4. A $ (as last character of the pattern) mathing the end of a line.
- * 5. A \<character> matching <character>.
- * 6. A number of characters enclosed in [] pairs matching any of these
- * characters. A list of characters can be indicated by a '-'. So
- * [a-z] matches any letter of the alphabet. If the first character
- * after the '[' is a '^' then the set is negated (matching none of
- * the characters).
- * A ']', '^' or '-' can be escaped by putting a '\' in front of it.
- * 7. If one of the expressions as described in 1-6 is followed by a
- * '*' than that expressions matches a sequence of 0 or more of
- * that expression.
- */
-
-char typed_expression[LINE_LEN]; /* Holds previous expr. */
-
-/*
- * SF searches forward for an expression.
- */
-void SF()
-{
- search("Search forward:", FORWARD);
-}
-
-/*
- * SF searches backwards for an expression.
- */
-void SR()
-{
- search("Search reverse:", REVERSE);
-}
-
-/*
- * Get_expression() prompts for an expression. If just a return is typed, the
- * old expression is used. If the expression changed, compile() is called and
- * the returning REGEX structure is returned. It returns NIL_REG upon error.
- * The save flag indicates whether the expression should be appended at the
- * message pointer.
- */
-REGEX *get_expression(message)
-char *message;
-{
- static REGEX program; /* Program of expression */
- char exp_buf[LINE_LEN]; /* Buffer for new expr. */
-
- if (get_string(message, exp_buf, FALSE) == ERRORS)
- return NIL_REG;
-
- if (exp_buf[0] == '\0' && typed_expression[0] == '\0') {
- error("No previous expression.", NIL_PTR);
- return NIL_REG;
- }
-
- if (exp_buf[0] != '\0') { /* A new expr. is typed */
- copy_string(typed_expression, exp_buf);/* Save expr. */
- compile(exp_buf, &program); /* Compile new expression */
- }
-
- if (program.status == REG_ERROR) { /* Error during compiling */
- error(program.result.err_mess, NIL_PTR);
- return NIL_REG;
- }
- return &program;
-}
-
-/*
- * GR() a replaces all matches from the current position until the end
- * of the file.
- */
-void GR()
-{
- change("Global replace:", VALID);
-}
-
-/*
- * LR() replaces all matches on the current line.
- */
-void LR()
-{
- change("Line replace:", NOT_VALID);
-}
-
-/*
- * Change() prompts for an expression and a substitution pattern and changes
- * all matches of the expression into the substitution. change() start looking
- * for expressions at the current line and continues until the end of the file
- * if the FLAG file is VALID.
- */
-void change(message, file)
-char *message; /* Message to prompt for expression */
-FLAG file;
-{
- char mess_buf[LINE_LEN]; /* Buffer to hold message */
- char replacement[LINE_LEN]; /* Buffer to hold subst. pattern */
- REGEX *program; /* Program resulting from compilation */
- register LINE *line = cur_line;
- register char *textp;
- long lines = 0L; /* Nr of lines on which subs occurred */
- long subs = 0L; /* Nr of subs made */
- int page = y; /* Index to check if line is on screen*/
-
-/* Save message and get expression */
- copy_string(mess_buf, message);
- if ((program = get_expression(mess_buf)) == NIL_REG)
- return;
-
-/* Get substitution pattern */
- build_string(mess_buf, "%s %s by:", mess_buf, typed_expression);
- if (get_string(mess_buf, replacement, FALSE) == ERRORS)
- return;
-
- set_cursor(0, ymax);
- flush();
-/* Substitute until end of file */
- do {
- if (line_check(program, line->text, FORWARD)) {
- lines++;
- /* Repeat sub. on this line as long as we find a match*/
- do {
- subs++; /* Increment subs */
- if ((textp = substitute(line, program,replacement))
- == NIL_PTR)
- return; /* Line too long */
- } while ((program->status & BEGIN_LINE) != BEGIN_LINE &&
- (program->status & END_LINE) != END_LINE &&
- line_check(program, textp, FORWARD));
- /* Check to see if we can print the result */
- if (page <= screenmax) {
- set_cursor(0, page);
- line_print(line);
- }
- }
- if (page <= screenmax)
- page++;
- line = line->next;
- } while (line != tail && file == VALID && quit == FALSE);
-
- copy_string(mess_buf, (quit == TRUE) ? "(Aborted) " : "");
-/* Fix the status line */
- if (subs == 0L && quit == FALSE)
- error("Pattern not found.", NIL_PTR);
- else if (lines >= REPORT || quit == TRUE) {
- build_string(mess_buf, "%s %D substitutions on %D lines.", mess_buf,
- subs, lines);
- status_line(mess_buf, NIL_PTR);
- }
- else if (file == NOT_VALID && subs >= REPORT)
- status_line(num_out(subs), " substitutions.");
- else
- clear_status();
- move_to (x, y);
-}
-
-/*
- * Substitute() replaces the match on this line by the substitute pattern
- * as indicated by the program. Every '&' in the replacement is replaced by
- * the original match. A \ in the replacement escapes the next character.
- */
-char *substitute(line, program, replacement)
-LINE *line;
-REGEX *program;
-char *replacement; /* Contains replacement pattern */
-{
- register char *textp = text_buffer;
- register char *subp = replacement;
- char *linep = line->text;
- char *amp;
-
- modified = TRUE;
-
-/* Copy part of line until the beginning of the match */
- while (linep != program->start_ptr)
- *textp++ = *linep++;
-
-/*
- * Replace the match by the substitution pattern. Each occurrence of '&' is
- * replaced by the original match. A \ escapes the next character.
- */
- while (*subp != '\0' && textp < &text_buffer[MAX_CHARS]) {
- if (*subp == '&') { /* Replace the original match */
- amp = program->start_ptr;
- while (amp < program->end_ptr && textp<&text_buffer[MAX_CHARS])
- *textp++ = *amp++;
- subp++;
- }
- else {
- if (*subp == '\\' && *(subp + 1) != '\0')
- subp++;
- *textp++ = *subp++;
- }
- }
-
-/* Check for line length not exceeding MAX_CHARS */
- if (length_of(text_buffer) + length_of(program->end_ptr) >= MAX_CHARS) {
- error("Substitution result: line too big", NIL_PTR);
- return NIL_PTR;
- }
-
-/* Append last part of line to the new build line */
- copy_string(textp, program->end_ptr);
-
-/* Free old line and install new one */
- free_space(line->text);
- line->text = alloc(length_of(text_buffer) + 1);
- copy_string(line->text, text_buffer);
-
- return(line->text + (textp - text_buffer));
-}
-
-/*
- * Search() calls get_expression to fetch the expression. If this went well,
- * the function match() is called which returns the line with the next match.
- * If this line is the NIL_LINE, it means that a match could not be found.
- * Find_x() and find_y() display the right page on the screen, and return
- * the right coordinates for x and y. These coordinates are passed to move_to()
- */
-void search(message, method)
-char *message;
-FLAG method;
-{
- register REGEX *program;
- register LINE *match_line;
-
-/* Get the expression */
- if ((program = get_expression(message)) == NIL_REG)
- return;
-
- set_cursor(0, ymax);
- flush();
-/* Find the match */
- if ((match_line = match(program, cur_text, method)) == NIL_LINE) {
- if (quit == TRUE)
- status_line("Aborted", NIL_PTR);
- else
- status_line("Pattern not found.", NIL_PTR);
- return;
- }
-
- move(0, program->start_ptr, find_y(match_line));
- clear_status();
-}
-
-/*
- * find_y() checks if the matched line is on the current page. If it is, it
- * returns the new y coordinate, else it displays the correct page with the
- * matched line in the middle and returns the new y value;
- */
-int find_y(match_line)
-LINE *match_line;
-{
- register LINE *line;
- register int count = 0;
-
-/* Check if match_line is on the same page as currently displayed. */
- for (line = top_line; line != match_line && line != bot_line->next;
- line = line->next)
- count++;
- if (line != bot_line->next)
- return count;
-
-/* Display new page, with match_line in center. */
- if ((line = proceed(match_line, -(screenmax >> 1))) == header) {
- /* Can't display in the middle. Make first line of file top_line */
- count = 0;
- for (line = header->next; line != match_line; line = line->next)
- count++;
- line = header->next;
- }
- else /* New page is displayed. Set cursor to middle of page */
- count = screenmax >> 1;
-
-/* Reset pointers and redraw the screen */
- reset(line, 0);
- RD();
-
- return count;
-}
-
-/* Opcodes for characters */
-#define NORMAL 0x0200
-#define DOT 0x0400
-#define EOLN 0x0800
-#define STAR 0x1000
-#define BRACKET 0x2000
-#define NEGATE 0x0100
-#define DONE 0x4000
-
-/* Mask for opcodes and characters */
-#define LOW_BYTE 0x00FF
-#define HIGH_BYTE 0xFF00
-
-/* Previous is the contents of the previous address (ptr) points to */
-#define previous(ptr) (*((ptr) - 1))
-
-/* Buffer to store outcome of compilation */
-int exp_buffer[BLOCK_SIZE];
-
-/* Errors often used */
-char *too_long = "Regular expression too long";
-
-/*
- * Reg_error() is called by compile() is something went wrong. It set the
- * status of the structure to error, and assigns the error field of the union.
- */
-#define reg_error(str) program->status = REG_ERROR, \
- program->result.err_mess = (str)
-/*
- * Finished() is called when everything went right during compilation. It
- * allocates space for the expression, and copies the expression buffer into
- * this field.
- */
-void finished(program, last_exp)
-register REGEX *program;
-int *last_exp;
-{
- register int length = (last_exp - exp_buffer) * sizeof(int);
-
-/* Allocate space */
- program->result.expression = (int *) alloc(length);
-/* Copy expression. (expression consists of ints!) */
- bcopy(exp_buffer, program->result.expression, length);
-}
-
-/*
- * Compile compiles the pattern into a more comprehensible form and returns a
- * REGEX structure. If something went wrong, the status field of the structure
- * is set to REG_ERROR and an error message is set into the err_mess field of
- * the union. If all went well the expression is saved and the expression
- * pointer is set to the saved (and compiled) expression.
- */
-void compile(pattern, program)
-register char *pattern; /* Pointer to pattern */
-REGEX *program;
-{
- register int *expression = exp_buffer;
- int *prev_char; /* Pointer to previous compiled atom */
- int *acct_field; /* Pointer to last BRACKET start */
- FLAG negate; /* Negate flag for BRACKET */
- char low_char; /* Index for chars in BRACKET */
- char c;
-
-/* Check for begin of line */
- if (*pattern == '^') {
- program->status = BEGIN_LINE;
- pattern++;
- }
- else {
- program->status = 0;
-/* If the first character is a '*' we have to assign it here. */
- if (*pattern == '*') {
- *expression++ = '*' + NORMAL;
- pattern++;
- }
- }
-
- for (; ;) {
- switch (c = *pattern++) {
- case '.' :
- *expression++ = DOT;
- break;
- case '$' :
- /*
- * Only means EOLN if it is the last char of the pattern
- */
- if (*pattern == '\0') {
- *expression++ = EOLN | DONE;
- program->status |= END_LINE;
- finished(program, expression);
- return;
- }
- else
- *expression++ = NORMAL + '$';
- break;
- case '\0' :
- *expression++ = DONE;
- finished(program, expression);
- return;
- case '\\' :
- /* If last char, it must! mean a normal '\' */
- if (*pattern == '\0')
- *expression++ = NORMAL + '\\';
- else
- *expression++ = NORMAL + *pattern++;
- break;
- case '*' :
- /*
- * If the previous expression was a [] find out the
- * begin of the list, and adjust the opcode.
- */
- prev_char = expression - 1;
- if (*prev_char & BRACKET)
- *(expression - (*acct_field & LOW_BYTE))|= STAR;
- else
- *prev_char |= STAR;
- break;
- case '[' :
- /*
- * First field in expression gives information about
- * the list.
- * The opcode consists of BRACKET and if necessary
- * NEGATE to indicate that the list should be negated
- * and/or STAR to indicate a number of sequence of this
- * list.
- * The lower byte contains the length of the list.
- */
- acct_field = expression++;
- if (*pattern == '^') { /* List must be negated */
- pattern++;
- negate = TRUE;
- }
- else
- negate = FALSE;
- while (*pattern != ']') {
- if (*pattern == '\0') {
- reg_error("Missing ]");
- return;
- }
- if (*pattern == '\\')
- pattern++;
- *expression++ = *pattern++;
- if (*pattern == '-') {
- /* Make list of chars */
- low_char = previous(pattern);
- pattern++; /* Skip '-' */
- if (low_char++ > *pattern) {
- reg_error("Bad range in [a-z]");
- return;
- }
- /* Build list */
- while (low_char <= *pattern)
- *expression++ = low_char++;
- pattern++;
- }
- if (expression >= &exp_buffer[BLOCK_SIZE]) {
- reg_error(too_long);
- return;
- }
- }
- pattern++; /* Skip ']' */
- /* Assign length of list in acct field */
- if ((*acct_field = (expression - acct_field)) == 1) {
- reg_error("Empty []");
- return;
- }
- /* Assign negate and bracket field */
- *acct_field |= BRACKET;
- if (negate == TRUE)
- *acct_field |= NEGATE;
- /*
- * Add BRACKET to opcode of last char in field because
- * a '*' may be following the list.
- */
- previous(expression) |= BRACKET;
- break;
- default :
- *expression++ = c + NORMAL;
- }
- if (expression == &exp_buffer[BLOCK_SIZE]) {
- reg_error(too_long);
- return;
- }
- }
- /* NOTREACHED */
-}
-
-/*
- * Match gets as argument the program, pointer to place in current line to
- * start from and the method to search for (either FORWARD or REVERSE).
- * Match() will look through the whole file until a match is found.
- * NIL_LINE is returned if no match could be found.
- */
-LINE *match(program, string, method)
-REGEX *program;
-char *string;
-register FLAG method;
-{
- register LINE *line = cur_line;
- char old_char; /* For saving chars */
-
-/* Corrupted program */
- if (program->status == REG_ERROR)
- return NIL_LINE;
-
-/* Check part of text first */
- if (!(program->status & BEGIN_LINE)) {
- if (method == FORWARD) {
- if (line_check(program, string + 1, method) == MATCH)
- return cur_line; /* Match found */
- }
- else if (!(program->status & END_LINE)) {
- old_char = *string; /* Save char and */
- *string = '\n'; /* Assign '\n' for line_check */
- if (line_check(program, line->text, method) == MATCH) {
- *string = old_char; /* Restore char */
- return cur_line; /* Found match */
- }
- *string = old_char; /* No match, but restore char */
- }
- }
-
-/* No match in last (or first) part of line. Check out rest of file */
- do {
- line = (method == FORWARD) ? line->next : line->prev;
- if (line->text == NIL_PTR) /* Header/tail */
- continue;
- if (line_check(program, line->text, method) == MATCH)
- return line;
- } while (line != cur_line && quit == FALSE);
-
-/* No match found. */
- return NIL_LINE;
-}
-
-/*
- * Line_check() checks the line (or rather string) for a match. Method
- * indicates FORWARD or REVERSE search. It scans through the whole string
- * until a match is found, or the end of the string is reached.
- */
-int line_check(program, string, method)
-register REGEX *program;
-char *string;
-FLAG method;
-{
- register char *textp = string;
-
-/* Assign start_ptr field. We might find a match right away! */
- program->start_ptr = textp;
-
-/* If the match must be anchored, just check the string. */
- if (program->status & BEGIN_LINE)
- return check_string(program, string, NIL_INT);
-
- if (method == REVERSE) {
- /* First move to the end of the string */
- for (textp = string; *textp != '\n'; textp++)
- ;
- /* Start checking string until the begin of the string is met */
- while (textp >= string) {
- program->start_ptr = textp;
- if (check_string(program, textp--, NIL_INT))
- return MATCH;
- }
- }
- else {
- /* Move through the string until the end of is found */
- while (quit == FALSE && *textp != '\0') {
- program->start_ptr = textp;
- if (check_string(program, textp, NIL_INT))
- return MATCH;
- if (*textp == '\n')
- break;
- textp++;
- }
- }
-
- return NO_MATCH;
-}
-
-/*
- * Check() checks of a match can be found in the given string. Whenever a STAR
- * is found during matching, then the begin position of the string is marked
- * and the maximum number of matches is performed. Then the function star()
- * is called which starts to finish the match from this position of the string
- * (and expression). Check() return MATCH for a match, NO_MATCH is the string
- * couldn't be matched or REG_ERROR for an illegal opcode in expression.
- */
-int check_string(program, string, expression)
-REGEX *program;
-register char *string;
-int *expression;
-{
- register int opcode; /* Holds opcode of next expr. atom */
- char c; /* Char that must be matched */
- char *mark; /* For marking position */
- int star_fl; /* A star has been born */
-
- if (expression == NIL_INT)
- expression = program->result.expression;
-
-/* Loop until end of string or end of expression */
- while (quit == FALSE && !(*expression & DONE) &&
- *string != '\0' && *string != '\n') {
- c = *expression & LOW_BYTE; /* Extract match char */
- opcode = *expression & HIGH_BYTE; /* Extract opcode */
- if (star_fl = (opcode & STAR)) { /* Check star occurrence */
- opcode &= ~STAR; /* Strip opcode */
- mark = string; /* Mark current position */
- }
- expression++; /* Increment expr. */
- switch (opcode) {
- case NORMAL :
- if (star_fl)
- while (*string++ == c) /* Skip all matches */
- ;
- else if (*string++ != c)
- return NO_MATCH;
- break;
- case DOT :
- string++;
- if (star_fl) /* Skip to eoln */
- while (*string != '\0' && *string++ != '\n')
- ;
- break;
- case NEGATE | BRACKET:
- case BRACKET :
- if (star_fl)
- while (in_list(expression, *string++, c, opcode)
- == MATCH)
- ;
- else if (in_list(expression, *string++, c, opcode) == NO_MATCH)
- return NO_MATCH;
- expression += c - 1; /* Add length of list */
- break;
- default :
- panic("Corrupted program in check_string()");
- }
- if (star_fl)
- return star(program, mark, string, expression);
- }
- if (*expression & DONE) {
- program->end_ptr = string; /* Match ends here */
- /*
- * We might have found a match. The last thing to do is check
- * whether a '$' was given at the end of the expression, or
- * the match was found on a null string. (E.g. [a-z]* always
- * matches) unless a ^ or $ was included in the pattern.
- */
- if ((*expression & EOLN) && *string != '\n' && *string != '\0')
- return NO_MATCH;
- if (string == program->start_ptr && !(program->status & BEGIN_LINE)
- && !(*expression & EOLN))
- return NO_MATCH;
- return MATCH;
- }
- return NO_MATCH;
-}
-
-/*
- * Star() calls check_string() to find out the longest match possible.
- * It searches backwards until the (in check_string()) marked position
- * is reached, or a match is found.
- */
-int star(program, end_position, string, expression)
-REGEX *program;
-register char *end_position;
-register char *string;
-int *expression;
-{
- do {
- string--;
- if (check_string(program, string, expression))
- return MATCH;
- } while (string != end_position);
-
- return NO_MATCH;
-}
-
-/*
- * In_list() checks if the given character is in the list of []. If it is
- * it returns MATCH. if it isn't it returns NO_MATCH. These returns values
- * are reversed when the NEGATE field in the opcode is present.
- */
-int in_list(list, c, list_length, opcode)
-register int *list;
-char c;
-register int list_length;
-int opcode;
-{
- if (c == '\0' || c == '\n') /* End of string, never matches */
- return NO_MATCH;
- while (list_length-- > 1) { /* > 1, don't check acct_field */
- if ((*list & LOW_BYTE) == c)
- return (opcode & NEGATE) ? NO_MATCH : MATCH;
- list++;
- }
- return (opcode & NEGATE) ? MATCH : NO_MATCH;
-}
-
-/*
- * Dummy_line() adds an empty line at the end of the file. This is sometimes
- * useful in combination with the EF and DN command in combination with the
- * Yank command set.
- */
-void dummy_line()
-{
- (void) line_insert(tail->prev, "\n", 1);
- tail->prev->shift_count = DUMMY;
- if (last_y != screenmax) {
- last_y++;
- bot_line = bot_line->next;
- }
-}
diff --git a/release/picobsd/tinyware/msh/LICENSE b/release/picobsd/tinyware/msh/LICENSE
deleted file mode 100644
index 78e3b69..0000000
--- a/release/picobsd/tinyware/msh/LICENSE
+++ /dev/null
@@ -1,77 +0,0 @@
- LICENSE AGREEMENT AND LIMITED WARRANTY
-
- READ THE FOLLOWING TERMS AND CONDITIONS CAREFULLY BEFORE YOU
- PROCEED. THIS LEGAL DOCUMENT IS AN AGREEMENT BETWEEN YOU AND
- PRENTICE-HALL, INC. (THE "COMPANY"). BY ACCESSING THE SOFTWARE, YOU
- ARE AGREEING TO BE BOUND BY THESE TERMS AND CONDITIONS. IF YOU DO
- NOT AGREE WITH THESE TERMS AND CONDITIONS, DO NOT ACCESS TO SOFTWARE
- AND ALL ACCOMPANYING ITEMS.
-
- 1. GRANT OF LICENSE:
- In consideration of your agreement to abide by the terms and
- conditions of this Agreement, the Company grants to you a
- nonexclusive right to use, display and modify the Software being
- transmitted to you (hereinafter "the Software") for educational and
- research purposes and to include such Software as part of another
- computer program (i) for use by you; or (ii) for use by third
- parties, provided that copies to those third parties are distributed
- for educational or research purposes free of direct or indirect
- charges. If you wish to otherwise use or distribute the Software,
- you must enter into a separate agreement with the Company. To do so,
- please contact the person designated below.
-
- This license shall continue in effect so long as you comply with the
- terms of this Agreement and will automatically terminate if you fail
- to comply. The Company is and shall remain the copyright owner of
- the Software and reserves all rights not expressly granted to you
- under this Agreement. All provisions of this Agreement as to
- warranties, limitation of liability, remedies or damages and
- ownership rights shall survive termination.
-
- 2. MISCELLANEOUS:
- This Agreement shall be construed in accordance with the laws of the
- United States of America and the State of New York and shall benefit
- the Company, its affiliates and assignees.
-
- 3. LIMITED WARRANTY AND DISCLAIMER OF WARRANTY:
- Because this Software is being given to you without charge, the
- Company makes no warranties about the SOFTWARE, which is provided
- "AS-IS." THE COMPANY DISCLAIMS ALL WARRANTIES, EXPRESS OR IMPLIED,
- INCLUDING WITHOUT LIMITATION, THE IMPLIED WARRANTIES OF
- MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE COMPANY
- DOES NOT WARRANT, GUARANTEE OR MAKE ANY REPRESENTATION REGARDING THE
- USE OR THE RESULTS OF THE USE OF THE SOFTWARE. IN NO EVENT SHALL
- THE COMPANY OR ITS EMPLOYEES, AGENTS, SUPPLIERS OR CONTRACTORS BE
- LIABLE FOR ANY INCIDENTAL, INDIRECT, SPECIAL OR CONSEQUENTIAL
- DAMAGES ARISING OUT OF OR IN CONNECTION WITH THE LICENSE GRANTED
- UNDER THIS AGREEMENT INCLUDING, WITHOUT LIMITATION, LOSS OF USE,
- LOSS OF DATA, LOSS OF INCOME OR PROFIT, OR OTHER LOSSES SUSTAINED AS
- A RESULT OF INJURY TO ANY PERSON, OR LOSS OF OR DAMAGE TO PROPERTY,
- OR CLAIMS OF THIRD PARTIES, EVEN IF THE COMPANY OR AN AUTHORIZED
- REPRESENTATIVE OF THE COMPANY HAS BEEN ADVISED OF THE POSSIBILITY OF
- SUCH DAMAGES.
-
- SOME JURISDICTIONS DO NOT ALLOW THE LIMITATION OF IMPLIED WARRANTIES
- OR LIABILITY FOR INCIDENTAL, INDIRECT, SPECIAL OR CONSEQUENTIAL
- DAMAGES, SO THE ABOVE LIMITATIONS MAY NOT ALWAYS APPLY. YOU MAY HAVE
- RIGHTS WHICH VARY IN ACCORDANCE WITH LOCAL LAW.
-
-
- ACKNOWLEDGMENT
-
- YOU ACKNOWLEDGE THAT YOU HAVE READ THIS AGREEMENT, UNDERSTAND IT AND
- AGREE TO BE BOUND BY ITS TERMS AND CONDITIONS. YOU ALSO AGREE THAT
- THIS AGREEMENT IS THE COMPLETE AND EXCLUSIVE STATEMENT OF THE
- AGREEMENT BETWEEN YOU AND THE COMPANY AND SUPERSEDES ALL PROPOSALS
- OR PRIOR AGREEMENTS, ORAL OR WRITTEN, AND ANY OTHER COMMUNICATIONS
- BETWEEN YOU AND THE COMPANY OR ANY REPRESENTATIVE OF THE COMPANY
- RELATING TO THE SUBJECT MATTER OF THIS AGREEMENT.
-
- Should you have any questions concerning this agreement or if you
- wish to contact the Company for any reason, please contact
-
- Alan Apt (alan_apt@prenhall.com)
- Prentice Hall
- 2629 Redwing Rd.
- Suite #260
- Ft.Collins,CO 80526
diff --git a/release/picobsd/tinyware/msh/Makefile b/release/picobsd/tinyware/msh/Makefile
deleted file mode 100644
index 26137d5..0000000
--- a/release/picobsd/tinyware/msh/Makefile
+++ /dev/null
@@ -1,16 +0,0 @@
-# Makefile for sh
-
-CFLAGS = -O2 #-D_POSIX_SOURCE
-LDFLAGS = -static
-
-OBJ = sh1.o sh2.o sh3.o sh4.o sh5.o sh6.o
-
-all: sh
-
-sh: $(OBJ)
- cc $(LDFLAGS) -o $@ $(OBJ)
-
-$(OBJ): sh.h
-
-clean:
- rm -f sh *.o *.bak core
diff --git a/release/picobsd/tinyware/msh/README b/release/picobsd/tinyware/msh/README
deleted file mode 100644
index cbc9194..0000000
--- a/release/picobsd/tinyware/msh/README
+++ /dev/null
@@ -1,16 +0,0 @@
-Warsaw, 1998.10.21
-
-This is a port of Minix /bin/sh shell.
-
-It's quite limited, but also quite small. One of most serious
-limitations is lack of support for user-defined functions. Also,
-globbing should be implemented with our glob(3) - the version in
-sh4.c is rather primitive.
-
-This is a copyrighted software - see the file LICENSE. In short,
-it allows you to use it for research and educational purposes only.
-
-Andrzej Bialecki
-<abial@FreeBSD.org>
-
-$Id: README,v 1.1 1998/10/21 17:36:28 abial Exp $
diff --git a/release/picobsd/tinyware/msh/sh.1 b/release/picobsd/tinyware/msh/sh.1
deleted file mode 100644
index f19bce0..0000000
--- a/release/picobsd/tinyware/msh/sh.1
+++ /dev/null
@@ -1,261 +0,0 @@
-.TH SH 1
-.SH NAME
-sh, ., break, case, cd, continue, eval, exec, exit, export, for, if, read, readonly, set, shift, trap, umask, wait, while \- shell
-.SH SYNOPSIS
-\fBsh\fR [\fB\-eiknqstvxu\fR] [\fB\-c \fIstr\fR] \fB[\fIfile\fR]\fR
-.br
-.de FL
-.TP
-\\fB\\$1\\fR
-\\$2
-..
-.de EX
-.TP 20
-\\fB\\$1\\fR
-# \\$2
-..
-.SH OPTIONS
-.FL "\-c" "Execute the commands in \fIstr\fR"
-.FL "\-e" "Quit on error"
-.FL "\-i" "Interactive mode; ignore QUIT, TERMINATE, INTERRUPT"
-.FL "\-k" "Look for name=value everywhere on command line"
-.FL "\-n" "Do not execute commands"
-.FL "\-q" "Change qflag from sig_ign to sig_del"
-.FL "\-s" "Read commands from standard input"
-.FL "\-t" "Exit after reading and executing one command"
-.FL "\-v" "Echo input lines as they are read"
-.FL "\-x" "Trace"
-.FL "\-u" "Unset variables"
-.SH EXAMPLES
-.EX "sh script" "Run a shell script"
-.SH DESCRIPTION
-.PP
-.I Sh
-is the shell, which forms the user's main interface with the system.
-On startup, the shell reads /etc/profile and $HOME/.profile, if they exist,
-and executes any commands they contain. The Minix shell has most of the
-features of the V7 (Bourne) shell, including redirection of input and output,
-pipes, magic characters, background processes, and shell scripts. A brief
-summary follows, but whole books have been written on shell programming alone.
-.LP
-Some of the more common notations are:
-.PP
-.in +2.45i
-.ta 2i 2.2i
-.ti -2.2i
-date # Regular command
-.ti -2.2i
-sort <file # Redirect \fIstdin\fR (standard input)
-.ti -2.2i
-sort <file1 >file2 # Redirect \fIstdin\fR and \fIstdout\fR
-.ti -2.2i
-cc file.c 2>error # Redirect \fIstderr\fR
-.ti -2.2i
-a.out >f 2>&1 # Combine standard output and standard error
-.ti -2.2i
-sort <file1 >>file2 # Append output to \fIfile2\fR
-.ti -2.2i
-sort <file1 >file2 & # Background job
-.ti -2.2i
-(ls \-l; a.out) & # Run two background commands sequentially
-.ti -2.2i
-sort <file | wc # Two-process pipeline
-.ti -2.2i
-sort <f | uniq | wc # Three-process pipeline
-.ti -2.2i
-ls \-l *.c # List all files ending in \fI.c\fR
-.ti -2.2i
-ls \-l [\fIa-c\fR]* # List all files beginning with \fIa\fR, \fIb\fR, or \fIc\fR
-.ti -2.2i
-ls \-l ? # List all one-character file names
-.ti -2.2i
-ls \e? # List the file whose name is question mark
-.ti -2.2i
-ls \(fm???\(fm # List the file whose name is three question marks
-.ti -2.2i
-v=/usr/ast # Set shell variable \fIv\fR
-.ti -2.2i
-ls \-l $v # Use shell variable \fIv\fR
-.ti -2.2i
-PS1=\(fmHi! \(fm # Change the primary prompt to \fIHi!\fR
-.ti -2.2i
-PS2=\(fmMore: \(fm # Change the secondary prompt to \fIMore:\fR
-.ti -2.2i
-ls \-l $HOME # List the home directory
-.ti -2.2i
-echo $PATH # Echo the search path
-.ti -2.2i
-echo $? # Echo exit status of previous command in decimal
-.ti -2.2i
-echo $$ # Echo shell's pid in decimal
-.ti -2.2i
-echo $! # Echo PID of last background process
-.ti -2.2i
-echo $# # Echo number of parameters (shell script)
-.ti -2.2i
-echo $2 # Echo second parameter (shell script)
-.ti -2.2i
-echo "$2" # Echo second parameter without expanding spaces
-.ti -2.2i
-echo $* # Echo all parameters (shell script)
-.ti -2.2i
-echo $@ # Echo all parameters (shell script)
-.ti -2.2i
-echo "$@" # Echo all parameters without expanding spaces
-.in -2.45i
-.LP
-The shell uses the following variables for specific purposes:
-.PP
-.in +2.25i
-.ta 2i
-.ti -2i
-SHELL the path of the current shell
-.ti -2i
-HOME the default value for the cd(1) command
-.ti -2i
-PATH the directories to be searched to find commands
-.ti -2i
-IFS the internal field separators for command strings
-.ti -2i
-PS1 the primary shell prompt
-.ti -2i
-PS2 the secondary shell prompt
-.in -2.25i
-.LP
-There are various forms of substitution on the shell command line:
-.PP
-.in +2.25i
-.ta 2i
-.ti -2i
-`...` Command string between back-quotes is replaced by its output
-.ti -2i
-"..." Permits variable substitution between quotes
-.ti -2i
-\&'...' Inhibits variable substitution between quotes
-.ti -2i
-$VAR Replaced by contents of variable VAR
-.ti -2i
-${VAR} Delimits variable VAR from any following string
-.in -2.25i
-.LP
-The expressions below depend on whether or not VAR has ever been set.
-If VAR has been set, they give:
-.PP
-.in +2.25i
-.ta 2i
-.ti -2i
-${VAR-str} Replace expression by VAR, else by str
-.ti -2i
-${VAR=str} Replace expression by VAR, else by str and set VAR to str
-.ti -2i
-${VAR?str} Replace expression by VAR, else print str and exit shell
-.ti -2i
-${VAR+str} Replace expression by str, else by null string
-.in -2.25i
-.LP
-If a colon is placed after VAR, the expressions depend on whether or not
-VAR is currently set and non-null.
-.LP
-The shell has a number of built-in commands:
-.PP
-.in +2.25i
-.ta 2i
-.ti -2i
-: return true status
-.ti -2i
-\&. fn execute shell script fn on current path
-.ti -2i
-break [n] break from a for, until or while loop; exit n levels
-.ti -2i
-continue [n] continue a for, until or while loop; resume nth loop
-.ti -2i
-cd [dir] change current working directory; move to $HOME
-.ti -2i
-eval cmd rescan cmd, performing substitutions
-.ti -2i
-eval rescan the current command line
-.ti -2i
-exec cmd execute cmd without creating a new process
-.ti -2i
-exec <|> with no command name, modify shell I/O
-.ti -2i
-exit [n] exit a shell program, with exit value n
-.ti -2i
-export [var] export var to shell's children; list exported variables
-.ti -2i
-pwd print the name of the current working directory
-.ti -2i
-read var read a line from stdin and assign to var
-.ti -2i
-readonly [var] make var readonly; list readonly variables
-.ti -2i
-set -f set shell flag (+f unsets flag)
-.ti -2i
-set str set positional parameter to str
-.ti -2i
-set show the current shell variables
-.ti -2i
-shift reassign positional parameters (except ${0}) one left
-.ti -2i
-times print accumulated user and system times for processes
-.ti -2i
-trap arg sigs trap signals sigs and run arg on receipt
-.ti -2i
-trap list trapped signals
-.ti -2i
-umask [n] set the user file creation mask; show the current umask
-.ti -2i
-wait [n] wait for process pid n; wait for all processes
-.in -2.25i
-.LP
-The shell also contains a programming language, which has the following
-operators and flow control statements:
-.PP
-.in +3.50i
-.ta 2i 3.25i
-.ti -3.25i
-# Comment The rest of the line is ignored
-.ti -3.25i
-= Assignment Set a shell variable
-.ti -3.25i
-&& Logical AND Execute second command only if first succeeds
-.ti -3.25i
-|| Logical OR Execute second command only if first fails
-.ti -3.25i
-(...) Group Execute enclosed commands before continuing
-.in -3.50i
-.PP
-.in +2.25i
-.ta 2i
-.ti -2i
-for For loop (for ... in ... do ... done)
-.ti -2i
-case Case statement ((case ... ) ... ;; ... esac)
-.ti -2i
-esac Case statement end
-.ti -2i
-while While loop (while ... do ... done)
-.ti -2i
-do Do/For/While loop start (do ... until ...)
-.ti -2i
-done For/While loop end
-.ti -2i
-if Conditional statement (if ... else ... elif ... fi)
-.ti -2i
-in For loop selection
-.ti -2i
-then Conditional statement start
-.ti -2i
-else Conditional statement alternative
-.ti -2i
-elif Conditional statement end
-.ti -2i
-until Do loop end
-.ti -2i
-fi Conditional statement end
-.in -2.25i
-.SH "SEE ALSO"
-.BR echo (1),
-.BR expr (1),
-.BR pwd (1),
-.BR true (1).
diff --git a/release/picobsd/tinyware/msh/sh.h b/release/picobsd/tinyware/msh/sh.h
deleted file mode 100644
index 223761e..0000000
--- a/release/picobsd/tinyware/msh/sh.h
+++ /dev/null
@@ -1,388 +0,0 @@
-#include <stdlib.h>
-#include <string.h>
-#include <unistd.h>
-#include <fcntl.h>
-
-/* Need a way to have void used for ANSI, nothing for K&R. */
-#ifndef _ANSI
-#undef _VOID
-#define _VOID
-#endif
-
-/* -------- sh.h -------- */
-/*
- * shell
- */
-
-#define LINELIM 2100
-#define NPUSH 8 /* limit to input nesting */
-
-#define NOFILE 20 /* Number of open files */
-#define NUFILE 10 /* Number of user-accessible files */
-#define FDBASE 10 /* First file usable by Shell */
-
-/*
- * values returned by wait
- */
-#define WAITSIG(s) ((s)&0177)
-#define WAITVAL(s) (((s)>>8)&0377)
-#define WAITCORE(s) (((s)&0200)!=0)
-
-/*
- * library and system defintions
- */
-#ifdef __STDC__
-typedef void xint; /* base type of jmp_buf, for not broken compilers */
-#else
-typedef char * xint; /* base type of jmp_buf, for broken compilers */
-#endif
-
-/*
- * shell components
- */
-/* #include "area.h" */
-/* #include "word.h" */
-/* #include "io.h" */
-/* #include "var.h" */
-
-#define QUOTE 0200
-
-#define NOBLOCK ((struct op *)NULL)
-#define NOWORD ((char *)NULL)
-#define NOWORDS ((char **)NULL)
-#define NOPIPE ((int *)NULL)
-
-/*
- * Description of a command or an operation on commands.
- * Might eventually use a union.
- */
-struct op {
- int type; /* operation type, see below */
- char **words; /* arguments to a command */
- struct ioword **ioact; /* IO actions (eg, < > >>) */
- struct op *left;
- struct op *right;
- char *str; /* identifier for case and for */
-};
-
-#define TCOM 1 /* command */
-#define TPAREN 2 /* (c-list) */
-#define TPIPE 3 /* a | b */
-#define TLIST 4 /* a [&;] b */
-#define TOR 5 /* || */
-#define TAND 6 /* && */
-#define TFOR 7
-#define TDO 8
-#define TCASE 9
-#define TIF 10
-#define TWHILE 11
-#define TUNTIL 12
-#define TELIF 13
-#define TPAT 14 /* pattern in case */
-#define TBRACE 15 /* {c-list} */
-#define TASYNC 16 /* c & */
-
-/*
- * actions determining the environment of a process
- */
-#define BIT(i) (1<<(i))
-#define FEXEC BIT(0) /* execute without forking */
-
-/*
- * flags to control evaluation of words
- */
-#define DOSUB 1 /* interpret $, `, and quotes */
-#define DOBLANK 2 /* perform blank interpretation */
-#define DOGLOB 4 /* interpret [?* */
-#define DOKEY 8 /* move words with `=' to 2nd arg. list */
-#define DOTRIM 16 /* trim resulting string */
-
-#define DOALL (DOSUB|DOBLANK|DOGLOB|DOKEY|DOTRIM)
-
-Extern char **dolv;
-Extern int dolc;
-Extern int exstat;
-Extern char gflg;
-Extern int talking; /* interactive (talking-type wireless) */
-Extern int execflg;
-Extern int multiline; /* \n changed to ; */
-Extern struct op *outtree; /* result from parser */
-
-Extern xint *failpt;
-Extern xint *errpt;
-
-struct brkcon {
- jmp_buf brkpt;
- struct brkcon *nextlev;
-} ;
-Extern struct brkcon *brklist;
-Extern int isbreak;
-
-/*
- * redirection
- */
-struct ioword {
- short io_unit; /* unit affected */
- short io_flag; /* action (below) */
- char *io_name; /* file name */
-};
-#define IOREAD 1 /* < */
-#define IOHERE 2 /* << (here file) */
-#define IOWRITE 4 /* > */
-#define IOCAT 8 /* >> */
-#define IOXHERE 16 /* ${}, ` in << */
-#define IODUP 32 /* >&digit */
-#define IOCLOSE 64 /* >&- */
-
-#define IODEFAULT (-1) /* token for default IO unit */
-
-Extern struct wdblock *wdlist;
-Extern struct wdblock *iolist;
-
-/*
- * parsing & execution environment
- */
-extern struct env {
- char *linep;
- struct io *iobase;
- struct io *iop;
- xint *errpt;
- int iofd;
- struct env *oenv;
-} e;
-
-/*
- * flags:
- * -e: quit on error
- * -k: look for name=value everywhere on command line
- * -n: no execution
- * -t: exit after reading and executing one command
- * -v: echo as read
- * -x: trace
- * -u: unset variables net diagnostic
- */
-extern char *flag;
-
-extern char *null; /* null value for variable */
-extern int intr; /* interrupt pending */
-
-Extern char *trap[_NSIG+1];
-Extern char ourtrap[_NSIG+1];
-Extern int trapset; /* trap pending */
-
-extern int heedint; /* heed interrupt signals */
-
-Extern int yynerrs; /* yacc */
-
-Extern char line[LINELIM];
-extern char *elinep;
-
-/*
- * other functions
- */
-#ifdef __STDC__
-int (*inbuilt(char *s ))(void);
-#else
-int (*inbuilt())();
-#endif
-
-#ifdef __FreeBSD__
-#define _PROTOTYPE(x,y) x ## y
-#endif
-
-_PROTOTYPE(char *rexecve , (char *c , char **v , char **envp ));
-_PROTOTYPE(char *space , (int n ));
-_PROTOTYPE(char *strsave , (char *s , int a ));
-_PROTOTYPE(char *evalstr , (char *cp , int f ));
-_PROTOTYPE(char *putn , (int n ));
-_PROTOTYPE(char *itoa , (unsigned u , int n ));
-_PROTOTYPE(char *unquote , (char *as ));
-_PROTOTYPE(struct var *lookup , (char *n ));
-_PROTOTYPE(int rlookup , (char *n ));
-_PROTOTYPE(struct wdblock *glob , (char *cp , struct wdblock *wb ));
-_PROTOTYPE(int subgetc , (int ec , int quoted ));
-_PROTOTYPE(char **makenv , (void));
-_PROTOTYPE(char **eval , (char **ap , int f ));
-_PROTOTYPE(int setstatus , (int s ));
-_PROTOTYPE(int waitfor , (int lastpid , int canintr ));
-
-_PROTOTYPE(void onintr , (int s )); /* SIGINT handler */
-
-_PROTOTYPE(int newenv , (int f ));
-_PROTOTYPE(void quitenv , (void));
-_PROTOTYPE(void err , (char *s ));
-_PROTOTYPE(int anys , (char *s1 , char *s2 ));
-_PROTOTYPE(int any , (int c , char *s ));
-_PROTOTYPE(void next , (int f ));
-_PROTOTYPE(void setdash , (void));
-_PROTOTYPE(void onecommand , (void));
-_PROTOTYPE(void runtrap , (int i ));
-_PROTOTYPE(void xfree , (char *s ));
-_PROTOTYPE(int letter , (int c ));
-_PROTOTYPE(int digit , (int c ));
-_PROTOTYPE(int letnum , (int c ));
-_PROTOTYPE(int gmatch , (char *s , char *p ));
-
-/*
- * error handling
- */
-_PROTOTYPE(void leave , (void)); /* abort shell (or fail in subshell) */
-_PROTOTYPE(void fail , (void)); /* fail but return to process next command */
-_PROTOTYPE(void warn , (char *s ));
-_PROTOTYPE(void sig , (int i )); /* default signal handler */
-
-/* -------- var.h -------- */
-
-struct var {
- char *value;
- char *name;
- struct var *next;
- char status;
-};
-#define COPYV 1 /* flag to setval, suggesting copy */
-#define RONLY 01 /* variable is read-only */
-#define EXPORT 02 /* variable is to be exported */
-#define GETCELL 04 /* name & value space was got with getcell */
-
-Extern struct var *vlist; /* dictionary */
-
-Extern struct var *homedir; /* home directory */
-Extern struct var *prompt; /* main prompt */
-Extern struct var *cprompt; /* continuation prompt */
-Extern struct var *path; /* search path for commands */
-Extern struct var *shell; /* shell to interpret command files */
-Extern struct var *ifs; /* field separators */
-
-_PROTOTYPE(int yyparse , (void));
-_PROTOTYPE(struct var *lookup , (char *n ));
-_PROTOTYPE(void setval , (struct var *vp , char *val ));
-_PROTOTYPE(void nameval , (struct var *vp , char *val , char *name ));
-_PROTOTYPE(void export , (struct var *vp ));
-_PROTOTYPE(void ronly , (struct var *vp ));
-_PROTOTYPE(int isassign , (char *s ));
-_PROTOTYPE(int checkname , (char *cp ));
-_PROTOTYPE(int assign , (char *s , int cf ));
-_PROTOTYPE(void putvlist , (int f , int out ));
-_PROTOTYPE(int eqname , (char *n1 , char *n2 ));
-
-_PROTOTYPE(int execute , (struct op *t , int *pin , int *pout , int act ));
-
-/* -------- io.h -------- */
-/* io buffer */
-struct iobuf {
- unsigned id; /* buffer id */
- char buf[512]; /* buffer */
- char *bufp; /* pointer into buffer */
- char *ebufp; /* pointer to end of buffer */
-};
-
-/* possible arguments to an IO function */
-struct ioarg {
- char *aword;
- char **awordlist;
- int afile; /* file descriptor */
- unsigned afid; /* buffer id */
- long afpos; /* file position */
- struct iobuf *afbuf; /* buffer for this file */
-};
-Extern struct ioarg ioargstack[NPUSH];
-#define AFID_NOBUF (~0)
-#define AFID_ID 0
-
-/* an input generator's state */
-struct io {
- int (*iofn)(_VOID);
- struct ioarg *argp;
- int peekc;
- char prev; /* previous character read by readc() */
- char nlcount; /* for `'s */
- char xchar; /* for `'s */
- char task; /* reason for pushed IO */
-};
-Extern struct io iostack[NPUSH];
-#define XOTHER 0 /* none of the below */
-#define XDOLL 1 /* expanding ${} */
-#define XGRAVE 2 /* expanding `'s */
-#define XIO 3 /* file IO */
-
-/* in substitution */
-#define INSUB() (e.iop->task == XGRAVE || e.iop->task == XDOLL)
-
-/*
- * input generators for IO structure
- */
-_PROTOTYPE(int nlchar , (struct ioarg *ap ));
-_PROTOTYPE(int strchar , (struct ioarg *ap ));
-_PROTOTYPE(int qstrchar , (struct ioarg *ap ));
-_PROTOTYPE(int filechar , (struct ioarg *ap ));
-_PROTOTYPE(int herechar , (struct ioarg *ap ));
-_PROTOTYPE(int linechar , (struct ioarg *ap ));
-_PROTOTYPE(int gravechar , (struct ioarg *ap , struct io *iop ));
-_PROTOTYPE(int qgravechar , (struct ioarg *ap , struct io *iop ));
-_PROTOTYPE(int dolchar , (struct ioarg *ap ));
-_PROTOTYPE(int wdchar , (struct ioarg *ap ));
-_PROTOTYPE(void scraphere , (void));
-_PROTOTYPE(void freehere , (int area ));
-_PROTOTYPE(void gethere , (void));
-_PROTOTYPE(void markhere , (char *s , struct ioword *iop ));
-_PROTOTYPE(int herein , (char *hname , int xdoll ));
-_PROTOTYPE(int run , (struct ioarg *argp , int (*f)(_VOID)));
-
-/*
- * IO functions
- */
-_PROTOTYPE(int eofc , (void));
-_PROTOTYPE(int getc , (int ec ));
-_PROTOTYPE(int readc , (void));
-_PROTOTYPE(void unget , (int c ));
-_PROTOTYPE(void ioecho , (int c ));
-_PROTOTYPE(void prs , (char *s ));
-_PROTOTYPE(void putc , (int c ));
-_PROTOTYPE(void prn , (unsigned u ));
-_PROTOTYPE(void closef , (int i ));
-_PROTOTYPE(void closeall , (void));
-
-/*
- * IO control
- */
-_PROTOTYPE(void pushio , (struct ioarg *argp , int (*fn)(_VOID)));
-_PROTOTYPE(int remap , (int fd ));
-_PROTOTYPE(int openpipe , (int *pv ));
-_PROTOTYPE(void closepipe , (int *pv ));
-_PROTOTYPE(struct io *setbase , (struct io *ip ));
-
-extern struct ioarg temparg; /* temporary for PUSHIO */
-#define PUSHIO(what,arg,gen) ((temparg.what = (arg)),pushio(&temparg,(gen)))
-#define RUN(what,arg,gen) ((temparg.what = (arg)), run(&temparg,(gen)))
-
-/* -------- word.h -------- */
-#ifndef WORD_H
-#define WORD_H 1
-struct wdblock {
- short w_bsize;
- short w_nword;
- /* bounds are arbitrary */
- char *w_words[1];
-};
-
-_PROTOTYPE(struct wdblock *addword , (char *wd , struct wdblock *wb ));
-_PROTOTYPE(struct wdblock *newword , (int nw ));
-_PROTOTYPE(char **getwords , (struct wdblock *wb ));
-#endif
-
-/* -------- area.h -------- */
-
-/*
- * storage allocation
- */
-_PROTOTYPE(char *getcell , (unsigned nbytes ));
-_PROTOTYPE(void garbage , (void));
-_PROTOTYPE(void setarea , (char *cp , int a ));
-_PROTOTYPE(int getarea , (char *cp ));
-_PROTOTYPE(void freearea , (int a ));
-_PROTOTYPE(void freecell , (char *cp ));
-
-Extern int areanum; /* current allocation area */
-
-#define NEW(type) (type *)getcell(sizeof(type))
-#define DELETE(obj) freecell((char *)obj)
diff --git a/release/picobsd/tinyware/msh/sh1.c b/release/picobsd/tinyware/msh/sh1.c
deleted file mode 100644
index 34b024d..0000000
--- a/release/picobsd/tinyware/msh/sh1.c
+++ /dev/null
@@ -1,953 +0,0 @@
-#define Extern extern
-#include <sys/types.h>
-#include <signal.h>
-#define _NSIG NSIG
-#include <errno.h>
-#include <setjmp.h>
-#include "sh.h"
-/* -------- sh.c -------- */
-/*
- * shell
- */
-
-/* #include "sh.h" */
-
-int intr;
-int inparse;
-char flags['z'-'a'+1];
-char *flag = flags-'a';
-char *elinep = line+sizeof(line)-5;
-char *null = "";
-int heedint =1;
-struct env e ={line, iostack, iostack-1,
- (xint *)NULL, FDBASE, (struct env *)NULL};
-
-extern char **environ; /* environment pointer */
-
-/*
- * default shell, search rules
- */
-char shellname[] = "/bin/sh";
-char search[] = ":/bin:/usr/bin";
-
-_PROTOTYPE(void (*qflag), (int)) = SIG_IGN;
-
-_PROTOTYPE(int main, (int argc, char **argv ));
-_PROTOTYPE(int newfile, (char *s ));
-_PROTOTYPE(static char *findeq, (char *cp ));
-_PROTOTYPE(static char *cclass, (char *p, int sub ));
-_PROTOTYPE(void initarea, (void));
-
-int main(argc, argv)
-int argc;
-register char **argv;
-{
- register int f;
- register char *s;
- int cflag;
- char *name, **ap;
- int (*iof)();
-
- initarea();
- if ((ap = environ) != NULL) {
- while (*ap)
- assign(*ap++, !COPYV);
- for (ap = environ; *ap;)
- export(lookup(*ap++));
- }
- closeall();
- areanum = 1;
-
- shell = lookup("SHELL");
- if (shell->value == null)
- setval(shell, shellname);
- export(shell);
-
- homedir = lookup("HOME");
- if (homedir->value == null)
- setval(homedir, "/");
- export(homedir);
-
- setval(lookup("$"), itoa(getpid(), 5));
-
- path = lookup("PATH");
- if (path->value == null)
- setval(path, search);
- export(path);
-
- ifs = lookup("IFS");
- if (ifs->value == null)
- setval(ifs, " \t\n");
-
- prompt = lookup("PS1");
- if (prompt->value == null)
-#ifndef UNIXSHELL
- setval(prompt, "$ ");
-#else
- setval(prompt, "% ");
-#endif
-
- if (geteuid() == 0) {
- setval(prompt, "# ");
- prompt->status &= ~EXPORT;
- }
- cprompt = lookup("PS2");
- if (cprompt->value == null)
- setval(cprompt, "> ");
-
- iof = filechar;
- cflag = 0;
- name = *argv++;
- if (--argc >= 1) {
- if(argv[0][0] == '-' && argv[0][1] != '\0') {
- for (s = argv[0]+1; *s; s++)
- switch (*s) {
- case 'c':
- prompt->status &= ~EXPORT;
- cprompt->status &= ~EXPORT;
- setval(prompt, "");
- setval(cprompt, "");
- cflag = 1;
- if (--argc > 0)
- PUSHIO(aword, *++argv, iof = nlchar);
- break;
-
- case 'q':
- qflag = SIG_DFL;
- break;
-
- case 's':
- /* standard input */
- break;
-
- case 't':
- prompt->status &= ~EXPORT;
- setval(prompt, "");
- iof = linechar;
- break;
-
- case 'i':
- talking++;
- default:
- if (*s>='a' && *s<='z')
- flag[*s]++;
- }
- } else {
- argv--;
- argc++;
- }
- if (iof == filechar && --argc > 0) {
- setval(prompt, "");
- setval(cprompt, "");
- prompt->status &= ~EXPORT;
- cprompt->status &= ~EXPORT;
- if (newfile(name = *++argv))
- exit(1);
- }
- }
- setdash();
- if (e.iop < iostack) {
- PUSHIO(afile, 0, iof);
- if (isatty(0) && isatty(1) && !cflag)
- talking++;
- }
- signal(SIGQUIT, qflag);
- if (name && name[0] == '-') {
- talking++;
- if ((f = open(".profile", 0)) >= 0)
- next(remap(f));
- if ((f = open("/etc/profile", 0)) >= 0)
- next(remap(f));
- }
- if (talking)
- signal(SIGTERM, sig);
- if (signal(SIGINT, SIG_IGN) != SIG_IGN)
- signal(SIGINT, onintr);
- dolv = argv;
- dolc = argc;
- dolv[0] = name;
- if (dolc > 1)
- for (ap = ++argv; --argc > 0;)
- if (assign(*ap = *argv++, !COPYV))
- dolc--; /* keyword */
- else
- ap++;
- setval(lookup("#"), putn((--dolc < 0) ? (dolc = 0) : dolc));
-
- for (;;) {
- if (talking && e.iop <= iostack)
- prs(prompt->value);
- onecommand();
- }
-}
-
-void
-setdash()
-{
- register char *cp, c;
- char m['z'-'a'+1];
-
- cp = m;
- for (c='a'; c<='z'; c++)
- if (flag[c])
- *cp++ = c;
- *cp = 0;
- setval(lookup("-"), m);
-}
-
-int
-newfile(s)
-register char *s;
-{
- register f;
-
- if (strcmp(s, "-") != 0) {
- f = open(s, 0);
- if (f < 0) {
- prs(s);
- err(": cannot open");
- return(1);
- }
- } else
- f = 0;
- next(remap(f));
- return(0);
-}
-
-void
-onecommand()
-{
- register i;
- jmp_buf m1;
-
- while (e.oenv)
- quitenv();
- areanum = 1;
- freehere(areanum);
- freearea(areanum);
- garbage();
- wdlist = 0;
- iolist = 0;
- e.errpt = 0;
- e.linep = line;
- yynerrs = 0;
- multiline = 0;
- inparse = 1;
- intr = 0;
- execflg = 0;
- setjmp(failpt = m1); /* Bruce Evans' fix */
- if (setjmp(failpt = m1) || yyparse() || intr) {
- while (e.oenv)
- quitenv();
- scraphere();
- if (!talking && intr)
- leave();
- inparse = 0;
- intr = 0;
- return;
- }
- inparse = 0;
- brklist = 0;
- intr = 0;
- execflg = 0;
- if (!flag['n'])
- execute(outtree, NOPIPE, NOPIPE, 0);
- if (!talking && intr) {
- execflg = 0;
- leave();
- }
- if ((i = trapset) != 0) {
- trapset = 0;
- runtrap(i);
- }
-}
-
-void
-fail()
-{
- longjmp(failpt, 1);
- /* NOTREACHED */
-}
-
-void
-leave()
-{
- if (execflg)
- fail();
- scraphere();
- freehere(1);
- runtrap(0);
- exit(exstat);
- /* NOTREACHED */
-}
-
-void
-warn(s)
-register char *s;
-{
- if(*s) {
- prs(s);
- exstat = -1;
- }
- prs("\n");
- if (flag['e'])
- leave();
-}
-
-void
-err(s)
-char *s;
-{
- warn(s);
- if (flag['n'])
- return;
- if (!talking)
- leave();
- if (e.errpt)
- longjmp(e.errpt, 1);
- closeall();
- e.iop = e.iobase = iostack;
-}
-
-int
-newenv(f)
-int f;
-{
- register struct env *ep;
-
- if (f) {
- quitenv();
- return(1);
- }
- ep = (struct env *) space(sizeof(*ep));
- if (ep == NULL) {
- while (e.oenv)
- quitenv();
- fail();
- }
- *ep = e;
- e.oenv = ep;
- e.errpt = errpt;
- return(0);
-}
-
-void
-quitenv()
-{
- register struct env *ep;
- register fd;
-
- if ((ep = e.oenv) != NULL) {
- fd = e.iofd;
- e = *ep;
- /* should close `'d files */
- DELETE(ep);
- while (--fd >= e.iofd)
- close(fd);
- }
-}
-
-/*
- * Is any character from s1 in s2?
- */
-int
-anys(s1, s2)
-register char *s1, *s2;
-{
- while (*s1)
- if (any(*s1++, s2))
- return(1);
- return(0);
-}
-
-/*
- * Is character c in s?
- */
-int
-any(c, s)
-register int c;
-register char *s;
-{
- while (*s)
- if (*s++ == c)
- return(1);
- return(0);
-}
-
-char *
-putn(n)
-register int n;
-{
- return(itoa(n, -1));
-}
-
-char *
-itoa(u, n)
-register unsigned u;
-int n;
-{
- register char *cp;
- static char s[20];
- int m;
-
- m = 0;
- if (n < 0 && (int) u < 0) {
- m++;
- u = -u;
- }
- cp = s+sizeof(s);
- *--cp = 0;
- do {
- *--cp = u%10 + '0';
- u /= 10;
- } while (--n > 0 || u);
- if (m)
- *--cp = '-';
- return(cp);
-}
-
-void
-next(f)
-int f;
-{
- PUSHIO(afile, f, filechar);
-}
-
-void
-onintr(s)
-int s; /* ANSI C requires a parameter */
-{
- signal(SIGINT, onintr);
- intr = 1;
- if (talking) {
- if (inparse) {
- prs("\n");
- fail();
- }
- }
- else if (heedint) {
- execflg = 0;
- leave();
- }
-}
-
-int
-letter(c)
-register c;
-{
- return((c >= 'a' && c <= 'z') || (c >= 'A' && c <= 'Z') || c == '_');
-}
-
-int
-digit(c)
-register c;
-{
- return(c >= '0' && c <= '9');
-}
-
-int
-letnum(c)
-register c;
-{
- return(letter(c) || digit(c));
-}
-
-char *
-space(n)
-int n;
-{
- register char *cp;
-
- if ((cp = getcell(n)) == 0)
- err("out of string space");
- return(cp);
-}
-
-char *
-strsave(s, a)
-register char *s;
-int a;
-{
- register char *cp, *xp;
-
- if ((cp = space(strlen(s)+1)) != NULL) {
- setarea((char *)cp, a);
- for (xp = cp; (*xp++ = *s++) != '\0';)
- ;
- return(cp);
- }
- return("");
-}
-
-void
-xfree(s)
-register char *s;
-{
- DELETE(s);
-}
-
-/*
- * trap handling
- */
-void
-sig(i)
-register int i;
-{
- trapset = i;
- signal(i, sig);
-}
-
-void runtrap(i)
-int i;
-{
- char *trapstr;
-
- if ((trapstr = trap[i]) == NULL)
- return;
- if (i == 0)
- trap[i] = 0;
- RUN(aword, trapstr, nlchar);
-}
-
-/* -------- var.c -------- */
-/* #include "sh.h" */
-
-/*
- * Find the given name in the dictionary
- * and return its value. If the name was
- * not previously there, enter it now and
- * return a null value.
- */
-struct var *
-lookup(n)
-register char *n;
-{
- register struct var *vp;
- register char *cp;
- register int c;
- static struct var dummy;
-
- if (digit(*n)) {
- dummy.name = n;
- for (c = 0; digit(*n) && c < 1000; n++)
- c = c*10 + *n-'0';
- dummy.status = RONLY;
- dummy.value = c <= dolc? dolv[c]: null;
- return(&dummy);
- }
- for (vp = vlist; vp; vp = vp->next)
- if (eqname(vp->name, n))
- return(vp);
- cp = findeq(n);
- vp = (struct var *)space(sizeof(*vp));
- if (vp == 0 || (vp->name = space((int)(cp-n)+2)) == 0) {
- dummy.name = dummy.value = "";
- return(&dummy);
- }
- for (cp = vp->name; (*cp = *n++) && *cp != '='; cp++)
- ;
- if (*cp == 0)
- *cp = '=';
- *++cp = 0;
- setarea((char *)vp, 0);
- setarea((char *)vp->name, 0);
- vp->value = null;
- vp->next = vlist;
- vp->status = GETCELL;
- vlist = vp;
- return(vp);
-}
-
-/*
- * give variable at `vp' the value `val'.
- */
-void
-setval(vp, val)
-struct var *vp;
-char *val;
-{
- nameval(vp, val, (char *)NULL);
-}
-
-/*
- * if name is not NULL, it must be
- * a prefix of the space `val',
- * and end with `='.
- * this is all so that exporting
- * values is reasonably painless.
- */
-void
-nameval(vp, val, name)
-register struct var *vp;
-char *val, *name;
-{
- register char *cp, *xp;
- char *nv;
- int fl;
-
- if (vp->status & RONLY) {
- for (xp = vp->name; *xp && *xp != '=';)
- putc(*xp++);
- err(" is read-only");
- return;
- }
- fl = 0;
- if (name == NULL) {
- xp = space(strlen(vp->name)+strlen(val)+2);
- if (xp == 0)
- return;
- /* make string: name=value */
- setarea((char *)xp, 0);
- name = xp;
- for (cp = vp->name; (*xp = *cp++) && *xp!='='; xp++)
- ;
- if (*xp++ == 0)
- xp[-1] = '=';
- nv = xp;
- for (cp = val; (*xp++ = *cp++) != '\0';)
- ;
- val = nv;
- fl = GETCELL;
- }
- if (vp->status & GETCELL)
- xfree(vp->name); /* form new string `name=value' */
- vp->name = name;
- vp->value = val;
- vp->status |= fl;
-}
-
-void
-export(vp)
-struct var *vp;
-{
- vp->status |= EXPORT;
-}
-
-void
-ronly(vp)
-struct var *vp;
-{
- if (letter(vp->name[0])) /* not an internal symbol ($# etc) */
- vp->status |= RONLY;
-}
-
-int
-isassign(s)
-register char *s;
-{
- if (!letter((int)*s))
- return(0);
- for (; *s != '='; s++)
- if (*s == 0 || !letnum(*s))
- return(0);
- return(1);
-}
-
-int
-assign(s, cf)
-register char *s;
-int cf;
-{
- register char *cp;
- struct var *vp;
-
- if (!letter(*s))
- return(0);
- for (cp = s; *cp != '='; cp++)
- if (*cp == 0 || !letnum(*cp))
- return(0);
- vp = lookup(s);
- nameval(vp, ++cp, cf == COPYV? (char *)NULL: s);
- if (cf != COPYV)
- vp->status &= ~GETCELL;
- return(1);
-}
-
-int
-checkname(cp)
-register char *cp;
-{
- if (!letter(*cp++))
- return(0);
- while (*cp)
- if (!letnum(*cp++))
- return(0);
- return(1);
-}
-
-void
-putvlist(f, out)
-register int f, out;
-{
- register struct var *vp;
-
- for (vp = vlist; vp; vp = vp->next)
- if (vp->status & f && letter(*vp->name)) {
- if (vp->status & EXPORT)
- write(out, "export ", 7);
- if (vp->status & RONLY)
- write(out, "readonly ", 9);
- write(out, vp->name, (int)(findeq(vp->name) - vp->name));
- write(out, "\n", 1);
- }
-}
-
-int
-eqname(n1, n2)
-register char *n1, *n2;
-{
- for (; *n1 != '=' && *n1 != 0; n1++)
- if (*n2++ != *n1)
- return(0);
- return(*n2 == 0 || *n2 == '=');
-}
-
-static char *
-findeq(cp)
-register char *cp;
-{
- while (*cp != '\0' && *cp != '=')
- cp++;
- return(cp);
-}
-
-/* -------- gmatch.c -------- */
-/*
- * int gmatch(string, pattern)
- * char *string, *pattern;
- *
- * Match a pattern as in sh(1).
- */
-
-#define CMASK 0377
-#define QUOTE 0200
-#define QMASK (CMASK&~QUOTE)
-#define NOT '!' /* might use ^ */
-
-int
-gmatch(s, p)
-register char *s, *p;
-{
- register int sc, pc;
-
- if (s == NULL || p == NULL)
- return(0);
- while ((pc = *p++ & CMASK) != '\0') {
- sc = *s++ & QMASK;
- switch (pc) {
- case '[':
- if ((p = cclass(p, sc)) == NULL)
- return(0);
- break;
-
- case '?':
- if (sc == 0)
- return(0);
- break;
-
- case '*':
- s--;
- do {
- if (*p == '\0' || gmatch(s, p))
- return(1);
- } while (*s++ != '\0');
- return(0);
-
- default:
- if (sc != (pc&~QUOTE))
- return(0);
- }
- }
- return(*s == 0);
-}
-
-static char *
-cclass(p, sub)
-register char *p;
-register int sub;
-{
- register int c, d, not, found;
-
- if ((not = *p == NOT) != 0)
- p++;
- found = not;
- do {
- if (*p == '\0')
- return((char *)NULL);
- c = *p & CMASK;
- if (p[1] == '-' && p[2] != ']') {
- d = p[2] & CMASK;
- p++;
- } else
- d = c;
- if (c == sub || (c <= sub && sub <= d))
- found = !not;
- } while (*++p != ']');
- return(found? p+1: (char *)NULL);
-}
-
-/* -------- area.c -------- */
-#define REGSIZE sizeof(struct region)
-#define GROWBY 256
-#undef SHRINKBY 64
-#define FREE 32767
-#define BUSY 0
-#define ALIGN (sizeof(int)-1)
-
-/* #include "area.h" */
-
-struct region {
- struct region *next;
- int area;
-};
-
-/*
- * All memory between (char *)areabot and (char *)(areatop+1) is
- * exclusively administered by the area management routines.
- * It is assumed that sbrk() and brk() manipulate the high end.
- */
-static struct region *areabot; /* bottom of area */
-static struct region *areatop; /* top of area */
-static struct region *areanxt; /* starting point of scan */
-
-void
-initarea()
-{
- while ((int)sbrk(0) & ALIGN)
- sbrk(1);
- areabot = (struct region *)sbrk(REGSIZE);
- areabot->next = areabot;
- areabot->area = BUSY;
- areatop = areabot;
- areanxt = areabot;
-}
-
-char *
-getcell(nbytes)
-unsigned nbytes;
-{
- register int nregio;
- register struct region *p, *q;
- register i;
-
- if (nbytes == 0)
- abort(); /* silly and defeats the algorithm */
- /*
- * round upwards and add administration area
- */
- nregio = (nbytes+(REGSIZE-1))/REGSIZE + 1;
- for (p = areanxt;;) {
- if (p->area > areanum) {
- /*
- * merge free cells
- */
- while ((q = p->next)->area > areanum && q != areanxt)
- p->next = q->next;
- /*
- * exit loop if cell big enough
- */
- if (q >= p + nregio)
- goto found;
- }
- p = p->next;
- if (p == areanxt)
- break;
- }
- i = nregio >= GROWBY ? nregio : GROWBY;
- p = (struct region *)sbrk(i * REGSIZE);
- if (p == (struct region *)-1)
- return((char *)NULL);
- p--;
- if (p != areatop)
- abort(); /* allocated areas are contiguous */
- q = p + i;
- p->next = q;
- p->area = FREE;
- q->next = areabot;
- q->area = BUSY;
- areatop = q;
-found:
- /*
- * we found a FREE area big enough, pointed to by 'p', and up to 'q'
- */
- areanxt = p + nregio;
- if (areanxt < q) {
- /*
- * split into requested area and rest
- */
- if (areanxt+1 > q)
- abort(); /* insufficient space left for admin */
- areanxt->next = q;
- areanxt->area = FREE;
- p->next = areanxt;
- }
- p->area = areanum;
- return((char *)(p+1));
-}
-
-void
-freecell(cp)
-char *cp;
-{
- register struct region *p;
-
- if ((p = (struct region *)cp) != NULL) {
- p--;
- if (p < areanxt)
- areanxt = p;
- p->area = FREE;
- }
-}
-
-void
-freearea(a)
-register int a;
-{
- register struct region *p, *top;
-
- top = areatop;
- for (p = areabot; p != top; p = p->next)
- if (p->area >= a)
- p->area = FREE;
-}
-
-void
-setarea(cp,a)
-char *cp;
-int a;
-{
- register struct region *p;
-
- if ((p = (struct region *)cp) != NULL)
- (p-1)->area = a;
-}
-
-int
-getarea(cp)
-char *cp;
-{
- return ((struct region*)cp-1)->area;
-}
-
-void
-garbage()
-{
- register struct region *p, *q, *top;
-
- top = areatop;
- for (p = areabot; p != top; p = p->next) {
- if (p->area > areanum) {
- while ((q = p->next)->area > areanum)
- p->next = q->next;
- areanxt = p;
- }
- }
-#ifdef SHRINKBY
- if (areatop >= q + SHRINKBY && q->area > areanum) {
- brk((char *)(q+1));
- q->next = areabot;
- q->area = BUSY;
- areatop = q;
- }
-#endif
-}
diff --git a/release/picobsd/tinyware/msh/sh2.c b/release/picobsd/tinyware/msh/sh2.c
deleted file mode 100644
index f7eaf017..0000000
--- a/release/picobsd/tinyware/msh/sh2.c
+++ /dev/null
@@ -1,801 +0,0 @@
-#define Extern extern
-#include <sys/types.h>
-#include <signal.h>
-#define _NSIG NSIG
-#include <errno.h>
-#include <setjmp.h>
-#include "sh.h"
-
-/* -------- csyn.c -------- */
-/*
- * shell: syntax (C version)
- */
-
-typedef union {
- char *cp;
- char **wp;
- int i;
- struct op *o;
-} YYSTYPE;
-#define WORD 256
-#define LOGAND 257
-#define LOGOR 258
-#define BREAK 259
-#define IF 260
-#define THEN 261
-#define ELSE 262
-#define ELIF 263
-#define FI 264
-#define CASE 265
-#define ESAC 266
-#define FOR 267
-#define WHILE 268
-#define UNTIL 269
-#define DO 270
-#define DONE 271
-#define IN 272
-#define YYERRCODE 300
-
-/* flags to yylex */
-#define CONTIN 01 /* skip new lines to complete command */
-
-/* #include "sh.h" */
-#define SYNTAXERR zzerr()
-static int startl;
-static int peeksym;
-static int nlseen;
-static int iounit = IODEFAULT;
-
-static YYSTYPE yylval;
-
-_PROTOTYPE(static struct op *pipeline, (int cf ));
-_PROTOTYPE(static struct op *andor, (void));
-_PROTOTYPE(static struct op *c_list, (void));
-_PROTOTYPE(static int synio, (int cf ));
-_PROTOTYPE(static void musthave, (int c, int cf ));
-_PROTOTYPE(static struct op *simple, (void));
-_PROTOTYPE(static struct op *nested, (int type, int mark ));
-_PROTOTYPE(static struct op *command, (int cf ));
-_PROTOTYPE(static struct op *dogroup, (int onlydone ));
-_PROTOTYPE(static struct op *thenpart, (void));
-_PROTOTYPE(static struct op *elsepart, (void));
-_PROTOTYPE(static struct op *caselist, (void));
-_PROTOTYPE(static struct op *casepart, (void));
-_PROTOTYPE(static char **pattern, (void));
-_PROTOTYPE(static char **wordlist, (void));
-_PROTOTYPE(static struct op *list, (struct op *t1, struct op *t2 ));
-_PROTOTYPE(static struct op *block, (int type, struct op *t1, struct op *t2, char **wp ));
-_PROTOTYPE(static struct op *newtp, (void));
-_PROTOTYPE(static struct op *namelist, (struct op *t ));
-_PROTOTYPE(static char **copyw, (void));
-_PROTOTYPE(static void word, (char *cp ));
-_PROTOTYPE(static struct ioword **copyio, (void));
-_PROTOTYPE(static struct ioword *io, (int u, int f, char *cp ));
-_PROTOTYPE(static void zzerr, (void));
-_PROTOTYPE(void yyerror, (char *s ));
-_PROTOTYPE(static int yylex, (int cf ));
-_PROTOTYPE(int collect, (int c, int c1 ));
-_PROTOTYPE(int dual, (int c ));
-_PROTOTYPE(static void diag, (int ec ));
-_PROTOTYPE(static char *tree, (unsigned size ));
-_PROTOTYPE(void printf, (char *s ));
-
-int
-yyparse()
-{
- startl = 1;
- peeksym = 0;
- yynerrs = 0;
- outtree = c_list();
- musthave('\n', 0);
- return(yynerrs!=0);
-}
-
-static struct op *
-pipeline(cf)
-int cf;
-{
- register struct op *t, *p;
- register int c;
-
- t = command(cf);
- if (t != NULL) {
- while ((c = yylex(0)) == '|') {
- if ((p = command(CONTIN)) == NULL)
- SYNTAXERR;
- if (t->type != TPAREN && t->type != TCOM) {
- /* shell statement */
- t = block(TPAREN, t, NOBLOCK, NOWORDS);
- }
- t = block(TPIPE, t, p, NOWORDS);
- }
- peeksym = c;
- }
- return(t);
-}
-
-static struct op *
-andor()
-{
- register struct op *t, *p;
- register int c;
-
- t = pipeline(0);
- if (t != NULL) {
- while ((c = yylex(0)) == LOGAND || c == LOGOR) {
- if ((p = pipeline(CONTIN)) == NULL)
- SYNTAXERR;
- t = block(c == LOGAND? TAND: TOR, t, p, NOWORDS);
- }
- peeksym = c;
- }
- return(t);
-}
-
-static struct op *
-c_list()
-{
- register struct op *t, *p;
- register int c;
-
- t = andor();
- if (t != NULL) {
- if((peeksym = yylex(0)) == '&')
- t = block(TASYNC, t, NOBLOCK, NOWORDS);
- while ((c = yylex(0)) == ';' || c == '&' || (multiline && c == '\n')) {
- if ((p = andor()) == NULL)
- return(t);
- if((peeksym = yylex(0)) == '&')
- p = block(TASYNC, p, NOBLOCK, NOWORDS);
- t = list(t, p);
- }
- peeksym = c;
- }
- return(t);
-}
-
-
-static int
-synio(cf)
-int cf;
-{
- register struct ioword *iop;
- register int i;
- register int c;
-
- if ((c = yylex(cf)) != '<' && c != '>') {
- peeksym = c;
- return(0);
- }
- i = yylval.i;
- musthave(WORD, 0);
- iop = io(iounit, i, yylval.cp);
- iounit = IODEFAULT;
- if (i & IOHERE)
- markhere(yylval.cp, iop);
- return(1);
-}
-
-static void
-musthave(c, cf)
-int c, cf;
-{
- if ((peeksym = yylex(cf)) != c)
- SYNTAXERR;
- peeksym = 0;
-}
-
-static struct op *
-simple()
-{
- register struct op *t;
-
- t = NULL;
- for (;;) {
- switch (peeksym = yylex(0)) {
- case '<':
- case '>':
- (void) synio(0);
- break;
-
- case WORD:
- if (t == NULL) {
- t = newtp();
- t->type = TCOM;
- }
- peeksym = 0;
- word(yylval.cp);
- break;
-
- default:
- return(t);
- }
- }
-}
-
-static struct op *
-nested(type, mark)
-int type, mark;
-{
- register struct op *t;
-
- multiline++;
- t = c_list();
- musthave(mark, 0);
- multiline--;
- return(block(type, t, NOBLOCK, NOWORDS));
-}
-
-static struct op *
-command(cf)
-int cf;
-{
- register struct op *t;
- struct wdblock *iosave;
- register int c;
-
- iosave = iolist;
- iolist = NULL;
- if (multiline)
- cf |= CONTIN;
- while (synio(cf))
- cf = 0;
- switch (c = yylex(cf)) {
- default:
- peeksym = c;
- if ((t = simple()) == NULL) {
- if (iolist == NULL)
- return((struct op *)NULL);
- t = newtp();
- t->type = TCOM;
- }
- break;
-
- case '(':
- t = nested(TPAREN, ')');
- break;
-
- case '{':
- t = nested(TBRACE, '}');
- break;
-
- case FOR:
- t = newtp();
- t->type = TFOR;
- musthave(WORD, 0);
- startl = 1;
- t->str = yylval.cp;
- multiline++;
- t->words = wordlist();
- if ((c = yylex(0)) != '\n' && c != ';')
- peeksym = c;
- t->left = dogroup(0);
- multiline--;
- break;
-
- case WHILE:
- case UNTIL:
- multiline++;
- t = newtp();
- t->type = c == WHILE? TWHILE: TUNTIL;
- t->left = c_list();
- t->right = dogroup(1);
- t->words = NULL;
- multiline--;
- break;
-
- case CASE:
- t = newtp();
- t->type = TCASE;
- musthave(WORD, 0);
- t->str = yylval.cp;
- startl++;
- multiline++;
- musthave(IN, CONTIN);
- startl++;
- t->left = caselist();
- musthave(ESAC, 0);
- multiline--;
- break;
-
- case IF:
- multiline++;
- t = newtp();
- t->type = TIF;
- t->left = c_list();
- t->right = thenpart();
- musthave(FI, 0);
- multiline--;
- break;
- }
- while (synio(0))
- ;
- t = namelist(t);
- iolist = iosave;
- return(t);
-}
-
-static struct op *
-dogroup(onlydone)
-int onlydone;
-{
- register int c;
- register struct op *list;
-
- c = yylex(CONTIN);
- if (c == DONE && onlydone)
- return((struct op *)NULL);
- if (c != DO)
- SYNTAXERR;
- list = c_list();
- musthave(DONE, 0);
- return(list);
-}
-
-static struct op *
-thenpart()
-{
- register int c;
- register struct op *t;
-
- if ((c = yylex(0)) != THEN) {
- peeksym = c;
- return((struct op *)NULL);
- }
- t = newtp();
- t->type = 0;
- t->left = c_list();
- if (t->left == NULL)
- SYNTAXERR;
- t->right = elsepart();
- return(t);
-}
-
-static struct op *
-elsepart()
-{
- register int c;
- register struct op *t;
-
- switch (c = yylex(0)) {
- case ELSE:
- if ((t = c_list()) == NULL)
- SYNTAXERR;
- return(t);
-
- case ELIF:
- t = newtp();
- t->type = TELIF;
- t->left = c_list();
- t->right = thenpart();
- return(t);
-
- default:
- peeksym = c;
- return((struct op *)NULL);
- }
-}
-
-static struct op *
-caselist()
-{
- register struct op *t;
-
- t = NULL;
- while ((peeksym = yylex(CONTIN)) != ESAC)
- t = list(t, casepart());
- return(t);
-}
-
-static struct op *
-casepart()
-{
- register struct op *t;
-
- t = newtp();
- t->type = TPAT;
- t->words = pattern();
- musthave(')', 0);
- t->left = c_list();
- if ((peeksym = yylex(CONTIN)) != ESAC)
- musthave(BREAK, CONTIN);
- return(t);
-}
-
-static char **
-pattern()
-{
- register int c, cf;
-
- cf = CONTIN;
- do {
- musthave(WORD, cf);
- word(yylval.cp);
- cf = 0;
- } while ((c = yylex(0)) == '|');
- peeksym = c;
- word(NOWORD);
- return(copyw());
-}
-
-static char **
-wordlist()
-{
- register int c;
-
- if ((c = yylex(0)) != IN) {
- peeksym = c;
- return((char **)NULL);
- }
- startl = 0;
- while ((c = yylex(0)) == WORD)
- word(yylval.cp);
- word(NOWORD);
- peeksym = c;
- return(copyw());
-}
-
-/*
- * supporting functions
- */
-static struct op *
-list(t1, t2)
-register struct op *t1, *t2;
-{
- if (t1 == NULL)
- return(t2);
- if (t2 == NULL)
- return(t1);
- return(block(TLIST, t1, t2, NOWORDS));
-}
-
-static struct op *
-block(type, t1, t2, wp)
-int type;
-struct op *t1, *t2;
-char **wp;
-{
- register struct op *t;
-
- t = newtp();
- t->type = type;
- t->left = t1;
- t->right = t2;
- t->words = wp;
- return(t);
-}
-
-struct res {
- char *r_name;
- int r_val;
-} restab[] = {
- "for", FOR,
- "case", CASE,
- "esac", ESAC,
- "while", WHILE,
- "do", DO,
- "done", DONE,
- "if", IF,
- "in", IN,
- "then", THEN,
- "else", ELSE,
- "elif", ELIF,
- "until", UNTIL,
- "fi", FI,
-
- ";;", BREAK,
- "||", LOGOR,
- "&&", LOGAND,
- "{", '{',
- "}", '}',
-
- 0,
-};
-
-int
-rlookup(n)
-register char *n;
-{
- register struct res *rp;
-
- for (rp = restab; rp->r_name; rp++)
- if (strcmp(rp->r_name, n) == 0)
- return(rp->r_val);
- return(0);
-}
-
-static struct op *
-newtp()
-{
- register struct op *t;
-
- t = (struct op *)tree(sizeof(*t));
- t->type = 0;
- t->words = NULL;
- t->ioact = NULL;
- t->left = NULL;
- t->right = NULL;
- t->str = NULL;
- return(t);
-}
-
-static struct op *
-namelist(t)
-register struct op *t;
-{
- if (iolist) {
- iolist = addword((char *)NULL, iolist);
- t->ioact = copyio();
- } else
- t->ioact = NULL;
- if (t->type != TCOM) {
- if (t->type != TPAREN && t->ioact != NULL) {
- t = block(TPAREN, t, NOBLOCK, NOWORDS);
- t->ioact = t->left->ioact;
- t->left->ioact = NULL;
- }
- return(t);
- }
- word(NOWORD);
- t->words = copyw();
- return(t);
-}
-
-static char **
-copyw()
-{
- register char **wd;
-
- wd = getwords(wdlist);
- wdlist = 0;
- return(wd);
-}
-
-static void
-word(cp)
-char *cp;
-{
- wdlist = addword(cp, wdlist);
-}
-
-static struct ioword **
-copyio()
-{
- register struct ioword **iop;
-
- iop = (struct ioword **) getwords(iolist);
- iolist = 0;
- return(iop);
-}
-
-static struct ioword *
-io(u, f, cp)
-int u;
-int f;
-char *cp;
-{
- register struct ioword *iop;
-
- iop = (struct ioword *) tree(sizeof(*iop));
- iop->io_unit = u;
- iop->io_flag = f;
- iop->io_name = cp;
- iolist = addword((char *)iop, iolist);
- return(iop);
-}
-
-static void
-zzerr()
-{
- yyerror("syntax error");
-}
-
-void
-yyerror(s)
-char *s;
-{
- yynerrs++;
- if (talking && e.iop <= iostack) {
- multiline = 0;
- while (eofc() == 0 && yylex(0) != '\n')
- ;
- }
- err(s);
- fail();
-}
-
-static int
-yylex(cf)
-int cf;
-{
- register int c, c1;
- int atstart;
-
- if ((c = peeksym) > 0) {
- peeksym = 0;
- if (c == '\n')
- startl = 1;
- return(c);
- }
- nlseen = 0;
- e.linep = line;
- atstart = startl;
- startl = 0;
- yylval.i = 0;
-
-loop:
- while ((c = getc(0)) == ' ' || c == '\t')
- ;
- switch (c) {
- default:
- if (any(c, "0123456789")) {
- unget(c1 = getc(0));
- if (c1 == '<' || c1 == '>') {
- iounit = c - '0';
- goto loop;
- }
- *e.linep++ = c;
- c = c1;
- }
- break;
-
- case '#':
- while ((c = getc(0)) != 0 && c != '\n')
- ;
- unget(c);
- goto loop;
-
- case 0:
- return(c);
-
- case '$':
- *e.linep++ = c;
- if ((c = getc(0)) == '{') {
- if ((c = collect(c, '}')) != '\0')
- return(c);
- goto pack;
- }
- break;
-
- case '`':
- case '\'':
- case '"':
- if ((c = collect(c, c)) != '\0')
- return(c);
- goto pack;
-
- case '|':
- case '&':
- case ';':
- if ((c1 = dual(c)) != '\0') {
- startl = 1;
- return(c1);
- }
- startl = 1;
- return(c);
- case '^':
- startl = 1;
- return('|');
- case '>':
- case '<':
- diag(c);
- return(c);
-
- case '\n':
- nlseen++;
- gethere();
- startl = 1;
- if (multiline || cf & CONTIN) {
- if (talking && e.iop <= iostack)
- prs(cprompt->value);
- if (cf & CONTIN)
- goto loop;
- }
- return(c);
-
- case '(':
- case ')':
- startl = 1;
- return(c);
- }
-
- unget(c);
-
-pack:
- while ((c = getc(0)) != 0 && !any(c, "`$ '\"\t;&<>()|^\n"))
- if (e.linep >= elinep)
- err("word too long");
- else
- *e.linep++ = c;
- unget(c);
- if(any(c, "\"'`$"))
- goto loop;
- *e.linep++ = '\0';
- if (atstart && (c = rlookup(line))!=0) {
- startl = 1;
- return(c);
- }
- yylval.cp = strsave(line, areanum);
- return(WORD);
-}
-
-int
-collect(c, c1)
-register c, c1;
-{
- char s[2];
-
- *e.linep++ = c;
- while ((c = getc(c1)) != c1) {
- if (c == 0) {
- unget(c);
- s[0] = c1;
- s[1] = 0;
- prs("no closing "); yyerror(s);
- return(YYERRCODE);
- }
- if (talking && c == '\n' && e.iop <= iostack)
- prs(cprompt->value);
- *e.linep++ = c;
- }
- *e.linep++ = c;
- return(0);
-}
-
-int
-dual(c)
-register c;
-{
- char s[3];
- register char *cp = s;
-
- *cp++ = c;
- *cp++ = getc(0);
- *cp = 0;
- if ((c = rlookup(s)) == 0)
- unget(*--cp);
- return(c);
-}
-
-static void
-diag(ec)
-register int ec;
-{
- register int c;
-
- c = getc(0);
- if (c == '>' || c == '<') {
- if (c != ec)
- zzerr();
- yylval.i = ec == '>'? IOWRITE|IOCAT: IOHERE;
- c = getc(0);
- } else
- yylval.i = ec == '>'? IOWRITE: IOREAD;
- if (c != '&' || yylval.i == IOHERE)
- unget(c);
- else
- yylval.i |= IODUP;
-}
-
-static char *
-tree(size)
-unsigned size;
-{
- register char *t;
-
- if ((t = getcell(size)) == NULL) {
- prs("command line too complicated\n");
- fail();
- /* NOTREACHED */
- }
- return(t);
-}
-
-/* VARARGS1 */
-/* ARGSUSED */
-void
-printf(s) /* yyparse calls it */
-char *s;
-{
-}
-
diff --git a/release/picobsd/tinyware/msh/sh3.c b/release/picobsd/tinyware/msh/sh3.c
deleted file mode 100644
index 5959f27..0000000
--- a/release/picobsd/tinyware/msh/sh3.c
+++ /dev/null
@@ -1,1143 +0,0 @@
-#define Extern extern
-#include <sys/types.h>
-#include <signal.h>
-#define _NSIG NSIG
-#include <errno.h>
-#include <setjmp.h>
-#include <stddef.h>
-#include <time.h>
-#include <sys/times.h>
-#include <sys/stat.h>
-#include <sys/wait.h>
-#undef NULL
-#include "sh.h"
-
-/* -------- exec.c -------- */
-/* #include "sh.h" */
-
-/*
- * execute tree
- */
-
-static char *signame[] = {
- "Signal 0",
- "Hangup",
- (char *)NULL, /* interrupt */
- "Quit",
- "Illegal instruction",
- "Trace/BPT trap",
- "Abort",
- "EMT trap",
- "Floating exception",
- "Killed",
- "Bus error",
- "Memory fault",
- "Bad system call",
- (char *)NULL, /* broken pipe */
- "Alarm clock",
- "Terminated",
-};
-#define NSIGNAL (sizeof(signame)/sizeof(signame[0]))
-
-
-_PROTOTYPE(static int forkexec, (struct op *t, int *pin, int *pout, int act, char **wp, int *pforked ));
-_PROTOTYPE(static int parent, (void));
-_PROTOTYPE(int iosetup, (struct ioword *iop, int pipein, int pipeout ));
-_PROTOTYPE(static void echo, (char **wp ));
-_PROTOTYPE(static struct op **find1case, (struct op *t, char *w ));
-_PROTOTYPE(static struct op *findcase, (struct op *t, char *w ));
-_PROTOTYPE(static void brkset, (struct brkcon *bc ));
-_PROTOTYPE(int dolabel, (void));
-_PROTOTYPE(int dochdir, (struct op *t ));
-_PROTOTYPE(int doshift, (struct op *t ));
-_PROTOTYPE(int dologin, (struct op *t ));
-_PROTOTYPE(int doumask, (struct op *t ));
-_PROTOTYPE(int doexec, (struct op *t ));
-_PROTOTYPE(int dodot, (struct op *t ));
-_PROTOTYPE(int dowait, (struct op *t ));
-_PROTOTYPE(int doread, (struct op *t ));
-_PROTOTYPE(int doeval, (struct op *t ));
-_PROTOTYPE(int dotrap, (struct op *t ));
-_PROTOTYPE(int getsig, (char *s ));
-_PROTOTYPE(void setsig, (int n, void (*f)()));
-_PROTOTYPE(int getn, (char *as ));
-_PROTOTYPE(int dobreak, (struct op *t ));
-_PROTOTYPE(int docontinue, (struct op *t ));
-_PROTOTYPE(static int brkcontin, (char *cp, int val ));
-_PROTOTYPE(int doexit, (struct op *t ));
-_PROTOTYPE(int doexport, (struct op *t ));
-_PROTOTYPE(int doreadonly, (struct op *t ));
-_PROTOTYPE(static void rdexp, (char **wp, void (*f)(), int key));
-_PROTOTYPE(static void badid, (char *s ));
-_PROTOTYPE(int doset, (struct op *t ));
-_PROTOTYPE(void varput, (char *s, int out ));
-_PROTOTYPE(int dotimes, (void));
-
-int
-execute(t, pin, pout, act)
-register struct op *t;
-int *pin, *pout;
-int act;
-{
- register struct op *t1;
- int i, pv[2], rv, child, a;
- char *cp, **wp, **wp2;
- struct var *vp;
- struct brkcon bc;
-
- if (t == NULL)
- return(0);
- rv = 0;
- a = areanum++;
- wp = (wp2 = t->words) != NULL
- ? eval(wp2, t->type == TCOM ? DOALL : DOALL & ~DOKEY)
- : NULL;
-
- switch(t->type) {
- case TPAREN:
- case TCOM:
- rv = forkexec(t, pin, pout, act, wp, &child);
- if (child) {
- exstat = rv;
- leave();
- }
- break;
-
- case TPIPE:
- if ((rv = openpipe(pv)) < 0)
- break;
- pv[0] = remap(pv[0]);
- pv[1] = remap(pv[1]);
- (void) execute(t->left, pin, pv, 0);
- rv = execute(t->right, pv, pout, 0);
- break;
-
- case TLIST:
- (void) execute(t->left, pin, pout, 0);
- rv = execute(t->right, pin, pout, 0);
- break;
-
- case TASYNC:
- i = parent();
- if (i != 0) {
- if (i != -1) {
- setval(lookup("!"), putn(i));
- if (pin != NULL)
- closepipe(pin);
- if (talking) {
- prs(putn(i));
- prs("\n");
- }
- } else
- rv = -1;
- setstatus(rv);
- } else {
- signal(SIGINT, SIG_IGN);
- signal(SIGQUIT, SIG_IGN);
- if (talking)
- signal(SIGTERM, SIG_DFL);
- talking = 0;
- if (pin == NULL) {
- close(0);
- open("/dev/null", 0);
- }
- exit(execute(t->left, pin, pout, FEXEC));
- }
- break;
-
- case TOR:
- case TAND:
- rv = execute(t->left, pin, pout, 0);
- if ((t1 = t->right)!=NULL && (rv == 0) == (t->type == TAND))
- rv = execute(t1, pin, pout, 0);
- break;
-
- case TFOR:
- if (wp == NULL) {
- wp = dolv+1;
- if ((i = dolc) < 0)
- i = 0;
- } else {
- i = -1;
- while (*wp++ != NULL)
- ;
- }
- vp = lookup(t->str);
- while (setjmp(bc.brkpt))
- if (isbreak)
- goto broken;
- brkset(&bc);
- for (t1 = t->left; i-- && *wp != NULL;) {
- setval(vp, *wp++);
- rv = execute(t1, pin, pout, 0);
- }
- brklist = brklist->nextlev;
- break;
-
- case TWHILE:
- case TUNTIL:
- while (setjmp(bc.brkpt))
- if (isbreak)
- goto broken;
- brkset(&bc);
- t1 = t->left;
- while ((execute(t1, pin, pout, 0) == 0) == (t->type == TWHILE))
- rv = execute(t->right, pin, pout, 0);
- brklist = brklist->nextlev;
- break;
-
- case TIF:
- case TELIF:
- if (t->right != NULL) {
- rv = !execute(t->left, pin, pout, 0) ?
- execute(t->right->left, pin, pout, 0):
- execute(t->right->right, pin, pout, 0);
- }
- break;
-
- case TCASE:
- if ((cp = evalstr(t->str, DOSUB|DOTRIM)) == 0)
- cp = "";
- if ((t1 = findcase(t->left, cp)) != NULL)
- rv = execute(t1, pin, pout, 0);
- break;
-
- case TBRACE:
-/*
- if (iopp = t->ioact)
- while (*iopp)
- if (iosetup(*iopp++, pin!=NULL, pout!=NULL)) {
- rv = -1;
- break;
- }
-*/
- if (rv >= 0 && (t1 = t->left))
- rv = execute(t1, pin, pout, 0);
- break;
- }
-
-broken:
- t->words = wp2;
- isbreak = 0;
- freehere(areanum);
- freearea(areanum);
- areanum = a;
- if (talking && intr) {
- closeall();
- fail();
- }
- if ((i = trapset) != 0) {
- trapset = 0;
- runtrap(i);
- }
- return(rv);
-}
-
-static int
-forkexec(t, pin, pout, act, wp, pforked)
-register struct op *t;
-int *pin, *pout;
-int act;
-char **wp;
-int *pforked;
-{
- int i, rv, (*shcom)();
- register int f;
- char *cp;
- struct ioword **iopp;
- int resetsig;
- char **owp;
-
- owp = wp;
- resetsig = 0;
- *pforked = 0;
- shcom = NULL;
- rv = -1; /* system-detected error */
- if (t->type == TCOM) {
- while ((cp = *wp++) != NULL)
- ;
- cp = *wp;
-
- /* strip all initial assignments */
- /* not correct wrt PATH=yyy command etc */
- if (flag['x'])
- echo (cp ? wp: owp);
- if (cp == NULL && t->ioact == NULL) {
- while ((cp = *owp++) != NULL && assign(cp, COPYV))
- ;
- return(setstatus(0));
- }
- else if (cp != NULL)
- shcom = inbuilt(cp);
- }
- t->words = wp;
- f = act;
- if (shcom == NULL && (f & FEXEC) == 0) {
- i = parent();
- if (i != 0) {
- if (i == -1)
- return(rv);
- if (pin != NULL)
- closepipe(pin);
- return(pout==NULL? setstatus(waitfor(i,0)): 0);
- }
- if (talking) {
- signal(SIGINT, SIG_IGN);
- signal(SIGQUIT, SIG_IGN);
- resetsig = 1;
- }
- talking = 0;
- intr = 0;
- (*pforked)++;
- brklist = 0;
- execflg = 0;
- }
- if (owp != NULL)
- while ((cp = *owp++) != NULL && assign(cp, COPYV))
- if (shcom == NULL)
- export(lookup(cp));
-#ifdef COMPIPE
- if ((pin != NULL || pout != NULL) && shcom != NULL && shcom != doexec) {
- err("piping to/from shell builtins not yet done");
- return(-1);
- }
-#endif
- if (pin != NULL) {
- dup2(pin[0], 0);
- closepipe(pin);
- }
- if (pout != NULL) {
- dup2(pout[1], 1);
- closepipe(pout);
- }
- if ((iopp = t->ioact) != NULL) {
- if (shcom != NULL && shcom != doexec) {
- prs(cp);
- err(": cannot redirect shell command");
- return(-1);
- }
- while (*iopp)
- if (iosetup(*iopp++, pin!=NULL, pout!=NULL))
- return(rv);
- }
- if (shcom)
- return(setstatus((*shcom)(t)));
- /* should use FIOCEXCL */
- for (i=FDBASE; i<NOFILE; i++)
- close(i);
- if (resetsig) {
- signal(SIGINT, SIG_DFL);
- signal(SIGQUIT, SIG_DFL);
- }
- if (t->type == TPAREN)
- exit(execute(t->left, NOPIPE, NOPIPE, FEXEC));
- if (wp[0] == NULL)
- exit(0);
- cp = rexecve(wp[0], wp, makenv());
- prs(wp[0]); prs(": "); warn(cp);
- if (!execflg)
- trap[0] = NULL;
- leave();
- /* NOTREACHED */
-}
-
-/*
- * common actions when creating a new child
- */
-static int
-parent()
-{
- register int i;
-
- i = fork();
- if (i != 0) {
- if (i == -1)
- warn("try again");
- }
- return(i);
-}
-
-/*
- * 0< 1> are ignored as required
- * within pipelines.
- */
-int
-iosetup(iop, pipein, pipeout)
-register struct ioword *iop;
-int pipein, pipeout;
-{
- register u;
- char *cp, *msg;
-
- if (iop->io_unit == IODEFAULT) /* take default */
- iop->io_unit = iop->io_flag&(IOREAD|IOHERE)? 0: 1;
- if (pipein && iop->io_unit == 0)
- return(0);
- if (pipeout && iop->io_unit == 1)
- return(0);
- msg = iop->io_flag&(IOREAD|IOHERE)? "open": "create";
- if ((iop->io_flag & IOHERE) == 0) {
- cp = iop->io_name;
- if ((cp = evalstr(cp, DOSUB|DOTRIM)) == NULL)
- return(1);
- }
- if (iop->io_flag & IODUP) {
- if (cp[1] || (!digit(*cp) && *cp != '-')) {
- prs(cp);
- err(": illegal >& argument");
- return(1);
- }
- if (*cp == '-')
- iop->io_flag = IOCLOSE;
- iop->io_flag &= ~(IOREAD|IOWRITE);
- }
- switch (iop->io_flag) {
- case IOREAD:
- u = open(cp, 0);
- break;
-
- case IOHERE:
- case IOHERE|IOXHERE:
- u = herein(iop->io_name, iop->io_flag&IOXHERE);
- cp = "here file";
- break;
-
- case IOWRITE|IOCAT:
- if ((u = open(cp, 1)) >= 0) {
- lseek(u, (long)0, 2);
- break;
- }
- case IOWRITE:
- u = creat(cp, 0666);
- break;
-
- case IODUP:
- u = dup2(*cp-'0', iop->io_unit);
- break;
-
- case IOCLOSE:
- close(iop->io_unit);
- return(0);
- }
- if (u < 0) {
- prs(cp);
- prs(": cannot ");
- warn(msg);
- return(1);
- } else {
- if (u != iop->io_unit) {
- dup2(u, iop->io_unit);
- close(u);
- }
- }
- return(0);
-}
-
-static void
-echo(wp)
-register char **wp;
-{
- register i;
-
- prs("+");
- for (i=0; wp[i]; i++) {
- if (i)
- prs(" ");
- prs(wp[i]);
- }
- prs("\n");
-}
-
-static struct op **
-find1case(t, w)
-struct op *t;
-char *w;
-{
- register struct op *t1;
- struct op **tp;
- register char **wp, *cp;
-
- if (t == NULL)
- return((struct op **)NULL);
- if (t->type == TLIST) {
- if ((tp = find1case(t->left, w)) != NULL)
- return(tp);
- t1 = t->right; /* TPAT */
- } else
- t1 = t;
- for (wp = t1->words; *wp;)
- if ((cp = evalstr(*wp++, DOSUB)) && gmatch(w, cp))
- return(&t1->left);
- return((struct op **)NULL);
-}
-
-static struct op *
-findcase(t, w)
-struct op *t;
-char *w;
-{
- register struct op **tp;
-
- return((tp = find1case(t, w)) != NULL? *tp: (struct op *)NULL);
-}
-
-/*
- * Enter a new loop level (marked for break/continue).
- */
-static void
-brkset(bc)
-struct brkcon *bc;
-{
- bc->nextlev = brklist;
- brklist = bc;
-}
-
-/*
- * Wait for the last process created.
- * Print a message for each process found
- * that was killed by a signal.
- * Ignore interrupt signals while waiting
- * unless `canintr' is true.
- */
-int
-waitfor(lastpid, canintr)
-register int lastpid;
-int canintr;
-{
- register int pid, rv;
- int s;
- int oheedint = heedint;
-
- heedint = 0;
- rv = 0;
- do {
- pid = wait(&s);
- if (pid == -1) {
- if (errno != EINTR || canintr)
- break;
- } else {
- if ((rv = WAITSIG(s)) != 0) {
- if (rv < NSIGNAL) {
- if (signame[rv] != NULL) {
- if (pid != lastpid) {
- prn(pid);
- prs(": ");
- }
- prs(signame[rv]);
- }
- } else {
- if (pid != lastpid) {
- prn(pid);
- prs(": ");
- }
- prs("Signal "); prn(rv); prs(" ");
- }
- if (WAITCORE(s))
- prs(" - core dumped");
- if (rv >= NSIGNAL || signame[rv])
- prs("\n");
- rv = -1;
- } else
- rv = WAITVAL(s);
- }
- } while (pid != lastpid);
- heedint = oheedint;
- if (intr)
- if (talking) {
- if (canintr)
- intr = 0;
- } else {
- if (exstat == 0) exstat = rv;
- onintr(0);
- }
- return(rv);
-}
-
-int
-setstatus(s)
-register int s;
-{
- exstat = s;
- setval(lookup("?"), putn(s));
- return(s);
-}
-
-/*
- * PATH-searching interface to execve.
- * If getenv("PATH") were kept up-to-date,
- * execvp might be used.
- */
-char *
-rexecve(c, v, envp)
-char *c, **v, **envp;
-{
- register int i;
- register char *sp, *tp;
- int eacces = 0, asis = 0;
-
- sp = any('/', c)? "": path->value;
- asis = *sp == '\0';
- while (asis || *sp != '\0') {
- asis = 0;
- tp = e.linep;
- for (; *sp != '\0'; tp++)
- if ((*tp = *sp++) == ':') {
- asis = *sp == '\0';
- break;
- }
- if (tp != e.linep)
- *tp++ = '/';
- for (i = 0; (*tp++ = c[i++]) != '\0';)
- ;
- execve(e.linep, v, envp);
- switch (errno) {
- case ENOEXEC:
- *v = e.linep;
- tp = *--v;
- *v = e.linep;
- execve("/bin/sh", v, envp);
- *v = tp;
- return("no Shell");
-
- case ENOMEM:
- return("program too big");
-
- case E2BIG:
- return("argument list too long");
-
- case EACCES:
- eacces++;
- break;
- }
- }
- return(errno==ENOENT ? "not found" : "cannot execute");
-}
-
-/*
- * Run the command produced by generator `f'
- * applied to stream `arg'.
- */
-int
-run(argp, f)
-struct ioarg *argp;
-int (*f)();
-{
- struct op *otree;
- struct wdblock *swdlist;
- struct wdblock *siolist;
- jmp_buf ev, rt;
- xint *ofail;
- int rv;
-
- areanum++;
- swdlist = wdlist;
- siolist = iolist;
- otree = outtree;
- ofail = failpt;
- rv = -1;
- if (newenv(setjmp(errpt = ev)) == 0) {
- wdlist = 0;
- iolist = 0;
- pushio(argp, f);
- e.iobase = e.iop;
- yynerrs = 0;
- if (setjmp(failpt = rt) == 0 && yyparse() == 0)
- rv = execute(outtree, NOPIPE, NOPIPE, 0);
- quitenv();
- }
- wdlist = swdlist;
- iolist = siolist;
- failpt = ofail;
- outtree = otree;
- freearea(areanum--);
- return(rv);
-}
-
-/* -------- do.c -------- */
-/* #include "sh.h" */
-
-/*
- * built-in commands: doX
- */
-
-int
-dolabel()
-{
- return(0);
-}
-
-int
-dochdir(t)
-register struct op *t;
-{
- register char *cp, *er;
-
- if ((cp = t->words[1]) == NULL && (cp = homedir->value) == NULL)
- er = ": no home directory";
- else if(chdir(cp) < 0)
- er = ": bad directory";
- else
- return(0);
- prs(cp != NULL? cp: "cd");
- err(er);
- return(1);
-}
-
-int
-doshift(t)
-register struct op *t;
-{
- register n;
-
- n = t->words[1]? getn(t->words[1]): 1;
- if(dolc < n) {
- err("nothing to shift");
- return(1);
- }
- dolv[n] = dolv[0];
- dolv += n;
- dolc -= n;
- setval(lookup("#"), putn(dolc));
- return(0);
-}
-
-/*
- * execute login and newgrp directly
- */
-int
-dologin(t)
-struct op *t;
-{
- register char *cp;
-
- if (talking) {
- signal(SIGINT, SIG_DFL);
- signal(SIGQUIT, SIG_DFL);
- }
- cp = rexecve(t->words[0], t->words, makenv());
- prs(t->words[0]); prs(": "); err(cp);
- return(1);
-}
-
-int
-doumask(t)
-register struct op *t;
-{
- register int i, n;
- register char *cp;
-
- if ((cp = t->words[1]) == NULL) {
- i = umask(0);
- umask(i);
- for (n=3*4; (n-=3) >= 0;)
- putc('0'+((i>>n)&07));
- putc('\n');
- } else {
- for (n=0; *cp>='0' && *cp<='9'; cp++)
- n = n*8 + (*cp-'0');
- umask(n);
- }
- return(0);
-}
-
-int
-doexec(t)
-register struct op *t;
-{
- register i;
- jmp_buf ex;
- xint *ofail;
-
- t->ioact = NULL;
- for(i = 0; (t->words[i]=t->words[i+1]) != NULL; i++)
- ;
- if (i == 0)
- return(1);
- execflg = 1;
- ofail = failpt;
- if (setjmp(failpt = ex) == 0)
- execute(t, NOPIPE, NOPIPE, FEXEC);
- failpt = ofail;
- execflg = 0;
- return(1);
-}
-
-int
-dodot(t)
-struct op *t;
-{
- register i;
- register char *sp, *tp;
- char *cp;
-
- if ((cp = t->words[1]) == NULL)
- return(0);
- sp = any('/', cp)? ":": path->value;
- while (*sp) {
- tp = e.linep;
- while (*sp && (*tp = *sp++) != ':')
- tp++;
- if (tp != e.linep)
- *tp++ = '/';
- for (i = 0; (*tp++ = cp[i++]) != '\0';)
- ;
- if ((i = open(e.linep, 0)) >= 0) {
- exstat = 0;
- next(remap(i));
- return(exstat);
- }
- }
- prs(cp);
- err(": not found");
- return(-1);
-}
-
-int
-dowait(t)
-struct op *t;
-{
- register i;
- register char *cp;
-
- if ((cp = t->words[1]) != NULL) {
- i = getn(cp);
- if (i == 0)
- return(0);
- } else
- i = -1;
- setstatus(waitfor(i, 1));
- return(0);
-}
-
-int
-doread(t)
-struct op *t;
-{
- register char *cp, **wp;
- register nb;
- register int nl = 0;
-
- if (t->words[1] == NULL) {
- err("Usage: read name ...");
- return(1);
- }
- for (wp = t->words+1; *wp; wp++) {
- for (cp = e.linep; !nl && cp < elinep-1; cp++)
- if ((nb = read(0, cp, sizeof(*cp))) != sizeof(*cp) ||
- (nl = (*cp == '\n')) ||
- (wp[1] && any(*cp, ifs->value)))
- break;
- *cp = 0;
- if (nb <= 0)
- break;
- setval(lookup(*wp), e.linep);
- }
- return(nb <= 0);
-}
-
-int
-doeval(t)
-register struct op *t;
-{
- return(RUN(awordlist, t->words+1, wdchar));
-}
-
-int
-dotrap(t)
-register struct op *t;
-{
- register int n, i;
- register int resetsig;
-
- if (t->words[1] == NULL) {
- for (i=0; i<=_NSIG; i++)
- if (trap[i]) {
- prn(i);
- prs(": ");
- prs(trap[i]);
- prs("\n");
- }
- return(0);
- }
- resetsig = digit(*t->words[1]);
- for (i = resetsig ? 1 : 2; t->words[i] != NULL; ++i) {
- n = getsig(t->words[i]);
- xfree(trap[n]);
- trap[n] = 0;
- if (!resetsig) {
- if (*t->words[1] != '\0') {
- trap[n] = strsave(t->words[1], 0);
- setsig(n, sig);
- } else
- setsig(n, SIG_IGN);
- } else {
- if (talking)
- if (n == SIGINT)
- setsig(n, onintr);
- else
- setsig(n, n == SIGQUIT ? SIG_IGN
- : SIG_DFL);
- else
- setsig(n, SIG_DFL);
- }
- }
- return(0);
-}
-
-int
-getsig(s)
-char *s;
-{
- register int n;
-
- if ((n = getn(s)) < 0 || n > _NSIG) {
- err("trap: bad signal number");
- n = 0;
- }
- return(n);
-}
-
-void
-setsig(n, f)
-register n;
-_PROTOTYPE(void (*f), (int));
-{
- if (n == 0)
- return;
- if (signal(n, SIG_IGN) != SIG_IGN || ourtrap[n]) {
- ourtrap[n] = 1;
- signal(n, f);
- }
-}
-
-int
-getn(as)
-char *as;
-{
- register char *s;
- register n, m;
-
- s = as;
- m = 1;
- if (*s == '-') {
- m = -1;
- s++;
- }
- for (n = 0; digit(*s); s++)
- n = (n*10) + (*s-'0');
- if (*s) {
- prs(as);
- err(": bad number");
- }
- return(n*m);
-}
-
-int
-dobreak(t)
-struct op *t;
-{
- return(brkcontin(t->words[1], 1));
-}
-
-int
-docontinue(t)
-struct op *t;
-{
- return(brkcontin(t->words[1], 0));
-}
-
-static int
-brkcontin(cp, val)
-register char *cp;
-int val;
-{
- register struct brkcon *bc;
- register nl;
-
- nl = cp == NULL? 1: getn(cp);
- if (nl <= 0)
- nl = 999;
- do {
- if ((bc = brklist) == NULL)
- break;
- brklist = bc->nextlev;
- } while (--nl);
- if (nl) {
- err("bad break/continue level");
- return(1);
- }
- isbreak = val;
- longjmp(bc->brkpt, 1);
- /* NOTREACHED */
-}
-
-int
-doexit(t)
-struct op *t;
-{
- register char *cp;
-
- execflg = 0;
- if ((cp = t->words[1]) != NULL)
- setstatus(getn(cp));
- leave();
- /* NOTREACHED */
-}
-
-int
-doexport(t)
-struct op *t;
-{
- rdexp(t->words+1, export, EXPORT);
- return(0);
-}
-
-int
-doreadonly(t)
-struct op *t;
-{
- rdexp(t->words+1, ronly, RONLY);
- return(0);
-}
-
-static void
-rdexp(wp, f, key)
-register char **wp;
-void (*f)();
-int key;
-{
- if (*wp != NULL) {
- for (; *wp != NULL; wp++)
- if (checkname(*wp))
- (*f)(lookup(*wp));
- else
- badid(*wp);
- } else
- putvlist(key, 1);
-}
-
-static void
-badid(s)
-register char *s;
-{
- prs(s);
- err(": bad identifier");
-}
-
-int
-doset(t)
-register struct op *t;
-{
- register struct var *vp;
- register char *cp;
- register n;
-
- if ((cp = t->words[1]) == NULL) {
- for (vp = vlist; vp; vp = vp->next)
- varput(vp->name, 1);
- return(0);
- }
- if (*cp == '-') {
- /* bad: t->words++; */
- for(n = 0; (t->words[n]=t->words[n+1]) != NULL; n++)
- ;
- if (*++cp == 0)
- flag['x'] = flag['v'] = 0;
- else
- for (; *cp; cp++)
- switch (*cp) {
- case 'e':
- if (!talking)
- flag['e']++;
- break;
-
- default:
- if (*cp>='a' && *cp<='z')
- flag[*cp]++;
- break;
- }
- setdash();
- }
- if (t->words[1]) {
- t->words[0] = dolv[0];
- for (n=1; t->words[n]; n++)
- setarea((char *)t->words[n], 0);
- dolc = n-1;
- dolv = t->words;
- setval(lookup("#"), putn(dolc));
- setarea((char *)(dolv-1), 0);
- }
- return(0);
-}
-
-void
-varput(s, out)
-register char *s;
-int out;
-{
- if (letnum(*s)) {
- write(out, s, strlen(s));
- write(out, "\n", 1);
- }
-}
-
-
-#define SECS 60L
-#define MINS 3600L
-
-int
-dotimes()
-{
- struct tms tbuf;
-
- times(&tbuf);
-
- prn((int)(tbuf.tms_cutime / MINS));
- prs("m");
- prn((int)((tbuf.tms_cutime % MINS) / SECS));
- prs("s ");
- prn((int)(tbuf.tms_cstime / MINS));
- prs("m");
- prn((int)((tbuf.tms_cstime % MINS) / SECS));
- prs("s\n");
- return(0);
-}
-
-struct builtin {
- char *command;
- int (*fn)();
-};
-static struct builtin builtin[] = {
- ":", dolabel,
- "cd", dochdir,
- "shift", doshift,
- "exec", doexec,
- "wait", dowait,
- "read", doread,
- "eval", doeval,
- "trap", dotrap,
- "break", dobreak,
- "continue", docontinue,
- "exit", doexit,
- "export", doexport,
- "readonly", doreadonly,
- "set", doset,
- ".", dodot,
- "umask", doumask,
- "login", dologin,
- "newgrp", dologin,
- "times", dotimes,
- 0,
-};
-
-int (*inbuilt(s))()
-register char *s;
-{
- register struct builtin *bp;
-
- for (bp = builtin; bp->command != NULL; bp++)
- if (strcmp(bp->command, s) == 0)
- return(bp->fn);
- return((int(*)())NULL);
-}
-
diff --git a/release/picobsd/tinyware/msh/sh4.c b/release/picobsd/tinyware/msh/sh4.c
deleted file mode 100644
index ac2a582..0000000
--- a/release/picobsd/tinyware/msh/sh4.c
+++ /dev/null
@@ -1,767 +0,0 @@
-#define Extern extern
-#include <sys/types.h>
-#include <sys/stat.h>
-#include <dirent.h>
-#include <limits.h>
-#include <signal.h>
-#define _NSIG NSIG
-#include <errno.h>
-#include <setjmp.h>
-#include "sh.h"
-
-/* -------- eval.c -------- */
-/* #include "sh.h" */
-/* #include "word.h" */
-
-/*
- * ${}
- * `command`
- * blank interpretation
- * quoting
- * glob
- */
-
-_PROTOTYPE(static int expand, (char *cp, struct wdblock **wbp, int f ));
-_PROTOTYPE(static char *blank, (int f ));
-_PROTOTYPE(static int dollar, (int quoted ));
-_PROTOTYPE(static int grave, (int quoted ));
-_PROTOTYPE(void globname, (char *we, char *pp ));
-_PROTOTYPE(static char *generate, (char *start1, char *end1, char *middle, char *end ));
-_PROTOTYPE(static int anyspcl, (struct wdblock *wb ));
-_PROTOTYPE(static int xstrcmp, (char *p1, char *p2 ));
-_PROTOTYPE(void glob0, (char *a0, unsigned int a1, int a2, int (*a3)(char *, char *)));
-_PROTOTYPE(void glob1, (char *base, char *lim ));
-_PROTOTYPE(void glob2, (char *i, char *j ));
-_PROTOTYPE(void glob3, (char *i, char *j, char *k ));
-_PROTOTYPE(char *memcopy, (char *ato, char *from, int nb ));
-
-char **
-eval(ap, f)
-register char **ap;
-int f;
-{
- struct wdblock *wb;
- char **wp;
- char **wf;
- jmp_buf ev;
-
- wp = NULL;
- wb = NULL;
- wf = NULL;
- if (newenv(setjmp(errpt = ev)) == 0) {
- while (*ap && isassign(*ap))
- expand(*ap++, &wb, f & ~DOGLOB);
- if (flag['k']) {
- for (wf = ap; *wf; wf++) {
- if (isassign(*wf))
- expand(*wf, &wb, f & ~DOGLOB);
- }
- }
- for (wb = addword((char *)0, wb); *ap; ap++) {
- if (!flag['k'] || !isassign(*ap))
- expand(*ap, &wb, f & ~DOKEY);
- }
- wb = addword((char *)0, wb);
- wp = getwords(wb);
- quitenv();
- } else
- gflg = 1;
- return(gflg? (char **)NULL: wp);
-}
-
-/*
- * Make the exported environment from the exported
- * names in the dictionary. Keyword assignments
- * will already have been done.
- */
-char **
-makenv()
-
-{
- register struct wdblock *wb;
- register struct var *vp;
-
- wb = NULL;
- for (vp = vlist; vp; vp = vp->next)
- if (vp->status & EXPORT)
- wb = addword(vp->name, wb);
- wb = addword((char *)0, wb);
- return(getwords(wb));
-}
-
-char *
-evalstr(cp, f)
-register char *cp;
-int f;
-{
- struct wdblock *wb;
-
- wb = NULL;
- if (expand(cp, &wb, f)) {
- if (wb == NULL || wb->w_nword == 0 || (cp = wb->w_words[0]) == NULL)
- cp = "";
- DELETE(wb);
- } else
- cp = NULL;
- return(cp);
-}
-
-static int
-expand(cp, wbp, f)
-register char *cp;
-register struct wdblock **wbp;
-int f;
-{
- jmp_buf ev;
-
- gflg = 0;
- if (cp == NULL)
- return(0);
- if (!anys("$`'\"", cp) &&
- !anys(ifs->value, cp) &&
- ((f&DOGLOB)==0 || !anys("[*?", cp))) {
- cp = strsave(cp, areanum);
- if (f & DOTRIM)
- unquote(cp);
- *wbp = addword(cp, *wbp);
- return(1);
- }
- if (newenv(setjmp(errpt = ev)) == 0) {
- PUSHIO(aword, cp, strchar);
- e.iobase = e.iop;
- while ((cp = blank(f)) && gflg == 0) {
- e.linep = cp;
- cp = strsave(cp, areanum);
- if ((f&DOGLOB) == 0) {
- if (f & DOTRIM)
- unquote(cp);
- *wbp = addword(cp, *wbp);
- } else
- *wbp = glob(cp, *wbp);
- }
- quitenv();
- } else
- gflg = 1;
- return(gflg == 0);
-}
-
-/*
- * Blank interpretation and quoting
- */
-static char *
-blank(f)
-int f;
-{
- register c, c1;
- register char *sp;
- int scanequals, foundequals;
-
- sp = e.linep;
- scanequals = f & DOKEY;
- foundequals = 0;
-
-loop:
- switch (c = subgetc('"', foundequals)) {
- case 0:
- if (sp == e.linep)
- return(0);
- *e.linep++ = 0;
- return(sp);
-
- default:
- if (f & DOBLANK && any(c, ifs->value))
- goto loop;
- break;
-
- case '"':
- case '\'':
- scanequals = 0;
- if (INSUB())
- break;
- for (c1 = c; (c = subgetc(c1, 1)) != c1;) {
- if (c == 0)
- break;
- if (c == '\'' || !any(c, "$`\""))
- c |= QUOTE;
- *e.linep++ = c;
- }
- c = 0;
- }
- unget(c);
- if (!letter(c))
- scanequals = 0;
- for (;;) {
- c = subgetc('"', foundequals);
- if (c == 0 ||
- f & (DOBLANK && any(c, ifs->value)) ||
- (!INSUB() && any(c, "\"'"))) {
- scanequals = 0;
- unget(c);
- if (any(c, "\"'"))
- goto loop;
- break;
- }
- if (scanequals)
- if (c == '=') {
- foundequals = 1;
- scanequals = 0;
- }
- else if (!letnum(c))
- scanequals = 0;
- *e.linep++ = c;
- }
- *e.linep++ = 0;
- return(sp);
-}
-
-/*
- * Get characters, substituting for ` and $
- */
-int
-subgetc(ec, quoted)
-register char ec;
-int quoted;
-{
- register char c;
-
-again:
- c = getc(ec);
- if (!INSUB() && ec != '\'') {
- if (c == '`') {
- if (grave(quoted) == 0)
- return(0);
- e.iop->task = XGRAVE;
- goto again;
- }
- if (c == '$' && (c = dollar(quoted)) == 0) {
- e.iop->task = XDOLL;
- goto again;
- }
- }
- return(c);
-}
-
-/*
- * Prepare to generate the string returned by ${} substitution.
- */
-static int
-dollar(quoted)
-int quoted;
-{
- int otask;
- struct io *oiop;
- char *dolp;
- register char *s, c, *cp;
- struct var *vp;
-
- c = readc();
- s = e.linep;
- if (c != '{') {
- *e.linep++ = c;
- if (letter(c)) {
- while ((c = readc())!=0 && letnum(c))
- if (e.linep < elinep)
- *e.linep++ = c;
- unget(c);
- }
- c = 0;
- } else {
- oiop = e.iop;
- otask = e.iop->task;
- e.iop->task = XOTHER;
- while ((c = subgetc('"', 0))!=0 && c!='}' && c!='\n')
- if (e.linep < elinep)
- *e.linep++ = c;
- if (oiop == e.iop)
- e.iop->task = otask;
- if (c != '}') {
- err("unclosed ${");
- gflg++;
- return(c);
- }
- }
- if (e.linep >= elinep) {
- err("string in ${} too long");
- gflg++;
- e.linep -= 10;
- }
- *e.linep = 0;
- if (*s)
- for (cp = s+1; *cp; cp++)
- if (any(*cp, "=-+?")) {
- c = *cp;
- *cp++ = 0;
- break;
- }
- if (s[1] == 0 && (*s == '*' || *s == '@')) {
- if (dolc > 1) {
- /* currently this does not distinguish $* and $@ */
- /* should check dollar */
- e.linep = s;
- PUSHIO(awordlist, dolv+1, dolchar);
- return(0);
- } else { /* trap the nasty ${=} */
- s[0] = '1';
- s[1] = 0;
- }
- }
- vp = lookup(s);
- if ((dolp = vp->value) == null) {
- switch (c) {
- case '=':
- if (digit(*s)) {
- err("cannot use ${...=...} with $n");
- gflg++;
- break;
- }
- setval(vp, cp);
- dolp = vp->value;
- break;
-
- case '-':
- dolp = strsave(cp, areanum);
- break;
-
- case '?':
- if (*cp == 0) {
- prs("missing value for ");
- err(s);
- } else
- err(cp);
- gflg++;
- break;
- }
- } else if (c == '+')
- dolp = strsave(cp, areanum);
- if (flag['u'] && dolp == null) {
- prs("unset variable: ");
- err(s);
- gflg++;
- }
- e.linep = s;
- PUSHIO(aword, dolp, quoted ? qstrchar : strchar);
- return(0);
-}
-
-/*
- * Run the command in `...` and read its output.
- */
-static int
-grave(quoted)
-int quoted;
-{
- register char *cp;
- register int i;
- int pf[2];
-
- for (cp = e.iop->argp->aword; *cp != '`'; cp++)
- if (*cp == 0) {
- err("no closing `");
- return(0);
- }
- if (openpipe(pf) < 0)
- return(0);
- if ((i = fork()) == -1) {
- closepipe(pf);
- err("try again");
- return(0);
- }
- if (i != 0) {
- e.iop->argp->aword = ++cp;
- close(pf[1]);
- PUSHIO(afile, remap(pf[0]), quoted? qgravechar: gravechar);
- return(1);
- }
- *cp = 0;
- /* allow trapped signals */
- for (i=0; i<=_NSIG; i++)
- if (ourtrap[i] && signal(i, SIG_IGN) != SIG_IGN)
- signal(i, SIG_DFL);
- dup2(pf[1], 1);
- closepipe(pf);
- flag['e'] = 0;
- flag['v'] = 0;
- flag['n'] = 0;
- cp = strsave(e.iop->argp->aword, 0);
- areanum = 1;
- freehere(areanum);
- freearea(areanum); /* free old space */
- e.oenv = NULL;
- e.iop = (e.iobase = iostack) - 1;
- unquote(cp);
- talking = 0;
- PUSHIO(aword, cp, nlchar);
- onecommand();
- exit(1);
-}
-
-char *
-unquote(as)
-register char *as;
-{
- register char *s;
-
- if ((s = as) != NULL)
- while (*s)
- *s++ &= ~QUOTE;
- return(as);
-}
-
-/* -------- glob.c -------- */
-/* #include "sh.h" */
-
-/*
- * glob
- */
-
-#define scopy(x) strsave((x), areanum)
-#define BLKSIZ 512
-#define NDENT ((BLKSIZ+sizeof(struct dirent)-1)/sizeof(struct dirent))
-
-static struct wdblock *cl, *nl;
-static char spcl[] = "[?*";
-
-struct wdblock *
-glob(cp, wb)
-char *cp;
-struct wdblock *wb;
-{
- register i;
- register char *pp;
-
- if (cp == 0)
- return(wb);
- i = 0;
- for (pp = cp; *pp; pp++)
- if (any(*pp, spcl))
- i++;
- else if (!any(*pp & ~QUOTE, spcl))
- *pp &= ~QUOTE;
- if (i != 0) {
- for (cl = addword(scopy(cp), (struct wdblock *)0); anyspcl(cl); cl = nl) {
- nl = newword(cl->w_nword*2);
- for(i=0; i<cl->w_nword; i++) { /* for each argument */
- for (pp = cl->w_words[i]; *pp; pp++)
- if (any(*pp, spcl)) {
- globname(cl->w_words[i], pp);
- break;
- }
- if (*pp == '\0')
- nl = addword(scopy(cl->w_words[i]), nl);
- }
- for(i=0; i<cl->w_nword; i++)
- DELETE(cl->w_words[i]);
- DELETE(cl);
- }
- for(i=0; i<cl->w_nword; i++)
- unquote(cl->w_words[i]);
- glob0((char *)cl->w_words, cl->w_nword, sizeof(char *), xstrcmp);
- if (cl->w_nword) {
- for (i=0; i<cl->w_nword; i++)
- wb = addword(cl->w_words[i], wb);
- DELETE(cl);
- return(wb);
- }
- }
- wb = addword(unquote(cp), wb);
- return(wb);
-}
-
-void
-globname(we, pp)
-char *we;
-register char *pp;
-{
- register char *np, *cp;
- char *name, *gp, *dp;
- int dn, j, n, k;
- DIR *dirp;
- struct dirent *de;
- char dname[NAME_MAX+1];
- struct stat dbuf;
-
- for (np = we; np != pp; pp--)
- if (pp[-1] == '/')
- break;
- for (dp = cp = space((int)(pp-np)+3); np < pp;)
- *cp++ = *np++;
- *cp++ = '.';
- *cp = '\0';
- for (gp = cp = space(strlen(pp)+1); *np && *np != '/';)
- *cp++ = *np++;
- *cp = '\0';
- dirp = opendir(dp);
- if (dirp == 0) {
- DELETE(dp);
- DELETE(gp);
- return;
- }
- dname[NAME_MAX] = '\0';
- while ((de=readdir(dirp))!=NULL) {
- /* XXX Hmmm... What this could be? (abial) */
- /*
- if (ent[j].d_ino == 0)
- continue;
- */
- strncpy(dname, de->d_name, NAME_MAX);
- if (dname[0] == '.')
- if (*gp != '.')
- continue;
- for(k=0; k<NAME_MAX; k++)
- if (any(dname[k], spcl))
- dname[k] |= QUOTE;
- if (gmatch(dname, gp)) {
- name = generate(we, pp, dname, np);
- if (*np && !anys(np, spcl)) {
- if (stat(name,&dbuf)) {
- DELETE(name);
- continue;
- }
- }
- nl = addword(name, nl);
- }
- }
- closedir(dirp);
- DELETE(dp);
- DELETE(gp);
-}
-
-/*
- * generate a pathname as below.
- * start..end1 / middle end
- * the slashes come for free
- */
-static char *
-generate(start1, end1, middle, end)
-char *start1;
-register char *end1;
-char *middle, *end;
-{
- char *p;
- register char *op, *xp;
-
- p = op = space((int)(end1-start1)+strlen(middle)+strlen(end)+2);
- for (xp = start1; xp != end1;)
- *op++ = *xp++;
- for (xp = middle; (*op++ = *xp++) != '\0';)
- ;
- op--;
- for (xp = end; (*op++ = *xp++) != '\0';)
- ;
- return(p);
-}
-
-static int
-anyspcl(wb)
-register struct wdblock *wb;
-{
- register i;
- register char **wd;
-
- wd = wb->w_words;
- for (i=0; i<wb->w_nword; i++)
- if (anys(spcl, *wd++))
- return(1);
- return(0);
-}
-
-static int
-xstrcmp(p1, p2)
-char *p1, *p2;
-{
- return(strcmp(*(char **)p1, *(char **)p2));
-}
-
-/* -------- word.c -------- */
-/* #include "sh.h" */
-/* #include "word.h" */
-
-#define NSTART 16 /* default number of words to allow for initially */
-
-struct wdblock *
-newword(nw)
-register int nw;
-{
- register struct wdblock *wb;
-
- wb = (struct wdblock *) space(sizeof(*wb) + nw*sizeof(char *));
- wb->w_bsize = nw;
- wb->w_nword = 0;
- return(wb);
-}
-
-struct wdblock *
-addword(wd, wb)
-char *wd;
-register struct wdblock *wb;
-{
- register struct wdblock *wb2;
- register nw;
-
- if (wb == NULL)
- wb = newword(NSTART);
- if ((nw = wb->w_nword) >= wb->w_bsize) {
- wb2 = newword(nw * 2);
- memcopy((char *)wb2->w_words, (char *)wb->w_words, nw*sizeof(char *));
- wb2->w_nword = nw;
- DELETE(wb);
- wb = wb2;
- }
- wb->w_words[wb->w_nword++] = wd;
- return(wb);
-}
-
-char **
-getwords(wb)
-register struct wdblock *wb;
-{
- register char **wd;
- register nb;
-
- if (wb == NULL)
- return((char **)NULL);
- if (wb->w_nword == 0) {
- DELETE(wb);
- return((char **)NULL);
- }
- wd = (char **) space(nb = sizeof(*wd) * wb->w_nword);
- memcopy((char *)wd, (char *)wb->w_words, nb);
- DELETE(wb); /* perhaps should done by caller */
- return(wd);
-}
-
-_PROTOTYPE(int (*func), (char *, char *));
-int globv;
-
-void
-glob0(a0, a1, a2, a3)
-char *a0;
-unsigned a1;
-int a2;
-_PROTOTYPE(int (*a3), (char *, char *));
-{
- func = a3;
- globv = a2;
- glob1(a0, a0 + a1 * a2);
-}
-
-void
-glob1(base, lim)
-char *base, *lim;
-{
- register char *i, *j;
- int v2;
- char *lptr, *hptr;
- int c;
- unsigned n;
-
-
- v2 = globv;
-
-top:
- if ((n=(int)(lim-base)) <= v2)
- return;
- n = v2 * (n / (2*v2));
- hptr = lptr = base+n;
- i = base;
- j = lim-v2;
- for(;;) {
- if (i < lptr) {
- if ((c = (*func)(i, lptr)) == 0) {
- glob2(i, lptr -= v2);
- continue;
- }
- if (c < 0) {
- i += v2;
- continue;
- }
- }
-
-begin:
- if (j > hptr) {
- if ((c = (*func)(hptr, j)) == 0) {
- glob2(hptr += v2, j);
- goto begin;
- }
- if (c > 0) {
- if (i == lptr) {
- glob3(i, hptr += v2, j);
- i = lptr += v2;
- goto begin;
- }
- glob2(i, j);
- j -= v2;
- i += v2;
- continue;
- }
- j -= v2;
- goto begin;
- }
-
-
- if (i == lptr) {
- if (lptr-base >= lim-hptr) {
- glob1(hptr+v2, lim);
- lim = lptr;
- } else {
- glob1(base, lptr);
- base = hptr+v2;
- }
- goto top;
- }
-
-
- glob3(j, lptr -= v2, i);
- j = hptr -= v2;
- }
-}
-
-void
-glob2(i, j)
-char *i, *j;
-{
- register char *index1, *index2, c;
- int m;
-
- m = globv;
- index1 = i;
- index2 = j;
- do {
- c = *index1;
- *index1++ = *index2;
- *index2++ = c;
- } while(--m);
-}
-
-void
-glob3(i, j, k)
-char *i, *j, *k;
-{
- register char *index1, *index2, *index3;
- int c;
- int m;
-
- m = globv;
- index1 = i;
- index2 = j;
- index3 = k;
- do {
- c = *index1;
- *index1++ = *index3;
- *index3++ = *index2;
- *index2++ = c;
- } while(--m);
-}
-
-char *
-memcopy(ato, from, nb)
-register char *ato, *from;
-register int nb;
-{
- register char *to;
-
- to = ato;
- while (--nb >= 0)
- *to++ = *from++;
- return(ato);
-}
diff --git a/release/picobsd/tinyware/msh/sh5.c b/release/picobsd/tinyware/msh/sh5.c
deleted file mode 100644
index 74feac9..0000000
--- a/release/picobsd/tinyware/msh/sh5.c
+++ /dev/null
@@ -1,675 +0,0 @@
-#define Extern extern
-#include <sys/types.h>
-#include <signal.h>
-#define _NSIG NSIG
-#include <errno.h>
-#include <setjmp.h>
-#include "sh.h"
-
-/* -------- io.c -------- */
-/* #include "sh.h" */
-
-/*
- * shell IO
- */
-
-static struct iobuf sharedbuf = {AFID_NOBUF};
-static struct iobuf mainbuf = {AFID_NOBUF};
-static unsigned bufid = AFID_ID; /* buffer id counter */
-
-struct ioarg temparg = {0, 0, 0, AFID_NOBUF, 0};
-
-_PROTOTYPE(static void readhere, (char **name, char *s, int ec ));
-_PROTOTYPE(void pushio, (struct ioarg *argp, int (*fn)()));
-_PROTOTYPE(static int xxchar, (struct ioarg *ap ));
-_PROTOTYPE(void tempname, (char *tname ));
-
-int
-getc(ec)
-register int ec;
-{
- register int c;
-
- if(e.linep > elinep) {
- while((c=readc()) != '\n' && c)
- ;
- err("input line too long");
- gflg++;
- return(c);
- }
- c = readc();
- if (ec != '\'' && e.iop->task != XGRAVE) {
- if(c == '\\') {
- c = readc();
- if (c == '\n' && ec != '\"')
- return(getc(ec));
- c |= QUOTE;
- }
- }
- return(c);
-}
-
-void
-unget(c)
-int c;
-{
- if (e.iop >= e.iobase)
- e.iop->peekc = c;
-}
-
-int
-eofc()
-
-{
- return e.iop < e.iobase || (e.iop->peekc == 0 && e.iop->prev == 0);
-}
-
-int
-readc()
-{
- register c;
-
- for (; e.iop >= e.iobase; e.iop--)
- if ((c = e.iop->peekc) != '\0') {
- e.iop->peekc = 0;
- return(c);
- }
- else {
- if (e.iop->prev != 0) {
- if ((c = (*e.iop->iofn)(e.iop->argp, e.iop)) != '\0') {
- if (c == -1) {
- e.iop++;
- continue;
- }
- if (e.iop == iostack)
- ioecho(c);
- return(e.iop->prev = c);
- }
- else if (e.iop->task == XIO && e.iop->prev != '\n') {
- e.iop->prev = 0;
- if (e.iop == iostack)
- ioecho('\n');
- return '\n';
- }
- }
- if (e.iop->task == XIO) {
- if (multiline)
- return e.iop->prev = 0;
- if (talking && e.iop == iostack+1)
- prs(prompt->value);
- }
- }
- if (e.iop >= iostack)
- return(0);
- leave();
- /* NOTREACHED */
-}
-
-void
-ioecho(c)
-char c;
-{
- if (flag['v'])
- write(2, &c, sizeof c);
-}
-
-void
-pushio(argp, fn)
-struct ioarg *argp;
-int (*fn)();
-{
- if (++e.iop >= &iostack[NPUSH]) {
- e.iop--;
- err("Shell input nested too deeply");
- gflg++;
- return;
- }
- e.iop->iofn = fn;
-
- if (argp->afid != AFID_NOBUF)
- e.iop->argp = argp;
- else {
- e.iop->argp = ioargstack + (e.iop - iostack);
- *e.iop->argp = *argp;
- e.iop->argp->afbuf = e.iop == &iostack[0] ? &mainbuf : &sharedbuf;
- if (isatty(e.iop->argp->afile) == 0 &&
- (e.iop == &iostack[0] ||
- lseek(e.iop->argp->afile, 0L, 1) != -1)) {
- if (++bufid == AFID_NOBUF)
- bufid = AFID_ID;
- e.iop->argp->afid = bufid;
- }
- }
-
- e.iop->prev = ~'\n';
- e.iop->peekc = 0;
- e.iop->xchar = 0;
- e.iop->nlcount = 0;
- if (fn == filechar || fn == linechar)
- e.iop->task = XIO;
- else if (fn == gravechar || fn == qgravechar)
- e.iop->task = XGRAVE;
- else
- e.iop->task = XOTHER;
-}
-
-struct io *
-setbase(ip)
-struct io *ip;
-{
- register struct io *xp;
-
- xp = e.iobase;
- e.iobase = ip;
- return(xp);
-}
-
-/*
- * Input generating functions
- */
-
-/*
- * Produce the characters of a string, then a newline, then EOF.
- */
-int
-nlchar(ap)
-register struct ioarg *ap;
-{
- register int c;
-
- if (ap->aword == NULL)
- return(0);
- if ((c = *ap->aword++) == 0) {
- ap->aword = NULL;
- return('\n');
- }
- return(c);
-}
-
-/*
- * Given a list of words, produce the characters
- * in them, with a space after each word.
- */
-int
-wdchar(ap)
-register struct ioarg *ap;
-{
- register char c;
- register char **wl;
-
- if ((wl = ap->awordlist) == NULL)
- return(0);
- if (*wl != NULL) {
- if ((c = *(*wl)++) != 0)
- return(c & 0177);
- ap->awordlist++;
- return(' ');
- }
- ap->awordlist = NULL;
- return('\n');
-}
-
-/*
- * Return the characters of a list of words,
- * producing a space between them.
- */
-int
-dolchar(ap)
-register struct ioarg *ap;
-{
- register char *wp;
-
- if ((wp = *ap->awordlist++) != NULL) {
- PUSHIO(aword, wp, *ap->awordlist == NULL? strchar: xxchar);
- return(-1);
- }
- return(0);
-}
-
-static int
-xxchar(ap)
-register struct ioarg *ap;
-{
- register int c;
-
- if (ap->aword == NULL)
- return(0);
- if ((c = *ap->aword++) == '\0') {
- ap->aword = NULL;
- return(' ');
- }
- return(c);
-}
-
-/*
- * Produce the characters from a single word (string).
- */
-int
-strchar(ap)
-register struct ioarg *ap;
-{
- register int c;
-
- if (ap->aword == NULL || (c = *ap->aword++) == 0)
- return(0);
- return(c);
-}
-
-/*
- * Produce quoted characters from a single word (string).
- */
-int
-qstrchar(ap)
-register struct ioarg *ap;
-{
- register int c;
-
- if (ap->aword == NULL || (c = *ap->aword++) == 0)
- return(0);
- return(c|QUOTE);
-}
-
-/*
- * Return the characters from a file.
- */
-int
-filechar(ap)
-register struct ioarg *ap;
-{
- register int i;
- char c;
- struct iobuf *bp = ap->afbuf;
-
- if (ap->afid != AFID_NOBUF) {
- if ((i = ap->afid != bp->id) || bp->bufp == bp->ebufp) {
- if (i)
- lseek(ap->afile, ap->afpos, 0);
- do {
- i = read(ap->afile, bp->buf, sizeof(bp->buf));
- } while (i < 0 && errno == EINTR);
- if (i <= 0) {
- closef(ap->afile);
- return 0;
- }
- bp->id = ap->afid;
- bp->ebufp = (bp->bufp = bp->buf) + i;
- }
- ap->afpos++;
- return *bp->bufp++ & 0177;
- }
-
- do {
- i = read(ap->afile, &c, sizeof(c));
- } while (i < 0 && errno == EINTR);
- return(i == sizeof(c)? c&0177: (closef(ap->afile), 0));
-}
-
-/*
- * Return the characters from a here temp file.
- */
-int
-herechar(ap)
-register struct ioarg *ap;
-{
- char c;
-
-
- if (read(ap->afile, &c, sizeof(c)) != sizeof(c)) {
- close(ap->afile);
- c = 0;
- }
- return (c);
-
-}
-
-/*
- * Return the characters produced by a process (`...`).
- * Quote them if required, and remove any trailing newline characters.
- */
-int
-gravechar(ap, iop)
-struct ioarg *ap;
-struct io *iop;
-{
- register int c;
-
- if ((c = qgravechar(ap, iop)&~QUOTE) == '\n')
- c = ' ';
- return(c);
-}
-
-int
-qgravechar(ap, iop)
-register struct ioarg *ap;
-struct io *iop;
-{
- register int c;
-
- if (iop->xchar) {
- if (iop->nlcount) {
- iop->nlcount--;
- return('\n'|QUOTE);
- }
- c = iop->xchar;
- iop->xchar = 0;
- } else if ((c = filechar(ap)) == '\n') {
- iop->nlcount = 1;
- while ((c = filechar(ap)) == '\n')
- iop->nlcount++;
- iop->xchar = c;
- if (c == 0)
- return(c);
- iop->nlcount--;
- c = '\n';
- }
- return(c!=0? c|QUOTE: 0);
-}
-
-/*
- * Return a single command (usually the first line) from a file.
- */
-int
-linechar(ap)
-register struct ioarg *ap;
-{
- register int c;
-
- if ((c = filechar(ap)) == '\n') {
- if (!multiline) {
- closef(ap->afile);
- ap->afile = -1; /* illegal value */
- }
- }
- return(c);
-}
-
-void
-prs(s)
-register char *s;
-{
- if (*s)
- write(2, s, strlen(s));
-}
-
-void
-putc(c)
-char c;
-{
- write(2, &c, sizeof c);
-}
-
-void
-prn(u)
-unsigned u;
-{
- prs(itoa(u, 0));
-}
-
-void
-closef(i)
-register int i;
-{
- if (i > 2)
- close(i);
-}
-
-void
-closeall()
-{
- register u;
-
- for (u=NUFILE; u<NOFILE;)
- close(u++);
-}
-
-/*
- * remap fd into Shell's fd space
- */
-int
-remap(fd)
-register int fd;
-{
- register int i;
- int map[NOFILE];
-
- if (fd < e.iofd) {
- for (i=0; i<NOFILE; i++)
- map[i] = 0;
- do {
- map[fd] = 1;
- fd = dup(fd);
- } while (fd >= 0 && fd < e.iofd);
- for (i=0; i<NOFILE; i++)
- if (map[i])
- close(i);
- if (fd < 0)
- err("too many files open in shell");
- }
- return(fd);
-}
-
-int
-openpipe(pv)
-register int *pv;
-{
- register int i;
-
- if ((i = pipe(pv)) < 0)
- err("can't create pipe - try again");
- return(i);
-}
-
-void
-closepipe(pv)
-register int *pv;
-{
- if (pv != NULL) {
- close(*pv++);
- close(*pv);
- }
-}
-
-/* -------- here.c -------- */
-/* #include "sh.h" */
-
-/*
- * here documents
- */
-
-struct here {
- char *h_tag;
- int h_dosub;
- struct ioword *h_iop;
- struct here *h_next;
-};
-
-static struct here *inhere; /* list of hear docs while parsing */
-static struct here *acthere; /* list of active here documents */
-
-void
-markhere(s, iop)
-register char *s;
-struct ioword *iop;
-{
- register struct here *h, *lh;
-
- h = (struct here *) space(sizeof(struct here));
- if (h == 0)
- return;
- h->h_tag = evalstr(s, DOSUB);
- if (h->h_tag == 0)
- return;
- h->h_iop = iop;
- iop->io_name = 0;
- h->h_next = NULL;
- if (inhere == 0)
- inhere = h;
- else
- for (lh = inhere; lh!=NULL; lh = lh->h_next)
- if (lh->h_next == 0) {
- lh->h_next = h;
- break;
- }
- iop->io_flag |= IOHERE|IOXHERE;
- for (s = h->h_tag; *s; s++)
- if (*s & QUOTE) {
- iop->io_flag &= ~ IOXHERE;
- *s &= ~ QUOTE;
- }
- h->h_dosub = iop->io_flag & IOXHERE;
-}
-
-void
-gethere()
-{
- register struct here *h, *hp;
-
- /* Scan here files first leaving inhere list in place */
- for (hp = h = inhere; h != NULL; hp = h, h = h->h_next)
- readhere(&h->h_iop->io_name, h->h_tag, h->h_dosub? 0: '\'');
-
- /* Make inhere list active - keep list intact for scraphere */
- if (hp != NULL) {
- hp->h_next = acthere;
- acthere = inhere;
- inhere = NULL;
- }
-}
-
-static void
-readhere(name, s, ec)
-char **name;
-register char *s;
-int ec;
-{
- int tf;
- char tname[30];
- register c;
- jmp_buf ev;
- char line [LINELIM+1];
- char *next;
-
- tempname(tname);
- *name = strsave(tname, areanum);
- tf = creat(tname, 0600);
- if (tf < 0)
- return;
- if (newenv(setjmp(errpt = ev)) != 0)
- unlink(tname);
- else {
- pushio(e.iop->argp, e.iop->iofn);
- e.iobase = e.iop;
- for (;;) {
- if (talking && e.iop <= iostack)
- prs(cprompt->value);
- next = line;
- while ((c = getc(ec)) != '\n' && c) {
- if (ec == '\'')
- c &= ~ QUOTE;
- if (next >= &line[LINELIM]) {
- c = 0;
- break;
- }
- *next++ = c;
- }
- *next = 0;
- if (strcmp(s, line) == 0 || c == 0)
- break;
- *next++ = '\n';
- write (tf, line, (int)(next-line));
- }
- if (c == 0) {
- prs("here document `"); prs(s); err("' unclosed");
- }
- quitenv();
- }
- close(tf);
-}
-
-/*
- * open here temp file.
- * if unquoted here, expand here temp file into second temp file.
- */
-int
-herein(hname, xdoll)
-char *hname;
-int xdoll;
-{
- register hf, tf;
-
- if (hname == 0)
- return(-1);
- hf = open(hname, 0);
- if (hf < 0)
- return (-1);
- if (xdoll) {
- char c;
- char tname[30];
- jmp_buf ev;
-
- tempname(tname);
- if ((tf = creat(tname, 0600)) < 0)
- return (-1);
- if (newenv(setjmp(errpt = ev)) == 0) {
- PUSHIO(afile, hf, herechar);
- setbase(e.iop);
- while ((c = subgetc(0, 0)) != 0) {
- c &= ~ QUOTE;
- write(tf, &c, sizeof c);
- }
- quitenv();
- } else
- unlink(tname);
- close(tf);
- tf = open(tname, 0);
- unlink(tname);
- return (tf);
- } else
- return (hf);
-}
-
-void
-scraphere()
-{
- register struct here *h;
-
- for (h = inhere; h != NULL; h = h->h_next) {
- if (h->h_iop && h->h_iop->io_name)
- unlink(h->h_iop->io_name);
- }
- inhere = NULL;
-}
-
-/* unlink here temp files before a freearea(area) */
-void
-freehere(area)
-int area;
-{
- register struct here *h, *hl;
-
- hl = NULL;
- for (h = acthere; h != NULL; h = h->h_next)
- if (getarea((char *) h) >= area) {
- if (h->h_iop->io_name != NULL)
- unlink(h->h_iop->io_name);
- if (hl == NULL)
- acthere = h->h_next;
- else
- hl->h_next = h->h_next;
- } else
- hl = h;
-}
-
-void
-tempname(tname)
-char *tname;
-{
- static int inc;
- register char *cp, *lp;
-
- for (cp = tname, lp = "/tmp/shtm"; (*cp = *lp++) != '\0'; cp++)
- ;
- lp = putn(getpid()*1000 + inc++);
- for (; (*cp = *lp++) != '\0'; cp++)
- ;
-}
diff --git a/release/picobsd/tinyware/msh/sh6.c b/release/picobsd/tinyware/msh/sh6.c
deleted file mode 100644
index bd3ba05..0000000
--- a/release/picobsd/tinyware/msh/sh6.c
+++ /dev/null
@@ -1,9 +0,0 @@
-#define Extern
-
-#include <sys/types.h>
-#include <signal.h>
-#define _NSIG NSIG
-#include <errno.h>
-#include <setjmp.h>
-#include "sh.h"
-
OpenPOWER on IntegriCloud