File:  [CSRG BSD Unix] / 43BSDReno / contrib / isode-beta / dsap / common / as_str.c
Revision 1.1.1.1 (vendor branch): download - view: text, annotated - select for diffs
Tue Apr 24 16:12:56 2018 UTC (8 years, 1 month ago) by root
Branches: MAIN, BSD
CVS tags: HEAD, BSD43reno
BSD 4.3reno

#include "quipu/util.h"
#include "quipu/attrvalue.h"
#include "quipu/malloc.h"

extern short acl_sntx;
extern IFP merge_acl;

Attr_Sequence str2as (str)
register char * str;
{
register char * ptr;
char * save, val;
oid_table_attr *at;
Attr_Sequence as;

	if (str == NULLCP)
		return (NULLATTR);

	if ((ptr = index (str,'=')) == 0) {
		parse_error ("equals missing %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)) == NULLTABLE_ATTR) {
		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)
Attr_Sequence as;
register char * str;
{
register char * ptr;
char * save, val;
AV_Sequence avs;
Attr_Sequence as2,nas;
oid_table_attr *at;

	if (str == NULLCP)
		return (as);

	if ((ptr = index (str,'=')) == 0) {
		parse_error ("equals missing %s",str);
		return (as);
	}

	save = ptr++;
	if (! isspace (*--save))
		save++;

	ptr = SkipSpace (ptr);
	if (*ptr == 0)
		return (as);

	val = *save;
	*save = 0;

	if ((at = AttrT_new (str)) == NULLTABLE_ATTR) {
		parse_error ("unknown attribute type '%s'",str);
		*ptr = '=';
		return (as);
	} else 
	    for (as2=as; as2 != NULLATTR; as2=as2->attr_link) {
		if ( at == as2->attr_type ) {
			*save = val;

			ATTRIBUTE_HEAP;

			if (at->oa_syntax == acl_sntx) {
				(*merge_acl)(as2->attr_value,SkipSpace(ptr));
				RESTORE_HEAP;
				return (as);
			}

			if ((avs = str2avs (ptr,as2->attr_type)) == NULLAV) {
				RESTORE_HEAP;
				return (as);
			}

			as2->attr_value = avs_merge (as2->attr_value,avs);

			RESTORE_HEAP;

			return (as);	
		}
		if ( at > as2->attr_type )
			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 = str2avs (ptr,nas->attr_type)) == NULLAV) {
		RESTORE_HEAP;
		as_free (nas);
		return (as);
	}

	RESTORE_HEAP;

	return (as_merge(as,nas));

}

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.