mirror of
				https://github.com/yt-dlp/yt-dlp.git
				synced 2025-10-30 22:25:19 +00:00 
			
		
		
		
	[utils] Fix _windows_write_string (Fixes #2779)
It turns out that the function did not work for outputs longer than 1024 UCS-2 tokens. Write non-BMP characters one by one to ensure that we count correctly.
This commit is contained in:
		| @@ -923,9 +923,6 @@ def _windows_write_string(s, out): | |||||||
|         2: -12, |         2: -12, | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     def ucs2_len(s): |  | ||||||
|         return sum((2 if ord(c) > 0xffff else 1) for c in s) |  | ||||||
|  |  | ||||||
|     fileno = out.fileno() |     fileno = out.fileno() | ||||||
|     if fileno not in WIN_OUTPUT_IDS: |     if fileno not in WIN_OUTPUT_IDS: | ||||||
|         return False |         return False | ||||||
| @@ -959,13 +956,25 @@ def _windows_write_string(s, out): | |||||||
|     if not_a_console(h): |     if not_a_console(h): | ||||||
|         return False |         return False | ||||||
|  |  | ||||||
|     remaining = ucs2_len(s) |     def next_nonbmp_pos(s): | ||||||
|     while remaining > 0: |         try: | ||||||
|  |             return next(i for i, c in enumerate(s) if ord(c) > 0xffff) | ||||||
|  |         except StopIteration: | ||||||
|  |             return len(s) | ||||||
|  |  | ||||||
|  |     while s: | ||||||
|  |         count = min(next_nonbmp_pos(s), 1024) | ||||||
|  |  | ||||||
|         ret = WriteConsoleW( |         ret = WriteConsoleW( | ||||||
|             h, s, min(remaining, 1024), ctypes.byref(written), None) |             h, s, count if count else 2, ctypes.byref(written), None) | ||||||
|         if ret == 0: |         if ret == 0: | ||||||
|             raise OSError('Failed to write string') |             raise OSError('Failed to write string') | ||||||
|         remaining -= written.value |         if not count:  # We just wrote a non-BMP character | ||||||
|  |             assert written.value == 2 | ||||||
|  |             s = s[1:] | ||||||
|  |         else: | ||||||
|  |             assert written.value > 0 | ||||||
|  |             s = s[written.value:] | ||||||
|     return True |     return True | ||||||
|  |  | ||||||
|  |  | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user
	 Philipp Hagemeister
					Philipp Hagemeister