home *** CD-ROM | disk | FTP | other *** search
- {
-
- This is the fastest I could come up with ; I suspect it's fairly
- faster than the one that was posted earlier. Going still faster
- would require some change in the algorithm, which I'm much to
- lazy to go through <g>.
-
- Beware, this program does not check before overwritting an existing
- .uue file. Generally speaking, the error checking is quite light.
- }
-
- {$r-,s-,q-} { for the sake of speed only }
-
- Uses DOS ;
-
- Const
- LongueurLigne = 60 ; { max length of output line }
- Masque6bits = $3f ; { mask for six lower bits }
- BufSize = 2048 ; { size of input buffer }
- Espace = 32 ;
-
- Var InBuf : Array[0..BufSize] Of Byte ; { [0] is unused but necessary }
- InPtr : Word ; { pointer in input buffer }
- InQty : Word ; { # of bytes available in input buffer }
- InFile : File ; { input file }
- OutSt : String ; { output string }
- OutFile : Text ; { output file }
- SrcBytes : Byte ; { number of source bytes in current line }
-
- Procedure RefillBuffer ;
- { Refills the buffer from the input file ; properly sets InQty and InPtr }
- Begin
- BlockRead(InFile, InBuf[1], BufSize, InQty) ;
- InPtr:=0 ;
- End ;
-
- Function GetByte : Byte ; Assembler ;
- { Fetches a byte from the input file (i.e. input buffer) }
- { Only AL and SI are modified by this function }
- Asm
- Mov SI, InPtr
- Cmp SI, InQty
- JL @1
- PushA
- Call ReFillBuffer
- PopA
- @1:
- Inc InPtr
- Mov SI, InPtr
- Cmp SI, InQty
- JLE @2
- XOr AL, AL
- Jmp @3
- @2:
- Mov AL, [SI+Offset InBuf]
- Inc SrcBytes
- @3:
- End ;
-
- Procedure FlushOutSt ;
- { Flushes the current line to the output file }
- Begin
- OutSt[1]:=Chr(Espace+SrcBytes) ;
- WriteLn(OutFile, OutSt) ;
- OutSt:=' ' ;
- SrcBytes:=0 ;
- Write('.') ;
- End ;
-
- Procedure PutByte ; Assembler ;
- { Sends a byte to the output file (i.e. the output buffer) }
- { modifies only AL and SI ; parameter in AL }
- Asm
- Add AL, Espace
- Cmp AL, Espace
- JNE @1
- Mov AL, '`'
- @1:
- Inc Byte Ptr OutSt { increments string length }
- Mov BL, Byte Ptr OutSt
- XOr BH, BH { BX <- Length(OutSt) }
- Mov Byte Ptr OutSt[BX], AL
- Cmp BX, LongueurLigne
- JNG @2
- PushA
- Call FlushOutSt
- PopA
- @2:
- End ;
-
- Procedure EncodeFile ;
- { Converts a binary file to a .uue file }
- Var a, b, c : Byte ; { three-bytes buffer }
- Begin
- Repeat
- Asm
- { remember, GetByte and PutByte modify only AL and SI }
-
- Call GetByte
- Mov DH, AL { first byte in DH }
- Call GetByte
- Mov DL, AL { second byte in DL }
- Call GetByte
- Mov CH, AL { third byte in CH }
-
- Mov AL, DH
- ShR AL, 2
- Call PutByte
-
- Mov AX, DX
- ShR AX, 4
- And AL, Masque6bits
- Call PutByte
-
- Mov AH, DL
- Mov AL, CH
- ShR AX, 6
- And AL, Masque6bits
- Call PutByte
-
- Mov AL, CH
- And AL, Masque6bits
- Call PutByte
- End ;
- Until (EOF(InFile) And (InPtr>=InQty)) ;
- End ;
-
- Procedure Initialise ;
- { Initializes the stuff }
- Var Rep : DirStr ;
- Nom : NameStr ;
- Ext : ExtStr ;
- Begin
- InPtr:=0 ;
- InQty:=0 ;
- Assign(InFile, ParamStr(1)) ;
- ReSet(InFile, 1) ;
- FSplit(ParamStr(1), Rep, Nom, Ext) ;
- Assign(OutFile, Rep+Nom+'.UUE') ;
- ReWrite(OutFile) ;
- OutSt:=' ' ;
- SrcBytes:=0 ;
- WriteLn(OutFile, 'begin 644 ', Nom, Ext) ;
- End ;
-
- Procedure Termine ;
- { Terminate the job }
- Begin
- If Length(OutSt)>1 Then
- Begin
- OutSt[1]:=Chr(Espace+SrcBytes) ;
- WriteLn(OutFile, OutSt) ;
- End ;
- Writeln(OutFile, '`') ; { write an "empty" line }
- WriteLn(OutFile, 'end') ;
-
- Close(OutFile) ;
- Close(InFile) ;
- End ;
-
- Begin
- If ParamCount<>1 Then
- Begin
- WriteLn('UUE2 <source_file_name>') ;
- Halt(1) ;
- End ;
- Initialise ;
- EncodeFile ;
- Termine ;
- End.