#include<stdio.h>
#include<string.h>

#define MAX_PARTS 256
#define PATH_LEN 128

int main(int argc, char **argv) {
	int i, partn;
	FILE *splitme, *part;
	long len, together, longest, parts[MAX_PARTS];
	char *buf, part_len[16], filename[PATH_LEN + 4];
	
	if(argc == 1) {
		printf("Usage: %s [ filename [ part1 size [ part2 size [..] ] ] ]\n\n", argv[0]);
		printf("File to split: ");
		gets(filename);
	}
	else {
		strcpy(filename, argv[1]);
	}

	together = longest = 0;
	if(argc < 3) {
		for(i = 0, part_len[0] = '1'; (strlen(part_len) != 0) && (i < MAX_PARTS); i++) {
			printf("Part size: ");
			gets(part_len);
			parts[i] = atol(part_len);
			together += parts[i];
			if(longest < parts[i])
				longest = parts[i];
		}
		if(i != MAX_PARTS);
			i--;
	}
	else {
		for(i = 0; (i < argc - 2) && (i < MAX_PARTS); i++) {
			parts[i] = atol(argv[i + 2]);
			together += parts[i];
			if(longest < parts[i])
				longest = parts[i];
		}
	}
	
	partn = i;

	if((splitme = fopen(filename, "r")) == NULL) {
		printf("Can't open '%s'.\n", filename);
		return 1;
	}

	fseek(splitme, 0, SEEK_END);
	len = ftell(splitme);

	if(len != together) {
		printf("File length != parts together (%ld vs. %ld).\n", len, together);
		return 1;
	}

	rewind(splitme);
	if((buf = (char*) malloc(longest)) == NULL) {
		printf("Can't get memory for buffer.\n");
		return 1;
	}
	
	strcat(filename, ".000");

	for(i = 0; i < partn; i++) {
		sprintf(filename + strlen(filename) - 3, "%.3d", i);
		if((part = fopen(filename, "w")) == NULL) {
			printf("Can't open '%s'.\n", filename);
			return 1;
		}
		if(fread(buf, 1, parts[i], splitme) != parts[i]) {
			printf("Can't read enough.\n");
			return 1;
		}
		if(fwrite(buf, 1, parts[i], part) != parts[i]) {
			printf("Can't write to '%s'.\n", filename);
			return 1;
		}
		fclose(part);
	}
	
	fclose(splitme);
	printf("All we got is bits and pieces..\n");

	return 0;
	
}

