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