###############################################################################
#
#	File:     gden_order.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"

#DJDSTOP
# # include "parm.h"
# 
# # include "stree/ststructs.mh"
# 
# # include "stree/Array.h"
# 
# int comp_gden();
# 
# Array * list_to_array();
# 
# 
# #
# #  gden_order(guarded_list_or_loop)
# #
# #  Sort the list of guarded commands into some arbitrary but well-defined
# # order.  All but one else clause is deleted, and that clause appears at
# # the end.
# #
# #DJDSTART
procedure gden_order(gden)
    local     a, a_len, i,j, p, q, r

    a := list_to_array(gden . gl_list);
    a_len := a . a_size;

    sort(a)
#    qsort(&a.a_body[0], a_len, (sizeof (NODE *)), comp_gden);
    # Put everything back into the loop or conditional node
    gden . gl_list := emptylist()

    i := 1
    while i <= a_len do {
#    for (i = 0; i < a_len; i++) {
	addright(gden . gl_list, a.a_body[i])
	# stop after the first else clause
	if (a.a_body[i] . ge_guard . kind == WORDELSE) then break
	i +:= 1
    }
end

#
# compare two guarded denotation nodes, imposing an arbitrary order on the
# guards, except that anything with a WORDELSE guard is infinitely large.
#
procedure comp_gden(p, q)
    local i
    i := comp_st(p. ge_guard, q . ge_guard, nil, nil) # may be wrong, but no -1 stt indicees are ever generated within conditionals,  so it doesn't matter
    if (i = 0) then {
	i := comp_st(p. ge_element, q. ge_element, nil, nil)
    }
    return(i)
end
