#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <unistd.h>
#include <string.h>
#include "func.h"
int merge(char *filename) // somefile.001
{
FILE *fp_split,
*fp_merged;
unsigned
long int merged_size,
split_size;
int end,
filenr,
amount,
startnr,
i, n,
notfound,
split_pos,
bytes_read;
char *merged_fname,
*split_fname,
*orig_fname,
*missing_fname,
*c_bytes,
*split_sfname;
struct stat buf;
c_bytes = (char*)malloc(sizeof(char*) * 5000);
if (filename[strlen(filename)-4] != '.')
{
printf("Erroneous filename. Please supply the extension.\n"
"Must end with .000 or .001\n");
exit(0);
}
switch (filename[strlen(filename)-1])
{
case '0':
startnr = 0;
break;
case '1':
startnr = 1;
break;
default:
printf("Erroneous filename. Please supply the extension.\n"
"Must end with .000 or .001\n");
exit(0);
}
orig_fname = (char*)malloc(sizeof(char*) * strlen(filename)-3);
split_fname = (char*)malloc(sizeof(char*) * strlen(filename));
strncpy(orig_fname,filename,strlen(filename)-4);
orig_fname[strlen(filename)-4] = '\0';
merged_fname = (char*)strdup(orig_fname);
merged_fname = (char*)strip_path(merged_fname);
amount = 0;
notfound = 0;
merged_size = 0;
for (filenr = startnr; filenr < 1000; filenr++)
{
if (filenr < 10)
sprintf(split_fname,"%s.00%d",orig_fname,filenr);
else if (filenr < 100)
sprintf(split_fname,"%s.0%d",orig_fname,filenr);
else if (filenr < 1000)
sprintf(split_fname,"%s.%d",orig_fname,filenr);
if (stat(split_fname,&buf) == -1)
{
if (filenr == startnr)
{
printf("Can't open %s\n",split_fname);
exit(0);
} else {
if (notfound == 0)
missing_fname = (char*)strdup(split_fname);
notfound = 1;
}
} else {
if (!S_ISREG(buf.st_mode))
{
printf("Can't open `%s'\n",split_fname);
exit(0);
} else {
if (notfound)
{
printf("Missing file `%s' !\n", missing_fname);
exit(0);
}
merged_size += buf.st_size;
amount++;
}
}
}
printf("Creating merged file `%s`.\nComplete size: %d in %d files.\n",
merged_fname,merged_size, amount);
if (stat(merged_fname,&buf) == 0)
{
printf("%s already exists! Aborting...\n",merged_fname);
exit(0);
}
fp_merged = fopen(merged_fname,"w");
for (filenr=startnr; filenr <= amount + (startnr - 1); filenr++)
{
if (filenr < 10)
sprintf(split_fname,"%s.00%d",orig_fname,filenr);
else if (filenr < 100)
sprintf(split_fname,"%s.0%d",orig_fname,filenr);
else if (filenr < 1000)
sprintf(split_fname,"%s.%d",orig_fname,filenr);
split_sfname = (char*)shorten_path(split_fname);
printf("Processing file `%s'...\n",split_sfname);
if (stat(split_fname,&buf) == -1)
{
perror("Unable to open input file");
exit(0);
}
split_size = buf.st_size;
fp_split = fopen(split_fname, "r");
if (fp_split == NULL)
{
perror("Unable to open input file");
exit(0);
}
split_pos = 0;
while (split_pos < (int)split_size)
{
bytes_read = fread(c_bytes, 1, 4096, fp_split);
fwrite(c_bytes, 1, bytes_read, fp_merged);
split_pos += bytes_read;
}
fclose(fp_split);
}
printf("Done!\n");
fclose(fp_merged);
}
syntax highlighted by Code2HTML, v. 0.9.1