]> CyberLeo.Net >> Repos - FreeBSD/FreeBSD.git/blob - sys/contrib/zstd/lib/compress/fse_compress.c
Upgrade Unbound to 1.7.0. More to follow.
[FreeBSD/FreeBSD.git] / sys / contrib / zstd / lib / compress / fse_compress.c
1 /* ******************************************************************
2    FSE : Finite State Entropy encoder
3    Copyright (C) 2013-2015, Yann Collet.
4
5    BSD 2-Clause License (http://www.opensource.org/licenses/bsd-license.php)
6
7    Redistribution and use in source and binary forms, with or without
8    modification, are permitted provided that the following conditions are
9    met:
10
11        * Redistributions of source code must retain the above copyright
12    notice, this list of conditions and the following disclaimer.
13        * Redistributions in binary form must reproduce the above
14    copyright notice, this list of conditions and the following disclaimer
15    in the documentation and/or other materials provided with the
16    distribution.
17
18    THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
19    "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
20    LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
21    A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
22    OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
23    SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
24    LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
25    DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
26    THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
27    (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
28    OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
29
30     You can contact the author at :
31     - FSE source repository : https://github.com/Cyan4973/FiniteStateEntropy
32     - Public forum : https://groups.google.com/forum/#!forum/lz4c
33 ****************************************************************** */
34
35 /* **************************************************************
36 *  Includes
37 ****************************************************************/
38 #include <stdlib.h>     /* malloc, free, qsort */
39 #include <string.h>     /* memcpy, memset */
40 #include <stdio.h>      /* printf (debug) */
41 #include "bitstream.h"
42 #include "compiler.h"
43 #define FSE_STATIC_LINKING_ONLY
44 #include "fse.h"
45 #include "error_private.h"
46
47
48 /* **************************************************************
49 *  Error Management
50 ****************************************************************/
51 #define FSE_isError ERR_isError
52 #define FSE_STATIC_ASSERT(c) { enum { FSE_static_assert = 1/(int)(!!(c)) }; }   /* use only *after* variable declarations */
53
54
55 /* **************************************************************
56 *  Templates
57 ****************************************************************/
58 /*
59   designed to be included
60   for type-specific functions (template emulation in C)
61   Objective is to write these functions only once, for improved maintenance
62 */
63
64 /* safety checks */
65 #ifndef FSE_FUNCTION_EXTENSION
66 #  error "FSE_FUNCTION_EXTENSION must be defined"
67 #endif
68 #ifndef FSE_FUNCTION_TYPE
69 #  error "FSE_FUNCTION_TYPE must be defined"
70 #endif
71
72 /* Function names */
73 #define FSE_CAT(X,Y) X##Y
74 #define FSE_FUNCTION_NAME(X,Y) FSE_CAT(X,Y)
75 #define FSE_TYPE_NAME(X,Y) FSE_CAT(X,Y)
76
77
78 /* Function templates */
79
80 /* FSE_buildCTable_wksp() :
81  * Same as FSE_buildCTable(), but using an externally allocated scratch buffer (`workSpace`).
82  * wkspSize should be sized to handle worst case situation, which is `1<<max_tableLog * sizeof(FSE_FUNCTION_TYPE)`
83  * workSpace must also be properly aligned with FSE_FUNCTION_TYPE requirements
84  */
85 size_t FSE_buildCTable_wksp(FSE_CTable* ct, const short* normalizedCounter, unsigned maxSymbolValue, unsigned tableLog, void* workSpace, size_t wkspSize)
86 {
87     U32 const tableSize = 1 << tableLog;
88     U32 const tableMask = tableSize - 1;
89     void* const ptr = ct;
90     U16* const tableU16 = ( (U16*) ptr) + 2;
91     void* const FSCT = ((U32*)ptr) + 1 /* header */ + (tableLog ? tableSize>>1 : 1) ;
92     FSE_symbolCompressionTransform* const symbolTT = (FSE_symbolCompressionTransform*) (FSCT);
93     U32 const step = FSE_TABLESTEP(tableSize);
94     U32 cumul[FSE_MAX_SYMBOL_VALUE+2];
95
96     FSE_FUNCTION_TYPE* const tableSymbol = (FSE_FUNCTION_TYPE*)workSpace;
97     U32 highThreshold = tableSize-1;
98
99     /* CTable header */
100     if (((size_t)1 << tableLog) * sizeof(FSE_FUNCTION_TYPE) > wkspSize) return ERROR(tableLog_tooLarge);
101     tableU16[-2] = (U16) tableLog;
102     tableU16[-1] = (U16) maxSymbolValue;
103
104     /* For explanations on how to distribute symbol values over the table :
105     *  http://fastcompression.blogspot.fr/2014/02/fse-distributing-symbol-values.html */
106
107     /* symbol start positions */
108     {   U32 u;
109         cumul[0] = 0;
110         for (u=1; u<=maxSymbolValue+1; u++) {
111             if (normalizedCounter[u-1]==-1) {  /* Low proba symbol */
112                 cumul[u] = cumul[u-1] + 1;
113                 tableSymbol[highThreshold--] = (FSE_FUNCTION_TYPE)(u-1);
114             } else {
115                 cumul[u] = cumul[u-1] + normalizedCounter[u-1];
116         }   }
117         cumul[maxSymbolValue+1] = tableSize+1;
118     }
119
120     /* Spread symbols */
121     {   U32 position = 0;
122         U32 symbol;
123         for (symbol=0; symbol<=maxSymbolValue; symbol++) {
124             int nbOccurences;
125             for (nbOccurences=0; nbOccurences<normalizedCounter[symbol]; nbOccurences++) {
126                 tableSymbol[position] = (FSE_FUNCTION_TYPE)symbol;
127                 position = (position + step) & tableMask;
128                 while (position > highThreshold) position = (position + step) & tableMask;   /* Low proba area */
129         }   }
130
131         if (position!=0) return ERROR(GENERIC);   /* Must have gone through all positions */
132     }
133
134     /* Build table */
135     {   U32 u; for (u=0; u<tableSize; u++) {
136         FSE_FUNCTION_TYPE s = tableSymbol[u];   /* note : static analyzer may not understand tableSymbol is properly initialized */
137         tableU16[cumul[s]++] = (U16) (tableSize+u);   /* TableU16 : sorted by symbol order; gives next state value */
138     }   }
139
140     /* Build Symbol Transformation Table */
141     {   unsigned total = 0;
142         unsigned s;
143         for (s=0; s<=maxSymbolValue; s++) {
144             switch (normalizedCounter[s])
145             {
146             case  0: break;
147
148             case -1:
149             case  1:
150                 symbolTT[s].deltaNbBits = (tableLog << 16) - (1<<tableLog);
151                 symbolTT[s].deltaFindState = total - 1;
152                 total ++;
153                 break;
154             default :
155                 {
156                     U32 const maxBitsOut = tableLog - BIT_highbit32 (normalizedCounter[s]-1);
157                     U32 const minStatePlus = normalizedCounter[s] << maxBitsOut;
158                     symbolTT[s].deltaNbBits = (maxBitsOut << 16) - minStatePlus;
159                     symbolTT[s].deltaFindState = total - normalizedCounter[s];
160                     total +=  normalizedCounter[s];
161     }   }   }   }
162
163     return 0;
164 }
165
166
167 size_t FSE_buildCTable(FSE_CTable* ct, const short* normalizedCounter, unsigned maxSymbolValue, unsigned tableLog)
168 {
169     FSE_FUNCTION_TYPE tableSymbol[FSE_MAX_TABLESIZE];   /* memset() is not necessary, even if static analyzer complain about it */
170     return FSE_buildCTable_wksp(ct, normalizedCounter, maxSymbolValue, tableLog, tableSymbol, sizeof(tableSymbol));
171 }
172
173
174
175 #ifndef FSE_COMMONDEFS_ONLY
176
177 /*-**************************************************************
178 *  FSE NCount encoding-decoding
179 ****************************************************************/
180 size_t FSE_NCountWriteBound(unsigned maxSymbolValue, unsigned tableLog)
181 {
182     size_t const maxHeaderSize = (((maxSymbolValue+1) * tableLog) >> 3) + 3;
183     return maxSymbolValue ? maxHeaderSize : FSE_NCOUNTBOUND;  /* maxSymbolValue==0 ? use default */
184 }
185
186 static size_t FSE_writeNCount_generic (void* header, size_t headerBufferSize,
187                                        const short* normalizedCounter, unsigned maxSymbolValue, unsigned tableLog,
188                                        unsigned writeIsSafe)
189 {
190     BYTE* const ostart = (BYTE*) header;
191     BYTE* out = ostart;
192     BYTE* const oend = ostart + headerBufferSize;
193     int nbBits;
194     const int tableSize = 1 << tableLog;
195     int remaining;
196     int threshold;
197     U32 bitStream;
198     int bitCount;
199     unsigned charnum = 0;
200     int previous0 = 0;
201
202     bitStream = 0;
203     bitCount  = 0;
204     /* Table Size */
205     bitStream += (tableLog-FSE_MIN_TABLELOG) << bitCount;
206     bitCount  += 4;
207
208     /* Init */
209     remaining = tableSize+1;   /* +1 for extra accuracy */
210     threshold = tableSize;
211     nbBits = tableLog+1;
212
213     while (remaining>1) {  /* stops at 1 */
214         if (previous0) {
215             unsigned start = charnum;
216             while (!normalizedCounter[charnum]) charnum++;
217             while (charnum >= start+24) {
218                 start+=24;
219                 bitStream += 0xFFFFU << bitCount;
220                 if ((!writeIsSafe) && (out > oend-2)) return ERROR(dstSize_tooSmall);   /* Buffer overflow */
221                 out[0] = (BYTE) bitStream;
222                 out[1] = (BYTE)(bitStream>>8);
223                 out+=2;
224                 bitStream>>=16;
225             }
226             while (charnum >= start+3) {
227                 start+=3;
228                 bitStream += 3 << bitCount;
229                 bitCount += 2;
230             }
231             bitStream += (charnum-start) << bitCount;
232             bitCount += 2;
233             if (bitCount>16) {
234                 if ((!writeIsSafe) && (out > oend - 2)) return ERROR(dstSize_tooSmall);   /* Buffer overflow */
235                 out[0] = (BYTE)bitStream;
236                 out[1] = (BYTE)(bitStream>>8);
237                 out += 2;
238                 bitStream >>= 16;
239                 bitCount -= 16;
240         }   }
241         {   int count = normalizedCounter[charnum++];
242             int const max = (2*threshold-1)-remaining;
243             remaining -= count < 0 ? -count : count;
244             count++;   /* +1 for extra accuracy */
245             if (count>=threshold) count += max;   /* [0..max[ [max..threshold[ (...) [threshold+max 2*threshold[ */
246             bitStream += count << bitCount;
247             bitCount  += nbBits;
248             bitCount  -= (count<max);
249             previous0  = (count==1);
250             if (remaining<1) return ERROR(GENERIC);
251             while (remaining<threshold) { nbBits--; threshold>>=1; }
252         }
253         if (bitCount>16) {
254             if ((!writeIsSafe) && (out > oend - 2)) return ERROR(dstSize_tooSmall);   /* Buffer overflow */
255             out[0] = (BYTE)bitStream;
256             out[1] = (BYTE)(bitStream>>8);
257             out += 2;
258             bitStream >>= 16;
259             bitCount -= 16;
260     }   }
261
262     /* flush remaining bitStream */
263     if ((!writeIsSafe) && (out > oend - 2)) return ERROR(dstSize_tooSmall);   /* Buffer overflow */
264     out[0] = (BYTE)bitStream;
265     out[1] = (BYTE)(bitStream>>8);
266     out+= (bitCount+7) /8;
267
268     if (charnum > maxSymbolValue + 1) return ERROR(GENERIC);
269
270     return (out-ostart);
271 }
272
273
274 size_t FSE_writeNCount (void* buffer, size_t bufferSize, const short* normalizedCounter, unsigned maxSymbolValue, unsigned tableLog)
275 {
276     if (tableLog > FSE_MAX_TABLELOG) return ERROR(tableLog_tooLarge);   /* Unsupported */
277     if (tableLog < FSE_MIN_TABLELOG) return ERROR(GENERIC);   /* Unsupported */
278
279     if (bufferSize < FSE_NCountWriteBound(maxSymbolValue, tableLog))
280         return FSE_writeNCount_generic(buffer, bufferSize, normalizedCounter, maxSymbolValue, tableLog, 0);
281
282     return FSE_writeNCount_generic(buffer, bufferSize, normalizedCounter, maxSymbolValue, tableLog, 1);
283 }
284
285
286
287 /*-**************************************************************
288 *  Counting histogram
289 ****************************************************************/
290 /*! FSE_count_simple
291     This function counts byte values within `src`, and store the histogram into table `count`.
292     It doesn't use any additional memory.
293     But this function is unsafe : it doesn't check that all values within `src` can fit into `count`.
294     For this reason, prefer using a table `count` with 256 elements.
295     @return : count of most numerous element.
296 */
297 size_t FSE_count_simple(unsigned* count, unsigned* maxSymbolValuePtr,
298                         const void* src, size_t srcSize)
299 {
300     const BYTE* ip = (const BYTE*)src;
301     const BYTE* const end = ip + srcSize;
302     unsigned maxSymbolValue = *maxSymbolValuePtr;
303     unsigned max=0;
304
305     memset(count, 0, (maxSymbolValue+1)*sizeof(*count));
306     if (srcSize==0) { *maxSymbolValuePtr = 0; return 0; }
307
308     while (ip<end) {
309         assert(*ip <= maxSymbolValue);
310         count[*ip++]++;
311     }
312
313     while (!count[maxSymbolValue]) maxSymbolValue--;
314     *maxSymbolValuePtr = maxSymbolValue;
315
316     { U32 s; for (s=0; s<=maxSymbolValue; s++) if (count[s] > max) max = count[s]; }
317
318     return (size_t)max;
319 }
320
321
322 /* FSE_count_parallel_wksp() :
323  * Same as FSE_count_parallel(), but using an externally provided scratch buffer.
324  * `workSpace` size must be a minimum of `1024 * sizeof(unsigned)`.
325  * @return : largest histogram frequency, or an error code (notably when histogram would be larger than *maxSymbolValuePtr). */
326 static size_t FSE_count_parallel_wksp(
327                                 unsigned* count, unsigned* maxSymbolValuePtr,
328                                 const void* source, size_t sourceSize,
329                                 unsigned checkMax, unsigned* const workSpace)
330 {
331     const BYTE* ip = (const BYTE*)source;
332     const BYTE* const iend = ip+sourceSize;
333     unsigned maxSymbolValue = *maxSymbolValuePtr;
334     unsigned max=0;
335     U32* const Counting1 = workSpace;
336     U32* const Counting2 = Counting1 + 256;
337     U32* const Counting3 = Counting2 + 256;
338     U32* const Counting4 = Counting3 + 256;
339
340     memset(workSpace, 0, 4*256*sizeof(unsigned));
341
342     /* safety checks */
343     if (!sourceSize) {
344         memset(count, 0, maxSymbolValue + 1);
345         *maxSymbolValuePtr = 0;
346         return 0;
347     }
348     if (!maxSymbolValue) maxSymbolValue = 255;            /* 0 == default */
349
350     /* by stripes of 16 bytes */
351     {   U32 cached = MEM_read32(ip); ip += 4;
352         while (ip < iend-15) {
353             U32 c = cached; cached = MEM_read32(ip); ip += 4;
354             Counting1[(BYTE) c     ]++;
355             Counting2[(BYTE)(c>>8) ]++;
356             Counting3[(BYTE)(c>>16)]++;
357             Counting4[       c>>24 ]++;
358             c = cached; cached = MEM_read32(ip); ip += 4;
359             Counting1[(BYTE) c     ]++;
360             Counting2[(BYTE)(c>>8) ]++;
361             Counting3[(BYTE)(c>>16)]++;
362             Counting4[       c>>24 ]++;
363             c = cached; cached = MEM_read32(ip); ip += 4;
364             Counting1[(BYTE) c     ]++;
365             Counting2[(BYTE)(c>>8) ]++;
366             Counting3[(BYTE)(c>>16)]++;
367             Counting4[       c>>24 ]++;
368             c = cached; cached = MEM_read32(ip); ip += 4;
369             Counting1[(BYTE) c     ]++;
370             Counting2[(BYTE)(c>>8) ]++;
371             Counting3[(BYTE)(c>>16)]++;
372             Counting4[       c>>24 ]++;
373         }
374         ip-=4;
375     }
376
377     /* finish last symbols */
378     while (ip<iend) Counting1[*ip++]++;
379
380     if (checkMax) {   /* verify stats will fit into destination table */
381         U32 s; for (s=255; s>maxSymbolValue; s--) {
382             Counting1[s] += Counting2[s] + Counting3[s] + Counting4[s];
383             if (Counting1[s]) return ERROR(maxSymbolValue_tooSmall);
384     }   }
385
386     {   U32 s;
387         if (maxSymbolValue > 255) maxSymbolValue = 255;
388         for (s=0; s<=maxSymbolValue; s++) {
389             count[s] = Counting1[s] + Counting2[s] + Counting3[s] + Counting4[s];
390             if (count[s] > max) max = count[s];
391     }   }
392
393     while (!count[maxSymbolValue]) maxSymbolValue--;
394     *maxSymbolValuePtr = maxSymbolValue;
395     return (size_t)max;
396 }
397
398 /* FSE_countFast_wksp() :
399  * Same as FSE_countFast(), but using an externally provided scratch buffer.
400  * `workSpace` size must be table of >= `1024` unsigned */
401 size_t FSE_countFast_wksp(unsigned* count, unsigned* maxSymbolValuePtr,
402                           const void* source, size_t sourceSize,
403                           unsigned* workSpace)
404 {
405     if (sourceSize < 1500) /* heuristic threshold */
406         return FSE_count_simple(count, maxSymbolValuePtr, source, sourceSize);
407     return FSE_count_parallel_wksp(count, maxSymbolValuePtr, source, sourceSize, 0, workSpace);
408 }
409
410 /* fast variant (unsafe : won't check if src contains values beyond count[] limit) */
411 size_t FSE_countFast(unsigned* count, unsigned* maxSymbolValuePtr,
412                      const void* source, size_t sourceSize)
413 {
414     unsigned tmpCounters[1024];
415     return FSE_countFast_wksp(count, maxSymbolValuePtr, source, sourceSize, tmpCounters);
416 }
417
418 /* FSE_count_wksp() :
419  * Same as FSE_count(), but using an externally provided scratch buffer.
420  * `workSpace` size must be table of >= `1024` unsigned */
421 size_t FSE_count_wksp(unsigned* count, unsigned* maxSymbolValuePtr,
422                  const void* source, size_t sourceSize, unsigned* workSpace)
423 {
424     if (*maxSymbolValuePtr < 255)
425         return FSE_count_parallel_wksp(count, maxSymbolValuePtr, source, sourceSize, 1, workSpace);
426     *maxSymbolValuePtr = 255;
427     return FSE_countFast_wksp(count, maxSymbolValuePtr, source, sourceSize, workSpace);
428 }
429
430 size_t FSE_count(unsigned* count, unsigned* maxSymbolValuePtr,
431                  const void* src, size_t srcSize)
432 {
433     unsigned tmpCounters[1024];
434     return FSE_count_wksp(count, maxSymbolValuePtr, src, srcSize, tmpCounters);
435 }
436
437
438
439 /*-**************************************************************
440 *  FSE Compression Code
441 ****************************************************************/
442 /*! FSE_sizeof_CTable() :
443     FSE_CTable is a variable size structure which contains :
444     `U16 tableLog;`
445     `U16 maxSymbolValue;`
446     `U16 nextStateNumber[1 << tableLog];`                         // This size is variable
447     `FSE_symbolCompressionTransform symbolTT[maxSymbolValue+1];`  // This size is variable
448 Allocation is manual (C standard does not support variable-size structures).
449 */
450 size_t FSE_sizeof_CTable (unsigned maxSymbolValue, unsigned tableLog)
451 {
452     if (tableLog > FSE_MAX_TABLELOG) return ERROR(tableLog_tooLarge);
453     return FSE_CTABLE_SIZE_U32 (tableLog, maxSymbolValue) * sizeof(U32);
454 }
455
456 FSE_CTable* FSE_createCTable (unsigned maxSymbolValue, unsigned tableLog)
457 {
458     size_t size;
459     if (tableLog > FSE_TABLELOG_ABSOLUTE_MAX) tableLog = FSE_TABLELOG_ABSOLUTE_MAX;
460     size = FSE_CTABLE_SIZE_U32 (tableLog, maxSymbolValue) * sizeof(U32);
461     return (FSE_CTable*)malloc(size);
462 }
463
464 void FSE_freeCTable (FSE_CTable* ct) { free(ct); }
465
466 /* provides the minimum logSize to safely represent a distribution */
467 static unsigned FSE_minTableLog(size_t srcSize, unsigned maxSymbolValue)
468 {
469     U32 minBitsSrc = BIT_highbit32((U32)(srcSize - 1)) + 1;
470     U32 minBitsSymbols = BIT_highbit32(maxSymbolValue) + 2;
471     U32 minBits = minBitsSrc < minBitsSymbols ? minBitsSrc : minBitsSymbols;
472     assert(srcSize > 1); /* Not supported, RLE should be used instead */
473     return minBits;
474 }
475
476 unsigned FSE_optimalTableLog_internal(unsigned maxTableLog, size_t srcSize, unsigned maxSymbolValue, unsigned minus)
477 {
478     U32 maxBitsSrc = BIT_highbit32((U32)(srcSize - 1)) - minus;
479     U32 tableLog = maxTableLog;
480     U32 minBits = FSE_minTableLog(srcSize, maxSymbolValue);
481     assert(srcSize > 1); /* Not supported, RLE should be used instead */
482     if (tableLog==0) tableLog = FSE_DEFAULT_TABLELOG;
483     if (maxBitsSrc < tableLog) tableLog = maxBitsSrc;   /* Accuracy can be reduced */
484     if (minBits > tableLog) tableLog = minBits;   /* Need a minimum to safely represent all symbol values */
485     if (tableLog < FSE_MIN_TABLELOG) tableLog = FSE_MIN_TABLELOG;
486     if (tableLog > FSE_MAX_TABLELOG) tableLog = FSE_MAX_TABLELOG;
487     return tableLog;
488 }
489
490 unsigned FSE_optimalTableLog(unsigned maxTableLog, size_t srcSize, unsigned maxSymbolValue)
491 {
492     return FSE_optimalTableLog_internal(maxTableLog, srcSize, maxSymbolValue, 2);
493 }
494
495
496 /* Secondary normalization method.
497    To be used when primary method fails. */
498
499 static size_t FSE_normalizeM2(short* norm, U32 tableLog, const unsigned* count, size_t total, U32 maxSymbolValue)
500 {
501     short const NOT_YET_ASSIGNED = -2;
502     U32 s;
503     U32 distributed = 0;
504     U32 ToDistribute;
505
506     /* Init */
507     U32 const lowThreshold = (U32)(total >> tableLog);
508     U32 lowOne = (U32)((total * 3) >> (tableLog + 1));
509
510     for (s=0; s<=maxSymbolValue; s++) {
511         if (count[s] == 0) {
512             norm[s]=0;
513             continue;
514         }
515         if (count[s] <= lowThreshold) {
516             norm[s] = -1;
517             distributed++;
518             total -= count[s];
519             continue;
520         }
521         if (count[s] <= lowOne) {
522             norm[s] = 1;
523             distributed++;
524             total -= count[s];
525             continue;
526         }
527
528         norm[s]=NOT_YET_ASSIGNED;
529     }
530     ToDistribute = (1 << tableLog) - distributed;
531
532     if ((total / ToDistribute) > lowOne) {
533         /* risk of rounding to zero */
534         lowOne = (U32)((total * 3) / (ToDistribute * 2));
535         for (s=0; s<=maxSymbolValue; s++) {
536             if ((norm[s] == NOT_YET_ASSIGNED) && (count[s] <= lowOne)) {
537                 norm[s] = 1;
538                 distributed++;
539                 total -= count[s];
540                 continue;
541         }   }
542         ToDistribute = (1 << tableLog) - distributed;
543     }
544
545     if (distributed == maxSymbolValue+1) {
546         /* all values are pretty poor;
547            probably incompressible data (should have already been detected);
548            find max, then give all remaining points to max */
549         U32 maxV = 0, maxC = 0;
550         for (s=0; s<=maxSymbolValue; s++)
551             if (count[s] > maxC) { maxV=s; maxC=count[s]; }
552         norm[maxV] += (short)ToDistribute;
553         return 0;
554     }
555
556     if (total == 0) {
557         /* all of the symbols were low enough for the lowOne or lowThreshold */
558         for (s=0; ToDistribute > 0; s = (s+1)%(maxSymbolValue+1))
559             if (norm[s] > 0) { ToDistribute--; norm[s]++; }
560         return 0;
561     }
562
563     {   U64 const vStepLog = 62 - tableLog;
564         U64 const mid = (1ULL << (vStepLog-1)) - 1;
565         U64 const rStep = ((((U64)1<<vStepLog) * ToDistribute) + mid) / total;   /* scale on remaining */
566         U64 tmpTotal = mid;
567         for (s=0; s<=maxSymbolValue; s++) {
568             if (norm[s]==NOT_YET_ASSIGNED) {
569                 U64 const end = tmpTotal + (count[s] * rStep);
570                 U32 const sStart = (U32)(tmpTotal >> vStepLog);
571                 U32 const sEnd = (U32)(end >> vStepLog);
572                 U32 const weight = sEnd - sStart;
573                 if (weight < 1)
574                     return ERROR(GENERIC);
575                 norm[s] = (short)weight;
576                 tmpTotal = end;
577     }   }   }
578
579     return 0;
580 }
581
582
583 size_t FSE_normalizeCount (short* normalizedCounter, unsigned tableLog,
584                            const unsigned* count, size_t total,
585                            unsigned maxSymbolValue)
586 {
587     /* Sanity checks */
588     if (tableLog==0) tableLog = FSE_DEFAULT_TABLELOG;
589     if (tableLog < FSE_MIN_TABLELOG) return ERROR(GENERIC);   /* Unsupported size */
590     if (tableLog > FSE_MAX_TABLELOG) return ERROR(tableLog_tooLarge);   /* Unsupported size */
591     if (tableLog < FSE_minTableLog(total, maxSymbolValue)) return ERROR(GENERIC);   /* Too small tableLog, compression potentially impossible */
592
593     {   static U32 const rtbTable[] = {     0, 473195, 504333, 520860, 550000, 700000, 750000, 830000 };
594         U64 const scale = 62 - tableLog;
595         U64 const step = ((U64)1<<62) / total;   /* <== here, one division ! */
596         U64 const vStep = 1ULL<<(scale-20);
597         int stillToDistribute = 1<<tableLog;
598         unsigned s;
599         unsigned largest=0;
600         short largestP=0;
601         U32 lowThreshold = (U32)(total >> tableLog);
602
603         for (s=0; s<=maxSymbolValue; s++) {
604             if (count[s] == total) return 0;   /* rle special case */
605             if (count[s] == 0) { normalizedCounter[s]=0; continue; }
606             if (count[s] <= lowThreshold) {
607                 normalizedCounter[s] = -1;
608                 stillToDistribute--;
609             } else {
610                 short proba = (short)((count[s]*step) >> scale);
611                 if (proba<8) {
612                     U64 restToBeat = vStep * rtbTable[proba];
613                     proba += (count[s]*step) - ((U64)proba<<scale) > restToBeat;
614                 }
615                 if (proba > largestP) { largestP=proba; largest=s; }
616                 normalizedCounter[s] = proba;
617                 stillToDistribute -= proba;
618         }   }
619         if (-stillToDistribute >= (normalizedCounter[largest] >> 1)) {
620             /* corner case, need another normalization method */
621             size_t const errorCode = FSE_normalizeM2(normalizedCounter, tableLog, count, total, maxSymbolValue);
622             if (FSE_isError(errorCode)) return errorCode;
623         }
624         else normalizedCounter[largest] += (short)stillToDistribute;
625     }
626
627 #if 0
628     {   /* Print Table (debug) */
629         U32 s;
630         U32 nTotal = 0;
631         for (s=0; s<=maxSymbolValue; s++)
632             printf("%3i: %4i \n", s, normalizedCounter[s]);
633         for (s=0; s<=maxSymbolValue; s++)
634             nTotal += abs(normalizedCounter[s]);
635         if (nTotal != (1U<<tableLog))
636             printf("Warning !!! Total == %u != %u !!!", nTotal, 1U<<tableLog);
637         getchar();
638     }
639 #endif
640
641     return tableLog;
642 }
643
644
645 /* fake FSE_CTable, for raw (uncompressed) input */
646 size_t FSE_buildCTable_raw (FSE_CTable* ct, unsigned nbBits)
647 {
648     const unsigned tableSize = 1 << nbBits;
649     const unsigned tableMask = tableSize - 1;
650     const unsigned maxSymbolValue = tableMask;
651     void* const ptr = ct;
652     U16* const tableU16 = ( (U16*) ptr) + 2;
653     void* const FSCT = ((U32*)ptr) + 1 /* header */ + (tableSize>>1);   /* assumption : tableLog >= 1 */
654     FSE_symbolCompressionTransform* const symbolTT = (FSE_symbolCompressionTransform*) (FSCT);
655     unsigned s;
656
657     /* Sanity checks */
658     if (nbBits < 1) return ERROR(GENERIC);             /* min size */
659
660     /* header */
661     tableU16[-2] = (U16) nbBits;
662     tableU16[-1] = (U16) maxSymbolValue;
663
664     /* Build table */
665     for (s=0; s<tableSize; s++)
666         tableU16[s] = (U16)(tableSize + s);
667
668     /* Build Symbol Transformation Table */
669     {   const U32 deltaNbBits = (nbBits << 16) - (1 << nbBits);
670         for (s=0; s<=maxSymbolValue; s++) {
671             symbolTT[s].deltaNbBits = deltaNbBits;
672             symbolTT[s].deltaFindState = s-1;
673     }   }
674
675     return 0;
676 }
677
678 /* fake FSE_CTable, for rle input (always same symbol) */
679 size_t FSE_buildCTable_rle (FSE_CTable* ct, BYTE symbolValue)
680 {
681     void* ptr = ct;
682     U16* tableU16 = ( (U16*) ptr) + 2;
683     void* FSCTptr = (U32*)ptr + 2;
684     FSE_symbolCompressionTransform* symbolTT = (FSE_symbolCompressionTransform*) FSCTptr;
685
686     /* header */
687     tableU16[-2] = (U16) 0;
688     tableU16[-1] = (U16) symbolValue;
689
690     /* Build table */
691     tableU16[0] = 0;
692     tableU16[1] = 0;   /* just in case */
693
694     /* Build Symbol Transformation Table */
695     symbolTT[symbolValue].deltaNbBits = 0;
696     symbolTT[symbolValue].deltaFindState = 0;
697
698     return 0;
699 }
700
701
702 static size_t FSE_compress_usingCTable_generic (void* dst, size_t dstSize,
703                            const void* src, size_t srcSize,
704                            const FSE_CTable* ct, const unsigned fast)
705 {
706     const BYTE* const istart = (const BYTE*) src;
707     const BYTE* const iend = istart + srcSize;
708     const BYTE* ip=iend;
709
710     BIT_CStream_t bitC;
711     FSE_CState_t CState1, CState2;
712
713     /* init */
714     if (srcSize <= 2) return 0;
715     { size_t const initError = BIT_initCStream(&bitC, dst, dstSize);
716       if (FSE_isError(initError)) return 0; /* not enough space available to write a bitstream */ }
717
718 #define FSE_FLUSHBITS(s)  (fast ? BIT_flushBitsFast(s) : BIT_flushBits(s))
719
720     if (srcSize & 1) {
721         FSE_initCState2(&CState1, ct, *--ip);
722         FSE_initCState2(&CState2, ct, *--ip);
723         FSE_encodeSymbol(&bitC, &CState1, *--ip);
724         FSE_FLUSHBITS(&bitC);
725     } else {
726         FSE_initCState2(&CState2, ct, *--ip);
727         FSE_initCState2(&CState1, ct, *--ip);
728     }
729
730     /* join to mod 4 */
731     srcSize -= 2;
732     if ((sizeof(bitC.bitContainer)*8 > FSE_MAX_TABLELOG*4+7 ) && (srcSize & 2)) {  /* test bit 2 */
733         FSE_encodeSymbol(&bitC, &CState2, *--ip);
734         FSE_encodeSymbol(&bitC, &CState1, *--ip);
735         FSE_FLUSHBITS(&bitC);
736     }
737
738     /* 2 or 4 encoding per loop */
739     while ( ip>istart ) {
740
741         FSE_encodeSymbol(&bitC, &CState2, *--ip);
742
743         if (sizeof(bitC.bitContainer)*8 < FSE_MAX_TABLELOG*2+7 )   /* this test must be static */
744             FSE_FLUSHBITS(&bitC);
745
746         FSE_encodeSymbol(&bitC, &CState1, *--ip);
747
748         if (sizeof(bitC.bitContainer)*8 > FSE_MAX_TABLELOG*4+7 ) {  /* this test must be static */
749             FSE_encodeSymbol(&bitC, &CState2, *--ip);
750             FSE_encodeSymbol(&bitC, &CState1, *--ip);
751         }
752
753         FSE_FLUSHBITS(&bitC);
754     }
755
756     FSE_flushCState(&bitC, &CState2);
757     FSE_flushCState(&bitC, &CState1);
758     return BIT_closeCStream(&bitC);
759 }
760
761 size_t FSE_compress_usingCTable (void* dst, size_t dstSize,
762                            const void* src, size_t srcSize,
763                            const FSE_CTable* ct)
764 {
765     unsigned const fast = (dstSize >= FSE_BLOCKBOUND(srcSize));
766
767     if (fast)
768         return FSE_compress_usingCTable_generic(dst, dstSize, src, srcSize, ct, 1);
769     else
770         return FSE_compress_usingCTable_generic(dst, dstSize, src, srcSize, ct, 0);
771 }
772
773
774 size_t FSE_compressBound(size_t size) { return FSE_COMPRESSBOUND(size); }
775
776 #define CHECK_V_F(e, f) size_t const e = f; if (ERR_isError(e)) return e
777 #define CHECK_F(f)   { CHECK_V_F(_var_err__, f); }
778
779 /* FSE_compress_wksp() :
780  * Same as FSE_compress2(), but using an externally allocated scratch buffer (`workSpace`).
781  * `wkspSize` size must be `(1<<tableLog)`.
782  */
783 size_t FSE_compress_wksp (void* dst, size_t dstSize, const void* src, size_t srcSize, unsigned maxSymbolValue, unsigned tableLog, void* workSpace, size_t wkspSize)
784 {
785     BYTE* const ostart = (BYTE*) dst;
786     BYTE* op = ostart;
787     BYTE* const oend = ostart + dstSize;
788
789     U32   count[FSE_MAX_SYMBOL_VALUE+1];
790     S16   norm[FSE_MAX_SYMBOL_VALUE+1];
791     FSE_CTable* CTable = (FSE_CTable*)workSpace;
792     size_t const CTableSize = FSE_CTABLE_SIZE_U32(tableLog, maxSymbolValue);
793     void* scratchBuffer = (void*)(CTable + CTableSize);
794     size_t const scratchBufferSize = wkspSize - (CTableSize * sizeof(FSE_CTable));
795
796     /* init conditions */
797     if (wkspSize < FSE_WKSP_SIZE_U32(tableLog, maxSymbolValue)) return ERROR(tableLog_tooLarge);
798     if (srcSize <= 1) return 0;  /* Not compressible */
799     if (!maxSymbolValue) maxSymbolValue = FSE_MAX_SYMBOL_VALUE;
800     if (!tableLog) tableLog = FSE_DEFAULT_TABLELOG;
801
802     /* Scan input and build symbol stats */
803     {   CHECK_V_F(maxCount, FSE_count_wksp(count, &maxSymbolValue, src, srcSize, (unsigned*)scratchBuffer) );
804         if (maxCount == srcSize) return 1;   /* only a single symbol in src : rle */
805         if (maxCount == 1) return 0;         /* each symbol present maximum once => not compressible */
806         if (maxCount < (srcSize >> 7)) return 0;   /* Heuristic : not compressible enough */
807     }
808
809     tableLog = FSE_optimalTableLog(tableLog, srcSize, maxSymbolValue);
810     CHECK_F( FSE_normalizeCount(norm, tableLog, count, srcSize, maxSymbolValue) );
811
812     /* Write table description header */
813     {   CHECK_V_F(nc_err, FSE_writeNCount(op, oend-op, norm, maxSymbolValue, tableLog) );
814         op += nc_err;
815     }
816
817     /* Compress */
818     CHECK_F( FSE_buildCTable_wksp(CTable, norm, maxSymbolValue, tableLog, scratchBuffer, scratchBufferSize) );
819     {   CHECK_V_F(cSize, FSE_compress_usingCTable(op, oend - op, src, srcSize, CTable) );
820         if (cSize == 0) return 0;   /* not enough space for compressed data */
821         op += cSize;
822     }
823
824     /* check compressibility */
825     if ( (size_t)(op-ostart) >= srcSize-1 ) return 0;
826
827     return op-ostart;
828 }
829
830 typedef struct {
831     FSE_CTable CTable_max[FSE_CTABLE_SIZE_U32(FSE_MAX_TABLELOG, FSE_MAX_SYMBOL_VALUE)];
832     BYTE scratchBuffer[1 << FSE_MAX_TABLELOG];
833 } fseWkspMax_t;
834
835 size_t FSE_compress2 (void* dst, size_t dstCapacity, const void* src, size_t srcSize, unsigned maxSymbolValue, unsigned tableLog)
836 {
837     fseWkspMax_t scratchBuffer;
838     FSE_STATIC_ASSERT(sizeof(scratchBuffer) >= FSE_WKSP_SIZE_U32(FSE_MAX_TABLELOG, FSE_MAX_SYMBOL_VALUE));   /* compilation failures here means scratchBuffer is not large enough */
839     if (tableLog > FSE_MAX_TABLELOG) return ERROR(tableLog_tooLarge);
840     return FSE_compress_wksp(dst, dstCapacity, src, srcSize, maxSymbolValue, tableLog, &scratchBuffer, sizeof(scratchBuffer));
841 }
842
843 size_t FSE_compress (void* dst, size_t dstCapacity, const void* src, size_t srcSize)
844 {
845     return FSE_compress2(dst, dstCapacity, src, srcSize, FSE_MAX_SYMBOL_VALUE, FSE_DEFAULT_TABLELOG);
846 }
847
848
849 #endif   /* FSE_COMMONDEFS_ONLY */