summaryrefslogtreecommitdiff
path: root/pango
diff options
context:
space:
mode:
authorOwen Taylor <otaylor@redhat.com>2000-06-30 22:08:26 +0000
committerOwen Taylor <otaylor@src.gnome.org>2000-06-30 22:08:26 +0000
commitb49e8181c16e91afc0b2e771243f9adab9bc8b5d (patch)
treef3b463eec927649a43bd0b22464a5118f0b0d4a7 /pango
parent036da71c38c9d81a087f20079cc7b96154fc5a3c (diff)
downloadpango-b49e8181c16e91afc0b2e771243f9adab9bc8b5d.tar.gz
A bunch of simple functions for reading from files, manipulating strings
Fri Jun 30 16:46:31 2000 Owen Taylor <otaylor@redhat.com> * pango/pango-utils.[ch] Makefile.am: A bunch of simple functions for reading from files, manipulating strings as necessary for config files. Also, a simple gnome-config/win.ini style config file reader. * pango/modules.c: Remove DOTFILES stuff. Instead, read names of modules file from pangorc. (Which can be set from PANGO_RC_FILE). Rewrite parsing code using pango-utils.c. * pango/pangox-fontmap.c: Read list of files from PangoX/AliasFiles key. Rewrite parsing code for alias files using pango-utils.c. * examples/pangox.aliases: Move to new name from pangox_aliases, reformat using new parsing code. * examples/pangorc (AliasFiles) examples/pango-viewer: Add a pangorc file for in-place testing. * pango/querymodules.c (main): Add comment to the top of the output indicating that the file should not be hand-edited.
Diffstat (limited to 'pango')
-rw-r--r--pango/Makefile.am6
-rw-r--r--pango/modules.c220
-rw-r--r--pango/pangox-fontmap.c254
-rw-r--r--pango/querymodules.c80
4 files changed, 231 insertions, 329 deletions
diff --git a/pango/Makefile.am b/pango/Makefile.am
index ea86de71..ee0961bc 100644
--- a/pango/Makefile.am
+++ b/pango/Makefile.am
@@ -1,7 +1,7 @@
## Process this file with automake to create Makefile.in.
-INCLUDES=-DDOTMODULEDIR=\"$(sysconfdir)/pango\" -DSYSCONFDIR=\"$(sysconfdir)\" \
- -DLOCALSTATEDIR=\"$(localstatedir)\" -I$(top_srcdir)
+INCLUDES=-DSYSCONFDIR=\"$(sysconfdir)\" -DLIBDIR=\"$(libdir)\"
+ -I$(top_srcdir)
lib_LTLIBRARIES = libpango.la libpangox.la
bin_PROGRAMS = pango-querymodules
@@ -20,6 +20,7 @@ libpango_la_SOURCES = \
pango-fontmap.c \
pango-item.c \
pango-layout.c \
+ pango-utils.c \
reorder-items.c \
shape.c
@@ -53,6 +54,7 @@ pangoinclude_HEADERS = \
pango-layout.h \
pango-modules.h \
pango-types.h \
+ pango-utils.h \
pangox.h
#
diff --git a/pango/modules.c b/pango/modules.c
index fcd42813..b7572aac 100644
--- a/pango/modules.c
+++ b/pango/modules.c
@@ -22,12 +22,13 @@
#include <ctype.h>
#include <stdio.h>
#include <string.h>
-#include <dirent.h>
#include <limits.h>
+#include <errno.h>
#include <gmodule.h>
#include "pango-modules.h"
+#include "pango-utils.h"
#include "modules.h"
typedef struct _PangoMapInfo PangoMapInfo;
@@ -165,31 +166,6 @@ pango_engine_pair_get_engine (PangoEnginePair *pair)
return pair->engine;
}
-
-static char *
-readline(FILE *file)
-{
- static GString *bufstring = NULL;
- int c;
-
- if (!bufstring)
- bufstring = g_string_new (NULL);
- else
- g_string_truncate (bufstring, 0);
-
- while ((c = getc(file)) != EOF)
- {
- g_string_append_c (bufstring, c);
- if (c == '\n')
- break;
- }
-
- if (bufstring->len == 0)
- return NULL;
- else
- return g_strdup (bufstring->str);
-}
-
static void
add_included_modules (void)
{
@@ -217,87 +193,88 @@ add_included_modules (void)
}
static gboolean /* Returns true if succeeded, false if failed */
-process_module_file(FILE *module_file)
+process_module_file (FILE *module_file)
{
- char *line;
+ GString *line_buf = g_string_new (NULL);
+ GString *tmp_buf = g_string_new (NULL);
+ gboolean have_error = FALSE;
- while ((line = readline (module_file)))
+ while (pango_read_line (module_file, line_buf))
{
PangoEnginePair *pair = g_new (PangoEnginePair, 1);
PangoEngineRange *range;
- GList *ranges;
+ GList *ranges = NULL;
GList *tmp_list;
- char *p, *q;
+
+ const char *p, *q;
int i;
- int start;
- int end;
+ int start, end;
pair->included = FALSE;
- p = line;
- q = line;
- ranges = NULL;
+ p = line_buf->str;
+
+ if (!pango_skip_space (&p))
+ continue;
/* Break line into words on whitespace */
i = 0;
while (1)
{
- if (!*p || isspace(*p))
+ if (!pango_scan_string (&p, tmp_buf))
{
- switch (i)
- {
- case 0:
- pair->load_info = g_strndup (q, p-q);
- break;
- case 1:
- pair->info.id = g_strndup (q, p-q);
- break;
- case 2:
- pair->info.engine_type = g_strndup (q, p-q);
- break;
- case 3:
- pair->info.render_type = g_strndup (q, p-q);
- break;
- default:
- range = g_new (PangoEngineRange, 1);
- if (sscanf(q, "%d-%d:", &start, &end) != 2)
- {
- fprintf(stderr, "Error reading pango.modules");
- return FALSE;
- }
- q = strchr (q, ':');
- if (!q)
- {
- fprintf(stderr, "Error reading pango.modules");
- return FALSE;
- }
- q++;
- range->start = start;
- range->end = end;
- range->langs = g_strndup (q, p-q);
+ have_error = TRUE;
+ goto error;
+ }
- ranges = g_list_prepend (ranges, range);
+ switch (i)
+ {
+ case 0:
+ pair->load_info = g_strdup (tmp_buf->str);
+ break;
+ case 1:
+ pair->info.id = g_strdup (tmp_buf->str);
+ break;
+ case 2:
+ pair->info.engine_type = g_strdup (tmp_buf->str);
+ break;
+ case 3:
+ pair->info.render_type = g_strdup (tmp_buf->str);
+ break;
+ default:
+ range = g_new (PangoEngineRange, 1);
+ if (sscanf(tmp_buf->str, "%d-%d:", &start, &end) != 2)
+ {
+ fprintf(stderr, "Error reading modules file");
+ have_error = TRUE;
+ goto error;
+ }
+ q = strchr (tmp_buf->str, ':');
+ if (!q)
+ {
+ fprintf(stderr, "Error reading modules file");
+ have_error = TRUE;
+ goto error;
}
+ q++;
+ range->start = start;
+ range->end = end;
+ range->langs = g_strdup (tmp_buf->str);
- i++;
-
- do
- p++;
- while (*p && isspace(*p));
-
- if (!*p)
- break;
-
- q = p;
+ ranges = g_list_prepend (ranges, range);
}
- else
- p++;
- }
+ if (!pango_skip_space (&p))
+ break;
+
+ i++;
+ }
+
if (i<3)
{
- fprintf(stderr, "Error reading pango.modules");
- return FALSE;
+ fprintf(stderr, "Error reading modules file");
+ have_error = TRUE;
+ goto error;
}
ranges = g_list_reverse (ranges);
@@ -311,13 +288,19 @@ process_module_file(FILE *module_file)
tmp_list = tmp_list->next;
}
+ pair->engine = NULL;
+
+ engines = g_list_prepend (engines, pair);
+
+ error:
g_list_foreach (ranges, (GFunc)g_free, NULL);
g_list_free (ranges);
- g_free (line);
-
- pair->engine = NULL;
- engines = g_list_prepend (engines, pair);
+ if (have_error)
+ {
+ g_free(pair);
+ return FALSE;
+ }
}
return TRUE;
@@ -327,57 +310,32 @@ static void
read_modules (void)
{
FILE *module_file;
- gboolean read_module_file = FALSE;
- /* FIXME FIXME FIXME - this is a potential security problem from leaving
- * pango.modules files scattered around to trojan modules.
- */
- module_file = fopen ("pango.modules", "r");
- if(module_file)
- {
- read_module_file = read_module_file || process_module_file(module_file);
- process_module_file(module_file);
- fclose(module_file);
- }
- else
- {
- DIR *dirh;
-
- dirh = opendir(DOTMODULEDIR);
- if(dirh)
- {
- struct dirent *dent;
+ char *file_str = pango_config_key_get ("Pango/ModuleFiles");
+ char **files;
+ int n;
- while((dent = readdir(dirh)))
- {
- char fullfn[PATH_MAX];
- char *ctmp;
+ if (!file_str)
+ file_str = g_strdup (SYSCONFDIR "/pango/pango.modules");
- if(dent->d_name[0] == '.')
- continue;
+ files = pango_split_file_list (file_str);
- ctmp = strrchr(dent->d_name, '.');
- if(!ctmp || strcmp(ctmp, ".modules") != 0)
- continue;
+ n = 0;
+ while (files[n])
+ n++;
- g_snprintf(fullfn, sizeof(fullfn), DOTMODULEDIR "/%s", dent->d_name);
- module_file = fopen(fullfn, "r");
- if(module_file)
- {
- read_module_file = read_module_file || process_module_file(module_file);
- fclose(module_file);
- }
- }
- }
+ while (n-- > 0)
+ {
+ module_file = fopen (files[n], "r");
+ if (!module_file)
+ g_warning ("Error opening module file '%s': %s\n", files[n], g_strerror (errno));
- closedir(dirh);
+ process_module_file(module_file);
+ fclose(module_file);
}
- if (!read_module_file)
- {
- fprintf(stderr, "Could not load any module files!\n");
- /* FIXME: Error */
- }
+ g_strfreev (files);
+ g_free (file_str);
}
static void
diff --git a/pango/pangox-fontmap.c b/pango/pangox-fontmap.c
index 7f20a52a..6b0c90bb 100644
--- a/pango/pangox-fontmap.c
+++ b/pango/pangox-fontmap.c
@@ -26,6 +26,7 @@
#include <errno.h>
#include "pango-fontmap.h"
+#include "pango-utils.h"
#include "pangox-private.h"
#define PANGO_TYPE_X_FONT_MAP (pango_x_font_map_get_type ())
@@ -546,129 +547,31 @@ pango_x_font_map_load_font (PangoFontMap *fontmap,
return result;
}
-/* Similar to GNU libc's getline, but buffer is g_malloc'd */
-static size_t
-pango_getline (char **lineptr, size_t *n, FILE *stream)
-{
-#define EXPAND_CHUNK 16
-
- int n_read = 0;
- int result = -1;
-
- g_return_val_if_fail (lineptr != NULL, -1);
- g_return_val_if_fail (n != NULL, -1);
- g_return_val_if_fail (*lineptr != NULL || *n == 0, -1);
-
-#ifdef HAVE_FLOCKFILE
- flockfile (stream);
-#endif
-
- while (1)
- {
- int c;
-
-#ifdef HAVE_FLOCKFILE
- c = getc_unlocked (stream);
-#else
- c = getc (stream);
-#endif
-
- if (c == EOF)
- {
- if (n_read > 0)
- {
- result = n_read;
- (*lineptr)[n_read] = '\0';
- }
- break;
- }
-
- if (n_read + 2 >= *n)
- {
- *n += EXPAND_CHUNK;
- *lineptr = g_realloc (*lineptr, *n);
- }
-
- (*lineptr)[n_read] = c;
- n_read++;
-
- if (c == '\n' || c == '\r')
- {
- result = n_read;
- (*lineptr)[n_read] = '\0';
- break;
- }
- }
-
-#ifdef HAVE_FLOCKFILE
- funlockfile (stream);
-#endif
-
- return n_read - 1;
-}
-
-static int
-find_tok (char **start, char **tok)
-{
- char *p = *start;
-
- while (*p && (*p == ' ' || *p == '\t'))
- p++;
-
- if (*p == 0 || *p == '\n' || *p == '\r')
- return -1;
-
- if (*p == '"')
- {
- p++;
- *tok = p;
-
- while (*p && *p != '"')
- p++;
-
- if (*p != '"')
- return -1;
-
- *start = p + 1;
- return p - *tok;
- }
- else
- {
- *tok = p;
-
- while (*p && *p != ' ' && *p != '\t' && *p != '\r' && *p != '\n')
- p++;
-
- *start = p;
- return p - *tok;
- }
-}
-
static gboolean
-get_style (char *tok, int toksize, PangoFontDescription *desc)
+get_style (GString *str, PangoFontDescription *desc)
{
- if (toksize == 0)
+ if (str->len == 0)
return FALSE;
- switch (tok[0])
+ switch (str->str[0])
{
case 'n':
case 'N':
- if (strncasecmp (tok, "normal", toksize) == 0)
+ if (strncasecmp (str->str, "normal", str->len) == 0)
{
desc->style = PANGO_STYLE_NORMAL;
return TRUE;
}
break;
case 'i':
- if (strncasecmp (tok, "italic", toksize) == 0)
+ if (strncasecmp (str->str, "italic", str->len) == 0)
{
desc->style = PANGO_STYLE_ITALIC;
return TRUE;
}
break;
case 'o':
- if (strncasecmp (tok, "oblique", toksize) == 0)
+ if (strncasecmp (str->str, "oblique", str->len) == 0)
{
desc->style = PANGO_STYLE_OBLIQUE;
return TRUE;
@@ -681,16 +584,16 @@ get_style (char *tok, int toksize, PangoFontDescription *desc)
}
static gboolean
-get_variant (char *tok, int toksize, PangoFontDescription *desc)
+get_variant (GString *str, PangoFontDescription *desc)
{
- if (toksize == 0)
+ if (str->len == 0)
return FALSE;
- switch (tok[0])
+ switch (str->str[0])
{
case 'n':
case 'N':
- if (strncasecmp (tok, "normal", toksize) == 0)
+ if (strncasecmp (str->str, "normal", str->len) == 0)
{
desc->variant = PANGO_VARIANT_NORMAL;
return TRUE;
@@ -698,7 +601,7 @@ get_variant (char *tok, int toksize, PangoFontDescription *desc)
break;
case 's':
case 'S':
- if (strncasecmp (tok, "small_caps", toksize) == 0)
+ if (strncasecmp (str->str, "small_caps", str->len) == 0)
{
desc->variant = PANGO_VARIANT_SMALL_CAPS;
return TRUE;
@@ -711,16 +614,16 @@ get_variant (char *tok, int toksize, PangoFontDescription *desc)
}
static gboolean
-get_weight (char *tok, int toksize, PangoFontDescription *desc)
+get_weight (GString *str, PangoFontDescription *desc)
{
- if (toksize == 0)
+ if (str->len == 0)
return FALSE;
- switch (tok[0])
+ switch (str->str[0])
{
case 'n':
case 'N':
- if (strncasecmp (tok, "normal", toksize) == 0)
+ if (strncasecmp (str->str, "normal", str->len) == 0)
{
desc->weight = PANGO_WEIGHT_NORMAL;
return TRUE;
@@ -728,7 +631,7 @@ get_weight (char *tok, int toksize, PangoFontDescription *desc)
break;
case 'b':
case 'B':
- if (strncasecmp (tok, "bold", toksize) == 0)
+ if (strncasecmp (str->str, "bold", str->len) == 0)
{
desc->weight = PANGO_WEIGHT_BOLD;
return TRUE;
@@ -747,7 +650,7 @@ get_weight (char *tok, int toksize, PangoFontDescription *desc)
{
char *numstr, *end;
- numstr = g_strndup (tok, toksize);
+ numstr = g_strndup (str->str, str->len);
desc->weight = strtol (numstr, &end, 0);
if (*end != '\0')
@@ -767,16 +670,16 @@ get_weight (char *tok, int toksize, PangoFontDescription *desc)
}
static gboolean
-get_stretch (char *tok, int toksize, PangoFontDescription *desc)
+get_stretch (GString *str, PangoFontDescription *desc)
{
- if (toksize == 0)
+ if (str->len == 0)
return FALSE;
- switch (tok[0])
+ switch (str->str[0])
{
case 'c':
case 'C':
- if (strncasecmp (tok, "condensed", toksize) == 0)
+ if (strncasecmp (str->str, "condensed", str->len) == 0)
{
desc->stretch = PANGO_STRETCH_CONDENSED;
return TRUE;
@@ -784,17 +687,17 @@ get_stretch (char *tok, int toksize, PangoFontDescription *desc)
break;
case 'e':
case 'E':
- if (strncasecmp (tok, "extra_condensed", toksize) == 0)
+ if (strncasecmp (str->str, "extra_condensed", str->len) == 0)
{
desc->stretch = PANGO_STRETCH_EXTRA_CONDENSED;
return TRUE;
}
- if (strncasecmp (tok, "extra_expanded", toksize) == 0)
+ if (strncasecmp (str->str, "extra_expanded", str->len) == 0)
{
desc->stretch = PANGO_STRETCH_EXTRA_EXPANDED;
return TRUE;
}
- if (strncasecmp (tok, "expanded", toksize) == 0)
+ if (strncasecmp (str->str, "expanded", str->len) == 0)
{
desc->stretch = PANGO_STRETCH_EXPANDED;
return TRUE;
@@ -802,7 +705,7 @@ get_stretch (char *tok, int toksize, PangoFontDescription *desc)
break;
case 'n':
case 'N':
- if (strncasecmp (tok, "normal", toksize) == 0)
+ if (strncasecmp (str->str, "normal", str->len) == 0)
{
desc->stretch = PANGO_STRETCH_NORMAL;
return TRUE;
@@ -810,12 +713,12 @@ get_stretch (char *tok, int toksize, PangoFontDescription *desc)
break;
case 's':
case 'S':
- if (strncasecmp (tok, "semi_condensed", toksize) == 0)
+ if (strncasecmp (str->str, "semi_condensed", str->len) == 0)
{
desc->stretch = PANGO_STRETCH_SEMI_CONDENSED;
return TRUE;
}
- if (strncasecmp (tok, "semi_expanded", toksize) == 0)
+ if (strncasecmp (str->str, "semi_expanded", str->len) == 0)
{
desc->stretch = PANGO_STRETCH_SEMI_EXPANDED;
return TRUE;
@@ -823,12 +726,12 @@ get_stretch (char *tok, int toksize, PangoFontDescription *desc)
break;
case 'u':
case 'U':
- if (strncasecmp (tok, "ultra_condensed", toksize) == 0)
+ if (strncasecmp (str->str, "ultra_condensed", str->len) == 0)
{
desc->stretch = PANGO_STRETCH_ULTRA_CONDENSED;
return TRUE;
}
- if (strncasecmp (tok, "ultra_expanded", toksize) == 0)
+ if (strncasecmp (str->str, "ultra_expanded", str->len) == 0)
{
desc->variant = PANGO_STRETCH_ULTRA_EXPANDED;
return TRUE;
@@ -846,8 +749,6 @@ pango_x_font_map_read_alias_file (PangoXFontMap *xfontmap,
{
FILE *infile;
char **xlfds;
- char *buf = NULL;
- size_t bufsize = 0;
int lineno = 0;
int i;
PangoXFontEntry *font_entry = NULL;
@@ -855,78 +756,74 @@ pango_x_font_map_read_alias_file (PangoXFontMap *xfontmap,
infile = fopen (filename, "r");
if (infile)
{
- while (pango_getline (&buf, &bufsize, infile) != EOF)
+ GString *line_buf = g_string_new (NULL);
+ GString *tmp_buf = g_string_new (NULL);
+
+ while (pango_read_line (infile, line_buf))
{
PangoXFamilyEntry *family_entry;
- char *tok;
- char *p = buf;
+ const char *p = line_buf->str;
- int toksize;
lineno++;
- while (*p && (*p == ' ' || *p == '\t'))
- p++;
-
- if (*p == 0 || *p == '#' || *p == '\n' || *p == '\r')
+ if (!pango_skip_space (&p))
continue;
- toksize = find_tok (&p, &tok);
- if (toksize == -1)
+ if (!pango_scan_string (&p, tmp_buf))
goto error;
font_entry = g_new (PangoXFontEntry, 1);
font_entry->xlfd = NULL;
- font_entry->description.family_name = g_strndup (tok, toksize);
+ font_entry->description.family_name = g_strdup (tmp_buf->str);
g_strdown (font_entry->description.family_name);
- toksize = find_tok (&p, &tok);
- if (toksize == -1)
+ if (!pango_scan_string (&p, tmp_buf))
goto error;
- if (!get_style (tok, toksize, &font_entry->description))
+ if (!get_style (tmp_buf, &font_entry->description))
goto error;
- toksize = find_tok (&p, &tok);
- if (toksize == -1)
+ if (!pango_scan_string (&p, tmp_buf))
goto error;
- if (!get_variant (tok, toksize, &font_entry->description))
+ if (!get_variant (tmp_buf, &font_entry->description))
goto error;
- toksize = find_tok (&p, &tok);
- if (toksize == -1)
+ if (!pango_scan_string (&p, tmp_buf))
goto error;
- if (!get_weight (tok, toksize, &font_entry->description))
+ if (!get_weight (tmp_buf, &font_entry->description))
goto error;
- toksize = find_tok (&p, &tok);
- if (toksize == -1)
+ if (!pango_scan_string (&p, tmp_buf))
goto error;
- if (!get_stretch (tok, toksize, &font_entry->description))
+ if (!get_stretch (tmp_buf, &font_entry->description))
goto error;
- toksize = find_tok (&p, &tok);
- if (toksize == -1)
+ if (!pango_scan_string (&p, tmp_buf))
goto error;
- font_entry->xlfd = g_strndup (tok, toksize);
+ /* Remove excess whitespace and check for complete fields */
- /* Check for complete fields */
-
- xlfds = g_strsplit (font_entry->xlfd, ",", -1);
+ xlfds = g_strsplit (tmp_buf->str, ",", -1);
for (i=0; xlfds[i]; i++)
- if (!pango_x_is_xlfd_font_name (xlfds[i]))
- {
- g_warning ("XLFD '%s' must be complete (14 fields)", xlfds[i]);
- g_strfreev (xlfds);
- goto error;
- }
+ {
+ char *trimmed = pango_trim_string (xlfds[i]);
+ g_free (xlfds[i]);
+ xlfds[i] = trimmed;
+
+ if (!pango_x_is_xlfd_font_name (xlfds[i]))
+ {
+ g_warning ("XLFD '%s' must be complete (14 fields)", xlfds[i]);
+ g_strfreev (xlfds);
+ goto error;
+ }
+ }
+ font_entry->xlfd = g_strjoinv (",", xlfds);
g_strfreev (xlfds);
-
/* Insert the font entry into our structures */
@@ -958,9 +855,10 @@ pango_x_font_map_read_alias_file (PangoXFontMap *xfontmap,
g_warning ("Error parsing line %d of alias file '%s'", lineno, filename);
out:
- g_free (buf);
+ g_string_free (tmp_buf, TRUE);
+ g_string_free (line_buf, TRUE);
+
fclose (infile);
- return;
}
}
@@ -968,16 +866,24 @@ pango_x_font_map_read_alias_file (PangoXFontMap *xfontmap,
static void
pango_x_font_map_read_aliases (PangoXFontMap *xfontmap)
{
- char *filename;
+ char **files;
+ char *files_str = pango_config_key_get ("PangoX/AliasFiles");
+ int n;
+
+ if (!files_str)
+ files_str = g_strdup ("~/.pangox_aliases:" SYSCONFDIR "/pango/pangox.aliases");
- pango_x_font_map_read_alias_file (xfontmap, SYSCONFDIR "/pango/pangox_aliases");
+ files = pango_split_file_list (files_str);
+
+ n = 0;
+ while (files[n])
+ n++;
- filename = g_strconcat (g_get_home_dir(), "/.pangox_aliases", NULL);
- pango_x_font_map_read_alias_file (xfontmap, filename);
- g_free (filename);
+ while (n-- > 0)
+ pango_x_font_map_read_alias_file (xfontmap, files[n]);
- /* FIXME: Remove this one */
- pango_x_font_map_read_alias_file (xfontmap, "pangox_aliases");
+ g_strfreev (files);
+ g_free (files_str);
}
/*
diff --git a/pango/querymodules.c b/pango/querymodules.c
index 9ddddb3d..051b41d7 100644
--- a/pango/querymodules.c
+++ b/pango/querymodules.c
@@ -20,8 +20,10 @@
*/
#include <glib.h>
+#include <dirent.h>
#include <gmodule.h>
#include "pango.h"
+#include "pango-utils.h"
#include <errno.h>
#include <string.h>
@@ -29,13 +31,27 @@
#include <stdio.h>
void
-query_module (GModule *module, gchar *name)
+query_module (const char *dir, const char *name)
{
void (*list) (PangoEngineInfo **engines, gint *n_engines);
PangoEngine *(*load) (const gchar *id);
void (*unload) (PangoEngine *engine);
+
+ GModule *module;
+ gchar *path;
+
+ if (name[0] == G_DIR_SEPARATOR)
+ path = g_strdup (name);
+ else
+ path = g_strconcat (dir, G_DIR_SEPARATOR_S, name, NULL);
- if (g_module_symbol (module, "script_engine_list", (gpointer)&list) &&
+ module = g_module_open (path, 0);
+
+ if (!module)
+ fprintf(stderr, "Cannot load module %s: %s\n", path, g_module_error());
+
+ if (module &&
+ g_module_symbol (module, "script_engine_list", (gpointer)&list) &&
g_module_symbol (module, "script_engine_load", (gpointer)&load) &&
g_module_symbol (module, "script_engine_unload", (gpointer)&unload))
{
@@ -47,7 +63,7 @@ query_module (GModule *module, gchar *name)
for (i=0; i<n_engines; i++)
{
- g_print ("%s %s %s %s ", name, engines[i].id, engines[i].engine_type, engines[i].render_type);
+ g_print ("%s %s %s %s ", path, engines[i].id, engines[i].engine_type, engines[i].render_type);
for (j=0; j < engines[i].n_ranges; j++)
{
if (j != 0)
@@ -62,40 +78,60 @@ query_module (GModule *module, gchar *name)
}
else
{
- fprintf (stderr, "%s does not export Pango module API\n", name);
+ fprintf (stderr, "%s does not export Pango module API\n", path);
}
+
+ g_free (path);
+ g_module_close (module);
}
int main (int argc, char **argv)
{
char cwd[PATH_MAX];
int i;
+ char *path;
- getcwd (cwd, PATH_MAX);
+ printf ("# Pango Modules file\n"
+ "# Automatically generated file, do not edit\n"
+ "#\n");
- for (i=1; i<argc; i++)
+ if (argc == 1) /* No arguments given */
{
- GModule *module;
- gchar *tmp;
+ char **dirs;
+ int i;
- if (argv[i][0] == '/')
- tmp = g_strdup (argv[i]);
- else
- tmp = g_strconcat (cwd, "/", argv[i], NULL);
+ path = pango_config_key_get ("Pango/ModulesPath");
+ if (!path)
+ path = g_strdup (LIBDIR "/pango/modules");
- module = g_module_open (tmp, 0);
- if (module)
- {
- query_module (module, tmp);
- g_module_close (module);
- }
- else
+ printf ("# ModulesPath = %s\n#\n", path);
+
+ dirs = pango_split_file_list (path);
+
+ for (i=0; dirs[i]; i++)
{
- fprintf(stderr, "Cannot load module %s: %s\n",
- tmp, g_module_error());
+ DIR *dir = opendir (dirs[i]);
+ if (dir)
+ {
+ struct dirent *dent;
+
+ while ((dent = readdir (dir)))
+ {
+ int len = strlen (dent->d_name);
+ if (len > 3 && strcmp (dent->d_name + len - 3, ".so") == 0)
+ query_module (dirs[i], dent->d_name);
+ }
+
+ closedir (dir);
+ }
}
+ }
+ else
+ {
+ getcwd (cwd, PATH_MAX);
- g_free (tmp);
+ for (i=1; i<argc; i++)
+ query_module (cwd, argv[i]);
}
return 0;