diff options
author | Lubomir I. Ivanov <neolit123@gmail.com> | 2012-08-27 00:20:48 +0300 |
---|---|---|
committer | Linus Torvalds <torvalds@linux-foundation.org> | 2012-08-26 14:37:28 -0700 |
commit | 9d1057469485739c9a2563cf7c88fd2debc1e730 (patch) | |
tree | 806fc9683c221a2af737bacdd9c0e976b1d78872 | |
parent | 642c83f5327317780a0f10b3ab46f6c1bd8bb202 (diff) | |
download | subsurface-9d1057469485739c9a2563cf7c88fd2debc1e730.tar.gz |
replaced stdndup() with the inlined equivalent
don't kill the OS incompatibility messenger.
1)
http://stackoverflow.com/questions/6062822/whats-wrong-with-strndup
stdndup() is POSIX 2008, but apparently not available on OSX and Windows
it could be made potentially application global (e.g. a local "stdndup.h")
2)
free() memory at pointer "current_dir", once we are done.
Signed-off-by: Lubomir I. Ivanov <neolit123@gmail.com>
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
-rw-r--r-- | gtk-gui.c | 19 |
1 files changed, 18 insertions, 1 deletions
@@ -175,6 +175,8 @@ static void file_open(GtkWidget *w, gpointer data) /* return the path and the file component contained in the full path */ static char *path_and_file(char *pathin, char **fileout) { char *slash = pathin, *next; + char *result; + size_t len, n; if (! pathin) { *fileout = strdup(""); @@ -185,7 +187,19 @@ static char *path_and_file(char *pathin, char **fileout) { if (pathin != slash) slash++; *fileout = strdup(slash); - return strndup(pathin, slash - pathin); + + /* strndup(pathin, slash - pathin) */ + n = slash - pathin; + len = strlen(pathin); + if (n < len) + len = n; + + result = (char *)malloc(len + 1); + if (!result) + return 0; + + result[len] = '\0'; + return (char *)memcpy(result, pathin, len); } static void file_save_as(GtkWidget *w, gpointer data) @@ -206,6 +220,9 @@ static void file_save_as(GtkWidget *w, gpointer data) current_dir = path_and_file(existing_filename, ¤t_file); gtk_file_chooser_set_current_folder(GTK_FILE_CHOOSER(dialog), current_dir); gtk_file_chooser_set_current_name(GTK_FILE_CHOOSER(dialog), current_file); + + free(current_dir); + if (gtk_dialog_run(GTK_DIALOG(dialog)) == GTK_RESPONSE_ACCEPT) { filename = gtk_file_chooser_get_filename(GTK_FILE_CHOOSER(dialog)); } |