summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorGravatar Lubomir I. Ivanov <neolit123@gmail.com>2012-08-27 00:20:48 +0300
committerGravatar Linus Torvalds <torvalds@linux-foundation.org>2012-08-26 14:37:28 -0700
commit9d1057469485739c9a2563cf7c88fd2debc1e730 (patch)
tree806fc9683c221a2af737bacdd9c0e976b1d78872
parent642c83f5327317780a0f10b3ab46f6c1bd8bb202 (diff)
downloadsubsurface-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.c19
1 files changed, 18 insertions, 1 deletions
diff --git a/gtk-gui.c b/gtk-gui.c
index a536c15e6..04b7af113 100644
--- a/gtk-gui.c
+++ b/gtk-gui.c
@@ -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, &current_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));
}