setkey:
       proc;
       /* read key file */
%include 'attrib.dcl';
%include 'key.dcl';
       dcl
               key file,
               key_v  char(max_chr),
               rec_no fixed;

       setfmt:
               format(skip,column(12),a,skip,a);

       on error(7)
               begin;
               /* free space exhausted */
               put edit('Not Enough Memory for Keys','')
                       (r(setfmt));
               stop;
               end;

       on undefinedfile(key)
               begin;
               put edit('(No Key File)','')
                       (r(setfmt));
               go to end_set;
               end;

       on endfile(key)
               go to end_read;

       key_hdr = null();
       open file(key) stream;
               do rec_no = 0 by 1;
               get file(key) edit(key_v) (a);
               allocate key_elt set(key_adr);
               key_val = key_v;
               key_loc = rec_no;
               key_lst = key_hdr;
               key_hdr = key_adr;
               end;
       end_read:
       close file(key);
       put skip list('List of Keys:');
               do key_adr = key_hdr repeat(key_lst)
                       while(key_adr ^= null());
               put edit(key_val,key_loc)
                       (column(4),a(max_chr),f(6));
               end;
       end_set:
       end setkey;