
%begin         {help file generation program}
   %recordformat hfm(%string(31-9) key, %byte Flag, %integer start, finish)
   %record(hfm)%array keys(0:1000)
   %record(hfm)%name K
   %string(31-5) key
   %integer j,l, keyn, n, token, sym, last
   %integer start pos, end pos, lastn, bias
   %integer pos = 0
   %routine get sym
      readsymbol(Sym)
      pos = pos+1
   %end
   %routine get key
      %integer s
      key = ""
      %cycle
         get sym
         %exit %if sym = nl
         sym = sym-32 %if 'a' <= sym <= 'z'
         key = key.tostring(sym)
      %repeat
   %end
   %routine locate key
      start pos = pos
      %cycle
         end pos = pos
         get sym
         %exit %if Last = NL %and (sym = '+' %or sym = '&')
         Last = sym
      %repeat
      Token = Sym
      get key
   %end
   %routine Sort(%integer a, b)
      %record(hfm) Dump
      %integer l, u
      %while a < b %cycle
         l = a;  u = b
         dump = Keys(u);  ->find

up:      l = l+1;  ->found %if l = u
find:    ->up %unless Keys(l)_Key > dump_key
         Keys(u) = Keys(l)
down:    u = u-1;  ->found %if l = u
         ->down %unless Keys(u)_Key < dump_key
         Keys(l) = Keys(u)
         ->up

found:   Keys(u) = dump
         l = l-1;  u = u+1
         %if l-a > b-l %start
            Sort(u, b);  b = l
         %else
            Sort(a, l);  a = u
         %finish
      %repeat
   %end
   %routine dump record(%integer n)
      %record(hfm)%name R
      %integer j
      R == keys(N)
      %if N # 0 %start
         R_start <- R_start+bias
         R_finish <- R_finish+bias
      %finish
      printsymbol(byteinteger(J)) %for j = addr(R), 1, addr(R)+31
   %end
   %on 9 %start
      newline
      %stop
   %finish
   keyn = 0;  lastn = 0
   select input(1)
   last = nl
   %cycle
      locate key
      %if token = '+' %start
         %while lastn < keyn %cycle
            lastn = lastn+1
            keys(lastn)_Start <- start pos
            keys(lastn)_Finish <- end pos
         %repeat
      %finish
      %exit %if key = "$"
      keyn = Keyn+1
      K == Keys(Keyn)
      K = 0
      K_Key = Key
      K_Flag = Token
   %repeat
   sort(1, keyn)
   reset input
   bias = (keyn+1)*32
   keys(0)_Finish = Keyn
   select output(1)
   dump record(j) %for j = 0,1,keyn
   %cycle
      readsymbol(sym);  printsymbol(sym)
   %repeat
%endofprogram
