*: update all clients of the `CString::to_s` services
[nit.git] / lib / core / text / abstract_text.nit
index f95377e..9078918 100644 (file)
@@ -139,7 +139,7 @@ abstract class Text
        end
 
        # Return a null terminated char *
-       fun to_cstring: NativeString is abstract
+       fun to_cstring: CString is abstract
 
        # The index of the last occurrence of an element starting from pos (in reverse order).
        #
@@ -866,7 +866,7 @@ abstract class Text
                # If no transformation is needed, return self as a string
                if not has_percent then return to_s
 
-               var buf = new NativeString(len)
+               var buf = new CString(len)
                var i = 0
                var l = 0
                while i < length do
@@ -894,7 +894,7 @@ abstract class Text
                        l += 1
                end
 
-               return buf.to_s_unsafe(l)
+               return buf.to_s_unsafe(l, copy=false)
        end
 
        # Escape the characters `<`, `>`, `&`, `"`, `'` and `/` as HTML/XML entity references.
@@ -1108,15 +1108,15 @@ abstract class Text
 
        # Copies `n` bytes from `self` at `src_offset` into `dest` starting at `dest_offset`
        #
-       # Basically a high-level synonym of NativeString::copy_to
+       # Basically a high-level synonym of CString::copy_to
        #
        # REQUIRE: `n` must be large enough to contain `len` bytes
        #
-       #       var ns = new NativeString(8)
+       #       var ns = new CString(8)
        #       "Text is String".copy_to_native(ns, 8, 2, 0)
-       #       assert ns.to_s_unsafe(8) == "xt is St"
+       #       assert ns.to_s_with_length(8) == "xt is St"
        #
-       fun copy_to_native(dest: NativeString, n, src_offset, dest_offset: Int) do
+       fun copy_to_native(dest: CString, n, src_offset, dest_offset: Int) do
                var mypos = src_offset
                var itspos = dest_offset
                while n > 0 do
@@ -1268,17 +1268,17 @@ end
 abstract class FlatText
        super Text
 
-       # Underlying C-String (`char*`)
+       # Underlying CString (`char*`)
        #
-       # Warning : Might be void in some subclasses, be sure to check
+       # Warning: Might be void in some subclasses, be sure to check
        # if set before using it.
-       var items: NativeString is noinit
+       var items: CString is noinit
 
        # Returns a char* starting at position `first_byte`
        #
        # WARNING: If you choose to use this service, be careful of the following.
        #
-       # Strings and NativeString are *ideally* always allocated through a Garbage Collector.
+       # Strings and CString are *ideally* always allocated through a Garbage Collector.
        # Since the GC tracks the use of the pointer for the beginning of the char*, it may be
        # deallocated at any moment, rendering the pointer returned by this function invalid.
        # Any access to freed memory may very likely cause undefined behaviour or a crash.
@@ -1289,7 +1289,7 @@ abstract class FlatText
        #
        # As always, do not modify the content of the String in C code, if this is what you want
        # copy locally the char* as Nit Strings are immutable.
-       fun fast_cstring: NativeString is abstract
+       fun fast_cstring: CString is abstract
 
        redef var length = 0
 
@@ -1742,8 +1742,8 @@ redef class Object
        # User readable representation of `self`.
        fun to_s: String do return inspect
 
-       # The class name of the object in NativeString format.
-       private fun native_class_name: NativeString is intern
+       # The class name of the object in CString format.
+       private fun native_class_name: CString is intern
 
        # The class name of the object.
        #
@@ -1779,13 +1779,13 @@ redef class Bool
 end
 
 redef class Byte
-       # C function to calculate the length of the `NativeString` to receive `self`
+       # C function to calculate the length of the `CString` to receive `self`
        private fun byte_to_s_len: Int `{
                return snprintf(NULL, 0, "0x%02x", self);
        `}
 
-       # C function to convert an nit Int to a NativeString (char*)
-       private fun native_byte_to_s(nstr: NativeString, strlen: Int) `{
+       # C function to convert an nit Int to a CString (char*)
+       private fun native_byte_to_s(nstr: CString, strlen: Int) `{
                snprintf(nstr, strlen, "0x%02x", self);
        `}
 
@@ -1795,17 +1795,17 @@ redef class Byte
        #     assert (-123).to_b.to_s  == "0x85"
        redef fun to_s do
                var nslen = byte_to_s_len
-               var ns = new NativeString(nslen + 1)
+               var ns = new CString(nslen + 1)
                ns[nslen] = 0u8
                native_byte_to_s(ns, nslen + 1)
-               return ns.to_s_unsafe(nslen)
+               return ns.to_s_unsafe(nslen, copy=false, clean=false)
        end
 end
 
 redef class Int
 
        # Wrapper of strerror C function
-       private fun strerror_ext: NativeString `{ return strerror((int)self); `}
+       private fun strerror_ext: CString `{ return strerror((int)self); `}
 
        # Returns a string describing error number
        fun strerror: String do return strerror_ext.to_s
@@ -1834,13 +1834,13 @@ redef class Int
                end
        end
 
-       # C function to calculate the length of the `NativeString` to receive `self`
+       # C function to calculate the length of the `CString` to receive `self`
        private fun int_to_s_len: Int `{
                return snprintf(NULL, 0, "%ld", self);
        `}
 
-       # C function to convert an nit Int to a NativeString (char*)
-       private fun native_int_to_s(nstr: NativeString, strlen: Int) `{
+       # C function to convert an nit Int to a CString (char*)
+       private fun native_int_to_s(nstr: CString, strlen: Int) `{
                snprintf(nstr, strlen, "%ld", self);
        `}
 
@@ -1985,9 +1985,9 @@ redef class Char
        #     assert 'x'.to_s    == "x"
        redef fun to_s do
                var ln = u8char_len
-               var ns = new NativeString(ln + 1)
+               var ns = new CString(ln + 1)
                u8char_tos(ns, ln)
-               return ns.to_s_unsafe(ln)
+               return ns.to_s_unsafe(ln, copy=false, clean=false)
        end
 
        # Returns `self` escaped to UTF-16
@@ -2030,7 +2030,7 @@ redef class Char
                return buf.to_s
        end
 
-       private fun u8char_tos(r: NativeString, len: Int) `{
+       private fun u8char_tos(r: CString, len: Int) `{
                r[len] = '\0';
                switch(len){
                        case 1:
@@ -2234,7 +2234,7 @@ redef class Sys
        private fun native_argc: Int is intern
 
        # Second argument of the main C function.
-       private fun native_argv(i: Int): NativeString is intern
+       private fun native_argv(i: Int): CString is intern
 end
 
 # Comparator that efficienlty use `to_s` to compare things
@@ -2294,49 +2294,40 @@ do
        return sys.program_args
 end
 
-redef class NativeString
-       # Get a `String` from the data at `self` copied into Nit memory
-       #
-       # Require: `self` is a null-terminated string.
-       fun to_s_with_copy: String is abstract
+redef class CString
 
-       # Get a `String` from `length` bytes at `self`
+       # Get a `String` from the data at `self` (with unsafe options)
        #
-       # The result may point to the data at `self` or
-       # it may make a copy in Nit controlled memory.
-       # This method should only be used when `self` was allocated by the Nit GC,
-       # or when manually controlling the deallocation of `self`.
-       fun to_s_with_length(length: Int): String is abstract
-
-       # Get a `String` from the raw `length` bytes at `self`
+       # The default behavior is the safest and equivalent to `to_s`.
        #
-       # The default value of `length` is the number of bytes before
-       # the first null character.
+       # Options:
        #
-       # The created `String` points to the data at `self`.
-       # This method should be used when `self` was allocated by the Nit GC,
-       # or when manually controlling the deallocation of `self`.
+       # * Set `byte_length` to the number of bytes to use as data.
+       #   Otherwise, this method searches for a terminating null byte.
        #
-       # /!\: This service does not clean the items for compliance with UTF-8,
-       # use only when the data has already been verified as valid UTF-8.
-       fun to_s_unsafe(length: nullable Int): String is abstract
-
-       # Get a `String` from the raw `byte_length` bytes at `self` with `unilen` Unicode characters
+       # * Set `char_length` to the number of Unicode character in the string.
+       #   Otherwise, the data is read to count the characters.
+       #   Ignored if `clean == true`.
        #
-       # The created `String` points to the data at `self`.
-       # This method should be used when `self` was allocated by the Nit GC,
-       # or when manually controlling the deallocation of `self`.
+       # * If `copy == true`, the default, copies the data at `self` in the
+       #   Nit GC allocated memory. Otherwise, the return may still point to
+       #   the data at `self`.
        #
-       # /!\: This service does not clean the items for compliance with UTF-8,
-       # use only when the data has already been verified as valid UTF-8.
+       # * If `clean == true`, the default, the string is cleaned of invalid UTF-8
+       #   characters. If cleaning is necessary, the data is copied into Nit GC
+       #   managed memory, whether or not `copy == true`.
+       #   Don't clean only when the data has already been verified as valid UTF-8,
+       #   other library services rely on UTF-8 compliant characters.
+       fun to_s_unsafe(byte_length, char_length: nullable Int, copy, clean: nullable Bool): String is abstract
+
+       # Retro-compatibility service use by execution engines
        #
-       # SEE: `abstract_text::Text` for more info on the difference
-       # between `Text::byte_length` and `Text::length`.
-       fun to_s_full(byte_length, unilen: Int): String is abstract
+       # TODO remove this method at the next c_src regen.
+       private fun to_s_full(byte_length, char_length: Int): String do return to_s_unsafe(byte_length, char_length, false, false)
 
        # Copies the content of `src` to `self`
        #
-       # NOTE: `self` must be large enough to withold `self.byte_length` bytes
+       # NOTE: `self` must be large enough to contain `self.byte_length` bytes
        fun fill_from(src: Text) do src.copy_to_native(self, src.byte_length, 0, 0)
 end