setdef: proc; %replace true by '1'b, false by '0'b, key_f by 0, /* principal key field */ qty_f by 1, /* quantity field */ prc_f by 2, /* price field */ unk_f by 3; /* unknown field */ %include 'attrib.dcl'; dcl def file; dcl prc_start fixed ext, prc_len fixed ext, qty_start fixed ext, qty_len fixed ext, sales_tax dec(4,2) ext; dcl start fixed, finish fixed, last_fin fixed, i fixed; on undefinedfile(def) begin; put skip list('Missing or Empty DEF.DAT File'); stop; end; open file(def) stream; on error(1) begin; put list('Invalid Data Item in DEF.DAT, line', lineno(def)); stop; end; on endfile(def) go to end_def; att_cnt = 0; get file(def) list(sales_tax); do while (att_cnt <= max_att); i = att_cnt + 1; if i > max_att then i = 1; get file(def) list (att_chars(i), att_type(i), att_start(i), att_finish(i)); att_cnt = att_cnt + 1; if att_cnt > max_att then do; put list('More than ',max_att, 'Fields in DEF.DAT'); stop; end; end; end_def: if att_cnt = 0 then signal undefinedfile(def); prc_start = 0; qty_start = 0; /* validate fields, check for price and qty fields */ last_fin = 0; do i = 1 to att_cnt; start = att_start(i); finish = att_finish(i); if start <= last_fin | start > finish | finish > max_siz then signal error(1); last_fin = finish; if att_type(i) = qty_f then do; qty_start = start; qty_len = finish - start + 1; end; if att_type(i) = prc_f then do; prc_start = start; prc_len = finish - start + 1; end; end; if prc_start = 0 | qty_start = 0 then do; put skip list('Missing Price or Quantity in DEF.DAT'); stop; end; end setdef;