Blame


1 a0d146ed 2005-07-12 devnull #include "stdinc.h"
2 a0d146ed 2005-07-12 devnull #include "dat.h"
3 a0d146ed 2005-07-12 devnull #include "fns.h"
4 a0d146ed 2005-07-12 devnull
5 a0d146ed 2005-07-12 devnull void
6 a0d146ed 2005-07-12 devnull fmtzbinit(Fmt *f, ZBlock *b)
7 a0d146ed 2005-07-12 devnull {
8 3fbe92ef 2006-09-18 devnull memset(f, 0, sizeof *f);
9 27d28098 2007-04-21 devnull #ifdef PLAN9PORT
10 3fbe92ef 2006-09-18 devnull fmtlocaleinit(f, nil, nil, nil);
11 27d28098 2007-04-21 devnull #endif
12 a0d146ed 2005-07-12 devnull f->start = b->data;
13 a0d146ed 2005-07-12 devnull f->to = f->start;
14 a0d146ed 2005-07-12 devnull f->stop = (char*)f->start + b->len;
15 a0d146ed 2005-07-12 devnull }
16 a0d146ed 2005-07-12 devnull
17 d67cd5c3 2005-07-19 devnull #define ROUNDUP(p, n) ((void*)(((uintptr)(p)+(n)-1)&~(uintptr)((n)-1)))
18 a0d146ed 2005-07-12 devnull
19 07029cdb 2007-04-23 devnull enum {
20 07029cdb 2007-04-23 devnull OverflowCheck = 32
21 07029cdb 2007-04-23 devnull };
22 96dada90 2007-03-26 devnull static char zmagic[] = "1234567890abcdefghijklmnopqrstuvxyz";
23 a0d146ed 2005-07-12 devnull
24 a0d146ed 2005-07-12 devnull ZBlock *
25 a0d146ed 2005-07-12 devnull alloczblock(u32int size, int zeroed, uint blocksize)
26 a0d146ed 2005-07-12 devnull {
27 a0d146ed 2005-07-12 devnull uchar *p, *data;
28 a0d146ed 2005-07-12 devnull ZBlock *b;
29 a0d146ed 2005-07-12 devnull static ZBlock z;
30 a0d146ed 2005-07-12 devnull int n;
31 a0d146ed 2005-07-12 devnull
32 a0d146ed 2005-07-12 devnull if(blocksize == 0)
33 a0d146ed 2005-07-12 devnull blocksize = 32; /* try for cache line alignment */
34 a0d146ed 2005-07-12 devnull
35 07029cdb 2007-04-23 devnull n = size+OverflowCheck+sizeof(ZBlock)+blocksize+8;
36 a0d146ed 2005-07-12 devnull p = malloc(n);
37 a0d146ed 2005-07-12 devnull if(p == nil){
38 a0d146ed 2005-07-12 devnull seterr(EOk, "out of memory");
39 a0d146ed 2005-07-12 devnull return nil;
40 a0d146ed 2005-07-12 devnull }
41 a0d146ed 2005-07-12 devnull
42 a0d146ed 2005-07-12 devnull data = ROUNDUP(p, blocksize);
43 07029cdb 2007-04-23 devnull b = ROUNDUP(data+size+OverflowCheck, 8);
44 a0d146ed 2005-07-12 devnull if(0) fprint(2, "alloc %p-%p data %p-%p b %p-%p\n",
45 a0d146ed 2005-07-12 devnull p, p+n, data, data+size, b, b+1);
46 a0d146ed 2005-07-12 devnull *b = z;
47 a0d146ed 2005-07-12 devnull b->data = data;
48 a0d146ed 2005-07-12 devnull b->free = p;
49 a0d146ed 2005-07-12 devnull b->len = size;
50 a0d146ed 2005-07-12 devnull b->_size = size;
51 a0d146ed 2005-07-12 devnull if(zeroed)
52 a0d146ed 2005-07-12 devnull memset(b->data, 0, size);
53 07029cdb 2007-04-23 devnull memmove(b->data+size, zmagic, OverflowCheck);
54 a0d146ed 2005-07-12 devnull return b;
55 a0d146ed 2005-07-12 devnull }
56 a0d146ed 2005-07-12 devnull
57 a0d146ed 2005-07-12 devnull void
58 a0d146ed 2005-07-12 devnull freezblock(ZBlock *b)
59 a0d146ed 2005-07-12 devnull {
60 a0d146ed 2005-07-12 devnull if(b){
61 07029cdb 2007-04-23 devnull if(memcmp(b->data+b->_size, zmagic, OverflowCheck) != 0)
62 a0d146ed 2005-07-12 devnull abort();
63 07029cdb 2007-04-23 devnull memset(b->data+b->_size, 0, OverflowCheck);
64 a0d146ed 2005-07-12 devnull free(b->free);
65 a0d146ed 2005-07-12 devnull }
66 a0d146ed 2005-07-12 devnull }
67 a0d146ed 2005-07-12 devnull
68 a0d146ed 2005-07-12 devnull ZBlock*
69 a0d146ed 2005-07-12 devnull packet2zblock(Packet *p, u32int size)
70 a0d146ed 2005-07-12 devnull {
71 a0d146ed 2005-07-12 devnull ZBlock *b;
72 a0d146ed 2005-07-12 devnull
73 a0d146ed 2005-07-12 devnull if(p == nil)
74 a0d146ed 2005-07-12 devnull return nil;
75 a0d146ed 2005-07-12 devnull b = alloczblock(size, 0, 0);
76 a0d146ed 2005-07-12 devnull if(b == nil)
77 a0d146ed 2005-07-12 devnull return nil;
78 a0d146ed 2005-07-12 devnull if(packetcopy(p, b->data, 0, size) < 0){
79 a0d146ed 2005-07-12 devnull freezblock(b);
80 a0d146ed 2005-07-12 devnull return nil;
81 a0d146ed 2005-07-12 devnull }
82 a0d146ed 2005-07-12 devnull return b;
83 a0d146ed 2005-07-12 devnull }
84 a0d146ed 2005-07-12 devnull
85 a0d146ed 2005-07-12 devnull Packet*
86 a0d146ed 2005-07-12 devnull zblock2packet(ZBlock *zb, u32int size)
87 a0d146ed 2005-07-12 devnull {
88 a0d146ed 2005-07-12 devnull Packet *p;
89 a0d146ed 2005-07-12 devnull
90 a0d146ed 2005-07-12 devnull if(zb == nil)
91 a0d146ed 2005-07-12 devnull return nil;
92 a0d146ed 2005-07-12 devnull p = packetalloc();
93 a0d146ed 2005-07-12 devnull packetappend(p, zb->data, size);
94 a0d146ed 2005-07-12 devnull return p;
95 a0d146ed 2005-07-12 devnull }