@@ -466,6 +466,45 @@ skip_expr_concatenate(
466466 return res ;
467467}
468468
469+ /*
470+ * Convert "tv" to a string.
471+ * When "convert" is TRUE convert a List into a sequence of lines and convert
472+ * a Float to a String.
473+ * Returns an allocated string (NULL when out of memory).
474+ */
475+ char_u *
476+ typval2string (typval_T * tv , int convert )
477+ {
478+ garray_T ga ;
479+ char_u * retval ;
480+ #ifdef FEAT_FLOAT
481+ char_u numbuf [NUMBUFLEN ];
482+ #endif
483+
484+ if (convert && tv -> v_type == VAR_LIST )
485+ {
486+ ga_init2 (& ga , (int )sizeof (char ), 80 );
487+ if (tv -> vval .v_list != NULL )
488+ {
489+ list_join (& ga , tv -> vval .v_list , (char_u * )"\n" , TRUE, FALSE, 0 );
490+ if (tv -> vval .v_list -> lv_len > 0 )
491+ ga_append (& ga , NL );
492+ }
493+ ga_append (& ga , NUL );
494+ retval = (char_u * )ga .ga_data ;
495+ }
496+ #ifdef FEAT_FLOAT
497+ else if (convert && tv -> v_type == VAR_FLOAT )
498+ {
499+ vim_snprintf ((char * )numbuf , NUMBUFLEN , "%g" , tv -> vval .v_float );
500+ retval = vim_strsave (numbuf );
501+ }
502+ #endif
503+ else
504+ retval = vim_strsave (tv_get_string (tv ));
505+ return retval ;
506+ }
507+
469508/*
470509 * Top level evaluation function, returning a string. Does not handle line
471510 * breaks.
@@ -481,38 +520,14 @@ eval_to_string_eap(
481520{
482521 typval_T tv ;
483522 char_u * retval ;
484- garray_T ga ;
485- #ifdef FEAT_FLOAT
486- char_u numbuf [NUMBUFLEN ];
487- #endif
488523 evalarg_T evalarg ;
489524
490525 fill_evalarg_from_eap (& evalarg , eap , eap != NULL && eap -> skip );
491526 if (eval0 (arg , & tv , NULL , & evalarg ) == FAIL )
492527 retval = NULL ;
493528 else
494529 {
495- if (convert && tv .v_type == VAR_LIST )
496- {
497- ga_init2 (& ga , (int )sizeof (char ), 80 );
498- if (tv .vval .v_list != NULL )
499- {
500- list_join (& ga , tv .vval .v_list , (char_u * )"\n" , TRUE, FALSE, 0 );
501- if (tv .vval .v_list -> lv_len > 0 )
502- ga_append (& ga , NL );
503- }
504- ga_append (& ga , NUL );
505- retval = (char_u * )ga .ga_data ;
506- }
507- #ifdef FEAT_FLOAT
508- else if (convert && tv .v_type == VAR_FLOAT )
509- {
510- vim_snprintf ((char * )numbuf , NUMBUFLEN , "%g" , tv .vval .v_float );
511- retval = vim_strsave (numbuf );
512- }
513- #endif
514- else
515- retval = vim_strsave (tv_get_string (& tv ));
530+ retval = typval2string (& tv , convert );
516531 clear_tv (& tv );
517532 }
518533 clear_evalarg (& evalarg , NULL );
0 commit comments