Atlas-C++
Bach.h
Go to the documentation of this file.
1 // This file may be redistributed and modified under the terms of the
2 // GNU Lesser General Public License (See COPYING for details).
3 // Copyright (C) 2000-2001 Michael Day, Stefanus Du Toit
4 
5 // $Id$
6 
7 #ifndef ATLAS_CODECS_BACH_H
8 #define ATLAS_CODECS_BACH_H
9 
10 #include <Atlas/Codec.h>
11 
12 #include <iosfwd>
13 #include <stack>
14 
15 namespace Atlas { namespace Codecs {
16 
21 class Bach : public Codec
22 {
23  public:
24 
25  Bach(std::iostream& s, Atlas::Bridge & b);
26 
27  virtual void poll(bool can_read = true);
28 
29  virtual void streamBegin();
30  virtual void streamMessage();
31  virtual void streamEnd();
32 
33  virtual void mapMapItem(const std::string& name);
34  virtual void mapListItem(const std::string& name);
35  virtual void mapIntItem(const std::string& name, long);
36  virtual void mapFloatItem(const std::string& name, double);
37  virtual void mapStringItem(const std::string& name, const std::string&);
38  virtual void mapEnd();
39 
40  virtual void listMapItem();
41  virtual void listListItem();
42  virtual void listIntItem(long);
43  virtual void listFloatItem(double);
44  virtual void listStringItem(const std::string&);
45  virtual void listEnd();
46 
47  unsigned linenum() const {return m_linenum;}
48 
49  protected:
50 
51  std::iostream& m_socket;
52  Bridge & m_bridge;
53  bool m_comma;
54  unsigned m_linenum;
55 
56  enum State
57  {
58  PARSE_INIT,
59  PARSE_STREAM,
60  PARSE_MAP,
61  PARSE_LIST,
62  PARSE_NAME,
63  PARSE_DATA,
64  PARSE_INT,
65  PARSE_FLOAT,
66  PARSE_STRING,
67  PARSE_LITERAL, // for literal character escaped with backslash
68  PARSE_COMMENT // for when we're in the middle of a comment field
69  };
70 
71  bool stringmode() const;
72 
73  std::string m_name, m_data;
74  std::stack<State> m_state;
75 
76  inline void parseInit(char);
77  inline void parseStream(char);
78  inline void parseMap(char);
79  inline void parseList(char);
80  inline void parseData(char);
81  inline void parseInt(char);
82  inline void parseFloat(char);
83  inline void parseString(char);
84  inline void parseLiteral(char);
85  inline void parseName(char);
86  inline void parseComment(char);
87 
88  inline const std::string encodeString(const std::string &);
89  inline const std::string decodeString(const std::string &);
90 
91  void writeIntItem(const std::string &,long);
92  void writeFloatItem(const std::string &,double);
93  void writeStringItem(const std::string &,const std::string &);
94  void writeLine(const std::string &,bool=true,bool=false);
95 };
96 
97 } } // namespace Atlas::Codecs
98 
99 #endif // ATLAS_CODECS_BACH_H
Atlas stream bridge.
Definition: Bridge.h:35
virtual void listStringItem(const std::string &)
Adds a string to the currently streamed list.
Definition: Bach.h:21
virtual void listEnd()
Ends the currently streamed list.
virtual void listMapItem()
Starts a map object in the currently streamed list.
The Atlas namespace.
Definition: Bridge.h:20
virtual void mapIntItem(const std::string &name, long)
Adds an integer to the currently streames map.
Atlas stream codec.
Definition: Codec.h:27
virtual void listFloatItem(double)
Adds a float to the currently streamed list.
virtual void mapMapItem(const std::string &name)
Starts a map object to the currently streamed map.
virtual void mapEnd()
Ends the currently streamed map.
virtual void mapStringItem(const std::string &name, const std::string &)
Adds a string to the currently streamed map.
virtual void mapListItem(const std::string &name)
Starts a list object to the currently streamed map.
virtual void streamMessage()
Start a message in an Atlas stream.
virtual void streamEnd()
Ends the Atlas stream.
virtual void listIntItem(long)
Adds an integer to the currently streames list.
virtual void streamBegin()
Begin an Atlas stream.
virtual void mapFloatItem(const std::string &name, double)
Adds a float to the currently streamed map.
virtual void listListItem()
Starts a list object in the currently streamed list.

Copyright 2000-2004 the respective authors.

This document can be licensed under the terms of the GNU Free Documentation License or the GNU General Public License and may be freely distributed under the terms given by one of these licenses.