VR-Link API Documentation for HLA 1516
mtl.h
Go to the documentation of this file.
1 /*********************************************************************
2 ** Copyright (c) 1992-2010 VT MAK
3 ** All rights reserved.
4 *********************************************************************/
5 #ifndef mtl_H_
6 #define mtl_H_
7 
12 #include <stdio.h>
13 #include <vlutil/vlMachineTypes.h>
14 #include <vlutil/vlPrint.h>
15 #include <vlutil/vlList.h>
16 #include <vlutil/vlString.h>
17 #include <vlutil/vlDebug.h>
18 #include "mtlstream.h"
19 
20 #ifdef DtUSE_UTILITIES_NAMESPACE
21 namespace DtUSE_UTILITIES_NAMESPACE
22 {
23 #endif
24 
25 #define DtlObjDebug(s) do { if (DtLispDebugOn) DtlInfo s; } while (0)
26 
27 #define DtlError(string, obj) do { if (DtNotifyLevel >= DtNlFatal) \
28  fprintf(stderr, "Lisp Error: %s", string), DtcErrPrint(obj); } while (0)
29 
30 #define DtlWarn(string, obj) do { if (DtNotifyLevel >= DtNlWarn) \
31  fprintf(stderr, "Lisp Warning: %s", string), DtcErrPrint(obj); } while (0)
32 
33 #define DtlInfo(string, obj) do { if (DtNotifyLevel >= DtNlInfo) \
34  printf(string), DtcPrint(obj); } while (0)
35 
36 //--------------------------------------------------------------------------
37 
42 
43 #ifdef MEMCHK
44 extern DT_DLL_MTL int DtAllocObjCnt;
45 extern DT_DLL_MTL int DtMaxAllocObjCnt;
46 #endif
47 
50 extern DT_DLL_MTL char* DtMtlReadEscapeChar;
51 
53 
55 {
67 };
68 
70 {
71  friend class DtlObj;
72 
73 public:
74  DtlObjPtr();
75  DtlObjPtr(const DtlObjPtr&);
77  DtlObjPtr(int);
78  DtlObjPtr(double);
79  DtlObjPtr(const char*);
80  ~DtlObjPtr();
81  DtlObjPtr& operator = (const DtlObjPtr&);
82  int operator == (const DtlObjPtr&) const;
83  operator void*() const;
84  DtlObj* operator -> () const;
85  DtlObj& operator * () const;
86 
88  int isNull() const;
89 
90 public:
91 
92  static DtlObjPtr t();
93  static DtlObjPtr nil();
94  static DtlObjPtr unbound();
95 
96 private:
97 
99 };
100 
101 typedef DtlObjPtr (*DtlFcn) (const DtlObjPtr& args, const DtlObjPtr& env);
103 typedef void* DtlPtrToNode;
104 
106  friend class DtlObjPtr;
107  public:
109  DtlObj(int);
110  DtlObj(double);
111  DtlObj(const char *);
112  ~DtlObj();
113 
114  DtlTagType tag();
115  void setTag(DtlTagType);
116 
117  int refcnt();
118  void setRefcnt(int);
119 
120  char gone();
121  void setGone(char);
122 
123  DtlObjPtr car();
124  void setCar(const DtlObjPtr&);
125  DtlObjPtr cdr();
126  void setCdr(const DtlObjPtr&);
127 
128  char* pname();
129  void setPname(const char*);
130 
131  int fixnum();
132  void setFixnum(int);
133 
134  double flonum();
135  void setFlonum(double);
136 
137  char* string();
138  void setString(const char*);
139 
140  DtlPtrToNode nodeptr();
141  void setNodeptr(DtlPtrToNode);
142 
143  char* fcnPname();
144  void setFcnPname(const char*);
145 
146  DtlCompiledCFcnWithEnv fcnCode();
147  void setFcnCode(DtlCompiledCFcnWithEnv);
148 
149  DtlObjPtr procParams();
150  void setProcParams(const DtlObjPtr&);
151 
152  DtlObjPtr procBody();
153  void setProcBody(const DtlObjPtr&);
154 
155  DtlObjPtr& procEnv();
156  void setProcEnv(const DtlObjPtr&);
157 
158  DtlObjPtr frameParent();
159  void setFrameParent(const DtlObjPtr&);
160 
161  DtlHashTable* frameBindings();
162  void setFrameBindings(DtlHashTable*);
163 
168  int registerVal(DtcParam* param);
169 
173  DtList* params();
174 
175  void print();
176  void DtcObjFprint(FILE* s);
177  void DtcPrintList(FILE* s);
178 
179 
180  private:
182  int rcnt;
183  char gn;
184 
190 
191  union vl
192  {
193  char *symbname; /* print name for symbol */
194  int fixnum; /* fixed point number (int) */
195  double flonum; /* floating point (double) */
196  char *s; /* for strings */
197  DtlPtrToNode ptr; /* locatives */
198  struct Fcn
199  {
200  char *pname;
202  } compiled_c_fcn;
203  /* struct cns
204  {
205  DtlObjPtr car;
206  DtlObjPtr cdr;
207  } cons;
208  struct proc
209  {
210  DtlObjPtr params;
211  DtlObjPtr body;
212  DtlObjPtr p_env;
213  } procedure;
214  */
215  struct frm
216  {
221  } frame;
222  } val;
223 };
224 
227 DT_DLL_MTL DtlObjPtr DtcLoadLispFile(char *filename,
228  const DtlObjPtr& env, DtList* allParams, int complain = 1);
230  char *filename, const DtlObjPtr& env, DtList* allParams, int complain=1);
232  char *arg, const DtlObjPtr& env, DtList* allParams, int complain = 1);
234  char *lispLine, const DtlObjPtr& env, DtList* allParams, int complain = 1);
235 
237 DT_DLL_MTL DtlObjPtr DtcHaltAndCatchFire(char *diagnostic);
238 
242  char *name, DtlCompiledCFcnWithEnv fcn, const DtlObjPtr& env);
244  DtlTagType t, DtlPtrToNode ptr);
246  char *name, const DtlObjPtr& value, const DtlObjPtr& env);
247 
252  char *name, DtlCompiledCFcnWithEnv fcn, const DtlObjPtr& env);
253 
260 
262  char *lisp_var_name, int *cvar, const DtlObjPtr& env);
264  char *lisp_var_name, double *cvar, const DtlObjPtr& env);
266  char *lisp_var_name, char** cvar, const DtlObjPtr& env);
267 
269 DT_DLL_MTL void IncObjRefCnt(DtlObj *obj);
270 DT_DLL_MTL void DecObjRefCnt(DtlObj *obj);
272 DT_DLL_MTL int EnvLocalProcRefcnt(const DtlObjPtr& env);
273 
285 DT_DLL_MTL DtlObjPtr DtcCons(const DtlObjPtr& car, const DtlObjPtr& cdr);
287 DT_DLL_MTL DtlObjPtr DtcAssoc(const DtlObjPtr& thing, const DtlObjPtr& alist);
288 DT_DLL_MTL DtlObjPtr DtcAssv(const DtlObjPtr& thing, const DtlObjPtr& alist);
289 DT_DLL_MTL DtlObjPtr DtcAssq(const DtlObjPtr& thing, const DtlObjPtr& alist);
291 DT_DLL_MTL DtlObjPtr DtcEval(const DtlObjPtr& , const DtlObjPtr& env);
292 DT_DLL_MTL DtlObjPtr DtcIntern(char *name, const DtlObjPtr& env);
293 DT_DLL_MTL DtlObjPtr DtcMakeSymbol(char *pname);
296 DT_DLL_MTL DtlObjPtr DtcSet(const DtlObjPtr& c, const DtlObjPtr& value, const DtlObjPtr& env);
297 #if DT_GLOBAL_ENV
298 DT_DLL_MTL int DtcBoundp(const DtlObjPtr& sym);
299 DT_DLL_MTL DtlObjPtr DtcSet(const DtlObjPtr& c, const DtlObjPtr& value);
300 DT_DLL_MTL DtlObjPtr DtcIntern(char *name);
302 #endif
303 #define DtcSet1Env DtcSet
304 DT_DLL_MTL DtlObjPtr DtcSymeval(const DtlObjPtr& c, const DtlObjPtr& env);
305 DT_DLL_MTL int DtcBoundp(const DtlObjPtr& sym, const DtlObjPtr& env);
306 DT_DLL_MTL int DtcEq(const DtlObjPtr& a, const DtlObjPtr& b);
307 DT_DLL_MTL int DtcEqual(const DtlObjPtr& c1, const DtlObjPtr& c2);
308 DT_DLL_MTL int DtcEqualSign(const DtlObjPtr& c1, const DtlObjPtr& c2);
309 DT_DLL_MTL int DtcLength(const DtlObjPtr& c);
310 DT_DLL_MTL int DtcListp(const DtlObjPtr& c);
311 DT_DLL_MTL int DtcNull(const DtlObjPtr& c);
312 DT_DLL_MTL int DtcNumberp(const DtlObjPtr& c);
313 DT_DLL_MTL int DtcStringEqual(const DtlObjPtr& s1, const DtlObjPtr& s2);
314 DT_DLL_MTL int DtcStringp(const DtlObjPtr& c);
315 DT_DLL_MTL int DtcLocativep(const DtlObjPtr& c);
316 
324 
325 DT_DLL_MTL DtlObjPtr DtlAbort(const DtlObjPtr& args, const DtlObjPtr& env);
326 DT_DLL_MTL DtlObjPtr DtlAbs(const DtlObjPtr& args, const DtlObjPtr& env);
327 DT_DLL_MTL DtlObjPtr DtlAnd(const DtlObjPtr& args, const DtlObjPtr& env);
328 DT_DLL_MTL DtlObjPtr DtlAppend(const DtlObjPtr& args, const DtlObjPtr& env);
329 DT_DLL_MTL DtlObjPtr DtlAssoc(const DtlObjPtr& args, const DtlObjPtr& env);
330 DT_DLL_MTL DtlObjPtr DtlAssq(const DtlObjPtr& args, const DtlObjPtr& env);
331 DT_DLL_MTL DtlObjPtr DtlAssv(const DtlObjPtr& args, const DtlObjPtr& env);
332 DT_DLL_MTL DtlObjPtr DtlCond(const DtlObjPtr& args, const DtlObjPtr& env);
333 DT_DLL_MTL DtlObjPtr DtlCos(const DtlObjPtr& args, const DtlObjPtr& env);
334 DT_DLL_MTL DtlObjPtr DtlDescribe(const DtlObjPtr& args, const DtlObjPtr& env);
335 DT_DLL_MTL DtlObjPtr DtlDivide(const DtlObjPtr& args, const DtlObjPtr& env);
336 DT_DLL_MTL DtlObjPtr DtlEnvDump(const DtlObjPtr& args, const DtlObjPtr& env);
337 DT_DLL_MTL DtlObjPtr DtlEq(const DtlObjPtr& args, const DtlObjPtr& env);
338 DT_DLL_MTL DtlObjPtr DtlEqual(const DtlObjPtr& args, const DtlObjPtr& env);
339 DT_DLL_MTL DtlObjPtr DtlEqualSign(const DtlObjPtr& args, const DtlObjPtr& env);
340 DT_DLL_MTL DtlObjPtr DtlEval(const DtlObjPtr& args, const DtlObjPtr& env);
341 DT_DLL_MTL DtlObjPtr DtlExit(const DtlObjPtr& args, const DtlObjPtr& env);
342 DT_DLL_MTL DtlObjPtr DtlFormat(const DtlObjPtr& args, const DtlObjPtr& env);
343 DT_DLL_MTL DtlObjPtr DtlFrameBindings(const DtlObjPtr& args, const DtlObjPtr& env);
344 DT_DLL_MTL DtlObjPtr DtlFrameBound(const DtlObjPtr& args, const DtlObjPtr& env);
345 DT_DLL_MTL DtlObjPtr DtlFrameParent(const DtlObjPtr& args, const DtlObjPtr& env);
346 DT_DLL_MTL DtlObjPtr DtlGetenv(const DtlObjPtr& args, const DtlObjPtr& env);
347 DT_DLL_MTL DtlObjPtr DtlGreater(const DtlObjPtr& args, const DtlObjPtr& env);
348 DT_DLL_MTL DtlObjPtr DtlGreaterEqual(const DtlObjPtr& args, const DtlObjPtr& env);
349 DT_DLL_MTL DtlObjPtr DtlIf(const DtlObjPtr& args, const DtlObjPtr& env);
350 DT_DLL_MTL DtlObjPtr DtlLCar(const DtlObjPtr& args, const DtlObjPtr& env);
351 DT_DLL_MTL DtlObjPtr DtlLCdr(const DtlObjPtr& args, const DtlObjPtr& env);
352 DT_DLL_MTL DtlObjPtr DtlLCons(const DtlObjPtr& args, const DtlObjPtr& env);
353 DT_DLL_MTL DtlObjPtr DtlLambda(const DtlObjPtr& args, const DtlObjPtr& env);
354 DT_DLL_MTL DtlObjPtr DtlLet(const DtlObjPtr& args, const DtlObjPtr& env);
355 DT_DLL_MTL DtlObjPtr DtlLength(const DtlObjPtr& args, const DtlObjPtr& env);
356 DT_DLL_MTL DtlObjPtr DtlLess(const DtlObjPtr& args, const DtlObjPtr& env);
357 DT_DLL_MTL DtlObjPtr DtlLessEqual(const DtlObjPtr& args, const DtlObjPtr& env);
358 DT_DLL_MTL DtlObjPtr DtlList(const DtlObjPtr& args, const DtlObjPtr& env);
359 DT_DLL_MTL DtlObjPtr DtlListp(const DtlObjPtr& args, const DtlObjPtr& env);
360 DT_DLL_MTL DtlObjPtr DtlLoad(const DtlObjPtr& args, const DtlObjPtr& env);
361 DT_DLL_MTL DtlObjPtr DtlLogIOr(const DtlObjPtr& args, const DtlObjPtr& env);
362 DT_DLL_MTL DtlObjPtr DtlMem(const DtlObjPtr& args, const DtlObjPtr& env);
363 DT_DLL_MTL DtlObjPtr DtlMinus(const DtlObjPtr& args, const DtlObjPtr& env);
364 DT_DLL_MTL DtlObjPtr DtlMultiply(const DtlObjPtr& args, const DtlObjPtr& env);
365 DT_DLL_MTL DtlObjPtr DtlNewFrame(const DtlObjPtr& args, const DtlObjPtr& env);
366 DT_DLL_MTL DtlObjPtr DtlNotOrNull(const DtlObjPtr& args, const DtlObjPtr& env);
367 DT_DLL_MTL DtlObjPtr DtlNumberp(const DtlObjPtr& args, const DtlObjPtr& env);
368 DT_DLL_MTL DtlObjPtr DtlOr(const DtlObjPtr& args, const DtlObjPtr& env);
369 DT_DLL_MTL DtlObjPtr DtlPlus(const DtlObjPtr& args, const DtlObjPtr& env);
370 DT_DLL_MTL DtlObjPtr DtlPopen(const DtlObjPtr& args, const DtlObjPtr& env);
371 DT_DLL_MTL DtlObjPtr DtlPrin1(const DtlObjPtr& args, const DtlObjPtr& env);
372 DT_DLL_MTL DtlObjPtr DtlPutenv(const DtlObjPtr& args, const DtlObjPtr& env);
373 DT_DLL_MTL DtlObjPtr DtlReverse(const DtlObjPtr& args, const DtlObjPtr& env);
374 DT_DLL_MTL DtlObjPtr DtlQuote(const DtlObjPtr& args, const DtlObjPtr& env);
375 DT_DLL_MTL DtlObjPtr DtlSequence(const DtlObjPtr& args, const DtlObjPtr& env);
376 DT_DLL_MTL DtlObjPtr DtlSetq(const DtlObjPtr& args, const DtlObjPtr& env);
378 DT_DLL_MTL DtlObjPtr DtlSin(const DtlObjPtr& args, const DtlObjPtr& env);
379 DT_DLL_MTL DtlObjPtr DtlStringAppend(const DtlObjPtr& args, const DtlObjPtr& env);
380 DT_DLL_MTL DtlObjPtr DtlStringEqual(const DtlObjPtr& args, const DtlObjPtr& env);
381 DT_DLL_MTL DtlObjPtr DtlStringp(const DtlObjPtr& args, const DtlObjPtr& env);
382 DT_DLL_MTL DtlObjPtr DtlTheFrame(const DtlObjPtr& args, const DtlObjPtr& env);
383 DT_DLL_MTL DtlObjPtr DtlLocativep(const DtlObjPtr& args, const DtlObjPtr& env);
384 DT_DLL_MTL DtlObjPtr DtlSystem(const DtlObjPtr& args, const DtlObjPtr& env);
385 DT_DLL_MTL DtlObjPtr DtlTerpri(const DtlObjPtr& args, const DtlObjPtr& env);
386 
390 
392 DT_DLL_MTL DtlObjPtr DtlStringToNumber(const DtlObjPtr& args, const DtlObjPtr& env);
393 DT_DLL_MTL DtlObjPtr DtlNumberToString(const DtlObjPtr& args, const DtlObjPtr& env);
394 
395 /* ---------------------- REGISTER ---------------------- */
396 /*
397  * DtcRegister facilitates the setting of simple C variables
398  * (i.e. double, int, char *) from MTL files.
399  *
400  * Each call to DtcRegister creates a lisp-variable "name" and
401  * initializes it to the value pointed to by "addr".
402  * It also adds the lisp-variable and C-address to a list of
403  * "registered" variables.
404  * At the end of DtlLoadLispFile, every registered variable will have
405  * its lisp value evaluated and copied to the registered C address.
406  *
407  * Note: Lisp evaluation and copy to C does not occur until the end of
408  * DtlLoadLispFile, so modified values will not automatically be
409  * visible to C functions called from within a lisp file. To bring
410  * a C value up-to-date from within such a function, call
411  * DtcSetIfBoundp() or DtcLispToC().
412  *
413  * The macro DtcREGISTER can be useful to ensure that corresponding C
414  * and Lisp variables share the same name.
415  *
416  * Use of setqb (aka setq-bound-variable) is recommended for registered
417  * variables because it will complain if the parameter is misspelled.
418  *
419  * The registered address must be valid at the time DtlLoadLispFile is
420  * called [i.e. be careful with automatic variables on the stack.]
421  *
422  * All calls to DtcRegister() should be made between
423  * DtlGlobalEnvInit() and DtlLoadLispFile().
424  */
425 
431 
432 #define DtcREGISTER(var, env, params) DtcRegister(#var, &var, env, params)
433 #define DtcDEFINE(type, var, dflt) type var = dflt; DtcREGISTER(var)
434 
436  const char *name, float *addr, const DtlObjPtr& env, DtList* allParams);
438  const char *name, double *addr, const DtlObjPtr& env, DtList* allParams);
440  const char *name, int* addr, const DtlObjPtr& env, DtList* allParams);
442  const char *name, unsigned long *addr, const DtlObjPtr& env, DtList* allParams);
444  const char *name, char **addr, const DtlObjPtr& env, DtList* allParams);
446  const char *name, DtString *addr, const DtlObjPtr& env, DtList* allParams);
448  const char *name, long *addr, const DtlObjPtr& env, DtList* allParams);
450  const char *name, short *addr, const DtlObjPtr& env, DtList* allParams);
452  const char *name, unsigned short *addr, const DtlObjPtr& env, DtList* allParams);
453 #if DT_HAVE_64BIT_LONGS
455  const char *name, unsigned int *addr, const DtlObjPtr& env, DtList* allParams);
456 #endif
457 
461 DT_DLL_MTL void DtcLispToC(DtList* allParams);
462 
463 
467 DT_DLL_MTL void DtcCToLisp(DtList* allParams);
468 
470 DT_DLL_MTL void DtcEmptyParamList(DtList* allParams);
471 
473 
474 inline int DtlObj::refcnt()
475 {
476  return rcnt;
477 }
478 
479 inline void DtlObj::setRefcnt(int r)
480 {
481  rcnt = r;
482 }
483 
485 {
486  DecObjRefCnt(ptr);
487 }
488 
489 #ifdef DtUSE_UTILITIES_NAMESPACE
490 }
491 #endif
492 
493 #endif /* _MTL_H_ */
494 
495 
496 

Document ID: Generated on Wed Aug 14 15:35:11 EDT 2013 from SVN revision 130445
Copyright © 2005-2013 VT MÄK. All Rights Reserved (www.mak.com)