access:
       proc(p);
       /* root module for update and sale */
       dcl
               p fixed;
       %replace
               true  by '1'b,
               false by '0'b;

       %include 'attrib.dcl';

       %include 'key.dcl';

       dcl
               update entry,
               sale   entry;
       dcl
               data file;

       open_data:
               proc ext;
               open file(data) direct update env(f(max_siz));
               end open_data;

       close_data:
               proc ext;
               close file(data);
               end close_data;

       input_key:
               proc(rec) ext;
               /* read access key from keyboard */
               dcl
                       rec     char(max_siz),
                       hdr_out entry(fixed),
                       att_in  entry(fixed,char(max_siz))
                               returns(bit),
                       att_err entry;

                       do while(true);
                       rec = '';
                       call hdr_out(1);
                       if att_in(1,rec) then
                               return;
                       call att_err();
                       end;
               end input_key;

       locate_key:
               proc(rec) returns(bit) ext;
               /* locate access key in key list, read record */
               dcl
                       rec char(max_siz);

                       do key_adr = key_hdr repeat(key_lst)
                               while(key_adr ^= null());
                       if key_val = rec then
                               do;
                               read file(data) into(rec)
                                       key(key_loc);
                               return(true);
                               end;
                       end;
               put edit('Not Found: ',substr(rec,1,max_chr),'')
                       (column(4),2a,skip,a);
               return(false);
               end locate_key;

       alter_rec:
               proc(rec) ext;
               /* alter current record */
               dcl
                       rec char(max_siz);
               write file(data) from(rec) keyfrom(key_loc);
               end alter_rec;


       /* dispatch to update or sale */
       if p = 0 then
               call update();
       if p = 1 then
               call sale();
       end access;