diff options
-rw-r--r-- | ChangeLog | 4 | ||||
-rw-r--r-- | doc/en/weechat_plugin_api.en.txt | 32 | ||||
-rw-r--r-- | doc/fr/weechat_plugin_api.fr.txt | 32 | ||||
-rw-r--r-- | doc/it/weechat_plugin_api.it.txt | 32 | ||||
-rw-r--r-- | src/core/wee-command.c | 3 | ||||
-rw-r--r-- | src/core/wee-network.c | 3 | ||||
-rw-r--r-- | src/core/wee-string.c | 30 | ||||
-rw-r--r-- | src/core/wee-string.h | 1 | ||||
-rw-r--r-- | src/plugins/irc/irc-server.c | 4 | ||||
-rw-r--r-- | src/plugins/logger/logger.c | 3 | ||||
-rw-r--r-- | src/plugins/plugin.c | 13 | ||||
-rw-r--r-- | src/plugins/scripts/script.c | 14 | ||||
-rw-r--r-- | src/plugins/weechat-plugin.h | 13 | ||||
-rw-r--r-- | src/plugins/xfer/xfer-file.c | 4 | ||||
-rw-r--r-- | src/plugins/xfer/xfer.c | 9 |
15 files changed, 154 insertions, 43 deletions
@@ -1,7 +1,7 @@ WeeChat ChangeLog ================= FlashCode <flashcode@flashtux.org> -v0.3.3-dev, 2010-05-01 +v0.3.3-dev, 2010-05-02 Version 0.3.3 (under dev!) @@ -11,6 +11,8 @@ Version 0.3.3 (under dev!) (default: ctrl/alt + underscore) (task #9483) * core: fix crash with hook_process (when timer is called on a deleted hook process) +* api: add function "string_expand_home", fix bug with replacement of home in + paths * irc: add new options irc.network.autoreconnect_delay_growing and irc.network.autoreconnect_delay_max (task #10338) * irc: add new option weechat.color.status_name_ssl (task #10339) diff --git a/doc/en/weechat_plugin_api.en.txt b/doc/en/weechat_plugin_api.en.txt index 20e731906..4fa6568f4 100644 --- a/doc/en/weechat_plugin_api.en.txt +++ b/doc/en/weechat_plugin_api.en.txt @@ -728,6 +728,38 @@ char *str = weechat_string_replace ("test", "s", "x"); /* result: "text" */ free (str); ---------------------------------------- +weechat_string_expand_home +^^^^^^^^^^^^^^^^^^^^^^^^^^ + +Replace leading `~` by string with home directory. If string does not start +with `~`, then same string is returned. + +Prototype: + +[source,C] +---------------------------------------- +char *weechat_string_expand_home (const char *path); +---------------------------------------- + +Arguments: + +* 'path': path + +Return value: + +* path with leading `~` replaced by home directory (must be freed by calling + "free" after use) + +C example: + +[source,C] +---------------------------------------- +char *str = weechat_string_expand_home ("~/file.txt"); +/* result: "/home/xxx/file.txt" */ +/* ... */ +free (str); +---------------------------------------- + weechat_string_remove_quotes ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ diff --git a/doc/fr/weechat_plugin_api.fr.txt b/doc/fr/weechat_plugin_api.fr.txt index 7d8e014ed..617b97631 100644 --- a/doc/fr/weechat_plugin_api.fr.txt +++ b/doc/fr/weechat_plugin_api.fr.txt @@ -735,6 +735,38 @@ char *str = weechat_string_replace ("test, test", "s", "x"); /* résultat : "tex free (str); ---------------------------------------- +weechat_string_expand_home +^^^^^^^^^^^^^^^^^^^^^^^^^^ + +Remplace le `~` en début de chaîne par le répertoire "home". Si la chaîne ne +débute pas par `~`, alors une chaîne identique est retournée. + +Prototype : + +[source,C] +---------------------------------------- +char *weechat_string_expand_home (const char *path); +---------------------------------------- + +Paramètres : + +* 'path': chemin + +Valeur de retour : + +* chemin avec le `~` en début remplacé par le répertoire "home" (doit être + libéré par un appel à "free" après utilisation) + +Exemple en C : + +[source,C] +---------------------------------------- +char *str = weechat_string_expand_home ("~/fichier.txt"); +/* résultat: "/home/xxx/fichier.txt" */ +/* ... */ +free (str); +---------------------------------------- + weechat_string_remove_quotes ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ diff --git a/doc/it/weechat_plugin_api.it.txt b/doc/it/weechat_plugin_api.it.txt index 65fb41f4a..4258dd5c8 100644 --- a/doc/it/weechat_plugin_api.it.txt +++ b/doc/it/weechat_plugin_api.it.txt @@ -747,6 +747,38 @@ char *str = weechat_string_replace ("test", "s", "x"); /* result: "text" */ free (str); ---------------------------------------- +weechat_string_expand_home +^^^^^^^^^^^^^^^^^^^^^^^^^^ + +Replace leading `~` by string with home directory. If string does not start +with `~`, then same string is returned. + +Prototype: + +[source,C] +---------------------------------------- +char *weechat_string_expand_home (const char *path); +---------------------------------------- + +Arguments: + +* 'path': path + +Return value: + +* path with leading `~` replaced by home directory (must be freed by calling + "free" after use) + +C example: + +[source,C] +---------------------------------------- +char *str = weechat_string_expand_home ("~/file.txt"); +/* result: "/home/xxx/file.txt" */ +/* ... */ +free (str); +---------------------------------------- + weechat_string_remove_quotes ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ diff --git a/src/core/wee-command.c b/src/core/wee-command.c index 935e8ec73..84f3c5b2c 100644 --- a/src/core/wee-command.c +++ b/src/core/wee-command.c @@ -3688,8 +3688,7 @@ command_upgrade (void *data, struct t_gui_buffer *buffer, if (argc > 1) { - ptr_binary = string_replace (argv_eol[1], "~", getenv ("HOME")); - + ptr_binary = string_expand_home (argv_eol[1]); if (ptr_binary) { /* check if weechat binary is here and executable by user */ diff --git a/src/core/wee-network.c b/src/core/wee-network.c index e3e42eb0c..e77862304 100644 --- a/src/core/wee-network.c +++ b/src/core/wee-network.c @@ -79,8 +79,7 @@ network_init () gnutls_global_init (); gnutls_certificate_allocate_credentials (&gnutls_xcred); - ca_path = string_replace (CONFIG_STRING(config_network_gnutls_ca_file), - "~", getenv ("HOME")); + ca_path = string_expand_home (CONFIG_STRING(config_network_gnutls_ca_file)); if (ca_path) { ca_path2 = string_replace (ca_path, "%h", weechat_home); diff --git a/src/core/wee-string.c b/src/core/wee-string.c index afdc05ed4..115c81295 100644 --- a/src/core/wee-string.c +++ b/src/core/wee-string.c @@ -396,6 +396,36 @@ string_replace (const char *string, const char *search, const char *replace) } /* + * string_expand_home: expand home in a PATH + * (for example: "~/file.txt" => "/home/xxx/file.txt") + * note: returned value has to be free() after use + */ + +char * +string_expand_home (const char *path) +{ + char *ptr_home, *str; + int length; + + if (!path) + return NULL; + + if (!path[0] || (path[0] != '~') || (path[1] != DIR_SEPARATOR_CHAR)) + return strdup (path); + + ptr_home = getenv ("HOME"); + + length = strlen (ptr_home) + strlen (path + 1) + 1; + str = malloc (length); + if (!str) + return strdup (path); + + snprintf (str, length, "%s%s", ptr_home, path + 1); + + return str; +} + +/* * string_remove_quotes: remove quotes at beginning/end of string * (ignore spaces if there are before first quote or * after last quote) diff --git a/src/core/wee-string.h b/src/core/wee-string.h index 19b0d0bb0..44b896381 100644 --- a/src/core/wee-string.h +++ b/src/core/wee-string.h @@ -35,6 +35,7 @@ extern int string_match (const char *string, const char *mask, int case_sensitive); extern char *string_replace (const char *string, const char *search, const char *replace); +extern char *string_expand_home (const char *path); extern char *string_remove_quotes (const char *string, const char *quotes); extern char *string_strip (const char *string, int left, int right, const char *chars); diff --git a/src/plugins/irc/irc-server.c b/src/plugins/irc/irc-server.c index 19649fddc..c14d697dd 100644 --- a/src/plugins/irc/irc-server.c +++ b/src/plugins/irc/irc-server.c @@ -2572,8 +2572,8 @@ irc_server_gnutls_callback (void *data, gnutls_session_t tls_session, weechat_dir = weechat_info_get ("weechat_dir", ""); cert_path1 = weechat_string_replace (cert_path0, "%h", weechat_dir); cert_path2 = (cert_path1) ? - weechat_string_replace (cert_path1, "~", getenv ("HOME")) : NULL; - + weechat_string_expand_home (cert_path1) : NULL; + if (cert_path2) { cert_str = weechat_file_get_content (cert_path2); diff --git a/src/plugins/logger/logger.c b/src/plugins/logger/logger.c index 29abe2f1a..412603ac8 100644 --- a/src/plugins/logger/logger.c +++ b/src/plugins/logger/logger.c @@ -82,8 +82,7 @@ logger_get_file_path () goto end; /* replace "~" with user home */ - file_path = weechat_string_replace (weechat_config_string (logger_config_file_path), - "~", getenv ("HOME")); + file_path = weechat_string_expand_home (weechat_config_string (logger_config_file_path)); if (!file_path) goto end; diff --git a/src/plugins/plugin.c b/src/plugins/plugin.c index d8858b72d..b43ddbdce 100644 --- a/src/plugins/plugin.c +++ b/src/plugins/plugin.c @@ -234,7 +234,7 @@ plugin_find_pos (struct t_weechat_plugin *plugin) struct t_weechat_plugin * plugin_load (const char *filename) { - char *ptr_home, *full_name, *full_name2; + char *full_name, *full_name2; void *handle; char *name, *api_version, *author, *description, *version; char *license, *charset; @@ -260,9 +260,7 @@ plugin_load (const char *filename) if (plugin_autoload_array && !plugin_check_autoload (full_name)) return NULL; - ptr_home = getenv ("HOME"); - full_name2 = string_replace (full_name, "~", ptr_home); - + full_name2 = string_expand_home (full_name); if (full_name2) { free (full_name); @@ -462,6 +460,7 @@ plugin_load (const char *filename) new_plugin->strcasestr = &string_strcasestr; new_plugin->string_match = &string_match; new_plugin->string_replace = &string_replace; + new_plugin->string_expand_home = &string_expand_home; new_plugin->string_remove_quotes = &string_remove_quotes; new_plugin->string_strip = &string_strip; new_plugin->string_has_highlight = &string_has_highlight; @@ -780,7 +779,7 @@ plugin_auto_load_file (void *plugin, const char *filename) void plugin_auto_load () { - char *ptr_home, *dir_name, *plugin_path, *plugin_path2; + char *dir_name, *plugin_path, *plugin_path2; plugin_autoload_array = NULL; plugin_autoload_count = 0; @@ -797,9 +796,7 @@ plugin_auto_load () if (CONFIG_STRING(config_plugin_path) && CONFIG_STRING(config_plugin_path)[0]) { - ptr_home = getenv ("HOME"); - plugin_path = string_replace (CONFIG_STRING(config_plugin_path), - "~", ptr_home); + plugin_path = string_expand_home (CONFIG_STRING(config_plugin_path)); plugin_path2 = string_replace ((plugin_path) ? plugin_path : CONFIG_STRING(config_plugin_path), "%h", weechat_home); diff --git a/src/plugins/scripts/script.c b/src/plugins/scripts/script.c index 24f7133cf..96ea5716b 100644 --- a/src/plugins/scripts/script.c +++ b/src/plugins/scripts/script.c @@ -482,19 +482,7 @@ script_search_path (struct t_weechat_plugin *weechat_plugin, struct stat st; if (filename[0] == '~') - { - dir_home = getenv ("HOME"); - if (!dir_home) - return NULL; - length = strlen (dir_home) + strlen (filename + 1) + 1; - final_name = malloc (length); - if (final_name) - { - snprintf (final_name, length, "%s%s", dir_home, filename + 1); - return final_name; - } - return NULL; - } + return weechat_string_expand_home (filename); dir_home = weechat_info_get ("weechat_dir", ""); if (dir_home) diff --git a/src/plugins/weechat-plugin.h b/src/plugins/weechat-plugin.h index 43e70ff8b..42585fcfa 100644 --- a/src/plugins/weechat-plugin.h +++ b/src/plugins/weechat-plugin.h @@ -39,7 +39,7 @@ struct timeval; */ /* API version (used to check that plugin has same API and can be loaded) */ -#define WEECHAT_PLUGIN_API_VERSION "20100302-01" +#define WEECHAT_PLUGIN_API_VERSION "20100502-01" /* macros for defining plugin infos */ #define WEECHAT_PLUGIN_NAME(__name) \ @@ -134,7 +134,11 @@ struct t_weechat_plugin struct t_weechat_plugin *prev_plugin; /* link to previous plugin */ struct t_weechat_plugin *next_plugin; /* link to next plugin */ - /* plugin functions (API) */ + /* + * plugin functions (API) + * WeeChat developers: if you add functions in API, update value of + * constant WEECHAT_PLUGIN_API_VERSION + */ /* plugins */ const char *(*plugin_get_name) (struct t_weechat_plugin *plugin); @@ -157,6 +161,7 @@ struct t_weechat_plugin int case_sensitive); char *(*string_replace) (const char *string, const char *search, const char *replace); + char *(*string_expand_home) (const char *path); char *(*string_remove_quotes) (const char *string, const char *quotes); char *(*string_strip) (const char *string, int left, int right, const char *chars); @@ -644,8 +649,6 @@ struct t_weechat_plugin struct t_infolist *infolist), void *callback_read_data); void (*upgrade_close) (struct t_upgrade_file *upgrade_file); - - /* WeeChat developers: ALWAYS add new functions at the end */ }; extern int weechat_plugin_init (struct t_weechat_plugin *plugin, @@ -697,6 +700,8 @@ extern int weechat_plugin_end (struct t_weechat_plugin *plugin); weechat_plugin->string_match(__string, __mask, __case_sensitive) #define weechat_string_replace(__string, __search, __replace) \ weechat_plugin->string_replace(__string, __search, __replace) +#define weechat_string_expand_home(__path) \ + weechat_plugin->string_expand_home(__path) #define weechat_string_remove_quotes(__string, __quotes) \ weechat_plugin->string_remove_quotes(__string, __quotes) #define weechat_string_strip(__string, __left, __right, __chars) \ diff --git a/src/plugins/xfer/xfer-file.c b/src/plugins/xfer/xfer-file.c index b69c13e61..854979d71 100644 --- a/src/plugins/xfer/xfer-file.c +++ b/src/plugins/xfer/xfer-file.c @@ -84,9 +84,7 @@ xfer_file_find_filename (struct t_xfer *xfer) if (!XFER_IS_FILE(xfer->type)) return; - dir1 = weechat_string_replace (weechat_config_string (xfer_config_file_download_path), - "~", - getenv ("HOME")); + dir1 = weechat_string_expand_home (weechat_config_string (xfer_config_file_download_path)); if (!dir1) return; diff --git a/src/plugins/xfer/xfer.c b/src/plugins/xfer/xfer.c index 87870ce37..74b8bef2c 100644 --- a/src/plugins/xfer/xfer.c +++ b/src/plugins/xfer/xfer.c @@ -134,8 +134,7 @@ xfer_create_directories () weechat_dir = weechat_info_get ("weechat_dir", ""); if (weechat_dir) { - dir1 = weechat_string_replace (weechat_config_string (xfer_config_file_download_path), - "~", getenv ("HOME")); + dir1 = weechat_string_expand_home (weechat_config_string (xfer_config_file_download_path)); dir2 = weechat_string_replace (dir1, "%h", weechat_dir); if (dir2) (void) weechat_mkdir (dir2, 0700); @@ -817,12 +816,10 @@ xfer_add_cb (void *data, const char *signal, const char *type_data, if (filename[0] == '/') filename2 = strdup (filename); else if (filename[0] == '~') - filename2 = weechat_string_replace (filename, "~", getenv ("HOME")); + filename2 = weechat_string_expand_home (filename); else { - dir1 = weechat_string_replace (weechat_config_string (xfer_config_file_upload_path), - "~", - getenv ("HOME")); + dir1 = weechat_string_expand_home (weechat_config_string (xfer_config_file_upload_path)); if (!dir1) { weechat_printf (NULL, |