NEURON
consist.cpp
Go to the documentation of this file.
1 #include <../../nmodlconf.h>
2 
3 /*
4  * Check that names do not have conflicting types. This is done after the
5  * entire file is read in and allows declaring a variable after its use (very
6  * bad style) to work in some circumstances.
7  */
8 #include "modl.h"
9 #include "parse1.hpp"
10 #include "symbol.h"
11 
12 extern Symbol* scop_indep;
13 extern Symbol* indepsym;
14 
15 #define con(arg1, arg2, arg3) \
16  if (t & (arg2)) \
17  if (t & (~(arg2 | arg3))) { \
18  Fprintf(stderr, "%s is a %s\n", s->name, arg1); \
19  err = 1; \
20  }
21 
22 void consistency() {
23  Symbol* s;
24  Item* qs;
25  int i, tu, err = 0;
26  long t;
27 
28 
29  /* the scop_indep can also be a automatic parameter */
30  if (scop_indep != indepsym && scop_indep->subtype == (PARM | INDEP)) {
31  scop_indep->subtype = INDEP;
32  }
33 
34  SYMITER(NAME) {
35  t = s->subtype;
36  con("KEYWORD", KEYWORD, 0);
37  con("RESERVED WORD", EXTDEF | EXTDEF2 | EXTDEF3 | EXTDEF4 | EXTDEF5, 0);
38  con("CONSTANT", nmodlCONST, 0);
39  con("PARAMETER", PARM, ARRAY);
40  con("ASSIGNED", DEP, ARRAY);
41  con("INDEPENDENT", INDEP, 0);
42  con("STATE", STAT, ARRAY);
43  con("FUNCTION", FUNCT, 0);
44  con("PROCEDURE", PROCED, 0);
45  con("DERIVATIVE", DERF, 0);
46  con(" KINETIC", KINF, 0);
47  con("LINEAR", LINF, 0);
48  con("NONLINEAR", NLINF, 0);
49  con("DISCRETE", DISCF, 0);
50  con("PARTIAL", PARF, 0);
51  con("STEPPED", STEP1, 0);
52  con("CONSTANT UNITS FACTOR", UNITDEF, 0);
53  tu = s->usage;
54  if ((tu & DEP) && (tu & FUNCT))
55  diag(s->name, " used as both variable and function");
56  if ((t == 0) && tu)
57  Fprintf(stderr, "Warning: %s undefined. (declared within VERBATIM?)\n", s->name);
58  }
59  if (err) {
60  diag("multiple uses for same variable", (char*) 0);
61  }
62  if (indepsym == SYM0) {
63  diag("Independent variable is not defined", (char*) 0);
64  }
65  /* avoid the problem where person inadvertently is using Dstate as a state*/
66  SYMITER(NAME) {
67  if ((s->subtype & STAT) && (s->name[0] == 'D')) {
68  Symbol* s1 = lookup(s->name + 1);
69  if (s1 && s->type == NAME && (s->subtype & STAT)) {
70  fprintf(stderr, "%s is a STATE so %s is a %s' and", s1->name, s->name, s1->name);
71  diag(" cannot be declared as a STATE\n", (char*) 0);
72  }
73  }
74  }
75 }
double t
Definition: cvodeobj.cpp:59
#define diag(s)
Definition: fmenu.cpp:192
#define EXTDEF4
Definition: modl.h:214
#define EXTDEF5
Definition: modl.h:215
#define PARM
Definition: modl.h:190
#define EXTDEF2
Definition: modl.h:210
#define nmodlCONST
Definition: modl.h:211
#define EXTDEF3
Definition: modl.h:212
#define UNITDEF
Definition: modl.h:209
#define i
Definition: md1redef.h:12
#define DERF
Definition: model.h:125
#define FUNCT
Definition: model.h:119
#define SYM0
Definition: model.h:74
#define LINF
Definition: model.h:126
#define STAT
Definition: model.h:117
#define DISCF
Definition: model.h:128
#define INDEP
Definition: model.h:115
#define PARF
Definition: model.h:130
#define STEP1
Definition: model.h:129
#define EXTDEF
Definition: model.h:131
#define KINF
Definition: model.h:132
#define DEP
Definition: model.h:116
#define KEYWORD
Definition: model.h:113
#define NLINF
Definition: model.h:127
#define ARRAY
Definition: model.h:118
#define PROCED
Definition: model.h:120
#define Fprintf
Definition: model.h:234
NMODL parser global flags / functions.
Item ** scop_indep
Definition: declare.cpp:12
void consistency()
Definition: consist.cpp:22
#define SYMITER(arg1)
Definition: symbol.h:13
#define fprintf
Definition: mwprefix.h:30
#define con(arg1, arg2, arg3)
Definition: consist.cpp:15
Symbol * indepsym
Definition: declare.cpp:11
#define lookup
Definition: redef.h:90
Definition: model.h:15
Definition: model.h:57
int usage
Definition: model.h:66
short type
Definition: model.h:58
long subtype
Definition: model.h:59
char * name
Definition: model.h:72