as_str.c

来自「ftam等标准协议服务器和客户端的源代码。」· C语言 代码 · 共 237 行

C
237
字号
#ifndef lintstatic char *rcsid = "$Header: /xtel/isode/isode/dsap/common/RCS/as_str.c,v 9.0 1992/06/16 12:12:39 isode Rel $";#endif/* * $Header: /xtel/isode/isode/dsap/common/RCS/as_str.c,v 9.0 1992/06/16 12:12:39 isode Rel $ * * * $Log: as_str.c,v $ * Revision 9.0  1992/06/16  12:12:39  isode * Release 8.0 * *//* *                                NOTICE * *    Acquisition, use, and distribution of this module and related *    materials are subject to the restrictions of a license agreement. *    Consult the Preface in the User's Manual for the full terms of *    this agreement. * */#include "quipu/util.h"#include "quipu/entry.h"#include "quipu/malloc.h"extern short acl_sntx;extern IFP merge_acl;extern IFP acl_fn;extern char dsa_mode;Attr_Sequence str2as (str)register char * str;{register char * ptr;char * save, val;AttributeType at;Attr_Sequence as;	if (str == NULLCP)		return (NULLATTR);	if ((ptr = index (str,'=')) == 0) {		parse_error ("equals missing in '%s'",str);		return (NULLATTR);	}	save = ptr++;	if (! isspace (*--save))		save++;	ptr = SkipSpace (ptr);	if (*ptr == 0)		return (NULLATTR);	val = *save;	*save = 0;		if ((at = AttrT_new (str)) == NULLAttrT) {		parse_error ("unknown attribute type '%s'",str);		*ptr = '=';		return (NULLATTR);	}	*save = val;	as = as_comp_alloc ();	as->attr_acl  = NULLACL_INFO;	as->attr_type = at;	as->attr_link = NULLATTR;	ATTRIBUTE_HEAP;	if ((as->attr_value = str2avs (ptr,as->attr_type)) == NULLAV) {		RESTORE_HEAP;		as_free (as);		return (NULLATTR);	}	RESTORE_HEAP;	return (as);}Attr_Sequence as_combine (as,str,allownull)Attr_Sequence as;register char * str;char allownull;{register char * ptr = str;char * save, val;AV_Sequence avs;Attr_Sequence as2,nas;AttributeType at;int i;static Attr_Sequence fast_as = NULLATTR;static Attr_Sequence fast_tail = NULLATTR;extern Attr_Sequence as_fast_merge();extern AV_Sequence avs_fast_merge ();extern AV_Sequence fast_str2avs ();AV_Sequence fast_avs = NULLAV;AV_Sequence fast_avstail = NULLAV;	if (str == NULLCP)		return (as);	while (*ptr != 0)		if (*ptr == '=')			break;		else			ptr++;	if (*ptr == 0) {		if (allownull) {			nas = as_comp_alloc ();			nas->attr_acl  = NULLACL_INFO;			if ((nas->attr_type = AttrT_new (str)) == NULLAttrT) {				parse_error ("unknown attribute type '%s'",str);				return as;			}			nas->attr_link = NULLATTR;			nas->attr_value = NULLAV;			as = as_fast_merge (as,nas,fast_as,fast_tail);			fast_as = as, fast_tail= nas;			return as;		}		parse_error ("equals missing in '%s'",str);		return (as);	}	save = ptr++;	if (! isspace (*--save))		save++;	val = *save;	*save = 0;	ptr = SkipSpace (ptr);	if ((at = AttrT_new (str)) == NULLAttrT) {		parse_error ("unknown attribute type '%s'",str);		*ptr = '=';		return (as);	}	if (*ptr == 0) {		if ((at->oa_syntax == acl_sntx) && dsa_mode) {			/* Add default ACL */				struct acl * acl = (struct acl *) NULL;			acl = acl_alloc();			acl->ac_child = (struct acl_info *)(*acl_fn)();			acl->ac_entry = (struct acl_info *)(*acl_fn)();			acl->ac_default = (struct acl_info *)(*acl_fn)();			acl->ac_attributes = NULLACL_ATTR;			nas = as_comp_alloc ();			nas->attr_acl  = NULLACL_INFO;			nas->attr_link = NULLATTR;			nas->attr_value = avs_comp_alloc();			nas->attr_value->avseq_next = NULLAV;			nas->attr_value->avseq_av.av_syntax = acl_sntx;			nas->attr_value->avseq_av.av_struct = (caddr_t) acl;			nas->attr_type = at;			as = as_fast_merge (as,nas,fast_as,fast_tail);			fast_as = as, fast_tail= nas;		} else if ((allownull) ||		   	   ((at->oa_syntax == acl_sntx) && !dsa_mode)) {			nas = as_comp_alloc ();			nas->attr_acl  = NULLACL_INFO;			nas->attr_link = NULLATTR;			nas->attr_value = NULLAV;			nas->attr_type = at;			as = as_fast_merge (as,nas,fast_as,fast_tail);			fast_as = as, fast_tail= nas;		}		return (as);	}	for (as2=as; as2 != NULLATTR; as2=as2->attr_link) {		if ((i = AttrT_cmp (at, as2->attr_type)) == 0) {			*save = val;			ATTRIBUTE_HEAP;			if (at->oa_syntax == acl_sntx) {				(*merge_acl)(as2->attr_value,SkipSpace(ptr));				RESTORE_HEAP;				return (as);			}			if ((avs = fast_str2avs (ptr,as2->attr_type)) == NULLAV) {				RESTORE_HEAP;				return (as);			}			as2->attr_value = avs_fast_merge (as2->attr_value,avs,				   fast_avs, fast_avstail);			fast_avs = as2->attr_value;			fast_avstail = avs;			RESTORE_HEAP;			return (as);			} 		else 			if ( i > 0 )				break;	}	*save = val;	nas = as_comp_alloc ();	nas->attr_acl  = NULLACL_INFO;	nas->attr_type = at;	nas->attr_link = NULLATTR;	ATTRIBUTE_HEAP;	if ((nas->attr_value = fast_str2avs (ptr,nas->attr_type)) == NULLAV) {		RESTORE_HEAP;		as_free (nas);		return (as);	}	RESTORE_HEAP;	as = as_fast_merge (as,nas,fast_as,fast_tail);	fast_as = as, fast_tail= nas;	return as;}

⌨️ 快捷键说明

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