void md2line(struct md_container* md,struct db_line* line) { error(255,"md2line \n"); #ifdef _PARAMETER_CHECK_ if (md==NULL||line==NULL) { return RETFAIL; } #endif #define copyhash(a,b,c) \ if (line->attr&a) { \ error(255,"Line has %llu\n",a); \ if (md->calc_attr&a) { \ error(255,"copying %llu\n",a); \ line->b=(byte*)malloc(c); \ memcpy(line->b,md->b,c); \ } else { \ line->attr&=~a; \ } \ } copyhash(DB_MD5,md5,HASH_MD5_LEN); copyhash(DB_SHA1,sha1,HASH_SHA1_LEN); copyhash(DB_RMD160,rmd160,HASH_RMD160_LEN); copyhash(DB_TIGER,tiger,HASH_TIGER_LEN); copyhash(DB_CRC32,crc32,HASH_CRC32_LEN); copyhash(DB_HAVAL,haval,HASH_HAVAL_LEN); copyhash(DB_GOST,gost,HASH_GOST_LEN); copyhash(DB_CRC32B,crc32b,HASH_CRC32B_LEN); copyhash(DB_SHA256,sha256,HASH_SHA256_LEN); copyhash(DB_SHA512,sha512,HASH_SHA512_LEN); copyhash(DB_WHIRLPOOL,whirlpool,HASH_WHIRLPOOL_LEN); }
item_t* dichosolve(int size1, item_t* first, int size2, item_t* second, knint cons, int* rezsize) { if( size1 == -1 && size2 == -1 ){ *rezsize = -1; return NULL; } if ( size1 == -1 ) { *rezsize = size2; return copyhash (second); } if ( size2 == -1 ) { *rezsize = size1; return copyhash (first); } //item_t *its = createitems0 (cons), *fp, *sp; item_t *its = NULL, *fp, *sp, *tmp; knint w, p; int cnt = 0; // real count of @its knint *wp, *pp; // put all elements of first table for ( fp = first ; fp != NULL && *(fp->w) <= cons ; fp = fp->hh.next ) { cnt++; sp = copyitem (fp); HASH_ADD_KEYPTR ( hh, its, sp->w, KNINT_SIZE, sp ); } // put new elements of second table or replace elements having less value for( fp = second ; fp!= NULL && *(fp->w) <= cons ; fp = fp->hh.next ) { HASH_FIND (hh, its, fp->w, KNINT_SIZE, tmp); if( tmp == NULL ){ cnt++; tmp = copyitem (fp); HASH_ADD_KEYPTR (hh, its, tmp->w, KNINT_SIZE, tmp); } else { *(tmp->p) = MAXINT ( *(fp->p) , *(tmp->p) ); } } // pairwise addition for( fp = first ; fp != NULL ; fp = fp->hh.next ){ for( sp = second ; sp != NULL && (p = *(fp->p) + *(sp->p),w = *(fp->w) + *(sp->w), w<=cons) ; sp = sp->hh.next ){ HASH_FIND (hh, its, &w, KNINT_SIZE, tmp); if( tmp == NULL ){ cnt++; tmp = copyitem ( sp ); *(tmp->w) = w; *(tmp->p) = p; HASH_ADD_KEYPTR (hh, its, tmp->w, KNINT_SIZE, tmp); } else { *(tmp->p) = MAXINT( *(tmp->p),p ); } } } // save non-zero elements in solid array if( cnt == 0 ){ *rezsize = -1; return NULL; } *rezsize = cnt; return its; }