summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--Lib/cmd.py65
1 files changed, 65 insertions, 0 deletions
diff --git a/Lib/cmd.py b/Lib/cmd.py
new file mode 100644
index 0000000..d28e393
--- /dev/null
+++ b/Lib/cmd.py
@@ -0,0 +1,65 @@
+# 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