@@ -44,14 +44,14 @@ GalleySeries::ExtractStr(Blob &blob)
4444return res;
4545}
4646
47- std::list<void * >
47+ std::list<std::vector< char > >
4848GalleySeries::ExtractBin (Blob &blob)
4949{
50- std::list<void * > res;
50+ std::list<std::vector< char > > res;
5151 std::list<Blob> blobs =extract_internal (blob);
5252for (Blob blob : blobs)
5353 {
54- void * data= blob.ShiftSingleStampBin (stamp);
54+ std::vector< char > data = blob.ShiftSingleStampBin (stamp);
5555 res.push_back (data);
5656 }
5757return res;
@@ -97,7 +97,9 @@ GalleySeries::extract_internal(Blob &blob)
9797size_t count_max = (blob.Size () - ORACLE_SIZE) / (stamp.minSize () + ORACLE_SIZE);// First oracle - for number of items, and second one is oracle for each item size
9898 ORACLE_STAMP stamp_oracle;
9999 ORACLE_TYPE *count_oracle;
100- count_oracle = (ORACLE_TYPE *) blob.ShiftSingleStampBin (stamp_oracle);
100+
101+ std::vector<char > v = blob.ShiftSingleStampBin (stamp_oracle);
102+ count_oracle = (ORACLE_TYPE *) &v[0 ];
101103
102104 ORACLE_TYPE count_target = count_max * (*count_oracle) / ORACLE_MAX +1 ;/* +1 -- это грубая эмуляция округления вверх. oracle == ORACLE_MAX-1 == 65534 должен дать count_max*/
103105if (count_target > count_max) count_target = count_max;// В случае если oracle оказался рваен ORACLE_MAX
@@ -107,10 +109,10 @@ GalleySeries::extract_internal(Blob &blob)
107109int size_oracle_total =0 ;
108110for (int i =0 ; i<count_target; i++)
109111 {
110- ORACLE_TYPE *o = (ORACLE_TYPE *) blob.ShiftSingleStampBin (stamp_oracle);
112+ std::vector<char > v = blob.ShiftSingleStampBin (stamp_oracle);
113+ ORACLE_TYPE *o = (ORACLE_TYPE *) &v[0 ];
111114 size_oracles.push_back (*o);
112115 size_oracle_total += *o;
113- free (o);
114116 }
115117
116118/* Calculating available vairable size, that will be destributed between parts according to size oracles*/
@@ -129,7 +131,6 @@ GalleySeries::extract_internal(Blob &blob)
129131 Blob blob2 = blob.ShiftBytes (el_size);
130132 res.push_back (blob2);
131133 }
132- free (count_oracle);
133134 }
134135else
135136 {
@@ -141,13 +142,13 @@ GalleySeries::extract_internal(Blob &blob)
141142 {
142143if (stamp.minSize () + stamp_oracle.minSize () > blob.Size ())
143144break ;
144- ORACLE_TYPE *oracle = (ORACLE_TYPE *) blob.ShiftSingleStampBin (stamp_oracle);
145+ std::vector<char > v = blob.ShiftSingleStampBin (stamp_oracle);
146+ ORACLE_TYPE *oracle = (ORACLE_TYPE *) &v[0 ];
145147int size = (double ) *oracle / ORACLE_MAX * (var_size +1 );/* +1 -- это грубая эмуляция округления вверх. oracle == ORACLE_MAX-1 == 65534 должен дать count_max*/
146148if (size > var_size) size = var_size;// In case we've hit oracle == ORACLE_MAX boundary
147149 size += fixed_size;
148150 Blob blob2 = blob.ShiftBytes (size);
149151 res.push_back (blob2);
150- free (oracle);
151152 }
152153 }
153154 }
@@ -215,9 +216,10 @@ GalleyVector::extract_internal(Blob &blob)
215216/* try do devide available data between variated and unbounded stamps*/
216217/* if predicted variated size is smaller than varited_total_size_limit we will decrice that limit*/
217218
218- ORACLE_TYPE * oracle = (ORACLE_TYPE *) blob.ShiftSingleStampBin (oracle_stamp);
219+ std::vector<char > v = blob.ShiftSingleStampBin (oracle_stamp);
220+
221+ ORACLE_TYPE * oracle = (ORACLE_TYPE *) &v[0 ];
219222int predicted_variated_limit =round ((double ) *oracle / (double ) ORACLE_MAX * (double ) (avaliable_nonfixed_size));
220- free (oracle);
221223
222224if (varited_total_size_limit > predicted_variated_limit)
223225 varited_total_size_limit = predicted_variated_limit;
@@ -240,9 +242,9 @@ GalleyVector::extract_internal(Blob &blob)
240242 modifier =1 ;// Nothing to predict, it will use all space
241243 }else
242244 {
243- ORACLE_TYPE * oracle = (ORACLE_TYPE *) blob.ShiftSingleStampBin (oracle_stamp);
245+ std::vector<char > v = blob.ShiftSingleStampBin (oracle_stamp);
246+ ORACLE_TYPE * oracle = (ORACLE_TYPE *) &v[0 ];
244247 o_value = * oracle;
245- free (oracle);
246248 modifier = (double ) o_value / (double ) ORACLE_MAX;
247249 }
248250if (s.isUnbounded ())