VR-Link API Documentation for HLA Evolved
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Groups Pages
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 <vlutil/vlMutex.h>
19 #include "mtlstream.h"
20 
21 #ifdef DtUSE_UTILITIES_NAMESPACE
22 namespace DtUSE_UTILITIES_NAMESPACE
23 {
24 #endif
25 
26 #define DtlObjDebug(s) do { if (DtLispDebugOn) DtlInfo s; } while (0)
27 
28 #define DtlError(string, obj) do { if (DtNotifyLevel >= DtNlFatal) \
29  fprintf(stderr, "Lisp Error: %s", string), DtcErrPrint(obj); } while (0)
30 
31 #define DtlWarn(string, obj) do { if (DtNotifyLevel >= DtNlWarn) \
32  fprintf(stderr, "Lisp Warning: %s", string), DtcErrPrint(obj); } while (0)
33 
34 #define DtlInfo(string, obj) do { if (DtNotifyLevel >= DtNlInfo) \
35  printf(string), DtcPrint(obj); } while (0)
36 
37 //--------------------------------------------------------------------------
38 
43 
44 #ifdef MEMCHK
45 extern DT_DLL_MTL int DtAllocObjCnt;
46 extern DT_DLL_MTL int DtMaxAllocObjCnt;
47 #endif
48 
51 extern DT_DLL_MTL char* DtMtlReadEscapeChar;
52 
54 
56 {
68 };
69 
71 {
72  friend class DtlObj;
73 
74 public:
75  DtlObjPtr();
76  DtlObjPtr(const DtlObjPtr&);
78  DtlObjPtr(int);
79  DtlObjPtr(double);
80  DtlObjPtr(const char*);
81  ~DtlObjPtr();
82  DtlObjPtr& operator = (const DtlObjPtr&);
83  int operator == (const DtlObjPtr&) const;
84  operator void*() const;
85  DtlObj* operator -> () const;
86  DtlObj& operator * () const;
87 
89  int isNull() const;
90 
91 public:
92 
93  static const DtlObjPtr& t();
94  static const DtlObjPtr& nil();
95  static const DtlObjPtr& unbound();
96 
97 private:
98 
100 };
101 
102 typedef DtlObjPtr (*DtlFcn) (const DtlObjPtr& args, const DtlObjPtr& env);
104 typedef void* DtlPtrToNode;
105 
107  friend class DtlObjPtr;
108  public:
110  DtlObj(int);
111  DtlObj(double);
112  DtlObj(const char *);
113  ~DtlObj();
114 
115  DtlTagType tag();
116  void setTag(DtlTagType);
117 
118  int refcnt();
119  void setRefcnt(int);
120 
121  char gone();
122  void setGone(char);
123 
124  DtlObjPtr car();
125  void setCar(const DtlObjPtr&);
126  DtlObjPtr cdr();
127  void setCdr(const DtlObjPtr&);
128 
129  char* pname();
130  void setPname(const char*);
131 
132  int fixnum();
133  void setFixnum(int);
134 
135  double flonum();
136  void setFlonum(double);
137 
138  char* string();
139  void setString(const char*);
140 
141  DtlPtrToNode nodeptr();
142  void setNodeptr(DtlPtrToNode);
143 
144  char* fcnPname();
145  void setFcnPname(const char*);
146 
147  DtlCompiledCFcnWithEnv fcnCode();
148  void setFcnCode(DtlCompiledCFcnWithEnv);
149 
150  DtlObjPtr procParams();
151  void setProcParams(const DtlObjPtr&);
152 
153  DtlObjPtr procBody();
154  void setProcBody(const DtlObjPtr&);
155 
156  DtlObjPtr& procEnv();
157  void setProcEnv(const DtlObjPtr&);
158 
159  DtlObjPtr frameParent();
160  void setFrameParent(const DtlObjPtr&);
161 
162  DtlHashTable* frameBindings();
163  void setFrameBindings(DtlHashTable*);
164 
169  int registerVal(DtcParam* param);
170 
174  DtList* params();
175 
176  void print();
177  void DtcObjFprint(FILE* s);
178  void DtcPrintList(FILE* s);
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 
401 DT_DLL_MTL void DtlAddLoadPath(const char* path);
403 
404 /* ---------------------- REGISTER ---------------------- */
405 /*
406  * DtcRegister facilitates the setting of simple C variables
407  * (i.e. double, int, char *) from MTL files.
408  *
409  * Each call to DtcRegister creates a lisp-variable "name" and
410  * initializes it to the value pointed to by "addr".
411  * It also adds the lisp-variable and C-address to a list of
412  * "registered" variables.
413  * At the end of DtlLoadLispFile, every registered variable will have
414  * its lisp value evaluated and copied to the registered C address.
415  *
416  * Note: Lisp evaluation and copy to C does not occur until the end of
417  * DtlLoadLispFile, so modified values will not automatically be
418  * visible to C functions called from within a lisp file. To bring
419  * a C value up-to-date from within such a function, call
420  * DtcSetIfBoundp() or DtcLispToC().
421  *
422  * The macro DtcREGISTER can be useful to ensure that corresponding C
423  * and Lisp variables share the same name.
424  *
425  * Use of setqb (aka setq-bound-variable) is recommended for registered
426  * variables because it will complain if the parameter is misspelled.
427  *
428  * The registered address must be valid at the time DtlLoadLispFile is
429  * called [i.e. be careful with automatic variables on the stack.]
430  *
431  * All calls to DtcRegister() should be made between
432  * DtlGlobalEnvInit() and DtlLoadLispFile().
433  */
434 
440 
441 #define DtcREGISTER(var, env, params) DtcRegister(#var, &var, env, params)
442 #define DtcDEFINE(type, var, dflt) type var = dflt; DtcREGISTER(var)
443 
445  const char *name, float *addr, const DtlObjPtr& env, DtList* allParams);
447  const char *name, double *addr, const DtlObjPtr& env, DtList* allParams);
449  const char *name, int* addr, const DtlObjPtr& env, DtList* allParams);
451  const char *name, unsigned long *addr, const DtlObjPtr& env, DtList* allParams);
453  const char *name, char **addr, const DtlObjPtr& env, DtList* allParams);
455  const char *name, DtString *addr, const DtlObjPtr& env, DtList* allParams);
457  const char *name, long *addr, const DtlObjPtr& env, DtList* allParams);
459  const char *name, short *addr, const DtlObjPtr& env, DtList* allParams);
461  const char *name, unsigned short *addr, const DtlObjPtr& env, DtList* allParams);
462 #if DT_HAVE_64BIT_LONGS
464  const char *name, unsigned int *addr, const DtlObjPtr& env, DtList* allParams);
465 #endif
466 
470 DT_DLL_MTL void DtcLispToC(DtList* allParams);
471 
472 
476 DT_DLL_MTL void DtcCToLisp(DtList* allParams);
477 
479 DT_DLL_MTL void DtcEmptyParamList(DtList* allParams);
480 
482 
483 inline int DtlObj::refcnt()
484 {
485  return rcnt;
486 }
487 
488 inline void DtlObj::setRefcnt(int r)
489 {
490  rcnt = r;
491 }
492 
494 {
495  DecObjRefCnt(ptr);
496 }
497 
498 #ifdef DtUSE_UTILITIES_NAMESPACE
499 }
500 #endif
501 
502 #endif /* _MTL_H_ */
503 
504 
505 

Document ID: Generated on Mon Apr 8 04:49:21 EDT 2019 from SVN revision 197403
Copyright © 2005-2016 VT MÄK. All Rights Reserved (www.mak.com)