X-Git-Url: http://git.jankratochvil.net/?p=timeplan.git;a=blobdiff_plain;f=timeplan.c;h=ebf202dd238538341c752d9364a8243c7bd17deb;hp=357f9d047b5ad1a03448db38fedf92375ade2d35;hb=refs%2Ftags%2Frel1_0_1;hpb=a8c2028ced26bf5950b0f81d92bafddc93d0a053 diff --git a/timeplan.c b/timeplan.c index 357f9d0..ebf202d 100644 --- a/timeplan.c +++ b/timeplan.c @@ -10,7 +10,7 @@ #include #define ACTS_MAX 20 -#define HASH_SIZE 211 +#define HASH_SIZE 971 #define CONFIGFILE "/.timeplanrc" /* HOME prepended */ #define DEF_TIMEPLAN "/.timeplan" /* HOME prepended */ #define MARK_DAY "_days" @@ -25,7 +25,7 @@ #define ERRNO2 strerror(errno) #define FAKEUSE =0 -static const char version[]="This is TimePlan, version 1.0\n"; +static const char version[]="This is TimePlan, version 1.0.1\n"; static const char *pname; static char *finame; static FILE *fi; @@ -191,6 +191,7 @@ static unsigned calchash(const char *s) unsigned r=57; while (*s) r=r*7+11*toupper(*s++); + r=r%HASH_SIZE; return r; } @@ -201,7 +202,7 @@ struct action **actionp,*action; if (!*what) return; if (verbose) printf("storeone: %d: %s\n",length,what); - for (actionp=hashtable+(calchash(what)%HASH_SIZE);(action=*actionp);actionp=&action->next) + for (actionp=hashtable+calchash(what);(action=*actionp);actionp=&action->next) if (!strcasecmp(action->what,what)) break; if (!action) { if (!(action=malloc(sizeof(*action)+strlen(what)))) { @@ -470,22 +471,86 @@ enum { PATT_START,PATT_MID,PATT_END,PATT_TERM } pattpos; /* NOTREACHED */ } +static struct modifycache { + struct modifycache *next; + char src[1]; /* dst[1] follows after '\0' */ + } *mcachetable[HASH_SIZE]; +static unsigned long modifycache_hits; + +static char *modify_cached(char *what) +{ +struct modifycache **mcachep,*mcache; +char *dst; +size_t whatl; + + if (!*what) + return(NULL); + whatl=strlen(what); + if (verbose) printf("modify_cached: %s\n",what); + for (mcachep=mcachetable+calchash(what);(mcache=*mcachep);mcachep=&mcache->next) + if (!strcasecmp(mcache->src,what)) break; + if (!mcache) { + dst=modify(what); + if (!(mcache=malloc(sizeof(*mcache)+whatl+1+(dst?strlen(dst):0)))) { + fprintf(ERRH1"malloc() for \"%s\""ERRNO1,ERRH2,what,ERRNO2); + exit(EXIT_FAILURE); + } + mcache->next=NULL; + memcpy(mcache->src,what,whatl+1); + if (dst) + strcpy(mcache->src+whatl+1,dst); + else + mcache->src[whatl+1]='\0'; /* dst will be empty */ + *mcachep=mcache; + } + else { + if (verbose) printf("cache hit.\n"); + /* if (verbose) would be performance hit */ + modifycache_hits++; + } + if (!mcache->src[whatl+1]) + return(NULL); + return(mcache->src+whatl+1); +} + +static void modify_cached_stats(void) +{ +struct modifycache **mcachep,*mcache; +unsigned long depth,maxdepth=0,entries_total=0; +#define MODIFYCACHE_CALLS (modifycache_hits+entries_total) + + for (mcachep=mcachetable;mcachepnext) + depth++; + if (depth>maxdepth) + maxdepth=depth; + entries_total+=depth; + } + printf("modify_cached cache stats: hits=%u.%02u%% (%lu/%lu), HASH_SIZE=%d, maxdepth=%lu\n", + (unsigned)( 100*modifycache_hits/MODIFYCACHE_CALLS ), + (unsigned)((10000*modifycache_hits/MODIFYCACHE_CALLS)%100), + modifycache_hits,MODIFYCACHE_CALLS, + HASH_SIZE,maxdepth); +#undef MODIFYCACHE_CALLS +} + static void store(char *what,int length) { -char *ce; +char ce_trash,*ce,*ceo=&ce_trash; - if (!(what=modify(what))) { + if (!(what=modify_cached(what))) { if (verbose) puts("discarded."); return; } if (verbose) printf("store: %d: %s\n",length,what); - while ((ce=(tree?strrchr:strchr)(what,'-'))) { + while ((ce=(tree?strrchr(what,'-'):strchr(what,'-')))) { if (!tree) *ce='\0'; storeone(what,length); - if (!tree) what=ce+1; - else *ce='\0'; + if (!tree) { *ce='-'; what=ce+1; } + else { *ceo='-'; *(ceo=ce)='\0'; } } storeone(what,length); + if (tree) *ceo='-'; lifetime_seq++; } @@ -628,7 +693,7 @@ const char *days[]={"Ne","Po","Ut","St","Ct","Pa","So"}; t=mktime(&tm); if (t==-1 || tm.tm_wday<0 || tm.tm_wday>6 || tm.tm_mday<1 || tm.tm_mday>31 - || tm.tm_mon <1 || tm.tm_mon >12 + || tm.tm_mon <0 || tm.tm_mon >11 || tm.tm_year<80 || tm.tm_year>150 ) { fprintf(ERRH1"Incorrect timestamp \"%s\""WHERE1,ERRH2,buf,WHERE2); @@ -672,6 +737,8 @@ const char *days[]={"Ne","Po","Ut","St","Ct","Pa","So"}; if (fi!=stdin && fclose(fi)) fprintf(ERRH1"fclose(3) \"%s\""ERRNO1,ERRH2,finame,ERRNO2); + if (verbose) + modify_cached_stats(); dumphashtable(); return EXIT_SUCCESS; }