| #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; | 
 | 	} | 
 | } |