| 224 | } |
| 225 | |
| 226 | static int conf_set_sym_val(struct symbol *sym, int def, int def_flags, char *p) |
| 227 | { |
| 228 | char *p2; |
| 229 | |
| 230 | switch (sym->type) { |
| 231 | case S_TRISTATE: |
| 232 | if (p[0] == 'm') { |
| 233 | sym->def[def].tri = mod; |
| 234 | sym->flags |= def_flags; |
| 235 | break; |
| 236 | } |
| 237 | /* fall through */ |
| 238 | case S_BOOLEAN: |
| 239 | if (p[0] == 'y') { |
| 240 | sym->def[def].tri = yes; |
| 241 | sym->flags |= def_flags; |
| 242 | break; |
| 243 | } |
| 244 | if (p[0] == 'n') { |
| 245 | sym->def[def].tri = no; |
| 246 | sym->flags |= def_flags; |
| 247 | break; |
| 248 | } |
| 249 | if (def != S_DEF_AUTO) |
| 250 | conf_warning("symbol value '%s' invalid for %s", |
| 251 | p, sym->name); |
| 252 | return 1; |
| 253 | case S_STRING: |
| 254 | /* No escaping for S_DEF_AUTO (include/config/auto.conf) */ |
| 255 | if (def != S_DEF_AUTO) { |
| 256 | if (*p++ != '"') |
| 257 | break; |
| 258 | for (p2 = p; (p2 = strpbrk(p2, "\"\\")); p2++) { |
| 259 | if (*p2 == '"') { |
| 260 | *p2 = 0; |
| 261 | break; |
| 262 | } |
| 263 | memmove(p2, p2 + 1, strlen(p2)); |
| 264 | } |
| 265 | if (!p2) { |
| 266 | conf_warning("invalid string found"); |
| 267 | return 1; |
| 268 | } |
| 269 | } |
| 270 | /* fall through */ |
| 271 | case S_INT: |
| 272 | case S_HEX: |
| 273 | if (sym_string_valid(sym, p)) { |
| 274 | sym->def[def].val = xstrdup(p); |
| 275 | sym->flags |= def_flags; |
| 276 | } else { |
| 277 | if (def != S_DEF_AUTO) |
| 278 | conf_warning("symbol value '%s' invalid for %s", |
| 279 | p, sym->name); |
| 280 | return 1; |
| 281 | } |
| 282 | break; |
| 283 | default: |
no test coverage detected