X-Git-Url: https://git.street.me.uk/andy/viking.git/blobdiff_plain/4c77d5e0aec3c7aab32965ca4e02abb17bb6108f..85e9e947eccc72ba0e9a0b5404a014e44bd2ec3d:/src/util.c?ds=sidebyside diff --git a/src/util.c b/src/util.c index 3c994ecf..34f3abf1 100644 --- a/src/util.c +++ b/src/util.c @@ -1,8 +1,9 @@ /* * Viking - GPS data editor - * Copyright (C) 2007 Guilhem Bonnefille + * Copyright (C) 2007, Guilhem Bonnefille + * Copyright (C) 2014, Rob Norris * Based on: - * Copyright (C) 2003-2007 Leandro A. F. Pereira + * Copyright (C) 2003-2007, Leandro A. F. Pereira * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -17,47 +18,197 @@ * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA */ + /* + * Dependencies must be just on Glib + * see ui_utils for thing that depend on Gtk + * see vikutils for things that further depend on other Viking types + */ #ifdef HAVE_CONFIG_H #include "config.h" #endif +#include #include +#include -#include "dialog.h" +#include "util.h" +#include "globals.h" -void open_url(GtkWindow *parent, const gchar * url) +#ifdef WINDOWS +#include +#else +#include +#endif + +guint util_get_number_of_cpus () { +#if GLIB_CHECK_VERSION (2, 36, 0) + return g_get_num_processors(); +#else + long nprocs = 1; #ifdef WINDOWS - ShellExecute(NULL, NULL, (char *) webpage, NULL, ".\\", 0); -#else /* WINDOWS */ - const gchar *browsers[] = { - "xdg-open", "gnome-open", "kfmclient openURL", - "sensible-browser", "firefox", "epiphany", - "iceweasel", "seamonkey", "galeon", "mozilla", - "opera", "konqueror", "netscape", "links -g", - NULL - }; - gint i=0; - gchar *cmdline = NULL; - - gchar *browser = g_getenv("BROWSER"); - if (browser == NULL || browser[0] == '\0') { - /* $BROWSER not set -> use first entry */ - browser = browsers[i++]; - } - do { - cmdline = g_strdup_printf("%s '%s'", browser, url); - g_debug("Running: %s", cmdline); - - if (g_spawn_command_line_async(cmdline, NULL)) { - g_free(cmdline); - return; + SYSTEM_INFO info; + GetSystemInfo(&info); + nprocs = info.dwNumberOfProcessors; +#else +#ifdef _SC_NPROCESSORS_ONLN + nprocs = sysconf(_SC_NPROCESSORS_ONLN); + if (nprocs < 1) + nprocs = 1; +#endif +#endif + return nprocs; +#endif +} + +gchar *uri_escape(gchar *str) +{ + gchar *esc_str = g_malloc(3*strlen(str)); + gchar *dst = esc_str; + gchar *src; + + for (src = str; *src; src++) { + if (*src == ' ') + *dst++ = '+'; + else if (g_ascii_isalnum(*src)) + *dst++ = *src; + else { + g_sprintf(dst, "%%%02hhX", *src); + dst += 3; } + } + *dst = '\0'; + + return(esc_str); +} + + +GList * str_array_to_glist(gchar* data[]) +{ + GList *gl = NULL; + gpointer * p; + for (p = (gpointer)data; *p; p++) + gl = g_list_prepend(gl, *p); + return g_list_reverse(gl); +} + +/** + * split_string_from_file_on_equals: + * + * @buf: the input string + * @key: newly allocated string that is before the '=' + * @val: newly allocated string after the '=' + * + * Designed for file line processing, so it ignores strings beginning with special + * characters, such as '#'; returns false in such situations. + * Also returns false if no equals character is found + * + * e.g. if buf = "GPS.parameter=42" + * key = "GPS.parameter" + * val = "42" + */ +gboolean split_string_from_file_on_equals ( const gchar *buf, gchar **key, gchar **val ) +{ + // comments, special characters in viking file format + if ( buf == NULL || buf[0] == '\0' || buf[0] == '~' || buf[0] == '=' || buf[0] == '#' ) + return FALSE; + + if ( ! strchr ( buf, '=' ) ) + return FALSE; + + gchar **strv = g_strsplit ( buf, "=", 2 ); - g_free(cmdline); - browser = browsers[i++]; - } while(browser); - - a_dialog_error_msg ( parent, _("Could not launch web browser.") ); -#endif /* WINDOWS */ + gint gi = 0; + gchar *str = strv[gi]; + while ( str ) { + if ( gi == 0 ) + *key = g_strdup ( str ); + else + *val = g_strdup ( str ); + gi++; + str = strv[gi]; + } + + g_strfreev ( strv ); + + // Remove newline from val and also any other whitespace + *key = g_strstrip ( *key ); + *val = g_strstrip ( *val ); + return TRUE; +} + +static GSList* deletion_list = NULL; + +/** + * util_add_to_deletion_list: + * + * Add a name of a file into the list that is to be deleted on program exit + * Normally this is for files that get used asynchronously, + * so we don't know when it's time to delete them - other than at this program's end + */ +void util_add_to_deletion_list ( const gchar* filename ) +{ + deletion_list = g_slist_append ( deletion_list, g_strdup (filename) ); +} + +/** + * util_remove_all_in_deletion_list: + * + * Delete all the files in the deletion list + * This should only be called on program exit + */ +void util_remove_all_in_deletion_list ( void ) +{ + while ( deletion_list ) + { + g_remove ( deletion_list->data ); + g_free ( deletion_list->data ); + deletion_list = g_slist_delete_link ( deletion_list, deletion_list ); + } +} + +/** + * Removes characters from a string, in place. + * + * @param string String to search. + * @param chars Characters to remove. + * + * @return @a string - return value is only useful when nesting function calls, e.g.: + * @code str = utils_str_remove_chars(g_strdup("f_o_o"), "_"); @endcode + * + * @see @c g_strdelimit. + **/ +gchar *util_str_remove_chars(gchar *string, const gchar *chars) +{ + const gchar *r; + gchar *w = string; + + g_return_val_if_fail(string, NULL); + if (G_UNLIKELY(EMPTY(chars))) + return string; + + foreach_str(r, string) + { + if (!strchr(chars, *r)) + *w++ = *r; + } + *w = 0x0; + return string; +} + +/** + * In 'extreme' debug mode don't remove temporary files + * thus the contents can be inspected if things go wrong + * with the trade off the user may need to delete tmp files manually + * Only use this for 'occasional' downloaded temporary files that need interpretation, + * rather than large volume items such as Bing attributions. + */ +int util_remove ( const gchar *filename ) +{ + if ( vik_debug && vik_verbose ) { + g_warning ( "Not removing file: %s", filename ); + return 0; + } + else + return g_remove ( filename ); }