From 0bb08cc5d2a2c66b77c3ec19db244c57a270a009 Mon Sep 17 00:00:00 2001 From: Chris Young Date: Sat, 1 Jun 2013 14:57:49 +0100 Subject: Macros for setting default options and updating user options if they are "as default" --- utils/nsoption.h | 15 +++++++++++++++ 1 file changed, 15 insertions(+) (limited to 'utils') diff --git a/utils/nsoption.h b/utils/nsoption.h index 868e077bd..b6ab860b1 100644 --- a/utils/nsoption.h +++ b/utils/nsoption.h @@ -270,5 +270,20 @@ int nsoption_snoptionf(char *string, size_t size, enum nsoption_e option, const } \ } while (0) +/* accessors for default options - user option is updated if it is set as per default */ +#define nsoption_default_set_bool(OPTION, VALUE) \ + if (nsoptions_default[NSOPTION_##OPTION].value.b == nsoptions[NSOPTION_##OPTION].value.b) \ + nsoptions[NSOPTION_##OPTION].value.b = VALUE; \ + nsoptions_default[NSOPTION_##OPTION].value.b = VALUE + +#define nsoption_default_set_int(OPTION, VALUE) \ + if (nsoptions_default[NSOPTION_##OPTION].value.i == nsoptions[NSOPTION_##OPTION].value.i) \ + nsoptions[NSOPTION_##OPTION].value.i = VALUE; \ + nsoptions_default[NSOPTION_##OPTION].value.i = VALUE + +#define nsoption_default_set_colour(OPTION, VALUE) \ + if (nsoptions_default[NSOPTION_##OPTION].value.c == nsoptions[NSOPTION_##OPTION].value.c) \ + nsoptions[NSOPTION_##OPTION].value.c = VALUE; \ + nsoptions_default[NSOPTION_##OPTION].value.c = VALUE #endif -- cgit v1.2.3 From 3b971bb1a7883b4eaee965e65daa58d0258caed5 Mon Sep 17 00:00:00 2001 From: Chris Young Date: Sat, 1 Jun 2013 15:21:08 +0100 Subject: Remove bool default setter as the user will struggle to override it --- utils/nsoption.h | 5 ----- 1 file changed, 5 deletions(-) (limited to 'utils') diff --git a/utils/nsoption.h b/utils/nsoption.h index b6ab860b1..bafcfb95a 100644 --- a/utils/nsoption.h +++ b/utils/nsoption.h @@ -271,11 +271,6 @@ int nsoption_snoptionf(char *string, size_t size, enum nsoption_e option, const } while (0) /* accessors for default options - user option is updated if it is set as per default */ -#define nsoption_default_set_bool(OPTION, VALUE) \ - if (nsoptions_default[NSOPTION_##OPTION].value.b == nsoptions[NSOPTION_##OPTION].value.b) \ - nsoptions[NSOPTION_##OPTION].value.b = VALUE; \ - nsoptions_default[NSOPTION_##OPTION].value.b = VALUE - #define nsoption_default_set_int(OPTION, VALUE) \ if (nsoptions_default[NSOPTION_##OPTION].value.i == nsoptions[NSOPTION_##OPTION].value.i) \ nsoptions[NSOPTION_##OPTION].value.i = VALUE; \ -- cgit v1.2.3 From 9bd296987684788c32dd346b2d67671ed5dfe7a0 Mon Sep 17 00:00:00 2001 From: Vincent Sanders Date: Sat, 1 Jun 2013 16:05:51 +0100 Subject: amiga is the only user of the very odd usage of the options API --- amiga/gui.c | 6 ++++++ utils/nsoption.h | 11 ----------- 2 files changed, 6 insertions(+), 11 deletions(-) (limited to 'utils') diff --git a/amiga/gui.c b/amiga/gui.c index 4ec0ea1d7..a26c0f7f7 100644 --- a/amiga/gui.c +++ b/amiga/gui.c @@ -196,6 +196,12 @@ static void ami_gui_window_update_box_deferred(struct gui_window *g, bool draw); static void ami_do_redraw(struct gui_window_2 *g); static void ami_schedule_redraw_remove(struct gui_window_2 *gwin); +/* accessors for default options - user option is updated if it is set as per default */ +#define nsoption_default_set_int(OPTION, VALUE) \ + if (nsoptions_default[NSOPTION_##OPTION].value.i == nsoptions[NSOPTION_##OPTION].value.i) \ + nsoptions[NSOPTION_##OPTION].value.i = VALUE; \ + nsoptions_default[NSOPTION_##OPTION].value.i = VALUE + STRPTR ami_locale_langs(void) { struct Locale *locale; diff --git a/utils/nsoption.h b/utils/nsoption.h index bafcfb95a..15ecee3c9 100644 --- a/utils/nsoption.h +++ b/utils/nsoption.h @@ -270,15 +270,4 @@ int nsoption_snoptionf(char *string, size_t size, enum nsoption_e option, const } \ } while (0) -/* accessors for default options - user option is updated if it is set as per default */ -#define nsoption_default_set_int(OPTION, VALUE) \ - if (nsoptions_default[NSOPTION_##OPTION].value.i == nsoptions[NSOPTION_##OPTION].value.i) \ - nsoptions[NSOPTION_##OPTION].value.i = VALUE; \ - nsoptions_default[NSOPTION_##OPTION].value.i = VALUE - -#define nsoption_default_set_colour(OPTION, VALUE) \ - if (nsoptions_default[NSOPTION_##OPTION].value.c == nsoptions[NSOPTION_##OPTION].value.c) \ - nsoptions[NSOPTION_##OPTION].value.c = VALUE; \ - nsoptions_default[NSOPTION_##OPTION].value.c = VALUE - #endif -- cgit v1.2.3 From bccaa05fdb50a1d5f481cf34f6af906638dfc68c Mon Sep 17 00:00:00 2001 From: Vincent Sanders Date: Sat, 1 Jun 2013 15:49:17 +0100 Subject: add finalisation to options and document the API better --- framebuffer/gui.c | 7 +- gtk/gui.c | 15 +++- monkey/main.c | 8 +- utils/nsoption.c | 232 +++++++++++++++++++++++++++++++++++++++++------------- utils/nsoption.h | 136 ++++++++++++++++++++++++-------- 5 files changed, 301 insertions(+), 97 deletions(-) (limited to 'utils') diff --git a/framebuffer/gui.c b/framebuffer/gui.c index 024ab283f..d9e78d7a8 100644 --- a/framebuffer/gui.c +++ b/framebuffer/gui.c @@ -568,9 +568,9 @@ main(int argc, char** argv) die("Options failed to initialise"); } options = filepath_find(respaths, "Choices"); - nsoption_read(options, NULL); + nsoption_read(options, nsoptions); free(options); - nsoption_commandline(&argc, argv, NULL); + nsoption_commandline(&argc, argv, nsoptions); /* common initialisation */ messages = filepath_find(respaths, "Messages"); @@ -625,6 +625,9 @@ main(int argc, char** argv) netsurf_exit(); + /* finalise options */ + nsoption_finalise(nsoptions, nsoptions_default); + return 0; } diff --git a/gtk/gui.c b/gtk/gui.c index ac743c5d0..01f9688e3 100644 --- a/gtk/gui.c +++ b/gtk/gui.c @@ -554,12 +554,14 @@ int main(int argc, char** argv) /* user options setup */ ret = nsoption_init(set_defaults, &nsoptions, &nsoptions_default); if (ret != NSERROR_OK) { - die("Options failed to initialise"); + fprintf(stderr, "Options failed to initialise (%s)\n", + messages_get_errorcode(ret)); + return 1; } options = filepath_find(respaths, "Choices"); - nsoption_read(options, NULL); + nsoption_read(options, nsoptions); free(options); - nsoption_commandline(&argc, argv, NULL); + nsoption_commandline(&argc, argv, nsoptions); check_options(respaths); /* check user options */ /* common initialisation */ @@ -567,7 +569,9 @@ int main(int argc, char** argv) ret = netsurf_init(messages); free(messages); if (ret != NSERROR_OK) { - die("NetSurf failed to initialise"); + fprintf(stderr, "NetSurf core failed to initialise (%s)\n", + messages_get_errorcode(ret)); + return 1; } /* run the browser */ @@ -581,6 +585,9 @@ int main(int argc, char** argv) /* common finalisation */ netsurf_exit(); + /* finalise options */ + nsoption_finalise(nsoptions, nsoptions_default); + return 0; } diff --git a/monkey/main.c b/monkey/main.c index 0a9826a3c..e806b0eb3 100644 --- a/monkey/main.c +++ b/monkey/main.c @@ -142,9 +142,9 @@ main(int argc, char **argv) die("Options failed to initialise"); } options = filepath_find(respaths, "Choices"); - nsoption_read(options, NULL); + nsoption_read(options, nsoptions); free(options); - nsoption_commandline(&argc, argv, NULL); + nsoption_commandline(&argc, argv, nsoptions); /* common initialisation */ messages = filepath_find(respaths, "Messages"); @@ -173,5 +173,9 @@ main(int argc, char **argv) netsurf_exit(); fprintf(stdout, "GENERIC FINISHED\n"); + + /* finalise options */ + nsoption_finalise(nsoptions, nsoptions_default); + return 0; } diff --git a/utils/nsoption.c b/utils/nsoption.c index a9264de6d..f6244cd48 100644 --- a/utils/nsoption.c +++ b/utils/nsoption.c @@ -54,7 +54,8 @@ struct nsoption_s *nsoptions_default = NULL; #define NSOPTION_COLOUR(NAME, DEFAULT) \ { #NAME, sizeof(#NAME) - 1, OPTION_COLOUR, { .c = DEFAULT } }, -struct nsoption_s defaults[] = { +/** The table of compiled in default options */ +static struct nsoption_s defaults[] = { #include "desktop/options.h" #if defined(riscos) @@ -160,11 +161,11 @@ static void nsoption_validate(struct nsoption_s *opts, struct nsoption_s *defs) /* to aid migration from old, broken, configuration files this * checks to see if all the system colours are set to black - * and returns them to defaults instead + * and returns them to defaults instead */ - for (cloop = NSOPTION_SYS_COLOUR_START; - cloop <= NSOPTION_SYS_COLOUR_END; + for (cloop = NSOPTION_SYS_COLOUR_START; + cloop <= NSOPTION_SYS_COLOUR_END; cloop++) { if (opts[cloop].value.c != 0) { black = false; @@ -172,18 +173,26 @@ static void nsoption_validate(struct nsoption_s *opts, struct nsoption_s *defs) } } if (black == true) { - for (cloop = NSOPTION_SYS_COLOUR_START; - cloop <= NSOPTION_SYS_COLOUR_END; + for (cloop = NSOPTION_SYS_COLOUR_START; + cloop <= NSOPTION_SYS_COLOUR_END; cloop++) { opts[cloop].value.c = defs[cloop].value.c; } } } -static bool -nsoption_is_set(struct nsoption_s *opts, - struct nsoption_s *defs, - enum nsoption_e entry) +/** + * Determines if an option is different between two option tables. + * + * @param opts The first table to compare. + * @param defs The second table to compare. + * @param entry The option to compare. + * @return true if the option differs false if not. + */ +static bool +nsoption_is_set(const struct nsoption_s *opts, + const struct nsoption_s *defs, + const enum nsoption_e entry) { bool ret = false; @@ -232,11 +241,12 @@ nsoption_is_set(struct nsoption_s *opts, return ret; } -/** Output choices to file stream +/** + * Output choices to file stream * - * @param fp the file stream to write to - * @param opts The options table to write - * @param defs the default value table to compare with. + * @param fp The file stream to write to. + * @param opts The options table to write. + * @param defs The default value table to compare with. * @param all Output all entries not just ones changed from defaults */ static nserror @@ -245,14 +255,12 @@ nsoption_output(FILE *fp, struct nsoption_s *defs, bool all) { - unsigned int entry; - bool show; + unsigned int entry; /* index to option being output */ colour rgbcolour; /* RRGGBB */ for (entry = 0; entry < NSOPTION_LISTEND; entry++) { - show = all || nsoption_is_set(opts, defs, entry); - - if (show == false) { + if ((all == false) && + (nsoption_is_set(opts, defs, entry) == false)) { continue; } @@ -302,11 +310,11 @@ nsoption_output(FILE *fp, /** * Output an option value into a string, in HTML format. * - * \param option The option to output the value of. - * \param size The size of the string buffer. - * \param pos The current position in string - * \param string The string in which to output the value. - * \return The number of bytes written to string or -1 on error + * @param option The option to output the value of. + * @param size The size of the string buffer. + * @param pos The current position in string + * @param string The string in which to output the value. + * @return The number of bytes written to string or -1 on error */ static size_t nsoption_output_value_html(struct nsoption_s *option, @@ -372,11 +380,11 @@ nsoption_output_value_html(struct nsoption_s *option, /** * Output an option value into a string, in plain text format. * - * \param option The option to output the value of. - * \param size The size of the string buffer. - * \param pos The current position in string - * \param string The string in which to output the value. - * \return The number of bytes written to string or -1 on error + * @param option The option to output the value of. + * @param size The size of the string buffer. + * @param pos The current position in string + * @param string The string in which to output the value. + * @return The number of bytes written to string or -1 on error */ static size_t nsoption_output_value_text(struct nsoption_s *option, @@ -429,6 +437,69 @@ nsoption_output_value_text(struct nsoption_s *option, return slen; } +/** + * Duplicates an option table. + * + * Allocates a new option table and copies an existing one into it. + * + * @param src The source table to copy + */ +static nserror +nsoption_dup(struct nsoption_s *src, struct nsoption_s **pdst) +{ + struct nsoption_s *dst; + dst = malloc(sizeof(defaults)); + if (dst == NULL) { + return NSERROR_NOMEM; + } + *pdst = dst; + + /* copy the source table into the destination table */ + memcpy(dst, src, sizeof(defaults)); + + while (src->key != NULL) { + if ((src->type == OPTION_STRING) && + (src->value.s != NULL)) { + dst->value.s = strdup(src->value.s); + } + src++; + dst++; + } + + return NSERROR_OK; +} + +/** + * frees an option table. + * + * Iterates through an option table a freeing resources as required + * finally freeing the option table itself. + * + * @param opts The option table to free. + */ +static nserror +nsoption_free(struct nsoption_s *opts) +{ + struct nsoption_s *cur; /* option being freed */ + + if (opts == NULL) { + return NSERROR_BAD_PARAMETER; + } + + cur = opts; + + while (cur->key != NULL) { + if ((cur->type == OPTION_STRING) && (cur->value.s != NULL)) { + free(cur->value.s); + } + cur++; + } + free(opts); + + return NSERROR_OK; +} + + /* exported interface documented in utils/nsoption.h */ nserror nsoption_init(nsoption_set_default_t *set_defaults, @@ -436,38 +507,37 @@ nsoption_init(nsoption_set_default_t *set_defaults, struct nsoption_s **pdefs) { nserror ret; - struct nsoption_s *src; - struct nsoption_s *dst; + struct nsoption_s *defs; struct nsoption_s *opts; + ret = nsoption_dup(&defaults[0], &defs); + if (ret != NSERROR_OK) { + return ret; + } + /* update the default table */ if (set_defaults != NULL) { - nsoptions = &defaults[0]; - ret = set_defaults(&defaults[0]); + /** @todo it would be better if the frontends actually + * set values in the passed in table instead of + * assuming the global one. + */ + opts = nsoptions; + nsoptions = defs; + + ret = set_defaults(defs); if (ret != NSERROR_OK) { - nsoptions = NULL; + nsoptions = opts; + nsoption_free(defs); return ret; } } - opts = malloc(sizeof(defaults)); - if (opts == NULL) { - return NSERROR_NOMEM; - } - /* copy the default values into the working set */ - src = &defaults[0]; - dst = opts; - - memcpy(dst, src, sizeof(defaults)); - - while (src->key != NULL) { - if ((src->type == OPTION_STRING) && (src->value.s != NULL)) { - dst->value.s = strdup(src->value.s); - } - src++; - dst++; + ret = nsoption_dup(defs, &opts); + if (ret != NSERROR_OK) { + nsoption_free(defs); + return ret; } /* return values if wanted */ @@ -478,13 +548,33 @@ nsoption_init(nsoption_set_default_t *set_defaults, } if (pdefs != NULL) { - *pdefs = &defaults[0]; + *pdefs = defs; + } else { + nsoptions_default = defs; } return NSERROR_OK; } +/* exported interface documented in utils/nsoption.h */ +nserror nsoption_finalise(struct nsoption_s *opts, struct nsoption_s *defs) +{ + /* check to see if global table selected */ + if (opts == NULL) { + opts = nsoptions; + } + nsoption_free(opts); + + /* check to see if global table selected */ + if (defs == NULL) { + defs = nsoptions_default; + } + + nsoption_free(defs); + + return NSERROR_OK; +} /* exported interface documented in utils/nsoption.h */ nserror @@ -503,8 +593,8 @@ nsoption_read(const char *path, struct nsoption_s *opts) opts = nsoptions; } - /* @todo is this and API bug not being a parameter */ - defs = nsoptions_default; + /** @todo is this and API bug not being a parameter */ + defs = nsoptions_default; fp = fopen(path, "r"); if (!fp) { @@ -569,7 +659,7 @@ nsoption_write(const char *path, /* check to see if global table selected */ if (defs == NULL) { - defs = &defaults[0]; + defs = nsoptions_default; } fp = fopen(path, "w"); @@ -699,8 +789,8 @@ nsoption_snoptionf(char *string, break; case 'p': - if (nsoption_is_set(nsoptions, - nsoptions_default, + if (nsoption_is_set(nsoptions, + nsoptions_default, option_idx)) { slen += snprintf(string + slen, size - slen, @@ -774,3 +864,33 @@ nsoption_snoptionf(char *string, return slen; } + +/* exported interface documented in options.h */ +nserror +nsoption_set_tbl_charp(struct nsoption_s *opts, + enum nsoption_e option_idx, + char *s) +{ + struct nsoption_s *option; + + option = &opts[option_idx]; + + /* ensure it is a string option */ + if (option->type != OPTION_STRING) { + return NSERROR_BAD_PARAMETER; + } + + /* free any existing string */ + if (option->value.s != NULL) { + free(option->value.s); + } + + option->value.s = s; + + /* check for empty string */ + if ((option->value.s != NULL) && (*option->value.s == 0)) { + free(option->value.s); + option->value.s = NULL; + } + return NSERROR_OK; +} diff --git a/utils/nsoption.h b/utils/nsoption.h index 15ecee3c9..d111729aa 100644 --- a/utils/nsoption.h +++ b/utils/nsoption.h @@ -34,7 +34,7 @@ * pointer to the active options table and be implemented as functions * within nsoptions.c * - * Indirect acees would have an impact on performance of NetSurf as + * Indirect access would have an impact on performance of NetSurf as * the expected option lookup cost is currently that of a simple * dereference (which this current implementation keeps). */ @@ -91,15 +91,17 @@ enum { OPTION_HTTP_PROXY_AUTH_NONE = 0, #define DEFAULT_EXPORT_SCALE 0.7 #ifndef DEFAULT_REFLOW_PERIOD -#define DEFAULT_REFLOW_PERIOD 25 /* time in cs */ +/** Default reflow time in cs */ +#define DEFAULT_REFLOW_PERIOD 25 #endif +/** The options type. */ enum nsoption_type_e { - OPTION_BOOL, - OPTION_INTEGER, - OPTION_UINT, - OPTION_STRING, - OPTION_COLOUR + OPTION_BOOL, /**< Option is a boolean. */ + OPTION_INTEGER, /**< Option is an integer. */ + OPTION_UINT, /**< Option is an unsigned integer */ + OPTION_STRING, /**< option is a heap allocated string. */ + OPTION_COLOUR /**< Option is a netsurf colour. */ }; struct nsoption_s { @@ -149,17 +151,24 @@ enum nsoption_e { #undef NSOPTION_UINT #undef NSOPTION_COLOUR -/* global option table */ +/** + * global active option table. + */ extern struct nsoption_s *nsoptions; -/* global default option table */ +/** + * global default option table. + */ extern struct nsoption_s *nsoptions_default; -/* default setting callback */ +/** + * default setting callback. + */ typedef nserror(nsoption_set_default_t)(struct nsoption_s *defaults); -/** Initialise option system. +/** + * Initialise option system. * * @param set_default callback to allow the customisation of the default * options. @@ -170,7 +179,20 @@ typedef nserror(nsoption_set_default_t)(struct nsoption_s *defaults); nserror nsoption_init(nsoption_set_default_t *set_default, struct nsoption_s **popts, struct nsoption_s **pdefs); -/** Read choices file and set them in the passed table +/** + * Finalise option system + * + * Releases all resources allocated in the initialisation. + * + * @param opts the options table or NULL to use global table. + * @param defs the default options table to use or NULL to use global table + * return The error status + */ +nserror nsoption_finalise(struct nsoption_s *opts, struct nsoption_s *defs); + + +/** + * Read choices file and set them in the passed table * * @param path The path to read the file from * @param opts The options table to enerate values from or NULL to use global @@ -179,7 +201,8 @@ nserror nsoption_init(nsoption_set_default_t *set_default, struct nsoption_s **p nserror nsoption_read(const char *path, struct nsoption_s *opts); -/** Write options that have changed from the defaults to a file. +/** + * Write options that have changed from the defaults to a file. * * The \a nsoption_dump can be used to output all entries not just * changed ones. @@ -201,6 +224,7 @@ nserror nsoption_write(const char *path, struct nsoption_s *opts, struct nsoptio */ nserror nsoption_dump(FILE *outf, struct nsoption_s *opts); + /** * Process commandline and set options approriately. * @@ -211,6 +235,7 @@ nserror nsoption_dump(FILE *outf, struct nsoption_s *opts); */ nserror nsoption_commandline(int *pargc, char **argv, struct nsoption_s *opts); + /** * Fill a buffer with an option using a format. * @@ -231,40 +256,85 @@ nserror nsoption_commandline(int *pargc, char **argv, struct nsoption_s *opts); int nsoption_snoptionf(char *string, size_t size, enum nsoption_e option, const char *fmt); +/** + * Get the value of a boolean option. + * + * Gets the value of an option assuming it is a boolean type. + * @note option type is unchecked so care must be taken in caller. + */ +#define nsoption_bool(OPTION) (nsoptions[NSOPTION_##OPTION].value.b) -/* value acessors - caution should be taken with type as this is not verified */ -#define nsoption_bool(OPTION) (nsoptions[NSOPTION_##OPTION].value.b) +/** + * Get the value of an integer option. + * + * Gets the value of an option assuming it is a integer type. + * @note option type is unchecked so care must be taken in caller. + */ #define nsoption_int(OPTION) (nsoptions[NSOPTION_##OPTION].value.i) + + +/** + * Get the value of an unsigned integer option. + * + * Gets the value of an option assuming it is a integer type. + * @note option type is unchecked so care must be taken in caller. + */ #define nsoption_uint(OPTION) (nsoptions[NSOPTION_##OPTION].value.u) + + +/** + * Get the value of a string option. + * + * Gets the value of an option assuming it is a string type. + * @note option type is unchecked so care must be taken in caller. + */ #define nsoption_charp(OPTION) (nsoptions[NSOPTION_##OPTION].value.s) + + +/** + * Get the value of a netsurf colour option. + * + * Gets the value of an option assuming it is a colour type. + * @note option type is unchecked so care must be taken in caller. + */ #define nsoption_colour(OPTION) (nsoptions[NSOPTION_##OPTION].value.c) + +/** set a boolean option in the default table */ #define nsoption_set_bool(OPTION, VALUE) nsoptions[NSOPTION_##OPTION].value.b = VALUE + + +/** set an integer option in the default table */ #define nsoption_set_int(OPTION, VALUE) nsoptions[NSOPTION_##OPTION].value.i = VALUE + + +/** set a colour option in the default table */ #define nsoption_set_colour(OPTION, VALUE) nsoptions[NSOPTION_##OPTION].value.c = VALUE -#define nsoption_set_charp(OPTION, VALUE) \ - do { \ - if (nsoptions[NSOPTION_##OPTION].value.s != NULL) { \ - free(nsoptions[NSOPTION_##OPTION].value.s); \ - } \ - nsoptions[NSOPTION_##OPTION].value.s = VALUE; \ - if ((nsoptions[NSOPTION_##OPTION].value.s != NULL) && \ - (*nsoptions[NSOPTION_##OPTION].value.s == 0)) { \ - free(nsoptions[NSOPTION_##OPTION].value.s); \ - nsoptions[NSOPTION_##OPTION].value.s = NULL; \ - } \ - } while (0) -/* if a string option is unset set it otherwise leave it set */ + +/** + * Set string option in specified table. + * + * Sets the string option to the value given freeing any resources + * currently allocated to the option. If the passed string is empty it + * is converted to the NULL value. + * + * @param opts The table to set option in + * @param option_idx The option + * @param s The string to set. This is used directly and not copied. + */ +nserror nsoption_set_tbl_charp(struct nsoption_s *opts, enum nsoption_e option_idx, char *s); + +/** set string option in default table */ +#define nsoption_set_charp(OPTION, VALUE) \ + nsoption_set_tbl_charp(nsoptions, NSOPTION_##OPTION, VALUE) + +/** set string option in default table if currently unset */ #define nsoption_setnull_charp(OPTION, VALUE) \ do { \ if (nsoptions[NSOPTION_##OPTION].value.s == NULL) { \ - nsoptions[NSOPTION_##OPTION].value.s = VALUE; \ - if (*nsoptions[NSOPTION_##OPTION].value.s == 0) { \ - free(nsoptions[NSOPTION_##OPTION].value.s); \ - nsoptions[NSOPTION_##OPTION].value.s = NULL; \ - } \ + nsoption_set_tbl_charp(nsoptions, NSOPTION_##OPTION, VALUE); \ } else { \ free(VALUE); \ } \ -- cgit v1.2.3