#include "length.h" #include #include #include static double parse(char const* value, double res_mm) { char* suffix; double num = strtod(value, &suffix); if (suffix == value) { fprintf(stderr, "illegal value: %s\n", value); exit(2); } double add = 0; if (*suffix == '+') { add = num; num = strtod(suffix + 1, &suffix); } if (*suffix == '/') { double denom = strtod(suffix + 1, &suffix); if (denom <= 0.0) { fprintf(stderr, "illegal fraction: %s\n", value); exit(2); } num /= denom; } num += add; if (!strcmp(suffix, "") || !strcmp(suffix, "px")) { return num; } else if (!strcmp(suffix, "um")) { return num / 1000 / res_mm; } else if (!strcmp(suffix, "mm")) { return num / res_mm; } else if (!strcmp(suffix, "cm")) { return num * 10 / res_mm; } else if (!strcmp(suffix, "m")) { return num * 1000 / res_mm; } else if (!strcmp(suffix, "mil") || !strcmp(suffix, "thou")) { return num / 1000 * 2.54 * 10 / res_mm; } else if (!strcmp(suffix, "in") || !strcmp(suffix, "\"")) { return num * 2.54 * 10 / res_mm; } else if (!strcmp(suffix, "ft") || !strcmp(suffix, "'")) { return num * 12 * 2.54 * 10 / res_mm; } else { fprintf(stderr, "illegal suffix: %s\n", suffix); exit(2); } } int parse_length(char const* value) { double res_mm = 0.025; char const* res = getenv("RESOLUTION"); if (res != NULL && *res != '\0') { res_mm = parse(res, 1.0); if (res_mm <= 0) { fprintf(stderr, "illegal $RESOLUTION: %s\n", res); exit(2); } } return (int) (parse(value, res_mm) + 0.5); }