/* Programa para separar un archivo grande en varios de un tamanio dado */
/* Version para Windows                                                 */
/* Por Santiago Bruno - 19 de agosto de 2002 - Cordoba - Argentina      */
/* E-mail: bananabruno@hotmail.com                                      */
/* Bajado de: http://www.santiagobruno.com.ar/programas.html            */

#include <stdio.h>
#include <fcntl.h>
#include <sys/stat.h>
#include <unistd.h>
#include <string.h>
#include <stdlib.h>
#include <errno.h>

char tochar(int a) {
char ret;
if (a == 0) {ret = '0';}
else if (a == 1) {ret = '1';}
else if (a == 2) {ret = '2';}
else if (a == 3) {ret = '3';}
else if (a == 4) {ret = '4';}
else if (a == 5) {ret = '5';}
else if (a == 6) {ret = '6';}
else if (a == 7) {ret = '7';}
else if (a == 8) {ret = '8';}
else if (a == 9) {ret = '9';}
else {ret = '!';}
return(ret);
}

int main(int argc, char* argv[]) {

int fd_out, fd_in,tmp;
char buf[8193];
char *size;
char filename[32];
int leer=8192,leidos;
int escritos;
int nocreado = 1;
long pos;
int i = 0,filenumber=1111,temp,limit=0;

size = malloc(1024);

if (argc != 3) {
    printf("\nModo de uso: separar archivo size\n");
    printf("donde size es <numero>b (en bytes)\n");
    printf("              <numero>k (en kilobytes)\n");
    printf("              <numero>m (en megabytes)\n\n");
    printf("por ejemplo si tenemos un archivo de 35 megabytes y\n");
    printf("lo queremos separar en archivos de 10 megabytes,\n");
    printf("estas instrucciones son equivalentes\n\n");
    printf("separar archivo 10m\n");
    printf("separar archivo 10240k\n");
    printf("separar archivo 10485760b\n\n");
    printf("recordar que 1k = 1024 bytes, 1m = 1024k, etc\n");
    exit(0);
    
}
else {

    fd_in = open(argv[1], O_RDONLY | O_BINARY);
    if (errno) {
	printf("El archivo de entrada %s no existe\n",argv[1]);
	exit(1);
    }
    strcpy(size,argv[2]);
    while ((size[i] >= '0') && (size[i] <= '9')) {
        limit = limit*10 + (int)(size[i]) - '0';
        i++;
    }
    if (size[i] == 'b' || size[i] == 'B') {;}
    else if (size[i] == 'k' || size[i] == 'K') {limit = limit * 1024;}
    else if (size[i] == 'm' || size[i] == 'M') {limit = limit * 1024 * 1024;}
    else {printf("Size incorrecto\n");exit(1);}

    if (limit < 8192) {leer = limit;}

    i = 0;

    for (;;) {
     temp = filenumber;
    
     filename[3] = tochar(temp%10);
     temp = temp/10;
     filename[2] = tochar(temp%10);
     temp = temp/10;
     filename[1] = tochar(temp%10);
     temp = temp/10;
     filename[0] = tochar(temp %10);
     filename[4] = '\0';
    
    strcat(filename,".sep");
    


	while (i < limit) {

           if ((limit -i) < leer) { leidos = read(fd_in,buf,limit -i);}
           else leidos = read(fd_in,buf,leer);


	    if (leidos <= 0) {
	       close(fd_out);
	       close(fd_in);
	       exit(0);
            }
            else {
                if (nocreado) {fd_out = open(filename,O_CREAT | O_WRONLY | O_TRUNC | O_BINARY, S_IWUSR);nocreado=0;}
                escritos = write(fd_out,buf,leidos);
            }
    	    i += escritos;
	}	
    close(fd_out);
    nocreado = 1;
    filenumber++;
    i = 0;
    }							
}
printf("\ne-mail: bananabruno@hotmail.com");
printf("\nBajado de: http://www.santiagobruno.com.ar/programas.html\n");

return(0);
}
