comparison src/evalfunc.c @ 17986:5c8906f653f5 v8.1.1989

patch 8.1.1989: the evalfunc.c file is still too big Commit: https://github.com/vim/vim/commit/af7645d3733fdd3cd2df03ec7b653601d26969ef Author: Bram Moolenaar <Bram@vim.org> Date: Thu Sep 5 22:33:28 2019 +0200 patch 8.1.1989: the evalfunc.c file is still too big Problem: The evalfunc.c file is still too big. Solution: Move f_pathshorten() to filepath.c. Move f_cscope_connection() to if_cscope.c. Move diff_ functions to diff.c. Move timer_ functions to ex_cmds2.c. move callback functions to evalvars.c.
author Bram Moolenaar <Bram@vim.org>
date Thu, 05 Sep 2019 22:45:04 +0200
parents 2029737e6a22
children 0dcc2ee838dd
comparison
equal deleted inserted replaced
17985:9b43688b26bf 17986:5c8906f653f5
68 static void f_copy(typval_T *argvars, typval_T *rettv); 68 static void f_copy(typval_T *argvars, typval_T *rettv);
69 #ifdef FEAT_FLOAT 69 #ifdef FEAT_FLOAT
70 static void f_cos(typval_T *argvars, typval_T *rettv); 70 static void f_cos(typval_T *argvars, typval_T *rettv);
71 static void f_cosh(typval_T *argvars, typval_T *rettv); 71 static void f_cosh(typval_T *argvars, typval_T *rettv);
72 #endif 72 #endif
73 static void f_cscope_connection(typval_T *argvars, typval_T *rettv);
74 static void f_cursor(typval_T *argsvars, typval_T *rettv); 73 static void f_cursor(typval_T *argsvars, typval_T *rettv);
75 #ifdef MSWIN 74 #ifdef MSWIN
76 static void f_debugbreak(typval_T *argvars, typval_T *rettv); 75 static void f_debugbreak(typval_T *argvars, typval_T *rettv);
77 #endif 76 #endif
78 static void f_deepcopy(typval_T *argvars, typval_T *rettv); 77 static void f_deepcopy(typval_T *argvars, typval_T *rettv);
79 static void f_deletebufline(typval_T *argvars, typval_T *rettv); 78 static void f_deletebufline(typval_T *argvars, typval_T *rettv);
80 static void f_did_filetype(typval_T *argvars, typval_T *rettv); 79 static void f_did_filetype(typval_T *argvars, typval_T *rettv);
81 static void f_diff_filler(typval_T *argvars, typval_T *rettv);
82 static void f_diff_hlID(typval_T *argvars, typval_T *rettv);
83 static void f_empty(typval_T *argvars, typval_T *rettv); 80 static void f_empty(typval_T *argvars, typval_T *rettv);
84 static void f_environ(typval_T *argvars, typval_T *rettv); 81 static void f_environ(typval_T *argvars, typval_T *rettv);
85 static void f_escape(typval_T *argvars, typval_T *rettv); 82 static void f_escape(typval_T *argvars, typval_T *rettv);
86 static void f_eval(typval_T *argvars, typval_T *rettv); 83 static void f_eval(typval_T *argvars, typval_T *rettv);
87 static void f_eventhandler(typval_T *argvars, typval_T *rettv); 84 static void f_eventhandler(typval_T *argvars, typval_T *rettv);
176 static void f_mzeval(typval_T *argvars, typval_T *rettv); 173 static void f_mzeval(typval_T *argvars, typval_T *rettv);
177 #endif 174 #endif
178 static void f_nextnonblank(typval_T *argvars, typval_T *rettv); 175 static void f_nextnonblank(typval_T *argvars, typval_T *rettv);
179 static void f_nr2char(typval_T *argvars, typval_T *rettv); 176 static void f_nr2char(typval_T *argvars, typval_T *rettv);
180 static void f_or(typval_T *argvars, typval_T *rettv); 177 static void f_or(typval_T *argvars, typval_T *rettv);
181 static void f_pathshorten(typval_T *argvars, typval_T *rettv);
182 #ifdef FEAT_PERL 178 #ifdef FEAT_PERL
183 static void f_perleval(typval_T *argvars, typval_T *rettv); 179 static void f_perleval(typval_T *argvars, typval_T *rettv);
184 #endif 180 #endif
185 #ifdef FEAT_FLOAT 181 #ifdef FEAT_FLOAT
186 static void f_pow(typval_T *argvars, typval_T *rettv); 182 static void f_pow(typval_T *argvars, typval_T *rettv);
288 static void f_taglist(typval_T *argvars, typval_T *rettv); 284 static void f_taglist(typval_T *argvars, typval_T *rettv);
289 static void f_tagfiles(typval_T *argvars, typval_T *rettv); 285 static void f_tagfiles(typval_T *argvars, typval_T *rettv);
290 #ifdef FEAT_FLOAT 286 #ifdef FEAT_FLOAT
291 static void f_tan(typval_T *argvars, typval_T *rettv); 287 static void f_tan(typval_T *argvars, typval_T *rettv);
292 static void f_tanh(typval_T *argvars, typval_T *rettv); 288 static void f_tanh(typval_T *argvars, typval_T *rettv);
293 #endif
294 #ifdef FEAT_TIMERS
295 static void f_timer_info(typval_T *argvars, typval_T *rettv);
296 static void f_timer_pause(typval_T *argvars, typval_T *rettv);
297 static void f_timer_start(typval_T *argvars, typval_T *rettv);
298 static void f_timer_stop(typval_T *argvars, typval_T *rettv);
299 static void f_timer_stopall(typval_T *argvars, typval_T *rettv);
300 #endif 289 #endif
301 static void f_tolower(typval_T *argvars, typval_T *rettv); 290 static void f_tolower(typval_T *argvars, typval_T *rettv);
302 static void f_toupper(typval_T *argvars, typval_T *rettv); 291 static void f_toupper(typval_T *argvars, typval_T *rettv);
303 static void f_tr(typval_T *argvars, typval_T *rettv); 292 static void f_tr(typval_T *argvars, typval_T *rettv);
304 static void f_trim(typval_T *argvars, typval_T *rettv); 293 static void f_trim(typval_T *argvars, typval_T *rettv);
2093 rettv->vval.v_float = 0.0; 2082 rettv->vval.v_float = 0.0;
2094 } 2083 }
2095 #endif 2084 #endif
2096 2085
2097 /* 2086 /*
2098 * "cscope_connection([{num} , {dbpath} [, {prepend}]])" function
2099 *
2100 * Checks the existence of a cscope connection.
2101 */
2102 static void
2103 f_cscope_connection(typval_T *argvars UNUSED, typval_T *rettv UNUSED)
2104 {
2105 #ifdef FEAT_CSCOPE
2106 int num = 0;
2107 char_u *dbpath = NULL;
2108 char_u *prepend = NULL;
2109 char_u buf[NUMBUFLEN];
2110
2111 if (argvars[0].v_type != VAR_UNKNOWN
2112 && argvars[1].v_type != VAR_UNKNOWN)
2113 {
2114 num = (int)tv_get_number(&argvars[0]);
2115 dbpath = tv_get_string(&argvars[1]);
2116 if (argvars[2].v_type != VAR_UNKNOWN)
2117 prepend = tv_get_string_buf(&argvars[2], buf);
2118 }
2119
2120 rettv->vval.v_number = cs_connection(num, dbpath, prepend);
2121 #endif
2122 }
2123
2124 /*
2125 * "cursor(lnum, col)" function, or 2087 * "cursor(lnum, col)" function, or
2126 * "cursor(list)" 2088 * "cursor(list)"
2127 * 2089 *
2128 * Moves the cursor to the specified line and column. 2090 * Moves the cursor to the specified line and column.
2129 * Returns 0 when the position could be set, -1 otherwise. 2091 * Returns 0 when the position could be set, -1 otherwise.
2317 */ 2279 */
2318 static void 2280 static void
2319 f_did_filetype(typval_T *argvars UNUSED, typval_T *rettv UNUSED) 2281 f_did_filetype(typval_T *argvars UNUSED, typval_T *rettv UNUSED)
2320 { 2282 {
2321 rettv->vval.v_number = did_filetype; 2283 rettv->vval.v_number = did_filetype;
2322 }
2323
2324 /*
2325 * "diff_filler()" function
2326 */
2327 static void
2328 f_diff_filler(typval_T *argvars UNUSED, typval_T *rettv UNUSED)
2329 {
2330 #ifdef FEAT_DIFF
2331 rettv->vval.v_number = diff_check_fill(curwin, tv_get_lnum(argvars));
2332 #endif
2333 }
2334
2335 /*
2336 * "diff_hlID()" function
2337 */
2338 static void
2339 f_diff_hlID(typval_T *argvars UNUSED, typval_T *rettv UNUSED)
2340 {
2341 #ifdef FEAT_DIFF
2342 linenr_T lnum = tv_get_lnum(argvars);
2343 static linenr_T prev_lnum = 0;
2344 static varnumber_T changedtick = 0;
2345 static int fnum = 0;
2346 static int change_start = 0;
2347 static int change_end = 0;
2348 static hlf_T hlID = (hlf_T)0;
2349 int filler_lines;
2350 int col;
2351
2352 if (lnum < 0) /* ignore type error in {lnum} arg */
2353 lnum = 0;
2354 if (lnum != prev_lnum
2355 || changedtick != CHANGEDTICK(curbuf)
2356 || fnum != curbuf->b_fnum)
2357 {
2358 /* New line, buffer, change: need to get the values. */
2359 filler_lines = diff_check(curwin, lnum);
2360 if (filler_lines < 0)
2361 {
2362 if (filler_lines == -1)
2363 {
2364 change_start = MAXCOL;
2365 change_end = -1;
2366 if (diff_find_change(curwin, lnum, &change_start, &change_end))
2367 hlID = HLF_ADD; /* added line */
2368 else
2369 hlID = HLF_CHD; /* changed line */
2370 }
2371 else
2372 hlID = HLF_ADD; /* added line */
2373 }
2374 else
2375 hlID = (hlf_T)0;
2376 prev_lnum = lnum;
2377 changedtick = CHANGEDTICK(curbuf);
2378 fnum = curbuf->b_fnum;
2379 }
2380
2381 if (hlID == HLF_CHD || hlID == HLF_TXD)
2382 {
2383 col = tv_get_number(&argvars[1]) - 1; /* ignore type error in {col} */
2384 if (col >= change_start && col <= change_end)
2385 hlID = HLF_TXD; /* changed text */
2386 else
2387 hlID = HLF_CHD; /* changed line */
2388 }
2389 rettv->vval.v_number = hlID == (hlf_T)0 ? 0 : (int)hlID;
2390 #endif
2391 } 2284 }
2392 2285
2393 /* 2286 /*
2394 * "empty({expr})" function 2287 * "empty({expr})" function
2395 */ 2288 */
6356 { 6249 {
6357 rettv->vval.v_number = tv_get_number_chk(&argvars[0], NULL) 6250 rettv->vval.v_number = tv_get_number_chk(&argvars[0], NULL)
6358 | tv_get_number_chk(&argvars[1], NULL); 6251 | tv_get_number_chk(&argvars[1], NULL);
6359 } 6252 }
6360 6253
6361 /*
6362 * "pathshorten()" function
6363 */
6364 static void
6365 f_pathshorten(typval_T *argvars, typval_T *rettv)
6366 {
6367 char_u *p;
6368
6369 rettv->v_type = VAR_STRING;
6370 p = tv_get_string_chk(&argvars[0]);
6371 if (p == NULL)
6372 rettv->vval.v_string = NULL;
6373 else
6374 {
6375 p = vim_strsave(p);
6376 rettv->vval.v_string = p;
6377 if (p != NULL)
6378 shorten_dir(p);
6379 }
6380 }
6381
6382 #ifdef FEAT_PERL 6254 #ifdef FEAT_PERL
6383 /* 6255 /*
6384 * "perleval()" function 6256 * "perleval()" function
6385 */ 6257 */
6386 static void 6258 static void
9471 rettv->vval.v_float = 0.0; 9343 rettv->vval.v_float = 0.0;
9472 } 9344 }
9473 #endif 9345 #endif
9474 9346
9475 /* 9347 /*
9476 * Get a callback from "arg". It can be a Funcref or a function name.
9477 * When "arg" is zero return an empty string.
9478 * "cb_name" is not allocated.
9479 * "cb_name" is set to NULL for an invalid argument.
9480 */
9481 callback_T
9482 get_callback(typval_T *arg)
9483 {
9484 callback_T res;
9485
9486 res.cb_free_name = FALSE;
9487 if (arg->v_type == VAR_PARTIAL && arg->vval.v_partial != NULL)
9488 {
9489 res.cb_partial = arg->vval.v_partial;
9490 ++res.cb_partial->pt_refcount;
9491 res.cb_name = partial_name(res.cb_partial);
9492 }
9493 else
9494 {
9495 res.cb_partial = NULL;
9496 if (arg->v_type == VAR_FUNC || arg->v_type == VAR_STRING)
9497 {
9498 // Note that we don't make a copy of the string.
9499 res.cb_name = arg->vval.v_string;
9500 func_ref(res.cb_name);
9501 }
9502 else if (arg->v_type == VAR_NUMBER && arg->vval.v_number == 0)
9503 {
9504 res.cb_name = (char_u *)"";
9505 }
9506 else
9507 {
9508 emsg(_("E921: Invalid callback argument"));
9509 res.cb_name = NULL;
9510 }
9511 }
9512 return res;
9513 }
9514
9515 /*
9516 * Copy a callback into a typval_T.
9517 */
9518 void
9519 put_callback(callback_T *cb, typval_T *tv)
9520 {
9521 if (cb->cb_partial != NULL)
9522 {
9523 tv->v_type = VAR_PARTIAL;
9524 tv->vval.v_partial = cb->cb_partial;
9525 ++tv->vval.v_partial->pt_refcount;
9526 }
9527 else
9528 {
9529 tv->v_type = VAR_FUNC;
9530 tv->vval.v_string = vim_strsave(cb->cb_name);
9531 func_ref(cb->cb_name);
9532 }
9533 }
9534
9535 /*
9536 * Make a copy of "src" into "dest", allocating the function name if needed,
9537 * without incrementing the refcount.
9538 */
9539 void
9540 set_callback(callback_T *dest, callback_T *src)
9541 {
9542 if (src->cb_partial == NULL)
9543 {
9544 // just a function name, make a copy
9545 dest->cb_name = vim_strsave(src->cb_name);
9546 dest->cb_free_name = TRUE;
9547 }
9548 else
9549 {
9550 // cb_name is a pointer into cb_partial
9551 dest->cb_name = src->cb_name;
9552 dest->cb_free_name = FALSE;
9553 }
9554 dest->cb_partial = src->cb_partial;
9555 }
9556
9557 /*
9558 * Unref/free "callback" returned by get_callback() or set_callback().
9559 */
9560 void
9561 free_callback(callback_T *callback)
9562 {
9563 if (callback->cb_partial != NULL)
9564 {
9565 partial_unref(callback->cb_partial);
9566 callback->cb_partial = NULL;
9567 }
9568 else if (callback->cb_name != NULL)
9569 func_unref(callback->cb_name);
9570 if (callback->cb_free_name)
9571 {
9572 vim_free(callback->cb_name);
9573 callback->cb_free_name = FALSE;
9574 }
9575 callback->cb_name = NULL;
9576 }
9577
9578 #ifdef FEAT_TIMERS
9579 /*
9580 * "timer_info([timer])" function
9581 */
9582 static void
9583 f_timer_info(typval_T *argvars, typval_T *rettv)
9584 {
9585 timer_T *timer = NULL;
9586
9587 if (rettv_list_alloc(rettv) != OK)
9588 return;
9589 if (argvars[0].v_type != VAR_UNKNOWN)
9590 {
9591 if (argvars[0].v_type != VAR_NUMBER)
9592 emsg(_(e_number_exp));
9593 else
9594 {
9595 timer = find_timer((int)tv_get_number(&argvars[0]));
9596 if (timer != NULL)
9597 add_timer_info(rettv, timer);
9598 }
9599 }
9600 else
9601 add_timer_info_all(rettv);
9602 }
9603
9604 /*
9605 * "timer_pause(timer, paused)" function
9606 */
9607 static void
9608 f_timer_pause(typval_T *argvars, typval_T *rettv UNUSED)
9609 {
9610 timer_T *timer = NULL;
9611 int paused = (int)tv_get_number(&argvars[1]);
9612
9613 if (argvars[0].v_type != VAR_NUMBER)
9614 emsg(_(e_number_exp));
9615 else
9616 {
9617 timer = find_timer((int)tv_get_number(&argvars[0]));
9618 if (timer != NULL)
9619 timer->tr_paused = paused;
9620 }
9621 }
9622
9623 /*
9624 * "timer_start(time, callback [, options])" function
9625 */
9626 static void
9627 f_timer_start(typval_T *argvars, typval_T *rettv)
9628 {
9629 long msec = (long)tv_get_number(&argvars[0]);
9630 timer_T *timer;
9631 int repeat = 0;
9632 callback_T callback;
9633 dict_T *dict;
9634
9635 rettv->vval.v_number = -1;
9636 if (check_secure())
9637 return;
9638 if (argvars[2].v_type != VAR_UNKNOWN)
9639 {
9640 if (argvars[2].v_type != VAR_DICT
9641 || (dict = argvars[2].vval.v_dict) == NULL)
9642 {
9643 semsg(_(e_invarg2), tv_get_string(&argvars[2]));
9644 return;
9645 }
9646 if (dict_find(dict, (char_u *)"repeat", -1) != NULL)
9647 repeat = dict_get_number(dict, (char_u *)"repeat");
9648 }
9649
9650 callback = get_callback(&argvars[1]);
9651 if (callback.cb_name == NULL)
9652 return;
9653
9654 timer = create_timer(msec, repeat);
9655 if (timer == NULL)
9656 free_callback(&callback);
9657 else
9658 {
9659 set_callback(&timer->tr_callback, &callback);
9660 rettv->vval.v_number = (varnumber_T)timer->tr_id;
9661 }
9662 }
9663
9664 /*
9665 * "timer_stop(timer)" function
9666 */
9667 static void
9668 f_timer_stop(typval_T *argvars, typval_T *rettv UNUSED)
9669 {
9670 timer_T *timer;
9671
9672 if (argvars[0].v_type != VAR_NUMBER)
9673 {
9674 emsg(_(e_number_exp));
9675 return;
9676 }
9677 timer = find_timer((int)tv_get_number(&argvars[0]));
9678 if (timer != NULL)
9679 stop_timer(timer);
9680 }
9681
9682 /*
9683 * "timer_stopall()" function
9684 */
9685 static void
9686 f_timer_stopall(typval_T *argvars UNUSED, typval_T *rettv UNUSED)
9687 {
9688 stop_all_timers();
9689 }
9690 #endif
9691
9692 /*
9693 * "tolower(string)" function 9348 * "tolower(string)" function
9694 */ 9349 */
9695 static void 9350 static void
9696 f_tolower(typval_T *argvars, typval_T *rettv) 9351 f_tolower(typval_T *argvars, typval_T *rettv)
9697 { 9352 {