summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorChrist van Willegen <cvwillegen@gmail.com>2024-07-11 21:36:21 +0200
committerChristian Brabandt <cb@256bit.org>2024-07-11 21:36:21 +0200
commit8252ef134f5a57e8a07b66ce79068c262a6386d8 (patch)
treee728dbaafe1836691e2696a870070555a1d46046
parent965091001fc131192f0bca49917ed6567cf8f060 (diff)
patch 9.1.0560: bindtextdomain() does not indicate an errorv9.1.0560
Problem: bindtextdomain() does not indicate an error (after v9.1.509) Solution: return false on failure (OOM). (Chris van Willegen) closes: #15116 Signed-off-by: Christ van Willegen <cvwillegen@gmail.com> Signed-off-by: Christian Brabandt <cb@256bit.org>
-rw-r--r--runtime/doc/builtin.txt7
-rw-r--r--src/evalfunc.c15
-rw-r--r--src/testdir/test_gettext.vim2
-rw-r--r--src/testdir/test_gettext_cp1251.vim32
-rw-r--r--src/testdir/test_gettext_utf8.vim32
-rw-r--r--src/version.c2
-rw-r--r--src/vim.h2
7 files changed, 64 insertions, 28 deletions
diff --git a/runtime/doc/builtin.txt b/runtime/doc/builtin.txt
index f3baf2470a..96d774e7e9 100644
--- a/runtime/doc/builtin.txt
+++ b/runtime/doc/builtin.txt
@@ -68,7 +68,7 @@ balloon_gettext() String current text in the balloon
balloon_show({expr}) none show {expr} inside the balloon
balloon_split({msg}) List split {msg} as used for a balloon
bindtextdomain({package}, {path})
- none bind text domain to specied path
+ Bool bind text domain to specified path
blob2list({blob}) List convert {blob} into a list of numbers
browse({save}, {title}, {initdir}, {default})
String put up a file requester
@@ -1228,7 +1228,10 @@ bindtextdomain({package}, {path}) *bindtextdomain()*
translations for a package. {path} is the directory name
for the translations. See |package-translation|.
- Return type: none
+ Returns v:true on success and v:false on failure (out of
+ memory).
+
+ Return type: |vim9-boolean|
blob2list({blob}) *blob2list()*
Return a List containing the number value of each byte in Blob
diff --git a/src/evalfunc.c b/src/evalfunc.c
index 370b26bd89..7e3241037a 100644
--- a/src/evalfunc.c
+++ b/src/evalfunc.c
@@ -1827,7 +1827,7 @@ static funcentry_T global_functions[] =
#endif
},
{"bindtextdomain", 2, 2, 0, arg2_string,
- ret_void, f_bindtextdomain},
+ ret_bool, f_bindtextdomain},
{"blob2list", 1, 1, FEARG_1, arg1_blob,
ret_list_number, f_blob2list},
{"browse", 4, 4, 0, arg4_browse,
@@ -3486,8 +3486,11 @@ get_buf_arg(typval_T *arg)
* "bindtextdomain(package, path)" function
*/
static void
-f_bindtextdomain(typval_T *argvars UNUSED, typval_T *rettv UNUSED)
+f_bindtextdomain(typval_T *argvars, typval_T *rettv)
{
+ rettv->v_type = VAR_BOOL;
+ rettv->vval.v_number = VVAL_TRUE;
+
if (check_for_nonempty_string_arg(argvars, 0) == FAIL
|| check_for_nonempty_string_arg(argvars, 1) == FAIL)
return;
@@ -3495,7 +3498,13 @@ f_bindtextdomain(typval_T *argvars UNUSED, typval_T *rettv UNUSED)
if (strcmp((const char *)argvars[0].vval.v_string, VIMPACKAGE) == 0)
semsg(_(e_invalid_argument_str), tv_get_string(&argvars[0]));
else
- bindtextdomain((const char *)argvars[0].vval.v_string, (const char *)argvars[1].vval.v_string);
+ {
+ if (bindtextdomain((const char *)argvars[0].vval.v_string, (const char *)argvars[1].vval.v_string) == NULL)
+ {
+ do_outofmem_msg((long)0);
+ rettv->vval.v_number = VVAL_FALSE;
+ }
+ }
return;
}
diff --git a/src/testdir/test_gettext.vim b/src/testdir/test_gettext.vim
index 6a5aafdfe2..a990121a8e 100644
--- a/src/testdir/test_gettext.vim
+++ b/src/testdir/test_gettext.vim
@@ -1,5 +1,7 @@
source check.vim
+CheckFeature gettext
+
" Test for gettext()
func Test_gettext()
call assert_fails('call bindtextdomain("test")', 'E119:')
diff --git a/src/testdir/test_gettext_cp1251.vim b/src/testdir/test_gettext_cp1251.vim
index c91f7848af..69d2bbf4cd 100644
--- a/src/testdir/test_gettext_cp1251.vim
+++ b/src/testdir/test_gettext_cp1251.vim
@@ -2,22 +2,32 @@ source check.vim
" This fail on CI MacOS 14 because bindtextdomain() is not available there
" (missing library?)
CheckNotMac
+CheckFeature gettext
" Test for gettext()
func Test_gettext()
set encoding=cp1251
- call bindtextdomain("__PACKAGE__", getcwd())
- try
- language messages ru_RU
- call assert_equal(': ', gettext("ERROR: ", "__PACKAGE__"))
- catch /^Vim\%((\a\+)\)\=:E197:/
- throw "Skipped: not possible to set locale to ru (missing?)"
- endtry
+ call assert_equal('ERROR: ', gettext("ERROR: ", "__PACKAGE__"))
+
try
- language messages en_GB.UTF-8
- call assert_equal('ERROR: ', gettext("ERROR: ", "__PACKAGE__"))
- catch /^Vim\%((\a\+)\)\=:E197:/
- throw "Skipped: not possible to set locale to en (missing?)"
+ call assert_true(bindtextdomain("__PACKAGE__", getcwd()))
+
+ try
+ language messages ru_RU
+ call assert_equal(': ', gettext("ERROR: ", "__PACKAGE__"))
+ catch /^Vim\%((\a\+)\)\=:E197:/
+ throw "Skipped: not possible to set locale to ru (missing?)"
+ endtry
+
+ try
+ language messages en_GB.UTF-8
+ call assert_equal('ERROR: ', gettext("ERROR: ", "__PACKAGE__"))
+ catch /^Vim\%((\a\+)\)\=:E197:/
+ throw "Skipped: not possible to set locale to en (missing?)"
+ endtry
+
+ catch /^Vim\%((\a\+)\)\=:E342:/
+ throw "Skipped: out of memory executing bindtextdomain()"
endtry
set encoding&
endfunc
diff --git a/src/testdir/test_gettext_utf8.vim b/src/testdir/test_gettext_utf8.vim
index 7862e39e04..b96f8ea8ed 100644
--- a/src/testdir/test_gettext_utf8.vim
+++ b/src/testdir/test_gettext_utf8.vim
@@ -2,22 +2,32 @@ source check.vim
" This fail on CI MacOS 14 because bindtextdomain() is not available there
" (missing library?)
CheckNotMac
+CheckFeature gettext
" Test for gettext()
func Test_gettext()
set encoding=utf-8
- call bindtextdomain("__PACKAGE__", getcwd())
- try
- language messages ru_RU
- call assert_equal('ОШИБКА: ', gettext("ERROR: ", "__PACKAGE__"))
- catch /^Vim\%((\a\+)\)\=:E197:/
- throw "Skipped: not possible to set locale to ru (missing?)"
- endtry
+ call assert_equal('ERROR: ', gettext("ERROR: ", "__PACKAGE__"))
+
try
- language messages en_GB.UTF-8
- call assert_equal('ERROR: ', gettext("ERROR: ", "__PACKAGE__"))
- catch /^Vim\%((\a\+)\)\=:E197:/
- throw "Skipped: not possible to set locale to en (missing?)"
+ call assert_true(bindtextdomain("__PACKAGE__", getcwd()))
+
+ try
+ language messages ru_RU
+ call assert_equal('ОШИБКА: ', gettext("ERROR: ", "__PACKAGE__"))
+ catch /^Vim\%((\a\+)\)\=:E197:/
+ throw "Skipped: not possible to set locale to ru (missing?)"
+ endtry
+
+ try
+ language messages en_GB.UTF-8
+ call assert_equal('ERROR: ', gettext("ERROR: ", "__PACKAGE__"))
+ catch /^Vim\%((\a\+)\)\=:E197:/
+ throw "Skipped: not possible to set locale to en (missing?)"
+ endtry
+
+ catch /^Vim\%((\a\+)\)\=:E342:/
+ throw "Skipped: out of memory executing bindtextdomain()"
endtry
set encoding&
endfunc
diff --git a/src/version.c b/src/version.c
index cc2713aa0f..ddb02d1eed 100644
--- a/src/version.c
+++ b/src/version.c
@@ -705,6 +705,8 @@ static char *(features[]) =
static int included_patches[] =
{ /* Add new patch number below this line */
/**/
+ 560,
+/**/
559,
/**/
558,
diff --git a/src/vim.h b/src/vim.h
index 1b64e0dd9f..ae7458ad7e 100644
--- a/src/vim.h
+++ b/src/vim.h
@@ -598,7 +598,7 @@ extern int (*dyn_libintl_wputenv)(const wchar_t *envstring);
# ifdef bindtextdomain
# undef bindtextdomain
# endif
-# define bindtextdomain(x, y) // empty
+# define bindtextdomain(x, y) ""
# ifdef bind_textdomain_codeset
# undef bind_textdomain_codeset
# endif