3 * @author Alex Ott <alexott@gmail.com>
5 * Version: $Id: pptparse.c,v 1.2 2006-10-17 19:11:29 vitus Exp $
8 * @brief .ppt parsing routines
24 char *slide_separator = "\f";
26 static void process_item (int rectype, long reclen, FILE* input);
29 #define min(x,y) ((x) < (y) ? (x) : (y))
32 static void start_text_out(void);
41 enum {START_FILE,START_SLIDE,TEXTOUT,END_FILE} slide_state ;
43 static void start_text_out(void) {
44 if (slide_state == START_SLIDE) {
45 fputs(slide_separator,stdout);
47 slide_state = TEXTOUT;
49 void do_ppt(FILE *input,char *filename) {
53 unsigned char recbuf[8];
54 slide_state = START_FILE;
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"); */
62 if (catdoc_eof(input)) {
63 process_item(DOCUMENT_END,0,input);
68 rectype=getshort(recbuf,2);
69 reclen=getulong(recbuf,4);
73 process_item(rectype,reclen,input);
85 static void process_item (int rectype, long reclen, FILE* input) {
87 static unsigned char buf[2];
88 /* fprintf(stderr,"Processing record %d length %d\n",rectype,reclen);
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;
101 /* fprintf(stderr,"Start of document, reclen=%ld, started at %ld\n", reclen, */
102 /* catdoc_tell(input)); */
106 /* fprintf(stderr,"DocumentAtom, reclen=%ld\n", reclen); */
107 catdoc_seek(input, reclen, SEEK_CUR);
111 /* fprintf(stderr,"Slide, reclen=%ld\n", reclen); */
115 /* fprintf(stderr,"SlideAtom, reclen=%ld\n", reclen); */
116 catdoc_seek(input, reclen, SEEK_CUR);
120 /* fprintf(stderr,"SlideBase, reclen=%ld\n", reclen); */
123 case SLIDE_BASE_ATOM:
124 /* fprintf(stderr,"SlideBaseAtom, reclen=%ld\n", reclen); */
125 catdoc_seek(input, reclen, SEEK_CUR);
129 /* fprintf(stderr,"Notes, reclen=%ld\n", reclen); */
133 /* fprintf(stderr,"NotesAtom, reclen=%ld\n", reclen); */
134 catdoc_seek(input, reclen, SEEK_CUR);
137 case HEADERS_FOOTERS:
138 /* fprintf(stderr,"HeadersFooters, reclen=%ld\n", reclen); */
141 case HEADERS_FOOTERS_ATOM:
142 /* fprintf(stderr,"HeadersFootersAtom, reclen=%ld\n", reclen); */
143 catdoc_seek(input, reclen, SEEK_CUR);
147 /* fprintf(stderr,"MainMaster, reclen=%ld\n", reclen); */
150 case TEXT_BYTES_ATOM: {
151 /* fprintf(stderr,"TextBytes, reclen=%ld\n", reclen); */
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);
164 case TEXT_CHARS_ATOM:
168 /* fprintf(stderr,"CString, reclen=%ld\n", reclen); */
171 for(i=0; i < text_len; i++) {
172 catdoc_read(buf,2,1,input);
173 u=(unsigned short)getshort(buf,0);
175 fputs(convert_char(u),stdout);
184 /* fprintf(stderr,"UserEditAtom, reclen=%ld\n", reclen); */
185 catdoc_seek(input, reclen, SEEK_CUR);
188 case COLOR_SCHEME_ATOM:
189 /* fprintf(stderr,"ColorSchemeAtom, reclen=%ld\n", reclen); */
190 catdoc_seek(input, reclen, SEEK_CUR);
194 /* fprintf(stderr,"PPDrawing, reclen=%ld\n", reclen); */
195 catdoc_seek(input, reclen, SEEK_CUR);
199 /* fprintf(stderr,"Environment, reclen=%ld\n", reclen); */
200 catdoc_seek(input, reclen, SEEK_CUR);
203 case SSDOC_INFO_ATOM:
204 /* fprintf(stderr,"SSDocInfoAtom, reclen=%ld\n", reclen); */
205 catdoc_seek(input, reclen, SEEK_CUR);
208 case SSSLIDE_INFO_ATOM:
209 /* fprintf(stderr,"SSSlideInfoAtom, reclen=%ld\n", reclen); */
210 catdoc_seek(input, reclen, SEEK_CUR);
214 /* fprintf(stderr,"ProgTags, reclen=%ld\n", reclen); */
215 catdoc_seek(input, reclen, SEEK_CUR);
218 case PROG_STRING_TAG:
219 /* fprintf(stderr,"ProgStringTag, reclen=%ld\n", reclen); */
220 catdoc_seek(input, reclen, SEEK_CUR);
223 case PROG_BINARY_TAG:
224 /* fprintf(stderr,"ProgBinaryTag, reclen=%ld\n", reclen); */
225 catdoc_seek(input, reclen, SEEK_CUR);
229 /* fprintf(stderr,"List, reclen=%ld\n", reclen); */
232 case SLIDE_LIST_WITH_TEXT:
233 /* fprintf(stderr,"SlideListWithText, reclen=%ld\n", reclen); */
234 /* fputs("---------------------------------------\n",stderr); */
237 case PERSIST_PTR_INCREMENTAL_BLOCK:
238 /* fprintf(stderr,"PersistPtrIncrementalBlock, reclen=%ld\n", reclen); */
239 catdoc_seek(input, reclen, SEEK_CUR);
243 /* fprintf(stderr,"ExOleObjStg, reclen=%ld\n", reclen); */
244 catdoc_seek(input, reclen, SEEK_CUR);
247 case PPDRAWING_GROUP:
248 /* fprintf(stderr,"PpdrawingGroup, reclen=%ld\n", reclen); */
249 catdoc_seek(input, reclen, SEEK_CUR);
253 /* fprintf(stderr,"ExObjList, reclen=%ld\n", reclen); */
254 catdoc_seek(input, reclen, SEEK_CUR);
257 case TX_MASTER_STYLE_ATOM:
258 /* fprintf(stderr,"TxMasterStyleAtom, reclen=%ld\n", reclen); */
259 catdoc_seek(input, reclen, SEEK_CUR);
263 /* fprintf(stderr,"Handout, reclen=%ld\n", reclen); */
264 catdoc_seek(input, reclen, SEEK_CUR);
267 case SLIDE_PERSIST_ATOM:
268 if (slide_state != START_FILE) {
269 slide_state = START_SLIDE;
271 catdoc_seek(input, reclen, SEEK_CUR);
274 case TEXT_HEADER_ATOM:
275 /* fprintf(stderr,"TextHeaderAtom, reclen=%ld\n", reclen); */
276 catdoc_seek(input, reclen, SEEK_CUR);
280 /* fprintf(stderr,"TextSpecInfo, reclen=%ld\n", reclen); */
281 catdoc_seek(input, reclen, SEEK_CUR);
284 case STYLE_TEXT_PROP_ATOM:
285 /* fprintf(stderr,"StyleTextPropAtom, reclen=%ld\n", reclen); */
286 catdoc_seek(input, reclen, SEEK_CUR);
290 fprintf(stderr,", reclen=%ld\n", reclen);
291 catdoc_seek(input, reclen, SEEK_CUR);
295 fprintf(stderr,", reclen=%ld\n", reclen);
296 catdoc_seek(input, reclen, SEEK_CUR);
300 /* fprintf(stderr,"Default action for rectype=%d reclen=%ld\n", */
301 /* rectype, reclen); */
302 catdoc_seek(input, reclen, SEEK_CUR);