Imported Upstream version 2.13.0
[platform/upstream/fontconfig.git] / src / fcdefault.c
index 6647a8f..35973d7 100644 (file)
@@ -39,6 +39,7 @@ static const struct {
     { FC_EMBEDDED_BITMAP_OBJECT,   FcTrue      },  /* !FC_LOAD_NO_BITMAP */
     { FC_DECORATIVE_OBJECT,       FcFalse      },
     { FC_SYMBOL_OBJECT,                   FcFalse      },
+    { FC_VARIABLE_OBJECT,         FcFalse      },
 };
 
 #define NUM_FC_BOOL_DEFAULTS   (int) (sizeof FcBoolDefaults / sizeof FcBoolDefaults[0])
@@ -148,17 +149,34 @@ retry:
            prgname = FcStrdup ("");
 #else
 # if defined (HAVE_GETEXECNAME)
-       const char *p = getexecname ();
+       char *p = FcStrdup(getexecname ());
 # elif defined (HAVE_READLINK)
-       char buf[PATH_MAX + 1];
-       int len;
+       size_t size = FC_PATH_MAX;
        char *p = NULL;
 
-       len = readlink ("/proc/self/exe", buf, sizeof (buf) - 1);
-       if (len != -1)
+       while (1)
        {
-           buf[len] = '\0';
-           p = buf;
+           char *buf = malloc (size);
+           ssize_t len;
+
+           if (!buf)
+               break;
+
+           len = readlink ("/proc/self/exe", buf, size - 1);
+           if (len < 0)
+           {
+               free (buf);
+               break;
+           }
+           if (len < size - 1)
+           {
+               buf[len] = 0;
+               p = buf;
+               break;
+           }
+
+           free (buf);
+           size *= 2;
        }
 # else
        char *p = NULL;
@@ -176,6 +194,9 @@ retry:
 
        if (!prgname)
            prgname = FcStrdup ("");
+
+       if (p)
+           free (p);
 #endif
 
        if (!fc_atomic_ptr_cmpexch (&default_prgname, NULL, prgname)) {
@@ -235,7 +256,14 @@ FcDefaultSubstitute (FcPattern *pattern)
            FcPatternObjectAddBool (pattern, FcBoolDefaults[i].field, FcBoolDefaults[i].value);
 
     if (FcPatternObjectGetDouble (pattern, FC_SIZE_OBJECT, 0, &size) != FcResultMatch)
-       size = 12.0L;
+    {
+       FcRange *r;
+       double b, e;
+       if (FcPatternObjectGetRange (pattern, FC_SIZE_OBJECT, 0, &r) == FcResultMatch && FcRangeGetDouble (r, &b, &e))
+           size = (b + e) * .5;
+       else
+           size = 12.0L;
+    }
     if (FcPatternObjectGetDouble (pattern, FC_SCALE_OBJECT, 0, &scale) != FcResultMatch)
        scale = 1.0;
     if (FcPatternObjectGetDouble (pattern, FC_DPI_OBJECT, 0, &dpi) != FcResultMatch)