ap

An audio player suited to my tastes
Log | Files | Refs | README | LICENSE

commit 1b152fdd9ee833285c15e3936c968b38c5448302
parent 7fba51670da03030dac6ae4c83671cb4adeb7cc6
Author: Jacob R. Edwards <jacobouno@protonmail.com>
Date:   Tue, 20 Jul 2021 19:31:12 -0700

Add dynamic argument array length

A new argument splitting function asplit does all the work using
split, only minor changes to aps_command were needed.

Diffstat:
Maps/aps.c | 17++++++++++-------
Aaps/asplit.c | 41+++++++++++++++++++++++++++++++++++++++++
Aaps/asplit.h | 1+
Maps/mkfile | 4++--
Minclude/ap/ap.h | 1-
5 files changed, 54 insertions(+), 10 deletions(-)

diff --git a/aps/aps.c b/aps/aps.c @@ -26,11 +26,11 @@ #include "aps.h" #include "arg.h" +#include "asplit.h" #include "command.h" #include "config.h" #include "log.h" #include "queue.h" -#include "split.h" #include "util.h" struct aps * @@ -187,7 +187,7 @@ int aps_command(struct aps *aps, int s) { char *(*com)(struct aps *, int, int, char **); - char *argv[AP_ARGV_MAX]; + char **argv; char *next; char *status; struct buf *buf; @@ -198,11 +198,13 @@ aps_command(struct aps *aps, int s) return 0; buf = aps->clients[s].request; - len = split(argv, LEN(argv), buf->data, AP_ARG_SEPS); - if (len == 0) + argv = asplit(buf->data, AP_ARG_SEPS); + if (argv == NULL) + return 1; + if (*argv == NULL) { + free(argv); return respfinish(aps, s, "No command"); - if (len >= LEN(argv)) - return respfinish(aps, s, strerror(E2BIG)); + } for (com = NULL, i = 0; com == NULL && i < aps->ncoms; ++i) if (strcmp(*argv, aps->coms[i].name) == 0) @@ -211,11 +213,12 @@ aps_command(struct aps *aps, int s) if (com == NULL) status = "Command not found"; else - status = com(aps, s, len - 1, argv + 1); + status = com(aps, s, arglen(argv + 1), argv + 1); len = next - (char *)buf->data; memmove(buf->data, buf->data + len, buf->len - len); buf->len -= len; + free(argv); return respfinish(aps, s, status); } diff --git a/aps/asplit.c b/aps/asplit.c @@ -0,0 +1,41 @@ +/* Copyright 2021 Jacob R. Edwards + * + * ap -- audio player + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see <https://www.gnu.org/licenses/>. + */ + +#include <stdlib.h> +#include <string.h> + +#include "split.h" + +char ** +asplit(char *s, char *sep) +{ + char **args, *copy; + unsigned int len; + + copy = strdup(s); + if (copy == NULL) + return NULL; + len = split(NULL, 0, copy, sep); + free(copy); + + args = calloc(++len, sizeof(*args)); + if (args == NULL) + return NULL; + split(args, len, s, sep); + return args; +} diff --git a/aps/asplit.h b/aps/asplit.h @@ -0,0 +1 @@ +char **asplit(char *, char *); diff --git a/aps/mkfile b/aps/mkfile @@ -1,9 +1,9 @@ # Copyright 2021 Jacob R. Edwards name = aps -src = aps.c arg.c buf.c bug.c command.c find.c item.c log.c main.c match.c player.c queue.c response.c split.c +src = aps.c arg.c asplit.c buf.c bug.c command.c find.c item.c log.c main.c match.c player.c queue.c response.c split.c obj = ${src:%.c=%.o} -hdr = aps.h arg.h buf.h bug.h command.h config.h find.h item.h log.h match.h player.h queue.h response.h split.h util.h +hdr = aps.h arg.h asplit.h buf.h bug.h command.h config.h find.h item.h log.h match.h player.h queue.h response.h split.h util.h lib = ap mk = ../mk diff --git a/include/ap/ap.h b/include/ap/ap.h @@ -1,4 +1,3 @@ -#define AP_ARGV_MAX 128 #define AP_ARG_SEPS "\t" #include "client.h"