summaryrefslogtreecommitdiff
path: root/noncore/apps/opie-reader/ppm_expander.cpp
Unidiff
Diffstat (limited to 'noncore/apps/opie-reader/ppm_expander.cpp') (more/less context) (ignore whitespace changes)
-rw-r--r--noncore/apps/opie-reader/ppm_expander.cpp108
1 files changed, 108 insertions, 0 deletions
diff --git a/noncore/apps/opie-reader/ppm_expander.cpp b/noncore/apps/opie-reader/ppm_expander.cpp
new file mode 100644
index 0000000..4f0a277
--- a/dev/null
+++ b/noncore/apps/opie-reader/ppm_expander.cpp
@@ -0,0 +1,108 @@
1/*
2 * Interface pour le programme de compression
3 * (c) 1995 Fabrice Bellard
4 */
5
6#include <stdlib.h>
7//#include <unistd.h>
8#include <stdio.h>
9#include <string.h>
10#include <time.h>
11
12/***************************************************************************
13 * Interface avec les routines de compression
14 */
15
16#define METHOD_NB 2 /* nombre total de méthodes de compression */
17
18#define METHOD_STORE 0
19#define METHOD_PPM 1
20
21
22#define DEFAULT_SUFFIX ".st" /* extension par défault */
23/* signature en début de fichier */
24#define STAT_MAGIC_SIZE 4
25char stat_magic[STAT_MAGIC_SIZE]={'P','P','M','S'};
26
27#include "ppm_expander.h"
28
29ppm_expander::~ppm_expander() {
30 if (needppmend) ppm.PPM_End();
31 ppm.arith.Arith_DecodeEnd();
32 if (buf_in!=NULL) delete [] buf_in;
33 if (buf_out!=NULL) delete [] buf_out;
34 if (my_read_buf != NULL) delete my_read_buf;
35 if (my_file_in != NULL) fclose(my_file_in);
36}
37
38int ppm_expander::openfile(const char* infile)
39{
40 my_file_in=fopen(infile,"rb");
41 my_read_buf = new PPM_ReadBuf(my_file_in);
42 return home();
43}
44
45void ppm_expander::sizes(unsigned long& file, unsigned long& text)
46{
47 struct stat _stat;
48 fstat(fileno(my_file_in),&_stat);
49 file = _stat.st_size;
50 text = numblocks*blocksize;
51}
52
53int ppm_expander::home()
54{
55 fseek(my_file_in,0, SEEK_SET);
56 unsigned char header[STAT_MAGIC_SIZE];
57 size_t len=fread(header,1,STAT_MAGIC_SIZE,my_file_in);
58 if (strncmp((char*)header,stat_magic,STAT_MAGIC_SIZE)!=0) {
59 return 1;
60 }
61 if (len!=(STAT_MAGIC_SIZE)) {
62 return 1;
63 }
64 if (fread(&maxnode,sizeof(maxnode),1,my_file_in) != 1) return 1;
65 if (fread(&blocksize,sizeof(blocksize),1,my_file_in) != 1) return 1;
66 if (fread(&numblocks,sizeof(numblocks),1,my_file_in) != 1) return 1;
67 //fprintf(stderr,"<%u,%u,%u>\n",maxnode,blocksize,numblocks);
68 int err = locate(0,0);
69 outbytes = 0;
70 return err;
71}
72
73void ppm_expander::locate(unsigned int n) {
74 locate(n/blocksize, n%blocksize);
75 outbytes = n;
76}
77
78int ppm_expander::locate(unsigned short block, unsigned int n)
79{
80 if (needppmend)
81 {
82 ppm.PPM_End();
83 needppmend = false;
84 }
85 size_t fpos;
86 fseek(my_file_in,STAT_MAGIC_SIZE+sizeof(maxnode)+sizeof(blocksize)+sizeof(numblocks)+block*sizeof(fpos),SEEK_SET);
87 if (fread(&fpos,sizeof(fpos),1,my_file_in) != 1) return 1;
88 fseek(my_file_in,fpos,SEEK_SET);
89
90 ppm.arith.Arith_DecodeInit(my_read_buf,buf_in,bufsize);
91 int err=ppm.PPM_Init(maxnode);
92 needppmend = true;
93 curblock = block;
94 for (int i = 0; i < n; i++) getch();
95}
96
97int ppm_expander::getch() {
98 if (curblock >= numblocks) return EOF;
99 int c=ppm.PPM_Decode();
100 if (c == SYM_EOF)
101 {
102 if (++curblock >= numblocks) return EOF;
103 locate(curblock,0);
104 c = ppm.PPM_Decode();
105 }
106 outbytes++;
107 return (c==SYM_EOF) ? EOF : c;
108}