summaryrefslogtreecommitdiffstats
path: root/src/evalfunc.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/evalfunc.c')
-rw-r--r--src/evalfunc.c55
1 files changed, 52 insertions, 3 deletions
diff --git a/src/evalfunc.c b/src/evalfunc.c
index 2a0eb27ad5..4fffa50d31 100644
--- a/src/evalfunc.c
+++ b/src/evalfunc.c
@@ -28,6 +28,7 @@ static void f_balloon_show(typval_T *argvars, typval_T *rettv);
static void f_balloon_split(typval_T *argvars, typval_T *rettv);
# endif
#endif
+static void f_bindtextdomain(typval_T *argvars, typval_T *rettv);
static void f_byte2line(typval_T *argvars, typval_T *rettv);
static void f_call(typval_T *argvars, typval_T *rettv);
static void f_changenr(typval_T *argvars, typval_T *rettv);
@@ -1824,6 +1825,8 @@ static funcentry_T global_functions[] =
NULL
#endif
},
+ {"bindtextdomain", 2, 2, 0, arg2_string,
+ ret_void, f_bindtextdomain},
{"blob2list", 1, 1, FEARG_1, arg1_blob,
ret_list_number, f_blob2list},
{"browse", 4, 4, 0, arg4_browse,
@@ -2154,7 +2157,7 @@ static funcentry_T global_functions[] =
ret_any, f_gettabwinvar},
{"gettagstack", 0, 1, FEARG_1, arg1_number,
ret_dict_any, f_gettagstack},
- {"gettext", 1, 1, FEARG_1, arg1_string,
+ {"gettext", 1, 2, FEARG_1, arg2_string,
ret_string, f_gettext},
{"getwininfo", 0, 1, FEARG_1, arg1_number,
ret_list_dict_any, f_getwininfo},
@@ -3477,6 +3480,24 @@ get_buf_arg(typval_T *arg)
}
/*
+ * "bindtextdomain(package, path)" function
+ */
+ static void
+f_bindtextdomain(typval_T *argvars UNUSED, typval_T *rettv UNUSED)
+{
+ if (check_for_nonempty_string_arg(argvars, 0) == FAIL
+ || check_for_nonempty_string_arg(argvars, 1) == FAIL)
+ return;
+
+ 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);
+
+ return;
+}
+
+/*
* "byte2line(byte)" function
*/
static void
@@ -6033,11 +6054,39 @@ f_gettagstack(typval_T *argvars, typval_T *rettv)
static void
f_gettext(typval_T *argvars, typval_T *rettv)
{
- if (check_for_nonempty_string_arg(argvars, 0) == FAIL)
+#if defined(HAVE_BIND_TEXTDOMAIN_CODESET)
+ char *prev = NULL;
+#endif
+
+ if (check_for_nonempty_string_arg(argvars, 0) == FAIL
+ || check_for_opt_string_arg(argvars, 1) == FAIL)
return;
rettv->v_type = VAR_STRING;
- rettv->vval.v_string = vim_strsave((char_u *)_(argvars[0].vval.v_string));
+
+ if (argvars[1].v_type == VAR_STRING &&
+ argvars[1].vval.v_string != NULL &&
+ *(argvars[1].vval.v_string) != NUL)
+ {
+#if defined(HAVE_BIND_TEXTDOMAIN_CODESET)
+ prev = bind_textdomain_codeset((const char *)argvars[1].vval.v_string, (char *)p_enc);
+#endif
+
+#if defined(HAVE_DGETTEXT)
+ rettv->vval.v_string = vim_strsave((char_u *)dgettext((const char *)argvars[1].vval.v_string, (const char *)argvars[0].vval.v_string));
+#else
+ textdomain((const char *)argvars[1].vval.v_string);
+ rettv->vval.v_string = vim_strsave((char_u *)_(argvars[0].vval.v_string));
+ textdomain(VIMPACKAGE);
+#endif
+
+#if defined(HAVE_BIND_TEXTDOMAIN_CODESET)
+ if (prev != NULL)
+ bind_textdomain_codeset((const char *)argvars[1].vval.v_string, prev);
+#endif
+ }
+ else
+ rettv->vval.v_string = vim_strsave((char_u *)_(argvars[0].vval.v_string));
}
// for VIM_VERSION_ defines