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

Diff for /mandoc/out.c between version 1.53 and 1.57

version 1.53, 2014/10/14 18:18:05 version 1.57, 2014/12/23 13:48:57
Line 20 
Line 20 
 #include <sys/types.h>  #include <sys/types.h>
   
 #include <assert.h>  #include <assert.h>
 #include <ctype.h>  
 #include <stdio.h>  
 #include <stdlib.h>  #include <stdlib.h>
 #include <string.h>  #include <string.h>
 #include <time.h>  #include <time.h>
Line 39  static void tblcalc_number(struct rofftbl *, struct ro
Line 37  static void tblcalc_number(struct rofftbl *, struct ro
   
   
 /*  /*
  * Convert a `scaling unit' to a consistent form, or fail.  Scaling   * Parse the *src string and store a scaling unit into *dst.
  * units are documented in groff.7, mdoc.7, man.7.   * If the string doesn't specify the unit, use the default.
    * If no default is specified, fail.
    * Return 2 on complete success, 1 when a conversion was done,
    * but there was trailing garbage, and 0 on total failure.
  */   */
 int  int
 a2roffsu(const char *src, struct roffsu *dst, enum roffscale def)  a2roffsu(const char *src, struct roffsu *dst, enum roffscale def)
 {  {
         char             buf[BUFSIZ], hasd;          char            *endptr;
         int              i;  
         enum roffscale   unit;  
   
         if ('\0' == *src)          dst->unit = def == SCALE_MAX ? SCALE_BU : def;
           dst->scale = strtod(src, &endptr);
           if (endptr == src)
                 return(0);                  return(0);
   
         i = hasd = 0;          switch (*endptr++) {
           case 'c':
         switch (*src) {                  dst->unit = SCALE_CM;
         case '+':  
                 src++;  
                 break;                  break;
         case '-':          case 'i':
                 buf[i++] = *src++;                  dst->unit = SCALE_IN;
                 break;                  break;
         default:          case 'f':
                   dst->unit = SCALE_FS;
                 break;                  break;
         }          case 'M':
                   dst->unit = SCALE_MM;
         if ('\0' == *src)  
                 return(0);  
   
         while (i < BUFSIZ) {  
                 if ( ! isdigit((unsigned char)*src)) {  
                         if ('.' != *src)  
                                 break;  
                         else if (hasd)  
                                 break;  
                         else  
                                 hasd = 1;  
                 }  
                 buf[i++] = *src++;  
         }  
   
         if (BUFSIZ == i || (*src && *(src + 1)))  
                 return(0);  
   
         buf[i] = '\0';  
   
         switch (*src) {  
         case 'c':  
                 unit = SCALE_CM;  
                 break;                  break;
         case 'i':          case 'm':
                 unit = SCALE_IN;                  dst->unit = SCALE_EM;
                 break;                  break;
           case 'n':
                   dst->unit = SCALE_EN;
                   break;
         case 'P':          case 'P':
                 unit = SCALE_PC;                  dst->unit = SCALE_PC;
                 break;                  break;
         case 'p':          case 'p':
                 unit = SCALE_PT;                  dst->unit = SCALE_PT;
                 break;                  break;
         case 'f':          case 'u':
                 unit = SCALE_FS;                  dst->unit = SCALE_BU;
                 break;                  break;
         case 'v':          case 'v':
                 unit = SCALE_VS;                  dst->unit = SCALE_VS;
                 break;                  break;
         case 'm':  
                 unit = SCALE_EM;  
                 break;  
         case '\0':          case '\0':
                   endptr--;
                   /* FALLTHROUGH */
           default:
                 if (SCALE_MAX == def)                  if (SCALE_MAX == def)
                         return(0);                          return(0);
                 unit = SCALE_EN;                  dst->unit = def;
                 break;                  break;
         case 'u':  
                 unit = SCALE_BU;  
                 break;  
         case 'M':  
                 unit = SCALE_MM;  
                 break;  
         case 'n':  
                 unit = SCALE_EN;  
                 break;  
         default:  
                 return(0);  
         }          }
   
         /* FIXME: do this in the caller. */          return(*endptr == '\0' ? 2 : 1);
         if ((dst->scale = atof(buf)) < 0.0)  
                 dst->scale = 0.0;  
         dst->unit = unit;  
         return(1);  
 }  }
   
 /*  /*

Legend:
Removed from v.1.53  
changed lines
  Added in v.1.57

CVSweb