55 lines · 899 B · C
RawDownload
#include <u.h>#include <libc.h>#include <venti.h> voidvtzeroextend(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;	}}