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

Diff for /mandoc/mdoc_argv.c between version 1.78 and 1.81

version 1.78, 2011/06/18 16:18:04 version 1.81, 2011/09/18 14:14:15
Line 1 
Line 1 
 /*      $Id$ */  /*      $Id$ */
 /*  /*
  * Copyright (c) 2008, 2009, 2010 Kristaps Dzonsons <kristaps@bsd.lv>   * Copyright (c) 2008, 2009, 2010, 2011 Kristaps Dzonsons <kristaps@bsd.lv>
  *   *
  * 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 above   * purpose with or without fee is hereby granted, provided that the above
Line 21 
Line 21 
 #include <sys/types.h>  #include <sys/types.h>
   
 #include <assert.h>  #include <assert.h>
 #include <ctype.h>  
 #include <stdlib.h>  #include <stdlib.h>
 #include <stdio.h>  #include <stdio.h>
 #include <string.h>  #include <string.h>
Line 52  struct mdocarg {
Line 51  struct mdocarg {
         const enum mdocargt *argvs;          const enum mdocargt *argvs;
 };  };
   
   static  void             argn_free(struct mdoc_arg *, int);
 static  enum margserr    args(struct mdoc *, int, int *,  static  enum margserr    args(struct mdoc *, int, int *,
                                 char *, enum argsflag, char **);                                  char *, enum argsflag, char **);
 static  int              args_checkpunct(const char *, int);  static  int              args_checkpunct(const char *, int);
 static  int              argv(struct mdoc *, int,  static  int              argv_multi(struct mdoc *, int,
                                 struct mdoc_argv *, int *, char *);                                  struct mdoc_argv *, int *, char *);
 static  int              argv_single(struct mdoc *, int,  
                                 struct mdoc_argv *, int *, char *);  
 static  int              argv_opt_single(struct mdoc *, int,  static  int              argv_opt_single(struct mdoc *, int,
                                 struct mdoc_argv *, int *, char *);                                  struct mdoc_argv *, int *, char *);
 static  int              argv_multi(struct mdoc *, int,  static  int              argv_single(struct mdoc *, int,
                                 struct mdoc_argv *, int *, char *);                                  struct mdoc_argv *, int *, char *);
 static  void             argn_free(struct mdoc_arg *, int);  
   
 static  const enum argvflag argvflags[MDOC_ARG_MAX] = {  static  const enum argvflag argvflags[MDOC_ARG_MAX] = {
         ARGV_NONE,      /* MDOC_Split */          ARGV_NONE,      /* MDOC_Split */
Line 292  mdoc_argv(struct mdoc *m, int line, enum mdoct tok,
Line 289  mdoc_argv(struct mdoc *m, int line, enum mdoct tok,
                 return(ARGV_EOLN);                  return(ARGV_EOLN);
         else if (NULL == (ap = mdocargs[tok].argvs))          else if (NULL == (ap = mdocargs[tok].argvs))
                 return(ARGV_WORD);                  return(ARGV_WORD);
           else if ('-' != buf[*pos])
                   return(ARGV_WORD);
   
         assert(' ' != buf[*pos]);  
   
         /* Seek to the first unescaped space. */          /* Seek to the first unescaped space. */
   
         p = &buf[++(*pos)];          p = &buf[++(*pos)];
Line 345  mdoc_argv(struct mdoc *m, int line, enum mdoct tok,
Line 342  mdoc_argv(struct mdoc *m, int line, enum mdoct tok,
         while (buf[*pos] && ' ' == buf[*pos])          while (buf[*pos] && ' ' == buf[*pos])
                 (*pos)++;                  (*pos)++;
   
         if ( ! argv(m, line, &tmp, pos, buf))          switch (argvflags[tmp.arg]) {
                 return(ARGV_ERROR);          case (ARGV_SINGLE):
                   if ( ! argv_single(m, line, &tmp, pos, buf))
                           return(ARGV_ERROR);
                   break;
           case (ARGV_MULTI):
                   if ( ! argv_multi(m, line, &tmp, pos, buf))
                           return(ARGV_ERROR);
                   break;
           case (ARGV_OPT_SINGLE):
                   if ( ! argv_opt_single(m, line, &tmp, pos, buf))
                           return(ARGV_ERROR);
                   break;
           case (ARGV_NONE):
                   break;
           }
   
         if (NULL == (arg = *v))          if (NULL == (arg = *v))
                 arg = *v = mandoc_calloc(1, sizeof(struct mdoc_arg));                  arg = *v = mandoc_calloc(1, sizeof(struct mdoc_arg));
Line 680  argv_opt_single(struct mdoc *m, int line, 
Line 691  argv_opt_single(struct mdoc *m, int line, 
         return(1);          return(1);
 }  }
   
 /*  
  * Parse a single, mandatory value from the stream.  
  */  
 static int  static int
 argv_single(struct mdoc *m, int line,  argv_single(struct mdoc *m, int line,
                 struct mdoc_argv *v, int *pos, char *buf)                  struct mdoc_argv *v, int *pos, char *buf)
Line 703  argv_single(struct mdoc *m, int line, 
Line 711  argv_single(struct mdoc *m, int line, 
         v->sz = 1;          v->sz = 1;
         v->value = mandoc_malloc(sizeof(char *));          v->value = mandoc_malloc(sizeof(char *));
         v->value[0] = mandoc_strdup(p);          v->value[0] = mandoc_strdup(p);
   
         return(1);  
 }  
   
 /*  
  * Determine rules for parsing arguments.  Arguments can either accept  
  * no parameters, an optional single parameter, one parameter, or  
  * multiple parameters.  
  */  
 static int  
 argv(struct mdoc *mdoc, int line,  
                 struct mdoc_argv *v, int *pos, char *buf)  
 {  
   
         v->sz = 0;  
         v->value = NULL;  
   
         switch (argvflags[v->arg]) {  
         case (ARGV_SINGLE):  
                 return(argv_single(mdoc, line, v, pos, buf));  
         case (ARGV_MULTI):  
                 return(argv_multi(mdoc, line, v, pos, buf));  
         case (ARGV_OPT_SINGLE):  
                 return(argv_opt_single(mdoc, line, v, pos, buf));  
         case (ARGV_NONE):  
                 break;  
         default:  
                 abort();  
                 /* NOTREACHED */  
         }  
   
         return(1);          return(1);
 }  }

Legend:
Removed from v.1.78  
changed lines
  Added in v.1.81

CVSweb