⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 querymodules.c

📁 Pango is a library for layout and rendering of text, with an emphasis on internationalization. Pang
💻 C
字号:
/* Pango * querymodules.c: * * Copyright (C) 1999 Red Hat Software * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Library General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.	 See the GNU * Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with this library; if not, write to the * Free Software Foundation, Inc., 59 Temple Place - Suite 330, * Boston, MA 02111-1307, USA. */#include <stdlib.h>#include <config.h>#include <glib.h>#include <gmodule.h>#include "pango-break.h"#include "pango-context.h"#include "pango-impl-utils.h"#include "pango-engine.h"#include "pango-enum-types.h"#include <errno.h>#include <string.h>#ifdef HAVE_UNISTD_H#include <unistd.h>#endif#include <glib/gprintf.h>#ifdef USE_LA_MODULES#define SOEXT ".la"#else#define SOEXT ("." G_MODULE_SUFFIX)#endif#define SOEXT_LEN ((int) strlen (SOEXT))static gbooleanstring_needs_escape (const char *str){  while (TRUE)    {      char c = *str++;      if (!c)	return FALSE;      else if (c == '\"' || c == '\\' || g_ascii_isspace (c))	return TRUE;    }}static char *escape_string (const char *str){  GString *result = g_string_new (NULL);  while (TRUE)    {      char c = *str++;      switch (c)	{	case '\0':	  goto done;	case '\n':	  g_string_append (result, "\\n");	  break;	case '\"':	  g_string_append (result, "\\\"");	  break;	case '\\':	  g_string_append (result, "\\\\");	  break;	default:	  g_string_append_c (result, c);	}    } done:  return g_string_free (result, FALSE);}#define GET_SYMBOL(module,name,location)                 \  g_module_symbol (module, name, (gpointer *)(void *)&location)static const char *string_from_script (PangoScript script){  static GEnumClass *class = NULL;  GEnumValue *value;  if (!class)    class = g_type_class_ref (PANGO_TYPE_SCRIPT);  value = g_enum_get_value (class, script);  if (!value)    {      g_warning ("Engine reported invalid script value %d\n", script);      return string_from_script (PANGO_SCRIPT_INVALID_CODE);    }  return value->value_nick;}static voidquery_module (const char *dir, const char *name){  void (*list) (PangoEngineInfo **engines, gint *n_engines);  void (*init) (GTypeModule *module);  void (*exit) (void);  PangoEngine *(*create) (const gchar *id);  GModule *module;  gchar *path;  if (g_path_is_absolute (name))    path = g_strdup (name);  else    path = g_build_filename (dir, name, NULL);  module = g_module_open (path, G_MODULE_BIND_LAZY | G_MODULE_BIND_LOCAL);  if (!module)    g_printerr ("Cannot load module %s: %s\n", path, g_module_error ());  if (module &&      GET_SYMBOL (module, "script_engine_list", list) &&      GET_SYMBOL (module, "script_engine_init", init) &&      GET_SYMBOL (module, "script_engine_exit", exit) &&      GET_SYMBOL (module, "script_engine_create", create))    {      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 (string_needs_escape (path))	    {	      quote = "\"";	      quoted_path = escape_string (path);	    }	  else	    {	      quote = "";	      quoted_path = g_strdup (path);	    }	  g_printf ("%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_scripts; j++)	    {	      g_printf (" %s:%s",			string_from_script (engines[i].scripts[j].script),			engines[i].scripts[j].langs);	    }	  g_printf ("\n");	}    }  else    {      g_printerr ("%s does not export Pango module API\n", path);    }  g_free (path);  if (module)    g_module_close (module);}static gbooleanshow_version(const char *name,	     const char *arg,	     gpointer    data,	     GError    **error){  g_printf("pango-querymodules (%s) %s\n", PACKAGE_NAME, PACKAGE_VERSION);  g_printf("module interface version: %s\n", MODULE_VERSION);  exit(0);}intmain (int argc, char **argv){  char *cwd;  int i;  char *path;  GOptionContext *context;  GError *parse_error = NULL;  GOptionEntry entries[] =    {      {"version",	0, G_OPTION_FLAG_NO_ARG, G_OPTION_ARG_CALLBACK, &show_version,       "Show version numbers",                                             NULL},      {NULL}    };  context = g_option_context_new ("- [MODULE]...");  g_option_context_add_main_entries (context, entries, NULL);  if (!g_option_context_parse (context, &argc, &argv, &parse_error))    {      if (parse_error != NULL)	{	  g_printerr("Parse option error: %s\n", parse_error->message);	}      else	{	  g_printerr("Parse option error\n");	}      exit(1);    }  g_option_context_free(context);  g_type_init ();  g_printf ("# Pango Modules file\n"	    "# Automatically generated file, do not edit\n"	    "#\n");  if (argc == 1)		/* No arguments given */    {      char **dirs;      int i;      path = pango_config_key_get ("Pango/ModulesPath");      if (!path)	path = g_build_filename (pango_get_lib_subdirectory (),				 MODULE_VERSION,				 "modules",				 NULL);      g_printf ("# ModulesPath = %s\n#\n", path);      dirs = pango_split_file_list (path);      g_free (path);      for (i=0; dirs[i]; i++)	{	  GDir *dir = g_dir_open (dirs[i], 0, NULL);	  if (dir)	    {	      const char *dent;	      while ((dent = g_dir_read_name (dir)))		{		  int len = strlen (dent);		  if (len > SOEXT_LEN && strcmp (dent + len - SOEXT_LEN, SOEXT) == 0)		    query_module (dirs[i], dent);		}	      g_dir_close (dir);	    }	}      g_strfreev (dirs);    }  else    {      cwd = g_get_current_dir ();      for (i=1; i<argc; i++)	query_module (cwd, argv[i]);      g_free (cwd);    }  return 0;}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -