summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorLemonBoy <thatlemon@gmail.com>2022-04-28 15:26:33 +0100
committerBram Moolenaar <Bram@vim.org>2022-04-28 15:26:33 +0100
commitdca1d40cd0f2af0755519e7028378bd3c8fefd31 (patch)
tree3c045bcc898b033399fd9d5fe4ec884ef70c58e2 /src
parent68a573ce2b996602a86b14d9b258ebb8c657604f (diff)
patch 8.2.4838: checking for absolute path is not trivialv8.2.4838
Problem: Checking for absolute path is not trivial. Solution: Add isabsolutepath(). (closes #10303)
Diffstat (limited to 'src')
-rw-r--r--src/evalfunc.c2
-rw-r--r--src/filepath.c12
-rw-r--r--src/proto/filepath.pro1
-rw-r--r--src/testdir/test_functions.vim18
-rw-r--r--src/version.c2
5 files changed, 35 insertions, 0 deletions
diff --git a/src/evalfunc.c b/src/evalfunc.c
index 86a7c0d138..c4abfddc2c 100644
--- a/src/evalfunc.c
+++ b/src/evalfunc.c
@@ -1969,6 +1969,8 @@ static funcentry_T global_functions[] =
ret_void, f_interrupt},
{"invert", 1, 1, FEARG_1, arg1_number,
ret_number, f_invert},
+ {"isabsolutepath", 1, 1, FEARG_1, arg1_string,
+ ret_number_bool, f_isabsolutepath},
{"isdirectory", 1, 1, FEARG_1, arg1_string,
ret_number_bool, f_isdirectory},
{"isinf", 1, 1, FEARG_1, arg1_float_or_nr,
diff --git a/src/filepath.c b/src/filepath.c
index 1bde4200d3..6ee5fad960 100644
--- a/src/filepath.c
+++ b/src/filepath.c
@@ -1417,6 +1417,18 @@ f_isdirectory(typval_T *argvars, typval_T *rettv)
}
/*
+ * "isabsolutepath()" function
+ */
+ void
+f_isabsolutepath(typval_T *argvars, typval_T *rettv)
+{
+ if (in_vim9script() && check_for_string_arg(argvars, 0) == FAIL)
+ return;
+
+ rettv->vval.v_number = mch_isFullName(tv_get_string_strict(&argvars[0]));
+}
+
+/*
* Create the directory in which "dir" is located, and higher levels when
* needed.
* Return OK or FAIL.
diff --git a/src/proto/filepath.pro b/src/proto/filepath.pro
index bf3d5163da..2970e503e5 100644
--- a/src/proto/filepath.pro
+++ b/src/proto/filepath.pro
@@ -22,6 +22,7 @@ void f_glob(typval_T *argvars, typval_T *rettv);
void f_glob2regpat(typval_T *argvars, typval_T *rettv);
void f_globpath(typval_T *argvars, typval_T *rettv);
void f_isdirectory(typval_T *argvars, typval_T *rettv);
+void f_isabsolutepath(typval_T *argvars, typval_T *rettv);
void f_mkdir(typval_T *argvars, typval_T *rettv);
void f_pathshorten(typval_T *argvars, typval_T *rettv);
void f_readdir(typval_T *argvars, typval_T *rettv);
diff --git a/src/testdir/test_functions.vim b/src/testdir/test_functions.vim
index a87ca3b585..dbed757ff3 100644
--- a/src/testdir/test_functions.vim
+++ b/src/testdir/test_functions.vim
@@ -2887,5 +2887,23 @@ func Test_funcref_to_string()
call assert_equal("function('g:Test_funcref_to_string')", string(Fn))
endfunc
+" Test for isabsolutepath()
+func Test_isabsolutepath()
+ call assert_false(isabsolutepath(''))
+ call assert_false(isabsolutepath('.'))
+ call assert_false(isabsolutepath('../Foo'))
+ call assert_false(isabsolutepath('Foo/'))
+ if has('win32')
+ call assert_true(isabsolutepath('A:\'))
+ call assert_true(isabsolutepath('A:\Foo'))
+ call assert_true(isabsolutepath('A:/Foo'))
+ call assert_false(isabsolutepath('A:Foo'))
+ call assert_false(isabsolutepath('\Windows'))
+ call assert_true(isabsolutepath('\\Server2\Share\Test\Foo.txt'))
+ else
+ call assert_true(isabsolutepath('/'))
+ call assert_true(isabsolutepath('/usr/share/'))
+ endif
+endfunc
" vim: shiftwidth=2 sts=2 expandtab
diff --git a/src/version.c b/src/version.c
index 2fa8992d77..1b87213bc2 100644
--- a/src/version.c
+++ b/src/version.c
@@ -747,6 +747,8 @@ static char *(features[]) =
static int included_patches[] =
{ /* Add new patch number below this line */
/**/
+ 4838,
+/**/
4837,
/**/
4836,