For better reading and easy understanding.
Signed-off-by: Takashi Sakamoto o-takashi@sakamocchi.jp --- amixer/amixer.c | 28 ++++++++++++++++++---------- 1 file changed, 18 insertions(+), 10 deletions(-)
diff --git a/amixer/amixer.c b/amixer/amixer.c index 65ebf20..aec8d01 100644 --- a/amixer/amixer.c +++ b/amixer/amixer.c @@ -1271,14 +1271,18 @@ static int get_enum_item_index(snd_mixer_elem_t *elem, char **ptrp) if (snd_mixer_selem_get_enum_item_name(elem, i, sizeof(name)-1, name) < 0) continue;
+ /* Check given strings itself. */ len = strlen(name); - if (! strncmp(name, ptr, len)) { - if (! ptr[len] || ptr[len] == ',' || ptr[len] == '\n') { - ptr += len; - *ptrp = ptr; - return i; - } - } + if (strncmp(name, ptr, len) != 0) + continue; + + /* Lack of separators between channels. */ + if (ptr[len] != '\0' && ptr[len] != ',' && ptr[len] != '\n') + continue; + + /* OK. The string is exactly one of items. */ + *ptrp = ptr + len; + return i; } return -1; } @@ -1294,9 +1298,9 @@ static int sset_enum(snd_mixer_elem_t *elem, unsigned int argc, char **argv) for (idx = 1; idx < argc; idx++) { ptr = argv[idx]; chn = 0; - while (*ptr) { + while (ptr[0] != '\0') { /* Skip separators between the value of each channel. */ - while (*ptr == ',' || isspace(*ptr)) { + while (ptr[0] == ',' || isspace(ptr[0])) { ptr++; chn++; } @@ -1304,8 +1308,12 @@ static int sset_enum(snd_mixer_elem_t *elem, unsigned int argc, char **argv) /* Get index for given argument as enumerated item. */ ival = get_enum_item_index(elem, &ptr); if (ival < 0) - return check_flag; + break;
+ /* + * Stand success flag when at least one channel is + * changed. + */ if (snd_mixer_selem_set_enum_item(elem, chn, ival) >= 0) check_flag = 1; }