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

Diff for /mandoc/Attic/mdocml.c between version 1.44 and 1.50

version 1.44, 2009/01/15 17:38:57 version 1.50, 2009/01/20 12:51:28
Line 1 
Line 1 
 /* $Id$ */          /* $Id$ */
 /*  /*
  * Copyright (c) 2008 Kristaps Dzonsons <kristaps@kth.se>   * Copyright (c) 2008 Kristaps Dzonsons <kristaps@kth.se>
  *   *
Line 31 
Line 31 
 #include "mdoc.h"  #include "mdoc.h"
   
 #define xfprintf        (void)fprintf  #define xfprintf        (void)fprintf
 #define xprintf         (void)printf  
 #define xvfprintf       (void)fvprintf  
   
 #define MD_LINE_SZ      (256)           /* Max input line size. */  #define MD_LINE_SZ      (256)           /* Max input line size. */
   
   /* TODO: have a struct for each transformer. */
   
   typedef int             (*mdocprint)(const struct mdoc_node *);
   
   
 struct  md_parse {  struct  md_parse {
         int              warn;          /* Warning flags. */          int               warn;         /* Warning flags. */
 #define MD_WARN_SYNTAX  (1 << 0)        /* Show syntax warnings. */  #define MD_WARN_SYNTAX   (1 << 0)       /* Show syntax warnings. */
 #define MD_WARN_COMPAT  (1 << 1)        /* Show compat warnings. */  #define MD_WARN_COMPAT   (1 << 1)       /* Show compat warnings. */
 #define MD_WARN_ALL     (0x03)          /* Show all warnings. */  #define MD_WARN_ALL      (0x03)         /* Show all warnings. */
 #define MD_WARN_ERR     (1 << 2)        /* Make warnings->errors. */  #define MD_WARN_ERR      (1 << 2)       /* Make warnings->errors. */
         int              dbg;           /* Debug level. */          int               dbg;          /* Debug level. */
         struct mdoc     *mdoc;          /* Active parser. */          struct mdoc      *mdoc;         /* Active parser. */
         char            *buf;           /* Input buffer. */          char             *buf;          /* Input buffer. */
         u_long           bufsz;         /* Input buffer size. */          u_long            bufsz;        /* Input buffer size. */
         char            *name;          /* Input file name. */          char             *name;         /* Input file name. */
         int              fd;            /* Input file desc. */          int               fd;           /* Input file desc. */
           mdocprint         print;        /* Node-print function. */
 };  };
   
 extern  char            *__progname;  extern  char             *__progname;
   
 static  void             usage(void);  extern  int               treeprint(const struct mdoc_node *);
   
 static  int              parse_begin(struct md_parse *);  static  void              usage(void);
 static  int              parse_leave(struct md_parse *, int);  
 static  int              io_begin(struct md_parse *);  
 static  int              io_leave(struct md_parse *, int);  
 static  int              buf_begin(struct md_parse *);  
 static  int              buf_leave(struct md_parse *, int);  
   
 static  void             msg_msg(void *, int, int, const char *);  static  int               parse_begin(struct md_parse *);
 static  int              msg_err(void *, int, int, const char *);  static  int               parse_leave(struct md_parse *, int);
 static  int              msg_warn(void *, int, int,  static  int               io_begin(struct md_parse *);
   static  int               io_leave(struct md_parse *, int);
   static  int               buf_begin(struct md_parse *);
   static  int               buf_leave(struct md_parse *, int);
   
   static  void              msg_msg(void *, int, int, const char *);
   static  int               msg_err(void *, int, int, const char *);
   static  int               msg_warn(void *, int, int,
                                 enum mdoc_warn, const char *);                                  enum mdoc_warn, const char *);
   
 #ifdef __linux__  #ifdef __linux__
 extern  int              getsubopt(char **, char *const *, char **);  extern  int               getsubopt(char **, char *const *, char **);
 #endif  #endif
   
 int  int
Line 75  main(int argc, char *argv[])
Line 81  main(int argc, char *argv[])
 {  {
         int              c;          int              c;
         struct md_parse  parser;          struct md_parse  parser;
         char            *opts, *v;          char            *opts, *v, *filter;
 #define ALL              0  #define ALL              0
 #define COMPAT           1  #define COMPAT           1
 #define SYNTAX           2  #define SYNTAX           2
Line 86  main(int argc, char *argv[])
Line 92  main(int argc, char *argv[])
         extern char     *optarg;          extern char     *optarg;
         extern int       optind;          extern int       optind;
   
           filter = NULL;
   
         (void)memset(&parser, 0, sizeof(struct md_parse));          (void)memset(&parser, 0, sizeof(struct md_parse));
   
         while (-1 != (c = getopt(argc, argv, "vW:")))          while (-1 != (c = getopt(argc, argv, "f:vW:")))
                 switch (c) {                  switch (c) {
                   case ('f'):
                           filter = optarg;
                           break;
                 case ('v'):                  case ('v'):
                         parser.dbg++;                          parser.dbg++;
                         break;                          break;
Line 126  main(int argc, char *argv[])
Line 137  main(int argc, char *argv[])
         if (1 == argc)          if (1 == argc)
                 parser.name = *argv++;                  parser.name = *argv++;
   
           if (filter) {
                   if (0 == strcmp(filter, "tree"))
                           parser.print = treeprint;
           }
   
         if ( ! io_begin(&parser))          if ( ! io_begin(&parser))
                 return(EXIT_FAILURE);                  return(EXIT_FAILURE);
   
Line 194  buf_begin(struct md_parse *p)
Line 210  buf_begin(struct md_parse *p)
 }  }
   
   
 static void  
 print_node(const struct mdoc_node *n, int indent)  
 {  
         const char       *p, *t;  
         int               i, j;  
         size_t            argc, sz;  
         char            **params;  
         struct mdoc_arg  *argv;  
   
         argv = NULL;  
         argc = sz = 0;  
         params = NULL;  
   
         t = mdoc_type2a(n->type);  
   
         switch (n->type) {  
         case (MDOC_TEXT):  
                 p = n->data.text.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];  
                 argv = n->data.elem.argv;  
                 argc = n->data.elem.argc;  
                 break;  
         case (MDOC_BLOCK):  
                 p = mdoc_macronames[n->tok];  
                 argv = n->data.block.argv;  
                 argc = n->data.block.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)  
                 print_node(n->child, indent + 1);  
         if (n->next)  
                 print_node(n->next, indent);  
 }  
   
   
 static int  static int
 parse_leave(struct md_parse *p, int code)  parse_leave(struct md_parse *p, int code)
 {  {
Line 276  parse_leave(struct md_parse *p, int code)
Line 220  parse_leave(struct md_parse *p, int code)
   
         if ( ! mdoc_endparse(p->mdoc))          if ( ! mdoc_endparse(p->mdoc))
                 code = 0;                  code = 0;
         if ((n = mdoc_result(p->mdoc)))          if (p->print && (n = mdoc_node(p->mdoc)))
                 print_node(n, 0);                  (*p->print)(n);
   
         mdoc_free(p->mdoc);          mdoc_free(p->mdoc);
   
Line 339  msg_err(void *arg, int line, int col, const char *msg)
Line 283  msg_err(void *arg, int line, int col, const char *msg)
   
         p = (struct md_parse *)arg;          p = (struct md_parse *)arg;
   
         xfprintf(stderr, "%s:%d: error: %s (column %d)",          xfprintf(stderr, "%s:%d: error: %s (column %d)\n",
                         p->name, line, msg, col);                          p->name, line, msg, col);
         return(0);          return(0);
 }  }
Line 355  msg_msg(void *arg, int line, int col, const char *msg)
Line 299  msg_msg(void *arg, int line, int col, const char *msg)
         if (0 == p->dbg)          if (0 == p->dbg)
                 return;                  return;
   
         xfprintf(stderr, "%s:%d: debug: %s (column %d)",          xfprintf(stderr, "%s:%d: debug: %s (column %d)\n",
                         p->name, line, msg, col);                          p->name, line, msg, col);
 }  }
   
Line 395  static void
Line 339  static void
 usage(void)  usage(void)
 {  {
   
         xfprintf(stderr, "usage: %s [-v] [-Wwarn...] [infile]\n",          xfprintf(stderr, "usage: %s [-v] [-Wwarn...] [-ffilter] "
                         __progname);                          "[infile]\n", __progname);
 }  }
   

Legend:
Removed from v.1.44  
changed lines
  Added in v.1.50

CVSweb