⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 configfile.c

📁 一个C语言写的快速贝叶斯垃圾邮件过滤工具
💻 C
字号:
/* $Id: configfile.c,v 1.53 2005/11/18 23:15:43 m-a Exp $ *//*****************************************************************************NAME:   configfile.c -- process config file parameters   2003-02-12 - split out from config.c so bogolexer use the code.AUTHOR:   David Relson <relson@osagesoftware.com>******************************************************************************/#include "common.h"#include <ctype.h>#include <stdlib.h>#include <string.h>#include <errno.h>#include "getopt.h"#include "bogoconfig.h"#include "bogofilter.h"#include "bool.h"#include "maint.h"#include "error.h"#include "find_home.h"#include "format.h"#include "lexer.h"#include "longoptions.h"#include "maint.h"#include "wordlists.h"#include "xatox.h"#include "xmalloc.h"#include "xstrdup.h"#ifndef	DEBUG_CONFIG#define DEBUG_CONFIG(level)	(verbose > level)#endif/*---------------------------------------------------------------------------*//* NOTE: MAXBUFFLEN _MUST_ _NOT_ BE LARGER THAN INT_MAX! */#define	MAXBUFFLEN	((int)200)/*---------------------------------------------------------------------------*//* Global variables */#ifndef __riscos__const char *user_config_file   = "~/.bogofilter.cf";#elseconst char *user_config_file   = "Choices:bogofilter.bogofilter/cf";#endifbool	stats_in_header = true;char 	*config_file_name;/*---------------------------------------------------------------------------*//*  remove trailing comment from the line. */void remove_comment(const char *line){    char *tmp = strchr(line, '#');    if (tmp != NULL) {	tmp -= 1;	while (tmp > line && isspace((unsigned char)*tmp))	    tmp -= 1;	*(tmp+1) = '\0';    }    return;}bool process_config_option(const char *arg, bool warn_on_error, priority_t precedence, struct option *longopts){    uint pos;    bool ok = true;    char *val = NULL;    const char *opt = arg;    char *dupl;    const char delim[] = " \t=";    while (isspace(*opt))		/* ignore leadign whitespace */	opt += 1;    dupl = xstrdup(opt);    pos = strcspn(dupl, delim);    if (pos < strlen(dupl)) { 		/* if delimiter present */	val = dupl + pos;	*val++ = '\0';	val += strspn(val, delim);    }    if (val == NULL ||	!process_config_option_as_arg(dupl, val, precedence, longopts)) {	ok = false;	if (warn_on_error)	    fprintf(stderr, "Error - bad parameter '%s'\n", arg);    }    xfree(dupl);    return ok;}/* option_compare()**** Returns true if options are equal, without regard to case and** allows underscore from config file to match hyphen*/static bool option_compare(const char *opt, const char *name){    char co, cn;    if (strlen(opt) != strlen(name))	return false;    while (((co = *opt++) != '\0') && ((cn = *name++) != '\0')) {	if ((co == cn) || (tolower(co) == tolower(cn)))	    continue;	if (co != '_' || cn != '-')	    return false;    }    return true;}bool process_config_option_as_arg(const char *opt, const char *val, priority_t precedence, struct option *long_options){    struct option *option;    for (option = long_options; option->name; option += 1) {	if (!option_compare(opt, option->name))	    continue;	if (strcmp(val, "''") == 0)	    val = "";	process_arg(option->val, opt, val, precedence, PASS_2_CFG);	return true;    }    return false;}bool read_config_file(const char *fname, bool tilde_expand, bool warn_on_error, priority_t precedence,	struct option *longopts){    bool ok = true;    int lineno = 0;    FILE *fp;    if (config_file_name != NULL)	xfree(config_file_name);    if (!tilde_expand)	config_file_name = xstrdup(fname);    else	config_file_name = tildeexpand(fname);    fp = fopen(config_file_name, "r");    if (fp == NULL) {	xfree(config_file_name);	config_file_name = NULL;	return false;    }    if (DEBUG_CONFIG(0))	fprintf(dbgout, "Reading %s\n", config_file_name);    while (!feof(fp))    {	size_t len;	char buff[MAXBUFFLEN];	lineno += 1;	if (fgets(buff, sizeof(buff), fp) == NULL)	    break;	len = strlen(buff);	if ( buff[0] == '#' || buff[0] == ';' || buff[0] == '\n' )	    continue;	while (len >= 1		&& (iscntrl((unsigned char)buff[len-1])		    || isspace((unsigned char)buff[len-1])))	    buff[--len] = '\0';	if (DEBUG_CONFIG(1))	    fprintf(dbgout, "Testing:  %s\n", buff);	if (!process_config_option(buff, warn_on_error, precedence, longopts))	    ok = false;    }    if (ferror(fp)) {	fprintf(stderr, "Error reading file \"%s\"\n.", config_file_name);	ok = false;    }    (void)fclose(fp); /* we're just reading, so fclose should succeed */    return ok;}/* exported */bool process_config_files(bool warn_on_error, struct option *longopts){    bool ok = true;    const char *env = getenv("BOGOTEST");    if (!suppress_config_file) {	if (!read_config_file(system_config_file, false, warn_on_error, PR_CFG_SITE, longopts))	    ok = false;	if (!read_config_file(user_config_file, true, warn_on_error, PR_CFG_USER, longopts))	    ok = false;    }    if (env)	set_bogotest(env);    return ok;}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -