-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathmkbshift.c
100 lines (84 loc) · 3.37 KB
/
mkbshift.c
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
/******************************************************************************
* *
* Copyright (C) 1992-1995 Tony Robinson *
* *
* See the file LICENSE for conditions on distribution and usage *
* *
******************************************************************************/
# include <stdio.h>
# include "shorten.h"
# define USIZE 256
# define HUSIZE 128
# define SHIFTSIZE 13
char *argv0 = "mkbshift";
char *filenameo = NULL;
FILE *fileo = NULL;
int main() {
FILE *fout;
char *filename = "bitshift.h", *writemode = "w";
int shift, i;
int tab[USIZE];
long sample;
long **forwardmap = long2d((ulong) SHIFTSIZE, (ulong) USIZE);
long **reversemap = long2d((ulong) SHIFTSIZE, (ulong) USIZE);
fout = fopen(filename, writemode);
if(fout == NULL)
perror_exit("fopen(\"%s\", \"%s\")", filename, writemode);
for(i = 0; i < USIZE; i++) tab[i] = 0;
/* brute force search of the largest number of zero bits in a linear value */
for(shift = 0; shift < SHIFTSIZE; shift++)
for(sample = -(1L << 15); sample < (1L << 15); sample += 1 << (shift + 3))
tab[Slinear2ulaw(sample)] = shift;
/* print this out as a lookup table */
fprintf(fout, "char ulaw_maxshift[%d] = {", USIZE);
for(i = 0; i < USIZE - 1; i++)
fprintf(fout, "%d,", tab[i]);
fprintf(fout, "%d};\n\n", tab[USIZE - 1]);
/* compute the greatest inward shift compatable with ??? */
for(shift = 0; shift < SHIFTSIZE; shift++) {
int nused;
nused = 0;
for(i = 255; i >= 128; i--)
if(tab[i] >= shift) forwardmap[shift][i] = nused++;
for(i = 255; i >= 128; i--)
if(tab[i] < shift) forwardmap[shift][i] = nused++;
nused = -1;
for(i = 126; i >= 0; i--)
if(tab[i] >= shift) forwardmap[shift][i] = nused--;
forwardmap[shift][127] = nused--;
for(i = 126; i >= 0; i--)
if(tab[i] < shift) forwardmap[shift][i] = nused--;
for(i = 0; i < USIZE; i++)
reversemap[shift][forwardmap[shift][i] + HUSIZE] = i;
}
/* simple check */
for(shift = 0; shift < SHIFTSIZE; shift++)
for(i = 0; i < USIZE; i++)
if(forwardmap[shift][reversemap[shift][i]] != i - HUSIZE)
error_exit("identity maping failed for shift: %d\tindex: %d\n",shift,i);
/* print out the ulaw_inward lookup table */
fprintf(fout, "schar ulaw_inward[%d][%d] = {\n", SHIFTSIZE, USIZE);
for(shift = 0; shift < SHIFTSIZE; shift++) {
fprintf(fout, "{");
for(i = 0; i < USIZE - 1; i++)
fprintf(fout, "%ld,", forwardmap[shift][i]);
if(shift != SHIFTSIZE - 1)
fprintf(fout, "%ld},\n", forwardmap[shift][USIZE - 1]);
else
fprintf(fout, "%ld}\n};\n", forwardmap[shift][USIZE - 1]);
}
fprintf(fout, "\n");
/* print out the ulaw_outward lookup table */
fprintf(fout, "uchar ulaw_outward[%d][%d] = {\n", SHIFTSIZE, USIZE);
for(shift = 0; shift < SHIFTSIZE; shift++) {
fprintf(fout, "{");
for(i = 0; i < USIZE - 1; i++)
fprintf(fout, "%ld,", reversemap[shift][i]);
if(shift != SHIFTSIZE - 1)
fprintf(fout, "%ld},\n", reversemap[shift][USIZE - 1]);
else
fprintf(fout, "%ld}\n};\n", reversemap[shift][USIZE - 1]);
}
/* exit happy */
return(0);
}