|
|
DataMuseum.dkPresents historical artifacts from the history of: DKUUG/EUUG Conference tapes |
This is an automatic "excavation" of a thematic subset of
See our Wiki for more about DKUUG/EUUG Conference tapes Excavated with: AutoArchaeologist - Free & Open Source Software. |
top - metrics - downloadIndex: T o
Length: 15644 (0x3d1c)
Types: TextFile
Names: »oid.c«
└─⟦2d1937cfd⟧ Bits:30007241 EUUGD22: P.P 5.0
└─⟦35176feda⟧ »EurOpenD22/isode/isode-6.tar.Z«
└─⟦de7628f85⟧
└─⟦this⟧ »isode-6.0/dsap/common/oid.c«
/* oid.c - Object Identifier routines */
#ifndef lint
static char *rcsid = "$Header: /f/osi/dsap/common/RCS/oid.c,v 7.1 89/12/19 16:19:25 mrose Exp $";
#endif
/*
* $Header: /f/osi/dsap/common/RCS/oid.c,v 7.1 89/12/19 16:19:25 mrose Exp $
*
*
* $Log: oid.c,v $
* Revision 7.1 89/12/19 16:19:25 mrose
* sync
*
* Revision 7.0 89/11/23 21:42:32 mrose
* Release 6.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.
*
*/
/* LINTLIBRARY */
#include "quipu/util.h"
#include "quipu/entry.h"
#include "cmd_srch.h"
#include "tailor.h"
extern char chrcnv [];
extern LLog * log_dsap;
FILE * f_table;
static char * get_entry ();
static add_entry ();
char * get_oid();
static char * name2gen ();
add_entry_aux ();
oid_table OIDTable [TABLESIZE];
oid_table_attr attrOIDTable [TABLESIZE];
objectclass ocOIDTable [TABLESIZE];
int NumEntries = 0;
int attrNumEntries = 0;
int ocNumEntries = 0;
unsigned attr_index = 0;
#define GEN 1
#define ATTR 2
#define OC 3
#define PBUCKETS 128
#define PHASH(nm) \
(((nm)[1]) ? (((chrcnv[((nm)[0])] - chrcnv[((nm)[1])]) & 0x1f) + ((chrcnv[(nm)[2]]) & 0x5f)) \
: (chrcnv[(nm)[0]]) & 0x7f)
struct pair {
char *p_name;
caddr_t p_value;
int p_type;
struct pair *p_chain;
};
struct aliases {
char * a_full;
char * a_alias;
};
static struct aliases Palias[LOTS];
static int Palias_next = 0;
static struct pair *Pbuckets[PBUCKETS];
IFP oc_load = NULLIFP;
IFP oc_macro_add = NULLIFP;
load_oid_table (table)
char * table;
{
register char * name;
char filename [FILNSIZE];
register char * extension;
char *isodetable;
if (NumEntries != 0)
return; /* already loaded */
isodetable = isodefile(table, 0);
(void) strcpy (filename,isodetable);
extension = &filename[strlen(isodetable)];
(void) strcpy (extension,".gen");
if (( f_table = fopen (filename,"r")) == (FILE *) NULL) {
LLOG (log_dsap,LLOG_FATAL,("file %s",filename));
fatal (-91,"Can't open oidtable.gen");
}
while (1) { /* break out */
if ( (name = get_entry ()) == NULLCP)
break;
add_entry (name,GEN);
}
(void) fclose (f_table);
(void) strcpy (extension,".at");
if (( f_table = fopen (filename,"r")) == (FILE *) NULL) {
LLOG (log_dsap,LLOG_FATAL,("file %s",filename));
fatal (-92,"Can't open oidtable.at");
}
while (1) { /* break out */
if ( (name = get_entry ()) == NULLCP)
break;
add_entry (name,ATTR);
}
(void) fclose (f_table);
(void) strcpy (extension,".oc");
if (( f_table = fopen (filename,"r")) == (FILE *) NULL) {
LLOG (log_dsap,LLOG_FATAL,("file %s",filename));
fatal (-93,"Can't open oidtable.oc");
}
while (1) { /* break out */
if ( (name = get_entry ()) == NULLCP)
break;
add_entry (name,OC);
}
(void) fclose (f_table);
}
add_entry_aux (a,b,c,d)
char * a;
caddr_t b;
int c;
char * d;
{
int i;
register struct pair *p;
if ((p = (struct pair *) calloc (1, sizeof *p)) == NULL) {
SLOG (log_dsap, LLOG_EXCEPTIONS, NULLCP,
("calloc of alias structure failed"));
return;
}
p -> p_name = a;
p -> p_value = b;
p -> p_type = c;
p -> p_chain = Pbuckets[i = PHASH (p -> p_name)];
Pbuckets[i] = p;
if (d != NULLCP) {
if ((p = (struct pair *) calloc (1, sizeof *p)) == NULL) {
SLOG (log_dsap, LLOG_EXCEPTIONS, NULLCP,
("calloc of alias (2) structure failed"));
return;
}
Palias[Palias_next].a_full = a;
Palias[Palias_next++].a_alias = d;
p -> p_name = d;
p -> p_value = b;
p -> p_type = c;
p -> p_chain = Pbuckets[i = PHASH (p -> p_name)];
Pbuckets[i] = p;
}
}
static add_entry (newname,towho)
char * newname;
int towho;
{
register char *nptr, *ptr, *sep;
OID oid;
oid_table * Current;
char * alias = NULLCP;
if ((nptr = index (newname,SEPERATOR)) == 0) {
LLOG (log_dsap,LLOG_FATAL,("oid missing in %s",newname));
return;
}
*nptr = 0;
if ((sep = index (newname,COMMA)) != 0) {
*sep++ = 0;
alias = strdup(newname);
newname = sep;
}
switch (towho) {
case GEN:
Current = &OIDTable[NumEntries];
(void) strcpy (Current->ot_name, newname);
add_entry_aux (Current->ot_name,(caddr_t)&OIDTable[NumEntries],GEN,alias);
break;
case ATTR:
Current = &attrOIDTable[attrNumEntries].oa_ot;
(void) strcpy (Current->ot_name, newname);
add_entry_aux (Current->ot_name,(caddr_t)&attrOIDTable[attrNumEntries],ATTR,alias);
break;
case OC:
Current = &ocOIDTable[ocNumEntries].oc_ot;
(void) strcpy (Current->ot_name, newname);
add_entry_aux (Current->ot_name,(caddr_t)&ocOIDTable[ocNumEntries],OC,alias);
break;
}
*nptr = SEPERATOR;
nptr++;
if ((sep = index (nptr,SEPERATOR)) != 0)
*sep++ = 0;
ptr = get_oid (nptr);
if (ptr == NULLCP) {
LLOG (log_dsap,LLOG_FATAL,("invalid oid '%s'",nptr));
return;
}
(void) strcpy (Current->ot_stroid,ptr);
oid = str2oid (Current->ot_stroid);
if (oid == NULLOID)
Current->ot_oid = NULLOID;
/* only reason for failure is generic oid of length 1 */
else
Current->ot_oid = oid_cpy (oid);
/* now do special work for at and oc types */
switch (towho) {
case GEN:
NumEntries++; /* nothing else to do */
break;
case ATTR:
if (sep == 0)
LLOG (log_dsap,LLOG_FATAL,("syntax missing in %s",newname));
else {
if (( ptr = index (sep,SEPERATOR)) != NULLCP) {
*ptr++ = 0;
if (lexequ (ptr,"FILE") != 0)
LLOG (log_dsap,LLOG_FATAL,("FILE syntax expected, '%s' found",ptr));
else {
attrOIDTable[attrNumEntries].oa_syntax = str2syntax(sep);
attrOIDTable[attrNumEntries].oa_syntax += AV_WRITE_FILE;
attrNumEntries++;
}
} else {
attrOIDTable[attrNumEntries].oa_syntax = str2syntax(sep);
attrNumEntries++;
}
}
break;
case OC:
if (oc_load != NULLIFP) {
if ((*oc_load)(sep,ptr) == OK)
ocNumEntries++;
}
else
ocNumEntries++;
}
return;
}
char * get_oid (str)
char * str;
{
static char buffer [BUFSIZE];
register char * ptr = buffer;
register char * dotptr;
register char * soid;
char deref = FALSE;
if ( ! isdigit(*str))
if ((dotptr = index (str,DOT)) == 0)
return (name2gen(str));
while (*str != 0) {
if ( (! isdigit (*str)) && (*str != DOT) ) {
if ((dotptr = index (str,DOT)) == 0) {
*--ptr = 0;
return (buffer);
}
*dotptr = 0;
*ptr = 0;
if ((soid = name2gen(str)) == NULLCP) {
*dotptr = DOT;
return (NULLCP);
}
*dotptr = DOT;
str = dotptr;
if (deref) {
if ((dotptr = rindex (soid,DOT)) == 0)
return (NULLCP); /* invalid */
if ((strncmp (soid,buffer,strlen(buffer))) != 0)
return (NULLCP); /* inconsistent */
}
deref = TRUE;
(void) strcpy (buffer,soid);
ptr = buffer + strlen (soid);
}
else
*ptr++ = *str++;
}
*ptr = 0;
return (buffer);
}
static char * name2gen (nodename)
char * nodename;
{
register int i;
register oid_table * tblptr = &OIDTable[0];
for (i=0;i<NumEntries;i++,tblptr++) {
if (lexequ (tblptr->ot_name, nodename) == 0)
return (tblptr->ot_stroid);
}
return (NULLCP);
}
static char * soid2gen (soid)
char * soid;
{
register int i;
register oid_table * tblptr = &OIDTable[0];
for (i=0;i<NumEntries;i++,tblptr++) {
if (strcmp (tblptr->ot_stroid, soid) == 0)
return (tblptr->ot_name);
}
return (NULLCP);
}
static char * get_line ()
{
static char buffer [LINESIZE];
register char * buf = buffer;
register char * ptr = buffer;
register int done;
/* read line, ignore comments, join lines in '/' found */
do {
done = TRUE;
if (fgets (buf,LINESIZE,f_table) == NULLCP)
return (NULLCP);
StripSpace (buf);
if (*buf != 0) {
ptr += strlen(buf) - 1;
if (*ptr == '\\') {
buf = ptr;
done = FALSE;
}
} else
done = FALSE;
} while (done == FALSE);
return (buffer);
}
static char * get_entry ()
{
register char * buf;
register char * ptr;
/* read next line - test for macro defs */
while (1) { /* return out */
if ((buf = get_line ()) == NULLCP)
return (NULLCP);
if ((ptr = index (buf,'=')) != 0) {
*ptr++ = 0;
if (oc_macro_add != NULLIFP) {
(*oc_macro_add) (buf,ptr);
}
} else
return (buf);
}
}
oid_table_attr *name2attr(nodename)
char * nodename;
{
register int i;
register char * ptr;
char * str;
register oid_table_attr * atrptr = &attrOIDTable[0];
attr_index = 0;
if ((ptr = rindex (nodename,DOT)) == 0) {
struct pair *p;
for (p = Pbuckets[PHASH (nodename)];
p && lexequ (p -> p_name, nodename);
p = p -> p_chain)
; /* NO-OP */
if ((p != NULL) && (p->p_type == ATTR)) {
attr_index = ((oid_table_attr *) p->p_value) - atrptr;
return ( (oid_table_attr *) p->p_value);
} else
return (NULLTABLE_ATTR);
} else {
str = get_oid (nodename);
if (isdigit (*++ptr)) {
for (i=0;i<attrNumEntries;i++,atrptr++)
if (lexequ (atrptr->oa_ot.ot_stroid, str) == 0) {
attr_index = atrptr - &attrOIDTable[0];
return (atrptr);
}
return (NULLTABLE_ATTR);
} else {
for (i=0;i<attrNumEntries;i++,atrptr++)
if (lexequ (atrptr->oa_ot.ot_name, ptr) == 0)
if (strncmp (str,atrptr->oa_ot.ot_stroid,strlen(str)) == 0) {
attr_index = atrptr - &attrOIDTable[0];
return (atrptr);
} else
return (NULLTABLE_ATTR);
}
}
return (NULLTABLE_ATTR);
}
set_heap (x)
AttributeType x;
{
if (x->at_table == NULLTABLE_ATTR)
return 0;
return (attr_index = x->at_table - &attrOIDTable[0]);
}
oid_table_attr *oid2attr(oid)
OID oid;
{
register int i;
register oid_table_attr * ptr = &attrOIDTable[0];
for (i=0;i<attrNumEntries;i++,ptr++) {
if (oid_cmp (ptr->oa_ot.ot_oid, oid) == 0)
return (ptr);
}
return (NULLTABLE_ATTR);
}
objectclass *name2oc(nodename)
register char * nodename;
{
register int i;
register char * ptr;
char * str;
register objectclass * oc = & ocOIDTable[0];
if ((ptr = rindex (nodename,DOT)) == 0) {
struct pair *p;
for (p = Pbuckets[PHASH (nodename)];
p && lexequ (p -> p_name, nodename);
p = p -> p_chain)
; /* NO-OP */
if ((p != NULL) && (p->p_type == OC))
return ( (objectclass *) p->p_value);
else
return (NULLOBJECTCLASS);
} else {
str = get_oid (nodename);
if (isdigit (*++ptr)) {
for (i=0;i<ocNumEntries;i++,oc++)
if (lexequ (oc->oc_ot.ot_stroid, str) == 0)
return (oc);
return (NULLOBJECTCLASS);
} else {
for (i=0;i<ocNumEntries;i++,oc++)
if (lexequ (oc->oc_ot.ot_name, ptr) == 0)
if (strncmp (str,oc->oc_ot.ot_stroid,strlen(str)) == 0)
return (oc);
else
return (NULLOBJECTCLASS);
}
}
return (NULLOBJECTCLASS);
}
objectclass *oid2oc(oid)
OID oid;
{
register int i;
register objectclass * oc = &ocOIDTable[0];
for (i=0;i<ocNumEntries;i++,oc++) {
if (oid_cmp (oc->oc_ot.ot_oid, oid) == 0)
return (oc);
}
return (NULLOBJECTCLASS);
}
static char * full_gen (ot)
oid_table * ot;
{
static char buffer [BUFSIZ];
register char * ptr = buffer;
register char * soid;
register char * str;
buffer [0] = '\0';
str = sprintoid (ot->ot_oid);
soid = str;
while (*str != '\0')
if ( *str == DOT) {
*str = '\0';
ptr = soid2gen (soid);
if (ptr == NULLCP) {
*str++ = DOT;
continue;
}
(void) strcat (buffer,".");
(void) strcat (buffer,ptr);
*str++ = DOT;
} else
str++;
(void) strcat (buffer,".");
(void) strcat (buffer,ot->ot_name);
return (&buffer[1]);
}
static char * part_gen (ot)
oid_table * ot;
{
static char buffer [BUFSIZ];
register char * ptr = buffer;
register char * soid;
register char * str;
char * last;
if (index (ot->ot_name,DOT) == NULLCP)
return (ot->ot_name);
str = sprintoid (ot->ot_oid);
soid = str;
last = str;
while (*str != '\0')
if ( *str == DOT) {
*str = '\0';
ptr = soid2gen (soid);
if (ptr == NULLCP) {
*str++ = DOT;
break;
} else
(void) strcpy (buffer,ptr);
last = str;
*str++ = DOT;
} else
str++;
(void) strcat (buffer,last);
return (buffer);
}
char *attr2name_aux (oa)
register oid_table_attr *oa;
{
if ( oa != NULLTABLE_ATTR)
return (oa->oa_ot.ot_name);
else {
LLOG (log_dsap,LLOG_EXCEPTIONS,("NULL table entry"));
return (NULLCP);
}
}
char *attr2name(oa,format)
register oid_table_attr *oa;
int format;
{
int x;
if ( oa != NULLTABLE_ATTR)
switch (format) {
case OIDFULL:
return (full_gen (&oa->oa_ot));
case OIDNUM:
return (oa->oa_ot.ot_stroid);
default:
/* look for long name */
for (x=0; x<Palias_next; x++)
if (lexequ (Palias[x].a_full,oa->oa_ot.ot_name) == 0)
return (Palias[x].a_alias);
return (part_gen (&oa->oa_ot));
}
else {
LLOG (log_dsap,LLOG_EXCEPTIONS,("NULL table entry"));
return (NULLCP);
}
}
char *oc2name(oc,format)
register objectclass *oc;
int format;
{
if ( oc != NULLOBJECTCLASS)
switch (format) {
case OIDFULL:
return (full_gen (&oc->oc_ot));
case OIDNUM:
return (oc->oc_ot.ot_stroid);
default:
return (part_gen (&oc->oc_ot));
}
else
return (NULLCP);
}
char *oid2name(oid,format)
OID oid;
int format;
{
oid_table_attr * at;
objectclass * oc;
register int i;
register oid_table* ptr = &OIDTable[0];
/* try attribute first */
if (( at = oid2attr (oid)) != NULLTABLE_ATTR)
return (attr2name(at,format)) ;
/* try objectclass */
if (( oc = oid2oc (oid)) != NULLOBJECTCLASS)
return (oc2name(oc,format)) ;
/* try gen tables */
for (i=0; i<NumEntries;i++,ptr++) {
if (oid_cmp (ptr->ot_oid, oid) == 0) {
switch (format) {
case OIDFULL:
return (full_gen (ptr));
case OIDNUM:
return (ptr->ot_stroid);
default:
return (part_gen (ptr));
}
}
}
return (oid2ode (oid));
}
OID name2oid (str)
register char * str;
{
register struct pair *p;
OID ptr;
for (p = Pbuckets[PHASH (str)];
p && lexequ (p -> p_name, str);
p = p -> p_chain)
; /* NO-OP */
if (p != NULL)
switch (p -> p_type) {
case GEN: {
oid_table * ot;
ot = (oid_table *) p->p_value;
return (oid_cpy(ot->ot_oid));
}
case ATTR: {
oid_table_attr * at;
at = (oid_table_attr *) p->p_value;
return (oid_cpy(at->oa_ot.ot_oid)) ;
}
case OC: {
objectclass * oc;
oc = (objectclass *) p->p_value;
return (oid_cpy(oc->oc_ot.ot_oid)) ;
}
default:
if ( (ptr=ode2oid (str)) == NULLOID)
return (oid_cpy(str2oid(str)));
return (oid_cpy(ptr));
}
else {
/* try general oid lookup */
char * x;
if ((x=get_oid(str)) != NULLCP)
return (oid_cpy(str2oid(x)));
/* try isobjects */
if ( (ptr=ode2oid (str)) == NULLOID)
return (oid_cpy(str2oid(str)));
return (oid_cpy(ptr));
}
}
OID grab_oid(at)
AttributeType at;
{
if(at->at_oid == NULLOID)
return(at->at_table->oa_ot.ot_oid);
else
return(at->at_oid);
}
PE oid2pe (o)
OID o;
{
/* needed cos of a macro */
return (oid2prim (o));
}
oidprint (ps,o,format)
PS ps;
OID o;
int format;
{
extern int oidformat;
if (format == READOUT)
ps_printf (ps,"%s",oid2name(o,oidformat));
else
ps_printf (ps,"%s",oid2name(o,OIDPART));
}
OID dup_prim2oid (pe)
PE pe;
{
OID oid;
if (! test_prim_pe (pe,PE_CLASS_UNIV,PE_PRIM_OID))
return (NULLOID);
if (( oid = prim2oid(pe)) == NULLOID)
return (NULLOID);
return (oid_cpy(oid));
}
oid_syntax ()
{
(void) add_attribute_syntax ("oid",
(IFP) oid2pe, (IFP) dup_prim2oid,
(IFP) name2oid, oidprint,
(IFP) oid_cpy, oid_cmp,
oid_free, NULLCP,
NULLIFP, FALSE );
}