Trim trailing white spaces on empty lines.
[geeqie.git] / src / misc.c
1 /*
2  * Geeqie
3  * Copyright (C) 2008 - 2012 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         else
48                 {
49                 s1_t = (gchar *) s1;
50                 s2_t = (gchar *) s2;
51                 }
52
53         s1_key = g_utf8_collate_key(s1_t, -1);
54         s2_key = g_utf8_collate_key(s2_t, -1);
55
56         ret = strcmp(s1_key, s2_key);
57
58         g_free(s1_key);
59         g_free(s2_key);
60
61         if (!case_sensitive)
62                 {
63                 g_free(s1_t);
64                 g_free(s2_t);
65                 }
66
67         return ret;
68 }
69
70 /* Borrowed from gtkfilesystemunix.c */
71 gchar *expand_tilde(const gchar *filename)
72 {
73 #ifndef G_OS_UNIX
74         return g_strdup(filename);
75 #else
76         const gchar *notilde;
77         const gchar *slash;
78         const gchar *home;
79
80         if (filename[0] != '~')
81                 return g_strdup(filename);
82
83         notilde = filename + 1;
84         slash = strchr(notilde, G_DIR_SEPARATOR);
85         if (slash == notilde || !*notilde)
86                 {
87                 home = g_get_home_dir();
88                 if (!home)
89                         return g_strdup(filename);
90                 }
91         else
92                 {
93                 gchar *username;
94                 struct passwd *passwd;
95
96                 if (slash)
97                         username = g_strndup(notilde, slash - notilde);
98                 else
99                         username = g_strdup(notilde);
100
101                 passwd = getpwnam(username);
102                 g_free(username);
103
104                 if (!passwd)
105                         return g_strdup(filename);
106
107                 home = passwd->pw_dir;
108                 }
109
110         if (slash)
111                 return g_build_filename(home, G_DIR_SEPARATOR_S, slash + 1, NULL);
112         else
113                 return g_build_filename(home, G_DIR_SEPARATOR_S, NULL);
114 #endif
115 }
116
117
118 /* Run a command like system() but may output debug messages. */
119 int runcmd(gchar *cmd)
120 {
121 #if 1
122         return system(cmd);
123         return 0;
124 #else
125         /* For debugging purposes */
126         int retval = -1;
127         FILE *in;
128
129         DEBUG_1("Running command: %s", cmd);
130
131         in = popen(cmd, "r");
132         if (in)
133                 {
134                 int status;
135                 const gchar *msg;
136                 gchar buf[2048];
137
138                 while (fgets(buf, sizeof(buf), in) != NULL )
139                         {
140                         DEBUG_1("Output: %s", buf);
141                         }
142
143                 status = pclose(in);
144
145                 if (WIFEXITED(status))
146                         {
147                         msg = "Command terminated with exit code";
148                         retval = WEXITSTATUS(status);
149                         }
150                 else if (WIFSIGNALED(status))
151                         {
152                         msg = "Command was killed by signal";
153                         retval = WTERMSIG(status);
154                         }
155                 else
156                         {
157                         msg = "pclose() returned";
158                         retval = status;
159                         }
160
161                 DEBUG_1("%s : %d\n", msg, retval);
162         }
163
164         return retval;
165 #endif
166 }
167
168
169 /* vim: set shiftwidth=8 softtabstop=0 cindent cinoptions={1s: */