🚧 fixed an issue with ensure_ascii #1198
This commit is contained in:
		
							parent
							
								
									c7af027cbb
								
							
						
					
					
						commit
						c51b1e6fab
					
				
					 3 changed files with 20 additions and 2 deletions
				
			
		|  | @ -302,6 +302,7 @@ class serializer | |||
| 
 | ||||
|         // number of bytes written at the point of the last valid byte
 | ||||
|         std::size_t bytes_after_last_accept = 0; | ||||
|         std::size_t undumped_chars = 0; | ||||
| 
 | ||||
|         for (std::size_t i = 0; i < s.size(); ++i) | ||||
|         { | ||||
|  | @ -403,6 +404,7 @@ class serializer | |||
| 
 | ||||
|                     // remember the byte position of this accept
 | ||||
|                     bytes_after_last_accept = bytes; | ||||
|                     undumped_chars = 0; | ||||
|                     break; | ||||
|                 } | ||||
| 
 | ||||
|  | @ -424,7 +426,7 @@ class serializer | |||
|                             // would like to read it again, because the byte
 | ||||
|                             // may be OK for itself, but just not OK for the
 | ||||
|                             // previous sequence
 | ||||
|                             if (bytes_after_last_accept != bytes) | ||||
|                             if (undumped_chars > 0) | ||||
|                             { | ||||
|                                 --i; | ||||
|                             } | ||||
|  | @ -454,6 +456,8 @@ class serializer | |||
|                                 bytes_after_last_accept = bytes; | ||||
|                             } | ||||
| 
 | ||||
|                             undumped_chars = 0; | ||||
| 
 | ||||
|                             // continue processing the string
 | ||||
|                             state = UTF8_ACCEPT; | ||||
|                             continue; | ||||
|  | @ -468,6 +472,7 @@ class serializer | |||
|                         // code point will not be escaped - copy byte to buffer
 | ||||
|                         string_buffer[bytes++] = s[i]; | ||||
|                     } | ||||
|                     ++undumped_chars; | ||||
|                     break; | ||||
|                 } | ||||
|             } | ||||
|  |  | |||
|  | @ -10254,6 +10254,7 @@ class serializer | |||
| 
 | ||||
|         // number of bytes written at the point of the last valid byte
 | ||||
|         std::size_t bytes_after_last_accept = 0; | ||||
|         std::size_t undumped_chars = 0; | ||||
| 
 | ||||
|         for (std::size_t i = 0; i < s.size(); ++i) | ||||
|         { | ||||
|  | @ -10355,6 +10356,7 @@ class serializer | |||
| 
 | ||||
|                     // remember the byte position of this accept
 | ||||
|                     bytes_after_last_accept = bytes; | ||||
|                     undumped_chars = 0; | ||||
|                     break; | ||||
|                 } | ||||
| 
 | ||||
|  | @ -10376,7 +10378,7 @@ class serializer | |||
|                             // would like to read it again, because the byte
 | ||||
|                             // may be OK for itself, but just not OK for the
 | ||||
|                             // previous sequence
 | ||||
|                             if (bytes_after_last_accept != bytes) | ||||
|                             if (undumped_chars > 0) | ||||
|                             { | ||||
|                                 --i; | ||||
|                             } | ||||
|  | @ -10406,6 +10408,8 @@ class serializer | |||
|                                 bytes_after_last_accept = bytes; | ||||
|                             } | ||||
| 
 | ||||
|                             undumped_chars = 0; | ||||
| 
 | ||||
|                             // continue processing the string
 | ||||
|                             state = UTF8_ACCEPT; | ||||
|                             continue; | ||||
|  | @ -10420,6 +10424,7 @@ class serializer | |||
|                         // code point will not be escaped - copy byte to buffer
 | ||||
|                         string_buffer[bytes++] = s[i]; | ||||
|                     } | ||||
|                     ++undumped_chars; | ||||
|                     break; | ||||
|                 } | ||||
|             } | ||||
|  |  | |||
|  | @ -76,8 +76,12 @@ void check_utf8dump(bool success_expected, int byte1, int byte2 = -1, int byte3 | |||
|     // dumping with ignore/replace must not throw in any case
 | ||||
|     auto s_ignored = j.dump(-1, ' ', false, json::error_handler_t::ignore); | ||||
|     auto s_ignored2 = j2.dump(-1, ' ', false, json::error_handler_t::ignore); | ||||
|     auto s_ignored_ascii = j.dump(-1, ' ', true, json::error_handler_t::ignore); | ||||
|     auto s_ignored2_ascii = j2.dump(-1, ' ', true, json::error_handler_t::ignore); | ||||
|     auto s_replaced = j.dump(-1, ' ', false, json::error_handler_t::replace); | ||||
|     auto s_replaced2 = j2.dump(-1, ' ', false, json::error_handler_t::replace); | ||||
|     auto s_replaced_ascii = j.dump(-1, ' ', true, json::error_handler_t::replace); | ||||
|     auto s_replaced2_ascii = j2.dump(-1, ' ', true, json::error_handler_t::replace); | ||||
| 
 | ||||
|     if (success_expected) | ||||
|     { | ||||
|  | @ -102,8 +106,12 @@ void check_utf8dump(bool success_expected, int byte1, int byte2 = -1, int byte3 | |||
|     // check that prefix and suffix are preserved
 | ||||
|     CHECK(s_ignored2.substr(1, 3) == "abc"); | ||||
|     CHECK(s_ignored2.substr(s_ignored2.size() - 4, 3) == "xyz"); | ||||
|     CHECK(s_ignored2_ascii.substr(1, 3) == "abc"); | ||||
|     CHECK(s_ignored2_ascii.substr(s_ignored2_ascii.size() - 4, 3) == "xyz"); | ||||
|     CHECK(s_replaced2.substr(1, 3) == "abc"); | ||||
|     CHECK(s_replaced2.substr(s_replaced2.size() - 4, 3) == "xyz"); | ||||
|     CHECK(s_replaced2_ascii.substr(1, 3) == "abc"); | ||||
|     CHECK(s_replaced2_ascii.substr(s_replaced2_ascii.size() - 4, 3) == "xyz"); | ||||
| } | ||||
| 
 | ||||
| void check_utf8string(bool success_expected, int byte1, int byte2, int byte3, int byte4); | ||||
|  |  | |||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue