diff --git a/src/sbbs3/unbaja.c b/src/sbbs3/unbaja.c index 293140fd0cb66f64acaabaff02fce236518e086e..5e667048ec5b743134a01a5efe15ca951cc34ba2 100644 --- a/src/sbbs3/unbaja.c +++ b/src/sbbs3/unbaja.c @@ -1,10 +1,5 @@ /* $Id$ */ -/* - * Stuff left ToDo: - * Add label pre-resolution so only used labels are inserted - */ - #include <stdio.h> #include <string.h> @@ -331,143 +326,144 @@ char *getvar(long name) } } -void write_var(FILE *bin, FILE *src) +void write_var(FILE *bin, char *src) { long lng; fread(&lng, 1, 4, bin); - fprintf(src,"%s ",getvar(lng)); + sprintf(strchr(src,0),"%s ",getvar(lng)); } -void write_cstr(FILE *bin, FILE *src) +void write_cstr(FILE *bin, char *src) { uchar ch; char* p; - fputc('"',src); + strcat(src,"\""); while(fread(&ch,1,1,bin)==1) { if(ch==0) break; if((p=c_escape_char(ch))!=NULL) - fprintf(src,"%s",p); + sprintf(strchr(src,0),"%s",p); else if(ch<' ' || ch > 126) - fprintf(src, "\\%03d", ch); + sprintf(strchr(src,0), "\\%03d", ch); else - fputc(ch, src); + sprintf(strchr(src,0), "%c", ch); } - fputc('"',src); - fputc(' ',src); + strcat(src,"\" "); } -void write_lng(FILE *bin, FILE *src) +void write_lng(FILE *bin, char *src) { long lng; fread(&lng,4,1,bin); - fprintf(src,"%ld ",lng); + sprintf(strchr(src,0),"%ld ",lng); } -void write_short(FILE *bin, FILE *src) +void write_short(FILE *bin, char *src) { short sht; fread(&sht,2,1,bin); - fprintf(src,"%d ",sht); + sprintf(strchr(src,0),"%d ",sht); } -void write_ushort(FILE *bin, FILE *src) +void write_ushort(FILE *bin, char *src) { ushort sht; fread(&sht,2,1,bin); - fprintf(src,"%d ",sht); + sprintf(strchr(src,0),"%d ",sht); } -void write_ch(FILE *bin, FILE *src) +void write_ch(FILE *bin, char *src) { char ch; fread(&ch,1,1,bin); - fprintf(src,"%c ",ch); + sprintf(strchr(src,0),"%c ",ch); } -void write_uchar(FILE *bin, FILE *src) +void write_uchar(FILE *bin, char *src) { uchar uch; fread(&uch,1,1,bin); - fprintf(src,"%u ",uch); + sprintf(strchr(src,0),"%u ",uch); } -void write_logic(FILE *bin, FILE *src) +void write_logic(FILE *bin, char *src) { char ch; fread(&ch,1,1,bin); if(ch==LOGIC_TRUE) - fputs("TRUE ",src); + strcat(src,"TRUE "); else - fputs("FALSE ",src); + strcat(src,"FALSE "); } -int write_key(FILE *bin, FILE *src, int keyset) +int write_key(FILE *bin, char *src, int keyset) { uchar uch; fread(&uch,1,1,bin); if(uch==0 && keyset) - return(uch);; + return(uch); if(uch==CS_DIGIT) - fputs("DIGIT",src); + strcat(src,"DIGIT"); else if(uch==CS_EDIGIT) - fputs("EDIGIT",src); + strcat(src,"EDIGIT"); else if(uch==CR) - fputs("\\r",src); + strcat(src,"\\r"); else if(uch==LF) - fputs("\\n",src); + strcat(src,"\\n"); else if(uch==TAB) - fputs("\\t",src); + strcat(src,"\\t"); else if(uch==BS) - fputs("\\b",src); + strcat(src,"\\b"); else if(uch==BEL) - fputs("\\a",src); + strcat(src,"\\a"); else if(uch==FF) - fputs("\\f",src); + strcat(src,"\\f"); else if(uch==11) - fputs("\\v",src); + strcat(src,"\\v"); else if(uch & 0x80) - fprintf(src,"/%c",uch&0x7f); + sprintf(strchr(src,0),"/%c",uch&0x7f); else if(uch < ' ') - fprintf(src,"^%c",uch+0x40); + sprintf(strchr(src,0),"^%c",uch+0x40); else if(uch=='\\') - fputs("'\\'",src); + strcat(src,"'\\'"); else if(uch=='^') - fputs("'^'",src); + strcat(src,"'^'"); else if(uch=='/') - fputs("'/'",src); + strcat(src,"'/'"); else if(uch=='\'') - fputs("\\'",src); + strcat(src,"\\'"); else - fprintf(src,"%c",uch); + sprintf(strchr(src,0),"%c",uch); if(!keyset) - fputc(' ',src); + strcat(src," "); return(uch);; } -void write_keys(FILE *bin, FILE *src) +void write_keys(FILE *bin, char *src) { while(write_key(bin,src,TRUE)); - fputc(' ',src); + strcat(src," "); } -void eol(FILE *src) +void eol(char *src) { - fseek(src, ftell(src)-1,SEEK_SET); - fputc('\n',src); + char *p; + p=strchr(src,0); + p--; + *p='\n'; indent+=indenteol; indenteol=0; } #define WRITE_NAME(name) if(indent<0) indent=0; \ - fprintf(src,"%.*s"name" ",indent,"\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t") \ + sprintf(strchr(src,0),"%.*s"name" ",indent,"\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t") \ /* printf("%s\n",name) */ @@ -566,7 +562,7 @@ void eol(FILE *src) #define MUCH(name) WRITE_NAME(name); \ if(usevar) { \ - fprintf(src,"%s ",getvar(var)); \ + sprintf(strchr(src,0),"%s ",getvar(var)); \ usevar=FALSE; \ fread(buf,1,1,bin); \ } else { \ @@ -577,7 +573,7 @@ void eol(FILE *src) #define MSHT(name) WRITE_NAME(name); \ if(usevar) { \ - fprintf(src,"%s ",getvar(var)); \ + sprintf(strchr(src,0),"%s ",getvar(var)); \ usevar=FALSE; \ fread(buf,2,1,bin); \ } else { \ @@ -589,7 +585,7 @@ void eol(FILE *src) #define MVARLNG(name) WRITE_NAME(name); \ write_var(bin,src); \ if(usevar) { \ - fprintf(src,"%s ",getvar(var)); \ + sprintf(strchr(src,0),"%s ",getvar(var)); \ usevar=FALSE; \ fread(buf,4,1,bin); \ } else { \ @@ -602,7 +598,7 @@ void eol(FILE *src) write_var(bin,src); \ write_short(bin,src); \ if(usevar) { \ - fprintf(src,"%s ",getvar(var)); \ + sprintf(strchr(src,0),"%s ",getvar(var)); \ usevar=FALSE; \ fread(buf,1,1,bin); \ } else { \ @@ -614,7 +610,7 @@ void eol(FILE *src) #define MVARSHT(name) WRITE_NAME(name); \ write_var(bin,src); \ if(usevar) { \ - fprintf(src,"%s ",getvar(var)); \ + sprintf(strchr(src,0),"%s ",getvar(var)); \ usevar=FALSE; \ fread(buf,2,1,bin); \ } else { \ @@ -626,7 +622,7 @@ void eol(FILE *src) #define MVARUCH(name) WRITE_NAME(name); \ write_var(bin,src); \ if(usevar) { \ - fprintf(src,"%s ",getvar(var)); \ + sprintf(strchr(src,0),"%s ",getvar(var)); \ usevar=FALSE; \ fread(buf,1,1,bin); \ } else { \ @@ -639,13 +635,13 @@ void eol(FILE *src) write_var(bin,src); \ write_var(bin,src); \ if(usevar) { \ - fprintf(src,"%s ",getvar(var)); \ + sprintf(strchr(src,0),"%s ",getvar(var)); \ usevar=FALSE; \ fread(buf,2,1,bin); \ } else { \ fread(&ush, 2, 1, bin); \ if(ush) \ - fprintf(src,"%u ",ush); \ + sprintf(strchr(src,0),"%u ",ush); \ } \ eol(src); \ break @@ -654,7 +650,7 @@ void eol(FILE *src) write_var(bin,src); \ write_var(bin,src); \ if(usevar) { \ - fprintf(src,"%s ",getvar(var)); \ + sprintf(strchr(src,0),"%s ",getvar(var)); \ usevar=FALSE; \ fread(buf,2,1,bin); \ } else { \ @@ -666,7 +662,7 @@ void eol(FILE *src) #define MVARUSTVAR(name) WRITE_NAME(name); \ write_var(bin,src); \ if(usevar) { \ - fprintf(src,"%s ",getvar(var)); \ + sprintf(strchr(src,0),"%s ",getvar(var)); \ usevar=FALSE; \ fread(buf,2,1,bin); \ } else { \ @@ -679,7 +675,7 @@ void eol(FILE *src) #define MVARUSTSTR(name) WRITE_NAME(name); \ write_var(bin,src); \ if(usevar) { \ - fprintf(src,"%s ",getvar(var)); \ + sprintf(strchr(src,0),"%s ",getvar(var)); \ usevar=FALSE; \ fread(buf,2,1,bin); \ } else { \ @@ -691,7 +687,7 @@ void eol(FILE *src) #define MLNG(name) WRITE_NAME(name); \ if(usevar) { \ - fprintf(src,"%s ",getvar(var)); \ + sprintf(strchr(src,0),"%s ",getvar(var)); \ usevar=FALSE; \ fread(buf,4,1,bin); \ } else { \ @@ -702,7 +698,7 @@ void eol(FILE *src) #define MLNGVAR(name) WRITE_NAME(name); \ if(usevar) { \ - fprintf(src,"%s ",getvar(var)); \ + sprintf(strchr(src,0),"%s ",getvar(var)); \ usevar=FALSE; \ fread(buf,4,1,bin); \ } else { \ @@ -714,7 +710,7 @@ void eol(FILE *src) #define MSHTSTR(name) WRITE_NAME(name); \ if(usevar) { \ - fprintf(src,"%s ",getvar(var)); \ + sprintf(strchr(src,0),"%s ",getvar(var)); \ usevar=FALSE; \ fread(buf,2,1,bin); \ } else { \ @@ -726,7 +722,7 @@ void eol(FILE *src) #define MLNGSTR(name) WRITE_NAME(name); \ if(usevar) { \ - fprintf(src,"%s ",getvar(var)); \ + sprintf(strchr(src,0),"%s ",getvar(var)); \ usevar=FALSE; \ fread(buf,4,1,bin); \ } else { \ @@ -739,7 +735,7 @@ void eol(FILE *src) #define MVARLNGLNG(name) WRITE_NAME(name); \ write_var(bin,src); \ if(usevar) { \ - fprintf(src,"%s ",getvar(var)); \ + sprintf(strchr(src,0),"%s ",getvar(var)); \ usevar=FALSE; \ fread(buf,4,1,bin); \ } else { \ @@ -752,7 +748,7 @@ void eol(FILE *src) #define MVARUCHLNG(name) WRITE_NAME(name); \ write_var(bin,src); \ if(usevar) { \ - fprintf(src,"%s ",getvar(var)); \ + sprintf(strchr(src,0),"%s ",getvar(var)); \ usevar=FALSE; \ fread(buf,1,1,bin); \ } else { \ @@ -765,7 +761,7 @@ void eol(FILE *src) #define MVARCH(name) WRITE_NAME(name); \ write_var(bin,src); \ if(usevar) { \ - fprintf(src,"%s ",getvar(var)); \ + sprintf(strchr(src,0),"%s ",getvar(var)); \ usevar=FALSE; \ fread(buf,1,1,bin); \ } else { \ @@ -1284,7 +1280,7 @@ char *decompile_ars(uchar *ars, int len) return(buf); } -void decompile(FILE *bin, FILE *src) +void decompile(FILE *bin, FILE *srcfile) { int i; char ch; @@ -1298,19 +1294,36 @@ void decompile(FILE *bin, FILE *src) long var=0; char buf[80]; char *p; + char src[2048]; + int redo=FALSE; + char *labels; + size_t currpos=0; + + labels=(char *)calloc(1,filelength(fileno(srcfile))); + if(labels==NULL) { + printf("ERROR allocating memory for labels\n"); + return; + } + while(1) { + currpos=ftell(bin); - while(!feof(bin)) { - ush=ftell(bin); - fprintf(src,":label_%04x\n",ush); - - if(fread(&uch,1,1,bin)!=1) - break; + if(fread(&uch,1,1,bin)!=1) { + if(redo) + break; + redo=TRUE; + printf("Second pass...\n"); + rewind(bin); + continue; + } + src[0]=0; + if(labels[currpos]) + sprintf(src,":label_%04x\n",currpos); switch(uch) { case CS_USE_INT_VAR: usevar=TRUE; fread(&var,4,1,bin); fread(&buf,2,1,bin); /* offset/length */ - break; + continue; case CS_VAR_INSTRUCTION: fread(&uch,1,1,bin); switch(uch) { @@ -1486,23 +1499,12 @@ void decompile(FILE *bin, FILE *src) case TELNET_GATE_STR: /* TELNET_GATE reverses argument order */ WRITE_NAME("TELNET_GATE"); fread(&lng,4,1,bin); - fputc('"',src); - while(fread(&ch,1,1,bin)==1) { - if(ch==0) - break; - if(ch<' ' || ch > 126 || ch == '"') { - fprintf(src, "\\%03d", ch); - } - else - fputc(ch, src); - } - fputc('"',src); - fputc(' ',src); + write_cstr(bin,src); if(usevar) { - fprintf(src,"%s ",getvar(var)); + sprintf(strchr(src,0),"%s ",getvar(var)); usevar=FALSE; } else { - fprintf(src,"%ld ",lng); + sprintf(strchr(src,0),"%ld ",lng); } eol(src); break; @@ -1510,12 +1512,12 @@ void decompile(FILE *bin, FILE *src) WRITE_NAME("TELNET_GATE"); fread(&lng,4,1,bin); fread(&lng2, 1, 4, bin); - fprintf(src,"%s ",getvar(lng2)); + sprintf(strchr(src,0),"%s ",getvar(lng2)); if(usevar) { - fprintf(src,"%s ",getvar(var)); + sprintf(strchr(src,0),"%s ",getvar(var)); usevar=FALSE; } else { - fprintf(src,"%ld ",lng); + sprintf(strchr(src,0),"%ld ",lng); } eol(src); break; @@ -1534,6 +1536,7 @@ void decompile(FILE *bin, FILE *src) default: printf("ERROR! Unknown variable-length instruction: %02x%02X\n",CS_VAR_INSTRUCTION,uch); printf("Cannot continue.\n"); + free(labels); return; } break; @@ -1715,14 +1718,16 @@ void decompile(FILE *bin, FILE *src) break; case CS_GOTO: fread(&ush,2,1,bin); + labels[ush]=TRUE; WRITE_NAME("GOTO"); - fprintf(src,"label_%04x ",ush); + sprintf(strchr(src,0),"label_%04x ",ush); eol(src); break; case CS_CALL: fread(&ush,2,1,bin); + labels[ush]=TRUE; WRITE_NAME("CALL"); - fprintf(src,"label_%04x ",ush); + sprintf(strchr(src,0),"label_%04x ",ush); eol(src); break; case CS_TOGGLE_NODE_MISC: @@ -1744,6 +1749,7 @@ void decompile(FILE *bin, FILE *src) case CS_THREE_MORE_BYTES: printf("ERROR! I dont know anything about CS_THREE_MORE_BYTES.\n"); printf("Cannot continue.\n"); + free(labels); return; case CS_MENU: STR("MENU"); @@ -1823,7 +1829,7 @@ void decompile(FILE *bin, FILE *src) p=(char *)malloc(uch); fread(p,uch,1,bin); WRITE_NAME("COMPARE_ARS"); - fprintf(src,"%s\n",decompile_ars(p,uch)); + sprintf(strchr(src,0),"%s\n",decompile_ars(p,uch)); free(p); break; case CS_TOGGLE_USER_MISC: @@ -1890,6 +1896,7 @@ void decompile(FILE *bin, FILE *src) default: printf("ERROR! Unknown net function %02x%02X\n",CS_NET_FUNCTION,uch); printf("Cannot continue.\n"); + free(labels); return; } break; @@ -1920,11 +1927,11 @@ void decompile(FILE *bin, FILE *src) write_lng(bin,src); fread(&ush,2,1,bin); if(ush==SEEK_CUR) - fputs("CUR ",src); + strcat(src,"CUR "); else if(ush==SEEK_END) - fputs("END ",src); + strcat(src,"END "); else - fprintf(src, "%d ",ush); + sprintf(strchr(src,0), "%d ",ush); eol(src); break; case FIO_SEEK_VAR: @@ -1933,11 +1940,11 @@ void decompile(FILE *bin, FILE *src) write_var(bin,src); fread(&ush,2,1,bin); if(ush==SEEK_CUR) - fputs("CUR ",src); + strcat(src,"CUR "); else if(ush==SEEK_END) - fputs("END ",src); + strcat(src,"END "); else - fprintf(src, "%d ",ush); + sprintf(strchr(src,0), "%d ",ush); eol(src); break; case FIO_LOCK: @@ -2003,6 +2010,7 @@ void decompile(FILE *bin, FILE *src) default: printf("ERROR! Unknown file function %02x%02X\n",CS_FIO_FUNCTION,uch); printf("Cannot continue.\n"); + free(labels); return; } break; @@ -2265,9 +2273,13 @@ void decompile(FILE *bin, FILE *src) default: printf("ERROR! Unknown instruction: %02X\n",uch); printf("Cannot continue.\n"); + free(labels); return; } + if(redo) + fputs(src,srcfile); } + free(labels); } int main(int argc, char **argv)