?? adbanner.c
字號:
if (!head) return NULL; LIST_TRAVERSE_CONST(head,curr) { if (!(temp = elem_get_data(curr))) { eventlog(eventlog_level_error,__FUNCTION__,"found NULL adbanner in list"); continue; } if (temp->id==id && (temp->client == 0 || temp->client == clienttag)) return temp; } return NULL;}/* * Dizzy: maybe we should use a temporary list, right now we parse the list for * 2 times. It should not matter for servers without more than 20 ads :)*/static t_adbanner * adbannerlist_get_random(t_list const * head, t_clienttag client){ t_elem const * curr; t_adbanner * temp; unsigned int ccount, ocount, pos; if (!head) return NULL; ocount = 0; ccount = 0; LIST_TRAVERSE_CONST(head,curr) { if (!(temp = elem_get_data(curr))) { eventlog(eventlog_level_error,__FUNCTION__,"found NULL adbanner in list"); continue; } if ((adbanner_get_client(temp) == client)) ccount++; else if ((adbanner_get_client(temp) == 0)) ocount++; } if (ccount) { pos = ((unsigned int)rand())%ccount; ccount = 0; LIST_TRAVERSE_CONST(head,curr) { if (!(temp = elem_get_data(curr))) continue; if ((adbanner_get_client(temp) == client)) if (ccount++ == pos) return temp; } eventlog(eventlog_level_error,__FUNCTION__,"found client ads but couldnt locate random chosed!"); } else if (ocount) { pos = ((unsigned int)rand())%ocount; ocount = 0; LIST_TRAVERSE_CONST(head,curr) { if (!(temp = elem_get_data(curr))) continue; if ((adbanner_get_client(temp) == 0)) if (ocount++ == pos) return temp; } eventlog(eventlog_level_error,__FUNCTION__,"couldnt locate random chosed!"); } return NULL;}static int adbannerlist_insert(t_list * head, unsigned int * count, char const * filename, unsigned int delay, char const * link, unsigned int next_id, char const * client){ t_adbanner * ad; unsigned int id; char * ext; bn_int bntag; assert(head != NULL); assert(count != NULL); assert(filename != NULL); assert(link != NULL); if (strlen(filename)<7) { eventlog(eventlog_level_error,__FUNCTION__,"got bad ad filename \"%s\"",filename); return -1; } ext = xmalloc(strlen(filename)); if (sscanf(filename,"%*c%*c%x.%s",&id,ext)!=2) { eventlog(eventlog_level_error,__FUNCTION__,"got bad ad filename \"%s\"",filename); xfree(ext); return -1; } if (strcasecmp(ext,"pcx")==0) bn_int_tag_set(&bntag,EXTENSIONTAG_PCX); else if (strcasecmp(ext,"mng")==0) bn_int_tag_set(&bntag,EXTENSIONTAG_MNG); else if (strcasecmp(ext,"smk")==0) bn_int_tag_set(&bntag,EXTENSIONTAG_SMK); else { eventlog(eventlog_level_error,__FUNCTION__,"unknown extension on filename \"%s\"",filename); xfree(ext); return -1; } xfree(ext); if (!(ad = adbanner_create(id,next_id,delay,bntag,filename,link,client))) { eventlog(eventlog_level_error,__FUNCTION__,"could not create ad"); return -1; } list_prepend_data(head,ad); (*count)++; return 0;}extern int adbannerlist_create(char const * filename){ FILE * fp; unsigned int line; unsigned int pos; unsigned int len; char * buff; char * name; char * when; char * link; char * client; char * temp; unsigned int delay; unsigned int next_id; if (!filename) { eventlog(eventlog_level_error,__FUNCTION__,"got NULL filename"); return -1; } adbannerlist_init_head = list_create(); adbannerlist_start_head = list_create(); adbannerlist_norm_head = list_create(); if (!(fp = fopen(filename,"r"))) { eventlog(eventlog_level_error,__FUNCTION__,"could not open adbanner file \"%s\" for reading (fopen: %s)",filename,pstrerror(errno)); list_destroy(adbannerlist_norm_head); list_destroy(adbannerlist_start_head); list_destroy(adbannerlist_init_head); adbannerlist_init_head=adbannerlist_start_head=adbannerlist_norm_head = NULL; return -1; } for (line=1; (buff = file_get_line(fp)); line++) { for (pos=0; buff[pos]=='\t' || buff[pos]==' '; pos++); if (buff[pos]=='\0' || buff[pos]=='#') { continue; } if ((temp = strrchr(buff,'#'))) { unsigned int endpos; *temp = '\0'; len = strlen(buff)+1; for (endpos=len-1; buff[endpos]=='\t' || buff[endpos]==' '; endpos--); buff[endpos+1] = '\0'; } len = strlen(buff)+1; name = xmalloc(len); when = xmalloc(len); link = xmalloc(len); client = xmalloc(len); if (sscanf(buff," \"%[^\"]\" %[a-z] %u \"%[^\"]\" %x \"%[^\"]\"",name,when,&delay,link,&next_id,client)!=6) { eventlog(eventlog_level_error,__FUNCTION__,"malformed line %u in file \"%s\"",line,filename); xfree(client); xfree(link); xfree(name); xfree(when); continue; } if (strcmp(when,"init")==0) adbannerlist_insert(adbannerlist_init_head,&adbannerlist_init_count,name,delay,link,next_id,client); else if (strcmp(when,"start")==0) adbannerlist_insert(adbannerlist_start_head,&adbannerlist_start_count,name,delay,link,next_id,client); else if (strcmp(when,"norm")==0) adbannerlist_insert(adbannerlist_norm_head,&adbannerlist_norm_count,name,delay,link,next_id,client); else eventlog(eventlog_level_error,__FUNCTION__,"when field has unknown value on line %u in file \"%s\"",line,filename); xfree(client); xfree(link); xfree(name); xfree(when); } file_get_line(NULL); // clear file_get_line buffer if (fclose(fp)<0) eventlog(eventlog_level_error,__FUNCTION__,"could not close adbanner file \"%s\" after reading (fclose: %s)",filename,pstrerror(errno)); return 0;}extern int adbannerlist_destroy(void){ t_elem * curr; t_adbanner * ad; if (adbannerlist_init_head) { LIST_TRAVERSE(adbannerlist_init_head,curr) { if (!(ad = elem_get_data(curr))) eventlog(eventlog_level_error,__FUNCTION__,"found NULL adbanner in init list"); else adbanner_destroy(ad); list_remove_elem(adbannerlist_init_head,&curr); } list_destroy(adbannerlist_init_head); adbannerlist_init_head = NULL; adbannerlist_init_count = 0; } if (adbannerlist_start_head) { LIST_TRAVERSE(adbannerlist_start_head,curr) { if (!(ad = elem_get_data(curr))) eventlog(eventlog_level_error,__FUNCTION__,"found NULL adbanner in start list"); else adbanner_destroy(ad); list_remove_elem(adbannerlist_start_head,&curr); } list_destroy(adbannerlist_start_head); adbannerlist_start_head = NULL; adbannerlist_start_count = 0; } if (adbannerlist_norm_head) { LIST_TRAVERSE(adbannerlist_norm_head,curr) { if (!(ad = elem_get_data(curr))) eventlog(eventlog_level_error,__FUNCTION__,"found NULL adbanner in norm list"); else adbanner_destroy(ad); list_remove_elem(adbannerlist_norm_head,&curr); } list_destroy(adbannerlist_norm_head); adbannerlist_norm_head = NULL; adbannerlist_norm_count = 0; } return 0;}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -