###############################################################################
#
#	File:     restore.icn
#
#	Subject:  russell language support procedures
#
#	Author:   Dennis J Darland
#
#	Date:     October - Novmber, 2015
#
###############################################################################
#
# Copyright 1986-1989 Hans-Juergen Boehm, Alan J. Demers, Kumar Srikantan,
# Vernon Lee, and Lucy Hederman.
# Copyright Digital Equipment Corporation & INRIA 1988, 1989.
# Copyright (c) 1990-1993 by Xerox Corporation.  All rights reserved.
#
# This material is provided as is, with no warranty expressed or implied.
# Any use is at your own risk.
#
# Permission is hereby granted to copy this compiler for any non-commercial
# purpose, provided the above notices are retained on all copies.  Further
# restrictions apply to the DEC/INRIA BigNum package.  These are stated in
# the file runtime/BigNum/doc/bnbody.tex.
#
# This work uses the BigNum package developed jointly by INRIA and
# Digital PRL.  It has been modified by Hans-J. Boehm in August 1990
# and February 1993 at Xerox PARC.  When you receive this software,
# please send mail to librarian@prl.dec.com to inform them that you
# have a copy of the package.
###############################################################################
#
#   NOTE From Dennis J. Darland (11/2/2015)
#
#   I obtained the "c" language source code for "russell" copyrighted above
#   in the 1990's. I have made efforts to get it to work over the years, but
#   always failed. It has many hardware and OS dependancies. Now (October 2015
#   forward, I am tring to port to the language "Unicon". Practically every
#   line of code will need to be changed, as someing as simple as the
#   assignment operator is different. Also I will not use the BigNum package
#   mentioned above. Also I am doing this not for profit, and am sharing
#   freely. I am not at all confident that I will get it working well, but
#   believe in open source, so am sharing my work as I make progress.
#   Unicon is also much more portable.
#
###############################################################################



$include "defs.icn"
$include "global_vars.icn"
#
#
 #  restore(defnode)
 #  NODE # defnode;
 #
 #  defnode - A definition node, giving a definition to an id.
 #
 #  Remove the knowledge of this definition of the identifier from
 #  the Idtable.
 #  Ignore the request if the definition node in fact does not define
 #  an identifier, e.g. if it is an ononymous parameter.
 #
 #/

# include "parm.h"
# include "pass1/stt/sttdefs.h"
# include "stree/ststructs.mh"
# include "Idtable.h"
# define DEBUG yes

procedure restore(defnode)

    local ip, idnode, prevdef_field, modifier

#    NODE * idnode;         The node of the defined id.
#    NODE **prevdef_field;  The previous definition field in defnode.

    case (defnode.kind) of {
	DECLARATION:
	    {
		idnode := defnode.decl_id;
		prevdef_field := defnode.decl_previous_definition
	    }
             PARAMETER:
		 {
                idnode := defnode.par_id;
                prevdef_field := defnode.par_previous_definition
	    }
	TYPESIGNATURE:
	    {
		idnode := defnode.ts_local_type_id;
		prevdef_field := defnode.ts_previous_definition
	    }
	UNIONCONSTRUCTION:
	    {
                idnode := defnode.prod_local_type_id
                prevdef_field := defnode.prod_previous_definition
	    }
	PRODCONSTRUCTION:
	    {
                idnode := defnode.prod_local_type_id
                prevdef_field := defnode.prod_previous_definition
	    }
	MODPRIMARY:
	    {
		modifier := defnode . mp_type_modifier

		case (modifier . kind) of {
		    WITHLIST:
			{
			    idnode := modifier.wl_local_type_id
			    prevdef_field := modifier.wl_previous_definition
			}
		    EXPORTLIST:
			{
			    idnode := modifier.el_local_type_id
			    prevdef_field := modifier.el_previous_definition
			}
		    HIDELIST:
			{
			    idnode := modifier.el_local_type_id
			    prevdef_field := modifier.el_previous_definition
			}
		}
	    }
	default: {
                    rpt_err("restore: bad defnode: kind" || dump_info(defnode.kind))
		}
    }

    if (/idnode) then return TRUE
    ip := retrieve(idnode.id_str_table_index)
    ip.i_value := prevdef_field
return TRUE
end

