📄 hashtab.c
字号:
int put_anode(char *str, int type, u_long count, u_long *ctr, ANODEPTR *htab){ ANODEPTR cptr,nptr; if (str[0]=='-') return 0; /* skip bad user agents */ /* check if hashed */ if ( (cptr = htab[hash(str)]) == NULL) { /* not hashed */ if ( (nptr=new_anode(str)) != NULL) { nptr->flag = type; nptr->count= count; nptr->next = NULL; htab[hash(str)] = nptr; if (type!=OBJ_GRP) (*ctr)++; } } else { /* hashed */ while (cptr != NULL) { if (strcmp(cptr->string,str)==0) { if ((type==cptr->flag)||((type!=OBJ_GRP)&&(cptr->flag!=OBJ_GRP))) { /* found... bump counter */ cptr->count+=count; return 0; } } cptr = cptr->next; } /* not found... */ if ( (nptr = new_anode(str)) != NULL) { nptr->flag = type; nptr->count = count; nptr->next = htab[hash(str)]; htab[hash(str)]=nptr; if (type!=OBJ_GRP) (*ctr)++; } } if (type==OBJ_GRP) nptr->flag=OBJ_GRP; else if (isinlist(hidden_agents,nptr->string)!=NULL) nptr->flag=OBJ_HIDE; return nptr==NULL;}/*********************************************//* DEL_ALIST - delete user agent hash table *//*********************************************/void del_alist(ANODEPTR *htab){ /* free memory used by hash table */ ANODEPTR aptr,temp; int i; for (i=0;i<MAXHASH;i++) { if (htab[i] != NULL) { aptr = htab[i]; while (aptr != NULL) { temp = aptr->next; free (aptr->string); free (aptr); aptr = temp; } htab[i]=NULL; } }}/*********************************************//* NEW_SNODE - Search str node creation *//*********************************************/SNODEPTR new_snode(char *str){ SNODEPTR newptr; char *sptr; if (strlen(str) >= MAXSRCHH) { if (verbose) { fprintf(stderr,"[new_snode] %s (%d)",msg_big_one,strlen(str)); if (debug_mode) fprintf(stderr,":\n--> %s",str); fprintf(stderr,"\n"); } str[MAXSRCHH-1]=0; } if ( (sptr=malloc(strlen(str)+1))==NULL ) return (SNODEPTR)NULL; strcpy(sptr,str); if (( newptr = malloc(sizeof(struct snode))) != NULL) { newptr->string= sptr; newptr->count = 1; } else free(sptr); return newptr;}/*********************************************//* PUT_SNODE - insert/update search str node *//*********************************************/int put_snode(char *str, u_long count, SNODEPTR *htab){ SNODEPTR cptr,nptr; if (str[0]==0 || str[0]==' ') return 0; /* skip bad search strs */ /* check if hashed */ if ( (cptr = htab[hash(str)]) == NULL) { /* not hashed */ if ( (nptr=new_snode(str)) != NULL) { nptr->count = count; nptr->next = NULL; htab[hash(str)] = nptr; } } else { /* hashed */ while (cptr != NULL) { if (strcmp(cptr->string,str)==0) { /* found... bump counter */ cptr->count+=count; return 0; } cptr = cptr->next; } /* not found... */ if ( (nptr = new_snode(str)) != NULL) { nptr->count = count; nptr->next = htab[hash(str)]; htab[hash(str)]=nptr; } } return nptr==NULL;}/*********************************************//* DEL_SLIST - delete search str hash table *//*********************************************/void del_slist(SNODEPTR *htab){ /* free memory used by hash table */ SNODEPTR aptr,temp; int i; for (i=0;i<MAXHASH;i++) { if (htab[i] != NULL) { aptr = htab[i]; while (aptr != NULL) { temp = aptr->next; free (aptr->string); free (aptr); aptr = temp; } htab[i]=NULL; } }}/*********************************************//* NEW_INODE - create ident (username) node *//*********************************************/INODEPTR new_inode(char *str){ INODEPTR newptr; char *sptr; if (strlen(str) >= MAXIDENT) { if (verbose) { fprintf(stderr,"[new_inode] %s (%d)",msg_big_one,strlen(str)); if (debug_mode) fprintf(stderr,":\n--> %s",str); fprintf(stderr,"\n"); } str[MAXIDENT-1]=0; } if ( (sptr=malloc(strlen(str)+1))==NULL ) return (INODEPTR)NULL; strcpy(sptr,str); if (( newptr = malloc(sizeof(struct inode))) != NULL) { newptr->string =sptr; newptr->visit =1; newptr->tstamp =0; } else free(sptr); return newptr;}/*********************************************//* PUT_INODE - insert/update ident node *//*********************************************/int put_inode( char *str, /* ident str */ int type, /* obj type */ u_long count, /* hit count */ u_long file, /* File flag */ double xfer, /* xfer size */ u_long *ctr, /* counter */ u_long visit, /* visits */ u_long tstamp,/* timestamp */ INODEPTR *htab) /* hashtable */{ INODEPTR cptr,nptr; if ((str[0]=='-') || (str[0]==0)) return 0; /* skip if no username */ /* check if hashed */ if ( (cptr = htab[hash(str)]) == NULL) { /* not hashed */ if ( (nptr=new_inode(str)) != NULL) { nptr->flag = type; nptr->count = count; nptr->files = file; nptr->xfer = xfer; nptr->next = NULL; htab[hash(str)] = nptr; if (type!=OBJ_GRP) (*ctr)++; if (visit) { nptr->visit=(visit-1); nptr->tstamp=tstamp; return 0; } else { if (ispage(log_rec.url)) nptr->tstamp=tstamp; } } } else { /* hashed */ while (cptr != NULL) { if (strcmp(cptr->string,str)==0) { if ((type==cptr->flag)||((type!=OBJ_GRP)&&(cptr->flag!=OBJ_GRP))) { /* found... bump counter */ cptr->count+=count; cptr->files+=file; cptr->xfer +=xfer; if (ispage(log_rec.url)) { if ((tstamp-cptr->tstamp)>=visit_timeout) cptr->visit++; cptr->tstamp=tstamp; } return 0; } } cptr = cptr->next; } /* not found... */ if ( (nptr = new_inode(str)) != NULL) { nptr->flag = type; nptr->count = count; nptr->files = file; nptr->xfer = xfer; nptr->next = htab[hash(str)]; htab[hash(str)]=nptr; if (type!=OBJ_GRP) (*ctr)++; if (visit) { nptr->visit = (visit-1); nptr->tstamp= tstamp; return 0; } else { if (ispage(log_rec.url)) nptr->tstamp= tstamp; } } } if (nptr!=NULL) { /* set object type */ if (type==OBJ_GRP) nptr->flag=OBJ_GRP; /* is it a grouping? */ else { /* check if it's a hidden object */ if (isinlist(hidden_users,nptr->string)!=NULL) nptr->flag=OBJ_HIDE; } } return nptr==NULL;}/*********************************************//* DEL_ILIST - delete ident hash table *//*********************************************/void del_ilist(INODEPTR *htab){ /* free memory used by hash table */ INODEPTR aptr,temp; int i; for (i=0;i<MAXHASH;i++) { if (htab[i] != NULL) { aptr = htab[i]; while (aptr != NULL) { temp = aptr->next; free (aptr->string); /* free ident string space */ free (aptr); /* free ident structure */ aptr = temp; } htab[i]=NULL; } }}#ifdef USE_DNS /* only add these for DNS *//*********************************************//* NEW_DNODE - DNS resolver node creation *//*********************************************/DNODEPTR new_dnode(char *str){ DNODEPTR newptr; char *sptr; if (strlen(str) >= MAXHOST) { if (verbose) { fprintf(stderr,"[new_dnode] %s (%d)",msg_big_one,strlen(str)); if (debug_mode) fprintf(stderr,":\n--> %s",str); fprintf(stderr,"\n"); } str[MAXHOST-1]=0; } if ( (sptr=malloc(strlen(str)+1))==NULL ) return (DNODEPTR)NULL; strcpy(sptr,str); if (( newptr = malloc(sizeof(struct dnode))) != NULL) { newptr->string= sptr; } else free(sptr); return newptr;}/*********************************************//* PUT_DNODE - insert/update dns host node *//*********************************************/int put_dnode(char *str, struct in_addr *addr, DNODEPTR *htab){ DNODEPTR cptr,nptr; if (str[0]==0 || str[0]==' ') return 0; /* skip bad hostnames */ /* check if hashed */ if ( (cptr = htab[hash(str)]) == NULL) { /* not hashed */ if ( (nptr=new_dnode(str)) != NULL) { if (addr) memcpy(&nptr->addr, addr, sizeof(struct in_addr)); else memset(&nptr->addr, 0, sizeof(struct in_addr)); nptr->next = NULL; htab[hash(str)] = nptr; } } else { /* hashed */ while (cptr != NULL) { if (strcmp(cptr->string,str)==0) return 0; cptr = cptr->next; } /* not found... */ if ( (nptr = new_dnode(str)) != NULL) { if (addr) memcpy(&nptr->addr, addr, sizeof(struct in_addr)); else memset(&nptr->addr, 0, sizeof(struct in_addr)); nptr->next = htab[hash(str)]; htab[hash(str)]=nptr; } } return nptr==NULL;}/*********************************************//* DEL_DLIST - delete dns hash table *//*********************************************/void del_dlist(DNODEPTR *htab){ /* free memory used by hash table */ DNODEPTR dptr,temp; int i; for (i=0;i<MAXHASH;i++) { if (htab[i] != NULL) { dptr = htab[i]; while (dptr != NULL) { temp = dptr->next; free (dptr->string); free (dptr); dptr = temp; } htab[i]=NULL; } }}#endif /* USE_DNS *//*********************************************//* HASH - return hash value for string *//*********************************************/u_long hash(char *str){ u_long hashval; for (hashval = 0; *str != '\0'; str++) hashval = *str + 31 * hashval; return hashval % MAXHASH;}/*********************************************//* FIND_URL - Find URL in hash table *//*********************************************/char *find_url(char *str){ UNODEPTR cptr; if ( (cptr=um_htab[hash(str)]) != NULL) { while (cptr != NULL) { if (strcmp(cptr->string,str)==0) return cptr->string; cptr = cptr->next; } } return blank_str; /* shouldn't get here */}/*********************************************//* UPDATE_ENTRY - update entry page total *//*********************************************/void update_entry(char *str){ UNODEPTR uptr; if (str==NULL) return; if ( (uptr = um_htab[hash(str)]) == NULL) return; else { while (uptr != NULL) { if (strcmp(uptr->string,str)==0) { if (uptr->flag!=OBJ_GRP) { uptr->entry++; return; } } uptr=uptr->next; } }}/*********************************************//* UPDATE_EXIT - update exit page total *//*********************************************/void update_exit(char *str){ UNODEPTR uptr; if (str==NULL) return; if ( (uptr = um_htab[hash(str)]) == NULL) return; else { while (uptr != NULL) { if (strcmp(uptr->string,str)==0) { if (uptr->flag!=OBJ_GRP) { uptr->exit++; return; } } uptr=uptr->next; } }}/*********************************************//* MONTH_UPDATE_EXIT - eom exit page update *//*********************************************/void month_update_exit(u_long tstamp){ HNODEPTR nptr; int i; for (i=0;i<MAXHASH;i++) { nptr=sm_htab[i]; while (nptr!=NULL) { if (nptr->flag!=OBJ_GRP) { if ((tstamp-nptr->tstamp)>=visit_timeout) update_exit(nptr->lasturl); } nptr=nptr->next; } }}/*********************************************//* TOT_VISIT - calculate total visits *//*********************************************/u_long tot_visit(HNODEPTR *list){ HNODEPTR hptr; u_long tot=0; int i; for (i=0;i<MAXHASH;i++) { hptr=list[i]; while (hptr!=NULL) { if (hptr->flag!=OBJ_GRP) tot+=hptr->visit; hptr=hptr->next; } } return tot;}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -