home *** CD-ROM | disk | FTP | other *** search
/ CP/M / CPM_CDROM.iso / cpm / utils / filutl / decuf13.ark / DECUF.PAS < prev    next >
Encoding:
Pascal/Delphi Source File  |  1989-09-27  |  6.8 KB  |  170 lines

  1. program DECode_Uuencoded_File ;
  2. {$A+}  { Generate NON-recursive code (shorter and faster) }
  3. {$C+}  { Do check for ^C and ^S during console output     }
  4. {$R-}  { Check all subrange variables to be within range  }
  5. {$U-}  { Do NOT check for ^C continuously                 }
  6. {$W2}  { Allow up to 2 simultanous active WITH statements }
  7. {* ====================================================================
  8.  *
  9.  * DecUF - Decode 'uuencoded' files.  The input file may contain one
  10.  *         or more 'uuencoded' files.
  11.  *
  12.  * Version 1.0 , 199101: Original coding
  13.  *  Wim J.M. Nelis      (Nelis@NLR.NL)
  14.  *  Rozenhof 4
  15.  *  8316 CX  Marknesse
  16.  *  the Netherlands
  17.  * Version 1.1 , 199105: Include extended file name unit.
  18.  * Version 1.2 , 199106: Minor modifications in comment. This version
  19.  *                       is included in the SimTel20 archives.
  20.  * Version 1.3 , 199209: Introduce third kind of encoded files, namely
  21.  *                       those with a checksum at the end of each line.
  22.  *}
  23. const
  24.    CurrentDrive     =     0  ;  { Indication for current drive in DOS calls }
  25.    DefaultExtension = '.UUE' ;  { Default extension of input file name }
  26.    MaxChunkSize     =   512  ;  { Max size of one chunk of converted data }
  27.  
  28. type
  29.    KeyWordString = string[16] ;  { A keyword, possibly a file name }
  30.    Message       = string[50] ;  { (Error) message }
  31.  
  32.    ChunkPtr   = ^Chunks ;
  33.    ChunkSizes = 0..MaxChunkSize ;
  34.    Chunks   = record
  35.                 NextChunk :   ChunkPtr ;  { Pointer to next chunk }
  36.                 ChunkSize : ChunkSizes ;  { Size of this chunk }
  37.                 Data : array[1..MaxChunkSize] of Byte ;
  38.               end ;
  39.  
  40.    DecodingStates   = ( Sextet0,   { Decode 4 sextets into 3 octets }
  41.                         Sextet1,
  42.                         Sextet2,
  43.                         Sextet3 ) ;
  44.  
  45.    LineFormats      = ( Unknown,   { Format is not known yet }
  46.                         Basic  ,   { Basic format, length + encoded data }
  47.                         Extended , { Either Trmntr or ChckSm }
  48.                         Trmntr ,   { Terminator at end of line }
  49.                         ChckSm ) ; { Checksum at end of line }
  50.  
  51.    ProcessingStates = ( Look_For_Start,   { Look for either TABLE or BEGIN }
  52.                         Reading_Table ,   { Read the conversion table }
  53.                         Reading_Begin ,   { Proces BEGIN statement }
  54.                         Reading_Data  ,   { Convert the next data line }
  55.                         Completed     ) ; { END encountered }
  56.  
  57.    ErrorTypes = ( Catastrophic,   { Error is fatal to program execution }
  58.                   Fatal       ,   { Error is fatal to file conversion }
  59.                   Warning     ,   { Error can optionally be ignored }
  60.                   Informative ) ; { Error is result of other error }
  61.  
  62.    LineErrors = ( IllegalCharacter,   { Control character skipped }
  63.                   Overflow        ,   { Line buffer too short }
  64.                   IllegalFormat   ,   { Length field cannot be decoded }
  65.                   WrongLength     ,   { Line length mismatch }
  66.                   WrongTerminator ) ; { Terminator is not 'M' }
  67.  
  68. {$IEXTFN.UNT}
  69.  
  70. var
  71. {* --- Input/Output files --- *}
  72.    InputFile       :            Text ;  { Input file }
  73.    InputFileName   :   FullFileNames ;  { Input file Name }
  74.    InputFileDesc   : FileDescriptors ;  { Input file name, internal format }
  75.    OutputFile      :            File ;  { Result file, may be any type }
  76.    OutputFilePath  :   FullFileNames ;  { Path to directory to receive result file }
  77.    OutputFileName  :   FullFileNames ;  { Full name of result file }
  78.    OutputFileDesc  : FileDescriptors ;  { Outputfile name, internal format }
  79.    OutputFileOpen  :         Boolean ;  { OutputFile is opened }
  80.  
  81. {* --- Option flags --- *}
  82.    OnlyOneFile     : Boolean ;  { Input file contains one encoded file }
  83.    StrictChecking  : Boolean ;  { Check every line in encoded file }
  84.    VerboseMode     : Boolean ;  { Give a progres report }
  85.  
  86.    DecodeTable     : array[' '..#255] of Byte ;  { Decoding table }
  87.    DecodeState     : DecodingStates ;
  88.  
  89.    HeadChunkList   : ChunkPtr ;  { Head of the list of chunks }
  90.    TailChunkList   : ChunkPtr ;  { Tail of the list of chunks }
  91.  
  92.    ProcessingState :  ProcessingStates ;  { Current state }
  93.    NextLine        :        string[80] ;  { Current line }
  94.    LineIndex       :             1..80 ;  { Index in NextLine }
  95.    LineFormat      :       LineFormats ;  { Format of encoded lines }
  96.    CheckSum        :           Integer ;  { Checksum of current line }
  97.    Terminator      :              Char ;  { Terminator of current line }
  98.    ErrorsInLine    : set of LineErrors ;  { Errors detected in current line }
  99.  
  100. {* --- Statistics per result file --- *}
  101.    BytesWritten      : Integer ;  { Number of bytes written }
  102.    CharactersRead    : Integer ;  { Number of characters read }
  103.    CharactersSkipped : Integer ;  { Number of characters skipped }
  104.    HeapFlushes       : Integer ;  { Number of times the heap is flushed }
  105.    LinesRead         : Integer ;  { Number of lines read }
  106.    LinesSkipped      : Integer ;  { Number of lines NOT decoded }
  107.    LinesWritten      : Integer ;  { Number of lines written }
  108.  
  109.  
  110. {*
  111.  * The functions Dec and Inc are included to obtain a little bit of
  112.  * compatibility with TP 5.0 and higher.
  113.  *}
  114.  
  115. procedure Dec( var SomeValue : Integer ) ;
  116. begin
  117.    SomeValue:= Pred( SomeValue ) ;
  118. end ;  { of Dec }
  119.  
  120. procedure Inc( var SomeValue : Integer ) ;
  121. begin
  122.    SomeValue:= Succ( SomeValue ) ;
  123. end ;  { of Inc }
  124.  
  125. {$IDECUF.IF0}
  126. {$IDECUF.IF1}
  127. {$IDECUF.IF2}
  128.  
  129. {*
  130.  * Start of main program.
  131.  *}
  132. var
  133.    Done : Boolean ;  { Conversion of file completed }
  134. begin
  135.    InitFileNameUnit ;
  136.    ProgramPrologue ;
  137.  
  138.    OpenInputFile ;
  139.    ProcessingState:= Look_For_Start ;
  140.    Done           :=          False ;
  141.    while not (Eof(InputFile) or Done) do
  142.     begin
  143.      ReadNextLine ;
  144.      case ProcessingState of
  145.        Look_For_Start : CheckForStart ;
  146.        Reading_Table  : ReadConversionTable ;
  147.        Reading_Begin  : ProcesBegin ;
  148.        Reading_Data   : ProcesData ;
  149.        Completed      : if OnlyOneFile then
  150.                           Done:= True
  151.                         else
  152.                           CheckForStart ;
  153.      else
  154.        Panic( Fatal, 'Unexpected processing state' ) ;
  155.      end ;  { of case }
  156.     end ; { of while }
  157.  
  158.    case ProcessingState of
  159.       Look_For_Start  : Panic( Informative,
  160.                         'No valid encoded data found on '+InputFileName ) ;
  161.       Reading_Table   ,
  162.       Reading_Begin   ,
  163.       Reading_Data    : Panic( Informative,
  164.                         'Unexpected end-of-file found on'+InputFileName ) ;
  165.    end ;  { of cases }
  166.  
  167.    ProgramEpilogue ;
  168.    UnInitFileNameUnit ;
  169. end.
  170.