convert c code to matlab mex file

19 views (last 30 days)
yawai tint
yawai tint on 18 Aug 2011
please send and reply to me this code
i want to convert this C code to matlab mex function
so help me and convert this code for example
#include "common.h"
#include "huffman.h"
#include "stdlib.h"
#include "mex.h"
HUFFBITS dmask = 1 << (sizeof(HUFFBITS)*8-1);
unsigned int hs = sizeof(HUFFBITS)*8;
struct huffcodetab ht[HTN]; /* array of all huffcodtable headers */
/* 0..31 Huffman code table 0..31 */
/* 32,33 count1-tables */
/* read the huffman encode table */
int read_huffcodetab(FILE *fi)
{
char line[100],command[40],huffdata[40];
unsigned int t,i,j,k,nn,x,y,n=0;
unsigned int xl, yl, len;
HUFFBITS h;
int hsize;
hsize = sizeof(HUFFBITS)*8;
do {
fgets(line,99,fi);
} while ((line[0] == '#') || (line[0] < ' ') );
do {
while ((line[0]=='#') || (line[0] < ' ')) {
fgets(line,99,fi);
}
sscanf(line,"%s %s %u %u %u",command,ht[n].tablename,
&xl,&yl,&ht[n].linbits);
if (strcmp(command,".end")==0)
return n;
else if (strcmp(command,".table")!=0) {
fprintf(stderr,"huffman table %u data corrupted\n",n);
return -1;
}
ht[n].linmax = (1<<ht[n].linbits)-1;
sscanf(ht[n].tablename,"%u",&nn);
if (nn != n) {
fprintf(stderr,"wrong table number %u\n",n);
return(-2);
}
ht[n].xlen = xl;
ht[n].ylen = yl;
do {
fgets(line,99,fi);
} while ((line[0] == '#') || (line[0] < ' '));
sscanf(line,"%s %u",command,&t);
if (strcmp(command,".reference")==0) {
ht[n].ref = t;
ht[n].table = ht[t].table;
ht[n].hlen = ht[t].hlen;
if ( (xl != ht[t].xlen) ||
(yl != ht[t].ylen) ) {
fprintf(stderr,"wrong table %u reference\n",n);
return (-3);
};
do {
fgets(line,99,fi);
} while ((line[0] == '#') || (line[0] < ' ') );
}
else {
ht[n].ref = -1;
ht[n].table=(HUFFBITS *) calloc(xl*yl,sizeof(HUFFBITS));
if (ht[n].table == NULL) {
fprintf(stderr,"unsufficient heap error\n");
return (-4);
}
ht[n].hlen=(unsigned char *) calloc(xl*yl,sizeof(unsigned char));
if (ht[n].hlen == NULL) {
fprintf(stderr,"unsufficient heap error\n");
return (-4);
}
for (i=0; i<xl; i++) {
for (j=0;j<yl; j++) {
if (xl>1)
sscanf(line,"%u %u %u %s",&x, &y, &len,huffdata);
else
sscanf(line,"%u %u %s",&x,&len,huffdata);
h=0;k=0;
while (huffdata[k]) {
h <<= 1;
if (huffdata[k] == '1')
h++;
else if (huffdata[k] != '0'){
fprintf(stderr,"huffman-table %u bit error\n",n);
return (-5);
};
k++;
};
if (k != len) {
fprintf(stderr,
"warning: wrong codelen in table %u, pos [%2u][%2u]\n",
n,i,j);
};
ht[n].table[i*xl+j] = h;
ht[n].hlen[i*xl+j] = (unsigned char) len;
do {
fgets(line,99,fi);
} while ((line[0] == '#') || (line[0] < ' '));
}
}
}
n++;
} while (1);
}
/* read the huffman decoder table */
int read_decoder_table(FILE *fi)
{
int n,i,nn,t;
unsigned int v0,v1;
char command[100],line[100];
for (n=0;n<HTN;n++) {
/* .table number treelen xlen ylen linbits */
do {
fgets(line,99,fi);
} while ((line[0] == '#') || (line[0] < ' '));
sscanf(line,"%s %s %u %u %u %u",command,ht[n].tablename,
&ht[n].treelen, &ht[n].xlen, &ht[n].ylen, &ht[n].linbits);
if (strcmp(command,".end")==0)
return n;
else if (strcmp(command,".table")!=0) {
fprintf(stderr,"huffman table %u data corrupted\n",n);
return -1;
}
ht[n].linmax = (1<<ht[n].linbits)-1;
sscanf(ht[n].tablename,"%u",&nn);
if (nn != n) {
fprintf(stderr,"wrong table number %u\n",n);
return(-2);
}
do {
fgets(line,99,fi);
} while ((line[0] == '#') || (line[0] < ' '));
sscanf(line,"%s %u",command,&t);
if (strcmp(command,".reference")==0) {
ht[n].ref = t;
ht[n].val = ht[t].val;
ht[n].treelen = ht[t].treelen;
if ( (ht[n].xlen != ht[t].xlen) ||
(ht[n].ylen != ht[t].ylen) ) {
fprintf(stderr,"wrong table %u reference\n",n);
return (-3);
};
while ((line[0] == '#') || (line[0] < ' ') ) {
fgets(line,99,fi);
}
}
else if (strcmp(command,".treedata")==0) {
ht[n].ref = -1;
ht[n].val = (unsigned char (*)[2])
calloc(2*(ht[n].treelen),sizeof(unsigned char));
if (ht[n].val == NULL) {
fprintf(stderr, "heaperror at table %d\n",n);
exit (-10);
}
for (i=0;i<ht[n].treelen; i++) {
fscanf(fi,"%x %x",&v0, &v1);
ht[n].val[i][0]=(unsigned char)v0;
ht[n].val[i][1]=(unsigned char)v1;
}
fgets(line,99,fi); /* read the rest of the line */
}
else {
fprintf(stderr,"huffman decodertable error at table %d\n",n);
}
}
return n;
}
/* do the huffman coding, */
/* note! for counta,countb - the 4 bit value is passed in y, set x to 0 */
/* return value: 0-no error, 1 decode error */
void huffman_coder(unsigned int x, unsigned int y, struct huffcodetab *h,
Bit_stream_struc *bs)
/* x x-value */
/* y y-value */
/* h pointer to huffman code record */
/* bs pointer to open write bitstream */
{
HUFFBITS huffbits; /* data left aligned */
HUFFBITS linbitsX;
HUFFBITS linbitsY;
unsigned int len;
unsigned int xl1 = h->xlen-1;
unsigned int yl1 = h->ylen-1;
linbitsX = 0;
linbitsY = 0;
if (h->table == NULL) return;
if (((x < xl1) || (xl1==0)) && (y < yl1)) {
huffbits = h->table[x*(h->xlen)+y];
len = h->hlen[x*(h->xlen)+y];
putbits(bs,huffbits,len);
return;
}
else if (x >= xl1) {
linbitsX = x-xl1;
if (linbitsX > h->linmax) {
fprintf(stderr,"warning: Huffman X table overflow\n");
linbitsX= h->linmax;
};
if (y >= yl1) {
huffbits = h->table[(h->ylen)*(h->xlen)-1];
len = h->hlen[(h->ylen)*(h->xlen)-1];
putbits(bs,huffbits,len);
linbitsY = y-yl1;
if (linbitsY > h->linmax) {
fprintf(stderr,"warning: Huffman Y table overflow\n");
linbitsY = h->linmax;
};
if (h->linbits) {
putbits(bs,linbitsX,h->linbits);
putbits(bs,linbitsY,h->linbits);
}
}
else { /* x>= h->xlen, y<h->ylen */
huffbits = h->table[(h->ylen)*xl1+y];
len = h->hlen[(h->ylen)*xl1+y];
putbits(bs,huffbits,len);
if (h->linbits) {
putbits(bs,linbitsX,h->linbits);
}
}
}
else { /* ((x < h->xlen) && (y>=h->ylen)) */
huffbits = h->table[(h->ylen)*x+yl1];
len = h->hlen[(h->ylen)*x+yl1];
putbits(bs,huffbits,len);
linbitsY = y-yl1;
if (linbitsY > h->linmax) {
fprintf(stderr,"warning: Huffman Y table overflow\n");
linbitsY = h->linmax;
};
if (h->linbits) {
putbits(bs,linbitsY,h->linbits);
}
}
}
/* do the huffman-decoding */
/* note! for counta,countb -the 4 bit value is returned in y, discard x */
int huffman_decoder(struct huffcodetab *h, /* unsigned */ int *x,
/* unsigned */ int *y, int *v, int *w)
/* h pointer to huffman code record */
/* x returns decoded x value */
/* y returns decoded y value */
{
HUFFBITS level;
int point = 0;
int error = 1;
level = dmask;
if (h->val == NULL) return 2;
/* table 0 needs no bits */
if ( h->treelen == 0)
{ *x = *y = 0;
return 0;
}
/* Lookup in Huffman table. */
do {
if (h->val[point][0]==0) { /*end of tree*/
*x = h->val[point][1] >> 4;
*y = h->val[point][1] & 0xf;
error = 0;
break;
}
if (hget1bit()) {
while (h->val[point][1] >= MXOFF) point += h->val[point][1];
point += h->val[point][1];
}
else {
while (h->val[point][0] >= MXOFF) point += h->val[point][0];
point += h->val[point][0];
}
level >>= 1;
} while (level || (point < ht->treelen) );
/* Check for error. */
if (error) { /* set x and y to a medium value as a simple concealment */
printf("Illegal Huffman code in data.\n");
*x = (h->xlen-1 << 1);
*y = (h->ylen-1 << 1);
}
/* Process sign encodings for quadruples tables. */
if (h->tablename[0] == '3'
&& (h->tablename[1] == '2' || h->tablename[1] == '3')) {
*v = (*y>>3) & 1;
*w = (*y>>2) & 1;
*x = (*y>>1) & 1;
*y = *y & 1;
/* v, w, x and y are reversed in the bitstream.
switch them around to make test bistream work. */
/* {int i=*v; *v=*y; *y=i; i=*w; *w=*x; *x=i;} MI */
if (*v)
if (hget1bit() == 1) *v = -*v;
if (*w)
if (hget1bit() == 1) *w = -*w;
if (*x)
if (hget1bit() == 1) *x = -*x;
if (*y)
if (hget1bit() == 1) *y = -*y;
}
/* Process sign and escape encodings for dual tables. */
else {
/* x and y are reversed in the test bitstream.
Reverse x and y here to make test bitstream work. */
/* removed 11/11/92 -ag
{int i=*x; *x=*y; *y=i;}
*/
if (h->linbits)
if ((h->xlen-1) == *x)
*x += hgetbits(h->linbits);
if (*x)
if (hget1bit() == 1) *x = -*x;
if (h->linbits)
if ((h->ylen-1) == *y)
*y += hgetbits(h->linbits);
if (*y)
if (hget1bit() == 1) *y = -*y;
}
return error;
}

Accepted Answer

Jan
Jan on 18 Aug 2011
The conversion from C to C-mex is easy: You only need the gateway function:
void mexFunction(int nlhs, mxArray *plhs[], int nrhs, const mxArray *prhs[])
This function gets the inputs from MATLAB and creates the outputs. All subfunctions can be copied directly (as long as you consider the 32/64 bit tricks).
You find the corrsponding informations in the MATLAB documentation and several examples are included in the distribution.
  3 Comments
Jan
Jan on 19 Aug 2011
You only need one gateway function, which is the interface between MATLAB and the C-parts. In general you can rename the main() function to e.g. main_C() and convert the inputs and outputs in the gateway mexFunction() from MATLAB to C types and back again.
Have you read the examples shipped with MATLAB?
yawai tint
yawai tint on 23 Aug 2011
NO, I don't read this. I have little knowledge about that.I meet some problem in this case. I got some C code to my thesis but I don't change well with Matlab. This code have many file and they call some function by each other. Should I use gateway function in main program? If I use gateway function in main program,I don't run this. pls help me

Sign in to comment.

More Answers (0)

Categories

Find more on Large Files and Big Data in Help Center and File Exchange

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!