]> git.wh0rd.org - fontconfig.git/blobdiff - src/fcinit.c
Bug 44826 - <alias> must contain only a single <family>
[fontconfig.git] / src / fcinit.c
index f82e0182cb76b6bfa0863c85054bcd3cc6b49c76..b7966b6db08a466196ad9fb493cd234238d6450b 100644 (file)
@@ -1,46 +1,31 @@
 /*
- * $XFree86: $
+ * fontconfig/src/fcinit.c
  *
- * Copyright © 2001 Keith Packard, member of The XFree86 Project, Inc.
+ * Copyright © 2001 Keith Packard
  *
  * Permission to use, copy, modify, distribute, and sell this software and its
  * 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
  * PERFORMANCE OF THIS SOFTWARE.
  */
 
-#include <stdlib.h>
 #include "fcint.h"
+#include <stdlib.h>
 
-FcBool
-FcInitFonts (void)
-{
-    FcConfig   *config;
-
-    config = FcConfigGetCurrent ();
-    if (!config)
-       return FcFalse;
-
-    if (FcConfigGetFonts (config, FcSetSystem))
-       return FcTrue;
-
-    return FcConfigBuildFonts (config);
-}
-
-static FcBool
+static FcConfig *
 FcInitFallbackConfig (void)
 {
     FcConfig   *config;
@@ -48,68 +33,195 @@ FcInitFallbackConfig (void)
     config = FcConfigCreate ();
     if (!config)
        goto bail0;
-    if (!FcConfigAddDir (config, FC_FALLBACK_FONTS))
+    if (!FcConfigAddDir (config, (FcChar8 *) FC_DEFAULT_FONTS))
        goto bail1;
-    FcConfigSetCurrent (config);
-    return FcTrue;
+    if (!FcConfigAddCacheDir (config, (FcChar8 *) FC_CACHEDIR))
+       goto bail1;
+    return config;
 
 bail1:
     FcConfigDestroy (config);
 bail0:
-    return FcFalse;
+    return 0;
+}
+
+int
+FcGetVersion (void)
+{
+    return FC_VERSION;
 }
 
 /*
- * Locate and parse the configuration file
+ * Load the configuration files
  */
-FcBool
-FcInitConfig (void)
+FcConfig *
+FcInitLoadConfig (void)
 {
-    FcConfig    *config;
-    
-    if (FcConfigGetCurrent ())
-       return FcTrue;
-    
+    FcConfig   *config;
+
+    FcInitDebug ();
     config = FcConfigCreate ();
     if (!config)
-       return FcFalse;
-    
+       return NULL;
+
     if (!FcConfigParseAndLoad (config, 0, FcTrue))
     {
        FcConfigDestroy (config);
        return FcInitFallbackConfig ();
     }
-    
+
+    if (config->cacheDirs && config->cacheDirs->num == 0)
+    {
+       fprintf (stderr,
+                "Fontconfig warning: no <cachedir> elements found. Check configuration.\n");
+       fprintf (stderr,
+                "Fontconfig warning: adding <cachedir>%s</cachedir>\n",
+                FC_CACHEDIR);
+       fprintf (stderr,
+                "Fontconfig warning: adding <cachedir>~/.fontconfig</cachedir>\n");
+       if (!FcConfigAddCacheDir (config, (FcChar8 *) FC_CACHEDIR) ||
+           !FcConfigAddCacheDir (config, (FcChar8 *) "~/.fontconfig"))
+       {
+           fprintf (stderr,
+                    "Fontconfig error: out of memory");
+           FcConfigDestroy (config);
+           return FcInitFallbackConfig ();
+       }
+    }
+
+    return config;
+}
+
+/*
+ * Load the configuration files and scan for available fonts
+ */
+FcConfig *
+FcInitLoadConfigAndFonts (void)
+{
+    FcConfig   *config = FcInitLoadConfig ();
+
+    FcInitDebug ();
+    if (!config)
+       return 0;
+    if (!FcConfigBuildFonts (config))
+    {
+       FcConfigDestroy (config);
+       return 0;
+    }
+    return config;
+}
+
+/*
+ * Initialize the default library configuration
+ */
+FcBool
+FcInit (void)
+{
+    FcConfig   *config;
+
+    if (_fcConfig)
+       return FcTrue;
+    config = FcInitLoadConfigAndFonts ();
+    if (!config)
+       return FcFalse;
+    FcConfigSetCurrent (config);
+    if (FcDebug() & FC_DBG_MEMORY)
+       FcMemReport ();
+    return FcTrue;
+}
+
+/*
+ * Free all library-allocated data structures.
+ */
+void
+FcFini (void)
+{
+    if (_fcConfig)
+       FcConfigDestroy (_fcConfig);
+
+    FcPatternFini ();
+    FcCacheFini ();
+    if (FcDebug() & FC_DBG_MEMORY)
+       FcMemReport ();
+}
+
+/*
+ * Reread the configuration and available font lists
+ */
+FcBool
+FcInitReinitialize (void)
+{
+    FcConfig   *config;
+
+    config = FcInitLoadConfigAndFonts ();
+    if (!config)
+       return FcFalse;
     FcConfigSetCurrent (config);
     return FcTrue;
 }
 
 FcBool
-FcInit (void)
+FcInitBringUptoDate (void)
 {
-    return FcInitConfig () && FcInitFonts ();
+    FcConfig   *config = FcConfigGetCurrent ();
+    time_t     now;
+
+    /*
+     * rescanInterval == 0 disables automatic up to date
+     */
+    if (config->rescanInterval == 0)
+       return FcTrue;
+    /*
+     * Check no more often than rescanInterval seconds
+     */
+    now = time (0);
+    if (config->rescanTime + config->rescanInterval - now > 0)
+       return FcTrue;
+    /*
+     * If up to date, don't reload configuration
+     */
+    if (FcConfigUptoDate (0))
+       return FcTrue;
+    return FcInitReinitialize ();
 }
 
 static struct {
-    char    *name;
+    char    name[16];
     int            alloc_count;
     int            alloc_mem;
     int            free_count;
     int            free_mem;
 } FcInUse[FC_MEM_NUM] = {
-    { "charset", 0, 0 },
-    { "charnode", 0 ,0 },
-    { "fontset", 0, 0 },
-    { "fontptr", 0, 0 },
-    { "objectset", 0, 0 },
-    { "objectptr", 0, 0 },
-    { "matrix", 0, 0 },
-    { "pattern", 0, 0 },
-    { "patelt", 0, 0 },
-    { "vallist", 0, 0 },
-    { "substate", 0, 0 },
-    { "string", 0, 0 },
-    { "listbuck", 0, 0 },
+    { "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;
@@ -127,13 +239,13 @@ FcMemReport (void)
     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 ("\t%8.8s%8d%8d%8d%8d%8d%8d\n",
+       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 ("\t%8.8s%8d%8d%8d%8d%8d%8d\n",
+    printf ("%16.16s%8d%8d%8d%8d%8d%8d\n",
            "Total",
            FcAllocCount, FcAllocMem,
            FcFreeCount, FcFreeMem,
@@ -172,3 +284,6 @@ FcMemFree (int kind, int size)
            FcMemReport ();
     }
 }
+#define __fcinit__
+#include "fcaliastail.h"
+#undef __fcinit__