{ Computer Systems Research Group
  University of Toronto

  File:   STRING ConEuc Standard String Package (Machine Indpendent)  V1.10
  Author: James R. Cordy
  Date:   10 March 1982	(Revised 28 July 1982)			}

{ Copyright (C) 1982, The University of Toronto }


var String: module
    exports (Assign, Append, Substr, Length, Index, Equal, 
    	     IntToString, StringToInt)

    pervasive const maxLength := 32767

    procedure Assign (var r: packed array 1..parameter of Char,
		s: packed array 1..parameter of Char) =
	begin
	    register var i: 1..maxLength := 1
	    loop
		r(i) := s(i)
		exit when r(i) = $$E
		i := i + 1
	    end loop
	end Assign

    procedure Append (var r: packed array 1..parameter of Char,
		s: packed array 1..parameter of Char) =
	begin
	    register var i: 1..maxLength := 1
	    register var j: 1..maxLength := 1
	    loop
		exit when r(i) = $$E
		i := i + 1
	    end loop
	    loop
		r(i) := s(j)
		exit when r(i) = $$E
		i := i + 1
		j := j + 1
	    end loop
	end Append

    procedure Substr (var r: packed array 1..parameter of Char,
		s: packed array 1..parameter of Char,
		f: 1..maxLength,
		l: 1..maxLength) =
	begin
	    register var i: 1..maxLength := 1
	    register var j: 1..maxLength := f
	    loop
		exit when i > l or s(j) = $$E
		r(i) := s(j)
		i := i + 1
		j := j + 1
	    end loop
	    r(i) := $$E
	end Substr

    function Length (s: packed array 1..parameter of Char)
		returns result: 0..maxLength =
	begin
	    register var l: 1..maxLength := 1
	    loop
		exit when s(l) = $$E
		l := l + 1
	    end loop
	    return (l-1)
	end Length

    function Index (s1: packed array 1..parameter of Char,
		s2: packed array 1..parameter of Char) 
		returns result: 0..maxLength =
	begin
	    register var i: 1..maxLength := 1
	    register var j: 1..maxLength
	    register var k: 1..maxLength
	    loop
		if s1(i) = s2(1) then
		    k := i
		    j := 1
		    loop
			if s2(j) = $$E then
			    return (i)
			end if
			exit when s1(k) = $$E or s1(k) not = s2(j)
			k := k + 1
			j := j + 1
		    end loop
		end if
		exit when s1(i) = $$E
		i := i + 1
	    end loop
	    return (0)
	end Index

    function Equal (s1: packed array 1..parameter of Char,
		s2: packed array 1..parameter of Char) 
		returns result: Boolean =
	begin
	    register var i: 1..maxLength := 1
	    loop
		if s1(i) not = s2(i) then
		    return (false)
		end if
		exit when s1(i) = $$E
		i := i + 1
	    end loop
	    return (true)
	end Equal

    procedure IntToString (var r: packed array 1..parameter of Char,
	    v: LongInt) =
	begin
	    const maxIntLength := 11
	    register var i : 0 .. maxIntLength
	    register var j : 0 .. maxIntLength
	    var value : LongInt := v
	    var negative : Boolean := true
	    var t : array 1 .. maxIntLength of Char

	    if value >= 0 then
		negative := false
		value := - value
	    end if

	    j := maxIntLength
	    loop
		t (j) := Chr (Ord ($0) - value mod Long(10))
		j := j - 1
		value := value div Long(10)
		exit when value = 0
	    end loop

	    if negative then
		t (j) := $-
		j := j - 1
	    end if

	    i := 1
	    loop
		j := j + 1
		r(i) := t(j)
		exit when j = maxIntLength
		i := i + 1
	    end loop

	    r(i+1) := $$E
	end IntToString

    function StringToInt (s: packed array 1..parameter of Char)
	    returns result: LongInt =
	begin
	    register var i: 1..maxLength
	    var negative : Boolean := false
	    var value: LongInt := 0

	    i := 1
	    loop
		exit when s(i) not= $$S 
		i := i + 1
	    end loop

	    if s(i) = $- then
		negative := true
		i := i + 1
	    end if

	    loop
		value := 10 * value + Ord (s(i)) - Ord ($0)
		i := i + 1
		exit when s(i) < $0 or s(i) > $9
	    end loop

	    if negative then
		value := -value
	    end if

	    return (value)
	end StringToInt

end module
