long ei_reg_getival(ei_reg *reg, const char *key) { ei_hash *tab; ei_reg_obj *obj=NULL; if (!key || !reg) return -1; /* return EI_BADARG; */ tab = reg->tab; if (!(obj=ei_hash_lookup(tab,key))) return -1; /* return EI_NOTFOUND; */ if (obj->attr & EI_DELET) return -1; /* return EI_NOTFOUND; */ if (ei_reg_typeof(obj) != EI_INT) return -1; /* return EI_TYPE; */ return obj->val.i; }
static int mn_send_write(int fd, erlang_pid *mnesia, const char *key, ei_reg_obj *obj) { char sbuf[EISMALLBUF]; char *dbuf = NULL; char *msgbuf; int index = 0; int keylen = strlen(key) + 1; int len = 32 + keylen + obj->size; if (len > EISMALLBUF) if (!(dbuf = malloc(len))) return -1; msgbuf = (dbuf ? dbuf : sbuf); ei_encode_version(msgbuf,&index); ei_encode_tuple_header(msgbuf,&index,6); ei_encode_atom(msgbuf,&index,EI_MNESIA_WRITE); ei_encode_string(msgbuf,&index,key); ei_encode_long(msgbuf,&index,keylen); ei_encode_long(msgbuf,&index,obj->attr); ei_encode_long(msgbuf,&index,obj->size); switch (ei_reg_typeof(obj)) { case EI_INT: ei_encode_long(msgbuf,&index,obj->val.i); break; case EI_FLT: ei_encode_double(msgbuf,&index,obj->val.f); break; case EI_STR: if (obj->size > 0) ei_encode_string(msgbuf,&index,obj->val.s); else ei_encode_long(msgbuf,&index, (long)NULL); /* just the NULL pointer */ break; case EI_BIN: if (obj->size > 0) ei_encode_binary(msgbuf,&index,obj->val.p,obj->size); else ei_encode_long(msgbuf,&index,(long)(obj->val.p)); /* just the pointer */ break; default: if (dbuf) free(dbuf); return -1; } /* send it */ if (ei_send_encoded(fd,mnesia,msgbuf,index)) { if (dbuf) free(dbuf); return -1; } if (dbuf) free(dbuf); return 0; }
const char *ei_reg_getsval(ei_reg *reg, const char *key) { ei_hash *tab; ei_reg_obj *obj=NULL; if (!key || !reg) return NULL; /* return (const char *)EI_BADARG; */ tab = reg->tab; if ((!(obj=ei_hash_lookup(tab,key))) || /* return (const char *)EI_NOTFOUND; */ (obj->attr & EI_DELET) || /* return (const char *)EI_NOTFOUND; */ (ei_reg_typeof(obj) != EI_STR)) /* return (const char *)EI_TYPE; */ return NULL; return obj->val.s; }
const void *ei_reg_getpval(ei_reg *reg, const char *key, int *size) { ei_hash *tab; ei_reg_obj *obj; if (!key || !reg) return NULL; tab = reg->tab; if ((!(obj=ei_hash_lookup(tab,key))) || /* return (const void *)EI_NOTFOUND; */ (obj->attr & EI_DELET) || /* return (const void *)EI_NOTFOUND; */ (ei_reg_typeof(obj) != EI_STR)) /* return (const void *)EI_TYPE; */ return NULL; if (size) *size=obj->size; return obj->val.p; }
/* really remove an object (help function to hash_freetab) */ static void obj_free(void *p) { ei_reg_obj *obj = p; if (obj) { switch (ei_reg_typeof(obj)) { case EI_STR: free(obj->val.s); break; case EI_BIN: free(obj->val.p); break; } /* really remove the inode (don't use freelist here) */ free(obj); } return; }
int ei_reg_setsval(ei_reg *reg, const char *key, const char *s) { ei_hash *tab; ei_reg_obj *obj=NULL; int len = 0; if (!key || !reg) return -1; /* return EI_BADARG; */ tab = reg->tab; if (s) len = strlen(s) +1; if ((obj=ei_hash_lookup(tab,key))) { /* object with same name already exists */ switch (ei_reg_typeof(obj)) { case EI_INT: break; case EI_FLT: break; case EI_STR: if (obj->size > 0) free(obj->val.s); break; case EI_BIN: if (obj->size > 0) free(obj->val.p); break; default: return -1; /* return EI_UNKNOWN; */ } } else { /* object is new */ if (!(obj=ei_reg_make(reg,EI_STR))) return -1; /* return EI_NOMEM; */ ei_hash_insert(tab,key,obj); } obj->attr = EI_STR | EI_DIRTY; obj->val.s=(char *)s; obj->size = len; return 0; }
/* free a registry object (inode) on the freelist. The "value" * contained by the object is removed. */ void ei_reg_free(ei_reg *reg, ei_reg_obj *obj) { /* free the value part */ switch (ei_reg_typeof(obj)) { case EI_STR: free(obj->val.s); break; case EI_BIN: free(obj->val.p); break; } /* fprintf(stderr,"%s:%d: saving %p on freelist\n",__FILE__,__LINE__,obj);*/ /* save the rest on the freelist */ obj->next = reg->freelist; reg->freelist = obj; return; }