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

Diff for /mandoc/out.c between version 1.8 and 1.15

version 1.8, 2009/11/07 08:26:45 version 1.15, 2010/04/07 11:29:55
Line 14 
Line 14 
  * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF   * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
  * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.   * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
  */   */
   #ifdef HAVE_CONFIG_H
   #include "config.h"
   #endif
   
 #include <sys/types.h>  #include <sys/types.h>
   
 #include <assert.h>  #include <assert.h>
Line 25 
Line 29 
   
 #include "out.h"  #include "out.h"
   
 #ifdef __linux__  /* See a2roffdeco(). */
 extern  size_t    strlcat(char *, const char *, size_t);  #define C2LIM(c, l) do { \
 #endif          (l) = 1; \
           if ('[' == (c) || '\'' == (c)) \
                   (l) = 0; \
           else if ('(' == (c)) \
                   (l) = 2; } \
           while (/* CONSTCOND */ 0)
   
   /* See a2roffdeco(). */
   #define C2TERM(c, t) do { \
           (t) = 0; \
           if ('\'' == (c)) \
                   (t) = 1; \
           else if ('[' == (c)) \
                   (t) = 2; \
           else if ('(' == (c)) \
                   (t) = 3; } \
           while (/* CONSTCOND */ 0)
   
 /*  /*
  * Convert a `scaling unit' to a consistent form, or fail.  Scaling   * Convert a `scaling unit' to a consistent form, or fail.  Scaling
  * units are documented in groff.7, mdoc.7, man.7.   * units are documented in groff.7, mdoc.7, man.7.
Line 167  time2a(time_t t, char *dst, size_t sz)
Line 187  time2a(time_t t, char *dst, size_t sz)
 }  }
   
   
 /* Returns length of parsed string. */  /*
    * Returns length of parsed string (the leading "\" should NOT be
    * included).  This can be zero if the current character is the nil
    * terminator.  "d" is set to the type of parsed decorator, which may
    * have an adjoining "word" of size "sz" (e.g., "(ab" -> "ab", 2).
    */
 int  int
 a2roffdeco(enum roffdeco *d,  a2roffdeco(enum roffdeco *d,
                 const char **word, size_t *sz)                  const char **word, size_t *sz)
 {  {
         int              j, type, sv, t, lim;          int              j, term, lim;
         const char      *wp;          char             set;
           const char      *wp, *sp;
   
         *d = DECO_NONE;          *d = DECO_NONE;
   
         wp = *word;          wp = *word;
         type = 1;  
   
         switch (*wp) {          switch ((set = *wp)) {
         case ('\0'):          case ('\0'):
                 return(0);                  return(0);
   
         case ('('):          case ('('):
                 wp++;                  if ('\0' == *(++wp))
                 if ('\0' == *wp)  
                         return(1);                          return(1);
                 if ('\0' == *(wp + 1))                  if ('\0' == *(wp + 1))
                         return(2);                          return(2);
Line 196  a2roffdeco(enum roffdeco *d,
Line 219  a2roffdeco(enum roffdeco *d,
                 *word = wp;                  *word = wp;
                 return(3);                  return(3);
   
         case ('*'):          case ('F'):
                 wp++;                  /* FALLTHROUGH */
           case ('f'):
                   /*
                    * FIXME: this needs work and consolidation (it should
                    * follow the sequence that special characters do, for
                    * one), but isn't a priority at the moment.  Note, for
                    * one, that in reality \fB != \FB, although here we let
                    * these slip by.
                    */
                   switch (*(++wp)) {
                   case ('\0'):
                           return(1);
                   case ('3'):
                           /* FALLTHROUGH */
                   case ('B'):
                           *d = DECO_BOLD;
                           return(2);
                   case ('2'):
                           /* FALLTHROUGH */
                   case ('I'):
                           *d = DECO_ITALIC;
                           return(2);
                   case ('P'):
                           *d = DECO_PREVIOUS;
                           return(2);
                   case ('1'):
                           /* FALLTHROUGH */
                   case ('R'):
                           *d = DECO_ROMAN;
                           return(2);
                   case ('('):
                           if ('\0' == *(++wp))
                                   return(2);
                           if ('\0' == *(wp + 1))
                                   return(3);
   
                 switch (*wp) {                          *d = 'F' == set ? DECO_FFONT : DECO_FONT;
                           *sz = 2;
                           *word = wp;
                           return(4);
                   case ('['):
                           *word = ++wp;
                           for (j = 0; *wp && ']' != *wp; wp++, j++)
                                   /* Loop... */ ;
   
                           if ('\0' == *wp)
                                   return(j + 2);
   
                           *d = 'F' == set ? DECO_FFONT : DECO_FONT;
                           *sz = (size_t)j;
                           return(j + 3);
                   default:
                           break;
                   }
   
                   *d = 'F' == set ? DECO_FFONT : DECO_FONT;
                   *sz = 1;
                   *word = wp;
                   return(2);
   
           case ('*'):
                   switch (*(++wp)) {
                 case ('\0'):                  case ('\0'):
                         return(1);                          return(1);
   
                 case ('('):                  case ('('):
                         wp++;                          if ('\0' == *(++wp))
                         if ('\0' == *wp)  
                                 return(2);                                  return(2);
                         if ('\0' == *(wp + 1))                          if ('\0' == *(wp + 1))
                                 return(3);                                  return(3);
Line 216  a2roffdeco(enum roffdeco *d,
Line 297  a2roffdeco(enum roffdeco *d,
                         return(4);                          return(4);
   
                 case ('['):                  case ('['):
                         type = 0;                          *word = ++wp;
                         break;                          for (j = 0; *wp && ']' != *wp; wp++, j++)
                                   /* Loop... */ ;
   
                 default:                          if ('\0' == *wp)
                                   return(j + 2);
   
                         *d = DECO_RESERVED;                          *d = DECO_RESERVED;
                         *sz = 1;                          *sz = (size_t)j;
                         *word = wp;                          return(j + 3);
                         return(3);  
                   default:
                           break;
                 }                  }
                 break;  
   
 #if 0                  *d = DECO_RESERVED;
         case ('s'):                  *sz = 1;
                 wp++;                  *word = wp;
                   return(2);
   
                 /* This closely follows mandoc_special(). */          case ('s'):
                 if ('\0' == *wp)                  sp = wp;
                   if ('\0' == *(++wp))
                         return(1);                          return(1);
   
                 t = 0;                  C2LIM(*wp, lim);
                 lim = 1;                  C2TERM(*wp, term);
   
                 if (*wp == '\'') {                  if (term)
                         lim = 0;                          wp++;
                         t = 1;  
                         ++wp;  
                 } else if (*wp == '[') {  
                         lim = 0;  
                         t = 2;  
                         ++wp;  
                 } else if (*wp == '(') {  
                         lim = 2;  
                         t = 3;  
                         ++wp;  
                 }  
   
                   *word = wp;
   
                 if (*wp == '+' || *wp == '-')                  if (*wp == '+' || *wp == '-')
                         ++wp;                          ++wp;
   
                 if (*wp == '\'') {                  switch (*wp) {
                         if (t) {                  case ('\''):
                                 *word = wp;                          /* FALLTHROUGH */
                                 return;                  case ('['):
                         }                          /* FALLTHROUGH */
                         lim = 0;                  case ('('):
                         t = 1;                          if (term)
                         ++wp;                                  return((int)(wp - sp));
                 } else if (*wp == '[') {  
                         if (t) {  
                                 *word = wp;  
                                 return;  
                         }  
                         lim = 0;  
                         t = 2;  
                         ++wp;  
                 } else if (*wp == '(') {  
                         if (t) {  
                                 *word = wp;  
                                 return;  
                         }  
                         lim = 2;  
                         t = 3;  
                         ++wp;  
                 }  
   
                 if ( ! isdigit((u_char)*wp)) {                          C2LIM(*wp, lim);
                         *word = --wp;                          C2TERM(*wp, term);
                         return;                          wp++;
                           break;
                   default:
                           break;
                 }                  }
   
                   if ( ! isdigit((u_char)*wp))
                           return((int)(wp - sp));
   
                 for (j = 0; isdigit((u_char)*wp); j++) {                  for (j = 0; isdigit((u_char)*wp); j++) {
                         if (lim && j >= lim)                          if (lim && j >= lim)
                                 break;                                  break;
                         ++wp;                          ++wp;
                 }                  }
   
                 if (t && t < 3) {                  if (term && term < 3) {
                         if (1 == t && *wp != '\'') {                          if (1 == term && *wp != '\'')
                                 *word = --wp;                                  return((int)(wp - sp));
                                 return;                          if (2 == term && *wp != ']')
                         }                                  return((int)(wp - sp));
                         if (2 == t && *wp != ']') {  
                                 *word = --wp;  
                                 return;  
                         }  
                         ++wp;                          ++wp;
                 }                  }
                 *word = --wp;  
                 return;  
 #endif  
   
         case ('f'):                  *d = DECO_SIZE;
                 wp++;                  return((int)(wp - sp));
   
                 switch (*wp) {          case ('['):
                 case ('\0'):                  *word = ++wp;
                         return(1);  
                 case ('3'):  
                         /* FALLTHROUGH */  
                 case ('B'):  
                         *d = DECO_BOLD;  
                         break;  
                 case ('2'):  
                         /* FALLTHROUGH */  
                 case ('I'):  
                         *d = DECO_ITALIC;  
                         break;  
                 case ('P'):  
                         *d = DECO_PREVIOUS;  
                         break;  
                 case ('1'):  
                         /* FALLTHROUGH */  
                 case ('R'):  
                         *d = DECO_ROMAN;  
                         break;  
                 default:  
                         break;  
                 }  
   
                 return(2);                  for (j = 0; *wp && ']' != *wp; wp++, j++)
                           /* Loop... */ ;
   
         case ('['):                  if ('\0' == *wp)
                 break;                          return(j + 1);
   
         default:  
                 *d = DECO_SPECIAL;                  *d = DECO_SPECIAL;
                 *word = wp;                  *sz = (size_t)j;
                   return(j + 2);
   
           case ('c'):
                   *d = DECO_NOSPACE;
                 *sz = 1;                  *sz = 1;
                 return(1);                  return(1);
   
           default:
                   break;
         }          }
   
         *word = ++wp;          *d = DECO_SPECIAL;
         for (j = 0; *wp && ']' != *wp; wp++, j++)          *word = wp;
                 /* Loop... */ ;          *sz = 1;
           return(1);
         if ('\0' == *wp)  
                 return(j + 1);  
   
         *d = type ? DECO_SPECIAL : DECO_RESERVED;  
         *sz = j;  
         return (j + 2);  
 }  }

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

CVSweb