author | llornkcor <llornkcor> | 2002-07-01 23:24:08 (UTC) |
---|---|---|
committer | llornkcor <llornkcor> | 2002-07-01 23:24:08 (UTC) |
commit | 59222a752fa4c8a1e8c2a00ee2f9e22855f12bb2 (patch) (unidiff) | |
tree | f148d4858859dac3b413e675c760acfdab24b8e6 /noncore/apps/opie-reader/ppm_expander.cpp | |
parent | c08be8ae22dcc1bfb83cfdec807149b161d770f5 (diff) | |
download | opie-59222a752fa4c8a1e8c2a00ee2f9e22855f12bb2.zip opie-59222a752fa4c8a1e8c2a00ee2f9e22855f12bb2.tar.gz opie-59222a752fa4c8a1e8c2a00ee2f9e22855f12bb2.tar.bz2 |
initial
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.cpp | 108 |
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 | ||
25 | char stat_magic[STAT_MAGIC_SIZE]={'P','P','M','S'}; | ||
26 | |||
27 | #include "ppm_expander.h" | ||
28 | |||
29 | ppm_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 | |||
38 | int 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 | |||
45 | void 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 | |||
53 | int 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 | |||
73 | void ppm_expander::locate(unsigned int n) { | ||
74 | locate(n/blocksize, n%blocksize); | ||
75 | outbytes = n; | ||
76 | } | ||
77 | |||
78 | int 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 | |||
97 | int 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 | } | ||