Mercurial > vim
comparison src/evalfunc.c @ 17970:684a15da9929 v8.1.1981
patch 8.1.1981: the evalfunc.c file is too big
Commit: https://github.com/vim/vim/commit/08c308aeb5e7dfa18fa61f261b0bff79517a4883
Author: Bram Moolenaar <Bram@vim.org>
Date: Wed Sep 4 17:48:15 2019 +0200
patch 8.1.1981: the evalfunc.c file is too big
Problem: The evalfunc.c file is too big.
Solution: Move undo functions to undo.c. Move cmdline functions to
ex_getln.c. Move some container functions to list.c.
author | Bram Moolenaar <Bram@vim.org> |
---|---|
date | Wed, 04 Sep 2019 18:00:03 +0200 |
parents | 46f95606b9ec |
children | a170c48e0f91 |
comparison
equal
deleted
inserted
replaced
17969:bfc33cda9075 | 17970:684a15da9929 |
---|---|
22 | 22 |
23 #ifdef MACOS_X | 23 #ifdef MACOS_X |
24 # include <time.h> // for time_t | 24 # include <time.h> // for time_t |
25 #endif | 25 #endif |
26 | 26 |
27 static char *e_listblobarg = N_("E899: Argument of %s must be a List or Blob"); | |
28 | |
29 #ifdef FEAT_FLOAT | 27 #ifdef FEAT_FLOAT |
30 static void f_abs(typval_T *argvars, typval_T *rettv); | 28 static void f_abs(typval_T *argvars, typval_T *rettv); |
31 static void f_acos(typval_T *argvars, typval_T *rettv); | 29 static void f_acos(typval_T *argvars, typval_T *rettv); |
32 #endif | 30 #endif |
33 static void f_add(typval_T *argvars, typval_T *rettv); | |
34 static void f_and(typval_T *argvars, typval_T *rettv); | 31 static void f_and(typval_T *argvars, typval_T *rettv); |
35 static void f_append(typval_T *argvars, typval_T *rettv); | 32 static void f_append(typval_T *argvars, typval_T *rettv); |
36 static void f_appendbufline(typval_T *argvars, typval_T *rettv); | 33 static void f_appendbufline(typval_T *argvars, typval_T *rettv); |
37 #ifdef FEAT_FLOAT | 34 #ifdef FEAT_FLOAT |
38 static void f_asin(typval_T *argvars, typval_T *rettv); | 35 static void f_asin(typval_T *argvars, typval_T *rettv); |
71 static void f_copy(typval_T *argvars, typval_T *rettv); | 68 static void f_copy(typval_T *argvars, typval_T *rettv); |
72 #ifdef FEAT_FLOAT | 69 #ifdef FEAT_FLOAT |
73 static void f_cos(typval_T *argvars, typval_T *rettv); | 70 static void f_cos(typval_T *argvars, typval_T *rettv); |
74 static void f_cosh(typval_T *argvars, typval_T *rettv); | 71 static void f_cosh(typval_T *argvars, typval_T *rettv); |
75 #endif | 72 #endif |
76 static void f_count(typval_T *argvars, typval_T *rettv); | |
77 static void f_cscope_connection(typval_T *argvars, typval_T *rettv); | 73 static void f_cscope_connection(typval_T *argvars, typval_T *rettv); |
78 static void f_cursor(typval_T *argsvars, typval_T *rettv); | 74 static void f_cursor(typval_T *argsvars, typval_T *rettv); |
79 #ifdef MSWIN | 75 #ifdef MSWIN |
80 static void f_debugbreak(typval_T *argvars, typval_T *rettv); | 76 static void f_debugbreak(typval_T *argvars, typval_T *rettv); |
81 #endif | 77 #endif |
94 #ifdef FEAT_FLOAT | 90 #ifdef FEAT_FLOAT |
95 static void f_exp(typval_T *argvars, typval_T *rettv); | 91 static void f_exp(typval_T *argvars, typval_T *rettv); |
96 #endif | 92 #endif |
97 static void f_expand(typval_T *argvars, typval_T *rettv); | 93 static void f_expand(typval_T *argvars, typval_T *rettv); |
98 static void f_expandcmd(typval_T *argvars, typval_T *rettv); | 94 static void f_expandcmd(typval_T *argvars, typval_T *rettv); |
99 static void f_extend(typval_T *argvars, typval_T *rettv); | |
100 static void f_feedkeys(typval_T *argvars, typval_T *rettv); | 95 static void f_feedkeys(typval_T *argvars, typval_T *rettv); |
101 #ifdef FEAT_FLOAT | 96 #ifdef FEAT_FLOAT |
102 static void f_float2nr(typval_T *argvars, typval_T *rettv); | 97 static void f_float2nr(typval_T *argvars, typval_T *rettv); |
103 static void f_floor(typval_T *argvars, typval_T *rettv); | 98 static void f_floor(typval_T *argvars, typval_T *rettv); |
104 static void f_fmod(typval_T *argvars, typval_T *rettv); | 99 static void f_fmod(typval_T *argvars, typval_T *rettv); |
113 static void f_getbufline(typval_T *argvars, typval_T *rettv); | 108 static void f_getbufline(typval_T *argvars, typval_T *rettv); |
114 static void f_getchangelist(typval_T *argvars, typval_T *rettv); | 109 static void f_getchangelist(typval_T *argvars, typval_T *rettv); |
115 static void f_getchar(typval_T *argvars, typval_T *rettv); | 110 static void f_getchar(typval_T *argvars, typval_T *rettv); |
116 static void f_getcharmod(typval_T *argvars, typval_T *rettv); | 111 static void f_getcharmod(typval_T *argvars, typval_T *rettv); |
117 static void f_getcharsearch(typval_T *argvars, typval_T *rettv); | 112 static void f_getcharsearch(typval_T *argvars, typval_T *rettv); |
118 static void f_getcmdline(typval_T *argvars, typval_T *rettv); | |
119 static void f_getcmdpos(typval_T *argvars, typval_T *rettv); | |
120 static void f_getcmdtype(typval_T *argvars, typval_T *rettv); | |
121 static void f_getcmdwintype(typval_T *argvars, typval_T *rettv); | 113 static void f_getcmdwintype(typval_T *argvars, typval_T *rettv); |
122 static void f_getenv(typval_T *argvars, typval_T *rettv); | 114 static void f_getenv(typval_T *argvars, typval_T *rettv); |
123 static void f_getfontname(typval_T *argvars, typval_T *rettv); | 115 static void f_getfontname(typval_T *argvars, typval_T *rettv); |
124 static void f_getjumplist(typval_T *argvars, typval_T *rettv); | 116 static void f_getjumplist(typval_T *argvars, typval_T *rettv); |
125 static void f_getline(typval_T *argvars, typval_T *rettv); | 117 static void f_getline(typval_T *argvars, typval_T *rettv); |
147 static void f_inputdialog(typval_T *argvars, typval_T *rettv); | 139 static void f_inputdialog(typval_T *argvars, typval_T *rettv); |
148 static void f_inputlist(typval_T *argvars, typval_T *rettv); | 140 static void f_inputlist(typval_T *argvars, typval_T *rettv); |
149 static void f_inputrestore(typval_T *argvars, typval_T *rettv); | 141 static void f_inputrestore(typval_T *argvars, typval_T *rettv); |
150 static void f_inputsave(typval_T *argvars, typval_T *rettv); | 142 static void f_inputsave(typval_T *argvars, typval_T *rettv); |
151 static void f_inputsecret(typval_T *argvars, typval_T *rettv); | 143 static void f_inputsecret(typval_T *argvars, typval_T *rettv); |
152 static void f_insert(typval_T *argvars, typval_T *rettv); | |
153 static void f_invert(typval_T *argvars, typval_T *rettv); | 144 static void f_invert(typval_T *argvars, typval_T *rettv); |
154 static void f_islocked(typval_T *argvars, typval_T *rettv); | 145 static void f_islocked(typval_T *argvars, typval_T *rettv); |
155 #if defined(FEAT_FLOAT) && defined(HAVE_MATH_H) | 146 #if defined(FEAT_FLOAT) && defined(HAVE_MATH_H) |
156 static void f_isinf(typval_T *argvars, typval_T *rettv); | 147 static void f_isinf(typval_T *argvars, typval_T *rettv); |
157 static void f_isnan(typval_T *argvars, typval_T *rettv); | 148 static void f_isnan(typval_T *argvars, typval_T *rettv); |
219 static void f_remote_foreground(typval_T *argvars, typval_T *rettv); | 210 static void f_remote_foreground(typval_T *argvars, typval_T *rettv); |
220 static void f_remote_peek(typval_T *argvars, typval_T *rettv); | 211 static void f_remote_peek(typval_T *argvars, typval_T *rettv); |
221 static void f_remote_read(typval_T *argvars, typval_T *rettv); | 212 static void f_remote_read(typval_T *argvars, typval_T *rettv); |
222 static void f_remote_send(typval_T *argvars, typval_T *rettv); | 213 static void f_remote_send(typval_T *argvars, typval_T *rettv); |
223 static void f_remote_startserver(typval_T *argvars, typval_T *rettv); | 214 static void f_remote_startserver(typval_T *argvars, typval_T *rettv); |
224 static void f_remove(typval_T *argvars, typval_T *rettv); | |
225 static void f_rename(typval_T *argvars, typval_T *rettv); | 215 static void f_rename(typval_T *argvars, typval_T *rettv); |
226 static void f_repeat(typval_T *argvars, typval_T *rettv); | 216 static void f_repeat(typval_T *argvars, typval_T *rettv); |
227 static void f_reverse(typval_T *argvars, typval_T *rettv); | |
228 #ifdef FEAT_FLOAT | 217 #ifdef FEAT_FLOAT |
229 static void f_round(typval_T *argvars, typval_T *rettv); | 218 static void f_round(typval_T *argvars, typval_T *rettv); |
230 #endif | 219 #endif |
231 #ifdef FEAT_RUBY | 220 #ifdef FEAT_RUBY |
232 static void f_rubyeval(typval_T *argvars, typval_T *rettv); | 221 static void f_rubyeval(typval_T *argvars, typval_T *rettv); |
244 static void f_searchpos(typval_T *argvars, typval_T *rettv); | 233 static void f_searchpos(typval_T *argvars, typval_T *rettv); |
245 static void f_server2client(typval_T *argvars, typval_T *rettv); | 234 static void f_server2client(typval_T *argvars, typval_T *rettv); |
246 static void f_serverlist(typval_T *argvars, typval_T *rettv); | 235 static void f_serverlist(typval_T *argvars, typval_T *rettv); |
247 static void f_setbufline(typval_T *argvars, typval_T *rettv); | 236 static void f_setbufline(typval_T *argvars, typval_T *rettv); |
248 static void f_setcharsearch(typval_T *argvars, typval_T *rettv); | 237 static void f_setcharsearch(typval_T *argvars, typval_T *rettv); |
249 static void f_setcmdpos(typval_T *argvars, typval_T *rettv); | |
250 static void f_setenv(typval_T *argvars, typval_T *rettv); | 238 static void f_setenv(typval_T *argvars, typval_T *rettv); |
251 static void f_setfperm(typval_T *argvars, typval_T *rettv); | 239 static void f_setfperm(typval_T *argvars, typval_T *rettv); |
252 static void f_setline(typval_T *argvars, typval_T *rettv); | 240 static void f_setline(typval_T *argvars, typval_T *rettv); |
253 static void f_setpos(typval_T *argvars, typval_T *rettv); | 241 static void f_setpos(typval_T *argvars, typval_T *rettv); |
254 static void f_setreg(typval_T *argvars, typval_T *rettv); | 242 static void f_setreg(typval_T *argvars, typval_T *rettv); |
318 static void f_trim(typval_T *argvars, typval_T *rettv); | 306 static void f_trim(typval_T *argvars, typval_T *rettv); |
319 #ifdef FEAT_FLOAT | 307 #ifdef FEAT_FLOAT |
320 static void f_trunc(typval_T *argvars, typval_T *rettv); | 308 static void f_trunc(typval_T *argvars, typval_T *rettv); |
321 #endif | 309 #endif |
322 static void f_type(typval_T *argvars, typval_T *rettv); | 310 static void f_type(typval_T *argvars, typval_T *rettv); |
323 static void f_undofile(typval_T *argvars, typval_T *rettv); | |
324 static void f_undotree(typval_T *argvars, typval_T *rettv); | |
325 static void f_virtcol(typval_T *argvars, typval_T *rettv); | 311 static void f_virtcol(typval_T *argvars, typval_T *rettv); |
326 static void f_visualmode(typval_T *argvars, typval_T *rettv); | 312 static void f_visualmode(typval_T *argvars, typval_T *rettv); |
327 static void f_wildmenumode(typval_T *argvars, typval_T *rettv); | 313 static void f_wildmenumode(typval_T *argvars, typval_T *rettv); |
328 static void f_win_execute(typval_T *argvars, typval_T *rettv); | 314 static void f_win_execute(typval_T *argvars, typval_T *rettv); |
329 static void f_win_findbuf(typval_T *argvars, typval_T *rettv); | 315 static void f_win_findbuf(typval_T *argvars, typval_T *rettv); |
1216 rettv->vval.v_float = 0.0; | 1202 rettv->vval.v_float = 0.0; |
1217 } | 1203 } |
1218 #endif | 1204 #endif |
1219 | 1205 |
1220 /* | 1206 /* |
1221 * "add(list, item)" function | |
1222 */ | |
1223 static void | |
1224 f_add(typval_T *argvars, typval_T *rettv) | |
1225 { | |
1226 list_T *l; | |
1227 blob_T *b; | |
1228 | |
1229 rettv->vval.v_number = 1; /* Default: Failed */ | |
1230 if (argvars[0].v_type == VAR_LIST) | |
1231 { | |
1232 if ((l = argvars[0].vval.v_list) != NULL | |
1233 && !var_check_lock(l->lv_lock, | |
1234 (char_u *)N_("add() argument"), TRUE) | |
1235 && list_append_tv(l, &argvars[1]) == OK) | |
1236 copy_tv(&argvars[0], rettv); | |
1237 } | |
1238 else if (argvars[0].v_type == VAR_BLOB) | |
1239 { | |
1240 if ((b = argvars[0].vval.v_blob) != NULL | |
1241 && !var_check_lock(b->bv_lock, | |
1242 (char_u *)N_("add() argument"), TRUE)) | |
1243 { | |
1244 int error = FALSE; | |
1245 varnumber_T n = tv_get_number_chk(&argvars[1], &error); | |
1246 | |
1247 if (!error) | |
1248 { | |
1249 ga_append(&b->bv_ga, (int)n); | |
1250 copy_tv(&argvars[0], rettv); | |
1251 } | |
1252 } | |
1253 } | |
1254 else | |
1255 emsg(_(e_listblobreq)); | |
1256 } | |
1257 | |
1258 /* | |
1259 * "and(expr, expr)" function | 1207 * "and(expr, expr)" function |
1260 */ | 1208 */ |
1261 static void | 1209 static void |
1262 f_and(typval_T *argvars, typval_T *rettv) | 1210 f_and(typval_T *argvars, typval_T *rettv) |
1263 { | 1211 { |
2147 rettv->vval.v_float = 0.0; | 2095 rettv->vval.v_float = 0.0; |
2148 } | 2096 } |
2149 #endif | 2097 #endif |
2150 | 2098 |
2151 /* | 2099 /* |
2152 * "count()" function | |
2153 */ | |
2154 static void | |
2155 f_count(typval_T *argvars, typval_T *rettv) | |
2156 { | |
2157 long n = 0; | |
2158 int ic = FALSE; | |
2159 int error = FALSE; | |
2160 | |
2161 if (argvars[2].v_type != VAR_UNKNOWN) | |
2162 ic = (int)tv_get_number_chk(&argvars[2], &error); | |
2163 | |
2164 if (argvars[0].v_type == VAR_STRING) | |
2165 { | |
2166 char_u *expr = tv_get_string_chk(&argvars[1]); | |
2167 char_u *p = argvars[0].vval.v_string; | |
2168 char_u *next; | |
2169 | |
2170 if (!error && expr != NULL && *expr != NUL && p != NULL) | |
2171 { | |
2172 if (ic) | |
2173 { | |
2174 size_t len = STRLEN(expr); | |
2175 | |
2176 while (*p != NUL) | |
2177 { | |
2178 if (MB_STRNICMP(p, expr, len) == 0) | |
2179 { | |
2180 ++n; | |
2181 p += len; | |
2182 } | |
2183 else | |
2184 MB_PTR_ADV(p); | |
2185 } | |
2186 } | |
2187 else | |
2188 while ((next = (char_u *)strstr((char *)p, (char *)expr)) | |
2189 != NULL) | |
2190 { | |
2191 ++n; | |
2192 p = next + STRLEN(expr); | |
2193 } | |
2194 } | |
2195 | |
2196 } | |
2197 else if (argvars[0].v_type == VAR_LIST) | |
2198 { | |
2199 listitem_T *li; | |
2200 list_T *l; | |
2201 long idx; | |
2202 | |
2203 if ((l = argvars[0].vval.v_list) != NULL) | |
2204 { | |
2205 li = l->lv_first; | |
2206 if (argvars[2].v_type != VAR_UNKNOWN) | |
2207 { | |
2208 if (argvars[3].v_type != VAR_UNKNOWN) | |
2209 { | |
2210 idx = (long)tv_get_number_chk(&argvars[3], &error); | |
2211 if (!error) | |
2212 { | |
2213 li = list_find(l, idx); | |
2214 if (li == NULL) | |
2215 semsg(_(e_listidx), idx); | |
2216 } | |
2217 } | |
2218 if (error) | |
2219 li = NULL; | |
2220 } | |
2221 | |
2222 for ( ; li != NULL; li = li->li_next) | |
2223 if (tv_equal(&li->li_tv, &argvars[1], ic, FALSE)) | |
2224 ++n; | |
2225 } | |
2226 } | |
2227 else if (argvars[0].v_type == VAR_DICT) | |
2228 { | |
2229 int todo; | |
2230 dict_T *d; | |
2231 hashitem_T *hi; | |
2232 | |
2233 if ((d = argvars[0].vval.v_dict) != NULL) | |
2234 { | |
2235 if (argvars[2].v_type != VAR_UNKNOWN) | |
2236 { | |
2237 if (argvars[3].v_type != VAR_UNKNOWN) | |
2238 emsg(_(e_invarg)); | |
2239 } | |
2240 | |
2241 todo = error ? 0 : (int)d->dv_hashtab.ht_used; | |
2242 for (hi = d->dv_hashtab.ht_array; todo > 0; ++hi) | |
2243 { | |
2244 if (!HASHITEM_EMPTY(hi)) | |
2245 { | |
2246 --todo; | |
2247 if (tv_equal(&HI2DI(hi)->di_tv, &argvars[1], ic, FALSE)) | |
2248 ++n; | |
2249 } | |
2250 } | |
2251 } | |
2252 } | |
2253 else | |
2254 semsg(_(e_listdictarg), "count()"); | |
2255 rettv->vval.v_number = n; | |
2256 } | |
2257 | |
2258 /* | |
2259 * "cscope_connection([{num} , {dbpath} [, {prepend}]])" function | 2100 * "cscope_connection([{num} , {dbpath} [, {prepend}]])" function |
2260 * | 2101 * |
2261 * Checks the existence of a cscope connection. | 2102 * Checks the existence of a cscope connection. |
2262 */ | 2103 */ |
2263 static void | 2104 static void |
3039 expand_filename(&eap, &cmdstr, &errormsg); | 2880 expand_filename(&eap, &cmdstr, &errormsg); |
3040 if (errormsg != NULL && *errormsg != NUL) | 2881 if (errormsg != NULL && *errormsg != NUL) |
3041 emsg(errormsg); | 2882 emsg(errormsg); |
3042 | 2883 |
3043 rettv->vval.v_string = cmdstr; | 2884 rettv->vval.v_string = cmdstr; |
3044 } | |
3045 | |
3046 /* | |
3047 * "extend(list, list [, idx])" function | |
3048 * "extend(dict, dict [, action])" function | |
3049 */ | |
3050 static void | |
3051 f_extend(typval_T *argvars, typval_T *rettv) | |
3052 { | |
3053 char_u *arg_errmsg = (char_u *)N_("extend() argument"); | |
3054 | |
3055 if (argvars[0].v_type == VAR_LIST && argvars[1].v_type == VAR_LIST) | |
3056 { | |
3057 list_T *l1, *l2; | |
3058 listitem_T *item; | |
3059 long before; | |
3060 int error = FALSE; | |
3061 | |
3062 l1 = argvars[0].vval.v_list; | |
3063 l2 = argvars[1].vval.v_list; | |
3064 if (l1 != NULL && !var_check_lock(l1->lv_lock, arg_errmsg, TRUE) | |
3065 && l2 != NULL) | |
3066 { | |
3067 if (argvars[2].v_type != VAR_UNKNOWN) | |
3068 { | |
3069 before = (long)tv_get_number_chk(&argvars[2], &error); | |
3070 if (error) | |
3071 return; /* type error; errmsg already given */ | |
3072 | |
3073 if (before == l1->lv_len) | |
3074 item = NULL; | |
3075 else | |
3076 { | |
3077 item = list_find(l1, before); | |
3078 if (item == NULL) | |
3079 { | |
3080 semsg(_(e_listidx), before); | |
3081 return; | |
3082 } | |
3083 } | |
3084 } | |
3085 else | |
3086 item = NULL; | |
3087 list_extend(l1, l2, item); | |
3088 | |
3089 copy_tv(&argvars[0], rettv); | |
3090 } | |
3091 } | |
3092 else if (argvars[0].v_type == VAR_DICT && argvars[1].v_type == VAR_DICT) | |
3093 { | |
3094 dict_T *d1, *d2; | |
3095 char_u *action; | |
3096 int i; | |
3097 | |
3098 d1 = argvars[0].vval.v_dict; | |
3099 d2 = argvars[1].vval.v_dict; | |
3100 if (d1 != NULL && !var_check_lock(d1->dv_lock, arg_errmsg, TRUE) | |
3101 && d2 != NULL) | |
3102 { | |
3103 /* Check the third argument. */ | |
3104 if (argvars[2].v_type != VAR_UNKNOWN) | |
3105 { | |
3106 static char *(av[]) = {"keep", "force", "error"}; | |
3107 | |
3108 action = tv_get_string_chk(&argvars[2]); | |
3109 if (action == NULL) | |
3110 return; /* type error; errmsg already given */ | |
3111 for (i = 0; i < 3; ++i) | |
3112 if (STRCMP(action, av[i]) == 0) | |
3113 break; | |
3114 if (i == 3) | |
3115 { | |
3116 semsg(_(e_invarg2), action); | |
3117 return; | |
3118 } | |
3119 } | |
3120 else | |
3121 action = (char_u *)"force"; | |
3122 | |
3123 dict_extend(d1, d2, action); | |
3124 | |
3125 copy_tv(&argvars[0], rettv); | |
3126 } | |
3127 } | |
3128 else | |
3129 semsg(_(e_listdictarg), "extend()"); | |
3130 } | 2885 } |
3131 | 2886 |
3132 /* | 2887 /* |
3133 * "feedkeys()" function | 2888 * "feedkeys()" function |
3134 */ | 2889 */ |
4057 dict_add_number(dict, "until", last_csearch_until()); | 3812 dict_add_number(dict, "until", last_csearch_until()); |
4058 } | 3813 } |
4059 } | 3814 } |
4060 | 3815 |
4061 /* | 3816 /* |
4062 * "getcmdline()" function | |
4063 */ | |
4064 static void | |
4065 f_getcmdline(typval_T *argvars UNUSED, typval_T *rettv) | |
4066 { | |
4067 rettv->v_type = VAR_STRING; | |
4068 rettv->vval.v_string = get_cmdline_str(); | |
4069 } | |
4070 | |
4071 /* | |
4072 * "getcmdpos()" function | |
4073 */ | |
4074 static void | |
4075 f_getcmdpos(typval_T *argvars UNUSED, typval_T *rettv) | |
4076 { | |
4077 rettv->vval.v_number = get_cmdline_pos() + 1; | |
4078 } | |
4079 | |
4080 /* | |
4081 * "getcmdtype()" function | |
4082 */ | |
4083 static void | |
4084 f_getcmdtype(typval_T *argvars UNUSED, typval_T *rettv) | |
4085 { | |
4086 rettv->v_type = VAR_STRING; | |
4087 rettv->vval.v_string = alloc(2); | |
4088 if (rettv->vval.v_string != NULL) | |
4089 { | |
4090 rettv->vval.v_string[0] = get_cmdline_type(); | |
4091 rettv->vval.v_string[1] = NUL; | |
4092 } | |
4093 } | |
4094 | |
4095 /* | |
4096 * "getcmdwintype()" function | 3817 * "getcmdwintype()" function |
4097 */ | 3818 */ |
4098 static void | 3819 static void |
4099 f_getcmdwintype(typval_T *argvars UNUSED, typval_T *rettv) | 3820 f_getcmdwintype(typval_T *argvars UNUSED, typval_T *rettv) |
4100 { | 3821 { |
5730 ++cmdline_star; | 5451 ++cmdline_star; |
5731 ++inputsecret_flag; | 5452 ++inputsecret_flag; |
5732 f_input(argvars, rettv); | 5453 f_input(argvars, rettv); |
5733 --cmdline_star; | 5454 --cmdline_star; |
5734 --inputsecret_flag; | 5455 --inputsecret_flag; |
5735 } | |
5736 | |
5737 /* | |
5738 * "insert()" function | |
5739 */ | |
5740 static void | |
5741 f_insert(typval_T *argvars, typval_T *rettv) | |
5742 { | |
5743 long before = 0; | |
5744 listitem_T *item; | |
5745 list_T *l; | |
5746 int error = FALSE; | |
5747 | |
5748 if (argvars[0].v_type == VAR_BLOB) | |
5749 { | |
5750 int val, len; | |
5751 char_u *p; | |
5752 | |
5753 len = blob_len(argvars[0].vval.v_blob); | |
5754 if (argvars[2].v_type != VAR_UNKNOWN) | |
5755 { | |
5756 before = (long)tv_get_number_chk(&argvars[2], &error); | |
5757 if (error) | |
5758 return; // type error; errmsg already given | |
5759 if (before < 0 || before > len) | |
5760 { | |
5761 semsg(_(e_invarg2), tv_get_string(&argvars[2])); | |
5762 return; | |
5763 } | |
5764 } | |
5765 val = tv_get_number_chk(&argvars[1], &error); | |
5766 if (error) | |
5767 return; | |
5768 if (val < 0 || val > 255) | |
5769 { | |
5770 semsg(_(e_invarg2), tv_get_string(&argvars[1])); | |
5771 return; | |
5772 } | |
5773 | |
5774 if (ga_grow(&argvars[0].vval.v_blob->bv_ga, 1) == FAIL) | |
5775 return; | |
5776 p = (char_u *)argvars[0].vval.v_blob->bv_ga.ga_data; | |
5777 mch_memmove(p + before + 1, p + before, (size_t)len - before); | |
5778 *(p + before) = val; | |
5779 ++argvars[0].vval.v_blob->bv_ga.ga_len; | |
5780 | |
5781 copy_tv(&argvars[0], rettv); | |
5782 } | |
5783 else if (argvars[0].v_type != VAR_LIST) | |
5784 semsg(_(e_listblobarg), "insert()"); | |
5785 else if ((l = argvars[0].vval.v_list) != NULL | |
5786 && !var_check_lock(l->lv_lock, | |
5787 (char_u *)N_("insert() argument"), TRUE)) | |
5788 { | |
5789 if (argvars[2].v_type != VAR_UNKNOWN) | |
5790 before = (long)tv_get_number_chk(&argvars[2], &error); | |
5791 if (error) | |
5792 return; /* type error; errmsg already given */ | |
5793 | |
5794 if (before == l->lv_len) | |
5795 item = NULL; | |
5796 else | |
5797 { | |
5798 item = list_find(l, before); | |
5799 if (item == NULL) | |
5800 { | |
5801 semsg(_(e_listidx), before); | |
5802 l = NULL; | |
5803 } | |
5804 } | |
5805 if (l != NULL) | |
5806 { | |
5807 list_insert_tv(l, &argvars[1], item); | |
5808 copy_tv(&argvars[0], rettv); | |
5809 } | |
5810 } | |
5811 } | 5456 } |
5812 | 5457 |
5813 /* | 5458 /* |
5814 * "invert(expr)" function | 5459 * "invert(expr)" function |
5815 */ | 5460 */ |
7360 emsg(_("E942: +clientserver feature not available")); | 7005 emsg(_("E942: +clientserver feature not available")); |
7361 #endif | 7006 #endif |
7362 } | 7007 } |
7363 | 7008 |
7364 /* | 7009 /* |
7365 * "remove()" function | |
7366 */ | |
7367 static void | |
7368 f_remove(typval_T *argvars, typval_T *rettv) | |
7369 { | |
7370 char_u *arg_errmsg = (char_u *)N_("remove() argument"); | |
7371 | |
7372 if (argvars[0].v_type == VAR_DICT) | |
7373 dict_remove(argvars, rettv, arg_errmsg); | |
7374 else if (argvars[0].v_type == VAR_BLOB) | |
7375 blob_remove(argvars, rettv); | |
7376 else if (argvars[0].v_type == VAR_LIST) | |
7377 list_remove(argvars, rettv, arg_errmsg); | |
7378 else | |
7379 semsg(_(e_listdictblobarg), "remove()"); | |
7380 } | |
7381 | |
7382 /* | |
7383 * "rename({from}, {to})" function | 7010 * "rename({from}, {to})" function |
7384 */ | 7011 */ |
7385 static void | 7012 static void |
7386 f_rename(typval_T *argvars, typval_T *rettv) | 7013 f_rename(typval_T *argvars, typval_T *rettv) |
7387 { | 7014 { |
7434 mch_memmove(r + i * slen, p, (size_t)slen); | 7061 mch_memmove(r + i * slen, p, (size_t)slen); |
7435 r[len] = NUL; | 7062 r[len] = NUL; |
7436 } | 7063 } |
7437 | 7064 |
7438 rettv->vval.v_string = r; | 7065 rettv->vval.v_string = r; |
7439 } | |
7440 } | |
7441 | |
7442 /* | |
7443 * "reverse({list})" function | |
7444 */ | |
7445 static void | |
7446 f_reverse(typval_T *argvars, typval_T *rettv) | |
7447 { | |
7448 list_T *l; | |
7449 listitem_T *li, *ni; | |
7450 | |
7451 if (argvars[0].v_type == VAR_BLOB) | |
7452 { | |
7453 blob_T *b = argvars[0].vval.v_blob; | |
7454 int i, len = blob_len(b); | |
7455 | |
7456 for (i = 0; i < len / 2; i++) | |
7457 { | |
7458 int tmp = blob_get(b, i); | |
7459 | |
7460 blob_set(b, i, blob_get(b, len - i - 1)); | |
7461 blob_set(b, len - i - 1, tmp); | |
7462 } | |
7463 rettv_blob_set(rettv, b); | |
7464 return; | |
7465 } | |
7466 | |
7467 if (argvars[0].v_type != VAR_LIST) | |
7468 semsg(_(e_listblobarg), "reverse()"); | |
7469 else if ((l = argvars[0].vval.v_list) != NULL | |
7470 && !var_check_lock(l->lv_lock, | |
7471 (char_u *)N_("reverse() argument"), TRUE)) | |
7472 { | |
7473 li = l->lv_last; | |
7474 l->lv_first = l->lv_last = NULL; | |
7475 l->lv_len = 0; | |
7476 while (li != NULL) | |
7477 { | |
7478 ni = li->li_prev; | |
7479 list_append(l, li); | |
7480 li = ni; | |
7481 } | |
7482 rettv_list_set(rettv, l); | |
7483 l->lv_idx = l->lv_len - l->lv_idx - 1; | |
7484 } | 7066 } |
7485 } | 7067 } |
7486 | 7068 |
7487 #define SP_NOMOVE 0x01 /* don't move cursor */ | 7069 #define SP_NOMOVE 0x01 /* don't move cursor */ |
7488 #define SP_REPEAT 0x02 /* repeat to find outer pair */ | 7070 #define SP_REPEAT 0x02 /* repeat to find outer pair */ |
8285 set_csearch_until(!!tv_get_number(&di->di_tv)); | 7867 set_csearch_until(!!tv_get_number(&di->di_tv)); |
8286 } | 7868 } |
8287 } | 7869 } |
8288 | 7870 |
8289 /* | 7871 /* |
8290 * "setcmdpos()" function | |
8291 */ | |
8292 static void | |
8293 f_setcmdpos(typval_T *argvars, typval_T *rettv) | |
8294 { | |
8295 int pos = (int)tv_get_number(&argvars[0]) - 1; | |
8296 | |
8297 if (pos >= 0) | |
8298 rettv->vval.v_number = set_cmdline_pos(pos); | |
8299 } | |
8300 | |
8301 /* | |
8302 * "setenv()" function | 7872 * "setenv()" function |
8303 */ | 7873 */ |
8304 static void | 7874 static void |
8305 f_setenv(typval_T *argvars, typval_T *rettv UNUSED) | 7875 f_setenv(typval_T *argvars, typval_T *rettv UNUSED) |
8306 { | 7876 { |
10571 } | 10141 } |
10572 rettv->vval.v_number = n; | 10142 rettv->vval.v_number = n; |
10573 } | 10143 } |
10574 | 10144 |
10575 /* | 10145 /* |
10576 * "undofile(name)" function | |
10577 */ | |
10578 static void | |
10579 f_undofile(typval_T *argvars UNUSED, typval_T *rettv) | |
10580 { | |
10581 rettv->v_type = VAR_STRING; | |
10582 #ifdef FEAT_PERSISTENT_UNDO | |
10583 { | |
10584 char_u *fname = tv_get_string(&argvars[0]); | |
10585 | |
10586 if (*fname == NUL) | |
10587 { | |
10588 /* If there is no file name there will be no undo file. */ | |
10589 rettv->vval.v_string = NULL; | |
10590 } | |
10591 else | |
10592 { | |
10593 char_u *ffname = FullName_save(fname, TRUE); | |
10594 | |
10595 if (ffname != NULL) | |
10596 rettv->vval.v_string = u_get_undo_file_name(ffname, FALSE); | |
10597 vim_free(ffname); | |
10598 } | |
10599 } | |
10600 #else | |
10601 rettv->vval.v_string = NULL; | |
10602 #endif | |
10603 } | |
10604 | |
10605 /* | |
10606 * "undotree()" function | |
10607 */ | |
10608 static void | |
10609 f_undotree(typval_T *argvars UNUSED, typval_T *rettv) | |
10610 { | |
10611 if (rettv_dict_alloc(rettv) == OK) | |
10612 { | |
10613 dict_T *dict = rettv->vval.v_dict; | |
10614 list_T *list; | |
10615 | |
10616 dict_add_number(dict, "synced", (long)curbuf->b_u_synced); | |
10617 dict_add_number(dict, "seq_last", curbuf->b_u_seq_last); | |
10618 dict_add_number(dict, "save_last", (long)curbuf->b_u_save_nr_last); | |
10619 dict_add_number(dict, "seq_cur", curbuf->b_u_seq_cur); | |
10620 dict_add_number(dict, "time_cur", (long)curbuf->b_u_time_cur); | |
10621 dict_add_number(dict, "save_cur", (long)curbuf->b_u_save_nr_cur); | |
10622 | |
10623 list = list_alloc(); | |
10624 if (list != NULL) | |
10625 { | |
10626 u_eval_tree(curbuf->b_u_oldhead, list); | |
10627 dict_add_list(dict, "entries", list); | |
10628 } | |
10629 } | |
10630 } | |
10631 | |
10632 /* | |
10633 * "virtcol(string)" function | 10146 * "virtcol(string)" function |
10634 */ | 10147 */ |
10635 static void | 10148 static void |
10636 f_virtcol(typval_T *argvars, typval_T *rettv) | 10149 f_virtcol(typval_T *argvars, typval_T *rettv) |
10637 { | 10150 { |