zero.c (898B)
1 #include <u.h> 2 #include <libc.h> 3 #include <venti.h> 4 5 void 6 vtzeroextend(int type, uchar *buf, uint n, uint nn) 7 { 8 uchar *p, *ep; 9 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 } 25 26 uint 27 vtzerotruncate(int type, uchar *buf, uint n) 28 { 29 uchar *p; 30 31 if(type == VtRootType){ 32 if(n < VtRootSize) 33 return n; 34 return VtRootSize; 35 } 36 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; 47 48 while(p > buf) { 49 if(memcmp(p - VtScoreSize, vtzeroscore, VtScoreSize) != 0) 50 break; 51 p -= VtScoreSize; 52 } 53 return p - buf; 54 } 55 }