blob: d28e3932861e7d6b7ce18e3ca0c85aee93f782f8 [file] [log] [blame]
# A generic class to build line-oriented command interpreters
import string
import sys
import linecache
PROMPT = '(Cmd) '
IDENTCHARS = string.letters + string.digits + '_'
class Cmd:
def init(self):
self.prompt = PROMPT
self.identchars = IDENTCHARS
self.lastcmd = ''
return self
def cmdloop(self):
stop = None
while not stop:
try:
line = raw_input(self.prompt)
except EOFError:
line = 'EOF'
stop = self.onecmd(line)
def onecmd(self, line):
line = string.strip(line)
if not line:
line = self.lastcmd
print line
else:
self.lastcmd = line
i, n = 0, len(line)
while i < n and line[i] in self.identchars: i = i+1
cmd, arg = line[:i], string.strip(line[i:])
if cmd == '':
return self.default(line)
else:
try:
func = eval('self.do_' + cmd)
except AttributeError:
return self.default(line)
return func(arg)
def default(self, line):
print '*** Unknown syntax:', line
def do_help(self, arg):
if arg:
# XXX check arg syntax
try:
func = eval('self.help_' + arg)
except:
print '*** No help on', `arg`
return
func()
else:
import getattr
names = getattr.dir(self)
cmds = []
for name in names:
if name[:3] == 'do_':
cmds.append(name[3:])
print cmds