1/*********************************************************************** 2* * 3* This software is part of the ast package * 4* Copyright (c) 1985-2011 AT&T Intellectual Property * 5* and is licensed under the * 6* Common Public License, Version 1.0 * 7* by AT&T Intellectual Property * 8* * 9* A copy of the License is available at * 10* http://www.opensource.org/licenses/cpl1.0.txt * 11* (with md5 checksum 059e8cd6165cb4c31e351f2b69388fd9) * 12* * 13* Information and Software Systems Research * 14* AT&T Research * 15* Florham Park NJ * 16* * 17* Glenn Fowler <gsf@research.att.com> * 18* David Korn <dgk@research.att.com> * 19* Phong Vo <kpv@research.att.com> * 20* * 21***********************************************************************/ 22#include "dthdr.h" 23static char* Version = "\n@(#)$Id: cdt (AT&T Research) 2005-04-20 $\0\n"; 24 25/* Make a new dictionary 26** 27** Written by Kiem-Phong Vo (5/25/96) 28*/ 29 30#if __STD_C 31Dt_t* dtopen(Dtdisc_t* disc, Dtmethod_t* meth) 32#else 33Dt_t* dtopen(disc, meth) 34Dtdisc_t* disc; 35Dtmethod_t* meth; 36#endif 37{ 38 Dt_t* dt = (Dt_t*)Version; /* shut-up unuse warning */ 39 reg int e; 40 Dtdata_t* data; 41 42 if(!disc || !meth) 43 return NIL(Dt_t*); 44 45 /* allocate space for dictionary */ 46 if(!(dt = (Dt_t*) malloc(sizeof(Dt_t)))) 47 return NIL(Dt_t*); 48 49 /* initialize all absolutely private data */ 50 dt->searchf = NIL(Dtsearch_f); 51 dt->meth = NIL(Dtmethod_t*); 52 dt->disc = NIL(Dtdisc_t*); 53 dtdisc(dt,disc,0); 54 dt->type = DT_MALLOC; 55 dt->nview = 0; 56 dt->view = dt->walk = NIL(Dt_t*); 57 dt->user = NIL(Void_t*); 58 59 if(disc->eventf) 60 { /* if shared/persistent dictionary, get existing data */ 61 data = NIL(Dtdata_t*); 62 if((e = (*disc->eventf)(dt,DT_OPEN,(Void_t*)(&data),disc)) < 0) 63 goto err_open; 64 else if(e > 0) 65 { if(data) 66 { if(data->type&meth->type) 67 goto done; 68 else goto err_open; 69 } 70 71 if(!disc->memoryf) 72 goto err_open; 73 74 free((Void_t*)dt); 75 if(!(dt = (*disc->memoryf)(0, 0, sizeof(Dt_t), disc)) ) 76 return NIL(Dt_t*); 77 dt->searchf = NIL(Dtsearch_f); 78 dt->meth = NIL(Dtmethod_t*); 79 dt->disc = NIL(Dtdisc_t*); 80 dtdisc(dt,disc,0); 81 dt->type = DT_MEMORYF; 82 dt->nview = 0; 83 dt->view = dt->walk = NIL(Dt_t*); 84 } 85 } 86 87 /* allocate sharable data */ 88 if(!(data = (Dtdata_t*)(dt->memoryf)(dt,NIL(Void_t*),sizeof(Dtdata_t),disc)) ) 89 { err_open: 90 free((Void_t*)dt); 91 return NIL(Dt_t*); 92 } 93 94 data->type = meth->type; 95 data->here = NIL(Dtlink_t*); 96 data->htab = NIL(Dtlink_t**); 97 data->ntab = data->size = data->loop = 0; 98 data->minp = 0; 99 100done: 101 dt->data = data; 102 dt->searchf = meth->searchf; 103 dt->meth = meth; 104 105 if(disc->eventf) 106 (*disc->eventf)(dt, DT_ENDOPEN, (Void_t*)dt, disc); 107 108 return dt; 109} 110