Blob
1 #include <u.h>2 #include <libc.h>3 #include <venti.h>5 void6 vtzeroextend(int type, uchar *buf, uint n, uint nn)7 {8 uchar *p, *ep;10 switch(type&7) {11 case 0:12 memset(buf+n, 0, nn-n);13 break;14 default:15 p = buf + (n/VtScoreSize)*VtScoreSize;16 ep = buf + (nn/VtScoreSize)*VtScoreSize;17 while(p < ep) {18 memmove(p, vtzeroscore, VtScoreSize);19 p += VtScoreSize;20 }21 memset(p, 0, buf+nn-p);22 break;23 }24 }26 uint27 vtzerotruncate(int type, uchar *buf, uint n)28 {29 uchar *p;31 if(type == VtRootType){32 if(n < VtRootSize)33 return n;34 return VtRootSize;35 }37 switch(type&7){38 case 0:39 for(p = buf + n; p > buf; p--) {40 if(p[-1] != 0)41 break;42 }43 return p - buf;44 default:45 /* ignore slop at end of block */46 p = buf + (n/VtScoreSize)*VtScoreSize;48 while(p > buf) {49 if(memcmp(p - VtScoreSize, vtzeroscore, VtScoreSize) != 0)50 break;51 p -= VtScoreSize;52 }53 return p - buf;54 }55 }