[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.19 and 1.20

version 1.19, 2009/07/19 21:26:27 version 1.20, 2009/07/20 14:09:38
Line 376  static int
Line 376  static int
 args(struct mdoc *m, int line, int *pos,  args(struct mdoc *m, int line, int *pos,
                 char *buf, int fl, char **v)                  char *buf, int fl, char **v)
 {  {
         int               i;          int               i, psv;
         char             *p, *pp;          char             *p, *pp;
   
         assert(*pos);          assert(*pos);
Line 421  args(struct mdoc *m, int line, int *pos, 
Line 421  args(struct mdoc *m, int line, int *pos, 
          */           */
   
         if (ARGS_TABSEP & fl) {          if (ARGS_TABSEP & fl) {
                 /* Scan ahead to unescaped tab. */                  psv = *pos;
   
                   /* Scan ahead to tab (can't be escaped). */
                 p = strchr(*v, '\t');                  p = strchr(*v, '\t');
   
                 /* Scan ahead to unescaped `Ta'. */                  /* Scan ahead to unescaped `Ta'. */
Line 434  args(struct mdoc *m, int line, int *pos, 
Line 436  args(struct mdoc *m, int line, int *pos, 
                                 break;                                  break;
                 }                  }
   
                 /* Choose delimiter tab/Ta. */                  if (p && pp) {
                 if (p && pp)                          *pos += pp < p ? 2 : 1;
                         p = (p < pp ? p : pp);                          p = pp < p ? pp : p;
                 else if ( ! p && pp)                  } else if (p && ! pp) {
                           *pos += 1;
                   } else if (pp && ! p) {
                         p = pp;                          p = pp;
                           *pos += 2;
                   } else
                           p = strchr(*v, 0);
   
                 /* Strip delimiter's preceding whitespace. */                  if (0 == *p && ' ' == *(p - 1))
                 /* FIXME: escaped whitespace? */  
                 if (p && p > *v) {  
                         pp = p - 1;  
                         while (pp > *v && ' ' == *pp)  
                                 pp--;  
                         if (pp == *v && ' ' == *pp)  
                                 *pp = 0;  
                         else if (' ' == *pp)  
                                 *(pp + 1) = 0;  
                 }  
   
                 /* ...in- and proceding whitespace. */  
                 if (p && ('\t' != *p)) {  
                         *p++ = 0;  
                         *p++ = 0;  
                 } else if (p)  
                         *p++ = 0;  
   
                 if (p) {  
                         while (' ' == *p)  
                                 p++;  
                         if (0 != *p)  
                                 *(p - 1) = 0;  
                         *pos += (int)(p - *v);  
                 }  
   
                 /* Some warnings, if applicable. */  
                 if (p && 0 == *p)  
                         if ( ! mdoc_pwarn(m, line, *pos, ECOLEMPTY))  
                                 return(ARGS_ERROR);  
                 if (p && 0 == *p && p > *v && ' ' == *(p - 1))  
                         if ( ! mdoc_pwarn(m, line, *pos, ETAILWS))                          if ( ! mdoc_pwarn(m, line, *pos, ETAILWS))
                                 return(ARGS_ERROR);                                  return(ARGS_ERROR);
   
                 /* Non-eoln case returns now. */                  *p = 0;
                 if (p)                  *pos += (int)(p - *v);
                         return(ARGS_PHRASE);  
   
                 /* Configure the eoln case, too. */                  /* Strip delimiter's preceding whitespace. */
                 p = strchr(*v, 0);  
                 assert(p);  
   
                 if (p > *v && ' ' == *(p - 1))                  pp = p - 1;
                         if ( ! mdoc_pwarn(m, line, *pos, ETAILWS))                  while (pp > *v && ' ' == *pp) {
                                 return(ARGS_ERROR);                          if (pp > *v && '\\' == *(pp - 1))
                 *pos += (int)(p - *v);                                  break;
                           pp--;
                   }
                   *(pp + 1) = 0;
   
                   /* Strip delimiter's proceeding whitespace. */
   
                   for (pp = &buf[*pos]; ' ' == *pp; pp++, (*pos)++)
                           /* Skip ahead. */ ;
   
                 return(ARGS_PHRASE);                  return(ARGS_PHRASE);
         }          }

Legend:
Removed from v.1.19  
changed lines
  Added in v.1.20

CVSweb