summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/Make_agui.mak356
-rw-r--r--src/Make_aros.mak29
-rw-r--r--src/Make_morph.mak12
-rw-r--r--src/eval.c3452
-rw-r--r--src/gui_amiga.c1812
-rw-r--r--src/gui_amiga.h52
-rw-r--r--src/gui_beos.cc3358
-rw-r--r--src/gui_beos.h49
-rw-r--r--src/proto/gui_amiga.pro69
-rw-r--r--src/proto/gui_beos.pro14
-rw-r--r--src/proto/os_beos.pro4
11 files changed, 1842 insertions, 7365 deletions
diff --git a/src/Make_agui.mak b/src/Make_agui.mak
deleted file mode 100644
index 7b30a1976..000000000
--- a/src/Make_agui.mak
+++ /dev/null
@@ -1,356 +0,0 @@
-#
-# Makefile for VIM on the Amiga, using SAS/Lattice C 6.0 to 6.56
-#
-# Do NOT use the peephole optimizer with a version before 6.55!
-# It messes up all kinds of things:
-# For 6.0 and 6.1, expand_env() will not work correctly.
-# For 6.2 and 6.3 the call to free_line in u_freeentry is wrong.
-# Don't know about 6.50, might work...
-# Version 6.56 seems to be working fine.
-# You should use Manx Aztec C whenever possible.
-#
-# The prototypes from Manx and SAS are incompatible. If the prototypes
-# were generated by Manx, first do "touch *.c; make proto" before "make".
-# The prototypes generated on Unix work for both.
-#
-# Note: Not all dependencies are included. This was done to avoid having
-# to compile everything when a global variable or function is added.
-
-#>>>>> choose options:
-
-#ANSI CODES
-ANSIOFF = *e[0m
-BBOLD = *e[1m
-WBOLD = *e[2m
-ITALIC = *e[3m
-UNDERLI = *e[4m
-ANSIOFF = *e[0m
-FCOL1 = *e[31m
-FCOL2 = *e[32m
-FCOL3 = *e[33m
-FCOL4 = *e[34m
-BCOL1 = *e[41m
-BCOL2 = *e[42m
-BCOL3 = *e[43m
-BCOL4 = *e[44m
-
-
-### See feature.h for a list of optionals.
-### Any other defines can be included here.
-
-DEFINES = DEF=NO_ARP DEF=AMIGA DEF=NEWSASC DEF=FEAT_GUI_AMIGA \
- DEF="SASC=658" #" this fixes a bug in the syntax highlighting
-
-#>>>>> if HAVE_TGETENT is defined termlib.o has to be used
-#TERMLIB = termlib.o
-TERMLIB =
-
-#>>>>> choose NODEBUG for normal compiling, the other for debugging and
-# profiling
-# don't switch on debugging when generating proto files, it crashes the
-# compiler.
-DBG = NODEBUG
-#DBG = DBG=FULLFLUSH
-#DBG = DBG=LINE
-
-#>>>>> choose NOOPTPEEP for 6.0 to 6.3, NOOPT for debugging
-#OPTIMIZE=NOOPTPEEP OPT
-
-# for 6.58 you can use the line below, but be warned it takes a loooonnnggg time
-#OPTIMIZE=OPT OPTIMIZERSCHEDULER OPTIMIZERTIME NoOPTIMIZERALIAS \
-# OptimizerComplexity=10 OptimizerDepth=10 OptimizerRecurDepth=10 \
-# OptimizerInLocal OPTPEEP
-OPTIMIZE=OPT OPTIMIZERTIME NoOPTIMIZERALIAS \
- OptimizerComplexity=10 OptimizerDepth=10 OptimizerRecurDepth=10 \
- OptimizerInLocal OPTPEEP
-#OPTIMIZE = NOOPT
-
-# no optimization, (works on all platforms)
-#OPTIMIZE=NOOPT
-
-#generate code for your processor - note however, that the 060 selection will work for 040's
-# as well.
-#CPU=68000
-#CPU=68020
-#CPU=68030
-#CPU=68040
-CPU=68060
-
-
-#Error reporting - I use rexx for reporting, but console reporting may be more
-#useful for some people.
-#ERROR = ERRORCONSOLE ERRORSOURCE ERRORHIGHLIGHT
-ERROR = ERRORREXX ERRORCONSOLE ERRORSOURCE ERRORHIGHLIGHT
-
-
-#memory types, if you have fast use it :->,
-# ANY = will work on all machines
-# FAST = this is the best option, for speed
-# CHIP = not necessary for this application.
-#MEMORYTYPE=FAST
-MEMORYTYPE=ANY
-
-#MEMSIZE - this is for compile time only for speed of compilation
-#default is LARGE
-MEMSIZE=HUGE
-#MEMSIZE=LARGE
-#MEMSIZE=SMALL
-
-#>>>>> end of choices
-###########################################################################
-
-CC = sc
-
-GST=vim.gst
-DEP = $(GST)
-
-
-CFLAGS = NOLINK $(DBG) CPU=$(CPU) NOSTACKCHECK
-CFLAGS2 = $(OPTIMIZE) $(ERROR) GSTIMMEDIATE GST=$(GST)
-CFLAGS3 =NOSINT SCODE SDATA STRINGMERGE MEMSIZE=$(MEMSIZE)
-CFLAGS4 = $(DEFINES) DATAMEMORY=$(MEMORYTYPE)
-
-PROPT = DEF=PROTO GPROTO GPPARM MAXIMUMERRORS=999 GENPROTOSTATICS GENPROTOPARAMETERS
-
-SRC = \
- buffer.c \
- charset.c \
- diff.c \
- digraph.c \
- edit.c \
- eval.c \
- ex_cmds.c \
- ex_cmds2.c \
- ex_docmd.c \
- ex_eval.c \
- ex_getln.c \
- fileio.c \
- fold.c \
- getchar.c \
- main.c \
- mark.c \
- memfile.c \
- memline.c \
- menu.c \
- message.c \
- misc1.c \
- misc2.c \
- move.c \
- normal.c \
- ops.c \
- option.c \
- os_amiga.c \
- quickfix.c \
- regexp.c \
- screen.c \
- search.c \
- syntax.c \
- tag.c \
- term.c \
- ui.c \
- undo.c \
- window.c \
- version.c \
- gui_amiga.c \
- gui.c
-
-OBJ = buffer.o charset.o diff.o digraph.o edit.o eval.o ex_cmds.o ex_cmds2.o ex_docmd.o ex_eval.o ex_getln.o \
- fileio.o fold.o getchar.o main.o mark.o memfile.o memline.o menu.o message.o misc1.o misc2.o move.o \
- normal.o ops.o option.o os_amiga.o quickfix.o regexp.o screen.o search.o syntax.o \
- tag.o term.o ui.o undo.o window.o gui_amiga.o gui.o $(TERMLIB)
-
-PRO = \
- buffer.pro \
- charset.pro \
- diff.pro \
- digraph.pro \
- edit.pro \
- eval.pro \
- ex_cmds.pro \
- ex_cmds2.pro \
- ex_docmd.pro \
- ex_eval.pro \
- ex_getln.pro \
- fileio.pro \
- fold.pro \
- getchar.pro \
- main.pro \
- mark.pro \
- memfile.pro \
- memline.pro \
- menu.pro \
- message.pro \
- misc1.pro \
- misc2.pro \
- move.pro \
- normal.pro \
- ops.pro \
- option.pro \
- os_amiga.pro \
- quickfix.pro \
- regexp.pro \
- screen.pro \
- search.pro \
- syntax.pro \
- tag.pro \
- term.pro \
- termlib.pro \
- ui.pro \
- undo.pro \
- window.pro \
- version.pro \
- gui_amiga.pro \
- gui.pro
-
-all:
- @echo "$(BCOL2)building prototypes, this may take some time$(ANSIOFF)"
- @smake proto
- @echo "$(BCOL2)building vim production version$(ANSIOFF)"
- @smake vim
-
-Vim: scoptions proto $(OBJ) version.c version.h
- $(CC) $(CFLAGS) version.c
- $(CC) LINK $(OPT) $(COPTS) $(OBJ) version.o $(DBG) PNAME=Vim
-
-debug: scoption protos $(OBJ) version.c version.h
- $(CC) $(CFLAGS) version.c
- $(CC) LINK $(COPTS) $(OBJ) version.o $(DBG) PNAME=Vim
-
-proto: $(PRO)
-
-tags: $(SRC)
- spat ctags $(SRC) *.h
- #csh -c ctags $(SRC) *.h
-
-# can't use delete here, too many file names
-clean:
- @echo removing all object files
- -delete $(OBJ) >nil:
-
-clobber: clean
- @echo removing all prototype files
- -delete $(PRO) SCOPTIONS vim $(GST) > NIL:
-
-
-# generate an options file, as there is no way the amiga command line can handle the
-# lengths that this makefile will impose on the shell.
-scoptions: smakefile
- @echo "$(BCOL2)Generating $(ANSIOFF)$(FCOL4)- $@$(ANSIOFF)"
- @echo $(CFLAGS) > scoptions
- @echo $(CFLAGS1) >> scoptions
- @echo $(CFLAGS2) >> scoptions
- @echo $(CFLAGS3) >> scoptions
- @echo $(CFLAGS4) >> scoptions
- @echo $(COPTS) >>scoptions
- @echo scoptions has been built
-
-
-#generate GlobalSymbolTable, which both speeds up the compile time, but also
-#solves some problems with prototypes, and types that are defined in a unixy
-#manner.
-#
-#I use a preprocessing stage here to work arounda bug in the GST generator, in
-#that it does not handle nested makefiles properly in this stage.
-$(GST): scoptions vim.h keymap.h macros.h ascii.h term.h structs.h gui.h gui_amiga.h
- @echo "$(BCOL2)Generating Global Symbol Table $(ANSIOFF)$(FCOL4) $(GST) $(ANSIOFF)"
- $(CC) PREPROCESSORONLY gui_amiga.h objectname pre.h
- $(CC) MGST=$(GST) pre.h ignore=105,316
- del pre.h
-
-
-###########################################################################
-
-.c.o:
- @echo "$(BCOL2)Generating object for $(ANSIOFF)$(FCOL4) $*.c -> $@$(ANSIOFF)"
- $(CC) $*.c
-
-.c.pro:
- @echo "$(BCOL2)Generating prototypes for $(ANSIOFF)$(FCOL4) $*.c -> $@$(ANSIOFF)"
- @$(CC) NOERRORREXX GPFILE=$*.pro $(PROPT) $*.c ignore=306,316,317,304
-
-$(PRO): $(GST)
-$(OBJ): $(GST)
-
-# dependancies
-buffer.o: buffer.c $(DEP)
-buffer.pro: buffer.c $(DEP)
-charset.o: charset.c $(DEP)
-charset.pro: charset.c $(DEP)
-diff.o: diff.c $(DEP)
-diff.pro: diff.c $(DEP)
-digraph.o: digraph.c $(DEP)
-digraph.pro: digraph.c $(DEP)
-edit.o: edit.c $(DEP)
-edit.pro: edit.c $(DEP)
-eval.o: eval.c $(DEP)
-eval.pro: eval.c $(DEP)
-ex_cmds.o: ex_cmds.c $(DEP)
-ex_cmds.pro: ex_cmds.c $(DEP)
-ex_cmds2.o: ex_cmds2.c $(DEP)
-ex_cmds2.pro: ex_cmds2.c $(DEP)
-ex_docmd.o: ex_docmd.c ex_cmds.h $(DEP)
-ex_docmd.pro: ex_docmd.c ex_cmds.h $(DEP)
-ex_eval.o: ex_eval.c ex_cmds.h $(DEP)
-ex_eval.pro: ex_eval.c ex_cmds.h $(DEP)
-ex_getln.o: ex_getln.c $(DEP)
-ex_getln.pro: ex_getln.c $(DEP)
-fileio.o: fileio.c $(DEP)
-fileio.pro: fileio.c $(DEP)
-fold.o: fold.c $(DEP)
-fold.pro: fold.c $(DEP)
-getchar.o: getchar.c $(DEP)
-getchar.pro: getchar.c $(DEP)
-main.o: main.c globals.h $(DEP)
-main.pro: main.c globals.h $(DEP)
-mark.o: mark.c $(DEP)
-mark.pro: mark.c $(DEP)
-memfile.o: memfile.c $(DEP)
-memfile.pro: memfile.c $(DEP)
-memline.o: memline.c $(DEP)
-memline.pro: memline.c $(DEP)
-menu.o: menu.c $(DEP)
-menu.pro: menu.c $(DEP)
-message.o: message.c $(DEP)
-message.pro: message.c $(DEP)
-misc1.o: misc1.c $(DEP)
-misc1.pro: misc1.c $(DEP)
-misc2.o: misc2.c $(DEP)
-misc2.pro: misc2.c $(DEP)
-move.o: move.c $(DEP)
-move.pro: move.c $(DEP)
-normal.o: normal.c $(DEP)
-normal.pro: normal.c $(DEP)
-ops.o: ops.c $(DEP)
-ops.pro: ops.c $(DEP)
-option.o: option.c $(DEP)
-option.pro: option.c $(DEP)
-os_amiga.o: os_amiga.c $(DEP)
-os_amiga.pro: os_amiga.c $(DEP)
-quickfix.o: quickfix.c $(DEP)
-quickfix.pro: quickfix.c $(DEP)
-regexp.o: regexp.c $(DEP)
-regexp.pro: regexp.c $(DEP)
-screen.o: screen.c $(DEP)
-screen.pro: screen.c $(DEP)
-search.o: search.c $(DEP)
-search.pro: search.c $(DEP)
-syntax.o: syntax.c $(DEP)
-syntax.pro: syntax.c $(DEP)
-tag.o: tag.c $(DEP)
-tag.pro: tag.c $(DEP)
-term.o: term.c $(DEP)
-term.pro: term.c $(DEP)
-termlib.o: termlib.c $(DEP)
-termlib.pro: termlib.c $(DEP)
-ui.o: ui.c $(DEP)
-ui.pro: ui.c $(DEP)
-undo.o: undo.c $(DEP)
-undo.pro: undo.c $(DEP)
-window.o: window.c $(DEP)
-window.pro: window.c $(DEP)
-gui_amiga.o: gui_amiga.c $(DEP) amiga.h
-#gui_amiga.pro: gui_amiga.c $(DEP) amiga.h
-amiga.o: amiga.c $(DEP) amiga.h
-amiga.pro: amiga.c $(DEP) amiga.h
-gui.o: gui.c $(DEP)
-gui.pro: gui.c $(DEP)
diff --git a/src/Make_aros.mak b/src/Make_aros.mak
deleted file mode 100644
index 5d26eef0e..000000000
--- a/src/Make_aros.mak
+++ /dev/null
@@ -1,29 +0,0 @@
-# Makefile for AROS
-
-CFLAGS = -pipe -O2 -Wall -Iproto \
- -DNO_ARP -DUSE_TMPNAM -DFEAT_GUI_AMIGA
-
-PRG = VIM
-LIBS =
-CC = i386-linux-aros-gcc
-LD = i386-linux-aros-gcc
-RM = rm
-
-SRCS = buffer.c charset.c diff.c digraph.c edit.c eval.c ex_cmds.c \
- ex_cmds2.c ex_docmd.c ex_eval.c ex_getln.c fileio.c fold.c getchar.c \
- main.c mark.c mbyte.c memfile.c memline.c menu.c message.c misc1.c \
- misc2.c move.c normal.c ops.c option.c os_amiga.c quickfix.c \
- regexp.c screen.c search.c syntax.c tag.c term.c ui.c undo.c \
- version.c window.c gui_amiga.c gui.c
-
-OBJS = $(SRCS:.c=.o)
-
-
-$(PRG): $(OBJS)
- ${LD} -o $(PRG) $(OBJS) $(LIBS)
-
-.c.o:
- ${CC} -c ${CFLAGS} $< -o $@
-
-clean:
- $(RM) -fv $(OBJS) $(PRG)
diff --git a/src/Make_morph.mak b/src/Make_morph.mak
index f9ceb50c5..ffcb81454 100644
--- a/src/Make_morph.mak
+++ b/src/Make_morph.mak
@@ -2,16 +2,6 @@
# Makefile for VIM, using MorphOS SDK (gcc 2.95.3)
#
-# Uncomment the following two lines and comment the two after in
-# case you want to play with GVIM MorphOS. But it's still known
-# to not work at all. So meanwhile it's better to stick with VIM.
-
-# GVIM = -DFEAT_GUI_AMIGA
-# GVIMSRC = gui_amiga.c gui.c
-
-GVIM =
-GVIMSRC =
-
CFLAGS = -c \
-pipe \
-O2 \
@@ -19,7 +9,6 @@ CFLAGS = -c \
\
-DNO_ARP \
-DUSE_TMPNAM \
- ${GVIM} \
\
-I proto \
\
@@ -74,7 +63,6 @@ SRC = buffer.c \
undo.c \
version.c \
window.c \
- ${GVIMSRC}
OBJ = $(SRC:.c=.o)
diff --git a/src/eval.c b/src/eval.c
index 82d1c69c5..e812e5329 100644
--- a/src/eval.c
+++ b/src/eval.c
@@ -94,7 +94,11 @@ struct listvar_S
typedef struct listvar_S listvar;
#define VAR_LIST_MAXNEST 100 /* maximum nesting of lists */
-static char_u *e_listidx = (char_u *)N_("E999: list index out of range: %ld");
+static char *e_letunexp = N_("E18: Unexpected characters in :let");
+static char *e_listidx = N_("E999: list index out of range: %ld");
+static char *e_undefvar = N_("E121: Undefined variable: %s");
+static char *e_missbrac = N_("E111: Missing ']'");
+static char *e_intern2 = N_("E999: Internal error: %s");
/*
* All user-defined global variables are stored in "variables".
@@ -159,7 +163,7 @@ struct funccall
var firstline; /* "a:firstline" variable */
var lastline; /* "a:lastline" variable */
garray_T l_vars; /* local function variables */
- typeval *retvar; /* return value variable */
+ typeval *rettv; /* return value */
linenr_T breakpoint; /* next line with breakpoint or zero */
int dbg_tick; /* debug_tick when breakpoint was set */
int level; /* top nesting level of executed function */
@@ -275,19 +279,19 @@ struct vimvar
{"insertmode", sizeof("insertmode") - 1, NULL, VAR_STRING, VV_RO},
};
-static int eval0 __ARGS((char_u *arg, VAR retvar, char_u **nextcmd, int evaluate));
-static int eval1 __ARGS((char_u **arg, typeval *retvar, int evaluate));
-static int eval2 __ARGS((char_u **arg, typeval *retvar, int evaluate));
-static int eval3 __ARGS((char_u **arg, typeval *retvar, int evaluate));
-static int eval4 __ARGS((char_u **arg, typeval *retvar, int evaluate));
-static int eval5 __ARGS((char_u **arg, typeval *retvar, int evaluate));
-static int eval6 __ARGS((char_u **arg, typeval *retvar, int evaluate));
-static int eval7 __ARGS((char_u **arg, typeval *retvar, int evaluate));
-static int eval_index __ARGS((char_u **arg, typeval *retvar, int evaluate));
-static int get_option_vartv __ARGS((char_u **arg, typeval *retvar, int evaluate));
-static int get_string_vartv __ARGS((char_u **arg, typeval *retvar, int evaluate));
-static int get_lit_string_vartv __ARGS((char_u **arg, typeval *retvar, int evaluate));
-static int get_list_vartv __ARGS((char_u **arg, typeval *retvar, int evaluate));
+static int eval0 __ARGS((char_u *arg, typeval *rettv, char_u **nextcmd, int evaluate));
+static int eval1 __ARGS((char_u **arg, typeval *rettv, int evaluate));
+static int eval2 __ARGS((char_u **arg, typeval *rettv, int evaluate));
+static int eval3 __ARGS((char_u **arg, typeval *rettv, int evaluate));
+static int eval4 __ARGS((char_u **arg, typeval *rettv, int evaluate));
+static int eval5 __ARGS((char_u **arg, typeval *rettv, int evaluate));
+static int eval6 __ARGS((char_u **arg, typeval *rettv, int evaluate));
+static int eval7 __ARGS((char_u **arg, typeval *rettv, int evaluate));
+static int eval_index __ARGS((char_u **arg, typeval *rettv, int evaluate));
+static int get_option_tv __ARGS((char_u **arg, typeval *rettv, int evaluate));
+static int get_string_tv __ARGS((char_u **arg, typeval *rettv, int evaluate));
+static int get_lit_string_tv __ARGS((char_u **arg, typeval *rettv, int evaluate));
+static int get_list_tv __ARGS((char_u **arg, typeval *rettv, int evaluate));
static listvar *list_alloc __ARGS((void));
static void list_unref __ARGS((listvar *l));
static void list_free __ARGS((listvar *l));
@@ -301,180 +305,180 @@ static listvar *list_copy __ARGS((listvar *orig, int deep));
static listitem *list_getrem __ARGS((listvar *l, long n));
static char_u *list2string __ARGS((typeval *tv));
static char_u *tv2string __ARGS((typeval *tv, char_u **tofree));
-static int get_env_vartv __ARGS((char_u **arg, typeval *retvar, int evaluate));
+static int get_env_tv __ARGS((char_u **arg, typeval *rettv, int evaluate));
static int find_internal_func __ARGS((char_u *name));
static char_u *deref_func_name __ARGS((char_u *name, int *lenp));
-static int get_func_vartv __ARGS((char_u *name, int len, typeval *retvar, char_u **arg, linenr_T firstline, linenr_T lastline, int *doesrange, int evaluate));
-static int call_func __ARGS((char_u *name, int len, typeval *retvar, int argcount, typeval *argvars, linenr_T firstline, linenr_T lastline, int *doesrange, int evaluate));
-static void f_append __ARGS((typeval *argvars, typeval *retvar));
-static void f_argc __ARGS((typeval *argvars, typeval *retvar));
-static void f_argidx __ARGS((typeval *argvars, typeval *retvar));
-static void f_argv __ARGS((typeval *argvars, typeval *retvar));
-static void f_browse __ARGS((typeval *argvars, typeval *retvar));
-static void f_browsedir __ARGS((typeval *argvars, typeval *retvar));
+static int get_func_tv __ARGS((char_u *name, int len, typeval *rettv, char_u **arg, linenr_T firstline, linenr_T lastline, int *doesrange, int evaluate));
+static int call_func __ARGS((char_u *name, int len, typeval *rettv, int argcount, typeval *argvars, linenr_T firstline, linenr_T lastline, int *doesrange, int evaluate));
+static void f_append __ARGS((typeval *argvars, typeval *rettv));
+static void f_argc __ARGS((typeval *argvars, typeval *rettv));
+static void f_argidx __ARGS((typeval *argvars, typeval *rettv));
+static void f_argv __ARGS((typeval *argvars, typeval *rettv));
+static void f_browse __ARGS((typeval *argvars, typeval *rettv));
+static void f_browsedir __ARGS((typeval *argvars, typeval *rettv));
static buf_T *find_buffer __ARGS((typeval *avar));
-static void f_bufexists __ARGS((typeval *argvars, typeval *retvar));
-static void f_buflisted __ARGS((typeval *argvars, typeval *retvar));
-static void f_bufloaded __ARGS((typeval *argvars, typeval *retvar));
-static buf_T *get_buf_vartv __ARGS((typeval *avar));
-static void f_bufname __ARGS((typeval *argvars, typeval *retvar));
-static void f_bufnr __ARGS((typeval *argvars, typeval *retvar));
-static void f_bufwinnr __ARGS((typeval *argvars, typeval *retvar));
-static void f_byte2line __ARGS((typeval *argvars, typeval *retvar));
-static void f_byteidx __ARGS((typeval *argvars, typeval *retvar));
-static void f_char2nr __ARGS((typeval *argvars, typeval *retvar));
-static void f_cindent __ARGS((typeval *argvars, typeval *retvar));
-static void f_col __ARGS((typeval *argvars, typeval *retvar));
-static void f_confirm __ARGS((typeval *argvars, typeval *retvar));
-static void f_copy __ARGS((typeval *argvars, typeval *retvar));
-static void f_cscope_connection __ARGS((typeval *argvars, typeval *retvar));
-static void f_cursor __ARGS((typeval *argsvars, typeval *retvar));
-static void f_deepcopy __ARGS((typeval *argvars, typeval *retvar));
-static void f_delete __ARGS((typeval *argvars, typeval *retvar));
-static void f_did_filetype __ARGS((typeval *argvars, typeval *retvar));
-static void f_diff_filler __ARGS((typeval *argvars, typeval *retvar));
-static void f_diff_hlID __ARGS((typeval *argvars, typeval *retvar));
-static void f_escape __ARGS((typeval *argvars, typeval *retvar));
-static void f_eventhandler __ARGS((typeval *argvars, typeval *retvar));
-static void f_executable __ARGS((typeval *argvars, typeval *retvar));
-static void f_exists __ARGS((typeval *argvars, typeval *retvar));
-static void f_expand __ARGS((typeval *argvars, typeval *retvar));
-static void f_filereadable __ARGS((typeval *argvars, typeval *retvar));
-static void f_filewritable __ARGS((typeval *argvars, typeval *retvar));
-static void f_finddir __ARGS((typeval *argvars, typeval *retvar));
-static void f_findfile __ARGS((typeval *argvars, typeval *retvar));
-static void f_findfilendir __ARGS((typeval *argvars, typeval *retvar, int dir));
-static void f_fnamemodify __ARGS((typeval *argvars, typeval *retvar));
-static void f_foldclosed __ARGS((typeval *argvars, typeval *retvar));
-static void f_foldclosedend __ARGS((typeval *argvars, typeval *retvar));
-static void foldclosed_both __ARGS((typeval *argvars, typeval *retvar, int end));
-static void f_foldlevel __ARGS((typeval *argvars, typeval *retvar));
-static void f_foldtext __ARGS((typeval *argvars, typeval *retvar));
-static void f_foldtextresult __ARGS((typeval *argvars, typeval *retvar));
-static void f_foreground __ARGS((typeval *argvars, typeval *retvar));
-static void f_function __ARGS((typeval *argvars, typeval *retvar));
-static void f_getbufvar __ARGS((typeval *argvars, typeval *retvar));
-static void f_getchar __ARGS((typeval *argvars, typeval *retvar));
-static void f_getcharmod __ARGS((typeval *argvars, typeval *retvar));
-static void f_getcmdline __ARGS((typeval *argvars, typeval *retvar));
-static void f_getcmdpos __ARGS((typeval *argvars, typeval *retvar));
-static void f_getcwd __ARGS((typeval *argvars, typeval *retvar));
-static void f_getfontname __ARGS((typeval *argvars, typeval *retvar));
-static void f_getfperm __ARGS((typeval *argvars, typeval *retvar));
-static void f_getfsize __ARGS((typeval *argvars, typeval *retvar));
-static void f_getftime __ARGS((typeval *argvars, typeval *retvar));
-static void f_getftype __ARGS((typeval *argvars, typeval *retvar));
-static void f_getline __ARGS((typeval *argvars, typeval *retvar));
-static void f_getreg __ARGS((typeval *argvars, typeval *retvar));
-static void f_getregtype __ARGS((typeval *argvars, typeval *retvar));
-static void f_getwinposx __ARGS((typeval *argvars, typeval *retvar));
-static void f_getwinposy __ARGS((typeval *argvars, typeval *retvar));
-static void f_getwinvar __ARGS((typeval *argvars, typeval *retvar));
-static void f_glob __ARGS((typeval *argvars, typeval *retvar));
-static void f_globpath __ARGS((typeval *argvars, typeval *retvar));
-static void f_has __ARGS((typeval *argvars, typeval *retvar));
-static void f_hasmapto __ARGS((typeval *argvars, typeval *retvar));
-static void f_histadd __ARGS((typeval *argvars, typeval *retvar));
-static void f_histdel __ARGS((typeval *argvars, typeval *retvar));
-static void f_histget __ARGS((typeval *argvars, typeval *retvar));
-static void f_histnr __ARGS((typeval *argvars, typeval *retvar));
-static void f_hlexists __ARGS((typeval *argvars, typeval *retvar));
-static void f_hlID __ARGS((typeval *argvars, typeval *retvar));
-static void f_hostname __ARGS((typeval *argvars, typeval *retvar));
-static void f_iconv __ARGS((typeval *argvars, typeval *retvar));
-static void f_indent __ARGS((typeval *argvars, typeval *retvar));
-static void f_insert __ARGS((typeval *argvars, typeval *retvar));
-static void f_isdirectory __ARGS((typeval *argvars, typeval *retvar));
-static void f_input __ARGS((typeval *argvars, typeval *retvar));
-static void f_inputdialog __ARGS((typeval *argvars, typeval *retvar));
-static void f_inputrestore __ARGS((typeval *argvars, typeval *retvar));
-static void f_inputsave __ARGS((typeval *argvars, typeval *retvar));
-static void f_inputsecret __ARGS((typeval *argvars, typeval *retvar));
-static void f_last_buffer_nr __ARGS((typeval *argvars, typeval *retvar));
-static void f_len __ARGS((typeval *argvars, typeval *retvar));
-static void f_libcall __ARGS((typeval *argvars, typeval *retvar));
-static void f_libcallnr __ARGS((typeval *argvars, typeval *retvar));
-static void libcall_common __ARGS((typeval *argvars, typeval *retvar, int type));
-static void f_line __ARGS((typeval *argvars, typeval *retvar));
-static void f_line2byte __ARGS((typeval *argvars, typeval *retvar));
-static void f_lispindent __ARGS((typeval *argvars, typeval *retvar));
-static void f_localtime __ARGS((typeval *argvars, typeval *retvar));
-static void f_maparg __ARGS((typeval *argvars, typeval *retvar));
-static void f_mapcheck __ARGS((typeval *argvars, typeval *retvar));
-static void get_maparg __ARGS((typeval *argvars, typeval *retvar, int exact));
-static void f_match __ARGS((typeval *argvars, typeval *retvar));
-static void f_matchend __ARGS((typeval *argvars, typeval *retvar));
-static void f_matchstr __ARGS((typeval *argvars, typeval *retvar));
-static void f_mode __ARGS((typeval *argvars, typeval *retvar));
-static void f_nextnonblank __ARGS((typeval *argvars, typeval *retvar));
-static void f_nr2char __ARGS((typeval *argvars, typeval *retvar));
-static void f_prevnonblank __ARGS((typeval *argvars, typeval *retvar));
-static void f_setbufvar __ARGS((typeval *argvars, typeval *retvar));
-static void f_setcmdpos __ARGS((typeval *argvars, typeval *retvar));
-static void f_setwinvar __ARGS((typeval *argvars, typeval *retvar));
-static void f_remove __ARGS((typeval *argvars, typeval *retvar));
-static void f_rename __ARGS((typeval *argvars, typeval *retvar));
-static void f_resolve __ARGS((typeval *argvars, typeval *retvar));
-static void f_search __ARGS((typeval *argvars, typeval *retvar));
-static void f_searchpair __ARGS((typeval *argvars, typeval *retvar));
+static void f_bufexists __ARGS((typeval *argvars, typeval *rettv));
+static void f_buflisted __ARGS((typeval *argvars, typeval *rettv));
+static void f_bufloaded __ARGS((typeval *argvars, typeval *rettv));
+static buf_T *get_buf_tv __ARGS((typeval *tv));
+static void f_bufname __ARGS((typeval *argvars, typeval *rettv));
+static void f_bufnr __ARGS((typeval *argvars, typeval *rettv));
+static void f_bufwinnr __ARGS((typeval *argvars, typeval *rettv));
+static void f_byte2line __ARGS((typeval *argvars, typeval *rettv));
+static void f_byteidx __ARGS((typeval *argvars, typeval *rettv));
+static void f_char2nr __ARGS((typeval *argvars, typeval *rettv));
+static void f_cindent __ARGS((typeval *argvars, typeval *rettv));
+static void f_col __ARGS((typeval *argvars, typeval *rettv));
+static void f_confirm __ARGS((typeval *argvars, typeval *rettv));
+static void f_copy __ARGS((typeval *argvars, typeval *rettv));
+static void f_cscope_connection __ARGS((typeval *argvars, typeval *rettv));
+static void f_cursor __ARGS((typeval *argsvars, typeval *rettv));
+static void f_deepcopy __ARGS((typeval *argvars, typeval *rettv));
+static void f_delete __ARGS((typeval *argvars, typeval *rettv));
+static void f_did_filetype __ARGS((typeval *argvars, typeval *rettv));
+static void f_diff_filler __ARGS((typeval *argvars, typeval *rettv));
+static void f_diff_hlID __ARGS((typeval *argvars, typeval *rettv));
+static void f_escape __ARGS((typeval *argvars, typeval *rettv));
+static void f_eventhandler __ARGS((typeval *argvars, typeval *rettv));
+static void f_executable __ARGS((typeval *argvars, typeval *rettv));
+static void f_exists __ARGS((typeval *argvars, typeval *rettv));
+static void f_expand __ARGS((typeval *argvars, typeval *rettv));
+static void f_filereadable __ARGS((typeval *argvars, typeval *rettv));
+static void f_filewritable __ARGS((typeval *argvars, typeval *rettv));
+static void f_finddir __ARGS((typeval *argvars, typeval *rettv));
+static void f_findfile __ARGS((typeval *argvars, typeval *rettv));
+static void f_findfilendir __ARGS((typeval *argvars, typeval *rettv, int dir));
+static void f_fnamemodify __ARGS((typeval *argvars, typeval *rettv));
+static void f_foldclosed __ARGS((typeval *argvars, typeval *rettv));
+static void f_foldclosedend __ARGS((typeval *argvars, typeval *rettv));
+static void foldclosed_both __ARGS((typeval *argvars, typeval *rettv, int end));
+static void f_foldlevel __ARGS((typeval *argvars, typeval *rettv));
+static void f_foldtext __ARGS((typeval *argvars, typeval *rettv));
+static void f_foldtextresult __ARGS((typeval *argvars, typeval *rettv));
+static void f_foreground __ARGS((typeval *argvars, typeval *rettv));
+static void f_function __ARGS((typeval *argvars, typeval *rettv));
+static void f_getbufvar __ARGS((typeval *argvars, typeval *rettv));
+static void f_getchar __ARGS((typeval *argvars, typeval *rettv));
+static void f_getcharmod __ARGS((typeval *argvars, typeval *rettv));
+static void f_getcmdline __ARGS((typeval *argvars, typeval *rettv));
+static void f_getcmdpos __ARGS((typeval *argvars, typeval *rettv));
+static void f_getcwd __ARGS((typeval *argvars, typeval *rettv));
+static void f_getfontname __ARGS((typeval *argvars, typeval *rettv));
+static void f_getfperm __ARGS((typeval *argvars, typeval *rettv));
+static void f_getfsize __ARGS((typeval *argvars, typeval *rettv));
+static void f_getftime __ARGS((typeval *argvars, typeval *rettv));
+static void f_getftype __ARGS((typeval *argvars, typeval *rettv));
+static void f_getline __ARGS((typeval *argvars, typeval *rettv));
+static void f_getreg __ARGS((typeval *argvars, typeval *rettv));
+static void f_getregtype __ARGS((typeval *argvars, typeval *rettv));
+static void f_getwinposx __ARGS((typeval *argvars, typeval *rettv));
+static void f_getwinposy __ARGS((typeval *argvars, typeval *rettv));
+static void f_getwinvar __ARGS((typeval *argvars, typeval *rettv));
+static void f_glob __ARGS((typeval *argvars, typeval *rettv));
+static void f_globpath __ARGS((typeval *argvars, typeval *rettv));
+static void f_has __ARGS((typeval *argvars, typeval *rettv));
+static void f_hasmapto __ARGS((typeval *argvars, typeval *rettv));
+static void f_histadd __ARGS((typeval *argvars, typeval *rettv));
+static void f_histdel __ARGS((typeval *argvars, typeval *rettv));
+static void f_histget __ARGS((typeval *argvars, typeval *rettv));
+static void f_histnr __ARGS((typeval *argvars, typeval *rettv));
+static void f_hlexists __ARGS((typeval *argvars, typeval *rettv));
+static void f_hlID __ARGS((typeval *argvars, typeval *rettv));
+static void f_hostname __ARGS((typeval *argvars, typeval *rettv));
+static void f_iconv __ARGS((typeval *argvars, typeval *rettv));
+static void f_indent __ARGS((typeval *argvars, typeval *rettv));
+static void f_insert __ARGS((typeval *argvars, typeval *rettv));
+static void f_isdirectory __ARGS((typeval *argvars, typeval *rettv));
+static void f_input __ARGS((typeval *argvars, typeval *rettv));
+static void f_inputdialog __ARGS((typeval *argvars, typeval *rettv));
+static void f_inputrestore __ARGS((typeval *argvars, typeval *rettv));
+static void f_inputsave __ARGS((typeval *argvars, typeval *rettv));
+static void f_inputsecret __ARGS((typeval *argvars, typeval *rettv));
+static void f_last_buffer_nr __ARGS((typeval *argvars, typeval *rettv));
+static void f_len __ARGS((typeval *argvars, typeval *rettv));
+static void f_libcall __ARGS((typeval *argvars, typeval *rettv));
+static void f_libcallnr __ARGS((typeval *argvars, typeval *rettv));
+static void libcall_common __ARGS((typeval *argvars, typeval *rettv, int type));
+static void f_line __ARGS((typeval *argvars, typeval *rettv));
+static void f_line2byte __ARGS((typeval *argvars, typeval *rettv));
+static void f_lispindent __ARGS((typeval *argvars, typeval *rettv));
+static void f_localtime __ARGS((typeval *argvars, typeval *rettv));
+static void f_maparg __ARGS((typeval *argvars, typeval *rettv));
+static void f_mapcheck __ARGS((typeval *argvars, typeval *rettv));
+static void get_maparg __ARGS((typeval *argvars, typeval *rettv, int exact));
+static void f_match __ARGS((typeval *argvars, typeval *rettv));
+static void f_matchend __ARGS((typeval *argvars, typeval *rettv));
+static void f_matchstr __ARGS((typeval *argvars, typeval *rettv));
+static void f_mode __ARGS((typeval *argvars, typeval *rettv));
+static void f_nextnonblank __ARGS((typeval *argvars, typeval *rettv));
+static void f_nr2char __ARGS((typeval *argvars, typeval *rettv));
+static void f_prevnonblank __ARGS((typeval *argvars, typeval *rettv));
+static void f_setbufvar __ARGS((typeval *argvars, typeval *rettv));
+static void f_setcmdpos __ARGS((typeval *argvars, typeval *rettv));
+static void f_setwinvar __ARGS((typeval *argvars, typeval *rettv));
+static void f_remove __ARGS((typeval *argvars, typeval *rettv));
+static void f_rename __ARGS((typeval *argvars, typeval *rettv));
+static void f_resolve __ARGS((typeval *argvars, typeval *rettv));
+static void f_search __ARGS((typeval *argvars, typeval *rettv));
+static void f_searchpair __ARGS((typeval *argvars, typeval *rettv));
static int get_search_arg __ARGS((typeval *varp, int *flagsp));
-static void f_remote_expr __ARGS((typeval *argvars, typeval *retvar));
-static void f_remote_foreground __ARGS((typeval *argvars, typeval *retvar));
-static void f_remote_peek __ARGS((typeval *argvars, typeval *retvar));
-static void f_remote_read __ARGS((typeval *argvars, typeval *retvar));
-static void f_remote_send __ARGS((typeval *argvars, typeval *retvar));
-static void f_repeat __ARGS((typeval *argvars, typeval *retvar));
-static void f_server2client __ARGS((typeval *argvars, typeval *retvar));
-static void f_serverlist __ARGS((typeval *argvars, typeval *retvar));
-static void f_setline __ARGS((typeval *argvars, typeval *retvar));
-static void f_setreg __ARGS((typeval *argvars, typeval *retvar));
-static void f_simplify __ARGS((typeval *argvars, typeval *retvar));
-static void find_some_match __ARGS((typeval *argvars, typeval *retvar, int start));
-static void f_strftime __ARGS((typeval *argvars, typeval *retvar));
-static void f_stridx __ARGS((typeval *argvars, typeval *retvar));
-static void f_string __ARGS((typeval *argvars, typeval *retvar));
-static void f_strlen __ARGS((typeval *argvars, typeval *retvar));
-static void f_strpart __ARGS((typeval *argvars, typeval *retvar));
-static void f_strridx __ARGS((typeval *argvars, typeval *retvar));
-static void f_strtrans __ARGS((typeval *argvars, typeval *retvar));
-static void f_synID __ARGS((typeval *argvars, typeval *retvar));
-static void f_synIDattr __ARGS((typeval *argvars, typeval *retvar));
-static void f_synIDtrans __ARGS((typeval *argvars, typeval *retvar));
-static void f_system __ARGS((typeval *argvars, typeval *retvar));
-static void f_submatch __ARGS((typeval *argvars, typeval *retvar));
-static void f_substitute __ARGS((typeval *argvars, typeval *retvar));
-static void f_tempname __ARGS((typeval *argvars, typeval *retvar));
-static void f_tolower __ARGS((typeval *argvars, typeval *retvar));
-static void f_toupper __ARGS((typeval *argvars, typeval *retvar));
-static void f_tr __ARGS((typeval *argvars, typeval *retvar));
-static void f_type __ARGS((typeval *argvars, typeval *retvar));
-static void f_virtcol __ARGS((typeval *argvars, typeval *retvar));
-static void f_visualmode __ARGS((typeval *argvars, typeval *retvar));
-static void f_winbufnr __ARGS((typeval *argvars, typeval *retvar));
-static void f_wincol __ARGS((typeval *argvars, typeval *retvar));
-static void f_winheight __ARGS((typeval *argvars, typeval *retvar));
-static void f_winline __ARGS((typeval *argvars, typeval *retvar));
-static void f_winnr __ARGS((typeval *argvars, typeval *retvar));
-static void f_winrestcmd __ARGS((typeval *argvars, typeval *retvar));
-static void f_winwidth __ARGS((typeval *argvars, typeval *retvar));
+static void f_remote_expr __ARGS((typeval *argvars, typeval *rettv));
+static void f_remote_foreground __ARGS((typeval *argvars, typeval *rettv));
+static void f_remote_peek __ARGS((typeval *argvars, typeval *rettv));
+static void f_remote_read __ARGS((typeval *argvars, typeval *rettv));
+static void f_remote_send __ARGS((typeval *argvars, typeval *rettv));
+static void f_repeat __ARGS((typeval *argvars, typeval *rettv));
+static void f_server2client __ARGS((typeval *argvars, typeval *rettv));
+static void f_serverlist __ARGS((typeval *argvars, typeval *rettv));
+static void f_setline __ARGS((typeval *argvars, typeval *rettv));
+static void f_setreg __ARGS((typeval *argvars, typeval *rettv));
+static void f_simplify __ARGS((typeval *argvars, typeval *rettv));
+static void find_some_match __ARGS((typeval *argvars, typeval *rettv, int start));
+static void f_strftime __ARGS((typeval *argvars, typeval *rettv));
+static void f_stridx __ARGS((typeval *argvars, typeval *rettv));
+static void f_string __ARGS((typeval *argvars, typeval *rettv));
+static void f_strlen __ARGS((typeval *argvars, typeval *rettv));
+static void f_strpart __ARGS((typeval *argvars, typeval *rettv));
+static void f_strridx __ARGS((typeval *argvars, typeval *rettv));
+static void f_strtrans __ARGS((typeval *argvars, typeval *rettv));
+static void f_synID __ARGS((typeval *argvars, typeval *rettv));
+static void f_synIDattr __ARGS((typeval *argvars, typeval *rettv));
+static void f_synIDtrans __ARGS((typeval *argvars, typeval *rettv));
+static void f_system __ARGS((typeval *argvars, typeval *rettv));
+static void f_submatch __ARGS((typeval *argvars, typeval *rettv));
+static void f_substitute __ARGS((typeval *argvars, typeval *rettv));
+static void f_tempname __ARGS((typeval *argvars, typeval *rettv));
+static void f_tolower __ARGS((typeval *argvars, typeval *rettv));
+static void f_toupper __ARGS((typeval *argvars, typeval *rettv));
+static void f_tr __ARGS((typeval *argvars, typeval *rettv));
+static void f_type __ARGS((typeval *argvars, typeval *rettv));
+static void f_virtcol __ARGS((typeval *argvars, typeval *rettv));
+static void f_visualmode __ARGS((typeval *argvars, typeval *rettv));
+static void f_winbufnr __ARGS((typeval *argvars, typeval *rettv));
+static void f_wincol __ARGS((typeval *argvars, typeval *rettv));
+static void f_winheight __ARGS((typeval *argvars, typeval *rettv));
+static void f_winline __ARGS((typeval *argvars, typeval *rettv));
+static void f_winnr __ARGS((typeval *argvars, typeval *rettv));
+static void f_winrestcmd __ARGS((typeval *argvars, typeval *rettv));
+static void f_winwidth __ARGS((typeval *argvars, typeval *rettv));
static win_T *find_win_by_nr __ARGS((typeval *vp));
static pos_T *var2fpos __ARGS((typeval *varp, int lnum));
static int get_env_len __ARGS((char_u **arg));
static int get_id_len __ARGS((char_u **arg));
static int get_func_len __ARGS((char_u **arg, char_u **alias, int evaluate));
-static char_u *find_name_end __ARGS((char_u *arg, char_u **expr_start, char_u **expr_end));
+static char_u *find_name_end __ARGS((char_u *arg, char_u **expr_start, char_u **expr_end, int incl_br));
static int eval_isnamec __ARGS((int c));
static int find_vim_var __ARGS((char_u *name, int len));
-static int get_var_vartv __ARGS((char_u *name, int len, typeval *retvar));
-static VAR alloc_var __ARGS((void));
-static typeval *alloc_vartv __ARGS((void));
-static typeval *alloc_string_vartv __ARGS((char_u *string));
-static void free_vartv __ARGS((typeval *varp));
-static void clear_vartv __ARGS((typeval *varp));
-static long get_vartv_number __ARGS((typeval *varp));
-static linenr_T get_vartv_lnum __ARGS((typeval *argvars));
-static char_u *get_vartv_string __ARGS((typeval *varp));
-static char_u *get_vartv_string_buf __ARGS((typeval *varp, char_u *buf));
+static int get_var_tv __ARGS((char_u *name, int len, typeval *rettv));
+static typeval *alloc_tv __ARGS((void));
+static typeval *alloc_string_tv __ARGS((char_u *string));
+static void free_tv __ARGS((typeval *varp));
+static void clear_tv __ARGS((typeval *varp));
+static void init_tv __ARGS((typeval *varp));
+static long get_tv_number __ARGS((typeval *varp));
+static linenr_T get_tv_lnum __ARGS((typeval *argvars));
+static char_u *get_tv_string __ARGS((typeval *varp));
+static char_u *get_tv_string_buf __ARGS((typeval *varp, char_u *buf));
static VAR find_var __ARGS((char_u *name, int writing));
static VAR find_var_in_ga __ARGS((garray_T *gap, char_u *varname));
static garray_T *find_var_ga __ARGS((char_u *name, char_u **varname));
@@ -483,7 +487,7 @@ static void list_one_var __ARGS((VAR v, char_u *prefix));
static void list_vim_var __ARGS((int i));
static void list_one_var_a __ARGS((char_u *prefix, char_u *name, int type, char_u *string));
static void set_var __ARGS((char_u *name, typeval *varp, int copy));
-static void copy_vartv __ARGS((typeval *from, typeval *to));
+static void copy_tv __ARGS((typeval *from, typeval *to));
static char_u *find_option_end __ARGS((char_u **arg, int *opt_flags));
static char_u *trans_function_name __ARGS((char_u **pp, int skip, int internal));
static int eval_fname_script __ARGS((char_u *p));
@@ -492,19 +496,18 @@ static void list_func_head __ARGS((ufunc_T *fp, int indent));
static void cat_func_name __ARGS((char_u *buf, ufunc_T *fp));
static ufunc_T *find_func __ARGS((char_u *name));
static int function_exists __ARGS((char_u *name));
-static void call_user_func __ARGS((ufunc_T *fp, int argcount, typeval *argvars, typeval *retvar, linenr_T firstline, linenr_T lastline));
+static void call_user_func __ARGS((ufunc_T *fp, int argcount, typeval *argvars, typeval *rettv, linenr_T firstline, linenr_T lastline));
-#define get_var_string(p) get_vartv_string(&(p)->tv)
-#define get_var_string_buf(p, b) get_vartv_string_buf(&(p)->tv, (b))
-#define get_var_number(p) get_vartv_number(&((p)->tv))
+#define get_var_string(p) get_tv_string(&(p)->tv)
+#define get_var_string_buf(p, b) get_tv_string_buf(&(p)->tv, (b))
+#define get_var_number(p) get_tv_number(&((p)->tv))
-/* Magic braces are always enabled, otherwise Vim scripts would not be
- * portable. */
-#define FEAT_MAGIC_BRACES
-
-#ifdef FEAT_MAGIC_BRACES
static char_u * make_expanded_name __ARGS((char_u *in_start, char_u *expr_start, char_u *expr_end, char_u *in_end));
-#endif
+
+static void list_all_vars __ARGS((void));
+static char_u *list_arg_vars __ARGS((exarg_T *eap, char_u *arg));
+static char_u *ex_let_one __ARGS((char_u *arg, typeval *tv, int copy, char_u *endchars));
+static char_u *set_var_idx __ARGS((char_u *name, char_u *ip, typeval *rettv, int copy, char_u *endchars));
/*
* Set an internal variable to a string value. Creates the variable if it does
@@ -521,11 +524,11 @@ set_internal_string_var(name, value)
val = vim_strsave(value);
if (val != NULL)
{
- tvp = alloc_string_vartv(val);
+ tvp = alloc_string_tv(val);
if (tvp != NULL)
{
set_var(name, tvp, FALSE);
- free_vartv(tvp);
+ free_tv(tvp);
}
}
}
@@ -629,22 +632,20 @@ eval_to_bool(arg, error, nextcmd, skip)
char_u **nextcmd;
int skip; /* only parse, don't execute */
{
- var retvar;
+ typeval tv;
int retval = FALSE;
if (skip)
++emsg_skip;
- if (eval0(arg, &retvar, nextcmd, !skip) == FAIL)
- {
+ if (eval0(arg, &tv, nextcmd, !skip) == FAIL)
*error = TRUE;
- }
else
{
*error = FALSE;
if (!skip)
{
- retval = (get_var_number(&retvar) != 0);
- clear_vartv(&retvar.tv);
+ retval = (get_tv_number(&tv) != 0);
+ clear_tv(&tv);
}
}
if (skip)
@@ -664,17 +665,17 @@ eval_to_string_skip(arg, nextcmd, skip)
char_u **nextcmd;
int skip; /* only parse, don't execute */
{
- var retvar;
+ typeval tv;
char_u *retval;
if (skip)
++emsg_skip;
- if (eval0(arg, &retvar, nextcmd, !skip) == FAIL || skip)
+ if (eval0(arg, &tv, nextcmd, !skip) == FAIL || skip)
retval = NULL;
else
{
- retval = vim_strsave(get_var_string(&retvar));
- clear_vartv(&retvar.tv);
+ retval = vim_strsave(get_tv_string(&tv));
+ clear_tv(&tv);
}
if (skip)
--emsg_skip;
@@ -690,10 +691,10 @@ eval_to_string_skip(arg, nextcmd, skip)
skip_expr(pp)
char_u **pp;
{
- typeval retvar;
+ typeval rettv;
*pp = skipwhite(*pp);
- return eval1(pp, &retvar, FALSE);
+ return eval1(pp, &rettv, FALSE);
}
/*
@@ -705,15 +706,15 @@ eval_to_string(arg, nextcmd)
char_u *arg;
char_u **nextcmd;
{
- var retvar;
+ typeval tv;
char_u *retval;
- if (eval0(arg, &retvar, nextcmd, TRUE) == FAIL)
+ if (eval0(arg, &tv, nextcmd, TRUE) == FAIL)
retval = NULL;
else
{
- retval = vim_strsave(get_var_string(&retvar));
- clear_vartv(&retvar.tv);
+ retval = vim_strsave(get_tv_string(&tv));
+ clear_tv(&tv);
}
return retval;
@@ -749,19 +750,19 @@ eval_to_string_safe(arg, nextcmd)
eval_arg_to_string(arg)
char_u **arg;
{
- typeval retvar;
+ typeval rettv;
char_u *retval;
int ret;
++emsg_off;
- ret = eval1(arg, &retvar, TRUE);
+ ret = eval1(arg, &rettv, TRUE);
if (ret == FAIL)
retval = NULL;
else
{
- retval = vim_strsave(get_vartv_string(&retvar));
- clear_vartv(&retvar);
+ retval = vim_strsave(get_tv_string(&rettv));
+ clear_tv(&rettv);
}
--emsg_off;
@@ -779,18 +780,18 @@ eval_arg_to_string(arg)
eval_to_number(expr)
char_u *expr;
{
- typeval retvar;
+ typeval rettv;
int retval;
char_u *p = expr;
++emsg_off;
- if (eval1(&p, &retvar, TRUE) == FAIL)
+ if (eval1(&p, &rettv, TRUE) == FAIL)
retval = -1;
else
{
- retval = get_vartv_number(&retvar);
- clear_vartv(&retvar);
+ retval = get_tv_number(&rettv);
+ clear_tv(&rettv);
}
--emsg_off;
@@ -810,7 +811,7 @@ call_vim_function(func, argc, argv, safe)
int safe; /* use the sandbox */
{
char_u *retval = NULL;
- var retvar;
+ typeval rettv;
typeval *argvars;
long n;
int len;
@@ -852,13 +853,13 @@ call_vim_function(func, argc, argv, safe)
++sandbox;
}
- retvar.tv.v_type = VAR_UNKNOWN; /* clear_vartv() uses this */
- if (call_func(func, (int)STRLEN(func), &retvar.tv, argc, argvars,
+ rettv.v_type = VAR_UNKNOWN; /* clear_tv() uses this */
+ if (call_func(func, (int)STRLEN(func), &rettv, argc, argvars,
curwin->w_cursor.lnum, curwin->w_cursor.lnum,
&doesrange, TRUE) == OK)
- retval = vim_strsave(get_var_string(&retvar));
+ retval = vim_strsave(get_tv_string(&rettv));
- clear_vartv(&retvar.tv);
+ clear_tv(&rettv);
vim_free(argvars);
if (safe)
@@ -901,33 +902,33 @@ eval_foldexpr(arg, cp)
char_u *arg;
int *cp;
{
- var retvar;
+ typeval tv;
int retval;
char_u *s;
++emsg_off;
++sandbox;
*cp = NUL;
- if (eval0(arg, &retvar, NULL, TRUE) == FAIL)
+ if (eval0(arg, &tv, NULL, TRUE) == FAIL)
retval = 0;
else
{
/* If the result is a number, just return the number. */
- if (retvar.tv.v_type == VAR_NUMBER)
- retval = retvar.tv.vval.v_number;
- else if (retvar.tv.v_type == VAR_UNKNOWN
- || retvar.tv.vval.v_string == NULL)
+ if (tv.v_type == VAR_NUMBER)
+ retval = tv.vval.v_number;
+ else if (tv.v_type == VAR_UNKNOWN
+ || tv.vval.v_string == NULL)
retval = 0;
else
{
/* If the result is a string, check if there is a non-digit before
* the number. */
- s = retvar.tv.vval.v_string;
+ s = tv.vval.v_string;
if (!VIM_ISDIGIT(*s) && *s != '-')
*cp = *s++;
retval = atol((char *)s);
}
- clear_vartv(&retvar.tv);
+ clear_tv(&tv);
}
--emsg_off;
--sandbox;
@@ -936,7 +937,6 @@ eval_foldexpr(arg, cp)
}
#endif
-#ifdef FEAT_MAGIC_BRACES
/*
* Expands out the 'magic' {}'s in a variable/function name.
* Note that this can call itself recursively, to deal with
@@ -990,7 +990,7 @@ make_expanded_name(in_start, expr_start, expr_end, in_end)
if (retval != NULL)
{
- temp_result = find_name_end(retval, &expr_start, &expr_end);
+ temp_result = find_name_end(retval, &expr_start, &expr_end, FALSE);
if (expr_start != NULL)
{
/* Further expansion! */
@@ -1004,307 +1004,525 @@ make_expanded_name(in_start, expr_start, expr_end, in_end)
return retval;
}
-#endif /* FEAT_MAGIC_BRACES */
/*
- * ":let var = expr" assignment command.
- * ":let var" list one variable value
- * ":let" list all variable values
+ * ":let" list all variable values
+ * ":let var1 var2" list variable values
+ * ":let var = expr" assignment command.
+ * ":let [var1, var2] = expr" unpack list.
*/
void
ex_let(eap)
exarg_T *eap;
{
char_u *arg = eap->arg;
- char_u *expr;
- char_u *name;
- VAR varp;
- var retvar;
- char_u *p;
- int c1 = 0, c2;
+ char_u *expr = NULL;
+ typeval rettv;
int i;
- char_u *expr_start;
- char_u *expr_end;
- char_u *name_end;
+ int var_count = 0;
+ int semicolon = 0;
+ listvar *l;
+ listitem *item;
- name_end = find_name_end(arg, &expr_start, &expr_end);
- expr = vim_strchr(name_end, '=');
- if (expr == NULL)
+ if (*arg != '[')
+ expr = vim_strchr(find_name_end(arg, NULL, NULL, TRUE), '=');
+ if (*arg != '[' && expr == NULL)
{
- if (ends_excmd(*arg))
- {
- if (!eap->skip)
- {
- /*
- * List all variables.
- */
- for (i = 0; i < variables.ga_len && !got_int; ++i)
- if (VAR_ENTRY(i).v_name != NULL)
- list_one_var(&VAR_ENTRY(i), (char_u *)"");
- for (i = 0; i < curbuf->b_vars.ga_len && !got_int; ++i)
- if (BVAR_ENTRY(i).v_name != NULL)
- list_one_var(&BVAR_ENTRY(i), (char_u *)"b:");
- for (i = 0; i < curwin->w_vars.ga_len && !got_int; ++i)
- if (WVAR_ENTRY(i).v_name != NULL)
- list_one_var(&WVAR_ENTRY(i), (char_u *)"w:");
- for (i = 0; i < VV_LEN && !got_int; ++i)
- if (vimvars[i].type == VAR_NUMBER || vimvars[i].val != NULL)
- list_vim_var(i);
- }
- }
- else
+ if (!ends_excmd(*arg))
+ /* ":let var1 var2" */
+ arg = list_arg_vars(eap, arg);
+ else if (!eap->skip)
+ /* ":let" */
+ list_all_vars();
+ eap->nextcmd = check_nextcmd(arg);
+ }
+ else
+ {
+ if (*arg == '[')
{
- int error = FALSE;
-
- /*
- * List variables.
- */
- while (!ends_excmd(*arg) && !got_int)
+ /* ":let [a, b] = expr": find the matching ']' to get to the
+ * expression. */
+ while (1)
{
- char_u *temp_string = NULL;
- int arg_len;
-
- /* Find the end of the name. */
- name_end = find_name_end(arg, &expr_start, &expr_end);
-
- if (!vim_iswhite(*name_end) && !ends_excmd(*name_end))
+ arg = skipwhite(arg + 1);
+ if (vim_strchr((char_u *)"$@&", *arg) != NULL)
+ ++arg;
+ expr = find_name_end(arg, NULL, NULL, TRUE);
+ if (expr == arg)
{
- emsg_severe = TRUE;
- EMSG(_(e_trailing));
- break;
+ EMSG2(_(e_invarg2), arg);
+ return;
}
- if (!error && !eap->skip)
- {
-#ifdef FEAT_MAGIC_BRACES
- if (expr_start != NULL)
- {
- temp_string = make_expanded_name(arg, expr_start,
- expr_end, name_end);
- if (temp_string == NULL)
- {
- /*
- * Report an invalid expression in braces, unless
- * the expression evaluation has been cancelled due
- * to an aborting error, an interrupt, or an
- * exception.
- */
- if (!aborting())
- {
- emsg_severe = TRUE;
- EMSG2(_(e_invarg2), arg);
- break;
- }
- error = TRUE;
- arg = skipwhite(name_end);
- continue;
- }
- arg = temp_string;
- arg_len = STRLEN(temp_string);
- }
- else
-#endif
- {
- c1 = *name_end;
- *name_end = NUL;
- arg_len = (int)(name_end - arg);
- }
- i = find_vim_var(arg, arg_len);
- if (i >= 0)
- list_vim_var(i);
- else if (STRCMP("b:changedtick", arg) == 0)
- {
- char_u numbuf[NUMBUFLEN];
+ ++var_count;
- sprintf((char *)numbuf, "%ld",
- (long)curbuf->b_changedtick);
- list_one_var_a((char_u *)"b:", (char_u *)"changedtick",
- VAR_NUMBER, numbuf);
- }
- else
+ arg = skipwhite(expr);
+ if (*arg == ']')
+ break;
+ else if (*arg == ';')
+ {
+ if (semicolon == 1)
{
- varp = find_var(arg, FALSE);
- if (varp == NULL)
- {
- /* Skip further arguments but do continue to
- * search for a trailing command. */
- EMSG2(_("E106: Unknown variable: \"%s\""), arg);
- error = TRUE;
- }
- else
- {
- name = vim_strchr(arg, ':');
- if (name != NULL)
- {
- /* "a:" vars have no name stored, use whole
- * arg */
- if (arg[0] == 'a' && arg[1] == ':')
- c2 = NUL;
- else
- {
- c2 = *++name;
- *name = NUL;
- }
- list_one_var(varp, arg);
- if (c2 != NUL)
- *name = c2;
- }
- else
- list_one_var(varp, (char_u *)"");
- }
+ EMSG(_("Double ; in :let"));
+ return;
}
-#ifdef FEAT_MAGIC_BRACES
- if (expr_start != NULL)
- vim_free(temp_string);
- else
-#endif
- *name_end = c1;
+ semicolon = 1;
+ }
+ else if (*arg != ',')
+ {
+ EMSG2(_(e_invarg2), arg);
+ return;
}
- arg = skipwhite(name_end);
+ }
+
+ /* check for '=' after the ']' */
+ expr = skipwhite(arg + 1);
+ if (*expr != '=')
+ {
+ EMSG(_(e_letunexp));
+ return;
}
}
- eap->nextcmd = check_nextcmd(arg);
- }
- else
- {
+
if (eap->skip)
++emsg_skip;
- i = eval0(expr + 1, &retvar, &eap->nextcmd, !eap->skip);
+ i = eval0(expr + 1, &rettv, &eap->nextcmd, !eap->skip);
if (eap->skip)
{
if (i != FAIL)
- clear_vartv(&retvar.tv);
+ clear_tv(&rettv);
--emsg_skip;
}
else if (i != FAIL)
{
- /*
- * ":let $VAR = expr": Set environment variable.
- */
- if (*arg == '$')
+ /* Move "arg" back to the variable name(s). */
+ arg = eap->arg;
+ if (*arg != '[')
{
- int len;
- int cc;
-
- /* Find the end of the name. */
- ++arg;
- name = arg;
- len = get_env_len(&arg);
- if (len == 0)
- EMSG2(_(e_invarg2), name - 1);
+ /* ":let var = expr" */
+ (void)ex_let_one(arg, &rettv, FALSE, (char_u *)"=");
+ }
+ else
+ {
+ /* ":let [v1, v2] = list" */
+ l = rettv.vval.v_list;
+ if (rettv.v_type != VAR_LIST || l == NULL)
+ EMSG(_("E999: List required"));
else
{
- if (*skipwhite(arg) != '=')
- EMSG(_(e_letunexp));
+ i = list_len(l);
+ if (semicolon == 0 && var_count < i)
+ EMSG(_("E999: Less targets than List items"));
+ else if (var_count - semicolon > i)
+ EMSG(_("E999: More targets than List items"));
else
{
- cc = name[len];
- name[len] = NUL;
- p = get_var_string(&retvar);
- vim_setenv(name, p);
- if (STRICMP(name, "HOME") == 0)
- init_homedir();
- else if (didset_vim && STRICMP(name, "VIM") == 0)
- didset_vim = FALSE;
- else if (didset_vimruntime
- && STRICMP(name, "VIMRUNTIME") == 0)
- didset_vimruntime = FALSE;
- name[len] = cc;
+ item = l->lv_first;
+ while (*arg != ']')
+ {
+ arg = skipwhite(arg + 1);
+ arg = ex_let_one(arg, &item->li_tv,
+ TRUE, (char_u *)",;]");
+ item = item->li_next;
+ if (arg == NULL)
+ break;
+
+ arg = skipwhite(arg);
+ if (*arg == ';')
+ {
+ /* Put the rest of the list (may be empty) in
+ * the var after ';'. */
+ l = list_alloc();
+ if (l == NULL)
+ break;
+ while (item != NULL)
+ {
+ list_append_tv(l, &item->li_tv);
+ item = item->li_next;
+ }
+ list_unref(rettv.vval.v_list);
+ rettv.vval.v_list = l;
+ l->lv_refcount = 1;
+ (void)ex_let_one(skipwhite(arg + 1), &rettv,
+ FALSE, (char_u *)"]");
+ break;
+ }
+ else if (*arg != ',' && *arg != ']')
+ {
+ EMSG2(_(e_intern2), "ex_let()");
+ break;
+ }
+ }
}
}
}
+ clear_tv(&rettv);
+ }
+ }
+}
- /*
- * ":let &option = expr": Set option value.
- * ":let &l:option = expr": Set local option value.
- * ":let &g:option = expr": Set global option value.
- */
- else if (*arg == '&')
- {
- int opt_flags;
+ static void
+list_all_vars()
+{
+ int i;
- /*
- * Find the end of the name;
- */
- p = find_option_end(&arg, &opt_flags);
- if (p == NULL || *skipwhite(p) != '=')
- EMSG(_(e_letunexp));
- else
+ /*
+ * List all variables.
+ */
+ for (i = 0; i < variables.ga_len && !got_int; ++i)
+ if (VAR_ENTRY(i).v_name != NULL)
+ list_one_var(&VAR_ENTRY(i), (char_u *)"");
+ for (i = 0; i < curbuf->b_vars.ga_len && !got_int; ++i)
+ if (BVAR_ENTRY(i).v_name != NULL)
+ list_one_var(&BVAR_ENTRY(i), (char_u *)"b:");
+ for (i = 0; i < curwin->w_vars.ga_len && !got_int; ++i)
+ if (WVAR_ENTRY(i).v_name != NULL)
+ list_one_var(&WVAR_ENTRY(i), (char_u *)"w:");
+ for (i = 0; i < VV_LEN && !got_int; ++i)
+ if (vimvars[i].type == VAR_NUMBER || vimvars[i].val != NULL)
+ list_vim_var(i);
+}
+
+/*
+ * List variables in "arg".
+ */
+ static char_u *
+list_arg_vars(eap, arg)
+ exarg_T *eap;
+ char_u *arg;
+{
+ int error = FALSE;
+ char_u *temp_string = NULL;
+ int arg_len;
+ char_u *expr_start;
+ char_u *expr_end;
+ char_u *name_end;
+ int c1 = 0, c2;
+ int i;
+ VAR varp;
+ char_u *name;
+
+ while (!ends_excmd(*arg) && !got_int)
+ {
+ /* Find the end of the name. */
+ name_end = find_name_end(arg, &expr_start, &expr_end, FALSE);
+
+ if (!vim_iswhite(*name_end) && !ends_excmd(*name_end))
+ {
+ emsg_severe = TRUE;
+ EMSG(_(e_trailing));
+ break;
+ }
+ if (!error && !eap->skip)
+ {
+ if (expr_start != NULL)
+ {
+ temp_string = make_expanded_name(arg, expr_start,
+ expr_end, name_end);
+ if (temp_string == NULL)
{
- c1 = *p;
- *p = NUL;
- set_option_value(arg, get_var_number(&retvar),
- get_var_string(&retvar), opt_flags);
- *p = c1; /* put back for error messages */
+ /*
+ * Report an invalid expression in braces, unless
+ * the expression evaluation has been cancelled due
+ * to an aborting error, an interrupt, or an
+ * exception.
+ */
+ if (!aborting())
+ {
+ emsg_severe = TRUE;
+ EMSG2(_(e_invarg2), arg);
+ break;
+ }
+ error = TRUE;
+ arg = skipwhite(name_end);
+ continue;
}
+ arg = temp_string;
+ arg_len = STRLEN(temp_string);
}
-
- /*
- * ":let @r = expr": Set register contents.
- */
- else if (*arg == '@')
+ else
{
- ++arg;
- if (*skipwhite(arg + 1) != '=')
- EMSG(_(e_letunexp));
- else
- write_reg_contents(*arg == '@' ? '"' : *arg,
- get_var_string(&retvar), -1, FALSE);
+ c1 = *name_end;
+ *name_end = NUL;
+ arg_len = (int)(name_end - arg);
}
+ i = find_vim_var(arg, arg_len);
+ if (i >= 0)
+ list_vim_var(i);
+ else if (STRCMP("b:changedtick", arg) == 0)
+ {
+ char_u numbuf[NUMBUFLEN];
- /*
- * ":let var = expr": Set internal variable.
- */
- else if (eval_isnamec(*arg) && !VIM_ISDIGIT(*arg))
+ sprintf((char *)numbuf, "%ld",
+ (long)curbuf->b_changedtick);
+ list_one_var_a((char_u *)"b:", (char_u *)"changedtick",
+ VAR_NUMBER, numbuf);
+ }
+ else
{
- /* Find the end of the name. */
- p = find_name_end(arg, &expr_start, &expr_end);
-
- if (*skipwhite(p) != '=')
- EMSG(_(e_letunexp));
- else if (p - arg == 13
- && STRNCMP(arg, "b:changedtick", 13) == 0)
- EMSG2(_(e_readonlyvar), arg);
-#ifdef FEAT_MAGIC_BRACES
- else if (expr_start != NULL)
+ varp = find_var(arg, FALSE);
+ if (varp == NULL)
{
- char_u *temp_string;
-
- temp_string = make_expanded_name(arg, expr_start,
- expr_end, p);
- if (temp_string == NULL)
- {
- /*
- * Report an invalid expression in braces, unless the
- * expression evaluation has been cancelled due to an
- * aborting error, an interrupt, or an exception.
- */
- if (!aborting())
- EMSG2(_(e_invarg2), arg);
- }
- else
- {
- set_var(temp_string, &retvar.tv, TRUE);
- vim_free(temp_string);
- }
+ /* Skip further arguments but do continue to
+ * search for a trailing command. */
+ EMSG2(_("E106: Unknown variable: \"%s\""), arg);
+ error = TRUE;
}
-#endif
else
{
- c1 = *p;
- *p = NUL;
- set_var(arg, &retvar.tv, TRUE);
- *p = c1; /* put char back for error messages */
+ name = vim_strchr(arg, ':');
+ if (name != NULL)
+ {
+ /* "a:" vars have no name stored, use whole arg */
+ if (arg[0] == 'a' && arg[1] == ':')
+ c2 = NUL;
+ else
+ {
+ c2 = *++name;
+ *name = NUL;
+ }
+ list_one_var(varp, arg);
+ if (c2 != NUL)
+ *name = c2;
+ }
+ else
+ list_one_var(varp, (char_u *)"");
}
}
+ if (expr_start != NULL)
+ vim_free(temp_string);
+ else
+ *name_end = c1;
+ }
+ arg = skipwhite(name_end);
+ }
+
+ return arg;
+}
+
+/*
+ * Set one item of ":let var = expr" or ":let [v1, v2] = list" to its value.
+ * Returns a pointer to the char just after the var name.
+ * Returns NULL if there is an error.
+ */
+ static char_u *
+ex_let_one(arg, tv, copy, endchars)
+ char_u *arg; /* points to variable name */
+ typeval *tv; /* value to assign to variable */
+ int copy; /* copy value from "tv" */
+ char_u *endchars; /* valid chars after variable name */
+{
+ int c1;
+ char_u *name;
+ char_u *p;
+ char_u *arg_end = NULL;
+ int len;
+ int opt_flags;
+ /*
+ * ":let $VAR = expr": Set environment variable.
+ */
+ if (*arg == '$')
+ {
+ /* Find the end of the name. */
+ ++arg;
+ name = arg;
+ len = get_env_len(&arg);
+ if (len == 0)
+ EMSG2(_(e_invarg2), name - 1);
+ else
+ {
+ if (vim_strchr(endchars, *skipwhite(arg)) == NULL)
+ EMSG(_(e_letunexp));
else
{
- EMSG2(_(e_invarg2), arg);
+ c1 = name[len];
+ name[len] = NUL;
+ p = get_tv_string(tv);
+ vim_setenv(name, p);
+ if (STRICMP(name, "HOME") == 0)
+ init_homedir();
+ else if (didset_vim && STRICMP(name, "VIM") == 0)
+ didset_vim = FALSE;
+ else if (didset_vimruntime && STRICMP(name, "VIMRUNTIME") == 0)
+ didset_vimruntime = FALSE;
+ name[len] = c1;
+ arg_end = arg;
}
+ }
+ }
- clear_vartv(&retvar.tv);
+ /*
+ * ":let &option = expr": Set option value.
+ * ":let &l:option = expr": Set local option value.
+ * ":let &g:option = expr": Set global option value.
+ */
+ else if (*arg == '&')
+ {
+ /* Find the end of the name. */
+ p = find_option_end(&arg, &opt_flags);
+ if (p == NULL || vim_strchr(endchars, *skipwhite(p)) == NULL)
+ EMSG(_(e_letunexp));
+ else
+ {
+ c1 = *p;
+ *p = NUL;
+ set_option_value(arg, get_tv_number(tv),
+ get_tv_string(tv), opt_flags);
+ *p = c1;
+ arg_end = p;
}
}
+
+ /*
+ * ":let @r = expr": Set register contents.
+ */
+ else if (*arg == '@')
+ {
+ ++arg;
+ if (vim_strchr(endchars, *skipwhite(arg + 1)) == NULL)
+ EMSG(_(e_letunexp));
+ else
+ {
+ write_reg_contents(*arg == '@' ? '"' : *arg,
+ get_tv_string(tv), -1, FALSE);
+ arg_end = arg + 1;
+ }
+ }
+
+ /*
+ * ":let var = expr": Set internal variable.
+ */
+ else if (eval_isnamec(*arg) && !VIM_ISDIGIT(*arg))
+ {
+ char_u *exp_name = NULL;
+ char_u *expr_start, *expr_end;
+
+ /* Find the end of the name. */
+ p = find_name_end(arg, &expr_start, &expr_end, FALSE);
+ if (expr_start != NULL)
+ {
+ exp_name = make_expanded_name(arg, expr_start, expr_end, p);
+ arg = exp_name;
+ }
+
+ if (arg == NULL)
+ {
+ /* Report an invalid expression in braces, unless the
+ * expression evaluation has been cancelled due to an
+ * aborting error, an interrupt, or an exception. */
+ if (!aborting())
+ EMSG2(_(e_invarg2), arg);
+ }
+ else if (*p == '[')
+ arg_end = set_var_idx(arg, p, tv, copy, endchars);
+ else if (vim_strchr(endchars, *skipwhite(p)) == NULL)
+ EMSG(_(e_letunexp));
+ else if (STRNCMP(arg, "b:changedtick", 13) == 0
+ && !eval_isnamec(arg[13]))
+ EMSG2(_(e_readonlyvar), arg);
+ else
+ {
+ c1 = *p;
+ *p = NUL;
+ set_var(arg, tv, copy);
+ *p = c1;
+ arg_end = p;
+ }
+
+ vim_free(exp_name);
+ }
+
+ else
+ EMSG2(_(e_invarg2), arg);
+
+ return arg_end;
+}
+
+/*
+ * Set a variable with an index: "name[expr]", "name[expr][expr]", etc.
+ * Only works if "name" is an existing List.
+ * "ip" points to the first '['.
+ * Returns a pointer to just after the last used ']'; NULL for error.
+ */
+ static char_u *
+set_var_idx(name, ip, rettv, copy, endchars)
+ char_u *name;
+ char_u *ip;
+ typeval *rettv;
+ int copy;
+ char_u *endchars;
+{
+ VAR v;
+ int c1;
+ char_u *p;
+ typeval var1;
+ typeval *tv;
+ long n;
+ listitem *item;
+
+ c1 = *ip;
+ *ip = NUL;
+ v = find_var(name, TRUE);
+ if (v == NULL)
+ EMSG2(_(e_undefvar), name);
+ *ip = c1;
+ if (v == NULL)
+ return NULL;
+
+ tv = &v->tv;
+ for (p = ip; *p == '['; p = skipwhite(p + 1))
+ {
+ if (tv->v_type != VAR_LIST || tv->vval.v_list == NULL)
+ {
+ EMSG(_("E999: Can only index a List"));
+ p = NULL;
+ break;
+ }
+ p = skipwhite(p + 1);
+ if (eval1(&p, &var1, TRUE) == FAIL) /* recursive! */
+ {
+ p = NULL;
+ break;
+ }
+ if (*p != ']')
+ {
+ EMSG(_(e_missbrac));
+ clear_tv(&var1);
+ p = NULL;
+ break;
+ }
+ n = get_tv_number(&var1);
+ clear_tv(&var1);
+ item = list_find(tv->vval.v_list, n);
+ if (item == NULL)
+ {
+ EMSGN(_(e_listidx), n);
+ p = NULL;
+ break;
+ }
+ tv = &item->li_tv;
+ }
+
+ if (p != NULL)
+ {
+ if (vim_strchr(endchars, *p) == NULL)
+ {
+ EMSG(_(e_letunexp));
+ p = NULL;
+ }
+ else
+ {
+ clear_tv(tv);
+ if (copy)
+ copy_tv(tv, rettv);
+ else
+ {
+ *tv = *rettv;
+ init_tv(rettv);
+ }
+ }
+ }
+ return p;
}
#if defined(FEAT_CMDL_COMPL) || defined(PROTO)
@@ -1405,7 +1623,7 @@ ex_call(eap)
char_u *startarg;
char_u *alias;
char_u *name;
- var retvar;
+ typeval rettv;
int len;
linenr_T lnum;
int doesrange;
@@ -1419,7 +1637,7 @@ ex_call(eap)
name = alias;
startarg = arg;
- retvar.tv.v_type = VAR_UNKNOWN; /* clear_vartv() uses this */
+ rettv.v_type = VAR_UNKNOWN; /* clear_tv() uses this */
if (*startarg != '(')
{
@@ -1448,18 +1666,18 @@ ex_call(eap)
curwin->w_cursor.col = 0;
}
arg = startarg;
- if (get_func_vartv(name, len, &retvar.tv, &arg,
+ if (get_func_tv(name, len, &rettv, &arg,
eap->line1, eap->line2, &doesrange, !eap->skip) == FAIL)
{
failed = TRUE;
break;
}
- clear_vartv(&retvar.tv);
+ clear_tv(&rettv);
if (doesrange || eap->skip)
break;
/* Stop when immediately aborting on error, or when an interrupt
* occurred or an exception was thrown but not caught.
- * get_func_vartv() returned OK, so that the check for trailing
+ * get_func_tv() returned OK, so that the check for trailing
* characters below is executed. */
if (aborting())
break;
@@ -1501,7 +1719,7 @@ ex_unlet(eap)
do
{
/* Find the end of the name. */
- name_end = find_name_end(arg, &expr_start, &expr_end);
+ name_end = find_name_end(arg, &expr_start, &expr_end, FALSE);
if (!vim_iswhite(*name_end) && !ends_excmd(*name_end))
{
@@ -1512,7 +1730,6 @@ ex_unlet(eap)
if (!error && !eap->skip)
{
-#ifdef FEAT_MAGIC_BRACES
if (expr_start != NULL)
{
char_u *temp_string;
@@ -1545,7 +1762,6 @@ ex_unlet(eap)
}
}
else
-#endif
{
cc = *name_end;
*name_end = NUL;
@@ -1722,19 +1938,20 @@ typedef enum
/*
* The "evaluate" argument: When FALSE, the argument is only parsed but not
- * executed. The function may return OK, but the retvar will be of type
+ * executed. The function may return OK, but the rettv will be of type
* VAR_UNKNOWN. The function still returns FAIL for a syntax error.
*/
/*
* Handle zero level expression.
* This calls eval1() and handles error message and nextcmd.
+ * Put the result in "rettv" when returning OK and "evaluate" is TRUE.
* Return OK or FAIL.
*/
static int
-eval0(arg, retvar, nextcmd, evaluate)
+eval0(arg, rettv, nextcmd, evaluate)
char_u *arg;
- VAR retvar;
+ typeval *rettv;
char_u **nextcmd;
int evaluate;
{
@@ -1742,11 +1959,11 @@ eval0(arg, retvar, nextcmd, evaluate)
char_u *p;
p = skipwhite(arg);
- ret = eval1(&p, &retvar->tv, evaluate);
+ ret = eval1(&p, rettv, evaluate);
if (ret == FAIL || !ends_excmd(*p))
{
if (ret != FAIL)
- clear_vartv(&retvar->tv);
+ clear_tv(rettv);
/*
* Report the invalid expression unless the expression evaluation has
* been cancelled due to an aborting error, an interrupt, or an
@@ -1772,9 +1989,9 @@ eval0(arg, retvar, nextcmd, evaluate)
* Return OK or FAIL.
*/
static int
-eval1(arg, retvar, evaluate)
+eval1(arg, rettv, evaluate)
char_u **arg;
- typeval *retvar;
+ typeval *rettv;
int evaluate;
{
int result;
@@ -1783,7 +2000,7 @@ eval1(arg, retvar, evaluate)
/*
* Get the first variable.
*/
- if (eval2(arg, retvar, evaluate) == FAIL)
+ if (eval2(arg, rettv, evaluate) == FAIL)
return FAIL;
if ((*arg)[0] == '?')
@@ -1791,16 +2008,16 @@ eval1(arg, retvar, evaluate)
result = FALSE;
if (evaluate)
{
- if (get_vartv_number(retvar) != 0)
+ if (get_tv_number(rettv) != 0)
result = TRUE;
- clear_vartv(retvar);
+ clear_tv(rettv);
}
/*
* Get the second variable.
*/
*arg = skipwhite(*arg + 1);
- if (eval1(arg, retvar, evaluate && result) == FAIL) /* recursive! */
+ if (eval1(arg, rettv, evaluate && result) == FAIL) /* recursive! */
return FAIL;
/*
@@ -1810,7 +2027,7 @@ eval1(arg, retvar, evaluate)
{
EMSG(_("E109: Missing ':' after '?'"));
if (evaluate && result)
- clear_vartv(retvar);
+ clear_tv(rettv);
return FAIL;
}
@@ -1821,11 +2038,11 @@ eval1(arg, retvar, evaluate)
if (eval1(arg, &var2, evaluate && !result) == FAIL) /* recursive! */
{
if (evaluate && result)
- clear_vartv(retvar);
+ clear_tv(rettv);
return FAIL;
}
if (evaluate && !result)
- *retvar = var2;
+ *rettv = var2;
}
return OK;
@@ -1841,9 +2058,9 @@ eval1(arg, retvar, evaluate)
* Return OK or FAIL.
*/
static int
-eval2(arg, retvar, evaluate)
+eval2(arg, rettv, evaluate)
char_u **arg;
- typeval *retvar;
+ typeval *rettv;
int evaluate;
{
typeval var2;
@@ -1853,7 +2070,7 @@ eval2(arg, retvar, evaluate)
/*
* Get the first variable.
*/
- if (eval3(arg, retvar, evaluate) == FAIL)
+ if (eval3(arg, rettv, evaluate) == FAIL)
return FAIL;
/*
@@ -1865,9 +2082,9 @@ eval2(arg, retvar, evaluate)
{
if (evaluate && first)
{
- if (get_vartv_number(retvar) != 0)
+ if (get_tv_number(rettv) != 0)
result = TRUE;
- clear_vartv(retvar);
+ clear_tv(rettv);
first = FALSE;
}
@@ -1883,14 +2100,14 @@ eval2(arg, retvar, evaluate)
*/
if (evaluate && !result)
{
- if (get_vartv_number(&var2) != 0)
+ if (get_tv_number(&var2) != 0)
result = TRUE;
- clear_vartv(&var2);
+ clear_tv(&var2);
}
if (evaluate)
{
- retvar->v_type = VAR_NUMBER;
- retvar->vval.v_number = result;
+ rettv->v_type = VAR_NUMBER;
+ rettv->vval.v_number = result;
}
}
@@ -1907,9 +2124,9 @@ eval2(arg, retvar, evaluate)
* Return OK or FAIL.
*/
static int
-eval3(arg, retvar, evaluate)
+eval3(arg, rettv, evaluate)
char_u **arg;
- typeval *retvar;
+ typeval *rettv;
int evaluate;
{
typeval var2;
@@ -1919,7 +2136,7 @@ eval3(arg, retvar, evaluate)
/*
* Get the first variable.
*/
- if (eval4(arg, retvar, evaluate) == FAIL)
+ if (eval4(arg, rettv, evaluate) == FAIL)
return FAIL;
/*
@@ -1931,9 +2148,9 @@ eval3(arg, retvar, evaluate)
{
if (evaluate && first)
{
- if (get_vartv_number(retvar) == 0)
+ if (get_tv_number(rettv) == 0)
result = FALSE;
- clear_vartv(retvar);
+ clear_tv(rettv);
first = FALSE;
}
@@ -1949,14 +2166,14 @@ eval3(arg, retvar, evaluate)
*/
if (evaluate && result)
{
- if (get_vartv_number(&var2) == 0)
+ if (get_tv_number(&var2) == 0)
result = FALSE;
- clear_vartv(&var2);
+ clear_tv(&var2);
}
if (evaluate)
{
- retvar->v_type = VAR_NUMBER;
- retvar->vval.v_number = result;
+ rettv->v_type = VAR_NUMBER;
+ rettv->vval.v_number = result;
}
}
@@ -1980,9 +2197,9 @@ eval3(arg, retvar, evaluate)
* Return OK or FAIL.
*/
static int
-eval4(arg, retvar, evaluate)
+eval4(arg, rettv, evaluate)
char_u **arg;
- typeval *retvar;
+ typeval *rettv;
int evaluate;
{
typeval var2;
@@ -2000,7 +2217,7 @@ eval4(arg, retvar, evaluate)
/*
* Get the first variable.
*/
- if (eval5(arg, retvar, evaluate) == FAIL)
+ if (eval5(arg, rettv, evaluate) == FAIL)
return FAIL;
p = *arg;
@@ -2061,7 +2278,7 @@ eval4(arg, retvar, evaluate)
*arg = skipwhite(p + len);
if (eval5(arg, &var2, evaluate) == FAIL)
{
- clear_vartv(retvar);
+ clear_tv(rettv);
return FAIL;
}
@@ -2071,11 +2288,11 @@ eval4(arg, retvar, evaluate)
* If one of the two variables is a number, compare as a number.
* When using "=~" or "!~", always compare as string.
*/
- if ((retvar->v_type == VAR_NUMBER || var2.v_type == VAR_NUMBER)
+ if ((rettv->v_type == VAR_NUMBER || var2.v_type == VAR_NUMBER)
&& type != TYPE_MATCH && type != TYPE_NOMATCH)
{
- n1 = get_vartv_number(retvar);
- n2 = get_vartv_number(&var2);
+ n1 = get_tv_number(rettv);
+ n2 = get_tv_number(&var2);
switch (type)
{
case TYPE_EQUAL: n1 = (n1 == n2); break;
@@ -2091,8 +2308,8 @@ eval4(arg, retvar, evaluate)
}
else
{
- s1 = get_vartv_string_buf(retvar, buf1);
- s2 = get_vartv_string_buf(&var2, buf2);
+ s1 = get_tv_string_buf(rettv, buf1);
+ s2 = get_tv_string_buf(&var2, buf2);
if (type != TYPE_MATCH && type != TYPE_NOMATCH)
i = ic ? MB_STRICMP(s1, s2) : STRCMP(s1, s2);
else
@@ -2128,10 +2345,10 @@ eval4(arg, retvar, evaluate)
case TYPE_UNKNOWN: break; /* avoid gcc warning */
}
}
- clear_vartv(retvar);
- clear_vartv(&var2);
- retvar->v_type = VAR_NUMBER;
- retvar->vval.v_number = n1;
+ clear_tv(rettv);
+ clear_tv(&var2);
+ rettv->v_type = VAR_NUMBER;
+ rettv->vval.v_number = n1;
}
}
@@ -2150,9 +2367,9 @@ eval4(arg, retvar, evaluate)
* Return OK or FAIL.
*/
static int
-eval5(arg, retvar, evaluate)
+eval5(arg, rettv, evaluate)
char_u **arg;
- typeval *retvar;
+ typeval *rettv;
int evaluate;
{
typeval var2;
@@ -2165,7 +2382,7 @@ eval5(arg, retvar, evaluate)
/*
* Get the first variable.
*/
- if (eval6(arg, retvar, evaluate) == FAIL)
+ if (eval6(arg, rettv, evaluate) == FAIL)
return FAIL;
/*
@@ -2183,7 +2400,7 @@ eval5(arg, retvar, evaluate)
*arg = skipwhite(*arg + 1);
if (eval6(arg, &var2, evaluate) == FAIL)
{
- clear_vartv(retvar);
+ clear_tv(rettv);
return FAIL;
}
@@ -2194,8 +2411,8 @@ eval5(arg, retvar, evaluate)
*/
if (op == '.')
{
- s1 = get_vartv_string_buf(retvar, buf1);
- s2 = get_vartv_string_buf(&var2, buf2);
+ s1 = get_tv_string_buf(rettv, buf1);
+ s2 = get_tv_string_buf(&var2, buf2);
op = (int)STRLEN(s1);
p = alloc((unsigned)(op + STRLEN(s2) + 1));
if (p != NULL)
@@ -2203,23 +2420,23 @@ eval5(arg, retvar, evaluate)
STRCPY(p, s1);
STRCPY(p + op, s2);
}
- clear_vartv(retvar);
- retvar->v_type = VAR_STRING;
- retvar->vval.v_string = p;
+ clear_tv(rettv);
+ rettv->v_type = VAR_STRING;
+ rettv->vval.v_string = p;
}
else
{
- n1 = get_vartv_number(retvar);
- n2 = get_vartv_number(&var2);
- clear_vartv(retvar);
+ n1 = get_tv_number(rettv);
+ n2 = get_tv_number(&var2);
+ clear_tv(rettv);
if (op == '+')
n1 = n1 + n2;
else
n1 = n1 - n2;
- retvar->v_type = VAR_NUMBER;
- retvar->vval.v_number = n1;
+ rettv->v_type = VAR_NUMBER;
+ rettv->vval.v_number = n1;
}
- clear_vartv(&var2);
+ clear_tv(&var2);
}
}
return OK;
@@ -2237,9 +2454,9 @@ eval5(arg, retvar, evaluate)
* Return OK or FAIL.
*/
static int
-eval6(arg, retvar, evaluate)
+eval6(arg, rettv, evaluate)
char_u **arg;
- typeval *retvar;
+ typeval *rettv;
int evaluate;
{
typeval var2;
@@ -2249,7 +2466,7 @@ eval6(arg, retvar, evaluate)
/*
* Get the first variable.
*/
- if (eval7(arg, retvar, evaluate) == FAIL)
+ if (eval7(arg, rettv, evaluate) == FAIL)
return FAIL;
/*
@@ -2263,8 +2480,8 @@ eval6(arg, retvar, evaluate)
if (evaluate)
{
- n1 = get_vartv_number(retvar);
- clear_vartv(retvar);
+ n1 = get_tv_number(rettv);
+ clear_tv(rettv);
}
else
n1 = 0;
@@ -2278,8 +2495,8 @@ eval6(arg, retvar, evaluate)
if (evaluate)
{
- n2 = get_vartv_number(&var2);
- clear_vartv(&var2);
+ n2 = get_tv_number(&var2);
+ clear_tv(&var2);
/*
* Compute the result.
@@ -2300,8 +2517,8 @@ eval6(arg, retvar, evaluate)
else
n1 = n1 % n2;
}
- retvar->v_type = VAR_NUMBER;
- retvar->vval.v_number = n1;
+ rettv->v_type = VAR_NUMBER;
+ rettv->vval.v_number = n1;
}
}
@@ -2332,9 +2549,9 @@ eval6(arg, retvar, evaluate)
* Return OK or FAIL.
*/
static int
-eval7(arg, retvar, evaluate)
+eval7(arg, rettv, evaluate)
char_u **arg;
- typeval *retvar;
+ typeval *rettv;
int evaluate;
{
long n;
@@ -2346,10 +2563,10 @@ eval7(arg, retvar, evaluate)
char_u *alias;
/*
- * Initialise variable so that clear_vartv() can't mistake this for a
+ * Initialise variable so that clear_tv() can't mistake this for a
* string and free a string that isn't there.
*/
- retvar->v_type = VAR_UNKNOWN;
+ rettv->v_type = VAR_UNKNOWN;
/*
* Skip '!' and '-' characters. They are handled later.
@@ -2378,39 +2595,39 @@ eval7(arg, retvar, evaluate)
*arg += len;
if (evaluate)
{
- retvar->v_type = VAR_NUMBER;
- retvar->vval.v_number = n;
+ rettv->v_type = VAR_NUMBER;
+ rettv->vval.v_number = n;
}
break;
/*
* String constant: "string".
*/
- case '"': ret = get_string_vartv(arg, retvar, evaluate);
+ case '"': ret = get_string_tv(arg, rettv, evaluate);
break;
/*
* Literal string constant: 'string'.
*/
- case '\'': ret = get_lit_string_vartv(arg, retvar, evaluate);
+ case '\'': ret = get_lit_string_tv(arg, rettv, evaluate);
break;
/*
* List: [expr, expr]
*/
- case '[': ret = get_list_vartv(arg, retvar, evaluate);
+ case '[': ret = get_list_tv(arg, rettv, evaluate);
break;
/*
* Option value: &name
*/
- case '&': ret = get_option_vartv(arg, retvar, evaluate);
+ case '&': ret = get_option_tv(arg, rettv, evaluate);
break;
/*
* Environment variable: $VAR.
*/
- case '$': ret = get_env_vartv(arg, retvar, evaluate);
+ case '$': ret = get_env_tv(arg, rettv, evaluate);
break;
/*
@@ -2419,8 +2636,8 @@ eval7(arg, retvar, evaluate)
case '@': ++*arg;
if (evaluate)
{
- retvar->v_type = VAR_STRING;
- retvar->vval.v_string = get_reg_contents(**arg, FALSE);
+ rettv->v_type = VAR_STRING;
+ rettv->vval.v_string = get_reg_contents(**arg, FALSE);
}
if (**arg != NUL)
++*arg;
@@ -2430,13 +2647,13 @@ eval7(arg, retvar, evaluate)
* nested expression: (expression).
*/
case '(': *arg = skipwhite(*arg + 1);
- ret = eval1(arg, retvar, evaluate); /* recursive! */
+ ret = eval1(arg, rettv, evaluate); /* recursive! */
if (**arg == ')')
++*arg;
else if (ret == OK)
{
EMSG(_("E110: Missing ')'"));
- clear_vartv(retvar);
+ clear_tv(rettv);
ret = FAIL;
}
break;
@@ -2460,7 +2677,7 @@ eval7(arg, retvar, evaluate)
s = deref_func_name(s, &len);
/* Invoke the function. */
- ret = get_func_vartv(s, len, retvar, arg,
+ ret = get_func_tv(s, len, rettv, arg,
curwin->w_cursor.lnum, curwin->w_cursor.lnum,
&len, evaluate);
/* Stop the expression evaluation when immediately
@@ -2469,12 +2686,12 @@ eval7(arg, retvar, evaluate)
if (aborting())
{
if (ret == OK)
- clear_vartv(retvar);
+ clear_tv(rettv);
ret = FAIL;
}
}
else if (evaluate)
- ret = get_var_vartv(s, len, retvar);
+ ret = get_var_tv(s, len, rettv);
}
if (alias != NULL)
@@ -2489,9 +2706,9 @@ eval7(arg, retvar, evaluate)
*/
while (**arg == '[' && ret == OK)
{
- if (eval_index(arg, retvar, evaluate) == FAIL)
+ if (eval_index(arg, rettv, evaluate) == FAIL)
{
- clear_vartv(retvar);
+ clear_tv(rettv);
return FAIL;
}
}
@@ -2501,7 +2718,7 @@ eval7(arg, retvar, evaluate)
*/
if (ret == OK && evaluate && end_leader > start_leader)
{
- val = get_vartv_number(retvar);
+ val = get_tv_number(rettv);
while (end_leader > start_leader)
{
--end_leader;
@@ -2510,9 +2727,9 @@ eval7(arg, retvar, evaluate)
else if (*end_leader == '-')
val = -val;
}
- clear_vartv(retvar);
- retvar->v_type = VAR_NUMBER;
- retvar->vval.v_number = val;
+ clear_tv(rettv);
+ rettv->v_type = VAR_NUMBER;
+ rettv->vval.v_number = val;
}
return ret;
@@ -2524,9 +2741,9 @@ eval7(arg, retvar, evaluate)
* Returns FAIL or OK. "*arg" is advanced to after the ']'.
*/
static int
-eval_index(arg, retvar, evaluate)
+eval_index(arg, rettv, evaluate)
char_u **arg;
- typeval *retvar;
+ typeval *rettv;
int evaluate;
{
int empty1 = FALSE, empty2 = FALSE;
@@ -2536,7 +2753,7 @@ eval_index(arg, retvar, evaluate)
int range;
char_u *s;
- if (retvar->v_type == VAR_FUNC)
+ if (rettv->v_type == VAR_FUNC)
{
EMSG(_("E999: Cannot index a Funcref"));
return FAIL;
@@ -2562,7 +2779,7 @@ eval_index(arg, retvar, evaluate)
empty2 = TRUE;
else if (eval1(arg, &var2, evaluate) == FAIL) /* recursive! */
{
- clear_vartv(&var1);
+ clear_tv(&var1);
return FAIL;
}
}
@@ -2572,10 +2789,10 @@ eval_index(arg, retvar, evaluate)
/* Check for the ']'. */
if (**arg != ']')
{
- EMSG(_("E111: Missing ']'"));
- clear_vartv(&var1);
+ EMSG(_(e_missbrac));
+ clear_tv(&var1);
if (range)
- clear_vartv(&var2);
+ clear_tv(&var2);
return FAIL;
}
@@ -2585,8 +2802,8 @@ eval_index(arg, retvar, evaluate)
n1 = 0;
else
{
- n1 = get_vartv_number(&var1);
- clear_vartv(&var1);
+ n1 = get_tv_number(&var1);
+ clear_tv(&var1);
}
if (range)
{
@@ -2594,16 +2811,16 @@ eval_index(arg, retvar, evaluate)
n2 = -1;
else
{
- n2 = get_vartv_number(&var2);
- clear_vartv(&var2);
+ n2 = get_tv_number(&var2);
+ clear_tv(&var2);
}
}
- switch (retvar->v_type)
+ switch (rettv->v_type)
{
case VAR_NUMBER:
case VAR_STRING:
- s = get_vartv_string(retvar);
+ s = get_tv_string(rettv);
len = (long)STRLEN(s);
if (range)
{
@@ -2634,13 +2851,13 @@ eval_index(arg, retvar, evaluate)
else
s = vim_strnsave(s + n1, 1);
}
- clear_vartv(retvar);
- retvar->v_type = VAR_STRING;
- retvar->vval.v_string = s;
+ clear_tv(rettv);
+ rettv->v_type = VAR_STRING;
+ rettv->vval.v_string = s;
break;
case VAR_LIST:
- len = list_len(retvar->vval.v_list);
+ len = list_len(rettv->vval.v_list);
if (n1 < 0)
n1 = len + n1;
if (!empty1 && (n1 < 0 || n1 >= len))
@@ -2663,7 +2880,7 @@ eval_index(arg, retvar, evaluate)
l = list_alloc();
if (l == NULL)
return FAIL;
- for (item = list_find(retvar->vval.v_list, n1);
+ for (item = list_find(rettv->vval.v_list, n1);
n1 <= n2; ++n1)
{
if (list_append_tv(l, &item->li_tv) == FAIL)
@@ -2673,16 +2890,16 @@ eval_index(arg, retvar, evaluate)
}
item = item->li_next;
}
- clear_vartv(retvar);
- retvar->v_type = VAR_LIST;
- retvar->vval.v_list = l;
+ clear_tv(rettv);
+ rettv->v_type = VAR_LIST;
+ rettv->vval.v_list = l;
}
else
{
- copy_vartv(&list_find(retvar->vval.v_list, n1)->li_tv,
+ copy_tv(&list_find(rettv->vval.v_list, n1)->li_tv,
&var1);
- clear_vartv(retvar);
- *retvar = var1;
+ clear_tv(rettv);
+ *rettv = var1;
}
break;
}
@@ -2699,9 +2916,9 @@ eval_index(arg, retvar, evaluate)
* Return OK or FAIL.
*/
static int
-get_option_vartv(arg, retvar, evaluate)
+get_option_tv(arg, rettv, evaluate)
char_u **arg;
- typeval *retvar; /* when NULL, only check if option exists */
+ typeval *rettv; /* when NULL, only check if option exists */
int evaluate;
{
char_u *option_end;
@@ -2719,7 +2936,7 @@ get_option_vartv(arg, retvar, evaluate)
option_end = find_option_end(arg, &opt_flags);
if (option_end == NULL)
{
- if (retvar != NULL)
+ if (rettv != NULL)
EMSG2(_("E112: Option name missing: %s"), *arg);
return FAIL;
}
@@ -2733,35 +2950,35 @@ get_option_vartv(arg, retvar, evaluate)
c = *option_end;
*option_end = NUL;
opt_type = get_option_value(*arg, &numval,
- retvar == NULL ? NULL : &stringval, opt_flags);
+ rettv == NULL ? NULL : &stringval, opt_flags);
if (opt_type == -3) /* invalid name */
{
- if (retvar != NULL)
+ if (rettv != NULL)
EMSG2(_("E113: Unknown option: %s"), *arg);
ret = FAIL;
}
- else if (retvar != NULL)
+ else if (rettv != NULL)
{
if (opt_type == -2) /* hidden string option */
{
- retvar->v_type = VAR_STRING;
- retvar->vval.v_string = NULL;
+ rettv->v_type = VAR_STRING;
+ rettv->vval.v_string = NULL;
}
else if (opt_type == -1) /* hidden number option */
{
- retvar->v_type = VAR_NUMBER;
- retvar->vval.v_number = 0;
+ rettv->v_type = VAR_NUMBER;
+ rettv->vval.v_number = 0;
}
else if (opt_type == 1) /* number option */
{
- retvar->v_type = VAR_NUMBER;
- retvar->vval.v_number = numval;
+ rettv->v_type = VAR_NUMBER;
+ rettv->vval.v_number = numval;
}
else /* string option */
{
- retvar->v_type = VAR_STRING;
- retvar->vval.v_string = stringval;
+ rettv->v_type = VAR_STRING;
+ rettv->vval.v_string = stringval;
}
}
else if (working && (opt_type == -2 || opt_type == -1))
@@ -2778,9 +2995,9 @@ get_option_vartv(arg, retvar, evaluate)
* Return OK or FAIL.
*/
static int
-get_string_vartv(arg, retvar, evaluate)
+get_string_tv(arg, rettv, evaluate)
char_u **arg;
- typeval *retvar;
+ typeval *rettv;
int evaluate;
{
char_u *p;
@@ -2923,8 +3140,8 @@ get_string_vartv(arg, retvar, evaluate)
name[i] = NUL;
*arg = p + 1;
- retvar->v_type = VAR_STRING;
- retvar->vval.v_string = name;
+ rettv->v_type = VAR_STRING;
+ rettv->vval.v_string = name;
return OK;
}
@@ -2934,9 +3151,9 @@ get_string_vartv(arg, retvar, evaluate)
* Return OK or FAIL.
*/
static int
-get_lit_string_vartv(arg, retvar, evaluate)
+get_lit_string_tv(arg, rettv, evaluate)
char_u **arg;
- typeval *retvar;
+ typeval *rettv;
int evaluate;
{
char_u *p;
@@ -2961,8 +3178,8 @@ get_lit_string_vartv(arg, retvar, evaluate)
if (name == NULL)
return FAIL;
- retvar->v_type = VAR_STRING;
- retvar->vval.v_string = name;
+ rettv->v_type = VAR_STRING;
+ rettv->vval.v_string = name;
}
*arg = p + 1;
@@ -2975,9 +3192,9 @@ get_lit_string_vartv(arg, retvar, evaluate)
* Return OK or FAIL.
*/
static int
-get_list_vartv(arg, retvar, evaluate)
+get_list_tv(arg, rettv, evaluate)
char_u **arg;
- typeval *retvar;
+ typeval *rettv;
int evaluate;
{
listvar *l = NULL;
@@ -3028,8 +3245,8 @@ failret:
*arg = skipwhite(*arg + 1);
if (evaluate)
{
- retvar->v_type = VAR_LIST;
- retvar->vval.v_list = l;
+ rettv->v_type = VAR_LIST;
+ rettv->vval.v_list = l;
++l->lv_refcount;
}
@@ -3092,7 +3309,7 @@ listitem_alloc()
listitem_free(item)
listitem *item;
{
- clear_vartv(&item->li_tv);
+ clear_tv(&item->li_tv);
vim_free(item);
}
@@ -3181,7 +3398,7 @@ list_append_tv(l, tv)
if (ni == NULL)
return FAIL;
- copy_vartv(tv, &ni->li_tv);
+ copy_tv(tv, &ni->li_tv);
list_append(l, ni);
return OK;
}
@@ -3230,7 +3447,7 @@ list_copy(orig, deep)
}
}
else
- copy_vartv(&item->li_tv, &ni->li_tv);
+ copy_tv(&item->li_tv, &ni->li_tv);
list_append(copy, ni);
}
++copy->lv_refcount;
@@ -3323,11 +3540,14 @@ tv2string(tv, tofree)
case VAR_LIST:
*tofree = list2string(tv);
return *tofree;
- default:
+ case VAR_STRING:
+ case VAR_NUMBER:
break;
+ default:
+ EMSG2(_(e_intern2), "tv2string()");
}
*tofree = NULL;
- return get_vartv_string(tv);
+ return get_tv_string(tv);
}
/*
@@ -3337,9 +3557,9 @@ tv2string(tv, tofree)
* Always return OK.
*/
static int
-get_env_vartv(arg, retvar, evaluate)
+get_env_tv(arg, rettv, evaluate)
char_u **arg;
- typeval *retvar;
+ typeval *rettv;
int evaluate;
{
char_u *string = NULL;
@@ -3372,8 +3592,8 @@ get_env_vartv(arg, retvar, evaluate)
}
name[len] = cc;
}
- retvar->v_type = VAR_STRING;
- retvar->vval.v_string = string;
+ rettv->v_type = VAR_STRING;
+ rettv->vval.v_string = string;
}
return OK;
@@ -3670,10 +3890,10 @@ deref_func_name(name, lenp)
* Return OK or FAIL.
*/
static int
-get_func_vartv(name, len, retvar, arg, firstline, lastline, doesrange, evaluate)
+get_func_tv(name, len, rettv, arg, firstline, lastline, doesrange, evaluate)
char_u *name; /* name of the function */
int len; /* length of "name" */
- typeval *retvar;
+ typeval *rettv;
char_u **arg; /* argument, pointing to the '(' */
linenr_T firstline; /* first line of range */
linenr_T lastline; /* last line of range */
@@ -3710,13 +3930,13 @@ get_func_vartv(name, len, retvar, arg, firstline, lastline, doesrange, evaluate)
ret = FAIL;
if (ret == OK)
- ret = call_func(name, len, retvar, argcount, argvars,
+ ret = call_func(name, len, rettv, argcount, argvars,
firstline, lastline, doesrange, evaluate);
else if (!aborting())
EMSG2(_("E116: Invalid arguments for function %s"), name);
while (--argcount >= 0)
- clear_vartv(&argvars[argcount]);
+ clear_tv(&argvars[argcount]);
*arg = skipwhite(argp);
return ret;
@@ -3728,11 +3948,11 @@ get_func_vartv(name, len, retvar, arg, firstline, lastline, doesrange, evaluate)
* Return OK or FAIL.
*/
static int
-call_func(name, len, retvar, argcount, argvars, firstline, lastline,
+call_func(name, len, rettv, argcount, argvars, firstline, lastline,
doesrange, evaluate)
char_u *name; /* name of the function */
int len; /* length of "name" */
- typeval *retvar; /* return value goes here */
+ typeval *rettv; /* return value goes here */
int argcount; /* number of "argvars" */
typeval *argvars; /* vars for arguments */
linenr_T firstline; /* first line of range */
@@ -3812,7 +4032,7 @@ call_func(name, len, retvar, argcount, argvars, firstline, lastline,
/* execute the function if no errors detected and executing */
if (evaluate && error == ERROR_NONE)
{
- retvar->v_type = VAR_NUMBER; /* default is number retvar */
+ rettv->v_type = VAR_NUMBER; /* default is number rettv */
error = ERROR_UNKNOWN;
if (!ASCII_ISLOWER(fname[0]))
@@ -3851,7 +4071,7 @@ call_func(name, len, retvar, argcount, argvars, firstline, lastline,
save_search_patterns();
saveRedobuff();
++fp->calls;
- call_user_func(fp, argcount, argvars, retvar,
+ call_user_func(fp, argcount, argvars, rettv,
firstline, lastline);
--fp->calls;
restoreRedobuff();
@@ -3875,7 +4095,7 @@ call_func(name, len, retvar, argcount, argvars, firstline, lastline,
else
{
argvars[argcount].v_type = VAR_UNKNOWN;
- functions[i].f_func(argvars, retvar);
+ functions[i].f_func(argvars, rettv);
error = ERROR_NONE;
}
}
@@ -3918,31 +4138,31 @@ call_func(name, len, retvar, argcount, argvars, firstline, lastline,
* or "append(list, item)" function
*/
static void
-f_append(argvars, retvar)
+f_append(argvars, rettv)
typeval *argvars;
- typeval *retvar;
+ typeval *rettv;
{
long lnum;
- retvar->vval.v_number = 1; /* Default: Failed */
+ rettv->vval.v_number = 1; /* Default: Failed */
if (argvars[0].v_type == VAR_LIST)
{
if (argvars[0].vval.v_list != NULL
&& list_append_tv(argvars[0].vval.v_list, &argvars[1]) == OK)
- copy_vartv(&argvars[0], retvar);
+ copy_tv(&argvars[0], rettv);
}
else
{
- lnum = get_vartv_lnum(argvars);
+ lnum = get_tv_lnum(argvars);
if (lnum >= 0
&& lnum <= curbuf->b_ml.ml_line_count
&& u_save(lnum, lnum + 1) == OK)
{
- ml_append(lnum, get_vartv_string(&argvars[1]), (colnr_T)0, FALSE);
+ ml_append(lnum, get_tv_string(&argvars[1]), (colnr_T)0, FALSE);
if (curwin->w_cursor.lnum > lnum)
++curwin->w_cursor.lnum;
appended_lines_mark(lnum, 1L);
- retvar->vval.v_number = 0;
+ rettv->vval.v_number = 0;
}
}
}
@@ -3952,11 +4172,11 @@ f_append(argvars, retvar)
*/
/* ARGSUSED */
static void
-f_argc(argvars, retvar)
+f_argc(argvars, rettv)
typeval *argvars;
- typeval *retvar;
+ typeval *rettv;
{
- retvar->vval.v_number = ARGCOUNT;
+ rettv->vval.v_number = ARGCOUNT;
}
/*
@@ -3964,29 +4184,29 @@ f_argc(argvars, retvar)
*/
/* ARGSUSED */
static void
-f_argidx(argvars, retvar)
+f_argidx(argvars, rettv)
typeval *argvars;
- typeval *retvar;
+ typeval *rettv;
{
- retvar->vval.v_number = curwin->w_arg_idx;
+ rettv->vval.v_number = curwin->w_arg_idx;
}
/*
* "argv(nr)" function
*/
static void
-f_argv(argvars, retvar)
+f_argv(argvars, rettv)
typeval *argvars;
- typeval *retvar;
+ typeval *rettv;
{
int idx;
- idx = get_vartv_number(&argvars[0]);
+ idx = get_tv_number(&argvars[0]);
if (idx >= 0 && idx < ARGCOUNT)
- retvar->vval.v_string = vim_strsave(alist_name(&ARGLIST[idx]));
+ rettv->vval.v_string = vim_strsave(alist_name(&ARGLIST[idx]));
else
- retvar->vval.v_string = NULL;
- retvar->v_type = VAR_STRING;
+ rettv->vval.v_string = NULL;
+ rettv->v_type = VAR_STRING;
}
/*
@@ -3994,9 +4214,9 @@ f_argv(argvars, retvar)
*/
/* ARGSUSED */
static void
-f_browse(argvars, retvar)
+f_browse(argvars, rettv)
typeval *argvars;
- typeval *retvar;
+ typeval *rettv;
{
#ifdef FEAT_BROWSE
int save;
@@ -4006,18 +4226,18 @@ f_browse(argvars, retvar)
char_u buf[NUMBUFLEN];
char_u buf2[NUMBUFLEN];
- save = get_vartv_number(&argvars[0]);
- title = get_vartv_string(&argvars[1]);
- initdir = get_vartv_string_buf(&argvars[2], buf);
- defname = get_vartv_string_buf(&argvars[3], buf2);
+ save = get_tv_number(&argvars[0]);
+ title = get_tv_string(&argvars[1]);
+ initdir = get_tv_string_buf(&argvars[2], buf);
+ defname = get_tv_string_buf(&argvars[3], buf2);
- retvar->vval.v_string =
+ rettv->vval.v_string =
do_browse(save ? BROWSE_SAVE : 0,
title, defname, NULL, initdir, NULL, curbuf);
#else
- retvar->vval.v_string = NULL;
+ rettv->vval.v_string = NULL;
#endif
- retvar->v_type = VAR_STRING;
+ rettv->v_type = VAR_STRING;
}
/*
@@ -4025,24 +4245,24 @@ f_browse(argvars, retvar)
*/
/* ARGSUSED */
static void
-f_browsedir(argvars, retvar)
+f_browsedir(argvars, rettv)
typeval *argvars;
- typeval *retvar;
+ typeval *rettv;
{
#ifdef FEAT_BROWSE
char_u *title;
char_u *initdir;
char_u buf[NUMBUFLEN];
- title = get_vartv_string(&argvars[0]);
- initdir = get_vartv_string_buf(&argvars[1], buf);
+ title = get_tv_string(&argvars[0]);
+ initdir = get_tv_string_buf(&argvars[1], buf);
- retvar->vval.v_string = do_browse(BROWSE_DIR,
+ rettv->vval.v_string = do_browse(BROWSE_DIR,
title, NULL, NULL, initdir, NULL, curbuf);
#else
- retvar->vval.v_string = NULL;
+ rettv->vval.v_string = NULL;
#endif
- retvar->v_type = VAR_STRING;
+ rettv->v_type = VAR_STRING;
}
/*
@@ -4081,55 +4301,55 @@ find_buffer(avar)
* "bufexists(expr)" function
*/
static void
-f_bufexists(argvars, retvar)
+f_bufexists(argvars, rettv)
typeval *argvars;
- typeval *retvar;
+ typeval *rettv;
{
- retvar->vval.v_number = (find_buffer(&argvars[0]) != NULL);
+ rettv->vval.v_number = (find_buffer(&argvars[0]) != NULL);
}
/*
* "buflisted(expr)" function
*/
static void
-f_buflisted(argvars, retvar)
+f_buflisted(argvars, rettv)
typeval *argvars;
- typeval *retvar;
+ typeval *rettv;
{
buf_T *buf;
buf = find_buffer(&argvars[0]);
- retvar->vval.v_number = (buf != NULL && buf->b_p_bl);
+ rettv->vval.v_number = (buf != NULL && buf->b_p_bl);
}
/*
* "bufloaded(expr)" function
*/
static void
-f_bufloaded(argvars, retvar)
+f_bufloaded(argvars, rettv)
typeval *argvars;
- typeval *retvar;
+ typeval *rettv;
{
buf_T *buf;
buf = find_buffer(&argvars[0]);
- retvar->vval.v_number = (buf != NULL && buf->b_ml.ml_mfp != NULL);
+ rettv->vval.v_number = (buf != NULL && buf->b_ml.ml_mfp != NULL);
}
/*
* Get buffer by number or pattern.
*/
static buf_T *
-get_buf_vartv(avar)
- typeval *avar;
+get_buf_tv(tv)
+ typeval *tv;
{
- char_u *name = avar->vval.v_string;
+ char_u *name = tv->vval.v_string;
int save_magic;
char_u *save_cpo;
buf_T *buf;
- if (avar->v_type == VAR_NUMBER)
- return buflist_findnr((int)avar->vval.v_number);
+ if (tv->v_type == VAR_NUMBER)
+ return buflist_findnr((int)tv->vval.v_number);
if (name == NULL || *name == NUL)
return curbuf;
if (name[0] == '$' && name[1] == NUL)
@@ -4149,7 +4369,7 @@ get_buf_vartv(avar)
/* If not found, try expanding the name, like done for bufexists(). */
if (buf == NULL)
- buf = find_buffer(avar);
+ buf = find_buffer(tv);
return buf;
}
@@ -4158,19 +4378,19 @@ get_buf_vartv(avar)
* "bufname(expr)" function
*/
static void
-f_bufname(argvars, retvar)
+f_bufname(argvars, rettv)
typeval *argvars;
- typeval *retvar;
+ typeval *rettv;
{
buf_T *buf;
++emsg_off;
- buf = get_buf_vartv(&argvars[0]);
- retvar->v_type = VAR_STRING;
+ buf = get_buf_tv(&argvars[0]);
+ rettv->v_type = VAR_STRING;
if (buf != NULL && buf->b_fname != NULL)
- retvar->vval.v_string = vim_strsave(buf->b_fname);
+ rettv->vval.v_string = vim_strsave(buf->b_fname);
else
- retvar->vval.v_string = NULL;
+ rettv->vval.v_string = NULL;
--emsg_off;
}
@@ -4178,18 +4398,18 @@ f_bufname(argvars, retvar)
* "bufnr(expr)" function
*/
static void
-f_bufnr(argvars, retvar)
+f_bufnr(argvars, rettv)
typeval *argvars;
- typeval *retvar;
+ typeval *rettv;
{
buf_T *buf;
++emsg_off;
- buf = get_buf_vartv(&argvars[0]);
+ buf = get_buf_tv(&argvars[0]);
if (buf != NULL)
- retvar->vval.v_number = buf->b_fnum;
+ rettv->vval.v_number = buf->b_fnum;
else
- retvar->vval.v_number = -1;
+ rettv->vval.v_number = -1;
--emsg_off;
}
@@ -4197,9 +4417,9 @@ f_bufnr(argvars, retvar)
* "bufwinnr(nr)" function
*/
static void
-f_bufwinnr(argvars, retvar)
+f_bufwinnr(argvars, rettv)
typeval *argvars;
- typeval *retvar;
+ typeval *rettv;
{
#ifdef FEAT_WINDOWS
win_T *wp;
@@ -4208,7 +4428,7 @@ f_bufwinnr(argvars, retvar)
buf_T *buf;
++emsg_off;
- buf = get_buf_vartv(&argvars[0]);
+ buf = get_buf_tv(&argvars[0]);
#ifdef FEAT_WINDOWS
for (wp = firstwin; wp; wp = wp->w_next)
{
@@ -4216,9 +4436,9 @@ f_bufwinnr(argvars, retvar)
if (wp->w_buffer == buf)
break;
}
- retvar->vval.v_number = (wp != NULL ? winnr : -1);
+ rettv->vval.v_number = (wp != NULL ? winnr : -1);
#else
- retvar->vval.v_number = (curwin->w_buffer == buf ? 1 : -1);
+ rettv->vval.v_number = (curwin->w_buffer == buf ? 1 : -1);
#endif
--emsg_off;
}
@@ -4228,20 +4448,20 @@ f_bufwinnr(argvars, retvar)
*/
/*ARGSUSED*/
static void
-f_byte2line(argvars, retvar)
+f_byte2line(argvars, rettv)
typeval *argvars;
- typeval *retvar;
+ typeval *rettv;
{
#ifndef FEAT_BYTEOFF
- retvar->vval.v_number = -1;
+ rettv->vval.v_number = -1;
#else
long boff = 0;
- boff = get_vartv_number(&argvars[0]) - 1;
+ boff = get_tv_number(&argvars[0]) - 1;
if (boff < 0)
- retvar->vval.v_number = -1;
+ rettv->vval.v_number = -1;
else
- retvar->vval.v_number = ml_find_line_or_offset(curbuf,
+ rettv->vval.v_number = ml_find_line_or_offset(curbuf,
(linenr_T)0, &boff);
#endif
}
@@ -4251,9 +4471,9 @@ f_byte2line(argvars, retvar)
*/
/*ARGSUSED*/
static void
-f_byteidx(argvars, retvar)
+f_byteidx(argvars, rettv)
typeval *argvars;
- typeval *retvar;
+ typeval *rettv;
{
#ifdef FEAT_MBYTE
char_u *t;
@@ -4261,9 +4481,9 @@ f_byteidx(argvars, retvar)
char_u *str;
long idx;
- str = get_vartv_string(&argvars[0]);
- idx = get_vartv_number(&argvars[1]);
- retvar->vval.v_number = -1;
+ str = get_tv_string(&argvars[0]);
+ idx = get_tv_number(&argvars[1]);
+ rettv->vval.v_number = -1;
if (idx < 0)
return;
@@ -4275,10 +4495,10 @@ f_byteidx(argvars, retvar)
return;
t += mb_ptr2len_check(t);
}
- retvar->vval.v_number = t - str;
+ rettv->vval.v_number = t - str;
#else
if (idx <= STRLEN(str))
- retvar->vval.v_number = idx;
+ rettv->vval.v_number = idx;
#endif
}
@@ -4286,51 +4506,51 @@ f_byteidx(argvars, retvar)
* "char2nr(string)" function
*/
static void
-f_char2nr(argvars, retvar)
+f_char2nr(argvars, rettv)
typeval *argvars;
- typeval *retvar;
+ typeval *rettv;
{
#ifdef FEAT_MBYTE
if (has_mbyte)
- retvar->vval.v_number =
- (*mb_ptr2char)(get_vartv_string(&argvars[0]));
+ rettv->vval.v_number =
+ (*mb_ptr2char)(get_tv_string(&argvars[0]));
else
#endif
- retvar->vval.v_number = get_vartv_string(&argvars[0])[0];
+ rettv->vval.v_number = get_tv_string(&argvars[0])[0];
}
/*
* "cindent(lnum)" function
*/
static void
-f_cindent(argvars, retvar)
+f_cindent(argvars, rettv)
typeval *argvars;
- typeval *retvar;
+ typeval *rettv;
{
#ifdef FEAT_CINDENT
pos_T pos;
linenr_T lnum;
pos = curwin->w_cursor;
- lnum = get_vartv_lnum(argvars);
+ lnum = get_tv_lnum(argvars);
if (lnum >= 1 && lnum <= curbuf->b_ml.ml_line_count)
{
curwin->w_cursor.lnum = lnum;
- retvar->vval.v_number = get_c_indent();
+ rettv->vval.v_number = get_c_indent();
curwin->w_cursor = pos;
}
else
#endif
- retvar->vval.v_number = -1;
+ rettv->vval.v_number = -1;
}
/*
* "col(string)" function
*/
static void
-f_col(argvars, retvar)
+f_col(argvars, rettv)
typeval *argvars;
- typeval *retvar;
+ typeval *rettv;
{
colnr_T col = 0;
pos_T *fp;
@@ -4373,7 +4593,7 @@ f_col(argvars, retvar)
#endif
}
}
- retvar->vval.v_number = col;
+ rettv->vval.v_number = col;
}
/*
@@ -4381,9 +4601,9 @@ f_col(argvars, retvar)
*/
/*ARGSUSED*/
static void
-f_confirm(argvars, retvar)
+f_confirm(argvars, rettv)
typeval *argvars;
- typeval *retvar;
+ typeval *rettv;
{
#if defined(FEAT_GUI_DIALOG) || defined(FEAT_CON_DIALOG)
char_u *message;
@@ -4394,17 +4614,17 @@ f_confirm(argvars, retvar)
int type = VIM_GENERIC;
int c;
- message = get_vartv_string(&argvars[0]);
+ message = get_tv_string(&argvars[0]);
if (argvars[1].v_type != VAR_UNKNOWN)
{
- buttons = get_vartv_string_buf(&argvars[1], buf);
+ buttons = get_tv_string_buf(&argvars[1], buf);
if (argvars[2].v_type != VAR_UNKNOWN)
{
- def = get_vartv_number(&argvars[2]);
+ def = get_tv_number(&argvars[2]);
if (argvars[3].v_type != VAR_UNKNOWN)
{
/* avoid that TOUPPER_ASC calls get_var_string_buf() twice */
- c = *get_vartv_string_buf(&argvars[3], buf2);
+ c = *get_tv_string_buf(&argvars[3], buf2);
switch (TOUPPER_ASC(c))
{
case 'E': type = VIM_ERROR; break;
@@ -4420,10 +4640,10 @@ f_confirm(argvars, retvar)
if (buttons == NULL || *buttons == NUL)
buttons = (char_u *)_("&Ok");
- retvar->vval.v_number = do_dialog(type, NULL, message, buttons,
+ rettv->vval.v_number = do_dialog(type, NULL, message, buttons,
def, NULL);
#else
- retvar->vval.v_number = 0;
+ rettv->vval.v_number = 0;
#endif
}
@@ -4431,17 +4651,17 @@ f_confirm(argvars, retvar)
* "copy()" function
*/
static void
-f_copy(argvars, retvar)
+f_copy(argvars, rettv)
typeval *argvars;
- typeval *retvar;
+ typeval *rettv;
{
if (argvars[0].v_type == VAR_LIST)
{
- retvar->v_type = VAR_LIST;
- retvar->vval.v_list = list_copy(argvars[0].vval.v_list, FALSE);
+ rettv->v_type = VAR_LIST;
+ rettv->vval.v_list = list_copy(argvars[0].vval.v_list, FALSE);
}
else
- copy_vartv(&argvars[0], retvar);
+ copy_tv(&argvars[0], rettv);
}
/*
@@ -4451,9 +4671,9 @@ f_copy(argvars, retvar)
*/
/*ARGSUSED*/
static void
-f_cscope_connection(argvars, retvar)
+f_cscope_connection(argvars, rettv)
typeval *argvars;
- typeval *retvar;
+ typeval *rettv;
{
#ifdef FEAT_CSCOPE
int num = 0;
@@ -4464,15 +4684,15 @@ f_cscope_connection(argvars, retvar)
if (argvars[0].v_type != VAR_UNKNOWN
&& argvars[1].v_type != VAR_UNKNOWN)
{
- num = (int)get_vartv_number(&argvars[0]);
- dbpath = get_vartv_string(&argvars[1]);
+ num = (int)get_tv_number(&argvars[0]);
+ dbpath = get_tv_string(&argvars[1]);
if (argvars[2].v_type != VAR_UNKNOWN)
- prepend = get_vartv_string_buf(&argvars[2], buf);
+ prepend = get_tv_string_buf(&argvars[2], buf);
}
- retvar->vval.v_number = cs_connection(num, dbpath, prepend);
+ rettv->vval.v_number = cs_connection(num, dbpath, prepend);
#else
- retvar->vval.v_number = 0;
+ rettv->vval.v_number = 0;
#endif
}
@@ -4483,16 +4703,16 @@ f_cscope_connection(argvars, retvar)
*/
/*ARGSUSED*/
static void
-f_cursor(argvars, retvar)
+f_cursor(argvars, rettv)
typeval *argvars;
- typeval *retvar;
+ typeval *rettv;
{
long line, col;
- line = get_vartv_lnum(argvars);
+ line = get_tv_lnum(argvars);
if (line > 0)
curwin->w_cursor.lnum = line;
- col = get_vartv_number(&argvars[1]);
+ col = get_tv_number(&argvars[1]);
if (col > 0)
curwin->w_cursor.col = col - 1;
#ifdef FEAT_VIRTUALEDIT
@@ -4514,31 +4734,31 @@ f_cursor(argvars, retvar)
* "deepcopy()" function
*/
static void
-f_deepcopy(argvars, retvar)
+f_deepcopy(argvars, rettv)
typeval *argvars;
- typeval *retvar;
+ typeval *rettv;
{
if (argvars[0].v_type == VAR_LIST)
{
- retvar->v_type = VAR_LIST;
- retvar->vval.v_list = list_copy(argvars[0].vval.v_list, TRUE);
+ rettv->v_type = VAR_LIST;
+ rettv->vval.v_list = list_copy(argvars[0].vval.v_list, TRUE);
}
else
- copy_vartv(&argvars[0], retvar);
+ copy_tv(&argvars[0], rettv);
}
/*
* "delete()" function
*/
static void
-f_delete(argvars, retvar)
+f_delete(argvars, rettv)
typeval *argvars;
- typeval *retvar;
+ typeval *rettv;
{
if (check_restricted() || check_secure())
- retvar->vval.v_number = -1;
+ rettv->vval.v_number = -1;
else
- retvar->vval.v_number = mch_remove(get_vartv_string(&argvars[0]));
+ rettv->vval.v_number = mch_remove(get_tv_string(&argvars[0]));
}
/*
@@ -4546,14 +4766,14 @@ f_delete(argvars, retvar)
*/
/*ARGSUSED*/
static void
-f_did_filetype(argvars, retvar)
+f_did_filetype(argvars, rettv)
typeval *argvars;
- typeval *retvar;
+ typeval *rettv;
{
#ifdef FEAT_AUTOCMD
- retvar->vval.v_number = did_filetype;
+ rettv->vval.v_number = did_filetype;
#else
- retvar->vval.v_number = 0;
+ rettv->vval.v_number = 0;
#endif
}
@@ -4562,12 +4782,12 @@ f_did_filetype(argvars, retvar)
*/
/*ARGSUSED*/
static void
-f_diff_filler(argvars, retvar)
+f_diff_filler(argvars, rettv)
typeval *argvars;
- typeval *retvar;
+ typeval *rettv;
{
#ifdef FEAT_DIFF
- retvar->vval.v_number = diff_check_fill(curwin, get_vartv_lnum(argvars));
+ rettv->vval.v_number = diff_check_fill(curwin, get_tv_lnum(argvars));
#endif
}
@@ -4576,12 +4796,12 @@ f_diff_filler(argvars, retvar)
*/
/*ARGSUSED*/
static void
-f_diff_hlID(argvars, retvar)
+f_diff_hlID(argvars, rettv)
typeval *argvars;
- typeval *retvar;
+ typeval *rettv;
{
#ifdef FEAT_DIFF
- linenr_T lnum = get_vartv_lnum(argvars);
+ linenr_T lnum = get_tv_lnum(argvars);
static linenr_T prev_lnum = 0;
static int changedtick = 0;
static int fnum = 0;
@@ -4620,13 +4840,13 @@ f_diff_hlID(argvars, retvar)
if (hlID == HLF_CHD || hlID == HLF_TXD)
{
- col = get_vartv_number(&argvars[1]) - 1;
+ col = get_tv_number(&argvars[1]) - 1;
if (col >= change_start && col <= change_end)
hlID = HLF_TXD; /* changed text */
else
hlID = HLF_CHD; /* changed line */
}
- retvar->vval.v_number = hlID == (enum hlf_value)0 ? 0 : (int)hlID;
+ rettv->vval.v_number = hlID == (enum hlf_value)0 ? 0 : (int)hlID;
#endif
}
@@ -4634,16 +4854,16 @@ f_diff_hlID(argvars, retvar)
* "escape({string}, {chars})" function
*/
static void
-f_escape(argvars, retvar)
+f_escape(argvars, rettv)
typeval *argvars;
- typeval *retvar;
+ typeval *rettv;
{
char_u buf[NUMBUFLEN];
- retvar->vval.v_string =
- vim_strsave_escaped(get_vartv_string(&argvars[0]),
- get_vartv_string_buf(&argvars[1], buf));
- retvar->v_type = VAR_STRING;
+ rettv->vval.v_string =
+ vim_strsave_escaped(get_tv_string(&argvars[0]),
+ get_tv_string_buf(&argvars[1], buf));
+ rettv->v_type = VAR_STRING;
}
/*
@@ -4651,38 +4871,38 @@ f_escape(argvars, retvar)
*/
/*ARGSUSED*/
static void
-f_eventhandler(argvars, retvar)
+f_eventhandler(argvars, rettv)
typeval *argvars;
- typeval *retvar;
+ typeval *rettv;
{
- retvar->vval.v_number = vgetc_busy;
+ rettv->vval.v_number = vgetc_busy;
}
/*
* "executable()" function
*/
static void
-f_executable(argvars, retvar)
+f_executable(argvars, rettv)
typeval *argvars;
- typeval *retvar;
+ typeval *rettv;
{
- retvar->vval.v_number = mch_can_exe(get_vartv_string(&argvars[0]));
+ rettv->vval.v_number = mch_can_exe(get_tv_string(&argvars[0]));
}
/*
* "exists()" function
*/
static void
-f_exists(argvars, retvar)
+f_exists(argvars, rettv)
typeval *argvars;
- typeval *retvar;
+ typeval *rettv;
{
char_u *p;
char_u *name;
int n = FALSE;
int len = 0;
- p = get_vartv_string(&argvars[0]);
+ p = get_tv_string(&argvars[0]);
if (*p == '$') /* environment variable */
{
/* first try "normal" environment variables (fast) */
@@ -4698,7 +4918,7 @@ f_exists(argvars, retvar)
}
}
else if (*p == '&' || *p == '+') /* option */
- n = (get_option_vartv(&p, NULL, TRUE) == OK);
+ n = (get_option_tv(&p, NULL, TRUE) == OK);
else if (*p == '*') /* internal or user defined function */
{
n = function_exists(p + 1);
@@ -4720,17 +4940,14 @@ f_exists(argvars, retvar)
}
else /* internal variable */
{
-#ifdef FEAT_MAGIC_BRACES
char_u *expr_start;
char_u *expr_end;
char_u *temp_string = NULL;
char_u *s;
-#endif
name = p;
-#ifdef FEAT_MAGIC_BRACES
/* Find the end of the name. */
- s = find_name_end(name, &expr_start, &expr_end);
+ s = find_name_end(name, &expr_start, &expr_end, FALSE);
if (expr_start != NULL)
{
temp_string = make_expanded_name(name, expr_start, expr_end, s);
@@ -4740,27 +4957,24 @@ f_exists(argvars, retvar)
name = temp_string;
}
}
-#endif
if (len == 0)
len = get_id_len(&p);
if (len != 0)
- n = (get_var_vartv(name, len, NULL) == OK);
+ n = (get_var_tv(name, len, NULL) == OK);
-#ifdef FEAT_MAGIC_BRACES
vim_free(temp_string);
-#endif
}
- retvar->vval.v_number = n;
+ rettv->vval.v_number = n;
}
/*
* "expand()" function
*/
static void
-f_expand(argvars, retvar)
+f_expand(argvars, rettv)
typeval *argvars;
- typeval *retvar;
+ typeval *rettv;
{
char_u *s;
int len;
@@ -4768,23 +4982,23 @@ f_expand(argvars, retvar)
int flags = WILD_SILENT|WILD_USE_NL|WILD_LIST_NOTFOUND;
expand_T xpc;
- retvar->v_type = VAR_STRING;
- s = get_vartv_string(&argvars[0]);
+ rettv->v_type = VAR_STRING;
+ s = get_tv_string(&argvars[0]);
if (*s == '%' || *s == '#' || *s == '<')
{
++emsg_off;
- retvar->vval.v_string = eval_vars(s, &len, NULL, &errormsg, s);
+ rettv->vval.v_string = eval_vars(s, &len, NULL, &errormsg, s);
--emsg_off;
}
else
{
/* When the optional second argument is non-zero, don't remove matches
* for 'suffixes' and 'wildignore' */
- if (argvars[1].v_type != VAR_UNKNOWN && get_vartv_number(&argvars[1]))
+ if (argvars[1].v_type != VAR_UNKNOWN && get_tv_number(&argvars[1]))
flags |= WILD_KEEP_ALL;
ExpandInit(&xpc);
xpc.xp_context = EXPAND_FILES;
- retvar->vval.v_string = ExpandOne(&xpc, s, NULL, flags, WILD_ALL);
+ rettv->vval.v_string = ExpandOne(&xpc, s, NULL, flags, WILD_ALL);
ExpandCleanup(&xpc);
}
}
@@ -4793,15 +5007,15 @@ f_expand(argvars, retvar)
* "filereadable()" function
*/
static void
-f_filereadable(argvars, retvar)
+f_filereadable(argvars, rettv)
typeval *argvars;
- typeval *retvar;
+ typeval *rettv;
{
FILE *fd;
char_u *p;
int n;
- p = get_vartv_string(&argvars[0]);
+ p = get_tv_string(&argvars[0]);
if (*p && !mch_isdir(p) && (fd = mch_fopen((char *)p, "r")) != NULL)
{
n = TRUE;
@@ -4810,7 +5024,7 @@ f_filereadable(argvars, retvar)
else
n = FALSE;
- retvar->vval.v_number = n;
+ rettv->vval.v_number = n;
}
/*
@@ -4818,9 +5032,9 @@ f_filereadable(argvars, retvar)
* rights to write into.
*/
static void
-f_filewritable(argvars, retvar)
+f_filewritable(argvars, rettv)
typeval *argvars;
- typeval *retvar;
+ typeval *rettv;
{
char_u *p;
int retval = 0;
@@ -4828,7 +5042,7 @@ f_filewritable(argvars, retvar)
int perm = 0;
#endif
- p = get_vartv_string(&argvars[0]);
+ p = get_tv_string(&argvars[0]);
#if defined(UNIX) || defined(VMS)
perm = mch_getperm(p);
#endif
@@ -4849,35 +5063,35 @@ f_filewritable(argvars, retvar)
if (mch_isdir(p))
++retval;
}
- retvar->vval.v_number = retval;
+ rettv->vval.v_number = retval;
}
/*
* "finddir({fname}[, {path}[, {count}]])" function
*/
static void
-f_finddir(argvars, retvar)
+f_finddir(argvars, rettv)
typeval *argvars;
- typeval *retvar;
+ typeval *rettv;
{
- f_findfilendir(argvars, retvar, TRUE);
+ f_findfilendir(argvars, rettv, TRUE);
}
/*
* "findfile({fname}[, {path}[, {count}]])" function
*/
static void
-f_findfile(argvars, retvar)
+f_findfile(argvars, rettv)
typeval *argvars;
- typeval *retvar;
+ typeval *rettv;
{
- f_findfilendir(argvars, retvar, FALSE);
+ f_findfilendir(argvars, rettv, FALSE);
}
static void
-f_findfilendir(argvars, retvar, dir)
+f_findfilendir(argvars, rettv, dir)
typeval *argvars;
- typeval *retvar;
+ typeval *rettv;
int dir;
{
#ifdef FEAT_SEARCHPATH
@@ -4889,16 +5103,16 @@ f_findfilendir(argvars, retvar, dir)
int count = 1;
int first = TRUE;
- fname = get_vartv_string(&argvars[0]);
+ fname = get_tv_string(&argvars[0]);
if (argvars[1].v_type != VAR_UNKNOWN)
{
- p = get_vartv_string_buf(&argvars[1], pathbuf);
+ p = get_tv_string_buf(&argvars[1], pathbuf);
if (*p != NUL)
path = p;
if (argvars[2].v_type != VAR_UNKNOWN)
- count = get_vartv_number(&argvars[2]);
+ count = get_tv_number(&argvars[2]);
}
do
@@ -4910,20 +5124,20 @@ f_findfilendir(argvars, retvar, dir)
first = FALSE;
} while (--count > 0 && fresult != NULL);
- retvar->vval.v_string = fresult;
+ rettv->vval.v_string = fresult;
#else
- retvar->vval.v_string = NULL;
+ rettv->vval.v_string = NULL;
#endif
- retvar->v_type = VAR_STRING;
+ rettv->v_type = VAR_STRING;
}
/*
* "fnamemodify({fname}, {mods})" function
*/
static void
-f_fnamemodify(argvars, retvar)
+f_fnamemodify(argvars, rettv)
typeval *argvars;
- typeval *retvar;
+ typeval *rettv;
{
char_u *fname;
char_u *mods;
@@ -4932,17 +5146,17 @@ f_fnamemodify(argvars, retvar)
char_u *fbuf = NULL;
char_u buf[NUMBUFLEN];
- fname = get_vartv_string(&argvars[0]);
- mods = get_vartv_string_buf(&argvars[1], buf);
+ fname = get_tv_string(&argvars[0]);
+ mods = get_tv_string_buf(&argvars[1], buf);
len = (int)STRLEN(fname);
(void)modify_fname(mods, &usedlen, &fname, &fbuf, &len);
- retvar->v_type = VAR_STRING;
+ rettv->v_type = VAR_STRING;
if (fname == NULL)
- retvar->vval.v_string = NULL;
+ rettv->vval.v_string = NULL;
else
- retvar->vval.v_string = vim_strnsave(fname, len);
+ rettv->vval.v_string = vim_strnsave(fname, len);
vim_free(fbuf);
}
@@ -4950,70 +5164,70 @@ f_fnamemodify(argvars, retvar)
* "foldclosed()" function
*/
static void
-f_foldclosed(argvars, retvar)
+f_foldclosed(argvars, rettv)
typeval *argvars;
- typeval *retvar;
+ typeval *rettv;
{
- foldclosed_both(argvars, retvar, FALSE);
+ foldclosed_both(argvars, rettv, FALSE);
}
/*
* "foldclosedend()" function
*/
static void
-f_foldclosedend(argvars, retvar)
+f_foldclosedend(argvars, rettv)
typeval *argvars;
- typeval *retvar;
+ typeval *rettv;
{
- foldclosed_both(argvars, retvar, TRUE);
+ foldclosed_both(argvars, rettv, TRUE);
}
/*
* "foldclosed()" function
*/
static void
-foldclosed_both(argvars, retvar, end)
+foldclosed_both(argvars, rettv, end)
typeval *argvars;
- typeval *retvar;
+ typeval *rettv;
int end;
{
#ifdef FEAT_FOLDING
linenr_T lnum;
linenr_T first, last;
- lnum = get_vartv_lnum(argvars);
+ lnum = get_tv_lnum(argvars);
if (lnum >= 1 && lnum <= curbuf->b_ml.ml_line_count)
{
if (hasFoldingWin(curwin, lnum, &first, &last, FALSE, NULL))
{
if (end)
- retvar->vval.v_number = (varnumber_T)last;
+ rettv->vval.v_number = (varnumber_T)last;
else
- retvar->vval.v_number = (varnumber_T)first;
+ rettv->vval.v_number = (varnumber_T)first;
return;
}
}
#endif
- retvar->vval.v_number = -1;
+ rettv->vval.v_number = -1;
}
/*
* "foldlevel()" function
*/
static void
-f_foldlevel(argvars, retvar)
+f_foldlevel(argvars, rettv)
typeval *argvars;
- typeval *retvar;
+ typeval *rettv;
{
#ifdef FEAT_FOLDING
linenr_T lnum;
- lnum = get_vartv_lnum(argvars);
+ lnum = get_tv_lnum(argvars);
if (lnum >= 1 && lnum <= curbuf->b_ml.ml_line_count)
- retvar->vval.v_number = foldLevel(lnum);
+ rettv->vval.v_number = foldLevel(lnum);
else
#endif
- retvar->vval.v_number = 0;
+ rettv->vval.v_number = 0;
}
/*
@@ -5021,9 +5235,9 @@ f_foldlevel(argvars, retvar)
*/
/*ARGSUSED*/
static void
-f_foldtext(argvars, retvar)
+f_foldtext(argvars, rettv)
typeval *argvars;
- typeval *retvar;
+ typeval *rettv;
{
#ifdef FEAT_FOLDING
linenr_T lnum;
@@ -5033,8 +5247,8 @@ f_foldtext(argvars, retvar)
char *txt;
#endif
- retvar->v_type = VAR_STRING;
- retvar->vval.v_string = NULL;
+ rettv->v_type = VAR_STRING;
+ rettv->vval.v_string = NULL;
#ifdef FEAT_FOLDING
if ((linenr_T)vimvars[VV_FOLDSTART].val > 0
&& (linenr_T)vimvars[VV_FOLDEND].val <= curbuf->b_ml.ml_line_count
@@ -5077,7 +5291,7 @@ f_foldtext(argvars, retvar)
STRCAT(r, s);
/* remove 'foldmarker' and 'commentstring' */
foldtext_cleanup(r + len);
- retvar->vval.v_string = r;
+ rettv->vval.v_string = r;
}
}
#endif
@@ -5088,9 +5302,9 @@ f_foldtext(argvars, retvar)
*/
/*ARGSUSED*/
static void
-f_foldtextresult(argvars, retvar)
+f_foldtextresult(argvars, rettv)
typeval *argvars;
- typeval *retvar;
+ typeval *rettv;
{
#ifdef FEAT_FOLDING
linenr_T lnum;
@@ -5100,10 +5314,10 @@ f_foldtextresult(argvars, retvar)
int fold_count;
#endif
- retvar->v_type = VAR_STRING;
- retvar->vval.v_string = NULL;
+ rettv->v_type = VAR_STRING;
+ rettv->vval.v_string = NULL;
#ifdef FEAT_FOLDING
- lnum = get_vartv_lnum(argvars);
+ lnum = get_tv_lnum(argvars);
fold_count = foldedCount(curwin, lnum, &foldinfo);
if (fold_count > 0)
{
@@ -5111,7 +5325,7 @@ f_foldtextresult(argvars, retvar)
&foldinfo, buf);
if (text == buf)
text = vim_strsave(text);
- retvar->vval.v_string = text;
+ rettv->vval.v_string = text;
}
#endif
}
@@ -5121,11 +5335,11 @@ f_foldtextresult(argvars, retvar)
*/
/*ARGSUSED*/
static void
-f_foreground(argvars, retvar)
+f_foreground(argvars, rettv)
typeval *argvars;
- typeval *retvar;
+ typeval *rettv;
{
- retvar->vval.v_number = 0;
+ rettv->vval.v_number = 0;
#ifdef FEAT_GUI
if (gui.in_use)
gui_mch_set_foreground();
@@ -5141,21 +5355,21 @@ f_foreground(argvars, retvar)
*/
/*ARGSUSED*/
static void
-f_function(argvars, retvar)
+f_function(argvars, rettv)
typeval *argvars;
- typeval *retvar;
+ typeval *rettv;
{
char_u *s;
- s = get_vartv_string(&argvars[0]);
+ s = get_tv_string(&argvars[0]);
if (s == NULL || *s == NUL || isdigit(*s))
EMSG2(_(e_invarg2), s);
else if (!function_exists(s))
EMSG2(_("E999: Unknown function: %s"), s);
else
{
- retvar->vval.v_string = vim_strsave(s);
- retvar->v_type = VAR_FUNC;
+ rettv->vval.v_string = vim_strsave(s);
+ rettv->v_type = VAR_FUNC;
}
}
@@ -5163,9 +5377,9 @@ f_function(argvars, retvar)
* "getchar()" function
*/
static void
-f_getchar(argvars, retvar)
+f_getchar(argvars, rettv)
typeval *argvars;
- typeval *retvar;
+ typeval *rettv;
{
varnumber_T n;
@@ -5174,7 +5388,7 @@ f_getchar(argvars, retvar)
if (argvars[0].v_type == VAR_UNKNOWN)
/* getchar(): blocking wait. */
n = safe_vgetc();
- else if (get_vartv_number(&argvars[0]) == 1)
+ else if (get_tv_number(&argvars[0]) == 1)
/* getchar(1): only check if char avail */
n = vpeekc();
else if (vpeekc() == NUL)
@@ -5186,7 +5400,7 @@ f_getchar(argvars, retvar)
--no_mapping;
--allow_keys;
- retvar->vval.v_number = n;
+ rettv->vval.v_number = n;
if (IS_SPECIAL(n) || mod_mask != 0)
{
char_u temp[10]; /* modifier: 3, mbyte-char: 6, NUL: 1 */
@@ -5212,8 +5426,8 @@ f_getchar(argvars, retvar)
else
temp[i++] = n;
temp[i++] = NUL;
- retvar->v_type = VAR_STRING;
- retvar->vval.v_string = vim_strsave(temp);
+ rettv->v_type = VAR_STRING;
+ rettv->vval.v_string = vim_strsave(temp);
}
}
@@ -5222,11 +5436,11 @@ f_getchar(argvars, retvar)
*/
/*ARGSUSED*/
static void
-f_getcharmod(argvars, retvar)
+f_getcharmod(argvars, rettv)
typeval *argvars;
- typeval *retvar;
+ typeval *rettv;
{
- retvar->vval.v_number = mod_mask;
+ rettv->vval.v_number = mod_mask;
}
/*
@@ -5234,12 +5448,12 @@ f_getcharmod(argvars, retvar)
*/
/*ARGSUSED*/
static void
-f_getcmdline(argvars, retvar)
+f_getcmdline(argvars, rettv)
typeval *argvars;
- typeval *retvar;
+ typeval *rettv;
{
- retvar->v_type = VAR_STRING;
- retvar->vval.v_string = get_cmdline_str();
+ rettv->v_type = VAR_STRING;
+ rettv->vval.v_string = get_cmdline_str();
}
/*
@@ -5247,20 +5461,20 @@ f_getcmdline(argvars, retvar)
*/
/*ARGSUSED*/
static void
-f_getcmdpos(argvars, retvar)
+f_getcmdpos(argvars, rettv)
typeval *argvars;
- typeval *retvar;
+ typeval *rettv;
{
- retvar->vval.v_number = get_cmdline_pos() + 1;
+ rettv->vval.v_number = get_cmdline_pos() + 1;
}
/*
* "getbufvar()" function
*/
static void
-f_getbufvar(argvars, retvar)
+f_getbufvar(argvars, rettv)
typeval *argvars;
- typeval *retvar;
+ typeval *rettv;
{
buf_T *buf;
buf_T *save_curbuf;
@@ -5268,11 +5482,11 @@ f_getbufvar(argvars, retvar)
VAR v;
++emsg_off;
- buf = get_buf_vartv(&argvars[0]);
- varname = get_vartv_string(&argvars[1]);
+ buf = get_buf_tv(&argvars[0]);
+ varname = get_tv_string(&argvars[1]);
- retvar->v_type = VAR_STRING;
- retvar->vval.v_string = NULL;
+ rettv->v_type = VAR_STRING;
+ rettv->vval.v_string = NULL;
if (buf != NULL && varname != NULL)
{
@@ -5282,7 +5496,7 @@ f_getbufvar(argvars, retvar)
save_curbuf = curbuf;
curbuf = buf;
- get_option_vartv(&varname, retvar, TRUE);
+ get_option_tv(&varname, rettv, TRUE);
/* restore previous notion of curbuf */
curbuf = save_curbuf;
@@ -5292,7 +5506,7 @@ f_getbufvar(argvars, retvar)
/* look up the variable */
v = find_var_in_ga(&buf->b_vars, varname);
if (v != NULL)
- copy_vartv(&v->tv, retvar);
+ copy_tv(&v->tv, rettv);
}
}
@@ -5304,20 +5518,20 @@ f_getbufvar(argvars, retvar)
*/
/*ARGSUSED*/
static void
-f_getcwd(argvars, retvar)
+f_getcwd(argvars, rettv)
typeval *argvars;
- typeval *retvar;
+ typeval *rettv;
{
char_u cwd[MAXPATHL];
- retvar->v_type = VAR_STRING;
+ rettv->v_type = VAR_STRING;
if (mch_dirname(cwd, MAXPATHL) == FAIL)
- retvar->vval.v_string = NULL;
+ rettv->vval.v_string = NULL;
else
{
- retvar->vval.v_string = vim_strsave(cwd);
+ rettv->vval.v_string = vim_strsave(cwd);
#ifdef BACKSLASH_IN_FILENAME
- slash_adjust(retvar->vval.v_string);
+ slash_adjust(rettv->vval.v_string);
#endif
}
}
@@ -5327,12 +5541,12 @@ f_getcwd(argvars, retvar)
*/
/*ARGSUSED*/
static void
-f_getfontname(argvars, retvar)
+f_getfontname(argvars, rettv)
typeval *argvars;
- typeval *retvar;
+ typeval *rettv;
{
- retvar->v_type = VAR_STRING;
- retvar->vval.v_string = NULL;
+ rettv->v_type = VAR_STRING;
+ rettv->vval.v_string = NULL;
#ifdef FEAT_GUI
if (gui.in_use)
{
@@ -5348,14 +5562,14 @@ f_getfontname(argvars, retvar)
}
else
{
- name = get_vartv_string(&argvars[0]);
+ name = get_tv_string(&argvars[0]);
if (STRCMP(name, "*") == 0) /* don't use font dialog */
return;
font = gui_mch_get_font(name, FALSE);
if (font == NOFONT)
return; /* Invalid font name, return empty string. */
}
- retvar->vval.v_string = gui_mch_get_fontname(font, name);
+ rettv->vval.v_string = gui_mch_get_fontname(font, name);
if (argvars[0].v_type != VAR_UNKNOWN)
gui_mch_free_font(font);
}
@@ -5366,9 +5580,9 @@ f_getfontname(argvars, retvar)
* "getfperm({fname})" function
*/
static void
-f_getfperm(argvars, retvar)
+f_getfperm(argvars, rettv)
typeval *argvars;
- typeval *retvar;
+ typeval *rettv;
{
char_u *fname;
struct stat st;
@@ -5376,9 +5590,9 @@ f_getfperm(argvars, retvar)
char_u flags[] = "rwx";
int i;
- fname = get_vartv_string(&argvars[0]);
+ fname = get_tv_string(&argvars[0]);
- retvar->v_type = VAR_STRING;
+ rettv->v_type = VAR_STRING;
if (mch_stat((char *)fname, &st) >= 0)
{
perm = vim_strsave((char_u *)"---------");
@@ -5391,70 +5605,70 @@ f_getfperm(argvars, retvar)
}
}
}
- retvar->vval.v_string = perm;
+ rettv->vval.v_string = perm;
}
/*
* "getfsize({fname})" function
*/
static void
-f_getfsize(argvars, retvar)
+f_getfsize(argvars, rettv)
typeval *argvars;
- typeval *retvar;
+ typeval *rettv;
{
char_u *fname;
struct stat st;
- fname = get_vartv_string(&argvars[0]);
+ fname = get_tv_string(&argvars[0]);
- retvar->v_type = VAR_NUMBER;
+ rettv->v_type = VAR_NUMBER;
if (mch_stat((char *)fname, &st) >= 0)
{
if (mch_isdir(fname))
- retvar->vval.v_number = 0;
+ rettv->vval.v_number = 0;
else
- retvar->vval.v_number = (varnumber_T)st.st_size;
+ rettv->vval.v_number = (varnumber_T)st.st_size;
}
else
- retvar->vval.v_number = -1;
+ rettv->vval.v_number = -1;
}
/*
* "getftime({fname})" function
*/
static void
-f_getftime(argvars, retvar)
+f_getftime(argvars, rettv)
typeval *argvars;
- typeval *retvar;
+ typeval *rettv;
{
char_u *fname;
struct stat st;
- fname = get_vartv_string(&argvars[0]);
+ fname = get_tv_string(&argvars[0]);
if (mch_stat((char *)fname, &st) >= 0)
- retvar->vval.v_number = (varnumber_T)st.st_mtime;
+ rettv->vval.v_number = (varnumber_T)st.st_mtime;
else
- retvar->vval.v_number = -1;
+ rettv->vval.v_number = -1;
}
/*
* "getftype({fname})" function
*/
static void
-f_getftype(argvars, retvar)
+f_getftype(argvars, rettv)
typeval *argvars;
- typeval *retvar;
+ typeval *rettv;
{
char_u *fname;
struct stat st;
char_u *type = NULL;
char *t;
- fname = get_vartv_string(&argvars[0]);
+ fname = get_tv_string(&argvars[0]);
- retvar->v_type = VAR_STRING;
+ rettv->v_type = VAR_STRING;
if (mch_lstat((char *)fname, &st) >= 0)
{
#ifdef S_ISREG
@@ -5516,39 +5730,39 @@ f_getftype(argvars, retvar)
#endif
type = vim_strsave((char_u *)t);
}
- retvar->vval.v_string = type;
+ rettv->vval.v_string = type;
}
/*
* "getreg()" function
*/
static void
-f_getreg(argvars, retvar)
+f_getreg(argvars, rettv)
typeval *argvars;
- typeval *retvar;
+ typeval *rettv;
{
char_u *strregname;
int regname;
if (argvars[0].v_type != VAR_UNKNOWN)
- strregname = get_vartv_string(&argvars[0]);
+ strregname = get_tv_string(&argvars[0]);
else
strregname = vimvars[VV_REG].val;
regname = (strregname == NULL ? '"' : *strregname);
if (regname == 0)
regname = '"';
- retvar->v_type = VAR_STRING;
- retvar->vval.v_string = get_reg_contents(regname, TRUE);
+ rettv->v_type = VAR_STRING;
+ rettv->vval.v_string = get_reg_contents(regname, TRUE);
}
/*
* "getregtype()" function
*/
static void
-f_getregtype(argvars, retvar)
+f_getregtype(argvars, rettv)
typeval *argvars;
- typeval *retvar;
+ typeval *rettv;
{
char_u *strregname;
int regname;
@@ -5556,7 +5770,7 @@ f_getregtype(argvars, retvar)
long reglen = 0;
if (argvars[0].v_type != VAR_UNKNOWN)
- strregname = get_vartv_string(&argvars[0]);
+ strregname = get_tv_string(&argvars[0]);
else
/* Default to v:register */
strregname = vimvars[VV_REG].val;
@@ -5578,30 +5792,30 @@ f_getregtype(argvars, retvar)
break;
#endif
}
- retvar->v_type = VAR_STRING;
- retvar->vval.v_string = vim_strsave(buf);
+ rettv->v_type = VAR_STRING;
+ rettv->vval.v_string = vim_strsave(buf);
}
/*
* "getline(lnum)" function
*/
static void
-f_getline(argvars, retvar)
+f_getline(argvars, rettv)
typeval *argvars;
- typeval *retvar;
+ typeval *rettv;
{
linenr_T lnum;
char_u *p;
- lnum = get_vartv_lnum(argvars);
+ lnum = get_tv_lnum(argvars);
if (lnum >= 1 && lnum <= curbuf->b_ml.ml_line_count)
p = ml_get(lnum);
else
p = (char_u *)"";
- retvar->v_type = VAR_STRING;
- retvar->vval.v_string = vim_strsave(p);
+ rettv->v_type = VAR_STRING;
+ rettv->vval.v_string = vim_strsave(p);
}
/*
@@ -5609,18 +5823,18 @@ f_getline(argvars, retvar)
*/
/*ARGSUSED*/
static void
-f_getwinposx(argvars, retvar)
+f_getwinposx(argvars, rettv)
typeval *argvars;
- typeval *retvar;
+ typeval *rettv;
{
- retvar->vval.v_number = -1;
+ rettv->vval.v_number = -1;
#ifdef FEAT_GUI
if (gui.in_use)
{
int x, y;
if (gui_mch_get_winpos(&x, &y) == OK)
- retvar->vval.v_number = x;
+ rettv->vval.v_number = x;
}
#endif
}
@@ -5630,18 +5844,18 @@ f_getwinposx(argvars, retvar)
*/
/*ARGSUSED*/
static void
-f_getwinposy(argvars, retvar)
+f_getwinposy(argvars, rettv)
typeval *argvars;
- typeval *retvar;
+ typeval *rettv;
{
- retvar->vval.v_number = -1;
+ rettv->vval.v_number = -1;
#ifdef FEAT_GUI
if (gui.in_use)
{
int x, y;
if (gui_mch_get_winpos(&x, &y) == OK)
- retvar->vval.v_number = y;
+ rettv->vval.v_number = y;
}
#endif
}
@@ -5650,9 +5864,9 @@ f_getwinposy(argvars, retvar)
* "getwinvar()" function
*/
static void
-f_getwinvar(argvars, retvar)
+f_getwinvar(argvars, rettv)
typeval *argvars;
- typeval *retvar;
+ typeval *rettv;
{
win_T *win, *oldcurwin;
char_u *varname;
@@ -5660,10 +5874,10 @@ f_getwinvar(argvars, retvar)
++emsg_off;
win = find_win_by_nr(&argvars[0]);
- varname = get_vartv_string(&argvars[1]);
+ varname = get_tv_string(&argvars[1]);
- retvar->v_type = VAR_STRING;
- retvar->vval.v_string = NULL;
+ rettv->v_type = VAR_STRING;
+ rettv->vval.v_string = NULL;
if (win != NULL && varname != NULL)
{
@@ -5673,7 +5887,7 @@ f_getwinvar(argvars, retvar)
oldcurwin = curwin;
curwin = win;
- get_option_vartv(&varname, retvar, 1);
+ get_option_tv(&varname, rettv, 1);
/* restore previous notion of curwin */
curwin = oldcurwin;
@@ -5683,7 +5897,7 @@ f_getwinvar(argvars, retvar)
/* look up the variable */
v = find_var_in_ga(&win->w_vars, varname);
if (v != NULL)
- copy_vartv(&v->tv, retvar);
+ copy_tv(&v->tv, rettv);
}
}
@@ -5694,16 +5908,16 @@ f_getwinvar(argvars, retvar)
* "glob()" function
*/
static void
-f_glob(argvars, retvar)
+f_glob(argvars, rettv)
typeval *argvars;
- typeval *retvar;
+ typeval *rettv;
{
expand_T xpc;
ExpandInit(&xpc);
xpc.xp_context = EXPAND_FILES;
- retvar->v_type = VAR_STRING;
- retvar->vval.v_string = ExpandOne(&xpc, get_vartv_string(&argvars[0]),
+ rettv->v_type = VAR_STRING;
+ rettv->vval.v_string = ExpandOne(&xpc, get_tv_string(&argvars[0]),
NULL, WILD_USE_NL|WILD_SILENT, WILD_ALL);
ExpandCleanup(&xpc);
}
@@ -5712,24 +5926,24 @@ f_glob(argvars, retvar)
* "globpath()" function
*/
static void
-f_globpath(argvars, retvar)
+f_globpath(argvars, rettv)
typeval *argvars;
- typeval *retvar;
+ typeval *rettv;
{
char_u buf1[NUMBUFLEN];
- retvar->v_type = VAR_STRING;
- retvar->vval.v_string = globpath(get_vartv_string(&argvars[0]),
- get_vartv_string_buf(&argvars[1], buf1));
+ rettv->v_type = VAR_STRING;
+ rettv->vval.v_string = globpath(get_tv_string(&argvars[0]),
+ get_tv_string_buf(&argvars[1], buf1));
}
/*
* "has()" function
*/
static void
-f_has(argvars, retvar)
+f_has(argvars, rettv)
typeval *argvars;
- typeval *retvar;
+ typeval *rettv;
{
int i;
char_u *name;
@@ -5892,9 +6106,6 @@ f_has(argvars, retvar)
"gui_athena",
# endif
#endif
-#ifdef FEAT_GUI_BEOS
- "gui_beos",
-#endif
#ifdef FEAT_GUI_KDE
"gui_kde",
#endif
@@ -6157,7 +6368,7 @@ f_has(argvars, retvar)
NULL
};
- name = get_vartv_string(&argvars[0]);
+ name = get_tv_string(&argvars[0]);
for (i = 0; has_list[i] != NULL; ++i)
if (STRICMP(name, has_list[i]) == 0)
{
@@ -6217,31 +6428,31 @@ f_has(argvars, retvar)
#endif
}
- retvar->vval.v_number = n;
+ rettv->vval.v_number = n;
}
/*
* "hasmapto()" function
*/
static void
-f_hasmapto(argvars, retvar)
+f_hasmapto(argvars, rettv)
typeval *argvars;
- typeval *retvar;
+ typeval *rettv;
{
char_u *name;
char_u *mode;
char_u buf[NUMBUFLEN];
- name = get_vartv_string(&argvars[0]);
+ name = get_tv_string(&argvars[0]);
if (argvars[1].v_type == VAR_UNKNOWN)
mode = (char_u *)"nvo";
else
- mode = get_vartv_string_buf(&argvars[1], buf);
+ mode = get_tv_string_buf(&argvars[1], buf);
if (map_to_exists(name, mode))
- retvar->vval.v_number = TRUE;
+ rettv->vval.v_number = TRUE;
else
- retvar->vval.v_number = FALSE;
+ rettv->vval.v_number = FALSE;
}
/*
@@ -6249,9 +6460,9 @@ f_hasmapto(argvars, retvar)
*/
/*ARGSUSED*/
static void
-f_histadd(argvars, retvar)
+f_histadd(argvars, rettv)
typeval *argvars;
- typeval *retvar;
+ typeval *rettv;
{
#ifdef FEAT_CMDHIST
int histype;
@@ -6259,18 +6470,18 @@ f_histadd(argvars, retvar)
char_u buf[NUMBUFLEN];
#endif
- retvar->vval.v_number = FALSE;
+ rettv->vval.v_number = FALSE;
if (check_restricted() || check_secure())
return;
#ifdef FEAT_CMDHIST
- histype = get_histtype(get_vartv_string(&argvars[0]));
+ histype = get_histtype(get_tv_string(&argvars[0]));
if (histype >= 0)
{
- str = get_vartv_string_buf(&argvars[1], buf);
+ str = get_tv_string_buf(&argvars[1], buf);
if (*str != NUL)
{
add_to_history(histype, str, FALSE, NUL);
- retvar->vval.v_number = TRUE;
+ rettv->vval.v_number = TRUE;
return;
}
}
@@ -6282,9 +6493,9 @@ f_histadd(argvars, retvar)
*/
/*ARGSUSED*/
static void
-f_histdel(argvars, retvar)
+f_histdel(argvars, rettv)
typeval *argvars;
- typeval *retvar;
+ typeval *rettv;
{
#ifdef FEAT_CMDHIST
int n;
@@ -6292,18 +6503,18 @@ f_histdel(argvars, retvar)
if (argvars[1].v_type == VAR_UNKNOWN)
/* only one argument: clear entire history */
- n = clr_history(get_histtype(get_vartv_string(&argvars[0])));
+ n = clr_history(get_histtype(get_tv_string(&argvars[0])));
else if (argvars[1].v_type == VAR_NUMBER)
/* index given: remove that entry */
- n = del_history_idx(get_histtype(get_vartv_string(&argvars[0])),
- (int)get_vartv_number(&argvars[1]));
+ n = del_history_idx(get_histtype(get_tv_string(&argvars[0])),
+ (int)get_tv_number(&argvars[1]));
else
/* string given: remove all matching entries */
- n = del_history_entry(get_histtype(get_vartv_string(&argvars[0])),
- get_vartv_string_buf(&argvars[1], buf));
- retvar->vval.v_number = n;
+ n = del_history_entry(get_histtype(get_tv_string(&argvars[0])),
+ get_tv_string_buf(&argvars[1], buf));
+ rettv->vval.v_number = n;
#else
- retvar->vval.v_number = 0;
+ rettv->vval.v_number = 0;
#endif
}
@@ -6312,24 +6523,24 @@ f_histdel(argvars, retvar)
*/
/*ARGSUSED*/
static void
-f_histget(argvars, retvar)
+f_histget(argvars, rettv)
typeval *argvars;
- typeval *retvar;
+ typeval *rettv;
{
#ifdef FEAT_CMDHIST
int type;
int idx;
- type = get_histtype(get_vartv_string(&argvars[0]));
+ type = get_histtype(get_tv_string(&argvars[0]));
if (argvars[1].v_type == VAR_UNKNOWN)
idx = get_history_idx(type);
else
- idx = (int)get_vartv_number(&argvars[1]);
- retvar->vval.v_string = vim_strsave(get_history_entry(type, idx));
+ idx = (int)get_tv_number(&argvars[1]);
+ rettv->vval.v_string = vim_strsave(get_history_entry(type, idx));
#else
- retvar->vval.v_string = NULL;
+ rettv->vval.v_string = NULL;
#endif
- retvar->v_type = VAR_STRING;
+ rettv->v_type = VAR_STRING;
}
/*
@@ -6337,42 +6548,42 @@ f_histget(argvars, retvar)
*/
/*ARGSUSED*/
static void
-f_histnr(argvars, retvar)
+f_histnr(argvars, rettv)
typeval *argvars;
- typeval *retvar;
+ typeval *rettv;
{
int i;
#ifdef FEAT_CMDHIST
- i = get_histtype(get_vartv_string(&argvars[0]));
+ i = get_histtype(get_tv_string(&argvars[0]));
if (i >= HIST_CMD && i < HIST_COUNT)
i = get_history_idx(i);
else
#endif
i = -1;
- retvar->vval.v_number = i;
+ rettv->vval.v_number = i;
}
/*
* "highlight_exists()" function
*/
static void
-f_hlexists(argvars, retvar)
+f_hlexists(argvars, rettv)
typeval *argvars;
- typeval *retvar;
+ typeval *rettv;
{
- retvar->vval.v_number = highlight_exists(get_vartv_string(&argvars[0]));
+ rettv->vval.v_number = highlight_exists(get_tv_string(&argvars[0]));
}
/*
* "highlightID(name)" function
*/
static void
-f_hlID(argvars, retvar)
+f_hlID(argvars, rettv)
typeval *argvars;
- typeval *retvar;
+ typeval *rettv;
{
- retvar->vval.v_number = syn_name2id(get_vartv_string(&argvars[0]));
+ rettv->vval.v_number = syn_name2id(get_tv_string(&argvars[0]));
}
/*
@@ -6380,15 +6591,15 @@ f_hlID(argvars, retvar)
*/
/*ARGSUSED*/
static void
-f_hostname(argvars, retvar)
+f_hostname(argvars, rettv)
typeval *argvars;
- typeval *retvar;
+ typeval *rettv;
{
char_u hostname[256];
mch_get_host_name(hostname, 256);
- retvar->v_type = VAR_STRING;
- retvar->vval.v_string = vim_strsave(hostname);
+ rettv->v_type = VAR_STRING;
+ rettv->vval.v_string = vim_strsave(hostname);
}
/*
@@ -6396,9 +6607,9 @@ f_hostname(argvars, retvar)
*/
/*ARGSUSED*/
static void
-f_iconv(argvars, retvar)
+f_iconv(argvars, rettv)
typeval *argvars;
- typeval *retvar;
+ typeval *rettv;
{
#ifdef FEAT_MBYTE
char_u buf1[NUMBUFLEN];
@@ -6407,21 +6618,21 @@ f_iconv(argvars, retvar)
vimconv_T vimconv;
#endif
- retvar->v_type = VAR_STRING;
- retvar->vval.v_string = NULL;
+ rettv->v_type = VAR_STRING;
+ rettv->vval.v_string = NULL;
#ifdef FEAT_MBYTE
- str = get_vartv_string(&argvars[0]);
- from = enc_canonize(enc_skip(get_vartv_string_buf(&argvars[1], buf1)));
- to = enc_canonize(enc_skip(get_vartv_string_buf(&argvars[2], buf2)));
+ str = get_tv_string(&argvars[0]);
+ from = enc_canonize(enc_skip(get_tv_string_buf(&argvars[1], buf1)));
+ to = enc_canonize(enc_skip(get_tv_string_buf(&argvars[2], buf2)));
vimconv.vc_type = CONV_NONE;
convert_setup(&vimconv, from, to);
/* If the encodings are equal, no conversion needed. */
if (vimconv.vc_type == CONV_NONE)
- retvar->vval.v_string = vim_strsave(str);
+ rettv->vval.v_string = vim_strsave(str);
else
- retvar->vval.v_string = string_convert(&vimconv, str, NULL);
+ rettv->vval.v_string = string_convert(&vimconv, str, NULL);
convert_setup(&vimconv, NULL, NULL);
vim_free(from);
@@ -6433,17 +6644,17 @@ f_iconv(argvars, retvar)
* "indent()" function
*/
static void
-f_indent(argvars, retvar)
+f_indent(argvars, rettv)
typeval *argvars;
- typeval *retvar;
+ typeval *rettv;
{
linenr_T lnum;
- lnum = get_vartv_lnum(argvars);
+ lnum = get_tv_lnum(argvars);
if (lnum >= 1 && lnum <= curbuf->b_ml.ml_line_count)
- retvar->vval.v_number = get_indent_lnum(lnum);
+ rettv->vval.v_number = get_indent_lnum(lnum);
else
- retvar->vval.v_number = -1;
+ rettv->vval.v_number = -1;
}
static int inputsecret_flag = 0;
@@ -6453,23 +6664,23 @@ static int inputsecret_flag = 0;
* Also handles inputsecret() when inputsecret is set.
*/
static void
-f_input(argvars, retvar)
+f_input(argvars, rettv)
typeval *argvars;
- typeval *retvar;
+ typeval *rettv;
{
- char_u *prompt = get_vartv_string(&argvars[0]);
+ char_u *prompt = get_tv_string(&argvars[0]);
char_u *p = NULL;
int c;
char_u buf[NUMBUFLEN];
int cmd_silent_save = cmd_silent;
- retvar->v_type = VAR_STRING;
+ rettv->v_type = VAR_STRING;
#ifdef NO_CONSOLE_INPUT
/* While starting up, there is no place to enter text. */
if (no_console_input())
{
- retvar->vval.v_string = NULL;
+ rettv->vval.v_string = NULL;
return;
}
#endif
@@ -6498,9 +6709,9 @@ f_input(argvars, retvar)
}
if (argvars[1].v_type != VAR_UNKNOWN)
- stuffReadbuffSpec(get_vartv_string_buf(&argvars[1], buf));
+ stuffReadbuffSpec(get_tv_string_buf(&argvars[1], buf));
- retvar->vval.v_string =
+ rettv->vval.v_string =
getcmdline_prompt(inputsecret_flag ? NUL : '@', p, echo_attr);
/* since the user typed this, no need to wait for return */
@@ -6513,9 +6724,9 @@ f_input(argvars, retvar)
* "inputdialog()" function
*/
static void
-f_inputdialog(argvars, retvar)
+f_inputdialog(argvars, rettv)
typeval *argvars;
- typeval *retvar;
+ typeval *rettv;
{
#if defined(FEAT_GUI_TEXTDIALOG)
/* Use a GUI dialog if the GUI is running and 'c' is not in 'guioptions' */
@@ -6524,31 +6735,31 @@ f_inputdialog(argvars, retvar)
char_u *message;
char_u buf[NUMBUFLEN];
- message = get_vartv_string(&argvars[0]);
+ message = get_tv_string(&argvars[0]);
if (argvars[1].v_type != VAR_UNKNOWN)
{
- STRNCPY(IObuff, get_vartv_string_buf(&argvars[1], buf), IOSIZE);
+ STRNCPY(IObuff, get_tv_string_buf(&argvars[1], buf), IOSIZE);
IObuff[IOSIZE - 1] = NUL;
}
else
IObuff[0] = NUL;
if (do_dialog(VIM_QUESTION, NULL, message, (char_u *)_("&OK\n&Cancel"),
1, IObuff) == 1)
- retvar->vval.v_string = vim_strsave(IObuff);
+ rettv->vval.v_string = vim_strsave(IObuff);
else
{
if (argvars[1].v_type != VAR_UNKNOWN
&& argvars[2].v_type != VAR_UNKNOWN)
- retvar->vval.v_string = vim_strsave(
- get_vartv_string_buf(&argvars[2], buf));
+ rettv->vval.v_string = vim_strsave(
+ get_tv_string_buf(&argvars[2], buf));
else
- retvar->vval.v_string = NULL;
+ rettv->vval.v_string = NULL;
}
- retvar->v_type = VAR_STRING;
+ rettv->v_type = VAR_STRING;
}
else
#endif
- f_input(argvars, retvar);
+ f_input(argvars, rettv);
}
static garray_T ga_userinput = {0, 0, sizeof(tasave_T), 4, NULL};
@@ -6558,21 +6769,21 @@ static garray_T ga_userinput = {0, 0, sizeof(tasave_T), 4, NULL};
*/
/*ARGSUSED*/
static void
-f_inputrestore(argvars, retvar)
+f_inputrestore(argvars, rettv)
typeval *argvars;
- typeval *retvar;
+ typeval *rettv;
{
if (ga_userinput.ga_len > 0)
{
--ga_userinput.ga_len;
restore_typeahead((tasave_T *)(ga_userinput.ga_data)
+ ga_userinput.ga_len);
- retvar->vval.v_number = 0; /* OK */
+ rettv->vval.v_number = 0; /* OK */
}
else if (p_verbose > 1)
{
msg((char_u *)_("called inputrestore() more often than inputsave()"));
- retvar->vval.v_number = 1; /* Failed */
+ rettv->vval.v_number = 1; /* Failed */
}
}
@@ -6581,9 +6792,9 @@ f_inputrestore(argvars, retvar)
*/
/*ARGSUSED*/
static void
-f_inputsave(argvars, retvar)
+f_inputsave(argvars, rettv)
typeval *argvars;
- typeval *retvar;
+ typeval *rettv;
{
/* Add an entry to the stack of typehead storage. */
if (ga_grow(&ga_userinput, 1) == OK)
@@ -6591,23 +6802,23 @@ f_inputsave(argvars, retvar)
save_typeahead((tasave_T *)(ga_userinput.ga_data)
+ ga_userinput.ga_len);
++ga_userinput.ga_len;
- retvar->vval.v_number = 0; /* OK */
+ rettv->vval.v_number = 0; /* OK */
}
else
- retvar->vval.v_number = 1; /* Failed */
+ rettv->vval.v_number = 1; /* Failed */
}
/*
* "inputsecret()" function
*/
static void
-f_inputsecret(argvars, retvar)
+f_inputsecret(argvars, rettv)
typeval *argvars;
- typeval *retvar;
+ typeval *rettv;
{
++cmdline_star;
++inputsecret_flag;
- f_input(argvars, retvar);
+ f_input(argvars, rettv);
--cmdline_star;
--inputsecret_flag;
}
@@ -6616,9 +6827,9 @@ f_inputsecret(argvars, retvar)
* "insert()" function
*/
static void
-f_insert(argvars, retvar)
+f_insert(argvars, rettv)
typeval *argvars;
- typeval *retvar;
+ typeval *rettv;
{
long before = 0;
long n;
@@ -6631,7 +6842,7 @@ f_insert(argvars, retvar)
else if ((l = argvars[0].vval.v_list) != NULL)
{
if (argvars[2].v_type != VAR_UNKNOWN)
- before = get_vartv_number(&argvars[2]);
+ before = get_tv_number(&argvars[2]);
if (before < 0)
{
@@ -6656,7 +6867,7 @@ f_insert(argvars, retvar)
ni = listitem_alloc();
if (ni != NULL)
{
- copy_vartv(&argvars[1], &ni->li_tv);
+ copy_tv(&argvars[1], &ni->li_tv);
if (item == NULL)
/* Append new item at end of list. */
list_append(l, ni);
@@ -6671,7 +6882,7 @@ f_insert(argvars, retvar)
item->li_prev->li_next = ni;
item->li_prev = ni;
}
- copy_vartv(&argvars[0], retvar);
+ copy_tv(&argvars[0], rettv);
}
}
}
@@ -6681,11 +6892,11 @@ f_insert(argvars, retvar)
* "isdirectory()" function
*/
static void
-f_isdirectory(argvars, retvar)
+f_isdirectory(argvars, rettv)
typeval *argvars;
- typeval *retvar;
+ typeval *rettv;
{
- retvar->vval.v_number = mch_isdir(get_vartv_string(&argvars[0]));
+ rettv->vval.v_number = mch_isdir(get_tv_string(&argvars[0]));
}
/*
@@ -6693,9 +6904,9 @@ f_isdirectory(argvars, retvar)
*/
/*ARGSUSED*/
static void
-f_last_buffer_nr(argvars, retvar)
+f_last_buffer_nr(argvars, rettv)
typeval *argvars;
- typeval *retvar;
+ typeval *rettv;
{
int n = 0;
buf_T *buf;
@@ -6704,26 +6915,26 @@ f_last_buffer_nr(argvars, retvar)
if (n < buf->b_fnum)
n = buf->b_fnum;
- retvar->vval.v_number = n;
+ rettv->vval.v_number = n;
}
/*
* "len()" function
*/
static void
-f_len(argvars, retvar)
+f_len(argvars, rettv)
typeval *argvars;
- typeval *retvar;
+ typeval *rettv;
{
switch (argvars[0].v_type)
{
case VAR_STRING:
case VAR_NUMBER:
- retvar->vval.v_number = (varnumber_T)STRLEN(
- get_vartv_string(&argvars[0]));
+ rettv->vval.v_number = (varnumber_T)STRLEN(
+ get_tv_string(&argvars[0]));
break;
case VAR_LIST:
- retvar->vval.v_number = list_len(argvars[0].vval.v_list);
+ rettv->vval.v_number = list_len(argvars[0].vval.v_list);
break;
default:
EMSG(_("E999: Invalid type for len()"));
@@ -6735,28 +6946,28 @@ f_len(argvars, retvar)
* "libcall()" function
*/
static void
-f_libcall(argvars, retvar)
+f_libcall(argvars, rettv)
typeval *argvars;
- typeval *retvar;
+ typeval *rettv;
{
- libcall_common(argvars, retvar, VAR_STRING);
+ libcall_common(argvars, rettv, VAR_STRING);
}
/*
* "libcallnr()" function
*/
static void
-f_libcallnr(argvars, retvar)
+f_libcallnr(argvars, rettv)
typeval *argvars;
- typeval *retvar;
+ typeval *rettv;
{
- libcall_common(argvars, retvar, VAR_NUMBER);
+ libcall_common(argvars, rettv, VAR_NUMBER);
}
static void
-libcall_common(argvars, retvar, type)
+libcall_common(argvars, rettv, type)
typeval *argvars;
- typeval *retvar;
+ typeval *rettv;
int type;
{
#ifdef FEAT_LIBCALL
@@ -6765,11 +6976,11 @@ libcall_common(argvars, retvar, type)
int nr_result;
#endif
- retvar->v_type = type;
+ rettv->v_type = type;
if (type == VAR_NUMBER)
- retvar->vval.v_number = 0;
+ rettv->vval.v_number = 0;
else
- retvar->vval.v_string = NULL;
+ rettv->vval.v_string = NULL;
if (check_restricted() || check_secure())
return;
@@ -6785,7 +6996,7 @@ libcall_common(argvars, retvar, type)
if (type == VAR_NUMBER)
string_result = NULL;
else
- string_result = &retvar->vval.v_string;
+ string_result = &rettv->vval.v_string;
if (mch_libcall(argvars[0].vval.v_string,
argvars[1].vval.v_string,
string_in,
@@ -6793,7 +7004,7 @@ libcall_common(argvars, retvar, type)
string_result,
&nr_result) == OK
&& type == VAR_NUMBER)
- retvar->vval.v_number = nr_result;
+ rettv->vval.v_number = nr_result;
}
#endif
}
@@ -6802,9 +7013,9 @@ libcall_common(argvars, retvar, type)
* "line(string)" function
*/
static void
-f_line(argvars, retvar)
+f_line(argvars, rettv)
typeval *argvars;
- typeval *retvar;
+ typeval *rettv;
{
linenr_T lnum = 0;
pos_T *fp;
@@ -6812,7 +7023,7 @@ f_line(argvars, retvar)
fp = var2fpos(&argvars[0], TRUE);
if (fp != NULL)
lnum = fp->lnum;
- retvar->vval.v_number = lnum;
+ rettv->vval.v_number = lnum;
}
/*
@@ -6820,22 +7031,22 @@ f_line(argvars, retvar)
*/
/*ARGSUSED*/
static void
-f_line2byte(argvars, retvar)
+f_line2byte(argvars, rettv)
typeval *argvars;
- typeval *retvar;
+ typeval *rettv;
{
#ifndef FEAT_BYTEOFF
- retvar->vval.v_number = -1;
+ rettv->vval.v_number = -1;
#else
linenr_T lnum;
- lnum = get_vartv_lnum(argvars);
+ lnum = get_tv_lnum(argvars);
if (lnum < 1 || lnum > curbuf->b_ml.ml_line_count + 1)
- retvar->vval.v_number = -1;
+ rettv->vval.v_number = -1;
else
- retvar->vval.v_number = ml_find_line_or_offset(curbuf, lnum, NULL);
- if (retvar->vval.v_number >= 0)
- ++retvar->vval.v_number;
+ rettv->vval.v_number = ml_find_line_or_offset(curbuf, lnum, NULL);
+ if (rettv->vval.v_number >= 0)
+ ++rettv->vval.v_number;
#endif
}
@@ -6843,25 +7054,25 @@ f_line2byte(argvars, retvar)
* "lispindent(lnum)" function
*/
static void
-f_lispindent(argvars, retvar)
+f_lispindent(argvars, rettv)
typeval *argvars;
- typeval *retvar;
+ typeval *rettv;
{
#ifdef FEAT_LISP
pos_T pos;
linenr_T lnum;
pos = curwin->w_cursor;
- lnum = get_vartv_lnum(argvars);
+ lnum = get_tv_lnum(argvars);
if (lnum >= 1 && lnum <= curbuf->b_ml.ml_line_count)
{
curwin->w_cursor.lnum = lnum;
- retvar->vval.v_number = get_lisp_indent();
+ rettv->vval.v_number = get_lisp_indent();
curwin->w_cursor = pos;
}
else
#endif
- retvar->vval.v_number = -1;
+ rettv->vval.v_number = -1;
}
/*
@@ -6869,39 +7080,39 @@ f_lispindent(argvars, retvar)
*/
/*ARGSUSED*/
static void
-f_localtime(argvars, retvar)
+f_localtime(argvars, rettv)
typeval *argvars;
- typeval *retvar;
+ typeval *rettv;
{
- retvar->vval.v_number = (varnumber_T)time(NULL);
+ rettv->vval.v_number = (varnumber_T)time(NULL);
}
/*
* "maparg()" function
*/
static void
-f_maparg(argvars, retvar)
+f_maparg(argvars, rettv)
typeval *argvars;
- typeval *retvar;
+ typeval *rettv;
{
- get_maparg(argvars, retvar, TRUE);
+ get_maparg(argvars, rettv, TRUE);
}
/*
* "mapcheck()" function
*/
static void
-f_mapcheck(argvars, retvar)
+f_mapcheck(argvars, rettv)
typeval *argvars;
- typeval *retvar;
+ typeval *rettv;
{
- get_maparg(argvars, retvar, FALSE);
+ get_maparg(argvars, rettv, FALSE);
}
static void
-get_maparg(argvars, retvar, exact)
+get_maparg(argvars, rettv, exact)
typeval *argvars;
- typeval *retvar;
+ typeval *rettv;
int exact;
{
char_u *keys;
@@ -6913,15 +7124,15 @@ get_maparg(argvars, retvar, exact)
garray_T ga;
/* return empty string for failure */
- retvar->v_type = VAR_STRING;
- retvar->vval.v_string = NULL;
+ rettv->v_type = VAR_STRING;
+ rettv->vval.v_string = NULL;
- keys = get_vartv_string(&argvars[0]);
+ keys = get_tv_string(&argvars[0]);
if (*keys == NUL)
return;
if (argvars[1].v_type != VAR_UNKNOWN)
- which = get_vartv_string_buf(&argvars[1], buf);
+ which = get_tv_string_buf(&argvars[1], buf);
else
which = (char_u *)"";
mode = get_map_mode(&which, 0);
@@ -6939,7 +7150,7 @@ get_maparg(argvars, retvar, exact)
ga_concat(&ga, str2special(&rhs, FALSE));
ga_append(&ga, NUL);
- retvar->vval.v_string = (char_u *)ga.ga_data;
+ rettv->vval.v_string = (char_u *)ga.ga_data;
}
}
@@ -6947,39 +7158,39 @@ get_maparg(argvars, retvar, exact)
* "match()" function
*/
static void
-f_match(argvars, retvar)
+f_match(argvars, rettv)
typeval *argvars;
- typeval *retvar;
+ typeval *rettv;
{
- find_some_match(argvars, retvar, 1);
+ find_some_match(argvars, rettv, 1);
}
/*
* "matchend()" function
*/
static void
-f_matchend(argvars, retvar)
+f_matchend(argvars, rettv)
typeval *argvars;
- typeval *retvar;
+ typeval *rettv;
{
- find_some_match(argvars, retvar, 0);
+ find_some_match(argvars, rettv, 0);
}
/*
* "matchstr()" function
*/
static void
-f_matchstr(argvars, retvar)
+f_matchstr(argvars, rettv)
typeval *argvars;
- typeval *retvar;
+ typeval *rettv;
{
- find_some_match(argvars, retvar, 2);
+ find_some_match(argvars, rettv, 2);
}
static void
-find_some_match(argvars, retvar, type)
+find_some_match(argvars, rettv, type)
typeval *argvars;
- typeval *retvar;
+ typeval *rettv;
int type;
{
char_u *str;
@@ -6996,20 +7207,20 @@ find_some_match(argvars, retvar, type)
save_cpo = p_cpo;
p_cpo = (char_u *)"";
- expr = str = get_vartv_string(&argvars[0]);
- pat = get_vartv_string_buf(&argvars[1], patbuf);
+ expr = str = get_tv_string(&argvars[0]);
+ pat = get_tv_string_buf(&argvars[1], patbuf);
if (type == 2)
{
- retvar->v_type = VAR_STRING;
- retvar->vval.v_string = NULL;
+ rettv->v_type = VAR_STRING;
+ rettv->vval.v_string = NULL;
}
else
- retvar->vval.v_number = -1;
+ rettv->vval.v_number = -1;
if (argvars[2].v_type != VAR_UNKNOWN)
{
- start = get_vartv_number(&argvars[2]);
+ start = get_tv_number(&argvars[2]);
if (start < 0)
start = 0;
if (start > (long)STRLEN(str))
@@ -7017,7 +7228,7 @@ find_some_match(argvars, retvar, type)
str += start;
if (argvars[3].v_type != VAR_UNKNOWN)
- nth = get_vartv_number(&argvars[3]);
+ nth = get_tv_number(&argvars[3]);
}
regmatch.regprog = vim_regcomp(pat, RE_MAGIC + RE_STRING);
@@ -7041,17 +7252,17 @@ find_some_match(argvars, retvar, type)
if (match)
{
if (type == 2)
- retvar->vval.v_string = vim_strnsave(regmatch.startp[0],
+ rettv->vval.v_string = vim_strnsave(regmatch.startp[0],
(int)(regmatch.endp[0] - regmatch.startp[0]));
else
{
if (type != 0)
- retvar->vval.v_number =
+ rettv->vval.v_number =
(varnumber_T)(regmatch.startp[0] - str);
else
- retvar->vval.v_number =
+ rettv->vval.v_number =
(varnumber_T)(regmatch.endp[0] - str);
- retvar->vval.v_number += str - expr;
+ rettv->vval.v_number += str - expr;
}
}
vim_free(regmatch.regprog);
@@ -7066,9 +7277,9 @@ theend:
*/
/*ARGSUSED*/
static void
-f_mode(argvars, retvar)
+f_mode(argvars, rettv)
typeval *argvars;
- typeval *retvar;
+ typeval *rettv;
{
char_u buf[2];
@@ -7097,40 +7308,40 @@ f_mode(argvars, retvar)
buf[0] = 'n';
buf[1] = NUL;
- retvar->vval.v_string = vim_strsave(buf);
- retvar->v_type = VAR_STRING;
+ rettv->vval.v_string = vim_strsave(buf);
+ rettv->v_type = VAR_STRING;
}
/*
* "nr2char()" function
*/
static void
-f_nr2char(argvars, retvar)
+f_nr2char(argvars, rettv)
typeval *argvars;
- typeval *retvar;
+ typeval *rettv;
{
char_u buf[NUMBUFLEN];
#ifdef FEAT_MBYTE
if (has_mbyte)
- buf[(*mb_char2bytes)((int)get_vartv_number(&argvars[0]), buf)] = NUL;
+ buf[(*mb_char2bytes)((int)get_tv_number(&argvars[0]), buf)] = NUL;
else
#endif
{
- buf[0] = (char_u)get_vartv_number(&argvars[0]);
+ buf[0] = (char_u)get_tv_number(&argvars[0]);
buf[1] = NUL;
}
- retvar->v_type = VAR_STRING;
- retvar->vval.v_string = vim_strsave(buf);
+ rettv->v_type = VAR_STRING;
+ rettv->vval.v_string = vim_strsave(buf);
}
/*
* "remove({list}, {idx})" function
*/
static void
-f_remove(argvars, retvar)
+f_remove(argvars, rettv)
typeval *argvars;
- typeval *retvar;
+ typeval *rettv;
{
listvar *l;
listitem *item;
@@ -7140,13 +7351,13 @@ f_remove(argvars, retvar)
EMSG(_("E999: First argument of remove() must be a list"));
else if ((l = argvars[0].vval.v_list) != NULL)
{
- idx = get_vartv_number(&argvars[1]);
+ idx = get_tv_number(&argvars[1]);
item = list_getrem(l, idx);
if (item == NULL)
EMSGN(_(e_listidx), idx);
else
{
- *retvar = item->li_tv;
+ *rettv = item->li_tv;
vim_free(item);
}
}
@@ -7156,39 +7367,39 @@ f_remove(argvars, retvar)
* "rename({from}, {to})" function
*/
static void
-f_rename(argvars, retvar)
+f_rename(argvars, rettv)
typeval *argvars;
- typeval *retvar;
+ typeval *rettv;
{
char_u buf[NUMBUFLEN];
if (check_restricted() || check_secure())
- retvar->vval.v_number = -1;
+ rettv->vval.v_number = -1;
else
- retvar->vval.v_number = vim_rename(get_vartv_string(&argvars[0]),
- get_vartv_string_buf(&argvars[1], buf));
+ rettv->vval.v_number = vim_rename(get_tv_string(&argvars[0]),
+ get_tv_string_buf(&argvars[1], buf));
}
/*
* "resolve()" function
*/
static void
-f_resolve(argvars, retvar)
+f_resolve(argvars, rettv)
typeval *argvars;
- typeval *retvar;
+ typeval *rettv;
{
char_u *p;
- p = get_vartv_string(&argvars[0]);
+ p = get_tv_string(&argvars[0]);
#ifdef FEAT_SHORTCUT
{
char_u *v = NULL;
v = mch_resolve_shortcut(p);
if (v != NULL)
- retvar->vval.v_string = v;
+ rettv->vval.v_string = v;
else
- retvar->vval.v_string = vim_strsave(p);
+ rettv->vval.v_string = vim_strsave(p);
}
#else
# ifdef HAVE_READLINK
@@ -7235,7 +7446,7 @@ f_resolve(argvars, retvar)
vim_free(p);
vim_free(remain);
EMSG(_("E655: Too many symbolic links (cycle?)"));
- retvar->vval.v_string = NULL;
+ rettv->vval.v_string = NULL;
goto fail;
}
@@ -7355,35 +7566,35 @@ f_resolve(argvars, retvar)
*gettail_sep(p) = NUL;
}
- retvar->vval.v_string = p;
+ rettv->vval.v_string = p;
}
# else
- retvar->vval.v_string = vim_strsave(p);
+ rettv->vval.v_string = vim_strsave(p);
# endif
#endif
- simplify_filename(retvar->vval.v_string);
+ simplify_filename(rettv->vval.v_string);
#ifdef HAVE_READLINK
fail:
#endif
- retvar->v_type = VAR_STRING;
+ rettv->v_type = VAR_STRING;
}
/*
* "simplify()" function
*/
static void
-f_simplify(argvars, retvar)
+f_simplify(argvars, rettv)
typeval *argvars;
- typeval *retvar;
+ typeval *rettv;
{
char_u *p;
- p = get_vartv_string(&argvars[0]);
- retvar->vval.v_string = vim_strsave(p);
- simplify_filename(retvar->vval.v_string); /* simplify in place */
- retvar->v_type = VAR_STRING;
+ p = get_tv_string(&argvars[0]);
+ rettv->vval.v_string = vim_strsave(p);
+ simplify_filename(rettv->vval.v_string); /* simplify in place */
+ rettv->v_type = VAR_STRING;
}
#define SP_NOMOVE 1 /* don't move cursor */
@@ -7394,9 +7605,9 @@ f_simplify(argvars, retvar)
* "search()" function
*/
static void
-f_search(argvars, retvar)
+f_search(argvars, rettv)
typeval *argvars;
- typeval *retvar;
+ typeval *rettv;
{
char_u *pat;
pos_T pos;
@@ -7405,15 +7616,15 @@ f_search(argvars, retvar)
int dir;
int flags = 0;
- retvar->vval.v_number = 0; /* default: FAIL */
+ rettv->vval.v_number = 0; /* default: FAIL */
- pat = get_vartv_string(&argvars[0]);
+ pat = get_tv_string(&argvars[0]);
dir = get_search_arg(&argvars[1], &flags); /* may set p_ws */
if (dir == 0)
goto theend;
if ((flags & ~SP_NOMOVE) != 0)
{
- EMSG2(_(e_invarg2), get_vartv_string(&argvars[1]));
+ EMSG2(_(e_invarg2), get_tv_string(&argvars[1]));
goto theend;
}
@@ -7421,7 +7632,7 @@ f_search(argvars, retvar)
if (searchit(curwin, curbuf, &pos, dir, pat, 1L,
SEARCH_KEEP, RE_SEARCH) != FAIL)
{
- retvar->vval.v_number = pos.lnum;
+ rettv->vval.v_number = pos.lnum;
curwin->w_cursor = pos;
/* "/$" will put the cursor after the end of the line, may need to
* correct that here */
@@ -7439,9 +7650,9 @@ theend:
* "searchpair()" function
*/
static void
-f_searchpair(argvars, retvar)
+f_searchpair(argvars, rettv)
typeval *argvars;
- typeval *retvar;
+ typeval *rettv;
{
char_u *spat, *mpat, *epat;
char_u *skip;
@@ -7462,16 +7673,16 @@ f_searchpair(argvars, retvar)
int nest = 1;
int err;
- retvar->vval.v_number = 0; /* default: FAIL */
+ rettv->vval.v_number = 0; /* default: FAIL */
/* Make 'cpoptions' empty, the 'l' flag should not be used here. */
save_cpo = p_cpo;
p_cpo = (char_u *)"";
/* Get the three pattern arguments: start, middle, end. */
- spat = get_vartv_string(&argvars[0]);
- mpat = get_vartv_string_buf(&argvars[1], nbuf1);
- epat = get_vartv_string_buf(&argvars[2], nbuf2);
+ spat = get_tv_string(&argvars[0]);
+ mpat = get_tv_string_buf(&argvars[1], nbuf1);
+ epat = get_tv_string_buf(&argvars[2], nbuf2);
/* Make two search patterns: start/end (pat2, for in nested pairs) and
* start/middle/end (pat3, for the top pair). */
@@ -7496,7 +7707,7 @@ f_searchpair(argvars, retvar)
|| argvars[4].v_type == VAR_UNKNOWN)
skip = (char_u *)"";
else
- skip = get_vartv_string_buf(&argvars[4], nbuf3);
+ skip = get_tv_string_buf(&argvars[4], nbuf3);
save_cursor = curwin->w_cursor;
pos = curwin->w_cursor;
@@ -7524,7 +7735,7 @@ f_searchpair(argvars, retvar)
{
/* Evaluating {skip} caused an error, break here. */
curwin->w_cursor = save_cursor;
- retvar->vval.v_number = -1;
+ rettv->vval.v_number = -1;
break;
}
if (r)
@@ -7550,9 +7761,9 @@ f_searchpair(argvars, retvar)
{
/* Found the match: return matchcount or line number. */
if (flags & SP_RETCOUNT)
- ++retvar->vval.v_number;
+ ++rettv->vval.v_number;
else
- retvar->vval.v_number = pos.lnum;
+ rettv->vval.v_number = pos.lnum;
curwin->w_cursor = pos;
if (!(flags & SP_REPEAT))
break;
@@ -7561,7 +7772,7 @@ f_searchpair(argvars, retvar)
}
/* If 'n' flag is used or search failed: restore cursor position. */
- if ((flags & SP_NOMOVE) || retvar->vval.v_number == 0)
+ if ((flags & SP_NOMOVE) || rettv->vval.v_number == 0)
curwin->w_cursor = save_cursor;
theend:
@@ -7588,7 +7799,7 @@ get_search_arg(varp, flagsp)
if (varp->v_type != VAR_UNKNOWN)
{
- flags = get_vartv_string_buf(varp, nbuf);
+ flags = get_tv_string_buf(varp, nbuf);
while (*flags != NUL)
{
switch (*flags)
@@ -7625,9 +7836,9 @@ get_search_arg(varp, flagsp)
*/
/*ARGSUSED*/
static void
-f_setbufvar(argvars, retvar)
+f_setbufvar(argvars, rettv)
typeval *argvars;
- typeval *retvar;
+ typeval *rettv;
{
buf_T *buf;
#ifdef FEAT_AUTOCMD
@@ -7642,8 +7853,8 @@ f_setbufvar(argvars, retvar)
if (check_restricted() || check_secure())
return;
++emsg_off;
- buf = get_buf_vartv(&argvars[0]);
- varname = get_vartv_string(&argvars[1]);
+ buf = get_buf_tv(&argvars[0]);
+ varname = get_tv_string(&argvars[1]);
varp = &argvars[2];
if (buf != NULL && varname != NULL && varp != NULL)
@@ -7659,8 +7870,8 @@ f_setbufvar(argvars, retvar)
if (*varname == '&')
{
++varname;
- set_option_value(varname, get_vartv_number(varp),
- get_vartv_string_buf(varp, nbuf), OPT_LOCAL);
+ set_option_value(varname, get_tv_number(varp),
+ get_tv_string_buf(varp, nbuf), OPT_LOCAL);
}
else
{
@@ -7688,28 +7899,28 @@ f_setbufvar(argvars, retvar)
* "setcmdpos()" function
*/
static void
-f_setcmdpos(argvars, retvar)
+f_setcmdpos(argvars, rettv)
typeval *argvars;
- typeval *retvar;
+ typeval *rettv;
{
- retvar->vval.v_number = set_cmdline_pos(
- (int)get_vartv_number(&argvars[0]) - 1);
+ rettv->vval.v_number = set_cmdline_pos(
+ (int)get_tv_number(&argvars[0]) - 1);
}
/*
* "setline()" function
*/
static void
-f_setline(argvars, retvar)
+f_setline(argvars, rettv)
typeval *argvars;
- typeval *retvar;
+ typeval *rettv;
{
linenr_T lnum;
char_u *line;
- lnum = get_vartv_lnum(argvars);
- line = get_vartv_string(&argvars[1]);
- retvar->vval.v_number = 1; /* FAIL is default */
+ lnum = get_tv_lnum(argvars);
+ line = get_tv_string(&argvars[1]);
+ rettv->vval.v_number = 1; /* FAIL is default */
if (lnum >= 1
&& lnum <= curbuf->b_ml.ml_line_count
@@ -7718,7 +7929,7 @@ f_setline(argvars, retvar)
{
changed_bytes(lnum, 0);
check_cursor_col();
- retvar->vval.v_number = 0;
+ rettv->vval.v_number = 0;
}
}
@@ -7726,9 +7937,9 @@ f_setline(argvars, retvar)
* "setreg()" function
*/
static void
-f_setreg(argvars, retvar)
+f_setreg(argvars, rettv)
typeval *argvars;
- typeval *retvar;
+ typeval *rettv;
{
int regname;
char_u *strregname;
@@ -7741,8 +7952,8 @@ f_setreg(argvars, retvar)
yank_type = MAUTO;
append = FALSE;
- strregname = get_vartv_string(argvars);
- retvar->vval.v_number = 1; /* FAIL is default */
+ strregname = get_tv_string(argvars);
+ rettv->vval.v_number = 1; /* FAIL is default */
regname = (strregname == NULL ? '"' : *strregname);
if (regname == 0 || regname == '@')
@@ -7752,7 +7963,7 @@ f_setreg(argvars, retvar)
if (argvars[2].v_type != VAR_UNKNOWN)
{
- for (stropt = get_vartv_string(&argvars[2]); *stropt != NUL; ++stropt)
+ for (stropt = get_tv_string(&argvars[2]); *stropt != NUL; ++stropt)
switch (*stropt)
{
case 'a': case 'A': /* append */
@@ -7778,9 +7989,9 @@ f_setreg(argvars, retvar)
}
}
- write_reg_contents_ex(regname, get_vartv_string(&argvars[1]), -1,
+ write_reg_contents_ex(regname, get_tv_string(&argvars[1]), -1,
append, yank_type, block_len);
- retvar->vval.v_number = 0;
+ rettv->vval.v_number = 0;
}
@@ -7789,9 +8000,9 @@ f_setreg(argvars, retvar)
*/
/*ARGSUSED*/
static void
-f_setwinvar(argvars, retvar)
+f_setwinvar(argvars, rettv)
typeval *argvars;
- typeval *retvar;
+ typeval *rettv;
{
win_T *win;
#ifdef FEAT_WINDOWS
@@ -7805,7 +8016,7 @@ f_setwinvar(argvars, retvar)
return;
++emsg_off;
win = find_win_by_nr(&argvars[0]);
- varname = get_vartv_string(&argvars[1]);
+ varname = get_tv_string(&argvars[1]);
varp = &argvars[2];
if (win != NULL && varname != NULL && varp != NULL)
@@ -7820,8 +8031,8 @@ f_setwinvar(argvars, retvar)
if (*varname == '&')
{
++varname;
- set_option_value(varname, get_vartv_number(varp),
- get_vartv_string_buf(varp, nbuf), OPT_LOCAL);
+ set_option_value(varname, get_tv_number(varp),
+ get_tv_string_buf(varp, nbuf), OPT_LOCAL);
}
else
{
@@ -7852,13 +8063,13 @@ f_setwinvar(argvars, retvar)
* "nextnonblank()" function
*/
static void
-f_nextnonblank(argvars, retvar)
+f_nextnonblank(argvars, rettv)
typeval *argvars;
- typeval *retvar;
+ typeval *rettv;
{
linenr_T lnum;
- for (lnum = get_vartv_lnum(argvars); ; ++lnum)
+ for (lnum = get_tv_lnum(argvars); ; ++lnum)
{
if (lnum > curbuf->b_ml.ml_line_count)
{
@@ -7868,26 +8079,26 @@ f_nextnonblank(argvars, retvar)
if (*skipwhite(ml_get(lnum)) != NUL)
break;
}
- retvar->vval.v_number = lnum;
+ rettv->vval.v_number = lnum;
}
/*
* "prevnonblank()" function
*/
static void
-f_prevnonblank(argvars, retvar)
+f_prevnonblank(argvars, rettv)
typeval *argvars;
- typeval *retvar;
+ typeval *rettv;
{
linenr_T lnum;
- lnum = get_vartv_lnum(argvars);
+ lnum = get_tv_lnum(argvars);
if (lnum < 1 || lnum > curbuf->b_ml.ml_line_count)
lnum = 0;
else
while (lnum >= 1 && *skipwhite(ml_get(lnum)) == NUL)
--lnum;
- retvar->vval.v_number = lnum;
+ rettv->vval.v_number = lnum;
}
#if defined(FEAT_CLIENTSERVER) && defined(FEAT_X11)
@@ -7924,9 +8135,9 @@ check_connection()
/*ARGSUSED*/
static void
-f_serverlist(argvars, retvar)
+f_serverlist(argvars, rettv)
typeval *argvars;
- typeval *retvar;
+ typeval *rettv;
{
char_u *r = NULL;
@@ -7939,15 +8150,15 @@ f_serverlist(argvars, retvar)
r = serverGetVimNames(X_DISPLAY);
# endif
#endif
- retvar->v_type = VAR_STRING;
- retvar->vval.v_string = r;
+ rettv->v_type = VAR_STRING;
+ rettv->vval.v_string = r;
}
/*ARGSUSED*/
static void
-f_remote_peek(argvars, retvar)
+f_remote_peek(argvars, rettv)
typeval *argvars;
- typeval *retvar;
+ typeval *rettv;
{
#ifdef FEAT_CLIENTSERVER
var v;
@@ -7958,44 +8169,44 @@ f_remote_peek(argvars, retvar)
if (check_restricted() || check_secure())
{
- retvar->vval.v_number = -1;
+ rettv->vval.v_number = -1;
return;
}
# ifdef WIN32
- sscanf(get_vartv_string(&argvars[0]), "%x", &n);
+ sscanf(get_tv_string(&argvars[0]), "%x", &n);
if (n == 0)
- retvar->vval.v_number = -1;
+ rettv->vval.v_number = -1;
else
{
s = serverGetReply((HWND)n, FALSE, FALSE, FALSE);
- retvar->vval.v_number = (s != NULL);
+ rettv->vval.v_number = (s != NULL);
}
# else
- retvar->vval.v_number = 0;
+ rettv->vval.v_number = 0;
if (check_connection() == FAIL)
return;
- retvar->vval.v_number = serverPeekReply(X_DISPLAY,
- serverStrToWin(get_vartv_string(&argvars[0])), &s);
+ rettv->vval.v_number = serverPeekReply(X_DISPLAY,
+ serverStrToWin(get_tv_string(&argvars[0])), &s);
# endif
- if (argvars[1].v_type != VAR_UNKNOWN && retvar->vval.v_number > 0)
+ if (argvars[1].v_type != VAR_UNKNOWN && rettv->vval.v_number > 0)
{
v.tv.v_type = VAR_STRING;
v.tv.vval.v_string = vim_strsave(s);
- set_var(get_vartv_string(&argvars[1]), &v.tv, FALSE);
+ set_var(get_tv_string(&argvars[1]), &v.tv, FALSE);
vim_free(v.tv.vval.v_string);
}
#else
- retvar->vval.v_number = -1;
+ rettv->vval.v_number = -1;
#endif
}
/*ARGSUSED*/
static void
-f_remote_read(argvars, retvar)
+f_remote_read(argvars, rettv)
typeval *argvars;
- typeval *retvar;
+ typeval *rettv;
{
char_u *r = NULL;
@@ -8006,33 +8217,33 @@ f_remote_read(argvars, retvar)
/* The server's HWND is encoded in the 'id' parameter */
int n = 0;
- sscanf(get_vartv_string(&argvars[0]), "%x", &n);
+ sscanf(get_tv_string(&argvars[0]), "%x", &n);
if (n != 0)
r = serverGetReply((HWND)n, FALSE, TRUE, TRUE);
if (r == NULL)
# else
if (check_connection() == FAIL || serverReadReply(X_DISPLAY,
- serverStrToWin(get_vartv_string(&argvars[0])), &r, FALSE) < 0)
+ serverStrToWin(get_tv_string(&argvars[0])), &r, FALSE) < 0)
# endif
EMSG(_("E277: Unable to read a server reply"));
}
#endif
- retvar->v_type = VAR_STRING;
- retvar->vval.v_string = r;
+ rettv->v_type = VAR_STRING;
+ rettv->vval.v_string = r;
}
/*ARGSUSED*/
static void
-f_server2client(argvars, retvar)
+f_server2client(argvars, rettv)
typeval *argvars;
- typeval *retvar;
+ typeval *rettv;
{
#ifdef FEAT_CLIENTSERVER
char_u buf[NUMBUFLEN];
- char_u *server = get_vartv_string(&argvars[0]);
- char_u *reply = get_vartv_string_buf(&argvars[1], buf);
+ char_u *server = get_tv_string(&argvars[0]);
+ char_u *reply = get_tv_string_buf(&argvars[1], buf);
- retvar->vval.v_number = -1;
+ rettv->vval.v_number = -1;
if (check_restricted() || check_secure())
return;
# ifdef FEAT_X11
@@ -8045,19 +8256,19 @@ f_server2client(argvars, retvar)
EMSG(_("E258: Unable to send to client"));
return;
}
- retvar->vval.v_number = 0;
+ rettv->vval.v_number = 0;
#else
- retvar->vval.v_number = -1;
+ rettv->vval.v_number = -1;
#endif
}
#ifdef FEAT_CLIENTSERVER
-static void remote_common __ARGS((typeval *argvars, typeval *retvar, int expr));
+static void remote_common __ARGS((typeval *argvars, typeval *rettv, int expr));
static void
-remote_common(argvars, retvar, expr)
+remote_common(argvars, rettv, expr)
typeval *argvars;
- typeval *retvar;
+ typeval *rettv;
int expr;
{
char_u *server_name;
@@ -8078,8 +8289,8 @@ remote_common(argvars, retvar, expr)
return;
# endif
- server_name = get_vartv_string(&argvars[0]);
- keys = get_vartv_string_buf(&argvars[1], buf);
+ server_name = get_tv_string(&argvars[0]);
+ keys = get_tv_string_buf(&argvars[1], buf);
# ifdef WIN32
if (serverSendToVim(server_name, keys, &r, &w, expr, TRUE) < 0)
# else
@@ -8094,7 +8305,7 @@ remote_common(argvars, retvar, expr)
return;
}
- retvar->vval.v_string = r;
+ rettv->vval.v_string = r;
if (argvars[2].v_type != VAR_UNKNOWN)
{
@@ -8104,7 +8315,7 @@ remote_common(argvars, retvar, expr)
sprintf((char *)str, "0x%x", (unsigned int)w);
v.tv.v_type = VAR_STRING;
v.tv.vval.v_string = vim_strsave(str);
- set_var(get_vartv_string(&argvars[2]), &v.tv, FALSE);
+ set_var(get_tv_string(&argvars[2]), &v.tv, FALSE);
vim_free(v.tv.vval.v_string);
}
}
@@ -8115,14 +8326,14 @@ remote_common(argvars, retvar, expr)
*/
/*ARGSUSED*/
static void
-f_remote_expr(argvars, retvar)
+f_remote_expr(argvars, rettv)
typeval *argvars;
- typeval *retvar;
+ typeval *rettv;
{
- retvar->v_type = VAR_STRING;
- retvar->vval.v_string = NULL;
+ rettv->v_type = VAR_STRING;
+ rettv->vval.v_string = NULL;
#ifdef FEAT_CLIENTSERVER
- remote_common(argvars, retvar, TRUE);
+ remote_common(argvars, rettv, TRUE);
#endif
}
@@ -8131,14 +8342,14 @@ f_remote_expr(argvars, retvar)
*/
/*ARGSUSED*/
static void
-f_remote_send(argvars, retvar)
+f_remote_send(argvars, rettv)
typeval *argvars;
- typeval *retvar;
+ typeval *rettv;
{
- retvar->v_type = VAR_STRING;
- retvar->vval.v_string = NULL;
+ rettv->v_type = VAR_STRING;
+ rettv->vval.v_string = NULL;
#ifdef FEAT_CLIENTSERVER
- remote_common(argvars, retvar, FALSE);
+ remote_common(argvars, rettv, FALSE);
#endif
}
@@ -8147,21 +8358,21 @@ f_remote_send(argvars, retvar)
*/
/*ARGSUSED*/
static void
-f_remote_foreground(argvars, retvar)
+f_remote_foreground(argvars, rettv)
typeval *argvars;
- typeval *retvar;
+ typeval *rettv;
{
- retvar->vval.v_number = 0;
+ rettv->vval.v_number = 0;
#ifdef FEAT_CLIENTSERVER
# ifdef WIN32
/* On Win32 it's done in this application. */
- serverForeground(get_vartv_string(&argvars[0]));
+ serverForeground(get_tv_string(&argvars[0]));
# else
/* Send a foreground() expression to the server. */
argvars[1].v_type = VAR_STRING;
argvars[1].vval.v_string = vim_strsave((char_u *)"foreground()");
argvars[2].v_type = VAR_UNKNOWN;
- remote_common(argvars, retvar, TRUE);
+ remote_common(argvars, rettv, TRUE);
vim_free(argvars[1].vval.v_string);
# endif
#endif
@@ -8172,9 +8383,9 @@ f_remote_foreground(argvars, retvar)
*/
/*ARGSUSED*/
static void
-f_repeat(argvars, retvar)
+f_repeat(argvars, rettv)
typeval *argvars;
- typeval *retvar;
+ typeval *rettv;
{
char_u *p;
int n;
@@ -8183,11 +8394,11 @@ f_repeat(argvars, retvar)
char_u *r;
int i;
- p = get_vartv_string(&argvars[0]);
- n = get_vartv_number(&argvars[1]);
+ p = get_tv_string(&argvars[0]);
+ n = get_tv_number(&argvars[1]);
- retvar->v_type = VAR_STRING;
- retvar->vval.v_string = NULL;
+ rettv->v_type = VAR_STRING;
+ rettv->vval.v_string = NULL;
slen = (int)STRLEN(p);
len = slen * n;
@@ -8203,7 +8414,7 @@ f_repeat(argvars, retvar)
r[len] = NUL;
}
- retvar->vval.v_string = r;
+ rettv->vval.v_string = r;
}
#ifdef HAVE_STRFTIME
@@ -8211,26 +8422,26 @@ f_repeat(argvars, retvar)
* "strftime({format}[, {time}])" function
*/
static void
-f_strftime(argvars, retvar)
+f_strftime(argvars, rettv)
typeval *argvars;
- typeval *retvar;
+ typeval *rettv;
{
char_u result_buf[256];
struct tm *curtime;
time_t seconds;
char_u *p;
- retvar->v_type = VAR_STRING;
+ rettv->v_type = VAR_STRING;
- p = get_vartv_string(&argvars[0]);
+ p = get_tv_string(&argvars[0]);
if (argvars[1].v_type == VAR_UNKNOWN)
seconds = time(NULL);
else
- seconds = (time_t)get_vartv_number(&argvars[1]);
+ seconds = (time_t)get_tv_number(&argvars[1]);
curtime = localtime(&seconds);
/* MSVC returns NULL for an invalid value of seconds. */
if (curtime == NULL)
- retvar->vval.v_string = vim_strsave((char_u *)_("(Invalid)"));
+ rettv->vval.v_string = vim_strsave((char_u *)_("(Invalid)"));
else
{
# ifdef FEAT_MBYTE
@@ -8254,10 +8465,10 @@ f_strftime(argvars, retvar)
vim_free(p);
convert_setup(&conv, enc, p_enc);
if (conv.vc_type != CONV_NONE)
- retvar->vval.v_string = string_convert(&conv, result_buf, NULL);
+ rettv->vval.v_string = string_convert(&conv, result_buf, NULL);
else
# endif
- retvar->vval.v_string = vim_strsave(result_buf);
+ rettv->vval.v_string = vim_strsave(result_buf);
# ifdef FEAT_MBYTE
/* Release conversion descriptors */
@@ -8272,32 +8483,32 @@ f_strftime(argvars, retvar)
* "stridx()" function
*/
static void
-f_stridx(argvars, retvar)
+f_stridx(argvars, rettv)
typeval *argvars;
- typeval *retvar;
+ typeval *rettv;
{
char_u buf[NUMBUFLEN];
char_u *needle;
char_u *haystack;
char_u *pos;
- needle = get_vartv_string(&argvars[1]);
- haystack = get_vartv_string_buf(&argvars[0], buf);
+ needle = get_tv_string(&argvars[1]);
+ haystack = get_tv_string_buf(&argvars[0], buf);
pos = (char_u *)strstr((char *)haystack, (char *)needle);
if (pos == NULL)
- retvar->vval.v_number = -1;
+ rettv->vval.v_number = -1;
else
- retvar->vval.v_number = (varnumber_T) (pos - haystack);
+ rettv->vval.v_number = (varnumber_T) (pos - haystack);
}
/*
* "strridx()" function
*/
static void
-f_strridx(argvars, retvar)
+f_strridx(argvars, rettv)
typeval *argvars;
- typeval *retvar;
+ typeval *rettv;
{
char_u buf[NUMBUFLEN];
char_u *needle;
@@ -8305,8 +8516,8 @@ f_strridx(argvars, retvar)
char_u *rest;
char_u *lastmatch = NULL;
- needle = get_vartv_string(&argvars[1]);
- haystack = get_vartv_string_buf(&argvars[0], buf);
+ needle = get_tv_string(&argvars[1]);
+ haystack = get_tv_string_buf(&argvars[0], buf);
if (*needle == NUL)
/* Empty string matches past the end. */
lastmatch = haystack + STRLEN(haystack);
@@ -8320,58 +8531,58 @@ f_strridx(argvars, retvar)
}
if (lastmatch == NULL)
- retvar->vval.v_number = -1;
+ rettv->vval.v_number = -1;
else
- retvar->vval.v_number = (varnumber_T)(lastmatch - haystack);
+ rettv->vval.v_number = (varnumber_T)(lastmatch - haystack);
}
/*
* "string()" function
*/
static void
-f_string(argvars, retvar)
+f_string(argvars, rettv)
typeval *argvars;
- typeval *retvar;
+ typeval *rettv;
{
char_u *tofree;
- retvar->v_type = VAR_STRING;
- retvar->vval.v_string = tv2string(&argvars[0], &tofree);
+ rettv->v_type = VAR_STRING;
+ rettv->vval.v_string = tv2string(&argvars[0], &tofree);
if (tofree == NULL)
- retvar->vval.v_string = vim_strsave(retvar->vval.v_string);
+ rettv->vval.v_string = vim_strsave(rettv->vval.v_string);
}
/*
* "strlen()" function
*/
static void
-f_strlen(argvars, retvar)
+f_strlen(argvars, rettv)
typeval *argvars;
- typeval *retvar;
+ typeval *rettv;
{
- retvar->vval.v_number = (varnumber_T)(STRLEN(
- get_vartv_string(&argvars[0])));
+ rettv->vval.v_number = (varnumber_T)(STRLEN(
+ get_tv_string(&argvars[0])));
}
/*
* "strpart()" function
*/
static void
-f_strpart(argvars, retvar)
+f_strpart(argvars, rettv)
typeval *argvars;
- typeval *retvar;
+ typeval *rettv;
{
char_u *p;
int n;
int len;
int slen;
- p = get_vartv_string(&argvars[0]);
+ p = get_tv_string(&argvars[0]);
slen = (int)STRLEN(p);
- n = get_vartv_number(&argvars[1]);
+ n = get_tv_number(&argvars[1]);
if (argvars[2].v_type != VAR_UNKNOWN)
- len = get_vartv_number(&argvars[2]);
+ len = get_tv_number(&argvars[2]);
else
len = slen - n; /* default len: all bytes that are available. */
@@ -8391,20 +8602,20 @@ f_strpart(argvars, retvar)
else if (n + len > slen)
len = slen - n;
- retvar->v_type = VAR_STRING;
- retvar->vval.v_string = vim_strnsave(p + n, len);
+ rettv->v_type = VAR_STRING;
+ rettv->vval.v_string = vim_strnsave(p + n, len);
}
/*
* "strtrans()" function
*/
static void
-f_strtrans(argvars, retvar)
+f_strtrans(argvars, rettv)
typeval *argvars;
- typeval *retvar;
+ typeval *rettv;
{
- retvar->v_type = VAR_STRING;
- retvar->vval.v_string = transstr(get_vartv_string(&argvars[0]));
+ rettv->v_type = VAR_STRING;
+ rettv->vval.v_string = transstr(get_tv_string(&argvars[0]));
}
/*
@@ -8412,9 +8623,9 @@ f_strtrans(argvars, retvar)
*/
/*ARGSUSED*/
static void
-f_synID(argvars, retvar)
+f_synID(argvars, rettv)
typeval *argvars;
- typeval *retvar;
+ typeval *rettv;
{
int id = 0;
#ifdef FEAT_SYN_HL
@@ -8422,16 +8633,16 @@ f_synID(argvars, retvar)
long col;
int trans;
- line = get_vartv_lnum(argvars);
- col = get_vartv_number(&argvars[1]) - 1;
- trans = get_vartv_number(&argvars[2]);
+ line = get_tv_lnum(argvars);
+ col = get_tv_number(&argvars[1]) - 1;
+ trans = get_tv_number(&argvars[2]);
if (line >= 1 && line <= curbuf->b_ml.ml_line_count
&& col >= 0 && col < (long)STRLEN(ml_get(line)))
id = syn_get_id(line, col, trans);
#endif
- retvar->vval.v_number = id;
+ rettv->vval.v_number = id;
}
/*
@@ -8439,9 +8650,9 @@ f_synID(argvars, retvar)
*/
/*ARGSUSED*/
static void
-f_synIDattr(argvars, retvar)
+f_synIDattr(argvars, rettv)
typeval *argvars;
- typeval *retvar;
+ typeval *rettv;
{
char_u *p = NULL;
#ifdef FEAT_SYN_HL
@@ -8451,11 +8662,11 @@ f_synIDattr(argvars, retvar)
char_u modebuf[NUMBUFLEN];
int modec;
- id = get_vartv_number(&argvars[0]);
- what = get_vartv_string(&argvars[1]);
+ id = get_tv_number(&argvars[0]);
+ what = get_tv_string(&argvars[1]);
if (argvars[2].v_type != VAR_UNKNOWN)
{
- mode = get_vartv_string_buf(&argvars[2], modebuf);
+ mode = get_tv_string_buf(&argvars[2], modebuf);
modec = TOLOWER_ASC(mode[0]);
if (modec != 't' && modec != 'c'
#ifdef FEAT_GUI
@@ -8518,8 +8729,8 @@ f_synIDattr(argvars, retvar)
if (p != NULL)
p = vim_strsave(p);
#endif
- retvar->v_type = VAR_STRING;
- retvar->vval.v_string = p;
+ rettv->v_type = VAR_STRING;
+ rettv->vval.v_string = p;
}
/*
@@ -8527,14 +8738,14 @@ f_synIDattr(argvars, retvar)
*/
/*ARGSUSED*/
static void
-f_synIDtrans(argvars, retvar)
+f_synIDtrans(argvars, rettv)
typeval *argvars;
- typeval *retvar;
+ typeval *rettv;
{
int id;
#ifdef FEAT_SYN_HL
- id = get_vartv_number(&argvars[0]);
+ id = get_tv_number(&argvars[0]);
if (id > 0)
id = syn_get_final_id(id);
@@ -8542,16 +8753,16 @@ f_synIDtrans(argvars, retvar)
#endif
id = 0;
- retvar->vval.v_number = id;
+ rettv->vval.v_number = id;
}
/*
* "system()" function
*/
static void
-f_system(argvars, retvar)
+f_system(argvars, rettv)
typeval *argvars;
- typeval *retvar;
+ typeval *rettv;
{
char_u *res = NULL;
char_u *p;
@@ -8578,7 +8789,7 @@ f_system(argvars, retvar)
EMSG2(_(e_notopen), infile);
goto done;
}
- p = get_vartv_string_buf(&argvars[1], buf);
+ p = get_tv_string_buf(&argvars[1], buf);
if (fwrite(p, STRLEN(p), 1, fd) != 1)
err = TRUE;
if (fclose(fd) != 0)
@@ -8590,7 +8801,7 @@ f_system(argvars, retvar)
}
}
- res = get_cmd_output(get_vartv_string(&argvars[0]), infile, SHELL_SILENT);
+ res = get_cmd_output(get_tv_string(&argvars[0]), infile, SHELL_SILENT);
#ifdef USE_CR
/* translate <CR> into <NL> */
@@ -8629,40 +8840,40 @@ done:
mch_remove(infile);
vim_free(infile);
}
- retvar->v_type = VAR_STRING;
- retvar->vval.v_string = res;
+ rettv->v_type = VAR_STRING;
+ rettv->vval.v_string = res;
}
/*
* "submatch()" function
*/
static void
-f_submatch(argvars, retvar)
+f_submatch(argvars, rettv)
typeval *argvars;
- typeval *retvar;
+ typeval *rettv;
{
- retvar->v_type = VAR_STRING;
- retvar->vval.v_string = reg_submatch((int)get_vartv_number(&argvars[0]));
+ rettv->v_type = VAR_STRING;
+ rettv->vval.v_string = reg_submatch((int)get_tv_number(&argvars[0]));
}
/*
* "substitute()" function
*/
static void
-f_substitute(argvars, retvar)
+f_substitute(argvars, rettv)
typeval *argvars;
- typeval *retvar;
+ typeval *rettv;
{
char_u patbuf[NUMBUFLEN];
char_u subbuf[NUMBUFLEN];
char_u flagsbuf[NUMBUFLEN];
- retvar->v_type = VAR_STRING;
- retvar->vval.v_string = do_string_sub(
- get_vartv_string(&argvars[0]),
- get_vartv_string_buf(&argvars[1], patbuf),
- get_vartv_string_buf(&argvars[2], subbuf),
- get_vartv_string_buf(&argvars[3], flagsbuf));
+ rettv->v_type = VAR_STRING;
+ rettv->vval.v_string = do_string_sub(
+ get_tv_string(&argvars[0]),
+ get_tv_string_buf(&argvars[1], patbuf),
+ get_tv_string_buf(&argvars[2], subbuf),
+ get_tv_string_buf(&argvars[3], flagsbuf));
}
/*
@@ -8670,14 +8881,14 @@ f_substitute(argvars, retvar)
*/
/*ARGSUSED*/
static void
-f_tempname(argvars, retvar)
+f_tempname(argvars, rettv)
typeval *argvars;
- typeval *retvar;
+ typeval *rettv;
{
static int x = 'A';
- retvar->v_type = VAR_STRING;
- retvar->vval.v_string = vim_tempname(x);
+ rettv->v_type = VAR_STRING;
+ rettv->vval.v_string = vim_tempname(x);
/* Advance 'x' to use A-Z and 0-9, so that there are at least 34 different
* names. Skip 'I' and 'O', they are used for shell redirection. */
@@ -8705,15 +8916,15 @@ f_tempname(argvars, retvar)
* "tolower(string)" function
*/
static void
-f_tolower(argvars, retvar)
+f_tolower(argvars, rettv)
typeval *argvars;
- typeval *retvar;
+ typeval *rettv;
{
char_u *p;
- p = vim_strsave(get_vartv_string(&argvars[0]));
- retvar->v_type = VAR_STRING;
- retvar->vval.v_string = p;
+ p = vim_strsave(get_tv_string(&argvars[0]));
+ rettv->v_type = VAR_STRING;
+ rettv->vval.v_string = p;
if (p != NULL)
while (*p != NUL)
@@ -8748,15 +8959,15 @@ f_tolower(argvars, retvar)
* "toupper(string)" function
*/
static void
-f_toupper(argvars, retvar)
+f_toupper(argvars, rettv)
typeval *argvars;
- typeval *retvar;
+ typeval *rettv;
{
char_u *p;
- p = vim_strsave(get_vartv_string(&argvars[0]));
- retvar->v_type = VAR_STRING;
- retvar->vval.v_string = p;
+ p = vim_strsave(get_tv_string(&argvars[0]));
+ rettv->v_type = VAR_STRING;
+ rettv->vval.v_string = p;
if (p != NULL)
while (*p != NUL)
@@ -8791,9 +9002,9 @@ f_toupper(argvars, retvar)
* "tr(string, fromstr, tostr)" function
*/
static void
-f_tr(argvars, retvar)
+f_tr(argvars, rettv)
typeval *argvars;
- typeval *retvar;
+ typeval *rettv;
{
char_u *instr;
char_u *fromstr;
@@ -8812,13 +9023,13 @@ f_tr(argvars, retvar)
char_u buf2[NUMBUFLEN];
garray_T ga;
- instr = get_vartv_string(&argvars[0]);
- fromstr = get_vartv_string_buf(&argvars[1], buf);
- tostr = get_vartv_string_buf(&argvars[2], buf2);
+ instr = get_tv_string(&argvars[0]);
+ fromstr = get_tv_string_buf(&argvars[1], buf);
+ tostr = get_tv_string_buf(&argvars[2], buf2);
/* Default return value: empty string. */
- retvar->v_type = VAR_STRING;
- retvar->vval.v_string = NULL;
+ rettv->v_type = VAR_STRING;
+ rettv->vval.v_string = NULL;
ga_init2(&ga, (int)sizeof(char), 80);
#ifdef FEAT_MBYTE
@@ -8901,30 +9112,30 @@ error:
}
}
- retvar->vval.v_string = ga.ga_data;
+ rettv->vval.v_string = ga.ga_data;
}
/*
* "type(expr)" function
*/
static void
-f_type(argvars, retvar)
+f_type(argvars, rettv)
typeval *argvars;
- typeval *retvar;
+ typeval *rettv;
{
if (argvars[0].v_type == VAR_NUMBER)
- retvar->vval.v_number = 0;
+ rettv->vval.v_number = 0;
else
- retvar->vval.v_number = 1;
+ rettv->vval.v_number = 1;
}
/*
* "virtcol(string)" function
*/
static void
-f_virtcol(argvars, retvar)
+f_virtcol(argvars, rettv)
typeval *argvars;
- typeval *retvar;
+ typeval *rettv;
{
colnr_T vcol = 0;
pos_T *fp;
@@ -8936,7 +9147,7 @@ f_virtcol(argvars, retvar)
++vcol;
}
- retvar->vval.v_number = vcol;
+ rettv->vval.v_number = vcol;
}
/*
@@ -8944,26 +9155,26 @@ f_virtcol(argvars, retvar)
*/
/*ARGSUSED*/
static void
-f_visualmode(argvars, retvar)
+f_visualmode(argvars, rettv)
typeval *argvars;
- typeval *retvar;
+ typeval *rettv;
{
#ifdef FEAT_VISUAL
char_u str[2];
- retvar->v_type = VAR_STRING;
+ rettv->v_type = VAR_STRING;
str[0] = curbuf->b_visual_mode_eval;
str[1] = NUL;
- retvar->vval.v_string = vim_strsave(str);
+ rettv->vval.v_string = vim_strsave(str);
/* A non-zero number or non-empty string argument: reset mode. */
if ((argvars[0].v_type == VAR_NUMBER
&& argvars[0].vval.v_number != 0)
|| (argvars[0].v_type == VAR_STRING
- && *get_vartv_string(&argvars[0]) != NUL))
+ && *get_tv_string(&argvars[0]) != NUL))
curbuf->b_visual_mode_eval = NUL;
#else
- retvar->vval.v_number = 0; /* return anything, it won't work anyway */
+ rettv->vval.v_number = 0; /* return anything, it won't work anyway */
#endif
}
@@ -8971,17 +9182,17 @@ f_visualmode(argvars, retvar)
* "winbufnr(nr)" function
*/
static void
-f_winbufnr(argvars, retvar)
+f_winbufnr(argvars, rettv)
typeval *argvars;
- typeval *retvar;
+ typeval *rettv;
{
win_T *wp;
wp = find_win_by_nr(&argvars[0]);
if (wp == NULL)
- retvar->vval.v_number = -1;
+ rettv->vval.v_number = -1;
else
- retvar->vval.v_number = wp->w_buffer->b_fnum;
+ rettv->vval.v_number = wp->w_buffer->b_fnum;
}
/*
@@ -8989,29 +9200,29 @@ f_winbufnr(argvars, retvar)
*/
/*ARGSUSED*/
static void
-f_wincol(argvars, retvar)
+f_wincol(argvars, rettv)
typeval *argvars;
- typeval *retvar;
+ typeval *rettv;
{
validate_cursor();
- retvar->vval.v_number = curwin->w_wcol + 1;
+ rettv->vval.v_number = curwin->w_wcol + 1;
}
/*
* "winheight(nr)" function
*/
static void
-f_winheight(argvars, retvar)
+f_winheight(argvars, rettv)
typeval *argvars;
- typeval *retvar;
+ typeval *rettv;
{
win_T *wp;
wp = find_win_by_nr(&argvars[0]);
if (wp == NULL)
- retvar->vval.v_number = -1;
+ rettv->vval.v_number = -1;
else
- retvar->vval.v_number = wp->w_height;
+ rettv->vval.v_number = wp->w_height;
}
/*
@@ -9019,12 +9230,12 @@ f_winheight(argvars, retvar)
*/
/*ARGSUSED*/
static void
-f_winline(argvars, retvar)
+f_winline(argvars, rettv)
typeval *argvars;
- typeval *retvar;
+ typeval *rettv;
{
validate_cursor();
- retvar->vval.v_number = curwin->w_wrow + 1;
+ rettv->vval.v_number = curwin->w_wrow + 1;
}
/*
@@ -9032,9 +9243,9 @@ f_winline(argvars, retvar)
*/
/* ARGSUSED */
static void
-f_winnr(argvars, retvar)
+f_winnr(argvars, rettv)
typeval *argvars;
- typeval *retvar;
+ typeval *rettv;
{
int nr = 1;
#ifdef FEAT_WINDOWS
@@ -9044,7 +9255,7 @@ f_winnr(argvars, retvar)
if (argvars[0].v_type != VAR_UNKNOWN)
{
- arg = get_vartv_string(&argvars[0]);
+ arg = get_tv_string(&argvars[0]);
if (STRCMP(arg, "$") == 0)
twin = lastwin;
else if (STRCMP(arg, "#") == 0)
@@ -9064,7 +9275,7 @@ f_winnr(argvars, retvar)
for (wp = firstwin; wp != twin; wp = wp->w_next)
++nr;
#endif
- retvar->vval.v_number = nr;
+ rettv->vval.v_number = nr;
}
/*
@@ -9072,9 +9283,9 @@ f_winnr(argvars, retvar)
*/
/* ARGSUSED */
static void
-f_winrestcmd(argvars, retvar)
+f_winrestcmd(argvars, rettv)
typeval *argvars;
- typeval *retvar;
+ typeval *rettv;
{
#ifdef FEAT_WINDOWS
win_T *wp;
@@ -9095,31 +9306,31 @@ f_winrestcmd(argvars, retvar)
}
ga_append(&ga, NUL);
- retvar->vval.v_string = ga.ga_data;
+ rettv->vval.v_string = ga.ga_data;
#else
- retvar->vval.v_string = NULL;
+ rettv->vval.v_string = NULL;
#endif
- retvar->v_type = VAR_STRING;
+ rettv->v_type = VAR_STRING;
}
/*
* "winwidth(nr)" function
*/
static void
-f_winwidth(argvars, retvar)
+f_winwidth(argvars, rettv)
typeval *argvars;
- typeval *retvar;
+ typeval *rettv;
{
win_T *wp;
wp = find_win_by_nr(&argvars[0]);
if (wp == NULL)
- retvar->vval.v_number = -1;
+ rettv->vval.v_number = -1;
else
#ifdef FEAT_VERTSPLIT
- retvar->vval.v_number = wp->w_width;
+ rettv->vval.v_number = wp->w_width;
#else
- retvar->vval.v_number = Columns;
+ rettv->vval.v_number = Columns;
#endif
}
@@ -9132,7 +9343,7 @@ find_win_by_nr(vp)
#endif
int nr;
- nr = get_vartv_number(vp);
+ nr = get_tv_number(vp);
#ifdef FEAT_WINDOWS
if (nr == 0)
@@ -9161,7 +9372,7 @@ var2fpos(varp, lnum)
static pos_T pos;
pos_T *pp;
- name = get_vartv_string(varp);
+ name = get_tv_string(varp);
if (name[0] == '.') /* cursor */
return &curwin->w_cursor;
if (name[0] == '\'') /* mark */
@@ -9248,11 +9459,9 @@ get_func_len(arg, alias, evaluate)
int evaluate;
{
int len;
-#ifdef FEAT_MAGIC_BRACES
char_u *p;
char_u *expr_start;
char_u *expr_end;
-#endif
*alias = NULL; /* default to no alias */
@@ -9270,12 +9479,10 @@ get_func_len(arg, alias, evaluate)
*arg += len;
}
-#ifdef FEAT_MAGIC_BRACES
/*
- * Find the end of the name;
+ * Find the end of the name; check for {} construction.
*/
- p = find_name_end(*arg, &expr_start, &expr_end);
- /* check for {} construction */
+ p = find_name_end(*arg, &expr_start, &expr_end, FALSE);
if (expr_start != NULL)
{
char_u *temp_string;
@@ -9298,7 +9505,6 @@ get_func_len(arg, alias, evaluate)
*arg = skipwhite(p);
return (int)STRLEN(temp_string);
}
-#endif
len += get_id_len(arg);
if (len == 0)
@@ -9307,34 +9513,58 @@ get_func_len(arg, alias, evaluate)
return len;
}
+/*
+ * Find the end of a variable or function name, taking care of magic braces.
+ * If "expr_start" is not NULL then "expr_start" and "expr_end" are set to the
+ * start and end of the first magic braces item.
+ * Return a pointer to just after the name. Equal to "arg" if there is no
+ * valid name.
+ */
static char_u *
-find_name_end(arg, expr_start, expr_end)
+find_name_end(arg, expr_start, expr_end, incl_br)
char_u *arg;
char_u **expr_start;
char_u **expr_end;
+ int incl_br; /* Include [] indexes */
{
- int nesting = 0;
+ int mb_nest = 0;
+ int br_nest = 0;
char_u *p;
- *expr_start = NULL;
- *expr_end = NULL;
+ if (expr_start != NULL)
+ {
+ *expr_start = NULL;
+ *expr_end = NULL;
+ }
- for (p = arg; (*p != NUL && (eval_isnamec(*p) || nesting != 0)); ++p)
+ for (p = arg; *p != NUL
+ && (eval_isnamec(*p)
+ || (*p == '[' && incl_br)
+ || mb_nest != 0
+ || br_nest != 0); ++p)
{
-#ifdef FEAT_MAGIC_BRACES
- if (*p == '{')
+ if (mb_nest == 0)
{
- nesting++;
- if (*expr_start == NULL)
- *expr_start = p;
+ if (*p == '[')
+ ++br_nest;
+ else if (*p == ']')
+ --br_nest;
}
- else if (*p == '}')
+ if (br_nest == 0)
{
- nesting--;
- if (nesting == 0 && *expr_end == NULL)
- *expr_end = p;
+ if (*p == '{')
+ {
+ mb_nest++;
+ if (expr_start != NULL && *expr_start == NULL)
+ *expr_start = p;
+ }
+ else if (*p == '}')
+ {
+ mb_nest--;
+ if (expr_start != NULL && mb_nest == 0 && *expr_end == NULL)
+ *expr_end = p;
+ }
}
-#endif
}
return p;
@@ -9347,11 +9577,7 @@ find_name_end(arg, expr_start, expr_end)
eval_isnamec(c)
int c;
{
- return (ASCII_ISALNUM(c) || c == '_' || c == ':'
-#ifdef FEAT_MAGIC_BRACES
- || c == '{' || c == '}'
-#endif
- );
+ return (ASCII_ISALNUM(c) || c == '_' || c == ':' || c == '{' || c == '}');
}
/*
@@ -9556,10 +9782,10 @@ set_cmdarg(eap, oldarg)
* Return OK or FAIL.
*/
static int
-get_var_vartv(name, len, retvar)
+get_var_tv(name, len, rettv)
char_u *name;
int len; /* length of "name" */
- typeval *retvar; /* NULL when only checking existence */
+ typeval *rettv; /* NULL when only checking existence */
{
int ret = OK;
typeval tv;
@@ -9606,12 +9832,12 @@ get_var_vartv(name, len, retvar)
if (tv.v_type == VAR_UNKNOWN)
{
- if (retvar != NULL)
- EMSG2(_("E121: Undefined variable: %s"), name);
+ if (rettv != NULL)
+ EMSG2(_(e_undefvar), name);
ret = FAIL;
}
- else if (retvar != NULL)
- copy_vartv(&tv, retvar);
+ else if (rettv != NULL)
+ copy_tv(&tv, rettv);
name[len] = cc;
@@ -9619,20 +9845,11 @@ get_var_vartv(name, len, retvar)
}
/*
- * Allocate memory for a variable, and make it emtpy (0 or NULL value).
- */
- static VAR
-alloc_var()
-{
- return (VAR)alloc_clear((unsigned)sizeof(var));
-}
-
-/*
* Allocate memory for a variable type-value, and make it emtpy (0 or NULL
* value).
*/
static typeval *
-alloc_vartv()
+alloc_tv()
{
return (typeval *)alloc_clear((unsigned)sizeof(typeval));
}
@@ -9643,27 +9860,27 @@ alloc_vartv()
* Return NULL for out of memory, the variable otherwise.
*/
static typeval *
-alloc_string_vartv(s)
+alloc_string_tv(s)
char_u *s;
{
- typeval *retvar;
+ typeval *rettv;
- retvar = alloc_vartv();
- if (retvar != NULL)
+ rettv = alloc_tv();
+ if (rettv != NULL)
{
- retvar->v_type = VAR_STRING;
- retvar->vval.v_string = s;
+ rettv->v_type = VAR_STRING;
+ rettv->vval.v_string = s;
}
else
vim_free(s);
- return retvar;
+ return rettv;
}
/*
* Free the memory for a variable type-value.
*/
static void
-free_vartv(varp)
+free_tv(varp)
typeval *varp;
{
if (varp != NULL)
@@ -9688,7 +9905,7 @@ free_vartv(varp)
* Free the memory for a variable value and set the value to NULL or 0.
*/
static void
-clear_vartv(varp)
+clear_tv(varp)
typeval *varp;
{
if (varp != NULL)
@@ -9703,19 +9920,34 @@ clear_vartv(varp)
case VAR_LIST:
list_unref(varp->vval.v_list);
break;
- default:
+ case VAR_NUMBER:
varp->vval.v_number = 0;
break;
+ case VAR_UNKNOWN:
+ break;
+ default:
+ EMSG2(_(e_intern2), "clear_tv()");
}
}
}
/*
+ * Set the value of a variable to NULL without freeing items.
+ */
+ static void
+init_tv(varp)
+ typeval *varp;
+{
+ if (varp != NULL)
+ vim_memset(varp, 0, sizeof(typeval));
+}
+
+/*
* Get the number value of a variable.
* If it is a String variable, uses vim_str2nr().
*/
static long
-get_vartv_number(varp)
+get_tv_number(varp)
typeval *varp;
{
long n = 0L;
@@ -9743,19 +9975,19 @@ get_vartv_number(varp)
* Get the lnum from the first argument. Also accepts ".", "$", etc.
*/
static linenr_T
-get_vartv_lnum(argvars)
+get_tv_lnum(argvars)
typeval *argvars;
{
- typeval retvar;
+ typeval rettv;
linenr_T lnum;
- lnum = get_vartv_number(&argvars[0]);
+ lnum = get_tv_number(&argvars[0]);
if (lnum == 0) /* no valid number, try using line() */
{
- retvar.v_type = VAR_NUMBER;
- f_line(argvars, &retvar);
- lnum = retvar.vval.v_number;
- clear_vartv(&retvar);
+ rettv.v_type = VAR_NUMBER;
+ f_line(argvars, &rettv);
+ lnum = rettv.vval.v_number;
+ clear_tv(&rettv);
}
return lnum;
}
@@ -9769,16 +10001,16 @@ get_vartv_lnum(argvars)
* Never returns NULL;
*/
static char_u *
-get_vartv_string(varp)
+get_tv_string(varp)
typeval *varp;
{
static char_u mybuf[NUMBUFLEN];
- return get_vartv_string_buf(varp, mybuf);
+ return get_tv_string_buf(varp, mybuf);
}
static char_u *
-get_vartv_string_buf(varp, buf)
+get_tv_string_buf(varp, buf)
typeval *varp;
char_u *buf;
{
@@ -9798,7 +10030,7 @@ get_vartv_string_buf(varp, buf)
return varp->vval.v_string;
break;
default:
- EMSG(_("E999: Internal error: get_vartv_string_buf()"));
+ EMSG2(_(e_intern2), "get_tv_string_buf()");
break;
}
return (char_u *)"";
@@ -9971,7 +10203,7 @@ clear_var(v)
{
vim_free(v->v_name);
v->v_name = NULL;
- clear_vartv(&v->tv);
+ clear_tv(&v->tv);
}
/*
@@ -10046,15 +10278,15 @@ list_one_var_a(prefix, name, type, string)
}
/*
- * Set variable "name" to value in "varp".
+ * Set variable "name" to value in "tv".
* If the variable already exists, the value is updated.
* Otherwise the variable is created.
*/
static void
-set_var(name, varp, copy)
+set_var(name, tv, copy)
char_u *name;
- typeval *varp;
- int copy; /* make copy of value in "varp" */
+ typeval *tv;
+ int copy; /* make copy of value in "tv" */
{
int i;
VAR v;
@@ -10076,22 +10308,22 @@ set_var(name, varp, copy)
if (vimvars[i].type == VAR_STRING)
{
vim_free(vimvars[i].val);
- if (copy || varp->v_type != VAR_STRING)
- vimvars[i].val = vim_strsave(get_vartv_string(varp));
+ if (copy || tv->v_type != VAR_STRING)
+ vimvars[i].val = vim_strsave(get_tv_string(tv));
else
{
/* Take over the string to avoid an extra alloc/free. */
- vimvars[i].val = varp->vval.v_string;
- varp->vval.v_string = NULL;
+ vimvars[i].val = tv->vval.v_string;
+ tv->vval.v_string = NULL;
}
}
else
- vimvars[i].val = (char_u *)get_vartv_number(varp);
+ vimvars[i].val = (char_u *)get_tv_number(tv);
}
return;
}
- if (varp->v_type == VAR_FUNC)
+ if (tv->v_type == VAR_FUNC)
{
if (!(vim_strchr((char_u *)"wbs", name[0]) != NULL && name[1] == ':')
&& !ASCII_ISUPPER((name[0] != NUL && name[1] == ':')
@@ -10110,17 +10342,16 @@ set_var(name, varp, copy)
v = find_var(name, TRUE);
if (v != NULL) /* existing variable, only need to free string */
{
- if (v->tv.v_type != varp->v_type
+ if (v->tv.v_type != tv->v_type
&& !((v->tv.v_type == VAR_STRING
|| v->tv.v_type == VAR_NUMBER)
- && (varp->v_type == VAR_STRING
- || varp->v_type == VAR_NUMBER)))
+ && (tv->v_type == VAR_STRING
+ || tv->v_type == VAR_NUMBER)))
{
EMSG2(_("E999: Variable type mismatch for: %s"), name);
return;
}
- if (v->tv.v_type == VAR_STRING || v->tv.v_type == VAR_FUNC)
- vim_free(v->tv.vval.v_string);
+ clear_tv(&v->tv);
}
else /* add a new variable */
{
@@ -10147,13 +10378,12 @@ set_var(name, varp, copy)
if (i == gap->ga_len)
++gap->ga_len;
}
- if (copy || (varp->v_type != VAR_STRING && varp->v_type != VAR_FUNC))
- copy_vartv(varp, &v->tv);
+ if (copy || tv->v_type == VAR_NUMBER)
+ copy_tv(tv, &v->tv);
else
{
- v->tv.v_type = varp->v_type;
- v->tv.vval.v_string = varp->vval.v_string;
- varp->vval.v_string = NULL;
+ v->tv = *tv;
+ init_tv(tv);
}
}
@@ -10163,7 +10393,7 @@ set_var(name, varp, copy)
* Does not make a copy of a list!
*/
static void
-copy_vartv(from, to)
+copy_tv(from, to)
typeval *from;
typeval *to;
{
@@ -10190,7 +10420,7 @@ copy_vartv(from, to)
}
break;
default:
- EMSG(_("E999: Internal error: copy_vartv()"));
+ EMSG2(_(e_intern2), "copy_tv()");
break;
}
}
@@ -10205,7 +10435,7 @@ ex_echo(eap)
exarg_T *eap;
{
char_u *arg = eap->arg;
- typeval retvar;
+ typeval rettv;
char_u *tofree;
char_u *p;
int needclr = TRUE;
@@ -10216,7 +10446,7 @@ ex_echo(eap)
while (*arg != NUL && *arg != '|' && *arg != '\n' && !got_int)
{
p = arg;
- if (eval1(&arg, &retvar, !eap->skip) == FAIL)
+ if (eval1(&arg, &rettv, !eap->skip) == FAIL)
{
/*
* Report the invalid expression unless the expression evaluation
@@ -10239,7 +10469,7 @@ ex_echo(eap)
}
else if (eap->cmdidx == CMD_echo)
msg_puts_attr((char_u *)" ", echo_attr);
- for (p = tv2string(&retvar, &tofree); *p != NUL && !got_int; ++p)
+ for (p = tv2string(&rettv, &tofree); *p != NUL && !got_int; ++p)
if (*p == '\n' || *p == '\r' || *p == TAB)
{
if (*p != TAB && needclr)
@@ -10266,7 +10496,7 @@ ex_echo(eap)
}
vim_free(tofree);
}
- clear_vartv(&retvar);
+ clear_tv(&rettv);
arg = skipwhite(arg);
}
eap->nextcmd = check_nextcmd(arg);
@@ -10311,7 +10541,7 @@ ex_execute(eap)
exarg_T *eap;
{
char_u *arg = eap->arg;
- typeval retvar;
+ typeval rettv;
int ret = OK;
char_u *p;
garray_T ga;
@@ -10325,7 +10555,7 @@ ex_execute(eap)
while (*arg != NUL && *arg != '|' && *arg != '\n')
{
p = arg;
- if (eval1(&arg, &retvar, !eap->skip) == FAIL)
+ if (eval1(&arg, &rettv, !eap->skip) == FAIL)
{
/*
* Report the invalid expression unless the expression evaluation
@@ -10340,11 +10570,11 @@ ex_execute(eap)
if (!eap->skip)
{
- p = get_vartv_string(&retvar);
+ p = get_tv_string(&rettv);
len = (int)STRLEN(p);
if (ga_grow(&ga, len + 2) == FAIL)
{
- clear_vartv(&retvar);
+ clear_tv(&rettv);
ret = FAIL;
break;
}
@@ -10354,7 +10584,7 @@ ex_execute(eap)
ga.ga_len += len;
}
- clear_vartv(&retvar);
+ clear_tv(&rettv);
arg = skipwhite(arg);
}
@@ -10432,9 +10662,7 @@ ex_function(eap)
char_u *theline;
int j;
int c;
-#ifdef FEAT_MAGIC_BRACES
int saved_did_emsg;
-#endif
char_u *name = NULL;
char_u *p;
char_u *arg;
@@ -10476,12 +10704,10 @@ ex_function(eap)
else
eap->skip = TRUE;
}
-#ifdef FEAT_MAGIC_BRACES
/* An error in a function call during evaluation of an expression in magic
* braces should not cause the function not to be defined. */
saved_did_emsg = did_emsg;
did_emsg = FALSE;
-#endif
/*
* ":function func" with only function name: list function.
@@ -10784,9 +11010,7 @@ ex_function(eap)
fp->flags = flags;
fp->calls = 0;
fp->script_ID = current_SID;
-#ifdef FEAT_MAGIC_BRACES
did_emsg |= saved_did_emsg;
-#endif
vim_free(skip_until);
return;
@@ -10796,9 +11020,7 @@ erret:
ga_clear_strings(&newlines);
erret_name:
vim_free(name);
-#ifdef FEAT_MAGIC_BRACES
did_emsg |= saved_did_emsg;
-#endif
}
/*
@@ -10826,14 +11048,13 @@ trans_function_name(pp, skip, internal)
lead = eval_fname_script(start);
if (lead > 0)
start += lead;
- end = find_name_end(start, &expr_start, &expr_end);
+ end = find_name_end(start, &expr_start, &expr_end, FALSE);
if (end == start)
{
if (!skip)
EMSG(_("E129: Function name required"));
return NULL;
}
-#ifdef FEAT_MAGIC_BRACES
if (expr_start != NULL && !skip)
{
/* expand magic curlies */
@@ -10855,7 +11076,6 @@ trans_function_name(pp, skip, internal)
len = (int)STRLEN(temp_string);
}
else
-#endif
len = (int)(end - start);
/*
@@ -11129,11 +11349,11 @@ ex_delfunction(eap)
* Call a user function.
*/
static void
-call_user_func(fp, argcount, argvars, retvar, firstline, lastline)
+call_user_func(fp, argcount, argvars, rettv, firstline, lastline)
ufunc_T *fp; /* pointer to function */
int argcount; /* nr of args */
typeval *argvars; /* arguments */
- typeval *retvar; /* return value */
+ typeval *rettv; /* return value */
linenr_T firstline; /* first line of range */
linenr_T lastline; /* last line of range */
{
@@ -11149,8 +11369,8 @@ call_user_func(fp, argcount, argvars, retvar, firstline, lastline)
if (depth >= p_mfd)
{
EMSG(_("E132: Function call depth is higher than 'maxfuncdepth'"));
- retvar->v_type = VAR_NUMBER;
- retvar->vval.v_number = -1;
+ rettv->v_type = VAR_NUMBER;
+ rettv->vval.v_number = -1;
return;
}
++depth;
@@ -11162,8 +11382,8 @@ call_user_func(fp, argcount, argvars, retvar, firstline, lastline)
fc.func = fp;
fc.argcount = argcount;
fc.argvars = argvars;
- fc.retvar = retvar;
- retvar->vval.v_number = 0;
+ fc.rettv = rettv;
+ rettv->vval.v_number = 0;
fc.linenr = 0;
fc.returned = FALSE;
fc.level = ex_nesting_level;
@@ -11216,7 +11436,7 @@ call_user_func(fp, argcount, argvars, retvar, firstline, lastline)
msg_outnum((long)argvars[i].vval.v_number);
else
{
- trunc_string(get_vartv_string(&argvars[i]),
+ trunc_string(get_tv_string(&argvars[i]),
buf, MSG_BUF_LEN);
msg_puts((char_u *)"\"");
msg_puts(buf);
@@ -11242,11 +11462,11 @@ call_user_func(fp, argcount, argvars, retvar, firstline, lastline)
--RedrawingDisabled;
/* when the function was aborted because of an error, return -1 */
- if ((did_emsg && (fp->flags & FC_ABORT)) || retvar->v_type == VAR_UNKNOWN)
+ if ((did_emsg && (fp->flags & FC_ABORT)) || rettv->v_type == VAR_UNKNOWN)
{
- clear_vartv(retvar);
- retvar->v_type = VAR_NUMBER;
- retvar->vval.v_number = -1;
+ clear_tv(rettv);
+ rettv->v_type = VAR_NUMBER;
+ rettv->vval.v_number = -1;
}
/* when being verbose, mention the return value */
@@ -11264,12 +11484,12 @@ call_user_func(fp, argcount, argvars, retvar, firstline, lastline)
if (aborting())
smsg((char_u *)_("%s aborted"), sn);
- else if (fc.retvar->v_type == VAR_NUMBER)
+ else if (fc.rettv->v_type == VAR_NUMBER)
smsg((char_u *)_("%s returning #%ld"), sn,
- (long)fc.retvar->vval.v_number);
- else if (fc.retvar->v_type == VAR_STRING)
+ (long)fc.rettv->vval.v_number);
+ else if (fc.rettv->v_type == VAR_STRING)
{
- val = get_vartv_string(fc.retvar);
+ val = get_tv_string(fc.rettv);
if (STRLEN(val) > IOSIZE / 2 - 50)
val = val + STRLEN(val) - (IOSIZE / 2 - 50);
smsg((char_u *)_("%s returning \"%s\""), sn, val);
@@ -11309,7 +11529,7 @@ ex_return(eap)
exarg_T *eap;
{
char_u *arg = eap->arg;
- var retvar;
+ typeval rettv;
int returning = FALSE;
if (current_funccal == NULL)
@@ -11323,12 +11543,12 @@ ex_return(eap)
eap->nextcmd = NULL;
if ((*arg != NUL && *arg != '|' && *arg != '\n')
- && eval0(arg, &retvar, &eap->nextcmd, !eap->skip) != FAIL)
+ && eval0(arg, &rettv, &eap->nextcmd, !eap->skip) != FAIL)
{
if (!eap->skip)
- returning = do_return(eap, FALSE, TRUE, &retvar);
+ returning = do_return(eap, FALSE, TRUE, &rettv);
else
- clear_vartv(&retvar.tv);
+ clear_tv(&rettv);
}
/* It's safer to return also on error. */
else if (!eap->skip)
@@ -11357,16 +11577,16 @@ ex_return(eap)
* Return from a function. Possibly makes the return pending. Also called
* for a pending return at the ":endtry" or after returning from an extra
* do_cmdline(). "reanimate" is used in the latter case. "is_cmd" is set
- * when called due to a ":return" command. "value" may point to a variable
- * with the return value. Returns TRUE when the return can be carried out,
+ * when called due to a ":return" command. "rettv" may point to a typeval
+ * with the return rettv. Returns TRUE when the return can be carried out,
* FALSE when the return gets pending.
*/
int
-do_return(eap, reanimate, is_cmd, value)
+do_return(eap, reanimate, is_cmd, rettv)
exarg_T *eap;
int reanimate;
int is_cmd;
- void *value;
+ void *rettv;
{
int idx;
struct condstack *cstack = eap->cstack;
@@ -11387,38 +11607,38 @@ do_return(eap, reanimate, is_cmd, value)
cstack->cs_pending[idx] = CSTP_RETURN;
if (!is_cmd && !reanimate)
- /* A pending return again gets pending. "value" points to an
- * allocated variable with the value of the original ":return"'s
+ /* A pending return again gets pending. "rettv" points to an
+ * allocated variable with the rettv of the original ":return"'s
* argument if present or is NULL else. */
- cstack->cs_retvar[idx] = value;
+ cstack->cs_rettv[idx] = rettv;
else
{
/* When undoing a return in order to make it pending, get the stored
- * return value. */
+ * return rettv. */
if (reanimate)
- value = current_funccal->retvar;
+ rettv = current_funccal->rettv;
- if (value != NULL)
+ if (rettv != NULL)
{
/* Store the value of the pending return. */
- if ((cstack->cs_retvar[idx] = alloc_var()) != NULL)
- *(typeval *)cstack->cs_retvar[idx] = *(typeval *)value;
+ if ((cstack->cs_rettv[idx] = alloc_tv()) != NULL)
+ *(typeval *)cstack->cs_rettv[idx] = *(typeval *)rettv;
else
EMSG(_(e_outofmem));
}
else
- cstack->cs_retvar[idx] = NULL;
+ cstack->cs_rettv[idx] = NULL;
if (reanimate)
{
/* The pending return value could be overwritten by a ":return"
* without argument in a finally clause; reset the default
* return value. */
- current_funccal->retvar->v_type = VAR_NUMBER;
- current_funccal->retvar->vval.v_number = 0;
+ current_funccal->rettv->v_type = VAR_NUMBER;
+ current_funccal->rettv->vval.v_number = 0;
}
}
- report_make_pending(CSTP_RETURN, value);
+ report_make_pending(CSTP_RETURN, rettv);
}
else
{
@@ -11427,12 +11647,12 @@ do_return(eap, reanimate, is_cmd, value)
/* If the return is carried out now, store the return value. For
* a return immediately after reanimation, the value is already
* there. */
- if (!reanimate && value != NULL)
+ if (!reanimate && rettv != NULL)
{
- clear_vartv(current_funccal->retvar);
- *current_funccal->retvar = *(typeval *)value;
+ clear_tv(current_funccal->rettv);
+ *current_funccal->rettv = *(typeval *)rettv;
if (!is_cmd)
- vim_free(value);
+ vim_free(rettv);
}
}
@@ -11443,34 +11663,34 @@ do_return(eap, reanimate, is_cmd, value)
* Free the variable with a pending return value.
*/
void
-discard_pending_return(retvar)
- void *retvar;
+discard_pending_return(rettv)
+ void *rettv;
{
- /* The variable was copied from one with an undefined v_name. So we can't
- * use free_vartv() to clear and free it. */
- clear_vartv(&((VAR)retvar)->tv);
- vim_free(retvar);
+ free_tv((typeval *)rettv);
}
/*
- * Generate a return command for producing the value of "retvar". The result
+ * Generate a return command for producing the value of "rettv". The result
* is an allocated string. Used by report_pending() for verbose messages.
*/
char_u *
-get_return_cmd(retvar)
- void *retvar;
+get_return_cmd(rettv)
+ void *rettv;
{
- char_u *s = IObuff;
+ char_u *s;
+ char_u *tofree = NULL;
- if (retvar == NULL || ((VAR)retvar)->tv.v_type == VAR_UNKNOWN)
- s = (char_u *)":return";
- else if (((VAR)retvar)->tv.v_type == VAR_STRING)
- sprintf((char *)IObuff, ":return \"%s\"",
- ((VAR)retvar)->tv.vval.v_string);
+ if (rettv == NULL)
+ s = (char_u *)"";
else
- sprintf((char *)IObuff, ":return %ld",
- (long)(((VAR)retvar)->tv.vval.v_number));
- return vim_strsave(s);
+ s = tv2string((typeval *)rettv, &tofree);
+
+ STRCPY(IObuff, ":return ");
+ STRNCPY(IObuff + 8, s, IOSIZE - 8);
+ if (STRLEN(s) + 8 >= IOSIZE)
+ STRCPY(IObuff + IOSIZE - 4, "...");
+ vim_free(tofree);
+ return vim_strsave(IObuff);
}
/*
@@ -11586,7 +11806,7 @@ read_viminfo_varlist(virp, writing)
{
char_u *tab;
int is_string = FALSE;
- typeval *vartvp = NULL;
+ typeval *tvp = NULL;
char_u *val;
if (!writing && (find_viminfo_parameter('!') != NULL))
@@ -11601,28 +11821,28 @@ read_viminfo_varlist(virp, writing)
tab = vim_strchr(tab, '\t');
if (tab != NULL)
{
- /* create a nameless variable to hold the value */
+ /* create a typeval to hold the value */
if (is_string)
{
val = viminfo_readstring(virp,
(int)(tab - virp->vir_line + 1), TRUE);
if (val != NULL)
- vartvp = alloc_string_vartv(val);
+ tvp = alloc_string_tv(val);
}
else
{
- vartvp = alloc_vartv();
- if (vartvp != NULL)
+ tvp = alloc_tv();
+ if (tvp != NULL)
{
- vartvp->v_type = VAR_NUMBER;
- vartvp->vval.v_number = atol((char *)tab + 1);
+ tvp->v_type = VAR_NUMBER;
+ tvp->vval.v_number = atol((char *)tab + 1);
}
}
/* assign the value to the variable */
- if (vartvp != NULL)
+ if (tvp != NULL)
{
- set_var(virp->vir_line + 1, vartvp, FALSE);
- free_vartv(vartvp);
+ set_var(virp->vir_line + 1, tvp, FALSE);
+ free_tv(tvp);
}
}
}
@@ -11641,6 +11861,8 @@ write_viminfo_varlist(fp)
garray_T *gap = &variables; /* global variable */
VAR this_var;
int i;
+ char *s;
+ char_u *tofree;
if (find_viminfo_parameter('!') == NULL)
return;
@@ -11652,9 +11874,19 @@ write_viminfo_varlist(fp)
if (this_var->v_name != NULL
&& var_flavour(this_var->v_name) == VAR_FLAVOUR_VIMINFO)
{
- fprintf(fp, "!%s\t%s\t", this_var->v_name,
- (this_var->tv.v_type == VAR_STRING) ? "STR" : "NUM");
- viminfo_writestring(fp, get_var_string(this_var));
+ switch (this_var->tv.v_type)
+ {
+ case VAR_STRING: s = "STR"; break;
+ case VAR_NUMBER: s = "NUM"; break;
+ case VAR_LIST: s = "LST"; break;
+ case VAR_FUNC: s = "FUN"; break;
+ default:
+ EMSGN(_("E999: Internal error: write_viminfo_varlist(): %ld"), (long)this_var->tv.v_type);
+ s = "ERR";
+ }
+ fprintf(fp, "!%s\t%s\t", this_var->v_name, s);
+ viminfo_writestring(fp, tv2string(&this_var->tv, &tofree));
+ vim_free(tofree);
}
}
}
diff --git a/src/gui_amiga.c b/src/gui_amiga.c
deleted file mode 100644
index 0b76245fd..000000000
--- a/src/gui_amiga.c
+++ /dev/null
@@ -1,1812 +0,0 @@
-/* vi:set ts=8 sts=4 sw=4:
- *
- * VIM - Vi IMproved by Bram Moolenaar
- * Amiga GUI support by Michael Nielsen
- *
- * Do ":help uganda" in Vim to read copying and usage conditions.
- * Do ":help credits" in Vim to see a list of people who contributed.
- * See README.txt for an overview of the Vim source code.
- */
-
-#include <stdlib.h>
-#include <string.h>
-#include <exec/types.h>
-#include <intuition/intuition.h>
-#include <utility/tagitem.h>
-#include <graphics/text.h>
-#include <graphics/rastport.h>
-#include <graphics/layers.h>
-#include <proto/intuition.h>
-#include <proto/graphics.h>
-#include <proto/layers.h>
-#include <devices/timer.h>
-#include <assert.h>
-#include "vim.h"
-#include "gui_amiga.h"
-#include <math.h>
-#include <limits.h>
-
-#ifdef __AROS__
-#include <aros/debug.h>
-#endif
-
-#include "version.h"
-
-#if defined(FEAT_GUI_AMIGA) || defined(PROTO)
-
-#define KEYUP 76
-#define KEYDOWN 77
-#define KEYRIGHT 78
-#define KEYLEFT 79
-#define KEYBACKSPACE 0x41
-#define KEYDELETE 0x46
-#define KEYINSERT 0x47
-#define KEYHOME 0x70
-#define KEYEND 0x71
-#define KEYWHEELUP 0x7A
-#define KEYWHEELDOWN 0x7B
-
-/* When generating prototypes on Unix, these need to be defined */
-#ifdef PROTO
-# define STRPTR char *
-# define BOOL int
-# define UBYTE int
-#endif
-
-static struct PropInfo Gadget2SInfo = { AUTOKNOB+PROPBORDERLESS+FREEVERT+PROPNEWLOOK, 0, 0, MAXBODY, MAXBODY, };
-//static struct Image Image1 = { 0, 0, 10, 397, 0, NULL, 0x0000, 0x0000, NULL };
-static struct Gadget propGadget = { NULL, -12, 15, 10, -28,
- GFLG_RELRIGHT+GFLG_RELHEIGHT,
- GACT_RELVERIFY+GACT_RIGHTBORDER+GACT_IMMEDIATE,
- GTYP_PROPGADGET+GTYP_GZZGADGET,
- NULL, NULL,
- NULL, NULL, (APTR)&Gadget2SInfo, NULL, NULL };
-
-static struct timerequest *TimerIO;
-static struct MsgPort *TimerMP;
-static BOOL TimerSent;
-
-struct GFXBase *gfxBase;
-struct ExecBase *execBase;
-struct LayersBase *layersBase;
-
-struct MyColor
-{
- WORD pen;
- BOOL alloced;
-};
-
-struct MyColor MyColorTable[256];
-
-struct TagItem tags[] =
-{
- {WA_Left, 0},
- {WA_Top, 0},
- {WA_Width, 400},
- {WA_Height, 400},
- {WA_Title, (ULONG)VIM_VERSION_SHORT},
- {WA_ScreenTitle, (ULONG)VIM_VERSION_LONG},
- {WA_DragBar, TRUE}, /* enable dragging of the window */
- {WA_DepthGadget, TRUE}, /* enable the depth gadget */
- {WA_CloseGadget, TRUE}, /* enable the close gadget*/
- {WA_SizeGadget, TRUE}, /* enable the size gadget */
- {WA_SizeBBottom, TRUE}, /* sizegadget contained in bottom border */
- {WA_SmartRefresh, TRUE}, /* choose smart refresh, saves us doing a lot of work */
- {WA_ReportMouse, TRUE}, /* Report the position of the mouse */
- {WA_GimmeZeroZero, TRUE},
- {WA_Activate, TRUE}, /* Activate window on startup */
- {WA_Activate, TRUE}, /* Activate window on startup */
- {WA_NoCareRefresh, TRUE}, /* Refresh screen, don't tell us */
- {WA_NewLookMenus, TRUE}, /* use the new options for the menu */
- {WA_AutoAdjust, TRUE}, /* If window is too big for screen adjust size*/
- {WA_NoCareRefresh, TRUE}, /* If window is too big for screen adjust size*/
- {WA_MouseQueue, 1}, /* Limit number of pending mouse movement*/
- {WA_RptQueue, 10}, /* Limit number of pending keystrokes*/
- {WA_IDCMP, /* IDCMP, what events interest us */
- IDCMP_NEWSIZE /* Notify us about size change of window*/
- |IDCMP_REFRESHWINDOW /* Notify us when the window needs refreshing */
- |IDCMP_MOUSEBUTTONS /* Notify us when the mouse buttons have been used */
- |IDCMP_MOUSEMOVE /* Notify us when the mouse is moving */
- |IDCMP_GADGETDOWN /* Notify us when a gadget has been selected */
- |IDCMP_GADGETUP /* Notify us when a gadget has been released */
- |IDCMP_MENUPICK /* Notify us when a menu has been picked */
- |IDCMP_CLOSEWINDOW /* Notify us when the user tries to close the window */
- |IDCMP_VANILLAKEY /* Notify us about keystrokes */
- |IDCMP_RAWKEY /* Notify us when raw key events have been used, ie cursor*/
- |IDCMP_INTUITICKS /* Simpler timer for the blink option */
- |IDCMP_MENUHELP /* Allow the help key to be used during menu events */
- |IDCMP_GADGETHELP /* Allow the help key to be used during gadget events */
- |IDCMP_INACTIVEWINDOW /* notify of inactive window */
- |IDCMP_ACTIVEWINDOW /* notify of inactive window */
- },
- {TAG_DONE, NULL}
-};
-
-#if defined(D)
-#undef D
-#endif
-
-/*#define D(_msg) fprintf(stderr, "%s\n", _msg)*/
-
-#define D(_A)
-#define kprintf(s, ...)
-
-static void AmigaError(const char *string);
-
-void HandleEvent(unsigned long * object);
-static UBYTE getrealcolor(guicolor_T i);
-
-static struct NewWindow vimNewWindow =
-{
- 0, 0, /* window XY origin relative to TopLeft of screen */
- 0, 0, /* window width and height */
- 0, 1, /* detail and block pens */
- NULL, /* IDCMP flags */
- NULL, /* other window flags */
- &propGadget, /* first gadget in gadget list */
- NULL, /* custom CHECKMARK imagery */
- "Amiga Vim gui", /* window title */
- NULL, /* custom screen pointer */
- NULL, /* custom bitmap */
- 50, 50, /* minimum width and height */
- (unsigned short)-1, (unsigned short)-1, /* maximum width and height */
- WBENCHSCREEN /* destination screen type */
-};
-
-static struct
-{
- unsigned int key_sym;
- char_u vim_code0;
- char_u vim_code1;
-} special_keys[] =
-{
- {0, 0, 0}
-};
-
-#if 0
- /* not used? */
- static int
-hex_digit(int c)
-{
- if (isdigit(c))
- return c - '0';
- c = TOLOWER_ASC(c);
- if (c >= 'a' && c <= 'f')
- return c - 'a' + 10;
- return -1000;
-}
-#endif
-
-static int characterWidth = -1;
-static int characterHeight = -1;
-static struct
-{
- BOOL active;
- enum
- {
- CursorOff,
- CursorOn,
- CursorWait
- } state;
- int onTime;
- int offTime;
- int waitTime;
- int current;
-} cursor =
-{
- TRUE,
- CursorWait,
- 10,
- 10,
- 7,
- 0
-};
-
-enum DrawBoxMode
-{
- DB_Filled,
- DB_NotFilled
-};
-
- static void
-TextDimensions(void)
-{
- struct TextExtent textExt;
-
- TextExtent(gui.window->RPort, "s", 1, &textExt);
-
- characterWidth = textExt.te_Width;
- characterHeight = textExt.te_Height;
-}
-
- static int
-posWidthCharToPoint(int width)
-{
- return (width)*characterWidth;
-}
-
- static int
-posHeightCharToPoint(int height)
-{
- return (int)(height)*characterHeight;
-}
-
- static int
-posWidthPointToChar(int width)
-{
- //return (int)floor((float)width/(float)characterWidth)-1;
- return width /characterWidth;
-}
-
- static int
-posHeightPointToChar(int height)
-{
- //return (int)floor((float)height/(float)characterHeight)-2;
- return height / characterHeight;
-}
-
- static int
-widthCharToPoint(int width)
-{
- return (width)*(characterWidth);
-}
-
- static int
-heightCharToPoint(int height)
-{
- return (height)*characterHeight;
-}
-
- static int
-widthPointToChar(int width)
-{
- return (width)/characterWidth;
-}
-
- static int
-heightPointToChar(int height)
-{
- return (height)/characterHeight;
-}
-
- static void
-refreshBorder(void)
-{
- /*WaitBOVP(gui.window->);*/
- RefreshWindowFrame(gui.window);
-}
-
- static void
-drawBox(enum DrawBoxMode mode, unsigned short col, unsigned short row, int w, int h, guicolor_T color)
-{
- LONG apen = GetAPen(gui.window->RPort);
- LONG x1, y1, x2, y2;
-
-kprintf(" drawbox %d,%d color %d\n", col, row, color);
-
- SetAPen(gui.window->RPort, getrealcolor(color));
-
- x1 = posWidthCharToPoint(col);
- y1 = posHeightCharToPoint(row + 1) - h;
- x2 = x1 + w - 1;
- y2 = posHeightCharToPoint(row + 1) - 1;
-
- switch(mode)
- {
- case DB_Filled:
- RectFill(gui.window->RPort, x1, y1, x2, y2);
- break;
-
- case DB_NotFilled:
- Move(gui.window->RPort, x1, y1);
- Draw(gui.window->RPort, x2, y1);
- Draw(gui.window->RPort, x2, y2);
- Draw(gui.window->RPort, x1, y2);
- Draw(gui.window->RPort, x1, y1);
- break;
- }
-
- SetAPen(gui.window->RPort, apen);
-
-}
-
- static enum event
-EventHandler(void)
-{
- struct IntuiMessage *msg;
- enum event returnEvent = ev_Ignore;
- int class, code;
- static int dragging = 0;
- static int mouseX, mouseY;
- char_u string[40];
- BOOL quit_request = FALSE;
-
- msg = (struct IntuiMessage *)GetMsg(gui.window->UserPort);
-
- if (!msg)
- {
- returnEvent = ev_NullEvent;
- }
- else
- {
-
- class = msg->Class;
- code = msg->Code;
-
- switch(class)
- {
- case IDCMP_INTUITICKS:
- /*
- if (cursor.active)
- {
- cursor.current ++;
- if (cursor.state == CursorOff)
- {
- printf("cursor turned on\n");
- if (cursor.offTime < cursor.current)
- {
- gui_undraw_cursor();
- cursor.state = CursorOn;
- cursor.current = 0;
- }
- }
- else if (cursor.state == CursorOn)
- {
- printf("cursor turned off\n");
- if (cursor.onTime < cursor.current)
- {
- cursor.state = CursorOff;
- gui_update_cursor(FALSE);
- cursor.current = 0;
- }
- }
- else if (cursor.state == CursorWait)
- {
- printf("cursor turned Wait\n");
- if (cursor.waitTime < cursor.current)
- {
- cursor.state = CursorOn;
- cursor.current = 0;
- }
- }
- }
- else
- {
- }
- returnEvent = ev_IntuiTicks;
- */
- break;
-
- case IDCMP_MOUSEBUTTONS:
- {
- int vim_modifiers=0;
- D("Mouse button event detected");
- switch (msg->Qualifier )
- {
- case IEQUALIFIER_LALT:
- case IEQUALIFIER_RALT:
- D("detected a Alt key");
- vim_modifiers|=MOUSE_ALT;
- break;
-
- case IEQUALIFIER_LSHIFT:
- case IEQUALIFIER_RSHIFT:
- D("detected a Shift key");
- vim_modifiers|=MOUSE_SHIFT;
- break;
- case IEQUALIFIER_CONTROL:
- D("detected a Control key");
- vim_modifiers |= MOUSE_CTRL;
- break;
- }
- if (code == SELECTDOWN)
- {
- D("Select Down detected\n");
- dragging = 1;
- gui_send_mouse_event(MOUSE_LEFT,
- mouseX = msg->MouseX - gui.window->BorderLeft,
- mouseY = msg->MouseY - gui.window->BorderTop,
- FALSE,
- vim_modifiers);
- /*gui_start_highlight(HL_ALL);*/
- }
- else if (code == SELECTUP)
- {
- D("Select UP detected\n");
- dragging = 0;
- gui_send_mouse_event(MOUSE_RELEASE,
- msg->MouseX - gui.window->BorderLeft,
- msg->MouseY - gui.window->BorderTop,
- FALSE, vim_modifiers);
- /*gui_stop_highlight(mask);*/
- }
- returnEvent = ev_MouseButtons;
- break;
- }
- case IDCMP_MOUSEMOVE:
- if ((abs(mouseX-(msg->MouseX - gui.window->BorderLeft)) > characterWidth) ||
- (abs(mouseY-(msg->MouseY - gui.window->BorderTop))>characterHeight))
- {
- int vim_modifiers=0;
-
- switch (msg->Qualifier )
- {
- case IEQUALIFIER_LALT:
- case IEQUALIFIER_RALT:
- D("detected a Alt key");
- vim_modifiers|=MOUSE_ALT;
- break;
-
- case IEQUALIFIER_LSHIFT:
- case IEQUALIFIER_RSHIFT:
- D("detected a Shift key");
- vim_modifiers|=MOUSE_SHIFT;
- break;
- case IEQUALIFIER_CONTROL:
- D("detected a Control key");
- vim_modifiers |= MOUSE_CTRL;
- break;
- }
-
- mouseX = msg->MouseX - gui.window->BorderLeft;
- mouseY = msg->MouseY - gui.window->BorderTop;
- if (!dragging)
- {
- gui_send_mouse_event(MOUSE_SETPOS, mouseX, mouseY, FALSE, vim_modifiers);
- break;
- }
- else
- {
- D("dragging\n");
- gui_send_mouse_event(MOUSE_DRAG, mouseX, mouseY, FALSE, vim_modifiers);
- }
- }
- returnEvent = ev_MouseMove;
- break;
- case IDCMP_VANILLAKEY:
-kprintf("===vanillakey %d\n", code);
- {
- string[0] = (char_u)code;
- if (code == CSI)
- {
- /* Insert CSI as K_CSI. Untested! */
- string[1] = KS_EXTRA;
- string[2] = (int)KE_CSI;
- add_to_input_buf(string, 3);
- }
- else if (code == 8)
- {
- string[0] = CSI;
- string[1] = 'k';
- string[2] = 'b';
- add_to_input_buf(string, 3);
- }
- else if (code == 127)
- {
- string[0] = CSI;
- string[1] = 'k';
- string[2] = 'D';
- add_to_input_buf(string, 3);
- }
- else
- {
- int len = 1;
-
- if (input_conv.vc_type != CONV_NONE)
- len = convert_input(string, 1, sizeof(string));
- add_to_input_buf(string, len);
- }
- returnEvent = ev_KeyStroke;
- break;
-
- case IDCMP_RAWKEY:
- if (msg->Qualifier & IEQUALIFIER_LSHIFT)
- {
- }
- else if (msg->Qualifier & IEQUALIFIER_RSHIFT)
- {
- }
- else if (msg->Qualifier & IEQUALIFIER_CONTROL)
- {
- if (code == 33)
- {
- trash_input_buf();
- }
- }
- else if (msg->Code == KEYUP)
- {
- string[0] = CSI;
- string[1] = 'k';
- string[2] = 'u';
- add_to_input_buf(string, 3);
- }
- else if (msg->Code == KEYLEFT)
- {
- string[0] = CSI;
- string[1] = 'k';
- string[2] = 'l';
- add_to_input_buf(string, 3);
- }
- else if (msg->Code == KEYRIGHT)
- {
-kprintf("## keyright");
- string[0] = CSI;
- string[1] = 'k';
- string[2] = 'r';
- add_to_input_buf(string, 3);
- }
- else if (msg->Code == KEYDOWN)
- {
- string[0] = CSI;
- string[1] = 'k';
- string[2] = 'd';
- add_to_input_buf(string, 3);
- }
- else if (msg->Code == KEYBACKSPACE)
- {
- string[0] = CSI;
- string[1] = 'k';
- string[2] = 'b';
- add_to_input_buf(string, 3);
- }
- else if (msg->Code == KEYDELETE)
- {
- string[0] = CSI;
- string[1] = 'k';
- string[2] = 'D';
- add_to_input_buf(string, 3);
- }
- else if (msg->Code == KEYINSERT)
- {
- string[0] = CSI;
- string[1] = 'k';
- string[2] = 'I';
- add_to_input_buf(string, 3);
- }
- else if (msg->Code == KEYHOME)
- {
- string[0] = CSI;
- string[1] = 'k';
- string[2] = 'h';
- add_to_input_buf(string, 3);
- }
- else if (msg->Code == KEYEND)
- {
- string[0] = CSI;
- string[1] = '@';
- string[2] = '7';
- add_to_input_buf(string, 3);
- }
- else if (msg->Code == KEYWHEELUP)
- {
- int vim_modifiers=0;
-
- switch (msg->Qualifier )
- {
- case IEQUALIFIER_LALT:
- case IEQUALIFIER_RALT:
- D("detected a Alt key");
- vim_modifiers|=MOUSE_ALT;
- break;
-
- case IEQUALIFIER_LSHIFT:
- case IEQUALIFIER_RSHIFT:
- D("detected a Shift key");
- vim_modifiers|=MOUSE_SHIFT;
- break;
- case IEQUALIFIER_CONTROL:
- D("detected a Control key");
- vim_modifiers |= MOUSE_CTRL;
- break;
- }
- gui_send_mouse_event(MOUSE_4, 0, 1, FALSE, vim_modifiers);
-
- }
- else if (msg->Code == KEYWHEELDOWN)
- {
- int vim_modifiers=0;
-
- switch (msg->Qualifier )
- {
- case IEQUALIFIER_LALT:
- case IEQUALIFIER_RALT:
- D("detected a Alt key");
- vim_modifiers|=MOUSE_ALT;
- break;
-
- case IEQUALIFIER_LSHIFT:
- case IEQUALIFIER_RSHIFT:
- D("detected a Shift key");
- vim_modifiers|=MOUSE_SHIFT;
- break;
- case IEQUALIFIER_CONTROL:
- D("detected a Control key");
- vim_modifiers |= MOUSE_CTRL;
- break;
- }
- gui_send_mouse_event(MOUSE_5, 0, 1, FALSE, vim_modifiers);
- }
-
- returnEvent = ev_KeyStroke;
- break;
- }
- case IDCMP_MENUVERIFY:
- returnEvent = ev_MenuVerify;
- /* Menu verification requested */
- switch (code)
- {
- case MENUWAITING:
- /*
- ** It's not for us, the user is accessing another
- ** programs menu, this is a good time to do some
- ** cleanup etc
- */
- break;
- case MENUHOT:
- /*
- ** It is our menu that is going hot, we have kontrol
- ** Menu action can be cancelled by
- ** msg->Code = MENUCANCEL;
- */
- break;
- default:
- break;
- }
- break;
- case IDCMP_MENUPICK:
- returnEvent = ev_MenuPick;
- {
- /*
- ** one of our menu's have been selected, let's find out which
- */
- union myMenuItemUnion *item;
- int menuNumber;
-
- menuNumber = code;
-
- item = (union myMenuItemUnion *) ItemAddress(gui.menu, menuNumber);
-
-
- if (item)
- {
- gui_menu_cb(item->myMenuItem.guiMenu);
- }
- }
- break;
- case IDCMP_CLOSEWINDOW:
- quit_request = TRUE;
- break;
-
- case IDCMP_NEWSIZE:
- {
- int cx, cy;
- //cx = widthPointToChar(gui.window->GZZWidth);
- //cy = heightPointToChar(gui.window->GZZHeight);
-
- cx = gui.window->GZZWidth;
- cy = gui.window->GZZHeight - characterHeight;
-
- gui_resize_shell(cx, cy);
-
- returnEvent = ev_NewSize;
- break;
- }
- case IDCMP_REFRESHWINDOW:
- refreshBorder();
- returnEvent = ev_RefreshWindow;
- break;
- case IDCMP_GADGETDOWN:
- returnEvent = ev_GadgetDown;
- break;
- case IDCMP_GADGETUP:
- returnEvent = ev_GadgetUp;
- break;
- case IDCMP_MENUHELP:
- returnEvent = ev_MenuHelp;
- break;
- case IDCMP_GADGETHELP:
- returnEvent = ev_GadgetHelp;
- break;
- case IDCMP_INACTIVEWINDOW:
- gui.in_focus = FALSE;
- gui_update_cursor(TRUE, FALSE);
- break;
-
- case IDCMP_ACTIVEWINDOW:
- gui.in_focus = TRUE;
- gui_update_cursor(TRUE, FALSE);
- break;
- default:
- break;
- }
- ReplyMsg((struct Message*)msg);
- }
-
- if (quit_request)
- {
- getout(0); // gui_mch_exit(1);
- }
-
- return returnEvent;
- /* mouse positin gui.window->MoseY, gui.window->MouseX) */
-}
-
- static int
-checkEventHandler(void)
-{
- enum event happened;
-
- do
- {
- happened = EventHandler() ;
- }
- while (happened != ev_NullEvent);
-
- return OK;
-}
-
- static int
-charEventHandler(int wtime)
-{
- enum event happened;
- int rc;
-
- do
- {
- Wait(1<<gui.window->UserPort->mp_SigBit);
-
- happened = EventHandler() ;
- }
- while ((happened != ev_IntuiTicks) && (happened != ev_KeyStroke) && (happened != ev_MenuPick) && (happened != ev_MouseMove) &&(happened != ev_MouseButtons) );
-
- if (happened == ev_KeyStroke || happened == ev_MenuPick)
- rc = OK;
- else
- rc = FAIL;
-
- return rc;
-}
-
-
-/*
- * add primary menu
- */
- void
-gui_mch_add_menu_item(vimmenu_T *menu, int idx)
-{
- union myMenuItemUnion *menuItemUnion = NULL;
- struct IntuiText *menutext = NULL;
- vimmenu_T *parent;
-
- assert(menu != NULL);
- assert(menu->parent != NULL);
- parent = menu->parent;
-
- /* Don't add menu separator */
- if (menu_is_separator(menu->name))
- return;
-
- if (parent->menuItemPtr == NULL)
- return;
-
- /* TODO: use menu->mnemonic and menu->actext */
- menutext = (struct IntuiText *) malloc(sizeof(struct IntuiText));
-
- SetAttrib(menutext, FrontPen, 3);
- SetAttrib(menutext, BackPen, 1);
- SetAttrib(menutext, DrawMode, COMPLEMENT);
- SetAttrib(menutext, LeftEdge, 0);
- SetAttrib(menutext, TopEdge, 0);
- SetAttrib(menutext, ITextFont, NULL);
- SetAttrib(menutext, NextText, NULL);
-
- menuItemUnion = malloc(sizeof(*menuItemUnion));
-
- SetAttrib(&menuItemUnion->menuItem, NextItem, parent->menuItemPtr);
- SetAttrib(&menuItemUnion->menuItem, LeftEdge, 0);
- SetAttrib(&menuItemUnion->menuItem, Width, characterWidth*strlen(menu->dname));
- SetAttrib(&menuItemUnion->menuItem, Height, characterHeight+2);
- SetAttrib(&menuItemUnion->menuItem, Flags, ITEMTEXT+ITEMENABLED+HIGHCOMP);
- SetAttrib(&menuItemUnion->menuItem, MutualExclude, 0);
- SetAttrib(&menuItemUnion->menuItem, ItemFill, (APTR)menutext);
- SetAttrib(&menuItemUnion->menuItem, SelectFill, NULL);
- SetAttrib(&menuItemUnion->menuItem, Command, NULL);
- SetAttrib(&menuItemUnion->menuItem, SubItem, NULL);
- SetAttrib(&menuItemUnion->menuItem, NextSelect, MENUNULL);
-
- menutext->IText = malloc(strlen(menu->dname) + 1);
-
- strcpy(menutext->IText, menu->dname);
-
- menuItemUnion->menuItem.NextItem = NULL;
-
-
- if (parent)
- {
- if (!parent->menuItemPtr)
- {
- D("Adding first subElement");
- SetAttrib(&menuItemUnion->menuItem, TopEdge, 0);
- parent->menuPtr->FirstItem = &menuItemUnion->menuItem;
- parent->menuItemPtr = &menuItemUnion->menuItem;
- }
- else
- {
- struct MenuItem *tmpMenuItem;
- tmpMenuItem = parent->menuItemPtr;
- while (tmpMenuItem->NextItem)
- {
- tmpMenuItem = tmpMenuItem->NextItem;
- }
- tmpMenuItem->NextItem = &menuItemUnion->menuItem;
- SetAttrib(&menuItemUnion->menuItem, TopEdge, tmpMenuItem->TopEdge+tmpMenuItem->Height);
- }
- }
- menu->menuPtr= NULL;
- menu->menuItemPtr = &menuItemUnion->menuItem;
- menuItemUnion->myMenuItem.guiMenu = menu;
-}
-
-
- static struct Menu *
-getMenu(struct RastPort *rast, int left, STRPTR name)
-{
- struct Menu *menu;
- struct TextExtent textExt;
-
- menu = malloc(sizeof(*menu));
- menu->NextMenu = NULL;
- menu->LeftEdge = left;
-
- TextExtent(rast, name, strlen(name), &textExt);
-
- menu->TopEdge = 0;
- menu->Width = textExt.te_Width;
- menu->Height = textExt.te_Height;
- menu->Flags = ITEMTEXT+HIGHCOMP+MENUENABLED;
- menu->MenuName = name;
- menu->FirstItem = NULL;
-
- return menu;
-}
-
-/*
- * add 1st level submenu item
- */
- void
-gui_mch_add_menu(vimmenu_T *menu, int idx)
-{
- struct Menu *newMenu;
- int pos = 0;
-
- if (!menu_is_menubar(menu->name))
- return;
-
- menu->menuPtr = newMenu = getMenu(gui.window->RPort, 0, menu->dname);
- menu->menuItemPtr = NULL;
- newMenu->NextMenu = NULL;
-
- if (!gui.menu)
- {
- D("Adding head menu");
- gui.menu = newMenu ;
- }
- else
- {
- struct Menu *tmpMenu;
-
- tmpMenu = gui.menu;
- while (tmpMenu->NextMenu)
- tmpMenu = tmpMenu->NextMenu;
- tmpMenu->NextMenu = newMenu;
- pos = tmpMenu->LeftEdge +
- TextLength(gui.window->RPort, tmpMenu->MenuName,
- strlen(tmpMenu->MenuName));
- newMenu->LeftEdge = pos;
- }
-}
-
- void
-gui_mch_toggle_tearoffs(enable)
- int enable;
-{
- /* no tearoff menus */
-}
-
- int
-gui_mch_set_blinking(long wait, long on, long off)
-{
- cursor.waitTime = wait/100;
- cursor.onTime = on/100;
- cursor.offTime = off/100;
- return OK;
-}
-
- void
-gui_mch_prepare(int *argc, char **argv)
-{
- D("gui_mch_prepare");
-
- execBase = (struct ExecBase *)OpenLibrary("exec.library", NULL);
- gfxBase = (struct GFXBase *)OpenLibrary("graphics.library", NULL);
- layersBase = (struct LayersBase *)OpenLibrary("layers.library", NULL);
-
- if (!execBase)
- {
- D("Cannot open exec.library, aborting");
- }
- if (!gfxBase)
- {
- D("Cannot open graphics.library, aborting");
- }
- if (!layersBase)
- {
- D("Cannot open graphics.library, aborting");
- }
- D("gui_mch_prepare done ");
-}
-
- void
-atexitDoThis(void)
-{
-kprintf("atexitdothis###\n");
- gui_mch_exit(-1);
-}
-
-/*
- * Check if the GUI can be started. Called before gvimrc is sourced.
- * Return OK or FAIL.
- */
- int
-gui_mch_init_check(void)
-{
- if (execBase && gfxBase && layersBase)
- return OK;
- return FAIL;
-}
-
- int
-gui_mch_init(void)
-{
- int returnCode = FAIL; /* assume failure*/
-
- TimerMP = CreateMsgPort();
- if (!TimerMP) return FAIL;
-
- TimerIO = (struct timerequest *)CreateIORequest(TimerMP, sizeof(*TimerIO));
- if (!TimerIO) return FAIL;
-
- if (OpenDevice("timer.device", UNIT_VBLANK, &TimerIO->tr_node, 0)) return FAIL;
-
- gui.window = OpenWindowTagList(&vimNewWindow, tags);
- if (gui.window)
- {
- gui.in_use = TRUE;
- gui.in_focus=TRUE;
- gui.norm_pixel = gui.def_norm_pixel = 1;
- gui.back_pixel = gui.def_back_pixel = 0;
-
- set_normal_colors();
- gui_check_colors();
-
- SetDrMd(gui.window->RPort, JAM2);
- gui_mch_set_colors(gui.norm_pixel, gui.back_pixel);
-
- atexit(atexitDoThis);
-
- TextDimensions();
- returnCode = OK; /* we've had success */
- if (gui_win_x != -1 && gui_win_y != -1)
- gui_mch_set_winpos(gui_win_x, gui_win_y);
-
- gui_mch_clear_all();
-
- }
- gui.menu = NULL;
-
- return returnCode;
-}
-
- void
-gui_mch_new_colors(void)
-{
-kprintf("### gui_mch_new_colors\n");
- SetAPen(gui.window->RPort, getrealcolor(gui.norm_pixel));
- SetBPen(gui.window->RPort, getrealcolor(gui.back_pixel));
-
- D("gui_mch_new_colors");
-}
-
- int
-gui_mch_open(void)
-{
- D("gui_mch_open");
-
- highlight_gui_started();
- return OK;
-}
-
- void
-gui_mch_exit(int returnCode)
-{
-kprintf("###gui_mch_exit\n");
- D("****gui_mch_exit");
-
- if (TimerSent)
- {
- if (!CheckIO(&TimerIO->tr_node)) AbortIO(&TimerIO->tr_node);
- WaitIO(&TimerIO->tr_node);
- TimerSent = FALSE;
- }
-
- if (TimerIO)
- {
- CloseDevice(&TimerIO->tr_node);
- DeleteIORequest(&TimerIO->tr_node);
- TimerIO = NULL;
- }
-
- if (TimerMP)
- {
- DeleteMsgPort(TimerMP);
- TimerMP = NULL;
- }
-
- if (gui.window)
- {
- int i;
-
- for(i = 0; i < sizeof(MyColorTable) / sizeof(MyColorTable[0]); i++)
- {
- if (MyColorTable[i].alloced)
- {
- ReleasePen(gui.window->WScreen->ViewPort.ColorMap, MyColorTable[i].pen);
- MyColorTable[i].alloced = FALSE;
- }
- }
-
- D("Closeing window ");
- CloseWindow(gui.window);
- CloseLibrary((struct Library*)execBase);
- CloseLibrary((struct Library*)gfxBase);
- gui.window = NULL;
- gui.in_use = FALSE;
- //getout(1);
- }
-}
-
-/*
- * Get the position of the top left corner of the window.
- */
- int
-gui_mch_get_winpos(int *x, int *y)
-{
- if (gui.window)
- {
- *x = gui.window->LeftEdge;
- *y = gui.window->TopEdge;
- }
- else
- {
- return FAIL;
- }
-
- return OK;
-}
-
-/*
- * Set the position of the top left corner of the window to the given
- * coordinates.
- */
- void
-gui_mch_set_winpos(int x, int y)
-{
- if (gui.window)
- {
- ChangeWindowBox(gui.window, x, y, gui.window->Width, gui.window->Height);
- }
-}
-
- void
-gui_mch_set_shellsize(int width, int height,
- int min_width, int min_height, int base_width, int base_height)
-{
- D("gui_mch_set_shellsize");
-
- ChangeWindowBox(gui.window, gui.window->LeftEdge,
- gui.window->TopEdge, widthCharToPoint(width) + gui.window->BorderLeft + gui.window->BorderRight,
- heightCharToPoint(height) + gui.window->BorderTop + gui.window->BorderBottom);
- checkEventHandler();
-}
-
- void
-gui_mch_get_screen_dimensions(int *screen_w, int *screen_h)
-{
-// *screen_w = widthPointToChar(gui.window->GZZWidth);
-// *screen_h = heightPointToChar(gui.window->GZZHeight);
- *screen_w = gui.window->GZZWidth;
- *screen_h = gui.window->GZZHeight - characterHeight;
-
-
-kprintf("=== get_screen_dimensions: screen %d,%d character %d,%d console %d,%d\n",
-gui.window->GZZWidth,
-gui.window->GZZHeight,
-characterWidth,
-characterHeight,
-*screen_w,
-*screen_h);
-
-}
-
- void
-gui_mch_set_text_area_pos(int x, int y, int w, int h)
-{
- D("gui_mch_set_text_area_pos");
-}
-
- void
-gui_mch_enable_scrollbar(scrollbar_T *sb, int flag)
-{
- /* done by default */
- /* TODO: disable scrollbar when it's too small */
-}
-
- void
-gui_mch_set_scrollbar_thumb(scrollbar_T *sb, long val, long size, long max)
-{
- ULONG total = max;
- ULONG visible = size;
- ULONG top = val;
- ULONG hidden;
- ULONG overlap = 0;
- UWORD body, pot;
-
-kprintf("__set_scrollbar_thumb val %d size %d max %d\n", val, size, max);
-
- if (total > visible)
- hidden = total - visible;
- else
- hidden = 0;
-
- if (top > hidden)
- top = hidden;
-
- body = (hidden > 0) ?
- (UWORD)(((ULONG)(visible - overlap) * MAXBODY) / (total - overlap)) :
- MAXBODY;
-
- pot = (hidden > 0) ? (UWORD)(((ULONG) top * MAXPOT) / hidden) : 0;
-
-kprintf("__pot %x body %x\n", pot, body);
-
- NewModifyProp(&propGadget, gui.window, NULL,
- Gadget2SInfo.Flags,
- MAXPOT, pot,
- MAXBODY, body,
- 1);
- return;
-
-}
-
- void
-gui_mch_set_scrollbar_pos(scrollbar_T *sb, int x, int y, int w, int h)
-{
- D("gui_mch_set_scrollbar_pos");
- /*NewModifyProp(&propGadget, gui.window, NULL, MAXPOT, MAXPOT/sb->max*y, MAXPOT, MAXBODY/sb->max/sb->size, 1);*/
-}
-
- void
-gui_mch_create_scrollbar(scrollbar_T *sb, int orient)
-{
- /* this is done by default */
-}
-
-#if defined(FEAT_WINDOWS) || defined(PROTO)
- void
-gui_mch_destroy_scrollbar(scrollbar_T *sb)
-{
- /* this is done by default */
-}
-#endif
-
-char_u *gui_mch_getfontname(GuiFont font)
-{
- return vim_strsave((char_u *)"default");
-}
-
-int gui_mch_init_font(char_u *font_name, int fontset)
-{
- /*D("gui_mch_init_font");*/
-
- gui.char_width = characterWidth;
- gui.char_height = characterHeight;
- gui.char_ascent = gui.window->RPort->TxBaseline;
-
- return OK;
-}
-
- int
-gui_mch_adjust_charsize()
-{
- return FAIL;
-}
-
- GuiFont
-gui_mch_get_font(char_u *name, int giveErrorIfMissing)
-{
- /*D("gui_mch_get_font");*/
- return NULL;
-}
-
-#if defined(FEAT_EVAL) || defined(PROTO)
-/*
- * Return the name of font "font" in allocated memory.
- * We always use the default font.
- */
- char_u *
-gui_mch_get_fontname(GuiFont font, char_u *name)
-{
- return vim_strsave((char_u *)"default");
-}
-#endif
-
- void
-gui_mch_set_font(GuiFont font)
-{
- /*D("gui_mch_set_font");*/
-}
-
-#if 0 /* not used */
- int
-gui_mch_same_font(GuiFont f1, GuiFont f2)
-{
- D("gui_mch_same_font");
-}
-#endif
-
- void
-gui_mch_free_font(GuiFont font)
-{
- if (font)
- D("gui_mch_free_font");
-}
-
-#define RGB(a, b, c) ((a && 0xff) * 0x10000 + (b * 0xff) * 0x100 + (c & 0xff))
-
-/*
- * Get color handle for color "name".
- * Return INVALCOLOR when not possible.
- */
-
- typedef struct guicolor_tTable
- {
- char *name;
- unsigned long color;
- UBYTE red;
- UBYTE green;
- UBYTE blue;
- } guicolor_tTable;
-
- static guicolor_tTable table[] =
- {
- {"Grey", 0, 190,190,190},
- {"Black", 1, 0, 0, 0},
- {"DarkBlue", 2, 0, 0, 139},
- {"DarkGreen", 3, 0, 100, 0},
- {"DarkCyan", 4, 0, 139, 139},
- {"DarkRed", 5, 139, 0, 0},
- {"DarkMagenta", 6, 139, 0, 139},
- {"Brown", 7, 165, 42, 42},
- {"Gray", 8, 190, 190, 190},
- {"Grey", 9, 190, 190, 190},
- {"LightGray", 10, 211, 211, 211},
- {"LightGrey", 11, 211, 211, 211},
- {"DarkGray", 12, 169, 169, 169},
- {"DarkGrey", 13, 169, 169, 169},
- {"Blue", 14, 0, 0, 255},
- {"LightBlue", 15, 173, 216, 230},
- {"Green", 16, 0, 255, 0},
- {"LightGreen", 17, 144, 238, 144},
- {"Cyan", 18, 0, 255, 255},
- {"LightCyan", 19, 224, 255, 255},
- {"Red", 20, 255, 0, 0},
- {"LightRed", 21, 255, 0, 0}, /*?*/
- {"Magenta", 22, 255, 0, 255},
- {"LightMagenta",23, 255, 0, 255}, /*?*/
- {"Yellow", 24, 255, 255, 0},
- {"LightYellow", 25, 255, 255, 224}, /* TODO: add DarkYellow */
- {"White", 26, 255, 255, 255},
- {"SeaGreen", 27, 46, 139, 87},
- {"Orange", 28, 255, 165, 0},
- {"Purple", 30, 160, 32, 240},
- {"SlateBlue", 31, 106, 90, 205},
- {"grey90", 32, 229, 229, 229},
- {"grey95", 33, 242, 242, 242},
- {"grey80", 34, 204, 204, 204},
- {NULL, NULL},
- };
-
- guicolor_T
-gui_mch_get_color(char_u *name)
-{
-
- guicolor_T color = INVALCOLOR;
-
- int i;
-
- for (i = 0; table[i].name != NULL;i++)
- {
- if (stricmp(name, table[i].name) == 0)
- {
- //color = table[i].color;
- color = i;
- }
- }
-
-#if 0
- if (color == INVALCOLOR)
- {
- char *looky = NULL;
-
- color = strtol((char*)name, &looky, 10);
- if (*looky != NUL)
- color = INVALCOLOR;
- }
-#endif
-
- kprintf("gui_mch_get_color[%s] = %s\n", name, table[color].name);
-
- return color;
-}
-
-static UBYTE getrealcolor(guicolor_T i)
-{
- if (!MyColorTable[i].alloced)
- {
- MyColorTable[i].pen = ObtainBestPen(gui.window->WScreen->ViewPort.ColorMap,
- table[i].red * 0x01010101,
- table[i].green * 0x01010101,
- table[i].blue * 0x01010101,
- OBP_FailIfBad, FALSE,
- OBP_Precision, PRECISION_GUI,
- TAG_DONE);
- if (MyColorTable[i].pen != -1)
- {
- MyColorTable[i].alloced = TRUE;
- }
- }
-
- return MyColorTable[i].pen;
-}
-
-
- void
-gui_mch_set_colors(guicolor_T fg, guicolor_T bg)
-{
-#if 0
- if (fg == 0)
- {
- fg = 1;
- }
-#endif
- SetABPenDrMd(gui.window->RPort, getrealcolor(fg), getrealcolor(bg), JAM2);
-
-kprintf("gui_mch_set_colors %s,%s\n", table[fg].name, table[bg].name);
-}
-
- void
-gui_mch_set_fg_color(guicolor_T color)
-{
-#if 0
- if (color == 0)
- {
- color = 1; /* vim sends 0 as default color which is ALWAYS the
- background on the amiga scrolling with colours as the
- background is a very bad idea on slow machines*/
- }
-#endif
- SetAPen(gui.window->RPort, getrealcolor(color));
- SetDrMd(gui.window->RPort, JAM2);
-
-kprintf("gui_mch_set_fg_color %s\n", table[color].name);
-
-}
-
- void
-gui_mch_set_bg_color(guicolor_T color)
-{
- SetBPen(gui.window->RPort, getrealcolor(color));
-kprintf("gui_mch_set_bg_color %s\n", table[color].name);
-
-}
-
- void
-gui_mch_draw_string(int row, int col, char_u *s, int len, int flags)
-{
-#if 1
- char tempstring[300];
-
- memcpy(tempstring, s, len);
- tempstring[len] = '\0';
-
- kprintf("gui_mch_draw_string(%s) flags %x\n", tempstring, flags);
-#endif
-
- if (flags & DRAW_TRANSP)
- {
- SetDrMd(gui.window->RPort, JAM1);
- Move(gui.window->RPort, posWidthCharToPoint(col), posHeightCharToPoint(row) + gui.window->RPort->TxBaseline);
- Text(gui.window->RPort, s, len);
- }
- else
- {
- SetDrMd(gui.window->RPort, JAM2);
- Move(gui.window->RPort, posWidthCharToPoint(col), posHeightCharToPoint(row) + gui.window->RPort->TxBaseline);
- Text(gui.window->RPort, s, len);
- }
-
- if (flags & DRAW_BOLD)
- {
- SetDrMd(gui.window->RPort, JAM1);
- Move(gui.window->RPort, posWidthCharToPoint(col)+1, posHeightCharToPoint(row) + gui.window->RPort->TxBaseline);
- Text(gui.window->RPort, s, len);
- }
-
- if (flags & DRAW_UNDERL)
- {
- Move(gui.window->RPort, posWidthCharToPoint(col), posHeightCharToPoint(row + 1) - 1);
- Draw(gui.window->RPort, posWidthCharToPoint(col+len) - 1, posHeightCharToPoint(row + 1) - 1);
- }
-
- SetDrMd(gui.window->RPort, JAM2);
-}
-
- int
-gui_mch_haskey(char_u *name)
-{
- int i;
-
- D("gui_mch_haskey");
-
- for (i = 0; special_keys[i].vim_code1 != NUL; i++)
- if (name[0] == special_keys[i].vim_code0 &&
- name[1] == special_keys[i].vim_code1)
- return OK;
- return FAIL;
-}
-
- void
-gui_mch_beep(void)
-{
- D("gui_mch_beep");
-}
-
- void
-gui_mch_flash(int msec)
-{
- D("gui_mch_flash");
-
- SetDrMd(gui.window->RPort, COMPLEMENT);
- RectFill(gui.window->RPort, 0, 0, gui.window->GZZWidth - 1, gui.window->GZZHeight - 1);
- Delay(msec * 50 / 1000);
- RectFill(gui.window->RPort, 0, 0, gui.window->GZZWidth - 1, gui.window->GZZHeight - 1);
- SetDrMd(gui.window->RPort, JAM2);
-}
-
- void
-gui_mch_invert_rectangle( int r, int c, int nr, int nc)
-{
- printf("gui_mch_invert_rectangle %d %d %d %d\n", r, c, nr, nc);
-}
-
- void
-gui_mch_iconify(void)
-{
- D("gui_mch_iconify");
-}
-
-#if defined(FEAT_EVAL) || defined(PROTO)
-/*
- * Bring the Vim window to the foreground.
- */
- void
-gui_mch_set_foreground()
-{
- WindowToFront(gui.window);
- D("gui_mch_set_foreground");
-}
-#endif
-
- void
-gui_mch_settitle(char_u *title, char_u *icon)
-{
- SetWindowTitles(gui.window, title, (STRPTR)~0);
- D("gui_mch_settitle");
-}
-
- void
-gui_mch_stop_blink(void)
-{
- gui_undraw_cursor();
- D("gui_mch_stop_blink");
-}
-
- void
-gui_mch_start_blink(void)
-{
- gui_update_cursor(FALSE, FALSE);
- D("gui_mch_start_blink");
-}
-
- void
-gui_mch_draw_hollow_cursor(guicolor_T color)
-{
- drawBox(DB_NotFilled, gui.col, gui.row, characterWidth, characterHeight, color);
-}
-
- void
-gui_mch_draw_part_cursor( int w, int h, guicolor_T color)
-{
- D("gui_mch_part_cursor");
- drawBox(DB_Filled, gui.col, gui.row, w, h, color);
-}
-
- void
-gui_mch_update(void)
-{
- checkEventHandler();
- return ;
-}
-
- int
-gui_mch_wait_for_chars(int wtime)
-{
- ULONG timermask = 1L << TimerMP->mp_SigBit;
- ULONG winmask = 1L << gui.window->UserPort->mp_SigBit;
- int retval = FAIL;
-
- kprintf("========== gui_mch_wait_for_chars %d\n", wtime);
-
- if (wtime == -1) wtime = 1000000000;
- if (wtime < 20) wtime = 20;
-
- SetSignal(0, timermask);
- TimerIO->tr_node.io_Command = TR_ADDREQUEST;
- TimerIO->tr_time.tv_secs = wtime / 1000;
- TimerIO->tr_time.tv_micro = (wtime % 1000) * 1000;
- SendIO(&TimerIO->tr_node);
- TimerSent = TRUE;
-
- for(;;)
- {
- ULONG sigs = Wait(winmask | timermask);
-
- if (sigs & winmask)
- {
- checkEventHandler();
- if (!vim_is_input_buf_empty())
- {
- retval = OK;
- if (!CheckIO(&TimerIO->tr_node)) AbortIO(&TimerIO->tr_node);
- WaitIO(&TimerIO->tr_node);
- TimerSent = FALSE;
- break;
- }
- }
-
- if (sigs & timermask)
- {
- struct Message *msg;
-
- if ((msg = GetMsg(TimerMP)))
- {
- ReplyMsg(msg);
- TimerSent = FALSE;
- retval = FAIL;
- break;
- }
- }
- }
-
- return retval;
-
-// assert(wtime != 0);
-// return charEventHandler(wtime);
-}
-
- void
-gui_mch_flush(void)
-{
-}
-
- void
-gui_mch_clear_block(int row1, int col1, int row2, int col2)
-{
- UBYTE apen = GetAPen(gui.window->RPort);
-
- SetAPen(gui.window->RPort, getrealcolor(gui.back_pixel));
- RectFill(gui.window->RPort,
- posWidthCharToPoint(col1),
- posHeightCharToPoint(row1),
- posWidthCharToPoint(col2 + 1) - 1,
- posHeightCharToPoint(row2 + 1) - 1);
- SetAPen(gui.window->RPort, apen);
-
-}
-
- void
-gui_mch_clear_all(void)
-{
- SetRast(gui.window->RPort, GetBPen(gui.window->RPort));
- refreshBorder();
- D("gui_mch_clear_all");
-}
-
- void
-gui_mch_delete_lines(int row, int num_lines)
-{
- ScrollWindowRaster(gui.window,
- 0,
- characterHeight * num_lines,
- posWidthCharToPoint(gui.scroll_region_left),
- posHeightCharToPoint(row),
- posWidthCharToPoint(gui.scroll_region_right + 1) - 1,
- posHeightCharToPoint(gui.scroll_region_bot + 1) - 1);
-
- gui_clear_block(gui.scroll_region_bot - num_lines + 1,
- gui.scroll_region_left,
- gui.scroll_region_bot,
- gui.scroll_region_right);
-
-}
-
- void
-gui_mch_insert_lines(int row, int num_lines)
-{
- ScrollWindowRaster(gui.window,
- 0,
- -characterHeight*num_lines,
- posWidthCharToPoint(gui.scroll_region_left),
- posHeightCharToPoint(row),
- posWidthCharToPoint(gui.scroll_region_right + 1) - 1,
- posHeightCharToPoint(gui.scroll_region_bot +1 ) - 1);
-
- gui_clear_block(row, gui.scroll_region_left,
- row + num_lines - 1, gui.scroll_region_right);
-
-}
-
- void
-gui_mch_enable_menu(int flag)
-{
- D("gui_mch_enable_menu");
-}
-
- void
-gui_mch_set_menu_pos(int x, int y, int w, int h)
-{
- D("gui_mch_set_menu_pos");
-}
-
- void
-gui_mch_destroy_menu(vimmenu_T *menu)
-{
- D("gui_mch_destroy_menu");
- ClearMenuStrip(gui.window);
-}
-
- void
-gui_mch_menu_grey(vimmenu_T *menu, int grey)
-{
- D("gui_mch_menu_grey");
-}
-
- void
-gui_mch_menu_hidden(vimmenu_T *menu, int hidden)
-{
- D("gui_mch_menu_hidden");
- ClearMenuStrip(gui.window);
-}
-
- void
-gui_mch_draw_menubar(void)
-{
- D("gui_mch_draw_menubar");
- SetMenuStrip(gui.window, gui.menu);
-}
-
- static void
-AmigaError(const char *string)
-{
- static struct IntuiText pos = { 3, 0, JAM2, 17, 5, NULL, "Cancel", NULL} ;
- static struct IntuiText neg = { 3, 0, JAM2, 17, 5, NULL, "Cancel", NULL} ;
- static struct IntuiText message = { 3, 0, JAM2, 17, 5, NULL, NULL, NULL} ;
- static char *strptr = 0;
-
- if (strptr)
- free(strptr);
- strptr = malloc(strlen(string)+1);
-
- message.IText = strptr;
- strcpy(strptr, string);
-
- AutoRequest(NULL, &message, &pos, &neg, 0, 0, 300, 300);
-}
-
- int
-clip_mch_own_selection(VimClipboard *cbd)
-{
- D("clib_mch_own_selection");
- return OK;
-}
-
- void
-mch_setmouse(int on)
-{
-}
-
-/*
- * Get current y mouse coordinate in text window.
- * Return -1 when unknown.
- */
- int
-gui_mch_get_mouse_x()
-{
- return gui.window->GZZMouseX;
-}
-
- int
-gui_mch_get_mouse_y()
-{
- return gui.window->GZZMouseY;
-}
-
- void
-gui_mch_setmouse(x, y)
- int x;
- int y;
-{
- /* TODO */
-}
-
- void
-gui_mch_show_popupmenu(vimmenu_T *menu)
-{
- /* TODO */
-}
-
- void
-clip_mch_lose_selection(VimClipboard *cbd)
-{
- D("clip_mch_lose_selecction");
-}
-
- void
-clip_mch_request_selection(VimClipboard *cbd)
-{
- D("clip_mch_requst_selection");
-}
-
- void
-clip_mch_set_selection(VimClipboard *cbd)
-{
-}
-
- long_u
-gui_mch_get_rgb(guicolor_T pixel)
-{
- ULONG coltable[3], color;
-
- GetRGB32(gui.window->WScreen->ViewPort.ColorMap,
- getrealcolor(pixel),
- 1,
- coltable);
-
- color = ((coltable[0] & 0xFF000000) >> 8) |
- ((coltable[1] & 0xFF000000) >> 16) |
- ((coltable[2] & 0xFF000000) >> 24);
-
- return color;
-}
-
-#endif /* USE_AMIGA_GUI*/
diff --git a/src/gui_amiga.h b/src/gui_amiga.h
deleted file mode 100644
index f70122d75..000000000
--- a/src/gui_amiga.h
+++ /dev/null
@@ -1,52 +0,0 @@
-/* vi:set ts=8 sts=4 sw=4:
- *
- * VIM - Vi IMproved by Bram Moolenaar
- * Amiga GUI support by Michael Nielsen
- *
- * Do ":help uganda" in Vim to read copying and usage conditions.
- * Do ":help credits" in Vim to see a list of people who contributed.
- *
- * Amiga GUI header file.
- */
-
-#if !defined(__GUI_AMIGA__H)
-#define __GUI_AMIGA__H
-
-#define SetAttrib(_ptr,_attrib,_value) ((_ptr)->_attrib=(_value))
-
-#if defined(FEAT_GUI_AMIGA)
-
-#include <intuition/intuition.h>
-
-enum event {
- ev_NullEvent,
- ev_MenuVerify,
- ev_MenuPick,
- ev_CloseWindow,
- ev_NewSize,
- ev_RefreshWindow,
- ev_MouseButtons,
- ev_MouseMove,
- ev_GadgetDown,
- ev_GadgetUp,
- ev_KeyStroke,
- ev_IntuiTicks,
- ev_MenuHelp,
- ev_GadgetHelp,
-
- ev_Ignore
-};
-
-struct MyMenuItem {
- struct MenuItem menuItem;
- vimmenu_T *guiMenu;
-};
-
-union myMenuItemUnion {
- struct MenuItem menuItem;
- struct MyMenuItem myMenuItem;
-};
-
-#endif /* FEAT_GUI_AMIGA*/
-#endif /* __GUI_AMIGA__H */
-
diff --git a/src/gui_beos.cc b/src/gui_beos.cc
deleted file mode 100644
index 315136559..000000000
--- a/src/gui_beos.cc
+++ /dev/null
@@ -1,3358 +0,0 @@
-/* vi:set ts=8 sts=4 sw=4:
- *
- * VIM - Vi IMproved by Bram Moolenaar
- * BeBox GUI support Copyright 1998 by Olaf Seibert.
- * All Rights Reserved.
- *
- * Do ":help uganda" in Vim to read copying and usage conditions.
- * Do ":help credits" in Vim to see a list of people who contributed.
- *
- * BeOS GUI.
- *
- * GUI support for the Buzzword Enhanced Operating System.
- *
- * Ported to R4 by Richard Offer <richard@whitequeen.com> Jul 99
- *
- */
-
-/*
- * Structure of the BeOS GUI code:
- *
- * There are 3 threads.
- * 1. The initial thread. In gui_mch_prepare() this gets to run the
- * BApplication message loop. But before it starts doing that,
- * it creates thread 2:
- * 2. The main() thread. This thread is created in gui_mch_prepare()
- * and its purpose in life is to call main(argc, argv) again.
- * This thread is doing the bulk of the work.
- * 3. Sooner or later, a window is opened by the main() thread. This
- * causes a second message loop to be created: the window thread.
- *
- * == alternatively ===
- *
- * #if RUN_BAPPLICATION_IN_NEW_THREAD...
- *
- * 1. The initial thread. In gui_mch_prepare() this gets to spawn
- * thread 2. After doing that, it returns to main() to do the
- * bulk of the work, being the main() thread.
- * 2. Runs the BApplication.
- * 3. The window thread, just like in the first case.
- *
- * This second alternative is cleaner from Vim's viewpoint. However,
- * the BeBook seems to assume everywhere that the BApplication *must*
- * run in the initial thread. So perhaps doing otherwise is very wrong.
- *
- * However, from a B_SINGLE_LAUNCH viewpoint, the first is better.
- * If Vim is marked "Single Launch" in its application resources,
- * and a file is dropped on the Vim icon, and another Vim is already
- * running, the file is passed on to the earlier Vim. This happens
- * in BApplication::Run(). So we want Vim to terminate if
- * BApplication::Run() terminates. (See the BeBook, on BApplication.
- * However, it seems that the second copy of Vim isn't even started
- * in this case... which is for the better since I wouldn't know how
- * to detect this case.)
- *
- * Communication between these threads occurs mostly by translating
- * BMessages that come in and posting an appropriate translation on
- * the VDCMP (Vim Direct Communication Message Port). Therefore the
- * actions required for keypresses and window resizes, etc, are mostly
- * performed in the main() thread.
- *
- * A notable exception to this is the Draw() event. The redrawing of
- * the window contents is performed asynchronously from the window
- * thread. To make this work correctly, a locking protocol is used when
- * any thread is accessing the essential variables that are used by
- * the window thread.
- *
- * This locking protocol consists of locking Vim's window. This is both
- * convenient and necessary.
- */
-extern "C" {
-
-#define new xxx_new_xxx
-
-#include <float.h>
-#include <assert.h>
-#include "vim.h"
-#include "globals.h"
-#include "proto.h"
-#include "option.h"
-
-#undef new
-
-} /* extern "C" */
-
-/* ---------------- start of header part ---------------- */
-
-#include <be/app/MessageQueue.h>
-#include <be/app/Clipboard.h>
-#include <be/kernel/OS.h>
-#include <be/support/Beep.h>
-#include <be/interface/View.h>
-#include <be/interface/Window.h>
-#include <be/interface/MenuBar.h>
-#include <be/interface/MenuItem.h>
-#include <be/interface/ScrollBar.h>
-#include <be/interface/Region.h>
-#include <be/interface/Screen.h>
-#include <be/storage/Path.h>
-#include <be/storage/Directory.h>
-#include <be/storage/Entry.h>
-#include <be/app/Application.h>
-#include <be/support/Debug.h>
-
-/*
- * The macro B_PIXEL_ALIGNMENT shows us which version
- * of the header files we're using.
- */
-#if defined(B_PIXEL_ALIGNMENT)
-#define HAVE_R3_OR_LATER 1
-#else
-#define HAVE_R3_OR_LATER 0
-#endif
-
-class VimApp;
-class VimFormView;
-class VimTextAreaView;
-class VimWindow;
-
-extern key_map *keyMap;
-extern char *keyMapChars;
-
-extern int main(int argc, char **argv);
-
-#ifndef B_MAX_PORT_COUNT
-#define B_MAX_PORT_COUNT 100
-#endif
-
-/*
- * VimApp seems comparable to the X "vimShell"
- */
-class VimApp: public BApplication
-{
- typedef BApplication Inherited;
-public:
- VimApp(const char *appsig);
- ~VimApp();
-
- // callbacks:
-#if 0
- virtual void DispatchMessage(BMessage *m, BHandler *h)
- {
- m->PrintToStream();
- Inherited::DispatchMessage(m, h);
- }
-#endif
- virtual void ReadyToRun();
- virtual void ArgvReceived(int32 argc, char **argv);
- virtual void RefsReceived(BMessage *m);
- virtual bool QuitRequested();
-
- static void SendRefs(BMessage *m, bool changedir);
-private:
-};
-
-class VimWindow: public BWindow
-{
- typedef BWindow Inherited;
-public:
- VimWindow();
- ~VimWindow();
-
- virtual void DispatchMessage(BMessage *m, BHandler *h);
- virtual void WindowActivated(bool active);
- virtual bool QuitRequested();
-
- VimFormView *formView;
-
-private:
- void init();
-
-};
-
-class VimFormView: public BView
-{
- typedef BView Inherited;
-public:
- VimFormView(BRect frame);
- ~VimFormView();
-
- // callbacks:
- virtual void AllAttached();
- virtual void FrameResized(float new_width, float new_height);
-
-#define MENUBAR_MARGIN 1
- float MenuHeight() const
- { return menuBar ? menuBar->Frame().Height() + MENUBAR_MARGIN: 0; }
- BMenuBar *MenuBar() const
- { return menuBar; }
-
-private:
- void init(BRect);
-
- BMenuBar *menuBar;
- VimTextAreaView *textArea;
-};
-
-class VimTextAreaView: public BView
-{
- typedef BView Inherited;
-public:
- VimTextAreaView(BRect frame);
- ~VimTextAreaView();
-
- // callbacks:
- virtual void Draw(BRect updateRect);
- virtual void KeyDown(const char *bytes, int32 numBytes);
- virtual void MouseDown(BPoint point);
- virtual void MouseUp(BPoint point);
- virtual void MouseMoved(BPoint point, uint32 transit, const BMessage *message);
- virtual void MessageReceived(BMessage *m);
-
- // own functions:
- int mchInitFont(char_u *name);
- void mchDrawString(int row, int col, char_u *s, int len, int flags);
- void mchClearBlock(int row1, int col1, int row2, int col2);
- void mchClearAll();
- void mchDeleteLines(int row, int num_lines);
- void mchInsertLines(int row, int num_lines);
-
- static void guiSendMouseEvent(int button, int x, int y, int repeated_click, int_u modifiers);
- static void guiBlankMouse(bool should_hide);
- static int_u mouseModifiersToVim(int32 beModifiers);
-
- int32 mouseDragEventCount;
-
-private:
- void init(BRect);
-
- int_u vimMouseButton;
- int_u vimMouseModifiers;
-};
-
-class VimScrollBar: public BScrollBar
-{
- typedef BScrollBar Inherited;
-public:
- VimScrollBar(scrollbar_T *gsb, orientation posture);
- ~VimScrollBar();
-
- virtual void ValueChanged(float newValue);
- virtual void MouseUp(BPoint where);
- void SetValue(float newval);
- scrollbar_T *getGsb()
- { return gsb; }
-
- int32 scrollEventCount;
-
-private:
- scrollbar_T *gsb;
- float ignoreValue;
-};
-
-
-/*
- * For caching the fonts that are used;
- * Vim seems rather sloppy in this regard.
- */
-class VimFont: public BFont
-{
- typedef BFont Inherited;
-public:
- VimFont();
- VimFont(const VimFont *rhs);
- VimFont(const BFont *rhs);
- VimFont(const VimFont &rhs);
- ~VimFont();
-
- VimFont *next;
- int refcount;
- char_u *name;
-
-private:
- void init();
-};
-
-/* ---------------- end of GUI classes ---------------- */
-
-struct MainArgs {
- int argc;
- char **argv;
-};
-
-/*
- * These messages are copied through the VDCMP.
- * Therefore they ought not to have anything fancy.
- * They must be of POD type (Plain Old Data)
- * as the C++ standard calls them.
- */
-
-#define KEY_MSG_BUFSIZ 7
-#if KEY_MSG_BUFSIZ < MAX_KEY_CODE_LEN
-#error Increase KEY_MSG_BUFSIZ!
-#endif
-
-struct VimKeyMsg {
- char_u length;
- char_u chars[KEY_MSG_BUFSIZ]; /* contains Vim encoding */
-};
-
-struct VimResizeMsg {
- int width;
- int height;
-};
-
-struct VimScrollBarMsg {
- VimScrollBar *sb;
- long value;
- int stillDragging;
-};
-
-struct VimMenuMsg {
- vimmenu_T *guiMenu;
-};
-
-struct VimMouseMsg {
- int button;
- int x;
- int y;
- int repeated_click;
- int_u modifiers;
-};
-
-struct VimFocusMsg {
- bool active;
-};
-
-struct VimRefsMsg {
- BMessage *message;
- bool changedir;
-};
-
-struct VimMsg {
- enum VimMsgType {
- Key, Resize, ScrollBar, Menu, Mouse, Focus, Refs
- };
-
- union {
- struct VimKeyMsg Key;
- struct VimResizeMsg NewSize;
- struct VimScrollBarMsg Scroll;
- struct VimMenuMsg Menu;
- struct VimMouseMsg Mouse;
- struct VimFocusMsg Focus;
- struct VimRefsMsg Refs;
- } u;
-};
-
-#define RGB(r, g, b) ((char_u)(r) << 16 | (char_u)(g) << 8 | (char_u)(b) << 0)
-#define GUI_TO_RGB(g) { (g) >> 16, (g) >> 8, (g) >> 0, 255 }
-
-/* ---------------- end of header part ---------------- */
-
-static struct specialkey
-{
- uint16 BeKeys;
-#define KEY(a,b) ((a)<<8|(b))
-#define K(a) KEY(0,a) // for ASCII codes
-#define F(b) KEY(1,b) // for scancodes
- char_u vim_code0;
- char_u vim_code1;
-} special_keys[] =
-{
- {K(B_UP_ARROW), 'k', 'u'},
- {K(B_DOWN_ARROW), 'k', 'd'},
- {K(B_LEFT_ARROW), 'k', 'l'},
- {K(B_RIGHT_ARROW), 'k', 'r'},
- {K(B_BACKSPACE), 'k', 'b'},
- {K(B_INSERT), 'k', 'I'},
- {K(B_DELETE), 'k', 'D'},
- {K(B_HOME), 'k', 'h'},
- {K(B_END), '@', '7'},
- {K(B_PAGE_UP), 'k', 'P'}, /* XK_Prior */
- {K(B_PAGE_DOWN), 'k', 'N'}, /* XK_Next, */
-
-#define FIRST_FUNCTION_KEY 11
- {F(B_F1_KEY), 'k', '1'},
- {F(B_F2_KEY), 'k', '2'},
- {F(B_F3_KEY), 'k', '3'},
- {F(B_F4_KEY), 'k', '4'},
- {F(B_F5_KEY), 'k', '5'},
- {F(B_F6_KEY), 'k', '6'},
- {F(B_F7_KEY), 'k', '7'},
- {F(B_F8_KEY), 'k', '8'},
- {F(B_F9_KEY), 'k', '9'},
- {F(B_F10_KEY), 'k', ';'},
-
- {F(B_F11_KEY), 'F', '1'},
- {F(B_F12_KEY), 'F', '2'},
-// {XK_F13, 'F', '3'}, /* would be print screen/ */
- /* sysreq */
- {F(0x0F), 'F', '4'}, /* scroll lock */
- {F(0x10), 'F', '5'}, /* pause/break */
-// {XK_F16, 'F', '6'},
-// {XK_F17, 'F', '7'},
-// {XK_F18, 'F', '8'},
-// {XK_F19, 'F', '9'},
-// {XK_F20, 'F', 'A'},
-//
-// {XK_F21, 'F', 'B'},
-// {XK_F22, 'F', 'C'},
-// {XK_F23, 'F', 'D'},
-// {XK_F24, 'F', 'E'},
-// {XK_F25, 'F', 'F'},
-// {XK_F26, 'F', 'G'},
-// {XK_F27, 'F', 'H'},
-// {XK_F28, 'F', 'I'},
-// {XK_F29, 'F', 'J'},
-// {XK_F30, 'F', 'K'},
-//
-// {XK_F31, 'F', 'L'},
-// {XK_F32, 'F', 'M'},
-// {XK_F33, 'F', 'N'},
-// {XK_F34, 'F', 'O'},
-// {XK_F35, 'F', 'P'}, /* keysymdef.h defines up to F35 */
-
-// {XK_Help, '%', '1'}, /* XK_Help */
- {F(B_PRINT_KEY), '%', '9'},
-
-#if 0
- /* Keypad keys: */
- {F(0x48), 'k', 'l'}, /* XK_KP_Left */
- {F(0x4A), 'k', 'r'}, /* XK_KP_Right */
- {F(0x38), 'k', 'u'}, /* XK_KP_Up */
- {F(0x59), 'k', 'd'}, /* XK_KP_Down */
- {F(0x64), 'k', 'I'}, /* XK_KP_Insert */
- {F(0x65), 'k', 'D'}, /* XK_KP_Delete */
- {F(0x37), 'k', 'h'}, /* XK_KP_Home */
- {F(0x58), '@', '7'}, /* XK_KP_End */
- {F(0x39), 'k', 'P'}, /* XK_KP_Prior */
- {F(0x60), 'k', 'N'}, /* XK_KP_Next */
- {F(0x49), '&', '8'}, /* XK_Undo, keypad 5 */
-#endif
-
- /* End of list marker: */
- {0, 0, 0}
-};
-
-#define NUM_SPECIAL_KEYS (sizeof(special_keys)/sizeof(special_keys[0]))
-
-/* ---------------- VimApp ---------------- */
-
- static void
-docd(BPath &path)
-{
- mch_chdir(path.Path());
- /* Do this to get the side effects of a :cd command */
- do_cmdline_cmd((char_u *)"cd .");
-}
-
-/*
- * Really handle dropped files and folders.
- */
- static void
-RefsReceived(BMessage *m, bool changedir)
-{
- uint32 type;
- int32 count;
-
- //m->PrintToStream();
- switch (m->what) {
- case B_REFS_RECEIVED:
- case B_SIMPLE_DATA:
- m->GetInfo("refs", &type, &count);
- if (type != B_REF_TYPE)
- goto bad;
- break;
- case B_ARGV_RECEIVED:
- m->GetInfo("argv", &type, &count);
- if (type != B_STRING_TYPE)
- goto bad;
- if (changedir) {
- char *dirname;
- if (m->FindString("cwd", (const char **) &dirname) == B_OK) {
- chdir(dirname);
- do_cmdline_cmd((char_u *)"cd .");
- }
- }
- break;
- default:
- bad:
- //fprintf(stderr, "bad!\n");
- delete m;
- return;
- }
-
-#ifdef FEAT_VISUAL
- reset_VIsual();
-#endif
-
- char_u **fnames;
- fnames = (char_u **) alloc(count * sizeof(char_u *));
- int fname_index = 0;
-
- switch (m->what) {
- case B_REFS_RECEIVED:
- case B_SIMPLE_DATA:
- //fprintf(stderr, "case B_REFS_RECEIVED\n");
- for (int i = 0; i < count; ++i)
- {
- entry_ref ref;
- if (m->FindRef("refs", i, &ref) == B_OK) {
- BEntry entry(&ref, false);
- BPath path;
- entry.GetPath(&path);
-
- /* Change to parent directory? */
- if (changedir) {
- BPath parentpath;
- path.GetParent(&parentpath);
- docd(parentpath);
- }
-
- /* Is it a directory? If so, cd into it. */
- BDirectory bdir(&ref);
- if (bdir.InitCheck() == B_OK) {
- /* don't cd if we already did it */
- if (!changedir)
- docd(path);
- } else {
- mch_dirname(IObuff, IOSIZE);
- char_u *fname = shorten_fname((char_u *)path.Path(), IObuff);
- if (fname == NULL)
- fname = (char_u *)path.Path();
- fnames[fname_index++] = vim_strsave(fname);
- //fprintf(stderr, "%s\n", fname);
- }
-
- /* Only do it for the first file/dir */
- changedir = false;
- }
- }
- break;
- case B_ARGV_RECEIVED:
- //fprintf(stderr, "case B_ARGV_RECEIVED\n");
- for (int i = 1; i < count; ++i)
- {
- char *fname;
-
- if (m->FindString("argv", i, (const char **) &fname) == B_OK) {
- fnames[fname_index++] = vim_strsave((char_u *)fname);
- }
- }
- break;
- default:
- //fprintf(stderr, "case default\n");
- break;
- }
-
- delete m;
-
- /* Handle the drop, :edit to get to the file */
- if (fname_index > 0) {
- handle_drop(fname_index, fnames, FALSE);
-
- /* Update the screen display */
- update_screen(NOT_VALID);
- setcursor();
- out_flush();
- } else {
- vim_free(fnames);
- }
-}
-
-VimApp::VimApp(const char *appsig):
- BApplication(appsig)
-{
-}
-
-VimApp::~VimApp()
-{
-}
-
- void
-VimApp::ReadyToRun()
-{
- /*
- * Apparently signals are inherited by the created thread -
- * disable the most annoying ones.
- */
- signal(SIGINT, SIG_IGN);
- signal(SIGQUIT, SIG_IGN);
-}
-
- void
-VimApp::ArgvReceived(int32 arg_argc, char **arg_argv)
-{
- if (!IsLaunching()) {
- /*
- * This can happen if we are set to Single or Exclusive
- * Launch. Be nice and open the file(s).
- */
- if (gui.vimWindow)
- gui.vimWindow->Minimize(false);
- BMessage *m = CurrentMessage();
- DetachCurrentMessage();
- SendRefs(m, true);
- }
-}
-
- void
-VimApp::RefsReceived(BMessage *m)
-{
- /* Horrible hack!!! XXX XXX XXX
- * The real problem is that b_start_ffc is set too late for
- * the initial empty buffer. As a result the window will be
- * split instead of abandoned.
- */
- int limit = 15;
- while (--limit >= 0 && (curbuf == NULL || curbuf->b_start_ffc == 0))
- snooze(100000); // 0.1 s
- if (gui.vimWindow)
- gui.vimWindow->Minimize(false);
- DetachCurrentMessage();
- SendRefs(m, true);
-}
-
-/*
- * Pass a BMessage on to the main() thread.
- * Caller must have detached the message.
- */
- void
-VimApp::SendRefs(BMessage *m, bool changedir)
-{
- VimRefsMsg rm;
- rm.message = m;
- rm.changedir = changedir;
-
- write_port(gui.vdcmp, VimMsg::Refs, &rm, sizeof(rm));
- // calls ::RefsReceived
-}
-
- bool
-VimApp::QuitRequested()
-{
- (void)Inherited::QuitRequested();
- return false;
-}
-
-/* ---------------- VimWindow ---------------- */
-
-VimWindow::VimWindow():
- BWindow(BRect(40, 40, 150, 150),
- "Vim",
- B_TITLED_WINDOW,
- 0,
- B_CURRENT_WORKSPACE)
-
-{
- init();
-}
-
-VimWindow::~VimWindow()
-{
- if (formView) {
- RemoveChild(formView);
- delete formView;
- }
- gui.vimWindow = NULL;
-}
-
- void
-VimWindow::init()
-{
- /* Attach the VimFormView */
- formView = new VimFormView(Bounds());
- if (formView != NULL) {
- AddChild(formView);
- }
-}
-
- void
-VimWindow::DispatchMessage(BMessage *m, BHandler *h)
-{
- /*
- * Route B_MOUSE_UP messages to MouseUp(), in
- * a manner that should be compatible with the
- * intended future system behaviour.
- */
- switch (m->what) {
- case B_MOUSE_UP:
- // if (!h) h = PreferredHandler();
-// gcc isn't happy without this extra set of braces, complains about
-// jump to case label crosses init of 'class BView * v'
-// richard@whitequeen.com jul 99
- {
- BView *v = dynamic_cast<BView *>(h);
- if (v) {
- //m->PrintToStream();
- BPoint where;
- m->FindPoint("where", &where);
- v->MouseUp(where);
- } else {
- Inherited::DispatchMessage(m, h);
- }
- }
- break;
- default:
- Inherited::DispatchMessage(m, h);
- }
-}
-
- void
-VimWindow::WindowActivated(bool active)
-{
- Inherited::WindowActivated(active);
- /* the textArea gets the keyboard action */
- if (active && gui.vimTextArea)
- gui.vimTextArea->MakeFocus(true);
-
- struct VimFocusMsg fm;
- fm.active = active;
-
- write_port(gui.vdcmp, VimMsg::Focus, &fm, sizeof(fm));
-}
-
- bool
-VimWindow::QuitRequested()
-{
- struct VimKeyMsg km;
- km.length = 5;
- memcpy((char *)km.chars, "\033:qa\r", km.length);
-
- write_port(gui.vdcmp, VimMsg::Key, &km, sizeof(km));
-
- return false;
-}
-
-/* ---------------- VimFormView ---------------- */
-
-VimFormView::VimFormView(BRect frame):
- BView(frame, "VimFormView", B_FOLLOW_ALL_SIDES,
- B_WILL_DRAW | B_FRAME_EVENTS),
- menuBar(NULL),
- textArea(NULL)
-{
- init(frame);
-}
-
-VimFormView::~VimFormView()
-{
- if (menuBar) {
- RemoveChild(menuBar);
-#ifdef never
- // deleting the menuBar leads to SEGV on exit
- // richard@whitequeen.com Jul 99
- delete menuBar;
-#endif
- }
- if (textArea) {
- RemoveChild(textArea);
- delete textArea;
- }
- gui.vimForm = NULL;
-}
-
- void
-VimFormView::init(BRect frame)
-{
- menuBar = new BMenuBar(BRect(0,0,-MENUBAR_MARGIN,-MENUBAR_MARGIN),
- "VimMenuBar");
-
- AddChild(menuBar);
-
- BRect remaining = frame;
- textArea = new VimTextAreaView(remaining);
- AddChild(textArea);
- /* The textArea will be resized later when menus are added */
-
- gui.vimForm = this;
-}
-
- void
-VimFormView::AllAttached()
-{
- /*
- * Apparently signals are inherited by the created thread -
- * disable the most annoying ones.
- */
- signal(SIGINT, SIG_IGN);
- signal(SIGQUIT, SIG_IGN);
-
- if (menuBar && textArea) {
- /*
- * Resize the textArea to fill the space left over by the menu.
- * This is somewhat futile since it will be done again once
- * menus are added to the menu bar.
- */
- BRect remaining = Bounds();
- remaining.top = MenuHeight();
- textArea->ResizeTo(remaining.Width(), remaining.Height());
- textArea->MoveTo(remaining.left, remaining.top);
-
-#ifdef FEAT_MENU
- menuBar->ResizeTo(remaining.right, remaining.top);
- gui.menu_height = (int) remaining.top;
-#endif
- }
- Inherited::AllAttached();
-}
-
- void
-VimFormView::FrameResized(float new_width, float new_height)
-{
- BWindow *w = Window();
-#if 1
- /*
- * Look if there are more resize messages in the queue.
- * If so, ignore this one. The later one will be handled
- * eventually.
- */
- BMessageQueue *q = w->MessageQueue();
- if (q->FindMessage(B_VIEW_RESIZED, 0) != NULL) {
- return;
- }
-#endif
- new_width += 1; // adjust from width to number of pixels occupied
- new_height += 1;
-
-#if !HAVE_R3_OR_LATER
- int adjust_h, adjust_w;
-
- adjust_w = ((int)new_width - gui_get_base_width()) % gui.char_width;
- adjust_h = ((int)new_height - gui_get_base_height()) % gui.char_height;
-
- if (adjust_w > 0 || adjust_h > 0) {
- /*
- * This will generate a new FrameResized() message.
- * If we're running R3 or later, SetWindowAlignment() should make
- * sure that this does not happen.
- */
- w->ResizeBy(-adjust_w, -adjust_h);
-
- return;
- }
-#endif
-
- struct VimResizeMsg sm;
- sm.width = (int) new_width;
- sm.height = (int) new_height;
-
- write_port(gui.vdcmp, VimMsg::Resize, &sm, sizeof(sm));
- // calls gui_resize_shell(new_width, new_height);
-
- return;
-
- /*
- * The area below the vertical scrollbar is erased to the colour
- * set with SetViewColor() automatically, because we had set
- * B_WILL_DRAW. Resizing the window tight around the vertical
- * scroll bar also helps to avoid debris.
- */
-}
-
-/* ---------------- VimTextAreaView ---------------- */
-
-VimTextAreaView::VimTextAreaView(BRect frame):
- BView(frame, "VimTextAreaView", B_FOLLOW_ALL_SIDES,
- B_WILL_DRAW | B_FULL_UPDATE_ON_RESIZE),
- mouseDragEventCount(0)
-{
- init(frame);
-}
-
-VimTextAreaView::~VimTextAreaView()
-{
- gui.vimTextArea = NULL;
-}
-
- void
-VimTextAreaView::init(BRect frame)
-{
- /* set up global var for fast access */
- gui.vimTextArea = this;
-
- /*
- * Tell the app server not to erase the view: we will
- * fill it in completely by ourselves.
- * (Does this really work? Even if not, it won't harm either.)
- */
- SetViewColor(B_TRANSPARENT_32_BIT);
-#define PEN_WIDTH 1
- SetPenSize(PEN_WIDTH);
-}
-
- void
-VimTextAreaView::Draw(BRect updateRect)
-{
- /*
- * XXX Other ports call here:
- * out_flush(); * make sure all output has been processed *
- * but we can't do that, since it involves too much information
- * that is owned by other threads...
- */
-
- /*
- * No need to use gui.vimWindow->Lock(): we are locked already.
- * However, it would not hurt.
- */
- gui_redraw((int) updateRect.left, (int) updateRect.top,
- (int) (updateRect.Width() + PEN_WIDTH), (int) (updateRect.Height() + PEN_WIDTH));
-
- /* Clear the border areas if needed */
- rgb_color rgb = GUI_TO_RGB(gui.back_pixel);
- SetLowColor(rgb);
-
- if (updateRect.left < FILL_X(0)) // left border
- FillRect(BRect(updateRect.left, updateRect.top,
- FILL_X(0)-PEN_WIDTH, updateRect.bottom), B_SOLID_LOW);
- if (updateRect.top < FILL_Y(0)) // top border
- FillRect(BRect(updateRect.left, updateRect.top,
- updateRect.right, FILL_Y(0)-PEN_WIDTH), B_SOLID_LOW);
- if (updateRect.right >= FILL_X(Columns)) // right border
- FillRect(BRect(FILL_X((int)Columns), updateRect.top,
- updateRect.right, updateRect.bottom), B_SOLID_LOW);
- if (updateRect.bottom >= FILL_Y(Rows)) // bottom border
- FillRect(BRect(updateRect.left, FILL_Y((int)Rows),
- updateRect.right, updateRect.bottom), B_SOLID_LOW);
-}
-
- void
-VimTextAreaView::KeyDown(const char *bytes, int32 numBytes)
-{
- struct VimKeyMsg km;
- char_u *dest = km.chars;
-
- BMessage *msg = Window()->CurrentMessage();
- assert(msg);
- //msg->PrintToStream();
-
- /*
- * Convert special keys to Vim codes.
- * I think it is better to do it in the window thread
- * so we use at least a little bit of the potential
- * of our 2 CPUs. Besides, due to the fantastic mapping
- * of special keys to UTF-8, we have quite some work to
- * do...
- * TODO: I'm not quite happy with detection of special
- * keys. Perhaps I should use scan codes after all...
- */
- if (numBytes > 1) {
- /* This cannot be a special key */
- if (numBytes > KEY_MSG_BUFSIZ)
- numBytes = KEY_MSG_BUFSIZ; // should never happen... ???
- km.length = numBytes;
- memcpy((char *)dest, bytes, numBytes);
- } else {
- int32 scancode = 0;
- msg->FindInt32("key", &scancode);
-
- int32 beModifiers = 0;
- msg->FindInt32("modifiers", &beModifiers);
-
- char_u string[3];
- int len = 0;
- km.length = 0;
-
- bool canHaveVimModifiers = false;
-
- /*
- * For normal, printable ASCII characters, don't look them up
- * to check if they might be a special key. They aren't.
- */
- assert(B_BACKSPACE <= 0x20);
- assert(B_DELETE == 0x7F);
- if (((char_u)bytes[0] <= 0x20 || (char_u)bytes[0] == 0x7F) &&
- numBytes == 1) {
- /*
- * Due to the great nature of Be's mapping of special keys,
- * viz. into the range of the control characters,
- * we can only be sure it is *really* a special key if
- * if it is special without using ctrl. So, only if ctrl is
- * used, we need to check it unmodified.
- */
- if (beModifiers & B_CONTROL_KEY) {
- int index = keyMap->normal_map[scancode];
- int newNumBytes = keyMapChars[index];
- char_u *newBytes = (char_u *)&keyMapChars[index + 1];
-
- /*
- * Check if still special without the control key.
- * This is needed for BACKSPACE: that key does produce
- * different values with modifiers (DEL).
- * Otherwise we could simply have checked for equality.
- */
- if (newNumBytes != 1 || (*newBytes > 0x20 &&
- *newBytes != 0x7F )) {
- goto notspecial;
- }
- bytes = (char *)newBytes;
- }
- canHaveVimModifiers = true;
-
- uint16 beoskey;
- int first, last;
-
- /*
- * If numBytes == 0 that probably always indicates a special key.
- * (does not happen yet)
- */
- if (numBytes == 0 || bytes[0] == B_FUNCTION_KEY) {
- beoskey = F(scancode);
- first = FIRST_FUNCTION_KEY;
- last = NUM_SPECIAL_KEYS;
- } else if (*bytes == '\n' && scancode == 0x47) {
- /* remap the (non-keypad) ENTER key from \n to \r. */
- string[0] = '\r';
- len = 1;
- first = last = 0;
- } else {
- beoskey = K(bytes[0]);
- first = 0;
- last = FIRST_FUNCTION_KEY;
- }
-
- for (int i = first; i < last; i++) {
- if (special_keys[i].BeKeys == beoskey) {
- string[0] = CSI;
- string[1] = special_keys[i].vim_code0;
- string[2] = special_keys[i].vim_code1;
- len = 3;
- }
- }
- }
- notspecial:
- if (len == 0) {
- string[0] = bytes[0];
- len = 1;
- }
-
- /* Special keys (and a few others) may have modifiers */
-#if 0
- if (len == 3 ||
- bytes[0] == B_SPACE || bytes[0] == B_TAB ||
- bytes[0] == B_RETURN || bytes[0] == '\r' ||
- bytes[0] == B_ESCAPE)
-#else
- if (canHaveVimModifiers)
-#endif
- {
- int modifiers;
- modifiers = 0;
- if (beModifiers & B_SHIFT_KEY)
- modifiers |= MOD_MASK_SHIFT;
- if (beModifiers & B_CONTROL_KEY)
- modifiers |= MOD_MASK_CTRL;
- if (beModifiers & B_OPTION_KEY)
- modifiers |= MOD_MASK_ALT;
-
- /*
- * For some keys a shift modifier is translated into another key
- * code. Do we need to handle the case where len != 1 and
- * string[0] != CSI? (Not for BeOS, since len == 3 implies
- * string[0] == CSI...)
- */
- int key;
- if (string[0] == CSI && len == 3)
- key = TO_SPECIAL(string[1], string[2]);
- else
- key = string[0];
- key = simplify_key(key, &modifiers);
- if (IS_SPECIAL(key))
- {
- string[0] = CSI;
- string[1] = K_SECOND(key);
- string[2] = K_THIRD(key);
- len = 3;
- }
- else
- {
- string[0] = key;
- len = 1;
- }
-
- if (modifiers)
- {
- *dest++ = CSI;
- *dest++ = KS_MODIFIER;
- *dest++ = modifiers;
- km.length = 3;
- }
- }
- memcpy((char *)dest, string, len);
- km.length += len;
- }
-
- write_port(gui.vdcmp, VimMsg::Key, &km, sizeof(km));
-
- /*
- * blank out the pointer if necessary
- */
- if (p_mh && !gui.pointer_hidden)
- {
- guiBlankMouse(true);
- gui.pointer_hidden = TRUE;
- }
-}
- void
-VimTextAreaView::guiSendMouseEvent(
- int button,
- int x,
- int y,
- int repeated_click,
- int_u modifiers)
-{
- VimMouseMsg mm;
-
- mm.button = button;
- mm.x = x;
- mm.y = y;
- mm.repeated_click = repeated_click;
- mm.modifiers = modifiers;
-
- write_port(gui.vdcmp, VimMsg::Mouse, &mm, sizeof(mm));
- // calls gui_send_mouse_event()
-
- /*
- * if our pointer is currently hidden, then we should show it.
- */
- if (gui.pointer_hidden)
- {
- guiBlankMouse(false);
- gui.pointer_hidden = FALSE;
- }
-}
-
- void
-VimTextAreaView::guiBlankMouse(bool should_hide)
-{
- if (should_hide) {
- //gui.vimApp->HideCursor();
- gui.vimApp->ObscureCursor();
- /*
- * ObscureCursor() would even be easier, but then
- * Vim's idea of mouse visibility does not necessarily
- * correspond to reality.
- */
- } else {
- //gui.vimApp->ShowCursor();
- }
-}
-
- int_u
-VimTextAreaView::mouseModifiersToVim(int32 beModifiers)
-{
- int_u vim_modifiers = 0x0;
-
- if (beModifiers & B_SHIFT_KEY)
- vim_modifiers |= MOUSE_SHIFT;
- if (beModifiers & B_CONTROL_KEY)
- vim_modifiers |= MOUSE_CTRL;
- if (beModifiers & B_OPTION_KEY) /* Alt or Meta key */
- vim_modifiers |= MOUSE_ALT;
-
- return vim_modifiers;
-}
-
- void
-VimTextAreaView::MouseDown(BPoint point)
-{
- BMessage *m = Window()->CurrentMessage();
- assert(m);
-
- int32 buttons = 0;
- m->FindInt32("buttons", &buttons);
-
- int vimButton;
-
- if (buttons & B_PRIMARY_MOUSE_BUTTON)
- vimButton = MOUSE_LEFT;
- else if (buttons & B_SECONDARY_MOUSE_BUTTON)
- vimButton = MOUSE_RIGHT;
- else if (buttons & B_TERTIARY_MOUSE_BUTTON)
- vimButton = MOUSE_MIDDLE;
- else
- return; /* Unknown button */
-
- vimMouseButton = 1; /* don't care which one */
-
- /* Handle multiple clicks */
- int32 clicks = 0;
- m->FindInt32("clicks", &clicks);
-
- int32 modifiers = 0;
- m->FindInt32("modifiers", &modifiers);
-
- vimMouseModifiers = mouseModifiersToVim(modifiers);
-
- guiSendMouseEvent(vimButton, point.x, point.y,
- clicks > 1 /* = repeated_click*/, vimMouseModifiers);
-}
-
- void
-VimTextAreaView::MouseUp(BPoint point)
-{
- vimMouseButton = 0;
-
- BMessage *m = Window()->CurrentMessage();
- assert(m);
- //m->PrintToStream();
-
- int32 modifiers = 0;
- m->FindInt32("modifiers", &modifiers);
-
- vimMouseModifiers = mouseModifiersToVim(modifiers);
-
- guiSendMouseEvent(MOUSE_RELEASE, point.x, point.y,
- 0 /* = repeated_click*/, vimMouseModifiers);
-
- Inherited::MouseUp(point);
-}
-
- void
-VimTextAreaView::MouseMoved(BPoint point, uint32 transit, const BMessage *message)
-{
- /*
- * if our pointer is currently hidden, then we should show it.
- */
- if (gui.pointer_hidden)
- {
- guiBlankMouse(false);
- gui.pointer_hidden = FALSE;
- }
-
- if (!vimMouseButton) /* could also check m->"buttons" */
- return;
-
- atomic_add(&mouseDragEventCount, 1);
-
- /* Don't care much about "transit" */
- guiSendMouseEvent(MOUSE_DRAG, point.x, point.y, 0, vimMouseModifiers);
-}
-
- void
-VimTextAreaView::MessageReceived(BMessage *m)
-{
- switch (m->what) {
- case 'menu':
- {
- VimMenuMsg mm;
- mm.guiMenu = NULL; /* in case no pointer in msg */
- m->FindPointer("VimMenu", (void **)&mm.guiMenu);
-
- write_port(gui.vdcmp, VimMsg::Menu, &mm, sizeof(mm));
- }
- break;
- default:
- if (m->WasDropped()) {
- BWindow *w = Window();
- w->DetachCurrentMessage();
- w->Minimize(false);
- VimApp::SendRefs(m, (modifiers() & B_SHIFT_KEY) != 0);
- } else {
- Inherited::MessageReceived(m);
- }
- break;
- }
-}
-
- int
-VimTextAreaView::mchInitFont(char_u *name)
-{
- VimFont *newFont = (VimFont *)gui_mch_get_font(name, 0);
-
- gui.norm_font = (GuiFont)newFont;
- gui_mch_set_font((GuiFont)newFont);
- if (name)
- hl_set_font_name(name);
-
- SetDrawingMode(B_OP_COPY);
-
- /*
- * Try to load other fonts for bold, italic, and bold-italic.
- * We should also try to work out what font to use for these when they are
- * not specified by X resources, but we don't yet.
- */
-
- return OK;
-}
-
- void
-VimTextAreaView::mchDrawString(int row, int col, char_u *s, int len, int flags)
-{
- /*
- * First we must erase the area, because DrawString won't do
- * that for us. XXX Most of the time this is a waste of effort
- * since the bachground has been erased already... DRAW_TRANSP
- * should be set when appropriate!!!
- * (Rectangles include the bottom and right edge)
- */
- if (!(flags & DRAW_TRANSP)) {
- BRect r(FILL_X(col), FILL_Y(row),
- FILL_X(col + len) - PEN_WIDTH, FILL_Y(row + 1) - PEN_WIDTH);
- FillRect(r, B_SOLID_LOW);
- }
- BPoint where(TEXT_X(col), TEXT_Y(row));
- DrawString((char *)s, len, where);
-
- if (flags & DRAW_BOLD) {
- where.x += 1.0;
- SetDrawingMode(B_OP_BLEND);
- DrawString((char *)s, len, where);
- SetDrawingMode(B_OP_COPY);
- }
- if (flags & DRAW_UNDERL) {
- BPoint start(FILL_X(col), FILL_Y(row + 1) - PEN_WIDTH);
- BPoint end(FILL_X(col + len) - PEN_WIDTH, start.y);
-
- StrokeLine(start, end);
- }
-}
-
- void
-VimTextAreaView::mchClearBlock(
- int row1,
- int col1,
- int row2,
- int col2)
-{
- BRect r(FILL_X(col1), FILL_Y(row1),
- FILL_X(col2 + 1) - PEN_WIDTH, FILL_Y(row2 + 1) - PEN_WIDTH);
- gui_mch_set_bg_color(gui.back_pixel);
- FillRect(r, B_SOLID_LOW);
-}
-
- void
-VimTextAreaView::mchClearAll()
-{
- gui_mch_set_bg_color(gui.back_pixel);
- FillRect(Bounds(), B_SOLID_LOW);
-}
-
-/*
- * mchDeleteLines() Lock()s the window by itself.
- */
- void
-VimTextAreaView::mchDeleteLines(int row, int num_lines)
-{
- if (row + num_lines > gui.scroll_region_bot)
- {
- /* Scrolled out of region, just blank the lines out */
- gui_clear_block(row, gui.scroll_region_left,
- gui.scroll_region_bot, gui.scroll_region_right);
- }
- else
- {
- /* copy one extra pixel, for when bold has spilled over */
- int width = gui.char_width * (gui.scroll_region_right
- - gui.scroll_region_left + 1) + 1 - PEN_WIDTH;
- int height = gui.char_height *
- (gui.scroll_region_bot - row - num_lines + 1) - PEN_WIDTH;
-
- BRect source, dest;
-
- source.left = FILL_X(gui.scroll_region_left);
- source.top = FILL_Y(row + num_lines);
- source.right = source.left + width;
- source.bottom = source.top + height;
-
- dest.left = FILL_X(gui.scroll_region_left);
- dest.top = FILL_Y(row);
- dest.right = dest.left + width;
- dest.bottom = dest.top + height;
-
- /* XXX Attempt at a hack: */
- gui.vimWindow->UpdateIfNeeded();
-#if 0
- /* XXX Attempt at a hack: */
- if (gui.vimWindow->NeedsUpdate()) {
- fprintf(stderr, "mchDeleteLines: NeedsUpdate!\n");
- gui.vimWindow->UpdateIfNeeded();
- while (gui.vimWindow->NeedsUpdate()) {
- if (false && gui.vimWindow->Lock()) {
- Sync();
- gui.vimWindow->Unlock();
- }
- snooze(2);
- }
- }
-#endif
-
- if (gui.vimWindow->Lock()) {
- Sync();
- CopyBits(source, dest);
- //Sync();
-
- /* Update gui.cursor_row if the cursor scrolled or copied over */
- if (gui.cursor_row >= row
- && gui.cursor_col >= gui.scroll_region_left
- && gui.cursor_col <= gui.scroll_region_right)
- {
- if (gui.cursor_row < row + num_lines)
- gui.cursor_is_valid = FALSE;
- else if (gui.cursor_row <= gui.scroll_region_bot)
- gui.cursor_row -= num_lines;
- }
-
- /* Clear one column more for when bold has spilled over */
- gui_clear_block(gui.scroll_region_bot - num_lines + 1,
- gui.scroll_region_left,
- gui.scroll_region_bot, gui.scroll_region_right);
-
- gui.vimWindow->Unlock();
- /*
- * The Draw() callback will be called now if some of the source
- * bits were not in the visible region.
- */
-
- //gui_x11_check_copy_area();
- }
- }
-}
-
-/*
- * mchInsertLines() Lock()s the window by itself.
- */
- void
-VimTextAreaView::mchInsertLines(int row, int num_lines)
-{
- if (row + num_lines > gui.scroll_region_bot)
- {
- /* Scrolled out of region, just blank the lines out */
- gui_clear_block(row, gui.scroll_region_left,
- gui.scroll_region_bot, gui.scroll_region_right);
- }
- else
- {
- /* copy one extra pixel, for when bold has spilled over */
- int width = gui.char_width * (gui.scroll_region_right
- - gui.scroll_region_left + 1) + 1 - PEN_WIDTH;
- int height = gui.char_height *
- (gui.scroll_region_bot - row - num_lines + 1) - PEN_WIDTH;
-
- BRect source, dest;
-
- source.left = FILL_X(gui.scroll_region_left);
- source.top = FILL_Y(row);
- source.right = source.left + width;
- source.bottom = source.top + height;
-
- dest.left = FILL_X(gui.scroll_region_left);
- dest.top = FILL_Y(row + num_lines);
- dest.right = dest.left + width;
- dest.bottom = dest.top + height;
-
- /* XXX Attempt at a hack: */
- gui.vimWindow->UpdateIfNeeded();
-#if 0
- /* XXX Attempt at a hack: */
- if (gui.vimWindow->NeedsUpdate())
- fprintf(stderr, "mchInsertLines: NeedsUpdate!\n");
- gui.vimWindow->UpdateIfNeeded();
- while (gui.vimWindow->NeedsUpdate())
- snooze(2);
-#endif
-
- if (gui.vimWindow->Lock()) {
- Sync();
- CopyBits(source, dest);
- //Sync();
-
- /* Update gui.cursor_row if the cursor scrolled or copied over */
- if (gui.cursor_row >= gui.row
- && gui.cursor_col >= gui.scroll_region_left
- && gui.cursor_col <= gui.scroll_region_right)
- {
- if (gui.cursor_row <= gui.scroll_region_bot - num_lines)
- gui.cursor_row += num_lines;
- else if (gui.cursor_row <= gui.scroll_region_bot)
- gui.cursor_is_valid = FALSE;
- }
- /* Clear one column more for when bold has spilled over */
- gui_clear_block(row, gui.scroll_region_left,
- row + num_lines - 1, gui.scroll_region_right);
-
- gui.vimWindow->Unlock();
- /*
- * The Draw() callback will be called now if some of the source
- * bits were not in the visible region.
- * However, if we scroll too fast it can't keep up and the
- * update region gets messed up. This seems to be because copying
- * un-Draw()n bits does not generate Draw() calls for the copy...
- * I moved the hack to before the CopyBits() to reduce the
- * amount of additional waiting needed.
- */
-
- //gui_x11_check_copy_area();
- }
- }
-
-}
-
-/* ---------------- VimScrollBar ---------------- */
-
-/* BUG: XXX
- * It seems that BScrollBar determine their direction not from
- * "posture" but from if they are "tall" or "wide" in shape...
- *
- * Also, place them out of sight, because Vim enables them before
- * they are positioned.
- */
-VimScrollBar::VimScrollBar(scrollbar_T *g, orientation posture):
- BScrollBar(posture == B_HORIZONTAL ? BRect(-100,-100,-10,-90) :
- BRect(-100,-100,-90,-10),
- "vim scrollbar", (BView *)NULL,
- 0.0, 10.0, posture),
- ignoreValue(-1),
- scrollEventCount(0)
-{
- gsb = g;
- SetResizingMode(B_FOLLOW_NONE);
-}
-
-VimScrollBar::~VimScrollBar()
-{
-}
-
- void
-VimScrollBar::ValueChanged(float newValue)
-{
- if (ignoreValue >= 0.0 && newValue == ignoreValue) {
- ignoreValue = -1;
- return;
- }
- ignoreValue = -1;
- /*
- * We want to throttle the amount of scroll messages generated.
- * Normally I presume you won't get a new message before we've
- * handled the previous one, but because we're passing them on this
- * happens very quickly. So instead we keep a counter of how many
- * scroll events there are (or will be) in the VDCMP, and the
- * throttling happens at the receiving end.
- */
- atomic_add(&scrollEventCount, 1);
-
- struct VimScrollBarMsg sm;
-
- sm.sb = this;
- sm.value = (long) newValue;
- sm.stillDragging = TRUE;
-
- write_port(gui.vdcmp, VimMsg::ScrollBar, &sm, sizeof(sm));
-
- // calls gui_drag_scrollbar(sb, newValue, TRUE);
-}
-
-/*
- * When the mouse goes up, report that scrolling has stopped.
- * MouseUp() is NOT called when the mouse-up occurs outside
- * the window, even though the thumb does move while the mouse
- * is outside... This has some funny effects... XXX
- * So we do special processing when the window de/activates.
- */
- void
-VimScrollBar::MouseUp(BPoint where)
-{
- //BMessage *m = Window()->CurrentMessage();
- //m->PrintToStream();
-
- atomic_add(&scrollEventCount, 1);
-
- struct VimScrollBarMsg sm;
-
- sm.sb = this;
- sm.value = (long) Value();
- sm.stillDragging = FALSE;
-
- write_port(gui.vdcmp, VimMsg::ScrollBar, &sm, sizeof(sm));
-
- // calls gui_drag_scrollbar(sb, newValue, FALSE);
-
- Inherited::MouseUp(where);
-}
-
- void
-VimScrollBar::SetValue(float newValue)
-{
- if (newValue == Value())
- return;
-
- ignoreValue = newValue;
- Inherited::SetValue(newValue);
-}
-
-/* ---------------- VimFont ---------------- */
-
-VimFont::VimFont(): BFont()
-{
- init();
-}
-
-VimFont::VimFont(const VimFont *rhs): BFont(rhs)
-{
- init();
-}
-
-VimFont::VimFont(const BFont *rhs): BFont(rhs)
-{
- init();
-}
-
-VimFont::VimFont(const VimFont &rhs): BFont(rhs)
-{
- init();
-}
-
-VimFont::~VimFont()
-{
-}
-
- void
-VimFont::init()
-{
- next = NULL;
- refcount = 1;
- name = NULL;
-}
-
-/* ---------------- ---------------- */
-
-// some global variables
-static char appsig[] = "application/x-vnd.Rhialto-Vim-5";
-key_map *keyMap;
-char *keyMapChars;
-int main_exitcode = 127;
-
- status_t
-gui_beos_process_event(bigtime_t timeout)
-{
- struct VimMsg vm;
- long what;
- ssize_t size;
-
- size = read_port_etc(gui.vdcmp, &what, &vm, sizeof(vm),
- B_TIMEOUT, timeout);
-
- if (size >= 0) {
- switch (what) {
- case VimMsg::Key:
- {
- char_u *string = vm.u.Key.chars;
- int len = vm.u.Key.length;
- if (len == 1 && string[0] == Ctrl_chr('C')) {
- trash_input_buf();
- got_int = TRUE;
- }
- add_to_input_buf(string, len);
- }
- break;
- case VimMsg::Resize:
- gui_resize_shell(vm.u.NewSize.width, vm.u.NewSize.height);
- break;
- case VimMsg::ScrollBar:
- {
- /*
- * If loads of scroll messages queue up, use only the last
- * one. Always report when the scrollbar stops dragging.
- * This is not perfect yet anyway: these events are queued
- * yet again, this time in the keyboard input buffer.
- */
- int32 oldCount =
- atomic_add(&vm.u.Scroll.sb->scrollEventCount, -1);
- if (oldCount <= 1 || !vm.u.Scroll.stillDragging)
- gui_drag_scrollbar(vm.u.Scroll.sb->getGsb(),
- vm.u.Scroll.value, vm.u.Scroll.stillDragging);
- }
- break;
- case VimMsg::Menu:
- gui_menu_cb(vm.u.Menu.guiMenu);
- break;
- case VimMsg::Mouse:
- {
- int32 oldCount;
- if (vm.u.Mouse.button == MOUSE_DRAG)
- oldCount =
- atomic_add(&gui.vimTextArea->mouseDragEventCount, -1);
- else
- oldCount = 0;
- if (oldCount <= 1)
- gui_send_mouse_event(vm.u.Mouse.button, vm.u.Mouse.x,
- vm.u.Mouse.y, vm.u.Mouse.repeated_click,
- vm.u.Mouse.modifiers);
- }
- break;
- case VimMsg::Focus:
- gui.in_focus = vm.u.Focus.active;
- /* XXX Signal that scrollbar dragging has stopped?
- * This is needed because we don't get a MouseUp if
- * that happens while outside the window... :-(
- */
- if (gui.dragged_sb) {
- gui.dragged_sb = SBAR_NONE;
- }
- gui_update_cursor(TRUE, FALSE);
- break;
- case VimMsg::Refs:
- ::RefsReceived(vm.u.Refs.message, vm.u.Refs.changedir);
- break;
- default:
- // unrecognised message, ignore it
- break;
- }
- }
-
- /*
- * If size < B_OK, it is an error code.
- */
- return size;
-}
-
-/*
- * Here are some functions to protect access to ScreenLines[] and
- * LineOffset[]. These are used from the window thread to respond
- * to a Draw() callback. When that occurs, the window is already
- * locked by the system.
- *
- * Other code that needs to lock is any code that changes these
- * variables. Other read-only access, or access merely to the
- * contents of the screen buffer, need not be locked.
- *
- * If there is no window, don't call Lock() but do succeed.
- */
-
- int
-vim_lock_screen()
-{
- return !gui.vimWindow || gui.vimWindow->Lock();
-}
-
- void
-vim_unlock_screen()
-{
- if (gui.vimWindow)
- gui.vimWindow->Unlock();
-}
-
-#define RUN_BAPPLICATION_IN_NEW_THREAD 0
-
-#if RUN_BAPPLICATION_IN_NEW_THREAD
-
- int32
-run_vimapp(void *args)
-{
- VimApp app(appsig);
-
- gui.vimApp = &app;
- app.Run(); /* Run until Quit() called */
-
- return 0;
-}
-
-#else
-
- int32
-call_main(void *args)
-{
- struct MainArgs *ma = (MainArgs *)args;
-
- return main(ma->argc, ma->argv);
-}
-#endif
-
-extern "C" {
-
-/*
- * Parse the GUI related command-line arguments. Any arguments used are
- * deleted from argv, and *argc is decremented accordingly. This is called
- * when vim is started, whether or not the GUI has been started.
- */
- void
-gui_mch_prepare(
- int *argc,
- char **argv)
-{
- /*
- * We don't have any command line arguments for the BeOS GUI yet,
- * but this is an excellent place to create our Application object.
- */
- if (!gui.vimApp) {
- thread_info tinfo;
- get_thread_info(find_thread(NULL), &tinfo);
-
- /* May need the port very early on to process RefsReceived() */
- gui.vdcmp = create_port(B_MAX_PORT_COUNT, "vim VDCMP");
-
-#if RUN_BAPPLICATION_IN_NEW_THREAD
- thread_id tid = spawn_thread(run_vimapp, "vim VimApp",
- tinfo.priority, NULL);
- if (tid >= B_OK) {
- resume_thread(tid);
- } else {
- getout(1);
- }
-#else
- MainArgs ma = { *argc, argv };
- thread_id tid = spawn_thread(call_main, "vim main()",
- tinfo.priority, &ma);
- if (tid >= B_OK) {
- VimApp app(appsig);
-
- gui.vimApp = &app;
- resume_thread(tid);
- /*
- * This is rather horrible.
- * call_main will call main() again...
- * There will be no infinite recursion since
- * gui.vimApp is set now.
- */
- app.Run(); /* Run until Quit() called */
- //fprintf(stderr, "app.Run() returned...\n");
- status_t dummy_exitcode;
- (void)wait_for_thread(tid, &dummy_exitcode);
-
- /*
- * This path should be the normal one taken to exit Vim.
- * The main() thread calls mch_exit() which calls
- * gui_mch_exit() which terminates its thread.
- */
- exit(main_exitcode);
- }
-#endif
- }
- /* Don't fork() when starting the GUI. Spawned threads are not
- * duplicated with a fork(). The result is a mess.
- */
- gui.dofork = FALSE;
- /*
- * XXX Try to determine whether we were started from
- * the Tracker or the terminal.
- * It would be nice to have this work, because the Tracker
- * follows symlinks, so even if you double-click on gvim,
- * when it is a link to vim it will still pass a command name
- * of vim...
- * We try here to see if stdin comes from /dev/null. If so,
- * (or if there is an error, which should never happen) start the GUI.
- * This does the wrong thing for vim - </dev/null, and we're
- * too early to see the command line parsing. Tough.
- * On the other hand, it starts the gui for vim file & which is nice.
- */
- if (!isatty(0)) {
- struct stat stat_stdin, stat_dev_null;
-
- if (fstat(0, &stat_stdin) == -1 ||
- stat("/dev/null", &stat_dev_null) == -1 ||
- (stat_stdin.st_dev == stat_dev_null.st_dev &&
- stat_stdin.st_ino == stat_dev_null.st_ino))
- gui.starting = TRUE;
- }
-}
-
-/*
- * Check if the GUI can be started. Called before gvimrc is sourced.
- * Return OK or FAIL.
- */
- int
-gui_mch_init_check(void)
-{
- return OK; /* TODO: GUI can always be started? */
-}
-
-/*
- * Initialise the GUI. Create all the windows, set up all the call-backs
- * etc.
- */
- int
-gui_mch_init()
-{
- gui.def_norm_pixel = RGB(0x00, 0x00, 0x00); // black
- gui.def_back_pixel = RGB(0xFF, 0xFF, 0xFF); // white
- gui.norm_pixel = gui.def_norm_pixel;
- gui.back_pixel = gui.def_back_pixel;
-
- gui.scrollbar_width = (int) B_V_SCROLL_BAR_WIDTH;
- gui.scrollbar_height = (int) B_H_SCROLL_BAR_HEIGHT;
-#ifdef FEAT_MENU
- gui.menu_height = 19; // initial guess -
- // correct for my default settings
-#endif
- gui.border_offset = 3; // coordinates are inside window borders
-
- if (gui.vdcmp < B_OK)
- return FAIL;
- get_key_map(&keyMap, &keyMapChars);
-
- gui.vimWindow = new VimWindow(); /* hidden and locked */
- if (!gui.vimWindow)
- return FAIL;
-
- gui.vimWindow->Run(); /* Run() unlocks but does not show */
-
- /* Get the colors from the "Normal" group (set in syntax.c or in a vimrc
- * file) */
- set_normal_colors();
-
- /*
- * Check that none of the colors are the same as the background color
- */
- gui_check_colors();
-
- /* Get the colors for the highlight groups (gui_check_colors() might have
- * changed them) */
- highlight_gui_started(); /* re-init colors and fonts */
-
- gui_mch_new_colors(); /* window must exist for this */
-
- return OK;
-}
-
-/*
- * Called when the foreground or background color has been changed.
- */
- void
-gui_mch_new_colors()
-{
- rgb_color rgb = GUI_TO_RGB(gui.back_pixel);
-
- if (gui.vimWindow->Lock()) {
- gui.vimForm->SetViewColor(rgb);
- // Does this not have too much effect for those small rectangles?
- gui.vimForm->Invalidate();
- gui.vimWindow->Unlock();
- }
-}
-
-/*
- * Open the GUI window which was created by a call to gui_mch_init().
- */
- int
-gui_mch_open()
-{
- if (gui_win_x != -1 && gui_win_y != -1)
- gui_mch_set_winpos(gui_win_x, gui_win_y);
-
- /* Actually open the window */
- if (gui.vimWindow->Lock()) {
- gui.vimWindow->Show();
- gui.vimWindow->Unlock();
-
-#if USE_THREAD_FOR_INPUT_WITH_TIMEOUT
- /* Kill the thread that may have been created for the Terminal */
- beos_cleanup_read_thread();
-#endif
-
- return OK;
- }
-
- return FAIL;
-}
-
- void
-gui_mch_exit(int vim_exitcode)
-{
- if (gui.vimWindow) {
- thread_id tid = gui.vimWindow->Thread();
- gui.vimWindow->Lock();
- gui.vimWindow->Quit();
- /* Wait until it is truely gone */
- int32 exitcode;
- wait_for_thread(tid, &exitcode);
- }
- delete_port(gui.vdcmp);
-#if !RUN_BAPPLICATION_IN_NEW_THREAD
- /*
- * We are in the main() thread - quit the App thread and
- * quit ourselves (passing on the exitcode). Use a global since the
- * value from exit_thread() is only used if wait_for_thread() is
- * called in time (race condition).
- */
-#endif
- if (gui.vimApp) {
- VimTextAreaView::guiBlankMouse(false);
-
- main_exitcode = vim_exitcode;
-#if RUN_BAPPLICATION_IN_NEW_THREAD
- thread_id tid = gui.vimApp->Thread();
- int32 exitcode;
- gui.vimApp->Lock();
- gui.vimApp->Quit();
- gui.vimApp->Unlock();
- wait_for_thread(tid, &exitcode);
-#else
- gui.vimApp->Lock();
- gui.vimApp->Quit();
- gui.vimApp->Unlock();
- /* suicide */
- exit_thread(vim_exitcode);
-#endif
- }
- /* If we are somehow still here, let mch_exit() handle things. */
-}
-
-/*
- * Get the position of the top left corner of the window.
- */
- int
-gui_mch_get_winpos(int *x, int *y)
-{
- /* TODO */
- return FAIL;
-}
-
-/*
- * Set the position of the top left corner of the window to the given
- * coordinates.
- */
- void
-gui_mch_set_winpos(int x, int y)
-{
- /* TODO */
-}
-
-/*
- * Set the size of the window to the given width and height in pixels.
- */
- void
-gui_mch_set_shellsize(
- int width,
- int height,
- int min_width,
- int min_height,
- int base_width,
- int base_height)
-{
- /*
- * We are basically given the size of the VimForm, if I understand
- * correctly. Since it fills the window completely, this will also
- * be the size of the window.
- */
- if (gui.vimWindow->Lock()) {
- gui.vimWindow->ResizeTo(width - PEN_WIDTH, height - PEN_WIDTH);
-
- /* set size limits */
- float minWidth, maxWidth, minHeight, maxHeight;
-
- gui.vimWindow->GetSizeLimits(&minWidth, &maxWidth,
- &minHeight, &maxHeight);
- gui.vimWindow->SetSizeLimits(min_width, maxWidth,
- min_height, maxHeight);
-
-#if HAVE_R3_OR_LATER
- /*
- * Set the resizing alignment depending on font size.
- * XXX This is untested, since I don't have R3 yet.
- */
- SetWindowAlignment(
- B_PIXEL_ALIGNMENT, // window_alignment mode,
- 1, // int32 h,
- 0, // int32 hOffset = 0,
- gui.char_width, // int32 width = 0,
- base_width, // int32 widthOffset = 0,
- 1, // int32 v = 0,
- 0, // int32 vOffset = 0,
- gui.char_height, // int32 height = 0,
- base_height // int32 heightOffset = 0
- );
-#else
- /* don't know what to do with base_{width,height}. */
-#endif
-
- gui.vimWindow->Unlock();
- }
-}
-
- void
-gui_mch_get_screen_dimensions(
- int *screen_w,
- int *screen_h)
-{
- BRect frame;
-
- {
- BScreen screen(gui.vimWindow);
-
- if (screen.IsValid()) {
- frame = screen.Frame();
- } else {
- frame.right = 640;
- frame.bottom = 480;
- }
- }
-
- /* XXX approximations... */
- *screen_w = (int) frame.right - 2 * gui.scrollbar_width - 20;
- *screen_h = (int) frame.bottom - gui.scrollbar_height
-#ifdef FEAT_MENU
- - gui.menu_height
-#endif
- - 30;
-}
-
- void
-gui_mch_set_text_area_pos(
- int x,
- int y,
- int w,
- int h)
-{
- if (!gui.vimTextArea)
- return;
-
- if (gui.vimWindow->Lock()) {
- gui.vimTextArea->MoveTo(x, y);
- gui.vimTextArea->ResizeTo(w - PEN_WIDTH, h - PEN_WIDTH);
- gui.vimWindow->Unlock();
- }
-}
-
-
-/*
- * Scrollbar stuff:
- */
-
- void
-gui_mch_enable_scrollbar(
- scrollbar_T *sb,
- int flag)
-{
- VimScrollBar *vsb = sb->id;
- if (gui.vimWindow->Lock()) {
- /*
- * This function is supposed to be idempotent, but Show()/Hide()
- * is not. Therefore we test if they are needed.
- */
- if (flag) {
- if (vsb->IsHidden()) {
- vsb->Show();
- }
- } else {
- if (!vsb->IsHidden()) {
- vsb->Hide();
- }
- }
- gui.vimWindow->Unlock();
- }
-}
-
- void
-gui_mch_set_scrollbar_thumb(
- scrollbar_T *sb,
- int val,
- int size,
- int max)
-{
- if (gui.vimWindow->Lock()) {
- VimScrollBar *s = sb->id;
- if (max == 0) {
- s->SetValue(0);
- s->SetRange(0.0, 0.0);
- } else {
- s->SetProportion((float)size / (max + 1.0));
- s->SetSteps(1.0, size > 5 ? size - 2 : size);
-#ifndef SCROLL_PAST_END // really only defined in gui.c...
- max = max + 1 - size;
-#endif
- if (max < s->Value()) {
- /*
- * If the new maximum is lower than the current value,
- * setting it would cause the value to be clipped and
- * therefore a ValueChanged() call.
- * We avoid this by setting the value first, because
- * it presumably is <= max.
- */
- s->SetValue(val);
- s->SetRange(0.0, max);
- } else {
- /*
- * In the other case, set the range first, since the
- * new value might be higher than the current max.
- */
- s->SetRange(0.0, max);
- s->SetValue(val);
- }
- }
- gui.vimWindow->Unlock();
- }
-}
-
- void
-gui_mch_set_scrollbar_pos(
- scrollbar_T *sb,
- int x,
- int y,
- int w,
- int h)
-{
- if (gui.vimWindow->Lock()) {
- VimScrollBar *vsb = sb->id;
- vsb->MoveTo(x, y);
- vsb->ResizeTo(w - PEN_WIDTH, h - PEN_WIDTH);
- gui.vimWindow->Unlock();
- }
-}
-
- void
-gui_mch_create_scrollbar(
- scrollbar_T *sb,
- int orient) /* SBAR_VERT or SBAR_HORIZ */
-{
- orientation posture =
- (orient == SBAR_HORIZ) ? B_HORIZONTAL : B_VERTICAL;
-
- VimScrollBar *vsb = sb->id = new VimScrollBar(sb, posture);
- if (gui.vimWindow->Lock()) {
- vsb->SetTarget(gui.vimTextArea);
- vsb->Hide();
- gui.vimForm->AddChild(vsb);
- gui.vimWindow->Unlock();
- }
-}
-
-#if defined(FEAT_WINDOWS) || defined(PROTO)
- void
-gui_mch_destroy_scrollbar(
- scrollbar_T *sb)
-{
- if (gui.vimWindow->Lock()) {
- sb->id->RemoveSelf();
- delete sb->id;
- gui.vimWindow->Unlock();
- }
-}
-#endif
-
-/*
- * Cursor blink functions.
- *
- * This is a simple state machine:
- * BLINK_NONE not blinking at all
- * BLINK_OFF blinking, cursor is not shown
- * BLINK_ON blinking, cursor is shown
- */
-
-#define BLINK_NONE 0
-#define BLINK_OFF 1
-#define BLINK_ON 2
-
-static int blink_state = BLINK_NONE;
-static long_u blink_waittime = 700;
-static long_u blink_ontime = 400;
-static long_u blink_offtime = 250;
-static int blink_timer = 0;
-
- void
-gui_mch_set_blinking(
- long waittime,
- long on,
- long off)
-{
- /* TODO */
- blink_waittime = waittime;
- blink_ontime = on;
- blink_offtime = off;
-}
-
-/*
- * Stop the cursor blinking. Show the cursor if it wasn't shown.
- */
- void
-gui_mch_stop_blink()
-{
- /* TODO */
- if (blink_timer != 0)
- {
- //XtRemoveTimeOut(blink_timer);
- blink_timer = 0;
- }
- if (blink_state == BLINK_OFF)
- gui_update_cursor(TRUE, FALSE);
- blink_state = BLINK_NONE;
-}
-
-/*
- * Start the cursor blinking. If it was already blinking, this restarts the
- * waiting time and shows the cursor.
- */
- void
-gui_mch_start_blink()
-{
- /* TODO */
- if (blink_timer != 0)
- ;//XtRemoveTimeOut(blink_timer);
- /* Only switch blinking on if none of the times is zero */
- if (blink_waittime && blink_ontime && blink_offtime && gui.in_focus)
- {
- blink_timer = 1; //XtAppAddTimeOut(app_context, blink_waittime,
- blink_state = BLINK_ON;
- gui_update_cursor(TRUE, FALSE);
- }
-}
-
-/*
- * Initialise vim to use the font with the given name. Return FAIL if the font
- * could not be loaded, OK otherwise.
- */
- int
-gui_mch_init_font(
- char_u *font_name,
- int fontset)
-{
- if (gui.vimWindow->Lock())
- {
- int rc = gui.vimTextArea->mchInitFont(font_name);
- gui.vimWindow->Unlock();
-
- return rc;
- }
-
- return FAIL;
-}
-
- int
-gui_mch_adjust_charsize()
-{
- return FAIL;
-}
-
- GuiFont
-gui_mch_get_font(
- char_u *name,
- int giveErrorIfMissing)
-{
- VimFont *font = 0;
- static VimFont *fontList = NULL;
-
- if (!gui.in_use) /* can't do this when GUI not running */
- return NOFONT;
-
- if (!name)
- name = (char_u *)"be_fixed_font";
-
- VimFont *flp;
- for (flp = fontList; flp; flp = flp->next) {
- if (STRCMP(name, flp->name) == 0) {
- flp->refcount++;
- return (GuiFont)flp;
- }
- }
-
- font = new VimFont(be_fixed_font);
-
- /* Set some universal features: */
- font->SetSpacing(B_FIXED_SPACING);
- font->SetEncoding(B_ISO_8859_1);
-
- /* Remember font for later use */
- font->name = vim_strsave(name);
- font->next = fontList;
- fontList = font;
-
- font_family family;
- font_style style;
- int size;
- int len;
- char_u *end;
-
-#ifdef never
- // This leads to SEGV/BUS on R4+
- // Replace underscores with spaces, and I can't see why ?
- // richard@whitequeen.com jul 99
- while (end = (char_u *)strchr((char *)name, '_'))
- *end = ' ';
-#endif
- /*
- * Parse font names as Family/Style/Size.
- * On errors, just keep the be_fixed_font.
- */
- end = (char_u *)strchr((char *)name, '/');
- if (!end)
- goto error;
- strncpy(family, (char *)name, len = end - name);
- family[len] = '\0';
-
- name = end + 1;
- end = (char_u *)strchr((char *)name, '/');
- if (!end)
- goto error;
- strncpy(style, (char *)name, len = end - name);
- style[len] = '\0';
-
- name = end + 1;
- size = atoi((char *)name);
- if (size <= 0)
- goto error;
-
- font->SetFamilyAndStyle(family, style);
- font->SetSize(size);
- font->SetSpacing(B_FIXED_SPACING);
- font->SetEncoding(B_ISO_8859_1);
- //font->PrintToStream();
-
- return (GuiFont)font;
-
-error:
- if (giveErrorIfMissing)
- EMSG2("(fe0) Unknown font: %s", name);
-
- return (GuiFont)font;
-}
-
-#if defined(FEAT_EVAL) || defined(PROTO)
-/*
- * Return the name of font "font" in allocated memory.
- */
- char_u *
-gui_mch_get_fontname(GuiFont font, char_u *name)
-{
- return vim_strsave(((VimFont *)font)->name);
-}
-#endif
-
-/*
- * Set the current text font.
- */
- void
-gui_mch_set_font(
- GuiFont font)
-{
- if (gui.vimWindow->Lock()) {
- VimFont *vf = (VimFont *)font;
-
- gui.vimTextArea->SetFont(vf);
-
- gui.char_width = (int) vf->StringWidth("n");
- font_height fh;
- vf->GetHeight(&fh);
- gui.char_height = (int)(fh.ascent + 0.9999)
- + (int)(fh.descent + 0.9999) + (int)(fh.leading + 0.9999);
- gui.char_ascent = (int)(fh.ascent + 0.9999);
-
- gui.vimWindow->Unlock();
- }
-}
-
-#if 0 /* not used */
-/*
- * Return TRUE if the two fonts given are equivalent.
- */
- int
-gui_mch_same_font(
- GuiFont f1,
- GuiFont f2)
-{
- VimFont *vf1 = (VimFont *)f1;
- VimFont *vf2 = (VimFont *)f2;
-
- return f1 == f2 ||
- (vf1->FamilyAndStyle() == vf2->FamilyAndStyle() &&
- vf1->Size() == vf2->Size());
-}
-#endif
-
-/* XXX TODO This is apparently never called... */
- void
-gui_mch_free_font(
- GuiFont font)
-{
- VimFont *f = (VimFont *)font;
- if (--f->refcount <= 0) {
- if (f->refcount < 0)
- fprintf(stderr, "VimFont: refcount < 0\n");
- delete f;
- }
-}
-
- static int
-hex_digit(int c)
-{
- if (isdigit(c))
- return c - '0';
- c = TOLOWER_ASC(c);
- if (c >= 'a' && c <= 'f')
- return c - 'a' + 10;
- return -1000;
-}
-
-/*
- * This function has been lifted from gui_w32.c and extended a bit.
- *
- * Return the Pixel value (color) for the given color name.
- * Return INVALCOLOR for error.
- */
- guicolor_T
-gui_mch_get_color(
- char_u *name)
-{
- typedef struct GuiColourTable
- {
- char *name;
- guicolor_T colour;
- } GuiColourTable;
-
-#define NSTATIC_COLOURS 32
-#define NDYNAMIC_COLOURS 33
-#define NCOLOURS (NSTATIC_COLOURS + NDYNAMIC_COLOURS)
-
- static GuiColourTable table[NCOLOURS] =
- {
- {"Black", RGB(0x00, 0x00, 0x00)},
- {"DarkGray", RGB(0x80, 0x80, 0x80)},
- {"DarkGrey", RGB(0x80, 0x80, 0x80)},
- {"Gray", RGB(0xC0, 0xC0, 0xC0)},
- {"Grey", RGB(0xC0, 0xC0, 0xC0)},
- {"LightGray", RGB(0xD3, 0xD3, 0xD3)},
- {"LightGrey", RGB(0xD3, 0xD3, 0xD3)},
- {"White", RGB(0xFF, 0xFF, 0xFF)},
- {"DarkRed", RGB(0x80, 0x00, 0x00)},
- {"Red", RGB(0xFF, 0x00, 0x00)},
- {"LightRed", RGB(0xFF, 0xA0, 0xA0)},
- {"DarkBlue", RGB(0x00, 0x00, 0x80)},
- {"Blue", RGB(0x00, 0x00, 0xFF)},
- {"LightBlue", RGB(0xA0, 0xA0, 0xFF)},
- {"DarkGreen", RGB(0x00, 0x80, 0x00)},
- {"Green", RGB(0x00, 0xFF, 0x00)},
- {"LightGreen", RGB(0xA0, 0xFF, 0xA0)},
- {"DarkCyan", RGB(0x00, 0x80, 0x80)},
- {"Cyan", RGB(0x00, 0xFF, 0xFF)},
- {"LightCyan", RGB(0xA0, 0xFF, 0xFF)},
- {"DarkMagenta", RGB(0x80, 0x00, 0x80)},
- {"Magenta", RGB(0xFF, 0x00, 0xFF)},
- {"LightMagenta", RGB(0xFF, 0xA0, 0xFF)},
- {"Brown", RGB(0x80, 0x40, 0x40)},
- {"Yellow", RGB(0xFF, 0xFF, 0x00)},
- {"LightYellow", RGB(0xFF, 0xFF, 0xA0)},
- {"DarkYellow", RGB(0xBB, 0xBB, 0x00)},
- {"SeaGreen", RGB(0x2E, 0x8B, 0x57)},
- {"Orange", RGB(0xFF, 0xA5, 0x00)},
- {"Purple", RGB(0xA0, 0x20, 0xF0)},
- {"SlateBlue", RGB(0x6A, 0x5A, 0xCD)},
- {"Violet", RGB(0xEE, 0x82, 0xEE)},
- };
-
- static int endColour = NSTATIC_COLOURS;
- static int newColour = NSTATIC_COLOURS;
-
- int r, g, b;
- int i;
-
- if (name[0] == '#' && STRLEN(name) == 7)
- {
- /* Name is in "#rrggbb" format */
- r = hex_digit(name[1]) * 16 + hex_digit(name[2]);
- g = hex_digit(name[3]) * 16 + hex_digit(name[4]);
- b = hex_digit(name[5]) * 16 + hex_digit(name[6]);
- if (r < 0 || g < 0 || b < 0)
- return INVALCOLOR;
- return RGB(r, g, b);
- }
- else
- {
- /* Check if the name is one of the colours we know */
- for (i = 0; i < endColour; i++)
- if (STRICMP(name, table[i].name) == 0)
- return table[i].colour;
- }
-
- /*
- * Last attempt. Look in the file "$VIM/rgb.txt".
- */
- {
-#define LINE_LEN 100
- FILE *fd;
- char line[LINE_LEN];
- char_u *fname;
-
- fname = expand_env_save((char_u *)"$VIM/rgb.txt");
- if (fname == NULL)
- return INVALCOLOR;
-
- fd = fopen((char *)fname, "rt");
- vim_free(fname);
- if (fd == NULL)
- return INVALCOLOR;
-
- while (!feof(fd))
- {
- int len;
- int pos;
- char *colour;
-
- fgets(line, LINE_LEN, fd);
- len = strlen(line);
-
- if (len <= 1 || line[len-1] != '\n')
- continue;
-
- line[len-1] = '\0';
-
- i = sscanf(line, "%d %d %d %n", &r, &g, &b, &pos);
- if (i != 3)
- continue;
-
- colour = line + pos;
-
- if (STRICMP(colour, name) == 0)
- {
- fclose(fd);
- /*
- * Now remember this colour in the table.
- * A LRU scheme might be better but this is simpler.
- * Or could use a growing array.
- */
- guicolor_T gcolour = RGB(r,g,b);
-
- vim_free(table[newColour].name);
- table[newColour].name = (char *)vim_strsave((char_u *)colour);
- table[newColour].colour = gcolour;
-
- newColour++;
- if (newColour >= NCOLOURS)
- newColour = NSTATIC_COLOURS;
- if (endColour < NCOLOURS)
- endColour = newColour;
-
- return gcolour;
- }
- }
-
- fclose(fd);
- }
-
- return INVALCOLOR;
-}
-
-/*
- * Set the current text foreground color.
- */
- void
-gui_mch_set_fg_color(
- guicolor_T color)
-{
- rgb_color rgb = GUI_TO_RGB(color);
- if (gui.vimWindow->Lock()) {
- gui.vimTextArea->SetHighColor(rgb);
- gui.vimWindow->Unlock();
- }
-}
-
-/*
- * Set the current text background color.
- */
- void
-gui_mch_set_bg_color(
- guicolor_T color)
-{
- rgb_color rgb = GUI_TO_RGB(color);
- if (gui.vimWindow->Lock()) {
- gui.vimTextArea->SetLowColor(rgb);
- gui.vimWindow->Unlock();
- }
-}
-
- void
-gui_mch_draw_string(
- int row,
- int col,
- char_u *s,
- int len,
- int flags)
-{
- if (gui.vimWindow->Lock()) {
- gui.vimTextArea->mchDrawString(row, col, s, len, flags);
- gui.vimWindow->Unlock();
- }
-}
-
-/*
- * Return OK if the key with the termcap name "name" is supported.
- */
- int
-gui_mch_haskey(
- char_u *name)
-{
- int i;
-
- for (i = 0; special_keys[i].BeKeys != 0; i++)
- if (name[0] == special_keys[i].vim_code0 &&
- name[1] == special_keys[i].vim_code1)
- return OK;
- return FAIL;
-}
-
- void
-gui_mch_beep()
-{
- ::beep();
-}
-
- void
-gui_mch_flash(int msec)
-{
- /* Do a visual beep by reversing the foreground and background colors */
-
- if (gui.vimWindow->Lock()) {
- BRect rect = gui.vimTextArea->Bounds();
-
- gui.vimTextArea->SetDrawingMode(B_OP_INVERT);
- gui.vimTextArea->FillRect(rect);
- gui.vimTextArea->Sync();
- snooze(msec * 1000); /* wait for a few msec */
- gui.vimTextArea->FillRect(rect);
- gui.vimTextArea->SetDrawingMode(B_OP_COPY);
- gui.vimTextArea->Flush();
- gui.vimWindow->Unlock();
- }
-}
-
-/*
- * Invert a rectangle from row r, column c, for nr rows and nc columns.
- */
- void
-gui_mch_invert_rectangle(
- int r,
- int c,
- int nr,
- int nc)
-{
- BRect rect;
- rect.left = FILL_X(c);
- rect.top = FILL_Y(r);
- rect.right = rect.left + nc * gui.char_width - PEN_WIDTH;
- rect.bottom = rect.top + nr * gui.char_height - PEN_WIDTH;
-
- if (gui.vimWindow->Lock()) {
- gui.vimTextArea->SetDrawingMode(B_OP_INVERT);
- gui.vimTextArea->FillRect(rect);
- gui.vimTextArea->SetDrawingMode(B_OP_COPY);
- gui.vimWindow->Unlock();
- }
-}
-
-/*
- * Iconify the GUI window.
- */
- void
-gui_mch_iconify()
-{
- if (gui.vimWindow->Lock()) {
- gui.vimWindow->Minimize(true);
- gui.vimWindow->Unlock();
- }
-}
-
-#if defined(FEAT_EVAL) || defined(PROTO)
-/*
- * Bring the Vim window to the foreground.
- */
- void
-gui_mch_set_foreground()
-{
- /* TODO */
-}
-#endif
-
-/*
- * Set the window title
- */
- void
-gui_mch_settitle(
- char_u *title,
- char_u *icon)
-{
- if (gui.vimWindow->Lock()) {
- gui.vimWindow->SetTitle((char *)title);
- gui.vimWindow->Unlock();
- }
-}
-
-/*
- * Draw a cursor without focus.
- */
- void
-gui_mch_draw_hollow_cursor(guicolor_T color)
-{
- gui_mch_set_fg_color(color);
-
- BRect r;
- r.left = FILL_X(gui.col);
- r.top = FILL_Y(gui.row);
- r.right = r.left + gui.char_width - PEN_WIDTH;
- r.bottom = r.top + gui.char_height - PEN_WIDTH;
-
- if (gui.vimWindow->Lock()) {
- gui.vimTextArea->StrokeRect(r);
- gui.vimWindow->Unlock();
- //gui_mch_flush();
- }
-}
-
-/*
- * Draw part of a cursor, only w pixels wide, and h pixels high.
- */
- void
-gui_mch_draw_part_cursor(
- int w,
- int h,
- guicolor_T color)
-{
- gui_mch_set_fg_color(color);
-
- BRect r;
- r.left =
-#ifdef FEAT_RIGHTLEFT
- /* vertical line should be on the right of current point */
- CURSOR_BAR_RIGHT ? FILL_X(gui.col + 1) - w :
-#endif
- FILL_X(gui.col);
- r.right = r.left + w - PEN_WIDTH;
- r.bottom = FILL_Y(gui.row + 1) - PEN_WIDTH;
- r.top = r.bottom - h + PEN_WIDTH;
-
- if (gui.vimWindow->Lock()) {
- gui.vimTextArea->FillRect(r);
- gui.vimWindow->Unlock();
- //gui_mch_flush();
- }
-}
-
-/*
- * Catch up with any queued events. This may put keyboard input into the
- * input buffer, call resize call-backs, trigger timers etc. If there is
- * nothing in the event queue (& no timers pending), then we return
- * immediately.
- */
- void
-gui_mch_update()
-{
- gui_mch_flush();
- while (port_count(gui.vdcmp) > 0 &&
- !vim_is_input_buf_full() &&
- gui_beos_process_event(0) >= B_OK)
- /* nothing */ ;
-}
-
-/*
- * GUI input routine called by gui_wait_for_chars(). Waits for a character
- * from the keyboard.
- * wtime == -1 Wait forever.
- * wtime == 0 This should never happen.
- * wtime > 0 Wait wtime milliseconds for a character.
- * Returns OK if a character was found to be available within the given time,
- * or FAIL otherwise.
- */
- int
-gui_mch_wait_for_chars(
- int wtime)
-{
- int focus;
- bigtime_t until, timeout;
- status_t st;
-
- if (wtime >= 0) {
- timeout = wtime * 1000;
- until = system_time() + timeout;
- } else {
- timeout = B_INFINITE_TIMEOUT;
- }
-
- focus = gui.in_focus;
- for (;;)
- {
- /* Stop or start blinking when focus changes */
- if (gui.in_focus != focus)
- {
- if (gui.in_focus)
- gui_mch_start_blink();
- else
- gui_mch_stop_blink();
- focus = gui.in_focus;
- }
-
- gui_mch_flush();
- /*
- * Don't use gui_mch_update() because then we will spin-lock until a
- * char arrives, instead we use gui_beos_process_event() to hang until
- * an event arrives. No need to check for input_buf_full because we
- * are returning as soon as it contains a single char.
- */
- st = gui_beos_process_event(timeout);
-
- if (input_available())
- return OK;
- if (st < B_OK) /* includes B_TIMED_OUT */
- return FAIL;
-
- /*
- * Calculate how much longer we're willing to wait for the
- * next event.
- */
- if (wtime >= 0) {
- timeout = until - system_time();
- if (timeout < 0)
- break;
- }
- }
- return FAIL;
-
-}
-
-/*
- * Output routines.
- */
-
-/*
- * Flush any output to the screen. This is typically called before
- * the app goes to sleep.
- */
- void
-gui_mch_flush()
-{
- // does this need to lock the window? Apparently not but be safe.
- if (gui.vimWindow->Lock()) {
- gui.vimWindow->Flush();
- gui.vimWindow->Unlock();
- }
- return;
-}
-
-/*
- * Clear a rectangular region of the screen from text pos (row1, col1) to
- * (row2, col2) inclusive.
- */
- void
-gui_mch_clear_block(
- int row1,
- int col1,
- int row2,
- int col2)
-{
- if (gui.vimWindow->Lock()) {
- gui.vimTextArea->mchClearBlock(row1, col1, row2, col2);
- gui.vimWindow->Unlock();
- }
-}
-
- void
-gui_mch_clear_all()
-{
- if (gui.vimWindow->Lock()) {
- gui.vimTextArea->mchClearAll();
- gui.vimWindow->Unlock();
- }
-}
-
-/*
- * Delete the given number of lines from the given row, scrolling up any
- * text further down within the scroll region.
- */
- void
-gui_mch_delete_lines(
- int row,
- int num_lines)
-{
- gui.vimTextArea->mchDeleteLines(row, num_lines);
-}
-
-/*
- * Insert the given number of lines before the given row, scrolling down any
- * following text within the scroll region.
- */
- void
-gui_mch_insert_lines(
- int row,
- int num_lines)
-{
- gui.vimTextArea->mchInsertLines(row, num_lines);
-}
-
-#if defined(FEAT_MENU) || defined(PROTO)
-/*
- * Menu stuff.
- */
-
- void
-gui_mch_enable_menu(
- int flag)
-{
- if (gui.vimWindow->Lock())
- {
- BMenuBar *menubar = gui.vimForm->MenuBar();
- menubar->SetEnabled(flag);
- gui.vimWindow->Unlock();
- }
-}
-
- void
-gui_mch_set_menu_pos(
- int x,
- int y,
- int w,
- int h)
-{
- /* It will be in the right place anyway */
-}
-
-/*
- * Add a sub menu to the menu bar.
- */
- void
-gui_mch_add_menu(
- vimmenu_T *menu,
- int idx)
-{
- vimmenu_T *parent = menu->parent;
-
- if (!menu_is_menubar(menu->name)
- || (parent != NULL && parent->submenu_id == NULL))
- return;
-
- if (gui.vimWindow->Lock())
- {
-/* Major re-write of the menu code, it was failing with memory corruption when
- * we started loading multiple files (the Buffer menu)
- *
- * Note we don't use the preference values yet, all are inserted into the
- * menubar on a first come-first served basis...
- *
- * richard@whitequeen.com jul 99
- */
-
- BMenu *tmp;
-
- if ( parent )
- tmp = parent->submenu_id;
- else
- tmp = gui.vimForm->MenuBar();
-// make sure we don't try and add the same menu twice. The Buffers menu tries to
-// do this and Be starts to crash...
-
- if ( ! tmp->FindItem((const char *) menu->dname)) {
-
- BMenu *bmenu = new BMenu((char *)menu->dname);
-
- menu->submenu_id = bmenu;
-
-// when we add a BMenu to another Menu, it creates the interconnecting BMenuItem
- tmp->AddItem(bmenu);
-
-// Now its safe to query the menu for the associated MenuItem....
- menu->id = tmp->FindItem((const char *) menu->dname);
-
- }
- gui.vimWindow->Unlock();
- }
-}
-
- void
-gui_mch_toggle_tearoffs(int enable)
-{
- /* no tearoff menus */
-}
-
- static BMessage *
-MenuMessage(vimmenu_T *menu)
-{
- BMessage *m = new BMessage('menu');
- m->AddPointer("VimMenu", (void *)menu);
-
- return m;
-}
-
-/*
- * Add a menu item to a menu
- */
- void
-gui_mch_add_menu_item(
- vimmenu_T *menu,
- int idx)
-{
- int mnemonic = 0;
- vimmenu_T *parent = menu->parent;
-
- if (parent->submenu_id == NULL)
- return;
-
-#ifdef never
- /* why not add separators ?
- * richard
- */
- /* Don't add menu separator */
- if (menu_is_separator(menu->name))
- return;
-#endif
-
- /* TODO: use menu->actext */
- /* This is difficult, since on Be, an accelerator must be a single char
- * and a lot of Vim ones are the standard VI commands.
- *
- * Punt for Now...
- * richard@whiequeen.com jul 99
- */
- if (gui.vimWindow->Lock())
- {
- if ( menu_is_separator(menu->name)) {
- BSeparatorItem *item = new BSeparatorItem();
- parent->submenu_id->AddItem(item);
- menu->id = item;
- menu->submenu_id = NULL;
- }
- else {
- BMenuItem *item = new BMenuItem((char *)menu->dname,
- MenuMessage(menu));
- item->SetTarget(gui.vimTextArea);
- item->SetTrigger((char) menu->mnemonic);
- parent->submenu_id->AddItem(item);
- menu->id = item;
- menu->submenu_id = NULL;
- }
- gui.vimWindow->Unlock();
- }
-}
-
-/*
- * Destroy the machine specific menu widget.
- */
- void
-gui_mch_destroy_menu(
- vimmenu_T *menu)
-{
- if (gui.vimWindow->Lock())
- {
- assert(menu->submenu_id == NULL || menu->submenu_id->CountItems() == 0);
- /*
- * Detach this menu from its parent, so that it is not deleted
- * twice once we get to delete that parent.
- * Deleting a BMenuItem also deletes the associated BMenu, if any
- * (which does not have any items anymore since they were
- * removed and deleted before).
- */
- BMenu *bmenu = menu->id->Menu();
- if (bmenu)
- {
- bmenu->RemoveItem(menu->id);
- /*
- * If we removed the last item from the menu bar,
- * resize it out of sight.
- */
- if (bmenu == gui.vimForm->MenuBar() && bmenu->CountItems() == 0)
- {
- bmenu->ResizeTo(-MENUBAR_MARGIN, -MENUBAR_MARGIN);
- }
- }
- delete menu->id;
- menu->id = NULL;
- menu->submenu_id = NULL;
-
- gui.menu_height = (int) gui.vimForm->MenuHeight();
- gui.vimWindow->Unlock();
- }
-}
-
-/*
- * Make a menu either grey or not grey.
- */
- void
-gui_mch_menu_grey(
- vimmenu_T *menu,
- int grey)
-{
- if (menu->id != NULL)
- menu->id->SetEnabled(!grey);
-}
-
-/*
- * Make menu item hidden or not hidden
- */
- void
-gui_mch_menu_hidden(
- vimmenu_T *menu,
- int hidden)
-{
- if (menu->id != NULL)
- menu->id->SetEnabled(!hidden);
-}
-
-/*
- * This is called after setting all the menus to grey/hidden or not.
- */
- void
-gui_mch_draw_menubar()
-{
- /* Nothing to do in BeOS */
-}
-
-#endif /* FEAT_MENU */
-
-/* Mouse stuff */
-
-#ifdef FEAT_CLIPBOARD
-/*
- * Clipboard stuff, for cutting and pasting text to other windows.
- */
-char textplain[] = "text/plain";
-char vimselectiontype[] = "application/x-vnd.Rhialto-Vim-selectiontype";
-
-/*
- * Get the current selection and put it in the clipboard register.
- */
- void
-clip_mch_request_selection(VimClipboard *cbd)
-{
- if (be_clipboard->Lock())
- {
- BMessage *m = be_clipboard->Data();
- //m->PrintToStream();
-
- char_u *string = NULL;
- ssize_t stringlen = -1;
-
- if (m->FindData(textplain, B_MIME_TYPE,
- (const void **)&string, &stringlen) == B_OK
- || m->FindString("text", (const char **)&string) == B_OK)
- {
- if (stringlen == -1)
- stringlen = STRLEN(string);
-
- int type;
- char *seltype;
- ssize_t seltypelen;
-
- /*
- * Try to get the special vim selection type first
- */
- if (m->FindData(vimselectiontype, B_MIME_TYPE,
- (const void **)&seltype, &seltypelen) == B_OK)
- {
- switch (*seltype)
- {
- default:
- case 'L': type = MLINE; break;
- case 'C': type = MCHAR; break;
-#ifdef FEAT_VISUAL
- case 'B': type = MBLOCK; break;
-#endif
- }
- }
- else
- {
- /* Otherwise use heuristic as documented */
- type = memchr(string, stringlen, '\n') ? MLINE : MCHAR;
- }
- clip_yank_selection(type, string, (long)stringlen, cbd);
- }
- be_clipboard->Unlock();
- }
-}
-/*
- * Make vim the owner of the current selection.
- */
- void
-clip_mch_lose_selection(VimClipboard *cbd)
-{
- /* Nothing needs to be done here */
-}
-
-/*
- * Make vim the owner of the current selection. Return OK upon success.
- */
- int
-clip_mch_own_selection(VimClipboard *cbd)
-{
- /*
- * Never actually own the clipboard. If another application sets the
- * clipboard, we don't want to think that we still own it.
- */
- return FAIL;
-}
-
-/*
- * Send the current selection to the clipboard.
- */
- void
-clip_mch_set_selection(VimClipboard *cbd)
-{
- if (be_clipboard->Lock())
- {
- be_clipboard->Clear();
- BMessage *m = be_clipboard->Data();
- assert(m);
-
- /* If the '*' register isn't already filled in, fill it in now */
- cbd->owned = TRUE;
- clip_get_selection(cbd);
- cbd->owned = FALSE;
-
- char_u *str = NULL;
- long_u count;
- int type;
-
- type = clip_convert_selection(&str, &count, cbd);
-
- if (type < 0)
- return;
-
- m->AddData(textplain, B_MIME_TYPE, (void *)str, count);
-
- /* Add type of selection */
- char vtype;
- switch (type)
- {
- default:
- case MLINE: vtype = 'L'; break;
- case MCHAR: vtype = 'C'; break;
-#ifdef FEAT_VISUAL
- case MBLOCK: vtype = 'B'; break;
-#endif
- }
- m->AddData(vimselectiontype, B_MIME_TYPE, (void *)&vtype, 1);
-
- vim_free(str);
-
- be_clipboard->Commit();
- be_clipboard->Unlock();
- }
-}
-
-#endif /* FEAT_CLIPBOARD */
-
-/*
- * Return the RGB value of a pixel as long.
- */
- long_u
-gui_mch_get_rgb(guicolor_T pixel)
-{
- rgb_color rgb = GUI_TO_RGB(pixel);
-
- return ((rgb.red & 0xff) << 16) + ((rgb.green & 0xff) << 8)
- + (rgb.blue & 0xff);
-}
-
- void
-gui_mch_setmouse(int x, int y)
-{
- TRACE();
- /* TODO */
-}
-
- void
-gui_mch_show_popupmenu(vimmenu_T *menu)
-{
- TRACE();
- /* TODO */
-}
-
-int
-gui_mch_get_mouse_x()
-{
- TRACE();
- return 0;
-}
-
-
-int
-gui_mch_get_mouse_y()
-{
- TRACE();
- return 0;
-}
-
-} /* extern "C" */
diff --git a/src/gui_beos.h b/src/gui_beos.h
deleted file mode 100644
index b2fc45854..000000000
--- a/src/gui_beos.h
+++ /dev/null
@@ -1,49 +0,0 @@
-/* vi:set ts=8 sts=4 sw=4:
- *
- * VIM - Vi IMproved by Bram Moolenaar
- * GUI support by Olaf "Rhialto" Seibert
- *
- * Do ":help uganda" in Vim to read copying and usage conditions.
- * Do ":help credits" in Vim to see a list of people who contributed.
- *
- * BeOS GUI.
- *
- * GUI support for the Buzzword Enhanced Operating System for PPC.
- *
- */
-
-/*
- * This file must be acceptable both as C and C++.
- * The BeOS API is defined in terms of C++, but some classes
- * should be somewhat known in the common C code.
- */
-
-/* System classes */
-
-struct BMenu;
-struct BMenuItem;
-
-/* Our own Vim-related classes */
-
-struct VimApp;
-struct VimFormView;
-struct VimTextAreaView;
-struct VimWindow;
-struct VimScrollBar;
-
-/* Locking functions */
-
-extern int vim_lock_screen();
-extern void vim_unlock_screen();
-
-#ifndef __cplusplus
-
-typedef struct BMenu BMenu;
-typedef struct BMenuItem BMenuItem;
-typedef struct VimWindow VimWindow;
-typedef struct VimFormView VimFormView;
-typedef struct VimTextAreaView VimTextAreaView;
-typedef struct VimApp VimApp;
-typedef struct VimScrollBar VimScrollBar;
-
-#endif
diff --git a/src/proto/gui_amiga.pro b/src/proto/gui_amiga.pro
deleted file mode 100644
index 2f8d2ac59..000000000
--- a/src/proto/gui_amiga.pro
+++ /dev/null
@@ -1,69 +0,0 @@
-/* gui_amiga.c */
-void gui_mch_add_menu_item __ARGS((vimmenu_T *menu, int idx));
-void gui_mch_add_menu __ARGS((vimmenu_T *menu, int idx));
-void gui_mch_toggle_tearoffs __ARGS((int enable));
-int gui_mch_set_blinking __ARGS((long wait, long on, long off));
-void gui_mch_prepare __ARGS((int *argc, char **argv));
-void atexitDoThis __ARGS((void));
-int gui_mch_init_check __ARGS((void));
-int gui_mch_init __ARGS((void));
-void gui_mch_new_colors __ARGS((void));
-int gui_mch_open __ARGS((void));
-void gui_mch_exit __ARGS((int returnCode));
-int gui_mch_get_winpos __ARGS((int *x, int *y));
-void gui_mch_set_winpos __ARGS((int x, int y));
-void gui_mch_set_shellsize __ARGS((int width, int height, int min_width, int min_height, int base_width, int base_height));
-void gui_mch_get_screen_dimensions __ARGS((int *screen_w, int *screen_h));
-void gui_mch_set_text_area_pos __ARGS((int x, int y, int w, int h));
-void gui_mch_enable_scrollbar __ARGS((scrollbar_T *sb, int flag));
-void gui_mch_set_scrollbar_thumb __ARGS((scrollbar_T *sb, long val, long size, long max));
-void gui_mch_set_scrollbar_pos __ARGS((scrollbar_T *sb, int x, int y, int w, int h));
-void gui_mch_create_scrollbar __ARGS((scrollbar_T *sb, int orient));
-void gui_mch_destroy_scrollbar __ARGS((scrollbar_T *sb));
-char_u *gui_mch_getfontname __ARGS((GuiFont font));
-int gui_mch_init_font __ARGS((char_u *font_name, int fontset));
-int gui_mch_adjust_charsize __ARGS((void));
-GuiFont gui_mch_get_font __ARGS((char_u *name, int giveErrorIfMissing));
-char_u *gui_mch_get_fontname __ARGS((GuiFont font, char_u *name));
-void gui_mch_set_font __ARGS((GuiFont font));
-void gui_mch_free_font __ARGS((GuiFont font));
-guicolor_T gui_mch_get_color __ARGS((char_u *name));
-void gui_mch_set_colors __ARGS((guicolor_T fg, guicolor_T bg));
-void gui_mch_set_fg_color __ARGS((guicolor_T color));
-void gui_mch_set_bg_color __ARGS((guicolor_T color));
-void gui_mch_draw_string __ARGS((int row, int col, char_u *s, int len, int flags));
-int gui_mch_haskey __ARGS((char_u *name));
-void gui_mch_beep __ARGS((void));
-void gui_mch_flash __ARGS((int msec));
-void gui_mch_invert_rectangle __ARGS((int r, int c, int nr, int nc));
-void gui_mch_iconify __ARGS((void));
-void gui_mch_set_foreground __ARGS((void));
-void gui_mch_settitle __ARGS((char_u *title, char_u *icon));
-void gui_mch_stop_blink __ARGS((void));
-void gui_mch_start_blink __ARGS((void));
-void gui_mch_draw_hollow_cursor __ARGS((guicolor_T color));
-void gui_mch_draw_part_cursor __ARGS((int w, int h, guicolor_T color));
-void gui_mch_update __ARGS((void));
-int gui_mch_wait_for_chars __ARGS((int wtime));
-void gui_mch_flush __ARGS((void));
-void gui_mch_clear_block __ARGS((int row1, int col1, int row2, int col2));
-void gui_mch_clear_all __ARGS((void));
-void gui_mch_delete_lines __ARGS((int row, int num_lines));
-void gui_mch_insert_lines __ARGS((int row, int num_lines));
-void gui_mch_enable_menu __ARGS((int flag));
-void gui_mch_set_menu_pos __ARGS((int x, int y, int w, int h));
-void gui_mch_destroy_menu __ARGS((vimmenu_T *menu));
-void gui_mch_menu_grey __ARGS((vimmenu_T *menu, int grey));
-void gui_mch_menu_hidden __ARGS((vimmenu_T *menu, int hidden));
-void gui_mch_draw_menubar __ARGS((void));
-int clip_mch_own_selection __ARGS((VimClipboard *cbd));
-void mch_setmouse __ARGS((int on));
-int gui_mch_get_mouse_x __ARGS((void));
-int gui_mch_get_mouse_y __ARGS((void));
-void gui_mch_setmouse __ARGS((int x, int y));
-void gui_mch_show_popupmenu __ARGS((vimmenu_T *menu));
-void clip_mch_lose_selection __ARGS((VimClipboard *cbd));
-void clip_mch_request_selection __ARGS((VimClipboard *cbd));
-void clip_mch_set_selection __ARGS((VimClipboard *cbd));
-long_u gui_mch_get_rgb __ARGS((guicolor_T pixel));
-/* vim: set ft=c : */
diff --git a/src/proto/gui_beos.pro b/src/proto/gui_beos.pro
deleted file mode 100644
index af52885f8..000000000
--- a/src/proto/gui_beos.pro
+++ /dev/null
@@ -1,14 +0,0 @@
-/* gui_beos.cc - hand crafted */
-int vim_lock_screen __ARGS((void));
-void vim_unlock_screen __ARGS((void));
-void gui_mch_prepare __ARGS((int *argc, char **argv));
-int gui_mch_init __ARGS((void));
-void gui_mch_new_colors __ARGS((void));
-int gui_mch_open __ARGS((void));
-void gui_mch_exit __ARGS((int vim_exitcode));
-GuiFont gui_mch_get_font __ARGS((char_u *name, int giveErrorIfMissing));
-void gui_mch_set_bg_color __ARGS((guicolor_T color));
-void gui_mch_set_font __ARGS((GuiFont font));
-void gui_mch_flush __ARGS((void));
-long_u gui_mch_get_rgb __ARGS((guicolor_T pixel));
-void gui_mch_set_winpos __ARGS((int x, int y));
diff --git a/src/proto/os_beos.pro b/src/proto/os_beos.pro
deleted file mode 100644
index c53710126..000000000
--- a/src/proto/os_beos.pro
+++ /dev/null
@@ -1,4 +0,0 @@
-/* os_beos.c */
-void beos_cleanup_read_thread __ARGS((void));
-int beos_select __ARGS((int nbits, struct fd_set *rbits, struct fd_set *wbits, struct fd_set *ebits, struct timeval *timeout));
-/* vim: set ft=c : */