home *** CD-ROM | disk | FTP | other *** search
/ kermit.columbia.edu / kermit.columbia.edu.tar / kermit.columbia.edu / ucsdmagiscan2 / fileunit.text < prev    next >
Text File  |  2011-08-11  |  8KB  |  399 lines

  1.  
  2. (*$S+*)
  3. { This unit contains the primitives necessary to store
  4.   the incoming data on the disk specified }
  5.  
  6. Unit FileHandle;
  7.  
  8. Interface
  9.  
  10.    Uses
  11.      M2Types,M2IpRoot,M2Sys,
  12.      (*$U Disk.Code*)DiskUnit;
  13.  
  14.  
  15.    const
  16.      BufEnd = 512;
  17.  
  18.    type
  19.      BuffType = packed array[1..BufEnd] of char;
  20.      FStates  = (TxtFile,BinFile,ImgFile,CodeFile); { File States }
  21.  
  22.    var
  23.      FileBuf    : BuffType;
  24.      BuffPosn   : integer;
  25.      Disk       : String[3];
  26.      TF         : Text;
  27.      F          : File;
  28.      TranState  : FStates;
  29.      EOI        : boolean; { End of Image ! }
  30.  
  31.  
  32.  
  33.    procedure FileInit;
  34.  
  35.    procedure CloseF(var Name   : string;
  36.                         Save   : boolean );
  37.  
  38.    function ReadOpenF(var Name     : string ;
  39.                           State    : FStates ): boolean;
  40.  
  41.    function WriteOpenF(var Name     : string ;
  42.                            State    : FStates ): boolean;
  43.  
  44.    procedure SaveBuff(var Buff : BuffType;
  45.                       var Posn : integer;
  46.                        NewLine : boolean  );
  47.  
  48.    procedure ReadBuff(var Buff : BuffType;
  49.                       var Posn : integer );
  50.  
  51.    procedure LoadIm(var Name : string );
  52.  
  53.  
  54.  
  55. Implementation
  56.  
  57. var
  58.   Im,TxtIm       : Image;
  59.   Tab            : IOTab;
  60.   Line           : PointSet;
  61.   YPosn          : integer;
  62.  
  63. (* ---------------------------------------------------- *)
  64.  
  65. procedure GetLine(var Line   : PointSet;
  66.                       Im     : Image;
  67.                   var Buff   : BuffType );
  68.  
  69. type
  70.   IdynArray = array[1..1]of Integer;
  71.  
  72. var
  73.   Mrk     : ^integer;
  74.   Idyn    : ^IdynArray;
  75.   i       : integer;
  76.  
  77. begin
  78. mark(Mrk);
  79. New(Idyn);
  80. ImSmp(Line,Im,Idyn^[0],i);
  81. for i := 0 to 511 do
  82.   Buff[i+1] := chr(Idyn^[i]);
  83. Release(Mrk)
  84. end{GetLine};
  85.  
  86. (* ---------------------------------------------------- *)
  87.  
  88. procedure PutLine(var Line   : PointSet;
  89.                       Im     : image;
  90.                   var Buff   : BuffType );
  91.  
  92. type
  93.   IdynArray = array[1..1]of Integer;
  94.  
  95. var
  96.   Mrk     : ^integer;
  97.   Idyn    : ^IdynArray;
  98.   i       : integer;
  99.  
  100. begin
  101. mark(Mrk);
  102. New(Idyn);
  103. for i := 1 to BufEnd do
  104.   Idyn^[i-1] := ord(Buff[i]);
  105. DrawFn(Line,Im,Idyn^[0]);
  106. Release(Mrk)
  107. end{PutLine};
  108.  
  109. (* ---------------------------------------------------- *)
  110.  
  111. procedure InitF;
  112.  
  113. begin
  114. SysInit;
  115. DefImage(Im,0,512,Full,8,8);
  116. DefImage(TxtIm,0,512,Full,0,1);
  117. DefWindow(Line,0,512,512,1);
  118. LinearIO(Tab,0,255);
  119. Live(Im,Tab,Tab);
  120. Photo;
  121. Display(Im,Tab);
  122. ClearIm(Im);
  123. OvLay(TxtIm,XSat+Yellow);
  124. YPosn := 511;
  125. EOI := TranState <> ImgFile
  126. end{InitF};
  127.  
  128. (* ---------------------------------------------------- *)
  129.  
  130. procedure LoadIm;
  131.  
  132. var
  133.   Ok   : boolean;
  134.  
  135. begin
  136. if TranState = ImgFile then
  137.   begin
  138.   InitF;
  139.   (*$I-*)
  140.   Reset(F,concat(disk,name));
  141.   Ok := ioresult = 0;
  142.   (*$I+*)
  143.   write(chr(ff));
  144.   if Ok then
  145.     begin
  146.     writeln('LOADING THE IMAGE');
  147.     ImLd(Im,concat(disk,name))
  148.     end
  149.    else
  150.      begin
  151.      writeln('FILE DOES NOT EXIST');
  152.      CursorOn;
  153.      ScrollOn
  154.      end
  155.   end
  156.  else
  157.    writeln('Transfer type is not IMAGE')
  158. end{LoadIm};
  159.  
  160. (* ---------------------------------------------------- *)
  161.  
  162. procedure EmptyBuff(var FileBuffer : BuffType;
  163.                     var Posn       : integer );
  164.  This procedure Empties the buffer 
  165.  
  166. var
  167.   i   : integer;
  168.  
  169. begin
  170. for i := 1 to BufEnd do
  171.   FileBuffer[i] := chr(0); { set all to nulls }
  172. Posn := 1 { set the position at the begining }
  173. end{EmptyBuff};
  174.  
  175. (* ---------------------------------------------------- *)
  176.  
  177. procedure FileInit;
  178. { This procedure initialises the unit,
  179.   the disk is set up in the main program }
  180.  
  181. begin
  182. EmptyBuff(FileBuf,BuffPosn);
  183. TranState := TxtFile;
  184. EOI := TranState <> ImgFile
  185. end{fInit};
  186.  
  187. (* ---------------------------------------------------- *)
  188.  
  189. procedure CloseF;
  190.  This procedure closes the file, neatly. 
  191.  
  192. var
  193.   Blk,i  : integer;
  194.   s      : string;
  195.   Key    : char;
  196.  
  197. begin
  198. if Save then
  199.   begin { we wish to save the file }
  200.   case TranState of
  201.     TxtFile          : begin
  202.                        s := copy('',0,0);
  203.                        if (BuffPosn <= BufEnd) and (BuffPosn > 1) then
  204.                          begin
  205.                          for i := 1 to pred(BuffPosn) do
  206.                           begin
  207.                           s := concat(s,' ');
  208.                           s[Length(s)] := FileBuf[i]
  209.                           end;
  210.                          write(TF,s);
  211.                          end;
  212.                        Close(TF,Lock)
  213.                        end;
  214.     ImgFile          : begin
  215.                        if (BuffPosn > 1) and (YPosn >= 0) then
  216.                          begin
  217.                          Line.Origin.Y := YPosn;
  218.                          PutLine(Line,Im,FileBuf)
  219.                          end;
  220.                        EOI := True;
  221.                        write('DO YOU WISH TO SAVE THE IMAGE ? ');
  222.                        repeat
  223.                          read(KeyBoard,Key)
  224.                        until Key in ['Y','y','N','n'];
  225.                        if Key in ['Y','y'] then
  226.                          ImSve(Im,concat(disk,name))
  227.                        end;
  228.     CodeFile,BinFile : begin
  229.                        if BuffPosn > 1 then
  230.                          Blk := BlockWrite(F,FileBuf,1);
  231.                        Close(F,Lock);
  232.                        end
  233.     end{case};
  234.   EmptyBuff(FileBuf,BuffPosn)
  235.   end
  236.  else
  237.    begin { This makes sure the file will be closed }
  238.    close(TF);
  239.    close(F)
  240.    end;
  241. CursorOn;
  242. ScrollON
  243. end{CloseF};
  244.  
  245. (* ---------------------------------------------------- *)
  246.  
  247. function ReadOpenF;
  248.  This procedure opens the file for reading 
  249.  
  250. var
  251.   OK  : boolean;
  252.   Blk : integer;
  253.  
  254. begin
  255. EmptyBuff(FileBuf,BuffPosn);
  256. EOI := TranState <> ImgFile;
  257. if TranState <> ImgFile then
  258.   begin
  259.   (*$I-*)
  260.   reset(F,concat(disk,name));
  261.   OK := ioresult = 0;
  262.   (*$I+*)
  263.   if (State = TxtFile) then
  264.     begin
  265.     Blk := BlockRead(F,FileBuf,1);
  266.     Blk := BlockRead(F,FileBuf,1)
  267.     end
  268.   end
  269.  else
  270.    begin{ this is an image file }
  271.    OK := True;
  272.    end;
  273. ReadOpenF := OK
  274. end{OpenF};
  275.  
  276. (* ---------------------------------------------------- *)
  277.  
  278. function WriteOpenF;
  279.  This procedure opens the file for writing 
  280.  
  281. var
  282.   OK  : boolean;
  283.   Blk : integer;
  284.  
  285. begin
  286. EmptyBuff(FileBuf,BuffPosn);
  287. (*$I-*)
  288. if TranState <> TxtFile then
  289.   begin
  290.   if TranState = ImgFile then
  291.     begin
  292.     write(chr(ff));
  293.     InitF;
  294.     ClearIm(Im);
  295.     OK := True
  296.     end
  297.    else
  298.      begin
  299.      rewrite(F,concat(disk,name));
  300.      OK := ioresult = 0
  301.      end
  302.   end
  303.  else
  304.    begin
  305.    ReWrite(TF,concat(disk,name));
  306.    OK := ioresult = 0
  307.    end;
  308. (*$I+*)
  309. WriteOpenF := OK
  310. end{OpenF};
  311.  
  312. (* ---------------------------------------------------- *)
  313.  
  314. procedure SaveBuff;
  315.  This procedure empties the buffer into the current file 
  316.  
  317. var
  318.   Blk,i : integer;
  319.   s     : string;
  320.  
  321. begin
  322.  If it is a text file then 
  323. if TranState = TxtFile then
  324.   begin{ Insert a string ! }
  325.   s := copy('',0,0);
  326.   for i := 1 to pred(Posn) do
  327.     begin
  328.     s := concat(s,' ');
  329.     s[Length(s)] := Buff[i]
  330.     end;
  331.   if NewLine then
  332.     begin
  333.     if Length(s) = 0 then
  334.       writeln(TF)
  335.      else
  336.        writeln(TF,s)
  337.     end
  338.    else
  339.      write(TF,s);
  340.   EmptyBuff(Buff,Posn)
  341.   end
  342.  else{ insert the buffer as it is when full }
  343.    if Posn > BufEnd then
  344.      begin
  345.      if TranState = ImgFile then
  346.        begin
  347.        if YPosn >= 0 then
  348.          begin
  349.          Line.Origin.Y := YPosn;
  350.          PutLine(Line,Im,Buff);
  351.          YPosn := YPosn -1
  352.          end
  353.         else
  354.           EOI := True;
  355.        EmptyBuff(Buff,Posn)
  356.        end
  357.       else
  358.         begin
  359.         Blk := BlockWrite(F,Buff,1);
  360.         EmptyBuff(Buff,Posn)
  361.         end
  362.      end
  363. end{SaveBuff};
  364.  
  365. (* ---------------------------------------------------- *)
  366.  
  367. procedure ReadBuff;
  368. { This procedure fills the buffer from the file when
  369.   necessary }
  370.  
  371. var
  372.   Blk    : integer;
  373.  
  374. begin
  375. if ((Posn <= 1) or (Posn > BufEnd)) and (not EOF(F)) and (TranState <> ImgFile) then
  376.   begin
  377.   Blk := BlockRead(F,Buff,1);
  378.   Posn := 1
  379.   end
  380.  else
  381.    if ((Posn <=1) or (Posn > BufEnd)) and (TranState = ImgFile) then
  382.      begin
  383.      if YPosn >= 0 then
  384.        begin
  385.        Posn := 1;
  386.        Line.Origin.Y := YPosn;
  387.        GetLine(Line,Im,Buff);
  388.        YPosn := YPosn - 1
  389.        end
  390.       else
  391.         EOI := True;
  392.      end
  393. end{ReadBuff};
  394.  
  395. (* ---------------------------------------------------- *)
  396.  
  397. end{FileHandle}.
  398.  
  399.