This repository has been archived by the owner on Dec 7, 2019. It is now read-only.
-
Notifications
You must be signed in to change notification settings - Fork 1
/
user_variables.hpp
154 lines (105 loc) · 4.19 KB
/
user_variables.hpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
#ifndef USER_VARIABLES_H
#define USER_VARIABLES_H
#include <stdlib.h>
#include <string.h>
#include <vector>
#include "calc_value.hpp"
//USERVAR_NAME_MAXLENGTH = 20
// variable names longer than 20chars will be called by their first 19 chars
// the node for my linked list of user defined variables
class UserVar {
public:
char name[USERVAR_NAME_MAXLENGTH]; // USERVAR_NAME_MAXLENGTH defined in calc_value.h
CalcValue val;
UserVar *first, *next;
UserVar(UserVar* firstn, const char* const identifier, double contents):
val(contents), first(firstn), next((UserVar*) NULL)
{
strncpy(name, identifier, USERVAR_NAME_MAXLENGTH - 1);
val.type = CalcValue::NUM;
}
UserVar(UserVar* firstn, const char* const identifier, const char* const contents):
val(contents), first(firstn), next((UserVar*) NULL)
{
strncpy(name, identifier, USERVAR_NAME_MAXLENGTH - 1);
val.type = CalcValue::NUM;
}
UserVar(UserVar* firstn, const char* const identifier, CalcValue contents):
val(contents), first(firstn), next((UserVar*) NULL)
{
strncpy(name, identifier, USERVAR_NAME_MAXLENGTH - 1);
}
// geting the values
double getNumber()
{ return val.getNum(); }
char* getString()
{ return val.getStr(); }
// recursive method of accessing Values of CalcValue::REF type
CalcValue getValue(){
if (val.type == CalcValue::REF) {
CalcValue* value = val.valAtRef(first);
while (value != NULL && value->type == CalcValue::REF)
value = value->valAtRef(first);
// broken reference (should I tell them???)
return value ? *value : NULL_CALCVAL_OBJECT;
}
return val;
}
// recursive method of accessing Values of CalcValue::REF type
CalcValue* getValPtr(){
if (val.type == CalcValue::REF) {
CalcValue* value = val.valAtRef(first);
while (value != NULL && value->type == CalcValue::REF)
value = value->valAtRef(first);
return value;
}
return &val;
}
CalcValue& getVal()
{ return val; }
// changing the values
void setValue(const char* in)
{
CalcValue* value = getValPtr();
value->setValue(in);
}
void setValue(const double in)
{ val.setValue(in); }
void setValue(const CalcValue in)
{ val.setValue(in); }
void setValue(UserVar* in)
{ val = CalcValue().setRef(in->name); }
};
namespace vars {
// the last element on the linked list
extern UserVar* lastVar(UserVar* first);
// to be called after reset
extern void wipeAll(UserVar* first);
// to make a new variable, or change it's value
//extern void assignVar(UserVar* first, char name[USERVAR_NAME_MAXLENGTH], double value);
extern UserVar* assignVar(UserVar* first, const char name[USERVAR_NAME_MAXLENGTH], CalcValue value);
inline UserVar* assignVar(std::vector<UserVar>& vars, const char name[USERVAR_NAME_MAXLENGTH], CalcValue value){
return assignVar(&vars[vars.size() - 1], name, value);
}
extern UserVar* assignNewVar(UserVar* first, const char name[USERVAR_NAME_MAXLENGTH], CalcValue value);
inline UserVar* assignNewVar(std::vector<UserVar>& vars, const char name[USERVAR_NAME_MAXLENGTH], CalcValue value){
return assignNewVar(&vars[vars.size() - 1], name, value);
}
// to remove an individial variable
extern void removeVar(UserVar* first, const char name[USERVAR_NAME_MAXLENGTH]);
// returns a pointer to the variable
extern UserVar* findVar(UserVar* first, const char name[USERVAR_NAME_MAXLENGTH]);
extern UserVar* findVar(std::vector<UserVar>& vars, const char name[USERVAR_NAME_MAXLENGTH]);
// has the variable been declared yet?
extern bool varExists(UserVar* first, const char name[USERVAR_NAME_MAXLENGTH]);
extern bool varExists(std::vector<UserVar>& vars, const char name[USERVAR_NAME_MAXLENGTH]);
// de-references a value
extern CalcValue* valueAtVar(UserVar* first, const char name[USERVAR_NAME_MAXLENGTH]);
extern CalcValue* valueAtVar(std::vector<UserVar>& vars, const char name[USERVAR_NAME_MAXLENGTH]);
// last variable in a chain of variables linking eachother
// similar to valueAtVar() but returns var instead of val
extern UserVar* lastVarInRefChain(UserVar *first, const char name[USERVAR_NAME_MAXLENGTH]);
extern UserVar* lastVarInRefChain(std::vector<UserVar> &vars, const char name[USERVAR_NAME_MAXLENGTH]);
extern void clearScope(std::vector<UserVar>& scopes);
}
#endif