summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/exceptions.cpp1
-rw-r--r--src/exceptions.h1
-rw-r--r--src/tafreader.cpp129
-rw-r--r--src/tafreader.h6
-rw-r--r--src/tests/taf.cpp9
5 files changed, 145 insertions, 1 deletions
diff --git a/src/exceptions.cpp b/src/exceptions.cpp
index d9f4e70..50b95c3 100644
--- a/src/exceptions.cpp
+++ b/src/exceptions.cpp
@@ -4,6 +4,7 @@
4namespace Bu 4namespace Bu
5{ 5{
6 subExceptionDef( XmlException ) 6 subExceptionDef( XmlException )
7 subExceptionDef( TafException )
7 subExceptionDef( FileException ) 8 subExceptionDef( FileException )
8 subExceptionDef( SocketException ) 9 subExceptionDef( SocketException )
9 subExceptionDef( ConnectionException ) 10 subExceptionDef( ConnectionException )
diff --git a/src/exceptions.h b/src/exceptions.h
index f146b73..d5a9d39 100644
--- a/src/exceptions.h
+++ b/src/exceptions.h
@@ -7,6 +7,7 @@
7namespace Bu 7namespace Bu
8{ 8{
9 subExceptionDecl( XmlException ) 9 subExceptionDecl( XmlException )
10 subExceptionDecl( TafException )
10 subExceptionDecl( FileException ) 11 subExceptionDecl( FileException )
11 subExceptionDecl( SocketException ) 12 subExceptionDecl( SocketException )
12 subExceptionDecl( ConnectionException ) 13 subExceptionDecl( ConnectionException )
diff --git a/src/tafreader.cpp b/src/tafreader.cpp
index 4d10b8d..91aa9f2 100644
--- a/src/tafreader.cpp
+++ b/src/tafreader.cpp
@@ -1,14 +1,141 @@
1#include "tafreader.h" 1#include "bu/tafreader.h"
2#include "bu/exceptions.h"
3#include "bu/fstring.h"
2 4
3Bu::TafReader::TafReader( Bu::Stream &sIn ) : 5Bu::TafReader::TafReader( Bu::Stream &sIn ) :
4 sIn( sIn ) 6 sIn( sIn )
5{ 7{
8 next();
9 node();
6} 10}
7 11
8Bu::TafReader::~TafReader() 12Bu::TafReader::~TafReader()
9{ 13{
10} 14}
11 15
16void Bu::TafReader::node()
17{
18 ws();
19 if( c != '{' )
20 throw Bu::TafException("Expected '{'");
21 next();
22 ws();
23 Bu::FString sName;
24 for(;;)
25 {
26 if( c == ':' )
27 break;
28 else
29 sName += c;
30 next();
31 }
32 next();
33 printf("Node[%s]:\n", sName.getStr() );
34
35 nodeContent();
36
37 if( c != '}' )
38 throw TafException("Expected '}'");
39
40 next();
41}
42
43void Bu::TafReader::nodeContent()
44{
45 for(;;)
46 {
47 ws();
48 if( c == '{' )
49 node();
50 else if( c == '}' )
51 return;
52 else
53 nodeProperty();
54 }
55}
56
57void Bu::TafReader::nodeProperty()
58{
59 Bu::FString sName;
60 for(;;)
61 {
62 if( isws() || c == '=' )
63 break;
64 else
65 sName += c;
66 next();
67 }
68 ws();
69 if( c != '=' )
70 {
71 printf(" %s (true)\n", sName.getStr() );
72 return;
73 }
74 next();
75 ws();
76 Bu::FString sValue;
77 if( c == '"' )
78 {
79 next();
80 for(;;)
81 {
82 if( c == '\\' )
83 {
84 next();
85 if( c == 'x' )
86 {
87 char code[3]={'\0','\0','\0'};
88 next();
89 code[0] = c;
90 next();
91 code[1] = c;
92 c = (unsigned char)strtol( code, NULL, 16 );
93 }
94 else if( c == '"' )
95 c = '"';
96 else
97 throw TafException("Invalid escape sequence.");
98 }
99 else if( c == '"' )
100 break;
101 sValue += c;
102 next();
103 }
104 next();
105 }
106 else
107 {
108 for(;;)
109 {
110 if( isws() || c == '}' || c == '{' )
111 break;
112 sValue += c;
113 next();
114 }
115 }
116 printf(" %s = %s\n", sName.getStr(), sValue.getStr() );
117}
118
119FString Bu::TafReader::readStr()
120{
121}
122
123void Bu::TafReader::ws()
124{
125 for(;;)
126 {
127 if( !isws() )
128 return;
129
130 next();
131 }
132}
133
134bool Bu::TafReader::isws()
135{
136 return (c == ' ' || c == '\t' || c == '\n' || c == '\r');
137}
138
12void Bu::TafReader::next() 139void Bu::TafReader::next()
13{ 140{
14 sIn.read( &c, 1 ); 141 sIn.read( &c, 1 );
diff --git a/src/tafreader.h b/src/tafreader.h
index b552f5d..127b571 100644
--- a/src/tafreader.h
+++ b/src/tafreader.h
@@ -17,7 +17,13 @@ namespace Bu
17 virtual ~TafReader(); 17 virtual ~TafReader();
18 18
19 private: 19 private:
20 void node();
21 void nodeContent();
22 void nodeProperty();
23 void ws();
24 bool isws();
20 void next(); 25 void next();
26 FString readStr();
21 char c; 27 char c;
22 Stream &sIn; 28 Stream &sIn;
23 29
diff --git a/src/tests/taf.cpp b/src/tests/taf.cpp
new file mode 100644
index 0000000..12c653e
--- /dev/null
+++ b/src/tests/taf.cpp
@@ -0,0 +1,9 @@
1#include "bu/tafreader.h"
2#include "bu/file.h"
3
4int main()
5{
6 Bu::File f("test.taf", "rb");
7 Bu::TafReader tr( f );
8}
9