Graphviz 2.29.20120208.0545
lib/cdt/dtopen.c
Go to the documentation of this file.
00001 #include        "dthdr.h"
00002 static char*     Version = "\n@(#)$Id$\0\n";
00003 
00004 /*      Make a new dictionary
00005 **
00006 **      Written by Kiem-Phong Vo (5/25/96)
00007 */
00008 
00009 #if __STD_C
00010 Dt_t* dtopen(Dtdisc_t* disc, Dtmethod_t* meth)
00011 #else
00012 Dt_t*   dtopen(disc, meth)
00013 Dtdisc_t*       disc;
00014 Dtmethod_t*     meth;
00015 #endif
00016 {
00017         Dt_t*           dt = (Dt_t*)Version;    /* shut-up unuse warning */
00018         reg int         e;
00019         Dtdata_t*       data;
00020 
00021         if(!disc || !meth)
00022                 return NIL(Dt_t*);
00023 
00024         /* allocate space for dictionary */
00025         if(!(dt = (Dt_t*) malloc(sizeof(Dt_t))))
00026                 return NIL(Dt_t*);
00027 
00028         /* initialize all absolutely private data */
00029         dt->searchf = NIL(Dtsearch_f);
00030         dt->meth = NIL(Dtmethod_t*);
00031         dt->disc = NIL(Dtdisc_t*);
00032         dtdisc(dt,disc,0);
00033         dt->type = DT_MALLOC;
00034         dt->nview = 0;
00035         dt->view = dt->walk = NIL(Dt_t*);
00036         dt->user = NIL(Void_t*);
00037 
00038         if(disc->eventf)
00039         {       /* if shared/persistent dictionary, get existing data */
00040                 data = NIL(Dtdata_t*);
00041                 if((e = (*disc->eventf)(dt,DT_OPEN,(Void_t*)(&data),disc)) < 0)
00042                         goto err_open;
00043                 else if(e > 0)
00044                 {       if(data)
00045                         {       if(data->type&meth->type)
00046                                         goto done;
00047                                 else    goto err_open;
00048                         }
00049 
00050                         if(!disc->memoryf)
00051                                 goto err_open;
00052 
00053                         free((Void_t*)dt);
00054                         if(!(dt = (*disc->memoryf)(0, 0, sizeof(Dt_t), disc)) )
00055                                 return NIL(Dt_t*);
00056                         dt->searchf = NIL(Dtsearch_f);
00057                         dt->meth = NIL(Dtmethod_t*);
00058                         dt->disc = NIL(Dtdisc_t*);
00059                         dtdisc(dt,disc,0);
00060                         dt->type = DT_MEMORYF;
00061                         dt->nview = 0;
00062                         dt->view = dt->walk = NIL(Dt_t*);
00063                 }
00064         }
00065 
00066         /* allocate sharable data */
00067         if(!(data = (Dtdata_t*)(dt->memoryf)(dt,NIL(Void_t*),sizeof(Dtdata_t),disc)) )
00068         { err_open:
00069                 free((Void_t*)dt);
00070                 return NIL(Dt_t*);
00071         }
00072 
00073         data->type = meth->type;
00074         data->here = NIL(Dtlink_t*);
00075         data->htab = NIL(Dtlink_t**);
00076         data->ntab = data->size = data->loop = 0;
00077         data->minp = 0;
00078 
00079 done:
00080         dt->data = data;
00081         dt->searchf = meth->searchf;
00082         dt->meth = meth;
00083 
00084         if(disc->eventf)
00085                 (*disc->eventf)(dt, DT_ENDOPEN, (Void_t*)dt, disc);
00086 
00087         return dt;
00088 }