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