#include <unistd.h>
#include <fcntl.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <errno.h>
#define setnull(x) memset(&(x), 0, sizeof(x))
#define CAL(x, y, z) x + y - z
#define ERR_EXIT(m) \
do { \
fprintf(stderr, "[%s][%d]:%s %s \n" ,__FILE__, __LINE__, m, strerror(errno));\
exit(EXIT_FAILURE); \
}while(0)
int main( int argc, char **argv){
int i,j,len,varLen,ilen ;
char buf[1024];
char temp[2];
char var[64],var1[64];
char ascii[2];
char hexBuf[1024];
char fbuf[1024];
char tobuf[1024];
int begin = 0, end = 0;
char *data;
char *pstr;
char *pstr1;
int retlen;
char varBuf[20];
char varRet;
char srcfile[256],destfile[256];
setnull(srcfile);
setnull(destfile);
sprintf(srcfile,"%s", argv[1]);
sprintf(destfile,"%s", argv[2]);
//printf("%s\n",argv[1]);
//printf("%s\n",srcfile);
//printf("%s\n",argv[2]);
//printf("%s\n",destfile);
//strcpy(hexBuf, argv[1]);
FILE* fd = fopen(srcfile,"r");
FILE* fdw = fopen(destfile,"w");
if(fd){
while(!feof(fd)){
memset(fbuf, 0x00, sizeof(fbuf));
data = fgets(fbuf,sizeof(fbuf)-1,fd);
if(data){
memset(tobuf, 0x00, sizeof(tobuf));
len = strlen(data);
for (i = 0, j = 0; i < len;){
if(!memcmp(data + i,"\\x",2)){
memset(ascii, 0x00, 2);
memcpy(temp, data + i + 2, 2);
//printf("temp: %s\n", temp);
hex2ascii(temp, ascii);
//printf("ascii: %s\n", ascii);
memcpy(tobuf + j, ascii, 1);
i += 4;
j++;
//printf("find \\x string offset %d\n", i);
}else if(!memcmp(data + i,"(0x",3)){
memset(var, 0x00, sizeof(var));
memset(var1, 0x00, sizeof(var1));
memset(varBuf, 0x00, sizeof(varBuf));
memcpy(var, data + i, sizeof(var));
//printf("var: %s \n", var);
pstr = strchr(var, '(');
if ( pstr != NULL)
{
if( pstr1 = strstr(var, ")")){
//printf("find ),\n");
varLen = pstr1 - pstr ;
//printf("%d\n", varLen);
memcpy(var1, var+1,varLen -1);
varRet = cal(var1);
sprintf(varBuf,"%d",varRet);
//printf("%s,%d\n",varBuf,varRet);
ilen = strlen(varBuf);
memcpy(tobuf + j, varBuf , ilen);
j += ilen ;
i += varLen + 1;
}
//else if( pstr1 = strstr(var, ");")){
// printf("find );\n");
// int varLen = pstr1 - pstr ;
// printf("%d\n", varLen);
// memcpy(var1, var+1,varLen -1);
// varRet = cal(var1);
// sprintf(varBuf,"%d;",varRet);
// printf("%s,%d\n",varBuf,varRet);
// int ilen = strlen(varBuf);
// memcpy(tobuf + j, varBuf , ilen + 1);
// j += ilen + 1;
// i += varLen + 1 + 1;
// }
//else if( pstr1 = strstr(var, ")")){
// printf("find )\n");
// int varLen = pstr1 - pstr ;
// printf("%d\n", varLen);
// memcpy(var1, var+1,varLen -1);
// varRet = cal(var1);
// sprintf(varBuf,"%d",varRet);
// printf("%s,%d\n",varBuf,varRet);
// int ilen = strlen(varBuf);
// memcpy(tobuf + j, varBuf , ilen );
// j += ilen;
// i += varLen + 1;
//// }
}
}else{
tobuf[j] = data[i];
i++;
j++;
}
}
//printf("%s", data);
fprintf(fdw,"%s",tobuf);
}
}
}else{
ERR_EXIT("open file failure");
}
fclose(fd);
//for( i = 0; i < strlen(argv[1]); i++){
// printf("%c\n", argv[i]);
//}
//int ret = hex2ascii(hexBuf,buf);
//for( i = 0; i < strlen(buf); i++){
// printf("%c", buf[i]);
//}
//printf("\n");
}
int hex2ascii(char *hex, char *ascii)
{
int len = strlen(hex), tlen, cnt , i;
for( i = 0, cnt = 0 ,tlen =0; i < len; i++){
char c = toupper(hex[i]);
if(( c >= '0' && c <='9') || ( c >= 'A' && c <= 'F'))
{
int t = ( c >='A') ? c - 'A' + 10 : c - '0';
if(cnt)
ascii[tlen++] += t, cnt =0;
else
ascii[tlen] = t << 4, cnt = 1;
}
}
return tlen;
}
int cal(char *exprs){
int x,y,z;
//printf("%s\n", exprs);
sscanf(exprs,"%x + %d - %x",&x,&y,&z);
return CAL(x,y,z);
}