From 49ae057a97f7d543594a10d931a193893de97a9c Mon Sep 17 00:00:00 2001 From: Tim Janik Date: Fri, 10 Jul 1998 05:51:17 +0000 Subject: [PATCH] added a bunch of utility/wrapper functions: g_basename(), g_getcwd(), Fri Jul 10 06:33:43 1998 Tim Janik * glib.h: * gutils.h: added a bunch of utility/wrapper functions: g_basename(), g_getcwd(), g_get_user_name(), g_get_real_name(), g_get_home_dir(), g_get_tmp_dir(), g_get_prgname() and g_set_prgname(). * gutils.c: removed all g_str* functions. * gstrfuncs.c: moved the bunch g_str* functions from gutils.c in this place. this file shall never include to avoid clashes for some of the g_str* functions on some OSes. --- ChangeLog | 12 + ChangeLog.pre-2-0 | 12 + ChangeLog.pre-2-10 | 12 + ChangeLog.pre-2-12 | 12 + ChangeLog.pre-2-2 | 12 + ChangeLog.pre-2-4 | 12 + ChangeLog.pre-2-6 | 12 + ChangeLog.pre-2-8 | 12 + Makefile.am | 1 + glib.h | 448 +++++++++++++------------- glib/Makefile.am | 1 + glib/glib.h | 448 +++++++++++++------------- glib/gutils.c | 908 +++++++++-------------------------------------------- gutils.c | 908 +++++++++-------------------------------------------- 14 files changed, 864 insertions(+), 1946 deletions(-) diff --git a/ChangeLog b/ChangeLog index 67953eb..640087d 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,15 @@ +Fri Jul 10 06:33:43 1998 Tim Janik + + * glib.h: + * gutils.h: added a bunch of utility/wrapper functions: + g_basename(), g_getcwd(), g_get_user_name(), g_get_real_name(), + g_get_home_dir(), g_get_tmp_dir(), g_get_prgname() and g_set_prgname(). + + * gutils.c: removed all g_str* functions. + * gstrfuncs.c: moved the bunch g_str* functions from gutils.c in this + place. this file shall never include to avoid clashes for + some of the g_str* functions on some OSes. + Fri Jul 10 00:29:03 EEST 1998 Lauri Alanko * glib.h: diff --git a/ChangeLog.pre-2-0 b/ChangeLog.pre-2-0 index 67953eb..640087d 100644 --- a/ChangeLog.pre-2-0 +++ b/ChangeLog.pre-2-0 @@ -1,3 +1,15 @@ +Fri Jul 10 06:33:43 1998 Tim Janik + + * glib.h: + * gutils.h: added a bunch of utility/wrapper functions: + g_basename(), g_getcwd(), g_get_user_name(), g_get_real_name(), + g_get_home_dir(), g_get_tmp_dir(), g_get_prgname() and g_set_prgname(). + + * gutils.c: removed all g_str* functions. + * gstrfuncs.c: moved the bunch g_str* functions from gutils.c in this + place. this file shall never include to avoid clashes for + some of the g_str* functions on some OSes. + Fri Jul 10 00:29:03 EEST 1998 Lauri Alanko * glib.h: diff --git a/ChangeLog.pre-2-10 b/ChangeLog.pre-2-10 index 67953eb..640087d 100644 --- a/ChangeLog.pre-2-10 +++ b/ChangeLog.pre-2-10 @@ -1,3 +1,15 @@ +Fri Jul 10 06:33:43 1998 Tim Janik + + * glib.h: + * gutils.h: added a bunch of utility/wrapper functions: + g_basename(), g_getcwd(), g_get_user_name(), g_get_real_name(), + g_get_home_dir(), g_get_tmp_dir(), g_get_prgname() and g_set_prgname(). + + * gutils.c: removed all g_str* functions. + * gstrfuncs.c: moved the bunch g_str* functions from gutils.c in this + place. this file shall never include to avoid clashes for + some of the g_str* functions on some OSes. + Fri Jul 10 00:29:03 EEST 1998 Lauri Alanko * glib.h: diff --git a/ChangeLog.pre-2-12 b/ChangeLog.pre-2-12 index 67953eb..640087d 100644 --- a/ChangeLog.pre-2-12 +++ b/ChangeLog.pre-2-12 @@ -1,3 +1,15 @@ +Fri Jul 10 06:33:43 1998 Tim Janik + + * glib.h: + * gutils.h: added a bunch of utility/wrapper functions: + g_basename(), g_getcwd(), g_get_user_name(), g_get_real_name(), + g_get_home_dir(), g_get_tmp_dir(), g_get_prgname() and g_set_prgname(). + + * gutils.c: removed all g_str* functions. + * gstrfuncs.c: moved the bunch g_str* functions from gutils.c in this + place. this file shall never include to avoid clashes for + some of the g_str* functions on some OSes. + Fri Jul 10 00:29:03 EEST 1998 Lauri Alanko * glib.h: diff --git a/ChangeLog.pre-2-2 b/ChangeLog.pre-2-2 index 67953eb..640087d 100644 --- a/ChangeLog.pre-2-2 +++ b/ChangeLog.pre-2-2 @@ -1,3 +1,15 @@ +Fri Jul 10 06:33:43 1998 Tim Janik + + * glib.h: + * gutils.h: added a bunch of utility/wrapper functions: + g_basename(), g_getcwd(), g_get_user_name(), g_get_real_name(), + g_get_home_dir(), g_get_tmp_dir(), g_get_prgname() and g_set_prgname(). + + * gutils.c: removed all g_str* functions. + * gstrfuncs.c: moved the bunch g_str* functions from gutils.c in this + place. this file shall never include to avoid clashes for + some of the g_str* functions on some OSes. + Fri Jul 10 00:29:03 EEST 1998 Lauri Alanko * glib.h: diff --git a/ChangeLog.pre-2-4 b/ChangeLog.pre-2-4 index 67953eb..640087d 100644 --- a/ChangeLog.pre-2-4 +++ b/ChangeLog.pre-2-4 @@ -1,3 +1,15 @@ +Fri Jul 10 06:33:43 1998 Tim Janik + + * glib.h: + * gutils.h: added a bunch of utility/wrapper functions: + g_basename(), g_getcwd(), g_get_user_name(), g_get_real_name(), + g_get_home_dir(), g_get_tmp_dir(), g_get_prgname() and g_set_prgname(). + + * gutils.c: removed all g_str* functions. + * gstrfuncs.c: moved the bunch g_str* functions from gutils.c in this + place. this file shall never include to avoid clashes for + some of the g_str* functions on some OSes. + Fri Jul 10 00:29:03 EEST 1998 Lauri Alanko * glib.h: diff --git a/ChangeLog.pre-2-6 b/ChangeLog.pre-2-6 index 67953eb..640087d 100644 --- a/ChangeLog.pre-2-6 +++ b/ChangeLog.pre-2-6 @@ -1,3 +1,15 @@ +Fri Jul 10 06:33:43 1998 Tim Janik + + * glib.h: + * gutils.h: added a bunch of utility/wrapper functions: + g_basename(), g_getcwd(), g_get_user_name(), g_get_real_name(), + g_get_home_dir(), g_get_tmp_dir(), g_get_prgname() and g_set_prgname(). + + * gutils.c: removed all g_str* functions. + * gstrfuncs.c: moved the bunch g_str* functions from gutils.c in this + place. this file shall never include to avoid clashes for + some of the g_str* functions on some OSes. + Fri Jul 10 00:29:03 EEST 1998 Lauri Alanko * glib.h: diff --git a/ChangeLog.pre-2-8 b/ChangeLog.pre-2-8 index 67953eb..640087d 100644 --- a/ChangeLog.pre-2-8 +++ b/ChangeLog.pre-2-8 @@ -1,3 +1,15 @@ +Fri Jul 10 06:33:43 1998 Tim Janik + + * glib.h: + * gutils.h: added a bunch of utility/wrapper functions: + g_basename(), g_getcwd(), g_get_user_name(), g_get_real_name(), + g_get_home_dir(), g_get_tmp_dir(), g_get_prgname() and g_set_prgname(). + + * gutils.c: removed all g_str* functions. + * gstrfuncs.c: moved the bunch g_str* functions from gutils.c in this + place. this file shall never include to avoid clashes for + some of the g_str* functions on some OSes. + Fri Jul 10 00:29:03 EEST 1998 Lauri Alanko * glib.h: diff --git a/Makefile.am b/Makefile.am index d09d201..03fd686 100644 --- a/Makefile.am +++ b/Makefile.am @@ -25,6 +25,7 @@ libglib_1_1_la_SOURCES = \ gtree.c \ grel.c \ gstring.c \ + gstrfuncs.c \ gscanner.c \ gutils.c diff --git a/glib.h b/glib.h index 9883eb6..cbda6c3 100644 --- a/glib.h +++ b/glib.h @@ -8,7 +8,7 @@ * * 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 + * 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 @@ -171,13 +171,13 @@ __attribute__((noreturn)) #define G_GNUC_CONST \ __attribute__((const)) -#else /* !__GNUC__ */ +#else /* !__GNUC__ */ #define G_GNUC_PRINTF( format_idx, arg_idx ) #define G_GNUC_SCANF( format_idx, arg_idx ) #define G_GNUC_FORMAT( arg_idx ) #define G_GNUC_NORETURN #define G_GNUC_CONST -#endif /* !__GNUC__ */ +#endif /* !__GNUC__ */ /* Hacker macro to place breakpoints for x86 machines. * Actuall use is strongly deprecated of course ;) @@ -239,7 +239,7 @@ #define g_chunk_new0(type, chunk) ( \ (type *) memset (g_mem_chunk_alloc (chunk), 0, sizeof (type)) \ ) -#define g_chunk_free(mem, mem_chunk) G_STMT_START { \ +#define g_chunk_free(mem, mem_chunk) G_STMT_START { \ g_mem_chunk_free ((mem_chunk), (mem)); \ } G_STMT_END @@ -302,48 +302,48 @@ #ifdef __GNUC__ -#define g_return_if_fail(expr) G_STMT_START{ \ - if (!(expr)) \ - { \ +#define g_return_if_fail(expr) G_STMT_START{ \ + if (!(expr)) \ + { \ g_warning ("file %s: line %d (%s): assertion \"%s\" failed.", \ - __FILE__, \ - __LINE__, \ - __PRETTY_FUNCTION__, \ - #expr); \ - return; \ + __FILE__, \ + __LINE__, \ + __PRETTY_FUNCTION__, \ + #expr); \ + return; \ }; }G_STMT_END -#define g_return_val_if_fail(expr,val) G_STMT_START{ \ - if (!(expr)) \ - { \ +#define g_return_val_if_fail(expr,val) G_STMT_START{ \ + if (!(expr)) \ + { \ g_warning ("file %s: line %d (%s): assertion \"%s\" failed.", \ - __FILE__, \ - __LINE__, \ - __PRETTY_FUNCTION__, \ - #expr); \ - return val; \ + __FILE__, \ + __LINE__, \ + __PRETTY_FUNCTION__, \ + #expr); \ + return val; \ }; }G_STMT_END #else /* !__GNUC__ */ -#define g_return_if_fail(expr) G_STMT_START{ \ - if (!(expr)) \ - { \ +#define g_return_if_fail(expr) G_STMT_START{ \ + if (!(expr)) \ + { \ g_warning ("file %s: line %d: assertion. \"%s\" failed", \ - __FILE__, \ - __LINE__, \ - #expr); \ - return; \ + __FILE__, \ + __LINE__, \ + #expr); \ + return; \ }; }G_STMT_END -#define g_return_val_if_fail(expr, val) G_STMT_START{ \ - if (!(expr)) \ - { \ +#define g_return_val_if_fail(expr, val) G_STMT_START{ \ + if (!(expr)) \ + { \ g_warning ("file %s: line %d: assertion \"%s\" failed.", \ - __FILE__, \ - __LINE__, \ - #expr); \ - return val; \ + __FILE__, \ + __LINE__, \ + #expr); \ + return val; \ }; }G_STMT_END #endif /* !__GNUC__ */ @@ -433,9 +433,9 @@ typedef unsigned long guint32; /* This should never happen */ #endif -typedef gint32 gssize; +typedef gint32 gssize; typedef guint32 gsize; -typedef gint32 gtime; +typedef gint32 gtime; typedef guint32 GQuark; typedef struct _GList GList; @@ -456,7 +456,7 @@ typedef struct _GScannerConfig GScannerConfig; typedef struct _GScanner GScanner; typedef union _GValue GValue; typedef struct _GRelation GRelation; -typedef struct _GTuples GTuples; +typedef struct _GTuples GTuples; typedef void (*GFunc) (gpointer data, @@ -473,16 +473,16 @@ typedef gint (*GTraverseFunc) (gpointer key, typedef gint (*GSearchFunc) (gpointer key, gpointer data); typedef void (*GErrorFunc) (gchar *str); -typedef void (*GWarningFunc) (gchar *str); -typedef void (*GPrintFunc) (gchar *str); +typedef void (*GWarningFunc) (gchar *str); +typedef void (*GPrintFunc) (gchar *str); typedef void (*GScannerMsgFunc) (GScanner *scanner, gchar *message, gint error); typedef void (*GDestroyNotify) (gpointer data); -typedef guint (*GHashFunc) (gconstpointer key); -typedef gint (*GCompareFunc) (gconstpointer a, - gconstpointer b); +typedef guint (*GHashFunc) (gconstpointer key); +typedef gint (*GCompareFunc) (gconstpointer a, + gconstpointer b); struct _GList { @@ -512,13 +512,13 @@ struct _GArray struct _GByteArray { guint8 *data; - guint len; + guint len; }; struct _GPtrArray { gpointer *pdata; - guint len; + guint len; }; struct _GTuples @@ -529,7 +529,7 @@ struct _GTuples struct _GDebugKey { gchar *key; - guint value; + guint value; }; struct _GCache { gint dummy; }; @@ -548,89 +548,89 @@ typedef enum /* Doubly linked lists */ -GList* g_list_alloc (void); -void g_list_free (GList *list); -void g_list_free_1 (GList *list); -GList* g_list_append (GList *list, - gpointer data); -GList* g_list_prepend (GList *list, - gpointer data); -GList* g_list_insert (GList *list, - gpointer data, - gint position); +GList* g_list_alloc (void); +void g_list_free (GList *list); +void g_list_free_1 (GList *list); +GList* g_list_append (GList *list, + gpointer data); +GList* g_list_prepend (GList *list, + gpointer data); +GList* g_list_insert (GList *list, + gpointer data, + gint position); GList* g_list_insert_sorted (GList *list, - gpointer data, + gpointer data, GCompareFunc func); -GList* g_list_concat (GList *list1, - GList *list2); -GList* g_list_remove (GList *list, - gpointer data); -GList* g_list_remove_link (GList *list, - GList *link); -GList* g_list_reverse (GList *list); -GList* g_list_nth (GList *list, - guint n); -GList* g_list_find (GList *list, - gpointer data); -GList* g_list_find_custom (GList *list, - gpointer data, - GCompareFunc func); -gint g_list_position (GList *list, - GList *link); -gint g_list_index (GList *list, - gpointer data); -GList* g_list_last (GList *list); -GList* g_list_first (GList *list); -guint g_list_length (GList *list); -void g_list_foreach (GList *list, - GFunc func, - gpointer user_data); -gpointer g_list_nth_data (GList *list, - guint n); - -#define g_list_previous(list) ((list) ? (((GList *)(list))->prev) : NULL) +GList* g_list_concat (GList *list1, + GList *list2); +GList* g_list_remove (GList *list, + gpointer data); +GList* g_list_remove_link (GList *list, + GList *link); +GList* g_list_reverse (GList *list); +GList* g_list_nth (GList *list, + guint n); +GList* g_list_find (GList *list, + gpointer data); +GList* g_list_find_custom (GList *list, + gpointer data, + GCompareFunc func); +gint g_list_position (GList *list, + GList *link); +gint g_list_index (GList *list, + gpointer data); +GList* g_list_last (GList *list); +GList* g_list_first (GList *list); +guint g_list_length (GList *list); +void g_list_foreach (GList *list, + GFunc func, + gpointer user_data); +gpointer g_list_nth_data (GList *list, + guint n); + +#define g_list_previous(list) ((list) ? (((GList *)(list))->prev) : NULL) #define g_list_next(list) ((list) ? (((GList *)(list))->next) : NULL) /* Singly linked lists */ -GSList* g_slist_alloc (void); -void g_slist_free (GSList *list); -void g_slist_free_1 (GSList *list); -GSList* g_slist_append (GSList *list, - gpointer data); -GSList* g_slist_prepend (GSList *list, - gpointer data); -GSList* g_slist_insert (GSList *list, - gpointer data, - gint position); -GSList* g_slist_insert_sorted (GSList *list, - gpointer data, +GSList* g_slist_alloc (void); +void g_slist_free (GSList *list); +void g_slist_free_1 (GSList *list); +GSList* g_slist_append (GSList *list, + gpointer data); +GSList* g_slist_prepend (GSList *list, + gpointer data); +GSList* g_slist_insert (GSList *list, + gpointer data, + gint position); +GSList* g_slist_insert_sorted (GSList *list, + gpointer data, GCompareFunc func); -GSList* g_slist_concat (GSList *list1, - GSList *list2); -GSList* g_slist_remove (GSList *list, - gpointer data); -GSList* g_slist_remove_link (GSList *list, - GSList *link); -GSList* g_slist_reverse (GSList *list); -GSList* g_slist_nth (GSList *list, - guint n); -GSList* g_slist_find (GSList *list, - gpointer data); -GSList* g_slist_find_custom (GSList *list, - gpointer data, +GSList* g_slist_concat (GSList *list1, + GSList *list2); +GSList* g_slist_remove (GSList *list, + gpointer data); +GSList* g_slist_remove_link (GSList *list, + GSList *link); +GSList* g_slist_reverse (GSList *list); +GSList* g_slist_nth (GSList *list, + guint n); +GSList* g_slist_find (GSList *list, + gpointer data); +GSList* g_slist_find_custom (GSList *list, + gpointer data, GCompareFunc func); -gint g_slist_position (GSList *list, - GSList *link); -gint g_slist_index (GSList *list, - gpointer data); -GSList* g_slist_last (GSList *list); -guint g_slist_length (GSList *list); -void g_slist_foreach (GSList *list, - GFunc func, - gpointer user_data); -gpointer g_slist_nth_data (GSList *list, - guint n); +gint g_slist_position (GSList *list, + GSList *link); +gint g_slist_index (GSList *list, + gpointer data); +GSList* g_slist_last (GSList *list); +guint g_slist_length (GSList *list); +void g_slist_foreach (GSList *list, + GFunc func, + gpointer user_data); +gpointer g_slist_nth_data (GSList *list, + guint n); #define g_slist_next(slist) ((slist) ? (((GSList *)(slist))->next) : NULL) @@ -650,10 +650,10 @@ void g_hash_table_destroy (GHashTable *hash_table); void g_hash_table_insert (GHashTable *hash_table, gpointer key, gpointer value); -void g_hash_table_remove (GHashTable *hash_table, +void g_hash_table_remove (GHashTable *hash_table, + gconstpointer key); +gpointer g_hash_table_lookup (GHashTable *hash_table, gconstpointer key); -gpointer g_hash_table_lookup (GHashTable *hash_table, - gconstpointer key); gboolean g_hash_table_lookup_extended(GHashTable *hash_table, gconstpointer lookup_key, gpointer *orig_key, @@ -798,31 +798,49 @@ void g_warning (const gchar *format, ...) G_GNUC_PRINTF (1, 2); void g_message (const gchar *format, ...) G_GNUC_PRINTF (1, 2); void g_print (const gchar *format, ...) G_GNUC_PRINTF (1, 2); -/* Utility functions + +/* String utility functions */ #define G_STR_DELIMITERS "_-|> <." -void g_strdelimit (gchar *string, +void g_strdelimit (gchar *string, const gchar *delimiters, - gchar new_delimiter); -gchar* g_strdup (const gchar *str); -gchar* g_strconcat (const gchar *string1, + gchar new_delimiter); +gchar* g_strdup (const gchar *str); +gchar* g_strconcat (const gchar *string1, ...); /* NULL terminated */ -gdouble g_strtod (const gchar *nptr, - gchar **endptr); -gchar* g_strerror (gint errnum); -gchar* g_strsignal (gint signum); -gint g_strcasecmp (const gchar *s1, +gdouble g_strtod (const gchar *nptr, + gchar **endptr); +gchar* g_strerror (gint errnum); +gchar* g_strsignal (gint signum); +gint g_strcasecmp (const gchar *s1, const gchar *s2); -void g_strdown (gchar *string); -void g_strup (gchar *string); -void g_strreverse (gchar *string); -guint g_parse_debug_string (const gchar *string, +void g_strdown (gchar *string); +void g_strup (gchar *string); +void g_strreverse (gchar *string); + + +/* Retrive static info + */ +gchar* g_get_user_name (void); +gchar* g_get_real_name (void); +gchar* g_get_home_dir (void); +gchar* g_get_tmp_dir (void); +gchar* g_get_prgname (void); +void g_set_prgname (const gchar *prgname); + + +/* Miscellaneous utility functions + */ +guint g_parse_debug_string (const gchar *string, GDebugKey *keys, - guint nkeys); -gint g_snprintf (gchar *string, - gulong n, + guint nkeys); +gint g_snprintf (gchar *string, + gulong n, gchar const *format, ...) G_GNUC_PRINTF (3, 4); +gchar* g_basename (const gchar *file_name); +gchar* g_getcwd (void); + /* We make the assumption that if memmove isn't available, then * bcopy will do the job. This isn't safe everywhere. (bcopy can't @@ -842,9 +860,9 @@ GPrintFunc g_set_print_handler (GPrintFunc func); void g_debug (const gchar *progname); void g_attach_process (const gchar *progname, - gint query); + gint query); void g_stack_trace (const gchar *progname, - gint query); + gint query); /* String Chunks @@ -860,35 +878,35 @@ gchar* g_string_chunk_insert_const (GStringChunk *chunk, */ GString* g_string_new (const gchar *init); GString* g_string_sized_new (guint dfl_size); -void g_string_free (GString *string, - gint free_segment); -GString* g_string_assign (GString *lval, +void g_string_free (GString *string, + gint free_segment); +GString* g_string_assign (GString *lval, const gchar *rval); -GString* g_string_truncate (GString *string, - gint len); -GString* g_string_append (GString *string, +GString* g_string_truncate (GString *string, + gint len); +GString* g_string_append (GString *string, const gchar *val); -GString* g_string_append_c (GString *string, - gchar c); -GString* g_string_prepend (GString *string, +GString* g_string_append_c (GString *string, + gchar c); +GString* g_string_prepend (GString *string, const gchar *val); -GString* g_string_prepend_c (GString *string, - gchar c); +GString* g_string_prepend_c (GString *string, + gchar c); GString* g_string_insert (GString *string, - gint pos, + gint pos, const gchar *val); -GString* g_string_insert_c (GString *string, - gint pos, - gchar c); -GString* g_string_erase (GString *string, - gint pos, - gint len); -GString* g_string_down (GString *string); -GString* g_string_up (GString *string); -void g_string_sprintf (GString *string, +GString* g_string_insert_c (GString *string, + gint pos, + gchar c); +GString* g_string_erase (GString *string, + gint pos, + gint len); +GString* g_string_down (GString *string); +GString* g_string_up (GString *string); +void g_string_sprintf (GString *string, const gchar *format, ...) G_GNUC_PRINTF (2, 3); -void g_string_sprintfa (GString *string, +void g_string_sprintfa (GString *string, const gchar *format, ...) G_GNUC_PRINTF (2, 3); @@ -927,35 +945,35 @@ GArray* g_rarray_truncate (GArray *array, * cleared spot and shortens the array. */ -#define g_ptr_array_index(array,index) (array->pdata)[index] +#define g_ptr_array_index(array,index) (array->pdata)[index] -GPtrArray* g_ptr_array_new (void); -void g_ptr_array_free (GPtrArray *array, - gboolean free_seg); -void g_ptr_array_set_size (GPtrArray *array, +GPtrArray* g_ptr_array_new (void); +void g_ptr_array_free (GPtrArray *array, + gboolean free_seg); +void g_ptr_array_set_size (GPtrArray *array, gint length); -void g_ptr_array_remove_index (GPtrArray *array, - gint index); -gboolean g_ptr_array_remove (GPtrArray *array, - gpointer data); -void g_ptr_array_add (GPtrArray *array, - gpointer data); +void g_ptr_array_remove_index (GPtrArray *array, + gint index); +gboolean g_ptr_array_remove (GPtrArray *array, + gpointer data); +void g_ptr_array_add (GPtrArray *array, + gpointer data); /* Byte arrays, an array of guint8. Implemented as a GArray, * but type-safe. */ -GByteArray* g_byte_array_new (void); -void g_byte_array_free (GByteArray *array, - gint free_segment); +GByteArray* g_byte_array_new (void); +void g_byte_array_free (GByteArray *array, + gint free_segment); -GByteArray* g_byte_array_append (GByteArray *array, +GByteArray* g_byte_array_append (GByteArray *array, const guint8 *data, - guint len); + guint len); -GByteArray* g_byte_array_prepend (GByteArray *array, +GByteArray* g_byte_array_prepend (GByteArray *array, const guint8 *data, - guint len); + guint len); GByteArray* g_byte_array_truncate (GByteArray *array, gint length); @@ -983,20 +1001,20 @@ gint g_direct_equal (gconstpointer v, /* Quarks (string<->id association) */ GQuark g_quark_try_string (const gchar *string); -GQuark g_quark_from_static_string (const gchar *string); -GQuark g_quark_from_string (const gchar *string); +GQuark g_quark_from_static_string (const gchar *string); +GQuark g_quark_from_string (const gchar *string); gchar* g_quark_to_string (GQuark quark); /* Location Associated Data */ -void g_dataset_destroy (gconstpointer dataset_location); -gpointer g_dataset_id_get_data (gconstpointer dataset_location, +void g_dataset_destroy (gconstpointer dataset_location); +gpointer g_dataset_id_get_data (gconstpointer dataset_location, GQuark key_id); -void g_dataset_id_set_data_full (gconstpointer dataset_location, +void g_dataset_id_set_data_full (gconstpointer dataset_location, GQuark key_id, - gpointer data, + gpointer data, GDestroyNotify destroy_func); -void g_dataset_id_set_destroy (gconstpointer dataset_location, +void g_dataset_id_set_destroy (gconstpointer dataset_location, GQuark key_id, GDestroyNotify destroy_func); @@ -1004,7 +1022,7 @@ void g_dataset_id_set_destroy (gconstpointer dataset_location, #define g_dataset_id_remove_data(l,k) G_STMT_START{g_dataset_id_set_data((l),(k),NULL);}G_STMT_END #define g_dataset_get_data(l,k) (g_dataset_id_get_data((l),g_quark_try_string(k))) #define g_dataset_set_data_full(l,k,d,f) G_STMT_START{g_dataset_id_set_data_full((l),g_quark_from_string(k),(d),(f));}G_STMT_END -#define g_dataset_set_destroy(l,k,f) G_STMT_START{g_dataset_id_set_destroy((l),g_quark_from_string(k),(f));}G_STMT_END +#define g_dataset_set_destroy(l,k,f) G_STMT_START{g_dataset_id_set_destroy((l),g_quark_from_string(k),(f));}G_STMT_END #define g_dataset_set_data(l,k,d) G_STMT_START{g_dataset_set_data_full((l),(k),(d),NULL);}G_STMT_END #define g_dataset_remove_data(l,k) G_STMT_START{g_dataset_set_data((l),(k),NULL);}G_STMT_END @@ -1222,16 +1240,16 @@ struct _GCompletion { }; -GCompletion* g_completion_new (GCompletionFunc func); -void g_completion_add_items (GCompletion* cmp, - GList* items); -void g_completion_remove_items (GCompletion* cmp, - GList* items); -void g_completion_clear_items (GCompletion* cmp); -GList* g_completion_complete (GCompletion* cmp, - gchar* prefix, - gchar** new_prefix); -void g_completion_free (GCompletion* cmp); +GCompletion* g_completion_new (GCompletionFunc func); +void g_completion_add_items (GCompletion* cmp, + GList* items); +void g_completion_remove_items (GCompletion* cmp, + GList* items); +void g_completion_clear_items (GCompletion* cmp); +GList* g_completion_complete (GCompletion* cmp, + gchar* prefix, + gchar** new_prefix); +void g_completion_free (GCompletion* cmp); /* GRelation: Indexed Relations. Imagine a really simple table in a * database. Relations are not ordered. This data type is meant for @@ -1254,31 +1272,31 @@ void g_completion_free (GCompletion* cmp); * g_relation_count() counts ... */ -GRelation* g_relation_new (gint fields); -void g_relation_destroy (GRelation *relation); -void g_relation_index (GRelation *relation, - gint field, +GRelation* g_relation_new (gint fields); +void g_relation_destroy (GRelation *relation); +void g_relation_index (GRelation *relation, + gint field, GHashFunc hash_func, GCompareFunc key_compare_func); -void g_relation_insert (GRelation *relation, +void g_relation_insert (GRelation *relation, ...); -gint g_relation_delete (GRelation *relation, +gint g_relation_delete (GRelation *relation, gconstpointer key, - gint field); + gint field); GTuples* g_relation_select (GRelation *relation, gconstpointer key, - gint field); -gint g_relation_count (GRelation *relation, + gint field); +gint g_relation_count (GRelation *relation, gconstpointer key, - gint field); + gint field); gboolean g_relation_exists (GRelation *relation, ...); -void g_relation_print (GRelation *relation); +void g_relation_print (GRelation *relation); -void g_tuples_destroy (GTuples *tuples); -gpointer g_tuples_index (GTuples *tuples, - gint index, - gint field); +void g_tuples_destroy (GTuples *tuples); +gpointer g_tuples_index (GTuples *tuples, + gint index, + gint field); /* Glib version. diff --git a/glib/Makefile.am b/glib/Makefile.am index d09d201..03fd686 100644 --- a/glib/Makefile.am +++ b/glib/Makefile.am @@ -25,6 +25,7 @@ libglib_1_1_la_SOURCES = \ gtree.c \ grel.c \ gstring.c \ + gstrfuncs.c \ gscanner.c \ gutils.c diff --git a/glib/glib.h b/glib/glib.h index 9883eb6..cbda6c3 100644 --- a/glib/glib.h +++ b/glib/glib.h @@ -8,7 +8,7 @@ * * 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 + * 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 @@ -171,13 +171,13 @@ __attribute__((noreturn)) #define G_GNUC_CONST \ __attribute__((const)) -#else /* !__GNUC__ */ +#else /* !__GNUC__ */ #define G_GNUC_PRINTF( format_idx, arg_idx ) #define G_GNUC_SCANF( format_idx, arg_idx ) #define G_GNUC_FORMAT( arg_idx ) #define G_GNUC_NORETURN #define G_GNUC_CONST -#endif /* !__GNUC__ */ +#endif /* !__GNUC__ */ /* Hacker macro to place breakpoints for x86 machines. * Actuall use is strongly deprecated of course ;) @@ -239,7 +239,7 @@ #define g_chunk_new0(type, chunk) ( \ (type *) memset (g_mem_chunk_alloc (chunk), 0, sizeof (type)) \ ) -#define g_chunk_free(mem, mem_chunk) G_STMT_START { \ +#define g_chunk_free(mem, mem_chunk) G_STMT_START { \ g_mem_chunk_free ((mem_chunk), (mem)); \ } G_STMT_END @@ -302,48 +302,48 @@ #ifdef __GNUC__ -#define g_return_if_fail(expr) G_STMT_START{ \ - if (!(expr)) \ - { \ +#define g_return_if_fail(expr) G_STMT_START{ \ + if (!(expr)) \ + { \ g_warning ("file %s: line %d (%s): assertion \"%s\" failed.", \ - __FILE__, \ - __LINE__, \ - __PRETTY_FUNCTION__, \ - #expr); \ - return; \ + __FILE__, \ + __LINE__, \ + __PRETTY_FUNCTION__, \ + #expr); \ + return; \ }; }G_STMT_END -#define g_return_val_if_fail(expr,val) G_STMT_START{ \ - if (!(expr)) \ - { \ +#define g_return_val_if_fail(expr,val) G_STMT_START{ \ + if (!(expr)) \ + { \ g_warning ("file %s: line %d (%s): assertion \"%s\" failed.", \ - __FILE__, \ - __LINE__, \ - __PRETTY_FUNCTION__, \ - #expr); \ - return val; \ + __FILE__, \ + __LINE__, \ + __PRETTY_FUNCTION__, \ + #expr); \ + return val; \ }; }G_STMT_END #else /* !__GNUC__ */ -#define g_return_if_fail(expr) G_STMT_START{ \ - if (!(expr)) \ - { \ +#define g_return_if_fail(expr) G_STMT_START{ \ + if (!(expr)) \ + { \ g_warning ("file %s: line %d: assertion. \"%s\" failed", \ - __FILE__, \ - __LINE__, \ - #expr); \ - return; \ + __FILE__, \ + __LINE__, \ + #expr); \ + return; \ }; }G_STMT_END -#define g_return_val_if_fail(expr, val) G_STMT_START{ \ - if (!(expr)) \ - { \ +#define g_return_val_if_fail(expr, val) G_STMT_START{ \ + if (!(expr)) \ + { \ g_warning ("file %s: line %d: assertion \"%s\" failed.", \ - __FILE__, \ - __LINE__, \ - #expr); \ - return val; \ + __FILE__, \ + __LINE__, \ + #expr); \ + return val; \ }; }G_STMT_END #endif /* !__GNUC__ */ @@ -433,9 +433,9 @@ typedef unsigned long guint32; /* This should never happen */ #endif -typedef gint32 gssize; +typedef gint32 gssize; typedef guint32 gsize; -typedef gint32 gtime; +typedef gint32 gtime; typedef guint32 GQuark; typedef struct _GList GList; @@ -456,7 +456,7 @@ typedef struct _GScannerConfig GScannerConfig; typedef struct _GScanner GScanner; typedef union _GValue GValue; typedef struct _GRelation GRelation; -typedef struct _GTuples GTuples; +typedef struct _GTuples GTuples; typedef void (*GFunc) (gpointer data, @@ -473,16 +473,16 @@ typedef gint (*GTraverseFunc) (gpointer key, typedef gint (*GSearchFunc) (gpointer key, gpointer data); typedef void (*GErrorFunc) (gchar *str); -typedef void (*GWarningFunc) (gchar *str); -typedef void (*GPrintFunc) (gchar *str); +typedef void (*GWarningFunc) (gchar *str); +typedef void (*GPrintFunc) (gchar *str); typedef void (*GScannerMsgFunc) (GScanner *scanner, gchar *message, gint error); typedef void (*GDestroyNotify) (gpointer data); -typedef guint (*GHashFunc) (gconstpointer key); -typedef gint (*GCompareFunc) (gconstpointer a, - gconstpointer b); +typedef guint (*GHashFunc) (gconstpointer key); +typedef gint (*GCompareFunc) (gconstpointer a, + gconstpointer b); struct _GList { @@ -512,13 +512,13 @@ struct _GArray struct _GByteArray { guint8 *data; - guint len; + guint len; }; struct _GPtrArray { gpointer *pdata; - guint len; + guint len; }; struct _GTuples @@ -529,7 +529,7 @@ struct _GTuples struct _GDebugKey { gchar *key; - guint value; + guint value; }; struct _GCache { gint dummy; }; @@ -548,89 +548,89 @@ typedef enum /* Doubly linked lists */ -GList* g_list_alloc (void); -void g_list_free (GList *list); -void g_list_free_1 (GList *list); -GList* g_list_append (GList *list, - gpointer data); -GList* g_list_prepend (GList *list, - gpointer data); -GList* g_list_insert (GList *list, - gpointer data, - gint position); +GList* g_list_alloc (void); +void g_list_free (GList *list); +void g_list_free_1 (GList *list); +GList* g_list_append (GList *list, + gpointer data); +GList* g_list_prepend (GList *list, + gpointer data); +GList* g_list_insert (GList *list, + gpointer data, + gint position); GList* g_list_insert_sorted (GList *list, - gpointer data, + gpointer data, GCompareFunc func); -GList* g_list_concat (GList *list1, - GList *list2); -GList* g_list_remove (GList *list, - gpointer data); -GList* g_list_remove_link (GList *list, - GList *link); -GList* g_list_reverse (GList *list); -GList* g_list_nth (GList *list, - guint n); -GList* g_list_find (GList *list, - gpointer data); -GList* g_list_find_custom (GList *list, - gpointer data, - GCompareFunc func); -gint g_list_position (GList *list, - GList *link); -gint g_list_index (GList *list, - gpointer data); -GList* g_list_last (GList *list); -GList* g_list_first (GList *list); -guint g_list_length (GList *list); -void g_list_foreach (GList *list, - GFunc func, - gpointer user_data); -gpointer g_list_nth_data (GList *list, - guint n); - -#define g_list_previous(list) ((list) ? (((GList *)(list))->prev) : NULL) +GList* g_list_concat (GList *list1, + GList *list2); +GList* g_list_remove (GList *list, + gpointer data); +GList* g_list_remove_link (GList *list, + GList *link); +GList* g_list_reverse (GList *list); +GList* g_list_nth (GList *list, + guint n); +GList* g_list_find (GList *list, + gpointer data); +GList* g_list_find_custom (GList *list, + gpointer data, + GCompareFunc func); +gint g_list_position (GList *list, + GList *link); +gint g_list_index (GList *list, + gpointer data); +GList* g_list_last (GList *list); +GList* g_list_first (GList *list); +guint g_list_length (GList *list); +void g_list_foreach (GList *list, + GFunc func, + gpointer user_data); +gpointer g_list_nth_data (GList *list, + guint n); + +#define g_list_previous(list) ((list) ? (((GList *)(list))->prev) : NULL) #define g_list_next(list) ((list) ? (((GList *)(list))->next) : NULL) /* Singly linked lists */ -GSList* g_slist_alloc (void); -void g_slist_free (GSList *list); -void g_slist_free_1 (GSList *list); -GSList* g_slist_append (GSList *list, - gpointer data); -GSList* g_slist_prepend (GSList *list, - gpointer data); -GSList* g_slist_insert (GSList *list, - gpointer data, - gint position); -GSList* g_slist_insert_sorted (GSList *list, - gpointer data, +GSList* g_slist_alloc (void); +void g_slist_free (GSList *list); +void g_slist_free_1 (GSList *list); +GSList* g_slist_append (GSList *list, + gpointer data); +GSList* g_slist_prepend (GSList *list, + gpointer data); +GSList* g_slist_insert (GSList *list, + gpointer data, + gint position); +GSList* g_slist_insert_sorted (GSList *list, + gpointer data, GCompareFunc func); -GSList* g_slist_concat (GSList *list1, - GSList *list2); -GSList* g_slist_remove (GSList *list, - gpointer data); -GSList* g_slist_remove_link (GSList *list, - GSList *link); -GSList* g_slist_reverse (GSList *list); -GSList* g_slist_nth (GSList *list, - guint n); -GSList* g_slist_find (GSList *list, - gpointer data); -GSList* g_slist_find_custom (GSList *list, - gpointer data, +GSList* g_slist_concat (GSList *list1, + GSList *list2); +GSList* g_slist_remove (GSList *list, + gpointer data); +GSList* g_slist_remove_link (GSList *list, + GSList *link); +GSList* g_slist_reverse (GSList *list); +GSList* g_slist_nth (GSList *list, + guint n); +GSList* g_slist_find (GSList *list, + gpointer data); +GSList* g_slist_find_custom (GSList *list, + gpointer data, GCompareFunc func); -gint g_slist_position (GSList *list, - GSList *link); -gint g_slist_index (GSList *list, - gpointer data); -GSList* g_slist_last (GSList *list); -guint g_slist_length (GSList *list); -void g_slist_foreach (GSList *list, - GFunc func, - gpointer user_data); -gpointer g_slist_nth_data (GSList *list, - guint n); +gint g_slist_position (GSList *list, + GSList *link); +gint g_slist_index (GSList *list, + gpointer data); +GSList* g_slist_last (GSList *list); +guint g_slist_length (GSList *list); +void g_slist_foreach (GSList *list, + GFunc func, + gpointer user_data); +gpointer g_slist_nth_data (GSList *list, + guint n); #define g_slist_next(slist) ((slist) ? (((GSList *)(slist))->next) : NULL) @@ -650,10 +650,10 @@ void g_hash_table_destroy (GHashTable *hash_table); void g_hash_table_insert (GHashTable *hash_table, gpointer key, gpointer value); -void g_hash_table_remove (GHashTable *hash_table, +void g_hash_table_remove (GHashTable *hash_table, + gconstpointer key); +gpointer g_hash_table_lookup (GHashTable *hash_table, gconstpointer key); -gpointer g_hash_table_lookup (GHashTable *hash_table, - gconstpointer key); gboolean g_hash_table_lookup_extended(GHashTable *hash_table, gconstpointer lookup_key, gpointer *orig_key, @@ -798,31 +798,49 @@ void g_warning (const gchar *format, ...) G_GNUC_PRINTF (1, 2); void g_message (const gchar *format, ...) G_GNUC_PRINTF (1, 2); void g_print (const gchar *format, ...) G_GNUC_PRINTF (1, 2); -/* Utility functions + +/* String utility functions */ #define G_STR_DELIMITERS "_-|> <." -void g_strdelimit (gchar *string, +void g_strdelimit (gchar *string, const gchar *delimiters, - gchar new_delimiter); -gchar* g_strdup (const gchar *str); -gchar* g_strconcat (const gchar *string1, + gchar new_delimiter); +gchar* g_strdup (const gchar *str); +gchar* g_strconcat (const gchar *string1, ...); /* NULL terminated */ -gdouble g_strtod (const gchar *nptr, - gchar **endptr); -gchar* g_strerror (gint errnum); -gchar* g_strsignal (gint signum); -gint g_strcasecmp (const gchar *s1, +gdouble g_strtod (const gchar *nptr, + gchar **endptr); +gchar* g_strerror (gint errnum); +gchar* g_strsignal (gint signum); +gint g_strcasecmp (const gchar *s1, const gchar *s2); -void g_strdown (gchar *string); -void g_strup (gchar *string); -void g_strreverse (gchar *string); -guint g_parse_debug_string (const gchar *string, +void g_strdown (gchar *string); +void g_strup (gchar *string); +void g_strreverse (gchar *string); + + +/* Retrive static info + */ +gchar* g_get_user_name (void); +gchar* g_get_real_name (void); +gchar* g_get_home_dir (void); +gchar* g_get_tmp_dir (void); +gchar* g_get_prgname (void); +void g_set_prgname (const gchar *prgname); + + +/* Miscellaneous utility functions + */ +guint g_parse_debug_string (const gchar *string, GDebugKey *keys, - guint nkeys); -gint g_snprintf (gchar *string, - gulong n, + guint nkeys); +gint g_snprintf (gchar *string, + gulong n, gchar const *format, ...) G_GNUC_PRINTF (3, 4); +gchar* g_basename (const gchar *file_name); +gchar* g_getcwd (void); + /* We make the assumption that if memmove isn't available, then * bcopy will do the job. This isn't safe everywhere. (bcopy can't @@ -842,9 +860,9 @@ GPrintFunc g_set_print_handler (GPrintFunc func); void g_debug (const gchar *progname); void g_attach_process (const gchar *progname, - gint query); + gint query); void g_stack_trace (const gchar *progname, - gint query); + gint query); /* String Chunks @@ -860,35 +878,35 @@ gchar* g_string_chunk_insert_const (GStringChunk *chunk, */ GString* g_string_new (const gchar *init); GString* g_string_sized_new (guint dfl_size); -void g_string_free (GString *string, - gint free_segment); -GString* g_string_assign (GString *lval, +void g_string_free (GString *string, + gint free_segment); +GString* g_string_assign (GString *lval, const gchar *rval); -GString* g_string_truncate (GString *string, - gint len); -GString* g_string_append (GString *string, +GString* g_string_truncate (GString *string, + gint len); +GString* g_string_append (GString *string, const gchar *val); -GString* g_string_append_c (GString *string, - gchar c); -GString* g_string_prepend (GString *string, +GString* g_string_append_c (GString *string, + gchar c); +GString* g_string_prepend (GString *string, const gchar *val); -GString* g_string_prepend_c (GString *string, - gchar c); +GString* g_string_prepend_c (GString *string, + gchar c); GString* g_string_insert (GString *string, - gint pos, + gint pos, const gchar *val); -GString* g_string_insert_c (GString *string, - gint pos, - gchar c); -GString* g_string_erase (GString *string, - gint pos, - gint len); -GString* g_string_down (GString *string); -GString* g_string_up (GString *string); -void g_string_sprintf (GString *string, +GString* g_string_insert_c (GString *string, + gint pos, + gchar c); +GString* g_string_erase (GString *string, + gint pos, + gint len); +GString* g_string_down (GString *string); +GString* g_string_up (GString *string); +void g_string_sprintf (GString *string, const gchar *format, ...) G_GNUC_PRINTF (2, 3); -void g_string_sprintfa (GString *string, +void g_string_sprintfa (GString *string, const gchar *format, ...) G_GNUC_PRINTF (2, 3); @@ -927,35 +945,35 @@ GArray* g_rarray_truncate (GArray *array, * cleared spot and shortens the array. */ -#define g_ptr_array_index(array,index) (array->pdata)[index] +#define g_ptr_array_index(array,index) (array->pdata)[index] -GPtrArray* g_ptr_array_new (void); -void g_ptr_array_free (GPtrArray *array, - gboolean free_seg); -void g_ptr_array_set_size (GPtrArray *array, +GPtrArray* g_ptr_array_new (void); +void g_ptr_array_free (GPtrArray *array, + gboolean free_seg); +void g_ptr_array_set_size (GPtrArray *array, gint length); -void g_ptr_array_remove_index (GPtrArray *array, - gint index); -gboolean g_ptr_array_remove (GPtrArray *array, - gpointer data); -void g_ptr_array_add (GPtrArray *array, - gpointer data); +void g_ptr_array_remove_index (GPtrArray *array, + gint index); +gboolean g_ptr_array_remove (GPtrArray *array, + gpointer data); +void g_ptr_array_add (GPtrArray *array, + gpointer data); /* Byte arrays, an array of guint8. Implemented as a GArray, * but type-safe. */ -GByteArray* g_byte_array_new (void); -void g_byte_array_free (GByteArray *array, - gint free_segment); +GByteArray* g_byte_array_new (void); +void g_byte_array_free (GByteArray *array, + gint free_segment); -GByteArray* g_byte_array_append (GByteArray *array, +GByteArray* g_byte_array_append (GByteArray *array, const guint8 *data, - guint len); + guint len); -GByteArray* g_byte_array_prepend (GByteArray *array, +GByteArray* g_byte_array_prepend (GByteArray *array, const guint8 *data, - guint len); + guint len); GByteArray* g_byte_array_truncate (GByteArray *array, gint length); @@ -983,20 +1001,20 @@ gint g_direct_equal (gconstpointer v, /* Quarks (string<->id association) */ GQuark g_quark_try_string (const gchar *string); -GQuark g_quark_from_static_string (const gchar *string); -GQuark g_quark_from_string (const gchar *string); +GQuark g_quark_from_static_string (const gchar *string); +GQuark g_quark_from_string (const gchar *string); gchar* g_quark_to_string (GQuark quark); /* Location Associated Data */ -void g_dataset_destroy (gconstpointer dataset_location); -gpointer g_dataset_id_get_data (gconstpointer dataset_location, +void g_dataset_destroy (gconstpointer dataset_location); +gpointer g_dataset_id_get_data (gconstpointer dataset_location, GQuark key_id); -void g_dataset_id_set_data_full (gconstpointer dataset_location, +void g_dataset_id_set_data_full (gconstpointer dataset_location, GQuark key_id, - gpointer data, + gpointer data, GDestroyNotify destroy_func); -void g_dataset_id_set_destroy (gconstpointer dataset_location, +void g_dataset_id_set_destroy (gconstpointer dataset_location, GQuark key_id, GDestroyNotify destroy_func); @@ -1004,7 +1022,7 @@ void g_dataset_id_set_destroy (gconstpointer dataset_location, #define g_dataset_id_remove_data(l,k) G_STMT_START{g_dataset_id_set_data((l),(k),NULL);}G_STMT_END #define g_dataset_get_data(l,k) (g_dataset_id_get_data((l),g_quark_try_string(k))) #define g_dataset_set_data_full(l,k,d,f) G_STMT_START{g_dataset_id_set_data_full((l),g_quark_from_string(k),(d),(f));}G_STMT_END -#define g_dataset_set_destroy(l,k,f) G_STMT_START{g_dataset_id_set_destroy((l),g_quark_from_string(k),(f));}G_STMT_END +#define g_dataset_set_destroy(l,k,f) G_STMT_START{g_dataset_id_set_destroy((l),g_quark_from_string(k),(f));}G_STMT_END #define g_dataset_set_data(l,k,d) G_STMT_START{g_dataset_set_data_full((l),(k),(d),NULL);}G_STMT_END #define g_dataset_remove_data(l,k) G_STMT_START{g_dataset_set_data((l),(k),NULL);}G_STMT_END @@ -1222,16 +1240,16 @@ struct _GCompletion { }; -GCompletion* g_completion_new (GCompletionFunc func); -void g_completion_add_items (GCompletion* cmp, - GList* items); -void g_completion_remove_items (GCompletion* cmp, - GList* items); -void g_completion_clear_items (GCompletion* cmp); -GList* g_completion_complete (GCompletion* cmp, - gchar* prefix, - gchar** new_prefix); -void g_completion_free (GCompletion* cmp); +GCompletion* g_completion_new (GCompletionFunc func); +void g_completion_add_items (GCompletion* cmp, + GList* items); +void g_completion_remove_items (GCompletion* cmp, + GList* items); +void g_completion_clear_items (GCompletion* cmp); +GList* g_completion_complete (GCompletion* cmp, + gchar* prefix, + gchar** new_prefix); +void g_completion_free (GCompletion* cmp); /* GRelation: Indexed Relations. Imagine a really simple table in a * database. Relations are not ordered. This data type is meant for @@ -1254,31 +1272,31 @@ void g_completion_free (GCompletion* cmp); * g_relation_count() counts ... */ -GRelation* g_relation_new (gint fields); -void g_relation_destroy (GRelation *relation); -void g_relation_index (GRelation *relation, - gint field, +GRelation* g_relation_new (gint fields); +void g_relation_destroy (GRelation *relation); +void g_relation_index (GRelation *relation, + gint field, GHashFunc hash_func, GCompareFunc key_compare_func); -void g_relation_insert (GRelation *relation, +void g_relation_insert (GRelation *relation, ...); -gint g_relation_delete (GRelation *relation, +gint g_relation_delete (GRelation *relation, gconstpointer key, - gint field); + gint field); GTuples* g_relation_select (GRelation *relation, gconstpointer key, - gint field); -gint g_relation_count (GRelation *relation, + gint field); +gint g_relation_count (GRelation *relation, gconstpointer key, - gint field); + gint field); gboolean g_relation_exists (GRelation *relation, ...); -void g_relation_print (GRelation *relation); +void g_relation_print (GRelation *relation); -void g_tuples_destroy (GTuples *tuples); -gpointer g_tuples_index (GTuples *tuples, - gint index, - gint field); +void g_tuples_destroy (GTuples *tuples); +gpointer g_tuples_index (GTuples *tuples, + gint index, + gint field); /* Glib version. diff --git a/glib/gutils.c b/glib/gutils.c index c33efc4..6aac98f 100644 --- a/glib/gutils.c +++ b/glib/gutils.c @@ -16,12 +16,14 @@ * Free Software Foundation, Inc., 59 Temple Place - Suite 330, * Boston, MA 02111-1307, USA. */ +#include #include -#include #include +#include #include -#include -#include /* For tolower() */ +#include +#include +#include #include "glib.h" const guint glib_major_version = GLIB_MAJOR_VERSION; @@ -30,647 +32,9 @@ const guint glib_micro_version = GLIB_MICRO_VERSION; extern char* g_vsprintf (const gchar *fmt, va_list *args, va_list *args2); -gchar* -g_strdup (const gchar *str) -{ - gchar *new_str; - - new_str = NULL; - if (str) - { - new_str = g_new (char, strlen (str) + 1); - strcpy (new_str, str); - } - - return new_str; -} - -gchar* -g_strconcat (const gchar *string1, ...) -{ - guint l; - va_list args; - gchar *s; - gchar *concat; - - g_return_val_if_fail (string1 != NULL, NULL); - - l = 1 + strlen (string1); - va_start (args, string1); - s = va_arg (args, gchar*); - while (s) - { - l += strlen (s); - s = va_arg (args, gchar*); - } - va_end (args); - - concat = g_new (gchar, l); - concat[0] = 0; - - strcat (concat, string1); - va_start (args, string1); - s = va_arg (args, gchar*); - while (s) - { - strcat (concat, s); - s = va_arg (args, gchar*); - } - va_end (args); - - return concat; -} - -gdouble -g_strtod (const gchar *nptr, - gchar **endptr) -{ - gchar *fail_pos_1; - gchar *fail_pos_2; - gdouble val_1; - gdouble val_2 = 0; - - g_return_val_if_fail (nptr != NULL, 0); - - fail_pos_1 = NULL; - fail_pos_2 = NULL; - - val_1 = strtod (nptr, &fail_pos_1); - - if (fail_pos_1 && fail_pos_1[0] != 0) - { - gchar *old_locale; - - old_locale = setlocale (LC_NUMERIC, "C"); - val_2 = strtod (nptr, &fail_pos_2); - setlocale (LC_NUMERIC, old_locale); - } - - if (!fail_pos_1 || fail_pos_1[0] == 0 || fail_pos_1 >= fail_pos_2) - { - if (endptr) - *endptr = fail_pos_1; - return val_1; - } - else - { - if (endptr) - *endptr = fail_pos_2; - return val_2; - } -} - -gchar* -g_strerror (gint errnum) -{ - static char msg[64]; - -#ifdef HAVE_STRERROR - return strerror (errnum); -#elif NO_SYS_ERRLIST - switch (errnum) - { -#ifdef E2BIG - case E2BIG: return "argument list too long"; -#endif -#ifdef EACCES - case EACCES: return "permission denied"; -#endif -#ifdef EADDRINUSE - case EADDRINUSE: return "address already in use"; -#endif -#ifdef EADDRNOTAVAIL - case EADDRNOTAVAIL: return "can't assign requested address"; -#endif -#ifdef EADV - case EADV: return "advertise error"; -#endif -#ifdef EAFNOSUPPORT - case EAFNOSUPPORT: return "address family not supported by protocol family"; -#endif -#ifdef EAGAIN - case EAGAIN: return "try again"; -#endif -#ifdef EALIGN - case EALIGN: return "EALIGN"; -#endif -#ifdef EALREADY - case EALREADY: return "operation already in progress"; -#endif -#ifdef EBADE - case EBADE: return "bad exchange descriptor"; -#endif -#ifdef EBADF - case EBADF: return "bad file number"; -#endif -#ifdef EBADFD - case EBADFD: return "file descriptor in bad state"; -#endif -#ifdef EBADMSG - case EBADMSG: return "not a data message"; -#endif -#ifdef EBADR - case EBADR: return "bad request descriptor"; -#endif -#ifdef EBADRPC - case EBADRPC: return "RPC structure is bad"; -#endif -#ifdef EBADRQC - case EBADRQC: return "bad request code"; -#endif -#ifdef EBADSLT - case EBADSLT: return "invalid slot"; -#endif -#ifdef EBFONT - case EBFONT: return "bad font file format"; -#endif -#ifdef EBUSY - case EBUSY: return "mount device busy"; -#endif -#ifdef ECHILD - case ECHILD: return "no children"; -#endif -#ifdef ECHRNG - case ECHRNG: return "channel number out of range"; -#endif -#ifdef ECOMM - case ECOMM: return "communication error on send"; -#endif -#ifdef ECONNABORTED - case ECONNABORTED: return "software caused connection abort"; -#endif -#ifdef ECONNREFUSED - case ECONNREFUSED: return "connection refused"; -#endif -#ifdef ECONNRESET - case ECONNRESET: return "connection reset by peer"; -#endif -#if defined(EDEADLK) && (!defined(EWOULDBLOCK) || (EDEADLK != EWOULDBLOCK)) - case EDEADLK: return "resource deadlock avoided"; -#endif -#ifdef EDEADLOCK - case EDEADLOCK: return "resource deadlock avoided"; -#endif -#ifdef EDESTADDRREQ - case EDESTADDRREQ: return "destination address required"; -#endif -#ifdef EDIRTY - case EDIRTY: return "mounting a dirty fs w/o force"; -#endif -#ifdef EDOM - case EDOM: return "math argument out of range"; -#endif -#ifdef EDOTDOT - case EDOTDOT: return "cross mount point"; -#endif -#ifdef EDQUOT - case EDQUOT: return "disk quota exceeded"; -#endif -#ifdef EDUPPKG - case EDUPPKG: return "duplicate package name"; -#endif -#ifdef EEXIST - case EEXIST: return "file already exists"; -#endif -#ifdef EFAULT - case EFAULT: return "bad address in system call argument"; -#endif -#ifdef EFBIG - case EFBIG: return "file too large"; -#endif -#ifdef EHOSTDOWN - case EHOSTDOWN: return "host is down"; -#endif -#ifdef EHOSTUNREACH - case EHOSTUNREACH: return "host is unreachable"; -#endif -#ifdef EIDRM - case EIDRM: return "identifier removed"; -#endif -#ifdef EINIT - case EINIT: return "initialization error"; -#endif -#ifdef EINPROGRESS - case EINPROGRESS: return "operation now in progress"; -#endif -#ifdef EINTR - case EINTR: return "interrupted system call"; -#endif -#ifdef EINVAL - case EINVAL: return "invalid argument"; -#endif -#ifdef EIO - case EIO: return "I/O error"; -#endif -#ifdef EISCONN - case EISCONN: return "socket is already connected"; -#endif -#ifdef EISDIR - case EISDIR: return "illegal operation on a directory"; -#endif -#ifdef EISNAME - case EISNAM: return "is a name file"; -#endif -#ifdef ELBIN - case ELBIN: return "ELBIN"; -#endif -#ifdef EL2HLT - case EL2HLT: return "level 2 halted"; -#endif -#ifdef EL2NSYNC - case EL2NSYNC: return "level 2 not synchronized"; -#endif -#ifdef EL3HLT - case EL3HLT: return "level 3 halted"; -#endif -#ifdef EL3RST - case EL3RST: return "level 3 reset"; -#endif -#ifdef ELIBACC - case ELIBACC: return "can not access a needed shared library"; -#endif -#ifdef ELIBBAD - case ELIBBAD: return "accessing a corrupted shared library"; -#endif -#ifdef ELIBEXEC - case ELIBEXEC: return "can not exec a shared library directly"; -#endif -#ifdef ELIBMAX - case ELIBMAX: return "attempting to link in more shared libraries than system limit"; -#endif -#ifdef ELIBSCN - case ELIBSCN: return ".lib section in a.out corrupted"; -#endif -#ifdef ELNRNG - case ELNRNG: return "link number out of range"; -#endif -#ifdef ELOOP - case ELOOP: return "too many levels of symbolic links"; -#endif -#ifdef EMFILE - case EMFILE: return "too many open files"; -#endif -#ifdef EMLINK - case EMLINK: return "too many links"; -#endif -#ifdef EMSGSIZE - case EMSGSIZE: return "message too long"; -#endif -#ifdef EMULTIHOP - case EMULTIHOP: return "multihop attempted"; -#endif -#ifdef ENAMETOOLONG - case ENAMETOOLONG: return "file name too long"; -#endif -#ifdef ENAVAIL - case ENAVAIL: return "not available"; -#endif -#ifdef ENET - case ENET: return "ENET"; -#endif -#ifdef ENETDOWN - case ENETDOWN: return "network is down"; -#endif -#ifdef ENETRESET - case ENETRESET: return "network dropped connection on reset"; -#endif -#ifdef ENETUNREACH - case ENETUNREACH: return "network is unreachable"; -#endif -#ifdef ENFILE - case ENFILE: return "file table overflow"; -#endif -#ifdef ENOANO - case ENOANO: return "anode table overflow"; -#endif -#if defined(ENOBUFS) && (!defined(ENOSR) || (ENOBUFS != ENOSR)) - case ENOBUFS: return "no buffer space available"; -#endif -#ifdef ENOCSI - case ENOCSI: return "no CSI structure available"; -#endif -#ifdef ENODATA - case ENODATA: return "no data available"; -#endif -#ifdef ENODEV - case ENODEV: return "no such device"; -#endif -#ifdef ENOENT - case ENOENT: return "no such file or directory"; -#endif -#ifdef ENOEXEC - case ENOEXEC: return "exec format error"; -#endif -#ifdef ENOLCK - case ENOLCK: return "no locks available"; -#endif -#ifdef ENOLINK - case ENOLINK: return "link has be severed"; -#endif -#ifdef ENOMEM - case ENOMEM: return "not enough memory"; -#endif -#ifdef ENOMSG - case ENOMSG: return "no message of desired type"; -#endif -#ifdef ENONET - case ENONET: return "machine is not on the network"; -#endif -#ifdef ENOPKG - case ENOPKG: return "package not installed"; -#endif -#ifdef ENOPROTOOPT - case ENOPROTOOPT: return "bad proocol option"; -#endif -#ifdef ENOSPC - case ENOSPC: return "no space left on device"; -#endif -#ifdef ENOSR - case ENOSR: return "out of stream resources"; -#endif -#ifdef ENOSTR - case ENOSTR: return "not a stream device"; -#endif -#ifdef ENOSYM - case ENOSYM: return "unresolved symbol name"; -#endif -#ifdef ENOSYS - case ENOSYS: return "function not implemented"; -#endif -#ifdef ENOTBLK - case ENOTBLK: return "block device required"; -#endif -#ifdef ENOTCONN - case ENOTCONN: return "socket is not connected"; -#endif -#ifdef ENOTDIR - case ENOTDIR: return "not a directory"; -#endif -#ifdef ENOTEMPTY - case ENOTEMPTY: return "directory not empty"; -#endif -#ifdef ENOTNAM - case ENOTNAM: return "not a name file"; -#endif -#ifdef ENOTSOCK - case ENOTSOCK: return "socket operation on non-socket"; -#endif -#ifdef ENOTTY - case ENOTTY: return "inappropriate device for ioctl"; -#endif -#ifdef ENOTUNIQ - case ENOTUNIQ: return "name not unique on network"; -#endif -#ifdef ENXIO - case ENXIO: return "no such device or address"; -#endif -#ifdef EOPNOTSUPP - case EOPNOTSUPP: return "operation not supported on socket"; -#endif -#ifdef EPERM - case EPERM: return "not owner"; -#endif -#ifdef EPFNOSUPPORT - case EPFNOSUPPORT: return "protocol family not supported"; -#endif -#ifdef EPIPE - case EPIPE: return "broken pipe"; -#endif -#ifdef EPROCLIM - case EPROCLIM: return "too many processes"; -#endif -#ifdef EPROCUNAVAIL - case EPROCUNAVAIL: return "bad procedure for program"; -#endif -#ifdef EPROGMISMATCH - case EPROGMISMATCH: return "program version wrong"; -#endif -#ifdef EPROGUNAVAIL - case EPROGUNAVAIL: return "RPC program not available"; -#endif -#ifdef EPROTO - case EPROTO: return "protocol error"; -#endif -#ifdef EPROTONOSUPPORT - case EPROTONOSUPPORT: return "protocol not suppored"; -#endif -#ifdef EPROTOTYPE - case EPROTOTYPE: return "protocol wrong type for socket"; -#endif -#ifdef ERANGE - case ERANGE: return "math result unrepresentable"; -#endif -#if defined(EREFUSED) && (!defined(ECONNREFUSED) || (EREFUSED != ECONNREFUSED)) - case EREFUSED: return "EREFUSED"; -#endif -#ifdef EREMCHG - case EREMCHG: return "remote address changed"; -#endif -#ifdef EREMDEV - case EREMDEV: return "remote device"; -#endif -#ifdef EREMOTE - case EREMOTE: return "pathname hit remote file system"; -#endif -#ifdef EREMOTEIO - case EREMOTEIO: return "remote i/o error"; -#endif -#ifdef EREMOTERELEASE - case EREMOTERELEASE: return "EREMOTERELEASE"; -#endif -#ifdef EROFS - case EROFS: return "read-only file system"; -#endif -#ifdef ERPCMISMATCH - case ERPCMISMATCH: return "RPC version is wrong"; -#endif -#ifdef ERREMOTE - case ERREMOTE: return "object is remote"; -#endif -#ifdef ESHUTDOWN - case ESHUTDOWN: return "can't send afer socket shutdown"; -#endif -#ifdef ESOCKTNOSUPPORT - case ESOCKTNOSUPPORT: return "socket type not supported"; -#endif -#ifdef ESPIPE - case ESPIPE: return "invalid seek"; -#endif -#ifdef ESRCH - case ESRCH: return "no such process"; -#endif -#ifdef ESRMNT - case ESRMNT: return "srmount error"; -#endif -#ifdef ESTALE - case ESTALE: return "stale remote file handle"; -#endif -#ifdef ESUCCESS - case ESUCCESS: return "Error 0"; -#endif -#ifdef ETIME - case ETIME: return "timer expired"; -#endif -#ifdef ETIMEDOUT - case ETIMEDOUT: return "connection timed out"; -#endif -#ifdef ETOOMANYREFS - case ETOOMANYREFS: return "too many references: can't splice"; -#endif -#ifdef ETXTBSY - case ETXTBSY: return "text file or pseudo-device busy"; -#endif -#ifdef EUCLEAN - case EUCLEAN: return "structure needs cleaning"; -#endif -#ifdef EUNATCH - case EUNATCH: return "protocol driver not attached"; -#endif -#ifdef EUSERS - case EUSERS: return "too many users"; -#endif -#ifdef EVERSION - case EVERSION: return "version mismatch"; -#endif -#if defined(EWOULDBLOCK) && (!defined(EAGAIN) || (EWOULDBLOCK != EAGAIN)) - case EWOULDBLOCK: return "operation would block"; -#endif -#ifdef EXDEV - case EXDEV: return "cross-domain link"; -#endif -#ifdef EXFULL - case EXFULL: return "message tables full"; -#endif - } -#else /* NO_SYS_ERRLIST */ - extern int sys_nerr; - extern char *sys_errlist[]; - - if ((errnum > 0) && (errnum <= sys_nerr)) - return sys_errlist [errnum]; -#endif /* NO_SYS_ERRLIST */ - - sprintf (msg, "unknown error (%d)", errnum); - return msg; -} - -gchar* -g_strsignal (gint signum) -{ - static char msg[64]; - -#ifdef HAVE_STRSIGNAL - extern char *strsignal (int sig); - return strsignal (signum); -#elif NO_SYS_SIGLIST - switch (signum) - { -#ifdef SIGHUP - case SIGHUP: return "Hangup"; -#endif -#ifdef SIGINT - case SIGINT: return "Interrupt"; -#endif -#ifdef SIGQUIT - case SIGQUIT: return "Quit"; -#endif -#ifdef SIGILL - case SIGILL: return "Illegal instruction"; -#endif -#ifdef SIGTRAP - case SIGTRAP: return "Trace/breakpoint trap"; -#endif -#ifdef SIGABRT - case SIGABRT: return "IOT trap/Abort"; -#endif -#ifdef SIGBUS - case SIGBUS: return "Bus error"; -#endif -#ifdef SIGFPE - case SIGFPE: return "Floating point exception"; -#endif -#ifdef SIGKILL - case SIGKILL: return "Killed"; -#endif -#ifdef SIGUSR1 - case SIGUSR1: return "User defined signal 1"; -#endif -#ifdef SIGSEGV - case SIGSEGV: return "Segmentation fault"; -#endif -#ifdef SIGUSR2 - case SIGUSR2: return "User defined signal 2"; -#endif -#ifdef SIGPIPE - case SIGPIPE: return "Broken pipe"; -#endif -#ifdef SIGALRM - case SIGALRM: return "Alarm clock"; -#endif -#ifdef SIGTERM - case SIGTERM: return "Terminated"; -#endif -#ifdef SIGSTKFLT - case SIGSTKFLT: return "Stack fault"; -#endif -#ifdef SIGCHLD - case SIGCHLD: return "Child exited"; -#endif -#ifdef SIGCONT - case SIGCONT: return "Continued"; -#endif -#ifdef SIGSTOP - case SIGSTOP: return "Stopped (signal)"; -#endif -#ifdef SIGTSTP - case SIGTSTP: return "Stopped"; -#endif -#ifdef SIGTTIN - case SIGTTIN: return "Stopped (tty input)"; -#endif -#ifdef SIGTTOU - case SIGTTOU: return "Stopped (tty output)"; -#endif -#ifdef SIGURG - case SIGURG: return "Urgent condition"; -#endif -#ifdef SIGXCPU - case SIGXCPU: return "CPU time limit exceeded"; -#endif -#ifdef SIGXFSZ - case SIGXFSZ: return "File size limit exceeded"; -#endif -#ifdef SIGVTALRM - case SIGVTALRM: return "Virtual time alarm"; -#endif -#ifdef SIGPROF - case SIGPROF: return "Profile signal"; -#endif -#ifdef SIGWINCH - case SIGWINCH: return "Window size changed"; -#endif -#ifdef SIGIO - case SIGIO: return "Possible I/O"; -#endif -#ifdef SIGPWR - case SIGPWR: return "Power failure"; -#endif -#ifdef SIGUNUSED - case SIGUNUSED: return "Unused signal"; -#endif - } -#else /* NO_SYS_SIGLIST */ - extern char *sys_siglist[]; - return sys_siglist [signum]; -#endif /* NO_SYS_SIGLIST */ - - sprintf (msg, "unknown signal (%d)", signum); - return msg; -} - gint -g_snprintf (gchar *str, - gulong n, +g_snprintf (gchar *str, + gulong n, gchar const *fmt, ...) { @@ -681,13 +45,13 @@ g_snprintf (gchar *str, va_start (args, fmt); retval = vsnprintf (str, n, fmt, args); va_end (args); - + return retval; - + #else gchar *printed; va_list args, args2; - + va_start (args, fmt); va_start (args2, fmt); @@ -697,123 +61,22 @@ g_snprintf (gchar *str, va_end (args2); va_end (args); - + return strlen (str); - -#endif -} - -void -g_strdown (gchar *string) -{ - register gchar *s; - - g_return_if_fail (string != NULL); - - s = string; - - while (*s) - { - *s = tolower (*s); - s++; - } -} - -void -g_strup (gchar *string) -{ - register gchar *s; - - g_return_if_fail (string != NULL); - - s = string; - - while (*s) - { - *s = toupper (*s); - s++; - } -} - -void -g_strreverse (gchar *string) -{ - g_return_if_fail (string != NULL); - - if (*string) - { - register gchar *h, *t; - - h = string; - t = string + strlen (string) - 1; - - while (h < t) - { - register gchar c; - - c = *h; - *h = *t; - h++; - *t = c; - t--; - } - } -} - -gint -g_strcasecmp (const gchar *s1, - const gchar *s2) -{ -#ifdef HAVE_STRCASECMP - return strcasecmp (s1, s2); -#else - gint c1, c2; - - while (*s1 && *s2) - { - /* According to A. Cox, some platforms have islower's that - * don't work right on non-uppercase - */ - c1 = isupper ((guchar)*s1) ? tolower ((guchar)*s1) : *s1; - c2 = isupper ((guchar)*s2) ? tolower ((guchar)*s2) : *s2; - if (c1 != c2) - return (c1 - c2); - s1++; s2++; - } - - return (((gint)(guchar) *s1) - ((gint)(guchar) *s2)); + #endif } -void -g_strdelimit (gchar *string, - const gchar *delimiters, - gchar new_delim) -{ - register gchar *c; - - g_return_if_fail (string != NULL); - - if (!delimiters) - delimiters = G_STR_DELIMITERS; - - for (c = string; *c; c++) - { - if (strchr (delimiters, *c)) - *c = new_delim; - } -} - -guint +guint g_parse_debug_string (const gchar *string, GDebugKey *keys, - guint nkeys) + guint nkeys) { guint i; guint result = 0; - + g_return_val_if_fail (string != NULL, 0); - + if (!g_strcasecmp (string, "all")) { for (i=0; ipw_name); + g_real_name = g_strdup (pw->pw_gecos); + if (!g_home_dir) + g_home_dir = g_strdup (pw->pw_dir); + } + } +} + +gchar* +g_get_user_name (void) +{ + if (!g_tmp_dir) + g_get_any_init (); + + return g_user_name; +} + +gchar* +g_get_real_name (void) +{ + if (!g_tmp_dir) + g_get_any_init (); + + return g_real_name; +} + +gchar* +g_get_home_dir (void) +{ + if (!g_tmp_dir) + g_get_any_init (); + + return g_home_dir; +} + +gchar* +g_get_tmp_dir (void) +{ + if (!g_tmp_dir) + g_get_any_init (); + + return g_tmp_dir; +} + +static gchar *g_prgname = NULL; + +gchar* +g_get_prgname (void) +{ + return g_prgname; +} + +void +g_set_prgname (const gchar *prgname) +{ + gchar *c = g_prgname; + + g_prgname = g_strdup (prgname); + g_free (c); +} + guint g_direct_hash(gconstpointer v) { diff --git a/gutils.c b/gutils.c index c33efc4..6aac98f 100644 --- a/gutils.c +++ b/gutils.c @@ -16,12 +16,14 @@ * Free Software Foundation, Inc., 59 Temple Place - Suite 330, * Boston, MA 02111-1307, USA. */ +#include #include -#include #include +#include #include -#include -#include /* For tolower() */ +#include +#include +#include #include "glib.h" const guint glib_major_version = GLIB_MAJOR_VERSION; @@ -30,647 +32,9 @@ const guint glib_micro_version = GLIB_MICRO_VERSION; extern char* g_vsprintf (const gchar *fmt, va_list *args, va_list *args2); -gchar* -g_strdup (const gchar *str) -{ - gchar *new_str; - - new_str = NULL; - if (str) - { - new_str = g_new (char, strlen (str) + 1); - strcpy (new_str, str); - } - - return new_str; -} - -gchar* -g_strconcat (const gchar *string1, ...) -{ - guint l; - va_list args; - gchar *s; - gchar *concat; - - g_return_val_if_fail (string1 != NULL, NULL); - - l = 1 + strlen (string1); - va_start (args, string1); - s = va_arg (args, gchar*); - while (s) - { - l += strlen (s); - s = va_arg (args, gchar*); - } - va_end (args); - - concat = g_new (gchar, l); - concat[0] = 0; - - strcat (concat, string1); - va_start (args, string1); - s = va_arg (args, gchar*); - while (s) - { - strcat (concat, s); - s = va_arg (args, gchar*); - } - va_end (args); - - return concat; -} - -gdouble -g_strtod (const gchar *nptr, - gchar **endptr) -{ - gchar *fail_pos_1; - gchar *fail_pos_2; - gdouble val_1; - gdouble val_2 = 0; - - g_return_val_if_fail (nptr != NULL, 0); - - fail_pos_1 = NULL; - fail_pos_2 = NULL; - - val_1 = strtod (nptr, &fail_pos_1); - - if (fail_pos_1 && fail_pos_1[0] != 0) - { - gchar *old_locale; - - old_locale = setlocale (LC_NUMERIC, "C"); - val_2 = strtod (nptr, &fail_pos_2); - setlocale (LC_NUMERIC, old_locale); - } - - if (!fail_pos_1 || fail_pos_1[0] == 0 || fail_pos_1 >= fail_pos_2) - { - if (endptr) - *endptr = fail_pos_1; - return val_1; - } - else - { - if (endptr) - *endptr = fail_pos_2; - return val_2; - } -} - -gchar* -g_strerror (gint errnum) -{ - static char msg[64]; - -#ifdef HAVE_STRERROR - return strerror (errnum); -#elif NO_SYS_ERRLIST - switch (errnum) - { -#ifdef E2BIG - case E2BIG: return "argument list too long"; -#endif -#ifdef EACCES - case EACCES: return "permission denied"; -#endif -#ifdef EADDRINUSE - case EADDRINUSE: return "address already in use"; -#endif -#ifdef EADDRNOTAVAIL - case EADDRNOTAVAIL: return "can't assign requested address"; -#endif -#ifdef EADV - case EADV: return "advertise error"; -#endif -#ifdef EAFNOSUPPORT - case EAFNOSUPPORT: return "address family not supported by protocol family"; -#endif -#ifdef EAGAIN - case EAGAIN: return "try again"; -#endif -#ifdef EALIGN - case EALIGN: return "EALIGN"; -#endif -#ifdef EALREADY - case EALREADY: return "operation already in progress"; -#endif -#ifdef EBADE - case EBADE: return "bad exchange descriptor"; -#endif -#ifdef EBADF - case EBADF: return "bad file number"; -#endif -#ifdef EBADFD - case EBADFD: return "file descriptor in bad state"; -#endif -#ifdef EBADMSG - case EBADMSG: return "not a data message"; -#endif -#ifdef EBADR - case EBADR: return "bad request descriptor"; -#endif -#ifdef EBADRPC - case EBADRPC: return "RPC structure is bad"; -#endif -#ifdef EBADRQC - case EBADRQC: return "bad request code"; -#endif -#ifdef EBADSLT - case EBADSLT: return "invalid slot"; -#endif -#ifdef EBFONT - case EBFONT: return "bad font file format"; -#endif -#ifdef EBUSY - case EBUSY: return "mount device busy"; -#endif -#ifdef ECHILD - case ECHILD: return "no children"; -#endif -#ifdef ECHRNG - case ECHRNG: return "channel number out of range"; -#endif -#ifdef ECOMM - case ECOMM: return "communication error on send"; -#endif -#ifdef ECONNABORTED - case ECONNABORTED: return "software caused connection abort"; -#endif -#ifdef ECONNREFUSED - case ECONNREFUSED: return "connection refused"; -#endif -#ifdef ECONNRESET - case ECONNRESET: return "connection reset by peer"; -#endif -#if defined(EDEADLK) && (!defined(EWOULDBLOCK) || (EDEADLK != EWOULDBLOCK)) - case EDEADLK: return "resource deadlock avoided"; -#endif -#ifdef EDEADLOCK - case EDEADLOCK: return "resource deadlock avoided"; -#endif -#ifdef EDESTADDRREQ - case EDESTADDRREQ: return "destination address required"; -#endif -#ifdef EDIRTY - case EDIRTY: return "mounting a dirty fs w/o force"; -#endif -#ifdef EDOM - case EDOM: return "math argument out of range"; -#endif -#ifdef EDOTDOT - case EDOTDOT: return "cross mount point"; -#endif -#ifdef EDQUOT - case EDQUOT: return "disk quota exceeded"; -#endif -#ifdef EDUPPKG - case EDUPPKG: return "duplicate package name"; -#endif -#ifdef EEXIST - case EEXIST: return "file already exists"; -#endif -#ifdef EFAULT - case EFAULT: return "bad address in system call argument"; -#endif -#ifdef EFBIG - case EFBIG: return "file too large"; -#endif -#ifdef EHOSTDOWN - case EHOSTDOWN: return "host is down"; -#endif -#ifdef EHOSTUNREACH - case EHOSTUNREACH: return "host is unreachable"; -#endif -#ifdef EIDRM - case EIDRM: return "identifier removed"; -#endif -#ifdef EINIT - case EINIT: return "initialization error"; -#endif -#ifdef EINPROGRESS - case EINPROGRESS: return "operation now in progress"; -#endif -#ifdef EINTR - case EINTR: return "interrupted system call"; -#endif -#ifdef EINVAL - case EINVAL: return "invalid argument"; -#endif -#ifdef EIO - case EIO: return "I/O error"; -#endif -#ifdef EISCONN - case EISCONN: return "socket is already connected"; -#endif -#ifdef EISDIR - case EISDIR: return "illegal operation on a directory"; -#endif -#ifdef EISNAME - case EISNAM: return "is a name file"; -#endif -#ifdef ELBIN - case ELBIN: return "ELBIN"; -#endif -#ifdef EL2HLT - case EL2HLT: return "level 2 halted"; -#endif -#ifdef EL2NSYNC - case EL2NSYNC: return "level 2 not synchronized"; -#endif -#ifdef EL3HLT - case EL3HLT: return "level 3 halted"; -#endif -#ifdef EL3RST - case EL3RST: return "level 3 reset"; -#endif -#ifdef ELIBACC - case ELIBACC: return "can not access a needed shared library"; -#endif -#ifdef ELIBBAD - case ELIBBAD: return "accessing a corrupted shared library"; -#endif -#ifdef ELIBEXEC - case ELIBEXEC: return "can not exec a shared library directly"; -#endif -#ifdef ELIBMAX - case ELIBMAX: return "attempting to link in more shared libraries than system limit"; -#endif -#ifdef ELIBSCN - case ELIBSCN: return ".lib section in a.out corrupted"; -#endif -#ifdef ELNRNG - case ELNRNG: return "link number out of range"; -#endif -#ifdef ELOOP - case ELOOP: return "too many levels of symbolic links"; -#endif -#ifdef EMFILE - case EMFILE: return "too many open files"; -#endif -#ifdef EMLINK - case EMLINK: return "too many links"; -#endif -#ifdef EMSGSIZE - case EMSGSIZE: return "message too long"; -#endif -#ifdef EMULTIHOP - case EMULTIHOP: return "multihop attempted"; -#endif -#ifdef ENAMETOOLONG - case ENAMETOOLONG: return "file name too long"; -#endif -#ifdef ENAVAIL - case ENAVAIL: return "not available"; -#endif -#ifdef ENET - case ENET: return "ENET"; -#endif -#ifdef ENETDOWN - case ENETDOWN: return "network is down"; -#endif -#ifdef ENETRESET - case ENETRESET: return "network dropped connection on reset"; -#endif -#ifdef ENETUNREACH - case ENETUNREACH: return "network is unreachable"; -#endif -#ifdef ENFILE - case ENFILE: return "file table overflow"; -#endif -#ifdef ENOANO - case ENOANO: return "anode table overflow"; -#endif -#if defined(ENOBUFS) && (!defined(ENOSR) || (ENOBUFS != ENOSR)) - case ENOBUFS: return "no buffer space available"; -#endif -#ifdef ENOCSI - case ENOCSI: return "no CSI structure available"; -#endif -#ifdef ENODATA - case ENODATA: return "no data available"; -#endif -#ifdef ENODEV - case ENODEV: return "no such device"; -#endif -#ifdef ENOENT - case ENOENT: return "no such file or directory"; -#endif -#ifdef ENOEXEC - case ENOEXEC: return "exec format error"; -#endif -#ifdef ENOLCK - case ENOLCK: return "no locks available"; -#endif -#ifdef ENOLINK - case ENOLINK: return "link has be severed"; -#endif -#ifdef ENOMEM - case ENOMEM: return "not enough memory"; -#endif -#ifdef ENOMSG - case ENOMSG: return "no message of desired type"; -#endif -#ifdef ENONET - case ENONET: return "machine is not on the network"; -#endif -#ifdef ENOPKG - case ENOPKG: return "package not installed"; -#endif -#ifdef ENOPROTOOPT - case ENOPROTOOPT: return "bad proocol option"; -#endif -#ifdef ENOSPC - case ENOSPC: return "no space left on device"; -#endif -#ifdef ENOSR - case ENOSR: return "out of stream resources"; -#endif -#ifdef ENOSTR - case ENOSTR: return "not a stream device"; -#endif -#ifdef ENOSYM - case ENOSYM: return "unresolved symbol name"; -#endif -#ifdef ENOSYS - case ENOSYS: return "function not implemented"; -#endif -#ifdef ENOTBLK - case ENOTBLK: return "block device required"; -#endif -#ifdef ENOTCONN - case ENOTCONN: return "socket is not connected"; -#endif -#ifdef ENOTDIR - case ENOTDIR: return "not a directory"; -#endif -#ifdef ENOTEMPTY - case ENOTEMPTY: return "directory not empty"; -#endif -#ifdef ENOTNAM - case ENOTNAM: return "not a name file"; -#endif -#ifdef ENOTSOCK - case ENOTSOCK: return "socket operation on non-socket"; -#endif -#ifdef ENOTTY - case ENOTTY: return "inappropriate device for ioctl"; -#endif -#ifdef ENOTUNIQ - case ENOTUNIQ: return "name not unique on network"; -#endif -#ifdef ENXIO - case ENXIO: return "no such device or address"; -#endif -#ifdef EOPNOTSUPP - case EOPNOTSUPP: return "operation not supported on socket"; -#endif -#ifdef EPERM - case EPERM: return "not owner"; -#endif -#ifdef EPFNOSUPPORT - case EPFNOSUPPORT: return "protocol family not supported"; -#endif -#ifdef EPIPE - case EPIPE: return "broken pipe"; -#endif -#ifdef EPROCLIM - case EPROCLIM: return "too many processes"; -#endif -#ifdef EPROCUNAVAIL - case EPROCUNAVAIL: return "bad procedure for program"; -#endif -#ifdef EPROGMISMATCH - case EPROGMISMATCH: return "program version wrong"; -#endif -#ifdef EPROGUNAVAIL - case EPROGUNAVAIL: return "RPC program not available"; -#endif -#ifdef EPROTO - case EPROTO: return "protocol error"; -#endif -#ifdef EPROTONOSUPPORT - case EPROTONOSUPPORT: return "protocol not suppored"; -#endif -#ifdef EPROTOTYPE - case EPROTOTYPE: return "protocol wrong type for socket"; -#endif -#ifdef ERANGE - case ERANGE: return "math result unrepresentable"; -#endif -#if defined(EREFUSED) && (!defined(ECONNREFUSED) || (EREFUSED != ECONNREFUSED)) - case EREFUSED: return "EREFUSED"; -#endif -#ifdef EREMCHG - case EREMCHG: return "remote address changed"; -#endif -#ifdef EREMDEV - case EREMDEV: return "remote device"; -#endif -#ifdef EREMOTE - case EREMOTE: return "pathname hit remote file system"; -#endif -#ifdef EREMOTEIO - case EREMOTEIO: return "remote i/o error"; -#endif -#ifdef EREMOTERELEASE - case EREMOTERELEASE: return "EREMOTERELEASE"; -#endif -#ifdef EROFS - case EROFS: return "read-only file system"; -#endif -#ifdef ERPCMISMATCH - case ERPCMISMATCH: return "RPC version is wrong"; -#endif -#ifdef ERREMOTE - case ERREMOTE: return "object is remote"; -#endif -#ifdef ESHUTDOWN - case ESHUTDOWN: return "can't send afer socket shutdown"; -#endif -#ifdef ESOCKTNOSUPPORT - case ESOCKTNOSUPPORT: return "socket type not supported"; -#endif -#ifdef ESPIPE - case ESPIPE: return "invalid seek"; -#endif -#ifdef ESRCH - case ESRCH: return "no such process"; -#endif -#ifdef ESRMNT - case ESRMNT: return "srmount error"; -#endif -#ifdef ESTALE - case ESTALE: return "stale remote file handle"; -#endif -#ifdef ESUCCESS - case ESUCCESS: return "Error 0"; -#endif -#ifdef ETIME - case ETIME: return "timer expired"; -#endif -#ifdef ETIMEDOUT - case ETIMEDOUT: return "connection timed out"; -#endif -#ifdef ETOOMANYREFS - case ETOOMANYREFS: return "too many references: can't splice"; -#endif -#ifdef ETXTBSY - case ETXTBSY: return "text file or pseudo-device busy"; -#endif -#ifdef EUCLEAN - case EUCLEAN: return "structure needs cleaning"; -#endif -#ifdef EUNATCH - case EUNATCH: return "protocol driver not attached"; -#endif -#ifdef EUSERS - case EUSERS: return "too many users"; -#endif -#ifdef EVERSION - case EVERSION: return "version mismatch"; -#endif -#if defined(EWOULDBLOCK) && (!defined(EAGAIN) || (EWOULDBLOCK != EAGAIN)) - case EWOULDBLOCK: return "operation would block"; -#endif -#ifdef EXDEV - case EXDEV: return "cross-domain link"; -#endif -#ifdef EXFULL - case EXFULL: return "message tables full"; -#endif - } -#else /* NO_SYS_ERRLIST */ - extern int sys_nerr; - extern char *sys_errlist[]; - - if ((errnum > 0) && (errnum <= sys_nerr)) - return sys_errlist [errnum]; -#endif /* NO_SYS_ERRLIST */ - - sprintf (msg, "unknown error (%d)", errnum); - return msg; -} - -gchar* -g_strsignal (gint signum) -{ - static char msg[64]; - -#ifdef HAVE_STRSIGNAL - extern char *strsignal (int sig); - return strsignal (signum); -#elif NO_SYS_SIGLIST - switch (signum) - { -#ifdef SIGHUP - case SIGHUP: return "Hangup"; -#endif -#ifdef SIGINT - case SIGINT: return "Interrupt"; -#endif -#ifdef SIGQUIT - case SIGQUIT: return "Quit"; -#endif -#ifdef SIGILL - case SIGILL: return "Illegal instruction"; -#endif -#ifdef SIGTRAP - case SIGTRAP: return "Trace/breakpoint trap"; -#endif -#ifdef SIGABRT - case SIGABRT: return "IOT trap/Abort"; -#endif -#ifdef SIGBUS - case SIGBUS: return "Bus error"; -#endif -#ifdef SIGFPE - case SIGFPE: return "Floating point exception"; -#endif -#ifdef SIGKILL - case SIGKILL: return "Killed"; -#endif -#ifdef SIGUSR1 - case SIGUSR1: return "User defined signal 1"; -#endif -#ifdef SIGSEGV - case SIGSEGV: return "Segmentation fault"; -#endif -#ifdef SIGUSR2 - case SIGUSR2: return "User defined signal 2"; -#endif -#ifdef SIGPIPE - case SIGPIPE: return "Broken pipe"; -#endif -#ifdef SIGALRM - case SIGALRM: return "Alarm clock"; -#endif -#ifdef SIGTERM - case SIGTERM: return "Terminated"; -#endif -#ifdef SIGSTKFLT - case SIGSTKFLT: return "Stack fault"; -#endif -#ifdef SIGCHLD - case SIGCHLD: return "Child exited"; -#endif -#ifdef SIGCONT - case SIGCONT: return "Continued"; -#endif -#ifdef SIGSTOP - case SIGSTOP: return "Stopped (signal)"; -#endif -#ifdef SIGTSTP - case SIGTSTP: return "Stopped"; -#endif -#ifdef SIGTTIN - case SIGTTIN: return "Stopped (tty input)"; -#endif -#ifdef SIGTTOU - case SIGTTOU: return "Stopped (tty output)"; -#endif -#ifdef SIGURG - case SIGURG: return "Urgent condition"; -#endif -#ifdef SIGXCPU - case SIGXCPU: return "CPU time limit exceeded"; -#endif -#ifdef SIGXFSZ - case SIGXFSZ: return "File size limit exceeded"; -#endif -#ifdef SIGVTALRM - case SIGVTALRM: return "Virtual time alarm"; -#endif -#ifdef SIGPROF - case SIGPROF: return "Profile signal"; -#endif -#ifdef SIGWINCH - case SIGWINCH: return "Window size changed"; -#endif -#ifdef SIGIO - case SIGIO: return "Possible I/O"; -#endif -#ifdef SIGPWR - case SIGPWR: return "Power failure"; -#endif -#ifdef SIGUNUSED - case SIGUNUSED: return "Unused signal"; -#endif - } -#else /* NO_SYS_SIGLIST */ - extern char *sys_siglist[]; - return sys_siglist [signum]; -#endif /* NO_SYS_SIGLIST */ - - sprintf (msg, "unknown signal (%d)", signum); - return msg; -} - gint -g_snprintf (gchar *str, - gulong n, +g_snprintf (gchar *str, + gulong n, gchar const *fmt, ...) { @@ -681,13 +45,13 @@ g_snprintf (gchar *str, va_start (args, fmt); retval = vsnprintf (str, n, fmt, args); va_end (args); - + return retval; - + #else gchar *printed; va_list args, args2; - + va_start (args, fmt); va_start (args2, fmt); @@ -697,123 +61,22 @@ g_snprintf (gchar *str, va_end (args2); va_end (args); - + return strlen (str); - -#endif -} - -void -g_strdown (gchar *string) -{ - register gchar *s; - - g_return_if_fail (string != NULL); - - s = string; - - while (*s) - { - *s = tolower (*s); - s++; - } -} - -void -g_strup (gchar *string) -{ - register gchar *s; - - g_return_if_fail (string != NULL); - - s = string; - - while (*s) - { - *s = toupper (*s); - s++; - } -} - -void -g_strreverse (gchar *string) -{ - g_return_if_fail (string != NULL); - - if (*string) - { - register gchar *h, *t; - - h = string; - t = string + strlen (string) - 1; - - while (h < t) - { - register gchar c; - - c = *h; - *h = *t; - h++; - *t = c; - t--; - } - } -} - -gint -g_strcasecmp (const gchar *s1, - const gchar *s2) -{ -#ifdef HAVE_STRCASECMP - return strcasecmp (s1, s2); -#else - gint c1, c2; - - while (*s1 && *s2) - { - /* According to A. Cox, some platforms have islower's that - * don't work right on non-uppercase - */ - c1 = isupper ((guchar)*s1) ? tolower ((guchar)*s1) : *s1; - c2 = isupper ((guchar)*s2) ? tolower ((guchar)*s2) : *s2; - if (c1 != c2) - return (c1 - c2); - s1++; s2++; - } - - return (((gint)(guchar) *s1) - ((gint)(guchar) *s2)); + #endif } -void -g_strdelimit (gchar *string, - const gchar *delimiters, - gchar new_delim) -{ - register gchar *c; - - g_return_if_fail (string != NULL); - - if (!delimiters) - delimiters = G_STR_DELIMITERS; - - for (c = string; *c; c++) - { - if (strchr (delimiters, *c)) - *c = new_delim; - } -} - -guint +guint g_parse_debug_string (const gchar *string, GDebugKey *keys, - guint nkeys) + guint nkeys) { guint i; guint result = 0; - + g_return_val_if_fail (string != NULL, 0); - + if (!g_strcasecmp (string, "all")) { for (i=0; ipw_name); + g_real_name = g_strdup (pw->pw_gecos); + if (!g_home_dir) + g_home_dir = g_strdup (pw->pw_dir); + } + } +} + +gchar* +g_get_user_name (void) +{ + if (!g_tmp_dir) + g_get_any_init (); + + return g_user_name; +} + +gchar* +g_get_real_name (void) +{ + if (!g_tmp_dir) + g_get_any_init (); + + return g_real_name; +} + +gchar* +g_get_home_dir (void) +{ + if (!g_tmp_dir) + g_get_any_init (); + + return g_home_dir; +} + +gchar* +g_get_tmp_dir (void) +{ + if (!g_tmp_dir) + g_get_any_init (); + + return g_tmp_dir; +} + +static gchar *g_prgname = NULL; + +gchar* +g_get_prgname (void) +{ + return g_prgname; +} + +void +g_set_prgname (const gchar *prgname) +{ + gchar *c = g_prgname; + + g_prgname = g_strdup (prgname); + g_free (c); +} + guint g_direct_hash(gconstpointer v) { -- 2.7.4