Remove empty table rows in the Glade file
[geany-mirror.git] / src / utils.h
blob4f92e6b6b384133608523231855e73d2dfa1a368
1 /*
2 * utils.h - this file is part of Geany, a fast and lightweight IDE
4 * Copyright 2005-2012 Enrico Tröger <enrico(dot)troeger(at)uvena(dot)de>
5 * Copyright 2006-2012 Nick Treleaven <nick(dot)treleaven(at)btinternet(dot)com>
7 * This program is free software; you can redistribute it and/or modify
8 * it under the terms of the GNU General Public License as published by
9 * the Free Software Foundation; either version 2 of the License, or
10 * (at your option) any later version.
12 * This program is distributed in the hope that it will be useful,
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 * GNU General Public License for more details.
17 * You should have received a copy of the GNU General Public License along
18 * with this program; if not, write to the Free Software Foundation, Inc.,
19 * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
22 /**
23 * @file: utils.h
24 * General utility functions, non-GTK related.
27 #ifndef GEANY_UTILS_H
28 #define GEANY_UTILS_H 1
30 #include <glib.h>
31 #include <gdk/gdk.h> /* for GdkColor */
32 #include <time.h>
34 G_BEGIN_DECLS
36 /** Returns @c TRUE if @a ptr is @c NULL or @c *ptr is @c FALSE. */
37 #define EMPTY(ptr) \
38 (!(ptr) || !*(ptr))
40 /** @deprecated 2013/08 - use @c !EMPTY() instead. */
41 #ifndef GEANY_DISABLE_DEPRECATED
42 #define NZV(ptr) (!EMPTY(ptr))
43 #endif
45 /** Assigns @a result to @a ptr, then frees the old value.
46 * @a result can be an expression using the 'old' value of @a ptr.
47 * E.g. @code SETPTR(str, g_strndup(str, 5)); @endcode
48 **/
49 #define SETPTR(ptr, result) \
50 do setptr(ptr, result) while (0)
52 /** @deprecated 2011/11/15 - use SETPTR() instead. */
53 #define setptr(ptr, result) \
55 gpointer setptr_tmp = ptr;\
56 ptr = result;\
57 g_free(setptr_tmp);\
60 /** Duplicates a string on the stack using @c g_alloca().
61 * Like glibc's @c strdupa(), but portable.
62 * @note You must include @c string.h yourself.
63 * @warning Don't use excessively or for long strings otherwise there may be stack exhaustion -
64 * see the GLib docs for @c g_alloca(). */
65 #define utils_strdupa(str) \
66 strcpy(g_alloca(strlen(str) + 1), str)
68 /* Get a keyfile setting, using the home keyfile if the key exists,
69 * otherwise system keyfile. */
70 #define utils_get_setting(type, home, sys, group, key, default_val)\
71 (g_key_file_has_key(home, group, key, NULL)) ?\
72 utils_get_setting_##type(home, group, key, default_val) :\
73 utils_get_setting_##type(sys, group, key, default_val)
75 /* ignore the case of filenames and paths under WIN32, causes errors if not */
76 #ifdef G_OS_WIN32
77 #define utils_filenamecmp(a, b) utils_str_casecmp((a), (b))
78 #else
79 #define utils_filenamecmp(a, b) strcmp((a), (b))
80 #endif
83 /** Iterates all the items in @a array using pointers.
84 * @param item pointer to an item in @a array.
85 * @param array C array to traverse.
86 * @param len Length of the array. */
87 #define foreach_c_array(item, array, len) \
88 for (item = array; item < &array[len]; item++)
90 /** Iterates all items in @a array.
91 * @param type Type of @a item.
92 * @param item pointer to item in @a array.
93 * @param array @c GArray to traverse. */
94 #define foreach_array(type, item, array) \
95 foreach_c_array(item, ((type*)(gpointer)array->data), array->len)
97 /** Iterates all the pointers in @a ptr_array.
98 * @param item pointer in @a ptr_array.
99 * @param idx @c guint index into @a ptr_array.
100 * @param ptr_array @c GPtrArray to traverse. */
101 #define foreach_ptr_array(item, idx, ptr_array) \
102 for (idx = 0, item = ((ptr_array)->len > 0 ? g_ptr_array_index((ptr_array), 0) : NULL); \
103 idx < (ptr_array)->len; ++idx, item = g_ptr_array_index((ptr_array), idx))
105 /** Iterates all the nodes in @a list.
106 * @param node should be a (@c GList*).
107 * @param list @c GList to traverse. */
108 #define foreach_list(node, list) \
109 for (node = list; node != NULL; node = node->next)
111 /** Iterates all the nodes in @a list.
112 * @param node should be a (@c GSList*).
113 * @param list @c GSList to traverse. */
114 #define foreach_slist(node, list) \
115 foreach_list(node, list)
117 /** Iterates through each unsorted filename in a @c GDir.
118 * @param filename (@c const @c gchar*) locale-encoded filename, without path. Do not modify or free.
119 * @param dir @c GDir created with @c g_dir_open(). Call @c g_dir_close() afterwards.
120 * @see utils_get_file_list() if you want a sorted list.
121 * @since Geany 0.19. */
122 #define foreach_dir(filename, dir)\
123 for ((filename) = g_dir_read_name(dir); (filename) != NULL; (filename) = g_dir_read_name(dir))
125 /** Iterates through each character in @a string.
126 * @param char_ptr Pointer to character.
127 * @param string String to traverse.
128 * @warning Doesn't include null terminating character.
129 * @since Geany 0.19. */
130 #define foreach_str(char_ptr, string) \
131 for (char_ptr = string; *char_ptr; char_ptr++)
133 /** Iterates a null-terminated string vector.
134 * @param str_ptr @c gchar** pointer to string element.
135 * @param strv Can be @c NULL.
136 * @since Geany 0.20 */
137 #define foreach_strv(str_ptr, strv)\
138 if (!(strv)) {} else foreach_str(str_ptr, strv)
140 /** Iterates from 0 to @a size.
141 * @param i Integer.
142 * @param size Number of iterations.
143 * @since Geany 0.20. */
144 #define foreach_range(i, size) \
145 for (i = 0; i < size; i++)
148 void utils_open_browser(const gchar *uri);
150 gint utils_get_line_endings(const gchar* buffer, gsize size);
152 gboolean utils_isbrace(gchar c, gboolean include_angles);
154 gboolean utils_is_opening_brace(gchar c, gboolean include_angles);
156 gint utils_write_file(const gchar *filename, const gchar *text);
158 gchar *utils_find_open_xml_tag(const gchar sel[], gint size);
160 const gchar *utils_find_open_xml_tag_pos(const gchar sel[], gint size);
162 gboolean utils_is_short_html_tag(const gchar *tag_name);
164 void utils_ensure_same_eol_characters(GString *string, gint target_eol_mode);
166 const gchar *utils_get_eol_char(gint eol_mode);
168 const gchar *utils_get_eol_name(gint eol_mode);
170 gboolean utils_atob(const gchar *str);
172 void utils_tidy_path(gchar *filename);
174 gboolean utils_is_absolute_path(const gchar *path);
176 const gchar *utils_path_skip_root(const gchar *path);
178 gdouble utils_scale_round(gdouble val, gdouble factor);
180 gboolean utils_str_equal(const gchar *a, const gchar *b);
182 gchar *utils_remove_ext_from_filename(const gchar *filename);
184 gchar utils_brace_opposite(gchar ch);
186 gint utils_string_find(GString *haystack, gint start, gint end, const gchar *needle);
188 gint utils_string_replace(GString *str, gint pos, gint len, const gchar *replace);
190 guint utils_string_replace_all(GString *haystack, const gchar *needle, const gchar *replace);
192 guint utils_string_replace_first(GString *haystack, const gchar *needle, const gchar *replace);
194 guint utils_string_regex_replace_all(GString *haystack, GRegex *regex,
195 guint match_num, const gchar *replace, gboolean literal);
197 void utils_str_replace_all(gchar **haystack, const gchar *needle, const gchar *replacement);
199 gint utils_strpos(const gchar* haystack, const gchar *needle);
201 gchar *utils_get_date_time(const gchar *format, time_t *time_to_use);
203 gchar *utils_get_initials(const gchar *name);
205 gboolean utils_get_setting_boolean(GKeyFile *config, const gchar *section, const gchar *key, const gboolean default_value);
207 gint utils_get_setting_integer(GKeyFile *config, const gchar *section, const gchar *key, const gint default_value);
209 gchar *utils_get_setting_string(GKeyFile *config, const gchar *section, const gchar *key, const gchar *default_value);
211 gchar *utils_get_hex_from_color(GdkColor *color);
213 const gchar *utils_get_default_dir_utf8(void);
215 gchar *utils_get_current_file_dir_utf8(void);
217 void utils_beep(void);
219 gchar *utils_make_human_readable_str(guint64 size, gulong block_size,
220 gulong display_unit);
222 gboolean utils_parse_color(const gchar *spec, GdkColor *color);
224 gint utils_color_to_bgr(const GdkColor *color);
226 gint utils_parse_color_to_bgr(const gchar *spec);
228 gchar *utils_get_current_time_string(void);
230 GIOChannel *utils_set_up_io_channel(gint fd, GIOCondition cond, gboolean nblock,
231 GIOFunc func, gpointer data);
233 gchar **utils_read_file_in_array(const gchar *filename);
235 gboolean utils_str_replace_escape(gchar *string, gboolean keep_backslash);
237 gboolean utils_wrap_string(gchar *string, gint wrapstart);
239 gchar *utils_get_locale_from_utf8(const gchar *utf8_text);
241 gchar *utils_get_utf8_from_locale(const gchar *locale_text);
243 void utils_free_pointers(gsize arg_count, ...) G_GNUC_NULL_TERMINATED;
245 gchar **utils_strv_new(const gchar *first, ...) G_GNUC_NULL_TERMINATED;
247 gchar **utils_strv_join(gchar **first, gchar **second) G_GNUC_WARN_UNUSED_RESULT;
249 gint utils_mkdir(const gchar *path, gboolean create_parent_dirs);
251 GSList *utils_get_file_list(const gchar *path, guint *length, GError **error);
253 GSList *utils_get_file_list_full(const gchar *path, gboolean full_path, gboolean sort, GError **error);
255 GSList *utils_get_config_files(const gchar *subdir);
257 gchar *utils_get_help_url(const gchar *suffix);
259 gboolean utils_str_has_upper(const gchar *str);
261 gint utils_is_file_writable(const gchar *locale_filename);
264 gboolean utils_spawn_sync(const gchar *dir, gchar **argv, gchar **env, GSpawnFlags flags,
265 GSpawnChildSetupFunc child_setup, gpointer user_data, gchar **std_out,
266 gchar **std_err, gint *exit_status, GError **error);
268 gboolean utils_spawn_async(const gchar *dir, gchar **argv, gchar **env, GSpawnFlags flags,
269 GSpawnChildSetupFunc child_setup, gpointer user_data, GPid *child_pid,
270 GError **error);
272 gint utils_str_casecmp(const gchar *s1, const gchar *s2);
274 gchar *utils_get_path_from_uri(const gchar *uri);
276 gboolean utils_is_uri(const gchar *uri);
278 gboolean utils_is_remote_path(const gchar *path);
280 gchar *utils_str_middle_truncate(const gchar *string, guint truncate_length);
282 gchar *utils_str_remove_chars(gchar *string, const gchar *chars);
284 gchar **utils_copy_environment(const gchar **exclude_vars, const gchar *first_varname, ...) G_GNUC_NULL_TERMINATED;
286 GDate *utils_parse_date(const gchar *input);
288 gchar *utils_parse_and_format_build_date(const gchar *input);
290 G_END_DECLS
292 #endif /* GEANY_UTILS_H */