NEURON
units1.cpp
Go to the documentation of this file.
1 #include <../../nmodlconf.h>
2 /* /local/src/master/nrn/src/modlunit/units1.c,v 1.1.1.1 1994/10/12 17:22:51 hines Exp */
3 /* Just a connection to units.c so that file doesn't need to include modl.h */
4 #include "model.h"
5 #include "parse1.hpp"
6 
7 void unit_push(Item* q)
8 {
10 }
11 
12 char *
14 {
15  if (sym->u.str) {
16  return sym->u.str;
17  }
18  if (sym->info && ITMA(sym->info)[1]) {
19  return STR(ITMA(sym->info)[1]);
20  }
21  return "";
22 }
23 
24 void ifcnvfac(Item* q3) /* '(' expr ')' */
25 {
26  Item *q1, *q2;
27  double d;
28 
29  q2 = prev_parstok(q3);
30  q1 = prev_parstok(q2);
31  if (q1->itemsubtype == '(') {
32  if(q2->itemsubtype == REAL || q2->itemsubtype == INTEGER) {
33  unit_pop();
34  sscanf(STR(q2), "%lf", &d);
35  unit_push_num(1./d);
36  }else if (q2->itemsubtype == DEFINEDVAR) {
37  unit_pop();
38  d = (double) (SYM(q2)->u.i);
39  unit_push_num(1./d);
40  }
41  }
42 }
43 
44 /* x^y y must be dimensionless. If x is dimensionless then
45 y can be any expression. If x has dimensions then y must be a positive integer
46 and the units can be computed */
47 
48 void unit_exponent(Item* y, Item* lastok) /*x ^ y*/
49 {
50  int i;
51  double yval;
52 
53  unit_less();
54  if ( y == lastok && y->itemsubtype == INTEGER) {
55  i = sscanf(STR(y), "%lf", &yval);
56  assert(i == 1);
57  if (yval - (double)((int)yval)) {
58  unit_less();
59  Unit_push("");
60  } else {
61  Unit_exponent((int)yval);
62  }
63  }else{
64  unit_less();
65  Unit_push("");
66  }
67 }
68 
69 static Item *qexpr[3];
70 void unit_cmp(Item* q1, Item* q2, Item* q3)
71 {
72  qexpr[0] = q1;
73  qexpr[1] = q2;
74  qexpr[2] = q3;
75  Unit_cmp();
76 }
77 
78 void print_unit_expr(int i)
79 {
80  if (i==1) {
81  if (qexpr[0]) {
82  printitems(qexpr[0], qexpr[1]->prev);
83  }
84  }else{
85  if (qexpr[1]) {
86  printitems(qexpr[1]->next, qexpr[2]);
87  }
88  }
89 }
90 
91 
92 void unit_logic(int type, Item* q1, Item* q2, Item* q3)
93 {
94  /* if type is 1 then it doesn't matter what the
95  top two elements are: the result is dimensionless.
96  If the type is 2 then the top two elements must have
97  the same dimensions and the result is dimensionless.
98  */
99 
100  if (type == 2) {
101  unit_cmp(q1, q2, q3);
102  }else{
103  unit_pop();
104  }
105  unit_pop();
106  Unit_push("");
107 }
108 
109 #define NLEVEL 10 /* 10 levels of call! */
110 static int argnumstk[NLEVEL], pargnum = -1;
111 
113 {
114  List *larg;
115  Item *q;
116  Symbol *s;
117 
118  pargnum++;
119  assert(pargnum < NLEVEL);
120 
121  s = SYM(q1);
122 
123  /* push the args with units in reverse order */
124  if (s->info && (larg = (List *) ITMA(s->info)[2])) { /*declared*/
125  argnumstk[pargnum] = 0;
126  for (q=larg->prev; q != larg; q = q->prev) {
127  argnumstk[pargnum]++;
128  Unit_push(STR(q));
129  }
130  }else{
131  argnumstk[pargnum] = -1;
132  }
133 }
134 
136 {
137  if (argnumstk[pargnum] > 0) {
138  diag("too few arguments", (char *)0);
139  }
140  assert(pargnum >= 0);
141  pargnum--;
142 }
143 
144 void unit_chk_arg(Item* q1, Item* q2)
145 {
146  if (argnumstk[pargnum] > 0) {
147  argnumstk[pargnum]--;
148  unit_cmp(ITEM0, q1->prev, q2);
149  unit_pop();
150  }else if (argnumstk[pargnum] == 0) {
151  diag("too many arguments", (char *)0);
152  }else{
153  unit_less();
154  }
155 }
156 
157 void func_unit(Item* q1, Item* q2)
158 {
159  Symbol *s, *checklocal(Symbol*);
160 
161  s = SYM(q1);
162  s = checklocal(s); /* hidden with pushlocal */
163  s->subtype = DEP;
164  if (q2) {
165  s->u.str = STR(q2);
166  }else{
167  s->u.str = (char *)0;
168  }
169 }
170 
171 void unit_del(int i) /* push 1/delta_x ^ i units */
172 {
173  Symbol *s;
174  char *cp;
175 
176  s = lookup("delta_x");
177  if(!s) {
178  diag("delta_x not declared", (char *)0);
179  }
180  cp = decode_units(s);
181  Unit_push("");
182  while(i--) {
183  Unit_push(cp);
184  unit_div();
185  }
186 }
short itemsubtype
Definition: model.h:17
void unit_chk_arg(Item *q1, Item *q2)
Definition: units1.cpp:144
#define assert(ex)
Definition: hocassrt.h:26
short type
Definition: cabvars.h:10
void Unit_exponent(int)
Definition: units.cpp:409
#define diag(s)
Definition: fmenu.cpp:188
void unit_div()
Definition: units.cpp:393
#define DEP
Definition: model.h:116
#define SYM(q)
Definition: model.h:86
void Unit_push(char *)
Definition: units.cpp:284
#define ITEM0
Definition: model.h:22
#define REAL
Definition: machine.h:191
void printitems(Item *q1, Item *q2)
Definition: model.cpp:172
Item * lastok
Definition: io.cpp:13
struct Item * prev
Definition: model.h:20
Item * next(Item *item)
Definition: list.cpp:95
void unit_push_args(Item *q1)
Definition: units1.cpp:112
Definition: model.h:15
void unit_exponent(Item *y, Item *lastok)
Definition: units1.cpp:48
void unit_done_args()
Definition: units1.cpp:135
char * decode_units(Symbol *sym)
Definition: units1.cpp:13
void unit_logic(int type, Item *q1, Item *q2, Item *q3)
Definition: units1.cpp:92
Item * prev(Item *item)
Definition: list.cpp:101
void unit_del(int i)
Definition: units1.cpp:171
Symbol * checklocal(Symbol *sym)
Definition: symbol.cpp:35
_CONST char * s
Definition: system.cpp:74
void Unit_cmp()
Definition: units.cpp:454
Definition: model.h:57
void print_unit_expr(int i)
Definition: units1.cpp:78
void func_unit(Item *q1, Item *q2)
Definition: units1.cpp:157
void unit_push_num(double)
Definition: units.cpp:303
void unit_push(Item *q)
Definition: units1.cpp:7
#define lookup
Definition: redef.h:90
long subtype
Definition: model.h:59
Item * prev_parstok(Item *)
#define STR(q)
Definition: model.h:87
void unit_less()
Definition: units.cpp:560
#define i
Definition: md1redef.h:12
void ifcnvfac(Item *q3)
Definition: units1.cpp:24
void unit_pop()
Definition: units.cpp:216
static Item * qexpr[3]
Definition: units1.cpp:69
Item * info
Definition: model.h:60
union Symbol::@18 u
size_t q
#define ITMA(q)
Definition: model.h:89
char * str
Definition: model.h:63
static int pargnum
Definition: units1.cpp:110
#define NLEVEL
Definition: units1.cpp:109
void unit_cmp(Item *q1, Item *q2, Item *q3)
Definition: units1.cpp:70
static int argnumstk[NLEVEL]
Definition: units1.cpp:110