static FcBool FcCacheIsMmapSafe (int fd) { enum { MMAP_NOT_INITIALIZED = 0, MMAP_USE, MMAP_DONT_USE, MMAP_CHECK_FS, } status; static void *static_status; status = (intptr_t) fc_atomic_ptr_get (&static_status); if (status == MMAP_NOT_INITIALIZED) { const char *env = getenv ("FONTCONFIG_USE_MMAP"); FcBool use; if (env && FcNameBool ((const FcChar8 *) env, &use)) status = use ? MMAP_USE : MMAP_DONT_USE; else status = MMAP_CHECK_FS; (void) fc_atomic_ptr_cmpexch (&static_status, NULL, (void *) status); } if (status == MMAP_CHECK_FS) return FcIsFsMmapSafe (fd); else return status == MMAP_USE; }
static FcValue FcNameConvert (FcType type, FcChar8 *string) { FcValue v; FcMatrix m; double b, e; char *p; v.type = type; switch ((int) v.type) { case FcTypeInteger: if (!FcNameConstant (string, &v.u.i)) v.u.i = atoi ((char *) string); break; case FcTypeString: v.u.s = FcStrdup (string); if (!v.u.s) v.type = FcTypeVoid; break; case FcTypeBool: if (!FcNameBool (string, &v.u.b)) v.u.b = FcFalse; break; case FcTypeDouble: v.u.d = strtod ((char *) string, 0); break; case FcTypeMatrix: FcMatrixInit (&m); sscanf ((char *) string, "%lg %lg %lg %lg", &m.xx, &m.xy, &m.yx, &m.yy); v.u.m = FcMatrixCopy (&m); break; case FcTypeCharSet: v.u.c = FcNameParseCharSet (string); if (!v.u.c) v.type = FcTypeVoid; break; case FcTypeLangSet: v.u.l = FcNameParseLangSet (string); if (!v.u.l) v.type = FcTypeVoid; break; case FcTypeRange: if (sscanf ((char *) string, "(%lg %lg)", &b, &e) != 2) { v.u.d = strtod ((char *) string, &p); if (p != NULL && p[0] != 0) { v.type = FcTypeVoid; break; } v.type = FcTypeDouble; } else v.u.r = FcRangeCreateDouble (b, e); break; default: break; } return v; }
static FcValue FcNameConvert (FcType type, FcChar8 *string) { FcValue v; FcMatrix m; v.type = type; switch ((int) v.type) { case FcTypeInteger: if (!FcNameConstant (string, &v.u.i)) v.u.i = atoi ((char *) string); break; case FcTypeString: v.u.s = FcStrdup (string); if (!v.u.s) v.type = FcTypeVoid; break; case FcTypeBool: if (!FcNameBool (string, &v.u.b)) v.u.b = FcFalse; break; case FcTypeDouble: v.u.d = strtod ((char *) string, 0); break; case FcTypeMatrix: FcMatrixInit (&m); sscanf ((char *) string, "%lg %lg %lg %lg", &m.xx, &m.xy, &m.yx, &m.yy); v.u.m = FcMatrixCopy (&m); break; case FcTypeCharSet: v.u.c = FcNameParseCharSet (string); if (!v.u.c) v.type = FcTypeVoid; break; case FcTypeLangSet: v.u.l = FcNameParseLangSet (string); if (!v.u.l) v.type = FcTypeVoid; break; default: break; } return v; }
static FcValue FcNameConvert (FcType type, FcChar8 *string, FcMatrix *m) { FcValue v; v.type = type; switch (v.type) { case FcTypeInteger: if (!FcNameConstant (string, &v.u.i)) v.u.i = atoi ((char *) string); break; case FcTypeString: v.u.s = string; break; case FcTypeBool: if (!FcNameBool (string, &v.u.b)) v.u.b = FcFalse; break; case FcTypeDouble: v.u.d = strtod ((char *) string, 0); break; case FcTypeMatrix: v.u.m = m; sscanf ((char *) string, "%lg %lg %lg %lg", &m->xx, &m->xy, &m->yx, &m->yy); break; case FcTypeCharSet: v.u.c = FcNameParseCharSet (string); break; case FcTypeLangSet: v.u.l = FcNameParseLangSet (string); break; default: break; } return v; }