comparison src/evalfunc.c @ 20629:7b8ac5e49451 v8.2.0868

patch 8.2.0868: trim() always trims both ends Commit: https://github.com/vim/vim/commit/2245ae18e3480057f98fc0e5d9f18091f32a5de0 Author: Bram Moolenaar <Bram@vim.org> Date: Sun May 31 22:20:36 2020 +0200 patch 8.2.0868: trim() always trims both ends Problem: trim() always trims both ends. Solution: Add an argument to only trim the beginning or end. (Yegappan Lakshmanan, closes #6126)
author Bram Moolenaar <Bram@vim.org>
date Sun, 31 May 2020 22:30:04 +0200
parents 8eed1e9389bb
children 3e36a51ff152
comparison
equal deleted inserted replaced
20628:8131c8d8fbf0 20629:7b8ac5e49451
974 {"timer_stop", 1, 1, FEARG_1, ret_void, TIMER_FUNC(f_timer_stop)}, 974 {"timer_stop", 1, 1, FEARG_1, ret_void, TIMER_FUNC(f_timer_stop)},
975 {"timer_stopall", 0, 0, 0, ret_void, TIMER_FUNC(f_timer_stopall)}, 975 {"timer_stopall", 0, 0, 0, ret_void, TIMER_FUNC(f_timer_stopall)},
976 {"tolower", 1, 1, FEARG_1, ret_string, f_tolower}, 976 {"tolower", 1, 1, FEARG_1, ret_string, f_tolower},
977 {"toupper", 1, 1, FEARG_1, ret_string, f_toupper}, 977 {"toupper", 1, 1, FEARG_1, ret_string, f_toupper},
978 {"tr", 3, 3, FEARG_1, ret_string, f_tr}, 978 {"tr", 3, 3, FEARG_1, ret_string, f_tr},
979 {"trim", 1, 2, FEARG_1, ret_string, f_trim}, 979 {"trim", 1, 3, FEARG_1, ret_string, f_trim},
980 {"trunc", 1, 1, FEARG_1, ret_float, FLOAT_FUNC(f_trunc)}, 980 {"trunc", 1, 1, FEARG_1, ret_float, FLOAT_FUNC(f_trunc)},
981 {"type", 1, 1, FEARG_1, ret_number, f_type}, 981 {"type", 1, 1, FEARG_1, ret_number, f_type},
982 {"undofile", 1, 1, FEARG_1, ret_string, f_undofile}, 982 {"undofile", 1, 1, FEARG_1, ret_string, f_undofile},
983 {"undotree", 0, 0, 0, ret_dict_any, f_undotree}, 983 {"undotree", 0, 0, 0, ret_dict_any, f_undotree},
984 {"uniq", 1, 3, FEARG_1, ret_list_any, f_uniq}, 984 {"uniq", 1, 3, FEARG_1, ret_list_any, f_uniq},
8635 char_u *mask = NULL; 8635 char_u *mask = NULL;
8636 char_u *tail; 8636 char_u *tail;
8637 char_u *prev; 8637 char_u *prev;
8638 char_u *p; 8638 char_u *p;
8639 int c1; 8639 int c1;
8640 int dir = 0;
8640 8641
8641 rettv->v_type = VAR_STRING; 8642 rettv->v_type = VAR_STRING;
8643 rettv->vval.v_string = NULL;
8642 if (head == NULL) 8644 if (head == NULL)
8643 {
8644 rettv->vval.v_string = NULL;
8645 return; 8645 return;
8646 }
8647 8646
8648 if (argvars[1].v_type == VAR_STRING) 8647 if (argvars[1].v_type == VAR_STRING)
8648 {
8649 mask = tv_get_string_buf_chk(&argvars[1], buf2); 8649 mask = tv_get_string_buf_chk(&argvars[1], buf2);
8650 8650
8651 while (*head != NUL) 8651 if (argvars[2].v_type != VAR_UNKNOWN)
8652 { 8652 {
8653 c1 = PTR2CHAR(head); 8653 int error = 0;
8654 if (mask == NULL) 8654
8655 { 8655 // leading or trailing characters to trim
8656 if (c1 > ' ' && c1 != 0xa0) 8656 dir = (int)tv_get_number_chk(&argvars[2], &error);
8657 break; 8657 if (error)
8658 } 8658 return;
8659 else 8659 if (dir < 0 || dir > 2)
8660 { 8660 {
8661 for (p = mask; *p != NUL; MB_PTR_ADV(p)) 8661 semsg(_(e_invarg2), tv_get_string(&argvars[2]));
8662 if (c1 == PTR2CHAR(p)) 8662 return;
8663 }
8664 }
8665 }
8666
8667 if (dir == 0 || dir == 1)
8668 {
8669 // Trim leading characters
8670 while (*head != NUL)
8671 {
8672 c1 = PTR2CHAR(head);
8673 if (mask == NULL)
8674 {
8675 if (c1 > ' ' && c1 != 0xa0)
8663 break; 8676 break;
8664 if (*p == NUL) 8677 }
8665 break; 8678 else
8666 } 8679 {
8667 MB_PTR_ADV(head); 8680 for (p = mask; *p != NUL; MB_PTR_ADV(p))
8668 } 8681 if (c1 == PTR2CHAR(p))
8669 8682 break;
8670 for (tail = head + STRLEN(head); tail > head; tail = prev) 8683 if (*p == NUL)
8671 {
8672 prev = tail;
8673 MB_PTR_BACK(head, prev);
8674 c1 = PTR2CHAR(prev);
8675 if (mask == NULL)
8676 {
8677 if (c1 > ' ' && c1 != 0xa0)
8678 break;
8679 }
8680 else
8681 {
8682 for (p = mask; *p != NUL; MB_PTR_ADV(p))
8683 if (c1 == PTR2CHAR(p))
8684 break; 8684 break;
8685 if (*p == NUL) 8685 }
8686 break; 8686 MB_PTR_ADV(head);
8687 }
8688 }
8689
8690 tail = head + STRLEN(head);
8691 if (dir == 0 || dir == 2)
8692 {
8693 // Trim trailing characters
8694 for (; tail > head; tail = prev)
8695 {
8696 prev = tail;
8697 MB_PTR_BACK(head, prev);
8698 c1 = PTR2CHAR(prev);
8699 if (mask == NULL)
8700 {
8701 if (c1 > ' ' && c1 != 0xa0)
8702 break;
8703 }
8704 else
8705 {
8706 for (p = mask; *p != NUL; MB_PTR_ADV(p))
8707 if (c1 == PTR2CHAR(p))
8708 break;
8709 if (*p == NUL)
8710 break;
8711 }
8687 } 8712 }
8688 } 8713 }
8689 rettv->vval.v_string = vim_strnsave(head, (int)(tail - head)); 8714 rettv->vval.v_string = vim_strnsave(head, (int)(tail - head));
8690 } 8715 }
8691 8716