% Copyright (C) 1993, Digital Equipment Corporation
% All rights reserved.
% See the file COPYRIGHT for a full description.
%
% Last modified on Fri Feb 10 08:14:45 PST 1995 by kalsow  
%      modified on Tue Sep 27 11:47:00 PDT 1994 by weich   


if defined ("STABLEGEN")
  % take the version specified by the user
  _STABLEGEN = STABLEGEN
else
  _STABLEGEN = format ("%s%s%s", BIN_USE, SL, "stablegen")  %% - full path
  %% _STABLEGEN = "stablegen"
end

% PROC _stableobj
%
% working procedure which is called by the exported macros.
% First generate names for the stable implementation in "implname"
% and for the instantiation of the generic part of the stable
% implementation (of "StableRep.mg" and "StableRep.ig") in "repname".
%
% Inform quake about generated files (not contained in the users
% m3makefile). Then the generics are instantiated and the generator
% is run if necessary.
%
readonly proc _stableobj(intf, reveals, v) is  % e.g. intf = "Data"
  local implname = format ("Stable%s", intf)     % StableData
  local repname = format ("%sRep", implname)     % StableDataRep
  local intflist = []
  local intffilelist = []

  if empty(reveals)
    intflist = [ intf ]
  else
    intflist = [ reveals, intf ]
  end

  foreach file in intflist
    intffilelist += path_of(file & ".i3")
  end

  if defined("_all")
    if stale(implname & ".m3", intffilelist)
      generate_tfile()  % generate the import table
      local cmd = [ _STABLEGEN, "-i", intflist[0], "-o", intf, 
                    M3SEARCH_TABLES ]
      write (cmd, CR)
      local ret = exec(cmd)
      if not equal(ret, 0) error("command failed with error code: ", ret) end
    end
  end

  % StableData.m3
  derived_implementation (implname)
  % StableData.i3:
  build_generic_intf(implname, "Stable", [intf], v)
  % StableDataRep.i3:
  build_generic_intf(repname, "StableRep", [implname], HIDDEN)
  % StableDataRep.m3:
  build_generic_impl(repname, "StableRep", [implname])
end

readonly proc stableobj(intf, reveals) is
  _stableobj(intf, reveals, HIDDEN)
end

readonly proc Stableobj(intf, reveals) is
  _stableobj(intf, reveals, VISIBLE)
end

