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

📄 gutils.c

📁 嵌入式下基于MiniGUI的Web Browser
💻 C
📖 第 1 页 / 共 2 页
字号:
      return (gchar *)file_name;    }#ifdef G_OS_WIN32  /* Skip X:\ */  if (g_ascii_isalpha (file_name[0]) && file_name[1] == ':' && file_name[2] == G_DIR_SEPARATOR)    return (gchar *)file_name + 3;#endif  return NULL;}gchar*g_path_get_dirname (const gchar	   *file_name){  register gchar *base;  register gsize len;        g_return_val_if_fail (file_name != NULL, NULL);    base = strrchr (file_name, G_DIR_SEPARATOR);  if (!base)    return g_strdup (".");  while (base > file_name && *base == G_DIR_SEPARATOR)    base--;  len = (guint) 1 + base - file_name;    base = g_new (gchar, len + 1);  g_memmove (base, file_name, len);  base[len] = 0;    return base;}gchar*g_get_current_dir (void){  gchar *buffer = NULL;  gchar *dir = NULL;  static gulong max_len = 0;  if (max_len == 0)     max_len = (G_PATH_LENGTH == -1) ? 2048 : G_PATH_LENGTH;    /* We don't use getcwd(3) on SUNOS, because, it does a popen("pwd")   * and, if that wasn't bad enough, hangs in doing so.   */#if	(defined (sun) && !defined (__SVR4)) || !defined(HAVE_GETCWD)  buffer = g_new (gchar, max_len + 1);  *buffer = 0;  dir = getwd (buffer);#else	/* !sun || !HAVE_GETCWD */  while (max_len < G_MAXULONG / 2)    {      buffer = g_new (gchar, max_len + 1);      *buffer = 0;      dir = getcwd (buffer, max_len);      if (dir || errno != ERANGE)	break;      g_free (buffer);      max_len *= 2;    }#endif	/* !sun || !HAVE_GETCWD */    if (!dir || !*buffer)    {      /* hm, should we g_error() out here?       * this can happen if e.g. "./" has mode \0000       */      buffer[0] = G_DIR_SEPARATOR;      buffer[1] = 0;    }  dir = g_strdup (buffer);  g_free (buffer);    return dir;}G_CONST_RETURN gchar*g_getenv (const gchar *variable){#ifndef G_OS_WIN32  g_return_val_if_fail (variable != NULL, NULL);  return getenv (variable);#else  G_LOCK_DEFINE_STATIC (getenv);  struct env_struct  {    gchar *key;    gchar *value;  } *env;  static GArray *environs = NULL;  gchar *system_env;  guint length, i;  gchar dummy[2];  g_return_val_if_fail (variable != NULL, NULL);    G_LOCK (getenv);  if (!environs)    environs = g_array_new (FALSE, FALSE, sizeof (struct env_struct));  /* First we try to find the envinronment variable inside the already   * found ones.   */  for (i = 0; i < environs->len; i++)    {      env = &g_array_index (environs, struct env_struct, i);      if (strcmp (env->key, variable) == 0)	{	  g_assert (env->value);	  G_UNLOCK (getenv);	  return env->value;	}    }  /* If not found, we ask the system */  system_env = getenv (variable);  if (!system_env)    {      G_UNLOCK (getenv);      return NULL;    }  /* On Windows NT, it is relatively typical that environment variables   * contain references to other environment variables. Handle that by   * calling ExpandEnvironmentStrings.   */  g_array_set_size (environs, environs->len + 1);  env = &g_array_index (environs, struct env_struct, environs->len - 1);  /* First check how much space we need */  length = ExpandEnvironmentStrings (system_env, dummy, 2);  /* Then allocate that much, and actualy do the expansion and insert   * the new found pair into our buffer    */  env->value = g_malloc (length);  env->key = g_strdup (variable);  ExpandEnvironmentStrings (system_env, env->value, length);  G_UNLOCK (getenv);  return env->value;#endif}G_LOCK_DEFINE_STATIC (g_utils_global);static	gchar	*g_tmp_dir = NULL;static	gchar	*g_user_name = NULL;static	gchar	*g_real_name = NULL;static	gchar	*g_home_dir = NULL;/* HOLDS: g_utils_global_lock */static voidg_get_any_init (void){  if (!g_tmp_dir)    {      g_tmp_dir = g_strdup (g_getenv ("TMPDIR"));      if (!g_tmp_dir)	g_tmp_dir = g_strdup (g_getenv ("TMP"));      if (!g_tmp_dir)	g_tmp_dir = g_strdup (g_getenv ("TEMP"));      #ifdef P_tmpdir      if (!g_tmp_dir)	{	  gsize k;    	  g_tmp_dir = g_strdup (P_tmpdir);	  k = strlen (g_tmp_dir);	  if (k > 1 && g_tmp_dir[k - 1] == G_DIR_SEPARATOR)	    g_tmp_dir[k - 1] = '\0';	}#endif            if (!g_tmp_dir)	{#ifndef G_OS_WIN32	  g_tmp_dir = g_strdup ("/tmp");#else /* G_OS_WIN32 */	  g_tmp_dir = g_strdup ("C:\\");#endif /* G_OS_WIN32 */	}      #ifdef G_OS_WIN32      /* We check $HOME first for Win32, though it is a last resort for Unix       * where we prefer the results of getpwuid().       */      g_home_dir = g_strdup (g_getenv ("HOME"));            /* In case HOME is Unix-style (it happens), convert it to       * Windows style.       */      if (g_home_dir)	{	  gchar *p;	  while ((p = strchr (g_home_dir, '/')) != NULL)	    *p = '\\';	}      if (!g_home_dir)	{	  /* USERPROFILE is probably the closest equivalent to $HOME? */	  if (getenv ("USERPROFILE") != NULL)	    g_home_dir = g_strdup (g_getenv ("USERPROFILE"));	}      if (!g_home_dir)	{	  /* At least at some time, HOMEDRIVE and HOMEPATH were used	   * to point to the home directory, I think. But on Windows	   * 2000 HOMEDRIVE seems to be equal to SYSTEMDRIVE, and	   * HOMEPATH is its root "\"?	   */	  if (getenv ("HOMEDRIVE") != NULL && getenv ("HOMEPATH") != NULL)	    {	      gchar *homedrive, *homepath;	      	      homedrive = g_strdup (g_getenv ("HOMEDRIVE"));	      homepath = g_strdup (g_getenv ("HOMEPATH"));	      	      g_home_dir = g_strconcat (homedrive, homepath, NULL);	      g_free (homedrive);	      g_free (homepath);	    }	}#endif /* G_OS_WIN32 */      #ifdef HAVE_PWD_H      {	struct passwd *pw = NULL;	gpointer buffer = NULL;        gint error;	#  if defined (HAVE_POSIX_GETPWUID_R) || defined (HAVE_NONPOSIX_GETPWUID_R)        struct passwd pwd;#    ifdef _SC_GETPW_R_SIZE_MAX  	/* This reurns the maximum length */        glong bufsize = sysconf (_SC_GETPW_R_SIZE_MAX);		if (bufsize < 0)	  bufsize = 64;#    else /* _SC_GETPW_R_SIZE_MAX */        glong bufsize = 64;#    endif /* _SC_GETPW_R_SIZE_MAX */	        do          {            g_free (buffer);            buffer = g_malloc (bufsize);	    errno = 0;	    #    ifdef HAVE_POSIX_GETPWUID_R	    error = getpwuid_r (getuid (), &pwd, buffer, bufsize, &pw);            error = error < 0 ? errno : error;#    else /* HAVE_NONPOSIX_GETPWUID_R */#      ifdef _AIX	    error = getpwuid_r (getuid (), &pwd, buffer, bufsize);	    pw = error == 0 ? &pwd : NULL;#      else /* !_AIX */            pw = getpwuid_r (getuid (), &pwd, buffer, bufsize);            error = pw ? 0 : errno;#      endif /* !_AIX */            #    endif /* HAVE_NONPOSIX_GETPWUID_R */	    	    if (!pw)	      {		/* we bail out prematurely if the user id can't be found		 * (should be pretty rare case actually), or if the buffer		 * should be sufficiently big and lookups are still not		 * successfull.		 */		if (error == 0 || error == ENOENT)		  {		    g_warning ("getpwuid_r(): failed due to unknown user id (%lu)",			       (gulong) getuid ());		    break;		  }		if (bufsize > 32 * 1024)		  {		    g_warning ("getpwuid_r(): failed due to: %s.",			       g_strerror (error));		    break;		  }				bufsize *= 2;	      }	  }	while (!pw);#  endif /* HAVE_POSIX_GETPWUID_R || HAVE_NONPOSIX_GETPWUID_R */		if (!pw)	  {	    setpwent ();	    pw = getpwuid (getuid ());	    endpwent ();	  }	if (pw)	  {	    g_user_name = g_strdup (pw->pw_name);	    g_real_name = g_strdup (pw->pw_gecos);	    if (!g_home_dir)	      g_home_dir = g_strdup (pw->pw_dir);	  }	g_free (buffer);      }      #else /* !HAVE_PWD_H */      #  ifdef G_OS_WIN32      {	guint len = UNLEN+1;	gchar buffer[UNLEN+1];		if (GetUserName ((LPTSTR) buffer, (LPDWORD) &len))	  {	    g_user_name = g_strdup (buffer);	    g_real_name = g_strdup (buffer);	  }      }#  endif /* G_OS_WIN32 */#endif /* !HAVE_PWD_H */      if (!g_home_dir)	g_home_dir = g_strdup (g_getenv ("HOME"));      #ifdef __EMX__      /* change '\\' in %HOME% to '/' */      g_strdelimit (g_home_dir, "\\",'/');#endif      if (!g_user_name)	g_user_name = g_strdup ("somebody");      if (!g_real_name)	g_real_name = g_strdup ("Unknown");      else	{	  gchar *p;	  for (p = g_real_name; *p; p++)	    if (*p == ',')	      {		*p = 0;		p = g_strdup (g_real_name);		g_free (g_real_name);		g_real_name = p;		break;	      }	}    }}G_CONST_RETURN gchar*g_get_user_name (void){  G_LOCK (g_utils_global);  if (!g_tmp_dir)    g_get_any_init ();  G_UNLOCK (g_utils_global);    return g_user_name;}G_CONST_RETURN gchar*g_get_real_name (void){  G_LOCK (g_utils_global);  if (!g_tmp_dir)    g_get_any_init ();  G_UNLOCK (g_utils_global);   return g_real_name;}/* Return the home directory of the user. If there is a HOME * environment variable, its value is returned, otherwise use some * system-dependent way of finding it out. If no home directory can be * deduced, return NULL. */G_CONST_RETURN gchar*g_get_home_dir (void){  G_LOCK (g_utils_global);  if (!g_tmp_dir)    g_get_any_init ();  G_UNLOCK (g_utils_global);    return g_home_dir;}/* Return a directory to be used to store temporary files. This is the * value of the TMPDIR, TMP or TEMP environment variables (they are * checked in that order). If none of those exist, use P_tmpdir from * stdio.h.  If that isn't defined, return "/tmp" on POSIXly systems, * and C:\ on Windows. */G_CONST_RETURN gchar*g_get_tmp_dir (void){  G_LOCK (g_utils_global);  if (!g_tmp_dir)    g_get_any_init ();  G_UNLOCK (g_utils_global);    return g_tmp_dir;}G_LOCK_DEFINE (g_prgname);static gchar *g_prgname = NULL;gchar*g_get_prgname (void){  gchar* retval;  G_LOCK (g_prgname);  retval = g_prgname;  G_UNLOCK (g_prgname);  return retval;}voidg_set_prgname (const gchar *prgname){  G_LOCK (g_prgname);  g_free (g_prgname);  g_prgname = g_strdup (prgname);  G_UNLOCK (g_prgname);}guintg_direct_hash (gconstpointer v){  return GPOINTER_TO_UINT (v);}gbooleang_direct_equal (gconstpointer v1,		gconstpointer v2){  return v1 == v2;}gbooleang_int_equal (gconstpointer v1,	     gconstpointer v2){  return *((const gint*) v1) == *((const gint*) v2);}guintg_int_hash (gconstpointer v){  return *(const gint*) v;}/** * g_nullify_pointer: * @nullify_location: the memory address of the pointer. *  * Set the pointer at the specified location to %NULL. **/voidg_nullify_pointer (gpointer *nullify_location){  g_return_if_fail (nullify_location != NULL);  *nullify_location = NULL;}/** * g_get_codeset: *  * Get the codeset for the current locale. *  * Return value: a newly allocated string containing the name * of the codeset. This string must be freed with g_free(). **/gchar *g_get_codeset (void){#ifdef HAVE_CODESET    char *result = nl_langinfo (CODESET);  return g_strdup (result);#else#ifdef G_PLATFORM_WIN32  return g_strdup_printf ("CP%d", GetACP ());#else  /* FIXME: Do something more intelligent based on setlocale (LC_CTYPE, NULL)   */  return g_strdup ("ISO-8859-1");#endif#endif}#ifdef ENABLE_NLS#include <libintl.h>#ifdef G_PLATFORM_WIN32G_WIN32_DLLMAIN_FOR_DLL_NAME (static, dll_name)static const gchar *_glib_get_locale_dir (void){  static const gchar *cache = NULL;  if (cache == NULL)    cache = g_win32_get_package_installation_subdirectory      (GETTEXT_PACKAGE, dll_name, "lib\\locale");  return cache;}#undef GLIB_LOCALE_DIR#define GLIB_LOCALE_DIR _glib_get_locale_dir ()#endif /* G_PLATFORM_WIN32 */G_CONST_RETURN gchar *_glib_gettext (const gchar *str){  static gboolean _glib_gettext_initialized = FALSE;  if (!_glib_gettext_initialized)    {      bindtextdomain(GETTEXT_PACKAGE, GLIB_LOCALE_DIR);#    ifdef HAVE_BIND_TEXTDOMAIN_CODESET      bind_textdomain_codeset (GETTEXT_PACKAGE, "UTF-8");#    endif      _glib_gettext_initialized = TRUE;    }    return dgettext (GETTEXT_PACKAGE, str);}#endif /* ENABLE_NLS */

⌨️ 快捷键说明

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