|
Graphviz 2.29.20120208.0545
|
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 }
1.7.4