]> git.tdb.fi Git - ext/subsurface.git/commitdiff
replaced stdndup() with the inlined equivalent
authorLubomir I. Ivanov <neolit123@gmail.com>
Sun, 26 Aug 2012 21:20:48 +0000 (00:20 +0300)
committerLinus Torvalds <torvalds@linux-foundation.org>
Sun, 26 Aug 2012 21:37:28 +0000 (14:37 -0700)
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>
gtk-gui.c

index a536c15e688101efaf616e2c1adf818125876342..04b7af113fac2edb5ccfa0372fb898f286cc8083 100644 (file)
--- 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));
        }