w3m

Unnamed repository; edit this file to name it for gitweb.
git clone https://logand.com/git/w3m.git/
Log | Files | Refs | README

commit 3ef23faabd8c656f0f26984d15e260349705202a
parent 398ef613664fb700917ab2c499d4c5b18fb0fe36
Author: ukai <ukai>
Date:   Mon, 10 Dec 2001 17:02:43 +0000

[w3m-dev 02651] search keymap using hash
From: Hironori Sakamoto <hsaka@mth.biglobe.ne.jp>

Diffstat:
M.cvsignore | 1+
MChangeLog | 49+++++++++++++++++++++++++++++++++++++++++++++++++
MXMakefile | 7++++++-
Mfile.c | 3+--
Mfm.h | 1-
Mfunc.c | 90++++++++++++++-----------------------------------------------------------------
Mfunc.h | 16+++++-----------
Afunctable.awk | 9+++++++++
Mhash.c | 3++-
Mhash.h | 61++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++-
Mhistory.c | 8++++----
Mhistory.h | 2+-
Mindep.c | 2+-
Mmain.c | 11+++++------
Mmenu.c | 7+------
Mmyctype.c | 26+++++++++++++-------------
Mproto.h | 6++----
17 files changed, 176 insertions(+), 126 deletions(-)

diff --git a/.cvsignore b/.cvsignore @@ -4,6 +4,7 @@ config.param funcname.c funcname1.h funcname2.h +functable.c tagtable.c inflate mktable diff --git a/ChangeLog b/ChangeLog @@ -1,3 +1,52 @@ +2001-12-11 Hironori Sakamoto <hsaka@mth.biglobe.ne.jp> + + * [w3m-dev 02651] search keymap using hash + * XMakefile (func.c): depends functable.c funcname1.h + * XMakefile (functable.c): generated from funcname.tab + * functable.awk: added + * fm.h (w3mKeyList): deleted + * func.c (w3mKeyList): ditto + * file.c (readHeader): change getFuncList() + * func.c (w3mNFuncList): deleted + * func.c (functable.c): include + * func.c (initKeymap): no need to count w3mFuncList + * func.c (initKeymap): change getFuncList() + * func.c (initKeymap): put data to keyData hashtable + * func.c (countFuncList): deleted + * func.c (getFuncList): use getHash_si() + * func.c (getKeyData): use getHash_iv() + * func.c (addKeyList): deleted + * func.c (searchKeyList): deleted + * func.h (textlist.h): include + * func.h (hash.h): include + * func.h (KEY_HASH_SIZE): added + * func.h (KeyListItem): deleted + * func.h (KeyList): deleted + * hash.c: s/hist/sv/ + * hash.c: add defhashfunc_i(int, void *, iv) + * hash.h: s/hist/sv/ + * hash.h: defhash(int, void *, iv) + * hash.h (putHash_*): added + * hash.h (getHash_*): added + * hash.h (defhashfunc_i): added + * history.c (pushHashHist): s/hist/sv/ + * history.c (getHashHist): s/hist/sv/ + * history.h (Hist): s/hist/sv/ + * main.c (searchKeyData): item deleted + * main.c (searchKeyData): data added + * main.c (searchKeyData): use getKayData() instead of searchKeyList() + * main.c (setAlarm): w3mNFuncList deleted + * main.c (setAlarm): change getFuncList() + * menu.c (w3mNFuncList): deleted + * menu.c (w3mFuncList): deleted + * menu.c (initMenu): no need to count w3mFuncList + * menu.c (setMenuItem): change getFuncList() + * proto.h (countFuncList): deleted + * proto.h (getFuncList): change args + * proto.h (addKeyList): deleted + * proto.h (searchKeyList): deleted + * proto.h (getKeyData): added + 2001-12-11 Kiyokazu SUTO <suto@ks-and-ks.ne.jp> * [w3m-dev 02650] diff --git a/XMakefile b/XMakefile @@ -54,7 +54,7 @@ tagtable.c: html.h tagtable.tab mktable$(EXT) # entity.h: html.h entity.tab mktable$(EXT) # ./mktable 100 entity.tab > entity.h -func.o: funcname.c +func.o: funcname.c functable.c funcname1.h keybind.o: funcname2.h keybind_lynx.o: funcname2.h parsetagx.o: html.c @@ -68,6 +68,11 @@ funcname1.h: funcname.tab funcname2.h: funcname.tab sort funcname.tab | awk -f funcname2.awk > funcname2.h +functable.c: funcname.tab mktable$(EXT) + sort funcname.tab | awk -f functable.awk > functable.tab + ./mktable$(EXT) 100 functable.tab > functable.c + -rm -f functable.tab + mktable$(EXT): mktable.o hash.o $(ALIB) $(GCTARGET) $(CC) $(CFLAGS) -o mktable$(EXT) mktable.o hash.o $(LIBS2) diff --git a/file.c b/file.c @@ -768,14 +768,13 @@ readHeader(URLFile *uf, Buffer *newBuf, int thru, ParsedURL *pu) uf->scheme == SCM_LOCAL_CGI) { Str funcname = Strnew(); int f; - extern int w3mNFuncList; p = lineBuf2->ptr + 12; SKIP_BLANKS(p); while (*p && !IS_SPACE(*p)) Strcat_char(funcname, *(p++)); SKIP_BLANKS(p); - f = getFuncList(funcname->ptr, w3mFuncList, w3mNFuncList); + f = getFuncList(funcname->ptr); if (f >= 0) { tmp = Strnew_charp(p); Strchop(tmp); diff --git a/fm.h b/fm.h @@ -640,7 +640,6 @@ extern char EscDKeymap[]; extern char PcKeymap[]; #endif extern FuncList w3mFuncList[]; -extern KeyList w3mKeyList; global char *HTTP_proxy init(NULL); #ifdef USE_GOPHER diff --git a/func.c b/func.c @@ -10,11 +10,10 @@ #include "myctype.h" #include "funcname.c" -int w3mNFuncList = 0; +#include "functable.c" -KeyList w3mKeyList = { - NULL, 0, 0 -}; +#define KEYDATA_HASH_SIZE 16 +static Hash_iv *keyData = NULL; void initKeymap(void) @@ -28,9 +27,6 @@ initKeymap(void) int verbose = 1; extern int str_to_bool(char *value, int old); - if (!w3mNFuncList) - w3mNFuncList = countFuncList(w3mFuncList); - if ((kf = fopen(rcFile(KEYMAP_FILE), "rt")) == NULL) return; @@ -70,7 +66,7 @@ initKeymap(void) continue; } s = getWord(&p); - f = getFuncList(s, w3mFuncList, w3mNFuncList); + f = getFuncList(s); if (f < 0) { emsg = Sprintf("line %d: invalid command '%s'", lineno, s)->ptr; record_err_message(emsg); @@ -87,41 +83,27 @@ initKeymap(void) else GlobalKeymap[c] = f; s = getQWord(&p); - addKeyList(&w3mKeyList, c, s); + if (*s) { + if (keyData == NULL) + keyData = newHash_iv(KEYDATA_HASH_SIZE); + putHash_iv(keyData, c, (void *)s); + } } fclose(kf); } int -countFuncList(FuncList *list) +getFuncList(char *id) { - int i; - - for (i = 0; list->id != NULL; i++, list++) ; - return i; + return getHash_si(&functable, id, -1); } -int -getFuncList(char *id, FuncList *list, int nlist) +char * +getKeyData(int key) { - int i, is, ie, m; - - if (id == NULL || *id == '\0' || nlist <= 0) - return -1; - - is = 0; - ie = nlist - 1; - while (1) { - i = is + (ie - is) / 2; - if ((m = strcmp(id, list[i].id)) == 0) - return i; - else if (is >= ie) - return -1; - else if (m > 0) - is = i + 1; - else - ie = i - 1; - } + if (keyData == NULL) + return NULL; + return (char *)getHash_iv(keyData, key, NULL); } int @@ -240,46 +222,6 @@ getKey(char *s) return -1; } -void -addKeyList(KeyList *list, int key, char *data) -{ - KeyListItem *item; - - if (data == NULL || *data == '\0') - data = NULL; - else - data = allocStr(data, -1); - item = searchKeyList(list, key); - if (item == NULL) { - if (data == NULL) - return; - list->nitem++; - if (list->nitem > list->size) { - list->size = (list->size >= 2) ? (list->size * 3 / 2) : 2; - list->item = New_Reuse(KeyListItem, list->item, - list->size * sizeof(KeyListItem)); - } - item = &(list->item[list->nitem - 1]); - item->key = key; - } - item->data = data; -} - -KeyListItem * -searchKeyList(KeyList *list, int key) -{ - int i; - KeyListItem *item; - - if (list == NULL) - return NULL; - for (i = 0, item = list->item; i < list->nitem; i++, item++) { - if (key == item->key) - return item; - } - return NULL; -} - char * getWord(char **str) { diff --git a/func.h b/func.h @@ -6,6 +6,11 @@ #ifndef FUNC_H #define FUNC_H +#include "textlist.h" +#include "hash.h" + +#define KEY_HASH_SIZE 127 + #define K_ESC 0x100 #define K_ESCB 0x200 #define K_ESCD 0x400 @@ -15,15 +20,4 @@ typedef struct _FuncList { void (*func) (); } FuncList; -typedef struct _KeyListItem { - int key; - char *data; -} KeyListItem; - -typedef struct _KeyList { - KeyListItem *item; - int nitem; - int size; -} KeyList; - #endif /* not FUNC_H */ diff --git a/functable.awk b/functable.awk @@ -0,0 +1,9 @@ +BEGIN { + print "#include <stdio.h>" + print "#include \"funcname1.h\"" + print "%%" +} +/^#/ { next } +{ + print $1 " FUNCNAME_" $2; +} diff --git a/hash.c b/hash.c @@ -25,5 +25,6 @@ hashfunc(char *s) /* *INDENT-OFF* */ defhashfunc(char *, int, si) defhashfunc(char *, char *, ss) -defhashfunc(char *, void *, hist) +defhashfunc(char *, void *, sv) +defhashfunc_i(int, void *, iv) /* *INDENT-ON* */ diff --git a/hash.h b/hash.h @@ -20,7 +20,8 @@ extern type getHash_##sym(Hash_##sym *t, keytype key, type failval); defhash(char *, int, si) defhash(char *, char *, ss) -defhash(char *, void *, hist) +defhash(char *, void *, sv) +defhash(int, void *, iv) #define defhashfunc(keytype,type,sym) \ Hash_##sym * \ newHash_##sym(int size)\ @@ -79,4 +80,62 @@ getHash_##sym(Hash_##sym *t, keytype key, type failval)\ return failval;\ return hi->value;\ } +#define defhashfunc_i(keytype,type,sym) \ +Hash_##sym * \ +newHash_##sym(int size)\ +{\ + struct Hash_##sym *hash;\ + int i;\ +\ + hash = (Hash_##sym*)GC_malloc(sizeof(Hash_##sym));\ + hash->size = size;\ + hash->tab = (HashItem_##sym**)GC_malloc(size*sizeof(HashItem_##sym*));\ + for (i = 0; i < size; i++)\ + hash->tab[i] = NULL;\ + return hash;\ +}\ +\ +static HashItem_##sym* \ +lookupHash_##sym(Hash_##sym *t, keytype key, int *hashval_return)\ +{\ + HashItem_##sym *hi;\ +\ + *hashval_return = key%t->size;\ + for (hi = t->tab[*hashval_return]; hi != NULL; hi = hi->next) {\ + if (hi->key == key)\ + return hi;\ + }\ + return NULL;\ +}\ +\ +void \ +putHash_##sym(Hash_##sym *t, keytype key, type value)\ +{\ + int h;\ + HashItem_##sym *hi;\ +\ + hi = lookupHash_##sym(t,key,&h);\ + if (hi) {\ + hi->value = value;\ + return;\ + }\ +\ + hi = (HashItem_##sym*)GC_malloc(sizeof(HashItem_##sym));\ + hi->key = key;\ + hi->value = value;\ + hi->next = t->tab[h];\ + t->tab[h] = hi;\ +}\ +\ +type \ +getHash_##sym(Hash_##sym *t, keytype key, type failval)\ +{\ + int h;\ + HashItem_##sym *hi;\ +\ + hi = lookupHash_##sym(t,key,&h);\ + if (hi == NULL)\ + return failval;\ + return hi->value;\ +} #endif /* not HASH_H */ diff --git a/history.c b/history.c @@ -140,7 +140,7 @@ pushHashHist(Hist *hist, char *ptr) hist->list->nitem--; } item = pushHist(hist, ptr); - putHash_hist(hist->hash, ptr, (void *)item); + putHash_sv(hist->hash, ptr, (void *)item); return item; } @@ -152,11 +152,11 @@ getHashHist(Hist *hist, char *ptr) if (hist == NULL || hist->list == NULL) return NULL; if (hist->hash == NULL) { - hist->hash = newHash_hist(HIST_HASH_SIZE); + hist->hash = newHash_sv(HIST_HASH_SIZE); for (item = hist->list->first; item; item = item->next) - putHash_hist(hist->hash, (char *)item->ptr, (void *)item); + putHash_sv(hist->hash, (char *)item->ptr, (void *)item); } - return (HistItem *)getHash_hist(hist->hash, ptr, NULL); + return (HistItem *)getHash_sv(hist->hash, ptr, NULL); } char * diff --git a/history.h b/history.h @@ -14,7 +14,7 @@ typedef GeneralList HistList; typedef struct { HistList *list; HistItem *current; - Hash_hist *hash; + Hash_sv *hash; } Hist; extern Hist *newHist(); diff --git a/indep.c b/indep.c @@ -33,7 +33,7 @@ allocStr(const char *s, int len) int strCmp(const void *s1, const void *s2) { - return strcmp(*(const char **)s1, *(const char **)s2); + return strcmp(*(const char **)s1, *(const char **)s2); } char * diff --git a/main.c b/main.c @@ -4615,7 +4615,7 @@ set_buffer_environ(Buffer *buf) char * searchKeyData(void) { - KeyListItem *item; + char *data; if (CurrentKeyData != NULL && *CurrentKeyData != '\0') return allocStr(CurrentKeyData, -1); @@ -4625,10 +4625,10 @@ searchKeyData(void) #endif if (CurrentKey < 0) return NULL; - item = searchKeyList(&w3mKeyList, CurrentKey); - if (item == NULL || item->data == NULL || *item->data == '\0') + data = getKeyData(CurrentKey); + if (data == NULL || *data == '\0') return NULL; - return allocStr(item->data, -1); + return allocStr(data, -1); } static int @@ -4700,7 +4700,6 @@ setAlarm(void) { char *data; int sec = 0, cmd = -1; - extern int w3mNFuncList; CurrentKeyData = NULL; /* not allowed in w3m-control: */ data = searchKeyData(); @@ -4714,7 +4713,7 @@ setAlarm(void) if (*data != '\0') { sec = atoi(getWord(&data)); if (sec > 0) - cmd = getFuncList(getWord(&data), w3mFuncList, w3mNFuncList); + cmd = getFuncList(getWord(&data)); } if (cmd >= 0) { setAlarmEvent(sec, AL_EXPLICIT, cmd, getQWord(&data)); diff --git a/menu.c b/menu.c @@ -329,8 +329,6 @@ static MenuItem MainMenuItem[] = { /* --- MainMenu (END) --- */ -extern int w3mNFuncList; -extern FuncList w3mFuncList[]; static MenuList *w3mMenuList; static Menu *CurrentMenu = NULL; @@ -1421,9 +1419,6 @@ initMenu(void) if ((mf = fopen(rcFile(MENU_FILE), "rt")) == NULL) goto create_menu; - if (!w3mNFuncList) - w3mNFuncList = countFuncList(w3mFuncList); - in_menu = 0; while (!feof(mf)) { line = Strfgets(mf); @@ -1501,7 +1496,7 @@ setMenuItem(MenuItem *item, char *type, char *line) return -1; item->type = MENU_FUNC; item->label = label; - f = getFuncList(func, w3mFuncList, w3mNFuncList); + f = getFuncList(func); item->func = w3mFuncList[(f >= 0) ? f : FUNCNAME_nulcmd].func; item->keys = keys; item->data = data; diff --git a/myctype.c b/myctype.c @@ -30,42 +30,42 @@ unsigned char MYCTYPE_MAP[0x100] = { unsigned char MYCTYPE_DIGITMAP[0x100] = { /* NUL SOH STX ETX EOT ENQ ACK BEL BS HT LF VT FF CR SO SI */ 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, - 255, + 255, /* DLE DC1 DC2 DC3 DC4 NAK SYN ETB CAN EM SUB ESC FS GS RS US */ 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, - 255, + 255, /* SPC ! " # $ % & ' ( ) * + , - . / */ 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, - 255, + 255, /* 0 1 2 3 4 5 6 7 8 9 : ; < = > ? */ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 255, 255, 255, 255, 255, 255, /* @ A B C D E F G H I J K L M N O */ 255, 10, 11, 12, 13, 14, 15, 255, 255, 255, 255, 255, 255, 255, 255, 255, /* P Q R S T U V W X Y Z [ \ ] ^ _ */ 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, - 255, + 255, /* ` a b c d e f g h i j k l m n o */ 255, 10, 11, 12, 13, 14, 15, 255, 255, 255, 255, 255, 255, 255, 255, 255, /* p q r s t u v w x y z { | } ~ DEL */ 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, - 255, + 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, - 255, + 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, - 255, + 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, - 255, + 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, - 255, + 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, - 255, + 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, - 255, + 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, - 255, + 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, - 255, + 255, }; diff --git a/proto.h b/proto.h @@ -520,11 +520,9 @@ extern void msToggle(void); extern char *searchKeyData(void); extern void initKeymap(void); -extern int countFuncList(FuncList *list); -extern int getFuncList(char *id, FuncList *list, int nlist); +extern int getFuncList(char *id); extern int getKey(char *s); -extern void addKeyList(KeyList *list, int key, char *data); -extern KeyListItem *searchKeyList(KeyList *list, int key); +extern char *getKeyData(int key); extern char *getWord(char **str); extern char *getQWord(char **str);