diff options
Diffstat (limited to 'utils')
-rw-r--r-- | utils/Makefile | 2 | ||||
-rw-r--r-- | utils/file.c | 117 | ||||
-rw-r--r-- | utils/file.h | 95 | ||||
-rw-r--r-- | utils/filepath.c | 19 | ||||
-rw-r--r-- | utils/filepath.h | 11 |
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. |