home *** CD-ROM | disk | FTP | other *** search
-
- Program split45; { 03/20/87, by M. Dingacci }
- {
- Compiler end addresses:
-
- 16k buffer: | 24k buffer:
- ----------- | -----------
- 7646 (v3.0) | 9646 (v3.0)
- 751F (v2.0) | 951F (v2.0)
- 72C3 (v1.0) | 92C3 (v1.0)
- }
-
- Type
- filstr = String[20]; { define type for filenames }
-
- Const
- buffrecs = 128; { 16k buffer, 192 for 24k }
- buffsize = 16384; { 24576 for 24k }
- version = 'SPLIT v4.5';
- date = '(03/20/87)';
- Var
- dotpos,colonpos,
- ltr,endrec,i,z,s,
- linesperfile : Integer;
- exten : Real;
- bigbuff : Array[1..buffsize] Of Byte; { bytes in buffer }
- fnm1,fnm2 : filstr;
- filvar,filvar2 : File;
- basename,extenstr : String[9];
- yn,yn2 : Char;
- oldtxfil,newtxfil : Text;
- flag,cflag : Boolean;
-
- Procedure header; { program & version ID }
- Begin
- Writeln(^m^j,version,' -- ',(buffrecs/8):0:2,'k buffer.');
- Writeln(date,' -- Splits a file by records, lines, or files.'^m^j);
- End;
-
- Procedure parse; { parse command line }
- Var
- cmdln :Integer;
- cmdline : filstr Absolute $80; { command tail at 80 hex }
- Begin
- fnm1 := ''; fnm2 := ''; { zero variables }
- i := 0; z := 0;
- ltr := Length(cmdline); { Ltr = # of chars }
- While i < ltr Do Begin { build ParamStr(1) }
- i := i+1; { (could build 2, 3, etc.) }
- If z = 1 Then If cmdline[i] <> ' ' Then fnm1 := fnm1 + cmdline[i];
- If cmdline[i] = ' ' Then z := z + 1;
- End;
- End;
-
- Procedure sysreset;
- Begin
- If (flag) And (exten<>0) Then Begin
- Write('change destination disk & press RETURN ');
- Readln(extenstr);
-
- { reset default drive to allow changing destination disk }
-
- ltr:=Bdos($19); { get default drive name }
- Bdos($0d); { reset disk drive system }
- Bdos($0e,ltr); { select drive for r/w }
- End;
- End;
-
- Procedure chekfile(Var fnm0:filstr);
- Begin
- If fnm0 = '' Then Halt; { end if blank }
- dotpos:= Pos('.',fnm0)-1; { find dot in file name }
- If dotpos < 0
- Then dotpos := Length(fnm0); { dot omitted position }
- For i:=1 To Length(fnm0)
- Do fnm0[i]:=Upcase(fnm0[i]); { capitalize }
- colonpos:=Pos(':',fnm0); { locate colon for drive }
- basename[0] := Chr(dotpos); { parse out base name }
- For i := 1 To dotpos Do basename[i] := fnm0[i];
- flag:=(cflag);
- If Not flag Then cflag := (colonpos = 2);
- If ((colonpos<>0) And (colonpos<>2))
- Or (Length(basename)-(colonpos)>8)
- Or (Length(fnm0)-Length(basename)>4)
- Then Begin
- Writeln('Bad File Name'^m^j^g); { name invalid, try again }
- fnm0 :='';
- End;
- End; {chekfile}
-
- Procedure assignfile;
- Begin
- While fnm1 = '' Do Begin
- Write('Source File Name (RETURN aborts): ');
- Readln(fnm1); { filename prompt }
- chekfile(fnm1); { check valid name }
- End;
- Assign(filvar,fnm1); { assign source file }
- {$I-} Reset(filvar); {$I+} { open file }
- If Ioresult = 1 Then Begin { not found, try again }
- Writeln;
- Writeln('"',fnm1,'" Not Found!'^g);
- Writeln;
- fnm1 := ''; assignfile;
- End;
- End; {assignfile}
-
- Procedure ioerr; { check for full disk/dir }
- Begin
- Case Ioresult Of
- $f0 : Begin; Writeln(^m^j'Disk Full!'^g);
- Close(filvar2); Close(newtxfil);
- Halt ; End;
- $f1 : Begin; Writeln(^m^j'Directory Full!'^g); Halt; End;
- End;
- End;
-
- Procedure assignfile2;
- Begin
-
- Reset(filvar); { reset source & tell size }
- Writeln(fnm1,' has ',Filesize(filvar):3,' records of 128 bytes each.'^m^j);
- If Filesize(filvar)<2 Then Halt;
- While fnm2='' Do Begin
- Write('Basename for destination files : ');
- Readln(fnm2);
- chekfile(fnm2);
- End;
- Write('Use the "Auto-split" option? (Y or N) : ');
- Read(Kbd,yn); yn:=Upcase(yn);Writeln(yn);
- If cflag Then Begin { reset option if ":" in name }
- Write('System reset for each new file? (Y or N): ');
- Read(Kbd,yn2);Writeln(Upcase(yn2));
- flag := (Upcase(yn2) = 'Y');
- End;
- yn2:=' ';
- If yn='Y' Then While Not (yn2 In ['R','F','L']) Do Begin
- Write('Split by (R)ecords, (F)iles, or (L)ines : ');
- Read(Kbd,yn2);
- yn2:=Upcase(yn2);
- Writeln(yn2);
- End;
- i:=0;
- Case yn2 Of { auto-split "case" routine }
- 'F' : Begin
- Write('Number of files to split source into : ');
- Readln(i); If i=0 Then Halt;
- If i>Filesize(filvar) Then i:=Filesize(filvar);
- s:=Filesize(filvar) Div i
- End;
- 'R' : Begin
- Write('Number of records per destination file : ');
- Readln(i); If i=0 Then Halt;
- If i>Filesize(filvar) Then i:=Filesize(filvar);
- s:=i;
- End;
- 'L' : Begin
- exten := 0.001;
- linesperfile:=0;
- Assign(oldtxfil,fnm1);
- Reset(oldtxfil);
- Write('Number of lines per destination file : ');
- Readln(linesperfile);If linesperfile < 1 Then Halt;
- Str(exten:0:3,extenstr);
- extenstr:=Copy(extenstr,2,4);
- fnm2:= basename + extenstr;
- Assign(newtxfil, fnm2);
- {I-} Rewrite(newtxfil); {I+} { open/overwrite output file }
- ioerr;
- Writeln(^m^j'Creating ',fnm2);
- End;
- End; {case}
- End; {assignfile2}
-
- Procedure splitbinfil;
- Begin
- exten:= 0;
- ltr := 0;
- endrec:=0;
- While Not Eof(filvar) Do Begin
- sysreset;
- If (yn<>'Y') Then Begin
- Write(^m^j'Output file extension number? (1 to 999): ');
- if ltr<>0 then ltr:=ltr+1;
- Readln(ltr);
- if ltr=0 then halt;
- exten:=(ltr-1)*0.001;
- Write('Begin at which source record? (0 to ',filesize(filvar):3,
- '): ');
- if endrec<>0 then endrec:=endrec+1;
- Readln(endrec); { start of block }
- seek(filvar,endrec);
- Write('Copy thru which record? (0=abort/CR=EOF): ');
- Readln(endrec); { end of block }
- if endrec=0 then halt;
- End Else endrec:=endrec+s;
- If (Trunc(exten*1000+0.5)>=(i-1)) And (yn2='F') Then endrec := 0;
- If endrec>Filesize(filvar) Then endrec:=Filesize(filvar);{set end of }
- If endrec<=Filepos(filvar) Then endrec:=Filesize(filvar);{split block}
- exten:=exten+0.001; { index extension }
- Str(exten:0:3,extenstr); { change to string }
- extenstr:=Copy(extenstr,2,4); { drop leading zero}
- fnm2:=basename+extenstr; { add to basename }
- Writeln(^m^j'Creating file ',fnm2);
- Assign(filvar2,fnm2);
- {$I-} Rewrite(filvar2); {$I+}
- ioerr; { check for disk full }
- While (Not Eof(filvar)) And (endrec > Filepos(filvar)) Do Begin
- z:=endrec-Filepos(filvar); { calc # of blocks left }
- If (z < buffrecs) And (z>0) Then Begin
- Write(^m'Copying Records: ',filepos(filvar),'-',filepos(filvar)+z);
- Blockread(filvar,bigbuff,z); { write all remaining records }
- { if less than buffrecs left }
- {$I-} Blockwrite(filvar2,bigbuff,z); {$I+}
- ioerr; { check disk }
- End Else { write buffrecs records if }
- Begin { more than buffrecs remain }
- Write(^m'Copying Records: ',filepos(filvar),
- '-',Filepos(filvar)+buffrecs);
- Blockread(filvar,bigbuff,buffrecs);
- {$I-} Blockwrite(filvar2,bigbuff,buffrecs); {$I+}
- ioerr; { check disk }
- End;
- End;
- Close(filvar2);
- Writeln;
- End;
- Close(filvar2);
- Close(filvar);
-
- End; {splitbinfil}
-
- Procedure splittxtfile; { From identical procedure in CHOP18.PAS }
- Var
- count,totallines : Integer;
- thisline : String[255];
- Begin
- totallines:=0;
- While Not Eof(oldtxfil) Do
- Begin
- For count:= 1 To linesperfile Do Begin
- Readln(oldtxfil, thisline);
- {I-} Writeln(newtxfil, thisline); {I+}
- ioerr;
- totallines := totallines + 1;
- Write(totallines,' lines'^m);
- If Eof(oldtxfil) Then Begin
- Close(newtxfil);
- Writeln;Writeln;
- Writeln(^g,totallines,' total lines processed!');
- Halt;
- End;
- End;
- If Not Eof(oldtxfil) Then Begin
- Close(newtxfil); { see comments in binary }
- exten:= exten + 0.001; { file routine above }
- Str(exten:0:3, extenstr);
- extenstr:=Copy(extenstr,2,4);
- fnm2:= basename + extenstr;
- Writeln; sysreset;
- Assign(newtxfil, fnm2);
- {I-} Rewrite(newtxfil); {I+}
- ioerr;
- Writeln(^m^j'Creating ',fnm2);
- End; {if not eof}
- End;
- Close(newtxfil);
- End;
-
- Begin
- parse; { parse command tail for source name}
- header; { program, version, and buffer size }
- cflag:=False; { initially set no ":" in filename }
- assignfile; { assign and verify source filename }
- assignfile2; { create & write split output files }
- If yn2='L' Then splittxtfile { text files by lines per new file }
- Else splitbinfil; { any file by records per new file }
- Writeln('Done.');
- End.