NEURON
symdir.cpp
Go to the documentation of this file.
1 #include <../../nrnconf.h>
2 #include <stdlib.h>
3 #include <InterViews/resource.h>
4 #include <OS/list.h>
5 #include <OS/string.h>
6 #include <stdio.h>
7 #include "ocobserv.h"
8 
9 #if CABLE
10 #include "nrnoc2iv.h"
11 #else
12 #include "oc2iv.h"
13 #endif
14 
15 #if CABLE
16 #include "membfunc.h"
17 extern double* point_process_pointer(Point_process*, Symbol*, int);
18 #endif
19 #include "parse.hpp"
20 #include "hoclist.h"
21 extern Symlist* hoc_symlist;
24 extern int hoc_array_index(Symbol*, Objectdata*);
25 #include "string.h"
26 #include "symdir.h"
27 
28 #include "nrnsymdiritem.h"
30 
31 const char* concat(const char* s1, const char* s2) {
32  static char* tmp = 0;
33  int l1 = strlen(s1);
34  int l2 = strlen(s2);
35  if (tmp) {
36  delete[] tmp;
37  }
38  tmp = new char[l1 + l2 + 1];
39  sprintf(tmp, "%s%s", s1, s2);
40  return (const char*) tmp;
41 }
42 
43 class SymDirectoryImpl: public Observer {
44  public:
45  void disconnect(Observable*); // watching an object
46  void update(Observable*); // watching a template
47  private:
48  friend class SymDirectory;
49 #if CABLE
50  Section* sec_;
51 #endif
54 
55  SymbolList symbol_list_;
57 
58  void load(int type);
59  void load(int type, Symlist*);
60  // void load(Symbol*);
61  void load_section();
62  void load_object();
63  void load_aliases();
64  void load_template();
65  void load_sectionlist();
66 #if CABLE
67  void load_mechanism(Prop*, int, const char*);
68 #endif
69  void append(Symbol* sym, Objectdata* od, Object* o = NULL);
70  void append(Object*);
71  void un_append(Object*);
72  void make_pathname(const char*, const char*, const char*, int s = '.');
73  void sort();
74 };
75 
76 static int compare_entries(const void* k1, const void* k2) {
77  SymbolItem* e1 = *((SymbolItem**) k1);
78  SymbolItem* e2 = *((SymbolItem**) k2);
79  int i = strcmp(e1->name().string(), e2->name().string());
80  if (i == 0) {
81  if (e1->array_index() > e2->array_index()) {
82  i = 1;
83  } else {
84  i = -1;
85  }
86  }
87  return i;
88 };
89 
91  long cnt, i;
92  cnt = symbol_list_.count();
93  SymbolItem** slist = new SymbolItem*[cnt];
94  for (i = 0; i < cnt; ++i) {
95  slist[i] = symbol_list_.item(i);
96  }
97  qsort(slist, cnt, sizeof(SymbolItem*), compare_entries);
98  symbol_list_.remove_all();
99  for (i = 0; i < cnt; ++i) {
100  symbol_list_.append(slist[i]);
101  }
102  delete[] slist;
103 }
104 
105 // SymDirectory
107  Object* parent_obj,
108  Symbol* sym,
109  int array_index,
110  int) {
111  impl_ = new SymDirectoryImpl();
112 #if CABLE
113  impl_->sec_ = NULL;
114 #endif
115  impl_->obj_ = NULL;
116  impl_->t_ = NULL;
117  Objectdata* obd;
118  if (parent_obj) {
119  obd = parent_obj->u.dataspace;
120  } else {
121  // obd = hoc_objectdata;
122  obd = hoc_top_level_data;
123  }
124  int suffix = '.';
125  if (sym->type == TEMPLATE) {
126  suffix = '_';
127  }
128  impl_->make_pathname(parent_path.string(),
129  sym->name,
130  hoc_araystr(sym, array_index, obd),
131  suffix);
132  switch (sym->type) {
133 #if CABLE
134  case SECTION:
135  if (object_psecitm(sym, obd)[array_index]) {
136  impl_->sec_ = hocSEC(object_psecitm(sym, obd)[array_index]);
137  section_ref(impl_->sec_);
138  impl_->load_section();
139  }
140  break;
141 #endif
142  case OBJECTVAR:
143  impl_->obj_ = object_pobj(sym, obd)[array_index];
144  if (impl_->obj_) {
146  impl_->load_object();
147  }
148  break;
149  case TEMPLATE:
150  impl_->t_ = sym->u.ctemplate;
152  impl_->load_template();
153  break;
154  case OBJECTALIAS:
155  impl_->obj_ = sym->u.object_;
156  if (impl_->obj_) {
158  impl_->load_object();
159  }
160  break;
161  default:
162  hoc_execerror("Don't know how to make a directory out of", path().string());
163  break;
164  }
165  impl_->sort();
166 }
168  impl_ = new SymDirectoryImpl();
169 #if CABLE
170  impl_->sec_ = NULL;
171 #endif
172  impl_->obj_ = ob;
173  impl_->t_ = NULL;
174  int suffix = '.';
175  impl_->make_pathname("", hoc_object_name(ob), "", '.');
177  impl_->load_object();
178  impl_->sort();
179 }
180 
181 bool SymDirectory::is_pysec(int index) const {
182  SymbolItem* si = impl_->symbol_list_.item(index);
183 #if CABLE
184  return si->pysec_ ? true : false;
185 #else
186  return false;
187 #endif
188 }
190  SymbolItem* si = impl_->symbol_list_.item(index);
191  SymDirectory* d = new SymDirectory();
192 #if CABLE
193  if (si->pysec_type_ == PYSECOBJ) {
194  nrn_symdir_load_pysec(d->impl_->symbol_list_, si->pysec_);
195  } else {
196  d->impl_->sec_ = (Section*) si->pysec_;
197  section_ref(d->impl_->sec_);
198  d->impl_->load_section();
199  }
200  d->impl_->path_ = concat(path().string(), si->name().string());
201  d->impl_->path_ = concat(d->impl_->path_.string(), ".");
202  d->impl_->sort();
203 #endif
204  return d;
205 }
206 
208  impl_ = new SymDirectoryImpl();
209 #if CABLE
210  impl_->sec_ = NULL;
211 #endif
212  impl_->obj_ = NULL;
213  impl_->t_ = NULL;
214 }
215 
217  ParseTopLevel ptl;
218  ptl.save();
219  impl_ = new SymDirectoryImpl();
220 #if CABLE
221  impl_->sec_ = NULL;
222 #endif
223  impl_->obj_ = NULL;
224  impl_->t_ = NULL;
225  impl_->path_ = "";
226  impl_->load(type);
227  impl_->sort();
228  ptl.restore();
229 }
230 
232  long cnt = count();
233  for (long i = 0; i < cnt; ++i) {
234  delete impl_->symbol_list_.item(i);
235  }
236  impl_->symbol_list_.remove_all();
237  if (impl_->obj_) {
239  }
240  if (impl_->t_) {
242  }
243 #if CABLE
244  if (impl_->sec_) {
245  section_unref(impl_->sec_);
246  }
247 #endif
248  delete impl_;
249 }
251  long cnt = symbol_list_.count();
252  for (long i = 0; i < cnt; ++i) {
253  delete symbol_list_.item(i);
254  }
255  symbol_list_.remove_all();
256  obj_ = NULL;
257 }
258 
260  if (t_) { // watching a template
261  ClassObservable* co = (ClassObservable*) obs;
262  Object* ob = co->object();
263  switch (co->message()) {
265  un_append(ob);
266  break;
268  append(ob);
269  break;
270  }
271  }
272 }
274  Object* ob = object();
275  Symbol* sym = symbol(index);
276  // printf("::variable index=%d sym=%s ob=%s\n", index,
277  // sym?sym->name:"SYM0",hoc_object_name(ob));
278  if (sym)
279  switch (sym->type) {
280  case VAR:
281  if (ob && ob->ctemplate->constructor) {
282  extern double* ivoc_vector_ptr(Object*, int);
283  if (is_obj_type(ob, "Vector")) {
284  return ivoc_vector_ptr(ob, index);
285  } else {
286  return NULL;
287  }
288  } else {
289  Objectdata* od;
290  if (ob) {
291  od = ob->u.dataspace;
292  } else if (sym->subtype == USERDOUBLE) {
293  return sym->u.pval + array_index(index);
294  } else {
295  od = hoc_objectdata;
296  }
297  return od[sym->u.oboff].pval + array_index(index);
298  }
299 #if CABLE
300  case RANGEVAR:
301  if (ob && ob->ctemplate->is_point_) {
303  sym,
304  array_index(index));
305  }
306  break;
307 #endif
308  }
309  else {
310  char buf[256], *cp;
311  sprintf(buf, "%s%s", path().string(), name(index).string());
312  if (whole_vector(index)) { // rangevar case for [all]
313  // replace [all] with [0]
314  cp = strstr(buf, "[all]");
315  assert(cp);
316  *(++cp) = '0';
317  for (++cp; cp[2]; ++cp) {
318  *cp = cp[2];
319  }
320  *cp = '\0';
321  }
322  return hoc_val_pointer(buf);
323  }
324  return NULL;
325 }
326 
328  return impl_->symbol_list_.item(index)->whole_vector();
329 }
330 
331 const String& SymDirectory::path() const {
332  return impl_->path_;
333 }
334 int SymDirectory::count() const {
335  return impl_->symbol_list_.count();
336 }
337 const String& SymDirectory::name(int index) const {
338  return impl_->symbol_list_.item(index)->name();
339 }
340 int SymDirectory::array_index(int i) const {
341  return impl_->symbol_list_.item(i)->array_index();
342 }
343 
344 int SymDirectory::index(const String& name) const {
345  long cnt = count();
346  for (long i = 0; i < cnt; ++i) {
347  if (name == impl_->symbol_list_.item(i)->name()) {
348  return i;
349  }
350  }
351  return -1;
352 }
354  const String& s1 = impl_->path_;
355  const String& s2 = name(index);
356  // char* tmp = new char[s1.length() + s2.length() + 1];
357  // sprintf(tmp, "%.*%s%.*%s", s1.length(), s1.string(), s2.length(), s2.string());
358  // s = tmp;
359  s = concat(s1.string(), s2.string());
360 }
362  return impl_->symbol_list_.item(index)->is_directory();
363 }
364 bool SymDirectory::match(const String&, const String&) {
365  return true;
366 }
368  return impl_->symbol_list_.item(index)->symbol();
369 }
371  return impl_->obj_;
372 }
373 
375  return impl_->symbol_list_.item(index)->object();
376 }
377 
378 // SymbolItem
379 SymbolItem::SymbolItem(const char* n, int whole_array) {
380  symbol_ = NULL;
381  index_ = 0;
382  ob_ = NULL;
383  name_ = n;
384  whole_array_ = whole_array;
385 #if CABLE
386  pysec_type_ = 0;
387  pysec_ = NULL;
388 #endif
389 }
390 SymbolItem::SymbolItem(Symbol* sym, Objectdata* od, int index, int whole_array) {
391  symbol_ = sym;
392  ob_ = NULL;
393  whole_array_ = whole_array;
394  if (ISARRAY(sym)) {
395  if (whole_array_) {
396  name_ = concat(sym->name, "[all]");
397  } else {
398  if (od) {
399  name_ = concat(sym->name, hoc_araystr(sym, index, od));
400  } else {
401  char buf[50];
402  sprintf(buf, "[%d]", index);
403  name_ = concat(sym->name, buf);
404  }
405  }
406  } else {
407  name_ = sym->name;
408  }
409  index_ = index;
410 #if CABLE
411  pysec_type_ = 0;
412  pysec_ = NULL;
413 #endif
414 }
415 
417  return whole_array_;
418 }
419 
421  symbol_ = NULL;
422  index_ = 0;
423  ob_ = ob;
424  char buf[10];
425  sprintf(buf, "%d", ob->index);
426  name_ = buf;
427 #if CABLE
428  pysec_type_ = 0;
429  pysec_ = NULL;
430 #endif
431 }
432 
434  ob_ = NULL;
435  name_ = "Deleted";
436 }
437 
439 
441  if (symbol_)
442  switch (symbol_->type) {
443  case SECTION:
444  case OBJECTVAR:
445  case TEMPLATE:
446  case OBJECTALIAS:
447  // case SECTIONLIST:
448  // case MECHANISM:
449  return true;
450  }
451  if (ob_) {
452  return true;
453  }
454 #if CABLE
455  if (pysec_) {
456  return true;
457  }
458 #endif
459  return false;
460 }
461 
463  const char* name,
464  const char* index,
465  int suffix) {
466  char buf[200];
467  sprintf(buf, "%s%s%s%c", parent, name, index, suffix);
468  path_ = buf;
469 }
470 
471 
473  switch (type) {
474  case TEMPLATE:
477  break;
478 #if CABLE
479  case RANGEVAR:
481  break;
482  case PYSEC:
483  path_ = "_pysec.";
485  break;
486 #endif
487  default:
490  Objectdata* sav = hoc_objectdata;
493  hoc_objectdata = sav;
494  }
497  }
498  }
499 }
500 
502  Symbol* sym;
503  for (sym = sl->first; sym; sym = sym->next) {
504  if (type == -1) {
505  switch (sym->type) {
506  case SECTION:
507  case OBJECTVAR:
508  case VAR:
509  case TEMPLATE:
510  append(sym, hoc_objectdata);
511  }
512  } else if (sym->type == type) {
513  append(sym, hoc_objectdata);
514  }
515  }
516 }
517 
519  Symlist* sl = obj_->ctemplate->symtable;
520  Objectdata* od;
521  if (obj_->ctemplate->constructor) {
522  od = NULL;
523  } else {
524  od = obj_->u.dataspace;
525  }
526  if (obj_->aliases) {
527  load_aliases();
528  }
529  if (sl)
530  for (Symbol* s = sl->first; s; s = s->next) {
531  if (s->cpublic) {
532  append(s, od, obj_);
533  }
534  }
535 }
536 
539  if (!a)
540  return;
541  for (const auto& kv: a->symtab_) {
542  Symbol* s = kv.second;
543  append(s, NULL, obj_);
544  }
545 }
546 
548  hoc_Item* q;
549  ITERATE(q, t_->olist) {
550  append(OBJ(q));
551  }
552 }
553 
555 #if CABLE
556  char xarg[20];
557  char buf[100];
558  Section* sec = sec_;
559  int n = sec->nnode;
560 
561  int i = 0;
562  double x = nrn_arc_position(sec, sec->pnode[0]);
563  sprintf(xarg, "( %g )", x);
564  sprintf(buf, "v%s", xarg);
565  symbol_list_.append(new SymbolItem(buf));
566  nrn_pushsec(sec);
567  Node* nd = sec->pnode[i];
568  for (Prop* p = nd->prop; p; p = p->next) {
569  load_mechanism(p, 0, xarg);
570  }
571  nrn_popsec();
572 #endif
573 }
575 #if CABLE && 0
576  List* sl = od[sym->u.oboff].plist[hoc_array_index(sym, od)];
577  Item* qsym;
578  // ForAllSections(sec)
579  ITERATE(qsec, section_list) {
580  Section* sec = hocSEC(qsec);
581  Prop* p = sec->prop;
582  symbol_list_.append(new SymbolItem(p->dparam[0].sym, p->dparam[6].obj, prop->dparam[5].i));
583  }
584 #endif
585 }
586 
587 #if CABLE
588 void SymDirectoryImpl::load_mechanism(Prop* p, int type, const char* xarg) {
589  NrnProperty np(p);
590  if (np.is_point()) {
591  return;
592  }
593  char buf[200];
594  for (Symbol* sym = np.first_var(); np.more_var(); sym = np.next_var()) {
595  if (np.var_type(sym) == type || type == 0) {
596  if (ISARRAY(sym)) {
597  int n = hoc_total_array_data(sym, 0);
598  if (n > 5) {
599  sprintf(buf, "%s[all]%s", sym->name, xarg);
600  symbol_list_.append(new SymbolItem(buf, n));
601  }
602  sprintf(buf, "%s[%d]%s", sym->name, 0, xarg);
603  symbol_list_.append(new SymbolItem(buf));
604  sprintf(buf, "%s[%d]%s", sym->name, n - 1, xarg);
605  symbol_list_.append(new SymbolItem(buf));
606  } else {
607  sprintf(buf, "%s%s", sym->name, xarg);
608  symbol_list_.append(new SymbolItem(buf));
609  }
610  }
611  }
612 }
613 #endif
614 
616  if (ISARRAY(sym)) {
617  int i, n = 1;
618  if (od) {
619  n = hoc_total_array_data(sym, od);
620  } else { // Vector
621  if (is_obj_type(o, "Vector")) {
622  extern int ivoc_vector_size(Object*);
623  n = ivoc_vector_size(o);
624  }
625  }
626  if (n > 5 && sym->type == VAR) {
627  symbol_list_.append(new SymbolItem(sym, od, 0, n));
628  }
629  for (i = 0; i < n; ++i) {
630  symbol_list_.append(new SymbolItem(sym, od, i));
631  if (i > 5) {
632  break;
633  }
634  }
635  if (i < n - 1) {
636  symbol_list_.append(new SymbolItem(sym, od, n - 1));
637  }
638  } else {
639  symbol_list_.append(new SymbolItem(sym, od, 0));
640  }
641 }
642 
644  symbol_list_.append(new SymbolItem(ob));
645 }
647  long i, cnt = symbol_list_.count();
648  for (i = 0; i < cnt; ++i) {
649  if (symbol_list_.item(i)->object() == ob) {
650  symbol_list_.item(i)->no_object();
651  break;
652  }
653  }
654 }
void nrn_pushsec(Section *sec)
Definition: cabcode.cpp:99
double nrn_arc_position(Section *sec, Node *node)
Definition: cabcode.cpp:1867
void nrn_popsec(void)
Definition: cabcode.cpp:123
short index
Definition: cabvars.h:10
short type
Definition: cabvars.h:9
static void Detach(cTemplate *, Observer *)
Definition: ocobserv.cpp:58
static void Attach(cTemplate *, Observer *)
Definition: ocobserv.cpp:50
int message()
Definition: ocobserv.h:55
Object * object()
Definition: ocobserv.h:52
std::map< String, Symbol * > symtab_
Definition: symdir.h:23
static void Detach(Object *, Observer *)
Definition: ocobserv.cpp:27
static void Attach(Object *, Observer *)
Definition: ocobserv.cpp:20
void save()
Definition: oc2iv.cpp:54
void restore()
Definition: oc2iv.cpp:72
Definition: string.h:34
const char * string() const
Definition: string.h:139
virtual const String & path() const
Definition: symdir.cpp:331
virtual int count() const
Definition: symdir.cpp:334
Object * obj(int index)
Definition: symdir.cpp:374
int array_index(int index) const
Definition: symdir.cpp:340
virtual ~SymDirectory()
Definition: symdir.cpp:231
virtual double * variable(int index)
Definition: symdir.cpp:273
virtual bool is_pysec(int index) const
Definition: symdir.cpp:181
static bool match(const String &name, const String &pattern)
Definition: symdir.cpp:364
virtual int index(const String &) const
Definition: symdir.cpp:344
virtual int whole_vector(int index)
Definition: symdir.cpp:327
Symbol * symbol(int index) const
Definition: symdir.cpp:367
virtual void whole_name(int index, CopyString &) const
Definition: symdir.cpp:353
Object * object() const
Definition: symdir.cpp:370
SymDirectory * newsymdir(int index)
Definition: symdir.cpp:189
SymDirectoryImpl * impl_
Definition: symdir.h:58
virtual const String & name(int index) const
Definition: symdir.cpp:337
virtual bool is_directory(int index) const
Definition: symdir.cpp:361
void load_template()
Definition: symdir.cpp:547
void load(int type)
Definition: symdir.cpp:472
void disconnect(Observable *)
Definition: symdir.cpp:250
CopyString path_
Definition: symdir.cpp:56
void load_object()
Definition: symdir.cpp:518
void un_append(Object *)
Definition: symdir.cpp:646
Object * obj_
Definition: symdir.cpp:52
SymbolList symbol_list_
Definition: symdir.cpp:55
void load_aliases()
Definition: symdir.cpp:537
void update(Observable *)
Definition: symdir.cpp:259
void load_sectionlist()
Definition: symdir.cpp:574
void load_section()
Definition: symdir.cpp:554
void make_pathname(const char *, const char *, const char *, int s='.')
Definition: symdir.cpp:462
void append(Symbol *sym, Objectdata *od, Object *o=NULL)
Definition: symdir.cpp:615
cTemplate * t_
Definition: symdir.cpp:53
int whole_vector()
Definition: symdir.cpp:416
CopyString name_
Definition: nrnsymdiritem.h:35
~SymbolItem()
Definition: symdir.cpp:438
Symbol * symbol_
Definition: nrnsymdiritem.h:36
Object * ob_
Definition: nrnsymdiritem.h:38
int whole_array_
Definition: nrnsymdiritem.h:39
bool is_directory() const
Definition: symdir.cpp:440
int array_index() const
Definition: nrnsymdiritem.h:26
SymbolItem(const char *, int whole_array=0)
Definition: symdir.cpp:379
const String & name() const
Definition: nrnsymdiritem.h:22
void no_object()
Definition: symdir.cpp:433
sprintf(buf, " if (secondorder) {\n" " int _i;\n" " for (_i = 0; _i < %d; ++_i) {\n" " _p[_slist%d[_i]] += dt*_p[_dlist%d[_i]];\n" " }}\n", numeqn, listnum, listnum)
void hoc_execerror(const char *, const char *)
Definition: hoc.cpp:754
char buf[512]
Definition: init.cpp:13
size_t hoc_total_array_data(Symbol *s, Objectdata *obd)
Definition: hoc_oop.cpp:94
Objectdata * hoc_objectdata
Definition: hoc_oop.cpp:123
double * hoc_val_pointer(const char *s)
Definition: code2.cpp:727
int is_obj_type(Object *obj, const char *type_name)
Definition: hoc_oop.cpp:2059
char * hoc_object_name(Object *ob)
Definition: hoc_oop.cpp:72
char * hoc_araystr(Symbol *sym, int index, Objectdata *obd)
Definition: code.cpp:2367
#define assert(ex)
Definition: hocassrt.h:32
#define OBJECTALIAS
Definition: hocdec.h:107
#define ISARRAY(arg)
Definition: hocdec.h:164
#define USERDOUBLE
Definition: hocdec.h:93
#define hocSEC(q)
Definition: hoclist.h:66
#define OBJ(q)
Definition: hoclist.h:67
const char * concat(const char *s1, const char *s2)
Definition: symdir.cpp:31
implementPtrList(SymbolList, SymbolItem)
Symlist * hoc_top_level_symlist
Definition: symdir.cpp:23
int hoc_array_index(Symbol *, Objectdata *)
Definition: code.cpp:2399
Symlist * hoc_symlist
Objectdata * hoc_top_level_data
Definition: hoc_oop.cpp:124
Symlist * hoc_built_in_symlist
Definition: ivocmac.cpp:76
static int compare_entries(const void *k1, const void *k2)
Definition: symdir.cpp:76
double * ivoc_vector_ptr(Object *o, int index)
Definition: ivocvect.cpp:3941
int ivoc_vector_size(Object *o)
Definition: ivocvect.cpp:3936
#define sec
Definition: md1redef.h:13
#define i
Definition: md1redef.h:12
#define prop
Definition: md1redef.h:29
#define ITERATE(itm, lst)
Definition: model.h:25
char * name
Definition: init.cpp:16
static char suffix[256]
Definition: nocpout.cpp:149
void section_ref(Section *)
Definition: solve.cpp:575
void section_unref(Section *)
Definition: solve.cpp:565
int const size_t const size_t n
Definition: nrngsl.h:11
size_t q
if(status)
size_t p
double * point_process_pointer(Point_process *, Symbol *, int)
Definition: point.cpp:257
hoc_List * section_list
Definition: init.cpp:102
#define xarg(i)
Object ** object_pobj(Symbol *sym, Objectdata *od)
Definition: oc2iv.h:77
hoc_Item ** object_psecitm(Symbol *sym, Objectdata *od)
Definition: oc2iv.h:80
void nrn_symdir_load_pysec(SymbolList &sl, void *v)
#define parent
Definition: rbtqueue.cpp:47
sl
Definition: seclist.cpp:181
o
Definition: seclist.cpp:175
#define cnt
Definition: spt2queue.cpp:19
#define NULL
Definition: sptree.h:16
Definition: model.h:15
Definition: section.h:133
struct Prop * prop
Definition: section.h:152
Definition: hocdec.h:227
void * aliases
Definition: hocdec.h:239
void * this_pointer
Definition: hocdec.h:232
Objectdata * dataspace
Definition: hocdec.h:231
int index
Definition: hocdec.h:229
union Object::@39 u
Definition: section.h:214
Definition: model.h:57
short type
Definition: model.h:58
long subtype
Definition: model.h:59
HocStruct Symbol * next
Definition: hocdec.h:162
HocStruct Object * object_
Definition: hocdec.h:138
union Symbol::@18 u
char * name
Definition: model.h:72
double * pval
Definition: hocdec.h:137
HocStruct cTemplate * ctemplate
Definition: hocdec.h:152
int oboff
Definition: hocdec.h:132
Definition: hocdec.h:84
hoc_List * olist
Definition: hocdec.h:204
double * pval
Definition: hocdec.h:218
char * strstr(char *cs, char *ct)
Definition: xred.cpp:173