Read symbols with config file handler

Also, make config file error handler able to cope with recursion.
This commit is contained in:
Pasi Kallinen
2017-09-17 10:15:04 +03:00
parent 2db7e20116
commit 11863dd5e9

View File

@@ -198,6 +198,7 @@ boolean FDECL(proc_wizkit_line, (char *));
boolean FDECL(parse_config_line, (char *));
STATIC_DCL boolean FDECL(parse_conf_file, (FILE *, boolean (*proc)(char *)));
STATIC_DCL FILE *NDECL(fopen_sym_file);
boolean FDECL(proc_symset_line, (char *));
STATIC_DCL void FDECL(set_symhandling, (char *, int));
#ifdef NOCWD_ASSUMPTIONS
STATIC_DCL void FDECL(adjust_prefix, (char *, int));
@@ -2706,13 +2707,18 @@ const char *filename;
}
#endif /* USER_SOUNDS */
static int config_err_line_num = 0;
static int config_err_num_errors = 0;
static boolean config_err_origline_shown = FALSE;
static boolean config_err_fromfile = FALSE;
static boolean config_err_secure = FALSE;
static char config_err_origline[4 * BUFSZ];
static char config_err_source[BUFSZ];
struct _config_error_frame {
int line_num;
int num_errors;
boolean origline_shown;
boolean fromfile;
boolean secure;
char origline[4 * BUFSZ];
char source[BUFSZ];
struct _config_error_frame *next;
};
struct _config_error_frame *config_error_data = (struct _config_error_frame *)0;
void
config_error_init(from_file, sourcename, secure)
@@ -2720,31 +2726,41 @@ boolean from_file;
const char *sourcename;
boolean secure;
{
config_err_line_num = 0;
config_err_num_errors = 0;
config_err_origline_shown = FALSE;
config_err_fromfile = from_file;
config_err_secure = secure;
config_err_origline[0] = '\0';
struct _config_error_frame *tmp = (struct _config_error_frame *)
alloc(sizeof(struct _config_error_frame));
tmp->line_num = 0;
tmp->num_errors = 0;
tmp->origline_shown = FALSE;
tmp->fromfile = from_file;
tmp->secure = secure;
tmp->origline[0] = '\0';
if (sourcename && sourcename[0])
Strcpy(config_err_source, sourcename);
Strcpy(tmp->source, sourcename);
else
config_err_source[0] = '\0';
tmp->source[0] = '\0';
tmp->next = config_error_data;
config_error_data = tmp;
}
STATIC_OVL boolean
config_error_nextline(line)
const char *line;
{
if (config_err_num_errors && config_err_secure)
if (!config_error_data)
return FALSE;
config_err_line_num++;
config_err_origline_shown = FALSE;
if (config_error_data->num_errors
&& config_error_data->secure)
return FALSE;
config_error_data->line_num++;
config_error_data->origline_shown = FALSE;
if (line && line[0])
Strcpy(config_err_origline, line);
Strcpy(config_error_data->origline, line);
else
config_err_origline[0] = '\0';
config_error_data->origline[0] = '\0';
return TRUE;
}
@@ -2761,17 +2777,22 @@ VA_DECL(const char *, str)
Vsprintf(buf, str, VA_ARGS);
config_err_num_errors++;
if (!config_err_origline_shown && !config_err_secure) {
pline("\n%s", config_err_origline);
config_err_origline_shown = TRUE;
if (!config_error_data)
return;
config_error_data->num_errors++;
if (!config_error_data->origline_shown
&& !config_error_data->secure) {
pline("\n%s", config_error_data->origline);
config_error_data->origline_shown = TRUE;
}
if (config_err_line_num > 0 && !config_err_secure) {
Sprintf(lineno, "Line %i: ", config_err_line_num);
if (config_error_data->line_num > 0
&& !config_error_data->secure) {
Sprintf(lineno, "Line %i: ", config_error_data->line_num);
} else
lineno[0] = '\0';
pline("%s %s%s.",
config_err_secure ? "Error:" : " *",
config_error_data->secure ? "Error:" : " *",
lineno,
*buf ? buf : "Unknown error");
@@ -2781,14 +2802,24 @@ VA_DECL(const char *, str)
int
config_error_done()
{
int n = config_err_num_errors;
int n;
struct _config_error_frame *tmp = config_error_data;
if (!config_error_data)
return 0;
n = config_error_data->num_errors;
if (n) {
pline("\n%i error%s in %s.\n", n,
(n > 1) ? "s" : "",
*config_err_source ? config_err_source : configfile);
*config_error_data->source
? config_error_data->source : configfile);
wait_synch();
}
config_error_init(FALSE, "", FALSE);
config_error_data = tmp->next;
free(tmp);
return n;
}
@@ -3088,6 +3119,7 @@ extern const char *known_handling[]; /* drawing.c */
extern const char *known_restrictions[]; /* drawing.c */
static int symset_count = 0; /* for pick-list building only */
static boolean chosen_symset_start = FALSE, chosen_symset_end = FALSE;
static int symset_which_set = 0;
STATIC_OVL
FILE *
@@ -3107,7 +3139,6 @@ int
read_sym_file(which_set)
int which_set;
{
char buf[4 * BUFSZ];
FILE *fp;
if (!(fp = fopen_sym_file()))
@@ -3115,13 +3146,13 @@ int which_set;
symset_count = 0;
chosen_symset_start = chosen_symset_end = FALSE;
while (fgets(buf, 4 * BUFSZ, fp)) {
if (!parse_sym_line(buf, which_set)) {
raw_printf("Bad symbol line: \"%.50s\"", buf);
wait_synch();
}
}
symset_which_set = which_set;
config_error_init(TRUE, "symbols", FALSE);
parse_conf_file(fp, proc_symset_line);
(void) fclose(fp);
if (!chosen_symset_start && !chosen_symset_end) {
/* name caller put in symset[which_set].name was not found;
if it looks like "Default symbols", null it out and return
@@ -3131,17 +3162,26 @@ int which_set;
" -_", TRUE)
|| !strcmpi(symset[which_set].name, "default")))
clear_symsetentry(which_set, TRUE);
config_error_done();
return (symset[which_set].name == 0) ? 1 : 0;
}
if (!chosen_symset_end) {
raw_printf("Missing finish for symset \"%s\"",
if (!chosen_symset_end)
config_error_add("Missing finish for symset \"%s\"",
symset[which_set].name ? symset[which_set].name
: "unknown");
wait_synch();
}
config_error_done();
return 1;
}
boolean
proc_symset_line(buf)
char *buf;
{
return !((boolean) parse_sym_line(buf, symset_which_set));
}
/* returns 0 on error */
int
parse_sym_line(buf, which_set)
@@ -3155,8 +3195,7 @@ int which_set;
/* convert each instance of whitespace (tabs, consecutive spaces)
into a single space; leading and trailing spaces are stripped */
mungspaces(buf);
if (!*buf || *buf == '#' || !strcmp(buf, " "))
return 1;
/* remove trailing comment, if any (this isn't strictly needed for
individual symbols, and it won't matter if "X#comment" without
separating space slips through; for handling or set description,
@@ -3178,6 +3217,7 @@ int which_set;
chosen_symset_start = FALSE;
return 1;
}
config_error_add("No \"finish\"");
return 0;
}
/* skip '=' and space which follows, if any */
@@ -3186,8 +3226,10 @@ int which_set;
++bufp;
symp = match_sym(buf);
if (!symp)
if (!symp) {
config_error_add("Unknown sym keyword");
return 0;
}
if (!symset[which_set].name) {
/* A null symset name indicates that we're just