Starshatter_Open
Open source Starshatter engine
 All Classes Files Functions Variables Typedefs Enumerations Enumerator Friends Macros
ParseUtil.cpp
Go to the documentation of this file.
1 /* Project nGenEx
2  Destroyer Studios LLC
3  Copyright © 1997-2004. All Rights Reserved.
4 
5  SUBSYSTEM: nGenEx.lib
6  FILE: ParseUtil.cpp
7  AUTHOR: John DiCamillo
8 
9 
10  OVERVIEW
11  ========
12  Parser utility functions
13 */
14 
15 #include "MemDebug.h"
16 #include "ParseUtil.h"
17 #include "DataLoader.h"
18 
19 #include "stdio.h"
20 
21 // +--------------------------------------------------------------------+
22 
23 bool GetDefBool(bool& dst, TermDef* def, const char* file)
24 {
25  if (!def || !def->term()) {
26  Print("WARNING: missing BOOL TermDef in '%s'\n", file);
27  return false;
28  }
29 
30  TermBool* tn = def->term()->isBool();
31  if (tn) {
32  dst = tn->value();
33  return true;
34  }
35  else {
36  Print("WARNING: invalid bool %s in '%s'. value = ", def->name()->value().data(), file);
37  def->term()->print(10);
38  Print("\n");
39  }
40 
41  return false;
42 }
43 
44 bool GetDefText(Text& dst, TermDef* def, const char* file)
45 {
46  if (!def || !def->term()) {
47  Print("WARNING: missing TEXT TermDef in '%s'\n", file);
48  return false;
49  }
50 
51  TermText* tn = def->term()->isText();
52  if (tn) {
53  dst = tn->value();
54  return true;
55  }
56  else
57  Print("WARNING: invalid TEXT %s in '%s'\n", def->name()->value().data(), file);
58 
59  return false;
60 }
61 
62 bool GetDefText(char* dst, TermDef* def, const char* file)
63 {
64  if (!def || !def->term()) {
65  Print("WARNING: missing TEXT TermDef in '%s'\n", file);
66  return false;
67  }
68 
69  TermText* tn = def->term()->isText();
70  if (tn) {
71  strcpy(dst, tn->value());
72  return true;
73  }
74  else
75  Print("WARNING: invalid TEXT %s in '%s'\n", def->name()->value().data(), file);
76 
77  return false;
78 }
79 
80 bool GetDefNumber(int& dst, TermDef* def, const char* file)
81 {
82  if (!def || !def->term()) {
83  Print("WARNING: missing NUMBER TermDef in '%s'\n", file);
84  return false;
85  }
86 
87  TermNumber* tr = def->term()->isNumber();
88  if (tr) {
89  dst = (int) tr->value();
90  return true;
91  }
92  else
93  Print("WARNING: invalid NUMBER %s in '%s'\n", def->name()->value().data(), file);
94 
95  return false;
96 }
97 
98 bool GetDefNumber(DWORD& dst, TermDef* def, const char* file)
99 {
100  if (!def || !def->term()) {
101  Print("WARNING: missing NUMBER TermDef in '%s'\n", file);
102  return false;
103  }
104 
105  TermNumber* tr = def->term()->isNumber();
106  if (tr) {
107  dst = (DWORD) tr->value();
108  return true;
109  }
110  else
111  Print("WARNING: invalid NUMBER %s in '%s'\n", def->name()->value().data(), file);
112 
113  return false;
114 }
115 
116 bool GetDefNumber(float& dst, TermDef* def, const char* file)
117 {
118  if (!def || !def->term()) {
119  Print("WARNING: missing NUMBER TermDef in '%s'\n", file);
120  return false;
121  }
122 
123  TermNumber* tr = def->term()->isNumber();
124  if (tr) {
125  dst = (float) tr->value();
126  return true;
127  }
128  else
129  Print("WARNING: invalid NUMBER %s in '%s'\n", def->name()->value().data(), file);
130 
131  return false;
132 }
133 
134 bool GetDefNumber(double& dst, TermDef* def, const char* file)
135 {
136  if (!def || !def->term()) {
137  Print("WARNING: missing NUMBER TermDef in '%s'\n", file);
138  return false;
139  }
140 
141  TermNumber* tr = def->term()->isNumber();
142  if (tr) {
143  dst = (double) tr->value();
144  return true;
145  }
146  else
147  Print("WARNING: invalid NUMBER %s in '%s'\n", def->name()->value().data(), file);
148 
149  return false;
150 }
151 
152 bool GetDefVec(Vec3& dst, TermDef* def, const char* file)
153 {
154  if (!def || !def->term()) {
155  Print("WARNING: missing VEC3 TermDef in '%s'\n", file);
156  return false;
157  }
158 
159  TermArray* val = def->term()->isArray();
160  if (val) {
161  if (val->elements()->size() != 3) {
162  Print("WARNING: malformed vector in '%s'\n", file);
163  }
164  else {
165  dst.x = (float) (val->elements()->at(0)->isNumber()->value());
166  dst.y = (float) (val->elements()->at(1)->isNumber()->value());
167  dst.z = (float) (val->elements()->at(2)->isNumber()->value());
168 
169  return true;
170  }
171  }
172  else {
173  Print("WARNING: vector expected in '%s'\n", file);
174  }
175 
176  return false;
177 }
178 
179 bool GetDefRect(Rect& dst, TermDef* def, const char* file)
180 {
181  if (!def || !def->term()) {
182  Print("WARNING: missing RECT TermDef in '%s'\n", file);
183  return false;
184  }
185 
186  TermArray* val = def->term()->isArray();
187  if (val) {
188  if (val->elements()->size() != 4) {
189  Print("WARNING: malformed rect in '%s'\n", file);
190  }
191  else {
192  dst.x = (int) (val->elements()->at(0)->isNumber()->value());
193  dst.y = (int) (val->elements()->at(1)->isNumber()->value());
194  dst.w = (int) (val->elements()->at(2)->isNumber()->value());
195  dst.h = (int) (val->elements()->at(3)->isNumber()->value());
196 
197  return true;
198  }
199  }
200  else {
201  Print("WARNING: rect expected in '%s'\n", file);
202  }
203 
204  return false;
205 }
206 
207 bool GetDefInsets(Insets& dst, TermDef* def, const char* file)
208 {
209  if (!def || !def->term()) {
210  Print("WARNING: missing Insets TermDef in '%s'\n", file);
211  return false;
212  }
213 
214  TermArray* val = def->term()->isArray();
215  if (val) {
216  if (val->elements()->size() != 4) {
217  Print("WARNING: malformed Insets in '%s'\n", file);
218  }
219  else {
220  dst.left = (WORD) (val->elements()->at(0)->isNumber()->value());
221  dst.right = (WORD) (val->elements()->at(1)->isNumber()->value());
222  dst.top = (WORD) (val->elements()->at(2)->isNumber()->value());
223  dst.bottom = (WORD) (val->elements()->at(3)->isNumber()->value());
224 
225  return true;
226  }
227  }
228  else {
229  Print("WARNING: Insets expected in '%s'\n", file);
230  }
231 
232  return false;
233 }
234 
235 bool GetDefColor(Color& dst, TermDef* def, const char* file)
236 {
237  if (!def || !def->term()) {
238  Print("WARNING: missing COLOR TermDef in '%s'\n", file);
239  return false;
240  }
241 
242  TermArray* val = def->term()->isArray();
243  if (val) {
244  if (val->elements()->size() != 3) {
245  Print("WARNING: malformed color in '%s'\n", file);
246  }
247  else {
248  BYTE r, g, b;
249  double v0 = (val->elements()->at(0)->isNumber()->value());
250  double v1 = (val->elements()->at(1)->isNumber()->value());
251  double v2 = (val->elements()->at(2)->isNumber()->value());
252 
253  if (v0 >= 0 && v0 <= 1 &&
254  v1 >= 0 && v1 <= 1 &&
255  v2 >= 0 && v2 <= 1) {
256 
257  r = (BYTE) (v0 * 255);
258  g = (BYTE) (v1 * 255);
259  b = (BYTE) (v2 * 255);
260 
261  }
262  else {
263  r = (BYTE) v0;
264  g = (BYTE) v1;
265  b = (BYTE) v2;
266  }
267 
268  dst = Color(r,g,b);
269  return true;
270  }
271  }
272  else {
273  Print("WARNING: color expected in '%s'\n", file);
274  }
275 
276  return false;
277 }
278 
279 bool GetDefColor(ColorValue& dst, TermDef* def, const char* file)
280 {
281  if (!def || !def->term()) {
282  Print("WARNING: missing COLOR TermDef in '%s'\n", file);
283  return false;
284  }
285 
286  TermArray* val = def->term()->isArray();
287  if (val) {
288  if (val->elements()->size() < 3 || val->elements()->size() > 4) {
289  Print("WARNING: malformed color in '%s'\n", file);
290  }
291  else {
292  double r = (val->elements()->at(0)->isNumber()->value());
293  double g = (val->elements()->at(1)->isNumber()->value());
294  double b = (val->elements()->at(2)->isNumber()->value());
295  double a = 1;
296 
297  if (val->elements()->size() == 4)
298  a = (val->elements()->at(3)->isNumber()->value());
299 
300  dst.Set((float) r, (float) g, (float) b, (float) a);
301  return true;
302  }
303  }
304  else {
305  Print("WARNING: color expected in '%s'\n", file);
306  }
307 
308  return false;
309 }
310 
311 // +--------------------------------------------------------------------+
312 
313 bool GetDefArray(int* dst, int size, TermDef* def, const char* file)
314 {
315  if (!def || !def->term()) {
316  Print("WARNING: missing ARRAY TermDef in '%s'\n", file);
317  return false;
318  }
319 
320  TermArray* val = def->term()->isArray();
321  if (val) {
322  int nelem = val->elements()->size();
323 
324  if (nelem > size)
325  nelem = size;
326 
327  for (int i = 0; i < nelem; i++)
328  *dst++ = (int) (val->elements()->at(i)->isNumber()->value());
329 
330  return true;
331  }
332  else {
333  Print("WARNING: array expected in '%s'\n", file);
334  }
335 
336  return false;
337 }
338 
339 bool GetDefArray(float* dst, int size, TermDef* def, const char* file)
340 {
341  if (!def || !def->term()) {
342  Print("WARNING: missing ARRAY TermDef in '%s'\n", file);
343  return false;
344  }
345 
346  TermArray* val = def->term()->isArray();
347  if (val) {
348  int nelem = val->elements()->size();
349 
350  if (nelem > size)
351  nelem = size;
352 
353  for (int i = 0; i < nelem; i++)
354  *dst++ = (float) (val->elements()->at(i)->isNumber()->value());
355 
356  return true;
357  }
358  else {
359  Print("WARNING: array expected in '%s'\n", file);
360  }
361 
362  return false;
363 }
364 
365 bool GetDefArray(double* dst, int size, TermDef* def, const char* file)
366 {
367  if (!def || !def->term()) {
368  Print("WARNING: missing ARRAY TermDef in '%s'\n", file);
369  return false;
370  }
371 
372  TermArray* val = def->term()->isArray();
373  if (val) {
374  int nelem = val->elements()->size();
375 
376  if (nelem > size)
377  nelem = size;
378 
379  for (int i = 0; i < nelem; i++)
380  *dst++ = (double) (val->elements()->at(i)->isNumber()->value());
381 
382  return true;
383  }
384  else {
385  Print("WARNING: array expected in '%s'\n", file);
386  }
387 
388  return false;
389 }
390 
391 // +--------------------------------------------------------------------+
392 
393 bool GetDefArray(std::vector<DWORD>& array, TermDef* def, const char* file)
394 {
395  if (!def || !def->term()) {
396  Print("WARNING: missing ARRAY TermDef in '%s'\n", file);
397  return false;
398  }
399 
400  TermArray* val = def->term()->isArray();
401  if (val) {
402  int nelem = val->elements()->size();
403 
404  array.clear();
405 
406  for (int i = 0; i < nelem; i++)
407  array.push_back((DWORD) (val->elements()->at(i)->isNumber()->value()));
408 
409  return true;
410  }
411  else {
412  Print("WARNING: integer array expected in '%s'\n", file);
413  }
414 
415  return false;
416 }
417 
418 bool GetDefArray(std::vector<float>& array, TermDef* def, const char* file)
419 {
420  if (!def || !def->term()) {
421  Print("WARNING: missing ARRAY TermDef in '%s'\n", file);
422  return false;
423  }
424 
425  TermArray* val = def->term()->isArray();
426  if (val) {
427  int nelem = val->elements()->size();
428 
429  array.clear();
430 
431  for (int i = 0; i < nelem; i++)
432  array.push_back((float) (val->elements()->at(i)->isNumber()->value()));
433 
434  return true;
435  }
436  else {
437  Print("WARNING: float array expected in '%s'\n", file);
438  }
439 
440  return false;
441 }
442 
443 // +--------------------------------------------------------------------+
444 
445 bool GetDefTime(int& dst, TermDef* def, const char* file)
446 {
447  if (!def || !def->term()) {
448  Print("WARNING: missing TIME TermDef in '%s'\n", file);
449  return false;
450  }
451 
452  TermText* tn = def->term()->isText();
453 
454  if (tn) {
455  int d = 0;
456  int h = 0;
457  int m = 0;
458  int s = 0;
459 
460  char buf[64];
461  strcpy_s(buf, tn->value());
462 
463  if (strchr(buf, '/'))
464  sscanf_s(buf, "%d/%d:%d:%d", &d, &h, &m, &s);
465  else
466  sscanf_s(buf, "%d:%d:%d", &h, &m, &s);
467 
468  dst = d * 24 * 60 * 60 +
469  h * 60 * 60 +
470  m * 60 +
471  s;
472 
473  return true;
474  }
475  else
476  Print("WARNING: invalid TIME %s in '%s'\n", def->name()->value().data(), file);
477 
478  return false;
479 }
480 
481