Choreonoid  1.1
EasyScanner.h
[詳解]
1 
7 #ifndef CNOID_UTIL_EASYSCANNER_H_INCLUDED
8 #define CNOID_UTIL_EASYSCANNER_H_INCLUDED
9 
10 #include <map>
11 #include <string>
12 #include <vector>
13 #include <boost/shared_ptr.hpp>
14 #include "exportdecl.h"
15 
16 namespace cnoid {
17 
22 
23  public:
24 
25  class Endl {
26  //int dummy;
27  };
28 
30  public:
31  std::string message;
32  std::string filename;
34  std::string getFullMessage();
35  };
36 
37  enum TokenType {
38  T_NONE = 0, T_SPACE, T_ALPHABET, T_INTEGER, T_DOUBLE, T_WORD,
39  T_STRING, T_SIGLUM, T_LF, T_EOF
40  };
41 
42  typedef std::map<std::string, int> SymbolMap;
43  typedef std::pair<std::string, int> SymbolPair;
44  typedef boost::shared_ptr<SymbolMap> SymbolMapPtr;
45 
47 
48  EasyScanner();
49  EasyScanner(std::string filename);
50  EasyScanner(const EasyScanner& scanner, bool copy_text = false);
51  virtual ~EasyScanner();
52 
53  void putSymbols();
54 
55  inline void registerSymbol(int id, const std::string& symbol) {
56  symbols->insert(SymbolPair(symbol, id));
57  }
58 
59  inline int getSymbolID(const std::string& symbol) {
60  SymbolMap::iterator p = symbols->find(symbol);
61  return (p != symbols->end()) ? p->second : 0;
62  }
63 
65  void setCommentChar(char cc);
66 
67  void setLineOriented(bool on);
68  void setQuoteChar(char qc);
69  void setWhiteSpaceChar(char ws);
70 
71  void loadFile(const std::string& filename);
72 
73  void setText(const char* text, int len);
74 
75  void setLineNumberOffset(int offset);
76 
77  void setDefaultErrorMessage(const std::string& message){
78  defaultErrorMessage = message;
79  }
80 
81  void moveToHead();
82 
83  int readToken();
84 
85  void toLower();
86 
87  bool readDouble();
88  bool readInt();
89  bool readChar();
90  bool readChar(int chara);
91  int peekChar();
92 
97  inline bool readWord() {
98  skipSpace();
99  return readWord0();
100  }
101 
106  inline bool readString(const int delimiterChar = ',') {
107  skipSpace();
108  return readString0(delimiterChar);
109  }
110 
111  bool readString(const char* str);
112 
113  inline bool readString(const std::string& str) {
114  return readString(str.c_str());
115  }
116 
117  bool readQuotedString(bool allowNoQuotedWord = false);
118 
119  bool readUnquotedTextBlock();
120 
121  bool readSymbol();
122  bool readSymbol(int id);
123 
124  inline bool isEOF(){
125  skipSpace();
126  return (*text == '\0');
127  }
128 
130  inline bool readLF() {
131  skipSpace();
132  return readLF0();
133  }
134 
135  inline bool readLFEOF() {
136  skipSpace();
137  return readLF0() ? true : (*text == '\0');
138  }
139 
140  bool checkLF();
141 
142  bool readLine();
143  bool skipLine();
144  bool skipBlankLines();
145 
146  void skipSpace();
147 
148  void throwException(const char* message);
149  void throwException(const std::string& message);
150 
155  inline int readIntEx(const char* message = 0) {
156  if(!readInt()) throwException(message);
157  return intValue;
158  }
163  inline double readDoubleEx(const char* message = 0) {
164  if(!readDouble()) throwException(message);
165  return doubleValue;
166  }
171  inline int readCharEx(const char* message = 0) {
172  if(!readChar())
173  throwException(message);
174  return charValue;
175  }
179  inline void readCharEx(int chara, const char* message = 0) {
180  if(!readChar(chara)) throwException(message);
181  }
186  inline std::string readWordEx(const char* message = 0) {
187  if(!readWord()) throwException(message);
188  return stringValue;
189  }
190 
195  inline std::string readStringEx(const char* message = 0) {
196  if(!readString()) throwException(message);
197  return stringValue;
198  }
199 
200  inline std::string readQuotedStringEx(const char* message = 0) {
201  if(!readQuotedString()) throwException(message);
202  return stringValue;
203  }
208  inline int readSymbolEx(const char* message = 0) {
209  if(!readSymbol()) throwException(message);
210  return symbolValue;
211  }
215  inline void readLFex(const char* message = 0) {
216  if(!readLF()) throwException(message);
217  }
218 
219  inline void readLFEOFex(const char* message = 0) {
220  if(!readLFEOF()) throwException(message);
221  }
222 
223  int intValue;
224  double doubleValue;
225  std::string stringValue;
226  char charValue;
228 
229  std::string defaultErrorMessage;
231 
232  char* text;
233 
234  std::string filename;
235 
236  private:
237  void init();
238  bool extractQuotedString();
239 
240  inline void skipToLineEnd();
241  bool readLF0();
242  bool readWord0();
243  bool readString0(const int delimiterChar);
244 
245  char* textBuf;
246  int size;
247  char* textBufEnd;
248  int lineNumberOffset;
249  int commentChar;
250  int quoteChar;
251  bool isLineOriented;
252 
253  std::vector<int> whiteSpaceChars;
254 
255  SymbolMapPtr symbols;
256 
257  friend CNOID_EXPORT EasyScanner& operator>>(EasyScanner& scanner, double& value);
258  friend CNOID_EXPORT EasyScanner& operator>>(EasyScanner& scanner, int& value);
259  friend CNOID_EXPORT EasyScanner& operator>>(EasyScanner& scanner, const char* matchString);
260  friend CNOID_EXPORT EasyScanner& operator>>(EasyScanner& scanner, char matchChar);
261  friend CNOID_EXPORT EasyScanner& operator>>(EasyScanner& scanner, std::string& str);
263 
264  };
265 
266 
267  CNOID_EXPORT EasyScanner& operator>>(EasyScanner& scanner, double& value);
268  CNOID_EXPORT EasyScanner& operator>>(EasyScanner& scanner, int& value);
269  CNOID_EXPORT EasyScanner& operator>>(EasyScanner& scanner, const char* matchString);
270  CNOID_EXPORT EasyScanner& operator>>(EasyScanner& scanner, char matchChar);
271  CNOID_EXPORT EasyScanner& operator>>(EasyScanner& scanner, std::string& str);
273 
274  typedef boost::shared_ptr<EasyScanner> EasyScannerPtr;
275 
276 }
277 
278 #endif
CNOID_EXPORT EasyScanner & operator>>(EasyScanner &scanner, double &value)
Definition: EasyScanner.cpp:731
void registerSymbol(int id, const std::string &symbol)
Definition: EasyScanner.h:55
std::string readWordEx(const char *message=0)
Definition: EasyScanner.h:186
bool readWord()
Definition: EasyScanner.h:97
bool readLF()
reading a line feed
Definition: EasyScanner.h:130
Endl endl
Definition: EasyScanner.h:46
void setDefaultErrorMessage(const std::string &message)
Definition: EasyScanner.h:77
void readCharEx(int chara, const char *message=0)
Definition: EasyScanner.h:179
std::pair< std::string, int > SymbolPair
Definition: EasyScanner.h:43
int intValue
Definition: EasyScanner.h:223
char charValue
Definition: EasyScanner.h:226
std::map< std::string, int > SymbolMap
Definition: EasyScanner.h:42
double doubleValue
Definition: EasyScanner.h:224
int readCharEx(const char *message=0)
Definition: EasyScanner.h:171
int symbolValue
Definition: EasyScanner.h:227
void readLFEOFex(const char *message=0)
Definition: EasyScanner.h:219
bool isEOF()
Definition: EasyScanner.h:124
boost::shared_ptr< SymbolMap > SymbolMapPtr
Definition: EasyScanner.h:44
std::string filename
Definition: EasyScanner.h:234
Definition: EasyScanner.h:38
std::string readStringEx(const char *message=0)
Definition: EasyScanner.h:195
std::string defaultErrorMessage
Definition: EasyScanner.h:229
int lineNumber
Definition: EasyScanner.h:230
std::string message
Definition: EasyScanner.h:31
std::string stringValue
Definition: EasyScanner.h:225
int readSymbolEx(const char *message=0)
Definition: EasyScanner.h:208
Definition: EasyScanner.h:25
Definition: EasyScanner.h:29
double readDoubleEx(const char *message=0)
Definition: EasyScanner.h:163
Definition: EasyScanner.h:16
int getSymbolID(const std::string &symbol)
Definition: EasyScanner.h:59
bool readString(const int delimiterChar= ',')
Definition: EasyScanner.h:106
bool readString(const std::string &str)
Definition: EasyScanner.h:113
bool readLFEOF()
Definition: EasyScanner.h:135
Definition: EasyScanner.h:39
std::string readQuotedStringEx(const char *message=0)
Definition: EasyScanner.h:200
boost::shared_ptr< EasyScanner > EasyScannerPtr
Definition: EasyScanner.h:274
#define CNOID_EXPORT
Definition: Util/exportdecl.h:13
std::string filename
Definition: EasyScanner.h:32
TokenType
Definition: EasyScanner.h:37
int readIntEx(const char *message=0)
Definition: EasyScanner.h:155
char * text
Definition: EasyScanner.h:232
Definition: EasyScanner.h:21
void readLFex(const char *message=0)
Definition: EasyScanner.h:215
int lineNumber
Definition: EasyScanner.h:33