| #include <u.h> |
| #include <libc.h> |
| #include <venti.h> |
| |
| void |
| vtzeroextend(int type, uchar *buf, uint n, uint nn) |
| { |
| uchar *p, *ep; |
| |
| switch(type&7) { |
| case 0: |
| memset(buf+n, 0, nn-n); |
| break; |
| default: |
| p = buf + (n/VtScoreSize)*VtScoreSize; |
| ep = buf + (nn/VtScoreSize)*VtScoreSize; |
| while(p < ep) { |
| memmove(p, vtzeroscore, VtScoreSize); |
| p += VtScoreSize; |
| } |
| memset(p, 0, buf+nn-p); |
| break; |
| } |
| } |
| |
| uint |
| vtzerotruncate(int type, uchar *buf, uint n) |
| { |
| uchar *p; |
| |
| if(type == VtRootType){ |
| if(n < VtRootSize) |
| return n; |
| return VtRootSize; |
| } |
| |
| switch(type&7){ |
| case 0: |
| for(p = buf + n; p > buf; p--) { |
| if(p[-1] != 0) |
| break; |
| } |
| return p - buf; |
| default: |
| /* ignore slop at end of block */ |
| p = buf + (n/VtScoreSize)*VtScoreSize; |
| |
| while(p > buf) { |
| if(memcmp(p - VtScoreSize, vtzeroscore, VtScoreSize) != 0) |
| break; |
| p -= VtScoreSize; |
| } |
| return p - buf; |
| } |
| } |