return hash;
}
-/*
- * Convert letter from upper case to lower case
- */
-static inline void upper2lower(char *str)
-{
- char *ptr = str;
-
- while (*ptr)
- *ptr++ = tolower(*ptr);
-}
-
-
/*
* Insert a tag-value combination from LINE (the equal sign is at POS)
*/
/* Lines starting with '#' or ';' are comments. */
ln++;
- if (*line == '#' || *line == ';')
- return;
-
/* Ignore blank lines */
if (*line == '\0')
return;
while (isblank(*line))
line++;
+ if (*line == '#' || *line == ';')
+ return;
+
/* '[section]' parsing... */
if (*line == '[') {
line++;
if (section)
free(section);
if (i == sz) {
- xlog_warn("conf_parse_line: %d:"
+ xlog_warn("config file error: line %d: "
"non-matched ']', ignoring until next section", ln);
section = 0;
return;
while (*ptr && *ptr != '"')
ptr++;
if (*ptr == '\0') {
- xlog_warn("conf_parse_line: line %d:"
+ xlog_warn("config file error: line %d: "
"non-matched '\"', ignoring until next section", ln);
} else {
*ptr = '\0';
if (line[i] == '=') {
/* If no section, we are ignoring the lines. */
if (!section) {
- xlog_warn("conf_parse_line: %d: ignoring line due to no section",
- ln);
+ xlog_warn("config file error: line %d: "
+ "ignoring line due to no section", ln);
return;
}
line[strcspn (line, " \t=")] = '\0';
val = line + i + 1 + strspn (line + i + 1, " \t");
+
+ /* Skip trailing comments, if any */
+ for (j = 0; j < sz - (val - line); j++) {
+ if (val[j] == '#' || val[j] == ';') {
+ val[j] = '\0';
+ break;
+ }
+ }
+
/* Skip trailing whitespace, if any */
- for (j = sz - (val - line) - 1; j > 0 && isspace(val[j]); j--)
- val[j] = '\0';
+ for (j--; j > 0; j--) {
+ if (isspace(val[j]))
+ val[j] = '\0';
+ else
+ break;
+ }
+
/* XXX Perhaps should we not ignore errors? */
conf_set(trans, section, arg, line, val, 0, 0);
return;
/* Other non-empty lines are weird. */
i = strspn(line, " \t");
if (line[i])
- xlog_warn("conf_parse_line: %d: syntax error", ln);
+ xlog_warn("config file error: line %d:", ln);
return;
}