%begin
! Common V0.0
%const %string(255) Ident = "Exclude V0.0 (c) Graham Toal 1986"

%external %integer %fn %spec XName(%string(255) %name prog name)
%string (255) program name
%routine help
%integer string length, j
  string length = XName(program name)
  %for j = string length, -1, 1 %cycle
    charno(program name, j) = charno(program name, j-1)
  %repeat
  length(program name) = string length

  printstring("Usage: ".program name." subset,master leftovers".nl)
%end

%include "dictutils-imp"

%record %format dict fm(%byte %array ch(0:2000000))
%record (dict fm) %name %array dict(1:max word length)
%integer %array next free(1:max word length)
%string(255) dict1,dict2,common dict
%integer word length, length1, length2, dict1 address, dict2 address, cc,
   common length, common address, resulting common length

  Decode standard params
  dict1 = in param1."."
  dict2 = in param2."."
  common dict = output param."."

  %if dict1=common dict %or dict2=common dict %start
    printstring("No! - mustn't overwrite ".common dict.nl)
    Printstring("Parameters should be 'dict1,dict2 common'".nl)
    %stop
  %finish

  %for Word length = 1,1,max word length %cycle
    %if exists(dict2.itos(word length,0), length2) %then %start
      %if %not exists(dict1.itos(word length,0), length1) %start
        ! COPY dict2 TO RESULTDICT...
        %if verbosity > 0 %start
          printstring("Copying ".itos(word length,0)."'s by hand...".nl)
          printstring("Allocating ".itos(length2,0)." bytes...".nl)
        %finish
        cc = Allocate(dict2 address, length2)
        %if cc < 0 %then %start
          %if verbosity > 0 %then %start
            Printstring("No room for ".itos(word length, 0)." letter words". %c
              " from ".dict2.nl)
          %finish
          Stop(cc)
        %finish
        %if verbosity > 0 %start
          printstring("Loading...".nl)
        %finish
        loadup(dict2.itos(word length,0), dict2 address, length2, length2)
        %if verbosity > 0 %start
          printstring("Saving...".nl)
        %finish
        WriteOut(common dict.itos(word length,0), dict2 address, length2)
        %if verbosity > 0 %start
          printstring("Deallocating...")
        %finish
        FREE SPACE(dict2 address)
        %if verbosity > 0 %start
          printstring("Done!".nl)
        %finish
        %continue
      %finish
        
      ! Can only have common elements if both dicts have words of
      ! appropriate length.
      %if verbosity > 0 %start
        printstring("Finding common ".itos(word length,0). %c
                       " letter words".nl)
      %finish
      cc = Allocate(dict1 address, length1)
      %if cc < 0 %then %start
        %if verbosity > 0 %then %start
          Printstring("No room for ".itos(word length, 0)." letter words". %c
            " from ".dict1.nl)
        %finish
        Stop(cc)
      %finish
      loadup(dict1.itos(word length,0), dict1 address, length1, length1)
      cc = Allocate(dict2 address, length2)
      %if cc < 0 %then %start
        %if verbosity > 0 %then %start
          Printstring("No room for ".itos(word length, 0)." letter words". %c
            " from ".dict2.nl)
        %finish
        Stop(cc)
      %finish
      loadup(dict2.itos(word length,0), dict2 address, length2, length2)
      common length=length1+length2
      cc = Allocate(common address, common length)
      %if cc < 0 %then %start
        %if verbosity > 0 %then %start
          Printstring("No room for ".itos(word length, 0)." letter words". %c
            " once merged".nl)
        %finish
        Stop(cc)
      %finish
      Exclude(word length,
            dict1 address, dict2 address, common address,
            length1, length2, resulting common length)
      %if resulting common length>0 %start
        %if verbosity > 0 %start
          %if verbosity > 4 %start
            Printstring("Dict ".itos(word length,0)." Merged: ")
            Write(length1,0); printstring(" + ")
            Write(length2,0); printstring(" -> ")
            Write(resulting common length,0)
            Newline
          %finish
          printstring("Writing common ".itos(word length,0). %c
                         " letter words".nl)
        %finish
        WriteOut(common dict.Itos(word length,0), common address,
                 resulting common length)
      %finish
      FREE SPACE(dict1 address)
      FREE SPACE(dict2 address)
      FREE SPACE(common address)
    %finish
  %repeat

  terminate

%endofprogram
