home *** CD-ROM | disk | FTP | other *** search
/ CP/M / CPM_CDROM.iso / beehive / bbs / picsuncr.arc / PICS2C1.UNC < prev    next >
Text File  |  1991-08-11  |  8KB  |  253 lines

  1. {PICS2C1.unc   Pascal Integrated Communications System}
  2. { 5/25/87 vers. 1.6 Copywright 1987 by Les Archambault}
  3.  
  4. { 01mar88 wb - Made Buffer, XfrName & XfrFile global variables and
  5.   modified SendFile procedure to chain to PICSUNCR.CHN for uncrunch
  6.   support. Renamed from PICS2c1.inc to PICS2c1.unc }
  7.  
  8. overlay procedure SendText;
  9.   var
  10.     this: FilePtr;
  11.  
  12.   procedure SendFile(var XfrFile: untype_file; remaining: integer);
  13.   { Send a squeezed, crunched or ASCII file }
  14.     const
  15.       recognize = $FF76;
  16.       DLE       = $90;
  17.     var
  18.       EndOfFile, squeezed,crunched,page: boolean;
  19.       i, x, BufferPtr, bpos, curin, repct, lastc, NoOfRecs, line_count: integer;
  20.       FileType: String[3];
  21.       ErrMsg: StrPr;
  22.       dnode: array [0..255, 0..1] of integer;
  23.  
  24.     function getc: integer;
  25.     { Get an 8 bit value from the input buffer - read block if necessary }
  26.       begin
  27.         if BufferPtr > BufSize
  28.           then
  29.             begin
  30.               NoOfRecs := min(BufBlocks, remaining);
  31.               EndOfFile := (NoOfRecs = 0);
  32.               if not EndOfFile
  33.                 then
  34.                   begin
  35.                     {$I-} BlockRead(XfrFile, Buffer, NoOfRecs) {$I+};
  36.                     EndOfFile := (IOresult <> 0)
  37.                   end;
  38.               remaining := remaining - NoOfRecs;
  39.               BufferPtr := 1
  40.             end;
  41.         getc := Buffer[BufferPtr];
  42.         BufferPtr := succ(BufferPtr)
  43.       end;
  44.  
  45.     function getw: integer;
  46.     { Get a 16 bit value from the input buffer }
  47.       begin
  48.         getw := getc + Swap(getc)
  49.       end;
  50.  
  51.     procedure BuildTree;
  52.     { Build decode tree }
  53.       var
  54.         i, CheckSum, numnodes: integer;
  55.       begin
  56.         ErrMsg := '';
  57.         if recognize = getw                 { Is it really a squeezed file? }
  58.           then
  59.             begin
  60.               CheckSum := getw;             { Get checksum }
  61.               XfrName := '';
  62.               i := getc;                    { Build original file name }
  63.               while i <> 0 do
  64.                 begin
  65.                   XfrName := XfrName + UpCase(chr(i));
  66.                   i := getc
  67.                 end;
  68.               numnodes := getw;             { Get the number of nodes in tree }
  69.               if (0 < numnodes) and (numnodes <= 256)
  70.                 then for i := 0 to pred(numnodes) do
  71.                   begin
  72.                     dnode[i, 0] := getw;
  73.                     dnode[i, 1] := getw;
  74.                   end
  75.                 else
  76.                   begin
  77.                     ErrMsg := 'Invalid decode tree size.';
  78.                     squeezed := FALSE
  79.                   end
  80.             end
  81.           else squeezed := FALSE
  82.       end;
  83.  
  84.     function gethuff: integer;
  85.     { Get character coding }
  86.       var
  87.         i: integer;
  88.       begin
  89.         i := 0;
  90.         repeat
  91.           bpos := succ(bpos);
  92.           if bpos > 7
  93.             then
  94.               begin
  95.                 curin := getc;
  96.                 bpos := 0
  97.               end
  98.             else curin := curin shr 1;
  99.           i := dnode[i, curin and $0001]
  100.         until i < 0;
  101.         i := -succ(i);
  102.         if i = 0
  103.           then gethuff := 26
  104.           else gethuff := i
  105.       end;
  106.  
  107.     function getcr: integer;
  108.       var
  109.         c: integer;
  110.       begin
  111.         if repct > 0
  112.           then
  113.             begin
  114.               repct := pred(repct);
  115.               getcr := lastc
  116.             end
  117.           else
  118.             begin
  119.               c := gethuff;
  120.               if c = DLE
  121.                 then
  122.                   begin
  123.                     repct := gethuff;
  124.                     if repct = 0
  125.                       then getcr := DLE
  126.                       else
  127.                         begin
  128.                           repct := repct - 2;
  129.                           getcr := lastc
  130.                         end
  131.                   end
  132.                 else
  133.                   begin
  134.                     getcr := c;
  135.                     lastc := c
  136.                   end
  137.             end
  138.       end;
  139.  
  140.     begin { SendFile }
  141.       i := pos('.', XfrName);
  142.       if i = 0
  143.         then FileType := ''
  144.         else FileType := copy(XfrName, succ(i), length(XfrName));
  145.       squeezed := ('Q' = FileType[2]);
  146.       crunched := ('Z' = FileType[2]);
  147.       repct := 0;
  148.       bpos := 8;
  149.       ErrMsg := '';
  150.       BufferPtr := MaxInt;                  { Force a read the first time }
  151.       EndOfFile := FALSE;
  152.       if remaining > 0
  153.         then
  154.           begin
  155.             line_count := 0;
  156.             if crunched then
  157.               begin
  158.                 { Save heap pointers }
  159.                 heap_ptr:=HeapPtr;
  160.                 heap_fre:=HeapFre;
  161.                 setsect(HomDrv,HomUsr);
  162.                 assign(chain_file,'PICSUNCR.CHN');
  163.                 chain(chain_file);
  164.               end;
  165.             if squeezed
  166.               then BuildTree;
  167.             i := pos('.', XfrName);
  168.             if 0 = i
  169.               then FileType := ''
  170.               else FileType := copy(XfrName, succ(i), length(XfrName));
  171.             if (FileType = 'COM') or (FileType = 'OBJ') or (FileType[2]='Z') or
  172.                (FileType = 'EXE') or (FileType = 'LBR') or (FileType='ARC')
  173.               then ErrMsg := 'Xmodem protocol required for ".' + FileType + '" files.';
  174.             if ErrMsg = ''
  175.               then
  176.                 begin
  177.                   page:=ask('Do you want page breaks');
  178.                   line_count := 0;
  179.                   if squeezed
  180.                     then
  181.                       begin
  182.                         writeln(USR, '      ---> ', XfrName);
  183.                         x := getcr
  184.                       end
  185.                     else x := getc;
  186.                   while (not brk) and (not EndOfFile) and (x <> 26) do
  187.                     begin
  188.                       write(USR, chr(x));
  189.                       if (user_rec.lines <> 99) and (chr(x) = LF) and (page)
  190.                         then
  191.                           begin
  192.                             line_count := succ(line_count);
  193.                             if line_count mod user_rec.lines = 0
  194.                               then pause
  195.                           end;
  196.                       if squeezed
  197.                         then x := getcr
  198.                         else x := getc
  199.                     end
  200.                 end
  201.           end
  202.         else ErrMsg := 'Missing or empty input file.';
  203.       if ErrMsg <> ''
  204.         then writeln(USR, ErrMsg)
  205.     end;
  206.  
  207.   begin { SendText }
  208.    if (not in_arc) then
  209.    begin
  210.     XfrName := correct_fn(prompt('File name', 12, 'ES'));
  211.     if XfrName <> ''
  212.       then
  213.         begin
  214.           if in_library
  215.             then this := LibBase
  216.             else this := DirBase;
  217.           while (this <> nil) and (XfrName <> compress_fn(this^.fname)) do
  218.             this := this^.next;
  219.           if this <> nil
  220.             then
  221.               begin
  222.                 setsect(homdrv,homusr);
  223.                 log(6, XfrName);
  224.                 SetSect(SetDrv, SetUsr);
  225.                 if in_library
  226.                   then
  227.                     begin
  228.                       {$I-} seek(libr_file, this^.index) {$I+};
  229.                       if IOresult = 0
  230.                         then SendFile(libr_file, this^.fsize)
  231.                     end
  232.                   else
  233.                     begin
  234.                       Assign(XfrFile, XfrName);
  235.                       Reset(XfrFile);
  236.                       SendFile(XfrFile, FileSize(XfrFile));
  237.                       Close(XfrFile)
  238.                     end;
  239.                 SetSect(HomDrv, HomUsr);
  240.                 log(7, '')
  241.               end
  242.             else writeln(USR, XfrName, ' not found.')
  243.         end
  244.    end  {not in arc}
  245.    else
  246.      begin
  247.        writeln(usr);
  248.        writeln(usr,'Unable to type Arc file members.');
  249.      end;
  250.   end;
  251.  
  252. {end of PICS2C1.unc }
  253.