From d6eb28d5deef18c9b3fdb953553705b182ea8403 Mon Sep 17 00:00:00 2001
From: Chris Young <chris@unsatisfactorysoftware.co.uk>
Date: Fri, 9 Jul 2010 19:45:44 +0000
Subject: [PATCH] Replace unnecessarily complicated path concatenation with
 something simpler and easily adaptable to different platform path structures.

svn path=/trunk/netsurf/; revision=10621
---
 amiga/misc.c            | 15 +++++++++++++++
 beos/beos_gui.cpp       | 19 +++++++++++++++++++
 desktop/save_complete.c | 16 +++++++---------
 framebuffer/misc.c      | 19 +++++++++++++++++++
 gtk/gtk_gui.c           | 19 +++++++++++++++++++
 riscos/gui.c            | 19 +++++++++++++++++++
 utils/utils.h           |  1 +
 windows/misc.c          | 19 +++++++++++++++++++
 8 files changed, 118 insertions(+), 9 deletions(-)

diff --git a/amiga/misc.c b/amiga/misc.c
index 17ea4c22b..8b148d852 100755
--- a/amiga/misc.c
+++ b/amiga/misc.c
@@ -106,6 +106,21 @@ char *filename_from_path(char *path)
 	return strdup(FilePart(path));
 }
 
+/**
+ * Add a path component/filename to an existing path
+ *
+ * \param path buffer containing path + free space
+ * \param length length of buffer "path"
+ * \param newpart string containing path component to add to path
+ * \return true on success
+ */
+
+bool path_add_part(char *path, int length, char *newpart)
+{
+	if(AddPart(path, newpart, length)) return true;
+		else return false;
+}
+
 /**
  * returns a string without escape chars or |M chars.
  * (based on remove_underscores from utils.c)
diff --git a/beos/beos_gui.cpp b/beos/beos_gui.cpp
index 83af4b682..460ae1a87 100644
--- a/beos/beos_gui.cpp
+++ b/beos/beos_gui.cpp
@@ -1197,3 +1197,22 @@ char *filename_from_path(char *path)
 
 	return strdup(leafname);
 }
+
+/**
+ * Add a path component/filename to an existing path
+ *
+ * \param path buffer containing path + free space
+ * \param length length of buffer "path"
+ * \param newpart string containing path component to add to path
+ * \return true on success
+ */
+
+bool path_add_part(char *path, int length, char *newpart)
+{
+	if(path[strlen(path)] != '/')
+		strncat(path, "/", length);
+
+	strncat(path, newpart, length);
+
+	return true;
+}
diff --git a/desktop/save_complete.c b/desktop/save_complete.c
index 88fe31560..19c1696d6 100644
--- a/desktop/save_complete.c
+++ b/desktop/save_complete.c
@@ -759,21 +759,19 @@ void save_complete_list_dump(void)
 bool save_complete_inventory(const char *path,
 		struct save_complete_entry *list)
 {
-	char urlpath[256];
+	char fullpath[256];
 	FILE *fp;
-	char *pathstring, *standardpath = (path[0] == '/') ?
-			(char *)(path + 1) : (char *)path;
 	struct save_complete_entry *entry;
+	bool error;
 
-	snprintf(urlpath, sizeof urlpath, "file:///%s/Inventory", 
-			standardpath);
-	pathstring = url_to_path(urlpath);
-	if (pathstring == NULL) {
+	strncpy(fullpath, path, sizeof fullpath);
+	error = path_add_part(fullpath, sizeof fullpath, path);
+
+	if (error == false) {
 		warn_user("NoMemory", 0);
 		return false;
 	}
-	fp = fopen(pathstring, "w");
-	free(pathstring);
+	fp = fopen(fullpath, "w");
 	if (!fp) {
 		LOG(("fopen(): errno = %i", errno));
 		warn_user("SaveError", strerror(errno));
diff --git a/framebuffer/misc.c b/framebuffer/misc.c
index 5e351f517..143ea8cf9 100644
--- a/framebuffer/misc.c
+++ b/framebuffer/misc.c
@@ -59,3 +59,22 @@ char *filename_from_path(char *path)
 
 	return strdup(leafname);
 }
+
+/**
+ * Add a path component/filename to an existing path
+ *
+ * \param path buffer containing path + free space
+ * \param length length of buffer "path"
+ * \param newpart string containing path component to add to path
+ * \return true on success
+ */
+
+bool path_add_part(char *path, int length, char *newpart)
+{
+	if(path[strlen(path)] != '/')
+		strncat(path, "/", length);
+
+	strncat(path, newpart, length);
+
+	return true;
+}
diff --git a/gtk/gtk_gui.c b/gtk/gtk_gui.c
index 79391ab4f..2470f30b5 100644
--- a/gtk/gtk_gui.c
+++ b/gtk/gtk_gui.c
@@ -978,3 +978,22 @@ char *filename_from_path(char *path)
 
 	return strdup(leafname);
 }
+
+/**
+ * Add a path component/filename to an existing path
+ *
+ * \param path buffer containing path + free space
+ * \param length length of buffer "path"
+ * \param newpart string containing path component to add to path
+ * \return true on success
+ */
+
+bool path_add_part(char *path, int length, char *newpart)
+{
+	if(path[strlen(path)] != '/')
+		strncat(path, "/", length);
+
+	strncat(path, newpart, length);
+
+	return true;
+}
diff --git a/riscos/gui.c b/riscos/gui.c
index eaba7bf58..0c04d69a5 100644
--- a/riscos/gui.c
+++ b/riscos/gui.c
@@ -2478,3 +2478,22 @@ char *filename_from_path(char *path)
 
 	return leafname;
 }
+
+/**
+ * Add a path component/filename to an existing path
+ *
+ * \param path buffer containing path + free space
+ * \param length length of buffer "path"
+ * \param newpart string containing path component to add to path
+ * \return true on success
+ */
+
+bool path_add_part(char *path, int length, char *newpart)
+{
+	if(path[strlen(path)] != '.')
+		strncat(path, ".", length);
+
+	strncat(path, newpart, length);
+
+	return true;
+}
diff --git a/utils/utils.h b/utils/utils.h
index 5b06d9caa..b8edfb836 100644
--- a/utils/utils.h
+++ b/utils/utils.h
@@ -121,4 +121,5 @@ query_id query_user(const char *query, const char *detail,
 void query_close(query_id);
 void PDF_Password(char **owner_pass, char **user_pass, char *path);
 char *filename_from_path(char *path);
+bool path_add_part(char *path, int length, char *newpart);
 #endif
diff --git a/windows/misc.c b/windows/misc.c
index 7a6fc3206..bb1ca3f38 100644
--- a/windows/misc.c
+++ b/windows/misc.c
@@ -65,3 +65,22 @@ char *filename_from_path(char *path)
 
 	return strdup(leafname);
 }
+
+/**
+ * Add a path component/filename to an existing path
+ *
+ * \param path buffer containing path + free space
+ * \param length length of buffer "path"
+ * \param newpart string containing path component to add to path
+ * \return true on success
+ */
+
+bool path_add_part(char *path, int length, char *newpart)
+{
+	if(path[strlen(path)] != '\\')
+		strncat(path, "\\", length);
+
+	strncat(path, newpart, length);
+
+	return true;
+}