Mercurial > vim
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 |