Statistics
| Branch: | Tag: | Revision:

root / libsylph / utils.h @ 8d7dcace

History | View | Annotate | Download (15.2 kB)

1 8d7dcace Hiroyuki Yamamoto
/*
2 8d7dcace Hiroyuki Yamamoto
 * LibSylph -- E-Mail client library
3 8d7dcace Hiroyuki Yamamoto
 * Copyright (C) 1999-2010 Hiroyuki Yamamoto
4 8d7dcace Hiroyuki Yamamoto
 *
5 8d7dcace Hiroyuki Yamamoto
 * This library is free software; you can redistribute it and/or
6 8d7dcace Hiroyuki Yamamoto
 * modify it under the terms of the GNU Lesser General Public
7 8d7dcace Hiroyuki Yamamoto
 * License as published by the Free Software Foundation; either
8 8d7dcace Hiroyuki Yamamoto
 * version 2.1 of the License, or (at your option) any later version.
9 8d7dcace Hiroyuki Yamamoto
 *
10 8d7dcace Hiroyuki Yamamoto
 * This library is distributed in the hope that it will be useful,
11 8d7dcace Hiroyuki Yamamoto
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
12 8d7dcace Hiroyuki Yamamoto
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
13 8d7dcace Hiroyuki Yamamoto
 * Lesser General Public License for more details.
14 8d7dcace Hiroyuki Yamamoto
 *
15 8d7dcace Hiroyuki Yamamoto
 * You should have received a copy of the GNU Lesser General Public
16 8d7dcace Hiroyuki Yamamoto
 * License along with this library; if not, write to the Free Software
17 8d7dcace Hiroyuki Yamamoto
 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
18 8d7dcace Hiroyuki Yamamoto
 */
19 8d7dcace Hiroyuki Yamamoto
20 8d7dcace Hiroyuki Yamamoto
#ifndef __UTILS_H__
21 8d7dcace Hiroyuki Yamamoto
#define __UTILS_H__
22 8d7dcace Hiroyuki Yamamoto
23 8d7dcace Hiroyuki Yamamoto
#ifdef HAVE_CONFIG_H
24 8d7dcace Hiroyuki Yamamoto
#  include "config.h"
25 8d7dcace Hiroyuki Yamamoto
#endif
26 8d7dcace Hiroyuki Yamamoto
27 8d7dcace Hiroyuki Yamamoto
#include <glib.h>
28 8d7dcace Hiroyuki Yamamoto
#include <stdio.h>
29 8d7dcace Hiroyuki Yamamoto
#include <string.h>
30 8d7dcace Hiroyuki Yamamoto
#include <stdlib.h>
31 8d7dcace Hiroyuki Yamamoto
#include <unistd.h>
32 8d7dcace Hiroyuki Yamamoto
#include <sys/types.h>
33 8d7dcace Hiroyuki Yamamoto
#include <dirent.h>
34 8d7dcace Hiroyuki Yamamoto
#include <time.h>
35 8d7dcace Hiroyuki Yamamoto
#if HAVE_ALLOCA_H
36 8d7dcace Hiroyuki Yamamoto
#  include <alloca.h>
37 8d7dcace Hiroyuki Yamamoto
#endif
38 8d7dcace Hiroyuki Yamamoto
39 8d7dcace Hiroyuki Yamamoto
/* Wrappers for C library function that take pathname arguments. */
40 8d7dcace Hiroyuki Yamamoto
#if GLIB_CHECK_VERSION(2, 6, 0)
41 8d7dcace Hiroyuki Yamamoto
#  include <glib/gstdio.h>
42 8d7dcace Hiroyuki Yamamoto
#else
43 8d7dcace Hiroyuki Yamamoto
44 8d7dcace Hiroyuki Yamamoto
#define g_open                open
45 8d7dcace Hiroyuki Yamamoto
#define g_rename        rename
46 8d7dcace Hiroyuki Yamamoto
#define g_mkdir                mkdir
47 8d7dcace Hiroyuki Yamamoto
#define g_stat                stat
48 8d7dcace Hiroyuki Yamamoto
#define g_lstat                lstat
49 8d7dcace Hiroyuki Yamamoto
#define g_unlink        unlink
50 8d7dcace Hiroyuki Yamamoto
#define g_remove        remove
51 8d7dcace Hiroyuki Yamamoto
#define g_rmdir                rmdir
52 8d7dcace Hiroyuki Yamamoto
#define g_fopen                fopen
53 8d7dcace Hiroyuki Yamamoto
#define g_freopen        freopen
54 8d7dcace Hiroyuki Yamamoto
55 8d7dcace Hiroyuki Yamamoto
#endif /* GLIB_CHECK_VERSION */
56 8d7dcace Hiroyuki Yamamoto
57 8d7dcace Hiroyuki Yamamoto
#if !GLIB_CHECK_VERSION(2, 7, 0)
58 8d7dcace Hiroyuki Yamamoto
59 8d7dcace Hiroyuki Yamamoto
#ifdef G_OS_UNIX
60 8d7dcace Hiroyuki Yamamoto
#define g_chdir                chdir
61 8d7dcace Hiroyuki Yamamoto
#define g_chmod                chmod
62 8d7dcace Hiroyuki Yamamoto
#else
63 8d7dcace Hiroyuki Yamamoto
gint g_chdir        (const gchar        *path);
64 8d7dcace Hiroyuki Yamamoto
gint g_chmod        (const gchar        *path,
65 8d7dcace Hiroyuki Yamamoto
                 gint                 mode);
66 8d7dcace Hiroyuki Yamamoto
#endif /* G_OS_UNIX */
67 8d7dcace Hiroyuki Yamamoto
68 8d7dcace Hiroyuki Yamamoto
#endif /* !GLIB_CHECK_VERSION */
69 8d7dcace Hiroyuki Yamamoto
70 8d7dcace Hiroyuki Yamamoto
#ifdef G_OS_UNIX
71 8d7dcace Hiroyuki Yamamoto
#define syl_link        link
72 8d7dcace Hiroyuki Yamamoto
#else
73 8d7dcace Hiroyuki Yamamoto
gint syl_link        (const gchar        *src,
74 8d7dcace Hiroyuki Yamamoto
                 const gchar        *dest);
75 8d7dcace Hiroyuki Yamamoto
#endif
76 8d7dcace Hiroyuki Yamamoto
77 8d7dcace Hiroyuki Yamamoto
/* The AC_CHECK_SIZEOF() in configure fails for some machines.
78 8d7dcace Hiroyuki Yamamoto
 * we provide some fallback values here */
79 8d7dcace Hiroyuki Yamamoto
#if !SIZEOF_UNSIGNED_SHORT
80 8d7dcace Hiroyuki Yamamoto
  #undef SIZEOF_UNSIGNED_SHORT
81 8d7dcace Hiroyuki Yamamoto
  #define SIZEOF_UNSIGNED_SHORT 2
82 8d7dcace Hiroyuki Yamamoto
#endif
83 8d7dcace Hiroyuki Yamamoto
#if !SIZEOF_UNSIGNED_INT
84 8d7dcace Hiroyuki Yamamoto
  #undef SIZEOF_UNSIGNED_INT
85 8d7dcace Hiroyuki Yamamoto
  #define SIZEOF_UNSIGNED_INT 4
86 8d7dcace Hiroyuki Yamamoto
#endif
87 8d7dcace Hiroyuki Yamamoto
#if !SIZEOF_UNSIGNED_LONG
88 8d7dcace Hiroyuki Yamamoto
  #undef SIZEOF_UNSIGNED_LONG
89 8d7dcace Hiroyuki Yamamoto
  #define SIZEOF_UNSIGNED_LONG 4
90 8d7dcace Hiroyuki Yamamoto
#endif
91 8d7dcace Hiroyuki Yamamoto
92 8d7dcace Hiroyuki Yamamoto
#ifndef HAVE_U32_TYPEDEF
93 8d7dcace Hiroyuki Yamamoto
  #undef u32            /* maybe there is a macro with this name */
94 8d7dcace Hiroyuki Yamamoto
  typedef guint32 u32;
95 8d7dcace Hiroyuki Yamamoto
  #define HAVE_U32_TYPEDEF
96 8d7dcace Hiroyuki Yamamoto
#endif
97 8d7dcace Hiroyuki Yamamoto
98 8d7dcace Hiroyuki Yamamoto
#ifndef BIG_ENDIAN_HOST
99 8d7dcace Hiroyuki Yamamoto
  #if (G_BYTE_ORDER == G_BIG_ENDIAN)
100 8d7dcace Hiroyuki Yamamoto
    #define BIG_ENDIAN_HOST 1
101 8d7dcace Hiroyuki Yamamoto
  #endif
102 8d7dcace Hiroyuki Yamamoto
#endif
103 8d7dcace Hiroyuki Yamamoto
104 8d7dcace Hiroyuki Yamamoto
#define CHDIR_RETURN_IF_FAIL(dir) \
105 8d7dcace Hiroyuki Yamamoto
{ \
106 8d7dcace Hiroyuki Yamamoto
        if (change_dir(dir) < 0) return; \
107 8d7dcace Hiroyuki Yamamoto
}
108 8d7dcace Hiroyuki Yamamoto
109 8d7dcace Hiroyuki Yamamoto
#define CHDIR_RETURN_VAL_IF_FAIL(dir, val) \
110 8d7dcace Hiroyuki Yamamoto
{ \
111 8d7dcace Hiroyuki Yamamoto
        if (change_dir(dir) < 0) return val; \
112 8d7dcace Hiroyuki Yamamoto
}
113 8d7dcace Hiroyuki Yamamoto
114 8d7dcace Hiroyuki Yamamoto
#define Xalloca(ptr, size, iffail) \
115 8d7dcace Hiroyuki Yamamoto
{ \
116 8d7dcace Hiroyuki Yamamoto
        if ((ptr = alloca(size)) == NULL) { \
117 8d7dcace Hiroyuki Yamamoto
                g_warning("can't allocate memory\n"); \
118 8d7dcace Hiroyuki Yamamoto
                iffail; \
119 8d7dcace Hiroyuki Yamamoto
        } \
120 8d7dcace Hiroyuki Yamamoto
}
121 8d7dcace Hiroyuki Yamamoto
122 8d7dcace Hiroyuki Yamamoto
#define Xstrdup_a(ptr, str, iffail) \
123 8d7dcace Hiroyuki Yamamoto
{ \
124 8d7dcace Hiroyuki Yamamoto
        gchar *__tmp; \
125 8d7dcace Hiroyuki Yamamoto
 \
126 8d7dcace Hiroyuki Yamamoto
        if ((__tmp = alloca(strlen(str) + 1)) == NULL) { \
127 8d7dcace Hiroyuki Yamamoto
                g_warning("can't allocate memory\n"); \
128 8d7dcace Hiroyuki Yamamoto
                iffail; \
129 8d7dcace Hiroyuki Yamamoto
        } else \
130 8d7dcace Hiroyuki Yamamoto
                strcpy(__tmp, str); \
131 8d7dcace Hiroyuki Yamamoto
 \
132 8d7dcace Hiroyuki Yamamoto
        ptr = __tmp; \
133 8d7dcace Hiroyuki Yamamoto
}
134 8d7dcace Hiroyuki Yamamoto
135 8d7dcace Hiroyuki Yamamoto
#define Xstrndup_a(ptr, str, len, iffail) \
136 8d7dcace Hiroyuki Yamamoto
{ \
137 8d7dcace Hiroyuki Yamamoto
        gchar *__tmp; \
138 8d7dcace Hiroyuki Yamamoto
 \
139 8d7dcace Hiroyuki Yamamoto
        if ((__tmp = alloca(len + 1)) == NULL) { \
140 8d7dcace Hiroyuki Yamamoto
                g_warning("can't allocate memory\n"); \
141 8d7dcace Hiroyuki Yamamoto
                iffail; \
142 8d7dcace Hiroyuki Yamamoto
        } else { \
143 8d7dcace Hiroyuki Yamamoto
                strncpy(__tmp, str, len); \
144 8d7dcace Hiroyuki Yamamoto
                __tmp[len] = '\0'; \
145 8d7dcace Hiroyuki Yamamoto
        } \
146 8d7dcace Hiroyuki Yamamoto
 \
147 8d7dcace Hiroyuki Yamamoto
        ptr = __tmp; \
148 8d7dcace Hiroyuki Yamamoto
}
149 8d7dcace Hiroyuki Yamamoto
150 8d7dcace Hiroyuki Yamamoto
#define Xstrcat_a(ptr, str1, str2, iffail) \
151 8d7dcace Hiroyuki Yamamoto
{ \
152 8d7dcace Hiroyuki Yamamoto
        gchar *__tmp; \
153 8d7dcace Hiroyuki Yamamoto
        gint len1, len2; \
154 8d7dcace Hiroyuki Yamamoto
 \
155 8d7dcace Hiroyuki Yamamoto
        len1 = strlen(str1); \
156 8d7dcace Hiroyuki Yamamoto
        len2 = strlen(str2); \
157 8d7dcace Hiroyuki Yamamoto
        if ((__tmp = alloca(len1 + len2 + 1)) == NULL) { \
158 8d7dcace Hiroyuki Yamamoto
                g_warning("can't allocate memory\n"); \
159 8d7dcace Hiroyuki Yamamoto
                iffail; \
160 8d7dcace Hiroyuki Yamamoto
        } else { \
161 8d7dcace Hiroyuki Yamamoto
                memcpy(__tmp, str1, len1); \
162 8d7dcace Hiroyuki Yamamoto
                memcpy(__tmp + len1, str2, len2 + 1); \
163 8d7dcace Hiroyuki Yamamoto
        } \
164 8d7dcace Hiroyuki Yamamoto
 \
165 8d7dcace Hiroyuki Yamamoto
        ptr = __tmp; \
166 8d7dcace Hiroyuki Yamamoto
}
167 8d7dcace Hiroyuki Yamamoto
168 8d7dcace Hiroyuki Yamamoto
#define AUTORELEASE_STR(str, iffail) \
169 8d7dcace Hiroyuki Yamamoto
{ \
170 8d7dcace Hiroyuki Yamamoto
        gchar *__str; \
171 8d7dcace Hiroyuki Yamamoto
        Xstrdup_a(__str, str, iffail); \
172 8d7dcace Hiroyuki Yamamoto
        g_free(str); \
173 8d7dcace Hiroyuki Yamamoto
        str = __str; \
174 8d7dcace Hiroyuki Yamamoto
}
175 8d7dcace Hiroyuki Yamamoto
176 8d7dcace Hiroyuki Yamamoto
#define FILE_OP_ERROR(file, func) \
177 8d7dcace Hiroyuki Yamamoto
{ \
178 8d7dcace Hiroyuki Yamamoto
        fprintf(stderr, "%s: ", file); \
179 8d7dcace Hiroyuki Yamamoto
        fflush(stderr); \
180 8d7dcace Hiroyuki Yamamoto
        perror(func); \
181 8d7dcace Hiroyuki Yamamoto
}
182 8d7dcace Hiroyuki Yamamoto
183 8d7dcace Hiroyuki Yamamoto
typedef void (*UIUpdateFunc)                (void);
184 8d7dcace Hiroyuki Yamamoto
typedef void (*EventLoopFunc)                (void);
185 8d7dcace Hiroyuki Yamamoto
typedef void (*ProgressFunc)                (gint                 cur,
186 8d7dcace Hiroyuki Yamamoto
                                         gint                 total);
187 8d7dcace Hiroyuki Yamamoto
typedef gchar * (*QueryPasswordFunc)        (const gchar        *server,
188 8d7dcace Hiroyuki Yamamoto
                                         const gchar        *user);
189 8d7dcace Hiroyuki Yamamoto
typedef void (*LogFunc)                        (const gchar        *str);
190 8d7dcace Hiroyuki Yamamoto
typedef void (*LogFlushFunc)                (void);
191 8d7dcace Hiroyuki Yamamoto
192 8d7dcace Hiroyuki Yamamoto
/* for macro expansion */
193 8d7dcace Hiroyuki Yamamoto
#define Str(x)        #x
194 8d7dcace Hiroyuki Yamamoto
#define Xstr(x)        Str(x)
195 8d7dcace Hiroyuki Yamamoto
196 8d7dcace Hiroyuki Yamamoto
void list_free_strings                (GList                *list);
197 8d7dcace Hiroyuki Yamamoto
void slist_free_strings                (GSList                *list);
198 8d7dcace Hiroyuki Yamamoto
199 8d7dcace Hiroyuki Yamamoto
void hash_free_strings                (GHashTable        *table);
200 8d7dcace Hiroyuki Yamamoto
void hash_free_value_mem        (GHashTable        *table);
201 8d7dcace Hiroyuki Yamamoto
202 8d7dcace Hiroyuki Yamamoto
gint str_case_equal                (gconstpointer         v,
203 8d7dcace Hiroyuki Yamamoto
                                 gconstpointer         v2);
204 8d7dcace Hiroyuki Yamamoto
guint str_case_hash                (gconstpointer         key);
205 8d7dcace Hiroyuki Yamamoto
206 8d7dcace Hiroyuki Yamamoto
void ptr_array_free_strings        (GPtrArray        *array);
207 8d7dcace Hiroyuki Yamamoto
208 8d7dcace Hiroyuki Yamamoto
typedef gboolean (*StrFindFunc) (const gchar        *haystack,
209 8d7dcace Hiroyuki Yamamoto
                                 const gchar        *needle);
210 8d7dcace Hiroyuki Yamamoto
211 8d7dcace Hiroyuki Yamamoto
gboolean str_find                (const gchar        *haystack,
212 8d7dcace Hiroyuki Yamamoto
                                 const gchar        *needle);
213 8d7dcace Hiroyuki Yamamoto
gboolean str_case_find                (const gchar        *haystack,
214 8d7dcace Hiroyuki Yamamoto
                                 const gchar        *needle);
215 8d7dcace Hiroyuki Yamamoto
gboolean str_find_equal                (const gchar        *haystack,
216 8d7dcace Hiroyuki Yamamoto
                                 const gchar        *needle);
217 8d7dcace Hiroyuki Yamamoto
gboolean str_case_find_equal        (const gchar        *haystack,
218 8d7dcace Hiroyuki Yamamoto
                                 const gchar        *needle);
219 8d7dcace Hiroyuki Yamamoto
220 8d7dcace Hiroyuki Yamamoto
/* number-string conversion */
221 8d7dcace Hiroyuki Yamamoto
gint to_number                        (const gchar *nstr);
222 8d7dcace Hiroyuki Yamamoto
guint to_unumber                (const gchar *nstr);
223 8d7dcace Hiroyuki Yamamoto
gchar *itos_buf                        (gchar             *nstr,
224 8d7dcace Hiroyuki Yamamoto
                                 gint              n);
225 8d7dcace Hiroyuki Yamamoto
gchar *itos                        (gint              n);
226 8d7dcace Hiroyuki Yamamoto
gchar *utos_buf                        (gchar             *nstr,
227 8d7dcace Hiroyuki Yamamoto
                                 guint              n);
228 8d7dcace Hiroyuki Yamamoto
gchar *to_human_readable_buf        (gchar             *buf,
229 8d7dcace Hiroyuki Yamamoto
                                 size_t              bufsize,
230 8d7dcace Hiroyuki Yamamoto
                                 gint64              size);
231 8d7dcace Hiroyuki Yamamoto
gchar *to_human_readable        (gint64              size);
232 8d7dcace Hiroyuki Yamamoto
233 8d7dcace Hiroyuki Yamamoto
/* alternative string functions */
234 8d7dcace Hiroyuki Yamamoto
gint strcmp2                (const gchar        *s1,
235 8d7dcace Hiroyuki Yamamoto
                         const gchar        *s2);
236 8d7dcace Hiroyuki Yamamoto
gint path_cmp                (const gchar        *s1,
237 8d7dcace Hiroyuki Yamamoto
                         const gchar        *s2);
238 8d7dcace Hiroyuki Yamamoto
gboolean is_path_parent        (const gchar        *parent,
239 8d7dcace Hiroyuki Yamamoto
                         const gchar        *child);
240 8d7dcace Hiroyuki Yamamoto
241 8d7dcace Hiroyuki Yamamoto
gchar *strretchomp        (gchar                *str);
242 8d7dcace Hiroyuki Yamamoto
gchar *strtailchomp        (gchar                *str,
243 8d7dcace Hiroyuki Yamamoto
                         gchar                 tail_char);
244 8d7dcace Hiroyuki Yamamoto
gchar *strcrchomp        (gchar                *str);
245 8d7dcace Hiroyuki Yamamoto
246 8d7dcace Hiroyuki Yamamoto
gchar *strcasestr        (const gchar        *haystack,
247 8d7dcace Hiroyuki Yamamoto
                         const gchar        *needle);
248 8d7dcace Hiroyuki Yamamoto
gpointer my_memmem        (gconstpointer         haystack,
249 8d7dcace Hiroyuki Yamamoto
                         size_t                 haystacklen,
250 8d7dcace Hiroyuki Yamamoto
                         gconstpointer         needle,
251 8d7dcace Hiroyuki Yamamoto
                         size_t                 needlelen);
252 8d7dcace Hiroyuki Yamamoto
253 8d7dcace Hiroyuki Yamamoto
gchar *strncpy2                (gchar                *dest,
254 8d7dcace Hiroyuki Yamamoto
                         const gchar        *src,
255 8d7dcace Hiroyuki Yamamoto
                         size_t                 n);
256 8d7dcace Hiroyuki Yamamoto
257 8d7dcace Hiroyuki Yamamoto
gboolean str_has_suffix_case        (const gchar        *str,
258 8d7dcace Hiroyuki Yamamoto
                                 const gchar        *suffix);
259 8d7dcace Hiroyuki Yamamoto
260 8d7dcace Hiroyuki Yamamoto
gint str_find_format_times        (const gchar        *haystack,
261 8d7dcace Hiroyuki Yamamoto
                                 gchar                 ch);
262 8d7dcace Hiroyuki Yamamoto
263 8d7dcace Hiroyuki Yamamoto
gboolean is_next_nonascii        (const gchar        *s);
264 8d7dcace Hiroyuki Yamamoto
gint get_next_word_len                (const gchar        *s);
265 8d7dcace Hiroyuki Yamamoto
266 8d7dcace Hiroyuki Yamamoto
/* functions for string parsing */
267 8d7dcace Hiroyuki Yamamoto
gint subject_compare                        (const gchar        *s1,
268 8d7dcace Hiroyuki Yamamoto
                                         const gchar        *s2);
269 8d7dcace Hiroyuki Yamamoto
gint subject_compare_for_sort                (const gchar        *s1,
270 8d7dcace Hiroyuki Yamamoto
                                         const gchar        *s2);
271 8d7dcace Hiroyuki Yamamoto
void trim_subject_for_compare                (gchar                *str);
272 8d7dcace Hiroyuki Yamamoto
void trim_subject_for_sort                (gchar                *str);
273 8d7dcace Hiroyuki Yamamoto
void trim_subject                        (gchar                *str);
274 8d7dcace Hiroyuki Yamamoto
void eliminate_parenthesis                (gchar                *str,
275 8d7dcace Hiroyuki Yamamoto
                                         gchar                 op,
276 8d7dcace Hiroyuki Yamamoto
                                         gchar                 cl);
277 8d7dcace Hiroyuki Yamamoto
void extract_parenthesis                (gchar                *str,
278 8d7dcace Hiroyuki Yamamoto
                                         gchar                 op,
279 8d7dcace Hiroyuki Yamamoto
                                         gchar                 cl);
280 8d7dcace Hiroyuki Yamamoto
void extract_parenthesis_with_escape        (gchar                *str,
281 8d7dcace Hiroyuki Yamamoto
                                         gchar                 op,
282 8d7dcace Hiroyuki Yamamoto
                                         gchar                 cl);
283 8d7dcace Hiroyuki Yamamoto
284 8d7dcace Hiroyuki Yamamoto
void extract_parenthesis_with_skip_quote        (gchar                *str,
285 8d7dcace Hiroyuki Yamamoto
                                                 gchar                 quote_chr,
286 8d7dcace Hiroyuki Yamamoto
                                                 gchar                 op,
287 8d7dcace Hiroyuki Yamamoto
                                                 gchar                 cl);
288 8d7dcace Hiroyuki Yamamoto
289 8d7dcace Hiroyuki Yamamoto
void eliminate_quote                        (gchar                *str,
290 8d7dcace Hiroyuki Yamamoto
                                         gchar                 quote_chr);
291 8d7dcace Hiroyuki Yamamoto
void extract_quote                        (gchar                *str,
292 8d7dcace Hiroyuki Yamamoto
                                         gchar                 quote_chr);
293 8d7dcace Hiroyuki Yamamoto
void extract_quote_with_escape                (gchar                *str,
294 8d7dcace Hiroyuki Yamamoto
                                         gchar                 quote_chr);
295 8d7dcace Hiroyuki Yamamoto
void eliminate_address_comment                (gchar                *str);
296 8d7dcace Hiroyuki Yamamoto
gchar *strchr_with_skip_quote                (const gchar        *str,
297 8d7dcace Hiroyuki Yamamoto
                                         gint                 quote_chr,
298 8d7dcace Hiroyuki Yamamoto
                                         gint                 c);
299 8d7dcace Hiroyuki Yamamoto
gchar *strrchr_with_skip_quote                (const gchar        *str,
300 8d7dcace Hiroyuki Yamamoto
                                         gint                 quote_chr,
301 8d7dcace Hiroyuki Yamamoto
                                         gint                 c);
302 8d7dcace Hiroyuki Yamamoto
void extract_address                        (gchar                *str);
303 8d7dcace Hiroyuki Yamamoto
void extract_list_id_str                (gchar                *str);
304 8d7dcace Hiroyuki Yamamoto
305 8d7dcace Hiroyuki Yamamoto
gchar *extract_addresses                (const gchar        *str);
306 8d7dcace Hiroyuki Yamamoto
307 8d7dcace Hiroyuki Yamamoto
gchar *normalize_address_field                (const gchar        *str);
308 8d7dcace Hiroyuki Yamamoto
309 8d7dcace Hiroyuki Yamamoto
gboolean address_equal                        (const gchar        *addr1,
310 8d7dcace Hiroyuki Yamamoto
                                         const gchar        *addr2);
311 8d7dcace Hiroyuki Yamamoto
312 8d7dcace Hiroyuki Yamamoto
GSList *address_list_append_orig        (GSList                *addr_list,
313 8d7dcace Hiroyuki Yamamoto
                                         const gchar        *str);
314 8d7dcace Hiroyuki Yamamoto
GSList *address_list_append                (GSList                *addr_list,
315 8d7dcace Hiroyuki Yamamoto
                                         const gchar        *str);
316 8d7dcace Hiroyuki Yamamoto
GSList *references_list_prepend                (GSList                *msgid_list,
317 8d7dcace Hiroyuki Yamamoto
                                         const gchar        *str);
318 8d7dcace Hiroyuki Yamamoto
GSList *references_list_append                (GSList                *msgid_list,
319 8d7dcace Hiroyuki Yamamoto
                                         const gchar        *str);
320 8d7dcace Hiroyuki Yamamoto
GSList *newsgroup_list_append                (GSList                *group_list,
321 8d7dcace Hiroyuki Yamamoto
                                         const gchar        *str);
322 8d7dcace Hiroyuki Yamamoto
323 8d7dcace Hiroyuki Yamamoto
GList *add_history                        (GList                *list,
324 8d7dcace Hiroyuki Yamamoto
                                         const gchar        *str);
325 8d7dcace Hiroyuki Yamamoto
326 8d7dcace Hiroyuki Yamamoto
/* modify string */
327 8d7dcace Hiroyuki Yamamoto
void remove_return                        (gchar                *str);
328 8d7dcace Hiroyuki Yamamoto
void remove_space                        (gchar                *str);
329 8d7dcace Hiroyuki Yamamoto
void unfold_line                        (gchar                *str);
330 8d7dcace Hiroyuki Yamamoto
void subst_char                                (gchar                *str,
331 8d7dcace Hiroyuki Yamamoto
                                         gchar                 orig,
332 8d7dcace Hiroyuki Yamamoto
                                         gchar                 subst);
333 8d7dcace Hiroyuki Yamamoto
void subst_chars                        (gchar                *str,
334 8d7dcace Hiroyuki Yamamoto
                                         gchar                *orig,
335 8d7dcace Hiroyuki Yamamoto
                                         gchar                 subst);
336 8d7dcace Hiroyuki Yamamoto
void subst_null                                (gchar                *str,
337 8d7dcace Hiroyuki Yamamoto
                                         gint                 len,
338 8d7dcace Hiroyuki Yamamoto
                                         gchar                 subst);
339 8d7dcace Hiroyuki Yamamoto
void subst_control                        (gchar                *str,
340 8d7dcace Hiroyuki Yamamoto
                                         gchar                 subst);
341 8d7dcace Hiroyuki Yamamoto
void subst_for_filename                        (gchar                *str);
342 8d7dcace Hiroyuki Yamamoto
343 8d7dcace Hiroyuki Yamamoto
gchar *get_alt_filename                        (const gchar        *filename,
344 8d7dcace Hiroyuki Yamamoto
                                         gint                 count);
345 8d7dcace Hiroyuki Yamamoto
346 8d7dcace Hiroyuki Yamamoto
gboolean is_header_line                        (const gchar        *str);
347 8d7dcace Hiroyuki Yamamoto
gboolean is_ascii_str                        (const gchar        *str);
348 8d7dcace Hiroyuki Yamamoto
349 8d7dcace Hiroyuki Yamamoto
gint get_quote_level                        (const gchar        *str);
350 8d7dcace Hiroyuki Yamamoto
gint check_line_length                        (const gchar        *str,
351 8d7dcace Hiroyuki Yamamoto
                                         gint                 max_chars,
352 8d7dcace Hiroyuki Yamamoto
                                         gint                *line);
353 8d7dcace Hiroyuki Yamamoto
354 8d7dcace Hiroyuki Yamamoto
gchar *strstr_with_skip_quote                (const gchar        *haystack,
355 8d7dcace Hiroyuki Yamamoto
                                         const gchar        *needle);
356 8d7dcace Hiroyuki Yamamoto
gchar *strcasestr_with_skip_quote        (const gchar        *haystack,
357 8d7dcace Hiroyuki Yamamoto
                                         const gchar        *needle);
358 8d7dcace Hiroyuki Yamamoto
gchar *strchr_parenthesis_close                (const gchar        *str,
359 8d7dcace Hiroyuki Yamamoto
                                         gchar                 op,
360 8d7dcace Hiroyuki Yamamoto
                                         gchar                 cl);
361 8d7dcace Hiroyuki Yamamoto
362 8d7dcace Hiroyuki Yamamoto
gchar **strsplit_parenthesis                (const gchar        *str,
363 8d7dcace Hiroyuki Yamamoto
                                         gchar                 op,
364 8d7dcace Hiroyuki Yamamoto
                                         gchar                 cl,
365 8d7dcace Hiroyuki Yamamoto
                                         gint                 max_tokens);
366 8d7dcace Hiroyuki Yamamoto
gchar **strsplit_with_quote                (const gchar        *str,
367 8d7dcace Hiroyuki Yamamoto
                                         const gchar        *delim,
368 8d7dcace Hiroyuki Yamamoto
                                         gint                 max_tokens);
369 8d7dcace Hiroyuki Yamamoto
gchar **strsplit_csv                        (const gchar        *str,
370 8d7dcace Hiroyuki Yamamoto
                                         gchar                 delim,
371 8d7dcace Hiroyuki Yamamoto
                                         gint                 max_tokens);
372 8d7dcace Hiroyuki Yamamoto
373 8d7dcace Hiroyuki Yamamoto
gchar *get_abbrev_newsgroup_name        (const gchar        *group,
374 8d7dcace Hiroyuki Yamamoto
                                         gint                 len);
375 8d7dcace Hiroyuki Yamamoto
gchar *trim_string                        (const gchar        *str,
376 8d7dcace Hiroyuki Yamamoto
                                         gint                 len);
377 8d7dcace Hiroyuki Yamamoto
gchar *trim_string_before                (const gchar        *str,
378 8d7dcace Hiroyuki Yamamoto
                                         gint                 len);
379 8d7dcace Hiroyuki Yamamoto
380 8d7dcace Hiroyuki Yamamoto
GList *uri_list_extract_filenames        (const gchar        *uri_list);
381 8d7dcace Hiroyuki Yamamoto
gboolean is_uri_string                        (const gchar        *str);
382 8d7dcace Hiroyuki Yamamoto
gchar *get_uri_path                        (const gchar        *uri);
383 8d7dcace Hiroyuki Yamamoto
gint get_uri_len                        (const gchar        *str);
384 8d7dcace Hiroyuki Yamamoto
void decode_uri                                (gchar                *decoded_uri,
385 8d7dcace Hiroyuki Yamamoto
                                         const gchar        *encoded_uri);
386 8d7dcace Hiroyuki Yamamoto
void decode_xdigit_encoded_str                (gchar                *decoded,
387 8d7dcace Hiroyuki Yamamoto
                                         const gchar        *encoded);
388 8d7dcace Hiroyuki Yamamoto
gchar *encode_uri                        (const gchar        *filename);
389 8d7dcace Hiroyuki Yamamoto
gchar *uriencode_for_filename                (const gchar        *filename);
390 8d7dcace Hiroyuki Yamamoto
gchar *uriencode_for_mailto                (const gchar        *mailto);
391 8d7dcace Hiroyuki Yamamoto
gint scan_mailto_url                        (const gchar        *mailto,
392 8d7dcace Hiroyuki Yamamoto
                                         gchar               **to,
393 8d7dcace Hiroyuki Yamamoto
                                         gchar               **cc,
394 8d7dcace Hiroyuki Yamamoto
                                         gchar               **bcc,
395 8d7dcace Hiroyuki Yamamoto
                                         gchar               **subject,
396 8d7dcace Hiroyuki Yamamoto
                                         gchar               **inreplyto,
397 8d7dcace Hiroyuki Yamamoto
                                         gchar               **body);
398 8d7dcace Hiroyuki Yamamoto
399 8d7dcace Hiroyuki Yamamoto
void set_startup_dir                        (void);
400 8d7dcace Hiroyuki Yamamoto
void set_rc_dir                                (const gchar        *dir);
401 8d7dcace Hiroyuki Yamamoto
402 8d7dcace Hiroyuki Yamamoto
/* return static strings */
403 8d7dcace Hiroyuki Yamamoto
const gchar *get_startup_dir                (void);
404 8d7dcace Hiroyuki Yamamoto
const gchar *get_home_dir                (void);
405 8d7dcace Hiroyuki Yamamoto
const gchar *get_document_dir                (void);
406 8d7dcace Hiroyuki Yamamoto
const gchar *get_rc_dir                        (void);
407 8d7dcace Hiroyuki Yamamoto
const gchar *get_old_rc_dir                (void);
408 8d7dcace Hiroyuki Yamamoto
const gchar *get_mail_base_dir                (void);
409 8d7dcace Hiroyuki Yamamoto
const gchar *get_news_cache_dir                (void);
410 8d7dcace Hiroyuki Yamamoto
const gchar *get_imap_cache_dir                (void);
411 8d7dcace Hiroyuki Yamamoto
const gchar *get_mime_tmp_dir                (void);
412 8d7dcace Hiroyuki Yamamoto
const gchar *get_template_dir                (void);
413 8d7dcace Hiroyuki Yamamoto
const gchar *get_tmp_dir                (void);
414 8d7dcace Hiroyuki Yamamoto
gchar *get_tmp_file                        (void);
415 8d7dcace Hiroyuki Yamamoto
416 8d7dcace Hiroyuki Yamamoto
/* file / directory handling */
417 8d7dcace Hiroyuki Yamamoto
off_t get_file_size                (const gchar        *file);
418 8d7dcace Hiroyuki Yamamoto
off_t get_file_size_as_crlf        (const gchar        *file);
419 8d7dcace Hiroyuki Yamamoto
off_t get_left_file_size        (FILE                *fp);
420 8d7dcace Hiroyuki Yamamoto
421 8d7dcace Hiroyuki Yamamoto
gint get_last_empty_line_size        (FILE                *fp,
422 8d7dcace Hiroyuki Yamamoto
                                 off_t                 size);
423 8d7dcace Hiroyuki Yamamoto
424 8d7dcace Hiroyuki Yamamoto
gboolean file_exist                (const gchar        *file,
425 8d7dcace Hiroyuki Yamamoto
                                 gboolean         allow_fifo);
426 8d7dcace Hiroyuki Yamamoto
gboolean is_dir_exist                (const gchar        *dir);
427 8d7dcace Hiroyuki Yamamoto
gboolean is_file_entry_exist        (const gchar        *file);
428 8d7dcace Hiroyuki Yamamoto
gboolean dirent_is_regular_file        (struct dirent        *d);
429 8d7dcace Hiroyuki Yamamoto
gboolean dirent_is_directory        (struct dirent        *d);
430 8d7dcace Hiroyuki Yamamoto
431 8d7dcace Hiroyuki Yamamoto
#define is_file_exist(file)                file_exist(file, FALSE)
432 8d7dcace Hiroyuki Yamamoto
#define is_file_or_fifo_exist(file)        file_exist(file, TRUE)
433 8d7dcace Hiroyuki Yamamoto
434 8d7dcace Hiroyuki Yamamoto
gint change_dir                        (const gchar        *dir);
435 8d7dcace Hiroyuki Yamamoto
gint make_dir                        (const gchar        *dir);
436 8d7dcace Hiroyuki Yamamoto
gint make_dir_hier                (const gchar        *dir);
437 8d7dcace Hiroyuki Yamamoto
gint remove_all_files                (const gchar        *dir);
438 8d7dcace Hiroyuki Yamamoto
gint remove_numbered_files        (const gchar        *dir,
439 8d7dcace Hiroyuki Yamamoto
                                 guint                 first,
440 8d7dcace Hiroyuki Yamamoto
                                 guint                 last);
441 8d7dcace Hiroyuki Yamamoto
gint remove_all_numbered_files        (const gchar        *dir);
442 8d7dcace Hiroyuki Yamamoto
gint remove_expired_files        (const gchar        *dir,
443 8d7dcace Hiroyuki Yamamoto
                                 guint                 hours);
444 8d7dcace Hiroyuki Yamamoto
gint remove_dir_recursive        (const gchar        *dir);
445 8d7dcace Hiroyuki Yamamoto
gint rename_force                (const gchar        *oldpath,
446 8d7dcace Hiroyuki Yamamoto
                                 const gchar        *newpath);
447 8d7dcace Hiroyuki Yamamoto
gint copy_file                        (const gchar        *src,
448 8d7dcace Hiroyuki Yamamoto
                                 const gchar        *dest,
449 8d7dcace Hiroyuki Yamamoto
                                 gboolean         keep_backup);
450 8d7dcace Hiroyuki Yamamoto
gint copy_dir                        (const gchar        *src,
451 8d7dcace Hiroyuki Yamamoto
                                 const gchar        *dest);
452 8d7dcace Hiroyuki Yamamoto
gint move_file                        (const gchar        *src,
453 8d7dcace Hiroyuki Yamamoto
                                 const gchar        *dest,
454 8d7dcace Hiroyuki Yamamoto
                                 gboolean         overwrite);
455 8d7dcace Hiroyuki Yamamoto
gint append_file_part                (FILE                *fp,
456 8d7dcace Hiroyuki Yamamoto
                                 off_t                 offset,
457 8d7dcace Hiroyuki Yamamoto
                                 size_t                 length,
458 8d7dcace Hiroyuki Yamamoto
                                 FILE                *dest_fp);
459 8d7dcace Hiroyuki Yamamoto
gint copy_file_part                (FILE                *fp,
460 8d7dcace Hiroyuki Yamamoto
                                 off_t                 offset,
461 8d7dcace Hiroyuki Yamamoto
                                 size_t                 length,
462 8d7dcace Hiroyuki Yamamoto
                                 const gchar        *dest);
463 8d7dcace Hiroyuki Yamamoto
464 8d7dcace Hiroyuki Yamamoto
gchar *canonicalize_str                (const gchar        *str);
465 8d7dcace Hiroyuki Yamamoto
gint canonicalize_file                (const gchar        *src,
466 8d7dcace Hiroyuki Yamamoto
                                 const gchar        *dest);
467 8d7dcace Hiroyuki Yamamoto
gint canonicalize_file_replace        (const gchar        *file);
468 8d7dcace Hiroyuki Yamamoto
FILE *canonicalize_file_stream        (FILE                *fp,
469 8d7dcace Hiroyuki Yamamoto
                                 gint                *length);
470 8d7dcace Hiroyuki Yamamoto
gint uncanonicalize_file        (const gchar        *src,
471 8d7dcace Hiroyuki Yamamoto
                                 const gchar        *dest);
472 8d7dcace Hiroyuki Yamamoto
gint uncanonicalize_file_replace(const gchar        *file);
473 8d7dcace Hiroyuki Yamamoto
474 8d7dcace Hiroyuki Yamamoto
gchar *normalize_newlines        (const gchar        *str);
475 8d7dcace Hiroyuki Yamamoto
gchar *strchomp_all                (const gchar        *str);
476 8d7dcace Hiroyuki Yamamoto
477 8d7dcace Hiroyuki Yamamoto
FILE *get_outgoing_rfc2822_file        (FILE                *fp);
478 8d7dcace Hiroyuki Yamamoto
gchar *get_outgoing_rfc2822_str        (FILE                *fp);
479 8d7dcace Hiroyuki Yamamoto
gchar *generate_mime_boundary        (const gchar        *prefix);
480 8d7dcace Hiroyuki Yamamoto
481 8d7dcace Hiroyuki Yamamoto
gint change_file_mode_rw        (FILE                *fp,
482 8d7dcace Hiroyuki Yamamoto
                                 const gchar        *file);
483 8d7dcace Hiroyuki Yamamoto
FILE *my_tmpfile                (void);
484 8d7dcace Hiroyuki Yamamoto
FILE *str_open_as_stream        (const gchar        *str);
485 8d7dcace Hiroyuki Yamamoto
gint str_write_to_file                (const gchar        *str,
486 8d7dcace Hiroyuki Yamamoto
                                 const gchar        *file);
487 8d7dcace Hiroyuki Yamamoto
gchar *file_read_to_str                (const gchar        *file);
488 8d7dcace Hiroyuki Yamamoto
gchar *file_read_stream_to_str        (FILE                *fp);
489 8d7dcace Hiroyuki Yamamoto
490 8d7dcace Hiroyuki Yamamoto
/* process execution */
491 8d7dcace Hiroyuki Yamamoto
gint execute_async                (gchar *const         argv[]);
492 8d7dcace Hiroyuki Yamamoto
gint execute_sync                (gchar *const         argv[]);
493 8d7dcace Hiroyuki Yamamoto
gint execute_command_line        (const gchar        *cmdline,
494 8d7dcace Hiroyuki Yamamoto
                                 gboolean         async);
495 8d7dcace Hiroyuki Yamamoto
gint execute_command_line_async_wait
496 8d7dcace Hiroyuki Yamamoto
                                (const gchar        *cmdline);
497 8d7dcace Hiroyuki Yamamoto
498 8d7dcace Hiroyuki Yamamoto
gint execute_open_file                (const gchar        *file,
499 8d7dcace Hiroyuki Yamamoto
                                 const gchar        *content_type);
500 8d7dcace Hiroyuki Yamamoto
gint execute_print_file                (const gchar        *file);
501 8d7dcace Hiroyuki Yamamoto
gchar *get_command_output        (const gchar        *cmdline);
502 8d7dcace Hiroyuki Yamamoto
503 8d7dcace Hiroyuki Yamamoto
/* open URI with external browser */
504 8d7dcace Hiroyuki Yamamoto
gint open_uri(const gchar *uri, const gchar *cmdline);
505 8d7dcace Hiroyuki Yamamoto
506 8d7dcace Hiroyuki Yamamoto
/* time functions */
507 8d7dcace Hiroyuki Yamamoto
time_t remote_tzoffset_sec        (const gchar        *zone);
508 8d7dcace Hiroyuki Yamamoto
time_t tzoffset_sec                (time_t                *now);
509 8d7dcace Hiroyuki Yamamoto
gchar *tzoffset_buf                (gchar                *buf,
510 8d7dcace Hiroyuki Yamamoto
                                 time_t                *now);
511 8d7dcace Hiroyuki Yamamoto
gchar *tzoffset                        (time_t                *now);
512 8d7dcace Hiroyuki Yamamoto
void get_rfc822_date                (gchar                *buf,
513 8d7dcace Hiroyuki Yamamoto
                                 gint                 len);
514 8d7dcace Hiroyuki Yamamoto
515 8d7dcace Hiroyuki Yamamoto
size_t my_strftime                (gchar                        *s,
516 8d7dcace Hiroyuki Yamamoto
                                 size_t                         max,
517 8d7dcace Hiroyuki Yamamoto
                                 const gchar                *format,
518 8d7dcace Hiroyuki Yamamoto
                                 const struct tm        *tm);
519 8d7dcace Hiroyuki Yamamoto
520 8d7dcace Hiroyuki Yamamoto
/* UI hints */
521 8d7dcace Hiroyuki Yamamoto
void set_ui_update_func        (UIUpdateFunc         func);
522 8d7dcace Hiroyuki Yamamoto
void ui_update                (void);
523 8d7dcace Hiroyuki Yamamoto
524 8d7dcace Hiroyuki Yamamoto
void set_event_loop_func        (EventLoopFunc         func);
525 8d7dcace Hiroyuki Yamamoto
void event_loop_iterate                (void);
526 8d7dcace Hiroyuki Yamamoto
527 8d7dcace Hiroyuki Yamamoto
void set_progress_func        (ProgressFunc         func);
528 8d7dcace Hiroyuki Yamamoto
void progress_show        (gint                 cur,
529 8d7dcace Hiroyuki Yamamoto
                         gint                 total);
530 8d7dcace Hiroyuki Yamamoto
531 8d7dcace Hiroyuki Yamamoto
/* user input */
532 8d7dcace Hiroyuki Yamamoto
void set_input_query_password_func        (QueryPasswordFunc        func);
533 8d7dcace Hiroyuki Yamamoto
534 8d7dcace Hiroyuki Yamamoto
gchar *input_query_password        (const gchar        *server,
535 8d7dcace Hiroyuki Yamamoto
                                 const gchar        *user);
536 8d7dcace Hiroyuki Yamamoto
537 8d7dcace Hiroyuki Yamamoto
/* logging */
538 8d7dcace Hiroyuki Yamamoto
void set_log_file        (const gchar        *filename);
539 8d7dcace Hiroyuki Yamamoto
void close_log_file        (void);
540 8d7dcace Hiroyuki Yamamoto
void set_log_verbosity        (gboolean         verbose);
541 8d7dcace Hiroyuki Yamamoto
gboolean get_debug_mode        (void);
542 8d7dcace Hiroyuki Yamamoto
void set_debug_mode        (gboolean         enable);
543 8d7dcace Hiroyuki Yamamoto
544 8d7dcace Hiroyuki Yamamoto
void set_log_ui_func                (LogFunc         print_func,
545 8d7dcace Hiroyuki Yamamoto
                                 LogFunc         message_func,
546 8d7dcace Hiroyuki Yamamoto
                                 LogFunc         warning_func,
547 8d7dcace Hiroyuki Yamamoto
                                 LogFunc         error_func);
548 8d7dcace Hiroyuki Yamamoto
void set_log_ui_func_full        (LogFunc         print_func,
549 8d7dcace Hiroyuki Yamamoto
                                 LogFunc         message_func,
550 8d7dcace Hiroyuki Yamamoto
                                 LogFunc         warning_func,
551 8d7dcace Hiroyuki Yamamoto
                                 LogFunc         error_func,
552 8d7dcace Hiroyuki Yamamoto
                                 LogFlushFunc         flush_func);
553 8d7dcace Hiroyuki Yamamoto
554 8d7dcace Hiroyuki Yamamoto
void set_log_show_status_func        (LogFunc         status_func);
555 8d7dcace Hiroyuki Yamamoto
556 8d7dcace Hiroyuki Yamamoto
void debug_print        (const gchar *format, ...) G_GNUC_PRINTF(1, 2);
557 8d7dcace Hiroyuki Yamamoto
void status_print        (const gchar *format, ...) G_GNUC_PRINTF(1, 2);
558 8d7dcace Hiroyuki Yamamoto
559 8d7dcace Hiroyuki Yamamoto
void log_write                (const gchar        *str,
560 8d7dcace Hiroyuki Yamamoto
                         const gchar        *prefix);
561 8d7dcace Hiroyuki Yamamoto
562 8d7dcace Hiroyuki Yamamoto
void log_print                (const gchar *format, ...) G_GNUC_PRINTF(1, 2);
563 8d7dcace Hiroyuki Yamamoto
void log_message        (const gchar *format, ...) G_GNUC_PRINTF(1, 2);
564 8d7dcace Hiroyuki Yamamoto
void log_warning        (const gchar *format, ...) G_GNUC_PRINTF(1, 2);
565 8d7dcace Hiroyuki Yamamoto
void log_error                (const gchar *format, ...) G_GNUC_PRINTF(1, 2);
566 8d7dcace Hiroyuki Yamamoto
567 8d7dcace Hiroyuki Yamamoto
void log_flush                (void);
568 8d7dcace Hiroyuki Yamamoto
569 8d7dcace Hiroyuki Yamamoto
#endif /* __UTILS_H__ */