summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--Filelist2
-rw-r--r--src/Make_cyg_ming.mak1
-rw-r--r--src/Make_morph.mak1
-rw-r--r--src/Make_mvc.mak4
-rw-r--r--src/Make_vms.mms5
-rw-r--r--src/Makefile10
-rw-r--r--src/README.md1
-rw-r--r--src/evalfunc.c226
-rw-r--r--src/ex_cmds.c14
-rw-r--r--src/ex_cmds2.c492
-rw-r--r--src/main.c104
-rw-r--r--src/memline.c88
-rw-r--r--src/misc1.c31
-rw-r--r--src/misc2.c82
-rw-r--r--src/proto.h1
-rw-r--r--src/proto/ex_cmds.pro1
-rw-r--r--src/proto/ex_cmds2.pro11
-rw-r--r--src/proto/main.pro3
-rw-r--r--src/proto/memline.pro2
-rw-r--r--src/proto/misc1.pro1
-rw-r--r--src/proto/misc2.pro3
-rw-r--r--src/proto/time.pro28
-rw-r--r--src/time.c1041
-rw-r--r--src/version.c2
24 files changed, 1096 insertions, 1058 deletions
diff --git a/Filelist b/Filelist
index 91e6b04325..41eb53f5a3 100644
--- a/Filelist
+++ b/Filelist
@@ -127,6 +127,7 @@ SRC_ALL = \
src/termlib.c \
src/testing.c \
src/textprop.c \
+ src/time.c \
src/ui.c \
src/undo.c \
src/usercmd.c \
@@ -275,6 +276,7 @@ SRC_ALL = \
src/proto/termlib.pro \
src/proto/testing.pro \
src/proto/textprop.pro \
+ src/proto/time.pro \
src/proto/ui.pro \
src/proto/undo.pro \
src/proto/usercmd.pro \
diff --git a/src/Make_cyg_ming.mak b/src/Make_cyg_ming.mak
index 639f3e5dcb..99c004fc07 100644
--- a/src/Make_cyg_ming.mak
+++ b/src/Make_cyg_ming.mak
@@ -783,6 +783,7 @@ OBJ = \
$(OUTDIR)/term.o \
$(OUTDIR)/testing.o \
$(OUTDIR)/textprop.o \
+ $(OUTDIR)/time.o \
$(OUTDIR)/ui.o \
$(OUTDIR)/undo.o \
$(OUTDIR)/usercmd.o \
diff --git a/src/Make_morph.mak b/src/Make_morph.mak
index bb5805c4d2..2c226de298 100644
--- a/src/Make_morph.mak
+++ b/src/Make_morph.mak
@@ -102,6 +102,7 @@ SRC = arabic.c \
term.c \
testing.c \
textprop.c \
+ time.c \
ui.c \
undo.c \
usercmd.c \
diff --git a/src/Make_mvc.mak b/src/Make_mvc.mak
index da9a911d0a..fd7a6ab5c3 100644
--- a/src/Make_mvc.mak
+++ b/src/Make_mvc.mak
@@ -799,6 +799,7 @@ OBJ = \
$(OUTDIR)\term.obj \
$(OUTDIR)\testing.obj \
$(OUTDIR)\textprop.obj \
+ $(OUTDIR)\time.obj \
$(OUTDIR)\ui.obj \
$(OUTDIR)\undo.obj \
$(OUTDIR)\usercmd.obj \
@@ -1733,6 +1734,8 @@ $(OUTDIR)/term.obj: $(OUTDIR) testing.c $(INCL)
$(OUTDIR)/textprop.obj: $(OUTDIR) textprop.c $(INCL)
+$(OUTDIR)/time.obj: $(OUTDIR) time.c $(INCL)
+
$(OUTDIR)/ui.obj: $(OUTDIR) ui.c $(INCL)
$(OUTDIR)/undo.obj: $(OUTDIR) undo.c $(INCL)
@@ -1926,6 +1929,7 @@ proto.h: \
proto/term.pro \
proto/testing.pro \
proto/textprop.pro \
+ proto/time.pro \
proto/ui.pro \
proto/undo.pro \
proto/usercmd.pro \
diff --git a/src/Make_vms.mms b/src/Make_vms.mms
index 8a74d3eb0e..32857decc1 100644
--- a/src/Make_vms.mms
+++ b/src/Make_vms.mms
@@ -381,6 +381,7 @@ SRC = \
termlib.c \
testing.c \
textprop.c \
+ time.c \
ui.c \
undo.c \
usercmd.c \
@@ -487,6 +488,7 @@ OBJ = \
termlib.obj \
testing.obj \
textprop.obj \
+ time.obj \
ui.obj \
undo.obj \
usercmd.obj \
@@ -978,6 +980,9 @@ testing.obj : testing.c vim.h [.auto]config.h feature.h os_unix.h \
textprop.obj : textprop.c vim.h [.auto]config.h feature.h os_unix.h \
ascii.h keymap.h term.h macros.h structs.h regexp.h gui.h beval.h \
[.proto]gui_beval.pro option.h ex_cmds.h proto.h globals.h
+time.obj : time.c vim.h [.auto]config.h feature.h os_unix.h \
+ ascii.h keymap.h term.h macros.h structs.h regexp.h gui.h beval.h \
+ [.proto]gui_beval.pro option.h ex_cmds.h proto.h globals.h
ui.obj : ui.c vim.h [.auto]config.h feature.h os_unix.h \
ascii.h keymap.h term.h macros.h structs.h regexp.h gui.h beval.h \
[.proto]gui_beval.pro option.h ex_cmds.h proto.h globals.h
diff --git a/src/Makefile b/src/Makefile
index 912098f8b3..e284530164 100644
--- a/src/Makefile
+++ b/src/Makefile
@@ -1661,6 +1661,7 @@ BASIC_SRC = \
terminal.c \
testing.c \
textprop.c \
+ time.c \
ui.c \
undo.c \
usercmd.c \
@@ -1800,6 +1801,7 @@ OBJ_COMMON = \
objects/terminal.o \
objects/testing.o \
objects/textprop.o \
+ objects/time.o \
objects/ui.o \
objects/undo.o \
objects/usercmd.o \
@@ -1971,6 +1973,7 @@ PRO_AUTO = \
termlib.pro \
testing.pro \
textprop.pro \
+ time.pro \
ui.pro \
undo.pro \
usercmd.pro \
@@ -3433,6 +3436,9 @@ objects/testing.o: testing.c
objects/textprop.o: textprop.c
$(CCC) -o $@ textprop.c
+objects/time.o: time.c
+ $(CCC) -o $@ time.c
+
objects/ui.o: ui.c
$(CCC) -o $@ ui.c
@@ -3959,6 +3965,10 @@ objects/textprop.o: textprop.c vim.h protodef.h auto/config.h feature.h os_unix.
auto/osdef.h ascii.h keymap.h term.h macros.h option.h beval.h \
proto/gui_beval.pro structs.h regexp.h gui.h alloc.h ex_cmds.h spell.h \
proto.h globals.h
+objects/time.o: time.c vim.h protodef.h auto/config.h feature.h os_unix.h \
+ auto/osdef.h ascii.h keymap.h term.h macros.h option.h beval.h \
+ proto/gui_beval.pro structs.h regexp.h gui.h alloc.h ex_cmds.h spell.h \
+ proto.h globals.h
objects/ui.o: ui.c vim.h protodef.h auto/config.h feature.h os_unix.h \
auto/osdef.h ascii.h keymap.h term.h macros.h option.h beval.h \
proto/gui_beval.pro structs.h regexp.h gui.h alloc.h ex_cmds.h spell.h \
diff --git a/src/README.md b/src/README.md
index 0262a7a5bd..4412d533ee 100644
--- a/src/README.md
+++ b/src/README.md
@@ -79,6 +79,7 @@ tag.c | tags
term.c | terminal handling, termcap codes
testing.c | testing: assert and test functions
textprop.c | text properties
+time.c | time and timer functions
undo.c | undo and redo
usercmd.c | user defined commands
userfunc.c | user defined functions
diff --git a/src/evalfunc.c b/src/evalfunc.c
index 6e96d0d1b8..b4009f0aef 100644
--- a/src/evalfunc.c
+++ b/src/evalfunc.c
@@ -20,10 +20,6 @@
# include <float.h>
#endif
-#if defined(MACOS_X)
-# include <time.h> // for time_t
-#endif
-
#ifdef FEAT_FLOAT
static void f_abs(typval_T *argvars, typval_T *rettv);
static void f_acos(typval_T *argvars, typval_T *rettv);
@@ -126,7 +122,6 @@ static void f_libcall(typval_T *argvars, typval_T *rettv);
static void f_libcallnr(typval_T *argvars, typval_T *rettv);
static void f_line(typval_T *argvars, typval_T *rettv);
static void f_line2byte(typval_T *argvars, typval_T *rettv);
-static void f_localtime(typval_T *argvars, typval_T *rettv);
#ifdef FEAT_FLOAT
static void f_log(typval_T *argvars, typval_T *rettv);
static void f_log10(typval_T *argvars, typval_T *rettv);
@@ -173,11 +168,6 @@ static void f_rand(typval_T *argvars, typval_T *rettv);
static void f_range(typval_T *argvars, typval_T *rettv);
static void f_reg_executing(typval_T *argvars, typval_T *rettv);
static void f_reg_recording(typval_T *argvars, typval_T *rettv);
-static void f_reltime(typval_T *argvars, typval_T *rettv);
-#ifdef FEAT_FLOAT
-static void f_reltimefloat(typval_T *argvars, typval_T *rettv);
-#endif
-static void f_reltimestr(typval_T *argvars, typval_T *rettv);
static void f_remote_expr(typval_T *argvars, typval_T *rettv);
static void f_remote_foreground(typval_T *argvars, typval_T *rettv);
static void f_remote_peek(typval_T *argvars, typval_T *rettv);
@@ -234,17 +224,11 @@ static void f_str2float(typval_T *argvars, typval_T *rettv);
static void f_str2list(typval_T *argvars, typval_T *rettv);
static void f_str2nr(typval_T *argvars, typval_T *rettv);
static void f_strchars(typval_T *argvars, typval_T *rettv);
-#ifdef HAVE_STRFTIME
-static void f_strftime(typval_T *argvars, typval_T *rettv);
-#endif
static void f_strgetchar(typval_T *argvars, typval_T *rettv);
static void f_stridx(typval_T *argvars, typval_T *rettv);
static void f_strlen(typval_T *argvars, typval_T *rettv);
static void f_strcharpart(typval_T *argvars, typval_T *rettv);
static void f_strpart(typval_T *argvars, typval_T *rettv);
-#ifdef HAVE_STRPTIME
-static void f_strptime(typval_T *argvars, typval_T *rettv);
-#endif
static void f_strridx(typval_T *argvars, typval_T *rettv);
static void f_strtrans(typval_T *argvars, typval_T *rettv);
static void f_strdisplaywidth(typval_T *argvars, typval_T *rettv);
@@ -4512,15 +4496,6 @@ f_line2byte(typval_T *argvars UNUSED, typval_T *rettv)
#endif
}
-/*
- * "localtime()" function
- */
- static void
-f_localtime(typval_T *argvars UNUSED, typval_T *rettv)
-{
- rettv->vval.v_number = (varnumber_T)time(NULL);
-}
-
#ifdef FEAT_FLOAT
/*
* "log()" function
@@ -5500,118 +5475,6 @@ f_reg_recording(typval_T *argvars UNUSED, typval_T *rettv)
return_register(reg_recording, rettv);
}
-#if defined(FEAT_RELTIME)
-/*
- * Convert a List to proftime_T.
- * Return FAIL when there is something wrong.
- */
- static int
-list2proftime(typval_T *arg, proftime_T *tm)
-{
- long n1, n2;
- int error = FALSE;
-
- if (arg->v_type != VAR_LIST || arg->vval.v_list == NULL
- || arg->vval.v_list->lv_len != 2)
- return FAIL;
- n1 = list_find_nr(arg->vval.v_list, 0L, &error);
- n2 = list_find_nr(arg->vval.v_list, 1L, &error);
-# ifdef MSWIN
- tm->HighPart = n1;
- tm->LowPart = n2;
-# else
- tm->tv_sec = n1;
- tm->tv_usec = n2;
-# endif
- return error ? FAIL : OK;
-}
-#endif // FEAT_RELTIME
-
-/*
- * "reltime()" function
- */
- static void
-f_reltime(typval_T *argvars UNUSED, typval_T *rettv UNUSED)
-{
-#ifdef FEAT_RELTIME
- proftime_T res;
- proftime_T start;
-
- if (argvars[0].v_type == VAR_UNKNOWN)
- {
- // No arguments: get current time.
- profile_start(&res);
- }
- else if (argvars[1].v_type == VAR_UNKNOWN)
- {
- if (list2proftime(&argvars[0], &res) == FAIL)
- return;
- profile_end(&res);
- }
- else
- {
- // Two arguments: compute the difference.
- if (list2proftime(&argvars[0], &start) == FAIL
- || list2proftime(&argvars[1], &res) == FAIL)
- return;
- profile_sub(&res, &start);
- }
-
- if (rettv_list_alloc(rettv) == OK)
- {
- long n1, n2;
-
-# ifdef MSWIN
- n1 = res.HighPart;
- n2 = res.LowPart;
-# else
- n1 = res.tv_sec;
- n2 = res.tv_usec;
-# endif
- list_append_number(rettv->vval.v_list, (varnumber_T)n1);
- list_append_number(rettv->vval.v_list, (varnumber_T)n2);
- }
-#endif
-}
-
-#ifdef FEAT_FLOAT
-/*
- * "reltimefloat()" function
- */
- static void
-f_reltimefloat(typval_T *argvars UNUSED, typval_T *rettv)
-{
-# ifdef FEAT_RELTIME
- proftime_T tm;
-# endif
-
- rettv->v_type = VAR_FLOAT;
- rettv->vval.v_float = 0;
-# ifdef FEAT_RELTIME
- if (list2proftime(&argvars[0], &tm) == OK)
- rettv->vval.v_float = profile_float(&tm);
-# endif
-}
-#endif
-
-/*
- * "reltimestr()" function
- */
- static void
-f_reltimestr(typval_T *argvars UNUSED, typval_T *rettv)
-{
-#ifdef FEAT_RELTIME
- proftime_T tm;
-#endif
-
- rettv->v_type = VAR_STRING;
- rettv->vval.v_string = NULL;
-#ifdef FEAT_RELTIME
- if (list2proftime(&argvars[0], &tm) == OK)
- rettv->vval.v_string = vim_strsave((char_u *)profile_msg(&tm));
-#endif
-}
-
#if defined(FEAT_CLIENTSERVER) && defined(FEAT_X11)
static void
make_connection(void)
@@ -7422,61 +7285,6 @@ f_str2nr(typval_T *argvars, typval_T *rettv)
}
-#ifdef HAVE_STRFTIME
-/*
- * "strftime({format}[, {time}])" function
- */
- static void
-f_strftime(typval_T *argvars, typval_T *rettv)
-{
- char_u result_buf[256];
- struct tm tmval;
- struct tm *curtime;
- time_t seconds;
- char_u *p;
-
- rettv->v_type = VAR_STRING;
-
- p = tv_get_string(&argvars[0]);
- if (argvars[1].v_type == VAR_UNKNOWN)
- seconds = time(NULL);
- else
- seconds = (time_t)tv_get_number(&argvars[1]);
- curtime = vim_localtime(&seconds, &tmval);
- // MSVC returns NULL for an invalid value of seconds.
- if (curtime == NULL)
- rettv->vval.v_string = vim_strsave((char_u *)_("(Invalid)"));
- else
- {
- vimconv_T conv;
- char_u *enc;
-
- conv.vc_type = CONV_NONE;
- enc = enc_locale();
- convert_setup(&conv, p_enc, enc);
- if (conv.vc_type != CONV_NONE)
- p = string_convert(&conv, p, NULL);
- if (p != NULL)
- (void)strftime((char *)result_buf, sizeof(result_buf),
- (char *)p, curtime);
- else
- result_buf[0] = NUL;
-
- if (conv.vc_type != CONV_NONE)
- vim_free(p);
- convert_setup(&conv, enc, p_enc);
- if (conv.vc_type != CONV_NONE)
- rettv->vval.v_string = string_convert(&conv, result_buf, NULL);
- else
- rettv->vval.v_string = vim_strsave(result_buf);
-
- // Release conversion descriptors
- convert_setup(&conv, NULL, NULL);
- vim_free(enc);
- }
-}
-#endif
-
/*
* "strgetchar()" function
*/
@@ -7734,40 +7542,6 @@ f_strpart(typval_T *argvars, typval_T *rettv)
rettv->vval.v_string = vim_strnsave(p + n, len);
}
-#ifdef HAVE_STRPTIME
-/*
- * "strptime({format}, {timestring})" function
- */
- static void
-f_strptime(typval_T *argvars, typval_T *rettv)
-{
- struct tm tmval;
- char_u *fmt;
- char_u *str;
- vimconv_T conv;
- char_u *enc;
-
- vim_memset(&tmval, NUL, sizeof(tmval));
- fmt = tv_get_string(&argvars[0]);
- str = tv_get_string(&argvars[1]);
-
- conv.vc_type = CONV_NONE;
- enc = enc_locale();
- convert_setup(&conv, p_enc, enc);
- if (conv.vc_type != CONV_NONE)
- fmt = string_convert(&conv, fmt, NULL);
- if (fmt == NULL
- || strptime((char *)str, (char *)fmt, &tmval) == NULL
- || (rettv->vval.v_number = mktime(&tmval)) == -1)
- rettv->vval.v_number = 0;
-
- if (conv.vc_type != CONV_NONE)
- vim_free(fmt);
- convert_setup(&conv, NULL, NULL);
- vim_free(enc);
-}
-#endif
-
/*
* "strridx()" function
*/
diff --git a/src/ex_cmds.c b/src/ex_cmds.c
index 881e6f9265..0eeb3f3399 100644
--- a/src/ex_cmds.c
+++ b/src/ex_cmds.c
@@ -1679,20 +1679,6 @@ append_redir(
}
/*
- * Return the current time in seconds. Calls time(), unless test_settime()
- * was used.
- */
- time_T
-vim_time(void)
-{
-# ifdef FEAT_EVAL
- return time_for_testing == 0 ? time(NULL) : time_for_testing;
-# else
- return time(NULL);
-# endif
-}
-
-/*
* Implementation of ":fixdel", also used by get_stty().
* <BS> resulting <Del>
* ^? ^H
diff --git a/src/ex_cmds2.c b/src/ex_cmds2.c
index 4f8f7fbf65..bbaff391e4 100644
--- a/src/ex_cmds2.c
+++ b/src/ex_cmds2.c
@@ -14,498 +14,6 @@
#include "vim.h"
#include "version.h"
-#if defined(FEAT_EVAL) || defined(PROTO)
-# if defined(FEAT_TIMERS) || defined(PROTO)
-static timer_T *first_timer = NULL;
-static long last_timer_id = 0;
-
-/*
- * Return time left until "due". Negative if past "due".
- */
- long
-proftime_time_left(proftime_T *due, proftime_T *now)
-{
-# ifdef MSWIN
- LARGE_INTEGER fr;
-
- if (now->QuadPart > due->QuadPart)
- return 0;
- QueryPerformanceFrequency(&fr);
- return (long)(((double)(due->QuadPart - now->QuadPart)
- / (double)fr.QuadPart) * 1000);
-# else
- if (now->tv_sec > due->tv_sec)
- return 0;
- return (due->tv_sec - now->tv_sec) * 1000
- + (due->tv_usec - now->tv_usec) / 1000;
-# endif
-}
-
-/*
- * Insert a timer in the list of timers.
- */
- static void
-insert_timer(timer_T *timer)
-{
- timer->tr_next = first_timer;
- timer->tr_prev = NULL;
- if (first_timer != NULL)
- first_timer->tr_prev = timer;
- first_timer = timer;
- did_add_timer = TRUE;
-}
-
-/*
- * Take a timer out of the list of timers.
- */
- static void
-remove_timer(timer_T *timer)
-{
- if (timer->tr_prev == NULL)
- first_timer = timer->tr_next;
- else
- timer->tr_prev->tr_next = timer->tr_next;
- if (timer->tr_next != NULL)
- timer->tr_next->tr_prev = timer->tr_prev;
-}
-
- static void
-free_timer(timer_T *timer)
-{
- free_callback(&timer->tr_callback);
- vim_free(timer);
-}
-
-/*
- * Create a timer and return it. NULL if out of memory.
- * Caller should set the callback.
- */
- timer_T *
-create_timer(long msec, int repeat)
-{
- timer_T *timer = ALLOC_CLEAR_ONE(timer_T);
- long prev_id = last_timer_id;
-
- if (timer == NULL)
- return NULL;
- if (++last_timer_id <= prev_id)
- // Overflow! Might cause duplicates...
- last_timer_id = 0;
- timer->tr_id = last_timer_id;
- insert_timer(timer);
- if (repeat != 0)
- timer->tr_repeat = repeat - 1;
- timer->tr_interval = msec;
-
- profile_setlimit(msec, &timer->tr_due);
- return timer;
-}
-
-/*
- * Invoke the callback of "timer".
- */
- static void
-timer_callback(timer_T *timer)
-{
- typval_T rettv;
- typval_T argv[2];
-
- argv[0].v_type = VAR_NUMBER;
- argv[0].vval.v_number = (varnumber_T)timer->tr_id;
- argv[1].v_type = VAR_UNKNOWN;
-
- call_callback(&timer->tr_callback, -1, &rettv, 1, argv);
- clear_tv(&rettv);
-}
-
-/*
- * Call timers that are due.
- * Return the time in msec until the next timer is due.
- * Returns -1 if there are no pending timers.
- */
- long
-check_due_timer(void)
-{
- timer_T *timer;
- timer_T *timer_next;
- long this_due;
- long next_due = -1;
- proftime_T now;
- int did_one = FALSE;
- int need_update_screen = FALSE;
- long current_id = last_timer_id;
-
- // Don't run any timers while exiting or dealing with an error.
- if (exiting || aborting())
- return next_due;
-
- profile_start(&now);
- for (timer = first_timer; timer != NULL && !got_int; timer = timer_next)
- {
- timer_next = timer->tr_next;
-
- if (timer->tr_id == -1 || timer->tr_firing || timer->tr_paused)
- continue;
- this_due = proftime_time_left(&timer->tr_due, &now);
- if (this_due <= 1)
- {
- // Save and restore a lot of flags, because the timer fires while
- // waiting for a character, which might be halfway a command.
- int save_timer_busy = timer_busy;
- int save_vgetc_busy = vgetc_busy;
- int save_did_emsg = did_emsg;
- int save_called_emsg = called_emsg;
- int save_must_redraw = must_redraw;
- int save_trylevel = trylevel;
- int save_did_throw = did_throw;
- int save_ex_pressedreturn = get_pressedreturn();
- int save_may_garbage_collect = may_garbage_collect;
- except_T *save_current_exception = current_exception;
- vimvars_save_T vvsave;
-
- // Create a scope for running the timer callback, ignoring most of
- // the current scope, such as being inside a try/catch.
- timer_busy = timer_busy > 0 || vgetc_busy > 0;
- vgetc_busy = 0;
- called_emsg = 0;
- did_emsg = FALSE;
- did_uncaught_emsg = FALSE;
- must_redraw = 0;
- trylevel = 0;
- did_throw = FALSE;
- current_exception = NULL;
- may_garbage_collect = FALSE;
- save_vimvars(&vvsave);
-
- timer->tr_firing = TRUE;
- timer_callback(timer);
- timer->tr_firing = FALSE;
-
- timer_next = timer->tr_next;
- did_one = TRUE;
- timer_busy = save_timer_busy;
- vgetc_busy = save_vgetc_busy;
- if (did_uncaught_emsg)
- ++timer->tr_emsg_count;
- did_emsg = save_did_emsg;
- called_emsg = save_called_emsg;
- trylevel = save_trylevel;
- did_throw = save_did_throw;
- current_exception = save_current_exception;
- restore_vimvars(&vvsave);
- if (must_redraw != 0)
- need_update_screen = TRUE;
- must_redraw = must_redraw > save_must_redraw
- ? must_redraw : save_must_redraw;
- set_pressedreturn(save_ex_pressedreturn);
- may_garbage_collect = save_may_garbage_collect;
-
- // Only fire the timer again if it repeats and stop_timer() wasn't
- // called while inside the callback (tr_id == -1).
- if (timer->tr_repeat != 0 && timer->tr_id != -1
- && timer->tr_emsg_count < 3)
- {
- profile_setlimit(timer->tr_interval, &timer->tr_due);
- this_due = proftime_time_left(&timer->tr_due, &now);
- if (this_due < 1)
- this_due = 1;
- if (timer->tr_repeat > 0)
- --timer->tr_repeat;
- }
- else
- {
- this_due = -1;
- remove_timer(timer);
- free_timer(timer);
- }
- }
- if (this_due > 0 && (next_due == -1 || next_due > this_due))
- next_due = this_due;
- }
-
- if (did_one)
- redraw_after_callback(need_update_screen);
-
-#ifdef FEAT_BEVAL_TERM
- if (bevalexpr_due_set)
- {
- this_due = proftime_time_left(&bevalexpr_due, &now);
- if (this_due <= 1)
- {
- bevalexpr_due_set = FALSE;
- if (balloonEval == NULL)
- {
- balloonEval = ALLOC_CLEAR_ONE(BalloonEval);
- balloonEvalForTerm = TRUE;
- }
- if (balloonEval != NULL)
- {
- general_beval_cb(balloonEval, 0);
- setcursor();
- out_flush();
- }
- }
- else if (next_due == -1 || next_due > this_due)
- next_due = this_due;
- }
-#endif
-#ifdef FEAT_TERMINAL
- // Some terminal windows may need their buffer updated.
- next_due = term_check_timers(next_due, &now);
-#endif
-
- return current_id != last_timer_id ? 1 : next_due;
-}
-
-/*
- * Find a timer by ID. Returns NULL if not found;
- */
- static timer_T *
-find_timer(long id)
-{
- timer_T *timer;
-
- if (id >= 0)
- {
- for (timer = first_timer; timer != NULL; timer = timer->tr_next)
- if (timer->tr_id == id)
- return timer;
- }
- return NULL;
-}
-
-
-/*
- * Stop a timer and delete it.
- */
- void
-stop_timer(timer_T *timer)
-{
- if (timer->tr_firing)
- // Free the timer after the callback returns.
- timer->tr_id = -1;
- else
- {
- remove_timer(timer);
- free_timer(timer);
- }
-}
-
- static void
-stop_all_timers(void)
-{
- timer_T *timer;
- timer_T *timer_next;
-
- for (timer = first_timer; timer != NULL; timer = timer_next)
- {
- timer_next = timer->tr_next;
- stop_timer(timer);
- }
-}
-
- static void
-add_timer_info(typval_T *rettv, timer_T *timer)
-{
- list_T *list = rettv->vval.v_list;
- dict_T *dict = dict_alloc();
- dictitem_T *di;
- long remaining;
- proftime_T now;
-
- if (dict == NULL)
- return;
- list_append_dict(list, dict);
-
- dict_add_number(dict, "id", timer->tr_id);
- dict_add_number(dict, "time", (long)timer->tr_interval);
-
- profile_start(&now);
- remaining = proftime_time_left(&timer->tr_due, &now);
- dict_add_number(dict, "remaining", (long)remaining);
-
- dict_add_number(dict, "repeat",
- (long)(timer->tr_repeat < 0 ? -1 : timer->tr_repeat + 1));
- dict_add_number(dict, "paused", (long)(timer->tr_paused));
-
- di = dictitem_alloc((char_u *)"callback");
- if (di != NULL)
- {
- if (dict_add(dict, di) == FAIL)
- vim_free(di);
- else
- put_callback(&timer->tr_callback, &di->di_tv);
- }
-}
-
- static void
-add_timer_info_all(typval_T *rettv)
-{
- timer_T *timer;
-
- for (timer = first_timer; timer != NULL; timer = timer->tr_next)
- if (timer->tr_id != -1)
- add_timer_info(rettv, timer);
-}
-
-/*
- * Mark references in partials of timers.
- */
- int
-set_ref_in_timer(int copyID)
-{
- int abort = FALSE;
- timer_T *timer;
- typval_T tv;
-
- for (timer = first_timer; !abort && timer != NULL; timer = timer->tr_next)
- {
- if (timer->tr_callback.cb_partial != NULL)
- {
- tv.v_type = VAR_PARTIAL;
- tv.vval.v_partial = timer->tr_callback.cb_partial;
- }
- else
- {
- tv.v_type = VAR_FUNC;
- tv.vval.v_string = timer->tr_callback.cb_name;
- }
- abort = abort || set_ref_in_item(&tv, copyID, NULL, NULL);
- }
- return abort;
-}
-
-# if defined(EXITFREE) || defined(PROTO)
- void
-timer_free_all()
-{
- timer_T *timer;
-
- while (first_timer != NULL)
- {
- timer = first_timer;
- remove_timer(timer);
- free_timer(timer);
- }
-}
-# endif
-
-/*
- * "timer_info([timer])" function
- */
- void
-f_timer_info(typval_T *argvars, typval_T *rettv)
-{
- timer_T *timer = NULL;
-
- if (rettv_list_alloc(rettv) != OK)
- return;
- if (argvars[0].v_type != VAR_UNKNOWN)
- {
- if (argvars[0].v_type != VAR_NUMBER)
- emsg(_(e_number_exp));
- else
- {
- timer = find_timer((int)tv_get_number(&argvars[0]));
- if (timer != NULL)
- add_timer_info(rettv, timer);
- }
- }
- else
- add_timer_info_all(rettv);
-}
-
-/*
- * "timer_pause(timer, paused)" function
- */
- void
-f_timer_pause(typval_T *argvars, typval_T *rettv UNUSED)
-{
- timer_T *timer = NULL;
- int paused = (int)tv_get_number(&argvars[1]);
-
- if (argvars[0].v_type != VAR_NUMBER)
- emsg(_(e_number_exp));
- else
- {
- timer = find_timer((int)tv_get_number(&argvars[0]));
- if (timer != NULL)
- timer->tr_paused = paused;
- }
-}
-
-/*
- * "timer_start(time, callback [, options])" function
- */
- void
-f_timer_start(typval_T *argvars, typval_T *rettv)
-{
- long msec = (long)tv_get_number(&argvars[0]);
- timer_T *timer;
- int repeat = 0;
- callback_T callback;
- dict_T *dict;
-
- rettv->vval.v_number = -1;
- if (check_secure())
- return;
- if (argvars[2].v_type != VAR_UNKNOWN)
- {
- if (argvars[2].v_type != VAR_DICT
- || (dict = argvars[2].vval.v_dict) == NULL)
- {
- semsg(_(e_invarg2), tv_get_string(&argvars[2]));
- return;
- }
- if (dict_find(dict, (char_u *)"repeat", -1) != NULL)
- repeat = dict_get_number(dict, (char_u *)"repeat");
- }
-
- callback = get_callback(&argvars[1]);
- if (callback.cb_name == NULL)
- return;
-
- timer = create_timer(msec, repeat);
- if (timer == NULL)
- free_callback(&callback);
- else
- {
- set_callback(&timer->tr_callback, &callback);
- rettv->vval.v_number = (varnumber_T)timer->tr_id;
- }
-}
-
-/*
- * "timer_stop(timer)" function
- */
- void
-f_timer_stop(typval_T *argvars, typval_T *rettv UNUSED)
-{
- timer_T *timer;
-
- if (argvars[0].v_type != VAR_NUMBER)
- {
- emsg(_(e_number_exp));
- return;
- }
- timer = find_timer((int)tv_get_number(&argvars[0]));
- if (timer != NULL)
- stop_timer(timer);
-}
-
-/*
- * "timer_stopall()" function
- */
- void
-f_timer_stopall(typval_T *argvars UNUSED, typval_T *rettv UNUSED)
-{
- stop_all_timers();
-}
-
-# endif // FEAT_TIMERS
-
-#endif // FEAT_EVAL
-
/*
* If 'autowrite' option set, try to write the file.
* Careful: autocommands may make "buf" invalid!
diff --git a/src/main.c b/src/main.c
index c747aba3d1..2d61c0682e 100644
--- a/src/main.c
+++ b/src/main.c
@@ -3669,110 +3669,6 @@ check_swap_exists_action(void)
#endif // NO_VIM_MAIN
-#if defined(STARTUPTIME) || defined(PROTO)
-static struct timeval prev_timeval;
-
-# ifdef MSWIN
-/*
- * Windows doesn't have gettimeofday(), although it does have struct timeval.
- */
- static int
-gettimeofday(struct timeval *tv, char *dummy UNUSED)
-{
- long t = clock();
- tv->tv_sec = t / CLOCKS_PER_SEC;
- tv->tv_usec = (t - tv->tv_sec * CLOCKS_PER_SEC) * 1000000 / CLOCKS_PER_SEC;
- return 0;
-}
-# endif
-
-/*
- * Save the previous time before doing something that could nest.
- * set "*tv_rel" to the time elapsed so far.
- */
- void
-time_push(void *tv_rel, void *tv_start)
-{
- *((struct timeval *)tv_rel) = prev_timeval;
- gettimeofday(&prev_timeval, NULL);
- ((struct timeval *)tv_rel)->tv_usec = prev_timeval.tv_usec
- - ((struct timeval *)tv_rel)->tv_usec;
- ((struct timeval *)tv_rel)->tv_sec = prev_timeval.tv_sec
- - ((struct timeval *)tv_rel)->tv_sec;
- if (((struct timeval *)tv_rel)->tv_usec < 0)
- {
- ((struct timeval *)tv_rel)->tv_usec += 1000000;
- --((struct timeval *)tv_rel)->tv_sec;
- }
- *(struct timeval *)tv_start = prev_timeval;
-}
-
-/*
- * Compute the previous time after doing something that could nest.
- * Subtract "*tp" from prev_timeval;
- * Note: The arguments