[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.111 and 1.120

version 1.111, 2017/04/24 23:06:18 version 1.120, 2019/07/11 17:06:17
Line 1 
Line 1 
 /*      $Id$ */  /*      $Id$ */
 /*  /*
  * Copyright (c) 2008, 2009, 2010, 2011 Kristaps Dzonsons <kristaps@bsd.lv>   * Copyright (c) 2008, 2009, 2010, 2011 Kristaps Dzonsons <kristaps@bsd.lv>
  * Copyright (c) 2012, 2014-2017 Ingo Schwarze <schwarze@openbsd.org>   * Copyright (c) 2012, 2014-2019 Ingo Schwarze <schwarze@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 above   * purpose with or without fee is hereby granted, provided that the above
Line 144  static const enum mdocargt args_Bl[] = {
Line 144  static const enum mdocargt args_Bl[] = {
         MDOC_ARG_MAX          MDOC_ARG_MAX
 };  };
   
 static  const struct mdocarg __mdocargs[MDOC_MAX - MDOC_Dd] = {  static  const struct mdocarg mdocargs[MDOC_MAX - MDOC_Dd] = {
         { ARGSFL_NONE, NULL }, /* Dd */          { ARGSFL_NONE, NULL }, /* Dd */
         { ARGSFL_NONE, NULL }, /* Dt */          { ARGSFL_NONE, NULL }, /* Dt */
         { ARGSFL_NONE, NULL }, /* Os */          { ARGSFL_NONE, NULL }, /* Os */
Line 263  static const struct mdocarg __mdocargs[MDOC_MAX - MDOC
Line 263  static const struct mdocarg __mdocargs[MDOC_MAX - MDOC
         { ARGSFL_DELIM, NULL }, /* En */          { ARGSFL_DELIM, NULL }, /* En */
         { ARGSFL_DELIM, NULL }, /* Dx */          { ARGSFL_DELIM, NULL }, /* Dx */
         { ARGSFL_NONE, NULL }, /* %Q */          { ARGSFL_NONE, NULL }, /* %Q */
         { ARGSFL_NONE, NULL }, /* br */  
         { ARGSFL_NONE, NULL }, /* sp */  
         { ARGSFL_NONE, NULL }, /* %U */          { ARGSFL_NONE, NULL }, /* %U */
         { ARGSFL_NONE, NULL }, /* Ta */          { ARGSFL_NONE, NULL }, /* Ta */
         { ARGSFL_NONE, NULL }, /* ll */  
 };  };
 static  const struct mdocarg *const mdocargs = __mdocargs - MDOC_Dd;  
   
   
 /*  /*
Line 293  mdoc_argv(struct roff_man *mdoc, int line, enum roff_t
Line 289  mdoc_argv(struct roff_man *mdoc, int line, enum roff_t
         /* Which flags does this macro support? */          /* Which flags does this macro support? */
   
         assert(tok >= MDOC_Dd && tok < MDOC_MAX);          assert(tok >= MDOC_Dd && tok < MDOC_MAX);
         argtable = mdocargs[tok].argvs;          argtable = mdocargs[tok - MDOC_Dd].argvs;
         if (argtable == NULL)          if (argtable == NULL)
                 return;                  return;
   
Line 371  mdoc_argv(struct roff_man *mdoc, int line, enum roff_t
Line 367  mdoc_argv(struct roff_man *mdoc, int line, enum roff_t
                 /* Prepare for parsing the next flag. */                  /* Prepare for parsing the next flag. */
   
                 *pos = ipos;                  *pos = ipos;
                 argtable = mdocargs[tok].argvs;                  argtable = mdocargs[tok - MDOC_Dd].argvs;
         }          }
 }  }
   
Line 420  mdoc_args(struct roff_man *mdoc, int line, int *pos,
Line 416  mdoc_args(struct roff_man *mdoc, int line, int *pos,
         char *buf, enum roff_tok tok, char **v)          char *buf, enum roff_tok tok, char **v)
 {  {
         struct roff_node *n;          struct roff_node *n;
         char             *v_local;  
         enum argsflag     fl;          enum argsflag     fl;
   
         if (v == NULL)          fl = tok == TOKEN_NONE ? ARGSFL_NONE : mdocargs[tok - MDOC_Dd].flags;
                 v = &v_local;  
         fl = tok == TOKEN_NONE ? ARGSFL_NONE : mdocargs[tok].flags;  
   
         /*          /*
          * We know that we're in an `It', so it's reasonable to expect           * We know that we're in an `It', so it's reasonable to expect
Line 452  args(struct roff_man *mdoc, int line, int *pos,
Line 445  args(struct roff_man *mdoc, int line, int *pos,
                 char *buf, enum argsflag fl, char **v)                  char *buf, enum argsflag fl, char **v)
 {  {
         char            *p;          char            *p;
           char            *v_local;
         int              pairs;          int              pairs;
   
         if (buf[*pos] == '\0') {          if (buf[*pos] == '\0') {
                 if (mdoc->flags & MDOC_PHRASELIT &&                  if (mdoc->flags & MDOC_PHRASELIT &&
                     ! (mdoc->flags & MDOC_PHRASE)) {                      ! (mdoc->flags & MDOC_PHRASE)) {
                         mandoc_msg(MANDOCERR_ARG_QUOTE,                          mandoc_msg(MANDOCERR_ARG_QUOTE, line, *pos, NULL);
                             mdoc->parse, line, *pos, NULL);  
                         mdoc->flags &= ~MDOC_PHRASELIT;                          mdoc->flags &= ~MDOC_PHRASELIT;
                 }                  }
                   mdoc->flags &= ~MDOC_PHRASEQL;
                 return ARGS_EOLN;                  return ARGS_EOLN;
         }          }
   
           if (v == NULL)
                   v = &v_local;
         *v = buf + *pos;          *v = buf + *pos;
   
         if (fl == ARGSFL_DELIM && args_checkpunct(buf, *pos))          if (fl == ARGSFL_DELIM && args_checkpunct(buf, *pos))
Line 509  args(struct roff_man *mdoc, int line, int *pos,
Line 505  args(struct roff_man *mdoc, int line, int *pos,
                         p = strchr(*v, '\0');                          p = strchr(*v, '\0');
                         if (p[-1] == ' ')                          if (p[-1] == ' ')
                                 mandoc_msg(MANDOCERR_SPACE_EOL,                                  mandoc_msg(MANDOCERR_SPACE_EOL,
                                     mdoc->parse, line, *pos, NULL);                                      line, *pos, NULL);
                         *pos += (int)(p - *v);                          *pos += (int)(p - *v);
                 }                  }
   
Line 530  args(struct roff_man *mdoc, int line, int *pos,
Line 526  args(struct roff_man *mdoc, int line, int *pos,
          * Whitespace is NOT involved in literal termination.           * Whitespace is NOT involved in literal termination.
          */           */
   
         if (mdoc->flags & MDOC_PHRASELIT || buf[*pos] == '\"') {          if (mdoc->flags & MDOC_PHRASELIT ||
                 if ( ! (mdoc->flags & MDOC_PHRASELIT))              (mdoc->flags & MDOC_PHRASE && buf[*pos] == '\"')) {
                   if ((mdoc->flags & MDOC_PHRASELIT) == 0) {
                         *v = &buf[++(*pos)];                          *v = &buf[++(*pos)];
   
                 if (mdoc->flags & MDOC_PHRASE)  
                         mdoc->flags |= MDOC_PHRASELIT;                          mdoc->flags |= MDOC_PHRASELIT;
                   }
                 pairs = 0;                  pairs = 0;
                 for ( ; buf[*pos]; (*pos)++) {                  for ( ; buf[*pos]; (*pos)++) {
                         /* Move following text left after quoted quotes. */                          /* Move following text left after quoted quotes. */
Line 557  args(struct roff_man *mdoc, int line, int *pos,
Line 552  args(struct roff_man *mdoc, int line, int *pos,
                 if (buf[*pos] == '\0') {                  if (buf[*pos] == '\0') {
                         if ( ! (mdoc->flags & MDOC_PHRASE))                          if ( ! (mdoc->flags & MDOC_PHRASE))
                                 mandoc_msg(MANDOCERR_ARG_QUOTE,                                  mandoc_msg(MANDOCERR_ARG_QUOTE,
                                     mdoc->parse, line, *pos, NULL);                                      line, *pos, NULL);
                         return ARGS_QWORD;                          return ARGS_WORD;
                 }                  }
   
                 mdoc->flags &= ~MDOC_PHRASELIT;                  mdoc->flags &= ~MDOC_PHRASELIT;
                 buf[(*pos)++] = '\0';                  buf[(*pos)++] = '\0';
   
                 if ('\0' == buf[*pos])                  if ('\0' == buf[*pos])
                         return ARGS_QWORD;                          return ARGS_WORD;
   
                 while (' ' == buf[*pos])                  while (' ' == buf[*pos])
                         (*pos)++;                          (*pos)++;
   
                 if ('\0' == buf[*pos])                  if ('\0' == buf[*pos])
                         mandoc_msg(MANDOCERR_SPACE_EOL, mdoc->parse,                          mandoc_msg(MANDOCERR_SPACE_EOL, line, *pos, NULL);
                             line, *pos, NULL);  
   
                 return ARGS_QWORD;                  return ARGS_WORD;
         }          }
   
         p = &buf[*pos];          p = &buf[*pos];
         *v = mandoc_getarg(mdoc->parse, &p, line, pos);          *v = roff_getarg(mdoc->roff, &p, line, pos);
           if (v == &v_local)
                   free(*v);
   
         /*          /*
          * After parsing the last word in this phrase,           * After parsing the last word in this phrase,
Line 589  args(struct roff_man *mdoc, int line, int *pos,
Line 585  args(struct roff_man *mdoc, int line, int *pos,
                 mdoc->flags &= ~MDOC_PHRASEQL;                  mdoc->flags &= ~MDOC_PHRASEQL;
                 mdoc->flags |= MDOC_PHRASEQF;                  mdoc->flags |= MDOC_PHRASEQF;
         }          }
         return ARGS_WORD;          return ARGS_ALLOC;
 }  }
   
 /*  /*
Line 660  argv_multi(struct roff_man *mdoc, int line,
Line 656  argv_multi(struct roff_man *mdoc, int line,
                         v->value = mandoc_reallocarray(v->value,                          v->value = mandoc_reallocarray(v->value,
                             v->sz + MULTI_STEP, sizeof(char *));                              v->sz + MULTI_STEP, sizeof(char *));
   
                 v->value[(int)v->sz] = mandoc_strdup(p);                  if (ac != ARGS_ALLOC)
                           p = mandoc_strdup(p);
                   v->value[(int)v->sz] = p;
         }          }
 }  }
   
Line 675  argv_single(struct roff_man *mdoc, int line,
Line 673  argv_single(struct roff_man *mdoc, int line,
         if (ac == ARGS_EOLN)          if (ac == ARGS_EOLN)
                 return;                  return;
   
           if (ac != ARGS_ALLOC)
                   p = mandoc_strdup(p);
   
         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] = p;
 }  }

Legend:
Removed from v.1.111  
changed lines
  Added in v.1.120

CVSweb