rendered paste body#include <sys/types.h>
#include <sys/stat.h>
#include <unistd.h>
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#define split_number 8
FILE *outf[split_number*split_number];
char *f_names;
void open_files() {
char names[1024];
int i;
for (i=0;i<split_number*split_number;i++) {
sprintf(names,"%s_%u.dat",f_names,i);
outf[i]=fopen(names,"wb");
};
}
void delete_temp_files() {
char names[1024];
int i;
for (i=0;i<split_number*split_number;i++) {
sprintf(names,"%s_%u.dat",f_names,i);
unlink(names);
};
}
void stat_file(unsigned int num, struct stat *buf) {
char name[1024];
sprintf(name,"%s_%u.dat",f_names,num);
stat(name,buf);
}
void dump_file(unsigned int num, FILE *outf) {
char name[1024];
char b;
sprintf(name,"%s_%u.dat",f_names,num);
FILE *inf=fopen(name,"rb");
for (;;) {
fread(&b,1,1,inf);
if (feof(inf)) break;
fwrite(&b,1,1,outf);
};
}
void close_files() {
int i;
for (i=0;i<split_number*split_number;i++) {
fclose(outf[i]);
};
}
void write_out(unsigned int x, unsigned int y, char *buf, int bufp) {
unsigned int p;
unsigned int x1,y1;
x1=x/(256/split_number);
y1=y/(256/split_number);
p=x1*split_number+y1;
fwrite(buf,bufp+2,1,outf[p]);
};
int main (int argc, char **argv) {
FILE *inf;
FILE *outf;
char buf[65535];
unsigned int buf_pointer;
union {
char a[2];
unsigned short int b_int;
} bb;
struct {
unsigned long f_offset;
unsigned long f_len;
} f_header[64];
unsigned long global_len;
struct stat f_stat;
char *ss1;
char *ss2;
unsigned int x,y;
unsigned short int *b_int;
int r;
char inf_n[1024];
if (argc<2) {
printf("Usage: convert <filename> <--- w/o .dat\n Result: <filename>.l2j\n");
exit(0);
};
f_names=argv[1];
sprintf(inf_n,"%s.dat",f_names);
inf=fopen(inf_n,"r");
open_files();
int j,i;
fseek(inf,18,SEEK_SET);
for (x=0;x<256;x++) {
for (y=0;y<256;y++) {
buf_pointer=0;
r=fread(&buf[buf_pointer],2,1,inf);
bb.a[1]=buf[buf_pointer+1];
bb.a[0]=buf[buf_pointer];
if (bb.b_int>2048) {
printf("error %u\n",bb.b_int);
exit(1);
};
if (bb.b_int==0) {
buf_pointer+=2;
r=fread(&buf[buf_pointer],2,1,inf);
buf_pointer+=2;
r+fread(&buf[buf_pointer],2,1,inf);
write_out(x,y,&buf[0],buf_pointer);
} else if ( bb.b_int == 64) {
for (i=0;i<64;i++) {
buf_pointer+=2;
r=fread(&buf[buf_pointer],2,1,inf);
};
write_out(x,y,&buf[0],buf_pointer);
} else {
for (i=0;i<64;i++) {
buf_pointer+=2;
r=fread(&buf[buf_pointer],2,1,inf);
bb.a[1]=buf[buf_pointer+1];
bb.a[0]=buf[buf_pointer];
for (j=0;j<bb.b_int;j++) {
buf_pointer+=2;
r=fread(&buf[buf_pointer],2,1,inf);
};
};
write_out(x,y,&buf[0],buf_pointer);
};
};
};
fclose(inf);
close_files();
sprintf(inf_n,"%s.l2j",f_names);
outf=fopen(inf_n,"wb");
for (i=0;i<64;i++) {
f_header[i].f_offset=0;
f_header[i].f_len=0;
};
global_len=sizeof(f_header);
for (i=0;i<64;i++) {
stat_file(i,&f_stat);
f_header[i].f_offset=global_len;
f_header[i].f_len=f_stat.st_size;
global_len+=f_stat.st_size;
};
fwrite(&f_header,sizeof(f_header),1,outf);
for (i=0;i<64;i++) dump_file(i,outf);
fclose(outf);
delete_temp_files();
}