allow --send-hex data without quotes

Now all non-option arguments are read as data for the -S option,
instead of requiring exactly one argument for -S.

This fixes the bug that when specifying multiple bytes for the -S
option separated with spaces but without quoting, amidi would silently
ignore all but the first byte.
This commit is contained in:
Clemens Ladisch 2005-02-16 09:52:25 +00:00
parent 943bf551e1
commit 5df127e3f3

View file

@ -85,6 +85,16 @@ static void version(void)
fputs("amidi version " SND_UTIL_VERSION_STR "\n", stderr); fputs("amidi version " SND_UTIL_VERSION_STR "\n", stderr);
} }
static void *my_malloc(size_t size)
{
void *p = malloc(size);
if (!p) {
error("out of memory");
exit(EXIT_FAILURE);
}
return p;
}
static void list_device(snd_ctl_t *ctl, int card, int device) static void list_device(snd_ctl_t *ctl, int card, int device)
{ {
snd_rawmidi_info_t *info; snd_rawmidi_info_t *info;
@ -225,11 +235,7 @@ static void load_file(void)
error("cannot determine length of %s: %s", send_file_name, strerror(errno)); error("cannot determine length of %s: %s", send_file_name, strerror(errno));
goto _error; goto _error;
} }
send_data = malloc(length); send_data = my_malloc(length);
if (!send_data) {
error("cannot allocate %d bytes: %s", (int)length, strerror(errno));
goto _error;
}
lseek(fd, 0, SEEK_SET); lseek(fd, 0, SEEK_SET);
if (read(fd, send_data, length) != length) { if (read(fd, send_data, length) != length) {
error("cannot read from %s: %s", send_file_name, strerror(errno)); error("cannot read from %s: %s", send_file_name, strerror(errno));
@ -260,7 +266,7 @@ static void parse_data(void)
const char *p; const char *p;
int i, value; int i, value;
send_data = malloc(strlen(send_hex)); /* guesstimate */ send_data = my_malloc(strlen(send_hex)); /* guesstimate */
i = 0; i = 0;
value = -1; /* value is >= 0 when the first hex digit of a byte has been read */ value = -1; /* value is >= 0 when the first hex digit of a byte has been read */
for (p = send_hex; *p; ++p) { for (p = send_hex; *p; ++p) {
@ -370,9 +376,27 @@ static void sig_handler(int dummy)
stop = 1; stop = 1;
} }
void add_send_hex_data(const char *str)
{
int length;
char *s;
length = (send_hex ? strlen(send_hex) : 0) + strlen(str) + 1;
s = my_malloc(length);
if (send_hex) {
strcpy(s, send_hex);
strcat(s, " ");
} else {
s[0] = '\0';
}
strcat(s, str);
free(send_hex);
send_hex = s;
}
int main(int argc, char *argv[]) int main(int argc, char *argv[])
{ {
static char short_options[] = "hVlLp:s:r:S:dt:a"; static char short_options[] = "hVlLp:s:r:S::dt:a";
static struct option long_options[] = { static struct option long_options[] = {
{"help", 0, NULL, 'h'}, {"help", 0, NULL, 'h'},
{"version", 0, NULL, 'V'}, {"version", 0, NULL, 'V'},
@ -381,7 +405,7 @@ int main(int argc, char *argv[])
{"port", 1, NULL, 'p'}, {"port", 1, NULL, 'p'},
{"send", 1, NULL, 's'}, {"send", 1, NULL, 's'},
{"receive", 1, NULL, 'r'}, {"receive", 1, NULL, 'r'},
{"send-hex", 1, NULL, 'S'}, {"send-hex", 2, NULL, 'S'},
{"dump", 0, NULL, 'd'}, {"dump", 0, NULL, 'd'},
{"timeout", 1, NULL, 't'}, {"timeout", 1, NULL, 't'},
{"active-sensing", 0, NULL, 'a'}, {"active-sensing", 0, NULL, 'a'},
@ -389,6 +413,7 @@ int main(int argc, char *argv[])
}; };
int c, err, ok = 0; int c, err, ok = 0;
int ignore_active_sensing = 1; int ignore_active_sensing = 1;
int do_send_hex = 0;
while ((c = getopt_long(argc, argv, short_options, while ((c = getopt_long(argc, argv, short_options,
long_options, NULL)) != -1) { long_options, NULL)) != -1) {
@ -415,7 +440,9 @@ int main(int argc, char *argv[])
receive_file_name = optarg; receive_file_name = optarg;
break; break;
case 'S': case 'S':
send_hex = optarg; do_send_hex = 1;
if (optarg)
add_send_hex_data(optarg);
break; break;
case 'd': case 'd':
dump = 1; dump = 1;
@ -431,6 +458,20 @@ int main(int argc, char *argv[])
return 1; return 1;
} }
} }
if (do_send_hex) {
/* data for -S can be specified as multiple arguments */
if (!send_hex && !argv[optind]) {
error("Please specify some data for --send-hex.");
return 1;
}
for (; argv[optind]; ++optind)
add_send_hex_data(argv[optind]);
} else {
if (argv[optind]) {
error("%s is not an option.", argv[optind]);
return 1;
}
}
if (do_rawmidi_list) if (do_rawmidi_list)
rawmidi_list(); rawmidi_list();
@ -548,7 +589,8 @@ int main(int argc, char *argv[])
fflush(stdout); fflush(stdout);
} }
} }
printf("\n%d bytes read\n", read); if (isatty(fileno(stdout)))
printf("\n%d bytes read\n", read);
} }
ok = 1; ok = 1;