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

Diff for /mandoc/out.c between version 1.55 and 1.56

version 1.55, 2014/12/23 03:28:01 version 1.56, 2014/12/23 09:31:46
Line 40  static void tblcalc_number(struct rofftbl *, struct ro
Line 40  static void tblcalc_number(struct rofftbl *, struct ro
  * Parse the *src string and store a scaling unit into *dst.   * Parse the *src string and store a scaling unit into *dst.
  * If the string doesn't specify the unit, use the default.   * If the string doesn't specify the unit, use the default.
  * If no default is specified, fail.   * If no default is specified, fail.
  * Return 1 on success and 0 on failure.   * 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            *endptr;          char            *endptr;
         double           scale;  
         enum roffscale   unit;  
   
         scale = strtod(src, &endptr);          dst->unit = def == SCALE_MAX ? SCALE_BU : def;
         if (endptr == src || (endptr[0] != '\0' && endptr[1] != '\0'))          dst->scale = strtod(src, &endptr);
           if (endptr == src)
                 return(0);                  return(0);
   
         switch (*endptr) {          switch (*endptr++) {
         case 'c':          case 'c':
                 unit = SCALE_CM;                  dst->unit = SCALE_CM;
                 break;                  break;
         case 'i':          case 'i':
                 unit = SCALE_IN;                  dst->unit = SCALE_IN;
                 break;                  break;
           case 'f':
                   dst->unit = SCALE_FS;
                   break;
           case 'M':
                   dst->unit = SCALE_MM;
                   break;
           case 'm':
                   dst->unit = SCALE_EM;
                   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 = def;                  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. */          /* FIXME: do this in the caller. */
         if (scale < 0.0)          if (dst->scale < 0.0)
                 scale = 0.0;                  dst->scale = 0.0;
         dst->scale = scale;          return(*endptr == '\0' ? 2 : 1);
         dst->unit = unit;  
         return(1);  
 }  }
   
 /*  /*

Legend:
Removed from v.1.55  
changed lines
  Added in v.1.56

CVSweb