Merge pull request #9462 from yuwata/strv_split
make strv_split() accept empty string and use it in pager_open()
This commit is contained in:
commit
99352de644
|
@ -43,6 +43,7 @@ _noreturn_ static void pager_fallback(void) {
|
|||
|
||||
int pager_open(bool no_pager, bool jump_to_end) {
|
||||
_cleanup_close_pair_ int fd[2] = { -1, -1 };
|
||||
_cleanup_strv_free_ char **pager_args = NULL;
|
||||
const char *pager;
|
||||
int r;
|
||||
|
||||
|
@ -62,9 +63,15 @@ int pager_open(bool no_pager, bool jump_to_end) {
|
|||
if (!pager)
|
||||
pager = getenv("PAGER");
|
||||
|
||||
/* If the pager is explicitly turned off, honour it */
|
||||
if (pager && STR_IN_SET(pager, "", "cat"))
|
||||
return 0;
|
||||
if (pager) {
|
||||
pager_args = strv_split(pager, WHITESPACE);
|
||||
if (!pager_args)
|
||||
return -ENOMEM;
|
||||
|
||||
/* If the pager is explicitly turned off, honour it */
|
||||
if (strv_isempty(pager_args) || strv_equal(pager_args, STRV_MAKE("cat")))
|
||||
return 0;
|
||||
}
|
||||
|
||||
/* Determine and cache number of columns/lines before we spawn the pager so that we get the value from the
|
||||
* actual tty */
|
||||
|
@ -104,10 +111,8 @@ int pager_open(bool no_pager, bool jump_to_end) {
|
|||
setenv("LESSCHARSET", less_charset, 1) < 0)
|
||||
_exit(EXIT_FAILURE);
|
||||
|
||||
if (pager) {
|
||||
execlp(pager, pager, NULL);
|
||||
execl("/bin/sh", "sh", "-c", pager, NULL);
|
||||
}
|
||||
if (pager_args)
|
||||
execvp(pager_args[0], pager_args);
|
||||
|
||||
/* Debian's alternatives command for pagers is
|
||||
* called 'pager'. Note that we do not call
|
||||
|
|
|
@ -253,6 +253,10 @@ char **strv_split(const char *s, const char *separator) {
|
|||
|
||||
assert(s);
|
||||
|
||||
s += strspn(s, separator);
|
||||
if (isempty(s))
|
||||
return new0(char*, 1);
|
||||
|
||||
n = 0;
|
||||
FOREACH_WORD_SEPARATOR(word, l, s, separator, state)
|
||||
n++;
|
||||
|
|
|
@ -6785,11 +6785,9 @@ static int run_editor(char **paths) {
|
|||
if (r < 0)
|
||||
return r;
|
||||
if (r == 0) {
|
||||
const char **args;
|
||||
char *editor, **editor_args = NULL;
|
||||
char **tmp_path, **original_path, *p;
|
||||
size_t n_editor_args = 0, i = 1;
|
||||
size_t argc;
|
||||
char **editor_args = NULL, **tmp_path, **original_path, *p;
|
||||
size_t n_editor_args = 0, i = 1, argc;
|
||||
const char **args, *editor;
|
||||
|
||||
argc = strv_length(paths)/2 + 1;
|
||||
|
||||
|
|
|
@ -180,12 +180,31 @@ static void test_strv_split(void) {
|
|||
const char str[] = "one,two,three";
|
||||
|
||||
l = strv_split(str, ",");
|
||||
|
||||
assert_se(l);
|
||||
|
||||
STRV_FOREACH(s, l) {
|
||||
STRV_FOREACH(s, l)
|
||||
assert_se(streq(*s, input_table_multiple[i++]));
|
||||
}
|
||||
|
||||
i = 0;
|
||||
strv_free(l);
|
||||
|
||||
l = strv_split(" one two\t three", WHITESPACE);
|
||||
assert_se(l);
|
||||
STRV_FOREACH(s, l)
|
||||
assert_se(streq(*s, input_table_multiple[i++]));
|
||||
}
|
||||
|
||||
static void test_strv_split_empty(void) {
|
||||
_cleanup_strv_free_ char **l = NULL;
|
||||
|
||||
l = strv_split("", WHITESPACE);
|
||||
assert_se(l);
|
||||
assert_se(strv_isempty(l));
|
||||
|
||||
strv_free(l);
|
||||
l = strv_split(" ", WHITESPACE);
|
||||
assert_se(l);
|
||||
assert_se(strv_isempty(l));
|
||||
|
||||
}
|
||||
|
||||
static void test_strv_split_extract(void) {
|
||||
|
@ -733,6 +752,7 @@ int main(int argc, char *argv[]) {
|
|||
test_invalid_unquote("'x'y'g");
|
||||
|
||||
test_strv_split();
|
||||
test_strv_split_empty();
|
||||
test_strv_split_extract();
|
||||
test_strv_split_newlines();
|
||||
test_strv_split_nulstr();
|
||||
|
|
Loading…
Reference in a new issue