124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerimport readline
224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerimport code
324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerimport sys
424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerimport traceback
524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerclass SimpleREPL(code.InteractiveConsole):
724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner   def __init__(self, prompt, dict):
824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner       code.InteractiveConsole.__init__(self,dict)
924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner       self.prompt = prompt
1024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner       self.loop_exit = False
1124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner       self.dict = dict
1224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
1324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner   def interact(self):
1424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner       try:
1524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner           sys.ps1
1624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner       except AttributeError:
1724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner           sys.ps1 = ">>> "
1824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner       try:
1924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner           sys.ps2
2024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner       except AttributeError:
2124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner           sys.ps2 = "... "
2224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
2324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner       while not self.loop_exit:
2424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner           try:
2524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner               self.read_py_command()
2624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner           except (SystemExit, EOFError):
2724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner               # EOF while in Python just breaks out to top level.
2824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner               self.write('\n')
2924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner               self.loop_exit = True
3024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner               break
3124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner           except KeyboardInterrupt:
3224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner               self.write("\nKeyboardInterrupt\n")
3324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner               self.resetbuffer()
3424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner               more = 0
3524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner           except:
3624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner               traceback.print_exc()
3724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
3824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner   def process_input (self, in_str):
3924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner      # Canonicalize the format of the input string
4024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner      temp_str = in_str
4124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner      temp_str.strip(' \t')
4224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner      words = temp_str.split()
4324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner      temp_str = ('').join(words)
4424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
4524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner      # Check the input string to see if it was the quit
4624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner      # command.  If so, intercept it, so that it doesn't
4724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner      # close stdin on us!
48a8a5e562db734341149365d2bf7fd501365ed701Jason Molenda      if (temp_str.lower() == "quit()" or temp_str.lower() == "exit()"):
4924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner         self.loop_exit = True
5024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner         in_str = "raise SystemExit "
5124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner      return in_str
5224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
5324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner   def my_raw_input (self, prompt):
5424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner      stream = sys.stdout
5524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner      stream.write (prompt)
5624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner      stream.flush ()
5724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner      try:
5824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner         line = sys.stdin.readline()
5924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner      except KeyboardInterrupt:
6024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner         line = " \n"
6124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner      except (SystemExit, EOFError):
6224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner         line = "quit()\n"
6324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner      if not line:
6424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner         raise EOFError
6524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner      if line[-1] == '\n':
6624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner         line = line[:-1]
6724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner      return line
6824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
6924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner   def read_py_command(self):
7024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner       # Read off a complete Python command.
7124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner       more = 0
7224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner       while 1:
7324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner           if more:
7424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner               prompt = sys.ps2
7524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner           else:
7624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner               prompt = sys.ps1
7724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner           line = self.my_raw_input(prompt)
7824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner           # Can be None if sys.stdin was redefined
7924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner           encoding = getattr(sys.stdin, "encoding", None)
8024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner           if encoding and not isinstance(line, unicode):
8124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner               line = line.decode(encoding)
8224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner           line = self.process_input (line)
8324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner           more = self.push(line)
8424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner           if not more:
8524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner               break
8624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
870aa2e55f0e9422405ad33675adc1e35044537adbCaroline Tice   def one_line (self, input):
880aa2e55f0e9422405ad33675adc1e35044537adbCaroline Tice      line = self.process_input (input)
890aa2e55f0e9422405ad33675adc1e35044537adbCaroline Tice      more = self.push(line)
900aa2e55f0e9422405ad33675adc1e35044537adbCaroline Tice      if more:
910aa2e55f0e9422405ad33675adc1e35044537adbCaroline Tice         self.write ("Input not a complete line.")
920aa2e55f0e9422405ad33675adc1e35044537adbCaroline Tice         self.resetbuffer()
930aa2e55f0e9422405ad33675adc1e35044537adbCaroline Tice         more = 0
940aa2e55f0e9422405ad33675adc1e35044537adbCaroline Tice
9524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerdef run_python_interpreter (dict):
9624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner   # Pass in the dictionary, for continuity from one session to the next.
9724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner   repl = SimpleREPL('>>> ', dict)
9824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner   repl.interact()
990aa2e55f0e9422405ad33675adc1e35044537adbCaroline Tice
1000aa2e55f0e9422405ad33675adc1e35044537adbCaroline Ticedef run_one_line (dict, input_string):
1010aa2e55f0e9422405ad33675adc1e35044537adbCaroline Tice   repl = SimpleREPL ('', dict)
1020aa2e55f0e9422405ad33675adc1e35044537adbCaroline Tice   repl.one_line (input_string)
1030aa2e55f0e9422405ad33675adc1e35044537adbCaroline Tice
104