To: vim_dev@googlegroups.com Subject: Patch 8.1.1815 Fcc: outbox From: Bram Moolenaar Mime-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ------------ Patch 8.1.1815 Problem: Duplicating info for internal functions. Solution: Use one table to list internal functions. Files: src/evalfunc.c *** ../vim-8.1.1814/src/evalfunc.c 2019-08-04 17:35:49.331707782 +0200 --- src/evalfunc.c 2019-08-04 21:29:46.317513812 +0200 *************** *** 422,1045 **** // implementation of function } funcentry_T; static funcentry_T global_functions[] = { #ifdef FEAT_FLOAT ! {"abs", 1, 1, 0, f_abs}, ! {"acos", 1, 1, 0, f_acos}, // WJMc #endif ! {"add", 2, 2, 0, f_add}, ! {"and", 2, 2, 0, f_and}, ! {"append", 2, 2, 0, f_append}, ! {"appendbufline", 3, 3, 0, f_appendbufline}, ! {"argc", 0, 1, 0, f_argc}, ! {"argidx", 0, 0, 0, f_argidx}, ! {"arglistid", 0, 2, 0, f_arglistid}, ! {"argv", 0, 2, 0, f_argv}, ! #ifdef FEAT_FLOAT ! {"asin", 1, 1, 0, f_asin}, // WJMc ! #endif ! {"assert_beeps", 1, 2, 0, f_assert_beeps}, ! {"assert_equal", 2, 3, 0, f_assert_equal}, ! {"assert_equalfile", 2, 2, 0, f_assert_equalfile}, ! {"assert_exception", 1, 2, 0, f_assert_exception}, ! {"assert_fails", 1, 3, 0, f_assert_fails}, ! {"assert_false", 1, 2, 0, f_assert_false}, ! {"assert_inrange", 3, 4, 0, f_assert_inrange}, ! {"assert_match", 2, 3, 0, f_assert_match}, ! {"assert_notequal", 2, 3, 0, f_assert_notequal}, ! {"assert_notmatch", 2, 3, 0, f_assert_notmatch}, ! {"assert_report", 1, 1, 0, f_assert_report}, ! {"assert_true", 1, 2, 0, f_assert_true}, #ifdef FEAT_FLOAT ! {"atan", 1, 1, 0, f_atan}, ! {"atan2", 2, 2, 0, f_atan2}, #endif #ifdef FEAT_BEVAL ! {"balloon_gettext", 0, 0, 0, f_balloon_gettext}, ! {"balloon_show", 1, 1, 0, f_balloon_show}, # if defined(FEAT_BEVAL_TERM) ! {"balloon_split", 1, 1, 0, f_balloon_split}, # endif #endif ! {"browse", 4, 4, 0, f_browse}, ! {"browsedir", 2, 2, 0, f_browsedir}, ! {"bufadd", 1, 1, 0, f_bufadd}, ! {"bufexists", 1, 1, 0, f_bufexists}, ! {"buffer_exists", 1, 1, 0, f_bufexists}, // obsolete ! {"buffer_name", 1, 1, 0, f_bufname}, // obsolete ! {"buffer_number", 1, 1, 0, f_bufnr}, // obsolete ! {"buflisted", 1, 1, 0, f_buflisted}, ! {"bufload", 1, 1, 0, f_bufload}, ! {"bufloaded", 1, 1, 0, f_bufloaded}, ! {"bufname", 1, 1, 0, f_bufname}, ! {"bufnr", 1, 2, 0, f_bufnr}, ! {"bufwinid", 1, 1, 0, f_bufwinid}, ! {"bufwinnr", 1, 1, 0, f_bufwinnr}, ! {"byte2line", 1, 1, 0, f_byte2line}, ! {"byteidx", 2, 2, 0, f_byteidx}, ! {"byteidxcomp", 2, 2, 0, f_byteidxcomp}, ! {"call", 2, 3, 0, f_call}, #ifdef FEAT_FLOAT ! {"ceil", 1, 1, 0, f_ceil}, #endif #ifdef FEAT_JOB_CHANNEL ! {"ch_canread", 1, 1, 0, f_ch_canread}, ! {"ch_close", 1, 1, 0, f_ch_close}, ! {"ch_close_in", 1, 1, 0, f_ch_close_in}, ! {"ch_evalexpr", 2, 3, 0, f_ch_evalexpr}, ! {"ch_evalraw", 2, 3, 0, f_ch_evalraw}, ! {"ch_getbufnr", 2, 2, 0, f_ch_getbufnr}, ! {"ch_getjob", 1, 1, 0, f_ch_getjob}, ! {"ch_info", 1, 1, 0, f_ch_info}, ! {"ch_log", 1, 2, 0, f_ch_log}, ! {"ch_logfile", 1, 2, 0, f_ch_logfile}, ! {"ch_open", 1, 2, 0, f_ch_open}, ! {"ch_read", 1, 2, 0, f_ch_read}, ! {"ch_readblob", 1, 2, 0, f_ch_readblob}, ! {"ch_readraw", 1, 2, 0, f_ch_readraw}, ! {"ch_sendexpr", 2, 3, 0, f_ch_sendexpr}, ! {"ch_sendraw", 2, 3, 0, f_ch_sendraw}, ! {"ch_setoptions", 2, 2, 0, f_ch_setoptions}, ! {"ch_status", 1, 2, 0, f_ch_status}, ! #endif ! {"changenr", 0, 0, 0, f_changenr}, ! {"char2nr", 1, 2, 0, f_char2nr}, ! {"chdir", 1, 1, 0, f_chdir}, ! {"cindent", 1, 1, 0, f_cindent}, ! {"clearmatches", 0, 1, 0, f_clearmatches}, ! {"col", 1, 1, 0, f_col}, #if defined(FEAT_INS_EXPAND) ! {"complete", 2, 2, 0, f_complete}, ! {"complete_add", 1, 1, 0, f_complete_add}, ! {"complete_check", 0, 0, 0, f_complete_check}, ! {"complete_info", 0, 1, 0, f_complete_info}, ! #endif ! {"confirm", 1, 4, 0, f_confirm}, ! {"copy", 1, 1, 0, f_copy}, ! #ifdef FEAT_FLOAT ! {"cos", 1, 1, 0, f_cos}, ! {"cosh", 1, 1, 0, f_cosh}, ! #endif ! {"count", 2, 4, 0, f_count}, ! {"cscope_connection",0,3, 0, f_cscope_connection}, ! {"cursor", 1, 3, 0, f_cursor}, #ifdef MSWIN ! {"debugbreak", 1, 1, 0, f_debugbreak}, #endif ! {"deepcopy", 1, 2, 0, f_deepcopy}, ! {"delete", 1, 2, 0, f_delete}, ! {"deletebufline", 2, 3, 0, f_deletebufline}, ! {"did_filetype", 0, 0, 0, f_did_filetype}, ! {"diff_filler", 1, 1, 0, f_diff_filler}, ! {"diff_hlID", 2, 2, 0, f_diff_hlID}, ! {"empty", 1, 1, 0, f_empty}, ! {"environ", 0, 0, 0, f_environ}, ! {"escape", 2, 2, 0, f_escape}, ! {"eval", 1, 1, 0, f_eval}, ! {"eventhandler", 0, 0, 0, f_eventhandler}, ! {"executable", 1, 1, 0, f_executable}, ! {"execute", 1, 2, 0, f_execute}, ! {"exepath", 1, 1, 0, f_exepath}, ! {"exists", 1, 1, 0, f_exists}, ! #ifdef FEAT_FLOAT ! {"exp", 1, 1, 0, f_exp}, ! #endif ! {"expand", 1, 3, 0, f_expand}, ! {"expandcmd", 1, 1, 0, f_expandcmd}, ! {"extend", 2, 3, 0, f_extend}, ! {"feedkeys", 1, 2, 0, f_feedkeys}, ! {"file_readable", 1, 1, 0, f_filereadable}, // obsolete ! {"filereadable", 1, 1, 0, f_filereadable}, ! {"filewritable", 1, 1, 0, f_filewritable}, ! {"filter", 2, 2, 0, f_filter}, ! {"finddir", 1, 3, 0, f_finddir}, ! {"findfile", 1, 3, 0, f_findfile}, ! #ifdef FEAT_FLOAT ! {"float2nr", 1, 1, 0, f_float2nr}, ! {"floor", 1, 1, 0, f_floor}, ! {"fmod", 2, 2, 0, f_fmod}, ! #endif ! {"fnameescape", 1, 1, 0, f_fnameescape}, ! {"fnamemodify", 2, 2, 0, f_fnamemodify}, ! {"foldclosed", 1, 1, 0, f_foldclosed}, ! {"foldclosedend", 1, 1, 0, f_foldclosedend}, ! {"foldlevel", 1, 1, 0, f_foldlevel}, ! {"foldtext", 0, 0, 0, f_foldtext}, ! {"foldtextresult", 1, 1, 0, f_foldtextresult}, ! {"foreground", 0, 0, 0, f_foreground}, ! {"funcref", 1, 3, 0, f_funcref}, ! {"function", 1, 3, 0, f_function}, ! {"garbagecollect", 0, 1, 0, f_garbagecollect}, ! {"get", 2, 3, 0, f_get}, ! {"getbufinfo", 0, 1, 0, f_getbufinfo}, ! {"getbufline", 2, 3, 0, f_getbufline}, ! {"getbufvar", 2, 3, 0, f_getbufvar}, ! {"getchangelist", 1, 1, 0, f_getchangelist}, ! {"getchar", 0, 1, 0, f_getchar}, ! {"getcharmod", 0, 0, 0, f_getcharmod}, ! {"getcharsearch", 0, 0, 0, f_getcharsearch}, ! {"getcmdline", 0, 0, 0, f_getcmdline}, ! {"getcmdpos", 0, 0, 0, f_getcmdpos}, ! {"getcmdtype", 0, 0, 0, f_getcmdtype}, ! {"getcmdwintype", 0, 0, 0, f_getcmdwintype}, #if defined(FEAT_CMDL_COMPL) ! {"getcompletion", 2, 3, 0, f_getcompletion}, #endif ! {"getcurpos", 0, 0, 0, f_getcurpos}, ! {"getcwd", 0, 2, 0, f_getcwd}, ! {"getenv", 1, 1, 0, f_getenv}, ! {"getfontname", 0, 1, 0, f_getfontname}, ! {"getfperm", 1, 1, 0, f_getfperm}, ! {"getfsize", 1, 1, 0, f_getfsize}, ! {"getftime", 1, 1, 0, f_getftime}, ! {"getftype", 1, 1, 0, f_getftype}, ! {"getjumplist", 0, 2, 0, f_getjumplist}, ! {"getline", 1, 2, 0, f_getline}, ! {"getloclist", 1, 2, 0, f_getloclist}, ! {"getmatches", 0, 1, 0, f_getmatches}, ! {"getpid", 0, 0, 0, f_getpid}, ! {"getpos", 1, 1, 0, f_getpos}, ! {"getqflist", 0, 1, 0, f_getqflist}, ! {"getreg", 0, 3, 0, f_getreg}, ! {"getregtype", 0, 1, 0, f_getregtype}, ! {"gettabinfo", 0, 1, 0, f_gettabinfo}, ! {"gettabvar", 2, 3, 0, f_gettabvar}, ! {"gettabwinvar", 3, 4, 0, f_gettabwinvar}, ! {"gettagstack", 0, 1, 0, f_gettagstack}, ! {"getwininfo", 0, 1, 0, f_getwininfo}, ! {"getwinpos", 0, 1, 0, f_getwinpos}, ! {"getwinposx", 0, 0, 0, f_getwinposx}, ! {"getwinposy", 0, 0, 0, f_getwinposy}, ! {"getwinvar", 2, 3, 0, f_getwinvar}, ! {"glob", 1, 4, 0, f_glob}, ! {"glob2regpat", 1, 1, 0, f_glob2regpat}, ! {"globpath", 2, 5, 0, f_globpath}, ! {"has", 1, 1, 0, f_has}, ! {"has_key", 2, 2, 0, f_has_key}, ! {"haslocaldir", 0, 2, 0, f_haslocaldir}, ! {"hasmapto", 1, 3, 0, f_hasmapto}, ! {"highlightID", 1, 1, 0, f_hlID}, // obsolete ! {"highlight_exists",1, 1, 0, f_hlexists}, // obsolete ! {"histadd", 2, 2, 0, f_histadd}, ! {"histdel", 1, 2, 0, f_histdel}, ! {"histget", 1, 2, 0, f_histget}, ! {"histnr", 1, 1, 0, f_histnr}, ! {"hlID", 1, 1, 0, f_hlID}, ! {"hlexists", 1, 1, 0, f_hlexists}, ! {"hostname", 0, 0, 0, f_hostname}, ! {"iconv", 3, 3, 0, f_iconv}, ! {"indent", 1, 1, 0, f_indent}, ! {"index", 2, 4, 0, f_index}, ! {"input", 1, 3, 0, f_input}, ! {"inputdialog", 1, 3, 0, f_inputdialog}, ! {"inputlist", 1, 1, 0, f_inputlist}, ! {"inputrestore", 0, 0, 0, f_inputrestore}, ! {"inputsave", 0, 0, 0, f_inputsave}, ! {"inputsecret", 1, 2, 0, f_inputsecret}, ! {"insert", 2, 3, 0, f_insert}, ! {"invert", 1, 1, 0, f_invert}, ! {"isdirectory", 1, 1, 0, f_isdirectory}, #if defined(FEAT_FLOAT) && defined(HAVE_MATH_H) ! {"isinf", 1, 1, 0, f_isinf}, #endif ! {"islocked", 1, 1, 0, f_islocked}, #if defined(FEAT_FLOAT) && defined(HAVE_MATH_H) ! {"isnan", 1, 1, 0, f_isnan}, #endif ! {"items", 1, 1, 0, f_items}, #ifdef FEAT_JOB_CHANNEL ! {"job_getchannel", 1, 1, 0, f_job_getchannel}, ! {"job_info", 0, 1, 0, f_job_info}, ! {"job_setoptions", 2, 2, 0, f_job_setoptions}, ! {"job_start", 1, 2, 0, f_job_start}, ! {"job_status", 1, 1, 0, f_job_status}, ! {"job_stop", 1, 2, 0, f_job_stop}, ! #endif ! {"join", 1, 2, 0, f_join}, ! {"js_decode", 1, 1, 0, f_js_decode}, ! {"js_encode", 1, 1, 0, f_js_encode}, ! {"json_decode", 1, 1, 0, f_json_decode}, ! {"json_encode", 1, 1, 0, f_json_encode}, ! {"keys", 1, 1, 0, f_keys}, ! {"last_buffer_nr", 0, 0, 0, f_last_buffer_nr}, // obsolete ! {"len", 1, 1, 0, f_len}, ! {"libcall", 3, 3, 0, f_libcall}, ! {"libcallnr", 3, 3, 0, f_libcallnr}, ! {"line", 1, 1, 0, f_line}, ! {"line2byte", 1, 1, 0, f_line2byte}, ! {"lispindent", 1, 1, 0, f_lispindent}, ! {"list2str", 1, 2, 0, f_list2str}, ! {"listener_add", 1, 2, 0, f_listener_add}, ! {"listener_flush", 0, 1, 0, f_listener_flush}, ! {"listener_remove", 1, 1, 0, f_listener_remove}, ! {"localtime", 0, 0, 0, f_localtime}, #ifdef FEAT_FLOAT ! {"log", 1, 1, 0, f_log}, ! {"log10", 1, 1, 0, f_log10}, #endif #ifdef FEAT_LUA ! {"luaeval", 1, 2, 0, f_luaeval}, #endif ! {"map", 2, 2, 0, f_map}, ! {"maparg", 1, 4, 0, f_maparg}, ! {"mapcheck", 1, 3, 0, f_mapcheck}, ! {"match", 2, 4, 0, f_match}, ! {"matchadd", 2, 5, 0, f_matchadd}, ! {"matchaddpos", 2, 5, 0, f_matchaddpos}, ! {"matcharg", 1, 1, 0, f_matcharg}, ! {"matchdelete", 1, 2, 0, f_matchdelete}, ! {"matchend", 2, 4, 0, f_matchend}, ! {"matchlist", 2, 4, 0, f_matchlist}, ! {"matchstr", 2, 4, 0, f_matchstr}, ! {"matchstrpos", 2, 4, 0, f_matchstrpos}, ! {"max", 1, 1, 0, f_max}, ! {"min", 1, 1, 0, f_min}, ! {"mkdir", 1, 3, 0, f_mkdir}, ! {"mode", 0, 1, 0, f_mode}, #ifdef FEAT_MZSCHEME ! {"mzeval", 1, 1, 0, f_mzeval}, #endif ! {"nextnonblank", 1, 1, 0, f_nextnonblank}, ! {"nr2char", 1, 2, 0, f_nr2char}, ! {"or", 2, 2, 0, f_or}, ! {"pathshorten", 1, 1, 0, f_pathshorten}, #ifdef FEAT_PERL ! {"perleval", 1, 1, 0, f_perleval}, #endif #ifdef FEAT_TEXT_PROP ! {"popup_atcursor", 2, 2, 0, f_popup_atcursor}, ! {"popup_beval", 2, 2, 0, f_popup_beval}, ! {"popup_clear", 0, 0, 0, f_popup_clear}, ! {"popup_close", 1, 2, 0, f_popup_close}, ! {"popup_create", 2, 2, 0, f_popup_create}, ! {"popup_dialog", 2, 2, 0, f_popup_dialog}, ! {"popup_filter_menu", 2, 2, 0, f_popup_filter_menu}, ! {"popup_filter_yesno", 2, 2, 0, f_popup_filter_yesno}, ! {"popup_getoptions", 1, 1, 0, f_popup_getoptions}, ! {"popup_getpos", 1, 1, 0, f_popup_getpos}, ! {"popup_getpreview", 0, 0, 0, f_popup_getpreview}, ! {"popup_hide", 1, 1, 0, f_popup_hide}, ! {"popup_locate", 2, 2, 0, f_popup_locate}, ! {"popup_menu", 2, 2, 0, f_popup_menu}, ! {"popup_move", 2, 2, 0, f_popup_move}, ! {"popup_notification", 2, 2, 0, f_popup_notification}, ! {"popup_setoptions", 2, 2, 0, f_popup_setoptions}, ! {"popup_settext", 2, 2, 0, f_popup_settext}, ! {"popup_show", 1, 1, 0, f_popup_show}, #endif #ifdef FEAT_FLOAT ! {"pow", 2, 2, 0, f_pow}, #endif ! {"prevnonblank", 1, 1, 0, f_prevnonblank}, ! {"printf", 1, 19, 0, f_printf}, #ifdef FEAT_JOB_CHANNEL ! {"prompt_setcallback", 2, 2, 0, f_prompt_setcallback}, ! {"prompt_setinterrupt", 2, 2, 0, f_prompt_setinterrupt}, ! {"prompt_setprompt", 2, 2, 0, f_prompt_setprompt}, #endif #ifdef FEAT_TEXT_PROP ! {"prop_add", 3, 3, 0, f_prop_add}, ! {"prop_clear", 1, 3, 0, f_prop_clear}, ! {"prop_list", 1, 2, 0, f_prop_list}, ! {"prop_remove", 1, 3, 0, f_prop_remove}, ! {"prop_type_add", 2, 2, 0, f_prop_type_add}, ! {"prop_type_change", 2, 2, 0, f_prop_type_change}, ! {"prop_type_delete", 1, 2, 0, f_prop_type_delete}, ! {"prop_type_get", 1, 2, 0, f_prop_type_get}, ! {"prop_type_list", 0, 1, 0, f_prop_type_list}, #endif ! {"pumvisible", 0, 0, 0, f_pumvisible}, #ifdef FEAT_PYTHON3 ! {"py3eval", 1, 1, 0, f_py3eval}, #endif #ifdef FEAT_PYTHON ! {"pyeval", 1, 1, 0, f_pyeval}, #endif #if defined(FEAT_PYTHON) || defined(FEAT_PYTHON3) ! {"pyxeval", 1, 1, 0, f_pyxeval}, #endif ! {"range", 1, 3, 0, f_range}, ! {"readdir", 1, 2, 0, f_readdir}, ! {"readfile", 1, 3, 0, f_readfile}, ! {"reg_executing", 0, 0, 0, f_reg_executing}, ! {"reg_recording", 0, 0, 0, f_reg_recording}, ! {"reltime", 0, 2, 0, f_reltime}, ! #ifdef FEAT_FLOAT ! {"reltimefloat", 1, 1, 0, f_reltimefloat}, ! #endif ! {"reltimestr", 1, 1, 0, f_reltimestr}, ! {"remote_expr", 2, 4, 0, f_remote_expr}, ! {"remote_foreground", 1, 1, 0, f_remote_foreground}, ! {"remote_peek", 1, 2, 0, f_remote_peek}, ! {"remote_read", 1, 2, 0, f_remote_read}, ! {"remote_send", 2, 3, 0, f_remote_send}, ! {"remote_startserver", 1, 1, 0, f_remote_startserver}, ! {"remove", 2, 3, 0, f_remove}, ! {"rename", 2, 2, 0, f_rename}, ! {"repeat", 2, 2, 0, f_repeat}, ! {"resolve", 1, 1, 0, f_resolve}, ! {"reverse", 1, 1, 0, f_reverse}, #ifdef FEAT_FLOAT ! {"round", 1, 1, 0, f_round}, #endif #ifdef FEAT_RUBY ! {"rubyeval", 1, 1, 0, f_rubyeval}, #endif ! {"screenattr", 2, 2, 0, f_screenattr}, ! {"screenchar", 2, 2, 0, f_screenchar}, ! {"screenchars", 2, 2, 0, f_screenchars}, ! {"screencol", 0, 0, 0, f_screencol}, ! {"screenpos", 3, 3, 0, f_screenpos}, ! {"screenrow", 0, 0, 0, f_screenrow}, ! {"screenstring", 2, 2, 0, f_screenstring}, ! {"search", 1, 4, 0, f_search}, ! {"searchdecl", 1, 3, 0, f_searchdecl}, ! {"searchpair", 3, 7, 0, f_searchpair}, ! {"searchpairpos", 3, 7, 0, f_searchpairpos}, ! {"searchpos", 1, 4, 0, f_searchpos}, ! {"server2client", 2, 2, 0, f_server2client}, ! {"serverlist", 0, 0, 0, f_serverlist}, ! {"setbufline", 3, 3, 0, f_setbufline}, ! {"setbufvar", 3, 3, 0, f_setbufvar}, ! {"setcharsearch", 1, 1, 0, f_setcharsearch}, ! {"setcmdpos", 1, 1, 0, f_setcmdpos}, ! {"setenv", 2, 2, 0, f_setenv}, ! {"setfperm", 2, 2, 0, f_setfperm}, ! {"setline", 2, 2, 0, f_setline}, ! {"setloclist", 2, 4, 0, f_setloclist}, ! {"setmatches", 1, 2, 0, f_setmatches}, ! {"setpos", 2, 2, 0, f_setpos}, ! {"setqflist", 1, 3, 0, f_setqflist}, ! {"setreg", 2, 3, 0, f_setreg}, ! {"settabvar", 3, 3, 0, f_settabvar}, ! {"settabwinvar", 4, 4, 0, f_settabwinvar}, ! {"settagstack", 2, 3, 0, f_settagstack}, ! {"setwinvar", 3, 3, 0, f_setwinvar}, #ifdef FEAT_CRYPT ! {"sha256", 1, 1, 0, f_sha256}, #endif ! {"shellescape", 1, 2, 0, f_shellescape}, ! {"shiftwidth", 0, 1, 0, f_shiftwidth}, #ifdef FEAT_SIGNS ! {"sign_define", 1, 2, 0, f_sign_define}, ! {"sign_getdefined", 0, 1, 0, f_sign_getdefined}, ! {"sign_getplaced", 0, 2, 0, f_sign_getplaced}, ! {"sign_jump", 3, 3, 0, f_sign_jump}, ! {"sign_place", 4, 5, 0, f_sign_place}, ! {"sign_placelist", 1, 1, 0, f_sign_placelist}, ! {"sign_undefine", 0, 1, 0, f_sign_undefine}, ! {"sign_unplace", 1, 2, 0, f_sign_unplace}, ! {"sign_unplacelist", 1, 2, 0, f_sign_unplacelist}, #endif ! {"simplify", 1, 1, 0, f_simplify}, #ifdef FEAT_FLOAT ! {"sin", 1, 1, 0, f_sin}, ! {"sinh", 1, 1, 0, f_sinh}, #endif ! {"sort", 1, 3, 0, f_sort}, #ifdef FEAT_SOUND ! {"sound_clear", 0, 0, 0, f_sound_clear}, ! {"sound_playevent", 1, 2, 0, f_sound_playevent}, ! {"sound_playfile", 1, 2, 0, f_sound_playfile}, ! {"sound_stop", 1, 1, 0, f_sound_stop}, ! #endif ! {"soundfold", 1, 1, 0, f_soundfold}, ! {"spellbadword", 0, 1, 0, f_spellbadword}, ! {"spellsuggest", 1, 3, 0, f_spellsuggest}, ! {"split", 1, 3, 0, f_split}, ! #ifdef FEAT_FLOAT ! {"sqrt", 1, 1, 0, f_sqrt}, ! {"str2float", 1, 1, 0, f_str2float}, ! #endif ! {"str2list", 1, 2, 0, f_str2list}, ! {"str2nr", 1, 2, 0, f_str2nr}, ! {"strcharpart", 2, 3, 0, f_strcharpart}, ! {"strchars", 1, 2, 0, f_strchars}, ! {"strdisplaywidth", 1, 2, 0, f_strdisplaywidth}, #ifdef HAVE_STRFTIME ! {"strftime", 1, 2, 0, f_strftime}, #endif ! {"strgetchar", 2, 2, 0, f_strgetchar}, ! {"stridx", 2, 3, 0, f_stridx}, ! {"string", 1, 1, 0, f_string}, ! {"strlen", 1, 1, 0, f_strlen}, ! {"strpart", 2, 3, 0, f_strpart}, ! {"strridx", 2, 3, 0, f_strridx}, ! {"strtrans", 1, 1, 0, f_strtrans}, ! {"strwidth", 1, 1, 0, f_strwidth}, ! {"submatch", 1, 2, 0, f_submatch}, ! {"substitute", 4, 4, 0, f_substitute}, ! {"swapinfo", 1, 1, 0, f_swapinfo}, ! {"swapname", 1, 1, 0, f_swapname}, ! {"synID", 3, 3, 0, f_synID}, ! {"synIDattr", 2, 3, 0, f_synIDattr}, ! {"synIDtrans", 1, 1, 0, f_synIDtrans}, ! {"synconcealed", 2, 2, 0, f_synconcealed}, ! {"synstack", 2, 2, 0, f_synstack}, ! {"system", 1, 2, 0, f_system}, ! {"systemlist", 1, 2, 0, f_systemlist}, ! {"tabpagebuflist", 0, 1, 0, f_tabpagebuflist}, ! {"tabpagenr", 0, 1, 0, f_tabpagenr}, ! {"tabpagewinnr", 1, 2, 0, f_tabpagewinnr}, ! {"tagfiles", 0, 0, 0, f_tagfiles}, ! {"taglist", 1, 2, 0, f_taglist}, #ifdef FEAT_FLOAT ! {"tan", 1, 1, 0, f_tan}, ! {"tanh", 1, 1, 0, f_tanh}, #endif ! {"tempname", 0, 0, 0, f_tempname}, #ifdef FEAT_TERMINAL ! {"term_dumpdiff", 2, 3, 0, f_term_dumpdiff}, ! {"term_dumpload", 1, 2, 0, f_term_dumpload}, ! {"term_dumpwrite", 2, 3, 0, f_term_dumpwrite}, ! {"term_getaltscreen", 1, 1, 0, f_term_getaltscreen}, # if defined(FEAT_GUI) || defined(FEAT_TERMGUICOLORS) ! {"term_getansicolors", 1, 1, 0, f_term_getansicolors}, # endif ! {"term_getattr", 2, 2, 0, f_term_getattr}, ! {"term_getcursor", 1, 1, 0, f_term_getcursor}, ! {"term_getjob", 1, 1, 0, f_term_getjob}, ! {"term_getline", 2, 2, 0, f_term_getline}, ! {"term_getscrolled", 1, 1, 0, f_term_getscrolled}, ! {"term_getsize", 1, 1, 0, f_term_getsize}, ! {"term_getstatus", 1, 1, 0, f_term_getstatus}, ! {"term_gettitle", 1, 1, 0, f_term_gettitle}, ! {"term_gettty", 1, 2, 0, f_term_gettty}, ! {"term_list", 0, 0, 0, f_term_list}, ! {"term_scrape", 2, 2, 0, f_term_scrape}, ! {"term_sendkeys", 2, 2, 0, f_term_sendkeys}, # if defined(FEAT_GUI) || defined(FEAT_TERMGUICOLORS) ! {"term_setansicolors", 2, 2, 0, f_term_setansicolors}, # endif ! {"term_setkill", 2, 2, 0, f_term_setkill}, ! {"term_setrestore", 2, 2, 0, f_term_setrestore}, ! {"term_setsize", 3, 3, 0, f_term_setsize}, ! {"term_start", 1, 2, 0, f_term_start}, ! {"term_wait", 1, 2, 0, f_term_wait}, ! #endif ! {"test_alloc_fail", 3, 3, 0, f_test_alloc_fail}, ! {"test_autochdir", 0, 0, 0, f_test_autochdir}, ! {"test_feedinput", 1, 1, 0, f_test_feedinput}, ! {"test_garbagecollect_now", 0, 0, 0, f_test_garbagecollect_now}, ! {"test_garbagecollect_soon", 0, 0, 0, f_test_garbagecollect_soon}, ! {"test_getvalue", 1, 1, 0, f_test_getvalue}, ! {"test_ignore_error", 1, 1, 0, f_test_ignore_error}, ! {"test_null_blob", 0, 0, 0, f_test_null_blob}, #ifdef FEAT_JOB_CHANNEL ! {"test_null_channel", 0, 0, 0, f_test_null_channel}, #endif ! {"test_null_dict", 0, 0, 0, f_test_null_dict}, #ifdef FEAT_JOB_CHANNEL ! {"test_null_job", 0, 0, 0, f_test_null_job}, #endif ! {"test_null_list", 0, 0, 0, f_test_null_list}, ! {"test_null_partial", 0, 0, 0, f_test_null_partial}, ! {"test_null_string", 0, 0, 0, f_test_null_string}, ! {"test_option_not_set", 1, 1, 0, f_test_option_not_set}, ! {"test_override", 2, 2, 0, f_test_override}, ! {"test_refcount", 1, 1, 0, f_test_refcount}, #ifdef FEAT_GUI ! {"test_scrollbar", 3, 3, 0, f_test_scrollbar}, #endif #ifdef FEAT_MOUSE ! {"test_setmouse", 2, 2, 0, f_test_setmouse}, #endif ! {"test_settime", 1, 1, 0, f_test_settime}, #ifdef FEAT_TIMERS ! {"timer_info", 0, 1, 0, f_timer_info}, ! {"timer_pause", 2, 2, 0, f_timer_pause}, ! {"timer_start", 2, 3, 0, f_timer_start}, ! {"timer_stop", 1, 1, 0, f_timer_stop}, ! {"timer_stopall", 0, 0, 0, f_timer_stopall}, ! #endif ! {"tolower", 1, 1, 0, f_tolower}, ! {"toupper", 1, 1, 0, f_toupper}, ! {"tr", 3, 3, 0, f_tr}, ! {"trim", 1, 2, 0, f_trim}, ! #ifdef FEAT_FLOAT ! {"trunc", 1, 1, 0, f_trunc}, ! #endif ! {"type", 1, 1, 0, f_type}, ! {"undofile", 1, 1, 0, f_undofile}, ! {"undotree", 0, 0, 0, f_undotree}, ! {"uniq", 1, 3, 0, f_uniq}, ! {"values", 1, 1, 0, f_values}, ! {"virtcol", 1, 1, 0, f_virtcol}, ! {"visualmode", 0, 1, 0, f_visualmode}, ! {"wildmenumode", 0, 0, 0, f_wildmenumode}, ! {"win_execute", 2, 3, 0, f_win_execute}, ! {"win_findbuf", 1, 1, 0, f_win_findbuf}, ! {"win_getid", 0, 2, 0, f_win_getid}, ! {"win_gotoid", 1, 1, 0, f_win_gotoid}, ! {"win_id2tabwin", 1, 1, 0, f_win_id2tabwin}, ! {"win_id2win", 1, 1, 0, f_win_id2win}, ! {"win_screenpos", 1, 1, 0, f_win_screenpos}, ! {"winbufnr", 1, 1, 0, f_winbufnr}, ! {"wincol", 0, 0, 0, f_wincol}, ! {"winheight", 1, 1, 0, f_winheight}, ! {"winlayout", 0, 1, 0, f_winlayout}, ! {"winline", 0, 0, 0, f_winline}, ! {"winnr", 0, 1, 0, f_winnr}, ! {"winrestcmd", 0, 0, 0, f_winrestcmd}, ! {"winrestview", 1, 1, 0, f_winrestview}, ! {"winsaveview", 0, 0, 0, f_winsaveview}, ! {"winwidth", 1, 1, 0, f_winwidth}, ! {"wordcount", 0, 0, 0, f_wordcount}, ! {"writefile", 2, 3, 0, f_writefile}, ! {"xor", 2, 2, 0, f_xor}, ! }; ! ! // values for f_argtype ! #define FEARG_LAST 1 // base is the last argument ! #define FEARG_2 2 // base is the second argument ! ! /* ! * Methods that call the internal function with the base as one of the ! * arguments. ! */ ! static funcentry_T base_methods[] = ! { ! {"add", 1, 1, 0, f_add}, ! {"append", 1, 1, FEARG_LAST, f_append}, ! {"appendbufline", 2, 2, FEARG_LAST, f_appendbufline}, ! {"assert_equal", 1, 2, FEARG_2, f_assert_equal}, ! {"assert_notequal", 1, 2, FEARG_2, f_assert_notequal}, ! {"copy", 0, 0, 0, f_copy}, ! {"count", 1, 3, 0, f_count}, ! {"empty", 0, 0, 0, f_empty}, ! {"eval", 0, 0, 0, f_eval}, ! {"extend", 1, 2, 0, f_extend}, ! {"filter", 1, 1, 0, f_filter}, ! {"get", 1, 2, 0, f_get}, ! {"has_key", 1, 1, 0, f_has_key}, ! {"index", 1, 3, 0, f_index}, ! {"insert", 1, 2, 0, f_insert}, ! {"items", 0, 0, 0, f_items}, ! {"join", 0, 1, 0, f_join}, ! {"keys", 0, 0, 0, f_keys}, ! {"len", 0, 0, 0, f_len}, ! {"map", 1, 1, 0, f_map}, ! {"max", 0, 0, 0, f_max}, ! {"min", 0, 0, 0, f_min}, ! {"remove", 1, 2, 0, f_remove}, ! {"repeat", 1, 1, 0, f_repeat}, ! {"reverse", 0, 0, 0, f_reverse}, ! {"sort", 0, 2, 0, f_sort}, ! {"split", 0, 2, 0, f_split}, ! {"str2list", 0, 1, 0, f_str2list}, ! {"string", 0, 0, 0, f_string}, ! {"strlen", 0, 0, 0, f_strlen}, ! {"strtrans", 0, 0, 0, f_strtrans}, ! {"strwidth", 0, 0, 0, f_strwidth}, ! {"substitute", 3, 3, 0, f_substitute}, ! {"synIDattr", 1, 2, 0, f_synIDattr}, ! {"synIDtrans", 0, 0, 0, f_synIDtrans}, ! {"system", 0, 1, 0, f_system}, ! {"systemlist", 0, 2, 0, f_systemlist}, ! {"type", 0, 0, 0, f_type}, ! {"uniq", 0, 2, 0, f_uniq}, ! {"values", 0, 0, 0, f_values}, }; #if defined(FEAT_CMDL_COMPL) || defined(PROTO) --- 422,998 ---- // implementation of function } funcentry_T; + // values for f_argtype; zero means it cannot be used as a method + #define FEARG_1 1 // base is the first argument + #define FEARG_2 2 // base is the second argument + #define FEARG_LAST 9 // base is the last argument + static funcentry_T global_functions[] = { #ifdef FEAT_FLOAT ! {"abs", 1, 1, 0, f_abs}, ! {"acos", 1, 1, 0, f_acos}, // WJMc #endif ! {"add", 2, 2, FEARG_1, f_add}, ! {"and", 2, 2, 0, f_and}, ! {"append", 2, 2, FEARG_LAST, f_append}, ! {"appendbufline", 3, 3, FEARG_LAST, f_appendbufline}, ! {"argc", 0, 1, 0, f_argc}, ! {"argidx", 0, 0, 0, f_argidx}, ! {"arglistid", 0, 2, 0, f_arglistid}, ! {"argv", 0, 2, 0, f_argv}, ! #ifdef FEAT_FLOAT ! {"asin", 1, 1, 0, f_asin}, // WJMc ! #endif ! {"assert_beeps", 1, 2, 0, f_assert_beeps}, ! {"assert_equal", 2, 3, FEARG_2, f_assert_equal}, ! {"assert_equalfile", 2, 2, 0, f_assert_equalfile}, ! {"assert_exception", 1, 2, 0, f_assert_exception}, ! {"assert_fails", 1, 3, 0, f_assert_fails}, ! {"assert_false", 1, 2, 0, f_assert_false}, ! {"assert_inrange", 3, 4, 0, f_assert_inrange}, ! {"assert_match", 2, 3, 0, f_assert_match}, ! {"assert_notequal", 2, 3, FEARG_2, f_assert_notequal}, ! {"assert_notmatch", 2, 3, 0, f_assert_notmatch}, ! {"assert_report", 1, 1, 0, f_assert_report}, ! {"assert_true", 1, 2, 0, f_assert_true}, #ifdef FEAT_FLOAT ! {"atan", 1, 1, 0, f_atan}, ! {"atan2", 2, 2, 0, f_atan2}, #endif #ifdef FEAT_BEVAL ! {"balloon_gettext", 0, 0, 0, f_balloon_gettext}, ! {"balloon_show", 1, 1, 0, f_balloon_show}, # if defined(FEAT_BEVAL_TERM) ! {"balloon_split", 1, 1, 0, f_balloon_split}, # endif #endif ! {"browse", 4, 4, 0, f_browse}, ! {"browsedir", 2, 2, 0, f_browsedir}, ! {"bufadd", 1, 1, 0, f_bufadd}, ! {"bufexists", 1, 1, 0, f_bufexists}, ! {"buffer_exists", 1, 1, 0, f_bufexists}, // obsolete ! {"buffer_name", 1, 1, 0, f_bufname}, // obsolete ! {"buffer_number", 1, 1, 0, f_bufnr}, // obsolete ! {"buflisted", 1, 1, 0, f_buflisted}, ! {"bufload", 1, 1, 0, f_bufload}, ! {"bufloaded", 1, 1, 0, f_bufloaded}, ! {"bufname", 1, 1, 0, f_bufname}, ! {"bufnr", 1, 2, 0, f_bufnr}, ! {"bufwinid", 1, 1, 0, f_bufwinid}, ! {"bufwinnr", 1, 1, 0, f_bufwinnr}, ! {"byte2line", 1, 1, 0, f_byte2line}, ! {"byteidx", 2, 2, 0, f_byteidx}, ! {"byteidxcomp", 2, 2, 0, f_byteidxcomp}, ! {"call", 2, 3, 0, f_call}, #ifdef FEAT_FLOAT ! {"ceil", 1, 1, 0, f_ceil}, #endif #ifdef FEAT_JOB_CHANNEL ! {"ch_canread", 1, 1, 0, f_ch_canread}, ! {"ch_close", 1, 1, 0, f_ch_close}, ! {"ch_close_in", 1, 1, 0, f_ch_close_in}, ! {"ch_evalexpr", 2, 3, 0, f_ch_evalexpr}, ! {"ch_evalraw", 2, 3, 0, f_ch_evalraw}, ! {"ch_getbufnr", 2, 2, 0, f_ch_getbufnr}, ! {"ch_getjob", 1, 1, 0, f_ch_getjob}, ! {"ch_info", 1, 1, 0, f_ch_info}, ! {"ch_log", 1, 2, 0, f_ch_log}, ! {"ch_logfile", 1, 2, 0, f_ch_logfile}, ! {"ch_open", 1, 2, 0, f_ch_open}, ! {"ch_read", 1, 2, 0, f_ch_read}, ! {"ch_readblob", 1, 2, 0, f_ch_readblob}, ! {"ch_readraw", 1, 2, 0, f_ch_readraw}, ! {"ch_sendexpr", 2, 3, 0, f_ch_sendexpr}, ! {"ch_sendraw", 2, 3, 0, f_ch_sendraw}, ! {"ch_setoptions", 2, 2, 0, f_ch_setoptions}, ! {"ch_status", 1, 2, 0, f_ch_status}, ! #endif ! {"changenr", 0, 0, 0, f_changenr}, ! {"char2nr", 1, 2, 0, f_char2nr}, ! {"chdir", 1, 1, 0, f_chdir}, ! {"cindent", 1, 1, 0, f_cindent}, ! {"clearmatches", 0, 1, 0, f_clearmatches}, ! {"col", 1, 1, 0, f_col}, #if defined(FEAT_INS_EXPAND) ! {"complete", 2, 2, 0, f_complete}, ! {"complete_add", 1, 1, 0, f_complete_add}, ! {"complete_check", 0, 0, 0, f_complete_check}, ! {"complete_info", 0, 1, 0, f_complete_info}, ! #endif ! {"confirm", 1, 4, 0, f_confirm}, ! {"copy", 1, 1, FEARG_1, f_copy}, ! #ifdef FEAT_FLOAT ! {"cos", 1, 1, 0, f_cos}, ! {"cosh", 1, 1, 0, f_cosh}, ! #endif ! {"count", 2, 4, FEARG_1, f_count}, ! {"cscope_connection",0,3, 0, f_cscope_connection}, ! {"cursor", 1, 3, 0, f_cursor}, #ifdef MSWIN ! {"debugbreak", 1, 1, 0, f_debugbreak}, #endif ! {"deepcopy", 1, 2, 0, f_deepcopy}, ! {"delete", 1, 2, 0, f_delete}, ! {"deletebufline", 2, 3, 0, f_deletebufline}, ! {"did_filetype", 0, 0, 0, f_did_filetype}, ! {"diff_filler", 1, 1, 0, f_diff_filler}, ! {"diff_hlID", 2, 2, 0, f_diff_hlID}, ! {"empty", 1, 1, FEARG_1, f_empty}, ! {"environ", 0, 0, 0, f_environ}, ! {"escape", 2, 2, 0, f_escape}, ! {"eval", 1, 1, FEARG_1, f_eval}, ! {"eventhandler", 0, 0, 0, f_eventhandler}, ! {"executable", 1, 1, 0, f_executable}, ! {"execute", 1, 2, 0, f_execute}, ! {"exepath", 1, 1, 0, f_exepath}, ! {"exists", 1, 1, 0, f_exists}, ! #ifdef FEAT_FLOAT ! {"exp", 1, 1, 0, f_exp}, ! #endif ! {"expand", 1, 3, 0, f_expand}, ! {"expandcmd", 1, 1, 0, f_expandcmd}, ! {"extend", 2, 3, FEARG_1, f_extend}, ! {"feedkeys", 1, 2, 0, f_feedkeys}, ! {"file_readable", 1, 1, 0, f_filereadable}, // obsolete ! {"filereadable", 1, 1, 0, f_filereadable}, ! {"filewritable", 1, 1, 0, f_filewritable}, ! {"filter", 2, 2, FEARG_1, f_filter}, ! {"finddir", 1, 3, 0, f_finddir}, ! {"findfile", 1, 3, 0, f_findfile}, ! #ifdef FEAT_FLOAT ! {"float2nr", 1, 1, 0, f_float2nr}, ! {"floor", 1, 1, 0, f_floor}, ! {"fmod", 2, 2, 0, f_fmod}, ! #endif ! {"fnameescape", 1, 1, 0, f_fnameescape}, ! {"fnamemodify", 2, 2, 0, f_fnamemodify}, ! {"foldclosed", 1, 1, 0, f_foldclosed}, ! {"foldclosedend", 1, 1, 0, f_foldclosedend}, ! {"foldlevel", 1, 1, 0, f_foldlevel}, ! {"foldtext", 0, 0, 0, f_foldtext}, ! {"foldtextresult", 1, 1, 0, f_foldtextresult}, ! {"foreground", 0, 0, 0, f_foreground}, ! {"funcref", 1, 3, 0, f_funcref}, ! {"function", 1, 3, 0, f_function}, ! {"garbagecollect", 0, 1, 0, f_garbagecollect}, ! {"get", 2, 3, FEARG_1, f_get}, ! {"getbufinfo", 0, 1, 0, f_getbufinfo}, ! {"getbufline", 2, 3, 0, f_getbufline}, ! {"getbufvar", 2, 3, 0, f_getbufvar}, ! {"getchangelist", 1, 1, 0, f_getchangelist}, ! {"getchar", 0, 1, 0, f_getchar}, ! {"getcharmod", 0, 0, 0, f_getcharmod}, ! {"getcharsearch", 0, 0, 0, f_getcharsearch}, ! {"getcmdline", 0, 0, 0, f_getcmdline}, ! {"getcmdpos", 0, 0, 0, f_getcmdpos}, ! {"getcmdtype", 0, 0, 0, f_getcmdtype}, ! {"getcmdwintype", 0, 0, 0, f_getcmdwintype}, #if defined(FEAT_CMDL_COMPL) ! {"getcompletion", 2, 3, 0, f_getcompletion}, #endif ! {"getcurpos", 0, 0, 0, f_getcurpos}, ! {"getcwd", 0, 2, 0, f_getcwd}, ! {"getenv", 1, 1, 0, f_getenv}, ! {"getfontname", 0, 1, 0, f_getfontname}, ! {"getfperm", 1, 1, 0, f_getfperm}, ! {"getfsize", 1, 1, 0, f_getfsize}, ! {"getftime", 1, 1, 0, f_getftime}, ! {"getftype", 1, 1, 0, f_getftype}, ! {"getjumplist", 0, 2, 0, f_getjumplist}, ! {"getline", 1, 2, 0, f_getline}, ! {"getloclist", 1, 2, 0, f_getloclist}, ! {"getmatches", 0, 1, 0, f_getmatches}, ! {"getpid", 0, 0, 0, f_getpid}, ! {"getpos", 1, 1, 0, f_getpos}, ! {"getqflist", 0, 1, 0, f_getqflist}, ! {"getreg", 0, 3, 0, f_getreg}, ! {"getregtype", 0, 1, 0, f_getregtype}, ! {"gettabinfo", 0, 1, 0, f_gettabinfo}, ! {"gettabvar", 2, 3, 0, f_gettabvar}, ! {"gettabwinvar", 3, 4, 0, f_gettabwinvar}, ! {"gettagstack", 0, 1, 0, f_gettagstack}, ! {"getwininfo", 0, 1, 0, f_getwininfo}, ! {"getwinpos", 0, 1, 0, f_getwinpos}, ! {"getwinposx", 0, 0, 0, f_getwinposx}, ! {"getwinposy", 0, 0, 0, f_getwinposy}, ! {"getwinvar", 2, 3, 0, f_getwinvar}, ! {"glob", 1, 4, 0, f_glob}, ! {"glob2regpat", 1, 1, 0, f_glob2regpat}, ! {"globpath", 2, 5, 0, f_globpath}, ! {"has", 1, 1, 0, f_has}, ! {"has_key", 2, 2, FEARG_1, f_has_key}, ! {"haslocaldir", 0, 2, 0, f_haslocaldir}, ! {"hasmapto", 1, 3, 0, f_hasmapto}, ! {"highlightID", 1, 1, 0, f_hlID}, // obsolete ! {"highlight_exists",1, 1, 0, f_hlexists}, // obsolete ! {"histadd", 2, 2, 0, f_histadd}, ! {"histdel", 1, 2, 0, f_histdel}, ! {"histget", 1, 2, 0, f_histget}, ! {"histnr", 1, 1, 0, f_histnr}, ! {"hlID", 1, 1, 0, f_hlID}, ! {"hlexists", 1, 1, 0, f_hlexists}, ! {"hostname", 0, 0, 0, f_hostname}, ! {"iconv", 3, 3, 0, f_iconv}, ! {"indent", 1, 1, 0, f_indent}, ! {"index", 2, 4, FEARG_1, f_index}, ! {"input", 1, 3, 0, f_input}, ! {"inputdialog", 1, 3, 0, f_inputdialog}, ! {"inputlist", 1, 1, 0, f_inputlist}, ! {"inputrestore", 0, 0, 0, f_inputrestore}, ! {"inputsave", 0, 0, 0, f_inputsave}, ! {"inputsecret", 1, 2, 0, f_inputsecret}, ! {"insert", 2, 3, FEARG_1, f_insert}, ! {"invert", 1, 1, 0, f_invert}, ! {"isdirectory", 1, 1, 0, f_isdirectory}, #if defined(FEAT_FLOAT) && defined(HAVE_MATH_H) ! {"isinf", 1, 1, 0, f_isinf}, #endif ! {"islocked", 1, 1, 0, f_islocked}, #if defined(FEAT_FLOAT) && defined(HAVE_MATH_H) ! {"isnan", 1, 1, 0, f_isnan}, #endif ! {"items", 1, 1, FEARG_1, f_items}, #ifdef FEAT_JOB_CHANNEL ! {"job_getchannel", 1, 1, 0, f_job_getchannel}, ! {"job_info", 0, 1, 0, f_job_info}, ! {"job_setoptions", 2, 2, 0, f_job_setoptions}, ! {"job_start", 1, 2, 0, f_job_start}, ! {"job_status", 1, 1, 0, f_job_status}, ! {"job_stop", 1, 2, 0, f_job_stop}, ! #endif ! {"join", 1, 2, FEARG_1, f_join}, ! {"js_decode", 1, 1, 0, f_js_decode}, ! {"js_encode", 1, 1, 0, f_js_encode}, ! {"json_decode", 1, 1, 0, f_json_decode}, ! {"json_encode", 1, 1, 0, f_json_encode}, ! {"keys", 1, 1, FEARG_1, f_keys}, ! {"last_buffer_nr", 0, 0, 0, f_last_buffer_nr}, // obsolete ! {"len", 1, 1, FEARG_1, f_len}, ! {"libcall", 3, 3, 0, f_libcall}, ! {"libcallnr", 3, 3, 0, f_libcallnr}, ! {"line", 1, 1, 0, f_line}, ! {"line2byte", 1, 1, 0, f_line2byte}, ! {"lispindent", 1, 1, 0, f_lispindent}, ! {"list2str", 1, 2, 0, f_list2str}, ! {"listener_add", 1, 2, 0, f_listener_add}, ! {"listener_flush", 0, 1, 0, f_listener_flush}, ! {"listener_remove", 1, 1, 0, f_listener_remove}, ! {"localtime", 0, 0, 0, f_localtime}, #ifdef FEAT_FLOAT ! {"log", 1, 1, 0, f_log}, ! {"log10", 1, 1, 0, f_log10}, #endif #ifdef FEAT_LUA ! {"luaeval", 1, 2, 0, f_luaeval}, #endif ! {"map", 2, 2, FEARG_1, f_map}, ! {"maparg", 1, 4, 0, f_maparg}, ! {"mapcheck", 1, 3, 0, f_mapcheck}, ! {"match", 2, 4, 0, f_match}, ! {"matchadd", 2, 5, 0, f_matchadd}, ! {"matchaddpos", 2, 5, 0, f_matchaddpos}, ! {"matcharg", 1, 1, 0, f_matcharg}, ! {"matchdelete", 1, 2, 0, f_matchdelete}, ! {"matchend", 2, 4, 0, f_matchend}, ! {"matchlist", 2, 4, 0, f_matchlist}, ! {"matchstr", 2, 4, 0, f_matchstr}, ! {"matchstrpos", 2, 4, 0, f_matchstrpos}, ! {"max", 1, 1, FEARG_1, f_max}, ! {"min", 1, 1, FEARG_1, f_min}, ! {"mkdir", 1, 3, 0, f_mkdir}, ! {"mode", 0, 1, 0, f_mode}, #ifdef FEAT_MZSCHEME ! {"mzeval", 1, 1, 0, f_mzeval}, #endif ! {"nextnonblank", 1, 1, 0, f_nextnonblank}, ! {"nr2char", 1, 2, 0, f_nr2char}, ! {"or", 2, 2, 0, f_or}, ! {"pathshorten", 1, 1, 0, f_pathshorten}, #ifdef FEAT_PERL ! {"perleval", 1, 1, 0, f_perleval}, #endif #ifdef FEAT_TEXT_PROP ! {"popup_atcursor", 2, 2, 0, f_popup_atcursor}, ! {"popup_beval", 2, 2, 0, f_popup_beval}, ! {"popup_clear", 0, 0, 0, f_popup_clear}, ! {"popup_close", 1, 2, 0, f_popup_close}, ! {"popup_create", 2, 2, 0, f_popup_create}, ! {"popup_dialog", 2, 2, 0, f_popup_dialog}, ! {"popup_filter_menu", 2, 2, 0, f_popup_filter_menu}, ! {"popup_filter_yesno", 2, 2, 0, f_popup_filter_yesno}, ! {"popup_getoptions", 1, 1, 0, f_popup_getoptions}, ! {"popup_getpos", 1, 1, 0, f_popup_getpos}, ! {"popup_getpreview", 0, 0, 0, f_popup_getpreview}, ! {"popup_hide", 1, 1, 0, f_popup_hide}, ! {"popup_locate", 2, 2, 0, f_popup_locate}, ! {"popup_menu", 2, 2, 0, f_popup_menu}, ! {"popup_move", 2, 2, 0, f_popup_move}, ! {"popup_notification", 2, 2, 0, f_popup_notification}, ! {"popup_setoptions", 2, 2, 0, f_popup_setoptions}, ! {"popup_settext", 2, 2, 0, f_popup_settext}, ! {"popup_show", 1, 1, 0, f_popup_show}, #endif #ifdef FEAT_FLOAT ! {"pow", 2, 2, 0, f_pow}, #endif ! {"prevnonblank", 1, 1, 0, f_prevnonblank}, ! {"printf", 1, 19, 0, f_printf}, #ifdef FEAT_JOB_CHANNEL ! {"prompt_setcallback", 2, 2, 0, f_prompt_setcallback}, ! {"prompt_setinterrupt", 2, 2, 0, f_prompt_setinterrupt}, ! {"prompt_setprompt", 2, 2, 0, f_prompt_setprompt}, #endif #ifdef FEAT_TEXT_PROP ! {"prop_add", 3, 3, 0, f_prop_add}, ! {"prop_clear", 1, 3, 0, f_prop_clear}, ! {"prop_list", 1, 2, 0, f_prop_list}, ! {"prop_remove", 1, 3, 0, f_prop_remove}, ! {"prop_type_add", 2, 2, 0, f_prop_type_add}, ! {"prop_type_change", 2, 2, 0, f_prop_type_change}, ! {"prop_type_delete", 1, 2, 0, f_prop_type_delete}, ! {"prop_type_get", 1, 2, 0, f_prop_type_get}, ! {"prop_type_list", 0, 1, 0, f_prop_type_list}, #endif ! {"pumvisible", 0, 0, 0, f_pumvisible}, #ifdef FEAT_PYTHON3 ! {"py3eval", 1, 1, 0, f_py3eval}, #endif #ifdef FEAT_PYTHON ! {"pyeval", 1, 1, 0, f_pyeval}, #endif #if defined(FEAT_PYTHON) || defined(FEAT_PYTHON3) ! {"pyxeval", 1, 1, 0, f_pyxeval}, #endif ! {"range", 1, 3, 0, f_range}, ! {"readdir", 1, 2, 0, f_readdir}, ! {"readfile", 1, 3, 0, f_readfile}, ! {"reg_executing", 0, 0, 0, f_reg_executing}, ! {"reg_recording", 0, 0, 0, f_reg_recording}, ! {"reltime", 0, 2, 0, f_reltime}, ! #ifdef FEAT_FLOAT ! {"reltimefloat", 1, 1, 0, f_reltimefloat}, ! #endif ! {"reltimestr", 1, 1, 0, f_reltimestr}, ! {"remote_expr", 2, 4, 0, f_remote_expr}, ! {"remote_foreground", 1, 1, 0, f_remote_foreground}, ! {"remote_peek", 1, 2, 0, f_remote_peek}, ! {"remote_read", 1, 2, 0, f_remote_read}, ! {"remote_send", 2, 3, 0, f_remote_send}, ! {"remote_startserver", 1, 1, 0, f_remote_startserver}, ! {"remove", 2, 3, FEARG_1, f_remove}, ! {"rename", 2, 2, 0, f_rename}, ! {"repeat", 2, 2, FEARG_1, f_repeat}, ! {"resolve", 1, 1, 0, f_resolve}, ! {"reverse", 1, 1, FEARG_1, f_reverse}, #ifdef FEAT_FLOAT ! {"round", 1, 1, 0, f_round}, #endif #ifdef FEAT_RUBY ! {"rubyeval", 1, 1, 0, f_rubyeval}, #endif ! {"screenattr", 2, 2, 0, f_screenattr}, ! {"screenchar", 2, 2, 0, f_screenchar}, ! {"screenchars", 2, 2, 0, f_screenchars}, ! {"screencol", 0, 0, 0, f_screencol}, ! {"screenpos", 3, 3, 0, f_screenpos}, ! {"screenrow", 0, 0, 0, f_screenrow}, ! {"screenstring", 2, 2, 0, f_screenstring}, ! {"search", 1, 4, 0, f_search}, ! {"searchdecl", 1, 3, 0, f_searchdecl}, ! {"searchpair", 3, 7, 0, f_searchpair}, ! {"searchpairpos", 3, 7, 0, f_searchpairpos}, ! {"searchpos", 1, 4, 0, f_searchpos}, ! {"server2client", 2, 2, 0, f_server2client}, ! {"serverlist", 0, 0, 0, f_serverlist}, ! {"setbufline", 3, 3, 0, f_setbufline}, ! {"setbufvar", 3, 3, 0, f_setbufvar}, ! {"setcharsearch", 1, 1, 0, f_setcharsearch}, ! {"setcmdpos", 1, 1, 0, f_setcmdpos}, ! {"setenv", 2, 2, 0, f_setenv}, ! {"setfperm", 2, 2, 0, f_setfperm}, ! {"setline", 2, 2, 0, f_setline}, ! {"setloclist", 2, 4, 0, f_setloclist}, ! {"setmatches", 1, 2, 0, f_setmatches}, ! {"setpos", 2, 2, 0, f_setpos}, ! {"setqflist", 1, 3, 0, f_setqflist}, ! {"setreg", 2, 3, 0, f_setreg}, ! {"settabvar", 3, 3, 0, f_settabvar}, ! {"settabwinvar", 4, 4, 0, f_settabwinvar}, ! {"settagstack", 2, 3, 0, f_settagstack}, ! {"setwinvar", 3, 3, 0, f_setwinvar}, #ifdef FEAT_CRYPT ! {"sha256", 1, 1, 0, f_sha256}, #endif ! {"shellescape", 1, 2, 0, f_shellescape}, ! {"shiftwidth", 0, 1, 0, f_shiftwidth}, #ifdef FEAT_SIGNS ! {"sign_define", 1, 2, 0, f_sign_define}, ! {"sign_getdefined", 0, 1, 0, f_sign_getdefined}, ! {"sign_getplaced", 0, 2, 0, f_sign_getplaced}, ! {"sign_jump", 3, 3, 0, f_sign_jump}, ! {"sign_place", 4, 5, 0, f_sign_place}, ! {"sign_placelist", 1, 1, 0, f_sign_placelist}, ! {"sign_undefine", 0, 1, 0, f_sign_undefine}, ! {"sign_unplace", 1, 2, 0, f_sign_unplace}, ! {"sign_unplacelist", 1, 2, 0, f_sign_unplacelist}, #endif ! {"simplify", 1, 1, 0, f_simplify}, #ifdef FEAT_FLOAT ! {"sin", 1, 1, 0, f_sin}, ! {"sinh", 1, 1, 0, f_sinh}, #endif ! {"sort", 1, 3, FEARG_1, f_sort}, #ifdef FEAT_SOUND ! {"sound_clear", 0, 0, 0, f_sound_clear}, ! {"sound_playevent", 1, 2, 0, f_sound_playevent}, ! {"sound_playfile", 1, 2, 0, f_sound_playfile}, ! {"sound_stop", 1, 1, 0, f_sound_stop}, ! #endif ! {"soundfold", 1, 1, 0, f_soundfold}, ! {"spellbadword", 0, 1, 0, f_spellbadword}, ! {"spellsuggest", 1, 3, 0, f_spellsuggest}, ! {"split", 1, 3, FEARG_1, f_split}, ! #ifdef FEAT_FLOAT ! {"sqrt", 1, 1, 0, f_sqrt}, ! {"str2float", 1, 1, 0, f_str2float}, ! #endif ! {"str2list", 1, 2, FEARG_1, f_str2list}, ! {"str2nr", 1, 2, 0, f_str2nr}, ! {"strcharpart", 2, 3, 0, f_strcharpart}, ! {"strchars", 1, 2, 0, f_strchars}, ! {"strdisplaywidth", 1, 2, 0, f_strdisplaywidth}, #ifdef HAVE_STRFTIME ! {"strftime", 1, 2, 0, f_strftime}, #endif ! {"strgetchar", 2, 2, 0, f_strgetchar}, ! {"stridx", 2, 3, 0, f_stridx}, ! {"string", 1, 1, FEARG_1, f_string}, ! {"strlen", 1, 1, FEARG_1, f_strlen}, ! {"strpart", 2, 3, 0, f_strpart}, ! {"strridx", 2, 3, 0, f_strridx}, ! {"strtrans", 1, 1, FEARG_1, f_strtrans}, ! {"strwidth", 1, 1, FEARG_1, f_strwidth}, ! {"submatch", 1, 2, 0, f_submatch}, ! {"substitute", 4, 4, FEARG_1, f_substitute}, ! {"swapinfo", 1, 1, 0, f_swapinfo}, ! {"swapname", 1, 1, 0, f_swapname}, ! {"synID", 3, 3, 0, f_synID}, ! {"synIDattr", 2, 3, FEARG_1, f_synIDattr}, ! {"synIDtrans", 1, 1, FEARG_1, f_synIDtrans}, ! {"synconcealed", 2, 2, 0, f_synconcealed}, ! {"synstack", 2, 2, 0, f_synstack}, ! {"system", 1, 2, FEARG_1, f_system}, ! {"systemlist", 1, 2, FEARG_1, f_systemlist}, ! {"tabpagebuflist", 0, 1, 0, f_tabpagebuflist}, ! {"tabpagenr", 0, 1, 0, f_tabpagenr}, ! {"tabpagewinnr", 1, 2, 0, f_tabpagewinnr}, ! {"tagfiles", 0, 0, 0, f_tagfiles}, ! {"taglist", 1, 2, 0, f_taglist}, #ifdef FEAT_FLOAT ! {"tan", 1, 1, 0, f_tan}, ! {"tanh", 1, 1, 0, f_tanh}, #endif ! {"tempname", 0, 0, 0, f_tempname}, #ifdef FEAT_TERMINAL ! {"term_dumpdiff", 2, 3, 0, f_term_dumpdiff}, ! {"term_dumpload", 1, 2, 0, f_term_dumpload}, ! {"term_dumpwrite", 2, 3, 0, f_term_dumpwrite}, ! {"term_getaltscreen", 1, 1, 0, f_term_getaltscreen}, # if defined(FEAT_GUI) || defined(FEAT_TERMGUICOLORS) ! {"term_getansicolors", 1, 1, 0, f_term_getansicolors}, # endif ! {"term_getattr", 2, 2, 0, f_term_getattr}, ! {"term_getcursor", 1, 1, 0, f_term_getcursor}, ! {"term_getjob", 1, 1, 0, f_term_getjob}, ! {"term_getline", 2, 2, 0, f_term_getline}, ! {"term_getscrolled", 1, 1, 0, f_term_getscrolled}, ! {"term_getsize", 1, 1, 0, f_term_getsize}, ! {"term_getstatus", 1, 1, 0, f_term_getstatus}, ! {"term_gettitle", 1, 1, 0, f_term_gettitle}, ! {"term_gettty", 1, 2, 0, f_term_gettty}, ! {"term_list", 0, 0, 0, f_term_list}, ! {"term_scrape", 2, 2, 0, f_term_scrape}, ! {"term_sendkeys", 2, 2, 0, f_term_sendkeys}, # if defined(FEAT_GUI) || defined(FEAT_TERMGUICOLORS) ! {"term_setansicolors", 2, 2, 0, f_term_setansicolors}, # endif ! {"term_setkill", 2, 2, 0, f_term_setkill}, ! {"term_setrestore", 2, 2, 0, f_term_setrestore}, ! {"term_setsize", 3, 3, 0, f_term_setsize}, ! {"term_start", 1, 2, 0, f_term_start}, ! {"term_wait", 1, 2, 0, f_term_wait}, ! #endif ! {"test_alloc_fail", 3, 3, 0, f_test_alloc_fail}, ! {"test_autochdir", 0, 0, 0, f_test_autochdir}, ! {"test_feedinput", 1, 1, 0, f_test_feedinput}, ! {"test_garbagecollect_now", 0, 0, 0, f_test_garbagecollect_now}, ! {"test_garbagecollect_soon", 0, 0, 0, f_test_garbagecollect_soon}, ! {"test_getvalue", 1, 1, 0, f_test_getvalue}, ! {"test_ignore_error", 1, 1, 0, f_test_ignore_error}, ! {"test_null_blob", 0, 0, 0, f_test_null_blob}, #ifdef FEAT_JOB_CHANNEL ! {"test_null_channel", 0, 0, 0, f_test_null_channel}, #endif ! {"test_null_dict", 0, 0, 0, f_test_null_dict}, #ifdef FEAT_JOB_CHANNEL ! {"test_null_job", 0, 0, 0, f_test_null_job}, #endif ! {"test_null_list", 0, 0, 0, f_test_null_list}, ! {"test_null_partial", 0, 0, 0, f_test_null_partial}, ! {"test_null_string", 0, 0, 0, f_test_null_string}, ! {"test_option_not_set", 1, 1, 0, f_test_option_not_set}, ! {"test_override", 2, 2, 0, f_test_override}, ! {"test_refcount", 1, 1, 0, f_test_refcount}, #ifdef FEAT_GUI ! {"test_scrollbar", 3, 3, 0, f_test_scrollbar}, #endif #ifdef FEAT_MOUSE ! {"test_setmouse", 2, 2, 0, f_test_setmouse}, #endif ! {"test_settime", 1, 1, 0, f_test_settime}, #ifdef FEAT_TIMERS ! {"timer_info", 0, 1, 0, f_timer_info}, ! {"timer_pause", 2, 2, 0, f_timer_pause}, ! {"timer_start", 2, 3, 0, f_timer_start}, ! {"timer_stop", 1, 1, 0, f_timer_stop}, ! {"timer_stopall", 0, 0, 0, f_timer_stopall}, ! #endif ! {"tolower", 1, 1, 0, f_tolower}, ! {"toupper", 1, 1, 0, f_toupper}, ! {"tr", 3, 3, 0, f_tr}, ! {"trim", 1, 2, 0, f_trim}, ! #ifdef FEAT_FLOAT ! {"trunc", 1, 1, 0, f_trunc}, ! #endif ! {"type", 1, 1, FEARG_1, f_type}, ! {"undofile", 1, 1, 0, f_undofile}, ! {"undotree", 0, 0, 0, f_undotree}, ! {"uniq", 1, 3, FEARG_1, f_uniq}, ! {"values", 1, 1, FEARG_1, f_values}, ! {"virtcol", 1, 1, 0, f_virtcol}, ! {"visualmode", 0, 1, 0, f_visualmode}, ! {"wildmenumode", 0, 0, 0, f_wildmenumode}, ! {"win_execute", 2, 3, 0, f_win_execute}, ! {"win_findbuf", 1, 1, 0, f_win_findbuf}, ! {"win_getid", 0, 2, 0, f_win_getid}, ! {"win_gotoid", 1, 1, 0, f_win_gotoid}, ! {"win_id2tabwin", 1, 1, 0, f_win_id2tabwin}, ! {"win_id2win", 1, 1, 0, f_win_id2win}, ! {"win_screenpos", 1, 1, 0, f_win_screenpos}, ! {"winbufnr", 1, 1, 0, f_winbufnr}, ! {"wincol", 0, 0, 0, f_wincol}, ! {"winheight", 1, 1, 0, f_winheight}, ! {"winlayout", 0, 1, 0, f_winlayout}, ! {"winline", 0, 0, 0, f_winline}, ! {"winnr", 0, 1, 0, f_winnr}, ! {"winrestcmd", 0, 0, 0, f_winrestcmd}, ! {"winrestview", 1, 1, 0, f_winrestview}, ! {"winsaveview", 0, 0, 0, f_winsaveview}, ! {"winwidth", 1, 1, 0, f_winwidth}, ! {"wordcount", 0, 0, 0, f_wordcount}, ! {"writefile", 2, 3, 0, f_writefile}, ! {"xor", 2, 2, 0, f_xor}, }; #if defined(FEAT_CMDL_COMPL) || defined(PROTO) *************** *** 1098,1126 **** #endif /* FEAT_CMDL_COMPL */ /* ! * Find internal function in table "functions". * Return index, or -1 if not found */ static int ! find_internal_func( ! char_u *name, // name of the function ! funcentry_T *functions) // functions table to use { int first = 0; int last; int cmp; int x; ! if (functions == global_functions) ! last = (int)(sizeof(global_functions) / sizeof(funcentry_T)) - 1; ! else ! last = (int)(sizeof(base_methods) / sizeof(funcentry_T)) - 1; // Find the function name in the table. Binary search. while (first <= last) { x = first + ((unsigned)(last - first) >> 1); ! cmp = STRCMP(name, functions[x].f_name); if (cmp < 0) last = x - 1; else if (cmp > 0) --- 1051,1074 ---- #endif /* FEAT_CMDL_COMPL */ /* ! * Find internal function "name" in table "global_functions". * Return index, or -1 if not found */ static int ! find_internal_func(char_u *name) { int first = 0; int last; int cmp; int x; ! last = (int)(sizeof(global_functions) / sizeof(funcentry_T)) - 1; // Find the function name in the table. Binary search. while (first <= last) { x = first + ((unsigned)(last - first) >> 1); ! cmp = STRCMP(name, global_functions[x].f_name); if (cmp < 0) last = x - 1; else if (cmp > 0) *************** *** 1134,1140 **** int has_internal_func(char_u *name) { ! return find_internal_func(name, global_functions) >= 0; } int --- 1082,1088 ---- int has_internal_func(char_u *name) { ! return find_internal_func(name) >= 0; } int *************** *** 1146,1152 **** { int i; ! i = find_internal_func(name, global_functions); if (i < 0) return ERROR_UNKNOWN; if (argcount < global_functions[i].f_min_argc) --- 1094,1100 ---- { int i; ! i = find_internal_func(name); if (i < 0) return ERROR_UNKNOWN; if (argcount < global_functions[i].f_min_argc) *************** *** 1173,1194 **** int fi; typval_T argv[MAX_FUNC_ARGS + 1]; ! fi = find_internal_func(name, base_methods); ! if (fi < 0) return ERROR_UNKNOWN; ! if (argcount < base_methods[fi].f_min_argc) return ERROR_TOOFEW; ! if (argcount > base_methods[fi].f_max_argc) return ERROR_TOOMANY; ! if (base_methods[fi].f_argtype == FEARG_LAST) { // base value goes last for (i = 0; i < argcount; ++i) argv[i] = argvars[i]; argv[argcount] = *basetv; } ! else if (base_methods[fi].f_argtype == FEARG_2) { // base value goes second argv[0] = argvars[0]; --- 1121,1142 ---- int fi; typval_T argv[MAX_FUNC_ARGS + 1]; ! fi = find_internal_func(name); ! if (fi < 0 || global_functions[fi].f_argtype == 0) return ERROR_UNKNOWN; ! if (argcount + 1 < global_functions[fi].f_min_argc) return ERROR_TOOFEW; ! if (argcount + 1 > global_functions[fi].f_max_argc) return ERROR_TOOMANY; ! if (global_functions[fi].f_argtype == FEARG_LAST) { // base value goes last for (i = 0; i < argcount; ++i) argv[i] = argvars[i]; argv[argcount] = *basetv; } ! else if (global_functions[fi].f_argtype == FEARG_2) { // base value goes second argv[0] = argvars[0]; *************** *** 1198,1210 **** } else { argv[0] = *basetv; for (i = 0; i < argcount; ++i) argv[i + 1] = argvars[i]; } argv[argcount + 1].v_type = VAR_UNKNOWN; ! base_methods[fi].f_func(argv, rettv); return ERROR_NONE; } --- 1146,1159 ---- } else { + // FEARG_1: base value goes first argv[0] = *basetv; for (i = 0; i < argcount; ++i) argv[i + 1] = argvars[i]; } argv[argcount + 1].v_type = VAR_UNKNOWN; ! global_functions[fi].f_func(argv, rettv); return ERROR_NONE; } *** ../vim-8.1.1814/src/version.c 2019-08-04 21:11:48.558856798 +0200 --- src/version.c 2019-08-04 21:30:40.809229997 +0200 *************** *** 775,776 **** --- 775,778 ---- { /* Add new patch number below this line */ + /**/ + 1815, /**/ -- How To Keep A Healthy Level Of Insanity: 1. At lunch time, sit in your parked car with sunglasses on and point a hair dryer at passing cars. See if they slow down. /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\ /// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\ \\\ an exciting new programming language -- http://www.Zimbu.org /// \\\ help me help AIDS victims -- http://ICCF-Holland.org ///