]> git.wh0rd.org - fontconfig.git/blobdiff - fc-lang/fc-lang.c
Change files from ISO-Latin-1 to UTF-8
[fontconfig.git] / fc-lang / fc-lang.c
index da4b3ed36d7990bbb553118ce911676a0fd6e6e5..e88d75fe0ccb8a0b6e4654543710d6638c7ddc49 100644 (file)
@@ -1,7 +1,7 @@
 /*
- * $XFree86: xc/lib/fontconfig/fc-lang/fc-lang.c,v 1.3 2002/08/22 07:36:43 keithp Exp $
+ * $RCSId: xc/lib/fontconfig/fc-lang/fc-lang.c,v 1.3 2002/08/22 07:36:43 keithp Exp $
  *
- * Copyright © 2002 Keith Packard, member of The XFree86 Project, Inc.
+ * Copyright © 2002 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
@@ -75,6 +75,26 @@ get_line (FILE *f, char *line, int *lineno)
     return line;
 }
 
+char   *dir = 0;
+
+static FILE *
+scanopen (char *file)
+{
+    FILE    *f;
+
+    f = fopen (file, "r");
+    if (!f && dir)
+    {
+       char    path[1024];
+       
+       strcpy (path, dir);
+       strcat (path, "/");
+       strcat (path, file);
+       f = fopen (path, "r");
+    }
+    return f;
+}
+
 /*
  * build a single charset from a source file
  *
@@ -103,7 +123,7 @@ scan (FILE *f, char *file)
            end = strlen (file);
            if (file[end-1] == '\n')
                file[end-1] = '\0';
-           f = fopen (file, "r");
+           f = scanopen (file);
            if (!f)
                fatal (file, 0, "can't open");
            c = scan (f, file);
@@ -164,8 +184,8 @@ get_lang (char *name)
 
     while ((c = *name++))
     {
-       if (isupper (c))
-           c = tolower (c);
+       if (isupper ((int) (unsigned char) c))
+           c = tolower ((int) (unsigned char) c);
        if (c == '_')
            c = '-';
        if (c == ' ')
@@ -207,9 +227,17 @@ main (int argc, char **argv)
     char       line[1024];
     FcChar32   map[MAX_LANG_SET_MAP];
     int                num_lang_set_map;
+    int                setRangeStart[26];
+    int                setRangeEnd[26];
+    FcChar8    setRangeChar;
     
     while (*++argv)
     {
+       if (!strcmp (*argv, "-d"))
+       {
+           dir = *++argv;
+           continue;
+       }
        if (i == MAX_LANG)
            fatal (*argv, 0, "Too many languages");
        files[i++] = *argv;
@@ -219,7 +247,7 @@ main (int argc, char **argv)
     i = 0;
     while (files[i])
     {
-       f = fopen (files[i], "r");
+       f = scanopen (files[i]);
        if (!f)
            fatal (files[i], 0, strerror (errno));
        sets[i] = scan (f, files[i]);
@@ -299,6 +327,21 @@ main (int argc, char **argv)
            }
     }
 
+    /*
+     * Find ranges for each letter for faster searching
+     */
+    setRangeChar = 'a';
+    for (i = 0; sets[i]; i++)
+    {
+       char    c = names[i][0];
+       
+       while (setRangeChar <= c && c <= 'z')
+           setRangeStart[setRangeChar++ - 'a'] = i;
+    }
+    for (setRangeChar = 'a'; setRangeChar < 'z'; setRangeChar++)
+       setRangeEnd[setRangeChar - 'a'] = setRangeStart[setRangeChar+1-'a'] - 1;
+    setRangeEnd[setRangeChar - 'a'] = i - 1;
+    
     /*
      * Dump arrays
      */
@@ -343,13 +386,16 @@ main (int argc, char **argv)
        printf ("};\n\n");
     }
     printf ("#undef L\n\n");
+    
     /*
      * Dump sets
      */
+
     printf ("static const FcLangCharSet  fcLangCharSets[] = {\n");
     for (i = 0; sets[i]; i++)
     {
        int     j = duplicate[i];
+
        if (j < 0)
            j = i;
        printf ("    { (FcChar8 *) \"%s\",\n"
@@ -404,6 +450,19 @@ main (int argc, char **argv)
        printf ("#define NUM_COUNTRY_SET %d\n", ncountry_ent);
     }
     
+
+    /*
+     * Dump sets start/finish for the fastpath
+     */
+    printf ("static const FcLangCharSetRange  fcLangCharSetRanges[] = {\n");
+    for (setRangeChar = 'a'; setRangeChar <= 'z' ; setRangeChar++)
+    {
+       printf ("    { %d, %d }, /* %c */\n",
+               setRangeStart[setRangeChar - 'a'],
+               setRangeEnd[setRangeChar - 'a'], setRangeChar);
+    }
+    printf ("};\n\n");
     while (fgets (line, sizeof (line), stdin))
        fputs (line, stdout);