summaryrefslogtreecommitdiffstats
path: root/cfgparser.c
diff options
context:
space:
mode:
authorszabii <szabii@b3059339-0415-0410-9bf9-f77b7e298cf2>2001-03-19 14:35:38 +0000
committerszabii <szabii@b3059339-0415-0410-9bf9-f77b7e298cf2>2001-03-19 14:35:38 +0000
commit73e964a999ebe1cbbedd6eb3b55bbeef012648fa (patch)
treeb8d4b4e4cd1fafd8b80caf2e8d6ca43cb2aeae93 /cfgparser.c
parentff781e8cf0ac0dde9275692955a9c3bda7d246a5 (diff)
downloadmpv-73e964a999ebe1cbbedd6eb3b55bbeef012648fa.tar.bz2
mpv-73e964a999ebe1cbbedd6eb3b55bbeef012648fa.tar.xz
cfgparse fix...
git-svn-id: svn://svn.mplayerhq.hu/mplayer/trunk@161 b3059339-0415-0410-9bf9-f77b7e298cf2
Diffstat (limited to 'cfgparser.c')
-rw-r--r--cfgparser.c181
1 files changed, 99 insertions, 82 deletions
diff --git a/cfgparser.c b/cfgparser.c
index b2319fb4f3..174c60b951 100644
--- a/cfgparser.c
+++ b/cfgparser.c
@@ -53,21 +53,29 @@ static int init_conf(struct config *conf, int mode)
static int read_option(char *opt, char *param)
{
int i;
- int need_param = -1;
int tmp_int;
float tmp_float;
+ int ret = -1;
for (i = 0; i < nr_options; i++) {
if (!strcasecmp(opt, config[i].name))
break;
}
- if (i == nr_options)
- return ERR_NOT_AN_OPTION;
-
- if (config[i].flags & CONF_NOCFG && parser_mode == CONFIG_FILE)
- return ERR_NOT_AN_OPTION;
- if (config[i].flags & CONF_NOCMD && parser_mode == COMMAND_LINE)
- return ERR_NOT_AN_OPTION;
+ if (i == nr_options) {
+ printf("invalid option:\n");
+ ret = ERR_NOT_AN_OPTION;
+ goto out;
+ }
+ if (config[i].flags & CONF_NOCFG && parser_mode == CONFIG_FILE) {
+ printf("this option can only be used on command line:\n");
+ ret = ERR_NOT_AN_OPTION;
+ goto out;
+ }
+ if (config[i].flags & CONF_NOCMD && parser_mode == COMMAND_LINE) {
+ printf("this option can only be used in config file:\n");
+ ret = ERR_NOT_AN_OPTION;
+ goto out;
+ }
switch (config[i].type) {
case CONF_TYPE_FLAG:
@@ -87,78 +95,113 @@ static int read_option(char *opt, char *param)
!strcasecmp(param, "n") ||
!strcmp(param, "0"))
*((int *) config[i].p) = config[i].min;
- else
- return ERR_OUT_OF_RANGE;
- need_param = 1;
+ else {
+ printf("invalid parameter for flag:\n");
+ ret = ERR_OUT_OF_RANGE;
+ goto out;
+ }
+ ret = 1;
} else { /* parser_mode == COMMAND_LINE */
*((int *) config[i].p) = config[i].max;
- need_param = 0;
+ ret = 0;
}
break;
case CONF_TYPE_INT:
if (param == NULL)
- return ERR_MISSING_PARAM;
- if (!isdigit(*param))
- return ERR_MISSING_PARAM;
+ goto err_missing_param;
+ if (!isdigit(*param)) {
+ printf("parameter must be an integer:\n");
+ ret = ERR_OUT_OF_RANGE;
+ goto out;
+ }
tmp_int = atoi(param);
if (config[i].flags & CONF_MIN)
- if (tmp_int < config[i].min)
- return ERR_OUT_OF_RANGE;
+ if (tmp_int < config[i].min) {
+ printf("parameter must be >= %d:\n", (int) config[i].min);
+ ret = ERR_OUT_OF_RANGE;
+ goto out;
+ }
if (config[i].flags & CONF_MAX)
- if (tmp_int > config[i].max)
- return ERR_OUT_OF_RANGE;
+ if (tmp_int > config[i].max) {
+ printf("parameter must be <= %d:\n", (int) config[i].max);
+ ret = ERR_OUT_OF_RANGE;
+ goto out;
+ }
*((int *) config[i].p) = tmp_int;
- need_param = 1;
+ ret = 1;
break;
case CONF_TYPE_FLOAT:
if (param == NULL)
- return ERR_MISSING_PARAM;
- if (!isdigit(*param))
- return ERR_MISSING_PARAM;
+ goto err_missing_param;
+ if (!isdigit(*param)) {
+ printf("parameter must be a floating point number:\n");
+ ret = ERR_MISSING_PARAM;
+ goto out;
+ }
tmp_float = atof(param);
if (config[i].flags & CONF_MIN)
- if (tmp_float < config[i].min)
- return ERR_OUT_OF_RANGE;
+ if (tmp_float < config[i].min) {
+ printf("parameter must be >= %f:\n", config[i].min);
+ ret = ERR_OUT_OF_RANGE;
+ goto out;
+ }
if (config[i].flags & CONF_MAX)
- if (tmp_float > config[i].max)
- return ERR_OUT_OF_RANGE;
+ if (tmp_float > config[i].max) {
+ printf("parameter must be <= %f:\n", config[i].max);
+ ret = ERR_OUT_OF_RANGE;
+ goto out;
+ }
*((float *) config[i].p) = tmp_float;
- need_param = 1;
+ ret = 1;
break;
case CONF_TYPE_STRING:
if (param == NULL)
- return ERR_MISSING_PARAM;
+ goto err_missing_param;
if (config[i].flags & CONF_MIN)
- if (strlen(param) < config[i].min)
- return ERR_OUT_OF_RANGE;
+ if (strlen(param) < config[i].min) {
+ printf("parameter must be >= %d chars:\n",
+ (int) config[i].min);
+ ret = ERR_OUT_OF_RANGE;
+ goto out;
+ }
if (config[i].flags & CONF_MAX)
- if (strlen(param) > config[i].max)
- return ERR_OUT_OF_RANGE;
+ if (strlen(param) > config[i].max) {
+ printf("parameter must be <= %d chars:\n",
+ (int) config[i].max);
+ ret = ERR_OUT_OF_RANGE;
+ goto out;
+ }
*((char **) config[i].p) = strdup(param);
- need_param = 1;
+ ret = 1;
break;
case CONF_TYPE_FUNC_PARAM:
if (param == NULL)
- return ERR_MISSING_PARAM;
- if ((((cfg_func_param_t) config[i].p)(config + i, param)) < 0)
- return ERR_FUNC_ERR;
- need_param = 1;
+ goto err_missing_param;
+ if ((((cfg_func_param_t) config[i].p)(config + i, param)) < 0) {
+ printf("parser function returned error:\n");
+ ret = ERR_FUNC_ERR;
+ goto out;
+ }
+ ret = 1;
break;
case CONF_TYPE_FUNC:
- if ((((cfg_func_t) config[i].p)(config + i)) < 0)
- return ERR_FUNC_ERR;
- need_param = 0;
+ if ((((cfg_func_t) config[i].p)(config + i)) < 0) {
+ printf("parser function returned error:\n");
+ ret = ERR_FUNC_ERR;
+ goto out;
+ }
+ ret = 0;
break;
case CONF_TYPE_PRINT:
printf("%s", (char *) config[i].p);
@@ -167,7 +210,12 @@ static int read_option(char *opt, char *param)
printf("picsaba\n");
break;
}
- return need_param;
+out:
+ return ret;
+err_missing_param:
+ printf("missing parameter:\n");
+ ret = ERR_MISSING_PARAM;
+ goto out;
}
int parse_config_file(struct config *conf, char *conffile)
@@ -257,8 +305,8 @@ int parse_config_file(struct config *conf, char *conffile)
++line_pos;
/* read the parameter */
- for (param_pos = 0; isprint(line[line_pos]) && !isspace(line[line_pos]);
- /* NOTHING */) {
+ for (param_pos = 0; isprint(line[line_pos]) && !isspace(line[line_pos])
+ && line[line_pos] != '#'; /* NOTHING */) {
param[param_pos++] = line[line_pos++];
if (param_pos >= MAX_PARAM_LEN) {
PRINT_LINENUM;
@@ -295,26 +343,11 @@ int parse_config_file(struct config *conf, char *conffile)
tmp = read_option(opt, param);
switch (tmp) {
case ERR_NOT_AN_OPTION:
- PRINT_LINENUM;
- printf("invalid option: %s\n", opt);
- ret = -1;
- continue;
- /* break; */
case ERR_MISSING_PARAM:
- PRINT_LINENUM;
- printf("missing parameter: %s\n", opt);
- ret = -1;
- continue;
- /* break; */
case ERR_OUT_OF_RANGE:
- PRINT_LINENUM;
- printf("parameter of %s out of range\n", opt);
- ret = -1;
- continue;
- /* break; */
case ERR_FUNC_ERR:
PRINT_LINENUM;
- printf("parser function returned error: %s\n", opt);
+ printf("%s\n", opt);
ret = -1;
continue;
/* break */
@@ -349,17 +382,6 @@ int parse_command_line(struct config *conf, int argc, char **argv, char **envp,
/* remove trailing '-' */
opt++;
-#if 0
- /* check for --help, -h, and --version */
- if (!strcasecmp(opt, "-help") || !strcasecmp(opt, "h")) {
- printf("%s%s", banner_text, help_text);
- continue;
- }
- if (!strcasecmp(opt, "-version")) {
- printf("%s", banner_text);
- continue;
- }
-#endif
tmp = read_option(opt, argv[i + 1]);
@@ -369,8 +391,7 @@ not_an_option:
/* opt is not an option -> treat it as a filename */
if (found_filename) {
/* we already have a filename */
- printf("parse_command_line: invalid option: %s\n", argv[i]);
- return -1;
+ goto err_out;
} else {
found_filename = 1;
*filename = argv[i];
@@ -379,20 +400,16 @@ not_an_option:
}
break;
case ERR_MISSING_PARAM:
- printf("parse_command_line: missing parameter: %s\n", argv[i]);
- return -1;
- /* break; */
case ERR_OUT_OF_RANGE:
- printf("parse_command_line: parameter of '%s' is out of range\n", argv[i]);
- return -1;
- /* break; */
case ERR_FUNC_ERR:
- printf("parse_command_line: parser function returned error: %s\n", argv[i]);
- return -1;
+ goto err_out;
/* break; */
}
i += tmp; /* we already processed the params (if there was any) */
- }
+ }
return found_filename;
+err_out:
+ printf("parse_command_line: %s\n", argv[i]);
+ return -1;
}