From 520e1e41f35b063ede63b41738c82d6636e78c34 Mon Sep 17 00:00:00 2001 From: Bram Moolenaar Date: Sat, 23 Jan 2016 19:46:28 +0100 Subject: [PATCH 1/8] patch 7.4.1154 Problem: No support for JSON. Solution: Add jsonencode() and jsondecode(). Also add v:false, v:true, v:null and v:none. --- Filelist | 2 + runtime/doc/eval.txt | 41 ++- src/Make_bc3.mak | 1 + src/Make_bc5.mak | 1 + src/Make_cyg_ming.mak | 1 + src/Make_dice.mak | 4 + src/Make_ivc.mak | 5 + src/Make_manx.mak | 6 + src/Make_morph.mak | 1 + src/Make_mvc.mak | 4 + src/Make_sas.mak | 5 + src/Make_vms.mms | 10 +- src/Makefile | 23 +- src/eval.c | 107 ++++++-- src/globals.h | 1 + src/if_lua.c | 8 +- src/if_mzsch.c | 14 +- src/if_py_both.h | 19 ++ src/if_ruby.c | 5 + src/json.c | 509 ++++++++++++++++++++++++++++++++++++++ src/proto.h | 1 + src/proto/eval.pro | 5 + src/proto/json.pro | 5 + src/structs.h | 13 + src/testdir/test_alot.vim | 1 + src/testdir/test_json.vim | 91 +++++++ src/version.c | 2 + src/vim.h | 12 +- 28 files changed, 863 insertions(+), 34 deletions(-) create mode 100644 src/json.c create mode 100644 src/proto/json.pro create mode 100644 src/testdir/test_json.vim diff --git a/Filelist b/Filelist index 34ff0bd26c..0032b76241 100644 --- a/Filelist +++ b/Filelist @@ -40,6 +40,7 @@ SRC_ALL = \ src/hardcopy.c \ src/hashtab.c \ src/keymap.h \ + src/json.c \ src/macros.h \ src/main.c \ src/mark.c \ @@ -132,6 +133,7 @@ SRC_ALL = \ src/proto/gui_beval.pro \ src/proto/hardcopy.pro \ src/proto/hashtab.pro \ + src/proto/json.pro \ src/proto/main.pro \ src/proto/mark.pro \ src/proto/mbyte.pro \ diff --git a/runtime/doc/eval.txt b/runtime/doc/eval.txt index 2073f289e4..c227d0c4be 100644 --- a/runtime/doc/eval.txt +++ b/runtime/doc/eval.txt @@ -1,4 +1,4 @@ -*eval.txt* For Vim version 7.4. Last change: 2016 Jan 21 +*eval.txt* For Vim version 7.4. Last change: 2016 Jan 23 VIM REFERENCE MANUAL by Bram Moolenaar @@ -1409,6 +1409,10 @@ v:exception The value of the exception most recently caught and not :endtry < Output: "caught oops". + *v:false* *false-variable* +v:false A Number with value zero. Used to put "false" in JSON. See + |jsonencode()|. + *v:fcs_reason* *fcs_reason-variable* v:fcs_reason The reason why the |FileChangedShell| event was triggered. Can be used in an autocommand to decide what to do and/or what @@ -1542,6 +1546,14 @@ v:mouse_col Column number for a mouse click obtained with |getchar()|. This is the screen column number, like with |virtcol()|. The value is zero when there was no mouse button click. + *v:none* *none-variable* +v:none An empty String. Used to put an empty item in JSON. See + |jsonencode()|. + + *v:null* *null-variable* +v:null An empty String. Used to put "null" in JSON. See + |jsonencode()|. + *v:oldfiles* *oldfiles-variable* v:oldfiles List of file names that is loaded from the |viminfo| file on startup. These are the files that Vim remembers marks for. @@ -1707,6 +1719,10 @@ v:throwpoint The point where the exception most recently caught and not :endtry < Output: "Exception from test.vim, line 2" + *v:true* *true-variable* +v:true A Number with value one. Used to put "true" in JSON. See + |jsonencode()|. + *v:val* *val-variable* v:val Value of the current item of a |List| or |Dictionary|. Only valid while evaluating the expression used with |map()| and @@ -1913,6 +1929,8 @@ isdirectory( {directory}) Number TRUE if {directory} is a directory islocked( {expr}) Number TRUE if {expr} is locked items( {dict}) List key-value pairs in {dict} join( {list} [, {sep}]) String join {list} items into one String +jsondecode( {string}) any decode JSON +jsonencode( {expr}) String encode JSON keys( {dict}) List keys in {dict} len( {expr}) Number the length of {expr} libcall( {lib}, {func}, {arg}) String call {func} in library {lib} with {arg} @@ -4215,6 +4233,27 @@ join({list} [, {sep}]) *join()* converted into a string like with |string()|. The opposite function is |split()|. +jsondecode({string}) *jsondecode()* + TODO + +jsonencode({expr}) *jsonencode()* + Encodode {expr} as JSON and return this as a string. + The encoding is specified in: + http://www.ietf.org/rfc/rfc4627.txt + Vim values are converted as follows: + Number decimal number + Float floating point number + String in double quotes (possibly null) + Funcref nothing + List as an array (possibly null); when + used recursively: [] + Dict as an object (possibly null); when + used recursively: {} + v:false "false" + v:true "true" + v:none nothing + v:null "null" + keys({dict}) *keys()* Return a |List| with all the keys of {dict}. The |List| is in arbitrary order. diff --git a/src/Make_bc3.mak b/src/Make_bc3.mak index a23174fefb..0de7847663 100644 --- a/src/Make_bc3.mak +++ b/src/Make_bc3.mak @@ -72,6 +72,7 @@ EXE_dependencies = \ getchar.obj \ hardcopy.obj \ hashtab.obj \ + json.obj \ main.obj \ mark.obj \ memfile.obj \ diff --git a/src/Make_bc5.mak b/src/Make_bc5.mak index ddbdbe304a..8dcb6e8b4c 100644 --- a/src/Make_bc5.mak +++ b/src/Make_bc5.mak @@ -598,6 +598,7 @@ vimobj = \ $(OBJDIR)\getchar.obj \ $(OBJDIR)\hardcopy.obj \ $(OBJDIR)\hashtab.obj \ + $(OBJDIR)\json.obj \ $(OBJDIR)\main.obj \ $(OBJDIR)\mark.obj \ $(OBJDIR)\memfile.obj \ diff --git a/src/Make_cyg_ming.mak b/src/Make_cyg_ming.mak index 203438a597..7c7acbd4b1 100644 --- a/src/Make_cyg_ming.mak +++ b/src/Make_cyg_ming.mak @@ -601,6 +601,7 @@ OBJ = \ $(OUTDIR)/getchar.o \ $(OUTDIR)/hardcopy.o \ $(OUTDIR)/hashtab.o \ + $(OUTDIR)/json.o \ $(OUTDIR)/main.o \ $(OUTDIR)/mark.o \ $(OUTDIR)/memfile.o \ diff --git a/src/Make_dice.mak b/src/Make_dice.mak index 890f15d09c..c20ba89ee4 100644 --- a/src/Make_dice.mak +++ b/src/Make_dice.mak @@ -45,6 +45,7 @@ SRC = \ getchar.c \ hardcopy.c \ hashtab.c \ + json.c \ main.c \ mark.c \ memfile.c \ @@ -93,6 +94,7 @@ OBJ = o/blowfish.o \ o/getchar.o \ o/hardcopy.o \ o/hashtab.o \ + o/json.o \ o/main.o \ o/mark.o \ o/memfile.o \ @@ -179,6 +181,8 @@ o/hardcopy.o: hardcopy.c $(SYMS) o/hashtab.o: hashtab.c $(SYMS) +o/json.o: json.c $(SYMS) + o/main.o: main.c $(SYMS) o/mark.o: mark.c $(SYMS) diff --git a/src/Make_ivc.mak b/src/Make_ivc.mak index a891a9743b..2dbe95768c 100644 --- a/src/Make_ivc.mak +++ b/src/Make_ivc.mak @@ -229,6 +229,7 @@ LINK32_OBJS= \ "$(INTDIR)/getchar.obj" \ "$(INTDIR)/hardcopy.obj" \ "$(INTDIR)/hashtab.obj" \ + "$(INTDIR)/json.obj" \ "$(INTDIR)/main.obj" \ "$(INTDIR)/mark.obj" \ "$(INTDIR)/mbyte.obj" \ @@ -555,6 +556,10 @@ SOURCE=.\if_ole.idl # End Source File # Begin Source File +SOURCE=.\json.c +# End Source File +# Begin Source File + SOURCE=.\main.c # End Source File # Begin Source File diff --git a/src/Make_manx.mak b/src/Make_manx.mak index dd1311ac87..1574f056ef 100644 --- a/src/Make_manx.mak +++ b/src/Make_manx.mak @@ -55,6 +55,7 @@ SRC = blowfish.c \ getchar.c \ hardcopy.c \ hashtab.c \ + json.c \ main.c \ mark.c \ memfile.c \ @@ -105,6 +106,7 @@ OBJ = obj/blowfish.o \ obj/getchar.o \ obj/hardcopy.o \ obj/hashtab.o \ + obj/json.o \ obj/main.o \ obj/mark.o \ obj/memfile.o \ @@ -153,6 +155,7 @@ PRO = proto/blowfish.pro \ proto/getchar.pro \ proto/hardcopy.pro \ proto/hashtab.pro \ + proto/json.pro \ proto/main.pro \ proto/mark.pro \ proto/memfile.pro \ @@ -284,6 +287,9 @@ obj/hardcopy.o: hardcopy.c obj/hashtab.o: hashtab.c $(CCSYM) $@ hashtab.c +obj/json.o: json.c + $(CCSYM) $@ json.c + # Don't use $(SYMS) here, because main.c defines EXTERN obj/main.o: main.c option.h globals.h $(CCNOSYM) $@ main.c diff --git a/src/Make_morph.mak b/src/Make_morph.mak index 15a74773c2..2f2f08b8e2 100644 --- a/src/Make_morph.mak +++ b/src/Make_morph.mak @@ -43,6 +43,7 @@ SRC = blowfish.c \ getchar.c \ hardcopy.c \ hashtab.c \ + json.c \ main.c \ mark.c \ mbyte.c \ diff --git a/src/Make_mvc.mak b/src/Make_mvc.mak index 217df5710a..c009aa9777 100644 --- a/src/Make_mvc.mak +++ b/src/Make_mvc.mak @@ -536,6 +536,7 @@ OBJ = \ $(OUTDIR)\getchar.obj \ $(OUTDIR)\hardcopy.obj \ $(OUTDIR)\hashtab.obj \ + $(OUTDIR)\json.obj \ $(OUTDIR)\main.obj \ $(OUTDIR)\mark.obj \ $(OUTDIR)\mbyte.obj \ @@ -1202,6 +1203,8 @@ $(OUTDIR)/if_sniff.obj: $(OUTDIR) if_sniff.c $(INCL) $(OUTDIR)/if_tcl.obj: $(OUTDIR) if_tcl.c $(INCL) $(CC) $(CFLAGS) $(TCL_INC) if_tcl.c +$(OUTDIR)/json.obj: $(OUTDIR) json.c $(INCL) + $(OUTDIR)/main.obj: $(OUTDIR) main.c $(INCL) $(OUTDIR)/mark.obj: $(OUTDIR) mark.c $(INCL) @@ -1329,6 +1332,7 @@ proto.h: \ proto/getchar.pro \ proto/hardcopy.pro \ proto/hashtab.pro \ + proto/json.pro \ proto/main.pro \ proto/mark.pro \ proto/memfile.pro \ diff --git a/src/Make_sas.mak b/src/Make_sas.mak index 49dcb6bdcd..6d2ca844f4 100644 --- a/src/Make_sas.mak +++ b/src/Make_sas.mak @@ -108,6 +108,7 @@ SRC = \ getchar.c \ hardcopy.c \ hashtab.c \ + json.c \ main.c \ mark.c \ memfile.c \ @@ -157,6 +158,7 @@ OBJ = \ getchar.o \ hardcopy.o \ hashtab.o \ + json.o \ main.o \ mark.o \ memfile.o \ @@ -206,6 +208,7 @@ PRO = \ proto/getchar.pro \ proto/hardcopy.pro \ proto/hashtab.pro \ + proto/json.pro \ proto/main.pro \ proto/mark.pro \ proto/memfile.pro \ @@ -328,6 +331,8 @@ hardcopy.o: hardcopy.c proto/hardcopy.pro: hardcopy.c hashtab.o: hashtab.c proto/hashtab.pro: hashtab.c +json.o: json.c +proto/json.pro: json.c main.o: main.c proto/main.pro: main.c mark.o: mark.c diff --git a/src/Make_vms.mms b/src/Make_vms.mms index f19b688585..da535b90f5 100644 --- a/src/Make_vms.mms +++ b/src/Make_vms.mms @@ -2,7 +2,7 @@ # Makefile for Vim on OpenVMS # # Maintainer: Zoltan Arpadffy -# Last change: 2014 Aug 10 +# Last change: 2016 Jan 22 # # This has script been tested on VMS 6.2 to 8.2 on DEC Alpha, VAX and IA64 # with MMS and MMK @@ -311,7 +311,7 @@ ALL_LIBS = $(LIBS) $(GUI_LIB_DIR) $(GUI_LIB) \ SRC = blowfish.c buffer.c charset.c crypt.c, crypt_zip.c diff.c digraph.c edit.c eval.c ex_cmds.c ex_cmds2.c \ ex_docmd.c ex_eval.c ex_getln.c if_xcmdsrv.c fileio.c fold.c getchar.c \ - hardcopy.c hashtab.c main.c mark.c menu.c mbyte.c memfile.c memline.c message.c misc1.c \ + hardcopy.c hashtab.c json.c main.c mark.c menu.c mbyte.c memfile.c memline.c message.c misc1.c \ misc2.c move.c normal.c ops.c option.c popupmnu.c quickfix.c regexp.c search.c sha256.c\ spell.c syntax.c tag.c term.c termlib.c ui.c undo.c version.c screen.c \ window.c os_unix.c os_vms.c pathdef.c \ @@ -320,7 +320,7 @@ SRC = blowfish.c buffer.c charset.c crypt.c, crypt_zip.c diff.c digraph.c edit.c OBJ = blowfish.obj buffer.obj charset.obj crypt.obj, crypt_zip.obj diff.obj digraph.obj edit.obj eval.obj \ ex_cmds.obj ex_cmds2.obj ex_docmd.obj ex_eval.obj ex_getln.obj \ - if_xcmdsrv.obj fileio.obj fold.obj getchar.obj hardcopy.obj hashtab.obj main.obj mark.obj \ + if_xcmdsrv.obj fileio.obj fold.obj getchar.obj hardcopy.obj hashtab.obj json.obj main.obj mark.obj \ menu.obj memfile.obj memline.obj message.obj misc1.obj misc2.obj \ move.obj mbyte.obj normal.obj ops.obj option.obj popupmnu.obj quickfix.obj \ regexp.obj search.obj sha256.obj spell.obj syntax.obj tag.obj term.obj termlib.obj \ @@ -572,6 +572,10 @@ if_mzsch.obj : if_mzsch.c vim.h [.auto]config.h feature.h os_unix.h \ ascii.h keymap.h term.h macros.h option.h structs.h \ regexp.h gui.h gui_beval.h [.proto]gui_beval.pro ex_cmds.h proto.h \ globals.h farsi.h arabic.h if_mzsch.h +json.obj : json.c vim.h [.auto]config.h feature.h os_unix.h \ + ascii.h keymap.h term.h macros.h structs.h regexp.h gui.h gui_beval.h \ + [.proto]gui_beval.pro option.h ex_cmds.h proto.h globals.h farsi.h \ + arabic.h version.h main.obj : main.c vim.h [.auto]config.h feature.h os_unix.h \ ascii.h keymap.h term.h macros.h structs.h regexp.h gui.h gui_beval.h \ [.proto]gui_beval.pro option.h ex_cmds.h proto.h globals.h farsi.h \ diff --git a/src/Makefile b/src/Makefile index 4aa5a48b2b..91f3b77197 100644 --- a/src/Makefile +++ b/src/Makefile @@ -1487,6 +1487,7 @@ BASIC_SRC = \ hashtab.c \ if_cscope.c \ if_xcmdsrv.c \ + json.c \ main.c \ mark.c \ memfile.c \ @@ -1580,6 +1581,7 @@ OBJ_COMMON = \ $(HANGULIN_OBJ) \ objects/if_cscope.o \ objects/if_xcmdsrv.o \ + objects/json.o \ objects/mark.o \ objects/memline.o \ objects/menu.o \ @@ -1654,6 +1656,7 @@ PRO_AUTO = \ if_python.pro \ if_python3.pro \ if_ruby.pro \ + json.pro \ main.pro \ mark.pro \ memfile.pro \ @@ -1986,6 +1989,8 @@ test_arglist \ test_expand \ test_hardcopy \ test_increment \ + test_json \ + test_langmap \ test_lispwords \ test_menu \ test_perl \ @@ -1993,6 +1998,7 @@ test_arglist \ test_searchpos \ test_set \ test_sort \ + test_syntax \ test_undolevels \ test_unlet \ test_viminfo \ @@ -2770,6 +2776,9 @@ objects/if_tcl.o: if_tcl.c objects/integration.o: integration.c $(CCC) -o $@ integration.c +objects/json.o: json.c + $(CCC) -o $@ json.c + objects/main.o: main.c $(CCC) -o $@ main.c @@ -3060,6 +3069,10 @@ objects/if_xcmdsrv.o: if_xcmdsrv.c vim.h auto/config.h feature.h os_unix.h \ auto/osdef.h ascii.h keymap.h term.h macros.h option.h structs.h \ regexp.h gui.h gui_beval.h proto/gui_beval.pro ex_cmds.h proto.h \ globals.h farsi.h arabic.h version.h +objects/json.o: json.c vim.h auto/config.h feature.h os_unix.h auto/osdef.h \ + ascii.h keymap.h term.h macros.h option.h structs.h regexp.h gui.h \ + gui_beval.h proto/gui_beval.pro ex_cmds.h proto.h globals.h farsi.h \ + arabic.h objects/main.o: main.c vim.h auto/config.h feature.h os_unix.h auto/osdef.h \ ascii.h keymap.h term.h macros.h option.h structs.h regexp.h gui.h \ gui_beval.h proto/gui_beval.pro ex_cmds.h proto.h globals.h farsi.h \ @@ -3114,7 +3127,7 @@ objects/option.o: option.c vim.h auto/config.h feature.h os_unix.h auto/osdef.h objects/os_unix.o: os_unix.c vim.h auto/config.h feature.h os_unix.h auto/osdef.h \ ascii.h keymap.h term.h macros.h option.h structs.h regexp.h gui.h \ gui_beval.h proto/gui_beval.pro ex_cmds.h proto.h globals.h farsi.h \ - arabic.h if_mzsch.h os_unixx.h + arabic.h os_unixx.h objects/pathdef.o: auto/pathdef.c vim.h auto/config.h feature.h os_unix.h \ auto/osdef.h ascii.h keymap.h term.h macros.h option.h structs.h \ regexp.h gui.h gui_beval.h proto/gui_beval.pro ex_cmds.h proto.h \ @@ -3179,7 +3192,7 @@ objects/gui.o: gui.c vim.h auto/config.h feature.h os_unix.h auto/osdef.h ascii. objects/gui_gtk.o: gui_gtk.c gui_gtk_f.h vim.h auto/config.h feature.h os_unix.h \ auto/osdef.h ascii.h keymap.h term.h macros.h option.h structs.h \ regexp.h gui.h gui_beval.h proto/gui_beval.pro ex_cmds.h proto.h \ - globals.h farsi.h arabic.h ../pixmaps/stock_icons.h + globals.h farsi.h arabic.h objects/gui_gtk_f.o: gui_gtk_f.c vim.h auto/config.h feature.h os_unix.h \ auto/osdef.h ascii.h keymap.h term.h macros.h option.h structs.h \ regexp.h gui.h gui_beval.h proto/gui_beval.pro ex_cmds.h proto.h \ @@ -3245,8 +3258,8 @@ objects/gui_athena.o: gui_athena.c vim.h auto/config.h feature.h os_unix.h \ objects/gui_gtk_x11.o: gui_gtk_x11.c vim.h auto/config.h feature.h os_unix.h \ auto/osdef.h ascii.h keymap.h term.h macros.h option.h structs.h \ regexp.h gui.h gui_beval.h proto/gui_beval.pro ex_cmds.h proto.h \ - globals.h farsi.h arabic.h gui_gtk_f.h ../runtime/vim32x32.xpm \ - ../runtime/vim16x16.xpm ../runtime/vim48x48.xpm $(GRESOURCE_HDR) + globals.h farsi.h arabic.h auto/gui_gtk_gresources.h gui_gtk_f.h \ + ../runtime/vim32x32.xpm ../runtime/vim16x16.xpm ../runtime/vim48x48.xpm objects/gui_x11.o: gui_x11.c vim.h auto/config.h feature.h os_unix.h auto/osdef.h \ ascii.h keymap.h term.h macros.h option.h structs.h regexp.h gui.h \ gui_beval.h proto/gui_beval.pro ex_cmds.h proto.h globals.h farsi.h \ @@ -3278,7 +3291,7 @@ objects/if_lua.o: if_lua.c vim.h auto/config.h feature.h os_unix.h auto/osdef.h objects/if_mzsch.o: if_mzsch.c vim.h auto/config.h feature.h os_unix.h \ auto/osdef.h ascii.h keymap.h term.h macros.h option.h structs.h \ regexp.h gui.h gui_beval.h proto/gui_beval.pro ex_cmds.h proto.h \ - globals.h farsi.h arabic.h if_mzsch.h mzscheme_base.c + globals.h farsi.h arabic.h if_mzsch.h objects/if_perl.o: auto/if_perl.c vim.h auto/config.h feature.h os_unix.h \ auto/osdef.h ascii.h keymap.h term.h macros.h option.h structs.h \ regexp.h gui.h gui_beval.h proto/gui_beval.pro ex_cmds.h proto.h \ diff --git a/src/eval.c b/src/eval.c index 565d71d786..a0cc6d0170 100644 --- a/src/eval.c +++ b/src/eval.c @@ -99,7 +99,6 @@ static char *e_undefvar = N_("E121: Undefined variable: %s"); static char *e_missbrac = N_("E111: Missing ']'"); static char *e_listarg = N_("E686: Argument of %s must be a List"); static char *e_listdictarg = N_("E712: Argument of %s must be a List or Dictionary"); -static char *e_emptykey = N_("E713: Cannot use empty key for Dictionary"); static char *e_listreq = N_("E714: List required"); static char *e_dictreq = N_("E715: Dictionary required"); static char *e_toomanyarg = N_("E118: Too many arguments for function: %s"); @@ -371,6 +370,10 @@ static struct vimvar {VV_NAME("option_old", VAR_STRING), VV_RO}, {VV_NAME("option_type", VAR_STRING), VV_RO}, {VV_NAME("errors", VAR_LIST), 0}, + {VV_NAME("false", VAR_SPECIAL), VV_RO}, + {VV_NAME("true", VAR_SPECIAL), VV_RO}, + {VV_NAME("null", VAR_SPECIAL), VV_RO}, + {VV_NAME("none", VAR_SPECIAL), VV_RO}, }; /* shorthand */ @@ -428,7 +431,6 @@ static int get_option_tv __ARGS((char_u **arg, typval_T *rettv, int evaluate)); static int get_string_tv __ARGS((char_u **arg, typval_T *rettv, int evaluate)); static int get_lit_string_tv __ARGS((char_u **arg, typval_T *rettv, int evaluate)); static int get_list_tv __ARGS((char_u **arg, typval_T *rettv, int evaluate)); -static int rettv_list_alloc __ARGS((typval_T *rettv)); static long list_len __ARGS((list_T *l)); static int list_equal __ARGS((list_T *l1, list_T *l2, int ic, int recursive)); static int dict_equal __ARGS((dict_T *d1, dict_T *d2, int ic, int recursive)); @@ -443,7 +445,6 @@ static char_u *list2string __ARGS((typval_T *tv, int copyID)); static int list_join_inner __ARGS((garray_T *gap, list_T *l, char_u *sep, int echo_style, int copyID, garray_T *join_gap)); static int list_join __ARGS((garray_T *gap, list_T *l, char_u *sep, int echo, int copyID)); static int free_unref_items __ARGS((int copyID)); -static int rettv_dict_alloc __ARGS((typval_T *rettv)); static dictitem_T *dictitem_copy __ARGS((dictitem_T *org)); static void dictitem_remove __ARGS((dict_T *dict, dictitem_T *item)); static dict_T *dict_copy __ARGS((dict_T *orig, int deep, int copyID)); @@ -453,9 +454,6 @@ static int get_dict_tv __ARGS((char_u **arg, typval_T *rettv, int evaluate)); static char_u *echo_string __ARGS((typval_T *tv, char_u **tofree, char_u *numbuf, int copyID)); static char_u *tv2string __ARGS((typval_T *tv, char_u **tofree, char_u *numbuf, int copyID)); static char_u *string_quote __ARGS((char_u *str, int function)); -#ifdef FEAT_FLOAT -static int string2float __ARGS((char_u *text, float_T *value)); -#endif static int get_env_tv __ARGS((char_u **arg, typval_T *rettv, int evaluate)); static int find_internal_func __ARGS((char_u *name)); static char_u *deref_func_name __ARGS((char_u *name, int *lenp, int no_autoload)); @@ -617,6 +615,8 @@ static void f_isdirectory __ARGS((typval_T *argvars, typval_T *rettv)); static void f_islocked __ARGS((typval_T *argvars, typval_T *rettv)); static void f_items __ARGS((typval_T *argvars, typval_T *rettv)); static void f_join __ARGS((typval_T *argvars, typval_T *rettv)); +static void f_jsondecode __ARGS((typval_T *argvars, typval_T *rettv)); +static void f_jsonencode __ARGS((typval_T *argvars, typval_T *rettv)); static void f_keys __ARGS((typval_T *argvars, typval_T *rettv)); static void f_last_buffer_nr __ARGS((typval_T *argvars, typval_T *rettv)); static void f_len __ARGS((typval_T *argvars, typval_T *rettv)); @@ -816,7 +816,6 @@ static linenr_T get_tv_lnum __ARGS((typval_T *argvars)); static linenr_T get_tv_lnum_buf __ARGS((typval_T *argvars, buf_T *buf)); static char_u *get_tv_string __ARGS((typval_T *varp)); static char_u *get_tv_string_buf __ARGS((typval_T *varp, char_u *buf)); -static char_u *get_tv_string_buf_chk __ARGS((typval_T *varp, char_u *buf)); static dictitem_T *find_var __ARGS((char_u *name, hashtab_T **htp, int no_autoload)); static dictitem_T *find_var_in_ht __ARGS((hashtab_T *ht, int htname, char_u *varname, int no_autoload)); static hashtab_T *find_var_ht __ARGS((char_u *name, char_u **varname)); @@ -915,6 +914,12 @@ eval_init() set_vim_var_nr(VV_HLSEARCH, 1L); set_vim_var_dict(VV_COMPLETED_ITEM, dict_alloc()); set_vim_var_list(VV_ERRORS, list_alloc()); + + set_vim_var_nr(VV_FALSE, VVAL_FALSE); + set_vim_var_nr(VV_TRUE, VVAL_TRUE); + set_vim_var_nr(VV_NONE, VVAL_NONE); + set_vim_var_nr(VV_NULL, VVAL_NULL); + set_reg_var(0); /* default for v:register is not 0 but '"' */ #ifdef EBCDIC @@ -3080,13 +3085,15 @@ tv_op(tv1, tv2, op) char_u numbuf[NUMBUFLEN]; char_u *s; - /* Can't do anything with a Funcref or a Dict on the right. */ - if (tv2->v_type != VAR_FUNC && tv2->v_type != VAR_DICT) + /* Can't do anything with a Funcref, Dict, v:true on the right. */ + if (tv2->v_type != VAR_FUNC && tv2->v_type != VAR_DICT + && tv2->v_type != VAR_SPECIAL) { switch (tv1->v_type) { case VAR_DICT: case VAR_FUNC: + case VAR_SPECIAL: break; case VAR_LIST: @@ -5390,6 +5397,10 @@ eval_index(arg, rettv, evaluate, verbose) return FAIL; } #endif + else if (rettv->v_type == VAR_SPECIAL) + { + return FAIL; + } init_tv(&var1); init_tv(&var2); @@ -5999,7 +6010,7 @@ list_alloc() * Allocate an empty list for a return value. * Returns OK or FAIL. */ - static int + int rettv_list_alloc(rettv) typval_T *rettv; { @@ -6246,6 +6257,9 @@ tv_equal(tv1, tv2, ic, recursive) s1 = get_tv_string_buf(tv1, buf1); s2 = get_tv_string_buf(tv2, buf2); return ((ic ? MB_STRICMP(s1, s2) : STRCMP(s1, s2)) == 0); + + case VAR_SPECIAL: + return tv1->vval.v_number == tv2->vval.v_number; } EMSG2(_(e_intern2), "tv_equal()"); @@ -6837,6 +6851,17 @@ list_join(gap, l, sep, echo_style, copyID) return retval; } +/* + * Return the next (unique) copy ID. + * Used for serializing nested structures. + */ + int +get_copyID() +{ + current_copyID += COPYID_INC; + return current_copyID; +} + /* * Garbage collection for lists and dictionaries. * @@ -6883,8 +6908,7 @@ garbage_collect() /* We advance by two because we add one for items referenced through * previous_funccal. */ - current_copyID += COPYID_INC; - copyID = current_copyID; + copyID = get_copyID(); /* * 1. Go through all accessible variables and mark all lists and dicts @@ -7236,7 +7260,7 @@ dict_alloc() * Allocate an empty dict for a return value. * Returns OK or FAIL. */ - static int + int rettv_dict_alloc(rettv) typval_T *rettv; { @@ -7891,6 +7915,18 @@ echo_string(tv, tofree, numbuf, copyID) break; #endif + case VAR_SPECIAL: + *tofree = NULL; + switch (tv->vval.v_number) + { + case VVAL_FALSE: r = (char_u *)"false"; break; + case VVAL_TRUE: r = (char_u *)"true"; break; + case VVAL_NONE: r = (char_u *)"none"; break; + case VVAL_NULL: r = (char_u *)"null"; break; + default: EMSG2(_(e_intern2), "echo_string(special)"); + } + break; + default: EMSG2(_(e_intern2), "echo_string()"); *tofree = NULL; @@ -7932,6 +7968,7 @@ tv2string(tv, tofree, numbuf, copyID) case VAR_NUMBER: case VAR_LIST: case VAR_DICT: + case VAR_SPECIAL: break; default: EMSG2(_(e_intern2), "tv2string()"); @@ -7985,14 +8022,14 @@ string_quote(str, function) return s; } -#ifdef FEAT_FLOAT +#if defined(FEAT_FLOAT) || defined(PROTO) /* * Convert the string "text" to a floating point number. * This uses strtod(). setlocale(LC_NUMERIC, "C") has been used to make sure * this always uses a decimal point. * Returns the length of the text that was consumed. */ - static int + int string2float(text, value) char_u *text; float_T *value; /* result stored here */ @@ -8237,6 +8274,8 @@ static struct fst {"islocked", 1, 1, f_islocked}, {"items", 1, 1, f_items}, {"join", 1, 2, f_join}, + {"jsondecode", 1, 1, f_jsondecode}, + {"jsonencode", 1, 1, f_jsonencode}, {"keys", 1, 1, f_keys}, {"last_buffer_nr", 0, 0, f_last_buffer_nr},/* obsolete */ {"len", 1, 1, f_len}, @@ -14393,6 +14432,34 @@ f_join(argvars, rettv) rettv->vval.v_string = NULL; } +/* + * "jsondecode()" function + */ + static void +f_jsondecode(argvars, rettv) + typval_T *argvars; + typval_T *rettv; +{ + js_read_T reader; + + reader.js_buf = get_tv_string(&argvars[0]); + reader.js_eof = TRUE; + reader.js_used = 0; + json_decode(&reader, rettv); +} + +/* + * "jsonencode()" function + */ + static void +f_jsonencode(argvars, rettv) + typval_T *argvars; + typval_T *rettv; +{ + rettv->v_type = VAR_STRING; + rettv->vval.v_string = json_encode(&argvars[0]); +} + /* * "keys()" function */ @@ -21558,6 +21625,7 @@ clear_tv(varp) varp->vval.v_dict = NULL; break; case VAR_NUMBER: + case VAR_SPECIAL: varp->vval.v_number = 0; break; #ifdef FEAT_FLOAT @@ -21759,7 +21827,7 @@ get_tv_string_chk(varp) return get_tv_string_buf_chk(varp, mybuf); } - static char_u * + char_u * get_tv_string_buf_chk(varp, buf) typval_T *varp; char_u *buf; @@ -22120,8 +22188,7 @@ list_one_var(v, prefix, first) char_u *s; char_u numbuf[NUMBUFLEN]; - current_copyID += COPYID_INC; - s = echo_string(&v->di_tv, &tofree, numbuf, current_copyID); + s = echo_string(&v->di_tv, &tofree, numbuf, get_copyID()); list_one_var_a(prefix, v->di_key, v->di_tv.v_type, s == NULL ? (char_u *)"" : s, first); vim_free(tofree); @@ -22435,6 +22502,7 @@ copy_tv(from, to) switch (from->v_type) { case VAR_NUMBER: + case VAR_SPECIAL: to->vval.v_number = from->vval.v_number; break; #ifdef FEAT_FLOAT @@ -22609,8 +22677,7 @@ ex_echo(eap) } else if (eap->cmdidx == CMD_echo) msg_puts_attr((char_u *)" ", echo_attr); - current_copyID += COPYID_INC; - p = echo_string(&rettv, &tofree, numbuf, current_copyID); + p = echo_string(&rettv, &tofree, numbuf, get_copyID()); if (p != NULL) for ( ; *p != NUL && !got_int; ++p) { diff --git a/src/globals.h b/src/globals.h index 4dc0b81a1c..f252aeeea0 100644 --- a/src/globals.h +++ b/src/globals.h @@ -1523,6 +1523,7 @@ EXTERN char_u e_readonly[] INIT(= N_("E45: 'readonly' option is set (add ! to ov #ifdef FEAT_EVAL EXTERN char_u e_readonlyvar[] INIT(= N_("E46: Cannot change read-only variable \"%s\"")); EXTERN char_u e_readonlysbx[] INIT(= N_("E794: Cannot set variable in the sandbox: \"%s\"")); +EXTERN char_u e_emptykey[] INIT(= N_("E713: Cannot use empty key for Dictionary")); #endif #ifdef FEAT_QUICKFIX EXTERN char_u e_readerrf[] INIT(= N_("E47: Error while reading errorfile")); diff --git a/src/if_lua.c b/src/if_lua.c index 46f881a9bd..1c8512fec5 100644 --- a/src/if_lua.c +++ b/src/if_lua.c @@ -499,6 +499,12 @@ luaV_pushtypval(lua_State *L, typval_T *tv) case VAR_DICT: luaV_pushdict(L, tv->vval.v_dict); break; + case VAR_SPECIAL: + if (tv->vval.v_number <= VVAL_TRUE) + lua_pushinteger(L, (int) tv->vval.v_number); + else + lua_pushnil(L); + break; default: lua_pushnil(L); } @@ -510,7 +516,7 @@ luaV_totypval (lua_State *L, int pos, typval_T *tv) { switch(lua_type(L, pos)) { case LUA_TBOOLEAN: - tv->v_type = VAR_NUMBER; + tv->v_type = VAR_SPECIAL; tv->vval.v_number = (varnumber_T) lua_toboolean(L, pos); break; case LUA_TSTRING: diff --git a/src/if_mzsch.c b/src/if_mzsch.c index ea04705459..0884c9f5ee 100644 --- a/src/if_mzsch.c +++ b/src/if_mzsch.c @@ -3084,6 +3084,14 @@ vim_to_mzscheme_impl(typval_T *vim_value, int depth, Scheme_Hash_Table *visited) MZ_GC_UNREG(); } + else if (vim_value->v_type == VAR_SPECIAL) + { + if (vim_value->vval.v_number <= VVAL_TRUE) + result = scheme_make_integer((long)vim_value->vval.v_number); + else + result = scheme_null; + MZ_GC_CHECK(); + } else { result = scheme_void; @@ -3148,8 +3156,8 @@ mzscheme_to_vim_impl(Scheme_Object *obj, typval_T *tv, int depth, copy_tv(found, tv); else if (SCHEME_VOIDP(obj)) { - tv->v_type = VAR_NUMBER; - tv->vval.v_number = 0; + tv->v_type = VAR_SPECIAL; + tv->vval.v_number = VVAL_NULL; } else if (SCHEME_INTP(obj)) { @@ -3158,7 +3166,7 @@ mzscheme_to_vim_impl(Scheme_Object *obj, typval_T *tv, int depth, } else if (SCHEME_BOOLP(obj)) { - tv->v_type = VAR_NUMBER; + tv->v_type = VAR_SPECIAL; tv->vval.v_number = SCHEME_TRUEP(obj); } # ifdef FEAT_FLOAT diff --git a/src/if_py_both.h b/src/if_py_both.h index e220e3fec7..e8a5f5de9c 100644 --- a/src/if_py_both.h +++ b/src/if_py_both.h @@ -810,6 +810,25 @@ VimToPython(typval_T *our_tv, int depth, PyObject *lookup_dict) } } } + else if (our_tv->v_type == VAR_SPECIAL) + { + if (our_tv->vval.v_number == VVAL_FALSE) + { + ret = Py_False; + Py_INCREF(ret); + } + else if (our_tv->vval.v_number == VVAL_TRUE) + { + ret = Py_True; + Py_INCREF(ret); + } + else + { + Py_INCREF(Py_None); + ret = Py_None; + } + return ret; + } else { Py_INCREF(Py_None); diff --git a/src/if_ruby.c b/src/if_ruby.c index 96d9453dbc..bb34de1316 100644 --- a/src/if_ruby.c +++ b/src/if_ruby.c @@ -1032,6 +1032,11 @@ static VALUE vim_to_ruby(typval_T *tv) } } } + } + else if (tv->v_type == VAR_SPECIAL) + { + if (tv->vval.v_number <= VVAL_TRUE) + result = INT2NUM(tv->vval.v_number); } /* else return Qnil; */ return result; diff --git a/src/json.c b/src/json.c new file mode 100644 index 0000000000..7b67994ddd --- /dev/null +++ b/src/json.c @@ -0,0 +1,509 @@ +/* vi:set ts=8 sts=4 sw=4: + * + * VIM - Vi IMproved by Bram Moolenaar + * + * 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. + */ + +/* + * json.c: Encoding and decoding JSON. + * + * Follows this standard: http://www.ietf.org/rfc/rfc4627.txt + */ + +#include "vim.h" + +#if defined(FEAT_EVAL) || defined(PROTO) +static void json_decode_item(js_read_T *reader, typval_T *res); + +/* + * Encode "val" into a JSON format string. + */ + char_u * +json_encode(typval_T *val) +{ + garray_T ga; + + /* Store bytes in the growarray. */ + ga_init2(&ga, 1, 4000); + json_encode_item(&ga, val, get_copyID()); + return ga.ga_data; +} + + static void +write_string(garray_T *gap, char_u *str) +{ + char_u *res = str; + char_u numbuf[NUMBUFLEN]; + + if (res == NULL) + ga_concat(gap, (char_u *)"null"); + else + { + ga_append(gap, '"'); + while (*res != NUL) + { + int c = PTR2CHAR(res); + + switch (c) + { + case 0x08: + ga_append(gap, '\\'); ga_append(gap, 'b'); break; + case 0x09: + ga_append(gap, '\\'); ga_append(gap, 't'); break; + case 0x0a: + ga_append(gap, '\\'); ga_append(gap, 'n'); break; + case 0x0c: + ga_append(gap, '\\'); ga_append(gap, 'f'); break; + case 0x0d: + ga_append(gap, '\\'); ga_append(gap, 'r'); break; + case 0x22: /* " */ + case 0x5c: /* \ */ + ga_append(gap, '\\'); + ga_append(gap, c); + break; + default: + if (c >= 0x20) + { + numbuf[mb_char2bytes(c, numbuf)] = NUL; + ga_concat(gap, numbuf); + } + else + { + vim_snprintf((char *)numbuf, NUMBUFLEN, + "\\u%04lx", (long)c); + ga_concat(gap, numbuf); + } + } + mb_cptr_adv(res); + } + ga_append(gap, '"'); + } +} + + void +json_encode_item(garray_T *gap, typval_T *val, int copyID) +{ + char_u numbuf[NUMBUFLEN]; + char_u *res; + list_T *l; + dict_T *d; + + switch (val->v_type) + { + case VAR_SPECIAL: + switch(val->vval.v_number) + { + case VVAL_FALSE: ga_concat(gap, (char_u *)"false"); break; + case VVAL_TRUE: ga_concat(gap, (char_u *)"true"); break; + case VVAL_NONE: break; + case VVAL_NULL: ga_concat(gap, (char_u *)"null"); break; + } + break; + + case VAR_NUMBER: + vim_snprintf((char *)numbuf, NUMBUFLEN, "%ld", + (long)val->vval.v_number); + ga_concat(gap, numbuf); + break; + + case VAR_STRING: + res = val->vval.v_string; + write_string(gap, res); + break; + + case VAR_FUNC: + /* no JSON equivalent, skip */ + break; + + case VAR_LIST: + l = val->vval.v_list; + if (l == NULL) + ga_concat(gap, (char_u *)"null"); + else + { + if (l->lv_copyID == copyID) + ga_concat(gap, (char_u *)"[]"); + else + { + listitem_T *li; + + l->lv_copyID = copyID; + ga_append(gap, '['); + for (li = l->lv_first; li != NULL && !got_int; ) + { + json_encode_item(gap, &li->li_tv, copyID); + li = li->li_next; + if (li != NULL) + ga_append(gap, ','); + } + ga_append(gap, ']'); + } + } + break; + + case VAR_DICT: + d = val->vval.v_dict; + if (d == NULL) + ga_concat(gap, (char_u *)"null"); + else + { + if (d->dv_copyID == copyID) + ga_concat(gap, (char_u *)"{}"); + else + { + int first = TRUE; + int todo = (int)d->dv_hashtab.ht_used; + hashitem_T *hi; + + d->dv_copyID = copyID; + ga_append(gap, '{'); + + for (hi = d->dv_hashtab.ht_array; todo > 0 && !got_int; + ++hi) + if (!HASHITEM_EMPTY(hi)) + { + --todo; + if (first) + first = FALSE; + else + ga_append(gap, ','); + write_string(gap, hi->hi_key); + ga_append(gap, ':'); + json_encode_item(gap, &dict_lookup(hi)->di_tv, + copyID); + } + ga_append(gap, '}'); + } + } + break; + +#ifdef FEAT_FLOAT + case VAR_FLOAT: + vim_snprintf((char *)numbuf, NUMBUFLEN, "%g", val->vval.v_float); + ga_concat(gap, numbuf); + break; +#endif + default: EMSG2(_(e_intern2), "json_encode_item()"); break; + } +} + +/* + * Skip white space in "reader". + */ + static void +json_skip_white(js_read_T *reader) +{ + int c; + + while ((c = reader->js_buf[reader->js_used]) == ' ' + || c == TAB || c == NL || c == CAR) + ++reader->js_used; +} + +/* + * Make sure there are at least enough characters buffered to read a number. + */ + static void +json_fill_buffer(js_read_T *reader UNUSED) +{ + /* TODO */ +} + + static void +json_decode_array(js_read_T *reader, typval_T *res) +{ + char_u *p; + typval_T item; + listitem_T *li; + + if (rettv_list_alloc(res) == FAIL) + goto fail; + ++reader->js_used; /* consume the '[' */ + + while (TRUE) + { + json_skip_white(reader); + p = reader->js_buf + reader->js_used; + if (*p == NUL) + goto fail; + if (*p == ']') + { + ++reader->js_used; /* consume the ']' */ + return; + } + + if (!reader->js_eof && (int)(reader->js_end - p) < NUMBUFLEN) + json_fill_buffer(reader); + + json_decode_item(reader, &item); + li = listitem_alloc(); + if (li == NULL) + return; + li->li_tv = item; + list_append(res->vval.v_list, li); + + json_skip_white(reader); + p = reader->js_buf + reader->js_used; + if (*p == ',') + ++reader->js_used; + else if (*p != ']') + goto fail; + } +fail: + res->v_type = VAR_SPECIAL; + res->vval.v_number = VVAL_NONE; +} + + static void +json_decode_object(js_read_T *reader, typval_T *res) +{ + char_u *p; + typval_T tvkey; + typval_T item; + dictitem_T *di; + char_u buf[NUMBUFLEN]; + char_u *key; + + if (rettv_dict_alloc(res) == FAIL) + goto fail; + ++reader->js_used; /* consume the '{' */ + + while (TRUE) + { + json_skip_white(reader); + p = reader->js_buf + reader->js_used; + if (*p == NUL) + goto fail; + if (*p == '}') + { + ++reader->js_used; /* consume the '}' */ + return; + } + + if (!reader->js_eof && (int)(reader->js_end - p) < NUMBUFLEN) + json_fill_buffer(reader); + json_decode_item(reader, &tvkey); + key = get_tv_string_buf_chk(&tvkey, buf); + if (key == NULL || *key == NUL) + { + /* "key" is NULL when get_tv_string_buf_chk() gave an errmsg */ + if (key != NULL) + EMSG(_(e_emptykey)); + clear_tv(&tvkey); + goto fail; + } + + json_skip_white(reader); + p = reader->js_buf + reader->js_used; + if (*p != ':') + { + clear_tv(&tvkey); + goto fail; + } + ++reader->js_used; + json_skip_white(reader); + + if (!reader->js_eof && (int)(reader->js_end - p) < NUMBUFLEN) + json_fill_buffer(reader); + json_decode_item(reader, &item); + + di = dictitem_alloc(key); + clear_tv(&tvkey); + if (di == NULL) + { + clear_tv(&item); + goto fail; + } + di->di_tv = item; + dict_add(res->vval.v_dict, di); + + json_skip_white(reader); + p = reader->js_buf + reader->js_used; + if (*p == ',') + ++reader->js_used; + else if (*p != '}') + goto fail; + } +fail: + res->v_type = VAR_SPECIAL; + res->vval.v_number = VVAL_NONE; +} + + static void +json_decode_string(js_read_T *reader, typval_T *res) +{ + garray_T ga; + int len; + char_u *p = reader->js_buf + reader->js_used + 1; + int c; + long nr; + char_u buf[NUMBUFLEN]; + + ga_init2(&ga, 1, 200); + + /* TODO: fill buffer when needed. */ + while (*p != NUL && *p != '"') + { + if (*p == '\\') + { + c = -1; + switch (p[1]) + { + case 'b': c = BS; break; + case 't': c = TAB; break; + case 'n': c = NL; break; + case 'f': c = FF; break; + case 'r': c = CAR; break; + case 'u': + vim_str2nr(p + 2, NULL, &len, + STR2NR_HEX + STR2NR_FORCE, &nr, NULL, 4); + p += len + 2; +#ifdef FEAT_MBYTE + buf[(*mb_char2bytes)((int)nr, buf)] = NUL; + ga_concat(&ga, buf); +#else + ga_append(&ga, nr); +#endif + break; + default: c = p[1]; break; + } + if (c > 0) + { + p += 2; + ga_append(&ga, c); + } + } + else + { + len = MB_PTR2LEN(p); + if (ga_grow(&ga, len) == OK) + { + mch_memmove((char *)ga.ga_data + ga.ga_len, p, (size_t)len); + ga.ga_len += len; + } + p += len; + } + if (!reader->js_eof && (int)(reader->js_end - p) < NUMBUFLEN) + { + reader->js_used = (int)(p - reader->js_buf); + json_fill_buffer(reader); + p = reader->js_buf + reader->js_used; + } + } + reader->js_used = (int)(p - reader->js_buf); + if (*p == '"') + { + ++reader->js_used; + res->v_type = VAR_STRING; + res->vval.v_string = vim_strsave(ga.ga_data); + } + else + { + res->v_type = VAR_SPECIAL; + res->vval.v_number = VVAL_NONE; + } + ga_clear(&ga); +} + +/* + * Decode one item and put it in "result". + * Must already have skipped white space. + */ + static void +json_decode_item(js_read_T *reader, typval_T *res) +{ + char_u *p = reader->js_buf + reader->js_used; + + switch (*p) + { + case '[': /* array */ + json_decode_array(reader, res); + return; + + case '{': /* object */ + json_decode_object(reader, res); + return; + + case '"': /* string */ + json_decode_string(reader, res); + return; + + case ',': /* comma: empty item */ + case NUL: /* empty */ + res->v_type = VAR_SPECIAL; + res->vval.v_number = VVAL_NONE; + return; + + default: + if (VIM_ISDIGIT(*p) || *p == '-') + { + int len; + char_u *sp = p; +#ifdef FEAT_FLOAT + if (*sp == '-') + ++sp; + sp = skipdigits(sp); + if (*sp == '.' || *sp == 'e' || *sp == 'E') + { + res->v_type = VAR_FLOAT; + len = string2float(p, &res->vval.v_float); + } + else +#endif + { + long nr; + + res->v_type = VAR_NUMBER; + vim_str2nr(reader->js_buf + reader->js_used, + NULL, &len, 0, /* what */ + &nr, NULL, 0); + res->vval.v_number = nr; + } + reader->js_used += len; + return; + } + if (STRNICMP((char *)p, "false", 5) == 0) + { + reader->js_used += 5; + res->v_type = VAR_SPECIAL; + res->vval.v_number = VVAL_FALSE; + return; + } + if (STRNICMP((char *)p, "true", 4) == 0) + { + reader->js_used += 4; + res->v_type = VAR_SPECIAL; + res->vval.v_number = VVAL_TRUE; + return; + } + if (STRNICMP((char *)p, "null", 4) == 0) + { + reader->js_used += 4; + res->v_type = VAR_SPECIAL; + res->vval.v_number = VVAL_NULL; + return; + } + break; + } + + EMSG(_(e_invarg)); + res->v_type = VAR_SPECIAL; + res->vval.v_number = VVAL_NONE; +} + +/* + * Decode the JSON from "reader" and store the result in "res". + */ + void +json_decode(js_read_T *reader, typval_T *res) +{ + json_skip_white(reader); + json_decode_item(reader, res); + json_skip_white(reader); + if (reader->js_buf[reader->js_used] != NUL) + EMSG(_(e_invarg)); +} +#endif diff --git a/src/proto.h b/src/proto.h index 2b08eb38ff..5f52a314b2 100644 --- a/src/proto.h +++ b/src/proto.h @@ -95,6 +95,7 @@ extern int _stricoll __ARGS((char *a, char *b)); # endif # include "hardcopy.pro" # include "hashtab.pro" +# include "json.pro" # include "main.pro" # include "mark.pro" # include "memfile.pro" diff --git a/src/proto/eval.pro b/src/proto/eval.pro index fae403a504..f6ad4b49e8 100644 --- a/src/proto/eval.pro +++ b/src/proto/eval.pro @@ -46,6 +46,7 @@ int do_unlet(char_u *name, int forceit); void del_menutrans_vars(void); char_u *get_user_var_name(expand_T *xp, int idx); list_T *list_alloc(void); +int rettv_list_alloc(typval_T *rettv); void list_unref(list_T *l); void list_free(list_T *l, int recurse); listitem_T *listitem_alloc(void); @@ -61,11 +62,13 @@ int list_append_string(list_T *l, char_u *str, int len); int list_insert_tv(list_T *l, typval_T *tv, listitem_T *item); void list_insert(list_T *l, listitem_T *ni, listitem_T *item); void vimlist_remove(list_T *l, listitem_T *item, listitem_T *item2); +int get_copyID(void); int garbage_collect(void); int set_ref_in_ht(hashtab_T *ht, int copyID, list_stack_T **list_stack); int set_ref_in_list(list_T *l, int copyID, ht_stack_T **ht_stack); int set_ref_in_item(typval_T *tv, int copyID, ht_stack_T **ht_stack, list_stack_T **list_stack); dict_T *dict_alloc(void); +int rettv_dict_alloc(typval_T *rettv); void dict_unref(dict_T *d); void dict_free(dict_T *d, int recurse); dictitem_T *dictitem_alloc(char_u *key); @@ -76,6 +79,7 @@ int dict_add_list(dict_T *d, char *key, list_T *list); dictitem_T *dict_find(dict_T *d, char_u *key, int len); char_u *get_dict_string(dict_T *d, char_u *key, int save); long get_dict_number(dict_T *d, char_u *key); +int string2float(char_u *text, float_T *value); char_u *get_function_name(expand_T *xp, int idx); char_u *get_expr_name(expand_T *xp, int idx); int func_call(char_u *name, typval_T *args, dict_T *selfdict, typval_T *rettv); @@ -100,6 +104,7 @@ void free_tv(typval_T *varp); void clear_tv(typval_T *varp); long get_tv_number_chk(typval_T *varp, int *denote); char_u *get_tv_string_chk(typval_T *varp); +char_u *get_tv_string_buf_chk(typval_T *varp, char_u *buf); char_u *get_var_value(char_u *name); void new_script_vars(scid_T id); void init_var_dict(dict_T *dict, dictitem_T *dict_var, int scope); diff --git a/src/proto/json.pro b/src/proto/json.pro new file mode 100644 index 0000000000..6920f516eb --- /dev/null +++ b/src/proto/json.pro @@ -0,0 +1,5 @@ +/* json.c */ +char_u *json_encode(typval_T *val); +void json_encode_item(garray_T *gap, typval_T *val, int copyID); +void json_decode(js_read_T *reader, typval_T *res); +/* vim: set ft=c : */ diff --git a/src/structs.h b/src/structs.h index 143d46dfa9..8c84b5a75c 100644 --- a/src/structs.h +++ b/src/structs.h @@ -1138,6 +1138,7 @@ typedef struct #define VAR_LIST 4 /* "v_list" is used */ #define VAR_DICT 5 /* "v_dict" is used */ #define VAR_FLOAT 6 /* "v_float" is used */ +#define VAR_SPECIAL 7 /* "v_number" is used */ /* Values for "dv_scope". */ #define VAR_SCOPE 1 /* a:, v:, s:, etc. scope dictionaries */ @@ -2682,3 +2683,15 @@ typedef struct { UINT32_T state[8]; char_u buffer[64]; } context_sha256_T; + +/* + * Structure used for reading in json_decode(). + */ +typedef struct +{ + char_u *js_buf; /* text to be decoded */ + char_u *js_end; /* NUL in js_buf when js_eof is FALSE */ + int js_used; /* bytes used from js_buf */ + int js_eof; /* when TRUE js_buf is all there is */ + FILE *js_fd; /* file descriptor to read more from */ +} js_read_T; diff --git a/src/testdir/test_alot.vim b/src/testdir/test_alot.vim index e89afb49ad..aceb073f69 100644 --- a/src/testdir/test_alot.vim +++ b/src/testdir/test_alot.vim @@ -5,6 +5,7 @@ source test_backspace_opt.vim source test_cursor_func.vim source test_delete.vim source test_expand.vim +source test_json.vim source test_lispwords.vim source test_menu.vim source test_searchpos.vim diff --git a/src/testdir/test_json.vim b/src/testdir/test_json.vim new file mode 100644 index 0000000000..e658c9778e --- /dev/null +++ b/src/testdir/test_json.vim @@ -0,0 +1,91 @@ +" Test for JSON functions. + +let s:json1 = '"str\"in\\g"' +let s:var1 = "str\"in\\g" +let s:json2 = '"\u0001\u0002\u0003\u0004\u0005\u0006\u0007"' +let s:var2 = "\x01\x02\x03\x04\x05\x06\x07" +let s:json3 = '"\b\t\n\u000b\f\r\u000e\u000f"' +let s:var3 = "\x08\x09\x0a\x0b\x0c\x0d\x0e\x0f" +let s:json4 = '"\u0010\u0011\u0012\u0013\u0014\u0015\u0016\u0017"' +let s:var4 = "\x10\x11\x12\x13\x14\x15\x16\x17" +let s:json5 = '"\u0018\u0019\u001a\u001b\u001c\u001d\u001e\u001f"' +let s:var5 = "\x18\x19\x1a\x1b\x1c\x1d\x1e\x1f" + +let s:jsonmb = '"s¢cĴgё"' +let s:varmb = "s¢cĴgё" +let s:jsonnr = '1234' +let s:varnr = 1234 +let s:jsonfl = '12.34' +let s:varfl = 12.34 + +let s:jsonl1 = '[1,"a",3]' +let s:varl1 = [1, "a", 3] +let s:jsonl2 = '[1,["a",[],"c"],3]' +let s:jsonl2s = " [\r1 , [ \"a\" , [ ] , \"c\" ] , 3\]\r\n" +let s:varl2 = [1, 2, 3] +let l2 = ['a', s:varl2, 'c'] +let s:varl2[1] = l2 +let s:varl2x = [1, ["a", [], "c"], 3] + +let s:jsond1 = '{"a":1,"b":"bee","c":[1,2]}' +let s:vard1 = {"a": 1, "b": "bee","c": [1,2]} +let s:jsond2 = '{"1":1,"2":{"a":"aa","b":{},"c":"cc"},"3":3}' +let s:jsond2s = " { \"1\" : 1 , \"2\" :\n{ \"a\"\r: \"aa\" , \"b\" : {\} , \"c\" : \"cc\" } , \"3\" : 3 }\r\n" +let s:vard2 = {"1": 1, "2": 2, "3": 3} +let d2 = {"a": "aa", "b": s:vard2, "c": "cc"} +let s:vard2["2"] = d2 +let s:vard2x = {"1": 1, "2": {"a": "aa", "b": {}, "c": "cc"}, "3": 3} + +let s:jsonvals = '[true,false,,null]' +let s:varvals = [v:true, v:false, v:none, v:null] + +func Test_encode() + call assert_equal(s:json1, jsonencode(s:var1)) + call assert_equal(s:json2, jsonencode(s:var2)) + call assert_equal(s:json3, jsonencode(s:var3)) + call assert_equal(s:json4, jsonencode(s:var4)) + call assert_equal(s:json5, jsonencode(s:var5)) + + if has('multi_byte') + call assert_equal(s:jsonmb, jsonencode(s:varmb)) + endif + + call assert_equal(s:jsonnr, jsonencode(s:varnr)) + if has('float') + call assert_equal(s:jsonfl, jsonencode(s:varfl)) + endif + + call assert_equal(s:jsonl1, jsonencode(s:varl1)) + call assert_equal(s:jsonl2, jsonencode(s:varl2)) + + call assert_equal(s:jsond1, jsonencode(s:vard1)) + call assert_equal(s:jsond2, jsonencode(s:vard2)) + + call assert_equal(s:jsonvals, jsonencode(s:varvals)) +endfunc + +func Test_decode() + call assert_equal(s:var1, jsondecode(s:json1)) + call assert_equal(s:var2, jsondecode(s:json2)) + call assert_equal(s:var3, jsondecode(s:json3)) + call assert_equal(s:var4, jsondecode(s:json4)) + call assert_equal(s:var5, jsondecode(s:json5)) + + if has('multi_byte') + call assert_equal(s:varmb, jsondecode(s:jsonmb)) + endif + + call assert_equal(s:varnr, jsondecode(s:jsonnr)) + if has('float') + call assert_equal(s:varfl, jsondecode(s:jsonfl)) + endif + + call assert_equal(s:varl1, jsondecode(s:jsonl1)) + call assert_equal(s:varl2x, jsondecode(s:jsonl2)) + call assert_equal(s:varl2x, jsondecode(s:jsonl2s)) + + call assert_equal(s:vard1, jsondecode(s:jsond1)) + call assert_equal(s:vard2x, jsondecode(s:jsond2)) + + call assert_equal(s:varvals, jsondecode(s:jsonvals)) +endfunc diff --git a/src/version.c b/src/version.c index c964b3cad5..85410e34be 100644 --- a/src/version.c +++ b/src/version.c @@ -741,6 +741,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ +/**/ + 1154, /**/ 1153, /**/ diff --git a/src/vim.h b/src/vim.h index 2ebaa00807..90a5353c3f 100644 --- a/src/vim.h +++ b/src/vim.h @@ -1896,7 +1896,17 @@ typedef int proftime_T; /* dummy for function prototypes */ #define VV_OPTION_OLD 60 #define VV_OPTION_TYPE 61 #define VV_ERRORS 62 -#define VV_LEN 63 /* number of v: vars */ +#define VV_FALSE 63 +#define VV_TRUE 64 +#define VV_NULL 65 +#define VV_NONE 66 +#define VV_LEN 67 /* number of v: vars */ + +/* used for v_number in VAR_SPECIAL */ +#define VVAL_FALSE 0L +#define VVAL_TRUE 1L +#define VVAL_NONE 2L +#define VVAL_NULL 3L #ifdef FEAT_CLIPBOARD From 64922b9014765a41bb09e8612433a2a61918af6e Mon Sep 17 00:00:00 2001 From: Bram Moolenaar Date: Sat, 23 Jan 2016 19:54:30 +0100 Subject: [PATCH 2/8] patch 7.4.1155 Problem: Build with normal features fails. Solution: Always deinfe dict_lookup(). --- src/eval.c | 3 --- src/version.c | 2 ++ 2 files changed, 2 insertions(+), 3 deletions(-) diff --git a/src/eval.c b/src/eval.c index a0cc6d0170..c41e4a55a1 100644 --- a/src/eval.c +++ b/src/eval.c @@ -6140,8 +6140,6 @@ list_equal(l1, l2, ic, recursive) return item1 == NULL && item2 == NULL; } -#if defined(FEAT_RUBY) || defined(FEAT_PYTHON) || defined(FEAT_PYTHON3) \ - || defined(FEAT_MZSCHEME) || defined(FEAT_LUA) || defined(PROTO) /* * Return the dictitem that an entry in a hashtable points to. */ @@ -6151,7 +6149,6 @@ dict_lookup(hi) { return HI2DI(hi); } -#endif /* * Return TRUE when two dictionaries have exactly the same key/values. diff --git a/src/version.c b/src/version.c index 85410e34be..b909693e5f 100644 --- a/src/version.c +++ b/src/version.c @@ -741,6 +741,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ +/**/ + 1155, /**/ 1154, /**/ From 2dedb45260604911035cff2364aca90a69156ed9 Mon Sep 17 00:00:00 2001 From: Bram Moolenaar Date: Sat, 23 Jan 2016 21:38:51 +0100 Subject: [PATCH 3/8] patch 7.4.1156 Problem: Coverity warns for NULL pointer and ignoring return value. Solution: Check for NULL pointer. When dict_add() returns FAIL free the item. --- src/json.c | 8 ++++++-- src/version.c | 2 ++ 2 files changed, 8 insertions(+), 2 deletions(-) diff --git a/src/json.c b/src/json.c index 7b67994ddd..442eaff2c9 100644 --- a/src/json.c +++ b/src/json.c @@ -318,7 +318,8 @@ json_decode_object(js_read_T *reader, typval_T *res) goto fail; } di->di_tv = item; - dict_add(res->vval.v_dict, di); + if (dict_add(res->vval.v_dict, di) == FAIL) + dictitem_free(di); json_skip_white(reader); p = reader->js_buf + reader->js_used; @@ -398,7 +399,10 @@ json_decode_string(js_read_T *reader, typval_T *res) { ++reader->js_used; res->v_type = VAR_STRING; - res->vval.v_string = vim_strsave(ga.ga_data); + if (ga.ga_data == NULL) + res->vval.v_string = NULL; + else + res->vval.v_string = vim_strsave(ga.ga_data); } else { diff --git a/src/version.c b/src/version.c index b909693e5f..d646665c9d 100644 --- a/src/version.c +++ b/src/version.c @@ -741,6 +741,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ +/**/ + 1156, /**/ 1155, /**/ From f95534c3d411084d1b6112fe64f6108bf7acbb92 Mon Sep 17 00:00:00 2001 From: Bram Moolenaar Date: Sat, 23 Jan 2016 21:59:52 +0100 Subject: [PATCH 4/8] patch 7.4.1157 Problem: type() does not work for v:true, v:none, etc. Solution: Add new type numbers. --- src/eval.c | 7 +++++++ src/testdir/test_json.vim | 14 ++++++++++++++ src/testdir/test_viml.vim | 17 +++++++++++++++++ src/version.c | 2 ++ 4 files changed, 40 insertions(+) diff --git a/src/eval.c b/src/eval.c index c41e4a55a1..7edae39147 100644 --- a/src/eval.c +++ b/src/eval.c @@ -20157,6 +20157,13 @@ f_type(argvars, rettv) #ifdef FEAT_FLOAT case VAR_FLOAT: n = 5; break; #endif + case VAR_SPECIAL: + if (argvars[0].vval.v_number == VVAL_FALSE + || argvars[0].vval.v_number == VVAL_TRUE) + n = 6; + else + n = 7; + break; default: EMSG2(_(e_intern2), "f_type()"); n = 0; break; } rettv->vval.v_number = n; diff --git a/src/testdir/test_json.vim b/src/testdir/test_json.vim index e658c9778e..b30647947f 100644 --- a/src/testdir/test_json.vim +++ b/src/testdir/test_json.vim @@ -88,4 +88,18 @@ func Test_decode() call assert_equal(s:vard2x, jsondecode(s:jsond2)) call assert_equal(s:varvals, jsondecode(s:jsonvals)) + + call assert_equal(v:true, jsondecode('true')) + call assert_equal(type(v:true), type(jsondecode('true'))) + call assert_equal(v:none, jsondecode('')) + call assert_equal(type(v:none), type(jsondecode(''))) + call assert_equal("", jsondecode('""')) + + call assert_fails('call jsondecode("\"")', "E474:") + call assert_fails('call jsondecode("{-}")', "E474:") + call assert_fails('call jsondecode("blah")', "E474:") + call assert_fails('call jsondecode("true blah")', "E474:") + call assert_fails('call jsondecode("")', "E474:") + call assert_fails('call jsondecode("[foobar]")', "E474:") + call assert_fails('call jsondecode("{foobar}")', "E474:") endfunc diff --git a/src/testdir/test_viml.vim b/src/testdir/test_viml.vim index 07286fb024..39c0667b81 100644 --- a/src/testdir/test_viml.vim +++ b/src/testdir/test_viml.vim @@ -921,6 +921,23 @@ func Test_curlies() call assert_equal(77, g:a['t']) endfunc +"------------------------------------------------------------------------------- +" Test 91: using type(). {{{1 +"------------------------------------------------------------------------------- + +func Test_type() + call assert_equal(0, type(0)) + call assert_equal(1, type("")) + call assert_equal(2, type(function("tr"))) + call assert_equal(3, type([])) + call assert_equal(4, type({})) + call assert_equal(5, type(0.0)) + call assert_equal(6, type(v:false)) + call assert_equal(6, type(v:true)) + call assert_equal(7, type(v:none)) + call assert_equal(7, type(v:null)) +endfunc + "------------------------------------------------------------------------------- " Modelines {{{1 " vim: ts=8 sw=4 tw=80 fdm=marker diff --git a/src/version.c b/src/version.c index d646665c9d..2c9911057c 100644 --- a/src/version.c +++ b/src/version.c @@ -741,6 +741,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ +/**/ + 1157, /**/ 1156, /**/ From 48e697e4b6b6b490c58ec9393da9b2d2ea47c6d8 Mon Sep 17 00:00:00 2001 From: Bram Moolenaar Date: Sat, 23 Jan 2016 22:17:30 +0100 Subject: [PATCH 5/8] patch 7.4.1158 Problem: Still using __ARGS(). Solution: Remove __ARGS() from eval.c --- src/eval.c | 910 +++++++++++++++++++++++++------------------------- src/version.c | 2 + 2 files changed, 457 insertions(+), 455 deletions(-) diff --git a/src/eval.c b/src/eval.c index 7edae39147..751c608431 100644 --- a/src/eval.c +++ b/src/eval.c @@ -388,493 +388,493 @@ static struct vimvar static dictitem_T vimvars_var; /* variable used for v: */ #define vimvarht vimvardict.dv_hashtab -static void prepare_vimvar __ARGS((int idx, typval_T *save_tv)); -static void restore_vimvar __ARGS((int idx, typval_T *save_tv)); -static int ex_let_vars __ARGS((char_u *arg, typval_T *tv, int copy, int semicolon, int var_count, char_u *nextchars)); -static char_u *skip_var_list __ARGS((char_u *arg, int *var_count, int *semicolon)); -static char_u *skip_var_one __ARGS((char_u *arg)); -static void list_hashtable_vars __ARGS((hashtab_T *ht, char_u *prefix, int empty, int *first)); -static void list_glob_vars __ARGS((int *first)); -static void list_buf_vars __ARGS((int *first)); -static void list_win_vars __ARGS((int *first)); +static void prepare_vimvar(int idx, typval_T *save_tv); +static void restore_vimvar(int idx, typval_T *save_tv); +static int ex_let_vars(char_u *arg, typval_T *tv, int copy, int semicolon, int var_count, char_u *nextchars); +static char_u *skip_var_list(char_u *arg, int *var_count, int *semicolon); +static char_u *skip_var_one(char_u *arg); +static void list_hashtable_vars(hashtab_T *ht, char_u *prefix, int empty, int *first); +static void list_glob_vars(int *first); +static void list_buf_vars(int *first); +static void list_win_vars(int *first); #ifdef FEAT_WINDOWS -static void list_tab_vars __ARGS((int *first)); +static void list_tab_vars(int *first); #endif -static void list_vim_vars __ARGS((int *first)); -static void list_script_vars __ARGS((int *first)); -static void list_func_vars __ARGS((int *first)); -static char_u *list_arg_vars __ARGS((exarg_T *eap, char_u *arg, int *first)); -static char_u *ex_let_one __ARGS((char_u *arg, typval_T *tv, int copy, char_u *endchars, char_u *op)); -static int check_changedtick __ARGS((char_u *arg)); -static char_u *get_lval __ARGS((char_u *name, typval_T *rettv, lval_T *lp, int unlet, int skip, int flags, int fne_flags)); -static void clear_lval __ARGS((lval_T *lp)); -static void set_var_lval __ARGS((lval_T *lp, char_u *endp, typval_T *rettv, int copy, char_u *op)); -static int tv_op __ARGS((typval_T *tv1, typval_T *tv2, char_u *op)); -static void list_fix_watch __ARGS((list_T *l, listitem_T *item)); -static void ex_unletlock __ARGS((exarg_T *eap, char_u *argstart, int deep)); -static int do_unlet_var __ARGS((lval_T *lp, char_u *name_end, int forceit)); -static int do_lock_var __ARGS((lval_T *lp, char_u *name_end, int deep, int lock)); -static void item_lock __ARGS((typval_T *tv, int deep, int lock)); -static int tv_islocked __ARGS((typval_T *tv)); +static void list_vim_vars(int *first); +static void list_script_vars(int *first); +static void list_func_vars(int *first); +static char_u *list_arg_vars(exarg_T *eap, char_u *arg, int *first); +static char_u *ex_let_one(char_u *arg, typval_T *tv, int copy, char_u *endchars, char_u *op); +static int check_changedtick(char_u *arg); +static char_u *get_lval(char_u *name, typval_T *rettv, lval_T *lp, int unlet, int skip, int flags, int fne_flags); +static void clear_lval(lval_T *lp); +static void set_var_lval(lval_T *lp, char_u *endp, typval_T *rettv, int copy, char_u *op); +static int tv_op(typval_T *tv1, typval_T *tv2, char_u *op); +static void list_fix_watch(list_T *l, listitem_T *item); +static void ex_unletlock(exarg_T *eap, char_u *argstart, int deep); +static int do_unlet_var(lval_T *lp, char_u *name_end, int forceit); +static int do_lock_var(lval_T *lp, char_u *name_end, int deep, int lock); +static void item_lock(typval_T *tv, int deep, int lock); +static int tv_islocked(typval_T *tv); -static int eval0 __ARGS((char_u *arg, typval_T *rettv, char_u **nextcmd, int evaluate)); -static int eval1 __ARGS((char_u **arg, typval_T *rettv, int evaluate)); -static int eval2 __ARGS((char_u **arg, typval_T *rettv, int evaluate)); -static int eval3 __ARGS((char_u **arg, typval_T *rettv, int evaluate)); -static int eval4 __ARGS((char_u **arg, typval_T *rettv, int evaluate)); -static int eval5 __ARGS((char_u **arg, typval_T *rettv, int evaluate)); -static int eval6 __ARGS((char_u **arg, typval_T *rettv, int evaluate, int want_string)); -static int eval7 __ARGS((char_u **arg, typval_T *rettv, int evaluate, int want_string)); +static int eval0(char_u *arg, typval_T *rettv, char_u **nextcmd, int evaluate); +static int eval1(char_u **arg, typval_T *rettv, int evaluate); +static int eval2(char_u **arg, typval_T *rettv, int evaluate); +static int eval3(char_u **arg, typval_T *rettv, int evaluate); +static int eval4(char_u **arg, typval_T *rettv, int evaluate); +static int eval5(char_u **arg, typval_T *rettv, int evaluate); +static int eval6(char_u **arg, typval_T *rettv, int evaluate, int want_string); +static int eval7(char_u **arg, typval_T *rettv, int evaluate, int want_string); -static int eval_index __ARGS((char_u **arg, typval_T *rettv, int evaluate, int verbose)); -static int get_option_tv __ARGS((char_u **arg, typval_T *rettv, int evaluate)); -static int get_string_tv __ARGS((char_u **arg, typval_T *rettv, int evaluate)); -static int get_lit_string_tv __ARGS((char_u **arg, typval_T *rettv, int evaluate)); -static int get_list_tv __ARGS((char_u **arg, typval_T *rettv, int evaluate)); -static long list_len __ARGS((list_T *l)); -static int list_equal __ARGS((list_T *l1, list_T *l2, int ic, int recursive)); -static int dict_equal __ARGS((dict_T *d1, dict_T *d2, int ic, int recursive)); -static int tv_equal __ARGS((typval_T *tv1, typval_T *tv2, int ic, int recursive)); -static long list_find_nr __ARGS((list_T *l, long idx, int *errorp)); -static long list_idx_of_item __ARGS((list_T *l, listitem_T *item)); -static int list_append_number __ARGS((list_T *l, varnumber_T n)); -static int list_extend __ARGS((list_T *l1, list_T *l2, listitem_T *bef)); -static int list_concat __ARGS((list_T *l1, list_T *l2, typval_T *tv)); -static list_T *list_copy __ARGS((list_T *orig, int deep, int copyID)); -static char_u *list2string __ARGS((typval_T *tv, int copyID)); -static int list_join_inner __ARGS((garray_T *gap, list_T *l, char_u *sep, int echo_style, int copyID, garray_T *join_gap)); -static int list_join __ARGS((garray_T *gap, list_T *l, char_u *sep, int echo, int copyID)); -static int free_unref_items __ARGS((int copyID)); -static dictitem_T *dictitem_copy __ARGS((dictitem_T *org)); -static void dictitem_remove __ARGS((dict_T *dict, dictitem_T *item)); -static dict_T *dict_copy __ARGS((dict_T *orig, int deep, int copyID)); -static long dict_len __ARGS((dict_T *d)); -static char_u *dict2string __ARGS((typval_T *tv, int copyID)); -static int get_dict_tv __ARGS((char_u **arg, typval_T *rettv, int evaluate)); -static char_u *echo_string __ARGS((typval_T *tv, char_u **tofree, char_u *numbuf, int copyID)); -static char_u *tv2string __ARGS((typval_T *tv, char_u **tofree, char_u *numbuf, int copyID)); -static char_u *string_quote __ARGS((char_u *str, int function)); -static int get_env_tv __ARGS((char_u **arg, typval_T *rettv, int evaluate)); -static int find_internal_func __ARGS((char_u *name)); -static char_u *deref_func_name __ARGS((char_u *name, int *lenp, int no_autoload)); -static int get_func_tv __ARGS((char_u *name, int len, typval_T *rettv, char_u **arg, linenr_T firstline, linenr_T lastline, int *doesrange, int evaluate, dict_T *selfdict)); -static int call_func __ARGS((char_u *funcname, int len, typval_T *rettv, int argcount, typval_T *argvars, linenr_T firstline, linenr_T lastline, int *doesrange, int evaluate, dict_T *selfdict)); -static void emsg_funcname __ARGS((char *ermsg, char_u *name)); -static int non_zero_arg __ARGS((typval_T *argvars)); +static int eval_index(char_u **arg, typval_T *rettv, int evaluate, int verbose); +static int get_option_tv(char_u **arg, typval_T *rettv, int evaluate); +static int get_string_tv(char_u **arg, typval_T *rettv, int evaluate); +static int get_lit_string_tv(char_u **arg, typval_T *rettv, int evaluate); +static int get_list_tv(char_u **arg, typval_T *rettv, int evaluate); +static long list_len(list_T *l); +static int list_equal(list_T *l1, list_T *l2, int ic, int recursive); +static int dict_equal(dict_T *d1, dict_T *d2, int ic, int recursive); +static int tv_equal(typval_T *tv1, typval_T *tv2, int ic, int recursive); +static long list_find_nr(list_T *l, long idx, int *errorp); +static long list_idx_of_item(list_T *l, listitem_T *item); +static int list_append_number(list_T *l, varnumber_T n); +static int list_extend(list_T *l1, list_T *l2, listitem_T *bef); +static int list_concat(list_T *l1, list_T *l2, typval_T *tv); +static list_T *list_copy(list_T *orig, int deep, int copyID); +static char_u *list2string(typval_T *tv, int copyID); +static int list_join_inner(garray_T *gap, list_T *l, char_u *sep, int echo_style, int copyID, garray_T *join_gap); +static int list_join(garray_T *gap, list_T *l, char_u *sep, int echo, int copyID); +static int free_unref_items(int copyID); +static dictitem_T *dictitem_copy(dictitem_T *org); +static void dictitem_remove(dict_T *dict, dictitem_T *item); +static dict_T *dict_copy(dict_T *orig, int deep, int copyID); +static long dict_len(dict_T *d); +static char_u *dict2string(typval_T *tv, int copyID); +static int get_dict_tv(char_u **arg, typval_T *rettv, int evaluate); +static char_u *echo_string(typval_T *tv, char_u **tofree, char_u *numbuf, int copyID); +static char_u *tv2string(typval_T *tv, char_u **tofree, char_u *numbuf, int copyID); +static char_u *string_quote(char_u *str, int function); +static int get_env_tv(char_u **arg, typval_T *rettv, int evaluate); +static int find_internal_func(char_u *name); +static char_u *deref_func_name(char_u *name, int *lenp, int no_autoload); +static int get_func_tv(char_u *name, int len, typval_T *rettv, char_u **arg, linenr_T firstline, linenr_T lastline, int *doesrange, int evaluate, dict_T *selfdict); +static int call_func(char_u *funcname, int len, typval_T *rettv, int argcount, typval_T *argvars, linenr_T firstline, linenr_T lastline, int *doesrange, int evaluate, dict_T *selfdict); +static void emsg_funcname(char *ermsg, char_u *name); +static int non_zero_arg(typval_T *argvars); #ifdef FEAT_FLOAT -static void f_abs __ARGS((typval_T *argvars, typval_T *rettv)); -static void f_acos __ARGS((typval_T *argvars, typval_T *rettv)); +static void f_abs(typval_T *argvars, typval_T *rettv); +static void f_acos(typval_T *argvars, typval_T *rettv); #endif -static void f_add __ARGS((typval_T *argvars, typval_T *rettv)); -static void f_alloc_fail __ARGS((typval_T *argvars, typval_T *rettv)); -static void f_and __ARGS((typval_T *argvars, typval_T *rettv)); -static void f_append __ARGS((typval_T *argvars, typval_T *rettv)); -static void f_argc __ARGS((typval_T *argvars, typval_T *rettv)); -static void f_argidx __ARGS((typval_T *argvars, typval_T *rettv)); -static void f_arglistid __ARGS((typval_T *argvars, typval_T *rettv)); -static void f_argv __ARGS((typval_T *argvars, typval_T *rettv)); -static void f_assert_equal __ARGS((typval_T *argvars, typval_T *rettv)); -static void f_assert_exception __ARGS((typval_T *argvars, typval_T *rettv)); -static void f_assert_fails __ARGS((typval_T *argvars, typval_T *rettv)); -static void f_assert_false __ARGS((typval_T *argvars, typval_T *rettv)); -static void f_assert_true __ARGS((typval_T *argvars, typval_T *rettv)); +static void f_add(typval_T *argvars, typval_T *rettv); +static void f_alloc_fail(typval_T *argvars, typval_T *rettv); +static void f_and(typval_T *argvars, typval_T *rettv); +static void f_append(typval_T *argvars, typval_T *rettv); +static void f_argc(typval_T *argvars, typval_T *rettv); +static void f_argidx(typval_T *argvars, typval_T *rettv); +static void f_arglistid(typval_T *argvars, typval_T *rettv); +static void f_argv(typval_T *argvars, typval_T *rettv); +static void f_assert_equal(typval_T *argvars, typval_T *rettv); +static void f_assert_exception(typval_T *argvars, typval_T *rettv); +static void f_assert_fails(typval_T *argvars, typval_T *rettv); +static void f_assert_false(typval_T *argvars, typval_T *rettv); +static void f_assert_true(typval_T *argvars, typval_T *rettv); #ifdef FEAT_FLOAT -static void f_asin __ARGS((typval_T *argvars, typval_T *rettv)); -static void f_atan __ARGS((typval_T *argvars, typval_T *rettv)); -static void f_atan2 __ARGS((typval_T *argvars, typval_T *rettv)); +static void f_asin(typval_T *argvars, typval_T *rettv); +static void f_atan(typval_T *argvars, typval_T *rettv); +static void f_atan2(typval_T *argvars, typval_T *rettv); #endif -static void f_browse __ARGS((typval_T *argvars, typval_T *rettv)); -static void f_browsedir __ARGS((typval_T *argvars, typval_T *rettv)); -static void f_bufexists __ARGS((typval_T *argvars, typval_T *rettv)); -static void f_buflisted __ARGS((typval_T *argvars, typval_T *rettv)); -static void f_bufloaded __ARGS((typval_T *argvars, typval_T *rettv)); -static void f_bufname __ARGS((typval_T *argvars, typval_T *rettv)); -static void f_bufnr __ARGS((typval_T *argvars, typval_T *rettv)); -static void f_bufwinnr __ARGS((typval_T *argvars, typval_T *rettv)); -static void f_byte2line __ARGS((typval_T *argvars, typval_T *rettv)); -static void byteidx __ARGS((typval_T *argvars, typval_T *rettv, int comp)); -static void f_byteidx __ARGS((typval_T *argvars, typval_T *rettv)); -static void f_byteidxcomp __ARGS((typval_T *argvars, typval_T *rettv)); -static void f_call __ARGS((typval_T *argvars, typval_T *rettv)); +static void f_browse(typval_T *argvars, typval_T *rettv); +static void f_browsedir(typval_T *argvars, typval_T *rettv); +static void f_bufexists(typval_T *argvars, typval_T *rettv); +static void f_buflisted(typval_T *argvars, typval_T *rettv); +static void f_bufloaded(typval_T *argvars, typval_T *rettv); +static void f_bufname(typval_T *argvars, typval_T *rettv); +static void f_bufnr(typval_T *argvars, typval_T *rettv); +static void f_bufwinnr(typval_T *argvars, typval_T *rettv); +static void f_byte2line(typval_T *argvars, typval_T *rettv); +static void byteidx(typval_T *argvars, typval_T *rettv, int comp); +static void f_byteidx(typval_T *argvars, typval_T *rettv); +static void f_byteidxcomp(typval_T *argvars, typval_T *rettv); +static void f_call(typval_T *argvars, typval_T *rettv); #ifdef FEAT_FLOAT -static void f_ceil __ARGS((typval_T *argvars, typval_T *rettv)); +static void f_ceil(typval_T *argvars, typval_T *rettv); #endif -static void f_changenr __ARGS((typval_T *argvars, typval_T *rettv)); -static void f_char2nr __ARGS((typval_T *argvars, typval_T *rettv)); -static void f_cindent __ARGS((typval_T *argvars, typval_T *rettv)); -static void f_clearmatches __ARGS((typval_T *argvars, typval_T *rettv)); -static void f_col __ARGS((typval_T *argvars, typval_T *rettv)); +static void f_changenr(typval_T *argvars, typval_T *rettv); +static void f_char2nr(typval_T *argvars, typval_T *rettv); +static void f_cindent(typval_T *argvars, typval_T *rettv); +static void f_clearmatches(typval_T *argvars, typval_T *rettv); +static void f_col(typval_T *argvars, typval_T *rettv); #if defined(FEAT_INS_EXPAND) -static void f_complete __ARGS((typval_T *argvars, typval_T *rettv)); -static void f_complete_add __ARGS((typval_T *argvars, typval_T *rettv)); -static void f_complete_check __ARGS((typval_T *argvars, typval_T *rettv)); +static void f_complete(typval_T *argvars, typval_T *rettv); +static void f_complete_add(typval_T *argvars, typval_T *rettv); +static void f_complete_check(typval_T *argvars, typval_T *rettv); #endif -static void f_confirm __ARGS((typval_T *argvars, typval_T *rettv)); -static void f_copy __ARGS((typval_T *argvars, typval_T *rettv)); +static void f_confirm(typval_T *argvars, typval_T *rettv); +static void f_copy(typval_T *argvars, typval_T *rettv); #ifdef FEAT_FLOAT -static void f_cos __ARGS((typval_T *argvars, typval_T *rettv)); -static void f_cosh __ARGS((typval_T *argvars, typval_T *rettv)); +static void f_cos(typval_T *argvars, typval_T *rettv); +static void f_cosh(typval_T *argvars, typval_T *rettv); #endif -static void f_count __ARGS((typval_T *argvars, typval_T *rettv)); -static void f_cscope_connection __ARGS((typval_T *argvars, typval_T *rettv)); -static void f_cursor __ARGS((typval_T *argsvars, typval_T *rettv)); -static void f_deepcopy __ARGS((typval_T *argvars, typval_T *rettv)); -static void f_delete __ARGS((typval_T *argvars, typval_T *rettv)); -static void f_did_filetype __ARGS((typval_T *argvars, typval_T *rettv)); -static void f_diff_filler __ARGS((typval_T *argvars, typval_T *rettv)); -static void f_diff_hlID __ARGS((typval_T *argvars, typval_T *rettv)); -static void f_empty __ARGS((typval_T *argvars, typval_T *rettv)); -static void f_escape __ARGS((typval_T *argvars, typval_T *rettv)); -static void f_eval __ARGS((typval_T *argvars, typval_T *rettv)); -static void f_eventhandler __ARGS((typval_T *argvars, typval_T *rettv)); -static void f_executable __ARGS((typval_T *argvars, typval_T *rettv)); -static void f_exepath __ARGS((typval_T *argvars, typval_T *rettv)); -static void f_exists __ARGS((typval_T *argvars, typval_T *rettv)); +static void f_count(typval_T *argvars, typval_T *rettv); +static void f_cscope_connection(typval_T *argvars, typval_T *rettv); +static void f_cursor(typval_T *argsvars, typval_T *rettv); +static void f_deepcopy(typval_T *argvars, typval_T *rettv); +static void f_delete(typval_T *argvars, typval_T *rettv); +static void f_did_filetype(typval_T *argvars, typval_T *rettv); +static void f_diff_filler(typval_T *argvars, typval_T *rettv); +static void f_diff_hlID(typval_T *argvars, typval_T *rettv); +static void f_empty(typval_T *argvars, typval_T *rettv); +static void f_escape(typval_T *argvars, typval_T *rettv); +static void f_eval(typval_T *argvars, typval_T *rettv); +static void f_eventhandler(typval_T *argvars, typval_T *rettv); +static void f_executable(typval_T *argvars, typval_T *rettv); +static void f_exepath(typval_T *argvars, typval_T *rettv); +static void f_exists(typval_T *argvars, typval_T *rettv); #ifdef FEAT_FLOAT -static void f_exp __ARGS((typval_T *argvars, typval_T *rettv)); +static void f_exp(typval_T *argvars, typval_T *rettv); #endif -static void f_expand __ARGS((typval_T *argvars, typval_T *rettv)); -static void f_extend __ARGS((typval_T *argvars, typval_T *rettv)); -static void f_feedkeys __ARGS((typval_T *argvars, typval_T *rettv)); -static void f_filereadable __ARGS((typval_T *argvars, typval_T *rettv)); -static void f_filewritable __ARGS((typval_T *argvars, typval_T *rettv)); -static void f_filter __ARGS((typval_T *argvars, typval_T *rettv)); -static void f_finddir __ARGS((typval_T *argvars, typval_T *rettv)); -static void f_findfile __ARGS((typval_T *argvars, typval_T *rettv)); +static void f_expand(typval_T *argvars, typval_T *rettv); +static void f_extend(typval_T *argvars, typval_T *rettv); +static void f_feedkeys(typval_T *argvars, typval_T *rettv); +static void f_filereadable(typval_T *argvars, typval_T *rettv); +static void f_filewritable(typval_T *argvars, typval_T *rettv); +static void f_filter(typval_T *argvars, typval_T *rettv); +static void f_finddir(typval_T *argvars, typval_T *rettv); +static void f_findfile(typval_T *argvars, typval_T *rettv); #ifdef FEAT_FLOAT -static void f_float2nr __ARGS((typval_T *argvars, typval_T *rettv)); -static void f_floor __ARGS((typval_T *argvars, typval_T *rettv)); -static void f_fmod __ARGS((typval_T *argvars, typval_T *rettv)); +static void f_float2nr(typval_T *argvars, typval_T *rettv); +static void f_floor(typval_T *argvars, typval_T *rettv); +static void f_fmod(typval_T *argvars, typval_T *rettv); #endif -static void f_fnameescape __ARGS((typval_T *argvars, typval_T *rettv)); -static void f_fnamemodify __ARGS((typval_T *argvars, typval_T *rettv)); -static void f_foldclosed __ARGS((typval_T *argvars, typval_T *rettv)); -static void f_foldclosedend __ARGS((typval_T *argvars, typval_T *rettv)); -static void f_foldlevel __ARGS((typval_T *argvars, typval_T *rettv)); -static void f_foldtext __ARGS((typval_T *argvars, typval_T *rettv)); -static void f_foldtextresult __ARGS((typval_T *argvars, typval_T *rettv)); -static void f_foreground __ARGS((typval_T *argvars, typval_T *rettv)); -static void f_function __ARGS((typval_T *argvars, typval_T *rettv)); -static void f_garbagecollect __ARGS((typval_T *argvars, typval_T *rettv)); -static void f_get __ARGS((typval_T *argvars, typval_T *rettv)); -static void f_getbufline __ARGS((typval_T *argvars, typval_T *rettv)); -static void f_getbufvar __ARGS((typval_T *argvars, typval_T *rettv)); -static void f_getchar __ARGS((typval_T *argvars, typval_T *rettv)); -static void f_getcharmod __ARGS((typval_T *argvars, typval_T *rettv)); -static void f_getcharsearch __ARGS((typval_T *argvars, typval_T *rettv)); -static void f_getcmdline __ARGS((typval_T *argvars, typval_T *rettv)); -static void f_getcmdpos __ARGS((typval_T *argvars, typval_T *rettv)); -static void f_getcmdtype __ARGS((typval_T *argvars, typval_T *rettv)); -static void f_getcmdwintype __ARGS((typval_T *argvars, typval_T *rettv)); -static void f_getcwd __ARGS((typval_T *argvars, typval_T *rettv)); -static void f_getfontname __ARGS((typval_T *argvars, typval_T *rettv)); -static void f_getfperm __ARGS((typval_T *argvars, typval_T *rettv)); -static void f_getfsize __ARGS((typval_T *argvars, typval_T *rettv)); -static void f_getftime __ARGS((typval_T *argvars, typval_T *rettv)); -static void f_getftype __ARGS((typval_T *argvars, typval_T *rettv)); -static void f_getline __ARGS((typval_T *argvars, typval_T *rettv)); -static void f_getmatches __ARGS((typval_T *argvars, typval_T *rettv)); -static void f_getpid __ARGS((typval_T *argvars, typval_T *rettv)); -static void f_getcurpos __ARGS((typval_T *argvars, typval_T *rettv)); -static void f_getpos __ARGS((typval_T *argvars, typval_T *rettv)); -static void f_getqflist __ARGS((typval_T *argvars, typval_T *rettv)); -static void f_getreg __ARGS((typval_T *argvars, typval_T *rettv)); -static void f_getregtype __ARGS((typval_T *argvars, typval_T *rettv)); -static void f_gettabvar __ARGS((typval_T *argvars, typval_T *rettv)); -static void f_gettabwinvar __ARGS((typval_T *argvars, typval_T *rettv)); -static void f_getwinposx __ARGS((typval_T *argvars, typval_T *rettv)); -static void f_getwinposy __ARGS((typval_T *argvars, typval_T *rettv)); -static void f_getwinvar __ARGS((typval_T *argvars, typval_T *rettv)); -static void f_glob __ARGS((typval_T *argvars, typval_T *rettv)); -static void f_globpath __ARGS((typval_T *argvars, typval_T *rettv)); -static void f_glob2regpat __ARGS((typval_T *argvars, typval_T *rettv)); -static void f_has __ARGS((typval_T *argvars, typval_T *rettv)); -static void f_has_key __ARGS((typval_T *argvars, typval_T *rettv)); -static void f_haslocaldir __ARGS((typval_T *argvars, typval_T *rettv)); -static void f_hasmapto __ARGS((typval_T *argvars, typval_T *rettv)); -static void f_histadd __ARGS((typval_T *argvars, typval_T *rettv)); -static void f_histdel __ARGS((typval_T *argvars, typval_T *rettv)); -static void f_histget __ARGS((typval_T *argvars, typval_T *rettv)); -static void f_histnr __ARGS((typval_T *argvars, typval_T *rettv)); -static void f_hlID __ARGS((typval_T *argvars, typval_T *rettv)); -static void f_hlexists __ARGS((typval_T *argvars, typval_T *rettv)); -static void f_hostname __ARGS((typval_T *argvars, typval_T *rettv)); -static void f_iconv __ARGS((typval_T *argvars, typval_T *rettv)); -static void f_indent __ARGS((typval_T *argvars, typval_T *rettv)); -static void f_index __ARGS((typval_T *argvars, typval_T *rettv)); -static void f_input __ARGS((typval_T *argvars, typval_T *rettv)); -static void f_inputdialog __ARGS((typval_T *argvars, typval_T *rettv)); -static void f_inputlist __ARGS((typval_T *argvars, typval_T *rettv)); -static void f_inputrestore __ARGS((typval_T *argvars, typval_T *rettv)); -static void f_inputsave __ARGS((typval_T *argvars, typval_T *rettv)); -static void f_inputsecret __ARGS((typval_T *argvars, typval_T *rettv)); -static void f_insert __ARGS((typval_T *argvars, typval_T *rettv)); -static void f_invert __ARGS((typval_T *argvars, typval_T *rettv)); -static void f_isdirectory __ARGS((typval_T *argvars, typval_T *rettv)); -static void f_islocked __ARGS((typval_T *argvars, typval_T *rettv)); -static void f_items __ARGS((typval_T *argvars, typval_T *rettv)); -static void f_join __ARGS((typval_T *argvars, typval_T *rettv)); -static void f_jsondecode __ARGS((typval_T *argvars, typval_T *rettv)); -static void f_jsonencode __ARGS((typval_T *argvars, typval_T *rettv)); -static void f_keys __ARGS((typval_T *argvars, typval_T *rettv)); -static void f_last_buffer_nr __ARGS((typval_T *argvars, typval_T *rettv)); -static void f_len __ARGS((typval_T *argvars, typval_T *rettv)); -static void f_libcall __ARGS((typval_T *argvars, typval_T *rettv)); -static void f_libcallnr __ARGS((typval_T *argvars, typval_T *rettv)); -static void f_line __ARGS((typval_T *argvars, typval_T *rettv)); -static void f_line2byte __ARGS((typval_T *argvars, typval_T *rettv)); -static void f_lispindent __ARGS((typval_T *argvars, typval_T *rettv)); -static void f_localtime __ARGS((typval_T *argvars, typval_T *rettv)); +static void f_fnameescape(typval_T *argvars, typval_T *rettv); +static void f_fnamemodify(typval_T *argvars, typval_T *rettv); +static void f_foldclosed(typval_T *argvars, typval_T *rettv); +static void f_foldclosedend(typval_T *argvars, typval_T *rettv); +static void f_foldlevel(typval_T *argvars, typval_T *rettv); +static void f_foldtext(typval_T *argvars, typval_T *rettv); +static void f_foldtextresult(typval_T *argvars, typval_T *rettv); +static void f_foreground(typval_T *argvars, typval_T *rettv); +static void f_function(typval_T *argvars, typval_T *rettv); +static void f_garbagecollect(typval_T *argvars, typval_T *rettv); +static void f_get(typval_T *argvars, typval_T *rettv); +static void f_getbufline(typval_T *argvars, typval_T *rettv); +static void f_getbufvar(typval_T *argvars, typval_T *rettv); +static void f_getchar(typval_T *argvars, typval_T *rettv); +static void f_getcharmod(typval_T *argvars, typval_T *rettv); +static void f_getcharsearch(typval_T *argvars, typval_T *rettv); +static void f_getcmdline(typval_T *argvars, typval_T *rettv); +static void f_getcmdpos(typval_T *argvars, typval_T *rettv); +static void f_getcmdtype(typval_T *argvars, typval_T *rettv); +static void f_getcmdwintype(typval_T *argvars, typval_T *rettv); +static void f_getcwd(typval_T *argvars, typval_T *rettv); +static void f_getfontname(typval_T *argvars, typval_T *rettv); +static void f_getfperm(typval_T *argvars, typval_T *rettv); +static void f_getfsize(typval_T *argvars, typval_T *rettv); +static void f_getftime(typval_T *argvars, typval_T *rettv); +static void f_getftype(typval_T *argvars, typval_T *rettv); +static void f_getline(typval_T *argvars, typval_T *rettv); +static void f_getmatches(typval_T *argvars, typval_T *rettv); +static void f_getpid(typval_T *argvars, typval_T *rettv); +static void f_getcurpos(typval_T *argvars, typval_T *rettv); +static void f_getpos(typval_T *argvars, typval_T *rettv); +static void f_getqflist(typval_T *argvars, typval_T *rettv); +static void f_getreg(typval_T *argvars, typval_T *rettv); +static void f_getregtype(typval_T *argvars, typval_T *rettv); +static void f_gettabvar(typval_T *argvars, typval_T *rettv); +static void f_gettabwinvar(typval_T *argvars, typval_T *rettv); +static void f_getwinposx(typval_T *argvars, typval_T *rettv); +static void f_getwinposy(typval_T *argvars, typval_T *rettv); +static void f_getwinvar(typval_T *argvars, typval_T *rettv); +static void f_glob(typval_T *argvars, typval_T *rettv); +static void f_globpath(typval_T *argvars, typval_T *rettv); +static void f_glob2regpat(typval_T *argvars, typval_T *rettv); +static void f_has(typval_T *argvars, typval_T *rettv); +static void f_has_key(typval_T *argvars, typval_T *rettv); +static void f_haslocaldir(typval_T *argvars, typval_T *rettv); +static void f_hasmapto(typval_T *argvars, typval_T *rettv); +static void f_histadd(typval_T *argvars, typval_T *rettv); +static void f_histdel(typval_T *argvars, typval_T *rettv); +static void f_histget(typval_T *argvars, typval_T *rettv); +static void f_histnr(typval_T *argvars, typval_T *rettv); +static void f_hlID(typval_T *argvars, typval_T *rettv); +static void f_hlexists(typval_T *argvars, typval_T *rettv); +static void f_hostname(typval_T *argvars, typval_T *rettv); +static void f_iconv(typval_T *argvars, typval_T *rettv); +static void f_indent(typval_T *argvars, typval_T *rettv); +static void f_index(typval_T *argvars, typval_T *rettv); +static void f_input(typval_T *argvars, typval_T *rettv); +static void f_inputdialog(typval_T *argvars, typval_T *rettv); +static void f_inputlist(typval_T *argvars, typval_T *rettv); +static void f_inputrestore(typval_T *argvars, typval_T *rettv); +static void f_inputsave(typval_T *argvars, typval_T *rettv); +static void f_inputsecret(typval_T *argvars, typval_T *rettv); +static void f_insert(typval_T *argvars, typval_T *rettv); +static void f_invert(typval_T *argvars, typval_T *rettv); +static void f_isdirectory(typval_T *argvars, typval_T *rettv); +static void f_islocked(typval_T *argvars, typval_T *rettv); +static void f_items(typval_T *argvars, typval_T *rettv); +static void f_join(typval_T *argvars, typval_T *rettv); +static void f_jsondecode(typval_T *argvars, typval_T *rettv); +static void f_jsonencode(typval_T *argvars, typval_T *rettv); +static void f_keys(typval_T *argvars, typval_T *rettv); +static void f_last_buffer_nr(typval_T *argvars, typval_T *rettv); +static void f_len(typval_T *argvars, typval_T *rettv); +static void f_libcall(typval_T *argvars, typval_T *rettv); +static void f_libcallnr(typval_T *argvars, typval_T *rettv); +static void f_line(typval_T *argvars, typval_T *rettv); +static void f_line2byte(typval_T *argvars, typval_T *rettv); +static void f_lispindent(typval_T *argvars, typval_T *rettv); +static void f_localtime(typval_T *argvars, typval_T *rettv); #ifdef FEAT_FLOAT -static void f_log __ARGS((typval_T *argvars, typval_T *rettv)); -static void f_log10 __ARGS((typval_T *argvars, typval_T *rettv)); +static void f_log(typval_T *argvars, typval_T *rettv); +static void f_log10(typval_T *argvars, typval_T *rettv); #endif #ifdef FEAT_LUA -static void f_luaeval __ARGS((typval_T *argvars, typval_T *rettv)); +static void f_luaeval(typval_T *argvars, typval_T *rettv); #endif -static void f_map __ARGS((typval_T *argvars, typval_T *rettv)); -static void f_maparg __ARGS((typval_T *argvars, typval_T *rettv)); -static void f_mapcheck __ARGS((typval_T *argvars, typval_T *rettv)); -static void f_match __ARGS((typval_T *argvars, typval_T *rettv)); -static void f_matchadd __ARGS((typval_T *argvars, typval_T *rettv)); -static void f_matchaddpos __ARGS((typval_T *argvars, typval_T *rettv)); -static void f_matcharg __ARGS((typval_T *argvars, typval_T *rettv)); -static void f_matchdelete __ARGS((typval_T *argvars, typval_T *rettv)); -static void f_matchend __ARGS((typval_T *argvars, typval_T *rettv)); -static void f_matchlist __ARGS((typval_T *argvars, typval_T *rettv)); -static void f_matchstr __ARGS((typval_T *argvars, typval_T *rettv)); -static void f_max __ARGS((typval_T *argvars, typval_T *rettv)); -static void f_min __ARGS((typval_T *argvars, typval_T *rettv)); +static void f_map(typval_T *argvars, typval_T *rettv); +static void f_maparg(typval_T *argvars, typval_T *rettv); +static void f_mapcheck(typval_T *argvars, typval_T *rettv); +static void f_match(typval_T *argvars, typval_T *rettv); +static void f_matchadd(typval_T *argvars, typval_T *rettv); +static void f_matchaddpos(typval_T *argvars, typval_T *rettv); +static void f_matcharg(typval_T *argvars, typval_T *rettv); +static void f_matchdelete(typval_T *argvars, typval_T *rettv); +static void f_matchend(typval_T *argvars, typval_T *rettv); +static void f_matchlist(typval_T *argvars, typval_T *rettv); +static void f_matchstr(typval_T *argvars, typval_T *rettv); +static void f_max(typval_T *argvars, typval_T *rettv); +static void f_min(typval_T *argvars, typval_T *rettv); #ifdef vim_mkdir -static void f_mkdir __ARGS((typval_T *argvars, typval_T *rettv)); +static void f_mkdir(typval_T *argvars, typval_T *rettv); #endif -static void f_mode __ARGS((typval_T *argvars, typval_T *rettv)); +static void f_mode(typval_T *argvars, typval_T *rettv); #ifdef FEAT_MZSCHEME -static void f_mzeval __ARGS((typval_T *argvars, typval_T *rettv)); +static void f_mzeval(typval_T *argvars, typval_T *rettv); #endif -static void f_nextnonblank __ARGS((typval_T *argvars, typval_T *rettv)); -static void f_nr2char __ARGS((typval_T *argvars, typval_T *rettv)); -static void f_or __ARGS((typval_T *argvars, typval_T *rettv)); -static void f_pathshorten __ARGS((typval_T *argvars, typval_T *rettv)); +static void f_nextnonblank(typval_T *argvars, typval_T *rettv); +static void f_nr2char(typval_T *argvars, typval_T *rettv); +static void f_or(typval_T *argvars, typval_T *rettv); +static void f_pathshorten(typval_T *argvars, typval_T *rettv); #ifdef FEAT_PERL -static void f_perleval __ARGS((typval_T *argvars, typval_T *rettv)); +static void f_perleval(typval_T *argvars, typval_T *rettv); #endif #ifdef FEAT_FLOAT -static void f_pow __ARGS((typval_T *argvars, typval_T *rettv)); +static void f_pow(typval_T *argvars, typval_T *rettv); #endif -static void f_prevnonblank __ARGS((typval_T *argvars, typval_T *rettv)); -static void f_printf __ARGS((typval_T *argvars, typval_T *rettv)); -static void f_pumvisible __ARGS((typval_T *argvars, typval_T *rettv)); +static void f_prevnonblank(typval_T *argvars, typval_T *rettv); +static void f_printf(typval_T *argvars, typval_T *rettv); +static void f_pumvisible(typval_T *argvars, typval_T *rettv); #ifdef FEAT_PYTHON3 -static void f_py3eval __ARGS((typval_T *argvars, typval_T *rettv)); +static void f_py3eval(typval_T *argvars, typval_T *rettv); #endif #ifdef FEAT_PYTHON -static void f_pyeval __ARGS((typval_T *argvars, typval_T *rettv)); +static void f_pyeval(typval_T *argvars, typval_T *rettv); #endif -static void f_range __ARGS((typval_T *argvars, typval_T *rettv)); -static void f_readfile __ARGS((typval_T *argvars, typval_T *rettv)); -static void f_reltime __ARGS((typval_T *argvars, typval_T *rettv)); -static void f_reltimestr __ARGS((typval_T *argvars, typval_T *rettv)); -static void f_remote_expr __ARGS((typval_T *argvars, typval_T *rettv)); -static void f_remote_foreground __ARGS((typval_T *argvars, typval_T *rettv)); -static void f_remote_peek __ARGS((typval_T *argvars, typval_T *rettv)); -static void f_remote_read __ARGS((typval_T *argvars, typval_T *rettv)); -static void f_remote_send __ARGS((typval_T *argvars, typval_T *rettv)); -static void f_remove __ARGS((typval_T *argvars, typval_T *rettv)); -static void f_rename __ARGS((typval_T *argvars, typval_T *rettv)); -static void f_repeat __ARGS((typval_T *argvars, typval_T *rettv)); -static void f_resolve __ARGS((typval_T *argvars, typval_T *rettv)); -static void f_reverse __ARGS((typval_T *argvars, typval_T *rettv)); +static void f_range(typval_T *argvars, typval_T *rettv); +static void f_readfile(typval_T *argvars, typval_T *rettv); +static void f_reltime(typval_T *argvars, typval_T *rettv); +static void f_reltimestr(typval_T *argvars, typval_T *rettv); +static void f_remote_expr(typval_T *argvars, typval_T *rettv); +static void f_remote_foreground(typval_T *argvars, typval_T *rettv); +static void f_remote_peek(typval_T *argvars, typval_T *rettv); +static void f_remote_read(typval_T *argvars, typval_T *rettv); +static void f_remote_send(typval_T *argvars, typval_T *rettv); +static void f_remove(typval_T *argvars, typval_T *rettv); +static void f_rename(typval_T *argvars, typval_T *rettv); +static void f_repeat(typval_T *argvars, typval_T *rettv); +static void f_resolve(typval_T *argvars, typval_T *rettv); +static void f_reverse(typval_T *argvars, typval_T *rettv); #ifdef FEAT_FLOAT -static void f_round __ARGS((typval_T *argvars, typval_T *rettv)); +static void f_round(typval_T *argvars, typval_T *rettv); #endif -static void f_screenattr __ARGS((typval_T *argvars, typval_T *rettv)); -static void f_screenchar __ARGS((typval_T *argvars, typval_T *rettv)); -static void f_screencol __ARGS((typval_T *argvars, typval_T *rettv)); -static void f_screenrow __ARGS((typval_T *argvars, typval_T *rettv)); -static void f_search __ARGS((typval_T *argvars, typval_T *rettv)); -static void f_searchdecl __ARGS((typval_T *argvars, typval_T *rettv)); -static void f_searchpair __ARGS((typval_T *argvars, typval_T *rettv)); -static void f_searchpairpos __ARGS((typval_T *argvars, typval_T *rettv)); -static void f_searchpos __ARGS((typval_T *argvars, typval_T *rettv)); -static void f_server2client __ARGS((typval_T *argvars, typval_T *rettv)); -static void f_serverlist __ARGS((typval_T *argvars, typval_T *rettv)); -static void f_setbufvar __ARGS((typval_T *argvars, typval_T *rettv)); -static void f_setcharsearch __ARGS((typval_T *argvars, typval_T *rettv)); -static void f_setcmdpos __ARGS((typval_T *argvars, typval_T *rettv)); -static void f_setline __ARGS((typval_T *argvars, typval_T *rettv)); -static void f_setloclist __ARGS((typval_T *argvars, typval_T *rettv)); -static void f_setmatches __ARGS((typval_T *argvars, typval_T *rettv)); -static void f_setpos __ARGS((typval_T *argvars, typval_T *rettv)); -static void f_setqflist __ARGS((typval_T *argvars, typval_T *rettv)); -static void f_setreg __ARGS((typval_T *argvars, typval_T *rettv)); -static void f_settabvar __ARGS((typval_T *argvars, typval_T *rettv)); -static void f_settabwinvar __ARGS((typval_T *argvars, typval_T *rettv)); -static void f_setwinvar __ARGS((typval_T *argvars, typval_T *rettv)); +static void f_screenattr(typval_T *argvars, typval_T *rettv); +static void f_screenchar(typval_T *argvars, typval_T *rettv); +static void f_screencol(typval_T *argvars, typval_T *rettv); +static void f_screenrow(typval_T *argvars, typval_T *rettv); +static void f_search(typval_T *argvars, typval_T *rettv); +static void f_searchdecl(typval_T *argvars, typval_T *rettv); +static void f_searchpair(typval_T *argvars, typval_T *rettv); +static void f_searchpairpos(typval_T *argvars, typval_T *rettv); +static void f_searchpos(typval_T *argvars, typval_T *rettv); +static void f_server2client(typval_T *argvars, typval_T *rettv); +static void f_serverlist(typval_T *argvars, typval_T *rettv); +static void f_setbufvar(typval_T *argvars, typval_T *rettv); +static void f_setcharsearch(typval_T *argvars, typval_T *rettv); +static void f_setcmdpos(typval_T *argvars, typval_T *rettv); +static void f_setline(typval_T *argvars, typval_T *rettv); +static void f_setloclist(typval_T *argvars, typval_T *rettv); +static void f_setmatches(typval_T *argvars, typval_T *rettv); +static void f_setpos(typval_T *argvars, typval_T *rettv); +static void f_setqflist(typval_T *argvars, typval_T *rettv); +static void f_setreg(typval_T *argvars, typval_T *rettv); +static void f_settabvar(typval_T *argvars, typval_T *rettv); +static void f_settabwinvar(typval_T *argvars, typval_T *rettv); +static void f_setwinvar(typval_T *argvars, typval_T *rettv); #ifdef FEAT_CRYPT -static void f_sha256 __ARGS((typval_T *argvars, typval_T *rettv)); +static void f_sha256(typval_T *argvars, typval_T *rettv); #endif /* FEAT_CRYPT */ -static void f_shellescape __ARGS((typval_T *argvars, typval_T *rettv)); -static void f_shiftwidth __ARGS((typval_T *argvars, typval_T *rettv)); -static void f_simplify __ARGS((typval_T *argvars, typval_T *rettv)); +static void f_shellescape(typval_T *argvars, typval_T *rettv); +static void f_shiftwidth(typval_T *argvars, typval_T *rettv); +static void f_simplify(typval_T *argvars, typval_T *rettv); #ifdef FEAT_FLOAT -static void f_sin __ARGS((typval_T *argvars, typval_T *rettv)); -static void f_sinh __ARGS((typval_T *argvars, typval_T *rettv)); +static void f_sin(typval_T *argvars, typval_T *rettv); +static void f_sinh(typval_T *argvars, typval_T *rettv); #endif -static void f_sort __ARGS((typval_T *argvars, typval_T *rettv)); -static void f_soundfold __ARGS((typval_T *argvars, typval_T *rettv)); -static void f_spellbadword __ARGS((typval_T *argvars, typval_T *rettv)); -static void f_spellsuggest __ARGS((typval_T *argvars, typval_T *rettv)); -static void f_split __ARGS((typval_T *argvars, typval_T *rettv)); +static void f_sort(typval_T *argvars, typval_T *rettv); +static void f_soundfold(typval_T *argvars, typval_T *rettv); +static void f_spellbadword(typval_T *argvars, typval_T *rettv); +static void f_spellsuggest(typval_T *argvars, typval_T *rettv); +static void f_split(typval_T *argvars, typval_T *rettv); #ifdef FEAT_FLOAT -static void f_sqrt __ARGS((typval_T *argvars, typval_T *rettv)); -static void f_str2float __ARGS((typval_T *argvars, typval_T *rettv)); +static void f_sqrt(typval_T *argvars, typval_T *rettv); +static void f_str2float(typval_T *argvars, typval_T *rettv); #endif -static void f_str2nr __ARGS((typval_T *argvars, typval_T *rettv)); -static void f_strchars __ARGS((typval_T *argvars, typval_T *rettv)); +static void f_str2nr(typval_T *argvars, typval_T *rettv); +static void f_strchars(typval_T *argvars, typval_T *rettv); #ifdef HAVE_STRFTIME -static void f_strftime __ARGS((typval_T *argvars, typval_T *rettv)); +static void f_strftime(typval_T *argvars, typval_T *rettv); #endif -static void f_stridx __ARGS((typval_T *argvars, typval_T *rettv)); -static void f_string __ARGS((typval_T *argvars, typval_T *rettv)); -static void f_strlen __ARGS((typval_T *argvars, typval_T *rettv)); -static void f_strpart __ARGS((typval_T *argvars, typval_T *rettv)); -static void f_strridx __ARGS((typval_T *argvars, typval_T *rettv)); -static void f_strtrans __ARGS((typval_T *argvars, typval_T *rettv)); -static void f_strdisplaywidth __ARGS((typval_T *argvars, typval_T *rettv)); -static void f_strwidth __ARGS((typval_T *argvars, typval_T *rettv)); -static void f_submatch __ARGS((typval_T *argvars, typval_T *rettv)); -static void f_substitute __ARGS((typval_T *argvars, typval_T *rettv)); -static void f_synID __ARGS((typval_T *argvars, typval_T *rettv)); -static void f_synIDattr __ARGS((typval_T *argvars, typval_T *rettv)); -static void f_synIDtrans __ARGS((typval_T *argvars, typval_T *rettv)); -static void f_synstack __ARGS((typval_T *argvars, typval_T *rettv)); -static void f_synconcealed __ARGS((typval_T *argvars, typval_T *rettv)); -static void f_system __ARGS((typval_T *argvars, typval_T *rettv)); -static void f_systemlist __ARGS((typval_T *argvars, typval_T *rettv)); -static void f_tabpagebuflist __ARGS((typval_T *argvars, typval_T *rettv)); -static void f_tabpagenr __ARGS((typval_T *argvars, typval_T *rettv)); -static void f_tabpagewinnr __ARGS((typval_T *argvars, typval_T *rettv)); -static void f_taglist __ARGS((typval_T *argvars, typval_T *rettv)); -static void f_tagfiles __ARGS((typval_T *argvars, typval_T *rettv)); -static void f_tempname __ARGS((typval_T *argvars, typval_T *rettv)); -static void f_test __ARGS((typval_T *argvars, typval_T *rettv)); +static void f_stridx(typval_T *argvars, typval_T *rettv); +static void f_string(typval_T *argvars, typval_T *rettv); +static void f_strlen(typval_T *argvars, typval_T *rettv); +static void f_strpart(typval_T *argvars, typval_T *rettv); +static void f_strridx(typval_T *argvars, typval_T *rettv); +static void f_strtrans(typval_T *argvars, typval_T *rettv); +static void f_strdisplaywidth(typval_T *argvars, typval_T *rettv); +static void f_strwidth(typval_T *argvars, typval_T *rettv); +static void f_submatch(typval_T *argvars, typval_T *rettv); +static void f_substitute(typval_T *argvars, typval_T *rettv); +static void f_synID(typval_T *argvars, typval_T *rettv); +static void f_synIDattr(typval_T *argvars, typval_T *rettv); +static void f_synIDtrans(typval_T *argvars, typval_T *rettv); +static void f_synstack(typval_T *argvars, typval_T *rettv); +static void f_synconcealed(typval_T *argvars, typval_T *rettv); +static void f_system(typval_T *argvars, typval_T *rettv); +static void f_systemlist(typval_T *argvars, typval_T *rettv); +static void f_tabpagebuflist(typval_T *argvars, typval_T *rettv); +static void f_tabpagenr(typval_T *argvars, typval_T *rettv); +static void f_tabpagewinnr(typval_T *argvars, typval_T *rettv); +static void f_taglist(typval_T *argvars, typval_T *rettv); +static void f_tagfiles(typval_T *argvars, typval_T *rettv); +static void f_tempname(typval_T *argvars, typval_T *rettv); +static void f_test(typval_T *argvars, typval_T *rettv); #ifdef FEAT_FLOAT -static void f_tan __ARGS((typval_T *argvars, typval_T *rettv)); -static void f_tanh __ARGS((typval_T *argvars, typval_T *rettv)); +static void f_tan(typval_T *argvars, typval_T *rettv); +static void f_tanh(typval_T *argvars, typval_T *rettv); #endif -static void f_tolower __ARGS((typval_T *argvars, typval_T *rettv)); -static void f_toupper __ARGS((typval_T *argvars, typval_T *rettv)); -static void f_tr __ARGS((typval_T *argvars, typval_T *rettv)); +static void f_tolower(typval_T *argvars, typval_T *rettv); +static void f_toupper(typval_T *argvars, typval_T *rettv); +static void f_tr(typval_T *argvars, typval_T *rettv); #ifdef FEAT_FLOAT -static void f_trunc __ARGS((typval_T *argvars, typval_T *rettv)); +static void f_trunc(typval_T *argvars, typval_T *rettv); #endif -static void f_type __ARGS((typval_T *argvars, typval_T *rettv)); -static void f_undofile __ARGS((typval_T *argvars, typval_T *rettv)); -static void f_undotree __ARGS((typval_T *argvars, typval_T *rettv)); -static void f_uniq __ARGS((typval_T *argvars, typval_T *rettv)); -static void f_values __ARGS((typval_T *argvars, typval_T *rettv)); -static void f_virtcol __ARGS((typval_T *argvars, typval_T *rettv)); -static void f_visualmode __ARGS((typval_T *argvars, typval_T *rettv)); -static void f_wildmenumode __ARGS((typval_T *argvars, typval_T *rettv)); -static void f_winbufnr __ARGS((typval_T *argvars, typval_T *rettv)); -static void f_wincol __ARGS((typval_T *argvars, typval_T *rettv)); -static void f_winheight __ARGS((typval_T *argvars, typval_T *rettv)); -static void f_winline __ARGS((typval_T *argvars, typval_T *rettv)); -static void f_winnr __ARGS((typval_T *argvars, typval_T *rettv)); -static void f_winrestcmd __ARGS((typval_T *argvars, typval_T *rettv)); -static void f_winrestview __ARGS((typval_T *argvars, typval_T *rettv)); -static void f_winsaveview __ARGS((typval_T *argvars, typval_T *rettv)); -static void f_winwidth __ARGS((typval_T *argvars, typval_T *rettv)); -static void f_writefile __ARGS((typval_T *argvars, typval_T *rettv)); -static void f_wordcount __ARGS((typval_T *argvars, typval_T *rettv)); -static void f_xor __ARGS((typval_T *argvars, typval_T *rettv)); +static void f_type(typval_T *argvars, typval_T *rettv); +static void f_undofile(typval_T *argvars, typval_T *rettv); +static void f_undotree(typval_T *argvars, typval_T *rettv); +static void f_uniq(typval_T *argvars, typval_T *rettv); +static void f_values(typval_T *argvars, typval_T *rettv); +static void f_virtcol(typval_T *argvars, typval_T *rettv); +static void f_visualmode(typval_T *argvars, typval_T *rettv); +static void f_wildmenumode(typval_T *argvars, typval_T *rettv); +static void f_winbufnr(typval_T *argvars, typval_T *rettv); +static void f_wincol(typval_T *argvars, typval_T *rettv); +static void f_winheight(typval_T *argvars, typval_T *rettv); +static void f_winline(typval_T *argvars, typval_T *rettv); +static void f_winnr(typval_T *argvars, typval_T *rettv); +static void f_winrestcmd(typval_T *argvars, typval_T *rettv); +static void f_winrestview(typval_T *argvars, typval_T *rettv); +static void f_winsaveview(typval_T *argvars, typval_T *rettv); +static void f_winwidth(typval_T *argvars, typval_T *rettv); +static void f_writefile(typval_T *argvars, typval_T *rettv); +static void f_wordcount(typval_T *argvars, typval_T *rettv); +static void f_xor(typval_T *argvars, typval_T *rettv); -static int list2fpos __ARGS((typval_T *arg, pos_T *posp, int *fnump, colnr_T *curswantp)); -static pos_T *var2fpos __ARGS((typval_T *varp, int dollar_lnum, int *fnum)); -static int get_env_len __ARGS((char_u **arg)); -static int get_id_len __ARGS((char_u **arg)); -static int get_name_len __ARGS((char_u **arg, char_u **alias, int evaluate, int verbose)); -static char_u *find_name_end __ARGS((char_u *arg, char_u **expr_start, char_u **expr_end, int flags)); +static int list2fpos(typval_T *arg, pos_T *posp, int *fnump, colnr_T *curswantp); +static pos_T *var2fpos(typval_T *varp, int dollar_lnum, int *fnum); +static int get_env_len(char_u **arg); +static int get_id_len(char_u **arg); +static int get_name_len(char_u **arg, char_u **alias, int evaluate, int verbose); +static char_u *find_name_end(char_u *arg, char_u **expr_start, char_u **expr_end, int flags); #define FNE_INCL_BR 1 /* find_name_end(): include [] in name */ #define FNE_CHECK_START 2 /* find_name_end(): check name starts with valid character */ -static char_u * make_expanded_name __ARGS((char_u *in_start, char_u *expr_start, char_u *expr_end, char_u *in_end)); -static int eval_isnamec __ARGS((int c)); -static int eval_isnamec1 __ARGS((int c)); -static int get_var_tv __ARGS((char_u *name, int len, typval_T *rettv, dictitem_T **dip, int verbose, int no_autoload)); -static int handle_subscript __ARGS((char_u **arg, typval_T *rettv, int evaluate, int verbose)); -static typval_T *alloc_tv __ARGS((void)); -static typval_T *alloc_string_tv __ARGS((char_u *string)); -static void init_tv __ARGS((typval_T *varp)); -static long get_tv_number __ARGS((typval_T *varp)); +static char_u * make_expanded_name(char_u *in_start, char_u *expr_start, char_u *expr_end, char_u *in_end); +static int eval_isnamec(int c); +static int eval_isnamec1(int c); +static int get_var_tv(char_u *name, int len, typval_T *rettv, dictitem_T **dip, int verbose, int no_autoload); +static int handle_subscript(char_u **arg, typval_T *rettv, int evaluate, int verbose); +static typval_T *alloc_tv(void); +static typval_T *alloc_string_tv(char_u *string); +static void init_tv(typval_T *varp); +static long get_tv_number(typval_T *varp); #ifdef FEAT_FLOAT static float_T get_tv_float(typval_T *varp); #endif -static linenr_T get_tv_lnum __ARGS((typval_T *argvars)); -static linenr_T get_tv_lnum_buf __ARGS((typval_T *argvars, buf_T *buf)); -static char_u *get_tv_string __ARGS((typval_T *varp)); -static char_u *get_tv_string_buf __ARGS((typval_T *varp, char_u *buf)); -static dictitem_T *find_var __ARGS((char_u *name, hashtab_T **htp, int no_autoload)); -static dictitem_T *find_var_in_ht __ARGS((hashtab_T *ht, int htname, char_u *varname, int no_autoload)); -static hashtab_T *find_var_ht __ARGS((char_u *name, char_u **varname)); -static funccall_T *get_funccal __ARGS((void)); -static void vars_clear_ext __ARGS((hashtab_T *ht, int free_val)); -static void delete_var __ARGS((hashtab_T *ht, hashitem_T *hi)); -static void list_one_var __ARGS((dictitem_T *v, char_u *prefix, int *first)); -static void list_one_var_a __ARGS((char_u *prefix, char_u *name, int type, char_u *string, int *first)); -static void set_var __ARGS((char_u *name, typval_T *varp, int copy)); -static int var_check_ro __ARGS((int flags, char_u *name, int use_gettext)); -static int var_check_fixed __ARGS((int flags, char_u *name, int use_gettext)); -static int var_check_func_name __ARGS((char_u *name, int new_var)); -static int valid_varname __ARGS((char_u *varname)); -static int tv_check_lock __ARGS((int lock, char_u *name, int use_gettext)); -static int item_copy __ARGS((typval_T *from, typval_T *to, int deep, int copyID)); -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 flags, funcdict_T *fd)); -static int eval_fname_script __ARGS((char_u *p)); -static int eval_fname_sid __ARGS((char_u *p)); -static void list_func_head __ARGS((ufunc_T *fp, int indent)); -static ufunc_T *find_func __ARGS((char_u *name)); -static int function_exists __ARGS((char_u *name)); -static int builtin_function __ARGS((char_u *name, int len)); +static linenr_T get_tv_lnum(typval_T *argvars); +static linenr_T get_tv_lnum_buf(typval_T *argvars, buf_T *buf); +static char_u *get_tv_string(typval_T *varp); +static char_u *get_tv_string_buf(typval_T *varp, char_u *buf); +static dictitem_T *find_var(char_u *name, hashtab_T **htp, int no_autoload); +static dictitem_T *find_var_in_ht(hashtab_T *ht, int htname, char_u *varname, int no_autoload); +static hashtab_T *find_var_ht(char_u *name, char_u **varname); +static funccall_T *get_funccal(void); +static void vars_clear_ext(hashtab_T *ht, int free_val); +static void delete_var(hashtab_T *ht, hashitem_T *hi); +static void list_one_var(dictitem_T *v, char_u *prefix, int *first); +static void list_one_var_a(char_u *prefix, char_u *name, int type, char_u *string, int *first); +static void set_var(char_u *name, typval_T *varp, int copy); +static int var_check_ro(int flags, char_u *name, int use_gettext); +static int var_check_fixed(int flags, char_u *name, int use_gettext); +static int var_check_func_name(char_u *name, int new_var); +static int valid_varname(char_u *varname); +static int tv_check_lock(int lock, char_u *name, int use_gettext); +static int item_copy(typval_T *from, typval_T *to, int deep, int copyID); +static char_u *find_option_end(char_u **arg, int *opt_flags); +static char_u *trans_function_name(char_u **pp, int skip, int flags, funcdict_T *fd); +static int eval_fname_script(char_u *p); +static int eval_fname_sid(char_u *p); +static void list_func_head(ufunc_T *fp, int indent); +static ufunc_T *find_func(char_u *name); +static int function_exists(char_u *name); +static int builtin_function(char_u *name, int len); #ifdef FEAT_PROFILE -static void func_do_profile __ARGS((ufunc_T *fp)); -static void prof_sort_list __ARGS((FILE *fd, ufunc_T **sorttab, int st_len, char *title, int prefer_self)); -static void prof_func_line __ARGS((FILE *fd, int count, proftime_T *total, proftime_T *self, int prefer_self)); +static void func_do_profile(ufunc_T *fp); +static void prof_sort_list(FILE *fd, ufunc_T **sorttab, int st_len, char *title, int prefer_self); +static void prof_func_line(FILE *fd, int count, proftime_T *total, proftime_T *self, int prefer_self); static int # ifdef __BORLANDC__ _RTLENTRYF # endif - prof_total_cmp __ARGS((const void *s1, const void *s2)); + prof_total_cmp(const void *s1, const void *s2); static int # ifdef __BORLANDC__ _RTLENTRYF # endif - prof_self_cmp __ARGS((const void *s1, const void *s2)); + prof_self_cmp(const void *s1, const void *s2); #endif -static int script_autoload __ARGS((char_u *name, int reload)); -static char_u *autoload_name __ARGS((char_u *name)); -static void cat_func_name __ARGS((char_u *buf, ufunc_T *fp)); -static void func_free __ARGS((ufunc_T *fp)); -static void call_user_func __ARGS((ufunc_T *fp, int argcount, typval_T *argvars, typval_T *rettv, linenr_T firstline, linenr_T lastline, dict_T *selfdict)); -static int can_free_funccal __ARGS((funccall_T *fc, int copyID)) ; -static void free_funccal __ARGS((funccall_T *fc, int free_val)); -static void add_nr_var __ARGS((dict_T *dp, dictitem_T *v, char *name, varnumber_T nr)); -static win_T *find_win_by_nr __ARGS((typval_T *vp, tabpage_T *tp)); -static win_T *find_tabwin __ARGS((typval_T *wvp, typval_T *tvp)); -static void getwinvar __ARGS((typval_T *argvars, typval_T *rettv, int off)); -static int searchpair_cmn __ARGS((typval_T *argvars, pos_T *match_pos)); -static int search_cmn __ARGS((typval_T *argvars, pos_T *match_pos, int *flagsp)); -static void setwinvar __ARGS((typval_T *argvars, typval_T *rettv, int off)); -static int write_list __ARGS((FILE *fd, list_T *list, int binary)); -static void get_cmd_output_as_rettv __ARGS((typval_T *argvars, typval_T *rettv, int retlist)); +static int script_autoload(char_u *name, int reload); +static char_u *autoload_name(char_u *name); +static void cat_func_name(char_u *buf, ufunc_T *fp); +static void func_free(ufunc_T *fp); +static void call_user_func(ufunc_T *fp, int argcount, typval_T *argvars, typval_T *rettv, linenr_T firstline, linenr_T lastline, dict_T *selfdict); +static int can_free_funccal(funccall_T *fc, int copyID) ; +static void free_funccal(funccall_T *fc, int free_val); +static void add_nr_var(dict_T *dp, dictitem_T *v, char *name, varnumber_T nr); +static win_T *find_win_by_nr(typval_T *vp, tabpage_T *tp); +static win_T *find_tabwin(typval_T *wvp, typval_T *tvp); +static void getwinvar(typval_T *argvars, typval_T *rettv, int off); +static int searchpair_cmn(typval_T *argvars, pos_T *match_pos); +static int search_cmn(typval_T *argvars, pos_T *match_pos, int *flagsp); +static void setwinvar(typval_T *argvars, typval_T *rettv, int off); +static int write_list(FILE *fd, list_T *list, int binary); +static void get_cmd_output_as_rettv(typval_T *argvars, typval_T *rettv, int retlist); #ifdef EBCDIC -static int compare_func_name __ARGS((const void *s1, const void *s2)); -static void sortFunctions __ARGS(()); +static int compare_func_name(const void *s1, const void *s2); +static void sortFunctions(); #endif /* @@ -3971,7 +3971,7 @@ del_menutrans_vars() * get_user_var_name(). */ -static char_u *cat_prefix_varname __ARGS((int prefix, char_u *name)); +static char_u *cat_prefix_varname(int prefix, char_u *name); static char_u *varnamebuf = NULL; static int varnamebuflen = 0; @@ -8106,7 +8106,7 @@ static struct fst char *f_name; /* function name */ char f_min_argc; /* minimal number of arguments */ char f_max_argc; /* maximal number of arguments */ - void (*f_func) __ARGS((typval_T *args, typval_T *rvar)); + void (*f_func)(typval_T *args, typval_T *rvar); /* implementation of function */ } functions[] = { @@ -8941,7 +8941,7 @@ non_zero_arg(argvars) */ #ifdef FEAT_FLOAT -static int get_float_arg __ARGS((typval_T *argvars, float_T *f)); +static int get_float_arg(typval_T *argvars, float_T *f); /* * Get the float value of "argvars[0]" into "f". @@ -9199,10 +9199,10 @@ f_argv(argvars, rettv) alist_name(&ARGLIST[idx]), -1); } -static void prepare_assert_error __ARGS((garray_T*gap)); -static void fill_assert_error __ARGS((garray_T *gap, typval_T *opt_msg_tv, char_u *exp_str, typval_T *exp_tv, typval_T *got_tv)); -static void assert_error __ARGS((garray_T *gap)); -static void assert_bool __ARGS((typval_T *argvars, int isTrue)); +static void prepare_assert_error(garray_T*gap); +static void fill_assert_error(garray_T *gap, typval_T *opt_msg_tv, char_u *exp_str, typval_T *exp_tv, typval_T *got_tv); +static void assert_error(garray_T *gap); +static void assert_bool(typval_T *argvars, int isTrue); /* * Prepare "gap" for an assert error and add the sourcing position. @@ -9534,7 +9534,7 @@ f_browsedir(argvars, rettv) rettv->v_type = VAR_STRING; } -static buf_T *find_buffer __ARGS((typval_T *avar)); +static buf_T *find_buffer(typval_T *avar); /* * Find a buffer by number or exact name. @@ -9607,7 +9607,7 @@ f_bufloaded(argvars, rettv) rettv->vval.v_number = (buf != NULL && buf->b_ml.ml_mfp != NULL); } -static buf_T *get_buf_tv __ARGS((typval_T *tv, int curtab_only)); +static buf_T *get_buf_tv(typval_T *tv, int curtab_only); /* * Get buffer by number or pattern. @@ -11080,7 +11080,7 @@ f_filewritable(argvars, rettv) rettv->vval.v_number = filewritable(get_tv_string(&argvars[0])); } -static void findfilendir __ARGS((typval_T *argvars, typval_T *rettv, int find_what)); +static void findfilendir(typval_T *argvars, typval_T *rettv, int find_what); static void findfilendir(argvars, rettv, find_what) @@ -11149,8 +11149,8 @@ findfilendir(argvars, rettv, find_what) #endif } -static void filter_map __ARGS((typval_T *argvars, typval_T *rettv, int map)); -static int filter_map_one __ARGS((typval_T *tv, char_u *expr, int map, int *remp)); +static void filter_map(typval_T *argvars, typval_T *rettv, int map); +static int filter_map_one(typval_T *tv, char_u *expr, int map, int *remp); /* * Implementation of map() and filter(). @@ -11458,7 +11458,7 @@ f_fnamemodify(argvars, rettv) vim_free(fbuf); } -static void foldclosed_both __ARGS((typval_T *argvars, typval_T *rettv, int end)); +static void foldclosed_both(typval_T *argvars, typval_T *rettv, int end); /* * "foldclosed()" function @@ -11752,7 +11752,7 @@ f_get(argvars, rettv) copy_tv(tv, rettv); } -static void get_buffer_lines __ARGS((buf_T *buf, linenr_T start, linenr_T end, int retlist, typval_T *rettv)); +static void get_buffer_lines(buf_T *buf, linenr_T start, linenr_T end, int retlist, typval_T *rettv); /* * Get line or list of lines from buffer "buf" into "rettv". @@ -12428,7 +12428,7 @@ f_getpid(argvars, rettv) rettv->vval.v_number = mch_get_pid(); } -static void getpos_both __ARGS((typval_T *argvars, typval_T *rettv, int getcurpos)); +static void getpos_both(typval_T *argvars, typval_T *rettv, int getcurpos); /* * "getcurpos()" function @@ -13908,7 +13908,7 @@ f_index(argvars, rettv) static int inputsecret_flag = 0; -static void get_user_input __ARGS((typval_T *argvars, typval_T *rettv, int inputdialog)); +static void get_user_input(typval_T *argvars, typval_T *rettv, int inputdialog); /* * This function is used by f_input() and f_inputdialog() functions. The third @@ -14295,7 +14295,7 @@ f_islocked(argvars, rettv) clear_lval(&lv); } -static void dict_list __ARGS((typval_T *argvars, typval_T *rettv, int what)); +static void dict_list(typval_T *argvars, typval_T *rettv, int what); /* * Turn a dict into a list: @@ -14513,7 +14513,7 @@ f_len(argvars, rettv) } } -static void libcall_common __ARGS((typval_T *argvars, typval_T *rettv, int type)); +static void libcall_common(typval_T *argvars, typval_T *rettv, int type); static void libcall_common(argvars, rettv, type) @@ -14656,7 +14656,7 @@ f_localtime(argvars, rettv) rettv->vval.v_number = (varnumber_T)time(NULL); } -static void get_maparg __ARGS((typval_T *argvars, typval_T *rettv, int exact)); +static void get_maparg(typval_T *argvars, typval_T *rettv, int exact); static void get_maparg(argvars, rettv, exact) @@ -14819,7 +14819,7 @@ f_mapcheck(argvars, rettv) get_maparg(argvars, rettv, FALSE); } -static void find_some_match __ARGS((typval_T *argvars, typval_T *rettv, int start)); +static void find_some_match(typval_T *argvars, typval_T *rettv, int start); static void find_some_match(argvars, rettv, type) @@ -15228,7 +15228,7 @@ f_matchstr(argvars, rettv) find_some_match(argvars, rettv, 2); } -static void max_min __ARGS((typval_T *argvars, typval_T *rettv, int domax)); +static void max_min(typval_T *argvars, typval_T *rettv, int domax); static void max_min(argvars, rettv, domax) @@ -15319,7 +15319,7 @@ f_min(argvars, rettv) max_min(argvars, rettv, FALSE); } -static int mkdir_recurse __ARGS((char_u *dir, int prot)); +static int mkdir_recurse(char_u *dir, int prot); /* * Create the directory in which "dir" is located, and higher levels when @@ -15992,7 +15992,7 @@ f_readfile(argvars, rettv) } #if defined(FEAT_RELTIME) -static int list2proftime __ARGS((typval_T *arg, proftime_T *tm)); +static int list2proftime(typval_T *arg, proftime_T *tm); /* * Convert a List to proftime_T. @@ -16092,8 +16092,8 @@ f_reltimestr(argvars, rettv) } #if defined(FEAT_CLIENTSERVER) && defined(FEAT_X11) -static void make_connection __ARGS((void)); -static int check_connection __ARGS((void)); +static void make_connection(void); +static int check_connection(void); static void make_connection() @@ -16124,7 +16124,7 @@ check_connection() #endif #ifdef FEAT_CLIENTSERVER -static void remote_common __ARGS((typval_T *argvars, typval_T *rettv, int expr)); +static void remote_common(typval_T *argvars, typval_T *rettv, int expr); static void remote_common(argvars, rettv, expr) @@ -16749,7 +16749,7 @@ f_reverse(argvars, rettv) #define SP_END 0x40 /* leave cursor at end of match */ #define SP_COLUMN 0x80 /* start at cursor column */ -static int get_search_arg __ARGS((typval_T *varp, int *flagsp)); +static int get_search_arg(typval_T *varp, int *flagsp); /* * Get flags for a search function. @@ -17605,7 +17605,7 @@ f_setline(argvars, rettv) appended_lines_mark(lcount, added); } -static void set_qf_ll_list __ARGS((win_T *wp, typval_T *list_arg, typval_T *action_arg, typval_T *rettv)); +static void set_qf_ll_list(win_T *wp, typval_T *list_arg, typval_T *action_arg, typval_T *rettv); /* * Used by "setqflist()" and "setloclist()" functions @@ -18197,12 +18197,12 @@ static int #ifdef __BORLANDC__ _RTLENTRYF #endif - item_compare __ARGS((const void *s1, const void *s2)); + item_compare(const void *s1, const void *s2); static int #ifdef __BORLANDC__ _RTLENTRYF #endif - item_compare2 __ARGS((const void *s1, const void *s2)); + item_compare2(const void *s1, const void *s2); /* struct used in the array that's given to qsort() */ typedef struct @@ -18221,7 +18221,7 @@ static char_u *item_compare_func; static dict_T *item_compare_selfdict; static int item_compare_func_err; static int item_compare_keep_zero; -static void do_sort_uniq __ARGS((typval_T *argvars, typval_T *rettv, int sort)); +static void do_sort_uniq(typval_T *argvars, typval_T *rettv, int sort); #define ITEM_COMPARE_FAIL 999 /* @@ -18501,7 +18501,7 @@ do_sort_uniq(argvars, rettv, sort) } else { - int (*item_compare_func_ptr)__ARGS((const void *, const void *)); + int (*item_compare_func_ptr)(const void *, const void *); /* f_uniq(): ptrs will be a stack of items to remove */ item_compare_func_err = FALSE; @@ -19717,7 +19717,7 @@ f_tabpagenr(argvars, rettv) #ifdef FEAT_WINDOWS -static int get_winnr __ARGS((tabpage_T *tp, typval_T *argvar)); +static int get_winnr(tabpage_T *tp, typval_T *argvar); /* * Common code for tabpagewinnr() and winnr(). @@ -25160,7 +25160,7 @@ typedef enum VAR_FLAVOUR_VIMINFO /* all uppercase */ } var_flavour_T; -static var_flavour_T var_flavour __ARGS((char_u *varname)); +static var_flavour_T var_flavour(char_u *varname); static var_flavour_T var_flavour(varname) @@ -25475,9 +25475,9 @@ reset_v_option_vars() /* * Functions for ":8" filename modifier: get 8.3 version of a filename. */ -static int get_short_pathname __ARGS((char_u **fnamep, char_u **bufp, int *fnamelen)); -static int shortpath_for_invalid_fname __ARGS((char_u **fname, char_u **bufp, int *fnamelen)); -static int shortpath_for_partial __ARGS((char_u **fnamep, char_u **bufp, int *fnamelen)); +static int get_short_pathname(char_u **fnamep, char_u **bufp, int *fnamelen); +static int shortpath_for_invalid_fname(char_u **fname, char_u **bufp, int *fnamelen); +static int shortpath_for_partial(char_u **fnamep, char_u **bufp, int *fnamelen); /* * Get the short path (8.3) for the filename in "fnamep". diff --git a/src/version.c b/src/version.c index 2c9911057c..2f4ab06250 100644 --- a/src/version.c +++ b/src/version.c @@ -741,6 +741,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ +/**/ + 1158, /**/ 1157, /**/ From e240c2da796531e807ea9df78bdbcc7b1012870c Mon Sep 17 00:00:00 2001 From: Bram Moolenaar Date: Sat, 23 Jan 2016 22:46:10 +0100 Subject: [PATCH 6/8] patch 7.4.1159 Problem: Automatically generated function prototypes use __ARGS. Solution: Remove __ARGS from osdef.sh. --- src/osdef.sh | 8 ++-- src/osdef1.h.in | 114 ++++++++++++++++++++++++------------------------ src/osdef2.h.in | 110 +++++++++++++++++++++++----------------------- src/version.c | 2 + 4 files changed, 118 insertions(+), 116 deletions(-) diff --git a/src/osdef.sh b/src/osdef.sh index 6f9fea28b5..59ef55d046 100755 --- a/src/osdef.sh +++ b/src/osdef.sh @@ -53,11 +53,11 @@ $CC -I. -I$srcdir -E osdef0.c >osdef0.cc # start of the line is matched with "[)*, ]\1[ (]" sed < osdef0.cc -e '/\(..*\)/s// \1/' > osdef0.ccc -sed < $srcdir/osdef1.h.in -n -e '/^extern/s@.*[)* ][)* ]*\([a-zA-Z_][a-zA-Z0-9_]*\) __ARGS.*@/[)*, ][(]*\1[)]*[ (]/i\\\ -\\/\\[^a-zA-Z_\\]\1 __ARGS\\/d@p' > osdef11.sed +sed < $srcdir/osdef1.h.in -n -e '/^extern/s@.*[)* ][)* ]*\([a-zA-Z_][a-zA-Z0-9_]*\)(.*@/[)*, ][(]*\1[)]*[ (]/i\\\ +\\/\\[^a-zA-Z_\\]\1(\\/d@p' > osdef11.sed -sed < $srcdir/osdef2.h.in -n -e '/^extern/s@.*[)* ][)* ]*\([a-zA-Z_][a-zA-Z0-9_]*\) __ARGS.*@/[)*, ][(]*\1[)]*[ (]/i\\\ -\\/\\[^a-zA-Z_\\]\1 __ARGS\\/d@p' > osdef21.sed +sed < $srcdir/osdef2.h.in -n -e '/^extern/s@.*[)* ][)* ]*\([a-zA-Z_][a-zA-Z0-9_]*\)(.*@/[)*, ][(]*\1[)]*[ (]/i\\\ +\\/\\[^a-zA-Z_\\]\1(\\/d@p' > osdef21.sed cat << EOF > osdef2.sed 1i\\ diff --git a/src/osdef1.h.in b/src/osdef1.h.in index 8190c9b1ee..a11e6ea501 100644 --- a/src/osdef1.h.in +++ b/src/osdef1.h.in @@ -12,130 +12,130 @@ * sed cannot always handle so many commands, this is file 1 of 2 */ -extern int printf __ARGS((char *, ...)); -extern int fprintf __ARGS((FILE *, char *, ...)); -extern int sprintf __ARGS((char *, char *, ...)); -extern int sscanf __ARGS((char *, char *, ...)); +extern int printf(char *, ...); +extern int fprintf(FILE *, char *, ...); +extern int sprintf(char *, char *, ...); +extern int sscanf(char *, char *, ...); #ifndef fopen /* could be redefined to fopen64() */ -extern FILE *fopen __ARGS((const char *, const char *)); +extern FILE *fopen(const char *, const char *); #endif -extern int fclose __ARGS((FILE *)); -extern int fseek __ARGS((FILE *, long, int)); +extern int fclose(FILE *); +extern int fseek(FILE *, long, int); #ifdef HAVE_FSEEKO -extern int fseeko __ARGS((FILE *, off_t, int)); +extern int fseeko(FILE *, off_t, int); #endif -extern long ftell __ARGS((FILE *)); +extern long ftell(FILE *); #ifdef HAVE_FSEEKO -extern off_t ftello __ARGS((FILE *)); +extern off_t ftello(FILE *); #endif -extern void rewind __ARGS((FILE *)); -extern int fread __ARGS((char *, int, int, FILE *)); -extern int fwrite __ARGS((char *, int, int, FILE *)); -extern int fputs __ARGS((char *, FILE *)); +extern void rewind(FILE *); +extern int fread(char *, int, int, FILE *); +extern int fwrite(char *, int, int, FILE *); +extern int fputs(char *, FILE *); #ifndef ferror /* let me say it again: "macros should never have prototypes" */ -extern int ferror __ARGS((FILE *)); +extern int ferror(FILE *); #endif -extern int fflush __ARGS((FILE *)); +extern int fflush(FILE *); #if defined(sun) || defined(_SEQUENT_) /* used inside of stdio macros getc(), puts(), putchar()... */ -extern int _flsbuf __ARGS((int, FILE *)); -extern int _filbuf __ARGS((FILE *)); +extern int _flsbuf(int, FILE *); +extern int _filbuf(FILE *); #endif #if !defined(HAVE_SELECT) -struct pollfd; /* for poll __ARGS */ -extern int poll __ARGS((struct pollfd *, long, int)); +struct pollfd; /* for poll() */ +extern int poll(struct pollfd *, long, int); #endif #ifdef HAVE_MEMSET -extern void *memset __ARGS((void *, int, size_t)); +extern void *memset(void *, int, size_t); #endif #ifdef HAVE_BCMP -extern int bcmp __ARGS((void *, void *, size_t)); +extern int bcmp(void *, void *, size_t); #endif #ifdef HAVE_MEMCMP -extern int memcmp __ARGS((const void *, const void *, size_t)); +extern int memcmp(const void *, const void *, size_t); #endif #ifdef HAVE_STRPBRK -extern char *strpbrk __ARGS((const char *, const char *)); +extern char *strpbrk(const char *, const char *); #endif #ifdef USEBCOPY -extern void bcopy __ARGS((char *, char *, int)); +extern void bcopy(char *, char *, int); #else # ifdef USEMEMCPY -extern void memcpy __ARGS((char *, char *, int)); +extern void memcpy(char *, char *, int); # else # ifdef USEMEMMOVE -extern void memmove __ARGS((char *, char *, int)); +extern void memmove(char *, char *, int); # endif # endif #endif /* used inside of FD_ZERO macro: */ -extern void bzero __ARGS((void *, size_t)); +extern void bzero(void *, size_t); #ifdef HAVE_SETSID -extern pid_t setsid __ARGS((void)); +extern pid_t setsid(void); #endif #ifdef HAVE_SETPGID -extern int setpgid __ARGS((pid_t, pid_t)); +extern int setpgid(pid_t, pid_t); #endif #ifdef HAVE_STRTOL -extern int strtol __ARGS((char *, char **, int)); +extern int strtol(char *, char **, int); #endif #ifdef HAVE_STRFTIME -extern size_t strftime __ARGS((char *, size_t, char *, struct tm *)); +extern size_t strftime(char *, size_t, char *, struct tm *); #endif #ifdef HAVE_STRCASECMP -extern int strcasecmp __ARGS((char *, char *)); +extern int strcasecmp(char *, char *); #endif #ifdef HAVE_STRNCASECMP -extern int strncasecmp __ARGS((char *, char *, size_t)); +extern int strncasecmp(char *, char *, size_t); #endif #ifndef strdup -extern char *strdup __ARGS((const char *)); +extern char *strdup(const char *); #endif -extern int atoi __ARGS((char *)); -extern int atol __ARGS((char *)); +extern int atoi(char *); +extern int atol(char *); #ifndef USE_SYSTEM -extern int fork __ARGS((void)); +extern int fork(void); # ifndef __TANDEM -extern int execvp __ARGS((const char *, const char **)); +extern int execvp(const char *, const char **); # endif -extern int wait __ARGS((int *)); /* will this break things ...? */ -extern int waitpid __ARGS((pid_t, int *, int)); +extern int wait(int *); /* will this break things ...? */ +extern int waitpid(pid_t, int *, int); #endif -extern int toupper __ARGS((int)); -extern int tolower __ARGS((int)); +extern int toupper(int); +extern int tolower(int); -extern RETSIGTYPE (*signal __ARGS((int, RETSIGTYPE (*func) SIGPROTOARG))) __ARGS(SIGPROTOARG); +extern RETSIGTYPE (*signal(int, RETSIGTYPE (*func) SIGPROTOARG)) SIGPROTOARG; #ifdef HAVE_SIGSET -extern RETSIGTYPE (*sigset __ARGS((int, RETSIGTYPE (*func) SIGPROTOARG))) __ARGS(SIGPROTOARG); +extern RETSIGTYPE (*sigset(int, RETSIGTYPE (*func) SIGPROTOARG)) SIGPROTOARG; #endif #if defined(HAVE_SETJMP_H) # ifdef HAVE_SIGSETJMP -extern int sigsetjmp __ARGS((sigjmp_buf, int)); -extern void siglongjmp __ARGS((sigjmp_buf, int)); +extern int sigsetjmp(sigjmp_buf, int); +extern void siglongjmp(sigjmp_buf, int); # else -extern int setjmp __ARGS((jmp_buf)); -extern void longjmp __ARGS((jmp_buf, int)); +extern int setjmp(jmp_buf); +extern void longjmp(jmp_buf, int); # endif #endif -extern int kill __ARGS((int, int)); +extern int kill(int, int); #ifndef __TANDEM -extern int access __ARGS((char *, int)); +extern int access(char *, int); #endif -extern int fsync __ARGS((int)); -extern int fchown __ARGS((int, int, int)); +extern int fsync(int); +extern int fchown(int, int, int); #if defined(HAVE_GETCWD) && !defined(sun) && !defined(__TANDEM) -extern char *getcwd __ARGS((char *, int)); +extern char *getcwd(char *, int); #else -extern char *getwd __ARGS((char *)); +extern char *getwd(char *); #endif #ifndef __alpha /* suggested by Campbell */ -extern int ioctl __ARGS((int, int, ...)); +extern int ioctl(int, int, ...); #endif -extern int chmod __ARGS((const char *, mode_t)); +extern int chmod(const char *, mode_t); diff --git a/src/osdef2.h.in b/src/osdef2.h.in index f2f97763fc..330a5a4f57 100644 --- a/src/osdef2.h.in +++ b/src/osdef2.h.in @@ -2,95 +2,95 @@ * osdef2.h.in - See osdef1.h.in for a description. */ -extern int remove __ARGS((const char *)); -extern int rename __ARGS((const char *, const char *)); -extern int free __ARGS((char *)); -extern char *malloc __ARGS((unsigned int)); -extern char *realloc __ARGS((char *, int)); -extern char *getenv __ARGS((char *)); -extern int setenv __ARGS((char *, char *, int)); -extern int putenv __ARGS((const char *)); +extern int remove(const char *); +extern int rename(const char *, const char *); +extern int free(char *); +extern char *malloc(unsigned int); +extern char *realloc(char *, int); +extern char *getenv(char *); +extern int setenv(char *, char *, int); +extern int putenv(const char *); #ifndef __TANDEM -extern int gethostname __ARGS((char *, int)); +extern int gethostname(char *, int); #endif -extern void perror __ARGS((char *)); +extern void perror(char *); #ifndef __TANDEM -extern int sleep __ARGS((int)); +extern int sleep(int); #endif -extern int usleep __ARGS((unsigned int)); -extern unsigned int alarm __ARGS((unsigned int)); +extern int usleep(unsigned int); +extern unsigned int alarm(unsigned int); #ifndef __TANDEM -extern int chdir __ARGS((char *)); +extern int chdir(char *); #endif -extern int fchdir __ARGS((int)); +extern int fchdir(int); #ifndef stat /* could be redefined to stat64() */ -extern int stat __ARGS((const char *, struct stat *)); +extern int stat(const char *, struct stat *); #endif #ifndef lstat /* could be redefined to lstat64() */ -extern int lstat __ARGS((const char *, struct stat *)); +extern int lstat(const char *, struct stat *); #endif -extern int fstat __ARGS((int, struct stat *)); -extern int open __ARGS((const char *, int, ...)); -extern int close __ARGS((int)); +extern int fstat(int, struct stat *); +extern int open(const char *, int, ...); +extern int close(int); #ifndef __TANDEM -extern int read __ARGS((int, char *, size_t)); -extern int write __ARGS((int, char *, size_t)); +extern int read(int, char *, size_t); +extern int write(int, char *, size_t); #endif -extern int pipe __ARGS((int *)); -extern off_t lseek __ARGS((int, off_t, int)); -extern void sync __ARGS((void)); -extern uid_t getuid __ARGS((void)); -extern gid_t getgid __ARGS((void)); -extern void qsort __ARGS((void *, size_t, size_t, int (*)(const void *, const void *))); +extern int pipe(int *); +extern off_t lseek(int, off_t, int); +extern void sync(void); +extern uid_t getuid(void); +extern gid_t getgid(void); +extern void qsort(void *, size_t, size_t, int (*)(const void *, const void *)); -extern int isatty __ARGS((int)); -extern int getpid __ARGS((void)); -extern int dup __ARGS((int)); -extern int unlink __ARGS((const char *)); -extern int link __ARGS((const char *, const char *)); -extern int mkdir __ARGS((const char *, mode_t)); -extern int rmdir __ARGS((const char *)); +extern int isatty(int); +extern int getpid(void); +extern int dup(int); +extern int unlink(const char *); +extern int link(const char *, const char *); +extern int mkdir(const char *, mode_t); +extern int rmdir(const char *); -extern int tgetent __ARGS((char *, char *)); -extern int tgetnum __ARGS((char *)); -extern int tgetflag __ARGS((char *)); -extern char *tgoto __ARGS((char *, int, int)); -extern int tputs __ARGS((char *, int, int (*)(int))); +extern int tgetent(char *, char *); +extern int tgetnum(char *); +extern int tgetflag(char *); +extern char *tgoto(char *, int, int); +extern int tputs(char *, int, int (*)(int)); #ifdef HAVE_TERMIOS_H -struct termios; /* for tcgetattr __ARGS */ -extern int tcgetattr __ARGS((int, struct termios *)); -extern int tcsetattr __ARGS((int, int, const struct termios *)); +struct termios; /* for tcgetattr() */ +extern int tcgetattr(int, struct termios *); +extern int tcsetattr(int, int, const struct termios *); #endif #ifdef HAVE_SYS_STATFS_H -struct statfs; /* for fstatfs __ARGS */ -extern int fstatfs __ARGS((int, struct statfs *, int, int)); +struct statfs; /* for fstatfs() */ +extern int fstatfs(int, struct statfs *, int, int); #endif #ifdef HAVE_GETTIMEOFDAY -struct timeval; /* for gettimeofday __ARGS */ -struct timezone; /* for gettimeofday __ARGS */ -extern int gettimeofday __ARGS((struct timeval *tp, struct timezone *tzp)); -extern time_t time __ARGS((time_t *)); +struct timeval; /* for gettimeofday() */ +struct timezone; /* for gettimeofday() */ +extern int gettimeofday(struct timeval *tp, struct timezone *tzp); +extern time_t time(time_t *); #endif #ifdef HAVE_GETPWNAM -struct passwd; /* for getpwnam __ARGS */ -extern struct passwd *getpwnam __ARGS((const char *)); +struct passwd; /* for getpwnam() */ +extern struct passwd *getpwnam(const char *); #endif #ifdef USE_TMPNAM -extern char *tmpnam __ARGS((char *)); +extern char *tmpnam(char *); #else -extern char *mktemp __ARGS((char *)); +extern char *mktemp(char *); #endif #ifdef ISC -extern int _Xmblen __ARGS((char const *, size_t)); +extern int _Xmblen(char const *, size_t); #else /* This is different from the header but matches mblen() */ -extern int _Xmblen __ARGS((char *, size_t)); +extern int _Xmblen(char *, size_t); #endif diff --git a/src/version.c b/src/version.c index 2f4ab06250..e9d5c1983e 100644 --- a/src/version.c +++ b/src/version.c @@ -741,6 +741,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ +/**/ + 1159, /**/ 1158, /**/ From bd4593ffb170230504500ddedabad3fad1f31291 Mon Sep 17 00:00:00 2001 From: Bram Moolenaar Date: Sat, 23 Jan 2016 22:51:07 +0100 Subject: [PATCH 7/8] patch 7.4.1160 Problem: No error for jsondecode('"'). Solution: Give an error message for missing double quote. --- src/json.c | 1 + src/version.c | 2 ++ 2 files changed, 3 insertions(+) diff --git a/src/json.c b/src/json.c index 442eaff2c9..accb6cf85d 100644 --- a/src/json.c +++ b/src/json.c @@ -406,6 +406,7 @@ json_decode_string(js_read_T *reader, typval_T *res) } else { + EMSG(_(e_invarg)); res->v_type = VAR_SPECIAL; res->vval.v_number = VVAL_NONE; } diff --git a/src/version.c b/src/version.c index e9d5c1983e..25ba3b97d7 100644 --- a/src/version.c +++ b/src/version.c @@ -741,6 +741,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ +/**/ + 1160, /**/ 1159, /**/ From 2faa29f896252073b53f387406109e331fbbe5f8 Mon Sep 17 00:00:00 2001 From: Bram Moolenaar Date: Sat, 23 Jan 2016 23:02:34 +0100 Subject: [PATCH 8/8] patch 7.4.1161 Problem: ":argadd" without argument is supposed to add the current buffer name to the arglist. Solution: Make it work as documented. (Coot, closes #577) --- src/ex_cmds.h | 2 +- src/ex_cmds2.c | 10 ++++++++++ src/testdir/test_arglist.vim | 11 +++++++++++ src/version.c | 2 ++ 4 files changed, 24 insertions(+), 1 deletion(-) diff --git a/src/ex_cmds.h b/src/ex_cmds.h index 4b5f68453a..78c0afa63e 100644 --- a/src/ex_cmds.h +++ b/src/ex_cmds.h @@ -128,7 +128,7 @@ EX(CMD_args, "args", ex_args, BANG|FILES|EDITCMD|ARGOPT|TRLBAR, ADDR_LINES), EX(CMD_argadd, "argadd", ex_argadd, - BANG|NEEDARG|RANGE|NOTADR|ZEROR|FILES|TRLBAR, + BANG|RANGE|NOTADR|ZEROR|FILES|TRLBAR, ADDR_ARGUMENTS), EX(CMD_argdelete, "argdelete", ex_argdelete, BANG|RANGE|NOTADR|FILES|TRLBAR, diff --git a/src/ex_cmds2.c b/src/ex_cmds2.c index 59bf945894..bc7193d122 100644 --- a/src/ex_cmds2.c +++ b/src/ex_cmds2.c @@ -2089,6 +2089,16 @@ do_arglist(str, what, after) int match; #endif + /* + * Set default argument for ":argadd" command. + */ + if (what == AL_ADD && *str == NUL) + { + if (curbuf->b_ffname == NULL) + return FAIL; + str = curbuf->b_fname; + } + /* * Collect all file name arguments in "new_ga". */ diff --git a/src/testdir/test_arglist.vim b/src/testdir/test_arglist.vim index 281ac7ad44..4244344270 100644 --- a/src/testdir/test_arglist.vim +++ b/src/testdir/test_arglist.vim @@ -57,6 +57,17 @@ func Test_argadd() +2argadd y call Assert_argc(['a', 'b', 'c', 'x', 'y']) call assert_equal(1, argidx()) + + %argd + edit d + arga + call assert_equal(len(argv()), 1) + call assert_equal(get(argv(), 0, ''), 'd') + + %argd + new + arga + call assert_equal(len(argv()), 0) endfunc func Init_abc() diff --git a/src/version.c b/src/version.c index 25ba3b97d7..ca83550cd4 100644 --- a/src/version.c +++ b/src/version.c @@ -741,6 +741,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ +/**/ + 1161, /**/ 1160, /**/