Use binary search for name to function lookup. Fix name mapping table order. Rework test scripts.

This commit is contained in:
Renaud 2021-07-21 16:40:36 +08:00
parent 6f7d89b1ac
commit 521d96fbda
7 changed files with 45 additions and 35 deletions

View File

@ -67,3 +67,4 @@ set %D 0 # looking EAST
beginning-of-file
set $curline 3
set $curcol 1
unmark-buffer

2
eval.c
View File

@ -35,8 +35,6 @@
#define MAXVARS 255
#define ARRAY_SIZE(a) (sizeof(a) / sizeof(a[0]))
/* Macro argument token types */
#define TKNUL 0 /* end-of-string */

View File

@ -61,3 +61,8 @@ set %NC &asc "█"
!endwhile
set $curline 3
set $curcol 1
select-buffer stack
unmark-buffer
select-buffer %thisbuf
unmark-buffer
delete-buffer stack

18
input.c
View File

@ -157,24 +157,6 @@ int ectoc( int c) {
return c ;
}
/*
* match fname to a function in the names table
* and return any match or NULL if none
*
* char *fname; name to attempt to match
*/
const name_bind *fncmatch( char *fname) {
const name_bind *ffp ; /* pointer to entry in name binding table */
/* scan through the table, returning any match */
for( ffp = names ; ffp->n_func != NULL ; ffp++)
if( strcmp( fname, bind_name( ffp)) == 0)
break ;
return ffp ;
}
const name_bind *getfncnb( fnp_t func) {
const name_bind *nptr ; /* pointer into the name binding table */

View File

@ -29,7 +29,6 @@ int newmlargt( char **outbufref, const char *prompt, int size) ;
int ectoc( int c) ;
/* Look up in names to function association table */
const name_bind *fncmatch( char *name) ; /* by name */
const name_bind *getname( void) ; /* interactively */
const name_bind *getfncnb( fnp_t func) ; /* by function */

51
names.c
View File

@ -8,6 +8,8 @@
* processing.
*/
#include <string.h>
#include "basic.h"
#include "bind.h"
#include "bindable.h"
@ -22,13 +24,14 @@
#include "random.h"
#include "search.h"
#include "spawn.h"
#include "util.h"
#include "window.h"
#include "word.h"
const name_bind names[] = {
{" abort-command", ctrlg} ,
{" add-mode", setemode} ,
{" add-global-mode", setgmode} ,
{" add-mode", setemode} ,
#if APROP
{" apropos", apro} ,
#endif
@ -55,8 +58,8 @@ const name_bind names[] = {
{" ctlx-prefix", cex} ,
{"!delete-blank-lines", deblank} ,
{" delete-buffer", killbuffer} ,
{" delete-mode", delmode} ,
{" delete-global-mode", delgmode} ,
{" delete-mode", delmode} ,
{"!delete-next-character", forwdel} ,
{"!delete-next-word", delfword} ,
{" delete-other-windows", onlywind} ,
@ -80,14 +83,6 @@ const name_bind names[] = {
{" execute-file", execfile} ,
{" execute-macro", ctlxe} ,
{" execute-macro-1", cbuf1} ,
{" execute-macro-2", cbuf2} ,
{" execute-macro-3", cbuf3} ,
{" execute-macro-4", cbuf4} ,
{" execute-macro-5", cbuf5} ,
{" execute-macro-6", cbuf6} ,
{" execute-macro-7", cbuf7} ,
{" execute-macro-8", cbuf8} ,
{" execute-macro-9", cbuf9} ,
{" execute-macro-10", cbuf10} ,
{" execute-macro-11", cbuf11} ,
{" execute-macro-12", cbuf12} ,
@ -98,6 +93,7 @@ const name_bind names[] = {
{" execute-macro-17", cbuf17} ,
{" execute-macro-18", cbuf18} ,
{" execute-macro-19", cbuf19} ,
{" execute-macro-2", cbuf2} ,
{" execute-macro-20", cbuf20} ,
{" execute-macro-21", cbuf21} ,
{" execute-macro-22", cbuf22} ,
@ -108,6 +104,7 @@ const name_bind names[] = {
{" execute-macro-27", cbuf27} ,
{" execute-macro-28", cbuf28} ,
{" execute-macro-29", cbuf29} ,
{" execute-macro-3", cbuf3} ,
{" execute-macro-30", cbuf30} ,
{" execute-macro-31", cbuf31} ,
{" execute-macro-32", cbuf32} ,
@ -118,7 +115,13 @@ const name_bind names[] = {
{" execute-macro-37", cbuf37} ,
{" execute-macro-38", cbuf38} ,
{" execute-macro-39", cbuf39} ,
{" execute-macro-4", cbuf4} ,
{" execute-macro-40", cbuf40} ,
{" execute-macro-5", cbuf5} ,
{" execute-macro-6", cbuf6} ,
{" execute-macro-7", cbuf7} ,
{" execute-macro-8", cbuf8} ,
{" execute-macro-9", cbuf9} ,
{" execute-named-command", namedcmd} ,
#if PROC
{" execute-procedure", execproc} ,
@ -137,9 +140,9 @@ const name_bind names[] = {
#endif
{" grow-window", enlargewind} ,
{"!handle-tab", insert_tab} ,
{" hunt-forward", forwhunt} ,
{" hunt-backward", backhunt} ,
{" help", help} ,
{" hunt-backward", backhunt} ,
{" hunt-forward", forwhunt} ,
{" i-shell", spawncli} ,
#if ISRCH
{" incremental-search", fisearch} ,
@ -186,9 +189,9 @@ const name_bind names[] = {
{"!quote-character", quote} ,
{"!read-file", fileread} ,
{" redraw-display", reposition} ,
{"!replace-string", sreplace} ,
{" resize-window", resize} ,
{" restore-window", restwnd} ,
{"!replace-string", sreplace} ,
#if ISRCH
{" reverse-incremental-search", risearch} ,
#endif
@ -197,8 +200,8 @@ const name_bind names[] = {
#endif
{"!save-file", filesave} ,
{" save-window", savewnd} ,
{" scroll-next-up", scrnextup} ,
{" scroll-next-down", scrnextdw} ,
{" scroll-next-up", scrnextup} ,
{" search-forward", forwsearch} ,
{" search-reverse", backsearch} ,
{" select-buffer", usebuffer} ,
@ -232,4 +235,24 @@ const name_bind names[] = {
{" ", NULL}
};
const name_bind *fncmatch( char *name) {
int found = ARRAY_SIZE( names) - 1 ; /* index of last entry/ catch all */
int low = 0 ;
int high = found - 1 ;
do {
int cur = (high + low) / 2 ;
int s = strcmp( name, bind_name( &names[ cur])) ;
if( s < 0)
high = cur - 1 ;
else if( s == 0) {
found = cur ;
break ;
} else
low = cur + 1 ;
} while( low <= high) ;
return &names[ found] ;
}
/* end of names.c */

View File

@ -15,4 +15,6 @@ typedef struct name_bind {
extern const name_bind names[] ; /* name to function mapping table */
const name_bind *fncmatch( char *name) ; /* look up by name */
#endif