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