unsigned int sp_svg_length_read_lff (const gchar *str, unsigned long *unit, float *val, float *computed) { const gchar *e; float v; if (!str) return 0; v = strtod (str, (char **) &e); if (e == str) return 0; if (!e[0]) { /* Unitless */ if (unit) *unit = SP_SVG_UNIT_NONE; if (val) *val = v; if (computed) *computed = v; return 1; } else if (!isalnum (e[0])) { /* Unitless or percent */ if (e[0] == '%') { /* Percent */ if (e[1] && isalnum (e[1])) return 0; if (unit) *unit = SP_SVG_UNIT_PERCENT; if (val) *val = v * 0.01; return 1; } else { if (unit) *unit = SP_SVG_UNIT_NONE; if (val) *val = v; if (computed) *computed = v; return 1; } } else if (e[1] && !isalnum (e[2])) { unsigned int uval; /* Units */ uval = UVAL (e[0], e[1]); switch (uval) { case UVAL('p','x'): if (unit) *unit = SP_SVG_UNIT_PX; if (computed) *computed = v * 1.0; break; case UVAL('p','t'): if (unit) *unit = SP_SVG_UNIT_PT; if (computed) *computed = v * 1.25; break; case UVAL('p','c'): if (unit) *unit = SP_SVG_UNIT_PC; if (computed) *computed = v * 15.0; break; case UVAL('m','m'): if (unit) *unit = SP_SVG_UNIT_MM; if (computed) *computed = v * 3.543307; break; case UVAL('c','m'): if (unit) *unit = SP_SVG_UNIT_CM; if (computed) *computed = v * 35.43307; break; case UVAL('i','n'): if (unit) *unit = SP_SVG_UNIT_IN; if (computed) *computed = v * 90.0; break; case UVAL('e','m'): if (unit) *unit = SP_SVG_UNIT_EM; break; case UVAL('e','x'): if (unit) *unit = SP_SVG_UNIT_EX; break; default: /* Invalid */ return 0; break; } if (val) *val = v; return 1; } /* Invalid */ return 0; }
static unsigned sp_svg_length_read_lff(gchar const *str, SVGLength::Unit *unit, float *val, float *computed, char **next) { if (!str) { return 0; } gchar const *e; float const v = g_ascii_strtod(str, (char **) &e); if (e == str) { return 0; } if (!e[0]) { /* Unitless */ if (unit) { *unit = SVGLength::NONE; } if (val) { *val = v; } if (computed) { *computed = v; } if (next) { *next = NULL; // no more values } return 1; } else if (!g_ascii_isalnum(e[0])) { /* Unitless or percent */ if (e[0] == '%') { /* Percent */ if (e[1] && g_ascii_isalnum(e[1])) { return 0; } if (unit) { *unit = SVGLength::PERCENT; } if (val) { *val = v * 0.01; } if (computed) { *computed = v * 0.01; } if (next) { *next = (char *) e + 1; } return 1; } else { /* Unitless */ if (unit) { *unit = SVGLength::NONE; } if (val) { *val = v; } if (computed) { *computed = v; } if (next) { *next = (char *) e; } return 1; } } else if (e[1] && !g_ascii_isalnum(e[2])) { /* TODO: Allow the number of px per inch to vary (document preferences, X server * or whatever). E.g. don't fill in computed here, do it at the same time as * percentage units are done. */ unsigned int const uval = UVAL(e[0], e[1]); switch (uval) { case UVAL('p','x'): if (unit) { *unit = SVGLength::PX; } if (computed) { *computed = v; } break; case UVAL('p','t'): if (unit) { *unit = SVGLength::PT; } if (computed) { *computed = v * PX_PER_PT; } break; case UVAL('p','c'): if (unit) { *unit = SVGLength::PC; } if (computed) { *computed = v * PX_PER_PC; } break; case UVAL('m','m'): if (unit) { *unit = SVGLength::MM; } if (computed) { *computed = v * PX_PER_MM; } break; case UVAL('c','m'): if (unit) { *unit = SVGLength::CM; } if (computed) { *computed = v * PX_PER_CM; } break; case UVAL('i','n'): if (unit) { *unit = SVGLength::INCH; } if (computed) { *computed = v * PX_PER_IN; } break; case UVAL('f','t'): if (unit) { *unit = SVGLength::FOOT; } if (computed) { *computed = v * PX_PER_FT; } break; case UVAL('e','m'): if (unit) { *unit = SVGLength::EM; } break; case UVAL('e','x'): if (unit) { *unit = SVGLength::EX; } break; default: /* Invalid */ return 0; break; } if (val) { *val = v; } if (next) { *next = (char *) e + 2; } return 1; } /* Invalid */ return 0; }