PangoEngineInfo *engines;
PangoliteEngineInfo *engines;
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);    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))    {      gint i,j;      PangoEngineInfo *engines;      gint n_engines;      (*list) (&engines, &n_engines);      for (i=0; i<n_engines; i++)	{	  const gchar *quote;	  gchar *quoted_path;	  if (strchr (path, ' ') != NULL)	    {	      quote = "\"";	      quoted_path = g_strescape (path, NULL);	    }	  else	    {	      quote = "";	      quoted_path = g_strdup (path);	    }	  	  g_print ("%s%s%s %s %s %s ", quote, quoted_path, quote,		   engines[i].id, engines[i].engine_type, engines[i].render_type);	  g_free (quoted_path);	  for (j=0; j < engines[i].n_ranges; j++)	    {	      if (j != 0)		g_print (" ");	      g_print ("%d-%d:%s",		       engines[i].ranges[j].start,		       engines[i].ranges[j].end,		       engines[i].ranges[j].langs);	    }	  g_print ("\n");	  }    }  else    {      fprintf (stderr, "%s does not export Pango module API\n", path);    }  g_free (path);  if (module)    g_module_close (module);}		       