[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.91 and 1.92

version 1.91, 2014/03/30 19:47:48 version 1.92, 2014/04/20 16:46:05
Line 33 
Line 33 
 #include "libmandoc.h"  #include "libmandoc.h"
   
 #define MULTI_STEP       5 /* pre-allocate argument values */  #define MULTI_STEP       5 /* pre-allocate argument values */
 #define DELIMSZ          6 /* max possible size of a delimiter */  #define DELIMSZ          6 /* max possible size of a delimiter */
   
 enum    argsflag {  enum    argsflag {
         ARGSFL_NONE = 0,          ARGSFL_NONE = 0,
Line 53  struct mdocarg {
Line 53  struct mdocarg {
 };  };
   
 static  void             argn_free(struct mdoc_arg *, int);  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_multi(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,  static  int              argv_single(struct mdoc *, int,
                                 struct mdoc_argv *, int *, char *);                                  struct mdoc_argv *, int *, char *);
   
 static  const enum argvflag argvflags[MDOC_ARG_MAX] = {  static  const enum argvflag argvflags[MDOC_ARG_MAX] = {
Line 150  static const struct mdocarg mdocargs[MDOC_MAX] = {
Line 150  static const struct mdocarg mdocargs[MDOC_MAX] = {
         { ARGSFL_NONE, NULL }, /* Dt */          { ARGSFL_NONE, NULL }, /* Dt */
         { ARGSFL_NONE, NULL }, /* Os */          { ARGSFL_NONE, NULL }, /* Os */
         { ARGSFL_NONE, NULL }, /* Sh */          { ARGSFL_NONE, NULL }, /* Sh */
         { ARGSFL_NONE, NULL }, /* Ss */          { ARGSFL_NONE, NULL }, /* Ss */
         { ARGSFL_NONE, NULL }, /* Pp */          { ARGSFL_NONE, NULL }, /* Pp */
         { ARGSFL_DELIM, NULL }, /* D1 */          { ARGSFL_DELIM, NULL }, /* D1 */
         { ARGSFL_DELIM, NULL }, /* Dl */          { ARGSFL_DELIM, NULL }, /* Dl */
         { ARGSFL_NONE, args_Bd }, /* Bd */          { ARGSFL_NONE, args_Bd }, /* Bd */
Line 159  static const struct mdocarg mdocargs[MDOC_MAX] = {
Line 159  static const struct mdocarg mdocargs[MDOC_MAX] = {
         { ARGSFL_NONE, args_Bl }, /* Bl */          { ARGSFL_NONE, args_Bl }, /* Bl */
         { ARGSFL_NONE, NULL }, /* El */          { ARGSFL_NONE, NULL }, /* El */
         { ARGSFL_NONE, NULL }, /* It */          { ARGSFL_NONE, NULL }, /* It */
         { ARGSFL_DELIM, NULL }, /* Ad */          { ARGSFL_DELIM, NULL }, /* Ad */
         { ARGSFL_DELIM, args_An }, /* An */          { ARGSFL_DELIM, args_An }, /* An */
         { ARGSFL_DELIM, NULL }, /* Ar */          { ARGSFL_DELIM, NULL }, /* Ar */
         { ARGSFL_DELIM, NULL }, /* Cd */          { ARGSFL_DELIM, NULL }, /* Cd */
         { ARGSFL_DELIM, NULL }, /* Cm */          { ARGSFL_DELIM, NULL }, /* Cm */
         { ARGSFL_DELIM, NULL }, /* Dv */          { ARGSFL_DELIM, NULL }, /* Dv */
         { ARGSFL_DELIM, NULL }, /* Er */          { ARGSFL_DELIM, NULL }, /* Er */
         { ARGSFL_DELIM, NULL }, /* Ev */          { ARGSFL_DELIM, NULL }, /* Ev */
         { ARGSFL_NONE, args_Ex }, /* Ex */          { ARGSFL_NONE, args_Ex }, /* Ex */
         { ARGSFL_DELIM, NULL }, /* Fa */          { ARGSFL_DELIM, NULL }, /* Fa */
         { ARGSFL_NONE, NULL }, /* Fd */          { ARGSFL_NONE, NULL }, /* Fd */
         { ARGSFL_DELIM, NULL }, /* Fl */          { ARGSFL_DELIM, NULL }, /* Fl */
         { ARGSFL_DELIM, NULL }, /* Fn */          { ARGSFL_DELIM, NULL }, /* Fn */
         { ARGSFL_DELIM, NULL }, /* Ft */          { ARGSFL_DELIM, NULL }, /* Ft */
         { ARGSFL_DELIM, NULL }, /* Ic */          { ARGSFL_DELIM, NULL }, /* Ic */
         { ARGSFL_DELIM, NULL }, /* In */          { ARGSFL_DELIM, NULL }, /* In */
         { ARGSFL_DELIM, NULL }, /* Li */          { ARGSFL_DELIM, NULL }, /* Li */
         { ARGSFL_NONE, NULL }, /* Nd */          { ARGSFL_NONE, NULL }, /* Nd */
         { ARGSFL_DELIM, NULL }, /* Nm */          { ARGSFL_DELIM, NULL }, /* Nm */
         { ARGSFL_DELIM, NULL }, /* Op */          { ARGSFL_DELIM, NULL }, /* Op */
         { ARGSFL_NONE, NULL }, /* Ot */          { ARGSFL_NONE, NULL }, /* Ot */
         { ARGSFL_DELIM, NULL }, /* Pa */          { ARGSFL_DELIM, NULL }, /* Pa */
         { ARGSFL_NONE, args_Ex }, /* Rv */          { ARGSFL_NONE, args_Ex }, /* Rv */
         { ARGSFL_DELIM, NULL }, /* St */          { ARGSFL_DELIM, NULL }, /* St */
         { ARGSFL_DELIM, NULL }, /* Va */          { ARGSFL_DELIM, NULL }, /* Va */
         { ARGSFL_DELIM, NULL }, /* Vt */          { ARGSFL_DELIM, NULL }, /* Vt */
         { ARGSFL_DELIM, NULL }, /* Xr */          { ARGSFL_DELIM, NULL }, /* Xr */
         { ARGSFL_NONE, NULL }, /* %A */          { ARGSFL_NONE, NULL }, /* %A */
         { ARGSFL_NONE, NULL }, /* %B */          { ARGSFL_NONE, NULL }, /* %B */
Line 202  static const struct mdocarg mdocargs[MDOC_MAX] = {
Line 202  static const struct mdocarg mdocargs[MDOC_MAX] = {
         { ARGSFL_DELIM, NULL }, /* Aq */          { ARGSFL_DELIM, NULL }, /* Aq */
         { ARGSFL_DELIM, NULL }, /* At */          { ARGSFL_DELIM, NULL }, /* At */
         { ARGSFL_DELIM, NULL }, /* Bc */          { ARGSFL_DELIM, NULL }, /* Bc */
         { ARGSFL_NONE, args_Bf }, /* Bf */          { ARGSFL_NONE, args_Bf }, /* Bf */
         { ARGSFL_NONE, NULL }, /* Bo */          { ARGSFL_NONE, NULL }, /* Bo */
         { ARGSFL_DELIM, NULL }, /* Bq */          { ARGSFL_DELIM, NULL }, /* Bq */
         { ARGSFL_DELIM, NULL }, /* Bsx */          { ARGSFL_DELIM, NULL }, /* Bsx */
Line 213  static const struct mdocarg mdocargs[MDOC_MAX] = {
Line 213  static const struct mdocarg mdocargs[MDOC_MAX] = {
         { ARGSFL_DELIM, NULL }, /* Dq */          { ARGSFL_DELIM, NULL }, /* Dq */
         { ARGSFL_DELIM, NULL }, /* Ec */          { ARGSFL_DELIM, NULL }, /* Ec */
         { ARGSFL_NONE, NULL }, /* Ef */          { ARGSFL_NONE, NULL }, /* Ef */
         { ARGSFL_DELIM, NULL }, /* Em */          { ARGSFL_DELIM, NULL }, /* Em */
         { ARGSFL_NONE, NULL }, /* Eo */          { ARGSFL_NONE, NULL }, /* Eo */
         { ARGSFL_DELIM, NULL }, /* Fx */          { ARGSFL_DELIM, NULL }, /* Fx */
         { ARGSFL_DELIM, NULL }, /* Ms */          { ARGSFL_DELIM, NULL }, /* Ms */
Line 241  static const struct mdocarg mdocargs[MDOC_MAX] = {
Line 241  static const struct mdocarg mdocargs[MDOC_MAX] = {
         { ARGSFL_DELIM, NULL }, /* Ux */          { ARGSFL_DELIM, NULL }, /* Ux */
         { ARGSFL_DELIM, NULL }, /* Xc */          { ARGSFL_DELIM, NULL }, /* Xc */
         { ARGSFL_NONE, NULL }, /* Xo */          { ARGSFL_NONE, NULL }, /* Xo */
         { ARGSFL_NONE, NULL }, /* Fo */          { ARGSFL_NONE, NULL }, /* Fo */
         { ARGSFL_DELIM, NULL }, /* Fc */          { ARGSFL_DELIM, NULL }, /* Fc */
         { ARGSFL_NONE, NULL }, /* Oo */          { ARGSFL_NONE, NULL }, /* Oo */
         { ARGSFL_DELIM, NULL }, /* Oc */          { ARGSFL_DELIM, NULL }, /* Oc */
         { ARGSFL_NONE, args_Bk }, /* Bk */          { ARGSFL_NONE, args_Bk }, /* Bk */
Line 302  mdoc_argv(struct mdoc *mdoc, int line, enum mdoct tok,
Line 302  mdoc_argv(struct mdoc *mdoc, int line, enum mdoct tok,
                 if (' ' == buf[*pos] && '\\' != buf[*pos - 1])                  if (' ' == buf[*pos] && '\\' != buf[*pos - 1])
                         break;                          break;
   
         /*          /*
          * We want to nil-terminate the word to look it up (it's easier           * We want to nil-terminate the word to look it up (it's easier
          * that way).  But we may not have a flag, in which case we need           * that way).  But we may not have a flag, in which case we need
          * to restore the line as-is.  So keep around the stray byte,           * to restore the line as-is.  So keep around the stray byte,
          * which we'll reset upon exiting (if necessary).           * which we'll reset upon exiting (if necessary).
          */           */
   
         if ('\0' != (sv = buf[*pos]))          if ('\0' != (sv = buf[*pos]))
                 buf[(*pos)++] = '\0';                  buf[(*pos)++] = '\0';
   
         /*          /*
Line 328  mdoc_argv(struct mdoc *mdoc, int line, enum mdoct tok,
Line 328  mdoc_argv(struct mdoc *mdoc, int line, enum mdoct tok,
                         break;                          break;
   
         if (MDOC_ARG_MAX == tmp.arg) {          if (MDOC_ARG_MAX == tmp.arg) {
                 /*                  /*
                  * The flag was not found.                   * The flag was not found.
                  * Restore saved zeroed byte and return as a word.                   * Restore saved zeroed byte and return as a word.
                  */                   */
Line 343  mdoc_argv(struct mdoc *mdoc, int line, enum mdoct tok,
Line 343  mdoc_argv(struct mdoc *mdoc, int line, enum mdoct tok,
                 (*pos)++;                  (*pos)++;
   
         switch (argvflags[tmp.arg]) {          switch (argvflags[tmp.arg]) {
         case (ARGV_SINGLE):          case ARGV_SINGLE:
                 if ( ! argv_single(mdoc, line, &tmp, pos, buf))                  if ( ! argv_single(mdoc, line, &tmp, pos, buf))
                         return(ARGV_ERROR);                          return(ARGV_ERROR);
                 break;                  break;
         case (ARGV_MULTI):          case ARGV_MULTI:
                 if ( ! argv_multi(mdoc, line, &tmp, pos, buf))                  if ( ! argv_multi(mdoc, line, &tmp, pos, buf))
                         return(ARGV_ERROR);                          return(ARGV_ERROR);
                 break;                  break;
         case (ARGV_NONE):          case ARGV_NONE:
                 break;                  break;
         }          }
   
Line 359  mdoc_argv(struct mdoc *mdoc, int line, enum mdoct tok,
Line 359  mdoc_argv(struct mdoc *mdoc, int line, enum mdoct tok,
                 arg = *v = mandoc_calloc(1, sizeof(struct mdoc_arg));                  arg = *v = mandoc_calloc(1, sizeof(struct mdoc_arg));
   
         arg->argc++;          arg->argc++;
         arg->argv = mandoc_realloc          arg->argv = mandoc_realloc(arg->argv,
                 (arg->argv, arg->argc * sizeof(struct mdoc_argv));              arg->argc * sizeof(struct mdoc_argv));
   
         memcpy(&arg->argv[(int)arg->argc - 1],          memcpy(&arg->argv[(int)arg->argc - 1], &tmp,
                         &tmp, sizeof(struct mdoc_argv));              sizeof(struct mdoc_argv));
   
         return(ARGV_ARG);          return(ARGV_ARG);
 }  }
Line 399  argn_free(struct mdoc_arg *p, int iarg)
Line 399  argn_free(struct mdoc_arg *p, int iarg)
         arg = &p->argv[iarg];          arg = &p->argv[iarg];
   
         if (arg->sz && arg->value) {          if (arg->sz && arg->value) {
                 for (j = (int)arg->sz - 1; j >= 0; j--)                  for (j = (int)arg->sz - 1; j >= 0; j--)
                         free(arg->value[j]);                          free(arg->value[j]);
                 free(arg->value);                  free(arg->value);
         }          }
Line 416  mdoc_zargs(struct mdoc *mdoc, int line, int *pos, char
Line 416  mdoc_zargs(struct mdoc *mdoc, int line, int *pos, char
 }  }
   
 enum margserr  enum margserr
 mdoc_args(struct mdoc *mdoc, int line, int *pos,  mdoc_args(struct mdoc *mdoc, int line, int *pos,
                 char *buf, enum mdoct tok, char **v)                  char *buf, enum mdoct tok, char **v)
 {  {
         enum argsflag     fl;          enum argsflag     fl;
Line 445  mdoc_args(struct mdoc *mdoc, int line, int *pos, 
Line 445  mdoc_args(struct mdoc *mdoc, int line, int *pos, 
 }  }
   
 static enum margserr  static enum margserr
 args(struct mdoc *mdoc, int line, int *pos,  args(struct mdoc *mdoc, int line, int *pos,
                 char *buf, enum argsflag fl, char **v)                  char *buf, enum argsflag fl, char **v)
 {  {
         char            *p, *pp;          char            *p, *pp;
Line 486  args(struct mdoc *mdoc, int line, int *pos, 
Line 486  args(struct mdoc *mdoc, int line, int *pos, 
                 pp = NULL;                  pp = NULL;
   
                 /* Scan ahead to unescaped `Ta'. */                  /* Scan ahead to unescaped `Ta'. */
                 if ( ! (MDOC_PHRASELIT & mdoc->flags))                  if ( ! (MDOC_PHRASELIT & mdoc->flags))
                         for (pp = *v; ; pp++) {                          for (pp = *v; ; pp++) {
                                 if (NULL == (pp = strstr(pp, "Ta")))                                  if (NULL == (pp = strstr(pp, "Ta")))
                                         break;                                          break;
Line 499  args(struct mdoc *mdoc, int line, int *pos, 
Line 499  args(struct mdoc *mdoc, int line, int *pos, 
                 /* By default, assume a phrase. */                  /* By default, assume a phrase. */
                 rc = ARGS_PHRASE;                  rc = ARGS_PHRASE;
   
                 /*                  /*
                  * Adjust new-buffer position to be beyond delimiter                   * Adjust new-buffer position to be beyond delimiter
                  * mark (e.g., Ta -> end + 2).                   * mark (e.g., Ta -> end + 2).
                  */                   */
Line 600  args(struct mdoc *mdoc, int line, int *pos, 
Line 600  args(struct mdoc *mdoc, int line, int *pos, 
         return(ARGS_WORD);          return(ARGS_WORD);
 }  }
   
 /*  /*
  * Check if the string consists only of space-separated closing   * Check if the string consists only of space-separated closing
  * delimiters.  This is a bit of a dance: the first must be a close   * delimiters.  This is a bit of a dance: the first must be a close
  * delimiter, but it may be followed by middle delimiters.  Arbitrary   * delimiter, but it may be followed by middle delimiters.  Arbitrary
Line 629  args_checkpunct(const char *buf, int i)
Line 629  args_checkpunct(const char *buf, int i)
                 i++;                  i++;
   
         /* Remaining must NOT be open/none. */          /* Remaining must NOT be open/none. */
   
         while (buf[i]) {          while (buf[i]) {
                 j = 0;                  j = 0;
                 while (buf[i] && ' ' != buf[i] && j < DELIMSZ)                  while (buf[i] && ' ' != buf[i] && j < DELIMSZ)
Line 651  args_checkpunct(const char *buf, int i)
Line 651  args_checkpunct(const char *buf, int i)
 }  }
   
 static int  static int
 argv_multi(struct mdoc *mdoc, int line,  argv_multi(struct mdoc *mdoc, int line,
                 struct mdoc_argv *v, int *pos, char *buf)                  struct mdoc_argv *v, int *pos, char *buf)
 {  {
         enum margserr    ac;          enum margserr    ac;
Line 667  argv_multi(struct mdoc *mdoc, int line, 
Line 667  argv_multi(struct mdoc *mdoc, int line, 
                         break;                          break;
   
                 if (0 == v->sz % MULTI_STEP)                  if (0 == v->sz % MULTI_STEP)
                         v->value = mandoc_realloc(v->value,                          v->value = mandoc_realloc(v->value,
                                 (v->sz + MULTI_STEP) * sizeof(char *));                              (v->sz + MULTI_STEP) * sizeof(char *));
   
                 v->value[(int)v->sz] = mandoc_strdup(p);                  v->value[(int)v->sz] = mandoc_strdup(p);
         }          }
Line 677  argv_multi(struct mdoc *mdoc, int line, 
Line 677  argv_multi(struct mdoc *mdoc, int line, 
 }  }
   
 static int  static int
 argv_single(struct mdoc *mdoc, int line,  argv_single(struct mdoc *mdoc, int line,
                 struct mdoc_argv *v, int *pos, char *buf)                  struct mdoc_argv *v, int *pos, char *buf)
 {  {
         enum margserr    ac;          enum margserr    ac;

Legend:
Removed from v.1.91  
changed lines
  Added in v.1.92

CVSweb