#include <stdarg.h>
#include <sys/stat.h>
#include "asoundlib.h"
+#include "local.h"
#include "list.h"
#define SYS_ASOUNDRC "/etc/asound.conf"
if (err < 0)
return err;
fp = fopen(file, "r");
- if (!fp)
+ if (!fp) {
+ SYSERR("fopen %s", file);
return -errno;
+ }
fd = malloc(sizeof(*fd));
fd->name = file;
fd->fp = fp;
switch (c) {
case EOF:
input->error = UNTERMINATED_STRING;
- return -1;
+ return -EINVAL;
case '\\':
c = get_quotedchar(input);
if (c < 0) {
input->error = UNTERMINATED_QUOTE;
- return -1;
+ return -EINVAL;
}
break;
default:
switch (c) {
case EOF:
input->error = UNEXPECTED_EOF;
- return -1;
+ return -EINVAL;
case '=':
#if 0
/* I'm not sure to want unnamed fields */
case ',':
case ';':
input->error = UNEXPECTED_CHAR;
- return -1;
+ return -EINVAL;
case '\'':
case '"':
err = get_delimstring(string, c, input);
break;
if (_snd_config_search(father, id, -1, &n) == 0) {
if (mode != REMOVE) {
- if (n->type != SND_CONFIG_TYPE_COMPOUND)
+ if (n->type != SND_CONFIG_TYPE_COMPOUND) {
+ ERR("%s is not a compound", id);
return -EINVAL;
+ }
n->u.compound.join = 1;
father = n;
free(id);
snd_config_delete(n);
}
if (mode == NOCREATE) {
+ ERR("%s does not exists", id);
free(id);
return -ENOENT;
}
} else {
n = NULL;
if (mode == NOCREATE) {
+ ERR("%s does not exists", id);
free(id);
return -ENOENT;
}
case '{':
{
if (n) {
- if (n->type != SND_CONFIG_TYPE_COMPOUND)
+ if (n->type != SND_CONFIG_TYPE_COMPOUND) {
+ ERR("%s is not a compound", id);
return -EINVAL;
+ }
} else {
err = _snd_config_make_add(&n, id, SND_CONFIG_TYPE_COMPOUND, father);
if (err < 0)
c = get_nonwhite(input);
if (c != '}') {
snd_config_delete(n);
- input->error = UNEXPECTED_CHAR;
- return -1;
+ input->error = (c == EOF ? UNEXPECTED_EOF : UNEXPECTED_CHAR);
+ return -EINVAL;
}
break;
}
if (errno == 0) {
free(s);
if (n) {
- if (n->type != SND_CONFIG_TYPE_REAL)
+ if (n->type != SND_CONFIG_TYPE_REAL) {
+ ERR("%s is not a real", id);
return -EINVAL;
+ }
} else {
err = _snd_config_make_add(&n, id, SND_CONFIG_TYPE_REAL, father);
if (err < 0)
} else if (*ptr == '\0') {
free(s);
if (n) {
- if (n->type != SND_CONFIG_TYPE_INTEGER)
+ if (n->type != SND_CONFIG_TYPE_INTEGER) {
+ ERR("%s is not an integer", id);
return -EINVAL;
+ }
} else {
err = _snd_config_make_add(&n, id, SND_CONFIG_TYPE_INTEGER, father);
if (err < 0)
}
if (n) {
if (n->type != SND_CONFIG_TYPE_STRING) {
+ ERR("%s is not a string", id);
free(s);
return -EINVAL;
}
fd->next = NULL;
input.current = fd;
input.unget = 0;
+ input.error = 0;
err = parse_defs(config, &input);
+ fd = input.current;
if (err < 0) {
+ if (input.error < 0) {
+ char *str;
+ switch (input.error) {
+ case UNTERMINATED_STRING:
+ str = "Unterminated string";
+ break;
+ case UNTERMINATED_QUOTE:
+ str = "Unterminated quote";
+ break;
+ case UNEXPECTED_CHAR:
+ str = "Unexpected char";
+ break;
+ case UNEXPECTED_EOF:
+ str = "Unexpected end of file";
+ break;
+ default:
+ assert(0);
+ break;
+ }
+ ERR("%s:%d:%d:%s", fd->name ? fd->name : "",
+ fd->line, fd->column, str);
+ }
snd_config_delete(config);
- return err;
+ goto _end;
}
if (get_char(&input) != EOF) {
+ ERR("%s:%d:%d:Unexpected }", fd->name ? fd->name : "",
+ fd->line, fd->column);
snd_config_delete(config);
- return -1;
+ err = -EINVAL;
+ goto _end;
}
- return 0;
+ _end:
+ while (fd->next) {
+ fclose(fd->fp);
+ free(fd->name);
+ free(fd);
+ fd = fd->next;
+ }
+ free(fd);
+ return err;
}
int snd_config_add(snd_config_t *father, snd_config_t *leaf)