Mercurial > vim
annotate src/time.c @ 34074:1629cc65d78d v9.1.0006
patch 9.1.0006: is*() and to*() function may be unsafe
Commit: https://github.com/vim/vim/commit/184f71cc6868a240dc872ed2852542bbc1d43e28
Author: Keith Thompson <Keith.S.Thompson@gmail.com>
Date: Thu Jan 4 21:19:04 2024 +0100
patch 9.1.0006: is*() and to*() function may be unsafe
Problem: is*() and to*() function may be unsafe
Solution: Add SAFE_* macros and start using those instead
(Keith Thompson)
Use SAFE_() macros for is*() and to*() functions
The standard is*() and to*() functions declared in <ctype.h> have
undefined behavior for negative arguments other than EOF. If plain char
is signed, passing an unchecked value from argv for from user input
to one of these functions has undefined behavior.
Solution: Add SAFE_*() macros that cast the argument to unsigned char.
Most implementations behave sanely for negative arguments, and most
character values in practice are non-negative, but it's still best
to avoid undefined behavior.
The change from #13347 has been omitted, as this has already been
separately fixed in commit ac709e2fc0db6d31abb7da96f743c40956b60c3a
(v9.0.2054)
fixes: #13332
closes: #13347
Signed-off-by: Keith Thompson <Keith.S.Thompson@gmail.com>
Signed-off-by: Christian Brabandt <cb@256bit.org>
author | Christian Brabandt <cb@256bit.org> |
---|---|
date | Thu, 04 Jan 2024 21:30:04 +0100 |
parents | 31fb1a760ad6 |
children |
rev | line source |
---|---|
19396
a961efb326e5
patch 8.2.0256: time and timer related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1 /* vi:set ts=8 sts=4 sw=4 noet: |
a961efb326e5
patch 8.2.0256: time and timer related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
2 * |
a961efb326e5
patch 8.2.0256: time and timer related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
3 * VIM - Vi IMproved by Bram Moolenaar |
a961efb326e5
patch 8.2.0256: time and timer related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
4 * |
a961efb326e5
patch 8.2.0256: time and timer related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
5 * Do ":help uganda" in Vim to read copying and usage conditions. |
a961efb326e5
patch 8.2.0256: time and timer related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
6 * Do ":help credits" in Vim to see a list of people who contributed. |
a961efb326e5
patch 8.2.0256: time and timer related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
7 * See README.txt for an overview of the Vim source code. |
a961efb326e5
patch 8.2.0256: time and timer related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
8 */ |
a961efb326e5
patch 8.2.0256: time and timer related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
9 |
a961efb326e5
patch 8.2.0256: time and timer related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
10 /* |
a961efb326e5
patch 8.2.0256: time and timer related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
11 * time.c: functions related to time and timers |
a961efb326e5
patch 8.2.0256: time and timer related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
12 */ |
a961efb326e5
patch 8.2.0256: time and timer related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
13 |
a961efb326e5
patch 8.2.0256: time and timer related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
14 #include "vim.h" |
a961efb326e5
patch 8.2.0256: time and timer related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
15 |
a961efb326e5
patch 8.2.0256: time and timer related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
16 /* |
a961efb326e5
patch 8.2.0256: time and timer related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
17 * Cache of the current timezone name as retrieved from TZ, or an empty string |
a961efb326e5
patch 8.2.0256: time and timer related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
18 * where unset, up to 64 octets long including trailing null byte. |
a961efb326e5
patch 8.2.0256: time and timer related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
19 */ |
a961efb326e5
patch 8.2.0256: time and timer related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
20 #if defined(HAVE_LOCALTIME_R) && defined(HAVE_TZSET) |
a961efb326e5
patch 8.2.0256: time and timer related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
21 static char tz_cache[64]; |
a961efb326e5
patch 8.2.0256: time and timer related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
22 #endif |
a961efb326e5
patch 8.2.0256: time and timer related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
23 |
19934
3ff714d765ba
patch 8.2.0523: loops are repeated
Bram Moolenaar <Bram@vim.org>
parents:
19396
diff
changeset
|
24 #define FOR_ALL_TIMERS(t) \ |
3ff714d765ba
patch 8.2.0523: loops are repeated
Bram Moolenaar <Bram@vim.org>
parents:
19396
diff
changeset
|
25 for ((t) = first_timer; (t) != NULL; (t) = (t)->tr_next) |
3ff714d765ba
patch 8.2.0523: loops are repeated
Bram Moolenaar <Bram@vim.org>
parents:
19396
diff
changeset
|
26 |
19396
a961efb326e5
patch 8.2.0256: time and timer related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
27 /* |
a961efb326e5
patch 8.2.0256: time and timer related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
28 * Call either localtime(3) or localtime_r(3) from POSIX libc time.h, with the |
a961efb326e5
patch 8.2.0256: time and timer related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
29 * latter version preferred for reentrancy. |
a961efb326e5
patch 8.2.0256: time and timer related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
30 * |
a961efb326e5
patch 8.2.0256: time and timer related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
31 * If we use localtime_r(3) and we have tzset(3) available, check to see if the |
a961efb326e5
patch 8.2.0256: time and timer related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
32 * environment variable TZ has changed since the last run, and call tzset(3) to |
a961efb326e5
patch 8.2.0256: time and timer related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
33 * update the global timezone variables if it has. This is because the POSIX |
a961efb326e5
patch 8.2.0256: time and timer related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
34 * standard doesn't require localtime_r(3) implementations to do that as it |
a961efb326e5
patch 8.2.0256: time and timer related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
35 * does with localtime(3), and we don't want to call tzset(3) every time. |
a961efb326e5
patch 8.2.0256: time and timer related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
36 */ |
a961efb326e5
patch 8.2.0256: time and timer related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
37 static struct tm * |
a961efb326e5
patch 8.2.0256: time and timer related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
38 vim_localtime( |
a961efb326e5
patch 8.2.0256: time and timer related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
39 const time_t *timep, // timestamp for local representation |
a961efb326e5
patch 8.2.0256: time and timer related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
40 struct tm *result UNUSED) // pointer to caller return buffer |
a961efb326e5
patch 8.2.0256: time and timer related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
41 { |
a961efb326e5
patch 8.2.0256: time and timer related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
42 #ifdef HAVE_LOCALTIME_R |
a961efb326e5
patch 8.2.0256: time and timer related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
43 # ifdef HAVE_TZSET |
a961efb326e5
patch 8.2.0256: time and timer related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
44 char *tz; // pointer for TZ environment var |
a961efb326e5
patch 8.2.0256: time and timer related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
45 |
a961efb326e5
patch 8.2.0256: time and timer related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
46 tz = (char *)mch_getenv((char_u *)"TZ"); |
a961efb326e5
patch 8.2.0256: time and timer related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
47 if (tz == NULL) |
a961efb326e5
patch 8.2.0256: time and timer related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
48 tz = ""; |
a961efb326e5
patch 8.2.0256: time and timer related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
49 if (STRNCMP(tz_cache, tz, sizeof(tz_cache) - 1) != 0) |
a961efb326e5
patch 8.2.0256: time and timer related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
50 { |
a961efb326e5
patch 8.2.0256: time and timer related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
51 tzset(); |
a961efb326e5
patch 8.2.0256: time and timer related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
52 vim_strncpy((char_u *)tz_cache, (char_u *)tz, sizeof(tz_cache) - 1); |
a961efb326e5
patch 8.2.0256: time and timer related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
53 } |
a961efb326e5
patch 8.2.0256: time and timer related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
54 # endif // HAVE_TZSET |
a961efb326e5
patch 8.2.0256: time and timer related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
55 return localtime_r(timep, result); |
a961efb326e5
patch 8.2.0256: time and timer related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
56 #else |
a961efb326e5
patch 8.2.0256: time and timer related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
57 return localtime(timep); |
a961efb326e5
patch 8.2.0256: time and timer related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
58 #endif // HAVE_LOCALTIME_R |
a961efb326e5
patch 8.2.0256: time and timer related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
59 } |
a961efb326e5
patch 8.2.0256: time and timer related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
60 |
a961efb326e5
patch 8.2.0256: time and timer related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
61 /* |
a961efb326e5
patch 8.2.0256: time and timer related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
62 * Return the current time in seconds. Calls time(), unless test_settime() |
a961efb326e5
patch 8.2.0256: time and timer related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
63 * was used. |
a961efb326e5
patch 8.2.0256: time and timer related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
64 */ |
a961efb326e5
patch 8.2.0256: time and timer related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
65 time_T |
a961efb326e5
patch 8.2.0256: time and timer related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
66 vim_time(void) |
a961efb326e5
patch 8.2.0256: time and timer related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
67 { |
a961efb326e5
patch 8.2.0256: time and timer related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
68 # ifdef FEAT_EVAL |
a961efb326e5
patch 8.2.0256: time and timer related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
69 return time_for_testing == 0 ? time(NULL) : time_for_testing; |
a961efb326e5
patch 8.2.0256: time and timer related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
70 # else |
a961efb326e5
patch 8.2.0256: time and timer related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
71 return time(NULL); |
a961efb326e5
patch 8.2.0256: time and timer related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
72 # endif |
a961efb326e5
patch 8.2.0256: time and timer related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
73 } |
a961efb326e5
patch 8.2.0256: time and timer related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
74 |
a961efb326e5
patch 8.2.0256: time and timer related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
75 /* |
a961efb326e5
patch 8.2.0256: time and timer related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
76 * Replacement for ctime(), which is not safe to use. |
a961efb326e5
patch 8.2.0256: time and timer related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
77 * Requires strftime(), otherwise returns "(unknown)". |
a961efb326e5
patch 8.2.0256: time and timer related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
78 * If "thetime" is invalid returns "(invalid)". Never returns NULL. |
a961efb326e5
patch 8.2.0256: time and timer related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
79 * When "add_newline" is TRUE add a newline like ctime() does. |
a961efb326e5
patch 8.2.0256: time and timer related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
80 * Uses a static buffer. |
a961efb326e5
patch 8.2.0256: time and timer related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
81 */ |
a961efb326e5
patch 8.2.0256: time and timer related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
82 char * |
a961efb326e5
patch 8.2.0256: time and timer related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
83 get_ctime(time_t thetime, int add_newline) |
a961efb326e5
patch 8.2.0256: time and timer related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
84 { |
30797
1213e3988168
patch 9.0.0733: use of strftime() is not safe
Bram Moolenaar <Bram@vim.org>
parents:
30695
diff
changeset
|
85 static char buf[100]; // hopefully enough for every language |
19396
a961efb326e5
patch 8.2.0256: time and timer related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
86 #ifdef HAVE_STRFTIME |
a961efb326e5
patch 8.2.0256: time and timer related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
87 struct tm tmval; |
a961efb326e5
patch 8.2.0256: time and timer related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
88 struct tm *curtime; |
a961efb326e5
patch 8.2.0256: time and timer related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
89 |
a961efb326e5
patch 8.2.0256: time and timer related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
90 curtime = vim_localtime(&thetime, &tmval); |
a961efb326e5
patch 8.2.0256: time and timer related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
91 // MSVC returns NULL for an invalid value of seconds. |
a961efb326e5
patch 8.2.0256: time and timer related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
92 if (curtime == NULL) |
30797
1213e3988168
patch 9.0.0733: use of strftime() is not safe
Bram Moolenaar <Bram@vim.org>
parents:
30695
diff
changeset
|
93 vim_strncpy((char_u *)buf, (char_u *)_("(Invalid)"), sizeof(buf) - 2); |
19396
a961efb326e5
patch 8.2.0256: time and timer related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
94 else |
a961efb326e5
patch 8.2.0256: time and timer related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
95 { |
27253
da5b8e1405c6
patch 8.2.4155: translating strftime() argument results in check error
Bram Moolenaar <Bram@vim.org>
parents:
27012
diff
changeset
|
96 // xgettext:no-c-format |
30797
1213e3988168
patch 9.0.0733: use of strftime() is not safe
Bram Moolenaar <Bram@vim.org>
parents:
30695
diff
changeset
|
97 if (strftime(buf, sizeof(buf) - 2, _("%a %b %d %H:%M:%S %Y"), curtime) |
1213e3988168
patch 9.0.0733: use of strftime() is not safe
Bram Moolenaar <Bram@vim.org>
parents:
30695
diff
changeset
|
98 == 0) |
1213e3988168
patch 9.0.0733: use of strftime() is not safe
Bram Moolenaar <Bram@vim.org>
parents:
30695
diff
changeset
|
99 { |
1213e3988168
patch 9.0.0733: use of strftime() is not safe
Bram Moolenaar <Bram@vim.org>
parents:
30695
diff
changeset
|
100 // Quoting "man strftime": |
1213e3988168
patch 9.0.0733: use of strftime() is not safe
Bram Moolenaar <Bram@vim.org>
parents:
30695
diff
changeset
|
101 // > If the length of the result string (including the terminating |
1213e3988168
patch 9.0.0733: use of strftime() is not safe
Bram Moolenaar <Bram@vim.org>
parents:
30695
diff
changeset
|
102 // > null byte) would exceed max bytes, then strftime() returns 0, |
1213e3988168
patch 9.0.0733: use of strftime() is not safe
Bram Moolenaar <Bram@vim.org>
parents:
30695
diff
changeset
|
103 // > and the contents of the array are undefined. |
1213e3988168
patch 9.0.0733: use of strftime() is not safe
Bram Moolenaar <Bram@vim.org>
parents:
30695
diff
changeset
|
104 vim_strncpy((char_u *)buf, (char_u *)_("(Invalid)"), |
1213e3988168
patch 9.0.0733: use of strftime() is not safe
Bram Moolenaar <Bram@vim.org>
parents:
30695
diff
changeset
|
105 sizeof(buf) - 2); |
1213e3988168
patch 9.0.0733: use of strftime() is not safe
Bram Moolenaar <Bram@vim.org>
parents:
30695
diff
changeset
|
106 } |
19396
a961efb326e5
patch 8.2.0256: time and timer related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
107 # ifdef MSWIN |
a961efb326e5
patch 8.2.0256: time and timer related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
108 if (enc_codepage >= 0 && (int)GetACP() != enc_codepage) |
a961efb326e5
patch 8.2.0256: time and timer related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
109 { |
a961efb326e5
patch 8.2.0256: time and timer related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
110 char_u *to_free = NULL; |
a961efb326e5
patch 8.2.0256: time and timer related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
111 int len; |
a961efb326e5
patch 8.2.0256: time and timer related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
112 |
a961efb326e5
patch 8.2.0256: time and timer related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
113 acp_to_enc((char_u *)buf, (int)strlen(buf), &to_free, &len); |
a961efb326e5
patch 8.2.0256: time and timer related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
114 if (to_free != NULL) |
a961efb326e5
patch 8.2.0256: time and timer related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
115 { |
30797
1213e3988168
patch 9.0.0733: use of strftime() is not safe
Bram Moolenaar <Bram@vim.org>
parents:
30695
diff
changeset
|
116 STRNCPY(buf, to_free, sizeof(buf) - 2); |
19396
a961efb326e5
patch 8.2.0256: time and timer related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
117 vim_free(to_free); |
a961efb326e5
patch 8.2.0256: time and timer related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
118 } |
a961efb326e5
patch 8.2.0256: time and timer related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
119 } |
a961efb326e5
patch 8.2.0256: time and timer related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
120 # endif |
a961efb326e5
patch 8.2.0256: time and timer related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
121 } |
a961efb326e5
patch 8.2.0256: time and timer related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
122 #else |
a961efb326e5
patch 8.2.0256: time and timer related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
123 STRCPY(buf, "(unknown)"); |
a961efb326e5
patch 8.2.0256: time and timer related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
124 #endif |
a961efb326e5
patch 8.2.0256: time and timer related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
125 if (add_newline) |
a961efb326e5
patch 8.2.0256: time and timer related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
126 STRCAT(buf, "\n"); |
a961efb326e5
patch 8.2.0256: time and timer related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
127 return buf; |
a961efb326e5
patch 8.2.0256: time and timer related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
128 } |
a961efb326e5
patch 8.2.0256: time and timer related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
129 |
a961efb326e5
patch 8.2.0256: time and timer related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
130 #if defined(FEAT_EVAL) || defined(PROTO) |
a961efb326e5
patch 8.2.0256: time and timer related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
131 |
a961efb326e5
patch 8.2.0256: time and timer related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
132 #if defined(MACOS_X) |
a961efb326e5
patch 8.2.0256: time and timer related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
133 # include <time.h> // for time_t |
a961efb326e5
patch 8.2.0256: time and timer related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
134 #endif |
a961efb326e5
patch 8.2.0256: time and timer related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
135 |
a961efb326e5
patch 8.2.0256: time and timer related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
136 /* |
a961efb326e5
patch 8.2.0256: time and timer related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
137 * "localtime()" function |
a961efb326e5
patch 8.2.0256: time and timer related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
138 */ |
a961efb326e5
patch 8.2.0256: time and timer related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
139 void |
a961efb326e5
patch 8.2.0256: time and timer related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
140 f_localtime(typval_T *argvars UNUSED, typval_T *rettv) |
a961efb326e5
patch 8.2.0256: time and timer related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
141 { |
a961efb326e5
patch 8.2.0256: time and timer related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
142 rettv->vval.v_number = (varnumber_T)time(NULL); |
a961efb326e5
patch 8.2.0256: time and timer related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
143 } |
a961efb326e5
patch 8.2.0256: time and timer related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
144 |
a961efb326e5
patch 8.2.0256: time and timer related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
145 # if defined(FEAT_RELTIME) |
a961efb326e5
patch 8.2.0256: time and timer related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
146 /* |
a961efb326e5
patch 8.2.0256: time and timer related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
147 * Convert a List to proftime_T. |
a961efb326e5
patch 8.2.0256: time and timer related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
148 * Return FAIL when there is something wrong. |
a961efb326e5
patch 8.2.0256: time and timer related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
149 */ |
a961efb326e5
patch 8.2.0256: time and timer related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
150 static int |
a961efb326e5
patch 8.2.0256: time and timer related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
151 list2proftime(typval_T *arg, proftime_T *tm) |
a961efb326e5
patch 8.2.0256: time and timer related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
152 { |
a961efb326e5
patch 8.2.0256: time and timer related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
153 long n1, n2; |
a961efb326e5
patch 8.2.0256: time and timer related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
154 int error = FALSE; |
a961efb326e5
patch 8.2.0256: time and timer related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
155 |
a961efb326e5
patch 8.2.0256: time and timer related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
156 if (arg->v_type != VAR_LIST || arg->vval.v_list == NULL |
a961efb326e5
patch 8.2.0256: time and timer related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
157 || arg->vval.v_list->lv_len != 2) |
a961efb326e5
patch 8.2.0256: time and timer related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
158 return FAIL; |
a961efb326e5
patch 8.2.0256: time and timer related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
159 n1 = list_find_nr(arg->vval.v_list, 0L, &error); |
a961efb326e5
patch 8.2.0256: time and timer related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
160 n2 = list_find_nr(arg->vval.v_list, 1L, &error); |
a961efb326e5
patch 8.2.0256: time and timer related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
161 # ifdef MSWIN |
a961efb326e5
patch 8.2.0256: time and timer related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
162 tm->HighPart = n1; |
a961efb326e5
patch 8.2.0256: time and timer related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
163 tm->LowPart = n2; |
a961efb326e5
patch 8.2.0256: time and timer related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
164 # else |
a961efb326e5
patch 8.2.0256: time and timer related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
165 tm->tv_sec = n1; |
32160
98774a275d6d
patch 9.0.1411: accuracy of profiling is not optimal
Bram Moolenaar <Bram@vim.org>
parents:
32009
diff
changeset
|
166 tm->tv_fsec = n2; |
19396
a961efb326e5
patch 8.2.0256: time and timer related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
167 # endif |
a961efb326e5
patch 8.2.0256: time and timer related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
168 return error ? FAIL : OK; |
a961efb326e5
patch 8.2.0256: time and timer related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
169 } |
a961efb326e5
patch 8.2.0256: time and timer related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
170 # endif // FEAT_RELTIME |
a961efb326e5
patch 8.2.0256: time and timer related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
171 |
a961efb326e5
patch 8.2.0256: time and timer related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
172 /* |
a961efb326e5
patch 8.2.0256: time and timer related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
173 * "reltime()" function |
a961efb326e5
patch 8.2.0256: time and timer related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
174 */ |
a961efb326e5
patch 8.2.0256: time and timer related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
175 void |
a961efb326e5
patch 8.2.0256: time and timer related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
176 f_reltime(typval_T *argvars UNUSED, typval_T *rettv UNUSED) |
a961efb326e5
patch 8.2.0256: time and timer related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
177 { |
a961efb326e5
patch 8.2.0256: time and timer related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
178 # ifdef FEAT_RELTIME |
a961efb326e5
patch 8.2.0256: time and timer related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
179 proftime_T res; |
a961efb326e5
patch 8.2.0256: time and timer related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
180 proftime_T start; |
25252
acda780ffc3e
patch 8.2.3162: Vim9: argument types are not checked at compile time
Bram Moolenaar <Bram@vim.org>
parents:
25250
diff
changeset
|
181 long n1, n2; |
acda780ffc3e
patch 8.2.3162: Vim9: argument types are not checked at compile time
Bram Moolenaar <Bram@vim.org>
parents:
25250
diff
changeset
|
182 |
29175
755ab148288b
patch 8.2.5107: some callers of rettv_list_alloc() check for not OK
Bram Moolenaar <Bram@vim.org>
parents:
28725
diff
changeset
|
183 if (rettv_list_alloc(rettv) == FAIL) |
25252
acda780ffc3e
patch 8.2.3162: Vim9: argument types are not checked at compile time
Bram Moolenaar <Bram@vim.org>
parents:
25250
diff
changeset
|
184 return; |
19396
a961efb326e5
patch 8.2.0256: time and timer related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
185 |
25384
e8e2c4d33b9b
patch 8.2.3229: Vim9: runtime and compile time type checks are not the same
Bram Moolenaar <Bram@vim.org>
parents:
25348
diff
changeset
|
186 if (in_vim9script() |
e8e2c4d33b9b
patch 8.2.3229: Vim9: runtime and compile time type checks are not the same
Bram Moolenaar <Bram@vim.org>
parents:
25348
diff
changeset
|
187 && (check_for_opt_list_arg(argvars, 0) == FAIL |
e8e2c4d33b9b
patch 8.2.3229: Vim9: runtime and compile time type checks are not the same
Bram Moolenaar <Bram@vim.org>
parents:
25348
diff
changeset
|
188 || (argvars[0].v_type != VAR_UNKNOWN |
e8e2c4d33b9b
patch 8.2.3229: Vim9: runtime and compile time type checks are not the same
Bram Moolenaar <Bram@vim.org>
parents:
25348
diff
changeset
|
189 && check_for_opt_list_arg(argvars, 1) == FAIL))) |
e8e2c4d33b9b
patch 8.2.3229: Vim9: runtime and compile time type checks are not the same
Bram Moolenaar <Bram@vim.org>
parents:
25348
diff
changeset
|
190 return; |
e8e2c4d33b9b
patch 8.2.3229: Vim9: runtime and compile time type checks are not the same
Bram Moolenaar <Bram@vim.org>
parents:
25348
diff
changeset
|
191 |
19396
a961efb326e5
patch 8.2.0256: time and timer related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
192 if (argvars[0].v_type == VAR_UNKNOWN) |
a961efb326e5
patch 8.2.0256: time and timer related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
193 { |
a961efb326e5
patch 8.2.0256: time and timer related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
194 // No arguments: get current time. |
a961efb326e5
patch 8.2.0256: time and timer related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
195 profile_start(&res); |
a961efb326e5
patch 8.2.0256: time and timer related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
196 } |
a961efb326e5
patch 8.2.0256: time and timer related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
197 else if (argvars[1].v_type == VAR_UNKNOWN) |
a961efb326e5
patch 8.2.0256: time and timer related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
198 { |
a961efb326e5
patch 8.2.0256: time and timer related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
199 if (list2proftime(&argvars[0], &res) == FAIL) |
25250
532faf893d37
patch 8.2.3161: Vim9: no error when reltime() has invalid arguments
Bram Moolenaar <Bram@vim.org>
parents:
24768
diff
changeset
|
200 { |
532faf893d37
patch 8.2.3161: Vim9: no error when reltime() has invalid arguments
Bram Moolenaar <Bram@vim.org>
parents:
24768
diff
changeset
|
201 if (in_vim9script()) |
26865
bce848ec8b1b
patch 8.2.3961: error messages are spread out
Bram Moolenaar <Bram@vim.org>
parents:
26476
diff
changeset
|
202 emsg(_(e_invalid_argument)); |
19396
a961efb326e5
patch 8.2.0256: time and timer related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
203 return; |
25250
532faf893d37
patch 8.2.3161: Vim9: no error when reltime() has invalid arguments
Bram Moolenaar <Bram@vim.org>
parents:
24768
diff
changeset
|
204 } |
19396
a961efb326e5
patch 8.2.0256: time and timer related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
205 profile_end(&res); |
a961efb326e5
patch 8.2.0256: time and timer related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
206 } |
a961efb326e5
patch 8.2.0256: time and timer related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
207 else |
a961efb326e5
patch 8.2.0256: time and timer related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
208 { |
a961efb326e5
patch 8.2.0256: time and timer related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
209 // Two arguments: compute the difference. |
a961efb326e5
patch 8.2.0256: time and timer related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
210 if (list2proftime(&argvars[0], &start) == FAIL |
a961efb326e5
patch 8.2.0256: time and timer related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
211 || list2proftime(&argvars[1], &res) == FAIL) |
25250
532faf893d37
patch 8.2.3161: Vim9: no error when reltime() has invalid arguments
Bram Moolenaar <Bram@vim.org>
parents:
24768
diff
changeset
|
212 { |
532faf893d37
patch 8.2.3161: Vim9: no error when reltime() has invalid arguments
Bram Moolenaar <Bram@vim.org>
parents:
24768
diff
changeset
|
213 if (in_vim9script()) |
26865
bce848ec8b1b
patch 8.2.3961: error messages are spread out
Bram Moolenaar <Bram@vim.org>
parents:
26476
diff
changeset
|
214 emsg(_(e_invalid_argument)); |
19396
a961efb326e5
patch 8.2.0256: time and timer related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
215 return; |
25250
532faf893d37
patch 8.2.3161: Vim9: no error when reltime() has invalid arguments
Bram Moolenaar <Bram@vim.org>
parents:
24768
diff
changeset
|
216 } |
19396
a961efb326e5
patch 8.2.0256: time and timer related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
217 profile_sub(&res, &start); |
a961efb326e5
patch 8.2.0256: time and timer related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
218 } |
a961efb326e5
patch 8.2.0256: time and timer related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
219 |
a961efb326e5
patch 8.2.0256: time and timer related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
220 # ifdef MSWIN |
25252
acda780ffc3e
patch 8.2.3162: Vim9: argument types are not checked at compile time
Bram Moolenaar <Bram@vim.org>
parents:
25250
diff
changeset
|
221 n1 = res.HighPart; |
acda780ffc3e
patch 8.2.3162: Vim9: argument types are not checked at compile time
Bram Moolenaar <Bram@vim.org>
parents:
25250
diff
changeset
|
222 n2 = res.LowPart; |
19396
a961efb326e5
patch 8.2.0256: time and timer related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
223 # else |
25252
acda780ffc3e
patch 8.2.3162: Vim9: argument types are not checked at compile time
Bram Moolenaar <Bram@vim.org>
parents:
25250
diff
changeset
|
224 n1 = res.tv_sec; |
32160
98774a275d6d
patch 9.0.1411: accuracy of profiling is not optimal
Bram Moolenaar <Bram@vim.org>
parents:
32009
diff
changeset
|
225 n2 = res.tv_fsec; |
19396
a961efb326e5
patch 8.2.0256: time and timer related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
226 # endif |
25252
acda780ffc3e
patch 8.2.3162: Vim9: argument types are not checked at compile time
Bram Moolenaar <Bram@vim.org>
parents:
25250
diff
changeset
|
227 list_append_number(rettv->vval.v_list, (varnumber_T)n1); |
acda780ffc3e
patch 8.2.3162: Vim9: argument types are not checked at compile time
Bram Moolenaar <Bram@vim.org>
parents:
25250
diff
changeset
|
228 list_append_number(rettv->vval.v_list, (varnumber_T)n2); |
19396
a961efb326e5
patch 8.2.0256: time and timer related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
229 # endif |
a961efb326e5
patch 8.2.0256: time and timer related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
230 } |
a961efb326e5
patch 8.2.0256: time and timer related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
231 |
a961efb326e5
patch 8.2.0256: time and timer related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
232 /* |
a961efb326e5
patch 8.2.0256: time and timer related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
233 * "reltimefloat()" function |
a961efb326e5
patch 8.2.0256: time and timer related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
234 */ |
a961efb326e5
patch 8.2.0256: time and timer related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
235 void |
a961efb326e5
patch 8.2.0256: time and timer related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
236 f_reltimefloat(typval_T *argvars UNUSED, typval_T *rettv) |
a961efb326e5
patch 8.2.0256: time and timer related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
237 { |
30310
029c59bf78f1
patch 9.0.0491: no good reason to build without the float feature
Bram Moolenaar <Bram@vim.org>
parents:
30043
diff
changeset
|
238 # ifdef FEAT_RELTIME |
19396
a961efb326e5
patch 8.2.0256: time and timer related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
239 proftime_T tm; |
30310
029c59bf78f1
patch 9.0.0491: no good reason to build without the float feature
Bram Moolenaar <Bram@vim.org>
parents:
30043
diff
changeset
|
240 # endif |
19396
a961efb326e5
patch 8.2.0256: time and timer related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
241 |
a961efb326e5
patch 8.2.0256: time and timer related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
242 rettv->v_type = VAR_FLOAT; |
a961efb326e5
patch 8.2.0256: time and timer related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
243 rettv->vval.v_float = 0; |
30310
029c59bf78f1
patch 9.0.0491: no good reason to build without the float feature
Bram Moolenaar <Bram@vim.org>
parents:
30043
diff
changeset
|
244 # ifdef FEAT_RELTIME |
25384
e8e2c4d33b9b
patch 8.2.3229: Vim9: runtime and compile time type checks are not the same
Bram Moolenaar <Bram@vim.org>
parents:
25348
diff
changeset
|
245 if (in_vim9script() && check_for_list_arg(argvars, 0) == FAIL) |
e8e2c4d33b9b
patch 8.2.3229: Vim9: runtime and compile time type checks are not the same
Bram Moolenaar <Bram@vim.org>
parents:
25348
diff
changeset
|
246 return; |
e8e2c4d33b9b
patch 8.2.3229: Vim9: runtime and compile time type checks are not the same
Bram Moolenaar <Bram@vim.org>
parents:
25348
diff
changeset
|
247 |
19396
a961efb326e5
patch 8.2.0256: time and timer related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
248 if (list2proftime(&argvars[0], &tm) == OK) |
a961efb326e5
patch 8.2.0256: time and timer related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
249 rettv->vval.v_float = profile_float(&tm); |
25250
532faf893d37
patch 8.2.3161: Vim9: no error when reltime() has invalid arguments
Bram Moolenaar <Bram@vim.org>
parents:
24768
diff
changeset
|
250 else if (in_vim9script()) |
26865
bce848ec8b1b
patch 8.2.3961: error messages are spread out
Bram Moolenaar <Bram@vim.org>
parents:
26476
diff
changeset
|
251 emsg(_(e_invalid_argument)); |
30310
029c59bf78f1
patch 9.0.0491: no good reason to build without the float feature
Bram Moolenaar <Bram@vim.org>
parents:
30043
diff
changeset
|
252 # endif |
19396
a961efb326e5
patch 8.2.0256: time and timer related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
253 } |
a961efb326e5
patch 8.2.0256: time and timer related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
254 |
a961efb326e5
patch 8.2.0256: time and timer related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
255 /* |
a961efb326e5
patch 8.2.0256: time and timer related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
256 * "reltimestr()" function |
a961efb326e5
patch 8.2.0256: time and timer related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
257 */ |
a961efb326e5
patch 8.2.0256: time and timer related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
258 void |
a961efb326e5
patch 8.2.0256: time and timer related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
259 f_reltimestr(typval_T *argvars UNUSED, typval_T *rettv) |
a961efb326e5
patch 8.2.0256: time and timer related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
260 { |
a961efb326e5
patch 8.2.0256: time and timer related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
261 rettv->v_type = VAR_STRING; |
a961efb326e5
patch 8.2.0256: time and timer related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
262 rettv->vval.v_string = NULL; |
a961efb326e5
patch 8.2.0256: time and timer related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
263 # ifdef FEAT_RELTIME |
25384
e8e2c4d33b9b
patch 8.2.3229: Vim9: runtime and compile time type checks are not the same
Bram Moolenaar <Bram@vim.org>
parents:
25348
diff
changeset
|
264 if (in_vim9script() && check_for_list_arg(argvars, 0) == FAIL) |
e8e2c4d33b9b
patch 8.2.3229: Vim9: runtime and compile time type checks are not the same
Bram Moolenaar <Bram@vim.org>
parents:
25348
diff
changeset
|
265 return; |
e8e2c4d33b9b
patch 8.2.3229: Vim9: runtime and compile time type checks are not the same
Bram Moolenaar <Bram@vim.org>
parents:
25348
diff
changeset
|
266 |
32164
673dcbaded32
patch 9.0.1413: compiler warning for unused variable
Bram Moolenaar <Bram@vim.org>
parents:
32160
diff
changeset
|
267 proftime_T tm; |
19396
a961efb326e5
patch 8.2.0256: time and timer related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
268 if (list2proftime(&argvars[0], &tm) == OK) |
32160
98774a275d6d
patch 9.0.1411: accuracy of profiling is not optimal
Bram Moolenaar <Bram@vim.org>
parents:
32009
diff
changeset
|
269 { |
98774a275d6d
patch 9.0.1411: accuracy of profiling is not optimal
Bram Moolenaar <Bram@vim.org>
parents:
32009
diff
changeset
|
270 # ifdef MSWIN |
19396
a961efb326e5
patch 8.2.0256: time and timer related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
271 rettv->vval.v_string = vim_strsave((char_u *)profile_msg(&tm)); |
32160
98774a275d6d
patch 9.0.1411: accuracy of profiling is not optimal
Bram Moolenaar <Bram@vim.org>
parents:
32009
diff
changeset
|
272 # else |
32164
673dcbaded32
patch 9.0.1413: compiler warning for unused variable
Bram Moolenaar <Bram@vim.org>
parents:
32160
diff
changeset
|
273 static char buf[50]; |
32160
98774a275d6d
patch 9.0.1411: accuracy of profiling is not optimal
Bram Moolenaar <Bram@vim.org>
parents:
32009
diff
changeset
|
274 long usec = tm.tv_fsec / (TV_FSEC_SEC / 1000000); |
32164
673dcbaded32
patch 9.0.1413: compiler warning for unused variable
Bram Moolenaar <Bram@vim.org>
parents:
32160
diff
changeset
|
275 vim_snprintf(buf, sizeof(buf), "%3ld.%06ld", (long)tm.tv_sec, usec); |
32160
98774a275d6d
patch 9.0.1411: accuracy of profiling is not optimal
Bram Moolenaar <Bram@vim.org>
parents:
32009
diff
changeset
|
276 rettv->vval.v_string = vim_strsave((char_u *)buf); |
98774a275d6d
patch 9.0.1411: accuracy of profiling is not optimal
Bram Moolenaar <Bram@vim.org>
parents:
32009
diff
changeset
|
277 # endif |
98774a275d6d
patch 9.0.1411: accuracy of profiling is not optimal
Bram Moolenaar <Bram@vim.org>
parents:
32009
diff
changeset
|
278 } |
25250
532faf893d37
patch 8.2.3161: Vim9: no error when reltime() has invalid arguments
Bram Moolenaar <Bram@vim.org>
parents:
24768
diff
changeset
|
279 else if (in_vim9script()) |
26865
bce848ec8b1b
patch 8.2.3961: error messages are spread out
Bram Moolenaar <Bram@vim.org>
parents:
26476
diff
changeset
|
280 emsg(_(e_invalid_argument)); |
19396
a961efb326e5
patch 8.2.0256: time and timer related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
281 # endif |
a961efb326e5
patch 8.2.0256: time and timer related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
282 } |
a961efb326e5
patch 8.2.0256: time and timer related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
283 |
a961efb326e5
patch 8.2.0256: time and timer related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
284 # if defined(HAVE_STRFTIME) || defined(PROTO) |
a961efb326e5
patch 8.2.0256: time and timer related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
285 /* |
a961efb326e5
patch 8.2.0256: time and timer related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
286 * "strftime({format}[, {time}])" function |
a961efb326e5
patch 8.2.0256: time and timer related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
287 */ |
a961efb326e5
patch 8.2.0256: time and timer related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
288 void |
a961efb326e5
patch 8.2.0256: time and timer related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
289 f_strftime(typval_T *argvars, typval_T *rettv) |
a961efb326e5
patch 8.2.0256: time and timer related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
290 { |
a961efb326e5
patch 8.2.0256: time and timer related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
291 struct tm tmval; |
a961efb326e5
patch 8.2.0256: time and timer related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
292 struct tm *curtime; |
a961efb326e5
patch 8.2.0256: time and timer related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
293 time_t seconds; |
a961efb326e5
patch 8.2.0256: time and timer related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
294 char_u *p; |
a961efb326e5
patch 8.2.0256: time and timer related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
295 |
25252
acda780ffc3e
patch 8.2.3162: Vim9: argument types are not checked at compile time
Bram Moolenaar <Bram@vim.org>
parents:
25250
diff
changeset
|
296 if (in_vim9script() |
acda780ffc3e
patch 8.2.3162: Vim9: argument types are not checked at compile time
Bram Moolenaar <Bram@vim.org>
parents:
25250
diff
changeset
|
297 && (check_for_string_arg(argvars, 0) == FAIL |
25302
4d3c68196d05
patch 8.2.3188: Vim9: argument types are not checked at compile time
Bram Moolenaar <Bram@vim.org>
parents:
25252
diff
changeset
|
298 || check_for_opt_number_arg(argvars, 1) == FAIL)) |
25252
acda780ffc3e
patch 8.2.3162: Vim9: argument types are not checked at compile time
Bram Moolenaar <Bram@vim.org>
parents:
25250
diff
changeset
|
299 return; |
acda780ffc3e
patch 8.2.3162: Vim9: argument types are not checked at compile time
Bram Moolenaar <Bram@vim.org>
parents:
25250
diff
changeset
|
300 |
19396
a961efb326e5
patch 8.2.0256: time and timer related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
301 rettv->v_type = VAR_STRING; |
a961efb326e5
patch 8.2.0256: time and timer related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
302 |
a961efb326e5
patch 8.2.0256: time and timer related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
303 p = tv_get_string(&argvars[0]); |
a961efb326e5
patch 8.2.0256: time and timer related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
304 if (argvars[1].v_type == VAR_UNKNOWN) |
a961efb326e5
patch 8.2.0256: time and timer related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
305 seconds = time(NULL); |
a961efb326e5
patch 8.2.0256: time and timer related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
306 else |
a961efb326e5
patch 8.2.0256: time and timer related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
307 seconds = (time_t)tv_get_number(&argvars[1]); |
a961efb326e5
patch 8.2.0256: time and timer related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
308 curtime = vim_localtime(&seconds, &tmval); |
a961efb326e5
patch 8.2.0256: time and timer related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
309 // MSVC returns NULL for an invalid value of seconds. |
a961efb326e5
patch 8.2.0256: time and timer related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
310 if (curtime == NULL) |
31825
0d27ddce621d
patch 9.0.1245: code is indented more than necessary
Bram Moolenaar <Bram@vim.org>
parents:
31313
diff
changeset
|
311 { |
19396
a961efb326e5
patch 8.2.0256: time and timer related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
312 rettv->vval.v_string = vim_strsave((char_u *)_("(Invalid)")); |
31825
0d27ddce621d
patch 9.0.1245: code is indented more than necessary
Bram Moolenaar <Bram@vim.org>
parents:
31313
diff
changeset
|
313 return; |
0d27ddce621d
patch 9.0.1245: code is indented more than necessary
Bram Moolenaar <Bram@vim.org>
parents:
31313
diff
changeset
|
314 } |
0d27ddce621d
patch 9.0.1245: code is indented more than necessary
Bram Moolenaar <Bram@vim.org>
parents:
31313
diff
changeset
|
315 |
24711
788d7e3ade7c
patch 8.2.2894: MS-Windows: using enc_locale() for strftime() might not work
Bram Moolenaar <Bram@vim.org>
parents:
23677
diff
changeset
|
316 # ifdef MSWIN |
31825
0d27ddce621d
patch 9.0.1245: code is indented more than necessary
Bram Moolenaar <Bram@vim.org>
parents:
31313
diff
changeset
|
317 WCHAR result_buf[256]; |
0d27ddce621d
patch 9.0.1245: code is indented more than necessary
Bram Moolenaar <Bram@vim.org>
parents:
31313
diff
changeset
|
318 WCHAR *wp; |
24711
788d7e3ade7c
patch 8.2.2894: MS-Windows: using enc_locale() for strftime() might not work
Bram Moolenaar <Bram@vim.org>
parents:
23677
diff
changeset
|
319 |
31825
0d27ddce621d
patch 9.0.1245: code is indented more than necessary
Bram Moolenaar <Bram@vim.org>
parents:
31313
diff
changeset
|
320 wp = enc_to_utf16(p, NULL); |
0d27ddce621d
patch 9.0.1245: code is indented more than necessary
Bram Moolenaar <Bram@vim.org>
parents:
31313
diff
changeset
|
321 if (wp != NULL) |
0d27ddce621d
patch 9.0.1245: code is indented more than necessary
Bram Moolenaar <Bram@vim.org>
parents:
31313
diff
changeset
|
322 (void)wcsftime(result_buf, ARRAY_LENGTH(result_buf), wp, curtime); |
0d27ddce621d
patch 9.0.1245: code is indented more than necessary
Bram Moolenaar <Bram@vim.org>
parents:
31313
diff
changeset
|
323 else |
0d27ddce621d
patch 9.0.1245: code is indented more than necessary
Bram Moolenaar <Bram@vim.org>
parents:
31313
diff
changeset
|
324 result_buf[0] = NUL; |
0d27ddce621d
patch 9.0.1245: code is indented more than necessary
Bram Moolenaar <Bram@vim.org>
parents:
31313
diff
changeset
|
325 rettv->vval.v_string = utf16_to_enc(result_buf, NULL); |
0d27ddce621d
patch 9.0.1245: code is indented more than necessary
Bram Moolenaar <Bram@vim.org>
parents:
31313
diff
changeset
|
326 vim_free(wp); |
24711
788d7e3ade7c
patch 8.2.2894: MS-Windows: using enc_locale() for strftime() might not work
Bram Moolenaar <Bram@vim.org>
parents:
23677
diff
changeset
|
327 # else |
31825
0d27ddce621d
patch 9.0.1245: code is indented more than necessary
Bram Moolenaar <Bram@vim.org>
parents:
31313
diff
changeset
|
328 char_u result_buf[256]; |
0d27ddce621d
patch 9.0.1245: code is indented more than necessary
Bram Moolenaar <Bram@vim.org>
parents:
31313
diff
changeset
|
329 vimconv_T conv; |
0d27ddce621d
patch 9.0.1245: code is indented more than necessary
Bram Moolenaar <Bram@vim.org>
parents:
31313
diff
changeset
|
330 char_u *enc; |
19396
a961efb326e5
patch 8.2.0256: time and timer related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
331 |
31825
0d27ddce621d
patch 9.0.1245: code is indented more than necessary
Bram Moolenaar <Bram@vim.org>
parents:
31313
diff
changeset
|
332 conv.vc_type = CONV_NONE; |
0d27ddce621d
patch 9.0.1245: code is indented more than necessary
Bram Moolenaar <Bram@vim.org>
parents:
31313
diff
changeset
|
333 enc = enc_locale(); |
0d27ddce621d
patch 9.0.1245: code is indented more than necessary
Bram Moolenaar <Bram@vim.org>
parents:
31313
diff
changeset
|
334 convert_setup(&conv, p_enc, enc); |
0d27ddce621d
patch 9.0.1245: code is indented more than necessary
Bram Moolenaar <Bram@vim.org>
parents:
31313
diff
changeset
|
335 if (conv.vc_type != CONV_NONE) |
0d27ddce621d
patch 9.0.1245: code is indented more than necessary
Bram Moolenaar <Bram@vim.org>
parents:
31313
diff
changeset
|
336 p = string_convert(&conv, p, NULL); |
0d27ddce621d
patch 9.0.1245: code is indented more than necessary
Bram Moolenaar <Bram@vim.org>
parents:
31313
diff
changeset
|
337 if (p == NULL || strftime((char *)result_buf, sizeof(result_buf), |
0d27ddce621d
patch 9.0.1245: code is indented more than necessary
Bram Moolenaar <Bram@vim.org>
parents:
31313
diff
changeset
|
338 (char *)p, curtime) == 0) |
0d27ddce621d
patch 9.0.1245: code is indented more than necessary
Bram Moolenaar <Bram@vim.org>
parents:
31313
diff
changeset
|
339 result_buf[0] = NUL; |
19396
a961efb326e5
patch 8.2.0256: time and timer related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
340 |
31825
0d27ddce621d
patch 9.0.1245: code is indented more than necessary
Bram Moolenaar <Bram@vim.org>
parents:
31313
diff
changeset
|
341 if (conv.vc_type != CONV_NONE) |
0d27ddce621d
patch 9.0.1245: code is indented more than necessary
Bram Moolenaar <Bram@vim.org>
parents:
31313
diff
changeset
|
342 vim_free(p); |
0d27ddce621d
patch 9.0.1245: code is indented more than necessary
Bram Moolenaar <Bram@vim.org>
parents:
31313
diff
changeset
|
343 convert_setup(&conv, enc, p_enc); |
0d27ddce621d
patch 9.0.1245: code is indented more than necessary
Bram Moolenaar <Bram@vim.org>
parents:
31313
diff
changeset
|
344 if (conv.vc_type != CONV_NONE) |
0d27ddce621d
patch 9.0.1245: code is indented more than necessary
Bram Moolenaar <Bram@vim.org>
parents:
31313
diff
changeset
|
345 rettv->vval.v_string = string_convert(&conv, result_buf, NULL); |
0d27ddce621d
patch 9.0.1245: code is indented more than necessary
Bram Moolenaar <Bram@vim.org>
parents:
31313
diff
changeset
|
346 else |
0d27ddce621d
patch 9.0.1245: code is indented more than necessary
Bram Moolenaar <Bram@vim.org>
parents:
31313
diff
changeset
|
347 rettv->vval.v_string = vim_strsave(result_buf); |
19396
a961efb326e5
patch 8.2.0256: time and timer related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
348 |
31825
0d27ddce621d
patch 9.0.1245: code is indented more than necessary
Bram Moolenaar <Bram@vim.org>
parents:
31313
diff
changeset
|
349 // Release conversion descriptors |
0d27ddce621d
patch 9.0.1245: code is indented more than necessary
Bram Moolenaar <Bram@vim.org>
parents:
31313
diff
changeset
|
350 convert_setup(&conv, NULL, NULL); |
0d27ddce621d
patch 9.0.1245: code is indented more than necessary
Bram Moolenaar <Bram@vim.org>
parents:
31313
diff
changeset
|
351 vim_free(enc); |
24711
788d7e3ade7c
patch 8.2.2894: MS-Windows: using enc_locale() for strftime() might not work
Bram Moolenaar <Bram@vim.org>
parents:
23677
diff
changeset
|
352 # endif |
19396
a961efb326e5
patch 8.2.0256: time and timer related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
353 } |
a961efb326e5
patch 8.2.0256: time and timer related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
354 # endif |
a961efb326e5
patch 8.2.0256: time and timer related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
355 |
a961efb326e5
patch 8.2.0256: time and timer related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
356 # if defined(HAVE_STRPTIME) || defined(PROTO) |
a961efb326e5
patch 8.2.0256: time and timer related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
357 /* |
a961efb326e5
patch 8.2.0256: time and timer related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
358 * "strptime({format}, {timestring})" function |
a961efb326e5
patch 8.2.0256: time and timer related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
359 */ |
a961efb326e5
patch 8.2.0256: time and timer related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
360 void |
a961efb326e5
patch 8.2.0256: time and timer related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
361 f_strptime(typval_T *argvars, typval_T *rettv) |
a961efb326e5
patch 8.2.0256: time and timer related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
362 { |
a961efb326e5
patch 8.2.0256: time and timer related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
363 struct tm tmval; |
a961efb326e5
patch 8.2.0256: time and timer related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
364 char_u *fmt; |
a961efb326e5
patch 8.2.0256: time and timer related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
365 char_u *str; |
a961efb326e5
patch 8.2.0256: time and timer related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
366 vimconv_T conv; |
a961efb326e5
patch 8.2.0256: time and timer related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
367 char_u *enc; |
a961efb326e5
patch 8.2.0256: time and timer related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
368 |
25384
e8e2c4d33b9b
patch 8.2.3229: Vim9: runtime and compile time type checks are not the same
Bram Moolenaar <Bram@vim.org>
parents:
25348
diff
changeset
|
369 if (in_vim9script() |
e8e2c4d33b9b
patch 8.2.3229: Vim9: runtime and compile time type checks are not the same
Bram Moolenaar <Bram@vim.org>
parents:
25348
diff
changeset
|
370 && (check_for_string_arg(argvars, 0) == FAIL |
e8e2c4d33b9b
patch 8.2.3229: Vim9: runtime and compile time type checks are not the same
Bram Moolenaar <Bram@vim.org>
parents:
25348
diff
changeset
|
371 || check_for_string_arg(argvars, 1) == FAIL)) |
e8e2c4d33b9b
patch 8.2.3229: Vim9: runtime and compile time type checks are not the same
Bram Moolenaar <Bram@vim.org>
parents:
25348
diff
changeset
|
372 return; |
e8e2c4d33b9b
patch 8.2.3229: Vim9: runtime and compile time type checks are not the same
Bram Moolenaar <Bram@vim.org>
parents:
25348
diff
changeset
|
373 |
20007
aadd1cae2ff5
patch 8.2.0559: clearing a struct is verbose
Bram Moolenaar <Bram@vim.org>
parents:
19934
diff
changeset
|
374 CLEAR_FIELD(tmval); |
20794
2e7acc208a1f
patch 8.2.0949: strptime() does not use DST
Bram Moolenaar <Bram@vim.org>
parents:
20007
diff
changeset
|
375 tmval.tm_isdst = -1; |
19396
a961efb326e5
patch 8.2.0256: time and timer related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
376 fmt = tv_get_string(&argvars[0]); |
a961efb326e5
patch 8.2.0256: time and timer related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
377 str = tv_get_string(&argvars[1]); |
a961efb326e5
patch 8.2.0256: time and timer related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
378 |
a961efb326e5
patch 8.2.0256: time and timer related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
379 conv.vc_type = CONV_NONE; |
a961efb326e5
patch 8.2.0256: time and timer related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
380 enc = enc_locale(); |
a961efb326e5
patch 8.2.0256: time and timer related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
381 convert_setup(&conv, p_enc, enc); |
a961efb326e5
patch 8.2.0256: time and timer related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
382 if (conv.vc_type != CONV_NONE) |
a961efb326e5
patch 8.2.0256: time and timer related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
383 fmt = string_convert(&conv, fmt, NULL); |
a961efb326e5
patch 8.2.0256: time and timer related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
384 if (fmt == NULL |
a961efb326e5
patch 8.2.0256: time and timer related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
385 || strptime((char *)str, (char *)fmt, &tmval) == NULL |
a961efb326e5
patch 8.2.0256: time and timer related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
386 || (rettv->vval.v_number = mktime(&tmval)) == -1) |
a961efb326e5
patch 8.2.0256: time and timer related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
387 rettv->vval.v_number = 0; |
a961efb326e5
patch 8.2.0256: time and timer related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
388 |
a961efb326e5
patch 8.2.0256: time and timer related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
389 if (conv.vc_type != CONV_NONE) |
a961efb326e5
patch 8.2.0256: time and timer related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
390 vim_free(fmt); |
a961efb326e5
patch 8.2.0256: time and timer related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
391 convert_setup(&conv, NULL, NULL); |
a961efb326e5
patch 8.2.0256: time and timer related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
392 vim_free(enc); |
a961efb326e5
patch 8.2.0256: time and timer related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
393 } |
a961efb326e5
patch 8.2.0256: time and timer related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
394 # endif |
a961efb326e5
patch 8.2.0256: time and timer related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
395 |
a961efb326e5
patch 8.2.0256: time and timer related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
396 # if defined(FEAT_TIMERS) || defined(PROTO) |
a961efb326e5
patch 8.2.0256: time and timer related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
397 static timer_T *first_timer = NULL; |
a961efb326e5
patch 8.2.0256: time and timer related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
398 static long last_timer_id = 0; |
a961efb326e5
patch 8.2.0256: time and timer related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
399 |
a961efb326e5
patch 8.2.0256: time and timer related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
400 /* |
32160
98774a275d6d
patch 9.0.1411: accuracy of profiling is not optimal
Bram Moolenaar <Bram@vim.org>
parents:
32009
diff
changeset
|
401 * Return time left, in "msec", until "due". Negative if past "due". |
19396
a961efb326e5
patch 8.2.0256: time and timer related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
402 */ |
a961efb326e5
patch 8.2.0256: time and timer related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
403 long |
a961efb326e5
patch 8.2.0256: time and timer related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
404 proftime_time_left(proftime_T *due, proftime_T *now) |
a961efb326e5
patch 8.2.0256: time and timer related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
405 { |
a961efb326e5
patch 8.2.0256: time and timer related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
406 # ifdef MSWIN |
a961efb326e5
patch 8.2.0256: time and timer related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
407 LARGE_INTEGER fr; |
a961efb326e5
patch 8.2.0256: time and timer related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
408 |
a961efb326e5
patch 8.2.0256: time and timer related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
409 if (now->QuadPart > due->QuadPart) |
a961efb326e5
patch 8.2.0256: time and timer related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
410 return 0; |
a961efb326e5
patch 8.2.0256: time and timer related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
411 QueryPerformanceFrequency(&fr); |
a961efb326e5
patch 8.2.0256: time and timer related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
412 return (long)(((double)(due->QuadPart - now->QuadPart) |
a961efb326e5
patch 8.2.0256: time and timer related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
413 / (double)fr.QuadPart) * 1000); |
a961efb326e5
patch 8.2.0256: time and timer related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
414 # else |
a961efb326e5
patch 8.2.0256: time and timer related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
415 if (now->tv_sec > due->tv_sec) |
a961efb326e5
patch 8.2.0256: time and timer related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
416 return 0; |
a961efb326e5
patch 8.2.0256: time and timer related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
417 return (due->tv_sec - now->tv_sec) * 1000 |
32160
98774a275d6d
patch 9.0.1411: accuracy of profiling is not optimal
Bram Moolenaar <Bram@vim.org>
parents:
32009
diff
changeset
|
418 + (due->tv_fsec - now->tv_fsec) / (TV_FSEC_SEC / 1000); |
19396
a961efb326e5
patch 8.2.0256: time and timer related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
419 # endif |
a961efb326e5
patch 8.2.0256: time and timer related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
420 } |
a961efb326e5
patch 8.2.0256: time and timer related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
421 |
a961efb326e5
patch 8.2.0256: time and timer related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
422 /* |
a961efb326e5
patch 8.2.0256: time and timer related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
423 * Insert a timer in the list of timers. |
a961efb326e5
patch 8.2.0256: time and timer related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
424 */ |
a961efb326e5
patch 8.2.0256: time and timer related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
425 static void |
a961efb326e5
patch 8.2.0256: time and timer related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
426 insert_timer(timer_T *timer) |
a961efb326e5
patch 8.2.0256: time and timer related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
427 { |
a961efb326e5
patch 8.2.0256: time and timer related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
428 timer->tr_next = first_timer; |
a961efb326e5
patch 8.2.0256: time and timer related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
429 timer->tr_prev = NULL; |
a961efb326e5
patch 8.2.0256: time and timer related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
430 if (first_timer != NULL) |
a961efb326e5
patch 8.2.0256: time and timer related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
431 first_timer->tr_prev = timer; |
a961efb326e5
patch 8.2.0256: time and timer related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
432 first_timer = timer; |
a961efb326e5
patch 8.2.0256: time and timer related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
433 did_add_timer = TRUE; |
a961efb326e5
patch 8.2.0256: time and timer related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
434 } |
a961efb326e5
patch 8.2.0256: time and timer related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
435 |
a961efb326e5
patch 8.2.0256: time and timer related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
436 /* |
a961efb326e5
patch 8.2.0256: time and timer related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
437 * Take a timer out of the list of timers. |
a961efb326e5
patch 8.2.0256: time and timer related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
438 */ |
a961efb326e5
patch 8.2.0256: time and timer related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
439 static void |
a961efb326e5
patch 8.2.0256: time and timer related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
440 remove_timer(timer_T *timer) |
a961efb326e5
patch 8.2.0256: time and timer related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
441 { |
a961efb326e5
patch 8.2.0256: time and timer related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
442 if (timer->tr_prev == NULL) |
a961efb326e5
patch 8.2.0256: time and timer related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
443 first_timer = timer->tr_next; |
a961efb326e5
patch 8.2.0256: time and timer related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
444 else |
a961efb326e5
patch 8.2.0256: time and timer related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
445 timer->tr_prev->tr_next = timer->tr_next; |
a961efb326e5
patch 8.2.0256: time and timer related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
446 if (timer->tr_next != NULL) |
a961efb326e5
patch 8.2.0256: time and timer related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
447 timer->tr_next->tr_prev = timer->tr_prev; |
a961efb326e5
patch 8.2.0256: time and timer related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
448 } |
a961efb326e5
patch 8.2.0256: time and timer related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
449 |
a961efb326e5
patch 8.2.0256: time and timer related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
450 static void |
a961efb326e5
patch 8.2.0256: time and timer related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
451 free_timer(timer_T *timer) |
a961efb326e5
patch 8.2.0256: time and timer related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
452 { |
a961efb326e5
patch 8.2.0256: time and timer related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
453 free_callback(&timer->tr_callback); |
a961efb326e5
patch 8.2.0256: time and timer related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
454 vim_free(timer); |
a961efb326e5
patch 8.2.0256: time and timer related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
455 } |
a961efb326e5
patch 8.2.0256: time and timer related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
456 |
a961efb326e5
patch 8.2.0256: time and timer related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
457 /* |
a961efb326e5
patch 8.2.0256: time and timer related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
458 * Create a timer and return it. NULL if out of memory. |
a961efb326e5
patch 8.2.0256: time and timer related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
459 * Caller should set the callback. |
a961efb326e5
patch 8.2.0256: time and timer related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
460 */ |
a961efb326e5
patch 8.2.0256: time and timer related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
461 timer_T * |
a961efb326e5
patch 8.2.0256: time and timer related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
462 create_timer(long msec, int repeat) |
a961efb326e5
patch 8.2.0256: time and timer related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
463 { |
a961efb326e5
patch 8.2.0256: time and timer related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
464 timer_T *timer = ALLOC_CLEAR_ONE(timer_T); |
a961efb326e5
patch 8.2.0256: time and timer related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
465 long prev_id = last_timer_id; |
a961efb326e5
patch 8.2.0256: time and timer related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
466 |
a961efb326e5
patch 8.2.0256: time and timer related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
467 if (timer == NULL) |
a961efb326e5
patch 8.2.0256: time and timer related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
468 return NULL; |
a961efb326e5
patch 8.2.0256: time and timer related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
469 if (++last_timer_id <= prev_id) |
a961efb326e5
patch 8.2.0256: time and timer related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
470 // Overflow! Might cause duplicates... |
a961efb326e5
patch 8.2.0256: time and timer related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
471 last_timer_id = 0; |
a961efb326e5
patch 8.2.0256: time and timer related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
472 timer->tr_id = last_timer_id; |
a961efb326e5
patch 8.2.0256: time and timer related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
473 insert_timer(timer); |
a961efb326e5
patch 8.2.0256: time and timer related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
474 if (repeat != 0) |
a961efb326e5
patch 8.2.0256: time and timer related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
475 timer->tr_repeat = repeat - 1; |
a961efb326e5
patch 8.2.0256: time and timer related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
476 timer->tr_interval = msec; |
a961efb326e5
patch 8.2.0256: time and timer related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
477 |
29900
a6721cafbc74
patch 9.0.0288: when 'cmdheight' is zero some messages are not displayed
Bram Moolenaar <Bram@vim.org>
parents:
29442
diff
changeset
|
478 timer_start(timer); |
19396
a961efb326e5
patch 8.2.0256: time and timer related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
479 return timer; |
a961efb326e5
patch 8.2.0256: time and timer related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
480 } |
a961efb326e5
patch 8.2.0256: time and timer related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
481 |
a961efb326e5
patch 8.2.0256: time and timer related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
482 /* |
29900
a6721cafbc74
patch 9.0.0288: when 'cmdheight' is zero some messages are not displayed
Bram Moolenaar <Bram@vim.org>
parents:
29442
diff
changeset
|
483 * (Re)start a timer. |
a6721cafbc74
patch 9.0.0288: when 'cmdheight' is zero some messages are not displayed
Bram Moolenaar <Bram@vim.org>
parents:
29442
diff
changeset
|
484 */ |
a6721cafbc74
patch 9.0.0288: when 'cmdheight' is zero some messages are not displayed
Bram Moolenaar <Bram@vim.org>
parents:
29442
diff
changeset
|
485 void |
a6721cafbc74
patch 9.0.0288: when 'cmdheight' is zero some messages are not displayed
Bram Moolenaar <Bram@vim.org>
parents:
29442
diff
changeset
|
486 timer_start(timer_T *timer) |
a6721cafbc74
patch 9.0.0288: when 'cmdheight' is zero some messages are not displayed
Bram Moolenaar <Bram@vim.org>
parents:
29442
diff
changeset
|
487 { |
a6721cafbc74
patch 9.0.0288: when 'cmdheight' is zero some messages are not displayed
Bram Moolenaar <Bram@vim.org>
parents:
29442
diff
changeset
|
488 profile_setlimit(timer->tr_interval, &timer->tr_due); |
a6721cafbc74
patch 9.0.0288: when 'cmdheight' is zero some messages are not displayed
Bram Moolenaar <Bram@vim.org>
parents:
29442
diff
changeset
|
489 timer->tr_paused = FALSE; |
a6721cafbc74
patch 9.0.0288: when 'cmdheight' is zero some messages are not displayed
Bram Moolenaar <Bram@vim.org>
parents:
29442
diff
changeset
|
490 } |
a6721cafbc74
patch 9.0.0288: when 'cmdheight' is zero some messages are not displayed
Bram Moolenaar <Bram@vim.org>
parents:
29442
diff
changeset
|
491 |
a6721cafbc74
patch 9.0.0288: when 'cmdheight' is zero some messages are not displayed
Bram Moolenaar <Bram@vim.org>
parents:
29442
diff
changeset
|
492 /* |
19396
a961efb326e5
patch 8.2.0256: time and timer related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
493 * Invoke the callback of "timer". |
a961efb326e5
patch 8.2.0256: time and timer related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
494 */ |
a961efb326e5
patch 8.2.0256: time and timer related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
495 static void |
a961efb326e5
patch 8.2.0256: time and timer related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
496 timer_callback(timer_T *timer) |
a961efb326e5
patch 8.2.0256: time and timer related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
497 { |
a961efb326e5
patch 8.2.0256: time and timer related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
498 typval_T rettv; |
a961efb326e5
patch 8.2.0256: time and timer related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
499 typval_T argv[2]; |
a961efb326e5
patch 8.2.0256: time and timer related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
500 |
31287
fa309d9af73c
patch 9.0.0977: it is not easy to see what client-server commands are doing
Bram Moolenaar <Bram@vim.org>
parents:
30857
diff
changeset
|
501 #ifdef FEAT_EVAL |
28725
075787b91e09
patch 8.2.4887: channel log does not show invoking a timer callback
Bram Moolenaar <Bram@vim.org>
parents:
28315
diff
changeset
|
502 if (ch_log_active()) |
075787b91e09
patch 8.2.4887: channel log does not show invoking a timer callback
Bram Moolenaar <Bram@vim.org>
parents:
28315
diff
changeset
|
503 { |
075787b91e09
patch 8.2.4887: channel log does not show invoking a timer callback
Bram Moolenaar <Bram@vim.org>
parents:
28315
diff
changeset
|
504 callback_T *cb = &timer->tr_callback; |
075787b91e09
patch 8.2.4887: channel log does not show invoking a timer callback
Bram Moolenaar <Bram@vim.org>
parents:
28315
diff
changeset
|
505 |
075787b91e09
patch 8.2.4887: channel log does not show invoking a timer callback
Bram Moolenaar <Bram@vim.org>
parents:
28315
diff
changeset
|
506 ch_log(NULL, "invoking timer callback %s", |
075787b91e09
patch 8.2.4887: channel log does not show invoking a timer callback
Bram Moolenaar <Bram@vim.org>
parents:
28315
diff
changeset
|
507 cb->cb_partial != NULL ? cb->cb_partial->pt_name : cb->cb_name); |
075787b91e09
patch 8.2.4887: channel log does not show invoking a timer callback
Bram Moolenaar <Bram@vim.org>
parents:
28315
diff
changeset
|
508 } |
075787b91e09
patch 8.2.4887: channel log does not show invoking a timer callback
Bram Moolenaar <Bram@vim.org>
parents:
28315
diff
changeset
|
509 #endif |
075787b91e09
patch 8.2.4887: channel log does not show invoking a timer callback
Bram Moolenaar <Bram@vim.org>
parents:
28315
diff
changeset
|
510 |
19396
a961efb326e5
patch 8.2.0256: time and timer related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
511 argv[0].v_type = VAR_NUMBER; |
a961efb326e5
patch 8.2.0256: time and timer related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
512 argv[0].vval.v_number = (varnumber_T)timer->tr_id; |
a961efb326e5
patch 8.2.0256: time and timer related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
513 argv[1].v_type = VAR_UNKNOWN; |
a961efb326e5
patch 8.2.0256: time and timer related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
514 |
27402
898f520e798b
patch 8.2.4229: possible crash when invoking timer callback fails
Bram Moolenaar <Bram@vim.org>
parents:
27342
diff
changeset
|
515 rettv.v_type = VAR_UNKNOWN; |
19396
a961efb326e5
patch 8.2.0256: time and timer related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
516 call_callback(&timer->tr_callback, -1, &rettv, 1, argv); |
a961efb326e5
patch 8.2.0256: time and timer related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
517 clear_tv(&rettv); |
28725
075787b91e09
patch 8.2.4887: channel log does not show invoking a timer callback
Bram Moolenaar <Bram@vim.org>
parents:
28315
diff
changeset
|
518 |
31287
fa309d9af73c
patch 9.0.0977: it is not easy to see what client-server commands are doing
Bram Moolenaar <Bram@vim.org>
parents:
30857
diff
changeset
|
519 #ifdef FEAT_EVAL |
28725
075787b91e09
patch 8.2.4887: channel log does not show invoking a timer callback
Bram Moolenaar <Bram@vim.org>
parents:
28315
diff
changeset
|
520 ch_log(NULL, "timer callback finished"); |
075787b91e09
patch 8.2.4887: channel log does not show invoking a timer callback
Bram Moolenaar <Bram@vim.org>
parents:
28315
diff
changeset
|
521 #endif |
19396
a961efb326e5
patch 8.2.0256: time and timer related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
522 } |
a961efb326e5
patch 8.2.0256: time and timer related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
523 |
a961efb326e5
patch 8.2.0256: time and timer related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
524 /* |
a961efb326e5
patch 8.2.0256: time and timer related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
525 * Call timers that are due. |
a961efb326e5
patch 8.2.0256: time and timer related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
526 * Return the time in msec until the next timer is due. |
a961efb326e5
patch 8.2.0256: time and timer related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
527 * Returns -1 if there are no pending timers. |
a961efb326e5
patch 8.2.0256: time and timer related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
528 */ |
a961efb326e5
patch 8.2.0256: time and timer related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
529 long |
a961efb326e5
patch 8.2.0256: time and timer related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
530 check_due_timer(void) |
a961efb326e5
patch 8.2.0256: time and timer related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
531 { |
a961efb326e5
patch 8.2.0256: time and timer related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
532 timer_T *timer; |
a961efb326e5
patch 8.2.0256: time and timer related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
533 timer_T *timer_next; |
a961efb326e5
patch 8.2.0256: time and timer related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
534 long this_due; |
a961efb326e5
patch 8.2.0256: time and timer related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
535 long next_due = -1; |
a961efb326e5
patch 8.2.0256: time and timer related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
536 proftime_T now; |
a961efb326e5
patch 8.2.0256: time and timer related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
537 int did_one = FALSE; |
a961efb326e5
patch 8.2.0256: time and timer related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
538 int need_update_screen = FALSE; |
a961efb326e5
patch 8.2.0256: time and timer related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
539 long current_id = last_timer_id; |
a961efb326e5
patch 8.2.0256: time and timer related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
540 |
27012
f9a9ffebe2c0
patch 8.2.4035: timer triggered at the debug prompt may cause trouble
Bram Moolenaar <Bram@vim.org>
parents:
26865
diff
changeset
|
541 // Don't run any timers while exiting, dealing with an error or at the |
f9a9ffebe2c0
patch 8.2.4035: timer triggered at the debug prompt may cause trouble
Bram Moolenaar <Bram@vim.org>
parents:
26865
diff
changeset
|
542 // debug prompt. |
f9a9ffebe2c0
patch 8.2.4035: timer triggered at the debug prompt may cause trouble
Bram Moolenaar <Bram@vim.org>
parents:
26865
diff
changeset
|
543 if (exiting || aborting() || debug_mode) |
19396
a961efb326e5
patch 8.2.0256: time and timer related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
544 return next_due; |
a961efb326e5
patch 8.2.0256: time and timer related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
545 |
a961efb326e5
patch 8.2.0256: time and timer related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
546 profile_start(&now); |
a961efb326e5
patch 8.2.0256: time and timer related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
547 for (timer = first_timer; timer != NULL && !got_int; timer = timer_next) |
a961efb326e5
patch 8.2.0256: time and timer related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
548 { |
a961efb326e5
patch 8.2.0256: time and timer related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
549 timer_next = timer->tr_next; |
a961efb326e5
patch 8.2.0256: time and timer related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
550 |
a961efb326e5
patch 8.2.0256: time and timer related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
551 if (timer->tr_id == -1 || timer->tr_firing || timer->tr_paused) |
a961efb326e5
patch 8.2.0256: time and timer related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
552 continue; |
a961efb326e5
patch 8.2.0256: time and timer related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
553 this_due = proftime_time_left(&timer->tr_due, &now); |
a961efb326e5
patch 8.2.0256: time and timer related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
554 if (this_due <= 1) |
a961efb326e5
patch 8.2.0256: time and timer related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
555 { |
a961efb326e5
patch 8.2.0256: time and timer related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
556 // Save and restore a lot of flags, because the timer fires while |
a961efb326e5
patch 8.2.0256: time and timer related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
557 // waiting for a character, which might be halfway a command. |
a961efb326e5
patch 8.2.0256: time and timer related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
558 int save_timer_busy = timer_busy; |
a961efb326e5
patch 8.2.0256: time and timer related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
559 int save_vgetc_busy = vgetc_busy; |
a961efb326e5
patch 8.2.0256: time and timer related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
560 int save_did_emsg = did_emsg; |
25609
f8bcd21e6e24
patch 8.2.3341: Vim9: function call aborted despite try/catch
Bram Moolenaar <Bram@vim.org>
parents:
25384
diff
changeset
|
561 int prev_uncaught_emsg = uncaught_emsg; |
19396
a961efb326e5
patch 8.2.0256: time and timer related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
562 int save_called_emsg = called_emsg; |
a961efb326e5
patch 8.2.0256: time and timer related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
563 int save_must_redraw = must_redraw; |
a961efb326e5
patch 8.2.0256: time and timer related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
564 int save_ex_pressedreturn = get_pressedreturn(); |
a961efb326e5
patch 8.2.0256: time and timer related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
565 int save_may_garbage_collect = may_garbage_collect; |
33613
31fb1a760ad6
patch 9.0.2050: Vim9: crash with deferred function call and exception
Christian Brabandt <cb@256bit.org>
parents:
32164
diff
changeset
|
566 vimvars_save_T vvsave; |
31fb1a760ad6
patch 9.0.2050: Vim9: crash with deferred function call and exception
Christian Brabandt <cb@256bit.org>
parents:
32164
diff
changeset
|
567 exception_state_T estate; |
31fb1a760ad6
patch 9.0.2050: Vim9: crash with deferred function call and exception
Christian Brabandt <cb@256bit.org>
parents:
32164
diff
changeset
|
568 |
31fb1a760ad6
patch 9.0.2050: Vim9: crash with deferred function call and exception
Christian Brabandt <cb@256bit.org>
parents:
32164
diff
changeset
|
569 exception_state_save(&estate); |
19396
a961efb326e5
patch 8.2.0256: time and timer related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
570 |
a961efb326e5
patch 8.2.0256: time and timer related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
571 // Create a scope for running the timer callback, ignoring most of |
a961efb326e5
patch 8.2.0256: time and timer related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
572 // the current scope, such as being inside a try/catch. |
a961efb326e5
patch 8.2.0256: time and timer related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
573 timer_busy = timer_busy > 0 || vgetc_busy > 0; |
a961efb326e5
patch 8.2.0256: time and timer related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
574 vgetc_busy = 0; |
a961efb326e5
patch 8.2.0256: time and timer related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
575 called_emsg = 0; |
a961efb326e5
patch 8.2.0256: time and timer related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
576 did_emsg = FALSE; |
a961efb326e5
patch 8.2.0256: time and timer related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
577 must_redraw = 0; |
a961efb326e5
patch 8.2.0256: time and timer related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
578 may_garbage_collect = FALSE; |
33613
31fb1a760ad6
patch 9.0.2050: Vim9: crash with deferred function call and exception
Christian Brabandt <cb@256bit.org>
parents:
32164
diff
changeset
|
579 exception_state_clear(); |
19396
a961efb326e5
patch 8.2.0256: time and timer related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
580 save_vimvars(&vvsave); |
a961efb326e5
patch 8.2.0256: time and timer related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
581 |
22827
20ccf5f7dc6d
patch 8.2.1961: various comments can be improved
Bram Moolenaar <Bram@vim.org>
parents:
22157
diff
changeset
|
582 // Invoke the callback. |
19396
a961efb326e5
patch 8.2.0256: time and timer related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
583 timer->tr_firing = TRUE; |
a961efb326e5
patch 8.2.0256: time and timer related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
584 timer_callback(timer); |
a961efb326e5
patch 8.2.0256: time and timer related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
585 timer->tr_firing = FALSE; |
a961efb326e5
patch 8.2.0256: time and timer related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
586 |
22827
20ccf5f7dc6d
patch 8.2.1961: various comments can be improved
Bram Moolenaar <Bram@vim.org>
parents:
22157
diff
changeset
|
587 // Restore stuff. |
19396
a961efb326e5
patch 8.2.0256: time and timer related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
588 timer_next = timer->tr_next; |
a961efb326e5
patch 8.2.0256: time and timer related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
589 did_one = TRUE; |
a961efb326e5
patch 8.2.0256: time and timer related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
590 timer_busy = save_timer_busy; |
a961efb326e5
patch 8.2.0256: time and timer related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
591 vgetc_busy = save_vgetc_busy; |
25609
f8bcd21e6e24
patch 8.2.3341: Vim9: function call aborted despite try/catch
Bram Moolenaar <Bram@vim.org>
parents:
25384
diff
changeset
|
592 if (uncaught_emsg > prev_uncaught_emsg) |
19396
a961efb326e5
patch 8.2.0256: time and timer related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
593 ++timer->tr_emsg_count; |
a961efb326e5
patch 8.2.0256: time and timer related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
594 did_emsg = save_did_emsg; |
a961efb326e5
patch 8.2.0256: time and timer related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
595 called_emsg = save_called_emsg; |
33613
31fb1a760ad6
patch 9.0.2050: Vim9: crash with deferred function call and exception
Christian Brabandt <cb@256bit.org>
parents:
32164
diff
changeset
|
596 exception_state_restore(&estate); |
19396
a961efb326e5
patch 8.2.0256: time and timer related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
597 restore_vimvars(&vvsave); |
a961efb326e5
patch 8.2.0256: time and timer related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
598 if (must_redraw != 0) |
a961efb326e5
patch 8.2.0256: time and timer related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
599 need_update_screen = TRUE; |
a961efb326e5
patch 8.2.0256: time and timer related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
600 must_redraw = must_redraw > save_must_redraw |
a961efb326e5
patch 8.2.0256: time and timer related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
601 ? must_redraw : save_must_redraw; |
a961efb326e5
patch 8.2.0256: time and timer related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
602 set_pressedreturn(save_ex_pressedreturn); |
a961efb326e5
patch 8.2.0256: time and timer related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
603 may_garbage_collect = save_may_garbage_collect; |
a961efb326e5
patch 8.2.0256: time and timer related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
604 |
a961efb326e5
patch 8.2.0256: time and timer related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
605 // Only fire the timer again if it repeats and stop_timer() wasn't |
a961efb326e5
patch 8.2.0256: time and timer related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
606 // called while inside the callback (tr_id == -1). |
a961efb326e5
patch 8.2.0256: time and timer related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
607 if (timer->tr_repeat != 0 && timer->tr_id != -1 |
a961efb326e5
patch 8.2.0256: time and timer related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
608 && timer->tr_emsg_count < 3) |
a961efb326e5
patch 8.2.0256: time and timer related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
609 { |
a961efb326e5
patch 8.2.0256: time and timer related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
610 profile_setlimit(timer->tr_interval, &timer->tr_due); |
a961efb326e5
patch 8.2.0256: time and timer related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
611 this_due = proftime_time_left(&timer->tr_due, &now); |
a961efb326e5
patch 8.2.0256: time and timer related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
612 if (this_due < 1) |
a961efb326e5
patch 8.2.0256: time and timer related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
613 this_due = 1; |
a961efb326e5
patch 8.2.0256: time and timer related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
614 if (timer->tr_repeat > 0) |
a961efb326e5
patch 8.2.0256: time and timer related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
615 --timer->tr_repeat; |
a961efb326e5
patch 8.2.0256: time and timer related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
616 } |
a961efb326e5
patch 8.2.0256: time and timer related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
617 else |
a961efb326e5
patch 8.2.0256: time and timer related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
618 { |
a961efb326e5
patch 8.2.0256: time and timer related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
619 this_due = -1; |
29900
a6721cafbc74
patch 9.0.0288: when 'cmdheight' is zero some messages are not displayed
Bram Moolenaar <Bram@vim.org>
parents:
29442
diff
changeset
|
620 if (timer->tr_keep) |
a6721cafbc74
patch 9.0.0288: when 'cmdheight' is zero some messages are not displayed
Bram Moolenaar <Bram@vim.org>
parents:
29442
diff
changeset
|
621 timer->tr_paused = TRUE; |
a6721cafbc74
patch 9.0.0288: when 'cmdheight' is zero some messages are not displayed
Bram Moolenaar <Bram@vim.org>
parents:
29442
diff
changeset
|
622 else |
a6721cafbc74
patch 9.0.0288: when 'cmdheight' is zero some messages are not displayed
Bram Moolenaar <Bram@vim.org>
parents:
29442
diff
changeset
|
623 { |
a6721cafbc74
patch 9.0.0288: when 'cmdheight' is zero some messages are not displayed
Bram Moolenaar <Bram@vim.org>
parents:
29442
diff
changeset
|
624 remove_timer(timer); |
a6721cafbc74
patch 9.0.0288: when 'cmdheight' is zero some messages are not displayed
Bram Moolenaar <Bram@vim.org>
parents:
29442
diff
changeset
|
625 free_timer(timer); |
a6721cafbc74
patch 9.0.0288: when 'cmdheight' is zero some messages are not displayed
Bram Moolenaar <Bram@vim.org>
parents:
29442
diff
changeset
|
626 } |
19396
a961efb326e5
patch 8.2.0256: time and timer related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
627 } |
a961efb326e5
patch 8.2.0256: time and timer related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
628 } |
a961efb326e5
patch 8.2.0256: time and timer related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
629 if (this_due > 0 && (next_due == -1 || next_due > this_due)) |
a961efb326e5
patch 8.2.0256: time and timer related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
630 next_due = this_due; |
a961efb326e5
patch 8.2.0256: time and timer related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
631 } |
a961efb326e5
patch 8.2.0256: time and timer related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
632 |
a961efb326e5
patch 8.2.0256: time and timer related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
633 if (did_one) |
26466
d413104a94c8
patch 8.2.3763: when editing the cmdline a callback may cause a scroll up
Bram Moolenaar <Bram@vim.org>
parents:
25609
diff
changeset
|
634 redraw_after_callback(need_update_screen, FALSE); |
19396
a961efb326e5
patch 8.2.0256: time and timer related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
635 |
a961efb326e5
patch 8.2.0256: time and timer related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
636 #ifdef FEAT_BEVAL_TERM |
a961efb326e5
patch 8.2.0256: time and timer related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
637 if (bevalexpr_due_set) |
a961efb326e5
patch 8.2.0256: time and timer related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
638 { |
a961efb326e5
patch 8.2.0256: time and timer related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
639 this_due = proftime_time_left(&bevalexpr_due, &now); |
a961efb326e5
patch 8.2.0256: time and timer related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
640 if (this_due <= 1) |
a961efb326e5
patch 8.2.0256: time and timer related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
641 { |
a961efb326e5
patch 8.2.0256: time and timer related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
642 bevalexpr_due_set = FALSE; |
a961efb326e5
patch 8.2.0256: time and timer related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
643 if (balloonEval == NULL) |
a961efb326e5
patch 8.2.0256: time and timer related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
644 { |
a961efb326e5
patch 8.2.0256: time and timer related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
645 balloonEval = ALLOC_CLEAR_ONE(BalloonEval); |
a961efb326e5
patch 8.2.0256: time and timer related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
646 balloonEvalForTerm = TRUE; |
a961efb326e5
patch 8.2.0256: time and timer related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
647 } |
a961efb326e5
patch 8.2.0256: time and timer related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
648 if (balloonEval != NULL) |
a961efb326e5
patch 8.2.0256: time and timer related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
649 { |
a961efb326e5
patch 8.2.0256: time and timer related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
650 general_beval_cb(balloonEval, 0); |
a961efb326e5
patch 8.2.0256: time and timer related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
651 setcursor(); |
a961efb326e5
patch 8.2.0256: time and timer related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
652 out_flush(); |
a961efb326e5
patch 8.2.0256: time and timer related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
653 } |
a961efb326e5
patch 8.2.0256: time and timer related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
654 } |
a961efb326e5
patch 8.2.0256: time and timer related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
655 else if (next_due == -1 || next_due > this_due) |
a961efb326e5
patch 8.2.0256: time and timer related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
656 next_due = this_due; |
a961efb326e5
patch 8.2.0256: time and timer related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
657 } |
a961efb326e5
patch 8.2.0256: time and timer related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
658 #endif |
a961efb326e5
patch 8.2.0256: time and timer related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
659 #ifdef FEAT_TERMINAL |
a961efb326e5
patch 8.2.0256: time and timer related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
660 // Some terminal windows may need their buffer updated. |
a961efb326e5
patch 8.2.0256: time and timer related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
661 next_due = term_check_timers(next_due, &now); |
a961efb326e5
patch 8.2.0256: time and timer related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
662 #endif |
a961efb326e5
patch 8.2.0256: time and timer related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
663 |
a961efb326e5
patch 8.2.0256: time and timer related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
664 return current_id != last_timer_id ? 1 : next_due; |
a961efb326e5
patch 8.2.0256: time and timer related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
665 } |
a961efb326e5
patch 8.2.0256: time and timer related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
666 |
a961efb326e5
patch 8.2.0256: time and timer related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
667 /* |
a961efb326e5
patch 8.2.0256: time and timer related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
668 * Find a timer by ID. Returns NULL if not found; |
a961efb326e5
patch 8.2.0256: time and timer related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
669 */ |
a961efb326e5
patch 8.2.0256: time and timer related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
670 static timer_T * |
a961efb326e5
patch 8.2.0256: time and timer related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
671 find_timer(long id) |
a961efb326e5
patch 8.2.0256: time and timer related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
672 { |
a961efb326e5
patch 8.2.0256: time and timer related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
673 timer_T *timer; |
a961efb326e5
patch 8.2.0256: time and timer related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
674 |
31825
0d27ddce621d
patch 9.0.1245: code is indented more than necessary
Bram Moolenaar <Bram@vim.org>
parents:
31313
diff
changeset
|
675 if (id < 0) |
0d27ddce621d
patch 9.0.1245: code is indented more than necessary
Bram Moolenaar <Bram@vim.org>
parents:
31313
diff
changeset
|
676 return NULL; |
0d27ddce621d
patch 9.0.1245: code is indented more than necessary
Bram Moolenaar <Bram@vim.org>
parents:
31313
diff
changeset
|
677 |
0d27ddce621d
patch 9.0.1245: code is indented more than necessary
Bram Moolenaar <Bram@vim.org>
parents:
31313
diff
changeset
|
678 FOR_ALL_TIMERS(timer) |
0d27ddce621d
patch 9.0.1245: code is indented more than necessary
Bram Moolenaar <Bram@vim.org>
parents:
31313
diff
changeset
|
679 if (timer->tr_id == id) |
0d27ddce621d
patch 9.0.1245: code is indented more than necessary
Bram Moolenaar <Bram@vim.org>
parents:
31313
diff
changeset
|
680 return timer; |
19396
a961efb326e5
patch 8.2.0256: time and timer related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
681 return NULL; |
a961efb326e5
patch 8.2.0256: time and timer related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
682 } |
a961efb326e5
patch 8.2.0256: time and timer related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
683 |
a961efb326e5
patch 8.2.0256: time and timer related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
684 |
a961efb326e5
patch 8.2.0256: time and timer related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
685 /* |
a961efb326e5
patch 8.2.0256: time and timer related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
686 * Stop a timer and delete it. |
a961efb326e5
patch 8.2.0256: time and timer related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
687 */ |
a961efb326e5
patch 8.2.0256: time and timer related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
688 void |
a961efb326e5
patch 8.2.0256: time and timer related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
689 stop_timer(timer_T *timer) |
a961efb326e5
patch 8.2.0256: time and timer related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
690 { |
a961efb326e5
patch 8.2.0256: time and timer related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
691 if (timer->tr_firing) |
a961efb326e5
patch 8.2.0256: time and timer related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
692 // Free the timer after the callback returns. |
a961efb326e5
patch 8.2.0256: time and timer related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
693 timer->tr_id = -1; |
a961efb326e5
patch 8.2.0256: time and timer related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
694 else |
a961efb326e5
patch 8.2.0256: time and timer related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
695 { |
a961efb326e5
patch 8.2.0256: time and timer related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
696 remove_timer(timer); |
a961efb326e5
patch 8.2.0256: time and timer related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
697 free_timer(timer); |
a961efb326e5
patch 8.2.0256: time and timer related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
698 } |
a961efb326e5
patch 8.2.0256: time and timer related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
699 } |
a961efb326e5
patch 8.2.0256: time and timer related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
700 |
a961efb326e5
patch 8.2.0256: time and timer related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
701 static void |
a961efb326e5
patch 8.2.0256: time and timer related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
702 stop_all_timers(void) |
a961efb326e5
patch 8.2.0256: time and timer related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
703 { |
a961efb326e5
patch 8.2.0256: time and timer related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
704 timer_T *timer; |
a961efb326e5
patch 8.2.0256: time and timer related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
705 timer_T *timer_next; |
a961efb326e5
patch 8.2.0256: time and timer related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
706 |
a961efb326e5
patch 8.2.0256: time and timer related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
707 for (timer = first_timer; timer != NULL; timer = timer_next) |
a961efb326e5
patch 8.2.0256: time and timer related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
708 { |
a961efb326e5
patch 8.2.0256: time and timer related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
709 timer_next = timer->tr_next; |
a961efb326e5
patch 8.2.0256: time and timer related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
710 stop_timer(timer); |
a961efb326e5
patch 8.2.0256: time and timer related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
711 } |
a961efb326e5
patch 8.2.0256: time and timer related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
712 } |
a961efb326e5
patch 8.2.0256: time and timer related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
713 |
a961efb326e5
patch 8.2.0256: time and timer related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
714 static void |
a961efb326e5
patch 8.2.0256: time and timer related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
715 add_timer_info(typval_T *rettv, timer_T *timer) |
a961efb326e5
patch 8.2.0256: time and timer related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
716 { |
a961efb326e5
patch 8.2.0256: time and timer related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
717 list_T *list = rettv->vval.v_list; |
a961efb326e5
patch 8.2.0256: time and timer related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
718 dict_T *dict = dict_alloc(); |
a961efb326e5
patch 8.2.0256: time and timer related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
719 dictitem_T *di; |
a961efb326e5
patch 8.2.0256: time and timer related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
720 long remaining; |
a961efb326e5
patch 8.2.0256: time and timer related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
721 proftime_T now; |
a961efb326e5
patch 8.2.0256: time and timer related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
722 |
a961efb326e5
patch 8.2.0256: time and timer related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
723 if (dict == NULL) |
a961efb326e5
patch 8.2.0256: time and timer related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
724 return; |
a961efb326e5
patch 8.2.0256: time and timer related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
725 list_append_dict(list, dict); |
a961efb326e5
patch 8.2.0256: time and timer related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
726 |
a961efb326e5
patch 8.2.0256: time and timer related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
727 dict_add_number(dict, "id", timer->tr_id); |
a961efb326e5
patch 8.2.0256: time and timer related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
728 dict_add_number(dict, "time", (long)timer->tr_interval); |
a961efb326e5
patch 8.2.0256: time and timer related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
729 |
a961efb326e5
patch 8.2.0256: time and timer related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
730 profile_start(&now); |
a961efb326e5
patch 8.2.0256: time and timer related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
731 remaining = proftime_time_left(&timer->tr_due, &now); |
a961efb326e5
patch 8.2.0256: time and timer related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
732 dict_add_number(dict, "remaining", (long)remaining); |
a961efb326e5
patch 8.2.0256: time and timer related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
733 |
a961efb326e5
patch 8.2.0256: time and timer related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
734 dict_add_number(dict, "repeat", |
26476
7426c2657710
patch 8.2.3768: timer_info() has the wrong repeat value in a timer callback
Bram Moolenaar <Bram@vim.org>
parents:
26466
diff
changeset
|
735 (long)(timer->tr_repeat < 0 ? -1 |
7426c2657710
patch 8.2.3768: timer_info() has the wrong repeat value in a timer callback
Bram Moolenaar <Bram@vim.org>
parents:
26466
diff
changeset
|
736 : timer->tr_repeat + (timer->tr_firing ? 0 : 1))); |
19396
a961efb326e5
patch 8.2.0256: time and timer related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
737 dict_add_number(dict, "paused", (long)(timer->tr_paused)); |
a961efb326e5
patch 8.2.0256: time and timer related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
738 |
a961efb326e5
patch 8.2.0256: time and timer related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
739 di = dictitem_alloc((char_u *)"callback"); |
a961efb326e5
patch 8.2.0256: time and timer related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
740 if (di != NULL) |
a961efb326e5
patch 8.2.0256: time and timer related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
741 { |
a961efb326e5
patch 8.2.0256: time and timer related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
742 if (dict_add(dict, di) == FAIL) |
a961efb326e5
patch 8.2.0256: time and timer related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
743 vim_free(di); |
a961efb326e5
patch 8.2.0256: time and timer related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
744 else |
a961efb326e5
patch 8.2.0256: time and timer related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
745 put_callback(&timer->tr_callback, &di->di_tv); |
a961efb326e5
patch 8.2.0256: time and timer related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
746 } |
a961efb326e5
patch 8.2.0256: time and timer related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
747 } |
a961efb326e5
patch 8.2.0256: time and timer related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
748 |
a961efb326e5
patch 8.2.0256: time and timer related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
749 static void |
a961efb326e5
patch 8.2.0256: time and timer related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
750 add_timer_info_all(typval_T *rettv) |
a961efb326e5
patch 8.2.0256: time and timer related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
751 { |
a961efb326e5
patch 8.2.0256: time and timer related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
752 timer_T *timer; |
a961efb326e5
patch 8.2.0256: time and timer related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
753 |
19934
3ff714d765ba
patch 8.2.0523: loops are repeated
Bram Moolenaar <Bram@vim.org>
parents:
19396
diff
changeset
|
754 FOR_ALL_TIMERS(timer) |
19396
a961efb326e5
patch 8.2.0256: time and timer related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
755 if (timer->tr_id != -1) |
a961efb326e5
patch 8.2.0256: time and timer related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
756 add_timer_info(rettv, timer); |
a961efb326e5
patch 8.2.0256: time and timer related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
757 } |
a961efb326e5
patch 8.2.0256: time and timer related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
758 |
a961efb326e5
patch 8.2.0256: time and timer related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
759 /* |
a961efb326e5
patch 8.2.0256: time and timer related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
760 * Mark references in partials of timers. |
a961efb326e5
patch 8.2.0256: time and timer related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
761 */ |
a961efb326e5
patch 8.2.0256: time and timer related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
762 int |
a961efb326e5
patch 8.2.0256: time and timer related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
763 set_ref_in_timer(int copyID) |
a961efb326e5
patch 8.2.0256: time and timer related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
764 { |
a961efb326e5
patch 8.2.0256: time and timer related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
765 int abort = FALSE; |
a961efb326e5
patch 8.2.0256: time and timer related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
766 timer_T *timer; |
a961efb326e5
patch 8.2.0256: time and timer related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
767 typval_T tv; |
a961efb326e5
patch 8.2.0256: time and timer related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
768 |
a961efb326e5
patch 8.2.0256: time and timer related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
769 for (timer = first_timer; !abort && timer != NULL; timer = timer->tr_next) |
a961efb326e5
patch 8.2.0256: time and timer related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
770 { |
a961efb326e5
patch 8.2.0256: time and timer related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
771 if (timer->tr_callback.cb_partial != NULL) |
a961efb326e5
patch 8.2.0256: time and timer related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
772 { |
a961efb326e5
patch 8.2.0256: time and timer related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
773 tv.v_type = VAR_PARTIAL; |
a961efb326e5
patch 8.2.0256: time and timer related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
774 tv.vval.v_partial = timer->tr_callback.cb_partial; |
a961efb326e5
patch 8.2.0256: time and timer related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
775 } |
a961efb326e5
patch 8.2.0256: time and timer related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
776 else |
a961efb326e5
patch 8.2.0256: time and timer related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
777 { |
a961efb326e5
patch 8.2.0256: time and timer related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
778 tv.v_type = VAR_FUNC; |
a961efb326e5
patch 8.2.0256: time and timer related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
779 tv.vval.v_string = timer->tr_callback.cb_name; |
a961efb326e5
patch 8.2.0256: time and timer related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
780 } |
a961efb326e5
patch 8.2.0256: time and timer related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
781 abort = abort || set_ref_in_item(&tv, copyID, NULL, NULL); |
a961efb326e5
patch 8.2.0256: time and timer related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
782 } |
a961efb326e5
patch 8.2.0256: time and timer related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
783 return abort; |
a961efb326e5
patch 8.2.0256: time and timer related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
784 } |
a961efb326e5
patch 8.2.0256: time and timer related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
785 |
30695
b9cc46461994
patch 9.0.0682: crash when popup with deleted timer is closed
Bram Moolenaar <Bram@vim.org>
parents:
30310
diff
changeset
|
786 /* |
b9cc46461994
patch 9.0.0682: crash when popup with deleted timer is closed
Bram Moolenaar <Bram@vim.org>
parents:
30310
diff
changeset
|
787 * Return TRUE if "timer" exists in the list of timers. |
b9cc46461994
patch 9.0.0682: crash when popup with deleted timer is closed
Bram Moolenaar <Bram@vim.org>
parents:
30310
diff
changeset
|
788 */ |
b9cc46461994
patch 9.0.0682: crash when popup with deleted timer is closed
Bram Moolenaar <Bram@vim.org>
parents:
30310
diff
changeset
|
789 int |
b9cc46461994
patch 9.0.0682: crash when popup with deleted timer is closed
Bram Moolenaar <Bram@vim.org>
parents:
30310
diff
changeset
|
790 timer_valid(timer_T *timer) |
b9cc46461994
patch 9.0.0682: crash when popup with deleted timer is closed
Bram Moolenaar <Bram@vim.org>
parents:
30310
diff
changeset
|
791 { |
b9cc46461994
patch 9.0.0682: crash when popup with deleted timer is closed
Bram Moolenaar <Bram@vim.org>
parents:
30310
diff
changeset
|
792 if (timer == NULL) |
b9cc46461994
patch 9.0.0682: crash when popup with deleted timer is closed
Bram Moolenaar <Bram@vim.org>
parents:
30310
diff
changeset
|
793 return FALSE; |
31825
0d27ddce621d
patch 9.0.1245: code is indented more than necessary
Bram Moolenaar <Bram@vim.org>
parents:
31313
diff
changeset
|
794 |
0d27ddce621d
patch 9.0.1245: code is indented more than necessary
Bram Moolenaar <Bram@vim.org>
parents:
31313
diff
changeset
|
795 timer_T *t; |
0d27ddce621d
patch 9.0.1245: code is indented more than necessary
Bram Moolenaar <Bram@vim.org>
parents:
31313
diff
changeset
|
796 FOR_ALL_TIMERS(t) |
30695
b9cc46461994
patch 9.0.0682: crash when popup with deleted timer is closed
Bram Moolenaar <Bram@vim.org>
parents:
30310
diff
changeset
|
797 if (t == timer) |
b9cc46461994
patch 9.0.0682: crash when popup with deleted timer is closed
Bram Moolenaar <Bram@vim.org>
parents:
30310
diff
changeset
|
798 return TRUE; |
b9cc46461994
patch 9.0.0682: crash when popup with deleted timer is closed
Bram Moolenaar <Bram@vim.org>
parents:
30310
diff
changeset
|
799 return FALSE; |
b9cc46461994
patch 9.0.0682: crash when popup with deleted timer is closed
Bram Moolenaar <Bram@vim.org>
parents:
30310
diff
changeset
|
800 } |
b9cc46461994
patch 9.0.0682: crash when popup with deleted timer is closed
Bram Moolenaar <Bram@vim.org>
parents:
30310
diff
changeset
|
801 |
19396
a961efb326e5
patch 8.2.0256: time and timer related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
802 # if defined(EXITFREE) || defined(PROTO) |
a961efb326e5
patch 8.2.0256: time and timer related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
803 void |
32009
4545f58c8490
patch 9.0.1336: functions without arguments are not always declared properly
Bram Moolenaar <Bram@vim.org>
parents:
31825
diff
changeset
|
804 timer_free_all(void) |
19396
a961efb326e5
patch 8.2.0256: time and timer related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
805 { |
a961efb326e5
patch 8.2.0256: time and timer related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
806 while (first_timer != NULL) |
a961efb326e5
patch 8.2.0256: time and timer related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
807 { |
30695
b9cc46461994
patch 9.0.0682: crash when popup with deleted timer is closed
Bram Moolenaar <Bram@vim.org>
parents:
30310
diff
changeset
|
808 timer_T *timer = first_timer; |
19396
a961efb326e5
patch 8.2.0256: time and timer related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
809 remove_timer(timer); |
a961efb326e5
patch 8.2.0256: time and timer related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
810 free_timer(timer); |
a961efb326e5
patch 8.2.0256: time and timer related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
811 } |
a961efb326e5
patch 8.2.0256: time and timer related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
812 } |
a961efb326e5
patch 8.2.0256: time and timer related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
813 # endif |
a961efb326e5
patch 8.2.0256: time and timer related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
814 |
a961efb326e5
patch 8.2.0256: time and timer related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
815 /* |
a961efb326e5
patch 8.2.0256: time and timer related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
816 * "timer_info([timer])" function |
a961efb326e5
patch 8.2.0256: time and timer related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
817 */ |
a961efb326e5
patch 8.2.0256: time and timer related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
818 void |
a961efb326e5
patch 8.2.0256: time and timer related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
819 f_timer_info(typval_T *argvars, typval_T *rettv) |
a961efb326e5
patch 8.2.0256: time and timer related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
820 { |
a961efb326e5
patch 8.2.0256: time and timer related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
821 timer_T *timer = NULL; |
a961efb326e5
patch 8.2.0256: time and timer related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
822 |
29175
755ab148288b
patch 8.2.5107: some callers of rettv_list_alloc() check for not OK
Bram Moolenaar <Bram@vim.org>
parents:
28725
diff
changeset
|
823 if (rettv_list_alloc(rettv) == FAIL) |
19396
a961efb326e5
patch 8.2.0256: time and timer related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
824 return; |
25384
e8e2c4d33b9b
patch 8.2.3229: Vim9: runtime and compile time type checks are not the same
Bram Moolenaar <Bram@vim.org>
parents:
25348
diff
changeset
|
825 |
30043
fd855ad74887
patch 9.0.0359: error message for wrong argument type is not specific
Bram Moolenaar <Bram@vim.org>
parents:
29994
diff
changeset
|
826 if (check_for_opt_number_arg(argvars, 0) == FAIL) |
25384
e8e2c4d33b9b
patch 8.2.3229: Vim9: runtime and compile time type checks are not the same
Bram Moolenaar <Bram@vim.org>
parents:
25348
diff
changeset
|
827 return; |
e8e2c4d33b9b
patch 8.2.3229: Vim9: runtime and compile time type checks are not the same
Bram Moolenaar <Bram@vim.org>
parents:
25348
diff
changeset
|
828 |
19396
a961efb326e5
patch 8.2.0256: time and timer related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
829 if (argvars[0].v_type != VAR_UNKNOWN) |
a961efb326e5
patch 8.2.0256: time and timer related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
830 { |
30043
fd855ad74887
patch 9.0.0359: error message for wrong argument type is not specific
Bram Moolenaar <Bram@vim.org>
parents:
29994
diff
changeset
|
831 timer = find_timer((int)tv_get_number(&argvars[0])); |
fd855ad74887
patch 9.0.0359: error message for wrong argument type is not specific
Bram Moolenaar <Bram@vim.org>
parents:
29994
diff
changeset
|
832 if (timer != NULL) |
fd855ad74887
patch 9.0.0359: error message for wrong argument type is not specific
Bram Moolenaar <Bram@vim.org>
parents:
29994
diff
changeset
|
833 add_timer_info(rettv, timer); |
19396
a961efb326e5
patch 8.2.0256: time and timer related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
834 } |
a961efb326e5
patch 8.2.0256: time and timer related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
835 else |
a961efb326e5
patch 8.2.0256: time and timer related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
836 add_timer_info_all(rettv); |
a961efb326e5
patch 8.2.0256: time and timer related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
837 } |
a961efb326e5
patch 8.2.0256: time and timer related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
838 |
a961efb326e5
patch 8.2.0256: time and timer related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
839 /* |
a961efb326e5
patch 8.2.0256: time and timer related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
840 * "timer_pause(timer, paused)" function |
a961efb326e5
patch 8.2.0256: time and timer related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
841 */ |
a961efb326e5
patch 8.2.0256: time and timer related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
842 void |
a961efb326e5
patch 8.2.0256: time and timer related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
843 f_timer_pause(typval_T *argvars, typval_T *rettv UNUSED) |
a961efb326e5
patch 8.2.0256: time and timer related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
844 { |
a961efb326e5
patch 8.2.0256: time and timer related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
845 timer_T *timer = NULL; |
25302
4d3c68196d05
patch 8.2.3188: Vim9: argument types are not checked at compile time
Bram Moolenaar <Bram@vim.org>
parents:
25252
diff
changeset
|
846 |
4d3c68196d05
patch 8.2.3188: Vim9: argument types are not checked at compile time
Bram Moolenaar <Bram@vim.org>
parents:
25252
diff
changeset
|
847 if (in_vim9script() |
4d3c68196d05
patch 8.2.3188: Vim9: argument types are not checked at compile time
Bram Moolenaar <Bram@vim.org>
parents:
25252
diff
changeset
|
848 && (check_for_number_arg(argvars, 0) == FAIL |
4d3c68196d05
patch 8.2.3188: Vim9: argument types are not checked at compile time
Bram Moolenaar <Bram@vim.org>
parents:
25252
diff
changeset
|
849 || check_for_bool_arg(argvars, 1) == FAIL)) |
4d3c68196d05
patch 8.2.3188: Vim9: argument types are not checked at compile time
Bram Moolenaar <Bram@vim.org>
parents:
25252
diff
changeset
|
850 return; |
19396
a961efb326e5
patch 8.2.0256: time and timer related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
851 |
a961efb326e5
patch 8.2.0256: time and timer related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
852 if (argvars[0].v_type != VAR_NUMBER) |
31825
0d27ddce621d
patch 9.0.1245: code is indented more than necessary
Bram Moolenaar <Bram@vim.org>
parents:
31313
diff
changeset
|
853 { |
25306
078edc1821bf
patch 8.2.3190: error messages are spread out
Bram Moolenaar <Bram@vim.org>
parents:
25302
diff
changeset
|
854 emsg(_(e_number_expected)); |
31825
0d27ddce621d
patch 9.0.1245: code is indented more than necessary
Bram Moolenaar <Bram@vim.org>
parents:
31313
diff
changeset
|
855 return; |
0d27ddce621d
patch 9.0.1245: code is indented more than necessary
Bram Moolenaar <Bram@vim.org>
parents:
31313
diff
changeset
|
856 } |
29900
a6721cafbc74
patch 9.0.0288: when 'cmdheight' is zero some messages are not displayed
Bram Moolenaar <Bram@vim.org>
parents:
29442
diff
changeset
|
857 |
31825
0d27ddce621d
patch 9.0.1245: code is indented more than necessary
Bram Moolenaar <Bram@vim.org>
parents:
31313
diff
changeset
|
858 int paused = (int)tv_get_bool(&argvars[1]); |
0d27ddce621d
patch 9.0.1245: code is indented more than necessary
Bram Moolenaar <Bram@vim.org>
parents:
31313
diff
changeset
|
859 |
0d27ddce621d
patch 9.0.1245: code is indented more than necessary
Bram Moolenaar <Bram@vim.org>
parents:
31313
diff
changeset
|
860 timer = find_timer((int)tv_get_number(&argvars[0])); |
0d27ddce621d
patch 9.0.1245: code is indented more than necessary
Bram Moolenaar <Bram@vim.org>
parents:
31313
diff
changeset
|
861 if (timer != NULL) |
0d27ddce621d
patch 9.0.1245: code is indented more than necessary
Bram Moolenaar <Bram@vim.org>
parents:
31313
diff
changeset
|
862 timer->tr_paused = paused; |
19396
a961efb326e5
patch 8.2.0256: time and timer related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
863 } |
a961efb326e5
patch 8.2.0256: time and timer related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
864 |
a961efb326e5
patch 8.2.0256: time and timer related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
865 /* |
a961efb326e5
patch 8.2.0256: time and timer related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
866 * "timer_start(time, callback [, options])" function |
a961efb326e5
patch 8.2.0256: time and timer related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
867 */ |
a961efb326e5
patch 8.2.0256: time and timer related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
868 void |
a961efb326e5
patch 8.2.0256: time and timer related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
869 f_timer_start(typval_T *argvars, typval_T *rettv) |
a961efb326e5
patch 8.2.0256: time and timer related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
870 { |
25348
75031a22be39
patch 8.2.3211: Vim9: argument types are not checked at compile time
Bram Moolenaar <Bram@vim.org>
parents:
25306
diff
changeset
|
871 long msec; |
19396
a961efb326e5
patch 8.2.0256: time and timer related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
872 timer_T *timer; |
a961efb326e5
patch 8.2.0256: time and timer related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
873 int repeat = 0; |
a961efb326e5
patch 8.2.0256: time and timer related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
874 callback_T callback; |
a961efb326e5
patch 8.2.0256: time and timer related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
875 dict_T *dict; |
a961efb326e5
patch 8.2.0256: time and timer related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
876 |
a961efb326e5
patch 8.2.0256: time and timer related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
877 rettv->vval.v_number = -1; |
a961efb326e5
patch 8.2.0256: time and timer related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
878 if (check_secure()) |
a961efb326e5
patch 8.2.0256: time and timer related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
879 return; |
25348
75031a22be39
patch 8.2.3211: Vim9: argument types are not checked at compile time
Bram Moolenaar <Bram@vim.org>
parents:
25306
diff
changeset
|
880 |
75031a22be39
patch 8.2.3211: Vim9: argument types are not checked at compile time
Bram Moolenaar <Bram@vim.org>
parents:
25306
diff
changeset
|
881 if (in_vim9script() |
75031a22be39
patch 8.2.3211: Vim9: argument types are not checked at compile time
Bram Moolenaar <Bram@vim.org>
parents:
25306
diff
changeset
|
882 && (check_for_number_arg(argvars, 0) == FAIL |
75031a22be39
patch 8.2.3211: Vim9: argument types are not checked at compile time
Bram Moolenaar <Bram@vim.org>
parents:
25306
diff
changeset
|
883 || check_for_opt_dict_arg(argvars, 2) == FAIL)) |
75031a22be39
patch 8.2.3211: Vim9: argument types are not checked at compile time
Bram Moolenaar <Bram@vim.org>
parents:
25306
diff
changeset
|
884 return; |
75031a22be39
patch 8.2.3211: Vim9: argument types are not checked at compile time
Bram Moolenaar <Bram@vim.org>
parents:
25306
diff
changeset
|
885 |
75031a22be39
patch 8.2.3211: Vim9: argument types are not checked at compile time
Bram Moolenaar <Bram@vim.org>
parents:
25306
diff
changeset
|
886 msec = (long)tv_get_number(&argvars[0]); |
19396
a961efb326e5
patch 8.2.0256: time and timer related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
887 if (argvars[2].v_type != VAR_UNKNOWN) |
a961efb326e5
patch 8.2.0256: time and timer related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
888 { |
29994
86eb4aba16c3
patch 9.0.0335: checks for Dictionary argument often give a vague error
Bram Moolenaar <Bram@vim.org>
parents:
29900
diff
changeset
|
889 if (check_for_nonnull_dict_arg(argvars, 2) == FAIL) |
19396
a961efb326e5
patch 8.2.0256: time and timer related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
890 return; |
29994
86eb4aba16c3
patch 9.0.0335: checks for Dictionary argument often give a vague error
Bram Moolenaar <Bram@vim.org>
parents:
29900
diff
changeset
|
891 |
86eb4aba16c3
patch 9.0.0335: checks for Dictionary argument often give a vague error
Bram Moolenaar <Bram@vim.org>
parents:
29900
diff
changeset
|
892 dict = argvars[2].vval.v_dict; |
28315
62cc3b60493b
patch 8.2.4683: verbose check with dict_find() to see if a key is present
Bram Moolenaar <Bram@vim.org>
parents:
27402
diff
changeset
|
893 if (dict_has_key(dict, "repeat")) |
29442
827d9f2b7a71
patch 9.0.0063: too many type casts for dict_get functions
Bram Moolenaar <Bram@vim.org>
parents:
29175
diff
changeset
|
894 repeat = dict_get_number(dict, "repeat"); |
19396
a961efb326e5
patch 8.2.0256: time and timer related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
895 } |
a961efb326e5
patch 8.2.0256: time and timer related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
896 |
a961efb326e5
patch 8.2.0256: time and timer related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
897 callback = get_callback(&argvars[1]); |
a961efb326e5
patch 8.2.0256: time and timer related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
898 if (callback.cb_name == NULL) |
a961efb326e5
patch 8.2.0256: time and timer related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
899 return; |
27402
898f520e798b
patch 8.2.4229: possible crash when invoking timer callback fails
Bram Moolenaar <Bram@vim.org>
parents:
27342
diff
changeset
|
900 if (in_vim9script() && *callback.cb_name == NUL) |
898f520e798b
patch 8.2.4229: possible crash when invoking timer callback fails
Bram Moolenaar <Bram@vim.org>
parents:
27342
diff
changeset
|
901 { |
898f520e798b
patch 8.2.4229: possible crash when invoking timer callback fails
Bram Moolenaar <Bram@vim.org>
parents:
27342
diff
changeset
|
902 // empty callback is not useful for a timer |
898f520e798b
patch 8.2.4229: possible crash when invoking timer callback fails
Bram Moolenaar <Bram@vim.org>
parents:
27342
diff
changeset
|
903 emsg(_(e_invalid_callback_argument)); |
898f520e798b
patch 8.2.4229: possible crash when invoking timer callback fails
Bram Moolenaar <Bram@vim.org>
parents:
27342
diff
changeset
|
904 free_callback(&callback); |
898f520e798b
patch 8.2.4229: possible crash when invoking timer callback fails
Bram Moolenaar <Bram@vim.org>
parents:
27342
diff
changeset
|
905 return; |
898f520e798b
patch 8.2.4229: possible crash when invoking timer callback fails
Bram Moolenaar <Bram@vim.org>
parents:
27342
diff
changeset
|
906 } |
19396
a961efb326e5
patch 8.2.0256: time and timer related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
907 |
a961efb326e5
patch 8.2.0256: time and timer related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
908 timer = create_timer(msec, repeat); |
a961efb326e5
patch 8.2.0256: time and timer related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
909 if (timer == NULL) |
31825
0d27ddce621d
patch 9.0.1245: code is indented more than necessary
Bram Moolenaar <Bram@vim.org>
parents:
31313
diff
changeset
|
910 { |
19396
a961efb326e5
patch 8.2.0256: time and timer related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
911 free_callback(&callback); |
31825
0d27ddce621d
patch 9.0.1245: code is indented more than necessary
Bram Moolenaar <Bram@vim.org>
parents:
31313
diff
changeset
|
912 return; |
19396
a961efb326e5
patch 8.2.0256: time and timer related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
913 } |
31825
0d27ddce621d
patch 9.0.1245: code is indented more than necessary
Bram Moolenaar <Bram@vim.org>
parents:
31313
diff
changeset
|
914 set_callback(&timer->tr_callback, &callback); |
0d27ddce621d
patch 9.0.1245: code is indented more than necessary
Bram Moolenaar <Bram@vim.org>
parents:
31313
diff
changeset
|
915 if (callback.cb_free_name) |
0d27ddce621d
patch 9.0.1245: code is indented more than necessary
Bram Moolenaar <Bram@vim.org>
parents:
31313
diff
changeset
|
916 vim_free(callback.cb_name); |
0d27ddce621d
patch 9.0.1245: code is indented more than necessary
Bram Moolenaar <Bram@vim.org>
parents:
31313
diff
changeset
|
917 rettv->vval.v_number = (varnumber_T)timer->tr_id; |
19396
a961efb326e5
patch 8.2.0256: time and timer related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
918 } |
a961efb326e5
patch 8.2.0256: time and timer related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
919 |
a961efb326e5
patch 8.2.0256: time and timer related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
920 /* |
a961efb326e5
patch 8.2.0256: time and timer related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
921 * "timer_stop(timer)" function |
a961efb326e5
patch 8.2.0256: time and timer related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
922 */ |
a961efb326e5
patch 8.2.0256: time and timer related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
923 void |
a961efb326e5
patch 8.2.0256: time and timer related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
924 f_timer_stop(typval_T *argvars, typval_T *rettv UNUSED) |
a961efb326e5
patch 8.2.0256: time and timer related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
925 { |
a961efb326e5
patch 8.2.0256: time and timer related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
926 timer_T *timer; |
a961efb326e5
patch 8.2.0256: time and timer related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
927 |
30043
fd855ad74887
patch 9.0.0359: error message for wrong argument type is not specific
Bram Moolenaar <Bram@vim.org>
parents:
29994
diff
changeset
|
928 if (check_for_number_arg(argvars, 0) == FAIL) |
25384
e8e2c4d33b9b
patch 8.2.3229: Vim9: runtime and compile time type checks are not the same
Bram Moolenaar <Bram@vim.org>
parents:
25348
diff
changeset
|
929 return; |
e8e2c4d33b9b
patch 8.2.3229: Vim9: runtime and compile time type checks are not the same
Bram Moolenaar <Bram@vim.org>
parents:
25348
diff
changeset
|
930 |
19396
a961efb326e5
patch 8.2.0256: time and timer related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
931 timer = find_timer((int)tv_get_number(&argvars[0])); |
a961efb326e5
patch 8.2.0256: time and timer related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
932 if (timer != NULL) |
a961efb326e5
patch 8.2.0256: time and timer related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
933 stop_timer(timer); |
a961efb326e5
patch 8.2.0256: time and timer related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
934 } |
a961efb326e5
patch 8.2.0256: time and timer related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
935 |
a961efb326e5
patch 8.2.0256: time and timer related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
936 /* |
a961efb326e5
patch 8.2.0256: time and timer related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
937 * "timer_stopall()" function |
a961efb326e5
patch 8.2.0256: time and timer related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
938 */ |
a961efb326e5
patch 8.2.0256: time and timer related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
939 void |
a961efb326e5
patch 8.2.0256: time and timer related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
940 f_timer_stopall(typval_T *argvars UNUSED, typval_T *rettv UNUSED) |
a961efb326e5
patch 8.2.0256: time and timer related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
941 { |
a961efb326e5
patch 8.2.0256: time and timer related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
942 stop_all_timers(); |
a961efb326e5
patch 8.2.0256: time and timer related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
943 } |
a961efb326e5
patch 8.2.0256: time and timer related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
944 |
a961efb326e5
patch 8.2.0256: time and timer related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
945 # endif // FEAT_TIMERS |
a961efb326e5
patch 8.2.0256: time and timer related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
946 |
a961efb326e5
patch 8.2.0256: time and timer related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
947 # if defined(STARTUPTIME) || defined(PROTO) |
a961efb326e5
patch 8.2.0256: time and timer related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
948 static struct timeval prev_timeval; |
a961efb326e5
patch 8.2.0256: time and timer related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
949 |
a961efb326e5
patch 8.2.0256: time and timer related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
950 # ifdef MSWIN |
a961efb326e5
patch 8.2.0256: time and timer related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
951 /* |
a961efb326e5
patch 8.2.0256: time and timer related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
952 * Windows doesn't have gettimeofday(), although it does have struct timeval. |
a961efb326e5
patch 8.2.0256: time and timer related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
953 */ |
a961efb326e5
patch 8.2.0256: time and timer related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
954 static int |
a961efb326e5
patch 8.2.0256: time and timer related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
955 gettimeofday(struct timeval *tv, char *dummy UNUSED) |
a961efb326e5
patch 8.2.0256: time and timer related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
956 { |
a961efb326e5
patch 8.2.0256: time and timer related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
957 long t = clock(); |
a961efb326e5
patch 8.2.0256: time and timer related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
958 tv->tv_sec = t / CLOCKS_PER_SEC; |
a961efb326e5
patch 8.2.0256: time and timer related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
959 tv->tv_usec = (t - tv->tv_sec * CLOCKS_PER_SEC) * 1000000 / CLOCKS_PER_SEC; |
a961efb326e5
patch 8.2.0256: time and timer related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
960 return 0; |
a961efb326e5
patch 8.2.0256: time and timer related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
961 } |
a961efb326e5
patch 8.2.0256: time and timer related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
962 # endif |
a961efb326e5
patch 8.2.0256: time and timer related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
963 |
a961efb326e5
patch 8.2.0256: time and timer related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
964 /* |
a961efb326e5
patch 8.2.0256: time and timer related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
965 * Save the previous time before doing something that could nest. |
a961efb326e5
patch 8.2.0256: time and timer related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
966 * set "*tv_rel" to the time elapsed so far. |
a961efb326e5
patch 8.2.0256: time and timer related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
967 */ |
a961efb326e5
patch 8.2.0256: time and timer related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
968 void |
a961efb326e5
patch 8.2.0256: time and timer related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
969 time_push(void *tv_rel, void *tv_start) |
a961efb326e5
patch 8.2.0256: time and timer related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
970 { |
a961efb326e5
patch 8.2.0256: time and timer related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
971 *((struct timeval *)tv_rel) = prev_timeval; |
a961efb326e5
patch 8.2.0256: time and timer related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
972 gettimeofday(&prev_timeval, NULL); |
a961efb326e5
patch 8.2.0256: time and timer related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
973 ((struct timeval *)tv_rel)->tv_usec = prev_timeval.tv_usec |
a961efb326e5
patch 8.2.0256: time and timer related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
974 - ((struct timeval *)tv_rel)->tv_usec; |
a961efb326e5
patch 8.2.0256: time and timer related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
975 ((struct timeval *)tv_rel)->tv_sec = prev_timeval.tv_sec |
a961efb326e5
patch 8.2.0256: time and timer related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
976 - ((struct timeval *)tv_rel)->tv_sec; |
a961efb326e5
patch 8.2.0256: time and timer related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
977 if (((struct timeval *)tv_rel)->tv_usec < 0) |
a961efb326e5
patch 8.2.0256: time and timer related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
978 { |
a961efb326e5
patch 8.2.0256: time and timer related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
979 ((struct timeval *)tv_rel)->tv_usec += 1000000; |
a961efb326e5
patch 8.2.0256: time and timer related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
980 --((struct timeval *)tv_rel)->tv_sec; |
a961efb326e5
patch 8.2.0256: time and timer related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
981 } |
a961efb326e5
patch 8.2.0256: time and timer related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
982 *(struct timeval *)tv_start = prev_timeval; |
a961efb326e5
patch 8.2.0256: time and timer related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
983 } |
a961efb326e5
patch 8.2.0256: time and timer related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
984 |
a961efb326e5
patch 8.2.0256: time and timer related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
985 /* |
a961efb326e5
patch 8.2.0256: time and timer related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
986 * Compute the previous time after doing something that could nest. |
a961efb326e5
patch 8.2.0256: time and timer related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
987 * Subtract "*tp" from prev_timeval; |
a961efb326e5
patch 8.2.0256: time and timer related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
988 * Note: The arguments are (void *) to avoid trouble with systems that don't |
a961efb326e5
patch 8.2.0256: time and timer related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
989 * have struct timeval. |
a961efb326e5
patch 8.2.0256: time and timer related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
990 */ |
a961efb326e5
patch 8.2.0256: time and timer related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
991 void |
a961efb326e5
patch 8.2.0256: time and timer related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
992 time_pop( |
a961efb326e5
patch 8.2.0256: time and timer related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
993 void *tp) // actually (struct timeval *) |
a961efb326e5
patch 8.2.0256: time and timer related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
994 { |
a961efb326e5
patch 8.2.0256: time and timer related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
995 prev_timeval.tv_usec -= ((struct timeval *)tp)->tv_usec; |
a961efb326e5
patch 8.2.0256: time and timer related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
996 prev_timeval.tv_sec -= ((struct timeval *)tp)->tv_sec; |
a961efb326e5
patch 8.2.0256: time and timer related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
997 if (prev_timeval.tv_usec < 0) |
a961efb326e5
patch 8.2.0256: time and timer related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
998 { |
a961efb326e5
patch 8.2.0256: time and timer related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
999 prev_timeval.tv_usec += 1000000; |
a961efb326e5
patch 8.2.0256: time and timer related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1000 --prev_timeval.tv_sec; |
a961efb326e5
patch 8.2.0256: time and timer related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1001 } |
a961efb326e5
patch 8.2.0256: time and timer related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1002 } |
a961efb326e5
patch 8.2.0256: time and timer related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1003 |
a961efb326e5
patch 8.2.0256: time and timer related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1004 static void |
a961efb326e5
patch 8.2.0256: time and timer related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1005 time_diff(struct timeval *then, struct timeval *now) |
a961efb326e5
patch 8.2.0256: time and timer related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1006 { |
a961efb326e5
patch 8.2.0256: time and timer related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1007 long usec; |
a961efb326e5
patch 8.2.0256: time and timer related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1008 long msec; |
a961efb326e5
patch 8.2.0256: time and timer related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1009 |
a961efb326e5
patch 8.2.0256: time and timer related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1010 usec = now->tv_usec - then->tv_usec; |
a961efb326e5
patch 8.2.0256: time and timer related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1011 msec = (now->tv_sec - then->tv_sec) * 1000L + usec / 1000L, |
a961efb326e5
patch 8.2.0256: time and timer related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1012 usec = usec % 1000L; |
a961efb326e5
patch 8.2.0256: time and timer related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1013 fprintf(time_fd, "%03ld.%03ld", msec, usec >= 0 ? usec : usec + 1000L); |
a961efb326e5
patch 8.2.0256: time and timer related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1014 } |
a961efb326e5
patch 8.2.0256: time and timer related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1015 |
a961efb326e5
patch 8.2.0256: time and timer related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1016 void |
a961efb326e5
patch 8.2.0256: time and timer related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1017 time_msg( |
a961efb326e5
patch 8.2.0256: time and timer related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1018 char *mesg, |
a961efb326e5
patch 8.2.0256: time and timer related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1019 void *tv_start) // only for do_source: start time; actually |
a961efb326e5
patch 8.2.0256: time and timer related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1020 // (struct timeval *) |
a961efb326e5
patch 8.2.0256: time and timer related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1021 { |
a961efb326e5
patch 8.2.0256: time and timer related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1022 static struct timeval start; |
a961efb326e5
patch 8.2.0256: time and timer related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1023 struct timeval now; |
a961efb326e5
patch 8.2.0256: time and timer related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1024 |
31825
0d27ddce621d
patch 9.0.1245: code is indented more than necessary
Bram Moolenaar <Bram@vim.org>
parents:
31313
diff
changeset
|
1025 if (time_fd == NULL) |
0d27ddce621d
patch 9.0.1245: code is indented more than necessary
Bram Moolenaar <Bram@vim.org>
parents:
31313
diff
changeset
|
1026 return; |
0d27ddce621d
patch 9.0.1245: code is indented more than necessary
Bram Moolenaar <Bram@vim.org>
parents:
31313
diff
changeset
|
1027 |
0d27ddce621d
patch 9.0.1245: code is indented more than necessary
Bram Moolenaar <Bram@vim.org>
parents:
31313
diff
changeset
|
1028 if (strstr(mesg, "STARTING") != NULL) |
19396
a961efb326e5
patch 8.2.0256: time and timer related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1029 { |
31825
0d27ddce621d
patch 9.0.1245: code is indented more than necessary
Bram Moolenaar <Bram@vim.org>
parents:
31313
diff
changeset
|
1030 gettimeofday(&start, NULL); |
0d27ddce621d
patch 9.0.1245: code is indented more than necessary
Bram Moolenaar <Bram@vim.org>
parents:
31313
diff
changeset
|
1031 prev_timeval = start; |
0d27ddce621d
patch 9.0.1245: code is indented more than necessary
Bram Moolenaar <Bram@vim.org>
parents:
31313
diff
changeset
|
1032 fprintf(time_fd, "\n\ntimes in msec\n"); |
0d27ddce621d
patch 9.0.1245: code is indented more than necessary
Bram Moolenaar <Bram@vim.org>
parents:
31313
diff
changeset
|
1033 fprintf(time_fd, " clock self+sourced self: sourced script\n"); |
0d27ddce621d
patch 9.0.1245: code is indented more than necessary
Bram Moolenaar <Bram@vim.org>
parents:
31313
diff
changeset
|
1034 fprintf(time_fd, " clock elapsed: other lines\n\n"); |
0d27ddce621d
patch 9.0.1245: code is indented more than necessary
Bram Moolenaar <Bram@vim.org>
parents:
31313
diff
changeset
|
1035 } |
0d27ddce621d
patch 9.0.1245: code is indented more than necessary
Bram Moolenaar <Bram@vim.org>
parents:
31313
diff
changeset
|
1036 gettimeofday(&now, NULL); |
0d27ddce621d
patch 9.0.1245: code is indented more than necessary
Bram Moolenaar <Bram@vim.org>
parents:
31313
diff
changeset
|
1037 time_diff(&start, &now); |
0d27ddce621d
patch 9.0.1245: code is indented more than necessary
Bram Moolenaar <Bram@vim.org>
parents:
31313
diff
changeset
|
1038 if (((struct timeval *)tv_start) != NULL) |
0d27ddce621d
patch 9.0.1245: code is indented more than necessary
Bram Moolenaar <Bram@vim.org>
parents:
31313
diff
changeset
|
1039 { |
19396
a961efb326e5
patch 8.2.0256: time and timer related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1040 fprintf(time_fd, " "); |
31825
0d27ddce621d
patch 9.0.1245: code is indented more than necessary
Bram Moolenaar <Bram@vim.org>
parents:
31313
diff
changeset
|
1041 time_diff(((struct timeval *)tv_start), &now); |
19396
a961efb326e5
patch 8.2.0256: time and timer related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1042 } |
31825
0d27ddce621d
patch 9.0.1245: code is indented more than necessary
Bram Moolenaar <Bram@vim.org>
parents:
31313
diff
changeset
|
1043 fprintf(time_fd, " "); |
0d27ddce621d
patch 9.0.1245: code is indented more than necessary
Bram Moolenaar <Bram@vim.org>
parents:
31313
diff
changeset
|
1044 time_diff(&prev_timeval, &now); |
0d27ddce621d
patch 9.0.1245: code is indented more than necessary
Bram Moolenaar <Bram@vim.org>
parents:
31313
diff
changeset
|
1045 prev_timeval = now; |
0d27ddce621d
patch 9.0.1245: code is indented more than necessary
Bram Moolenaar <Bram@vim.org>
parents:
31313
diff
changeset
|
1046 fprintf(time_fd, ": %s\n", mesg); |
19396
a961efb326e5
patch 8.2.0256: time and timer related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1047 } |
a961efb326e5
patch 8.2.0256: time and timer related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1048 # endif // STARTUPTIME |
a961efb326e5
patch 8.2.0256: time and timer related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1049 #endif // FEAT_EVAL |
a961efb326e5
patch 8.2.0256: time and timer related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1050 |
a961efb326e5
patch 8.2.0256: time and timer related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1051 #if defined(FEAT_SPELL) || defined(FEAT_PERSISTENT_UNDO) || defined(PROTO) |
a961efb326e5
patch 8.2.0256: time and timer related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1052 /* |
a961efb326e5
patch 8.2.0256: time and timer related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1053 * Read 8 bytes from "fd" and turn them into a time_T, MSB first. |
a961efb326e5
patch 8.2.0256: time and timer related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1054 * Returns -1 when encountering EOF. |
a961efb326e5
patch 8.2.0256: time and timer related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1055 */ |
a961efb326e5
patch 8.2.0256: time and timer related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1056 time_T |
a961efb326e5
patch 8.2.0256: time and timer related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1057 get8ctime(FILE *fd) |
a961efb326e5
patch 8.2.0256: time and timer related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1058 { |
a961efb326e5
patch 8.2.0256: time and timer related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1059 int c; |
a961efb326e5
patch 8.2.0256: time and timer related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1060 time_T n = 0; |
a961efb326e5
patch 8.2.0256: time and timer related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1061 int i; |
a961efb326e5
patch 8.2.0256: time and timer related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1062 |
a961efb326e5
patch 8.2.0256: time and timer related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1063 for (i = 0; i < 8; ++i) |
a961efb326e5
patch 8.2.0256: time and timer related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1064 { |
a961efb326e5
patch 8.2.0256: time and timer related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1065 c = getc(fd); |
a961efb326e5
patch 8.2.0256: time and timer related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1066 if (c == EOF) return -1; |
a961efb326e5
patch 8.2.0256: time and timer related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1067 n = (n << 8) + c; |
a961efb326e5
patch 8.2.0256: time and timer related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1068 } |
a961efb326e5
patch 8.2.0256: time and timer related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1069 return n; |
a961efb326e5
patch 8.2.0256: time and timer related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1070 } |
a961efb326e5
patch 8.2.0256: time and timer related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1071 |
a961efb326e5
patch 8.2.0256: time and timer related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1072 /* |
a961efb326e5
patch 8.2.0256: time and timer related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1073 * Write time_T to file "fd" in 8 bytes. |
a961efb326e5
patch 8.2.0256: time and timer related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1074 * Returns FAIL when the write failed. |
a961efb326e5
patch 8.2.0256: time and timer related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1075 */ |
a961efb326e5
patch 8.2.0256: time and timer related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1076 int |
a961efb326e5
patch 8.2.0256: time and timer related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1077 put_time(FILE *fd, time_T the_time) |
a961efb326e5
patch 8.2.0256: time and timer related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1078 { |
a961efb326e5
patch 8.2.0256: time and timer related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1079 char_u buf[8]; |
a961efb326e5
patch 8.2.0256: time and timer related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1080 |
a961efb326e5
patch 8.2.0256: time and timer related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1081 time_to_bytes(the_time, buf); |
a961efb326e5
patch 8.2.0256: time and timer related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1082 return fwrite(buf, (size_t)8, (size_t)1, fd) == 1 ? OK : FAIL; |
a961efb326e5
patch 8.2.0256: time and timer related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1083 } |
a961efb326e5
patch 8.2.0256: time and timer related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1084 |
a961efb326e5
patch 8.2.0256: time and timer related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1085 /* |
a961efb326e5
patch 8.2.0256: time and timer related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1086 * Write time_T to "buf[8]". |
a961efb326e5
patch 8.2.0256: time and timer related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1087 */ |
a961efb326e5
patch 8.2.0256: time and timer related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1088 void |
a961efb326e5
patch 8.2.0256: time and timer related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1089 time_to_bytes(time_T the_time, char_u *buf) |
a961efb326e5
patch 8.2.0256: time and timer related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1090 { |
a961efb326e5
patch 8.2.0256: time and timer related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1091 int c; |
a961efb326e5
patch 8.2.0256: time and timer related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1092 int i; |
a961efb326e5
patch 8.2.0256: time and timer related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1093 int bi = 0; |
a961efb326e5
patch 8.2.0256: time and timer related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1094 time_T wtime = the_time; |
a961efb326e5
patch 8.2.0256: time and timer related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1095 |
a961efb326e5
patch 8.2.0256: time and timer related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1096 // time_T can be up to 8 bytes in size, more than long_u, thus we |
a961efb326e5
patch 8.2.0256: time and timer related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1097 // can't use put_bytes() here. |
a961efb326e5
patch 8.2.0256: time and timer related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1098 // Another problem is that ">>" may do an arithmetic shift that keeps the |
a961efb326e5
patch 8.2.0256: time and timer related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1099 // sign. This happens for large values of wtime. A cast to long_u may |
a961efb326e5
patch 8.2.0256: time and timer related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1100 // truncate if time_T is 8 bytes. So only use a cast when it is 4 bytes, |
a961efb326e5
patch 8.2.0256: time and timer related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1101 // it's safe to assume that long_u is 4 bytes or more and when using 8 |
a961efb326e5
patch 8.2.0256: time and timer related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1102 // bytes the top bit won't be set. |
a961efb326e5
patch 8.2.0256: time and timer related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1103 for (i = 7; i >= 0; --i) |
a961efb326e5
patch 8.2.0256: time and timer related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1104 { |
a961efb326e5
patch 8.2.0256: time and timer related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1105 if (i + 1 > (int)sizeof(time_T)) |
a961efb326e5
patch 8.2.0256: time and timer related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1106 // ">>" doesn't work well when shifting more bits than avail |
a961efb326e5
patch 8.2.0256: time and timer related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1107 buf[bi++] = 0; |
a961efb326e5
patch 8.2.0256: time and timer related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1108 else |
a961efb326e5
patch 8.2.0256: time and timer related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1109 { |
27342
41a940219183
patch 8.2.4199: MS-Windows: Support for MSVC 2003 is not useful
Bram Moolenaar <Bram@vim.org>
parents:
27253
diff
changeset
|
1110 # if defined(SIZEOF_TIME_T) && SIZEOF_TIME_T > 4 |
19396
a961efb326e5
patch 8.2.0256: time and timer related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1111 c = (int)(wtime >> (i * 8)); |
27342
41a940219183
patch 8.2.4199: MS-Windows: Support for MSVC 2003 is not useful
Bram Moolenaar <Bram@vim.org>
parents:
27253
diff
changeset
|
1112 # else |
19396
a961efb326e5
patch 8.2.0256: time and timer related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1113 c = (int)((long_u)wtime >> (i * 8)); |
27342
41a940219183
patch 8.2.4199: MS-Windows: Support for MSVC 2003 is not useful
Bram Moolenaar <Bram@vim.org>
parents:
27253
diff
changeset
|
1114 # endif |
19396
a961efb326e5
patch 8.2.0256: time and timer related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1115 buf[bi++] = c; |
a961efb326e5
patch 8.2.0256: time and timer related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1116 } |
a961efb326e5
patch 8.2.0256: time and timer related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1117 } |
a961efb326e5
patch 8.2.0256: time and timer related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1118 } |
a961efb326e5
patch 8.2.0256: time and timer related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1119 |
a961efb326e5
patch 8.2.0256: time and timer related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1120 #endif |
a961efb326e5
patch 8.2.0256: time and timer related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1121 |
a961efb326e5
patch 8.2.0256: time and timer related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1122 /* |
a961efb326e5
patch 8.2.0256: time and timer related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1123 * Put timestamp "tt" in "buf[buflen]" in a nice format. |
a961efb326e5
patch 8.2.0256: time and timer related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1124 */ |
a961efb326e5
patch 8.2.0256: time and timer related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1125 void |
a961efb326e5
patch 8.2.0256: time and timer related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1126 add_time(char_u *buf, size_t buflen, time_t tt) |
a961efb326e5
patch 8.2.0256: time and timer related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1127 { |
a961efb326e5
patch 8.2.0256: time and timer related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1128 #ifdef HAVE_STRFTIME |
a961efb326e5
patch 8.2.0256: time and timer related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1129 struct tm tmval; |
a961efb326e5
patch 8.2.0256: time and timer related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1130 struct tm *curtime; |
30857
ec7cb7e68968
patch 9.0.0763: MS-Windows: warning for using int for size_t
Bram Moolenaar <Bram@vim.org>
parents:
30797
diff
changeset
|
1131 size_t n; |
19396
a961efb326e5
patch 8.2.0256: time and timer related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1132 |
a961efb326e5
patch 8.2.0256: time and timer related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1133 if (vim_time() - tt >= 100) |
a961efb326e5
patch 8.2.0256: time and timer related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1134 { |
a961efb326e5
patch 8.2.0256: time and timer related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1135 curtime = vim_localtime(&tt, &tmval); |
a961efb326e5
patch 8.2.0256: time and timer related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1136 if (vim_time() - tt < (60L * 60L * 12L)) |
a961efb326e5
patch 8.2.0256: time and timer related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1137 // within 12 hours |
30797
1213e3988168
patch 9.0.0733: use of strftime() is not safe
Bram Moolenaar <Bram@vim.org>
parents:
30695
diff
changeset
|
1138 n = strftime((char *)buf, buflen, "%H:%M:%S", curtime); |
19396
a961efb326e5
patch 8.2.0256: time and timer related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1139 else |
a961efb326e5
patch 8.2.0256: time and timer related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1140 // longer ago |
30797
1213e3988168
patch 9.0.0733: use of strftime() is not safe
Bram Moolenaar <Bram@vim.org>
parents:
30695
diff
changeset
|
1141 n = strftime((char *)buf, buflen, "%Y/%m/%d %H:%M:%S", curtime); |
1213e3988168
patch 9.0.0733: use of strftime() is not safe
Bram Moolenaar <Bram@vim.org>
parents:
30695
diff
changeset
|
1142 if (n == 0) |
1213e3988168
patch 9.0.0733: use of strftime() is not safe
Bram Moolenaar <Bram@vim.org>
parents:
30695
diff
changeset
|
1143 buf[0] = NUL; |
19396
a961efb326e5
patch 8.2.0256: time and timer related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1144 } |
a961efb326e5
patch 8.2.0256: time and timer related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1145 else |
a961efb326e5
patch 8.2.0256: time and timer related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1146 #endif |
a961efb326e5
patch 8.2.0256: time and timer related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1147 { |
a961efb326e5
patch 8.2.0256: time and timer related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1148 long seconds = (long)(vim_time() - tt); |
a961efb326e5
patch 8.2.0256: time and timer related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1149 |
a961efb326e5
patch 8.2.0256: time and timer related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1150 vim_snprintf((char *)buf, buflen, |
a961efb326e5
patch 8.2.0256: time and timer related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1151 NGETTEXT("%ld second ago", "%ld seconds ago", seconds), |
a961efb326e5
patch 8.2.0256: time and timer related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1152 seconds); |
a961efb326e5
patch 8.2.0256: time and timer related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1153 } |
a961efb326e5
patch 8.2.0256: time and timer related code is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff
changeset
|
1154 } |