diff options
author | Mike Buland <eichlan@xagasoft.com> | 2009-07-30 17:05:47 +0000 |
---|---|---|
committer | Mike Buland <eichlan@xagasoft.com> | 2009-07-30 17:05:47 +0000 |
commit | 3f0f30442de297859cccc18f28db83b4e755d36f (patch) | |
tree | 6e9fdd9ff6febcdd87779f7663fecc0388e0dd73 | |
parent | 8551cdd3bbf66d8b7b0fea8aa1e0fbddd86bca47 (diff) | |
download | libbu++-3f0f30442de297859cccc18f28db83b4e755d36f.tar.gz libbu++-3f0f30442de297859cccc18f28db83b4e755d36f.tar.bz2 libbu++-3f0f30442de297859cccc18f28db83b4e755d36f.tar.xz libbu++-3f0f30442de297859cccc18f28db83b4e755d36f.zip |
Bu::Buffer actually works, and works really well. I dig it. Bu::BZip2 now
follows the new filter guidelines, where read and write report the amount of
data consumed, not the amount processed. I.e. when writing, it reports how
much of your incoming data it used, not how many bytes it wrote on the other
end.
-rw-r--r-- | src/buffer.cpp | 120 | ||||
-rw-r--r-- | src/buffer.h | 15 | ||||
-rw-r--r-- | src/bzip2.cpp | 2 | ||||
-rw-r--r-- | src/tests/buffer.cpp | 38 |
4 files changed, 172 insertions, 3 deletions
diff --git a/src/buffer.cpp b/src/buffer.cpp index fef64b1..5e7fb9a 100644 --- a/src/buffer.cpp +++ b/src/buffer.cpp | |||
@@ -1,18 +1,31 @@ | |||
1 | /* | ||
2 | * Copyright (C) 2007-2008 Xagasoft, All rights reserved. | ||
3 | * | ||
4 | * This file is part of the libbu++ library and is released under the | ||
5 | * terms of the license contained in the file LICENSE. | ||
6 | */ | ||
7 | |||
1 | #include "bu/buffer.h" | 8 | #include "bu/buffer.h" |
2 | 9 | ||
3 | Bu::Buffer::Buffer( Bu::Stream &rNext, int iBufsize ) : | 10 | Bu::Buffer::Buffer( Bu::Stream &rNext, int iBufSize ) : |
4 | Bu::Filter( rNext ), | 11 | Bu::Filter( rNext ), |
5 | sSoFar( 0 ), | 12 | sSoFar( 0 ), |
6 | iBufSize( iBufSize ), | 13 | iBufSize( iBufSize ), |
7 | sReadBuf( NULL ), | 14 | sReadBuf( NULL ), |
8 | sWriteBuf( NULL ), | 15 | sWriteBuf( NULL ), |
9 | iReadBufFill( 0 ), | 16 | iReadBufFill( 0 ), |
10 | iWriteBufFill( 0 ) | 17 | iReadPos( 0 ), |
18 | iWriteBufFill( 0 ), | ||
19 | iWritePos( 0 ) | ||
11 | { | 20 | { |
21 | sReadBuf = new char[iBufSize]; | ||
22 | sWriteBuf = new char[iBufSize]; | ||
12 | } | 23 | } |
13 | 24 | ||
14 | Bu::Buffer::~Buffer() | 25 | Bu::Buffer::~Buffer() |
15 | { | 26 | { |
27 | delete[] sReadBuf; | ||
28 | delete[] sWriteBuf; | ||
16 | } | 29 | } |
17 | 30 | ||
18 | void Bu::Buffer::start() | 31 | void Bu::Buffer::start() |
@@ -23,15 +36,118 @@ size_t Bu::Buffer::stop() | |||
23 | { | 36 | { |
24 | } | 37 | } |
25 | 38 | ||
39 | void Bu::Buffer::fillReadBuf() | ||
40 | { | ||
41 | if( iReadBufFill+iReadPos < iBufSize ) | ||
42 | { | ||
43 | printf("Buffer: Attempting to read %db.\n", iBufSize-iReadBufFill-iReadPos ); | ||
44 | iReadBufFill += rNext.read( | ||
45 | sReadBuf+iReadPos+iReadBufFill, | ||
46 | iBufSize-iReadBufFill-iReadPos | ||
47 | ); | ||
48 | printf("Buffer: Read from stream, %db now in buffer.\n", iReadBufFill ); | ||
49 | } | ||
50 | } | ||
51 | |||
26 | size_t Bu::Buffer::read( void *pBuf, size_t nBytes ) | 52 | size_t Bu::Buffer::read( void *pBuf, size_t nBytes ) |
27 | { | 53 | { |
54 | if( nBytes <= 0 ) | ||
55 | { | ||
56 | fillReadBuf(); | ||
57 | return 0; | ||
58 | } | ||
59 | |||
60 | size_t nTotRead = 0; | ||
61 | // fillReadBuf(); | ||
62 | |||
63 | do | ||
64 | { | ||
65 | int iAmnt = nBytes-nTotRead; | ||
66 | if( iAmnt > iReadBufFill ) | ||
67 | { | ||
68 | iAmnt = iReadBufFill; | ||
69 | } | ||
70 | if( iAmnt > 0 ) | ||
71 | { | ||
72 | memcpy( ((char *)pBuf)+nTotRead, sReadBuf+iReadPos, iAmnt ); | ||
73 | iReadPos += iAmnt; | ||
74 | nTotRead += iAmnt; | ||
75 | iReadBufFill -= iAmnt; | ||
76 | } | ||
77 | if( iReadBufFill == 0 ) | ||
78 | { | ||
79 | iReadPos = 0; | ||
80 | fillReadBuf(); | ||
81 | } | ||
82 | } | ||
83 | while( nTotRead < nBytes && iReadBufFill > 0 ); | ||
84 | |||
85 | printf("Buffer: %db returned, %db remain in buffer.\n", nTotRead, iReadBufFill ); | ||
86 | |||
87 | return nTotRead; | ||
28 | } | 88 | } |
29 | 89 | ||
30 | size_t Bu::Buffer::write( const void *pBuf, size_t nBytes ) | 90 | size_t Bu::Buffer::write( const void *pBuf, size_t nBytes ) |
31 | { | 91 | { |
92 | size_t nTotWrote = 0; | ||
93 | |||
94 | do | ||
95 | { | ||
96 | int iAmnt = nBytes-nTotWrote; | ||
97 | if( iAmnt > iBufSize-iWritePos-iWriteBufFill ) | ||
98 | { | ||
99 | iAmnt = iBufSize-iWritePos-iWriteBufFill; | ||
100 | } | ||
101 | if( iAmnt > 0 ) | ||
102 | { | ||
103 | memcpy( | ||
104 | sWriteBuf+iWritePos+iWriteBufFill, | ||
105 | ((char *)pBuf)+nTotWrote, | ||
106 | iAmnt | ||
107 | ); | ||
108 | nTotWrote += iAmnt; | ||
109 | iWriteBufFill += iAmnt; | ||
110 | printf("Buffer: Moved %db to write buffer, %db filled now.\n", | ||
111 | iAmnt, iWriteBufFill ); | ||
112 | } | ||
113 | while( iWritePos+iWriteBufFill == iBufSize ) | ||
114 | { | ||
115 | printf("iWritePos = %d\n", iWritePos ); | ||
116 | int iWr = rNext.write( sWriteBuf+iWritePos, iWriteBufFill ); | ||
117 | printf("Buffer: Wrote %db from buffer to stream, %db filled now.\n", iWr, iWriteBufFill-iWr ); | ||
118 | if( iWr == 0 ) | ||
119 | { | ||
120 | return nTotWrote; | ||
121 | } | ||
122 | else if( iWr == iWriteBufFill ) | ||
123 | { | ||
124 | iWritePos = iWriteBufFill = 0; | ||
125 | } | ||
126 | else | ||
127 | { | ||
128 | iWritePos += iWr; | ||
129 | iWriteBufFill -= iWr; | ||
130 | } | ||
131 | } | ||
132 | } | ||
133 | while( nTotWrote < nBytes && iWriteBufFill < iBufSize+iWritePos ); | ||
134 | |||
135 | return nTotWrote; | ||
32 | } | 136 | } |
33 | 137 | ||
34 | void Bu::Buffer::flush() | 138 | void Bu::Buffer::flush() |
35 | { | 139 | { |
140 | if( iWriteBufFill > 0 ) | ||
141 | { | ||
142 | printf("Buffer: Flushing remaining data, %db.\n", iWriteBufFill ); | ||
143 | int iWr = 0; | ||
144 | do | ||
145 | { | ||
146 | iWr = rNext.write( sWriteBuf+iWritePos, iWriteBufFill ); | ||
147 | printf("Buffer: %db written to stream.\n", iWr ); | ||
148 | iWritePos += iWr; | ||
149 | iWriteBufFill -= iWr; | ||
150 | } while( iWriteBufFill > 0 && iWr > 0 ); | ||
151 | } | ||
36 | } | 152 | } |
37 | 153 | ||
diff --git a/src/buffer.h b/src/buffer.h index beb4b08..a18be11 100644 --- a/src/buffer.h +++ b/src/buffer.h | |||
@@ -1,3 +1,10 @@ | |||
1 | /* | ||
2 | * Copyright (C) 2007-2008 Xagasoft, All rights reserved. | ||
3 | * | ||
4 | * This file is part of the libbu++ library and is released under the | ||
5 | * terms of the license contained in the file LICENSE. | ||
6 | */ | ||
7 | |||
1 | #ifndef BU_BUFFER_H | 8 | #ifndef BU_BUFFER_H |
2 | #define BU_BUFFER_H | 9 | #define BU_BUFFER_H |
3 | 10 | ||
@@ -18,15 +25,23 @@ namespace Bu | |||
18 | virtual size_t write( const void *pBuf, size_t nBytes ); | 25 | virtual size_t write( const void *pBuf, size_t nBytes ); |
19 | using Stream::write; | 26 | using Stream::write; |
20 | 27 | ||
28 | size_t getReadFill() { return iReadBufFill; } | ||
29 | bool isWritePending() { return iWriteBufFill > 0; } | ||
30 | |||
21 | virtual void flush(); | 31 | virtual void flush(); |
22 | 32 | ||
23 | private: | 33 | private: |
34 | void fillReadBuf(); | ||
35 | |||
36 | private: | ||
24 | size_t sSoFar; | 37 | size_t sSoFar; |
25 | int iBufSize; | 38 | int iBufSize; |
26 | char *sReadBuf; | 39 | char *sReadBuf; |
27 | char *sWriteBuf; | 40 | char *sWriteBuf; |
28 | int iReadBufFill; | 41 | int iReadBufFill; |
42 | int iReadPos; | ||
29 | int iWriteBufFill; | 43 | int iWriteBufFill; |
44 | int iWritePos; | ||
30 | }; | 45 | }; |
31 | }; | 46 | }; |
32 | 47 | ||
diff --git a/src/bzip2.cpp b/src/bzip2.cpp index 10cfe8a..0a56f83 100644 --- a/src/bzip2.cpp +++ b/src/bzip2.cpp | |||
@@ -200,7 +200,7 @@ size_t Bu::BZip2::write( const void *pData, size_t nBytes ) | |||
200 | break; | 200 | break; |
201 | } | 201 | } |
202 | 202 | ||
203 | return sTotalOut; | 203 | return nBytes; |
204 | } | 204 | } |
205 | 205 | ||
206 | bool Bu::BZip2::isOpen() | 206 | bool Bu::BZip2::isOpen() |
diff --git a/src/tests/buffer.cpp b/src/tests/buffer.cpp new file mode 100644 index 0000000..a1a1105 --- /dev/null +++ b/src/tests/buffer.cpp | |||
@@ -0,0 +1,38 @@ | |||
1 | #include "bu/membuf.h" | ||
2 | #include "bu/buffer.h" | ||
3 | #include "bu/file.h" | ||
4 | |||
5 | using namespace Bu; | ||
6 | |||
7 | int main( int argc, char *argv[] ) | ||
8 | { | ||
9 | argc--,argv++; | ||
10 | if( argc == 0 ) | ||
11 | { | ||
12 | MemBuf mOut; | ||
13 | Buffer bOut( mOut, 10 ); | ||
14 | |||
15 | for( int j = 0; j < 4; j++ ) | ||
16 | bOut.write("hi ", 3 ); | ||
17 | |||
18 | printf("Preflush: \"%s\"\n", mOut.getString().getStr() ); | ||
19 | bOut.flush(); | ||
20 | |||
21 | printf("Final: \"%s\"\n", mOut.getString().getStr() ); | ||
22 | } | ||
23 | else | ||
24 | { | ||
25 | File fIn( *argv, File::Read ); | ||
26 | Buffer bIn( fIn, 10 ); | ||
27 | |||
28 | char buf[5]; | ||
29 | for( int j = 0; j < 5; j++ ) | ||
30 | { | ||
31 | buf[bIn.read( buf, 4 )] = '\0'; | ||
32 | printf("Four chars: \"%s\"\n", buf ); | ||
33 | } | ||
34 | } | ||
35 | |||
36 | return 0; | ||
37 | } | ||
38 | |||