diff options
-rw-r--r-- | Filelist | 2 | ||||
-rw-r--r-- | src/Make_cyg_ming.mak | 1 | ||||
-rw-r--r-- | src/Make_morph.mak | 1 | ||||
-rw-r--r-- | src/Make_mvc.mak | 4 | ||||
-rw-r--r-- | src/Make_vms.mms | 5 | ||||
-rw-r--r-- | src/Makefile | 10 | ||||
-rw-r--r-- | src/README.md | 1 | ||||
-rw-r--r-- | src/evalfunc.c | 226 | ||||
-rw-r--r-- | src/ex_cmds.c | 14 | ||||
-rw-r--r-- | src/ex_cmds2.c | 492 | ||||
-rw-r--r-- | src/main.c | 104 | ||||
-rw-r--r-- | src/memline.c | 88 | ||||
-rw-r--r-- | src/misc1.c | 31 | ||||
-rw-r--r-- | src/misc2.c | 82 | ||||
-rw-r--r-- | src/proto.h | 1 | ||||
-rw-r--r-- | src/proto/ex_cmds.pro | 1 | ||||
-rw-r--r-- | src/proto/ex_cmds2.pro | 11 | ||||
-rw-r--r-- | src/proto/main.pro | 3 | ||||
-rw-r--r-- | src/proto/memline.pro | 2 | ||||
-rw-r--r-- | src/proto/misc1.pro | 1 | ||||
-rw-r--r-- | src/proto/misc2.pro | 3 | ||||
-rw-r--r-- | src/proto/time.pro | 28 | ||||
-rw-r--r-- | src/time.c | 1041 | ||||
-rw-r--r-- | src/version.c | 2 |
24 files changed, 1096 insertions, 1058 deletions
@@ -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 are (void *) to avoid trouble with systems that don't - * have struct timeval. - */ - void -time_pop( - void *tp) // actually (struct timeval *) -{ - prev_timeval.tv_usec -= ((struct timeval *)tp)->tv_usec; - prev_timeval.tv_sec -= ((struct timeval *)tp)->tv_sec; - if (prev_timeval.tv_usec < 0) - { - prev_timeval.tv_usec += 1000000; - --prev_timeval.tv_sec; - } -} - - static void -time_diff(struct timeval *then, struct timeval *now) -{ - long usec; - long msec; |