]> git.mxchange.org Git - simgear.git/blob - simgear/misc/tabbed_values.cxx
Add a function to calculate the normalmap from a regular texture.
[simgear.git] / simgear / misc / tabbed_values.cxx
1 #include "tabbed_values.hxx"
2
3 #include "assert.h"
4
5 SGTabbedValues::SGTabbedValues(const char *line) :
6         _line(line)
7 {
8         assert(line);
9         _fields.push_back(const_cast<char*>(line));
10 }
11
12 const char* SGTabbedValues::fieldAt(const unsigned int index) const
13 {
14         // we already computed that offset, cool
15         if (_fields.size() > index)
16                 return _fields[index];
17
18         while (_fields.size() <= index) {
19                 char* nextField = _fields.back();
20                 if (*nextField=='\0') return NULL; // we went off the end
21                         
22                 while (*nextField != '\t') {
23                         if (*nextField=='\0') return NULL; // we went off the end
24                         ++nextField;
25                 }
26                 _fields.push_back(++nextField);
27         }
28         
29         return _fields.back();
30 }
31
32 string SGTabbedValues::operator[](const unsigned int offset) const
33 {
34         const char *data = fieldAt(offset);
35         char* endPtr = const_cast<char*>(data);
36         int len = 0;
37         while ((*endPtr != '\0') && (*endPtr != '\t')) {
38                 ++len;
39                 ++endPtr;
40         }
41         return string(fieldAt(offset), len);
42 }
43
44 bool SGTabbedValues::isValueAt(const unsigned int offset) const
45 {
46         const char *data = fieldAt(offset);
47         return data && (*data != '\t'); // must be non-NULL and non-tab
48 }
49
50 char SGTabbedValues::getCharAt(const unsigned int offset) const
51 {
52         const char *data = fieldAt(offset);
53         if (!data || (*data == '\t'))
54                 return 0;
55         
56         return *data;
57 }
58
59 double SGTabbedValues::getDoubleAt(const unsigned int offset) const
60 {
61         const char *data = fieldAt(offset);
62         if (!data || (*data == '\t'))
63                 return 0;
64                 
65         /* this is safe because strtod will stop parsing when it sees an unrecogznied
66         character, which includes tab. */       
67         return strtod(data, NULL);
68 }
69
70 long SGTabbedValues::getLongAt(const unsigned int offset) const
71 {
72         const char *data = fieldAt(offset);
73         if (!data || (*data == '\t'))
74                 return 0;
75
76         return strtol(data, NULL, 0);
77 }