


program splitter;

{
[1;32m*****[0;31m  Quickhack, um eine große Datei in mehrere kleine  [1;32m*****[0;31m

[1;32m*****[0;31m  aufzuspalten.  (C) 1993 by B. Künnen		 [1;32m*****[0;31m
}

{$I "Include:libraries/dos.i" }
{$I "Include:utils/stringlib.i" }
{$I "Include:exec/memory.i" }

Const
  bufsize = 64*1024;		{ Größe des IO-Puffers }

VAR
	ok	  : Boolean;
	mymem	  : Address;
	inFile	  : String;
	i,
	num_files : Integer;
	len	  : Array[1..10] of Integer;
	inhdl,
	outhdl	  : FileHandle;


Procedure CleanExit(why : String;  rt : Integer);
Begin
  If inhdl  <> NIL then DosClose(  inhdl );
  If outhdl <> NIL then DosClose( outhdl );
  If mymem  <> NIL then FreeMem( mymem, bufsize );

  If why <> NIL then write(why);
  Exit(rt);
End;


{ Einlesen & Ausgabe der Daten }

Function SplitIO( num : Integer ): Boolean;
Var
  r,w,
  rwlen,
  outlen  : Integer;
  buffer  : array[0..100] of Char;
  NewName : String;
  buflen  : integer;

Begin
  NewName := Adr( buffer );
  strcpy( NewName, inFile );

  { Name der Ausgabedatei = Eingabedatei+Nummer }
  buflen := strlen( NewName );
  NewName[buflen]   := chr( Byte('0') + num );
  NewName[buflen+1] := chr(0);

  { Öffnen }
  outhdl := DosOpen( NewName, Mode_NewFile );
  If outhdl=NIL then SplitIO:=FALSE;

  { Länge dieser neuen Datei }
  Write("Länge der ", num, ". Datei : ");
  readln(outlen);
  write("Moment...\n");

  { Jetzt in bufsize -großen Stücken umschaufeln }
  REPEAT
    if outlen>bufsize then 
      rwlen := bufsize
    else
      rwlen := outlen;

    r := DosRead (  inhdl, mymem, rwlen );
    w := DosWrite( outhdl, mymem, r );

    If r < rwlen then begin
      write("Dateiende erreicht - Programmabbruch\n");
      DosClose(outhdl);
      outhdl := NIL;
      SplitIO := FALSE;
    End;

    If w < r then begin
      Write("Fehler bei der Ausgabe in die Ziel Datei ", NewName, "\n" );    
      DosClose( outhdl );
      SplitIO := FALSE;
    End;

    If outlen > bufsize then
      outlen := outlen-bufsize
    else
     outlen := 0;

  UNTIL outlen=0;

  { Uuuuuuuuuuuuuuuuuuuuuuuuuuuuunnnd   .....  tschüß ! }
  DosClose( outhdl );
  SplitIO := TRUE;
End;



{ ---- Hauptschleife ---- }

Begin
	inFile := AllocString(100);

	write("Welche Datei soll zerlegt werden ?  : ");
	Readln(inFile);
	If inFile^=chr(0) then CleanExit("Kein Dateiname angegeben.\n", 0);


	inhdl := DosOpen( inFile, Mode_OldFile );
	If inhdl=NIL then CleanExit("Kann Datei nicht öffnen.\n", 10);


	mymem := AllocMem( bufsize, Memf_Public );
	If mymem = NIL then CleanExit("Zu wenig Speicher", 20);


	write("In wieviele Einzeldateien soll sie zerlegt werden ?  : ");
	Readln(num_files);
	If (num_files>10) OR (num_files<1)
	then CleanExit("Min.1 & max. 10 Split-Dateien erlaubt.\n", 0);

	{ Jetzt gehts los ... }

	for i := 1 to num_files do begin
	  ok := SplitIO( i );
	  If OK = False then CleanExit(NIL,0);
	end;

	CleanExit(NIL,0);
End.




