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