mirror of
				https://github.com/python/cpython.git
				synced 2025-10-30 21:21:22 +00:00 
			
		
		
		
	 0c7045378f
			
		
	
	
		0c7045378f
		
			
		
	
	
	
	
		
			
			gh-126332: Fix pyrepl crash for double ctrl-z in line overflow (GH-126650)
(cherry picked from commit d147e5e52c)
Co-authored-by: Pieter Eendebak <pieter.eendebak@gmail.com>
Co-authored-by: blurb-it[bot] <43283697+blurb-it[bot]@users.noreply.github.com>
		
	
			
		
			
				
	
	
		
			25 lines
		
	
	
	
		
			616 B
		
	
	
	
		
			Python
		
	
	
	
	
	
			
		
		
	
	
			25 lines
		
	
	
	
		
			616 B
		
	
	
	
		
			Python
		
	
	
	
	
	
| import re
 | |
| import unicodedata
 | |
| import functools
 | |
| 
 | |
| ANSI_ESCAPE_SEQUENCE = re.compile(r"\x1b\[[ -@]*[A-~]")
 | |
| 
 | |
| 
 | |
| @functools.cache
 | |
| def str_width(c: str) -> int:
 | |
|     if ord(c) < 128:
 | |
|         return 1
 | |
|     w = unicodedata.east_asian_width(c)
 | |
|     if w in ('N', 'Na', 'H', 'A'):
 | |
|         return 1
 | |
|     return 2
 | |
| 
 | |
| 
 | |
| def wlen(s: str) -> int:
 | |
|     if len(s) == 1 and s != '\x1a':
 | |
|         return str_width(s)
 | |
|     length = sum(str_width(i) for i in s)
 | |
|     # remove lengths of any escape sequences
 | |
|     sequence = ANSI_ESCAPE_SEQUENCE.findall(s)
 | |
|     ctrl_z_cnt = s.count('\x1a')
 | |
|     return length - sum(len(i) for i in sequence) + ctrl_z_cnt
 |