diff options
author | ps <ps@FreeBSD.org> | 2000-05-22 09:53:22 +0000 |
---|---|---|
committer | ps <ps@FreeBSD.org> | 2000-05-22 09:53:22 +0000 |
commit | 1b28029810e9c377087ea5a45acc8767cf0196b3 (patch) | |
tree | 27b16fc210b9a302c9e74f90e36a9b5ed21e6300 /contrib/less/lessecho.c | |
download | FreeBSD-src-1b28029810e9c377087ea5a45acc8767cf0196b3.zip FreeBSD-src-1b28029810e9c377087ea5a45acc8767cf0196b3.tar.gz |
Import the [now] dual licensed version 3.5.4 of less. It is
distributed under your choice of the GPL or a BSD style license.
Reviewed by: peter
Obtained from: http://home.flash.net/~marknu/less/
Diffstat (limited to 'contrib/less/lessecho.c')
-rw-r--r-- | contrib/less/lessecho.c | 226 |
1 files changed, 226 insertions, 0 deletions
diff --git a/contrib/less/lessecho.c b/contrib/less/lessecho.c new file mode 100644 index 0000000..03739fc --- /dev/null +++ b/contrib/less/lessecho.c @@ -0,0 +1,226 @@ +/* + * Copyright (C) 1984-2000 Mark Nudelman + * + * You may distribute under the terms of either the GNU General Public + * License or the Less License, as specified in the README file. + * + * For more information about less, or for information on how to + * contact the author, see the README file. + */ + + +/* + * lessecho [-ox] [-cx] [-pn] [-dn] [-a] file ... + * Simply echos its filename arguments on standard output. + * But any argument containing spaces is enclosed in quotes. + * + * -ox Specifies "x" to be the open quote character. + * -cx Specifies "x" to be the close quote character. + * -pn Specifies "n" to be the open quote character, as an integer. + * -dn Specifies "n" to be the close quote character, as an integer. + * -a Specifies that all arguments are to be quoted. + * The default is that only arguments containing spaces are quoted. + */ + +#include "less.h" + +static char *version = "$Revision: 1.6 $"; + +static int quote_all = 0; +static char openquote = '"'; +static char closequote = '"'; + + static void +pr_usage() +{ + fprintf(stderr, + "usage: lessecho [-ox] [-cx] [-pn] [-dn] [-a] file ...\n"); +} + + static void +pr_version() +{ + char *p; + char buf[10]; + char *pbuf = buf; + + for (p = version; *p != ' '; p++) + if (*p == '\0') + return; + for (p++; *p != '$' && *p != ' ' && *p != '\0'; p++) + *pbuf++ = *p; + *pbuf = '\0'; + printf("%s\n", buf); +} + + static void +pr_error(s) + char *s; +{ + fprintf(stderr, "%s\n", s); + exit(1); +} + + static long +lstrtol(s, radix, pend) + char *s; + int radix; + char **pend; +{ + int v; + int neg = 0; + long n = 0; + + /* Skip leading white space. */ + while (*s == ' ' || *s == '\t') + s++; + + /* Check for a leading + or -. */ + if (*s == '-') + { + neg = 1; + s++; + } else if (*s == '+') + { + s++; + } + + /* Determine radix if caller does not specify. */ + if (radix == 0) + { + radix = 10; + if (*s == '0') + { + switch (*++s) + { + case 'x': + radix = 16; + s++; + break; + default: + radix = 8; + break; + } + } + } + + /* Parse the digits of the number. */ + for (;;) + { + if (*s >= '0' && *s <= '9') + v = *s - '0'; + else if (*s >= 'a' && *s <= 'f') + v = *s - 'a' + 10; + else if (*s >= 'A' && *s <= 'F') + v = *s - 'A' + 10; + else + break; + if (v >= radix) + break; + n = n * radix + v; + s++; + } + + if (pend != NULL) + { + /* Skip trailing white space. */ + while (*s == ' ' || *s == '\t') + s++; + *pend = s; + } + if (neg) + return (-n); + return (n); +} + + +#if !HAVE_STRCHR + char * +strchr(s, c) + char *s; + int c; +{ + for ( ; *s != '\0'; s++) + if (*s == c) + return (s); + if (c == '\0') + return (s); + return (NULL); +} +#endif + + int +main(argc, argv) + int argc; + char *argv[]; +{ + char *arg; + char *s; + int no_more_options; + + no_more_options = 0; + while (--argc > 0) + { + arg = *++argv; + if (*arg != '-' || no_more_options) + break; + switch (*++arg) + { + case 'a': + quote_all = 1; + break; + case 'o': + openquote = *++arg; + break; + case 'c': + closequote = *++arg; + break; + case 'p': + openquote = lstrtol(++arg, 0, &s); + if (s == arg) + pr_error("Missing number after -O"); + break; + case 'd': + closequote = lstrtol(++arg, 0, &s); + if (s == arg) + pr_error("Missing number after -C"); + break; + case '?': + pr_usage(); + return (0); + case '-': + if (*++arg == '\0') + { + no_more_options = 1; + break; + } + if (strcmp(arg, "version") == 0) + { + pr_version(); + return (0); + } + if (strcmp(arg, "help") == 0) + { + pr_usage(); + return (0); + } + pr_error("Invalid option after --"); + default: + pr_error("Invalid option letter"); + } + } + + while (argc-- > 0) + { + arg = *argv++; + if (quote_all || strchr(arg, ' ') != NULL) + printf("%c%s%c", openquote, arg, closequote); + else + printf("%s", arg); + if (argc > 0) + printf(" "); + else + printf("\n"); + } + return (0); +} |