static fz_css_number number_from_value(fz_css_value *value, float initial, int initial_unit) { char *p; if (!value) return make_number(initial, initial_unit); if (value->type == CSS_PERCENT) return make_number((float)fz_strtod(value->data, NULL), N_PERCENT); if (value->type == CSS_NUMBER) return make_number((float)fz_strtod(value->data, NULL), N_NUMBER); if (value->type == CSS_LENGTH) { float x = (float)fz_strtod(value->data, &p); if (p[0] == 'e' && p[1] == 'm') return make_number(x, N_SCALE); if (p[0] == 'e' && p[1] == 'x') return make_number(x / 2, N_SCALE); if (p[0] == 'i' && p[1] == 'n') return make_number(x * 72, N_NUMBER); if (p[0] == 'c' && p[1] == 'm') return make_number(x * 7200 / 254, N_NUMBER); if (p[0] == 'm' && p[1] == 'm') return make_number(x * 720 / 254, N_NUMBER); if (p[0] == 'p' && p[1] == 'c') return make_number(x * 12, N_NUMBER); if (p[0] == 'p' && p[1] == 't') return make_number(x, N_NUMBER); if (p[0] == 'p' && p[1] == 'x') return make_number(x, N_NUMBER); return make_number(x, N_NUMBER); } return make_number(initial, initial_unit); }
static char * xps_parse_float_array(char *s, int num, float *x) { int k = 0; if (s == NULL || *s == 0) return NULL; while (*s) { while (*s == 0x0d || *s == '\t' || *s == ' ' || *s == 0x0a) s++; x[k] = (float)fz_strtod(s, &s); while (*s == 0x0d || *s == '\t' || *s == ' ' || *s == 0x0a) s++; if (*s == ',') s++; if (++k == num) break; } return s; }