]> git.wh0rd.org - fontconfig.git/blobdiff - src/fcxml.c
fc-cache: add a --root option
[fontconfig.git] / src / fcxml.c
index 1aa3e4c1c0809d8f2a5c57d78972094ed507f615..bf6dbfbd14d410eb037a69ef57b14a0c34307947 100644 (file)
@@ -1148,10 +1148,13 @@ FcParseBlank (FcConfigParse *parse)
                goto bail;
            break;
        case FcVStackRange:
-           for (i = v->u.range.begin; i <= v->u.range.end; i++)
+           if (v->u.range.begin <= v->u.range.end)
            {
-               if (!FcBlanksAdd (parse->config->blanks, i))
-                   goto bail;
+             for (i = v->u.range.begin; i <= v->u.range.end; i++)
+             {
+                 if (!FcBlanksAdd (parse->config->blanks, i))
+                     goto bail;
+             }
            }
            break;
        default:
@@ -1428,14 +1431,17 @@ FcParseCharSet (FcConfigParse *parse)
                n++;
            break;
        case FcVStackRange:
-           for (i = vstack->u.range.begin; i <= vstack->u.range.end; i++)
+           if (vstack->u.range.begin <= vstack->u.range.end)
            {
-               if (!FcCharSetAddChar (charset, i))
-               {
-                   FcConfigMessage (parse, FcSevereWarning, "invalid character: 0x%04x", i);
-               }
-               else
-                   n++;
+             for (i = vstack->u.range.begin; i <= vstack->u.range.end; i++)
+             {
+                 if (!FcCharSetAddChar (charset, i))
+                 {
+                     FcConfigMessage (parse, FcSevereWarning, "invalid character: 0x%04x", i);
+                 }
+                 else
+                     n++;
+             }
            }
            break;
        default:
@@ -2597,11 +2603,20 @@ FcConfigParseAndLoadDir (FcConfig       *config,
     DIR                    *d;
     struct dirent   *e;
     FcBool         ret = FcTrue;
+    FcChar8        *fullDir;
+    const FcChar8   *scanDir;
     FcChar8        *file;
     FcChar8        *base;
     FcStrSet       *files;
 
-    d = opendir ((char *) dir);
+    fullDir = FcConfigGetRootPlus (config, dir);
+    if (fullDir)
+       scanDir = fullDir;
+    else
+       scanDir = dir;
+    d = opendir ((char *) scanDir);
+    if (fullDir)
+       FcStrFree (fullDir);
     if (!d)
     {
        if (complain)
@@ -2679,6 +2694,8 @@ FcConfigParseAndLoad (FcConfig        *config,
 
     XML_Parser     p;
     FcChar8        *filename;
+    const FcChar8   *readFile;
+    FcChar8        *fullFile;
     int                    fd;
     int                    len;
     FcConfigParse   parse;
@@ -2691,7 +2708,7 @@ FcConfigParseAndLoad (FcConfig        *config,
     void           *buf;
 #endif
 
-    filename = FcConfigFilename (name);
+    filename = FcConfigFilename2 (config, name);
     if (!filename)
        goto bail0;
 
@@ -2707,7 +2724,7 @@ FcConfigParseAndLoad (FcConfig        *config,
        goto bail0;
     }
 
-    if (FcFileIsDir (filename))
+    if (FcFileIsDir2 (config, filename))
     {
        FcBool ret = FcConfigParseAndLoadDir (config, name, filename, complain);
        FcStrFree (filename);
@@ -2717,7 +2734,14 @@ FcConfigParseAndLoad (FcConfig       *config,
     if (FcDebug () & FC_DBG_CONFIG)
        printf ("\tLoading config file %s\n", filename);
 
-    fd = open ((char *) filename, O_RDONLY);
+    fullFile = FcConfigGetRootPlus (config, filename);
+    if (fullFile)
+       readFile = fullFile;
+    else
+       readFile = filename;
+    fd = open ((char *) readFile, O_RDONLY);
+    if (fullFile)
+       FcStrFree (fullFile);
     if (fd == -1) {
        FcStrFree (filename);
        goto bail0;