comparison src/evalfunc.c @ 19396:a961efb326e5 v8.2.0256

patch 8.2.0256: time and timer related code is spread out Commit: https://github.com/vim/vim/commit/0a8fed6231c84e4e1b3a7dd6c0d95d3f98207fe0 Author: Bram Moolenaar <Bram@vim.org> Date: Fri Feb 14 13:22:17 2020 +0100 patch 8.2.0256: time and timer related code is spread out Problem: Time and timer related code is spread out. Solution: Move time and timer related code to a new file. (Yegappan Lakshmanan, closes #5604)
author Bram Moolenaar <Bram@vim.org>
date Fri, 14 Feb 2020 13:30:05 +0100
parents 764caba332cf
children f0033a10b613
comparison
equal deleted inserted replaced
19395:eb5ef6f5f58b 19396:a961efb326e5
16 16
17 #if defined(FEAT_EVAL) || defined(PROTO) 17 #if defined(FEAT_EVAL) || defined(PROTO)
18 18
19 #ifdef VMS 19 #ifdef VMS
20 # include <float.h> 20 # include <float.h>
21 #endif
22
23 #if defined(MACOS_X)
24 # include <time.h> // for time_t
25 #endif 21 #endif
26 22
27 #ifdef FEAT_FLOAT 23 #ifdef FEAT_FLOAT
28 static void f_abs(typval_T *argvars, typval_T *rettv); 24 static void f_abs(typval_T *argvars, typval_T *rettv);
29 static void f_acos(typval_T *argvars, typval_T *rettv); 25 static void f_acos(typval_T *argvars, typval_T *rettv);
124 static void f_len(typval_T *argvars, typval_T *rettv); 120 static void f_len(typval_T *argvars, typval_T *rettv);
125 static void f_libcall(typval_T *argvars, typval_T *rettv); 121 static void f_libcall(typval_T *argvars, typval_T *rettv);
126 static void f_libcallnr(typval_T *argvars, typval_T *rettv); 122 static void f_libcallnr(typval_T *argvars, typval_T *rettv);
127 static void f_line(typval_T *argvars, typval_T *rettv); 123 static void f_line(typval_T *argvars, typval_T *rettv);
128 static void f_line2byte(typval_T *argvars, typval_T *rettv); 124 static void f_line2byte(typval_T *argvars, typval_T *rettv);
129 static void f_localtime(typval_T *argvars, typval_T *rettv);
130 #ifdef FEAT_FLOAT 125 #ifdef FEAT_FLOAT
131 static void f_log(typval_T *argvars, typval_T *rettv); 126 static void f_log(typval_T *argvars, typval_T *rettv);
132 static void f_log10(typval_T *argvars, typval_T *rettv); 127 static void f_log10(typval_T *argvars, typval_T *rettv);
133 #endif 128 #endif
134 #ifdef FEAT_LUA 129 #ifdef FEAT_LUA
171 static void f_test_srand_seed(typval_T *argvars, typval_T *rettv); 166 static void f_test_srand_seed(typval_T *argvars, typval_T *rettv);
172 static void f_rand(typval_T *argvars, typval_T *rettv); 167 static void f_rand(typval_T *argvars, typval_T *rettv);
173 static void f_range(typval_T *argvars, typval_T *rettv); 168 static void f_range(typval_T *argvars, typval_T *rettv);
174 static void f_reg_executing(typval_T *argvars, typval_T *rettv); 169 static void f_reg_executing(typval_T *argvars, typval_T *rettv);
175 static void f_reg_recording(typval_T *argvars, typval_T *rettv); 170 static void f_reg_recording(typval_T *argvars, typval_T *rettv);
176 static void f_reltime(typval_T *argvars, typval_T *rettv);
177 #ifdef FEAT_FLOAT
178 static void f_reltimefloat(typval_T *argvars, typval_T *rettv);
179 #endif
180 static void f_reltimestr(typval_T *argvars, typval_T *rettv);
181 static void f_remote_expr(typval_T *argvars, typval_T *rettv); 171 static void f_remote_expr(typval_T *argvars, typval_T *rettv);
182 static void f_remote_foreground(typval_T *argvars, typval_T *rettv); 172 static void f_remote_foreground(typval_T *argvars, typval_T *rettv);
183 static void f_remote_peek(typval_T *argvars, typval_T *rettv); 173 static void f_remote_peek(typval_T *argvars, typval_T *rettv);
184 static void f_remote_read(typval_T *argvars, typval_T *rettv); 174 static void f_remote_read(typval_T *argvars, typval_T *rettv);
185 static void f_remote_send(typval_T *argvars, typval_T *rettv); 175 static void f_remote_send(typval_T *argvars, typval_T *rettv);
232 static void f_str2float(typval_T *argvars, typval_T *rettv); 222 static void f_str2float(typval_T *argvars, typval_T *rettv);
233 #endif 223 #endif
234 static void f_str2list(typval_T *argvars, typval_T *rettv); 224 static void f_str2list(typval_T *argvars, typval_T *rettv);
235 static void f_str2nr(typval_T *argvars, typval_T *rettv); 225 static void f_str2nr(typval_T *argvars, typval_T *rettv);
236 static void f_strchars(typval_T *argvars, typval_T *rettv); 226 static void f_strchars(typval_T *argvars, typval_T *rettv);
237 #ifdef HAVE_STRFTIME
238 static void f_strftime(typval_T *argvars, typval_T *rettv);
239 #endif
240 static void f_strgetchar(typval_T *argvars, typval_T *rettv); 227 static void f_strgetchar(typval_T *argvars, typval_T *rettv);
241 static void f_stridx(typval_T *argvars, typval_T *rettv); 228 static void f_stridx(typval_T *argvars, typval_T *rettv);
242 static void f_strlen(typval_T *argvars, typval_T *rettv); 229 static void f_strlen(typval_T *argvars, typval_T *rettv);
243 static void f_strcharpart(typval_T *argvars, typval_T *rettv); 230 static void f_strcharpart(typval_T *argvars, typval_T *rettv);
244 static void f_strpart(typval_T *argvars, typval_T *rettv); 231 static void f_strpart(typval_T *argvars, typval_T *rettv);
245 #ifdef HAVE_STRPTIME
246 static void f_strptime(typval_T *argvars, typval_T *rettv);
247 #endif
248 static void f_strridx(typval_T *argvars, typval_T *rettv); 232 static void f_strridx(typval_T *argvars, typval_T *rettv);
249 static void f_strtrans(typval_T *argvars, typval_T *rettv); 233 static void f_strtrans(typval_T *argvars, typval_T *rettv);
250 static void f_strdisplaywidth(typval_T *argvars, typval_T *rettv); 234 static void f_strdisplaywidth(typval_T *argvars, typval_T *rettv);
251 static void f_strwidth(typval_T *argvars, typval_T *rettv); 235 static void f_strwidth(typval_T *argvars, typval_T *rettv);
252 static void f_submatch(typval_T *argvars, typval_T *rettv); 236 static void f_submatch(typval_T *argvars, typval_T *rettv);
4510 if (rettv->vval.v_number >= 0) 4494 if (rettv->vval.v_number >= 0)
4511 ++rettv->vval.v_number; 4495 ++rettv->vval.v_number;
4512 #endif 4496 #endif
4513 } 4497 }
4514 4498
4515 /*
4516 * "localtime()" function
4517 */
4518 static void
4519 f_localtime(typval_T *argvars UNUSED, typval_T *rettv)
4520 {
4521 rettv->vval.v_number = (varnumber_T)time(NULL);
4522 }
4523
4524 #ifdef FEAT_FLOAT 4499 #ifdef FEAT_FLOAT
4525 /* 4500 /*
4526 * "log()" function 4501 * "log()" function
4527 */ 4502 */
4528 static void 4503 static void
5498 f_reg_recording(typval_T *argvars UNUSED, typval_T *rettv) 5473 f_reg_recording(typval_T *argvars UNUSED, typval_T *rettv)
5499 { 5474 {
5500 return_register(reg_recording, rettv); 5475 return_register(reg_recording, rettv);
5501 } 5476 }
5502 5477
5503 #if defined(FEAT_RELTIME)
5504 /*
5505 * Convert a List to proftime_T.
5506 * Return FAIL when there is something wrong.
5507 */
5508 static int
5509 list2proftime(typval_T *arg, proftime_T *tm)
5510 {
5511 long n1, n2;
5512 int error = FALSE;
5513
5514 if (arg->v_type != VAR_LIST || arg->vval.v_list == NULL
5515 || arg->vval.v_list->lv_len != 2)
5516 return FAIL;
5517 n1 = list_find_nr(arg->vval.v_list, 0L, &error);
5518 n2 = list_find_nr(arg->vval.v_list, 1L, &error);
5519 # ifdef MSWIN
5520 tm->HighPart = n1;
5521 tm->LowPart = n2;
5522 # else
5523 tm->tv_sec = n1;
5524 tm->tv_usec = n2;
5525 # endif
5526 return error ? FAIL : OK;
5527 }
5528 #endif // FEAT_RELTIME
5529
5530 /*
5531 * "reltime()" function
5532 */
5533 static void
5534 f_reltime(typval_T *argvars UNUSED, typval_T *rettv UNUSED)
5535 {
5536 #ifdef FEAT_RELTIME
5537 proftime_T res;
5538 proftime_T start;
5539
5540 if (argvars[0].v_type == VAR_UNKNOWN)
5541 {
5542 // No arguments: get current time.
5543 profile_start(&res);
5544 }
5545 else if (argvars[1].v_type == VAR_UNKNOWN)
5546 {
5547 if (list2proftime(&argvars[0], &res) == FAIL)
5548 return;
5549 profile_end(&res);
5550 }
5551 else
5552 {
5553 // Two arguments: compute the difference.
5554 if (list2proftime(&argvars[0], &start) == FAIL
5555 || list2proftime(&argvars[1], &res) == FAIL)
5556 return;
5557 profile_sub(&res, &start);
5558 }
5559
5560 if (rettv_list_alloc(rettv) == OK)
5561 {
5562 long n1, n2;
5563
5564 # ifdef MSWIN
5565 n1 = res.HighPart;
5566 n2 = res.LowPart;
5567 # else
5568 n1 = res.tv_sec;
5569 n2 = res.tv_usec;
5570 # endif
5571 list_append_number(rettv->vval.v_list, (varnumber_T)n1);
5572 list_append_number(rettv->vval.v_list, (varnumber_T)n2);
5573 }
5574 #endif
5575 }
5576
5577 #ifdef FEAT_FLOAT
5578 /*
5579 * "reltimefloat()" function
5580 */
5581 static void
5582 f_reltimefloat(typval_T *argvars UNUSED, typval_T *rettv)
5583 {
5584 # ifdef FEAT_RELTIME
5585 proftime_T tm;
5586 # endif
5587
5588 rettv->v_type = VAR_FLOAT;
5589 rettv->vval.v_float = 0;
5590 # ifdef FEAT_RELTIME
5591 if (list2proftime(&argvars[0], &tm) == OK)
5592 rettv->vval.v_float = profile_float(&tm);
5593 # endif
5594 }
5595 #endif
5596
5597 /*
5598 * "reltimestr()" function
5599 */
5600 static void
5601 f_reltimestr(typval_T *argvars UNUSED, typval_T *rettv)
5602 {
5603 #ifdef FEAT_RELTIME
5604 proftime_T tm;
5605 #endif
5606
5607 rettv->v_type = VAR_STRING;
5608 rettv->vval.v_string = NULL;
5609 #ifdef FEAT_RELTIME
5610 if (list2proftime(&argvars[0], &tm) == OK)
5611 rettv->vval.v_string = vim_strsave((char_u *)profile_msg(&tm));
5612 #endif
5613 }
5614
5615 #if defined(FEAT_CLIENTSERVER) && defined(FEAT_X11) 5478 #if defined(FEAT_CLIENTSERVER) && defined(FEAT_X11)
5616 static void 5479 static void
5617 make_connection(void) 5480 make_connection(void)
5618 { 5481 {
5619 if (X_DISPLAY == NULL 5482 if (X_DISPLAY == NULL
7420 else 7283 else
7421 rettv->vval.v_number = n; 7284 rettv->vval.v_number = n;
7422 7285
7423 } 7286 }
7424 7287
7425 #ifdef HAVE_STRFTIME
7426 /*
7427 * "strftime({format}[, {time}])" function
7428 */
7429 static void
7430 f_strftime(typval_T *argvars, typval_T *rettv)
7431 {
7432 char_u result_buf[256];
7433 struct tm tmval;
7434 struct tm *curtime;
7435 time_t seconds;
7436 char_u *p;
7437
7438 rettv->v_type = VAR_STRING;
7439
7440 p = tv_get_string(&argvars[0]);
7441 if (argvars[1].v_type == VAR_UNKNOWN)
7442 seconds = time(NULL);
7443 else
7444 seconds = (time_t)tv_get_number(&argvars[1]);
7445 curtime = vim_localtime(&seconds, &tmval);
7446 // MSVC returns NULL for an invalid value of seconds.
7447 if (curtime == NULL)
7448 rettv->vval.v_string = vim_strsave((char_u *)_("(Invalid)"));
7449 else
7450 {
7451 vimconv_T conv;
7452 char_u *enc;
7453
7454 conv.vc_type = CONV_NONE;
7455 enc = enc_locale();
7456 convert_setup(&conv, p_enc, enc);
7457 if (conv.vc_type != CONV_NONE)
7458 p = string_convert(&conv, p, NULL);
7459 if (p != NULL)
7460 (void)strftime((char *)result_buf, sizeof(result_buf),
7461 (char *)p, curtime);
7462 else
7463 result_buf[0] = NUL;
7464
7465 if (conv.vc_type != CONV_NONE)
7466 vim_free(p);
7467 convert_setup(&conv, enc, p_enc);
7468 if (conv.vc_type != CONV_NONE)
7469 rettv->vval.v_string = string_convert(&conv, result_buf, NULL);
7470 else
7471 rettv->vval.v_string = vim_strsave(result_buf);
7472
7473 // Release conversion descriptors
7474 convert_setup(&conv, NULL, NULL);
7475 vim_free(enc);
7476 }
7477 }
7478 #endif
7479
7480 /* 7288 /*
7481 * "strgetchar()" function 7289 * "strgetchar()" function
7482 */ 7290 */
7483 static void 7291 static void
7484 f_strgetchar(typval_T *argvars, typval_T *rettv) 7292 f_strgetchar(typval_T *argvars, typval_T *rettv)
7731 len = slen - n; 7539 len = slen - n;
7732 7540
7733 rettv->v_type = VAR_STRING; 7541 rettv->v_type = VAR_STRING;
7734 rettv->vval.v_string = vim_strnsave(p + n, len); 7542 rettv->vval.v_string = vim_strnsave(p + n, len);
7735 } 7543 }
7736
7737 #ifdef HAVE_STRPTIME
7738 /*
7739 * "strptime({format}, {timestring})" function
7740 */
7741 static void
7742 f_strptime(typval_T *argvars, typval_T *rettv)
7743 {
7744 struct tm tmval;
7745 char_u *fmt;
7746 char_u *str;
7747 vimconv_T conv;
7748 char_u *enc;
7749
7750 vim_memset(&tmval, NUL, sizeof(tmval));
7751 fmt = tv_get_string(&argvars[0]);
7752 str = tv_get_string(&argvars[1]);
7753
7754 conv.vc_type = CONV_NONE;
7755 enc = enc_locale();
7756 convert_setup(&conv, p_enc, enc);
7757 if (conv.vc_type != CONV_NONE)
7758 fmt = string_convert(&conv, fmt, NULL);
7759 if (fmt == NULL
7760 || strptime((char *)str, (char *)fmt, &tmval) == NULL
7761 || (rettv->vval.v_number = mktime(&tmval)) == -1)
7762 rettv->vval.v_number = 0;
7763
7764 if (conv.vc_type != CONV_NONE)
7765 vim_free(fmt);
7766 convert_setup(&conv, NULL, NULL);
7767 vim_free(enc);
7768 }
7769 #endif
7770 7544
7771 /* 7545 /*
7772 * "strridx()" function 7546 * "strridx()" function
7773 */ 7547 */
7774 static void 7548 static void