# File src/rexml/functions.rb, line 172
                def Functions::substring( string, start, length=nil )
                        ruby_string = string(string)
                        ruby_length = if length.nil? 
                                                                                        ruby_string.length.to_f
                                                                                else
                                                                                        number(length)
                                                                                end
                        ruby_start = number(start)

                        # Handle the special cases
                        return '' if (
                                ruby_length.nan? or 
                                ruby_start.nan? or
                                ruby_start.infinite?
                        )

                        infinite_length = ruby_length.infinite? == 1
                        ruby_length = ruby_string.length if infinite_length
                                
                        # Now, get the bounds.  The XPath bounds are 1..length; the ruby bounds 
                        # are 0..length.  Therefore, we have to offset the bounds by one.
                        ruby_start = ruby_start.round - 1
                        ruby_length = ruby_length.round

                        if ruby_start < 0
                         ruby_length += ruby_start unless infinite_length
                         ruby_start = 0
                        end
                        return '' if ruby_length <= 0
                        ruby_string[ruby_start,ruby_length]
                end