/* 
 * img2dsk.c : converts .img disk image to .dsk image
 * 
 * .img files have the following format: first a one byte header, which
 * is 1 (01h) for singled sided 360kB images, and 2 (02h) for double sided
 * 720kB images. These files can be found at ftp://ftp.funet.fi/pub/msx/
 *
 * By Sean Young 1998 (sean@msxnet.org)
 */

#include <stdio.h>
#include <unistd.h>
#include <errno.h>


int main(int argc, char *argv[]) {
    char	buffer[9*512], h;
    int		i;
    long	l;
    FILE	*fin, *fout;

    if (argc != 3) {
	fprintf (stderr, "%s: Missing file arguments or too many\n", argv[0]);
	fprintf (stderr, "Usage: img2dsk SOURCE DESTINATION\n"
	       "    SOURCE is the .img file, DESTINATION the .dsk file.\n");
	return (2);
    }

    fin=fopen (argv[1],"rb");
    if (fin == NULL) {
	perror (argv[1]);
	return (1);
    }

    errno = 0;
    i = fread(&h, 1, 1, fin);
    if (i != 1) {
	if (errno)
	    perror (argv[1]);
	else
	    fprintf (stderr, "%s: File wrong size (not .img file)\n", argv[1]);

	fclose (fin);
	return (1);
    }
    
    fseek (fin, 0L, SEEK_END);
    l = ftell (fin);

    if ( (l != (720L*1024L+1L)) && (l != (360L*1024L+1L)) ) {
	fprintf (stderr, "%s: File wrong size (not .img file)\n", argv[1]);
	fclose (fin);
	return (2);
    }

    if (((long)h * 368640L + 1L) != l) {
	fprintf (stderr, 
	    "%s: header wrong value, continuing anyway\n", argv[1]);
    }

    fseek (fin, 1L, SEEK_SET);

    i = (int)(l / (long)sizeof (buffer));

    fout = fopen (argv[2], "wb");
    if (fout == NULL) {
	perror (argv[2]);
	fclose (fin);
	return (1);
    }

    while (i--) {
	if (sizeof (buffer) != fread (buffer, 1, sizeof (buffer), fin) ) {
	    perror (argv[1]);
	    fclose (fin); fclose (fout);
	    return (1);
	}

        if (sizeof (buffer) != fwrite (buffer, 1, sizeof (buffer), fout) ) {
	    perror (argv[2]);
            fclose (fin); fclose (fout);
	    return (1);
        }
    }

    fclose (fin);
    fclose (fout);

    return (0);
}
