DataMuseum.dk

Presents historical artifacts from the history of:

DKUUG/EUUG Conference tapes

This is an automatic "excavation" of a thematic subset of
artifacts from Datamuseum.dk's BitArchive.

See our Wiki for more about DKUUG/EUUG Conference tapes

Excavated with: AutoArchaeologist - Free & Open Source Software.


top - metrics - download
Index: T r

⟦ad1bac249⟧ TextFile

    Length: 5616 (0x15f0)
    Types: TextFile
    Names: »readobjects.c«

Derivation

└─⟦3d0c2be1b⟧ Bits:30001254 ISODE-5.0 Tape
    └─⟦eba4602b1⟧ »./isode-5.0.tar.Z« 
        └─⟦d3ac74d73⟧ 
            └─⟦this⟧ »isode-5.0/others/mosy/readobjects.c« 

TextFile

/* readobjects.c - managed objects database */

#ifndef	lint
static char *rcsid = "$Header: /f/osi/others/mosy/RCS/readobjects.c,v 6.0 89/03/18 23:36:09 mrose Rel $";
#endif

/* 
 * $Header: /f/osi/others/mosy/RCS/readobjects.c,v 6.0 89/03/18 23:36:09 mrose Rel $
 *
 *
 * $Log:	readobjects.c,v $
 * Revision 6.0  89/03/18  23:36:09  mrose
 * Release 5.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 <ctype.h>
#include <stdio.h>
#include "mosy.h"

/* \f

   DATA */

/* hash buckets for text2obj */

#define	TBUCKETS	128
#define	THASH(nm)	(((((nm)[0]) - ((nm)[1])) & 0x1f) + (((nm)[2]) & 0x5f))

static int once_only = 0;
static OT  Tbuckets[TBUCKETS];


OID	resolve ();

/* \f

 */

int	readobjects (types, names)
register OT types;
register struct object_name *names;
{
    register int    i;
    int	    again,
	    hit;
    register OT	   ot;

    if (once_only == 0) {
	bzero ((char *) Tbuckets, sizeof Tbuckets);

	if (!read_name ("iso", "1")
	        || !read_name ("ccitt", "2")
	        || !read_name ("joint-iso-ccitt", "3"))
	    return 0;

	once_only = 1;
    }

    if (names)
	for (; names -> on_name; names++)
	    if (!read_name (names -> on_name, names -> on_value))
		return 0;

    if (types)
	for (; types -> ot_text; types++)
	    if (!(read_type (types)))
		return 0;


    hit = 1;
    do {
	if (!hit)
	    return 0;

	again = hit = 0;

	for (i = 0; i < TBUCKETS; i++)
	    for (ot = Tbuckets[i]; ot && ot -> ot_text; ot = ot -> ot_chain)
		if (ot -> ot_name == NULLOID)
		    if (ot -> ot_name = resolve (ot))
			hit = 1;
		    else
			again = 1;
    } while (again);

#ifdef	notdef
{
    for (i = 0; i < TBUCKETS; i++) {
	hit = 0;
	for (ot = Tbuckets[i]; ot && ot -> ot_text; ot = ot -> ot_chain) {
	    if (!hit)
		printf ("Bucket %d:\n", i), hit = 1;
	    printf ("  %s %s %s\n",
		    ot -> ot_text, ot -> ot_id, sprintoid (ot -> ot_name));
	}
    }
}
#endif

    return 1;
}

/* \f

 */

static int  read_name (name, value)
char   *name,
       *value;
{
    int	    i;
    register OT	   ot;

    if (text2obj (name)) {
	fprintf (stderr, "duplicate object \"%s\"\n", name);
	return 0;
    }

    if ((ot = (OT) calloc (1, sizeof *ot)) == NULL)
	return 0;
    ot -> ot_text = name;
    ot -> ot_id = value;
    
    ot -> ot_chain = Tbuckets[i = THASH (name)];
    Tbuckets[i] = ot;

    return 1;
}

/* \f

 */

static int  read_type (ot)
register OT	ot;
{
    int	    i;

    if (text2obj (ot -> ot_text)) {
	fprintf (stderr, "duplicate object \"%s\"\n", ot -> ot_text);
	return 0;
    }

    ot -> ot_chain = Tbuckets[i = THASH (ot -> ot_text)];
    Tbuckets[i] = ot;

    return 1;
}

/* \f

 */

static OID  resolve (ot)
register OT	ot;
{
    int	    i;
    char   *id;
    unsigned int elements[NELEM + 1];
    register char *cp;
    register OT	   ot2;
    struct OIDentifier oids;
    register OID   oid = &oids;

    oid -> oid_elements = elements;

    if (cp = index (id = ot -> ot_id, '.'))
	*cp = NULL;
    if (isdigit (*id)) {
	ot2 = NULLOT;
	oid -> oid_nelem = 1;
	oid -> oid_elements[0] = atoi (id);
	if (cp)
	    *cp = '.';
    }
    else {
	ot2 = text2obj (id);
	if (cp)
	    *cp = '.';
	if (ot2 == NULLOT || ot2 -> ot_name == NULLOID)
	    return NULLOID;

	oid -> oid_nelem = ot2 -> ot_name -> oid_nelem;
	bcopy ((char *) ot2 -> ot_name -> oid_elements,
	       (char *) oid -> oid_elements,
	       sizeof elements);
    }

    if (cp) {
	if ((i = str2elem (++cp, oid -> oid_elements + oid -> oid_nelem)) < 1)
	    return NULLOID;
	oid -> oid_nelem += i;
	if (ot2) {	/* XXX: not normalized... */
	    ot -> ot_sibling = ot2 -> ot_children;
	    ot2 -> ot_children = ot;
	}
    }

    return oid_cpy (oid);
}

/* \f

 */

/* Partial matches are made only on leaf nodes... */

static char *roots[] = { NULL, "iso", "ccitt", "joint-iso-ccitt" };


OT	name2obj (oid)
OID	oid;
{
    register int    i,
    		    j;
    register unsigned *ip;
    register OID   nm;
    register OT	   ot;

    if (oid == NULLOID
	    || oid -> oid_nelem < 1
	    || (i = (ip = oid -> oid_elements)[0])
		    >= (sizeof roots / sizeof roots[0])
	    || (ot = text2obj (roots[i])) == NULL)
	return NULLOT;

    i = 0;
    while (ot) {
	if ((j = (nm = ot -> ot_name) -> oid_nelem) > oid -> oid_nelem)
	    return NULLOT;
	
	if (bcmp ((char *) ip, (char *) (nm -> oid_elements + i),
		  (j - i) * sizeof *ip))
	    ot = ot -> ot_sibling;
	else
	    if (oid -> oid_nelem == j || ot -> ot_children == NULLOT)
		break;
	    else {
		ot = ot -> ot_children;
		ip = oid -> oid_elements + j, i = j;
	    }
    }

    return ot;
}

/* \f

 */

OT	text2obj (text)
char   *text;
{
    register OT	   ot;

    if (text == NULL || once_only == 0)
	return NULLOT;

    for (ot = Tbuckets[THASH (text)];
	     ot && strcmp (ot -> ot_text, text);
	     ot = ot -> ot_chain)
	continue;

    return ot;
}

/* \f

 */

char   *oid2ode (oid)
OID	oid;
{
    register int    i;
    register char  *bp;
    register unsigned int *ip;
    register OID    oid2;
    register OT	    ot;
    static char buffer[BUFSIZ];

    if ((ot = name2obj (oid)) == NULLOT)
	return sprintoid (oid);

    (void) strcpy (bp = buffer, ot -> ot_text);
    bp += strlen (bp);
    for (ip = oid -> oid_elements + (oid2 = ot -> ot_name) -> oid_nelem,
	 	i = oid -> oid_nelem - oid2 -> oid_nelem;
	     i-- > 0;
	     ip++) {
	(void) sprintf (bp, ".%d", *ip);
	bp += strlen (bp);
    }

    return buffer;
}