tclcl.h
上传用户:rrhhcc
上传日期:2015-12-11
资源大小:54129k
文件大小:11k
源码类别:

通讯编程

开发平台:

Visual C++

  1. /*
  2.  * Copyright (c) 1993-1994 Regents of the University of California.
  3.  * All rights reserved.
  4.  *
  5.  * Redistribution and use in source and binary forms, with or without
  6.  * modification, are permitted provided that the following conditions
  7.  * are met:
  8.  * 1. Redistributions of source code must retain the above copyright
  9.  *    notice, this list of conditions and the following disclaimer.
  10.  * 2. Redistributions in binary form must reproduce the above copyright
  11.  *    notice, this list of conditions and the following disclaimer in the
  12.  *    documentation and/or other materials provided with the distribution.
  13.  * 3. All advertising materials mentioning features or use of this software
  14.  *    must display the following acknowledgement:
  15.  *      This product includes software developed by the University of
  16.  *      California, Berkeley and the Network Research Group at
  17.  *      Lawrence Berkeley Laboratory.
  18.  * 4. Neither the name of the University nor of the Laboratory may be used
  19.  *    to endorse or promote products derived from this software without
  20.  *    specific prior written permission.
  21.  *
  22.  * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
  23.  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
  24.  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
  25.  * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
  26.  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
  27.  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
  28.  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
  29.  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
  30.  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
  31.  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
  32.  * SUCH DAMAGE.
  33.  *
  34.  * @(#) $Header: /cvsroot/otcl-tclcl/tclcl/tclcl.h,v 1.33 2005/09/07 04:53:51 tom_henderson Exp $ (LBL)
  35.  */
  36. #ifndef lib_tclcl_h
  37. #define lib_tclcl_h
  38. #include <sys/types.h>
  39. #include <string.h>
  40. #include <tcl.h>
  41. extern "C" {
  42. #include <otcl.h>
  43. }
  44. #include "tclcl-config.h"
  45. #include "tracedvar.h"
  46. // tclcl-mappings.h included below, AFTER definition of class Tcl
  47. struct Tk_Window_;
  48. class Tcl {
  49.     public:
  50. /* constructor should be private but SGIs C++ compiler complains*/
  51. Tcl();
  52. static void init(const char* application);
  53. static void init(Tcl_Interp*, const char* application);
  54. static inline Tcl& instance() { return (instance_); }
  55. inline int dark() const { return (tcl_ == 0); }
  56. inline Tcl_Interp* interp() const { return (tcl_); }
  57. #if TCL_MAJOR_VERSION >= 8
  58. int evalObj(Tcl_Obj *pObj) { return Tcl_GlobalEvalObj(tcl_, pObj); }
  59. int evalObjs(int objc, Tcl_Obj **objv) {
  60. Tcl_Obj* pListObj = Tcl_NewListObj(objc, objv);
  61. int retcode = evalObj(pListObj);
  62. Tcl_DecrRefCount(pListObj);
  63. return retcode; 
  64. }
  65. Tcl_Obj* objResult() const { return Tcl_GetObjResult(tcl_); }
  66. int resultAs(int* pInt) {
  67. return Tcl_GetIntFromObj(tcl_, objResult(), pInt);
  68. }
  69. int resultAs(long* pLong) {
  70. return Tcl_GetLongFromObj(tcl_, objResult(), pLong);
  71. }
  72. int resultAs(double* pDbl) {
  73. return Tcl_GetDoubleFromObj(tcl_, objResult(), pDbl);
  74. }
  75. void result(Tcl_Obj *pObj) { Tcl_SetObjResult(tcl_, pObj); }
  76. inline const char* result() const { return (char *) Tcl_GetStringResult(tcl_); }
  77. #else /* TCL_MAJOR_VERSION >= 8 */
  78. /* may not work at all! */
  79. inline char* result() const { return (tcl_->result); }
  80. #endif  /* TCL_MAJOR_VERSION >= 8 */
  81. inline void result(const char* p) { tcl_->result = (char*)p; }
  82. void resultf(const char* fmt, ...);
  83. inline void CreateCommand(const char* cmd, Tcl_CmdProc* cproc,
  84.   ClientData cd = 0,
  85.   Tcl_CmdDeleteProc* dproc = 0) {
  86. Tcl_CreateCommand(tcl_, (char*)cmd, cproc, cd, dproc);
  87. }
  88. inline void CreateCommand(Tcl_CmdProc* cproc,
  89.   ClientData cd = 0,
  90.   Tcl_CmdDeleteProc* dproc = 0) {
  91. Tcl_CreateCommand(tcl_, buffer_, cproc, cd, dproc);
  92. }
  93. inline void DeleteCommand(const char* cmd) {
  94. Tcl_DeleteCommand(tcl_, (char*)cmd);
  95. }
  96. inline void EvalFile(const char* file) {
  97. if (Tcl_EvalFile(tcl_, (char*)file) != TCL_OK)
  98. error(file);
  99. }
  100. inline const char* var(const char* varname, int flags = TCL_GLOBAL_ONLY) {
  101. return ((char *) Tcl_GetVar(tcl_, (char*)varname, flags));
  102. }
  103. /*
  104.  * Hooks for invoking the tcl interpreter:
  105.  *  eval(char*) - when string is in writable store
  106.  *  evalc() - when string is in read-only store (e.g., string consts)
  107.  *  [ eval(const char*) is a synonym ]
  108.  *  evalf() - printf style formatting of command
  109.  * Or, write into the buffer returned by buffer() and
  110.  * then call eval(void).
  111.  */
  112. void eval(char* s);
  113. void eval(const char* s) { evalc(s); };
  114. void evalc(const char* s);
  115. void eval();
  116. char* buffer() { return (bp_); }
  117. /*
  118.  * This routine used to be inlined, but SGI's C++ compiler
  119.  * can't hack stdarg inlining.  No big deal here.
  120.  */
  121. void evalf(const char* fmt, ...);
  122. inline void add_error(const char *string) {
  123. Tcl_AddErrorInfo(interp(), (char *) string);
  124. }
  125. void add_errorf(const char *fmt, ...);
  126. inline struct Tk_Window_* tkmain() const { return (tkmain_); }
  127. inline void tkmain(struct Tk_Window_* w) { tkmain_ = w; }
  128. void add_option(const char* name, const char* value);
  129. void add_default(const char* name, const char* value);
  130. const char* attr(const char* attr) const;
  131. const char* application() const { return (application_); }
  132. inline const char* rds(const char* a, const char* fld) const {
  133. return (Tcl_GetVar2(tcl_, (char*)a, (char*)fld,
  134.     TCL_GLOBAL_ONLY));
  135. }
  136. TclObject* lookup(const char* name);
  137. void enter(TclObject*);
  138. void remove(TclObject*);
  139.     private:
  140. void error(const char*);
  141. static Tcl instance_;
  142. Tcl_Interp* tcl_;
  143. Tk_Window_* tkmain_;
  144. char* bp_;
  145. const char* application_;
  146. char buffer_[4096];
  147. Tcl_HashTable objs_;
  148. };
  149. #include "tclcl-mappings.h"
  150. class InstVar;
  151. class TclObject {
  152.     public:
  153. virtual ~TclObject();
  154. inline static TclObject* lookup(const char* name) {
  155. return (Tcl::instance().lookup(name));
  156. }
  157. inline const char* name() { return (name_); }
  158. void name(const char*);
  159. /*XXX -> method?*/
  160. virtual int command(int argc, const char*const* argv);
  161. virtual void trace(TracedVar*);
  162. void bind(const char* var, TracedInt* val);
  163. void bind(const char* var, TracedDouble* val);
  164. void bind(const char* var, double* val);
  165. void bind_bw(const char* var, double* val);
  166. void bind_time(const char* var, double* val);
  167. void bind(const char* var, unsigned int* val);
  168. void bind(const char* var, int* val);
  169. void bind_bool(const char* var, int* val);
  170. void bind(const char* var, TclObject** val);
  171. void bind_error(const char* var, const char* error);
  172. #if defined(HAVE_INT64)
  173. void bind(const char* var, int64_t* val);
  174. #endif
  175. /* give an error message and exit if the old variable 
  176.    name is used either for read or write */
  177. #define _RENAMED(oldname, newname) 
  178. bind_error(oldname, "variable "oldname" is renamed to "newname)
  179. virtual int init(int /*argc*/, const char*const* /*argv*/) {
  180. return (TCL_OK);
  181. }
  182. static TclObject *New(const char *className) {
  183. return New(className, NULL);
  184. }
  185. static TclObject *New(const char *className, const char *arg1, ...);
  186. static int Delete(TclObject *object);
  187. int Invoke(const char *method, ...);
  188. int Invokef(const char *format, ...);
  189. static int dispatch_static_proc(ClientData clientData,
  190. Tcl_Interp *interp,
  191. int argc, char *argv[]);
  192. void create_instvar(const char *var);
  193. int create_framevar(const char *localName);
  194. bool delay_bind(const char *varName, const char* localName, const char* thisVarName, double* val, TclObject *tracer);
  195.         bool delay_bind(const char *varName, const char* localName, const char* thisVarName, unsigned int* val, TclObject *tracer);
  196. bool delay_bind_bw(const char *varName, const char* localName, const char* thisVarName, double* val, TclObject *tracer);
  197. bool delay_bind_time(const char *varName, const char* localName, const char* thisVarName, double* val, TclObject *tracer);
  198. bool delay_bind(const char *varName, const char* localName, const char* thisVarName, int* val, TclObject *tracer);
  199. bool delay_bind_bool(const char *varName, const char* localName, const char* thisVarName, int* val, TclObject *tracer);
  200. bool delay_bind(const char *varName, const char* localName, const char* thisVarName, TracedInt* val, TclObject *tracer);
  201. bool delay_bind(const char *varName, const char* localName, const char* thisVarName, TracedDouble* val, TclObject *tracer);
  202. #if defined(HAVE_INT64)
  203. bool delay_bind(const char *varName, const char* localName, const char* thisVarName, int64_t* val, TclObject *tracer);
  204. #endif
  205. virtual int delay_bind_dispatch(const char *varName, const char *localName, TclObject *tracer);
  206. virtual void delay_bind_init_all();
  207. void delay_bind_init_one(const char *varName);
  208. // Common interface for all the 'fprintf(stderr,...); abort();' stuff
  209. static void msg_abort(const char* fmt = NULL, ...);
  210. protected:
  211. void init(InstVar*, const char* varname);
  212. TclObject();
  213. void insert(InstVar*);
  214. void insert(TracedVar*);
  215. void not_a_TracedVar(const char *name);
  216. void handle_TracedVar(const char *name, TracedVar *tv, TclObject *tracer);
  217. int traceVar(const char* varName, TclObject* tracer);
  218. // Enumerate through traced vars, and call their corresponding 
  219. // handlers. 
  220. int enum_tracedVars(); 
  221. #if 0
  222. /* allocate in-line rather than with new to avoid pointer and malloc overhead. */
  223. #define TCLCL_NAME_LEN 12
  224. char name_[TCLCL_NAME_LEN];
  225. #else /* ! 0 */
  226. char *name_;
  227. #endif /* 0 */
  228. InstVar* instvar_;
  229. TracedVar* tracedvar_;
  230. };
  231. /*
  232.  * johnh xxx: delete this
  233.  * #define DELAY_BIND_DISPATCH(VARNAME_P, LOCALNAME_P, VARNAME_STRING, BIND_FUNCTION, PTR_TO_FIELD) 
  234.  * if (strcmp(VARNAME_P, VARNAME_STRING) == 0) { 
  235.  * return BIND_FUNCTION(LOCALNAME_P, PTR_TO_FIELD); 
  236.  * }
  237.  *
  238.  * now standard is:
  239.  * if (delay_bind(varName, localName, "foo_", &foo_, &tv)) return TCL_OK;
  240.  */
  241. class TclClass {
  242. public:
  243. static void init();
  244. virtual ~TclClass();
  245. protected:
  246. TclClass(const char* classname);
  247. virtual TclObject* create(int argc, const char*const*argv) = 0;
  248. private:
  249. static int create_shadow(ClientData clientData, Tcl_Interp *interp,
  250.  int argc, CONST84 char *argv[]);
  251. static int delete_shadow(ClientData clientData, Tcl_Interp *interp,
  252.  int argc, CONST84 char *argv[]);
  253. static int dispatch_cmd(ClientData clientData, Tcl_Interp *interp,
  254. int argc, CONST84 char *argv[]);
  255. static int dispatch_init(ClientData clientData, Tcl_Interp *interp,
  256.  int argc, char *argv[]);
  257. static int dispatch_instvar(ClientData clientData, Tcl_Interp *interp,
  258.  int argc, CONST84 char *argv[]);
  259. static TclClass* all_;
  260. TclClass* next_;
  261. protected:
  262. virtual void otcl_mappings() { }
  263. virtual void bind();
  264. virtual int method(int argc, const char*const* argv);
  265. void add_method(const char* name);
  266. static int dispatch_method(ClientData, Tcl_Interp*, int ac, CONST84 char** av);
  267. OTclClass* class_;
  268. const char* classname_;
  269. };
  270. class EmbeddedTcl {
  271.     public:
  272. inline EmbeddedTcl(const char* code) { code_ = code; }
  273. void load();
  274. int load(Tcl_Interp* interp);
  275.         const char* get_code() { return code_; }
  276.     private:
  277. const char* code_;
  278. };
  279. /*
  280.  * A simple command interface.
  281.  */
  282. class TclCommand {
  283. public:
  284. virtual ~TclCommand();
  285. protected:
  286. TclCommand(const char* cmd);
  287. virtual int command(int argc, const char*const* argv) = 0;
  288. private:
  289. const char* name_;
  290. static int dispatch_cmd(ClientData clientData, Tcl_Interp *interp,
  291. int argc, CONST84 char *argv[]);
  292. };
  293. #endif