OPAL (Object Oriented Parallel Accelerator Library)  2.2.0
OPAL
SDDSParser.cpp
Go to the documentation of this file.
1 #include "SDDSParser.h"
2 
3 #include <boost/algorithm/string.hpp>
4 
6  sddsFileName_m("")
7 { }
8 
9 SDDS::SDDSParser::SDDSParser(const std::string &input):
10  sddsFileName_m(input)
11 { }
12 
13 void SDDS::SDDSParser::setInput(const std::string &input) {
14  sddsFileName_m = input;
15 }
16 
18  typedef std::string::const_iterator iterator_t;
19  typedef SDDS::parser::file_parser<iterator_t> file_parser_t;
21  typedef SDDS::error_handler<iterator_t> error_handler_t;
22 
23  sddsData_m.clear();
24  paramNameToID_m.clear();
25  columnNameToID_m.clear();
26 
27  skipper_t skipper;
28  std::string contents = readFile();
29  iterator_t contentsIter = contents.begin();
30  iterator_t contentsEnd = contents.end();
31  error_handler_t error_handler(contentsIter, contentsEnd);
32  file_parser_t parser(error_handler);
33 
34  bool success = phrase_parse(contentsIter, contentsEnd, parser, skipper, sddsData_m);
35  {
36  SDDS::parameterList::iterator piter = sddsData_m.sddsParameters_m.begin();
37  SDDS::parameterList::iterator pend = sddsData_m.sddsParameters_m.end();
38  for (; piter != pend && success; ++ piter) {
39  success = piter->parse(contentsIter, contentsEnd, skipper);
40  }
41  while (success && contentsIter != contentsEnd) {
42  SDDS::columnList::iterator citer = sddsData_m.sddsColumns_m.begin();
43  SDDS::columnList::iterator cend = sddsData_m.sddsColumns_m.end();
44  for (; citer != cend && success; ++ citer) {
45  success = citer->parse(contentsIter, contentsEnd, skipper);
46  }
47  }
48  }
49 
50  if (!success || contentsIter != contentsEnd)
51  {
52  throw SDDSParserException("SDDSParser::parseSDDSFile",
53  "could not parse SDDS file");
54  }
55 
56  unsigned int param_order = 0;
57  for (const SDDS::parameter &param: sddsData_m.sddsParameters_m) {
58  std::string name = *param.name_m;
59  fixCaseSensitivity(name);
60  paramNameToID_m.insert(std::make_pair(name,
61  param_order));
62  ++ param_order;
63  }
64 
65  unsigned int col_order = 0;
66  for (const SDDS::column &col: sddsData_m.sddsColumns_m) {
67  std::string name = *col.name_m;
68  fixCaseSensitivity(name);
69  columnNameToID_m.insert(std::make_pair(name,
70  col_order));
71  ++ col_order;
72  }
73 
74  return sddsData_m;
75 }
76 
78  std::ifstream in(sddsFileName_m.c_str());
79 
80  if (in) {
81  std::string contents;
82  in.seekg(0, std::ios::end);
83  contents.resize(in.tellg());
84  in.seekg(0, std::ios::beg);
85 
86  in.read(&contents[0], contents.size());
87 
88  in.close();
89 
90  return contents;
91  }
92 
93  throw SDDSParserException("SDDSParser::readSDDSFile",
94  "could not open file '" + sddsFileName_m + "'");
95 
96  return std::string("");
97 }
98 
100  int idx = getColumnIndex(columnName);
101 
102  return sddsData_m.sddsColumns_m[idx].values_m;
103 }
104 
105 
106 int SDDS::SDDSParser::getColumnIndex(std::string col_name) const {
107  fixCaseSensitivity(col_name);
108  auto it = columnNameToID_m.find(col_name);
109  if (it != columnNameToID_m.end()) {
110  return it->second;
111  }
112 
113  throw SDDSParserException("SDDSParser::getColumnIndex",
114  "could not find column '" + col_name + "'");
115 
116 }
117 
118 //XXX use either all upper, or all lower case chars
119 void SDDS::SDDSParser::fixCaseSensitivity(std::string &for_string) {
120 
121  boost::to_lower(for_string);
122 }
boost::optional< std::string > name_m
Definition: column.hpp:39
std::string readFile()
Definition: SDDSParser.cpp:77
ast::columnData_t getColumnData(const std::string &columnName)
Definition: SDDSParser.cpp:99
int getColumnIndex(std::string col_name) const
Definition: SDDSParser.cpp:106
static void fixCaseSensitivity(std::string &for_string)
Definition: SDDSParser.cpp:119
FILECONTENTS * readFile(const char filename[])
Definition: read.cpp:40
void setInput(const std::string &input)
Definition: SDDSParser.cpp:13
SDDS::parser::skipper< iterator_t > skipper_t
Definition: ast.cpp:9
std::vector< variant_t > columnData_t
Definition: ast.hpp:42
const std::string name
std::string::const_iterator iterator_t
Definition: array.cpp:8
std::string::iterator iterator
Definition: MSLang.h:16
boost::optional< std::string > name_m
Definition: parameter.hpp:39