Revision: 3267 http://geany.svn.sourceforge.net/geany/?rev=3267&view=rev Author: eht16 Date: 2008-11-21 17:40:04 +0000 (Fri, 21 Nov 2008)
Log Message: ----------- Attempt to make utils_get_date_time() UTF-8 safe and add it to the plugin API. Fix misnamed str_casecmp() function in the plugin API, sorry.
Modified Paths: -------------- trunk/ChangeLog trunk/plugins/export.c trunk/plugins/saveactions.c trunk/src/callbacks.c trunk/src/plugindata.h trunk/src/plugins.c trunk/src/utils.c
Modified: trunk/ChangeLog =================================================================== --- trunk/ChangeLog 2008-11-21 17:33:35 UTC (rev 3266) +++ trunk/ChangeLog 2008-11-21 17:40:04 UTC (rev 3267) @@ -3,6 +3,11 @@ * src/main.c: Try to fix some problems when opening files with non-Ascii characters on Windows from the command line. + * plugins/export.c, plugins/saveactions.c, src/callbacks.c, + src/plugindata.h, src/plugins.c, src/utils.c: + Attempt to make utils_get_date_time() UTF-8 safe and add it to the + plugin API. + Fix misnamed str_casecmp() function in the plugin API, sorry.
2008-11-21 Nick Treleaven <nick(dot)treleaven(at)btinternet(dot)com>
Modified: trunk/plugins/export.c =================================================================== --- trunk/plugins/export.c 2008-11-21 17:33:35 UTC (rev 3266) +++ trunk/plugins/export.c 2008-11-21 17:40:04 UTC (rev 3267) @@ -281,20 +281,12 @@ }
-static const gchar *get_date(gint type) +static gchar *get_date(gint type) { - static gchar str[128]; gchar *format; - time_t t; - struct tm *tmp;
- t = time(NULL); - tmp = localtime(&t); - if (tmp == NULL) - return ""; - if (type == DATE_TYPE_HTML) -/** needs testing */ +/* needs testing */ #ifdef _GNU_SOURCE format = "%Y-%m-%dT%H:%M:%S%z"; #else @@ -303,9 +295,7 @@ else format = "%c";
- strftime(str, sizeof str, format, tmp); - - return str; + return p_utils->get_date_time(format, NULL); }
@@ -350,7 +340,7 @@ { GeanyEditor *editor = doc->editor; gint i, style = -1, old_style = 0, column = 0; - gchar c, c_next, *tmp; + gchar c, c_next, *tmp, *date; /* 0 - fore, 1 - back, 2 - bold, 3 - italic, 4 - font size, 5 - used(0/1) */ gint styles[STYLE_MAX + 1][MAX_TYPES]; gboolean block_open = FALSE; @@ -533,11 +523,12 @@ } }
+ date = get_date(DATE_TYPE_DEFAULT); /* write all */ latex = g_string_new(TEMPLATE_LATEX); p_utils->string_replace_all(latex, "{export_content}", body->str); p_utils->string_replace_all(latex, "{export_styles}", cmds->str); - p_utils->string_replace_all(latex, "{export_date}", get_date(DATE_TYPE_DEFAULT)); + p_utils->string_replace_all(latex, "{export_date}", date); if (doc->file_name == NULL) p_utils->string_replace_all(latex, "{export_filename}", GEANY_STRING_UNTITLED); else @@ -548,6 +539,7 @@ g_string_free(body, TRUE); g_string_free(cmds, TRUE); g_string_free(latex, TRUE); + g_free(date); }
@@ -555,7 +547,7 @@ { GeanyEditor *editor = doc->editor; gint i, style = -1, old_style = 0, column = 0; - gchar c, c_next; + gchar c, c_next, *date; /* 0 - fore, 1 - back, 2 - bold, 3 - italic, 4 - font size, 5 - used(0/1) */ gint styles[STYLE_MAX + 1][MAX_TYPES]; gboolean span_open = FALSE; @@ -686,9 +678,10 @@ } }
+ date = get_date(DATE_TYPE_HTML); /* write all */ html = g_string_new(TEMPLATE_HTML); - p_utils->string_replace_all(html, "{export_date}", get_date(DATE_TYPE_HTML)); + p_utils->string_replace_all(html, "{export_date}", date); p_utils->string_replace_all(html, "{export_content}", body->str); p_utils->string_replace_all(html, "{export_styles}", css->str); if (doc->file_name == NULL) @@ -702,6 +695,7 @@ g_string_free(body, TRUE); g_string_free(css, TRUE); g_string_free(html, TRUE); + g_free(date); }
Modified: trunk/plugins/saveactions.c =================================================================== --- trunk/plugins/saveactions.c 2008-11-21 17:33:35 UTC (rev 3266) +++ trunk/plugins/saveactions.c 2008-11-21 17:40:04 UTC (rev 3267) @@ -196,14 +196,11 @@ gchar *locale_filename_dst; gchar *basename_src; gchar *dir_parts_src; - gchar stamp[512]; - time_t t = time(NULL); - struct tm *now; + gchar *stamp;
if (! enable_backupcopy) return;
- now = localtime(&t); locale_filename_src = p_utils->get_locale_from_utf8(doc->file_name);
if ((src = g_fopen(locale_filename_src, "r")) == NULL) @@ -215,7 +212,7 @@ return; }
- strftime(stamp, sizeof(stamp), backupcopy_time_fmt, now); + stamp = p_utils->get_date_time(backupcopy_time_fmt, NULL); basename_src = g_path_get_basename(locale_filename_src); dir_parts_src = backupcopy_create_dir_parts(locale_filename_src); locale_filename_dst = g_strconcat( @@ -231,6 +228,7 @@ g_strerror(errno)); g_free(locale_filename_src); g_free(locale_filename_dst); + g_free(stamp); fclose(src); return; } @@ -244,6 +242,7 @@ fclose(dst); g_free(locale_filename_src); g_free(locale_filename_dst); + g_free(stamp); }
Modified: trunk/src/callbacks.c =================================================================== --- trunk/src/callbacks.c 2008-11-21 17:33:35 UTC (rev 3266) +++ trunk/src/callbacks.c 2008-11-21 17:40:04 UTC (rev 3267) @@ -1418,10 +1418,7 @@ { GeanyDocument *doc = document_get_current(); gchar *format; - gchar time_str[300]; /* the entered format string can be maximal 256 chars long, so we have - * 44 additional characters for strtime's conversion */ - time_t t; - struct tm *tm; + gchar *time_str;
if (doc == NULL) return;
@@ -1454,15 +1451,14 @@ return; }
- /* get the current time */ - t = time(NULL); - tm = localtime(&t); - if (strftime(time_str, sizeof time_str, format, tm) != 0) + time_str = utils_get_date_time(format, NULL); + if (time_str != NULL) { verify_click_pos(doc); /* make sure that the click_pos is valid */
sci_insert_text(doc->editor->sci, editor_info.click_pos, time_str); sci_goto_pos(doc->editor->sci, editor_info.click_pos + strlen(time_str), FALSE); + g_free(time_str); } else {
Modified: trunk/src/plugindata.h =================================================================== --- trunk/src/plugindata.h 2008-11-21 17:33:35 UTC (rev 3266) +++ trunk/src/plugindata.h 2008-11-21 17:40:04 UTC (rev 3267) @@ -45,7 +45,7 @@ enum { /** The Application Programming Interface (API) version, incremented * whenever any plugin data types are modified or appended to. */ - GEANY_API_VERSION = 110, + GEANY_API_VERSION = 111,
/** The Application Binary Interface (ABI) version, incremented whenever * existing fields in the plugin data types have to be changed or reordered. */ @@ -330,7 +330,8 @@ gboolean (*spawn_async) (const gchar *dir, gchar **argv, gchar **env, GSpawnFlags flags, GSpawnChildSetupFunc child_setup, gpointer user_data, GPid *child_pid, GError **error); - gint (*utils_str_casecmp) (const gchar *s1, const gchar *s2); + gint (*str_casecmp) (const gchar *s1, const gchar *s2); + gchar* (*get_date_time) (const gchar *format, time_t *time_to_use); } UtilsFuncs;
Modified: trunk/src/plugins.c =================================================================== --- trunk/src/plugins.c 2008-11-21 17:33:35 UTC (rev 3266) +++ trunk/src/plugins.c 2008-11-21 17:40:04 UTC (rev 3267) @@ -196,7 +196,8 @@ &utils_get_setting_string, &utils_spawn_sync, &utils_spawn_async, - &utils_str_casecmp + &utils_str_casecmp, + &utils_get_date_time };
static UIUtilsFuncs uiutils_funcs = {
Modified: trunk/src/utils.c =================================================================== --- trunk/src/utils.c 2008-11-21 17:33:35 UTC (rev 3266) +++ trunk/src/utils.c 2008-11-21 17:40:04 UTC (rev 3267) @@ -554,24 +554,47 @@ }
+/** + * This is a convenience function to retrieve a formatted date/time string from strftime(). + * This function should be preferred to directly calling strftime() since this function + * works on UTF-8 encoded strings. + * + * @param format The format string to pass to strftime(3). See the strftime(3) + * documentation for details, in UTF-8 encoding. + * @param time_to_use The date/time to use, in time_t format or NULL to use the current time. + * + * @return A newly-allocated string, should be freed when no longer needed. + **/ gchar *utils_get_date_time(const gchar *format, time_t *time_to_use) { - time_t tp; const struct tm *tm; - gchar *date; + static gchar date[1024]; + gchar *locale_format; + gsize len;
- if (format == NULL) + g_return_val_if_fail(format != NULL, NULL); + + locale_format = g_locale_from_utf8(format, -1, NULL, NULL, NULL); + if (locale_format == NULL) return NULL;
if (time_to_use != NULL) - tp = *time_to_use; + tm = localtime(time_to_use); else - tp = time(NULL); + { + time_t tp = time(NULL); + tm = localtime(&tp); + }
- tm = localtime(&tp); - date = g_malloc0(256); - strftime(date, 256, format, tm); - return date; + len = strftime(date, 1024, locale_format, tm); + g_free(locale_format); + if (len == 0) + return NULL; + + if (! g_utf8_validate(date, len, NULL)) + return g_locale_to_utf8(date, len, NULL, NULL, NULL); + else + return g_strdup(date); }
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.