00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027 #include <assert.h>
00028 #include <stdlib.h>
00029 #include <memory.h>
00030 #include "kapi_bv.h"
00031 #pragma warning( disable : 4101 )
00032
00033
00034 void
00035 bvResize( bv_t *pbv, int iNewBitLength, int fOn )
00036 {
00037 int bitstoset, newlen32, i, oldlen32;
00038 uint32_t val;
00039 bv32_t bv32;
00040
00041
00042
00043 oldlen32 = pbv->n32Chunks;
00044 newlen32 = u32ALLOCATED( iNewBitLength );
00045
00046 if ( fOn ) {
00047 val = 0xFFFFFFFF;
00048 } else {
00049 val = 0;
00050 }
00051
00052 if ( newlen32 > oldlen32 ) {
00053 pbv->pint32Data = (uint32_t *)realloc(
00054 pbv->pint32Data, sizeof( uint32_t ) * newlen32 );
00055 pbv->n32Chunks = newlen32;
00056
00057
00058 for ( i=oldlen32; i<newlen32; i++ ) {
00059 pbv->pint32Data[ i ] = val;
00060 }
00061 }
00062
00063
00064
00065
00066 for ( i=newlen32; i<oldlen32; i++ ) {
00067 pbv->pint32Data[ i ] = val;
00068 }
00069
00070
00071 bitstoset = 32 - (iNewBitLength & 0x1F);
00072 if ( bitstoset == 32 ) {
00073 return;
00074 }
00075
00076
00077 bv32 = ~(( 1 << (32-bitstoset)) - 1);
00078
00079 if ( fOn ) {
00080 pbv->pint32Data[ newlen32-1 ] = pbv->pint32Data[ newlen32-1 ] | bv32;
00081 } else {
00082 pbv->pint32Data[ newlen32-1 ] = pbv->pint32Data[ newlen32-1 ] & ~bv32;
00083 }
00084 }
00085
00086 int
00087 fEqual_bv( bv_t *pbv1, bv_t *pbv2 )
00088 {
00089 int i, nChunks;
00090 bv_t *pbvLonger;
00091
00092
00093 if ( pbv1->n32Chunks < pbv2->n32Chunks ) {
00094 nChunks = pbv1->n32Chunks;
00095 pbvLonger = pbv1;
00096 } else {
00097 nChunks = pbv2->n32Chunks;
00098 pbvLonger = pbv2;
00099 }
00100
00101
00102 for ( i=0; i<nChunks; i++ ) {
00103 if ( pbv1->pint32Data[ i ] != pbv2->pint32Data[ i ] ) {
00104 return( 0 );
00105 }
00106 }
00107
00108 return 1;
00109 }
00110
00111 bv_t *
00112 pbvDup( bv_t *pbv )
00113 {
00114 int len, i;
00115 bv_t *pbvNew;
00116
00117
00118 pbvNew = (bv_t *)malloc( sizeof(bv_t) );
00119 pbvNew->n32Chunks = pbv->n32Chunks;
00120 pbvNew->pint32Data = (uint32_t *)malloc( sizeof( uint32_t )
00121 * pbv->n32Chunks );
00122 assert( pbvNew );
00123
00124 memcpy( pbvNew->pint32Data, pbv->pint32Data, BYTE_LENGTHbv(pbv) );
00125 pbvNew->n32Chunks = pbv->n32Chunks;
00126
00127 return( pbvNew );
00128 }
00129
00130 void
00131 bvInit( bv_t *pbv, int iLength, int fOn )
00132 {
00133 int len, i;
00134 uint32_t ival;
00135
00136
00137 assert( iLength >= 0 );
00138
00139 len = u32ALLOCATED( iLength );
00140
00141 pbv->pint32Data = (uint32_t *)malloc( sizeof( uint32_t ) * len );
00142 assert( pbv->pint32Data );
00143 pbv->n32Chunks = len;
00144
00145 if ( fOn ) {
00146 ival = 0xFFFFFFFF;
00147 } else {
00148 ival = 0x0;
00149 }
00150
00151 for ( i=0; i<len; i++ ) {
00152 pbv->pint32Data[ i ] = ival;
00153 }
00154 }
00155
00156 void
00157 Free_pbv( bv_t *pbv )
00158 {
00159 if ( NULL == pbv ) {
00160 return;
00161 }
00162
00163 if ( pbv->pint32Data ) {
00164 free( pbv->pint32Data );
00165 pbv->pint32Data = NULL;
00166 }
00167
00168 free( pbv );
00169 }
00170
00171 bv_t *
00172 pbvMake( int iLength, int fOn )
00173 {
00174 int len, i;
00175 uint32_t ival;
00176 bv_t *pbv;
00177
00178
00179 assert( iLength > 0 );
00180
00181 len = u32ALLOCATED( iLength );
00182
00183 pbv = (bv_t *) malloc( sizeof( bv_t ) );
00184 assert( pbv );
00185
00186 pbv->pint32Data = (uint32_t *)malloc( sizeof( uint32_t ) * len );
00187 assert( pbv->pint32Data );
00188 pbv->n32Chunks = len;
00189
00190 if ( fOn ) {
00191 ival = 0xFFFFFFFF;
00192 } else {
00193 ival = 0x0;
00194 }
00195
00196 for ( i=0; i<len; i++ ) {
00197 pbv->pint32Data[ i ] = ival;
00198 }
00199
00200 return( pbv );
00201 }
00202
00203 bv_t *
00204 pbvOr( bv_t *pbvTarget, bv_t *pbvSrc1, bv_t *pbvSrc2 )
00205 {
00206 int i, len;
00207
00208 if ( pbvTarget->n32Chunks <= pbvSrc1->n32Chunks ) {
00209 len = pbvTarget->n32Chunks;
00210 } else {
00211 len = pbvSrc1->n32Chunks;
00212 }
00213
00214 if ( pbvSrc1->n32Chunks < len ) {
00215 len = pbvSrc1->n32Chunks;
00216 }
00217
00218 for ( i=0; i<len; i++ ) {
00219 pbvTarget->pint32Data[ i ] = pbvSrc1->pint32Data[ i ] | pbvSrc2->pint32Data[ i ];
00220 }
00221
00222 return( pbvTarget );
00223 }
00224
00225 bv_t *
00226 pbvAnd( bv_t *pbvTarget, bv_t *pbvSrc1, bv_t *pbvSrc2 )
00227 {
00228 int i, len;
00229
00230 if ( pbvTarget->n32Chunks <= pbvSrc1->n32Chunks ) {
00231 len = pbvTarget->n32Chunks;
00232 } else {
00233 len = pbvSrc1->n32Chunks;
00234 }
00235
00236 if ( pbvSrc1->n32Chunks < len ) {
00237 len = pbvSrc1->n32Chunks;
00238 }
00239
00240 for ( i=0; i<len; i++ ) {
00241 pbvTarget->pint32Data[ i ] = pbvSrc1->pint32Data[ i ] & pbvSrc2->pint32Data[ i ];
00242 }
00243 return( pbvTarget );
00244 }
00245
00246 bv_t *
00247 pbvXor( bv_t *pbvTarget, bv_t *pbvSrc1, bv_t *pbvSrc2 )
00248 {
00249 int i, len;
00250
00251 if ( pbvTarget->n32Chunks <= pbvSrc1->n32Chunks ) {
00252 len = pbvTarget->n32Chunks;
00253 } else {
00254 len = pbvSrc1->n32Chunks;
00255 }
00256
00257 if ( pbvSrc1->n32Chunks < len ) {
00258 len = pbvSrc1->n32Chunks;
00259 }
00260
00261
00262 for ( i=0; i<len; i++ ) {
00263 pbvTarget->pint32Data[ i ] = pbvSrc1->pint32Data[ i ] ^ pbvSrc2->pint32Data[ i ];
00264 }
00265 return( pbvTarget );
00266 }
00267
00268 void
00269 Printbv( FILE *fp, bv_t *pbv )
00270 {
00271 int b;
00272 int i;
00273 char *pchTemp;
00274
00275 pchTemp = (char *)malloc( sizeof( char ) * (1 + pbv->n32Chunks * 32) );
00276
00277 for ( i=0;i<pbv->n32Chunks * 32; i++ ) {
00278 b = ( 0 != isbvBITSET( pbv, i ) );
00279 pchTemp[ i ] = '0' + b;
00280 }
00281 pchTemp[ pbv->n32Chunks * 32 ] = '\0';
00282
00283 fprintf( fp, "%s", pchTemp );
00284 free( pchTemp );
00285 }
00286
00287 char *
00288 bv322pch( bv32_t bv32, char *pch )
00289 {
00290 int i, b, pos;
00291 uint32_t i32;
00292
00293 i32 = bv32;
00294 pos = 0;
00295 for ( i=0; i<32; i++ ) {
00296 b = i32 & 1;
00297 i32 >>= 1;
00298 pch[ pos ] = '0'+b;
00299 pos++;
00300 }
00301 pch[ pos ] = '\0';
00302
00303 return( pch );
00304 }
00305
00306 char *
00307 bv642pch( bv64_t bv64, char *pch )
00308 {
00309 int i, pos, b;
00310 uint32_t i32;
00311
00312 pos = 0;
00313 i32 = bv64.i1;
00314 for ( i=0; i<32; i++ ) {
00315 b = i32 & 1;
00316 i32 >>= 1;
00317 pch[ pos ] = '0'+b;
00318 pos++;
00319 }
00320
00321 i32 = bv64.i2;
00322 for ( i=0; i<32; i++ ) {
00323 b = i32 & 1;
00324 i32 >>= 1;
00325 pch[ pos ] = '0'+b;
00326 pos++;
00327 }
00328 pch[ pos ] = '\0';
00329
00330 return( pch );
00331 }
00332
00333 char *
00334 bv1282pch( bv128_t bv128, char *pch )
00335 {
00336 return 0;
00337 }
00338