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