[BACK]Return to soelim.c CVS log [TXT][DIR] Up to [cvsweb.bsd.lv] / mandoc

Annotation of mandoc/soelim.c, Revision 1.1.1.1

1.1       schwarze    1: /*-
                      2:  * Copyright (c) 2014 Baptiste Daroussin <bapt@FreeBSD.org>
                      3:  * All rights reserved.
                      4:  *
                      5:  * Redistribution and use in source and binary forms, with or without
                      6:  * modification, are permitted provided that the following conditions
                      7:  * are met:
                      8:  * 1. Redistributions of source code must retain the above copyright
                      9:  *    notice, this list of conditions and the following disclaimer
                     10:  *    in this position and unchanged.
                     11:  * 2. Redistributions in binary form must reproduce the above copyright
                     12:  *    notice, this list of conditions and the following disclaimer in the
                     13:  *    documentation and/or other materials provided with the distribution.
                     14:  *
                     15:  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR(S) ``AS IS'' AND ANY EXPRESS OR
                     16:  * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
                     17:  * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
                     18:  * IN NO EVENT SHALL THE AUTHOR(S) BE LIABLE FOR ANY DIRECT, INDIRECT,
                     19:  * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
                     20:  * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
                     21:  * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
                     22:  * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
                     23:  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
                     24:  * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
                     25:  */
                     26:
                     27: #include <sys/cdefs.h>
                     28: __FBSDID("$FreeBSD$");
                     29:
                     30: #include <sys/param.h>
                     31:
                     32: #define _WITH_GETLINE
                     33: #include <stdio.h>
                     34: #include <unistd.h>
                     35: #include <stdlib.h>
                     36: #include <stdbool.h>
                     37: #include <string.h>
                     38: #include <stringlist.h>
                     39: #include <err.h>
                     40: #include <ctype.h>
                     41:
                     42: #define C_OPTION 0x1
                     43:
                     44: static StringList *includes;
                     45:
                     46: static void
                     47: usage(void)
                     48: {
                     49:
                     50:        fprintf(stderr, "usage: soelim [-Crtv] [-I dir] [files]\n");
                     51:
                     52:        exit(EXIT_FAILURE);
                     53: }
                     54:
                     55: static FILE *
                     56: soelim_fopen(const char *name)
                     57: {
                     58:        FILE *f;
                     59:        char path[MAXPATHLEN];
                     60:        size_t i;
                     61:
                     62:        if (strcmp(name, "-") == 0)
                     63:                return (stdin);
                     64:
                     65:        if ((f = fopen(name, "r")) != NULL)
                     66:                return (f);
                     67:
                     68:        if (*name == '/') {
                     69:                warn("can't open '%s'", name);
                     70:                return (NULL);
                     71:        }
                     72:
                     73:        for (i = 0; i < includes->sl_cur; i++) {
                     74:                snprintf(path, sizeof(path), "%s/%s", includes->sl_str[i],
                     75:                    name);
                     76:                if ((f = fopen(path, "r")) != NULL)
                     77:                        return (f);
                     78:        }
                     79:
                     80:        warn("can't open '%s'", name);
                     81:
                     82:        return (f);
                     83: }
                     84:
                     85: static int
                     86: soelim_file(FILE *f, int flag)
                     87: {
                     88:        char *line = NULL;
                     89:        char *walk, *cp;
                     90:        size_t linecap = 0;
                     91:        ssize_t linelen;
                     92:
                     93:        if (f == NULL)
                     94:                return (1);
                     95:
                     96:        while ((linelen = getline(&line, &linecap, f)) > 0) {
                     97:                if (strncmp(line, ".so", 3) != 0) {
                     98:                        printf("%s", line);
                     99:                        continue;
                    100:                }
                    101:
                    102:                walk = line + 3;
                    103:                if (!isspace(*walk) && ((flag & C_OPTION) == 0)) {
                    104:                        printf("%s", line);
                    105:                        continue;
                    106:                }
                    107:
                    108:                while (isspace(*walk))
                    109:                        walk++;
                    110:
                    111:                cp = walk;
                    112:                while (*cp != '\0' && !isspace(*cp))
                    113:                        cp++;
                    114:                *cp = 0;
                    115:                if (cp < line + linelen)
                    116:                        cp++;
                    117:
                    118:                if (*walk == '\0') {
                    119:                        printf("%s", line);
                    120:                        continue;
                    121:                }
                    122:                if (soelim_file(soelim_fopen(walk), flag) == 1) {
                    123:                        free(line);
                    124:                        return (1);
                    125:                }
                    126:                if (*cp != '\0')
                    127:                        printf("%s", cp);
                    128:        }
                    129:
                    130:        free(line);
                    131:        fclose(f);
                    132:
                    133:        return (0);
                    134: }
                    135:
                    136: int
                    137: main(int argc, char **argv)
                    138: {
                    139:        int ch, i;
                    140:        int ret = 0;
                    141:        int flags = 0;
                    142:
                    143:        includes = sl_init();
                    144:        if (includes == NULL)
                    145:                err(EXIT_FAILURE, "sl_init()");
                    146:
                    147:        while ((ch = getopt(argc, argv, "CrtvI:")) != -1) {
                    148:                switch (ch) {
                    149:                case 'C':
                    150:                        flags |= C_OPTION;
                    151:                        break;
                    152:                case 'r':
                    153:                case 'v':
                    154:                case 't':
                    155:                        /* stub compatibility with groff's soelim */
                    156:                        break;
                    157:                case 'I':
                    158:                        sl_add(includes, optarg);
                    159:                        break;
                    160:                default:
                    161:                        sl_free(includes, 0);
                    162:                        usage();
                    163:                }
                    164:        }
                    165:
                    166:        argc -= optind;
                    167:        argv += optind;
                    168:
                    169:        if (argc == 0)
                    170:                ret = soelim_file(stdin, flags);
                    171:
                    172:        for (i = 0; i < argc; i++)
                    173:                ret = soelim_file(soelim_fopen(argv[i]), flags);
                    174:
                    175:        sl_free(includes, 0);
                    176:
                    177:        return (ret);
                    178: }

CVSweb