1 /*
2 * MFBool.cpp
3 *
4 * Copyright (C) 1999 Stephen F. White, 2008 J. "MUFTI" Scheurich
5 *
6 * This program is free software; you can redistribute it and/or modify
7 * it under the terms of the GNU General Public License as published by
8 * the Free Software Foundation; either version 2 of the License, or
9 * (at your option) any later version.
10 *
11 * This program is distributed in the hope that it will be useful,
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 * GNU General Public License for more details.
15 *
16 * You should have received a copy of the GNU General Public License
17 * along with this program (see the file "COPYING" for details); if
18 * not, write to the Free Software Foundation, Inc., 675 Mass Ave,
19 * Cambridge, MA 02139, USA.
20 */
21
22 #include <stdio.h>
23 #include "stdafx.h"
24
25 #include "MFBool.h"
26 #include "SFBool.h"
27 #include "DuneApp.h"
28
MFBool()29 MFBool::MFBool()
30 {
31 m_value.resize(0);
32 }
33
MFBool(bool * values,int len)34 MFBool::MFBool(bool *values, int len)
35 {
36 m_value.setData(values, len);
37 }
38
MFBool(MFBool * value)39 MFBool::MFBool(MFBool *value)
40 {
41 m_value.setData(value->getValues(), value->getSize());
42 }
43
MFBool(const bool value)44 MFBool::MFBool(const bool value)
45 {
46 m_value.resize(0);
47 m_value[0] = value;
48 }
49
~MFBool()50 MFBool::~MFBool()
51 {
52 if (m_value.size() > 0)
53 m_value.resize(0);
54 }
55
56 MyString
getString(int index,int stride) const57 MFBool::getString(int index, int stride) const
58 {
59 MyString ret = "";
60 ret += m_value[index * getStride() + stride] ? "true" : "false";
61 return ret;
62 }
63
64 FieldValue *
copy()65 MFBool::copy()
66 {
67 bool *value = new bool[m_value.size()];
68 for (long i = 0;i < m_value.size(); i++)
69 value[i] = m_value[i];
70 return new MFBool(value, m_value.size());
71 }
72
writeData(int f,int i) const73 int MFBool::writeData(int f, int i) const
74 {
75 return mywritestr(f, m_value[i] ? "TRUE" : "FALSE");
76 }
77
writeXml(int f,int indent,int containerField,bool avoidUse) const78 int MFBool::writeXml(int f, int indent, int containerField, bool avoidUse)
79 const
80 {
81 RET_ONERROR( mywritestr(f, "'") )
82 for (int i = 0; i < getSFSize(); i++) {
83 RET_ONERROR( mywritestr(f, m_value[i] ? "true" : "false") )
84 if (i != (getSFSize() - 1))
85 RET_ONERROR( mywritestr(f, " ") )
86 }
87 RET_ONERROR( mywritestr(f, "'") )
88 return(0);
89 }
90
writeDataC(int f,int i,int languageFlag) const91 int MFBool::writeDataC(int f, int i, int languageFlag) const
92 {
93 if (languageFlag & C_SOURCE)
94 RET_ONERROR( mywritestr(f, m_value[i] ? "-1" : "0") )
95 else
96 RET_ONERROR( mywritestr(f, m_value[i] ? "true" : "false") )
97 return 0;
98 }
99
100 const char *
getTypeC(int languageFlag) const101 MFBool::getTypeC(int languageFlag) const
102 {
103 if (languageFlag & C_SOURCE)
104 return "short";
105 if (languageFlag & JAVA_SOURCE)
106 return "boolean";
107 return "bool";
108 }
109
110 bool
readLine(int index,char * line)111 MFBool::readLine(int index, char *line)
112 {
113 if (strncmp(line, "TRUE", strlen("TRUE")) == 0)
114 m_value[index] = true;
115 else
116 m_value[index] = false;
117 return true;
118 }
119
120 bool
equals(const FieldValue * value) const121 MFBool::equals(const FieldValue *value) const
122 {
123 if (value->getType() == MFBOOL) {
124 MFBool *v = (MFBool *) value;
125 if (v->getSize() != (int)m_value.size()) return false;
126 for (long i = 0; i < m_value.size(); i++)
127 if (m_value[i] != v->getValue(i))
128 return false;
129 return true;
130 }
131 return false;
132 }
133
134 FieldValue *
getSFValue(int index) const135 MFBool::getSFValue(int index) const
136 {
137 return new SFBool(m_value[index]);
138 }
139
140 void
setSFValue(int index,FieldValue * value)141 MFBool::setSFValue(int index, FieldValue *value)
142 {
143 m_value[index] = ((SFBool *) value)->getValue();
144 }
145
146 void
setSFValue(int index,const int value)147 MFBool::setSFValue(int index, const int value)
148 {
149 m_value[index] = value;
150 }
151
152
153 MyString
getEcmaScriptComment(MyString name,int flags) const154 MFBool::getEcmaScriptComment(MyString name, int flags) const
155 {
156 const char *indent = ((FieldValue *)this)->getEcmaScriptIndent(flags);
157 MyString ret;
158 ret = "";
159 if (TheApp->GetEcmaScriptAddAllowedValues()) {
160 ret += indent;
161 ret += "// allowed values:\n";
162
163 ret += indent;
164 ret += " // array ([0] [1] [2] ...) of boolean values (true/false)";
165 }
166 if (TheApp->GetEcmaScriptAddAvailableFunctions()) {
167 ret += indent;
168 ret += "// available functions:\n";
169 if (flags != EL_EVENT_IN) {
170 ret += indent;
171 ret += " // ";
172 ret += name;
173 ret += " = new MFBool(bool_b1, bool_b2, ...);\n";
174 }
175 if (flags != EL_EVENT_OUT) {
176 ret += indent;
177 ret += " // bool_b = ";
178 ret += name;
179 ret += ".length();\n";
180
181 ret += indent;
182 ret += " // string_str = ";
183 ret += name;
184 ret += ".toString();\n";
185 }
186 }
187 if (TheApp->GetEcmaScriptAddExampleUsage()) {
188 ret += indent;
189 ret += "// example usage:\n";
190 if (flags != EL_EVENT_IN) {
191 ret += indent;
192 ret += " // ";
193 ret += name;
194 ret += " = new MFBool(true, false, true, true);\n";
195
196 ret += indent;
197 ret += " // ";
198 ret += name;
199 ret += "[0] = false;\n";
200 }
201 if (flags != EL_EVENT_OUT) {
202 ret += indent;
203 ret += " // bool_b =";
204 ret += name;
205 ret += "[0]\n";
206 }
207 }
208 return ret;
209 }
210
211 void
insertSFValue(int index,FieldValue * value)212 MFBool::insertSFValue(int index, FieldValue *value)
213 {
214 m_value.insert(((SFBool *)value)->getValue(), index);
215 }
216
217 void
insertSFValue(int index,const bool value)218 MFBool::insertSFValue(int index, const bool value)
219 {
220 m_value.insert(value, index);
221 }
222
223 FieldValue *
getRandom(Scene * scene,int nodeType)224 MFBool::getRandom(Scene *scene, int nodeType)
225 {
226 int size = INT_RAND();
227 bool *array = new bool[size];
228 for (int i = 0; i < size; i++)
229 array[i] = RAND() > 0.5;
230 return new MFBool(array, size);
231 }
232
233