Blob


1 #include "stdinc.h"
2 #include "dat.h"
3 #include "fns.h"
5 void
6 fmtzbinit(Fmt *f, ZBlock *b)
7 {
8 f->runes = 0;
9 f->start = b->data;
10 f->to = f->start;
11 f->stop = (char*)f->start + b->len;
12 f->flush = nil;
13 f->farg = nil;
14 f->nfmt = 0;
15 }
17 #define ROUNDUP(p, n) ((void*)(((uintptr)(p)+(n)-1)&~(uintptr)((n)-1)))
19 static char zmagic[] = "1234567890abcdefghijkl";
21 ZBlock *
22 alloczblock(u32int size, int zeroed, uint blocksize)
23 {
24 uchar *p, *data;
25 ZBlock *b;
26 static ZBlock z;
27 int n;
29 if(blocksize == 0)
30 blocksize = 32; /* try for cache line alignment */
32 n = size+32/*XXX*/+sizeof(ZBlock)+blocksize+8;
33 p = malloc(n);
34 if(p == nil){
35 seterr(EOk, "out of memory");
36 return nil;
37 }
39 data = ROUNDUP(p, blocksize);
40 b = ROUNDUP(data+size+32/*XXX*/, 8);
41 if(0) fprint(2, "alloc %p-%p data %p-%p b %p-%p\n",
42 p, p+n, data, data+size, b, b+1);
43 *b = z;
44 b->data = data;
45 b->free = p;
46 b->len = size;
47 b->_size = size;
48 if(zeroed)
49 memset(b->data, 0, size);
50 memmove(b->data+size, zmagic, 32/*XXX*/);
51 return b;
52 }
54 void
55 freezblock(ZBlock *b)
56 {
57 if(b){
58 if(memcmp(b->data+b->_size, zmagic, 32) != 0)
59 abort();
60 memset(b->data+b->_size, 0, 32);
61 free(b->free);
62 }
63 }
65 ZBlock*
66 packet2zblock(Packet *p, u32int size)
67 {
68 ZBlock *b;
70 if(p == nil)
71 return nil;
72 b = alloczblock(size, 0, 0);
73 if(b == nil)
74 return nil;
75 if(packetcopy(p, b->data, 0, size) < 0){
76 freezblock(b);
77 return nil;
78 }
79 return b;
80 }
82 Packet*
83 zblock2packet(ZBlock *zb, u32int size)
84 {
85 Packet *p;
87 if(zb == nil)
88 return nil;
89 p = packetalloc();
90 packetappend(p, zb->data, size);
91 return p;
92 }