blob: e07019f2a8b72f14e7dfed463197141df2e31cd4 [file] [log] [blame]
Guido van Rossumb53e6781992-01-24 01:12:17 +00001# A generic class to build line-oriented command interpreters
2
3import string
4import sys
5import linecache
6
7PROMPT = '(Cmd) '
8IDENTCHARS = string.letters + string.digits + '_'
9
10class Cmd:
11
12 def init(self):
13 self.prompt = PROMPT
14 self.identchars = IDENTCHARS
15 self.lastcmd = ''
16 return self
17
18 def cmdloop(self):
19 stop = None
20 while not stop:
21 try:
22 line = raw_input(self.prompt)
23 except EOFError:
24 line = 'EOF'
25 stop = self.onecmd(line)
26
27 def onecmd(self, line):
28 line = string.strip(line)
29 if not line:
30 line = self.lastcmd
Guido van Rossumb53e6781992-01-24 01:12:17 +000031 else:
32 self.lastcmd = line
33 i, n = 0, len(line)
34 while i < n and line[i] in self.identchars: i = i+1
35 cmd, arg = line[:i], string.strip(line[i:])
36 if cmd == '':
37 return self.default(line)
38 else:
39 try:
40 func = eval('self.do_' + cmd)
41 except AttributeError:
42 return self.default(line)
43 return func(arg)
44
45 def default(self, line):
46 print '*** Unknown syntax:', line
47
48 def do_help(self, arg):
49 if arg:
50 # XXX check arg syntax
51 try:
52 func = eval('self.help_' + arg)
53 except:
54 print '*** No help on', `arg`
55 return
56 func()
57 else:
Guido van Rossum732282f1992-08-19 16:49:37 +000058 import newdir
59 names = newdir.dir(self)
Guido van Rossumb53e6781992-01-24 01:12:17 +000060 cmds = []
61 for name in names:
62 if name[:3] == 'do_':
63 cmds.append(name[3:])
64 print cmds