diff --git a/db.c b/db.c index f44fa13..cbe8d5e 100644 --- a/db.c +++ b/db.c @@ -121,6 +121,21 @@ void sys_close(){ Given a URL, return an idx of the interned URL. ******************************************************************************/ +U32 URL_check(char* str){ + U32 idx = string_hash(str); + + // Linear-probe + char buf[256]; + U32 off; + while((off=map[idx])){ // as long as a map exists for hash, + log_read(off,buf); // look at what it refers to, and + if(!strcmp(str,buf)) // see if it is our needle. If so, + return idx; // we already have it, return it. + idx = (idx+1) & IDX_MASK; // otherwise, linear-probe next. + } + return 0; +} + U32 URL_idx(char* str){ U32 idx = string_hash(str); diff --git a/db.h b/db.h index 32c2f6f..6a53506 100644 --- a/db.h +++ b/db.h @@ -3,4 +3,5 @@ void sys_close(); void idx_sigil(U32 idx,char*sigil); U32 sigil_idx(char* sigil); U32 URL_idx(char* str); +U32 URL_check(char* str); U32 idx_URL(U32 idx,char* buf); diff --git a/gemtext.c b/gemtext.c index 521e9d2..676147a 100644 --- a/gemtext.c +++ b/gemtext.c @@ -91,7 +91,8 @@ render_head - Render a header line, # ## or ### ******************************************************************************/ void render_head(FILE* out, char*p){ int level; - for(level=0;*p=='#';p++,level++); + char *q = p; + for(level=0;*q=='#';q++,level++); switch(level){ case 1: fprintf(out,"\033[93m");break; case 2: fprintf(out,"\033[94;1m");break; diff --git a/lookup.c b/lookup.c index 7d058ad..85cdb23 100644 --- a/lookup.c +++ b/lookup.c @@ -5,28 +5,48 @@ FILE* errlog; #undef ERRLOG -int doit(char* req){ +int sigil(char* req){ char buf[1024]; U32 idx = sigil_idx(req); int ret = idx_URL(idx,buf); if(ret) { - - printf("[%s](@%X)%s\n",req,idx*4,buf); + printf("[%s](@%X) %s\n",req,idx*4,buf); return 0; } else { printf("Not Found\n"); return 1; } } -int main(int argc,char*argv[]){ - if(strlen(argv[1])!=4) { - printf("Usage: lookup XXXX, where XXXX is a 4-char sigil\n"); + +int url(char* url){ + printf("[%s]\n",url); + U32 idx = URL_check(url); + if(idx){ + char sigil[5]; + idx_sigil(idx,sigil); + printf("%s\n",sigil); + return 0; + } else { + printf("Not Found\n"); return 1; } - +} + + +int main(int argc,char*argv[]){ + if(argc>2) { + printf("Usage: lookup XXXX, where XXXX is a 4-char sigil\n"); + printf(" or lookup \n"); + return 1; + } + int ret; sys_open(); - int ret = doit(argv[1]); + if(4==strlen(argv[1])) { + ret = sigil(argv[1]); + } else { + ret = url(argv[1]); + } sys_close(); return ret; }