@@ -57,6 +57,7 @@ void TSI_init(ToplevelStreamInfo* info)
5757
5858void TSI_destroy (ToplevelStreamInfo * info )
5959{
60+ fprintf (stderr , "TSI_destroy: %p\n" , info );
6061 if (info -> parent_object ){
6162 Py_DECREF (info -> parent_object );
6263 info -> parent_object = 0 ;
@@ -164,6 +165,12 @@ ull DC_rbound(const DeltaChunk* dc)
164165 return dc -> to + dc -> ts ;
165166}
166167
168+ inline
169+ void DC_print (const DeltaChunk * dc , const char * prefix )
170+ {
171+ fprintf (stderr , "%s-dc: to = %i, ts = %i, so = %i, data = %p\n" , prefix , (int )dc -> to , dc -> ts , dc -> so , dc -> data );
172+ }
173+
167174// Apply
168175inline
169176void DC_apply (const DeltaChunk * dc , const uchar * base , PyObject * writer , PyObject * tmpargs )
@@ -179,6 +186,8 @@ void DC_apply(const DeltaChunk* dc, const uchar* base, PyObject* writer, PyObjec
179186 assert (0 );
180187 }
181188
189+ DC_print (dc , "DC_apply" );
190+
182191 // tuple steals reference, and will take care about the deallocation
183192 PyObject_Call (writer , tmpargs , NULL );
184193
@@ -233,14 +242,14 @@ ushort DC_count_encode_bytes(const DeltaChunk* dc)
233242 ull so = dc -> so ;
234243
235244 // offset
236- c += so & 0x000000FF ;
237- c += so & 0x0000FF00 ;
238- c += so & 0x00FF0000 ;
239- c += so & 0xFF000000 ;
245+ c += ( so & 0x000000FF ) > 0 ;
246+ c += ( so & 0x0000FF00 ) > 0 ;
247+ c += ( so & 0x00FF0000 ) > 0 ;
248+ c += ( so & 0xFF000000 ) > 0 ;
240249
241250 // size - max size is 0x10000, its encoded with 0 size bits
242- c += ts & 0x000000FF ;
243- c += ts & 0x0000FF00 ;
251+ c += ( ts & 0x000000FF ) > 0 ;
252+ c += ( ts & 0x0000FF00 ) > 0 ;
244253
245254 return c ;
246255 }
@@ -413,7 +422,7 @@ void DIV_destroy(DeltaInfoVector* vec)
413422{
414423 if (vec -> mem ){
415424#ifdef DEBUG
416- fprintf (stderr , "Freeing %p\n" , (void * )vec -> mem );
425+ fprintf (stderr , "DIV_destroy: %p\n" , (void * )vec -> mem );
417426#endif
418427 PyMem_Free (vec -> mem );
419428 vec -> size = 0 ;
@@ -494,22 +503,20 @@ uint DIV_count_slice_bytes(const DeltaInfoVector* src, uint ofs, uint size)
494503 uint num_bytes = 0 ;
495504 DeltaInfo * cdi = DIV_closest_chunk (src , ofs );
496505
497-
498-
499506 DeltaChunk dc ;
500507 DC_init (& dc , 0 , 0 , 0 , NULL );
501508
502509 // partial overlap
503510 if (cdi -> to != ofs ) {
504511 const ull relofs = ofs - cdi -> to ;
505512 const uint cdisize = DIV_info_size (src , cdi );
506- const uint actual_size = cdisize - relofs < size ? cdisize - relofs : size ;
507- size -= actual_size ;
513+ const uint max_size = cdisize - relofs < size ? cdisize - relofs : size ;
514+ size -= max_size ;
508515
509516 // get the size in bytes the info would have
510517 next_delta_info (src -> dstream + cdi -> dso , & dc );
511518 dc .so += relofs ;
512- dc .ts = actual_size ;
519+ dc .ts = max_size ;
513520 num_bytes += DC_count_encode_bytes (& dc );
514521
515522 cdi += 1 ;
@@ -547,27 +554,32 @@ uint DIV_count_slice_bytes(const DeltaInfoVector* src, uint ofs, uint size)
547554inline
548555uint DIV_copy_slice_to (const DeltaInfoVector * src , uchar * dest , ull tofs , uint size )
549556{
557+ fprintf (stderr , "copy slice: ofs = %i, size = %i\n" , (int )tofs , size );
550558 assert (DIV_lbound (src ) <= tofs );
551- assert ((tofs + size ) <= DIV_last (src ) -> to + src -> di_last_size );
559+ assert ((tofs + size ) <= DIV_info_rbound (src , DIV_last ( src )) );
552560
553561 DeltaChunk dc ;
554562 DC_init (& dc , 0 , 0 , 0 , NULL );
555563
556564 DeltaInfo * cdi = DIV_closest_chunk (src , tofs );
557565 uint num_chunks = 0 ;
558566
567+ #ifdef DEBUG
568+ const uchar * deststart = dest ;
569+ #endif
570+
559571 // partial overlap
560572 if (cdi -> to != tofs ) {
561573 const uint relofs = tofs - cdi -> to ;
562574 next_delta_info (src -> dstream + cdi -> dso , & dc );
563575 const uint cdisize = dc .ts ;
564- const uint actual_size = cdisize - relofs < size ? cdisize - relofs : size ;
576+ const uint max_size = cdisize - relofs < size ? cdisize - relofs : size ;
565577
566- size -= actual_size ;
578+ size -= max_size ;
567579
568580 // adjust dc proportions
569581
570- DC_encode_to (& dc , & dest , relofs , actual_size );
582+ DC_encode_to (& dc , & dest , relofs , max_size );
571583
572584 num_chunks += 1 ;
573585 cdi += 1 ;
@@ -580,6 +592,7 @@ uint DIV_copy_slice_to(const DeltaInfoVector* src, uchar* dest, ull tofs, uint s
580592 const DeltaInfo * vecend = DIV_end (src );
581593 for ( ;cdi < vecend ; ++ cdi )
582594 {
595+ fprintf (stderr , "copy slice: cdi: to = %i, dso = %i\n" , (int )cdi -> to , (int )cdi -> dso );
583596 num_chunks += 1 ;
584597 next_delta_info (src -> dstream + cdi -> dso , & dc );
585598 if (dc .ts < size ) {
@@ -595,6 +608,10 @@ uint DIV_copy_slice_to(const DeltaInfoVector* src, uchar* dest, ull tofs, uint s
595608 }
596609 }
597610
611+ #ifdef DEBUG
612+ fprintf (stderr , "copy slice: Wrote %i bytes\n" , (int )(dest - deststart ));
613+ #endif
614+
598615 assert (size == 0 );
599616 return num_chunks ;
600617}
@@ -619,6 +636,7 @@ bool DIV_connect_with_base(ToplevelStreamInfo* tsi, DeltaInfoVector* div)
619636
620637 OffsetInfo * pofs = offset_array ;
621638 uint num_addbytes = 0 ;
639+ uint dofs = 0 ;
622640
623641 const uchar * data = TSI_first (tsi );
624642 const uchar * prev_data = data ;
@@ -627,16 +645,19 @@ bool DIV_connect_with_base(ToplevelStreamInfo* tsi, DeltaInfoVector* div)
627645 DeltaChunk dc ;
628646 DC_init (& dc , 0 , 0 , 0 , NULL );
629647
648+
630649 // OFFSET RUN
631650 for (;data < dend ; pofs ++ , prev_data = data )
632651 {
633-
634652 pofs -> bofs = num_addbytes ;
635- pofs -> dofs = (uint )(prev_data - data );
636-
637- // Data chunks don't need processing
638653 data = next_delta_info (data , & dc );
654+ pofs -> dofs = dofs ;
655+ dofs += (uint )(data - prev_data );
656+
657+ fprintf (stderr , "pofs->bofs = %i, ->dofs = %i\n" , pofs -> bofs , pofs -> dofs );
658+ DC_print (& dc , "count-run" );
639659
660+ // Data chunks don't need processing
640661 if (dc .data ){
641662 continue ;
642663 }
@@ -646,6 +667,8 @@ bool DIV_connect_with_base(ToplevelStreamInfo* tsi, DeltaInfoVector* div)
646667 num_addbytes += DIV_count_slice_bytes (div , dc .so , dc .ts ) - (data - prev_data );
647668 }
648669
670+ fprintf (stderr , "num_addbytes = %i\n" , num_addbytes );
671+ assert (DC_rbound (& dc ) == tsi -> target_size );
649672
650673
651674 // reserve enough memory to hold all the new chunks
@@ -655,6 +678,7 @@ bool DIV_connect_with_base(ToplevelStreamInfo* tsi, DeltaInfoVector* div)
655678 uchar * ds ; // pointer into the delta stream
656679 const uchar * nds ; // next pointer, used for size retrieving the size
657680 uint num_addchunks = 0 ; // total amount of chunks added
681+ DC_init (& dc , 0 , 0 , 0 , NULL );
658682
659683 // Insert slices, from the end to the beginning, which allows memcpy
660684 // to be used, with a little help of the offset array
@@ -682,6 +706,7 @@ bool DIV_connect_with_base(ToplevelStreamInfo* tsi, DeltaInfoVector* div)
682706 num_addchunks -= 1 ;
683707 }
684708
709+ fprintf (stderr , "num_addchunks = %i\n" , num_addchunks );
685710 tsi -> num_chunks += num_addchunks ;
686711
687712 PyMem_Free (offset_array );
@@ -860,6 +885,8 @@ const uchar* next_delta_info(const uchar* data, DeltaChunk* dc)
860885 dc -> data = data ;
861886 dc -> ts = cmd ;
862887 dc -> so = 0 ;
888+
889+ data += cmd ;
863890 } else {
864891 PyErr_SetString (PyExc_RuntimeError , "Encountered an unsupported delta cmd: 0" );
865892 return NULL ;
@@ -993,8 +1020,8 @@ static PyObject* connect_deltas(PyObject *self, PyObject *dstreams)
9931020 DIV_reserve_memory (& div , compute_chunk_count (data , dend , 0 ));
9941021
9951022 // parse command stream
996- DeltaChunk dc ;
9971023 DeltaInfo * di = 0 ; // temporary pointer
1024+ DeltaChunk dc ;
9981025 DC_init (& dc , 0 , 0 , 0 , NULL );
9991026
10001027 assert (data < dend );
@@ -1019,7 +1046,9 @@ static PyObject* connect_deltas(PyObject *self, PyObject *dstreams)
10191046 }
10201047
10211048 #ifdef DEBUG
1049+ fprintf (stderr , "------------ Stream %i --------\n " , (int )dsi );
10221050 fprintf (stderr , "Before Connect: tdsinfo->num_chunks = %i, tdsinfo->bytelen = %i\n" , (int )tdsinfo .num_chunks , (int )tdsinfo .tdslen );
1051+ fprintf (stderr , "div->num_chunks = %i, div->reserved_size = %i, div->bytelen=%i\n" , (int )div .size , (int )div .reserved_size , (int )dlen );
10231052 #endif
10241053
10251054 if (!DIV_connect_with_base (& tdsinfo , & div )){
@@ -1028,7 +1057,6 @@ static PyObject* connect_deltas(PyObject *self, PyObject *dstreams)
10281057
10291058 #ifdef DEBUG
10301059 fprintf (stderr , "after connect: tdsinfo->num_chunks = %i, tdsinfo->bytelen = %i\n" , (int )tdsinfo .num_chunks , (int )tdsinfo .tdslen );
1031- fprintf (stderr , "div->num_chunks = %i, div->reserved_size = %i, div->bytelen=%i\n" , (int )div .size , (int )div .reserved_size , (int )dlen );
10321060 #endif
10331061
10341062 // destroy members, but keep memory
0 commit comments