@@ -112,6 +112,8 @@ PRAGMA_DIAG_POP
112
112
static char * e_listblobarg = N_ ("E899: Argument of %s must be a List or Blob" );
113
113
static char * e_invalwindow = N_ ("E957: Invalid window number" );
114
114
static char * e_reduceempty = N_ ("E998: Reduce of an empty %s with no initial value" );
115
+ static char e_using_number_as_bool_nr []
116
+ = N_ ("E1023: Using a Number as a Bool: %d" );
115
117
static char e_cannot_resize_window_in_another_tab_page []
116
118
= N_ ("E1308: Cannot resize a window in another tab page" );
117
119
@@ -906,7 +908,7 @@ static void f_charidx(typval_T *argvars, typval_T *rettv, EvalFuncData fptr)
906
908
countcc = (int )tv_get_number (& argvars [2 ]);
907
909
}
908
910
if (countcc < 0 || countcc > 1 ) {
909
- emsg (_ (e_invarg ) );
911
+ semsg (_ (e_using_number_as_bool_nr ), countcc );
910
912
return ;
911
913
}
912
914
@@ -1358,10 +1360,10 @@ static void f_deepcopy(typval_T *argvars, typval_T *rettv, EvalFuncData fptr)
1358
1360
int noref = 0 ;
1359
1361
1360
1362
if (argvars [1 ].v_type != VAR_UNKNOWN ) {
1361
- noref = (int )tv_get_number_chk (& argvars [1 ], NULL );
1363
+ noref = (int )tv_get_bool_chk (& argvars [1 ], NULL );
1362
1364
}
1363
1365
if (noref < 0 || noref > 1 ) {
1364
- emsg (_ (e_invarg ) );
1366
+ semsg (_ (e_using_number_as_bool_nr ), noref );
1365
1367
} else {
1366
1368
var_item_copy (NULL , & argvars [0 ], rettv , true, (noref == 0
1367
1369
? get_copyID ()
@@ -2056,6 +2058,12 @@ static void f_menu_get(typval_T *argvars, typval_T *rettv, EvalFuncData fptr)
2056
2058
static void f_expandcmd (typval_T * argvars , typval_T * rettv , EvalFuncData fptr )
2057
2059
{
2058
2060
char * errormsg = NULL ;
2061
+ bool emsgoff = true;
2062
+
2063
+ if (argvars [1 ].v_type == VAR_DICT
2064
+ && tv_dict_get_bool (argvars [1 ].vval .v_dict , "errmsg" , kBoolVarFalse )) {
2065
+ emsgoff = false;
2066
+ }
2059
2067
2060
2068
rettv -> v_type = VAR_STRING ;
2061
2069
char * cmdstr = xstrdup (tv_get_string (& argvars [0 ]));
@@ -2069,9 +2077,17 @@ static void f_expandcmd(typval_T *argvars, typval_T *rettv, EvalFuncData fptr)
2069
2077
};
2070
2078
eap .argt |= EX_NOSPC ;
2071
2079
2072
- emsg_off ++ ;
2073
- expand_filename (& eap , & cmdstr , & errormsg );
2074
- emsg_off -- ;
2080
+ if (emsgoff ) {
2081
+ emsg_off ++ ;
2082
+ }
2083
+ if (expand_filename (& eap , & cmdstr , & errormsg ) == FAIL ) {
2084
+ if (!emsgoff && errormsg != NULL && * errormsg != NUL ) {
2085
+ emsg (errormsg );
2086
+ }
2087
+ }
2088
+ if (emsgoff ) {
2089
+ emsg_off -- ;
2090
+ }
2075
2091
2076
2092
rettv -> vval .v_string = cmdstr ;
2077
2093
}
@@ -8160,7 +8176,7 @@ static void f_split(typval_T *argvars, typval_T *rettv, EvalFuncData fptr)
8160
8176
typeerr = true;
8161
8177
}
8162
8178
if (argvars [2 ].v_type != VAR_UNKNOWN ) {
8163
- keepempty = (bool )tv_get_number_chk (& argvars [2 ], & typeerr );
8179
+ keepempty = (bool )tv_get_bool_chk (& argvars [2 ], & typeerr );
8164
8180
}
8165
8181
}
8166
8182
if (pat == NULL || * pat == NUL ) {
@@ -8290,7 +8306,7 @@ static void f_str2nr(typval_T *argvars, typval_T *rettv, EvalFuncData fptr)
8290
8306
emsg (_ (e_invarg ));
8291
8307
return ;
8292
8308
}
8293
- if (argvars [2 ].v_type != VAR_UNKNOWN && tv_get_number (& argvars [2 ])) {
8309
+ if (argvars [2 ].v_type != VAR_UNKNOWN && tv_get_bool (& argvars [2 ])) {
8294
8310
what |= STR2NR_QUOTE ;
8295
8311
}
8296
8312
}
@@ -8445,26 +8461,38 @@ static void f_strlen(typval_T *argvars, typval_T *rettv, EvalFuncData fptr)
8445
8461
rettv -> vval .v_number = (varnumber_T )strlen (tv_get_string (& argvars [0 ]));
8446
8462
}
8447
8463
8448
- /// "strchars()" function
8449
- static void f_strchars (typval_T * argvars , typval_T * rettv , EvalFuncData fptr )
8464
+ static void strchar_common (typval_T * argvars , typval_T * rettv , bool skipcc )
8450
8465
{
8451
8466
const char * s = tv_get_string (& argvars [0 ]);
8452
- int skipcc = 0 ;
8453
8467
varnumber_T len = 0 ;
8454
8468
int (* func_mb_ptr2char_adv )(const char_u * * pp );
8455
8469
8470
+ func_mb_ptr2char_adv = skipcc ? mb_ptr2char_adv : mb_cptr2char_adv ;
8471
+ while (* s != NUL ) {
8472
+ func_mb_ptr2char_adv ((const char_u * * )& s );
8473
+ len ++ ;
8474
+ }
8475
+ rettv -> vval .v_number = len ;
8476
+ }
8477
+
8478
+ /// "strcharlen()" function
8479
+ static void f_strcharlen (typval_T * argvars , typval_T * rettv , EvalFuncData fptr )
8480
+ {
8481
+ strchar_common (argvars , rettv , true);
8482
+ }
8483
+
8484
+ /// "strchars()" function
8485
+ static void f_strchars (typval_T * argvars , typval_T * rettv , EvalFuncData fptr )
8486
+ {
8487
+ int skipcc = false;
8488
+
8456
8489
if (argvars [1 ].v_type != VAR_UNKNOWN ) {
8457
- skipcc = (int )tv_get_number_chk (& argvars [1 ], NULL );
8490
+ skipcc = (int )tv_get_bool (& argvars [1 ]);
8458
8491
}
8459
8492
if (skipcc < 0 || skipcc > 1 ) {
8460
- emsg (_ (e_invarg ) );
8493
+ semsg (_ (e_using_number_as_bool_nr ), skipcc );
8461
8494
} else {
8462
- func_mb_ptr2char_adv = skipcc ? mb_ptr2char_adv : mb_cptr2char_adv ;
8463
- while (* s != NUL ) {
8464
- func_mb_ptr2char_adv ((const char_u * * )& s );
8465
- len ++ ;
8466
- }
8467
- rettv -> vval .v_number = len ;
8495
+ strchar_common (argvars , rettv , skipcc );
8468
8496
}
8469
8497
}
8470
8498
0 commit comments