|
|
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));
}
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.