| top | | - #define Tcl_HashTable* internal—The hash table internal representation.
| - input Obj mapping—The object with the representation
|
|
|
#define internal(mapping) ((Tcl_HashTable*)((mapping)->internalRep.otherValuePtr))
| ^ | | | | | | section top | |
*v = Tcl_GetHashValue(*e);
if (!*v) {
Tcl_Panic("hash associative mapping: internal damage (null hashvalue) :%s",Tcl_GetHashKey(internal(mapping),*e));
}
| ^ | | | | | | section top | |
static void first(Obj mapping,Tcl_HashSearch **S,Tcl_HashEntry **e,HashValue **v);
static void next(Obj mapping,Tcl_HashSearch **S,Tcl_HashEntry **e,HashValue **v);
static void seek(Obj mapping,chars key,Tcl_HashEntry **e,HashValue **v,int *new);
| ^ | | | | | | section top | |
static void first(Obj mapping,Tcl_HashSearch **S,Tcl_HashEntry **e,HashValue **v) {
*S = heap(Tcl_HashSearch);
*e = Tcl_FirstHashEntry(internal(mapping),*S);
if (*e) {
<Ensure the existence of a HashValue>
}
}
static void next(Obj mapping,Tcl_HashSearch **S,Tcl_HashEntry **e,HashValue **v) {
*e = Tcl_NextHashEntry(*S);
if (*e) {
<Ensure the existence of a HashValue>
}else {
dispose(*S); *S = 0;
}
}
static void seek(Obj mapping,chars key,Tcl_HashEntry **e,HashValue **v,int *new) {
if (new) {
*e = Tcl_CreateHashEntry(internal(mapping),key,new);
if (*new) {
*v = heap(HashValue); (*v)->data = 0; (*v)->flags = 0;
Tcl_SetHashValue(*e,*v);
}else {
<Ensure the existence of a HashValue>
}
}else {
*e = Tcl_FindHashEntry(internal(mapping),key);
if (*e) {
<Ensure the existence of a HashValue>
}
}
}
| ^ | | | | | | section top | |
static Tcl_HashTable *createmapping(void);
static void deletemapping(Obj mapping);
| ^ | Definition continued at: 14, 16, 19, 21. | | | | | section top | |
static Tcl_HashTable *createmapping(void) {
Tcl_HashTable *mapping = heap(Tcl_HashTable);
Tcl_InitHashTable(mapping,TCL_STRING_KEYS);
return mapping;
}
static void deletemapping(Obj mapping) {
Tcl_HashEntry *e; HashValue *v; Tcl_HashSearch *S;
for (first(mapping,&S,&e,&v); e; next(mapping,&S,&e,&v)) {
decr(v->data); dispose(v);
}
Tcl_DeleteHashTable(internal(mapping));
dispose(internal(mapping));
}
| ^ | | | | | | section top | |
static void freeHashtable(Obj mapping);
static void duplicateHashtable(Obj mapping,Obj newmapping);
static void updateHashTable(Obj obj,Tcl_DString *D);
static int setHashtableInternalRepresentation(Intr intr,Obj mapping);
static int internalHashTable(Intr intr,Obj obj,ptr cookie,ptr*);
| ^ | Definition continued at: 16, 19, 21. | | | | | section top | |
static void freeHashtable(Obj mapping) {
deletemapping(mapping);
mapping->typePtr = 0;
}
static void duplicateHashtable(Obj mapping,Obj newmapping) {
Tcl_HashSearch *S; Tcl_HashEntry *e; HashValue *v;
if ((newmapping)->typePtr && (newmapping)->typePtr->freeIntRepProc)
(newmapping)->typePtr->freeIntRepProc((newmapping));
(newmapping)->typePtr = (Tcl_ObjType*)(&WyrmAssocHashType);
newmapping->internalRep.otherValuePtr = createmapping();
for (first(mapping,&S,&e,&v); e; next(mapping,&S,&e,&v)) {
Tcl_HashEntry *ne; HashValue *nv; int nw;
seek(newmapping,Tcl_GetHashKey(internal(mapping),e),&ne,&nv,&nw);
decr(nv->data); nv->data = incr(v->data?v->data:Tcl_NewObj()); nv->flags = v->flags;
}
}
static void updateHashTable(Obj mapping,Tcl_DString *D) {
Tcl_HashSearch *S; Tcl_HashEntry *e; HashValue *v;
for (first(mapping,&S,&e,&v); e; next(mapping,&S,&e,&v)) {
chars key = Tcl_GetHashKey(internal(mapping),e);
wyrm_assocUpdateEntry(D,key,v->data,v->flags);
}
}
static int setHashtableInternalRepresentation(Intr intr,Obj mapping) {
return wyrm_assocInternal(intr,mapping,(Tcl_ObjType*)&WyrmAssocHashType);
}
static int internalHashTable(Intr intr,Obj obj,ptr cookie,ptr *x) {
Obj key,data; int flags; Tcl_Obj T;
T.internalRep.otherValuePtr = createmapping();
while (wyrm_assocInternalEntry(cookie,&key,&data,&flags)) {
int new; Tcl_HashEntry *e; HashValue *v;
seek(&T,Tcl_GetString(key),&e,&v,&new);
decr(v->data); v->data = data; v->flags = flags;
decr(key);
}
*x = T.internalRep.otherValuePtr;
return x ? TCL_OK : TCL_ERROR;
}
| ^ | | | | | | section top | |
static Obj newHashTable(Intr intr,Obj base,int N,Obj *P);
static Obj dumpHashtable(Intr intr,Obj mapping,int N,Obj *P);
| ^ | Definition continued at: 19, 21. | | | | | section top | |
static Obj newHashTable(Intr intr,Obj base,int N,Obj *P) {
if (N>0) {
rprintf(intr,"hash associative mapping new: no parameters allowed");
return 0;
}else if (Tcl_ConvertToType(intr,base,(Tcl_ObjType*)&WyrmAssocHashType)==TCL_OK) {
return incr(base);
}else {
return 0;
}
}
| ^ | | | | | | section top | |
static Obj dumpHashtable(Intr intr,Obj mapping,int N,Obj *P) {
if (N>=1 && streq(Tcl_GetString(*P),"-stats")) {
chars s = Tcl_HashStats(internal(mapping));
Obj r = incr(Tcl_NewStringObj(s,-1));
ckfree(s); return r;
}else {
Tcl_HashSearch *S; Tcl_HashEntry *e; HashValue *v; Tcl_DString D; Obj r;
Tcl_DStringInit(&D);
for (first(mapping,&S,&e,&v); e; next(mapping,&S,&e,&v)) {
if (v) {
chars key = Tcl_GetHashKey(internal(mapping),e); char B[20];
Tcl_DStringAppendElement(&D,key);
Tcl_DStringAppendElement(&D,v->data ? Tcl_GetString(v->data) : "<NULL>");
sprintf(B,"%d",v->flags);
Tcl_DStringAppendElement(&D,B);
}
}
r = incr(Tcl_NewStringObj(Tcl_DStringValue(&D),Tcl_DStringLength(&D)));
Tcl_DStringFree(&D); return r;
}
}
| ^ | | | | | | section top | |
static int isHashtableEmpty(Intr intr,Obj mapping);
static Obj cloneHashtable(Intr intr,Obj mapping);
| ^ | Definition continued at: 21. | | | | | section top | |
static int isHashtableEmpty(Intr intr,Obj mapping) {
Tcl_HashSearch *S; Tcl_HashEntry *e; HashValue *v;
first(mapping,&S,&e,&v);
return e==0 ? TCL_OK : TCL_BREAK;
}
| ^ | | | | | | section top | |
static Obj firstHashtable(Intr intr,Obj mapping);
static Obj nextHashtable(Intr intr,Obj mapping,Obj key);
static ptr beginHashtable(Intr intr,Obj mapping,Obj firstHint,bool *sorted);
static int enumerateHashtable(Intr intr,Obj mapping,ptr cookie,Obj *key,Obj *data,int *flags);
static int endHashtable(Intr intr,Obj mapping,ptr cookie);
static int getHashtable(Intr intr,Obj mapping,Obj seek,Obj *key,Obj *data,int *flags);
static int putHashtable(Intr intr,Obj mapping,Obj key,Obj data,int flags);
static int deleteHashtable(Intr intr,Obj mapping,Obj key);
| ^ | | | | | | section top | |
static Obj firstHashtable(Intr intr,Obj mapping) {
rprintf(intr,"hash table is an unsorted mapping");
return 0;
}
static Obj nextHashtable(Intr intr,Obj mapping,Obj key) {
rprintf(intr,"hash table is an unsorted mapping");
return 0;
}
typedef struct {
Tcl_HashSearch *S; Tcl_HashEntry *e; HashValue *v;
} HashEnumerator;
ptr beginHashtable(Intr intr,Obj mapping,Obj firstHint,bool *sorted) {
HashEnumerator *h = heap(HashEnumerator);
first(mapping,&(h->S),&(h->e),&(h->v));
*sorted = false;
return h;
}
int enumerateHashtable(Intr intr,Obj mapping,ptr cookie,Obj *key,Obj *data,int *flags) {
HashEnumerator *h = cookie;
*key = *data = 0; *flags = -1;
if (h->e) {
*key = incr(Tcl_NewStringObj(Tcl_GetHashKey(internal(mapping),h->e),-1));
*data = incr( h->v->data? h->v->data:Tcl_NewObj());
*flags = h->v->flags;
next(mapping,&(h->S),&(h->e),&(h->v));
return TCL_OK;
}else {
return TCL_BREAK;
}
}
int endHashtable(Intr intr,Obj mapping,ptr cookie) {
HashEnumerator *h = cookie;
dispose(h->S); dispose(h);
return TCL_OK;
}
static int getHashtable(Intr intr,Obj mapping,Obj seekkey,Obj *key,Obj *data,int *flags) {
Tcl_HashEntry *e; HashValue *v;
seek(mapping,Tcl_GetString(seekkey),&e,&v,0);
if (e) {
if (key) *key = incr(Tcl_NewStringObj(Tcl_GetHashKey(internal(mapping),e),-1));
if (data) *data = incr(v->data);
if (flags) *flags = v->flags;
return TCL_OK;
}else {
rprintf(intr,"missing: %{y}s",seekkey);
if (key) *key = 0;
if (data) *data = 0;
if (flags) *flags = -1;
return TCL_ERROR;
}
}
static int putHashtable(Intr intr,Obj mapping,Obj key,Obj data,int flags) {
Tcl_HashEntry *e; HashValue *v; int new;
flags &= ~(wyrm_assocFlagCompressKey|wyrm_assocFlagCompressData);
seek(mapping,Tcl_GetString(key),&e,&v,&new);
if (data) {
incr(data); decr(v->data); v->data = data;
}else if (new) {
v->data = incr(Tcl_NewObj());
}
if (flags>=0) {
v->flags = flags;
}else if (new) {
v->flags = 0;
}
Tcl_InvalidateStringRep(mapping);
return TCL_OK;
}
static int deleteHashtable(Intr intr,Obj mapping,Obj key) {
Tcl_HashEntry *e; HashValue *v; int new;
seek(mapping,Tcl_GetString(key),&e,&v,0);
if (e) {
HashValue *v = Tcl_GetHashValue(e);
if (v) {decr(v->data); dispose(v);}
Tcl_DeleteHashEntry(e);
Tcl_InvalidateStringRep(mapping);
return TCL_OK;
}else {
rprintf(intr,"missing: %{y}s",key);
return TCL_ERROR;
}
}
| ^ | | | | | | section top | | MAP Associative mappings. |
| ^ | | |
| |