cog/Libraries/Shorten/Files/shorten/util/mkbshift.c

111 lines
3.5 KiB
C

/******************************************************************************
* *
* Copyright (C) 1992-1995 Tony Robinson *
* *
* See the file doc/LICENSE.shorten for conditions on distribution and usage *
* *
******************************************************************************/
/*
* $Id: mkbshift.c 19 2005-06-07 04:16:15Z vspader $
*/
#include <stdio.h>
#include "mkbshift.h"
#ifdef HAVE_CONFIG_H
#include "config.h"
#endif
#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];
slong sample;
slong **forwardmap = long2d((ulong) SHIFTSIZE, (ulong) USIZE);
slong **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]);
}
fclose(fout);
/* exit happy */
return(0);
}