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

Annotation of mandoc/mdoctree.c, Revision 1.3

1.3     ! kristaps    1:        /* $Id: mdoctree.c,v 1.2 2009/02/22 22:58:39 kristaps Exp $ */
1.1       kristaps    2: /*
                      3:  * Copyright (c) 2008 Kristaps Dzonsons <kristaps@kth.se>
                      4:  *
                      5:  * Permission to use, copy, modify, and distribute this software for any
                      6:  * purpose with or without fee is hereby granted, provided that the
                      7:  * above copyright notice and this permission notice appear in all
                      8:  * copies.
                      9:  *
                     10:  * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL
                     11:  * WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED
                     12:  * WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE
                     13:  * AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL
                     14:  * DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR
                     15:  * PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
                     16:  * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
                     17:  * PERFORMANCE OF THIS SOFTWARE.
                     18:  */
                     19: #include <assert.h>
                     20: #include <err.h>
                     21: #include <getopt.h>
1.3     ! kristaps   22: #include <stdio.h>
1.1       kristaps   23: #include <stdlib.h>
                     24:
1.2       kristaps   25: #include "mmain.h"
1.1       kristaps   26:
1.3     ! kristaps   27: #define        xprintf (void)printf
        !            28:
        !            29: static void    doprint(const struct mdoc_node *, int);
1.1       kristaps   30:
                     31: int
                     32: main(int argc, char *argv[])
                     33: {
1.2       kristaps   34:        struct mmain    *p;
                     35:        const struct mdoc *mdoc;
                     36:
                     37:        extern int       optreset;
1.1       kristaps   38:        extern int       optind;
                     39:
1.2       kristaps   40:        p = mmain_alloc();
1.1       kristaps   41:
1.3     ! kristaps   42:        if ( ! mmain_getopt(p, argc, argv, NULL, NULL, NULL, NULL))
1.2       kristaps   43:                mmain_exit(p, 1);
1.1       kristaps   44:
1.2       kristaps   45:        if (NULL == (mdoc = mmain_mdoc(p)))
                     46:                mmain_exit(p, 1);
1.1       kristaps   47:
1.3     ! kristaps   48:        doprint(mdoc_node(mdoc), 0);
1.2       kristaps   49:        mmain_exit(p, 0);
                     50:        /* NOTREACHED */
1.1       kristaps   51: }
                     52:
                     53:
1.3     ! kristaps   54: static void
        !            55: doprint(const struct mdoc_node *n, int indent)
        !            56: {
        !            57:        const char       *p, *t;
        !            58:        int               i, j;
        !            59:        size_t            argc, sz;
        !            60:        char            **params;
        !            61:        struct mdoc_arg  *argv;
        !            62:
        !            63:        argv = NULL;
        !            64:        argc = sz = 0;
        !            65:        params = NULL;
        !            66:
        !            67:        switch (n->type) {
        !            68:        case (MDOC_ROOT):
        !            69:                t = "root";
        !            70:                break;
        !            71:        case (MDOC_BLOCK):
        !            72:                t = "block";
        !            73:                break;
        !            74:        case (MDOC_HEAD):
        !            75:                t = "block-head";
        !            76:                break;
        !            77:        case (MDOC_BODY):
        !            78:                t = "block-body";
        !            79:                break;
        !            80:        case (MDOC_TAIL):
        !            81:                t = "block-tail";
        !            82:                break;
        !            83:        case (MDOC_ELEM):
        !            84:                t = "elem";
        !            85:                break;
        !            86:        case (MDOC_TEXT):
        !            87:                t = "text";
        !            88:                break;
        !            89:        default:
        !            90:                abort();
        !            91:                /* NOTREACHED */
        !            92:        }
        !            93:
        !            94:        switch (n->type) {
        !            95:        case (MDOC_TEXT):
        !            96:                p = n->data.text.string;
        !            97:                break;
        !            98:        case (MDOC_BODY):
        !            99:                p = mdoc_macronames[n->tok];
        !           100:                break;
        !           101:        case (MDOC_HEAD):
        !           102:                p = mdoc_macronames[n->tok];
        !           103:                break;
        !           104:        case (MDOC_TAIL):
        !           105:                p = mdoc_macronames[n->tok];
        !           106:                break;
        !           107:        case (MDOC_ELEM):
        !           108:                p = mdoc_macronames[n->tok];
        !           109:                argv = n->data.elem.argv;
        !           110:                argc = n->data.elem.argc;
        !           111:                break;
        !           112:        case (MDOC_BLOCK):
        !           113:                p = mdoc_macronames[n->tok];
        !           114:                argv = n->data.block.argv;
        !           115:                argc = n->data.block.argc;
        !           116:                break;
        !           117:        case (MDOC_ROOT):
        !           118:                p = "root";
        !           119:                break;
        !           120:        default:
        !           121:                abort();
        !           122:                /* NOTREACHED */
        !           123:        }
        !           124:
        !           125:        for (i = 0; i < indent; i++)
        !           126:                xprintf("    ");
        !           127:        xprintf("%s (%s)", p, t);
        !           128:
        !           129:        for (i = 0; i < (int)argc; i++) {
        !           130:                xprintf(" -%s", mdoc_argnames[argv[i].arg]);
        !           131:                if (argv[i].sz > 0)
        !           132:                        xprintf(" [");
        !           133:                for (j = 0; j < (int)argv[i].sz; j++)
        !           134:                        xprintf(" [%s]", argv[i].value[j]);
        !           135:                if (argv[i].sz > 0)
        !           136:                        xprintf(" ]");
        !           137:        }
        !           138:
        !           139:        for (i = 0; i < (int)sz; i++)
        !           140:                xprintf(" [%s]", params[i]);
        !           141:
        !           142:        xprintf(" %d:%d\n", n->line, n->pos);
        !           143:
        !           144:        if (n->child)
        !           145:                doprint(n->child, indent + 1);
        !           146:        if (n->next)
        !           147:                doprint(n->next, indent);
        !           148: }

CVSweb