diff options
author | Mike Buland <eichlan@xagasoft.com> | 2008-10-01 16:46:32 +0000 |
---|---|---|
committer | Mike Buland <eichlan@xagasoft.com> | 2008-10-01 16:46:32 +0000 |
commit | d872f7e07c5367f251cf5ebb70a03916251f5306 (patch) | |
tree | 2140986825705e4b6bf35eba8dd556be772888ff /src/nids.cpp | |
parent | 467c255511749f018c4572017c9e0e87275524ac (diff) | |
download | libbu++-d872f7e07c5367f251cf5ebb70a03916251f5306.tar.gz libbu++-d872f7e07c5367f251cf5ebb70a03916251f5306.tar.bz2 libbu++-d872f7e07c5367f251cf5ebb70a03916251f5306.tar.xz libbu++-d872f7e07c5367f251cf5ebb70a03916251f5306.zip |
Ok, NIDS is getting better and better, and I went ahead and cleaned up some
exception related code that's been annoying me. You should no longer have to
include any exception header explicitly for normal operations, every class that
has it's own exception to throw defines it in it's own headers.
This may break some code that uses libbu++, but it's an easy fix, just delete
the include for exceptions.h. Sometime soon I would also like to move from
Bu::ExceptionBase to Bu::Exception, but that will affect a lot more code than
this change did.
Diffstat (limited to 'src/nids.cpp')
-rw-r--r-- | src/nids.cpp | 106 |
1 files changed, 93 insertions, 13 deletions
diff --git a/src/nids.cpp b/src/nids.cpp index 41c4dc1..d0cb843 100644 --- a/src/nids.cpp +++ b/src/nids.cpp | |||
@@ -3,9 +3,20 @@ | |||
3 | #include "bu/nidsstream.h" | 3 | #include "bu/nidsstream.h" |
4 | #include <stdio.h> | 4 | #include <stdio.h> |
5 | 5 | ||
6 | #define NIDS_MAGIC_CODE "\xFF\xC3\x99\xBD" | ||
7 | |||
8 | namespace Bu | ||
9 | { | ||
10 | subExceptionDef( NidsException ) | ||
11 | } | ||
12 | |||
6 | Bu::Nids::Nids( Bu::Stream &sStore ) : | 13 | Bu::Nids::Nids( Bu::Stream &sStore ) : |
7 | sStore( sStore ) | 14 | sStore( sStore ), |
15 | iBlockSize( 0 ), | ||
16 | iBlocks( 0 ), | ||
17 | iBlockStart( -1 ) | ||
8 | { | 18 | { |
19 | printf("blockUnused = %u\n", blockUnused ); | ||
9 | printf("Stream caps:\n" | 20 | printf("Stream caps:\n" |
10 | " canRead: %s\n" | 21 | " canRead: %s\n" |
11 | " canWrite: %s\n" | 22 | " canWrite: %s\n" |
@@ -25,19 +36,32 @@ Bu::Nids::Nids( Bu::Stream &sStore ) : | |||
25 | sStore.isOpen()?"yes":"no" | 36 | sStore.isOpen()?"yes":"no" |
26 | ); | 37 | ); |
27 | printf("sizeof(Block) = %db\n", sizeof(Block) ); | 38 | printf("sizeof(Block) = %db\n", sizeof(Block) ); |
39 | |||
40 | |||
28 | } | 41 | } |
29 | 42 | ||
30 | Bu::Nids::~Nids() | 43 | Bu::Nids::~Nids() |
31 | { | 44 | { |
32 | } | 45 | } |
33 | 46 | ||
47 | void Bu::Nids::initialize() | ||
48 | { | ||
49 | char buf[4]; | ||
50 | sStore.read( buf, 4 ); | ||
51 | if( memcmp( buf, NIDS_MAGIC_CODE, 4 ) ) | ||
52 | { | ||
53 | throw NidsException( | ||
54 | "Stream does not appear to be a valid NIDS format."); | ||
55 | } | ||
56 | } | ||
57 | |||
34 | void Bu::Nids::initialize( int iBlockSize, int iPreAllocate ) | 58 | void Bu::Nids::initialize( int iBlockSize, int iPreAllocate ) |
35 | { | 59 | { |
36 | char cBuf = 0; | 60 | char cBuf = 0; |
37 | int iBuf = 0; | 61 | int iBuf = 0; |
38 | 62 | ||
39 | // Magic number | 63 | // Magic number |
40 | sStore.write( "\xFF\xC3\x99\xBD", 4 ); | 64 | sStore.write( NIDS_MAGIC_CODE, 4 ); |
41 | 65 | ||
42 | // Version (0) | 66 | // Version (0) |
43 | sStore.write( &cBuf, 1 ); | 67 | sStore.write( &cBuf, 1 ); |
@@ -59,56 +83,112 @@ void Bu::Nids::initialize( int iBlockSize, int iPreAllocate ) | |||
59 | this->iBlockSize = iBlockSize; | 83 | this->iBlockSize = iBlockSize; |
60 | this->iBlocks = iPreAllocate; | 84 | this->iBlocks = iPreAllocate; |
61 | this->iBlockStart = sStore.tell(); | 85 | this->iBlockStart = sStore.tell(); |
86 | printf("iBlockStart = %d\n", this->iBlockStart ); | ||
62 | bsBlockUsed.setSize( iPreAllocate, true ); | 87 | bsBlockUsed.setSize( iPreAllocate, true ); |
63 | 88 | ||
64 | printf("%d blocks, %db each, %db block offset\n", | 89 | printf("%d blocks, %db each, %db block offset\n", |
65 | iBlocks, iBlockSize, iBlockStart ); | 90 | iBlocks, iBlockSize, iBlockStart ); |
66 | 91 | ||
67 | char *block = new char[iBlockSize]; | 92 | Block *block = (Block *)new char[iBlockSize]; |
68 | memset( block, 0, iBlockSize ); | 93 | memset( block, 0, iBlockSize ); |
94 | block->uFirstBlock = block->uNextBlock = block->uPrevBlock = blockUnused; | ||
69 | for( int j = 0; j < iPreAllocate; j++ ) | 95 | for( int j = 0; j < iPreAllocate; j++ ) |
70 | { | 96 | { |
71 | sStore.write( block, iBlockSize ); | 97 | sStore.write( block, iBlockSize ); |
72 | } | 98 | } |
99 | delete[] (char *)block; | ||
73 | } | 100 | } |
74 | 101 | ||
75 | int Bu::Nids::createStream( int iPreAllocate ) | 102 | uint32_t Bu::Nids::createBlock( uint32_t uFirstBlock, uint32_t uPrevBlock, |
103 | int /*iPreAllocate*/ ) | ||
76 | { | 104 | { |
77 | for( int j = 0; j < iBlocks; j++ ) | 105 | for( int j = 0; j < iBlocks; j++ ) |
78 | { | 106 | { |
79 | if( !bsBlockUsed.getBit( j ) ) | 107 | if( !bsBlockUsed.getBit( j ) ) |
80 | { | 108 | { |
81 | Block b = { j, blockUnused, blockUnused, 0, 0 }; | 109 | Block b = { j, blockUnused, uPrevBlock, 0, 0, { } }; |
110 | if( uFirstBlock != blockUnused ) | ||
111 | b.uFirstBlock = uFirstBlock; | ||
82 | bsBlockUsed.setBit( j ); | 112 | bsBlockUsed.setBit( j ); |
83 | sStore.setPos( iBlockStart+(iBlockSize*j) ); | 113 | sStore.setPos( iBlockStart+(iBlockSize*j) ); |
84 | sStore.write( &b, sizeof(b) ); | 114 | sStore.write( &b, sizeof(b) ); |
115 | return j; | ||
85 | } | 116 | } |
86 | } | 117 | } |
87 | return 0; | 118 | return blockUnused; |
88 | } | 119 | } |
89 | 120 | ||
90 | void Bu::Nids::deleteStream( int iID ) | 121 | int Bu::Nids::createStream( int iPreAllocate ) |
122 | { | ||
123 | return createBlock( blockUnused, blockUnused, iPreAllocate ); | ||
124 | } | ||
125 | |||
126 | void Bu::Nids::deleteStream( int /*iID*/ ) | ||
91 | { | 127 | { |
92 | } | 128 | } |
93 | 129 | ||
94 | Bu::NidsStream Bu::Nids::openStream( int iID ) | 130 | Bu::NidsStream Bu::Nids::openStream( int iID ) |
95 | { | 131 | { |
96 | return NidsStream( *this ); | 132 | if( iBlockStart < 0 ) |
133 | { | ||
134 | initialize(); | ||
135 | } | ||
136 | return NidsStream( *this, iID ); | ||
97 | } | 137 | } |
98 | 138 | ||
99 | void Bu::Nids::extendStream( int iID, int iBlockCount ) | 139 | int Bu::Nids::getBlockSize() |
100 | { | 140 | { |
141 | return iBlockSize; | ||
101 | } | 142 | } |
143 | /* | ||
144 | void Bu::Nids::extendStream( int iID, int iBlockCount ) | ||
145 | { | ||
146 | }*/ | ||
102 | 147 | ||
103 | void Bu::Nids::getBlock( int iIndex, Bu::Nids::Block *pBlock ) | 148 | void Bu::Nids::getBlock( uint32_t uIndex, Bu::Nids::Block *pBlock ) |
104 | { | 149 | { |
105 | sStore.setPos( iBlockStart + (iBlockSize*iIndex) ); | 150 | sStore.setPos( iBlockStart + (iBlockSize*uIndex) ); |
106 | sStore.read( pBlock, iBlockSize ); | 151 | sStore.read( pBlock, iBlockSize ); |
107 | } | 152 | } |
108 | 153 | ||
109 | void Bu::Nids::setBlock( int iIndex, Bu::Nids::Block *pBlock ) | 154 | void Bu::Nids::setBlock( uint32_t uIndex, Bu::Nids::Block *pBlock ) |
110 | { | 155 | { |
111 | sStore.setPos( iBlockStart + (iBlockSize*iIndex) ); | 156 | sStore.setPos( iBlockStart + (iBlockSize*uIndex) ); |
112 | sStore.write( pBlock, iBlockSize ); | 157 | sStore.write( pBlock, iBlockSize ); |
113 | } | 158 | } |
114 | 159 | ||
160 | void Bu::Nids::updateStreamSize( uint32_t uIndex, uint32_t uSize ) | ||
161 | { | ||
162 | sStore.setPos( iBlockStart + (iBlockSize*uIndex)+4*3 ); | ||
163 | sStore.write( &uSize, 4 ); | ||
164 | } | ||
165 | |||
166 | uint32_t Bu::Nids::getNextBlock( uint32_t uIndex, | ||
167 | struct Bu::Nids::Block *pBlock ) | ||
168 | { | ||
169 | uint32_t uNew; | ||
170 | if( pBlock->uNextBlock == blockUnused ) | ||
171 | { | ||
172 | uNew = createBlock( pBlock->uFirstBlock, uIndex ); | ||
173 | sStore.setPos( iBlockStart + (iBlockSize*uIndex)+1*4 ); | ||
174 | sStore.write( &uNew, 4 ); | ||
175 | getBlock( uNew, pBlock ); | ||
176 | } | ||
177 | else | ||
178 | { | ||
179 | uNew = pBlock->uNextBlock; | ||
180 | getBlock( pBlock->uNextBlock, pBlock ); | ||
181 | } | ||
182 | return uNew; | ||
183 | } | ||
184 | |||
185 | Bu::Nids::Block *Bu::Nids::newBlock() | ||
186 | { | ||
187 | return (Block *)new char[iBlockSize]; | ||
188 | } | ||
189 | |||
190 | void Bu::Nids::deleteBlock( Block *pBlock ) | ||
191 | { | ||
192 | delete[] (char *)pBlock; | ||
193 | } | ||
194 | |||