Pastie now auto-senses if line-wrap is a bad or good idea. Feedback?
## mark a section (Learn more)
diff -r aafbec810c36 user/test/dleaf.c --- a/user/test/dleaf.c Tue Sep 02 12:09:21 2008 -0700 +++ b/user/test/dleaf.c Tue Sep 02 20:18:32 2008 -0700 @@ -165,6 +165,44 @@ return NULL; } +int dleaf_dump2(BTREE, struct dleaf *leaf) +{ + struct group *gdict = (void *)leaf + btree->sb->blocksize; + struct entry *edict = (void *)(gdict - leaf->groups); + printf("%i entry groups:\n", leaf->groups); + for (int grp = -1, offset = 0, grpoffset = 0, ent; grp >= -leaf->groups; grp--) + { + printf(" %i/%i:", -grp - 1, gdict[grp].count); + for (ent = -1; ent >= -gdict[grp].count; ent--) + { + int prevlimit = (ent == -1) ? 0 : edict[offset + ent + 1].limit; + printf(" %Lx ->", ((L)gdict[grp].loghi) << 24 | edict[offset + ent].loglo); + int size = edict[offset + ent].limit - prevlimit; + if (size < 0) + printf(" <corrupt>"); + else for (int i = 0; i < size; i++) + printf(" %Lx", (L)leaf->table[grpoffset + prevlimit + i].block); + printf(";"); + } + if (gdict[grp].count > 0) + grpoffset += edict[offset - gdict[grp].count].limit; + offset -= gdict[grp].count; + printf("\n"); + } + return 1; +} + +int dleaf_isinorder(BTREE, struct dleaf *leaf) +{ + struct group *gdict = (void *)leaf + btree->sb->blocksize; + struct entry *edict = (void *)(gdict - leaf->groups); + for (int grp = -1; grp >= -leaf->groups; grp--) + for (int ent = -1; ent >= -gdict[grp].count; ent--) + if (ent < -1 && edict[ent].limit < edict[ent + 1].limit) + return 0; + return 1; +} + int dleaf_check(BTREE, struct dleaf *leaf) { struct group *groups = (void *)leaf + btree->sb->blocksize, *grbase = --groups - leaf->groups; @@ -184,6 +222,9 @@ goto eek; why = "used count wrong"; if (leaf->used != (void *)(entries - encount) - (void *)leaf) + goto eek; + why = "dleaf entries out of order"; + if (!dleaf_isinorder(btree, leaf)) goto eek; return 0; eek: @@ -470,6 +511,7 @@ dleaf_merge(btree, leaf, dest); dleaf_check(btree, leaf); dleaf_dump(btree, leaf); + dleaf_dump2(btree, leaf); dleaf_destroy(btree, leaf); dleaf_destroy(btree, dest); return 0; diff -r aafbec810c36 user/test/ileaf.c --- a/user/test/ileaf.c Tue Sep 02 12:09:21 2008 -0700 +++ b/user/test/ileaf.c Tue Sep 02 20:18:32 2008 -0700 @@ -124,7 +124,7 @@ return attrs; } -int isinorder(BTREE, struct ileaf *leaf) +int ileaf_isinorder(BTREE, struct ileaf *leaf) { u16 *dict = (void *)leaf + btree->sb->blocksize; for (int i = 0, offset = 0, limit; i > -leaf->count; i--, offset = limit) @@ -140,7 +140,7 @@ if (leaf->magic != 0x90de); goto eek; why = "dict out of order"; - if (!isinorder(btree, leaf)) + if (!ileaf_isinorder(btree, leaf)) goto eek; return 0; eek:
This paste will be private.
From the Design Piracy series on my blog: