]> git.wh0rd.org - fontconfig.git/blobdiff - src/fccfg.c
[xml] Allocate FcExpr's in a pool in FcConfig
[fontconfig.git] / src / fccfg.c
index 95c50162d0959cf93917996182e8d3cf0c1225ee..0f89b57a415f61cca22418e8cdcc52fd82c7bccd 100644 (file)
@@ -93,6 +93,8 @@ FcConfigCreate (void)
     config->rescanTime = time(0);
     config->rescanInterval = 30;    
 
+    config->expr_pool = NULL;
+
     config->ref = 1;
     
     return config;
@@ -193,6 +195,26 @@ FcSubstDestroy (FcSubst *s)
     }
 }
 
+FcExpr *
+FcConfigAllocExpr (FcConfig *config)
+{
+  if (!config->expr_pool || config->expr_pool->next == config->expr_pool->end)
+  {
+    FcExprPage *new_page;
+
+    new_page = malloc (sizeof (FcExprPage));
+    if (!new_page)
+      return 0;
+    FcMemAlloc (FC_MEM_EXPR, sizeof (FcExprPage));
+
+    new_page->next_page = config->expr_pool;
+    new_page->next = new_page->exprs;
+    config->expr_pool = new_page;
+  }
+
+  return config->expr_pool->next++;
+}
+
 FcConfig *
 FcConfigReference (FcConfig *config)
 {
@@ -212,6 +234,7 @@ void
 FcConfigDestroy (FcConfig *config)
 {
     FcSetName  set;
+    FcExprPage *page;
 
     if (--config->ref > 0)
        return;
@@ -238,6 +261,15 @@ FcConfigDestroy (FcConfig *config)
        if (config->fonts[set])
            FcFontSetDestroy (config->fonts[set]);
 
+    page = config->expr_pool;
+    while (page)
+    {
+      FcExprPage *next = page->next_page;
+      FcMemFree (FC_MEM_EXPR, sizeof (FcExprPage));
+      free (page);
+      page = next;
+    }
+
     free (config);
     FcMemFree (FC_MEM_CONFIG, sizeof (FcConfig));
 }