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

Diff for /mandoc/mdoc_macro.c between version 1.69 and 1.74

version 1.69, 2010/05/26 09:35:35 version 1.74, 2010/05/30 22:56:02
Line 754  blk_exp_close(MACRO_PROT_ARGS)
Line 754  blk_exp_close(MACRO_PROT_ARGS)
 static int  static int
 in_line(MACRO_PROT_ARGS)  in_line(MACRO_PROT_ARGS)
 {  {
         int              la, lastpunct, cnt, nc, nl;          int              la, scope, cnt, nc, nl;
         enum margverr    av;          enum margverr    av;
         enum mdoct       ntok;          enum mdoct       ntok;
         enum margserr    ac;          enum margserr    ac;
Line 805  in_line(MACRO_PROT_ARGS)
Line 805  in_line(MACRO_PROT_ARGS)
                 return(0);                  return(0);
         }          }
   
         for (cnt = 0, lastpunct = 1;; ) {          for (cnt = scope = 0;; ) {
                 la = *pos;                  la = *pos;
                 ac = mdoc_args(m, line, pos, buf, tok, &p);                  ac = mdoc_args(m, line, pos, buf, tok, &p);
   
Line 826  in_line(MACRO_PROT_ARGS)
Line 826  in_line(MACRO_PROT_ARGS)
                  */                   */
   
                 if (MDOC_MAX != ntok) {                  if (MDOC_MAX != ntok) {
                         if (0 == lastpunct && ! rew_elem(m, tok))                          if (scope && ! rew_elem(m, tok))
                                 return(0);                                  return(0);
                         if (nc && 0 == cnt) {                          if (nc && 0 == cnt) {
                                 if ( ! mdoc_elem_alloc(m, line, ppos, tok, arg))                                  if ( ! mdoc_elem_alloc(m, line, ppos, tok, arg))
Line 853  in_line(MACRO_PROT_ARGS)
Line 853  in_line(MACRO_PROT_ARGS)
   
                 d = ARGS_QWORD == ac ? DELIM_NONE : mdoc_isdelim(p);                  d = ARGS_QWORD == ac ? DELIM_NONE : mdoc_isdelim(p);
   
                 if (ARGS_QWORD != ac && DELIM_NONE != d) {                  if (DELIM_NONE != d) {
                         if (0 == lastpunct && ! rew_elem(m, tok))                          /*
                            * If we encounter closing punctuation, no word
                            * has been omitted, no scope is open, and we're
                            * allowed to have an empty element, then start
                            * a new scope.  `Ar', `Fl', and `Li', only do
                            * this once per invocation.  There may be more
                            * of these (all of them?).
                            */
                           if (0 == cnt && (nc || MDOC_Li == tok) &&
                                           DELIM_CLOSE == d && ! scope) {
                                   if ( ! mdoc_elem_alloc(m, line, ppos, tok, arg))
                                           return(0);
                                   if (MDOC_Ar == tok || MDOC_Li == tok ||
                                                   MDOC_Fl == tok)
                                           cnt++;
                                   scope = 1;
                           }
                           /*
                            * Close out our scope, if one is open, before
                            * any punctuation.
                            */
                           if (scope && ! rew_elem(m, tok))
                                 return(0);                                  return(0);
                         lastpunct = 1;                          scope = 0;
                 } else if (lastpunct) {                  } else if ( ! scope) {
                         if ( ! mdoc_elem_alloc(m, line, ppos, tok, arg))                          if ( ! mdoc_elem_alloc(m, line, ppos, tok, arg))
                                 return(0);                                  return(0);
                         lastpunct = 0;                          scope = 1;
                 }                  }
   
                 if (DELIM_NONE == d)                  if (DELIM_NONE == d)
Line 873  in_line(MACRO_PROT_ARGS)
Line 894  in_line(MACRO_PROT_ARGS)
                  * word so that the `-' can be added to each one without                   * word so that the `-' can be added to each one without
                  * having to parse out spaces.                   * having to parse out spaces.
                  */                   */
                 if (0 == lastpunct && MDOC_Fl == tok) {                  if (scope && MDOC_Fl == tok) {
                         if ( ! rew_elem(m, tok))                          if ( ! rew_elem(m, tok))
                                 return(0);                                  return(0);
                         lastpunct = 1;                          scope = 0;
                 }                  }
         }          }
   
         if (0 == lastpunct && ! rew_elem(m, tok))          if (scope && ! rew_elem(m, tok))
                 return(0);                  return(0);
   
         /*          /*
Line 916  blk_full(MACRO_PROT_ARGS)
Line 937  blk_full(MACRO_PROT_ARGS)
 #ifdef  UGLY  #ifdef  UGLY
         struct mdoc_node *n;          struct mdoc_node *n;
 #endif  #endif
           enum mdoc_type    mtt;
         enum mdoct        ntok;          enum mdoct        ntok;
         enum margserr     ac, lac;          enum margserr     ac, lac;
         enum margverr     av;          enum margverr     av;
Line 984  blk_full(MACRO_PROT_ARGS)
Line 1006  blk_full(MACRO_PROT_ARGS)
   
         for ( ; ; ) {          for ( ; ; ) {
                 la = *pos;                  la = *pos;
                 lac = ac;                  /* Initialise last-phrase-type with ARGS_PHRASE. */
                   lac = ARGS_ERROR == ac ? ARGS_PHRASE : ac;
                 ac = mdoc_args(m, line, pos, buf, tok, &p);                  ac = mdoc_args(m, line, pos, buf, tok, &p);
   
                 if (ARGS_ERROR == ac)                  if (ARGS_ERROR == ac)
Line 992  blk_full(MACRO_PROT_ARGS)
Line 1015  blk_full(MACRO_PROT_ARGS)
                 if (ARGS_EOLN == ac)                  if (ARGS_EOLN == ac)
                         break;                          break;
   
                 if (ARGS_PEND == ac) {                  /*
                         if (ARGS_PPHRASE == lac)                   * Emit leading punctuation (i.e., punctuation before
                                 ac = ARGS_PPHRASE;                   * the MDOC_HEAD) for non-phrase types.
                         else                   */
                                 ac = ARGS_PHRASE;  
                 }  
   
                 /* Don't emit leading punct. for phrases. */  
   
                 if (NULL == head &&                  if (NULL == head &&
                                   ARGS_PEND != ac &&
                                 ARGS_PHRASE != ac &&                                  ARGS_PHRASE != ac &&
                                 ARGS_PPHRASE != ac &&                                  ARGS_PPHRASE != ac &&
                                 ARGS_QWORD != ac &&                                  ARGS_QWORD != ac &&
Line 1011  blk_full(MACRO_PROT_ARGS)
Line 1031  blk_full(MACRO_PROT_ARGS)
                         continue;                          continue;
                 }                  }
   
                 /* Always re-open head for phrases. */                  /* Open a head if one hasn't been opened. */
   
                 if (NULL == head ||                  if (NULL == head) {
                                 ARGS_PHRASE == ac ||  
                                 ARGS_PPHRASE == ac) {  
                         if ( ! mdoc_head_alloc(m, line, ppos, tok))                          if ( ! mdoc_head_alloc(m, line, ppos, tok))
                                 return(0);                                  return(0);
                         head = m->last;                          head = m->last;
                 }                  }
   
                 if (ARGS_PHRASE == ac || ARGS_PPHRASE == ac) {                  if (ARGS_PHRASE == ac ||
                                   ARGS_PEND == ac ||
                                   ARGS_PPHRASE == ac) {
                           /*
                            * If we haven't opened a body yet, rewind the
                            * head; if we have, rewind that instead.
                            */
   
                           mtt = body ? MDOC_BODY : MDOC_HEAD;
                           if ( ! rew_sub(mtt, m, tok, line, ppos))
                                   return(0);
   
                           /* Then allocate our body context. */
   
                           if ( ! mdoc_body_alloc(m, line, ppos, tok))
                                   return(0);
                           body = m->last;
   
                           /*
                            * Process phrases: set whether we're in a
                            * partial-phrase (this effects line handling)
                            * then call down into the phrase parser.
                            */
   
                         if (ARGS_PPHRASE == ac)                          if (ARGS_PPHRASE == ac)
                                 m->flags |= MDOC_PPHRASE;                                  m->flags |= MDOC_PPHRASE;
                         if ( ! phrase(m, line, la, buf, ac))                          if (ARGS_PEND == ac && ARGS_PPHRASE == lac)
                                   m->flags |= MDOC_PPHRASE;
   
                           if (ARGS_PEND == ac) {
                                   if ( ! phrase(m, line, la, buf, lac))
                                           return(0);
                           } else if ( ! phrase(m, line, la, buf, ac))
                                 return(0);                                  return(0);
   
                         m->flags &= ~MDOC_PPHRASE;                          m->flags &= ~MDOC_PPHRASE;
                         if ( ! rew_sub(MDOC_HEAD, m, tok, line, ppos))  
                                 return(0);  
                         continue;                          continue;
                 }                  }
   

Legend:
Removed from v.1.69  
changed lines
  Added in v.1.74

CVSweb