head 1.18; access; symbols RELENG_4_0_0_RELEASE:1.14 RELENG_4:1.14.0.2 RELENG_4_BP:1.14 RELENG_3_4_0_RELEASE:1.10.2.3 RELENG_3_3_0_RELEASE:1.10.2.3 RELENG_3_2_PAO:1.10.0.4 RELENG_3_2_PAO_BP:1.10 RELENG_3_2_0_RELEASE:1.10 RELENG_3_1_0_RELEASE:1.10 RELENG_3:1.10.0.2 RELENG_3_BP:1.10 RELENG_2_2_8_RELEASE:1.6.2.3 RELENG_3_0_0_RELEASE:1.10 RELENG_2_2_7_RELEASE:1.6.2.3 RELENG_2_2_6_RELEASE:1.6.2.2 RELENG_2_2_5_RELEASE:1.6.2.2 bsd_44_lite_2:1.1.1.1 RELENG_2_2_2_RELEASE:1.6.2.1 RELENG_2_2_1_RELEASE:1.6 RELENG_2_2_0_RELEASE:1.6 RELENG_2_1_7_RELEASE:1.1.1.1 RELENG_2_1_6_1_RELEASE:1.1.1.1 RELENG_2_1_6_RELEASE:1.1.1.1 RELENG_2_2:1.6.0.2 RELENG_2_2_BP:1.6 RELENG_2_1_5_RELEASE:1.1.1.1 RELENG_2_1_0_RELEASE:1.1.1.1 RELENG_2_1_0:1.1.1.1.0.6 RELENG_2_1_0_BP:1.1.1.1 RELENG_2_0_5_RELEASE:1.1.1.1 RELENG_2_0_5:1.1.1.1.0.4 RELENG_2_0_5_BP:1.1.1.1 RELENG_2_0_5_ALPHA:1.1.1.1 RELEASE_2_0:1.1.1.1 BETA_2_0:1.1.1.1 ALPHA_2_0:1.1.1.1.0.2 bsd_44_lite:1.1.1.1 CSRG:1.1.1; locks; comment @ * @; 1.18 date 2000.05.22.23.41.06; author tim; state Exp; branches; next 1.17; 1.17 date 2000.05.15.16.39.58; author hoek; state Exp; branches; next 1.16; 1.16 date 2000.05.14.03.30.58; author hoek; state Exp; branches; next 1.15; 1.15 date 2000.05.09.03.53.13; author hoek; state Exp; branches; next 1.14; 1.14 date 99.09.03.22.31.16; author hoek; state Exp; branches 1.14.2.1; next 1.13; 1.13 date 99.08.28.01.04.17; author peter; state Exp; branches; next 1.12; 1.12 date 99.06.01.20.02.33; author hoek; state Exp; branches; next 1.11; 1.11 date 99.05.30.18.06.56; author hoek; state Exp; branches; next 1.10; 1.10 date 98.06.14.16.03.39; author steve; state Exp; branches 1.10.2.1; next 1.9; 1.9 date 98.02.20.04.13.28; author jb; state Exp; branches; next 1.8; 1.8 date 97.08.12.14.42.39; author eivind; state Exp; branches; next 1.7; 1.7 date 97.04.23.10.16.55; author bde; state Exp; branches; next 1.6; 1.6 date 96.08.11.16.22.47; author ache; state Exp; branches 1.6.2.1; next 1.5; 1.5 date 96.01.22.01.30.03; author adam; state Exp; branches; next 1.4; 1.4 date 95.10.24.05.18.36; author ache; state Exp; branches; next 1.3; 1.3 date 95.07.18.01.03.46; author peter; state Exp; branches; next 1.2; 1.2 date 95.07.17.12.37.50; author peter; state Exp; branches; next 1.1; 1.1 date 94.05.27.12.30.44; author rgrimes; state Exp; branches 1.1.1.1; next ; 1.1.1.1 date 94.05.27.12.30.45; author rgrimes; state Exp; branches; next ; 1.6.2.1 date 97.05.07.05.24.36; author asami; state Exp; branches; next 1.6.2.2; 1.6.2.2 date 97.08.12.15.39.07; author eivind; state Exp; branches; next 1.6.2.3; 1.6.2.3 date 98.07.17.04.19.43; author jkh; state Exp; branches; next ; 1.10.2.1 date 99.07.28.06.09.51; author hoek; state Exp; branches; next 1.10.2.2; 1.10.2.2 date 99.07.28.06.17.11; author hoek; state Exp; branches; next 1.10.2.3; 1.10.2.3 date 99.08.29.15.31.16; author peter; state Exp; branches; next 1.10.2.4; 1.10.2.4 date 2000.05.09.03.57.14; author hoek; state Exp; branches; next ; 1.14.2.1 date 2000.05.09.03.54.49; author hoek; state Exp; branches; next ; desc @@ 1.18 log @Make -e be more -e'ish. User must now press 'q'. to quit. Change function name init_mark() -> marks_initmarks(). @ text @/* * Copyright (c) 1988 Mark Nudleman * Copyright (c) 1988, 1993 * Regents of the University of California. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * 3. All advertising materials mentioning features or use of this software * must display the following acknowledgement: * This product includes software developed by the University of * California, Berkeley and its contributors. * 4. Neither the name of the University nor the names of its contributors * may be used to endorse or promote products derived from this software * without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. */ #ifndef lint char copyright[] = "@@(#) Copyright (c) 1988 Mark Nudleman.\n\ @@(#) Copyright (c) 1988, 1993 Regents of the University of California. All rights reserved.\n"; #endif /* not lint */ #ifndef lint static char sccsid[] = "@@(#)main.c 8.1 (Berkeley) 6/7/93"; #endif /* not lint */ #ifndef lint static const char rcsid[] = "$FreeBSD: src/usr.bin/more/main.c,v 1.16 2000/05/14 03:30:58 hoek Exp $"; #endif /* not lint */ /* * Entry point, initialization, miscellaneous routines. */ #include #include #include #include #include #include #include #include #include #define DEFINEGLOBALS #include "defrc.h" #include "less.h" #include "pathnames.h" int ispipe; char *current_file, *previous_file, *current_name, *next_name; int any_display; int ac; char **av; int curr_ac; extern int file; extern int cbufs; extern int errmsgs; extern char *tagfile; extern int tagoption; /* * Edit a new file. * Filename "-" means standard input. * No filename means the "current" file, from the command line. If called * with the same filename in succession, filename will be closed and reopened. * * If called with FORCE_OPEN, the file will be re-opened even if it is * already open. */ edit(filename, force_open) register char *filename; { register int f; register char *m; off_t initial_pos, position(); static off_t prev_pos; static int didpipe; char message[MAXPATHLEN + 50], *p; char *rindex(), *strerror(), *save(), *bad_file(); extern int horiz_off, wraplines; if (force_open == NO_FORCE_OPEN && current_file && filename && !strcmp(filename, current_file)) return(1); /* Okay since later code in this fcn() always forces redraw() */ horiz_off = 0; wraplines = 1; initial_pos = NULL_POSITION; if (filename == NULL || *filename == '\0') { if (curr_ac >= ac) { error("No current file"); return(0); } filename = save(av[curr_ac]); } else if (strcmp(filename, "#") == 0) { if (!previous_file || *previous_file == '\0') { error("no previous file"); return(0); } filename = save(previous_file); initial_pos = prev_pos; } else filename = save(filename); /* use standard input. */ if (!strcmp(filename, "-")) { if (didpipe) { error("can view standard input only once"); return(0); } f = 0; } else if ((m = bad_file(filename, message, sizeof(message))) != NULL) { error(m); free(filename); return(0); } else if ((f = open(filename, O_RDONLY, 0)) < 0) { (void)snprintf(message, sizeof(message), "%s: %s", filename, strerror(errno)); error(message); free(filename); return(0); } if (isatty(f)) { /* * Not really necessary to call this an error, * but if the control terminal (for commands) * and the input file (for data) are the same, * we get weird results at best. */ error("Can't take input from a terminal"); if (f > 0) (void)close(f); (void)free(filename); return(0); } /* * We are now committed to using the new file. * Close the current input file and set up to use the new one. */ if (file > 0) (void)close(file); if (previous_file != NULL) free(previous_file); previous_file = current_file; current_file = filename; pos_clear(); prev_pos = position(TOP); ispipe = (f == 0); if (ispipe) { didpipe = 1; current_name = "stdin"; } else current_name = (p = rindex(filename, '/')) ? p + 1 : filename; if (curr_ac >= ac) next_name = NULL; else next_name = av[curr_ac + 1]; file = f; ch_init(cbufs, 0); if (isatty(STDOUT_FILENO)) { int no_display = !any_display; any_display = 1; if (no_display && errmsgs > 0) { /* * We displayed some messages on error output * (file descriptor 2; see error() function). * Before erasing the screen contents, * display the file name and wait for a keystroke. */ error(filename); } /* * Indicate there is nothing displayed yet. */ if (initial_pos != NULL_POSITION) jump_loc(initial_pos); clr_linenum(); } return(1); } /* * Edit the next file in the command line list. */ next_file(n) int n; { extern int quit_at_eof; off_t position(); if (curr_ac + n >= ac) { if (quit_at_eof || position(TOP) == NULL_POSITION) return; error("No (N-th) next file"); } else (void)edit(av[curr_ac += n], FORCE_OPEN); } /* * Edit the previous file in the command line list. */ prev_file(n) int n; { if (curr_ac - n < 0) error("No (N-th) previous file"); else (void)edit(av[curr_ac -= n], FORCE_OPEN); } /* * copy a file directly to standard output; used if stdout is not a tty. * the only processing is to squeeze multiple blank input lines. */ static cat_file() { extern int squeeze; register int c, empty; if (squeeze) { empty = 0; while ((c = ch_forw_get()) != EOI) if (c != '\n') { putchr(c); empty = 0; } else if (empty < 2) { putchr(c); ++empty; } } else while ((c = ch_forw_get()) != EOI) putchr(c); flush(); } main(argc, argv) int argc; char **argv; { int envargc, argcnt; char *envargv[3]; (void) setlocale(LC_ALL, ""); /* * Process command line arguments and MORE environment arguments. * Command line arguments override environment arguments. */ if (envargv[1] = getenv("MORE")) { envargc = 2; envargv[0] = "more"; envargv[2] = NULL; (void)option(envargc, envargv); } argcnt = option(argc, argv); argv += argcnt; argc -= argcnt; /* * Set up list of files to be examined. */ ac = argc; av = argv; curr_ac = 0; marks_initmarks(); /* * Set up terminal, etc. */ if (!isatty(STDOUT_FILENO)) { /* * Output is not a tty. * Just copy the input file(s) to output. */ if (ac < 1) { (void)edit("-", NOFLAGS); if (file >= 0) cat_file(); } else { do { (void)edit((char *)NULL, FORCE_OPEN); if (file >= 0) cat_file(); } while (++curr_ac < ac); } exit(0); } raw_mode(1); get_term(); open_getchr(); init(); init_signals(1); /* select the first file to examine. */ if (tagoption) { /* * A -t option was given; edit the file selected by the * "tags" search, and search for the proper line in the file. */ if (!tagfile || !edit(tagfile, NOFLAGS) || tagsearch()) quit(); } else if (ac < 1) (void)edit("-", NOFLAGS); /* Standard input */ else { /* * Try all the files named as command arguments. * We are simply looking for one which can be * opened without error. */ do { (void)edit((char *)NULL, NOFLAGS); } while (file < 0 && ++curr_ac < ac); } if (file >= 0) { /* * Don't call rcfiles() until now so that people who put * wierd things (like "forw_scroll") in their rc file don't * cause us to SEGV. */ rcfiles(); commands(); } quit(); /*NOTREACHED*/ } /* * Copy a string to a "safe" place * (that is, to a buffer allocated by malloc). */ char * save(s) char *s; { char *p, *strcpy(); p = malloc((u_int)strlen(s)+1); if (p == NULL) { error("cannot allocate memory"); quit(); } return(strcpy(p, s)); } /* * Exit the program. */ quit() { /* * Put cursor at bottom left corner, clear the line, * reset the terminal modes, and exit. */ lower_left(); clear_eol(); deinit(); flush(); raw_mode(0); exit(0); } /* * Read in from each of the three rc files - default, system, user. * Calls handle_error() directly to report errors. */ rcfiles() { FILE *fd; char fbuf[MAXPATHLEN + 1]; char *c; int readrc(); int savederrno; static int str_read(); /* The default builtin rc file */ if ((c = getenv("HOME")) && strlen(c) + strlen(_PATH_DEFRC) + 1 < MAXPATHLEN) { sprintf(fbuf, "%s/%s", c, _PATH_DEFRC); fd = fopen(fbuf, "r"); savederrno = errno; if (!fd) { if (!access(_PATH_SYSMORERC, F_OK)) { SETERRSTR(E_EXTERN, "unable to read %s: %s", _PATH_SYSMORERC, strerror(savederrno)); handle_error(); } /* We'd better have some type of default keys!! */ goto use_builtin_defrc; } else { readrc(fd); fclose(fd); } } else { use_builtin_defrc: fd = fropen(DEFRC, str_read); readrc(fd); fclose(fd); } /* The system rc file */ fd = fopen(_PATH_SYSMORERC, "r"); savederrno = errno; if (!fd) { if (!access(_PATH_SYSMORERC, F_OK)) { SETERRSTR(E_EXTERN, "unable to read %s: %s", _PATH_SYSMORERC, strerror(savederrno)); handle_error(); } else ; /* non-existant => non-error */ } else { readrc(fd); fclose(fd); } /* The user rc file */ if ((c = getenv("HOME")) && strlen(c) + strlen(_PATH_RC) + 1 < MAXPATHLEN) { sprintf(fbuf, "%s/%s", c, _PATH_RC); fd = fopen(fbuf, "r"); savederrno = errno; if (!fd) { if (!access(fbuf, F_OK)) { SETERRSTR(E_EXTERN, "unable to read %s: %s", fbuf, strerror(savederrno)); handle_error(); } else ; /* non-existant => non-error */ } else { readrc(fd); fclose(fd); } } } /* * Read-in an rc file from a fd. Calls handle_error() directly to handle * errors. * * This really belongs in ncommand.c, but that file is already 33292 bytes * long. */ readrc(fd) FILE *fd; { char *bufptr, *buf; size_t len; int strlenbuf; buf = NULL; strlenbuf = 0; while (bufptr = fgetln(fd, &len)) { if (!len) continue; /* ??? */ if (*bufptr == '#') continue; /* skip comments */ if (!(buf = reallocf(buf, strlenbuf + len + 1))) { SETERR(E_MALLOC); handle_error(); if (strlenbuf + len < 1024) return; /* major memory shortage... */ continue; } memcpy (buf + strlenbuf, bufptr, len); buf[len + strlenbuf] = '\0'; if (len > 1 && buf[strlenbuf + len - 2] == '\\') { /* line continuation */ buf[strlenbuf + len - 2] = '\0'; strlenbuf = strlen(buf); continue; } if (buf[len + strlenbuf - 1] == '\n') buf[len + strlenbuf - 1] = '\0'; if (command(buf)) handle_error(); free(buf); buf = NULL; strlenbuf = 0; } } /* * Read from the NUL-terminated cookie. Non-reentrant: keeps a static pointer * to the current position in the cookie. Used for funopen(). */ static int str_read(cookie, buf, len) void *cookie; char *buf; size_t len; { static char *curpos; static int cooklen; static char *lastcook; if (lastcook != cookie) { /* begin working on a new cookie */ curpos = cookie; lastcook = cookie; cooklen = strlen(cookie); } if (curpos + len > lastcook + cooklen) { ssize_t r; memcpy(buf, curpos, r = (cooklen - (curpos - lastcook))); curpos = cookie + cooklen; return (int) r; } else { memcpy(buf, curpos, len); curpos += len; return (int) len; } } @ 1.17 log @I'm not sure what posessed me to initialize wraplines to FALSE in the prev commit, but it's obviously supposed to be initialised to TRUE. @ text @d225 1 a225 1 quit(); d301 1 a301 1 init_mark(); @ 1.16 log @Allow bookmarks to cross files. @ text @d48 1 a48 1 "$FreeBSD: src/usr.bin/more/main.c,v 1.15 2000/05/09 03:53:13 hoek Exp $"; d112 1 a112 1 wraplines = 0; @ 1.15 log @Don't segv if viewing "#" and there is no prev-file (long-standing). Staticize a variable that was meant to be static (broken in r.1.11). PR: bin/11370 Henry Whincup (for the segv) @ text @d48 1 a48 1 "$FreeBSD: src/usr.bin/more/main.c,v 1.14 1999/09/03 22:31:16 hoek Exp $"; d90 3 d94 1 a94 1 edit(filename) d104 9 a190 1 init_mark(); d229 1 a229 1 (void)edit(av[curr_ac += n]); d241 1 a241 1 (void)edit(av[curr_ac -= n]); d301 2 d312 1 a312 1 (void)edit("-"); d317 1 a317 1 (void)edit((char *)NULL); d337 1 a337 1 if (!tagfile || !edit(tagfile) || tagsearch()) d341 1 a341 1 (void)edit("-"); /* Standard input */ d349 1 a349 1 (void)edit((char *)NULL); @ 1.14 log @Thorough revamp of how input commands are processed. This allows customization of user keys (documentation pending). The only key whose semantics have changed is the capital 'N' key, which now performs a repeat-search in the opposite direction (just like in vi). This commit is a little bulkier than what I had originally planned. I'm not completely happy with the direction it went, but it's definately an improvement, and the alternative is to continue becoming irrelevant compared to GNU less. (Does anyone even _use_ /usr/bin/more these days?) @ text @d48 1 a48 1 "$FreeBSD: src/usr.bin/more/main.c,v 1.13 1999/08/28 01:04:17 peter Exp $"; d96 2 a97 1 off_t initial_pos, prev_pos, position(); d111 1 a111 1 if (*previous_file == '\0') { @ 1.14.2.1 log @MFC: Bugfixes when viewing previous file @ text @d48 1 a48 1 "$FreeBSD: src/usr.bin/more/main.c,v 1.15 2000/05/09 03:53:13 hoek Exp $"; d96 1 a96 2 off_t initial_pos, position(); static off_t prev_pos; d110 1 a110 1 if (!previous_file || *previous_file == '\0') { @ 1.13 log @$Id$ -> $FreeBSD$ @ text @d48 1 a48 1 "$FreeBSD$"; d59 1 d66 2 d69 1 a73 1 int scroll; a93 1 extern int errno; d339 7 a345 1 if (file >= 0) d347 1 d386 153 @ 1.12 log @Grok gtags too. @ text @d48 1 a48 1 "$Id: main.c,v 1.11 1999/05/30 18:06:56 hoek Exp $"; @ 1.11 log @General code cleanup [incomplete]. Make the arrow keys work. @ text @d48 1 a48 1 "$Id$"; d85 2 a86 1 * No filename means the "current" file, from the command line. @ 1.10 log @sprintf -> snprintf to avoid potential buffer overflow. PR: 6907 Submitted by: Archie Cobbs @ text @d46 5 d55 2 d58 2 a59 2 #include #include d63 2 a64 1 #include a67 2 int new_file; int is_tty; a68 1 off_t prev_pos; a73 1 int quitting; d93 1 a93 1 off_t initial_pos, position(); d119 1 a119 1 error("Can view standard input only once"); a156 1 new_file = 1; d177 1 a177 1 if (is_tty) { d289 1 a289 2 is_tty = isatty(1); if (!is_tty) { a369 1 quitting = 1; @ 1.10.2.1 log @commit-notes @ text @a45 5 #ifndef lint static const char rcsid[] = "$Id: main.c,v 1.12 1999/06/01 20:02:33 hoek Exp $"; #endif /* not lint */ d50 2 a52 4 #include #include #include d56 1 a56 2 #include d60 2 d63 1 d69 1 d81 1 a81 2 * No filename means the "current" file, from the command line. If called * with the same filename in succession, filename will be closed and reopened. d89 1 a89 1 off_t initial_pos, prev_pos, position(); d115 1 a115 1 error("can view standard input only once"); d153 1 d174 1 a174 1 if (isatty(STDOUT_FILENO)) { d286 2 a287 1 if (!isatty(STDOUT_FILENO)) { d368 1 @ 1.10.2.2 log @[Whoops... used ci -m instead of -F on the last commit...] MFC: misc incidental cleanup, gtags support, better line-number passing to $EDITOR, working arrow keys, $Id$ to manpage @ text @d48 1 a48 1 "$Id: main.c,v 1.10.2.1 1999/07/28 06:09:51 hoek Exp $"; @ 1.10.2.3 log @$Id$ -> $FreeBSD$ @ text @d48 1 a48 1 "$FreeBSD$"; @ 1.10.2.4 log @MFC: Bugfixes when viewing previous-file. @ text @d48 1 a48 1 "$FreeBSD: src/usr.bin/more/main.c,v 1.10.2.3 1999/08/29 15:31:16 peter Exp $"; d94 1 a94 2 off_t initial_pos, position(); static off_t prev_pos; d108 1 a108 1 if (!previous_file || *previous_file == '\0') { @ 1.9 log @Add #include to get prototypes for functions that gcc has builtin (and wants to know that the prototypes match). @ text @d51 1 d91 1 a91 1 char message[100], *p; d126 2 a127 1 (void)sprintf(message, "%s: %s", filename, strerror(errno)); @ 1.8 log @Fix fencepost error. PR: 4170 Submitted by: Harlan Stenn @ text @d54 1 @ 1.7 log @Removed inconsistent declaration of malloc(). `make world' with DESTDIR set to something other than "/" now actually works. @ text @d255 1 a255 1 char *envargv[2]; @ 1.6 log @Pick collate info for RE character ranges @ text @d345 1 a345 1 char *p, *strcpy(), *malloc(); @ 1.6.2.1 log @Merge Bruce's malloc() declaration eliminations from -current. @ text @d345 1 a345 1 char *p, *strcpy(); @ 1.6.2.2 log @YAMFC: 1.8 - Fix fencepost error PR: 4170 @ text @d255 1 a255 1 char *envargv[3]; @ 1.6.2.3 log @MFC: doc fixes, enhancements to locate & more, new tail functionality. @ text @a50 1 #include a53 1 #include d89 1 a89 1 char message[MAXPATHLEN + 50], *p; d124 1 a124 2 (void)snprintf(message, sizeof(message), "%s: %s", filename, strerror(errno)); @ 1.5 log @'more | cat' was producing spurious output from an unused buffer @ text @d257 1 a257 1 (void) setlocale(LC_CTYPE, ""); @ 1.4 log @Add setlocale LC_CTYPE @ text @d291 2 a292 1 cat_file(); @ 1.3 log @Oops! Andrey pointed out tht setlocale(LC_CTYPE, "") doesn't actually work for locale's with multibyte characters. Backing this out.... cvs diff -c -r1.1 -r1.2 main.c | patch -R Reviewed by: Submitted by: Obtained from: @ text @d53 3 a55 1 #include d255 3 a257 1 char *envargv[2], *getenv(); @ 1.2 log @Make 'more' sensative to the current locale for it's ctype calls. Reviewed by: Submitted by: Thomas Gellekum, with minor cosmetic changes from me. Obtained from: @ text @a53 1 #include a253 2 setlocale(LC_CTYPE, ""); @ 1.1 log @Initial revision @ text @d54 1 d255 2 @ 1.1.1.1 log @BSD 4.4 Lite Usr.bin Sources @ text @@