summaryrefslogtreecommitdiff
path: root/StepTalkShell
diff options
context:
space:
mode:
authorMatthias Andreas Benkard <matthias@benkard.de>2008-06-17 17:17:32 +0200
committerMatthias Andreas Benkard <matthias@benkard.de>2008-06-17 17:17:32 +0200
commit4aa6da8ed37055e196204a45e3bac32039b395d9 (patch)
tree1490f12d8f80e8623de494d38f66e5961f2c744e /StepTalkShell
parentd6d73cfbcfd4eae88e53c4c30e221a66daade5e1 (diff)
Build the system as a framework, include the StepTalk Shell for quick testing.
Diffstat (limited to 'StepTalkShell')
-rw-r--r--StepTalkShell/.cvsignore7
-rw-r--r--StepTalkShell/.svn/all-wcprops65
-rw-r--r--StepTalkShell/.svn/dir-prop-base11
-rw-r--r--StepTalkShell/.svn/entries158
-rw-r--r--StepTalkShell/.svn/format1
-rw-r--r--StepTalkShell/.svn/prop-base/.cvsignore.svn-base13
-rw-r--r--StepTalkShell/.svn/prop-base/AppKit.txt.svn-base13
-rw-r--r--StepTalkShell/.svn/prop-base/ChangeLog.svn-base13
-rw-r--r--StepTalkShell/.svn/prop-base/GNUmakefile.svn-base13
-rw-r--r--StepTalkShell/.svn/prop-base/README.svn-base13
-rw-r--r--StepTalkShell/.svn/prop-base/STShell+output.m.svn-base13
-rw-r--r--StepTalkShell/.svn/prop-base/STShell.h.svn-base13
-rw-r--r--StepTalkShell/.svn/prop-base/STShell.m.svn-base13
-rw-r--r--StepTalkShell/.svn/prop-base/Unix.txt.svn-base13
-rw-r--r--StepTalkShell/.svn/prop-base/stshell_tool.m.svn-base13
-rw-r--r--StepTalkShell/.svn/text-base/.cvsignore.svn-base7
-rw-r--r--StepTalkShell/.svn/text-base/AppKit.txt.svn-base40
-rw-r--r--StepTalkShell/.svn/text-base/ChangeLog.svn-base58
-rw-r--r--StepTalkShell/.svn/text-base/GNUmakefile.svn-base35
-rw-r--r--StepTalkShell/.svn/text-base/README.svn-base88
-rw-r--r--StepTalkShell/.svn/text-base/STShell+output.m.svn-base165
-rw-r--r--StepTalkShell/.svn/text-base/STShell.h.svn-base80
-rw-r--r--StepTalkShell/.svn/text-base/STShell.m.svn-base404
-rw-r--r--StepTalkShell/.svn/text-base/Unix.txt.svn-base194
-rw-r--r--StepTalkShell/.svn/text-base/stshell_tool.m.svn-base253
-rw-r--r--StepTalkShell/AppKit.txt40
-rw-r--r--StepTalkShell/COPYING339
-rw-r--r--StepTalkShell/ChangeLog58
-rw-r--r--StepTalkShell/GNUmakefile35
-rw-r--r--StepTalkShell/README88
-rw-r--r--StepTalkShell/STShell+output.m165
-rw-r--r--StepTalkShell/STShell.h80
-rw-r--r--StepTalkShell/STShell.m404
-rw-r--r--StepTalkShell/Unix.txt194
-rw-r--r--StepTalkShell/stshell_tool.m253
35 files changed, 3352 insertions, 0 deletions
diff --git a/StepTalkShell/.cvsignore b/StepTalkShell/.cvsignore
new file mode 100644
index 0000000..862e5dc
--- /dev/null
+++ b/StepTalkShell/.cvsignore
@@ -0,0 +1,7 @@
+*.app
+*.debug
+*.profile
+shared_*obj
+*.bundle
+*.stmodule
+*.stlanguage
diff --git a/StepTalkShell/.svn/all-wcprops b/StepTalkShell/.svn/all-wcprops
new file mode 100644
index 0000000..60280a3
--- /dev/null
+++ b/StepTalkShell/.svn/all-wcprops
@@ -0,0 +1,65 @@
+K 25
+svn:wc:ra_dav:version-url
+V 62
+/svn/gnustep/!svn/ver/21700/libs/steptalk/trunk/Examples/Shell
+END
+Unix.txt
+K 25
+svn:wc:ra_dav:version-url
+V 71
+/svn/gnustep/!svn/ver/16926/libs/steptalk/trunk/Examples/Shell/Unix.txt
+END
+STShell.h
+K 25
+svn:wc:ra_dav:version-url
+V 72
+/svn/gnustep/!svn/ver/21700/libs/steptalk/trunk/Examples/Shell/STShell.h
+END
+STShell+output.m
+K 25
+svn:wc:ra_dav:version-url
+V 79
+/svn/gnustep/!svn/ver/13926/libs/steptalk/trunk/Examples/Shell/STShell+output.m
+END
+AppKit.txt
+K 25
+svn:wc:ra_dav:version-url
+V 73
+/svn/gnustep/!svn/ver/16927/libs/steptalk/trunk/Examples/Shell/AppKit.txt
+END
+stshell_tool.m
+K 25
+svn:wc:ra_dav:version-url
+V 77
+/svn/gnustep/!svn/ver/21700/libs/steptalk/trunk/Examples/Shell/stshell_tool.m
+END
+ChangeLog
+K 25
+svn:wc:ra_dav:version-url
+V 72
+/svn/gnustep/!svn/ver/21700/libs/steptalk/trunk/Examples/Shell/ChangeLog
+END
+GNUmakefile
+K 25
+svn:wc:ra_dav:version-url
+V 74
+/svn/gnustep/!svn/ver/16959/libs/steptalk/trunk/Examples/Shell/GNUmakefile
+END
+STShell.m
+K 25
+svn:wc:ra_dav:version-url
+V 72
+/svn/gnustep/!svn/ver/21700/libs/steptalk/trunk/Examples/Shell/STShell.m
+END
+.cvsignore
+K 25
+svn:wc:ra_dav:version-url
+V 73
+/svn/gnustep/!svn/ver/14479/libs/steptalk/trunk/Examples/Shell/.cvsignore
+END
+README
+K 25
+svn:wc:ra_dav:version-url
+V 69
+/svn/gnustep/!svn/ver/16028/libs/steptalk/trunk/Examples/Shell/README
+END
diff --git a/StepTalkShell/.svn/dir-prop-base b/StepTalkShell/.svn/dir-prop-base
new file mode 100644
index 0000000..815384c
--- /dev/null
+++ b/StepTalkShell/.svn/dir-prop-base
@@ -0,0 +1,11 @@
+K 10
+svn:ignore
+V 68
+*.app
+*.debug
+*.profile
+shared_*obj
+*.bundle
+*.stmodule
+*.stlanguage
+END
diff --git a/StepTalkShell/.svn/entries b/StepTalkShell/.svn/entries
new file mode 100644
index 0000000..a441084
--- /dev/null
+++ b/StepTalkShell/.svn/entries
@@ -0,0 +1,158 @@
+8
+
+dir
+26675
+http://svn.gna.org/svn/gnustep/libs/steptalk/trunk/Examples/Shell
+http://svn.gna.org/svn/gnustep
+
+
+
+2005-09-05T20:11:31.000000Z
+21700
+stefanu
+has-props
+
+svn:special svn:externals svn:needs-lock
+
+
+
+
+
+
+
+
+
+
+
+72102866-910b-0410-8b05-ffd578937521
+
+Unix.txt
+file
+
+
+
+
+2008-06-17T14:37:07.000000Z
+952f7bb4dcee8e0a04cecc773b6dbcc8
+2003-06-15T09:41:54.000000Z
+16926
+alexm
+has-props
+
+STShell.h
+file
+
+
+
+
+2008-06-17T14:37:07.000000Z
+7daed33ac1a0f636b17a6f3ea4bf07bc
+2005-09-05T20:11:31.000000Z
+21700
+stefanu
+has-props
+
+STShell+output.m
+file
+
+
+
+
+2008-06-17T14:37:07.000000Z
+030292d757b5a7ad4cfde9ec99bf1769
+2002-06-21T22:40:59.000000Z
+13926
+stefanu
+has-props
+
+AppKit.txt
+file
+
+
+
+
+2008-06-17T14:37:07.000000Z
+7d2a75e8ce3dfe87a41575e9f639ffb1
+2003-06-15T10:14:47.000000Z
+16927
+stefanu
+has-props
+
+stshell_tool.m
+file
+
+
+
+
+2008-06-17T14:37:07.000000Z
+4dd61d9119c31cad1fdc1ce60a294e98
+2005-09-05T20:11:31.000000Z
+21700
+stefanu
+has-props
+
+ChangeLog
+file
+
+
+
+
+2008-06-17T14:37:07.000000Z
+13ddedd917476f741baf6db746c42b1e
+2005-09-05T20:11:31.000000Z
+21700
+stefanu
+has-props
+
+GNUmakefile
+file
+
+
+
+
+2008-06-17T14:37:07.000000Z
+def0451d8a65bea979e71a87d6d86d6f
+2003-06-19T14:55:33.000000Z
+16959
+stefanu
+has-props
+
+STShell.m
+file
+
+
+
+
+2008-06-17T14:37:07.000000Z
+d20f987612ae95749f51ebef8af15073
+2005-09-05T20:11:31.000000Z
+21700
+stefanu
+has-props
+
+.cvsignore
+file
+
+
+
+
+2008-06-17T14:37:07.000000Z
+fca8e6fb705f27c0b964e04e98dd78c9
+2002-09-17T13:00:16.000000Z
+14479
+stefanu
+has-props
+
+README
+file
+
+
+
+
+2008-06-17T14:37:07.000000Z
+c76629aba15ce845222152ab1bef30c3
+2003-02-21T12:45:42.000000Z
+16028
+stefanu
+has-props
+
diff --git a/StepTalkShell/.svn/format b/StepTalkShell/.svn/format
new file mode 100644
index 0000000..45a4fb7
--- /dev/null
+++ b/StepTalkShell/.svn/format
@@ -0,0 +1 @@
+8
diff --git a/StepTalkShell/.svn/prop-base/.cvsignore.svn-base b/StepTalkShell/.svn/prop-base/.cvsignore.svn-base
new file mode 100644
index 0000000..c439c7e
--- /dev/null
+++ b/StepTalkShell/.svn/prop-base/.cvsignore.svn-base
@@ -0,0 +1,13 @@
+K 15
+cvs2svn:cvs-rev
+V 3
+1.1
+K 13
+svn:eol-style
+V 6
+native
+K 12
+svn:keywords
+V 23
+Author Date Id Revision
+END
diff --git a/StepTalkShell/.svn/prop-base/AppKit.txt.svn-base b/StepTalkShell/.svn/prop-base/AppKit.txt.svn-base
new file mode 100644
index 0000000..40cf47b
--- /dev/null
+++ b/StepTalkShell/.svn/prop-base/AppKit.txt.svn-base
@@ -0,0 +1,13 @@
+K 15
+cvs2svn:cvs-rev
+V 3
+1.3
+K 13
+svn:eol-style
+V 6
+native
+K 12
+svn:keywords
+V 23
+Author Date Id Revision
+END
diff --git a/StepTalkShell/.svn/prop-base/ChangeLog.svn-base b/StepTalkShell/.svn/prop-base/ChangeLog.svn-base
new file mode 100644
index 0000000..6637c8f
--- /dev/null
+++ b/StepTalkShell/.svn/prop-base/ChangeLog.svn-base
@@ -0,0 +1,13 @@
+K 15
+cvs2svn:cvs-rev
+V 3
+1.9
+K 13
+svn:eol-style
+V 6
+native
+K 12
+svn:keywords
+V 23
+Author Date Id Revision
+END
diff --git a/StepTalkShell/.svn/prop-base/GNUmakefile.svn-base b/StepTalkShell/.svn/prop-base/GNUmakefile.svn-base
new file mode 100644
index 0000000..a07ee08
--- /dev/null
+++ b/StepTalkShell/.svn/prop-base/GNUmakefile.svn-base
@@ -0,0 +1,13 @@
+K 15
+cvs2svn:cvs-rev
+V 3
+1.8
+K 13
+svn:eol-style
+V 6
+native
+K 12
+svn:keywords
+V 23
+Author Date Id Revision
+END
diff --git a/StepTalkShell/.svn/prop-base/README.svn-base b/StepTalkShell/.svn/prop-base/README.svn-base
new file mode 100644
index 0000000..2d1aaf3
--- /dev/null
+++ b/StepTalkShell/.svn/prop-base/README.svn-base
@@ -0,0 +1,13 @@
+K 15
+cvs2svn:cvs-rev
+V 3
+1.6
+K 13
+svn:eol-style
+V 6
+native
+K 12
+svn:keywords
+V 23
+Author Date Id Revision
+END
diff --git a/StepTalkShell/.svn/prop-base/STShell+output.m.svn-base b/StepTalkShell/.svn/prop-base/STShell+output.m.svn-base
new file mode 100644
index 0000000..40cf47b
--- /dev/null
+++ b/StepTalkShell/.svn/prop-base/STShell+output.m.svn-base
@@ -0,0 +1,13 @@
+K 15
+cvs2svn:cvs-rev
+V 3
+1.3
+K 13
+svn:eol-style
+V 6
+native
+K 12
+svn:keywords
+V 23
+Author Date Id Revision
+END
diff --git a/StepTalkShell/.svn/prop-base/STShell.h.svn-base b/StepTalkShell/.svn/prop-base/STShell.h.svn-base
new file mode 100644
index 0000000..6637c8f
--- /dev/null
+++ b/StepTalkShell/.svn/prop-base/STShell.h.svn-base
@@ -0,0 +1,13 @@
+K 15
+cvs2svn:cvs-rev
+V 3
+1.9
+K 13
+svn:eol-style
+V 6
+native
+K 12
+svn:keywords
+V 23
+Author Date Id Revision
+END
diff --git a/StepTalkShell/.svn/prop-base/STShell.m.svn-base b/StepTalkShell/.svn/prop-base/STShell.m.svn-base
new file mode 100644
index 0000000..21f74b9
--- /dev/null
+++ b/StepTalkShell/.svn/prop-base/STShell.m.svn-base
@@ -0,0 +1,13 @@
+K 15
+cvs2svn:cvs-rev
+V 4
+1.18
+K 13
+svn:eol-style
+V 6
+native
+K 12
+svn:keywords
+V 23
+Author Date Id Revision
+END
diff --git a/StepTalkShell/.svn/prop-base/Unix.txt.svn-base b/StepTalkShell/.svn/prop-base/Unix.txt.svn-base
new file mode 100644
index 0000000..4b1e0a9
--- /dev/null
+++ b/StepTalkShell/.svn/prop-base/Unix.txt.svn-base
@@ -0,0 +1,13 @@
+K 15
+cvs2svn:cvs-rev
+V 3
+1.2
+K 13
+svn:eol-style
+V 6
+native
+K 12
+svn:keywords
+V 23
+Author Date Id Revision
+END
diff --git a/StepTalkShell/.svn/prop-base/stshell_tool.m.svn-base b/StepTalkShell/.svn/prop-base/stshell_tool.m.svn-base
new file mode 100644
index 0000000..40cf47b
--- /dev/null
+++ b/StepTalkShell/.svn/prop-base/stshell_tool.m.svn-base
@@ -0,0 +1,13 @@
+K 15
+cvs2svn:cvs-rev
+V 3
+1.3
+K 13
+svn:eol-style
+V 6
+native
+K 12
+svn:keywords
+V 23
+Author Date Id Revision
+END
diff --git a/StepTalkShell/.svn/text-base/.cvsignore.svn-base b/StepTalkShell/.svn/text-base/.cvsignore.svn-base
new file mode 100644
index 0000000..862e5dc
--- /dev/null
+++ b/StepTalkShell/.svn/text-base/.cvsignore.svn-base
@@ -0,0 +1,7 @@
+*.app
+*.debug
+*.profile
+shared_*obj
+*.bundle
+*.stmodule
+*.stlanguage
diff --git a/StepTalkShell/.svn/text-base/AppKit.txt.svn-base b/StepTalkShell/.svn/text-base/AppKit.txt.svn-base
new file mode 100644
index 0000000..ea79ab9
--- /dev/null
+++ b/StepTalkShell/.svn/text-base/AppKit.txt.svn-base
@@ -0,0 +1,40 @@
+Simple AppKit Examples
+----------------------
+To be able to try following examples you have to load the AppKit module:
+
+ > Environment loadModule: 'AppKit'
+
+
+How to get a filename using the Open panel
+
+ > NSOpenPanel openPanel runModal ; filename
+
+Applications and files
+----------------------
+
+> Workspace := NSWorkspace sharedWorkspace
+
+How to launch an application
+
+ > Workspace launchApplication:'application name'
+
+How to open a file
+
+ > Workspace openFile:'file name'
+
+How to open a file with specified application
+
+ > Workspace openFile:'file name' withApplication:'application name'
+
+How to open a file using the open panel
+
+ > Workspace openFile:(NSOpenPanel openPanel runModal ; filename)
+
+Text
+----
+
+How to display a RTF file
+
+ > text := NSAttributedString alloc
+ > text initWithPath: file documentAttributes:nil
+ > Transcript show: (text string)
diff --git a/StepTalkShell/.svn/text-base/ChangeLog.svn-base b/StepTalkShell/.svn/text-base/ChangeLog.svn-base
new file mode 100644
index 0000000..8653fb6
--- /dev/null
+++ b/StepTalkShell/.svn/text-base/ChangeLog.svn-base
@@ -0,0 +1,58 @@
+2005 Aug 30
+
+ * use STLanguageManager instead of removed STLanguage
+
+2005 Aug 15
+
+ * Added distant environments
+ * Removed named objects as they were causing troubles with distant
+ environments
+ * Suspend completion for distant environments
+
+ Warning: option 'environment' has different meaning. See stshell --help.
+
+2003 Sep 21
+
+ * Added named objects FileManager, LastCommand and LastObject
+
+2003 Jun 19
+
+ * Renamed stshell.m to stshell_tool.m. MS Windows was causing problems with
+ case insensitive file system.
+ (Reported by Michael Adams <mdmkolbe@yahoo.com>)
+
+2003 Apr 04 David Ayers <d.ayers@inode.at>
+
+ * GNUmakefile: Added flags to show all warnings except for import.
+ * STShell.m: Unified name for private categories.
+
+2003 Jan 16 Stefan Urbanek <urbanek@host.sk>
+
+ * GNUmakefile: Added -lncurses
+
+2002 Jun 21 Stefan Urbanek <urbanek@host.sk>
+
+ * Added executeScriptNamed:
+
+2002 Jun 8 Stefan Urbanek <urbanek@host.sk>
+
+ * Reflect STEnvironment changes
+ * Removed loading of Foundation module as this is handleb by the
+ STEnvironment
+
+2002 Jun 7 Stefan Urbanek <urbanek@host.sk>
+
+ * Changed printing of result object (handle arrays, dictionaries and sets
+ different way)
+
+2002 Jun 6 Stefan Urbanek <urbanek@host.sk>
+
+ * Update completition list lazily (only when needed)
+
+2002 Jun 4 Stefan Urbanek <urbanek@host.sk>
+
+ * add DistributedFinder object finder to the environment
+
+2002 May 30 Stefan Urbanek <urbanek@host.sk>
+
+ * added Environment object.
diff --git a/StepTalkShell/.svn/text-base/GNUmakefile.svn-base b/StepTalkShell/.svn/text-base/GNUmakefile.svn-base
new file mode 100644
index 0000000..3f0df60
--- /dev/null
+++ b/StepTalkShell/.svn/text-base/GNUmakefile.svn-base
@@ -0,0 +1,35 @@
+#
+# StepTalk tools
+#
+# Copyright (C) 2002 Stefan Urbanek
+#
+# This file is part of the StepTalk.
+#
+# This library is free software; you can redistribute it and/or
+# modify it under the terms of the GNU Library General Public
+# License as published by the Free Software Foundation; either
+# version 2 of the License, or (at your option) any later version.
+#
+# This library is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+# Library General Public License for more details.
+#
+# You should have received a copy of the GNU Library General Public
+# License along with this library; if not, write to the Free
+# Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02111, USA.
+#
+
+include $(GNUSTEP_MAKEFILES)/common.make
+
+TOOL_NAME = stshell
+
+stshell_OBJC_FILES = STShell.m STShell+output.m stshell_tool.m
+
+ADDITIONAL_TOOL_LIBS += -lStepTalk -lreadline -lncurses
+
+ADDITIONAL_OBJCFLAGS = -Wall -Wno-import
+
+-include GNUmakefile.preamble
+include $(GNUSTEP_MAKEFILES)/tool.make
+-include GNUMakefile.postamble
diff --git a/StepTalkShell/.svn/text-base/README.svn-base b/StepTalkShell/.svn/text-base/README.svn-base
new file mode 100644
index 0000000..96bd556
--- /dev/null
+++ b/StepTalkShell/.svn/text-base/README.svn-base
@@ -0,0 +1,88 @@
+stshell
+-------
+
+Author: Stefan Urbanek <urbanek@host.sk>
+
+
+What is stshell?
+-----------------
+StepTalk Shell is an interactive tool for communicating with objects.
+
+Features
+--------
+ - GNUstep classes and objects
+ - command-line editing
+ - TAB completition of named objects and selectors
+
+For more information read included *.txt files.
+
+Installation
+------------
+Requirements: StepTalk and the readline library (development files)
+
+ > make
+ > make install
+
+Running
+-------
+To run stshell with default language, run just
+
+ > stshell
+
+If you would like to use another language, then use
+
+ > stshell -language AnotherLanguage
+
+To use AppKit
+
+ > stshell -environment AppKit
+
+To use it as a distributed objects 'glue'
+
+ > stshell -environment Distributed
+
+The shell will greet you with 'Welcome to the StepTalk shell.' message.
+
+ Welcome to the StepTalk shell.
+ StepTalk > _
+
+Now you may write statements in the language you have specified.
+
+ StepTalk > Transcript showLine:'Current date is ', ((NSDate date) description)
+
+If the line is too long, then you may use the backslash '\' character at the end
+of the line to continue on the next line.
+
+ StepTalk > Transcript showLine:'Current date is ', \
+ ... ? ((NSDate date) description)
+
+Objects history array
+---------------------
+All results from the expressions are stored in the 'Objects' array. The example
+above can be written in more steps:
+
+ StepTalk > ((NSDate date) description)
+ 0: 2002-05-29 22:41:57 +0200
+ StepTalk > 'Current date is ', (Objects @ 0)
+ 1: Current date is 2002-05-29 22:41:57 +0200
+ StepTalk > Transcript showLine: (Objects @ 1)
+ Current date is 2002-05-29 22:41:57 +0200
+
+To show all objects type:
+
+ StepTalk > Shell listObjects
+ Objects
+ 0: '2002-05-29 22:41:57 +0200' (GSCInlineString)
+ 1: 'Current date is 2002-05-29 22:41:57 +020...' (GSUnicodeString)
+
+TAB completition
+----------------
+Here is an example of TAB completition.
+ StepTalk > Tr<TAB> showL<TAB>:'Current date is ', ((NSDate date) desc<TAB>i<TAB>)
+
+Feedback
+--------
+Any questions, comments and bug reports are velcome at
+
+ urbanek@host.sk
+
diff --git a/StepTalkShell/.svn/text-base/STShell+output.m.svn-base b/StepTalkShell/.svn/text-base/STShell+output.m.svn-base
new file mode 100644
index 0000000..8f7d0ea
--- /dev/null
+++ b/StepTalkShell/.svn/text-base/STShell+output.m.svn-base
@@ -0,0 +1,165 @@
+/**
+ STShell+output
+
+ Copyright (c) 2002 Free Software Foundation
+
+ Written by: Stefan Urbanek <urbanek@host.sk>
+ Date: 2002 Jun 7
+
+ This file is part of the StepTalk project.
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02111, USA.
+
+ */
+
+#import "STShell.h"
+
+#import <StepTalk/StepTalk.h>
+
+#import <Foundation/NSArray.h>
+#import <Foundation/NSBundle.h>
+#import <Foundation/NSDebug.h>
+#import <Foundation/NSNotification.h>
+#import <Foundation/NSException.h>
+#import <Foundation/NSSet.h>
+#import <Foundation/NSString.h>
+#import <Foundation/NSValue.h>
+
+#include <readline/readline.h>
+
+@implementation STShell(STShellOutput)
+- show:(id)anObject
+{
+ printf("%s", [[anObject description] cString]);
+
+ return self;
+}
+- showLine:(id)anObject
+{
+ [self show:anObject];
+ putchar('\n');
+
+ return nil;
+}
+- (void)showError:(NSString *)errString
+{
+ fprintf(stderr, "%s\n\n", [errString cString]);
+}
+
+- showResult:(id)obj
+{
+ const char *className = [NSStringFromClass([obj class]) cString];
+ int objIndex = [objectStack count] - 1;
+ int i;
+
+ if(obj)
+ {
+ if([obj isKindOfClass:[NSArray class]])
+ {
+ printf("(%i) %s\n", objIndex, className);
+
+ for(i = 0;i<[obj count]; i++)
+ {
+ printf("%i %s\n", i,
+ [self displayCStringForObject:[obj objectAtIndex:i]]);
+ }
+
+ }
+ else if([obj isKindOfClass:[NSSet class]])
+ {
+ printf("(%i) %s\n", objIndex, className);
+
+ obj = [[obj allObjects] sortedArrayUsingSelector:@selector(compare:)];
+ for(i = 0;i<[obj count]; i++)
+ {
+ printf("%s\n",
+ [self displayCStringForObject:[obj objectAtIndex:i]]);
+ }
+
+ }
+ else if([obj isKindOfClass:[NSDictionary class]])
+ {
+ NSString *key;
+ NSArray *keys;
+
+ printf("(%i) %s\n", objIndex, className);
+
+ keys = [[obj allKeys] sortedArrayUsingSelector:@selector(compare:)];
+
+ for(i = 0;i<[keys count]; i++)
+ {
+ key = [keys objectAtIndex:i];
+ printf("%s : %s\n",
+ [self displayCStringForObject:key],
+ [self displayCStringForObject:[obj objectForKey:key]]);
+ }
+ }
+ else
+ {
+ printf("(%i) %s\n", objIndex, [self displayCStringForObject:obj]);
+ }
+ }
+
+ return self;
+}
+- (char *)displayCStringForObject:(id)object
+{
+ NSString *str = [object description];
+
+ if( [str length] > 60 )
+ {
+ str = [str substringToIndex:60];
+ str = [str stringByAppendingString:@"..."];
+ }
+
+ return [str cString];
+}
+
+- showException:(NSException *)exception
+{
+ printf("Error (%s): %s\n",
+ [[exception name] cString],
+ [[exception reason] cString]);
+
+
+ return self;
+}
+
+- (id)listObjects
+{
+ NSString *str;
+ int i;
+ id object;
+
+ printf("Objects\n");
+ for(i = 0; i < [objectStack count]; i++)
+ {
+ object = [objectStack objectAtIndex:i];
+
+ str = [object description];
+
+ if( [str length] > 60 )
+ {
+ str = [str substringToIndex:60];
+ str = [str stringByAppendingString:@"..."];
+ }
+
+ printf("%4i: '%s' (%s)\n", i,
+ [str cString],
+ [[[object class] description] cString]);
+ }
+ return nil;
+}
+@end
diff --git a/StepTalkShell/.svn/text-base/STShell.h.svn-base b/StepTalkShell/.svn/text-base/STShell.h.svn-base
new file mode 100644
index 0000000..f807aef
--- /dev/null
+++ b/StepTalkShell/.svn/text-base/STShell.h.svn-base
@@ -0,0 +1,80 @@
+/**
+ STShell
+ StepTalk Shell
+
+ Copyright (c) 2002 Free Software Foundation
+
+ Written by: Stefan Urbanek <urbanek@host.sk>
+ Date: 2002 May 29
+
+ This file is part of the StepTalk project.
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02111, USA.
+
+ */
+
+#import <Foundation/NSObject.h>
+
+@class STConversation;
+@class STEnvironment;
+@class STScriptsManager;
+@class NSMutableArray;
+@class NSException;
+
+@interface STShell:NSObject
+{
+ STScriptsManager *scriptsManager;
+ STConversation *conversation;
+
+ NSString *prompt;
+ NSString *source;
+
+ NSMutableArray *objectStack;
+
+ BOOL exitRequest;
+
+ BOOL updateCompletionList;
+ NSArray *completionList;
+ BOOL completionEnabled;
+
+}
+- initWithEnvironment:(STEnvironment *)env;
+
+- (void)setLanguage:(NSString *)langName;
+- (void)setEnvironment:(STEnvironment *)newEnv;
+- (STEnvironment *)environment;
+
+- (void)run;
+
+- show:(id)anObject;
+- showLine:(id)anObject;
+
+- (id)executeLine:(NSString *)line;
+
+- showResult:(id)obj;
+- showException:(NSException *)exception;
+- (void)showError:(NSString *)errString;
+@end
+
+@interface STShell(STShellOutput)
+
+- show:(id)anObject;
+- showLine:(id)anObject;
+- showResult:(id)obj;
+- (char *)displayCStringForObject:(id)object;
+- showException:(NSException *)exception;
+- (id)listObjects;
+
+@end
diff --git a/StepTalkShell/.svn/text-base/STShell.m.svn-base b/StepTalkShell/.svn/text-base/STShell.m.svn-base
new file mode 100644
index 0000000..57c2120
--- /dev/null
+++ b/StepTalkShell/.svn/text-base/STShell.m.svn-base
@@ -0,0 +1,404 @@
+/**
+ STShell
+ StepTalk Shell
+
+ Copyright (c) 2002 Free Software Foundation
+
+ Written by: Stefan Urbanek <urbanek@host.sk>
+ Date: 2002 May 29
+
+ This file is part of the StepTalk project.
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02111, USA.
+
+ */
+
+#import "STShell.h"
+
+#import <StepTalk/StepTalk.h>
+
+#import <Foundation/NSArray.h>
+#import <Foundation/NSBundle.h>
+#import <Foundation/NSDebug.h>
+#import <Foundation/NSNotification.h>
+#import <Foundation/NSException.h>
+#import <Foundation/NSFileManager.h>
+#import <Foundation/NSSet.h>
+#import <Foundation/NSString.h>
+#import <Foundation/NSValue.h>
+
+#include <readline/readline.h>
+
+static Class NSString_class;
+static Class NSNumber_class;
+
+NSArray *objcSelectors = nil;
+
+static STShell *sharedShell = nil;
+
+@interface STShell(STPrivateMethods)
+- (int) completion;
+- (NSString *)readLine;
+- (void)initReadline;
+@end
+
+int complete_handler(void)
+{
+ return [sharedShell completion];
+}
+
+@implementation STShell
+
++ (void)initialize
+{
+ NSString_class = [NSString class];
+ NSNumber_class = [NSNumber class];
+}
+
++ sharedShell
+{
+ return sharedShell;
+}
+
+- initWithConversation:(STConversation *)conv
+{
+ self = [super init];
+
+ [self initReadline];
+
+ objectStack = [[NSMutableArray alloc] init];
+
+ [[NSNotificationCenter defaultCenter]
+ addObserver:self
+ selector:@selector(bundleLoaded:)
+ name:NSBundleDidLoadNotification
+ object:nil];
+
+ scriptsManager = RETAIN([STScriptsManager defaultManager]);
+ prompt = @"StepTalk > ";
+
+ conversation = RETAIN(conv);
+
+ /* FIXME: make this more clever for completion handler */
+ if(!sharedShell)
+ {
+ sharedShell = self;
+ }
+
+ return self;
+}
+
+- (void)updateCompletionList
+{
+ NSMutableArray *array = [[NSMutableArray alloc] init];
+ RELEASE(completionList);
+
+ [array addObjectsFromArray:STAllObjectiveCSelectors()];
+
+ completionList = [[NSArray alloc] initWithArray:array];
+
+ updateCompletionList = NO;
+}
+
+- (void)dealloc
+{
+ RELEASE(objectStack);
+ RELEASE(completionList);
+ RELEASE(scriptsManager);
+ RELEASE(conversation);
+
+ [[NSNotificationCenter defaultCenter] removeObserver:self];
+
+ [super dealloc];
+}
+-(void)bundleLoaded:(NSNotification *)notif
+{
+ updateCompletionList = YES;
+}
+
+- (void)initReadline
+{
+ rl_initialize();
+ rl_bind_key('\t', complete_handler);
+}
+
+- (void)setLanguage:(NSString *)langName
+{
+ NSDebugLog(@"Setting language to %@", langName);
+
+ [conversation setLanguage:langName];
+}
+
+- (void)setEnvironment:(STEnvironment *)newEnv
+{
+ [conversation setEnvironment:newEnv];
+}
+
+- (STEnvironment *)environment
+{
+ return [conversation context];
+}
+
+- (void)run
+{
+ STEnvironment *env;
+ NSString *line;
+ id result;
+
+ [self showLine:@"Welcome to the StepTalk shell."];
+
+ // NSLog(@"Environment %@", env);
+
+ if(![conversation isKindOfClass:[STRemoteConversation class]])
+ {
+ completionEnabled = YES;
+ }
+ else
+ {
+ [self showLine:@"Note: Completion disabled for distant conversation"];
+ }
+
+ while(1)
+ {
+ line = [self readLine];
+
+ if(exitRequest)
+ break;
+
+ if(!line)
+ continue;
+
+ result = [self executeLine:line];
+
+ if(result)
+ {
+ if(result != objectStack)
+ {
+ [objectStack addObject:result];
+ }
+ [self showResult:result];
+ }
+ else
+ {
+ [self showResult:result];
+ }
+
+ }
+ printf("\n");
+}
+- (id)executeLine:(NSString *)line
+{
+ NSString *cmd;
+ id result = nil;
+
+ /* FIXME: why? */
+
+ cmd = [line stringByAppendingString:@" "];
+ NS_DURING
+ [conversation interpretScript:cmd];
+ result = [conversation result];
+ NS_HANDLER
+ [self showException:localException];
+ NS_ENDHANDLER
+
+ return result;
+}
+
+- (NSString *)readLine
+{
+ char *str;
+ NSString *actualPrompt = prompt;
+ NSString *line = @"";
+ BOOL done = NO;
+ int len;
+
+ while(!done)
+ {
+ str = readline([actualPrompt cString]);
+ done = YES;
+
+ if(!str)
+ {
+ exitRequest = YES;
+ return nil;
+ }
+
+ len = strlen(str);
+ if(!len)
+ return nil;
+
+ if(str[len-1] == '\\')
+ {
+ actualPrompt = @"... ? ";
+ str[strlen(str) - 1] = '\0';
+ done = NO;
+ }
+
+ line = [line stringByAppendingString:[NSString stringWithCString:str]];
+ }
+
+ add_history([line cString]);
+
+ return line;
+}
+
+- (int)completion
+{
+ STEnvironment *env;
+ NSEnumerator *enumerator;
+ NSMutableSet *set;
+ NSString *match;
+ NSString *tail;
+ NSString *str;
+ NSArray *array;
+ int pos = 0;
+ int c;
+
+ if(!completionEnabled)
+ {
+ return 0;
+ }
+
+ if(rl_point <= 0)
+ {
+ return 0;
+ }
+
+ pos = rl_point - 1;
+ c = rl_line_buffer[pos];
+
+ while((isalnum(c) || c == '_') && pos >= 0)
+ {
+ pos--;
+ c = rl_line_buffer[pos];
+ }
+ pos++;
+
+ match = [NSString stringWithCString:rl_line_buffer + pos
+ length:rl_point - pos];
+
+ set = [NSMutableSet set];
+
+ if(!completionList || updateCompletionList)
+ {
+ [self updateCompletionList];
+ }
+
+ enumerator = [completionList objectEnumerator];
+ while( (str = [enumerator nextObject]) )
+ {
+ if( [str hasPrefix:match] )
+ {
+ [set addObject:str];
+ }
+ }
+
+ env = [conversation context];
+ enumerator = [[env knownObjectNames] objectEnumerator];
+ while( (str = [enumerator nextObject]) )
+ {
+ if( [str hasPrefix:match] )
+ {
+ [set addObject:str];
+ }
+ }
+
+ array = [set allObjects];
+
+ if( [array count] == 0 )
+ {
+ printf("\nNo match for completion.\n");
+ rl_forced_update_display();
+ }
+ else if ( [array count] == 1 )
+ {
+ str = [array objectAtIndex:0];
+ str = [str substringFromIndex:rl_point - pos];
+ rl_insert_text([str cString]);
+ rl_insert_text(" ");
+
+ rl_redisplay();
+ }
+ else
+ {
+ enumerator = [array objectEnumerator];
+
+ tail = [enumerator nextObject];
+
+ while( (str = [enumerator nextObject]) )
+ {
+ tail = [str commonPrefixWithString:tail options:NSLiteralSearch];
+ }
+
+ tail = [tail substringFromIndex:[match length]];
+
+ if( tail && ![tail isEqualToString:@""] )
+ {
+ rl_insert_text([tail cString]);
+ rl_redisplay();
+ }
+ else
+ {
+ printf("\n");
+ enumerator = [array objectEnumerator];
+ while( (str = [enumerator nextObject]) )
+ {
+ printf("%s\n", [str cString]);
+ }
+ rl_forced_update_display();
+ }
+ }
+
+
+ return 0;
+}
+
+- (void)exit
+{
+ /* FIXME: this is not nice */
+ exit(0);
+}
+
+- (id)executeScriptNamed:(NSString *)scriptName
+{
+ STScript *script = [scriptsManager scriptWithName:scriptName];
+ id result = nil;
+
+ if(!script)
+ {
+ [self showError:[NSString stringWithFormat:
+ @"Unable to find script with name '%@'",
+ scriptName]];
+ }
+ else
+ {
+ NS_DURING
+ result = [conversation runScriptFromString:[script source]];
+ NS_HANDLER
+ [self showException:localException];
+ NS_ENDHANDLER
+ }
+
+ return result;
+}
+- (void)setPrompt:(NSString *)aString
+{
+ ASSIGN(prompt, aString);
+}
+- (NSString *)prompt
+{
+ return prompt;
+}
+@end
diff --git a/StepTalkShell/.svn/text-base/Unix.txt.svn-base b/StepTalkShell/.svn/text-base/Unix.txt.svn-base
new file mode 100644
index 0000000..94d3096
--- /dev/null
+++ b/StepTalkShell/.svn/text-base/Unix.txt.svn-base
@@ -0,0 +1,194 @@
+Unix shell equivalents
+----------------------
+
+StepTalk is not meant to be used for tasks that can be done using ordinary Unix
+shells. But this does not mean, that it cannot be used for such tasks. In this
+file you may find list of unix commands and tasks and their Smalltalk
+equivalents.
+
+Contents:
+
+ File Manipulation
+ Output
+ Paths and filenames
+ Network
+ Math
+ Date and Time
+
+File manipulation
+-----------------
+
+> fm := NSFileManager defaultManager
+
+ls
+
+ > (fm directoryContentsAtPath: '.') sortedArrayUsingSelector:#compare:
+
+pwd
+
+ > fm currentDirectoryPath
+
+cd path
+
+ > fm changeCurrentDirectoryPath: 'path'
+
+ln -s path other
+
+ > fm createSymbolicLinkAtPath:'path' pathContent:'other'
+
+cp src dest
+
+ > fm copyPath:'src' toPath:'dest' handler: nil
+
+cp file_list dest
+
+ > file_list do: [ :file | fm copyPath:file toPath:'dest' handler: nil ]
+
+mv - as cp, movePath:toPath:handler:
+ln - as cp, linkPath:toPath:handler:
+rm - removeFileAtPath:handler:
+
+mkdir dir
+
+ > fm createDirectoryAtPath:'dir' attributes:nil
+
+df path
+
+ > fm fileSystemAttributesAtPath:'path'
+
+Output
+------
+
+echo 'string'
+
+ > Transcript show:'string'
+
+cat file
+
+ > Transcript show: (NSString stringWithContentsOfFile:'file')
+
+"write a string to a file"
+
+ > ('string' writeToFile:'file' atomically:YES)
+
+"create a string from a file"
+
+ > str := NSString stringWithContentsOfFile:'file'
+
+
+Paths and filenames
+--------------------------------
+For more information, refer to the NSString documentation.
+NSString methods for path manipulation:
+
+ - fileSystemRepresentation
+ - isAbsolutePath
+
+ - pathComponents
+ - lastPathComponent
+ - pathExtension
+
+ - stringByAbbreviatingWithTildeInPath
+ - stringByAppendingPathComponent:
+ - stringByAppendingPathExtension:
+ - stringByDeletingLastPathComponent
+ - stringByDeletingPathExtension
+ - stringByExpandingTildeInPath
+ - stringByResolvingSymlinksInPath
+ - stringByStandardizingPath
+ - stringsByAppendingPaths:
+
+Examples:
+
+ > path := '/usr/GNUstep/System/Applications/Ink.app'
+ > path pathComponents
+ (?) GSArray
+ 0 /
+ 1 usr
+ 2 GNUstep
+ 3 System
+ 4 Applications
+ 5 Ink.app
+
+ > path lastPathComponent
+ (?) Ink.app
+
+ > path pathExtension
+ (?) app
+
+In Smalltalk there is a symbolic selector '/' for NSString that is equivalent to
+the 'stringByAppendingPathComponent:'.
+
+ > path := 'somePath'
+ > filename := 'someFilename'
+ > fullPath := path / filename
+
+Network
+-------
+
+localhost
+
+ > NSHost currentHost name
+
+nslookup host_name
+
+ > (NSHost hostWithName:'host_name') addresses
+
+nslookup host_address
+
+ > (NSHost hostWithAddress:'host_address') names
+
+"download a file from the web"
+
+ > data := NSData dataWithContentsOfURL:'url'
+ > data writeToFile:'file' atomically:YES
+
+"read a file from the web"
+
+ > string := NSString stringWithContentsOfURL:'url'
+
+
+Math
+----
+Just like in:
+ > 1 + 1
+or in:
+ > a := b * c
+
+
+Date and Time
+-------------
+
+date
+ > NSDate date
+...or...
+date
+ > NSCalendarDate date
+
+
+For more information read the NSDate and NSCalendarDate documentation
+
+NSCalendarDate methods:
+
+Creating a date
+
+ + calendarDate
+ + dateWithString:calendarFormat:
+ + dateWithString:calendarFormat:locale:
+ + dateWithYear:month:day:hour:minute:second:timeZone:
+
+Retrieving date elements
+
+ - dayOfCommonEra
+ - dayOfMonth
+ - dayOfWeek
+ - dayOfYear
+ - hourOfDay
+ - minuteOfHour
+ - monthOfYear
+ - secondOfMinute
+ - yearOfCommonEra
+
+Adjusting a date
+
+ - dateByAddingYears:months:days:hours:minutes:seconds:
diff --git a/StepTalkShell/.svn/text-base/stshell_tool.m.svn-base b/StepTalkShell/.svn/text-base/stshell_tool.m.svn-base
new file mode 100644
index 0000000..220f5a0
--- /dev/null
+++ b/StepTalkShell/.svn/text-base/stshell_tool.m.svn-base
@@ -0,0 +1,253 @@
+/**
+ stshell
+ StepTalk Shell
+
+ Copyright (c) 2002 Free Software Foundation
+
+ Written by: Stefan Urbanek <urbanek@host.sk>
+ Date: 2002 May 29
+
+ This file is part of the StepTalk project.
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02111, USA.
+
+ */
+
+#import <StepTalk/StepTalk.h>
+
+#import "STShell.h"
+
+#import <Foundation/NSArray.h>
+#import <Foundation/NSAutoreleasePool.h>
+#import <Foundation/NSDebug.h>
+#import <Foundation/NSException.h>
+#import <Foundation/NSProcessInfo.h>
+#import <Foundation/NSString.h>
+
+@interface STShellTool:NSObject
+{
+ STConversation *conversation;
+ NSArray *arguments;
+ unsigned int currentArg;
+
+ NSString *environmentName;
+ NSString *hostName;
+ NSString *typeName;
+ NSString *languageName;
+
+}
+- (int)parseArguments;
+- (NSString *)nextArgument;
+- (void)reuseArgument;
+- (void)run;
+- (void)printHelp;
+@end
+
+@implementation STShellTool
+- (int)parseArguments
+{
+ NSString *arg;
+ BOOL isOption = NO;
+
+ arguments = [[NSProcessInfo processInfo] arguments];
+
+ [self nextArgument];
+
+ while( (arg = [self nextArgument]) )
+ {
+ isOption = NO;
+ if( [arg hasPrefix:@"--"] )
+ {
+ arg = [arg substringFromIndex:2];
+ isOption = YES;
+ }
+ else if( [arg hasPrefix:@"-"] )
+ {
+ arg = [arg substringFromIndex:1];
+ isOption = YES;
+ }
+
+ if ([@"help" hasPrefix:arg])
+ {
+ [self printHelp];
+ return 1;
+ }
+ else if ([@"language" hasPrefix:arg])
+ {
+ RELEASE(languageName);
+ languageName = [self nextArgument];
+ if(!languageName)
+ {
+ [NSException raise:@"STShellToolException"
+ format:@"Language name expected"];
+ }
+ }
+ else if ([@"environment" hasPrefix:arg])
+ {
+ RELEASE(environmentName);
+ environmentName = [self nextArgument];
+ if(!environmentName)
+ {
+ [NSException raise:@"STShellToolException"
+ format:@"Environment name expected"];
+ }
+ }
+ else if ([@"host" hasPrefix:arg])
+ {
+ RELEASE(hostName);
+ hostName = [self nextArgument];
+ if(!hostName)
+ {
+ [NSException raise:@"STShellToolException"
+ format:@"Host name expected"];
+ }
+ }
+ else if ([@"type" hasPrefix:arg])
+ {
+ RELEASE(typeName);
+ typeName = [self nextArgument];
+ if(!typeName)
+ {
+ [NSException raise:@"STShellToolException"
+ format:@"Environment description (type) name expected"];
+ }
+ }
+ else if(!isOption)
+ {
+ break;
+ }
+ }
+
+ if(arg)
+ {
+ [self reuseArgument];
+ }
+
+ return 0;
+}
+
+- (NSString *)nextArgument
+{
+ if(currentArg < [arguments count])
+ {
+ return [arguments objectAtIndex:currentArg++];
+ }
+
+ return nil;
+}
+
+- (void)reuseArgument
+{
+ currentArg--;
+}
+/* Method taken from stexec.m - look there for updates */
+- (void)createConversation
+{
+ STEnvironmentDescription *desc;
+ STEnvironment *environment;
+
+ if(environmentName)
+ {
+ /* user wants to connect to a distant environment */
+ conversation = [[STRemoteConversation alloc]
+ initWithEnvironmentName:environmentName
+ host:hostName
+ language:languageName];
+ if(!conversation)
+ {
+ NSLog(@"Unable to connect to %@@%@", environmentName, hostName);
+ return;
+ }
+ }
+ else
+ {
+ /* User wants local temporary environment */
+ if(!typeName || [typeName isEqualToString:@""])
+ {
+ environment = [STEnvironment environmentWithDefaultDescription];
+ }
+ else
+ {
+ desc = [STEnvironmentDescription descriptionWithName:typeName];
+ environment = [STEnvironment environmentWithDescription:desc];
+ }
+
+ /* Register basic objects: Environment, Transcript */
+
+ [environment setObject:environment forName:@"Environment"];
+ [environment loadModule:@"SimpleTranscript"];
+ [environment setCreatesUnknownObjects:YES];
+
+ /* FIXME: make this an option */
+ [environment setFullScriptingEnabled:YES];
+
+ conversation = [[STConversation alloc] initWithContext:environment
+ language:languageName];
+ }
+}
+
+- (void)run
+{
+ STShell *shell;
+
+ [self parseArguments];
+ [self createConversation];
+
+ if(!languageName || [languageName isEqualToString:@""])
+ {
+ languageName = [[STLanguageManager defaultManager] defaultLanguage];
+ }
+
+ [conversation setLanguage:languageName];
+
+ shell = [[STShell alloc] initWithConversation:conversation];
+ [shell run];
+
+ NSDebugLog(@"Exiting StepTalk shell");
+}
+
+- (void)printHelp
+{
+ NSProcessInfo *info = [NSProcessInfo processInfo];
+
+ printf("%s - StepTalk shell\n"
+ "Usage: %s [options]\n\n"
+ "Options are:\n"
+ " -help this text\n"
+ " -language lang use language lang\n"
+ " -environment env use scripting environment with name env\n"
+ " -host host find environment on host\n"
+ " -type desc use environment description with name 'desc'\n",
+ [[info processName] cString],[[info processName] cString]
+ );
+}
+
+@end
+
+
+int main(int argc, const char **argv)
+{
+ NSAutoreleasePool *pool;
+ STShellTool *tool;
+
+ pool = [NSAutoreleasePool new];
+
+ tool = [[STShellTool alloc] init];
+ [tool run];
+
+ RELEASE(pool);
+
+ return 0;
+}
diff --git a/StepTalkShell/AppKit.txt b/StepTalkShell/AppKit.txt
new file mode 100644
index 0000000..ea79ab9
--- /dev/null
+++ b/StepTalkShell/AppKit.txt
@@ -0,0 +1,40 @@
+Simple AppKit Examples
+----------------------
+To be able to try following examples you have to load the AppKit module:
+
+ > Environment loadModule: 'AppKit'
+
+
+How to get a filename using the Open panel
+
+ > NSOpenPanel openPanel runModal ; filename
+
+Applications and files
+----------------------
+
+> Workspace := NSWorkspace sharedWorkspace
+
+How to launch an application
+
+ > Workspace launchApplication:'application name'
+
+How to open a file
+
+ > Workspace openFile:'file name'
+
+How to open a file with specified application
+
+ > Workspace openFile:'file name' withApplication:'application name'
+
+How to open a file using the open panel
+
+ > Workspace openFile:(NSOpenPanel openPanel runModal ; filename)
+
+Text
+----
+
+How to display a RTF file
+
+ > text := NSAttributedString alloc
+ > text initWithPath: file documentAttributes:nil
+ > Transcript show: (text string)
diff --git a/StepTalkShell/COPYING b/StepTalkShell/COPYING
new file mode 100644
index 0000000..d511905
--- /dev/null
+++ b/StepTalkShell/COPYING
@@ -0,0 +1,339 @@
+ GNU GENERAL PUBLIC LICENSE
+ Version 2, June 1991
+
+ Copyright (C) 1989, 1991 Free Software Foundation, Inc.,
+ 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ Everyone is permitted to copy and distribute verbatim copies
+ of this license document, but changing it is not allowed.
+
+ Preamble
+
+ The licenses for most software are designed to take away your
+freedom to share and change it. By contrast, the GNU General Public
+License is intended to guarantee your freedom to share and change free
+software--to make sure the software is free for all its users. This
+General Public License applies to most of the Free Software
+Foundation's software and to any other program whose authors commit to
+using it. (Some other Free Software Foundation software is covered by
+the GNU Lesser General Public License instead.) You can apply it to
+your programs, too.
+
+ When we speak of free software, we are referring to freedom, not
+price. Our General Public Licenses are designed to make sure that you
+have the freedom to distribute copies of free software (and charge for
+this service if you wish), that you receive source code or can get it
+if you want it, that you can change the software or use pieces of it
+in new free programs; and that you know you can do these things.
+
+ To protect your rights, we need to make restrictions that forbid
+anyone to deny you these rights or to ask you to surrender the rights.
+These restrictions translate to certain responsibilities for you if you
+distribute copies of the software, or if you modify it.
+
+ For example, if you distribute copies of such a program, whether
+gratis or for a fee, you must give the recipients all the rights that
+you have. You must make sure that they, too, receive or can get the
+source code. And you must show them these terms so they know their
+rights.
+
+ We protect your rights with two steps: (1) copyright the software, and
+(2) offer you this license which gives you legal permission to copy,
+distribute and/or modify the software.
+
+ Also, for each author's protection and ours, we want to make certain
+that everyone understands that there is no warranty for this free
+software. If the software is modified by someone else and passed on, we
+want its recipients to know that what they have is not the original, so
+that any problems introduced by others will not reflect on the original
+authors' reputations.
+
+ Finally, any free program is threatened constantly by software
+patents. We wish to avoid the danger that redistributors of a free
+program will individually obtain patent licenses, in effect making the
+program proprietary. To prevent this, we have made it clear that any
+patent must be licensed for everyone's free use or not licensed at all.
+
+ The precise terms and conditions for copying, distribution and
+modification follow.
+
+ GNU GENERAL PUBLIC LICENSE
+ TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
+
+ 0. This License applies to any program or other work which contains
+a notice placed by the copyright holder saying it may be distributed
+under the terms of this General Public License. The "Program", below,
+refers to any such program or work, and a "work based on the Program"
+means either the Program or any derivative work under copyright law:
+that is to say, a work containing the Program or a portion of it,
+either verbatim or with modifications and/or translated into another
+language. (Hereinafter, translation is included without limitation in
+the term "modification".) Each licensee is addressed as "you".
+
+Activities other than copying, distribution and modification are not
+covered by this License; they are outside its scope. The act of
+running the Program is not restricted, and the output from the Program
+is covered only if its contents constitute a work based on the
+Program (independent of having been made by running the Program).
+Whether that is true depends on what the Program does.
+
+ 1. You may copy and distribute verbatim copies of the Program's
+source code as you receive it, in any medium, provided that you
+conspicuously and appropriately publish on each copy an appropriate
+copyright notice and disclaimer of warranty; keep intact all the
+notices that refer to this License and to the absence of any warranty;
+and give any other recipients of the Program a copy of this License
+along with the Program.
+
+You may charge a fee for the physical act of transferring a copy, and
+you may at your option offer warranty protection in exchange for a fee.
+
+ 2. You may modify your copy or copies of the Program or any portion
+of it, thus forming a work based on the Program, and copy and
+distribute such modifications or work under the terms of Section 1
+above, provided that you also meet all of these conditions:
+
+ a) You must cause the modified files to carry prominent notices
+ stating that you changed the files and the date of any change.
+
+ b) You must cause any work that you distribute or publish, that in
+ whole or in part contains or is derived from the Program or any
+ part thereof, to be licensed as a whole at no charge to all third
+ parties under the terms of this License.
+
+ c) If the modified program normally reads commands interactively
+ when run, you must cause it, when started running for such
+ interactive use in the most ordinary way, to print or display an
+ announcement including an appropriate copyright notice and a
+ notice that there is no warranty (or else, saying that you provide
+ a warranty) and that users may redistribute the program under
+ these conditions, and telling the user how to view a copy of this
+ License. (Exception: if the Program itself is interactive but
+ does not normally print such an announcement, your work based on
+ the Program is not required to print an announcement.)
+
+These requirements apply to the modified work as a whole. If
+identifiable sections of that work are not derived from the Program,
+and can be reasonably considered independent and separate works in
+themselves, then this License, and its terms, do not apply to those
+sections when you distribute them as separate works. But when you
+distribute the same sections as part of a whole which is a work based
+on the Program, the distribution of the whole must be on the terms of
+this License, whose permissions for other licensees extend to the
+entire whole, and thus to each and every part regardless of who wrote it.
+
+Thus, it is not the intent of this section to claim rights or contest
+your rights to work written entirely by you; rather, the intent is to
+exercise the right to control the distribution of derivative or
+collective works based on the Program.
+
+In addition, mere aggregation of another work not based on the Program
+with the Program (or with a work based on the Program) on a volume of
+a storage or distribution medium does not bring the other work under
+the scope of this License.
+
+ 3. You may copy and distribute the Program (or a work based on it,
+under Section 2) in object code or executable form under the terms of
+Sections 1 and 2 above provided that you also do one of the following:
+
+ a) Accompany it with the complete corresponding machine-readable
+ source code, which must be distributed under the terms of Sections
+ 1 and 2 above on a medium customarily used for software interchange; or,
+
+ b) Accompany it with a written offer, valid for at least three
+ years, to give any third party, for a charge no more than your
+ cost of physically performing source distribution, a complete
+ machine-readable copy of the corresponding source code, to be
+ distributed under the terms of Sections 1 and 2 above on a medium
+ customarily used for software interchange; or,
+
+ c) Accompany it with the information you received as to the offer
+ to distribute corresponding source code. (This alternative is
+ allowed only for noncommercial distribution and only if you
+ received the program in object code or executable form with such
+ an offer, in accord with Subsection b above.)
+
+The source code for a work means the preferred form of the work for
+making modifications to it. For an executable work, complete source
+code means all the source code for all modules it contains, plus any
+associated interface definition files, plus the scripts used to
+control compilation and installation of the executable. However, as a
+special exception, the source code distributed need not include
+anything that is normally distributed (in either source or binary
+form) with the major components (compiler, kernel, and so on) of the
+operating system on which the executable runs, unless that component
+itself accompanies the executable.
+
+If distribution of executable or object code is made by offering
+access to copy from a designated place, then offering equivalent
+access to copy the source code from the same place counts as
+distribution of the source code, even though third parties are not
+compelled to copy the source along with the object code.
+
+ 4. You may not copy, modify, sublicense, or distribute the Program
+except as expressly provided under this License. Any attempt
+otherwise to copy, modify, sublicense or distribute the Program is
+void, and will automatically terminate your rights under this License.
+However, parties who have received copies, or rights, from you under
+this License will not have their licenses terminated so long as such
+parties remain in full compliance.
+
+ 5. You are not required to accept this License, since you have not
+signed it. However, nothing else grants you permission to modify or
+distribute the Program or its derivative works. These actions are
+prohibited by law if you do not accept this License. Therefore, by
+modifying or distributing the Program (or any work based on the
+Program), you indicate your acceptance of this License to do so, and
+all its terms and conditions for copying, distributing or modifying
+the Program or works based on it.
+
+ 6. Each time you redistribute the Program (or any work based on the
+Program), the recipient automatically receives a license from the
+original licensor to copy, distribute or modify the Program subject to
+these terms and conditions. You may not impose any further
+restrictions on the recipients' exercise of the rights granted herein.
+You are not responsible for enforcing compliance by third parties to
+this License.
+
+ 7. If, as a consequence of a court judgment or allegation of patent
+infringement or for any other reason (not limited to patent issues),
+conditions are imposed on you (whether by court order, agreement or
+otherwise) that contradict the conditions of this License, they do not
+excuse you from the conditions of this License. If you cannot
+distribute so as to satisfy simultaneously your obligations under this
+License and any other pertinent obligations, then as a consequence you
+may not distribute the Program at all. For example, if a patent
+license would not permit royalty-free redistribution of the Program by
+all those who receive copies directly or indirectly through you, then
+the only way you could satisfy both it and this License would be to
+refrain entirely from distribution of the Program.
+
+If any portion of this section is held invalid or unenforceable under
+any particular circumstance, the balance of the section is intended to
+apply and the section as a whole is intended to apply in other
+circumstances.
+
+It is not the purpose of this section to induce you to infringe any
+patents or other property right claims or to contest validity of any
+such claims; this section has the sole purpose of protecting the
+integrity of the free software distribution system, which is
+implemented by public license practices. Many people have made
+generous contributions to the wide range of software distributed
+through that system in reliance on consistent application of that
+system; it is up to the author/donor to decide if he or she is willing
+to distribute software through any other system and a licensee cannot
+impose that choice.
+
+This section is intended to make thoroughly clear what is believed to
+be a consequence of the rest of this License.
+
+ 8. If the distribution and/or use of the Program is restricted in
+certain countries either by patents or by copyrighted interfaces, the
+original copyright holder who places the Program under this License
+may add an explicit geographical distribution limitation excluding
+those countries, so that distribution is permitted only in or among
+countries not thus excluded. In such case, this License incorporates
+the limitation as if written in the body of this License.
+
+ 9. The Free Software Foundation may publish revised and/or new versions
+of the General Public License from time to time. Such new versions will
+be similar in spirit to the present version, but may differ in detail to
+address new problems or concerns.
+
+Each version is given a distinguishing version number. If the Program
+specifies a version number of this License which applies to it and "any
+later version", you have the option of following the terms and conditions
+either of that version or of any later version published by the Free
+Software Foundation. If the Program does not specify a version number of
+this License, you may choose any version ever published by the Free Software
+Foundation.
+
+ 10. If you wish to incorporate parts of the Program into other free
+programs whose distribution conditions are different, write to the author
+to ask for permission. For software which is copyrighted by the Free
+Software Foundation, write to the Free Software Foundation; we sometimes
+make exceptions for this. Our decision will be guided by the two goals
+of preserving the free status of all derivatives of our free software and
+of promoting the sharing and reuse of software generally.
+
+ NO WARRANTY
+
+ 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY
+FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN
+OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES
+PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED
+OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS
+TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE
+PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING,
+REPAIR OR CORRECTION.
+
+ 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
+WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR
+REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES,
+INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING
+OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED
+TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY
+YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER
+PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE
+POSSIBILITY OF SUCH DAMAGES.
+
+ END OF TERMS AND CONDITIONS
+
+ How to Apply These Terms to Your New Programs
+
+ If you develop a new program, and you want it to be of the greatest
+possible use to the public, the best way to achieve this is to make it
+free software which everyone can redistribute and change under these terms.
+
+ To do so, attach the following notices to the program. It is safest
+to attach them to the start of each source file to most effectively
+convey the exclusion of warranty; and each file should have at least
+the "copyright" line and a pointer to where the full notice is found.
+
+ <one line to give the program's name and a brief idea of what it does.>
+ Copyright (C) <year> <name of author>
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License along
+ with this program; if not, write to the Free Software Foundation, Inc.,
+ 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+
+Also add information on how to contact you by electronic and paper mail.
+
+If the program is interactive, make it output a short notice like this
+when it starts in an interactive mode:
+
+ Gnomovision version 69, Copyright (C) year name of author
+ Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
+ This is free software, and you are welcome to redistribute it
+ under certain conditions; type `show c' for details.
+
+The hypothetical commands `show w' and `show c' should show the appropriate
+parts of the General Public License. Of course, the commands you use may
+be called something other than `show w' and `show c'; they could even be
+mouse-clicks or menu items--whatever suits your program.
+
+You should also get your employer (if you work as a programmer) or your
+school, if any, to sign a "copyright disclaimer" for the program, if
+necessary. Here is a sample; alter the names:
+
+ Yoyodyne, Inc., hereby disclaims all copyright interest in the program
+ `Gnomovision' (which makes passes at compilers) written by James Hacker.
+
+ <signature of Ty Coon>, 1 April 1989
+ Ty Coon, President of Vice
+
+This General Public License does not permit incorporating your program into
+proprietary programs. If your program is a subroutine library, you may
+consider it more useful to permit linking proprietary applications with the
+library. If this is what you want to do, use the GNU Lesser General
+Public License instead of this License.
diff --git a/StepTalkShell/ChangeLog b/StepTalkShell/ChangeLog
new file mode 100644
index 0000000..8653fb6
--- /dev/null
+++ b/StepTalkShell/ChangeLog
@@ -0,0 +1,58 @@
+2005 Aug 30
+
+ * use STLanguageManager instead of removed STLanguage
+
+2005 Aug 15
+
+ * Added distant environments
+ * Removed named objects as they were causing troubles with distant
+ environments
+ * Suspend completion for distant environments
+
+ Warning: option 'environment' has different meaning. See stshell --help.
+
+2003 Sep 21
+
+ * Added named objects FileManager, LastCommand and LastObject
+
+2003 Jun 19
+
+ * Renamed stshell.m to stshell_tool.m. MS Windows was causing problems with
+ case insensitive file system.
+ (Reported by Michael Adams <mdmkolbe@yahoo.com>)
+
+2003 Apr 04 David Ayers <d.ayers@inode.at>
+
+ * GNUmakefile: Added flags to show all warnings except for import.
+ * STShell.m: Unified name for private categories.
+
+2003 Jan 16 Stefan Urbanek <urbanek@host.sk>
+
+ * GNUmakefile: Added -lncurses
+
+2002 Jun 21 Stefan Urbanek <urbanek@host.sk>
+
+ * Added executeScriptNamed:
+
+2002 Jun 8 Stefan Urbanek <urbanek@host.sk>
+
+ * Reflect STEnvironment changes
+ * Removed loading of Foundation module as this is handleb by the
+ STEnvironment
+
+2002 Jun 7 Stefan Urbanek <urbanek@host.sk>
+
+ * Changed printing of result object (handle arrays, dictionaries and sets
+ different way)
+
+2002 Jun 6 Stefan Urbanek <urbanek@host.sk>
+
+ * Update completition list lazily (only when needed)
+
+2002 Jun 4 Stefan Urbanek <urbanek@host.sk>
+
+ * add DistributedFinder object finder to the environment
+
+2002 May 30 Stefan Urbanek <urbanek@host.sk>
+
+ * added Environment object.
diff --git a/StepTalkShell/GNUmakefile b/StepTalkShell/GNUmakefile
new file mode 100644
index 0000000..d8f775b
--- /dev/null
+++ b/StepTalkShell/GNUmakefile
@@ -0,0 +1,35 @@
+#
+# StepTalk tools
+#
+# Copyright (C) 2002 Stefan Urbanek
+#
+# This file is part of the StepTalk.
+#
+# This library is free software; you can redistribute it and/or
+# modify it under the terms of the GNU Library General Public
+# License as published by the Free Software Foundation; either
+# version 2 of the License, or (at your option) any later version.
+#
+# This library is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+# Library General Public License for more details.
+#
+# You should have received a copy of the GNU Library General Public
+# License along with this library; if not, write to the Free
+# Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02111, USA.
+#
+
+include $(GNUSTEP_MAKEFILES)/common.make
+
+TOOL_NAME = stshell
+
+stshell_OBJC_FILES = STShell.m STShell+output.m stshell_tool.m
+
+ADDITIONAL_TOOL_LIBS += -lStepTalk -lreadline -lncurses -lToiletKit -L../ToiletKit.framework
+
+ADDITIONAL_OBJCFLAGS = -Wall -Wno-import
+
+-include GNUmakefile.preamble
+include $(GNUSTEP_MAKEFILES)/tool.make
+-include GNUMakefile.postamble
diff --git a/StepTalkShell/README b/StepTalkShell/README
new file mode 100644
index 0000000..96bd556
--- /dev/null
+++ b/StepTalkShell/README
@@ -0,0 +1,88 @@
+stshell
+-------
+
+Author: Stefan Urbanek <urbanek@host.sk>
+
+
+What is stshell?
+-----------------
+StepTalk Shell is an interactive tool for communicating with objects.
+
+Features
+--------
+ - GNUstep classes and objects
+ - command-line editing
+ - TAB completition of named objects and selectors
+
+For more information read included *.txt files.
+
+Installation
+------------
+Requirements: StepTalk and the readline library (development files)
+
+ > make
+ > make install
+
+Running
+-------
+To run stshell with default language, run just
+
+ > stshell
+
+If you would like to use another language, then use
+
+ > stshell -language AnotherLanguage
+
+To use AppKit
+
+ > stshell -environment AppKit
+
+To use it as a distributed objects 'glue'
+
+ > stshell -environment Distributed
+
+The shell will greet you with 'Welcome to the StepTalk shell.' message.
+
+ Welcome to the StepTalk shell.
+ StepTalk > _
+
+Now you may write statements in the language you have specified.
+
+ StepTalk > Transcript showLine:'Current date is ', ((NSDate date) description)
+
+If the line is too long, then you may use the backslash '\' character at the end
+of the line to continue on the next line.
+
+ StepTalk > Transcript showLine:'Current date is ', \
+ ... ? ((NSDate date) description)
+
+Objects history array
+---------------------
+All results from the expressions are stored in the 'Objects' array. The example
+above can be written in more steps:
+
+ StepTalk > ((NSDate date) description)
+ 0: 2002-05-29 22:41:57 +0200
+ StepTalk > 'Current date is ', (Objects @ 0)
+ 1: Current date is 2002-05-29 22:41:57 +0200
+ StepTalk > Transcript showLine: (Objects @ 1)
+ Current date is 2002-05-29 22:41:57 +0200
+
+To show all objects type:
+
+ StepTalk > Shell listObjects
+ Objects
+ 0: '2002-05-29 22:41:57 +0200' (GSCInlineString)
+ 1: 'Current date is 2002-05-29 22:41:57 +020...' (GSUnicodeString)
+
+TAB completition
+----------------
+Here is an example of TAB completition.
+ StepTalk > Tr<TAB> showL<TAB>:'Current date is ', ((NSDate date) desc<TAB>i<TAB>)
+
+Feedback
+--------
+Any questions, comments and bug reports are velcome at
+
+ urbanek@host.sk
+
diff --git a/StepTalkShell/STShell+output.m b/StepTalkShell/STShell+output.m
new file mode 100644
index 0000000..8f7d0ea
--- /dev/null
+++ b/StepTalkShell/STShell+output.m
@@ -0,0 +1,165 @@
+/**
+ STShell+output
+
+ Copyright (c) 2002 Free Software Foundation
+
+ Written by: Stefan Urbanek <urbanek@host.sk>
+ Date: 2002 Jun 7
+
+ This file is part of the StepTalk project.
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02111, USA.
+
+ */
+
+#import "STShell.h"
+
+#import <StepTalk/StepTalk.h>
+
+#import <Foundation/NSArray.h>
+#import <Foundation/NSBundle.h>
+#import <Foundation/NSDebug.h>
+#import <Foundation/NSNotification.h>
+#import <Foundation/NSException.h>
+#import <Foundation/NSSet.h>
+#import <Foundation/NSString.h>
+#import <Foundation/NSValue.h>
+
+#include <readline/readline.h>
+
+@implementation STShell(STShellOutput)
+- show:(id)anObject
+{
+ printf("%s", [[anObject description] cString]);
+
+ return self;
+}
+- showLine:(id)anObject
+{
+ [self show:anObject];
+ putchar('\n');
+
+ return nil;
+}
+- (void)showError:(NSString *)errString
+{
+ fprintf(stderr, "%s\n\n", [errString cString]);
+}
+
+- showResult:(id)obj
+{
+ const char *className = [NSStringFromClass([obj class]) cString];
+ int objIndex = [objectStack count] - 1;
+ int i;
+
+ if(obj)
+ {
+ if([obj isKindOfClass:[NSArray class]])
+ {
+ printf("(%i) %s\n", objIndex, className);
+
+ for(i = 0;i<[obj count]; i++)
+ {
+ printf("%i %s\n", i,
+ [self displayCStringForObject:[obj objectAtIndex:i]]);
+ }
+
+ }
+ else if([obj isKindOfClass:[NSSet class]])
+ {
+ printf("(%i) %s\n", objIndex, className);
+
+ obj = [[obj allObjects] sortedArrayUsingSelector:@selector(compare:)];
+ for(i = 0;i<[obj count]; i++)
+ {
+ printf("%s\n",
+ [self displayCStringForObject:[obj objectAtIndex:i]]);
+ }
+
+ }
+ else if([obj isKindOfClass:[NSDictionary class]])
+ {
+ NSString *key;
+ NSArray *keys;
+
+ printf("(%i) %s\n", objIndex, className);
+
+ keys = [[obj allKeys] sortedArrayUsingSelector:@selector(compare:)];
+
+ for(i = 0;i<[keys count]; i++)
+ {
+ key = [keys objectAtIndex:i];
+ printf("%s : %s\n",
+ [self displayCStringForObject:key],
+ [self displayCStringForObject:[obj objectForKey:key]]);
+ }
+ }
+ else
+ {
+ printf("(%i) %s\n", objIndex, [self displayCStringForObject:obj]);
+ }
+ }
+
+ return self;
+}
+- (char *)displayCStringForObject:(id)object
+{
+ NSString *str = [object description];
+
+ if( [str length] > 60 )
+ {
+ str = [str substringToIndex:60];
+ str = [str stringByAppendingString:@"..."];
+ }
+
+ return [str cString];
+}
+
+- showException:(NSException *)exception
+{
+ printf("Error (%s): %s\n",
+ [[exception name] cString],
+ [[exception reason] cString]);
+
+
+ return self;
+}
+
+- (id)listObjects
+{
+ NSString *str;
+ int i;
+ id object;
+
+ printf("Objects\n");
+ for(i = 0; i < [objectStack count]; i++)
+ {
+ object = [objectStack objectAtIndex:i];
+
+ str = [object description];
+
+ if( [str length] > 60 )
+ {
+ str = [str substringToIndex:60];
+ str = [str stringByAppendingString:@"..."];
+ }
+
+ printf("%4i: '%s' (%s)\n", i,
+ [str cString],
+ [[[object class] description] cString]);
+ }
+ return nil;
+}
+@end
diff --git a/StepTalkShell/STShell.h b/StepTalkShell/STShell.h
new file mode 100644
index 0000000..f807aef
--- /dev/null
+++ b/StepTalkShell/STShell.h
@@ -0,0 +1,80 @@
+/**
+ STShell
+ StepTalk Shell
+
+ Copyright (c) 2002 Free Software Foundation
+
+ Written by: Stefan Urbanek <urbanek@host.sk>
+ Date: 2002 May 29
+
+ This file is part of the StepTalk project.
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02111, USA.
+
+ */
+
+#import <Foundation/NSObject.h>
+
+@class STConversation;
+@class STEnvironment;
+@class STScriptsManager;
+@class NSMutableArray;
+@class NSException;
+
+@interface STShell:NSObject
+{
+ STScriptsManager *scriptsManager;
+ STConversation *conversation;
+
+ NSString *prompt;
+ NSString *source;
+
+ NSMutableArray *objectStack;
+
+ BOOL exitRequest;
+
+ BOOL updateCompletionList;
+ NSArray *completionList;
+ BOOL completionEnabled;
+
+}
+- initWithEnvironment:(STEnvironment *)env;
+
+- (void)setLanguage:(NSString *)langName;
+- (void)setEnvironment:(STEnvironment *)newEnv;
+- (STEnvironment *)environment;
+
+- (void)run;
+
+- show:(id)anObject;
+- showLine:(id)anObject;
+
+- (id)executeLine:(NSString *)line;
+
+- showResult:(id)obj;
+- showException:(NSException *)exception;
+- (void)showError:(NSString *)errString;
+@end
+
+@interface STShell(STShellOutput)
+
+- show:(id)anObject;
+- showLine:(id)anObject;
+- showResult:(id)obj;
+- (char *)displayCStringForObject:(id)object;
+- showException:(NSException *)exception;
+- (id)listObjects;
+
+@end
diff --git a/StepTalkShell/STShell.m b/StepTalkShell/STShell.m
new file mode 100644
index 0000000..57c2120
--- /dev/null
+++ b/StepTalkShell/STShell.m
@@ -0,0 +1,404 @@
+/**
+ STShell
+ StepTalk Shell
+
+ Copyright (c) 2002 Free Software Foundation
+
+ Written by: Stefan Urbanek <urbanek@host.sk>
+ Date: 2002 May 29
+
+ This file is part of the StepTalk project.
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02111, USA.
+
+ */
+
+#import "STShell.h"
+
+#import <StepTalk/StepTalk.h>
+
+#import <Foundation/NSArray.h>
+#import <Foundation/NSBundle.h>
+#import <Foundation/NSDebug.h>
+#import <Foundation/NSNotification.h>
+#import <Foundation/NSException.h>
+#import <Foundation/NSFileManager.h>
+#import <Foundation/NSSet.h>
+#import <Foundation/NSString.h>
+#import <Foundation/NSValue.h>
+
+#include <readline/readline.h>
+
+static Class NSString_class;
+static Class NSNumber_class;
+
+NSArray *objcSelectors = nil;
+
+static STShell *sharedShell = nil;
+
+@interface STShell(STPrivateMethods)
+- (int) completion;
+- (NSString *)readLine;
+- (void)initReadline;
+@end
+
+int complete_handler(void)
+{
+ return [sharedShell completion];
+}
+
+@implementation STShell
+
++ (void)initialize
+{
+ NSString_class = [NSString class];
+ NSNumber_class = [NSNumber class];
+}
+
++ sharedShell
+{
+ return sharedShell;
+}
+
+- initWithConversation:(STConversation *)conv
+{
+ self = [super init];
+
+ [self initReadline];
+
+ objectStack = [[NSMutableArray alloc] init];
+
+ [[NSNotificationCenter defaultCenter]
+ addObserver:self
+ selector:@selector(bundleLoaded:)
+ name:NSBundleDidLoadNotification
+ object:nil];
+
+ scriptsManager = RETAIN([STScriptsManager defaultManager]);
+ prompt = @"StepTalk > ";
+
+ conversation = RETAIN(conv);
+
+ /* FIXME: make this more clever for completion handler */
+ if(!sharedShell)
+ {
+ sharedShell = self;
+ }
+
+ return self;
+}
+
+- (void)updateCompletionList
+{
+ NSMutableArray *array = [[NSMutableArray alloc] init];
+ RELEASE(completionList);
+
+ [array addObjectsFromArray:STAllObjectiveCSelectors()];
+
+ completionList = [[NSArray alloc] initWithArray:array];
+
+ updateCompletionList = NO;
+}
+
+- (void)dealloc
+{
+ RELEASE(objectStack);
+ RELEASE(completionList);
+ RELEASE(scriptsManager);
+ RELEASE(conversation);
+
+ [[NSNotificationCenter defaultCenter] removeObserver:self];
+
+ [super dealloc];
+}
+-(void)bundleLoaded:(NSNotification *)notif
+{
+ updateCompletionList = YES;
+}
+
+- (void)initReadline
+{
+ rl_initialize();
+ rl_bind_key('\t', complete_handler);
+}
+
+- (void)setLanguage:(NSString *)langName
+{
+ NSDebugLog(@"Setting language to %@", langName);
+
+ [conversation setLanguage:langName];
+}
+
+- (void)setEnvironment:(STEnvironment *)newEnv
+{
+ [conversation setEnvironment:newEnv];
+}
+
+- (STEnvironment *)environment
+{
+ return [conversation context];
+}
+
+- (void)run
+{
+ STEnvironment *env;
+ NSString *line;
+ id result;
+
+ [self showLine:@"Welcome to the StepTalk shell."];
+
+ // NSLog(@"Environment %@", env);
+
+ if(![conversation isKindOfClass:[STRemoteConversation class]])
+ {
+ completionEnabled = YES;
+ }
+ else
+ {
+ [self showLine:@"Note: Completion disabled for distant conversation"];
+ }
+
+ while(1)
+ {
+ line = [self readLine];
+
+ if(exitRequest)
+ break;
+
+ if(!line)
+ continue;
+
+ result = [self executeLine:line];
+
+ if(result)
+ {
+ if(result != objectStack)
+ {
+ [objectStack addObject:result];
+ }
+ [self showResult:result];
+ }
+ else
+ {
+ [self showResult:result];
+ }
+
+ }
+ printf("\n");
+}
+- (id)executeLine:(NSString *)line
+{
+ NSString *cmd;
+ id result = nil;
+
+ /* FIXME: why? */
+
+ cmd = [line stringByAppendingString:@" "];
+ NS_DURING
+ [conversation interpretScript:cmd];
+ result = [conversation result];
+ NS_HANDLER
+ [self showException:localException];
+ NS_ENDHANDLER
+
+ return result;
+}
+
+- (NSString *)readLine
+{
+ char *str;
+ NSString *actualPrompt = prompt;
+ NSString *line = @"";
+ BOOL done = NO;
+ int len;
+
+ while(!done)
+ {
+ str = readline([actualPrompt cString]);
+ done = YES;
+
+ if(!str)
+ {
+ exitRequest = YES;
+ return nil;
+ }
+
+ len = strlen(str);
+ if(!len)
+ return nil;
+
+ if(str[len-1] == '\\')
+ {
+ actualPrompt = @"... ? ";
+ str[strlen(str) - 1] = '\0';
+ done = NO;
+ }
+
+ line = [line stringByAppendingString:[NSString stringWithCString:str]];
+ }
+
+ add_history([line cString]);
+
+ return line;
+}
+
+- (int)completion
+{
+ STEnvironment *env;
+ NSEnumerator *enumerator;
+ NSMutableSet *set;
+ NSString *match;
+ NSString *tail;
+ NSString *str;
+ NSArray *array;
+ int pos = 0;
+ int c;
+
+ if(!completionEnabled)
+ {
+ return 0;
+ }
+
+ if(rl_point <= 0)
+ {
+ return 0;
+ }
+
+ pos = rl_point - 1;
+ c = rl_line_buffer[pos];
+
+ while((isalnum(c) || c == '_') && pos >= 0)
+ {
+ pos--;
+ c = rl_line_buffer[pos];
+ }
+ pos++;
+
+ match = [NSString stringWithCString:rl_line_buffer + pos
+ length:rl_point - pos];
+
+ set = [NSMutableSet set];
+
+ if(!completionList || updateCompletionList)
+ {
+ [self updateCompletionList];
+ }
+
+ enumerator = [completionList objectEnumerator];
+ while( (str = [enumerator nextObject]) )
+ {
+ if( [str hasPrefix:match] )
+ {
+ [set addObject:str];
+ }
+ }
+
+ env = [conversation context];
+ enumerator = [[env knownObjectNames] objectEnumerator];
+ while( (str = [enumerator nextObject]) )
+ {
+ if( [str hasPrefix:match] )
+ {
+ [set addObject:str];
+ }
+ }
+
+ array = [set allObjects];
+
+ if( [array count] == 0 )
+ {
+ printf("\nNo match for completion.\n");
+ rl_forced_update_display();
+ }
+ else if ( [array count] == 1 )
+ {
+ str = [array objectAtIndex:0];
+ str = [str substringFromIndex:rl_point - pos];
+ rl_insert_text([str cString]);
+ rl_insert_text(" ");
+
+ rl_redisplay();
+ }
+ else
+ {
+ enumerator = [array objectEnumerator];
+
+ tail = [enumerator nextObject];
+
+ while( (str = [enumerator nextObject]) )
+ {
+ tail = [str commonPrefixWithString:tail options:NSLiteralSearch];
+ }
+
+ tail = [tail substringFromIndex:[match length]];
+
+ if( tail && ![tail isEqualToString:@""] )
+ {
+ rl_insert_text([tail cString]);
+ rl_redisplay();
+ }
+ else
+ {
+ printf("\n");
+ enumerator = [array objectEnumerator];
+ while( (str = [enumerator nextObject]) )
+ {
+ printf("%s\n", [str cString]);
+ }
+ rl_forced_update_display();
+ }
+ }
+
+
+ return 0;
+}
+
+- (void)exit
+{
+ /* FIXME: this is not nice */
+ exit(0);
+}
+
+- (id)executeScriptNamed:(NSString *)scriptName
+{
+ STScript *script = [scriptsManager scriptWithName:scriptName];
+ id result = nil;
+
+ if(!script)
+ {
+ [self showError:[NSString stringWithFormat:
+ @"Unable to find script with name '%@'",
+ scriptName]];
+ }
+ else
+ {
+ NS_DURING
+ result = [conversation runScriptFromString:[script source]];
+ NS_HANDLER
+ [self showException:localException];
+ NS_ENDHANDLER
+ }
+
+ return result;
+}
+- (void)setPrompt:(NSString *)aString
+{
+ ASSIGN(prompt, aString);
+}
+- (NSString *)prompt
+{
+ return prompt;
+}
+@end
diff --git a/StepTalkShell/Unix.txt b/StepTalkShell/Unix.txt
new file mode 100644
index 0000000..94d3096
--- /dev/null
+++ b/StepTalkShell/Unix.txt
@@ -0,0 +1,194 @@
+Unix shell equivalents
+----------------------
+
+StepTalk is not meant to be used for tasks that can be done using ordinary Unix
+shells. But this does not mean, that it cannot be used for such tasks. In this
+file you may find list of unix commands and tasks and their Smalltalk
+equivalents.
+
+Contents:
+
+ File Manipulation
+ Output
+ Paths and filenames
+ Network
+ Math
+ Date and Time
+
+File manipulation
+-----------------
+
+> fm := NSFileManager defaultManager
+
+ls
+
+ > (fm directoryContentsAtPath: '.') sortedArrayUsingSelector:#compare:
+
+pwd
+
+ > fm currentDirectoryPath
+
+cd path
+
+ > fm changeCurrentDirectoryPath: 'path'
+
+ln -s path other
+
+ > fm createSymbolicLinkAtPath:'path' pathContent:'other'
+
+cp src dest
+
+ > fm copyPath:'src' toPath:'dest' handler: nil
+
+cp file_list dest
+
+ > file_list do: [ :file | fm copyPath:file toPath:'dest' handler: nil ]
+
+mv - as cp, movePath:toPath:handler:
+ln - as cp, linkPath:toPath:handler:
+rm - removeFileAtPath:handler:
+
+mkdir dir
+
+ > fm createDirectoryAtPath:'dir' attributes:nil
+
+df path
+
+ > fm fileSystemAttributesAtPath:'path'
+
+Output
+------
+
+echo 'string'
+
+ > Transcript show:'string'
+
+cat file
+
+ > Transcript show: (NSString stringWithContentsOfFile:'file')
+
+"write a string to a file"
+
+ > ('string' writeToFile:'file' atomically:YES)
+
+"create a string from a file"
+
+ > str := NSString stringWithContentsOfFile:'file'
+
+
+Paths and filenames
+--------------------------------
+For more information, refer to the NSString documentation.
+NSString methods for path manipulation:
+
+ - fileSystemRepresentation
+ - isAbsolutePath
+
+ - pathComponents
+ - lastPathComponent
+ - pathExtension
+
+ - stringByAbbreviatingWithTildeInPath
+ - stringByAppendingPathComponent:
+ - stringByAppendingPathExtension:
+ - stringByDeletingLastPathComponent
+ - stringByDeletingPathExtension
+ - stringByExpandingTildeInPath
+ - stringByResolvingSymlinksInPath
+ - stringByStandardizingPath
+ - stringsByAppendingPaths:
+
+Examples:
+
+ > path := '/usr/GNUstep/System/Applications/Ink.app'
+ > path pathComponents
+ (?) GSArray
+ 0 /
+ 1 usr
+ 2 GNUstep
+ 3 System
+ 4 Applications
+ 5 Ink.app
+
+ > path lastPathComponent
+ (?) Ink.app
+
+ > path pathExtension
+ (?) app
+
+In Smalltalk there is a symbolic selector '/' for NSString that is equivalent to
+the 'stringByAppendingPathComponent:'.
+
+ > path := 'somePath'
+ > filename := 'someFilename'
+ > fullPath := path / filename
+
+Network
+-------
+
+localhost
+
+ > NSHost currentHost name
+
+nslookup host_name
+
+ > (NSHost hostWithName:'host_name') addresses
+
+nslookup host_address
+
+ > (NSHost hostWithAddress:'host_address') names
+
+"download a file from the web"
+
+ > data := NSData dataWithContentsOfURL:'url'
+ > data writeToFile:'file' atomically:YES
+
+"read a file from the web"
+
+ > string := NSString stringWithContentsOfURL:'url'
+
+
+Math
+----
+Just like in:
+ > 1 + 1
+or in:
+ > a := b * c
+
+
+Date and Time
+-------------
+
+date
+ > NSDate date
+...or...
+date
+ > NSCalendarDate date
+
+
+For more information read the NSDate and NSCalendarDate documentation
+
+NSCalendarDate methods:
+
+Creating a date
+
+ + calendarDate
+ + dateWithString:calendarFormat:
+ + dateWithString:calendarFormat:locale:
+ + dateWithYear:month:day:hour:minute:second:timeZone:
+
+Retrieving date elements
+
+ - dayOfCommonEra
+ - dayOfMonth
+ - dayOfWeek
+ - dayOfYear
+ - hourOfDay
+ - minuteOfHour
+ - monthOfYear
+ - secondOfMinute
+ - yearOfCommonEra
+
+Adjusting a date
+
+ - dateByAddingYears:months:days:hours:minutes:seconds:
diff --git a/StepTalkShell/stshell_tool.m b/StepTalkShell/stshell_tool.m
new file mode 100644
index 0000000..220f5a0
--- /dev/null
+++ b/StepTalkShell/stshell_tool.m
@@ -0,0 +1,253 @@
+/**
+ stshell
+ StepTalk Shell
+
+ Copyright (c) 2002 Free Software Foundation
+
+ Written by: Stefan Urbanek <urbanek@host.sk>
+ Date: 2002 May 29
+
+ This file is part of the StepTalk project.
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02111, USA.
+
+ */
+
+#import <StepTalk/StepTalk.h>
+
+#import "STShell.h"
+
+#import <Foundation/NSArray.h>
+#import <Foundation/NSAutoreleasePool.h>
+#import <Foundation/NSDebug.h>
+#import <Foundation/NSException.h>
+#import <Foundation/NSProcessInfo.h>
+#import <Foundation/NSString.h>
+
+@interface STShellTool:NSObject
+{
+ STConversation *conversation;
+ NSArray *arguments;
+ unsigned int currentArg;
+
+ NSString *environmentName;
+ NSString *hostName;
+ NSString *typeName;
+ NSString *languageName;
+
+}
+- (int)parseArguments;
+- (NSString *)nextArgument;
+- (void)reuseArgument;
+- (void)run;
+- (void)printHelp;
+@end
+
+@implementation STShellTool
+- (int)parseArguments
+{
+ NSString *arg;
+ BOOL isOption = NO;
+
+ arguments = [[NSProcessInfo processInfo] arguments];
+
+ [self nextArgument];
+
+ while( (arg = [self nextArgument]) )
+ {
+ isOption = NO;
+ if( [arg hasPrefix:@"--"] )
+ {
+ arg = [arg substringFromIndex:2];
+ isOption = YES;
+ }
+ else if( [arg hasPrefix:@"-"] )
+ {
+ arg = [arg substringFromIndex:1];
+ isOption = YES;
+ }
+
+ if ([@"help" hasPrefix:arg])
+ {
+ [self printHelp];
+ return 1;
+ }
+ else if ([@"language" hasPrefix:arg])
+ {
+ RELEASE(languageName);
+ languageName = [self nextArgument];
+ if(!languageName)
+ {
+ [NSException raise:@"STShellToolException"
+ format:@"Language name expected"];
+ }
+ }
+ else if ([@"environment" hasPrefix:arg])
+ {
+ RELEASE(environmentName);
+ environmentName = [self nextArgument];
+ if(!environmentName)
+ {
+ [NSException raise:@"STShellToolException"
+ format:@"Environment name expected"];
+ }
+ }
+ else if ([@"host" hasPrefix:arg])
+ {
+ RELEASE(hostName);
+ hostName = [self nextArgument];
+ if(!hostName)
+ {
+ [NSException raise:@"STShellToolException"
+ format:@"Host name expected"];
+ }
+ }
+ else if ([@"type" hasPrefix:arg])
+ {
+ RELEASE(typeName);
+ typeName = [self nextArgument];
+ if(!typeName)
+ {
+ [NSException raise:@"STShellToolException"
+ format:@"Environment description (type) name expected"];
+ }
+ }
+ else if(!isOption)
+ {
+ break;
+ }
+ }
+
+ if(arg)
+ {
+ [self reuseArgument];
+ }
+
+ return 0;
+}
+
+- (NSString *)nextArgument
+{
+ if(currentArg < [arguments count])
+ {
+ return [arguments objectAtIndex:currentArg++];
+ }
+
+ return nil;
+}
+
+- (void)reuseArgument
+{
+ currentArg--;
+}
+/* Method taken from stexec.m - look there for updates */
+- (void)createConversation
+{
+ STEnvironmentDescription *desc;
+ STEnvironment *environment;
+
+ if(environmentName)
+ {
+ /* user wants to connect to a distant environment */
+ conversation = [[STRemoteConversation alloc]
+ initWithEnvironmentName:environmentName
+ host:hostName
+ language:languageName];
+ if(!conversation)
+ {
+ NSLog(@"Unable to connect to %@@%@", environmentName, hostName);
+ return;
+ }
+ }
+ else
+ {
+ /* User wants local temporary environment */
+ if(!typeName || [typeName isEqualToString:@""])
+ {
+ environment = [STEnvironment environmentWithDefaultDescription];
+ }
+ else
+ {
+ desc = [STEnvironmentDescription descriptionWithName:typeName];
+ environment = [STEnvironment environmentWithDescription:desc];
+ }
+
+ /* Register basic objects: Environment, Transcript */
+
+ [environment setObject:environment forName:@"Environment"];
+ [environment loadModule:@"SimpleTranscript"];
+ [environment setCreatesUnknownObjects:YES];
+
+ /* FIXME: make this an option */
+ [environment setFullScriptingEnabled:YES];
+
+ conversation = [[STConversation alloc] initWithContext:environment
+ language:languageName];
+ }
+}
+
+- (void)run
+{
+ STShell *shell;
+
+ [self parseArguments];
+ [self createConversation];
+
+ if(!languageName || [languageName isEqualToString:@""])
+ {
+ languageName = [[STLanguageManager defaultManager] defaultLanguage];
+ }
+
+ [conversation setLanguage:languageName];
+
+ shell = [[STShell alloc] initWithConversation:conversation];
+ [shell run];
+
+ NSDebugLog(@"Exiting StepTalk shell");
+}
+
+- (void)printHelp
+{
+ NSProcessInfo *info = [NSProcessInfo processInfo];
+
+ printf("%s - StepTalk shell\n"
+ "Usage: %s [options]\n\n"
+ "Options are:\n"
+ " -help this text\n"
+ " -language lang use language lang\n"
+ " -environment env use scripting environment with name env\n"
+ " -host host find environment on host\n"
+ " -type desc use environment description with name 'desc'\n",
+ [[info processName] cString],[[info processName] cString]
+ );
+}
+
+@end
+
+
+int main(int argc, const char **argv)
+{
+ NSAutoreleasePool *pool;
+ STShellTool *tool;
+
+ pool = [NSAutoreleasePool new];
+
+ tool = [[STShellTool alloc] init];
+ [tool run];
+
+ RELEASE(pool);
+
+ return 0;
+}