static bool istif(const char *arg) { return isext(arg, ".tif") || isext(arg, ".TIF") || isext(arg, ".tiff") || isext(arg, ".TIFF"); }
JRB jrb_find_gte_gen(JRB n, Jval key,int (*fxn)(Jval, Jval), int *fnd) { int cmp; *fnd = 0; if (!ishead(n)) { fprintf(stderr, "jrb_find_gte_str called on non-head 0x%p\n", (void *)n); exit(1); } if (n->parent == n) return n; cmp = (*fxn)(key, n->blink->key); if (cmp == 0) { *fnd = 1; return n->blink; } if (cmp > 0) return n; else n = n->parent; while (1) { if (isext(n)) return n; cmp = (*fxn)(key, getlext(n)->key); if (cmp == 0) { *fnd = 1; return getlext(n); } if (cmp < 0) n = n->flink ; else n = n->blink; } }
JRB jrb_find_gte_str(JRB n, char *key, int *fnd) { int cmp; *fnd = 0; if (!ishead(n)) { fprintf(stderr, "jrb_find_gte_str called on non-head 0x%x\n", n); exit(1); } if (n->parent == n) return n; cmp = strcmp(key, n->blink->key.s); if (cmp == 0) { *fnd = 1; return n->blink; } if (cmp > 0) return n; else n = n->parent; while (1) { if (isext(n)) return n; cmp = strcmp(key, getlext(n)->key.s); if (cmp == 0) { *fnd = 1; return getlext(n); } if (cmp < 0) n = n->flink ; else n = n->blink; } }
void jrb_iprint_tree(JRB t, int level) { int i; if (ishead(t) && t->parent == t) { printf("tree 0x%x is empty\n", t); } else if (ishead(t)) { printf("Head: 0x%x. Root = 0x%x, < = 0x%x, > = 0x%x\n", t, t->parent, t->blink, t->flink); jrb_iprint_tree(t->parent, 0); } else { if (isext(t)) { for (i = 0; i < level; i++) putchar(' '); printf("Ext node 0x%x: %c,%c: p=0x%x, <=0x%x, >=0x%x k=%d\n", t, isred(t)?'R':'B', isleft(t)?'l':'r', t->parent, t->blink, t->flink, t->key.i); } else { jrb_iprint_tree(t->flink, level+2); jrb_iprint_tree(t->blink, level+2); for (i = 0; i < level; i++) putchar(' '); printf("Int node 0x%x: %c,%c: l=0x%x, r=0x%x, p=0x%x, lr=(%d,%d)\n", t, isred(t)?'R':'B', isleft(t)?'l':'r', t->flink, t->blink, t->parent, getlext(t)->key.i, getrext(t)->key.i); } } }
void rb_iprint_tree(Rb_node t, int level) { int i; if (ishead(t) && t->p.parent == t) { printf("tree 0x%p is empty\n", (void *) t); } else if (ishead(t)) { printf("Head: 0x%p. Root = 0x%p, < = 0x%p, > = 0x%p\n", (void *) t, (void *) t->p.root, (void *) t->c.list.blink, (void *) t->c.list.flink); rb_iprint_tree(t->p.root, 0); } else { if (isext(t)) { for (i = 0; i < level; i++) putchar(' '); printf("Ext node 0x%p: %c,%c: p=0x%p, <=0x%p, >=0x%p k=%d\n", (void *) t, isred(t)?'R':'B', isleft(t)?'l':'r', (void *) t->p.parent, (void *) t->c.list.blink, (void *) t->c.list.flink, t->k.ikey); } else { rb_iprint_tree(t->c.child.left, level+2); rb_iprint_tree(t->c.child.right, level+2); for (i = 0; i < level; i++) putchar(' '); printf("Int node 0x%p: %c,%c: l=0x%p, r=0x%p, p=0x%p, lr=(%d,%d)\n", (void *) t, isred(t)?'R':'B', isleft(t)?'l':'r', (void *) t->c.child.left, (void *) t->c.child.right, (void *) t->p.parent, t->k.lext->k.ikey, t->v.rext->k.ikey); } } }
Rb_node rb_find_gkey_n(Rb_node n, char *key,int (*fxn)(char *, char *), int *fnd) { int cmp; *fnd = 0; if (!ishead(n)) { fprintf(stderr, "rb_find_key_n called on non-head 0x%p\n", (void *) n); exit(1); } if (n->p.root == n) return n; cmp = (*fxn)(key, n->c.list.blink->k.key); if (cmp == 0) { *fnd = 1; return n->c.list.blink; } if (cmp > 0) return n; else n = n->p.root; while (1) { if (isext(n)) return n; cmp = (*fxn)(key, n->k.lext->k.key); if (cmp == 0) { *fnd = 1; return n->k.lext; } if (cmp < 0) n = n->c.child.left ; else n = n->c.child.right; } }
JRB jrb_find_gte_dbl(JRB n, double dkey, int *fnd) { *fnd = 0; if (!ishead(n)) { fprintf(stderr, "jrb_find_gte_dbl called on non-head 0x%x\n", n); exit(1); } if (n->parent == n) return n; if (dkey == n->blink->key.d) { *fnd = 1; return n->blink; } if (dkey > n->blink->key.d) return n; else n = n->parent; while (1) { if (isext(n)) return n; if (dkey == getlext(n)->key.d) { *fnd = 1; return getlext(n); } n = (dkey < getlext(n)->key.d) ? n->flink : n->blink; } }
//试毒员 QWORD prelibation(char* memaddr) { /* //是视频文件 if( ismp4(memaddr) !=0 )return ; //'mp4' if( isrmvb(memaddr) !=0 )return ; //'rmvb' //是音乐文件 if( ismp3(memaddr) !=0 )return ; //'mp3' if( iswav(memaddr) !=0 )return ; //'wav' //是图片 if( isjpeg(memaddr) !=0 )return ; //'jpeg' if( ispng(memaddr) !=0 )return ; //'png' //办公文件 if( isdoc(memaddr) !=0 )return ; //'doc' if( ispdf(memaddr) !=0 )return ; //'pdf' //3d模型 //网络协议包 if( isethernet(memaddr) !=0 )return ; //'ethernet' if( isarp(memaddr) !=0 )return ; //'arp' if( isudp(memaddr) !=0 )return ; //'udp' if( istcp(memaddr) !=0 )return ; //'tcp' */ //是可执行文件 if( iself(memaddr) !=0 )return 0x666c65; //'elf' if( ismacho(memaddr) !=0 )return 0x6f6863616d; //'macho' if( ispe(memaddr) !=0 )return 0x6570; //'pe' //是压缩包 if( is7z(memaddr) !=0 )return 0x7a37; //'7z' if( iscpio(memaddr) !=0 )return 0x6f697063; //'cpio' if( isgz(memaddr) !=0 )return 0x7a67; //'gz' if( istar(memaddr) !=0 )return 0x726174; //'tar' if( iszip(memaddr) !=0 )return 0x70697a; //'zip' //是文件系统 if( isfat(memaddr) !=0 )return 0x746166; //'fat' if( isntfs(memaddr) !=0 )return 0x7366746e; //'ntfs' if( isext(memaddr) !=0 )return 0x747865; //'ext' if( ishfs(memaddr) !=0 )return 0x736668; //'hfs' //是分区表头 //if( isapm(memaddr) !=0)return ; //'apm' //apple partition map //if( isbsd(memaddr) !=0)return ; //'bsd' //bsd label if( isgpt(memaddr) !=0 )return 0x747067; //'gpt' if( ismbr(memaddr) !=0 )return 0x72626d; //'mbr',特殊,只能放最后 //什么都不像,返回失败 return 0; //'unknown' }
JRB jrb_find_gte_vptr(JRB n, void *vkey, int *fnd) { *fnd = 0; if (!ishead(n)) { fprintf(stderr, "jrb_find_gte_int called on non-head 0x%p\n", (void *)n); exit(1); } if (n->parent == n) return n; if ((char *)vkey == (char *)n->blink->key.v) { *fnd = 1; return n->blink; } if ((char *)vkey > (char *)n->blink->key.v) return n; else n = n->parent; while (1) { if (isext(n)) return n; if ((char *)vkey == (char *)getlext(n)->key.v) { *fnd = 1; return getlext(n); } n = ((char *)vkey < (char *)getlext(n)->key.v) ? n->flink : n->blink; } }
JRB jrb_find_gte_int(JRB n, int ikey, int *fnd) { *fnd = 0; if (!ishead(n)) { fprintf(stderr, "jrb_find_gte_int called on non-head 0x%p\n", (void *)n); exit(1); } if (n->parent == n) return n; if (ikey == n->blink->key.i) { *fnd = 1; return n->blink; } if (ikey > n->blink->key.i) return n; else n = n->parent; while (1) { if (isext(n)) return n; if (ikey == getlext(n)->key.i) { *fnd = 1; return getlext(n); } n = (ikey < getlext(n)->key.i) ? n->flink : n->blink; } }
Rb_node rb_find_ikey_n(Rb_node n, unsigned int ikey, int *fnd) { *fnd = 0; if (!ishead(n)) { fprintf(stderr, "rb_find_ikey_n called on non-head 0x%p \n", (void *) n); exit(1); } if (n->p.root == n) return n; if (ikey == n->c.list.blink->k.ikey) { *fnd = 1; return n->c.list.blink; } if (ikey > n->c.list.blink->k.ikey) return n; else n = n->p.root; while (1) { if (isext(n)) return n; if (ikey == n->k.lext->k.ikey) { *fnd = 1; return n->k.lext; } n = (ikey < n->k.lext->k.ikey) ? n->c.child.left : n->c.child.right; } }
void jrb_delete_node(JRB n) { JRB s, p, gp; char ir; if (isint(n)) { fprintf(stderr, "Cannot delete an internal node: 0x%p\n", (void *)n); exit(1); } if (ishead(n)) { fprintf(stderr, "Cannot delete the head of an jrb_tree: 0x%p\n", (void *)n); exit(1); } delete_item(n); /* Delete it from the list */ p = n->parent; /* The only node */ if (isroot(n)) { p->parent = p; free(n); return; } s = sibling(n); /* The only node after deletion */ if (isroot(p)) { s->parent = p->parent; s->parent->parent = s; setroot(s); free(p); free(n); return; } gp = p->parent; /* Set parent to sibling */ s->parent = gp; if (isleft(p)) { gp->flink = s; setleft(s); } else { gp->blink = s; setright(s); } ir = isred(p); free(p); free(n); if (isext(s)) { /* Update proper rext and lext values */ p = lprev(s); if (!ishead(p)) setrext(p, s); p = rprev(s); if (!ishead(p)) setlext(p, s); } else if (isblack(s)) { fprintf(stderr, "DELETION PROB -- sib is black, internal\n"); exit(1); } else { p = lprev(s); if (!ishead(p)) setrext(p, s->flink); p = rprev(s); if (!ishead(p)) setlext(p, s->blink); setblack(s); return; } if (ir) return; /* Recolor */ n = s; p = n->parent; s = sibling(n); while(isblack(p) && isblack(s) && isint(s) && isblack(s->flink) && isblack(s->blink)) { setred(s); n = p; if (isroot(n)) return; p = n->parent; s = sibling(n); } if (isblack(p) && isred(s)) { /* Rotation 2.3b */ single_rotate(p, isright(n)); setred(p); setblack(s); s = sibling(n); } { JRB x, z; char il; if (isext(s)) { fprintf(stderr, "DELETION ERROR: sibling not internal\n"); exit(1); } il = isleft(n); x = il ? s->flink : s->blink ; z = sibling(x); if (isred(z)) { /* Rotation 2.3f */ single_rotate(p, !il); setblack(z); if (isred(p)) setred(s); else setblack(s); setblack(p); } else if (isblack(x)) { /* Recoloring only (2.3c) */ if (isred(s) || isblack(p)) { fprintf(stderr, "DELETION ERROR: 2.3c not quite right\n"); exit(1); } setblack(p); setred(s); return; } else if (isred(p)) { /* 2.3d */ single_rotate(s, il); single_rotate(p, !il); setblack(x); setred(s); return; } else { /* 2.3e */ single_rotate(s, il); single_rotate(p, !il); setblack(x); return; } } }