xref: /vim-8.2.3635/src/create_cmdidxs.vim (revision d94ac0ca)
16de5e126SBram Moolenaar" This script generates the tables cmdidxs1[] and cmdidxs2[][] which,
26de5e126SBram Moolenaar" given a Ex command, determine the first value to probe to find
36de5e126SBram Moolenaar" a matching command in cmdnames[] based on the first character
46de5e126SBram Moolenaar" and the first 2 characters of the command.
56de5e126SBram Moolenaar" This is used to speed up lookup in cmdnames[].
66de5e126SBram Moolenaar"
76de5e126SBram Moolenaar" Script should be run every time new Ex commands are added in Vim,
86de5e126SBram Moolenaar" from the src/vim directory, since it reads commands from "ex_cmds.h".
96de5e126SBram Moolenaar
106de5e126SBram Moolenaarlet cmds = []
116de5e126SBram Moolenaarlet skipped_cmds = 0
126de5e126SBram Moolenaar
13b731689eSBram Moolenaarlet lines = readfile('ex_cmds.h')
14b731689eSBram Moolenaarlet idx = 0
15b731689eSBram Moolenaarwhile idx < len(lines)
16b731689eSBram Moolenaar  let line = lines[idx]
17*d94ac0caSBram Moolenaar  if line =~ '^EXCMD(CMD_'
18*d94ac0caSBram Moolenaar    let m = matchlist(line, '^EXCMD(CMD_\S*,\s*"\([a-z][^"]*\)"')
196de5e126SBram Moolenaar    if len(m) >= 2
206de5e126SBram Moolenaar      let cmds += [ m[1] ]
216de5e126SBram Moolenaar    else
226de5e126SBram Moolenaar      let skipped_cmds += 1
236de5e126SBram Moolenaar    endif
24b731689eSBram Moolenaar
25b731689eSBram Moolenaar    let idx += 1
26b731689eSBram Moolenaar    let flags = lines[idx]
27b731689eSBram Moolenaar    let idx += 1
28b731689eSBram Moolenaar    let addr_type = lines[idx]
29b731689eSBram Moolenaar
30*d94ac0caSBram Moolenaar    if flags =~ '\<EX_RANGE\>'
31b731689eSBram Moolenaar      if addr_type =~ 'ADDR_NONE'
32*d94ac0caSBram Moolenaar        echoerr 'ex_cmds.h:' .. (idx - 1) .. ': Using EX_RANGE with ADDR_NONE: ' .. line
336de5e126SBram Moolenaar      endif
34b731689eSBram Moolenaar    else
35b731689eSBram Moolenaar      if addr_type !~ 'ADDR_NONE'
36b731689eSBram Moolenaar        echoerr 'ex_cmds.h:' .. (idx - 1) .. ': Missing ADDR_NONE: ' .. line
37b731689eSBram Moolenaar      endif
38b731689eSBram Moolenaar    endif
39b731689eSBram Moolenaar
40*d94ac0caSBram Moolenaar    if flags =~ '\<EX_DFLALL\>' && (addr_type =~ 'ADDR_OTHER' || addr_type =~ 'ADDR_NONE')
41*d94ac0caSBram Moolenaar      echoerr 'ex_cmds.h:' .. (idx - 1) .. ': Missing misplaced EX_DFLALL: ' .. line
42b731689eSBram Moolenaar    endif
43b731689eSBram Moolenaar  endif
44b731689eSBram Moolenaar  let idx += 1
45b731689eSBram Moolenaarendwhile
466de5e126SBram Moolenaar
476de5e126SBram Moolenaarlet cmdidxs1 = {}
486de5e126SBram Moolenaarlet cmdidxs2 = {}
496de5e126SBram Moolenaar
506de5e126SBram Moolenaarfor i in range(len(cmds) - 1, 0, -1)
516de5e126SBram Moolenaar  let cmd = cmds[i]
526de5e126SBram Moolenaar  let c1 = cmd[0] " First character of command
536de5e126SBram Moolenaar  let c2 = cmd[1] " Second character of command (if any)
546de5e126SBram Moolenaar
556de5e126SBram Moolenaar  let cmdidxs1{c1} = i
566de5e126SBram Moolenaar  if c2 >= 'a' && c2 <= 'z'
576de5e126SBram Moolenaar    let cmdidxs2{c1}{c2} = i
586de5e126SBram Moolenaar  endif
596de5e126SBram Moolenaarendfor
606de5e126SBram Moolenaar
616de5e126SBram Moolenaarlet output =  [ '/* Automatically generated code by create_cmdidxs.vim' ]
626de5e126SBram Moolenaarlet output += [ ' *' ]
636de5e126SBram Moolenaarlet output += [ ' * Table giving the index of the first command in cmdnames[] to lookup' ]
646de5e126SBram Moolenaarlet output += [ ' * based on the first letter of a command.' ]
656de5e126SBram Moolenaarlet output += [ ' */' ]
666de5e126SBram Moolenaarlet output += [ 'static const unsigned short cmdidxs1[26] =' ]
676de5e126SBram Moolenaarlet output += [ '{' ]
686de5e126SBram Moolenaar
696de5e126SBram Moolenaarlet a_to_z = map(range(char2nr('a'), char2nr('z')), 'nr2char(v:val)')
706de5e126SBram Moolenaarfor c1 in a_to_z
716de5e126SBram Moolenaar  let line = '  /* ' . c1 . ' */ ' . cmdidxs1{c1} . ((c1 == 'z') ? '' : ',')
726de5e126SBram Moolenaar  let output += [ line ]
736de5e126SBram Moolenaarendfor
746de5e126SBram Moolenaarlet output += [ '};' ]
756de5e126SBram Moolenaarlet output += [ '' ]
766de5e126SBram Moolenaarlet output += [ '/*' ]
776de5e126SBram Moolenaarlet output += [ ' * Table giving the index of the first command in cmdnames[] to lookup' ]
786de5e126SBram Moolenaarlet output += [ ' * based on the first 2 letters of a command.' ]
796de5e126SBram Moolenaarlet output += [ ' * Values in cmdidxs2[c1][c2] are relative to cmdidxs1[c1] so that they' ]
806de5e126SBram Moolenaarlet output += [ ' * fit in a byte.' ]
816de5e126SBram Moolenaarlet output += [ ' */' ]
826de5e126SBram Moolenaarlet output += [ 'static const unsigned char cmdidxs2[26][26] =' ]
836de5e126SBram Moolenaarlet output += [ '{ /*         a   b   c   d   e   f   g   h   i   j   k   l   m   n   o   p   q   r   s   t   u   v   w   x   y   z */' ]
846de5e126SBram Moolenaar
856de5e126SBram Moolenaarfor c1 in a_to_z
866de5e126SBram Moolenaar  let line = '  /* ' . c1 . ' */ {'
876de5e126SBram Moolenaar  for c2 in a_to_z
886de5e126SBram Moolenaar    if exists('cmdidxs2{c1}{c2}')
896de5e126SBram Moolenaar      let line .= printf('%3d', cmdidxs2{c1}{c2} - cmdidxs1{c1})
906de5e126SBram Moolenaar    else
916de5e126SBram Moolenaar      let line .= '  0'
926de5e126SBram Moolenaar    endif
936de5e126SBram Moolenaar    let line .= (c2 == 'z') ? '' : ','
946de5e126SBram Moolenaar  endfor
956de5e126SBram Moolenaar  let line .= ' }' . ((c1 == 'z') ? '' : ',')
966de5e126SBram Moolenaar  let output += [ line ]
976de5e126SBram Moolenaarendfor
986de5e126SBram Moolenaar
996de5e126SBram Moolenaarlet output += [ '};' ]
1006de5e126SBram Moolenaarlet output += [ '' ]
1016de5e126SBram Moolenaarlet output += [ 'static const int command_count = ' . (len(cmds) + skipped_cmds) . ';' ]
1026de5e126SBram Moolenaar
1036de5e126SBram Moolenaarcall writefile(output, "ex_cmdidxs.h")
1046de5e126SBram Moolenaarquit
105