###############################################################################
#
#	File:     findsig_str.inc.icn
#
#	Subject:  russell language support procedures - include segment
#
#	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.
#
###############################################################################

$ifdef NOT_NOT
procedure fool_emacs()
    $endif

    if ((q := findstdecl(p)) ~= SUCCESS) then {
	p . sig_done := SIG_UNKNOWN
	return(q)
    }
    if  / (p . sel_type) then {
	case (p . kind) of {
	    QSTR:  
		rpt_err_node ("No appropriate type for " || p . str_string, p)
	    UQSTR:
		rpt_err_node("No appropriate type for "|| p . str_string,p)
	}
	p . signature := ERR_SIG
	p . sig_done := SIG_DONE
	return(SUCCESS)
    }
    if ((q := findsig(p . sel_type, dont_coerce)) ~= SUCCESS) then {
	p . sig_done := SIG_UNKNOWN
	return(q)
    }
    {
#                    NODE * sel_sig = p . sel_type . signature;
#		    NODE * r;
#		    int maxlen;  # Maximum length for validity of 
    # ts_string_code                 
	sel_sig := p . sel_type . signature
	if (sel_sig = ERR_SIG) then {
	    p . signature := ERR_SIG
	    p . sig_done := SIG_DONE
	    return(SUCCESS)
	}
	if (sel_sig . ts_string_max = -1) then {
	    maxlen := MAXSTRLEN
	} else {
	    maxlen := sel_sig . ts_string_max
	}
	if (\ (sel_sig . ts_string_code) &
	    \ (sel_sig . ts_element_code) &
	    *(p . str_string) <= maxlen &
	    p . sel_type . kind = LETTERID &
	    / (p . sel_type . sel_type)) then {
		if ((r := on_dontsubst(p . sel_type)) ~= NIL) then {
		    p . sig_done := SIG_UNKNOWN
		    return(r)
		}
		# Safe to take a shortcut 
		initsig(p, mknode([VALSIGNATURE, p . sel_type]))
		p . sig_done := SIG_DONE
		return(SUCCESS)
	    }
    }
    if  / (p . str_expansion) then {
	p.str_expansion := expand_str(p)
    }
    if ((q := findsig(p . str_expansion, dont_coerce)) = SUCCESS) then {
	initsig(p, p . str_expansion . signature)
	p . sig_done := SIG_DONE
	return(SUCCESS)
    } else {
	p . sig_done := SIG_UNKNOWN
	return(q)
    }
    $ifdef NOT_NOT
end
$endif
