00001
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00033
00034 #ifndef GROOVX_TCL_IO_TCLPROCWRAPPER_CC_UTC20050712162004_DEFINED
00035 #define GROOVX_TCL_IO_TCLPROCWRAPPER_CC_UTC20050712162004_DEFINED
00036
00037 #include "tcl-io/tclprocwrapper.h"
00038
00039 #include "io/reader.h"
00040 #include "io/writer.h"
00041
00042 #include "rutz/sfmt.h"
00043
00044 using rutz::fstring;
00045
00046 namespace
00047 {
00048 fstring uniqName()
00049 {
00050 static int c = 0;
00051 return rutz::sfmt("::ProcWrapper_UniqCmd%d", ++c);
00052 }
00053 }
00054
00055 tcl::ProcWrapper::ProcWrapper(const tcl::interpreter& interp) :
00056 itsInterp(interp),
00057 itsName(uniqName()),
00058 itsArgs(),
00059 itsBody()
00060 {}
00061
00062 tcl::ProcWrapper::ProcWrapper(const tcl::interpreter& interp,
00063 const fstring& name) :
00064 itsInterp(interp),
00065 itsName(name),
00066 itsArgs(),
00067 itsBody()
00068 {}
00069
00070 tcl::ProcWrapper::~ProcWrapper() throw()
00071 {
00072
00073
00074
00075
00076 if (itsInterp.is_valid())
00077 {
00078 if (itsInterp.has_command(itsName.c_str()))
00079 itsInterp.delete_proc("", itsName.c_str());
00080 }
00081 }
00082
00083 void tcl::ProcWrapper::read_from(io::reader& reader)
00084 {
00085 fstring args, body;
00086 reader.read_value("args", args);
00087 reader.read_value("body", body);
00088 define(args, body);
00089 }
00090
00091 void tcl::ProcWrapper::write_to(io::writer& writer) const
00092 {
00093 writer.write_value("args", itsArgs);
00094 writer.write_value("body", itsBody);
00095 }
00096
00097 void tcl::ProcWrapper::define(const fstring& args, const fstring& body)
00098 {
00099 itsArgs = args;
00100 itsBody = body;
00101 itsInterp.create_proc("", itsName.c_str(),
00102 itsArgs.c_str(), itsBody.c_str());
00103 }
00104
00105 bool tcl::ProcWrapper::isNoop() const
00106 {
00107 return (itsArgs.is_empty() && itsBody.is_empty());
00108 }
00109
00110 void tcl::ProcWrapper::invoke(const fstring& args)
00111 {
00112 if (isNoop()) return;
00113
00114 itsInterp.eval(rutz::sfmt("%s %s", itsName.c_str(), args.c_str()));
00115 }
00116
00117 fstring tcl::ProcWrapper::fullSpec() const
00118 {
00119 return rutz::sfmt("{%s} {%s}", itsArgs.c_str(), itsBody.c_str());
00120 }
00121
00122 static const char __attribute__((used)) vcid_groovx_tcl_io_tclprocwrapper_cc_utc20050712162004[] = "$Id: tclprocwrapper.cc 10065 2007-04-12 05:54:56Z rjpeters $ $HeadURL: file:
00123 #endif // !GROOVX_TCL_IO_TCLPROCWRAPPER_CC_UTC20050712162004_DEFINED