1*6b6b9ac8SDavid du Colombier #include <u.h> 2*6b6b9ac8SDavid du Colombier #include <libc.h> 3*6b6b9ac8SDavid du Colombier #include <venti.h> 4*6b6b9ac8SDavid du Colombier 5*6b6b9ac8SDavid du Colombier /* score of a zero length block */ 6*6b6b9ac8SDavid du Colombier uchar vtZeroScore[VtScoreSize] = { 7*6b6b9ac8SDavid du Colombier 0xda, 0x39, 0xa3, 0xee, 0x5e, 0x6b, 0x4b, 0x0d, 0x32, 0x55, 8*6b6b9ac8SDavid du Colombier 0xbf, 0xef, 0x95, 0x60, 0x18, 0x90, 0xaf, 0xd8, 0x07, 0x09 9*6b6b9ac8SDavid du Colombier }; 10*6b6b9ac8SDavid du Colombier 11*6b6b9ac8SDavid du Colombier 12*6b6b9ac8SDavid du Colombier int 13*6b6b9ac8SDavid du Colombier vtZeroExtend(int type, uchar *buf, int n, int nn) 14*6b6b9ac8SDavid du Colombier { 15*6b6b9ac8SDavid du Colombier uchar *p, *ep; 16*6b6b9ac8SDavid du Colombier 17*6b6b9ac8SDavid du Colombier switch(type) { 18*6b6b9ac8SDavid du Colombier default: 19*6b6b9ac8SDavid du Colombier memset(buf+n, 0, nn-n); 20*6b6b9ac8SDavid du Colombier break; 21*6b6b9ac8SDavid du Colombier case VtPointerType0: 22*6b6b9ac8SDavid du Colombier case VtPointerType1: 23*6b6b9ac8SDavid du Colombier case VtPointerType2: 24*6b6b9ac8SDavid du Colombier case VtPointerType3: 25*6b6b9ac8SDavid du Colombier case VtPointerType4: 26*6b6b9ac8SDavid du Colombier case VtPointerType5: 27*6b6b9ac8SDavid du Colombier case VtPointerType6: 28*6b6b9ac8SDavid du Colombier case VtPointerType7: 29*6b6b9ac8SDavid du Colombier case VtPointerType8: 30*6b6b9ac8SDavid du Colombier case VtPointerType9: 31*6b6b9ac8SDavid du Colombier p = buf + (n/VtScoreSize)*VtScoreSize; 32*6b6b9ac8SDavid du Colombier ep = buf + (nn/VtScoreSize)*VtScoreSize; 33*6b6b9ac8SDavid du Colombier while(p < ep) { 34*6b6b9ac8SDavid du Colombier memmove(p, vtZeroScore, VtScoreSize); 35*6b6b9ac8SDavid du Colombier p += VtScoreSize; 36*6b6b9ac8SDavid du Colombier } 37*6b6b9ac8SDavid du Colombier memset(p, 0, buf+nn-p); 38*6b6b9ac8SDavid du Colombier break; 39*6b6b9ac8SDavid du Colombier } 40*6b6b9ac8SDavid du Colombier return 1; 41*6b6b9ac8SDavid du Colombier } 42*6b6b9ac8SDavid du Colombier 43*6b6b9ac8SDavid du Colombier int 44*6b6b9ac8SDavid du Colombier vtZeroTruncate(int type, uchar *buf, int n) 45*6b6b9ac8SDavid du Colombier { 46*6b6b9ac8SDavid du Colombier uchar *p; 47*6b6b9ac8SDavid du Colombier 48*6b6b9ac8SDavid du Colombier switch(type) { 49*6b6b9ac8SDavid du Colombier default: 50*6b6b9ac8SDavid du Colombier for(p = buf + n; p > buf; p--) { 51*6b6b9ac8SDavid du Colombier if(p[-1] != 0) 52*6b6b9ac8SDavid du Colombier break; 53*6b6b9ac8SDavid du Colombier } 54*6b6b9ac8SDavid du Colombier return p - buf; 55*6b6b9ac8SDavid du Colombier case VtRootType: 56*6b6b9ac8SDavid du Colombier if(n < VtRootSize) 57*6b6b9ac8SDavid du Colombier return n; 58*6b6b9ac8SDavid du Colombier return VtRootSize; 59*6b6b9ac8SDavid du Colombier case VtPointerType0: 60*6b6b9ac8SDavid du Colombier case VtPointerType1: 61*6b6b9ac8SDavid du Colombier case VtPointerType2: 62*6b6b9ac8SDavid du Colombier case VtPointerType3: 63*6b6b9ac8SDavid du Colombier case VtPointerType4: 64*6b6b9ac8SDavid du Colombier case VtPointerType5: 65*6b6b9ac8SDavid du Colombier case VtPointerType6: 66*6b6b9ac8SDavid du Colombier case VtPointerType7: 67*6b6b9ac8SDavid du Colombier case VtPointerType8: 68*6b6b9ac8SDavid du Colombier case VtPointerType9: 69*6b6b9ac8SDavid du Colombier /* ignore slop at end of block */ 70*6b6b9ac8SDavid du Colombier p = buf + (n/VtScoreSize)*VtScoreSize; 71*6b6b9ac8SDavid du Colombier 72*6b6b9ac8SDavid du Colombier while(p > buf) { 73*6b6b9ac8SDavid du Colombier if(memcmp(p - VtScoreSize, vtZeroScore, VtScoreSize) != 0) 74*6b6b9ac8SDavid du Colombier break; 75*6b6b9ac8SDavid du Colombier p -= VtScoreSize; 76*6b6b9ac8SDavid du Colombier } 77*6b6b9ac8SDavid du Colombier return p - buf; 78*6b6b9ac8SDavid du Colombier } 79*6b6b9ac8SDavid du Colombier } 80