xref: /plan9/sys/src/libventi/zero.c (revision 6b6b9ac8b0b103b1e30e4d019522a78c950fce74)
1*6b6b9ac8SDavid du Colombier #include <u.h>
2*6b6b9ac8SDavid du Colombier #include <libc.h>
3*6b6b9ac8SDavid du Colombier #include <venti.h>
4*6b6b9ac8SDavid du Colombier 
5*6b6b9ac8SDavid du Colombier /* score of a zero length block */
6*6b6b9ac8SDavid du Colombier uchar	vtZeroScore[VtScoreSize] = {
7*6b6b9ac8SDavid du Colombier 	0xda, 0x39, 0xa3, 0xee, 0x5e, 0x6b, 0x4b, 0x0d, 0x32, 0x55,
8*6b6b9ac8SDavid du Colombier 	0xbf, 0xef, 0x95, 0x60, 0x18, 0x90, 0xaf, 0xd8, 0x07, 0x09
9*6b6b9ac8SDavid du Colombier };
10*6b6b9ac8SDavid du Colombier 
11*6b6b9ac8SDavid du Colombier 
12*6b6b9ac8SDavid du Colombier int
13*6b6b9ac8SDavid du Colombier vtZeroExtend(int type, uchar *buf, int n, int nn)
14*6b6b9ac8SDavid du Colombier {
15*6b6b9ac8SDavid du Colombier 	uchar *p, *ep;
16*6b6b9ac8SDavid du Colombier 
17*6b6b9ac8SDavid du Colombier 	switch(type) {
18*6b6b9ac8SDavid du Colombier 	default:
19*6b6b9ac8SDavid du Colombier 		memset(buf+n, 0, nn-n);
20*6b6b9ac8SDavid du Colombier 		break;
21*6b6b9ac8SDavid du Colombier 	case VtPointerType0:
22*6b6b9ac8SDavid du Colombier 	case VtPointerType1:
23*6b6b9ac8SDavid du Colombier 	case VtPointerType2:
24*6b6b9ac8SDavid du Colombier 	case VtPointerType3:
25*6b6b9ac8SDavid du Colombier 	case VtPointerType4:
26*6b6b9ac8SDavid du Colombier 	case VtPointerType5:
27*6b6b9ac8SDavid du Colombier 	case VtPointerType6:
28*6b6b9ac8SDavid du Colombier 	case VtPointerType7:
29*6b6b9ac8SDavid du Colombier 	case VtPointerType8:
30*6b6b9ac8SDavid du Colombier 	case VtPointerType9:
31*6b6b9ac8SDavid du Colombier 		p = buf + (n/VtScoreSize)*VtScoreSize;
32*6b6b9ac8SDavid du Colombier 		ep = buf + (nn/VtScoreSize)*VtScoreSize;
33*6b6b9ac8SDavid du Colombier 		while(p < ep) {
34*6b6b9ac8SDavid du Colombier 			memmove(p, vtZeroScore, VtScoreSize);
35*6b6b9ac8SDavid du Colombier 			p += VtScoreSize;
36*6b6b9ac8SDavid du Colombier 		}
37*6b6b9ac8SDavid du Colombier 		memset(p, 0, buf+nn-p);
38*6b6b9ac8SDavid du Colombier 		break;
39*6b6b9ac8SDavid du Colombier 	}
40*6b6b9ac8SDavid du Colombier 	return 1;
41*6b6b9ac8SDavid du Colombier }
42*6b6b9ac8SDavid du Colombier 
43*6b6b9ac8SDavid du Colombier int
44*6b6b9ac8SDavid du Colombier vtZeroTruncate(int type, uchar *buf, int n)
45*6b6b9ac8SDavid du Colombier {
46*6b6b9ac8SDavid du Colombier 	uchar *p;
47*6b6b9ac8SDavid du Colombier 
48*6b6b9ac8SDavid du Colombier 	switch(type) {
49*6b6b9ac8SDavid du Colombier 	default:
50*6b6b9ac8SDavid du Colombier 		for(p = buf + n; p > buf; p--) {
51*6b6b9ac8SDavid du Colombier 			if(p[-1] != 0)
52*6b6b9ac8SDavid du Colombier 				break;
53*6b6b9ac8SDavid du Colombier 		}
54*6b6b9ac8SDavid du Colombier 		return p - buf;
55*6b6b9ac8SDavid du Colombier 	case VtRootType:
56*6b6b9ac8SDavid du Colombier 		if(n < VtRootSize)
57*6b6b9ac8SDavid du Colombier 			return n;
58*6b6b9ac8SDavid du Colombier 		return VtRootSize;
59*6b6b9ac8SDavid du Colombier 	case VtPointerType0:
60*6b6b9ac8SDavid du Colombier 	case VtPointerType1:
61*6b6b9ac8SDavid du Colombier 	case VtPointerType2:
62*6b6b9ac8SDavid du Colombier 	case VtPointerType3:
63*6b6b9ac8SDavid du Colombier 	case VtPointerType4:
64*6b6b9ac8SDavid du Colombier 	case VtPointerType5:
65*6b6b9ac8SDavid du Colombier 	case VtPointerType6:
66*6b6b9ac8SDavid du Colombier 	case VtPointerType7:
67*6b6b9ac8SDavid du Colombier 	case VtPointerType8:
68*6b6b9ac8SDavid du Colombier 	case VtPointerType9:
69*6b6b9ac8SDavid du Colombier 		/* ignore slop at end of block */
70*6b6b9ac8SDavid du Colombier 		p = buf + (n/VtScoreSize)*VtScoreSize;
71*6b6b9ac8SDavid du Colombier 
72*6b6b9ac8SDavid du Colombier 		while(p > buf) {
73*6b6b9ac8SDavid du Colombier 			if(memcmp(p - VtScoreSize, vtZeroScore, VtScoreSize) != 0)
74*6b6b9ac8SDavid du Colombier 				break;
75*6b6b9ac8SDavid du Colombier 			p -= VtScoreSize;
76*6b6b9ac8SDavid du Colombier 		}
77*6b6b9ac8SDavid du Colombier 		return p - buf;
78*6b6b9ac8SDavid du Colombier 	}
79*6b6b9ac8SDavid du Colombier }
80