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

Diff for /mandoc/main.c between version 1.7 and 1.8

version 1.7, 2009/03/20 21:58:38 version 1.8, 2009/03/22 19:01:11
Line 264  fdesc(struct buf *blk, struct buf *ln,
Line 264  fdesc(struct buf *blk, struct buf *ln,
         ssize_t          ssz;          ssize_t          ssz;
         struct stat      st;          struct stat      st;
         int              j, i, pos, lnn;          int              j, i, pos, lnn;
   #ifdef  STRIP_XO
           int              macro, xo, xeoln;
   #endif
   
         /*          /*
          * Two buffers: ln and buf.  buf is the input buffer, optimised           * Two buffers: ln and buf.  buf is the input buffer, optimised
Line 288  fdesc(struct buf *blk, struct buf *ln,
Line 291  fdesc(struct buf *blk, struct buf *ln,
         /*          /*
          * Fill buf with file blocksize and parse newlines into ln.           * Fill buf with file blocksize and parse newlines into ln.
          */           */
   #ifdef  STRIP_XO
           macro = xo = xeoln = 0;
   #endif
   
         for (lnn = 1, pos = 0; ; ) {          for (lnn = 1, pos = 0; ; ) {
                 if (-1 == (ssz = read(fd, blk->buf, sz))) {                  if (-1 == (ssz = read(fd, blk->buf, sz))) {
Line 305  fdesc(struct buf *blk, struct buf *ln,
Line 311  fdesc(struct buf *blk, struct buf *ln,
                         }                          }
   
                         if ('\n' != blk->buf[i]) {                          if ('\n' != blk->buf[i]) {
                                   /*
                                    * Ugly of uglies.  Here we handle the
                                    * dreaded `Xo/Xc' scoping.  Cover the
                                    * eyes of any nearby children.  This
                                    * makes `Xo/Xc' enclosures look like
                                    * one huge line.
                                    */
   #ifdef  STRIP_XO
                                   /*
                                    * First, note whether we're in a macro
                                    * line.
                                    */
                                   if (0 == pos && '.' == blk->buf[i])
                                           macro = 1;
   
                                   /*
                                    * If we're in an `Xo' context and just
                                    * nixed a newline, remove the control
                                    * character for new macro lines:
                                    * they're going to show up as all part
                                    * of the same line.
                                    */
                                   if (xo && xeoln && '.' == blk->buf[i]) {
                                           xeoln = 0;
                                           continue;
                                   }
                                   xeoln = 0;
   
                                   /*
                                    * If we've parsed `Xo', enter an xo
                                    * context.  `Xo' must be in a parsable
                                    * state.  This is the ugly part.  IT IS
                                    * NOT SMART ENOUGH TO HANDLE ESCAPED
                                    * WHITESPACE.
                                    */
                                   if (macro && pos && 'o' == blk->buf[i]) {
                                           if (xo && 'X' == ln->buf[pos - 1])  {
                                                   if (' ' == ln->buf[pos - 2])
                                                           xo++;
                                           } else if ('X' == ln->buf[pos - 1]) {
                                                   if (2 == pos && '.' == ln->buf[pos - 2])
                                                           xo++;
                                                   else if (' ' == ln->buf[pos - 2])
                                                           xo++;
                                           }
                                   }
   
                                   /*
                                    * If we're parsed `Xc', leave an xo
                                    * context if one's already pending.
                                    * `Xc' must be in a parsable state.
                                    * THIS IS NOT SMART ENOUGH TO HANDLE
                                    * ESCAPED WHITESPACE.
                                    */
                                   if (macro && pos && 'c' == blk->buf[i])
                                           if (xo && 'X' == ln->buf[pos - 1])
                                                   if (' ' == ln->buf[pos - 2])
                                                           xo--;
   #endif  /* STRIP_XO */
   
                                 ln->buf[pos++] = blk->buf[i];                                  ln->buf[pos++] = blk->buf[i];
                                 continue;                                  continue;
                         }                          }
Line 323  fdesc(struct buf *blk, struct buf *ln,
Line 389  fdesc(struct buf *blk, struct buf *ln,
                                 }                                  }
                         }                          }
   
   #ifdef  STRIP_XO
                           /*
                            * If we're in an xo context, put a space in
                            * place of the newline and continue parsing.
                            * Mark that we just did a newline.
                            */
                           if (xo) {
                                   xeoln = 1;
                                   ln->buf[pos++] = ' ';
                                   lnn++;
                                   continue;
                           }
   #endif  /* STRIP_XO */
   
                         ln->buf[pos] = 0;                          ln->buf[pos] = 0;
                         if ( ! mdoc_parseln(mdoc, lnn, ln->buf))                          if ( ! mdoc_parseln(mdoc, lnn, ln->buf))
                                 return(0);                                  return(0);
                         lnn++;                          lnn++;
                         pos = 0;                          macro = pos = 0;
                 }                  }
         }          }
   

Legend:
Removed from v.1.7  
changed lines
  Added in v.1.8

CVSweb