summaryrefslogtreecommitdiff
path: root/utils
diff options
context:
space:
mode:
Diffstat (limited to 'utils')
-rw-r--r--utils/Makefile2
-rw-r--r--utils/file.c117
-rw-r--r--utils/file.h95
-rw-r--r--utils/filepath.c19
-rw-r--r--utils/filepath.h11
5 files changed, 213 insertions, 31 deletions
diff --git a/utils/Makefile b/utils/Makefile
index aef579948..c808b91ba 100644
--- a/utils/Makefile
+++ b/utils/Makefile
@@ -2,6 +2,6 @@
S_UTILS := base64.c corestrings.c filename.c filepath.c hashtable.c \
libdom.c locale.c log.c messages.c nsurl.c talloc.c url.c \
- utf8.c utils.c useragent.c bloom.c nsoption.c
+ utf8.c utils.c useragent.c bloom.c nsoption.c file.c
S_UTILS := $(addprefix utils/,$(S_UTILS))
diff --git a/utils/file.c b/utils/file.c
new file mode 100644
index 000000000..7b0a4677a
--- /dev/null
+++ b/utils/file.c
@@ -0,0 +1,117 @@
+/*
+ * Copyright 2014 vincent Sanders <vince@netsurf-browser.org>
+ *
+ * This file is part of NetSurf, http://www.netsurf-browser.org/
+ *
+ * NetSurf is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; version 2 of the License.
+ *
+ * NetSurf is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+/** \file
+ * Table operations for files with posix compliant path separator.
+ */
+
+#include <stdarg.h>
+#include <string.h>
+
+#include "desktop/gui_factory.h"
+#include "utils/utils.h"
+
+#include "utils/file.h"
+
+/**
+ * Generate a posix path from one or more component elemnts.
+ *
+ * If a string is allocated it must be freed by the caller.
+ *
+ * @param[in,out] str pointer to string pointer if this is NULL enough
+ * storage will be allocated for the complete path.
+ * @param[in,out] size The size of the space available if \a str not
+ * NULL on input and if not NULL set to the total
+ * output length on output.
+ * @param[in] nemb The number of elements.
+ * @param[in] ... The elements of the path as string pointers.
+ * @return NSERROR_OK and the complete path is written to str
+ * or error code on faliure.
+ */
+static nserror posix_mkpath(char **str, size_t *size, size_t nelm, va_list ap)
+{
+ return vsnstrjoin(str, size, '/', nelm, ap);
+}
+
+/**
+ * Get the basename of a file using posix path handling.
+ *
+ * This gets the last element of a path and returns it.
+ *
+ * @param[in] path The path to extract the name from.
+ * @param[in,out] str Pointer to string pointer if this is NULL enough
+ * storage will be allocated for the path element.
+ * @param[in,out] size The size of the space available if \a
+ * str not NULL on input and set to the total
+ * output length on output.
+ * @return NSERROR_OK and the complete path is written to str
+ * or error code on faliure.
+ */
+static nserror posix_basename(const char *path, char **str, size_t *size)
+{
+ const char *leafname;
+ char *fname;
+
+ if (path == NULL) {
+ return NSERROR_BAD_PARAMETER;
+ }
+
+ leafname = strrchr(path, '/');
+ if (!leafname) {
+ leafname = path;
+ } else {
+ leafname += 1;
+ }
+
+ fname = strdup(leafname);
+ if (fname == NULL) {
+ return NSERROR_NOMEM;
+ }
+
+ *str = fname;
+ if (size != NULL) {
+ *size = strlen(fname);
+ }
+ return NSERROR_OK;
+}
+
+/* exported interface documented in utils/file.h */
+nserror netsurf_mkpath(char **str, size_t *size, size_t nelm, ...)
+{
+ va_list ap;
+ nserror ret;
+
+ va_start(ap, nelm);
+ if (guit != NULL) {
+ ret = guit->file->mkpath(str, size, nelm, ap);
+ } else {
+ /* default to posix */
+ ret = vsnstrjoin(str, size, '/', nelm, ap);
+ }
+ va_end(ap);
+
+ return ret;
+}
+
+/* default to using the posix file handling */
+static struct gui_file_table file_table = {
+ .mkpath = posix_mkpath,
+ .basename = posix_basename,
+};
+
+struct gui_file_table *default_file_table = &file_table;
diff --git a/utils/file.h b/utils/file.h
new file mode 100644
index 000000000..f183337c5
--- /dev/null
+++ b/utils/file.h
@@ -0,0 +1,95 @@
+/*
+ * Copyright 2014 Vincent Sanders <vince@netsurf-browser.org>
+ *
+ * This file is part of NetSurf, http://www.netsurf-browser.org/
+ *
+ * NetSurf is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; version 2 of the License.
+ *
+ * NetSurf is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+/** \file
+ * Default operations table for files.
+ */
+
+#ifndef NETSURF_UTILS_FILE_H
+#define NETSURF_UTILS_FILE_H
+
+#include <stdarg.h>
+
+/**
+ * function table for file and filename operations.
+ *
+ * function table implementing GUI interface to file and filename
+ * functionality appropriate for the OS.
+ */
+struct gui_file_table {
+ /* Mandantory entries */
+
+ /**
+ * Generate a path from one or more component elemnts.
+ *
+ * If a string is allocated it must be freed by the caller.
+ *
+ * @param[in,out] str pointer to string pointer if this is NULL enough
+ * storage will be allocated for the complete path.
+ * @param[in,out] size The size of the space available if \a str not
+ * NULL on input and if not NULL set to the total
+ * output length on output.
+ * @param[in] nemb The number of elements.
+ * @param[in] ... The elements of the path as string pointers.
+ * @return NSERROR_OK and the complete path is written to str
+ * or error code on faliure.
+ */
+ nserror (*mkpath)(char **str, size_t *size, size_t nemb, va_list ap);
+
+ /**
+ * Get the basename of a file.
+ *
+ * This gets the last element of a path and returns it.
+ *
+ * @param[in] path The path to extract the name from.
+ * @param[in,out] str Pointer to string pointer if this is NULL enough
+ * storage will be allocated for the path element.
+ * @param[in,out] size The size of the space available if \a
+ * str not NULL on input and set to the total
+ * output length on output.
+ * @return NSERROR_OK and the complete path is written to str
+ * or error code on faliure.
+ */
+ nserror (*basename)(const char *path, char **str, size_t *size);
+};
+
+/** Default (posix) file operation table. */
+struct gui_file_table *default_file_table;
+
+/**
+ * Generate a path from one or more component elemnts.
+ *
+ * If a string is allocated it must be freed by the caller.
+ *
+ * @warning If this is called before the gui operation tables are
+ * initialised the behaviour defaults to posix paths. Ensure this is
+ * the required behaviour.
+ *
+ * @param[in,out] str pointer to string pointer if this is NULL enough
+ * storage will be allocated for the complete path.
+ * @param[in,out] size The size of the space available if \a str not
+ * NULL on input and if not NULL set to the total
+ * output length on output.
+ * @param[in] nemb The number of elements.
+ * @param[in] ... The elements of the path as string pointers.
+ * @return NSERROR_OK and the complete path is written to str
+ * or error code on faliure.
+ */
+nserror netsurf_mkpath(char **str, size_t *size, size_t nelm, ...);
+
+#endif
diff --git a/utils/filepath.c b/utils/filepath.c
index 68e8d7e79..c28a821d7 100644
--- a/utils/filepath.c
+++ b/utils/filepath.c
@@ -326,25 +326,6 @@ void filepath_free_strvec(char **pathv)
}
/* exported interface documented in filepath.h */
-char *filepath_append(const char *path, const char *leaf)
-{
- int dirname_len;
- char *dirname;
-
- if ((path == NULL) || (leaf == NULL)) {
- return NULL;
- }
-
- dirname_len = strlen(path) + strlen(leaf) + 2;
- dirname = malloc(dirname_len);
- if (dirname != NULL) {
- snprintf(dirname, dirname_len, "%s/%s", path, leaf);
- }
-
- return dirname;
-}
-
-/* exported interface documented in filepath.h */
nserror filepath_mkdir_all(const char *fname)
{
char *dname;
diff --git a/utils/filepath.h b/utils/filepath.h
index 56e9eff74..61b7209cc 100644
--- a/utils/filepath.h
+++ b/utils/filepath.h
@@ -128,17 +128,6 @@ void filepath_free_strvec(char **pathv);
/**
- * generate a new filename from a path and leaf.
- *
- * @param path The base path.
- * @param leaf The leaf to add.
- * @return The combined path in a new string must be freed by caller
- * or NULL on failiure to allocte memory.
- */
-char *filepath_append(const char *path, const char *leaf);
-
-
-/**
* Ensure that all directory elements needed to store a filename exist.
*
* @param fname The filename to ensure the path to exists.