Change script name following numbering policy
[platform/upstream/fontconfig.git] / src / fcinit.c
index f64c0f0..5e7c2f1 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * $RCSId: xc/lib/fontconfig/src/fcinit.c,v 1.7 2002/08/22 07:36:44 keithp Exp $
+ * fontconfig/src/fcinit.c
  *
  * Copyright © 2001 Keith Packard
  *
@@ -7,15 +7,15 @@
  * documentation for any purpose is hereby granted without fee, provided that
  * the above copyright notice appear in all copies and that both that
  * copyright notice and this permission notice appear in supporting
- * documentation, and that the name of Keith Packard not be used in
+ * documentation, and that the name of the author(s) not be used in
  * advertising or publicity pertaining to distribution of the software without
- * specific, written prior permission.  Keith Packard makes no
+ * specific, written prior permission.  The authors make no
  * representations about the suitability of this software for any purpose.  It
  * is provided "as is" without express or implied warranty.
  *
- * KEITH PACKARD DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
+ * THE AUTHOR(S) DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
  * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO
- * EVENT SHALL KEITH PACKARD BE LIABLE FOR ANY SPECIAL, INDIRECT OR
+ * EVENT SHALL THE AUTHOR(S) BE LIABLE FOR ANY SPECIAL, INDIRECT OR
  * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE,
  * DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
  * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
 #include "fcint.h"
 #include <stdlib.h>
 
+#if defined(FC_ATOMIC_INT_NIL)
+#pragma message("Could not find any system to define atomic_int macros, library may NOT be thread-safe.")
+#endif
+#if defined(FC_MUTEX_IMPL_NIL)
+#pragma message("Could not find any system to define mutex macros, library may NOT be thread-safe.")
+#endif
+#if defined(FC_ATOMIC_INT_NIL) || defined(FC_MUTEX_IMPL_NIL)
+#pragma message("To suppress these warnings, define FC_NO_MT.")
+#endif
+
 static FcConfig *
-FcInitFallbackConfig (void)
+FcInitFallbackConfig (const FcChar8 *sysroot)
 {
     FcConfig   *config;
 
     config = FcConfigCreate ();
     if (!config)
        goto bail0;
+    FcConfigSetSysRoot (config, sysroot);
     if (!FcConfigAddDir (config, (FcChar8 *) FC_DEFAULT_FONTS))
        goto bail1;
     if (!FcConfigAddCacheDir (config, (FcChar8 *) FC_CACHEDIR))
@@ -55,33 +66,98 @@ FcGetVersion (void)
  * Load the configuration files
  */
 FcConfig *
-FcInitLoadConfig (void)
+FcInitLoadOwnConfig (FcConfig *config)
 {
-    FcConfig   *config;
-    
-    FcInitDebug ();
-    config = FcConfigCreate ();
     if (!config)
-       return FcFalse;
-    
+    {
+       config = FcConfigCreate ();
+       if (!config)
+           return NULL;
+    }
+
+    FcInitDebug ();
+
     if (!FcConfigParseAndLoad (config, 0, FcTrue))
     {
+       const FcChar8 *sysroot = FcConfigGetSysRoot (config);
+       FcConfig *fallback = FcInitFallbackConfig (sysroot);
+
        FcConfigDestroy (config);
-       return FcInitFallbackConfig ();
+
+       return fallback;
+    }
+
+    if (config->cacheDirs && config->cacheDirs->num == 0)
+    {
+       FcChar8 *prefix, *p;
+       size_t plen;
+       FcBool have_own = FcFalse;
+       char *env_file, *env_path;
+
+       env_file = getenv ("FONTCONFIG_FILE");
+       env_path = getenv ("FONTCONFIG_PATH");
+       if ((env_file != NULL && env_file[0] != 0) ||
+           (env_path != NULL && env_path[0] != 0))
+           have_own = FcTrue;
+
+       if (!have_own)
+       {
+           fprintf (stderr,
+                    "Fontconfig warning: no <cachedir> elements found. Check configuration.\n");
+           fprintf (stderr,
+                    "Fontconfig warning: adding <cachedir>%s</cachedir>\n",
+                    FC_CACHEDIR);
+       }
+       prefix = FcConfigXdgCacheHome ();
+       if (!prefix)
+           goto bail;
+       plen = strlen ((const char *)prefix);
+       p = realloc (prefix, plen + 12);
+       if (!p)
+           goto bail;
+       prefix = p;
+       memcpy (&prefix[plen], FC_DIR_SEPARATOR_S "fontconfig", 11);
+       prefix[plen + 11] = 0;
+       if (!have_own)
+           fprintf (stderr,
+                    "Fontconfig warning: adding <cachedir prefix=\"xdg\">fontconfig</cachedir>\n");
+
+       if (!FcConfigAddCacheDir (config, (FcChar8 *) FC_CACHEDIR) ||
+           !FcConfigAddCacheDir (config, (FcChar8 *) prefix))
+       {
+           FcConfig *fallback;
+           const FcChar8 *sysroot;
+
+         bail:
+           sysroot = FcConfigGetSysRoot (config);
+           fprintf (stderr,
+                    "Fontconfig error: out of memory");
+           if (prefix)
+               FcStrFree (prefix);
+           fallback = FcInitFallbackConfig (sysroot);
+           FcConfigDestroy (config);
+
+           return fallback;
+       }
+       FcStrFree (prefix);
     }
 
     return config;
 }
 
+FcConfig *
+FcInitLoadConfig (void)
+{
+    return FcInitLoadOwnConfig (NULL);
+}
+
 /*
  * Load the configuration files and scan for available fonts
  */
 FcConfig *
-FcInitLoadConfigAndFonts (void)
+FcInitLoadOwnConfigAndFonts (FcConfig *config)
 {
-    FcConfig   *config = FcInitLoadConfig ();
-
-    FcInitDebug ();
+    config = FcInitLoadOwnConfig (config);
     if (!config)
        return 0;
     if (!FcConfigBuildFonts (config))
@@ -92,23 +168,19 @@ FcInitLoadConfigAndFonts (void)
     return config;
 }
 
+FcConfig *
+FcInitLoadConfigAndFonts (void)
+{
+    return FcInitLoadOwnConfigAndFonts (NULL);
+}
+
 /*
  * Initialize the default library configuration
  */
 FcBool
 FcInit (void)
 {
-    FcConfig   *config;
-
-    if (_fcConfig)
-       return FcTrue;
-    config = FcInitLoadConfigAndFonts ();
-    if (!config)
-       return FcTrue;
-    FcConfigSetCurrent (config);
-    if (FcDebug() & FC_DBG_MEMORY)
-       FcMemReport ();
-    return FcTrue;
+    return FcConfigInit ();
 }
 
 /*
@@ -117,11 +189,11 @@ FcInit (void)
 void
 FcFini (void)
 {
-    if (_fcConfig)
-       FcConfigDestroy (_fcConfig);
-
-    FcPatternFini ();
+    FcConfigFini ();
     FcCacheFini ();
+    FcDefaultFini ();
+    FcObjectFini ();
+    FcConfigPathFini ();
 }
 
 /*
@@ -131,12 +203,18 @@ FcBool
 FcInitReinitialize (void)
 {
     FcConfig   *config;
+    FcBool     ret;
 
     config = FcInitLoadConfigAndFonts ();
     if (!config)
        return FcFalse;
-    FcConfigSetCurrent (config);
-    return FcTrue;
+    ret = FcConfigSetCurrent (config);
+    /* FcConfigSetCurrent() increases the refcount.
+     * decrease it here to avoid the memory leak.
+     */
+    FcConfigDestroy (config);
+
+    return ret;
 }
 
 FcBool
@@ -145,6 +223,8 @@ FcInitBringUptoDate (void)
     FcConfig   *config = FcConfigGetCurrent ();
     time_t     now;
 
+    if (!config)
+       return FcFalse;
     /*
      * rescanInterval == 0 disables automatic up to date
      */
@@ -164,102 +244,6 @@ FcInitBringUptoDate (void)
     return FcInitReinitialize ();
 }
 
-static struct {
-    char    name[16];
-    int            alloc_count;
-    int            alloc_mem;
-    int            free_count;
-    int            free_mem;
-} FcInUse[FC_MEM_NUM] = {
-    { "charset" },
-    { "charleaf" },
-    { "fontset" },
-    { "fontptr" },
-    { "objectset" },
-    { "objectptr" },
-    { "matrix" },
-    { "pattern" },
-    { "patelt" },
-    { "vallist" },
-    { "substate" },
-    { "string" },
-    { "listbuck" },
-    { "strset" },
-    { "strlist" },
-    { "config" },
-    { "langset" },
-    { "atomic" },
-    { "blanks" },
-    { "cache" },
-    { "strbuf" },
-    { "subst" },
-    { "objecttype" },
-    { "constant" },
-    { "test" },
-    { "expr" },
-    { "vstack" },
-    { "attr" },
-    { "pstack" },
-    { "staticstr" },
-};
-
-static int  FcAllocCount, FcAllocMem;
-static int  FcFreeCount, FcFreeMem;
-
-static int  FcMemNotice = 1*1024*1024;
-
-static int  FcAllocNotify, FcFreeNotify;
-
-void
-FcMemReport (void)
-{
-    int        i;
-    printf ("Fc Memory Usage:\n");
-    printf ("\t   Which       Alloc           Free           Active\n");
-    printf ("\t           count   bytes   count   bytes   count   bytes\n");
-    for (i = 0; i < FC_MEM_NUM; i++)
-       printf ("%16.16s%8d%8d%8d%8d%8d%8d\n",
-               FcInUse[i].name,
-               FcInUse[i].alloc_count, FcInUse[i].alloc_mem,
-               FcInUse[i].free_count, FcInUse[i].free_mem,
-               FcInUse[i].alloc_count - FcInUse[i].free_count,
-               FcInUse[i].alloc_mem - FcInUse[i].free_mem);
-    printf ("%16.16s%8d%8d%8d%8d%8d%8d\n",
-           "Total",
-           FcAllocCount, FcAllocMem,
-           FcFreeCount, FcFreeMem,
-           FcAllocCount - FcFreeCount,
-           FcAllocMem - FcFreeMem);
-    FcAllocNotify = 0;
-    FcFreeNotify = 0;
-}
-
-void
-FcMemAlloc (int kind, int size)
-{
-    if (FcDebug() & FC_DBG_MEMORY)
-    {
-       FcInUse[kind].alloc_count++;
-       FcInUse[kind].alloc_mem += size;
-       FcAllocCount++;
-       FcAllocMem += size;
-       FcAllocNotify += size;
-       if (FcAllocNotify > FcMemNotice)
-           FcMemReport ();
-    }
-}
-
-void
-FcMemFree (int kind, int size)
-{
-    if (FcDebug() & FC_DBG_MEMORY)
-    {
-       FcInUse[kind].free_count++;
-       FcInUse[kind].free_mem += size;
-       FcFreeCount++;
-       FcFreeMem += size;
-       FcFreeNotify += size;
-       if (FcFreeNotify > FcMemNotice)
-           FcMemReport ();
-    }
-}
+#define __fcinit__
+#include "fcaliastail.h"
+#undef __fcinit__