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

📄 conf.c

📁 openssl是ssl的开源项目
💻 C
📖 第 1 页 / 共 2 页
字号:
			if (strcmp(section,"ENV") == 0)				{				p=Getenv(name);				if (p != NULL) return(p);				}			}		vv.section="default";		vv.name=name;		v=(CONF_VALUE *)lh_retrieve(conf,(char *)&vv);		if (v != NULL)			return(v->value);		else			return(NULL);		}	else		return(Getenv(name));	}static CONF_VALUE *get_section(conf,section)LHASH *conf;char *section;	{	CONF_VALUE *v,vv;	if ((conf == NULL) || (section == NULL)) return(NULL);	vv.name=NULL;	vv.section=section;	v=(CONF_VALUE *)lh_retrieve(conf,(char *)&vv);	return(v);	}STACK *CONF_get_section(conf,section)LHASH *conf;char *section;	{	CONF_VALUE *v;	v=get_section(conf,section);	if (v != NULL)		return((STACK *)v->value);	else		return(NULL);	}long CONF_get_number(conf,section,name)LHASH *conf;char *section;char *name;	{	char *str;	long ret=0;	str=CONF_get_string(conf,section,name);	if (str == NULL) return(0);	for (;;)		{		if (IS_NUMER(*str))			ret=ret*10+(*str -'0');		else			return(ret);		str++;		}	}void CONF_free(conf)LHASH *conf;	{	if (conf == NULL) return;	conf->down_load=0; 	/* evil thing to make sure the 'Free()'				 * works as expected */	lh_doall_arg(conf,(void (*)())value_free_hash,(char *)conf);	/* We now have only 'section' entries in the hash table.	 * Due to problems with */	lh_doall_arg(conf,(void (*)())value_free_stack,(char *)conf);	lh_free(conf);	}static void value_free_hash(a,conf)CONF_VALUE *a;LHASH *conf;	{	if (a->name != NULL)		{		a=(CONF_VALUE *)lh_delete(conf,(char *)a);		}	}static void value_free_stack(a,conf)CONF_VALUE *a;LHASH *conf;	{	CONF_VALUE *vv;	STACK *sk;	int i;	if (a->name != NULL) return;	sk=(STACK *)a->value;	for (i=sk_num(sk)-1; i>=0; i--)		{		vv=(CONF_VALUE *)sk_value(sk,i);		Free(vv->value);		Free(vv->name);		Free(vv);		}	if (sk != NULL) sk_free(sk);	Free(a->section);	Free(a);	}static void clear_comments(p)char *p;	{	char *to;	to=p;	for (;;)		{		if (IS_COMMENT(*p))			{			*p='\0';			return;			}		if (IS_QUOTE(*p))			{			p=scan_quote(p);			continue;			}		if (IS_ESC(*p))			{			p=scan_esc(p);			continue;			}		if (IS_EOF(*p))			return;		else			p++;		}	}static int str_copy(conf,section,pto,from)LHASH *conf;char *section;char **pto,*from;	{	int q,r,rr=0,to=0,len=0;	char *s,*e,*rp,*p,*rrp,*np,*cp,v;	BUF_MEM *buf;	if ((buf=BUF_MEM_new()) == NULL) return(0);	len=strlen(from)+1;	if (!BUF_MEM_grow(buf,len)) goto err;	for (;;)		{		if (IS_QUOTE(*from))			{			q= *from;			from++;			while ((*from != '\0') && (*from != q))				{				if (*from == '\\')					{					from++;					if (*from == '\0') break;					}				buf->data[to++]= *(from++);				}			}		else if (*from == '\\')			{			from++;			v= *(from++);			if (v == '\0') break;			else if (v == 'r') v='\r';			else if (v == 'n') v='\n';			else if (v == 'b') v='\b';			else if (v == 't') v='\t';			buf->data[to++]= v;			}		else if (*from == '\0')			break;		else if (*from == '$')			{			/* try to expand it */			rrp=NULL;			s= &(from[1]);			if (*s == '{')				q='}';			else if (*s == '(')				q=')';			else q=0;			if (q) s++;			cp=section;			e=np=s;			while (IS_ALPHA_NUMERIC(*e))				e++;			if ((e[0] == ':') && (e[1] == ':'))				{				cp=np;				rrp=e;				rr= *e;				*rrp='\0';				e+=2;				np=e;				while (IS_ALPHA_NUMERIC(*e))					e++;				}			r= *e;			*e='\0';			rp=e;			if (q)				{				if (r != q)					{					CONFerr(CONF_F_STR_COPY,CONF_R_NO_CLOSE_BRACE);					goto err;					}				e++;				}			/* So at this point we have			 * ns which is the start of the name string which is			 *   '\0' terminated. 			 * cs which is the start of the section string which is			 *   '\0' terminated.			 * e is the 'next point after'.			 * r and s are the chars replaced by the '\0'			 * rp and sp is where 'r' and 's' came from.			 */			p=CONF_get_string(conf,cp,np);			if (rrp != NULL) *rrp=rr;			*rp=r;			if (p == NULL)				{				CONFerr(CONF_F_STR_COPY,CONF_R_VARIABLE_HAS_NO_VALUE);				goto err;				}			BUF_MEM_grow(buf,(strlen(p)+len-(e-from)));			while (*p)				buf->data[to++]= *(p++);			from=e;			}		else			buf->data[to++]= *(from++);		}	buf->data[to]='\0';	if (*pto != NULL) Free(*pto);	*pto=buf->data;	Free(buf);	return(1);err:	if (buf != NULL) BUF_MEM_free(buf);	return(0);	}static char *eat_ws(p)char *p;	{	while (IS_WS(*p) && (!IS_EOF(*p)))		p++;	return(p);	}static char *eat_alpha_numeric(p)char *p;	{	for (;;)		{		if (IS_ESC(*p))			{			p=scan_esc(p);			continue;			}		if (!IS_ALPHA_NUMERIC_PUNCT(*p))			return(p);		p++;		}	}static unsigned long hash(v)CONF_VALUE *v;	{	return((lh_strhash(v->section)<<2)^lh_strhash(v->name));	}static int cmp(a,b)CONF_VALUE *a,*b;	{	int i;	if (a->section != b->section)		{		i=strcmp(a->section,b->section);		if (i) return(i);		}	if ((a->name != NULL) && (b->name != NULL))		{		i=strcmp(a->name,b->name);		return(i);		}	else if (a->name == b->name)		return(0);	else		return((a->name == NULL)?-1:1);	}static char *scan_quote(p)char *p;	{	int q= *p;	p++;	while (!(IS_EOF(*p)) && (*p != q))		{		if (IS_ESC(*p))			{			p++;			if (IS_EOF(*p)) return(p);			}		p++;		}	if (*p == q) p++;	return(p);	}static CONF_VALUE *new_section(conf,section)LHASH *conf;char *section;	{	STACK *sk=NULL;	int ok=0,i;	CONF_VALUE *v=NULL,*vv;	if ((sk=sk_new_null()) == NULL)		goto err;	if ((v=(CONF_VALUE *)Malloc(sizeof(CONF_VALUE))) == NULL)		goto err;	i=strlen(section)+1;	if ((v->section=(char *)Malloc(i)) == NULL)		goto err;	memcpy(v->section,section,i);	v->name=NULL;	v->value=(char *)sk;		vv=(CONF_VALUE *)lh_insert(conf,(char *)v);	if (vv != NULL)		{#if !defined(NO_STDIO) && !defined(WIN16)		fprintf(stderr,"internal fault\n");#endif		abort();		}	ok=1;err:	if (!ok)		{		if (sk != NULL) sk_free(sk);		if (v != NULL) Free(v);		v=NULL;		}	return(v);	}

⌨️ 快捷键说明

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