All pastes #64907 Raw Edit

Anonymous

public text v1 · immutable
#64907 ·published 2006-06-12 19:33 UTC
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();
}