[vlc-commits] cli: expand words, allow adding multiple items
Rémi Denis-Courmont
git at videolan.org
Sat Oct 17 20:36:06 CEST 2020
vlc | branch: master | Rémi Denis-Courmont <remi at remlab.net> | Sat Oct 17 17:58:45 2020 +0300| [343eb33c9606253136b6df53a2d43db00418a591] | committer: Rémi Denis-Courmont
cli: expand words, allow adding multiple items
> http://git.videolan.org/gitweb.cgi/vlc.git/?a=commit;h=343eb33c9606253136b6df53a2d43db00418a591
---
configure.ac | 2 +-
modules/control/cli/cli.c | 48 +++++++++++++++++++++++++++++------
modules/control/cli/playlist.c | 57 +++++++++++++++++++++++++++++++++++++++---
3 files changed, 95 insertions(+), 12 deletions(-)
diff --git a/configure.ac b/configure.ac
index 4a19fdd999..a09a3ef5b7 100644
--- a/configure.ac
+++ b/configure.ac
@@ -950,7 +950,7 @@ dnl Check for headers
dnl
dnl POSIX
-AC_CHECK_HEADERS([arpa/inet.h poll.h pthread.h search.h sys/shm.h sys/socket.h sys/uio.h])
+AC_CHECK_HEADERS([arpa/inet.h poll.h pthread.h search.h sys/shm.h sys/socket.h sys/uio.h wordexp.h])
AC_CHECK_HEADERS([net/if.h], [], [],
[
#include <sys/types.h>
diff --git a/modules/control/cli/cli.c b/modules/control/cli/cli.c
index ac9caebb8f..8086db514c 100644
--- a/modules/control/cli/cli.c
+++ b/modules/control/cli/cli.c
@@ -34,6 +34,9 @@
#include <math.h>
#include <sys/types.h>
#include <unistd.h>
+#ifdef HAVE_WORDEXP_H
+#include <wordexp.h>
+#endif
#define VLC_MODULE_LICENSE VLC_LICENSE_GPL_2_PLUS
#include <vlc_common.h>
@@ -276,6 +279,26 @@ static void Process(intf_thread_t *intf, const char *line)
if (*cmd == '\0')
return; /* Ignore empty line */
+#ifdef HAVE_WORDEXP_H
+ wordexp_t we;
+ int val = wordexp(cmd, &we, 0);
+
+ if (val != 0)
+ {
+ if (val == WRDE_NOSPACE)
+error: wordfree(&we);
+ msg_print(intf, N_("parse error"));
+ return;
+ }
+
+ size_t count = we.we_wordc;
+ const char **args = vlc_alloc(count, sizeof (*args));
+ if (unlikely(args == NULL))
+ goto error;
+
+ for (size_t i = 0; i < we.we_wordc; i++)
+ args[i] = we.we_wordv[i];
+#else
/* Split psz_cmd at the first space and make sure that
* psz_arg is valid */
const char *args[] = { cmd, NULL };
@@ -290,17 +313,26 @@ static void Process(intf_thread_t *intf, const char *line)
if (*arg)
count++;
}
+#endif
- void (*cb)(intf_thread_t *, const char *const *, size_t) = UnknownCmd;
+ if (count > 0)
+ {
+ void (*cb)(intf_thread_t *, const char *const *, size_t) = UnknownCmd;
- for (size_t i = 0; i < ARRAY_SIZE(cmds); i++)
- if (strcmp(args[0], cmds[i].name) == 0)
- {
- cb = cmds[i].handler;
- break;
- }
+ for (size_t i = 0; i < ARRAY_SIZE(cmds); i++)
+ if (strcmp(args[0], cmds[i].name) == 0)
+ {
+ cb = cmds[i].handler;
+ break;
+ }
- cb(intf, args, count);
+ cb(intf, args, count);
+ }
+
+#ifdef HAVE_WORDEXP_H
+ free(args);
+ wordfree(&we);
+#endif
}
diff --git a/modules/control/cli/playlist.c b/modules/control/cli/playlist.c
index a5685b7e94..f582b4daeb 100644
--- a/modules/control/cli/playlist.c
+++ b/modules/control/cli/playlist.c
@@ -34,6 +34,7 @@
#include "cli.h"
+#ifndef HAVE_WORDEXP_H
/*****************************************************************************
* parse_MRL: build a input item from a full mrl
*****************************************************************************
@@ -137,6 +138,7 @@ static input_item_t *parse_MRL(const char *mrl)
return p_item;
}
+#endif
static void print_playlist(intf_thread_t *p_intf, vlc_playlist_t *playlist)
{
@@ -388,9 +390,59 @@ static void PlaylistAddCommon(intf_thread_t *intf, const char *const *args,
size_t n_args, bool play)
{
vlc_playlist_t *playlist = intf->p_sys->playlist;
- const char *arg = n_args > 1 ? args[1] : "";
+ size_t count;
vlc_playlist_Lock(playlist);
+ count = vlc_playlist_Count(playlist);
+#ifdef HAVE_WORDEXP_H
+
+ for (size_t i = 1; i < n_args;)
+ {
+ input_item_t *item;
+
+ if (strstr(args[i], "://" ) != NULL)
+ item = input_item_New(args[i], NULL);
+ else
+ {
+ char *url = vlc_path2uri(args[i], NULL);
+
+ if (url != NULL)
+ {
+ item = input_item_New(url, NULL);
+ free(url);
+ }
+ else
+ item = NULL;
+ }
+
+ i++;
+
+ /* Check if following argument(s) are input item options prefixed with
+ * a colon.
+ */
+ while (i < n_args && args[i][0] == ':')
+ {
+ if (likely(item != NULL))
+ input_item_AddOption(item, args[i] + 1,
+ VLC_INPUT_OPTION_TRUSTED);
+ i++;
+ }
+
+ if (unlikely(item == NULL))
+ continue;
+
+ if (vlc_playlist_InsertOne(playlist, count, item) == VLC_SUCCESS)
+ {
+ if (play)
+ vlc_playlist_PlayAt(playlist, count);
+
+ count++;
+ }
+
+ input_item_Release(item);
+ }
+#else
+ const char *arg = n_args > 1 ? args[1] : "";
input_item_t *item = parse_MRL( arg );
@@ -399,14 +451,13 @@ static void PlaylistAddCommon(intf_thread_t *intf, const char *const *args,
msg_print(intf, "Trying to %s %s to playlist.",
play ? "add" : "enqueue", arg);
- size_t count = vlc_playlist_Count(playlist);
if (vlc_playlist_InsertOne(playlist, count, item) == VLC_SUCCESS
&& play)
vlc_playlist_PlayAt(playlist, count);
input_item_Release(item);
}
-
+#endif
vlc_playlist_Unlock(playlist);
}
More information about the vlc-commits
mailing list