![]() ![]() | ![]() |
version 1.55, 2014/12/23 03:28:01 | version 1.56, 2014/12/23 09:31:46 | ||
---|---|---|---|
|
|
||
* 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); | |||
} | } | ||
/* | /* |