void n_addrec (NDX *n, char *r, unsigned long index_num) { unsigned char i, num; char *rs; int cmp, top; unsigned long page_index; bool changed[64], header_changed; NDX_NODE* key; key=(NDX_NODE*)malloc(8+n->key_length); rs=(char*)malloc(n->key_length); strscpy(rs,r,n->key_length); memset(changed,0,sizeof(changed)); header_changed=false; page_index=n->root_page; top=-1; while (page_index) { get_page(n,page_index,++top); if (pages[top].keys[0]->index) break; for (i=0;i<pages[top].key_num;i++) { cmp=memcmp(rs,pages[top].keys[i]->key_data,n->key_length); if ((cmp<0) || (cmp==0 && index_num<pages[top].keys[i]->index)) { page_index=pages[top].keys[i]->left_page; break; } } if (i==pages[top].key_num) { memcpy(pages[top].keys[--i],rs,n->key_length); changed[i]=true; page_index=pages[top].keys[--i]->left_page; } } key=make_node(n,0,index_num,rs); addrec(n,num=top,key); changed[top]=true; while (pages[num].key_num>n->max_keys && num>1) { spilt_page(n,num,++top); header_changed=true; addrec(n,num-1,get_last(n,num)); changed[num]=changed[top]=true; } if (pages[num].key_num>n->max_keys) { spilt_page(n,num,++top); header_changed=true; changed[num]=changed[top]=true; make_page(n,num,top,top+1); top++; changed[top]=true; } for (i=0;i<=top;i++) { if (changed[i]) put_page(n,i); dispose_page(i); } if (header_changed) write_total(n); }
void MultiDef::init() { for ( unsigned i = 0; i < elems.size(); i++ ) { addrec( &elems[i] ); } computehull(); }
kint kim_addint(KIM *im, const kchar *id, kint def, kint flg, ATPROC at, const kchar *desc) { KRtiRec *rec = addrec(im, id, RT_INT, (kvoid *) def, flg, at, desc); return rec ? 0 : -1; }