#include<stdio.h>
#include<conio.h>
#include<string.h>
#include<alloc.h>
#include<stdlib.h>
#include<stdarg.h>
struct file
{
char magic[10];
int verno1;
int verno2;
int cp_c;
int a_flags;
int this_cl;
int super_cl;
int inter_c;
int field_c;
int meth_c;
int attr_c;//Currently only 1 "Source file attr"
void *attr_i;
};
struct sfile
{
int name;
int len;
int s;
};
struct meth
{
int a_flag;
int name;
int sign;
int attr_c;
void *attr_i; //code_info
};
struct cinfo
{
int name;
int len;
int stack;
int local;
int c_len;
unsigned char *code;
int ex_len;
void *ex; // Right now it is not stored, Skipped
int attr_c;
void *attr_i; //Right now only LNT
};
struct lnt
{
int name;
int len; //Right now Line no. table is skipped
};
int small( char *ss )
{
return (((int)ss[0])<<8)+ss[1];
}
struct aaa
{
int x1, x2;
};
struct bbb
{
int x;
char *ss;
};
struct ccc
{
long x1,x2;
};
struct pool_info
{
int tag;
void *info;
};
void abc( char *ss )
{
static int k=0;
FILE *fpo= fopen("z1.txt", "a");
fprintf(fpo, "%d=%s\n", k, ss);
k++;
fclose(fpo);
}
pool_info *p;
char *get( int x, int y=1 )
{
int jj;
switch(p[x].tag)
{
case 7:
case 8:
jj = ((aaa *)p[x].info)->x1;
return get ( jj );
case 9:
case 10:
case 12:
if( y==1 )
{
jj = ((aaa *)p[x].info)->x1;
return get ( jj );
}
else
{
jj = ((aaa *)p[x].info)->x2;
return get ( jj );
}
default :
return ((bbb *)p[x].info)->ss;
}
}
void cview(meth);
void method (unsigned char *,int, int *, char **, int&);
void arrange( char * );
int catstr( char *msg, ...)
{
va_list ap;
char *arg; int len=0;
arg=new char[50];
va_start(ap, msg);
strcpy(arg, va_arg(ap, char *));
while(strcmp(arg,"\0"))
{
len+=strlen(arg);
strcat(msg, arg);
strcpy(arg, va_arg(ap, char *));
}
va_end(ap);
return len;
}
int main(int argc, char *argv[])
{
FILE *fp;
file fi;
fp = fopen(argv[1],"r+b");
if(fp==NULL)
{
printf("Unable to open input file\n");
exit(0);
}
char aa[40], bb[100];
fread(aa,8,1,fp); //Skip CAFEBABE, Ver nos
fread(aa,2,1,fp); //Constant pool size
fi.cp_c=small(aa);
sprintf(bb, "Count=%d\n", fi.cp_c);
abc(bb);
p = new pool_info[fi.cp_c];
int i;
//Store sections in class pool
for ( int j=1; j<fi.cp_c; j++)
{
i = fgetc(fp);
switch(i)
{
case 1:
bbb *s = new bbb;
fread(aa,2,1,fp);
s->x=small(aa);
fread(aa, s->x, 1, fp);
aa[s->x]='\0';
s->ss = new char[s->x+1];
strcpy(s->ss, aa);
p[j].tag=1;
p[j].info = (void *)s;
sprintf(bb, "%s(%d)", ((bbb *)p[j].info)->ss, p[j].tag);
abc(bb);
break;
case 3:
case 4:
ccc *tem=new ccc;
fread(aa,4,1,fp);
tem->x1 = aa[2]*256+aa[3];
if(i==3)
p[j].tag=3;
else
p[j].tag=4;
p[j].info=(void *)tem;
sprintf(bb, "%ld(%d)", ((ccc *)p[j].info)->x1,p[j].tag);
abc(bb);
break;
case 5 :
case 6 :
ccc *tem2=new ccc;
fread(aa,4,1,fp);
tem2->x1 = aa[2]*256+aa[3];
fread(aa,4,1,fp);
tem2->x2 = aa[2]*256+aa[3];
if(i==5)
p[j].tag=5;
else
p[j].tag=6;
p[j].info=(void *)tem2;
sprintf(bb, "%ld..%ld(%d)", ((ccc *)p[j].info)->x1,((ccc *)p[j].info)->x2,p[j].tag);
abc(bb);
break;
case 7:
case 8:
aaa *temp;
temp=new aaa;
fread(aa,2,1,fp);
temp->x1 = small(aa);
if(i==7)
p[j].tag=7;
else
p[j].tag=8;
p[j].info=(void *)temp;
sprintf(bb, "%d(%d)", ((aaa *)p[j].info)->x1,p[j].tag);
abc(bb);
break;
case 9 :
case 11:
case 10:
case 12:
aaa *temp1;
temp1 = new aaa;
fread(aa,2,1,fp);
temp1->x1=small(aa);
fread(aa,2,1,fp);
temp1->x2=small(aa);
if(i==9) p[j].tag=9;
else if (i==10) p[j].tag=10;
else if (i==11) p[j].tag=11;
else p[j].tag=12;
p[j].info = (void *)temp1;
sprintf(bb,"%d..%d(%d)", ((aaa *)p[j].info)->x1, ((aaa *)p[j].info)->x2, p[j].tag);
abc(bb);
break;
}
}
fread(aa, 2, 1, fp); //Flags
fi.a_flags = small(aa);
fread(aa, 2, 1, fp); //this_class
fi.this_cl=small(aa);
fread(aa, 2, 1, fp); //super_class
fi.super_cl=small(aa);
//Assumed to be zero
fread(aa, 2, 1, fp); //interface
fi.inter_c=small(aa);
//zero fields
fread(aa, 2, 1, fp); //fields
fi.field_c=small(aa);
fread(aa, 2, 1, fp); //methods
fi.meth_c=small(aa);
meth *mth=new meth[fi.meth_c];
int jj;
for( j=0; j<fi.meth_c; j++ )
{
fread ( aa, 2, 1, fp);
mth[j].a_flag=small(aa);
fread(aa, 2, 1, fp);
mth[j].name=small(aa);
fread(aa, 2, 1, fp);
mth[j].sign=small(aa);
//Only attribute is Code Attribute
fread(aa, 2, 1, fp);
mth[j].attr_c=small(aa);
cinfo *temp2;
temp2 = new cinfo;
//attr name will be always be Code
fread(aa, 2, 1, fp);
temp2->name=small(aa);
fread(aa, 4, 1, fp);
temp2->len=aa[2]*256+aa[3];
fread(aa, 2, 1, fp);
temp2->stack=small(aa);
fread(aa, 2, 1, fp);
temp2->local=small(aa);
fread(aa, 4, 1, fp);
temp2->c_len=aa[2]*256+aa[3];
temp2->code=new unsigned char[temp2->c_len];
for( i=0; i<temp2->c_len; i++ )
temp2->code[i]=fgetc(fp);
//zero exception
fread(aa, 2, 1, fp);
temp2->ex_len=small(aa);
fread(aa, 2, 1, fp);
temp2->attr_c=small(aa);
if(temp2->attr_c>0)
{
lnt *temp3;
temp3=new lnt;
fread(aa, 2, 1, fp);
temp3->name=small(aa);
fread(aa, 4, 1, fp);
temp3->len=aa[2]*256+aa[3];
//Skip Line No. Table
for( i=0; i<temp3->len; i++ )
fgetc(fp);
temp2->attr_i=(void *)temp3;
}
mth[j].attr_i=(void *)temp2;
}
//attr_count=1 for Source File
fread(aa, 2, 1, fp);
fi.attr_c=small(aa);
sfile *sf;
sf = new sfile;
fread(aa, 2, 1, fp);
sf->name=small(aa);
fread(aa, 4, 1, fp);
sf->len=aa[2]*256+aa[3];
fread(aa, 2, 1, fp);
sf->s = small(aa);
fi.attr_i = (void *) sf;
fclose(fp);
//***Output data
// output.cpp
//*****
for(i=0; i<fi.meth_c; i++)
cview(mth[i]);
return 0;
}
int methsign(int,int, char* );
char *v(char c, int ii)
{
char aa[20]; char temp[20];
if( c == 'i')
strcpy(aa, "ii");
else if( c == 'o' )
strcpy(aa, "oo");
itoa(ii, temp, 10);
strcat(aa, temp);
return aa;
}
void cview(meth mi)
{
char proto[100];
int len=((cinfo *)mi.attr_i)->c_len;
unsigned char *c=new unsigned char[len];
for(int i=0; i<len; i++)
c[i]=((cinfo *)mi.attr_i)->code[i];
printf("\n");
//function with sign
methsign( mi.name, mi.sign, proto );
printf("\n");
printf("%s\n", proto);
printf("{\n");
char **code; //Send as argument
*code=new (char *)[250];
for(i=0; i<50; i++)
code[i]=new char[50];
int *var=new int[50]; //As arg
for(i=0; i<50; i++)
var[i]=0;
// var[0]=1;
int ii=0;
method(c, len, var, code, ii);
i=1; char aa[50];
while(var[i]!=0)
{
printf("int ");
strcpy(aa, v('i',i));
printf("%s;\n", aa);
i++;
}
for(i=0; i<ii; i++)
printf("%s\n", code[i]);
}
void method(unsigned char *c, int len, int *var, char **code, int &ii)
{
char stack[80];
int offset;
unsigned char *lc;
int i=0;//pointer in stack
int cc=0;//Count Bytes
int r; char p[20]; int k;
while(cc<len)
{
switch( c[cc] )
{
case 3 : //Push integer const 0-5 (iconst_<n>
case 4 :
case 5 :
case 6 :
case 7 :
case 8 :
r=c[cc]-3+48;
stack[i++]=r;
stack[i++]=' ';
break;
case 16 : //Push one byte signed integer (bipush,byte1)
r=c[++cc];
itoa(r, p, 10);
stack[i]='\0';
i+=catstr(stack,p," ","\0");
break;
case 59 ://Integer Variable (istore_<n>) LHS
case 60 :
case 61 :
case 62 :
case 75 ://Objects Variable (astore_<n>) LHS
case 76 :
case 77 :
case 78 :
if(c[cc] <=62)
{r=c[cc]-59;
if(var[r]==0 || var[r]==2)
var[r]=1;
strcpy(code[ii], v('i',r));
}
else
{r=c[cc]-75; strcpy(code[ii], v('o',r));}
stack[i]='\0';
arrange(stack);
catstr(code[ii], "=", stack, ";", "\0");
i=0;ii++;
break;
case 54 ://Integer variable (istore, vindex) LHS
case 58 ://Object variable (astore, vindex) LHS
cc++;
r=c[cc]; //vindex
stack[i]='\0';
arrange(stack);
if(c[cc-1]==54)
{
if(var[r]==0 || var[r]==2)
var[r]=1;
strcpy(code[ii], v('i',r));
}
else
strcpy(code[ii], v('o',r));
catstr(code[ii], "=", stack, ";", "\0");
i=0; ii++;
break;
case 26 ://Load integer variable on stack (iload_<n>) RHS
case 27 :
case 28 :
case 29 :
case 42 ://Load object variable on stack (aload_<n>) RHS
case 43 :
case 44 :
case 45 :
if(c[cc]<=29)
{r=c[cc]-26; strcpy(p, v('i',r));}
else
{r=c[cc]-42; strcpy(p, v('o',r));}
stack[i]='\0';
i+=catstr(stack, p, " ", "\0");
break;
case 21 : //iload,vindex RHS
case 25 : //aload,vindex RHS
cc++;
r=c[cc]; //Vindex
if(c[cc-1]==21)
strcpy(p, v('i',r));
else
strcpy(p, v('o',r));
stack[i]='\0';
i+=catstr(stack, p, " ", "\0");
break;
case 96 : // +
case 104 : // *
case 100 : // -
case 108 : // /
if(c[cc] == 96)
stack[i]='+';
else if(c[cc] == 104)
stack[i]='*';
else if(c[cc] == 100)
stack[i]='-';
else
stack[i]='/';
i++;
stack[i]=' ';i++;
break;
case 18 ://Push item from constant pool (ldc1, indexbyte1)
cc++;
r=c[cc];
stack[i]='\0';
i+=catstr(stack, get(r), " ", "\0");
break;
case 176 : //Return Object (areturn)
*(stack+i)='\0';
strcpy(code[ii],"\0");
catstr(code[ii], "return", stack, ";", "\0");
i=0; ii++;
break;
case 167 :
strcpy(p, code[--ii]);
strcpy(code[ii], "\0");
catstr(code[ii], "for(",p,"\0");
k=ii; //Store line no. where for loop starts(to write cond. etc
cc++; ii++;
offset=c[++cc]; //256*c[cc]+c[++cc]
lc=new unsigned char[offset-3];
for (i=0; i<offset-3; i++)
lc[i]=c[++cc];
method(lc, offset-3, var, code, ii);
i=0;
break;
case 161 :
case 163 :
if(c[cc] == 161)
stack[i++] = '<';
else
stack[i++] = '>';
stack[i]='\0';
arrange(stack);
catstr(code[k], stack, ";","\0");
ii--;ii--;
strcpy(p, code[ii]);
strcpy(code[ii], "}"); ii++;
catstr(code[k], p,"){","\0");
cc++; cc++; i=0;
break;
case 162 : // >= i.e. <
case 164 : // <= i.e. >
strcpy(code[ii], "if(");
stack[i]='\0';
if(c[cc] == 162)
strcat(stack, "< ");
else
strcat(stack, "> ");
arrange(stack);
catstr(code[ii], stack, "){", "\0");
ii++; cc++;
offset=c[++cc]; //256*c[cc]+c[cc+1]
lc=new unsigned char[offset-3];
for (i=0; i<offset-3; i++)
lc[i]=c[++cc];
method(lc, offset-3, var, code, ii);
i=0;
break;
case 132 :
cc++;
r=c[cc];
strcpy(p, v('i',r));
stack[i]='\0';
i+=catstr(stack, p,"\0");
cc++;
r=c[cc];
*(stack+i)='+';i++;
*(stack+i)='+';i++;
*(stack+i)='\0';
strcpy(code[ii], stack);
i=0; ii++;
break;
}
cc++;
}
strcpy(code[ii], "}");
ii++;
/* i=1; printf("int ");
char aa[50];
while(var[i]!=0)
{
strcpy(aa, v('i',i));
printf("%s,", aa);
i++;
}
printf("\n");
for(i=0; i<ii+1; i++)
printf("%s\n", code[i]);*/
}
//convert from Djikstra's Algorithm
void arrange( char *ss )
{
int i=0;//increment ss by i
char var1[20], var2[20];
char temp[30]; //local
char ii; //store byte of ss
int next=0; //check if ->varible or operator
int check=0; //check :a*b+b*c ->ab*bc*+
int k=0;
while ((ii=*(ss+i)) != '\0')
{
if(ii == 32)
{ next++; k=0; i++;
if((ii=*(ss+i)) == '\0')
{
strcpy(temp, var1);
break;
}
}
if(!next)
{ var1[k] = ii; k++; var1[k] = '\0';}
else
if(next==1)
{ var2[k] = ii; k++; var2[k] = '\0'; }
else //var1+operator+var2
{
if(!check)
strcpy(temp, var1);
else
{ //var1+operator+var2 -> var2
char aa[20];
k=0;
while( *(var1+k) != '\0')
{ k++; }
var1[k]=ii; var1[k+1]='\0';
strcat(var1, var2);
strcpy(var2, var1);
i++; i++;
ii=*(ss+i);
}
k=0;
while( *(temp+k) != '\0')
{ k++; }
if( ii!='+' && ii!='-' && ii!='/' && ii!='*' && ii!='<' && ii!='>')
{
strcpy(var1, var2);
next=1;k=0;
check=1;
continue;
}
*(temp+k) = ii; *(temp+k+1)='\0';
strcat(temp, var2);
// var1[0] = '('; var1[1]='\0';
strcpy(var1, temp);
/* k=0;
while( *(var1+k) != '\0')
{ k++; }
var1[k]=')'; var1[k+1]='\0';*/
next=0; check=0;
}
i++;
}
strcpy( ss, temp);
}
char* rtype( char *, int );
int methsign(int x, int y, char *ss )
{
char name[50], *sign;
sign = new char[100];
strcpy(name, get(x));
strcat(name, "(");
sign= get(y);
sign++; int check=0; int r=1;
while(*sign != ')')
{
strcat(name, rtype( sign, r ));
sign++; r++;
if( *sign != ')')
strcat(name, ",");
}
strcat(name, ")");
sign++;
char temp[100];
strcpy(temp, name);
strcpy(name, rtype(sign, -1));
strcat(name, temp);
strcpy(ss,name);
}
char* rtype( char *ss, int r ) //Return type & arg
{
char aa[20]; int i;
switch(*ss)
{
case 'I' :
strcpy(aa, "int ");
if(r!=-1)
strcat(aa, v('i',r));
break;
case 'V' :
strcpy(aa, "void ");
break;
case 'D' :
strcpy(aa, "double ");
if(r=-1)
strcat(aa, v('i',r));
break;
case 'L' :
ss++; i=0;
while(*ss != ';')
{ if(*ss == '/')
i=0;
else
{ aa[i]=*ss; i++; }
ss++;
}
aa[i]=' ';
aa[i+1]='\0';
break;
}
return aa;
}
Download the Project Files
Vijay Mukhi's Computer
Institute
VMCI, B-13, Everest Building, Tardeo, Mumbai 400 034, India
Tel : 91-22-496 4335 /6/7/8/9
Fax : 91-22-307 28 59
e-mail : vmukhi@giasbm01.vsnl.net.in
http://www.vijaymukhi.com