added a bunch of utility/wrapper functions: g_basename(), g_getcwd(),
[platform/upstream/glib.git] / gutils.c
1 /* GLIB - Library of useful routines for C programming
2  * Copyright (C) 1995-1997  Peter Mattis, Spencer Kimball and Josh MacDonald
3  *
4  * This library is free software; you can redistribute it and/or
5  * modify it under the terms of the GNU Library General Public
6  * License as published by the Free Software Foundation; either
7  * version 2 of the License, or (at your option) any later version.
8  *
9  * This library is distributed in the hope that it will be useful,
10  * but WITHOUT ANY WARRANTY; without even the implied warranty of
11  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
12  * Library General Public License for more details.
13  *
14  * You should have received a copy of the GNU Library General Public
15  * License along with this library; if not, write to the
16  * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
17  * Boston, MA 02111-1307, USA.
18  */
19 #include <unistd.h>
20 #include <stdarg.h>
21 #include <stdlib.h>
22 #include <stdio.h>
23 #include <string.h>
24 #include <pwd.h>
25 #include <sys/types.h>
26 #include <sys/param.h>
27 #include "glib.h"
28
29 const guint glib_major_version = GLIB_MAJOR_VERSION;
30 const guint glib_minor_version = GLIB_MINOR_VERSION;
31 const guint glib_micro_version = GLIB_MICRO_VERSION;
32
33 extern char* g_vsprintf (const gchar *fmt, va_list *args, va_list *args2);
34
35 gint
36 g_snprintf (gchar       *str,
37             gulong       n,
38             gchar const *fmt,
39             ...)
40 {
41 #ifdef HAVE_VSNPRINTF
42   va_list args;
43   gint retval;
44   
45   va_start (args, fmt);
46   retval = vsnprintf (str, n, fmt, args);
47   va_end (args);
48   
49   return retval;
50   
51 #else
52   gchar *printed;
53   va_list args, args2;
54   
55   va_start (args, fmt);
56   va_start (args2, fmt);
57   
58   printed = g_vsprintf (fmt, &args, &args2);
59   strncpy (str, printed, n);
60   str[n-1] = '\0';
61   
62   va_end (args2);
63   va_end (args);
64   
65   return strlen (str);
66   
67 #endif
68 }
69
70 guint        
71 g_parse_debug_string  (const gchar *string, 
72                        GDebugKey   *keys, 
73                        guint        nkeys)
74 {
75   guint i;
76   guint result = 0;
77   
78   g_return_val_if_fail (string != NULL, 0);
79   
80   if (!g_strcasecmp (string, "all"))
81     {
82       for (i=0; i<nkeys; i++)
83         result |= keys[i].value;
84     }
85   else
86     {
87       gchar *str = g_strdup (string);
88       gchar *p = str;
89       gchar *q;
90       gboolean done = FALSE;
91       
92       while (*p && !done)
93         {
94           q = strchr (p, ':');
95           if (!q)
96             {
97               q = p + strlen(p);
98               done = TRUE;
99             }
100           
101           *q = 0;
102           
103           for (i=0; i<nkeys; i++)
104             if (!g_strcasecmp(keys[i].key, p))
105               result |= keys[i].value;
106           
107           p = q+1;
108         }
109       
110       g_free (str);
111     }
112   
113   return result;
114 }
115
116 gchar*
117 g_basename (const gchar    *file_name)
118 {
119   register gchar *base;
120   
121   g_return_val_if_fail (file_name != NULL, NULL);
122   
123   base = strrchr (file_name, '/');
124   if (base)
125     return base + 1;
126   
127   return (gchar*) file_name;
128 }
129
130 gchar*
131 g_getcwd (void)
132 {
133   static gchar g_getcwd_buf[MAXPATHLEN + 1] = { 0 };
134   register gchar *dir;
135   
136   g_getcwd_buf[0] = 0;
137   
138   /* We don't use getcwd(3) on SUNOS, because, it does a popen("pwd")
139    * and, if that wasn't bad enough, hangs in doing so.
140    */
141 #if     defined (sun) && !defined (__SVR4)
142   dir = getwd (g_getcwd_buf);
143 #else   /* !sun */
144   dir = getcwd (g_getcwd_buf, MAXPATHLEN);
145 #endif  /* !sun */
146   
147   if (!dir || g_getcwd_buf[0] == 0)
148     {
149       /* hm, we should probably g_error() out here...
150        */
151       g_getcwd_buf[0] = '/';
152       g_getcwd_buf[1] = 0;
153     }
154   
155   return g_getcwd_buf;
156 }
157
158 static  gchar   *g_tmp_dir = NULL;
159 static  gchar   *g_user_name = NULL;
160 static  gchar   *g_real_name = NULL;
161 static  gchar   *g_home_dir = NULL;
162
163 static void
164 g_get_any_init (void)
165 {
166   if (!g_tmp_dir)
167     {
168       struct passwd *pw;
169       
170       g_tmp_dir = g_strdup (getenv ("TMP"));
171       if (!g_tmp_dir)
172         g_tmp_dir = g_strdup (getenv ("TEMP"));
173       if (!g_tmp_dir)
174         g_tmp_dir = g_strdup ("/tmp");
175       
176       g_home_dir = g_strdup (getenv ("HOME"));
177       
178       setpwent ();
179       pw = getpwuid (getuid ());
180       endpwent ();
181       
182       if (pw)
183         {
184           g_user_name = g_strdup (pw->pw_name);
185           g_real_name = g_strdup (pw->pw_gecos);
186           if (!g_home_dir)
187             g_home_dir = g_strdup (pw->pw_dir);
188         }
189     }
190 }
191
192 gchar*
193 g_get_user_name (void)
194 {
195   if (!g_tmp_dir)
196     g_get_any_init ();
197   
198   return g_user_name;
199 }
200
201 gchar*
202 g_get_real_name (void)
203 {
204   if (!g_tmp_dir)
205     g_get_any_init ();
206   
207   return g_real_name;
208 }
209
210 gchar*
211 g_get_home_dir (void)
212 {
213   if (!g_tmp_dir)
214     g_get_any_init ();
215   
216   return g_home_dir;
217 }
218
219 gchar*
220 g_get_tmp_dir (void)
221 {
222   if (!g_tmp_dir)
223     g_get_any_init ();
224   
225   return g_tmp_dir;
226 }
227
228 static gchar *g_prgname = NULL;
229
230 gchar*
231 g_get_prgname (void)
232 {
233   return g_prgname;
234 }
235
236 void
237 g_set_prgname (const gchar *prgname)
238 {
239   gchar *c = g_prgname;
240
241   g_prgname = g_strdup (prgname);
242   g_free (c);
243 }
244
245 guint
246 g_direct_hash(gconstpointer v)
247 {
248   return GPOINTER_TO_UINT (v);
249 }
250
251 gint
252 g_direct_equal(gconstpointer v, gconstpointer v2)
253 {
254   return GPOINTER_TO_UINT (v) == GPOINTER_TO_UINT (v2);
255 }
256
257 gint
258 g_int_equal (gconstpointer v, gconstpointer v2)
259 {
260   return *((const gint*) v) == *((const gint*) v2);
261 }
262
263 guint
264 g_int_hash (gconstpointer v)
265 {
266   return *(const gint*) v;
267 }