我自己用的屏蔽词检查/替换函数:
//添加到efuns_main.c的部分:#ifdef F_REG_FILTER_WORDvoidf_reg_filter_word PROT((void)){ if ((sp)->type != T_ARRAY) error("Bad argument 1 to reg_filter_word()\n"); reg_filter_word(sp->u.arr); free_array(sp->u.arr); sp->type = T_NUMBER; sp->u.number = 0;}#endif
#ifdef F_FIND_FILTER_WORDvoidf_find_filter_word PROT((void)){ int i; if ((sp)->type != T_STRING) error("Bad argument 1 to find_filter_word()\n"); i = match_filter_word(sp->u.string); pop_stack(); push_number(i);
}#endif
#ifdef F_REPLACE_FILTER_WORDvoidf_replace_filter_word PROT((void)){ if ((sp)->type != T_STRING) error("Bad argument 1 to find_filter_word()\n");
if(SVALUE_STRLEN(sp)) replace_filter_word(sp->u.string);}#endif
//添加到func_spec.c的efun定义部分: int reg_filter_word(mixed); int find_filter_word(string); string replace_filter_word(string);
//添加到array.c的部分:char** filter_word_array[256];int filter_word_index[256];int match_filter_word P1(char *,str){ int i,j,k,sz,sz2,ret,tmp; ret = 0; sz = strlen(str); for(i=0;i<sz;i++) { if(filter_word_index[(unsigned char )str[i]]) { for(j=0;j<filter_word_index[(unsigned char )str[i]];j++) { tmp = 0; sz2 = strlen(filter_word_array[(unsigned char )str[i]][j]); if(sz2 > (sz - i)) continue; for(k=0;k<sz2;k++) { if(str[i+k] != filter_word_array[(unsigned char )str[i]][j][k]) { tmp = 1; break; } } if(!tmp) { ret ++; i += (sz2-1); break; } } if( ret) break; } } return ret;}
char* replace_filter_word P1(char *,str){ int i,j,k,sz,sz2,ret,tmp; ret = 0; sz = strlen(str); for(i=0;i<sz;i++) { if(filter_word_index[(unsigned char )str[i]]) { for(j=0;j<filter_word_index[(unsigned char )str[i]];j++) { tmp = 0; sz2 = strlen(filter_word_array[(unsigned char )str[i]][j]); if(sz2 > (sz - i)) continue; for(k=0;k<sz2;k++) { if(str[i+k] != filter_word_array[(unsigned char )str[i]][j][k]) { tmp = 1; break; } } if(!tmp) { ret ++; memset(str+i,'*',sz2); i += (sz2-1); break; } } } } return str;}