00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023 #include <cstdlib>
00024 #include <assert.h>
00025
00026 #include "tabbed_values.hxx"
00027
00028
00029 SGTabbedValues::SGTabbedValues(const char *line) :
00030 _line(line)
00031 {
00032 assert(line);
00033 _fields.push_back(const_cast<char*>(line));
00034 }
00035
00036 const char* SGTabbedValues::fieldAt(const unsigned int index) const
00037 {
00038
00039 if (_fields.size() > index)
00040 return _fields[index];
00041
00042 while (_fields.size() <= index) {
00043 char* nextField = _fields.back();
00044 if (*nextField=='\0') return NULL;
00045
00046 while (*nextField != '\t') {
00047 if (*nextField=='\0') return NULL;
00048 ++nextField;
00049 }
00050 _fields.push_back(++nextField);
00051 }
00052
00053 return _fields.back();
00054 }
00055
00056 string SGTabbedValues::operator[](const unsigned int offset) const
00057 {
00058 const char *data = fieldAt(offset);
00059 char* endPtr = const_cast<char*>(data);
00060 int len = 0;
00061 while ((*endPtr != '\0') && (*endPtr != '\t')) {
00062 ++len;
00063 ++endPtr;
00064 }
00065 return string(fieldAt(offset), len);
00066 }
00067
00068 bool SGTabbedValues::isValueAt(const unsigned int offset) const
00069 {
00070 const char *data = fieldAt(offset);
00071 return data && (*data != '\t');
00072 }
00073
00074 char SGTabbedValues::getCharAt(const unsigned int offset) const
00075 {
00076 const char *data = fieldAt(offset);
00077 if (!data || (*data == '\t'))
00078 return 0;
00079
00080 return *data;
00081 }
00082
00083 double SGTabbedValues::getDoubleAt(const unsigned int offset) const
00084 {
00085 const char *data = fieldAt(offset);
00086 if (!data || (*data == '\t'))
00087 return 0;
00088
00089
00090
00091 return std::strtod(data, NULL);
00092 }
00093
00094 long SGTabbedValues::getLongAt(const unsigned int offset) const
00095 {
00096 const char *data = fieldAt(offset);
00097 if (!data || (*data == '\t'))
00098 return 0;
00099
00100 return std::strtol(data, NULL, 0);
00101 }