[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.212 and 1.215

version 1.212, 2017/02/10 22:19:18 version 1.215, 2017/02/11 15:47:16
Line 50  static int  find_pending(struct roff_man *, int, int, 
Line 50  static int  find_pending(struct roff_man *, int, int, 
                                 struct roff_node *);                                  struct roff_node *);
 static  int             lookup(struct roff_man *, int, int, int, const char *);  static  int             lookup(struct roff_man *, int, int, int, const char *);
 static  int             macro_or_word(MACRO_PROT_ARGS, int);  static  int             macro_or_word(MACRO_PROT_ARGS, int);
   static  void            break_intermediate(struct roff_node *,
                               struct roff_node *);
 static  int             parse_rest(struct roff_man *, int, int, int *, char *);  static  int             parse_rest(struct roff_man *, int, int, int *, char *);
 static  int             rew_alt(int);  static  int             rew_alt(int);
 static  void            rew_elem(struct roff_man *, int);  static  void            rew_elem(struct roff_man *, int);
Line 376  rew_elem(struct roff_man *mdoc, int tok)
Line 378  rew_elem(struct roff_man *mdoc, int tok)
         rew_last(mdoc, n);          rew_last(mdoc, n);
 }  }
   
   static void
   break_intermediate(struct roff_node *n, struct roff_node *breaker)
   {
           while (n != breaker) {
                   if ( ! (n->flags & NODE_VALID))
                           n->flags |= NODE_BROKEN;
                   n = n->parent;
           }
   }
   
 /*  /*
  * If there is an open sub-block of the target requiring   * If there is an open sub-block of the target requiring
  * explicit close-out, postpone closing out the target until   * explicit close-out, postpone closing out the target until
Line 388  find_pending(struct roff_man *mdoc, int tok, int line,
Line 400  find_pending(struct roff_man *mdoc, int tok, int line,
         struct roff_node        *n;          struct roff_node        *n;
         int                      irc;          int                      irc;
   
           if (target->flags & NODE_VALID)
                   return 0;
   
         irc = 0;          irc = 0;
         for (n = mdoc->last; n != NULL && n != target; n = n->parent) {          for (n = mdoc->last; n != NULL && n != target; n = n->parent) {
                 if (n->flags & NODE_ENDED) {                  if (n->flags & NODE_ENDED)
                         if ( ! (n->flags & NODE_VALID))  
                                 n->flags |= NODE_BROKEN;  
                         continue;                          continue;
                 }  
                 if (n->type == ROFFT_BLOCK &&                  if (n->type == ROFFT_BLOCK &&
                     mdoc_macros[n->tok].flags & MDOC_EXPLICIT) {                      mdoc_macros[n->tok].flags & MDOC_EXPLICIT) {
                         irc = 1;                          irc = 1;
                           break_intermediate(mdoc->last, n);
                         n->flags |= NODE_BROKEN;                          n->flags |= NODE_BROKEN;
                         if (target->type == ROFFT_HEAD)                          if (target->type == ROFFT_HEAD)
                                 target->flags |= NODE_ENDED;                                  target->flags |= NODE_ENDED;
Line 568  blk_exp_close(MACRO_PROT_ARGS)
Line 581  blk_exp_close(MACRO_PROT_ARGS)
   
         endbody = itblk = later = NULL;          endbody = itblk = later = NULL;
         for (n = mdoc->last; n; n = n->parent) {          for (n = mdoc->last; n; n = n->parent) {
                 if (n->flags & NODE_ENDED) {                  if (n->flags & NODE_ENDED)
                         if ( ! (n->flags & NODE_VALID))  
                                 n->flags |= NODE_BROKEN;  
                         continue;                          continue;
                 }  
   
                 /*                  /*
                  * Mismatching end macros can never break anything                   * Mismatching end macros can never break anything
Line 599  blk_exp_close(MACRO_PROT_ARGS)
Line 609  blk_exp_close(MACRO_PROT_ARGS)
                 }                  }
   
                 if (atok == n->tok) {                  if (atok == n->tok) {
                         assert(body);  
   
                         /*                          /*
                          * Found the start of our own block.                           * Found the start of our own block.
Line 641  blk_exp_close(MACRO_PROT_ARGS)
Line 650  blk_exp_close(MACRO_PROT_ARGS)
                         break;                          break;
                 }                  }
   
                 /* Explicit blocks close out description lines. */                  /*
                    * Explicit blocks close out description lines, but
                    * even those can get broken together with a child.
                    */
   
                 if (n->tok == MDOC_Nd) {                  if (n->tok == MDOC_Nd) {
                         rew_last(mdoc, n);                          if (later != NULL)
                                   n->flags |= NODE_BROKEN | NODE_ENDED;
                           else
                                   rew_last(mdoc, n);
                         continue;                          continue;
                 }                  }
   
                 /* Breaking an open sub block. */                  /* Breaking an open sub block. */
   
                   break_intermediate(mdoc->last, body);
                 n->flags |= NODE_BROKEN;                  n->flags |= NODE_BROKEN;
                 if (later == NULL)                  if (later == NULL)
                         later = n;                          later = n;
Line 720  blk_exp_close(MACRO_PROT_ARGS)
Line 736  blk_exp_close(MACRO_PROT_ARGS)
                         do                          do
                                 target = target->parent;                                  target = target->parent;
                         while ( ! (target->flags & NODE_ENDED));                          while ( ! (target->flags & NODE_ENDED));
                         if ( ! (target->flags & NODE_VALID))                          pending = find_pending(mdoc, ntok, line, ppos, target);
                                 pending = find_pending(mdoc, ntok,  
                                     line, ppos, target);  
                 }                  }
                 if ( ! pending)                  if ( ! pending)
                         rew_pending(mdoc, n);                          rew_pending(mdoc, n);

Legend:
Removed from v.1.212  
changed lines
  Added in v.1.215

CVSweb