1
0
mirror of https://github.com/lammertb/libhttp.git synced 2025-09-04 12:42:09 +03:00

Rewrite options argument handling (Step 1)

This commit is contained in:
bel
2014-08-13 23:04:21 +02:00
parent f031b7a81d
commit a25d03617c

View File

@@ -75,7 +75,7 @@ static int guard = 0; /* test if any dialog is already open */
#define abs_path(rel, abs, abs_size) realpath((rel), (abs)) #define abs_path(rel, abs, abs_size) realpath((rel), (abs))
#endif /* _WIN32 */ #endif /* _WIN32 */
#define MAX_OPTIONS 100 #define MAX_OPTIONS 50
#define MAX_CONF_FILE_LINE_SIZE (8 * 1024) #define MAX_CONF_FILE_LINE_SIZE (8 * 1024)
static int exit_flag = 0; /* Main loop should exit */ static int exit_flag = 0; /* Main loop should exit */
@@ -230,6 +230,26 @@ static char *sdup(const char *str)
return p; return p;
} }
static const char *get_option(char **options, const char *option_name)
{
int i = 0;
const char *opt_value = NULL;
/* TODO: options should be an array of key-value-pairs, like
struct {const char * key, const char * value} options[]
but it currently is an array with
options[2*i] = key, options[2*i + 1] = value
*/
while (options[2*i] != NULL) {
if (strcmp(options[2*i], option_name) == 0) {
opt_value = options[2*i + 1];
break;
}
i++;
}
return opt_value;
}
static int set_option(char **options, const char *name, const char *value) static int set_option(char **options, const char *name, const char *value)
{ {
int i, type; int i, type;
@@ -266,20 +286,20 @@ static int set_option(char **options, const char *name, const char *value)
break; break;
} }
for (i = 0; i < MAX_OPTIONS - 3; i++) { for (i = 0; i < MAX_OPTIONS; i++) {
if (options[i] == NULL) { if (options[2*i] == NULL) {
options[i] = sdup(name); options[2*i] = sdup(name);
options[i + 1] = sdup(value); options[2*i + 1] = sdup(value);
options[i + 2] = NULL; options[2*i + 2] = NULL;
break; break;
} else if (!strcmp(options[i], name)) { } else if (!strcmp(options[2*i], name)) {
free(options[i + 1]); free(options[2*i + 1]);
options[i + 1] = sdup(value); options[2*i + 1] = sdup(value);
break; break;
} }
} }
if (i == MAX_OPTIONS - 3) { if (i == MAX_OPTIONS) {
die("%s", "Too many options specified"); die("%s", "Too many options specified");
} }
@@ -444,17 +464,6 @@ static int is_path_absolute(const char *path)
#endif #endif
} }
static char *get_option(char **options, const char *option_name)
{
int i;
for (i = 0; options[i] != NULL; i++)
if (!strcmp(options[i], option_name))
return options[i + 1];
return NULL;
}
static void verify_existence(char **options, const char *option_name, static void verify_existence(char **options, const char *option_name,
int must_be_dir) int must_be_dir)
{ {
@@ -518,7 +527,7 @@ static void set_absolute_path(char *options[], const char *option_name,
static void start_civetweb(int argc, char *argv[]) static void start_civetweb(int argc, char *argv[])
{ {
struct mg_callbacks callbacks; struct mg_callbacks callbacks;
char *options[MAX_OPTIONS]; char *options[2*MAX_OPTIONS+1];
int i; int i;
/* Edit passwords file if -A option is specified */ /* Edit passwords file if -A option is specified */
@@ -679,7 +688,7 @@ static BOOL CALLBACK SettingsDlgProc(HWND hDlg, UINT msg, WPARAM wParam, LPARAM
int i, j; int i, j;
const char *name, *value; const char *name, *value;
const struct mg_option *default_options = mg_get_valid_options(); const struct mg_option *default_options = mg_get_valid_options();
char *file_options[MAX_OPTIONS] = {0}; char *file_options[MAX_OPTIONS*2+1] = {0};
char *title; char *title;
switch (msg) { switch (msg) {
@@ -734,7 +743,8 @@ static BOOL CALLBACK SettingsDlgProc(HWND hDlg, UINT msg, WPARAM wParam, LPARAM
} }
} }
for (i = 0; i<MAX_OPTIONS; i++) { for (i = 0; i<MAX_OPTIONS; i++) {
free(file_options[i]); free(file_options[2*i]);
free(file_options[2*i+1]);
} }
break; break;