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

Diff for /mandoc/Attic/mdoctree.c between version 1.2 and 1.8

version 1.2, 2009/02/22 22:58:39 version 1.8, 2009/03/16 23:37:28
Line 1 
Line 1 
         /* $Id$ */  /* $Id$ */
 /*  /*
  * Copyright (c) 2008 Kristaps Dzonsons <kristaps@kth.se>   * Copyright (c) 2008, 2009 Kristaps Dzonsons <kristaps@openbsd.org>
  *   *
  * Permission to use, copy, modify, and distribute this software for any   * Permission to use, copy, modify, and distribute this software for any
  * purpose with or without fee is hereby granted, provided that the   * purpose with or without fee is hereby granted, provided that the
Line 19 
Line 19 
 #include <assert.h>  #include <assert.h>
 #include <err.h>  #include <err.h>
 #include <getopt.h>  #include <getopt.h>
   #include <stdio.h>
 #include <stdlib.h>  #include <stdlib.h>
   
 #include "mmain.h"  #include "mmain.h"
   
 extern  void    treeprint(const struct mdoc_node *,  #define xprintf (void)printf
                         const struct mdoc_meta *);  
   
   static  void    doprint(const struct mdoc_node *, int);
   
 int  int
 main(int argc, char *argv[])  main(int argc, char *argv[])
 {  {
         struct mmain    *p;          struct mmain      *p;
         const struct mdoc *mdoc;          const struct mdoc *mdoc;
         int              c;          int                c;
           char              *in;
   
         extern int       optreset;  
         extern int       optind;  
   
         p = mmain_alloc();          p = mmain_alloc();
   
         if ( ! mmain_getopt(p, argc, argv, NULL))          c = mmain_getopt(p, argc, argv, NULL,
                 mmain_exit(p, 1);                          "[infile]", NULL, NULL, NULL);
   
         optreset = optind = 1;          argv += c;
         printf("here\n");          if ((argc -= c) > 0)
                   in = *argv++;
           else
                   in = "-";
   
         while (-1 != (c = getopt(argc, argv, "f:")))          if (NULL == (mdoc = mmain_mdoc(p, in)))
                 switch (c) {  
                 case ('f'):  
                         printf("%s\n", optarg);  
                         break;  
                 case ('?'):  
                         if (mmain_isopt(optopt)) {  
                                 printf("ok: %d\n", optopt);  
                                 break;  
                         }  
                         printf("bad: %d\n", optopt);  
                         /* FALLTHROUGH */  
                 default:  
                         mmain_usage(NULL);  
                         mmain_exit(p, 1);  
                         /* NOTREACHED */  
                 }  
   
         if (NULL == (mdoc = mmain_mdoc(p)))  
                 mmain_exit(p, 1);                  mmain_exit(p, 1);
   
         treeprint(mdoc_node(mdoc), mdoc_meta(mdoc));          doprint(mdoc_node(mdoc), 0);
         mmain_exit(p, 0);          mmain_exit(p, 0);
         /* NOTREACHED */          /* NOTREACHED */
 }  }
   
   
   static void
   doprint(const struct mdoc_node *n, int indent)
   {
           const char       *p, *t;
           int               i, j;
           size_t            argc, sz;
           char            **params;
           struct mdoc_argv *argv;
   
           argv = NULL;
           argc = sz = 0;
           params = NULL;
   
           switch (n->type) {
           case (MDOC_ROOT):
                   t = "root";
                   break;
           case (MDOC_BLOCK):
                   t = "block";
                   break;
           case (MDOC_HEAD):
                   t = "block-head";
                   break;
           case (MDOC_BODY):
                   t = "block-body";
                   break;
           case (MDOC_TAIL):
                   t = "block-tail";
                   break;
           case (MDOC_ELEM):
                   t = "elem";
                   break;
           case (MDOC_TEXT):
                   t = "text";
                   break;
           default:
                   abort();
                   /* NOTREACHED */
           }
   
           switch (n->type) {
           case (MDOC_TEXT):
                   p = n->string;
                   break;
           case (MDOC_BODY):
                   p = mdoc_macronames[n->tok];
                   break;
           case (MDOC_HEAD):
                   p = mdoc_macronames[n->tok];
                   break;
           case (MDOC_TAIL):
                   p = mdoc_macronames[n->tok];
                   break;
           case (MDOC_ELEM):
                   p = mdoc_macronames[n->tok];
                   if (n->args) {
                           argv = n->args->argv;
                           argc = n->args->argc;
                   }
                   break;
           case (MDOC_BLOCK):
                   p = mdoc_macronames[n->tok];
                   if (n->args) {
                           argv = n->args->argv;
                           argc = n->args->argc;
                   }
                   break;
           case (MDOC_ROOT):
                   p = "root";
                   break;
           default:
                   abort();
                   /* NOTREACHED */
           }
   
           for (i = 0; i < indent; i++)
                   xprintf("    ");
           xprintf("%s (%s)", p, t);
   
           for (i = 0; i < (int)argc; i++) {
                   xprintf(" -%s", mdoc_argnames[argv[i].arg]);
                   if (argv[i].sz > 0)
                           xprintf(" [");
                   for (j = 0; j < (int)argv[i].sz; j++)
                           xprintf(" [%s]", argv[i].value[j]);
                   if (argv[i].sz > 0)
                           xprintf(" ]");
           }
   
           for (i = 0; i < (int)sz; i++)
                   xprintf(" [%s]", params[i]);
   
           xprintf(" %d:%d\n", n->line, n->pos);
   
           if (n->child)
                   doprint(n->child, indent + 1);
           if (n->next)
                   doprint(n->next, indent);
   }

Legend:
Removed from v.1.2  
changed lines
  Added in v.1.8

CVSweb