]> www.wagner.pp.ru Git - oss/catdoc.git/blob - src/pptparse.c
Add detection of ZIP-archive and report that this type of file (i.e. OOXML or OpenDoc...
[oss/catdoc.git] / src / pptparse.c
1 /**
2  * @file   pptparse.c
3  * @author Alex Ott <alexott@gmail.com>
4  * @date   23 äÅË 2004
5  * Version: $Id: pptparse.c,v 1.2 2006-10-17 19:11:29 vitus Exp $
6  * Copyright: Alex Ott
7  * 
8  * @brief  .ppt parsing routines
9  * 
10  * 
11  */
12
13 #ifdef HAVE_CONFIG_H
14 #include <config.h>
15 #endif
16 #include <stdlib.h>
17 #include <string.h>
18 #include <math.h>
19 #include <time.h>
20 #include "ppt.h"
21 #include "catdoc.h"
22 #include "ppttypes.h"
23
24 char *slide_separator = "\f"; 
25
26 static void process_item (int rectype, long reclen, FILE* input);
27
28 #if !defined(min)
29 #define min(x,y) ((x) < (y) ? (x) : (y))
30 #endif
31
32 static void start_text_out(void);
33
34 /** 
35  * 
36  * 
37  * @param input 
38  * @param filename 
39  */
40
41 enum {START_FILE,START_SLIDE,TEXTOUT,END_FILE} slide_state ;
42
43 static void start_text_out(void) {
44         if (slide_state == START_SLIDE) {
45                 fputs(slide_separator,stdout);
46         }
47         slide_state = TEXTOUT;
48 }       
49 void do_ppt(FILE *input,char *filename) {
50         int itemsread=1;
51         int rectype;
52         long reclen;
53         unsigned char recbuf[8];
54         slide_state = START_FILE;
55         while(itemsread) {
56                 itemsread = catdoc_read(recbuf, 1, 8, input);
57 /*              fprintf(stderr,"itemsread=%d: ",itemsread); */
58 /*              for(i=0; i<8; i++) */
59 /*                      fprintf(stderr,"%02x ",recbuf[i]); */
60 /*              fprintf(stderr,"\n"); */
61                 
62                 if (catdoc_eof(input)) {
63                         process_item(DOCUMENT_END,0,input);
64                         return;
65                 }
66                 if(itemsread < 8)
67                         break;
68                 rectype=getshort(recbuf,2);
69                 reclen=getulong(recbuf,4);
70                 if (reclen < 0) {
71                         return;
72                 }       
73                 process_item(rectype,reclen,input);
74         }
75 }
76
77
78 /** 
79  * 
80  * 
81  * @param rectype 
82  * @param reclen 
83  * @param input 
84  */
85 static void process_item (int rectype, long reclen, FILE* input) {
86         int i=0, u;
87         static unsigned char buf[2];
88 /*      fprintf(stderr,"Processing record %d length %d\n",rectype,reclen);
89  *      */
90         switch(rectype) {
91         case DOCUMENT_END:
92 /*              fprintf(stderr,"End of document, ended at %ld\n",catdoc_tell(input)); */
93                 catdoc_seek(input, reclen, SEEK_CUR);
94                 if (slide_state == TEXTOUT) {
95                         fputs(slide_separator,stdout);
96                         slide_state = END_FILE;
97                 }       
98                 break;
99
100         case DOCUMENT:
101 /*              fprintf(stderr,"Start of document, reclen=%ld, started at %ld\n", reclen, */
102 /*                                              catdoc_tell(input)); */
103                 break;
104
105         case DOCUMENT_ATOM:
106 /*              fprintf(stderr,"DocumentAtom, reclen=%ld\n", reclen); */
107                 catdoc_seek(input, reclen, SEEK_CUR);
108                 break;
109
110         case SLIDE:
111 /*              fprintf(stderr,"Slide, reclen=%ld\n", reclen); */
112                 break;
113
114         case SLIDE_ATOM:
115 /*              fprintf(stderr,"SlideAtom, reclen=%ld\n", reclen); */
116                 catdoc_seek(input, reclen, SEEK_CUR);
117                 break;
118                 
119         case SLIDE_BASE:
120 /*              fprintf(stderr,"SlideBase, reclen=%ld\n", reclen); */
121                 break;
122
123         case SLIDE_BASE_ATOM:
124 /*              fprintf(stderr,"SlideBaseAtom, reclen=%ld\n", reclen); */
125                 catdoc_seek(input, reclen, SEEK_CUR);
126                 break;
127                 
128         case NOTES:
129 /*              fprintf(stderr,"Notes, reclen=%ld\n", reclen); */
130                 break;
131
132         case NOTES_ATOM:
133 /*              fprintf(stderr,"NotesAtom, reclen=%ld\n", reclen); */
134                 catdoc_seek(input, reclen, SEEK_CUR);
135                 break;
136                 
137         case HEADERS_FOOTERS:
138 /*              fprintf(stderr,"HeadersFooters, reclen=%ld\n", reclen); */
139                 break;
140
141         case HEADERS_FOOTERS_ATOM:
142 /*              fprintf(stderr,"HeadersFootersAtom, reclen=%ld\n", reclen); */
143                 catdoc_seek(input, reclen, SEEK_CUR);
144                 break;
145                 
146         case MAIN_MASTER:
147 /*              fprintf(stderr,"MainMaster, reclen=%ld\n", reclen); */
148                 break;
149                 
150         case TEXT_BYTES_ATOM: {
151 /*                      fprintf(stderr,"TextBytes, reclen=%ld\n", reclen); */
152                         start_text_out();
153                         for(i=0; i < reclen; i++) {
154                                 catdoc_read(buf,1,1,input);
155                                 if((unsigned char)*buf!=0x0d)
156                                         fputs(convert_char((unsigned char)*buf),stdout);
157                                 else
158                                         fputc('\n',stdout);
159                         }
160                         fputc('\n',stdout);
161                 }
162                 break;
163                 
164         case TEXT_CHARS_ATOM: 
165         case CSTRING: {
166                         long text_len;
167                         
168 /*                      fprintf(stderr,"CString, reclen=%ld\n", reclen); */
169                         start_text_out();
170                         text_len=reclen/2;
171                         for(i=0; i < text_len; i++) {
172                                 catdoc_read(buf,2,1,input);
173                                 u=(unsigned short)getshort(buf,0);
174                                 if(u!=0x0d)
175                                         fputs(convert_char(u),stdout);
176                                 else
177                                         fputc('\n',stdout);
178                         }
179                         fputc('\n',stdout);
180                 }
181                 break;
182                 
183         case USER_EDIT_ATOM:
184 /*              fprintf(stderr,"UserEditAtom, reclen=%ld\n", reclen); */
185                 catdoc_seek(input, reclen, SEEK_CUR);
186                 break;
187
188         case COLOR_SCHEME_ATOM:
189 /*              fprintf(stderr,"ColorSchemeAtom, reclen=%ld\n", reclen); */
190                 catdoc_seek(input, reclen, SEEK_CUR);
191                 break;
192
193         case PPDRAWING:
194 /*              fprintf(stderr,"PPDrawing, reclen=%ld\n", reclen); */
195                 catdoc_seek(input, reclen, SEEK_CUR);
196                 break;
197
198         case ENVIRONMENT:
199 /*              fprintf(stderr,"Environment, reclen=%ld\n", reclen); */
200                 catdoc_seek(input, reclen, SEEK_CUR);
201                 break;
202
203         case SSDOC_INFO_ATOM:
204 /*              fprintf(stderr,"SSDocInfoAtom, reclen=%ld\n", reclen); */
205                 catdoc_seek(input, reclen, SEEK_CUR);
206                 break;
207
208         case SSSLIDE_INFO_ATOM:
209 /*              fprintf(stderr,"SSSlideInfoAtom, reclen=%ld\n", reclen); */
210                 catdoc_seek(input, reclen, SEEK_CUR);
211                 break;
212
213         case PROG_TAGS:
214 /*              fprintf(stderr,"ProgTags, reclen=%ld\n", reclen); */
215                 catdoc_seek(input, reclen, SEEK_CUR);
216                 break;
217
218         case PROG_STRING_TAG:
219 /*              fprintf(stderr,"ProgStringTag, reclen=%ld\n", reclen); */
220                 catdoc_seek(input, reclen, SEEK_CUR);
221                 break;
222
223         case PROG_BINARY_TAG:
224 /*              fprintf(stderr,"ProgBinaryTag, reclen=%ld\n", reclen); */
225                 catdoc_seek(input, reclen, SEEK_CUR);
226                 break;
227
228         case LIST:
229 /*              fprintf(stderr,"List, reclen=%ld\n", reclen); */
230                 break;
231
232         case SLIDE_LIST_WITH_TEXT:
233 /*              fprintf(stderr,"SlideListWithText, reclen=%ld\n", reclen); */
234 /*              fputs("---------------------------------------\n",stderr); */
235                 break;
236
237         case PERSIST_PTR_INCREMENTAL_BLOCK:
238 /*              fprintf(stderr,"PersistPtrIncrementalBlock, reclen=%ld\n", reclen); */
239                 catdoc_seek(input, reclen, SEEK_CUR);
240                 break;
241
242         case EX_OLE_OBJ_STG:
243 /*              fprintf(stderr,"ExOleObjStg, reclen=%ld\n", reclen); */
244                 catdoc_seek(input, reclen, SEEK_CUR);
245                 break;
246
247         case PPDRAWING_GROUP:
248 /*              fprintf(stderr,"PpdrawingGroup, reclen=%ld\n", reclen); */
249                 catdoc_seek(input, reclen, SEEK_CUR);
250                 break;
251
252         case EX_OBJ_LIST:
253 /*              fprintf(stderr,"ExObjList, reclen=%ld\n", reclen); */
254                 catdoc_seek(input, reclen, SEEK_CUR);
255                 break;
256
257         case TX_MASTER_STYLE_ATOM:
258 /*              fprintf(stderr,"TxMasterStyleAtom, reclen=%ld\n", reclen); */
259                 catdoc_seek(input, reclen, SEEK_CUR);
260                 break;
261
262         case HANDOUT:
263 /*              fprintf(stderr,"Handout, reclen=%ld\n", reclen); */
264                 catdoc_seek(input, reclen, SEEK_CUR);
265                 break;
266
267         case SLIDE_PERSIST_ATOM:
268                 if (slide_state != START_FILE) {
269                         slide_state = START_SLIDE;
270                 }       
271                 catdoc_seek(input, reclen, SEEK_CUR);
272                 break;
273
274         case TEXT_HEADER_ATOM:
275 /*              fprintf(stderr,"TextHeaderAtom, reclen=%ld\n", reclen); */
276                 catdoc_seek(input, reclen, SEEK_CUR);
277                 break;
278
279         case TEXT_SPEC_INFO:
280 /*              fprintf(stderr,"TextSpecInfo, reclen=%ld\n", reclen); */
281                 catdoc_seek(input, reclen, SEEK_CUR);
282                 break;
283
284         case STYLE_TEXT_PROP_ATOM:
285 /*              fprintf(stderr,"StyleTextPropAtom, reclen=%ld\n", reclen); */
286                 catdoc_seek(input, reclen, SEEK_CUR);
287                 break;
288
289                 /*      case :
290                 fprintf(stderr,", reclen=%ld\n", reclen);
291                 catdoc_seek(input, reclen, SEEK_CUR);
292                 break;*/
293
294                 /*      case :
295                 fprintf(stderr,", reclen=%ld\n", reclen);
296                 catdoc_seek(input, reclen, SEEK_CUR);
297                 break;*/
298
299         default:
300 /*              fprintf(stderr,"Default action for rectype=%d reclen=%ld\n", */
301 /*                                              rectype, reclen); */
302                 catdoc_seek(input, reclen, SEEK_CUR);
303
304         }
305         
306 }