From 4c93aff20f228d0dfca11f4793eb2c8895d4984c Mon Sep 17 00:00:00 2001 From: Bram Moolenaar Date: Mon, 31 Jan 2022 11:29:51 +0000 Subject: [PATCH 01/28] patch 8.2.4267: unused entry in keymap enum Problem: Unused entry in keymap enum. Solution: Remove the entry. --- src/keymap.h | 7 +++---- src/version.c | 2 ++ 2 files changed, 5 insertions(+), 4 deletions(-) diff --git a/src/keymap.h b/src/keymap.h index 12268dde59..85bf7d0b50 100644 --- a/src/keymap.h +++ b/src/keymap.h @@ -150,9 +150,7 @@ */ enum key_extra { - KE_NAME = 3 // name of this terminal entry - - , KE_S_UP = 4 // shift-up + KE_S_UP = 4 // shift-up , KE_S_DOWN = 5 // shift-down , KE_S_F1 = 6 // shifted function keys @@ -253,7 +251,8 @@ enum key_extra , KE_CSI = 81 // CSI typed directly , KE_SNR = 82 // , KE_PLUG = 83 // - , KE_CMDWIN = 84 // open command-line window from Command-line Mode + , KE_CMDWIN = 84 // open command-line window from Command-line + // Mode , KE_C_LEFT = 85 // control-left , KE_C_RIGHT = 86 // control-right diff --git a/src/version.c b/src/version.c index ca506ad14c..382c84a14d 100644 --- a/src/version.c +++ b/src/version.c @@ -750,6 +750,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ +/**/ + 4267, /**/ 4266, /**/ From 44d1f89c241c611a0904dbbca784facfa13b7916 Mon Sep 17 00:00:00 2001 From: ichizok Date: Mon, 31 Jan 2022 11:38:53 +0000 Subject: [PATCH 02/28] patch 8.2.4268: CI log output is long Problem: CI log output is long. Solution: Group output in sections. (Ozaki Kiichi, closes #9670) --- .github/workflows/ci.yml | 9 ++++++--- src/version.c | 2 ++ 2 files changed, 8 insertions(+), 3 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 2c0857ca53..038fec5b68 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -530,16 +530,18 @@ jobs: call "%VCVARSALL%" ${{ matrix.vcarch }} cd src echo. - echo %COL_GREEN%vim version:%COL_RESET% + echo ::group::%COL_GREEN%Vim version:%COL_RESET% .\vim --version || exit 1 + echo ::endgroup:: echo %COL_GREEN%Start testing vim in background.%COL_RESET% start cmd /c "cd ..\src2\testdir & nmake -nologo -f Make_dos.mak VIMPROG=..\..\src\vim > nul & echo done>done.txt" - echo %COL_GREEN%Test gvim:%COL_RESET% + echo ::group::%COL_GREEN%Test gvim:%COL_RESET% cd testdir nmake -nologo -f Make_dos.mak VIMPROG=..\gvim || exit 1 cd .. + echo ::endgroup:: echo %COL_GREEN%Wait for vim tests to finish.%COL_RESET% cd ..\src2\testdir @@ -552,10 +554,11 @@ jobs: set timeout=1 :exitloop - echo %COL_GREEN%Test results of vim:%COL_RESET% + echo ::group::%COL_GREEN%Test results of vim:%COL_RESET% if exist messages type messages nmake -nologo -f Make_dos.mak report VIMPROG=..\..\src\vim || exit 1 if "%timeout%"=="1" ( echo %COL_RED%Timed out.%COL_RESET% exit 1 ) + echo ::endgroup:: diff --git a/src/version.c b/src/version.c index 382c84a14d..abc67424c6 100644 --- a/src/version.c +++ b/src/version.c @@ -750,6 +750,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ +/**/ + 4268, /**/ 4267, /**/ From 48a604845e33399893d6bf293e71bcd2a412800d Mon Sep 17 00:00:00 2001 From: Bram Moolenaar Date: Mon, 31 Jan 2022 11:44:48 +0000 Subject: [PATCH 03/28] patch 8.2.4269: Coverity warns for using a NULL pointer Problem: Coverity warns for using a NULL pointer. Solution: Check for "name" to not be NULL. --- src/userfunc.c | 3 ++- src/version.c | 2 ++ 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/src/userfunc.c b/src/userfunc.c index 747e4d4778..371cfd328a 100644 --- a/src/userfunc.c +++ b/src/userfunc.c @@ -4232,7 +4232,8 @@ define_function(exarg_T *eap, char_u *name_arg, garray_T *lines_to_free) name = prefixed; } } - else if (vim9script && vim_strchr(name, AUTOLOAD_CHAR) != NULL) + else if (vim9script && name != NULL + && vim_strchr(name, AUTOLOAD_CHAR) != NULL) { emsg(_(e_cannot_use_name_with_hash_in_vim9_script_use_export_instead)); goto ret_free; diff --git a/src/version.c b/src/version.c index abc67424c6..87f3845626 100644 --- a/src/version.c +++ b/src/version.c @@ -750,6 +750,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ +/**/ + 4269, /**/ 4268, /**/ From 672776dbe8427876ef4bfce84520712df87b6eb1 Mon Sep 17 00:00:00 2001 From: ichizok Date: Mon, 31 Jan 2022 12:27:18 +0000 Subject: [PATCH 04/28] patch 8.2.4270: generating nv_cmdidxs.h requires building Vim twice Problem: Generating nv_cmdidxs.h requires building Vim twice. Solution: Move the table into a separate file and use a separate executable to extract the command characters. (Ozaki Kiichi, closes #9669) --- Filelist | 2 + runtime/doc/builtin.txt | 6 - runtime/doc/usr_41.txt | 1 - src/Make_cyg_ming.mak | 16 +- src/Make_mvc.mak | 16 +- src/Make_vms.mms | 2 +- src/Makefile | 22 +-- src/create_nvcmdidxs.c | 38 +++++ src/create_nvcmdidxs.vim | 110 ++++++-------- src/evalfunc.c | 2 - src/normal.c | 315 +-------------------------------------- src/nv_cmds.h | 310 ++++++++++++++++++++++++++++++++++++++ src/proto/normal.pro | 1 - src/version.c | 2 + 14 files changed, 434 insertions(+), 409 deletions(-) create mode 100644 src/create_nvcmdidxs.c create mode 100644 src/nv_cmds.h diff --git a/Filelist b/Filelist index 15d000e4b8..e636495660 100644 --- a/Filelist +++ b/Filelist @@ -114,6 +114,7 @@ SRC_ALL = \ src/netbeans.c \ src/normal.c \ src/nv_cmdidxs.h \ + src/nv_cmds.h \ src/ops.c \ src/option.c \ src/option.h \ @@ -444,6 +445,7 @@ SRC_UNIX = \ src/configure \ src/configure.ac \ src/create_cmdidxs.vim \ + src/create_nvcmdidxs.c \ src/create_nvcmdidxs.vim \ src/gui_at_fs.c \ src/gui_at_sb.c \ diff --git a/runtime/doc/builtin.txt b/runtime/doc/builtin.txt index 33bb907378..943cd51758 100644 --- a/runtime/doc/builtin.txt +++ b/runtime/doc/builtin.txt @@ -292,7 +292,6 @@ inputrestore() Number restore typeahead inputsave() Number save and clear typeahead inputsecret({prompt} [, {text}]) String like input() but hiding the text insert({object}, {item} [, {idx}]) List insert {item} in {object} [before {idx}] -internal_get_nv_cmdchar({idx}) Number command character at this index interrupt() none interrupt script execution invert({expr}) Number bitwise invert isdirectory({directory}) Number |TRUE| if {directory} is a directory @@ -4618,11 +4617,6 @@ insert({object}, {item} [, {idx}]) *insert()* Can also be used as a |method|: > mylist->insert(item) -< - *internal_get_nv_cmdchar()* -internal_get_nv_cmdchar({idx}) - Return the normal/visual mode command character at the - specified index. To be used only during the Vim build process. interrupt() *interrupt()* Interrupt script execution. It works more or less like the diff --git a/runtime/doc/usr_41.txt b/runtime/doc/usr_41.txt index f1d88b9773..ebfbbe6bba 100644 --- a/runtime/doc/usr_41.txt +++ b/runtime/doc/usr_41.txt @@ -1110,7 +1110,6 @@ Testing: *test-functions* assert_nobeep() assert that a command does not cause a beep assert_fails() assert that a command fails assert_report() report a test failure - internal_get_nv_cmdchar() normal/visual command character at an index test_alloc_fail() make memory allocation fail test_autochdir() enable 'autochdir' during startup test_override() test with Vim internal overrides diff --git a/src/Make_cyg_ming.mak b/src/Make_cyg_ming.mak index 46e95b44b4..ab71b26f14 100644 --- a/src/Make_cyg_ming.mak +++ b/src/Make_cyg_ming.mak @@ -1145,17 +1145,17 @@ endif # If this fails because you don't have Vim yet, first build and install Vim # without changes. cmdidxs: ex_cmds.h - vim --clean -X --not-a-term -u create_cmdidxs.vim + vim --clean -N -X --not-a-term -u create_cmdidxs.vim -c quit # Run vim script to generate the normal/visual mode command lookup table. # This only needs to be run when a new normal/visual mode command has been # added. If this fails because you don't have Vim yet: -# - change nv_cmds[] in normal.c to add the new normal/visual mode command. -# - build Vim -# - run "make nvcmdidxs" using the new Vim to generate nv_cmdidxs.h -# - rebuild Vim to use the newly generated nv_cmdidxs.h file. -nvcmdidxs: normal.c - ./$(TARGET) --clean -X --not-a-term -u create_nvcmdidxs.vim +# - change nv_cmds[] in nv_cmds.h to add the new normal/visual mode command. +# - run "make nvcmdidxs" to generate nv_cmdidxs.h +nvcmdidxs: nv_cmds.h + $(CC) $(CFLAGS) -o create_nvcmdidxs.exe create_nvcmdidxs.c $(LIB) + vim --clean -N -X --not-a-term -u create_nvcmdidxs.vim -c quit + -$(DEL) create_nvcmdidxs.exe ########################################################################### INCL = vim.h alloc.h ascii.h ex_cmds.h feature.h errors.h globals.h \ @@ -1219,7 +1219,7 @@ $(OUTDIR)/hardcopy.o: hardcopy.c $(INCL) version.h $(OUTDIR)/misc1.o: misc1.c $(INCL) version.h -$(OUTDIR)/normal.o: normal.c $(INCL) nv_cmdidxs.h +$(OUTDIR)/normal.o: normal.c $(INCL) nv_cmdidxs.h nv_cmds.h $(OUTDIR)/netbeans.o: netbeans.c $(INCL) version.h diff --git a/src/Make_mvc.mak b/src/Make_mvc.mak index 7852150563..2725e74370 100644 --- a/src/Make_mvc.mak +++ b/src/Make_mvc.mak @@ -1444,17 +1444,17 @@ clean: testclean # If this fails because you don't have Vim yet, first build and install Vim # without changes. cmdidxs: ex_cmds.h - vim --clean -X --not-a-term -u create_cmdidxs.vim + vim --clean -N -X --not-a-term -u create_cmdidxs.vim -c quit # Run vim script to generate the normal/visual mode command lookup table. # This only needs to be run when a new normal/visual mode command has been # added. If this fails because you don't have Vim yet: -# - change nv_cmds[] in normal.c to add the new normal/visual mode command. -# - build Vim -# - run "make nvcmdidxs" using the new Vim to generate nv_cmdidxs.h -# - rebuild Vim to use the newly generated nv_cmdidxs.h file. -nvcmdidxs: normal.c - .\$(VIM) --clean -X --not-a-term -u create_nvcmdidxs.vim +# - change nv_cmds[] in nv_cmds.h to add the new normal/visual mode command. +# - run "make nvcmdidxs" to generate nv_cmdidxs.h +nvcmdidxs: nv_cmds.h + $(CC) /nologo -I. -Iproto -DNDEBUG create_nvcmdidxs.c -link -subsystem:$(SUBSYSTEM_TOOLS) + vim --clean -N -X --not-a-term -u create_nvcmdidxs.vim -c quit + -del create_nvcmdidxs.exe test: cd testdir @@ -1719,7 +1719,7 @@ $(OUTDIR)/netbeans.obj: $(OUTDIR) netbeans.c $(NBDEBUG_SRC) $(INCL) version.h $(OUTDIR)/channel.obj: $(OUTDIR) channel.c $(INCL) -$(OUTDIR)/normal.obj: $(OUTDIR) normal.c $(INCL) nv_cmdidxs.h +$(OUTDIR)/normal.obj: $(OUTDIR) normal.c $(INCL) nv_cmdidxs.h nv_cmds.h $(OUTDIR)/option.obj: $(OUTDIR) option.c $(INCL) optiondefs.h diff --git a/src/Make_vms.mms b/src/Make_vms.mms index 0569054f65..f1689bef3c 100644 --- a/src/Make_vms.mms +++ b/src/Make_vms.mms @@ -977,7 +977,7 @@ mbyte.obj : mbyte.c vim.h [.auto]config.h feature.h os_unix.h \ normal.obj : normal.c vim.h [.auto]config.h feature.h os_unix.h \ ascii.h keymap.h termdefs.h macros.h structs.h regexp.h \ gui.h beval.h [.proto]gui_beval.pro option.h ex_cmds.h proto.h \ - errors.h globals.h nv_cmdidxs.h + errors.h globals.h nv_cmdidxs.h nv_cmds.h ops.obj : ops.c vim.h [.auto]config.h feature.h os_unix.h \ ascii.h keymap.h termdefs.h macros.h structs.h regexp.h gui.h beval.h \ [.proto]gui_beval.pro option.h ex_cmds.h proto.h errors.h globals.h diff --git a/src/Makefile b/src/Makefile index 549b8177b7..96ec34a6c3 100644 --- a/src/Makefile +++ b/src/Makefile @@ -2141,19 +2141,21 @@ autoconf: # This only needs to be run when a command name has been added or changed. # If this fails because you don't have Vim yet, first build and install Vim # without changes. +# This requires a "vim" executable with the +eval feature. cmdidxs: ex_cmds.h - vim --clean -X --not-a-term -u create_cmdidxs.vim + vim --clean -N -X --not-a-term -u create_cmdidxs.vim -c quit # Run vim script to generate the normal/visual mode command lookup table. # This only needs to be run when a new normal/visual mode command has been -# added. If this fails because you don't have Vim yet: -# - change nv_cmds[] in normal.c to add the new normal/visual mode command. -# - build Vim -# - run "make nvcmdidxs" using the new Vim to generate nv_cmdidxs.h -# - rebuild Vim to use the newly generated nv_cmdidxs.h file. -nvcmdidxs: normal.c - ./$(VIMTARGET) --clean -X --not-a-term -u create_nvcmdidxs.vim - +# added. +# This requires a "vim" executable with the +eval feature. +# If this fails because you don't have Vim yet: +# - change nv_cmds[] in nv_cmds.h to add the new normal/visual mode command. +# - run "make nvcmdidxs" to generate nv_cmdidxs.h +nvcmdidxs: auto/config.mk nv_cmds.h + $(CC) -I$(srcdir) $(ALL_CFLAGS) create_nvcmdidxs.c -o create_nvcmdidxs + vim --clean -N -X --not-a-term -u create_nvcmdidxs.vim -c quit + -rm -f create_nvcmdidxs # The normal command to compile a .c file to its .o file. # Without or with ALL_CFLAGS. @@ -4012,7 +4014,7 @@ objects/move.o: move.c vim.h protodef.h auto/config.h feature.h os_unix.h \ objects/normal.o: normal.c vim.h protodef.h auto/config.h feature.h os_unix.h \ auto/osdef.h ascii.h keymap.h termdefs.h macros.h option.h beval.h \ proto/gui_beval.pro structs.h regexp.h gui.h alloc.h ex_cmds.h spell.h \ - proto.h globals.h errors.h nv_cmdidxs.h + proto.h globals.h errors.h nv_cmdidxs.h nv_cmds.h objects/ops.o: ops.c vim.h protodef.h auto/config.h feature.h os_unix.h \ auto/osdef.h ascii.h keymap.h termdefs.h macros.h option.h beval.h \ proto/gui_beval.pro structs.h regexp.h gui.h alloc.h ex_cmds.h spell.h \ diff --git a/src/create_nvcmdidxs.c b/src/create_nvcmdidxs.c new file mode 100644 index 0000000000..1d084f5657 --- /dev/null +++ b/src/create_nvcmdidxs.c @@ -0,0 +1,38 @@ +/* vi:set ts=8 sts=4 sw=4 noet: + * + * VIM - Vi IMproved by Bram Moolenaar et al. + * + * 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. + */ + +/* + * create_nvcmdidxs.c: helper program for `make nvcmdidxs` + * + * This outputs the list of command characters from the nv_cmds table in + * decimal form, one per line. + */ + +#include "vim.h" + +// Declare nv_cmds[]. +#include "nv_cmds.h" + +#include + +int main(void) +{ + size_t i; + + for (i = 0; i < NV_CMDS_SIZE; i++) + { + int cmdchar = nv_cmds[i]; + + // Special keys are negative, use the negated value for sorting. + if (cmdchar < 0) + cmdchar = -cmdchar; + printf("%d\n", cmdchar); + } + return 0; +} diff --git a/src/create_nvcmdidxs.vim b/src/create_nvcmdidxs.vim index 2dd5fdb546..13192761b3 100644 --- a/src/create_nvcmdidxs.vim +++ b/src/create_nvcmdidxs.vim @@ -1,72 +1,60 @@ -vim9script +" This script generates the table nv_cmd_idx[] which contains the index in +" nv_cmds[] table (normal.c) for each of the command character supported in +" normal/visual mode. +" This is used to speed up the command lookup in nv_cmds[]. +" +" Script should be run using "make nvcmdidxs", every time the nv_cmds[] table +" in src/nv_cmds.h changes. +" +" This is written in legacy Vim script so that it can be run by a slightly +" older Vim version. -# This script generates the table nv_cmd_idx[] which contains the index in -# nv_cmds[] table (normal.c) for each of the command character supported in -# normal/visual mode. -# This is used to speed up the command lookup in nv_cmds[]. -# -# Script should be run using "make nvcmdidxs", every time the nv_cmds[] table -# in src/normal.c changes. +" Generate the table of normal/visual mode command characters and their +" corresponding index. +let cmd = 'create_nvcmdidxs' +if has('unix') + let cmd = './' .. cmd +endif +let nv_cmdtbl = systemlist(cmd)->map({i, ch -> {'idx': i, 'cmdchar': ch}}) -def Create_nvcmdidxs_table() - var nv_cmdtbl: list> = [] +" sort the table by the command character +call sort(nv_cmdtbl, {a, b -> a.cmdchar - b.cmdchar}) - # Generate the table of normal/visual mode command characters and their - # corresponding index. - var idx: number = 0 - var ch: number - while true - ch = internal_get_nv_cmdchar(idx) - if ch == -1 - break - endif - add(nv_cmdtbl, {idx: idx, cmdchar: ch}) - idx += 1 - endwhile +" Compute the highest index upto which the command character can be directly +" used as an index. +let nv_max_linear = 0 +for i in range(nv_cmdtbl->len()) + if i != nv_cmdtbl[i].cmdchar + let nv_max_linear = i - 1 + break + endif +endfor - # sort the table by the command character - sort(nv_cmdtbl, (a, b) => a.cmdchar - b.cmdchar) +" Generate a header file with the table +let output =<< trim END + /* + * Automatically generated code by the create_nvcmdidxs.vim script. + * + * Table giving the index in nv_cmds[] to lookup based on + * the command character. + */ - # Compute the highest index upto which the command character can be directly - # used as an index. - var nv_max_linear: number = 0 - for i in range(nv_cmdtbl->len()) - if i != nv_cmdtbl[i].cmdchar - nv_max_linear = i - 1 - break - endif - endfor + // nv_cmd_idx[] => nv_cmds[] index + static const unsigned short nv_cmd_idx[] = + { +END - # Generate a header file with the table - var output: list =<< trim END - /* - * Automatically generated code by the create_nvcmdidxs.vim script. - * - * Table giving the index in nv_cmds[] to lookup based on - * the command character. - */ +" Add each command character in comment and the corresponding index +let output += nv_cmdtbl->map({_, v -> + \ printf(' /* %5d */ %3d,', v.cmdchar, v.idx)}) - // nv_cmd_idx[] => nv_cmds[] index - static const unsigned short nv_cmd_idx[] = - { - END +let output += ['};', '', + \ '// The highest index for which', + \ '// nv_cmds[idx].cmd_char == nv_cmd_idx[nv_cmds[idx].cmd_char]'] - # Add each command character in comment and the corresponding index - var tbl: list = mapnew(nv_cmdtbl, (k, v) => - ' /* ' .. printf('%5d', v.cmdchar) .. ' */ ' .. - printf('%3d', v.idx) .. ',' - ) - output += tbl +let output += ['static const int nv_max_linear = ' .. nv_max_linear .. ';'] - output += [ '};', '', - '// The highest index for which', - '// nv_cmds[idx].cmd_char == nv_cmd_idx[nv_cmds[idx].cmd_char]'] - output += ['static const int nv_max_linear = ' .. nv_max_linear .. ';'] - - writefile(output, "nv_cmdidxs.h") -enddef - -Create_nvcmdidxs_table() +call writefile(output, "nv_cmdidxs.h") quit -# vim: shiftwidth=2 sts=2 expandtab +" vim: shiftwidth=2 sts=2 expandtab diff --git a/src/evalfunc.c b/src/evalfunc.c index 2de7016a82..500ae284b2 100644 --- a/src/evalfunc.c +++ b/src/evalfunc.c @@ -1735,8 +1735,6 @@ static funcentry_T global_functions[] = ret_string, f_inputsecret}, {"insert", 2, 3, FEARG_1, arg23_insert, ret_first_arg, f_insert}, - {"internal_get_nv_cmdchar", 1, 1, FEARG_1, arg1_number, - ret_number, f_internal_get_nv_cmdchar}, {"interrupt", 0, 0, 0, NULL, ret_void, f_interrupt}, {"invert", 1, 1, FEARG_1, arg1_number, diff --git a/src/normal.c b/src/normal.c index 2e8521ce00..fd6218472e 100644 --- a/src/normal.c +++ b/src/normal.c @@ -1,6 +1,6 @@ /* vi:set ts=8 sts=4 sw=4 noet: * - * VIM - Vi IMproved by Bram Moolenaar + * VIM - Vi IMproved by Bram Moolenaar et al. * * Do ":help uganda" in Vim to read copying and usage conditions. * Do ":help credits" in Vim to see a list of people who contributed. @@ -127,320 +127,13 @@ static void nv_drop(cmdarg_T *cap); #endif static void nv_cursorhold(cmdarg_T *cap); -#ifdef FEAT_GUI -#define NV_VER_SCROLLBAR nv_ver_scrollbar -#define NV_HOR_SCROLLBAR nv_hor_scrollbar -#else -#define NV_VER_SCROLLBAR nv_error -#define NV_HOR_SCROLLBAR nv_error -#endif - -#ifdef FEAT_GUI_TABLINE -#define NV_TABLINE nv_tabline -#define NV_TABMENU nv_tabmenu -#else -#define NV_TABLINE nv_error -#define NV_TABMENU nv_error -#endif - -#ifdef FEAT_NETBEANS_INTG -#define NV_NBCMD nv_nbcmd -#else -#define NV_NBCMD nv_error -#endif - -#ifdef FEAT_DND -#define NV_DROP nv_drop -#else -#define NV_DROP nv_error -#endif - -/* - * Function to be called for a Normal or Visual mode command. - * The argument is a cmdarg_T. - */ -typedef void (*nv_func_T)(cmdarg_T *cap); - -// Values for cmd_flags. -#define NV_NCH 0x01 // may need to get a second char -#define NV_NCH_NOP (0x02|NV_NCH) // get second char when no operator pending -#define NV_NCH_ALW (0x04|NV_NCH) // always get a second char -#define NV_LANG 0x08 // second char needs language adjustment - -#define NV_SS 0x10 // may start selection -#define NV_SSS 0x20 // may start selection with shift modifier -#define NV_STS 0x40 // may stop selection without shift modif. -#define NV_RL 0x80 // 'rightleft' modifies command -#define NV_KEEPREG 0x100 // don't clear regname -#define NV_NCW 0x200 // not allowed in command-line window - -/* - * Generally speaking, every Normal mode command should either clear any - * pending operator (with *clearop*()), or set the motion type variable - * oap->motion_type. - * - * When a cursor motion command is made, it is marked as being a character or - * line oriented motion. Then, if an operator is in effect, the operation - * becomes character or line oriented accordingly. - */ - -/* - * This table contains one entry for every Normal or Visual mode command. - * The order doesn't matter, this will be sorted by the create_nvcmdidx.vim - * script to generate the nv_cmd_idx[] lookup table. - * It is faster when all keys from zero to '~' are present. - * - * After changing the "nv_cmds" table: - * 1. Build Vim with "make" - * 2. Run "make nvcmdidxs" to re-generate the nv_cmdidxs.h file. - * 3. Build Vim with "make" to use the newly generated index table. - */ -static const struct nv_cmd -{ - int cmd_char; // (first) command character - nv_func_T cmd_func; // function for this command - short_u cmd_flags; // NV_ flags - short cmd_arg; // value for ca.arg -} nv_cmds[] = -{ - {NUL, nv_error, 0, 0}, - {Ctrl_A, nv_addsub, 0, 0}, - {Ctrl_B, nv_page, NV_STS, BACKWARD}, - {Ctrl_C, nv_esc, 0, TRUE}, - {Ctrl_D, nv_halfpage, 0, 0}, - {Ctrl_E, nv_scroll_line, 0, TRUE}, - {Ctrl_F, nv_page, NV_STS, FORWARD}, - {Ctrl_G, nv_ctrlg, 0, 0}, - {Ctrl_H, nv_ctrlh, 0, 0}, - {Ctrl_I, nv_pcmark, 0, 0}, - {NL, nv_down, 0, FALSE}, - {Ctrl_K, nv_error, 0, 0}, - {Ctrl_L, nv_clear, 0, 0}, - {CAR, nv_down, 0, TRUE}, - {Ctrl_N, nv_down, NV_STS, FALSE}, - {Ctrl_O, nv_ctrlo, 0, 0}, - {Ctrl_P, nv_up, NV_STS, FALSE}, - {Ctrl_Q, nv_visual, 0, FALSE}, - {Ctrl_R, nv_redo_or_register, 0, 0}, - {Ctrl_S, nv_ignore, 0, 0}, - {Ctrl_T, nv_tagpop, NV_NCW, 0}, - {Ctrl_U, nv_halfpage, 0, 0}, - {Ctrl_V, nv_visual, 0, FALSE}, - {Ctrl_W, nv_window, 0, 0}, - {Ctrl_X, nv_addsub, 0, 0}, - {Ctrl_Y, nv_scroll_line, 0, FALSE}, - {Ctrl_Z, nv_suspend, 0, 0}, - {ESC, nv_esc, 0, FALSE}, - {Ctrl_BSL, nv_normal, NV_NCH_ALW, 0}, - {Ctrl_RSB, nv_ident, NV_NCW, 0}, - {Ctrl_HAT, nv_hat, NV_NCW, 0}, - {Ctrl__, nv_error, 0, 0}, - {' ', nv_right, 0, 0}, - {'!', nv_operator, 0, 0}, - {'"', nv_regname, NV_NCH_NOP|NV_KEEPREG, 0}, - {'#', nv_ident, 0, 0}, - {'$', nv_dollar, 0, 0}, - {'%', nv_percent, 0, 0}, - {'&', nv_optrans, 0, 0}, - {'\'', nv_gomark, NV_NCH_ALW, TRUE}, - {'(', nv_brace, 0, BACKWARD}, - {')', nv_brace, 0, FORWARD}, - {'*', nv_ident, 0, 0}, - {'+', nv_down, 0, TRUE}, - {',', nv_csearch, 0, TRUE}, - {'-', nv_up, 0, TRUE}, - {'.', nv_dot, NV_KEEPREG, 0}, - {'/', nv_search, 0, FALSE}, - {'0', nv_beginline, 0, 0}, - {'1', nv_ignore, 0, 0}, - {'2', nv_ignore, 0, 0}, - {'3', nv_ignore, 0, 0}, - {'4', nv_ignore, 0, 0}, - {'5', nv_ignore, 0, 0}, - {'6', nv_ignore, 0, 0}, - {'7', nv_ignore, 0, 0}, - {'8', nv_ignore, 0, 0}, - {'9', nv_ignore, 0, 0}, - {':', nv_colon, 0, 0}, - {';', nv_csearch, 0, FALSE}, - {'<', nv_operator, NV_RL, 0}, - {'=', nv_operator, 0, 0}, - {'>', nv_operator, NV_RL, 0}, - {'?', nv_search, 0, FALSE}, - {'@', nv_at, NV_NCH_NOP, FALSE}, - {'A', nv_edit, 0, 0}, - {'B', nv_bck_word, 0, 1}, - {'C', nv_abbrev, NV_KEEPREG, 0}, - {'D', nv_abbrev, NV_KEEPREG, 0}, - {'E', nv_wordcmd, 0, TRUE}, - {'F', nv_csearch, NV_NCH_ALW|NV_LANG, BACKWARD}, - {'G', nv_goto, 0, TRUE}, - {'H', nv_scroll, 0, 0}, - {'I', nv_edit, 0, 0}, - {'J', nv_join, 0, 0}, - {'K', nv_ident, 0, 0}, - {'L', nv_scroll, 0, 0}, - {'M', nv_scroll, 0, 0}, - {'N', nv_next, 0, SEARCH_REV}, - {'O', nv_open, 0, 0}, - {'P', nv_put, 0, 0}, - {'Q', nv_exmode, NV_NCW, 0}, - {'R', nv_Replace, 0, FALSE}, - {'S', nv_subst, NV_KEEPREG, 0}, - {'T', nv_csearch, NV_NCH_ALW|NV_LANG, BACKWARD}, - {'U', nv_Undo, 0, 0}, - {'V', nv_visual, 0, FALSE}, - {'W', nv_wordcmd, 0, TRUE}, - {'X', nv_abbrev, NV_KEEPREG, 0}, - {'Y', nv_abbrev, NV_KEEPREG, 0}, - {'Z', nv_Zet, NV_NCH_NOP|NV_NCW, 0}, - {'[', nv_brackets, NV_NCH_ALW, BACKWARD}, - {'\\', nv_error, 0, 0}, - {']', nv_brackets, NV_NCH_ALW, FORWARD}, - {'^', nv_beginline, 0, BL_WHITE | BL_FIX}, - {'_', nv_lineop, 0, 0}, - {'`', nv_gomark, NV_NCH_ALW, FALSE}, - {'a', nv_edit, NV_NCH, 0}, - {'b', nv_bck_word, 0, 0}, - {'c', nv_operator, 0, 0}, - {'d', nv_operator, 0, 0}, - {'e', nv_wordcmd, 0, FALSE}, - {'f', nv_csearch, NV_NCH_ALW|NV_LANG, FORWARD}, - {'g', nv_g_cmd, NV_NCH_ALW, FALSE}, - {'h', nv_left, NV_RL, 0}, - {'i', nv_edit, NV_NCH, 0}, - {'j', nv_down, 0, FALSE}, - {'k', nv_up, 0, FALSE}, - {'l', nv_right, NV_RL, 0}, - {'m', nv_mark, NV_NCH_NOP, 0}, - {'n', nv_next, 0, 0}, - {'o', nv_open, 0, 0}, - {'p', nv_put, 0, 0}, - {'q', nv_record, NV_NCH, 0}, - {'r', nv_replace, NV_NCH_NOP|NV_LANG, 0}, - {'s', nv_subst, NV_KEEPREG, 0}, - {'t', nv_csearch, NV_NCH_ALW|NV_LANG, FORWARD}, - {'u', nv_undo, 0, 0}, - {'v', nv_visual, 0, FALSE}, - {'w', nv_wordcmd, 0, FALSE}, - {'x', nv_abbrev, NV_KEEPREG, 0}, - {'y', nv_operator, 0, 0}, - {'z', nv_zet, NV_NCH_ALW, 0}, - {'{', nv_findpar, 0, BACKWARD}, - {'|', nv_pipe, 0, 0}, - {'}', nv_findpar, 0, FORWARD}, - {'~', nv_tilde, 0, 0}, - - // pound sign - {POUND, nv_ident, 0, 0}, - {K_MOUSEUP, nv_mousescroll, 0, MSCR_UP}, - {K_MOUSEDOWN, nv_mousescroll, 0, MSCR_DOWN}, - {K_MOUSELEFT, nv_mousescroll, 0, MSCR_LEFT}, - {K_MOUSERIGHT, nv_mousescroll, 0, MSCR_RIGHT}, - {K_LEFTMOUSE, nv_mouse, 0, 0}, - {K_LEFTMOUSE_NM, nv_mouse, 0, 0}, - {K_LEFTDRAG, nv_mouse, 0, 0}, - {K_LEFTRELEASE, nv_mouse, 0, 0}, - {K_LEFTRELEASE_NM, nv_mouse, 0, 0}, - {K_MOUSEMOVE, nv_mouse, 0, 0}, - {K_MIDDLEMOUSE, nv_mouse, 0, 0}, - {K_MIDDLEDRAG, nv_mouse, 0, 0}, - {K_MIDDLERELEASE, nv_mouse, 0, 0}, - {K_RIGHTMOUSE, nv_mouse, 0, 0}, - {K_RIGHTDRAG, nv_mouse, 0, 0}, - {K_RIGHTRELEASE, nv_mouse, 0, 0}, - {K_X1MOUSE, nv_mouse, 0, 0}, - {K_X1DRAG, nv_mouse, 0, 0}, - {K_X1RELEASE, nv_mouse, 0, 0}, - {K_X2MOUSE, nv_mouse, 0, 0}, - {K_X2DRAG, nv_mouse, 0, 0}, - {K_X2RELEASE, nv_mouse, 0, 0}, - {K_IGNORE, nv_ignore, NV_KEEPREG, 0}, - {K_NOP, nv_nop, 0, 0}, - {K_INS, nv_edit, 0, 0}, - {K_KINS, nv_edit, 0, 0}, - {K_BS, nv_ctrlh, 0, 0}, - {K_UP, nv_up, NV_SSS|NV_STS, FALSE}, - {K_S_UP, nv_page, NV_SS, BACKWARD}, - {K_DOWN, nv_down, NV_SSS|NV_STS, FALSE}, - {K_S_DOWN, nv_page, NV_SS, FORWARD}, - {K_LEFT, nv_left, NV_SSS|NV_STS|NV_RL, 0}, - {K_S_LEFT, nv_bck_word, NV_SS|NV_RL, 0}, - {K_C_LEFT, nv_bck_word, NV_SSS|NV_RL|NV_STS, 1}, - {K_RIGHT, nv_right, NV_SSS|NV_STS|NV_RL, 0}, - {K_S_RIGHT, nv_wordcmd, NV_SS|NV_RL, FALSE}, - {K_C_RIGHT, nv_wordcmd, NV_SSS|NV_RL|NV_STS, TRUE}, - {K_PAGEUP, nv_page, NV_SSS|NV_STS, BACKWARD}, - {K_KPAGEUP, nv_page, NV_SSS|NV_STS, BACKWARD}, - {K_PAGEDOWN, nv_page, NV_SSS|NV_STS, FORWARD}, - {K_KPAGEDOWN, nv_page, NV_SSS|NV_STS, FORWARD}, - {K_END, nv_end, NV_SSS|NV_STS, FALSE}, - {K_KEND, nv_end, NV_SSS|NV_STS, FALSE}, - {K_S_END, nv_end, NV_SS, FALSE}, - {K_C_END, nv_end, NV_SSS|NV_STS, TRUE}, - {K_HOME, nv_home, NV_SSS|NV_STS, 0}, - {K_KHOME, nv_home, NV_SSS|NV_STS, 0}, - {K_S_HOME, nv_home, NV_SS, 0}, - {K_C_HOME, nv_goto, NV_SSS|NV_STS, FALSE}, - {K_DEL, nv_abbrev, 0, 0}, - {K_KDEL, nv_abbrev, 0, 0}, - {K_UNDO, nv_kundo, 0, 0}, - {K_HELP, nv_help, NV_NCW, 0}, - {K_F1, nv_help, NV_NCW, 0}, - {K_XF1, nv_help, NV_NCW, 0}, - {K_SELECT, nv_select, 0, 0}, - {K_VER_SCROLLBAR, NV_VER_SCROLLBAR, 0, 0}, - {K_HOR_SCROLLBAR, NV_HOR_SCROLLBAR, 0, 0}, - {K_TABLINE, NV_TABLINE, 0, 0}, - {K_TABMENU, NV_TABMENU, 0, 0}, - {K_F21, NV_NBCMD, NV_NCH_ALW, 0}, - {K_DROP, NV_DROP, NV_STS, 0}, - {K_CURSORHOLD, nv_cursorhold, NV_KEEPREG, 0}, - {K_PS, nv_edit, 0, 0}, - {K_COMMAND, nv_colon, 0, 0}, - {K_SCRIPT_COMMAND, nv_colon, 0, 0}, -}; - -// Number of commands in nv_cmds[]. -#define NV_CMDS_SIZE ARRAY_LENGTH(nv_cmds) +// Declare nv_cmds[]. +#define DO_DECLARE_NVCMD +#include "nv_cmds.h" // Include the lookuptable generated by create_nvcmdidx.vim. #include "nv_cmdidxs.h" -#if defined(FEAT_EVAL) || defined(PROTO) -/* - * Return the command character for the given command index. This function is - * used to auto-generate nv_cmd_idx[]. - */ - void -f_internal_get_nv_cmdchar(typval_T *argvars, typval_T *rettv) -{ - int idx; - int cmd_char; - - rettv->v_type = VAR_NUMBER; - rettv->vval.v_number = -1; - - if (check_for_number_arg(argvars, 0) == FAIL) - return; - - idx = tv_get_number(&argvars[0]); - if (idx < 0 || idx >= (int)NV_CMDS_SIZE) - return; - - cmd_char = nv_cmds[idx].cmd_char; - - // We use the absolute value of the character. Special keys have a - // negative value, but are sorted on their absolute value. - if (cmd_char < 0) - cmd_char = -cmd_char; - - rettv->vval.v_number = cmd_char; - - return; -} -#endif - /* * Search for a command in the commands table. * Returns -1 for invalid command. diff --git a/src/nv_cmds.h b/src/nv_cmds.h new file mode 100644 index 0000000000..d4b2c95c84 --- /dev/null +++ b/src/nv_cmds.h @@ -0,0 +1,310 @@ +/* vi:set ts=8 sts=4 sw=4 noet: + * + * VIM - Vi IMproved by Bram Moolenaar et al. + * + * 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. + */ +/* + * This file defines the Normal mode commands. + */ + +/* + * When adding a Normal/Visual mode command: + * 1. Add an entry in the table `nv_cmds[]` below. + * 2. Run "make nvcmdidxs" to re-generate nv_cmdidxs.h. + * 3. Add an entry in the index for Normal/Visual commands at + * ":help normal-index" and ":help visual-index" . + * 4. Add documentation in ../doc/xxx.txt. Add a tag for both the short and + * long name of the command. + */ + +#ifdef DO_DECLARE_NVCMD + +/* + * Used when building Vim. + */ +# define NVCMD(a, b, c, d) {a, b, c, d} + +#ifdef FEAT_GUI +#define NV_VER_SCROLLBAR nv_ver_scrollbar +#define NV_HOR_SCROLLBAR nv_hor_scrollbar +#else +#define NV_VER_SCROLLBAR nv_error +#define NV_HOR_SCROLLBAR nv_error +#endif + +#ifdef FEAT_GUI_TABLINE +#define NV_TABLINE nv_tabline +#define NV_TABMENU nv_tabmenu +#else +#define NV_TABLINE nv_error +#define NV_TABMENU nv_error +#endif + +#ifdef FEAT_NETBEANS_INTG +#define NV_NBCMD nv_nbcmd +#else +#define NV_NBCMD nv_error +#endif + +#ifdef FEAT_DND +#define NV_DROP nv_drop +#else +#define NV_DROP nv_error +#endif + +/* + * Function to be called for a Normal or Visual mode command. + * The argument is a cmdarg_T. + */ +typedef void (*nv_func_T)(cmdarg_T *cap); + +// Values for cmd_flags. +#define NV_NCH 0x01 // may need to get a second char +#define NV_NCH_NOP (0x02|NV_NCH) // get second char when no operator pending +#define NV_NCH_ALW (0x04|NV_NCH) // always get a second char +#define NV_LANG 0x08 // second char needs language adjustment + +#define NV_SS 0x10 // may start selection +#define NV_SSS 0x20 // may start selection with shift modifier +#define NV_STS 0x40 // may stop selection without shift modif. +#define NV_RL 0x80 // 'rightleft' modifies command +#define NV_KEEPREG 0x100 // don't clear regname +#define NV_NCW 0x200 // not allowed in command-line window + +/* + * Generally speaking, every Normal mode command should either clear any + * pending operator (with *clearop*()), or set the motion type variable + * oap->motion_type. + * + * When a cursor motion command is made, it is marked as being a character or + * line oriented motion. Then, if an operator is in effect, the operation + * becomes character or line oriented accordingly. + */ + +/* + * This table contains one entry for every Normal or Visual mode command. + * The order doesn't matter, this will be sorted by the create_nvcmdidx.vim + * script to generate the nv_cmd_idx[] lookup table. + * It is faster when all keys from zero to '~' are present. + */ +static const struct nv_cmd +{ + int cmd_char; // (first) command character + nv_func_T cmd_func; // function for this command + short_u cmd_flags; // NV_ flags + short cmd_arg; // value for ca.arg +} nv_cmds[] = + +#else // DO_DECLARE_NVCMD + +/* + * Used when creating nv_cmdidxs.h. + */ +# define NVCMD(a, b, c, d) a +static const int nv_cmds[] = + +#endif // DO_DECLARE_NVCMD +{ + NVCMD(NUL, nv_error, 0, 0), + NVCMD(Ctrl_A, nv_addsub, 0, 0), + NVCMD(Ctrl_B, nv_page, NV_STS, BACKWARD), + NVCMD(Ctrl_C, nv_esc, 0, TRUE), + NVCMD(Ctrl_D, nv_halfpage, 0, 0), + NVCMD(Ctrl_E, nv_scroll_line, 0, TRUE), + NVCMD(Ctrl_F, nv_page, NV_STS, FORWARD), + NVCMD(Ctrl_G, nv_ctrlg, 0, 0), + NVCMD(Ctrl_H, nv_ctrlh, 0, 0), + NVCMD(Ctrl_I, nv_pcmark, 0, 0), + NVCMD(NL, nv_down, 0, FALSE), + NVCMD(Ctrl_K, nv_error, 0, 0), + NVCMD(Ctrl_L, nv_clear, 0, 0), + NVCMD(CAR, nv_down, 0, TRUE), + NVCMD(Ctrl_N, nv_down, NV_STS, FALSE), + NVCMD(Ctrl_O, nv_ctrlo, 0, 0), + NVCMD(Ctrl_P, nv_up, NV_STS, FALSE), + NVCMD(Ctrl_Q, nv_visual, 0, FALSE), + NVCMD(Ctrl_R, nv_redo_or_register, 0, 0), + NVCMD(Ctrl_S, nv_ignore, 0, 0), + NVCMD(Ctrl_T, nv_tagpop, NV_NCW, 0), + NVCMD(Ctrl_U, nv_halfpage, 0, 0), + NVCMD(Ctrl_V, nv_visual, 0, FALSE), + NVCMD(Ctrl_W, nv_window, 0, 0), + NVCMD(Ctrl_X, nv_addsub, 0, 0), + NVCMD(Ctrl_Y, nv_scroll_line, 0, FALSE), + NVCMD(Ctrl_Z, nv_suspend, 0, 0), + NVCMD(ESC, nv_esc, 0, FALSE), + NVCMD(Ctrl_BSL, nv_normal, NV_NCH_ALW, 0), + NVCMD(Ctrl_RSB, nv_ident, NV_NCW, 0), + NVCMD(Ctrl_HAT, nv_hat, NV_NCW, 0), + NVCMD(Ctrl__, nv_error, 0, 0), + NVCMD(' ', nv_right, 0, 0), + NVCMD('!', nv_operator, 0, 0), + NVCMD('"', nv_regname, NV_NCH_NOP|NV_KEEPREG, 0), + NVCMD('#', nv_ident, 0, 0), + NVCMD('$', nv_dollar, 0, 0), + NVCMD('%', nv_percent, 0, 0), + NVCMD('&', nv_optrans, 0, 0), + NVCMD('\'', nv_gomark, NV_NCH_ALW, TRUE), + NVCMD('(', nv_brace, 0, BACKWARD), + NVCMD(')', nv_brace, 0, FORWARD), + NVCMD('*', nv_ident, 0, 0), + NVCMD('+', nv_down, 0, TRUE), + NVCMD(',', nv_csearch, 0, TRUE), + NVCMD('-', nv_up, 0, TRUE), + NVCMD('.', nv_dot, NV_KEEPREG, 0), + NVCMD('/', nv_search, 0, FALSE), + NVCMD('0', nv_beginline, 0, 0), + NVCMD('1', nv_ignore, 0, 0), + NVCMD('2', nv_ignore, 0, 0), + NVCMD('3', nv_ignore, 0, 0), + NVCMD('4', nv_ignore, 0, 0), + NVCMD('5', nv_ignore, 0, 0), + NVCMD('6', nv_ignore, 0, 0), + NVCMD('7', nv_ignore, 0, 0), + NVCMD('8', nv_ignore, 0, 0), + NVCMD('9', nv_ignore, 0, 0), + NVCMD(':', nv_colon, 0, 0), + NVCMD(';', nv_csearch, 0, FALSE), + NVCMD('<', nv_operator, NV_RL, 0), + NVCMD('=', nv_operator, 0, 0), + NVCMD('>', nv_operator, NV_RL, 0), + NVCMD('?', nv_search, 0, FALSE), + NVCMD('@', nv_at, NV_NCH_NOP, FALSE), + NVCMD('A', nv_edit, 0, 0), + NVCMD('B', nv_bck_word, 0, 1), + NVCMD('C', nv_abbrev, NV_KEEPREG, 0), + NVCMD('D', nv_abbrev, NV_KEEPREG, 0), + NVCMD('E', nv_wordcmd, 0, TRUE), + NVCMD('F', nv_csearch, NV_NCH_ALW|NV_LANG, BACKWARD), + NVCMD('G', nv_goto, 0, TRUE), + NVCMD('H', nv_scroll, 0, 0), + NVCMD('I', nv_edit, 0, 0), + NVCMD('J', nv_join, 0, 0), + NVCMD('K', nv_ident, 0, 0), + NVCMD('L', nv_scroll, 0, 0), + NVCMD('M', nv_scroll, 0, 0), + NVCMD('N', nv_next, 0, SEARCH_REV), + NVCMD('O', nv_open, 0, 0), + NVCMD('P', nv_put, 0, 0), + NVCMD('Q', nv_exmode, NV_NCW, 0), + NVCMD('R', nv_Replace, 0, FALSE), + NVCMD('S', nv_subst, NV_KEEPREG, 0), + NVCMD('T', nv_csearch, NV_NCH_ALW|NV_LANG, BACKWARD), + NVCMD('U', nv_Undo, 0, 0), + NVCMD('V', nv_visual, 0, FALSE), + NVCMD('W', nv_wordcmd, 0, TRUE), + NVCMD('X', nv_abbrev, NV_KEEPREG, 0), + NVCMD('Y', nv_abbrev, NV_KEEPREG, 0), + NVCMD('Z', nv_Zet, NV_NCH_NOP|NV_NCW, 0), + NVCMD('[', nv_brackets, NV_NCH_ALW, BACKWARD), + NVCMD('\\', nv_error, 0, 0), + NVCMD(']', nv_brackets, NV_NCH_ALW, FORWARD), + NVCMD('^', nv_beginline, 0, BL_WHITE | BL_FIX), + NVCMD('_', nv_lineop, 0, 0), + NVCMD('`', nv_gomark, NV_NCH_ALW, FALSE), + NVCMD('a', nv_edit, NV_NCH, 0), + NVCMD('b', nv_bck_word, 0, 0), + NVCMD('c', nv_operator, 0, 0), + NVCMD('d', nv_operator, 0, 0), + NVCMD('e', nv_wordcmd, 0, FALSE), + NVCMD('f', nv_csearch, NV_NCH_ALW|NV_LANG, FORWARD), + NVCMD('g', nv_g_cmd, NV_NCH_ALW, FALSE), + NVCMD('h', nv_left, NV_RL, 0), + NVCMD('i', nv_edit, NV_NCH, 0), + NVCMD('j', nv_down, 0, FALSE), + NVCMD('k', nv_up, 0, FALSE), + NVCMD('l', nv_right, NV_RL, 0), + NVCMD('m', nv_mark, NV_NCH_NOP, 0), + NVCMD('n', nv_next, 0, 0), + NVCMD('o', nv_open, 0, 0), + NVCMD('p', nv_put, 0, 0), + NVCMD('q', nv_record, NV_NCH, 0), + NVCMD('r', nv_replace, NV_NCH_NOP|NV_LANG, 0), + NVCMD('s', nv_subst, NV_KEEPREG, 0), + NVCMD('t', nv_csearch, NV_NCH_ALW|NV_LANG, FORWARD), + NVCMD('u', nv_undo, 0, 0), + NVCMD('v', nv_visual, 0, FALSE), + NVCMD('w', nv_wordcmd, 0, FALSE), + NVCMD('x', nv_abbrev, NV_KEEPREG, 0), + NVCMD('y', nv_operator, 0, 0), + NVCMD('z', nv_zet, NV_NCH_ALW, 0), + NVCMD('{', nv_findpar, 0, BACKWARD), + NVCMD('|', nv_pipe, 0, 0), + NVCMD('}', nv_findpar, 0, FORWARD), + NVCMD('~', nv_tilde, 0, 0), + + // pound sign + NVCMD(POUND, nv_ident, 0, 0), + NVCMD(K_MOUSEUP, nv_mousescroll, 0, MSCR_UP), + NVCMD(K_MOUSEDOWN, nv_mousescroll, 0, MSCR_DOWN), + NVCMD(K_MOUSELEFT, nv_mousescroll, 0, MSCR_LEFT), + NVCMD(K_MOUSERIGHT, nv_mousescroll, 0, MSCR_RIGHT), + NVCMD(K_LEFTMOUSE, nv_mouse, 0, 0), + NVCMD(K_LEFTMOUSE_NM, nv_mouse, 0, 0), + NVCMD(K_LEFTDRAG, nv_mouse, 0, 0), + NVCMD(K_LEFTRELEASE, nv_mouse, 0, 0), + NVCMD(K_LEFTRELEASE_NM, nv_mouse, 0, 0), + NVCMD(K_MOUSEMOVE, nv_mouse, 0, 0), + NVCMD(K_MIDDLEMOUSE, nv_mouse, 0, 0), + NVCMD(K_MIDDLEDRAG, nv_mouse, 0, 0), + NVCMD(K_MIDDLERELEASE, nv_mouse, 0, 0), + NVCMD(K_RIGHTMOUSE, nv_mouse, 0, 0), + NVCMD(K_RIGHTDRAG, nv_mouse, 0, 0), + NVCMD(K_RIGHTRELEASE, nv_mouse, 0, 0), + NVCMD(K_X1MOUSE, nv_mouse, 0, 0), + NVCMD(K_X1DRAG, nv_mouse, 0, 0), + NVCMD(K_X1RELEASE, nv_mouse, 0, 0), + NVCMD(K_X2MOUSE, nv_mouse, 0, 0), + NVCMD(K_X2DRAG, nv_mouse, 0, 0), + NVCMD(K_X2RELEASE, nv_mouse, 0, 0), + NVCMD(K_IGNORE, nv_ignore, NV_KEEPREG, 0), + NVCMD(K_NOP, nv_nop, 0, 0), + NVCMD(K_INS, nv_edit, 0, 0), + NVCMD(K_KINS, nv_edit, 0, 0), + NVCMD(K_BS, nv_ctrlh, 0, 0), + NVCMD(K_UP, nv_up, NV_SSS|NV_STS, FALSE), + NVCMD(K_S_UP, nv_page, NV_SS, BACKWARD), + NVCMD(K_DOWN, nv_down, NV_SSS|NV_STS, FALSE), + NVCMD(K_S_DOWN, nv_page, NV_SS, FORWARD), + NVCMD(K_LEFT, nv_left, NV_SSS|NV_STS|NV_RL, 0), + NVCMD(K_S_LEFT, nv_bck_word, NV_SS|NV_RL, 0), + NVCMD(K_C_LEFT, nv_bck_word, NV_SSS|NV_RL|NV_STS, 1), + NVCMD(K_RIGHT, nv_right, NV_SSS|NV_STS|NV_RL, 0), + NVCMD(K_S_RIGHT, nv_wordcmd, NV_SS|NV_RL, FALSE), + NVCMD(K_C_RIGHT, nv_wordcmd, NV_SSS|NV_RL|NV_STS, TRUE), + NVCMD(K_PAGEUP, nv_page, NV_SSS|NV_STS, BACKWARD), + NVCMD(K_KPAGEUP, nv_page, NV_SSS|NV_STS, BACKWARD), + NVCMD(K_PAGEDOWN, nv_page, NV_SSS|NV_STS, FORWARD), + NVCMD(K_KPAGEDOWN, nv_page, NV_SSS|NV_STS, FORWARD), + NVCMD(K_END, nv_end, NV_SSS|NV_STS, FALSE), + NVCMD(K_KEND, nv_end, NV_SSS|NV_STS, FALSE), + NVCMD(K_S_END, nv_end, NV_SS, FALSE), + NVCMD(K_C_END, nv_end, NV_SSS|NV_STS, TRUE), + NVCMD(K_HOME, nv_home, NV_SSS|NV_STS, 0), + NVCMD(K_KHOME, nv_home, NV_SSS|NV_STS, 0), + NVCMD(K_S_HOME, nv_home, NV_SS, 0), + NVCMD(K_C_HOME, nv_goto, NV_SSS|NV_STS, FALSE), + NVCMD(K_DEL, nv_abbrev, 0, 0), + NVCMD(K_KDEL, nv_abbrev, 0, 0), + NVCMD(K_UNDO, nv_kundo, 0, 0), + NVCMD(K_HELP, nv_help, NV_NCW, 0), + NVCMD(K_F1, nv_help, NV_NCW, 0), + NVCMD(K_XF1, nv_help, NV_NCW, 0), + NVCMD(K_SELECT, nv_select, 0, 0), + NVCMD(K_VER_SCROLLBAR, NV_VER_SCROLLBAR, 0, 0), + NVCMD(K_HOR_SCROLLBAR, NV_HOR_SCROLLBAR, 0, 0), + NVCMD(K_TABLINE, NV_TABLINE, 0, 0), + NVCMD(K_TABMENU, NV_TABMENU, 0, 0), + NVCMD(K_F21, NV_NBCMD, NV_NCH_ALW, 0), + NVCMD(K_DROP, NV_DROP, NV_STS, 0), + NVCMD(K_CURSORHOLD, nv_cursorhold, NV_KEEPREG, 0), + NVCMD(K_PS, nv_edit, 0, 0), + NVCMD(K_COMMAND, nv_colon, 0, 0), + NVCMD(K_SCRIPT_COMMAND, nv_colon, 0, 0), +}; + +// Number of commands in nv_cmds[]. +#define NV_CMDS_SIZE ARRAY_LENGTH(nv_cmds) diff --git a/src/proto/normal.pro b/src/proto/normal.pro index 70c0b97fc7..106d0e1395 100644 --- a/src/proto/normal.pro +++ b/src/proto/normal.pro @@ -1,5 +1,4 @@ /* normal.c */ -void f_internal_get_nv_cmdchar(typval_T *argvars, typval_T *rettv); void normal_cmd(oparg_T *oap, int toplevel); void check_visual_highlight(void); void end_visual_mode(void); diff --git a/src/version.c b/src/version.c index 87f3845626..a8db11072e 100644 --- a/src/version.c +++ b/src/version.c @@ -750,6 +750,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ +/**/ + 4270, /**/ 4269, /**/ From 1f47a287ee4f8b1d007dff878b23dd0cd6104f38 Mon Sep 17 00:00:00 2001 From: "K.Takata" Date: Mon, 31 Jan 2022 13:25:36 +0000 Subject: [PATCH 05/28] patch 8.2.4271: MS-Windows: cannot build with Ruby 3.1.0 Problem: MS-Windows: cannot build with Ruby 3.1.0. Solution: Adjust the DLL name and include directory. (Ken Takata, closes #9666) --- src/Make_cyg_ming.mak | 6 +++++- src/Make_mvc.mak | 4 ++++ src/version.c | 2 ++ 3 files changed, 11 insertions(+), 1 deletion(-) diff --git a/src/Make_cyg_ming.mak b/src/Make_cyg_ming.mak index ab71b26f14..585539d484 100644 --- a/src/Make_cyg_ming.mak +++ b/src/Make_cyg_ming.mak @@ -466,6 +466,8 @@ RUBY_PLATFORM = i586-mswin32 RUBY_PLATFORM = i386-mingw32 else ifneq ($(wildcard $(RUBY)/lib/ruby/$(RUBY_API_VER_LONG)/x64-mingw32),) RUBY_PLATFORM = x64-mingw32 + else ifneq ($(wildcard $(RUBY)/lib/ruby/$(RUBY_API_VER_LONG)/x64-mingw-ucrt),) +RUBY_PLATFORM = x64-mingw-ucrt else RUBY_PLATFORM = i386-mswin32 endif @@ -479,7 +481,9 @@ RUBY_INSTALL_NAME = mswin32-ruby$(RUBY_API_VER) # Base name of msvcrXX.dll which is used by ruby's dll. RUBY_MSVCRT_NAME = msvcrt endif - ifeq ($(ARCH),x86-64) + ifeq ($(RUBY_PLATFORM),x64-mingw-ucrt) +RUBY_INSTALL_NAME = x64-ucrt-ruby$(RUBY_API_VER) + else ifeq ($(ARCH),x86-64) RUBY_INSTALL_NAME = x64-$(RUBY_MSVCRT_NAME)-ruby$(RUBY_API_VER) else RUBY_INSTALL_NAME = $(RUBY_MSVCRT_NAME)-ruby$(RUBY_API_VER) diff --git a/src/Make_mvc.mak b/src/Make_mvc.mak index 2725e74370..00fe774856 100644 --- a/src/Make_mvc.mak +++ b/src/Make_mvc.mak @@ -1186,7 +1186,11 @@ RUBY_MSVCRT_NAME = $(MSVCRT_NAME) ! if "$(CPU)" == "i386" RUBY_INSTALL_NAME = $(RUBY_MSVCRT_NAME)-ruby$(RUBY_API_VER) ! else # CPU +! if EXIST($(RUBY)/lib/ruby/$(RUBY_API_VER_LONG)/x64-mingw-ucrt) +RUBY_INSTALL_NAME = x64-ucrt-ruby$(RUBY_API_VER) +! else RUBY_INSTALL_NAME = x64-$(RUBY_MSVCRT_NAME)-ruby$(RUBY_API_VER) +! endif ! endif # CPU ! endif # RUBY_INSTALL_NAME diff --git a/src/version.c b/src/version.c index a8db11072e..917362755c 100644 --- a/src/version.c +++ b/src/version.c @@ -750,6 +750,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ +/**/ + 4271, /**/ 4270, /**/ From eb6c2765959c91ddbb527f96f91ba5be199b8d41 Mon Sep 17 00:00:00 2001 From: Bram Moolenaar Date: Mon, 31 Jan 2022 13:36:36 +0000 Subject: [PATCH 06/28] patch 8.2.4272: Vim9 expr test fails without the channel feature MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Problem: Vim9 expr test fails without the channel feature. (Dominique Pellé) Solution: Remove "g:" before "CheckFeature". (closes #9671) --- src/testdir/test_vim9_expr.vim | 5 +++-- src/version.c | 2 ++ 2 files changed, 5 insertions(+), 2 deletions(-) diff --git a/src/testdir/test_vim9_expr.vim b/src/testdir/test_vim9_expr.vim index bf5a0d02ec..c6466d39a0 100644 --- a/src/testdir/test_vim9_expr.vim +++ b/src/testdir/test_vim9_expr.vim @@ -1472,7 +1472,8 @@ func Test_expr5_fails() endfunc func Test_expr5_fails_channel() - g:CheckFeature channel + CheckFeature channel + call v9.CheckDefAndScriptFailure(["var x = 'a' .. test_null_job()"], ['E1105:', 'E908:'], 1) call v9.CheckDefAndScriptFailure(["var x = 'a' .. test_null_channel()"], ['E1105:', 'E908:'], 1) endfunc @@ -1689,7 +1690,7 @@ func Test_expr6_fails() endfunc func Test_expr6_float_fails() - g:CheckFeature float + CheckFeature float call v9.CheckDefAndScriptFailure(["var x = 1.0 % 2"], ['E1035:', 'E804:'], 1) endfunc diff --git a/src/version.c b/src/version.c index 917362755c..2d113b8e26 100644 --- a/src/version.c +++ b/src/version.c @@ -750,6 +750,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ +/**/ + 4272, /**/ 4271, /**/ From 424bcae1fb0f69e0aef5e0cf84fd771cf34a0fb7 Mon Sep 17 00:00:00 2001 From: Bram Moolenaar Date: Mon, 31 Jan 2022 14:59:41 +0000 Subject: [PATCH 07/28] patch 8.2.4273: the EBCDIC support is outdated Problem: The EBCDIC support is outdated. Solution: Remove the EBCDIC support. --- src/ascii.h | 94 ----- src/charset.c | 107 +----- src/cindent.c | 8 +- src/digraph.c | 119 +----- src/edit.c | 22 +- src/eval.c | 7 - src/evalfunc.c | 35 +- src/ex_cmds.c | 10 +- src/feature.h | 22 +- src/filepath.c | 11 +- src/findfile.c | 1 - src/getchar.c | 18 +- src/gui.c | 13 +- src/gui_motif.c | 4 - src/hardcopy.c | 32 +- src/help.c | 11 +- src/macros.h | 24 +- src/map.c | 2 +- src/mark.c | 5 +- src/misc2.c | 15 +- src/normal.c | 14 +- src/ops.c | 8 - src/option.c | 14 +- src/option.h | 4 - src/optiondefs.h | 30 +- src/os_unix.c | 174 ++------- src/proto/evalfunc.pro | 1 - src/regexp.c | 46 +-- src/regexp_bt.c | 30 +- src/regexp_nfa.c | 187 +++------- src/register.c | 14 - src/screen.c | 4 +- src/spell.c | 1 - src/strings.c | 4 - src/structs.h | 3 - src/term.c | 572 ++++++++++++++--------------- src/testdir/test_edit.vim | 8 +- src/testdir/test_exec_while_if.vim | 18 +- src/testdir/test_expr.vim | 6 +- src/testdir/test_gf.vim | 12 +- src/testdir/test_regexp_utf8.vim | 5 - src/version.c | 6 +- src/viminfo.c | 10 +- 43 files changed, 429 insertions(+), 1302 deletions(-) diff --git a/src/ascii.h b/src/ascii.h index 139e8a3554..ec839704ed 100644 --- a/src/ascii.h +++ b/src/ascii.h @@ -8,14 +8,8 @@ /* * Definitions of various common control characters. - * For EBCDIC we have to use different values. */ -#ifndef EBCDIC - -// IF_EB(ASCII_constant, EBCDIC_constant) -#define IF_EB(a, b) a - #define CharOrd(x) ((x) < 'a' ? (x) - 'A' : (x) - 'a') #define CharOrdLow(x) ((x) - 'a') #define CharOrdUp(x) ((x) - 'A') @@ -77,94 +71,6 @@ #define Ctrl_HAT 30 // ^ #define Ctrl__ 31 -#else - -// EBCDIC - -// IF_EB(ASCII_constant, EBCDIC_constant) -#define IF_EB(a, b) b - -/* - * Finding the position in the alphabet is not straightforward in EBCDIC. - * There are gaps in the code table. - * 'a' + 1 == 'b', but: 'i' + 7 == 'j' and 'r' + 8 == 's' - */ -#define CharOrd__(c) ((c) < ('j' - 'a') ? (c) : ((c) < ('s' - 'a') ? (c) - 7 : (c) - 7 - 8)) -#define CharOrdLow(x) (CharOrd__((x) - 'a')) -#define CharOrdUp(x) (CharOrd__((x) - 'A')) -#define CharOrd(x) (isupper(x) ? CharOrdUp(x) : CharOrdLow(x)) - -#define EBCDIC_CHAR_ADD_(x) ((x) < 0?'a':(x)>25?'z':"abcdefghijklmnopqrstuvwxyz"[x]) -#define EBCDIC_CHAR_ADD(c,s) (isupper(c) ? toupper(EBCDIC_CHAR_ADD_(CharOrdUp(c)+(s))) : EBCDIC_CHAR_ADD_(CharOrdLow(c)+(s))) - -#define R13_(c) ("abcdefghijklmnopqrstuvwxyz"[((c) + 13) % 26]) -#define ROT13(c, a) (isupper(c) ? toupper(R13_(CharOrdUp(c))) : R13_(CharOrdLow(c))) - -#define NUL '\000' -#define BELL '\x2f' -#define BS '\x16' -#define TAB '\x05' -#define NL '\x15' -#define NL_STR (char_u *)"\x15" -#define FF '\x0C' -#define CAR '\x0D' -#define ESC '\x27' -#define ESC_STR (char_u *)"\x27" -#define ESC_STR_nc "\x27" -#define DEL 0x07 -#define DEL_STR (char_u *)"\007" - -#define POUND 0xB1 - -#define CTRL_F_STR "\056" -#define CTRL_H_STR "\026" -#define CTRL_V_STR "\062" - -#define Ctrl_AT 0x00 // @ -#define Ctrl_A 0x01 -#define Ctrl_B 0x02 -#define Ctrl_C 0x03 -#define Ctrl_D 0x37 -#define Ctrl_E 0x2D -#define Ctrl_F 0x2E -#define Ctrl_G 0x2F -#define Ctrl_H 0x16 -#define Ctrl_I 0x05 -#define Ctrl_J 0x15 -#define Ctrl_K 0x0B -#define Ctrl_L 0x0C -#define Ctrl_M 0x0D -#define Ctrl_N 0x0E -#define Ctrl_O 0x0F -#define Ctrl_P 0x10 -#define Ctrl_Q 0x11 -#define Ctrl_R 0x12 -#define Ctrl_S 0x13 -#define Ctrl_T 0x3C -#define Ctrl_U 0x3D -#define Ctrl_V 0x32 -#define Ctrl_W 0x26 -#define Ctrl_X 0x18 -#define Ctrl_Y 0x19 -#define Ctrl_Z 0x3F - // CTRL- [ Left Square Bracket == ESC -#define Ctrl_RSB 0x1D // ] Right Square Bracket -#define Ctrl_BSL 0x1C // \ BackSLash -#define Ctrl_HAT 0x1E // ^ -#define Ctrl__ 0x1F - -#define Ctrl_chr(x) (CtrlTable[(x)]) -extern char CtrlTable[]; - -#define CtrlChar(x) ((x < ' ') ? CtrlCharTable[(x)] : 0) -extern char CtrlCharTable[]; - -#define MetaChar(x) ((x < ' ') ? MetaCharTable[(x)] : 0) -extern char MetaCharTable[]; - -#endif // defined EBCDIC - -// TODO: EBCDIC Code page dependent (here 1047) #define CSI 0x9b // Control Sequence Introducer #define CSI_STR "\233" #define DCS 0x90 // Device Control String diff --git a/src/charset.c b/src/charset.c index 12d6359708..df95ed1b50 100644 --- a/src/charset.c +++ b/src/charset.c @@ -87,18 +87,11 @@ buf_init_chartab( * Set the default size for printable characters: * From to '~' is 1 (printable), others are 2 (not printable). * This also inits all 'isident' and 'isfname' flags to FALSE. - * - * EBCDIC: all chars below ' ' are not printable, all others are - * printable. */ c = 0; while (c < ' ') g_chartab[c++] = (dy_flags & DY_UHEX) ? 4 : 2; -#ifdef EBCDIC - while (c < 255) -#else while (c <= '~') -#endif g_chartab[c++] = 1 + CT_PRINT_CHAR; while (c < 256) { @@ -221,10 +214,7 @@ buf_init_chartab( } else if (i == 1) // (re)set printable { - if ((c < ' ' -#ifndef EBCDIC - || c > '~' -#endif + if ((c < ' ' || c > '~' // For double-byte we keep the cell width, so // that we can detect it from the first byte. ) && !(enc_dbcs && MB_BYTE2LEN(c) == 2)) @@ -519,13 +509,8 @@ transchar_buf(buf_T *buf, int c) c = K_SECOND(c); } - if ((!chartab_initialized && ( -#ifdef EBCDIC - (c >= 64 && c < 255) -#else - (c >= ' ' && c <= '~') -#endif - )) || (c < 256 && vim_isprintc_strict(c))) + if ((!chartab_initialized && ((c >= ' ' && c <= '~'))) + || (c < 256 && vim_isprintc_strict(c))) { // printable character transchar_charbuf[i] = c; @@ -567,56 +552,26 @@ transchar_nonprint(buf_T *buf, char_u *charbuf, int c) if (dy_flags & DY_UHEX) // 'display' has "uhex" transchar_hex(charbuf, c); -#ifdef EBCDIC - // For EBCDIC only the characters 0-63 and 255 are not printable - else if (CtrlChar(c) != 0 || c == DEL) -#else else if (c <= 0x7f) // 0x00 - 0x1f and 0x7f -#endif { charbuf[0] = '^'; -#ifdef EBCDIC - if (c == DEL) - charbuf[1] = '?'; // DEL displayed as ^? - else - charbuf[1] = CtrlChar(c); -#else charbuf[1] = c ^ 0x40; // DEL displayed as ^? -#endif - charbuf[2] = NUL; } else if (enc_utf8 && c >= 0x80) { transchar_hex(charbuf, c); } -#ifndef EBCDIC else if (c >= ' ' + 0x80 && c <= '~' + 0x80) // 0xa0 - 0xfe { charbuf[0] = '|'; charbuf[1] = c - 0x80; charbuf[2] = NUL; } -#else - else if (c < 64) - { - charbuf[0] = '~'; - charbuf[1] = MetaChar(c); - charbuf[2] = NUL; - } -#endif else // 0x80 - 0x9f and 0xff { - /* - * TODO: EBCDIC I don't know what to do with this chars, so I display - * them as '~?' for now - */ charbuf[0] = '~'; -#ifdef EBCDIC - charbuf[1] = '?'; // 0xff displayed as ~? -#else charbuf[1] = (c - 0x80) ^ 0x40; // 0xff displayed as ~? -#endif charbuf[2] = NUL; } } @@ -2134,59 +2089,3 @@ backslash_halve_save(char_u *p) backslash_halve(res); return res; } - -#if (defined(EBCDIC) && defined(FEAT_POSTSCRIPT)) || defined(PROTO) -/* - * Table for EBCDIC to ASCII conversion unashamedly taken from xxd.c! - * The first 64 entries have been added to map control characters defined in - * ascii.h - */ -static char_u ebcdic2ascii_tab[256] = -{ - 0000, 0001, 0002, 0003, 0004, 0011, 0006, 0177, - 0010, 0011, 0012, 0013, 0014, 0015, 0016, 0017, - 0020, 0021, 0022, 0023, 0024, 0012, 0010, 0027, - 0030, 0031, 0032, 0033, 0033, 0035, 0036, 0037, - 0040, 0041, 0042, 0043, 0044, 0045, 0046, 0047, - 0050, 0051, 0052, 0053, 0054, 0055, 0056, 0057, - 0060, 0061, 0062, 0063, 0064, 0065, 0066, 0067, - 0070, 0071, 0072, 0073, 0074, 0075, 0076, 0077, - 0040, 0240, 0241, 0242, 0243, 0244, 0245, 0246, - 0247, 0250, 0325, 0056, 0074, 0050, 0053, 0174, - 0046, 0251, 0252, 0253, 0254, 0255, 0256, 0257, - 0260, 0261, 0041, 0044, 0052, 0051, 0073, 0176, - 0055, 0057, 0262, 0263, 0264, 0265, 0266, 0267, - 0270, 0271, 0313, 0054, 0045, 0137, 0076, 0077, - 0272, 0273, 0274, 0275, 0276, 0277, 0300, 0301, - 0302, 0140, 0072, 0043, 0100, 0047, 0075, 0042, - 0303, 0141, 0142, 0143, 0144, 0145, 0146, 0147, - 0150, 0151, 0304, 0305, 0306, 0307, 0310, 0311, - 0312, 0152, 0153, 0154, 0155, 0156, 0157, 0160, - 0161, 0162, 0136, 0314, 0315, 0316, 0317, 0320, - 0321, 0345, 0163, 0164, 0165, 0166, 0167, 0170, - 0171, 0172, 0322, 0323, 0324, 0133, 0326, 0327, - 0330, 0331, 0332, 0333, 0334, 0335, 0336, 0337, - 0340, 0341, 0342, 0343, 0344, 0135, 0346, 0347, - 0173, 0101, 0102, 0103, 0104, 0105, 0106, 0107, - 0110, 0111, 0350, 0351, 0352, 0353, 0354, 0355, - 0175, 0112, 0113, 0114, 0115, 0116, 0117, 0120, - 0121, 0122, 0356, 0357, 0360, 0361, 0362, 0363, - 0134, 0237, 0123, 0124, 0125, 0126, 0127, 0130, - 0131, 0132, 0364, 0365, 0366, 0367, 0370, 0371, - 0060, 0061, 0062, 0063, 0064, 0065, 0066, 0067, - 0070, 0071, 0372, 0373, 0374, 0375, 0376, 0377 -}; - -/* - * Convert a buffer worth of characters from EBCDIC to ASCII. Only useful if - * wanting 7-bit ASCII characters out the other end. - */ - void -ebcdic2ascii(char_u *buffer, int len) -{ - int i; - - for (i = 0; i < len; i++) - buffer[i] = ebcdic2ascii_tab[buffer[i]]; -} -#endif diff --git a/src/cindent.c b/src/cindent.c index 747b5093e9..ca21c123e0 100644 --- a/src/cindent.c +++ b/src/cindent.c @@ -3946,13 +3946,7 @@ in_cinkeys( try_match_word = FALSE; // does it look like a control character? - if (*look == '^' -#ifdef EBCDIC - && (Ctrl_chr(look[1]) != 0) -#else - && look[1] >= '?' && look[1] <= '_' -#endif - ) + if (*look == '^' && look[1] >= '?' && look[1] <= '_') { if (try_match && keytyped == Ctrl_chr(look[1])) return TRUE; diff --git a/src/digraph.c b/src/digraph.c index f46e43f23e..bbab9584a6 100644 --- a/src/digraph.c +++ b/src/digraph.c @@ -138,119 +138,7 @@ static digr_T digraphdefault[] = }; #else // !HPUX_DIGRAPHS - -# ifdef EBCDIC - - /* - * EBCDIC - ISO digraphs - * TODO: EBCDIC Table is Code-Page 1047 - */ - {{'a', '^', 66}, // â - {'a', '"', 67}, // ä - {'a', '`', 68}, // à - {'a', '\'', 69}, // á - {'a', '~', 70}, // ã - {'a', '@', 71}, // å - {'a', 'a', 71}, // å - {'c', ',', 72}, // ç - {'n', '~', 73}, // ñ - {'c', '|', 74}, // ¢ - {'e', '\'', 81}, // é - {'e', '^', 82}, // ê - {'e', '"', 83}, // ë - {'e', '`', 84}, // è - {'i', '\'', 85}, // í - {'i', '^', 86}, // î - {'i', '"', 87}, // ï - {'i', '`', 88}, // ì - {'s', 's', 89}, // ß - {'A', '^', 98}, //  - {'A', '"', 99}, // Ä - {'A', '`', 100}, // À - {'A', '\'', 101}, // Á - {'A', '~', 102}, // à - {'A', '@', 103}, // Å - {'A', 'A', 103}, // Å - {'C', ',', 104}, // Ç - {'N', '~', 105}, // Ñ - {'|', '|', 106}, // ¦ - {'o', '/', 112}, // ø - {'E', '\'', 113}, // É - {'E', '^', 114}, // Ê - {'E', '"', 115}, // Ë - {'E', '`', 116}, // È - {'I', '\'', 117}, // Í - {'I', '^', 118}, // Î - {'I', '"', 119}, // Ï - {'I', '`', 120}, // Ì - {'O', '/', 128}, // 0/ XX - {'<', '<', 138}, // « - {'>', '>', 139}, // » - {'d', '-', 140}, // ð - {'y', '\'', 141}, // ý - {'i', 'p', 142}, // þ - {'+', '-', 143}, // ± - {'~', 'o', 144}, // ° - {'a', '-', 154}, // ª - {'o', '-', 155}, // º - {'a', 'e', 156}, // æ - {',', ',', 157}, // , XX - {'A', 'E', 158}, // Æ - {'o', 'x', 159}, // ¤ - currency symbol in ISO 8859-1 - {'e', '=', 159}, // ¤ - euro symbol in ISO 8859-15 - {'E', 'u', 159}, // ¤ - euro symbol in ISO 8859-15 - {'j', 'u', 160}, // µ - {'y', '"', 167}, // x XX - {'~', '!', 170}, // ¡ - {'~', '?', 171}, // ¿ - {'D', '-', 172}, // Ð - {'I', 'p', 174}, // Þ - {'r', 'O', 175}, // ® - {'-', ',', 176}, // ¬ - {'$', '$', 177}, // £ - {'Y', '-', 178}, // ¥ - {'~', '.', 179}, // · - {'c', 'O', 180}, // © - {'p', 'a', 181}, // § - {'p', 'p', 182}, // ¶ - {'1', '4', 183}, // ¼ - {'1', '2', 184}, // ½ - {'3', '4', 185}, // ¾ - {'Y', '\'', 186}, // Ý - {'"', '"', 187}, // ¨ - {'-', '=', 188}, // ¯ - {'\'', '\'', 190}, // ´ - {'O', 'E', 191}, // × - OE in ISO 8859-15 - {'/', '\\', 191}, // × - multiplication symbol in ISO 8859-1 - {'-', '-', 202}, // ­ - {'o', '^', 203}, // ô - {'o', '"', 204}, // ö - {'o', '`', 205}, // ò - {'o', '\'', 206}, // ó - {'o', '~', 207}, // õ - {'1', '1', 218}, // ¹ - {'u', '^', 219}, // û - {'u', '"', 220}, // ü - {'u', '`', 221}, // ù - {'u', '\'', 222}, // ú - {':', '-', 225}, // ÷ - division symbol in ISO 8859-1 - {'o', 'e', 225}, // ÷ - oe in ISO 8859-15 - {'2', '2', 234}, // ² - {'O', '^', 235}, // Ô - {'O', '"', 236}, // Ö - {'O', '`', 237}, // Ò - {'O', '\'', 238}, // Ó - {'O', '~', 239}, // Õ - {'3', '3', 250}, // ³ - {'U', '^', 251}, // Û - {'U', '"', 252}, // Ü - {'U', '`', 253}, // Ù - {'U', '\'', 254}, // Ú - {NUL, NUL, NUL} - }; - -# else // EBCDIC -# ifdef OLD_DIGRAPHS +# ifdef OLD_DIGRAPHS /* * digraphs compatible with Vim 5.x @@ -357,7 +245,7 @@ static digr_T digraphdefault[] = {'y', '"', 255}, // x XX {NUL, NUL, NUL} }; -# else // OLD_DIGRAPHS +# else // OLD_DIGRAPHS /* * digraphs for Unicode from RFC1345 @@ -1761,8 +1649,7 @@ static digr_T digraphdefault[] = {NUL, NUL, NUL} }; -# endif // OLD_DIGRAPHS -# endif // EBCDIC +# endif // OLD_DIGRAPHS #endif // !HPUX_DIGRAPHS /* diff --git a/src/edit.c b/src/edit.c index 2a889631ae..0edd38be4c 100644 --- a/src/edit.c +++ b/src/edit.c @@ -2052,11 +2052,7 @@ insert_special( * stop and defer processing to the "normal" mechanism. * '0' and '^' are special, because they can be followed by CTRL-D. */ -#ifdef EBCDIC -# define ISSPECIAL(c) ((c) < ' ' || (c) == '0' || (c) == '^') -#else -# define ISSPECIAL(c) ((c) < ' ' || (c) >= DEL || (c) == '0' || (c) == '^') -#endif +#define ISSPECIAL(c) ((c) < ' ' || (c) >= DEL || (c) == '0' || (c) == '^') /* * "flags": INSCHAR_FORMAT - force formatting @@ -2926,9 +2922,8 @@ stuff_inserted( stuffReadbuff(ptr); // a trailing "0" is inserted as "048", "^" as "^" if (last) - stuffReadbuff((char_u *)(last == '0' - ? IF_EB("\026\060\064\070", CTRL_V_STR "xf0") - : IF_EB("\026^", CTRL_V_STR "^"))); + stuffReadbuff( + (char_u *)(last == '0' ? "\026\060\064\070" : "\026^")); } while (--count > 0); @@ -3316,15 +3311,11 @@ hkmap(int c) return ' '; // \"a --> ' ' -- / -- else if (c == 252) return ' '; // \"u --> ' ' -- / -- -#ifdef EBCDIC - else if (islower(c)) -#else // NOTE: islower() does not do the right thing for us on Linux so we // do this the same was as 5.7 and previous, so it works correctly on // all systems. Specifically, the e.g. Delete and Arrow keys are // munged and won't work if e.g. searching for Hebrew text. else if (c >= 'a' && c <= 'z') -#endif return (int)(map[CharOrdLow(c)] + p_aleph); else return c; @@ -3346,12 +3337,7 @@ hkmap(int c) default: { static char str[] = "zqbcxlsjphmkwonu ydafe rig"; -#ifdef EBCDIC - // see note about islower() above - if (!islower(c)) -#else if (c < 'a' || c > 'z') -#endif return c; c = str[CharOrdLow(c)]; break; @@ -4224,7 +4210,7 @@ ins_bs( } else want_vcol = tabstop_start(want_vcol, get_sts_value(), - curbuf->b_p_vsts_array); + curbuf->b_p_vsts_array); #else if (p_sta && in_indent) ts = (int)get_sw_value(curbuf); diff --git a/src/eval.c b/src/eval.c index c2357884af..076ba1fed3 100644 --- a/src/eval.c +++ b/src/eval.c @@ -111,13 +111,6 @@ eval_init(void) { evalvars_init(); func_init(); - -#ifdef EBCDIC - /* - * Sort the function table, to enable binary search. - */ - sortFunctions(); -#endif } #if defined(EXITFREE) || defined(PROTO) diff --git a/src/evalfunc.c b/src/evalfunc.c index 500ae284b2..1b788db9c4 100644 --- a/src/evalfunc.c +++ b/src/evalfunc.c @@ -2467,33 +2467,6 @@ static funcentry_T global_functions[] = ret_number, f_xor}, }; -#if defined(EBCDIC) || defined(PROTO) -/* - * Compare funcentry_T by function name. - */ - static int -compare_func_name(const void *s1, const void *s2) -{ - funcentry_T *p1 = (funcentry_T *)s1; - funcentry_T *p2 = (funcentry_T *)s2; - - return STRCMP(p1->f_name, p2->f_name); -} - -/* - * Sort the function table by function name. - * The sorting of the table above is ASCII dependent. - * On machines using EBCDIC we have to sort it. - */ - void -sortFunctions(void) -{ - size_t funcCnt = ARRAY_LENGTH(global_functions); - - qsort(global_functions, funcCnt, sizeof(funcentry_T), compare_func_name); -} -#endif - /* * Function given to ExpandGeneric() to obtain the list of internal * or user defined function names. @@ -5101,13 +5074,7 @@ f_has(typval_T *argvars, typval_T *rettv) 0 #endif }, - {"ebcdic", -#ifdef EBCDIC - 1 -#else - 0 -#endif - }, + {"ebcdic", 0 }, {"fname_case", #ifndef CASE_INSENSITIVE_FILENAME 1 diff --git a/src/ex_cmds.c b/src/ex_cmds.c index 9d99571f72..d9d532c919 100644 --- a/src/ex_cmds.c +++ b/src/ex_cmds.c @@ -61,23 +61,17 @@ do_ascii(exarg_T *eap UNUSED) cval = NL; // NL is stored as CR else cval = c; - if (vim_isprintc_strict(c) && (c < ' ' -#ifndef EBCDIC - || c > '~' -#endif - )) + if (vim_isprintc_strict(c) && (c < ' ' || c > '~')) { transchar_nonprint(curbuf, buf3, c); vim_snprintf(buf1, sizeof(buf1), " <%s>", (char *)buf3); } else buf1[0] = NUL; -#ifndef EBCDIC if (c >= 0x80) vim_snprintf(buf2, sizeof(buf2), " ", (char *)transchar(c & 0x7f)); else -#endif buf2[0] = NUL; #ifdef FEAT_DIGRAPHS dig = get_digraph_for_char(cval); @@ -1506,7 +1500,7 @@ do_shell( } else if (term_console) { - OUT_STR(IF_EB("\033[0 q", ESC_STR "[0 q")); // get window size + OUT_STR("\033[0 q"); // get window size if (got_int && msg_silent == 0) redraw_later_clear(); // if got_int is TRUE, redraw needed else diff --git a/src/feature.h b/src/feature.h index ace02eb6eb..c7cba07d40 100644 --- a/src/feature.h +++ b/src/feature.h @@ -222,20 +222,16 @@ /* * +rightleft Right-to-left editing/typing support. - * - * Disabled for EBCDIC as it requires multibyte. */ -#if defined(FEAT_BIG) && !defined(DISABLE_RIGHTLEFT) && !defined(EBCDIC) +#if defined(FEAT_BIG) && !defined(DISABLE_RIGHTLEFT) # define FEAT_RIGHTLEFT #endif /* * +arabic Arabic keymap and shaping support. * Requires FEAT_RIGHTLEFT - * - * Disabled for EBCDIC as it requires multibyte. */ -#if defined(FEAT_BIG) && !defined(DISABLE_ARABIC) && !defined(EBCDIC) +#if defined(FEAT_BIG) && !defined(DISABLE_ARABIC) # define FEAT_ARABIC #endif #ifdef FEAT_ARABIC @@ -254,16 +250,8 @@ /* * +tag_binary Can use a binary search for the tags file. - * - * Disabled for EBCDIC: - * On z/OS Unix we have the problem that /bin/sort sorts ASCII instead of - * EBCDIC. With this binary search doesn't work, as VIM expects a tag file - * sorted by character values. I'm not sure how to fix this. Should we really - * do a EBCDIC to ASCII conversion for this?? */ -#if !defined(EBCDIC) -# define FEAT_TAG_BINS -#endif +#define FEAT_TAG_BINS /* * +cscope Unix only: Cscope support. @@ -416,10 +404,8 @@ /* * +spell spell checking - * - * Disabled for EBCDIC: * Doesn't work (SIGSEGV). */ -#if (defined(FEAT_NORMAL) || defined(PROTO)) && !defined(EBCDIC) +#if (defined(FEAT_NORMAL) || defined(PROTO)) # define FEAT_SPELL #endif diff --git a/src/filepath.c b/src/filepath.c index add74b4707..65ea2bc6ea 100644 --- a/src/filepath.c +++ b/src/filepath.c @@ -2208,16 +2208,7 @@ f_tempname(typval_T *argvars UNUSED, typval_T *rettv) else if (x == '9') x = 'A'; else - { -#ifdef EBCDIC - if (x == 'I') - x = 'J'; - else if (x == 'R') - x = 'S'; - else -#endif - ++x; - } + ++x; } while (x == 'I' || x == 'O'); } diff --git a/src/findfile.c b/src/findfile.c index e8b3fa656d..12e76b444a 100644 --- a/src/findfile.c +++ b/src/findfile.c @@ -489,7 +489,6 @@ vim_findfile_init( * The octet after a '**' is used as a (binary) counter. * So '**3' is transposed to '**^C' ('^C' is ASCII value 3) * or '**76' is transposed to '**N'( 'N' is ASCII value 76). - * For EBCDIC you get different character values. * If no restrict is given after '**' the default is used. * Due to this technique the path looks awful if you print it as a * string. diff --git a/src/getchar.c b/src/getchar.c index cb8a354489..9a1132aa80 100644 --- a/src/getchar.c +++ b/src/getchar.c @@ -571,11 +571,7 @@ AppendToRedobuffLit( // Put a string of normal characters in the redo buffer (that's // faster). start = s; - while (*s >= ' ' -#ifndef EBCDIC - && *s < DEL // EBCDIC: all chars above space are normal -#endif - && (len < 0 || s - str < len)) + while (*s >= ' ' && *s < DEL && (len < 0 || s - str < len)) ++s; // Don't put '0' or '^' as last character, just in case a CTRL-D is @@ -597,13 +593,9 @@ AppendToRedobuffLit( if (c < ' ' || c == DEL || (*s == NUL && (c == '0' || c == '^'))) add_char_buff(&redobuff, Ctrl_V); - // CTRL-V '0' must be inserted as CTRL-V 048 (EBCDIC: xf0) + // CTRL-V '0' must be inserted as CTRL-V 048 if (*s == NUL && c == '0') -#ifdef EBCDIC - add_buff(&redobuff, (char_u *)"xf0", 3L); -#else add_buff(&redobuff, (char_u *)"048", 3L); -#endif else add_char_buff(&redobuff, c); } @@ -721,11 +713,7 @@ stuffescaped(char_u *arg, int literally) // stuff K_SPECIAL to get the effect of a special key when "literally" // is TRUE. start = arg; - while ((*arg >= ' ' -#ifndef EBCDIC - && *arg < DEL // EBCDIC: chars above space are normal -#endif - ) + while ((*arg >= ' ' && *arg < DEL) || (*arg == K_SPECIAL && !literally)) ++arg; if (arg > start) diff --git a/src/gui.c b/src/gui.c index 4032721868..0cce1f111a 100644 --- a/src/gui.c +++ b/src/gui.c @@ -1835,7 +1835,7 @@ gui_clear_block( void gui_update_cursor_later(void) { - OUT_STR(IF_EB("\033|s", ESC_STR "|s")); + OUT_STR("\033|s"); } void @@ -1962,12 +1962,7 @@ gui_write( len -= (int)(++p - s); s = p; } - else if ( -#ifdef EBCDIC - CtrlChar(s[0]) != 0 // Ctrl character -#else - s[0] < 0x20 // Ctrl character -#endif + else if (s[0] < 0x20 // Ctrl character #ifdef FEAT_SIGN_ICONS && s[0] != SIGN_BYTE # ifdef FEAT_NETBEANS_INTG @@ -2010,11 +2005,7 @@ gui_write( { p = s; while (len > 0 && ( -#ifdef EBCDIC - CtrlChar(*p) == 0 -#else *p >= 0x20 -#endif #ifdef FEAT_SIGN_ICONS || *p == SIGN_BYTE # ifdef FEAT_NETBEANS_INTG diff --git a/src/gui_motif.c b/src/gui_motif.c index 1d95651fbb..8328045bab 100644 --- a/src/gui_motif.c +++ b/src/gui_motif.c @@ -1259,10 +1259,6 @@ gui_mch_add_menu_item(vimmenu_T *menu, int idx) XmString label; vimmenu_T *parent = menu->parent; -# ifdef EBCDIC - menu->mnemonic = 0; -# endif - # if (XmVersion <= 1002) // Don't add Popup menu items when the popup menu isn't used. if (menu_is_child_of_popup(menu) && !mouse_model_popup()) diff --git a/src/hardcopy.c b/src/hardcopy.c index a41f330317..e2e5211624 100644 --- a/src/hardcopy.c +++ b/src/hardcopy.c @@ -1419,9 +1419,6 @@ prt_write_file(char_u *buffer) static void prt_write_file_len(char_u *buffer, int bytes) { -#ifdef EBCDIC - ebcdic2ascii(buffer, bytes); -#endif prt_write_file_raw_len(buffer, bytes); } @@ -1626,8 +1623,6 @@ prt_flush_buffer(void) prt_write_string("ul\n"); } // Draw the text - // Note: we write text out raw - EBCDIC conversion is handled in the - // PostScript world via the font encoding vector. if (prt_out_mbyte) prt_write_string("<"); else @@ -3119,7 +3114,7 @@ mch_print_end(prt_settings_T *psettings) // Write CTRL-D to close serial communication link if used. // NOTHING MUST BE WRITTEN AFTER THIS! - prt_write_file((char_u *)IF_EB("\004", "\067")); + prt_write_file((char_u *)"\004"); if (!prt_file_error && psettings->outfile == NULL && !got_int && !psettings->user_abort) @@ -3379,26 +3374,21 @@ mch_print_text_out(char_u *textp, int len UNUSED) { // Convert non-printing characters to either their escape or octal // sequence, ensures PS sent over a serial line does not interfere - // with the comms protocol. Note: For EBCDIC we need to write out - // the escape sequences as ASCII codes! - // Note 2: Char codes < 32 are identical in EBCDIC and ASCII AFAIK! - ga_append(&prt_ps_buffer, IF_EB('\\', 0134)); + // with the comms protocol. + ga_append(&prt_ps_buffer, '\\'); switch (ch) { - case BS: ga_append(&prt_ps_buffer, IF_EB('b', 0142)); break; - case TAB: ga_append(&prt_ps_buffer, IF_EB('t', 0164)); break; - case NL: ga_append(&prt_ps_buffer, IF_EB('n', 0156)); break; - case FF: ga_append(&prt_ps_buffer, IF_EB('f', 0146)); break; - case CAR: ga_append(&prt_ps_buffer, IF_EB('r', 0162)); break; - case '(': ga_append(&prt_ps_buffer, IF_EB('(', 0050)); break; - case ')': ga_append(&prt_ps_buffer, IF_EB(')', 0051)); break; - case '\\': ga_append(&prt_ps_buffer, IF_EB('\\', 0134)); break; + case BS: ga_append(&prt_ps_buffer, 'b'); break; + case TAB: ga_append(&prt_ps_buffer, 't'); break; + case NL: ga_append(&prt_ps_buffer, 'n'); break; + case FF: ga_append(&prt_ps_buffer, 'f'); break; + case CAR: ga_append(&prt_ps_buffer, 'r'); break; + case '(': ga_append(&prt_ps_buffer, '('); break; + case ')': ga_append(&prt_ps_buffer, ')'); break; + case '\\': ga_append(&prt_ps_buffer, '\\'); break; default: sprintf((char *)ch_buff, "%03o", (unsigned int)ch); -#ifdef EBCDIC - ebcdic2ascii(ch_buff, 3); -#endif ga_append(&prt_ps_buffer, ch_buff[0]); ga_append(&prt_ps_buffer, ch_buff[1]); ga_append(&prt_ps_buffer, ch_buff[2]); diff --git a/src/help.c b/src/help.c index 16fbafc061..661d5b5c3c 100644 --- a/src/help.c +++ b/src/help.c @@ -481,11 +481,7 @@ find_help_tags( d += 5; if (*s < ' ') { -#ifdef EBCDIC - *d++ = CtrlChar(*s); -#else *d++ = *s + '@'; -#endif if (d[-1] == '\\') *d++ = '\\'; // double a backslash } @@ -651,12 +647,7 @@ prepare_help_buffer(void) // Accept all ASCII chars for keywords, except ' ', '*', '"', '|', and // latin1 word characters (for translated help files). // Only set it when needed, buf_init_chartab() is some work. - p = -#ifdef EBCDIC - (char_u *)"65-255,^*,^|,^\""; -#else - (char_u *)"!-~,^*,^|,^\",192-255"; -#endif + p = (char_u *)"!-~,^*,^|,^\",192-255"; if (STRCMP(curbuf->b_p_isk, p) != 0) { set_string_option_direct((char_u *)"isk", -1, p, OPT_FREE|OPT_LOCAL, 0); diff --git a/src/macros.h b/src/macros.h index 31b52194d4..763db4f568 100644 --- a/src/macros.h +++ b/src/macros.h @@ -77,13 +77,8 @@ #endif // toupper() and tolower() for ASCII only and ignore the current locale. -#ifdef EBCDIC -# define TOUPPER_ASC(c) (islower(c) ? toupper(c) : (c)) -# define TOLOWER_ASC(c) (isupper(c) ? tolower(c) : (c)) -#else -# define TOUPPER_ASC(c) (((c) < 'a' || (c) > 'z') ? (c) : (c) - ('a' - 'A')) -# define TOLOWER_ASC(c) (((c) < 'A' || (c) > 'Z') ? (c) : (c) + ('a' - 'A')) -#endif +#define TOUPPER_ASC(c) (((c) < 'a' || (c) > 'z') ? (c) : (c) - ('a' - 'A')) +#define TOLOWER_ASC(c) (((c) < 'A' || (c) > 'Z') ? (c) : (c) + ('a' - 'A')) /* * MB_ISLOWER() and MB_ISUPPER() are to be used on multi-byte characters. But @@ -102,17 +97,10 @@ // Like isalpha() but reject non-ASCII characters. Can't be used with a // special key (negative value). -#ifdef EBCDIC -# define ASCII_ISALPHA(c) isalpha(c) -# define ASCII_ISALNUM(c) isalnum(c) -# define ASCII_ISLOWER(c) islower(c) -# define ASCII_ISUPPER(c) isupper(c) -#else -# define ASCII_ISLOWER(c) ((unsigned)(c) - 'a' < 26) -# define ASCII_ISUPPER(c) ((unsigned)(c) - 'A' < 26) -# define ASCII_ISALPHA(c) (ASCII_ISUPPER(c) || ASCII_ISLOWER(c)) -# define ASCII_ISALNUM(c) (ASCII_ISALPHA(c) || VIM_ISDIGIT(c)) -#endif +#define ASCII_ISLOWER(c) ((unsigned)(c) - 'a' < 26) +#define ASCII_ISUPPER(c) ((unsigned)(c) - 'A' < 26) +#define ASCII_ISALPHA(c) (ASCII_ISUPPER(c) || ASCII_ISLOWER(c)) +#define ASCII_ISALNUM(c) (ASCII_ISALPHA(c) || VIM_ISDIGIT(c)) // Returns empty string if it is NULL. #define EMPTY_IF_NULL(x) ((x) ? (x) : (char_u *)"") diff --git a/src/map.c b/src/map.c index 8d60eee25e..e45ea757e9 100644 --- a/src/map.c +++ b/src/map.c @@ -2018,7 +2018,7 @@ put_escstr(FILE *fd, char_u *strstart, int what) { if (what == 2) { - if (fprintf(fd, IF_EB("\\\026\n", "\\" CTRL_V_STR "\n")) < 0) + if (fprintf(fd, "\\\026\n") < 0) return FAIL; } else diff --git a/src/mark.c b/src/mark.c index 4765b79c17..11f20a61a9 100644 --- a/src/mark.c +++ b/src/mark.c @@ -310,12 +310,9 @@ getmark_buf_fnum( // to crash. if (c < 0) return posp; -#ifndef EBCDIC if (c > '~') // check for islower()/isupper() ; - else -#endif - if (c == '\'' || c == '`') // previous context mark + else if (c == '\'' || c == '`') // previous context mark { pos_copy = curwin->w_pcmark; // need to make a copy because posp = &pos_copy; // w_pcmark may be changed soon diff --git a/src/misc2.c b/src/misc2.c index 26d3657713..b6d5e066c6 100644 --- a/src/misc2.c +++ b/src/misc2.c @@ -1201,11 +1201,7 @@ get_special_key_name(int c, int modifiers) } if (table_idx < 0 && !vim_isprintc(c) && c < ' ') { -#ifdef EBCDIC - c = CtrlChar(c); -#else c += '@'; -#endif modifiers |= MOD_MASK_CTRL; } } @@ -1560,16 +1556,7 @@ extract_modifiers(int key, int *modp, int simplify, int *did_simplify) key = TOUPPER_ASC(key); if (simplify && (modifiers & MOD_MASK_CTRL) -#ifdef EBCDIC - // TODO: EBCDIC Better use: - // && (Ctrl_chr(key) || key == '?') - // ??? - && strchr("?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_", key) - != NULL -#else - && ((key >= '?' && key <= '_') || ASCII_ISALPHA(key)) -#endif - ) + && ((key >= '?' && key <= '_') || ASCII_ISALPHA(key))) { key = Ctrl_chr(key); modifiers &= ~MOD_MASK_CTRL; diff --git a/src/normal.c b/src/normal.c index fd6218472e..449f841a28 100644 --- a/src/normal.c +++ b/src/normal.c @@ -4426,13 +4426,7 @@ nv_brackets(cmdarg_T *cap) // fwd bwd fwd bwd fwd bwd // identifier "]i" "[i" "]I" "[I" "]^I" "[^I" // define "]d" "[d" "]D" "[D" "]^D" "[^D" - if (vim_strchr((char_u *) -# ifdef EBCDIC - "iI\005dD\067", -# else - "iI\011dD\004", -# endif - cap->nchar) != NULL) + if (vim_strchr((char_u *)"iI\011dD\004", cap->nchar) != NULL) { char_u *ptr; int len; @@ -5925,12 +5919,6 @@ nv_g_cmd(cmdarg_T *cap) case 'h': case 'H': case Ctrl_H: -# ifdef EBCDIC - // EBCDIC: 'v'-'h' != '^v'-'^h' - if (cap->nchar == Ctrl_H) - cap->cmdchar = Ctrl_V; - else -# endif cap->cmdchar = cap->nchar + ('v' - 'h'); cap->arg = TRUE; nv_visual(cap); diff --git a/src/ops.c b/src/ops.c index 77e45de768..418c46daa4 100644 --- a/src/ops.c +++ b/src/ops.c @@ -2674,11 +2674,7 @@ do_addsub( firstdigit = 'a'; } else -#ifdef EBCDIC - firstdigit = EBCDIC_CHAR_ADD(firstdigit, -Prenum1); -#else firstdigit -= Prenum1; -#endif } else { @@ -2690,11 +2686,7 @@ do_addsub( firstdigit = 'z'; } else -#ifdef EBCDIC - firstdigit = EBCDIC_CHAR_ADD(firstdigit, Prenum1); -#else firstdigit += Prenum1; -#endif } curwin->w_cursor.col = col; if (!did_change) diff --git a/src/option.c b/src/option.c index 482e960b25..339ea42996 100644 --- a/src/option.c +++ b/src/option.c @@ -266,7 +266,7 @@ set_init_1(int clean_arg) } #endif -#if defined(FEAT_POSTSCRIPT) && (defined(MSWIN) || defined(VMS) || defined(EBCDIC) || defined(MAC) || defined(hpux)) +#if defined(FEAT_POSTSCRIPT) && (defined(MSWIN) || defined(VMS) || defined(MAC) || defined(hpux)) // Set print encoding on platforms that don't default to latin1 set_string_default("penc", # if defined(MSWIN) @@ -275,14 +275,10 @@ set_init_1(int clean_arg) # ifdef VMS (char_u *)"dec-mcs" # else -# ifdef EBCDIC - (char_u *)"ebcdic-uk" -# else -# ifdef MAC +# ifdef MAC (char_u *)"mac-roman" -# else // HPUX +# else // HPUX (char_u *)"hp-roman8" -# endif # endif # endif # endif @@ -3920,11 +3916,7 @@ findoption(char_u *arg) /* * Check for name starting with an illegal character. */ -#ifdef EBCDIC - if (!islower(arg[0])) -#else if (arg[0] < 'a' || arg[0] > 'z') -#endif return -1; is_term_opt = (arg[0] == 't' && arg[1] == '_'); diff --git a/src/option.h b/src/option.h index c9b63f7385..c79eb0bdd7 100644 --- a/src/option.h +++ b/src/option.h @@ -89,11 +89,7 @@ typedef enum { # ifdef VMS # define DFLT_EFM "%A%p^,%C%%CC-%t-%m,%Cat line number %l in file %f,%f|%l| %m" # else // Unix, probably -# ifdef EBCDIC -#define DFLT_EFM "%*[^ ] %*[^ ] %f:%l%*[ ]%m,%*[^\"]\"%f\"%*\\D%l: %m,\"%f\"%*\\D%l: %m,%f:%l:%c:%m,%f(%l):%m,%f:%l:%m,\"%f\"\\, line %l%*\\D%c%*[^ ] %m,%D%*\\a[%*\\d]: Entering directory %*[`']%f',%X%*\\a[%*\\d]: Leaving directory %*[`']%f',%DMaking %*\\a in %f,%f|%l| %m" -# else #define DFLT_EFM "%*[^\"]\"%f\"%*\\D%l: %m,\"%f\"%*\\D%l: %m,%-G%f:%l: (Each undeclared identifier is reported only once,%-G%f:%l: for each function it appears in.),%-GIn file included from %f:%l:%c:,%-GIn file included from %f:%l:%c\\,,%-GIn file included from %f:%l:%c,%-GIn file included from %f:%l,%-G%*[ ]from %f:%l:%c,%-G%*[ ]from %f:%l:,%-G%*[ ]from %f:%l\\,,%-G%*[ ]from %f:%l,%f:%l:%c:%m,%f(%l):%m,%f:%l:%m,\"%f\"\\, line %l%*\\D%c%*[^ ] %m,%D%*\\a[%*\\d]: Entering directory %*[`']%f',%X%*\\a[%*\\d]: Leaving directory %*[`']%f',%D%*\\a: Entering directory %*[`']%f',%X%*\\a: Leaving directory %*[`']%f',%DMaking %*\\a in %f,%f|%l| %m" -# endif # endif # endif # endif diff --git a/src/optiondefs.h b/src/optiondefs.h index 81d513cd61..650c622d0c 100644 --- a/src/optiondefs.h +++ b/src/optiondefs.h @@ -1437,11 +1437,7 @@ static struct vimoption options[] = # ifdef VMS (char_u *)"@,48-57,/,.,-,_,+,,,#,$,%,<,>,[,],:,;,~", # else // UNIX et al. -# ifdef EBCDIC - (char_u *)"@,240-249,/,.,-,_,+,,,#,$,%,~,=", -# else (char_u *)"@,48-57,/,.,-,_,+,,,#,$,%,~,=", -# endif # endif # endif #endif @@ -1452,34 +1448,17 @@ static struct vimoption options[] = #if defined(MSWIN) (char_u *)"@,48-57,_,128-167,224-235", #else -# ifdef EBCDIC - // TODO: EBCDIC Check this! @ == isalpha() - (char_u *)"@,240-249,_,66-73,81-89,98-105," - "112-120,128,140-142,156,158,172," - "174,186,191,203-207,219-225,235-239," - "251-254", -# else (char_u *)"@,48-57,_,192-255", -# endif #endif (char_u *)0L} SCTX_INIT}, {"iskeyword", "isk", P_STRING|P_ALLOCED|P_VIM|P_COMMA|P_NODUP, (char_u *)&p_isk, PV_ISK, { -#ifdef EBCDIC - (char_u *)"@,240-249,_", - // TODO: EBCDIC Check this! @ == isalpha() - (char_u *)"@,240-249,_,66-73,81-89,98-105," - "112-120,128,140-142,156,158,172," - "174,186,191,203-207,219-225,235-239," - "251-254", -#else (char_u *)"@,48-57,_", -# if defined(MSWIN) +#if defined(MSWIN) (char_u *)"@,48-57,_,128-167,224-235" -# else +#else ISK_LATIN1 -# endif #endif } SCTX_INIT}, {"isprint", "isp", P_STRING|P_VI_DEF|P_RALL|P_COMMA|P_NODUP, @@ -1488,12 +1467,7 @@ static struct vimoption options[] = #if defined(MSWIN) || defined(VMS) (char_u *)"@,~-255", #else -# ifdef EBCDIC - // all chars above 63 are printable - (char_u *)"63-255", -# else ISP_LATIN1, -# endif #endif (char_u *)0L} SCTX_INIT}, {"joinspaces", "js", P_BOOL|P_VI_DEF|P_VIM, diff --git a/src/os_unix.c b/src/os_unix.c index 9a4880493f..984869809d 100644 --- a/src/os_unix.c +++ b/src/os_unix.c @@ -3773,10 +3773,7 @@ mch_setmouse(int on) #ifdef FEAT_MOUSE_URXVT if (ttym_flags == TTYM_URXVT) { - out_str_nf((char_u *) - (on - ? IF_EB("\033[?1015h", ESC_STR "[?1015h") - : IF_EB("\033[?1015l", ESC_STR "[?1015l"))); + out_str_nf((char_u *)(on ? "\033[?1015h" : "\033[?1015l")); mouse_ison = on; } #endif @@ -3784,10 +3781,7 @@ mch_setmouse(int on) if (ttym_flags == TTYM_SGR) { // SGR mode supports columns above 223 - out_str_nf((char_u *) - (on - ? IF_EB("\033[?1006h", ESC_STR "[?1006h") - : IF_EB("\033[?1006l", ESC_STR "[?1006l"))); + out_str_nf((char_u *)(on ? "\033[?1006h" : "\033[?1006l")); mouse_ison = on; } @@ -3797,8 +3791,7 @@ mch_setmouse(int on) bevalterm_ison = (p_bevalterm && on); if (xterm_mouse_vers > 1 && !bevalterm_ison) // disable mouse movement events, enabling is below - out_str_nf((char_u *) - (IF_EB("\033[?1003l", ESC_STR "[?1003l"))); + out_str_nf((char_u *)("\033[?1003l")); } #endif @@ -3809,16 +3802,13 @@ mch_setmouse(int on) (xterm_mouse_vers > 1 ? ( #ifdef FEAT_BEVAL_TERM - bevalterm_ison - ? IF_EB("\033[?1003h", ESC_STR "[?1003h") : + bevalterm_ison ? "\033[?1003h" : #endif - IF_EB("\033[?1002h", ESC_STR "[?1002h")) - : IF_EB("\033[?1000h", ESC_STR "[?1000h"))); + "\033[?1002h") + : "\033[?1000h")); else // disable mouse events, could probably always send the same out_str_nf((char_u *) - (xterm_mouse_vers > 1 - ? IF_EB("\033[?1002l", ESC_STR "[?1002l") - : IF_EB("\033[?1000l", ESC_STR "[?1000l"))); + (xterm_mouse_vers > 1 ? "\033[?1002l" : "\033[?1000l")); mouse_ison = on; } @@ -3886,18 +3876,15 @@ mch_setmouse(int on) // 5 = Windows UP Arrow # ifdef JSBTERM_MOUSE_NONADVANCED // Disables full feedback of pointer movements - out_str_nf((char_u *)IF_EB("\033[0~ZwLMRK1Q\033\\", - ESC_STR "[0~ZwLMRK1Q" ESC_STR "\\")); + out_str_nf((char_u *)"\033[0~ZwLMRK1Q\033\\"); # else - out_str_nf((char_u *)IF_EB("\033[0~ZwLMRK+1Q\033\\", - ESC_STR "[0~ZwLMRK+1Q" ESC_STR "\\")); + out_str_nf((char_u *)"\033[0~ZwLMRK+1Q\033\\"); # endif mouse_ison = TRUE; } else { - out_str_nf((char_u *)IF_EB("\033[0~ZwQ\033\\", - ESC_STR "[0~ZwQ" ESC_STR "\\")); + out_str_nf((char_u *)"\033[0~ZwQ\033\\"); mouse_ison = FALSE; } } @@ -3943,8 +3930,7 @@ check_mouse_termcode(void) ) { set_mouse_termcode(KS_MOUSE, (char_u *)(term_is_8bit(T_NAME) - ? IF_EB("\233M", CSI_STR "M") - : IF_EB("\033[M", ESC_STR "[M"))); + ? "\233M" : "\033[M")); if (*p_mouse != NUL) { // force mouse off and maybe on to send possibly new mouse @@ -3963,8 +3949,7 @@ check_mouse_termcode(void) && !gui.in_use # endif ) - set_mouse_termcode(KS_GPM_MOUSE, - (char_u *)IF_EB("\033MG", ESC_STR "MG")); + set_mouse_termcode(KS_GPM_MOUSE, (char_u *)"\033MG"); else del_mouse_termcode(KS_GPM_MOUSE); # endif @@ -3975,7 +3960,7 @@ check_mouse_termcode(void) && !gui.in_use # endif ) - set_mouse_termcode(KS_MOUSE, (char_u *)IF_EB("\033MS", ESC_STR "MS")); + set_mouse_termcode(KS_MOUSE, (char_u *)"\033MS"); # endif # ifdef FEAT_MOUSE_JSB @@ -3985,8 +3970,7 @@ check_mouse_termcode(void) && !gui.in_use # endif ) - set_mouse_termcode(KS_JSBTERM_MOUSE, - (char_u *)IF_EB("\033[0~zw", ESC_STR "[0~zw")); + set_mouse_termcode(KS_JSBTERM_MOUSE, (char_u *)"\033[0~zw"); else del_mouse_termcode(KS_JSBTERM_MOUSE); # endif @@ -3999,8 +3983,7 @@ check_mouse_termcode(void) && !gui.in_use # endif ) - set_mouse_termcode(KS_NETTERM_MOUSE, - (char_u *)IF_EB("\033}", ESC_STR "}")); + set_mouse_termcode(KS_NETTERM_MOUSE, (char_u *)"\033}"); else del_mouse_termcode(KS_NETTERM_MOUSE); # endif @@ -4013,7 +3996,7 @@ check_mouse_termcode(void) # endif ) set_mouse_termcode(KS_DEC_MOUSE, (char_u *)(term_is_8bit(T_NAME) - ? IF_EB("\233", CSI_STR) : IF_EB("\033[", ESC_STR "["))); + ? "\233" : "\033[")); else del_mouse_termcode(KS_DEC_MOUSE); # endif @@ -4024,8 +4007,7 @@ check_mouse_termcode(void) && !gui.in_use # endif ) - set_mouse_termcode(KS_PTERM_MOUSE, - (char_u *) IF_EB("\033[", ESC_STR "[")); + set_mouse_termcode(KS_PTERM_MOUSE, (char_u *)"\033["); else del_mouse_termcode(KS_PTERM_MOUSE); # endif @@ -4037,8 +4019,7 @@ check_mouse_termcode(void) ) { set_mouse_termcode(KS_URXVT_MOUSE, (char_u *)(term_is_8bit(T_NAME) - ? IF_EB("\233*M", CSI_STR "*M") - : IF_EB("\033[*M", ESC_STR "[*M"))); + ? "\233*M" : "\033[*M")); if (*p_mouse != NUL) { @@ -4056,12 +4037,10 @@ check_mouse_termcode(void) ) { set_mouse_termcode(KS_SGR_MOUSE, (char_u *)(term_is_8bit(T_NAME) - ? IF_EB("\233<*M", CSI_STR "<*M") - : IF_EB("\033[<*M", ESC_STR "[<*M"))); + ? "\233<*M" : "\033[<*M")); set_mouse_termcode(KS_SGR_MOUSE_RELEASE, (char_u *)(term_is_8bit(T_NAME) - ? IF_EB("\233<*m", CSI_STR "<*m") - : IF_EB("\033[<*m", ESC_STR "[<*m"))); + ? "\233<*m" : "\033[<*m")); if (*p_mouse != NUL) { @@ -6104,7 +6083,7 @@ WaitForCharOrMouse(long msec, int *interrupted, int ignore_input) { WantQueryMouse = FALSE; if (!no_query_mouse_for_testing) - mch_write((char_u *)IF_EB("\033[1'|", ESC_STR "[1'|"), 5); + mch_write((char_u *)"\033[1'|", 5); } #endif @@ -8207,114 +8186,3 @@ xsmp_close(void) } } #endif // USE_XSMP - - -#ifdef EBCDIC -// Translate character to its CTRL- value -char CtrlTable[] = -{ -/* 00 - 5E */ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -/* ^ */ 0x1E, -/* - */ 0x1F, -/* 61 - 6C */ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -/* _ */ 0x1F, -/* 6E - 80 */ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -/* a */ 0x01, -/* b */ 0x02, -/* c */ 0x03, -/* d */ 0x37, -/* e */ 0x2D, -/* f */ 0x2E, -/* g */ 0x2F, -/* h */ 0x16, -/* i */ 0x05, -/* 8A - 90 */ - 0, 0, 0, 0, 0, 0, 0, -/* j */ 0x15, -/* k */ 0x0B, -/* l */ 0x0C, -/* m */ 0x0D, -/* n */ 0x0E, -/* o */ 0x0F, -/* p */ 0x10, -/* q */ 0x11, -/* r */ 0x12, -/* 9A - A1 */ - 0, 0, 0, 0, 0, 0, 0, 0, -/* s */ 0x13, -/* t */ 0x3C, -/* u */ 0x3D, -/* v */ 0x32, -/* w */ 0x26, -/* x */ 0x18, -/* y */ 0x19, -/* z */ 0x3F, -/* AA - AC */ - 0, 0, 0, -/* [ */ 0x27, -/* AE - BC */ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -/* ] */ 0x1D, -/* BE - C0 */ 0, 0, 0, -/* A */ 0x01, -/* B */ 0x02, -/* C */ 0x03, -/* D */ 0x37, -/* E */ 0x2D, -/* F */ 0x2E, -/* G */ 0x2F, -/* H */ 0x16, -/* I */ 0x05, -/* CA - D0 */ 0, 0, 0, 0, 0, 0, 0, -/* J */ 0x15, -/* K */ 0x0B, -/* L */ 0x0C, -/* M */ 0x0D, -/* N */ 0x0E, -/* O */ 0x0F, -/* P */ 0x10, -/* Q */ 0x11, -/* R */ 0x12, -/* DA - DF */ 0, 0, 0, 0, 0, 0, -/* \ */ 0x1C, -/* E1 */ 0, -/* S */ 0x13, -/* T */ 0x3C, -/* U */ 0x3D, -/* V */ 0x32, -/* W */ 0x26, -/* X */ 0x18, -/* Y */ 0x19, -/* Z */ 0x3F, -/* EA - FF*/ 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -}; - -char MetaCharTable[]= -{// 0 1 2 3 4 5 6 7 8 9 A B C D E F - 0, 0, 0, 0,'\\', 0,'F', 0,'W','M','N', 0, 0, 0, 0, 0, - 0, 0, 0, 0,']', 0, 0,'G', 0, 0,'R','O', 0, 0, 0, 0, - '@','A','B','C','D','E', 0, 0,'H','I','J','K','L', 0, 0, 0, - 'P','Q', 0,'S','T','U','V', 0,'X','Y','Z','[', 0, 0,'^', 0 -}; - - -// TODO: Use characters NOT numbers!!! -char CtrlCharTable[]= -{// 0 1 2 3 4 5 6 7 8 9 A B C D E F - 124,193,194,195, 0,201, 0, 0, 0, 0, 0,210,211,212,213,214, - 215,216,217,226, 0,209,200, 0,231,232, 0, 0,224,189, 95,109, - 0, 0, 0, 0, 0, 0,230,173, 0, 0, 0, 0, 0,197,198,199, - 0, 0,229, 0, 0, 0, 0,196, 0, 0, 0, 0,227,228, 0,233, -}; - - -#endif diff --git a/src/proto/evalfunc.pro b/src/proto/evalfunc.pro index e508604983..f17735735b 100644 --- a/src/proto/evalfunc.pro +++ b/src/proto/evalfunc.pro @@ -1,5 +1,4 @@ /* evalfunc.c */ -void sortFunctions(void); char_u *get_function_name(expand_T *xp, int idx); char_u *get_expr_name(expand_T *xp, int idx); int find_internal_func(char_u *name); diff --git a/src/regexp.c b/src/regexp.c index 29c2d38821..81ca514924 100644 --- a/src/regexp.c +++ b/src/regexp.c @@ -231,21 +231,11 @@ init_class_tab(void) class_tab[i] = RI_DIGIT + RI_HEX + RI_WORD; else if (i >= 'a' && i <= 'f') class_tab[i] = RI_HEX + RI_WORD + RI_HEAD + RI_ALPHA + RI_LOWER; -#ifdef EBCDIC - else if ((i >= 'g' && i <= 'i') || (i >= 'j' && i <= 'r') - || (i >= 's' && i <= 'z')) -#else else if (i >= 'g' && i <= 'z') -#endif class_tab[i] = RI_WORD + RI_HEAD + RI_ALPHA + RI_LOWER; else if (i >= 'A' && i <= 'F') class_tab[i] = RI_HEX + RI_WORD + RI_HEAD + RI_ALPHA + RI_UPPER; -#ifdef EBCDIC - else if ((i >= 'G' && i <= 'I') || ( i >= 'J' && i <= 'R') - || (i >= 'S' && i <= 'Z')) -#else else if (i >= 'G' && i <= 'Z') -#endif class_tab[i] = RI_WORD + RI_HEAD + RI_ALPHA + RI_UPPER; else if (i == '_') class_tab[i] = RI_WORD + RI_HEAD; @@ -300,9 +290,6 @@ static int reg_strict; // "[abc" is illegal * META contains all characters that may be magic, except '^' and '$'. */ -#ifdef EBCDIC -static char_u META[] = "%&()*+.123456789<=>?@ACDFHIKLMOPSUVWX[_acdfhiklmnopsuvwxz{|~"; -#else // META[] is used often enough to justify turning it into a table. static char_u META_flags[] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, @@ -320,7 +307,6 @@ static char_u META_flags[] = { // p s u v w x z { | ~ 1, 0, 0, 1, 0, 1, 1, 1, 1, 0, 1, 1, 1, 0, 1 }; -#endif static int curchr; // currently parsed character // Previous character. Note: prevchr is sometimes -1 when we are not at the @@ -409,30 +395,6 @@ get_equi_class(char_u **pp) return 0; } -#ifdef EBCDIC -/* - * Table for equivalence class "c". (IBM-1047) - */ -static char *EQUIVAL_CLASS_C[16] = { - "A\x62\x63\x64\x65\x66\x67", - "C\x68", - "E\x71\x72\x73\x74", - "I\x75\x76\x77\x78", - "N\x69", - "O\xEB\xEC\xED\xEE\xEF\x80", - "U\xFB\xFC\xFD\xFE", - "Y\xBA", - "a\x42\x43\x44\x45\x46\x47", - "c\x48", - "e\x51\x52\x53\x54", - "i\x55\x56\x57\x58", - "n\x49", - "o\xCB\xCC\xCD\xCE\xCF\x70", - "u\xDB\xDC\xDD\xDE", - "y\x8D\xDF", -}; -#endif - /* * Check for a collating element "[.a.]". "pp" points to the '['. * Returns a character. Zero means that no item was recognized. Otherwise @@ -788,13 +750,7 @@ peekchr(void) if (c == NUL) curchr = '\\'; // trailing '\' - else if ( -#ifdef EBCDIC - vim_strchr(META, c) -#else - c <= '~' && META_flags[c] -#endif - ) + else if (c <= '~' && META_flags[c]) { /* * META contains everything that may be magic sometimes, diff --git a/src/regexp_bt.c b/src/regexp_bt.c index aee5c1becb..5f5e58f834 100644 --- a/src/regexp_bt.c +++ b/src/regexp_bt.c @@ -533,22 +533,6 @@ reg_equi_class(int c) if (enc_utf8 || STRCMP(p_enc, "latin1") == 0 || STRCMP(p_enc, "iso-8859-15") == 0) { -#ifdef EBCDIC - int i; - - // This might be slower than switch/case below. - for (i = 0; i < 16; i++) - { - if (vim_strchr(EQUIVAL_CLASS_C[i], c) != NULL) - { - char *p = EQUIVAL_CLASS_C[i]; - - while (*p != 0) - regmbc(*p++); - return; - } - } -#else switch (c) { // Do not use '\300' style, it results in a negative number. @@ -1012,7 +996,6 @@ reg_equi_class(int c) regmbc(0x1e95); regmbc(0x2c6c); return; } -#endif } regmbc(c); } @@ -1794,19 +1777,8 @@ collection: } else { -#ifdef EBCDIC - int alpha_only = FALSE; - - // for alphabetical range skip the gaps - // 'i'-'j', 'r'-'s', 'I'-'J' and 'R'-'S'. - if (isalpha(startc) && isalpha(endc)) - alpha_only = TRUE; -#endif while (++startc <= endc) -#ifdef EBCDIC - if (!alpha_only || isalpha(startc)) -#endif - regc(startc); + regc(startc); } startc = -1; } diff --git a/src/regexp_nfa.c b/src/regexp_nfa.c index 39f7f8ba88..c8ac8d42a9 100644 --- a/src/regexp_nfa.c +++ b/src/regexp_nfa.c @@ -698,119 +698,61 @@ nfa_emit_equi_class(int c) if (enc_utf8 || STRCMP(p_enc, "latin1") == 0 || STRCMP(p_enc, "iso-8859-15") == 0) { -#ifdef EBCDIC -# define A_circumflex 0x62 -# define A_diaeresis 0x63 -# define A_grave 0x64 -# define A_acute 0x65 -# define A_virguilla 0x66 -# define A_ring 0x67 -# define C_cedilla 0x68 -# define E_acute 0x71 -# define E_circumflex 0x72 -# define E_diaeresis 0x73 -# define E_grave 0x74 -# define I_acute 0x75 -# define I_circumflex 0x76 -# define I_diaeresis 0x77 -# define I_grave 0x78 -# define N_virguilla 0x69 -# define O_circumflex 0xeb -# define O_diaeresis 0xec -# define O_grave 0xed -# define O_acute 0xee -# define O_virguilla 0xef -# define O_slash 0x80 -# define U_circumflex 0xfb -# define U_diaeresis 0xfc -# define U_grave 0xfd -# define U_acute 0xfe -# define Y_acute 0xba -# define a_grave 0x42 -# define a_acute 0x43 -# define a_circumflex 0x44 -# define a_virguilla 0x45 -# define a_diaeresis 0x46 -# define a_ring 0x47 -# define c_cedilla 0x48 -# define e_grave 0x51 -# define e_acute 0x52 -# define e_circumflex 0x53 -# define e_diaeresis 0x54 -# define i_grave 0x55 -# define i_acute 0x56 -# define i_circumflex 0x57 -# define i_diaeresis 0x58 -# define n_virguilla 0x49 -# define o_grave 0xcb -# define o_acute 0xcc -# define o_circumflex 0xcd -# define o_virguilla 0xce -# define o_diaeresis 0xcf -# define o_slash 0x70 -# define u_grave 0xdb -# define u_acute 0xdc -# define u_circumflex 0xdd -# define u_diaeresis 0xde -# define y_acute 0x8d -# define y_diaeresis 0xdf -#else -# define A_grave 0xc0 -# define A_acute 0xc1 -# define A_circumflex 0xc2 -# define A_virguilla 0xc3 -# define A_diaeresis 0xc4 -# define A_ring 0xc5 -# define C_cedilla 0xc7 -# define E_grave 0xc8 -# define E_acute 0xc9 -# define E_circumflex 0xca -# define E_diaeresis 0xcb -# define I_grave 0xcc -# define I_acute 0xcd -# define I_circumflex 0xce -# define I_diaeresis 0xcf -# define N_virguilla 0xd1 -# define O_grave 0xd2 -# define O_acute 0xd3 -# define O_circumflex 0xd4 -# define O_virguilla 0xd5 -# define O_diaeresis 0xd6 -# define O_slash 0xd8 -# define U_grave 0xd9 -# define U_acute 0xda -# define U_circumflex 0xdb -# define U_diaeresis 0xdc -# define Y_acute 0xdd -# define a_grave 0xe0 -# define a_acute 0xe1 -# define a_circumflex 0xe2 -# define a_virguilla 0xe3 -# define a_diaeresis 0xe4 -# define a_ring 0xe5 -# define c_cedilla 0xe7 -# define e_grave 0xe8 -# define e_acute 0xe9 -# define e_circumflex 0xea -# define e_diaeresis 0xeb -# define i_grave 0xec -# define i_acute 0xed -# define i_circumflex 0xee -# define i_diaeresis 0xef -# define n_virguilla 0xf1 -# define o_grave 0xf2 -# define o_acute 0xf3 -# define o_circumflex 0xf4 -# define o_virguilla 0xf5 -# define o_diaeresis 0xf6 -# define o_slash 0xf8 -# define u_grave 0xf9 -# define u_acute 0xfa -# define u_circumflex 0xfb -# define u_diaeresis 0xfc -# define y_acute 0xfd -# define y_diaeresis 0xff -#endif +#define A_grave 0xc0 +#define A_acute 0xc1 +#define A_circumflex 0xc2 +#define A_virguilla 0xc3 +#define A_diaeresis 0xc4 +#define A_ring 0xc5 +#define C_cedilla 0xc7 +#define E_grave 0xc8 +#define E_acute 0xc9 +#define E_circumflex 0xca +#define E_diaeresis 0xcb +#define I_grave 0xcc +#define I_acute 0xcd +#define I_circumflex 0xce +#define I_diaeresis 0xcf +#define N_virguilla 0xd1 +#define O_grave 0xd2 +#define O_acute 0xd3 +#define O_circumflex 0xd4 +#define O_virguilla 0xd5 +#define O_diaeresis 0xd6 +#define O_slash 0xd8 +#define U_grave 0xd9 +#define U_acute 0xda +#define U_circumflex 0xdb +#define U_diaeresis 0xdc +#define Y_acute 0xdd +#define a_grave 0xe0 +#define a_acute 0xe1 +#define a_circumflex 0xe2 +#define a_virguilla 0xe3 +#define a_diaeresis 0xe4 +#define a_ring 0xe5 +#define c_cedilla 0xe7 +#define e_grave 0xe8 +#define e_acute 0xe9 +#define e_circumflex 0xea +#define e_diaeresis 0xeb +#define i_grave 0xec +#define i_acute 0xed +#define i_circumflex 0xee +#define i_diaeresis 0xef +#define n_virguilla 0xf1 +#define o_grave 0xf2 +#define o_acute 0xf3 +#define o_circumflex 0xf4 +#define o_virguilla 0xf5 +#define o_diaeresis 0xf6 +#define o_slash 0xf8 +#define u_grave 0xf9 +#define u_acute 0xfa +#define u_circumflex 0xfb +#define u_diaeresis 0xfc +#define y_acute 0xfd +#define y_diaeresis 0xff switch (c) { case 'A': case A_grave: case A_acute: case A_circumflex: @@ -2041,24 +1983,13 @@ collection: } else { -#ifdef EBCDIC - int alpha_only = FALSE; - - // for alphabetical range skip the gaps - // 'i'-'j', 'r'-'s', 'I'-'J' and 'R'-'S'. - if (isalpha(startc) && isalpha(endc)) - alpha_only = TRUE; -#endif // Emit the range. "startc" was already emitted, so // skip it. for (c = startc + 1; c <= endc; c++) -#ifdef EBCDIC - if (!alpha_only || isalpha(startc)) -#endif - { - EMIT(c); - EMIT(NFA_CONCAT); - } + { + EMIT(c); + EMIT(NFA_CONCAT); + } } emit_range = FALSE; startc = -1; diff --git a/src/register.c b/src/register.c index 2633f0238b..9406ff84b8 100644 --- a/src/register.c +++ b/src/register.c @@ -2297,21 +2297,7 @@ get_register_name(int num) return '+'; #endif else - { -#ifdef EBCDIC - int i; - - // EBCDIC is really braindead ... - i = 'a' + (num - 10); - if (i > 'i') - i += 7; - if (i > 'r') - i += 8; - return i; -#else return num + 'a' - 10; -#endif - } } #if defined(FEAT_EVAL) || defined(PROTO) diff --git a/src/screen.c b/src/screen.c index bc1a6c86c2..adcc4b5bab 100644 --- a/src/screen.c +++ b/src/screen.c @@ -1796,7 +1796,7 @@ screen_start_highlight(int attr) char buf[20]; // The GUI handles this internally. - sprintf(buf, IF_EB("\033|%dh", ESC_STR "|%dh"), attr); + sprintf(buf, "\033|%dh", attr); OUT_STR(buf); } else @@ -1946,7 +1946,7 @@ screen_stop_highlight(void) char buf[20]; // use internal GUI code - sprintf(buf, IF_EB("\033|%dH", ESC_STR "|%dH"), screen_attr); + sprintf(buf, "\033|%dH", screen_attr); OUT_STR(buf); } else diff --git a/src/spell.c b/src/spell.c index 1fae9b74b9..86f5750987 100644 --- a/src/spell.c +++ b/src/spell.c @@ -2534,7 +2534,6 @@ close_spellbuf(buf_T *buf) /* * Init the chartab used for spelling for ASCII. - * EBCDIC is not supported! */ void clear_spell_chartab(spelltab_T *sp) diff --git a/src/strings.c b/src/strings.c index f6affd6fe0..7a99cd9642 100644 --- a/src/strings.c +++ b/src/strings.c @@ -342,11 +342,7 @@ vim_strup( { p2 = p; while ((c = *p2) != NUL) -#ifdef EBCDIC - *p2++ = isalpha(c) ? toupper(c) : c; -#else *p2++ = (c < 'a' || c > 'z') ? c : (c - 0x20); -#endif } } diff --git a/src/structs.h b/src/structs.h index a35361ecb6..ecab3541d5 100644 --- a/src/structs.h +++ b/src/structs.h @@ -136,9 +136,6 @@ typedef struct { * (a normal mark is a lnum/col pair, the same as a file position) */ -// (Note: for EBCDIC there are more than 26, because there are gaps in the -// alphabet coding. To minimize changes to the code, I decided to just -// increase the number of possible marks. #define NMARKS ('z' - 'a' + 1) // max. # of named marks #define EXTRA_MARKS 10 // marks 0-9 #define JUMPLISTSIZE 100 // max. # of marks in jump list diff --git a/src/term.c b/src/term.c index 0090fb7ec2..45dde3c284 100644 --- a/src/term.c +++ b/src/term.c @@ -222,48 +222,48 @@ static struct builtin_term builtin_termcaps[] = * GUI pseudo term-cap. */ {(int)KS_NAME, "gui"}, - {(int)KS_CE, IF_EB("\033|$", ESC_STR "|$")}, - {(int)KS_AL, IF_EB("\033|i", ESC_STR "|i")}, + {(int)KS_CE, "\033|$"}, + {(int)KS_AL, "\033|i"}, # ifdef TERMINFO - {(int)KS_CAL, IF_EB("\033|%p1%dI", ESC_STR "|%p1%dI")}, + {(int)KS_CAL, "\033|%p1%dI"}, # else - {(int)KS_CAL, IF_EB("\033|%dI", ESC_STR "|%dI")}, + {(int)KS_CAL, "\033|%dI"}, # endif - {(int)KS_DL, IF_EB("\033|d", ESC_STR "|d")}, + {(int)KS_DL, "\033|d"}, # ifdef TERMINFO - {(int)KS_CDL, IF_EB("\033|%p1%dD", ESC_STR "|%p1%dD")}, - {(int)KS_CS, IF_EB("\033|%p1%d;%p2%dR", ESC_STR "|%p1%d;%p2%dR")}, - {(int)KS_CSV, IF_EB("\033|%p1%d;%p2%dV", ESC_STR "|%p1%d;%p2%dV")}, + {(int)KS_CDL, "\033|%p1%dD"}, + {(int)KS_CS, "\033|%p1%d;%p2%dR"}, + {(int)KS_CSV, "\033|%p1%d;%p2%dV"}, # else - {(int)KS_CDL, IF_EB("\033|%dD", ESC_STR "|%dD")}, - {(int)KS_CS, IF_EB("\033|%d;%dR", ESC_STR "|%d;%dR")}, - {(int)KS_CSV, IF_EB("\033|%d;%dV", ESC_STR "|%d;%dV")}, + {(int)KS_CDL, "\033|%dD"}, + {(int)KS_CS, "\033|%d;%dR"}, + {(int)KS_CSV, "\033|%d;%dV"}, # endif - {(int)KS_CL, IF_EB("\033|C", ESC_STR "|C")}, + {(int)KS_CL, "\033|C"}, // attributes switched on with 'h', off with * 'H' - {(int)KS_ME, IF_EB("\033|31H", ESC_STR "|31H")}, // HL_ALL - {(int)KS_MR, IF_EB("\033|1h", ESC_STR "|1h")}, // HL_INVERSE - {(int)KS_MD, IF_EB("\033|2h", ESC_STR "|2h")}, // HL_BOLD - {(int)KS_SE, IF_EB("\033|16H", ESC_STR "|16H")}, // HL_STANDOUT - {(int)KS_SO, IF_EB("\033|16h", ESC_STR "|16h")}, // HL_STANDOUT - {(int)KS_UE, IF_EB("\033|8H", ESC_STR "|8H")}, // HL_UNDERLINE - {(int)KS_US, IF_EB("\033|8h", ESC_STR "|8h")}, // HL_UNDERLINE - {(int)KS_UCE, IF_EB("\033|8C", ESC_STR "|8C")}, // HL_UNDERCURL - {(int)KS_UCS, IF_EB("\033|8c", ESC_STR "|8c")}, // HL_UNDERCURL - {(int)KS_STE, IF_EB("\033|4C", ESC_STR "|4C")}, // HL_STRIKETHROUGH - {(int)KS_STS, IF_EB("\033|4c", ESC_STR "|4c")}, // HL_STRIKETHROUGH - {(int)KS_CZR, IF_EB("\033|4H", ESC_STR "|4H")}, // HL_ITALIC - {(int)KS_CZH, IF_EB("\033|4h", ESC_STR "|4h")}, // HL_ITALIC - {(int)KS_VB, IF_EB("\033|f", ESC_STR "|f")}, + {(int)KS_ME, "\033|31H"}, // HL_ALL + {(int)KS_MR, "\033|1h"}, // HL_INVERSE + {(int)KS_MD, "\033|2h"}, // HL_BOLD + {(int)KS_SE, "\033|16H"}, // HL_STANDOUT + {(int)KS_SO, "\033|16h"}, // HL_STANDOUT + {(int)KS_UE, "\033|8H"}, // HL_UNDERLINE + {(int)KS_US, "\033|8h"}, // HL_UNDERLINE + {(int)KS_UCE, "\033|8C"}, // HL_UNDERCURL + {(int)KS_UCS, "\033|8c"}, // HL_UNDERCURL + {(int)KS_STE, "\033|4C"}, // HL_STRIKETHROUGH + {(int)KS_STS, "\033|4c"}, // HL_STRIKETHROUGH + {(int)KS_CZR, "\033|4H"}, // HL_ITALIC + {(int)KS_CZH, "\033|4h"}, // HL_ITALIC + {(int)KS_VB, "\033|f"}, {(int)KS_MS, "y"}, {(int)KS_UT, "y"}, {(int)KS_XN, "y"}, {(int)KS_LE, "\b"}, // cursor-left = BS {(int)KS_ND, "\014"}, // cursor-right = CTRL-L # ifdef TERMINFO - {(int)KS_CM, IF_EB("\033|%p1%d;%p2%dM", ESC_STR "|%p1%d;%p2%dM")}, + {(int)KS_CM, "\033|%p1%d;%p2%dM"}, # else - {(int)KS_CM, IF_EB("\033|%d;%dM", ESC_STR "|%d;%dM")}, + {(int)KS_CM, "\033|%d;%dM"}, # endif // there are no key sequences here, the GUI sequences are recognized // in check_termcode() @@ -438,34 +438,34 @@ static struct builtin_term builtin_termcaps[] = * standard ANSI terminal, default for unix */ {(int)KS_NAME, "ansi"}, - {(int)KS_CE, IF_EB("\033[K", ESC_STR "[K")}, - {(int)KS_AL, IF_EB("\033[L", ESC_STR "[L")}, + {(int)KS_CE, "\033[K"}, + {(int)KS_AL, "\033[L"}, # ifdef TERMINFO - {(int)KS_CAL, IF_EB("\033[%p1%dL", ESC_STR "[%p1%dL")}, + {(int)KS_CAL, "\033[%p1%dL"}, # else - {(int)KS_CAL, IF_EB("\033[%dL", ESC_STR "[%dL")}, + {(int)KS_CAL, "\033[%dL"}, # endif - {(int)KS_DL, IF_EB("\033[M", ESC_STR "[M")}, + {(int)KS_DL, "\033[M"}, # ifdef TERMINFO - {(int)KS_CDL, IF_EB("\033[%p1%dM", ESC_STR "[%p1%dM")}, + {(int)KS_CDL, "\033[%p1%dM"}, # else - {(int)KS_CDL, IF_EB("\033[%dM", ESC_STR "[%dM")}, + {(int)KS_CDL, "\033[%dM"}, # endif - {(int)KS_CL, IF_EB("\033[H\033[2J", ESC_STR "[H" ESC_STR_nc "[2J")}, - {(int)KS_ME, IF_EB("\033[0m", ESC_STR "[0m")}, - {(int)KS_MR, IF_EB("\033[7m", ESC_STR "[7m")}, + {(int)KS_CL, "\033[H\033[2J"}, + {(int)KS_ME, "\033[0m"}, + {(int)KS_MR, "\033[7m"}, {(int)KS_MS, "y"}, {(int)KS_UT, "y"}, // guessed {(int)KS_LE, "\b"}, # ifdef TERMINFO - {(int)KS_CM, IF_EB("\033[%i%p1%d;%p2%dH", ESC_STR "[%i%p1%d;%p2%dH")}, + {(int)KS_CM, "\033[%i%p1%d;%p2%dH"}, # else - {(int)KS_CM, IF_EB("\033[%i%d;%dH", ESC_STR "[%i%d;%dH")}, + {(int)KS_CM, "\033[%i%d;%dH"}, # endif # ifdef TERMINFO - {(int)KS_CRI, IF_EB("\033[%p1%dC", ESC_STR "[%p1%dC")}, + {(int)KS_CRI, "\033[%p1%dC"}, # else - {(int)KS_CRI, IF_EB("\033[%dC", ESC_STR "[%dC")}, + {(int)KS_CRI, "\033[%dC"}, # endif # endif @@ -691,98 +691,97 @@ static struct builtin_term builtin_termcaps[] = * - keyboard languages (CSI ? 26 n) */ {(int)KS_NAME, "vt320"}, - {(int)KS_CE, IF_EB("\033[K", ESC_STR "[K")}, - {(int)KS_AL, IF_EB("\033[L", ESC_STR "[L")}, + {(int)KS_CE, "\033[K"}, + {(int)KS_AL, "\033[L"}, # ifdef TERMINFO - {(int)KS_CAL, IF_EB("\033[%p1%dL", ESC_STR "[%p1%dL")}, + {(int)KS_CAL, "\033[%p1%dL"}, # else - {(int)KS_CAL, IF_EB("\033[%dL", ESC_STR "[%dL")}, + {(int)KS_CAL, "\033[%dL"}, # endif - {(int)KS_DL, IF_EB("\033[M", ESC_STR "[M")}, + {(int)KS_DL, "\033[M"}, # ifdef TERMINFO - {(int)KS_CDL, IF_EB("\033[%p1%dM", ESC_STR "[%p1%dM")}, + {(int)KS_CDL, "\033[%p1%dM"}, # else - {(int)KS_CDL, IF_EB("\033[%dM", ESC_STR "[%dM")}, + {(int)KS_CDL, "\033[%dM"}, # endif - {(int)KS_CL, IF_EB("\033[H\033[2J", ESC_STR "[H" ESC_STR_nc "[2J")}, - {(int)KS_CD, IF_EB("\033[J", ESC_STR "[J")}, + {(int)KS_CL, "\033[H\033[2J"}, + {(int)KS_CD, "\033[J"}, {(int)KS_CCO, "8"}, // allow 8 colors - {(int)KS_ME, IF_EB("\033[0m", ESC_STR "[0m")}, - {(int)KS_MR, IF_EB("\033[7m", ESC_STR "[7m")}, - {(int)KS_MD, IF_EB("\033[1m", ESC_STR "[1m")}, // bold mode - {(int)KS_SE, IF_EB("\033[22m", ESC_STR "[22m")},// normal mode - {(int)KS_UE, IF_EB("\033[24m", ESC_STR "[24m")},// exit underscore mode - {(int)KS_US, IF_EB("\033[4m", ESC_STR "[4m")}, // underscore mode - {(int)KS_CZH, IF_EB("\033[34;43m", ESC_STR "[34;43m")}, // italic mode: blue text on yellow - {(int)KS_CZR, IF_EB("\033[0m", ESC_STR "[0m")}, // italic mode end - {(int)KS_CAB, IF_EB("\033[4%dm", ESC_STR "[4%dm")}, // set background color (ANSI) - {(int)KS_CAF, IF_EB("\033[3%dm", ESC_STR "[3%dm")}, // set foreground color (ANSI) - {(int)KS_CSB, IF_EB("\033[102;%dm", ESC_STR "[102;%dm")}, // set screen background color - {(int)KS_CSF, IF_EB("\033[101;%dm", ESC_STR "[101;%dm")}, // set screen foreground color + {(int)KS_ME, "\033[0m"}, + {(int)KS_MR, "\033[7m"}, + {(int)KS_MD, "\033[1m"}, // bold mode + {(int)KS_SE, "\033[22m"},// normal mode + {(int)KS_UE, "\033[24m"},// exit underscore mode + {(int)KS_US, "\033[4m"}, // underscore mode + {(int)KS_CZH, "\033[34;43m"}, // italic mode: blue text on yellow + {(int)KS_CZR, "\033[0m"}, // italic mode end + {(int)KS_CAB, "\033[4%dm"}, // set background color (ANSI) + {(int)KS_CAF, "\033[3%dm"}, // set foreground color (ANSI) + {(int)KS_CSB, "\033[102;%dm"}, // set screen background color + {(int)KS_CSF, "\033[101;%dm"}, // set screen foreground color {(int)KS_MS, "y"}, {(int)KS_UT, "y"}, {(int)KS_XN, "y"}, {(int)KS_LE, "\b"}, # ifdef TERMINFO - {(int)KS_CM, IF_EB("\033[%i%p1%d;%p2%dH", - ESC_STR "[%i%p1%d;%p2%dH")}, + {(int)KS_CM, "\033[%i%p1%d;%p2%dH"}, # else - {(int)KS_CM, IF_EB("\033[%i%d;%dH", ESC_STR "[%i%d;%dH")}, + {(int)KS_CM, "\033[%i%d;%dH"}, # endif # ifdef TERMINFO - {(int)KS_CRI, IF_EB("\033[%p1%dC", ESC_STR "[%p1%dC")}, + {(int)KS_CRI, "\033[%p1%dC"}, # else - {(int)KS_CRI, IF_EB("\033[%dC", ESC_STR "[%dC")}, + {(int)KS_CRI, "\033[%dC"}, # endif - {K_UP, IF_EB("\033[A", ESC_STR "[A")}, - {K_DOWN, IF_EB("\033[B", ESC_STR "[B")}, - {K_RIGHT, IF_EB("\033[C", ESC_STR "[C")}, - {K_LEFT, IF_EB("\033[D", ESC_STR "[D")}, + {K_UP, "\033[A"}, + {K_DOWN, "\033[B"}, + {K_RIGHT, "\033[C"}, + {K_LEFT, "\033[D"}, // Note: cursor key sequences for application cursor mode are omitted, // because they interfere with typed commands: OA. - {K_F1, IF_EB("\033[11~", ESC_STR "[11~")}, - {K_F2, IF_EB("\033[12~", ESC_STR "[12~")}, - {K_F3, IF_EB("\033[13~", ESC_STR "[13~")}, - {K_F4, IF_EB("\033[14~", ESC_STR "[14~")}, - {K_F5, IF_EB("\033[15~", ESC_STR "[15~")}, - {K_F6, IF_EB("\033[17~", ESC_STR "[17~")}, - {K_F7, IF_EB("\033[18~", ESC_STR "[18~")}, - {K_F8, IF_EB("\033[19~", ESC_STR "[19~")}, - {K_F9, IF_EB("\033[20~", ESC_STR "[20~")}, - {K_F10, IF_EB("\033[21~", ESC_STR "[21~")}, - {K_F11, IF_EB("\033[23~", ESC_STR "[23~")}, - {K_F12, IF_EB("\033[24~", ESC_STR "[24~")}, - {K_F13, IF_EB("\033[25~", ESC_STR "[25~")}, - {K_F14, IF_EB("\033[26~", ESC_STR "[26~")}, - {K_F15, IF_EB("\033[28~", ESC_STR "[28~")}, // Help - {K_F16, IF_EB("\033[29~", ESC_STR "[29~")}, // Select - {K_F17, IF_EB("\033[31~", ESC_STR "[31~")}, - {K_F18, IF_EB("\033[32~", ESC_STR "[32~")}, - {K_F19, IF_EB("\033[33~", ESC_STR "[33~")}, - {K_F20, IF_EB("\033[34~", ESC_STR "[34~")}, - {K_INS, IF_EB("\033[2~", ESC_STR "[2~")}, - {K_DEL, IF_EB("\033[3~", ESC_STR "[3~")}, - {K_HOME, IF_EB("\033[1~", ESC_STR "[1~")}, - {K_END, IF_EB("\033[4~", ESC_STR "[4~")}, - {K_PAGEUP, IF_EB("\033[5~", ESC_STR "[5~")}, - {K_PAGEDOWN, IF_EB("\033[6~", ESC_STR "[6~")}, + {K_F1, "\033[11~"}, + {K_F2, "\033[12~"}, + {K_F3, "\033[13~"}, + {K_F4, "\033[14~"}, + {K_F5, "\033[15~"}, + {K_F6, "\033[17~"}, + {K_F7, "\033[18~"}, + {K_F8, "\033[19~"}, + {K_F9, "\033[20~"}, + {K_F10, "\033[21~"}, + {K_F11, "\033[23~"}, + {K_F12, "\033[24~"}, + {K_F13, "\033[25~"}, + {K_F14, "\033[26~"}, + {K_F15, "\033[28~"}, // Help + {K_F16, "\033[29~"}, // Select + {K_F17, "\033[31~"}, + {K_F18, "\033[32~"}, + {K_F19, "\033[33~"}, + {K_F20, "\033[34~"}, + {K_INS, "\033[2~"}, + {K_DEL, "\033[3~"}, + {K_HOME, "\033[1~"}, + {K_END, "\033[4~"}, + {K_PAGEUP, "\033[5~"}, + {K_PAGEDOWN, "\033[6~"}, // These sequences starting with O may interfere with what the user // is typing. Remove these if that bothers you. - {K_KPLUS, IF_EB("\033Ok", ESC_STR "Ok")}, // keypad plus - {K_KMINUS, IF_EB("\033Om", ESC_STR "Om")}, // keypad minus - {K_KDIVIDE, IF_EB("\033Oo", ESC_STR "Oo")}, // keypad / - {K_KMULTIPLY, IF_EB("\033Oj", ESC_STR "Oj")}, // keypad * - {K_KENTER, IF_EB("\033OM", ESC_STR "OM")}, // keypad Enter - {K_K0, IF_EB("\033Op", ESC_STR "Op")}, // keypad 0 - {K_K1, IF_EB("\033Oq", ESC_STR "Oq")}, // keypad 1 - {K_K2, IF_EB("\033Or", ESC_STR "Or")}, // keypad 2 - {K_K3, IF_EB("\033Os", ESC_STR "Os")}, // keypad 3 - {K_K4, IF_EB("\033Ot", ESC_STR "Ot")}, // keypad 4 - {K_K5, IF_EB("\033Ou", ESC_STR "Ou")}, // keypad 5 - {K_K6, IF_EB("\033Ov", ESC_STR "Ov")}, // keypad 6 - {K_K7, IF_EB("\033Ow", ESC_STR "Ow")}, // keypad 7 - {K_K8, IF_EB("\033Ox", ESC_STR "Ox")}, // keypad 8 - {K_K9, IF_EB("\033Oy", ESC_STR "Oy")}, // keypad 9 + {K_KPLUS, "\033Ok"}, // keypad plus + {K_KMINUS, "\033Om"}, // keypad minus + {K_KDIVIDE, "\033Oo"}, // keypad / + {K_KMULTIPLY, "\033Oj"}, // keypad * + {K_KENTER, "\033OM"}, // keypad Enter + {K_K0, "\033Op"}, // keypad 0 + {K_K1, "\033Oq"}, // keypad 1 + {K_K2, "\033Or"}, // keypad 2 + {K_K3, "\033Os"}, // keypad 3 + {K_K4, "\033Ot"}, // keypad 4 + {K_K5, "\033Ou"}, // keypad 5 + {K_K6, "\033Ov"}, // keypad 6 + {K_K7, "\033Ow"}, // keypad 7 + {K_K8, "\033Ox"}, // keypad 8 + {K_K9, "\033Oy"}, // keypad 9 {K_BS, "\x7f"}, // for some reason 0177 doesn't work # endif @@ -791,226 +790,220 @@ static struct builtin_term builtin_termcaps[] = * Ordinary vt52 */ {(int)KS_NAME, "vt52"}, - {(int)KS_CE, IF_EB("\033K", ESC_STR "K")}, - {(int)KS_CD, IF_EB("\033J", ESC_STR "J")}, + {(int)KS_CE, "\033K"}, + {(int)KS_CD, "\033J"}, # ifdef TERMINFO - {(int)KS_CM, IF_EB("\033Y%p1%' '%+%c%p2%' '%+%c", - ESC_STR "Y%p1%' '%+%c%p2%' '%+%c")}, + {(int)KS_CM, "\033Y%p1%' '%+%c%p2%' '%+%c"}, # else - {(int)KS_CM, IF_EB("\033Y%+ %+ ", ESC_STR "Y%+ %+ ")}, + {(int)KS_CM, "\033Y%+ %+ "}, # endif {(int)KS_LE, "\b"}, - {(int)KS_SR, IF_EB("\033I", ESC_STR "I")}, - {(int)KS_AL, IF_EB("\033L", ESC_STR "L")}, - {(int)KS_DL, IF_EB("\033M", ESC_STR "M")}, - {K_UP, IF_EB("\033A", ESC_STR "A")}, - {K_DOWN, IF_EB("\033B", ESC_STR "B")}, - {K_LEFT, IF_EB("\033D", ESC_STR "D")}, - {K_RIGHT, IF_EB("\033C", ESC_STR "C")}, - {K_F1, IF_EB("\033P", ESC_STR "P")}, - {K_F2, IF_EB("\033Q", ESC_STR "Q")}, - {K_F3, IF_EB("\033R", ESC_STR "R")}, - {(int)KS_CL, IF_EB("\033H\033J", ESC_STR "H" ESC_STR_nc "J")}, + {(int)KS_SR, "\033I"}, + {(int)KS_AL, "\033L"}, + {(int)KS_DL, "\033M"}, + {K_UP, "\033A"}, + {K_DOWN, "\033B"}, + {K_LEFT, "\033D"}, + {K_RIGHT, "\033C"}, + {K_F1, "\033P"}, + {K_F2, "\033Q"}, + {K_F3, "\033R"}, + {(int)KS_CL, "\033H\033J"}, {(int)KS_MS, "y"}, # endif # if defined(UNIX) || defined(ALL_BUILTIN_TCAPS) || defined(SOME_BUILTIN_TCAPS) {(int)KS_NAME, "xterm"}, - {(int)KS_CE, IF_EB("\033[K", ESC_STR "[K")}, - {(int)KS_AL, IF_EB("\033[L", ESC_STR "[L")}, + {(int)KS_CE, "\033[K"}, + {(int)KS_AL, "\033[L"}, # ifdef TERMINFO - {(int)KS_CAL, IF_EB("\033[%p1%dL", ESC_STR "[%p1%dL")}, + {(int)KS_CAL, "\033[%p1%dL"}, # else - {(int)KS_CAL, IF_EB("\033[%dL", ESC_STR "[%dL")}, + {(int)KS_CAL, "\033[%dL"}, # endif - {(int)KS_DL, IF_EB("\033[M", ESC_STR "[M")}, + {(int)KS_DL, "\033[M"}, # ifdef TERMINFO - {(int)KS_CDL, IF_EB("\033[%p1%dM", ESC_STR "[%p1%dM")}, + {(int)KS_CDL, "\033[%p1%dM"}, # else - {(int)KS_CDL, IF_EB("\033[%dM", ESC_STR "[%dM")}, + {(int)KS_CDL, "\033[%dM"}, # endif # ifdef TERMINFO - {(int)KS_CS, IF_EB("\033[%i%p1%d;%p2%dr", - ESC_STR "[%i%p1%d;%p2%dr")}, + {(int)KS_CS, "\033[%i%p1%d;%p2%dr"}, # else - {(int)KS_CS, IF_EB("\033[%i%d;%dr", ESC_STR "[%i%d;%dr")}, + {(int)KS_CS, "\033[%i%d;%dr"}, # endif - {(int)KS_CL, IF_EB("\033[H\033[2J", ESC_STR "[H" ESC_STR_nc "[2J")}, - {(int)KS_CD, IF_EB("\033[J", ESC_STR "[J")}, - {(int)KS_ME, IF_EB("\033[m", ESC_STR "[m")}, - {(int)KS_MR, IF_EB("\033[7m", ESC_STR "[7m")}, - {(int)KS_MD, IF_EB("\033[1m", ESC_STR "[1m")}, - {(int)KS_UE, IF_EB("\033[m", ESC_STR "[m")}, - {(int)KS_US, IF_EB("\033[4m", ESC_STR "[4m")}, - {(int)KS_STE, IF_EB("\033[29m", ESC_STR "[29m")}, - {(int)KS_STS, IF_EB("\033[9m", ESC_STR "[9m")}, + {(int)KS_CL, "\033[H\033[2J"}, + {(int)KS_CD, "\033[J"}, + {(int)KS_ME, "\033[m"}, + {(int)KS_MR, "\033[7m"}, + {(int)KS_MD, "\033[1m"}, + {(int)KS_UE, "\033[m"}, + {(int)KS_US, "\033[4m"}, + {(int)KS_STE, "\033[29m"}, + {(int)KS_STS, "\033[9m"}, {(int)KS_MS, "y"}, {(int)KS_UT, "y"}, {(int)KS_LE, "\b"}, - {(int)KS_VI, IF_EB("\033[?25l", ESC_STR "[?25l")}, - {(int)KS_VE, IF_EB("\033[?25h", ESC_STR "[?25h")}, - {(int)KS_VS, IF_EB("\033[?12h", ESC_STR "[?12h")}, - {(int)KS_CVS, IF_EB("\033[?12l", ESC_STR "[?12l")}, + {(int)KS_VI, "\033[?25l"}, + {(int)KS_VE, "\033[?25h"}, + {(int)KS_VS, "\033[?12h"}, + {(int)KS_CVS, "\033[?12l"}, # ifdef TERMINFO - {(int)KS_CSH, IF_EB("\033[%p1%d q", ESC_STR "[%p1%d q")}, + {(int)KS_CSH, "\033[%p1%d q"}, # else - {(int)KS_CSH, IF_EB("\033[%d q", ESC_STR "[%d q")}, + {(int)KS_CSH, "\033[%d q"}, # endif - {(int)KS_CRC, IF_EB("\033[?12$p", ESC_STR "[?12$p")}, - {(int)KS_CRS, IF_EB("\033P$q q\033\\", ESC_STR "P$q q" ESC_STR "\\")}, + {(int)KS_CRC, "\033[?12$p"}, + {(int)KS_CRS, "\033P$q q\033\\"}, # ifdef TERMINFO - {(int)KS_CM, IF_EB("\033[%i%p1%d;%p2%dH", - ESC_STR "[%i%p1%d;%p2%dH")}, + {(int)KS_CM, "\033[%i%p1%d;%p2%dH"}, # else - {(int)KS_CM, IF_EB("\033[%i%d;%dH", ESC_STR "[%i%d;%dH")}, + {(int)KS_CM, "\033[%i%d;%dH"}, # endif - {(int)KS_SR, IF_EB("\033M", ESC_STR "M")}, + {(int)KS_SR, "\033M"}, # ifdef TERMINFO - {(int)KS_CRI, IF_EB("\033[%p1%dC", ESC_STR "[%p1%dC")}, + {(int)KS_CRI, "\033[%p1%dC"}, # else - {(int)KS_CRI, IF_EB("\033[%dC", ESC_STR "[%dC")}, + {(int)KS_CRI, "\033[%dC"}, # endif - {(int)KS_KS, IF_EB("\033[?1h\033=", ESC_STR "[?1h" ESC_STR_nc "=")}, - {(int)KS_KE, IF_EB("\033[?1l\033>", ESC_STR "[?1l" ESC_STR_nc ">")}, + {(int)KS_KS, "\033[?1h\033="}, + {(int)KS_KE, "\033[?1l\033>"}, # ifdef FEAT_XTERM_SAVE - {(int)KS_TI, IF_EB("\0337\033[?47h", ESC_STR "7" ESC_STR_nc "[?47h")}, - {(int)KS_TE, IF_EB("\033[?47l\0338", - ESC_STR_nc "[?47l" ESC_STR_nc "8")}, + {(int)KS_TI, "\0337\033[?47h"}, + {(int)KS_TE, "\033[?47l\0338"}, # endif - {(int)KS_CTI, IF_EB("\033[>4;2m", ESC_STR_nc "[>4;2m")}, - {(int)KS_CTE, IF_EB("\033[>4;m", ESC_STR_nc "[>4;m")}, - {(int)KS_CIS, IF_EB("\033]1;", ESC_STR "]1;")}, + {(int)KS_CTI, "\033[>4;2m"}, + {(int)KS_CTE, "\033[>4;m"}, + {(int)KS_CIS, "\033]1;"}, {(int)KS_CIE, "\007"}, - {(int)KS_TS, IF_EB("\033]2;", ESC_STR "]2;")}, + {(int)KS_TS, "\033]2;"}, {(int)KS_FS, "\007"}, - {(int)KS_CSC, IF_EB("\033]12;", ESC_STR "]12;")}, + {(int)KS_CSC, "\033]12;"}, {(int)KS_CEC, "\007"}, # ifdef TERMINFO - {(int)KS_CWS, IF_EB("\033[8;%p1%d;%p2%dt", - ESC_STR "[8;%p1%d;%p2%dt")}, - {(int)KS_CWP, IF_EB("\033[3;%p1%d;%p2%dt", - ESC_STR "[3;%p1%d;%p2%dt")}, - {(int)KS_CGP, IF_EB("\033[13t", ESC_STR "[13t")}, + {(int)KS_CWS, "\033[8;%p1%d;%p2%dt"}, + {(int)KS_CWP, "\033[3;%p1%d;%p2%dt"}, + {(int)KS_CGP, "\033[13t"}, # else - {(int)KS_CWS, IF_EB("\033[8;%d;%dt", ESC_STR "[8;%d;%dt")}, - {(int)KS_CWP, IF_EB("\033[3;%d;%dt", ESC_STR "[3;%d;%dt")}, - {(int)KS_CGP, IF_EB("\033[13t", ESC_STR "[13t")}, + {(int)KS_CWS, "\033[8;%d;%dt"}, + {(int)KS_CWP, "\033[3;%d;%dt"}, + {(int)KS_CGP, "\033[13t"}, # endif - {(int)KS_CRV, IF_EB("\033[>c", ESC_STR "[>c")}, - {(int)KS_RFG, IF_EB("\033]10;?\007", ESC_STR "]10;?\007")}, - {(int)KS_RBG, IF_EB("\033]11;?\007", ESC_STR "]11;?\007")}, - {(int)KS_U7, IF_EB("\033[6n", ESC_STR "[6n")}, + {(int)KS_CRV, "\033[>c"}, + {(int)KS_RFG, "\033]10;?\007"}, + {(int)KS_RBG, "\033]11;?\007"}, + {(int)KS_U7, "\033[6n"}, # ifdef FEAT_TERMGUICOLORS // These are printf strings, not terminal codes. - {(int)KS_8F, IF_EB("\033[38;2;%lu;%lu;%lum", ESC_STR "[38;2;%lu;%lu;%lum")}, - {(int)KS_8B, IF_EB("\033[48;2;%lu;%lu;%lum", ESC_STR "[48;2;%lu;%lu;%lum")}, - {(int)KS_8U, IF_EB("\033[58;2;%lu;%lu;%lum", ESC_STR "[58;2;%lu;%lu;%lum")}, + {(int)KS_8F, "\033[38;2;%lu;%lu;%lum"}, + {(int)KS_8B, "\033[48;2;%lu;%lu;%lum"}, + {(int)KS_8U, "\033[58;2;%lu;%lu;%lum"}, # endif - {(int)KS_CAU, IF_EB("\033[58;5;%dm", ESC_STR "[58;5;%dm")}, - {(int)KS_CBE, IF_EB("\033[?2004h", ESC_STR "[?2004h")}, - {(int)KS_CBD, IF_EB("\033[?2004l", ESC_STR "[?2004l")}, - {(int)KS_CST, IF_EB("\033[22;2t", ESC_STR "[22;2t")}, - {(int)KS_CRT, IF_EB("\033[23;2t", ESC_STR "[23;2t")}, - {(int)KS_SSI, IF_EB("\033[22;1t", ESC_STR "[22;1t")}, - {(int)KS_SRI, IF_EB("\033[23;1t", ESC_STR "[23;1t")}, + {(int)KS_CAU, "\033[58;5;%dm"}, + {(int)KS_CBE, "\033[?2004h"}, + {(int)KS_CBD, "\033[?2004l"}, + {(int)KS_CST, "\033[22;2t"}, + {(int)KS_CRT, "\033[23;2t"}, + {(int)KS_SSI, "\033[22;1t"}, + {(int)KS_SRI, "\033[23;1t"}, # if (defined(UNIX) || defined(VMS)) - {(int)KS_FD, IF_EB("\033[?1004l", ESC_STR "[?1004l")}, - {(int)KS_FE, IF_EB("\033[?1004h", ESC_STR "[?1004h")}, + {(int)KS_FD, "\033[?1004l"}, + {(int)KS_FE, "\033[?1004h"}, # endif - {K_UP, IF_EB("\033O*A", ESC_STR "O*A")}, - {K_DOWN, IF_EB("\033O*B", ESC_STR "O*B")}, - {K_RIGHT, IF_EB("\033O*C", ESC_STR "O*C")}, - {K_LEFT, IF_EB("\033O*D", ESC_STR "O*D")}, + {K_UP, "\033O*A"}, + {K_DOWN, "\033O*B"}, + {K_RIGHT, "\033O*C"}, + {K_LEFT, "\033O*D"}, // An extra set of cursor keys for vt100 mode - {K_XUP, IF_EB("\033[@;*A", ESC_STR "[@;*A")}, - {K_XDOWN, IF_EB("\033[@;*B", ESC_STR "[@;*B")}, - {K_XRIGHT, IF_EB("\033[@;*C", ESC_STR "[@;*C")}, - {K_XLEFT, IF_EB("\033[@;*D", ESC_STR "[@;*D")}, + {K_XUP, "\033[@;*A"}, + {K_XDOWN, "\033[@;*B"}, + {K_XRIGHT, "\033[@;*C"}, + {K_XLEFT, "\033[@;*D"}, // An extra set of function keys for vt100 mode - {K_XF1, IF_EB("\033O*P", ESC_STR "O*P")}, - {K_XF2, IF_EB("\033O*Q", ESC_STR "O*Q")}, - {K_XF3, IF_EB("\033O*R", ESC_STR "O*R")}, - {K_XF4, IF_EB("\033O*S", ESC_STR "O*S")}, - {K_F1, IF_EB("\033[11;*~", ESC_STR "[11;*~")}, - {K_F2, IF_EB("\033[12;*~", ESC_STR "[12;*~")}, - {K_F3, IF_EB("\033[13;*~", ESC_STR "[13;*~")}, - {K_F4, IF_EB("\033[14;*~", ESC_STR "[14;*~")}, - {K_F5, IF_EB("\033[15;*~", ESC_STR "[15;*~")}, - {K_F6, IF_EB("\033[17;*~", ESC_STR "[17;*~")}, - {K_F7, IF_EB("\033[18;*~", ESC_STR "[18;*~")}, - {K_F8, IF_EB("\033[19;*~", ESC_STR "[19;*~")}, - {K_F9, IF_EB("\033[20;*~", ESC_STR "[20;*~")}, - {K_F10, IF_EB("\033[21;*~", ESC_STR "[21;*~")}, - {K_F11, IF_EB("\033[23;*~", ESC_STR "[23;*~")}, - {K_F12, IF_EB("\033[24;*~", ESC_STR "[24;*~")}, - {K_S_TAB, IF_EB("\033[Z", ESC_STR "[Z")}, - {K_HELP, IF_EB("\033[28;*~", ESC_STR "[28;*~")}, - {K_UNDO, IF_EB("\033[26;*~", ESC_STR "[26;*~")}, - {K_INS, IF_EB("\033[2;*~", ESC_STR "[2;*~")}, - {K_HOME, IF_EB("\033[1;*H", ESC_STR "[1;*H")}, - // {K_S_HOME, IF_EB("\033O2H", ESC_STR "O2H")}, - // {K_C_HOME, IF_EB("\033O5H", ESC_STR "O5H")}, - {K_KHOME, IF_EB("\033[1;*~", ESC_STR "[1;*~")}, - {K_XHOME, IF_EB("\033O*H", ESC_STR "O*H")}, // other Home - {K_ZHOME, IF_EB("\033[7;*~", ESC_STR "[7;*~")}, // other Home - {K_END, IF_EB("\033[1;*F", ESC_STR "[1;*F")}, - // {K_S_END, IF_EB("\033O2F", ESC_STR "O2F")}, - // {K_C_END, IF_EB("\033O5F", ESC_STR "O5F")}, - {K_KEND, IF_EB("\033[4;*~", ESC_STR "[4;*~")}, - {K_XEND, IF_EB("\033O*F", ESC_STR "O*F")}, // other End - {K_ZEND, IF_EB("\033[8;*~", ESC_STR "[8;*~")}, - {K_PAGEUP, IF_EB("\033[5;*~", ESC_STR "[5;*~")}, - {K_PAGEDOWN, IF_EB("\033[6;*~", ESC_STR "[6;*~")}, - {K_KPLUS, IF_EB("\033O*k", ESC_STR "O*k")}, // keypad plus - {K_KMINUS, IF_EB("\033O*m", ESC_STR "O*m")}, // keypad minus - {K_KDIVIDE, IF_EB("\033O*o", ESC_STR "O*o")}, // keypad / - {K_KMULTIPLY, IF_EB("\033O*j", ESC_STR "O*j")}, // keypad * - {K_KENTER, IF_EB("\033O*M", ESC_STR "O*M")}, // keypad Enter - {K_KPOINT, IF_EB("\033O*n", ESC_STR "O*n")}, // keypad . - {K_K0, IF_EB("\033O*p", ESC_STR "O*p")}, // keypad 0 - {K_K1, IF_EB("\033O*q", ESC_STR "O*q")}, // keypad 1 - {K_K2, IF_EB("\033O*r", ESC_STR "O*r")}, // keypad 2 - {K_K3, IF_EB("\033O*s", ESC_STR "O*s")}, // keypad 3 - {K_K4, IF_EB("\033O*t", ESC_STR "O*t")}, // keypad 4 - {K_K5, IF_EB("\033O*u", ESC_STR "O*u")}, // keypad 5 - {K_K6, IF_EB("\033O*v", ESC_STR "O*v")}, // keypad 6 - {K_K7, IF_EB("\033O*w", ESC_STR "O*w")}, // keypad 7 - {K_K8, IF_EB("\033O*x", ESC_STR "O*x")}, // keypad 8 - {K_K9, IF_EB("\033O*y", ESC_STR "O*y")}, // keypad 9 - {K_KDEL, IF_EB("\033[3;*~", ESC_STR "[3;*~")}, // keypad Del - {K_PS, IF_EB("\033[200~", ESC_STR "[200~")}, // paste start - {K_PE, IF_EB("\033[201~", ESC_STR "[201~")}, // paste end + {K_XF1, "\033O*P"}, + {K_XF2, "\033O*Q"}, + {K_XF3, "\033O*R"}, + {K_XF4, "\033O*S"}, + {K_F1, "\033[11;*~"}, + {K_F2, "\033[12;*~"}, + {K_F3, "\033[13;*~"}, + {K_F4, "\033[14;*~"}, + {K_F5, "\033[15;*~"}, + {K_F6, "\033[17;*~"}, + {K_F7, "\033[18;*~"}, + {K_F8, "\033[19;*~"}, + {K_F9, "\033[20;*~"}, + {K_F10, "\033[21;*~"}, + {K_F11, "\033[23;*~"}, + {K_F12, "\033[24;*~"}, + {K_S_TAB, "\033[Z"}, + {K_HELP, "\033[28;*~"}, + {K_UNDO, "\033[26;*~"}, + {K_INS, "\033[2;*~"}, + {K_HOME, "\033[1;*H"}, + // {K_S_HOME, "\033O2H"}, + // {K_C_HOME, "\033O5H"}, + {K_KHOME, "\033[1;*~"}, + {K_XHOME, "\033O*H"}, // other Home + {K_ZHOME, "\033[7;*~"}, // other Home + {K_END, "\033[1;*F"}, + // {K_S_END, "\033O2F"}, + // {K_C_END, "\033O5F"}, + {K_KEND, "\033[4;*~"}, + {K_XEND, "\033O*F"}, // other End + {K_ZEND, "\033[8;*~"}, + {K_PAGEUP, "\033[5;*~"}, + {K_PAGEDOWN, "\033[6;*~"}, + {K_KPLUS, "\033O*k"}, // keypad plus + {K_KMINUS, "\033O*m"}, // keypad minus + {K_KDIVIDE, "\033O*o"}, // keypad / + {K_KMULTIPLY, "\033O*j"}, // keypad * + {K_KENTER, "\033O*M"}, // keypad Enter + {K_KPOINT, "\033O*n"}, // keypad . + {K_K0, "\033O*p"}, // keypad 0 + {K_K1, "\033O*q"}, // keypad 1 + {K_K2, "\033O*r"}, // keypad 2 + {K_K3, "\033O*s"}, // keypad 3 + {K_K4, "\033O*t"}, // keypad 4 + {K_K5, "\033O*u"}, // keypad 5 + {K_K6, "\033O*v"}, // keypad 6 + {K_K7, "\033O*w"}, // keypad 7 + {K_K8, "\033O*x"}, // keypad 8 + {K_K9, "\033O*y"}, // keypad 9 + {K_KDEL, "\033[3;*~"}, // keypad Del + {K_PS, "\033[200~"}, // paste start + {K_PE, "\033[201~"}, // paste end {BT_EXTRA_KEYS, ""}, - {TERMCAP2KEY('k', '0'), IF_EB("\033[10;*~", ESC_STR "[10;*~")}, // F0 - {TERMCAP2KEY('F', '3'), IF_EB("\033[25;*~", ESC_STR "[25;*~")}, // F13 + {TERMCAP2KEY('k', '0'), "\033[10;*~"}, // F0 + {TERMCAP2KEY('F', '3'), "\033[25;*~"}, // F13 // F14 and F15 are missing, because they send the same codes as the undo // and help key, although they don't work on all keyboards. - {TERMCAP2KEY('F', '6'), IF_EB("\033[29;*~", ESC_STR "[29;*~")}, // F16 - {TERMCAP2KEY('F', '7'), IF_EB("\033[31;*~", ESC_STR "[31;*~")}, // F17 - {TERMCAP2KEY('F', '8'), IF_EB("\033[32;*~", ESC_STR "[32;*~")}, // F18 - {TERMCAP2KEY('F', '9'), IF_EB("\033[33;*~", ESC_STR "[33;*~")}, // F19 - {TERMCAP2KEY('F', 'A'), IF_EB("\033[34;*~", ESC_STR "[34;*~")}, // F20 + {TERMCAP2KEY('F', '6'), "\033[29;*~"}, // F16 + {TERMCAP2KEY('F', '7'), "\033[31;*~"}, // F17 + {TERMCAP2KEY('F', '8'), "\033[32;*~"}, // F18 + {TERMCAP2KEY('F', '9'), "\033[33;*~"}, // F19 + {TERMCAP2KEY('F', 'A'), "\033[34;*~"}, // F20 - {TERMCAP2KEY('F', 'B'), IF_EB("\033[42;*~", ESC_STR "[42;*~")}, // F21 - {TERMCAP2KEY('F', 'C'), IF_EB("\033[43;*~", ESC_STR "[43;*~")}, // F22 - {TERMCAP2KEY('F', 'D'), IF_EB("\033[44;*~", ESC_STR "[44;*~")}, // F23 - {TERMCAP2KEY('F', 'E'), IF_EB("\033[45;*~", ESC_STR "[45;*~")}, // F24 - {TERMCAP2KEY('F', 'F'), IF_EB("\033[46;*~", ESC_STR "[46;*~")}, // F25 - {TERMCAP2KEY('F', 'G'), IF_EB("\033[47;*~", ESC_STR "[47;*~")}, // F26 - {TERMCAP2KEY('F', 'H'), IF_EB("\033[48;*~", ESC_STR "[48;*~")}, // F27 - {TERMCAP2KEY('F', 'I'), IF_EB("\033[49;*~", ESC_STR "[49;*~")}, // F28 - {TERMCAP2KEY('F', 'J'), IF_EB("\033[50;*~", ESC_STR "[50;*~")}, // F29 - {TERMCAP2KEY('F', 'K'), IF_EB("\033[51;*~", ESC_STR "[51;*~")}, // F30 + {TERMCAP2KEY('F', 'B'), "\033[42;*~"}, // F21 + {TERMCAP2KEY('F', 'C'), "\033[43;*~"}, // F22 + {TERMCAP2KEY('F', 'D'), "\033[44;*~"}, // F23 + {TERMCAP2KEY('F', 'E'), "\033[45;*~"}, // F24 + {TERMCAP2KEY('F', 'F'), "\033[46;*~"}, // F25 + {TERMCAP2KEY('F', 'G'), "\033[47;*~"}, // F26 + {TERMCAP2KEY('F', 'H'), "\033[48;*~"}, // F27 + {TERMCAP2KEY('F', 'I'), "\033[49;*~"}, // F28 + {TERMCAP2KEY('F', 'J'), "\033[50;*~"}, // F29 + {TERMCAP2KEY('F', 'K'), "\033[51;*~"}, // F30 - {TERMCAP2KEY('F', 'L'), IF_EB("\033[52;*~", ESC_STR "[52;*~")}, // F31 - {TERMCAP2KEY('F', 'M'), IF_EB("\033[53;*~", ESC_STR "[53;*~")}, // F32 - {TERMCAP2KEY('F', 'N'), IF_EB("\033[54;*~", ESC_STR "[54;*~")}, // F33 - {TERMCAP2KEY('F', 'O'), IF_EB("\033[55;*~", ESC_STR "[55;*~")}, // F34 - {TERMCAP2KEY('F', 'P'), IF_EB("\033[56;*~", ESC_STR "[56;*~")}, // F35 - {TERMCAP2KEY('F', 'Q'), IF_EB("\033[57;*~", ESC_STR "[57;*~")}, // F36 - {TERMCAP2KEY('F', 'R'), IF_EB("\033[58;*~", ESC_STR "[58;*~")}, // F37 + {TERMCAP2KEY('F', 'L'), "\033[52;*~"}, // F31 + {TERMCAP2KEY('F', 'M'), "\033[53;*~"}, // F32 + {TERMCAP2KEY('F', 'N'), "\033[54;*~"}, // F33 + {TERMCAP2KEY('F', 'O'), "\033[55;*~"}, // F34 + {TERMCAP2KEY('F', 'P'), "\033[56;*~"}, // F35 + {TERMCAP2KEY('F', 'Q'), "\033[57;*~"}, // F36 + {TERMCAP2KEY('F', 'R'), "\033[58;*~"}, // F37 # endif # if defined(UNIX) || defined(ALL_BUILTIN_TCAPS) @@ -1323,10 +1316,9 @@ static struct builtin_term builtin_termcaps[] = {(int)KS_NAME, "dumb"}, {(int)KS_CL, "\014"}, #ifdef TERMINFO - {(int)KS_CM, IF_EB("\033[%i%p1%d;%p2%dH", - ESC_STR "[%i%p1%d;%p2%dH")}, + {(int)KS_CM, "\033[%i%p1%d;%p2%dH"}, #else - {(int)KS_CM, IF_EB("\033[%i%d;%dH", ESC_STR "[%i%d;%dH")}, + {(int)KS_CM, "\033[%i%d;%dH"}, #endif /* @@ -2970,9 +2962,9 @@ term_color(char_u *s, int n) #endif char *lead = i == 2 ? ( #if defined(FEAT_VTP) && defined(FEAT_TERMGUICOLORS) - s[1] == '|' ? IF_EB("\033|", ESC_STR "|") : + s[1] == '|' ? "\033|" : #endif - IF_EB("\033[", ESC_STR "[")) : "\233"; + "\033[") : "\233"; char *tail = s[i] == '3' ? (n >= 16 ? "38;5;" : "9") : (n >= 16 ? "48;5;" : "10"); @@ -6523,11 +6515,9 @@ update_tcap(int attr) struct builtin_term *p; p = find_builtin_term(DEFAULT_TERM); - sprintf(ksme_str, IF_EB("\033|%dm", ESC_STR "|%dm"), attr); - sprintf(ksmd_str, IF_EB("\033|%dm", ESC_STR "|%dm"), - attr | 0x08); // FOREGROUND_INTENSITY - sprintf(ksmr_str, IF_EB("\033|%dm", ESC_STR "|%dm"), - ((attr & 0x0F) << 4) | ((attr & 0xF0) >> 4)); + sprintf(ksme_str, "\033|%dm", attr); + sprintf(ksmd_str, "\033|%dm", attr | 0x08); // FOREGROUND_INTENSITY + sprintf(ksmr_str, "\033|%dm", ((attr & 0x0F) << 4) | ((attr & 0xF0) >> 4)); while (p->bt_string != NULL) { diff --git a/src/testdir/test_edit.vim b/src/testdir/test_edit.vim index 782e5e0c52..e3518d8656 100644 --- a/src/testdir/test_edit.vim +++ b/src/testdir/test_edit.vim @@ -1073,8 +1073,6 @@ func Test_edit_DROP() endfunc func Test_edit_CTRL_V() - CheckNotFeature ebcdic - new call setline(1, ['abc']) call cursor(2, 1) @@ -1631,11 +1629,7 @@ endfunc func Test_edit_special_chars() new - if has("ebcdic") - let t = "o\193\xc2\o303 \90a\xfg\o578\" - else - let t = "o\65\x42\o103 \33a\xfg\o78\" - endif + let t = "o\65\x42\o103 \33a\xfg\o78\" exe "normal " . t call assert_equal("ABC !a\g\8", getline(2)) diff --git a/src/testdir/test_exec_while_if.vim b/src/testdir/test_exec_while_if.vim index 3da2784d77..3f13b09945 100644 --- a/src/testdir/test_exec_while_if.vim +++ b/src/testdir/test_exec_while_if.vim @@ -6,11 +6,7 @@ func Test_exec_while_if() let i = 0 while i < 12 let i = i + 1 - if has("ebcdic") - execute "normal o" . i . "\047" - else - execute "normal o" . i . "\033" - endif + execute "normal o" . i . "\033" if i % 2 normal Ax if i == 9 @@ -21,21 +17,13 @@ func Test_exec_while_if() else let j = 9 while j > 0 - if has("ebcdic") - execute "normal" j . "a" . j . "\x27" - else - execute "normal" j . "a" . j . "\x1b" - endif + execute "normal" j . "a" . j . "\x1b" let j = j - 1 endwhile endif endif if i == 9 - if has("ebcdic") - execute "normal Az\047" - else - execute "normal Az\033" - endif + execute "normal Az\033" endif endwhile unlet i j diff --git a/src/testdir/test_expr.vim b/src/testdir/test_expr.vim index 4d085de1d8..2189a0e8c6 100644 --- a/src/testdir/test_expr.vim +++ b/src/testdir/test_expr.vim @@ -245,11 +245,7 @@ func Test_printf_misc() call assert_equal('65535', printf('%ld', 0xFFFF)) call assert_equal('131071', printf('%ld', 0x1FFFF)) - if has('ebcdic') - call assert_equal('#', printf('%c', 123)) - else - call assert_equal('{', printf('%c', 123)) - endif + call assert_equal('{', printf('%c', 123)) call assert_equal('abc', printf('%s', 'abc')) call assert_equal('abc', printf('%S', 'abc')) diff --git a/src/testdir/test_gf.vim b/src/testdir/test_gf.vim index 1b13c42cd9..3602ba010e 100644 --- a/src/testdir/test_gf.vim +++ b/src/testdir/test_gf.vim @@ -19,11 +19,7 @@ func Test_gf_url() call search("^second") call search("URL") call assert_equal("URL://machine.name/tmp/vimtest2b", expand("")) - if has("ebcdic") - set isf=@,240-249,/,.,-,_,+,,,$,:,~,\ - else - set isf=@,48-57,/,.,-,_,+,,,$,~,\ - endif + set isf=@,48-57,/,.,-,_,+,,,$,~,\ call search("^third") call search("name") call assert_equal("URL:\\\\machine.name\\vimtest2c", expand("")) @@ -90,11 +86,7 @@ endfunc " Test for invoking 'gf' on a ${VAR} variable func Test_gf() - if has("ebcdic") - set isfname=@,240-249,/,.,-,_,+,,,$,:,~,{,} - else - set isfname=@,48-57,/,.,-,_,+,,,$,:,~,{,} - endif + set isfname=@,48-57,/,.,-,_,+,,,$,:,~,{,} call writefile(["Test for gf command"], "Xtest1") if has("unix") diff --git a/src/testdir/test_regexp_utf8.vim b/src/testdir/test_regexp_utf8.vim index 044aeffb63..674eee571d 100644 --- a/src/testdir/test_regexp_utf8.vim +++ b/src/testdir/test_regexp_utf8.vim @@ -152,9 +152,6 @@ func s:classes_test() if has('win32') let identchars_ok = '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ_abcdefghijklmnopqrstuvwxyz€‚ƒ„…†‡ˆ‰Š‹ŒŽ‘’“”•–—˜™š›œžŸ ¡¢£¤¥¦§µÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõöøùúûüýþÿ' let kwordchars_ok = '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ_abcdefghijklmnopqrstuvwxyzµÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖרÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ' - elseif has('ebcdic') - let identchars_ok = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ_abcdefghijklmnopqrstuvwxyz€ŒŽœž¬®µº¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ' - let kwordchars_ok = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ_abcdefghijklmnopqrstuvwxyz€ŒŽœž¬®µº¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ' else let identchars_ok = '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ_abcdefghijklmnopqrstuvwxyzµÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖרÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ' let kwordchars_ok = '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ_abcdefghijklmnopqrstuvwxyzµÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖרÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ' @@ -166,8 +163,6 @@ func s:classes_test() let fnamechars_ok = '$+,-./0123456789:ABCDEFGHIJKLMNOPQRSTUVWXYZ_abcdefghijklmnopqrstuvwxyz~ ¡¢£¤¥¦§¨©ª«¬­®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖרÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ' elseif has('vms') let fnamechars_ok = '#$%+,-./0123456789:;<>ABCDEFGHIJKLMNOPQRSTUVWXYZ[]_abcdefghijklmnopqrstuvwxyz~ ¡¢£¤¥¦§¨©ª«¬­®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖרÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ' - elseif has('ebcdic') - let fnamechars_ok = '#$%+,-./=ABCDEFGHIJKLMNOPQRSTUVWXYZ_abcdefghijklmnopqrstuvwxyz~ ¡¢£¤¥¦§¨©ª«¬­®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖרÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ' else let fnamechars_ok = '#$%+,-./0123456789=ABCDEFGHIJKLMNOPQRSTUVWXYZ_abcdefghijklmnopqrstuvwxyz~ ¡¢£¤¥¦§¨©ª«¬­®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖרÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ' endif diff --git a/src/version.c b/src/version.c index 2d113b8e26..4c9c59442b 100644 --- a/src/version.c +++ b/src/version.c @@ -231,11 +231,7 @@ static char *(features[]) = #else "-dnd", #endif -#ifdef EBCDIC - "+ebcdic", -#else "-ebcdic", -#endif #ifdef FEAT_EMACS_TAGS "+emacs_tags", #else @@ -750,6 +746,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ +/**/ + 4273, /**/ 4272, /**/ diff --git a/src/viminfo.c b/src/viminfo.c index 3620b58de5..cc28a12097 100644 --- a/src/viminfo.c +++ b/src/viminfo.c @@ -162,7 +162,7 @@ viminfo_writestring(FILE *fd, char_u *p) // the string (e.g., variable name). Add something to the length for the // '<', NL and trailing NUL. if (len > LSIZE / 2) - fprintf(fd, IF_EB("\026%d\n<", CTRL_V_STR "%d\n<"), len + 3); + fprintf(fd, "\026%d\n<", len + 3); while ((c = *p++) != NUL) { @@ -2485,11 +2485,9 @@ read_viminfo_filemark(vir_T *virp, int force) // We only get here if line[0] == '\'' or '-'. // Illegal mark names are ignored (for future expansion). str = virp->vir_line + 1; - if ( -#ifndef EBCDIC - *str <= 127 && -#endif - ((*virp->vir_line == '\'' && (VIM_ISDIGIT(*str) || isupper(*str))) + if (*str <= 127 + && ((*virp->vir_line == '\'' + && (VIM_ISDIGIT(*str) || isupper(*str))) || (*virp->vir_line == '-' && *str == '\''))) { if (*str == '\'') From c4573eb12dba6a062af28ee0b8938d1521934ce4 Mon Sep 17 00:00:00 2001 From: Bram Moolenaar Date: Mon, 31 Jan 2022 15:40:56 +0000 Subject: [PATCH 08/28] Update runtime files --- runtime/autoload/ccomplete.vim | 63 ++++++++++++++++------------------ runtime/autoload/dist/ft.vim | 6 ++-- runtime/doc/indent.txt | 11 +++++- runtime/doc/tags | 6 +--- runtime/doc/todo.txt | 11 +++--- runtime/doc/vim9.txt | 11 +++--- runtime/filetype.vim | 4 +-- runtime/indent/html.vim | 15 ++++++-- runtime/indent/testdir/html.in | 13 ++++++- runtime/indent/testdir/html.ok | 13 ++++++- runtime/syntax/vim.vim | 14 ++++---- 11 files changed, 98 insertions(+), 69 deletions(-) diff --git a/runtime/autoload/ccomplete.vim b/runtime/autoload/ccomplete.vim index d8675faf6b..3bddba7a95 100644 --- a/runtime/autoload/ccomplete.vim +++ b/runtime/autoload/ccomplete.vim @@ -4,13 +4,13 @@ vim9script noclear # Language: C # Maintainer: Bram Moolenaar # Rewritten in Vim9 script by github user lacygoill -# Last Change: 2021 Dec 27 +# Last Change: 2022 Jan 31 var prepended: string var grepCache: dict>> # This function is used for the 'omnifunc' option. -def ccomplete#Complete(findstart: bool, abase: string): any # {{{1 +export def Complete(findstart: bool, abase: string): any # {{{1 if findstart # Locate the start of the item, including ".", "->" and "[...]". var line: string = getline('.') @@ -202,7 +202,7 @@ def ccomplete#Complete(findstart: bool, abase: string): any # {{{1 || !v['static'] || bufnr('%') == bufnr(v['filename'])) - res = extendnew(res, tags->map((_, v: dict) => Tag2item(v))) + res = res->extend(tags->map((_, v: dict) => Tag2item(v))) endif if len(res) == 0 @@ -216,9 +216,9 @@ def ccomplete#Complete(findstart: bool, abase: string): any # {{{1 for i: number in len(diclist)->range() # New ctags has the "typeref" field. Patched version has "typename". if diclist[i]->has_key('typename') - res = extendnew(res, diclist[i]['typename']->StructMembers(items[1 :], true)) + res = res->extend(diclist[i]['typename']->StructMembers(items[1 :], true)) elseif diclist[i]->has_key('typeref') - res = extendnew(res, diclist[i]['typeref']->StructMembers(items[1 :], true)) + res = res->extend(diclist[i]['typeref']->StructMembers(items[1 :], true)) endif # For a variable use the command, which must be a search pattern that @@ -227,7 +227,7 @@ def ccomplete#Complete(findstart: bool, abase: string): any # {{{1 var line: string = diclist[i]['cmd'] if line[: 1] == '/^' var col: number = line->charidx(match(line, '\<' .. items[0] .. '\>')) - res = extendnew(res, line[2 : col - 1]->Nextitem(items[1 :], 0, true)) + res = res->extend(line[2 : col - 1]->Nextitem(items[1 :], 0, true)) endif endif endfor @@ -256,11 +256,10 @@ def ccomplete#Complete(findstart: bool, abase: string): any # {{{1 enddef def GetAddition( # {{{1 - line: string, - match: string, - memarg: list>, - bracket: bool -): string + line: string, + match: string, + memarg: list>, + bracket: bool): string # Guess if the item is an array. if bracket && match(line, match .. '\s*\[') > 0 return '[' @@ -403,10 +402,9 @@ def Tagline2item(val: dict, brackets: string): dict # {{{1 enddef def Tagcmd2extra( # {{{1 - cmd: string, - name: string, - fname: string -): string + cmd: string, + name: string, + fname: string): string # Turn a command from a tag line to something that is useful in the menu var x: string if cmd =~ '^/^' @@ -427,11 +425,10 @@ def Tagcmd2extra( # {{{1 enddef def Nextitem( # {{{1 - lead: string, - items: list, - depth: number, - all: bool -): list> + lead: string, + items: list, + depth: number, + all: bool): list> # Find composing type in "lead" and match items[0] with it. # Repeat this recursively for items[1], if it's there. # When resolving typedefs "depth" is used to avoid infinite recursion. @@ -473,11 +470,11 @@ def Nextitem( # {{{1 # New ctags has the "typeref" field. Patched version has "typename". if item->has_key('typeref') - res = extendnew(res, item['typeref']->StructMembers(items, all)) + res = res->extend(item['typeref']->StructMembers(items, all)) continue endif if item->has_key('typename') - res = extendnew(res, item['typename']->StructMembers(items, all)) + res = res->extend(item['typename']->StructMembers(items, all)) continue endif @@ -511,11 +508,11 @@ def Nextitem( # {{{1 endif endfor if name != '' - res = extendnew(res, StructMembers(cmdtokens[0] .. ':' .. name, items, all)) + res = res->extend(StructMembers(cmdtokens[0] .. ':' .. name, items, all)) endif elseif depth < 10 # Could be "typedef other_T some_T". - res = extendnew(res, cmdtokens[0]->Nextitem(items, depth + 1, all)) + res = res->extend(cmdtokens[0]->Nextitem(items, depth + 1, all)) endif endif endif @@ -529,10 +526,9 @@ def Nextitem( # {{{1 enddef def StructMembers( # {{{1 - atypename: string, - items: list, - all: bool -): list> + atypename: string, + items: list, + all: bool): list> # Search for members of structure "typename" in tags files. # Return a list with resulting matches. @@ -641,10 +637,9 @@ def StructMembers( # {{{1 enddef def SearchMembers( # {{{1 - matches: list>, - items: list, - all: bool -): list> + matches: list>, + items: list, + all: bool): list> # For matching members, find matches for following items. # When "all" is true find all, otherwise just return 1 if there is any member. @@ -674,7 +669,7 @@ def SearchMembers( # {{{1 endif if typename != '' - res = extendnew(res, StructMembers(typename, items, all)) + res = res->extend(StructMembers(typename, items, all)) else # Use the search command (the declaration itself). var sb: number = line->match('\t\zs/^') @@ -683,7 +678,7 @@ def SearchMembers( # {{{1 var e: number = line ->charidx(match(line, '\<' .. matches[i]['match'] .. '\>', sb)) if e > 0 - res = extendnew(res, line[s : e - 1]->Nextitem(items, 0, all)) + res = res->extend(line[s : e - 1]->Nextitem(items, 0, all)) endif endif endif diff --git a/runtime/autoload/dist/ft.vim b/runtime/autoload/dist/ft.vim index f6ef9be891..f513a2ac8f 100644 --- a/runtime/autoload/dist/ft.vim +++ b/runtime/autoload/dist/ft.vim @@ -1,7 +1,7 @@ " Vim functions for file type detection " " Maintainer: Bram Moolenaar -" Last Change: 2022 Jan 28 +" Last Change: 2022 Jan 31 " These functions are moved here from runtime/filetype.vim to make startup " faster. @@ -67,7 +67,7 @@ func dist#ft#FTasmsyntax() endif endfunc -func dist#ft#FTbas() +func dist#ft#FTbas(alt = '') if exists("g:filetype_bas") exe "setf " . g:filetype_bas return @@ -88,6 +88,8 @@ func dist#ft#FTbas() setf qb64 elseif match(lines, '\cVB_Name\|Begin VB\.\(Form\|MDIForm\|UserControl\)') > -1 setf vb + elseif a:alt != '' + exe 'setf ' .. a:alt else setf basic endif diff --git a/runtime/doc/indent.txt b/runtime/doc/indent.txt index d82f7423a3..6e8f35b2d2 100644 --- a/runtime/doc/indent.txt +++ b/runtime/doc/indent.txt @@ -1,4 +1,4 @@ -*indent.txt* For Vim version 8.2. Last change: 2019 Dec 07 +*indent.txt* For Vim version 8.2. Last change: 2022 Jan 31 VIM REFERENCE MANUAL by Bram Moolenaar @@ -778,6 +778,15 @@ You can set the indent for the first line after +
+text +
% END_INDENT diff --git a/runtime/indent/testdir/html.ok b/runtime/indent/testdir/html.ok index c0dfc9dc72..938e965d8c 100644 --- a/runtime/indent/testdir/html.ok +++ b/runtime/indent/testdir/html.ok @@ -1,4 +1,4 @@ -" vim: set ft=html sw=4 : +" vim: set ft=html sw=4 ts=8 : " START_INDENT @@ -41,6 +41,11 @@ div#d2 { color: green; } dt text +
+ text +
@@ -50,6 +55,7 @@ div#d2 { color: green; } % START_INDENT % INDENT_EXE let g:html_indent_style1 = "inc" % INDENT_EXE let g:html_indent_script1 = "zero" +% INDENT_EXE let g:html_indent_attribute = 1 % INDENT_EXE call HtmlIndent_CheckUserSettings() @@ -61,6 +67,11 @@ div#d2 { color: green; } var v1 = "v1"; var v2 = "v2"; +
+ text +
% END_INDENT diff --git a/runtime/syntax/vim.vim b/runtime/syntax/vim.vim index abdce6aeab..022439cf39 100644 --- a/runtime/syntax/vim.vim +++ b/runtime/syntax/vim.vim @@ -1,8 +1,8 @@ " Vim syntax file " Language: Vim 8.2 script " Maintainer: Charles E. Campbell -" Last Change: January 11, 2022 -" Version: 8.2-24 +" Last Change: January 30, 2022 +" Version: 8.2-26 " URL: http://www.drchip.org/astronaut/vim/index.html#SYNTAX_VIM " Automatically generated keyword lists: {{{1 @@ -78,11 +78,11 @@ syn match vimHLGroup contained "Conceal" syn case match " Function Names {{{2 -syn keyword vimFuncName contained abs argc assert_equal assert_match atan browse bufloaded byteidx charclass chdir ch_log ch_sendexpr col copy debugbreak diff_hlID empty execute expandcmd filter floor foldlevel function getchangelist getcmdline getcursorcharpos getftime getmarklist getreg gettagstack getwinvar has_key histget hlset input inputsecret isinf job_info join keys line2byte listener_flush luaeval mapset matchdelete matchstr mkdir or popup_clear popup_filter_yesno popup_hide popup_notification prevnonblank prompt_setprompt prop_list prop_type_get pyeval readdir reg_recording remote_foreground remove round screencol searchcount server2client setcharpos setfperm setqflist setwinvar sign_getdefined sign_undefine sinh sound_playevent split str2list strdisplaywidth strlen strwidth synconcealed system tagfiles term_dumpdiff term_getattr term_getsize term_list term_setkill test_alloc_fail test_getvalue test_null_channel test_null_partial test_scrollbar test_void timer_stopall trunc uniq winbufnr win_getid win_id2win winnr win_splitmove -syn keyword vimFuncName contained acos argidx assert_equalfile assert_nobeep atan2 browsedir bufname byteidxcomp charcol ch_evalexpr ch_logfile ch_sendraw complete cos deepcopy digraph_get environ exepath extend finddir fmod foldtext garbagecollect getchar getcmdpos getcwd getftype getmatches getreginfo gettext glob haslocaldir histnr hostname inputdialog insert islocked job_setoptions js_decode len lispindent listener_remove map match matchend matchstrpos mode pathshorten popup_close popup_findinfo popup_list popup_setoptions printf prop_add prop_remove prop_type_list pyxeval readdirex reltime remote_peek rename rubyeval screenpos searchdecl serverlist setcharsearch setline setreg sha256 sign_getplaced sign_unplace slice sound_playfile sqrt str2nr strftime strpart submatch synID systemlist taglist term_dumpload term_getcursor term_getstatus term_scrape term_setrestore test_autochdir test_gui_drop_files test_null_dict test_null_string test_setmouse timer_info tolower type values wincol win_gettype winlayout winrestcmd winwidth -syn keyword vimFuncName contained add arglistid assert_exception assert_notequal balloon_gettext bufadd bufnr call charidx ch_evalraw ch_open ch_setoptions complete_add cosh delete digraph_getlist escape exists extendnew findfile fnameescape foldtextresult get getcharmod getcmdtype getenv getimstatus getmousepos getregtype getwininfo glob2regpat hasmapto hlexists iconv inputlist interrupt isnan job_start js_encode libcall list2blob localtime maparg matchadd matchfuzzy max mzeval perleval popup_create popup_findpreview popup_locate popup_settext prompt_getprompt prop_add_list prop_type_add pum_getpos rand readfile reltimefloat remote_read repeat screenattr screenrow searchpair setbufline setcmdpos setloclist settabvar shellescape sign_jump sign_unplacelist sort sound_stop srand strcharlen strgetchar strptime substitute synIDattr tabpagebuflist tan term_dumpwrite term_getjob term_gettitle term_sendkeys term_setsize test_feedinput test_gui_mouse_event test_null_function test_option_not_set test_settime timer_pause toupper typename virtcol windowsversion win_gotoid winline winrestview wordcount -syn keyword vimFuncName contained and argv assert_fails assert_notmatch balloon_show bufexists bufwinid ceil ch_canread ch_getbufnr ch_read ch_status complete_check count deletebufline digraph_set eval exists_compiled feedkeys flatten fnamemodify foreground getbufinfo getcharpos getcmdwintype getfontname getjumplist getpid gettabinfo getwinpos globpath histadd hlget indent inputrestore invert items job_status json_decode libcallnr list2str log mapcheck matchaddpos matchfuzzypos menu_info nextnonblank popup_atcursor popup_dialog popup_getoptions popup_menu popup_show prompt_setcallback prop_clear prop_type_change pumvisible range reduce reltimestr remote_send resolve screenchar screenstring searchpairpos setbufvar setcursorcharpos setmatches settabwinvar shiftwidth sign_place simplify sound_clear spellbadword state strcharpart stridx strridx swapinfo synIDtrans tabpagenr tanh term_getaltscreen term_getline term_gettty term_setansicolors term_start test_garbagecollect_now test_ignore_error test_null_job test_override test_srand_seed timer_start tr undofile visualmode win_execute winheight win_move_separator winsaveview writefile -syn keyword vimFuncName contained append asin assert_false assert_report balloon_split buflisted bufwinnr changenr ch_close ch_getjob ch_readblob cindent complete_info cscope_connection did_filetype digraph_setlist eventhandler exp filereadable flattennew foldclosed fullcommand getbufline getcharsearch getcompletion getfperm getline getpos gettabvar getwinposx has histdel hlID index inputsave isdirectory job_getchannel job_stop json_encode line listener_add log10 mapnew matcharg matchlist min nr2char popup_beval popup_filter_menu popup_getpos popup_move pow prompt_setinterrupt prop_find prop_type_delete py3eval readblob reg_executing remote_expr remote_startserver reverse screenchars search searchpos setcellwidths setenv setpos settagstack sign_define sign_placelist sin soundfold spellsuggest str2float strchars string strtrans swapname synstack tabpagewinnr tempname term_getansicolors term_getscrolled terminalprops term_setapi term_wait test_garbagecollect_soon test_null_blob test_null_list test_refcount test_unknown timer_stop trim undotree wildmenumode win_findbuf win_id2tabwin win_move_statusline win_screenpos xor +syn keyword vimFuncName contained abs argc assert_equal assert_match atan browse bufloaded byteidx charclass chdir ch_log ch_sendexpr col copy debugbreak diff_hlID empty execute expandcmd filter floor foldlevel function getchangelist getcmdline getcursorcharpos getftime getmarklist getreg gettagstack getwinvar has_key histget hlset input inputsecret isdirectory job_getchannel job_stop json_encode line listener_add log10 mapnew matcharg matchlist min nr2char popup_beval popup_filter_menu popup_getpos popup_move pow prompt_setinterrupt prop_find prop_type_delete py3eval readblob reg_executing remote_expr remote_startserver reverse screenchars search searchpos setcellwidths setenv setpos settagstack sign_define sign_placelist sin soundfold spellsuggest str2float strchars string strtrans swapname synstack tabpagewinnr tempname term_getansicolors term_getscrolled terminalprops term_setapi term_wait test_garbagecollect_soon test_null_channel test_null_partial test_scrollbar test_void timer_stopall trunc uniq winbufnr win_getid win_id2win winnr win_splitmove +syn keyword vimFuncName contained acos argidx assert_equalfile assert_nobeep atan2 browsedir bufname byteidxcomp charcol ch_evalexpr ch_logfile ch_sendraw complete cos deepcopy digraph_get environ exepath extend finddir fmod foldtext garbagecollect getchar getcmdpos getcwd getftype getmatches getreginfo gettext glob haslocaldir histnr hostname inputdialog insert isinf job_info join keys line2byte listener_flush luaeval mapset matchdelete matchstr mkdir or popup_clear popup_filter_yesno popup_hide popup_notification prevnonblank prompt_setprompt prop_list prop_type_get pyeval readdir reg_recording remote_foreground remove round screencol searchcount server2client setcharpos setfperm setqflist setwinvar sign_getdefined sign_undefine sinh sound_playevent split str2list strdisplaywidth strlen strwidth synconcealed system tagfiles term_dumpdiff term_getattr term_getsize term_list term_setkill test_alloc_fail test_getvalue test_null_dict test_null_string test_setmouse timer_info tolower type values wincol win_gettype winlayout winrestcmd winwidth +syn keyword vimFuncName contained add arglistid assert_exception assert_notequal balloon_gettext bufadd bufnr call charidx ch_evalraw ch_open ch_setoptions complete_add cosh delete digraph_getlist escape exists extendnew findfile fnameescape foldtextresult get getcharmod getcmdtype getenv getimstatus getmousepos getregtype getwininfo glob2regpat hasmapto hlexists iconv inputlist internal_get_nv_cmdchar islocked job_setoptions js_decode len lispindent listener_remove map match matchend matchstrpos mode pathshorten popup_close popup_findinfo popup_list popup_setoptions printf prop_add prop_remove prop_type_list pyxeval readdirex reltime remote_peek rename rubyeval screenpos searchdecl serverlist setcharsearch setline setreg sha256 sign_getplaced sign_unplace slice sound_playfile sqrt str2nr strftime strpart submatch synID systemlist taglist term_dumpload term_getcursor term_getstatus term_scrape term_setrestore test_autochdir test_gui_event test_null_function test_option_not_set test_settime timer_pause toupper typename virtcol windowsversion win_gotoid winline winrestview wordcount +syn keyword vimFuncName contained and argv assert_fails assert_notmatch balloon_show bufexists bufwinid ceil ch_canread ch_getbufnr ch_read ch_status complete_check count deletebufline digraph_set eval exists_compiled feedkeys flatten fnamemodify foreground getbufinfo getcharpos getcmdwintype getfontname getjumplist getpid gettabinfo getwinpos globpath histadd hlget indent inputrestore interrupt isnan job_start js_encode libcall list2blob localtime maparg matchadd matchfuzzy max mzeval perleval popup_create popup_findpreview popup_locate popup_settext prompt_getprompt prop_add_list prop_type_add pum_getpos rand readfile reltimefloat remote_read repeat screenattr screenrow searchpair setbufline setcmdpos setloclist settabvar shellescape sign_jump sign_unplacelist sort sound_stop srand strcharlen strgetchar strptime substitute synIDattr tabpagebuflist tan term_dumpwrite term_getjob term_gettitle term_sendkeys term_setsize test_feedinput test_ignore_error test_null_job test_override test_srand_seed timer_start tr undofile visualmode win_execute winheight win_move_separator winsaveview writefile +syn keyword vimFuncName contained append asin assert_false assert_report balloon_split buflisted bufwinnr changenr ch_close ch_getjob ch_readblob cindent complete_info cscope_connection did_filetype digraph_setlist eventhandler exp filereadable flattennew foldclosed fullcommand getbufline getcharsearch getcompletion getfperm getline getpos gettabvar getwinposx has histdel hlID index inputsave invert items job_status json_decode libcallnr list2str log mapcheck matchaddpos matchfuzzypos menu_info nextnonblank popup_atcursor popup_dialog popup_getoptions popup_menu popup_show prompt_setcallback prop_clear prop_type_change pumvisible range reduce reltimestr remote_send resolve screenchar screenstring searchpairpos setbufvar setcursorcharpos setmatches settabwinvar shiftwidth sign_place simplify sound_clear spellbadword state strcharpart stridx strridx swapinfo synIDtrans tabpagenr tanh term_getaltscreen term_getline term_gettty term_setansicolors term_start test_garbagecollect_now test_null_blob test_null_list test_refcount test_unknown timer_stop trim undotree wildmenumode win_findbuf win_id2tabwin win_move_statusline win_screenpos xor syn keyword vimFuncName contained appendbufline assert_beeps assert_inrange assert_true blob2list bufload byte2line char2nr ch_close_in ch_info ch_readraw clearmatches confirm cursor diff_filler echoraw executable expand filewritable float2nr foldclosedend funcref getbufvar getcharstr getcurpos getfsize getloclist getqflist gettabwinvar getwinposy "--- syntax here and above generated by mkvimvim --- From c570e9cf68c0fe30366e82c96be460047dd659b9 Mon Sep 17 00:00:00 2001 From: Doug Kearns Date: Mon, 31 Jan 2022 17:09:14 +0000 Subject: [PATCH 09/28] patch 8.2.4274: Basic and form filetype detection is incomplete Problem: Basic and form filetype detection is incomplete. Solution: Add a separate function for .frm files. (Doug Kearns, closes #9675) --- runtime/autoload/dist/ft.vim | 24 ++++++++++++++++++++---- runtime/filetype.vim | 2 +- src/testdir/test_filetype.vim | 28 ++++++++++++++++++++++++++++ src/version.c | 2 ++ 4 files changed, 51 insertions(+), 5 deletions(-) diff --git a/runtime/autoload/dist/ft.vim b/runtime/autoload/dist/ft.vim index f513a2ac8f..5d8734a625 100644 --- a/runtime/autoload/dist/ft.vim +++ b/runtime/autoload/dist/ft.vim @@ -67,7 +67,10 @@ func dist#ft#FTasmsyntax() endif endfunc -func dist#ft#FTbas(alt = '') +let s:ft_visual_basic_content = '\cVB_Name\|Begin VB\.\(Form\|MDIForm\|UserControl\)' + +" See FTfrm() for Visual Basic form file detection +func dist#ft#FTbas() if exists("g:filetype_bas") exe "setf " . g:filetype_bas return @@ -86,10 +89,8 @@ func dist#ft#FTbas(alt = '') setf freebasic elseif match(lines, qb64_preproc) > -1 setf qb64 - elseif match(lines, '\cVB_Name\|Begin VB\.\(Form\|MDIForm\|UserControl\)') > -1 + elseif match(lines, s:ft_visual_basic_content) > -1 setf vb - elseif a:alt != '' - exe 'setf ' .. a:alt else setf basic endif @@ -237,6 +238,21 @@ func dist#ft#FTe() endif endfunc +func dist#ft#FTfrm() + if exists("g:filetype_frm") + exe "setf " . g:filetype_frm + return + endif + + let lines = getline(1, min([line("$"), 5])) + + if match(lines, s:ft_visual_basic_content) > -1 + setf vb + else + setf form + endif +endfunc + " Distinguish between Forth and F#. " Provided by Doug Kearns. func dist#ft#FTfs() diff --git a/runtime/filetype.vim b/runtime/filetype.vim index 5d04f21c08..37126ad955 100644 --- a/runtime/filetype.vim +++ b/runtime/filetype.vim @@ -2051,7 +2051,7 @@ au BufRead,BufNewFile *.hw,*.module,*.pkg \ endif " Visual Basic (also uses *.bas) or FORM -au BufNewFile,BufRead *.frm call dist#ft#FTbas('form') +au BufNewFile,BufRead *.frm call dist#ft#FTfrm() " SaxBasic is close to Visual Basic au BufNewFile,BufRead *.sba setf vb diff --git a/src/testdir/test_filetype.vim b/src/testdir/test_filetype.vim index 714d6f59cb..6f4a425814 100644 --- a/src/testdir/test_filetype.vim +++ b/src/testdir/test_filetype.vim @@ -183,6 +183,7 @@ let s:filename_checks = { \ 'fgl': ['file.4gl', 'file.4gh', 'file.m4gl'], \ 'fish': ['file.fish'], \ 'focexec': ['file.fex', 'file.focexec'], + \ 'form': ['file.frm'], \ 'forth': ['file.ft', 'file.fth'], \ 'fortran': ['file.f', 'file.for', 'file.fortran', 'file.fpp', 'file.ftn', 'file.f77', 'file.f90', 'file.f95', 'file.f03', 'file.f08'], \ 'fpcmake': ['file.fpc'], @@ -1278,4 +1279,31 @@ func Test_bas_file() filetype off endfunc +func Test_frm_file() + filetype on + + call writefile(['looks like FORM'], 'Xfile.frm') + split Xfile.frm + call assert_equal('form', &filetype) + bwipe! + + " Test dist#ft#FTfrm() + + let g:filetype_frm = 'form' + split Xfile.frm + call assert_equal('form', &filetype) + bwipe! + unlet g:filetype_frm + + " Visual Basic + + call writefile(['Begin VB.Form Form1'], 'Xfile.frm') + split Xfile.frm + call assert_equal('vb', &filetype) + bwipe! + + call delete('Xfile.frm') + filetype off +endfunc + " vim: shiftwidth=2 sts=2 expandtab diff --git a/src/version.c b/src/version.c index 4c9c59442b..921f076727 100644 --- a/src/version.c +++ b/src/version.c @@ -746,6 +746,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ +/**/ + 4274, /**/ 4273, /**/ From 223a950a85448253780da4e821a5b23dcdfad28f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=3D=3FUTF-8=3Fq=3FBj=3DC3=3DB6rn=3D20Linse=3F=3D?= Date: Mon, 31 Jan 2022 17:26:05 +0000 Subject: [PATCH 10/28] patch 8.2.4275: cannot use an autoload function from a package under start Problem: Cannot use an autoload function from a package under start. Solution: Also look in the "start" package directory. (Bjorn Linse, closes #7193) --- src/scriptfile.c | 2 +- src/testdir/test_packadd.vim | 13 +++++++++++++ src/version.c | 2 ++ 3 files changed, 16 insertions(+), 1 deletion(-) diff --git a/src/scriptfile.c b/src/scriptfile.c index dec512a72b..cee3f5440b 100644 --- a/src/scriptfile.c +++ b/src/scriptfile.c @@ -2294,7 +2294,7 @@ script_autoload( // Try loading the package from $VIMRUNTIME/autoload/.vim // Use "ret_sid" to avoid loading the same script again. - if (source_in_path(p_rtp, scriptname, 0, &ret_sid) == OK) + if (source_in_path(p_rtp, scriptname, DIP_START, &ret_sid) == OK) ret = TRUE; } diff --git a/src/testdir/test_packadd.vim b/src/testdir/test_packadd.vim index d7a38daf31..8ca9b41a28 100644 --- a/src/testdir/test_packadd.vim +++ b/src/testdir/test_packadd.vim @@ -246,6 +246,19 @@ func Test_packloadall() call assert_equal(4321, g:plugin_bar_number) endfunc +func Test_start_autoload() + " plugin foo with an autoload directory + let autodir = &packpath .. '/pack/mine/start/foo/autoload' + call mkdir(autodir, 'p') + let fname = autodir .. '/foobar.vim' + call writefile(['func foobar#test()', + \ ' return 1666', + \ 'endfunc'], fname) + + call assert_equal(1666, foobar#test()) + call delete(fname) +endfunc + func Test_helptags() let docdir1 = &packpath . '/pack/mine/start/foo/doc' let docdir2 = &packpath . '/pack/mine/start/bar/doc' diff --git a/src/version.c b/src/version.c index 921f076727..d3b7bf8461 100644 --- a/src/version.c +++ b/src/version.c @@ -746,6 +746,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ +/**/ + 4275, /**/ 4274, /**/ From 9e0208f51cf1354ce0a7d3988133041a78681605 Mon Sep 17 00:00:00 2001 From: Yegappan Lakshmanan Date: Mon, 31 Jan 2022 17:40:55 +0000 Subject: [PATCH 11/28] patch 8.2.4276: separate test function for the GUI scrollbar Problem: Separate test function for the GUI scrollbar. Solution: Use test_gui_event(). (Yegappan Lakshmanan, closes #9674) --- runtime/doc/builtin.txt | 2 - runtime/doc/usr_41.txt | 1 - src/evalfunc.c | 9 ---- src/proto/testing.pro | 1 - src/testdir/test_gui.vim | 30 +++++++++-- src/testdir/test_vim9_builtin.vim | 7 --- src/testing.c | 83 +++++++++++++++---------------- src/version.c | 2 + 8 files changed, 68 insertions(+), 67 deletions(-) diff --git a/runtime/doc/builtin.txt b/runtime/doc/builtin.txt index 943cd51758..98c358d6a5 100644 --- a/runtime/doc/builtin.txt +++ b/runtime/doc/builtin.txt @@ -654,8 +654,6 @@ test_null_string() String null value for testing test_option_not_set({name}) none reset flag indicating option was set test_override({expr}, {val}) none test with Vim internal overrides test_refcount({expr}) Number get the reference count of {expr} -test_scrollbar({which}, {value}, {dragging}) - none scroll in the GUI for testing test_setmouse({row}, {col}) none set the mouse position for testing test_settime({expr}) none set current time for testing test_srand_seed([seed]) none set seed for testing srand() diff --git a/runtime/doc/usr_41.txt b/runtime/doc/usr_41.txt index ebfbbe6bba..7bb363b436 100644 --- a/runtime/doc/usr_41.txt +++ b/runtime/doc/usr_41.txt @@ -1130,7 +1130,6 @@ Testing: *test-functions* test_setmouse() set the mouse position test_feedinput() add key sequence to input buffer test_option_not_set() reset flag indicating option was set - test_scrollbar() simulate scrollbar movement in the GUI test_refcount() return an expression's reference count test_srand_seed() set the seed value for srand() test_unknown() return a value with unknown type diff --git a/src/evalfunc.c b/src/evalfunc.c index 1b788db9c4..1c08f3dfc2 100644 --- a/src/evalfunc.c +++ b/src/evalfunc.c @@ -933,7 +933,6 @@ static argcheck_T arg3_string_any_string[] = {arg_string, NULL, arg_string}; static argcheck_T arg3_string_bool_bool[] = {arg_string, arg_bool, arg_bool}; static argcheck_T arg3_string_bool_dict[] = {arg_string, arg_bool, arg_dict_any}; static argcheck_T arg3_string_number_bool[] = {arg_string, arg_number, arg_bool}; -static argcheck_T arg3_string_number_number[] = {arg_string, arg_number, arg_number}; static argcheck_T arg3_string_string_bool[] = {arg_string, arg_string, arg_bool}; static argcheck_T arg3_string_string_dict[] = {arg_string, arg_string, arg_dict_any}; static argcheck_T arg3_string_string_number[] = {arg_string, arg_string, arg_number}; @@ -2359,14 +2358,6 @@ static funcentry_T global_functions[] = ret_void, f_test_override}, {"test_refcount", 1, 1, FEARG_1, NULL, ret_number, f_test_refcount}, - {"test_scrollbar", 3, 3, FEARG_2, arg3_string_number_number, - ret_void, -#ifdef FEAT_GUI - f_test_scrollbar -#else - NULL -#endif - }, {"test_setmouse", 2, 2, 0, arg2_number, ret_void, f_test_setmouse}, {"test_settime", 1, 1, FEARG_1, arg1_number, diff --git a/src/proto/testing.pro b/src/proto/testing.pro index 1277a2e05b..2192e91ec7 100644 --- a/src/proto/testing.pro +++ b/src/proto/testing.pro @@ -32,7 +32,6 @@ void f_test_null_partial(typval_T *argvars, typval_T *rettv); void f_test_null_string(typval_T *argvars, typval_T *rettv); void f_test_unknown(typval_T *argvars, typval_T *rettv); void f_test_void(typval_T *argvars, typval_T *rettv); -void f_test_scrollbar(typval_T *argvars, typval_T *rettv); void f_test_setmouse(typval_T *argvars, typval_T *rettv); void f_test_gui_event(typval_T *argvars, typval_T *rettv); void f_test_settime(typval_T *argvars, typval_T *rettv); diff --git a/src/testdir/test_gui.vim b/src/testdir/test_gui.vim index 5516c8904a..61451bc3ee 100644 --- a/src/testdir/test_gui.vim +++ b/src/testdir/test_gui.vim @@ -714,13 +714,15 @@ func Test_scrollbars() set guioptions+=rlb " scroll to move line 11 at top, moves the cursor there - eval 10->test_scrollbar('left', 0) + let args = #{which: 'left', value: 10, dragging: 0} + call test_gui_event('scrollbar', args) redraw call assert_equal(1, winline()) call assert_equal(11, line('.')) " scroll to move line 1 at top, cursor stays in line 11 - call test_scrollbar('right', 0, 0) + let args = #{which: 'right', value: 0, dragging: 0} + call test_gui_event('scrollbar', args) redraw call assert_equal(11, winline()) call assert_equal(11, line('.')) @@ -737,7 +739,8 @@ func Test_scrollbars() call assert_equal(1, col('.')) " scroll to character 11, cursor is moved - call test_scrollbar('hor', 10, 0) + let args = #{which: 'hor', value: 10, dragging: 0} + call test_gui_event('scrollbar', args) redraw call assert_equal(1, wincol()) set number @@ -747,6 +750,13 @@ func Test_scrollbars() redraw call assert_equal(11, col('.')) + " Invalid arguments + call assert_false(test_gui_event('scrollbar', {})) + call assert_false(test_gui_event('scrollbar', #{value: 10, dragging: 0})) + call assert_false(test_gui_event('scrollbar', #{which: 'hor', dragging: 0})) + call assert_false(test_gui_event('scrollbar', #{which: 'hor', value: 1})) + call assert_fails("call test_gui_event('scrollbar', #{which: 'a', value: 1, dragging: 0})", 'E475:') + set guioptions& set wrap& bwipe! @@ -1346,6 +1356,8 @@ func Test_gui_drop_files() call assert_false(test_gui_event("dropfiles", {})) let d = #{row: 1, col: 1, modifiers: 0} call assert_false(test_gui_event("dropfiles", d)) + let d = #{files: 1, row: 1, col: 1, modifiers: 0} + call assert_false(test_gui_event("dropfiles", d)) let d = #{files: test_null_list(), row: 1, col: 1, modifiers: 0} call assert_false(test_gui_event("dropfiles", d)) let d = #{files: [test_null_string()], row: 1, col: 1, modifiers: 0} @@ -1460,6 +1472,18 @@ func Test_gui_findrepl() let args = #{find_text: 'TWO', repl_text: 'two', flags: 0x1C, forward: 1} call test_gui_event('findrepl', args) call assert_equal(['ONE two ONE', 'Twoo ONE two ONEo'], getline(1, '$')) + + " Invalid arguments + call assert_false(test_gui_event('findrepl', {})) + let args = #{repl_text: 'a', flags: 1, forward: 1} + call assert_false(test_gui_event('findrepl', args)) + let args = #{find_text: 'a', flags: 1, forward: 1} + call assert_false(test_gui_event('findrepl', args)) + let args = #{find_text: 'a', repl_text: 'b', forward: 1} + call assert_false(test_gui_event('findrepl', args)) + let args = #{find_text: 'a', repl_text: 'b', flags: 1} + call assert_false(test_gui_event('findrepl', args)) + bw! endfunc diff --git a/src/testdir/test_vim9_builtin.vim b/src/testdir/test_vim9_builtin.vim index d6b42bbfd6..2e84011ac8 100644 --- a/src/testdir/test_vim9_builtin.vim +++ b/src/testdir/test_vim9_builtin.vim @@ -4089,13 +4089,6 @@ def Test_test_override() v9.CheckDefAndScriptFailure(['test_override("a", "x")'], ['E1013: Argument 2: type mismatch, expected number but got string', 'E1210: Number required for argument 2']) enddef -def Test_test_scrollbar() - CheckGui - v9.CheckDefAndScriptFailure(['test_scrollbar(1, 2, 3)'], ['E1013: Argument 1: type mismatch, expected string but got number', 'E1174: String required for argument 1']) - v9.CheckDefAndScriptFailure(['test_scrollbar("a", "b", 3)'], ['E1013: Argument 2: type mismatch, expected number but got string', 'E1210: Number required for argument 2']) - v9.CheckDefAndScriptFailure(['test_scrollbar("a", 2, "c")'], ['E1013: Argument 3: type mismatch, expected number but got string', 'E1210: Number required for argument 3']) -enddef - def Test_test_setmouse() v9.CheckDefAndScriptFailure(['test_setmouse("a", 10)'], ['E1013: Argument 1: type mismatch, expected number but got string', 'E1210: Number required for argument 1']) v9.CheckDefAndScriptFailure(['test_setmouse(10, "b")'], ['E1013: Argument 2: type mismatch, expected number but got string', 'E1210: Number required for argument 2']) diff --git a/src/testing.c b/src/testing.c index 5c4f118cef..6fcbaa72ab 100644 --- a/src/testing.c +++ b/src/testing.c @@ -1253,50 +1253,6 @@ f_test_void(typval_T *argvars UNUSED, typval_T *rettv) rettv->v_type = VAR_VOID; } -#ifdef FEAT_GUI - void -f_test_scrollbar(typval_T *argvars, typval_T *rettv UNUSED) -{ - char_u *which; - long value; - int dragging; - scrollbar_T *sb = NULL; - - if (check_for_string_arg(argvars, 0) == FAIL - || check_for_number_arg(argvars, 1) == FAIL - || check_for_number_arg(argvars, 2) == FAIL) - return; - - if (argvars[0].v_type != VAR_STRING - || (argvars[1].v_type) != VAR_NUMBER - || (argvars[2].v_type) != VAR_NUMBER) - { - emsg(_(e_invalid_argument)); - return; - } - which = tv_get_string(&argvars[0]); - value = tv_get_number(&argvars[1]); - dragging = tv_get_number(&argvars[2]); - - if (STRCMP(which, "left") == 0) - sb = &curwin->w_scrollbars[SBAR_LEFT]; - else if (STRCMP(which, "right") == 0) - sb = &curwin->w_scrollbars[SBAR_RIGHT]; - else if (STRCMP(which, "hor") == 0) - sb = &gui.bottom_sbar; - if (sb == NULL) - { - semsg(_(e_invalid_argument_str), which); - return; - } - gui_drag_scrollbar(sb, value, dragging); -# ifndef USE_ON_FLY_SCROLL - // need to loop through normal_cmd() to handle the scroll events - exec_normal(FALSE, TRUE, FALSE); -# endif -} -#endif - void f_test_setmouse(typval_T *argvars, typval_T *rettv UNUSED) { @@ -1429,6 +1385,43 @@ test_gui_mouse_event(dict_T *args) return TRUE; } + static int +test_gui_scrollbar(dict_T *args) +{ + char_u *which; + long value; + int dragging; + scrollbar_T *sb = NULL; + + if (dict_find(args, (char_u *)"which", -1) == NULL + || dict_find(args, (char_u *)"value", -1) == NULL + || dict_find(args, (char_u *)"dragging", -1) == NULL) + return FALSE; + + which = dict_get_string(args, (char_u *)"which", FALSE); + value = (long)dict_get_number(args, (char_u *)"value"); + dragging = (int)dict_get_number(args, (char_u *)"dragging"); + + if (STRCMP(which, "left") == 0) + sb = &curwin->w_scrollbars[SBAR_LEFT]; + else if (STRCMP(which, "right") == 0) + sb = &curwin->w_scrollbars[SBAR_RIGHT]; + else if (STRCMP(which, "hor") == 0) + sb = &gui.bottom_sbar; + if (sb == NULL) + { + semsg(_(e_invalid_argument_str), which); + return FALSE; + } + gui_drag_scrollbar(sb, value, dragging); +# ifndef USE_ON_FLY_SCROLL + // need to loop through normal_cmd() to handle the scroll events + exec_normal(FALSE, TRUE, FALSE); +# endif + + return TRUE; +} + static int test_gui_tabline_event(dict_T *args UNUSED) { @@ -1487,6 +1480,8 @@ f_test_gui_event(typval_T *argvars UNUSED, typval_T *rettv UNUSED) rettv->vval.v_number = test_gui_find_repl(argvars[1].vval.v_dict); else if (STRCMP(event, "mouse") == 0) rettv->vval.v_number = test_gui_mouse_event(argvars[1].vval.v_dict); + else if (STRCMP(event, "scrollbar") == 0) + rettv->vval.v_number = test_gui_scrollbar(argvars[1].vval.v_dict); else if (STRCMP(event, "tabline") == 0) rettv->vval.v_number = test_gui_tabline_event(argvars[1].vval.v_dict); else if (STRCMP(event, "tabmenu") == 0) diff --git a/src/version.c b/src/version.c index d3b7bf8461..301f54421b 100644 --- a/src/version.c +++ b/src/version.c @@ -746,6 +746,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ +/**/ + 4276, /**/ 4275, /**/ From 68854a82fdedebf6ee0675d1abeae6fc627ff6bb Mon Sep 17 00:00:00 2001 From: Bram Moolenaar Date: Mon, 31 Jan 2022 18:59:13 +0000 Subject: [PATCH 12/28] patch 8.2.4277: Vim9: an import does not shadow a command modifier Problem: Vim9: an import does not shadow a command modifier. Solution: Do not accept a command modifier followed by a dot. --- src/ex_docmd.c | 8 ++++---- src/testdir/test_vim9_import.vim | 9 ++++++++- src/version.c | 2 ++ 3 files changed, 14 insertions(+), 5 deletions(-) diff --git a/src/ex_docmd.c b/src/ex_docmd.c index c55b34ddb6..64dcd7e2bf 100644 --- a/src/ex_docmd.c +++ b/src/ex_docmd.c @@ -2709,7 +2709,7 @@ ex_range_without_command(exarg_T *eap) /* * Check for an Ex command with optional tail. * If there is a match advance "pp" to the argument and return TRUE. - * If "noparen" is TRUE do not recognize the command followed by "(". + * If "noparen" is TRUE do not recognize the command followed by "(" or ".". */ static int checkforcmd_opt( @@ -2723,8 +2723,8 @@ checkforcmd_opt( for (i = 0; cmd[i] != NUL; ++i) if (((char_u *)cmd)[i] != (*pp)[i]) break; - if (i >= len && !isalpha((*pp)[i]) - && (*pp)[i] != '_' && (!noparen || (*pp)[i] != '(')) + if (i >= len && !isalpha((*pp)[i]) && (*pp)[i] != '_' + && (!noparen || ((*pp)[i] != '(' && (*pp)[i] != '.'))) { *pp = skipwhite(*pp + i); return TRUE; @@ -2746,7 +2746,7 @@ checkforcmd( } /* - * Check for an Ex command with optional tail, not followed by "(". + * Check for an Ex command with optional tail, not followed by "(" or ".". * If there is a match advance "pp" to the argument and return TRUE. */ int diff --git a/src/testdir/test_vim9_import.vim b/src/testdir/test_vim9_import.vim index f37ff8b75d..be453c654e 100644 --- a/src/testdir/test_vim9_import.vim +++ b/src/testdir/test_vim9_import.vim @@ -142,6 +142,14 @@ def Test_vim9_import_export() unlet g:imported_func delete('Ximport_lbr.vim') + var import_shadows_cmdmod_lines =<< trim END + vim9script + import './Xexport.vim' as vim9 + vim9.exp_name = 'Shadow' + assert_equal('Shadow', vim9.exp_name) + END + v9.CheckScriptSuccess(import_shadows_cmdmod_lines) + var line_break_before_dot =<< trim END vim9script import './Xexport.vim' as expo @@ -365,7 +373,6 @@ def Test_vim9_import_export() assert_fails('source Ximport.vim', 'E46: Cannot change read-only variable "CONST"', '', 3) delete('Ximport.vim') - delete('Ximport3.vim') delete('Xexport.vim') # Check that in a Vim9 script 'cpo' is set to the Vim default. diff --git a/src/version.c b/src/version.c index 301f54421b..0dc936ab3f 100644 --- a/src/version.c +++ b/src/version.c @@ -746,6 +746,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ +/**/ + 4277, /**/ 4276, /**/ From 4e3b3182307444f205a5f35e257c651f0f3717ad Mon Sep 17 00:00:00 2001 From: Bram Moolenaar Date: Tue, 1 Feb 2022 10:16:00 +0000 Subject: [PATCH 13/28] patch 8.2.4278: build with Athena GUI fails Problem: Build with Athena GUI fails. (Elimar Riesebieter) Solution: Add #ifdef. --- src/testing.c | 4 ++++ src/version.c | 2 ++ 2 files changed, 6 insertions(+) diff --git a/src/testing.c b/src/testing.c index 6fcbaa72ab..448c01c1e9 100644 --- a/src/testing.c +++ b/src/testing.c @@ -1331,6 +1331,7 @@ test_gui_drop_files(dict_T *args UNUSED) return TRUE; } +#if defined(FIND_REPLACE_DIALOG) static int test_gui_find_repl(dict_T *args) { @@ -1357,6 +1358,7 @@ test_gui_find_repl(dict_T *args) return retval; } +#endif static int test_gui_mouse_event(dict_T *args) @@ -1476,8 +1478,10 @@ f_test_gui_event(typval_T *argvars UNUSED, typval_T *rettv UNUSED) event = tv_get_string(&argvars[0]); if (STRCMP(event, "dropfiles") == 0) rettv->vval.v_number = test_gui_drop_files(argvars[1].vval.v_dict); +# if defined(FIND_REPLACE_DIALOG) else if (STRCMP(event, "findrepl") == 0) rettv->vval.v_number = test_gui_find_repl(argvars[1].vval.v_dict); +# endif else if (STRCMP(event, "mouse") == 0) rettv->vval.v_number = test_gui_mouse_event(argvars[1].vval.v_dict); else if (STRCMP(event, "scrollbar") == 0) diff --git a/src/version.c b/src/version.c index 0dc936ab3f..955047888f 100644 --- a/src/version.c +++ b/src/version.c @@ -746,6 +746,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ +/**/ + 4278, /**/ 4277, /**/ From 8133018f50bc447570825801e93d5ed67e8dac90 Mon Sep 17 00:00:00 2001 From: Bram Moolenaar Date: Tue, 1 Feb 2022 12:11:58 +0000 Subject: [PATCH 14/28] patch 8.2.4279: Vim9: cannot change item type with map() after range() Problem: Vim9: cannot change item type with map() after range(). Solution: Split the return type in current type and declared type. (closes #9665) --- src/evalfunc.c | 193 ++++++++++++++++++++++++------ src/proto/evalfunc.pro | 2 +- src/proto/vim9type.pro | 1 + src/testdir/test_vim9_builtin.vim | 14 ++- src/version.c | 2 + src/vim9instr.c | 12 +- src/vim9type.c | 24 +++- 7 files changed, 202 insertions(+), 46 deletions(-) diff --git a/src/evalfunc.c b/src/evalfunc.c index 1c08f3dfc2..281bd70d34 100644 --- a/src/evalfunc.c +++ b/src/evalfunc.c @@ -992,127 +992,209 @@ static argcheck_T arg24_match_func[] = {arg_string_or_list_any, arg_string, arg_ * Note that "argtypes" is NULL if "argcount" is zero. */ static type_T * -ret_void(int argcount UNUSED, type2_T *argtypes UNUSED) +ret_void(int argcount UNUSED, + type2_T *argtypes UNUSED, + type_T **decl_type UNUSED) { return &t_void; } static type_T * -ret_any(int argcount UNUSED, type2_T *argtypes UNUSED) +ret_any(int argcount UNUSED, + type2_T *argtypes UNUSED, + type_T **decl_type UNUSED) { return &t_any; } static type_T * -ret_bool(int argcount UNUSED, type2_T *argtypes UNUSED) +ret_bool(int argcount UNUSED, + type2_T *argtypes UNUSED, + type_T **decl_type UNUSED) { return &t_bool; } static type_T * -ret_number_bool(int argcount UNUSED, type2_T *argtypes UNUSED) +ret_number_bool(int argcount UNUSED, + type2_T *argtypes UNUSED, + type_T **decl_type UNUSED) { return &t_number_bool; } static type_T * -ret_number(int argcount UNUSED, type2_T *argtypes UNUSED) +ret_number(int argcount UNUSED, + type2_T *argtypes UNUSED, + type_T **decl_type UNUSED) { return &t_number; } static type_T * -ret_float(int argcount UNUSED, type2_T *argtypes UNUSED) +ret_float(int argcount UNUSED, + type2_T *argtypes UNUSED, + type_T **decl_type UNUSED) { return &t_float; } static type_T * -ret_string(int argcount UNUSED, type2_T *argtypes UNUSED) +ret_string(int argcount UNUSED, + type2_T *argtypes UNUSED, + type_T **decl_type UNUSED) { return &t_string; } static type_T * -ret_list_any(int argcount UNUSED, type2_T *argtypes UNUSED) +ret_list_any(int argcount UNUSED, + type2_T *argtypes UNUSED, + type_T **decl_type UNUSED) { return &t_list_any; } static type_T * -ret_list_number(int argcount UNUSED, type2_T *argtypes UNUSED) +ret_list_number(int argcount UNUSED, + type2_T *argtypes UNUSED, + type_T **decl_type UNUSED) { return &t_list_number; } static type_T * -ret_list_string(int argcount UNUSED, type2_T *argtypes UNUSED) +ret_range(int argcount UNUSED, + type2_T *argtypes UNUSED, + type_T **decl_type) +{ + // returning a list, but it's not declared as such + *decl_type = &t_list_any; + return &t_list_number; +} + static type_T * +ret_list_string(int argcount UNUSED, + type2_T *argtypes UNUSED, + type_T **decl_type UNUSED) { return &t_list_string; } static type_T * -ret_list_dict_any(int argcount UNUSED, type2_T *argtypes UNUSED) +ret_list_dict_any(int argcount UNUSED, + type2_T *argtypes UNUSED, + type_T **decl_type UNUSED) { return &t_list_dict_any; } static type_T * -ret_list_items(int argcount UNUSED, type2_T *argtypes UNUSED) +ret_list_items(int argcount UNUSED, + type2_T *argtypes UNUSED, + type_T **decl_type UNUSED) { return &t_list_list_any; } static type_T * -ret_list_string_items(int argcount UNUSED, type2_T *argtypes UNUSED) +ret_list_string_items(int argcount UNUSED, + type2_T *argtypes UNUSED, + type_T **decl_type UNUSED) { return &t_list_list_string; } static type_T * -ret_dict_any(int argcount UNUSED, type2_T *argtypes UNUSED) +ret_dict_any(int argcount UNUSED, + type2_T *argtypes UNUSED, + type_T **decl_type UNUSED) { return &t_dict_any; } static type_T * -ret_job_info(int argcount, type2_T *argtypes UNUSED) +ret_job_info(int argcount, + type2_T *argtypes UNUSED, + type_T **decl_type UNUSED) { if (argcount == 0) return &t_list_job; return &t_dict_any; } static type_T * -ret_dict_number(int argcount UNUSED, type2_T *argtypes UNUSED) +ret_dict_number(int argcount UNUSED, + type2_T *argtypes UNUSED, + type_T **decl_type UNUSED) { return &t_dict_number; } static type_T * -ret_dict_string(int argcount UNUSED, type2_T *argtypes UNUSED) +ret_dict_string(int argcount UNUSED, + type2_T *argtypes UNUSED, + type_T **decl_type UNUSED) { return &t_dict_string; } static type_T * -ret_blob(int argcount UNUSED, type2_T *argtypes UNUSED) +ret_blob(int argcount UNUSED, + type2_T *argtypes UNUSED, + type_T **decl_type UNUSED) { return &t_blob; } static type_T * -ret_func_any(int argcount UNUSED, type2_T *argtypes UNUSED) +ret_func_any(int argcount UNUSED, + type2_T *argtypes UNUSED, + type_T **decl_type UNUSED) { return &t_func_any; } static type_T * -ret_func_unknown(int argcount UNUSED, type2_T *argtypes UNUSED) +ret_func_unknown(int argcount UNUSED, + type2_T *argtypes UNUSED, + type_T **decl_type UNUSED) { return &t_func_unknown; } static type_T * -ret_channel(int argcount UNUSED, type2_T *argtypes UNUSED) +ret_channel(int argcount UNUSED, + type2_T *argtypes UNUSED, + type_T **decl_type UNUSED) { return &t_channel; } static type_T * -ret_job(int argcount UNUSED, type2_T *argtypes UNUSED) +ret_job(int argcount UNUSED, + type2_T *argtypes UNUSED, + type_T **decl_type UNUSED) { return &t_job; } static type_T * -ret_first_arg(int argcount, type2_T *argtypes) +ret_first_arg(int argcount, + type2_T *argtypes, + type_T **decl_type) { if (argcount > 0) + { + *decl_type = argtypes[0].type_decl; return argtypes[0].type_curr; + } return &t_void; } static type_T * -ret_repeat(int argcount, type2_T *argtypes) +ret_extend(int argcount, + type2_T *argtypes, + type_T **decl_type) +{ + if (argcount > 0) + { + *decl_type = argtypes[0].type_decl; + // if the second argument has a different current type then the current + // type is "any" + if (argcount > 1 && !equal_type(argtypes[0].type_curr, + argtypes[1].type_curr, 0)) + { + if (argtypes[0].type_curr->tt_type == VAR_LIST) + return &t_list_any; + if (argtypes[0].type_curr->tt_type == VAR_DICT) + return &t_dict_any; + } + return argtypes[0].type_curr; + } + return &t_void; +} + static type_T * +ret_repeat(int argcount, + type2_T *argtypes, + type_T **decl_type UNUSED) { if (argcount == 0) return &t_any; @@ -1122,7 +1204,9 @@ ret_repeat(int argcount, type2_T *argtypes) } // for map(): returns first argument but item type may differ static type_T * -ret_first_cont(int argcount, type2_T *argtypes) +ret_first_cont(int argcount, + type2_T *argtypes, + type_T **decl_type UNUSED) { if (argcount > 0) { @@ -1137,13 +1221,17 @@ ret_first_cont(int argcount, type2_T *argtypes) } // for getline() static type_T * -ret_getline(int argcount, type2_T *argtypes UNUSED) +ret_getline(int argcount, + type2_T *argtypes UNUSED, + type_T **decl_type UNUSED) { return argcount == 1 ? &t_string : &t_list_string; } // for finddir() static type_T * -ret_finddir(int argcount, type2_T *argtypes UNUSED) +ret_finddir(int argcount, + type2_T *argtypes UNUSED, + type_T **decl_type UNUSED) { if (argcount < 3) return &t_string; @@ -1156,7 +1244,9 @@ ret_finddir(int argcount, type2_T *argtypes UNUSED) * one. */ static type_T * -ret_list_or_dict_0(int argcount, type2_T *argtypes UNUSED) +ret_list_or_dict_0(int argcount, + type2_T *argtypes UNUSED, + type_T **decl_type UNUSED) { if (argcount > 0) return &t_dict_any; @@ -1168,7 +1258,9 @@ ret_list_or_dict_0(int argcount, type2_T *argtypes UNUSED) * are two. */ static type_T * -ret_list_or_dict_1(int argcount, type2_T *argtypes UNUSED) +ret_list_or_dict_1(int argcount, + type2_T *argtypes UNUSED, + type_T **decl_type UNUSED) { if (argcount > 1) return &t_dict_any; @@ -1176,7 +1268,9 @@ ret_list_or_dict_1(int argcount, type2_T *argtypes UNUSED) } static type_T * -ret_argv(int argcount, type2_T *argtypes UNUSED) +ret_argv(int argcount, + type2_T *argtypes UNUSED, + type_T **decl_type UNUSED) { // argv() returns list of strings if (argcount == 0) @@ -1187,13 +1281,20 @@ ret_argv(int argcount, type2_T *argtypes UNUSED) } static type_T * -ret_remove(int argcount, type2_T *argtypes) +ret_remove(int argcount, + type2_T *argtypes, + type_T **decl_type UNUSED) { if (argcount > 0) { if (argtypes[0].type_curr->tt_type == VAR_LIST || argtypes[0].type_curr->tt_type == VAR_DICT) + { + if (argtypes[0].type_curr->tt_type + == argtypes[0].type_decl->tt_type) + *decl_type = argtypes[0].type_decl->tt_member; return argtypes[0].type_curr->tt_member; + } if (argtypes[0].type_curr->tt_type == VAR_BLOB) return &t_number; } @@ -1201,7 +1302,9 @@ ret_remove(int argcount, type2_T *argtypes) } static type_T * -ret_getreg(int argcount, type2_T *argtypes UNUSED) +ret_getreg(int argcount, + type2_T *argtypes UNUSED, + type_T **decl_type UNUSED) { // Assume that if the third argument is passed it's non-zero if (argcount == 3) @@ -1210,7 +1313,9 @@ ret_getreg(int argcount, type2_T *argtypes UNUSED) } static type_T * -ret_maparg(int argcount, type2_T *argtypes UNUSED) +ret_maparg(int argcount, + type2_T *argtypes UNUSED, + type_T **decl_type UNUSED) { // Assume that if the fourth argument is passed it's non-zero if (argcount == 4) @@ -1229,7 +1334,8 @@ typedef struct char f_max_argc; // maximal number of arguments char f_argtype; // for method: FEARG_ values argcheck_T *f_argcheck; // list of functions to check argument types - type_T *(*f_retfunc)(int argcount, type2_T *argtypes); + type_T *(*f_retfunc)(int argcount, type2_T *argtypes, + type_T **decl_type); // return type function void (*f_func)(typval_T *args, typval_T *rvar); // implementation of function @@ -1533,7 +1639,7 @@ static funcentry_T global_functions[] = {"expandcmd", 1, 1, FEARG_1, arg1_string, ret_string, f_expandcmd}, {"extend", 2, 3, FEARG_1, arg23_extend, - ret_first_arg, f_extend}, + ret_extend, f_extend}, {"extendnew", 2, 3, FEARG_1, arg23_extendnew, ret_first_cont, f_extendnew}, {"feedkeys", 1, 2, FEARG_1, arg2_string, @@ -1991,7 +2097,7 @@ static funcentry_T global_functions[] = {"rand", 0, 1, FEARG_1, arg1_list_number, ret_number, f_rand}, {"range", 1, 3, FEARG_1, arg3_number, - ret_list_number, f_range}, + ret_range, f_range}, {"readblob", 1, 1, FEARG_1, arg1_string, ret_blob, f_readblob}, {"readdir", 1, 3, FEARG_1, arg3_string_any_dict, @@ -2622,14 +2728,25 @@ internal_func_get_argcount(int idx, int *argcount, int *min_argcount) /* * Call the "f_retfunc" function to obtain the return type of function "idx". + * "decl_type" is set to the declared type. * "argtypes" is the list of argument types or NULL when there are no * arguments. * "argcount" may be less than the actual count when only getting the type. */ type_T * -internal_func_ret_type(int idx, int argcount, type2_T *argtypes) +internal_func_ret_type( + int idx, + int argcount, + type2_T *argtypes, + type_T **decl_type) { - return global_functions[idx].f_retfunc(argcount, argtypes); + type_T *ret; + + *decl_type = NULL; + ret = global_functions[idx].f_retfunc(argcount, argtypes, decl_type); + if (*decl_type == NULL) + *decl_type = ret; + return ret; } /* diff --git a/src/proto/evalfunc.pro b/src/proto/evalfunc.pro index f17735735b..bcb4ef5570 100644 --- a/src/proto/evalfunc.pro +++ b/src/proto/evalfunc.pro @@ -6,7 +6,7 @@ int has_internal_func(char_u *name); char *internal_func_name(int idx); int internal_func_check_arg_types(type2_T *types, int idx, int argcount, cctx_T *cctx); void internal_func_get_argcount(int idx, int *argcount, int *min_argcount); -type_T *internal_func_ret_type(int idx, int argcount, type2_T *argtypes); +type_T *internal_func_ret_type(int idx, int argcount, type2_T *argtypes, type_T **decl_type); int internal_func_is_map(int idx); int check_internal_func(int idx, int argcount); int call_internal_func(char_u *name, int argcount, typval_T *argvars, typval_T *rettv); diff --git a/src/proto/vim9type.pro b/src/proto/vim9type.pro index 1c80cbf551..61e38e0786 100644 --- a/src/proto/vim9type.pro +++ b/src/proto/vim9type.pro @@ -25,6 +25,7 @@ int push_type_stack(cctx_T *cctx, type_T *type); int push_type_stack2(cctx_T *cctx, type_T *type, type_T *decl_type); void set_type_on_stack(cctx_T *cctx, type_T *type, int offset); type_T *get_type_on_stack(cctx_T *cctx, int offset); +type_T *get_decl_type_on_stack(cctx_T *cctx, int offset); type_T *get_member_type_from_stack(int count, int skip, type_T **decl_type, cctx_T *cctx); char *vartype_name(vartype_T type); char *type_name(type_T *type, char **tofree); diff --git a/src/testdir/test_vim9_builtin.vim b/src/testdir/test_vim9_builtin.vim index 2e84011ac8..248887f7b0 100644 --- a/src/testdir/test_vim9_builtin.vim +++ b/src/testdir/test_vim9_builtin.vim @@ -77,7 +77,12 @@ enddef def Test_add() v9.CheckDefAndScriptFailure(['add({}, 1)'], ['E1013: Argument 1: type mismatch, expected list but got dict', 'E1226: List or Blob required for argument 1']) - v9.CheckDefFailure(['add([1], "a")'], 'E1012: Type mismatch; expected number but got string') + v9.CheckDefExecFailure([ + 'var ln: list = [1]', + 'add(ln, "a")'], + 'E1012: Type mismatch; expected number but got string') + assert_equal([1, 'a'], add([1], 'a')) + assert_equal(0z1234, add(0z12, 0x34)) var lines =<< trim END vim9script @@ -2804,6 +2809,9 @@ def Test_range() v9.CheckDefAndScriptFailure(['range("a")'], ['E1013: Argument 1: type mismatch, expected number but got string', 'E1210: Number required for argument 1']) v9.CheckDefAndScriptFailure(['range(10, "b")'], ['E1013: Argument 2: type mismatch, expected number but got string', 'E1210: Number required for argument 2']) v9.CheckDefAndScriptFailure(['range(10, 20, "c")'], ['E1013: Argument 3: type mismatch, expected number but got string', 'E1210: Number required for argument 3']) + + # returns a list but it's not declared as such + assert_equal(['x', 'x'], range(2)->map((i, v) => 'x')) enddef def Test_readdir() @@ -2980,6 +2988,10 @@ def Test_remove() var d2: any = {1: 'a', 2: 'b', 3: 'c'} remove(d2, 2) assert_equal({1: 'a', 3: 'c'}, d2) + + # using declared type + var x: string = range(2)->extend(['x'])->remove(2) + assert_equal('x', x) enddef def Test_remove_return_type() diff --git a/src/version.c b/src/version.c index 955047888f..6d896152eb 100644 --- a/src/version.c +++ b/src/version.c @@ -746,6 +746,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ +/**/ + 4279, /**/ 4278, /**/ diff --git a/src/vim9instr.c b/src/vim9instr.c index e869d9ea68..60963a3c9b 100644 --- a/src/vim9instr.c +++ b/src/vim9instr.c @@ -1078,7 +1078,8 @@ generate_NEWLIST(cctx_T *cctx, int count) // Get the member type and the declared member type from all the items on // the stack. - member_type = get_member_type_from_stack(count, 1, &decl_member_type, cctx); + member_type = get_member_type_from_stack(count, 1, + &decl_member_type, cctx); type = get_list_type(member_type, cctx->ctx_type_list); decl_type = get_list_type(decl_member_type, cctx->ctx_type_list); @@ -1277,6 +1278,7 @@ generate_BCALL(cctx_T *cctx, int func_idx, int argcount, int method_call) type2_T shuffled_argtypes[MAX_FUNC_ARGS]; type2_T *maptype = NULL; type_T *type; + type_T *decl_type; RETURN_OK_IF_SKIP(cctx); argoff = check_internal_func(func_idx, argcount); @@ -1327,8 +1329,8 @@ generate_BCALL(cctx_T *cctx, int func_idx, int argcount, int method_call) // Drop the argument types and push the return type. stack->ga_len -= argcount; - type = internal_func_ret_type(func_idx, argcount, argtypes); - if (push_type_stack(cctx, type) == FAIL) + type = internal_func_ret_type(func_idx, argcount, argtypes, &decl_type); + if (push_type_stack2(cctx, type, decl_type) == FAIL) return FAIL; if (maptype != NULL && maptype[0].type_decl->tt_member != NULL @@ -1351,7 +1353,9 @@ generate_LISTAPPEND(cctx_T *cctx) type_T *expected; // Caller already checked that list_type is a list. - list_type = get_type_on_stack(cctx, 1); + // For checking the item type we use the declared type of the list and the + // current type of the added item, adding a string to [1, 2] is OK. + list_type = get_decl_type_on_stack(cctx, 1); item_type = get_type_on_stack(cctx, 0); expected = list_type->tt_member; if (need_type(item_type, expected, -1, 0, cctx, FALSE, FALSE) == FAIL) diff --git a/src/vim9type.c b/src/vim9type.c index 82c1b5f453..f2a69d0ab5 100644 --- a/src/vim9type.c +++ b/src/vim9type.c @@ -357,8 +357,10 @@ typval2type_int(typval_T *tv, int copyID, garray_T *type_gap, int flags) if (idx >= 0) { + type_T *decl_type; // unused + internal_func_get_argcount(idx, &argcount, &min_argcount); - member_type = internal_func_ret_type(idx, 0, NULL); + member_type = internal_func_ret_type(idx, 0, NULL, &decl_type); } else ufunc = find_func(name, FALSE); @@ -1244,7 +1246,8 @@ set_type_on_stack(cctx_T *cctx, type_T *type, int offset) } /* - * Get the type from the type stack. If "offset" is zero the one at the top, + * Get the current type from the type stack. If "offset" is zero the one at + * the top, * if "offset" is one the type above that, etc. * Returns &t_unknown if there is no such stack entry. */ @@ -1259,6 +1262,23 @@ get_type_on_stack(cctx_T *cctx, int offset) ->type_curr; } +/* + * Get the declared type from the type stack. If "offset" is zero the one at + * the top, + * if "offset" is one the type above that, etc. + * Returns &t_unknown if there is no such stack entry. + */ + type_T * +get_decl_type_on_stack(cctx_T *cctx, int offset) +{ + garray_T *stack = &cctx->ctx_type_stack; + + if (offset + 1 > stack->ga_len) + return &t_unknown; + return (((type2_T *)stack->ga_data) + stack->ga_len - offset - 1) + ->type_decl; +} + /* * Get the member type of a dict or list from the items on the stack of "cctx". * The declared type is stored in "decl_type". From eb4a9ba293be51039e57e0e18337785e2ce526e7 Mon Sep 17 00:00:00 2001 From: Bram Moolenaar Date: Tue, 1 Feb 2022 12:47:07 +0000 Subject: [PATCH 15/28] patch 8.2.4280: list-dict test crashes Problem: list-dict test crashes. Solution: Check declared type for add(). --- src/version.c | 2 ++ src/vim9expr.c | 2 +- 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/src/version.c b/src/version.c index 6d896152eb..978e869ec0 100644 --- a/src/version.c +++ b/src/version.c @@ -746,6 +746,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ +/**/ + 4280, /**/ 4279, /**/ diff --git a/src/vim9expr.c b/src/vim9expr.c index 6affac22ee..d36df84e0b 100644 --- a/src/vim9expr.c +++ b/src/vim9expr.c @@ -759,7 +759,7 @@ compile_call( if (STRCMP(name, "add") == 0 && argcount == 2) { - type_T *type = get_type_on_stack(cctx, 1); + type_T *type = get_decl_type_on_stack(cctx, 1); // add() can be compiled to instructions if we know the type if (type->tt_type == VAR_LIST) From 9b4a80a66544f2782040b641498754bcb5b8d461 Mon Sep 17 00:00:00 2001 From: Bram Moolenaar Date: Tue, 1 Feb 2022 13:54:17 +0000 Subject: [PATCH 16/28] patch 8.2.4281: using freed memory with :lopen and :bwipe Problem: Using freed memory with :lopen and :bwipe. Solution: Do not use a wiped out buffer. --- src/buffer.c | 14 ++++++++++---- src/testdir/test_quickfix.vim | 17 +++++++++++++++++ src/version.c | 2 ++ 3 files changed, 29 insertions(+), 4 deletions(-) diff --git a/src/buffer.c b/src/buffer.c index 24da829847..81bdb31ca1 100644 --- a/src/buffer.c +++ b/src/buffer.c @@ -1706,6 +1706,7 @@ set_curbuf(buf_T *buf, int action) #endif bufref_T newbufref; bufref_T prevbufref; + int valid; setpcmark(); if ((cmdmod.cmod_flags & CMOD_KEEPALT) == 0) @@ -1763,13 +1764,19 @@ set_curbuf(buf_T *buf, int action) // An autocommand may have deleted "buf", already entered it (e.g., when // it did ":bunload") or aborted the script processing. // If curwin->w_buffer is null, enter_buffer() will make it valid again - if ((buf_valid(buf) && buf != curbuf + valid = buf_valid(buf); + if ((valid && buf != curbuf #ifdef FEAT_EVAL && !aborting() #endif ) || curwin->w_buffer == NULL) { - enter_buffer(buf); + // If the buffer is not valid but curwin->w_buffer is NULL we must + // enter some buffer. Using the last one is hopefully OK. + if (!valid) + enter_buffer(lastbuf); + else + enter_buffer(buf); #ifdef FEAT_SYN_HL if (old_tw != curbuf->b_p_tw) check_colorcolumn(curwin); @@ -2288,8 +2295,7 @@ free_buf_options( clear_string_option(&buf->b_p_vsts); vim_free(buf->b_p_vsts_nopaste); buf->b_p_vsts_nopaste = NULL; - vim_free(buf->b_p_vsts_array); - buf->b_p_vsts_array = NULL; + VIM_CLEAR(buf->b_p_vsts_array); clear_string_option(&buf->b_p_vts); VIM_CLEAR(buf->b_p_vts_array); #endif diff --git a/src/testdir/test_quickfix.vim b/src/testdir/test_quickfix.vim index fb6d21fc5c..07fdb9644b 100644 --- a/src/testdir/test_quickfix.vim +++ b/src/testdir/test_quickfix.vim @@ -979,6 +979,7 @@ func Test_locationlist_curwin_was_closed() call assert_fails('lrewind', 'E924:') augroup! testgroup + delfunc R endfunc func Test_locationlist_cross_tab_jump() @@ -5835,4 +5836,20 @@ func Test_two_qf_windows() %bw! endfunc +" Weird sequence of commands that caused entering a wiped-out buffer +func Test_lopen_bwipe() + func R() + silent! tab lopen + e x + silent! lfile + endfunc + + cal R() + cal R() + cal R() + bw! + delfunc R +endfunc + + " vim: shiftwidth=2 sts=2 expandtab diff --git a/src/version.c b/src/version.c index 978e869ec0..d8b3d4b7f5 100644 --- a/src/version.c +++ b/src/version.c @@ -746,6 +746,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ +/**/ + 4281, /**/ 4280, /**/ From adbb1bf21dad5697cd82d46d9dd9e8e8d0f647e6 Mon Sep 17 00:00:00 2001 From: matveyt Date: Tue, 1 Feb 2022 17:26:12 +0000 Subject: [PATCH 17/28] patch 8.2.4282: restricted mode requires the -Z command line option Problem: Restricted mode requires the -Z command line option. Solution: Use restricted mode when $SHELL ends in "nologin" or "false". (closes #9681) --- runtime/doc/starting.txt | 2 ++ src/option.c | 11 +++++++++++ src/testdir/test_restricted.vim | 8 ++++++++ src/version.c | 2 ++ 4 files changed, 23 insertions(+) diff --git a/runtime/doc/starting.txt b/runtime/doc/starting.txt index f56baf6bc7..bca2f97042 100644 --- a/runtime/doc/starting.txt +++ b/runtime/doc/starting.txt @@ -256,6 +256,8 @@ a slash. Thus "-R" means recovery and "-/R" readonly. Interfaces, such as Python, Ruby and Lua, are also disabled, since they could be used to execute shell commands. Perl uses the Safe module. + For Unix restricted mode is used when the last part of $SHELL + is "nologin" or "false". Note that the user may still find a loophole to execute a shell command, it has only been made difficult. diff --git a/src/option.c b/src/option.c index 339ea42996..03274a432c 100644 --- a/src/option.c +++ b/src/option.c @@ -307,6 +307,17 @@ set_init_1(int clean_arg) */ set_options_default(0); +#ifdef UNIX + // Force restricted-mode on for "nologin" or "false" $SHELL + p = get_isolated_shell_name(); + if (p != NULL) + { + if (fnamecmp(p, "nologin") == 0 || fnamecmp(p, "false") == 0) + restricted = TRUE; + vim_free(p); + } +#endif + #ifdef CLEAN_RUNTIMEPATH if (clean_arg) { diff --git a/src/testdir/test_restricted.vim b/src/testdir/test_restricted.vim index 22ca2f80c1..f743fbf3e4 100644 --- a/src/testdir/test_restricted.vim +++ b/src/testdir/test_restricted.vim @@ -105,6 +105,14 @@ func Test_restricted_mode() if RunVim([], [], '-Z --clean -S Xrestricted') call assert_equal([], readfile('Xresult')) endif + call delete('Xresult') + if has('unix') && RunVimPiped([], [], '--clean -S Xrestricted', 'SHELL=/bin/false ') + call assert_equal([], readfile('Xresult')) + endif + call delete('Xresult') + if has('unix') && RunVimPiped([], [], '--clean -S Xrestricted', 'SHELL=/sbin/nologin') + call assert_equal([], readfile('Xresult')) + endif call delete('Xrestricted') call delete('Xresult') diff --git a/src/version.c b/src/version.c index d8b3d4b7f5..b96637f152 100644 --- a/src/version.c +++ b/src/version.c @@ -746,6 +746,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ +/**/ + 4282, /**/ 4281, /**/ From 73257149d759a8e6ddbe555d2b5aa37b6cb8db8b Mon Sep 17 00:00:00 2001 From: zeertzjq Date: Wed, 2 Feb 2022 13:16:37 +0000 Subject: [PATCH 18/28] patch 8.2.4283: using a variable for the return value is not needed Problem: Using a variable for the return value is not needed. Solution: Return the value directly. (closes #9687) --- src/ex_docmd.c | 47 +++++++++++++++++++++-------------------------- src/misc2.c | 16 +++++++--------- src/version.c | 2 ++ 3 files changed, 30 insertions(+), 35 deletions(-) diff --git a/src/ex_docmd.c b/src/ex_docmd.c index 64dcd7e2bf..d8adf85bcb 100644 --- a/src/ex_docmd.c +++ b/src/ex_docmd.c @@ -7358,7 +7358,8 @@ changedir_func( { char_u *pdir = NULL; int dir_differs; - int retval = FALSE; + char_u *acmd_fname; + char_u **pp; if (new_dir == NULL || allbuf_locked()) return FALSE; @@ -7415,38 +7416,32 @@ changedir_func( { emsg(_(e_command_failed)); vim_free(pdir); + return FALSE; } + + if (scope == CDSCOPE_WINDOW) + pp = &curwin->w_prevdir; + else if (scope == CDSCOPE_TABPAGE) + pp = &curtab->tp_prevdir; else + pp = &prev_dir; + vim_free(*pp); + *pp = pdir; + + post_chdir(scope); + + if (dir_differs) { - char_u *acmd_fname; - char_u **pp; - if (scope == CDSCOPE_WINDOW) - pp = &curwin->w_prevdir; + acmd_fname = (char_u *)"window"; else if (scope == CDSCOPE_TABPAGE) - pp = &curtab->tp_prevdir; + acmd_fname = (char_u *)"tabpage"; else - pp = &prev_dir; - vim_free(*pp); - *pp = pdir; - - post_chdir(scope); - - if (dir_differs) - { - if (scope == CDSCOPE_WINDOW) - acmd_fname = (char_u *)"window"; - else if (scope == CDSCOPE_TABPAGE) - acmd_fname = (char_u *)"tabpage"; - else - acmd_fname = (char_u *)"global"; - apply_autocmds(EVENT_DIRCHANGED, acmd_fname, new_dir, FALSE, - curbuf); - } - retval = TRUE; + acmd_fname = (char_u *)"global"; + apply_autocmds(EVENT_DIRCHANGED, acmd_fname, new_dir, FALSE, + curbuf); } - - return retval; + return TRUE; } /* diff --git a/src/misc2.c b/src/misc2.c index b6d5e066c6..fac836fb76 100644 --- a/src/misc2.c +++ b/src/misc2.c @@ -1903,7 +1903,6 @@ vim_chdirfile(char_u *fname, char *trigger_autocmd) { char_u old_dir[MAXPATHL]; char_u new_dir[MAXPATHL]; - int res; if (mch_dirname(old_dir, MAXPATHL) != OK) *old_dir = NUL; @@ -1913,16 +1912,15 @@ vim_chdirfile(char_u *fname, char *trigger_autocmd) if (pathcmp((char *)old_dir, (char *)new_dir, -1) == 0) // nothing to do - res = OK; - else - { - res = mch_chdir((char *)new_dir) == 0 ? OK : FAIL; + return OK; - if (res == OK && trigger_autocmd != NULL) - apply_autocmds(EVENT_DIRCHANGED, (char_u *)trigger_autocmd, + if (mch_chdir((char *)new_dir) != 0) + return FAIL; + + if (trigger_autocmd != NULL) + apply_autocmds(EVENT_DIRCHANGED, (char_u *)trigger_autocmd, new_dir, FALSE, curbuf); - } - return res; + return OK; } #endif diff --git a/src/version.c b/src/version.c index b96637f152..f1014b3fe6 100644 --- a/src/version.c +++ b/src/version.c @@ -746,6 +746,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ +/**/ + 4283, /**/ 4282, /**/ From ab8f7c50cf7d5c0c72dfa5067e5b1f57585db4d8 Mon Sep 17 00:00:00 2001 From: ichizok Date: Wed, 2 Feb 2022 15:19:38 +0000 Subject: [PATCH 19/28] patch 8.2.4284: old mac resources files are no longer used Problem: Old mac resources files are no longer used. Solution: Delete the unused files. (Ozaki Kiichi, closes #9688) --- Filelist | 4 - src/Makefile | 8 - src/dehqx.py | 45 --- src/infplist.xml | 74 ---- src/os_mac.rsr.hqx | 659 ----------------------------------- src/os_mac_rsrc/app.icns | Bin 47086 -> 0 bytes src/os_mac_rsrc/doc-txt.icns | Bin 40106 -> 0 bytes src/os_mac_rsrc/doc.icns | Bin 42287 -> 0 bytes src/version.c | 2 + 9 files changed, 2 insertions(+), 790 deletions(-) delete mode 100644 src/dehqx.py delete mode 100644 src/infplist.xml delete mode 100644 src/os_mac.rsr.hqx delete mode 100644 src/os_mac_rsrc/app.icns delete mode 100644 src/os_mac_rsrc/doc-txt.icns delete mode 100644 src/os_mac_rsrc/doc.icns diff --git a/Filelist b/Filelist index e636495660..bf752c5e57 100644 --- a/Filelist +++ b/Filelist @@ -663,10 +663,7 @@ SRC_HAIKU = \ # source files for the Mac (also in the extra archive) SRC_MAC = \ src/INSTALLmac.txt \ - src/dehqx.py \ - src/os_mac_rsrc/*.icns \ src/os_mac.h \ - src/os_mac.rsr.hqx \ src/os_mac_conv.c \ src/os_macosx.m \ src/proto/os_mac_conv.pro \ @@ -704,7 +701,6 @@ SRC_EXTRA = \ $(SRC_QNX) \ $(SRC_VMS) \ README_os390.txt \ - src/infplist.xml \ src/link.390 \ src/os_vms_fix.com \ src/toolbar.phi \ diff --git a/src/Makefile b/src/Makefile index 96ec34a6c3..46af6c3bab 100644 --- a/src/Makefile +++ b/src/Makefile @@ -2053,9 +2053,6 @@ PRO_AUTO = \ $(ALL_GUI_PRO) \ $(TCL_PRO) -# Resources used for the Mac are in one directory. -RSRC_DIR = os_mac_rsrc - PRO_MANUAL = os_amiga.pro os_win32.pro \ os_mswin.pro winclip.pro os_vms.pro $(PERL_PRO) @@ -2999,11 +2996,6 @@ shadow: runtime pixmaps cd $(SHADOWDIR)/xxd; ln -s ../../xxd/*.[ch] ../../xxd/Make* . $(MKDIR_P) $(SHADOWDIR)/xdiff cd $(SHADOWDIR)/xdiff; ln -s ../../xdiff/*.[ch] . - if test -d $(RSRC_DIR); then \ - cd $(SHADOWDIR); \ - ln -s ../infplist.xml .; \ - ln -s ../$(RSRC_DIR) ../os_mac.rsr.hqx ../dehqx.py .; \ - fi $(MKDIR_P) $(SHADOWDIR)/testdir cd $(SHADOWDIR)/testdir; ln -s ../../testdir/Makefile \ ../../testdir/Make_all.mak \ diff --git a/src/dehqx.py b/src/dehqx.py deleted file mode 100644 index 00e8f9f340..0000000000 --- a/src/dehqx.py +++ /dev/null @@ -1,45 +0,0 @@ -# Python script to get both the data and resource fork from a BinHex encoded -# file. -# Author: MURAOKA Taro -# Last Change: 2018 Mar 27 -# -# Copyright (C) 2003,12 MURAOKA Taro -# THIS FILE IS DISTRIBUTED UNDER THE VIM LICENSE. - -import sys -import binhex - -input = sys.argv[1] -conv = binhex.HexBin(input) -info = conv.FInfo -out = conv.FName -out_data = out -out_rsrc = out + '.rsrcfork' - -# This uses the print statement on Python 2, print function on Python 3. -#print('out_rsrc=' + out_rsrc) -print('In file: ' + input) - -outfile = open(out_data, 'wb') -print(' Out data fork: ' + out_data) -while 1: - d = conv.read(128000) - if not d: break - outfile.write(d) -outfile.close() -conv.close_data() - -d = conv.read_rsrc(128000) -if d: - print(' Out rsrc fork: ' + out_rsrc) - outfile = open(out_rsrc, 'wb') - outfile.write(d) - while 1: - d = conv.read_rsrc(128000) - if not d: break - outfile.write(d) - outfile.close() - -conv.close() - -# vim:set ts=8 sts=4 sw=4 et: diff --git a/src/infplist.xml b/src/infplist.xml deleted file mode 100644 index c58cf74802..0000000000 --- a/src/infplist.xml +++ /dev/null @@ -1,74 +0,0 @@ - - - - - - - CFBundleIdentifier - org.vim.Vim-APP_VER - CFBundleInfoDictionaryVersion - 6.0 - - CFBundleExecutable - APP_EXE - CFBundleName - APP_NAME - CFBundlePackageType - APPL - CFBundleVersion - APP_VER - CFBundleShortVersionString - APP_VER - CFBundleSignature - VIM! - - CFBundleDevelopmentRegion - English - CSResourcesFileMapped - - CFBundleIconFile - app.icns - - CFBundleDocumentTypes - - - CFBundleTypeExtensions - - txt - text - - CFBundleTypeMIMETypes - - text/plain - - CFBundleTypeIconFile - doc-txt.icns - CFBundleTypeName - Text File - CFBundleTypeRole - Editor - - - CFBundleTypeExtensions - - * - - CFBundleTypeMIMETypes - - text/* - - CFBundleTypeIconFile - doc.icns - CFBundleTypeName - File - CFBundleTypeOSTypes - - **** - - CFBundleTypeRole - Editor - - - - - diff --git a/src/os_mac.rsr.hqx b/src/os_mac.rsr.hqx deleted file mode 100644 index 04e99723fc..0000000000 --- a/src/os_mac.rsr.hqx +++ /dev/null @@ -1,659 +0,0 @@ -(This file must be converted with BinHex 4.0) - -:$'GeD9pYB@-ZFR0bB`"58e*$8P0&4!%!!!!!!!!!HUUk%`!!!!!"!!!!GJX!!(8 -,!!!%R`!!$Ed,Eh0IGc-bC'aX,Q-#!!!!9%9B9%0A588"!2rr#hCTE9"33bjbFh* -MFLe%EfYeE@9ZG'9PEL"%BA4PER8!!(*cFQ058d9%!3lrrrrr!!!!!!!!!!!!!!! -!!!!!!!!!X3N1a!!!!!!!!%'-!!!!!!!!!!!4!!!!$Ed,Eh0IGc-bCAKP,Q-#!!! -!9%9B9%0A588"!2rrrrm!!!!!$NN!!!!!$hi!!%)!!!!!!!!!!!!!!,#`81D`X&$ -Q!!!!!!!!!!!!!!!!!!!!!!!!!!!!!'6Y!!%!!!!!!!!!!!!!!!!!!!!!!!!!!!! -!!!!3!!!!!#a@58dK!!!!!8C548B!!J!!!)!!!3#"!!)!JNP$6L-!!J!!!))!!3# -$!!)!!!!!!!G"8&"-!!!!!!!!"e4&@&3!!3!!!!!(+LSU+J!#!!!!!J!!!2rrrrr -rrrrrrrm!!!!!!!$m$!`-$!`-$!`2m!!!!!!!m-$!`-E!`-$!cpm!!!!!!2`-$!` --$!`-$!r0m!!!!!$`aX$'aXCJB-$2$0m!!!!!r!B-"JB'"JB-$rrrm!!!!2$!B'$ -'aXE'`-$!c[!!!!$m$'aX"JB'"J`-$!l`!!!!m-$'`-E'aXE!`-$1m!!!!2`-$!` --$!`-$!`-$[!!!!$``-$!`-$!`-$!`-l`!!!!r!`-$!`-$!`-$!`1m!!!!2$!`-$ -!`-$!`-$!c[!!!!$m$!`-$!`-$!`-$!l`!!!!m-$!`-$!`-$!`-$1m!!!!2`-CJB --$!`-$!`-$[!!!!$`aXCJ`-$!`-$!`-l`!!!!r!`-$!`-$!`-$!`1m!!!!2$!`-$ -!`-$!`-$!c[!!!!$m$!`-$!`-$!`-$!l`!!!!m-$!`-$!`-$!`-$1m!!!!2`-$!` --$!`-$!`-$[!!!!$``-$!`-$!`-$!`-l`!!!!r!`-$!`-$!`-$!`1m!!!!2$!CXE -!`-$!`-$!c[!!!!$m"JCX$!`-$!`-$!l`!!!!m-$!`-$!`-$!`-$1m!!!!2`-$!` --$!`-$!`-$[!!!!$``-$!`-$!`-$!`-l`!!!!r!`-$!`-$!`-$!`1m!!!!2lZlZl -ZlZlZlZlZl[!!!!$rrrrrrrrrrrrrrrr`!!!!!J$rrrrrrrrrrrrrrrrrrrr`m!! -!!!!!!!!!!!!!!!!!m2!!!!!!!!!!!!!!!!!!!2$`!!!!!!!!!!!!!!!!!!$`m!! -!!!!!!!!2rrr`!!!!m2!!CJB!!!!!mJ)#$`!!!2$`"JCJ!!!!$b!J)#$`!!$`m!! -!!!!!!2)2mJ)#$`!!m2!!!!!!!!$rrGmJ)#$`!2$`!!!!!!rr![rrrrm#$rrrm!! -!!!!!$b![m#!J)#$fEr!!!!!!$Ghb!J)#!J)#pQr`!!!!!!!0hb!J)#!J)2C[m!! -!!!!!!0hr!J)#!J,fEr!!CJB!!!!0hIrrrrmJpQr`"JCJ!!!!!0hGhGhGrrC[m!! -!!!!!!!!!hGhGhGhIrr!!!!!!!!!!!!!!!!hGhI$`!!!!!!!!!!!!!!!!!!$`m!! -!!!!!!!!!!!!'CQCJm2!!!!!!!!!!!!!!"QCQB2$`!!!!!!!'!!!!!!CQCQ$`m!! -!!!!!!!!!!!!'CQCJm2!'B'!!B'B!CJB!"QCQB2$`"Q"J!'!'!'"JB!CQCQ$`m!! -!"JB!"J"JB'!'CQCJm2!!!!B'!!B!B'"J"QCQB2$`"Q!'"J!'!'"JB!CQCQ$`m!C -J!'!!"Q"JB'!'CQCJm2!!!!!!!!!!!!!!"QCQB2$`!!!!!!!!!!!!!!!!!!$`rrr -rrrrrrrrrrrrrrrrrm!!!!J!!$rrrrrrrrrrrrrrrrr!!!2!!!!!!!!!!!!!!!!! -2!!m!c-c-c-c-c-c-c-c-c[!2$-lZlZlZlZlZlZlZl-l`$`cZrrrrrrrrrrrrrq$ -1m!m-lrL2Mrrrrrrrrrr`c[!2$1q2L2rrrrrrrrrrm-l`$`c[rrrrrrrrrrrrrr$ -1m!m-lrrrrrrrrrrrrrr`c[!2$1rrrrrrrrrrrrrrm-l`$`c[rrrrrrrrrrrrrr$ -1m!m-lrL2Mrrrrrrrrrr`c[!2$1q2L2rrrrrrrrrrm-l`$`c[rrrrrrrrrrrrrr$ -1m!m-lrrrrrrrrrriL)M`c[!2$1rrrrrirrrrq)L)m-l`$`c[rrrrrrrrrrL)L2$ -1m!m-liq2q2MiMiriL)M`c[!2$1rrMrMiq2Miq)L)m-l`$`c[riq2q2Miq2L)L2$ -1m!m-liq)rrMiq2MiL)M`c[!2$1rrrrrrrrrrrrrrm-l`$`cZrrrrrrrrrrrrr`$ -1m!m-`!!!!!!!!!!!!!!-c[!2$-c-c-c-c-c-c-c-c1l`!2lZlZlZlZlZlZlZlZl -[!!!2c1c1c1c1c1c1c1c1m!!!rmlXlXlXlXlXlXlXl[m!$rc1c1c1c1c1c1c1c1c -1m2rmlXlXlXlXlXlXlXlXl[rrrrrrrrrrrrrrrrrrrrrr$rrrrrrrrrrrrrrrrrr -rm!!!!J!!!!$rrrrrrrrrrrrrm!!!!!!!r!`-$!`-$!`-$2m!!!!!!2$!`-$!`-$ -!`-$qm!!!!!$m$!`-$!`-$!`-rHm!!!!!m-$!`-$!`-$!`2cHm!!!!2`-$!`-$!` --$!crrrm!rrrrrrrrrrrrrm$!`-$2$mc-c-c-c-c-c-cm$!`-$rcGhGhGhGhGhGh -Glm$!`-rmhZlZlZlZlZlZlHm-$!`2r0lrrrrrrrq)Mmh[d-$!crcHMiq2L2MrL)r -0lmd-$!rmhSq2Miq2MiL2cHrF`-$2r0k)riq2Miq)Mmh[c3`-$rcHrrrrrrrrrrr -0lpc!`-rmh[rrrrrrrrrrcHr0$!`2r0liMirrrrrrrmh[h-$!crcHMiMrrrrrrrr -0lmd-$!rmh[rrrrrrrrrrcHrF`-$2r0lrrrrrrrrrrmh[c3`-$rcHq)q2rrrrrrr -0lpc!`-rmhSq)rrrrrrrrcHr0$!`2r0lrrrrrrrrrrmh[h-$!crcHc-c-c-c-c-c -0lmd-$!rmhGhGhGhGhGhGhHrF`-$2$qlZlZlZlZlZlZlpc3`-$`$rrrrrrrrrrrr -rh0$!`-m!!!$pcFh0cFh0cFd-$!`2!!!!r0cFh0cFh0c3`-$!c`!!!2`-$!`-$!` --$!`-$!m!!!$``-$!`-$!`-$!`-$2!!!!rrrrrrrrrrrrrrrrr`!!"!!!!!!!rrr -rrrrrrrrrrrrrrrrrrrrrrrm!!!!!!!!!!!!!!!$rpIAepIAepIAepIAepIAepIA -errm!!!!!!!!!!!!!!2repIAepIAepHcepIAepIAepIArq[m!!!!!!!!!!!!!rrA -epIAepIAepIAepIAepIAepIrhq[m!!!!!!!!!!!$rpIAXpIAel2AXpHcXpHcepIA -errAhq[m!!!!!!!!!!2repHcepIAXpHcel2AXpHcepIArrrrrrrm!!!!!!!!!rrA -epHcel2Ael2AXpHcel2AepIAepIAlr`!!!!!!!!$rpIAel2AXpIAXpHcel2AXpIA -epIAepI[r!!!!!!!!!2repIAel2AepHcel2AXpHcepIAepIAeqrm!!!!!!!!!rrA -epIAepIAepIAepIAepIAepIAepIAlr`!!!!!!!!$rpIAepIAepIAepIAepIAepIA -epIAepI[r!!!!!!!!!2repIAepIAepIAepIAepIAepIAepIAeqrm!!!!!!!!!rrA -epIAepIAepIAepIAepIAepIAepIAlr`!!!!!!!!$rpIAepIAepIAepIAepIAepIA -epIAepI[r!!!!!!!!!2repIAepIAepIAepIAepIAepIAepIAeqrm!!!!!!!!!rrA -epHcXpHcepIAepIAepIAepIAepIAlr`!!!!!!!!$rpIAXpHcXpIAepIAepIAepIA -epIAepI[r!!!!!!!!!2repIAepIAepIAepIAepIAepIAepIAeqrm!!!!!!!!!rrA -epIAepIAepIAepIAepIAepIAepIAlr`!!!!!!!!$rpIAepIAepIAepIAepIAepIA -epIAepI[r!!!!!!!!!2repIAepIAepIAepIAepIAepIAepIAeqrm!!!!!!!!!rrA -epIAepIAepIAepIAepIAepIAepIAlr`!!!!!!!!$rpIAepIAepIAepIAepIAepIA -epIAepI[r!!!!!!!!!2repIAepIAepIAepIAepIAepIAepIAeqrm!!!!!!!!!rrA -epHcXpHcepIAepIAepIAepIAepIAlr`!!!!!!!!$rpIAXpHcXpIAepIAepIAepIA -epIAepI[r!!!!!!!!!2repIAepIAepIAepIAepIAepIAepIAeqrm!!!!!!!!!rrA -epIAepIAepIAepIAepIAepIAepIAlr`!!!!!!!!$rpIAepIAepIAepIAepIAepIA -epIAepI[r!!!!!!!!!2repIAepIAepIAepIAepIAepIAepIAeqrm!!!!!!!!!rr[ -lqr[lqr[lqr[lqr[lqr[lqr[lqr[lr`!!!!!!!!$rrrrrrrrrrrrrrrrrrrrrrrr -rrrrrrrrr!!!!!!!%!2rrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrm!rdK -)5%K)5%K)5%K)5%K)5%K)5%K)5%K)5%K)5%K)r`$r5%K)5%K)5%K)5%K)5%K)5%K -)5%K)5%K)5%K)5%Mr!2p)5%K)5%K)5%K)5%K)5%K)5%K)5%K)5%K)5%K)52m!rdK -)5%K)5%K)5%K)5%K)5%Mrrrrrrrp)5%K)5%K)r`$r5%K)l1a)l%K)5%K)5%K)r`J -)#!J)#2p)5%K)5%Mr!2p)51a)l1a)5%K)5%K)52m)#!J)#!J)#2p)5%K)52m!rdK -)5%K)5%K)5%K)5%Mr#!Mrr`J)#!J)#2p)5%K)r`$r5%K)5%K)5%K)5%K)52rrrhp -rr`J)#!J)#2p)5%Mr!2p)5%K)5%K)5%K)rrrr#!Mrrrrrrrrrr`J)#2rrrrrrrdK -)5%K)5%K)5%K)52m)#!Mrr`J)#!J)#!J)#2rXl2rr5%K)5%K)5%K)5(prIrm)#!J -)#!J)#!J)#!J)rqcXrrp)5%K)5%K)5%K)5%KrIrm)#!J)#!J)#!J)#!Mrl1crrdK -)5%K)5%K)5%K)5%KrIrrr#!J)#!J)#!J)#2rXl2rr5%K)l1a)l%K)5%K)5%KrIhr -rrrrrrrrrr`J)rqcXrrp)51a)l1a)5%K)5%K)5%KrIhprIhprIhprrrrrl1crrdK -)5%K)5%K)5%K)5%K)5%K)IhprIhprIhprIhrrrrrr5%K)5%K)5%K)5%K)5%K)5%K -)5%K)5%K)IhprIhrr!2p)5%K)5%K)5%K)5%K)5%K)5%K)5%K)5%K)5%K)52m!rdK -)5%K)5%K)5%K)5%K)5%K)5%K)5%MXl1cXl1a)r`$r5%K)5%K)5%K)5%K)5%K)5%K -)5%K)51cXl1cXl%Mr!2p)5%K)5%K)5%K)5%MX5%K)5%K)5%K)l1cXl1cX52m!rdK -)5%K)5%K)5%K)5%K)5%K)5%K)5%MXl1cXl1a)r`$r5%MXl%MX5%K)l%MXl%K)l1a -)l%K)51cXl1cXl%Mr!2p)51cX51a)5%MX5%MX5%MX51a)l%K)l1cXl1cX52m!rdK -)5%K)51a)l%K)51a)51a)l%MX5%MXl1cXl1a)r`$r5%K)5%K)l%MX5%K)l%K)l%M -X51a)51cXl1cXl%Mr!2p)51cX5%MX51a)5%MX5%MX51a)l%K)l1cXl1cX52m!rdK -)l1a)5%MX5%K)51cX51a)l%MX5%MXl1cXl1a)r`$r5%K)5%K)5%K)5%K)5%K)5%K -)5%K)51cXl1cXl%Mr!2p)5%K)5%K)5%K)5%K)5%K)5%K)5%K)5%K)5%K)52m!rrr -rrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrr`!!!!3!!!!!rrrrrrrrrrrrrrr -rrrrrrrrrrrrrrrrrrrm!!!!!!2repIAepIAepIAepIAepIAepIAepIAepIAepIm -!!!$rpIAiq2Miq2Miq2Miq2Miq2Miq2Miq2Miq2Mir2m!!2req2Mmr2cmr2cmr2c -mr2cmr2cmr2cmr2cmq2Mmr`!!rrAir2crrrrrrrrrrrrrrrrrrrrrrrrrrrceq2c -r!!$rpIMmrrrMirrMrrrrrrrrrrrrrrrrrrrrrrAir2m!!2req2crirrMirrrrrr -rrrrrrrrrrrrrrrrrpIMmr`!!rrAir2rrrrrrrrrrrrrrrrrrrrrrrrrrrrreq2c -r!!$rpIMmrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrAir2m!!2req2crrrrrrrrrrrr -rrrrrrrrrrrrrrrrrpIMmr`!!rrAir2rrrrrrrrrrrrrrrrrrrrrrrrrrrrreq2c -r!!$rpIMmrrrMirrMrrrrrrrrrrrrrrrrrrrrrrAir2m!!2req2crirrMirrrrrr -rrrrrrrrrrrrrrrrrpIMmr`!!rrAir2rrrrrrrrrrrrrrrrrrrrrrrrrrrrreq2c -r!!$rpIMmrrrrrrrrrrrrrrrrrrrrrq2Miq2MrrAir2m!!2req2crrrrrrrrrrq2 -rrrrrrrrriq2Miq2rpIMmr`!!rrAir2rrrrrrrrrrrrrrrrrrrrrMiq2Mirreq2c -r!!$rpIMmrq2rirrrirrMrq2Mrq2rrq2Miq2MrrAir2m!!2req2crrrrMrrrMrq2 -rirrMrq2riq2Miq2rpIMmr`!!rrAir2rrrq2rirrrirrMrq2rirrMiq2Mirreq2c -r!!$rpIMmrq2riq2rrrrMrq2rirrMrq2Miq2MrrAir2m!!2req2crrrrrrrrrrrr -rrrrrrrrrrrrrrrrrpIMmr`!!rrAir2crrrrrrrrrrrrrrrrrrrrrrrrrrrAeq2c -r!!$rpIMipIAepIAepIAepIAepIAepIAepIAepIMir2m!!2req2Miq2Miq2Miq2M -iq2Miq2Miq2Miq2Miq2cmr`!!!2rmr2cmr2cmr2cmr2cmr2cmr2cmr2cmr2cmr2m -!!!!!!2rhpr[hpr[hpr[hpr[hpr[hpr[hpr[hpr[r!!!!!!$rrrIlqrIlqrIlqrI -lqrIlqrIlqrIlqrIlqrrr!!!!rrrhpr[hpr[hpr[hpr[hpr[hpr[hpr[hpr[hpr[ -r!2rrrrIlqrIlqrIlqrIlqrIlqrIlqrIlqrIlqrIlqrrrrrrrrrrrrrrrrrrrrrr -rrrrrrrrrrrrrrrrrrrrrrrm!rrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrr -r!!!!"!!!!!!!!!$rrrrrrrrrrrrrrrrrrrrrrrrrrrm!!!!!!!!!!!!!!2rfp[E -fp[Efp[Efp[Efp[Efp[Efrrm!!!!!!!!!!!!!rrEfp[Efp[Efp[Efp[Efp[Efp[E -rr2m!!!!!!!!!!!$rp[Efp[Efp[Efp[Efp[Efp[Efp[rjr2m!!!!!!!!!!2rfp[E -fp[Efp[Efp[Efp[Efp[EfrrMjr2m!!!!!!!!!rrEfp[Efp[Efp[Efp[Efp[Efp[E -rrrrrrrm!!2rrrrrrrrrrrrrrrrrrrrrrrrrrp[Efp[Efp[Efr`$r+bXV+bXV+bX -V+bXV+bXV+bXV+b[rp[Efp[Efp[Errb[jqIRjqIRjqIRjqIRjqIRjqIRjqIcrp[E -fp[Efp[rr+rRmr2cmr2cmr2cmr2cmr2cmr2cjr2rfp[Efp[EfrrmVqIcrrrrrrrr -rrrrrrrrMiq2r+rRmrrMfp[Efp[Errb[jr12rirrMrq2Mrq2rrq2MirmVqIcrq2M -fp[Efp[rr+rRmirrMrq2rirrMrq2riq2Mrb[jr2riq2Efp[EfrrmVqIcMirrrirr -Mrq2rirrMiq2r+rRmrrMip[Efp[Errb[jr2rrrrrrrrrrrrrrrrrrrrmVqIcrq2M -fp[Efp[rr+rRmrrrrrrrrrrrrrrrrrrrrrb[jr2riq2Efp[EfrrmVqIcriq2rirr -rrrrrrrrrrrrr+rRmrrMip[Efp[Errb[jr12riq2rrrrrrrrrrrrrrrmVqIcrq2M -fp[Efp[rr+rRmrrrrrrrrrrrrrrrrrrrrrb[jr2riq2Efp[EfrrmVqIcrrrrrrrr -rrrrrrrrrrrrr+rRmrrMip[Efp[Errb[jr2rMirrMrrrrrrrrrrrrrrmVqIcrq2M -fp[Efp[rr+rRmirrMirrrrrrrrrrrrrrrrb[jr2riq2Efp[EfrrmVqIcrrrrrrrr -rrrrrrrrrrrrr+rRmrrMip[Efp[Errb[jr#XV+bXV+bXV+bXV+bXV+bXVqIcrq2M -fp[Efp[rr+rRjqIRjqIRjqIRjqIRjqIRjqIRjr2riq2Efp[Efr`$rr2cmr2cmr2c -mr2cmr2cmr2cmr2crq2Mip[Efp[Er!!$rrrrrrrrrrrrrrrrrrrrrrrrrrrMiq2M -fp[Efp[m!!!!!!!$rq2Miq2Miq2Miq2Miq2Miq2Mip[Efp[Efr`!!!!!!!2riq2M -iq2Miq2Miq2Miq2Miq2Efp[Efp[Er!!!!!!!!rrEfp[Efp[Efp[Efp[Efp[Efp[E -fp[Efp[m!!!!!!!$rp[Efp[Efp[Efp[Efp[Efp[Efp[Efp[Efr`!!!!!!!2rrrrr -rrrrrrrrrrrrrrrrrrrrrrrrrrrrr!!!"!2rrrrk!!!!#J!!!!S!!!!+!!(i#M3# -"!TB"!)+!!Q"#J!13!#+!(2mIJ!4J$i!#!!q!!3!2J!$!$id!2mq@!!!rJ!!!$i! -!!!+!!!!#J!!"qS!!!IU!"!(kJ!!"qTSXdIUD*+RkJ85TqS&%UIUC4+RkQ)DTqS! -!!IU!!!!#rrrrr[rrrrlrrrrqrrrrr[rrrrlrrrrqrrrrr[rrrrlrrrrqrrrrr[r -rrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrr[rrrrlrrrrqrrrrr[r -rrrlrrrrqrrrrr[rrrrlrrrrqrrrrr[rrrrlrrrrqrrrrr[rrrrlrrrrq!!!"!!r -rr`!)!!'!#!3"3!J!!5!*&D%3#494q!LP8!J)T9!)#%93#!J!!!J)!!!)#!!!#!J -!!!J)!!!)#!!!#!M3!!J*B!!)#!!!#!J!!!J)!!!)#!!!#!J!!!J)!!!)#!!!#!M -3!!J*B!!)#!!!#!J!!!J)!!!)#!!!#!J!!!J2rrri$rrr!!rrri!2rrr!$rrri!r -rrr!2rrri$rrrq!rrrrJ2rrri$rrrq!rrrrJ2rrri$rrrq!rrrrJ2rrri$rrrq!r -rrrJ2rrri$rrrq!rrrrJ2rrri$rrrq!rrrrJ2rrri$rrrq!rrrrJ2rrri$rrrq!r -rrrJ2rrri$rrrq!rrrrJ!!!%!(rrrq#!!!!4!!!!#4rrriNJ!!"*)!!!55D!!%NV -!!"*)!!!55!!!%NJ!!"**S!!55X!!%NJ!!"*)!!I55!3(dNJ!"p*+PDI55*9AdNL -P9p*+a9I55!!!%NJ!!"*(rrrL3!!!!M!!!!`Irrri0YYY['5555EYYYY[rrrrrhr -rrriIrrri2rrrr(rrrrjrrrrqIrrrrRrrrrjrrrrqIrrrrRrrrrjrrrrqIrrrrRr -rrrjrrrrqIrrrrRrrrrjrrrrqIrrrrRrrrrjrrrrqIrrrrRrrrrjrrrrqIrrrrRr -rrrjrrrrq2rrrr"rrrrJrrrrmIrrrr[rrrrrrrrrrIrrrrJ!!!3!$rrrJ!J!!-!) -!!#J#!!!N!J!!)J)!!$mrrr`"3!!#!Crrq3'J!!8"S!$P!DUdj3'UUZ8"V+VP!D! -!"3'J!!8"TS!&!DX!"3'J!!8"S!!&!DD!"3'V!!8"S!!&!D!!"3'IrrN"3!!#!6r -rr!%#!!!"!J!!!3)!!!%#!!!"!rrrr`2rrq!$rrr`!rrrq!2rrr`$rrrq!rrrrcr -rrrprrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrr -rrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrprrrrr2rrrr`2rrrm$rrrr!rrrr`2 -rrrm$rrrr!!!!32rrJ!'8!DJ"J!'!!C3"U!'!!B#"J!'UXBUjT+Q!!Irrrrrrrrr -rrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrm!!!"!Ir"!'%S89"j!!N!#5J*8!N! -#3!*9BP9b9A**8N!#Irjrm(riIrarrRrqIrjrrRrqIrjrrRrqIrjrrRrqIrjrrJ! -!!%"rrS!"RrQP"DS&S!@U[DUpT+fJ"CrjJ!&rrM9@DUYrrhrqrrrrrrrrrrrrrrr -rrrrrrrrrrrrrrhrq2rjrrhrr!!!!3"ri%!`3#RrrJ!QIbD!TTUQV+D!TS#QIbB! -*Ir%3!4rr(rJIr"rqIrrrrrrrrrrrrrrrrrrrrrrrrrprrarr(rm!!!#!rrrrrrr -rrrrmc-c-c-c-crc2cmc-c-c2r2cmc-c-c-rmc-c-c-c-crc-c-c-c-c2r-r2c-c --c-rmr2c-c-c-crc-c-c-c-c2r-c-c2c-c-rmc-c-c-c-crcmr2cmrmc2r-cmr2c -rr-rmr-r-r2cmcrc-c-c-c-c2rrrrrrrrrrm!!!#!$rrrrrrr!!!2$!`-$!r`!!r -!B'$!cmm!$`B'$!`2rr!2`-$!`-$1m!m-$!`-$!l`$m"JB-$!c[!2"JB-$!`1m!r -!`-$!`-l`$``-$!`-$[!2aXE'aQ$1m!m'"JB'CJl`$m"JaXCQc[!2$!`-$!`1m!r -ZlZlZlZl`$rrrrrrrrr!!!!#!$rrrrrrrrr$mc-c-c-c-crcZlZlZlZl[r1q2Mrr -rr1rmk2Mrrrrmlrc[rrrrrrc[r1Miq2L)r1rmk2Miq)Mmlrc[MrMiq2c[r1rrrrr -rr1rml-c-c-c-lrlZlZlZlZl[$rrrrrrrrr!!rXl1cXl1m!rXl1cXl1cr$rrrrrr -rrrm!!!#!!!rrrrrrm!!!$``-$!cr!!!2`-$!`2h`$rrrrrrrrrrmc-c-c-c`crc -GhGhGh[`2r0rrrrrHm-rmhrL2Mplm$rcIMiMrh[$2r0rrrrrHr!rmhrrrrpl`crc -GhGhGh[`2r1lZlZlZm-m2rrrrrrm-$`!2`-$!`-$2!!rrrrrrrrm!!!%!rrrrrrr -rrrrrrrrrrrrrrrmU+LSU+LSU+LSU+LSU+[rr+LVr+[mU+LSU+LSU+LVrrbVr+[m -U+LSU+LSU+LSUrrmU+LSU+LSU+LSU+LSU+[rr+LSU+LSU+LSU+LSU+LVrrbSUrbV -r+LSU+LSU+LSUrrmUrbVr+LSU+LSU+LSU+[rr+LSU+LSU+LSU+LSU+LVrrbSU+LS -U+LVr+LSU+LSUrrmU+LSU+LSU+LSU+LSU+[rr+[mUrbVr+[mUrrmU+LVrrbSU+[m -UrbVr+[rrrbSUrrmUrbSUrbSUrbVr+[mU+[rr+LSU+LSU+LSU+LSU+LVrrrrrrrr -rrrrrrrrrrrrrr`!!!3!!rrrrrrrrrrrrrrm!!!!!!2repIAepIAepIArr`!!!!$ -rpIAXpHcepIAerrIr!!!!rrAXpHcepIAepIrrrrm!!2repIAepIAepIAepI[r!!$ -rpIAepIAepIAepIAlr`!!rrAel2AXpIAepIAeqrm!!2rel2AXpIAepIAepI[r!!$ -rpIAepIAepIAepIAlr`!!rrAepIAepIAepIAeqrm!!2rel2AXpHcel1cepI[r!!$ -rpHcel2AXpHcXl2Alr`!!rrAel2Ael2AXl1ceqrm!!2repIAepIAepIAepI[r!!$ -rqr[lqr[lqr[lqr[lr`!!rrrrrrrrrrrrrrrrrrm!!!!"!!$rrrrrrrrrrrrrrrr -rr`$rp[Efp[Efp[Efp[Efp[ErrrElqr[lqr[lqr[lqr[lrrrfqrrMrq2rrrrrrrr -fqrrrp[[Mrq2rrrrrrrrrp[[rrrElrrrrrrrrrrrrrrElrrrfqq2rirrMrq2Mirr -fqrrrp[[Mrq2rirrMiq2rp[[rrrElrq2rrq2rirrMrrElrrrfqrrrrrrrrrrrrrr -fqrrrp[[fp[Efp[Efp[Efp[[rrr[lqr[lqr[lqr[lqr[lr`$rrrrrrrrrrrrrrrr -rr`!!!2rlp[[fqrElp[[fqrm!!2rlp[[fqrElp[[fqrErr`$rrrrrrrrrrrrrrrr -rrrm!!!%!!!!!rrrrrrrrrrrrr`!!!!!!!2mV+bXV+bXV+rrr!!!!!!$r+bXV+bX -V+b[rqrm!!2rrrrrrrrrrrrrrrrrrrrmV+bXV+bXV+bXV+rmV+rrr+rVkq[Vkq[V -kq[cr+b[rrb[krrrrrrrrrrVmrbXVrrmVq[rriq2rirrkr2mV+rrr+rVrirrMirr -rq[cr+b[rrb[krrrrrrrrrrVmrbXVrrmVq[rrrrrrrrrkr2mV+rrr+rVkq[Vkq[V -kq[cr+b[rrb[mr2cmr2cmr2cmrbXVr`$rrrrrrrrrrrrrrbXV+rm!!!$r+bXV+bX -V+bXV+b[r!!!!rrrrrrrrrrrrrrrrr`!!!"SC9QPY)$8Z-b`J)%eKBdp6)(*PE'9 -KFf8J-J!!!!`!+!!S!43"S`#!998!!!!L!!%!!!!!!-N")3$G!9X%!Np,!!!!!!! -8!#3!Y`&CL!*H-!!!!!,rr`!!!"B!!!!!!!!!E3!D!)%!9!3'3R9dG'pZ!!!!%J! -!!!!!!!!0!"F!,3!hS!)!J!!!!"`!!!!!!!!!$3"1!'B"CSJ,8h4KG'PM)&4PH(3 -!!!!!&3!S!#J"%!'R!!!"!!%!!!!!!!#!!!!!!"8!43"-!'S!G`!&!3!"!!!!!!! -!J3!!!!!9!*8!J!%P!1`!"3%!!3!!!!!!!))!!!!!&3!Z!#B!D3"d!!8"!!%!!!! -!!!#$!!!!!"8!13!m!-B"Z3!!!3!"!!!!!!!!K!!!!!%!!!'!!!!#3!!IrDri)!2 -3"#!"m!)3!rJ'#!rm#JJ(q"3)$r!S#!IJ8!J2`+!)"i&`'!m"q#J'!raB$![qZ!! -ArlJ),rpB!&rq+!$rr"J"2rJ)!6r`#!2rq!J')L3)!c!##"jc0!JZCQ3)IQCN#,c --b!6-6-3$Kr-i!!2!!!!"J!!!!B!!!!2!!"rrlrJrrrrm2rrrrKrrrri2rrrq$rr -rr!rrrrJ2rrr`$rrri!rrrr!Irrri2rrrr(rrrrlrrrrrrrrrrhrrrrirrrrm(rr -rq!rrrr!2rrri$rrrr!rrrri2rrrm$rrrr!rrrr`2rrri"mrrr!1(mcJ!!m!!!!' -!!!!!!J!!!!!!!!!!$r!!!!!!!!!!!!!!!!!!!2L2!!!!!!!!!!!2rrrrrrq*Q2$ -rrrrrm!!!m!!!!!!!qCQ2!!!!!!m!!2$-c-c-c-qCR`c-c-c-m!!2c-c-c-cIQCR -mc-c-cI!!!2h-c-cGqCQCRpc-c0h`!!$`c-c-hjQCQI$-c-hI!!!!m-c-c0qCQCm -!c-cGm!!!!2$-c-cIQCR`$-c0h`!!!!$`c-c-hjQI!-c-hI!!!!!!m-c-c0qCm!c --cGp[!!!!$r$-c-cIR`$-c0hjP[!!!2M`c-c-hr!-c-hIQCP[!!q*m-c-c0m!c-c -GqCQCP[$iQI$-c-c3$-c0hjQCQCP[q*R`c-c-d-c-hIQCQCQCE`q*m-c-c0c-cGq -CQCQCP[!!q2$-c-c-c2rjQCQCQ@m!!!r`c-c-c-r-qCQCQCE`!!!!m-c-c-c2c2Q -CQCP[!!!!!2$-c-c-hrqIrjrrrr!!!!$`c-c-cIc-r-cmc2c2!!!!m-c-c0hrc2r --c-c-c2!!!2$-c-hIr-rrc'E-rmm!!!$`c-cGqIc2r-Emcrc2!!!!m-c0hjRmcrc -2r-rmc`!!!2$-hIqIc2r-rmcrc2!!!!!2cGm!rmc2c2r-rmc2!!!!!2r`!!rrp[m -!r`$rm!!!!!!!!!!!pQm!!!!!!!!!!!!!!!!!!!r`!!!!!!!!!!!!!%!q[%(#3-- -KaL1-)4`L2Q!ri2jKI#(+)N%R95p9'P8"UMqmIrjrrcrq2r`rr(rqrrrrrRrm2ri -rrcrr2rmEr`'U!!!!J!$rrrM`rrm!$`!!$jm!!2!2c-c0rmc-h`$mc0qI$-h`!2c --hr$-h`!!r-cI$-hr!!Mmc0$-hjR`LIc-$-hjQCrjr-c-rjQCB!rmc-r2rjm!!2c --crr-r2!!r-cmcmc-c`$mcIr2cmr2!2cIRmr2cmm!$r$mcmr2c`!!!!r`m2$`!!! -%!!!!!!$rrrrrrrrrrrrrrrrrrrrrrrrr!!!!!!!!!!!!!!!!!2repIAepIAepIA -epIAepIAepIrr!!!!!!!!!!!!!!!!rrAepIAepIAepIAepIAepIAerb[r!!!!!!! -!!!!!!!$rpIAepIAepIAepIAepIAepIAr+b[r!!!!!!!!!!!!!2repIAepIAepIA -epIAepIAepImV+b[r!!!!!!!!!!!!rrAepIAepIAepIAepIAepIAerbXV+b[r!!! -!!!!!!!$rpIAepIAepIAepIAepIAepIArrrrrrrrr!!!!!!!!!2repIAepIAepIA -epIAepIAepIAepIAepIm!!!!!!!!!rrAepIAepIAepIAepIAepIAepIAepIAer`! -!!!!!!!$rpIAerrrrpIrrrrArrrrerrrerrrepIAr!!!!!!!!!2repIAepIAepIA -epIAepIAepIAepIAepIm!!!!!!!!!rrAepIAepIAepIAepIAepIAepIAepIAer`! -!!!!!!!$rpIAerrrrpIrrrrrerrrrrrArrrrepIAr!!!!!!!!!2repIAepIAepIA -epIAepIAepIAepIAepIm!!!!!!2rrrrrrpIrerrrrrrAepIAepIAepIAepIAer`! -!!!$r!!!!!!$rpIm!!!!!rrAerrArrrrerrrepIAr!!!!!2mVprFVprRrrb[hpb[ -krrAepIAepIAepIAepIm!!!!!!2rh+rIjrrAr!2FVq[repIAepIAepIAepIAer`! -!!!!!rb[hprVrr`$h+rVrpIAepIAepIAepIAepIAr!!!!!!$rprIhqIm!pb[krrr -epIAepIAepIAepIAepIm!!!!!!2mVpb[k!#[hq[repIAepIAepIAepIAepIAer`! -!!!!!rrFVp`$hprRrpIAepIAepIAepIAepIAepIAr!!!!!!$rprFVpb[rrrAepIA -epIAepIAepIAepIAepIm!!!!!!2mVprFVrb[rrrrerrAepIAepIAepIAepIAer`! -!!!!!rrFVprIrrrmVprmVrrAepIAepIAepIAepIAr!!!!!!$r+rIhrrFVrrFVprF -VrrAepIAepIAepIAepIm!!!!!!2rh+rVrrrIrprmVrrIrpIAepIAepIAepIAer`! -!!!!!rb[kr`$r+rmVrrIr+rrepIAepIAepIAepIAr!!!!!!!!rrrerb[hrrIr+rr -hrrAepIAepIAepIAepIm!!!!!!!!!rrAerrrerrArpIrepIAepIAepIAepIAer`! -!!!!!!!$rpIAepIAepIAepIAepIAepIAepIAepIAr!!!!!!!!!2rrrrrrrrrrrrr -rrrrrrrrrrrrrrrrrrrm!!!!!!!%!$rrq!!J!!`!)!!+!#!!#3!J!!L!)!!)3#!! -$q!J!!!J)!!!)#1lYL!J!!!J)!!!)#1plL!J!!!Jq[!!)38*GL%$$!!JK4J!))i` -!##%F!!JL-!!))#!!##$!!!JKG!!))FS!##*"!!JR93!),98!#"T9!!J*UJ!)#!! -!#!rrrrJ2rri!$rrr!!rrri!2rrr!$rrri!rrrr!2rrri$rrrq!rrrrJ2rrri$rr -rq!rrrrJ2rrri$rrrq$rrrrKrrrriIrrrq$rrrrJrrrri2rrrq$rrrrJrrrri2rr -rq$rrrrJrrrri2rrrq$rrrrJrrrri(rrrq!rrrrJ2rrri$rrrq!!!!J!!!2rrrrr -rrrrrrr!!!!!!!!$m$!`-$!`-$!cr!!!!!!!!m-$!`-$!`-$!r2!!!!!!!2`-$!` --$!`-$2c2!!!!!!$``-$!`-$!`-$mc2!!!!!!r!`-$!`-$!`-r-c2!!!!!2$!`-$ -!`-$!`2rrrr!!!!$m$!`-$!`-$!`-$!c`!!!!m-$!`-$!`-$!`-$!m!!!!2`-rrc -rr2rmr`rm$2!!!!$``-$!`-$!`-$!`-$`!!!!r!`-$!`-$!`-$!`-m!!!!2$!rr$ -rrmrrm2r``2!!!!$m$!`-$!`-$!`-$!c`!!$rrr$`rrr!`-$!`-$!m!!2!!!2$`! -!r!m2r`rm$2!!$mc-cIr-c0r!`-$!`-$`!!$mc0m2$-hm$!`-$!`-m!!!r-cIm-c -I`-$!`-$!`2!!!2c-h`c0r``-$!`-$!c`!!$mc0$-hm$!`-$!`-$!m!!!r-`-cI` --$!`-$!`-$2!!!2c-c2r!`-$!`-$!`-$`!!$mc-r2r`m-$!`-$!`-m!!!r-c2rmc -mm-$!`-$!`2!!!2c-r-r-c-m-$!`-$!c`!!$mcIr2cmr2`-$!`-$!m!!!r0m2cmr -2c``-$!`-$2!!!!r`r-r2cmr!`-$!`-$`!!!!r!rmr2cm$!`-$!`-m!!!!2$!`-$ -!`-$!`-$!`2!!!!$rrrrrrrrrrrrrrrr`!!!!!)!!rrrrrrm!!!$`!!!!$r!!!2! -!!!!2c`!!m!!!!!rrm!$`!!!!!!$`!2!2$r$r!2!!m!!!!!!!m!$r!2m2$`$`$mc -rc2!!!2!2c2r-m2m!m!r-r-m!!!$`$mr-m!m2!2!2c-m!!!!!m!r-m!!!!!$`$mm -!!!!!!2!!rrrrrrrrm!!!!%!rm#!B)"3J(L!#*E)J!M056)*-XNN#8P*%!NJ#8!) -rrMr`2rJrr$rq2rirrMrq2rjrrRrqIrjrrRrqIrjrrMrq!!!%!!!!!!!!!!!!!!! -!!!!!!2rr!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!$rZERr!!!!!!!!!!! -!!!!!!!!!!!$rrrrrrrrrrrrrrlRPjVRr!2rrrrrrrrrrr`!!!!!!r`!!!!!!!!! -!!!!!rqAQjERr!!!!!!!!!!!!r`!!!!$r!#[hpb[h+rIh+rFVrqAQjIm!+rIh+rF -VprFVr`!!!!$rprFVprIh+rIh+rVrjZAQjIrhpb[hprIh+rVr!!!!!!$rqIIh+rI -h+rVkrqAQjHEQjIrjprFVpb[kqIm!!!!!!2m!+rIh+rIhqIrPjZAQjHAr!2FVprF -Vq[Rr!!!!!!!!r`$h+rIhpb[krqEPjZAQr`!!prFVprVjr`!!!!!!!!$r!2Ihpb[ -hprRrjHEPj[m!!#[h+rIkqIm!!!!!!!!!!2m!+rIhpb[hq[rPjHEr!!$hpb[hq[R -r!!!!!!!!!!!!r`$hprFVprIjrqAQr`!!+rFVprVjrqrr!!!!!!!!!2rr!#[h+rI -h+rVrj[m!!2IhprIjq[rPjZrr!!!!!!$rZIm!pb[hprIhqIrr!!$h+rFVqIVrjZA -QjHrr!!!!rlRPr`$hpb[h+rIkr`!!+rIhprVjrqAPjZAQjHrr!2qjjHEr!#[hpb[ -hprN!!2Ihpb[kqIrQjHEPjZAQjHrrrlRQjIm!pb[hprFVqJ!Vpb[hq[RrjHEPjZA -QjHEQm2m!rlRQr`!VprIh+rIjprFVprVjrqAQjHEPjZAQjHrr!!!!rlRr!2Ih+rI -hprFVprIrrrrPjZAQjHEPjZA[r`!!!!!!rrm!pb[hpb[h+rIhrrFVrqEPjZAQjHE -Plrm!!!!!!!!!r`$hpb[hpb[hpb[r+rIrjHEPjZAQjHrr!!!!!!!!!!$r!#[hpb[ -hprFVq[rrrqArrrrPrrrrrrrr!!!!!!!!!2m!pb[hpb[hprVr+rFVrb[hprmVpb[ -r+rIr!!!!!!!!r`$hprFVprIjqIrrprIrrrFVprFVprIhpb[r!!!!!!$r!#[hprF -Vq[Vrrb[hrrrr+rI`lrFVrrmVr`!!!!!!!2m!pb[h+rVjrqArpb[rrb[hm2rh+rr -rprIr!!!!!!!!r`$hpb[kq[rPj[rhprrrprIrrb[hrrmVprm!!!!!!!$r!#[hq[R -rrqErpb[rrrFVrrmVprrr+rIr!!!!!!!!!!$rprRkr`!!rrmVprIr+rIrrrIhrrr -h+rIr!!!!!!!!!!$rrrm!!!!!rrrrrqrrr`!!rrm!!2rrr`!!!!!!!!!!!!!!!!! -!!!!!rqr`r`!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!rrm!!!!!!!!!!!! -!!!!!!!!!!!3!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! -!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!rrrrrrre!!$rrrrr!!!!!!!!!!! -!!!!!!!!!!!!!!2m!!!!!!2m!r`!!!!$r!!!!!!!!!!!!!!!!!!!!!!!!rb[hpb[ -hqIrr+rIh+rVr!!!!!!!!!!!!!!!!!!!!!!!!rrFVprRrpIm!pb[kr`!!!!!!!!! -!!!!!!!!!!!!!!!$r+rIhq[rr!2FVq[m!!!!!!!!!!!!!!!!!!!!!!!!!!2rhprI -jr`$h+rVr!!!!!!!!!!!!!!!!!!!!!!!!!!!!rb[h+rS!+rIkr`!!!!!!!!!!!!! -!!!!!!!!!!!!!!!$rpb[h!2IhqIm!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!2rhpb[ -h+rIrp3$r!2m!!2m!r`!!!!!!!2m!!!!!!!!!rb[hpb[hr`!!!2rrrrrrrrrrrrr -rrrrrr`!!!!!!!!$rpb[hprm!!!!!!!!!!!!!!2m!!!!!!!!!!!!!!!!!!2mVprI -r!!$rr`!!rrrrrrre!!$rrrrr!!!!!!!!!!!!rrFVr`!!!2m!!2m!!!!!!2m!!!! -!!!$r!!!!!!!!!!$r+rm!!!!!rrm!!!!!!!!!!!!!!2Ih+rVr!!!!!!!!!!$r!!! -!!!$r!!!!rrrr!!$rr`!!pb[kr`!!!!!!!!!!!!!!!!!!!2m!!2m!!!$rr`!!r`! -Vq[m!!!!!!!!!!!!!!!!!!!!!rrm!!2m!r`$r!!$r!2Vr!!!!!!!!!!!!!!!!!!! -!!!$r!!!!r`$rr`!!r`!!r`!!!!!!!!!!!!!!!!!!!!!!!2rrr`$r!2m!!2m!!2m -!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!2m!!!$r!!$rp3!!!!!!!!!!!!!!!!!!!!! -!!!!!!!!!r`!!r`!!!!!!!2rr!!$rr`!!!!!!!!!!!!!!!!!!!!$r!2m!!!!!!!$ -rprIrrrIhr`!!!!!!!!!!!!!!!!!!!!$r!!!!!!!!!2rhprrrprIr!!!!!!!!!!! -!!!!!!!!!!!!!!!!!!!!!rrIhrrIhr`!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!$ -rprrhprm!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!2rhprIr!!!!!!!!!!!!!!! -!!!!!!!!!!!!!!!!!!!!!rrIhr`!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!$ -rprm!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!$r!!!!!!!!!!!!!!!!!!! -!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!3!!!2rrrrrrZIm!rrrrr`!!!2m -!!!!!!2rPr`!!!!$r!!$r+rIh+rIjrrmVprFVq[m!!2rh+rIjrqAr!2FVq[m!!!$ -r+rIhq[rr!2FVq[m!!!!!rrIhprRr!2FVq[rr!!!!ZImVpb[k!#[hq[rPj[m!ZHA -rpb[h!2IhqIrPjZAPrrrQrrIh+rFVrrrPjZAQl`!!rrmVprFVrb[rrrrQr`!!!!$ -rpb[hprrrrb[hrb[r!!!!rb[hprrh+rrh+rIh+rm!!2rh+rVrrrIrprmVrrIr!!$ -r+rVrjImVrb[rprmVr`!!!2rr!2mVprrhrb[rprm!!!!!!!!!rrm!r`$r!2m!!!! -"!!!!rrrrrrrrrrrrr`!!!!!!!2repIAepIAepIrr!!!!!!$rpIAepIAepIAr+rm -!!!!!rrAepIAepIAerrrrr`!!!2repIAepIAepIAepIm!!!$rpIArpIrrpIrrpIA -r!!!!rrAepIAepIAepIAer`!!!2rrpIArrrArpIrepIm!!2rhprrrprIrpIAepIA -r!!$rprIrrrIhrrArrrAer`!!rrIhrrIhrrAepIAepIm!!2rhrrIhrrAerrArpIA -r!!$rprIhrrAepIAepIAer`!!rrIhrrAepIAepIAepIm!!2rhrrAepIAepIAepIA -r!!!!rrrrrrrrrrrrrrrrr`!!!!%#!!S!!!!!!"3"@J!S!E`%"%CTEQ3!!!!!!$! -"@3"%!EX%"e*PF'aKBf9M!!!!!!"0!9S!B3'm"!j5CA"XB@0P)#BJ4QPZC!!!!!! -!D3&D!(d"[!3,8Q9`E'&MC5""E'bQ!!!!!!"h!&)!L3#m"3Y*Cfj[FQ8J3f&cCAF -!!!!!!(J!a!#+!5i&"P*PCf9iF!!!!!!!M`"5!+%![!8,4@jdDA*P)&G[FQ4%!!! -!!!!8!&8!0J%l%!P&C'Pd)&4PH(5m!!!!!!"#!&8!C!%l%!P&C'Pd)&4PH(4D!!! -!!!!6!#d!)`"5L!9'D@jN1UB!!!!!!%3!&J"8!&+)#&*PF'aKBf8k!!!!&3"&!#) -!m!(Y!!3"!!%!!!!!!!#&!!!!!1J!!!!!!1J!!J!"#%GKFQCTC@aN!!!!!!!!!!! -!!!!!!!!!!!!!!,%1([G#4!!!!!![fJa3HA4SEfiJ-5ie,M%!!!!!!!!!!!!!!!! -!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!#rEX@T1)J" -h!&B"qJ'$rrrrr`!!!!!!!!!!!!!!!!!!!!!!!!!8T8aKEQGeB@GPFbp6Bh*TF(4 -TEQF!!3!%!!![fJ!#!#T(BA*QD@9XC$UP6'&ZCh9KCf9c,e0MFQP`G'PZCcT3HA4 -SEfiJ-5ie,M(rr`!!!!!!%&4&@&4dG(Kd!+J`-6Ja!!!!!!)!!!!!!!!!!!!!!!! -!!!!!!!$rrrrrm!!!!!!!!!!!!!!!m!!!!2m!!!!!!!!!!!!!!2$r!!$`m!!!!!! -!!!!!!!$Xrq!!rrm!!!!!!!!!!!!!c`r`!!!2!!!!!!!!!!!!!1rrrJ!!$q!!!!! -!!!!!!!$`!2m!!!rJ!!!!!!!!!!!2rJlrm!!2i!!!!!!!!!!!!-!!!!!!$1!!!!! -!!!!!!!$`-`!`!2rr`!!!!!!!!!!!m1-!-`$q$r!!!!!!!!!!!2!1-c-`rrr!!!! -!!!!!!!$`!!!c!2i2m!!!!!!!!!!!m!!!-!$q$r!!!!!!!!!!!2rrrmrmrrr!!!! -!!!!!!!!!$ZlZlXc-!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! -!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! -!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! -!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! -!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! -!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!%!!!!!!$rJ!!!J-!!!,#J!!#`m!!!@"!! -!2JB!!#-'!!"MKJ!!!!)!!#b2!!!XcB!!*qm!!#$0J!!JMB!!2fm!!!I`!!!!!!! -!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! -!!!!!!!!!!!!!!!!!2q!!!$r`!!!rq!!!2r`!!$rm!!!rrJ!!2ri!!(rq!!!rrJ! -!2rq!!$rrJ!!rri!!2rq!!$rrJ!!rri!!"rm!!!!!!!!!!!!!!!!!!!!!!!!!!!! -!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!3$rrm! -!J!"!!)!!3!#!!%!!J!"!!)!!3!#!!%!!J!"!!)!!3!#!!%!!J!"!!)!!3!#!!%! -!J!"!!)!!3!#!!%!!J!"!!2rr`!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! -!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!2rr`!$rrm!!rrr!!2rr`!$rrm! -!rrr!!2rr`!$rrm!!rrr!!2rr`!$rrm!!rrr!!2rr`!$rrm!!rrr!!2rr`!$rrm! -!rrr!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! -!!!!!!!!!!!!!!!!!!!!#!2rrrrrrrrrrr`!!!!!!!!$`!!!!!!!!!!m!!!!!!!! -!m!!!!!!!!!!2!!!!!!!!!2!!!!!!!!!!$`!!!!!!!!$`!!!!!!!!!!m!!!!!!!! -!m!!!!!!!!!!2!!!!!!!!!2!!!!!!!!!!$`!!!!!!!!$`!!!!!!!!!!m!!!!!!!! -!m!!!!!!!!!!2!!!!!!!!!2!!!!!!!!!!$`!!!!!!!!$`!!!!!!!!!!m!!!!!!!! -!m!!!!!!!!!!2!!!!!!!!!2!!!!!!!!!!$`!!!!!!!!$`!!!!!!!!!!m!!!!!!!! -!m!!!!!!!!!!2!!!!!!!!!2!!!!!!!!!!$`!!!!!!!!$`!!!!!!!!!!m!!!!!!!! -!rrrrrrrrrrrr!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! -!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! -!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! -!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! -!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! -!!!!#!!!!!!!!!!!!!!!!!!!!!!!!!+!!!!#J!!!!!!!!!!!!!!Skrrrk1[!!!!! -!!!!!!!#M-kc-Sc1Z!!!!!!!!!!!!#M-kbM-krJ!!!!!!!!!!!!qM-k-cS2i!!!! -!!!!!!!!2bM-c1X$q!!!!!!!!!!!!$mbM-cc!rJ!!!!!!!!!!!!r+-c-c`2i!!!! -!!!!!!!!2Sc1M-k$q!!!!!!!!!!!!#M-kbM-krJ!!!!!!!!!!!+-cV-bM-ki!!!! -!!!!!!!!+1Xc-bM-k!!!!!!!!!!!!$kc-c-bMVJ!!!!!!!!!!!!m!!!!!b[i!!!! -!!!!!!!!2rrrrrrrq!!!!!!!!!!!!!!$ZlZlZlJ!!!!!!!!!!!!!!!!!!!!!!!!! -!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! -!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! -!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! -!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! -!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!"!!!!!!!)#!! -!(ri!!$iq!!!IIJ!!(rS!!"Ib!!!6iJ!!&r)!!"rk!!!IIJ!!2Mi!!"`I!!!B$J! -!%!B!!"rq!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! -!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!J)!!!IrJ!!2rm!!"rr!!!Ir`! -!(rm!!"rr!!!Ir`!!(rm!!"rr!!!rr`!!(rm!!"rr!!!Ir`!!(rm!!!2r!!!!!!! -!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! -!!!!!!!!!!!!!!!)!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!2rrr -rrr!!!!!!!!!!!!!!$`!!!!$q!!!!!!!!!!!!!!m2rrrrrrrr!!!!!!!!!!!2!!$ -`!!!!$`!!!!!!!!!!$`rrm2rrr`rJ!!!!!!!!!!m!!2!!!!!2i!!!!!!!!!!2$rr -`rrrr$q!!!!!!!!!!$`!!m!!!!!rJ!!!!!!!!!!m2m2$rrrm2i!!!!!!!!!!2!!$ -`!!!!$q!!!!!!!!!!$rrrm2m!!!rJ!!!!!!!!!!$Zl[!!!!!2i!!!!!!!!!!!!!$ -rrrrrrq!!!!!!!!!!!!!!!1lZlZlJ!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! -!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! -!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! -!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! -!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! -!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!% -!!!!!!!!!!!"ri!!!3$!!!&rr!!"#!3!!A[f!!%)"J!"HrB!!3J'!!&VpJ!"#!B! -!IX'!!$i"J!!$ri!!!2q!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! -!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!(rJ!!"rm!! -!Irm!!(rr!!"rri!!Irq!!(rrJ!"rri!!Irq!!(rrJ!"rri!!2rq!!!2rJ!!!ri! -!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! -!!!!!!!!!!!!!!!!!!!!!!!!!!3!'q!!!#33!!!J#!!!*$3!!"[X!!"rrJ!!`H-! -!B(M!!0ai`!#FH-!!R(M!!-"i`!"JH-!!2rr!!"rr`!!!H!!!!(J!!!!i!!!!!!! -!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! -!!!!!!!Ei!!!2r!!!$ri!!!rr!!!'q`!!(rq!!$rr`!"rrm!!rrr!!2rr`!$rrm! -!rrr!!(rr`!!rrm!!(rr!!!"i!!!!H!!!!$J!!!!!!!!!!!!!!!!!!!!!!!!!!!! -!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!#!!!!$r$rrr! -!!!!!!!!!!!!!!2!2!!!2!!!!!!!!!!!!!!$`!!!!!2!!!!!!!!!!!!!!m!m!!2m -2!!!!!!!!!!!!!!r`rrr3r`!!!!!!!!!!!!%F`Frr`Fr3!!!!!!!!!!!G%4%Irp% -4r3!!!!!!!!!"d4%4(rr4%Id!!!!!!!!!(4cF%4rrd4(p!!!!!!!!!"%Gr4%Irp% -4r3!!!!!!!!$4(0`4(rr4%Id!!!!!!!!!ha%4%4rrd4(p!!!!!!!!!!ha%4%Irp% -4r3!!!!!!!!!!hrrrrrrIrrd!!!!!!!!!!!hGhGrrhGhG!!!!!!!!!!!!!!!2rp! -!!!!!!!!!!!!!!!!!$rr3!!!!!!!!!!!!!!!!!!$Gd!!!!!!!!!!!!!!!!!!!!!! -!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! -!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! -!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! -!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! -!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!%!!!!!!!!!!!!!!!!!!!!!!!!!!! -!!!!!!!!!!!!!!!!!!!$rrrrrrrrrrrm!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!2m -!!!!!!!!!rrm!!!!!!!!!!!!!!!!!!!!!!!!!!!!!r`$rr`!!!!$r!2m!!!!!!!! -!!!!!!!!!!!!!!!!!!!$j+rrrq3!!!2rrrrm!!!!!!!!!!!!!!!!!!!!!!!!!!#[ -r!2rr!!!!!!!!r`!!!!!!!!!!!!!!!!!!!!!!!!!!qIrrrrrj!!!!!!$rq3!!!!! -!!!!!!!!!!!!!!!!!!!$r!!!!rrm!!!!!!2rj!!!!!!!!!!!!!!!!!!!!!!!!rrr -j!2Rrrrm!!!!!rrN!!!!!!!!!!!!!!!!!!!!!!!!!+`!!!!!!!!!!!!!Vq3!!!!! -!!!!!!!!!!!!!!!!!!!$r!0MB!!$B!!!!rrrrrbX!!!!!!!!!!!!!!!!!!!!!!2m -!qGJ!!0MB!!$rr!$rr`!!!!!!!!!!!!!!!!!!!!!!r`!!qGMBf0MB!2rrrrmV!!! -!!!!!!!!!!!!!!!!!!!$r!!!!!!$Bf!!!rr`!rrm!!!!!!!!!!!!!!!!!!!!!!2m -!!!!!!0J!!!$rr!$rr`!!!!!!!!!!!!!!!!!!!!!!rrrrrrrr+rrr+rrrrrmV!!! -!!!!!!!!!!!!!!!!!!!!!!!$jqIRjqIRj+bXV+`!!!!!!!!!!!!!!!!!!!!!!!!! -!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! -!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! -!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! -!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! -!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! -!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! -!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! -!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! -!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! -!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!3 -!rrrrrrrrrrrrrrrrrrrrrrrr!!!!!!!!!!!!!!!!!!$r!!!!!!!!!!!!!!!!!!! -!!2m!!!!!!!!!!!!!!!!!!2m!!!!!!!!!!!!!!!!!!!!!r`!!!!!!!!!!!!!!!!! -!r`!!!!!!!!!!!!!!!!!!!!$r!!!!!!!!!!!!!!!!!!$r!!!!!!!!!!!!!!!!!!! -!!2m!!!!!!!!!!!!!!!!!!2m!!!!!!!!!!!!!!!!!!!!!r`!!!!!!!!!!!!!!!!! -!r`!!!!!!!!!!!!!!!!!!!!$r!!!!!!!!!!!!!!!!!!$r!!!!!!!!!!!!!!!!!!! -!!2m!!!!!!!!!!!!!!!!!!2m!!!!!!!!!!!!!!!!!!!!!r`!!!!!!!!!!!!!!!!! -!r`!!!!!!!!!!!!!!!!!!!!$r!!!!!!!!!!!!!!!!!!$r!!!!!!!!!!!!!!!!!!! -!!2m!!!!!!!!!!!!!!!!!!2m!!!!!!!!!!!!!!!!!!!!!r`!!!!!!!!!!!!!!!!! -!r`!!!!!!!!!!!!!!!!!!!!$r!!!!!!!!!!!!!!!!!!$r!!!!!!!!!!!!!!!!!!! -!!2m!!!!!!!!!!!!!!!!!!2m!!!!!!!!!!!!!!!!!!!!!r`!!!!!!!!!!!!!!!!! -!r`!!!!!!!!!!!!!!!!!!!!$r!!!!!!!!!!!!!!!!!!$r!!!!!!!!!!!!!!!!!!! -!!2m!!!!!!!!!!!!!!!!!!2rrrrrrrrrrrrrrrrrrrrrrr`!!!!!!!!!!!!!!!!! -!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! -!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! -!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! -!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! -!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! -!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! -!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! -!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! -!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! -!!!!!!!!!!!!!!!!!!!!!!!!!"!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! -!!!!!!!!!!!$F!!!!!!!!!0`!!!!!!!!!!!!!!!!!!!!!!!!!!!!!h#2Errrrrrr -E)pcr!!!!!!!!!!!!!!!!!!!!!!!!!0XM)b2E+bXVfb-M)p[j!!!!!!!!!!!!!!! -!!!!!!!!!!0`M)b2F+p`M)b2FrrN!!!!!!!!!!!!!!!!!!!!!!!!!rp`M)b2F)b- -Mh!$rq3!!!!!!!!!!!!!!!!!!!!!!!!$r+p`M)b-M)p`V!2rj!!!!!!!!!!!!!!! -!!!!!!!!!!2mV+p`M)b2E+bX!rrN!!!!!!!!!!!!!!!!!!!!!!!!!rb[F)b-M)b2 -E+`$rq3!!!!!!!!!!!!!!!!!!!!!!!!$rfb-M)p`M)b2F!2rj!!!!!!!!!!!!!!! -!!!!!!!!!!0XM)b2F+p`M)b2FrrN!!!!!!!!!!!!!!!!!!!!!!!$F)b-MfbXV+pX -M)b2Eq3!!!!!!!!!!!!!!!!!!!!!!!!$F)p`V+bXV+p`M)b2F!!!!!!!!!!!!!!! -!!!!!!!!!!2rF+bXV+bXV+p`MfrN!!!!!!!!!!!!!!!!!!!!!!!!!r`!!!!!!!!! -!+p[rq3!!!!!!!!!!!!!!!!!!!!!!!!$rrrrrrrrrrrrrrrrj!!!!!!!!!!!!!!! -!!!!!!!!!!!!!!2RjqIRjqIRjqIN!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! -!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! -!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! -!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! -!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! -!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! -!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! -!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! -!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! -!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! -!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!%!!!!!!!!!!! -!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! -!!!!!!!!!!!!!rrrrrrrrrrrrr`!!!!!!!!!!!!!!!!!!!!!!!!!!!!$r!!!!!!! -!!!$rq3!!!!!!!!!!!!!!!!!!!!!!!!!!!2m!rrrrrrrrrrrrrrrrr`!!!!!!!!! -!!!!!!!!!!!!!r`!!!!$r!!!!!!!!!!$r!!!!!!!!!!!!!!!!!!!!!!$r!2rrrrm -!rrrrrrrr!2rj!!!!!!!!!!!!!!!!!!!!!2m!!!!!r`!!!!!!!!!!rrN!!!!!!!! -!!!!!!!!!!!!!r`$rrrrr!2rrrrrrr`$rq3!!!!!!!!!!!!!!!!!!!!$r!!!!!2m -!!!!!!!!!!2rj!!!!!!!!!!!!!!!!!!!!!2m!rrm!r`$rrrrrrrm!rrN!!!!!!!! -!!!!!!!!!!!!!r`!!!!$r!!!!!!!!!!$rq3!!!!!!!!!!!!!!!!!!!!$rrrrrrrm -!rrm!!!!!!2rj!!!!!!!!!!!!!!!!!!!!!!$jqIRjr`!!!!!!!!!!rrN!!!!!!!! -!!!!!!!!!!!!!!!!!!!$rrrrrrrrrrrrrq3!!!!!!!!!!!!!!!!!!!!!!!!!!!!! -!qIRjqIRjqIRj!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! -!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! -!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! -!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! -!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! -!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! -!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! -!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! -!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! -!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! -!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! -!!!!!!!!!!!!!!!3!!!!!!!$rr`$rrrrrr`!!!!!!!!!!!!!!!!!!!!!!!!!!!!! -!r`!!r`!!!!!!r`!!!!!!!!!!!!!!!!!!!!!!!!!!!!$r!!!!!!!!!!!!r`!!!!! -!!!!!!!!!!!!!!!!!!!!!!2m!!2m!!!!!rrm!r`!!!!!!!!!!!!!!!!!!!!!!!!! -!!2rr!2rrrrrj!2rr!!!!!!!!!!!!!!!!!!!!!!!!!!%"+bX"+rrrrbX"+rqI!!! -!!!!!!!!!!!!!!!!!!!!"q38&"38&rrrrq38&"Irj!!!!!!!!!!!!!!!!!!!!!IN -&"38&"3Arrrrj"38&rrN!!!!!!!!!!!!!!!!!!!(j"5[j+`8&"IrrrrN&"3Arq3! -!!!!!!!!!!!!!!!!!!38&qIrj"38&rrrrq38&"Irj!!!!!!!!!!!!!!!!!!$j"38 -Vq5X&"3Arrrrj"38&rrN!!!!!!!!!!!!!!!!!!2Rr"38&"38&"IrrrrN&"3Arq3! -!!!!!!!!!!!!!!!!!!2Rr"38&"38&rrrrq38&"Irj!!!!!!!!!!!!!!!!!!!!!2R -rrrrrrrrrrrrjrrrrrrN!!!!!!!!!!!!!!!!!!!!!!2RjqIRjqIrrrrRjqIRjq3! -!!!!!!!!!!!!!!!!!!!!!!!!!!!!!rrrrq3!!!!!!!!!!!!!!!!!!!!!!!!!!!!! -!!!!!!!$rrrrj!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!$jqIN!!!!!!!! -!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! -!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! -!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! -!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! -!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! -!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! -!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! -!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! -!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! -!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!J!!!!!!!!!!!!!!!!!!!!! -!!!!2!!!2i!!!!!!!!!!!!!!!$q!!$q!!!!!!!!!!!!!!!!$`!2i!!!!!!!!!!!! -!!!!!rJ$q!!!!!!!!!!!!!!!!!!m2i!!!!!!!!!!!!!!!!!!2lq!!!!!!!!!!!!! -!!!!!!2i!!!!!!!!!!!!!!!!!!!rri!!!!!!!!!!!!!!!!!lq!2i!!!!!!!!!!!! -!!!$rrJ$rm!!!!!!!!!!!!!!2l[i!rJm!!!!!!!!!!!!!$`$q!2i2i!!!!!!!!!! -!!!m!rJ$q$q!!!!!!!!!!!!!!rqi!$ri!!!!!!!!!!!!!!1i!!!lJ!!!!!!!!!!! -!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! -!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! -!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! -!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! -!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! -!!!!!!!!!!!!!!!!!!!!!!!!!!3!!!!!!""!!!!33!!!#)!!!!L!!!!&!!!!"3!! -!!)!!!!(!!!!#)!!!$MJ!!")N!!!5*!!!%L3!!!`B!!!!!!!!!!!!!!!!!!!!!!! -!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! -!!!!!!!!!!!!%'!!!"KJ!!!)`!!!$-!!!!@!!!!(J!!!!`!!!!H!!!!F`!!!21!! -!(c`!!"mq!!!I2J!!$a`!!!`B!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! -!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!"!!!!!!!!!!! -!!2q!!!#"J!!!JB!!!i'!!!1"J!"rcB!!Iqf!!(rKJ!"r`B!!!i'!!!1"J!!!Ki! -!!*q!!!$rJ!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! -!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!ri!!!2q!!!$rJ!!$ri! -!!rq!!(rrJ!"rri!!Irq!!(rrJ!!$ri!!!rq!!!$rJ!!!ri!!!2q!!!!!!!!!!!! -!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! -!!!!!!!!!!!!!!!)!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! -!rrrrrr!!!!!!!!!!!!!!!2!!!!r`!!!!!!!!!!!!!!$`!!!2m!!!!!!!!!!!!!$ -rm!!!$r!!!!!!!!!!!!!!mr!!!!r`!!!!!!!!!!rrrr-r!2m2m!!!!!!!!!!2-c- -c-r$r$r!!!!!!!!!!$c-c-c2`!!r`!!!!!!!!!!rrrr-r!!!2m!!!!!!!!!!!!!$ -cm!!!$r!!!!!!!!!!!!!!rr!!!!r`!!!!!!!!!!!!!!$`!!rrm!!!!!!!!!!!!!! -!m!rrrr!!!!!!!!!!!!!!!2rrrrr`!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! -!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! -!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! -!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! -!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! -!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!) -!!!!!!!!!!!!!!!!!!!!!!!rrrrrr!!!!!!!!!!!!!!!2!!!!$r!!!!!!!!!!!!! -!$`!!!!r2!!!!!!!!!!!!!!m!!!!2rr!!!!!!!!!!!!!2!!!!!!$`!!!!!!!!!!! -!$`!!!!rrm!!!!!!!!!!!!!m!!!$mc-m!!!!!!!!!!!!2!!!2`!c-m!!!!!!!!!! -!$`!!$m$-c2!!!!!!!!!!!!m!!!r-c-c`!!!!!!!!!!!2!!!2c-$-m!!!!!!!!!! -!$`!!!2c-cm!!!!!!!!!!!!m!!!!2rrcr!!!!!!!!!!!2!!!!!!$`rr!!!!!!!!! -!$rrrrrrrm!r`!!!!!!!!!!!!hGhGhGd!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! -!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! -!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! -!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! -!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! -!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!%!!!!!!(r!!!"!B!! -!3&!!!%"i!!"!#!!!3(J!!%#%!!""!J!!33)!!%%#!!""!J!!3)3!!%"l!!"!#i! -!IrQ!!!US!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! -!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!Im!!!(rJ!!"rm!!!IrJ!!(ri!!"rq!! -!Ir`!!(rq!!"rrJ!!Iri!!(rq!!"rrJ!!Irm!!(rlJ!"rqB!!$r`!!!!!!!!!!!! -!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! -!!!!!!!!!"!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!r`! -!!!!!rrN!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!$rq3!!!!$rq3!!!!!!!!!!!!! -!!!!!!!!!!!!!!!!!!!$r!!!!rrN!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!2r -j!!$rq3!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!2m!rrN!!!!!!!!!!!!!!!! -!!!!!!!!!!!!!!!!!!!!!rrRrq3!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! -!rrN!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!2rrrrN!!!!!!!!!!!!!!!! -!!!!!!!!!!!!!!!!!!2Rrq3!!rrN!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!$rrrr -j!!$rrrm!!!!!!!!!!!!!!!!!!!!!!!!!!!!!rrRjrrN!!2rj!2m!!!!!!!!!!!! -!!!!!!!!!!!!!!!$r!!$rq3!!rrN!rrN!!!!!!!!!!!!!!!!!!!!!!!!!!2m!!2r -j!!$rq3$rq3!!!!!!!!!!!!!!!!!!!!!!!!!!!2rrqIN!!!$rrrN!!!!!!!!!!!! -!!!!!!!!!!!!!!!!!qIN!!!!!!2Rj!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! -!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! -!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! -!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! -!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! -!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! -!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! -!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! -!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! -!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! -!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! -!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!%!!!!!!!!!!!!!!!!!!!!!!!!!!! -!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! -!!!!!!2rrrrrrrrrrr`!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!r`!!!!!!!2rr!!! -!!!!!!!!!!!!!!!!!!!!!!!!!!!$r!!!!!!!!rrm!!!!!!!!!!!!!!!!!!!!!!!! -!!!$rrrm!!!!!!!$rr`!!!!!!!!!!!!!!!!!!!!!!!!!!!2rBr`!!!!!!!2rr!!! -!!!!!!!!!!!!!!!!!!2rrrrrrrpMBr`!!rrm!rrm!!!!!!!!!!!!!!!!!!!!!rpM -Bf0MBf0MBr`$rr`$rr`!!!!!!!!!!!!!!!!!!!!$rf0MBf0MBf0Mr!!!!!2rr!!! -!!!!!!!!!!!!!!!!!!2rrrrrrrpMBr`!!!!!!rrm!!!!!!!!!!!!!!!!!!!!!!!! -!!!$rf2m!!!!!!!$rr`!!!!!!!!!!!!!!!!!!!!!!!!!!!2rrr`!!!!!!!2rr!!! -!!!!!!!!!!!!!!!!!!!!!!!!!!!$r!!!!!2rrrrm!!!!!!!!!!!!!!!!!!!!!!!! -!!!!!!2m!!2rrrrrrr`!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!rrrrrrrrrrrr!!! -!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! -!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! -!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! -!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! -!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! -!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! -!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! -!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! -!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! -!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! -!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!3 -!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!rrrrrrrrrrrr!!!!!!! -!!!!!!!!!!!!!!!!!!!!!!!$r!!!!!!!!!2rr!!!!!!!!!!!!!!!!!!!!!!!!!!! -!!2m!!!!!!!!!rb[r!!!!!!!!!!!!!!!!!!!!!!!!!!!!r`!!!!!!!!$rrrrr!!! -!!!!!!!!!!!!!!!!!!!!!!!$r!!!!!!!!!!!!!2m!!!!!!!!!!!!!!!!!!!!!!!! -!!2m!!!!!!!!!rrrrr`!!!!!!!!!!!!!!!!!!!!!!!!!!r`!!!!!!!2mVprFVr`! -!!!!!!!!!!!!!!!!!!!!!!!$r!!!!!!$r+`!!prFVr`!!!!!!!!!!!!!!!!!!!!! -!!2m!!!!!!2rh!2FVprIr!!!!!!!!!!!!!!!!!!!!!!!!r`!!!!!!rrIh+rIh+rm -!!!!!!!!!!!!!!!!!!!!!!!$r!!!!!!$rpb[h!#[hr`!!!!!!!!!!!!!!!!!!!!! -!!2m!!!!!!!$rprIhprmV!!!!!!!!!!!!!!!!!!!!!!!!r`!!!!!!!!$rrrrr+rr -r!!!!!!!!!!!!!!!!!!!!!!$r!!!!!!!!!!!!!2m!rrrr!!!!!!!!!!!!!!!!!!! -!!2rrrrrrrrrrrrrrr`!!rrm!!!!!!!!!!!!!!!!!!!!!!!!!q[RkqIVjq[Rkq3! -!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! -!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! -!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! -!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! -!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! -!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! -!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! -!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! -!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! -!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! -!!!!!!!!!!!!!!!!!!!!!!!!!!3!!!(B,!!"e#`!!"*m,65PN"2i!!!!F"&S!$8* -14%`!!!"b4P*&4J!#!(jTBf`d!!d!SQPME$J!$J&+5801)`!0!IjTBh-M!!8#TQP -MFc3!"3,ZD@0c1!!&!cC@58dK!!!$IN&-8P3!!!1+4%P86!!&!jC%6%p(!!8$hQ& -XDA-!!!3Q4e@h53!!"$)!J2rr!!!!!!!!!!!!J2rr!!!!-!!!!!!!JIrr!!!!1`! -!!!!!J[rr!!!!4J!!!!!%DIrr!!!!83!!!!!%D2rr!!!#93!!!!!!J2rr!!!%@3! -!!!!!JIrr!!!'A3!!!!!!J[rr!!!Ph!!!!!!!Jrrr!!!YX!!!!!!!KIrr!!!mU`! -!!!!!K[rr!!"!Y`!!!!!!Krrr!!"#Z`!!!!!!L2rr!!"&``!!!!!!LIrr!!"*c`Y -0*f3!L[rr!!"Ij`Y0*ZJ!Lrrr!!"Mm`Y0)q3!M2rr!!"Pp`Y0*c`%DIrr!!!)B3Y -0*q!%D2rr!!!-C3Y0*m!!J2rr!!!3D3Y0*m`!JIrr!!!8E3Y0*lJ!J[rr!!!`I!Y -0*mJ!Jrrr!!!SU!Y0*m3!K2rr!!!dJ!Y0*l`!KIrr!!",d`Y0)$!!KJ!d!!"2e`Y -0*l!!K`!V!!"6f`Y0*k`!L!!p!!"Ah`Y0*kJ!LIrr!!"Ei`Y0*k3!L[rr!!"Sr`Y -0(ZJ!Lrrr!!"Y!`Y0*d`!M2rr!!"a"`Y0(Z3%D2rr!!!BF3Y0#ZJ%DIrr!!!CG3Y -0+!J!J2rr!!!DH3Y0+"3!JIrr!!!EI3Y0+$`!J[rr!!!Nf!Y0+!`!Jrrr!!!XV!Y -0+"!!KIrr!!!qV`!!!!!!K[rr!!!rX`Y0+4J!Krrr!!"%[`Y0+"J!L2rr!!"(a`Y -0+!3!LIrr!!")b`Y0*hJ!L[rr!!"Kk`Y0*Z!!Lrrr!!"Ll`Y0)r3!M2rr!!"Rq`Y -0*#`%D2rr!!!FJ3Y0+#3%DIrr!!!Fa3Y0+#`!J2rr!!!G#3Y0+'3!JIrr!!!G63Y -0+#!!J[rr!!!Ri!Y-+X3!Jrrr!!!`1!Y0+$!%D2rr!!!GN3Y0)X3%DIrr!!!H&3Y -0(P`!J2rr!!!HQ3Y0*!3!JIrr!!!I(3Y0*`3!J[rr!!!S*!Y0(Q`!Jrrr!!![Y!Y -0(P!%D2rr!!!IS3Y0)P`%DIrr!!!JT3Y0)P!!J2rr!!!KU3Y0)Q!!JIrr!!!LV3Y -0(i!!J[rr!!!iK!Y0)P3!Jrrr!!!jL!Y0)Q3!!!!!!!!MX3!!!!!!J2rr!!!Mc`! -!!!!!J2rr!!!Mh`!!!!!!JIrr!!!N"3!!!!!!J[rr!!!N#`!!!!!!Jrrr!!!N*3! -!!!!!K2rr!!!N1`!!!!!!KIrr!!!kM!!!!!!!J2rr!!!N@`!!!!!!J3!2!!!NG!! -!!!!!JJ!8!!!NM3!!!!!!J`!F!!!NTJ!!!!!!K!!K!!!N[`!!!!!!K3!Q!!!lNJ! -!!!!!jIrr!!!lU`!!!!!S!Irr!!!mP`!!!!!16hGZCA)JFQ9cEh9bBf8%6@&TEJG -#GA4dEfjc"%PMEfi%9'9iG!4'D@jN#(4LAf0XEh0P#(4LAf*XB@jV"h4LAf0[F(R -VL!: - diff --git a/src/os_mac_rsrc/app.icns b/src/os_mac_rsrc/app.icns deleted file mode 100644 index 14426113f428df324cd526c65cf281038631135f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 47086 zcmeIbcU)9iwl=&g5{s%LCk4qlm=mHH+KhIKIfpjqoKKOXB2ml^< zBjHL${V5|Hr80sr%5b_9j-3d)Bg0N4-C?j3MR-aj!A>+DjKzaOq9izj+hw>RoV{D0 z(3A9sCCLz>`Y^g zyLY0|AXav3Z&&XSLKUE6>vo9SIxeYpy4?UO+BbAN?D@F%&Fp@c$JtVKxuqw;9uIW6 zAJxLK);;QK(sS(3oaqbE2_Od!uJ9N_^qL3}|478`?f-OWZ~uk?+^HUfb$W*|2^S=AKm`V{I~C- zotQtXom?l;=$kR<7pl)FD10>G1O!B~9hBXTP{!bF42eL0rB@@AarlhFXFNV5@tJ_n z2z(~uGaR2u_>|%E96lL*p2sJuEK{a{6&F1$S?e3{y=TKT9Ieq5L>Emj#aR|f6IA?K0g=a`$fuf@$ zBV-yG8j|qnnAo`3n8<(tl_(8JbZmTlLVO&7Y^Y3mBsM;QNrVJcvgN{BF-h!UEa9BS z9YT_r1gnMXTtW^;5$;L)oPelL@?oQn?~fq7lQGm1@~MTxy+T4FWv7qqk`ex~$dkue zPV5BbP*=eR)!Efe z2NDQZNY-A)Q*v02|G$^$>Lt6_QH8G=RanD@f9*z^J)NKJU$$FAqk7wLxxL-Gx2vT6 z1unO@TXnyIJ*)E{d#BDT>XY<_{;v0RgQ_UKQczv)m4NzkZ`b>|Y@?QB`^#SVt0c(^ zRrejVEqZ;LK4Qb^^D-K1m~P6NvlBVKnq6I=tHp%lt?Pp7+)9|LK5kekW+lY&(M@4B zeVT3@o!3{=v#J|(URRxDZy37k{qfhnuB)0_*L4f3qx{(6c(D~R!GEf9?4OE&`ahNA zDwR;XobNc`xK1|dIAC|SAEMsG&Io!?3xDdLgn0cg;c`FZ{)6y&{=58neT#E|1F>*;-4i zZAE#4Gx~l1oNj%nLO!ICb611v+Y;kef#y-ufKl%`qk^Nzy9j=SFgT&`RXg? zmE`3YUp#$KK4Bcu)FxhNttLEkM(g)q?zK-)Rk`aP9X*%KmPFT>lZlnK=w%V zv^g=MNhyl*-alMUkRZrm$3&DoPY3 z6_qu$b+t9MwaPomXFeFNZzKbC?~rrfe)IC#gXYGj#=6@2x~Ar)2KJ_^>Z+Qm>dLCB zy6VcZl9Ga~m_s2Ki08C#zkd1rQBy;GT~$RzRb^#)Rk>18Qd(A8Lis5xD=I7Ul22`2 zW@#7>>gK^{vL{WIIL-dzwlYPLEMHb2&d)0-$S*1?DJ#iIV|K5!P9`2xAm)dy^;P9% z#foBuLSB$BR}>e>OBBWO;u2*=O?9>McI=*IA<{@eqR>Pzx$S;yV`V8WD@x1Cm{O6V zxU@{EEGsRmR4U8MnNmYJ9?Z{@?F^e~noMjb-D^Oh6~#sJViZGJQYR16mfMRuZMOj%%c`5jm;9o)R-GbYfB6lpB z>?2Ah#uHD}*H%Cl71dRhRpHfEmF1P?)#cT-wRQD1$`bkQbBC5p@Ec~rj{tQ?!PtW! zs8qE*RaTDpL8(EpJonMHFfn3O-)tBx08=7A0H6l zV8UmqTM7h$JMR{iR6tEC(V!?bs!&nEl$(~8mq9QJFv`CYvwfDYud5`LxH!)~cp@_S z@|~i>y!^a;l%Tw#yiAEomnsUbCmmTn!QX$l3B%H61RjCAi>vGEYEZ!P@)EQY2$qyo zlqw3Tz7*Wey^(tM<5@nSoKBpboEFAhx~nL!tSE;zR+cNPDymTI#=5GaYvG%w_&b=G z@Kl6l0=Kba50#=xDwHT|S#hBp3Yb@@C@sfx5;qU`}?~~Gl_kytC!zhG%;k0 z#!yyND$AhVmDLq@&h1;km~gltN_8Y$V9A?w_Fg?Yh!R>g(z%N>Q4;!hDb^Dq!;U z3$MrQT{=<3>dNBlal7XE`MFE35&Owc zK6!AzxxTKULF>N4v}3ELn()|?ofEnW1pFn9Up;?VUtXdpDlSCt%P)XP(8H_Bi*heU z@0jcB>n6EQ_>=B8*OoH{X8C!z2Zbx5a=CNv(5mUQRU-xGg)Rbq*u5WKKY!4ugb^r% zmB0t3s!%G6^RFiCp63Texk2oLK7IP+ep6LBidXw&@MtFcs8ZjxKXcFMEQ9yixe-9djx zXHb@wm&&il>{&TWOm+6WP%K#5`m1kWJZY$gkyF_O2^tf|ytptsD}3u5Uq2VgZDJer z^if+wC2U=OUT*H~+u3)n-^|Xt6|-MW2v%4ScJIe;zkJeCr9>a>Y-gjw+?!X^WLszZ z__~PifDp!)2Q3Y?l~9!$NU5f-uBtLW<@knq5?Z1pp|fB~)Az5QJ!nv({}dIM!dyY- zuvX>Ry&Qw8q2;oPAn5U<2W|CCji9QkvZe}_L0?&3B~L%Kajul%hl7x@VCnszzWeHF zTSILPY+boo1$r(OIt*3e&2#%h0|PvyIm9UF$)kG>)wIHLXga5;kSWkFycvIB)hw~f z7&!};KKRYg-+lS)K~sHgeNA0WZB-RII2x}o=XQF;wmCjNuHsxG4f^EK!{#dOfr_cn z%S$@6dX9t=N)TEImbU%;-K$Sq8qg$kv{DUKOulhm&W%)N%Pb%CJuWAQ*iZTV`O`=D z?zP=(X}RC_@X?b;_nVuVN;6JwoF}EE;)VKxu;w4Wes;fB$;j>K*hD)XdP)^KVeyUl zUC?h=375;`WE07h&z?SRt5X-bsGwNR6zdn>PCU43He0SZhkW?hdgJdiu%3mYS+cC@{|k8_*YPkIPvq*4jn3g4l& zvA(ehBSOWcGn*H(b&bI=xwP%qKfZd_)>Kzht}MpDNCz4^1XPq4-$_0Y8aUEZ%H`<^ z;j4n=Eg}i}%%8Clw3Gq=~3GJvXOg_3+)e_M{e@gQEubw_=f?T?cM)kGjx6kcg z7=SWz(b)|2P*C{FH;H)i!w0QRHA;+g;9Xj-WXcQ_#Wx{FRlTENb;6pzN1N1DmQY&* zL!u}vrGqD|MegOO9q5#36WBXF1ARS~>UA=VJL!H~Ykh^hNM4|_*sP7oPCBG+ok)YkU0KqbK zqWb!#rsjsSOQ+RJ6hRBz^5Zuz9^b1~LWN)&%Ah`QFBHWk1$WZJx6Sp16`_=60zD%G zJ$5Q^nK;0u4u1CRNn1lrO(oSg7!Ejr#l<(`_O6)8_L*=>`rfa;fBCc(!hnldTvk$6 zCNG3kiVO2^T!1;CDn&_02=t8Aq_c=4Nb@E?e$>_sIn!Yu;}j}fsw~etcVsP9*GK_F zX}A9B`!7Fjf&GLpR$hvGachx0|8CCB%-in6?vqibm+MhYy1LRgKTzkBhttr>Pn(?ezXqJsRK8!2Z$ro$sEk|=?JP^g)z zq!TBWx*qE;mP0+DpYT&*aNsDEUShT^fG$S~^!dx$e*W?GXKjs4tqs}(BV8>V94Km8 zK~6^GjyXQw&a70T1hUS#Qz~($)CGD5lOI29t^;|ETULsGP?3A?@H(p3kpfqKSnH2p zfAOTH2Hq{)S{P31HNmkc!}t=j1LKQI0iy&Fo#Zb-S5)MU;f^-dD41e1g&Z1Adyi6C zQJ8vi!va%kc3k803%OZQY32VB96GJS%{#60y>u5udk_rGeI3$+7lFI zcT<>yyGJm5Hx?P-WaykbNsXYR7Ef4ml-tvWOvsE8}wo2AJB5 z1cFJeE%lXn23jI#6h@ev6c)&DCow0FxytzFAGQ4W?Tb%Z>Z>bYbujvtQoo)lG?wRG zzi@ivOm8nIbxWTYazzFL8J}akR^x#j>Cxn3oe)8arit2BadL>{d-N7MR~c|`MGco;Tlmdytp(YNp z31kB14Ui3wl78~2wFzz(oPrum#VX-Q!>z8YZ)(1wcm~RC_Zu3kYwIu#tEx^Ow^b>7 zV0b^xh4s@q#DXXjez=?@GK+&6;71?`evVQ#QLBa73Y9FpRLn;(99K6qHDe;Lkh3!n zI*u(^*FYWlimLo^@c%Ronj%!u<#5iE85+7UZLN*aGfb}F_+xff4KJ%46Y|=|h6XSz zljqBe;NW6NO_+2UZH*~&VSa7r|?VgAF^0=Eqc~DDQ4=Zhmn| zS!E?;0;xbQlx0Qe{H7*2(v`~m-NQW`5h|l5pp#}Qv1MuUf)lSR_3oy+oW=hQwWxzysOl3K`d|}b; zt;5Ce?U*hV&SHx<`Qalvf|r%CGODVpYieq2LF}fh8%%vldBDwr?7MffZ=M`!3Wo_p zt+x0slgS*;JOI-KLi+Vbr4`xf|70{|KX1AnKU-XbQGV6m!|9o{EX;s6U?0^3XNFP$k? z*EclQRF>RIIuIJ*?|333re>dAyLdVIbB-8`H_1lNh>#Cu>?c;{Aj?%lkCLJVdl z#gq_JF}%D?<6Z9z2n_IXce1y)vo@0&>GSzQLy4KpoLGcg>YEzr359w_rj`*_1{P8S z0S~6tKoV)mGnY!l8N?2*9y&b@F<`KVai+83a&}a%D3>W`p&4$ETHn&th`1qs8)`Nf z2?hG*u2)*_-D|nm+IqjWD%3$@U?6rpfUxHM*8BHc&W}I@Nnh$y(9+!8gx{LwcEdBs zxGB${K5nhUd<&)uT#693D!5yKSmZzBR#2C@`=+P*;t91!Kun>(|#DUb7~)xv`F^ zv4IbXNX*6M%Qh8PBkZUw0m-VGEO#eq8rh0@PFrh3O+$S{w+Xd6ny6G3U0yPG`(=1( zX!M5ixKR=TUnm~A^-^ber4}PX6NXSY(U>W~V9K40u=c-Qf1p_&bb1!44nT=rJ;nGq}zLlkwm^jiI zAFNQdRw%IQ`dEi_G7=Na$F0;crrsN-FNmelkQ(#?zvyFkuf*?|?=xFo0jC6IygAKE z$nf>_tY_rIms7~(hJ_feb8}&5^6p|Tk9bozC#Nv?&T%JcIx(3DC%-&DHzzmy&h0z5 zZZUVlvUBr_)WIxeS;5VueG9!j)+rG;0_W1GK!}eoFmhT_i8&pOOcdr978Vp?I4Ok{ zD^VbTgm5n=rWjYyKiEih(ONq}IuX;RYC;GDI#75w`*t>SM}SUsx1fkoj4IB%nTFYx zpX-=J`0Y^0{M_Y^hF~R>2F7DbUs;7v38D?KmWbkFJf*&dLLXBSOwjzwqweYvH>$ zuUo%qZ_M?)e2lrprSd!RM|N!8w(EFG4qS3fy32~<$5>_{PK6LmOJ#{Fq_AAe8ODsD z=z2Vz>AN^D!<-c{=Yo7$0Hh}n8ac17uR)WRS68Gh@U*qGwDnn*rj7(D(?h*&tt{>R z*IZPG!SlDfnPrfGDbJpL`T(9>r`jTRjKfN0aqgu!_;P;kR)L8$VupBT;VLI1Mlez+ z9d)h&UJANP*;X%!zEEgj^FbDLn~sR`Jzf?-bLhFwxd@*S&S_b8sGT5#=uf2H29`7w zjNFCJph}A9IEB$O|8}};+iZk-q?Xf)uq1(iOLg`PsGh(?&niS-TLV2UFTXL(N?#@r zS%=(#*M{y|c4LN}kRc-d;d2V;a9mYUb}_^{lT5-qrLCb1(KJX#EA}YQ&$%4Cdp;)K zQvDGt*gyh;z7QQeI-${srG>e<+1X5vIpZ(I8J?lzGCK3dh*1zf+EPYDQkV5`O<*R9 z~72l-6TA5KqBTB)J2l7c7lNw2qghArI-O? zMJ9g(J;UXj1V*xse5tZvyQ>&{>?Wi)vhjp^#U^*tOyWQJaa&8RvfJ2Kn3r=oddECA zj3BTKmeT+gI>wFZR(g!UQO_zk7mF52D=OFaRXC$N}&U4Az=2OZAtNGc_v zk<%KCez0Zb^2h+G5H7Nz<5Kii8Wz4AH`*NaF?Zd7*=7lx)`G~f))$Ep*q|5DXf?WM z;UpRpQ54=nP-Kn|;*Th*Bp?Y94LDWu+?6V^Nk_(4AVdS~%TudpO*47q`OBkTbDwt{q^b4g@egnbDfB-r>;R`LN6d{aN z0ZqC(RV6jcsdr1*H5|o_sa7DlFzXwf_fM%JgswDSPlqO6_ZQ8~fL^P={9}%b)+FIx<9hv3PfnrR*`1(#u5Im(T zAf@NVTY-?`iLnX2y9xtNWo=_~eN}Px`Gcy;Ac`gs2PRiS zIZ@sGwNA#gZKR`;;q_o}YOdJgV#M%FxF#bLn&<*RbxrXOS1L4zvF9OH^ugl%wJxSv z#5d@ZCl4NAbwV9|ROH>sppj|>PYIat_*T=3t5`3mI%k%RO4Fvx>9hiZ%${LGXEZ$X z;GA++Ny_fbx2H1Gcbb`B&MHaC6G^=hAJxNVVNfi&IMZH6cvfzk8f7$Q zU7q#9uuH@WGn5ugC)fcBeeUkX2(Um!WW<>R{TY?fq#D^PVuQ`ut~oNPR<%x85k19> z$8bcVfcOgN159^LMDPf(7&baV!Q=~JxfRjVJT4K-peGMo5MjhRB^E6ecQ4VNf_0g2 z>f!S(rWR2L1tGfJW5HH>0)d{z>`Zaj8af4kD2WPVOdPVyrZEKeMDY(HwXO$6G>Df5-a=q&L1OgjtFF6RY}T5bQSc+ zFgO_OYOXwaqq`o5qwl=3ybMk|qH*%H9bQ10NSrrfm}5$X7<$vUc}TN}`9vD9py43M ztKcfEB>KA~igt8bX2ejiu(6jD^VD!ra_cEaVX)G?H3GS#m8*MGWB?7@NXx7g*qSQ_&?N znbZPt6x_I+7JGF4jDSE7X#!z5LQEEEEI@`8Kn8()Hb%f@I9U{(7%sR%#AD^RucpPG zIl6o8{IRqg$(XVsGJ&6Hfsn@i5ol>8qAllRPVU{fVnI+qV4$ZorQ@bZ+(efLIGp>$ z*nRG{74xQy@$vCSY&4BVPr`YKM{7a|4+wAg*cqe4y*bX9QApS+HNq4fA%@3LB}T+C zF}Xxc)E706{x>mHRfMg;pJ6);^$?`dGvxgRjbdUqf;Ym>g!5M-(?MxTd2`{}+0sK|{9#tPZ@6Bd|K5^`XG(gr+y9hyIOlLa!k}a4qz& zIGaNa&}JkAOd_O8i3F0^B2<3B_*e@e3%ST)~)UD2=sA)^@WSs z4d@e-5FH(#l$@HDf%*hwWTd60zZvLf)PO-h%;_@`F^T6>SXMS*m2&<~5I_jk3=jcy z;Lu4XDn98#Dy@@gMn>v|q(OxPS!lt5cJ4oVCL$IBOb4&PjP%rG@Omd~kP{~2y0Agp z_8vYJu9jbTrYkGI#CJvtIck=qw2?wnKHhccq%0^g9~vnScH z+8rBl>hOxUfg%mlh9b>d_|ft;DF2ZTm5$8xMo&#niipiS zg{|D6ZcE5RmJ!YpPEFoFAh45LA7H0tYc}mXaQtjk{J9IMD!Qg=sTU3m2>ayL2li>% z+AZj!vY13D2g8=viqahr6w0*^C=?{T_sD5>Kv0o&qh#L_7-i7`j9R&V+rFb`A|V9~ zo>aPGRtj$mlQLDqq$t^AXQEi!OR2iERQtzFIpydEO-WUtDJaAKW9WJ3Q_?eJAZyK% z)s3JMX(6b_jq%MUZhb(gK$ta1lrRIrMwDM`*2O;1Txwpi@rnC7AzdSTgLHM{bs;q?C$B&? zHNQZ1g>DQ_znOC_qYre~$_>=QM#RMJ834ko2e-70%ek6R0MJ+n5oFxSzjY;D1NRE; z3HM@0iqo>lT?0UT_2kE7XoVP(h?oW?vgNrqF2`#CU<-Q!z`%0vk(11}0YJcXaWu-* z3V0-t5H=7}oS%K|d{iHpFgT}s4rAj0=T52n4t##XG|ymKXO z&3<5Gx_CyZcot%ra&u@Du?gM5oXfhElbd@96Q8KAKr$C?AQ}9wCA}cY?6r_&x_HJ= zp1C=uU*PGA9ZR+sEmx5 z9JcEi6Pt7)Ju^eaw0F2!*zDfmW_F!$GhI9rGxgIiB*ikvc7;urk%>P3A8t8#G9o77 z0?V-v_*qC#_}Pf=@H1Tu6EY1_5@I4w9^CSwzfS~N<1;KMZ0lhrDmIzQ_1zF@z442S zVh(Q&3mWDVMJD^0`+u!G|mQtj&3{ z7+ivu?>}<%ZIN)}=PZJq=|f@{h=-5FZSvAR`v-!KbMA?b8#`;kl2seG_ueL{WC1u# zT(aZs0CQtz%w45yu~i#bb#st z`vcXDnf}4Tu+>|3_ewj9=zEEsH88tL1BcmxGK9Wq*TECLl=?E6>0$EbxVy14W-s_? z3!k_3@7gF!1x- zarWq{DV|d6fui(mdZ6^S+0EO$*<<|87Umw)>ehC@X8pK@85zgMpLz69y<^p=)mk9Ey8XeUrUb`!g7h-SIXOB{e`k>1?O9{C@7WV@x(i5; z*|{^hMGK^NY4wV&g8Ap+@b8?^-S$FqBvWW6a!FX#Q{~ z=$VW2)F8d?;>|$;>8;U#^kPEh?MEqJU2_N#*>xYJYe0Gjr*4;>a#*wM`Ws;MX7_^8^PXF*#^~iP znR@8xsqnZtOG?xjy_+A-JazKa=@ZjG%z0;!-b6pB8GYGWUKBHZ(UB8pBae^YT%-o+ zMbB7r>eT6zACKK!@{Sck82&V<*o>C9GJSuLkK|Up)Qv>61r}&7XJk9YK0i7k}WtO#{-4 zpZVeOQ{mD3#_s_5o(1W}%?vwr;_%URqt?9>NN?)mrPG2^G$6f?$8SD~adiEx3mTB# zo{3wJA3A(!VNmoNf%K+#1?gdCuxiX)xf-Mg8J#$dnDy)r^VJ}|TOZ9he&FE#y<=wO zz6(fiLTK2^j{!cP7O#eVb+HS_V3*}&wF`4Aic$Xfb_=BS+H#V z!r*i@NUvbW_^qeTM#k-)ov8uo9hkUw-|p=njTzq$NN;iPAU*eKa~3V#I4e}42I=K4 zn|126EIMIjm_iNG%UL>Y-_EUzCb@;=_5;#e)GJ6&;xy`mMJtyC?$m(vvOZdV`fNnZ z@k#sI)F8c^A1&IsC3L*2>+(K9dW(7k>6sZ=x=vWMDm3J>2Bmj?@y^o> zUViYB@R+cv@mgTL@x#R)Zw=OqB0?t3%Bgpx9=EpN_zTicyxSXLY(Z#ft{P?j~-#-+B1;o*@nafwN>XO8dRws6b{ z6StObV7?2)+QYOStS^;VdWu~pEWwKC+1RA> z$w`snC-#R;bP;<#(180giMf~9b<(l}Cu9+cDd(aiPaj@B*;VZIJ7VfBahtO4#M$WR z3o)^>Q|qU=Nxc7)2z|tE!TVzqn0R4g+<~cXVxRvaCO#%EbEA?|6H}9;=DL{p{DBzz zh+NiR$Vkh$u---F^G9OnW9$-@d@(u7#n|W1MBhh$Y(jd%SbZNr1bw(C6Hjt|01@;d z$B7Rhfb+#jO6cxZ#~jyq%{(I@y(sA zoy__FLxcjU)L1GNV2^KL$Tc+JBiR?1ug@i1eLnZk1o(1&E-;()2oOSggiMn3=ntx+ zNYzoR4!B-N>Mf)XrVmD|Zp9OCpL0u31JXmwk1BB-dEaMgs&XjsQ-YQ2` z2^kD%o>Uu}hqt8pdfY@}N9hkDCeK)d$pg?-k9!Vp-Rtw-5sPP~6N?Ax$;5~IX81d= z0pst4oD}j#Ik!9qjJV^Z649VS?6fm(r4gTZgw$E~0;x+Q4(|-0Gt&j2!}~~Y1eS9f zAXqMgn7;T?r{&ZBjMNZ$st)+K$`b>j5az%-#6 zn0Adg4G4Z_+XwvYDsg%vn3<^#nAsJSV<5?~Z2N$dT_#R%0UR^#0vx+UoCbsu>nkBv z7BLwR9;~liSQm-efUsYErNPQXyS!@#tPEoG*2%AgYE&1J+Pr<EtH7qNII1eDj6(^4-I_ovN)dgbM18rs69c{(q zaZsH;a8}90ovy<7lg^4D{|F~nC!|WKhE$zL`}Cj03JxL%@7?F<%3r0Y0Z*MnH|{@m z6}(H1kY*IK?E@s0gi`g7i-M!c(c^LN5TmY8C?jnsR3b{%Kl}--b$!5{5~!W( z7vn@dRy{r!dGq=JG{u8d|LLdVRiti0p?c3a1;mI>oRX0?PAO64Mqh_N+6Nvfmgsfj zkgR&cA)Qmvx=QSk9jy0UQZclO{U(x1RuQ{QCnZRHrOF&7?Fl7{X7#kcv{5N4YFWg9 zdfytDkd8c2QM4)hO%j!+B9}?CmFaOw9|)jGV$mD=$DkAalcA!Qj-<+%d=S!s?&+BW zDnivS`$+(GQAIEnA0Ws;PkM*$gsUXj4{+y_ied_;7y4WoeYLpv{7$5|{7!~isGKXv z=cLa|A$Z|09Odghn-fEv1^~FZMmSs{UQ_HNXA>d4foKdmK{WNmyAM4}OFcSprE zkf3*ixisQ^_csQv=yw2Dn#iPg!J;&iiSK|fX(1Ed9yD@~nD+$*vFi&8(n`j?EyCkI zpjZRQYb5Q7+-M_X-wu+&X(MCa3T?r8Km945heL;~L&1o5QT zWJA`yLL5HPfnew-wGf9RBZ>Hnr==J5t0r_fXhm!sb`r_e?Z z8yol2op6N|5351RDKy@cO9b6=3LRRtx=T)>%t6X2G}44aIHHkTvpSQr3=v#m-3WcO zJtKZwxp?Wc$U*{zcXGz=(t>iSCFY> zCv*twNGjyVN>ljmNrgBf|Bj?Wt5lK``A2K;3hNzNMHB_RYf>S?HJ{RvR49Zhoe9o# zBozuWXU~|ub5bGn&k>zTg)}{OwI-=hgi4Znj$!YFS3uts`FA80TA>zFV4Mc8ut6ip z@HfIMh`QnxSQ!NsYLW^~QAv$}9XW;8s5|M%^BTCqW@kENaQe+DWYarbA)G4J zR82;q?3q@qQdvyv$S5>jb>>|%3WcK{LdVX0LcylA)Ot=EH2H+COfzH8ylp# zp&3>J4##kW7CPZwa|xM6nHwN)5R?arg-m7UA~SPyv$snmlz@prd>=`Je%~EkfCc$3 z$$+rv-I4m|FB&8OU30&LkOf9e4o`@+b3=<^WSE5^R_5LDRaov=X}23SZj>Eep&#di zRd{iL7)g9gu`-vJ@dnQaiHXB99T9R~iy~e;do4hwmd3 zAmtO%_Om5;&+PeN-`=jTj|{LV0Zpy_z6!wBUd6t>-OvzUwm`qb;k^}rWiMcBPydOG zQ39dhy%nGv`}TG*O7Q*)(1U$@yHt$tNqA2Z(80dF-Bc_xdOrow$-ceaOfpCXfL-Z( zgVpI&y$&7hC;(Qc`rmZ-Q`K|Gdq{J8>)7addPNs|Rs#5%57rv7cj+L2Q zk+Dc5GU>kIoXA*YY-H4hsrG?|8FF5W>2o6d=-Ma=BSUSB3c%J~pl4_#GLcBl z%*-u%ZWxBm&7@Loj@|aHt&r8v!ou9b5BK;K*KsW_3$-O3aNKmt=L09t+hje{=d-U*)Yb{S?RHP%N9u>5KDt9rkE(68Jd z?d@!DA)x|b`J?)xL1)qz!O5dMN7$H&AOIDAp`p01+XwyH^oaqk!z{&yG(9NVpQmTs zmt7fj_U&`0j`no4mKy7+`1AFQ%?6)I9~47pjQ4f2H8a-3*TAFxd_9rbu0C!b>`P@I zeK5)2)!s~`;jb?;w;yaKeb74{HYX^+)!tmBudcto$jsigj|T?#Qq=meIg`8ahx~1w z{RWpyuhbH@uZ8^mTl_y+;lIC+l_*7?++olHBj z_v1B7=1d*q4eMh9@vFyQIslqj*t`0TA2e3F2!Z|9wPEw7jq`K0x0D!Z#(&lUKnqwo zc#PEb*kGMgvkw{X=QbSDr^CO>0b|`y*dROSKEL?>9m}C&KR;wbfV+dWsfd0ZdZz=( zrF{?rct;+6Jf3!R|JL3qW=|RI>1<~v?%wt+dzSx@ z)xW)c)AIQtV|`uhEu^~HQ~qMhp=y6L-lCZk1Ko#X+F>BzYiqu$_H6r$hfM#d@&u3Z zcDA)Z;|o;NE)8S#C-hHhHG6mwV8OhIytD?Uua+~Hnr5g_8#^<-CRZtv!(jahXRPC=GO0l zX(tO$cNeGOs6P5XU3P>3EQZ?i?_}QI?&%Kc+uK-B`-d-JgaE{5mhZ0sl)a<9jU{XU zG5*m4NZwxoz}^{s&r&u1QSV2nZ-fF^y`L2bE%p?$!TLXJ0nBZOcJisx02O;%T6-2T zqH;fJ0i;&L-L$Eq00Xi4F!v#iKY#uD_3N*`diCErF#fK^zy0ely7;8UA4*8$KX&hD5%izmEVnfisaJp0 zLQuuOT(nC$Wcz=5Imy9FY{2hme_Dq35dYIu=(jJh{v|c+(g5H;)bURZ`+t2W_i?c| zGZJbm0Odb4@!!Aw=?~cc__vN8@Yk=S0e~?x?#_Q`;@|)H?e|}Q_0?D3{>T4l>i?fF z*Lb7;J^2sG`p56TKRSQ*%o*o?^*1&DUw(Swk97!BqweiLB+hoCBOP# zHUEEnC-?VY^{<=$ga2@ij0WxV?>}aI5E3+T`Ro7li<;(te;w`X?r7b!{|yQM|N3VC z^vUB!@A>x6YWBbU=H*%+*Wnf-J=N;7#t5_PPlI0nUw*Ed88j}y=faPg@#h~u6#IMi zR6n}@GX(Pg+YhPJCXDo6_SJ7SE&AtgV${vwrTY&N|Nr`C=j1WIuE)R8h`;@}5Wl-) z5A!=T{QvcHdGL5Fx#s<#5&!@GP#oapI;==6IozK`?QDgMFa{}+w0|MKIm(cZ51Ydf|7Pv3v+r&IiW^S>IYAvu80Uu!J= zFMs;!e4v-3ZTt@%Xa4v@qOT6)$NE3L>)$2j)X@PjR^9U5?=+VFm%sk*tF`XKSHJvi z=b8U_wGzm`Zey>?|LT>0)~RC$cW)hF0kVGR(DnBAe|{V7IxPD2A3LA@*SC=_J;vU? z`DdIsvUmHY)k`~x^szUs_WQqgUjEDLNY`PCue8qm&sP!7wx->Dzdre=9Xq&d>)Pdu z=FaS-+w0!!;8)-OtMls5FBZ5CfA(7I%x_-Ir}gh{eQ5v31Y}s}qnbV7c6Mx988&}r z@Wct4bG?2pm^mfo<*QdOv3>dFix*#fzQ)JZUiR$s&%aP_pMSnuhwr7Tzn(4>Xxfqe z+cvCNJUe9Km_Wb&Ad;bTrcWB>@8cUVdfd3NqeqVn4Dj=Gw#Q2WwvKMzegSmz^Ys7* zM3??y0%q1D29$bu&(`(J7S5b9HqhJM)vfRO;rux>r;H2ma`<{QP~qy}dnM9c?Yl z%&dkvxqEuCn}@5TjZXOkg=}Wq&{eb-4(%O6%2=Ge^4 zOeH491_lO3CK6LK)rK>j$UnB`s(%!KMKOp0jEd@u+L#?5uV3-uoT=mdJsj;2s}~uI zB^EZrbcg9i1^WAXxjP}K4+bV;`nrtB7_ZCFw_ODEy&5AUW4h5Zcw4WF>&+GbnHHdc z0AY@uI_JaXYd3D$vU&Zgu+Uk-)^ zHE8^3KMyB+OZHt6K9|=KEACc+L19lrFamvJiG`h`tGD0C(W6I?3h?!Caj>zVFY8dW zVrQ(_tV;oCRM8R38Jd`GXJAcdJ$pL|`h2X$P!%8H>h9_3$u81ZnPHWHDlBr~XcwS! zy}-lG1?<^?x+bdGQ@eX(s(l^;;M3I*tOeK)cW`hRZf~Q0Q%Q~0)L8&GS7;txPUsA( zz8!ni4+T(Zn7O4TeVMHLn_4;w;Nt8w0tFoe_AtS;09X(*G&T`SBzRE`eZK3PYCQ_z z=;-J$%x-YlvjxC{j6e@Xz(%b|_c!&l3t(a04x?^wXKRgD+BzcIZz+70B0vH_f>CQl zH~PLLg2Y`Yb`}5`vn;KxZLF;=%?I)QS6TwfgKnyQZ5747rU09+PM`HcU3fRih@^jcFP;iK#|oibm|*JB6VO(k!52 zqY6x=N)bg-1QZdFj`ZHU^1gFt=)G;;zQ+U!cjkWo^PO_fIdgyWpIzVX-G`8)`>t>I z%|!@pcq`+r^0(^WYVP&FeqP_TZ}~EW=%>{XijKGyCc5k+zs*OSq~zqsQDIj@)5Ca3 zEjcwMB{4eWN>h3u7pbRbq^GAPMHx3WrH7M9J?rVytW1<}!T6Z%MG_HtD3?IYC%1jP z?MQ@*h_fmPojr@75{6JyLtHiW5;%mDk)a{3nmVo;bwpK7ovIqVrl^`a zt{NP5s+u8HnW~Yk+W)3r>sGaWD}ULI5KR^7HMCHV=k-%zz$2uuIE3Hfv+(h%w&Rx2 z*`1GDyeD^hy`^P-m*Y3P9KYB3`1!^z#~;A)^Y#K;dOGg#GWB{t$7?#i{t-fJLo%Nz zADJQVqFwv(1^T%NSJk2=1O>E&A-@(LA~THAxoIesNZ}+ud6JZrn3(YRF%hr*C@${d zg9owE_wU}h6&4cgFPHk?RSD%IUx=Y)WC}8vZ~BMsVEc&K79BfHYVy$M0iM$ zzg+C)=5gy29+KfAv$6!4D2wbj^!AOAAU~Opr;BUwi##O7HO!)AW)Ybr1k*D5C^#nO zZe+xb;6Puom-}V6P(23T1FR6_r5s2~|`yH0zCEfAO`e z7o9xs1Vd5Y5M=q3%tD!D25Jo>pUl7+CgA>vi+d1rKl0X%K)JV@v*YRTyVoJg3!+YR zjUu2g+QS|`h`x6_JjBn({nA-G_c$u-8iZLMCC&XDR!R9td$`*_oW(RM#FJV@qw>8!0q0z?Htlm|qeY>UDpW)6&))+k)H zhcWjeLVUfhoV7KJ%uz*K@X}lIpfNSBSGy#wogBj^dJ_#z_35hcQtRA#(Q%cBZb4 z?NKfeW#4Pmqlb`Tn6HkJab2mItboI1_1<|6~p}fn=INHj{hH#|t=bti;!Z<($~Y3PJ1sm`l9Q7X6CTAz-3pSrI$0TU+k>FHFG3J4H&>8@a!+)Qok+z# zNlJ`=7}-PSegx%Cz_Bp3K^^ae$vw{781XxW zUVu+yThWdG4ur(2MiaZaI0@$et^60s_c_tmBi408`cTjF( zeC)k&KQCuH6QlN6xc<&TtX-Z_=a?5DBsDqd@q@eJ{$7_H%!mVf_i_n>G`;8@^57}H zlpxXxB2VVi^YZeAd1NjvCx@U$!%LYk)NxH8KZv>+D7t*wl7D31o?SnD_ucnD?)v4o z{U<#msc=UKx9=Vbxh5w*jE;cLbUbNncyQm|JwN}vd(YnA_Z>KF$U7g5XPUDRiVDu; z^E#G0ITNn1)Rd(7n8;AMr?Z2lk>O#3{lva;`}ZF>bo4mMH?g=J1e56*2CT(^8%!Kz##zTpVpJggo;2QR3J*Lqmeg7n+z`Svv)6;-S+JD=0wuWPvTj zvvPBC%-()NWK7A#3Tdgy332yt1}IT5k&u?2k(u=rVp9?y#li(6cE57|tOIFB*b{af`%?}MXU{r0UCZO4Q&94W zLTd=kvtz#TwZ@9LMEXYqH^10@9&CA=%+uPIA!`;=*#l`jN zRe!k3p=6@Sy3n*h6XMx)j+W*GCSyg+lhjNiYg|TJGGrcg`)26%zyPklWxmzkB=U zjnI(b&`|D;aiO8X*8@RNEbbIbjM={*{w3t}#1D%+=e!EQr!y{wj z;$V7?j*7f}Gb}j3PoYICDKROYR+MjeDk&QFJ|SVDumK9a5q=|7Vyr)2mBnYzRC(_- zT#a`kZr+Nx0aXlxN`_vS@Hcw}L`26Ck2%l)uqA-)Pas@u(2-=Ruw+VczDa1*4S%T! zddb_%$44afliKfkeIfyh3%(DGye^l?Lr4=^ zR3XSOWt5bZmJ%fz#ku>=`bm5wQW*{;#B3iAyWRS;HL$A6)-wTq5{XPkNOeU%VzEr( z<#uN8T0IB1z`JpYu+%4jEbI*;!WF8frJRzYT+7d_>@SNXgiK8?m-+g7+V5GdH6GH!WYcxOoVw;C zl7N(7fXsRS$~k)Dm{grv@BVl>z*i>4mBm$dKXYi^!sUNhUk$h$pG<8kVMW7w3OQ76 zS~jJ$ApPOxT?eFMXg~bV&HTeTvl&bf6tL&BrhgM45#h!ai=|@EbBF%1aQPnL>1(0U zi79x3gA741Hd>)amJ7>tN(-}-?z$2|eo#JKh#u#Uy{$*d8L^q;{tOK9CFQex{R0E! zSB|e=wCrcz$t%8h;+~}8xgGCBu$)4TS5B1C%HfxGX>opLyx8n!0JOXmn#z^8VG)B# zLV^o43?gHKrO4FZc6D*DqZDGuO&law9qsCOEwD!7DD-Q^=W@ ztCy7)Wrthd3zk7`2~Vc;k&TNXGZ@ht2GNgi`T9UtKx!^$4BlI?Y!_*LQ4CtC8APU9 zo7$5Eg&3`}(yT(Oyu9GHMdS^C7`ZSc+y$GLQeC@Ph**UqesH(N8rlz!3xyrbb zge(j1nBBQ9_x1DjmCHT(RGmpSN8?a*!tDS&1(V*BE*frJJfFj2&=-sEJW6|-o0p3< zIqjMXNwaFAYGOr^i7_m^P-U4+>c-vlGNeebS-49g0tqQ8dr|5_Y+N*-%~WAC=&#>- zl97{NP>`RGHM8-36TFNn^en2iD$7snU^%fwDwWIKc~pAK*lduCzXeMKj7V5>oQ|wt zG>^?>vN);?#>$83PjlNPp?k2TveGp*rqz?GDjnIA&F+Qz;f|4tU5NK_*Qj7osI!z1 z&-c0J>2m7NcjwQ=qAa$WDwDD5QAP(@NEOQ}RCzUm>d94=PHYC`dL5P-m{guDS~HWUEgziwySjCwwQ! zrB`|XT)||i8{Ch-6DX6&2r)TC$lKNC=!eYx_u}saNn!qnZim)XbP=A8I4T?# ztl1u!IeFXymO@aW$F1Yl>elGf=nN){ts{&G@bZSKM=bVnJ^#<&BOl)l^@A=~6Nx;X zV2Z`Vh-3-b>P!ZMPTQ6CG_Rl#b{tGfP@%`K)2ywntE(>1M>LSsF^LF<{3H@NTtc#= z!LfJ4{AE(vVH5YOHrw8vujm;eTLT1XOtbiu%-n*)B9LTYNo5<>Ev%`^U4tM)9kaWk zu(tU7`O094yB-oK_4f7=U;H7^Pv-V|o0vM231TL(@yS_v1w;`7IXcKG+pktwr&&`~ z_H+&8H`ye@-v<^{LZ&U11_WIX4!#cCt3MnAWbnFkeeh350J`W>hcc=4)BF0^pQeS{s4{XzEu}G47c1QrC99al&su> z;*t`D9LiT@N3W}|7t~Fzg#?SzSEGq0w*z5;6G`QM{&Lb+0~Q${uU`mj^W878@H!)8 zYg2kAQL&GcGjj`zVWUt28A5`swdK`o*VWb6!M(xCvcl9=S{AS`@s+~7OG@byv54^D zc)6V1w0PzW7K4EW$14RNB&25L7M7HdrKp4`ro%97RWz0Jz7zrQm)3detum|Wob?zKSbi@;pGL3JtIG+X$34NRGxI`Af;qA*F;t zd!IkL<|q{5tzcc#H?%NRK&&YIl0iadQF$d6Er&d5C2g9#21b2-Lj$jV zbzQ}M({SHw*F3IXx$5E$`>tzFM>ov703x>2n9OPC#S*c%n;UG{MBbhruI}EjF%$Wi z3Lc~tmJ^h4Ic`;Du2m)tB(!N|j78*iP=Fry5=q6^E*x1u?=9Hoc<<&gS*vA`yxHb= z{%I){%Vj5aezn^{CXsmUb%{+WD6hhr%<^*B<|rjA%^TL#gQ6K;!bI>NtPEZ-UoV_v zAeG6z)-YLW2mNs?uvnY}GO65a$0;|ykyIvg-w_T;RuEONGa)M&SW_ukVbQR<9xDdG zWdqABtoY}S{$ruubZ1z1?5D9<(;PiKJZ+}37*ieLt=Q>r#DRafz^Fa5_uiw-;!186 z0zob8o-Qu|Zv zBk@?nV5t5k^6_!`xBHDV0;r0|&VZQY{EBJ;2oe>jRj-WK$Y^M2Y~(de22r!fFh5^E zm?|zCZd|CxVobY4$X>9U&SFi!>?`v-J)J?HdI<)o(~rUT4!XfOI=lC7Tt-nPQO&Pn zR9040D3dHRX(Su;K+pVk2)xtu@p6Pc;!8|AW35aU5O`3X#aavR9fOak(a|bGK0(4i zaqG@ccw5Llbw44yw2E8JtD=LRQm)jjaW!C;su+t~0X|+nuvcHV;I-Lsqy7lI?Ua6_ z4pqimm7N^KIR_XufbiA8(Iyhhf+Mi=iHx zdRZcp_}I*3O*;n@h^LJ%V}mnX>msLLV)nX06=cr8K1eI7tf}FH80w(4vY|Rw7$W!a zI14+?<-Z%-IxW??dd1Pv*?b!7g{v;-&R?{cYOul0_53+!>tAC&@^C$O?vmZ!hv`LC z1Z-=_Dn(Ybk|y)Ul?^qqf&l3yTLXA!v(NmryI=4uj+*+oaq4WAD*m6E`cBEtk3aeJ zv(LA?J^X#gm)o~(+wK~dUR24e;lbWeS-}#r$+U4w&Evh!R)_w*YSHWa%^kh2N5#jk zKzNBJSd*CyI$|6U2i=Z|y&n}F^B^hxY3gGlmiZtttGJ2}HAHPvye4{MW0Rm!ueSKq zhadiJ{^HjUo;c?d_An(o`!VRj91WWS24Wlw2#t(;0{6PdC#S-anUfB0cv3S9%Bzha zv(~&!nz)Ux)RjK9e`m$2FAVK3O2XqZV139-S_w*YI_NM35%(S>W#$zY=EEXhQeIwK zOcbySi_5EOYHI~G+%_rmrumJH^_6+acYNJ1UGngah|emnsIDq6OkIssCTdKeF-@c6 z64P^Fg5y@HSJ%{3S65Y4R#sKla6t!#EA>trl~^{-Ypf~FPPiKy6m%mhF}tJ+mQQLi zrY~MGnQ0N1kdl>OQdv`5N7fs`zDZEi-Zqv^dX4qfCD|$Q522{M(yF?K#)kSDypn4# zVOc&(NPSvRibMJJ!a6}MzXo+Ec6?)FU3FPeZgx&yad}N$1JS4jv6UqmE7{fwNof!X zRjw04p+>dbwnFJ8&CM1~{Ds>GF+{TGir2pRZw2W+stF5bVFs6zm+X7Ju zx0z@{&B7+Kk=+23JFq=|<9HlcT9}ucUsQ&}NQlD)(rap3M|g>GvlaCJxQ4o#s`Ap( zvI;1(o(GE#KCk^cFom;djnKbp4Uk$Dv@^7$5aa|+4%J%PpRpQJFqt;WRgt!+BBqjwaN3Z6%kVcy5Bv5kArC>t3wf=D9#|63bfu{#N}&K6Mt+Yy#);JDg|toTn&~eP7?{*?s-56(@436S)oT zr8+z(@rk@=^op%t6VK?@`c6DblizF%n$YWQ)j0E<{){@)T0e=Pvdn>+Ev(IV2K*P|Xbn5pW2xxAGQ-zc)t^LgN(BNj&lkFur!*iyPD!;MyIa+zkrROK$ zN#iD7+mooAY`I81D}(`x``e*~hhVU`(4M!Pe{Kn<;|mfM<9o+ho&KF}$$(qvX>bES z1)Xnsf-GA)f>>^bV9+3zm!U#YSh)AWO=G5}!0jI5i7MRK!@w{;o_I7V?jZnG%y2P@ zg*U#}I*?evxMUwZv{w+z&jcFF?Hi`z;O;1vz$lg+L$PBhb_~V#gmC}QpjZTCa~LR= z%sbH$jADvAKorXb6q^Tx5#<{NjUqJyEa4*9gae16wx3>f|c zK$a?;943=h&4YW^#^4o`=mEQ!|V^m4H3#pc3told-{s_1`me|WyL=_czHNET=8}_G>Gj4 zW$z3L%6fihcg@4e-u@I;JP@OVvJVCcWoNWQS>X;#7Z*o6dk2v8ayk5KcPbm*8acUYL{J(4-U-E>>13y$2T^yvb851bnP67!Nb{^J;T|*{d|yb zeiBp{+1n5!MQGJ2Li@swKMYN+L7HQ4^T)6-?Sytr`}#M(9yhj9j4W*+R~38P6Gyp2!M8Jez_)8Z-tn^m*W4P9FUXhA8zjZu)Dy-1`)A+& z0i9(_T?h6?!eO%9CBSmu+V+zH&%#EbDC7-*=u(uuBhlT^jp)Af722dGfo` z-K8IH*lgb?-8F@qyxLvSu0oQq=Ln6uz};6r`1a>*J7kev;4ZFzYO3O16o$LH6-DPw zI>OzzsU+Lnvy7FDX z@QSMQ;D#KkA*u!FP$@&e&kC@Uau zz>f|dwx+F+cQruXb)b4!0HU2B@5@Tj6DJ)m!&2Bm7PE7pyltvLc>{hr<>hK>-jVXY zzhn1r+&0R)KtXwzwu;)=+fgg*!GtcLSBYhfYq!)?2ko-+@;DQ8em+CNR*Ap-=5Dsegr!HM`ICdnc zH|YDz=Z8(LY;E`^9ii_x$6KMVmJ<4Q%$Db%ZezjUz22fP^joxj`PYQmNr5RwzjKx7 z_gGi-+d2qvvRsGpr>uqhHZFGRg#f=+Q%IBG zm%G|DCo41^0ps?Ig)=^%`-N#IEUev*g%_-O|MMUBx2CGoE;|r9oc`&{-RST{1s$HV zX2aI+{xDQFfo7}j03dPlrxYaC?GA|-t=+hF=kLdR(riV=EDW>TP;sqk{aOkY2laxA z7cKw$r|UO;{MoiIzYyA+ZvXnLueTlEw|43`!$ZaV<=fwrUB4b2=JwBRU&(HSgi1eO zw7{ti6>}9>7gKU2m#FE76d&5S>l1g16id(hD@d_jf25dbFzu5RZ~6BhKahhY#ay`E zOzVdf+rPcrV9OXJEK$6uZ&wV@dLL98T3RX-2eH{=ht}M>l z`jJrY0>z3c%*?Ad9xyA;`f}B!c2;aeMGlM=-{SSdip_@0i7}h*g%k5TK;pV#L1Hci zkUK(RdTBEtKQ`duXU+I81WZ-6si_%$02Px!zzNK$0ntGP)hG-OBphtJCV-?-Jps(P zwi7cp!>41eI#g`T&T({dbnKfO8#M?9#Emh&{_o?)R?m$)b7KZz)@IZH3UJH^$U8uA zY($~!PT<&@;=%Cogf{Gq!7+x(?ckVR-qNDL$^Q{@JQNGBQ3fLuECNJ2nWmPKLU|c5 zHYOg^!Bt7bX@U2bGVq4=WZ=!{*M-~Nz>C1Y3)pxl23{hIH-?PIkntEY{;xpB{2Z|G z4#mDp%ga06k=bJE`=9Xcns+R8K%jW&zTII_VxyrVVtPS-!RdT%$MC_qb{)X-OXL#S zM3%yGJ4n;6O+E(zF($-jZ?@WY2S|ub3vCsI*lxlLgS72h6w(U7xvP$yyDzL|Q_fu? zOA|YHDM;Lpa~Bm^DZRT)+U$kn(crziR)uB-v%$N|M2vCj9E2$EE_SL7-Mh;~G!_HF z59;FG9T+B7Y4z?BDLl%%i}jfB^(bsme4~?h_twz7yObb_RIsAzFul94(wIyhB{fLz z?$n+UvHm!Q0L`SmGk7}On{`)Hh!%V|I4sNq&n~Sm<1R;tRQ}Zu4~Fku=)<=&`gyBLm{~n%gefW zb6++_i&en0*taoPL2$9VS=scJrWF&q65Pc?Nb6u%bgMVBvnzK%=$47m?aM}Jw#tF7 z(Do%J>c^5xRI;inu?v6;2ABz5>FrVh;;3|R<<7yb+<9y|LJC(dtVysa0R~k1htoQM z+X-D=xl8znrP9@s%S232Ti&-NcOqDFCwH>szRW|fLa%lqw)5~*%mTd?efV*e#8wL& zxlFB2j@-pu#D)YFeq2tQAD2m@X?WE@E4$foJK$OY_V_w6(ZtSnToO%E>E_0r3)8YD zwPtjX>=Dy~AWgf?i^~8^`x*g?2fJe0xl93?(p9ksLW}iS+MRs3Zy*E%r`3n6qV(Z1 zg-A!K*9FbCd2knl2bWr|CU)}RzJnmWt{z;b3DQ=`_36Kb{-ZO|1f~CW8bxG3K;8Ve zFEY&#jmCtpuzSP3XADcLS;Irx6M8Y;sQurdl+iFHpY*U*saU_G+~A)&TY5Yic8&#Vfft-_vJ(@k%GI9$){0Zc+y(~yb* zCZW&@D#P^5PNO`tQ0pmYfrOsaf$Fz};M&sCU&{sMozF$@wqkEud= zW>-Q@_fwu(_+z-9Stgo7d1i5~DbFl?gXC~Lv+(7U*fVRO3V&eF>|yw$N6#z?9^C#t zvxrT3X1`WN?EREyR&~Ih+0G;sduA_Dp4sVWiqi;rX3ccaoWXf!C-vl+CDoW5c<0L@ z)uyyNX4^R^m~Sh)b5N~r95i-?37RlSqwJ)fjI!`9ZQu^s$vrw`1xRZ|%&|-jHFY$6 zbL{-(S{==?3gF4Fp;fmzhkJ3yR)RZr(t?ie*ufCbjFqeo?pPzhtR3C4u*8AKbBONP z{}l1Wwpbw~&hKQ4J%KS}f6mwwa7NG0SRQ~*KKv6jgT=HBbb?+JWxHhIZ}J7FaJ>rt zvSRou4}hIrLFcHOV+RU3doss@0hHf^H&zJz_kV{swj1NbuG7EH8_T0u~iAs+pDHdP#;bLG$uz&cS#r7K^!*jouM_H1ZXUE9lbXOQDE0on~v&E z8b$&%w#KwYZ*~vnF#Hr*k20hF()``X5CnuB_xdHc+v zCP1UBXwF)`X;8&=Kl$0Vp(X(3Pnf-Yb9c$XJ@aha3@x>xT!tf5e#=l3P?W!AaJB8} z>}T7D)B+<`e#_7j7`gI?mcR&>-}3Cs!FRz(mOqpPMzs7PBrvk&4?ckrE`QJojCA>f zO<=^!A7la}U;g0cfl(-bPzj7i`GZMdRLUPj0;5wtwHyy*C*DjyOU(3Wh} z%5P~JPy(Y@eoMm_xCQ!ob2^IUw=}GuF_FXSJAu(GzolaSG)+}zpKp#wwfvS_FX@cy zy9Y+M{D${tX>s~&fYB|#<-+_aeK)`;m!I;g?gZ7oZjX#|`3)=PPFCxy14g<0=Wi~U zqR#5$3K-?`Ti#tVU4#7>mcRa$nd9-tgL-?6cKtWLrmNZ43^3Z|zrXCSEq~MUS$}E$ zH~;nJPf+P&2^{VI-@JVG|LgL%{KfSjEB~(@e`D=G*8YFx{5v-O#>U^+`0M=*z-aG( z#;(7y>u>D(8@vAgs`vk6^Uv7)GdBN>%|B!FPtPqdw*SMQ{~CeMKlSvPD0psc{TW+- z#@3&)^{40A7u@O8=TFDxpI)ZVVLv@K|BlVSWApFW{5v-P_S^zv>(AK!f9(Cwu>C*1 z?o$T#`H#P}{1Nb9^;-QF{Q0B4*WVHFpY>jROaGt$8ovLokK$X_Eu8_Mf9rkyg>MQR zuK%#F;#=NaG_B9i|G~FEVgKdE?Ys6LK5j^i+{5tr;r+X|Z+t^fr_awnB8C5S&Bjl5 z?EL7e&E}ni%Y9nj2e8t|neJnsUFy6ccX}Q;o(Hjo6vl!qNq47ErMv zMamYsR7F7r6akUmd+$Z}d(Z3wOIvz!|LL<;Nn2Z11c@|q^YU_YP|5|9V|EuwL=>Sy0x_T5 z_VKnS5h^3jsvvasEJ}>_CK00&eulkgQEpNsY*u${qMUdVvCCnTDxsC-l89AN51Vi} zy}GK5M9ii}z#$N$uC}HMY@1stsHVn-`WlF$wH={0)Y{V0+*A*K+sQU|E49^l0*$O{ zM%}7r)U9epMjchtz*RFcf{5i+gC7YasHqXInnpQn!okSM2v`}VWVJ+|M6?PpyMrG0HH?56e)u)Ric|Az>z4a<2V z|KxQX$zR%z*#a{xx;qq@b{68jN>>GdnPXD|1;DL($^F^ec zo12r9nf5s8VO(saF!Y5$ON4TXJk8v!^wi{s@pmKLZr|BvfjGD%<4JO2e5`+9_HBK0 z#Ld^t%g#(oc@!V!Db0wUYKC|PP?DAYIPumcXu8`5rid&e3RMd70V^f;JRzlLL@hEw z{9<-dL0)#+eOFRS&%RwKKx8SWM6(#7>_k6HD@&J%MBT#jRdP2W_2|RhjEq&XQK3!#CRyHW7gI}83)Q(C@(ub zB}IT#8XD^B5tPCx8x8|ueojUj9NIu2S~zSIa5TLjCku+2U~hOhf+8-WmlozjQ8T>> zAuen)s>_Ru1c=j&ASNzi*40#1ltNf7v}OpDi&*vbb+uKMVA4u&X`vv921b2-Z4DT; z(y2h{O^uC21FgOej%uT|wh{=nz{u20G|})50phlia42daponM$^ma}g(MrHJqX}#Q z=_v<>Xk0{VhE3ub_bJ&f!)ifzzr26}gLsnw@t<*?60o1%+KP{s%C_lkZOxHrjPrq0 zq*hosf_#8ZF&6aB2nMpW>X{S_WN%NE$@4;;$_wOp=IklxhpyaEqjCc|ojV7`kRFh# zkRBQx>4DB&fO0mnKph#Pf{dZx5H40h4pt^eo+fN0z~xY^iq6_wnIbAzSk28%RI;cc zr&A{_kz&HALy@f&>Yg+j=qxVmnK&${&Pgjs(9Z19z~0QPtSnKl1Y)%yfr-)#A|a>x z&mh{fXFMu}sI>h*l|g^qh*B_w5v4Or{>z7yVdTReYURPiGcHYa(qx@UI+G?%oH$9H z4MSRw593wE$y-`|O{4n(%yr%N!^ZY*2lU=Ay+KnrqL2Mje}x13+AsC(I-t+}QqN8g zeeajP)^R{T`(b#Hefrtorlowpbm;*5|2e?^b@D3q<6pW?-c|kXXUH7%yPr9}AGg4N zefzBMd49>Z*LU>a3ck~sULPm^3i*E8)RpVk_4=$|ITh#EuKjq$xh(`YgrzhL1xX`N zfRu~KY~w6WCdwev)zY3kNlktHI3+omNYZ_jnE3F)gM_&Iv3G7ogoOtBi34L*!gP!20cA3jeIgo<`f$~eE1+C{@$JFsIZVgKcSbK$E|H#B*89obNM+ammJXa zc4SycfW*hs^;+ojTqMRd%%$bz5;-Io)3TK~j*pLxiH-~n_7{4&Uv>*O;3A=vhj?I} z!;#sNSwtoS*Oqv~>S(CRxVG{4@7{@yxDhD!c6Yrf3ZKJ8zF=xGfE8}ro8iI!zMfYv zUc3?Z92fb3l_glAY)&^Dv!)XIb=5KFe9JL z#1W?8{zy!G5Pv`BR%EcBx0{R8>8RKnVC4l?Cwf{D&=*~14GvnEh>X=z>grUTh_ zKPDA@PKg~P=!1BOQF!f~otdb< z)9xDB*~{%@T`*U6N>DkH^yp#yz34DM_Y3xB*IK)*T*1nrU#mwCA;JiMFBb>%Gg1Ys zt6=3=K<1-70y>=N>Tu%8^wiXpBphL6koRRra|fxS-4(Dq)wi8i>f_`jxUP%}_Pu)A z(vpy>D)_rBx1;6tcBuLIadKipY*dKI^{kZ@+0E_}*qsJ{ayt^vI~|-WX=$mCQywMU zyA>k7=4@@u=`w=uz6eIN!a{xlDm>BMb`oX#Bo!``@7)fSxSzA(bGwMY7s{L>tDdIXU<&D$oER4q9^iSw z&XnKH@;q4b;T|Esh+bG&WU6RQWNSm-f#1hT33sCcyj<)}jk|2&{5uD>_C?0sZJq;@ zjI`9`2eDCsUY8uri35B0atMMnyXYPEAP=8PVCf8&CyVJtMa6<5vXE9#Kv3E6LJp)l zu4(dvdpCo9FQ2yJ9oe^M*AL%)_x+E%e)(!-C1;Acihif$z!{d2o|+UN6Yl5f;%H@Tbl7k| zu}^dV{sV`O9w&LGmX||dFg*jtTreh}spZ;+3xlbxl2OCCQ; z9Md#1A~-yOsfD$TbI=wpIt{k`5>!l<*nvH(u%N(v-4h~vY7R!o%t%W~ynicH;&Iu@ z-p10*)YODys%BoG?Q7 zE9cKTlJDE1k>CcxEYi5;C^&i zpy;|A4Bw;+aZ%I7<-!I0*X81+2q}lMwJEhKSyo)^z+%6;b_Q)lLTW~KZcZ-5oSKwy zFFGP5K;-Ll-RruSx0koKr>BSeH8)q+YgexZ!dVWUi87l~vl4BvXVcYmv?nqdE8?GI zJHoPM~&BP+)+cL?ra__5v8M6fR}YEh9?dHV(IxC_&I?f`W

$PTU~{vt_EOnsp&+fHqO#V5AMg_z8M)F7790NA~nOqLvI8FpwQRbH$;ZTFQ=E4 zmvhS0N=u3ga1GMad1*xY3nu_iLygT=(ZGoJAHfm;#>s@Z*qGbV7%wb5^5$(aM&ow$ z&4}>O;2?joNFqZtFK3sPmZV$RoFyH!9UUC(;jjG(?hzISB-tt$QR7>SQ{0m@TU+i) zT}!TYXhd}E{rH5qdw1{Lih{*Oke^=%mTFnqUEYnfqz4blN192=DJe;baW{T@m8GuA zrJ#NbNq-d2xlfBv;5^Waj}6#u79155pO^^4bKJd{+czUZg92n&w2BJT^66#8MyFEa zVC@qY5e^HW@W`mhaFNLy6I59|_AHfmPQ%%FC;H~C=t!ty1XMEohKRS-D=0cHkw{j9 z27o02EPsOGWP^?*D+Lu(%Zp9J??ncReW91Uy?lIp#Q|c6U9U|d0CC~>!7(@dBz}Hk z5oCm~FZ83AhxHF@TztasK1{(2tHg&8CbXywkXOm5sHlWHa$4nu`_2Z4d_-aiHY9{> z9}oN8Z_Lrcs45?y2?`L2Boacb@9QHJN{)FvkHkSv`^HNsfusiAYI$Lr*@joH`_ljILPnH@r{d@{meai#s5y?lT19e4m1!noJizGY*`9uTnO$^{F8eT!FY@l`?{YwxM87zzM;iA->3&qvh&D%4S>V5 zA0Cs^WN5rvMomp^Ew@G$Ag$wXhJ*wYK`eiF&K4XXhdoEj@P1;1$j8gmN9cR~n)9Iz z3k+EFd3M*s;!<<+3kqRURqsU2Nbjg}ok=YTQI_5@zjMRSKfvGL&(D)b)tO|gX&s77 zxgCUuVA6Z?MWfA27O1fp^d-VOk23QLi{Qp9k+0T;DT6exC+a5El$n~q#0yoHNW^ZO zEiXcd1e=AsBs!Q7lalAfuEgfW3)oB*HiQ1!ohR7^#U&-h#TYXmGnRN7mEl>|>(o}C z*28c@kyz~K=gy_VTgGMsT+%I=A|NAS&T&4naq)aMlgUz3WiVDg%*re5f`snDkn&15 zG?>*-uB&xoPcgq69)LSWEOaH_#a*LZ(k}sz=!h zun;PSm7#JQ`1MojYMt2(i1h|cGcc|McnaRby`!snDE@IwXb|MJ*w@?bwBbARUjR^& zr492!H&mjKC2If~sA=~vv10a`u3Gpls{`<=yAPO_Y&(B{X@e_HUJMyoE zGR*1nnX7xOus+Gl?EuxRufv!c)6HW-0|E*EiGJd%+<&iNvNR0uC*28_h$MtiP3+@x zY||10Do&EEN6m(-9^qy!?&v9~zYNl(@x_Mvb8IG5N6++Duo%Wt7*em9e)~34<4}Am zOavmK*cZ3wfwvdRAh~Q^8Dvs+eql*TDRh5P5v+sqWQeFq(5Tg5%VIKB)!2F_H-kk` z^_jlj*KCh|z}$Z~=}w3k#((H`XiZrc;o(S4MU4e>wnt7u5vPPD1C-%$nz)Vn4R6rs z3?_@MCx{O6@`j;DDD=5@{@=gHB*%saK$olg`g%IU5R21@WC_?BOa_Ba+m)GDR8k5n z4kiUC!{aq+H#Rmk)t9`1XaK2a8XXGpi9~*I3Q3NJCd5VrO2m@GrtVj5x4*qW)-wXO z768(i=1J)}g(anB0Lj3R@-}Q*)KFKr20?^+=CR>0w*&_GOJIt-5f&`=_Vy88{2@3% z;`Ul6mU4&I>5=>uTjvX-B4GRw+7;yVj3Oj0~0DC(G`n>LT-eH z-hk!RA5KAjViW!6#( zri!5OXl12xxCXQ41x*dLl?B1PFp-;wmlsU-Fq%nV%ndyHtM!`h)%X;bX^~vWv>9s)%YD{6oPa;4$$c3^kfJuW4$mExlzCbHf)>#McY2 zyYV{0@!Mb+&Hap2S<6KsAveOWEYn;gj0g?$eMfbUQ%GQ--=E%v7@7mT z4rUis*1&W^#Yu+_l0(*$EvC)v#_D?((Kle>whRUb7_ohY-sg|5ISMYk-(WH|4PnUi zy6*1j4J`~65XziiGEB)StFFbM)etAGq7#$b!f0-8Y2h}nZmPL&7Uh5ay2sTkS6$s< z-F4mh=%)D>0K{%OlR5poP$cwrbAtt&ueYbiHFs}VnECpc@gHQCRudF(HEvaTtaYX> zB(!O5yk*P{K!6_i@)ZlOUpTUH{#&rj@!qY*WUZD!@a9|B|JzC|^pl*}`PFVmiAdzN z*EJ!%q`D4c0%r`%964mIMa!CIKs3iwm@oW+nZXOj>qT=7#S%ZSHB6TJ!9d&!ESA~< ziP+C;$0;|Su~;H;-w_2t)(~~DG9hai7*h^eW7)F086yV4X#>+N%=qVy{%euJ3>TPp z9Hz5a)15p#JZ-137}K2KQtb3M!r(t#A#2alWifiim07%rJ4!kOEE2E{QwUyg41whSXA_DvaV5qokw0V&Mi!uEYA$iVz z28%W0vcDwY^b7`l+9gO(=O07w9(02|I=eSEF}tjmsOQx&YHMq1*#r^0A%8ntl!j5Kmiu z#wHgy*L|ITiQnr6Rgk#+`XIBcwxNLsU`PRLWlMd6Ak5Fl<1DN+m;Y{J=lqi1)hkX; zE*8^S&s}vrcmAT~G{a49*Uq1FvH3OrLyv3c&Rw$K`!K7lj(}wiStpB%R?%kBy0WDq zfgdEkWM>FhHv242y9b2MR#Vr|)YM?JRPlf68aqWhKic-mr=NY{_VD)|Uw*ND`xn;| zv&w3@4P00o$}3nwwwbj~ZAjkhVtwd8s}{eu-@?i3#=WG36$nq!1ZxVDK}U=O!jRkX z3HR^C#Xm^R%F9S55||Gj=a$#;poXXuii@8-XydmUG?t(G;DdiGSn}Gz6X$#)9;WB# zCj%ag(Xc3BAjYwv@R-CWaIbqpS_Vv+1zB*xlaW(WU2hDLb;M=b#%X=IsWQ)D{fbqe z8#!DQMI~m#{7{s-5|HS0z+v*E?>xT3b9v59Op zhIJFap{s4I+6-Eo>nrlplOBSrqRP6ame!W$20WANE@fFgO3BD8sl=wdW2yl3Xm7V{(}b!w z!gDFmDorgdoYqN{W#Hbd% zm8C_6#bs64j08LEklxVHk>M34?bgu$nk`KYb=8%XRW;zVnG2H+KCbILFoUCLtqasRC(u2Rpt29y4{Q_R9ts+dex9 z7^YClQz*6XEakLxAvjW{CU7jYQKz>v&ujqKq)mVycj_#4er8RT8bdF27M_Pfb2tD#*6YgQBqw~@y$V#fnMRKzFL*^p6*(wwf377wzOlC$p-0>iusKUK1 z%$X%65sxM(J_Jq?)0miygloU+3S=ZOnWPd*uwO2cmji?(M>(H}jeE0^1ZE@2aW-@RAm#CrgOp zS%n2c+dv+W07K^`g}kU}&*RBmyks)wC4(?8d1)YCQnXJT86M$qC~=s)q-fU#f1#(p zFVFDdNO?)&kB(j*&W=~SuNfI8bmJxO42zfa{LcQmhqHsjDU5g^Ud~HC7$Pq@vx}D$ z?67imb+UJG1V}H}!@u?>Cgb`eChv6+lQTMq$=`oH?PPz_!NC#GF1sEd8aFwsZ*KA( zo{6coode;hZ|_J9ou8c5H$VB0pAYgZP6Fy;2U}vaNJVv^t z`_Yb{4LKGzIKLoX9(RaD=9a#Q%zu9R?H|xtcGP*`U@RCRow*d~%(u4xWXQF&l_3ha zgCI32qFIsD+|-NIT>s_n!^S7<@Y(7h;19%X;s;{zb3BU7=8B%o=0A7rIU=x@BlcuB zm##k8jok#=Y+!ctMa*ul-?8T?WIv9R*OTCU>4QyM9h4HBW^kWVwKnce@ds zayGJ);M`PO?e{gt>m)d35!wM<4}$aMjoZH3P1v0}_-9i81SbRTBsG}S&#tQt{9a(8 zNO3|R9TlA5^LkR8O91xg{iOYs%f}C<^rSd}iI!EJ3-_c@16jYWt~TgLJ4aJRniC>E zVoVzMq&b&j;6DiyYnSV;Mheg}o)buJ8M2J$4EoX0!_KUO=Ufdu=LSGM%m>hJJm-sY z&=V&eFT+%*0E_8kAUZoyf#?kS>6F(sGYdtc^W7c0f8%r#oeO0|=Sv-+whs2x40|x8 z2iGZQCQTaOYp4&|W$)#2hHs|Gb$;^YPF_#0QvsElX1%W-Km1q;;VIl}aqf!qNuH^U z@SH~xp5J|J)RXX}It<$N1dI!Wqq@VXOP3sv9SP}=_x$Cv!)DfYwmefs-t(K|9lWQG zocC0Wmg}ftYsuTa(NY=vS@y;9uL<*$d^5~`&XcpB$9l4#9Z7(LEtQd=FaArGSTan_Q#L01-<<2DoC_`Z{Dm)#j+u9Gq58eK&_!>5 z^dFqAGE^Omx^~XlekswHF(sP&*$dnE3;L%-4c>hJ%UzwAQ)HMYBqK=YuG#eQcYhekn?Sn*cMv>j+9woG zs^6O@UA%Vl$2)&N-WO&ETgt+GZYNvXXx6-zVoO8%VM`Y;|K}$gw|w;J_AfsdIGBC$ z^;chSKfG`4v~NbnmhzT=@s8xijnD|Ue{cUv5*ZdQ{%r9==T5eiBV#r(Q7peT-!K4K zdT8^mZSE9VDn1`5BTMZEB1?%DGo@tdd;j_42XcsHDF<%t(gq+)9oFqOeD4xPmb#Ce zEM14m()}O)vHv4KAWN-xe6rIHlcm@^VzSimt3!L=8x&bew3_un zmcG1c-7!p-e)zl5_ePj3{rJ~?@BcY6vUKVCZEsx#vh>u}qvXe~K$bdf{r$UFFAtY2 zoxk+mkN@olWGVU0F{ABaK$dbp`)2u@!zD|XOj*5|i^0ye_oq;d~jrG zeK)d{SUF?aRZNzi`ha}T1(T(Y%VvBqOtSR+hFPvxoSZM(d_b%Pj`YH%6VDqDmn;om zq`UARD_6hqGiT%4)vv!Yd&;jJWa+hTWGM$2&hBLC%e~0bhab)TaPNWRB;U;V@b|CH z5D0_&AWJI-PnJIZ=(+#df6Un2gxI}emeoke(zI>Qe}3H9od4$<{ZoS`OIP+ymS%lA z?>8Guiw(2Sb&#dN++p%=sB~%Wr!QNb`*zlaM3{MHbSVJ@YwsjU`F)V5m?Zt{$W!ZQwiMMm7UZcpu%ErjQ(W4EJhh=X(VpZfCRDq~ zQ+l;jDx*~Y683aBN>1Z!Mh-kFPGpgp>gnm!BkhU20dP9m2(PMeO?rsK5f{}Z$+uK<*s!%=b4ii%Dv@|KwS{3|4!7K%;> zMV1a)(@Q_?N7m} zEkFyu8yYpr1?eVDnSN6Z-jVh{18|}szgME()ac?wpQk~Dxh(#68mO6~1?z__ z+?>(}2Re7Q1)4uqxnxtWv5b@5Ld25I$$jvi1{R2^GAy;`rOCi5O;a>W<-l;*%t_T%JtUehnxG{rAYD_g&y=y4SmY{i z`dYJ^i9K1&B?1WRU{CteU{-f==Ah_HCZ;c6G)8k&4)i20UtppEl$k^=tF9J549)=^ z#KfKq=1Y8}rlKIuoQuVo^YI(7Wa3PilVDN;DoidT%~T*SC-xL)F6AMXN>61b6EOj8 zxpHOZBv58f>88wlk&9k|UhTnJ&c{PB3-DGbk!8wROC1nqGIhEMGna4>8v>NcGSxa| znM@K*$Fl}n*-MqFKw0v!)YF-XCUsY3l4!C@FHz<^7?!oEIYR-mPpT3CX}X<~Oa@Su zuM&WGuqRbHkI6?+nL)1D!0Tid>G#6d*l0UJrV*Q;N9+q?pun zHL05vb3KCadP*^wrbt%?r&NXs{YPh_iE5qG#V4$A^f^~-&7>6 zVGS4QPV7g2soJ5xWS&Iqeq@(yN_JWN2E4^{5+%Bv-k<1l9@7S?^((eyV6i2M=IAKb zS^|cOGL0pZ(pVCp=jhZ}PVUVsJ_j&bO0<;*a&0A=s7zbQutC}YG6?3dx295~i#dD& za3(QFqNP-kYbgOp9e@VG4azl?lY4W6^Atcj$Uw}nb(2o61(BmN=_DPoCrz0=Syz>Y zXd1dxbhY3GVS|!R)+muqvS~8uEvM8K)b03>5Z~#1jf4Lqp_)$fo_4u=h#&s;-ECsp8$)R+zY1%7ya1Z?1ZrV1sUTnRPZPe~`?hmlGr znP@5{oy4`Kq?7Op?~zC+;qBj8I%x>+=6nN7ClA99eM%=ukYWxjokVO(I{CFKV(+J< zld6N3PIhMlv2^khC7qmsraF(3bkbZ8%^jL_a&lkNNm8Au23Njnr25n@;ba#V2pY`V z-dvzgFD@`)g(;diM7`wXzVwoCl{R>xS|A z;TL4fpW*<4WuGF+S`bN2UZ^ON9181~y^^IMk~9XYQBfobQyfVBhAEQ#t5`p*jub%P zyl(2q6PRinNFaFvj_6w;$px~H2VZ_W=yp5FKEP|Ebb>7Ws}w*m+N^?qTLiq(0SLdI zWZ%#=lEy84(R`+@JvEZ2C|XbeeC6nCBr(l5a*d<~Mcwt(NcK(hVdZ2Gny+t-WOtfx z>@|}6sdqU46Tic`+lNMHveh)SCTMF<9Q;RHTYG|*rn)K{UWX!o@o+cL!Eey$ELANX zz3DUcXU`e*XZCD;{aG`o=}yv8S7Fje5&&E}sZP-C`<1x^l(vqGh}Ou)6^KYwN$dSqb_ecC~*oYq$Z> z=qlQ?mv0$_6J>`y-9Fp^!2iTK%eN{6AI!d|+h^*i59c%-CI8al1|akQ-eBse{FtX- z466l3&A)Vb0gRsi;RP^?{-sa99C{awrvKptFslBC5y0sBA9?_z?0?7sjJE%w1~BUW zhZw-<`ybjkFb4jI6u?;cA4&jY;(rJMjE#S4Iv&)bbd3BDI)JhA4*?8nNj7HwrEP-> zVC?)$TRz7vFu=v>82XpCY@9hsjio$*vGgykSukB&m8taNcuf6EZ@r+Wsk{fq)_==8 zvvt&zHo(~WmtI&fRe1x9vH$c}^e3t+yFD_-{##beo1(6)1IF0@vo{w`)nF+(1IF0D z^zEfHwAg>6|BWxtn$X8DiR-*QIM(&w{HngTvJqgc{lB~H@AbcB`Ru>7{#*Zk{}WY| zOo3zF|67;O`TyGgdw+BN$Nm4k`8VGFFh2g^=MP4KfA5E#A0L0m$KUbscYOTqG3<73j*q|NbS^l0{4l=$7+-&kuRq4uA0u99^aC)y{up0>47~mrvHqu@?2}3d z_x#7->VFjUSN&FBil0AH-u|PYKkMJUbl~T|My|h8;$FJprJ3;jTmS1ncw62`^@qyb zOW#~PUFq|G@CGETzuf%AuKkCP8xf=TF*<&D|E@1KziyzX^!Z05)1R){yluzM?|&H0 z&-XibY}>qMss2C@;8ObArLVuaVe^))Ti+Y4&(^J5Hg9fh)HT%D pgHVUlXz Date: Wed, 2 Feb 2022 16:20:26 +0000 Subject: [PATCH 20/28] patch 8.2.4285: Vim9: type of item in for loop not checked properly Problem: Vim9: type of item in for loop not checked properly. Solution: Adjust the type checking. (closes #9683) --- src/proto/vim9compile.pro | 1 + src/testdir/test_vim9_script.vim | 18 +++++++++++++++++- src/version.c | 2 ++ src/vim9cmds.c | 9 ++------- src/vim9compile.c | 2 +- 5 files changed, 23 insertions(+), 9 deletions(-) diff --git a/src/proto/vim9compile.pro b/src/proto/vim9compile.pro index cb95fdfb6b..b7f7539215 100644 --- a/src/proto/vim9compile.pro +++ b/src/proto/vim9compile.pro @@ -4,6 +4,7 @@ int arg_exists(char_u *name, size_t len, int *idxp, type_T **type, int *gen_load int script_is_vim9(void); int script_var_exists(char_u *name, size_t len, cctx_T *cctx); int check_defined(char_u *p, size_t len, cctx_T *cctx, int is_arg); +int need_type_where(type_T *actual, type_T *expected, int offset, where_T where, cctx_T *cctx, int silent, int actual_is_const); int need_type(type_T *actual, type_T *expected, int offset, int arg_idx, cctx_T *cctx, int silent, int actual_is_const); lvar_T *reserve_local(cctx_T *cctx, char_u *name, size_t len, int isConst, type_T *type); int get_script_item_idx(int sid, char_u *name, int check_writable, cctx_T *cctx); diff --git a/src/testdir/test_vim9_script.vim b/src/testdir/test_vim9_script.vim index a3f28f1e72..767abd4855 100644 --- a/src/testdir/test_vim9_script.vim +++ b/src/testdir/test_vim9_script.vim @@ -2011,7 +2011,7 @@ def Test_for_loop_fails() echo k v endfor END - v9.CheckDefExecAndScriptFailure(lines, 'E1012: Type mismatch; expected job but got string', 2) + v9.CheckDefExecAndScriptFailure(lines, ['E1013: Argument 1: type mismatch, expected job but got string', 'E1012: Type mismatch; expected job but got string'], 2) lines =<< trim END var i = 0 @@ -2036,6 +2036,22 @@ def Test_for_loop_fails() endfor END v9.CheckDefExecAndScriptFailure(lines, ['E461:', 'E1017:']) + + lines =<< trim END + var l: list> = [{a: 1, b: 'x'}] + for item: dict in l + echo item + endfor + END + v9.CheckDefExecAndScriptFailure(lines, 'E1012: Type mismatch; expected dict but got dict') + + lines =<< trim END + var l: list> = [{n: 1}] + for item: dict in l + item->extend({s: ''}) + endfor + END + v9.CheckDefExecAndScriptFailure(lines, 'E1013: Argument 2: type mismatch, expected dict but got dict') enddef def Test_for_loop_script_var() diff --git a/src/version.c b/src/version.c index 7417143c67..2c623671c7 100644 --- a/src/version.c +++ b/src/version.c @@ -746,6 +746,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ +/**/ + 4285, /**/ 4284, /**/ diff --git a/src/vim9cmds.c b/src/vim9cmds.c index 716a404111..90b61dbb34 100644 --- a/src/vim9cmds.c +++ b/src/vim9cmds.c @@ -990,11 +990,8 @@ compile_for(char_u *arg_start, cctx_T *cctx) if (lhs_type == &t_any) lhs_type = item_type; else if (item_type != &t_unknown - && (item_type == &t_any - ? need_type(item_type, lhs_type, - -1, 0, cctx, FALSE, FALSE) - : check_type(lhs_type, item_type, TRUE, where)) - == FAIL) + && need_type_where(item_type, lhs_type, -1, + where, cctx, FALSE, FALSE) == FAIL) goto failed; var_lvar = reserve_local(cctx, arg, varlen, TRUE, lhs_type); if (var_lvar == NULL) @@ -1003,8 +1000,6 @@ compile_for(char_u *arg_start, cctx_T *cctx) if (semicolon && idx == var_count - 1) var_lvar->lv_type = vartype; - else - var_lvar->lv_type = item_type; generate_STORE(cctx, ISN_STORE, var_lvar->lv_idx, NULL); } diff --git a/src/vim9compile.c b/src/vim9compile.c index 9ad1e7ddc9..9dbd1198dd 100644 --- a/src/vim9compile.c +++ b/src/vim9compile.c @@ -386,7 +386,7 @@ use_typecheck(type_T *actual, type_T *expected) * If "actual_is_const" is TRUE then the type won't change at runtime, do not * generate a TYPECHECK. */ - static int + int need_type_where( type_T *actual, type_T *expected, From 381692b6f1c2ec9b73a139500286ddc9347a1c01 Mon Sep 17 00:00:00 2001 From: Bram Moolenaar Date: Wed, 2 Feb 2022 20:01:27 +0000 Subject: [PATCH 21/28] patch 8.2.4286: Vim9: strict type checking after copy() and deepcopy() Problem: Vim9: strict type checking after copy() and deepcopy(). Solution: Allow type to change after making a copy. (closes #9644) --- src/dict.c | 12 +++--- src/eval.c | 8 +++- src/evalfunc.c | 35 +++++++++++++++-- src/evalvars.c | 19 +-------- src/list.c | 17 ++++---- src/proto/dict.pro | 2 +- src/proto/eval.pro | 2 +- src/proto/list.pro | 2 +- src/proto/vim9type.pro | 1 + src/testdir/test_vim9_assign.vim | 2 +- src/testdir/test_vim9_builtin.vim | 25 ++++++++++++ src/version.c | 2 + src/vim9execute.c | 19 ++------- src/vim9type.c | 65 +++++++++++++++++++++++++++++++ 14 files changed, 154 insertions(+), 57 deletions(-) diff --git a/src/dict.c b/src/dict.c index 9c6b7d4532..06f38716b5 100644 --- a/src/dict.c +++ b/src/dict.c @@ -284,11 +284,11 @@ dictitem_free(dictitem_T *item) /* * Make a copy of dict "d". Shallow if "deep" is FALSE. * The refcount of the new dict is set to 1. - * See item_copy() for "copyID". + * See item_copy() for "top" and "copyID". * Returns NULL when out of memory. */ dict_T * -dict_copy(dict_T *orig, int deep, int copyID) +dict_copy(dict_T *orig, int deep, int top, int copyID) { dict_T *copy; dictitem_T *di; @@ -306,6 +306,8 @@ dict_copy(dict_T *orig, int deep, int copyID) orig->dv_copyID = copyID; orig->dv_copydict = copy; } + copy->dv_type = alloc_type(top || deep ? &t_dict_any : orig->dv_type); + todo = (int)orig->dv_hashtab.ht_used; for (hi = orig->dv_hashtab.ht_array; todo > 0 && !got_int; ++hi) { @@ -318,8 +320,8 @@ dict_copy(dict_T *orig, int deep, int copyID) break; if (deep) { - if (item_copy(&HI2DI(hi)->di_tv, &di->di_tv, deep, - copyID) == FAIL) + if (item_copy(&HI2DI(hi)->di_tv, &di->di_tv, + deep, FALSE, copyID) == FAIL) { vim_free(di); break; @@ -1239,7 +1241,7 @@ dict_extend_func( { if (is_new) { - d1 = dict_copy(d1, FALSE, get_copyID()); + d1 = dict_copy(d1, FALSE, TRUE, get_copyID()); if (d1 == NULL) return; } diff --git a/src/eval.c b/src/eval.c index 076ba1fed3..b5ccc4bdfb 100644 --- a/src/eval.c +++ b/src/eval.c @@ -6160,6 +6160,7 @@ handle_subscript( /* * Make a copy of an item. * Lists and Dictionaries are also copied. A deep copy if "deep" is set. + * "top" is TRUE for the toplevel of copy(). * For deepcopy() "copyID" is zero for a full copy or the ID for when a * reference to an already copied list/dict can be used. * Returns FAIL or OK. @@ -6169,6 +6170,7 @@ item_copy( typval_T *from, typval_T *to, int deep, + int top, int copyID) { static int recurse = 0; @@ -6207,7 +6209,8 @@ item_copy( ++to->vval.v_list->lv_refcount; } else - to->vval.v_list = list_copy(from->vval.v_list, deep, copyID); + to->vval.v_list = list_copy(from->vval.v_list, + deep, top, copyID); if (to->vval.v_list == NULL) ret = FAIL; break; @@ -6226,7 +6229,8 @@ item_copy( ++to->vval.v_dict->dv_refcount; } else - to->vval.v_dict = dict_copy(from->vval.v_dict, deep, copyID); + to->vval.v_dict = dict_copy(from->vval.v_dict, + deep, top, copyID); if (to->vval.v_dict == NULL) ret = FAIL; break; diff --git a/src/evalfunc.c b/src/evalfunc.c index 281bd70d34..71632cd294 100644 --- a/src/evalfunc.c +++ b/src/evalfunc.c @@ -1170,6 +1170,33 @@ ret_first_arg(int argcount, return &t_void; } static type_T * +ret_copy(int argcount, + type2_T *argtypes, + type_T **decl_type) +{ + if (argcount > 0) + { + if (argtypes[0].type_decl != NULL) + { + if (argtypes[0].type_decl->tt_type == VAR_LIST) + *decl_type = &t_list_any; + else if (argtypes[0].type_decl->tt_type == VAR_DICT) + *decl_type = &t_dict_any; + else + *decl_type = argtypes[0].type_decl; + } + if (argtypes[0].type_curr != NULL) + { + if (argtypes[0].type_curr->tt_type == VAR_LIST) + return &t_list_any; + else if (argtypes[0].type_curr->tt_type == VAR_DICT) + return &t_dict_any; + } + return argtypes[0].type_curr; + } + return &t_void; +} + static type_T * ret_extend(int argcount, type2_T *argtypes, type_T **decl_type) @@ -1571,7 +1598,7 @@ static funcentry_T global_functions[] = {"confirm", 1, 4, FEARG_1, arg4_string_string_number_string, ret_number, f_confirm}, {"copy", 1, 1, FEARG_1, NULL, - ret_first_arg, f_copy}, + ret_copy, f_copy}, {"cos", 1, 1, FEARG_1, arg1_float_or_nr, ret_float, FLOAT_FUNC(f_cos)}, {"cosh", 1, 1, FEARG_1, arg1_float_or_nr, @@ -1591,7 +1618,7 @@ static funcentry_T global_functions[] = #endif }, {"deepcopy", 1, 2, FEARG_1, arg12_deepcopy, - ret_first_arg, f_deepcopy}, + ret_copy, f_deepcopy}, {"delete", 1, 2, FEARG_1, arg2_string, ret_number_bool, f_delete}, {"deletebufline", 2, 3, FEARG_1, arg3_buffer_lnum_lnum, @@ -3297,7 +3324,7 @@ f_confirm(typval_T *argvars UNUSED, typval_T *rettv UNUSED) static void f_copy(typval_T *argvars, typval_T *rettv) { - item_copy(&argvars[0], rettv, FALSE, 0); + item_copy(&argvars[0], rettv, FALSE, TRUE, 0); } /* @@ -3439,7 +3466,7 @@ f_deepcopy(typval_T *argvars, typval_T *rettv) else { copyID = get_copyID(); - item_copy(&argvars[0], rettv, TRUE, noref == 0 ? copyID : 0); + item_copy(&argvars[0], rettv, TRUE, TRUE, noref == 0 ? copyID : 0); } } diff --git a/src/evalvars.c b/src/evalvars.c index f88be3e8b9..b3436067f1 100644 --- a/src/evalvars.c +++ b/src/evalvars.c @@ -3695,24 +3695,7 @@ set_var_const( free_tv_arg = FALSE; if (vim9script && type != NULL) - { - if (type->tt_type == VAR_DICT && dest_tv->vval.v_dict != NULL) - { - if (dest_tv->vval.v_dict->dv_type != type) - { - free_type(dest_tv->vval.v_dict->dv_type); - dest_tv->vval.v_dict->dv_type = alloc_type(type); - } - } - else if (type->tt_type == VAR_LIST && dest_tv->vval.v_list != NULL) - { - if (dest_tv->vval.v_list->lv_type != type) - { - free_type(dest_tv->vval.v_list->lv_type); - dest_tv->vval.v_list->lv_type = alloc_type(type); - } - } - } + set_tv_type(dest_tv, type); // ":const var = value" locks the value // ":final var = value" locks "var" diff --git a/src/list.c b/src/list.c index ff7d5ab9ba..86c16793f9 100644 --- a/src/list.c +++ b/src/list.c @@ -1015,7 +1015,7 @@ flatten_common(typval_T *argvars, typval_T *rettv, int make_copy) if (make_copy) { - l = list_copy(l, TRUE, get_copyID()); + l = list_copy(l, TRUE, TRUE, get_copyID()); rettv->vval.v_list = l; if (l == NULL) return; @@ -1102,7 +1102,7 @@ list_concat(list_T *l1, list_T *l2, typval_T *tv) if (l1 == NULL) l = list_alloc(); else - l = list_copy(l1, FALSE, 0); + l = list_copy(l1, FALSE, TRUE, 0); if (l == NULL) return FAIL; tv->v_type = VAR_LIST; @@ -1200,11 +1200,11 @@ list_slice_or_index( /* * Make a copy of list "orig". Shallow if "deep" is FALSE. * The refcount of the new list is set to 1. - * See item_copy() for "copyID". + * See item_copy() for "top" and "copyID". * Returns NULL when out of memory. */ list_T * -list_copy(list_T *orig, int deep, int copyID) +list_copy(list_T *orig, int deep, int top, int copyID) { list_T *copy; listitem_T *item; @@ -1216,7 +1216,7 @@ list_copy(list_T *orig, int deep, int copyID) copy = list_alloc(); if (copy != NULL) { - copy->lv_type = alloc_type(orig->lv_type); + copy->lv_type = alloc_type(top || deep ? &t_list_any: orig->lv_type); if (copyID != 0) { // Do this before adding the items, because one of the items may @@ -1233,7 +1233,8 @@ list_copy(list_T *orig, int deep, int copyID) break; if (deep) { - if (item_copy(&item->li_tv, &ni->li_tv, deep, copyID) == FAIL) + if (item_copy(&item->li_tv, &ni->li_tv, + deep, FALSE, copyID) == FAIL) { vim_free(ni); break; @@ -2701,11 +2702,11 @@ list_extend_func( } l2 = argvars[1].vval.v_list; if ((is_new || !value_check_lock(l1->lv_lock, arg_errmsg, TRUE)) - && l2 != NULL) + && l2 != NULL) { if (is_new) { - l1 = list_copy(l1, FALSE, get_copyID()); + l1 = list_copy(l1, FALSE, TRUE, get_copyID()); if (l1 == NULL) return; } diff --git a/src/proto/dict.pro b/src/proto/dict.pro index d6cf152263..7db011d210 100644 --- a/src/proto/dict.pro +++ b/src/proto/dict.pro @@ -12,7 +12,7 @@ void dict_free_items(int copyID); dictitem_T *dictitem_alloc(char_u *key); void dictitem_remove(dict_T *dict, dictitem_T *item); void dictitem_free(dictitem_T *item); -dict_T *dict_copy(dict_T *orig, int deep, int copyID); +dict_T *dict_copy(dict_T *orig, int deep, int top, int copyID); int dict_wrong_func_name(dict_T *d, typval_T *tv, char_u *name); int dict_add(dict_T *d, dictitem_T *item); int dict_add_number(dict_T *d, char *key, varnumber_T nr); diff --git a/src/proto/eval.pro b/src/proto/eval.pro index abb9c565e2..8be58855d7 100644 --- a/src/proto/eval.pro +++ b/src/proto/eval.pro @@ -69,7 +69,7 @@ int eval_isnamec(int c); int eval_isnamec1(int c); int eval_isdictc(int c); int handle_subscript(char_u **arg, char_u *name_start, typval_T *rettv, evalarg_T *evalarg, int verbose); -int item_copy(typval_T *from, typval_T *to, int deep, int copyID); +int item_copy(typval_T *from, typval_T *to, int deep, int top, int copyID); void echo_one(typval_T *rettv, int with_space, int *atstart, int *needclr); void ex_echo(exarg_T *eap); void ex_echohl(exarg_T *eap); diff --git a/src/proto/list.pro b/src/proto/list.pro index 5b7414bce2..468775e59a 100644 --- a/src/proto/list.pro +++ b/src/proto/list.pro @@ -39,7 +39,7 @@ int list_extend(list_T *l1, list_T *l2, listitem_T *bef); int list_concat(list_T *l1, list_T *l2, typval_T *tv); list_T *list_slice(list_T *ol, long n1, long n2); int list_slice_or_index(list_T *list, int range, varnumber_T n1_arg, varnumber_T n2_arg, int exclusive, typval_T *rettv, int verbose); -list_T *list_copy(list_T *orig, int deep, int copyID); +list_T *list_copy(list_T *orig, int deep, int top, int copyID); void vimlist_remove(list_T *l, listitem_T *item, listitem_T *item2); char_u *list2string(typval_T *tv, int copyID, int restore_copyID); int list_join(garray_T *gap, list_T *l, char_u *sep, int echo_style, int restore_copyID, int copyID); diff --git a/src/proto/vim9type.pro b/src/proto/vim9type.pro index 61e38e0786..fb3cb8d145 100644 --- a/src/proto/vim9type.pro +++ b/src/proto/vim9type.pro @@ -2,6 +2,7 @@ void clear_type_list(garray_T *gap); type_T *alloc_type(type_T *type); void free_type(type_T *type); +void set_tv_type(typval_T *tv, type_T *type); type_T *get_list_type(type_T *member_type, garray_T *type_gap); type_T *get_dict_type(type_T *member_type, garray_T *type_gap); type_T *alloc_func_type(type_T *ret_type, int argcount, garray_T *type_gap); diff --git a/src/testdir/test_vim9_assign.vim b/src/testdir/test_vim9_assign.vim index e3606d81ea..73b331070f 100644 --- a/src/testdir/test_vim9_assign.vim +++ b/src/testdir/test_vim9_assign.vim @@ -484,7 +484,7 @@ def Test_assign_linebreak() ->copy() ->copy() END - v9.CheckDefFailure(lines, 'E1012:', 2) + v9.CheckDefExecFailure(lines, 'E1012:', 4) lines =<< trim END var x: any diff --git a/src/testdir/test_vim9_builtin.vim b/src/testdir/test_vim9_builtin.vim index 248887f7b0..f7a5006b45 100644 --- a/src/testdir/test_vim9_builtin.vim +++ b/src/testdir/test_vim9_builtin.vim @@ -720,6 +720,31 @@ def Test_copy_return_type() res->assert_equal(6) dl = deepcopy([1, 2, 3], true) + + # after a copy() the type can change, but not the item itself + var nl: list = [1, 2] + assert_equal([1, 2, 'x'], nl->copy()->extend(['x'])) + + var lines =<< trim END + var nll: list> = [[1, 2]] + nll->copy()[0]->extend(['x']) + END + v9.CheckDefExecAndScriptFailure(lines, 'E1013: Argument 2: type mismatch, expected list but got list in extend()') + + var nd: dict = {a: 1, b: 2} + assert_equal({a: 1, b: 2, c: 'x'}, nd->copy()->extend({c: 'x'})) + lines =<< trim END + var ndd: dict> = {a: {x: 1, y: 2}} + ndd->copy()['a']->extend({z: 'x'}) + END + v9.CheckDefExecAndScriptFailure(lines, 'E1013: Argument 2: type mismatch, expected dict but got dict in extend()') + + # after a deepcopy() the item type can also change + var nll: list> = [[1, 2]] + assert_equal([1, 2, 'x'], nll->deepcopy()[0]->extend(['x'])) + + var ndd: dict> = {a: {x: 1, y: 2}} + assert_equal({x: 1, y: 2, z: 'x'}, ndd->deepcopy()['a']->extend({z: 'x'})) enddef def Test_count() diff --git a/src/version.c b/src/version.c index 2c623671c7..e6edb17be2 100644 --- a/src/version.c +++ b/src/version.c @@ -746,6 +746,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ +/**/ + 4286, /**/ 4285, /**/ diff --git a/src/vim9execute.c b/src/vim9execute.c index a45d7c5538..cac8c519d9 100644 --- a/src/vim9execute.c +++ b/src/vim9execute.c @@ -4412,7 +4412,8 @@ exec_instructions(ectx_T *ectx) == NULL) { SOURCING_LNUM = iptr->isn_lnum; - semsg(_(e_key_not_present_in_dictionary), iptr->isn_arg.string); + semsg(_(e_key_not_present_in_dictionary), + iptr->isn_arg.string); goto on_error; } // Put the dict used on the dict stack, it might be used by @@ -4531,21 +4532,7 @@ exec_instructions(ectx_T *ectx) break; case ISN_SETTYPE: - { - checktype_T *ct = &iptr->isn_arg.type; - - tv = STACK_TV_BOT(-1); - if (tv->v_type == VAR_DICT && tv->vval.v_dict != NULL) - { - free_type(tv->vval.v_dict->dv_type); - tv->vval.v_dict->dv_type = alloc_type(ct->ct_type); - } - else if (tv->v_type == VAR_LIST && tv->vval.v_list != NULL) - { - free_type(tv->vval.v_list->lv_type); - tv->vval.v_list->lv_type = alloc_type(ct->ct_type); - } - } + set_tv_type(STACK_TV_BOT(-1), iptr->isn_arg.type.ct_type); break; case ISN_2BOOL: diff --git a/src/vim9type.c b/src/vim9type.c index f2a69d0ab5..f184171c11 100644 --- a/src/vim9type.c +++ b/src/vim9type.c @@ -102,6 +102,71 @@ free_type(type_T *type) vim_free(type); } +/* + * Return TRUE if "type" is to be recursed into for setting the type. + */ + static int +set_tv_type_recurse(type_T *type) +{ + return type->tt_member != NULL + && (type->tt_member->tt_type == VAR_DICT + || type->tt_member->tt_type == VAR_LIST) + && type->tt_member->tt_member != NULL + && type->tt_member->tt_member != &t_any + && type->tt_member->tt_member != &t_unknown; +} + +/* + * Set the type of "tv" to "type" if it is a list or dict. + */ + void +set_tv_type(typval_T *tv, type_T *type) +{ + if (tv->v_type == VAR_DICT && tv->vval.v_dict != NULL) + { + dict_T *d = tv->vval.v_dict; + + if (d->dv_type != type) + { + free_type(d->dv_type); + d->dv_type = alloc_type(type); + if (set_tv_type_recurse(type)) + { + int todo = (int)d->dv_hashtab.ht_used; + hashitem_T *hi; + dictitem_T *di; + + for (hi = d->dv_hashtab.ht_array; todo > 0; ++hi) + { + if (!HASHITEM_EMPTY(hi)) + { + --todo; + di = HI2DI(hi); + set_tv_type(&di->di_tv, type->tt_member); + } + } + } + } + } + else if (tv->v_type == VAR_LIST && tv->vval.v_list != NULL) + { + list_T *l = tv->vval.v_list; + + if (l->lv_type != type) + { + free_type(l->lv_type); + l->lv_type = alloc_type(type); + if (l->lv_first != &range_list_item && set_tv_type_recurse(type)) + { + listitem_T *li; + + FOR_ALL_LIST_ITEMS(l, li) + set_tv_type(&li->li_tv, type->tt_member); + } + } + } +} + type_T * get_list_type(type_T *member_type, garray_T *type_gap) { From 2d3ac2e03093c4b0ae5d18c5f2f51ae0c2a9ec72 Mon Sep 17 00:00:00 2001 From: Bram Moolenaar Date: Thu, 3 Feb 2022 12:34:05 +0000 Subject: [PATCH 22/28] patch 8.2.4287: cannot assign empty list with type to variable with list type Problem: Cannot assign empty list with any list type to variable with specific list type. Solution: Use unknown list type for empty list if the specified type is any. --- src/testdir/test_vim9_assign.vim | 9 +++++++++ src/testdir/test_vim9_func.vim | 6 +++--- src/version.c | 2 ++ src/vim9type.c | 6 +++++- 4 files changed, 19 insertions(+), 4 deletions(-) diff --git a/src/testdir/test_vim9_assign.vim b/src/testdir/test_vim9_assign.vim index 73b331070f..744fc5e715 100644 --- a/src/testdir/test_vim9_assign.vim +++ b/src/testdir/test_vim9_assign.vim @@ -1249,6 +1249,15 @@ def Test_assignment_var_list() v9.CheckScriptSuccess(lines) enddef +def Test_assignment_empty_list() + var lines =<< trim END + var l2: list = [] + var l: list + l = l2 + END + v9.CheckDefAndScriptSuccess(lines) +enddef + def Test_assignment_vim9script() var lines =<< trim END vim9script diff --git a/src/testdir/test_vim9_func.vim b/src/testdir/test_vim9_func.vim index 434d49bf97..55297cb652 100644 --- a/src/testdir/test_vim9_func.vim +++ b/src/testdir/test_vim9_func.vim @@ -3461,11 +3461,11 @@ def Test_list_any_type_checked() enddef Foo() END + # "any" could be "dict", thus OK lines[2] = 'var l: list' - v9.CheckScriptFailure(lines, 'E1013: Argument 1: type mismatch, expected list> but got list', 2) - + v9.CheckScriptSuccess(lines) lines[2] = 'var l: list = []' - v9.CheckScriptFailure(lines, 'E1013: Argument 1: type mismatch, expected list> but got list', 2) + v9.CheckScriptSuccess(lines) lines[2] = 'var l: list = [11]' v9.CheckScriptFailure(lines, 'E1013: Argument 1: type mismatch, expected list> but got list', 2) diff --git a/src/version.c b/src/version.c index e6edb17be2..b53b4eb3df 100644 --- a/src/version.c +++ b/src/version.c @@ -746,6 +746,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ +/**/ + 4287, /**/ 4286, /**/ diff --git a/src/vim9type.c b/src/vim9type.c index f184171c11..f72698cb9d 100644 --- a/src/vim9type.c +++ b/src/vim9type.c @@ -344,7 +344,11 @@ typval2type_int(typval_T *tv, int copyID, garray_T *type_gap, int flags) list_T *l = tv->vval.v_list; listitem_T *li; - if (l == NULL || (l->lv_first == NULL && l->lv_type == NULL)) + // An empty list has type list, unless the type was specified + // and is not list. This matters when assigning to a variable + // with a specific list type. + if (l == NULL || (l->lv_first == NULL + && (l->lv_type == NULL || l->lv_type->tt_member == &t_any))) return &t_list_empty; if ((flags & TVTT_DO_MEMBER) == 0) return &t_list_any; From 6e1d31e9e3ca42cb883abca198f011dc6f4ceb14 Mon Sep 17 00:00:00 2001 From: "K.Takata" Date: Thu, 3 Feb 2022 13:05:32 +0000 Subject: [PATCH 23/28] patch 8.2.4288: preprocessor indents are inconsistent Problem: Preprocessor indents are inconsistent. Solution: Fix preprocessor indents. (Ken Takata, closes #9691) --- src/arglist.c | 4 ++-- src/change.c | 4 ++-- src/ex_cmds.c | 4 ++-- src/gui.c | 18 +++++++++--------- src/hashtab.c | 4 ++-- src/indent.c | 4 ++-- src/ops.c | 4 ++-- src/os_win32.c | 22 +++++++++++----------- src/version.c | 2 ++ 9 files changed, 34 insertions(+), 32 deletions(-) diff --git a/src/arglist.c b/src/arglist.c index fbd99af0d3..5c2236927e 100644 --- a/src/arglist.c +++ b/src/arglist.c @@ -969,9 +969,9 @@ do_arg_all( old_curwin = curwin; old_curtab = curtab; -# ifdef FEAT_GUI +#ifdef FEAT_GUI need_mouse_correct = TRUE; -# endif +#endif // Try closing all windows that are not in the argument list. // Also close windows that are not full width; diff --git a/src/change.c b/src/change.c index 9f1705f2a4..25a0841909 100644 --- a/src/change.c +++ b/src/change.c @@ -1638,9 +1638,9 @@ open_line( #ifdef FEAT_CINDENT // May do indenting after opening a new line. do_cindent = !p_paste && (curbuf->b_p_cin -# ifdef FEAT_EVAL +# ifdef FEAT_EVAL || *curbuf->b_p_inde != NUL -# endif +# endif ) && in_cinkeys(dir == FORWARD ? KEY_OPEN_FORW diff --git a/src/ex_cmds.c b/src/ex_cmds.c index d9d532c919..91a2fa722d 100644 --- a/src/ex_cmds.c +++ b/src/ex_cmds.c @@ -99,9 +99,9 @@ do_ascii(exarg_T *eap UNUSED) IObuff[len++] = ' '; IObuff[len++] = '<'; if (enc_utf8 && utf_iscomposing(c) -# ifdef USE_GUI +#ifdef USE_GUI && !gui.in_use -# endif +#endif ) IObuff[len++] = ' '; // draw composing char on top of a space len += (*mb_char2bytes)(c, IObuff + len); diff --git a/src/gui.c b/src/gui.c index 0cce1f111a..fb589fc1c7 100644 --- a/src/gui.c +++ b/src/gui.c @@ -292,11 +292,11 @@ gui_do_fork(void) } // Child -#ifdef FEAT_GUI_GTK +# ifdef FEAT_GUI_GTK // Call gtk_init_check() here after fork(). See gui_init_check(). if (gui_mch_init_check() != OK) getout_preserve_modified(1); -#endif +# endif # if defined(HAVE_SETSID) || defined(HAVE_SETPGID) /* @@ -348,11 +348,11 @@ gui_do_fork(void) gui_read_child_pipe(int fd) { long bytes_read; -#define READ_BUFFER_SIZE 10 +# define READ_BUFFER_SIZE 10 char buffer[READ_BUFFER_SIZE]; bytes_read = read_eintr(fd, buffer, READ_BUFFER_SIZE - 1); -#undef READ_BUFFER_SIZE +# undef READ_BUFFER_SIZE close(fd); if (bytes_read < 0) return GUI_CHILD_IO_ERROR; @@ -459,7 +459,7 @@ gui_init_check(void) gui.scrollbar_width = gui.scrollbar_height = SB_DEFAULT_WIDTH; gui.prev_wrap = -1; -# ifdef FEAT_GUI_GTK +#ifdef FEAT_GUI_GTK CLEAR_FIELD(gui.ligatures_map); #endif @@ -1435,7 +1435,7 @@ gui_position_components(int total_width UNUSED) text_area_y += gui.menu_height; #endif -# if defined(FEAT_GUI_TABLINE) && (defined(FEAT_GUI_MSWIN) \ +#if defined(FEAT_GUI_TABLINE) && (defined(FEAT_GUI_MSWIN) \ || defined(FEAT_GUI_MOTIF)) if (gui_has_tabline()) text_area_y += gui.tabline_height; @@ -1453,7 +1453,7 @@ gui_position_components(int total_width UNUSED) } #endif -# if defined(FEAT_GUI_TABLINE) && defined(FEAT_GUI_HAIKU) +#if defined(FEAT_GUI_TABLINE) && defined(FEAT_GUI_HAIKU) gui_mch_set_tabline_pos(0, text_area_y, gui.menu_width, gui.tabline_height); if (gui_has_tabline()) @@ -5235,10 +5235,10 @@ gui_update_screen(void) { if (has_cursormoved()) apply_autocmds(EVENT_CURSORMOVED, NULL, NULL, FALSE, curbuf); -#ifdef FEAT_PROP_POPUP +# ifdef FEAT_PROP_POPUP if (popup_visible) popup_check_cursor_pos(); -#endif +# endif # ifdef FEAT_CONCEAL if (curwin->w_p_cole > 0) { diff --git a/src/hashtab.c b/src/hashtab.c index 482d83005e..a7470ecdc1 100644 --- a/src/hashtab.c +++ b/src/hashtab.c @@ -189,13 +189,13 @@ hash_lookup(hashtab_T *ht, char_u *key, hash_T hash) void hash_debug_results(void) { -#ifdef HT_DEBUG +# ifdef HT_DEBUG fprintf(stderr, "\r\n\r\n\r\n\r\n"); fprintf(stderr, "Number of hashtable lookups: %ld\r\n", hash_count_lookup); fprintf(stderr, "Number of perturb loops: %ld\r\n", hash_count_perturb); fprintf(stderr, "Percentage of perturb loops: %ld%%\r\n", hash_count_perturb * 100 / hash_count_lookup); -#endif +# endif } #endif diff --git a/src/indent.c b/src/indent.c index 8e9b0d148c..b62308d2a4 100644 --- a/src/indent.c +++ b/src/indent.c @@ -2173,7 +2173,7 @@ f_indent(typval_T *argvars, typval_T *rettv) void f_lispindent(typval_T *argvars UNUSED, typval_T *rettv) { -#ifdef FEAT_LISP +# ifdef FEAT_LISP pos_T pos; linenr_T lnum; @@ -2191,7 +2191,7 @@ f_lispindent(typval_T *argvars UNUSED, typval_T *rettv) else if (in_vim9script()) semsg(_(e_invalid_line_number_nr), lnum); else -#endif +# endif rettv->vval.v_number = -1; } #endif diff --git a/src/ops.c b/src/ops.c index 418c46daa4..8c463033c1 100644 --- a/src/ops.c +++ b/src/ops.c @@ -3667,9 +3667,9 @@ do_pending_operator(cmdarg_T *cap, int old_col, int gui_yank) curbuf->b_visual.vi_mode = VIsual_mode; restore_visual_mode(); curbuf->b_visual.vi_curswant = curwin->w_curswant; -# ifdef FEAT_EVAL +#ifdef FEAT_EVAL curbuf->b_visual_mode_eval = VIsual_mode; -# endif +#endif } // In Select mode, a linewise selection is operated upon like a diff --git a/src/os_win32.c b/src/os_win32.c index 36b2cf1266..18b9e59792 100644 --- a/src/os_win32.c +++ b/src/os_win32.c @@ -241,11 +241,11 @@ static char_u *exe_path = NULL; static BOOL win8_or_later = FALSE; -# if defined(__GNUC__) && !defined(__MINGW32__) && !defined(__CYGWIN__) -# define UChar UnicodeChar -# else -# define UChar uChar.UnicodeChar -# endif +#if defined(__GNUC__) && !defined(__MINGW32__) && !defined(__CYGWIN__) +# define UChar UnicodeChar +#else +# define UChar uChar.UnicodeChar +#endif #if !defined(FEAT_GUI_MSWIN) || defined(VIMDLL) // Dynamic loading for portability @@ -2077,13 +2077,13 @@ theend: buf[len++] = typeahead[0]; mch_memmove(typeahead, typeahead + 1, --typeaheadlen); } -# ifdef FEAT_JOB_CHANNEL +# ifdef FEAT_JOB_CHANNEL if (len > 0) { buf[len] = NUL; ch_log(NULL, "raw key input: \"%s\"", buf); } -# endif +# endif return len; #else // FEAT_GUI_MSWIN @@ -7874,12 +7874,12 @@ vtp_sgr_bulk( vtp_sgr_bulks(1, args); } -#define FAST256(x) \ +# define FAST256(x) \ if ((*p-- = "0123456789"[(n = x % 10)]) \ && x >= 10 && (*p-- = "0123456789"[((m = x % 100) - n) / 10]) \ && x >= 100 && (*p-- = "012"[((x & 0xff) - m) / 100])); -#define FAST256CASE(x) \ +# define FAST256CASE(x) \ case x: \ FAST256(newargs[x - 1]); @@ -7888,8 +7888,8 @@ vtp_sgr_bulks( int argc, int *args) { -#define MAXSGR 16 -#define SGRBUFSIZE 2 + 4 * MAXSGR + 1 // '\033[' + SGR + 'm' +# define MAXSGR 16 +# define SGRBUFSIZE 2 + 4 * MAXSGR + 1 // '\033[' + SGR + 'm' char_u buf[SGRBUFSIZE]; char_u *p; int in, out; diff --git a/src/version.c b/src/version.c index b53b4eb3df..cc4e7d29be 100644 --- a/src/version.c +++ b/src/version.c @@ -746,6 +746,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ +/**/ + 4288, /**/ 4287, /**/ From 5411910c77cba85212963a2fb71d8c71f8a5d203 Mon Sep 17 00:00:00 2001 From: "K.Takata" Date: Thu, 3 Feb 2022 13:33:03 +0000 Subject: [PATCH 24/28] patch 8.2.4289: warnings reported by MSVC Problem: Warnings reported by MSVC. Solution: Rename variables and other fixes. (Ken Takata, closes #9689) --- src/cmdexpand.c | 6 +++--- src/drawscreen.c | 14 +++++++------- src/filepath.c | 6 +++--- src/getchar.c | 12 ++++++------ src/menu.c | 2 +- src/os_win32.c | 4 ++-- src/version.c | 4 +++- 7 files changed, 25 insertions(+), 23 deletions(-) diff --git a/src/cmdexpand.c b/src/cmdexpand.c index 464dc96c19..b75903df98 100644 --- a/src/cmdexpand.c +++ b/src/cmdexpand.c @@ -1993,11 +1993,11 @@ ExpandFromContext( #ifdef BACKSLASH_IN_FILENAME if (p_csl[0] != NUL && (options & WILD_IGNORE_COMPLETESLASH) == 0) { - int i; + int j; - for (i = 0; i < *num_file; ++i) + for (j = 0; j < *num_file; ++j) { - char_u *ptr = (*file)[i]; + char_u *ptr = (*file)[j]; while (*ptr != NUL) { diff --git a/src/drawscreen.c b/src/drawscreen.c index 5732b89ab0..5b9619e9fa 100644 --- a/src/drawscreen.c +++ b/src/drawscreen.c @@ -2554,17 +2554,17 @@ win_update(win_T *wp) // See the version that was fixed. if (use_vtp() && get_conpty_fix_type() < 1) { - int i; + int k; - for (i = 0; i < Rows; ++i) + for (k = 0; k < Rows; ++k) if (enc_utf8) - if ((*mb_off2cells)(LineOffset[i] + Columns - 2, - LineOffset[i] + screen_Columns) > 1) - screen_draw_rectangle(i, Columns - 2, 1, 2, FALSE); + if ((*mb_off2cells)(LineOffset[k] + Columns - 2, + LineOffset[k] + screen_Columns) > 1) + screen_draw_rectangle(k, Columns - 2, 1, 2, FALSE); else - screen_draw_rectangle(i, Columns - 1, 1, 1, FALSE); + screen_draw_rectangle(k, Columns - 1, 1, 1, FALSE); else - screen_char(LineOffset[i] + Columns - 1, i, Columns - 1); + screen_char(LineOffset[k] + Columns - 1, k, Columns - 1); } #endif diff --git a/src/filepath.c b/src/filepath.c index 65ea2bc6ea..4abf8f498d 100644 --- a/src/filepath.c +++ b/src/filepath.c @@ -372,12 +372,12 @@ repeat: { if (GetLongPathNameW(wfname, buf, _MAX_PATH)) { - char_u *p = utf16_to_enc(buf, NULL); + char_u *q = utf16_to_enc(buf, NULL); - if (p != NULL) + if (q != NULL) { vim_free(*bufp); // free any allocated file name - *bufp = *fnamep = p; + *bufp = *fnamep = q; } } vim_free(wfname); diff --git a/src/getchar.c b/src/getchar.c index 9a1132aa80..c7a1cca1a6 100644 --- a/src/getchar.c +++ b/src/getchar.c @@ -1768,16 +1768,16 @@ vgetc(void) c == K_TEAROFF) { char_u name[200]; - int i; + int j; // get menu path, it ends with a - for (i = 0; (c = vgetorpeek(TRUE)) != '\r'; ) + for (j = 0; (c = vgetorpeek(TRUE)) != '\r'; ) { - name[i] = c; - if (i < 199) - ++i; + name[j] = c; + if (j < 199) + ++j; } - name[i] = NUL; + name[j] = NUL; gui_make_tearoff(name); continue; } diff --git a/src/menu.c b/src/menu.c index 880a93a6db..1c5cc4acb3 100644 --- a/src/menu.c +++ b/src/menu.c @@ -677,7 +677,7 @@ add_menu_path( } } -# if defined(FEAT_GUI_MSWIN) & defined(FEAT_TEAROFF) +# if defined(FEAT_GUI_MSWIN) && defined(FEAT_TEAROFF) // When adding a new submenu, may add a tearoff item if ( addtearoff && *next_name diff --git a/src/os_win32.c b/src/os_win32.c index 18b9e59792..d2d2fe7a30 100644 --- a/src/os_win32.c +++ b/src/os_win32.c @@ -452,7 +452,7 @@ wait_for_single_object( HANDLE hHandle, DWORD dwMilliseconds) { - if (read_console_input(NULL, NULL, -2, NULL)) + if (read_console_input(NULL, NULL, (DWORD)-2, NULL)) return WAIT_OBJECT_0; return WaitForSingleObject(hHandle, dwMilliseconds); } @@ -724,7 +724,7 @@ dyn_libintl_init(void) for (i = 0; libintl_entry[i].name != NULL && libintl_entry[i].ptr != NULL; ++i) { - if ((*libintl_entry[i].ptr = (FARPROC)GetProcAddress(hLibintlDLL, + if ((*libintl_entry[i].ptr = GetProcAddress(hLibintlDLL, libintl_entry[i].name)) == NULL) { dyn_libintl_end(); diff --git a/src/version.c b/src/version.c index cc4e7d29be..8ea43b54f4 100644 --- a/src/version.c +++ b/src/version.c @@ -746,6 +746,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ +/**/ + 4289, /**/ 4288, /**/ @@ -9468,7 +9470,7 @@ list_in_columns(char_u **items, int size, int current) // The rightmost column doesn't need a separator. // Sacrifice it to fit in one more column if possible. ncol = (int) (Columns + 1) / width; - nrow = item_count / ncol + (item_count % ncol ? 1 : 0); + nrow = item_count / ncol + ((item_count % ncol) ? 1 : 0); // "i" counts columns then rows. "idx" counts rows then columns. for (i = 0; !got_int && i < nrow * ncol; ++i) From a8ec4916caadd0a5113b7d41fa81d6d2c807260f Mon Sep 17 00:00:00 2001 From: "K.Takata" Date: Thu, 3 Feb 2022 14:32:33 +0000 Subject: [PATCH 25/28] patch 8.2.4290: MS-Windows: using type casts for timer IDs Problem: MS-Windows: using type casts for timer IDs. Solution: Remove type casts and use the right type. (Ken Takata, closes #9690) Remove old debug comments. Rename variables and functions. --- src/gui_w32.c | 59 +++++++++++++++++++-------------------------------- src/version.c | 2 ++ 2 files changed, 24 insertions(+), 37 deletions(-) diff --git a/src/gui_w32.c b/src/gui_w32.c index 11ab2346af..b5ddc5dace 100644 --- a/src/gui_w32.c +++ b/src/gui_w32.c @@ -517,7 +517,7 @@ static int s_getting_focus = FALSE; static int s_x_pending; static int s_y_pending; static UINT s_kFlags_pending; -static UINT s_wait_timer = 0; // Timer for get char from user +static UINT_PTR s_wait_timer = 0; // Timer for get char from user static int s_timed_out = FALSE; static int dead_key = 0; // 0: no dead key, 1: dead key pressed static UINT surrogate_pending_ch = 0; // 0: no surrogate pending, @@ -526,7 +526,7 @@ static UINT surrogate_pending_ch = 0; // 0: no surrogate pending, #ifdef FEAT_BEVAL_GUI // balloon-eval WM_NOTIFY_HANDLER static void Handle_WM_Notify(HWND hwnd, LPNMHDR pnmh); -static void TrackUserActivity(UINT uMsg); +static void track_user_activity(UINT uMsg); #endif /* @@ -584,7 +584,7 @@ static int blink_state = BLINK_NONE; static long_u blink_waittime = 700; static long_u blink_ontime = 400; static long_u blink_offtime = 250; -static UINT blink_timer = 0; +static UINT_PTR blink_timer = 0; int gui_mch_is_blinking(void) @@ -610,7 +610,7 @@ gui_mch_set_blinking(long wait, long on, long off) _OnBlinkTimer( HWND hwnd, UINT uMsg UNUSED, - UINT idEvent, + UINT_PTR idEvent, DWORD dwTime UNUSED) { MSG msg; @@ -629,15 +629,13 @@ _OnBlinkTimer( { gui_undraw_cursor(); blink_state = BLINK_OFF; - blink_timer = (UINT) SetTimer(NULL, 0, (UINT)blink_offtime, - (TIMERPROC)_OnBlinkTimer); + blink_timer = SetTimer(NULL, 0, (UINT)blink_offtime, _OnBlinkTimer); } else { gui_update_cursor(TRUE, FALSE); blink_state = BLINK_ON; - blink_timer = (UINT) SetTimer(NULL, 0, (UINT)blink_ontime, - (TIMERPROC)_OnBlinkTimer); + blink_timer = SetTimer(NULL, 0, (UINT)blink_ontime, _OnBlinkTimer); } gui_mch_flush(); } @@ -684,8 +682,7 @@ gui_mch_start_blink(void) // Only switch blinking on if none of the times is zero if (blink_waittime && blink_ontime && blink_offtime && gui.in_focus) { - blink_timer = (UINT)SetTimer(NULL, 0, (UINT)blink_waittime, - (TIMERPROC)_OnBlinkTimer); + blink_timer = SetTimer(NULL, 0, (UINT)blink_waittime, _OnBlinkTimer); blink_state = BLINK_ON; gui_update_cursor(TRUE, FALSE); gui_mch_flush(); @@ -700,7 +697,7 @@ gui_mch_start_blink(void) _OnTimer( HWND hwnd, UINT uMsg UNUSED, - UINT idEvent, + UINT_PTR idEvent, DWORD dwTime UNUSED) { MSG msg; @@ -1257,7 +1254,7 @@ _TextAreaWndProc( s_lParam = lParam; #ifdef FEAT_BEVAL_GUI - TrackUserActivity(uMsg); + track_user_activity(uMsg); #endif switch (uMsg) @@ -2117,8 +2114,8 @@ gui_mch_wait_for_chars(int wtime) return FAIL; // When called with "wtime" zero, just want one msec. - s_wait_timer = (UINT)SetTimer(NULL, 0, (UINT)(wtime == 0 ? 1 : wtime), - (TIMERPROC)_OnTimer); + s_wait_timer = SetTimer(NULL, 0, (UINT)(wtime == 0 ? 1 : wtime), + _OnTimer); } allow_scrollbar = TRUE; @@ -3892,8 +3889,8 @@ _OnScroll( # define BEVAL_TEXT_LEN MAXPATHL static BalloonEval *cur_beval = NULL; -static UINT_PTR BevalTimerId = 0; -static DWORD LastActivity = 0; +static UINT_PTR beval_timer_id = 0; +static DWORD last_user_activity = 0; #endif // defined(FEAT_BEVAL_GUI) @@ -8238,10 +8235,10 @@ delete_tooltip(BalloonEval *beval) } static VOID CALLBACK -BevalTimerProc( +beval_timer_proc( HWND hwnd UNUSED, UINT uMsg UNUSED, - UINT_PTR idEvent UNUSED, + UINT_PTR idEvent UNUSED, DWORD dwTime) { POINT pt; @@ -8259,8 +8256,8 @@ BevalTimerProc( if (!PtInRect(&rect, pt)) return; - if (LastActivity > 0 - && (dwTime - LastActivity) >= (DWORD)p_bdlay + if (last_user_activity > 0 + && (dwTime - last_user_activity) >= (DWORD)p_bdlay && (cur_beval->showState != ShS_PENDING || abs(cur_beval->x - pt.x) > 3 || abs(cur_beval->y - pt.y) > 3)) @@ -8271,8 +8268,6 @@ BevalTimerProc( cur_beval->x = pt.x; cur_beval->y = pt.y; - // TRACE0("BevalTimerProc: sending request"); - if (cur_beval->msgCB != NULL) (*cur_beval->msgCB)(cur_beval, 0); } @@ -8281,20 +8276,16 @@ BevalTimerProc( void gui_mch_disable_beval_area(BalloonEval *beval UNUSED) { - // TRACE0("gui_mch_disable_beval_area {{{"); - KillTimer(s_textArea, BevalTimerId); - // TRACE0("gui_mch_disable_beval_area }}}"); + KillTimer(s_textArea, beval_timer_id); } void gui_mch_enable_beval_area(BalloonEval *beval) { - // TRACE0("gui_mch_enable_beval_area |||"); if (beval == NULL) return; - // TRACE0("gui_mch_enable_beval_area {{{"); - BevalTimerId = SetTimer(s_textArea, 0, (UINT)(p_bdlay / 2), BevalTimerProc); - // TRACE0("gui_mch_enable_beval_area }}}"); + beval_timer_id = SetTimer(s_textArea, 0, (UINT)(p_bdlay / 2), + beval_timer_proc); } void @@ -8311,7 +8302,6 @@ gui_mch_post_balloon(BalloonEval *beval, char_u *mesg) return; } - // TRACE0("gui_mch_post_balloon {{{"); if (beval->showState == ShS_SHOWING) return; GetCursorPos(&pt); @@ -8324,7 +8314,6 @@ gui_mch_post_balloon(BalloonEval *beval, char_u *mesg) beval->showState = ShS_SHOWING; make_tooltip(beval, (char *)mesg, pt); } - // TRACE0("gui_mch_post_balloon }}}"); } BalloonEval * @@ -8373,14 +8362,10 @@ Handle_WM_Notify(HWND hwnd UNUSED, LPNMHDR pnmh) switch (pnmh->code) { case TTN_SHOW: - // TRACE0("TTN_SHOW {{{"); - // TRACE0("TTN_SHOW }}}"); break; case TTN_POP: // Before tooltip disappear - // TRACE0("TTN_POP {{{"); delete_tooltip(cur_beval); gui_mch_enable_beval_area(cur_beval); - // TRACE0("TTN_POP }}}"); cur_beval->showState = ShS_NEUTRAL; break; @@ -8405,11 +8390,11 @@ Handle_WM_Notify(HWND hwnd UNUSED, LPNMHDR pnmh) } static void -TrackUserActivity(UINT uMsg) +track_user_activity(UINT uMsg) { if ((uMsg >= WM_MOUSEFIRST && uMsg <= WM_MOUSELAST) || (uMsg >= WM_KEYFIRST && uMsg <= WM_KEYLAST)) - LastActivity = GetTickCount(); + last_user_activity = GetTickCount(); } void diff --git a/src/version.c b/src/version.c index 8ea43b54f4..6c09fb5827 100644 --- a/src/version.c +++ b/src/version.c @@ -746,6 +746,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ +/**/ + 4290, /**/ 4289, /**/ From 5658ca343f49a770ec068a858f52547ce822afa1 Mon Sep 17 00:00:00 2001 From: Bram Moolenaar Date: Thu, 3 Feb 2022 20:09:19 +0000 Subject: [PATCH 26/28] patch 8.2.4291: error number used twice Problem: Error number used twice. Solution: Renumber of of the errors. --- src/errors.h | 5 ++--- src/version.c | 2 ++ 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/src/errors.h b/src/errors.h index 9a5da9c0de..80a9a5aaed 100644 --- a/src/errors.h +++ b/src/errors.h @@ -2809,7 +2809,8 @@ EXTERN char e_cannot_assign_to_argument[] INIT(= N_("E1090: Cannot assign to argument %s")); EXTERN char e_function_is_not_compiled_str[] INIT(= N_("E1091: Function is not compiled: %s")); -// E1092 unused +EXTERN char e_cannot_nest_redir[] + INIT(= N_("E1092: Cannot nest :redir")); EXTERN char e_expected_nr_items_but_got_nr[] INIT(= N_("E1093: Expected %d items but got %d")); EXTERN char e_import_can_only_be_used_in_script[] @@ -3012,8 +3013,6 @@ EXTERN char e_cannot_use_range_with_assignment_operator_str[] #ifdef FEAT_EVAL EXTERN char e_blob_not_set[] INIT(= N_("E1184: Blob not set")); -EXTERN char e_cannot_nest_redir[] - INIT(= N_("E1185: Cannot nest :redir")); EXTERN char e_missing_redir_end[] INIT(= N_("E1185: Missing :redir END")); EXTERN char e_expression_does_not_result_in_value_str[] diff --git a/src/version.c b/src/version.c index 6c09fb5827..1e5ac239e6 100644 --- a/src/version.c +++ b/src/version.c @@ -746,6 +746,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ +/**/ + 4291, /**/ 4290, /**/ From 02a977ea5ee733412011a7f259a4efa0ffc95f1a Mon Sep 17 00:00:00 2001 From: Bram Moolenaar Date: Thu, 3 Feb 2022 21:29:39 +0000 Subject: [PATCH 27/28] patch 8.2.4292: test fails Problem: Test fails. Solution: Adjust the expected error number. --- src/testdir/test_vim9_cmd.vim | 2 +- src/version.c | 2 ++ 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/src/testdir/test_vim9_cmd.vim b/src/testdir/test_vim9_cmd.vim index 3d9edee3fd..bacf195f10 100644 --- a/src/testdir/test_vim9_cmd.vim +++ b/src/testdir/test_vim9_cmd.vim @@ -1610,7 +1610,7 @@ def Test_redir_to_var() redir > Xfile redir END END - v9.CheckDefFailure(lines, 'E1185:') + v9.CheckDefFailure(lines, 'E1092:') lines =<< trim END var text: number diff --git a/src/version.c b/src/version.c index 1e5ac239e6..04199782e1 100644 --- a/src/version.c +++ b/src/version.c @@ -746,6 +746,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ +/**/ + 4292, /**/ 4291, /**/ From 7676c158798a7c90f500cab2c12af0d47bad6026 Mon Sep 17 00:00:00 2001 From: Bram Moolenaar Date: Thu, 3 Feb 2022 21:47:34 +0000 Subject: [PATCH 28/28] patch 8.2.4293: Vim9: when copying a list it gets type list Problem: Vim9: when copying a list it gets type list even when the original list did not have a type. Solution: Only set the type when the original list has a type. (closes #9692) --- src/list.c | 6 +++++- src/testdir/test_vim9_expr.vim | 3 +++ src/version.c | 2 ++ 3 files changed, 10 insertions(+), 1 deletion(-) diff --git a/src/list.c b/src/list.c index 86c16793f9..3a6ea97668 100644 --- a/src/list.c +++ b/src/list.c @@ -1216,7 +1216,11 @@ list_copy(list_T *orig, int deep, int top, int copyID) copy = list_alloc(); if (copy != NULL) { - copy->lv_type = alloc_type(top || deep ? &t_list_any: orig->lv_type); + if (orig->lv_type == NULL) + copy->lv_type = NULL; + else + copy->lv_type = alloc_type(top || deep + ? &t_list_any: orig->lv_type); if (copyID != 0) { // Do this before adding the items, because one of the items may diff --git a/src/testdir/test_vim9_expr.vim b/src/testdir/test_vim9_expr.vim index c6466d39a0..a4e3e9e0f2 100644 --- a/src/testdir/test_vim9_expr.vim +++ b/src/testdir/test_vim9_expr.vim @@ -1495,6 +1495,9 @@ def Test_expr5_list_add() # result of glob() is "any", runtime type check var sl: list = glob('*.txt', false, true) + [''] + + var lln: list> = [[1] + [2]] + assert_equal([[1, 2]], lln) END v9.CheckDefAndScriptSuccess(lines) enddef diff --git a/src/version.c b/src/version.c index 04199782e1..5140eb9520 100644 --- a/src/version.c +++ b/src/version.c @@ -746,6 +746,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ +/**/ + 4293, /**/ 4292, /**/