]> git.llucax.com Git - z.facultad/75.06/jacu.git/blob - otros/ppmc/exclusion/ppmc.c
Se cambia por un nombre mas representativo.
[z.facultad/75.06/jacu.git] / otros / ppmc / exclusion / ppmc.c
1 /*
2  Copyright (C) Arturo San Emeterio Campos 1999. All rights reserved.
3  Permission is granted to make verbatim copies of this file for private 
4  use only. There is ABSOLUTELY NO WARRANTY. Use it at your OWN RISK.
5
6  This file is: "ppmc.c" (exclusion)
7  Email: arturo@arturocampos.com
8  Web: http://www.arturocampos.com
9
10  Part of the ppmc encoder and decoder.
11
12  This module contains the whole ppmc encoder. It uses hash tables for
13  managing most of the orders. And a maximum order of 4. It codes bytes.
14  Order-1-0-(-1) are all handled in tables. Order-2 has a table with
15  direct hashing with pointers to the linked lists. Order-4 and order-3
16  both have hash tables with pointers to contexts in a linked lists which
17  finally have a pointer to the start of the linked list with the
18  probability distribution. Update exclusion is used, but exclusion is not.
19
20  Please, note that if the machine where the decoder is run doesn't has as
21  much memory as the computer where the encoder was ran, the decoder will
22  not be able to properly decode the file, because it will not be able to
23  keep track of new statistics, in this case it will just exit.
24
25  For applications where the loss of data is not admisible, I suggest you to
26  limit both encoder and decoder's memory requeriments to a given minimum.
27
28  Using exclusion. It's up to the main encoding routine to clear this table
29  for every new byte.
30 */
31
32
33 #include <stdio.h>
34 #include <stdlib.h>
35 #include "range.h"
36 #include "ppmcdata.h"
37
38
39
40 // Ruotines used by ppmc. Not including the range coder.
41 //
42 // They are for initializing of both encoder and decoder, and unless there
43 // are two version, both encoder and decoder use the same routines. Like
44 // "ppmc_initialize_contexts".
45
46
47 // This one allocs the memory needed by ppmc, and adjust some pointers used
48 // for allocating elements in the linked lists. The mempool arrays must be
49 // initialized now.
50 void ppmc_alloc_memory(void)
51 {
52  unsigned long counter;
53
54
55  // Init mempool buffers
56
57  for(counter=0;counter!=_mempool_max_index;++counter)
58    {
59    _bytes_pool_array[counter]=0;
60    _context_pool_array[counter]=0;
61    }
62
63  _bytes_pool_index=1;   //first entry will be used now
64  _context_pool_index=1;
65
66
67  // Allocate memory for ppmc structures and adjust some variables
68  if((_bytes_pool=(struct _byte_and_freq *)malloc
69    (sizeof(struct _byte_and_freq)*_bytes_pool_elements))==NULL)
70    {
71    printf("\nCan't allocate memory for bytes memory pool.\nIndex: %d",_bytes_pool_index);
72    ppmc_out_of_memory=1;    //flush
73    return;
74    }
75
76  if((_context_pool=(struct context *)malloc
77    (sizeof(struct context)*_context_pool_elements))==NULL)
78    {
79    printf("Can't allocate memory for context's memory pool.\nIndex: %d",_context_pool_index);
80    ppmc_out_of_memory=1;    //flush
81    return;
82    }
83
84
85  //save pointers in the array for freeing
86  _bytes_pool_array[0]=_bytes_pool;
87  _context_pool_array[0]=_context_pool;
88
89
90  //adjust variables
91  _bytes_pool_max=_bytes_pool+_bytes_pool_elements;
92  _context_pool_max=_context_pool+_context_pool_elements;
93
94  ppmc_out_of_memory=0;  //we still have memory
95 }
96
97
98 // This routine initializes all the contexts, and all the tables including
99 // those who care about the number of bytes defined in a context.
100 void ppmc_initialize_contexts(void)
101 {
102  unsigned long counter, counter2;
103
104
105  // Order-0
106  for(counter=0;counter!=256;++counter) //clear table
107    order0_array[counter]=0;
108
109  order0_defined_bytes=0;       //adjust variables
110  order0_max_cump=0;
111
112
113  // Order-1
114  for(counter=0;counter!=256;++counter)  //erase every table of every context
115    for(counter2=0;counter2!=256;++counter2)
116      order1_array[counter][counter2]=0;
117
118  for(counter=0;counter!=256;++counter) //adjust variables
119    {
120    order1_defined_bytes_array[counter]=0;
121    order1_max_cump_array[counter]=0;
122    }
123
124
125  // Order-2
126  for(counter=0;counter!=65536;++counter)
127    {
128    //order2_array[counter].prob=0;     //clear pointer to bytes and frequencies
129    //order2_array[counter].max_cump=0;
130    order2_array[counter].defined_bytes=0;
131    }
132
133
134  // Order-4-3
135  for(counter=0;counter!=65536;++counter) //order-4-3
136    {
137    order4_hasht[counter]=0;
138    order3_hasht[counter]=0;
139    }
140 }
141
142
143 // This routine initializes the encode model by outputting as many bytes as
144 // needed to prepare the models. This should be called before the main loop
145 // and after the memory has been allocated and tables initialized.
146 //
147 // It does not need uses the range coder. It output the first 1 bytes.
148 void ppmc_encoder_initialize(void)
149 {
150
151  // Initialize order-0 and prepare different bytes for orders
152  fputc((byte=fgetc(file_input)),file_output);
153  o4_byte=byte;    //order-4
154
155  fputc((byte=fgetc(file_input)),file_output);
156  o3_byte=byte;    //order-3
157
158  fputc((byte=fgetc(file_input)),file_output);
159  o2_byte=byte;    //order-2
160  ppmc_update_order0();
161
162  fputc((byte=fgetc(file_input)),file_output);
163  o1_byte=byte;
164
165 }
166
167
168 // This routine initializes the decoder model, should be called to do the same
169 // changes as "ppmc_encoder_initialize()" did.
170 void ppmc_decoder_initialize(void)
171 {
172
173  // Initialize order-0 and context bytes
174  byte=fgetc(file_input);
175  o4_byte=byte;    //order-4
176  fputc(byte,file_output);
177
178  byte=fgetc(file_input);
179  o3_byte=byte;    //order-3
180  fputc(byte,file_output);
181
182  byte=fgetc(file_input);
183  o2_byte=byte;    //order-2
184
185  fputc(byte,file_output);   //output first byte
186  ppmc_update_order0();
187
188  byte=fgetc(file_input);
189  o1_byte=byte;    //order-1
190  fputc(byte,file_output);
191 }
192
193
194 // Once coding or decoding is finished you have to call this routine.
195 // It must be called when done.
196 void ppmc_free_memory(void)
197 {
198  unsigned long counter;
199
200  // Free the memory buffers
201
202  for(counter=0;counter!=_mempool_max_index;++counter)
203    {
204    if(_bytes_pool_array[counter]!=0)
205      free(_bytes_pool_array[counter]);
206
207    if(_context_pool_array[counter]!=0)
208      free(_context_pool_array[counter]);
209    }
210
211 }
212
213
214 // This routine flushes the memory and restarts all the tables of
215 // probabilities, current order bytes are not modified, this function
216 // is called when we ran out of memory. We have to output the code
217 // number 256 which means memory flushing, for doing this we have to go
218 // to order-(-1) so we have to output an escape code in all the orders
219 // till we reach order-(-1) where we can code it. Then we free all the
220 // memory, alloc it again, and reinitialize all the orders.
221 //
222 // However we may find the case when the current order is not initialized,
223 // in this case we don't need to output an escape code.
224 void ppmc_flush_mem_enc(void)
225 {
226  unsigned long counter;
227
228
229  // Clear exclusion table
230  for(counter=0;counter!=256;++counter)
231    excluded[counter]=0;
232
233
234  // Code an escape code in order-4
235  if(ppmc_get_totf_order4()!=0)  //if 0 no need of escape code
236    {
237
238    ppmc_get_escape_prob_order4();       //get prob and cump
239    range_coder_encode(&rc_coder,total_cump,symb_cump,symb_prob);
240
241    }
242
243
244  // Code an escape code in order-3
245  if(ppmc_get_totf_order3()!=0)  //if 0 no need of escape code
246    {
247
248    ppmc_get_escape_prob_order3();       //get prob and cump
249    range_coder_encode(&rc_coder,total_cump,symb_cump,symb_prob);
250
251    }
252
253
254  // Code an escape code in order-2
255
256  o2_cntxt=ppmc_order2_hash_key(o1_byte,o2_byte);
257
258  // First check if current order-2 context is empty
259  if(order2_array[o2_cntxt].defined_bytes!=0)  //it's not empty
260    {
261    ppmc_get_totf_order2();
262    ppmc_get_escape_prob_order2();
263    range_coder_encode(&rc_coder,total_cump,symb_cump,symb_prob);
264    }
265
266
267  // Code an escape code in order-1
268
269  // First check if current order-1 table is empty
270  if(order1_defined_bytes_array[o1_byte]!=0)  //it's not empty
271    {
272    ppmc_get_totf_order1();
273    ppmc_get_escape_prob_order1();
274    range_coder_encode(&rc_coder,total_cump,symb_cump,symb_prob);
275    }
276
277
278  // Code an escape code in order-0. Order-0 always has at least one symbol
279
280  ppmc_get_totf_order0();
281  ppmc_get_escape_prob_order0();
282  range_coder_encode(&rc_coder,total_cump,symb_cump,symb_prob);
283
284
285
286  // Now we can code the code 256
287
288  symb_prob=1;
289  symb_cump=256;
290  total_cump=257;
291  range_coder_encode(&rc_coder,total_cump,symb_cump,symb_prob);
292
293
294  // Now that decoder knows the flushing, free memory and reinit
295
296  ppmc_free_memory();
297  ppmc_alloc_memory();
298  ppmc_initialize_contexts();
299
300
301  // Be sure that order-0 has at least one probability
302
303  order0_array[o1_byte]++;
304  order0_max_cump++;
305  order0_defined_bytes++;
306
307 }
308
309
310 // When the decoder gets the symbol of flushing, most of the job is done
311 // because we already got all the escape codes, so we only have to reinit.
312 void ppmc_flush_mem_dec(void)
313 {
314
315  // Free memory and reinit
316
317  ppmc_free_memory();
318  ppmc_alloc_memory();
319  ppmc_initialize_contexts();
320
321
322  // Be sure that order-0 has at least one probability
323
324  order0_array[o1_byte]++;
325  order0_max_cump++;
326  order0_defined_bytes++;
327
328
329 }
330
331
332
333 // ORDER-(-1) functions, also called ordern1 (Negative1) in functions
334 //
335 // Because order-(-1) does not need to update its probability tables, it
336 // has no tables, and relies on the fact that the cump of byte is its own
337 // value, and the probability is fixed, 1, and the total cump is 257.
338 //
339 // The alphabet has the following distribution: 0-255 the bytes. 256 is
340 // an special symbol which means that we have flushed the encoder tables,
341 // and thus the encoder must flush its tables too.
342 //
343 // The rest of the tables only have 256 symbols, because we have no need
344 // of assign a symbol to the flush code (which already is the order-(-1)
345 // table) nor to the escape code.
346 //
347 // For order-(-1) we don't use exclusion.
348
349
350 // Gets the probability for a given symbol in the order-(-1) (ordern1)
351 void ppmc_get_prob_ordern1(void)
352 {
353  symb_cump=byte;    //its value
354  symb_prob=1;      //flat probability
355  total_cump=257;   //total cump
356 }
357
358
359 // Returns in the variable "total_cump" the current total cump of
360 // order-(-1)
361 void ppmc_get_totf_ordern1(void)
362 {
363  total_cump=257;        //this is fixed
364 }
365
366
367 // Returns the symbol for a given cump under order-(-1)
368 unsigned long ppmc_get_symbol_ordern1 (void)
369 {
370  return symb_cump;
371 }
372
373
374
375 // ORDER-0 functions
376 //
377 // Due to the fact that order-0 has no context, I use an array for all the
378 // probabilities under order-0, just as you could do in a basic model for
379 // arithmetic coding.
380 //
381 // The main array is: order0_array. Where order0_array[byte] contains the
382 // probability for a given byte. The same applies to order-1.
383 //
384 // To ensure that the updating and coding is done correctly, "byte" can't
385 // be changed till all the coding and updating is done.
386 //
387 // Order-0 uses exclusions. Exclusion values are always prepared in "get_totf"
388 // so there's no need to get them again. However order-0 doesn't have to
389 // update exclude table, because order-(-1) will not use it
390
391
392 // Returns in the variable "total_cump" the current total cump of
393 // order-0. We have to read the whole array because we can't
394 // guarante that all the bytes are used.
395 void ppmc_get_totf_order0(void)
396 {
397  unsigned long temp_cump,       //temp value for the cump
398                counter;
399
400  exc_defined_bytes=0;
401  exc_max_cump=0;
402
403  // Read the number of defined bytes by reading the count of every byte
404  // and if it's present in the exclusion table.
405  for(counter=0;counter!=256;++counter)
406    {
407    if(excluded[counter]==0) //only if it's not excluded
408      if(order0_array[counter]!=0)  //if it has a nonzero count, then it's present
409        {
410        ++exc_defined_bytes;
411        exc_max_cump+=order0_array[counter];
412        }
413    }
414
415  // Total cump is current total cump plus the probability for the escape code
416  exc_total_cump=exc_max_cump+exc_defined_bytes;
417 }
418
419
420 // Codes a byte under order-0 and returns 1, otherwise it returns a 0 and
421 // has coded an escape code. In this case further coding is needed.
422 //
423 // Returns: 1 in case a byte was coded. 0 in case of escape code.
424 char ppmc_code_byte_order0(void)
425 {
426  unsigned long counter;
427
428  ppmc_get_totf_order0();      //get total cump
429
430  // It's possible that due to excluding, there's no byte left, in that case
431  // return.
432  if(exc_defined_bytes==0)
433    return 0;
434
435  // See if the byte is present
436  if(order0_array[byte]==0)      //a probability of 0
437    {
438
439    // Because it was not present, output an escape code, prepare variables
440
441    symb_cump=exc_max_cump;   //obviously its cump is current max_cump
442                                 //without escape code's space
443
444    symb_prob=exc_defined_bytes;  //the number of defined bytes
445
446    total_cump=exc_total_cump;
447
448    // Code the escape code
449    range_coder_encode(&rc_coder,total_cump,symb_cump,symb_prob);
450
451    return 0;    //byte not coded
452    }
453  else
454    {
455
456    coded_in_order=0;
457
458    // The symbol is present, code it under order-0
459
460    symb_prob=order0_array[byte];        //get probability directly
461
462    // Make cump for current symbol
463
464    symb_cump=0;         //for first symbol is 0
465    for(counter=0; counter!=byte ; ++counter)
466      {
467      if(excluded[counter]==0)
468        symb_cump+=order0_array[counter];  //sum probabilities before our symbol
469      }
470
471    total_cump=exc_total_cump;
472
473    // Code the symbol
474    range_coder_encode(&rc_coder,total_cump,symb_cump,symb_prob);
475
476    return 1;    //symbol coded under order-0
477    }
478 }
479
480
481 // This functions update order-0 probabilities with current byte, also takes
482 // care about updating variables, and renormalizing.
483 void ppmc_update_order0(void)
484 {
485  if(order0_array[byte]==0)
486    {
487    // It had a zero probability
488    order0_array[byte]++;       //increment symbol probability
489    ++order0_defined_bytes;     //new byte defined
490    ++order0_max_cump;          //total cump
491    return;
492    }
493  else
494    {
495    // It had a non-zero probability
496
497    // Increment its probability
498    order0_array[byte]++;      //increment symbol probability
499    ++order0_max_cump;         //total cump
500
501    // Check to see if its the maximum in this case renormalize
502    if(order0_array[byte]==255)
503      ppmc_renormalize_order0();
504
505    return;
506    }
507 }
508
509
510 // This functions renormalizes the probabilities at order-0 updating variables
511 void ppmc_renormalize_order0(void)
512 {
513  unsigned long counter;
514
515  // Initialize variables
516  order0_defined_bytes=0;        //clear them
517  order0_max_cump=0;
518
519  // Loop over all probabilities, divide them by a factor of 2 and update variables
520  for(counter=0 ; counter!=256 ; ++counter)
521    {
522    if(order0_array[counter]!=0)
523      {
524      order0_array[counter]>>=1;   //divide by a factor of 2
525      if(order0_array[counter]==0)
526        order0_array[counter]=1;
527      }
528
529    if(order0_array[counter]!=0) //see if it has a non zero probability
530      order0_defined_bytes++;
531
532    order0_max_cump+=order0_array[counter];      //sum to the total cump
533    }
534 }
535
536
537 // Decodes the symbol correspoding to the current order, it returns the byte
538 // or in case of a escape code it returns -1
539 void ppmc_decode_order0(void)
540 {
541  unsigned long current_cump, counter;
542
543
544  // Get the total cump needed for decoding symbol
545  ppmc_get_totf_order0();      //total cump needed for decoding
546
547  // It's possible that due to excluding, there's no byte left, in that case
548  // return.
549  if(exc_defined_bytes==0)
550    {
551    byte=-1;
552    return;
553    }
554
555  symb_cump=range_decoder_decode(&rc_decoder,exc_total_cump);        //decode it
556
557  // Now check if it's an escape code
558  if(symb_cump>=exc_max_cump)     //the defined code space for the escape code
559    {
560
561    // Update coding values
562
563    ppmc_get_escape_prob_order0();
564    range_decoder_update(&rc_decoder,exc_total_cump,symb_cump,symb_prob);
565
566    // Mark as escape code
567
568    byte=-1;
569
570    return;   //an escape code
571    }
572  else
573    {
574    // Now we have to check what symbol it is
575
576    current_cump=0;      //cump of the current symbol
577
578    for(counter=0 ; counter!= 256 ; ++counter)
579      {
580      if(symb_cump<current_cump)
581        break;                  //symbol found, break search loop
582      if(excluded[counter]==0)
583        current_cump+=order0_array[counter];       //update cump
584      }
585
586    counter--;           //-1 (see ac_ppmc.html)
587
588    byte=counter;        //update the variable with the found symbol
589
590
591    // Get the cump and prob of byte
592
593    symb_prob=order0_array[byte];        //the probabilty
594    symb_cump=current_cump-order0_array[byte]; //using the cump which was
595                                               //already made
596
597    // Update coding state
598
599    range_decoder_update(&rc_decoder,exc_total_cump,symb_cump,symb_prob);
600
601    coded_in_order=0;    //decoded under order-0
602
603    return;
604    }
605
606 }
607
608
609 // This function returns the probability for the escape codes in the variables
610 void ppmc_get_escape_prob_order0(void)
611 {
612  // To understand that remember that the escape allocated for the escape code
613  // is above the current maximum cump and that it has a probability determined
614  // by the scheme C.
615  symb_prob=exc_defined_bytes;
616  symb_cump=exc_max_cump;
617  total_cump=exc_defined_bytes+exc_max_cump;
618 }
619
620
621
622 // ORDER-1 functions
623 //
624 // Order-1 uses 256 arrays one for every context, obviously they are accessed
625 // like that: order1_array[o1_byte][byte]
626 //
627 // Also for computing the value of the current escape code in a given context
628 // we need to know how many bytes are defined in a given context, they are
629 // stored in an array, and you use them like that:
630 // order1_defined_bytes_array[o1_byte]
631 //
632 // The same goes for the maximum cump of a given context:
633 // order1_max_cump_array[o1_byte]
634 //
635 // Read the order-0 explanation.
636 //
637 // To ensure that the updating and coding is done correctly, "byte" and
638 // "o1_byte" can't be changed till all the coding and updating is done.
639 //
640 // Order-1 uses exclusions. Exclusion values are always prepared in "get_totf"
641 // so there's no need to get them again. It does update the exclude table.
642
643
644 // Returns in the variable "total_cump" the current total cump of
645 // order-1. o1_byte should contain the order-1
646 void ppmc_get_totf_order1(void)
647 {
648  unsigned long temp_cump,       //temp value for the cump
649                counter;
650
651  exc_defined_bytes=0;
652  exc_max_cump=0;
653
654  // Read the number of defined bytes by reading the count of every byte
655  // and if it's present in the exclusion table.
656  for(counter=0;counter!=256;++counter)
657    {
658    if(excluded[counter]==0) //only if it's not excluded
659      if(order1_array[o1_byte][counter]!=0)  //if it has a nonzero count, then it's present
660        {
661        ++exc_defined_bytes;
662        exc_max_cump+=order1_array[o1_byte][counter];
663        }
664    }
665
666  // Total cump is current total cump plus the probability for the escape code
667  exc_total_cump=exc_max_cump+exc_defined_bytes;
668 }
669
670
671 // Codes a byte under order-1 and returns 1.
672 // Otherwise it returns a 0 it may be that it has coded an escape code, or
673 // that current table was empty, in this case nothing is outputted
674 // In both cases further coding is needed.
675 //
676 // Returns: 1 in case a byte was coded. 0 in case of escape code or empty table.
677 // In case the byte is coded under this context, coded_in_order=1.
678 char ppmc_code_byte_order1(void)
679 {
680  unsigned long counter;
681
682
683  // First check if current order-1 table is empty
684  if(order1_defined_bytes_array[o1_byte]==0)  //it's empty
685    {
686    return 0;    //byte not coded, nothing done
687    }
688
689
690  // Now try to code this byte under order-1
691
692  ppmc_get_totf_order1();      //get total cump
693
694  // It's possible that due to excluding, there's no byte left, in that case
695  // return.
696  if(exc_defined_bytes==0)
697    return 0;
698
699
700  // See if the byte is present
701  if(order1_array[o1_byte][byte]==0)      //a probability of 0
702    {
703
704    // Because it was not present, output an escape code, prepare variables
705
706    symb_cump=exc_max_cump;
707
708    symb_prob=exc_defined_bytes;
709
710    // Code the escape code
711    range_coder_encode(&rc_coder,exc_total_cump,symb_cump,symb_prob);
712
713    // Now update "exclude" table
714    for(counter=0;counter!=256;++counter)
715      if(order1_array[o1_byte][counter]!=0)
716        excluded[counter]=1;               //occurred but was not code, now exclude
717
718    return 0;    //byte not coded, escape coded
719    }
720  else
721    {
722
723    coded_in_order=1;            //because we coded it under order-1
724
725    // The symbol is present, code it under order-1
726
727    symb_prob=order1_array[o1_byte][byte];        //get probability directly
728
729    // Make cump for current symbol
730
731    symb_cump=0;         //for first symbol is 0
732    for(counter=0; counter!=byte ; ++counter)
733      {
734      if(excluded[counter]==0)
735        symb_cump+=order1_array[o1_byte][counter];  //sum probabilities before our symbol
736      }
737
738    // Code the symbol
739    range_coder_encode(&rc_coder,exc_total_cump,symb_cump,symb_prob);
740
741    return 1;    //symbol coded under order-1
742    }
743 }
744
745
746 // This functions update order-1 probabilities with current byte, also takes
747 // care about updating variables, and renormalizing. o1_byte must be filled.
748 void ppmc_update_order1(void)
749 {
750  if(order1_array[o1_byte][byte]==0)
751    {
752    // It had a zero probability
753    order1_array[o1_byte][byte]++;       //increment symbol probability
754    ++order1_defined_bytes_array[o1_byte];     //new byte defined
755    ++order1_max_cump_array[o1_byte];          //total cump
756    return;
757    }
758  else
759    {
760    // It had a non-zero probability
761
762    // Increment its probability
763    order1_array[o1_byte][byte]++;      //increment symbol probability
764    ++order1_max_cump_array[o1_byte];         //total cump
765
766    // Check to see if its the maximum in this case renormalize
767    if(order1_array[o1_byte][byte]==255)
768      ppmc_renormalize_order1();
769
770    return;
771    }
772 }
773
774
775 // This functions renormalizes the probabilities at order-1 updating variables
776 void ppmc_renormalize_order1(void)
777 {
778  unsigned long counter;
779
780  // Initialize variables
781  order1_defined_bytes_array[o1_byte]=0;        //clear them
782  order1_max_cump_array[o1_byte]=0;
783
784  // Loop over all probabilities, divide them by a factor of 2 and update variables
785  for(counter=0 ; counter!=256 ; ++counter)
786    {
787    if(order1_array[o1_byte][counter]!=0)
788      {
789      order1_array[o1_byte][counter]>>=1;   //divide by a factor of 2
790      if(order1_array[o1_byte][counter]==0)
791        order1_array[o1_byte][counter]=1;  //don't let it have a 0 count
792      }
793
794    if(order1_array[o1_byte][counter]!=0) //see if it has a non zero probability
795      order1_defined_bytes_array[o1_byte]++;
796
797    order1_max_cump_array[o1_byte]+=order1_array[o1_byte][counter];      //sum to the total cump
798    }
799 }
800
801
802 // Decodes the symbol correspoding to the current order, it returns the byte
803 // or in case of an escape code or empty table it returns -1.
804 // It updates "coded_in_order".
805 void ppmc_decode_order1(void)
806 {
807  unsigned long current_cump, counter;
808
809
810  // First check if current order-1 table is empty
811  if(order1_defined_bytes_array[o1_byte]==0)  //it's empty
812    {
813    byte=-1;   //byte not coded, nothing done
814    return;
815    }
816
817
818  // Get the total cump needed for decoding symbol
819  ppmc_get_totf_order1();      //total cump needed for decoding
820
821  // It's possible that due to excluding, there's no byte left, in that case
822  // return.
823  if(exc_defined_bytes==0)
824    {
825    byte=-1;
826    return;
827    }
828
829  symb_cump=range_decoder_decode(&rc_decoder,exc_total_cump);        //decode it
830
831  // Now check if it's an escape code
832  if(symb_cump>=exc_max_cump)     //the defined code space for the escape code
833    {
834
835    // Update coding values
836
837    ppmc_get_escape_prob_order1();
838    range_decoder_update(&rc_decoder,exc_total_cump,symb_cump,symb_prob);
839
840
841    // Now update "exclude" table
842    for(counter=0;counter!=256;++counter)
843      if(order1_array[o1_byte][counter]!=0)
844        excluded[counter]=1;               //occurred but was not code, now exclude
845
846    // Mark as escape code (in fact nothing coded)
847
848    byte=-1;
849
850    return;   //an escape code
851    }
852  else
853    {
854    // Now we have to check what symbol it is
855
856    current_cump=0;      //cump of the current symbol
857
858    for(counter=0 ; counter!= 256 ; ++counter)
859      {
860      if(symb_cump<current_cump)
861        break;                  //symbol found, break search loop
862      if(excluded[counter]==0)
863        current_cump+=order1_array[o1_byte][counter];       //update cump
864      }
865
866    counter--;           //-1 (see ppmc.txt, searching for a given symbol)
867
868    byte=counter;        //update the variable with the found symbol
869
870
871    // Get the cump and prob of byte
872
873    symb_prob=order1_array[o1_byte][byte];        //the probabilty
874    symb_cump=current_cump-order1_array[o1_byte][byte]; //using the cump which was
875                                               //already made
876
877    // Update coding state
878
879    range_decoder_update(&rc_decoder,exc_total_cump,symb_cump,symb_prob);
880
881
882    // Update coded_in_order used for update exclusion
883
884    coded_in_order=1;
885
886    return;
887    }
888
889 }
890
891
892 // This function returns the probability for the escape codes in the variables
893 void ppmc_get_escape_prob_order1(void)
894 {
895  // To understand that remember that the escape allocated for the escape code
896  // is above the current maximum cump and that it has a probability determined
897  // by the scheme C.
898  symb_prob=exc_defined_bytes;
899  symb_cump=exc_max_cump;
900  total_cump=exc_defined_bytes+exc_max_cump;
901 }
902
903
904
905 // ORDER-2 functions
906 //
907 // Order-2 uses a table which holds the contexts data structure of every
908 // structure, its accessed with "ppmc_order2_hash_key(o1_byte, o2_byte)"
909 // and because it uses direct addressing there's no need to check for hash
910 // collisions, which makes it faster. The variable "o2_cntxt" contains o1_byte
911 // and o2_byte used directly to index the order-2 array.
912 //
913 // Though order-2 uses the same routines as lower orders they are rather
914 // different, because we can't allocate memory for all the probabilities
915 // tables, we have to use linked lists for the bytes and probabilities.
916 //
917 // Under order-2 we don't let a probability to be lower than 1, that is,
918 // there can't be a symbol in a linked list with a 0 probability, I choosed
919 // this for three factors: the code is easier to read (it isn't messy)
920 // we gain some speed, and the loss of compression seems little.
921 //
922 // To ensure that the updating is done correctly, "o2_cntxt" and
923 // "o2_ll_node" must not be modified by any routine except those who manage
924 // order-2.
925 //
926 // Order-2 uses exclusions. Exclusion values are always prepared in "get_totf"
927 // so there's no need to get them again. It does update the exclude table.
928
929
930 // Returns in the variable "total_cump" the current total cump of
931 // order-2. cntxt must have o1_byte and o2_byte hashed with the hash key
932 // for order-2.
933 //
934 // Here we have to compute both "exc_defined_bytes" and "exc_max_cump"
935 void ppmc_get_totf_order2(void)
936 {
937  struct _byte_and_freq *node;
938
939
940  // Read the whole linked list for making the values
941  node=order2_array[o2_cntxt].prob;
942  exc_max_cump=0;
943  exc_defined_bytes=0;
944
945  do{
946    if(excluded[node->byte]==0)
947      {
948      exc_defined_bytes++;
949      exc_max_cump+=node->freq;       //add the probability of this byte to the cump
950      }
951    if(node->next==0)
952      break;
953    node=node->next;             //next element in the linked list
954    }while(1);
955
956
957  // Total cump is current total cump plus the probability for the escape code
958  exc_total_cump=exc_max_cump+exc_defined_bytes;
959
960 }
961
962
963 // Codes a byte under order-2 and returns 1.
964 // Otherwise it returns a 0. It may be that it has coded an escape code, or
965 // that current table was empty.
966 //
967 // Returns: 1 in case a byte was coded. 0 in case of escape code or empty table.
968 // In case the byte is coded under this context, coded_in_order=2.
969 char ppmc_code_byte_order2(void)
970 {
971  unsigned long counter;
972  struct _byte_and_freq *node;
973
974
975  // Initialize o2_cntxt
976
977  o2_cntxt=ppmc_order2_hash_key(o1_byte,o2_byte);
978
979
980  // First check if current order-2 context is empty
981  if(order2_array[o2_cntxt].defined_bytes==0)  //it's empty
982    {
983    return 0;   //byte not coded, nothing done
984    }
985
986
987  // Now try to code this byte under order-2
988
989  ppmc_get_totf_order2();      //get total cump
990
991
992  // It's possible that due to exclusion, there's no byte left, in that case
993  // return.
994  if(exc_defined_bytes==0)
995    return 0;
996
997
998  // See if the byte is present and compute its cump at the same time
999
1000  node=order2_array[o2_cntxt].prob; //pointer to first element in the linked list
1001
1002  symb_cump=0;   //the first symbol always has a 0 cump
1003
1004
1005  // Now search the byte in the linked list
1006
1007  do{
1008    if(node->byte==byte)
1009      goto ppmc_o2_byte_found;   //bad thing, I know, anyone has a better idea?
1010    if(excluded[node->byte]==0)
1011      symb_cump+=node->freq;       //add the probability of this byte to the cump
1012    if(node->next==0)
1013      break;
1014    node=node->next;             //next element in the linked list
1015    }while(1);
1016
1017
1018  // If we reach that point, the byte was not found in the linked list
1019  // so we don't need the cump, we have to output an escape code, whose
1020  // probabilities are know using the context structure in the table.
1021
1022  // Byte was not present in the linked list, current node is the last one,
1023  // and that's the node needed for creating a new node, save it.
1024
1025  o2_ll_node=node;
1026
1027  // Now get the probability and cump of the escape code
1028
1029  symb_cump=exc_max_cump;
1030  symb_prob=exc_defined_bytes;
1031
1032  // Code the escape code
1033  range_coder_encode(&rc_coder,exc_total_cump,symb_cump,symb_prob);
1034
1035  // Then, update "excluded" table
1036
1037  node=order2_array[o2_cntxt].prob;
1038
1039  do{
1040    excluded[node->byte]=1;
1041    if(node->next==0)
1042      break;
1043    node=node->next;             //next element in the linked list
1044    }while(1);
1045
1046  return 0;      //now exit
1047
1048
1049  // That code is executed when the byte is found in the linked list
1050
1051  ppmc_o2_byte_found:
1052
1053
1054  // Everything has been tested, now we can feel free to code the byte,
1055  // the symb_cump is already computed, now get its probability and code
1056  // the byte, also save pointer to this element in the linked lists for
1057  // updating.
1058
1059  coded_in_order=2;      //successfully coded under order-2
1060
1061  o2_ll_node=node;       //save it for updating
1062
1063  symb_prob=node->freq;  //get the probability of the byte
1064
1065  // Code it.
1066
1067  range_coder_encode(&rc_coder,exc_total_cump,symb_cump,symb_prob);
1068
1069  return 1;      //byte coded under order-2
1070 }
1071
1072
1073 // This functions update order-2 probabilities with current byte, also takes
1074 // care about updating variables, and renormalizing.
1075 // Of course "o2_ll_node" must point to the element to update or the last one,
1076 // based on the "coded_in_order" and checking the pointer of the element we
1077 // can decide what to do.
1078 //
1079 // This updating is only for encoding.
1080 void ppmc_update_order2(void)
1081 {
1082  struct _byte_and_freq *node;
1083
1084
1085  // First of all check if that's the first byte in this context, in that case
1086  // we have to initialize some variables in the context structure.
1087
1088  if(order2_array[o2_cntxt].defined_bytes==0)    //no byte defined yet
1089    {
1090
1091    if(ppmc_out_of_memory==1)
1092     return;                //exit this function, we can't allocate memory
1093
1094    order2_array[o2_cntxt].defined_bytes=1;
1095    order2_array[o2_cntxt].max_cump=1;
1096    order2_array[o2_cntxt].prob=_bytes_pool;
1097
1098    _bytes_pool->byte=byte;          //initialize byte to current one
1099    _bytes_pool->freq=1;             //it appeared once
1100    _bytes_pool->next=0;             //now this is last element in ll
1101
1102    // Do update of linked list variables and memory use
1103
1104    ++_bytes_pool;           //next time use next entry (this is a pointer)
1105
1106    if(_bytes_pool==_bytes_pool_max)    //maximum reached
1107      {
1108
1109      // First check to see that we still have entries in the array
1110
1111      if(_bytes_pool_index==_mempool_max_index)
1112        {
1113        ppmc_out_of_memory=1;    //flush
1114        return;
1115        }
1116
1117      // Allocate memory for new buffer
1118
1119      if((_bytes_pool=(struct _byte_and_freq *)malloc
1120        (sizeof(struct _byte_and_freq)*_bytes_pool_elements_inc))==NULL)
1121        {
1122        printf("\nCan't allocate memory for bytes memory pool.\nIndex: %d",_bytes_pool_index);
1123        ppmc_out_of_memory=1;    //flush
1124        return;
1125        }
1126
1127      _bytes_pool_array[_bytes_pool_index]=_bytes_pool;
1128
1129      _bytes_pool_max=_bytes_pool+_bytes_pool_elements_inc;
1130
1131      _bytes_pool_index++;
1132
1133      }
1134
1135    return;      //nothing else to do
1136    }
1137
1138
1139  // The byte was coded under order two, otherwise it was coded under a
1140  // lower order (never higher ones, remember that we are using update
1141  // exclusion) in this case we have to create a new node in the list.
1142
1143  if(coded_in_order==2)  //coded under order-2
1144    {
1145
1146    // Update its count and variables of this context and check for renormalization
1147
1148    o2_ll_node->freq++;  //increment its frequency (rather probability)
1149
1150    order2_array[o2_cntxt].max_cump++;   //total cump
1151
1152    if(o2_ll_node->freq==255)    //do we have to renormalize?
1153      ppmc_renormalize_order2(); //renormalize
1154
1155    }
1156  else
1157    {
1158
1159    // Once every paranoid check has been done we are sure that this byte
1160    // did not existed and so we have to create a new node in the linked
1161    // list. Also we have to take care of memory issues.
1162    //
1163    // However due to the use of exclusion, we have to ensure that "o2_ll_node"
1164    // points to the last element in the linked lists of this context
1165
1166    node=order2_array[o2_cntxt].prob;    //get pointer to linked list
1167
1168    while(1)
1169      {
1170      if(node->next==0)          //check for the end of the linked list
1171        break;
1172      node=node->next;           //next node
1173      }
1174
1175    o2_ll_node=node;
1176
1177
1178    if(ppmc_out_of_memory==1)
1179      return;                //exit this function, we can't allocate mem
1180
1181    o2_ll_node->next=_bytes_pool;    //put it in the next free entry
1182    _bytes_pool->byte=byte;          //initialize byte to current one
1183    _bytes_pool->freq=1;             //it appeared once
1184    _bytes_pool->next=0;             //now this is last element in ll
1185
1186    order2_array[o2_cntxt].max_cump++;   //total cump
1187    order2_array[o2_cntxt].defined_bytes++;   //total cump
1188
1189    // Do update of linked list variables and memory use
1190
1191    ++_bytes_pool;           //next time use next entry (this is a pointer)
1192
1193    if(_bytes_pool==_bytes_pool_max)    //maximum reached
1194      {
1195
1196      // First check to see that we still have entries in the array
1197
1198      if(_bytes_pool_index==_mempool_max_index)
1199        {
1200        ppmc_out_of_memory=1;    //flush
1201        return;
1202        }
1203
1204      // Allocate memory for new buffer
1205
1206      if((_bytes_pool=(struct _byte_and_freq *)malloc
1207        (sizeof(struct _byte_and_freq)*_bytes_pool_elements_inc))==NULL)
1208        {
1209        printf("\nCan't allocate memory for bytes memory pool.\nIndex: %d",_bytes_pool_index);
1210        ppmc_out_of_memory=1;    //flush
1211        return;
1212        }
1213
1214      _bytes_pool_array[_bytes_pool_index]=_bytes_pool;
1215
1216      _bytes_pool_max=_bytes_pool+_bytes_pool_elements_inc;
1217
1218      _bytes_pool_index++;
1219
1220      }
1221
1222  }
1223
1224 }
1225
1226
1227 // This functions renormalizes the probabilities at order-2 updating context
1228 // variables.
1229 void ppmc_renormalize_order2(void)
1230 {
1231  unsigned long counter;
1232  struct _byte_and_freq *node;
1233
1234  // Initialize variables. Defined bytes remain the same.
1235  order2_array[o2_cntxt].max_cump=0;        //clear them
1236
1237  node=order2_array[o2_cntxt].prob;      //get pointer to lined lists
1238
1239  // Divide all the probabilities by 2 and update context variables
1240  while(1)
1241    {
1242    node->freq>>=1;                      //divide by a factor of 2
1243
1244    if(node->freq==0)    //don't allow a probability to be 0
1245      node->freq=1;
1246
1247    order2_array[o2_cntxt].max_cump+=node->freq; //sum to the total cump
1248
1249    if(node->next==0)    //last element
1250      break;
1251    node=node->next;
1252    }
1253
1254
1255  //printf("\nRenormalization, context:%c%c",o2_byte,o1_byte);
1256
1257 }
1258
1259
1260 // Decodes the symbol correspoding to the current order, it returns the byte
1261 // or in case of an escape code or empty table it returns -1.
1262 // It updates "coded_in_order".
1263 //
1264 // If we decode an escape code, we don't modify "o2_ll_node" and thus its
1265 // work of the updating routine to read till the end of the linked list
1266 // (for adding a new element) however if we decode a byte, we save on
1267 // "o2_ll_node" the pointer to its node. (so updating is faster)
1268 void ppmc_decode_order2(void)
1269 {
1270  unsigned long current_cump, counter;
1271  struct _byte_and_freq *node;
1272
1273  // Initialize o2_cntxt
1274
1275  o2_cntxt=ppmc_order2_hash_key(o1_byte,o2_byte);
1276
1277
1278  // First check if current order-2 context is empty
1279  if(order2_array[o2_cntxt].defined_bytes==0)  //it's empty
1280    {
1281    byte=-1;   //byte not coded, nothing done
1282    return;
1283    }
1284
1285
1286  // Get the total cump needed for decoding symbol
1287  ppmc_get_totf_order2();      //total cump needed for decoding
1288
1289
1290  // It's possible that due to exclusion, there's no byte left, in that case
1291  // return.
1292  if(exc_defined_bytes==0)
1293    {
1294    byte=-1;
1295    return;   //byte not coded, nothing done
1296    }
1297
1298
1299  symb_cump=range_decoder_decode(&rc_decoder,exc_total_cump);        //decode it
1300
1301  // Now check if it's an escape code
1302  if(symb_cump>=exc_max_cump)     //the defined code space for the escape code
1303    {
1304
1305    // Update coding values
1306
1307    ppmc_get_escape_prob_order2();
1308    range_decoder_update(&rc_decoder,exc_total_cump,symb_cump,symb_prob);
1309
1310    // Mark as escape code
1311
1312    byte=-1;
1313
1314    // Then, update "excluded" table
1315
1316    node=order2_array[o2_cntxt].prob;
1317
1318    do{
1319      excluded[node->byte]=1;
1320      if(node->next==0)
1321        break;
1322      node=node->next;             //next element in the linked list
1323      }while(1);
1324
1325    return;   //an escape code
1326    }
1327  else
1328    {
1329    // Now we have to check what symbol it is
1330
1331    current_cump=0;      //cump of the current symbol
1332
1333    node=order2_array[o2_cntxt].prob;    //get pointer to linked lists
1334
1335    while(1)
1336      {
1337      if(excluded[node->byte]==0)        //only if it's not excluded
1338        current_cump+=node->freq; //update cump
1339      if(symb_cump<current_cump)
1340        break;                  //symbol found, break search loop
1341
1342      node=node->next;          //next element
1343      //we have no need to check for the last symbol, we'll never read further
1344      //the end of the linked lists, before we'll found the last byte.
1345      }
1346
1347
1348    //read byte value and probability
1349
1350    symb_prob=node->freq;     //get the probability for updating the state
1351    byte=node->byte;          //get byte
1352    o2_ll_node=node;          //used for updating
1353
1354
1355    // Get the cump of byte
1356
1357    symb_cump=current_cump-symb_prob;
1358
1359    // Update coding state
1360
1361    range_decoder_update(&rc_decoder,exc_total_cump,symb_cump,symb_prob);
1362
1363    // Update coded_in_order used for update exclusion
1364
1365    coded_in_order=2;
1366
1367    return;
1368    }
1369
1370 }
1371
1372
1373 // This is the routine for updating while decoding. We have to search the byte
1374 // in the linked list, if it's present, update its count, otherwise we have
1375 // hitted the end of the linked list, and there we have to create a new node.
1376 //
1377 // Of course if the byte was matched in order-2 we'll have a pointer to it
1378 // in "o2_ll_node" so we don't need to read the linked list. (we already did
1379 // in decoding)
1380 //
1381 // Another case which we also have to specially deal with, this is the case
1382 // when the context has not been initalized yet.
1383 void ppmc_update_dec_order2(void)
1384 {
1385  struct _byte_and_freq *node;
1386
1387
1388  // Handle the case when the context is not initialized
1389  // This code is the same as the one for the encoding.
1390
1391  if(order2_array[o2_cntxt].defined_bytes==0)    //no byte defined yet
1392    {
1393
1394    if(ppmc_out_of_memory==1)
1395     return;                //exit this function, we can't allocate memory
1396
1397    order2_array[o2_cntxt].defined_bytes=1;
1398    order2_array[o2_cntxt].max_cump=1;
1399    order2_array[o2_cntxt].prob=_bytes_pool;
1400
1401    _bytes_pool->byte=byte;          //initialize byte to current one
1402    _bytes_pool->freq=1;             //it appeared once
1403    _bytes_pool->next=0;             //now this is last element in ll
1404
1405    // Do update of linked list variables and memory use
1406
1407    ++_bytes_pool;           //next time use next entry (this is a pointer)
1408
1409    if(_bytes_pool==_bytes_pool_max)    //maximum reached
1410      {
1411
1412      // First check to see that we still have entries in the array
1413
1414      if(_bytes_pool_index==_mempool_max_index)
1415        {
1416        ppmc_out_of_memory=1;    //flush
1417        return;
1418        }
1419
1420      // Allocate memory for new buffer
1421
1422      if((_bytes_pool=(struct _byte_and_freq *)malloc
1423        (sizeof(struct _byte_and_freq)*_bytes_pool_elements_inc))==NULL)
1424        {
1425        printf("\nCan't allocate memory for bytes memory pool.\nIndex: %d",_bytes_pool_index);
1426        ppmc_out_of_memory=1;    //flush
1427        return;
1428        }
1429
1430      _bytes_pool_array[_bytes_pool_index]=_bytes_pool;
1431
1432      _bytes_pool_max=_bytes_pool+_bytes_pool_elements_inc;
1433
1434      _bytes_pool_index++;
1435
1436      }
1437
1438
1439    return;      //nothing else to do
1440    }
1441
1442
1443  // Current context is initalized, proceed
1444
1445  if(coded_in_order==2)          //check if it was decoded under order-2
1446    {
1447
1448    // We can be sure that the pointer "o2_ll_node" points to its entry, and
1449    // it has a non 0 probability (otherwise it couldn't be coded) so just
1450    // update its probability and max_cump
1451
1452    o2_ll_node->freq++;          //the probability of the byte
1453    order2_array[o2_cntxt].max_cump++; //the max_cump
1454
1455    if(o2_ll_node->freq==255)    //check for renormalization
1456      ppmc_renormalize_order2();
1457
1458    }
1459  else
1460    {
1461
1462    // An escape code was decoded under order-2, we have to read till the
1463    // end of the linked list so we can add a new node for this new byte.
1464
1465    node=order2_array[o2_cntxt].prob;    //get pointer to linked list
1466
1467    while(1)
1468      {
1469      if(node->next==0)          //check for the end of the linked list
1470        break;
1471      node=node->next;           //next node
1472      }
1473
1474
1475    // We reached the end of the linked list, add a new node if possible,
1476    // we are using the same code of "ppmc_update_order2()" with the
1477    // difference that the pointer to the linked list is "node"
1478
1479    if(ppmc_out_of_memory==1)
1480      return;                //exit this function, we can't allocate mem
1481
1482    node->next=_bytes_pool;          //put it in the next free entry
1483    _bytes_pool->byte=byte;          //initialize byte to current one
1484    _bytes_pool->freq=1;             //it appeared once
1485    _bytes_pool->next=0;             //now this is last element in ll
1486
1487    order2_array[o2_cntxt].max_cump++;   //total cump
1488    order2_array[o2_cntxt].defined_bytes++;   //total cump
1489
1490    // Do update of linked list variables and memory use
1491
1492    ++_bytes_pool;           //next time use next entry (this is a pointer)
1493
1494    if(_bytes_pool==_bytes_pool_max)    //maximum reached
1495      {
1496
1497      // First check to see that we still have entries in the array
1498
1499      if(_bytes_pool_index==_mempool_max_index)
1500        {
1501        ppmc_out_of_memory=1;    //flush
1502        return;
1503        }
1504
1505      // Allocate memory for new buffer
1506
1507      if((_bytes_pool=(struct _byte_and_freq *)malloc
1508        (sizeof(struct _byte_and_freq)*_bytes_pool_elements_inc))==NULL)
1509        {
1510        printf("\nCan't allocate memory for bytes memory pool.\nIndex: %d",_bytes_pool_index);
1511        ppmc_out_of_memory=1;    //flush
1512        return;
1513        }
1514
1515      _bytes_pool_array[_bytes_pool_index]=_bytes_pool;
1516
1517      _bytes_pool_max=_bytes_pool+_bytes_pool_elements_inc;
1518
1519      _bytes_pool_index++;
1520
1521      }
1522
1523    return;      //we are finished updating
1524
1525    }
1526
1527 }
1528
1529
1530 // This function returns the probability for the escape codes in the variables
1531 void ppmc_get_escape_prob_order2(void)
1532 {
1533  // To understand that remember that the escape allocated for the escape code
1534  // is above the current maximum cump and that it has a probability determined
1535  // by the scheme C.
1536
1537  symb_prob=exc_defined_bytes;
1538  symb_cump=exc_max_cump;
1539 }
1540
1541
1542
1543 // ORDER-3 functions
1544 //
1545 // The difference between order-3 and order-3 are just a few, instead of
1546 // keeping a table with the context structures, we keep a hash table with
1547 // pointers to linked lists with the context, so it's only a matter of
1548 // searching current context in the linked list corresponding to its hash
1549 // entry. This is done in "ppmc_get_totf_order3" because that's the first
1550 // routine that both encoding and decoding routines call.
1551
1552
1553 // Returns in the variable "total_cump" the current total cump of
1554 // order-3. Must be called while encoding or decoding before anything else
1555 // because it initializes the pointers to the context structure in
1556 // "o3_context" and o3_cntxt.
1557 //
1558 // If the hash entry is not initialized it returns "o3_context"=0
1559 // If the context is not present in the linked list of context, "o3_context"
1560 // will point to the last element in the linked list.
1561 // If the context is present "o3_context" will point to the context to use.
1562 // One can distinguish the last two by checking the context value of the
1563 // structure, if it's not the same, is the last element.
1564 //
1565 // The routine returns 0 if the hash entry is not initialized or if the
1566 // the context was not present. Otherwise it returns 1, meaning that we
1567 // have to code under this context.
1568 char ppmc_get_totf_order3(void)
1569 {
1570  struct context *cntxt_node;
1571  struct _byte_and_freq *node;
1572
1573
1574  // First make the hash key for order-3
1575
1576  o3_cntxt=ppmc_order3_hash_key(o1_byte,o2_byte,o3_byte);
1577  full_o3_cntxt=(o1_byte)+(o2_byte<<8)+(o3_byte<<16);    //order-3
1578
1579
1580  // Now check the hash entry in the table
1581
1582  if(order3_hasht[o3_cntxt]==0)  //if 0, not initialized
1583    {
1584
1585    o3_context=0;        //no hash entry
1586
1587    return 0;    //hash entry not initialized
1588    }
1589
1590
1591  // Now read trough the linked list of context searching current one
1592
1593  cntxt_node=order3_hasht[o3_cntxt];
1594
1595  while(1)
1596    {
1597
1598    if(cntxt_node->order4321==full_o3_cntxt)     //compare context
1599      goto ppmc_gtf_cntxt_found;
1600
1601    if(cntxt_node->next==0)      //end of context's linked list
1602      break;
1603
1604    cntxt_node=cntxt_node->next; //next element
1605
1606    }
1607
1608
1609  // Once there the context was not found
1610  o3_context=cntxt_node;    //pointer to last element in the linked list
1611
1612  return 0;      //it was not present
1613
1614
1615  // The context is found, so return pointer and cump
1616
1617  ppmc_gtf_cntxt_found:
1618
1619  o3_context=cntxt_node;
1620
1621  // Read the whole linked list for making the values
1622  node=o3_context->prob;
1623  exc_max_cump=0;
1624  exc_defined_bytes=0;
1625
1626  do{
1627    if(excluded[node->byte]==0)
1628      {
1629      exc_defined_bytes++;
1630      exc_max_cump+=node->freq;       //add the probability of this byte to the cump
1631      }
1632    if(node->next==0)
1633      break;
1634    node=node->next;             //next element in the linked list
1635    }while(1);
1636
1637
1638  // Total cump is current total cump plus the probability for the escape code
1639  exc_total_cump=exc_max_cump+exc_defined_bytes;
1640
1641
1642  return 1;      //context found
1643
1644 }
1645
1646
1647 // Codes a byte under order-3 and returns 1.
1648 // Otherwise it returns a 0.
1649 //
1650 // In case the byte is coded under this context, coded_in_order=3.
1651 char ppmc_code_byte_order3(void)
1652 {
1653  unsigned long counter;
1654  struct _byte_and_freq *node;
1655
1656
1657  // Get current context (if present) and total cump.
1658
1659  if(ppmc_get_totf_order3()==0)
1660    return 0;
1661
1662
1663  // It's possible that due to exclusion, there's no byte left, in that case
1664  // return.
1665  if(exc_defined_bytes==0)
1666    return 0;
1667
1668
1669  // See if the byte is present and compute its cump at the same time
1670
1671  node=o3_context->prob; //pointer to first element in the linked list
1672
1673  symb_cump=0;   //the first symbol always has a 0 cump
1674
1675
1676  // Now search the byte in the linked list
1677
1678  do{
1679    if(node->byte==byte)
1680      goto ppmc_o3_byte_found;   //bad thing, I know, anyone has a better idea?
1681    if(excluded[node->byte]==0)
1682      symb_cump+=node->freq;       //add the probability of this byte to the cump
1683    if(node->next==0)
1684      break;
1685    node=node->next;             //next element in the linked list
1686    }while(1);
1687
1688
1689  // If we reach that point, the byte was not found in the linked list
1690  // so we don't need the cump, we have to output an escape code, whose
1691  // probabilities are know using the context structure in the table.
1692
1693  // Byte was not present in the linked list, current node is the last one,
1694  // and that's the node needed for creating a new node, save it.
1695
1696  o3_ll_node=node;
1697
1698  // Now get the probability and cump of the escape code
1699
1700  symb_cump=exc_max_cump;
1701  symb_prob=exc_defined_bytes;
1702
1703  // Code the escape code
1704  range_coder_encode(&rc_coder,exc_total_cump,symb_cump,symb_prob);
1705
1706  // Then, update "excluded" table
1707
1708  node=o3_context->prob;
1709
1710  do{
1711    excluded[node->byte]=1;
1712    if(node->next==0)
1713      break;
1714    node=node->next;             //next element in the linked list
1715    }while(1);
1716
1717  return 0;
1718
1719
1720  // That code is executed when the byte is found in the linked list
1721
1722  ppmc_o3_byte_found:
1723
1724
1725  // Everything has been tested, now we can feel free to code the byte,
1726  // the symb_cump is already computed, now get its probability and code
1727  // the byte, also save pointer to this element in the linked lists for
1728  // updating.
1729
1730  coded_in_order=3;      //successfully coded under order-3
1731
1732  o3_ll_node=node;       //save it for updating
1733
1734  symb_prob=node->freq;  //get the probability of the byte
1735
1736  // Code it.
1737
1738  range_coder_encode(&rc_coder,exc_total_cump,symb_cump,symb_prob);
1739
1740  return 1;      //byte coded under order-3
1741 }
1742
1743
1744 // This functions update order-3 probabilities with current byte, also takes
1745 // care about updating variables, and renormalizing.
1746 //
1747 // "o3_ll_node" must point to the element to update or the last one,
1748 // based on the "coded_in_order" and checking the pointer of the element we
1749 // can decide what to do. Also "o3_context" must be initialized.
1750 //
1751 // This updating is only for encoding.
1752 void ppmc_update_order3(void)
1753 {
1754  struct _byte_and_freq *node;
1755
1756
1757  // First thing first, check if the hash entry is initialized
1758
1759  if(order3_hasht[o3_cntxt]==0)    //no pointer to linked list defined yet
1760    {
1761
1762    if(ppmc_out_of_memory==1)
1763      return;                //exit this function, we can't allocate memory
1764
1765
1766    // First create the context
1767
1768    order3_hasht[o3_cntxt]=_context_pool;
1769
1770    _context_pool->next=0;       //this is the last element
1771    _context_pool->order4321=full_o3_cntxt;      //put context
1772    _context_pool->prob=_bytes_pool;             //pointer to linked list
1773    _context_pool->max_cump=1;
1774    _context_pool->defined_bytes=1;
1775
1776
1777    // Do update of linked list variables and memory use of contexts
1778
1779    ++_context_pool;           //next time use next entry (this is a pointer)
1780
1781    if(_context_pool==_context_pool_max)    //maximum reached
1782      {
1783
1784      // First check to see that we still have entries in the array
1785
1786      if(_context_pool_index==_mempool_max_index)
1787        {
1788        ppmc_out_of_memory=1;    //flush
1789        return;
1790        }
1791
1792      // Allocate memory for new buffer
1793
1794      if((_context_pool=(struct context *)malloc
1795        (sizeof(struct context)*_context_pool_elements_inc))==NULL)
1796        {
1797        printf("Can't allocate memory for context's memory pool.\nIndex: %d",_context_pool_index);
1798        ppmc_out_of_memory=1;    //flush
1799        return;
1800        }
1801
1802      _context_pool_array[_context_pool_index]=_context_pool;
1803
1804      _context_pool_max=_context_pool+_context_pool_elements_inc;
1805
1806      _context_pool_index++;
1807
1808      }
1809
1810
1811    // Now care about the first (and last) linked list element
1812
1813    _bytes_pool->byte=byte;          //initialize byte to current one
1814    _bytes_pool->freq=1;             //it appeared once
1815    _bytes_pool->next=0;             //now this is last element in ll
1816
1817    // Do update of linked list variables and memory use
1818
1819    ++_bytes_pool;           //next time use next entry (this is a pointer)
1820
1821    if(_bytes_pool==_bytes_pool_max)    //maximum reached
1822      {
1823
1824      // First check to see that we still have entries in the array
1825
1826      if(_bytes_pool_index==_mempool_max_index)
1827        {
1828        ppmc_out_of_memory=1;    //flush
1829        return;
1830        }
1831
1832      // Allocate memory for new buffer
1833
1834      if((_bytes_pool=(struct _byte_and_freq *)malloc
1835        (sizeof(struct _byte_and_freq)*_bytes_pool_elements_inc))==NULL)
1836        {
1837        printf("\nCan't allocate memory for bytes memory pool.\nIndex: %d",_bytes_pool_index);
1838        ppmc_out_of_memory=1;    //flush
1839        return;
1840        }
1841
1842      _bytes_pool_array[_bytes_pool_index]=_bytes_pool;
1843
1844      _bytes_pool_max=_bytes_pool+_bytes_pool_elements_inc;
1845
1846      _bytes_pool_index++;
1847
1848      }
1849
1850    return;      //nothing else to do
1851    }
1852
1853
1854
1855
1856  // The byte was coded under order three, otherwise it was coded under a
1857  // lower order (never higher ones, remember that we are using update
1858  // exclusion) in this case we have to create a new node in the list.
1859
1860  if(coded_in_order==3)  //coded under order-3
1861    {
1862
1863    // Update its count and variables of this context and check for renormalization
1864
1865    o3_ll_node->freq++;  //increment its frequency (rather probability)
1866
1867    o3_context->max_cump++;   //total cump
1868
1869    if(o3_ll_node->freq==255)    //do we have to renormalize?
1870      ppmc_renormalize_order3(); //renormalize
1871
1872    }
1873  else
1874    {
1875
1876    // Now we have two cases, under a given context (which we actually found)
1877    // we coded an escape coded, in that case just create a new node in the
1878    // linked list of bytes and probabilities. Otherwise we didn't find the
1879    // same node so we have to create it in the linked list for context.
1880    // And we can be sure that it at least has one element and that
1881    // "o3_context" points to the last element, so we can put the new element.
1882
1883    if(o3_context->order4321==full_o3_cntxt) //chech if that's the last
1884      {                                      //element or a context found
1885
1886      // However due to the use of exclusion, we have to ensure that "o3_ll_node"
1887      // points to the last element in the linked lists of this context
1888
1889      node=o3_context->prob;    //get pointer to linked list
1890
1891      while(1)
1892        {
1893        if(node->next==0)          //check for the end of the linked list
1894          break;
1895        node=node->next;           //next node
1896        }
1897
1898      o3_ll_node=node;
1899
1900      if(ppmc_out_of_memory==1)
1901        return;                //exit this function, we can't allocate mem
1902
1903      o3_ll_node->next=_bytes_pool;    //put it in the next free entry
1904      _bytes_pool->byte=byte;          //initialize byte to current one
1905      _bytes_pool->freq=1;             //it appeared once
1906      _bytes_pool->next=0;             //now this is last element in ll
1907
1908      o3_context->max_cump++;   //total cump
1909      o3_context->defined_bytes++;   //total cump
1910
1911      // Do update of linked list variables and memory use
1912
1913      ++_bytes_pool;           //next time use next entry (this is a pointer)
1914
1915      if(_bytes_pool==_bytes_pool_max)    //maximum reached
1916        {
1917
1918        // First check to see that we still have entries in the array
1919
1920        if(_bytes_pool_index==_mempool_max_index)
1921          {
1922          ppmc_out_of_memory=1;    //flush
1923          return;
1924          }
1925
1926        // Allocate memory for new buffer
1927
1928        if((_bytes_pool=(struct _byte_and_freq *)malloc
1929          (sizeof(struct _byte_and_freq)*_bytes_pool_elements_inc))==NULL)
1930          {
1931          printf("\nCan't allocate memory for bytes memory pool.\nIndex: %d",_bytes_pool_index);
1932          ppmc_out_of_memory=1;    //flush
1933          return;
1934          }
1935
1936        _bytes_pool_array[_bytes_pool_index]=_bytes_pool;
1937
1938        _bytes_pool_max=_bytes_pool+_bytes_pool_elements_inc;
1939
1940        _bytes_pool_index++;
1941
1942        }
1943      }
1944    else
1945      {
1946
1947      // Ensure that we are at the end of the linked list of contexts
1948      o3_context=order3_hasht[o3_cntxt];
1949
1950      do{
1951        if(o3_context->next==0)
1952          break;
1953        o3_context=o3_context->next;
1954        }while(1);
1955
1956      // We have to create a new context node
1957
1958      if(ppmc_out_of_memory==1)
1959        return;                //exit this function, we can't allocate memory
1960
1961
1962      // First create the context
1963
1964      o3_context->next=_context_pool;
1965
1966      _context_pool->next=0;       //this is the last element
1967      _context_pool->order4321=full_o3_cntxt;      //put context
1968      _context_pool->prob=_bytes_pool;             //pointer to linked list
1969      _context_pool->max_cump=1;
1970      _context_pool->defined_bytes=1;
1971
1972
1973      // Do update of linked list variables and memory use of contexts
1974
1975      ++_context_pool;           //next time use next entry (this is a pointer)
1976
1977      if(_context_pool==_context_pool_max)    //maximum reached
1978        {
1979
1980        // First check to see that we still have entries in the array
1981
1982        if(_context_pool_index==_mempool_max_index)
1983          {
1984          ppmc_out_of_memory=1;    //flush
1985          return;
1986          }
1987
1988        // Allocate memory for new buffer
1989
1990        if((_context_pool=(struct context *)malloc
1991          (sizeof(struct context)*_context_pool_elements_inc))==NULL)
1992          {
1993          printf("Can't allocate memory for context's memory pool.\nIndex: %d",_context_pool_index);
1994          ppmc_out_of_memory=1;    //flush
1995          return;
1996          }
1997
1998        _context_pool_array[_context_pool_index]=_context_pool;
1999
2000        _context_pool_max=_context_pool+_context_pool_elements_inc;
2001
2002        _context_pool_index++;
2003
2004        }
2005
2006      // Now care about the first (and last) linked list element
2007
2008      _bytes_pool->byte=byte;          //initialize byte to current one
2009      _bytes_pool->freq=1;             //it appeared once
2010      _bytes_pool->next=0;             //now this is last element in ll
2011
2012      // Do update of linked list variables and memory use
2013
2014      ++_bytes_pool;           //next time use next entry (this is a pointer)
2015
2016      if(_bytes_pool==_bytes_pool_max)    //maximum reached
2017        {
2018
2019        // First check to see that we still have entries in the array
2020
2021        if(_bytes_pool_index==_mempool_max_index)
2022          {
2023          ppmc_out_of_memory=1;    //flush
2024          return;
2025          }
2026
2027        // Allocate memory for new buffer
2028
2029        if((_bytes_pool=(struct _byte_and_freq *)malloc
2030          (sizeof(struct _byte_and_freq)*_bytes_pool_elements_inc))==NULL)
2031          {
2032          printf("\nCan't allocate memory for bytes memory pool.\nIndex: %d",_bytes_pool_index);
2033          ppmc_out_of_memory=1;    //flush
2034          return;
2035          }
2036
2037        _bytes_pool_array[_bytes_pool_index]=_bytes_pool;
2038
2039        _bytes_pool_max=_bytes_pool+_bytes_pool_elements_inc;
2040
2041        _bytes_pool_index++;
2042
2043        }
2044
2045      }
2046
2047  }
2048
2049 }
2050
2051
2052 // This functions renormalizes the probabilities at order-3 updating context
2053 // variables.
2054 void ppmc_renormalize_order3(void)
2055 {
2056  unsigned long counter;
2057  struct _byte_and_freq *node;
2058
2059
2060  // Initialize variables. Defined bytes remain the same.
2061  o3_context->max_cump=0;        //clear them
2062
2063  node=o3_context->prob;      //get pointer to lined lists
2064
2065  // Divide all the probabilities by 2 and update context variables
2066  while(1)
2067    {
2068    node->freq>>=1;                      //divide by a factor of 2
2069
2070    if(node->freq==0)    //don't allow a probability to be 0
2071      node->freq=1;
2072
2073    o3_context->max_cump+=node->freq; //sum to the total cump
2074
2075    if(node->next==0)    //last element
2076      break;
2077    node=node->next;
2078    }
2079
2080
2081 }
2082
2083
2084 // Decodes the symbol correspoding to the current order, it returns the byte
2085 // or in case of an escape code or empty table it returns -1.
2086 // It updates "coded_in_order".
2087 //
2088 // If we decode an escape code, we don't modify "o3_ll_node" and thus its
2089 // work of the updating routine to read till the end of the linked list
2090 // (for adding a new element) however if we decode a byte, we save on
2091 // "o3_ll_node" the pointer to its node. (so updating is faster)
2092 void ppmc_decode_order3(void)
2093 {
2094  unsigned long current_cump, counter;
2095  struct _byte_and_freq *node;
2096
2097
2098  // Get current context (if present) and total cump.
2099
2100  if(ppmc_get_totf_order3()==0)
2101    {
2102    byte=-1;
2103    return;
2104    }
2105
2106  // It's possible that due to exclusion, there's no byte left, in that case
2107  // return.
2108  if(exc_defined_bytes==0)
2109    {
2110    byte=-1;
2111    return;
2112    }
2113
2114
2115
2116  // Decode current cump
2117
2118  symb_cump=range_decoder_decode(&rc_decoder,exc_total_cump);        //decode it
2119
2120  // Now check if it's an escape code
2121  if(symb_cump>=exc_max_cump)     //the defined code space for the escape code
2122    {
2123
2124    // Update coding values
2125
2126    ppmc_get_escape_prob_order3();
2127    range_decoder_update(&rc_decoder,exc_total_cump,symb_cump,symb_prob);
2128
2129    // Mark as escape code
2130
2131    byte=-1;
2132
2133    // Then, update "excluded" table
2134
2135    node=o3_context->prob;
2136
2137    do{
2138      excluded[node->byte]=1;
2139      if(node->next==0)
2140        break;
2141      node=node->next;             //next element in the linked list
2142      }while(1);
2143
2144    return;   //an escape code
2145    }
2146  else
2147    {
2148    // Now we have to check what symbol it is
2149
2150    current_cump=0;      //cump of the current symbol
2151
2152    node=o3_context->prob;    //get pointer to linked lists
2153
2154    while(1)
2155      {
2156      if(excluded[node->byte]==0)
2157        current_cump+=node->freq; //update cump
2158      if(symb_cump<current_cump)
2159        break;                  //symbol found, break search loop
2160
2161      node=node->next;          //next element
2162      //we have no need to check for the last symbol, we'll never read further
2163      //the end of the linked lists, before we'll found the last byte.
2164      }
2165
2166
2167    //read byte value and probability
2168
2169    symb_prob=node->freq;     //get the probability for updating the state
2170    byte=node->byte;          //get byte
2171    o3_ll_node=node;          //used for updating
2172
2173
2174    // Get the cump of byte
2175
2176    symb_cump=current_cump-symb_prob;
2177
2178    // Update coding state
2179
2180    range_decoder_update(&rc_decoder,exc_total_cump,symb_cump,symb_prob);
2181
2182    // Update coded_in_order used for update exclusion
2183
2184    coded_in_order=3;
2185
2186    return;
2187    }
2188
2189 }
2190
2191
2192 // This is the routine for updating while decoding. The only difference with
2193 // the routine for coding is that when an escape code was coded, "o3_ll_node"
2194 // is not initialized so we have to read till the end of the linked list.
2195 // Fortunately "o3_context" will be initialized so we don't need to read its
2196 // linked list.
2197 void ppmc_update_dec_order3(void)
2198 {
2199  struct _byte_and_freq *node;
2200
2201  // First thing first, check if the hash entry is initialized
2202
2203  if(order3_hasht[o3_cntxt]==0)    //no pointer to linked list defined yet
2204    {
2205
2206    if(ppmc_out_of_memory==1)
2207      return;                //exit this function, we can't allocate memory
2208
2209
2210    // First create the context
2211
2212    order3_hasht[o3_cntxt]=_context_pool;
2213
2214    _context_pool->next=0;       //this is the last element
2215    _context_pool->order4321=full_o3_cntxt;      //put context
2216    _context_pool->prob=_bytes_pool;             //pointer to linked list
2217    _context_pool->max_cump=1;
2218    _context_pool->defined_bytes=1;
2219
2220
2221    // Do update of linked list variables and memory use of contexts
2222
2223    ++_context_pool;           //next time use next entry (this is a pointer)
2224
2225    if(_context_pool==_context_pool_max)    //maximum reached
2226      {
2227
2228      // First check to see that we still have entries in the array
2229
2230      if(_context_pool_index==_mempool_max_index)
2231        {
2232        ppmc_out_of_memory=1;    //flush
2233        return;
2234        }
2235
2236      // Allocate memory for new buffer
2237
2238      if((_context_pool=(struct context *)malloc
2239        (sizeof(struct context)*_context_pool_elements_inc))==NULL)
2240        {
2241        printf("Can't allocate memory for context's memory pool.\nIndex: %d",_context_pool_index);
2242        ppmc_out_of_memory=1;    //flush
2243        return;
2244        }
2245
2246      _context_pool_array[_context_pool_index]=_context_pool;
2247
2248      _context_pool_max=_context_pool+_context_pool_elements_inc;
2249
2250      _context_pool_index++;
2251
2252      }
2253
2254    // Now care about the first (and last) linked list element
2255
2256    _bytes_pool->byte=byte;          //initialize byte to current one
2257    _bytes_pool->freq=1;             //it appeared once
2258    _bytes_pool->next=0;             //now this is last element in ll
2259
2260    // Do update of linked list variables and memory use
2261
2262    ++_bytes_pool;           //next time use next entry (this is a pointer)
2263
2264    if(_bytes_pool==_bytes_pool_max)    //maximum reached
2265      {
2266
2267      // First check to see that we still have entries in the array
2268
2269      if(_bytes_pool_index==_mempool_max_index)
2270        {
2271        ppmc_out_of_memory=1;    //flush
2272        return;
2273        }
2274
2275      // Allocate memory for new buffer
2276
2277      if((_bytes_pool=(struct _byte_and_freq *)malloc
2278        (sizeof(struct _byte_and_freq)*_bytes_pool_elements_inc))==NULL)
2279        {
2280        printf("\nCan't allocate memory for bytes memory pool.\nIndex: %d",_bytes_pool_index);
2281        ppmc_out_of_memory=1;    //flush
2282        return;
2283        }
2284
2285      _bytes_pool_array[_bytes_pool_index]=_bytes_pool;
2286
2287      _bytes_pool_max=_bytes_pool+_bytes_pool_elements_inc;
2288
2289      _bytes_pool_index++;
2290
2291      }
2292
2293    return;      //nothing else to do
2294    }
2295
2296
2297  // The byte was coded under order three, otherwise it was coded under a
2298  // lower order (never higher ones, remember that we are using update
2299  // exclusion) in this case we have to create a new node in the list.
2300
2301  if(coded_in_order==3)  //coded under order-3
2302    {
2303
2304    // Update its count and variables of this context and check for renormalization
2305
2306    o3_ll_node->freq++;  //increment its frequency (rather probability)
2307
2308    o3_context->max_cump++;   //total cump
2309
2310    if(o3_ll_node->freq==255)    //do we have to renormalize?
2311      ppmc_renormalize_order3(); //renormalize
2312
2313    }
2314  else
2315    {
2316
2317    // Now we have two cases, under a given context (which we actually found)
2318    // we coded an escape coded, in that case just create a new node in the
2319    // linked list of bytes and probabilities. Otherwise we didn't find the
2320    // same node so we have to create it in the linked list for context.
2321    // And we can be sure that it at least has one element and that
2322    // "o3_context" points to the last element, so we can put the new element.
2323
2324    if(o3_context->order4321==full_o3_cntxt) //chech if that's the last
2325      {                                      //element or the a context found
2326
2327      // Read till the end of the linked list
2328
2329      node=o3_context->prob;    //get pointer to linked list
2330
2331      while(1)
2332        {
2333        if(node->next==0)          //check for the end of the linked list
2334          break;
2335        node=node->next;           //next node
2336        }
2337
2338      // Now add element
2339
2340      if(ppmc_out_of_memory==1)
2341        return;                //exit this function, we can't allocate mem
2342
2343      node->next=_bytes_pool;          //put it in the next free entry
2344      _bytes_pool->byte=byte;          //initialize byte to current one
2345      _bytes_pool->freq=1;             //it appeared once
2346      _bytes_pool->next=0;             //now this is last element in ll
2347
2348      o3_context->max_cump++;   //total cump
2349      o3_context->defined_bytes++;   //total cump
2350
2351      // Do update of linked list variables and memory use
2352
2353      ++_bytes_pool;           //next time use next entry (this is a pointer)
2354
2355      if(_bytes_pool==_bytes_pool_max)    //maximum reached
2356        {
2357
2358        // First check to see that we still have entries in the array
2359
2360        if(_bytes_pool_index==_mempool_max_index)
2361          {
2362          ppmc_out_of_memory=1;    //flush
2363          return;
2364          }
2365
2366        // Allocate memory for new buffer
2367
2368        if((_bytes_pool=(struct _byte_and_freq *)malloc
2369          (sizeof(struct _byte_and_freq)*_bytes_pool_elements_inc))==NULL)
2370          {
2371          printf("\nCan't allocate memory for bytes memory pool.\nIndex: %d",_bytes_pool_index);
2372          ppmc_out_of_memory=1;    //flush
2373          return;
2374          }
2375
2376        _bytes_pool_array[_bytes_pool_index]=_bytes_pool;
2377
2378        _bytes_pool_max=_bytes_pool+_bytes_pool_elements_inc;
2379
2380        _bytes_pool_index++;
2381
2382        }
2383      }
2384    else
2385      {
2386
2387      // We have to create a new context node
2388
2389      if(ppmc_out_of_memory==1)
2390        return;                //exit this function, we can't allocate memory
2391
2392
2393      // First create the context
2394
2395      o3_context->next=_context_pool;
2396
2397      _context_pool->next=0;       //this is the last element
2398      _context_pool->order4321=full_o3_cntxt;      //put context
2399      _context_pool->prob=_bytes_pool;             //pointer to linked list
2400      _context_pool->max_cump=1;
2401      _context_pool->defined_bytes=1;
2402
2403
2404      // Do update of linked list variables and memory use of contexts
2405
2406      ++_context_pool;           //next time use next entry (this is a pointer)
2407
2408      if(_context_pool==_context_pool_max)    //maximum reached
2409        {
2410
2411        // First check to see that we still have entries in the array
2412
2413        if(_context_pool_index==_mempool_max_index)
2414          {
2415          ppmc_out_of_memory=1;    //flush
2416          return;
2417          }
2418
2419        // Allocate memory for new buffer
2420
2421        if((_context_pool=(struct context *)malloc
2422          (sizeof(struct context)*_context_pool_elements_inc))==NULL)
2423          {
2424          printf("Can't allocate memory for context's memory pool.");
2425          exit(1);
2426          }
2427
2428        _context_pool_array[_context_pool_index]=_context_pool;
2429
2430        _context_pool_max=_context_pool+_context_pool_elements_inc;
2431
2432        _context_pool_index++;
2433
2434        }
2435
2436      // Now care about the first (and last) linked list element
2437
2438      _bytes_pool->byte=byte;          //initialize byte to current one
2439      _bytes_pool->freq=1;             //it appeared once
2440      _bytes_pool->next=0;             //now this is last element in ll
2441
2442      // Do update of linked list variables and memory use
2443
2444      ++_bytes_pool;           //next time use next entry (this is a pointer)
2445
2446      if(_bytes_pool==_bytes_pool_max)    //maximum reached
2447        {
2448
2449        // First check to see that we still have entries in the array
2450
2451        if(_bytes_pool_index==_mempool_max_index)
2452          {
2453          ppmc_out_of_memory=1;    //flush
2454          return;
2455          }
2456
2457        // Allocate memory for new buffer
2458
2459        if((_bytes_pool=(struct _byte_and_freq *)malloc
2460          (sizeof(struct _byte_and_freq)*_bytes_pool_elements_inc))==NULL)
2461          {
2462          printf("\nCan't allocate memory for bytes memory pool.\nIndex: %d",_bytes_pool_index);
2463          ppmc_out_of_memory=1;    //flush
2464          return;
2465          }
2466
2467        _bytes_pool_array[_bytes_pool_index]=_bytes_pool;
2468
2469        _bytes_pool_max=_bytes_pool+_bytes_pool_elements_inc;
2470
2471        _bytes_pool_index++;
2472
2473        }
2474
2475      }
2476
2477  }
2478
2479 }
2480
2481
2482
2483 // This function returns the probability for the escape codes in the variables
2484 void ppmc_get_escape_prob_order3(void)
2485 {
2486  // To understand that remember that the escape allocated for the escape code
2487  // is above the current maximum cump and that it has a probability determined
2488  // by the scheme C.
2489
2490  symb_prob=exc_defined_bytes;
2491  symb_cump=exc_max_cump;
2492 }
2493
2494
2495
2496 // ORDER-4 functions
2497 //
2498 // The routines for order-4 are *equal* to those for order-3, there are a few
2499 // changes like different global variables, and different hash keys.
2500 //
2501 // If you want to go to higher orders, you'd use the same code and data
2502 // structures, with the difference of the context bytes (order4321)
2503 // stored in every context's linked list.
2504
2505
2506 // Returns in the variable "total_cump" the current total cump of
2507 // order-4. Must be called while encoding or decoding before anything else
2508 // because it initializes the pointers to the context structure in
2509 // "o4_context" and o4_cntxt.
2510 //
2511 // If the hash entry is not initialized it returns "o4_context"=0
2512 // If the context is not present in the linked list of context, "o4_context"
2513 // will point to the last element in the linked list.
2514 // If the context is present "o4_context" will point to the context to use.
2515 // One can distinguish the last two by checking the context value of the
2516 // structure, if it's not the same, is the last element.
2517 //
2518 // The routine returns 0 if the hash entry is not initialized or if the
2519 // the context was not present. Otherwise it returns 1, meaning that we
2520 // have to code under this context.
2521 char ppmc_get_totf_order4(void)
2522 {
2523  struct context *cntxt_node;
2524  struct _byte_and_freq *node;
2525
2526
2527  // First make the hash key for order-4
2528
2529  o4_cntxt=ppmc_order4_hash_key(o1_byte,o2_byte,o3_byte,o4_byte);
2530  full_o4_cntxt=(o1_byte)+(o2_byte<<8)+(o3_byte<<16)+(o4_byte<<24);    //order-4
2531
2532
2533  // Now check the hash entry in the table
2534
2535  if(order4_hasht[o4_cntxt]==0)  //if 0, not initialized
2536    {
2537
2538    o4_context=0;        //no hash entry
2539
2540    return 0;    //hash entry not initialized
2541    }
2542
2543
2544  // Now read trough the linked list of context searching current one
2545
2546  cntxt_node=order4_hasht[o4_cntxt];
2547
2548  while(1)
2549    {
2550
2551    if(cntxt_node->order4321==full_o4_cntxt)     //compare context
2552      goto ppmc_gtfo4_cntxt_found;
2553
2554    if(cntxt_node->next==0)      //end of context's linked list
2555      break;
2556
2557    cntxt_node=cntxt_node->next; //next element
2558
2559    }
2560
2561
2562  // Once there the context was not found
2563  o4_context=cntxt_node;    //pointer to last element in the linked list
2564
2565  return 0;      //it was not present
2566
2567
2568  // The context is found, so return pointer and cump
2569
2570  ppmc_gtfo4_cntxt_found:
2571
2572  o4_context=cntxt_node;
2573
2574  // Read the whole linked list for making the values
2575  node=o4_context->prob;
2576  exc_max_cump=0;
2577  exc_defined_bytes=0;
2578
2579  do{
2580    if(excluded[node->byte]==0)
2581      {
2582      exc_defined_bytes++;
2583      exc_max_cump+=node->freq;       //add the probability of this byte to the cump
2584      }
2585    if(node->next==0)
2586      break;
2587    node=node->next;             //next element in the linked list
2588    }while(1);
2589
2590
2591  // Total cump is current total cump plus the probability for the escape code
2592  exc_total_cump=exc_max_cump+exc_defined_bytes;
2593
2594
2595  return 1;      //context found
2596
2597 }
2598
2599
2600 // Codes a byte under order-4 and returns 1.
2601 // Otherwise it returns a 0.
2602 //
2603 // In case the byte is coded under this context, coded_in_order=4.
2604 char ppmc_code_byte_order4(void)
2605 {
2606  unsigned long counter;
2607  struct _byte_and_freq *node;
2608
2609
2610  // Get current context (if present) and total cump.
2611
2612  if(ppmc_get_totf_order4()==0)
2613    return 0;
2614
2615
2616  // It's possible that due to exclusion, there's no byte left, in that case
2617  // return.
2618  if(exc_defined_bytes==0)
2619    return 0;
2620
2621
2622  // See if the byte is present and compute its cump at the same time
2623
2624  node=o4_context->prob; //pointer to first element in the linked list
2625
2626  symb_cump=0;   //the first symbol always has a 0 cump
2627
2628
2629  // Now search the byte in the linked list
2630
2631  do{
2632    if(node->byte==byte)
2633      goto ppmc_o4_byte_found;   //bad thing, I know, anyone has a better idea?
2634    if(excluded[node->byte]==0)
2635      symb_cump+=node->freq;       //add the probability of this byte to the cump
2636    if(node->next==0)
2637      break;
2638    node=node->next;             //next element in the linked list
2639    }while(1);
2640
2641
2642  // If we reach that point, the byte was not found in the linked list
2643  // so we don't need the cump, we have to output an escape code, whose
2644  // probabilities are know using the context structure in the table.
2645
2646  // Byte was not present in the linked list, current node is the last one,
2647  // and that's the node needed for creating a new node, save it.
2648
2649  o4_ll_node=node;
2650
2651  // Now get the probability and cump of the escape code
2652
2653  symb_cump=exc_max_cump;
2654  symb_prob=exc_defined_bytes;
2655
2656  // Code the escape code
2657  range_coder_encode(&rc_coder,exc_total_cump,symb_cump,symb_prob);
2658
2659  // Then, update "excluded" table
2660
2661  node=o4_context->prob;
2662
2663  do{
2664    excluded[node->byte]=1;
2665    if(node->next==0)
2666      break;
2667    node=node->next;             //next element in the linked list
2668    }while(1);
2669
2670  return 0;
2671
2672
2673  // That code is executed when the byte is found in the linked list
2674
2675  ppmc_o4_byte_found:
2676
2677
2678  // Everything has been tested, now we can feel free to code the byte,
2679  // the symb_cump is already computed, now get its probability and code
2680  // the byte, also save pointer to this element in the linked lists for
2681  // updating.
2682
2683  coded_in_order=4;      //successfully coded under order-4
2684
2685  o4_ll_node=node;       //save it for updating
2686
2687  symb_prob=node->freq;  //get the probability of the byte
2688
2689  // Code it.
2690
2691  range_coder_encode(&rc_coder,exc_total_cump,symb_cump,symb_prob);
2692
2693  return 1;      //byte coded under order-4
2694 }
2695
2696
2697 // This functions update order-4 probabilities with current byte, also takes
2698 // care about updating variables, and renormalizing.
2699 //
2700 // "o4_ll_node" must point to the element to update or the last one,
2701 // based on the "coded_in_order" and checking the pointer of the element we
2702 // can decide what to do. Also "o4_context" must be initialized.
2703 //
2704 // This updating is only for encoding.
2705 void ppmc_update_order4(void)
2706 {
2707
2708  // First thing first, check if the hash entry is initialized
2709
2710  if(order4_hasht[o4_cntxt]==0)    //no pointer to linked list defined yet
2711    {
2712
2713    if(ppmc_out_of_memory==1)
2714      return;                //exit this function, we can't allocate memory
2715
2716
2717    // First create the context
2718
2719    order4_hasht[o4_cntxt]=_context_pool;
2720
2721    _context_pool->next=0;       //this is the last element
2722    _context_pool->order4321=full_o4_cntxt;      //put context
2723    _context_pool->prob=_bytes_pool;             //pointer to linked list
2724    _context_pool->max_cump=1;
2725    _context_pool->defined_bytes=1;
2726
2727
2728    // Do update of linked list variables and memory use of contexts
2729
2730    ++_context_pool;           //next time use next entry (this is a pointer)
2731
2732    if(_context_pool==_context_pool_max)    //maximum reached
2733      {
2734
2735      // First check to see that we still have entries in the array
2736
2737      if(_context_pool_index==_mempool_max_index)
2738        {
2739        ppmc_out_of_memory=1;    //flush
2740        return;
2741        }
2742
2743      // Allocate memory for new buffer
2744
2745      if((_context_pool=(struct context *)malloc
2746        (sizeof(struct context)*_context_pool_elements_inc))==NULL)
2747        {
2748        printf("Can't allocate memory for context's memory pool.");
2749        exit(1);
2750        }
2751
2752      _context_pool_array[_context_pool_index]=_context_pool;
2753
2754      _context_pool_max=_context_pool+_context_pool_elements_inc;
2755
2756      _context_pool_index++;
2757
2758      }
2759
2760
2761    // Now care about the first (and last) linked list element
2762
2763    _bytes_pool->byte=byte;          //initialize byte to current one
2764    _bytes_pool->freq=1;             //it appeared once
2765    _bytes_pool->next=0;             //now this is last element in ll
2766
2767    // Do update of linked list variables and memory use
2768
2769    ++_bytes_pool;           //next time use next entry (this is a pointer)
2770
2771    if(_bytes_pool==_bytes_pool_max)    //maximum reached
2772      {
2773
2774      // First check to see that we still have entries in the array
2775
2776      if(_bytes_pool_index==_mempool_max_index)
2777        {
2778        ppmc_out_of_memory=1;    //flush
2779        return;
2780        }
2781
2782      // Allocate memory for new buffer
2783
2784      if((_bytes_pool=(struct _byte_and_freq *)malloc
2785        (sizeof(struct _byte_and_freq)*_bytes_pool_elements_inc))==NULL)
2786        {
2787        printf("\nCan't allocate memory for bytes memory pool.\nIndex: %d",_bytes_pool_index);
2788        ppmc_out_of_memory=1;    //flush
2789        return;
2790        }
2791
2792      _bytes_pool_array[_bytes_pool_index]=_bytes_pool;
2793
2794      _bytes_pool_max=_bytes_pool+_bytes_pool_elements_inc;
2795
2796      _bytes_pool_index++;
2797
2798      }
2799
2800    return;      //nothing else to do
2801    }
2802
2803
2804
2805
2806  // The byte was coded under order three, otherwise it was coded under a
2807  // lower order (never higher ones, remember that we are using update
2808  // exclusion) in this case we have to create a new node in the list.
2809
2810  if(coded_in_order==4)  //coded under order-4
2811    {
2812
2813    // Update its count and variables of this context and check for renormalization
2814
2815    o4_ll_node->freq++;  //increment its frequency (rather probability)
2816
2817    o4_context->max_cump++;   //total cump
2818
2819    if(o4_ll_node->freq==255)    //do we have to renormalize?
2820      ppmc_renormalize_order4(); //renormalize
2821
2822    }
2823  else
2824    {
2825
2826    // Now we have two cases, under a given context (which we actually found)
2827    // we coded an escape coded, in that case just create a new node in the
2828    // linked list of bytes and probabilities. Otherwise we didn't find the
2829    // same node so we have to create it in the linked list for context.
2830    // And we can be sure that it at least has one element and that
2831    // "o4_context" points to the last element, so we can put the new element.
2832
2833    if(o4_context->order4321==full_o4_cntxt) //chech if that's the last
2834      {                                      //element or the a context found
2835
2836      if(ppmc_out_of_memory==1)
2837        return;                //exit this function, we can't allocate mem
2838
2839      o4_ll_node->next=_bytes_pool;    //put it in the next free entry
2840      _bytes_pool->byte=byte;          //initialize byte to current one
2841      _bytes_pool->freq=1;             //it appeared once
2842      _bytes_pool->next=0;             //now this is last element in ll
2843
2844      o4_context->max_cump++;   //total cump
2845      o4_context->defined_bytes++;   //total cump
2846
2847      // Do update of linked list variables and memory use
2848
2849      ++_bytes_pool;           //next time use next entry (this is a pointer)
2850
2851      if(_bytes_pool==_bytes_pool_max)    //maximum reached
2852        {
2853
2854        // First check to see that we still have entries in the array
2855
2856        if(_bytes_pool_index==_mempool_max_index)
2857          {
2858          ppmc_out_of_memory=1;    //flush
2859          return;
2860          }
2861
2862        // Allocate memory for new buffer
2863
2864        if((_bytes_pool=(struct _byte_and_freq *)malloc
2865          (sizeof(struct _byte_and_freq)*_bytes_pool_elements_inc))==NULL)
2866          {
2867          printf("\nCan't allocate memory for bytes memory pool.\nIndex: %d",_bytes_pool_index);
2868          ppmc_out_of_memory=1;    //flush
2869          return;
2870          }
2871
2872        _bytes_pool_array[_bytes_pool_index]=_bytes_pool;
2873
2874        _bytes_pool_max=_bytes_pool+_bytes_pool_elements_inc;
2875
2876        _bytes_pool_index++;
2877
2878        }
2879      }
2880    else
2881      {
2882
2883      // We have to create a new context node
2884
2885      if(ppmc_out_of_memory==1)
2886        return;                //exit this function, we can't allocate memory
2887
2888
2889      // First create the context
2890
2891      o4_context->next=_context_pool;
2892
2893      _context_pool->next=0;       //this is the last element
2894      _context_pool->order4321=full_o4_cntxt;      //put context
2895      _context_pool->prob=_bytes_pool;             //pointer to linked list
2896      _context_pool->max_cump=1;
2897      _context_pool->defined_bytes=1;
2898
2899
2900      // Do update of linked list variables and memory use of contexts
2901
2902      ++_context_pool;           //next time use next entry (this is a pointer)
2903
2904      if(_context_pool==_context_pool_max)    //maximum reached
2905        {
2906
2907        // First check to see that we still have entries in the array
2908
2909        if(_context_pool_index==_mempool_max_index)
2910          {
2911          ppmc_out_of_memory=1;    //flush
2912          return;
2913          }
2914
2915        // Allocate memory for new buffer
2916
2917        if((_context_pool=(struct context *)malloc
2918          (sizeof(struct context)*_context_pool_elements_inc))==NULL)
2919          {
2920          printf("Can't allocate memory for context's memory pool.");
2921          exit(1);
2922          }
2923
2924        _context_pool_array[_context_pool_index]=_context_pool;
2925
2926        _context_pool_max=_context_pool+_context_pool_elements_inc;
2927
2928        _context_pool_index++;
2929
2930        }
2931
2932      // Now care about the first (and last) linked list element
2933
2934      _bytes_pool->byte=byte;          //initialize byte to current one
2935      _bytes_pool->freq=1;             //it appeared once
2936      _bytes_pool->next=0;             //now this is last element in ll
2937
2938      // Do update of linked list variables and memory use
2939
2940      ++_bytes_pool;           //next time use next entry (this is a pointer)
2941
2942      if(_bytes_pool==_bytes_pool_max)    //maximum reached
2943        {
2944
2945        // First check to see that we still have entries in the array
2946
2947        if(_bytes_pool_index==_mempool_max_index)
2948          {
2949          ppmc_out_of_memory=1;    //flush
2950          return;
2951          }
2952
2953        // Allocate memory for new buffer
2954
2955        if((_bytes_pool=(struct _byte_and_freq *)malloc
2956          (sizeof(struct _byte_and_freq)*_bytes_pool_elements_inc))==NULL)
2957          {
2958          printf("\nCan't allocate memory for bytes memory pool.\nIndex: %d",_bytes_pool_index);
2959          ppmc_out_of_memory=1;    //flush
2960          return;
2961          }
2962
2963        _bytes_pool_array[_bytes_pool_index]=_bytes_pool;
2964
2965        _bytes_pool_max=_bytes_pool+_bytes_pool_elements_inc;
2966
2967        _bytes_pool_index++;
2968
2969        }
2970
2971      }
2972
2973  }
2974
2975 }
2976
2977
2978 // This functions renormalizes the probabilities at order-4 updating context
2979 // variables.
2980 void ppmc_renormalize_order4(void)
2981 {
2982  unsigned long counter;
2983  struct _byte_and_freq *node;
2984
2985
2986  // Initialize variables. Defined bytes remain the same.
2987  o4_context->max_cump=0;        //clear them
2988
2989  node=o4_context->prob;      //get pointer to lined lists
2990
2991  // Divide all the probabilities by 2 and update context variables
2992  while(1)
2993    {
2994    node->freq>>=1;                      //divide by a factor of 2
2995
2996    if(node->freq==0)    //don't allow a probability to be 0
2997      node->freq=1;
2998
2999    o4_context->max_cump+=node->freq; //sum to the total cump
3000
3001    if(node->next==0)    //last element
3002      break;
3003    node=node->next;
3004    }
3005
3006
3007 }
3008
3009
3010 // Decodes the symbol correspoding to the current order, it returns the byte
3011 // or in case of an escape code or empty table it returns -1.
3012 // It updates "coded_in_order".
3013 //
3014 // If we decode an escape code, we don't modify "o4_ll_node" and thus its
3015 // work of the updating routine to read till the end of the linked list
3016 // (for adding a new element) however if we decode a byte, we save on
3017 // "o4_ll_node" the pointer to its node. (so updating is faster)
3018 void ppmc_decode_order4(void)
3019 {
3020  unsigned long current_cump, counter;
3021  struct _byte_and_freq *node;
3022
3023
3024  // Get current context (if present) and total cump.
3025
3026  if(ppmc_get_totf_order4()==0)
3027    {
3028    byte=-1;
3029    return;
3030    }
3031
3032
3033  // It's possible that due to exclusion, there's no byte left, in that case
3034  // return.
3035  if(exc_defined_bytes==0)
3036    {
3037    byte=-1;
3038    return;
3039    }
3040
3041
3042  // Decode current cump
3043
3044  symb_cump=range_decoder_decode(&rc_decoder,exc_total_cump);        //decode it
3045
3046  // Now check if it's an escape code
3047  if(symb_cump>=exc_max_cump)     //the defined code space for the escape code
3048    {
3049
3050    // Update coding values
3051
3052    ppmc_get_escape_prob_order4();
3053    range_decoder_update(&rc_decoder,exc_total_cump,symb_cump,symb_prob);
3054
3055    // Mark as escape code
3056
3057    byte=-1;
3058
3059    // Then, update "excluded" table
3060
3061    node=o4_context->prob;
3062
3063    do{
3064      excluded[node->byte]=1;
3065      if(node->next==0)
3066        break;
3067      node=node->next;             //next element in the linked list
3068      }while(1);
3069
3070    return;   //an escape code
3071    }
3072  else
3073    {
3074    // Now we have to check what symbol it is
3075
3076    current_cump=0;      //cump of the current symbol
3077
3078    node=o4_context->prob;    //get pointer to linked lists
3079
3080    while(1)
3081      {
3082      if(excluded[node->byte]==0)
3083        current_cump+=node->freq; //update cump
3084      if(symb_cump<current_cump)
3085        break;                  //symbol found, break search loop
3086
3087      node=node->next;          //next element
3088      //we have no need to check for the last symbol, we'll never read further
3089      //the end of the linked lists, before we'll found the last byte.
3090      }
3091
3092
3093    //read byte value and probability
3094
3095    symb_prob=node->freq;     //get the probability for updating the state
3096    byte=node->byte;          //get byte
3097    o4_ll_node=node;          //used for updating
3098
3099
3100    // Get the cump of byte
3101
3102    symb_cump=current_cump-symb_prob;
3103
3104    // Update coding state
3105
3106    range_decoder_update(&rc_decoder,exc_total_cump,symb_cump,symb_prob);
3107
3108    // Update coded_in_order used for update exclusion
3109
3110    coded_in_order=4;
3111
3112    return;
3113    }
3114
3115 }
3116
3117
3118 // This is the routine for updating while decoding. The only difference with
3119 // the routine for coding is that when an escape code was coded, "o4_ll_node"
3120 // is not initialized so we have to read till the end of the linked list.
3121 // Fortunately "o4_context" will be initialized so we don't need to read its
3122 // linked list.
3123 void ppmc_update_dec_order4(void)
3124 {
3125  struct _byte_and_freq *node;
3126
3127  // First thing first, check if the hash entry is initialized
3128
3129  if(order4_hasht[o4_cntxt]==0)    //no pointer to linked list defined yet
3130    {
3131
3132    if(ppmc_out_of_memory==1)
3133      return;                //exit this function, we can't allocate memory
3134
3135
3136    // First create the context
3137
3138    order4_hasht[o4_cntxt]=_context_pool;
3139
3140    _context_pool->next=0;       //this is the last element
3141    _context_pool->order4321=full_o4_cntxt;      //put context
3142    _context_pool->prob=_bytes_pool;             //pointer to linked list
3143    _context_pool->max_cump=1;
3144    _context_pool->defined_bytes=1;
3145
3146
3147    // Do update of linked list variables and memory use of contexts
3148
3149    ++_context_pool;           //next time use next entry (this is a pointer)
3150
3151    if(_context_pool==_context_pool_max)    //maximum reached
3152      {
3153
3154      // First check to see that we still have entries in the array
3155
3156      if(_context_pool_index==_mempool_max_index)
3157        {
3158        ppmc_out_of_memory=1;    //flush
3159        return;
3160        }
3161
3162      // Allocate memory for new buffer
3163
3164      if((_context_pool=(struct context *)malloc
3165        (sizeof(struct context)*_context_pool_elements_inc))==NULL)
3166        {
3167        printf("Can't allocate memory for context's memory pool.");
3168        exit(1);
3169        }
3170
3171      _context_pool_array[_context_pool_index]=_context_pool;
3172
3173      _context_pool_max=_context_pool+_context_pool_elements_inc;
3174
3175      _context_pool_index++;
3176
3177      }
3178
3179    // Now care about the first (and last) linked list element
3180
3181    _bytes_pool->byte=byte;          //initialize byte to current one
3182    _bytes_pool->freq=1;             //it appeared once
3183    _bytes_pool->next=0;             //now this is last element in ll
3184
3185    // Do update of linked list variables and memory use
3186
3187    ++_bytes_pool;           //next time use next entry (this is a pointer)
3188
3189    if(_bytes_pool==_bytes_pool_max)    //maximum reached
3190      {
3191
3192      // First check to see that we still have entries in the array
3193
3194      if(_bytes_pool_index==_mempool_max_index)
3195        {
3196        ppmc_out_of_memory=1;    //flush
3197        return;
3198        }
3199
3200      // Allocate memory for new buffer
3201
3202      if((_bytes_pool=(struct _byte_and_freq *)malloc
3203        (sizeof(struct _byte_and_freq)*_bytes_pool_elements_inc))==NULL)
3204        {
3205        printf("\nCan't allocate memory for bytes memory pool.\nIndex: %d",_bytes_pool_index);
3206        ppmc_out_of_memory=1;    //flush
3207        return;
3208        }
3209
3210      _bytes_pool_array[_bytes_pool_index]=_bytes_pool;
3211
3212      _bytes_pool_max=_bytes_pool+_bytes_pool_elements_inc;
3213
3214      _bytes_pool_index++;
3215
3216      }
3217
3218    return;      //nothing else to do
3219    }
3220
3221
3222  // The byte was coded under order four, otherwise it was coded under a
3223  // lower order (never higher ones, remember that we are using update
3224  // exclusion) in this case we have to create a new node in the list.
3225
3226  if(coded_in_order==4)  //coded under order-4
3227    {
3228
3229    // Update its count and variables of this context and check for renormalization
3230
3231    o4_ll_node->freq++;  //increment its frequency (rather probability)
3232
3233    o4_context->max_cump++;   //total cump
3234
3235    if(o4_ll_node->freq==255)    //do we have to renormalize?
3236      ppmc_renormalize_order4(); //renormalize
3237
3238    }
3239  else
3240    {
3241
3242    // Now we have two cases, under a given context (which we actually found)
3243    // we coded an escape coded, in that case just create a new node in the
3244    // linked list of bytes and probabilities. Otherwise we didn't find the
3245    // same node so we have to create it in the linked list for context.
3246    // And we can be sure that it at least has one element and that
3247    // "o4_context" points to the last element, so we can put the new element.
3248
3249    if(o4_context->order4321==full_o4_cntxt) //chech if that's the last
3250      {                                      //element or the a context found
3251
3252      // Read till the end of the linked list
3253
3254      node=o4_context->prob;    //get pointer to linked list
3255
3256      while(1)
3257        {
3258        if(node->next==0)          //check for the end of the linked list
3259          break;
3260        node=node->next;           //next node
3261        }
3262
3263      // Now add element
3264
3265      if(ppmc_out_of_memory==1)
3266        return;                //exit this function, we can't allocate mem
3267
3268      node->next=_bytes_pool;          //put it in the next free entry
3269      _bytes_pool->byte=byte;          //initialize byte to current one
3270      _bytes_pool->freq=1;             //it appeared once
3271      _bytes_pool->next=0;             //now this is last element in ll
3272
3273      o4_context->max_cump++;   //total cump
3274      o4_context->defined_bytes++;   //total cump
3275
3276      // Do update of linked list variables and memory use
3277
3278      ++_bytes_pool;           //next time use next entry (this is a pointer)
3279
3280      if(_bytes_pool==_bytes_pool_max)    //maximum reached
3281        {
3282
3283        // First check to see that we still have entries in the array
3284
3285        if(_bytes_pool_index==_mempool_max_index)
3286          {
3287          ppmc_out_of_memory=1;    //flush
3288          return;
3289          }
3290
3291        // Allocate memory for new buffer
3292
3293        if((_bytes_pool=(struct _byte_and_freq *)malloc
3294          (sizeof(struct _byte_and_freq)*_bytes_pool_elements_inc))==NULL)
3295          {
3296          printf("\nCan't allocate memory for bytes memory pool.\nIndex: %d",_bytes_pool_index);
3297          ppmc_out_of_memory=1;    //flush
3298          return;
3299          }
3300
3301        _bytes_pool_array[_bytes_pool_index]=_bytes_pool;
3302
3303        _bytes_pool_max=_bytes_pool+_bytes_pool_elements_inc;
3304
3305        _bytes_pool_index++;
3306
3307        }
3308      }
3309    else
3310      {
3311
3312      // We have to create a new context node
3313
3314      if(ppmc_out_of_memory==1)
3315        return;                //exit this function, we can't allocate memory
3316
3317
3318      // First create the context
3319
3320      o4_context->next=_context_pool;
3321
3322      _context_pool->next=0;       //this is the last element
3323      _context_pool->order4321=full_o4_cntxt;      //put context
3324      _context_pool->prob=_bytes_pool;             //pointer to linked list
3325      _context_pool->max_cump=1;
3326      _context_pool->defined_bytes=1;
3327
3328
3329      // Do update of linked list variables and memory use of contexts
3330
3331      ++_context_pool;           //next time use next entry (this is a pointer)
3332
3333      if(_context_pool==_context_pool_max)    //maximum reached
3334        {
3335
3336        // First check to see that we still have entries in the array
3337
3338        if(_context_pool_index==_mempool_max_index)
3339          {
3340          ppmc_out_of_memory=1;    //flush
3341          return;
3342          }
3343
3344        // Allocate memory for new buffer
3345
3346        if((_context_pool=(struct context *)malloc
3347          (sizeof(struct context)*_context_pool_elements_inc))==NULL)
3348          {
3349          printf("Can't allocate memory for context's memory pool.");
3350          exit(1);
3351          }
3352
3353        _context_pool_array[_context_pool_index]=_context_pool;
3354
3355        _context_pool_max=_context_pool+_context_pool_elements_inc;
3356
3357        _context_pool_index++;
3358
3359        }
3360
3361      // Now care about the first (and last) linked list element
3362
3363      _bytes_pool->byte=byte;          //initialize byte to current one
3364      _bytes_pool->freq=1;             //it appeared once
3365      _bytes_pool->next=0;             //now this is last element in ll
3366
3367      // Do update of linked list variables and memory use
3368
3369      ++_bytes_pool;           //next time use next entry (this is a pointer)
3370
3371      if(_bytes_pool==_bytes_pool_max)    //maximum reached
3372        {
3373
3374        // First check to see that we still have entries in the array
3375
3376        if(_bytes_pool_index==_mempool_max_index)
3377          {
3378          ppmc_out_of_memory=1;    //flush
3379          return;
3380          }
3381
3382        // Allocate memory for new buffer
3383
3384        if((_bytes_pool=(struct _byte_and_freq *)malloc
3385          (sizeof(struct _byte_and_freq)*_bytes_pool_elements_inc))==NULL)
3386          {
3387          printf("\nCan't allocate memory for bytes memory pool.\nIndex: %d",_bytes_pool_index);
3388          ppmc_out_of_memory=1;    //flush
3389          return;
3390          }
3391
3392        _bytes_pool_array[_bytes_pool_index]=_bytes_pool;
3393
3394        _bytes_pool_max=_bytes_pool+_bytes_pool_elements_inc;
3395
3396        _bytes_pool_index++;
3397
3398        }
3399
3400      }
3401
3402  }
3403
3404 }
3405
3406
3407
3408 // This function returns the probability for the escape codes in the variables
3409 void ppmc_get_escape_prob_order4(void)
3410 {
3411  // To understand that remember that the escape allocated for the escape code
3412  // is above the current maximum cump and that it has a probability determined
3413  // by the scheme C.
3414
3415  symb_prob=exc_defined_bytes;
3416  symb_cump=exc_max_cump;
3417 }
3418