+void mask(void *va, int masklen, int len)
+{
+ int i;
+ char *a = va;
+cp
+ i = masklen / 8;
+ masklen %= 8;
+
+ if(masklen)
+ a[i++] &= (0x100 - (1 << masklen));
+
+ for(; i < len; i++)
+ a[i] = 0;
+}
+
+void maskcpy(void *va, void *vb, int masklen, int len)
+{
+ int i, m;
+ char *a = va;
+ char *b = vb;
+cp
+ for(m = masklen, i = 0; m >= 8; m -= 8, i++)
+ a[i] = b[i];
+
+ if(m)
+ {
+ a[i] = b[i] & (0x100 - (1 << m));
+ i++;
+ }
+
+ for(; i < len; i++)
+ a[i] = 0;
+}
+
+int maskcheck(void *va, int masklen, int len)
+{
+ int i;
+ char *a = va;
+cp
+ i = masklen / 8;
+ masklen %= 8;
+
+ if(masklen && a[i++] & (0xff >> masklen))
+ return -1;
+
+ for(; i < len; i++)
+ if(a[i] != 0)
+ return -2;
+
+ return 0;
+}