Index: clx.c =================================================================== RCS file: /cvsroot/wv/clx.c,v retrieving revision 1.17 diff -u -r1.17 clx.c --- clx.c 2000/08/28 04:41:53 1.17 +++ clx.c 2000/09/04 20:35:21 @@ -103,7 +103,7 @@ wvGetPCD_PLCF(&clx->pcd,&clx->pos,&clx->nopcd,wvStream_tell(fd),lcb,fd); j+=lcb; - if (ver == WORD7) + if (ver <= WORD7) /* MV 28.8.2000 Appears to be valid */ { #if 0 /* DANGER !!, this is a completely mad attempt to differenciate @@ -115,18 +115,6 @@ /* I think that this is the correct reason for this behaviour */ if (fExtChar == 0) #endif - for (i=0;inopcd;i++) - { - clx->pcd[i].fc *= 2; - clx->pcd[i].fc |= 0x40000000UL; - } - } - if (ver == WORD6) - { - /* Copy the above ;-) MV 27.8.2000 - Note: worth trying for WORD2 etc. also (?) - */ - if (fExtChar == 0) for (i=0;inopcd;i++) { clx->pcd[i].fc *= 2; Index: decode_simple.c =================================================================== RCS file: /cvsroot/wv/decode_simple.c,v retrieving revision 1.48 diff -u -r1.48 decode_simple.c --- decode_simple.c 2000/06/06 00:55:16 1.48 +++ decode_simple.c 2000/09/04 20:35:24 @@ -2,6 +2,9 @@ #include #include "wv.h" +extern (*charhandler) (); +extern (*scharhandler) (); + /* how this works, we seek to the beginning of the text, we loop for a count of charaters that is stored in the fib. @@ -166,6 +169,23 @@ If !fib.fComplex, the document text stream is represented by the text beginning at fib.fcMin up to (but not including) fib.fcMac. */ + + if ( (ver == WORD2) && !ps->fib.fComplex) + { + wvHandleDocument(ps,DOCBEGIN); + wvStream_goto(ps->mainfd,ps->fib.fcMin); + for (i = ps->fib.fcMin; i < ps->fib.fcMac; i++) + { + eachchar = wvGetChar(ps->mainfd, 1); + (*charhandler)(ps, eachchar, 1, ps->fib.lid); + /* (*scharhandler)(ps,eachchar,&achp; no go */ + /* wvOutputTextChar(eachchar, 1, ps, &achp); no go */ + /* Formatting still lacking. This is just a start. */ + } + wvHandleDocument(ps,DOCEND); + return; + } + #ifdef DEBUG if ( ps->fib.fcMac != wvGetEndFCPiece(ps->clx.nopcd-1,&ps->clx) ) Index: fib.c =================================================================== RCS file: /cvsroot/wv/fib.c,v retrieving revision 1.25 diff -u -r1.25 fib.c --- fib.c 2000/06/06 00:55:16 1.25 +++ fib.c 2000/09/04 20:35:30 @@ -275,6 +275,14 @@ item->wIdent = read_16ubit(fd); item->nFib = read_16ubit(fd); + if ( (wvQuerySupported(item,NULL) == WORD2) ) + { + wvInitFIB(item); + wvStream_offset(fd,-4); + wvGetFIB2(item,fd); + return; + } + if ( (wvQuerySupported(item,NULL) == WORD5) || (wvQuerySupported(item,NULL) == WORD6) || (wvQuerySupported(item,NULL) == WORD7) ) { wvInitFIB(item); @@ -618,6 +626,145 @@ return(ret); } +void wvGetFIB2(FIB *item,wvStream *fd) + { + U16 temp16; + U8 temp8; + + item->wIdent = read_16ubit(fd); + item->nFib = read_16ubit(fd); + + item->nProduct = read_16ubit(fd); + item->lid = read_16ubit(fd); + wvTrace(("lid is %x\n",item->lid)); + item->pnNext = (S16)read_16ubit(fd); + temp16 = read_16ubit(fd); + + item->fDot = (temp16 & 0x0001); + item->fGlsy = (temp16 & 0x0002) >> 1; + item->fComplex = (temp16 & 0x0004) >> 2; + item->fHasPic = (temp16 & 0x0008) >> 3; + item->cQuickSaves = (temp16 & 0x00F0) >> 4; + item->fEncrypted = (temp16 & 0x0100) >> 8; + item->fWhichTblStm = 0; /* Unused from here on */ + item->fReadOnlyRecommended = 0; + item->fWriteReservation = 0; + item->fExtChar = 0; + item->fLoadOverride = 0; + item->fFarEast = 0; + item->fCrypto = 0; + + item->nFibBack = read_16ubit(fd); + wvTrace(("nFibBack is %d\n",item->nFibBack)); + + item->Spare = read_32ubit(fd); /* A spare for W2 */ + item->rgwSpare0[0] = read_16ubit(fd); + item->rgwSpare0[1] = read_16ubit(fd); + item->rgwSpare0[2] = read_16ubit(fd); + item->fcMin = read_32ubit(fd); /* These appear correct MV 29.8.2000 */ + item->fcMac = read_32ubit(fd); + wvTrace(("fc from %d to %d\n", item->fcMin, item->fcMac)); + + item->cbMac = read_32ubit(fd); /* Last byte file position plus one. */ + + item->fcSpare0 = read_32ubit(fd); + item->fcSpare1 = read_32ubit(fd); + item->fcSpare2 = read_32ubit(fd); + item->fcSpare3 = read_32ubit(fd); + + item->ccpText = read_32ubit(fd); + wvTrace(("length %d == %d\n", item->fcMac - item->fcMin, item->ccpText)); + + item->ccpFtn = (S32)read_32ubit(fd); + item->ccpHdr = (S32)read_32ubit(fd); + item->ccpMcr = (S32)read_32ubit(fd); + item->ccpAtn = (S32)read_32ubit(fd); + item->ccpSpare0 = (S32)read_32ubit(fd); + item->ccpSpare1 = (S32)read_32ubit(fd); + item->ccpSpare2 = (S32)read_32ubit(fd); + item->ccpSpare3 = (S32)read_32ubit(fd); + + item->fcStshfOrig = read_32ubit(fd); + item->lcbStshfOrig = (S32)read_16ubit(fd); + item->fcStshf = read_32ubit(fd); + item->lcbStshf = (S32)read_16ubit(fd); + item->fcPlcffndRef = read_32ubit(fd); + item->lcbPlcffndRef = (S32)read_16ubit(fd); + item->fcPlcffndTxt = read_32ubit(fd); + item->lcbPlcffndTxt = (S32)read_16ubit(fd); + item->fcPlcfandRef = read_32ubit(fd); + item->lcbPlcfandRef = (S32)read_16ubit(fd); + item->fcPlcfandTxt = read_32ubit(fd); + item->lcbPlcfandTxt = (S32)read_16ubit(fd); + item->fcPlcfsed = read_32ubit(fd); + item->lcbPlcfsed = (S32)read_16ubit(fd); + item->fcPlcfpgd = read_32ubit(fd); + item->cbPlcfpgd = read_16ubit(fd); + item->fcPlcfphe = read_32ubit(fd); + item->lcbPlcfphe = (S32)read_16ubit(fd); + item->fcPlcfglsy = read_32ubit(fd); + item->lcbPlcfglsy = (S32)read_16ubit(fd); + item->fcPlcfhdd = read_32ubit(fd); + item->lcbPlcfhdd = (S32)read_16ubit(fd); + item->fcPlcfbteChpx = read_32ubit(fd); + item->lcbPlcfbteChpx = (S32)read_16ubit(fd); + item->fcPlcfbtePapx = read_32ubit(fd); + item->lcbPlcfbtePapx = (S32)read_16ubit(fd); + item->fcPlcfsea = read_32ubit(fd); + item->lcbPlcfsea = (S32)read_16ubit(fd); + item->fcSttbfffn = read_32ubit(fd); + item->lcbSttbfffn = (S32)read_16ubit(fd); + item->fcPlcffldMom = read_32ubit(fd); + item->lcbPlcffldMom = (S32)read_16ubit(fd); + item->fcPlcffldHdr = read_32ubit(fd); + item->lcbPlcffldHdr = (S32)read_16ubit(fd); + item->fcPlcffldFtn = read_32ubit(fd); + item->lcbPlcffldFtn = (S32)read_16ubit(fd); + item->fcPlcffldAtn = read_32ubit(fd); + item->lcbPlcffldAtn = (S32)read_16ubit(fd); + item->fcPlcffldMcr = read_32ubit(fd); + item->lcbPlcffldMcr = (S32)read_16ubit(fd); + item->fcSttbfbkmk = read_32ubit(fd); + item->lcbSttbfbkmk = (S32)read_16ubit(fd); + item->fcPlcfbkf = read_32ubit(fd); + item->lcbPlcfbkf = (S32)read_16ubit(fd); + item->fcPlcfbkl = read_32ubit(fd); + item->lcbPlcfbkl = (S32)read_16ubit(fd); + item->fcCmds = read_32ubit(fd); + item->lcbCmds = (S32)read_16ubit(fd); + item->fcPlcmcr = read_32ubit(fd); + item->lcbPlcmcr = (S32)read_16ubit(fd); + item->fcSttbfmcr = read_32ubit(fd); + item->lcbSttbfmcr = (S32)read_16ubit(fd); + item->fcPrDrvr = read_32ubit(fd); + item->lcbPrDrvr = (S32)read_16ubit(fd); + item->fcPrEnvPort = read_32ubit(fd); + item->lcbPrEnvPort = (S32)read_16ubit(fd); + item->fcPrEnvLand = read_32ubit(fd); + item->lcbPrEnvLand = (S32)read_16ubit(fd); + item->fcWss = read_32ubit(fd); + item->lcbWss = (S32)read_16ubit(fd); + item->fcDop = read_32ubit(fd); + item->lcbDop = (S32)read_16ubit(fd); + item->fcSttbfAssoc = read_32ubit(fd); + item->lcbSttbfAssoc = (S32)read_16ubit(fd); + item->fcClx = read_32ubit(fd); + item->lcbClx = (S32)read_16ubit(fd); + item->fcPlcfpgdFtn = read_32ubit(fd); + item->lcbPlcfpgdFtn = (S32)read_16ubit(fd); + item->fcAutosaveSource = read_32ubit(fd); + item->lcbAutosaveSource = (S32)read_16ubit(fd); + item->fcSpare5 = read_32ubit(fd); + item->cbSpare5 = read_16ubit(fd); + item->fcSpare6 = read_32ubit(fd); + item->cbSpare6 = read_16ubit(fd); + item->wSpare4 = read_16ubit(fd); + item->pnChpFirst = read_16ubit(fd); + item->pnPapFirst = read_16ubit(fd); + item->cpnBteChp = read_16ubit(fd); + item->cpnBtePap = read_16ubit(fd); + + } void wvGetFIB6(FIB *item,wvStream *fd) { Index: wv.h =================================================================== RCS file: /cvsroot/wv/wv.h,v retrieving revision 1.66 diff -u -r1.66 wv.h --- wv.h 2000/08/02 23:27:12 1.66 +++ wv.h 2000/09/04 20:35:48 @@ -465,9 +465,33 @@ U32 lcbSttbListNames ; /* 0x0376 */ S32 fcSttbfUssr ; /* 0x037A */ U32 lcbSttbfUssr ; /* 0x037E */ + + /* Added for Word 2 */ + + U32 Spare ; /* 0x000E */ + U16 rgwSpare0 [3] ; /* 0x0012 */ + U32 fcSpare0 ; /* 0x0024 */ + U32 fcSpare1 ; /* 0x0028 */ + U32 fcSpare2 ; /* 0x002C */ + U32 fcSpare3 ; /* 0x0030 */ + U32 ccpSpare0 ; /* 0x0048 */ + U32 ccpSpare1 ; /* 0x004C */ + U32 ccpSpare2 ; /* 0x0050 */ + U32 ccpSpare3 ; /* 0x0054 */ + + U32 fcPlcfpgd ; /* 0x0082 */ + U16 cbPlcfpgd ; /* 0x0086 */ + + U32 fcSpare5 ; /* 0x0130 */ + U16 cbSpare5 ; /* 0x0136 */ + U32 fcSpare6 ; /* 0x0130 */ + U16 cbSpare6 ; /* 0x0136 */ + U16 wSpare4 ; /* 0x013C */ + } FIB; void wvGetFIB(FIB *item,wvStream *fd); +void wvGetFIB2(FIB *item,wvStream *fd); void wvGetFIB6(FIB *item,wvStream *fd); void wvInitFIB(FIB *item); Index: wvHtml.c =================================================================== RCS file: /cvsroot/wv/wvHtml.c,v retrieving revision 1.45 diff -u -r1.45 wvHtml.c --- wvHtml.c 2000/08/28 04:41:53 1.45 +++ wvHtml.c 2000/09/04 20:35:50 @@ -251,7 +251,7 @@ ps.filename = argv[optind]; ps.dir = dir; - if (ret & 0x8000) + if (ret & 0x8000) /* Password protected? */ { if ( (ret & 0x7fff) == WORD8) { @@ -509,7 +509,7 @@ be done manually for now (until libwmf supports .eps) but it's a start */ printf("\n\\resizebox{%dpt}{%dpt}\ - {\\includegraphics{%s}}\ + {\\includegraphics{%s.eps}}\ \n-- %#.2x graphic -- \n", width, height, source, graphicstype); else Index: wvparse.c =================================================================== RCS file: /cvsroot/wv/wvparse.c,v retrieving revision 1.26 diff -u -r1.26 wvparse.c --- wvparse.c 2000/06/06 00:55:16 1.26 +++ wvparse.c 2000/09/04 20:35:51 @@ -62,7 +62,8 @@ if ( (ret&0x7fff) != WORD8 ) ps->data = ps->mainfd; - if ( (ret != WORD8) && (ret != WORD7) && (ret!= WORD6) ) + if ( (ret != WORD8) && (ret != WORD7) && (ret!= WORD6) && (ret!= WORD2) ) + /* WORD2 test */ { /* return the errors and the encrypted files*/ if (!(ret & 0x8000)) @@ -119,7 +120,8 @@ { wvError(("Theres a good chance that this is a word 2 doc of nFib %d\n",read_16ubit(*mainfd))); wvStream_rewind(*mainfd); - return(-1); +// return(-1); + return(0); } else if (0x37fe == magic) { Index: oledecod/oledecod.c =================================================================== RCS file: /cvsroot/wv/oledecod/oledecod.c,v retrieving revision 1.8 diff -u -r1.8 oledecod.c --- oledecod/oledecod.c 2000/03/30 09:01:43 1.8 +++ oledecod/oledecod.c 2000/09/04 20:35:55 @@ -94,13 +94,14 @@ root_list = sbd_list = NULL; /* open input file */ - test (input != NULL, 4, ends ()); + test (input != NULL, 4, ends ()); /* cannot be opened */ /* fast check type of file */ verbose ("fast testing type of file"); test ((c = getc (input)) != EOF, 5, ends ()); test (ungetc (c, input) != EOF, 5, ends ()); - test ( (c < 32 || c > 126) , 8, ends ()); + test ( (c < 32 || c > 126) , 8, ends ()); /* We have a legible character, not good */ + test (c != 0xdb, 2, ends ()); /* probably non-ole Word 2 file */ test (c == 0xd0, 9, ends ()); /* read header block */