# XXX This is broken with class exceptions

"""Utilities dealing with code objects."""

def compile_command(source, filename="<input>", symbol="single"):
    r"""Compile a command and determine whether it is incomplete.

    Arguments:

    source -- the source string; may contain \n characters
    filename -- optional filename from which source was read; default "<input>"
    symbol -- optional grammar start symbol; "single" (default) or "eval"

    Return value / exception raised:

    - Return a code object if the command is complete and valid
    - Return None if the command is incomplete
    - Raise SyntaxError if the command is a syntax error

    Approach:
    
    Compile three times: as is, with \n, and with \n\n appended.  If
    it compiles as is, it's complete.  If it compiles with one \n
    appended, we expect more.  If it doesn't compile either way, we
    compare the error we get when compiling with \n or \n\n appended.
    If the errors are the same, the code is broken.  But if the errors
    are different, we expect more.  Not intuitive; not even guaranteed
    to hold in future releases; but this matches the compiler's
    behavior in Python 1.4 and 1.5.

    """

    err = err1 = err2 = None
    code = code1 = code2 = None

    try:
	code = compile(source, filename, symbol)
    except SyntaxError, err:
	pass

    try:
	code1 = compile(source + "\n", filename, symbol)
    except SyntaxError, err1:
	pass

    try:
	code2 = compile(source + "\n\n", filename, symbol)
    except SyntaxError, err2:
	pass

    if code:
	return code
    if not code1 and err1 == err2:
	raise SyntaxError, err1


def interact(banner=None, readfunc=raw_input, local=None):
    # Due to Jeff Epler, with changes by Guido:
    """Closely emulate the interactive Python console."""
    try: import readline # Enable GNU readline if available
    except: pass
    local = local or {}
    import sys, string, traceback
    sys.ps1 = '>>> '
    sys.ps2 = '... '
    if banner:
	print banner
    else:
	print "Python Interactive Console", sys.version
	print sys.copyright
    buf = []
    while 1:
	if buf: prompt = sys.ps2
	else: prompt = sys.ps1
	try: line = readfunc(prompt)
	except KeyboardInterrupt:
	    print "\nKeyboardInterrupt"
	    buf = []
	    continue
	except EOFError: break
	buf.append(line)
	try: x = compile_command(string.join(buf, "\n"))
	except SyntaxError:
	    traceback.print_exc(0)
	    buf = []
	    continue
	if x == None: continue
	else:
	    try: exec x in local
	    except:
		exc_type, exc_value, exc_traceback = \
			sys.exc_type, sys.exc_value, \
			sys.exc_traceback
		l = len(traceback.extract_tb(sys.exc_traceback))
		try: 1/0
		except:
		    m = len(traceback.extract_tb(
			    sys.exc_traceback))
		traceback.print_exception(exc_type,
			exc_value, exc_traceback, l-m)
	    buf = []
		
if __name__ == '__main__':
    interact()
