From add9d783f81bca2497d2feb9fed08a13a761568b Mon Sep 17 00:00:00 2001 From: Patrick Surry Date: Mon, 11 Sep 2023 20:23:57 -0400 Subject: [PATCH] Fix python3 byte decoding for non-windows platforms --- py65/utils/console.py | 67 +++++++++++++++++++++---------------------- 1 file changed, 32 insertions(+), 35 deletions(-) diff --git a/py65/utils/console.py b/py65/utils/console.py index cc9987f..ed4127e 100644 --- a/py65/utils/console.py +++ b/py65/utils/console.py @@ -24,10 +24,7 @@ if sys.platform[:3] == "win": is available. Does not echo the character. The stdin argument is for function signature compatibility and is ignored. """ - c = msvcrt.getch() - if isinstance(c, bytes): # Python 3 - c = c.decode('latin-1') - return c + return maybedecode(msvcrt.getch()) def getch_noblock(stdin): """ Read one character from the Windows console without blocking. @@ -142,38 +139,8 @@ else: # Quietly ignore termios errors, such as stdin not being a tty. pass - def getch(stdin): - """ Read one character from stdin, blocking until one is available. - Does not echo the character. - """ - # Try to get a character with a non-blocking read. + def _getchnb(stdin): char = '' - noncanonical_mode(stdin) - # If we didn't get a character, ask again. - while char == '': - try: - # On OSX, calling read when no data is available causes the - # file handle to never return any future data, so we need to - # use select to make sure there is at least one char to read. - rd,wr,er = select([stdin], [], [], 0.01) - if rd != []: - char = stdin.read(1) - except KeyboardInterrupt: - # Pass along a CTRL-C interrupt. - raise - except: - pass - return char - - def getch_noblock(stdin): - """ Read one character from stdin without blocking. Does not echo the - character. If no character is available, an empty string is returned. - """ - char = '' - - # Using non-blocking read - noncanonical_mode(stdin) - try: # On OSX, calling read when no data is available causes the # file handle to never return any future data, so we need to @@ -186,6 +153,30 @@ else: raise except: pass + return maybedecode(char) + + def getch(stdin): + """ Read one character from stdin, blocking until one is available. + Does not echo the character. + """ + # Try to get a character with a non-blocking read. + noncanonical_mode(stdin) + # If we didn't get a character, ask again. + while True: + char = _getchnb(stdin) + if len(char): + break + + return char + + def getch_noblock(stdin): + """ Read one character from stdin without blocking. Does not echo the + character. If no character is available, an empty string is returned. + """ + # Using non-blocking read + noncanonical_mode(stdin) + + char = _getchnb(stdin) # Convert linefeeds to carriage returns. if len(char) and ord(char) == 10: @@ -193,6 +184,12 @@ else: return char +def maybedecode(c): + if len(c) and isinstance(c, bytes): # Python 3 + c = c.decode('latin-1') + return c + + def line_input(prompt='', stdin=sys.stdin, stdout=sys.stdout): """ Read a line from stdin, printing each character as it is typed. Does not echo a newline at the end. This allows the calling program