/misc/src/release/graphviz-2.18-1/src/graphviz-2.18/lib/cdt/dtopen.c

Go to the documentation of this file.
00001 /* $Id: dtopen.c,v 1.1.1.1 2004/12/23 04:04:00 ellson Exp $ $Revision: 1.1.1.1 $ */
00002 /* vim:set shiftwidth=4 ts=8: */
00003 
00004 /**********************************************************
00005 *      This software is part of the graphviz package      *
00006 *                http://www.graphviz.org/                 *
00007 *                                                         *
00008 *            Copyright (c) 1994-2004 AT&T Corp.           *
00009 *                and is licensed under the                *
00010 *            Common Public License, Version 1.0           *
00011 *                      by AT&T Corp.                      *
00012 *                                                         *
00013 *        Information and Software Systems Research        *
00014 *              AT&T Research, Florham Park NJ             *
00015 **********************************************************/
00016 
00017 #include        "dthdr.h"
00018 
00019 #ifdef DMALLOC
00020 #include "dmalloc.h"
00021 #endif
00022 
00023 static char *Version = "\n@(#)cdt (AT&T Labs - kpv) 1999-11-01\0\n";
00024 
00025 /*      Make a new dictionary
00026 **
00027 **      Written by Kiem-Phong Vo (5/25/96)
00028 */
00029 
00030 #if __STD_C
00031 Dt_t *dtopen(Dtdisc_t * disc, Dtmethod_t * meth)
00032 #else
00033 Dt_t *dtopen(disc, meth)
00034 Dtdisc_t *disc;
00035 Dtmethod_t *meth;
00036 #endif
00037 {
00038     Dt_t *dt = (Dt_t *) Version;        /* shut-up unuse warning */
00039     reg int e;
00040     Dtdata_t *data;
00041 
00042     if (!disc || !meth)
00043         return NIL(Dt_t *);
00044 
00045     /* allocate space for dictionary */
00046     if (!(dt = (Dt_t *) malloc(sizeof(Dt_t))))
00047         return NIL(Dt_t *);
00048 
00049     /* initialize all absolutely private data */
00050     dt->searchf = NIL(Dtsearch_f);
00051     dt->meth = NIL(Dtmethod_t *);
00052     dt->disc = NIL(Dtdisc_t *);
00053     dtdisc(dt, disc, 0);
00054     dt->nview = 0;
00055     dt->view = dt->walk = NIL(Dt_t *);
00056 
00057     if (disc->eventf) {         /* if shared/persistent dictionary, get existing data */
00058         data = NIL(Dtdata_t *);
00059         if ((e =
00060              (*disc->eventf) (dt, DT_OPEN, (Void_t *) (&data),
00061                               disc)) != 0) {
00062             if (e < 0 || !data || !(data->type & meth->type)) {
00063                 free((Void_t *) dt);
00064                 return NIL(Dt_t *);
00065             } else
00066                 goto done;
00067         }
00068     }
00069 
00070     /* allocate sharable data */
00071     data =
00072         (Dtdata_t *) (dt->memoryf) (dt, NIL(Void_t *), sizeof(Dtdata_t),
00073                                     disc);
00074     if (!data) {
00075         free((Void_t *) dt);
00076         return NIL(Dt_t *);
00077     }
00078     data->type = meth->type;
00079     data->here = NIL(Dtlink_t *);
00080     data->htab = NIL(Dtlink_t **);
00081     data->ntab = data->size = data->loop = 0;
00082 
00083   done:
00084     dt->data = data;
00085     dt->searchf = meth->searchf;
00086     dt->meth = meth;
00087 
00088     return dt;
00089 }
00090 
00091 #if __hppa
00092 
00093 /*
00094  * some dll implementations forget that data symbols
00095  * need address resolution too
00096  */
00097 
00098 #if __STD_C
00099 int _dt_dynamic_data(void)
00100 #else
00101 int _dt_dynamic_data()
00102 #endif
00103 {
00104     return (Dtset != 0) + (Dtlist != 0) + (Dttree != 0);
00105 }
00106 
00107 #endif                          /* __hppa */

Generated on Mon Mar 31 19:03:23 2008 for Graphviz by  doxygen 1.5.1