Move miscellaneous functions to their own files (new misc.[ch]).
[geeqie.git] / src / misc.c
1 /*
2  * Geeqie
3  * Copyright (C) 2008 The Geeqie Team
4  *
5  * Authors: Vladimir Nadvornik / Laurent Monin
6  *
7  * This software is released under the GNU General Public License (GNU GPL).
8  * Please read the included file COPYING for more information.
9  * This software comes with no warranty of any kind, use at your own risk!
10  */
11
12 #include "main.h"
13 #include "misc.h"
14
15 gdouble get_zoom_increment(void)
16 {
17         return ((options->image.zoom_increment != 0) ? (gdouble)options->image.zoom_increment / 10.0 : 1.0);
18 }
19
20 gchar *utf8_validate_or_convert(const gchar *text)
21 {
22         gint len;
23
24         if (!text) return NULL;
25         
26         len = strlen(text);
27         if (!g_utf8_validate(text, len, NULL))
28                 return g_convert(text, len, "UTF-8", "ISO-8859-1", NULL, NULL, NULL);
29
30         return g_strdup(text);
31 }
32
33 gint utf8_compare(const gchar *s1, const gchar *s2, gboolean case_sensitive)
34 {
35         gchar *s1_key, *s2_key;
36         gchar *s1_t, *s2_t;
37         gint ret;
38
39         g_assert(g_utf8_validate(s1, -1, NULL));
40         g_assert(g_utf8_validate(s2, -1, NULL));
41
42         if (!case_sensitive)
43                 {
44                 s1_t = g_utf8_casefold(s1, -1);
45                 s2_t = g_utf8_casefold(s2, -1);
46                 }
47
48         s1_key = g_utf8_collate_key(s1_t, -1);
49         s2_key = g_utf8_collate_key(s2_t, -1);
50
51         ret = strcmp(s1_key, s2_key);
52
53         g_free(s1_key);
54         g_free(s2_key);
55
56         if (!case_sensitive)
57                 {
58                 g_free(s1_t);
59                 g_free(s2_t);
60                 }
61
62         return ret;
63 }
64
65 /* Borrowed from gtkfilesystemunix.c */
66 gchar *expand_tilde(const gchar *filename)
67 {
68 #ifndef G_OS_UNIX
69         return g_strdup(filename);
70 #else
71         const gchar *notilde;
72         const gchar *slash;
73         const gchar *home;
74
75         if (filename[0] != '~')
76                 return g_strdup(filename);
77
78         notilde = filename + 1;
79         slash = strchr(notilde, G_DIR_SEPARATOR);
80         if (slash == notilde || !*notilde)
81                 {
82                 home = g_get_home_dir();
83                 if (!home)
84                         return g_strdup(filename);
85                 }
86         else
87                 {
88                 gchar *username;
89                 struct passwd *passwd;
90
91                 if (slash)
92                         username = g_strndup(notilde, slash - notilde);
93                 else
94                         username = g_strdup(notilde);
95
96                 passwd = getpwnam(username);
97                 g_free(username);
98
99                 if (!passwd)
100                         return g_strdup(filename);
101
102                 home = passwd->pw_dir;
103                 }
104
105         if (slash)
106                 return g_build_filename(home, G_DIR_SEPARATOR_S, slash + 1, NULL);
107         else
108                 return g_build_filename(home, G_DIR_SEPARATOR_S, NULL);
109 #endif
110 }