@@ -430,6 +430,7 @@ static void f_timer_stopall(typval_T *argvars, typval_T *rettv);
430430static void f_tolower (typval_T * argvars , typval_T * rettv );
431431static void f_toupper (typval_T * argvars , typval_T * rettv );
432432static void f_tr (typval_T * argvars , typval_T * rettv );
433+ static void f_trim (typval_T * argvars , typval_T * rettv );
433434#ifdef FEAT_FLOAT
434435static void f_trunc (typval_T * argvars , typval_T * rettv );
435436#endif
@@ -899,6 +900,7 @@ static struct fst
899900 {"tolower" , 1 , 1 , f_tolower },
900901 {"toupper" , 1 , 1 , f_toupper },
901902 {"tr" , 3 , 3 , f_tr },
903+ {"trim" , 1 , 2 , f_trim },
902904#ifdef FEAT_FLOAT
903905 {"trunc" , 1 , 1 , f_trunc },
904906#endif
@@ -5546,7 +5548,7 @@ f_getwinpos(typval_T *argvars UNUSED, typval_T *rettv)
55465548 return ;
55475549#ifdef FEAT_GUI
55485550 if (gui .in_use )
5549- gui_mch_get_winpos (& x , & y );
5551+ ( void ) gui_mch_get_winpos (& x , & y );
55505552# if defined(HAVE_TGETENT ) && defined(FEAT_TERMRESPONSE )
55515553 else
55525554# endif
@@ -13230,6 +13232,72 @@ f_tr(typval_T *argvars, typval_T *rettv)
1323013232 rettv -> vval .v_string = ga .ga_data ;
1323113233}
1323213234
13235+ /*
13236+ * "trim({expr})" function
13237+ */
13238+ static void
13239+ f_trim (typval_T * argvars , typval_T * rettv )
13240+ {
13241+ char_u buf1 [NUMBUFLEN ];
13242+ char_u buf2 [NUMBUFLEN ];
13243+ char_u * head = get_tv_string_buf_chk (& argvars [0 ], buf1 );
13244+ char_u * mask = NULL ;
13245+ char_u * tail ;
13246+ char_u * prev ;
13247+ char_u * p ;
13248+ int c1 ;
13249+
13250+ rettv -> v_type = VAR_STRING ;
13251+ if (head == NULL )
13252+ {
13253+ rettv -> vval .v_string = NULL ;
13254+ return ;
13255+ }
13256+
13257+ if (argvars [1 ].v_type == VAR_STRING )
13258+ mask = get_tv_string_buf_chk (& argvars [1 ], buf2 );
13259+
13260+ while (* head != NUL )
13261+ {
13262+ c1 = PTR2CHAR (head );
13263+ if (mask == NULL )
13264+ {
13265+ if (c1 > ' ' && c1 != 0xa0 )
13266+ break ;
13267+ }
13268+ else
13269+ {
13270+ for (p = mask ; * p != NUL ; MB_PTR_ADV (p ))
13271+ if (c1 == PTR2CHAR (p ))
13272+ break ;
13273+ if (* p == NUL )
13274+ break ;
13275+ }
13276+ MB_PTR_ADV (head );
13277+ }
13278+
13279+ for (tail = head + STRLEN (head ); tail > head ; tail = prev )
13280+ {
13281+ prev = tail ;
13282+ MB_PTR_BACK (head , prev );
13283+ c1 = PTR2CHAR (prev );
13284+ if (mask == NULL )
13285+ {
13286+ if (c1 > ' ' && c1 != 0xa0 )
13287+ break ;
13288+ }
13289+ else
13290+ {
13291+ for (p = mask ; * p != NUL ; MB_PTR_ADV (p ))
13292+ if (c1 == PTR2CHAR (p ))
13293+ break ;
13294+ if (* p == NUL )
13295+ break ;
13296+ }
13297+ }
13298+ rettv -> vval .v_string = vim_strnsave (head , (int )(tail - head ));
13299+ }
13300+
1323313301#ifdef FEAT_FLOAT
1323413302/*
1323513303 * "trunc({float})" function
0 commit comments