HP 3000 Manuals

Ap A. HP Pascal/XL Program Examples [ Accessing Files Programmer's Guide ] MPE/iX 5.0 Documentation


Accessing Files Programmer's Guide

Appendix A  HP Pascal/XL Program Examples 

The HP Pascal/XL program examples in this appendix are provided to help
you better understand how to use MPE/iX file system intrinsics to perform
common file access tasks.

Here is a short description of the task handled by each of the program
examples in this appendix:

   *   Program Example A-1 illustrates how you can open three different
       files--an unlabeled magnetic tape file, $STDLIST, and a new disk
       file--and copy records sequentially from the tape file to the disk
       file, while concurrently writing the records to $STDLIST.

   *   Program Example A-2 illustrates how you can open a labeled
       magnetic tape file and a new disk file, print the user label to
       $STDLIST, then copy records sequentially from the tape file to the
       disk file.  Play close attention to how the program closes the new
       disk file as a permanent file, and how it allows the user to
       specify alternate file designators if the file name already
       exists.

   *   Program Example A-3 illustrates how you can use the sequential
       access method of reading records from an old disk file, then use
       the random access method of writing the records to a new labeled
       disk file.

   *   Program Example A-4 illustrates how you can read from a file using
       random access method of data access.  In addition, the program
       shows how you can use the FREADSEEK intrinsic to increase program
       performance by prefetching records, thus minimizing I/O wait-time.

   *   Program Example A-5 illustrates how you can allow a user to update
       records in a shared data file.  This program makes use of file
       locking intrinsics, FLOCK and FUNLOCK, to ensure exclusive access
       to the shared file during the update process.

Program example A-1 

This program illustrates how you can open three different files--an
unlabeled magnetic tape file, $STDLIST, and a new disk file--and copy
records sequentially from the tape file to the disk file while
concurrently writing the records to $STDLIST.

Program Algorithm 

The task specified above is accomplished by following the steps described
below.  Also indicated are the intrinsics used to accomplish file access
tasks and the name of the procedure where the task is accomplished:

   1.  Open (HPFOPEN) three files--an unlabeled magnetic tape
       file, and new disk file, and $STDLIST (see procedure
       open_unlabeled_tape_file and procedure open_file).

   2.  In a loop, sequentially read (FREAD) records from tape file, then
       write (FWRITE) them to both disk file and $STDLIST (see procedure
       copy_tapefile_to_disk_file).  Continue loop till tape file's EOF
       is reached.

   3.  Close (FCLOSE) the tape file and the disk file (see procedure
       close_file).

If a file system intrinsic returns an unsuccessful condition code,
procedure handle_file_error is called to print file information and then
abort the program.

Source code listing  

Example A-1.  Sequential Access 

     $standard_level 'hp3000'$
     $lines 100$
     $code_offsets on$
     $tables on$
     $list_code on$
     program open_close_example(input,output);

     {***********************************************************************}
     {                         DECLARATION PART                              }
     {***********************************************************************}

     const
        ccg              = 0;                  {Condition code warning       }
        ccl              = 1;                  {Condition code error         }
        cce              = 2;                  {Condition code successful    }
        update           = 5;                  {HPFOPEN item value           }
        save_temp        = 2;                  {HPFOPEN item value           }
        save_perm        = 1;                  {HPFOPEN item value           }
        new              = 0;                  {HPFOPEN item value           }
        permanent        = 1;                  {HPFOPEN item value           }
        write            = 1;                  {HPFOPEN item value           }

     type
        pac256           = packed array [1..256] of char;
        pac80            = packed array [1..80] of char;
        status_type      = record        {HPFOPEN status variable type}
                             case integer of
                                0 : (info    : shortint;
                                     subsys  : shortint);
                                1 : (all     : integer);
                             end;

     var
        disk_file     : integer;
        tape_file     : integer;
        filename      : pac80;
        std_list      : integer;
        std_in        : integer;
        outbuf        : pac80;

     function  FREAD: shortint; intrinsic;   {Read from mag tape file         }
     procedure HPFOPEN; intrinsic;           {Open tape, disk, $STDLIST files }
     procedure FCLOSE; intrinsic;            {Close tape and disk files       }
     procedure FWRITE; intrinsic;            {Write to disk and $STDLIST files}
     procedure PRINTFILEINFO; intrinsic;     {If unsuccessful intrinsic call  }
     procedure QUIT; intrinsic;              {If unsuccessful intrinsic call  }

     procedure handle_file_error
               (
                  file_num : shortint;
                  quit_num : shortint
               );

     {************************************************************************}
     { procedure handle_file_error is invoked when a file system intrinsic    }
     { returns and unsuccessful condition code. File information is printed   }
     { to $STDLIST, then the program aborts.                                  }
     {************************************************************************}
     begin
       PRINTFILEINFO (file_num);
       QUIT (quit_num);
     end;                                    {end procedure                   }

     procedure open_unlabeled_tape_file
               (
                  var file_num : integer
               );

     {************************************************************************}
     { procedure open_unlabeled_tape_file opens a permanent unlabeled mag     }
     { tape file update access only.                                          }
     {************************************************************************}

     const
                                             {**define HPFOPEN item numbers **}
        formal_designator_option   = 2;
        domain_option              = 3;
        access_type_option         = 11;
        device_class_optin         = 42;
        density_option             = 24;

     var
                                             {**define HPFOPEN items       ** }
        file_name                  : pac80;
        permanent,update,density   : integer;
        device_class               : pac80;
        status                     : status_type;

     begin
       file_name :='&tapefile&';
       permanent := 3;
       update    := 5;
       device_class := '&TAPE&';
       density      := 1600;
       HPFOPEN (file_num, status, formal_designator_option, file_name,
                                  domain_option, permanent,
                                  access_type_option, update
                                  device_class_option, device_class
                                  density_option, density  );

       if status.all <> 0 then
          handle_file_error (file_num, 1);
     end;                                     {end procedure                  }

     procedure open_file
               (
                  var file_num  : integer;
                      file_name : pac80;
                      domain    : integer;
                      access    : integer
               );

     {************************************************************************}
     { procedure open_file acts as a generic file open procedure allowing     }
     { you to specify the domain option and the access type option            }
     {************************************************************************}

     const
                                              {**define HPFOPEN item numbers**}
     formal_designator_option  = 2;
        domain_option             = 3;
        access_type_option        = 11;
        ascii_binary_option       = 53;

     var
        ascii          : integer;
                                              {**define scratch variables  ** }
        msgbuf         : pac80;
        status         : status_type;

     begin
        ascii := 1;
        HPFOPEN (file_num, status, formal_designator_option, file_name,
                                   domain_option, domain,
                                   ascii_binary_option, ascii,
                                   access_type_option, access);

        if status.all <> 0 then
           handle_file_error (file_num, 2);
     end;                                      {end procedure                 }

     procedure copy_tapefile_to_discfile
               (
                  tape_file : integer;
                  disk_file : integer
               );

     {************************************************************************}
     { procedure copy_tapefile_to_discfile copies logical records             }
     { sequentially from tape file to disk file  with concurrent print to     }
     { stdlist.                                                               }
     {************************************************************************}

     var
        inbuf        : pac80;
        end_of_file  : boolean;
        read_length  : integer;

     begin
       end_of_file := false;
       repeat
               {**In a loop, do a simple sequential read from tape file to ***}
               {**disk file.                                                **}

         read_length := FREAD (tape_file, inbuf, 80);
         if ccode = ccl then
            handle_file_error (tape_file, 3)
         else
           if ccode = ccg then
              end_of_file := true
           else
             begin
               FWRITE (std_list, inbuf, read_length, 0);
               if ccode <> cce then
                  handle_file_error (std_list, 4);

               FWRITE (disk_file, inbuf, read_length,0);
               if ccode <> cce then
                  handle_file_error (disk_file, 5);

             end
       until end_of_file;
     end;                                      {end procedure                 }

     procedure close_file
               (
                  file_num : integer;
                  disp     : integer
               );

     {************************************************************************}
     { procedure close_file is a generic file closing procedure that allows   }
     { you to specify the final disposition of the file.                      }
     {************************************************************************}

     var
        msgbuf : pac80;

     begin
       FCLOSE (file_num, disp, 0);
       if ccode = ccl then
          handle_file_error (file_num, 6);
     end;                                      {end procedure                 }

     {************************************************************************}
     {                             MAIN PROGRAM                               }
     {************************************************************************}

     begin
       open_unlabeled_tape_file (tape_file);              { STEP 1           }
       filename := '&$stdlist&';                          { STEP 1           }
       open_file (std_list, filename, permanent,write);   { STEP 1           }
       filename := '&dataone&';                           { STEP 1           }
       open_file (disk_file, filename, new,update);       { STEP 1           }
       copy_tapefile_to_discfile(tape_file,disk_file);    { STEP 2           }
       close_file(disk_file, save_temp);                  { STEP 3           }
       close_file(tape_file, save_perm);                  { STEP 3           }
     end.                                            {end program            }



MPE/iX 5.0 Documentation