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