%begin
%string(8)%array ending(0:255)
%integer i
ending(i) = "" %for i = 0,1,255

%const %integer dict size=175616
%byte %array dict(0:dict size-1)

%byte %array new dict(0:200000)
%integer next free

%external %routine %spec  XLoad File (%string (255) file name,
                                     %integer      buffer size,
                                     %integer      address)

%integer each length, tot words

%routine STARTUP
printstring ("Scanning words of length ".itos(each length,0).nl)
  tot words = 0; next free=0
%end

%routine HANDLE(%string(63) word)
%integer i,j
  %return %if each length#LENGTH(word)
  j = next free
  tot words=tot words+1
  %for i = 1,1,each length %cycle
    new dict(next free) = CHARNO(word,i)
    %unless 'a'<=new dict(next free)<='z' %start
      printstring("excluding ".word.nl)
      next free = j
      tot words = tot words-1
      %return
    %finish
    next free = next free+1
  %repeat
  new dict(next free)=NL;next free= next free+1
%end
%external %integerfn %spec Save File (%integer straddr,strlen,
                                     %integer     buffer size,
                                                  address)

%routine INFORM
%string(63) fname="testdir.".itos(each length,0)
%integer i
  %if tot words=0 %then %return
printstring("saving ".fname.nl)
  i = SaveFile(ADDR(fname)+1,length(fname),next free,ADDR(new dict(0)))
%end

%string(255) Curr word, last word
%integer fp, trunc len

%routine Monitor(%string(255) S)
  printstring(itos(fp,0))
  printstring(" (".itos(dict(fp),0)."): ".curr word)  
  printstring(s);newline
%end

%integer %array letter start(0:26)
%integer Next letter
XLoadFile("dfs::3.o.master1", 27*4, ADDR(letter start(0)))

! First, steal dict space to build ending lists
XLoadFile("dfs::3.t.master1", dict size, ADDR(dict(0)))
%integer ep=16_13, code
%cycle
  ! forward to 0. Next byte is code. Bytes back to last 0 are ending
  ep=ep+1 %while dict(ep)#0
  code = dict(ep+1)
  i = ep
  ending(code) = ""
  %cycle
    i = i-1
    %exit %unless 'A'<=dict(i)<='Z'
    ending(code)=ending(code).TOSTRING(dict(i)!32)
  %repeat
  ep=ep+1
%repeat %until ep>=16_386

%for i = 91,1,239 %cycle
  Write(i,5)
  printstring(" -".ending(i).nl)
%repeat

XLoad file("dfs::3.w.master1", dict size, ADDR(dict(0)))
%for each length = 13,1,13 %cycle
!%for each length = 13,1,19 %cycle
!%if 15<=each length<=16 %then %continue
STARTUP
curr word = "a";fp = 0;next letter = 0
Letter start(0)=0;! ???
%cycle
next let:
  %if fp>=Letter start(Next letter) %start
    %if next letter = 26 %then %exit
    CHARNO(curr word,1)=Next letter+'a'
    LENGTH(curr word)=1
!Monitor(" START!")
    next letter = next letter+1
  %finish
  ! Get alpha seq to non-alpha
  %while 39<=dict(fp)<=90 %cycle
    curr word=curr word.TOSTRING(dict(fp)!32)
!Monitor(" + ...")
    fp=fp+1; %if fp=Letter start(next letter) %then -> Next let
  %repeat
  ! gen words (endings) to alpha or < 32
  last word = curr word
  %while 91<=Dict(fp)<=239 %cycle
!    printstring(currword."-".ending(dict(fp)).nl)
    last word=curr word.ending(dict(fp))
    HANDLE(last word)
!Monitor("-".ending(dict(fp)))
    fp=fp+1; %if fp=Letter start(next letter) %then -> Next let
  %repeat
  curr word = last word
  ! get length modifier, truncate to length+1
  trunc len = Dict(fp)+1
  %if trunc len <= Length(curr word) %start
!    printstring("Truncating '".curr word)
    Length(curr word)=trunc len
!    printstring("' to '".curr word."' (length = ".itos(trunc len,0).")".nl)
!Monitor("|")
    fp=fp+1; %if fp=Letter start(next letter) %then -> Next let
  %else %if 39<=dict(fp)<=90
!    printstring("Code ")
!    write(dict(fp),0)
!    printstring(" ? - truncation to 1 assumed".nl)
    Length(curr word)=1
  %else
    printstring("Code ")
    write(dict(fp),0)
    printstring(" at fp=".itos(fp,0).nl)
    %stop
  %finish
%repeat %until fp >= dict size-1 {emergency stop}
INFORM
%repeat
%endofprogram
