Commits

Alex Szpakowski committed 8699059

Updated UTF-8 library to the latest version

  • Participants
  • Parent commits c116ae4

Comments (0)

Files changed (4)

File src/libraries/utf8/utf8.h

-// Copyright 2006 Nemanja Trifunovic
-
-/*
-Permission is hereby granted, free of charge, to any person or organization
-obtaining a copy of the software and accompanying documentation covered by
-this license (the "Software") to use, reproduce, display, distribute,
-execute, and transmit the Software, and to prepare derivative works of the
-Software, and to permit third-parties to whom the Software is furnished to
-do so, all subject to the following:
-
-The copyright notices in the Software and this entire statement, including
-the above license grant, this restriction and the following disclaimer,
-must be included in all copies of the Software, in whole or in part, and
-all derivative works of the Software, unless such copies or derivative
-works are solely in the form of machine-executable object code generated by
-a source language processor.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-FITNESS FOR A PARTICULAR PURPOSE, TITLE AND NON-INFRINGEMENT. IN NO EVENT
-SHALL THE COPYRIGHT HOLDERS OR ANYONE DISTRIBUTING THE SOFTWARE BE LIABLE
-FOR ANY DAMAGES OR OTHER LIABILITY, WHETHER IN CONTRACT, TORT OR OTHERWISE,
-ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
-DEALINGS IN THE SOFTWARE.
-*/
-
-
-#ifndef UTF8_FOR_CPP_2675DCD0_9480_4c0c_B92A_CC14C027B731
-#define UTF8_FOR_CPP_2675DCD0_9480_4c0c_B92A_CC14C027B731
-
-#include "utf8/checked.h"
-#include "utf8/unchecked.h"
-
-#endif // header guard
+// Copyright 2006 Nemanja Trifunovic
+
+/*
+Permission is hereby granted, free of charge, to any person or organization
+obtaining a copy of the software and accompanying documentation covered by
+this license (the "Software") to use, reproduce, display, distribute,
+execute, and transmit the Software, and to prepare derivative works of the
+Software, and to permit third-parties to whom the Software is furnished to
+do so, all subject to the following:
+
+The copyright notices in the Software and this entire statement, including
+the above license grant, this restriction and the following disclaimer,
+must be included in all copies of the Software, in whole or in part, and
+all derivative works of the Software, unless such copies or derivative
+works are solely in the form of machine-executable object code generated by
+a source language processor.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE, TITLE AND NON-INFRINGEMENT. IN NO EVENT
+SHALL THE COPYRIGHT HOLDERS OR ANYONE DISTRIBUTING THE SOFTWARE BE LIABLE
+FOR ANY DAMAGES OR OTHER LIABILITY, WHETHER IN CONTRACT, TORT OR OTHERWISE,
+ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
+DEALINGS IN THE SOFTWARE.
+*/
+
+
+#ifndef UTF8_FOR_CPP_2675DCD0_9480_4c0c_B92A_CC14C027B731
+#define UTF8_FOR_CPP_2675DCD0_9480_4c0c_B92A_CC14C027B731
+
+#include "utf8/checked.h"
+#include "utf8/unchecked.h"
+
+#endif // header guard

File src/libraries/utf8/utf8/checked.h

 namespace utf8
 {
     // Base for the exceptions that may be thrown from the library
-    class exception : public std::exception {
+    class exception : public ::std::exception {
     };
 
     // Exceptions that may be thrown from the library functions.
 
     /// The library API - functions intended to be called by the users
 
-    template <typename octet_iterator, typename output_iterator>
-    output_iterator replace_invalid(octet_iterator start, octet_iterator end, output_iterator out, uint32_t replacement)
-    {
-        while (start != end) {
-            octet_iterator sequence_start = start;
-            internal::utf_error err_code = internal::validate_next(start, end);
-            switch (err_code) {
-                case internal::UTF8_OK :
-                    for (octet_iterator it = sequence_start; it != start; ++it)
-                        *out++ = *it;
-                    break;
-                case internal::NOT_ENOUGH_ROOM:
-                    throw not_enough_room();
-                case internal::INVALID_LEAD:
-                    append (replacement, out);
-                    ++start;
-                    break;
-                case internal::INCOMPLETE_SEQUENCE:
-                case internal::OVERLONG_SEQUENCE:
-                case internal::INVALID_CODE_POINT:
-                    append (replacement, out);
-                    ++start;
-                    // just one replacement mark for the sequence
-                    while (internal::is_trail(*start) && start != end)
-                        ++start;
-                    break;
-            }
-        }
-        return out;
-    }
-
-    template <typename octet_iterator, typename output_iterator>
-    inline output_iterator replace_invalid(octet_iterator start, octet_iterator end, output_iterator out)
-    {
-        static const uint32_t replacement_marker = internal::mask16(0xfffd);
-        return replace_invalid(start, end, out, replacement_marker);
-    }
-
     template <typename octet_iterator>
     octet_iterator append(uint32_t cp, octet_iterator result)
     {
-        if (!internal::is_code_point_valid(cp))
+        if (!utf8::internal::is_code_point_valid(cp))
             throw invalid_code_point(cp);
 
         if (cp < 0x80)                        // one octet
             *(result++) = static_cast<uint8_t>(((cp >> 6) & 0x3f)   | 0x80);
             *(result++) = static_cast<uint8_t>((cp & 0x3f)          | 0x80);
         }
-        else {      // four octets
+        else {                                // four octets
             *(result++) = static_cast<uint8_t>((cp >> 18)           | 0xf0);
             *(result++) = static_cast<uint8_t>(((cp >> 12) & 0x3f)  | 0x80);
             *(result++) = static_cast<uint8_t>(((cp >> 6) & 0x3f)   | 0x80);
         return result;
     }
 
+    template <typename octet_iterator, typename output_iterator>
+    output_iterator replace_invalid(octet_iterator start, octet_iterator end, output_iterator out, uint32_t replacement)
+    {
+        while (start != end) {
+            octet_iterator sequence_start = start;
+            internal::utf_error err_code = utf8::internal::validate_next(start, end);
+            switch (err_code) {
+                case internal::UTF8_OK :
+                    for (octet_iterator it = sequence_start; it != start; ++it)
+                        *out++ = *it;
+                    break;
+                case internal::NOT_ENOUGH_ROOM:
+                    throw not_enough_room();
+                case internal::INVALID_LEAD:
+                    out = utf8::append (replacement, out);
+                    ++start;
+                    break;
+                case internal::INCOMPLETE_SEQUENCE:
+                case internal::OVERLONG_SEQUENCE:
+                case internal::INVALID_CODE_POINT:
+                    out = utf8::append (replacement, out);
+                    ++start;
+                    // just one replacement mark for the sequence
+                    while (start != end && utf8::internal::is_trail(*start))
+                        ++start;
+                    break;
+            }
+        }
+        return out;
+    }
+
+    template <typename octet_iterator, typename output_iterator>
+    inline output_iterator replace_invalid(octet_iterator start, octet_iterator end, output_iterator out)
+    {
+        static const uint32_t replacement_marker = utf8::internal::mask16(0xfffd);
+        return utf8::replace_invalid(start, end, out, replacement_marker);
+    }
+
     template <typename octet_iterator>
     uint32_t next(octet_iterator& it, octet_iterator end)
     {
         uint32_t cp = 0;
-        internal::utf_error err_code = internal::validate_next(it, end, &cp);
+        internal::utf_error err_code = utf8::internal::validate_next(it, end, cp);
         switch (err_code) {
             case internal::UTF8_OK :
                 break;
     template <typename octet_iterator>
     uint32_t peek_next(octet_iterator it, octet_iterator end)
     {
-        return next(it, end);
+        return utf8::next(it, end);
     }
 
     template <typename octet_iterator>
 
         octet_iterator end = it;
         // Go back until we hit either a lead octet or start
-        while (internal::is_trail(*(--it)))
+        while (utf8::internal::is_trail(*(--it)))
             if (it == start)
                 throw invalid_utf8(*it); // error - no lead byte in the sequence
-        return peek_next(it, end);
+        return utf8::peek_next(it, end);
     }
 
     /// Deprecated in versions that include "prior"
     uint32_t previous(octet_iterator& it, octet_iterator pass_start)
     {
         octet_iterator end = it;
-        while (internal::is_trail(*(--it)))
+        while (utf8::internal::is_trail(*(--it)))
             if (it == pass_start)
                 throw invalid_utf8(*it); // error - no lead byte in the sequence
         octet_iterator temp = it;
-        return next(temp, end);
+        return utf8::next(temp, end);
     }
 
     template <typename octet_iterator, typename distance_type>
     void advance (octet_iterator& it, distance_type n, octet_iterator end)
     {
         for (distance_type i = 0; i < n; ++i)
-            next(it, end);
+            utf8::next(it, end);
     }
 
     template <typename octet_iterator>
     {
         typename std::iterator_traits<octet_iterator>::difference_type dist;
         for (dist = 0; first < last; ++dist)
-            next(first, last);
+            utf8::next(first, last);
         return dist;
     }
 
     octet_iterator utf16to8 (u16bit_iterator start, u16bit_iterator end, octet_iterator result)
     {
         while (start != end) {
-            uint32_t cp = internal::mask16(*start++);
+            uint32_t cp = utf8::internal::mask16(*start++);
             // Take care of surrogate pairs first
-            if (internal::is_lead_surrogate(cp)) {
+            if (utf8::internal::is_lead_surrogate(cp)) {
                 if (start != end) {
-                    uint32_t trail_surrogate = internal::mask16(*start++);
-                    if (internal::is_trail_surrogate(trail_surrogate))
+                    uint32_t trail_surrogate = utf8::internal::mask16(*start++);
+                    if (utf8::internal::is_trail_surrogate(trail_surrogate))
                         cp = (cp << 10) + trail_surrogate + internal::SURROGATE_OFFSET;
                     else
                         throw invalid_utf16(static_cast<uint16_t>(trail_surrogate));
 
             }
             // Lone trail surrogate
-            else if (internal::is_trail_surrogate(cp))
+            else if (utf8::internal::is_trail_surrogate(cp))
                 throw invalid_utf16(static_cast<uint16_t>(cp));
 
-            result = append(cp, result);
+            result = utf8::append(cp, result);
         }
         return result;
     }
     u16bit_iterator utf8to16 (octet_iterator start, octet_iterator end, u16bit_iterator result)
     {
         while (start != end) {
-            uint32_t cp = next(start, end);
+            uint32_t cp = utf8::next(start, end);
             if (cp > 0xffff) { //make a surrogate pair
                 *result++ = static_cast<uint16_t>((cp >> 10)   + internal::LEAD_OFFSET);
                 *result++ = static_cast<uint16_t>((cp & 0x3ff) + internal::TRAIL_SURROGATE_MIN);
     octet_iterator utf32to8 (u32bit_iterator start, u32bit_iterator end, octet_iterator result)
     {
         while (start != end)
-            result = append(*(start++), result);
+            result = utf8::append(*(start++), result);
 
         return result;
     }
     u32bit_iterator utf8to32 (octet_iterator start, octet_iterator end, u32bit_iterator result)
     {
         while (start != end)
-            (*result++) = next(start, end);
+            (*result++) = utf8::next(start, end);
 
         return result;
     }
       octet_iterator range_start;
       octet_iterator range_end;
       public:
-      iterator () {};
+      iterator () {}
       explicit iterator (const octet_iterator& octet_it,
                          const octet_iterator& range_start,
                          const octet_iterator& range_end) :
       uint32_t operator * () const
       {
           octet_iterator temp = it;
-          return next(temp, range_end);
+          return utf8::next(temp, range_end);
       }
       bool operator == (const iterator& rhs) const
       {
       }
       iterator& operator ++ ()
       {
-          next(it, range_end);
+          utf8::next(it, range_end);
           return *this;
       }
       iterator operator ++ (int)
       {
           iterator temp = *this;
-          next(it, range_end);
+          utf8::next(it, range_end);
           return temp;
       }
       iterator& operator -- ()
       {
-          prior(it, range_start);
+          utf8::prior(it, range_start);
           return *this;
       }
       iterator operator -- (int)
       {
           iterator temp = *this;
-          prior(it, range_start);
+          utf8::prior(it, range_start);
           return temp;
       }
     }; // class iterator

File src/libraries/utf8/utf8/core.h

     template<typename octet_type>
     inline bool is_trail(octet_type oc)
     {
-        return ((mask8(oc) >> 6) == 0x2);
+        return ((utf8::internal::mask8(oc) >> 6) == 0x2);
     }
 
     template <typename u16>
     template <typename u32>
     inline bool is_code_point_valid(u32 cp)
     {
-        return (cp <= CODE_POINT_MAX && !is_surrogate(cp));
+        return (cp <= CODE_POINT_MAX && !utf8::internal::is_surrogate(cp));
     }
 
     template <typename octet_iterator>
     inline typename std::iterator_traits<octet_iterator>::difference_type
     sequence_length(octet_iterator lead_it)
     {
-        uint8_t lead = mask8(*lead_it);
+        uint8_t lead = utf8::internal::mask8(*lead_it);
         if (lead < 0x80)
             return 1;
         else if ((lead >> 5) == 0x6)
 
     enum utf_error {UTF8_OK, NOT_ENOUGH_ROOM, INVALID_LEAD, INCOMPLETE_SEQUENCE, OVERLONG_SEQUENCE, INVALID_CODE_POINT};
 
+    /// Helper for get_sequence_x
+    template <typename octet_iterator>
+    utf_error increase_safely(octet_iterator& it, octet_iterator end)
+    {
+        if (++it == end)
+            return NOT_ENOUGH_ROOM;
+
+        if (!utf8::internal::is_trail(*it))
+            return INCOMPLETE_SEQUENCE;
+        
+        return UTF8_OK;
+    }
+
+    #define UTF8_CPP_INCREASE_AND_RETURN_ON_ERROR(IT, END) {utf_error ret = increase_safely(IT, END); if (ret != UTF8_OK) return ret;}    
+
     /// get_sequence_x functions decode utf-8 sequences of the length x
+    template <typename octet_iterator>
+    utf_error get_sequence_1(octet_iterator& it, octet_iterator end, uint32_t& code_point)
+    {
+        if (it == end)
+            return NOT_ENOUGH_ROOM;
 
-    template <typename octet_iterator>
-    utf_error get_sequence_1(octet_iterator& it, octet_iterator end, uint32_t* code_point)
-    {
-        if (it != end) {
-            if (code_point)
-                *code_point = mask8(*it);
-            return UTF8_OK;
-        }
-        return NOT_ENOUGH_ROOM;
+        code_point = utf8::internal::mask8(*it);
+
+        return UTF8_OK;
     }
 
     template <typename octet_iterator>
-    utf_error get_sequence_2(octet_iterator& it, octet_iterator end, uint32_t* code_point)
+    utf_error get_sequence_2(octet_iterator& it, octet_iterator end, uint32_t& code_point)
     {
-        utf_error ret_code = NOT_ENOUGH_ROOM;
+        if (it == end) 
+            return NOT_ENOUGH_ROOM;
+        
+        code_point = utf8::internal::mask8(*it);
 
-        if (it != end) {
-            uint32_t cp = mask8(*it);
-            if (++it != end) {
-                if (is_trail(*it)) {
-                    cp = ((cp << 6) & 0x7ff) + ((*it) & 0x3f);
+        UTF8_CPP_INCREASE_AND_RETURN_ON_ERROR(it, end)
 
-                    if (code_point)
-                        *code_point = cp;
-                    ret_code = UTF8_OK;
-                }
-                else
-                    ret_code = INCOMPLETE_SEQUENCE;
-            }
-            else
-                ret_code = NOT_ENOUGH_ROOM;
-        }
+        code_point = ((code_point << 6) & 0x7ff) + ((*it) & 0x3f);
 
-        return ret_code;
+        return UTF8_OK;
     }
 
     template <typename octet_iterator>
-    utf_error get_sequence_3(octet_iterator& it, octet_iterator end, uint32_t* code_point)
+    utf_error get_sequence_3(octet_iterator& it, octet_iterator end, uint32_t& code_point)
     {
-        utf_error ret_code = NOT_ENOUGH_ROOM;
+        if (it == end)
+            return NOT_ENOUGH_ROOM;
+            
+        code_point = utf8::internal::mask8(*it);
 
-        if (it != end) {
-            uint32_t cp = mask8(*it);
-            if (++it != end) {
-                if (is_trail(*it)) {
-                    cp = ((cp << 12) & 0xffff) + ((mask8(*it) << 6) & 0xfff);
-                    if (++it != end) {
-                        if (is_trail(*it)) {
-                            cp += (*it) & 0x3f;
+        UTF8_CPP_INCREASE_AND_RETURN_ON_ERROR(it, end)
 
-                            if (code_point)
-                                *code_point = cp;
-                            ret_code = UTF8_OK;
-                        }
-                        else 
-                            ret_code = INCOMPLETE_SEQUENCE;
-                    }
-                    else
-                        ret_code = NOT_ENOUGH_ROOM;
-                }
-                else
-                    ret_code = INCOMPLETE_SEQUENCE;
-            }
-            else
-                ret_code = NOT_ENOUGH_ROOM;
-        }
+        code_point = ((code_point << 12) & 0xffff) + ((utf8::internal::mask8(*it) << 6) & 0xfff);
 
-        return ret_code;
+        UTF8_CPP_INCREASE_AND_RETURN_ON_ERROR(it, end)
+
+        code_point += (*it) & 0x3f;
+
+        return UTF8_OK;
     }
 
     template <typename octet_iterator>
-    utf_error get_sequence_4(octet_iterator& it, octet_iterator end, uint32_t* code_point)
+    utf_error get_sequence_4(octet_iterator& it, octet_iterator end, uint32_t& code_point)
     {
-        utf_error ret_code = NOT_ENOUGH_ROOM;
+        if (it == end)
+           return NOT_ENOUGH_ROOM;
 
-        if (it != end) {
-            uint32_t cp = mask8(*it);
-            if (++it != end) {
-                if (is_trail(*it)) {
-                    cp = ((cp << 18) & 0x1fffff) + ((mask8(*it) << 12) & 0x3ffff);
-                    if (++it != end) {
-                        if (is_trail(*it)) {
-                            cp += (mask8(*it) << 6) & 0xfff;
-                            if (++it != end) {
-                                if (is_trail(*it)) {
-                                    cp += (*it) & 0x3f;
+        code_point = utf8::internal::mask8(*it);
 
-                                    if (code_point)
-                                        *code_point = cp;
-                                    ret_code = UTF8_OK;
-                                }
-                                else
-                                    ret_code = INCOMPLETE_SEQUENCE;
-                            }
-                            else
-                                ret_code = NOT_ENOUGH_ROOM;
-                        }
-                        else
-                            ret_code = INCOMPLETE_SEQUENCE;
-                    }
-                    else
-                        ret_code = NOT_ENOUGH_ROOM;
-                }
-                else 
-                    ret_code = INCOMPLETE_SEQUENCE;
-            }
-            else
-                ret_code = NOT_ENOUGH_ROOM;
-        }
+        UTF8_CPP_INCREASE_AND_RETURN_ON_ERROR(it, end)
 
-        return ret_code;
+        code_point = ((code_point << 18) & 0x1fffff) + ((utf8::internal::mask8(*it) << 12) & 0x3ffff);
+
+        UTF8_CPP_INCREASE_AND_RETURN_ON_ERROR(it, end)
+
+        code_point += (utf8::internal::mask8(*it) << 6) & 0xfff;
+
+        UTF8_CPP_INCREASE_AND_RETURN_ON_ERROR(it, end)
+
+        code_point += (*it) & 0x3f;
+
+        return UTF8_OK;
     }
 
+    #undef UTF8_CPP_INCREASE_AND_RETURN_ON_ERROR
+
     template <typename octet_iterator>
-    utf_error validate_next(octet_iterator& it, octet_iterator end, uint32_t* code_point)
+    utf_error validate_next(octet_iterator& it, octet_iterator end, uint32_t& code_point)
     {
         // Save the original value of it so we can go back in case of failure
         // Of course, it does not make much sense with i.e. stream iterators
         uint32_t cp = 0;
         // Determine the sequence length based on the lead octet
         typedef typename std::iterator_traits<octet_iterator>::difference_type octet_difference_type;
-        octet_difference_type length = sequence_length(it);
-        if (length == 0)
-            return INVALID_LEAD;
+        const octet_difference_type length = utf8::internal::sequence_length(it);
 
-        // Now that we have a valid sequence length, get trail octets and calculate the code point
+        // Get trail octets and calculate the code point
         utf_error err = UTF8_OK;
         switch (length) {
+            case 0: 
+                return INVALID_LEAD;
             case 1:
-                err = get_sequence_1(it, end, &cp);
+                err = utf8::internal::get_sequence_1(it, end, cp);
                 break;
             case 2:
-                err = get_sequence_2(it, end, &cp);
+                err = utf8::internal::get_sequence_2(it, end, cp);
             break;
             case 3:
-                err = get_sequence_3(it, end, &cp);
+                err = utf8::internal::get_sequence_3(it, end, cp);
             break;
             case 4:
-                err = get_sequence_4(it, end, &cp);
+                err = utf8::internal::get_sequence_4(it, end, cp);
             break;
         }
 
         if (err == UTF8_OK) {
             // Decoding succeeded. Now, security checks...
-            if (is_code_point_valid(cp)) {
-                if (!is_overlong_sequence(cp, length)){
+            if (utf8::internal::is_code_point_valid(cp)) {
+                if (!utf8::internal::is_overlong_sequence(cp, length)){
                     // Passed! Return here.
-                    if (code_point)
-                        *code_point = cp;
+                    code_point = cp;
                     ++it;
                     return UTF8_OK;
                 }
 
     template <typename octet_iterator>
     inline utf_error validate_next(octet_iterator& it, octet_iterator end) {
-        return validate_next(it, end, 0);
+        uint32_t ignored;
+        return utf8::internal::validate_next(it, end, ignored);
     }
 
 } // namespace internal
     {
         octet_iterator result = start;
         while (result != end) {
-            internal::utf_error err_code = internal::validate_next(result, end);
+            utf8::internal::utf_error err_code = utf8::internal::validate_next(result, end);
             if (err_code != internal::UTF8_OK)
                 return result;
         }
     template <typename octet_iterator>
     inline bool is_valid(octet_iterator start, octet_iterator end)
     {
-        return (find_invalid(start, end) == end);
+        return (utf8::find_invalid(start, end) == end);
     }
 
     template <typename octet_iterator>
     inline bool starts_with_bom (octet_iterator it, octet_iterator end)
     {
         return (
-            ((it != end) && (internal::mask8(*it++)) == bom[0]) &&
-            ((it != end) && (internal::mask8(*it++)) == bom[1]) &&
-            ((it != end) && (internal::mask8(*it))   == bom[2])
+            ((it != end) && (utf8::internal::mask8(*it++)) == bom[0]) &&
+            ((it != end) && (utf8::internal::mask8(*it++)) == bom[1]) &&
+            ((it != end) && (utf8::internal::mask8(*it))   == bom[2])
            );
     }
 	
-	//Deprecated in release 2.3 
+    //Deprecated in release 2.3 
     template <typename octet_iterator>
     inline bool is_bom (octet_iterator it)
     {
         return (
-            (internal::mask8(*it++)) == bom[0] &&
-            (internal::mask8(*it++)) == bom[1] &&
-            (internal::mask8(*it))   == bom[2]
+            (utf8::internal::mask8(*it++)) == bom[0] &&
+            (utf8::internal::mask8(*it++)) == bom[1] &&
+            (utf8::internal::mask8(*it))   == bom[2]
            );
     }
 } // namespace utf8

File src/libraries/utf8/utf8/unchecked.h

         template <typename octet_iterator>
         uint32_t next(octet_iterator& it)
         {
-            uint32_t cp = internal::mask8(*it);
+            uint32_t cp = utf8::internal::mask8(*it);
             typename std::iterator_traits<octet_iterator>::difference_type length = utf8::internal::sequence_length(it);
             switch (length) {
                 case 1:
                     break;
                 case 3:
                     ++it; 
-                    cp = ((cp << 12) & 0xffff) + ((internal::mask8(*it) << 6) & 0xfff);
+                    cp = ((cp << 12) & 0xffff) + ((utf8::internal::mask8(*it) << 6) & 0xfff);
                     ++it;
                     cp += (*it) & 0x3f;
                     break;
                 case 4:
                     ++it;
-                    cp = ((cp << 18) & 0x1fffff) + ((internal::mask8(*it) << 12) & 0x3ffff);                
+                    cp = ((cp << 18) & 0x1fffff) + ((utf8::internal::mask8(*it) << 12) & 0x3ffff);                
                     ++it;
-                    cp += (internal::mask8(*it) << 6) & 0xfff;
+                    cp += (utf8::internal::mask8(*it) << 6) & 0xfff;
                     ++it;
                     cp += (*it) & 0x3f; 
                     break;
         template <typename octet_iterator>
         uint32_t peek_next(octet_iterator it)
         {
-            return next(it);    
+            return utf8::unchecked::next(it);    
         }
 
         template <typename octet_iterator>
         uint32_t prior(octet_iterator& it)
         {
-            while (internal::is_trail(*(--it))) ;
+            while (utf8::internal::is_trail(*(--it))) ;
             octet_iterator temp = it;
-            return next(temp);
+            return utf8::unchecked::next(temp);
         }
 
         // Deprecated in versions that include prior, but only for the sake of consistency (see utf8::previous)
         template <typename octet_iterator>
         inline uint32_t previous(octet_iterator& it)
         {
-            return prior(it);
+            return utf8::unchecked::prior(it);
         }
 
         template <typename octet_iterator, typename distance_type>
         void advance (octet_iterator& it, distance_type n)
         {
             for (distance_type i = 0; i < n; ++i)
-                next(it);
+                utf8::unchecked::next(it);
         }
 
         template <typename octet_iterator>
         {
             typename std::iterator_traits<octet_iterator>::difference_type dist;
             for (dist = 0; first < last; ++dist) 
-                next(first);
+                utf8::unchecked::next(first);
             return dist;
         }
 
         octet_iterator utf16to8 (u16bit_iterator start, u16bit_iterator end, octet_iterator result)
         {       
             while (start != end) {
-                uint32_t cp = internal::mask16(*start++);
+                uint32_t cp = utf8::internal::mask16(*start++);
             // Take care of surrogate pairs first
-                if (internal::is_lead_surrogate(cp)) {
-                    uint32_t trail_surrogate = internal::mask16(*start++);
+                if (utf8::internal::is_lead_surrogate(cp)) {
+                    uint32_t trail_surrogate = utf8::internal::mask16(*start++);
                     cp = (cp << 10) + trail_surrogate + internal::SURROGATE_OFFSET;
                 }
-                result = append(cp, result);
+                result = utf8::unchecked::append(cp, result);
             }
             return result;         
         }
         u16bit_iterator utf8to16 (octet_iterator start, octet_iterator end, u16bit_iterator result)
         {
             while (start < end) {
-                uint32_t cp = next(start);
+                uint32_t cp = utf8::unchecked::next(start);
                 if (cp > 0xffff) { //make a surrogate pair
                     *result++ = static_cast<uint16_t>((cp >> 10)   + internal::LEAD_OFFSET);
                     *result++ = static_cast<uint16_t>((cp & 0x3ff) + internal::TRAIL_SURROGATE_MIN);
         octet_iterator utf32to8 (u32bit_iterator start, u32bit_iterator end, octet_iterator result)
         {
             while (start != end)
-                result = append(*(start++), result);
+                result = utf8::unchecked::append(*(start++), result);
 
             return result;
         }
         u32bit_iterator utf8to32 (octet_iterator start, octet_iterator end, u32bit_iterator result)
         {
             while (start < end)
-                (*result++) = next(start);
+                (*result++) = utf8::unchecked::next(start);
 
             return result;
         }
           class iterator : public std::iterator <std::bidirectional_iterator_tag, uint32_t> { 
             octet_iterator it;
             public:
-            iterator () {};
+            iterator () {}
             explicit iterator (const octet_iterator& octet_it): it(octet_it) {}
             // the default "big three" are OK
             octet_iterator base () const { return it; }
             uint32_t operator * () const
             {
                 octet_iterator temp = it;
-                return next(temp);
+                return utf8::unchecked::next(temp);
             }
             bool operator == (const iterator& rhs) const 
             { 
             }
             iterator& operator ++ () 
             {
-                std::advance(it, internal::sequence_length(it));
+                ::std::advance(it, utf8::internal::sequence_length(it));
                 return *this;
             }
             iterator operator ++ (int)
             {
                 iterator temp = *this;
-                std::advance(it, internal::sequence_length(it));
+                ::std::advance(it, utf8::internal::sequence_length(it));
                 return temp;
             }  
             iterator& operator -- ()
             {
-                prior(it);
+                utf8::unchecked::prior(it);
                 return *this;
             }
             iterator operator -- (int)
             {
                 iterator temp = *this;
-                prior(it);
+                utf8::unchecked::prior(it);
                 return temp;
             }
           }; // class iterator