mirror of
https://github.com/alsa-project/alsa-lib.git
synced 2025-11-05 13:30:00 -05:00
Added missing diagnostics
This commit is contained in:
parent
c12c08be8f
commit
f7d7bd0f8f
1 changed files with 63 additions and 14 deletions
|
|
@ -24,6 +24,7 @@
|
||||||
#include <stdarg.h>
|
#include <stdarg.h>
|
||||||
#include <sys/stat.h>
|
#include <sys/stat.h>
|
||||||
#include "asoundlib.h"
|
#include "asoundlib.h"
|
||||||
|
#include "local.h"
|
||||||
#include "list.h"
|
#include "list.h"
|
||||||
|
|
||||||
#define SYS_ASOUNDRC "/etc/asound.conf"
|
#define SYS_ASOUNDRC "/etc/asound.conf"
|
||||||
|
|
@ -105,8 +106,10 @@ static int get_char_skip_comments(input_t *input)
|
||||||
if (err < 0)
|
if (err < 0)
|
||||||
return err;
|
return err;
|
||||||
fp = fopen(file, "r");
|
fp = fopen(file, "r");
|
||||||
if (!fp)
|
if (!fp) {
|
||||||
|
SYSERR("fopen %s", file);
|
||||||
return -errno;
|
return -errno;
|
||||||
|
}
|
||||||
fd = malloc(sizeof(*fd));
|
fd = malloc(sizeof(*fd));
|
||||||
fd->name = file;
|
fd->name = file;
|
||||||
fd->fp = fp;
|
fd->fp = fp;
|
||||||
|
|
@ -253,12 +256,12 @@ static int get_delimstring(char **string, int delim, input_t *input)
|
||||||
switch (c) {
|
switch (c) {
|
||||||
case EOF:
|
case EOF:
|
||||||
input->error = UNTERMINATED_STRING;
|
input->error = UNTERMINATED_STRING;
|
||||||
return -1;
|
return -EINVAL;
|
||||||
case '\\':
|
case '\\':
|
||||||
c = get_quotedchar(input);
|
c = get_quotedchar(input);
|
||||||
if (c < 0) {
|
if (c < 0) {
|
||||||
input->error = UNTERMINATED_QUOTE;
|
input->error = UNTERMINATED_QUOTE;
|
||||||
return -1;
|
return -EINVAL;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
|
|
@ -292,7 +295,7 @@ static int get_string(char **string, int id, input_t *input)
|
||||||
switch (c) {
|
switch (c) {
|
||||||
case EOF:
|
case EOF:
|
||||||
input->error = UNEXPECTED_EOF;
|
input->error = UNEXPECTED_EOF;
|
||||||
return -1;
|
return -EINVAL;
|
||||||
case '=':
|
case '=':
|
||||||
#if 0
|
#if 0
|
||||||
/* I'm not sure to want unnamed fields */
|
/* I'm not sure to want unnamed fields */
|
||||||
|
|
@ -305,7 +308,7 @@ static int get_string(char **string, int id, input_t *input)
|
||||||
case ',':
|
case ',':
|
||||||
case ';':
|
case ';':
|
||||||
input->error = UNEXPECTED_CHAR;
|
input->error = UNEXPECTED_CHAR;
|
||||||
return -1;
|
return -EINVAL;
|
||||||
case '\'':
|
case '\'':
|
||||||
case '"':
|
case '"':
|
||||||
err = get_delimstring(string, c, input);
|
err = get_delimstring(string, c, input);
|
||||||
|
|
@ -411,8 +414,10 @@ static int parse_def(snd_config_t *father, input_t *input)
|
||||||
break;
|
break;
|
||||||
if (_snd_config_search(father, id, -1, &n) == 0) {
|
if (_snd_config_search(father, id, -1, &n) == 0) {
|
||||||
if (mode != REMOVE) {
|
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;
|
return -EINVAL;
|
||||||
|
}
|
||||||
n->u.compound.join = 1;
|
n->u.compound.join = 1;
|
||||||
father = n;
|
father = n;
|
||||||
free(id);
|
free(id);
|
||||||
|
|
@ -421,6 +426,7 @@ static int parse_def(snd_config_t *father, input_t *input)
|
||||||
snd_config_delete(n);
|
snd_config_delete(n);
|
||||||
}
|
}
|
||||||
if (mode == NOCREATE) {
|
if (mode == NOCREATE) {
|
||||||
|
ERR("%s does not exists", id);
|
||||||
free(id);
|
free(id);
|
||||||
return -ENOENT;
|
return -ENOENT;
|
||||||
}
|
}
|
||||||
|
|
@ -442,6 +448,7 @@ static int parse_def(snd_config_t *father, input_t *input)
|
||||||
} else {
|
} else {
|
||||||
n = NULL;
|
n = NULL;
|
||||||
if (mode == NOCREATE) {
|
if (mode == NOCREATE) {
|
||||||
|
ERR("%s does not exists", id);
|
||||||
free(id);
|
free(id);
|
||||||
return -ENOENT;
|
return -ENOENT;
|
||||||
}
|
}
|
||||||
|
|
@ -450,8 +457,10 @@ static int parse_def(snd_config_t *father, input_t *input)
|
||||||
case '{':
|
case '{':
|
||||||
{
|
{
|
||||||
if (n) {
|
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;
|
return -EINVAL;
|
||||||
|
}
|
||||||
} else {
|
} else {
|
||||||
err = _snd_config_make_add(&n, id, SND_CONFIG_TYPE_COMPOUND, father);
|
err = _snd_config_make_add(&n, id, SND_CONFIG_TYPE_COMPOUND, father);
|
||||||
if (err < 0)
|
if (err < 0)
|
||||||
|
|
@ -465,8 +474,8 @@ static int parse_def(snd_config_t *father, input_t *input)
|
||||||
c = get_nonwhite(input);
|
c = get_nonwhite(input);
|
||||||
if (c != '}') {
|
if (c != '}') {
|
||||||
snd_config_delete(n);
|
snd_config_delete(n);
|
||||||
input->error = UNEXPECTED_CHAR;
|
input->error = (c == EOF ? UNEXPECTED_EOF : UNEXPECTED_CHAR);
|
||||||
return -1;
|
return -EINVAL;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
@ -489,8 +498,10 @@ static int parse_def(snd_config_t *father, input_t *input)
|
||||||
if (errno == 0) {
|
if (errno == 0) {
|
||||||
free(s);
|
free(s);
|
||||||
if (n) {
|
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;
|
return -EINVAL;
|
||||||
|
}
|
||||||
} else {
|
} else {
|
||||||
err = _snd_config_make_add(&n, id, SND_CONFIG_TYPE_REAL, father);
|
err = _snd_config_make_add(&n, id, SND_CONFIG_TYPE_REAL, father);
|
||||||
if (err < 0)
|
if (err < 0)
|
||||||
|
|
@ -502,8 +513,10 @@ static int parse_def(snd_config_t *father, input_t *input)
|
||||||
} else if (*ptr == '\0') {
|
} else if (*ptr == '\0') {
|
||||||
free(s);
|
free(s);
|
||||||
if (n) {
|
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;
|
return -EINVAL;
|
||||||
|
}
|
||||||
} else {
|
} else {
|
||||||
err = _snd_config_make_add(&n, id, SND_CONFIG_TYPE_INTEGER, father);
|
err = _snd_config_make_add(&n, id, SND_CONFIG_TYPE_INTEGER, father);
|
||||||
if (err < 0)
|
if (err < 0)
|
||||||
|
|
@ -515,6 +528,7 @@ static int parse_def(snd_config_t *father, input_t *input)
|
||||||
}
|
}
|
||||||
if (n) {
|
if (n) {
|
||||||
if (n->type != SND_CONFIG_TYPE_STRING) {
|
if (n->type != SND_CONFIG_TYPE_STRING) {
|
||||||
|
ERR("%s is not a string", id);
|
||||||
free(s);
|
free(s);
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
}
|
}
|
||||||
|
|
@ -576,16 +590,51 @@ int snd_config_load(snd_config_t *config, FILE *fp)
|
||||||
fd->next = NULL;
|
fd->next = NULL;
|
||||||
input.current = fd;
|
input.current = fd;
|
||||||
input.unget = 0;
|
input.unget = 0;
|
||||||
|
input.error = 0;
|
||||||
err = parse_defs(config, &input);
|
err = parse_defs(config, &input);
|
||||||
|
fd = input.current;
|
||||||
if (err < 0) {
|
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);
|
snd_config_delete(config);
|
||||||
return err;
|
goto _end;
|
||||||
}
|
}
|
||||||
if (get_char(&input) != EOF) {
|
if (get_char(&input) != EOF) {
|
||||||
|
ERR("%s:%d:%d:Unexpected }", fd->name ? fd->name : "",
|
||||||
|
fd->line, fd->column);
|
||||||
snd_config_delete(config);
|
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)
|
int snd_config_add(snd_config_t *father, snd_config_t *leaf)
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue