/*
- * $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
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
*
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);
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 == ' ')
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;
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]);
}
}
+ /*
+ * 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
*/
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"
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);