External btree::disc(2);

PROCEDURE Store;
{ stores contents of tree onto disc }
VAR
  fileroot,
  filename: filestring;
  dummy_end: persondetails;
	{a dummy end of file record is needed because EOF function
	does not work correctly in Pascal/Z.  See page 54}
  slug: shorty;
  i: integer;
  test: boolean;

BEGIN
  { get file name 
  }
  write ('Name of output file - ');
  readln (filename);
  reset(filename,fin);
  if not eof(fin)	{false if file does not exist}
    then begin
         i := 1;
         setlength(fileroot, 0);
         while filename[i] <> '.' do	{strip CPM file type}
           begin
           append( fileroot, filename[i]);
           { filename[i] works ok to READ characters of a string,
           but fileroot[i] will not WRITE characters into the string.
           One of the sneaky differences between strings and arrays
           of characters.}
           i := i + 1;
           end;	{while}
    append(fileroot, '.BAK');
    test := rename (filename, fileroot);
    writeln('Existing ', filename, ' renamed ', fileroot,'.');
    writeln('New ',filename, ' being opened.');
    end;	{then}
  rewrite (filename, fout);
  disc := true;
	{raise flag for use in DISPLAY procedure}
  Preorder ( employee );
  {Preorder is used rather than Inorder so that the tree is stored
  in other than a sorted fashion.  When putting the leaves back
  onto the tree (in FETCH below), inserting them in a sorted order
  will result in a lopsided tree - one pointer in each record will
  always be NIL.  In other words a linked list rather than a full
  b - tree will result.  The program will work, but the speed of
  a balanced tree will be lost.
  }
  slug := '****************************************';
  with dummy_end do
  {for reasons I have been unable to divine, leaving 'city'
  undefined gets a "string too long" fatal error.  Filling
  all fields of the record makes the error go away.  If you
  know why, please tell me.    Buddenberg
  }
    begin
    name := slug;
    company := 'end of file marker';
    address := slug;
    city := slug;
    state := slug;
    zip := slug;
    salary := slug;
    end;	{with}
  write (fout, dummy_end);
END;	{Store}

{$T-}
PROCEDURE Fetch;
{ reads data from disc and causes it to be placed onto tree }
VAR
  filename: string 14;
  fileend: boolean;
  rec: persondetails;
BEGIN
  write ('Name of file where the data is - ');
  readln (filename);
  reset (filename, fin);
  fileend := false;
  while not fileend do
    BEGIN
      read (fin, rec );
    if rec.name = '****************************************'
        then fileend := true;
    if not fileend then
    with rec do
      begin
      key := name;
      new_salary := salary;
      new_company := company;
      new_address := address;
      new_city := city;
      new_state := state;
      new_zip := zip
      end;	{with}
    insert (Employee, key);
  end;	{while}
END;	{fetch}
 .

