diff options
author | Yegappan Lakshmanan <yegappan@yahoo.com> | 2021-07-10 21:29:18 +0200 |
---|---|---|
committer | Bram Moolenaar <Bram@vim.org> | 2021-07-10 21:29:18 +0200 |
commit | a2438132a675be4dde3acbdf03ba1fdb2f09427c (patch) | |
tree | 973f677bea21a7f41bbb9d49ad0038550e6e665b | |
parent | 31e21766d6fb0a386e15ccc8c2192f6a3a210f53 (diff) |
patch 8.2.3139: functions for string manipulation are spread outv8.2.3139
Problem: Functions for string manipulation are spread out.
Solution: Move string related functions to a new source file. (Yegappan
Lakshmanan, closes #8470)
-rw-r--r-- | Filelist | 2 | ||||
-rw-r--r-- | src/Make_ami.mak | 1 | ||||
-rw-r--r-- | src/Make_cyg_ming.mak | 1 | ||||
-rw-r--r-- | src/Make_mvc.mak | 4 | ||||
-rw-r--r-- | src/Make_vms.mms | 6 | ||||
-rw-r--r-- | src/Makefile | 10 | ||||
-rw-r--r-- | src/README.md | 1 | ||||
-rw-r--r-- | src/eval.c | 49 | ||||
-rw-r--r-- | src/evalfunc.c | 825 | ||||
-rw-r--r-- | src/mbyte.c | 31 | ||||
-rw-r--r-- | src/misc1.c | 26 | ||||
-rw-r--r-- | src/misc2.c | 706 | ||||
-rw-r--r-- | src/proto.h | 1 | ||||
-rw-r--r-- | src/proto/eval.pro | 3 | ||||
-rw-r--r-- | src/proto/evalfunc.pro | 1 | ||||
-rw-r--r-- | src/proto/mbyte.pro | 1 | ||||
-rw-r--r-- | src/proto/misc1.pro | 1 | ||||
-rw-r--r-- | src/proto/misc2.pro | 21 | ||||
-rw-r--r-- | src/proto/strings.pro | 45 | ||||
-rw-r--r-- | src/strings.c | 1563 | ||||
-rw-r--r-- | src/version.c | 2 |
21 files changed, 1673 insertions, 1627 deletions
@@ -134,6 +134,7 @@ SRC_ALL = \ src/spell.h \ src/spellfile.c \ src/spellsuggest.c \ + src/strings.c \ src/structs.h \ src/syntax.c \ src/tag.c \ @@ -296,6 +297,7 @@ SRC_ALL = \ src/proto/spell.pro \ src/proto/spellfile.pro \ src/proto/spellsuggest.pro \ + src/proto/strings.pro \ src/proto/syntax.pro \ src/proto/tag.pro \ src/proto/term.pro \ diff --git a/src/Make_ami.mak b/src/Make_ami.mak index 91246d9bce..678f99994b 100644 --- a/src/Make_ami.mak +++ b/src/Make_ami.mak @@ -162,6 +162,7 @@ SRC += \ spell.c \ spellfile.c \ spellsuggest.c \ + strings.c \ syntax.c \ tag.c \ term.c \ diff --git a/src/Make_cyg_ming.mak b/src/Make_cyg_ming.mak index e93165dbf4..f12ffac8e0 100644 --- a/src/Make_cyg_ming.mak +++ b/src/Make_cyg_ming.mak @@ -809,6 +809,7 @@ OBJ = \ $(OUTDIR)/spell.o \ $(OUTDIR)/spellfile.o \ $(OUTDIR)/spellsuggest.o \ + $(OUTDIR)/strings.o \ $(OUTDIR)/syntax.o \ $(OUTDIR)/tag.o \ $(OUTDIR)/term.o \ diff --git a/src/Make_mvc.mak b/src/Make_mvc.mak index 4d6e49b377..8c8e71afd6 100644 --- a/src/Make_mvc.mak +++ b/src/Make_mvc.mak @@ -819,6 +819,7 @@ OBJ = \ $(OUTDIR)\spell.obj \ $(OUTDIR)\spellfile.obj \ $(OUTDIR)\spellsuggest.obj \ + $(OUTDIR)\strings.obj \ $(OUTDIR)\syntax.obj \ $(OUTDIR)\tag.obj \ $(OUTDIR)\term.obj \ @@ -1792,6 +1793,8 @@ $(OUTDIR)/spellfile.obj: $(OUTDIR) spellfile.c $(INCL) $(OUTDIR)/spellsuggest.obj: $(OUTDIR) spellsuggest.c $(INCL) +$(OUTDIR)/strings.obj: $(OUTDIR) strings.c $(INCL) + $(OUTDIR)/syntax.obj: $(OUTDIR) syntax.c $(INCL) $(OUTDIR)/tag.obj: $(OUTDIR) tag.c $(INCL) @@ -2012,6 +2015,7 @@ proto.h: \ proto/spell.pro \ proto/spellfile.pro \ proto/spellsuggest.pro \ + proto/strings.pro \ proto/syntax.pro \ proto/tag.pro \ proto/term.pro \ diff --git a/src/Make_vms.mms b/src/Make_vms.mms index 4928b0be86..3f65201c50 100644 --- a/src/Make_vms.mms +++ b/src/Make_vms.mms @@ -393,6 +393,7 @@ SRC = \ spell.c \ spellfile.c \ spellsuggest.c \ + strings.c \ syntax.c \ tag.c \ term.c \ @@ -512,6 +513,7 @@ OBJ = \ spell.obj \ spellfile.obj \ spellsuggest.obj \ + strings.obj \ syntax.obj \ tag.obj \ term.obj \ @@ -1048,6 +1050,10 @@ spellsuggest.obj : spellsuggest.c vim.h [.auto]config.h feature.h os_unix.h \ ascii.h keymap.h term.h macros.h option.h structs.h \ regexp.h gui.h beval.h [.proto]gui_beval.pro alloc.h ex_cmds.h spell.h \ proto.h errors.h globals.h +strings.obj : strings.c vim.h [.auto]config.h feature.h os_unix.h \ + ascii.h keymap.h term.h macros.h option.h structs.h \ + regexp.h gui.h beval.h [.proto]gui_beval.pro alloc.h ex_cmds.h spell.h \ + proto.h errors.h globals.h syntax.obj : syntax.c vim.h [.auto]config.h feature.h os_unix.h \ ascii.h keymap.h term.h macros.h structs.h regexp.h \ gui.h beval.h [.proto]gui_beval.pro option.h ex_cmds.h proto.h \ diff --git a/src/Makefile b/src/Makefile index 0efee51958..6fa9d25c61 100644 --- a/src/Makefile +++ b/src/Makefile @@ -1677,6 +1677,7 @@ BASIC_SRC = \ spell.c \ spellfile.c \ spellsuggest.c \ + strings.c \ syntax.c \ tag.c \ term.c \ @@ -1828,6 +1829,7 @@ OBJ_COMMON = \ objects/spell.o \ objects/spellfile.o \ objects/spellsuggest.o \ + objects/strings.o \ objects/syntax.o \ objects/tag.o \ objects/term.o \ @@ -2011,6 +2013,7 @@ PRO_AUTO = \ spell.pro \ spellfile.pro \ spellsuggest.pro \ + strings.pro \ syntax.pro \ tag.pro \ term.pro \ @@ -3516,6 +3519,9 @@ objects/spellfile.o: spellfile.c objects/spellsuggest.o: spellsuggest.c $(CCC) -o $@ spellsuggest.c +objects/strings.o: strings.c + $(CCC) -o $@ strings.c + objects/syntax.o: syntax.c $(CCC) -o $@ syntax.c @@ -4049,6 +4055,10 @@ objects/spellsuggest.o: spellsuggest.c vim.h protodef.h auto/config.h feature.h os_unix.h auto/osdef.h ascii.h keymap.h term.h macros.h option.h beval.h \ proto/gui_beval.pro structs.h regexp.h gui.h alloc.h ex_cmds.h spell.h \ proto.h errors.h globals.h +objects/strings.o: strings.c vim.h protodef.h auto/config.h feature.h os_unix.h \ + auto/osdef.h ascii.h keymap.h term.h macros.h option.h beval.h \ + proto/gui_beval.pro structs.h regexp.h gui.h alloc.h ex_cmds.h spell.h \ + proto.h errors.h globals.h objects/syntax.o: syntax.c vim.h protodef.h auto/config.h feature.h os_unix.h \ auto/osdef.h ascii.h keymap.h term.h macros.h option.h beval.h \ proto/gui_beval.pro structs.h regexp.h gui.h alloc.h ex_cmds.h spell.h \ diff --git a/src/README.md b/src/README.md index 81ca37d0d6..a3a23be2d6 100644 --- a/src/README.md +++ b/src/README.md @@ -80,6 +80,7 @@ sign.c | signs spell.c | spell checking core spellfile.c | spell file handling spellsuggest.c | spell correction suggestions +strings.c | string manipulation functions syntax.c | syntax and other highlighting tag.c | tags term.c | terminal handling, termcap codes diff --git a/src/eval.c b/src/eval.c index e0f0816030..4d94d67ee6 100644 --- a/src/eval.c +++ b/src/eval.c @@ -57,6 +57,7 @@ static int eval7_leader(typval_T *rettv, int numeric_only, char_u *start_leader, static int free_unref_items(int copyID); static char_u *make_expanded_name(char_u *in_start, char_u *expr_start, char_u *expr_end, char_u *in_end); +static char_u *eval_next_line(evalarg_T *evalarg); /* * Return "n1" divided by "n2", taking care of dividing by zero. @@ -2113,7 +2114,7 @@ getline_peek_skip_comments(evalarg_T *evalarg) * FALSE. * "arg" must point somewhere inside a line, not at the start. */ - char_u * + static char_u * eval_next_non_blank(char_u *arg, evalarg_T *evalarg, int *getnext) { char_u *p = skipwhite(arg); @@ -2144,7 +2145,7 @@ eval_next_non_blank(char_u *arg, evalarg_T *evalarg, int *getnext) * To be called after eval_next_non_blank() sets "getnext" to TRUE. * Only called for Vim9 script. */ - char_u * + static char_u * eval_next_line(evalarg_T *evalarg) { garray_T *gap = &evalarg->eval_ga; @@ -5172,50 +5173,6 @@ echo_string( } /* - * Return string "str" in ' quotes, doubling ' characters. - * If "str" is NULL an empty string is assumed. - * If "function" is TRUE make it function('string'). - */ - char_u * -string_quote(char_u *str, int function) -{ - unsigned len; - char_u *p, *r, *s; - - len = (function ? 13 : 3); - if (str != NULL) - { - len += (unsigned)STRLEN(str); - for (p = str; *p != NUL; MB_PTR_ADV(p)) - if (*p == '\'') - ++len; - } - s = r = alloc(len); - if (r != NULL) - { - if (function) - { - STRCPY(r, "function('"); - r += 10; - } - else - *r++ = '\''; - if (str != NULL) - for (p = str; *p != NUL; ) - { - if (*p == '\'') - *r++ = '\''; - MB_COPY_CHAR(p, r); - } - *r++ = '\''; - if (function) - *r++ = ')'; - *r++ = NUL; - } - return s; -} - -/* * Convert the specified byte index of line 'lnum' in buffer 'buf' to a * character index. Works only for loaded buffers. Returns -1 on failure. * The index of the first byte and the first character is zero. diff --git a/src/evalfunc.c b/src/evalfunc.c index 10477d1ca3..45df08d0c3 100644 --- a/src/evalfunc.c +++ b/src/evalfunc.c @@ -29,14 +29,10 @@ static void f_balloon_split(typval_T *argvars, typval_T *rettv); # endif #endif static void f_byte2line(typval_T *argvars, typval_T *rettv); -static void byteidx(typval_T *argvars, typval_T *rettv, int comp); -static void f_byteidx(typval_T *argvars, typval_T *rettv); -static void f_byteidxcomp(typval_T *argvars, typval_T *rettv); static void f_call(typval_T *argvars, typval_T *rettv); static void f_changenr(typval_T *argvars, typval_T *rettv); static void f_char2nr(typval_T *argvars, typval_T *rettv); static void f_charcol(typval_T *argvars, typval_T *rettv); -static void f_charidx(typval_T *argvars, typval_T *rettv); static void f_col(typval_T *argvars, typval_T *rettv); static void f_confirm(typval_T *argvars, typval_T *rettv); static void f_copy(typval_T *argvars, typval_T *rettv); @@ -83,7 +79,6 @@ static void f_hasmapto(typval_T *argvars, typval_T *rettv); static void f_hlID(typval_T *argvars, typval_T *rettv); static void f_hlexists(typval_T *argvars, typval_T *rettv); static void f_hostname(typval_T *argvars, typval_T *rettv); -static void f_iconv(typval_T *argvars, typval_T *rettv); static void f_index(typval_T *argvars, typval_T *rettv); static void f_input(typval_T *argvars, typval_T *rettv); static void f_inputdialog(typval_T *argvars, typval_T *rettv); @@ -173,19 +168,6 @@ static void f_spellbadword(typval_T *argvars, typval_T *rettv); static void f_spellsuggest(typval_T *argvars, typval_T *rettv); static void f_split(typval_T *argvars, typval_T *rettv); static void f_srand(typval_T *argvars, typval_T *rettv); -static void f_str2list(typval_T *argvars, typval_T *rettv); -static void f_str2nr(typval_T *argvars, typval_T *rettv); -static void f_strcharlen(typval_T *argvars, typval_T *rettv); -static void f_strchars(typval_T *argvars, typval_T *rettv); -static void f_strgetchar(typval_T *argvars, typval_T *rettv); -static void f_stridx(typval_T *argvars, typval_T *rettv); -static void f_strlen(typval_T *argvars, typval_T *rettv); -static void f_strcharpart(typval_T *argvars, typval_T *rettv); -static void f_strpart(typval_T *argvars, typval_T *rettv); -static void f_strridx(typval_T *argvars, typval_T *rettv); -static void f_strtrans(typval_T *argvars, typval_T *rettv); -static void f_strdisplaywidth(typval_T *argvars, typval_T *rettv); -static void f_strwidth(typval_T *argvars, typval_T *rettv); static void f_submatch(typval_T *argvars, typval_T *rettv); static void f_substitute(typval_T *argvars, typval_T *rettv); static void f_swapinfo(typval_T *argvars, typval_T *rettv); @@ -198,10 +180,6 @@ static void f_synconcealed(typval_T *argvars, typval_T *rettv); static void f_tabpagebuflist(typval_T *argvars, typval_T *rettv); static void f_taglist(typval_T *argvars, typval_T *rettv); static void f_tagfiles(typval_T *argvars, typval_T *rettv); -static void f_tolower(typval_T *argvars, typval_T *rettv); -static void f_toupper(typval_T *argvars, typval_T *rettv); -static void f_tr(typval_T *argvars, typval_T *rettv); -static void f_trim(typval_T *argvars, typval_T *rettv); static void f_type(typval_T *argvars, typval_T *rettv); static void f_virtcol(typval_T *argvars, typval_T *rettv); static void f_visualmode(typval_T *argvars, typval_T *rettv); @@ -2377,50 +2355,6 @@ f_byte2line(typval_T *argvars UNUSED, typval_T *rettv) #endif } - static void -byteidx(typval_T *argvars, typval_T *rettv, int comp UNUSED) -{ - char_u *t; - char_u *str; - varnumber_T idx; - - str = tv_get_string_chk(&argvars[0]); - idx = tv_get_number_chk(&argvars[1], NULL); - rettv->vval.v_number = -1; - if (str == NULL || idx < 0) - return; - - t = str; - for ( ; idx > 0; idx--) - { - if (*t == NUL) // EOL reached - return; - if (enc_utf8 && comp) - t += utf_ptr2len(t); - else - t += (*mb_ptr2len)(t); - } - rettv->vval.v_number = (varnumber_T)(t - str); -} - -/* - * "byteidx()" function - */ - static void -f_byteidx(typval_T *argvars, typval_T *rettv) -{ - byteidx(argvars, rettv, FALSE); -} - -/* - * "byteidxcomp()" function - */ - static void -f_byteidxcomp(typval_T *argvars, typval_T *rettv) -{ - byteidx(argvars, rettv, TRUE); -} - /* * "call(func, arglist [, dict])" function */ @@ -2552,58 +2486,6 @@ f_charcol(typval_T *argvars, typval_T *rettv) get_col(argvars, rettv, TRUE); } -/* - * "charidx()" function - */ - static void -f_charidx(typval_T *argvars, typval_T *rettv) -{ - char_u *str; - varnumber_T idx; - varnumber_T countcc = FALSE; - char_u *p; - int len; - int (*ptr2len)(char_u *); - - rettv->vval.v_number = -1; - - if (argvars[0].v_type != VAR_STRING || argvars[1].v_type != VAR_NUMBER - || (argvars[2].v_type != VAR_UNKNOWN - && argvars[2].v_type != VAR_NUMBER - && argvars[2].v_type != VAR_BOOL)) - { - emsg(_(e_invarg)); - return; - } - - str = tv_get_string_chk(&argvars[0]); - idx = tv_get_number_chk(&argvars[1], NULL); - if (str == NULL || idx < 0) - return; - - if (argvars[2].v_type != VAR_UNKNOWN) - countcc = tv_get_bool(&argvars[2]); - if (countcc < 0 || countcc > 1) - { - semsg(_(e_using_number_as_bool_nr), countcc); - return; - } - - if (enc_utf8 && countcc) - ptr2len = utf_ptr2len; - else - ptr2len = mb_ptr2len; - - for (p = str, len = 0; p <= str + idx; len++) - { - if (*p == NUL) - return; - p += ptr2len(p); - } - - rettv->vval.v_number = len > 0 ? len - 1 : 0; -} - win_T * get_optional_window(typval_T *argvars, int idx) { @@ -5781,37 +5663,6 @@ f_hostname(typval_T *argvars UNUSED, typval_T *rettv) } /* - * iconv() function - */ - static void -f_iconv(typval_T *argvars UNUSED, typval_T *rettv) -{ - char_u buf1[NUMBUFLEN]; - char_u buf2[NUMBUFLEN]; - char_u *from, *to, *str; - vimconv_T vimconv; - - rettv->v_type = VAR_STRING; - rettv->vval.v_string = NULL; - - str = tv_get_string(&argvars[0]); - from = enc_canonize(enc_skip(tv_get_string_buf(&argvars[1], buf1))); - to = enc_canonize(enc_skip(tv_get_string_buf(&argvars[2], buf2))); - vimconv.vc_type = CONV_NONE; - convert_setup(&vimconv, from, to); - - // If the encodings are equal, no conversion needed. - if (vimconv.vc_type == CONV_NONE) - rettv->vval.v_string = vim_strsave(str); - else - rettv->vval.v_string = string_convert(&vimconv, str, NULL); - - convert_setup(&vimconv, NULL, NULL); - vim_free(from); - vim_free(to); -} - -/* * "index()" function */ static void @@ -8787,452 +8638,6 @@ theend: } /* - * "str2list()" function - */ - static void -f_str2list(typval_T *argvars, typval_T *rettv) -{ - char_u *p; - int utf8 = FALSE; - - if (rettv_list_alloc(rettv) == FAIL) - return; - - if (argvars[1].v_type != VAR_UNKNOWN) - utf8 = (int)tv_get_bool_chk(&argvars[1], NULL); - - p = tv_get_string(&argvars[0]); - - if (has_mbyte || utf8) - { - int (*ptr2len)(char_u *); - int (*ptr2char)(char_u *); - - if (utf8 || enc_utf8) - { - ptr2len = utf_ptr2len; - ptr2char = utf_ptr2char; - } - else - { - ptr2len = mb_ptr2len; - ptr2char = mb_ptr2char; - } - - for ( ; *p != NUL; p += (*ptr2len)(p)) - list_append_number(rettv->vval.v_list, (*ptr2char)(p)); - } - else - for ( ; *p != NUL; ++p) - list_append_number(rettv->vval.v_list, *p); -} - -/* - * "str2nr()" function - */ - static void -f_str2nr(typval_T *argvars, typval_T *rettv) -{ - int base = 10; - char_u *p; - varnumber_T n; - int what = 0; - int isneg; - - if (argvars[1].v_type != VAR_UNKNOWN) - { - base = (int)tv_get_number(&argvars[1]); - if (base != 2 && base != 8 && base != 10 && base != 16) - { - emsg(_(e_invarg)); - return; - } - if (argvars[2].v_type != VAR_UNKNOWN && tv_get_bool(&argvars[2])) - what |= STR2NR_QUOTE; - } - - p = skipwhite(tv_get_string_strict(&argvars[0])); - isneg = (*p == '-'); - if (*p == '+' || *p == '-') - p = skipwhite(p + 1); - switch (base) - { - case 2: what |= STR2NR_BIN + STR2NR_FORCE; break; - case 8: what |= STR2NR_OCT + STR2NR_OOCT + STR2NR_FORCE; break; - case 16: what |= STR2NR_HEX + STR2NR_FORCE; break; - } - vim_str2nr(p, NULL, NULL, what, &n, NULL, 0, FALSE); - // Text after the number is silently ignored. - if (isneg) - rettv->vval.v_number = -n; - else - rettv->vval.v_number = n; - -} - -/* - * "strgetchar()" function - */ - static void -f_strgetchar(typval_T *argvars, typval_T *rettv) -{ - char_u *str; - int len; - int error = FALSE; - int charidx; - int byteidx = 0; - - rettv->vval.v_number = -1; - str = tv_get_string_chk(&argvars[0]); - if (str == NULL) - return; - len = (int)STRLEN(str); - charidx = (int)tv_get_number_chk(&argvars[1], &error); - if (error) - return; - - while (charidx >= 0 && byteidx < len) - { - if (charidx == 0) - { - rettv->vval.v_number = mb_ptr2char(str + byteidx); - break; - } - --charidx; - byteidx += MB_CPTR2LEN(str + byteidx); - } -} - -/* - * "stridx()" function - */ - static void -f_stridx(typval_T *argvars, typval_T *rettv) -{ - char_u buf[NUMBUFLEN]; - char_u *needle; - char_u *haystack; - char_u *save_haystack; - char_u *pos; - int start_idx; - - needle = tv_get_string_chk(&argvars[1]); - save_haystack = haystack = tv_get_string_buf_chk(&argvars[0], buf); - rettv->vval.v_number = -1; - if (needle == NULL || haystack == NULL) - return; // type error; errmsg already given - - if (argvars[2].v_type != VAR_UNKNOWN) - { - int error = FALSE; - - start_idx = (int)tv_get_number_chk(&argvars[2], &error); - if (error || start_idx >= (int)STRLEN(haystack)) - return; - if (start_idx >= 0) - haystack += start_idx; - } - - pos = (char_u *)strstr((char *)haystack, (char *)needle); - if (pos != NULL) - rettv->vval.v_number = (varnumber_T)(pos - save_haystack); -} - -/* - * "string()" function - */ - void -f_string(typval_T *argvars, typval_T *rettv) -{ - char_u *tofree; - char_u numbuf[NUMBUFLEN]; - - rettv->v_type = VAR_STRING; - rettv->vval.v_string = tv2string(&argvars[0], &tofree, numbuf, - get_copyID()); - // Make a copy if we have a value but it's not in allocated memory. - if (rettv->vval.v_string != NULL && tofree == NULL) - rettv->vval.v_string = vim_strsave(rettv->vval.v_string); -} - -/* - * "strlen()" function - */ - static void -f_strlen(typval_T *argvars, typval_T *rettv) -{ - rettv->vval.v_number = (varnumber_T)(STRLEN( - tv_get_string(&argvars[0]))); -} - - static void -strchar_common(typval_T *argvars, typval_T *rettv, int skipcc) -{ - char_u *s = tv_get_string(&argvars[0]); - varnumber_T len = 0; - int (*func_mb_ptr2char_adv)(char_u **pp); - - func_mb_ptr2char_adv = skipcc ? mb_ptr2char_adv : mb_cptr2char_adv; - while (*s != NUL) - { - func_mb_ptr2char_adv(&s); - ++len; - } - rettv->vval.v_number = len; -} - -/* - * "strcharlen()" function - */ - static void -f_strcharlen(typval_T *argvars, typval_T *rettv) -{ - strchar_common(argvars, rettv, TRUE); -} - -/* - * "strchars()" function - */ - static void -f_strchars(typval_T *argvars, typval_T *rettv) -{ - varnumber_T skipcc = FALSE; - - if (argvars[1].v_type != VAR_UNKNOWN) - skipcc = tv_get_bool(&argvars[1]); - if (skipcc < 0 || skipcc > 1) - semsg(_(e_using_number_as_bool_nr), skipcc); - else - strchar_common(argvars, rettv, skipcc); -} - -/* - * "strdisplaywidth()" function - */ - static void -f_strdisplaywidth(typval_T *argvars, typval_T *rettv) -{ - char_u *s = tv_get_string(&argvars[0]); - int col = 0; - - if (argvars[1].v_type != VAR_UNKNOWN) - col = (int)tv_get_number(&argvars[1]); - - rettv->vval.v_number = (varnumber_T)(linetabsize_col(col, s) - col); -} - -/* - * "strwidth()" function - */ - static void -f_strwidth(typval_T *argvars, typval_T *rettv) -{ - char_u *s = tv_get_string_strict(&argvars[0]); - - rettv->vval.v_number = (varnumber_T)(mb_string2cells(s, -1)); -} - -/* - * "strcharpart()" function - */ - static void -f_strcharpart(typval_T *argvars, typval_T *rettv) -{ - char_u *p; - int nchar; - int nbyte = 0; - int charlen; - int skipcc = FALSE; - int len = 0; - int slen; - int error = FALSE; - - p = tv_get_string(&argvars[0]); - slen = (int)STRLEN(p); - - nchar = (int)tv_get_number_chk(&argvars[1], &error); - if (!error) - { - if (argvars[2].v_type != VAR_UNKNOWN - && argvars[3].v_type != VAR_UNKNOWN) - { - skipcc = tv_get_bool(&argvars[3]); - if (skipcc < 0 || skipcc > 1) - { - semsg(_(e_using_number_as_bool_nr), skipcc); - return; - } - } - - if (nchar > 0) - while (nchar > 0 && nbyte < slen) - { - if (skipcc) - nbyte += mb_ptr2len(p + nbyte); - else - nbyte += MB_CPTR2LEN(p + nbyte); - --nchar; - } - else - nbyte = nchar; - if (argvars[2].v_type != VAR_UNKNOWN) - { - charlen = (int)tv_get_number(&argvars[2]); - while (charlen > 0 && nbyte + len < slen) - { - int off = nbyte + len; - - if (off < 0) - len += 1; - else - { - if (skipcc) - len += mb_ptr2len(p + off); - else - len += MB_CPTR2LEN(p + off); - } - --charlen; - } - } - else - len = slen - nbyte; // default: all bytes that are available. - } - - /* - * Only return the overlap between the specified part and the actual - * string. - */ - if (nbyte < 0) - { - len += nbyte; - nbyte = 0; - } - else if (nbyte > slen) - nbyte = slen; - if (len < 0) - len = 0; - else if (nbyte + len > slen) - len = slen - nbyte; - - rettv->v_type = VAR_STRING; - rettv->vval.v_string = vim_strnsave(p + nbyte, len); -} - -/* - * "strpart()" function - */ - static void -f_strpart(typval_T *argvars, typval_T *rettv) -{ - char_u *p; - int n; - int len; - int slen; - int error = FALSE; - - p = tv_get_string(&argvars[0]); - slen = (int)STRLEN(p); - - n = (int)tv_get_number_chk(&argvars[1], &error); - if (error) - len = 0; - else if (argvars[2].v_type != VAR_UNKNOWN) - len = (int)tv_get_number(&argvars[2]); - else - len = slen - n; // default len: all bytes that are available. - - // Only return the overlap between the specified part and the actual - // string. - if (n < 0) - { - len += n; - n = 0; - } - else if (n > slen) - n = slen; - if (len < 0) - len = 0; - else if (n + len > slen) - len = slen - n; - - if (argvars[2].v_type != VAR_UNKNOWN && argvars[3].v_type != VAR_UNKNOWN) - { - int off; - - // length in characters - for (off = n; off < slen && len > 0; --len) - off += mb_ptr2len(p + off); - len = off - n; - } - - rettv->v_type = VAR_STRING; - rettv->vval.v_string = vim_strnsave(p + n, len); -} - -/* - * "strridx()" function - */ - static void -f_strridx(typval_T *argvars, typval_T *rettv) -{ - char_u buf[NUMBUFLEN]; - char_u *needle; - char_u *haystack; - char_u *rest; - char_u *lastmatch = NULL; - int haystack_len, end_idx; - - needle = tv_get_string_chk(&argvars[1]); - haystack = tv_get_string_buf_chk(&argvars[0], buf); - - rettv->vval.v_number = -1; - if (needle == NULL || haystack == NULL) - return; // type error; errmsg already given - - haystack_len = (int)STRLEN(haystack); - if (argvars[2].v_type != VAR_UNKNOWN) - { - // Third argument: upper limit for index - end_idx = (int)tv_get_number_chk(&argvars[2], NULL); - if (end_idx < 0) - return; // can never find a match - } - else - end_idx = haystack_len; - - if (*needle == NUL) - { - // Empty string matches past the end. - lastmatch = haystack + end_idx; - } - else - { - for (rest = haystack; *rest != '\0'; ++rest) - { - rest = (char_u *)strstr((char *)rest, (char *)needle); - if (rest == NULL || rest > haystack + end_idx) - break; - lastmatch = rest; - } - } - - if (lastmatch == NULL) - rettv->vval.v_number = -1; - else - rettv->vval.v_number = (varnumber_T)(lastmatch - haystack); -} - -/* - * "strtrans()" function - */ - static void -f_strtrans(typval_T *argvars, typval_T *rettv) -{ - rettv->v_type = VAR_STRING; - rettv->vval.v_string = transstr(tv_get_string(&argvars[0])); -} - -/* * "submatch()" function */ static void @@ -9628,236 +9033,6 @@ f_taglist(typval_T *argvars, typval_T *rettv) } /* - * "tolower(string)" function - */ - static void -f_tolower(typval_T *argvars, typval_T *rettv) -{ - rettv->v_type = VAR_STRING; - rettv->vval.v_string = strlow_save(tv_get_string(&argvars[0])); -} - -/* - * "toupper(string)" function - */ - static void -f_toupper(typval_T *argvars, typval_T *rettv) -{ - rettv->v_type = VAR_STRING; - rettv->vval.v_string = strup_save(tv_get_string(&argvars[0])); -} - -/* - * "tr(string, fromstr, tostr)" function - */ - static void -f_tr(typval_T *argvars, typval_T *rettv) -{ - char_u *in_str; - char_u *fromstr; - char_u *tostr; - char_u *p; - int inlen; - int fromlen; - int tolen; - int idx; - char_u *cpstr; - int cplen; - int first = TRUE; - char_u buf[NUMBUFLEN]; - char_u buf2[NUMBUFLEN]; - garray_T ga; - - in_str = tv_get_string(&argvars[0]); - fromstr = tv_get_string_buf_chk(&argvars[1], buf); - tostr = tv_get_string_buf_chk(&argvars[2], buf2); - - // Default return value: empty string. - rettv->v_type = VAR_STRING; - rettv->vval.v_string = NULL; - if (fromstr == NULL || tostr == NULL) - return; // type error; errmsg already given - ga_init2(&ga, (int)sizeof(char), 80); - - if (!has_mbyte) - // not multi-byte: fromstr and tostr must be the same length - if (STRLEN(fromstr) != STRLEN(tostr)) - { -error: - semsg(_(e_invarg2), fromstr); - ga_clear(&ga); - return; - } - - // fromstr and tostr have to contain the same number of chars - while (*in_str != NUL) - { - if (has_mbyte) - { - inlen = (*mb_ptr2len)(in_str); - cpstr = in_str; - cplen = inlen; - idx = 0; - for (p = fromstr; *p != NUL; p += fromlen) - { - fromlen = (*mb_ptr2len)(p); - if (fromlen == inlen && STRNCMP(in_str, p, inlen) == 0) - { - for (p = tostr; *p != NUL; p += tolen) - { - tolen = (*mb_ptr2len)(p); - if (idx-- == 0) - { - cplen = tolen; - cpstr = p; - break; - } - } - if (*p == NUL) // tostr is shorter than fromstr - goto error; - break; - } - ++idx; - } - - if (first && cpstr == in_str) - { - // Check that fromstr and tostr have the same number of - // (multi-byte) characters. Done only once when a character - // of in_str doesn't appear in fromstr. - first = FALSE; - for (p = tostr; *p != NUL; p += tolen) - { - tolen = (*mb_ptr2len)(p); - --idx; - } - if (idx != 0) - goto error; - } - - (void)ga_grow(&ga, cplen); - mch_memmove((char *)ga.ga_data + ga.ga_len, cpstr, (size_t)cplen); - ga.ga_len += cplen; - - in_str += inlen; - } - else - { - // When not using multi-byte chars we can do it faster. - p = vim_strchr(fromstr, *in_str); - if (p != NULL) - ga_append(&ga, tostr[p - fromstr]); - else - ga_append(&ga, *in_str); - ++in_str; - } - } - |