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

Diff for /mandoc/Attic/mmain.c between version 1.10 and 1.14

version 1.10, 2009/03/09 13:04:01 version 1.14, 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 42  struct mmain {
Line 42  struct mmain {
         struct mdoc      *mdoc;         /* Active parser. */          struct mdoc      *mdoc;         /* Active parser. */
         char             *buf;          /* Input buffer. */          char             *buf;          /* Input buffer. */
         size_t            bufsz;        /* Input buffer size. */          size_t            bufsz;        /* Input buffer size. */
         char             *in;           /* Input file name. */          const char       *in;           /* Input file name. */
         int               fdin;         /* Input file desc. */          int               fdin;         /* Input file desc. */
         int               pflags;       /* Parse flags. */          int               pflags;       /* Parse flags. */
 };  };
   
 extern  char             *__progname;  extern  char             *__progname;
   
   static  void              usage(const char *, const char *);
 static  int               optswarn(struct mmain *, char *);  static  int               optswarn(struct mmain *, char *);
 static  int               optsopt(struct mmain *, char *);  static  int               optsopt(struct mmain *, char *);
 static  int               parse(struct mmain *);  static  int               parse(struct mmain *);
Line 57  static int    msg_err(void *, int, int, const char *);
Line 58  static int    msg_err(void *, int, int, const char *);
 static  int               msg_warn(void *, int, int,  static  int               msg_warn(void *, int, int,
                                 enum mdoc_warn, const char *);                                  enum mdoc_warn, const char *);
   
 #ifdef __linux__  
 extern  int               getsubopt(char **, char *const *, char **);  
 extern  size_t            strlcpy(char *, const char *, size_t);  
 extern  size_t            strlcat(char *, const char *, size_t);  
 #endif  
   
   
 /*  /*
  * Print our and our caller's usage message.   * Print our and our caller's usage message.
  */   */
 void  void
 mmain_usage(const char *help)  usage(const char *help, const char *args)
 {  {
   
         warnx("usage: %s %s%s[-v] [-foption...] [-Wwarn...] [infile]", __progname,          warnx("usage: %s %s%s[-v] [-foption...] [-Wwarn...]%s%s",
                         help ? help : "", help ? " " : "");                          __progname,
                           help ? help : "", help ? " " : "",
                           args ? " " : "", args ? args : "");
 }  }
   
   
Line 87  mmain_alloc(void)
Line 83  mmain_alloc(void)
         if (NULL == (p = calloc(1, sizeof(struct mmain))))          if (NULL == (p = calloc(1, sizeof(struct mmain))))
                 err(1, "malloc");                  err(1, "malloc");
   
         p->in = "-";  
         p->fdin = STDIN_FILENO;  
   
         return(p);          return(p);
 }  }
   
Line 102  mmain_alloc(void)
Line 95  mmain_alloc(void)
  */   */
 int  int
 mmain_getopt(struct mmain *p, int argc, char *argv[],  mmain_getopt(struct mmain *p, int argc, char *argv[],
                 const char *help, const char *u, void *arg,                  const char *help, const char *args,
                 int (*getopt_cb)(void *, int, const char *))                  const char *u, void *arg,
                   int (*getopt_cb)(void *, int, char *))
 {  {
         int              c;          int              c;
         char             opts[32]; /* XXX */          char             opts[32]; /* XXX */
Line 126  mmain_getopt(struct mmain *p, int argc, char *argv[], 
Line 120  mmain_getopt(struct mmain *p, int argc, char *argv[], 
                 switch (c) {                  switch (c) {
                 case ('f'):                  case ('f'):
                         if ( ! optsopt(p, optarg))                          if ( ! optsopt(p, optarg))
                                 return(-1);                                  mmain_exit(p, 1);
                         break;                          break;
                 case ('v'):                  case ('v'):
                         p->dbg++;                          p->dbg++;
                         break;                          break;
                 case ('V'):                  case ('V'):
                         (void)printf("%s %s\n", __progname, VERSION);                          (void)printf("%s %s\n", __progname, VERSION);
                         return(0);                          mmain_exit(p, 0);
                           /* NOTREACHED */
                 case ('W'):                  case ('W'):
                         if ( ! optswarn(p, optarg))                          if ( ! optswarn(p, optarg))
                                 return(-1);                                  mmain_exit(p, 1);
                         break;                          break;
                 case ('?'):                  case ('?'):
                         mmain_usage(help);                          usage(help, args);
                         return(-1);                          mmain_exit(p, 1);
                           /* NOTREACHED */
                 default:                  default:
                         assert(getopt_cb);                          assert(getopt_cb);
                         if ((*getopt_cb)(arg, c, optarg))                          if ((*getopt_cb)(arg, c, optarg))
                                 break;                                  break;
                         return(-1);                          mmain_exit(p, 1);
                           /* NOTREACHED */
                 }                  }
   
         argv += optind;          return(optind);
         if ((argc -= optind) > 0)  }
                 p->in = *argv++;  
   
         return(1);  
   void
   mmain_reset(struct mmain *p)
   {
   
           if (p->mdoc)
                   mdoc_free(p->mdoc);
           p->mdoc = NULL;
 }  }
   
   
 dead_pre void  void
 mmain_exit(struct mmain *p, int code)  mmain_free(struct mmain *p)
 {  {
   
         if (p->mdoc)          if (p->mdoc)
                 mdoc_free(p->mdoc);                  mdoc_free(p->mdoc);
         free(p);          free(p);
   }
   
   
   __dead void
   mmain_exit(struct mmain *p, int code)
   {
   
           mmain_free(p);
         exit(code);          exit(code);
 }  }
   
   
 struct mdoc *  void
 mmain_mdoc(struct mmain *p)  mmain_prepare(struct mmain *p, const char *in)
 {  {
         struct stat      st;          struct stat      st;
         int              c;  
         struct mdoc_cb   cb;  
   
         cb.mdoc_err = msg_err;          p->in = in;
         cb.mdoc_warn = msg_warn;          p->fdin = STDIN_FILENO;
         cb.mdoc_msg = msg_msg;  
   
         if (0 != strcmp(p->in, "-"))          if (0 != strcmp(p->in, "-"))
                 if (-1 == (p->fdin = open(p->in, O_RDONLY, 0))) {                  if (-1 == (p->fdin = open(p->in, O_RDONLY, 0))) {
                         warn("%s", p->in);                          warn("%s", p->in);
                         return(0);                          mmain_exit(p, 1);
                 }                  }
   
         /* Allocate a buffer to be BUFSIZ/block size. */          /* Allocate a buffer to be BUFSIZ/block size. */
Line 195  mmain_mdoc(struct mmain *p)
Line 203  mmain_mdoc(struct mmain *p)
         p->buf = malloc(p->bufsz);          p->buf = malloc(p->bufsz);
         if (NULL == p->buf)          if (NULL == p->buf)
                 err(1, "malloc");                  err(1, "malloc");
   }
   
   
   struct mdoc *
   mmain_process(struct mmain *p)
   {
           int              c;
           struct mdoc_cb   cb;
   
           /* XXX - in mmain_alloc.*/
           cb.mdoc_err = msg_err;
           cb.mdoc_warn = msg_warn;
           cb.mdoc_msg = msg_msg;
   
         /* Allocate the parser. */          /* Allocate the parser. */
   
         p->mdoc = mdoc_alloc(p, p->pflags, &cb);          p->mdoc = mdoc_alloc(p, p->pflags, &cb);
Line 213  mmain_mdoc(struct mmain *p)
Line 234  mmain_mdoc(struct mmain *p)
 }  }
   
   
   struct mdoc *
   mmain_mdoc(struct mmain *p, const char *in)
   {
   
           mmain_prepare(p, in);
           return(mmain_process(p));
   }
   
   
 static int  static int
 optsopt(struct mmain *p, char *arg)  optsopt(struct mmain *p, char *arg)
 {  {
Line 312  parse(struct mmain *p)
Line 342  parse(struct mmain *p)
                         }                          }
   
                         ln[pos] = 0;                          ln[pos] = 0;
                         if ( ! mdoc_parseln(p->mdoc, lnn, ln))                          if ( ! mdoc_parseln(p->mdoc, lnn, ln)) {
                                   free(ln);
                                 return(0);                                  return(0);
                           }
                         lnn++;                          lnn++;
                         pos = 0;                          pos = 0;
                 }                  }
         }          }
   
         if (pos > 0)  
                 warnx("%s: file not eof-terminated", p->in);  
   
         if (ln)          if (ln)
                 free(ln);                  free(ln);
           if (pos > 0)
                   warnx("%s: file not eof-terminated", p->in);
         return(mdoc_endparse(p->mdoc));          return(mdoc_endparse(p->mdoc));
 }  }
   

Legend:
Removed from v.1.10  
changed lines
  Added in v.1.14

CVSweb