[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.210 and 1.217

version 1.210, 2017/01/10 13:47:00 version 1.217, 2017/02/16 09:47:31
Line 1 
Line 1 
 /*      $Id$ */  /*      $Id$ */
 /*  /*
  * Copyright (c) 2008-2012 Kristaps Dzonsons <kristaps@bsd.lv>   * Copyright (c) 2008-2012 Kristaps Dzonsons <kristaps@bsd.lv>
  * Copyright (c) 2010, 2012-2016 Ingo Schwarze <schwarze@openbsd.org>   * Copyright (c) 2010, 2012-2017 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 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)
   {
           if (n != breaker &&
               n->type != ROFFT_BLOCK && n->type != ROFFT_HEAD &&
               (n->type != ROFFT_BODY || n->end != ENDBODY_NOT))
                   n = n->parent;
           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 404  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;
                         n->flags = NODE_BROKEN;                          break_intermediate(mdoc->last, target);
                         if (target->type == ROFFT_HEAD)                          if (target->type == ROFFT_HEAD)
                                 target->flags = NODE_ENDED;                                  target->flags |= NODE_ENDED;
                         else if ( ! (target->flags & NODE_ENDED)) {                          else if ( ! (target->flags & NODE_ENDED)) {
                                 mandoc_vmsg(MANDOCERR_BLK_NEST,                                  mandoc_vmsg(MANDOCERR_BLK_NEST,
                                     mdoc->parse, line, ppos,                                      mdoc->parse, line, ppos,
                                     "%s breaks %s", mdoc_macronames[tok],                                      "%s breaks %s", mdoc_macronames[tok],
                                     mdoc_macronames[n->tok]);                                      mdoc_macronames[n->tok]);
                                 mdoc_endbody_alloc(mdoc, line, ppos,                                  mdoc_endbody_alloc(mdoc, line, ppos,
                                     tok, target, ENDBODY_NOSPACE);                                      tok, target);
                         }                          }
                 }                  }
         }          }
Line 568  blk_exp_close(MACRO_PROT_ARGS)
Line 584  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
                  * SYNOPSIS name blocks can never be broken,  
                  * and we only care about the breaking of BLOCKs.                   * and we only care about the breaking of BLOCKs.
                  */                   */
   
                 if (body == NULL ||                  if (body == NULL || n->type != ROFFT_BLOCK)
                     n->tok == MDOC_Nm ||  
                     n->type != ROFFT_BLOCK)  
                         continue;                          continue;
   
                   /*
                    * SYNOPSIS name blocks can not be broken themselves,
                    * but they do get broken together with a broken child.
                    */
   
                   if (n->tok == MDOC_Nm) {
                           if (later != NULL)
                                   n->flags |= NODE_BROKEN | NODE_ENDED;
                           continue;
                   }
   
                 if (n->tok == MDOC_It) {                  if (n->tok == MDOC_It) {
                         itblk = n;                          itblk = n;
                         continue;                          continue;
                 }                  }
   
                 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 617  blk_exp_close(MACRO_PROT_ARGS)
Line 637  blk_exp_close(MACRO_PROT_ARGS)
                             mdoc_macronames[later->tok]);                              mdoc_macronames[later->tok]);
   
                         endbody = mdoc_endbody_alloc(mdoc, line, ppos,                          endbody = mdoc_endbody_alloc(mdoc, line, ppos,
                             atok, body, ENDBODY_SPACE);                              atok, body);
   
                         if (tok == MDOC_El)                          if (tok == MDOC_El)
                                 itblk->flags |= NODE_ENDED | NODE_BROKEN;                                  itblk->flags |= NODE_ENDED | NODE_BROKEN;
Line 633  blk_exp_close(MACRO_PROT_ARGS)
Line 653  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 706  blk_exp_close(MACRO_PROT_ARGS)
Line 733  blk_exp_close(MACRO_PROT_ARGS)
         }          }
   
         if (n != NULL) {          if (n != NULL) {
                   pending = 0;
                 if (ntok != TOKEN_NONE && n->flags & NODE_BROKEN) {                  if (ntok != TOKEN_NONE && n->flags & NODE_BROKEN) {
                         target = n;                          target = n;
                         do                          do
                                 target = target->parent;                                  target = target->parent;
                         while ( ! (target->flags & NODE_ENDED));                          while ( ! (target->flags & NODE_ENDED));
                         pending = find_pending(mdoc, ntok, line, ppos,                          pending = find_pending(mdoc, ntok, line, ppos, target);
                             target);                  }
                 } else  
                         pending = 0;  
                 if ( ! pending)                  if ( ! pending)
                         rew_pending(mdoc, n);                          rew_pending(mdoc, n);
         }          }
Line 987  blk_full(MACRO_PROT_ARGS)
Line 1013  blk_full(MACRO_PROT_ARGS)
   
                         /* Close out prior implicit scopes. */                          /* Close out prior implicit scopes. */
   
                         rew_last(mdoc, n);                          rew_pending(mdoc, n);
                 }                  }
   
                 /* Skip items outside lists. */                  /* Skip items outside lists. */

Legend:
Removed from v.1.210  
changed lines
  Added in v.1.217

CVSweb