annotate src/create_nvcmdidxs.vim @ 27449:b4c147ad4912 v8.2.4253

patch 8.2.4253: using freed memory when substitute with function call Commit: https://github.com/vim/vim/commit/37f47958b8a2a44abc60614271d9537e7f14e51a Author: Bram Moolenaar <Bram@vim.org> Date: Sat Jan 29 14:21:51 2022 +0000 patch 8.2.4253: using freed memory when substitute with function call Problem: Using freed memory when substitute uses a recursive function call. Solution: Make a copy of the substitute text.
author Bram Moolenaar <Bram@vim.org>
date Sat, 29 Jan 2022 15:30:04 +0100
parents 4050f0554902
children ee1019e59bef
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
27447
4050f0554902 patch 8.2.4252: generating the normal command table at runtime is inefficient
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1 vim9script
4050f0554902 patch 8.2.4252: generating the normal command table at runtime is inefficient
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2
4050f0554902 patch 8.2.4252: generating the normal command table at runtime is inefficient
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3 # This script generates the table nv_cmd_idx[] which contains the index in
4050f0554902 patch 8.2.4252: generating the normal command table at runtime is inefficient
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4 # nv_cmds[] table (normal.c) for each of the command character supported in
4050f0554902 patch 8.2.4252: generating the normal command table at runtime is inefficient
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
5 # normal/visual mode.
4050f0554902 patch 8.2.4252: generating the normal command table at runtime is inefficient
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
6 # This is used to speed up the command lookup in nv_cmds[].
4050f0554902 patch 8.2.4252: generating the normal command table at runtime is inefficient
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
7 #
4050f0554902 patch 8.2.4252: generating the normal command table at runtime is inefficient
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
8 # Script should be run using "make nvcmdidxs", every time the nv_cmds[] table
4050f0554902 patch 8.2.4252: generating the normal command table at runtime is inefficient
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
9 # in src/normal.c changes.
4050f0554902 patch 8.2.4252: generating the normal command table at runtime is inefficient
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
10
4050f0554902 patch 8.2.4252: generating the normal command table at runtime is inefficient
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
11 def Create_nvcmdidxs_table()
4050f0554902 patch 8.2.4252: generating the normal command table at runtime is inefficient
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
12 var nv_cmdtbl: list<dict<number>> = []
4050f0554902 patch 8.2.4252: generating the normal command table at runtime is inefficient
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
13
4050f0554902 patch 8.2.4252: generating the normal command table at runtime is inefficient
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
14 # Generate the table of normal/visual mode command characters and their
4050f0554902 patch 8.2.4252: generating the normal command table at runtime is inefficient
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
15 # corresponding index.
4050f0554902 patch 8.2.4252: generating the normal command table at runtime is inefficient
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
16 var idx: number = 0
4050f0554902 patch 8.2.4252: generating the normal command table at runtime is inefficient
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
17 var ch: number
4050f0554902 patch 8.2.4252: generating the normal command table at runtime is inefficient
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
18 while true
4050f0554902 patch 8.2.4252: generating the normal command table at runtime is inefficient
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
19 ch = internal_get_nv_cmdchar(idx)
4050f0554902 patch 8.2.4252: generating the normal command table at runtime is inefficient
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
20 if ch == -1
4050f0554902 patch 8.2.4252: generating the normal command table at runtime is inefficient
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
21 break
4050f0554902 patch 8.2.4252: generating the normal command table at runtime is inefficient
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
22 endif
4050f0554902 patch 8.2.4252: generating the normal command table at runtime is inefficient
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
23 add(nv_cmdtbl, {idx: idx, cmdchar: ch})
4050f0554902 patch 8.2.4252: generating the normal command table at runtime is inefficient
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
24 idx += 1
4050f0554902 patch 8.2.4252: generating the normal command table at runtime is inefficient
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
25 endwhile
4050f0554902 patch 8.2.4252: generating the normal command table at runtime is inefficient
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
26
4050f0554902 patch 8.2.4252: generating the normal command table at runtime is inefficient
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
27 # sort the table by the command character
4050f0554902 patch 8.2.4252: generating the normal command table at runtime is inefficient
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
28 sort(nv_cmdtbl, (a, b) => a.cmdchar - b.cmdchar)
4050f0554902 patch 8.2.4252: generating the normal command table at runtime is inefficient
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
29
4050f0554902 patch 8.2.4252: generating the normal command table at runtime is inefficient
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
30 # Compute the highest index upto which the command character can be directly
4050f0554902 patch 8.2.4252: generating the normal command table at runtime is inefficient
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
31 # used as an index.
4050f0554902 patch 8.2.4252: generating the normal command table at runtime is inefficient
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
32 var nv_max_linear: number = 0
4050f0554902 patch 8.2.4252: generating the normal command table at runtime is inefficient
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
33 for i in range(nv_cmdtbl->len())
4050f0554902 patch 8.2.4252: generating the normal command table at runtime is inefficient
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
34 if i != nv_cmdtbl[i].cmdchar
4050f0554902 patch 8.2.4252: generating the normal command table at runtime is inefficient
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
35 nv_max_linear = i - 1
4050f0554902 patch 8.2.4252: generating the normal command table at runtime is inefficient
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
36 break
4050f0554902 patch 8.2.4252: generating the normal command table at runtime is inefficient
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
37 endif
4050f0554902 patch 8.2.4252: generating the normal command table at runtime is inefficient
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
38 endfor
4050f0554902 patch 8.2.4252: generating the normal command table at runtime is inefficient
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
39
4050f0554902 patch 8.2.4252: generating the normal command table at runtime is inefficient
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
40 # Generate a header file with the table
4050f0554902 patch 8.2.4252: generating the normal command table at runtime is inefficient
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
41 var output: list<string> =<< trim END
4050f0554902 patch 8.2.4252: generating the normal command table at runtime is inefficient
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
42 /*
4050f0554902 patch 8.2.4252: generating the normal command table at runtime is inefficient
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
43 * Automatically generated code by the create_nvcmdidxs.vim script.
4050f0554902 patch 8.2.4252: generating the normal command table at runtime is inefficient
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
44 *
4050f0554902 patch 8.2.4252: generating the normal command table at runtime is inefficient
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
45 * Table giving the index in nv_cmds[] to lookup based on
4050f0554902 patch 8.2.4252: generating the normal command table at runtime is inefficient
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
46 * the command character.
4050f0554902 patch 8.2.4252: generating the normal command table at runtime is inefficient
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
47 */
4050f0554902 patch 8.2.4252: generating the normal command table at runtime is inefficient
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
48
4050f0554902 patch 8.2.4252: generating the normal command table at runtime is inefficient
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
49 // nv_cmd_idx[<normal mode command character>] => nv_cmds[] index
4050f0554902 patch 8.2.4252: generating the normal command table at runtime is inefficient
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
50 static const unsigned short nv_cmd_idx[] =
4050f0554902 patch 8.2.4252: generating the normal command table at runtime is inefficient
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
51 {
4050f0554902 patch 8.2.4252: generating the normal command table at runtime is inefficient
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
52 END
4050f0554902 patch 8.2.4252: generating the normal command table at runtime is inefficient
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
53
4050f0554902 patch 8.2.4252: generating the normal command table at runtime is inefficient
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
54 # Add each command character in comment and the corresponding index
4050f0554902 patch 8.2.4252: generating the normal command table at runtime is inefficient
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
55 var tbl: list<string> = mapnew(nv_cmdtbl, (k, v) =>
4050f0554902 patch 8.2.4252: generating the normal command table at runtime is inefficient
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
56 ' /* ' .. printf('%5d', v.cmdchar) .. ' */ ' ..
4050f0554902 patch 8.2.4252: generating the normal command table at runtime is inefficient
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
57 printf('%3d', v.idx) .. ','
4050f0554902 patch 8.2.4252: generating the normal command table at runtime is inefficient
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
58 )
4050f0554902 patch 8.2.4252: generating the normal command table at runtime is inefficient
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
59 output += tbl
4050f0554902 patch 8.2.4252: generating the normal command table at runtime is inefficient
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
60
4050f0554902 patch 8.2.4252: generating the normal command table at runtime is inefficient
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
61 output += [ '};', '',
4050f0554902 patch 8.2.4252: generating the normal command table at runtime is inefficient
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
62 '// The highest index for which',
4050f0554902 patch 8.2.4252: generating the normal command table at runtime is inefficient
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
63 '// nv_cmds[idx].cmd_char == nv_cmd_idx[nv_cmds[idx].cmd_char]']
4050f0554902 patch 8.2.4252: generating the normal command table at runtime is inefficient
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
64 output += ['static const int nv_max_linear = ' .. nv_max_linear .. ';']
4050f0554902 patch 8.2.4252: generating the normal command table at runtime is inefficient
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
65
4050f0554902 patch 8.2.4252: generating the normal command table at runtime is inefficient
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
66 writefile(output, "nv_cmdidxs.h")
4050f0554902 patch 8.2.4252: generating the normal command table at runtime is inefficient
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
67 enddef
4050f0554902 patch 8.2.4252: generating the normal command table at runtime is inefficient
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
68
4050f0554902 patch 8.2.4252: generating the normal command table at runtime is inefficient
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
69 Create_nvcmdidxs_table()
4050f0554902 patch 8.2.4252: generating the normal command table at runtime is inefficient
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
70 quit
4050f0554902 patch 8.2.4252: generating the normal command table at runtime is inefficient
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
71
4050f0554902 patch 8.2.4252: generating the normal command table at runtime is inefficient
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
72 # vim: shiftwidth=2 sts=2 expandtab