summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/plugins/guile/weechat-guile-api.c6
-rw-r--r--src/plugins/javascript/weechat-js-api.cpp24
-rw-r--r--src/plugins/perl/weechat-perl-api.c4
-rw-r--r--src/plugins/php/weechat-php-api.c6
-rw-r--r--src/plugins/python/weechat-python-api.c2
-rw-r--r--src/plugins/python/weechat.pyi2
-rw-r--r--src/plugins/ruby/weechat-ruby-api.c13
-rw-r--r--src/plugins/tcl/weechat-tcl-api.c15
8 files changed, 53 insertions, 19 deletions
diff --git a/src/plugins/guile/weechat-guile-api.c b/src/plugins/guile/weechat-guile-api.c
index a48a37d19..85f8561a3 100644
--- a/src/plugins/guile/weechat-guile-api.c
+++ b/src/plugins/guile/weechat-guile-api.c
@@ -114,6 +114,9 @@ char *
weechat_guile_api_scm_to_string (SCM str,
char *guile_strings[], int *guile_num_strings)
{
+ if (scm_is_null (str))
+ return NULL;
+
/*
* if array is full, just return string without using length
* (this should never happen, the array should be large enough for any API
@@ -1302,7 +1305,8 @@ weechat_guile_api_config_new_option (SCM args)
|| !scm_is_string (name) || !scm_is_string (type)
|| !scm_is_string (description) || !scm_is_string (string_values)
|| !scm_is_integer (min) || !scm_is_integer (max)
- || !scm_is_string (default_value) || !scm_is_string (value)
+ || !(scm_is_null (default_value) || scm_is_string (default_value))
+ || !(scm_is_null (value) || scm_is_string (value))
|| !scm_is_integer (null_value_allowed)
|| !scm_is_string (function_check_value)
|| !scm_is_string (data_check_value)
diff --git a/src/plugins/javascript/weechat-js-api.cpp b/src/plugins/javascript/weechat-js-api.cpp
index 7acf0002a..caf992c5f 100644
--- a/src/plugins/javascript/weechat-js-api.cpp
+++ b/src/plugins/javascript/weechat-js-api.cpp
@@ -73,6 +73,8 @@ extern "C"
for (num = 0; num < js_args_len; num++) \
{ \
if (((js_args[num] == 's') && (!args[num]->IsString())) \
+ || ((js_args[num] == 'S') && (!(args[num]->IsString() \
+ || args[num]->IsNull() || args[num]->IsUndefined()))) \
|| ((js_args[num] == 'i') && (!args[num]->IsInt32())) \
|| ((js_args[num] == 'n') && (!args[num]->IsNumber())) \
|| ((js_args[num] == 'h') && (!args[num]->IsObject()))) \
@@ -1188,9 +1190,10 @@ weechat_js_api_config_option_delete_cb (const void *pointer, void *data,
API_FUNC(config_new_option)
{
int min, max, null_value_allowed;
+ char *default_value, *value;
const char *result;
- API_INIT_FUNC(1, "config_new_option", "ssssssiississssss", API_RETURN_EMPTY);
+ API_INIT_FUNC(1, "config_new_option", "ssssssiiSSissssss", API_RETURN_EMPTY);
v8::String::Utf8Value config_file(args[0]);
v8::String::Utf8Value section(args[1]);
@@ -1200,8 +1203,19 @@ API_FUNC(config_new_option)
v8::String::Utf8Value string_values(args[5]);
min = args[6]->IntegerValue();
max = args[7]->IntegerValue();
- v8::String::Utf8Value default_value(args[8]);
- v8::String::Utf8Value value(args[9]);
+
+ v8::String::Utf8Value v8_default_value(args[8]);
+ if (args[8]->IsNull() || args[8]->IsUndefined())
+ default_value = NULL;
+ else
+ default_value = *v8_default_value;
+
+ v8::String::Utf8Value v8_value(args[9]);
+ if (args[8]->IsNull() || args[8]->IsUndefined())
+ value = NULL;
+ else
+ value = *v8_value;
+
null_value_allowed = args[10]->IntegerValue();
v8::String::Utf8Value function_check_value(args[11]);
v8::String::Utf8Value data_check_value(args[12]);
@@ -1222,8 +1236,8 @@ API_FUNC(config_new_option)
*string_values,
min,
max,
- *default_value,
- *value,
+ default_value,
+ value,
null_value_allowed,
&weechat_js_api_config_option_check_value_cb,
*function_check_value,
diff --git a/src/plugins/perl/weechat-perl-api.c b/src/plugins/perl/weechat-perl-api.c
index 5112fbc50..27438b3ee 100644
--- a/src/plugins/perl/weechat-perl-api.c
+++ b/src/plugins/perl/weechat-perl-api.c
@@ -1259,8 +1259,8 @@ API_FUNC(config_new_option)
type = SvPV_nolen (ST (3));
description = SvPV_nolen (ST (4));
string_values = SvPV_nolen (ST (5));
- default_value = SvPV_nolen (ST (8));
- value = SvPV_nolen (ST (9));
+ default_value = SvOK (ST (8)) ? SvPV_nolen (ST (8)) : NULL;
+ value = SvOK (ST (9)) ? SvPV_nolen (ST (9)) : NULL;
function_check_value = SvPV_nolen (ST (11));
data_check_value = SvPV_nolen (ST (12));
function_change = SvPV_nolen (ST (13));
diff --git a/src/plugins/php/weechat-php-api.c b/src/plugins/php/weechat-php-api.c
index c48a6fec1..b92580b38 100644
--- a/src/plugins/php/weechat-php-api.c
+++ b/src/plugins/php/weechat-php-api.c
@@ -1295,7 +1295,7 @@ API_FUNC(config_new_option)
API_INIT_FUNC(1, "config_new_option", API_RETURN_EMPTY);
if (zend_parse_parameters (
- ZEND_NUM_ARGS(), "SSSSSSllSSlzSzSzS", &z_config_file, &z_section,
+ ZEND_NUM_ARGS(), "SSSSSSllS!S!lzSzSzS", &z_config_file, &z_section,
&z_name, &z_type, &z_description, &z_string_values, &z_min, &z_max,
&z_default_value, &z_value, &z_null_value_allowed,
&z_callback_check_value, &z_data_check_value, &z_callback_change,
@@ -1310,8 +1310,8 @@ API_FUNC(config_new_option)
string_values = ZSTR_VAL(z_string_values);
min = (int)z_min;
max = (int)z_max;
- default_value = ZSTR_VAL(z_default_value);
- value = ZSTR_VAL(z_value);
+ default_value = z_default_value ? ZSTR_VAL(z_default_value) : NULL;
+ value = z_value ? ZSTR_VAL(z_value) : NULL;
null_value_allowed = (int)z_null_value_allowed;
weechat_php_get_function_name (z_callback_check_value,
callback_check_value_name);
diff --git a/src/plugins/python/weechat-python-api.c b/src/plugins/python/weechat-python-api.c
index 0decc1f80..6398e7d2e 100644
--- a/src/plugins/python/weechat-python-api.c
+++ b/src/plugins/python/weechat-python-api.c
@@ -1255,7 +1255,7 @@ API_FUNC(config_new_option)
data_change = NULL;
function_delete = NULL;
data_delete = NULL;
- if (!PyArg_ParseTuple (args, "ssssssiississssss", &config_file, &section, &name,
+ if (!PyArg_ParseTuple (args, "ssssssiizzissssss", &config_file, &section, &name,
&type, &description, &string_values, &min, &max,
&default_value, &value, &null_value_allowed,
&function_check_value, &data_check_value,
diff --git a/src/plugins/python/weechat.pyi b/src/plugins/python/weechat.pyi
index b180fced4..312a97a32 100644
--- a/src/plugins/python/weechat.pyi
+++ b/src/plugins/python/weechat.pyi
@@ -242,7 +242,7 @@ def config_search_section(config_file: str, section_name: str) -> str:
def config_new_option(config_file: str, section: str, name: str, type: str, description: str,
string_values: str, min: int, max: int,
- default_value: str, value: str, null_value_allowed: int,
+ default_value: str | None, value: str | None, null_value_allowed: int,
callback_check_value: str, callback_check_value_data: str,
callback_change: str, callback_change_data: str,
callback_delete: str, callback_delete_data: str) -> str:
diff --git a/src/plugins/ruby/weechat-ruby-api.c b/src/plugins/ruby/weechat-ruby-api.c
index 09aad9968..d1883f49f 100644
--- a/src/plugins/ruby/weechat-ruby-api.c
+++ b/src/plugins/ruby/weechat-ruby-api.c
@@ -1489,8 +1489,7 @@ weechat_ruby_api_config_new_option (VALUE class, VALUE config_file,
API_INIT_FUNC(1, "config_new_option", API_RETURN_EMPTY);
if (NIL_P (config_file) || NIL_P (section) || NIL_P (name) || NIL_P (type)
|| NIL_P (description) || NIL_P (string_values) || NIL_P (min)
- || NIL_P (max) || NIL_P (default_value) || NIL_P (value)
- || NIL_P (null_value_allowed) || NIL_P (callbacks))
+ || NIL_P (max) || NIL_P (null_value_allowed) || NIL_P (callbacks))
API_WRONG_ARGS(API_RETURN_EMPTY);
Check_Type (config_file, T_STRING);
@@ -1501,8 +1500,10 @@ weechat_ruby_api_config_new_option (VALUE class, VALUE config_file,
Check_Type (string_values, T_STRING);
CHECK_INTEGER(min);
CHECK_INTEGER(max);
- Check_Type (default_value, T_STRING);
- Check_Type (value, T_STRING);
+ if (!NIL_P (default_value))
+ Check_Type (default_value, T_STRING);
+ if (!NIL_P (value))
+ Check_Type (value, T_STRING);
CHECK_INTEGER(null_value_allowed);
Check_Type (callbacks, T_ARRAY);
@@ -1528,8 +1529,8 @@ weechat_ruby_api_config_new_option (VALUE class, VALUE config_file,
c_string_values = StringValuePtr (string_values);
c_min = NUM2INT (min);
c_max = NUM2INT (max);
- c_default_value = StringValuePtr (default_value);
- c_value = StringValuePtr (value);
+ c_default_value = NIL_P (default_value) ? NULL : StringValuePtr (default_value);
+ c_value = NIL_P (value) ? NULL : StringValuePtr (value);
c_null_value_allowed = NUM2INT (null_value_allowed);
c_function_check_value = StringValuePtr (function_check_value);
c_data_check_value = StringValuePtr (data_check_value);
diff --git a/src/plugins/tcl/weechat-tcl-api.c b/src/plugins/tcl/weechat-tcl-api.c
index cff12283d..a82aa4725 100644
--- a/src/plugins/tcl/weechat-tcl-api.c
+++ b/src/plugins/tcl/weechat-tcl-api.c
@@ -35,6 +35,14 @@
#include "weechat-tcl.h"
+/* Magic value to indicate NULL since Tcl only has string types. The value is
+ * \uFFFF\uFFFF\uFFFFWEECHAT_NULL\uFFFF\uFFFF\uFFFF. \uFFFF is used because
+ * it's reserved in Unicode as not a character, so this string is very unlikely
+ * to appear unintentionally since it's not valid text. */
+#define WEECHAT_NULL_STRING \
+ "\xef\xbf\xbf\xef\xbf\xbf\xef\xbf\xbfWEECHAT_NULL\xef\xbf\xbf\xef\xbf\xbf\xef\xbf\xbf"
+
+
#define API_DEF_FUNC(__name) \
Tcl_CreateObjCommand (interp, "weechat::" #__name, \
weechat_tcl_api_##__name, \
@@ -1461,7 +1469,11 @@ API_FUNC(config_new_option)
description = Tcl_GetStringFromObj (objv[5], &i);
string_values = Tcl_GetStringFromObj (objv[6], &i);
default_value = Tcl_GetStringFromObj (objv[9], &i);
+ if (strcmp (default_value, WEECHAT_NULL_STRING) == 0)
+ default_value = NULL;
value = Tcl_GetStringFromObj (objv[10], &i);
+ if (strcmp (value, WEECHAT_NULL_STRING) == 0)
+ value = NULL;
function_check_value = Tcl_GetStringFromObj (objv[12], &i);
data_check_value = Tcl_GetStringFromObj (objv[13], &i);
function_change = Tcl_GetStringFromObj (objv[14], &i);
@@ -5710,6 +5722,9 @@ void weechat_tcl_api_init (Tcl_Interp *interp)
Tcl_SetIntObj (objp, WEECHAT_RC_ERROR);
Tcl_SetVar (interp, "weechat::WEECHAT_RC_ERROR", Tcl_GetStringFromObj (objp, &i), 0);
+ Tcl_SetStringObj (objp, WEECHAT_NULL_STRING, -1);
+ Tcl_SetVar (interp, "weechat::WEECHAT_NULL", Tcl_GetStringFromObj (objp, &i), 0);
+
Tcl_SetIntObj (objp, WEECHAT_CONFIG_READ_OK);
Tcl_SetVar (interp, "weechat::WEECHAT_CONFIG_READ_OK", Tcl_GetStringFromObj (objp, &i), 0);
Tcl_SetIntObj (objp, WEECHAT_CONFIG_READ_MEMORY_ERROR);