[BACK]Return to lessecho.c CVS log [TXT][DIR] Up to [local] / src / usr.bin / less

Annotation of src/usr.bin/less/lessecho.c, Revision 1.1

1.1     ! millert     1: /*
        !             2:  * Copyright (C) 1984-2002  Mark Nudelman
        !             3:  *
        !             4:  * You may distribute under the terms of either the GNU General Public
        !             5:  * License or the Less License, as specified in the README file.
        !             6:  *
        !             7:  * For more information about less, or for information on how to
        !             8:  * contact the author, see the README file.
        !             9:  */
        !            10:
        !            11:
        !            12: /*
        !            13:  * lessecho [-ox] [-cx] [-pn] [-dn] [-a] file ...
        !            14:  * Simply echos its filename arguments on standard output.
        !            15:  * But any argument containing spaces is enclosed in quotes.
        !            16:  *
        !            17:  * -ox Specifies "x" to be the open quote character.
        !            18:  * -cx Specifies "x" to be the close quote character.
        !            19:  * -pn Specifies "n" to be the open quote character, as an integer.
        !            20:  * -dn Specifies "n" to be the close quote character, as an integer.
        !            21:  * -mx  Specifies "x" to be a metachar.
        !            22:  * -nn  Specifies "n" to be a metachar, as an integer.
        !            23:  * -ex  Specifies "x" to be the escape char for metachars.
        !            24:  * -fn  Specifies "x" to be the escape char for metachars, as an integer.
        !            25:  * -a  Specifies that all arguments are to be quoted.
        !            26:  *     The default is that only arguments containing spaces are quoted.
        !            27:  */
        !            28:
        !            29: #include "less.h"
        !            30:
        !            31: static char *version = "$Revision: 1.9 $";
        !            32:
        !            33: static int quote_all = 0;
        !            34: static char openquote = '"';
        !            35: static char closequote = '"';
        !            36: static char *meta_escape = "\\";
        !            37: static char meta_escape_buf[2];
        !            38: static char metachars[64] = "";
        !            39: static int num_metachars = 0;
        !            40:
        !            41:        static void
        !            42: pr_usage()
        !            43: {
        !            44:        fprintf(stderr,
        !            45:                "usage: lessecho [-ox] [-cx] [-pn] [-dn] [-mx] [-nn] [-ex] [-fn] [-a] file ...\n");
        !            46: }
        !            47:
        !            48:        static void
        !            49: pr_version()
        !            50: {
        !            51:        char *p;
        !            52:        char buf[10];
        !            53:        char *pbuf = buf;
        !            54:
        !            55:        for (p = version;  *p != ' ';  p++)
        !            56:                if (*p == '\0')
        !            57:                        return;
        !            58:        for (p++;  *p != '$' && *p != ' ' && *p != '\0';  p++)
        !            59:                *pbuf++ = *p;
        !            60:        *pbuf = '\0';
        !            61:        printf("%s\n", buf);
        !            62: }
        !            63:
        !            64:        static void
        !            65: pr_error(s)
        !            66:        char *s;
        !            67: {
        !            68:        fprintf(stderr, "%s\n", s);
        !            69:        exit(1);
        !            70: }
        !            71:
        !            72:        static long
        !            73: lstrtol(s, radix, pend)
        !            74:        char *s;
        !            75:        int radix;
        !            76:        char **pend;
        !            77: {
        !            78:        int v;
        !            79:        int neg = 0;
        !            80:        long n = 0;
        !            81:
        !            82:        /* Skip leading white space. */
        !            83:        while (*s == ' ' || *s == '\t')
        !            84:                s++;
        !            85:
        !            86:        /* Check for a leading + or -. */
        !            87:        if (*s == '-')
        !            88:        {
        !            89:                neg = 1;
        !            90:                s++;
        !            91:        } else if (*s == '+')
        !            92:        {
        !            93:                s++;
        !            94:        }
        !            95:
        !            96:        /* Determine radix if caller does not specify. */
        !            97:        if (radix == 0)
        !            98:        {
        !            99:                radix = 10;
        !           100:                if (*s == '0')
        !           101:                {
        !           102:                        switch (*++s)
        !           103:                        {
        !           104:                        case 'x':
        !           105:                                radix = 16;
        !           106:                                s++;
        !           107:                                break;
        !           108:                        default:
        !           109:                                radix = 8;
        !           110:                                break;
        !           111:                        }
        !           112:                }
        !           113:        }
        !           114:
        !           115:        /* Parse the digits of the number. */
        !           116:        for (;;)
        !           117:        {
        !           118:                if (*s >= '0' && *s <= '9')
        !           119:                        v = *s - '0';
        !           120:                else if (*s >= 'a' && *s <= 'f')
        !           121:                        v = *s - 'a' + 10;
        !           122:                else if (*s >= 'A' && *s <= 'F')
        !           123:                        v = *s - 'A' + 10;
        !           124:                else
        !           125:                        break;
        !           126:                if (v >= radix)
        !           127:                        break;
        !           128:                n = n * radix + v;
        !           129:                s++;
        !           130:        }
        !           131:
        !           132:        if (pend != NULL)
        !           133:        {
        !           134:                /* Skip trailing white space. */
        !           135:                while (*s == ' ' || *s == '\t')
        !           136:                        s++;
        !           137:                *pend = s;
        !           138:        }
        !           139:        if (neg)
        !           140:                return (-n);
        !           141:        return (n);
        !           142: }
        !           143:
        !           144:
        !           145: #if !HAVE_STRCHR
        !           146:        char *
        !           147: strchr(s, c)
        !           148:        char *s;
        !           149:        int c;
        !           150: {
        !           151:        for ( ;  *s != '\0';  s++)
        !           152:                if (*s == c)
        !           153:                        return (s);
        !           154:        if (c == '\0')
        !           155:                return (s);
        !           156:        return (NULL);
        !           157: }
        !           158: #endif
        !           159:
        !           160:        int
        !           161: main(argc, argv)
        !           162:        int argc;
        !           163:        char *argv[];
        !           164: {
        !           165:        char *arg;
        !           166:        char *s;
        !           167:        int no_more_options;
        !           168:
        !           169:        no_more_options = 0;
        !           170:        while (--argc > 0)
        !           171:        {
        !           172:                arg = *++argv;
        !           173:                if (*arg != '-' || no_more_options)
        !           174:                        break;
        !           175:                switch (*++arg)
        !           176:                {
        !           177:                case 'a':
        !           178:                        quote_all = 1;
        !           179:                        break;
        !           180:                case 'c':
        !           181:                        closequote = *++arg;
        !           182:                        break;
        !           183:                case 'd':
        !           184:                        closequote = lstrtol(++arg, 0, &s);
        !           185:                        if (s == arg)
        !           186:                                pr_error("Missing number after -d");
        !           187:                        break;
        !           188:                case 'e':
        !           189:                        if (strcmp(++arg, "-") == 0)
        !           190:                                meta_escape = "";
        !           191:                        else
        !           192:                                meta_escape = arg;
        !           193:                        break;
        !           194:                case 'f':
        !           195:                        meta_escape_buf[0] = lstrtol(++arg, 0, &s);
        !           196:                        meta_escape = meta_escape_buf;
        !           197:                        if (s == arg)
        !           198:                                pr_error("Missing number after -f");
        !           199:                        break;
        !           200:                case 'o':
        !           201:                        openquote = *++arg;
        !           202:                        break;
        !           203:                case 'p':
        !           204:                        openquote = lstrtol(++arg, 0, &s);
        !           205:                        if (s == arg)
        !           206:                                pr_error("Missing number after -p");
        !           207:                        break;
        !           208:                case 'm':
        !           209:                        metachars[num_metachars++] = *++arg;
        !           210:                        metachars[num_metachars] = '\0';
        !           211:                        break;
        !           212:                case 'n':
        !           213:                        metachars[num_metachars++] = lstrtol(++arg, 0, &s);
        !           214:                        if (s == arg)
        !           215:                                pr_error("Missing number after -n");
        !           216:                        metachars[num_metachars] = '\0';
        !           217:                        break;
        !           218:                case '?':
        !           219:                        pr_usage();
        !           220:                        return (0);
        !           221:                case '-':
        !           222:                        if (*++arg == '\0')
        !           223:                        {
        !           224:                                no_more_options = 1;
        !           225:                                break;
        !           226:                        }
        !           227:                        if (strcmp(arg, "version") == 0)
        !           228:                        {
        !           229:                                pr_version();
        !           230:                                return (0);
        !           231:                        }
        !           232:                        if (strcmp(arg, "help") == 0)
        !           233:                        {
        !           234:                                pr_usage();
        !           235:                                return (0);
        !           236:                        }
        !           237:                        pr_error("Invalid option after --");
        !           238:                default:
        !           239:                        pr_error("Invalid option letter");
        !           240:                }
        !           241:        }
        !           242:
        !           243:        while (argc-- > 0)
        !           244:        {
        !           245:                int has_meta = 0;
        !           246:                arg = *argv++;
        !           247:                for (s = arg;  *s != '\0';  s++)
        !           248:                {
        !           249:                        if (strchr(metachars, *s) != NULL)
        !           250:                        {
        !           251:                                has_meta = 1;
        !           252:                                break;
        !           253:                        }
        !           254:                }
        !           255:                if (quote_all || (has_meta && strlen(meta_escape) == 0))
        !           256:                        printf("%c%s%c", openquote, arg, closequote);
        !           257:                else
        !           258:                {
        !           259:                        for (s = arg;  *s != '\0';  s++)
        !           260:                        {
        !           261:                                if (strchr(metachars, *s) != NULL)
        !           262:                                        printf("%s", meta_escape);
        !           263:                                printf("%c", *s);
        !           264:                        }
        !           265:                }
        !           266:                if (argc > 0)
        !           267:                        printf(" ");
        !           268:                else
        !           269:                        printf("\n");
        !           270:        }
        !           271:        return (0);
        !           272: }