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) if (t & (arg2)) if (t & (~(arg2 | arg3))) {\
16  Fprintf(stderr, "%s is a %s\n",\
17  s->name, arg1);\
18  err=1;\
19  }
20 
22 {
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,
58  "Warning: %s undefined. (declared within VERBATIM?)\n", s->name);
59  }
60  if (err) {
61  diag("multiple uses for same variable", (char *) 0);
62  }
63  if (indepsym == SYM0) {
64  diag("Independent variable is not defined", (char *)0);
65  }
66  /* avoid the problem where person inadvertently is using Dstate as a state*/
67  SYMITER(NAME) {
68  if ((s->subtype & STAT) && (s->name[0] == 'D')) {
69  Symbol* s1 = lookup(s->name + 1);
70  if (s1 && s->type == NAME && (s->subtype & STAT)) {
71 fprintf(stderr, "%s is a STATE so %s is a %s' and", s1->name, s->name, s1->name);
72 diag(" cannot be declared as a STATE\n", (char*)0);
73  }
74  }
75  }
76 }
#define PARM
Definition: modl.h:190
#define KINF
Definition: model.h:132
#define con(arg1, arg2, arg3)
Definition: consist.cpp:15
#define DERF
Definition: model.h:125
Item ** scop_indep
Definition: declare.cpp:12
int usage
Definition: model.h:66
#define PROCED
Definition: model.h:120
short type
Definition: model.h:58
#define diag(s)
Definition: fmenu.cpp:188
#define DEP
Definition: model.h:116
char * name
Definition: model.h:72
#define Fprintf
Definition: model.h:249
#define EXTDEF4
Definition: modl.h:214
#define UNITDEF
Definition: modl.h:209
Definition: model.h:15
#define EXTDEF5
Definition: modl.h:215
_CONST char * s
Definition: system.cpp:74
#define ARRAY
Definition: model.h:118
#define DISCF
Definition: model.h:128
#define PARF
Definition: model.h:130
#define KEYWORD
Definition: model.h:113
fprintf(stderr, "Don't know the location of params at %p\, pp)
Definition: model.h:57
Symbol * indepsym
Definition: declare.cpp:11
#define NLINF
Definition: model.h:127
#define FUNCT
Definition: model.h:119
#define EXTDEF
Definition: model.h:131
NMODL parser global flags / functions.
#define lookup
Definition: redef.h:90
long subtype
Definition: model.h:59
#define EXTDEF2
Definition: modl.h:210
#define LINF
Definition: model.h:126
#define i
Definition: md1redef.h:12
#define STAT
Definition: model.h:117
#define STEP1
Definition: model.h:129
#define SYM0
Definition: model.h:74
#define EXTDEF3
Definition: modl.h:212
double t
Definition: init.cpp:123
#define INDEP
Definition: model.h:115
#define nmodlCONST
Definition: modl.h:211
void consistency()
Definition: consist.cpp:21
#define SYMITER(arg1)
Definition: symbol.h:9