Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
att
GitHub Repository: att/ast
Path: blob/master/src/lib/libvcodex/Vchuff/vchhdr.h
1810 views
1
/***********************************************************************
2
* *
3
* This software is part of the ast package *
4
* Copyright (c) 2003-2011 AT&T Intellectual Property *
5
* and is licensed under the *
6
* Eclipse Public License, Version 1.0 *
7
* by AT&T Intellectual Property *
8
* *
9
* A copy of the License is available at *
10
* http://www.eclipse.org/org/documents/epl-v10.html *
11
* (with md5 checksum b35adb5213ca9657e911e9befb180842) *
12
* *
13
* Information and Software Systems Research *
14
* AT&T Research *
15
* Florham Park NJ *
16
* *
17
* Phong Vo <[email protected]> *
18
* *
19
***********************************************************************/
20
#ifndef _VCHHDR_H
21
#define _VCHHDR_H 1
22
23
#include "vchdr.h"
24
#include "vchuff.h"
25
26
#define Vchobj_t Vcchar_t /* object type in Huffman code */
27
#define VCH_SIZE 256 /* max alphabet size */
28
29
#define VCH_SW 16 /* size of fast switch algorithms below */
30
31
/* function to clear a table */
32
#define CLRtable(tbl,ii,kk) \
33
switch(kk) \
34
{ case 16: tbl[ii] = 0; ii++; case 15: tbl[ii] = 0; ii++; \
35
case 14: tbl[ii] = 0; ii++; case 13: tbl[ii] = 0; ii++; \
36
case 12: tbl[ii] = 0; ii++; case 11: tbl[ii] = 0; ii++; \
37
case 10: tbl[ii] = 0; ii++; case 9: tbl[ii] = 0; ii++; \
38
case 8: tbl[ii] = 0; ii++; case 7: tbl[ii] = 0; ii++; \
39
case 6: tbl[ii] = 0; ii++; case 5: tbl[ii] = 0; ii++; \
40
case 4: tbl[ii] = 0; ii++; case 3: tbl[ii] = 0; ii++; \
41
case 2: tbl[ii] = 0; ii++; case 1: tbl[ii] = 0; ii++; \
42
}
43
#define CLRTABLE(tbl,n) \
44
do { ssize_t ii = 0, nn = (ssize_t)(n); \
45
for(; nn > 0; nn -= VCH_SW) CLRtable(tbl, ii, nn >= VCH_SW ? VCH_SW : nn); \
46
} while(0)
47
48
/* function to compute the dot product of two tables */
49
#define DOTproduct(v,t1,t2,ii,kk) \
50
switch(kk) \
51
{ case 16: v += t1[ii]*t2[ii]; ii++; case 15: v += t1[ii]*t2[ii]; ii++; \
52
case 14: v += t1[ii]*t2[ii]; ii++; case 13: v += t1[ii]*t2[ii]; ii++; \
53
case 12: v += t1[ii]*t2[ii]; ii++; case 11: v += t1[ii]*t2[ii]; ii++; \
54
case 10: v += t1[ii]*t2[ii]; ii++; case 9: v += t1[ii]*t2[ii]; ii++; \
55
case 8: v += t1[ii]*t2[ii]; ii++; case 7: v += t1[ii]*t2[ii]; ii++; \
56
case 6: v += t1[ii]*t2[ii]; ii++; case 5: v += t1[ii]*t2[ii]; ii++; \
57
case 4: v += t1[ii]*t2[ii]; ii++; case 3: v += t1[ii]*t2[ii]; ii++; \
58
case 2: v += t1[ii]*t2[ii]; ii++; case 1: v += t1[ii]*t2[ii]; ii++; \
59
}
60
#define DOTPRODUCT(v,t1,t2,n) \
61
do { ssize_t ii = 0, nn = (ssize_t)(n); v = 0; \
62
for(; nn > 0; nn -= VCH_SW) DOTproduct(v, t1, t2, ii, nn >= VCH_SW ? VCH_SW : nn); \
63
} while(0)
64
65
/* function to accumulate frequencies of given data */
66
#define ADDfreq(tbl,dd,kk) \
67
switch(kk) \
68
{ case 16: tbl[*dd]++; dd++; case 15: tbl[*dd]++; dd++; \
69
case 14: tbl[*dd]++; dd++; case 13: tbl[*dd]++; dd++; \
70
case 12: tbl[*dd]++; dd++; case 11: tbl[*dd]++; dd++; \
71
case 10: tbl[*dd]++; dd++; case 9: tbl[*dd]++; dd++; \
72
case 8: tbl[*dd]++; dd++; case 7: tbl[*dd]++; dd++; \
73
case 6: tbl[*dd]++; dd++; case 5: tbl[*dd]++; dd++; \
74
case 4: tbl[*dd]++; dd++; case 3: tbl[*dd]++; dd++; \
75
case 2: tbl[*dd]++; dd++; case 1: tbl[*dd]++; dd++; \
76
}
77
#define ADDFREQ(tbl,dt_type,dt,n) \
78
do { ssize_t nn = (ssize_t)(n); dt_type dd = (dt_type)(dt); \
79
for(; nn > 0; nn -= VCH_SW) { \
80
ADDfreq(tbl, dd, nn >= VCH_SW ? VCH_SW : nn); \
81
} \
82
} while(0)
83
84
/* sum frequencies for distinct objects */
85
#define GRPfreq(fr,oo,ff,kk) \
86
switch(kk) \
87
{ case 16: fr[*oo] += *ff; oo++; ff++; case 15: fr[*oo] += *ff; oo++; ff++; \
88
case 14: fr[*oo] += *ff; oo++; ff++; case 13: fr[*oo] += *ff; oo++; ff++; \
89
case 12: fr[*oo] += *ff; oo++; ff++; case 11: fr[*oo] += *ff; oo++; ff++; \
90
case 10: fr[*oo] += *ff; oo++; ff++; case 9: fr[*oo] += *ff; oo++; ff++; \
91
case 8: fr[*oo] += *ff; oo++; ff++; case 7: fr[*oo] += *ff; oo++; ff++; \
92
case 6: fr[*oo] += *ff; oo++; ff++; case 5: fr[*oo] += *ff; oo++; ff++; \
93
case 4: fr[*oo] += *ff; oo++; ff++; case 3: fr[*oo] += *ff; oo++; ff++; \
94
case 2: fr[*oo] += *ff; oo++; ff++; case 1: fr[*oo] += *ff; oo++; ff++; \
95
}
96
#define GRPFREQ(fr,o,f,n) \
97
do { Vchobj_t* oo = (Vchobj_t*)(o); Vcchar_t* ff = (Vcchar_t*)(f); \
98
ssize_t nn = (ssize_t)(n); \
99
for(; nn > 0; nn -= VCH_SW) GRPfreq(fr, oo, ff, nn >= VCH_SW ? VCH_SW : nn); \
100
} while(0)
101
102
/* accumulate coding size of all objects */
103
#define GRPsize(v,sz,oo,ff,kk) \
104
switch(kk) \
105
{ case 16: v += sz[*oo] * *ff; oo++; ff++; case 15: v += sz[*oo] * *ff; oo++; ff++; \
106
case 14: v += sz[*oo] * *ff; oo++; ff++; case 13: v += sz[*oo] * *ff; oo++; ff++; \
107
case 12: v += sz[*oo] * *ff; oo++; ff++; case 11: v += sz[*oo] * *ff; oo++; ff++; \
108
case 10: v += sz[*oo] * *ff; oo++; ff++; case 9: v += sz[*oo] * *ff; oo++; ff++; \
109
case 8: v += sz[*oo] * *ff; oo++; ff++; case 7: v += sz[*oo] * *ff; oo++; ff++; \
110
case 6: v += sz[*oo] * *ff; oo++; ff++; case 5: v += sz[*oo] * *ff; oo++; ff++; \
111
case 4: v += sz[*oo] * *ff; oo++; ff++; case 3: v += sz[*oo] * *ff; oo++; ff++; \
112
case 2: v += sz[*oo] * *ff; oo++; ff++; case 1: v += sz[*oo] * *ff; oo++; ff++; \
113
}
114
#define GRPSIZE(v,sz,o,f,n) \
115
do { Vchobj_t* oo = (Vchobj_t*)(o); Vcchar_t* ff = (Vcchar_t*)(f); \
116
ssize_t nn = (ssize_t)(n); v = 0; \
117
for(; nn > 0; nn -= VCH_SW) GRPsize(v, sz, oo, ff, nn >= VCH_SW ? VCH_SW : nn); \
118
} while(0)
119
120
_BEGIN_EXTERNS_
121
extern int vchcopy(Vcodex_t*, ssize_t*, ssize_t*, ssize_t);
122
_END_EXTERNS_
123
124
#endif
125
126