static knh_fieldn_t knh_getname(Ctx *ctx, knh_bytes_t n, knh_fieldn_t def) { OLD_LOCK(ctx, LOCK_SYSTBL, NULL); knh_index_t idx = knh_DictCaseSet_index(DP(ctx->sys)->nameDictCaseSet, n); if(idx == -1) { if(def == FN_NEWID) { idx = knh_addname(ctx, new_S(ctx, n), knh_DictCaseSet_set); } else { idx = def - MN_OPSIZE; } } else { idx = knh_DictCaseSet_valueAt(DP(ctx->sys)->nameDictCaseSet, idx) - 1; } OLD_UNLOCK(ctx, LOCK_SYSTBL, NULL); return (knh_fieldn_t)idx + MN_OPSIZE; }
static ksymbol_t addSymbol(CTX, kbytes_t t) { char symbuf[K_SYMBOL_MAXSIZ]; size_t i, pos = 0; int toLower = isupper(t.buf[0]) ? 1 : 0; for(i = 0; i < t.len; i++) { int ch = t.buf[i]; if(ch == '_') { toLower = 1; continue; } symbuf[pos] = (toLower) ? tolower(ch) : ch; toLower = 0; pos++; if(!(pos < sizeof(symbuf) - 2)) break; } symbuf[pos] = 0; return knh_addname(_ctx, new_kString((const char*)symbuf, pos, SPOL_ASCII|SPOL_POOL), knh_DictSet_set); }