aboutsummaryrefslogtreecommitdiff
path: root/src/nids.cpp
diff options
context:
space:
mode:
authorMike Buland <eichlan@xagasoft.com>2008-10-01 16:46:32 +0000
committerMike Buland <eichlan@xagasoft.com>2008-10-01 16:46:32 +0000
commitd872f7e07c5367f251cf5ebb70a03916251f5306 (patch)
tree2140986825705e4b6bf35eba8dd556be772888ff /src/nids.cpp
parent467c255511749f018c4572017c9e0e87275524ac (diff)
downloadlibbu++-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.cpp106
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
8namespace Bu
9{
10 subExceptionDef( NidsException )
11}
12
6Bu::Nids::Nids( Bu::Stream &sStore ) : 13Bu::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
30Bu::Nids::~Nids() 43Bu::Nids::~Nids()
31{ 44{
32} 45}
33 46
47void 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
34void Bu::Nids::initialize( int iBlockSize, int iPreAllocate ) 58void 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
75int Bu::Nids::createStream( int iPreAllocate ) 102uint32_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
90void Bu::Nids::deleteStream( int iID ) 121int Bu::Nids::createStream( int iPreAllocate )
122{
123 return createBlock( blockUnused, blockUnused, iPreAllocate );
124}
125
126void Bu::Nids::deleteStream( int /*iID*/ )
91{ 127{
92} 128}
93 129
94Bu::NidsStream Bu::Nids::openStream( int iID ) 130Bu::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
99void Bu::Nids::extendStream( int iID, int iBlockCount ) 139int Bu::Nids::getBlockSize()
100{ 140{
141 return iBlockSize;
101} 142}
143/*
144void Bu::Nids::extendStream( int iID, int iBlockCount )
145{
146}*/
102 147
103void Bu::Nids::getBlock( int iIndex, Bu::Nids::Block *pBlock ) 148void 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
109void Bu::Nids::setBlock( int iIndex, Bu::Nids::Block *pBlock ) 154void 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
160void 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
166uint32_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
185Bu::Nids::Block *Bu::Nids::newBlock()
186{
187 return (Block *)new char[iBlockSize];
188}
189
190void Bu::Nids::deleteBlock( Block *pBlock )
191{
192 delete[] (char *)pBlock;
193}
194