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