📄 gutils.c
字号:
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 + -